vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
-- BuffAhoy - by Theck
-- Version 1.95
--
--This is an addon for WoW that adds several powerful functions to a spellcaster's
--library.  This code was designed for a paladin, but several are easily configurable 
--for other spellcasters (ex. BuffCast should work for warlocks, given the right mods to 
--the lua code, and ShoutCast was designed in part for a mage who wanted to broadcast the
--target of his sheeping spell to the party).  This addon is completely self-contained, though
--flexbar is suggested because it makes it easy to identify the action id which you want to pass
--to the script.  This AddOn is not tested for compatibility with Cosmos, but it has been tested
--with Telo's Sidebar, Clock, BuffTimers, LootLink, as well as AutoPotion, Bag_Status_Meters,
--Auctioneer, Enchantrix, LevelReveal, MapNotes, MiniGroup, and CastAway.
--
--I'd like to especially mention that i used the CastAway code as a base for the BuffCast() function,
--hence the close resemblence (no sense coding my own variable sequence when the cycle code already
--existed).  I'd like to thank danboo for doing most of the hard work for me ahead of time. :)




-- Binding Variables
BINDING_HEADER_BUFFAHOY_HEADER = "BuffAhoy Config";
BINDING_NAME_PLAYER_TARGET_BINDING = "PPT Target Self";
BINDING_NAME_PARTY1_TARGET_BINDING = "PPT Target Party 1";
BINDING_NAME_PARTY2_TARGET_BINDING = "PPT Target Party 2";
BINDING_NAME_PARTY3_TARGET_BINDING = "PPT Target Party 3";
BINDING_NAME_PARTY4_TARGET_BINDING = "PPT Target Party 4";
BINDING_NAME_CUSTOM_TARGET = "PPT Target Target";
BINDING_NAME_PLAYER_PET_BINDING = "PPT Target My Pet";
BINDING_NAME_PARTY1_PET_BINDING = "PPT Target Party Pet 1";
BINDING_NAME_PARTY2_PET_BINDING = "PPT Target Party Pet 2";
BINDING_NAME_PARTY3_PET_BINDING = "PPT Target Party Pet 3";
BINDING_NAME_PARTY4_PET_BINDING = "PPT Target Party Pet 4";
BINDING_NAME_BUFFAHOY_SHOW = "Show Buffs CP";
BINDING_NAME_MULTICAST_SHOW = "Show Caster CP";
BINDING_NAME_BUFFCASTSETONE = "Buff Sequence 1";
BINDING_NAME_BUFFCASTSETTWO = "Buff Sequence 2";
BINDING_NAME_BUFFCASTSETTHREE = "Buff Sequence 3";
BINDING_NAME_BUFFAHOYHEALONE = "Heal 1";
BINDING_NAME_BUFFAHOYHEALTWO = "Heal 2";
BINDING_NAME_BUFFAHOYHEALTHREE = "Heal 3";
BINDING_NAME_BUFFAHOYCLEANSEONE = "Cleanse 1";
BINDING_NAME_BUFFAHOYCLEANSETWO = "Cleanse 2";
BINDING_NAME_BUFFAHOYPROTECTONE = "Protect Party Member";
BINDING_NAME_MULTICASTSETONE = "MultiCast Sequence 1";
BINDING_NAME_MULTICASTSETTWO = "MultiCast Sequence 2";
BINDING_NAME_SHOUTCASTONE = "ShoutCast 1";
BINDING_NAME_SHOUTCASTTWO = "ShoutCast 2";
BINDING_NAME_SHOUTCASTTHREE = "ShoutCast 3";
BINDING_NAME_SHOUTCASTFOUR = "ShoutCast 4";

BINDING_NAME_PANIC = "Panic";




-- Local variables
local BA_step_data = {}
local playa = {}
local peta = {}
--local petArray = {}
local petFlag = false
local castFlag = nil
local failFlag = false
local tempverb = 0
local whovar = "party"
local raidArray={}
local PalShaVar;
local plyr
--local BAgotVariables = false;
--local BAgotPlayerName = false;
--local BAinCombat=false;
local BAUseAction

BA_NumWarriors=0
BA_NumMages=0
BA_NumPriests=0
BA_NumDruids=0
BA_NumHunters=0
BA_NumWarlocks=0
BA_NumRogues=0
BA_NumPalSha=0
BA_NumPets=0

local BA_GroupBuff={[BUFFAHOY_PRIEST]=0, 
                                        [BUFFAHOY_MAGE]=0, 
                                        [BUFFAHOY_DRUID]=0, 
                                        [BUFFAHOY_WARRIOR]=0, 
                                        [BUFFAHOY_HUNTER]=0, 
                                        [BUFFAHOY_WARLOCK]=0, 
                                        [BUFFAHOY_ROGUE]=0, 
                                        [BUFFAHOY_PALADIN]=0, 
                                        [BUFFAHOY_SHAMAN]=0 }

-- global vars
BA = {}
BuffAhoyNameArray = {}
raidArray["RaidCast"]={}
BA_VERSION=1.95
BADebugVar=false


--myAddons Vars
BuffAhoyDetails = {
name = 'BuffAhoy',
description = 'Buff Sequencer and other tools',
version = '1.95',
releaseDate = 'Jan 6, 2006',
author = 'Theck',
category = MYADDONS_CATEGORY_COMBAT,
frame = 'BuffAhoyFrame',
};


--initialize variables that are used by several functions
playa = {"player", "party1", "party2", "party3", "party4"}
peta = {"pet", "partypet1","partypet2","partypet3","partypet4"}

--Blizzard Registrations
UIPanelWindows["BuffAhoyFrame"] = { area = "left", pushable = 11 };

--load function
function BuffAhoy_OnLoad()

   if BA_UseAction then
        BAUseAction = BA_UseAction;
        BADebug("lOriginal")
   else
        BAUseAction = UseAction;
        BADebug("Default UA")
   end

   BuffAhoyFrame:RegisterEvent("VARIABLES_LOADED");
   BuffAhoyFrame:RegisterEvent("PLAYER_ENTERING_WORLD");
   BuffAhoyFrame:RegisterEvent("SPELLCAST_INTERRUPTED")
   BuffAhoyFrame:RegisterEvent("SPELLCAST_FAILED")
   BuffAhoyFrame:RegisterEvent("SPELLCAST_DELAYED")
   BuffAhoyFrame:RegisterEvent("SPELLCAST_STOP")
   BuffAhoyFrame:RegisterEvent("SPELLCAST_START")
--   BuffAhoyFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
--   BuffAhoyFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
   BuffAhoyFrame:RegisterEvent("SPELLCAST_CHANNEL_START")

        local name = this:GetName();
        local header = getglobal(name.."TitleText");


        if ( header ) then 
                header:SetText("|cFFee9966BuffAhoy - by Theck|r");
        end

--   DEFAULT_CHAT_FRAME:AddMessage("BUFFAHOY",1,0,0)

   -- initialize slash commands
   SlashCmdList["BUFFAHOY"]=BuffAhoy_SlashCommandHandler;
   SLASH_BUFFAHOY1="/buffahoy"
   SLASH_BUFFAHOY2="/ba"


   OptionsFrame_EnableDropDown(BuffTypeDropdown);
   OptionsFrame_EnableDropDown(VerboseTypeDropdown);
   OptionsFrame_EnableDropDown(BuffAhoyMasterDropdown);
   OptionsFrame_EnableDropDown(SCTypeDropdown);


end

function BALoadDefaults()
        BA[plyr]={}
        BA[plyr]["BuffCast_Verbose"]=0
        BA[plyr]["BuffCast_Quiet"]=1
        BA[plyr]["Healzor_Verbose"]=1
        BA[plyr]["Healzor_Verbose_Two"]=1
        BA[plyr]["Healzor_Verbose_Three"]=1
        BA[plyr]["Healzor_Smartcastable"]=1
        BA[plyr]["Healzor_Smartcastable_Two"]=1
        BA[plyr]["Healzor_Smartcastable_Three"]=1
        BA[plyr]["Cleanzor_Verbose"]=1
        BA[plyr]["Cleanzor_Verbose_Two"]=1
        BA[plyr]["Cleanzor_Smartcastable"]=1
        BA[plyr]["Cleanzor_Smartcastable_Two"]=1
        BA[plyr]["Protectzor_Verbose"]=1
        BA[plyr]["Protectzor_Smartcastable"]=1
        BA[plyr]["PPTenabled"]=1
        BA[plyr]["SCenabled"]=1
        BA[plyr]["multiverbosity"]=0;
        BA[plyr]["SC1_Verbose"]=1;
        BA[plyr]["SC1_SC"]=1;
        BA[plyr]["SC2_Verbose"]=1;
        BA[plyr]["SC2_SC"]=1;
        BA[plyr]["SC3_Verbose"]=1;
        BA[plyr]["SC3_SC"]=1;
        BA[plyr]["SC4_Verbose"]=1;
        BA[plyr]["SC4_SC"]=1;
        BA[plyr]["UFrameVar"]=0;
        BA[plyr]["RCFrameVar"]=1;
        BA[plyr]["statustext"]=1;
        BA[plyr]["BAFrameVar"]=1;
        BA[plyr]["manabuff"]=0;
        BA[plyr]["ShiftAlt"]=1;
        BA[plyr]["loudevents"]=1;
        BA[plyr]["forceparty"]=0;
        BA[plyr]["showPPTFrame"]=1;
        BA[plyr]["version"]=1.4
        DEFAULT_CHAT_FRAME:AddMessage("BuffAhoy Defaults Loaded!",1,0,0)
end

-- Function to call once player and variables are ready

function BAInitializeSetup()

   -- if player profile doesn't exist
   if ( not BA[plyr] ) then
        -- load defaults
        BALoadDefaults()
   end

   ---code to update version
   if ( not BA[plyr].version or BA[plyr].version < BA_VERSION) then
        BA_ExecuteVersionChanges()
   end

   --code to show/hide PPT Frame        
   if BA[plyr].showPPTFrame == 1 then
        getglobal("PPTFrame"):Show()
   else
        getglobal("PPTFrame"):Hide()
   end
end


function BA_ExecuteVersionChanges()
        local oldversion
        if (not BA[plyr].version) then
                BA[plyr]["version"]=1.3
                oldversion="1.3x or prior"
                BADebug("oldversion",oldversion)
        else
                oldversion=BA[plyr].version
                BADebug("oldversion",oldversion)
        end
        if BA[plyr].version<1.4 then
                BALoadDefaults()
        end
        if BA[plyr].version<1.463 then
                BA[plyr]["buffbeginannounce"]=1;
        end
        if BA[plyr].version<1.5 then
                BA[plyr]["group"]={}
                for i=1,8 do
                        BA[plyr]["group"][i]=1;
                end
        end

        BA[plyr].version=BA_VERSION
        DEFAULT_CHAT_FRAME:AddMessage("BuffAhoy Version Updated from "..oldversion.." to "..BA[plyr].version .."!!",1,0,0);

end


--[[
-- Check the player name, return true if the player name is known, false otherwise
local function BACheckPlayerName()
  if (BAgotPlayerName) then
    return true;
  end
  local pName = UnitName("player");
  if ((pName ~= nil) and (pName ~= UNKNOWNOBJECT) and (pName ~= UKNOWNBEING)) then
    BAgotPlayerName = true;
    plyr=pName;
    return true;
  end
  return false;
end
]]

function BuffAhoy_OnEvent(event)
        -- Saved Variables available here
        if (event == "VARIABLES_LOADED") then

                -- initialize PartyTarget
                PartyTarget="party1"
                
                if ( DEFAULT_CHAT_FRAME ) then 
                        DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ONLOAD_TEXT, 0.8, 0.8, 0.2);
                end

                --this is supposed to help pull names from action bar slots
                for i=1,120,1 do
                        BuffAhoyNameGrab(i);
                end 

                 -- Register the addon in myAddOns
                if(myAddOnsFrame_Register) then
                        myAddOnsFrame_Register(BuffAhoyDetails);
                end

                plyr=UnitName("player")
                BAInitializeSetup();
                        
                
                return

        end


        if (event == "SPELLCAST_INTERRUPTED") then
                BADebug("SPELLCAST_INTERRUPTED", tempverb)
                if tempverb==2 or tempverb==6 or tempverb==7 and BA[plyr].loudevents==1 then
                        SendChatMessage(BUFFAHOY_SPELL_INTERRUPTED)
                end
                castFlag=false;
                tempverb=0;
                failFlag=false;
--              BADebug("tempverb",tempverb)
                BADebug("failFlag",failFlag)
        end
        if (event == "SPELLCAST_FAILED") then
                BADebug("SPELLCAST_FAILED", tempverb)
                if tempverb==1 and BA[plyr].loudevents==1 then
                        SendChatMessage(BUFFAHOY_SPELL_FAILED)
                end
                castFlag=false;
                failFlag=true;
                BADebug("failFlag",failFlag)
                tempverb=0;
        end
        if (event == "SPELLCAST_DELAYED") then
                BADebug("SPELLCAST_DELAYED", tempverb)
                if (tempverb==6 or tempverb==2) and BA[plyr].loudevents==1  then
                        SendChatMessage(BUFFAHOY_SPELL_DELAYED)
                        tempverb=7;
                end
                failFlag=false;
                BADebug("failFlag",failFlag)
        end
        if (event == "SPELLCAST_STOP") then
                if castFlag==true and tempverb==1 then
                        tempverb=9;
                        BADebug("SPELLCAST_STOP", tempverb)
                        castFlag=false;
                elseif castFlag==true and tempverb==2 then
                        tempverb=3;
                        BADebug("SPELLCAST_STOP", tempverb)
                        castFlag=false;
                elseif castFlag==true and tempverb==5 then
                        tempverb=6;
                        castFlag=false;
                        BADebug("SPELLCAST_STOP", tempverb)
                elseif castFlag==true and tempverb==6 then
                        tempverb=7;
                        castFlag=false;
                        BADebug("SPELLCAST_STOP", tempverb)
                else
                        tempverb=0;
                        BADebug("SPELLCAST_STOP", tempverb)
                end
                castFlag=false;
                failFlag=false;
                BADebug("failFlag",failFlag)
--              BADebug("tempverb",tempverb)
                
        end
        if (event == "SPELLCAST_START") then
                if tempverb==1 then
                        tempverb=2;
                        BADebug("SPELLCAST_START", tempverb)
                else
                        tempverb=0;
                        BADebug("SPELLCAST_START", tempverb)
                end
                failFlag=false;
                BADebug("failFlag",failFlag)
        end
        if (event == "SPELLCAST_CHANNEL_START") then
                if tempverb==1 then
                        tempverb=5;
                        BADebug("SPELLCAST_CHANNEL_START", tempverb)
                else
                        tempverb=0;
                        BADebug("SPELLCAST_CHANNEL_START", tempverb)
                end
                failFlag=false;
                BADebug("failFlag",failFlag)
        end
end

--Debug Function
function BADebug(string, value)
        if value==nil then value="nil" end
        if value==true then value="true" end
        if value==false then value="false" end
        if BADebugVar then
                DEFAULT_CHAT_FRAME:AddMessage(string.." is "..value);
        end
end



-- GUI STUFF:

-- Local data


function BuffAhoyTogglish()
        if ( BuffAhoyFrame ) then 
                if ( BuffAhoyFrame:IsVisible() ) then 
                        HideUIPanel(BuffAhoyFrame);
                else    
                        ShowUIPanel(BuffAhoyFrame);
                end
        else
                DEFAULT_CHAT_FRAME:AddMessage("BuffAhoyFrame doesn't exist!!")
        end
end




function BuffAhoy_OnShow()
    BuffAhoy_ShowHelp()
        local check;
--      BADebug("BAFrameVar",BA[plyr].BAFrameVar)
        BuffAhoyFrameTogglish(BA[plyr].BAFrameVar)

        getglobal("BuffCastVerbose"):SetChecked(BA[plyr].BuffCast_Verbose);
        getglobal("BuffCastVerbose2"):SetChecked(BA[plyr].BuffCast_Verbose);

        getglobal("BuffCastQuiet"):SetChecked(BA[plyr].BuffCast_Quiet);
        getglobal("BuffCastQuiet2"):SetChecked(BA[plyr].BuffCast_Quiet);

--      getglobal("BuffCastAnnounce"):SetChecked(BA[plyr].buffbeginannounce);

        getglobal("BuffAhoyHealOneVerbose"):SetChecked(BA[plyr].Healzor_Verbose);
        getglobal("BuffAhoyHealTwoVerbose"):SetChecked(BA[plyr].Healzor_Verbose_Two);
        getglobal("BuffAhoyHealThreeVerbose"):SetChecked(BA[plyr].Healzor_Verbose_Three);
        getglobal("BuffAhoyCleanseOneVerbose"):SetChecked(BA[plyr].Cleanzor_Verbose);
        getglobal("BuffAhoyCleanseTwoVerbose"):SetChecked(BA[plyr].Cleanzor_Verbose_Two);
        getglobal("BuffAhoyProtectVerbose"):SetChecked(BA[plyr].Protectzor_Verbose);

        getglobal("BuffAhoyHealOneSC"):SetChecked(BA[plyr].Healzor_Smartcastable);
        getglobal("BuffAhoyHealTwoSC"):SetChecked(BA[plyr].Healzor_Smartcastable_Two);
        getglobal("BuffAhoyHealThreeSC"):SetChecked(BA[plyr].Healzor_Smartcastable_Three);
        getglobal("BuffAhoyCleanseOneSC"):SetChecked(BA[plyr].Cleanzor_Smartcastable);
        getglobal("BuffAhoyCleanseTwoSC"):SetChecked(BA[plyr].Cleanzor_Smartcastable_Two);
        getglobal("BuffAhoyProtectSC"):SetChecked(BA[plyr].Protectzor_Smartcastable);
        
--      getglobal("PPTENABLE2"):SetChecked(BA[plyr].PPTenabled);
--      getglobal("SCENABLE2"):SetChecked(BA[plyr].SCenabled);

        getglobal("PPTENABLE"):SetChecked(BA[plyr].PPTenabled);
        getglobal("SCENABLE"):SetChecked(BA[plyr].SCenabled);
        getglobal("BuffManaCheck"):SetChecked(BA[plyr].manabuff);
        getglobal("MultiSC"):SetChecked(BA[plyr].multiverbosity);
        getglobal("AnnOpt"):SetChecked(BA[plyr].buffbeginannounce);
        getglobal("StatusTextOpt"):SetChecked(BA[plyr].statustext);
        getglobal("LoudEventsOpt"):SetChecked(BA[plyr].loudevents);
        getglobal("ForcePartyOpt"):SetChecked(BA[plyr].forceparty);
        getglobal("PPTFrameOpt"):SetChecked(BA[plyr].showPPTFrame);

        if BA[plyr].showPPTFrame == 1 then
                getglobal("PPTFrame"):Show()
        else
                getglobal("PPTFrame"):Hide()
        end
--      getglobal("UtilMultiTog"):SetChecked(BA[plyr].UFrameVar);


--      if whovar=="raid" then check=1 else check=0 end
--      getglobal("WhoVarRaidToggle"):SetChecked(check);
--      getglobal("WhoVarRaidToggle2"):SetChecked(check);


        getglobal("ShoutCastOneSC"):SetChecked(BA[plyr].SC1_SC);
        getglobal("ShoutCastTwoSC"):SetChecked(BA[plyr].SC2_SC);
        getglobal("ShoutCastThreeSC"):SetChecked(BA[plyr].SC3_SC);
        getglobal("ShoutCastFourSC"):SetChecked(BA[plyr].SC4_SC);

        getglobal("ShoutCastOneVerbose"):SetChecked(BA[plyr].SC1_Verbose);
        getglobal("ShoutCastTwoVerbose"):SetChecked(BA[plyr].SC2_Verbose);
        getglobal("ShoutCastThreeVerbose"):SetChecked(BA[plyr].SC3_Verbose);
        getglobal("ShoutCastFourVerbose"):SetChecked(BA[plyr].SC4_Verbose);

--      getglobal("BuffAhoySetOnePlayerText"):SetText(UnitName(playa[1]));
--      for i=1,4 do
--              if UnitName(playa[i])~= nil then
--                      getglobal("BuffAhoySetOneParty"..i.."Text"):SetText(UnitName(playa[i+1]));
--              else
--                      getglobal("BuffAhoySetOneParty"..i.."Text"):SetText("Party");
--              end
--      end

--      UtilFrameTogglish(BA[plyr].UFrameVar)

--      BuffFrameTogglish(BA[plyr].RCFrameVar)

        getglobal("GroupOne"):SetChecked(BA[plyr]["group"][1]);
        getglobal("GroupTwo"):SetChecked(BA[plyr]["group"][2]);
        getglobal("GroupThree"):SetChecked(BA[plyr]["group"][3]);
        getglobal("GroupFour"):SetChecked(BA[plyr]["group"][4]);
        getglobal("GroupFive"):SetChecked(BA[plyr]["group"][5]);
        getglobal("GroupSix"):SetChecked(BA[plyr]["group"][6]);
        getglobal("GroupSeven"):SetChecked(BA[plyr]["group"][7]);
        getglobal("GroupEight"):SetChecked(BA[plyr]["group"][8]);

--make windows draggable
        BuffAhoyFrame:RegisterForDrag("LeftButton");


   if UnitFactionGroup("player")=="Alliance" then
        PalShaVar=BUFFAHOY_PALADIN
   else
        PalShaVar=BUFFAHOY_SHAMAN
   end
   RaidSetOnePlayerText:SetText(PalShaVar);



end

function BuffAhoy_Reset()
  if BA[plyr].BAFrameVar==1 then
          if BA[plyr].RCFrameVar==3 then
                for i=1,6,1 do
                        PickupAction(BCS1[i])
                        PickupSpell(511,"spell")
                        PickupAction(BCS2[i])
                        PickupSpell(511,"spell")
                end
                        PickupAction(BCS3)
                        PickupSpell(511,"spell")
                        PickupAction(BCS4)
                        PickupSpell(511,"spell")

          elseif BA[plyr].RCFrameVar==1 then

                        PickupAction(RCPalSha)
                        PickupSpell(511,"spell")
                        PickupAction(RCWarrior)
                        PickupSpell(511,"spell")        
                        PickupAction(RCMage)
                        PickupSpell(511,"spell")        
                        PickupAction(RCPriest)
                        PickupSpell(511,"spell")        
                        PickupAction(RCWarlock)
                        PickupSpell(511,"spell")        
                        PickupAction(RCRogue)
                        PickupSpell(511,"spell")                
                        PickupAction(RCHunter)
                        PickupSpell(511,"spell")        
                        PickupAction(RCDruid)
                        PickupSpell(511,"spell")
                        PickupAction(RCPet1)
                        PickupSpell(511,"spell")
                        PickupAction(RCS2)
                        PickupSpell(511,"spell")        
                        PickupAction(RCS3)
                        PickupSpell(511,"spell")

          elseif BA[plyr].RCFrameVar==2 then
                
                        for i=1,8 do
                                BA[plyr]["group"][i]=1;
                        end

          end   
  elseif BA[plyr].BAFrameVar==2 then
                PickupAction(HZR1)
                PickupSpell(511,"spell")
                PickupAction(HZR2)
                PickupSpell(511,"spell")
                PickupAction(HZR3)
                PickupSpell(511,"spell")
                PickupAction(CZR1)
                PickupSpell(511,"spell")
                PickupAction(CZR2)
                PickupSpell(511,"spell")
                PickupAction(PZR1)
                PickupSpell(511,"spell")
  elseif BA[plyr].BAFrameVar==3 then
        for i=1,6,1 do
                PickupAction(MCS1[i])
                PickupSpell(511,"spell")
                PickupAction(MCS2[i])
                PickupSpell(511,"spell")
        end
                PickupAction(SCT1)
                PickupSpell(511,"spell")
                PickupAction(SCT2)
                PickupSpell(511,"spell")
                PickupAction(SCT3)
                PickupSpell(511,"spell")
                PickupAction(SCT4)
                PickupSpell(511,"spell")
  elseif BA[plyr].BAFrameVar==4 then
--      BADebug("BAFrameVar",BA[plyr].BAFrameVar);
  end
end



function BuffAhoy_ShowHelp()
        local helptext = getglobal("BuffAhoyFrameHelpText");
        if ( helptext ) then 
                        helptext:SetText(BUFFAHOY_HELP);
        end

        local helptext3 = getglobal("BuffAhoySetThreeFourHelpText");
        if ( helptext3 ) then
                        helptext3:SetText(BUFFAHOYBC34_HELP);
        end
        local helptext4 = getglobal("RaidSetThreeFourHelpText");
        if ( helptext4 ) then
                        helptext4:SetText(BUFFAHOYRC23_HELP);
        end
end

-- Handles gui updates ever frame
function BuffAhoy_Update()
end



function BuffAhoyButton_GetID(button)
-- Telo's code
        if ( button == nil ) then
                DEFAULT_CHAT_FRAME:AddMessage("nil button passed into GetID()");
                return 0;
        end
        this = button
        return (button:GetID())
end

function BuffAhoyButton_UpdateState()
-- Desperate attempt to fix Dagar's Mac crash
--if not string.find(this:GetName(),"BuffAhoyButton") then return end
local button = this
-- Blizzard code: Purpose unknown at button time
        if ( IsCurrentAction(BuffAhoyButton_GetID(button)) or IsAutoRepeatAction(BuffAhoyButton_GetID(button)) ) then
                button:SetChecked(1);
        else
                button:SetChecked(0);
        end
this = button
end

-- BA Button Load
function BuffAhoy_ButtonLoad()
        local button = this
        BuffAhoyButton_Update();
        button:RegisterForDrag("LeftButton", "RightButton");
        button:RegisterForClicks("LeftButtonUp", "RightButtonUp");
        button:RegisterEvent("SPELLS_CHANGED");
        button:RegisterEvent("CURRENT_SPELL_CAST_CHANGED");
        button:RegisterEvent("SPELL_UPDATE_COOLDOWN");  
        button:RegisterEvent("ACTIONBAR_SLOT_CHANGED");
        button:RegisterEvent("ACTIONBAR_UPDATE_STATE");
        button:RegisterEvent("UNIT_INVENTORY_CHANGED");
end




-- BA Button Event Handler
function BuffAhoy_ButtonEvent(event)
        if ( event == "SPELL_UPDATE_COOLDOWN" ) then
                BuffAhoyButton_Update(this);
        end
        if ( event == "ACTIONBAR_SLOT_CHANGED" ) then
                if ( arg1 == -1 or arg1 == BuffAhoyButton_GetID(this) ) then
                        BuffAhoyButton_Update();
                end
                this = button
                return;
        end
        if ( event == "UNIT_INVENTORY_CHANGED" ) then
                if ( arg1 == "player" ) then
                        BuffAhoyButton_Update();
                end
                this = button
                return;
        end
        if ( event == "ACTIONBAR_UPDATE_STATE" ) then
                BuffAhoyButton_UpdateState();
                this = button
                return;
        end
end


function BuffAhoy_VerboseButtonEnter()
        GameTooltip:SetOwner(this, "ANCHOR_RIGHT");
        GameTooltip:SetText(BUFFAHOY_VERBOSE_TIP);
end
function BuffAhoy_VerboseButtonLeave()
        GameTooltip:Hide();
end
function BuffAhoy_VerboseToggle(set,state)
--   BADebug("set",set)
--   BADebug("state",state)
   if (set==11) then
        if ( state == true or state == 1 ) then
                BA[plyr].Healzor_Verbose=1;
        else
                BA[plyr].Healzor_Verbose=0;     
        end
   end
   if (set==12) then
        if ( state == true or state == 1 ) then
                BA[plyr].Healzor_Verbose_Two=1; 
        else
                BA[plyr].Healzor_Verbose_Two=0; 
        end
   end
   if (set==13) then
        if ( state == true or state == 1 ) then
                BA[plyr].Healzor_Verbose_Three=1;       
        else
                BA[plyr].Healzor_Verbose_Three=0;       
        end
   end
   if (set==14) then
        if ( state == true or state == 1 ) then
                BA[plyr].Protectzor_Verbose=1;  
        else
                BA[plyr].Protectzor_Verbose=0;  
        end
   end
   if (set==15) then
        if ( state == true or state == 1 ) then
                BA[plyr].Cleanzor_Verbose=1;    
        else
                BA[plyr].Cleanzor_Verbose=0;    
        end
   end
   if (set==16) then
        if ( state == true or state == 1 ) then
                BA[plyr].Cleanzor_Verbose_Two=1;        
        else
                BA[plyr].Cleanzor_Verbose_Two=0;        
        end
   end

   if (set==21) then
        if ( state == true or state == 1 ) then
                BA[plyr].SC1_Verbose=1;
        else
                BA[plyr].SC1_Verbose=0; 
        end
   end
   if (set==22) then
        if ( state == true or state == 1 ) then
                BA[plyr].SC2_Verbose=1;
        else
                BA[plyr].SC2_Verbose=0; 
        end
   end
   if (set==23) then
        if ( state == true or state == 1 ) then
                BA[plyr].SC3_Verbose=1;
        else
                BA[plyr].SC3_Verbose=0; 
        end
   end
   if (set==24) then
        if ( state == true or state == 1 ) then
                BA[plyr].SC4_Verbose=1;
        else
                BA[plyr].SC4_Verbose=0; 
        end
   end
   if (set==70) then
        if ( state == true or state == 1 ) then
                BA[plyr].BuffCast_Verbose=1;
                BA[plyr].BuffCast_Quiet=0;
                BuffAhoy_OnShow();      
--              BADebug("Verbose",BA[plyr].BuffCast_Verbose)
--              BADebug("Quiet",BA[plyr].BuffCast_Quiet)
        else
                BA[plyr].BuffCast_Verbose=0;    
                BuffAhoy_OnShow();
--              BADebug("Verbose",BA[plyr].BuffCast_Verbose)
--              BADebug("Quiet",BA[plyr].BuffCast_Quiet)
        end
   end   
   if (set==71) then
        if ( state == true or state == 1 ) then
                BA[plyr].BuffCast_Quiet=1;
                BA[plyr].BuffCast_Verbose=0;
                BuffAhoy_OnShow();      
--              BADebug("Verbose",BA[plyr].BuffCast_Verbose)
--              BADebug("Quiet",BA[plyr].BuffCast_Quiet)
        else
                BA[plyr].BuffCast_Quiet=0;      
                BuffAhoy_OnShow();
--              BADebug("Verbose",BA[plyr].BuffCast_Verbose)
--              BADebug("Quiet",BA[plyr].BuffCast_Quiet)
        end
   end
   if (set==72) then
        if ( state == true or state == 1 ) then
                BA[plyr].buffbeginannounce=1
                DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ANNOUNCE_ON)
        else
                BA[plyr].buffbeginannounce=0
                DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ANNOUNCE_OFF)
        end
        BuffAhoy_OnShow();      
   end
end


function BuffAhoy_CheckButtonEnter()
        GameTooltip:SetOwner(this, "ANCHOR_RIGHT");
        GameTooltip:SetText(BUFFAHOY_OPTIONS_TIP);
end
function BuffAhoy_CheckButtonLeave()
        GameTooltip:Hide();
end

function BuffAhoy_CheckToggle(set,state)
--   if (set==1) then
--      if ( state == true or state == 1 ) then
--              BA[plyr].RCFrameVar=1;
--      else
--              BA[plyr].RCFrameVar=3;
--      end
--      BuffFrameTogglish(BA[plyr].RCFrameVar)
--   end
--   if (set==2) then
--      if ( state == true or state == 1 ) then
--              BA[plyr].UFrameVar=1;
--      else
--              BA[plyr].UFrameVar=0;
--      end
--      UtilFrameTogglish(BA[plyr].UFrameVar)
--   end
   if (set==11) then
        if (state == true or state == 1 ) then
                BA[plyr].Healzor_Smartcastable=1;
        else
                BA[plyr].Healzor_Smartcastable=0;
        end
   end
   if (set==12) then
        if (state == true or state == 1 ) then
                BA[plyr].Healzor_Smartcastable_Two=1;
        else
                BA[plyr].Healzor_Smartcastable_Two=0;
        end
   end
   if (set==13) then
        if (state == true or state == 1 ) then
                BA[plyr].Healzor_Smartcastable_Three=1;
        else
                BA[plyr].Healzor_Smartcastable_Three=0;
        end
   end
   if (set==14) then
        if (state == true or state == 1 ) then
                BA[plyr].Protectzor_Smartcastable=1;
                BADebug("Pz_sc",BA[plyr].Protectzor_Smartcastable)
        else
                BA[plyr].Protectzor_Smartcastable=0;
                BADebug("Pz_sc",BA[plyr].Protectzor_Smartcastable)
        end
   end
   if (set==15) then
        if (state == true or state == 1 ) then
                BA[plyr].Cleanzor_Smartcastable=1;
        else
                BA[plyr].Cleanzor_Smartcastable=0;
        end
   end
   if (set==16) then
        if (state == true or state == 1 ) then
                BA[plyr].Cleanzor_Smartcastable_Two=1;
        else
                BA[plyr].Cleanzor_Smartcastable_Two=0;
        end
   end
   if (set==21) then
        if ( state == true or state == 1 ) then
                BA[plyr].SC1_SC=1;
        else
                BA[plyr].SC1_SC=0;      
        end
   end
   if (set==22) then
        if ( state == true or state == 1 ) then
                BA[plyr].SC2_SC=1;
        else
                BA[plyr].SC2_SC=0;      
        end
   end
   if (set==23) then
        if ( state == true or state == 1 ) then
                BA[plyr].SC3_SC=1;
        else
                BA[plyr].SC3_SC=0;      
        end
   end
   if (set==24) then
        if ( state == true or state == 1 ) then
                BA[plyr].SC4_SC=1;
        else
                BA[plyr].SC4_SC=0;      
        end
   end
end


function BuffAhoy_OptionsButtonEnter()
        GameTooltip:SetOwner(this, "ANCHOR_RIGHT");
        GameTooltip:SetText(BUFFAHOY_OPTIONS_TIP);
end
function BuffAhoy_OptionsButtonLeave()
        GameTooltip:Hide();
end
function BuffAhoy_OptionsToggle(set,state)
   if (set==1) then
        if ( state == true or state == 1 ) then
                BA[plyr].PPTenabled=1;
                BuffAhoy_OnShow();
        else
                BA[plyr].PPTenabled=0;
                BuffAhoy_OnShow();
        end
   end
   if (set==2) then
        if ( state == true or state == 1 ) then
                BA[plyr].SCenabled=1;
                BuffAhoy_OnShow();
        else
                BA[plyr].SCenabled=0;
                BuffAhoy_OnShow();
        end
   end
   if (set==3) then
        if (state == true or state == 1 ) then
                BA[plyr].manabuff=1;
        else
                BA[plyr].manabuff=0;
        end
   end
   if (set==4) then
        if (state == true or state == 1 ) then
                BA[plyr].buffbeginannounce=1;
                DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ANNOUNCE_ON)
                BuffAhoy_OnShow()
        else
                BA[plyr].buffbeginannounce=0;
                DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ANNOUNCE_OFF)
                BuffAhoy_OnShow()
        end
   end
   if (set==5) then
        if (state == true or state == 1 ) then
                BA[plyr].statustext=1;
        else
                BA[plyr].statustext=0;
        end
   end
   if (set==6) then
        if (state == true or state == 1 ) then
                BA[plyr].loudevents=1;
        else
                BA[plyr].loudevents=0;
        end
   end
   if (set==7) then
        if (state == true or state == 1 ) then
                BA[plyr].forceparty=1;
        else
                BA[plyr].forceparty=0;
        end
   end
   if (set==8) then
        if (state == true or state == 1 ) then
                BA[plyr].showPPTFrame=1;
                PPTFrame:Show()
        else
                BA[plyr].showPPTFrame=0;
                PPTFrame:Hide()
        end
   end


--   if (set==10) then
--      if (state == true or state == 1 ) then
--              whovar="raid";
--              BuffAhoy_OnShow();
--      else
--              whovar="party";
--              BuffAhoy_OnShow();
--      end
--   end

     if (set==43) then
        if (state == true or state == 1 ) then
                BA[plyr].multiverbosity=1;
                BuffAhoy_OnShow()
        else
                BA[plyr].multiverbosity=0;
                BuffAhoy_OnShow()
        end
    end

   if (set==81) then
        if ( state == true or state == 1 ) then
                BA[plyr]["group"][1]=1;
                BuffAhoy_OnShow();
        else
                BA[plyr]["group"][1]=0;
                BuffAhoy_OnShow();
        end
   end
   if (set==82) then
        if ( state == true or state == 1 ) then
                BA[plyr]["group"][2]=1;
                BuffAhoy_OnShow();
        else
                BA[plyr]["group"][2]=0;
                BuffAhoy_OnShow();
        end
   end
   if (set==83) then
        if (state == true or state == 1 ) then
                BA[plyr]["group"][3]=1;
                BuffAhoy_OnShow();
        else
                BA[plyr]["group"][3]=0;
                BuffAhoy_OnShow();
        end
   end
   if (set==84) then
        if (state == true or state == 1 ) then
                BA[plyr]["group"][4]=1;
                BuffAhoy_OnShow();
        else
                BA[plyr]["group"][4]=0;
                BuffAhoy_OnShow();
        end
   end
   if (set==85) then
        if (state == true or state == 1 ) then
                BA[plyr]["group"][5]=1;
                BuffAhoy_OnShow();
        else
                BA[plyr]["group"][5]=0;
                BuffAhoy_OnShow();
        end
   end
   if (set==86) then
        if (state == true or state == 1 ) then
                BA[plyr]["group"][6]=1;
                BuffAhoy_OnShow();
        else
                BA[plyr]["group"][6]=0;
                BuffAhoy_OnShow();
        end
   end
   if (set==87) then
        if (state == true or state == 1 ) then
                BA[plyr]["group"][7]=1;
                BuffAhoy_OnShow();
        else
                BA[plyr]["group"][7]=0;
                BuffAhoy_OnShow();
        end
   end
   if (set==88) then
        if (state == true or state == 1 ) then
                BA[plyr]["group"][8]=1;
                BuffAhoy_OnShow();
        else
                BA[plyr]["group"][8]=0;
                BuffAhoy_OnShow();
        end
   end
end

function BuffAhoyNameGrab(id)
        BA_Tooltip:SetOwner(BuffAhoyFrame, "ANCHOR_NONE")
        BA_Tooltip:SetAction(id)
        local textemp=BA_TooltipTextLeft1:GetText()
--      DEFAULT_CHAT_FRAME:AddMessage(textemp)
        if textemp~=nil then
                BuffAhoyNameArray[id]=textemp;
        else
                BuffAhoyNameArray[id]="nothing";
        end
        BA_Tooltip:Hide();
end


function BuffAhoyButton_Update()
-- When called manually, this can change - changed code to use button instead of this

local button = this
-- Blizzard code
        if button~= nil then
        local buttonID = BuffAhoyButton_GetID(button);

        local icon = getglobal(button:GetName().."Icon");
        local buttonCooldown = getglobal(button:GetName().."Cooldown");
        local texture = GetActionTexture(BuffAhoyButton_GetID(button));

                if ( texture ) then
                        icon:SetTexture(texture);
                        icon:Show();
                        button:SetNormalTexture("Interface\\Buttons\\UI-Quickslot2");
                        BuffAhoyNameGrab(BuffAhoyButton_GetID(button));
                else
                        icon:Hide();
                        buttonCooldown:Hide();
                        button.rangeTimer = nil;
                        button:SetNormalTexture("Interface\\Buttons\\UI-Quickslot");
                        getglobal(button:GetName().."HotKey"):SetVertexColor(0.6, 0.6, 0.6);
                end
        end

        
        -- Update Macro Text
        local macroName = getglobal(button:GetName().."Name");
        macroName:SetText(GetActionText(BuffAhoyButton_GetID(button)))
this = button
end



function BuffAhoy_SetTooltip()
button = this
        GameTooltip:SetOwner(button, "ANCHOR_RIGHT");
        GameTooltip:SetAction(BuffAhoyButton_GetID(button))

this = button
end


function BuffFrameTogglish(state)
        if ( BuffAhoyOptions ) then 
                if ( state==1 ) then 
                        ShowUIPanel(BuffAhoyOptions);
                        HideUIPanel(BuffAhoySetOne);
                        HideUIPanel(BuffAhoySetTwo);
                        HideUIPanel(BuffAhoySetThreeFour);
                        ShowUIPanel(RaidSetThreeFour);
                        ShowUIPanel(RaidSetOne);
                        ShowUIPanel(RaidSetTwo);
                        HideUIPanel(BuffAhoyGroupFrame);

                elseif (state==3) then
        
                        ShowUIPanel(BuffAhoyOptions);
                        ShowUIPanel(BuffAhoySetOne);
                        ShowUIPanel(BuffAhoySetTwo);
                        ShowUIPanel(BuffAhoySetThreeFour);
                        HideUIPanel(RaidSetThreeFour);
                        HideUIPanel(RaidSetOne);
                        HideUIPanel(RaidSetTwo);
                        HideUIPanel(BuffAhoyGroupFrame);

                else

                        ShowUIPanel(BuffAhoyOptions);
                        HideUIPanel(BuffAhoySetOne);
                        HideUIPanel(BuffAhoySetTwo);
                        HideUIPanel(BuffAhoySetThreeFour);
                        HideUIPanel(RaidSetThreeFour);
                        HideUIPanel(RaidSetOne);
                        HideUIPanel(RaidSetTwo);
                        ShowUIPanel(BuffAhoyGroupFrame);

                end
        else
                DEFAULT_CHAT_FRAME:AddMessage("BuffAhoyFrame doesn't exist!!")
        end
end





function BuffAhoyFrameTogglish(state)
        if (BuffAhoyOptions) then
                        HideUIPanel(MultiCastSetOne);
                        HideUIPanel(MultiCastSetTwo);
                        HideUIPanel(ShoutCastOne);
                        HideUIPanel(ShoutCastTwo);
                        HideUIPanel(ShoutCastThree);
                        HideUIPanel(ShoutCastFour);
                        HideUIPanel(BuffAhoyHealOne);
                        HideUIPanel(BuffAhoyHealTwo);
                        HideUIPanel(BuffAhoyHealThree);
                        HideUIPanel(BuffAhoyCleanseOne);
                        HideUIPanel(BuffAhoyCleanseTwo);
                        HideUIPanel(BuffAhoyProtect);
                        ShowUIPanel(BuffAhoyOptions);
                        HideUIPanel(BuffAhoySetOne);
                        HideUIPanel(BuffAhoySetTwo);
                        HideUIPanel(BuffAhoySetThreeFour);
                        HideUIPanel(RaidSetThreeFour);
                        HideUIPanel(RaidSetOne);
                        HideUIPanel(RaidSetTwo);
                        HideUIPanel(VerboseTypeDropdown);
                        HideUIPanel(BuffTypeDropdown);
                        HideUIPanel(SCTypeDropdown);
                        HideUIPanel(BuffAhoyOptionsFrame);
                        HideUIPanel(BuffAhoyGroupFrame);

                if (state==1) then
                        ShowUIPanel(VerboseTypeDropdown);
                        ShowUIPanel(BuffTypeDropdown);

                elseif (state ==2) then
                        ShowUIPanel(BuffAhoyHealOne);
                        ShowUIPanel(BuffAhoyHealTwo);
                        ShowUIPanel(BuffAhoyHealThree);
                        ShowUIPanel(BuffAhoyCleanseOne);
                        ShowUIPanel(BuffAhoyCleanseTwo);
                        ShowUIPanel(BuffAhoyProtect);
                        ShowUIPanel(VerboseTypeDropdown);

                elseif (state == 3) then
                        ShowUIPanel(MultiCastSetOne);
                        ShowUIPanel(MultiCastSetTwo);
                        ShowUIPanel(ShoutCastOne);
                        ShowUIPanel(ShoutCastTwo);
                        ShowUIPanel(ShoutCastThree);
                        ShowUIPanel(ShoutCastFour);
                        ShowUIPanel(VerboseTypeDropdown);

                elseif (state == 4) then
                        ShowUIPanel(BuffAhoyOptionsFrame);
                        ShowUIPanel(VerboseTypeDropdown);
                        ShowUIPanel(SCTypeDropdown);
                end
        end
end

function BuffAhoyMasterDropdown_OnLoad()
        UIDropDownMenu_Initialize(this, BuffAhoyMasterDropdown_Initialize);
        UIDropDownMenu_SetSelectedID(BuffAhoyMasterDropdown, BA[plyr].BAFrameVar);
        UIDropDownMenu_SetWidth(120, BuffAhoyMasterDropdown);
end

function BuffAhoyMasterDropdown_OnClick()
        UIDropDownMenu_SetSelectedValue(BuffAhoyMasterDropdown, this.value);
--      BADebug("value",UIDropDownMenu_GetSelectedValue(BuffAhoyMasterDropdown))
        BA[plyr].BAFrameVar = UIDropDownMenu_GetSelectedValue(BuffAhoyMasterDropdown);
        BuffAhoyFrameTogglish(BA[plyr].BAFrameVar)
--      DEFAULT_CHAT_FRAME:AddMessage("Frame Var is "..BA[plyr].BAFrameVar);
        BuffAhoyMasterDropdown.tooltip = this.tooltipText;
end

function BuffAhoyMasterDropdown_Initialize()
        local selectedValue = UIDropDownMenu_GetSelectedValue(BuffAhoyMasterDropdown);
        local info;

        -- Show Buffs
        info = {};
        info.text = BUFFAHOY_PB_TEXT;
        info.tooltipTitle = info.text;
        info.tooltipText = BUFFAHOY_PB_TOOLTIP;
        info.func = BuffAhoyMasterDropdown_OnClick;
        info.value = 1;
        if ( selectedValue == info.value ) then
                info.checked = 1;
        else
                info.checked = nil;
        end
        UIDropDownMenu_AddButton(info);

        -- Show Utils
        info = {};
        info.text = BUFFAHOY_UF_TEXT;
        info.tooltipTitle = info.text;
        info.tooltipText = BUFFAHOY_UF_TOOLTIP;
        info.func = BuffAhoyMasterDropdown_OnClick;
        info.value = 2;
        if ( selectedValue == info.value ) then
                info.checked = 1;
        else
                info.checked = nil;
        end
        UIDropDownMenu_AddButton(info);

        -- Show Multi/Shoutcast
        info = {};
        info.text = BUFFAHOY_MC_TEXT;
        info.tooltipTitle = info.text;
        info.tooltipText = BUFFAHOY_MC_TOOLTIP ;
        info.func = BuffAhoyMasterDropdown_OnClick;
        info.value = 3;
        if ( selectedValue == info.value ) then
                info.checked = 1;
        else
                info.checked = nil;
        end
        UIDropDownMenu_AddButton(info);

        -- Show BuffAhoy Options
        info = {};
        info.text = BUFFAHOY_GO_TEXT ;
        info.tooltipTitle = info.text;
        info.tooltipText = BUFFAHOY_GO_TOOLTIP;
        info.func = BuffAhoyMasterDropdown_OnClick;
        info.value = 4;
        if ( selectedValue == info.value ) then
                info.checked = 1;
        else
                info.checked = nil;
        end
        UIDropDownMenu_AddButton(info);
end

function BuffTypeDropdown_OnLoad()
        UIDropDownMenu_Initialize(this, BuffTypeDropdown_Initialize);
        UIDropDownMenu_SetSelectedValue(this, BA[plyr].RCFrameVar);
--      BADebug("RC onload", BA[plyr].RCFrameVar)
--      BADebug("value onload",UIDropDownMenu_GetSelectedValue(BuffTypeDropdown));
        if BA[plyr].RCFrameVar==1 then
                UIDropDownMenu_SetSelectedID(BuffTypeDropdown, 1);
        elseif BA[plyr].RCFrameVar==2 then
                UIDropDownMenu_SetSelectedID(BuffTypeDropdown, 2);
        elseif BA[plyr].RCFrameVar==3 then
                UIDropDownMenu_SetSelectedID(BuffTypeDropdown, 3);
        end
--      BADebug("ID onload",UIDropDownMenu_GetSelectedID(BuffTypeDropdown));
        BuffFrameTogglish(BA[plyr].RCFrameVar)
        UIDropDownMenu_SetWidth(110, BuffTypeDropdown);
end

function BuffTypeDropdown_OnClick()
        UIDropDownMenu_SetSelectedValue(BuffTypeDropdown, this.value);
--      BADebug("value",UIDropDownMenu_GetSelectedValue(BuffTypeDropdown))
        BA[plyr].RCFrameVar = UIDropDownMenu_GetSelectedValue(BuffTypeDropdown);
        BuffFrameTogglish(BA[plyr].RCFrameVar)
        BuffTypeDropdown.tooltip = this.tooltipText;
end

function BuffTypeDropdown_Initialize()
        local selectedValue = UIDropDownMenu_GetSelectedValue(BuffTypeDropdown);
        local info;



        -- Show Class-based
        info = {};
        info.text = BUFFAHOY_CLASSBASE_TEXT;
        info.tooltipTitle = info.text;
        info.tooltipText = BUFFAHOY_CLASSBASE_TOOLTIP;
        info.func = BuffTypeDropdown_OnClick;
        info.value = 1;
        if ( selectedValue == info.value ) then
                info.checked = 1;
        else
                info.checked = nil;
        end
        UIDropDownMenu_AddButton(info);




        -- Show Groups
        info = {};
        info.text = BUFFAHOY_GROUP_TEXT;
        info.tooltipTitle = info.text;
        info.tooltipText = BUFFAHOY_GROUP_TOOLTIP;
        info.func = BuffTypeDropdown_OnClick;
        info.value = 2;
        if ( selectedValue == info.value ) then
                info.checked = 1;
        else
                info.checked = nil;
        end
        UIDropDownMenu_AddButton(info);


        -- Show Individualized
        info = {};
        info.text = BUFFAHOY_INDIV_TEXT ;
        info.tooltipTitle = info.text;
        info.tooltipText = BUFFAHOY_INDIV_TOOLTIP;
        info.func = BuffTypeDropdown_OnClick;
        info.value = 3;
        if ( selectedValue == info.value ) then
                info.checked = 1;
        else
                info.checked = nil;
        end
        UIDropDownMenu_AddButton(info);
end


function VerboseTypeDropdown_OnLoad()
        UIDropDownMenu_Initialize(this, VerboseTypeDropdown_Initialize);
        if whovar=="raid" then
                UIDropDownMenu_SetSelectedID(VerboseTypeDropdown, 1);
        elseif whovar=="party" then
                UIDropDownMenu_SetSelectedID(VerboseTypeDropdown, 2);
        elseif whovar=="say" then
                UIDropDownMenu_SetSelectedID(VerboseTypeDropdown, 3);
        end
        UIDropDownMenu_SetWidth(70, VerboseTypeDropdown);
end

function VerboseTypeDropdown_OnClick()
        UIDropDownMenu_SetSelectedValue(VerboseTypeDropdown, this.value);
--      BADebug("value",UIDropDownMenu_GetSelectedValue(VerboseTypeDropdown))
        local temp1 = UIDropDownMenu_GetSelectedValue(VerboseTypeDropdown);
        if temp1==1 then
                whovar="raid"
        elseif temp1==2 then
                whovar="party"
        elseif temp1==3 then
                whovar="say"
        end
        VerboseTypeDropdown.tooltip = this.tooltipText;
end

function VerboseTypeDropdown_Initialize()
        local selectedValue = UIDropDownMenu_GetSelectedValue(VerboseTypeDropdown);
        local info;

        -- Show Buffs
        info = {};
        info.text = BUFFAHOY_VERBOSE_RAID_TEXT;
        info.tooltipTitle = info.text;
        info.tooltipText = BUFFAHOY_VERBOSE_RAID_TT;
        info.func = VerboseTypeDropdown_OnClick;
        info.value = 1;
        if ( selectedValue == info.value ) then
                info.checked = 1;
        else
                info.checked = nil;
        end
        UIDropDownMenu_AddButton(info);

        -- Show Debuffs
        info = {};
        info.text = BUFFAHOY_VERBOSE_PARTY_TEXT;
        info.tooltipTitle = info.text;
        info.tooltipText = BUFFAHOY_VERBOSE_PARTY_TT ;
        info.func = VerboseTypeDropdown_OnClick;
        info.value = 2;
        if ( selectedValue == info.value ) then
                info.checked = 1;
        else
                info.checked = nil;
        end
        UIDropDownMenu_AddButton(info);

        -- Show Both
        info = {};
        info.text = BUFFAHOY_VERBOSE_SAY_TEXT;
        info.tooltipTitle = info.text;
        info.tooltipText = BUFFAHOY_VERBOSE_SAY_TT;
        info.func = VerboseTypeDropdown_OnClick;
        info.value = 3;
        if ( selectedValue == info.value ) then
                info.checked = 1;
        else
                info.checked = nil;
        end
        UIDropDownMenu_AddButton(info);
end

function SCTypeDropdown_OnLoad()
        UIDropDownMenu_Initialize(this, SCTypeDropdown_Initialize);
--      BADebug("value onload",UIDropDownMenu_GetSelectedValue(BuffTypeDropdown));
--      BADebug("ShiftAlt",BA[plyr].ShiftAlt)
        UIDropDownMenu_SetSelectedID(SCTypeDropdown, BA[plyr].ShiftAlt);
--      BADebug("ID onload",UIDropDownMenu_GetSelectedID(SCTypeDropdown));
--      BA[plyr].ShiftAlt = UIDropDownMenu_GetSelectedValue(SCTypeDropdown);
        UIDropDownMenu_SetWidth(60, SCTypeDropdown);
end

function SCTypeDropdown_OnClick()
        UIDropDownMenu_SetSelectedValue(SCTypeDropdown, this.value);
--      BADebug("value",UIDropDownMenu_GetSelectedValue(SCTypeDropdown))
        BA[plyr].ShiftAlt = UIDropDownMenu_GetSelectedValue(SCTypeDropdown);
--      BADebug("ShiftAlt",BA[plyr].ShiftAlt)
        SCTypeDropdown.tooltip = this.tooltipText;
end

function SCTypeDropdown_Initialize()
        local selectedValue = UIDropDownMenu_GetSelectedValue(SCTypeDropdown);
        local info;

        -- Alt for selfcasting
        info = {};
        info.text = "Alt";
        info.tooltipTitle = info.text;
        info.tooltipText = BUFFAHOY_ALTSELF_TOOLTIP;
        info.func = SCTypeDropdown_OnClick;
        info.value = 1;
        if ( selectedValue == info.value ) then
                info.checked = 1;
        else
                info.checked = nil;
        end
        UIDropDownMenu_AddButton(info);

        -- Shift for Smartcasting
        info.text = "Shift";
        info.tooltipTitle = info.text;
        info.tooltipText = BUFFAHOY_SHIFTSELF_TOOLTIP;
        info.func = SCTypeDropdown_OnClick;
        info.value = 2;
        if ( selectedValue == info.value ) then
                info.checked = 1;
        else
                info.checked = nil;
        end
        UIDropDownMenu_AddButton(info);

        -- Control for Smartcasting
        info.text = "Ctrl";
        info.tooltipTitle = info.text;
        info.tooltipText = BUFFAHOY_SHIFTSELF_TOOLTIP;
        info.func = SCTypeDropdown_OnClick;
        info.value = 3;
        if ( selectedValue == info.value ) then
                info.checked = 1;
        else
                info.checked = nil;
        end
        UIDropDownMenu_AddButton(info);

end

function PPTFrame_OnLoad()
--      RegisterForSave("PPTX1")
--      RegisterForSave("PPTY1")
        if not XVAR1 or not YVAR1 then
           XVAR1 = 500;
           YVAR1 = 500;
        else
                PPTFrame:SetPoint("TOPLEFT","UIParent","BOTTOMLEFT", XVAR1, YVAR1);
        end
        getglobal("PPTText"):SetTextHeight(13);
end

function PPTFrame_OnMouseDown(arg1)
   if arg1 == "LeftButton" then
        PPTFrame:StartMoving();
   end
end

function PPTFrame_OnMouseUp(arg1)
   if arg1 == "LeftButton" then
        PPTFrame:StopMovingOrSizing();
        PPTX1=PPTFrame:GetLeft();
        PPTY1=PPTFrame:GetTop();
   end
end

function PPTFrame_OnUpdate()
        if UnitName("target")~=nil and UnitIsFriend("player","target") then
                PPTText:SetText(UnitName("target"))
                                --and (PartyTarget=="player" or PartyTarget=="party1" or PartyTarget=="party2" or PartyTarget=="party3" or PartyTarget=="party4")
        elseif PartyTarget~=nil  and UnitName(PartyTarget)~=nil then
                PPTText:SetText(UnitName(PartyTarget))
        elseif PartyTarget~=nil and UnitName(PartyTarget)==nil then
                PPTText:SetText("No Target")
        elseif PartyTarget~=nil then
                PPTText:SetText(PartyTarget)
        else
                PPTText:SetText("No Target")
        end
        if GetNumPartyMembers()<1 then
                PPTFrame:Hide()
        elseif GetNumPartyMembers()>0 and BAgotPlayerName and BA[plyr].showPPTFrame==1 then
                PPTFrame:Show()
        end
end

function PPT_CloseButton()
        PPTFrame:Hide()
end

-----------------------------------------------------------------------------------------
-- SlashCommandHandlers

function BuffAhoy_SlashCommandHandler(msg)
  if (msg== "verbose") then
    BA[plyr].BuffCast_Verbose=1
    BA[plyr].Healzor_Verbose=1
    BA[plyr].Healzor_Verbose_Two=1
    BA[plyr].Healzor_Verbose_Three=1
    BA[plyr].Cleanzor_Verbose=1
    BA[plyr].Cleanzor_Verbose_Two=1
    BA[plyr].Protectzor_verbose=1
    DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_VERBOSESLASH1)
    DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_VERBOSESLASH2)
  end
  if (msg== "silent") then
    BA[plyr].BuffCast_Verbose=0
    BA[plyr].Healzor_Verbose=0
    BA[plyr].Healzor_Verbose_Two=0
    BA[plyr].Healzor_Verbose_Three=0
    BA[plyr].Cleanzor_Verbose=0
    BA[plyr].Cleanzor_Verbose_Two=0
    BA[plyr].Protectzor_verbose=0
    DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_VERBOSESLASH3)
    DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_VERBOSESLASH2)
  end
  if (msg=="buffs") then
    BuffAhoyTogglish()
  end
  if (msg=="caster") then
    BuffAhoyTogglish()
  end
  if (msg=="config") then
    BuffAhoyTogglish()
  end
  if (msg=="") then
     DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_VERBOSESLASH2)
  end
  if (msg=="buff1") then
        BuffCastSetOne()
  end
  if (msg=="buff2") then
        BuffCastSetTwo()
  end
  if (msg=="buff3") then
        BuffCastSetThree()
  end
  if (msg=="heal1") then
        BuffAhoyHealzorOne()
  end
  if (msg=="heal2") then
        BuffAhoyHealzorTwo()
  end
  if (msg=="heal3") then
        BuffAhoyHealzorThree()
  end
  if (msg=="cleanse1") then
        BuffAhoyCleanzorOne()
  end
  if (msg=="cleanse2") then
        BuffAhoyCleanzorTwo()   
  end
  if (msg=="protect1") or (msg=="protect") then
        BuffAhoyProtectzorOne() 
  end
  if (msg=="multi1") then
        MultiCastSetEin()       
  end
  if (msg=="multi2") then
        MultiCastSetZwei()      
  end
  if (msg=="shoutcast1") or (msg=="shout1") then
        ShoutCastEin()
  end
  if (msg=="shoutcast2") or (msg=="shout2") then
        ShoutCastZwei()
  end
  if (msg=="shoutcast3") or (msg=="shout3") then
        ShoutCastDrei()
  end
  if (msg=="shoutcast4") or (msg=="shout4") then
        ShoutCastVier()
  end
  if (msg=="PPT") then
        PPTFrame:Show()
  end
  if (msg=="announce") then
        if not BA[plyr].buffbeginannounce then
                BA_ExecuteVersionChanges()
        end
        if BA[plyr].buffbeginannounce==0 then
                BA[plyr].buffbeginannounce=1
                DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ANNOUNCE_ON)
        elseif BA[plyr].buffbeginannounce==1 then
                BA[plyr].buffbeginannounce=0
                DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ANNOUNCE_OFF)
        end
  end
  if (msg=="panic") then
        Panic()
  end
  if (msg=="help") then
     DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_SLASHHELP1)
     DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_SLASHHELP2)
     DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_SLASHHELP3)
  end
end


-- Passive Targetting functions
function PlayerTarget()
  PartyTarget="player"
  if BA[plyr].PPTenabled==0 then
        TargetUnit(PartyTarget)
  end
end

function PartyTarget1()
  PartyTarget="party1"
  if BA[plyr].PPTenabled==0 then
        TargetUnit(PartyTarget)
  end
end

function PartyTarget2()
  PartyTarget="party2"
  if BA[plyr].PPTenabled==0 then
        TargetUnit(PartyTarget)
  end
end

function PartyTarget3()
  PartyTarget="party3"
  if BA[plyr].PPTenabled==0 then
        TargetUnit(PartyTarget)
  end
end

function PartyTarget4()
  PartyTarget="party4"
  if BA[plyr].PPTenabled==0 then
        TargetUnit(PartyTarget)
  end
end

function PetTargetMine()
  if UnitName("pet")~=nil then
  PartyTarget="pet"
        if BA[plyr].PPTenabled==0 then
                TargetUnit(PartyTarget)
        end
  elseif BA[plyr].statustext==1 then
        DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ERR_NOPET1)
  end
end

function PetTarget1()  
  if UnitName("partypet1")~=nil then
  PartyTarget="partypet1"
        if BA[plyr].PPTenabled==0 then
                TargetUnit(PartyTarget)
        end
  else
        if UnitName("party1")~=nil and BA[plyr].statustext==1 then
                DEFAULT_CHAT_FRAME:AddMessage(UnitName("party1")..BUFFAHOY_ERR_NOPET2)
        elseif BA[plyr].statustext==1 then
                DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ERR_NOPARTYMBR.." 1")
        end
  end
end

function PetTarget2()
  if UnitName("partypet2")~=nil then
  PartyTarget="partypet2"
        if BA[plyr].PPTenabled==0 then
                TargetUnit(PartyTarget)
        end
  else
        if UnitName("party2")~=nil and BA[plyr].statustext==1 then
                DEFAULT_CHAT_FRAME:AddMessage(UnitName("party2")..BUFFAHOY_ERR_NOPET2)
        elseif BA[plyr].statustext==1 then
                DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ERR_NOPARTYMBR.." 2")
        end
  end
end

function PetTarget3()
  if UnitName("partypet3")~=nil then
  PartyTarget="partypet3"
        if BA[plyr].PPTenabled==0 then
                TargetUnit(PartyTarget)
        end
  else
        if UnitName("party3")~=nil and BA[plyr].statustext==1 then
                DEFAULT_CHAT_FRAME:AddMessage(UnitName("party3")..BUFFAHOY_ERR_NOPET2)
        elseif BA[plyr].statustext==1 then
                DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ERR_NOPARTYMBR.." 3")
        end
  end
end

function PetTarget4()
  if UnitName("partypet4")~=nil then
  PartyTarget="partypet4"
        if BA[plyr].PPTenabled==0 then
                TargetUnit(PartyTarget)
        end
  else
        if UnitName("party4")~=nil and BA[plyr].statustext==1 then
                DEFAULT_CHAT_FRAME:AddMessage(UnitName("party4")..BUFFAHOY_ERR_NOPET2)
        elseif BA[plyr].statustext==1 then
                DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ERR_NOPARTYMBR.." 4")
        end
  end
end

function CustomPPTarget()
  if UnitName("target")~=nil then
        for i=1,40 do
                temptar="raid"..i
                if UnitName("target")==UnitName(temptar) then
                        PartyTarget="raid"..i
                        DEFAULT_CHAT_FRAME:AddMessage("PPT set to "..UnitName("raid"..i));
                end
                temptar="raidpet"..i
                if PartyTarget~="raidpet"..i and UnitName("target")==UnitName(temptar) then
                        PartyTarget="raidpet"..i
                        DEFAULT_CHAT_FRAME:AddMessage("PPT set to "..UnitName("raidpet"..i))
                end

        end
  end
end

--Buff macros (from GUI binds)
function BuffCastSetOne()
  if BA[plyr].RCFrameVar==3 then
        BuffCast("default1", BCS1.cooldown, BCS1[6], BCS1[1], BCS1[2], BCS1[3], BCS1[4], BCS1[5]);
--      BADebug("BC1 RCFrameVar",BA[plyr].RCFrameVar)
  else
        BBoC("BBOC1",RCcooldown)
--      BADebug("RS1 RCFrameVar",BA[plyr].RCFrameVar)
  end
end

--function BuffCastSetTwo()
--  if BA[plyr].RCFrameVar==3 then
--      BuffCast("default2", BCS2.cooldown, BCS2[6], BCS2[1], BCS2[2], BCS2[3], BCS2[4], BCS2[5]);
--      BADebug("BC2 RCFrameVar",BA[plyr].RCFrameVar)
--  else
--      BBoC("RCS1",RCcooldown)
--      BADebug("RS1 RCFrameVar",BA[plyr].RCFrameVar)
--  end
--end

function BuffCastSetTwo()
  if BA[plyr].RCFrameVar==3 then
        BuffCast("default2", BCScooldown, BCS3, BCS3, BCS3, BCS3, BCS3, BCS3);
--      BADebug("BC3 RCFrameVar",BA[plyr].RCFrameVar)
  else
        BBoC("BBoC2",RCcooldown, RCS2)
--      BADebug("RS2 RCFrameVar",BA[plyr].RCFrameVar)
  end
end

function BuffCastSetThree()
  if BA[plyr].RCFrameVar==3 then
        BuffCast("default3", BCScooldown, BCS4, BCS4, BCS4, BCS4, BCS4, BCS4);
--      BADebug("BC4 RCFrameVar",BA[plyr].RCFrameVar)
  else
        BBoC("BBoC3",RCcooldown, RCS3)
--      BADebug("RS3 RCFrameVar",BA[plyr].RCFrameVar)
  end
end

function BuffAhoyHealzorOne()
  Healzor(HZR1);
end

function BuffAhoyHealzorTwo()
  Healzor2(HZR2);
end

function BuffAhoyHealzorThree()
  Healzor3(HZR3);
end

function BuffAhoyCleanzorOne()
  Cleanzor(CZR1);
end


function BuffAhoyCleanzorTwo()
  Cleanzor2(CZR2);
end

function BuffAhoyProtectzorOne()
  Protectzor(PZR1);
end

function MultiCastSetEin()
        if BA[plyr].multiverbosity==1 then
                MultiShoutCast("mscdefault",MCS1.cooldown, MCS1[1], nil, MCS1[2], nil, MCS1[3], nil, MCS1[4], nil, MCS1[5], nil, MCS1[6], nil)
        else
                MultiCast("mcdefault",MCS1.cooldown, MCS1[1], MCS1[2], MCS1[3], MCS1[4], MCS1[5], MCS1[6])
        end
end
function MultiCastSetZwei()
        if BA[plyr].multiverbosity==1 then
                MultiShoutCast("mscdefault",MCS2.cooldown, MCS2[1], nil, MCS2[2], nil, MCS2[3], nil, MCS2[4], nil, MCS2[5], nil, MCS2[6], nil)
        else
                MultiCast("mcdefault",MCS2.cooldown, MCS2[1], MCS2[2], MCS2[3], MCS2[4], MCS2[5], MCS2[6])
        end
end
function ShoutCastEin()
        ShoutCast(SCT1, nil, BA[plyr].SC1_Verbose, BA[plyr].SC1_SC)
end
function ShoutCastZwei()
        ShoutCast(SCT2, nil, BA[plyr].SC2_Verbose, BA[plyr].SC2_SC)
end
function ShoutCastDrei()
        ShoutCast(SCT3, nil, BA[plyr].SC3_Verbose, BA[plyr].SC3_SC)
end
function ShoutCastVier()
        ShoutCast(SCT4, nil, BA[plyr].SC4_Verbose, BA[plyr].SC4_SC)
end

--#################Logic Functions#####################
--Check for mana, cooldown, etc
function UsableCheck(spellid, verbose, manastring, cdstring, oorstring)
   local isUsable
   local notEnoughMana
   local inRange
   local start
   local duration
   local enable
   local castme
   if spellid>=1 and spellid<=120 then
        -- run the check
        isUsable, notEnoughMana = IsUsableAction(spellid)
        inRange = IsActionInRange(spellid)
        start, duration, enable = GetActionCooldown(spellid)
   else
        --id out of bounds, for now just default everything (maybe add error and return later)
        isUsable=true;
        notEnoughMana=false;
        start=0
        duration=0
        enable=0
   end
   if ( start > 0 and duration > 0 and enable > 0) then
        if cdstring~=nil and BA[plyr].statustext==1 then
                DEFAULT_CHAT_FRAME:AddMessage(cdstring);
        elseif BA[plyr].statustext==1 then
                DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ERR_WAIT);     
        end
        return nil;
   elseif (notEnoughMana) then
        if (verbose==1 and manastring~=nil) then
                if UnitName("target")~= nil and UnitIsFriend("player","target") then
                        SendChatMessage(manastring .. " %T!!" , whovar)
                elseif UnitName(PartyTarget)~=nil then
                        SendChatMessage(manastring.." "..UnitName(PartyTarget) .."!!",whovar)
                end  
        elseif (verbose==1 and manastring==nil and BA[plyr].statustext==1) then
                DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ERR_MANA)
        end
        return nil;
   elseif inRange == 0 then
        if oorstring~=nil and BA[plyr].statustext==1 then
                DEFAULT_CHAT_FRAME:AddMessage(oorstring)
        elseif BA[plyr].statustext==1 then
                DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ERR_RANGE);
        end
        return nil;
   else
        return 1;
   end

end

--Smartcasting and PPT logic
function SmartPPT(spellid, saystring, verbose, smart)
        if verbose==nil then verbose=1 end;
        if smart==nil then smart=1 end;
--      BADebug("Shift", IsShiftKeyDown())
--      BADebug("SCenabled", BA[plyr].SCenabled)
--      BADebug("smart",smart)
        if (IsShiftKeyDown() and BA[plyr].SCenabled==1 and BA[plyr].ShiftAlt==2 and smart==1) then
                BAUseAction(spellid,1,1)
        elseif (IsAltKeyDown() and BA[plyr].SCenabled==1 and  BA[plyr].ShiftAlt==1 and smart==1) then
                BAUseAction(spellid,1,1)
        elseif (IsControlKeyDown() and BA[plyr].SCenabled==1 and  BA[plyr].ShiftAlt==3 and smart==1) then
                BAUseAction(spellid,1,1)
        else
                if (BA[plyr].PPTenabled==0 and not UnitIsFriend("player","target") ) then
                        if (PartyTarget~=nil and UnitName(PartyTarget)~=nil) then
                                TargetUnit(PartyTarget)
                        else
                                TargetByName(PartyTarget)
                        end
                end
                BAUseAction(spellid,1,0)
                castFlag=true;
                tempverb=verbose;
                BuffAhoyNameGrab(spellid)
                if UnitName("target")~=nil and UnitIsFriend("player","target") then
                        SpellTargetUnit("target")
                        if (saystring~=nil and verbose==1) then
                                SendChatMessage(saystring.." "..UnitName("target").." with "..BuffAhoyNameArray[spellid],whovar)
                        elseif verbose==1 then
                                SendChatMessage("Casting " .. BuffAhoyNameArray[spellid].." on "..UnitName("target"),whovar)
                        end
                elseif (PartyTarget~=nil and UnitName(PartyTarget)~=nil) then
                        SpellTargetUnit(PartyTarget)
                        if (saystring~=nil and verbose==1) then
                                SendChatMessage(saystring.." "..UnitName(PartyTarget).." with "..BuffAhoyNameArray[spellid],whovar)
                        elseif verbose==1 and UnitName(PartyTarget)~=nil then
                                SendChatMessage("Casting " .. BuffAhoyNameArray[spellid].." on "..UnitName(PartyTarget),whovar)
                        elseif UnitName(PartyTarget)==nil and BA[plyr].statustext==1 then
                                DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_PPT_NOT_VALID)
                        end
--              elseif PartyTarget~=nil then
--                      TargetByName(PartyTarget)
--                      if (saystring~=nil and verbose==1) then
--                              SendChatMessage(saystring.." "..PartyTarget.." with "..BuffAhoyNameArray[spellid],whovar)
--                      elseif verbose==1 then
--                              SendChatMessage("Casting " .. BuffAhoyNameArray[spellid].." on "..PartyTarget,whovar)
--                      end
                end
        

        end
        --clear target if spell failed
        if SpellIsTargeting() then
                SpellStopTargeting()
        end
end



-- Buff macro (now pet-friendly)
function BuffCast(cast_id, reset_timeout, petid, ...)

   -- if we haven't seen the cast_id before, initialize the time and step
   if not BA_step_data[cast_id] then
      BA_step_data[cast_id] = {}
      BA_step_data[cast_id]['last_time'] = 0
      BA_step_data[cast_id]['cast_step'] = 1
   end

   local now = GetTime()

   -- if the timeout has been reached, always revert to step 1
   if reset_timeout and now - BA_step_data[cast_id].last_time >= reset_timeout then
      BA_step_data[cast_id]['cast_step'] = 1
      petFlag = false
        if BA[plyr].buffbeginannounce==1 then
                SendChatMessage(BUFFAHOY_GATHER_START..UnitName("player")..BUFFAHOY_GATHER_END);
        end
   end
   
   -- update the time at which the this id was invoked
   BA_step_data[cast_id]['last_time'] = now

   -- local var for passing to UsableCheck, to determine verbosity
   if (BA[plyr].BuffCast_Verbose==1 or BA[plyr].BuffCast_Quiet==1) then 
        local talky=1;
   else
        local talky=0;
   end

   -- Check for target's existence, should stop if there is an online party member in the appropriate slot
--   if GetNumPartyMembers()>0 then
--      tarvar=playa[BA_step_data[cast_id].cast_step]
--      rpvar="party"
--      maxno=5
--   end
--   BADebug("tarvar",tarvar)
--   spellid=ClassSpecificBuffs(UnitClass(tarvar))
--   BADebug("UnitClass",UnitClass(tarvar))
--   BADebug("spellid",spellid)

--   BADebug("UnitName",UnitName(tarvar))
--   BADebug("maxno",maxno)
   while (UnitName(playa[BA_step_data[cast_id].cast_step])==nil or not HasAction(arg[BA_step_data[cast_id].cast_step])) and BA_step_data[cast_id].cast_step<table.getn( arg ) do
                BA_step_data[cast_id].cast_step = BA_step_data[cast_id].cast_step + 1
--              tarvar=playa[BA_step_data[cast_id].cast_step]

--              BADebug("stepper",BA_step_data[cast_id].cast_step)
                BADebug("UnitName",UnitName(playa[BA_step_data[cast_id].cast_step]))
--              BADebug("spellid", spellid)
--              BADebug("tarvar",tarvar)
   end


   -- local var to make code simpler
   iter=BA_step_data[cast_id]['cast_step']

   if UnitName("target")~= nil and UnitIsFriend("player","target") then
        ClearTarget()   
   end

   if BA[plyr].manabuff == 1 and UnitAffectingCombat("player")==nil then
        TargetUnit(playa[iter])
   end  

   --check for mana, cooldown, range, etc
   if (UsableCheck(arg[iter],talky)) then
   --Name Grab, for verbosity
   BuffAhoyNameGrab(arg[iter]);


   -- cast the appropriate spell

        if HasAction(arg[iter]) then
        if UnitName(playa[iter]) ~= nil then
                if petFlag==true then
                        BuffAhoyNameGrab(petid);
                        castFlag=true;
                        tempverb=BA[plyr].BuffCast_Verbose;
                        if BA[plyr].PPTenabled==0 or (BA[plyr].manabuff == 1 and UnitAffectingCombat("player")==nil) then TargetUnit(peta[iter]) end
                        BAUseAction(petid,1,0)
                        SpellTargetUnit(peta[iter]) 
                        petFlag=false
                        if BA[plyr].BuffCast_Verbose==1 then
                                SendChatMessage("Buffing " .. UnitName(peta[iter]) .. " with " .. BuffAhoyNameArray[petid] , whovar)
                        elseif BA[plyr].BuffCast_Quiet==1 then
                                DEFAULT_CHAT_FRAME:AddMessage("Buffing " .. UnitName(peta[iter]) .. " with " .. BuffAhoyNameArray[petid] )
                        end

                else
                        castFlag=true;
                        tempverb=BA[plyr].BuffCast_Verbose
                        if BA[plyr].PPTenabled==0 then TargetUnit(playa[iter]) end
                        BAUseAction(arg[iter],1,0)
                        SpellTargetUnit(playa[iter])
                        if BA[plyr].BuffCast_Verbose==1 then
                                SendChatMessage(BUFFAHOY_BUFFING_ONE .. UnitName(playa[iter]).. BUFFAHOY_BUFFING_TWO .. BuffAhoyNameArray[arg[iter]], whovar)

                        elseif BA[plyr].BuffCast_Quiet==1 then
                                DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_BUFFING_ONE .. UnitName(playa[iter]).. BUFFAHOY_BUFFING_TWO .. BuffAhoyNameArray[arg[iter]])
                        end
                        if UnitExists(peta[iter]) and GetPetPhaseInfo(peta[iter]) then
                                petFlag=true
                                BA_step_data[cast_id].cast_step = BA_step_data[cast_id].cast_step - 1
                        end
                end
--      elseif BA[plyr].statustext==1 then
--                      DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ERR_NOPARTYMBR.." ".. (iter-1) );     
        end
        end
       -- advance the step by one
        BA_step_data[cast_id].cast_step = BA_step_data[cast_id].cast_step + 1

       --clear target if spell failed
        if SpellIsTargeting() then
                SpellStopTargeting()
        end
  
       -- set the step back to 1 if we've overflown the total number
        if BA_step_data[cast_id].cast_step > table.getn( arg ) then
                BA_step_data[cast_id].cast_step = 1
                UIErrorsFrame:AddMessage("Buff Sequence Finished", 0.8, 0.8, 0.2, 1.0, UIERRORS_HOLD_TIME);
                DEFAULT_CHAT_FRAME:AddMessage("Buff Sequence Finished", 0.8, 0.8, 0.2);
        end
   
   end

end




--Heal script
function Healzor(spellid, ...)
   
   if (UsableCheck(spellid, BA[plyr].Healzor_Verbose, BUFFAHOY_NO_MANA_TO_HEAL) or (BA[plyr].Healzor_Smartcastable==1 and ( (IsShiftKeyDown() and BA[plyr].ShiftAlt==2) or (IsAltKeyDown() and BA[plyr].ShiftAlt==1) or (IsControlKeyDown() and BA[plyr].ShiftAlt==3) ) ) ) then
--      SmartPPT(spellid, BUFFAHOY_HEALZOR_TEXT, BA[plyr].Healzor_Verbose, BA[plyr].Healzor_Smartcastable)
        SmartPPT(spellid, nil, BA[plyr].Healzor_Verbose, BA[plyr].Healzor_Smartcastable)
   end
end
function Healzor2(spellid, ...)
   
   if (UsableCheck(spellid, BA[plyr].Healzor_Verbose_Two, BUFFAHOY_NO_MANA_TO_HEAL) or (BA[plyr].Healzor_Smartcastable_Two==1 and ( (IsShiftKeyDown() and BA[plyr].ShiftAlt==2) or (IsAltKeyDown() and BA[plyr].ShiftAlt==1) or (IsControlKeyDown() and BA[plyr].ShiftAlt==3) ) ) ) then
--      SmartPPT(spellid, BUFFAHOY_HEALZOR_TEXT, BA[plyr].Healzor_Verbose_Two, BA[plyr].Healzor_Smartcastable_Two)
        SmartPPT(spellid, nil, BA[plyr].Healzor_Verbose_Two, BA[plyr].Healzor_Smartcastable_Two)
   end
end
function Healzor3(spellid, ...)
   
   if (UsableCheck(spellid, BA[plyr].Healzor_Verbose_Three, BUFFAHOY_NO_MANA_TO_HEAL) or (BA[plyr].Healzor_Smartcastable_Three==1 and ( (IsShiftKeyDown() and BA[plyr].ShiftAlt==2) or (IsAltKeyDown() and BA[plyr].ShiftAlt==1) or (IsControlKeyDown() and BA[plyr].ShiftAlt==3) ) ) ) then
--      SmartPPT(spellid, BUFFAHOY_HEALZOR_TEXT, BA[plyr].Healzor_Verbose_Three, BA[plyr].Healzor_Smartcastable_Three)
        SmartPPT(spellid, nil, BA[plyr].Healzor_Verbose_Three, BA[plyr].Healzor_Smartcastable_Three)
   end
end


-- Cleanse script
function Cleanzor(spellid)

   if (UsableCheck(spellid, BA[plyr].Cleanzor_Verbose) or (BA[plyr].Cleanzor_Smartcastable==1 and ( (IsShiftKeyDown() and BA[plyr].ShiftAlt==2) or (IsAltKeyDown() and BA[plyr].ShiftAlt==1) or (IsControlKeyDown() and BA[plyr].ShiftAlt==3) ) ) ) then
--      SmartPPT(spellid, BUFFAHOY_CLEANZOR_TEXT, BA[plyr].Cleanzor_Verbose, BA[plyr].Cleanzor_Smartcastable)
        SmartPPT(spellid, nil, BA[plyr].Cleanzor_Verbose, BA[plyr].Cleanzor_Smartcastable)
   end
end
function Cleanzor2(spellid)

   if (UsableCheck(spellid, BA[plyr].Cleanzor_Verbose_Two) or (BA[plyr].Cleanzor_Smartcastable_Two==1 and ( (IsShiftKeyDown() and BA[plyr].ShiftAlt==2) or (IsAltKeyDown() and BA[plyr].ShiftAlt==1) or (IsControlKeyDown() and BA[plyr].ShiftAlt==3) ) ) ) then
--      SmartPPT(spellid, BUFFAHOY_CLEANZOR_TEXT, BA[plyr].Cleanzor_Verbose_Two, BA[plyr].Cleanzor_Smartcastable_Two)
        SmartPPT(spellid, nil, BA[plyr].Cleanzor_Verbose_Two, BA[plyr].Cleanzor_Smartcastable_Two)
   end
end 


--Blessing of Protection script
function Protectzor(spellid)

   if (UsableCheck(spellid, BA[plyr].Protectzor_Verbose, BUFFAHOY_NO_MANA_TO_PROT) or (BA[plyr].Protectzor_Smartcastable==1 and ( (IsShiftKeyDown() and BA[plyr].ShiftAlt==2) or (IsAltKeyDown() and BA[plyr].ShiftAlt==1) or (IsControlKeyDown() and BA[plyr].ShiftAlt==3) ) ) ) then
        if (UnitName("target")~=nil and UnitIsFriend("player","target")) then
                temp=nil;
                for i=1,5,1 do
                        if UnitName(playa[i])~=nil then
                                if UnitName("target")==UnitName(playa[i]) then
                                        SmartPPT(spellid, nil, BA[plyr].Protectzor_Verbose, BA[plyr].Protectzor_Smartcastable)
                                        temp=1;                         
                                end
                        end
                end
                if temp~=1 then
                        for i=1,40,1 do
                                if UnitName("raid"..i)~=nil then
                                        if UnitName("target")==UnitName("raid"..i) then
                                                SmartPPT(spellid, nil, BA[plyr].Protectzor_Verbose, BA[plyr].Protectzor_Smartcastable)
                                                temp=1;                         
                                        end
                                end
                        end
                end
                if temp~=1 and BA[plyr].statustext==1 then      
                        DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_PROT_ERROR) 
                end
        else
                SmartPPT(spellid, nil, BA[plyr].Protectzor_Verbose, BA[plyr].Protectzor_Smartcastable)
        end
   end
end

      
--SmartCast script
function Smartzor(spellid, saystring, verbosity)
  --legacy function, kept only for backwards compatibility
  if (UsableCheck(spellid,1)) then
          SmartPPT(spellid, saystring, verbosity)
  end
end

--ShoutCast script
function ShoutCast(spellid, saystring, verbose, smart)
   if verbose==nil then verbose=1 end
   if smart==nil then smart=1 end
   if (UsableCheck(spellid, 1)) then
        BuffAhoyNameGrab(spellid);
--      if IsShiftKeyDown() and smart==1 then
        if smart==1 and ( (IsShiftKeyDown() and BA[plyr].ShiftAlt==2) or (IsAltKeyDown() and BA[plyr].ShiftAlt==1) or (IsControlKeyDown() and BA[plyr].ShiftAlt==3)) then
                SmartPPT(spellid)
        elseif (UnitName("target")~=nil and not UnitIsFriend("player","target")) then
             -- cast spell on hostile
                BAUseAction(spellid,1,0)
                castFlag=true;
                SpellTargetUnit("target")
                if saystring~=nil and verbose==1 then
                        SendChatMessage(saystring.." "..UnitName("target"),whovar) 
                        tempverb=1;
                elseif verbose==1 then
                        SendChatMessage("Casting " .. BuffAhoyNameArray[spellid].." on %T",whovar)
                        tempverb=1;
                end
        elseif saystring ~= nil and UnitName("target")~=nil then
                SmartPPT(spellid, saystring, verbose, smart)
        else
--              SmartPPT(spellid, BUFFAHOY_SHOUTCAST_TEXT .. BuffAhoyNameArray[spellid] .. BUFFAHOY_SHOUTCAST_TEXT2, verbose, smart)
                SmartPPT(spellid, nil, verbose, smart)
        end
        successful=true
   else
        successful=false
   end
   return successful;
end


-- MultiCast script (similar to CastAway)
function MultiCast (cast_id, reset_timeout, ...)

   -- if we haven't seen the cast_id before, initialize the time and step
   if not BA_step_data[cast_id] then
      BA_step_data[cast_id] = {}
      BA_step_data[cast_id]['last_time'] = 0
      BA_step_data[cast_id]['cast_step'] = 1
   end

   local stepper = BA_step_data[cast_id]
   local now = GetTime()

   -- if the timeout has been reached, always revert to step 1
   if reset_timeout and now - stepper['last_time'] >= reset_timeout then
      stepper['cast_step'] = 1
   end
   
   -- local var to make code simpler
   iter=stepper['cast_step']

   -- update the time at which the this id was invoked
   stepper['last_time'] = now

   -- cast the appropriate spell
   if (UsableCheck(arg[iter], 1)) then


        BAUseAction(arg[iter],1,0)
          
     
     -- advance the step by one
     stepper['cast_step'] = stepper['cast_step'] + 1

     -- set the step back to 1 if we've overflown the total number
     if stepper['cast_step'] > table.getn( arg ) then
        stepper['cast_step'] = 1
     end
     
   end
end


-- MultiShoutCast script (also similar to CastAway)
function MultiShoutCast (cast_id, reset_timeout, ...)

   -- if we haven't seen the cast_id before, initialize the time and step
   if not BA_step_data[cast_id] then
      BA_step_data[cast_id] = {}
      BA_step_data[cast_id]['last_time'] = 0
      BA_step_data[cast_id]['cast_step'] = 1
   end

   local stepper = BA_step_data[cast_id]
   local now = GetTime()

   -- if the timeout has been reached, always revert to step 1
   if reset_timeout and now - stepper['last_time'] >= reset_timeout then
      stepper['cast_step'] = 1
   end
   
   -- local var to make code simpler
   iter=stepper['cast_step']

   -- update the time at which the this id was invoked
   stepper['last_time'] = now

   -- cast the appropriate spell 
 
   if HasAction(arg[iter]) then
        successful=ShoutCast(arg[iter],arg[iter+1])          
  
         -- advance the step by two
        if successful==true then
        stepper['cast_step'] = stepper['cast_step'] + 2
        end
   elseif (not HasAction(arg[iter])) then
         -- advance the step by two
        if successful==true then
        stepper['cast_step'] = stepper['cast_step'] + 2
        end
   end
   -- set the step back to 1 if we've overflown the total number
   if stepper['cast_step'] > table.getn( arg ) then
      stepper['cast_step'] = 1
   end
     
end



--BandAid script
function BandAid( spellname, bag, slot )


   -- if we haven't seen the cast_id before, initialize the time and step
   if not BA_step_data[BandAid] then
      BA_step_data[BandAid] = {}
      BA_step_data[BandAid]['last_time'] = 0
      BA_step_data[BandAid]['cast_step'] = 1
   end

   local stepper = BA_step_data[BandAid]
   local now = GetTime()

   -- if the timeout has been reached, always revert to step 1
   if now - stepper['last_time'] >= 5 then
      stepper['cast_step'] = 1
   end
   
   -- local var to make code simpler
   iter=stepper['cast_step']

   -- update the time at which the this id was invoked
   stepper['last_time'] = now

   if iter==1 then
      CastSpellByName(spellname)
   elseif iter==2 then
       UseContainerItem(bag,slot)
       SpellTargetUnit("player")
       DEFAULT_CHAT_FRAME:AddMessage("Bandaging");     
   end 
   

   -- advance the step by one
   stepper['cast_step'] = stepper['cast_step'] + 1

   -- set the step back to 1 if we've overflown the total number
   if stepper['cast_step'] > 2 then
      stepper['cast_step'] = 1
   end
     
end

--##########BBoC Casting Functions####################



function ClassSpecificBuffs(class)
        if class==BUFFAHOY_PALADIN or class==BUFFAHOY_SHAMAN then
                spellid=RCPalSha;   
        elseif class==BUFFAHOY_PRIEST then
                spellid=RCPriest;
        elseif class==BUFFAHOY_MAGE then
                spellid=RCMage;
        elseif class==BUFFAHOY_WARRIOR then
                spellid=RCWarrior;
        elseif class==BUFFAHOY_WARLOCK then
                spellid=RCWarlock;
        elseif class==BUFFAHOY_ROGUE then
                spellid=RCRogue;
        elseif class==BUFFAHOY_HUNTER then
                spellid=RCHunter;
        elseif class==BUFFAHOY_DRUID then
                spellid=RCDruid;
        elseif class==nil then
                spellid=-1;
        else
                DEFAULT_CHAT_FRAME:AddMessage("Error: Unknown Class")
                spellid=-1;
        end
        return spellid
end

function IsTargetLegal(tarvar, spellid, idno)
                        -- find a legal target.  Assume we have one, and run a series of checks on them.  
                        --If legaltarget is still true after all of the checks, then we have a target we can cast on.
                        legaltarget=true
                        -- Unit doesn't exist, or unit type isn't recognized
                        if UnitName(tarvar)==nil or spellid==-1 then
                                legaltarget=nil
                        -- unit type isn't getting buffed
                        elseif not HasAction(spellid) then
                                legaltarget=nil
                        -- Unit is in a group that's excluded
                        elseif GetGroupBuffStatus(idno)==0 then
                                legaltarget=nil
                        -- Unit class already has a Greater Blessing
                        elseif BA_GroupBuff[UnitClass(tarvar)]==2 and petFlag==false then
                                legaltarget=nil 
                                BADebug("GROUP_BUFF_PREVENT",100)
                        end
                        return legaltarget
end

function BBoC(cast_id, reset_timeout, id)
        local rpvar
        local tarvar
        local maxno
        local itervar
        local legaltarget

        -- if we haven't seen the cast_id before, initialize the time and step
        if not BA_step_data[cast_id] then
      BA_step_data[cast_id] = {}
      BA_step_data[cast_id]['last_time'] = 0
      BA_step_data[cast_id]['cast_step'] = 1
      BA_step_data[cast_id]['currnum']=0;
        end

   --local variables to make the coding easier
        local now = GetTime()

   -- if the timeout has been reached, always revert to step 1
        if reset_timeout and now - BA_step_data[cast_id].last_time >= reset_timeout then
                BA_step_data[cast_id].cast_step = 1
                BA_step_data[cast_id].currnum = 0
                petFlag = false
                -- reset group buff variables
        --      for i=1,GetNumRaidMembers(),1 do
                --      BA_GroupBuff[UnitClass("raid"..i)]=0
                --end
                BA_GroupBuff[BUFFAHOY_PRIEST]=0
                BA_GroupBuff[BUFFAHOY_MAGE]=0
                BA_GroupBuff[BUFFAHOY_DRUID]= 0
                BA_GroupBuff[BUFFAHOY_WARRIOR]=0
                BA_GroupBuff[BUFFAHOY_HUNTER]=0
                BA_GroupBuff[BUFFAHOY_WARLOCK]=0
                BA_GroupBuff[BUFFAHOY_ROGUE]=0
                BA_GroupBuff[BUFFAHOY_PALADIN]=0
                BA_GroupBuff[BUFFAHOY_SHAMAN]=0 

--              BADebug("ann",BA[plyr].buffbeginannounce)
                if BA[plyr].buffbeginannounce==1 then
                        SendChatMessage(BUFFAHOY_GATHER_START..UnitName("player")..BUFFAHOY_GATHER_END);
                end
        end
   
   -- update the time at which the this id was invoked
   BA_step_data[cast_id].last_time = now


   -- Check for target's existence, should stop if there is an online party member in the appropriate slot
   if GetNumRaidMembers()>0 and BA[plyr].forceparty==0 then
        itervar=41-BA_step_data[cast_id].cast_step
        tarvar="raid"..itervar
        tarpetvar="raidpet"..itervar
        rpvar="raid"
        maxno=40
   else
        tarvar=playa[BA_step_data[cast_id].cast_step]
        tarpetvar=peta[BA_step_data[cast_id].cast_step]
        rpvar="party"
        maxno=5
   end
--   BADebug("tarvar",tarvar)
   if id==nil then
        spellid=ClassSpecificBuffs(UnitClass(tarvar))
   else
        spellid=id
   end

--   BADebug("UnitClass",UnitClass(tarvar))
--   BADebug("spellid",spellid)
--      BADebug("tarvar0",tarvar)
--      BADebug("UnitName0",UnitName(tarvar))
--   BADebug("maxno",maxno)

        -- find a legal target.  Assume we have one, and run a series of checks on them.  
        --If legaltarget is still true after all of the checks, then we have a target we can cast on.
--      legaltarget=IsTargetLegal(tarvar, spellid, GetNumRaidMembers()+1-BA_step_data[cast_id].cast_step)
        --GetNumRaidMembers()+
        while (IsTargetLegal(tarvar, spellid, 41-BA_step_data[cast_id].cast_step)==nil and BA_step_data[cast_id].cast_step<maxno) do
--   while (UnitName(tarvar)==nil or spellid==-1 or not HasAction(spellid) or GetGroupBuffStatus(GetNumRaidMembers()+1-BA_step_data[cast_id].cast_step)==0) and BA_step_data[cast_id].cast_step<maxno do
                BA_step_data[cast_id].cast_step = BA_step_data[cast_id].cast_step + 1
                if GetNumRaidMembers()>0 and BA[plyr].forceparty==0 then
                        itervar=41-BA_step_data[cast_id].cast_step
                        tarvar="raid"..itervar
                else
                        tarvar=playa[BA_step_data[cast_id].cast_step]
                end
                if id==nil then
                        spellid=ClassSpecificBuffs(UnitClass(tarvar))
                else
                        spellid=id;
                end

                -- find a legal target.  Assume we have one, and run a series of checks on them.  
                --If legaltarget is still true after all of the checks, then we have a target we can cast on.
--              legaltarget=IsTargetLegal(tarvar, spellid, GetNumRaidMembers()+1-BA_step_data[cast_id].cast_step)
                
--              BADebug("stepper",BA_step_data[cast_id].cast_step)
--              BADebug("itervar1", spellid)
--              BADebug("tarvar1",tarvar)
--              BADebug("UnitName1",UnitName(tarvar))
   end

-- Now we should have a legal target, or else we're at the end of the buff sequence


        --more local variables to make the coding easier
        local iter = BA_step_data[cast_id].cast_step


        -- local var for passing to UsableCheck, to determine verbosity
        local talky;
        if (BA[plyr].BuffCast_Verbose==1 or BA[plyr].BuffCast_Quiet==1) then 
                talky=1
        else
                talky=0
        end
--   DEFAULT_CHAT_FRAME:AddMessage("Starting Cast Sequence", 0.8, 0.8, 0.2)
--   BADebug("spellid3",spellid)

        -- if target is friendly, clear target
        if UnitName("target")~= nil and UnitIsFriend("player","target")  then
                ClearTarget()
        end

        -- if we have the "Wait for mana/range" option checked, and we're not in combat, target the person being buffed
        if BA[plyr].manabuff == 1 and UnitAffectingCombat("player")==nil then
                TargetUnit(tarvar)
        end     

        --check for mana, cooldown, range, etc
                --BADebug("usable",UsableCheck(spellid,talky))
        if (UsableCheck(spellid,talky)) then
                --Name Grab, for verbosity
                BuffAhoyNameGrab(spellid);
                --BADebug("stepbefore",BA_step_data[cast_id].cast_step)
                -- cast the appropriate spell
        if HasAction(spellid) then
                        if UnitName(tarvar) ~= nil then
                                if petFlag==true and UnitName(tarpetvar)~=nil then
                                        castFlag=true;
                                        BA_step_data[cast_id].currnum = BA_step_data[cast_id].currnum + 1;
                                        if BA[plyr].PPTenabled==0 or (BA[plyr].manabuff == 1 and UnitAffectingCombat("player")==nil) then TargetUnit(tarpetvar) end
                                        if id==nil then spellid=RCPet1 end
                                        BAUseAction(spellid,1,0)
                                        SpellTargetUnit(tarpetvar)
                                        petFlag=false
                                        if BA[plyr].BuffCast_Verbose==1 then
                                                SendChatMessage(BUFFAHOY_BUFFING_ONE .. UnitName(tarpetvar) .. BUFFAHOY_BUFFING_TWO .. BuffAhoyNameArray[spellid].."   (".. BA_step_data[cast_id].currnum .."/"..GetMaxNum(id)..")", whovar)
                                        elseif BA[plyr].BuffCast_Quiet==1 then
                                                DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_BUFFING_ONE .. UnitName(tarpetvar) .. BUFFAHOY_BUFFING_TWO .. BuffAhoyNameArray[RCPet1].."   (".. BA_step_data[cast_id].currnum .."/"..GetMaxNum(id)..")")
                                        end

                                else
                                        castFlag=true;
                                        failFlag=false; -- so that we can check for failure later
                                        --BADebug("s.find GB",string.find(BuffAhoyNameArray[spellid],BA_GREATER_BLESSING_TEXT,1,true))
                                        --BADebug("s.find B",string.find(BuffAhoyNameArray[spellid],"Blessing",1,true))
                                        if string.find(BuffAhoyNameArray[spellid],BA_GREATER_BLESSING_TEXT,1,true) then
                                                BA_GroupBuff[UnitClass(tarvar)]=1;
                                                BADebug("BA_GB",BA_GroupBuff[UnitClass(tarvar)])
                                                BA_step_data[cast_id].currnum=BA_step_data[cast_id].currnum + GetClassCounts(UnitClass(tarvar))
                                        else
                                                BA_step_data[cast_id].currnum=BA_step_data[cast_id].currnum + 1
                                        end
                                        tempverb=BA[plyr].BuffCast_Verbose;
                                        if BA[plyr].PPTenabled==0 then TargetUnit(tarvar) end
                                        BAUseAction(spellid,1,0)
                                        SpellTargetUnit(tarvar)
                                        if BA[plyr].BuffCast_Verbose==1 then
                                                if BA_GroupBuff[UnitClass(tarvar)]==1 then
                                                        SendChatMessage(BUFFAHOY_BUFFING_ONE .. UnitClass(tarvar).."s" .. BUFFAHOY_BUFFING_TWO .. BuffAhoyNameArray[spellid] .."   ("..BA_step_data[cast_id].currnum .."/"..GetMaxNum(id)..")", whovar)
                                                else
                                                        SendChatMessage(BUFFAHOY_BUFFING_ONE .. UnitName(tarvar) .. BUFFAHOY_BUFFING_TWO .. BuffAhoyNameArray[spellid] .."   ("..BA_step_data[cast_id].currnum .."/"..GetMaxNum(id)..")", whovar)
                                                end
                                        elseif BA[plyr].BuffCast_Quiet==1 then
                                                if BA_GroupBuff[UnitClass(tarvar)]==1 then
                                                        DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_BUFFING_ONE .. UnitClass(tarvar).."s"  .. BUFFAHOY_BUFFING_TWO .. BuffAhoyNameArray[spellid] .."   (".. BA_step_data[cast_id].currnum .."/"..GetMaxNum(id)..")")
                                                else
                                                        DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_BUFFING_ONE .. UnitName(tarvar) .. BUFFAHOY_BUFFING_TWO .. BuffAhoyNameArray[spellid] .."   (".. BA_step_data[cast_id].currnum .."/"..GetMaxNum(id)..")")
                                                end
                                        end
                                        if UnitExists(tarpetvar) and (HasAction(RCPet1) or id~=nil) and GetPetPhaseInfo(tarpetvar) then
                                                petFlag=true
                                                BA_step_data[cast_id].cast_step = BA_step_data[cast_id].cast_step-1
                                                --BADebug("step",BA_step_data[cast_id].cast_step)
                                        end
                                end
                        elseif BA[plyr].statustext==1 then
                                if GetNumRaidMembers()>0 then
                                        DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ERR_NORAIDMBR.. (iter) );     
                                else
                                        DEFAULT_CHAT_FRAME:AddMessage(BUFFAHOY_ERR_NOPARTYMBR.." "..(iter) );
                                end
                        end  --closes UnitName
                end  --closes HasAction

                -- advance the step by one
                BA_step_data[cast_id].cast_step=BA_step_data[cast_id].cast_step+1

       -- clear target if spell failed, handle Greater Blessing exceptions
                if SpellIsTargeting() then
                        --spell has failed
                        SpellStopTargeting()
                end
                --if spell was a greater blessing attempt and has failed
                if BA_GroupBuff[UnitClass(tarvar)]==1 and failFlag==true then

                        --reset the GB variable, so that it will attempt on the next member of that class
                        BA_GroupBuff[UnitClass(tarvar)]=0;
                        BADebug("GROUP_BUFF_RESET",BA_GroupBuff[UnitClass(tarvar)])

                        -- subtract off of the current number if there's another member of that class later
                        if GetClassCounts(UnitClass(tarvar))>1 then
                                BA_step_data[cast_id].currnum=BA_step_data[cast_id].currnum - GetClassCounts(UnitClass(tarvar))
                        end

                -- spell has succeeded, and it was a Greater Blessing attempt
                elseif BA_GroupBuff[UnitClass(tarvar)]==1 then

                        --mark that class as successful, so that future members of that class aren't buffed
                        BA_GroupBuff[UnitClass(tarvar)]=2
                        BADebug("GROUP_BUFF_SUCCESS",BA_GroupBuff[UnitClass(tarvar)])
                end
                
                --BADebug("step",BA_step_data[cast_id].cast_step)

                -- Check for next target's existence, should stop if there is an online party member in the appropriate slot
                if BA_step_data[cast_id].cast_step<=maxno then
                        if GetNumRaidMembers()>0 and BA[plyr].forceparty==0 then
                                itervar=41-BA_step_data[cast_id].cast_step
                                tarvar="raid"..itervar
                                tarpetvar="raidpet"..itervar
                                rpvar="raid"
                                maxno=40
                        else
                                tarvar=playa[BA_step_data[cast_id].cast_step]
                                tarpetvar=peta[BA_step_data[cast_id].cast_step]
                                rpvar="party"
                                maxno=5
                        end

                        --BADebug("stepafter",BA_step_data[cast_id].cast_step)
                        --BADebug("tarvar",tarvar)
                        if id==nil then
                                spellid=ClassSpecificBuffs(UnitClass(tarvar))
                        else
                                spellid=id;
                        end
                                --BADebug("UnitClass",UnitClass(tarvar))
                                --BADebug("spellid-pw",spellid)
        
                                --BADebug("UnitName-pw",UnitName(tarvar))
                                --BADebug("maxno",maxno)
                                --BADebug("tarvar-pw",tarvar)
                        while (IsTargetLegal(tarvar, spellid, 41-BA_step_data[cast_id].cast_step)==nil and BA_step_data[cast_id].cast_step<=maxno) do
--                      while (UnitName(tarvar)==nil or spellid==-1 or not HasAction(spellid) or GetGroupBuffStatus(GetNumRaidMembers()+1-BA_step_data[cast_id].cast_step)==0) and BA_step_data[cast_id].cast_step<=maxno do

                                BA_step_data[cast_id].cast_step = BA_step_data[cast_id].cast_step + 1
                                if BA_step_data[cast_id].cast_step<=maxno then
                                        if GetNumRaidMembers()>0 and BA[plyr].forceparty==0 then
                                                itervar=41-BA_step_data[cast_id].cast_step
                                                tarvar="raid"..itervar
                                                tarpetvar="raidpet"..itervar
                                        else
                                                tarvar=playa[BA_step_data[cast_id].cast_step]
                                                tarpetvar=peta[BA_step_data[cast_id].cast_step]
                                        end
                                        if id==nil then
                                                spellid=ClassSpecificBuffs(UnitClass(tarvar))
                                        else
                                                spellid=id
                                        end
                                end
                                        --BADebug("stepper-w",BA_step_data[cast_id].cast_step)
                                        --BADebug("itervar-w",itervar)
                                        --BADebug("UnitName-w",UnitName(tarvar))
                                        --BADebug("spellid-w", spellid)
                                        --BADebug("tarvar-w",tarvar)
                        end  --closes while loop
                end  --closes bug fix section
  
       -- set the step back to 1 if we've overflown the total number
        if (BA_step_data[cast_id].cast_step>maxno) then
                BA_step_data[cast_id].cast_step = 1
                BA_step_data[cast_id].currnum=0
                UIErrorsFrame:AddMessage("Buff Sequence Finished", 0.8, 0.8, 0.2, 1.0, UIERRORS_HOLD_TIME);
                DEFAULT_CHAT_FRAME:AddMessage("Buff Sequence Finished", 0.8, 0.8, 0.2);
                BA_GroupBuff[BUFFAHOY_PRIEST]=0
                BA_GroupBuff[BUFFAHOY_MAGE]=0
                BA_GroupBuff[BUFFAHOY_DRUID]= 0
                BA_GroupBuff[BUFFAHOY_WARRIOR]=0
                BA_GroupBuff[BUFFAHOY_HUNTER]=0
                BA_GroupBuff[BUFFAHOY_WARLOCK]=0
                BA_GroupBuff[BUFFAHOY_ROGUE]=0
                BA_GroupBuff[BUFFAHOY_PALADIN]=0
                BA_GroupBuff[BUFFAHOY_SHAMAN]=0 
        end
   
   end  --to close UsableCheck()

end     --closes function

function GetMaxNum(id)
        local temp1=0
        -- set all counts to zero
        BA_NumWarriors=0;
        BA_NumMages=0;
        BA_NumPriests=0;
        BA_NumDruids=0;
        BA_NumHunters=0;
        BA_NumWarlocks=0;
        BA_NumRogues=0;
        BA_NumPalSha=0;
        BA_NumPets=0;
                
        -- classify each raid member and add a count
        if GetNumRaidMembers()>0 and BA[plyr].forceparty==0 then
                --BADebug("raid members",GetNumRaidMembers())
                for i=1,GetNumRaidMembers(),1 do
                        -- check for group buffing
                        if GetGroupBuffStatus(i)~=0 then
                                -- add to class subtotals
                                if UnitClass("raid"..i)==BUFFAHOY_WARRIOR then
                                        BA_NumWarriors=BA_NumWarriors+1
                                elseif UnitClass("raid"..i)==BUFFAHOY_PRIEST then
                                        BA_NumPriests=BA_NumPriests+1
                                elseif UnitClass("raid"..i)==BUFFAHOY_DRUID then
                                        BA_NumDruids=BA_NumDruids+1
                                elseif UnitClass("raid"..i)==BUFFAHOY_MAGE then
                                        BA_NumMages=BA_NumMages+1
                                elseif UnitClass("raid"..i)==BUFFAHOY_HUNTER then
                                        BA_NumHunters=BA_NumHunters+1
                                elseif UnitClass("raid"..i)==BUFFAHOY_WARLOCK then
                                        BA_NumWarlocks=BA_NumWarlocks+1
                                elseif UnitClass("raid"..i)==BUFFAHOY_ROGUE then
                                        BA_NumRogues=BA_NumRogues+1
                                elseif UnitClass("raid"..i)==BUFFAHOY_PALADIN or UnitClass("raid"..i)==BUFFAHOY_SHAMAN then
                                        BA_NumPalSha=BA_NumPalSha+1
                                end
                        end
                        --BADebug("Paladins",BA_NumPalSha)
                        -- check for pets
                        if UnitExists("raidpet"..i) and GetPetPhaseInfo("raidpet"..i) and GetGroupBuffStatus(i)~=0  then
                                BA_NumPets=BA_NumPets+1
                        end
                end             
                        --add up number of people being buffed
                        if id~=nil then
                                temp1 = BA_NumWarriors + BA_NumMages + BA_NumPriests + BA_NumDruids + BA_NumHunters + BA_NumWarlocks + BA_NumRogues + BA_NumPalSha + BA_NumPets
                        else
                                if HasAction(RCWarrior) then temp1=temp1+BA_NumWarriors end
                                if HasAction(RCMage) then temp1=temp1+BA_NumMages       end
                                if HasAction(RCPriest) then temp1=temp1+BA_NumPriests   end
                                if HasAction(RCDruid) then temp1=temp1+BA_NumDruids     end
                                if HasAction(RCHunter) then temp1=temp1+BA_NumHunters   end
                                if HasAction(RCWarlock) then temp1=temp1+BA_NumWarlocks end
                                if HasAction(RCRogue) then temp1=temp1+BA_NumRogues     end
                                if HasAction(RCPalSha) then temp1=temp1+BA_NumPalSha    end
                                if HasAction(RCPet1) then temp1=temp1+BA_NumPets        end
                        end

-- old code             

--              temp1=GetNumRaidMembers()
--              for i=1,GetNumRaidMembers(),1 do
--                      if (not HasAction(RCWarrior) and UnitClass("raid"..i)=="Warrior") or (not HasAction(RCMage) and UnitClass("raid"..i)=="Mage") or (not HasAction(RCPriest) and UnitClass("raid"..i)=="Priest") or (not HasAction(RCDruid) and UnitClass("raid"..i)=="Druid") or (not HasAction(RCHunter) and UnitClass("raid"..i)=="Hunter") or (not HasAction(RCWarlock) and UnitClass("raid"..i)=="Warlock")or (not HasAction(RCRogue) and UnitClass("raid"..i)=="Rogue") or (not HasAction(RCPalSha) and (UnitClass("raid"..i)=="Paladin" or UnitClass("raid"..i)=="Shaman")) then
--                                      temp1=temp1-1;
--                      elseif GetGroupBuffStatus(i)==0 then
--                                      temp1=temp1-1;
--                      end
--                      if ((HasAction(RCPet1) or id~=nil) and UnitExists("raidpet"..i) and GetPetPhaseInfo("raidpet"..i)) then
--                              temp1=temp1+1 
--                      end
--              end


                return temp1

        elseif GetNumPartyMembers()>0 then
                BADebug("party members",GetNumPartyMembers())
                for i=1,GetNumPartyMembers()+1,1 do
                        -- add to class subtotals
                        if UnitClass(playa[i])==BUFFAHOY_WARRIOR then
                                BA_NumWarriors=BA_NumWarriors+1
                                BADebug("Warriors",BA_NumWarriors)
                        elseif UnitClass(playa[i])==BUFFAHOY_PRIEST then
                                BA_NumPriests=BA_NumPriests+1
                        elseif UnitClass(playa[i])==BUFFAHOY_MAGE then
                                BA_NumMages=BA_NumMages+1
                        elseif UnitClass(playa[i])==BUFFAHOY_DRUID then
                                BA_NumDruids=BA_NumDruids+1
                        elseif UnitClass(playa[i])==BUFFAHOY_HUNTER then
                                BA_NumHunters=BA_NumHunters+1
                        elseif UnitClass(playa[i])==BUFFAHOY_WARLOCK then
                                BA_NumWarlocks=BA_NumWarlocks+1
                                BADebug("Warlocks",BA_NumWarlocks)
                        elseif UnitClass(playa[i])==BUFFAHOY_ROGUE then
                                BA_NumRogues=BA_NumRogues+1
                        elseif UnitClass(playa[i])==BUFFAHOY_PALADIN or UnitClass(playa[i])==BUFFAHOY_SHAMAN then
                                BA_NumPalSha=BA_NumPalSha+1
                                BADebug("Pal or Sha",BA_NumPalSha)
                        end

                        -- check for pets
                        if UnitExists(peta[i]) and GetPetPhaseInfo(peta[i])  then
                                BA_NumPets=BA_NumPets+1
                        end
                end             
                
                --add up number of people being buffed
                if id~=nil then
                        temp1 = BA_NumWarriors + BA_NumMages + BA_NumPriests + BA_NumDruids + BA_NumHunters + BA_NumWarlocks + BA_NumRogues + BA_NumPalSha + BA_NumPets
                else
                        if HasAction(RCWarrior) then temp1=temp1+BA_NumWarriors end
                        if HasAction(RCMage) then temp1=temp1+BA_NumMages       end
                        if HasAction(RCPriest) then temp1=temp1+BA_NumPriests   end
                        if HasAction(RCDruid) then temp1=temp1+BA_NumDruids     end
                        if HasAction(RCHunter) then temp1=temp1+BA_NumHunters   end
                        if HasAction(RCWarlock) then temp1=temp1+BA_NumWarlocks end
                        if HasAction(RCRogue) then temp1=temp1+BA_NumRogues     end
                        if HasAction(RCPalSha) then temp1=temp1+BA_NumPalSha    end
                        if HasAction(RCPet1) then temp1=temp1+BA_NumPets        end
                end
                        
                        
--              temp1=GetNumPartyMembers()+1
--              for i=1,GetNumPartyMembers()+1,1 do
--                      if (not HasAction(RCWarrior) and UnitClass(playa[i])=="Warrior") or (not HasAction(RCMage) and UnitClass(playa[i])=="Mage") or (not HasAction(RCPriest) and UnitClass(playa[i])=="Priest") or (not HasAction(RCDruid) and UnitClass(playa[i])=="Druid") or (not HasAction(RCHunter) and UnitClass(playa[i])=="Hunter") or (not HasAction(RCWarlock) and UnitClass(playa[i])=="Warlock")or (not HasAction(RCRogue) and UnitClass(playa[i])=="Rogue") or (not HasAction(RCPalSha) and (UnitClass(playa[i])=="Paladin" or UnitClass(playa[i])=="Shaman")) then
--                                      temp1=temp1-1;
--                      end
--                      if (((HasAction(BCS1[6]) and BA[plyr].RCFrameVar==3) or (HasAction(RCPet1) and (BA[plyr].RCFrameVar==2 or BA[plyr].RCFrameVar==1)) or id~=nil) and UnitExists(peta[i]) and GetPetPhaseInfo(peta[i]) ) then 
--                              temp1=temp1+1
--                      end
--              end

                return temp1
        else
                BADebug("Alone",1)
                return 1
        end
end

function GetClassCounts(class)
        local tempx
        GetMaxNum()
        if class==BUFFAHOY_WARRIOR then
                tempx= BA_NumWarriors
        elseif class==BUFFAHOY_MAGE then
                tempx= BA_NumMages
        elseif class==BUFFAHOY_PRIEST then
                tempx= BA_NumPriests
        elseif class==BUFFAHOY_DRUID then
                tempx= BA_NumDruids
        elseif class==BUFFAHOY_HUNTER then
                tempx= BA_NumHunters
        elseif class==BUFFAHOY_WARLOCK then
                tempx= BA_NumWarlocks
        elseif class==BUFFAHOY_ROGUE then
                tempx= BA_NumRogues
        elseif class==BUFFAHOY_PALADIN or class==BUFFAHOY_SHAMAN then
                tempx= BA_NumPalSha
        end
        return tempx
end

function GetGroupBuffStatus(raidid)
        local trash1, trash2, groupno = GetRaidRosterInfo(raidid);
        return  BA[plyr]["group"][groupno]
end

function GetPetPhaseInfo(unit)
        local shifted=1;
        --BADebug("shifted before",shifted)
        for jj=1,16 do
                local ba_buff_text=UnitBuff(unit,jj)
                --BADebug("ba_buff_text",ba_buff_text)
                if ba_buff_text then
                        if string.find(ba_buff_text,"PhaseShift") then
                                shifted=nil;
                                --BADebug("shifted during",shifted)
                        end     
                end
                
        end
        return shifted;
end

function Panic()
   if UnitClass("player")=="Paladin" then
        -- check target first
        if UnitClass("target")~="Paladin" and UnitClass("target")~="Priest" then
                -- if the target is not in the party or raid
                if not UnitInParty("target") and not UnitInRaid("target") then
                        if UnitIsDead("target") then
                                ClearTarget()
                                -- target yourself, just to make absolutely sure our target has been cleared
                                TargetUnit("player")
                        end
                end
        end
        --Cast DI, we should have the spellcasting hand now     
        CastSpellByName("Divine Intervention")

        -- loop through the raid members if we're in a raid
        if GetNumRaidMembers()>0 then
                for kk=1,40 do
                        if UnitClass("raid"..kk) == "Paladin" or UnitClass("raid"..kk) == "Priest" and not UnitIsDead("raid"..kk) then
                                if UnitName("raid"..kk)~=UnitName("player") then
                                        TargetUnit("raid"..kk)
                                        SpellTargetUnit("raid"..kk)
                                        if not SpellIsTargeting() then
                                                SendChatMessage(BUFFAHOY_PANIC_TEXT ..UnitName("raid"..kk),whovar)
                                                break
                                        end
                                end
                        end
                end
                if SpellIsTargeting() then
                        for kk=1,40 do
                                if UnitClass("raid"..kk)=="Druid" and not UnitIsDead("raid"..kk) then
                                        if UnitName("raid"..kk)~=UnitName("player") then
                                                TargetUnit("raid"..kk)
                                                SpellTargetUnit("raid"..kk)
                                                if not SpellIsTargeting() then
                                                        SendChatMessage(BUFFAHOY_PANIC_TEXT ..UnitName("raid"..kk),whovar)
                                                        break
                                                end
                                        end
                                end
                        end
                end

        elseif GetNumPartyMembers()>0 then
                for kk=1,4 do
                        if UnitClass("party"..kk) == "Paladin" or UnitClass("party"..kk) == "Priest" and not UnitIsDead("party"..kk) then
                                TargetUnit("party"..kk)
                                SpellTargetUnit("party"..kk)
                                if not SpellIsTargeting() then
                                        SendChatMessage(BUFFAHOY_PANIC_TEXT ..UnitName("party"..kk),whovar)
                                        --BADebugVar=true
                                        BADebug("party","party"..kk)
                                        BADebug("name", UnitName("party"..kk) )
                                        BADebug("class",UnitClass("party"..kk))
                                        break
                                end
                        end
                end
                if SpellIsTargeting() then
                        for kk=1,4 do
                                if UnitClass("party"..kk)=="Druid" and not UnitIsDead("party"..kk) then
                                        TargetUnit("party"..kk)
                                        SpellTargetUnit("party"..kk)
                                        if not SpellIsTargeting() then
                                                SendChatMessage(BUFFAHOY_PANIC_TEXT ..UnitName("party"..kk),whovar)
                                                break
                                        end
                                end
                        end
                end
        end
        if SpellIsTargeting() then
                SpellStopTargeting()
                SendChatMessage(BUFFAHOY_PANIC_FAILED,whovar)
        end
   end
end
        

function BATEST(id)
        BAUseAction(id,1,0)
end

function BAWRITE(str)
        DEFAULT_CHAT_FRAME:AddMessage(str)
end

Generated by GNU Enscript 1.6.5.90.