vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        Conditionals functions for FlexBar
        Last Modified
                02/09/2005      Initial version
                08/16/2005  Added logic to handle non-visible creatures when determining creature type - Ratbert_CP
--]]

local util = Utility_Class:New()
local precedence = {["or<>"] = 1, ["and<>"] = 2, ["not<>"] = 3, ["begin<>"] = 4, ["end<>"] = 5}
local eval = Stack_Class:New()
local parse = Stack_Class:New()


function FB_CheckConditional(ifstr)
-- Function to evaluate the if= 
        local i
        for i in ipairs(parse) do
                parse[i] = nil
        end
        
        for i in ipairs(eval) do
                eval[i] = nil
        end
        
        ifstr = string.gsub(ifstr,"\"","'")
        local capture
        _,_,capture = string.find(ifstr,"(%a+%b<>)")
        if (ifstr == capture) then
        -- A single condition
                local firsti,lasti,capture2 = string.find(capture,"(%b<>)")
                local target = string.sub(capture2,2,-2)
                local iftarg
                if target ~= "" then
                        target="iftarg=" .. target
                        iftarg=FBcmd:GetParameters(target)["iftarg"]
                else
                        iftarg = nil
                end
                local condition = string.lower(string.sub(capture,1,firsti - 1))
                if FBConditions[condition] then
                        local dispatch = FBConditions[condition]
                        eval:Push(dispatch(iftarg))
                end
        else
        -- This one needs the parser
                ifstr = string.gsub(ifstr,"not ","not<> ")
                ifstr = string.gsub(ifstr,"and ","and<> ")
                ifstr = string.gsub(ifstr,"or " ,"or<> " )
                ifstr = string.gsub(ifstr,"%(","begin<>")
                ifstr = string.gsub(ifstr,"%)","end<>")
                local capture
                for capture in string.gfind(ifstr,"(%w+%b<>)") do
                        if not FB_IsOp(capture) then
                                local firsti,lasti,capture2 = string.find(capture,"(%b<>)")
                                local target = string.sub(capture2,2,-2)
                                local iftarg
                                if target ~= "" then
                                        target="iftarg=" .. target
                                        iftarg=FBcmd:GetParameters(target)["iftarg"]
                                else
                                        iftarg = nil
                                end
                                local condition = string.lower(string.sub(capture,1,firsti - 1))
                                if FBConditions[condition] then
                                        local dispatch = FBConditions[condition]
                                        eval:Push(dispatch(iftarg))
                                end
                        else
                                while not parse:IsEmpty() and ((precedence[parse:Top()] > precedence[capture]) or capture=="end<>")  do
                                        local temp = parse:Pop()
                                        if temp ~= "begin<>" then
                                                if temp == "not<>" then
                                                        local value = eval:Pop()
                                                        eval:Push(not value)
                                                elseif temp == "and<>" then
                                                        local value1 = eval:Pop()
                                                        local value2 = eval:Pop()
                                                        eval:Push(value1 and value2)
                                                elseif temp == "or<>" then
                                                        local value1 = eval:Pop()
                                                        local value2 = eval:Pop()
                                                        eval:Push(value1 or value2)
                                                end
                                        end
                                end
                                if capture ~= "end<>" then parse:Push(capture) end
                        end
                end
                while not parse:IsEmpty() do
                        local temp = parse:Pop()
                        if temp ~= "begin<>" then
                                if temp == "not<>" then
                                        local value = eval:Pop()
                                        eval:Push(not value)
                                elseif temp == "and<>" then
                                        local value1 = eval:Pop()
                                        local value2 = eval:Pop()
                                        eval:Push(value1 and value2)
                                elseif temp == "or<>" then
                                        local value1 = eval:Pop()
                                        local value2 = eval:Pop()
                                        eval:Push(value1 or value2)
                                end
                        end
                end
        end
        return eval:Top()
end

function FB_IsOp(text)
-- check for an operator
        if text=="not<>" or text=="or<>" or text=="and<>" or text=="begin<>" or text=="end<>" then
                return true
        else
                return false
        end
end

-- Functions to evaluate conditions

-- conditional for hidden
-- if the target is a number - check for the button being hidden
-- if the target is a string, see if there is a global frame of that
-- name and return its hidden state
FBConditions["hidden"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "number" then
                                local frame, button = FB_GetWidgets(value)
                                if not frame:IsVisible() then
                                        return true
                                end
                        elseif type(value) == "string" then
                                local frame = getglobal(value)
                                if frame and not frame:IsVisible() then
                                        return true
                                end
                        end
                end
                return false
        end
        
-- conditional for visible - put in because doing:
-- not hidden<[]> indicates that they are all visible
-- visible<[]> means one of the items is visible
-- if the target is a number - check for the button being visible
-- if the target is a string, see if there is a global frame of that
-- name and return its visible state
FBConditions["visible"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "number" then
                                local frame, button = FB_GetWidgets(value)
                                if frame:IsVisible() then
                                        return true
                                end
                        elseif type(value) == "string" then
                                local frame = getglobal(value)
                                if frame and frame:IsVisible() then
                                        return true
                                end
                        end
                end
                return false
        end
        
-- conditional for remaped
FBConditions["remapped"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "number" then
                                if FBState[value]["remap"] then
                                        return true
                                end
                        end
                end
                return false
        end

-- conditional for shaded
FBConditions["shaded"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "number" then
                                if FBState[value]["icon"] then
                                        return true
                                end
                        end
                end
                return false
        end

-- conditional for faded
FBConditions["faded"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "number" then
                                if FBState[value]["alpha"] and FBState[value]["alpha"] ~= 10 then
                                        return true
                                end
                        end
                end
                return false
        end

-- conditional for scale
FBConditions["scaled"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "number" then
                                if FBState[value]["scale"] and FBState[value]["scale"] ~= 10 then
                                        return true
                                end
                        end
                end
                return false
        end

-- conditional for enoughmana
FBConditions["enoughmana"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "number" then
                                local button = FB_GetWidgets(value)
                                local isUsable, notEnoughMana = IsUsableAction(button:GetID());
                                if not notEnoughMana then
                                        return true
                                end
                        end
                end
                return false
        end

-- conditional for usable
FBConditions["usable"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "number" then
                                local button = FB_GetWidgets(value)
                                local isUsable, enoughMana = IsUsableAction(button:GetID());
                                if isUsable then
                                        return true
                                end
                        end
                end
                return false
        end

-- conditional for inrange
FBConditions["inrange"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "number" then
                                local button = FB_GetWidgets(value)
                                local inRange = IsActionInRange(button:GetID());
                                if inRange ~= 0 then
                                        return true
                                end
                        end
                end
                return false
        end

-- conditional for incooldown
FBConditions["incooldown"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "number" then
                                local button = FB_GetWidgets(value)
                                local start = GetActionCooldown(button:GetID());
                                if start ~= 0 then
                                        return true
                                end
                        end
                end
                return false
        end

-- conditional for isadvanced
FBConditions["isadvanced"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "number" then
                                if FBState[value]["advanced"] then
                                        return true
                                end
                        end
                end
                return false
        end

-- conditional for isdisabled
FBConditions["isdisabled"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "number" then
                                if FBState[value]["disabled"] then
                                        return true
                                end
                        end
                end
                return false
        end

-- conditional for unitexists
FBConditions["unitexists"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitExists(value) then
                                        return true
                                end
                        end
                end
                return false
        end

-- conditional for unitalive
FBConditions["unitisalive"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitExists(value) and not UnitIsDeadOrGhost(value) then
                                        return true
                                end
                        end
                end
                return false
        end

-- conditional for unitishostile
FBConditions["unitishostile"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitExists(value) and UnitIsEnemy("player",value) then
                                        return true
                                end
                        end
                end
                return false
        end

-- conditional for unitisfriendly
FBConditions["unitisfriendly"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitExists(value) and UnitIsFriend("player",value) then
                                        return true
                                end
                        end
                end
                return false
        end

-- conditional for unitisneutral
FBConditions["unitisneutral"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitExists(value) and not UnitIsEnemy("player",value) and not UnitIsFriend("player",value) then
                                        return true
                                end
                        end
                end
                return false
        end


-- conditional for unitiscorpse
FBConditions["unitiscorpse"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitExists(value) and UnitIsDeadOrGhost(value) then
                                        return true
                                end
                        end
                end
                return false
        end

-- conditional for unitistapped
FBConditions["unitistapped"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitExists(value) and UnitIsTapped(value) then
                                        return true
                                end
                        end
                end
                return false
        end

-- conditional for hasaura
FBConditions["hasaura"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                if string.lower(FBLastform) == string.lower(value) then
                                        return true
                                end
                        end
                end
                return false
        end

-- health conditionals
-- below 10%
FBConditions["healthbelow10"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) < .1 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 20%
FBConditions["healthbelow20"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) < .2 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 30%
FBConditions["healthbelow30"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) < .3 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 40%
FBConditions["healthbelow40"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) < .4 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 50%
FBConditions["healthbelow50"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) < .5 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 60%
FBConditions["healthbelow60"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) < .6 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 70%
FBConditions["healthbelow70"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) < .7 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 80%
FBConditions["healthbelow80"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) < .8 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 90%
FBConditions["healthbelow90"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) < .9 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 100%
FBConditions["healthbelow100"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) < 1 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 10%
FBConditions["healthabove10"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) > .1 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 20%
FBConditions["healthabove20"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) > .2 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 30%
FBConditions["healthabove30"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) > .3 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 40%
FBConditions["healthabove40"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) > .4 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 50%
FBConditions["healthabove50"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) > .5 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 60%
FBConditions["healthabove60"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                if UnitHealth(value)/UnitHealthMax(value) > .6 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 70%
FBConditions["healthabove70"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) > .7 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 80%
FBConditions["healthabove80"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) > .8 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 90%
FBConditions["healthabove90"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) > .9 then
                                        return true
                                end
                        end
                end
                return false
        end

-- full
FBConditions["healthfull"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitHealth(value)/UnitHealthMax(value) > .99 then
                                        return true
                                end
                        end
                end
                return false
        end


-- mana conditionals
-- below 10%
FBConditions["manabelow10"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) < .1 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 20%
FBConditions["manabelow20"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) < .2 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 30%
FBConditions["manabelow30"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) < .3 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 40%
FBConditions["manabelow40"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) < .4 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 50%
FBConditions["manabelow50"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) < .5 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 60%
FBConditions["manabelow60"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) < .6 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 70%
FBConditions["manabelow70"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) < .7 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 80%
FBConditions["manabelow80"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) < .8 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 90%
FBConditions["manabelow90"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) < .9 then
                                        return true
                                end
                        end
                end
                return false
        end

-- below 100%
FBConditions["manabelow100"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) < 1 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 10%
FBConditions["manaabove10"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) > .1 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 20%
FBConditions["manaabove20"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) > .2 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 30%
FBConditions["manaabove30"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) > .3 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 40%
FBConditions["manaabove40"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) > .4 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 50%
FBConditions["manaabove50"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) > .5 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 60%
FBConditions["manaabove60"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) > .6 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 70%
FBConditions["manaabove70"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) > .7 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 80%
FBConditions["manaabove80"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) > .8 then
                                        return true
                                end
                        end
                end
                return false
        end

-- above 90%
FBConditions["manaabove90"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) > .9 then
                                        return true
                                end
                        end
                end
                return false
        end

-- full
FBConditions["manafull"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                value = string.lower(value)
                                if UnitMana(value)/UnitManaMax(value) > .99 then
                                        return true
                                end
                        end
                end
                return false
        end

-- in combat
FBConditions["incombat"] = 
        function()
                if FBConditionalState["incombat"] then return true else return false end
        end

-- has aggro
FBConditions["hasaggro"] = 
        function()
                if FBConditionalState["hasaggro"] then return true else return false end
        end

-- shift down
FBConditions["shiftdown"] = 
        function()
                if IsShiftKeyDown() then return true else return false end
        end

-- control down
FBConditions["controldown"] = 
        function()
                if IsControlKeyDown() then return true else return false end
        end

-- alt down
FBConditions["altdown"] = 
        function()
                if IsAltKeyDown() then return true else return false end
        end

-- Is running (for timers such as on raise)
FBConditions["isrunning"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "string" then
                                if FBTimers[value]:GetRunning() then
                                        return true
                                end
                        end
                end
                return false
        end

-- In group - is cursor in group bounds
FBConditions["ingroup"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if type(value) == "number" then
                                local x,y = GetCursorPosition()
                                if FB_InGroupBounds(value, x, y) then
                                        return true
                                end
                        end
                end
                return false
        end

-- check for custom condition - no target
FBConditions["custom"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        if FBCustom[value] then return true end
                end
                return false
        end

-- check for buff existing
FBConditions["hasbuff"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                if not FBLastBuffs["buffs"]["player"] then return false end
                
                local index, value
                for index, value in pairs(target) do
                        value = string.lower(value)
                        if FBLastBuffs["buffs"]["player"][value] then 
                                return true 
                        end
                end
                return false
        end

-- check for debuff existing
FBConditions["hasdebuff"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                
                if not FBLastBuffs["debuffs"]["player"] then return false end
                
                local index, value
                for index, value in pairs(target) do
                        value = string.lower(value)
                        if FBLastBuffs["debuffs"]["player"][value] then 
                                return true 
                        end
                end
                return false
        end

-- check for debufftype existing
FBConditions["hasdebufftype"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                
                if not FBLastBuffs["buffs"]["player"] then return false end
                
                local index, value
                for index, value in pairs(target) do
                        value = string.lower(value)
                        if FBLastBuffs["debufftypes"]["player"][value] then 
                                return true 
                        end
                end
                return false
        end

-- unit version takes unit, buff list 
FBConditions["unitbuff"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        return false
                end

                local i=1
                while target[i] do
                        target[i] = string.lower(target[i])
                        i=i+1
                end

                if not FBLastBuffs["buffs"][target[1]] then return false end

                local index = 2
                while target[index] do
                        if FBLastBuffs["buffs"][target[1]][target[index]] then 
                                return true 
                        end
                        index = index+1
                end
                return false
        end

-- unit version takes unit, debuff list 
FBConditions["unitdebuff"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        return false
                end
                
                local i=1
                while target[i] do
                        target[i] = string.lower(target[i])
                        i=i+1
                end

                if not FBLastBuffs["debuffs"][target[1]] then return false end
                
                local index = 2
                while target[index] do
                        if FBLastBuffs["debuffs"][target[1]][target[index]] then 
                                return true 
                        end
                        index = index+1
                end
                return false
        end

-- unit version takes unit, debufftype list 
FBConditions["unitdebufftype"] = 
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        return false
                end

                local i=1
                while target[i] do
                        target[i] = string.lower(target[i])
                        i=i+1
                end

                if not FBLastBuffs["debufftypes"][target[1]] then return false end

                local index = 2
                while target[index] do
                        if FBLastBuffs["debufftypes"][target[1]][target[index]] then 
                                return true 
                        end
                        index = index+1
                end

                return false
        end

FBConditions["unitcreaturetype"] = 
    function(target)
        if not target then return false end
        if type(target) ~= "table" then
            return false
        end

                local i=1
                while target[i] do
                        target[i] = string.lower(target[i])
                        i=i+1
                end
                
                -- Validate UnitCreatureType and UnitExists
                -- If you target a non-visible creature, the unitcreaturetype conditional will fail
                -- I think (untested as of 8/16/2005) that when the target becomes visible, another PLAYER_TARGET_CHANGED
                -- event will fire, causing a new GainTarget event, thereby updating the creature type.
                local targetType
        if not UnitExists(target[1]) then 
                        return false
                else
                        targetType = UnitCreatureType(target[1])
                        if targetType == nil then return false end
                        targetType = string.lower(targetType)
                end
                
        local index = 2
        while target[index] do
            if targetType == target[index] then return true end
            index = index+1
        end
        return false
    end

FBConditions["unitclass"] = 
    function(target)
                -- returns true if the first element in target is any of the classes specified in the following elements
        if not target then return false end
        if type(target) ~= "table" then
            return false
        end

                local i=1
                while target[i] do
                        target[i] = string.lower(target[i])
                        i=i+1
                end

        if not UnitExists(target[1]) then return false end
        
        local index = 2
        while target[index] do
            if string.lower(UnitClass(target[1])) == target[index] then return true end
            index = index+1
        end
        return false
    end

local list = { "player","pet","party1","party2","party3","party4","partypet1","partypet2","partypet3","partypet4" }
FBConditions["partydebufftype"] = 
    function(target)
        -- returns true if any of the party have one of the specified debufftypes
        if not target then return false end
        if type(target) ~= "table" then
            return false
        end

                local i=1
                while target[i] do
                        target[i] = string.lower(target[i])
                        i=i+1
                end

        local index = 1
        while target[index] do
                        for i, unit in ipairs(list) do
                                if UnitExists(unit) and FBLastBuffs["debufftypes"][unit][target[index]] then 
                                        return true
                                end
                        end
            index = index+1
        end
        return false
    end

-- Check for having an main hand item enchantment
FBConditions["mainhandenchant"] = 
        function(target)
                local   hasMainHandEnchant, mainHandExpiration, mainHandCharges,
                                hasOffHandEnchant, offHandExpiration, offHandCharges = GetWeaponEnchantInfo() 
                if hasMainHandEnchant then return true else return false end
        end

-- Check for Main hand charges equal to target
FBConditions["mainhandchargeseq"] =
        function(target)
                if not target then return false end
                if type(target) ~= "number" then return false end
                local   hasMainHandEnchant, mainHandExpiration, mainHandCharges,
                                hasOffHandEnchant, offHandExpiration, offHandCharges = GetWeaponEnchantInfo() 
                if not hasMainHandEnchant or mainHandCharges ~= target then return false else return true end
        end

-- Check for Main hand charges greater than target
FBConditions["mainhandchargesgt"] =
        function(target)
                if not target then return false end
                if type(target) ~= "number" then return false end
                local   hasMainHandEnchant, mainHandExpiration, mainHandCharges,
                                hasOffHandEnchant, offHandExpiration, offHandCharges = GetWeaponEnchantInfo() 
                if not hasMainHandEnchant or mainHandCharges <= target then return false else return true end
        end

-- Check for Main hand charges less than target
FBConditions["mainhandchargeslt"] =
        function(target)
                if not target then return false end
                if type(target) ~= "number" then return false end
                local   hasMainHandEnchant, mainHandExpiration, mainHandCharges,
                                hasOffHandEnchant, offHandExpiration, offHandCharges = GetWeaponEnchantInfo() 
                if not hasMainHandEnchant or mainHandCharges >= target then return false else return true end
        end

-- Check for having an off hand item enchantment
FBConditions["offhandenchant"] = 
        function(target)
                local   hasMainHandEnchant, mainHandExpiration, mainHandCharges,
                                hasOffHandEnchant, offHandExpiration, offHandCharges = GetWeaponEnchantInfo() 
                if hasOffHandEnchant then return true else return false end
        end

-- Check for Off hand charges equal to target
FBConditions["offhandchargeseq"] =
        function(target)
                if not target then return false end
                if type(target) ~= "number" then return false end
                local   hasMainHandEnchant, mainHandExpiration, mainHandCharges,
                                hasOffHandEnchant, offHandExpiration, offHandCharges = GetWeaponEnchantInfo() 
                if not hasOffHandEnchant or OffHandCharges ~= target then return false else return true end
        end

-- Check for Off hand charges greater than target
FBConditions["offhandchargesgt"] =
        function(target)
                if not target then return false end
                if type(target) ~= "number" then return false end
                local   hasMainHandEnchant, mainHandExpiration, mainHandCharges,
                                hasOffHandEnchant, offHandExpiration, offHandCharges = GetWeaponEnchantInfo() 
                if not hasOffHandEnchant or offHandCharges <= target then return false else return true end
        end

-- Check for Off hand charges less than target
FBConditions["offhandchargeslt"] =
        function(target)
                if not target then return false end
                if type(target) ~= "number" then return false end
                local   hasMainHandEnchant, mainHandExpiration, mainHandCharges,
                                hasOffHandEnchant, offHandExpiration, offHandCharges = GetWeaponEnchantInfo() 
                if not hasOffHandEnchant or offHandCharges >= target then return false else return true end
        end

-- Check for Main hand charges equal to target
FBConditions["mainhandchargeseq"] =
        function(target)
                if not target then return false end
                if type(target) ~= "number" then return false end
                local   hasMainHandEnchant, mainHandExpiration, mainHandCharges,
                                hasOffHandEnchant, offHandExpiration, offHandCharges = GetWeaponEnchantInfo() 
                if not hasMainHandEnchant or mainHandCharges ~= target then return false else return true end
        end

-- Check for Main hand charges greater than target
FBConditions["mainhandchargesgt"] =
        function(target)
                if not target then return false end
                if type(target) ~= "number" then return false end
                local   hasMainHandEnchant, mainHandExpiration, mainHandCharges,
                                hasOffHandEnchant, offHandExpiration, offHandCharges = GetWeaponEnchantInfo() 
                if not hasMainHandEnchant or mainHandCharges <= target then return false else return true end
        end

-- Check for having item
FBConditions["hasitem"] =
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        value = string.lower(value)
                        if FBBagContents[value] then return true end
                end
                return false
        end

-- Check for Affecting Combat
FBConditions["affectingcombat"] =
        function(target)
                if not target then return false end
                if type(target) ~= "table" then
                        target = { target }
                end
                
                local index, value
                for index, value in pairs(target) do
                        value = string.lower(value)
                        if UnitAffectingCombat(value) then return true end
                end
                return false
        end

-- Check for Combo Point equal to target
FBConditions["comboptseq"] =
        function(target)
                if not target then return false end
                if type(target) ~= "number" then return false end
                
                if GetComboPoints() == target then return true else return false end
        end

-- Check for Combo Point lessthan to target
FBConditions["comboptslt"] =
        function(target)
                if not target then return false end
                if type(target) ~= "number" then return false end
                
                if GetComboPoints() < target then return true else return false end
        end

-- Check for Combo Point greater than to target
FBConditions["comboptsgt"] =
        function(target)
                if not target then return false end
                if type(target) ~= "number" then return false end
                
                if GetComboPoints() > target then return true else return false end
        end

FBConditions["true"] = function() return true end
FBConditions["false"] = function() return false end