BuffAhoy by Theck
version 1.45

    http://www.frontiernet.net/~gehring/BuffAhoy.htm

BuffAhoy is a casting suite for paladins and other spellcasters.  As of version 0.9, it now has a graphical
interface, which can be brought up via a slash command or bound to a hotkey through the Key Bindings interface.
This readme will be split into two parts, the first describing how to use the GUI, and the second describing
the functions this AddOn adds that can be used in macros.


    This AddOn makes extensive use of two features that are not native to WoW:

	Passive Party Targetting(TM)(ok not really TM)(i actually stole this from one of the stickied
	forum threads):
	  The passive party targetting, or PPT system, uses a variable to make it possible to cast
	  many spells on a party member while in combat, without switching away from your current 
	  target.  It's used in many of these functions, and requires that you bind keys to the four
	  PartyTarget#() functions (bindable through the Key Bindings interface).  I've found this
	  immensely useful -- it required a little shift of my usual play habits, but after you get
	  used to it it's much faster and easier than trying to click around and change targets all
	  the time.  It is (for the most part) optional, though i haven't gone to the trouble to code
	  each function so that it is actually disabled (if you don't want this, why are you downloading
	  the AddOn anyway?).  If people request this ability in the future, i might put some time into it,
	  but for now that's how it is.  Read the spell descriptions and you'll understand how PPT works.

------NOTE:  	As of version 1.4, it IS possible to get PPT and Telo's SelfCast to work together.  It only requires a simple addition
		to the SelfCast.lua file.  Just open the file, scroll down to the end, hit return a few times and add the following text:

			function BA_UseAction(id, type, self)
				lOriginal_UseAction(id, type, self);
			end

		This way, you can use BuffAhoy with PPT enabled and still use SelfCast.


	  Also i'd like to mention one "bug" with the PPT system:  So far i have not been able to get it to
	  recognize when the target is out of range, so often it will attempt to cast the spell and find out
	  the target is out of range, and thus fail, but still report to the party that the spell has been cast.
	  I'm pretty sure there's no way around this, because of the way the PPT system works and the limitations
	  of the API functions blizzard makes available to us.

	SmartCasting(TM)(again, not really)(very similar to Telo's SelfCast, but kinda different)
	  SmartCasting is similar to the SelfCast AddOn by Telo, but it's got 2 major differences:
		1) SelfCast uses Alt to cast on yourself
		2) SelfCast affects all spells  -- In this addon, only certain functions use the 
		   SmartCast system, others don't.  The readme should mention which ones do and don't.

	  My play style centers around Shift as my self-cast button, so that's what i've used in this
	  Addon.  You can choose Shift or Alt to be your self-cast button in the Options section of the GUI.  
	  The default is Alt.

     slash commands:
     	"/ba toggle"  will toggle all verbosity settings (this isn't really that useful, but it's there if you want it)
     	"/ba config"  will bring up both BuffAhoy configuration panels ('/ba buffs' and '/ba caster' still work, for legacy users)
     	"/ba help"    will display a very brief list of slash commands


I.  Quick-start guide to BuffAhoy.
  This will give you step by step instructions on how to get BuffAhoy set up for the first time.  

   1.  	Open the BuffAhoy zip file, and extract the contents to "C:\Program Files\World of Warcraft\Interface\Addons\".
	This should create a BuffAhoy folder underneath the AddOns folder.  Inside the BuffAhoy folder there should be 
	7 files.  If it looks like you've done this correctly, move on to step 2.
   2.	Start the game.  When you log into the server, you should see a message in the Chat log that says "Theck's BuffAhoy
	Loaded".  If you don't see this, go back to step 1.  If you do, or you're not sure, type "/ba config" at the chat
	line.  This should bring up the BuffAhoy configuration panel, if it doesn't, then go back to step 1.
   3.	Open your spellbook, and drag spells into the buffing configuration slots for each class.  You can also drag spells
	into any of the other functions in the interface.  If you're using a SelfCast addon, then you may want to disable
	PPT in the interface by unchecking "PPT enabled", or disable your SelfCast addon.
   4.	Now open the Key Bindings menu (Escape->Key Bindings) and scroll down to the "BuffAhoy Binds" section.  Bind keys to
	the following functions:
		Buff Sequence 1
		BuffAhoy Config
	you can also bind keys to any other functions you want to use.  If you intend on using the Passive Party Targetting
	system (read below), then bind keys to the PPT targetting functions (i.e. PPT Target Party 1, etc).
   5.	Close the key bindings menu, and start using BuffAhoy!



II. The BuffAhoy GUI

  To use BuffAhoy through the GUI, go to Key Bindings and bind a key to "BuffAhoy Config" and then bring up
  one of the configuration panels.  Alternatively, you can type '/ba config' to bring up the configuration panel.  You can select 
  the particular functions you want to edit with the "BuffAhoy Navigation" dropdown box.  You can drag spells from your spellbook 
  into the slots in any of the sections, referred to as "panes" from here on.

  The Reset Button
    	The button to the left of the Exit button on the GUI will reset the entire frame (removing all spells from
     	their slots).  Not sure how useful this is, but it's there if you want it.

  The Verbosity Mode dropdown
	The verbosity mode dropdown box will change the channel to which verbose functions will send their messages.  This 
	defaults to "party" every time you start the game.  Options are "Party", "Raid", and "Say".

1.  The BuffCasting Pane

  The Buffcast pane has functions mostly applicable to Paladins and Druids, but any class can use them.

  The 'Buffing Mode' dropdown box toggles between Individualized buffing mode and Class-based Buffing mode.  In individualized 
  mode, you can specify which buff each party member gets, in order, for 1 buff sequence, as well as 2 buff sequences that cast 
  the same 1 buff on each party member.  In Class-based buffing mode, a different interface is brought up, which lets you 
  specify 1 buff for each class type in the first sequence, as well as 2 sequences which apply the same buff to the entire party
  or raid group.  Note that Class-based mode works in raids or regular parties, while Individualized Mode is only for regular parties.
  To use these you must bind keys to "Buff Sequence 1" through "Buff Sequence 3" in the Key Bindings page.

  Using BuffCast Sequences:    
	Individualized Mode:  The first sets of buttons next to "Buffs" are the buffs you will cast on yourself, each party 
	member, and each party pet, as labelled above each slot.  To use BuffCast, you must bind a key to "Buff Sequence 1" 
	in the Key Bindings control panel (through the main interface).  Pressing that button several times sequentially will 
	buff each party member with the buff located in that GUI slot.  

	The set of slots below sequence 1 are unused at this point, and are a place to put extra buffs from your spellbook so you
	can switch buffs around quickly without having to open your spellbook.

	BuffCast Sequences 2 and 3 will try and buff the entire party with the same buff (you still need to press the
	button multiple times, of course).

     	BuffCast will automatically try and buff pets if a spell is put in the "pets" slot.  It checks for pets every time combat
	ends, so it will usually be up-to-date.  You can bind a key to the 'PetCheck()' function in the GUI if you want to run
	petcheck other times (for example, if someone's pet has died during combat and they resummon it before you start buffing.

     	BuffCast has several verbosity options.  The check buttons below the second set of buffs allow you to choose
	either Verbose, Quiet, or Silent (both unchecked) modes.  

 	Class-Based Mode:   The 8 slots in sequence 1 are labelled according to class type.  Drag a buff into
	each slot to specify what buff that class will receive when you run Buff Sequence 1.  Sequences 2 
	and 3 will buff every raid or party member with the buff in the Seq. 2 or Seq. 3 slot.  The verbosity settings are 
	identical to that of BuffCast.
     

2.  The Multi/ShoutCast pane

  The Multicast pane has functions that are more useful to casters like Mages and Warlocks, but any class can use them.

 a)  Using MultiCast Sequences:     The two sets of buttons next to "MultiCast" are the spells you will cast sequentially.  
	To use MultiCast, you must bind a key to "MultiCast Sequence 1" or "MultiCast Sequence 2" in the Key Bindings control panel 
	(through the main interface).  Pressing that button several times sequentially will cast the next spell on the list.

     	The MultiCast slots generally assume that you are targetting a hostile unit, though if you do not have one targetted they
	will still attempt to cast using the PPT system.  The checkbox at the top allows you to enable or disable Verbosity in the 
	Multicast sequences. 

------ NOTE THAT MULTICAST SEQUENCES USE A MODIFIED VERSION THE PPT SYSTEM THAT WILL CAST ON HOSTILE TARGETS!!

 b)  Using ShoutCast buttons:	    The four buttons below MultiCast are ShoutCast buttons.  Spells placed in these slots will be
     	cast using the ShoutCast algorithm, which announces to the party what spell you are casting and the target of the spell.  
	The checkboxes to the right toggle the verbosity (in case you only want to use the slot for selfcasting) and whether the
	slot uses the SmartCast algorithm.  Note that the "SmartCast enabled" setting will override this, if it's disabled.

------ NOTE THAT SHOUTCAST BUTTONS USE A MODIFIED VERSION THE PPT SYSTEM THAT WILL CAST ON HOSTILE TARGETS!!

3.  The Utility pane

  The Utility Pane has six "Utility Spell" slots:  There are 6 slots, named "Heal 1", "Heal 2", "Heal 3", "Cleanse 1", "Cleanse 2",
  and "Protect".  These are slots that are designed for utility spells, appropriate to the names.  You can drag any spell to 
  these slots, of course, the names are just a suggestion.

  The check boxes to the right toggle the verbosity and whether the spell uses the SmartCast algorithm.  Note that disabling the
  "SmartCast enabled" checkbox in the Options pane will override the individual ones.

	These slots use the Passive Party Targetting system, so here is a quick description of how it works.  First,
     	bind a key to the "Target Party 1" through "Target Party 4" functions through the Key Binding configuration.
     
     	Now, if you are targetting a friendly target and press the button bound to "Heal 1", you will heal that
     	target (whether they are in your party or not).
     	If you instead target a hostile target, or no target at all, it will cast the heal spell on the current
     	"PartyTarget".  You can set the "PartyTarget" by pressing the keys bound to the "Target Party #" functions.
        example:  if F3 is bound to "Target Party 3", and "H" is bound to "Heal 1", then the sequence:
	F3, H
	will set the 3rd party member as the passive target and cast the healing spell on them, without breaking
        your current combat target.  Party member 3 will remain the passive party target until one of the other
        "Target Party #" functions are called (by pressin the appropriate key bind).
	
	These slots also (optionally) use the SmartCast algorithm, so if you're holding the smartcast key while pressing the 
	button bound to this function, you will cast the spell on yourself instead.  You can disable this by unchecking the 
	checkbox next to the button.


	Using Protect:
     	The button beneath "Protect" is the button used in the verbose protection function, Protectzor.  You should
     	drag a protection spell (paladins: Blessing of Protection, other classes: ?) to this slot, and bind a key
     	to "Protect Party member" in the Key Bindings Config.

	A special mention needs to be made of this slot, because it is designed for a paladin's Blessing of Protection.
	BoP is only castable on party members, so the logic used for this slot reflects that, and will give you an error
	message if you try and use it on other people.  Keep this in mind if you decide to use this slot for a spell'
	that doesn't have this limitation.


4.  The Options Pane

  The Options pane contains all of the major options for BuffAhoy.  Here's a rundown of the options:

	a) PPT Enabled	     		    --	This Option will enable or disable the Passive Party Targetting system.  See above 
				for a description of how PPT works.  If you disable this, BuffAhoy will actively target everything.

	b) SmartCast Enabled 		    --	This Option enables or disables the BuffAhoy SmartCast algorithm, which 
				auto-targets you if the SmartCast button is held down.  The SmartCast button can be chosen by the 
				dropdown box to the right of this option, you can use either Alt or Shift.  Remember that 
				SmartCast ONLY applies to certain functions in BuffAhoy, not all spells cast.

	c) Wait on Mana/Range when Buffing  -- 	This option will cause you to target each player during a buffcast sequence when 
				outside of combat.  As a result, it will wait until you have enough mana and your target is 
				in range.  This is useful if you don't want to skip someone while buffing because they're out 
				of range.  Again, this only activates if you're outside of combat.

	d) Verbose Multicasting		    --	This option will make multicast sequences verbose, thus announcing each spell
				in the sequence.

	e) Enable Status Messages	    -- 	This option will toggle the chat frame status messages for cooldown and mana checks
				(i.e., this will disable the "Patience, young padawan" message).

	f) Enable Failure/Interruption Messages	
					    --	This option will toggle the "Spell Failed", "Spell Interrupted", and "Spell Delayed"
				messages that occur for verbose functions when the appropriate events happen.

	g) Force Class-Based Buffing to ignore Raid
					    --  This option will force the Class-Based buffing algorithm to buf only your immediate
				party, even if you're in a raid group.
	
	h) Show PPT Frame		    --  This toggles the visibility of the PPT Frame.  The PPT frame is a draggable box
				that shows the name of the current target of the PPT system.  It's mostly for reference, so you can
				see at a glance who you'll cast on when you use a BuffAhoy PPT-enabled function.

------- EVERYTHING BELOW THIS LINE IS FOR ADVANCED OR LEGACY USERS.  IF YOU ARE NOT ADEPT AT MACROS, IT'S PROBABLY NOT WORTH YOUR TIME TO READ THE REST OF THE README --------


III.  The BuffAhoy Macro Interface

    All of the major functions which can be bound via keys can also be called with a slash command, such as:

	/ba buff1	(Buff Sequence 1)

    the other functions are as follows:
	/ba buff2	(Buff Sequence 2)
	/ba buff3	(Buff Sequence 3)
	/ba heal1	(Heal 1)
	  - /ba heal3	  - (Heal 4)
	/ba cleanse1	(Cleanse 1)
	  - /ba cleanse2  - (Cleanse 2)
	/ba protect	(Protect)
	/ba multi1	(Multicast Seq 1)
	/ba multi2	(Multicast seq 2)
	/ba shout1	(shoutcast 1)
	  - /ba shout4 	  -(shoutcast 4)

    Alternatively, you can access the base logic functions as described below.

    BuffAhoy adds the following functions, which can be called in macros:

  Macro-Enabled Functions:  (NOTE, this list is out of date as of 4/12/05, i'll try and update it by the next patch.  In particular, it omits BBoC)
    Cleanzor()		Cleansing script
    Healzor()		Healing script	
    BuffCast()		Buff casting sequencer for whole party
    Protectzor()	Protection script
    Smartzor()		Smartcasing script
    ShoutCast()		Verbose Casting - announces the target and spell being cast to party
    MultiCast()		Casting Sequencer, basically CastAway using action id's instead of names
    MultiShoutCast()	Verbose Casting Sequencer, read the description
    BandAid()		Action/Bandage script, designed for a rogue, but included for fun
    UsableCheck()	Checks to see if a spell is usable (mana/cooldown/range checks).
    PetCheck()		Function that checks the party for pets, should be run before BuffCast
    PartyTarget1() - 
      PartyTarget4() 	Party Targetting functions to work with Cleanzor,Healzor, SmartCast,etc
                        Sets PartyTarget variable to one of the party members  (PPT system)
    PetTarget1()-
      PetTarget4()	Pet Targetting functions for the PPT system
    PetTargetMine()	Pet Targetting function for the PPT system


    To use the macro version of BuffAhoy, bind keys to the four Party Target functions and PetCheck() in the 
    Key Bindings page, and then create a macro and type in the appropriate syntax:

    /script Cleanzor(spellid)
        1 optional argument.
	Required:
	spellid  is the action bar id of your Cleanse spell.  It is only needed if you want the castable
	checks (i.e. checks for enough mana, cooldown, and range) to work.  Except that at the moment 
	they don't.  Oops.  Working on this.

	This script casts Cleanse on current target if it is friendly, or yourself if shift
        is being held down  (using the SmartCast system).  If target is hostile or there is no target, it will cast the spell 
        on the current party target (without breaking combat!).  This is basically Smartzor() but with
	a customized party message.  
	
	This script can be run in verbose or silent mode.  In silent mode, the party message is omitted. 
	This is togglable through the GUI



    /script Healzor(spellid, "Spellname(Rank X)")
	1 required argument, 1 optional argument.
	Required:
	spellid  is the action bar id of the heal spell you want to cast.  
	Optional:
	"Spellname(Rank X)"  is the name of a healing spell you know, but do not have in your action bar.
	To use this optional argument, you must set the first argument to zero.  Also note that using this 
	optional argument will disable the castable checks (mana, cooldown, and range).

	This will cast that spell on the current target if it is friendly.  If the target is hostile or 
	there is no target, it will cast the spell on the current party target (without breaking combat!).  
	This script is also verbose, in that it tells the party who you're trying to heal, or that you 
	do not have mana to heal them.

	    example:  /script Healzor(12)
	will cast the spell in slot 12 on the appropriate target, and announce to the party the name
	of the character you are healing.

	    example:  /script Healzor(0, "Flash of Light(Rank 3)")  
        will cast a rank 3 Flash of light on the target.  This will become more useful if i get around to
	implementing the system i eventually hope to use, that would cast the highest level heal spell
	the caster currently knows as a default.  Maybe i'll get around to that next patch.

	This script can be run in verbose or silent mode.  In silent mode, the party message is omitted.  
	The verbosity can be toggled via the GUI.



    /script BuffCast("Name", timeout, petbuff, yourbuff, party1buff, party2buff, party3buff, party4buff)
	3 required arguments, 1-5 optional arguments.
	Required:
        "Name"  is the name of the current buffset (makes it possible to have several different buff 
           arrangements).  This is identical to the format of CastAway and serves the same purpose.
        timeout is the time (in seconds) before the script resets to targetting you again
        petbuff is the number of the action you want to perform on all party pets
           (i.e. if Blessing of Might is on your Action Bar in slot 4, then making this value 4 will
           cause all party pets to receive that blessing).  This works with the bindings in Flexbar.
           To use actions on other bars, add 12 for each bar you've scrolled (ex. first bar is 1-12,
           second is 13-24, etc).
	Optional:
        yourbuff  is the number of the action you want to perform on yourself (see above)
        party1buff  is the number of the action to be taken for party member 1
        party2buff  is the number of the action to be taken for party member 2
        party3buff  (see above)
        party4buff  (see above)

	This script will cast the predefined buffs (passed as arguments to the function) on the respective party
	member.  
        This script is also "smart", in the sense that it will automatically cast buffs on each party 
	member's pet.  For this to work, the PetCheck() function has to be run at least once so that the 
	function knows what pets the party has.  Read the description for PetCheck() for more information.

	It will also not attempt to cast a buff if the action is not usable, costs too much mana,
	is still cooling down, or is trying to target a party member that doesn't exist.  It is NOT smart enough
	to avoid trying to cast if your target is out of range however.

        To use this function, you must press the key bound to this macro once for each party member 
        and pet (including yourself).

        example Macro:
          /script BuffCast("defaultBuff", 20, 4, 5, 6, 86, 32)
          This will cast the spell in Action Slot 4 on all party pets, Action Slot 5 on you, action 
          slot 6 on party member 1, 6 on party member 2, 86 on party member 3, and 32 on party member 4. 

	This script can be run in verbose, quiet or silent mode.  In silent mode, the party messages are omitted,
	while in quiet mode the messages are instead sent to the default chat frame (only visible to you).  
	The verbosity can be toggled in the GUI.


    /script Protectzor(spellid)  
	1 required argument.
	Required:
	spellid is the action bar id of the protection spell you want to cast

	This string is a verbose script for casting a Blessing of Protection spell on a party member. 
	It doesn't use the SmartCast system, but it does use the PPT system (so you can protect someone
	while in combat without breaking target, but you can't use this one on yourself).  I might add
	the smartcast functionality in the future, but for right now it's disabled (mostly because my personal keybind
	for this involves Shift).

	This script can be run in verbose or silent mode.  In silent mode, the party message is omitted.  
	The verbosity can be toggled in the GUI.


    /script SmartPPT(spellid, saystring, verbose, smart)
	1 required argument, 3 optional arguments.
	Required:
	spellid  is the action bar id of the spell spell you want to cast.  
	Optional:
	"saystring"  is a string that is used in the party chat statement made by this script
	verbose is a toggle for verbosity, if set to 1 the script will be verbose.  If set to 0 this 
	  will disable the verbosity of the function.
	smart is a toggle for smartcastability, if set to 0 the script will NOT use the smartcast algorithm.
        
	This script is a smart-cast script.  It will cast the spell in Action Slot spellid on the current 
        target if it is friendly, or yourself if shift is being held down.  If the current target is 
        hostile or there is no target, it will cast the spell on the current party target (without 
        breaking combat!).  This is also verbose for the party (it will report your action to the 
        whole party), and should give you error messages if the action isn't usable due to cooldown,
	mana, or range (though the range check doesn't work with the Passive Party Targetting system
	yet).

	example:
	  /script SmartPPT(8, "Casting the Best Spell Ever on")
        will cast the spell in action slot 8 on the appropriate target (read above), and send the
	following message to the party (lets assume your target's name is Bob):
	"Casting the Best Spell Ever on Bob"
	Since verbose and smart are omitted, they will default to true (1)
	  
        note that you can omit "saystring", which will just shut off the party message

     
    /script ShoutCast(spellid, "saystring", verbose, smart))
	1 required argument, 3 optional argument.
	Required:
	spellid  is the action bar id of the spell you want to cast.  
	Optional:
	"saystring"  is a string that is used in the party chat statement made by this script
	verbose is a toggle for verbosity, if set to 1 the script will be verbose.  If set to 0 this 
	  will disable the verbosity of the function.
	smart is a toggle for smartcastability, if set to 0 the script will NOT use the smartcast algorithm.
        
        This script is a verbose casting script.  It will inform the party of the target of the current
        spell, as well as a user-defined string describing what you're casting.  You're probably asking
	yourself what the difference is between this and Smartzor().  The answer is that this does NOT
	use the Smart Casting or Passive Party Targetting systems.  This is for spells like Polymorph,
	which you wouldn't use on a friendly or party member.

        example Macro:
          /script ShoutCast(4, "My Favorite Spell")
          This will cast the spell in action slot 4 and send the following message to party chat
          (assuming you're targetting me, and i'm not on your faction):
          "Casting My Favorite Spell on Theck"

        note that you can omit "saystring", which will just shut off the party message (making the
        function rather useless).  Also, omitting verbose and smart defaults them to true (1)


    /script MultiCast("Name", timeout, spell1, spell2, ...)
	2 required arguments, 1-? optional arguments.
	Required:
        "Name"  is the name of the current buffset (makes it possible to have several different buff 
           arrangements).  This is identical to the format of CastAway and serves the same purpose.
        timeout  is the time (in seconds) before the script resets to step 1
	Optional:
        spell1, spell2, ...  are the numbers of the action bar slots of the spells to be cast, in the order
          they are listed in the macro.

        This script will cast spell1 on the first keypress, spell2 on the second keypress, etc.  It will
        recycle back to spell1 at the end of the list, or after a period of inactivity set by the 
        "timeout" variable (in seconds).  This is functionally identical to CastAway, but it uses Action
        ids instead of Spell Names.  While i say there are only 2 required arguments, this is completely
	useless unless you use at least 2 spells, bringing the total to 4 arguments.
	
	example Macro:
	  /script MultiShoutCast("SpellSequence", 20, 8, 9, 10)
	will do the following:
	  First Keypress:
		Casts the spell in action slot 8
	  Second Keypress:
		Casts the spell in action slot 9
	  Third Keypress:
		Casts the spell in action slot 10

    /script MultiShoutCast("Name", timeout, spell1, "saystring1", spell2, "saystring2", ...)
	2 required arguments, 1-? optional arguments.
	Required:
        "Name"  is the name of the current buffset (makes it possible to have several different buff 
           arrangements).  This is identical to the format of CastAway and serves the same purpose.
        timeout  is the time (in seconds) before the script resets to step 1
	Optional:
        spell1, spell2, ...  are the numbers of the action bar slots of the spells to be cast, in the order
          they are listed in the macro.
        "saystring1","saystring2", ...  are strings used in the party chat statements made by this script

        This script will cast spell1 on the first keypress, spell2 on the second keypress, etc.  It will
        recycle back to spell1 at the end of the list, or after a period of inactivity set by the 
        "timeout" variable (in seconds).  What makes this different than MultiCast() is that this script
	is also verbose, so it will send messages to the party when you are casting each spell.  Replacing the
	"saystring#" argument with nil will result in no message for that step.

	example Macro:
	  /script MultiShoutCast("FunSequence", 20, 8, "First Spell", 9, nil, 10, "Third Spell")
	will do the following:
	  First Keypress:
		Casts the spell in action slot 8
		Sends Message to the party: "Casting First Spell on TargetName"
	  Second Keypress:
		Casts the spell in action slot 9
	  Third Keypress:
		Casts the spell in action slot 10
		Sends message to the party: "Casting Third Spell on TargetName"

  /script UsableCheck(spellid, verbose, "manastring", "cdstring", "oorstring")
	1 required argument, 4 optional arguments.
	Required:
	spellid is the id number of the action bar slot of the spell being checked.
	Optional:
	verbose is a toggle for verbosity of the function.  If a 1 is passed, it will give feedback in
	  the default chat frame or party chat depending on whether a string is passed in one of the next three arguments
	"manastring" is a string that is used in the party chat announcement for an out of mana error
	"cdstring"  is a string that is used in the party chat announcement for a cooldown error
	"oorstring"  is a string that is used in the party chat announcement for an out of range error

	This function returns true if the slot is usable, else it returns nil.

  /script BandAid("SpellName(Rank X)", bag, slot)
	3 required arguments.
	Required:
        "SpellName(Rank X)" is a spell or ability known by the player
        bag, slot are the bag/slot coordinates of the bandages in your inventory.  Bags start at
          0 (backpack) and go to 4.  Slot ids are counted from the top left slot calendar-style, 
          starting with 1.  so 0,3 would be the 3rd slot across the top row in your backpack, and 
          3,1 would be the top left slot of your third bag.

        This script is similar to the BuffCast script, except it toggles between 2 actions, one of which
        is a spell or ability and the second of which is the use of an item on yourself from a particular
        location in your backpack.  To use this, press the key bound to this macro twice AFTER highlighting
        your target.  The first press will cast the desired spell on the target (if possible), and the
        second press will attempt to use the item in your inventory at location (bag, slot) on yourself.
	This was written for a Rogue who wanted to Gouge and then Bandage right afterwards. 

  /script RaidCheck(loud)
	1 optional argument.
	Optional:
	loud is either 1 or 0 -- when set to 1, the function runs silently, when set to 0, it will spit out the name
	and level of every raid member to the Default Chat Frame.

  /script RaidCast(cast_id, timeout, id)
	2 required arguments, 1 optional argument.
	Required:
	cast_id is a string describing the sequence, only used to create the data array
	timeout is an integer number of seconds before the sequence will reset
	Optional:
	id is the action bar slot of a buff.  This is used to override the class-based buffing that is the default
	mode for RaidCast.  If id is non-nil, it will attempt to buff every raid member with the spell in slot id.
	
	Note that you cannot call this function without using the action bar slots if you want to use the class-based
	buffing algorithm.

Bindable Functions:

  PetCheck()
	No arguments
	This script will check the party for pets.  It does this by trying to target each party member's pet, and 
	storing the names it finds in an array that gets used in BuffCast.  It will check to see if you have a hostile
	target first, and if so, it will restore that target after it checks the party for pets (though it won't 
	attack that target afterwards).  I considered running this every time BuffCast was used, but i decided against
	it so that BuffCast could be cast in combat without ever breaking target.  

	As a result, this should be used once before BuffCast is used (otherwise it won't try and buff pets).  However,
	it does NOT need to be cast before every buff -- as long as the party's pets haven't changed, running PetCheck() 
	again won't do anything useful for you.

	Any time a party member gets a new pet, or loses a pet, or changes a pet, PetCheck() should be run so that 
	BuffCast can accurately buff the party.


  PartyTarget1()
	This will set the PartyTarget (the passive target for PPT-enabled scripts) to party member 1.  If the 
	"PPT Enabled" box is unchecked, this will actively target the respective party member. 	


  PartyTarget2()	
	See above, but replace 1 with 2 everywhere.  Same goes for 3 and 4.


  PetTarget1()
	This will set the PartyTarget to the first party member's pet (not counting yourself).  Same goes for 2-4.

  PetTargetMine()
	This will set your pet to be the current PartyTarget.