vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
BGBUDDY_TITLE = "BGBuddy";
BGBUDDY_VERSION = "v2.2";

local lastkill = 0;
local sessionhonor = 0;
local sessionkillhonor = 0;
local bonusHonor = -1;

local current_line = 1;
local debug_enable = 0;

local last_GameTime = 0;
local this_GameTime = 0;
local timer_nextRes = nil;
local resTimeSet = false;

local lines = { };
local kill_log = { };

local soundplayed = { };
local honorshown = false;

function BGBuddy_OnLoad()
        this:RegisterForDrag("LeftButton");
        this:RegisterEvent("VARIABLES_LOADED");
        this:RegisterEvent("PLAYER_ENTERING_WORLD");
        this:RegisterEvent("UPDATE_WORLD_STATES");
        this:RegisterEvent("BATTLEFIELDS_SHOW");
        this:RegisterEvent("BATTLEFIELDS_CLOSED");
        this:RegisterEvent("UPDATE_BATTLEFIELD_SCORE");
        this:RegisterEvent("UPDATE_BATTLEFIELD_STATUS");
        this:RegisterEvent("PLAYER_PVP_KILLS_CHANGED");
        this:RegisterEvent("PLAYER_ENTERING_WORLD");
        this:RegisterEvent("CHAT_MSG_COMBAT_HONOR_GAIN");
        this:RegisterEvent("CHAT_MSG_COMBAT_HONOR_GAIN");
        this:RegisterEvent("PLAYER_DEAD");
end

function BGBuddy_OnEvent()
        if ( event == "VARIABLES_LOADED" ) then
                BGBuddy_Init();
                return;
        end

        if ( BGBuddy_SavedVars["config"]["isEnabled"] == 0 ) then 
                return;
        end

        if ( event == "PLAYER_ENTERING_WORLD" ) then
                RequestBattlefieldScoreData();
                BGBuddy_Initialize();
        end

        if ( event == "UPDATE_BATTLEFIELD_SCORE" ) then
                RequestBattlefieldScoreData();
        end
        
        if ( event == "UPDATE_BATTLEFIELD_STATUS" ) then
                RequestBattlefieldScoreData();
        end

        if ( event == "PLAYER_DEAD" ) then
                BGBuddy_AutoRelease();
        end

        if ( event == "PLAYER_PVP_KILLS_CHANGED" ) then
                RequestBattlefieldScoreData();
        end

        if ( event == "CHAT_MSG_COMBAT_HONOR_GAIN" ) then
                _, _, _, _, lastchathonor = string.find(arg1, "^(.+) ([^:]+:[^:]+): (%d+)");
                _, _, _, _, lastchatkill = string.find(arg1, "a" );

                -- update honor with the new estimate
                if ( lastchathonor == nil ) then
                        return;
                else
                        sessionhonor = sessionhonor + lastchathonor;
                        sessionkillhonor = sessionkillhonor + lastchathonor;
                        lastkill = lastchathonor;
                end
        end

        if ( event == "PLAYER_ENTERING_WORLD" ) then
                if ( bonusHonor ~= nil and bonusHonor >= 0 ) then
                        BGBuddy_ChatReport( BGBUDDY_MSG_ENDOFBATTLE_REPORT );
                        BGBuddy_ChatReport( BGBUDDY_MSG_ENDOFBATTLE_KILLHONOR..sessionhonor..
                                             " "..BGBUDDY_MSG_ENDOFBATTLE_BONUSHONOR..bonusHonor );
                        sessionhonor = sessionhonor + bonusHonor;
                        BGBuddy_ChatReport( BGBUDDY_MSG_ENDOFBATTLE_TOTALHONOR..sessionhonor );
                end
                bonusHonor = -1;
        end
end

function BGBuddy_HandleSlashes(arg1)
        arg1 = string.lower(arg1);
        if( arg1 == "debug" or arg1 == "db" ) then
                BGBuddy_ToggleDebug();
        else
                ShowUIPanel(BGBuddy_ConfigPanel_CustomizeDisplay);
        end
end

function BGBuddy_Init()
        if(myAddOnsFrame) then
                myAddOnsList.BGBuddy = {
                        name = 'BGBuddy',
                        description = BGBUDDY_ABOUT_DESCRIPTION,
                        version = BGBUDDY_VERSION,
                        category = MYADDONS_CATEGORY_OTHERS,
                        frame = 'BGBuddy_StandardFrame',
                        optionsframe = 'BGBuddy_ConfigPanel'
                };
        end

        PanelTemplates_SetNumTabs(BGBuddy_ConfigPanel_CustomizeDisplay, 3);
        BGBuddy_ConfigPanel_CustomizeDisplay.selectedTab = 1;
        PanelTemplates_UpdateTabs(BGBuddy_ConfigPanel_CustomizeDisplay);
        
        BGBuddy_ConfigPanel_AboutTitle:SetText(BGBUDDY_TITLE.." "..BGBUDDY_VERSION);

        SLASH_BGBuddy1 = "/bgbuddy";
        SLASH_BGBuddy2 = "/bgb";
        SlashCmdList["BGBuddy"] = BGBuddy_HandleSlashes;

        if (BGBuddy_SavedVars == nil) then
                BGBuddy_SavedVars = {
                        config = { },
                        alterac_valley = { 
                                customizeText = nil,
                        },
                        warsong_gulch = { 
                                customizeText = nil,
                        },
                        arathi_basin = { 
                                customizeText = nil,
                        },
                        not_queued = {
                                customizeText = nil,
                        },
                        queued = {
                                customizeText = nil,
                                showQueuedSeconds = nil,
                        },
                };
        end

        -- Now handle upgrades, data format has changed.
        if (BGBuddy_SavedVars["config"] == nil) then
                BGBuddy_SavedVars["config"] = { };
        end
        if (BGBuddy_SavedVars["alterac_valley"] == nil) then
                BGBuddy_SavedVars["alterac_valley"] = { 
                        customizeText = nil,
                };
        end
        if (BGBuddy_SavedVars["warsong_gulch"] == nil) then
                BGBuddy_SavedVars["warsong_gulch"] = { 
                        customizeText = nil,
                };
        end
        if (BGBuddy_SavedVars["arathi_basin"] == nil) then
                BGBuddy_SavedVars["arathi_basin"] = { 
                        customizeText = nil,
                };
        end
        if (BGBuddy_SavedVars["not_queued"] == nil) then
                BGBuddy_SavedVars["not_queued"] = { 
                        customizeText = nil,
                };
        end
        if (BGBuddy_SavedVars["queued"] == nil) then
                BGBuddy_SavedVars["queued"] = { 
                        customizeText = nil,
                        showQueuedSeconds = nil,
                };
        end

        BGBuddy_SavedVars["version"] = BGBUDDY_VERSION;

        if ( BGBuddy_SavedVars["daily_honor"] == nil
                or BGBuddy_SavedVars["daily_honor_expire"] == nil) then
                BGBuddy_SavedVars["daily_honor"] = 0;
                BGBuddy_SavedVars["daily_honor_expire"] = "???";
        end
    --if ( BGBuddy_SavedVars["daily_honor_expire"] 

        --
        -- General Config
        --
        if (BGBuddy_SavedVars["config"]["isEnabled"] == nil) then
                BGBuddy_SavedVars["config"]["isEnabled"] = 1;
        end
        if (BGBuddy_SavedVars["config"]["isLocked"] == nil) then
                BGBuddy_SavedVars["config"]["isLocked"] = 0;
        end
        if (BGBuddy_SavedVars["config"]["isAlwaysVisible"] == nil) then
                BGBuddy_SavedVars["config"]["isAlwaysVisible"] = 1;
        end
        if (BGBuddy_SavedVars["config"]["playSound"] == nil) then
                BGBuddy_SavedVars["config"]["playSound"] = 1;
        end
        if (BGBuddy_SavedVars["config"]["backgroundAlpha"] == nil) then
                BGBuddy_SavedVars["config"]["backgroundAlpha"] = 50;
        end
        if (BGBuddy_SavedVars["config"]["borderAlpha"] == nil) then
                BGBuddy_SavedVars["config"]["borderAlpha"] = 50;
        end
        if (BGBuddy_SavedVars["config"]["hideBGIcon"] == nil) then
                BGBuddy_SavedVars["config"]["hideBGIcon"] = 1;
        end
        if (BGBuddy_SavedVars["config"]["AutoJoin"] == nil) then
                BGBuddy_SavedVars["config"]["AutoJoin"] = 1;
        end
        if ( BGBuddy_SavedVars["config"]["delayedAutoJoin"] == nil ) then
                BGBuddy_SavedVars["config"]["delayedAutoJoin"] = 1;
        end
        if (BGBuddy_SavedVars["config"]["AutoRes"] == nil) then
                BGBuddy_SavedVars["config"]["AutoRes"] = 1;
        end
        if (BGBuddy_SavedVars["config"]["AutoRelease"] == nil) then
                BGBuddy_SavedVars["config"]["AutoRelease"] = 1;
        end
        if (BGBuddy_SavedVars["config"]["displayRank"] == nil) then
                BGBuddy_SavedVars["config"]["displayRank"] = 1;
        end
        if (BGBuddy_SavedVars["config"]["hideDisplay"] == nil) then
                BGBuddy_SavedVars["config"]["hideDisplay"] = 0;
        end
        if ( BGBuddy_SavedVars["config"]["alwaysShowHonor"] == nil ) then
                BGBuddy_SavedVars["config"]["alwaysShowHonor"] = 1;
        end
        if ( BGBuddy_SavedVars["config"]["autoLeaveBG"] == nil ) then
                BGBuddy_SavedVars["config"]["autoLeaveBG"] = 0;
        end
        if ( BGBuddy_SavedVars["config"]["uiScale"] == nil ) then
                BGBuddy_SavedVars["config"]["uiScale"] = 0;
        end

        --
        -- Alterac Valley Defaults
        --
        if( BGBuddy_SavedVars["alterac_valley"]["customizeText"] == nil ) then
                BGBuddy_SavedVars["alterac_valley"]["customizeText"] = "#: ~S K: ~K KB: ~KB D: ~D\n"..
                "GYA: ~GYA GYD: ~GYD TA: ~TA TD: ~TD\nHonor: ~SH Last Kill: ~LKH\n"..
                "MC: ~MC LDK: ~LDK SO: ~SO\nNext Res: ~RES\nCurrently In: ~BG\nNext Res: ~RES";
        end

        --
        -- Warsong Gulch Defaults
        --
        if( BGBuddy_SavedVars["warsong_gulch"]["customizeText"] == nil ) then
                BGBuddy_SavedVars["warsong_gulch"]["customizeText"] = "#: ~S K: ~K KB: ~KB D: ~D\n"..
                "Honor Totals\nKills: ~KH Bonus: ~BH\nTotal: ~SH  Last Kill: ~LKH\nNext Res: ~RES\n"..
                "Currently In: ~BG";
        end

        --
        -- Arathi Basin Defaults
        --
        if( BGBuddy_SavedVars["arathi_basin"]["customizeText"] == nil ) then
                BGBuddy_SavedVars["arathi_basin"]["customizeText"] = "#: ~S K: ~K KB: ~KB D: ~D\n"..
                "Honor Totals\nKills: ~KH Bonus: ~BH\nTotal: ~SH  Last Kill: ~LKH\nNext Res: ~RES\n"..
                "Currently In: ~BG";
                
        end
        --
        -- Not Queued Defaults
        --
        if( BGBuddy_SavedVars["not_queued"]["customizeText"] == nil ) then
                BGBuddy_SavedVars["not_queued"]["customizeText"] = "~NQ";
        end
        --
        -- Queued Defaults
        --
        if( BGBuddy_SavedVars["queued"]["customizeText"] == nil ) then
                BGBuddy_SavedVars["queued"]["customizeText"] = "~Q";
        end
        
        -- Set the default ui up
        BGBuddy_Config_ChangeCustomDisplay("AV");
        BGBuddy_Config_SetButtonState(BGBuddy_ConfigPanel_Button_AV);
end


function BGBuddy_OnUpdate()
    -- Update time
    this_GameTime = GetTime();
    
        if ( BGBuddy_SavedVars["config"]["isEnabled"] == 1 ) then 
                BGBuddy_UpdateDisplay();
                BGBuddy_AutoRelease();
                
                -- Auto leave
                if( GetBattlefieldWinner() ~= nil ) then
                        if ( BGBuddy_SavedVars["config"]["autoLeaveBG"] == 1 ) then
                                LeaveBattlefield();
                        end
                end
        
                if ( BGBuddy_SavedVars["config"]["displayRank"] == 1 ) then
                        BGBuddy_RankFrame:Show();
                else
                        BGBuddy_RankFrame:Hide();
                end
        else
                BGBuddy_StandardFrame:Hide();
        end
end

function BGBuddy_DropDown_OnLoad()
        UIDropDownMenu_Initialize(this, BGBuddy_DropDown_Initialize, "MENU");
end

function BGBuddy_DropDown_Initialize()
--[[    for i=1, MAX_BATTLEFIELD_QUEUES do
                local status, mapName, instanceID = GetBattlefieldStatus(i)
        end
        
        local status, _, _ = GetBattlefieldStatus();
        local info;
        if ( status == "queued" ) then
                info = {};
                info.text = BGBUDDY_DROPDOWN_CHANGEINSTANCE;
                info.func = ShowBattlefieldList;
                info.notCheckable = 1;
                UIDropDownMenu_AddButton(info);
                info = {};
                info.text = BGBUDDY_DROPDOWN_LEAVEQUEUE;
                info.func = AcceptBattlefieldPort;
                info.notCheckable = 1;
                UIDropDownMenu_AddButton(info);
        elseif ( status == "confirm" ) then
                info = {};
                info.text = BGBUDDY_DROPDOWN_ACCEPTPORT;
                info.func = BattlefieldFrame_EnterBattlefield;
                info.notCheckable = 1;
                UIDropDownMenu_AddButton(info);
                info = {};
                info.text = BGBUDDY_DROPDOWN_LEAVEQUEUE;
                info.func = AcceptBattlefieldPort;
                info.notCheckable = 1;
                UIDropDownMenu_AddButton(info);
        end]]
end


function BGBuddy_OnEnter()
        GameTooltip_SetDefaultAnchor(GameTooltip, this);
        GameTooltip:SetText(BGBUDDY_TITLE.." "..BGBUDDY_VERSION, 255/255, 209/255, 0/255);
        GameTooltip:AddLine(BGBUDDY_TOOLTIP_DEFAULT, 1.00, 1.00, 1.00); 
        GameTooltip:Show();

end


function BGBuddy_OnEnterScoreFrame()
        if ( BGBuddy_StandardFrame.status == "queued" or BGBuddy_StandardFrame.status == "confirm" ) then
                GameTooltip_SetDefaultAnchor(GameTooltip, this);
                GameTooltip:SetText(BGBUDDY_TOOLTIP_BUTTON, 1, 1, 1);
                GameTooltip:Show();
        elseif ( BGBuddy_StandardFrame.status == "active" ) then
                GameTooltip_SetDefaultAnchor(GameTooltip, this);
                GameTooltip:SetText(BGBUDDY_TOOLTIP_BUTTON_ACTIVE_LN1..BGBuddy_StandardFrame.mapName.." "..
                                        BGBuddy_StandardFrame.instanceID, 255/255, 209/255, 0/255);
                GameTooltip:AddLine(BGBUDDY_TOOLTIP_BUTTON_ACTIVE_LN2, 1.00, 1.00, 1.00);       
                GameTooltip:Show();
        end
end


function BGBuddy_Initialize()
        BGBuddy_SetRankInfo(GetPVPRankInfo(UnitPVPRank("player")));
        BGBuddy_UpdateDisplay();
        BGBuddy_Config_SetAlpha();

        if ( BGBuddy_SavedVars["config"]["hideDisplay"] == 1 ) then
                BGBuddy_StandardFrame:Hide();
        else
                BGBuddy_StandardFrame:Show();
        end
end


function BGBuddy_SetRankInfo(rankName, rankNumber)
        if ( rankNumber < 1 ) then
                BGBuddy_RankName:SetText(BGBUDDY_PLAYER_RANK_UNRANKED);
                BGBuddy_RankFrameIcon:Hide();
        else
                BGBuddy_RankName:SetText(rankName);
                BGBuddy_RankFrameIcon:SetTexture(format("%s%02d","Interface\\PvPRankBadges\\PvPRank", rankNumber));
        end
end

-- GetBattlefieldInfo(0); ???
-- ShowBattlefieldList(0);  ???
-- GetNumBattlefields(); Number fo instances on the menu in range

function BGBuddy_UpdateDisplay()
        -- Reset the display
        BGBuddy_ClearLines();
        
        -- Get all battlefield statuses
        local bgStatus = { };
        local hasBGStatus = nil;
        honorshown = false;
        
        for i=1, MAX_BATTLEFIELD_QUEUES do
                local status, mapName, instanceID = GetBattlefieldStatus(i);
                bgStatus[i] = { };
                bgStatus[i]["status"] = status;
                bgStatus[i]["map"] = mapName;
                bgStatus[i]["id"] = instanceID;
                
                -- Show honor on top if we've opted to always display it
                if ( BGBuddy_SavedVars["config"]["alwaysShowHonor"] == 1 
                        and honorshown == false
                        and  status ~= "active" ) then
                        BGBuddy_AddLine(NORMAL_FONT_COLOR_CODE..BGBUDDY_ALWAYS_SHOW_HONOR_STRING..
                                HIGHLIGHT_FONT_COLOR_CODE..sessionhonor..FONT_COLOR_CODE_CLOSE);
                        honorshown = true;
                end
                
                if( status == "queued" ) then
                        hasBGStatus = true;
                        BGBuddy_ProcessSingleQueue(i, bgStatus[i]);
                elseif( status == "confirm" ) then
                        hasBGStatus = true;
                        BGBuddy_ProcessReady(i, bgStatus[i]);
                elseif( status == "active" ) then
                        hasBGStatus = true;
                        BGBuddy_ProcessActive(bgStatus[i]);
                end
        end

        -- No PvP right now? :(
        if( hasBGStatus == nil ) then
                BGBuddy_ProcessNotQueued();
        end

        BGBuddy_StandardFrame.status = "ERROR";
        BGBuddy_StandardFrame.mapName = "ERROR";
        BGBuddy_StandardFrame.instanceID = "ERROR";

        BGBuddy_DisplayLines();
end

-- Function to be called if there are NO active queues
function BGBuddy_ProcessNotQueued()
        
        BGBuddy_AddLine(GRAY_FONT_COLOR_CODE..BGBUDDY_NOT_IN_QUEUE..FONT_COLOR_CODE_CLOSE);

        -- Handle mod visibility preferences
        if ( BGBuddy_SavedVars["config"]["isAlwaysVisible"] == 0 ) then
                BGBuddy_StandardFrame:Hide();
        else
                if ( BGBuddy_SavedVars["config"]["hideDisplay"] == 0 ) then
                        BGBuddy_StandardFrame:Show();
                end
        end
        
        BGBuddy_OverlayFrame_EnterButton:Hide();
        BGBuddy_OverlayFrame_LeaveButton:Hide();
        BGBuddy_ScoreFrame:Hide();
end

-- Function to be called for each queued battleground
-- this must not interfere with active battlegrounds
function BGBuddy_ProcessSingleQueue(index, bgStatus)

        soundplayed[bgStatus["map"]] = false;
        
        local waitTime = GetBattlefieldEstimatedWaitTime(index);
        local timeInQueue = GetBattlefieldTimeWaited(index)/1000;
        timeInQueue = SecondsToTime(timeInQueue, BGBuddy_SavedVars["queued"]["showQueuedSeconds"] );

        -- We really should show seconds if minutes are 0
        if( timeInQueue == "" and BGBuddy_SavedVars["queued"]["showQueuedSeconds"] ~= nil ) then
                timeInQueue = GetBattlefieldTimeWaited(index)/1000;
                timeInQueue = SecondsToTime(timeInQueue);
        end

        if ( waitTime == 0 ) then
                waitTime = UNAVAILABLE;
        elseif ( waitTime < 60000 ) then
                waitTime = LESS_THAN_ONE_MINUTE;
        else
                waitTime = SecondsToTime(waitTime/1000, 1);
        end
        
        if( bgStatus["id"] ~= 0 ) then
                BGBuddy_AddLine(NORMAL_FONT_COLOR_CODE..BGBUDDY_IN_QUEUE..FONT_COLOR_CODE_CLOSE..
                                GREEN_FONT_COLOR_CODE..bgStatus["map"].." "..bgStatus["id"]..
                                FONT_COLOR_CODE_CLOSE);
        else    -- If first availible
                BGBuddy_AddLine(NORMAL_FONT_COLOR_CODE..BGBUDDY_IN_QUEUE..FONT_COLOR_CODE_CLOSE..
                                GREEN_FONT_COLOR_CODE..bgStatus["map"]..FONT_COLOR_CODE_CLOSE..
                                GREEN_FONT_COLOR_CODE.." "..BGBUDDY_FIRST_AVAILABLE..FONT_COLOR_CODE_CLOSE);
        end

        BGBuddy_AddLine(HIGHLIGHT_FONT_COLOR_CODE..waitTime.." ("..GRAY_FONT_COLOR_CODE..
                        timeInQueue..FONT_COLOR_CODE_CLOSE..")"..FONT_COLOR_CODE_CLOSE);

        if ( BGBuddy_SavedVars["config"]["hideDisplay"] == 0 ) then
                BGBuddy_StandardFrame:Show();
                BGBuddy_ScoreFrame:Show();
                if ( BGBuddy_SavedVars["config"]["hideBGIcon"] == 1 ) then
                        MiniMapBattlefieldFrame:Hide();
                else
                        MiniMapBattlefieldFrame:Show();
                end
        end
        BGBuddy_OverlayFrame_EnterButton:Hide();
        BGBuddy_OverlayFrame_LeaveButton:Hide();
end

-- Function to be called for and active battleground
-- can only be called once per update (duh)
function BGBuddy_ProcessActive(bgStatus)
        RequestBattlefieldScoreData();
        
        local playerName = UnitName("player");
        local av = BGBuddy_SavedVars["alterac_valley"];
        local wsg = BGBuddy_SavedVars["warsong_gulch"];
        local ab = BGBuddy_SavedVars["arathi_basin"];
        local numScores = GetNumBattlefieldScores();
        local name, kills, killingblows, deaths, honorgained, faction, rank, race, class;
        local totalplayers = 0;
        local playerstanding = 0;
        local playerkills = 0;
        local playerkillingblows = 0;
        local playerdeaths = 0;
        local playerhonorgained = 0;
        local playerfaction = 0;
        local playerrank = 0;
        local playerrace = 0;
        local playerclass = 0;

        BGBuddy_SyncResTimer();

        for i=1, 80 do
                name, _, _, _, _, _, _, _, playerclass = GetBattlefieldScore(i);
                if ( playerclass ~= nil ) then
                        totalplayers = totalplayers + 1;
                else
                        break;
                end

                if ( name == playerName ) then
                        playerstanding = i;
                        _, playerkillingblows, playerkills, playerdeaths, playerhonorgained, playerfaction, playerrank, playerrace, _ = GetBattlefieldScore(i);
                        playerlifetimekills,_,_ = GetPVPLifetimeStats();
                        bonusHonor = playerhonorgained;
                end
        end

        if( bgStatus["map"] == BGBUDDY_BATTLEGROUND_ALTERAC_VALLEY ) then
                local numStatColumns = GetNumBattlefieldStats();
                for j=1, MAX_NUM_STAT_COLUMNS do
                        if ( j <= numStatColumns ) then
                                columnData = GetBattlefieldStatData(playerstanding, j);
                                if (j==1) then 
                                        playergraveyardsassaulted = columnData;
                                elseif (j==2) then 
                                        playergraveyardsdefended = columnData;
                                elseif (j==3) then 
                                        playertowersassaulted = columnData;
                                elseif (j==4) then 
                                        playertowersdefended = columnData;
                                elseif (j==5) then 
                                        playerminescaptured = columnData;
                                elseif (j==6) then 
                                        playerleaderskilled = columnData;
                                elseif (j==7) then 
                                        playersecondaryobjectives = columnData; 
                                end                             
                        end
                end
        elseif( bgStatus["map"] == BGBUDDY_BATTLEGROUND_ARATHI_BASIN ) then
                local numStatColumns = GetNumBattlefieldStats();
                for j=1, MAX_NUM_STAT_COLUMNS do
                        if ( j <= numStatColumns ) then
                                columnData = GetBattlefieldStatData(playerstanding, j);
                                if (j==1) then
                                        playergraveyardsassaulted = columnData;
                                elseif (j==2) then
                                        playergraveyardsdefended = columnData; 
                                else
                                        break;
                                end
                        end
                end
                playertowersassaulted = GetBattlefieldWinner();
                if( playertowersassaulted == nil ) then playertowersassaulted = "N/A"; end
                playertowersdefended = "N/A";
                playerminescaptured = "N/A";
                playerleaderskilled = "N/A";
                playersecondaryobjectives = "N/A";
        else
                playergraveyardsassaulted = "N/A";
                playergraveyardsdefended = "N/A";
                playertowersassaulted = "N/A";
                playertowersdefended = "N/A";
                playerminescaptured = "N/A";
                playerleaderskilled = "N/A";
                playersecondaryobjectives = "N/A";
        end

        -- Just in case some values are still nill
        -- It shouldnt happen, but it does.
        if (playerlifetimekills == nil) then
                playerlifetimekills = "N/A";
        end
        if (playername == nil) then
                playername = "N/A";
        end
        if (playerkills == nil) then
                playerkills = "N/A";
        end
        if (playerdeaths == nil) then
                playerdeaths = "N/A";
        end
        if (playerkillingblows == nil) then
                playerkillingblows = "N/A";
        end
        if (playerhonorgained == nil) then
                playerhonorgained = "N/A";
                bonusHonor = 0;
        end
        if (playerfaction == nil) then
                playerfaction = "N/A";
        end
        if (playerrank == nil) then
                playerrank = "N/A";
        end
        if (playerrace == nil) then
                playerrace = "N/A";
        end
        if (playerclass == nil) then
                playerclass = "N/A";
        end
        if ( playergraveyardsassaulted == nil ) then
            playergraveyardsassaulted = "N/A";
        end
        if ( playergraveyardsdefended == nil ) then
            playergraveyardsdefended = "N/A";
        end

        sSub   = HIGHLIGHT_FONT_COLOR_CODE..playerstanding.."/"..totalplayers..NORMAL_FONT_COLOR_CODE;
        kSub   = GRAY_FONT_COLOR_CODE..playerkills..NORMAL_FONT_COLOR_CODE;
        kbSub  = GREEN_FONT_COLOR_CODE..playerkillingblows..NORMAL_FONT_COLOR_CODE;
        lkSub  = HIGHLIGHT_FONT_COLOR_CODE..playerlifetimekills..NORMAL_FONT_COLOR_CODE;
        dSub   = RED_FONT_COLOR_CODE..playerdeaths..NORMAL_FONT_COLOR_CODE;
        shSub  = HIGHLIGHT_FONT_COLOR_CODE..sessionhonor..NORMAL_FONT_COLOR_CODE;
        khSub  = HIGHLIGHT_FONT_COLOR_CODE..sessionkillhonor..NORMAL_FONT_COLOR_CODE;
        lkhSub = HIGHLIGHT_FONT_COLOR_CODE..lastkill..NORMAL_FONT_COLOR_CODE;
        bhSub  = HIGHLIGHT_FONT_COLOR_CODE..playerhonorgained..NORMAL_FONT_COLOR_CODE;
        gyaSub = RED_FONT_COLOR_CODE..playergraveyardsassaulted..NORMAL_FONT_COLOR_CODE;
        gydSub = GREEN_FONT_COLOR_CODE..playergraveyardsdefended..NORMAL_FONT_COLOR_CODE;
        taSub  = RED_FONT_COLOR_CODE..playertowersassaulted..NORMAL_FONT_COLOR_CODE;
        tdSub  = GREEN_FONT_COLOR_CODE..playertowersdefended..NORMAL_FONT_COLOR_CODE;
        mcSub  = HIGHLIGHT_FONT_COLOR_CODE..playerminescaptured..NORMAL_FONT_COLOR_CODE;
        ldkSub = HIGHLIGHT_FONT_COLOR_CODE..playerleaderskilled..NORMAL_FONT_COLOR_CODE;
        soSub  = HIGHLIGHT_FONT_COLOR_CODE..playersecondaryobjectives..NORMAL_FONT_COLOR_CODE;
        bgSub  = GREEN_FONT_COLOR_CODE..bgStatus["map"].." "..bgStatus["id"]..FONT_COLOR_CODE_CLOSE;
        
        if( resTimeSet == false ) then
            resSub = RED_FONT_COLOR_CODE.."N/A"..NORMAL_FONT_COLOR_CODE;
        else
            local time_left = ceil(timer_nextRes - this_GameTime);
            
            if( time_left == 31 ) then
                 resSub = RED_FONT_COLOR_CODE.."RES!"..NORMAL_FONT_COLOR_CODE;
            elseif( time_left < 6 ) then
                resSub = RED_FONT_COLOR_CODE..time_left..NORMAL_FONT_COLOR_CODE;
            elseif( time_left < 15 ) then
                resSub = GREEN_FONT_COLOR_CODE..time_left..NORMAL_FONT_COLOR_CODE;
            else
                resSub = HIGHLIGHT_FONT_COLOR_CODE..time_left..NORMAL_FONT_COLOR_CODE;
            end
        end

        newString = nil;

        if ( bgStatus["map"] == BGBUDDY_BATTLEGROUND_ALTERAC_VALLEY ) then
                newString = BGBuddy_SavedVars["alterac_valley"]["customizeText"];
        elseif ( bgStatus["map"] == BGBUDDY_BATTLEGROUND_WARSONG_GULCH ) then
                newString = BGBuddy_SavedVars["warsong_gulch"]["customizeText"];
        elseif ( bgStatus["map"] == BGBUDDY_BATTLEGROUND_ARATHI_BASIN ) then
                newString = BGBuddy_SavedVars["arathi_basin"]["customizeText"];
        end

        if ( newString ~= nil ) then
                newString = gsub(newString,"~LKH",lkhSub);
                newString = gsub(newString,"~LDK",ldkSub);
                newString = gsub(newString,"~GYA",gyaSub);
                newString = gsub(newString,"~GYD",gydSub);
                newString = gsub(newString,"~KB",kbSub);
                newString = gsub(newString,"~LK",lkSub);
                newString = gsub(newString,"~SH",shSub);
                newString = gsub(newString,"~KH",khSub);
                newString = gsub(newString,"~BH",bhSub);
                newString = gsub(newString,"~TA",taSub);
                newString = gsub(newString,"~TD",tdSub);
                newString = gsub(newString,"~MC",mcSub);
                newString = gsub(newString,"~SO",soSub);
                newString = gsub(newString,"~K",kSub);
                newString = gsub(newString,"~D",dSub);
                newString = gsub(newString,"~S",sSub);
                newString = gsub(newString,"~BG",bgSub);
                newString = gsub(newString,"~RES",resSub);
                BGBuddy_AddLine(NORMAL_FONT_COLOR_CODE..newString);
        end

        if ( BGBuddy_SavedVars["config"]["hideBGIcon"] == 1 ) then
                MiniMapBattlefieldFrame:Hide();
        else
                MiniMapBattlefieldFrame:Show();
        end
        
        BGBuddy_OverlayFrame_EnterButton:Hide();
        BGBuddy_OverlayFrame_LeaveButton:Hide();
        BGBuddy_OverlayFrame_SwitchButton:Hide();
        
        if ( BGBuddy_SavedVars["config"]["hideDisplay"] == 0 ) then
                BGBuddy_ScoreFrame:Show();
                BGBuddy_StandardFrame:Show();
        end
end

-- Function to be called for each battleground that
-- is ready to join
function BGBuddy_ProcessReady(index, bgStatus)
        
        if ( BGBuddy_SavedVars["config"]["playSound"] == 1 and soundplayed[bgStatus["map"]] == false) then
                PlaySoundFile("Interface\\AddOns\\BGBuddy\\BGBuddy_BattlegroundReady.wav");
                soundplayed[bgStatus["map"]] = true;
        end

        BGBuddy_AddLine(GREEN_FONT_COLOR_CODE..bgStatus["map"]..FONT_COLOR_CODE_CLOSE..
                        HIGHLIGHT_FONT_COLOR_CODE..BGBUDDY_BATTLEGROUND_READY..FONT_COLOR_CODE_CLOSE);

        local expireTime = GetBattlefieldPortExpiration(index)/1000
        local autoJoinTime = SecondsToTime(expireTime-2);
        local manualJoinTime = SecondsToTime(expireTime);
        if ( BGBuddy_SavedVars["config"]["delayedAutoJoin"] == 1 
             and BGBuddy_SavedVars["config"]["AutoJoin"] == 1 ) then
                BGBuddy_AddLine(NORMAL_FONT_COLOR_CODE..BGBUDDY_BATTLEGROUND_JOIN_TIME..
                                FONT_COLOR_CODE_CLOSE..RED_FONT_COLOR_CODE..autoJoinTime..FONT_COLOR_CODE_CLOSE);
        else
                BGBuddy_AddLine(NORMAL_FONT_COLOR_CODE..BGBUDDY_BATTLEGROUND_JOIN_EXPIRE..
                                FONT_COLOR_CODE_CLOSE..RED_FONT_COLOR_CODE..manualJoinTime..FONT_COLOR_CODE_CLOSE);
        end
        
        BGBuddy_AutoJoin(index);

        StaticPopup_Hide("CONFIRM_BATTLEFIELD_ENTRY");
        if ( BGBuddy_SavedVars["config"]["hideBGIcon"] == 1 ) then
                MiniMapBattlefieldFrame:Hide();
        else
                MiniMapBattlefieldFrame:Show();
        end
        
        BGBuddy_OverlayFrame_LeaveButton:Hide();
        
        if ( BGBuddy_SavedVars["config"]["hideDisplay"] == 0 ) then
                BGBuddy_StandardFrame:Show();
                BGBuddy_OverlayFrame_EnterButton:Show();
                BGBuddy_ScoreFrame:Show();
        end
        bonusHonor = -1;
end


-- Add a line to the ui display
function BGBuddy_AddLine(arg1)
        lines[current_line] = arg1;
        current_line = current_line + 1;
end

function BGBuddy_ClearLines()
        lines = { };
        current_line = 1;
end

function BGBuddy_DisplayLines()
        -- Clear out the UI text field
        BGBuddy_Line1:SetText("");
        
        local lineCount = 0;
        local display_text = "";
        for i=1, (current_line+1) do
                if( lines[i] ~= nil ) then
                        if( i ~= 1) then
                                display_text = display_text.."\n";
                        end

                        display_text = display_text..lines[i];
                        lineCount = lineCount + 1;
                end
        end
        BGBuddy_Line1:SetText(display_text);

        local baseHeight = 0;
        if( lineCount > 0 ) then
                baseHeight = baseHeight + math.floor(lineCount * 13);
        end

        maxWidth = BGBuddy_Line1:GetWidth();
        if ( (BGBuddy_RankName:GetWidth()+40) > maxWidth and BGBuddy_SavedVars["config"]["displayRank"] == 1 ) then
                maxWidth = BGBuddy_RankName:GetWidth() + 40;
        end

        if ( BGBuddy_ScoreFrame:IsVisible() ) then
                maxWidth = maxWidth + 17;
        end


        if ( BGBuddy_SavedVars["config"]["displayRank"] == 1 ) then
                baseHeight = baseHeight + 16;
                BGBuddy_RankFrame:Show();
        else
                BGBuddy_RankFrame:Hide();
        end

        BGBuddy_StandardFrame:SetHeight(baseHeight);
        BGBuddy_StandardFrame:SetWidth(maxWidth);
end


function BGBuddy_OnMouseDown(arg1)
        if (arg1 == "LeftButton" and BGBuddy_SavedVars["config"]["isLocked"] == 0) then
                BGBuddy_StandardFrame:StartMoving();
        end

        if (arg1 == "RightButton") then
                ShowUIPanel(BGBuddy_ConfigPanel_CustomizeDisplay);
        end
end

function BGBuddy_OnMouseUp(arg1)
        if (arg1 == "LeftButton") then
                BGBuddy_StandardFrame:StopMovingOrSizing();
        end
end

function BGBuddy_Config_SetCustomDisplay()
        custom_text = ConfigureBodyEditBox:GetText();

        if ( AVLabel:IsVisible() == 1 ) then
                BGBuddy_SavedVars["alterac_valley"]["customizeText"] = custom_text;
        elseif ( WSGLabel:IsVisible() == 1 ) then
                BGBuddy_SavedVars["warsong_gulch"]["customizeText"] = custom_text;
        elseif ( ABLabel:IsVisible() == 1 ) then
                BGBuddy_SavedVars["arathi_basin"]["customizeText"] = custom_text;
        end
end

-- Sets the check boxes and line text to match the current saved settings
function BGBuddy_Config_ChangeCustomDisplay(bg)
        custom_text = " ";

        AVLabel:Hide();
        WSGLabel:Hide();
        ABLabel:Hide();

        LegendValue2_AV:Hide();
        LegendValue2_WSG:Hide();
        LegendValue2_AB:Hide();

        LegendEquals2_AV:Hide();
        LegendEquals2_WSG:Hide();

        LegendKeys2_AV:Hide();
        LegendKeys2_WSG:Hide();
        
        if ( bg == "AV" ) then
                AVLabel:Show();
                LegendValue2_AV:Show();
                LegendEquals2_AV:Show();
                LegendKeys2_AV:Show();
                custom_text = BGBuddy_SavedVars["alterac_valley"]["customizeText"];
        elseif ( bg == "WSG" ) then
                WSGLabel:Show();
                LegendValue2_WSG:Show();
                LegendEquals2_WSG:Show();
                LegendKeys2_WSG:Show()
                custom_text = BGBuddy_SavedVars["warsong_gulch"]["customizeText"];
        elseif ( bg == "AB" ) then
                ABLabel:Show();
                LegendValue2_AB:Show();
                LegendEquals2_WSG:Show();
                LegendKeys2_WSG:Show();
                custom_text = BGBuddy_SavedVars["arathi_basin"]["customizeText"];
        else
                return;
        end

        ConfigureBodyEditBox:SetText(custom_text);
end

function BGBuddy_Config_ChangeCustomDisplayNBG(tab)
        custom_text = "";

        AVLabel:Hide();
        WSGLabel:Hide();
        ABLabel:Hide();

        LegendValue2_AV:Hide();
        LegendValue2_WSG:Hide();
        LegendValue2_AB:Hide();

        LegendEquals2_AV:Hide();
        LegendEquals2_WSG:Hide();

        LegendKeys2_AV:Hide();
        LegendKeys2_WSG:Hide();
        
        if ( bg == "AV" ) then
                AVLabel:Show();
                LegendValue2_AV:Show();
                LegendEquals2_AV:Show();
                LegendKeys2_AV:Show();
                custom_text = BGBuddy_SavedVars["queued"]["customizeText"];
        elseif ( bg == "WSG" ) then
                WSGLabel:Show();
                LegendValue2_WSG:Show();
                LegendEquals2_WSG:Show();
                LegendKeys2_WSG:Show()
                custom_text = BGBuddy_SavedVars["not_queued"]["customizeText"];
        else
                return;
        end

        ConfigureBodyEditBox:SetText(custom_text);
end

--
-- Timers
--
-- Sync the res timers, or try to keep count
function BGBuddy_SyncResTimer()
    local spiritTimer = GetAreaSpiritHealerTime();
    
    if( spiritTimer ~= 0 and spiritTimer ~= nil ) then
        timer_nextRes = ceil(this_GameTime) + spiritTimer;
        resTimeSet = true;
        return;
    end

    if( resTimeSet == true ) then
        -- Countdown is -1 < x < 31.
        while( (timer_nextRes - this_GameTime) < 0 ) do
            timer_nextRes = timer_nextRes + 31;
        end
        
        -- Only decrement the counter about once per second
        if( (floor(this_GameTime) - ceil(last_GameTime)) >= 1 ) then
            last_GameTime = this_GameTime;
        end
    end
end

-- Update the timers res timer when it hits 0
function BGBuddy_UpdateResTimer()

end


--
-- UI Button Panels
--
-- Enables all buttons, then disables the currently active button
function BGBuddy_Config_SetButtonState(button)
        -- BG
        BGBuddy_ConfigPanel_CustomizeDisplay.selectedTab = button;
        PanelTemplates_UpdateTabs(BGBuddy_ConfigPanel_CustomizeDisplay);
end

-- Sets up the customize drop down
function BGBuddy_ConfigPanel_CustomizeDropdown_OnLoad()
        UIDropDownMenu_Initialize( this, BGBuddy_ConfigPanel_CustomizeDropdown_Init );
end

function BGBuddy_ConfigPanel_CustomizeDropdown_Init()
        local battlegrounds = { };
        battlegrounds.text = BGBUDDY_CONFIG_DROPDOWN_BG;
        battlegrounds.value = "bg";
        battlegrounds.func = BGBuddy_ShowConfigPanel;
        battlegrounds.toolTipTitle = BGBUDDY_CONFIG_DROPDOWN_TITLE;
        battlegrounds.toolTipText = BGBUDDY_CONFIG_DROPTOWN_BG_TIP;

--[[    local nonbattlegrounds = { };
        nonbattlegrounds.text = BGBUDDY_CONFIG_DROPDOWN_NONBG;
        nonbattlegrounds.value = "nbg";
        nonbattlegrounds.func = BGBuddy_ShowConfigPanel;
        nonbattlegrounds.toolTipTitle = BGBUDDY_CONFIG_DROPDOWN_TITLE;
        nonbattlegrounds.toolTipText = BGBUDDY_CONFIG_DROPDOWN_NONBG_TIP;
]]
        local general = { };
        general.text = BGBUDDY_CONFIG_DROPDOWN_GENERAL;
        general.value = "gen";
        general.func = BGBuddy_ShowConfigPanel;
        general.toolTipTitle = BGBUDDY_CONFIG_DROPDOWN_TITLE;
        general.toolTipText = BGBUDDY_CONFIG_DROPDOWN_GENERAL_TIP;
        
        UIDropDownMenu_AddButton( battlegrounds, 1 );
--      UIDropDownMenu_AddButton( nonbattlegrounds, 1 );
        UIDropDownMenu_AddButton( general, 1 );
end

function BGBuddy_ShowConfigPanel(id, value)
        if( id == nil ) then
                id = this:GetID();
        end
        if( value == nil ) then
                value = this.value;
        end
        
        UIDropDownMenu_SetSelectedID(BGBuddy_ConfigPanel_CustomizeDropdown, id, nil);

        BGBuddy_ConfigPanel_CustomizeBG:Hide();
--      BGBuddy_ConfigPanel_CustomizeNonBG:Hide();
        BGBuddy_ConfigPanel_CustomizeGeneral:Hide();

        if ( value == "bg" ) then
                BGBuddy_ConfigPanel_CustomizeBG:Show();
--      elseif ( value == "nbg" ) then
--              BGBuddy_ConfigPanel_CustomizeNonBG:Show();
        elseif ( value == "gen" ) then
                BGBuddy_ConfigPanel_CustomizeGeneral:Show();
        end
end

--
-- General Config Handling Functions
--
function BGBuddy_Config_SetAlpha()
        BGBuddy_ConfigPanel_Slider1:SetValue(BGBuddy_SavedVars["config"]["backgroundAlpha"]);
        BGBuddy_ConfigPanel_Slider2:SetValue(BGBuddy_SavedVars["config"]["borderAlpha"]);
end

function BGBuddy_Config_SetBackgroundAlpha()
        BGBuddy_SavedVars["config"]["backgroundAlpha"] = BGBuddy_ConfigPanel_Slider1:GetValue();
        BGBuddy_ConfigPanel_Slider1ValueText:SetText(BGBuddy_SavedVars["config"]["backgroundAlpha"].."%");
        
        alpha = BGBuddy_SavedVars["config"]["backgroundAlpha"];
        alpha = alpha * 0.01;

        BGBuddy_StandardFrame:SetBackdropColor(0, 0, 0, alpha);
end

function BGBuddy_Config_SetBorderAlpha()
        BGBuddy_SavedVars["config"]["borderAlpha"] = BGBuddy_ConfigPanel_Slider2:GetValue();
        BGBuddy_ConfigPanel_Slider2ValueText:SetText(BGBuddy_SavedVars["config"]["borderAlpha"].."%");
        
        alpha = BGBuddy_SavedVars["config"]["borderAlpha"];
        alpha = alpha * 0.01;

        BGBuddy_StandardFrame:SetBackdropBorderColor(1, 1, 1, alpha);
end

function BGBuddy_Config_SetUiScale()
        BGBuddy_SavedVars["config"]["uiScale"] = BGBuddy_ConfigPanel_Slider3:GetValue();
        BGBuddy_ConfigPanel_Slider3ValueText:SetText((100+(math.floor(BGBuddy_SavedVars["config"]["uiScale"])).."%"));

        BGBuddy_StandardFrame:SetScale(1 + (BGBuddy_SavedVars["config"]["uiScale"]/100));
end

function BGBuddy_Config_SetEnabled() 
        if ( BGBuddy_ConfigPanel_EnableBGBuddy:GetChecked() == 1 ) then
                BGBuddy_Initialize();
                BGBuddy_Config_SetVisibilityStatus();
        else
                DEFAULT_CHAT_FRAME:AddMessage(BGBUDDY_TITLE.." "..BGBUDDY_VERSION..BGBUDDY_DISABLED_CHAT_MESSAGE);
                BGBuddy_StandardFrame:Hide();
        end
end

function BGBuddy_Config_SetVisibility() 
        if ( BGBuddy_SavedVars["config"]["hideDisplay"] == 1 ) then
                BGBuddy_StandardFrame:Hide();
                DEFAULT_CHAT_FRAME:AddMessage(BGBUDDY_TITLE.." "..BGBUDDY_VERSION..BGBUDDY_HIDDEN_CHAT_MESSAGE);
        else
                BGBuddy_StandardFrame:Show();
        end
end

function BGBuddy_Config_SetVisibilityStatus() 
        if ( BGBuddy_SavedVars["config"]["isAlwaysVisible"] == 1 ) then
                if ( BGBuddy_SavedVars["config"]["hideDisplay"] == 0 ) then
                        BGBuddy_StandardFrame:Show();
                end
        end
end

function BGBuddy_AutoJoin(index)
        local expireTime = GetBattlefieldPortExpiration(index)/1000
        
        if( BGBuddy_SavedVars["config"]["AutoJoin"] == 1 ) then
                if( BGBuddy_SavedVars["config"]["delayedAutoJoin"] == 0 ) then
                        AcceptBattlefieldPort(index, true);
                        StaticPopup_Hide("CONFIRM_BATTLEFIELD_ENTRY");
                else
                        expireTime = math.floor(expireTime);
                        if( expireTime == 2 ) then
                                AcceptBattlefieldPort(index, true);
                                StaticPopup_Hide("CONFIRM_BATTLEFIELD_ENTRY");
                        end
                end
        end
end

-- Standard as of WoW 1.7
function BGBuddy_AutoRes()
--      local status, _, _ = GetBattlefieldStatus();
--      if ( BGBuddy_ConfigPanel_AutoRes:GetChecked() == 1) then
--              BGBuddy_SavedVars["config"]["AutoRes"] = 1;
--              if ( status == "active" ) then
--
--                      if ( UnitIsGhost("player") ) then
--                              AcceptAreaSpiritHeal();
--                              getglobal("StaticPopup1Button1"):Hide();
--                              getglobal("StaticPopup1Button2"):Hide();
--                      end
--              end
--      else 
--              BGBuddy_SavedVars["config"]["AutoRes"] = 0;
--      end
end

function BGBuddy_AutoRelease()
        for i=1, MAX_BATTLEFIELD_QUEUES do
                local _, _, instanceID = GetBattlefieldStatus(i)
                
                if( BGBuddy_SavedVars["config"]["AutoRelease"] == 1
                        and UnitIsDeadOrGhost("player")
                        and HasSoulstone() == nil
                        and instanceID ~= 0 ) then
                        RepopMe();
                end
        end
end

-- Generic output
function BGBuddy_ChatReport(msg)
        DEFAULT_CHAT_FRAME:AddMessage(msg,1,0,0.35);
end

------------------------------
--  Debug Functions
------------------------------
function bgbdebug(msg)
        if( debug_enable == 1 ) then
                BGBuddy_ChatReport( "BGB Debug: "..msg );
        end
end

function BGBuddy_ToggleDebug()
        if( debug_enable == 1 ) then
                debug_enable = 0;
                DEFAULT_CHAT_FRAME:AddMessage("BGB Debugging: Disabled",1,0.65,1);
                return;
        end

        debug_enable = 1;
        DEFAULT_CHAT_FRAME:AddMessage("BGB Debugging: Enabled",1,0.65,1);
end