vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
-- BGAssist 
-- Copyright 2005 original author. Copyright is expressly not transferred to Blizzard.
-- 
-- Battleground helper functionality
--
--  Author: Marc aka Saien on Hyjal
--  WoWSaien@gmail.com
--  http://64.168.251.69/wow
--
--  Changes:
--  2006.01.03
--    Updated to 1.9 TOC
--    Updated to supported multiple BG Queues.
--    Auto Join will not auto join if you're already in another BG.
--    AFK works like this: When you zone in to a BG, you lose your AFK but 
--      are almost immediately reflagged. This zones you out, losing your space 
--      in the queue. This is verified as of 1.9. Due to this, Autojoin will 
--      once again not join when AFK.
--  2005.10.10
--    Due to Blizzard changes, Autojoin will again join when you're AFK.
--    Autorez in BG option removed as it has been implemented by Blizzard
--  2005.09.13
--    TOC change to 1700 and adjust to 1.7 changes
--    Arathi Basin timers work.
--    Timers have been changed to match the mainmap colors. Timer will show the color 
--      of the attacking faction. This is opposite previous versions.
--    To avoid group-bug problems, Autoleave group leaves the group at the win/loss screen. 
--      If you /afk out it will still leave the group after you zone.
--    WSG/AB: Config option to not autojoin instances that exist at the time you queue up.
--  2005.09.03
--    Will no longer popup an error when more than 10 targets are to be displayed on target list
--    Target list will show/hide when checking/unchecking the config option immediately, 
--      not just when you zone.
--  2005.08.24
--    Alliance sites being captured now are cyan in the timer. Dark blue just too hard to see.
--    Timer countdowns will now only show the first word of the name.
--    Fixed bug causing error popup in AV.
--    Option to autoaccept group invites when in a BG
--    Option to autoleave your group when leaving BG
--    Will not auto enter BG when dead or ghost.
--    Fixed Slidore's quest name -again-. Hey, I'm horde and can't test it
--  2005.08.13
--    Class breakdown on score window.
--    Targetting assistance window. See web.
--    Fixed typo in Sildore's quest name.
--    Warsong Gulch: Flag carrier named onscreen now. Needs translations for 
--       filthy foreigners to work.
--    German updates, though quests need more work for autocomplete. Frogs are mostly done now, except for new stuff.
--  2005.07.19
--    Will not autoenter if you're AFK
--    French localization partially in place. Still requires update, German is 
--      completly undone. Note that quest turnins will not work unless setup for 
--      your language properly. As I speak neither language (and proud of it) this 
--      is all on your shoulders, not mine.
--    Rez timer in place. Might not be entirely accurate (based on your network lag) 
--      and won't start counting down until you die once after zoning in.
--    Checkmark for not showing the window at zonein was being set backwards.
--  2007.07.15-2
--    Unnecessary zone restriction on autorez removed (aka Should work in Gulch now)
--  2005.07.15
--    Auto release in BG
--    Keybinding to toggle window on or off regardless of in BG or not
--    Config option to not turn window on when entering BG
--    Player per faction counts are unncessary now.
--    

BGASSIST_VERSION = "2006.01.03";

BINDING_HEADER_BGASSIST_SEP = "BGAssist";
BINDING_NAME_BGASSIST_TOGGLE = "Toggle BGAssist Window";

local BGAssist_ItemTrack = {
        [17422] = "INV_Shoulder_19",            -- "Armor Scraps"
        -- Horde
        [17306] = "INV_Potion_50",              -- "Stormpike Soldier's Blood"
        [17642] = "INV_Misc_Pelt_Bear_02",      -- "Alterac Ram Hide"
        [18142] = "INV_Misc_Head_Elf_02",       -- "Severed Night Elf Head"
        [18143] = "INV_Misc_MonsterTail_02",    -- "Tuft of Gnome Hair"
        [18206] = "INV_Misc_Bone_03",           -- "Dwarf Spine"
        [18144] = "INV_Misc_Bone_07",           -- "Human Bone Chip"
        [17326] = "INV_Misc_Food_52",           -- "Stormpike Soldier's Flesh",
        [17327] = "INV_Misc_Food_72",           -- "Stormpike Lieutenant's Flesh"
        [17328] = "INV_Misc_Food_69",           -- "Stormpike Commander's Flesh",
        -- Alliance
        [17423] = "INV_Misc_Gem_Pearl_06",      -- "Storm Crystal"
        [17643] = "INV_Misc_Pelt_Bear_02",      -- "Frostwolf Hide"
        [18145] = "INV_Misc_Foot_Centaur",      -- "Tauren Hoof"
        [18146] = "INV_Potion_82",              -- "Darkspear Troll Mojo"
        [18207] = "INV_Misc_Bone_08",           -- "Orc Tooth"
        [18147] = "INV_Misc_Organ_01",          -- "Forsaken Heart"
        [17502] = "INV_Jewelry_Talisman_06",    -- "Frostwolf Soldier's Medal"
        [17503] = "INV_Jewelry_Talisman_04",    -- "Frostwolf Lieutenant's Medal"
        [17504] = "INV_Jewelry_Talisman_12",    -- "Frostwolf Commander's Medal"
};
local BGAssist_Alterac_Quests = {
        ["Irondeep Supplies"] = true,
        ["Coldtooth Supplies"] = true,
        ["Master Ryson's All Seeing Eye"] = true,
        ["Empty Stables"] = true,       -- Wolf/Ram turnin
        -- Horde
        ["More Booty!"]                         = { item = 17422, min=20 },
        ["Lokholar the Ice Lord"]               = { item = 17306, max=4 },
        ["A Gallon of Blood"]                   = { item = 17306, min=5 },
        ["Ram Hide Harnesses"]                  = { item = 17642 },
        ["Darkspear Defense"]                   = { item = 18142 },
        ["Tuft it Out"]                         = { item = 18143 },
        ["Wanted: MORE DWARVES!"]               = { item = 18206 },
        ["I've Got A Fever For More Bone Chips"]= { item = 18144 },
        ["Call of Air - Guse's Fleet"]          = { item = 17326 },
        ["Call of Air - Jeztor's Fleet"]        = { item = 17327 },
        ["Call of Air - Mulverick's Fleet"]     = { item = 17328 },
        -- Alliance
        ["More Armor Scraps"]                   = { item = 17422, min=20 },
        ["Ivus the Forest Lord"]                = { item = 17423, max=4 },
        ["Crystal Cluster"]                     = { item = 17423, min=5 },
        ["Ram Riding Harnesses"]                = { item = 17643 },
        ["What the Hoof?"]                      = { item = 18145 },
        ["Staghelm's Mojo Jamboree"]            = { item = 18146 },
        ["Wanted: MORE ORCS!"]                  = { item = 18207 },
        ["One Man's Love"]                      = { item = 18147 },
        ["Call of Air - Slidore's Fleet"]       = { item = 17502 }, 
        ["Call of Air - Vipore's Fleet"]        = { item = 17503 },
        ["Call of Air - Ichman's Fleet"]        = { item = 17504 },
};
local BGAssist_FlagRegexp = {
        ["RESET"] = {   ["regexp"] = "The flags are now placed at their bases." },
        ["PICKED"] = {  ["one"] = "FACTION", ["two"] = "PLAYER",
                        ["regexp"] = "The ([^ ]*) [fF]lag was picked up by ([^!]*)!" },
        ["DROPPED"] = { ["one"] = "FACTION", ["two"] = "PLAYER",
                        ["regexp"] = "The ([^ ]*) [fF]lag was dropped by ([^!]*)!" },
        ["RETURNED"] ={ ["one"] = "FACTION", ["two"] = "PLAYER",
                        ["regexp"] = "The ([^ ]*) [fF]lag was returned to its base by ([^!]*)!" },
        ["CAPTURED"] ={ ["one"] = "PLAYER", ["two"] = "FACTION",
                        ["regexp"] = "([^ ]*) captured the ([^ ]*) flag!" },
};
local ALTERACVALLEY = "Alterac Valley";
local WARSONGGULCH = "Warsong Gulch";
local ARATHIBASIN = "Arathi Basin";

local DISPLAY_MENU_LOCKWINDOW = "Lock Window Position";
local DISPLAY_MENU_AUTOSHOW = "Auto Show Window when Entering BG";
local DISPLAY_MENU_AUTORELEASE = "Auto Release in BG";
local DISPLAY_MENU_AUTOQUEST = "Auto Confirm Quests";
local DISPLAY_MENU_AUTOENTER = "Auto Enter BG";
local DISPLAY_MENU_AUTOSIGNUP = "Auto Signup for BG";
local DISPLAY_MENU_TIMERSHOW = "Show Capture Timers";
local DISPLAY_MENU_ITEMSHOW = "Show BG Item Counts";
local DISPLAY_MENU_GYCOUNTDOWN = "Show Timer for GY Rezzing";
local DISPLAY_MENU_FLAGTRACKING = "Track Flags";
local DISPLAY_MENU_TARGETTINGASSISTANCE = "Use Targetting Assistance Window";
local DISPLAY_MENU_AUTOACCEPTGROUP = "Auto accept group invites in BG";
local DISPLAY_MENU_AUTOLEAVEGROUP = "Auto leave group when leaving BG";
local DISPLAY_MENU_NOPREEXISTING = "No pre-existing instances";
local DISPLAY_MENU_SHOWCAPTUREDFLAGS = "Show flags already captured";
local DISPLAY_TITLEDISPLAY_CAPTURE = "Captures";
local DISPLAY_TITLEDISPLAY_ITEMS   = "Items";
local DISPLAY_TITLEDISPLAY_TARGETS = "Targets";
local DISPLAY_TEXT_PREEXISTING = "Offered BG instance is pre-existing";
local DISPLAY_TEXT_ENTERINGBATTLEGROUNDS = "Entering Battlegrounds";
local DISPLAY_TEXT_LEFTBATTLEGROUNDS = "Left Battlegrounds";
local DISPLAY_TEXT_TIMEUNTILREZ = "Time Until Ressurection";
local DISPLAY_TEXT_TIMELEFT = "Time Left";
local DISPLAY_TEXT_SECONDS = "seconds";
local DISPLAY_TEXT_MINUTES = "minutes";
local DISPLAY_TEXT_NOTENTERINGAFK = "Not entering BG because you are AFK";
local DISPLAY_TEXT_FLAGHOLDERNOTCLOSEENOUGH = "Flag Holder not close enough to target.";
local BATTLEGROUND_GOSSIP_TEXT = "I would like to go to the battleground.";
local MATCHING_MARKED_AFK = "You are now AFK";
local MATCHING_CLEARED_AFK = "You are no longer AFK.";
local FACTION_ALLIANCE = "Alliance";
local FACTION_HORDE = "Horde";
local CLASS_WARRIOR = "Warrior";
local CLASS_MAGE = "Mage";
local CLASS_ROGUE = "Rogue";
local CLASS_DRUID = "Druid";
local CLASS_HUNTER = "Hunter";
local CLASS_SHAMAN = "Shaman";
local CLASS_PRIEST = "Priest";
local CLASS_WARLOCK = "Warlock";
local CLASS_PALADIN = "Paladin"

if ( GetLocale() == "frFR" ) then
        -- Mail updates to WoWSaien@gmail.com
        -- DISPLAY_xxx variables can be anything you want to display
        -- EVERYTHING ELSE MUST MATCH THE GAME
        BINDING_NAME_BGASSIST_TOGGLE = "Toggle BGAssist Window";
        BGAssist_Alterac_Quests = {
                ["Fournitures d'Irondeep"] = true,
                ["Fournitures de Coldtooth"] = true,
                ["L'Oeil qui voit tout de maître Ryson"] = true,
                ["Ecuries vides"] = true,
                -- Horde
                ["Plus de butin !"]                             = { item = 17422, min=20 },
                ["Lokholar le Seigneur des Glaces"]             = { item = 17306, max=4 },
                ["Quelques litres de sang"]                     = { item = 17306, min=5 },
                ["Harnais en cuir de bélier"]                  = { item = 17642 },
                ["La défense des Darkspear"]                   = { item = 18142 },
                ["Pour une poignée de cheuveux"]               = { item = 18143 },
                ["On recherche : PLUS DE NAINS !"]              = { item = 18206 },
        ["I've Got A Fever For More Bone Chips"]= { item = 18144 },
                ["L'appel des airs - l'escadrille de Guse"]     = { item = 17326 },
                ["L'appel des airs - l'escadrille de Jeztor"]   = { item = 17327 },
                ["L'appel des airs - l'escadrille de Mulverick"]= { item = 17328 },
        -- Alliance
                ["Plus de morceaux d'armure !"]                 = { item = 17422, min=20 },
                ["Ivus le Seigneur des for\195\170ts"]          = { item = 17423, max=4 },
        ["Crystal Cluster"]                     = { item = 17423, min=5 },
                ["Harnais pour b\195\169liers"]                 = { item = 17643 },
                ["Chasse aux sabots !"]                         = { item = 18145 },
                ["La collection de mojos de Staghelm"]          = { item = 18146 },
                ["On recherche : PLUS D'ORCS !"]                = { item = 18207 },
                ["L'amour d'un homme"]                          = { item = 18147 },
                ["L'appel des airs - l'escadrille de Slidore"]  = { item = 17502 },
                ["L'appel des airs - l'escadrille de Vipore"]   = { item = 17503 },
                ["L'appel des airs - l'escadrille d'Ichman"]    = { item = 17504 },
        };
        BGAssist_FlagRegexp = {
                ["RESET"] = {   ["regexp"] = "The flags are now placed at their bases." },
                ["PICKED"] = {  ["one"] = "FACTION", ["two"] = "PLAYER",
                                ["regexp"] = "The ([^ ]*) flag was picked up by ([^!]*)!" },
                ["DROPPED"] = { ["one"] = "FACTION", ["two"] = "PLAYER",
                                ["regexp"] = "The ([^ ]*) flag was dropped by ([^!]*)!" },
                ["RETURNED"] ={ ["one"] = "FACTION", ["two"] = "PLAYER",
                                ["regexp"] = "The ([^ ]*) flag was returned to its base by ([^!]*)!" },
                ["CAPTURED"] ={ ["one"] = "PLAYER", ["two"] = "FACTION",
                                ["regexp"] = "([^ ]*) captured the ([^ ]*) flag!" },
        };
        ALTERACVALLEY = "Vall\195\169e d'Alterac";
        WARSONGGULCH = "Goulet des Warsong";
        ARATHIBASIN = "Arathi Basin";
        DISPLAY_MENU_LOCKWINDOW = "Verrouiller la position de la fen\195\170tre de BGAssist";
        DISPLAY_MENU_AUTOSHOW = "Afficher automatiquement la fen\195\170tre de BGAssist dans le BG";
        DISPLAY_MENU_AUTORELEASE = "R\195\169surrection automatique au cimeti\195\168re";
        DISPLAY_MENU_AUTOQUEST = "Confirmer automatiquement les qu\195\170tes";
        DISPLAY_MENU_AUTOENTER = "Entrer automatiquement dans le BG";
        DISPLAY_MENU_TIMERSHOW = "Afficher le temps de capture des cimeti\195\168res et des tours";
        DISPLAY_MENU_ITEMSHOW = "Afficher le nombre d'items de qu\195\170tes que vous poss\195\169dez";
        DISPLAY_MENU_GYCOUNTDOWN = "Afficher le temps restant avant r\195\169surrection au cimeti\195\168re";
        DISPLAY_MENU_FLAGTRACKING = "Track Flags";
        DISPLAY_MENU_TARGETTINGASSISTANCE = "Targetting Assistance Window";
        DISPLAY_MENU_AUTOACCEPTGROUP = "Auto accept group invites in BG";
        DISPLAY_MENU_AUTOLEAVEGROUP = "Auto leave group when leaving BG";
        DISPLAY_MENU_NOPREEXISTING = "No pre-existing instances";
        DISPLAY_TITLETEXT_CAPTURE = "Capture";
        DISPLAY_TITLETEXT_ITEMS = "Items";
        DISPLAY_TITLEDISPLAY_TARGETS = "Targets";
        DISPLAY_TEXT_ENTERINGBATTLEGROUNDS = "Vous entrez dans le BG";
        DISPLAY_TEXT_LEFTBATTLEGROUNDS = "Vous quittez le BG";
        DISPLAY_TEXT_TIMELEFT = "Temps restant";
        DISPLAY_TEXT_SECONDS = "secondes";
        DISPLAY_TEXT_MINUTES = "minutes";
        DISPLAY_TEXT_NOTENTERINGAFK = "N'entre pas dans le BG pendant que vous \195\170tes ABS";
        DISPLAY_TEXT_FLAGHOLDERNOTCLOSEENOUGH = "Flag Holder not close enough to target.";
        DISPLAY_TEXT_PREEXISTING = "Offered BG instance is pre-existing";
        BATTLEGROUND_GOSSIP_TEXT = "I would like to go to the battleground.";
        MATCHING_MARKED_AFK = "You are now AFK";
        MATCHING_CLEARED_AFK = "You are no longer AFK.";
        FACTION_ALLIANCE = "Alliance";
        FACTION_HORDE = "Horde";
        CLASS_DRUID = "Druide";
        CLASS_HUNTER = "Chasseur";
        CLASS_MAGE = "Mage";
        CLASS_PALADIN = "Paladin"
        CLASS_PRIEST = "Prêtre";
        CLASS_ROGUE = "Voleur";
        CLASS_SHAMAN = "Chaman";
        CLASS_WARRIOR = "Guerrier";
        CLASS_WARLOCK = "Démoniste";
end

if ( GetLocale() == "deDE" ) then
        -- Mail updates to WoWSaien@gmail.com
        -- DISPLAY_xxx variables can be anything you want to display
        -- EVERYTHING ELSE MUST MATCH THE GAME
        BINDING_NAME_BGASSIST_TOGGLE = "BGAssist Fenster ein- oder ausblenden";
        BGAssist_Alterac_Quests = {
                ["Irondeep-Vorr\195\164te"] = true,
                ["Coldtooth-Vorr\195\164te"] = true,
                ["Meister Rysons Allsehendes Auge"] = true,
                ["Verwaiste St\195\164lle"] = true, -- Wolf/Ram turnin
                -- Horde
                ["Mehr Beute!"]                                 = { item= 17422, min=20 },
                ["Lokholar der Eislord"]                        = { item= 17306, max=4 },
                ["Eine Gallone Blut"]                           = { item= 17306, min=5 },
                ["Widderledernes Zaumzeug"]                     = { item= 17642 },
                ["Verteidigung der Darkspear"]                  = { item= 18142 },
                ["Mehr Gnomhaar"]                               = { item= 18143 },
                ["Gesucht: MEHR ZWERGE"]                        = { item= 18206 },
                ["Knochensplitterjagd"]                         = { item= 18144 },
                ["Ruf der L\195\188fte - Guses Luftflotte"]     = { item= 17326 },
                ["Ruf der L\195\188fte - Jeztors Luftflotte"]   = { item= 17327 },
                ["Ruf der L\195\188fte - Mulvericks Luftflotte"]= { item= 17328 },
                -- Alliance
        ["More Armor Scraps"]     = { item = 17422, min=20 },
                ["Ivus der Waldf\195\188rst"]                   = { item = 17423, max=4 },
        ["Crystal Cluster"]     = { item = 17423, min=5 },
        ["Ram Riding Harnesses"]    = { item = 17643 },
        ["What the Hoof?"]     = { item = 18145 },
        ["Staghelm's Mojo Jamboree"]    = { item = 18146 },
                ["Gesucht: MEHR ORCS"]                          = { item = 18207 },
        ["One Man's Love"]     = { item = 18147 },
                ["Ruf der L\195\188fte - Slidores Luftflotte"]  = { item = 17502 },
                ["Ruf der L\195\188fte - Vipores Luftflotte"]   = { item = 17503 },
                ["Ruf der L\195\188fte - Ichmans Luftflotte"]   = { item = 17504 },
        };
        BGAssist_FlagRegexp = {
                ["RESET"] = {   ["regexp"] = "The flags are now placed at their bases." },
                ["PICKED"] = {  ["one"] = "FACTION", ["two"] = "PLAYER",
                                ["regexp"] = "The ([^ ]*) flag was picked up by ([^!]*)!" },
                ["DROPPED"] = { ["one"] = "FACTION", ["two"] = "PLAYER",
                                ["regexp"] = "The ([^ ]*) flag was dropped by ([^!]*)!" },
                ["RETURNED"] ={ ["one"] = "FACTION", ["two"] = "PLAYER",
                                ["regexp"] = "The ([^ ]*) flag was returned to its base by ([^!]*)!" },
                ["CAPTURED"] ={ ["one"] = "PLAYER", ["two"] = "FACTION",
                                ["regexp"] = "([^ ]*) captured the ([^ ]*) flag!" },
        };
        ALTERACVALLEY = "Alteractal";
        WARSONGGULCH = "Warsongschlucht";
        ARATHIBASIN = "Arathi Basin";
        DISPLAY_MENU_LOCKWINDOW = "Fensterposition fixieren";
        DISPLAY_MENU_AUTOSHOW = "Fenster automatisch anzeigen, wenn Schlachtfeld betreten wird";
        DISPLAY_MENU_AUTORELEASE = "Automatisch Geist im Schlachtfeld freilassen";
        DISPLAY_MENU_AUTOQUEST = "Automatisch Schlachtfeld-Quests best\195\164tigen";
        DISPLAY_MENU_AUTOENTER = "Automatisch Schlachtfeld betreten";
        DISPLAY_MENU_TIMERSHOW = "Eroberungs-Timer anzeigen";
        DISPLAY_MENU_ITEMSHOW = "Anzahl der Schlachtfeld-Gegenst\195\164nde anzeigen";
        DISPLAY_MENU_GYCOUNTDOWN = "Timer f\195\188r Wiederbelebung beim Friedhof anzeigen";
        DISPLAY_MENU_FLAGTRACKING = "Track Flags";
        DISPLAY_MENU_TARGETTINGASSISTANCE = "Targetting Assistance Window";
        DISPLAY_MENU_AUTOACCEPTGROUP = "Auto accept group invites in BG";
        DISPLAY_MENU_AUTOLEAVEGROUP = "Auto leave group when leaving BG";
        DISPLAY_MENU_NOPREEXISTING = "No pre-existing instances";
        DISPLAY_TITLEDISPLAY_CAPTURE = "Eroberungen";
        DISPLAY_TITLEDISPLAY_ITEMS   = "Gegenst\195\164nde";
        DISPLAY_TITLEDISPLAY_TARGETS = "Targets";
        DISPLAY_TEXT_CURRENTCOUNT = "Momentane Anzahl";
        DISPLAY_TEXT_ENTERINGBATTLEGROUNDS = "Betrete Schlachtfeld";
        DISPLAY_TEXT_LEFTBATTLEGROUNDS = "Verlasse Schlachtfeld";
        DISPLAY_TEXT_TIMEUNTILREZ = "Zeit bis zur Wiederbelebung";
        DISPLAY_TEXT_TIMELEFT = "Verbleibende Zeit";
        DISPLAY_TEXT_SECONDS = "sekunden";
        DISPLAY_TEXT_MINUTES = "minuten";
        DISPLAY_TEXT_NOTENTERINGAFK = "Betrete das Schlachtfeld nicht, da Ihr AFK seid";
        DISPLAY_TEXT_FLAGHOLDERNOTCLOSEENOUGH = "Flag Holder not close enough to target.";
        DISPLAY_TEXT_PREEXISTING = "Offered BG instance is pre-existing";
        BATTLEGROUND_GOSSIP_TEXT = "I would like to go to the battleground.";
        MATCHING_MARKED_AFK = "You are now AFK";
        MATCHING_CLEARED_AFK = "You are no longer AFK.";
        FACTION_ALLIANCE = "Alliance";
        FACTION_HORDE = "Horde";
        CLASS_DRUID = "Druide";
        CLASS_HUNTER = "J\195\164ger";
        CLASS_MAGE = "Magier";
        CLASS_PALADIN = "Paladin"
        CLASS_PRIEST = "Priester";
        CLASS_ROGUE = "Schurke";
        CLASS_SHAMAN = "Schamane";
        CLASS_WARRIOR = "Krieger";
        CLASS_WARLOCK = "Hexenmeister";
end

-- Is stolen from Interface/GlueXML/CharacterCreate.lua
local CLASS_ICON_TCOORDS = {
        [string.upper(CLASS_WARRIOR)]   = {0, 0.25, 0, 0.25},
        [string.upper(CLASS_MAGE)]      = {0.25, 0.49609375, 0, 0.25},
        [string.upper(CLASS_ROGUE)]     = {0.49609375, 0.7421875, 0, 0.25},
        [string.upper(CLASS_DRUID)]     = {0.7421875, 0.98828125, 0, 0.25},
        [string.upper(CLASS_HUNTER)]    = {0, 0.25, 0.25, 0.5},
        [string.upper(CLASS_PRIEST)]    = {0.49609375, 0.7421875, 0.25, 0.5},
        [string.upper(CLASS_WARLOCK)]   = {0.7421875, 0.98828125, 0.25, 0.5},
        [string.upper(CLASS_SHAMAN)]    = {0.25, 0.49609375, 0.25, 0.5},
        [string.upper(CLASS_PALADIN)]   = {0, 0.25, 0.5, 0.75}
};

local BATTLEFIELD_INDEXES = {
        [1] = ALTERACVALLEY;
        [2] = WARSONGGULCH;
        [3] = ARATHIBASIN;
};

local MAXTIMERS = 6;
local MAXICONS = 10;
local EVENTSINBATTLEGROUND = {
        -- Bag item tracking
        "BAG_UPDATE",
        -- Track into quest windows for autocomplete
        "QUEST_PROGRESS",
        "QUEST_COMPLETE",
        "QUEST_GREETING",
        "QUEST_DETAIL",
        -- "GOSSIP_SHOW",
        -- Autorez
        "AREA_SPIRIT_HEALER_IN_RANGE",
        -- People counting
        "UPDATE_BATTLEFIELD_SCORE",
        -- Chat messages
        "CHAT_MSG_MONSTER_YELL",
        "CHAT_MSG_BG_SYSTEM_NEUTRAL",
        "CHAT_MSG_BG_SYSTEM_ALLIANCE",
        "CHAT_MSG_BG_SYSTEM_HORDE",
        -- Warsaw flag tracking
        "UPDATE_WORLD_STATES",
        -- PARTAHHHH
        "PARTY_INVITE_REQUEST",
        "PARTY_MEMBERS_CHANGED",
        "PARTY_LEADER_CHANGED",
        -- Well duh
        "PLAYER_DEAD",
};

BGAssist_Player = nil; -- global;
local BGAssist_Config_Loaded = nil;
local BGAssist_CountedPlayers = nil;
local BGAssist_Scheduled_MapCheck = nil;
local BGAssist_InBattleGround = nil;
local BGAssist_TimersActive = nil;
local BGAssist_LastTimersProc = 0;
local BGAssist_MapItems = {};
local BGAssist_TrackedItems = {};
local BGAssist_ItemInfo = {};
local BGAssist_RezSyncTime = nil;
local BGAssist_FlagLocs = { };
local BGAssist_LastUpdate = 0;
local BGAssist_MaintainingGroup = nil;
local BGAssist_PreExistingInstances = nil;
local BGAssist_InAFK = nil;

local function BGAssist_LinkDecode(link)
        local id, name;
        _, _, id, name = string.find(link,"|Hitem:(%d+):%d+:%d+:%d+|h%[([^]]+)%]|h|r$");
        -- Only first number of itemid is significant in this.
        if (id and name) then
                id = id * 1;
                return name, id;
        end
end

local function BGAssist_BagCheck()
        local bag, slot, size;
        BGAssist_TrackedItems = {};
        for bag = 0, 4, 1 do
                if (bag == 0) then
                        size = 16;
                else
                        size = GetContainerNumSlots(bag);
                end
                if (size and size > 0) then
                        for slot = 1, size, 1 do
                                local itemLink = GetContainerItemLink(bag,slot);
                                if (itemLink) then
                                        local itemName, itemID = BGAssist_LinkDecode(itemLink);
                                        local texture, itemCount = GetContainerItemInfo(bag,slot);
                                        if (itemID and BGAssist_ItemTrack[itemID]) then
                                                if (not BGAssist_TrackedItems[itemID]) then
                                                        BGAssist_TrackedItems[itemID] = 0;
                                                end
                                                BGAssist_ItemInfo[itemID] = {
                                                        ["name"] = itemName, 
                                                        ["texture"] = texture;
                                                };
                                                BGAssist_TrackedItems[itemID] = BGAssist_TrackedItems[itemID] + itemCount;
                                        end
                                end
                        end
                end
        end
        if (BGAssist_Timers:IsVisible()) then
                BGAssist_Timers_OnShow();
        end
end

local function BGAssist_CheckMap()
        local OUTOFZONEDATA = {
                [1] = { "Dead Guys", "", 3 };
                [2] = { "Bar", "Drink Here", 8};
                [3] = { "Elves Head Point", "ELVES DIE", 11 };
                [4] = { "Monkey", "Monkey", 13 };
        };
        local totallandmarks = GetNumMapLandmarks()
        local name, description, typ, x, y;
        local i;
        for i = 1, totallandmarks, 1 do
                name, description, typ, x, y = GetMapLandmarkInfo(i);
                -- typ:
                -- Alterac Valley
                --  0 = Mines, no icon
                --  1 = Horde controlled mine
                --  2 = Alliance controlled mine
                --  3 = Horde graveyard attacked by Alliance
                --  4 = Towns (Booty Bay, Stonard, etc)
                --  5 = Destroyed tower
                --  6 = 
                --  7 = Uncontrolled Graveyard (Snowfall at start)
                --  8 = Horde tower attacked by Alliance
                --  9 = Horde controlled tower
                -- 10 = Alliance controlled tower
                -- 11 = Alliance tower attacked by Horde
                -- 12 = Horde controlled graveyard
                -- 13 = Alliance graveyard attacked by Horde
                -- 14 = Alliance controlled graveyard
                -- 15 = Garrisons/Caverns, no icon
                -- Arathi Basin
                -- 16 - Gold Mine - Uncontrolled
                -- 17 - Gold Mine .. in conflict (Alliance capturing)
                -- 18 - Gold Mine - Alliance controlled
                -- 19 = Gold Mine .. in conflict (Horde capturing)
                -- 20 = Gold Mine - Horde Controlled
                -- 21 = Lumber Mill - Uncontrolled
                -- 22 = Lumber Mill .. in conflict (Alliance capturing)
                -- 23 = Lumber Mill - Alliance controlled
                -- 24 = Lumber Mill .. in conflict (Horde capturing)
                -- 25 = Lumber Mill - Horde Controlled
                -- 26 = Blacksmith - Uncontrolled
                -- 27 = Blacksmith .. in conflict (Alliance capturing)
                -- 28 = Blacksmith - Alliance controlled
                -- 29 = Blacksmith .. in conflict (Horde capturing)
                -- 30 = Blacksmith - Horde controlled
                -- 31 = Farm - Uncontrolled
                -- 32 = Farm .. in conflict (Alliance capturing)
                -- 33 = Farm - Alliance controlled
                -- 34 = Farm .. in conflict (Horde capturing)
                -- 35 = Farm - Horde controlled
                -- 36 = Stables - Uncontrolled
                -- 37 = Stables .. in conflict (Alliance capturing)
                -- 38 = Stables - Alliance controlled
                -- 39 = Stables .. in conflict (Horde capturing)
                -- 40 = Stables - Horde controlled
                if (not BGAssist_MapItems[name]) then BGAssist_MapItems[name] = {} end
                if (typ == 11 or typ == 13 or typ == 9 or typ == 12 -- AV
                or typ == 20 or typ == 25 or typ == 30 or typ == 35 or typ == 40 -- AB
                or typ == 19 or typ == 24 or typ == 29 or typ == 34 or typ == 39 -- AB captures
                ) then
                        if (BGAssist_MapItems[name].owner ~= "HORDE") then
                                BGAssist_MapItems[name].owner = "HORDE";
                                BGAssist_MapItems[name].conflictstart = nil;
                        end
                elseif (typ == 10 or typ == 3 or typ == 8 or typ == 14 -- AV
                or typ == 18 or typ == 23 or typ == 28 or typ == 33 or typ == 38 -- AB
                or typ == 17 or typ == 22 or typ == 27 or typ == 32 or typ == 37 -- AB captures
                ) then
                        if (BGAssist_MapItems[name].owner ~= "ALLIANCE") then
                                BGAssist_MapItems[name].owner = "ALLIANCE";
                                BGAssist_MapItems[name].conflictstart = nil;
                        end
                elseif (typ == 0 or typ == 5 or typ == 15 -- AV
                        ) then
                        BGAssist_MapItems[name].owner = nil;
                end
                --[[
                if ( typ == 17 or typ == 22 or typ == 27 or typ == 32 or typ == 37 or -- AB
                     typ == 19 or typ == 24 or typ == 29 or typ == 34 or typ == 39 -- AB
                    ) then
                        Debug ("UNKNOWN: ",name," = ",description," = ",typ,": ",BGAssist_MapItems[name].owner); 
                end
                ]]

                if (typ == 3 or typ == 13 or typ == 8 or typ == 11) then -- AV
                        if (not BGAssist_MapItems[name].conflictstart) then
                                BGAssist_MapItems[name].conflictstart = GetTime();
                                BGAssist_MapItems[name].conflictduration = 300;
                        end
                elseif (typ == 17 or typ == 22 or typ == 27 or typ == 32 or typ == 37 or
                        typ == 19 or typ == 24 or typ == 29 or typ == 34 or typ == 39) then
                        if (not BGAssist_MapItems[name].conflictstart) then
                                BGAssist_MapItems[name].conflictstart = GetTime();
                                BGAssist_MapItems[name].conflictduration = 60;
                        end
                else
                        BGAssist_MapItems[name].conflictstart = nil
                end
                if (typ ==  6 or typ > 40) then
                        if (Debug) then Debug ("UNKNOWN: "..name.." = "..description.." = "..typ); end
                end
        end
        if (not BGAssist_Config.timerhide) then
                BGAssist_Timers_OnShow();
        end
end

function BGAssist_CountPlayers()
        local players = GetNumBattlefieldScores();
        if (players > 0) then
                local i;
                BGAssist_CountedPlayers = {
                        ["Horde"] = {
                                ["count"] = 0,
                                [CLASS_DRUID] = 0, [CLASS_HUNTER] = 0, [CLASS_MAGE] = 0,
                                [CLASS_PRIEST] = 0, [CLASS_ROGUE] = 0, [CLASS_SHAMAN] = 0,
                                [CLASS_WARRIOR] = 0, [CLASS_WARLOCK] = 0,
                        }, 
                        ["Alliance"] = {
                                ["count"] = 0,
                                [CLASS_DRUID] = 0, [CLASS_HUNTER] = 0, [CLASS_MAGE] = 0,
                                [CLASS_PALADIN] = 0, [CLASS_PRIEST] = 0, [CLASS_ROGUE] = 0,
                                [CLASS_WARRIOR] = 0, [CLASS_WARLOCK] = 0,
                        }, 
                };

                for i = 1, players, 1 do
                        _, _, _, _, _, faction, _, _, class = GetBattlefieldScore(i);
                        if (faction == 0) then faction = "Horde"; else faction = "Alliance"; end
                        BGAssist_CountedPlayers[faction].count = BGAssist_CountedPlayers[faction].count + 1;
                        BGAssist_CountedPlayers[faction][class] = BGAssist_CountedPlayers[faction][class] + 1;
                end

                local faction = { "Alliance", "Horde" };
                local classes = { CLASS_WARRIOR, CLASS_MAGE, CLASS_ROGUE, CLASS_DRUID, CLASS_HUNTER,
                        CLASS_PRIEST, CLASS_WARLOCK, CLASS_SHAMAN };
                local i, j
                for i = 1, 2, 1 do
                        for j = 1, 8, 1 do
                                if (i == 1 and j == 8) then
                                        getglobal("WorldStateScoreFrame_"..faction[i]..j.."Text"):SetText(CLASS_PALADIN..": "..BGAssist_CountedPlayers[faction[i]][CLASS_PALADIN]);
                                else
                                        getglobal("WorldStateScoreFrame_"..faction[i]..j.."Text"):SetText(classes[j]..": "..BGAssist_CountedPlayers[faction[i]][classes[j]]);
                                end
                        end
                end
        end
end

local function BGAssist_Alterac_SelectQuest(...) 
        local i;
        local idx = 0;
        for i = 1, arg.n, 2 do
                idx = idx + 1;
                if (BGAssist_Alterac_Quests[arg[i]]) then
                        local item, min, max;
                        if (type(BGAssist_Alterac_Quests[arg[i]]) == "table") then
                                item = BGAssist_Alterac_Quests[arg[i]].item;
                                min = BGAssist_Alterac_Quests[arg[i]].min;
                                max = BGAssist_Alterac_Quests[arg[i]].max;
                        else
                                item = true;
                        end
                        if (not min or min < 1) then min = 1; end
                        if (not max) then max = 1000; end
                        local count = BGAssist_TrackedItems[item];
                        if (not count) then count = 0; end
                        if (item == true or (count >= min and count <= max)) then
                                if (not BGAssist_Config[BGAssist_Player].turnins[arg[i]]) then
                                        BGAssist_Config[BGAssist_Player].turnins[arg[i]] = 0;
                                end
                                BGAssist_Config[BGAssist_Player].turnins[arg[i]] = BGAssist_Config[BGAssist_Player].turnins[arg[i]] + min;
                                SelectGossipAvailableQuest(idx);
                        end
                end
        end
end

local function BGAssist_SignUpForBG(...) 
        local i;
        local idx = 0;
        for i = 1, arg.n, 2 do
                idx = idx + 1;
                if (arg[i] == BATTLEGROUND_GOSSIP_TEXT) then
                        SelectGossipOption(idx);
                end
        end
end

local function BGAssist_Alterac_AutoProcess(method)
        if (BGAssist_Alterac_Quests[GetTitleText()]) then
                if (method == "QUEST_COMPLETE") then
                        QuestRewardCompleteButton_OnClick();
                elseif (method == "QUEST_PROGRESS") then
                        QuestProgressCompleteButton_OnClick();
                elseif (method == "QUEST_DETAIL") then
                        QuestDetailAcceptButton_OnClick();
                elseif (Debug) then
                        Debug ("Unknown METHOD: "..method.." for "..GetTitleText());
                end
        end
end

local function BGAssist_ConfigInit()
        if (not BGAssist_Config) then
                BGAssist_Config = {};
        end
        if (not BGAssist_Config[BGAssist_Player]) then
                BGAssist_Config[BGAssist_Player] = {};
        end
        if (not BGAssist_Config[BGAssist_Player].turnins) then
                BGAssist_Config[BGAssist_Player].turnins = {};
        end

        if (BGAssist_InBattleGround == ALTERACVALLEY or BGAssist_InBattleGround == ARATHIBASIN) then
                BGAssist_CheckMap();
        end
        BGAssist_ToggleAutoEntry("ON")
end

function BGAssist_OnLoad()
        this:RegisterEvent("VARIABLES_LOADED");
        this:RegisterEvent("PLAYER_ENTERING_WORLD");
        -- Autoenter
        this:RegisterEvent("BATTLEFIELDS_SHOW");
        this:RegisterEvent("UPDATE_BATTLEFIELD_STATUS");
        this:RegisterEvent("CHAT_MSG_SYSTEM");
        this:RegisterEvent("GOSSIP_SHOW");

        local playerName = UnitName("player");
        if (playerName ~= UKNOWNBEING and playerName ~= UNKNOWNOBJECT) then
                BGAssist_Player = playerName;
        end
end

function BGAssist_OnEvent(event)
        if (event == "VARIABLES_LOADED") then
                BGAssist_Config_Loaded = 1;
                if (BGAssist_Player) then
                        BGAssist_ConfigInit();
                end
        elseif (event == "PLAYER_ENTERING_WORLD") then
                BGAssist_InAFK = nil;
        elseif (event == "CHAT_MSG_SYSTEM") then
                if (string.find(arg1,MATCHING_MARKED_AFK)) then
                        BGAssist_InAFK = true;
                elseif (string.find(arg1,MATCHING_CLEARED_AFK)) then
                        BGAssist_InAFK = nil;
                end
        elseif (event == "BATTLEFIELDS_SHOW") then
                local mapName = GetBattlefieldInfo();
                if (mapName == WARSONGGULCH or mapName == ARATHIBASIN) then
                        BGAssist_PreExistingInstances = {};
                        local numBattlefields = GetNumBattlefields();
                        local i;
                        for i = 1, numBattlefields, 1 do
                                BGAssist_PreExistingInstances[GetBattlefieldInstanceInfo(i)] = GetTime();
                        end
                end
                if (BGAssist_Config.autosignup) then
                        if (((GetNumPartyMembers() > 0) or (GetNumRaidMembers() > 0)) and IsPartyLeader()) then
                                JoinBattlefield(0,1);
                        else
                                JoinBattlefield(0);
                        end
                        HideUIPanel(BattlefieldFrame);
                end
        elseif (event == "UPDATE_BATTLEFIELD_STATUS") then
                local i, status, mapName, instanceID;
                for i = 1, MAX_BATTLEFIELD_QUEUES, 1 do
                        local tmpstatus, tmpmapName, tmpinstanceID = GetBattlefieldStatus(i)
                        if (tmpstatus == "active" or (tmpstatus == "confirm" and not status)) then
                                status = tmpstatus;
                                mapName = tmpmapName;
                                instanceID = tmpinstanceID;
                        end
                end
                if (status=="active") then
                        BGAssist_PreExistingInstances = nil;
                        if (not BGAssist_InBattleGround) then
                                DEFAULT_CHAT_FRAME:AddMessage("BGAssist: "..DISPLAY_TEXT_ENTERINGBATTLEGROUNDS..": "..mapName);
                                BGAssist_RezSyncTime = nil;
                                BGAssist_InBattleGround = mapName;
                                BGAssist_BagCheck();
                                local idx,event;
                                for idx,event in EVENTSINBATTLEGROUND do
                                        BGAssist:RegisterEvent(event);
                                end
                                BGAssist_MaintainingGroup = nil;
                                if (not BGAssist_Config.noautoshow) then
                                        BGAssist_Timers:Show();
                                end
                                if (not BGAssist_Config.notargetwindow) then
                                        BGAssist_Targets:Show();
                                end
                        end
                        if (BGAssist_InBattleGround == WARSONGGULCH) then
                                BGAssist_FlagLocs = { };
                                BGAssist_Flags:Show();
                        end
                        if (BGAssist_InBattleGround == ALTERACVALLEY or BGAssist_InBattleGround == ARATHIBASIN) then
                                BGAssist_CheckMap();
                        end
                elseif (status=="confirm") then
                        --[[
                        local goodtoenter = true;
                        if (((BGAssist_Config.avoidpreexistingwarsong and 
                                mapName == WARSONGGULCH) or
                                (BGAssist_Config.avoidpreexistingarathi and 
                                mapName == ARATHIBASIN )) and
                                BGAssist_PreExistingInstances and 
                                BGAssist_PreExistingInstances[instanceID]) then
                                local timediff = GetTime() - BGAssist_PreExistingInstances[instanceID];
                                if (timediff < 300) then 
                                        goodtoenter = false;
                                        DEFAULT_CHAT_FRAME:AddMessage("BGAssist: "..DISPLAY_TEXT_PREEXISTING);
                                end
                        end
                        if (goodtoenter and not BGAssist_Config.noautoenter) then
                                if (BGAssist_InAFK) then
                                        DEFAULT_CHAT_FRAME:AddMessage("BGAssist: "..DISPLAY_TEXT_NOTENTERINGAFK);
                                elseif (not (UnitIsDead("player") or UnitIsGhost("player"))) then
                                        local status, mapName, instanceID, idx; 
                                        for i = 1, MAX_BATTLEFIELD_QUEUES, 1 do
                                                local tmpstatus, tmpmapName, tmpinstanceID = GetBattlefieldStatus(i);
                                                if (tmpstatus == "confirm") then
                                                        status = tmpstatus;
                                                        mapName = tmpmapName;
                                                        instanceID = tmpinstanceID;
                                                        idx = i;
                                                end
                                        end
                                        if (status) then
                                                StaticPopup_Hide("CONFIRM_BATTLEFIELD_ENTRY", idx);
                                                AcceptBattlefieldPort(idx, 1);
                                        end
                                end
                        end
                        ]]
                elseif (BGAssist_InBattleGround) then
                        BGAssist_Timers:Hide();
                        BGAssist_Flags:Hide();
                        BGAssist_Targets:Hide();
                        BGAssist_MaintainingGroup = nil;
                        DEFAULT_CHAT_FRAME:AddMessage("BGAssist: "..DISPLAY_TEXT_LEFTBATTLEGROUNDS..": "..BGAssist_InBattleGround);
                        BGAssist_InBattleGround = nil;
                        BGAssist_RezSyncTime = nil;
                        if (not BGAssist_Config.noautoleavegroup) then 
                                LeaveParty();
                        end
                        local idx, event;
                        for idx, event in EVENTSINBATTLEGROUND do
                                BGAssist:UnregisterEvent(event);
                        end
                end
        elseif (event == "CHAT_MSG_MONSTER_YELL" or event == "CHAT_MSG_BG_SYSTEM_NEUTRAL" or event == "CHAT_MSG_BG_SYSTEM_ALLIANCE" or event == "CHAT_MSG_BG_SYSTEM_HORDE") then
                if (BGAssist_InBattleGround == ALTERACVALLEY or BGAssist_InBattleGround == ARATHIBASIN) then
                        BGAssist_Scheduled_MapCheck = GetTime()+0.1;
                elseif (BGAssist_InBattleGround == WARSONGGULCH) then
                        BGAssist_LocateFlags(arg1);
                end
        elseif (event == "BAG_UPDATE") then
                if (BGAssist_InBattleGround == ALTERACVALLEY) then
                        BGAssist_BagCheck();
                end
        elseif (event == "AREA_SPIRIT_HEALER_IN_RANGE") then
                BGAssist_RezSyncTime = GetTime() + GetAreaSpiritHealerTime();
        -- elseif (event == "QUEST_PROGRESS" or event == "QUEST_COMPLETE" or event == "QUEST_GREETING" or event == "QUEST_DETAIL") then
        elseif (event == "QUEST_PROGRESS" or event == "QUEST_COMPLETE" or event == "QUEST_DETAIL") then
                if (not BGAssist_Config.noautoquest and BGAssist_InBattleGround == ALTERACVALLEY) then
                        BGAssist_Alterac_AutoProcess(event);
                end
        elseif (event == "GOSSIP_SHOW") then
                if (not BGAssist_InBattleGround and BGAssist_Config.autosignup) then
                        BGAssist_SignUpForBG(GetGossipOptions());
                elseif (not BGAssist_Config.noautoquest and BGAssist_InBattleGround == ALTERACVALLEY) then
                        BGAssist_Alterac_SelectQuest(GetGossipAvailableQuests());
                end
        elseif (event == "PLAYER_DEAD") then
                if (BGAssist_Config.autorelease) then
                        StaticPopup_Hide("DEATH");
                        RepopMe();
                end
        elseif (event == "UPDATE_BATTLEFIELD_SCORE") then
                if (GetBattlefieldWinner() and not BGAssist_Config.noautoleavegroup) then 
                        LeaveParty();
                end
                BGAssist_CountPlayers();
        elseif (event == "UPDATE_WORLD_STATES") then
                if (BGAssist_InBattleGround == WARSONGGULCH) then
                        BGAssist_WSGFlags_OnShow();
                end
        elseif (event == "PARTY_INVITE_REQUEST") then
                if (not BGAssist_Config.noacceptgroups) then 
                        AcceptGroup();
                        StaticPopupDialogs["PARTY_INVITE"].inviteAccepted = 1;
                        StaticPopup_Hide("PARTY_INVITE");
                end
        elseif (event == "PARTY_MEMBER_CHANGED" or event == "PARTY_LEADER_CHANGED") then
                if (GetNumRaidMembers() == 0) then
                        if (Debug) then Debug ("BGAssist: Party: ",event," PARTY: ",GetNumPartyMembers(),"  RAID: ",GetNumRaidMembers(), " MAINTAINING: ",BGAssist_MaintainingGroup," LEADER: ",IsPartyLeader()); end
                end
                if ((GetNumPartyMembers() > 0 or GetNumRaidMembers() > 0) and BGAssist_MaintainingGroup) then
                        if (GetNumRaidMembers() > 0) then
                                if (IsRaidLeader()) then
                                else
                                        BGAssist_MaintainingGroup = nil;
                                end
                        elseif (IsPartyLeader()) then
                                ConvertToRaid();
                        else
                                BGAssist_MaintainingGroup = nil;
                        end
                else
                        BGAssist_MaintainingGroup = nil;
                end
        end
end

function BGAssist_OnUpdate()
        local time = GetTime();
        if (BGAssist_Scheduled_MapCheck and BGAssist_Scheduled_MapCheck <= time) then
                BGAssist_Scheduled_MapCheck = nil;
                BGAssist_CheckMap();
        end
end

function BGAssist_Timers_OnUpdate(elapsed)
        local time = GetTime();
        local starttimer = 1;
        if (BGAssist_Config.showgycountdown) then
                local timerobj = getglobal("BGAssist_Timers1");
                if (timerobj.name == "Graveyard") then
                        if (BGAssist_RezSyncTime) then
                                local timeleft = BGAssist_RezSyncTime-GetTime();
                                while (timeleft < 0) do
                                        BGAssist_RezSyncTime = BGAssist_RezSyncTime + 30;
                                        timeleft = math.floor(BGAssist_RezSyncTime-GetTime());
                                end
                                timerobj:SetValue(timeleft);
                        else
                                timerobj:SetValue(30);
                        end
                        starttimer = 2;
                end
        end

        if (BGAssist_TimersActive) then
                if (BGAssist_TimersActive <= time) then
                        BGAssist_UpdateTimers();
                else
                        if (BGAssist_LastTimersProc+1 < time) then
                                local i;
                                for i = starttimer, MAXTIMERS, 1 do
                                        local timer = getglobal("BGAssist_Timers"..i);
                                        if (timer.endtime) then
                                                local timeleft = timer.endtime - time;
                                                timer:SetValue(timeleft);
                                        end
                                end
                                BGAssist_LastTimersProc = time;
                        end
                end
                if (this.updateTooltip) then
                        this.updateTooltip = this.updateTooltip - elapsed;
                        if (this.updateTooltip < 0) then
                                BGAssist_Timer_SetTooltip(this.tooltipUpdate);
                        end
                end
        end
end

function BGAssist_DynamicResize()
        local i;
        local maxtimer = 0;
        local maxicon = 0;
        for i = 1, MAXICONS, 1 do
                local icon = getglobal("BGAssist_Timers_Icon"..i);
                if (icon:IsVisible()) then maxicon = i; end
        end
        for i = 1, MAXTIMERS, 1 do
                local timerobj = getglobal("BGAssist_Timers"..i);
                if (timerobj:IsVisible()) then maxtimer = i; end;
        end

        if (BGAssist_Config.timerhide) then maxtimer = 0; end
        if (BGAssist_Config.itemhide or BGAssist_InBattleGround ~= ALTERACVALLEY) then maxicon = 0; end

        -- Move Icons to under last timer
        if (maxicon and maxicon > 0) then
                BGAssist_Timers_Icon1:ClearAllPoints();
                if (maxtimer == 0) then
                        BGAssist_Timers_Icon1:SetPoint("TOPLEFT","BGAssist_Timers","TOPLEFT",6,-8);
                else
                        BGAssist_Timers_Icon1:SetPoint("TOPLEFT","BGAssist_Timers"..maxtimer,"BOTTOMLEFT",0,-6);
                end
        end
        local iconwidth = 36;
        local iconheight = 36;
        if (maxicon and maxicon > 3) then
                if (maxicon > 4) then
                        iconwidth = 24;
                else
                        iconwidth = 30;
                end
                if (maxicon > 5) then
                        iconheight = 18;
                end
        end
        for i = 1, MAXICONS, 1 do
                local icon = getglobal("BGAssist_Timers_Icon"..i);
                local texture = getglobal("BGAssist_Timers_Icon"..i.."NormalTexture");
                icon:SetWidth(iconwidth);
                icon:SetHeight(iconheight);
                texture:SetWidth(iconwidth*2);
                texture:SetHeight(iconheight*2);
        end
        local backdropheight = 16; -- Buffer at top and bottom and room for border
        backdropheight = backdropheight + (maxtimer*12);
        if (maxicon > 0 and maxtimer > 0) then backdropheight = backdropheight + 3; end
        if (maxicon > 5) then 
                backdropheight = backdropheight + (iconheight*2) + 3;
        elseif (maxicon > 0) then
                backdropheight = backdropheight + iconheight;
        end
        BGAssist_Timers:SetHeight(backdropheight);
end

function BGAssist_Timers_OnShow()
        UIDropDownMenu_Initialize(BGAssist_Timers_Menu, BGAssist_MenuDropDown_Initialize, "MENU");
        
        BGAssist_UpdateTimers();
        BGAssist_UpdateItems();
        if (BGAssist_Timers2:IsVisible() or (BGAssist_Timers1:IsVisible() and BGAssist_Config.showgycountdown)) then
                BGAssist_Timers_TitleText:SetText(DISPLAY_TITLEDISPLAY_CAPTURE);
        else
                if (BGAssist_Timers_Icon1:IsVisible()) then
                        BGAssist_Timers_TitleText:SetText(DISPLAY_TITLEDISPLAY_ITEMS);
                else
                        BGAssist_Timers_TitleText:SetText("BGAssist");
                end
        end
        BGAssist_DynamicResize();
end

function BGAssist_UpdateItems()
        local function findicon (item)
                local idx = 1;
                local found = 0;
                while (found == 0 and idx <= MAXICONS) do
                        local icon = getglobal("BGAssist_Timers_Icon"..idx);
                        if (icon and icon.item and icon.item == item) then
                                found = idx;
                        end
                        idx = idx + 1;
                end
                return found;
        end
        local function fillicon (item, num)
                local icon = getglobal("BGAssist_Timers_Icon"..num);
                if (icon) then
                        icon.item = item;
                        icon:Show();
                        getglobal("BGAssist_Timers_Icon"..num.."Icon"):SetTexture(BGAssist_ItemInfo[item].texture);
                end
        end

        local showitems = {};
        local maxicon = 0;
        if (not BGAssist_Config.itemhide and BGAssist_InBattleGround == ALTERACVALLEY and BGAssist_TrackedItems and BGAssist_TrackedItems ~= {}) then
                local item;
                for item in BGAssist_TrackedItems do
                        if (BGAssist_TrackedItems[item] > 0) then
                                showitems[item] = findicon(item);
                        end
                end
                for item in showitems do
                        local idx = 1;
                        if (showitems[item] == 0) then
                                while (showitems[item] == 0 and idx <= MAXICONS) do
                                        local icon = getglobal("BGAssist_Timers_Icon"..idx);
                                        if (icon and not icon.item) then
                                                showitems[item] = idx;
                                        end
                                        idx = idx + 1;
                                end
                        end
                        if (showitems[item] > maxicon) then maxicon = showitems[item]; end
                        fillicon (item, showitems[item])
                end
                local i;
                for i = 1, MAXICONS, 1 do
                        local icon = getglobal("BGAssist_Timers_Icon"..i);
                        if (not icon.item or not BGAssist_TrackedItems[icon.item] or BGAssist_TrackedItems[icon.item] < 1) then
                                if (i < maxicon) then
                                        local j = i+1;
                                        local jicon = getglobal("BGAssist_Timers_Icon"..j);
                                        while (j <= MAXICONS and not jicon.item) do
                                                jicon = getglobal("BGAssist_Timers_Icon"..j);
                                                j = j + 1;
                                        end
                                        if (jicon.item) then
                                                fillicon (jicon.item, j-1);
                                                jicon.item = nil;
                                        end
                                else
                                        icon.item = nil;
                                        icon:Hide();
                                end
                        end
                end
        else
                local i;
                for i = 1, MAXICONS, 1 do
                        local icon = getglobal("BGAssist_Timers_Icon"..i);
                        icon:Hide();
                        icon.item = nil;
                end
        end
end

function BGAssist_UpdateTimers()

        local function sort_function (a, b) 
                local endtime= BGAssist_MapItems[a].conflictstart + BGAssist_MapItems[a].conflictduration;
                local atime = endtime - GetTime();
                endtime= BGAssist_MapItems[b].conflictstart + BGAssist_MapItems[b].conflictduration;
                local btime = endtime - GetTime();
                if (atime < btime) then return true; else return false; end
        end

        local starttimer = 1;
        local i, status, mapName, instanceID;
        for i = 1, MAX_BATTLEFIELD_QUEUES, 1 do
                local tmpstatus, tmpmapName, tmpinstanceID = GetBattlefieldStatus(i);
                if (tmpstatus == "active") then
                        status = tmpstatus;
                        mapName = tmpmapName;
                        instanceID = tmpinstanceID;
                end
        end
        if (BGAssist_Config.showgycountdown) then
                local timerobj = getglobal("BGAssist_Timers1");
                local text = getglobal("BGAssist_Timers1Text");
                timerobj.name = "Graveyard";
                timerobj:Show();
                timerobj:SetStatusBarColor (0, 1, 0);
                timerobj:SetMinMaxValues(0,30);
                if (BGAssist_RezSyncTime) then
                        local timeleft = math.floor(BGAssist_RezSyncTime-GetTime());
                        while (timeleft < 0) do
                                BGAssist_RezSyncTime = BGAssist_RezSyncTime + 30;
                                timeleft = math.floor(BGAssist_RezSyncTime-GetTime());
                        end
                        timerobj:SetValue(timeleft);
                else
                        timerobj:SetValue(30);
                end
                text:Show();
                text:SetText("Graveyard");
                starttimer = 2;
        end
        if (not BGAssist_Config.timerhide and status == "active") then
                if (BGAssist_MapItems == nil or BGAssist_MapItems == {}) then
                        BGAssist_CheckMap();
                        if (BGAssist_MapItems == nil or BGAssist_MapItems == {}) then
                                return;
                        end
                end
                local conflicts = {};
                local conflictcount = 0;
                local red, green, blue;
                local name;
                for name in BGAssist_MapItems do
                        if (BGAssist_MapItems[name].conflictstart or (BGAssist_Config.showcapturedflags and BGAssist_InBattleGround == ARATHIBASIN)) then
                                local endtime = BGAssist_MapItems[name].conflictstart + BGAssist_MapItems[name].conflictduration;
                                local timeleft = endtime - GetTime();
                                if (timeleft > 0 or (BGAssist_Config.showcapturedflags and BGAssist_InBattleGround == ARATHIBASIN)) then
                                        conflictcount = conflictcount + 1;
                                        conflicts[conflictcount] = name;
                                end
                        end
                end
                table.sort(conflicts, sort_function);
                local timer = starttimer;
                local idx = 1;
                while (timer <= MAXTIMERS and conflicts[idx]) do
                        local timerobj = getglobal("BGAssist_Timers"..timer);
                        local text = getglobal("BGAssist_Timers"..timer.."Text");
                        red = 0; green = 0; blue = 0;
                        if (BGAssist_MapItems[conflicts[idx]].owner == "HORDE") then
                                red = 1;
                        elseif (BGAssist_MapItems[conflicts[idx]].owner == "ALLIANCE") then
                                green = 1; blue = 1;
                        elseif (not BGAssist_MapItems[conflicts[idx]].owner) then
                                -- Should only be when capturing neutral in AB at start
                                red = 0.862; green = 0.862; blue = 0.862;
                        end
                        local endtime= BGAssist_MapItems[conflicts[idx]].conflictstart + 
                                BGAssist_MapItems[conflicts[idx]].conflictduration;
                        local timeleft = endtime - GetTime();
                        if (timeleft < 1) then
                                BGAssist_Scheduled_MapCheck = GetTime()+1; 
                                BGAssist_MapItems[conflicts[idx]].conflictstart = nil;
                        end
                        if (not BGAssist_TimersActive or endtime < BGAssist_TimersActive) then
                                BGAssist_TimersActive = endtime;
                        end
                        timerobj.name = conflicts[idx];
                        timerobj.endtime = endtime;
                        timerobj:Show();
                        timerobj:SetStatusBarColor (red, green, blue);
                        if (BGAssist_InBattleGround == ALTERACVALLEY) then
                                timerobj:SetMinMaxValues(0,300);
                        elseif (BGAssist_InBattleGround == ARATHIBASIN) then
                                timerobj:SetMinMaxValues(0,60);
                        elseif (Debug) then
                                Debug ("INVALID ZONE: ",BGAssist_InBattleGround);
                        end
                        timerobj:SetValue(timeleft);
                        text:Show();
                        -- local sidx = string.find(conflicts[idx]," ");
                        -- if (sidx) then
                        --      text:SetText(string.sub(conflicts[idx],1,sidx-1));
                        -- else
                                text:SetText(conflicts[idx]);
                        -- end
                        idx = idx + 1;
                        timer = timer + 1;
                end
                while (timer <= MAXTIMERS) do
                        local timerobj = getglobal("BGAssist_Timers"..timer);
                        local text = getglobal("BGAssist_Timers"..timer.."Text");
                        timerobj.name = nil;
                        timerobj.endtime = nil;
                        timerobj:Hide();
                        text:SetText("");
                        text:Hide();
                        timer = timer + 1;
                end
        else
                for timer = starttimer, MAXTIMERS, 1 do
                        local timerobj = getglobal("BGAssist_Timers"..timer);
                        local text = getglobal("BGAssist_Timers"..timer.."Text");
                        timerobj:Hide();
                        text:Hide();
                end
        end
end

function BGAssist_TimersTitle_OnClick(button)
        if (arg1 == "RightButton") then
                ToggleDropDownMenu(1, nil, BGAssist_Timers_Menu, "BGAssist_Timers_Menu", 0, 50);
        else
                if (this:GetButtonState() == "PUSHED") then
                        this:GetParent():StopMovingOrSizing();
                elseif (not BGAssist_Config.windowlocked) then
                        this:GetParent():StartMoving();
                end
        end
end

function BGAssist_Timer_SetTooltip(override)
        if (not override) then
                override = this;
        end
        local txt;
        local timeleft;
        if (override.name == "Graveyard") then
                txt = DISPLAY_TEXT_TIMEUNTILREZ;
                if (BGAssist_RezSyncTime) then
                        timeleft = math.floor(BGAssist_RezSyncTime-GetTime());
                else
                        timeleft = 30;
                end
        elseif (override.name and override.endtime) then
                
                txt = override.name;
                timeleft = math.floor(override.endtime - GetTime());
        end
        if (txt and timeleft) then
                txt = txt.."\n"..DISPLAY_TEXT_TIMELEFT..": "..timeleft.." "..DISPLAY_TEXT_SECONDS..".";
                if (timeleft > 60) then
                        txt = txt.."\n("..(math.floor(timeleft/6)/10).." "..DISPLAY_TEXT_MINUTES..")";
                end
                BGAssist_Timers.updateTooltip = TOOLTIP_UPDATE_TIME;
                BGAssist_Timers.tooltipUpdate = override;
                local left = override:GetLeft();
                if (left > 800) then
                        GameTooltip:SetOwner(override, "ANCHOR_LEFT");
                else
                        GameTooltip:SetOwner(override, "ANCHOR_RIGHT");
                end
                GameTooltip:SetText(txt);
        end
end

function BGAssist_Item_SetTooltip()
        if (this.item and BGAssist_ItemInfo[this.item] and BGAssist_ItemInfo[this.item].name) then
                local txt = BGAssist_ItemInfo[this.item].name.."\nCurrent Count: "..BGAssist_TrackedItems[this.item];
                local left = this:GetLeft();
                if (left > 800) then
                        GameTooltip:SetOwner(this, "ANCHOR_LEFT");
                else
                        GameTooltip:SetOwner(this, "ANCHOR_RIGHT");
                end
                GameTooltip:SetText(txt);
        end
end

function BGAssist_MenuDropDown_CheckedToggle()
        local mapping = {
                [DISPLAY_MENU_LOCKWINDOW] = "windowlocked",
                [DISPLAY_MENU_AUTOSHOW] = "noautoshow",
                [DISPLAY_MENU_AUTORELEASE] = "autorelease",
                [DISPLAY_MENU_AUTOQUEST] = "noautoquest",
                [DISPLAY_MENU_AUTOENTER] = "noautoenter",
                [DISPLAY_MENU_TIMERSHOW] = "timerhide",
                [DISPLAY_MENU_ITEMSHOW] = "itemhide",
                [DISPLAY_MENU_GYCOUNTDOWN] = "showgycountdown",
                [DISPLAY_MENU_FLAGTRACKING] = "noflags",
                [DISPLAY_MENU_TARGETTINGASSISTANCE] = "notargetwindow",
                [DISPLAY_MENU_AUTOACCEPTGROUP] = "noacceptgroups",
                [DISPLAY_MENU_AUTOLEAVEGROUP] = "noautoleavegroup",
                [DISPLAY_MENU_NOPREEXISTING] = "avoidpreexistingwarsong";
                [DISPLAY_MENU_SHOWCAPTUREDFLAGS] = "showcapturedflags";
                [DISPLAY_MENU_AUTOSIGNUP] = "autosignup";
        };
        if (UIDROPDOWNMENU_MENU_VALUE == ALTERACVALLEY) then
        elseif (UIDROPDOWNMENU_MENU_VALUE == ARATHIBASIN) then
                mapping[DISPLAY_MENU_NOPREEXISTING] = "avoidpreexistingarathi";
        end
        local confoption = mapping[this.value];
        if (confoption) then
                if (BGAssist_Config[confoption]) then
                        BGAssist_Config[confoption] = nil;
                else
                        BGAssist_Config[confoption] = true;
                end
                if (BGAssist_Config.notargetwindow) then
                        BGAssist_Targets:Hide();
                elseif (BGAssist_InBattleGround) then
                        BGAssist_Targets:Show();
                end
                BGAssist_Timers_OnShow();
        end
end

function BGAssist_MenuDropDown_Initialize()
        local info = {};

        if (UIDROPDOWNMENU_MENU_LEVEL == 2) then
                info.func = BGAssist_MenuDropDown_CheckedToggle;

                if (UIDROPDOWNMENU_MENU_VALUE == ALTERACVALLEY) then
                        info.text = DISPLAY_MENU_TIMERSHOW;
                        info.checked = nil;
                        if (not BGAssist_Config.timerhide) then info.checked = 1; end
                        UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);

                        info.text = DISPLAY_MENU_AUTOQUEST;
                        info.checked = nil;
                        if (not BGAssist_Config.noautoquest) then info.checked = 1; end
                        UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);

                        info.text = DISPLAY_MENU_ITEMSHOW;
                        info.checked = nil;
                        if (not BGAssist_Config.itemhide) then info.checked = 1; end
                        UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
                elseif (UIDROPDOWNMENU_MENU_VALUE == WARSONGGULCH) then
                        info.text = DISPLAY_MENU_FLAGTRACKING;
                        info.checked = nil;
                        if (not BGAssist_Config.noflags) then info.checked = 1; end
                        UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);

                        info.text = DISPLAY_MENU_NOPREEXISTING;
                        info.checked = nil;
                        if (BGAssist_Config.avoidpreexistingwarsong) then info.checked = 1; end
                        UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
                elseif (UIDROPDOWNMENU_MENU_VALUE == ARATHIBASIN) then
                        info.text = DISPLAY_MENU_NOPREEXISTING;
                        info.checked = nil;
                        if (BGAssist_Config.avoidpreexistingarathi) then info.checked = 1; end
                        UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);

                        info.text = DISPLAY_MENU_SHOWCAPTUREDFLAGS;
                        info.checked = nil;
                        if (BGAssist_Config.showcapturedflags) then info.checked = 1; end
                        UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
                end
        else
                info.isTitle = true;
                info.text = "BGAssist "..BGASSIST_VERSION;
                UIDropDownMenu_AddButton(info);

                info = {};
                info.hasArrow = 1;
                info.notCheckable = 1;

                info.text = ALTERACVALLEY;
                UIDropDownMenu_AddButton(info);

                info.text = WARSONGGULCH;
                UIDropDownMenu_AddButton(info);

                info.text = ARATHIBASIN;
                UIDropDownMenu_AddButton(info);

                info = {};
                info.func = BGAssist_MenuDropDown_CheckedToggle;

                info.text = DISPLAY_MENU_LOCKWINDOW;
                info.checked = nil;
                if (BGAssist_Config.windowlocked) then info.checked = 1; end
                UIDropDownMenu_AddButton(info);

                info.text = DISPLAY_MENU_AUTOSHOW;
                info.checked = nil;
                if (not BGAssist_Config.noautoshow) then info.checked = 1; end
                UIDropDownMenu_AddButton(info);

                info.text = DISPLAY_MENU_AUTORELEASE;
                info.checked = nil;
                if (BGAssist_Config.autorelease) then info.checked = 1; end
                UIDropDownMenu_AddButton(info);

                info.text = DISPLAY_MENU_AUTOENTER;
                info.checked = nil;
                if (not BGAssist_Config.noautoenter) then info.checked = 1; end
                UIDropDownMenu_AddButton(info);
                
                info.text = DISPLAY_MENU_AUTOSIGNUP;
                info.checked = nil;
                if (BGAssist_Config.autosignup) then info.checked = 1; end
                UIDropDownMenu_AddButton(info);
                
                info.text = DISPLAY_MENU_GYCOUNTDOWN;
                info.checked = nil;
                if (BGAssist_Config.showgycountdown) then info.checked = 1; end
                UIDropDownMenu_AddButton(info);

                info.text = DISPLAY_MENU_TARGETTINGASSISTANCE;
                info.checked = nil;
                if (not BGAssist_Config.notargetwindow) then info.checked = 1; end
                UIDropDownMenu_AddButton(info);

                info.text = DISPLAY_MENU_AUTOACCEPTGROUP;
                info.checked = nil;
                if (not BGAssist_Config.noacceptgroups) then info.checked = 1; end
                UIDropDownMenu_AddButton(info);

                info.text = DISPLAY_MENU_AUTOLEAVEGROUP;
                info.checked = nil;
                if (not BGAssist_Config.noautoleavegroup) then info.checked = 1; end
                UIDropDownMenu_AddButton(info);
        end
end

function BGAssist_LocateFlags(chatmsg)
        local idx, event, faction, player;
        for idx in BGAssist_FlagRegexp do
                local start, _, one, two = string.find (chatmsg,BGAssist_FlagRegexp[idx].regexp);
                if (start) then
                        event = idx;
                        player = nil;
                        faction = nil;
                        if (BGAssist_FlagRegexp[event].one == "PLAYER") then player = one; end
                        if (BGAssist_FlagRegexp[event].one == "FACTION") then faction = one; end
                        if (BGAssist_FlagRegexp[event].two == "PLAYER") then player = two; end
                        if (BGAssist_FlagRegexp[event].two == "FACTION") then faction = two; end
                end
        end
        -- The text is reversed
        if (faction == FACTION_HORDE) then 
                faction = "Alliance"; 
        elseif (faction == FACTION_ALLIANCE) then 
                faction = "Horde"; 
        end
        --[[
        if (event) then
                if (player and faction) then
                        Debug ("EVENT: "..event.." for "..player.." at "..faction);
                else
                        Debug ("EVENT: "..event);
                end
        else
                Debug ("NO EVENT: "..chatmsg);
        end
        ]]
        if (event == "RESET") then 
                BGAssist_FlagLocs = { }; 
        elseif (event == "PICKED") then 
                BGAssist_FlagLocs[faction] = player;
        elseif (event == "DROPPED" or event == "RETURNED" or event == "CAPTURED") then 
                BGAssist_FlagLocs[faction] = nil;
        end

        BGAssist_WSGFlags_OnShow();
end

function BGAssist_ToggleWindow()
        if (BGAssist_Timers:IsVisible()) then
                BGAssist_Timers:Hide();
        else
                BGAssist_Timers:Show();
        end
end

function BGAssist_WSGFlags_OnShow()
        local stateidx = { "Alliance", "Horde" };
        local i;
        if (not BGAssist_Config.noflags) then
                for i = 1, 2, 1 do
                        local text, icon, isFlashing = GetWorldStateUIInfo(i);
                        local displayobj = getglobal ("BGAssist_Flags_"..stateidx[i].."_Text");
                        if (not isFlashing) then 
                                displayobj:SetText("");
                        elseif (BGAssist_FlagLocs[stateidx[i]]) then
                                displayobj:SetText(BGAssist_FlagLocs[stateidx[i]]);
                        else
                                displayobj:SetText("(Unknown)");
                        end
                end
        else
                for i = 1, 2, 1 do
                        local displayobj = getglobal ("BGAssist_Flags_"..stateidx[i].."_Text");
                        displayobj:SetText("");
                end
        end
end

function BGAssist_Flags_OnClick(override)
        if (not override) then override = this; end
        local stateidx = { ["Alliance"] = 1, ["Horde"] = 2 };
        local _, _, isFlashing = GetWorldStateUIInfo(stateidx[override.faction]);
        if (isFlashing and BGAssist_FlagLocs[override.faction]) then
                TargetByName(BGAssist_FlagLocs[override.faction]);
                if (UnitName("target") ~= BGAssist_FlagLocs[override.faction]) then
                        ClearTarget();
                        DEFAULT_CHAT_FRAME:AddMessage("BGAssist: "..DISPLAY_TEXT_FLAGHOLDERNOTCLOSEENOUGH);
                end
        end
end

local function BGAssist_UpdateTargets()
        local idx;
        local unit;
        local targets = {};
        local targetcounts = {};
        local targetidx = 0;

        local function sort_function (a,b)
                if (targetcounts[a.name] > targetcounts[b.name]) then 
                        return true;
                elseif (targetcounts[a.name] < targetcounts[b.name]) then 
                        return false;
                --[[
                elseif (a.distance > b.distance) then 
                        return true;
                elseif (a.distance < b.distance) then 
                        return false;
                ]]
                elseif (a.name < b.name) then 
                        return true; 
                else 
                        return false; 
                end
        end

        local max = 40;
        if (BGAssist_InBattleGround == WARSONGGULCH) then max = 10; end

        for idx = 1, max, 1 do
                unit = "raid"..idx.."target";
                if (UnitName(unit) and UnitCanAttack("player",unit)) then
                        targetidx = targetidx + 1;
                        local px,py = GetPlayerMapPosition("player");
                        local tx,ty = GetPlayerMapPosition("raid"..idx);
                        local xdist = tx-px;
                        local ydist = ty-py;
                        local dist = sqrt(math.pow(xdist,2)+math.pow(ydist,2));
                        targets[targetidx] = { 
                                ["name"] = UnitName(unit);
                                ["class"] = UnitClass(unit);
                                ["unit"] = unit;
                                ["distance"] = dist;
                        };
                        if (not targetcounts[UnitName(unit)]) then
                                targetcounts[UnitName(unit)] = 0;
                        end
                        targetcounts[UnitName(unit)] = targetcounts[UnitName(unit)] + 1;
                end
        end
        if (UnitName("target") and UnitCanAttack("player","target")) then
                targetidx = targetidx + 1;
                targets[targetidx] = { 
                        ["name"] = UnitName("target");
                        ["class"] = UnitClass(unit);
                        ["unit"] = "target";
                        ["distance"] = 0;
                };
                if (not targetcounts[UnitName("target")]) then
                        targetcounts[UnitName("target")] = 0;
                end
                targetcounts[UnitName("target")] = targetcounts[UnitName("target")] + 1;
        end
        table.sort (targets, sort_function);

        local lasttarget = nil;
        local targetidx = 1;
        for idx = 1, table.getn(targets), 1 do
                if (targetidx < 10 and not UnitIsDead(targets[idx].unit) and targets[idx].name ~= lasttarget) then
                        local targetobj = getglobal("BGAssist_Targets"..targetidx);
                        local targettxt = getglobal("BGAssist_Targets"..targetidx.."_Text");
                        local targethealth = getglobal("BGAssist_Targets"..targetidx.."_Bar_Health");
                        local iconobj = getglobal("BGAssist_Targets"..targetidx.."_Class");

                        lasttarget = targets[idx].name;
                        targetobj.name = targets[idx].name;
                        targetobj.unit = targets[idx].unit;
                        if (targets[idx].class) then
                                targetobj.class = string.upper(targets[idx].class);
                                local coords = CLASS_ICON_TCOORDS[targetobj.class];
                                iconobj:SetTexCoord(coords[1], coords[2], coords[3], coords[4]);
                                iconobj:Show();
                        else
                                targetobj.class = nil;
                                iconobj:Hide();
                        end
                        -- targettxt:SetText(targetcounts[targets[idx].name].." ("..targets[idx].distance..") = "..targets[idx].name);
                        targettxt:SetText(targets[idx].name);
                        local health = UnitHealth(targets[idx].unit);
                        local maxhealth = UnitHealthMax(targets[idx].unit);
                        if (maxhealth ~= 100) then
                                health = math.floor(health/maxhealth*100);
                        end
                        targethealth:SetValue(health);
                        targetobj:Show();
                        targetidx = targetidx + 1;
                end
        end
        for idx = targetidx, 10, 1 do
                local targetobj = getglobal("BGAssist_Targets"..idx);
                targetobj:Hide();
                targetobj.name = nil;
                targetobj.unit = nil;
                targetobj.class = nil;
                --[[
                targetobj:Show(); 
                local targettxt = getglobal("BGAssist_Targets"..idx.."_Text");
                targettxt:SetText("SpankingMonkeyAss");
                local coords = CLASS_ICON_TCOORDS["SHAMAN"];
                local iconobj = getglobal("BGAssist_Targets"..idx.."_Class");
                iconobj:SetTexCoord(coords[1], coords[2], coords[3], coords[4]);
                ]]
        end
end

function BGAssist_Targets_OnUpdate(elapsed)
        BGAssist_LastUpdate = BGAssist_LastUpdate+elapsed;
        if (BGAssist_LastUpdate > 0.1) then
                BGAssist_LastUpdate = 0;        
                BGAssist_UpdateTargets();
        end
end

function BGAssist_TargetMenuDropDown_Initialize()
        local info = {};

        if (UIDROPDOWNMENU_MENU_LEVEL == 2) then
        else
                info.isTitle = true;
                info.text = "BGAssist "..BGASSIST_VERSION;
                UIDropDownMenu_AddButton(info);

                info = {};
                info.func = BGAssist_MenuDropDown_CheckedToggle;

                info.text = DISPLAY_MENU_LOCKWINDOW;
                info.checked = nil;
                if (BGAssist_Config.windowlocked) then info.checked = 1; end
                UIDropDownMenu_AddButton(info);
        end
end

function BGAssist_Targets_OnShow()
        UIDropDownMenu_Initialize(BGAssist_Targets_Menu, BGAssist_TargetMenuDropDown_Initialize, "MENU");
        getglobal(this:GetName().."_TitleText"):SetText(DISPLAY_TITLEDISPLAY_TARGETS);
        BGAssist_UpdateTargets();
end

function BGAssist_TargetsTitle_OnClick()
        if (arg1 == "RightButton") then
                ToggleDropDownMenu(1, nil, BGAssist_Targets_Menu, "BGAssist_Targets_Menu", 0, 50);
        else
                if (this:GetButtonState() == "PUSHED") then
                        this:GetParent():StopMovingOrSizing();
                elseif (not BGAssist_Config.windowlocked) then
                        this:GetParent():StartMoving();
                end
        end
end

function BGAssist_Target_OnClick()
        local unit = this:GetParent().unit;
        local name = this:GetParent().name;
        if (unit and name and UnitName(unit) == name) then
                if (SpellIsTargeting()) then
                        SpellTargetUnit(unit);
                else
                        TargetUnit(unit);
                end
        elseif (name) then
                TargetByName(name); 
        end
end

function BGAssist_ClassBreakdown_OnLoad()
        WorldStateScoreFrame_Alliance1:ClearAllPoints();
        WorldStateScoreFrame_Alliance1:SetPoint("TOPRIGHT","WorldStateScoreFrame_Alliance","TOPRIGHT",-4,-4);
        WorldStateScoreFrame_Alliance8:SetTexCoord(0,0.25,0.5,0.75);

        local i;
        for i = 1, 8, 1 do
                getglobal("WorldStateScoreFrame_Alliance"..i.."Text"):ClearAllPoints();
                getglobal("WorldStateScoreFrame_Alliance"..i.."Text"):SetPoint("RIGHT","WorldStateScoreFrame_Alliance"..i,"LEFT",0,0);
        end
end

function BGAssist_AutoInvite_OnClick()
        BGAssist_MaintainingGroup = true;
        if (GetNumPartyMembers() > 0 and IsPartyLeader()) then
                ConvertToRaid();
        end
        local numNotInRaid = GetNumBattlefieldPositions;
        if (numNotInRaid and numNotInRaid > 0) then
                local i;
                for i = 1, numNotInRaid, 1 do
                        local _,_,who = GetBattlefieldPosition(i);
                        InviteByName(who);
                end
        end
end

function BGAssist_AutomaticBGEntry(data)
        local i;
        local inbg = nil;
        for i = 1, MAX_BATTLEFIELD_QUEUES, 1 do
                local tmpstatus, tmpmapName, tmpinstanceID = GetBattlefieldStatus(i)
                if (tmpstatus == "active") then
                        data = nil;
                        inbg = true;
                elseif (not inbg and tmpstatus == "confirm") then
                        data = i;
                end
        end
        if (not inbg and data) then
                local status, mapName, instanceID = GetBattlefieldStatus(data)
                local goodtoenter = data;
                if (((BGAssist_Config.avoidpreexistingwarsong and 
                        mapName == WARSONGGULCH) or
                        (BGAssist_Config.avoidpreexistingarathi and 
                        mapName == ARATHIBASIN )) and
                        BGAssist_PreExistingInstances and 
                        BGAssist_PreExistingInstances[instanceID]) then
                        local timediff = GetTime() - BGAssist_PreExistingInstances[instanceID];
                        if (timediff < 300) then 
                                goodtoenter = false;
                                DEFAULT_CHAT_FRAME:AddMessage("BGAssist: "..DISPLAY_TEXT_PREEXISTING);
                        end
                end
                if (data and goodtoenter and not BGAssist_Config.noautoenter) then
                        if (BGAssist_InAFK) then
                                DEFAULT_CHAT_FRAME:AddMessage("BGAssist: "..DISPLAY_TEXT_NOTENTERINGAFK);
                        elseif (not (UnitIsDead("player") or UnitIsGhost("player"))) then
                                StaticPopup_Hide("CONFIRM_BATTLEFIELD_ENTRY");
                                AcceptBattlefieldPort(data, 1);
                        end
                end
        end
end

function BGAssist_ToggleAutoEntry(force)
        local current;
        if (StaticPopupDialogs["CONFIRM_BATTLEFIELD_ENTRY"].OnShow) then
                current = true;
        end
        if (force == "ON" or (not current and force ~= "OFF")) then
                StaticPopupDialogs["CONFIRM_BATTLEFIELD_ENTRY"].OnShow = function(data)
                        BGAssist_AutomaticBGEntry(data);
                end
        elseif (force == "OFF" or (current and force ~= "ON")) then
                StaticPopupDialogs["CONFIRM_BATTLEFIELD_ENTRY"].OnShow = nil;
        end
end