vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
---------------
-- Variables --
---------------
Perl_Target_Config = {};

-- Default Saved Variables (also set in Perl_Target_GetVars)
local locked = 0;               -- unlocked by default
local showcp = 1;               -- combo points displayed by default
local showclassicon = 1;        -- show the class icon
local showclassframe = 1;       -- show the class frame
local showpvpicon = 1;          -- show the pvp icon
local numbuffsshown = 16;       -- buff row is 16 long
local numdebuffsshown = 16;     -- debuff row is 16 long
local mobhealthsupport = 1;     -- mobhealth support is on by default
local scale = 1;                -- default scale
local showpvprank = 0;          -- hide the pvp rank by default
local transparency = 1;         -- transparency for frames
local buffdebuffscale = 1;      -- default scale for buffs and debuffs
local showportrait = 0;         -- portrait is hidden by default
local threedportrait = 0;       -- 3d portraits are off by default
local portraitcombattext = 1;   -- Combat text is enabled by default on the portrait frame
local showrareeliteframe = 0;   -- rare/elite frame is hidden by default
local nameframecombopoints = 0; -- combo points are not displayed in the name frame by default
local comboframedebuffs = 0;    -- combo point frame will not be used for debuffs by default
local framestyle = 1;           -- default frame style is "classic"
local compactmode = 0;          -- compact mode is disabled by default
local compactpercent = 0;       -- percents are not shown in compact mode by default
local hidebuffbackground = 0;   -- buff and debuff backgrounds are shown by default

-- Default Local Variables
local Initialized = nil;        -- waiting to be initialized

-- Variables for position of the class icon texture.
local Perl_Target_ClassPosRight = {};
local Perl_Target_ClassPosLeft = {};
local Perl_Target_ClassPosTop = {};
local Perl_Target_ClassPosBottom = {};


----------------------
-- Loading Function --
----------------------
function Perl_Target_OnLoad()
        -- Combat Text
        CombatFeedback_Initialize(Perl_Target_HitIndicator, 30);

        -- Events
        this:RegisterEvent("ADDON_LOADED");
        this:RegisterEvent("PARTY_LEADER_CHANGED");
        this:RegisterEvent("PARTY_MEMBER_DISABLE");
        this:RegisterEvent("PARTY_MEMBER_ENABLE");
        this:RegisterEvent("PARTY_MEMBERS_CHANGED");
        this:RegisterEvent("PLAYER_COMBO_POINTS");
        this:RegisterEvent("PLAYER_ENTERING_WORLD");
        this:RegisterEvent("PLAYER_TARGET_CHANGED");
        this:RegisterEvent("UNIT_AURA");
        this:RegisterEvent("UNIT_COMBAT");
        this:RegisterEvent("UNIT_DISPLAYPOWER");
        this:RegisterEvent("UNIT_DYNAMIC_FLAGS");
        this:RegisterEvent("UNIT_ENERGY");
        this:RegisterEvent("UNIT_FOCUS");
        this:RegisterEvent("UNIT_HEALTH");
        this:RegisterEvent("UNIT_LEVEL");
        this:RegisterEvent("UNIT_MANA");
        this:RegisterEvent("UNIT_MAXENERGY");
        this:RegisterEvent("UNIT_MAXFOCUS");
        this:RegisterEvent("UNIT_MAXHEALTH");
        this:RegisterEvent("UNIT_MAXMANA");
        this:RegisterEvent("UNIT_MAXRAGE");
        this:RegisterEvent("UNIT_PORTRAIT_UPDATE");
        this:RegisterEvent("UNIT_PVP_UPDATE");
        this:RegisterEvent("UNIT_RAGE");
        this:RegisterEvent("UNIT_SPELLMISS");
        this:RegisterEvent("VARIABLES_LOADED");

        -- Button Click Overlays (in order of occurrence in XML)
        Perl_Target_NameFrame_CastClickOverlay:SetFrameLevel(Perl_Target_NameFrame:GetFrameLevel() + 2);
        Perl_Target_Name:SetFrameLevel(Perl_Target_NameFrame:GetFrameLevel() + 1);
        Perl_Target_LevelFrame_CastClickOverlay:SetFrameLevel(Perl_Target_LevelFrame:GetFrameLevel() + 1);
        Perl_Target_RareEliteFrame_CastClickOverlay:SetFrameLevel(Perl_Target_RareEliteFrame:GetFrameLevel() + 1);
        Perl_Target_PortraitFrame_CastClickOverlay:SetFrameLevel(Perl_Target_PortraitFrame:GetFrameLevel() + 2);
        Perl_Target_ClassNameFrame_CastClickOverlay:SetFrameLevel(Perl_Target_ClassNameFrame:GetFrameLevel() + 1);
        Perl_Target_CivilianFrame_CastClickOverlay:SetFrameLevel(Perl_Target_CivilianFrame:GetFrameLevel() + 1);
        Perl_Target_CPFrame_CastClickOverlay:SetFrameLevel(Perl_Target_CPFrame:GetFrameLevel() + 1);
        Perl_Target_StatsFrame_CastClickOverlay:SetFrameLevel(Perl_Target_StatsFrame:GetFrameLevel() + 1);

        if (DEFAULT_CHAT_FRAME) then
                DEFAULT_CHAT_FRAME:AddMessage("|cffffff00Perl Classic: Target loaded successfully.");
        end
end


-------------------
-- Event Handler --
-------------------
function Perl_Target_OnEvent(event)
        if ((event == "PLAYER_TARGET_CHANGED") or (event == "PARTY_MEMBERS_CHANGED") or (event == "PARTY_LEADER_CHANGED") or (event == "PARTY_MEMBER_ENABLE") or (event == "PARTY_MEMBER_DISABLE")) then
                if (UnitExists("target")) then
                        Perl_Target_Update_Once();              -- Set the unchanging info for the target
                else
                        Perl_Target_Frame:Hide();               -- There is no target, hide the frame
                end
                return;
        elseif (event == "UNIT_HEALTH" or event == "UNIT_MAXHEALTH") then
                if (arg1 == "target") then
                        Perl_Target_Update_Health();            -- Update health values
                end
                return;
        elseif ((event == "UNIT_ENERGY") or (event == "UNIT_MANA") or (event == "UNIT_RAGE") or (event == "UNIT_FOCUS") or (event == "UNIT_MAXMANA") or (event == "UNIT_MAXENERGY") or (event == "UNIT_MAXRAGE") or (event == "UNIT_MAXFOCUS")) then
                if (arg1 == "target") then
                        Perl_Target_Update_Mana();              -- Update energy/mana/rage values
                end
                return;
        elseif (event == "UNIT_AURA") then
                if (arg1 == "target") then
                        Perl_Target_Buff_UpdateAll();           -- Update the buffs
                end
                return;
        elseif (event == "UNIT_DYNAMIC_FLAGS") then
                if (arg1 == "target") then
                        Perl_Target_Update_Text_Color();        -- Has the target been tapped by someone else?
                end
                return;
        elseif (event == "UNIT_COMBAT") then
                if (arg1 == "target") then
                        CombatFeedback_OnCombatEvent(arg2, arg3, arg4, arg5);
                end
                return;
        elseif (event == "UNIT_SPELLMISS") then
                if (arg1 == "target") then
                        CombatFeedback_OnSpellMissEvent(arg2);
                end
                return;
        elseif (event == "UNIT_PVP_UPDATE") then
                Perl_Target_Update_Text_Color();                -- Is the character PvP flagged?
                Perl_Target_Update_PvP_Status_Icon();           -- Set pvp status icon
                return;
        elseif (event == "UNIT_PORTRAIT_UPDATE") then
                if (arg1 == "target") then
                        Perl_Target_Update_Portrait();
                end
                return;
        elseif (event == "UNIT_LEVEL") then
                if (arg1 == "target") then
                        Perl_Target_Frame_Set_Level();          -- What level is it and is it rare/elite/boss
                end
                return;
        elseif (event == "PLAYER_COMBO_POINTS") then
                Perl_Target_Update_Combo_Points();              -- How many combo points are we at?
                return;
        elseif (event == "UNIT_DISPLAYPOWER") then
                if (arg1 == "target") then
                        Perl_Target_Update_Mana_Bar();          -- What type of energy are they using now?
                        Perl_Target_Update_Mana();              -- Update the energy info immediately
                end
                return;
        elseif (event == "VARIABLES_LOADED") or (event=="PLAYER_ENTERING_WORLD") then
                Perl_Target_Initialize();
                return;
        elseif (event == "ADDON_LOADED") then
                if (arg1 == "Perl_Target") then
                        Perl_Target_myAddOns_Support();         -- Attempt to load MyAddOns support
                end
                return;
        else
                return;
        end
end


-------------------------------
-- Loading Settings Function --
-------------------------------
function Perl_Target_Initialize()
        if (Initialized) then
                Perl_Target_Set_Scale();
                return;
        end

        -- Check if a previous exists, if not, enable by default.
        if (type(Perl_Target_Config[UnitName("player")]) == "table") then
                Perl_Target_GetVars();
        else
                Perl_Target_UpdateVars();
        end

        -- Major config options.
        Perl_Target_Initialize_Frame_Color();
        Perl_Target_Frame_Style();
        Perl_Target_Buff_Debuff_Background();
        Perl_Target_Frame:Hide();

        Perl_Target_Set_Localized_ClassIcons();

        -- Unregister the Blizzard frames via the 1.8 function
        TargetFrame:UnregisterAllEvents();
        TargetFrameHealthBar:UnregisterAllEvents();
        TargetFrameManaBar:UnregisterAllEvents();
        ComboFrame:UnregisterAllEvents();

        Initialized = 1;
end

function Perl_Target_Initialize_Frame_Color()
        Perl_Target_StatsFrame:SetBackdropColor(0, 0, 0, 1);
        Perl_Target_StatsFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1);
        Perl_Target_NameFrame:SetBackdropColor(0, 0, 0, 1);
        Perl_Target_NameFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1);
        Perl_Target_ClassNameFrame:SetBackdropColor(0, 0, 0, 1);
        Perl_Target_ClassNameFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1);
        Perl_Target_CivilianFrame:SetBackdropColor(1, 1, 1, 1);
        Perl_Target_CivilianFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1);
        Perl_Target_LevelFrame:SetBackdropColor(0, 0, 0, 1);
        Perl_Target_LevelFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1);
        Perl_Target_BuffFrame:SetBackdropColor(0, 0, 0, 1);
        Perl_Target_BuffFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1);
        Perl_Target_DebuffFrame:SetBackdropColor(0, 0, 0, 1);
        Perl_Target_DebuffFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1);
        Perl_Target_CPFrame:SetBackdropColor(0, 0, 0, 1);
        Perl_Target_CPFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1);
        Perl_Target_PortraitFrame:SetBackdropColor(0, 0, 0, 1);
        Perl_Target_PortraitFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1);
        Perl_Target_RareEliteFrame:SetBackdropColor(0, 0, 0, 1);
        Perl_Target_RareEliteFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1);

        Perl_Target_HealthBarText:SetTextColor(1, 1, 1, 1);
        Perl_Target_ManaBarText:SetTextColor(1, 1, 1, 1);
        Perl_Target_ClassNameBarText:SetTextColor(1, 1, 1);
end


--------------------------
-- The Update Functions --
--------------------------
function Perl_Target_Update_Once()
        if (UnitExists("target")) then
                Perl_Target_Frame:Show();               -- Show frame
                Perl_Target_Set_Scale();                -- Set the scale (easier ways exist, but this is the safest)
                Perl_Target_Set_Transparency();         -- Set the transparency (fix this method along with scale)
                ComboFrame:Hide();                      -- Hide default Combo Points
                Perl_Target_Update_Combo_Points();      -- Do we have any combo points (we shouldn't)
                Perl_Target_Frame_Set_Name();           -- Set the target's name
                Perl_Target_Update_Portrait();          -- Set the target's portrait and adjust the combo point frame
                Perl_Target_Update_Text_Color();        -- Has the target been tapped by someone else?
                Perl_Target_Update_Health();            -- Set the target's health
                Perl_Target_Update_Mana_Bar();          -- What type of mana bar is it?
                Perl_Target_Update_Mana();              -- Set the target's mana
                Perl_Target_Update_PvP_Status_Icon();   -- Set pvp status icon
                Perl_Target_Frame_Set_PvPRank();        -- Set the pvp rank icon
                Perl_Target_Frame_Set_Level();          -- What level is it and is it rare/elite/boss
                Perl_Target_Set_Character_Class_Icon(); -- Draw the class icon?
                Perl_Target_Set_Target_Class();         -- Set the target's class in the class frame
                Perl_Target_Buff_UpdateAll();           -- Update the buffs
        end
end

function Perl_Target_Update_Health()
        local targethealth = UnitHealth("target");
        local targethealthmax = UnitHealthMax("target");
        local targethealthpercent = floor(targethealth/targethealthmax*100+0.5);

        if (UnitIsDead("target") or UnitIsGhost("target")) then                         -- This prevents negative health
                targethealth = 0;
                targethealthpercent = 0;
        end

        -- Set Dead Icon
        if (UnitIsDead("target") or UnitIsGhost("target")) then
                Perl_Target_DeadStatus:Show();
        else
                Perl_Target_DeadStatus:Hide();
        end

        Perl_Target_HealthBar:SetMinMaxValues(0, targethealthmax);
        Perl_Target_HealthBar:SetValue(targethealth);

        if (PCUF_COLORHEALTH == 1) then
                if ((targethealthpercent <= 100) and (targethealthpercent > 75)) then
                        Perl_Target_HealthBar:SetStatusBarColor(0, 0.8, 0);
                        Perl_Target_HealthBarBG:SetStatusBarColor(0, 0.8, 0, 0.25);
                elseif ((targethealthpercent <= 75) and (targethealthpercent > 50)) then
                        Perl_Target_HealthBar:SetStatusBarColor(1, 1, 0);
                        Perl_Target_HealthBarBG:SetStatusBarColor(1, 1, 0, 0.25);
                elseif ((targethealthpercent <= 50) and (targethealthpercent > 25)) then
                        Perl_Target_HealthBar:SetStatusBarColor(1, 0.5, 0);
                        Perl_Target_HealthBarBG:SetStatusBarColor(1, 0.5, 0, 0.25);
                else
                        Perl_Target_HealthBar:SetStatusBarColor(1, 0, 0);
                        Perl_Target_HealthBarBG:SetStatusBarColor(1, 0, 0, 0.25);
                end
        else
                Perl_Target_HealthBar:SetStatusBarColor(0, 0.8, 0);
                Perl_Target_HealthBarBG:SetStatusBarColor(0, 0.8, 0, 0.25);
        end

        if (targethealthmax == 100) then
                -- Begin Mobhealth support
                if (mobhealthsupport == 1) then
                        if (MobHealthFrame) then
                                MobHealthFrame:Hide();

                                local index;
                                if UnitIsPlayer("target") then
                                        index = UnitName("target");
                                else
                                        index = UnitName("target")..":"..UnitLevel("target");
                                end

                                if ((MobHealthDB and MobHealthDB[index]) or (MobHealthPlayerDB and MobHealthPlayerDB[index])) then
                                        local s, e;
                                        local pts;
                                        local pct;

                                        if MobHealthDB[index] then
                                                if (type(MobHealthDB[index]) ~= "string") then
                                                        Perl_Target_HealthBarText:SetText(targethealth.."%");
                                                end
                                                s, e, pts, pct = string.find(MobHealthDB[index], "^(%d+)/(%d+)$");
                                        else
                                                if (type(MobHealthPlayerDB[index]) ~= "string") then
                                                        Perl_Target_HealthBarText:SetText(targethealth.."%");
                                                end
                                                s, e, pts, pct = string.find(MobHealthPlayerDB[index], "^(%d+)/(%d+)$");
                                        end

                                        if (pts and pct) then
                                                pts = pts + 0;
                                                pct = pct + 0;
                                                if (pct ~= 0) then
                                                        pointsPerPct = pts / pct;
                                                else
                                                        pointsPerPct = 0;
                                                end
                                        end

                                        local currentPct = UnitHealth("target");
                                        if (pointsPerPct > 0) then
                                                -- Stored unit info from the DB
                                                if (framestyle == 1) then
                                                        Perl_Target_HealthBarTextRight:SetText();                                                       -- Hide this text in this frame style
                                                        Perl_Target_HealthBarTextCompactPercent:SetText();                                              -- Hide this text in this frame style
                                                        Perl_Target_HealthBarText:SetText(string.format("%d", (currentPct * pointsPerPct) + 0.5).."/"..string.format("%d", (100 * pointsPerPct) + 0.5).." | "..targethealth.."%");
                                                elseif (framestyle == 2) then
                                                        if (compactmode == 0) then
                                                                Perl_Target_HealthBarTextCompactPercent:SetText();                                      -- Hide this text in this frame style
                                                                if (tonumber(string.format("%d", (100 * pointsPerPct) + 0.5)) > 9999) then
                                                                        Perl_Target_HealthBarText:SetText(string.format("%d", (currentPct * pointsPerPct) + 0.5).."/"..string.format("%d", (100 * pointsPerPct) + 0.5));
                                                                        Perl_Target_HealthBarTextRight:SetText(targethealth.."%");
                                                                else
                                                                        Perl_Target_HealthBarText:SetText(targethealth.."%");
                                                                        Perl_Target_HealthBarTextRight:SetText(string.format("%d", (currentPct * pointsPerPct) + 0.5).."/"..string.format("%d", (100 * pointsPerPct) + 0.5));
                                                                end
                                                                
                                                        else
                                                                if (compactpercent == 0) then
                                                                        Perl_Target_HealthBarTextRight:SetText();                                       -- Hide this text in this frame style
                                                                        Perl_Target_HealthBarTextCompactPercent:SetText();                              -- Hide this text in this frame style
                                                                        Perl_Target_HealthBarText:SetText(string.format("%d", (currentPct * pointsPerPct) + 0.5).."/"..string.format("%d", (100 * pointsPerPct) + 0.5));
                                                                else
                                                                        Perl_Target_HealthBarTextRight:SetText();                                       -- Hide this text in this frame style
                                                                        Perl_Target_HealthBarText:SetText(string.format("%d", (currentPct * pointsPerPct) + 0.5).."/"..string.format("%d", (100 * pointsPerPct) + 0.5));
                                                                        Perl_Target_HealthBarTextCompactPercent:SetText(targethealth.."%");
                                                                end
                                                        end
                                                end
                                        end
                                else
                                        -- Unit not in MobHealth DB
                                        if (framestyle == 1) then       -- This chunk of code is the same as the next two blocks in case you customize this
                                                Perl_Target_HealthBarTextRight:SetText();                                                       -- Hide this text in this frame style
                                                Perl_Target_HealthBarTextCompactPercent:SetText();                                              -- Hide this text in this frame style
                                                Perl_Target_HealthBarText:SetText(targethealth.."%");
                                        elseif (framestyle == 2) then
                                                if (compactmode == 0) then
                                                        Perl_Target_HealthBarTextCompactPercent:SetText();                                      -- Hide this text in this frame style
                                                        Perl_Target_HealthBarText:SetText(targethealth.."%");
                                                        Perl_Target_HealthBarTextRight:SetText(targethealth.."%");
                                                else
                                                        if (compactpercent == 0) then
                                                                Perl_Target_HealthBarTextRight:SetText();                                       -- Hide this text in this frame style
                                                                Perl_Target_HealthBarTextCompactPercent:SetText();                              -- Hide this text in this frame style
                                                                Perl_Target_HealthBarText:SetText(targethealth.."%");
                                                        else
                                                                Perl_Target_HealthBarTextRight:SetText();                                       -- Hide this text in this frame style
                                                                Perl_Target_HealthBarText:SetText(targethealth.."%");
                                                                Perl_Target_HealthBarTextCompactPercent:SetText(targethealth.."%");
                                                        end
                                                end
                                        end
                                end
                        -- End MobHealth Support
                        else
                                -- MobHealth isn't installed
                                if (framestyle == 1) then
                                        Perl_Target_HealthBarTextRight:SetText();                                                       -- Hide this text in this frame style
                                        Perl_Target_HealthBarTextCompactPercent:SetText();                                              -- Hide this text in this frame style
                                        Perl_Target_HealthBarText:SetText(targethealth.."%");
                                elseif (framestyle == 2) then
                                        if (compactmode == 0) then
                                                Perl_Target_HealthBarTextCompactPercent:SetText();                                      -- Hide this text in this frame style
                                                Perl_Target_HealthBarText:SetText(targethealth.."%");
                                                Perl_Target_HealthBarTextRight:SetText(targethealth.."%");
                                        else
                                                if (compactpercent == 0) then
                                                        Perl_Target_HealthBarTextRight:SetText();                                       -- Hide this text in this frame style
                                                        Perl_Target_HealthBarTextCompactPercent:SetText();                              -- Hide this text in this frame style
                                                        Perl_Target_HealthBarText:SetText(targethealth.."%");
                                                else
                                                        Perl_Target_HealthBarTextRight:SetText();                                       -- Hide this text in this frame style
                                                        Perl_Target_HealthBarText:SetText(targethealth.."%");
                                                        Perl_Target_HealthBarTextCompactPercent:SetText(targethealth.."%");
                                                end
                                        end
                                end
                        end
                else    -- mobhealthsupport == 0
                        if (MobHealthFrame) then
                                MobHealthFrame:Show();
                        end

                        -- MobHealth support is disabled
                        if (framestyle == 1) then
                                Perl_Target_HealthBarTextRight:SetText();                                                       -- Hide this text in this frame style
                                Perl_Target_HealthBarTextCompactPercent:SetText();                                              -- Hide this text in this frame style
                                Perl_Target_HealthBarText:SetText(targethealth.."%");
                        elseif (framestyle == 2) then
                                if (compactmode == 0) then
                                        Perl_Target_HealthBarTextCompactPercent:SetText();                                      -- Hide this text in this frame style
                                        Perl_Target_HealthBarText:SetText(targethealth.."%");
                                        Perl_Target_HealthBarTextRight:SetText(targethealth.."%");
                                else
                                        if (compactpercent == 0) then
                                                Perl_Target_HealthBarTextRight:SetText();                                       -- Hide this text in this frame style
                                                Perl_Target_HealthBarTextCompactPercent:SetText();                              -- Hide this text in this frame style
                                                Perl_Target_HealthBarText:SetText(targethealth.."%");
                                        else
                                                Perl_Target_HealthBarTextRight:SetText();                                       -- Hide this text in this frame style
                                                Perl_Target_HealthBarText:SetText(targethealth.."%");
                                                Perl_Target_HealthBarTextCompactPercent:SetText(targethealth.."%");
                                        end
                                end
                        end
                end
        else
                -- Self/Party/Raid member
                if (framestyle == 1) then
                        Perl_Target_HealthBarTextRight:SetText();                                                       -- Hide this text in this frame style
                        Perl_Target_HealthBarTextCompactPercent:SetText();                                              -- Hide this text in this frame style
                        Perl_Target_HealthBarText:SetText(targethealth.."/"..targethealthmax);
                elseif (framestyle == 2) then
                        if (compactmode == 0) then
                                Perl_Target_HealthBarTextCompactPercent:SetText();                                      -- Hide this text in this frame style
                                Perl_Target_HealthBarText:SetText(targethealthpercent.."%");
                                Perl_Target_HealthBarTextRight:SetText(targethealth.."/"..targethealthmax);
                        else
                                if (compactpercent == 0) then
                                        Perl_Target_HealthBarTextRight:SetText();                                       -- Hide this text in this frame style
                                        Perl_Target_HealthBarTextCompactPercent:SetText();                              -- Hide this text in this frame style
                                        Perl_Target_HealthBarText:SetText(targethealth.."/"..targethealthmax);
                                else
                                        Perl_Target_HealthBarTextRight:SetText();                                       -- Hide this text in this frame style
                                        Perl_Target_HealthBarText:SetText(targethealth.."/"..targethealthmax);
                                        Perl_Target_HealthBarTextCompactPercent:SetText(targethealthpercent.."%");
                                end
                        end
                end
        end
end

function Perl_Target_Update_Mana()
        local targetmana = UnitMana("target");
        local targetmanamax = UnitManaMax("target");
        local targetpower = UnitPowerType("target");

        if (UnitIsDead("target") or UnitIsGhost("target")) then                         -- This prevents negative mana
                targetmana = 0;
        end

        Perl_Target_ManaBar:SetMinMaxValues(0, targetmanamax);
        Perl_Target_ManaBar:SetValue(targetmana);

        if (framestyle == 1) then
                Perl_Target_ManaBarTextRight:SetText();                 -- Hide this text in this frame style
                Perl_Target_ManaBarTextCompactPercent:SetText();        -- Hide this text in this frame style

                if (targetpower == 1 or targetpower == 2) then
                        Perl_Target_ManaBarText:SetText(targetmana);
                else
                        Perl_Target_ManaBarText:SetText(targetmana.."/"..targetmanamax);
                end
        elseif (framestyle == 2) then
                local targetmanapercent = floor(targetmana/targetmanamax*100+0.5);

                if (compactmode == 0) then
                        Perl_Target_ManaBarTextCompactPercent:SetText();        -- Hide this text in this frame style

                        if (targetpower == 1 or targetpower == 2) then
                                Perl_Target_ManaBarText:SetText(targetmana.."%");
                                Perl_Target_ManaBarTextRight:SetText(targetmana);
                        else
                                Perl_Target_ManaBarText:SetText(targetmanapercent.."%");
                                Perl_Target_ManaBarTextRight:SetText(targetmana.."/"..targetmanamax);
                        end
                else
                        if (compactpercent == 0) then
                                Perl_Target_ManaBarTextRight:SetText();                 -- Hide this text in this frame style
                                Perl_Target_ManaBarTextCompactPercent:SetText();        -- Hide this text in this frame style

                                if (targetpower == 1 or targetpower == 2) then
                                        Perl_Target_ManaBarText:SetText(targetmana);
                                else
                                        Perl_Target_ManaBarText:SetText(targetmana.."/"..targetmanamax);
                                end
                        else
                                Perl_Target_ManaBarTextRight:SetText();                 -- Hide this text in this frame style

                                if (targetpower == 1 or targetpower == 2) then
                                        Perl_Target_ManaBarText:SetText(targetmana);
                                        Perl_Target_ManaBarTextCompactPercent:SetText(targetmana.."%");
                                else
                                        Perl_Target_ManaBarText:SetText(targetmana.."/"..targetmanamax);
                                        Perl_Target_ManaBarTextCompactPercent:SetText(targetmanapercent.."%");
                                end
                        end
                end
        end
end

function Perl_Target_Update_Mana_Bar()
        local targetmanamax = UnitManaMax("target");
        local targetpower = UnitPowerType("target");

        -- Set mana bar color
        if (targetmanamax == 0) then
                Perl_Target_ManaBar:Hide();
                Perl_Target_ManaBarBG:Hide();
                Perl_Target_StatsFrame:SetHeight(30);
                Perl_Target_StatsFrame_CastClickOverlay:SetHeight(30);
        elseif (targetpower == 1) then
                Perl_Target_ManaBar:SetStatusBarColor(1, 0, 0, 1);
                Perl_Target_ManaBarBG:SetStatusBarColor(1, 0, 0, 0.25);
                Perl_Target_ManaBar:Show();
                Perl_Target_ManaBarBG:Show();
                Perl_Target_StatsFrame:SetHeight(42);
                Perl_Target_StatsFrame_CastClickOverlay:SetHeight(42);
        elseif (targetpower == 2) then
                Perl_Target_ManaBar:SetStatusBarColor(1, 0.5, 0, 1);
                Perl_Target_ManaBarBG:SetStatusBarColor(1, 0.5, 0, 0.25);
                Perl_Target_ManaBar:Show();
                Perl_Target_ManaBarBG:Show();
                Perl_Target_StatsFrame:SetHeight(42);
                Perl_Target_StatsFrame_CastClickOverlay:SetHeight(42);
        elseif (targetpower == 3) then
                Perl_Target_ManaBar:SetStatusBarColor(1, 1, 0, 1);
                Perl_Target_ManaBarBG:SetStatusBarColor(1, 1, 0, 0.25);
                Perl_Target_ManaBar:Show();
                Perl_Target_ManaBarBG:Show();
                Perl_Target_StatsFrame:SetHeight(42);
                Perl_Target_StatsFrame_CastClickOverlay:SetHeight(42);
        else
                Perl_Target_ManaBar:SetStatusBarColor(0, 0, 1, 1);
                Perl_Target_ManaBarBG:SetStatusBarColor(0, 0, 1, 0.25);
                Perl_Target_ManaBar:Show();
                Perl_Target_ManaBarBG:Show();
                Perl_Target_StatsFrame:SetHeight(42);
                Perl_Target_StatsFrame_CastClickOverlay:SetHeight(42);
        end
end

function Perl_Target_Update_Combo_Points()
        local combopoints = GetComboPoints();                           -- How many Combo Points does the player have?
        ComboFrame:Hide();                                              -- Hide default Combo Points

        if (showcp == 1) then
                Perl_Target_CPText:SetText(combopoints);
                Perl_Target_CPText:SetTextHeight(20);
                if (combopoints == 5) then
                        Perl_Target_CPFrame:Show();
                        Perl_Target_CPText:SetTextColor(1, 0, 0);       -- red text
                elseif (combopoints == 4) then
                        Perl_Target_CPFrame:Show();
                        Perl_Target_CPText:SetTextColor(1, 0.5, 0);     -- orange text
                elseif (combopoints == 3) then
                        Perl_Target_CPFrame:Show();
                        Perl_Target_CPText:SetTextColor(1, 1, 0);       -- yellow text
                elseif (combopoints == 2) then
                        Perl_Target_CPFrame:Show();
                        Perl_Target_CPText:SetTextColor(0.5, 1, 0);     -- yellow-green text
                elseif (combopoints == 1) then
                        Perl_Target_CPFrame:Show();
                        Perl_Target_CPText:SetTextColor(0, 1, 0);       -- green text
                else
                        Perl_Target_CPFrame:Hide();
                end
        else
                Perl_Target_CPFrame:Hide();
        end

        if (nameframecombopoints == 1) then                             -- this isn't nested since you can have both combo point styles on at the same time
                Perl_Target_NameFrame_CPMeter:SetMinMaxValues(0, 5);
                Perl_Target_NameFrame_CPMeter:SetValue(combopoints);
                if (combopoints == 5) then
                        Perl_Target_NameFrame_CPMeter:Show();
                        
                elseif (combopoints == 4) then
                        Perl_Target_NameFrame_CPMeter:Show();
                elseif (combopoints == 3) then
                        Perl_Target_NameFrame_CPMeter:Show();
                elseif (combopoints == 2) then
                        Perl_Target_NameFrame_CPMeter:Show();
                elseif (combopoints == 1) then
                        Perl_Target_NameFrame_CPMeter:Show();
                else
                        Perl_Target_NameFrame_CPMeter:Hide();
                end
        else
                Perl_Target_NameFrame_CPMeter:Hide();
        end
end

function Perl_Target_Update_PvP_Status_Icon()
        if (showpvpicon == 1) then
                local factionGroup = UnitFactionGroup("target");
                if (UnitIsPVPFreeForAll("target")) then
                        Perl_Target_PVPStatus:SetTexture("Interface\\TargetingFrame\\UI-PVP-FFA");
                        Perl_Target_PVPStatus:Show();
                elseif (factionGroup and UnitIsPVP("target")) then
                        Perl_Target_PVPStatus:SetTexture("Interface\\TargetingFrame\\UI-PVP-"..factionGroup);
                        Perl_Target_PVPStatus:Show();
                else
                        Perl_Target_PVPStatus:Hide();
                end
        else
                Perl_Target_PVPStatus:Hide();
        end
end

function Perl_Target_Update_Text_Color()
        if (UnitIsPlayer("target") or UnitPlayerControlled("target")) then              -- is it a player
                local r, g, b;
                if (UnitCanAttack("target", "player")) then                             -- are we in an enemy controlled zone
                        -- Hostile players are red
                        if (not UnitCanAttack("player", "target")) then                 -- enemy is not pvp enabled
                                r = 0.5;
                                g = 0.5;
                                b = 1.0;
                        else                                                            -- enemy is pvp enabled
                                r = 1.0;
                                g = 0.0;
                                b = 0.0;
                        end
                elseif (UnitCanAttack("player", "target")) then                         -- enemy in a zone controlled by friendlies or when we're a ghost
                        -- Players we can attack but which are not hostile are yellow
                        r = 1.0;
                        g = 1.0;
                        b = 0.0;
                elseif (UnitIsPVP("target")) then                                       -- friendly pvp enabled character
                        -- Players we can assist but are PvP flagged are green
                        r = 0.0;
                        g = 1.0;
                        b = 0.0;
                else                                                                    -- friendly non pvp enabled character
                        -- All other players are blue (the usual state on the "blue" server)
                        r = 0.5;
                        g = 0.5;
                        b = 1.0;
                end
                Perl_Target_NameBarText:SetTextColor(r, g, b);
        elseif (UnitIsTapped("target") and not UnitIsTappedByPlayer("target")) then
                Perl_Target_NameBarText:SetTextColor(0.5,0.5,0.5);                      -- not our tap
        else
                local reaction = UnitReaction("target", "player");
                if (reaction) then
                        local r, g, b;
                        r = UnitReactionColor[reaction].r;
                        g = UnitReactionColor[reaction].g;
                        b = UnitReactionColor[reaction].b;
                        Perl_Target_NameBarText:SetTextColor(r, g, b);
                else
                        Perl_Target_NameBarText:SetTextColor(0.5, 0.5, 1.0);
                end
        end
end

function Perl_Target_Frame_Set_Name()
        local targetname = UnitName("target");

        -- Set name
        if (framestyle == 1) then
                if (strlen(targetname) > 19) then
                        targetname = strsub(targetname, 1, 18).."...";
                end
        elseif (framestyle == 2) then
                if (compactmode == 0) then
                        if (strlen(targetname) > 19) then
                                targetname = strsub(targetname, 1, 18).."...";
                        end
                else
                        if (compactpercent == 1) then
                                if (strlen(targetname) > 15) then
                                        targetname = strsub(targetname, 1, 14).."...";
                                end
                        else
                                if (strlen(targetname) > 11) then
                                        targetname = strsub(targetname, 1, 10).."...";
                                end
                        end
                end
        end
        
        Perl_Target_NameBarText:SetText(targetname);
end

function Perl_Target_Frame_Set_PvPRank()
        if (showpvprank == 1) then
                if (UnitIsPlayer("target")) then
                        local rankNumber = UnitPVPRank("target");
                        if (rankNumber == 0) then
                                Perl_Target_PVPRank:Hide();
                        elseif (rankNumber < 14) then
                                rankNumber = rankNumber - 4;
                                Perl_Target_PVPRank:SetTexture("Interface\\PvPRankBadges\\PvPRank0"..rankNumber);
                                Perl_Target_PVPRank:Show();
                        else
                                rankNumber = rankNumber - 4;
                                Perl_Target_PVPRank:SetTexture("Interface\\PvPRankBadges\\PvPRank"..rankNumber);
                                Perl_Target_PVPRank:Show();
                        end
                else
                        Perl_Target_PVPRank:Hide();
                end
        else
                Perl_Target_PVPRank:Hide();
        end
end

function Perl_Target_Frame_Set_Level()
        local targetlevel = UnitLevel("target");                        -- Get and store the level of the target
        local targetlevelcolor = GetDifficultyColor(targetlevel);       -- Get the "con color" of the target
        local targetclassification = UnitClassification("target");      -- Get the type of character the target is (rare, elite, worldboss)
        local targetclassificationframetext = nil;                      -- Variable set to nil so we can easily track if target is a player or not elite

        Perl_Target_LevelBarText:SetVertexColor(targetlevelcolor.r, targetlevelcolor.g, targetlevelcolor.b);
        Perl_Target_RareEliteBarText:SetVertexColor(targetlevelcolor.r, targetlevelcolor.g, targetlevelcolor.b);

        if ((targetclassification == "worldboss") or (targetlevel < 0)) then
                Perl_Target_LevelBarText:SetTextColor(1, 0, 0);
                if (UnitIsPlayer("target")) then
                        targetclassificationframetext = nil;
                else
                        Perl_Target_RareEliteBarText:SetTextColor(1, 0, 0);
                        targetclassificationframetext = "Boss";
                end
                targetlevel = "??";
        end

        if (targetclassification == "rareelite") then
                targetclassificationframetext = "Rare+";
                targetlevel = targetlevel.."r+";
        elseif (targetclassification == "elite") then
                targetclassificationframetext = "Elite";
                targetlevel = targetlevel.."+";
        elseif (targetclassification == "rare") then
                targetclassificationframetext = "Rare";
                targetlevel = targetlevel.."r";
        end

        Perl_Target_LevelBarText:SetText(targetlevel);                                                  -- Set level frame text

        if (showrareeliteframe == 1) then
                if (targetclassificationframetext == nil) then
                        Perl_Target_RareEliteFrame:Hide();                                              -- RareElite is hidden if target is a player
                else
                        Perl_Target_RareEliteFrame:Show();                                              -- RareElite is hidden if shown if target is a npc
                        Perl_Target_RareEliteBarText:SetText(targetclassificationframetext);            -- Set the text
                end
        else
                Perl_Target_RareEliteFrame:Hide();                                                      -- RareElite is hidden if disabled
        end
end

function Perl_Target_Set_Character_Class_Icon()
        if (showclassicon == 1) then
                if (UnitIsPlayer("target")) then
                        local PlayerClass = UnitClass("target");
                        Perl_Target_ClassTexture:SetTexCoord(Perl_Target_ClassPosRight[PlayerClass], Perl_Target_ClassPosLeft[PlayerClass], Perl_Target_ClassPosTop[PlayerClass], Perl_Target_ClassPosBottom[PlayerClass]);
                        Perl_Target_ClassTexture:Show();
                else
                        Perl_Target_ClassTexture:Hide();
                end
        else
                Perl_Target_ClassTexture:Hide();
        end
end

function Perl_Target_Set_Target_Class()
        if (showclassframe == 1) then
                if (UnitIsPlayer("target")) then
                        local targetClass = UnitClass("target");
                        Perl_Target_ClassNameBarText:SetText(targetClass);
                        Perl_Target_ClassNameFrame:Show();
                        Perl_Target_CivilianFrame:Hide();
                else
                        local targetCreatureType = UnitCreatureType("target");
                        if (targetCreatureType == PERL_LOCALIZED_NOTSPECIFIED) then
                                targetCreatureType = PERL_LOCALIZED_CREATURE;
                        end
                        Perl_Target_ClassNameBarText:SetText(targetCreatureType);
                        Perl_Target_ClassNameFrame:Show();

                        if (UnitIsCivilian("target")) then
                                Perl_Target_CivilianBarText:SetText(PERL_LOCALIZED_CIVILIAN);
                                Perl_Target_CivilianBarText:SetTextColor(1, 0, 0);
                                Perl_Target_CivilianFrame:Show();
                        else
                                Perl_Target_CivilianFrame:Hide();
                        end
                end
        else
                Perl_Target_ClassNameFrame:Hide();
                Perl_Target_CivilianFrame:Hide();
        end
end

function Perl_Target_Update_Portrait()
        if (showportrait == 1) then
                local level = Perl_Target_PortraitFrame:GetFrameLevel();                                        -- Get the frame level of the main portrait frame
                Perl_Target_PortraitTextFrame:SetFrameLevel(level + 1);                                         -- Put the combat text above it so the portrait graphic doesn't go on top of it

                Perl_Target_CPFrame:SetPoint("TOPLEFT", Perl_Target_PortraitFrame, "TOPRIGHT", -4, -31);        -- Reposition the combo point frame
                Perl_Target_PortraitFrame:Show();                                                               -- Show the main portrait frame

                if (threedportrait == 0) then
                        SetPortraitTexture(Perl_Target_Portrait, "target");                                     -- Load the correct 2d graphic
                        Perl_Target_PortraitFrame_TargetModel:Hide();                                           -- Hide the 3d graphic
                        Perl_Target_Portrait:Show();                                                            -- Show the 2d graphic
                else
                        if UnitIsVisible("target") then
                                Perl_Target_PortraitFrame_TargetModel:SetUnit("target");                        -- Load the correct 3d graphic
                                Perl_Target_Portrait:Hide();                                                    -- Hide the 2d graphic
                                Perl_Target_PortraitFrame_TargetModel:Show();                                   -- Show the 3d graphic
                                Perl_Target_PortraitFrame_TargetModel:SetCamera(0);
                        else
                                SetPortraitTexture(Perl_Target_Portrait, "target");                             -- Load the correct 2d graphic
                                Perl_Target_PortraitFrame_TargetModel:Hide();                                   -- Hide the 3d graphic
                                Perl_Target_Portrait:Show();                                                    -- Show the 2d graphic
                        end
                end

                Perl_Target_PortraitTextFrame:Show();                                                           -- Show the combat text frame
        else
                Perl_Target_CPFrame:SetPoint("TOPLEFT", Perl_Target_StatsFrame, "TOPRIGHT", -4, 0);             -- Reposition the combo point frame
                Perl_Target_PortraitFrame:Hide();                                                               -- Hide the frame and 2d/3d portion
                Perl_Target_PortraitTextFrame:Hide();                                                           -- Hide the combat text
        end
end

function Perl_Target_Portrait_Combat_Text()
        if (portraitcombattext == 1) then
                CombatFeedback_OnUpdate(arg1);
        end
end

function Perl_Target_Buff_Debuff_Background()
        if (hidebuffbackground == 0) then
                Perl_Target_BuffFrame:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = true, tileSize = 16, edgeSize = 16, insets = { left = 5, right = 5, top = 5, bottom = 5 }});
                Perl_Target_DebuffFrame:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = true, tileSize = 16, edgeSize = 16, insets = { left = 5, right = 5, top = 5, bottom = 5 }});
                Perl_Target_BuffFrame:SetBackdropColor(0, 0, 0, 1);
                Perl_Target_BuffFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1);
                Perl_Target_DebuffFrame:SetBackdropColor(0, 0, 0, 1);
                Perl_Target_DebuffFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1);
        else
                Perl_Target_BuffFrame:SetBackdrop(nil);
                Perl_Target_DebuffFrame:SetBackdrop(nil);
        end
end

function Perl_Target_Frame_Style()
        Perl_Target_RareEliteFrame:SetPoint("TOPLEFT", "Perl_Target_CivilianFrame", "TOPRIGHT", -5, 0);

        if (framestyle == 1) then
                Perl_Target_HealthBar:SetWidth(200);
                Perl_Target_HealthBarBG:SetWidth(200);
                Perl_Target_ManaBar:SetWidth(200);
                Perl_Target_ManaBarBG:SetWidth(200);
                Perl_Target_HealthBar:SetPoint("TOP", "Perl_Target_StatsFrame", "TOP", 0, -10);
                Perl_Target_ManaBar:SetPoint("TOP", "Perl_Target_HealthBar", "BOTTOM", 0, -2);

                Perl_Target_CivilianFrame:SetWidth(95);
                Perl_Target_ClassNameFrame:SetWidth(90);
                Perl_Target_LevelFrame:SetWidth(46);
                Perl_Target_Name:SetWidth(180);
                Perl_Target_NameFrame:SetWidth(180);
                Perl_Target_RareEliteFrame:SetWidth(46);
                Perl_Target_StatsFrame:SetWidth(221);

                Perl_Target_NameFrame_CPMeter:SetWidth(170);

                Perl_Target_CivilianFrame_CastClickOverlay:SetWidth(95);
                Perl_Target_NameFrame_CastClickOverlay:SetWidth(180);
                Perl_Target_StatsFrame_CastClickOverlay:SetWidth(221);
        elseif (framestyle == 2) then
                Perl_Target_HealthBar:SetWidth(150);
                Perl_Target_HealthBarBG:SetWidth(150);
                Perl_Target_ManaBar:SetWidth(150);
                Perl_Target_ManaBarBG:SetWidth(150);
                Perl_Target_HealthBar:SetPoint("TOPLEFT", "Perl_Target_StatsFrame", "TOPLEFT", 10, -10);
                Perl_Target_ManaBar:SetPoint("TOP", "Perl_Target_HealthBar", "BOTTOM", 0, -2);

                if (compactmode == 0) then
                        Perl_Target_CivilianFrame:SetWidth(114);
                        Perl_Target_ClassNameFrame:SetWidth(90);
                        Perl_Target_LevelFrame:SetWidth(46);
                        Perl_Target_Name:SetWidth(199);
                        Perl_Target_NameFrame:SetWidth(199);
                        Perl_Target_RareEliteFrame:SetWidth(46);
                        Perl_Target_StatsFrame:SetWidth(240);

                        Perl_Target_NameFrame_CPMeter:SetWidth(189);

                        Perl_Target_CivilianFrame_CastClickOverlay:SetWidth(114);
                        Perl_Target_NameFrame_CastClickOverlay:SetWidth(199);
                        Perl_Target_StatsFrame_CastClickOverlay:SetWidth(240);
                else
                        if (compactpercent == 0) then
                                Perl_Target_CivilianFrame:SetWidth(85);
                                Perl_Target_ClassNameFrame:SetWidth(90);
                                Perl_Target_LevelFrame:SetWidth(46);
                                Perl_Target_Name:SetWidth(129);
                                Perl_Target_NameFrame:SetWidth(129);
                                Perl_Target_RareEliteFrame:SetWidth(46);
                                Perl_Target_StatsFrame:SetWidth(170);
                                Perl_Target_RareEliteFrame:SetPoint("TOPLEFT", "Perl_Target_CivilianFrame", "TOPRIGHT", -46, 0);

                                Perl_Target_NameFrame_CPMeter:SetWidth(119);

                                Perl_Target_CivilianFrame_CastClickOverlay:SetWidth(85);
                                Perl_Target_NameFrame_CastClickOverlay:SetWidth(129);
                                Perl_Target_StatsFrame_CastClickOverlay:SetWidth(170);
                        else
                                Perl_Target_CivilianFrame:SetWidth(79);
                                Perl_Target_ClassNameFrame:SetWidth(90);
                                Perl_Target_LevelFrame:SetWidth(46);
                                Perl_Target_Name:SetWidth(164);
                                Perl_Target_NameFrame:SetWidth(164);
                                Perl_Target_RareEliteFrame:SetWidth(46);
                                Perl_Target_StatsFrame:SetWidth(205);

                                Perl_Target_NameFrame_CPMeter:SetWidth(154);

                                Perl_Target_CivilianFrame_CastClickOverlay:SetWidth(79);
                                Perl_Target_NameFrame_CastClickOverlay:SetWidth(164);
                                Perl_Target_StatsFrame_CastClickOverlay:SetWidth(205);
                        end
                end
        end
end

function Perl_Target_Set_Localized_ClassIcons()
        Perl_Target_ClassPosRight = {
                [PERL_LOCALIZED_DRUID] = 0.75,
                [PERL_LOCALIZED_HUNTER] = 0,
                [PERL_LOCALIZED_MAGE] = 0.25,
                [PERL_LOCALIZED_PALADIN] = 0,
                [PERL_LOCALIZED_PRIEST] = 0.5,
                [PERL_LOCALIZED_ROGUE] = 0.5,
                [PERL_LOCALIZED_SHAMAN] = 0.25,
                [PERL_LOCALIZED_WARLOCK] = 0.75,
                [PERL_LOCALIZED_WARRIOR] = 0,
        };
        Perl_Target_ClassPosLeft = {
                [PERL_LOCALIZED_DRUID] = 1,
                [PERL_LOCALIZED_HUNTER] = 0.25,
                [PERL_LOCALIZED_MAGE] = 0.5,
                [PERL_LOCALIZED_PALADIN] = 0.25,
                [PERL_LOCALIZED_PRIEST] = 0.75,
                [PERL_LOCALIZED_ROGUE] = 0.75,
                [PERL_LOCALIZED_SHAMAN] = 0.5,
                [PERL_LOCALIZED_WARLOCK] = 1,
                [PERL_LOCALIZED_WARRIOR] = 0.25,
        };
        Perl_Target_ClassPosTop = {
                [PERL_LOCALIZED_DRUID] = 0,
                [PERL_LOCALIZED_HUNTER] = 0.25,
                [PERL_LOCALIZED_MAGE] = 0,
                [PERL_LOCALIZED_PALADIN] = 0.5,
                [PERL_LOCALIZED_PRIEST] = 0.25,
                [PERL_LOCALIZED_ROGUE] = 0,
                [PERL_LOCALIZED_SHAMAN] = 0.25,
                [PERL_LOCALIZED_WARLOCK] = 0.25,
                [PERL_LOCALIZED_WARRIOR] = 0,
                
        };
        Perl_Target_ClassPosBottom = {
                [PERL_LOCALIZED_DRUID] = 0.25,
                [PERL_LOCALIZED_HUNTER] = 0.5,
                [PERL_LOCALIZED_MAGE] = 0.25,
                [PERL_LOCALIZED_PALADIN] = 0.75,
                [PERL_LOCALIZED_PRIEST] = 0.5,
                [PERL_LOCALIZED_ROGUE] = 0.25,
                [PERL_LOCALIZED_SHAMAN] = 0.5,
                [PERL_LOCALIZED_WARLOCK] = 0.5,
                [PERL_LOCALIZED_WARRIOR] = 0.25,
        };
end


--------------------------
-- GUI Config Functions --
--------------------------
function Perl_Target_Set_Buffs(newbuffnumber)
        if (newbuffnumber == nil) then
                newbuffnumber = 16;
        end
        numbuffsshown = newbuffnumber;
        Perl_Target_UpdateVars();
        Perl_Target_Reset_Buffs();      -- Reset the buff icons
        Perl_Target_Buff_UpdateAll();   -- Repopulate the buff icons
end

function Perl_Target_Set_Debuffs(newdebuffnumber)
        if (newdebuffnumber == nil) then
                newdebuffnumber = 16;
        end
        numdebuffsshown = newdebuffnumber;
        Perl_Target_UpdateVars();
        Perl_Target_Reset_Buffs();      -- Reset the buff icons
        Perl_Target_Buff_UpdateAll();   -- Repopulate the buff icons
end

function Perl_Target_Set_Class_Icon(newvalue)
        showclassicon = newvalue;
        Perl_Target_UpdateVars();
        Perl_Target_Update_Once();
end

function Perl_Target_Set_PvP_Rank_Icon(newvalue)
        showpvprank = newvalue;
        Perl_Target_UpdateVars();
        Perl_Target_Update_Once();
end

function Perl_Target_Set_PvP_Status_Icon(newvalue)
        showpvpicon = newvalue;
        Perl_Target_UpdateVars();
        Perl_Target_Update_Once();
end

function Perl_Target_Set_Class_Frame(newvalue)
        showclassframe = newvalue;
        Perl_Target_UpdateVars();
        Perl_Target_Update_Once();
end

function Perl_Target_Set_Combo_Points(newvalue)
        showcp = newvalue;
        Perl_Target_UpdateVars();
        Perl_Target_Update_Once();
end

function Perl_Target_Set_MobHealth(newvalue)
        mobhealthsupport = newvalue;
        Perl_Target_UpdateVars();
        Perl_Target_Update_Once();
end

function Perl_Target_Set_Lock(newvalue)
        locked = newvalue;
        Perl_Target_UpdateVars();
end

function Perl_Target_Set_Portrait(newvalue)
        showportrait = newvalue;
        Perl_Target_UpdateVars();
        Perl_Target_Update_Once();
end

function Perl_Target_Set_3D_Portrait(newvalue)
        threedportrait = newvalue;
        Perl_Target_UpdateVars();
        Perl_Target_Update_Once();
end

function Perl_Target_Set_Rare_Elite(newvalue)
        showrareeliteframe = newvalue;
        Perl_Target_UpdateVars();
        Perl_Target_Update_Once();
end

function Perl_Target_Set_Portrait_Combat_Text(newvalue)
        portraitcombattext = newvalue;
        Perl_Target_UpdateVars();
end

function Perl_Target_Set_Combo_Name_Frame(newvalue)
        nameframecombopoints = newvalue;
        Perl_Target_UpdateVars();
        Perl_Target_Update_Once();
end

function Perl_Target_Set_Combo_Frame_Debuffs(newvalue)
        comboframedebuffs = newvalue;
        Perl_Target_UpdateVars();
        Perl_Target_Update_Once();
end

function Perl_Target_Set_Frame_Style(newvalue)
        framestyle = newvalue;
        Perl_Target_UpdateVars();
        Perl_Target_Frame_Style();
        Perl_Target_Update_Once();
end

function Perl_Target_Set_Compact_Mode(newvalue)
        compactmode = newvalue;
        Perl_Target_UpdateVars();
        Perl_Target_Frame_Style();
        Perl_Target_Update_Once();
end

function Perl_Target_Set_Compact_Percents(newvalue)
        compactpercent = newvalue;
        Perl_Target_UpdateVars();
        Perl_Target_Frame_Style();
        Perl_Target_Update_Once();
end

function Perl_Target_Set_Buff_Debuff_Background(newvalue)
        hidebuffbackground = newvalue;
        Perl_Target_UpdateVars();
        Perl_Target_Buff_Debuff_Background();
end

function Perl_Target_Set_Scale(number)
        local unsavedscale;
        if (number ~= nil) then
                scale = (number / 100);                                 -- convert the user input to a wow acceptable value
        end
        unsavedscale = 1 - UIParent:GetEffectiveScale() + scale;        -- run it through the scaling formula introduced in 1.9
        Perl_Target_Frame:SetScale(unsavedscale);
        Perl_Target_Set_BuffDebuff_Scale(buffdebuffscale*100);          -- maintain the buff/debuff scale
        Perl_Target_UpdateVars();
end

function Perl_Target_Set_BuffDebuff_Scale(number)
        local unsavedscale;
        if (number ~= nil) then
                buffdebuffscale = (number / 100);                               -- convert the user input to a wow acceptable value
        end
        unsavedscale = 1 - UIParent:GetEffectiveScale() + buffdebuffscale;      -- run it through the scaling formula introduced in 1.9
        Perl_Target_BuffFrame:SetScale(buffdebuffscale);
        Perl_Target_DebuffFrame:SetScale(buffdebuffscale);
        Perl_Target_UpdateVars();
end

function Perl_Target_Set_Transparency(number)
        if (number ~= nil) then
                transparency = (number / 100);                          -- convert the user input to a wow acceptable value
        end
        Perl_Target_Frame:SetAlpha(transparency);
        Perl_Target_UpdateVars();
end


------------------------------
-- Saved Variable Functions --
------------------------------
function Perl_Target_GetVars()
        locked = Perl_Target_Config[UnitName("player")]["Locked"];
        showcp = Perl_Target_Config[UnitName("player")]["ComboPoints"];
        showclassicon = Perl_Target_Config[UnitName("player")]["ClassIcon"];
        showclassframe = Perl_Target_Config[UnitName("player")]["ClassFrame"];
        showpvpicon = Perl_Target_Config[UnitName("player")]["PvPIcon"]; 
        numbuffsshown = Perl_Target_Config[UnitName("player")]["Buffs"];
        numdebuffsshown = Perl_Target_Config[UnitName("player")]["Debuffs"];
        mobhealthsupport = Perl_Target_Config[UnitName("player")]["MobHealthSupport"];
        scale = Perl_Target_Config[UnitName("player")]["Scale"];
        showpvprank = Perl_Target_Config[UnitName("player")]["ShowPvPRank"];
        transparency = Perl_Target_Config[UnitName("player")]["Transparency"];
        buffdebuffscale = Perl_Target_Config[UnitName("player")]["BuffDebuffScale"];
        showportrait = Perl_Target_Config[UnitName("player")]["ShowPortrait"];
        threedportrait = Perl_Target_Config[UnitName("player")]["ThreeDPortrait"];
        portraitcombattext = Perl_Target_Config[UnitName("player")]["PortraitCombatText"];
        showrareeliteframe = Perl_Target_Config[UnitName("player")]["ShowRareEliteFrame"];
        nameframecombopoints = Perl_Target_Config[UnitName("player")]["NameFrameComboPoints"];
        comboframedebuffs = Perl_Target_Config[UnitName("player")]["ComboFrameDebuffs"];
        framestyle = Perl_Target_Config[UnitName("player")]["FrameStyle"];
        compactmode = Perl_Target_Config[UnitName("player")]["CompactMode"];
        compactpercent = Perl_Target_Config[UnitName("player")]["CompactPercent"];
        hidebuffbackground = Perl_Target_Config[UnitName("player")]["HideBuffBackground"];

        if (locked == nil) then
                locked = 0;
        end
        if (showcp == nil) then
                showcp = 1;
        end
        if (showclassicon == nil) then
                showclassicon = 1;
        end
        if (showclassframe == nil) then
                showclassframe = 1;
        end
        if (showpvpicon == nil) then
                showpvpicon = 1;
        end
        if (numbuffsshown == nil) then
                numbuffsshown = 16;
        end
        if (numdebuffsshown == nil) then
                numdebuffsshown = 16;
        end
        if (mobhealthsupport == nil) then
                mobhealthsupport = 1;
        end
        if (scale == nil) then
                scale = 1;
        end
        if (showpvprank == nil) then
                showpvprank = 0;
        end
        if (transparency == nil) then
                transparency = 1;
        end
        if (buffdebuffscale == nil) then
                buffdebuffscale = 1;
        end
        if (showportrait == nil) then
                showportrait = 0;
        end
        if (threedportrait == nil) then
                threedportrait = 0;
        end
        if (portraitcombattext == nil) then
                portraitcombattext = 1;
        end
        if (showrareeliteframe == nil) then
                showrareeliteframe = 0;
        end
        if (nameframecombopoints == nil) then
                nameframecombopoints = 0;
        end
        if (comboframedebuffs == nil) then
                comboframedebuffs = 0;
        end
        if (framestyle == nil) then
                framestyle = 1;
        end
        if (compactmode == nil) then
                compactmode = 0;
        end
        if (compactpercent == nil) then
                compactpercent = 0;
        end
        if (hidebuffbackground == nil) then
                hidebuffbackground = 0;
        end

        local vars = {
                ["locked"] = locked,
                ["showcp"] = showcp,
                ["showclassicon"] = showclassicon,
                ["showclassframe"] = showclassframe,
                ["showpvpicon"] = showpvpicon,
                ["numbuffsshown"] = numbuffsshown,
                ["numdebuffsshown"] = numdebuffsshown,
                ["mobhealthsupport"] = mobhealthsupport,
                ["scale"] = scale,
                ["showpvprank"] = showpvprank,
                ["transparency"] = transparency,
                ["buffdebuffscale"] = buffdebuffscale,
                ["showportrait"] = showportrait,
                ["threedportrait"] = threedportrait,
                ["portraitcombattext"] = portraitcombattext,
                ["showrareeliteframe"] = showrareeliteframe,
                ["nameframecombopoints"] = nameframecombopoints,
                ["comboframedebuffs"] = comboframedebuffs,
                ["framestyle"] = framestyle,
                ["compactmode"] = compactmode,
                ["compactpercent"] = compactpercent,
                ["hidebuffbackground"] = hidebuffbackground,
        }
        return vars;
end

function Perl_Target_UpdateVars(vartable)
        if (vartable ~= nil) then
                -- Sanity checks in case you use a load from an old version
                if (vartable["Global Settings"] ~= nil) then
                        if (vartable["Global Settings"]["Locked"] ~= nil) then
                                locked = vartable["Global Settings"]["Locked"];
                        else
                                locked = nil;
                        end
                        if (vartable["Global Settings"]["ComboPoints"] ~= nil) then
                                showcp = vartable["Global Settings"]["ComboPoints"];
                        else
                                showcp = nil;
                        end
                        if (vartable["Global Settings"]["ClassIcon"] ~= nil) then
                                showclassicon = vartable["Global Settings"]["ClassIcon"];
                        else
                                showclassicon = nil;
                        end
                        if (vartable["Global Settings"]["ClassFrame"] ~= nil) then
                                showclassframe = vartable["Global Settings"]["ClassFrame"];
                        else
                                showclassframe = nil;
                        end
                        if (vartable["Global Settings"]["PvPIcon"] ~= nil) then
                                showpvpicon = vartable["Global Settings"]["PvPIcon"];
                        else
                                showpvpicon = nil;
                        end
                        if (vartable["Global Settings"]["Buffs"] ~= nil) then
                                numbuffsshown = vartable["Global Settings"]["Buffs"];
                        else
                                numbuffsshown = nil;
                        end
                        if (vartable["Global Settings"]["Debuffs"] ~= nil) then
                                numdebuffsshown = vartable["Global Settings"]["Debuffs"];
                        else
                                numdebuffsshown = nil;
                        end
                        if (vartable["Global Settings"]["MobHealthSupport"] ~= nil) then
                                mobhealthsupport = vartable["Global Settings"]["MobHealthSupport"];
                        else
                                mobhealthsupport = nil;
                        end
                        if (vartable["Global Settings"]["Scale"] ~= nil) then
                                scale = vartable["Global Settings"]["Scale"];
                        else
                                scale = nil;
                        end
                        if (vartable["Global Settings"]["ShowPvPRank"] ~= nil) then
                                showpvprank = vartable["Global Settings"]["ShowPvPRank"];
                        else
                                showpvprank = nil;
                        end
                        if (vartable["Global Settings"]["Transparency"] ~= nil) then
                                transparency = vartable["Global Settings"]["Transparency"];
                        else
                                transparency = nil;
                        end
                        if (vartable["Global Settings"]["BuffDebuffScale"] ~= nil) then
                                buffdebuffscale = vartable["Global Settings"]["BuffDebuffScale"];
                        else
                                buffdebuffscale = nil;
                        end
                        if (vartable["Global Settings"]["ShowPortrait"] ~= nil) then
                                showportrait = vartable["Global Settings"]["ShowPortrait"];
                        else
                                showportrait = nil;
                        end
                        if (vartable["Global Settings"]["ThreeDPortrait"] ~= nil) then
                                threedportrait = vartable["Global Settings"]["ThreeDPortrait"];
                        else
                                threedportrait = nil;
                        end
                        if (vartable["Global Settings"]["PortraitCombatText"] ~= nil) then
                                portraitcombattext = vartable["Global Settings"]["PortraitCombatText"];
                        else
                                portraitcombattext = nil;
                        end
                        if (vartable["Global Settings"]["ShowRareEliteFrame"] ~= nil) then
                                showrareeliteframe = vartable["Global Settings"]["ShowRareEliteFrame"];
                        else
                                showrareeliteframe = nil;
                        end
                        if (vartable["Global Settings"]["NameFrameComboPoints"] ~= nil) then
                                nameframecombopoints = vartable["Global Settings"]["NameFrameComboPoints"];
                        else
                                nameframecombopoints = nil;
                        end
                        if (vartable["Global Settings"]["ComboFrameDebuffs"] ~= nil) then
                                comboframedebuffs = vartable["Global Settings"]["ComboFrameDebuffs"];
                        else
                                comboframedebuffs = nil;
                        end
                        if (vartable["Global Settings"]["FrameStyle"] ~= nil) then
                                framestyle = vartable["Global Settings"]["FrameStyle"];
                        else
                                framestyle = nil;
                        end
                        if (vartable["Global Settings"]["CompactMode"] ~= nil) then
                                compactmode = vartable["Global Settings"]["CompactMode"];
                        else
                                compactmode = nil;
                        end
                        if (vartable["Global Settings"]["CompactPercent"] ~= nil) then
                                compactpercent = vartable["Global Settings"]["CompactPercent"];
                        else
                                compactpercent = nil;
                        end
                        if (vartable["Global Settings"]["HideBuffBackground"] ~= nil) then
                                hidebuffbackground = vartable["Global Settings"]["HideBuffBackground"];
                        else
                                hidebuffbackground = nil;
                        end
                end

                -- Set the new values if any new values were found, same defaults as above
                if (locked == nil) then
                        locked = 0;
                end
                if (showcp == nil) then
                        showcp = 1;
                end
                if (showclassicon == nil) then
                        showclassicon = 1;
                end
                if (showclassframe == nil) then
                        showclassframe = 1;
                end
                if (showpvpicon == nil) then
                        showpvpicon = 1;
                end
                if (numbuffsshown == nil) then
                        numbuffsshown = 16;
                end
                if (numdebuffsshown == nil) then
                        numdebuffsshown = 16;
                end
                if (mobhealthsupport == nil) then
                        mobhealthsupport = 1;
                end
                if (scale == nil) then
                        scale = 1;
                end
                if (showpvprank == nil) then
                        showpvprank = 0;
                end
                if (transparency == nil) then
                        transparency = 1;
                end
                if (buffdebuffscale == nil) then
                        buffdebuffscale = 1;
                end
                if (showportrait == nil) then
                        showportrait = 0;
                end
                if (threedportrait == nil) then
                        threedportrait = 0;
                end
                if (portraitcombattext == nil) then
                        portraitcombattext = 1;
                end
                if (showrareeliteframe == nil) then
                        showrareeliteframe = 0;
                end
                if (nameframecombopoints == nil) then
                        nameframecombopoints = 0;
                end
                if (comboframedebuffs == nil) then
                        comboframedebuffs = 0;
                end
                if (framestyle == nil) then
                        framestyle = 1;
                end
                if (compactmode == nil) then
                        compactmode = 0;
                end
                if (compactpercent == nil) then
                        compactpercent = 0;
                end
                if (hidebuffbackground == nil) then
                        hidebuffbackground = 0;
                end

                -- Call any code we need to activate them
                Perl_Target_Reset_Buffs();              -- Reset the buff icons
                Perl_Target_Frame_Style();              -- Reposition the frames
                Perl_Target_Buff_Debuff_Background();   -- Hide/Show the background frame
                Perl_Target_Update_Once();
        end

        Perl_Target_Config[UnitName("player")] = {
                ["Locked"] = locked,
                ["ComboPoints"] = showcp,
                ["ClassIcon"] = showclassicon,
                ["ClassFrame"] = showclassframe,
                ["PvPIcon"] = showpvpicon,
                ["Buffs"] = numbuffsshown,
                ["Debuffs"] = numdebuffsshown,
                ["MobHealthSupport"] = mobhealthsupport,
                ["Scale"] = scale,
                ["ShowPvPRank"] = showpvprank,
                ["Transparency"] = transparency,
                ["BuffDebuffScale"] = buffdebuffscale,
                ["ShowPortrait"] = showportrait,
                ["ThreeDPortrait"] = threedportrait,
                ["PortraitCombatText"] = portraitcombattext,
                ["ShowRareEliteFrame"] = showrareeliteframe,
                ["NameFrameComboPoints"] = nameframecombopoints,
                ["ComboFrameDebuffs"] = comboframedebuffs,
                ["FrameStyle"] = framestyle,
                ["CompactMode"] = compactmode,
                ["CompactPercent"] = compactpercent,
                ["HideBuffBackground"] = hidebuffbackground,
        };
end


--------------------
-- Buff Functions --
--------------------
function Perl_Target_Buff_UpdateAll()
        local friendly;
        if (UnitName("target")) then
                if (nameframecombopoints == 1 or comboframedebuffs == 1) then
                        Perl_Target_Buff_UpdateCPMeter();
                end

                if (UnitIsFriend("player", "target")) then
                        friendly = 1;
                else
                        friendly = 0;
                end

                local buffmax = 0;
                for buffnum=1,numbuffsshown do
                        local button = getglobal("Perl_Target_Buff"..buffnum);
                        local icon = getglobal(button:GetName().."Icon");
                        local debuff = getglobal(button:GetName().."DebuffBorder");

                        if (UnitBuff("target", buffnum)) then
                                icon:SetTexture(UnitBuff("target", buffnum));
                                button.isdebuff = 0;
                                debuff:Hide();
                                button:Show();
                                buffmax = buffnum;
                        else
                                button:Hide();
                        end
                end

                local debuffmax = 0;
                local debuffCount, debuffTexture, debuffApplications;
                for debuffnum=1,numdebuffsshown do
                        debuffTexture, debuffApplications = UnitDebuff("target", debuffnum);
                        local button = getglobal("Perl_Target_Debuff"..debuffnum);
                        local icon = getglobal(button:GetName().."Icon");
                        local debuff = getglobal(button:GetName().."DebuffBorder");

                        if (UnitDebuff("target", debuffnum)) then
                                icon:SetTexture(debuffTexture);
                                button.isdebuff = 1;
                                debuff:Show();
                                button:Show();
                                debuffCount = getglobal("Perl_Target_Debuff"..debuffnum.."Count");
                                if (debuffApplications > 1) then
                                        debuffCount:SetText(debuffApplications);
                                        debuffCount:Show();
                                else
                                        debuffCount:Hide();
                                end
                                debuffmax = debuffnum;
                        else
                                button:Hide();
                        end
                end

                if (buffmax == 0) then
                        Perl_Target_BuffFrame:Hide();
                else
                        if (friendly == 1) then
                                Perl_Target_BuffFrame:SetPoint("TOPLEFT", "Perl_Target_StatsFrame", "BOTTOMLEFT", 0, 5);
                        else
                                if (debuffmax > 8) then
                                        Perl_Target_BuffFrame:SetPoint("TOPLEFT", "Perl_Target_StatsFrame", "BOTTOMLEFT", 0, -51);
                                else
                                        Perl_Target_BuffFrame:SetPoint("TOPLEFT", "Perl_Target_StatsFrame", "BOTTOMLEFT", 0, -25);
                                end
                        end
                        Perl_Target_BuffFrame:Show();
                        if (buffmax > 8) then
                                Perl_Target_BuffFrame:SetWidth(221);    -- 5 + 8 * (24 + 3)     5 = border gap, 8 buffs across, 24 = icon size + 3 for pixel alignment, only holds true for default size
                                Perl_Target_BuffFrame:SetHeight(61);
                        else
                                Perl_Target_BuffFrame:SetWidth(5 + buffmax * 27);
                                Perl_Target_BuffFrame:SetHeight(34);
                        end
                end

                if (debuffmax == 0) then
                        Perl_Target_DebuffFrame:Hide();
                else
                        if (friendly == 1) then
                                if (buffmax > 8) then
                                        Perl_Target_DebuffFrame:SetPoint("TOPLEFT", "Perl_Target_StatsFrame", "BOTTOMLEFT", 0, -51);
                                else
                                        Perl_Target_DebuffFrame:SetPoint("TOPLEFT", "Perl_Target_StatsFrame", "BOTTOMLEFT", 0, -25);
                                end
                        else
                                Perl_Target_DebuffFrame:SetPoint("TOPLEFT", "Perl_Target_StatsFrame", "BOTTOMLEFT", 0, 5);
                        end
                        Perl_Target_DebuffFrame:Show();
                        if (debuffmax > 8) then
                                Perl_Target_DebuffFrame:SetWidth(221);  -- 5 + 8 * 27
                                Perl_Target_DebuffFrame:SetHeight(61);
                        else
                                Perl_Target_DebuffFrame:SetWidth(5 + debuffmax * 27);
                                Perl_Target_DebuffFrame:SetHeight(34);
                        end
                end
        end
end

function Perl_Target_Buff_UpdateCPMeter()
        local debuffapplications;
        local playerclass = UnitClass("player");

        if (playerclass == PERL_LOCALIZED_MAGE) then
                debuffapplications = Perl_Target_Buff_GetApplications("Fire Vulnerability");
        elseif (playerclass == PERL_LOCALIZED_PRIEST) then
                debuffapplications = Perl_Target_Buff_GetApplications("Shadow Vulnerability");
        elseif (playerclass == PERL_LOCALIZED_WARRIOR) then
                debuffapplications = Perl_Target_Buff_GetApplications("Sunder Armor");
        elseif ((playerclass == PERL_LOCALIZED_ROGUE) or (playerclass == PERL_LOCALIZED_DRUID)) then
                return;
        else
                Perl_Target_NameFrame_CPMeter:Hide();
                return;
        end

        if (debuffapplications == 0) then
                Perl_Target_CPFrame:Hide();
                Perl_Target_NameFrame_CPMeter:Hide();
        else
                if (comboframedebuffs == 1) then
                        Perl_Target_CPText:SetText(debuffapplications);
                        Perl_Target_CPText:SetTextHeight(20);
                        if (debuffapplications == 5) then
                                Perl_Target_CPFrame:Show();
                                Perl_Target_CPText:SetTextColor(1, 0, 0);       -- red text
                        elseif (debuffapplications == 4) then
                                Perl_Target_CPFrame:Show();
                                Perl_Target_CPText:SetTextColor(1, 0.5, 0);     -- orange text
                        elseif (debuffapplications == 3) then
                                Perl_Target_CPFrame:Show();
                                Perl_Target_CPText:SetTextColor(1, 1, 0);       -- yellow text
                        elseif (debuffapplications == 2) then
                                Perl_Target_CPFrame:Show();
                                Perl_Target_CPText:SetTextColor(0.5, 1, 0);     -- yellow-green text
                        elseif (debuffapplications == 1) then
                                Perl_Target_CPFrame:Show();
                                Perl_Target_CPText:SetTextColor(0, 1, 0);       -- green text
                        else
                                Perl_Target_CPFrame:Hide();
                        end
                else
                        Perl_Target_CPFrame:Hide();
                end

                if (nameframecombopoints == 1) then                             -- this isn't nested since you can have both combo point styles on at the same time
                        Perl_Target_NameFrame_CPMeter:SetMinMaxValues(0, 5);
                        Perl_Target_NameFrame_CPMeter:SetValue(debuffapplications);
                        if (debuffapplications == 5) then
                                Perl_Target_NameFrame_CPMeter:Show();
                        elseif (debuffapplications == 4) then
                                Perl_Target_NameFrame_CPMeter:Show();
                        elseif (debuffapplications == 3) then
                                Perl_Target_NameFrame_CPMeter:Show();
                        elseif (debuffapplications == 2) then
                                Perl_Target_NameFrame_CPMeter:Show();
                        elseif (debuffapplications == 1) then
                                Perl_Target_NameFrame_CPMeter:Show();
                        else
                                Perl_Target_NameFrame_CPMeter:Hide();
                        end
                else
                        Perl_Target_NameFrame_CPMeter:Hide();
                end
        end
end

function Perl_Target_Buff_GetApplications(debuffname)
        local debuffApplications;
        local i = 1;

        while UnitDebuff("target", i) do
                Perl_Target_Tooltip:SetOwner(this, "ANCHOR_BOTTOMRIGHT");
                Perl_Target_Tooltip:SetUnitDebuff("target", i);
                if (Perl_Target_TooltipTextLeft1:GetText() == debuffname) then
                        _, debuffApplications = UnitDebuff("target", i);
                        Perl_Target_Tooltip:Hide();
                        return debuffApplications;
                end

                i = i + 1;
        end

        Perl_Target_Tooltip:Hide();
        return 0;
end

function Perl_Target_Reset_Buffs()
        local button;
        for buffnum=1,16 do
                button = getglobal("Perl_Target_Buff"..buffnum);
                button:Hide();
                button = getglobal("Perl_Target_Debuff"..buffnum);
                button:Hide();
        end
end

function Perl_Target_SetBuffTooltip()
        local buffmapping = 0;
        GameTooltip:SetOwner(this, "ANCHOR_BOTTOMRIGHT");
        if (this.isdebuff == 1) then
                GameTooltip:SetUnitDebuff("target", this:GetID()-buffmapping);
        else
                GameTooltip:SetUnitBuff("target", this:GetID());
        end
end


--------------------
-- Click Handlers --
--------------------
function Perl_TargetDropDown_OnLoad()
        UIDropDownMenu_Initialize(this, Perl_TargetDropDown_Initialize, "MENU");
end

function Perl_TargetDropDown_Initialize()
        local menu = nil;
        if (UnitIsEnemy("target", "player")) then
                return;
        end
        if (UnitIsUnit("target", "player")) then
                menu = "SELF";
        elseif (UnitIsUnit("target", "pet")) then
                menu = "PET";
        elseif (UnitIsPlayer("target")) then
                if (UnitInParty("target")) then
                        menu = "PARTY";
                else
                        menu = "PLAYER";
                end
        end
        if (menu) then
                UnitPopup_ShowMenu(Perl_Target_DropDown, menu, "target");
        end
end

function Perl_Target_MouseClick(button)
        if (CastPartyConfig and PCUF_CASTPARTYSUPPORT == 1) then
                if (not string.find(GetMouseFocus():GetName(), "Name")) then
                        CastParty_OnClickByUnit(button, "target");
                end
        elseif (Genesis_data and PCUF_CASTPARTYSUPPORT == 1) then
                if (not string.find(GetMouseFocus():GetName(), "Name")) then
                        Genesis_MouseHeal("target", button);
                end
        else
                if (SpellIsTargeting() and button == "RightButton") then
                        SpellStopTargeting();
                        return;
                end

                if (button == "LeftButton") then
                        if (SpellIsTargeting()) then
                                SpellTargetUnit("target");
                        elseif (CursorHasItem()) then
                                DropItemOnUnit("target");
                        end
                end
        end
end

function Perl_Target_MouseDown(button)
        if (button == "LeftButton" and locked == 0) then
                Perl_Target_Frame:StartMoving();
        end
end

function Perl_Target_MouseUp(button)
        if (button == "RightButton") then
                if ((CastPartyConfig or Genesis_data) and PCUF_CASTPARTYSUPPORT == 1) then
                        if (not (IsAltKeyDown() or IsControlKeyDown() or IsShiftKeyDown()) and string.find(GetMouseFocus():GetName(), "Name")) then             -- if alt, ctrl, or shift ARE NOT held AND we are clicking the name frame, show the menu
                                ToggleDropDownMenu(1, nil, Perl_Target_DropDown, "Perl_Target_NameFrame", 40, 0);
                        end
                else
                        if (not (IsAltKeyDown() or IsControlKeyDown() or IsShiftKeyDown())) then                -- if alt, ctrl, or shift ARE NOT held, show the menu
                                ToggleDropDownMenu(1, nil, Perl_Target_DropDown, "Perl_Target_NameFrame", 40, 0);
                        end
                end
        end

        Perl_Target_Frame:StopMovingOrSizing();
end

function Perl_Target_OnShow()
        if ( UnitIsEnemy("target", "player") ) then
                PlaySound("igCreatureAggroSelect");
        elseif ( UnitIsFriend("player", "target") ) then
                PlaySound("igCharacterNPCSelect");
        else
                PlaySound("igCreatureNeutralSelect");
        end
end


-------------
-- Tooltip --
-------------
function Perl_Target_Tip()
        UnitFrame_Initialize("target")
end

function UnitFrame_Initialize(unit)     -- Hopefully this doesn't break any mods
        this.unit = unit;
end


----------------------
-- myAddOns Support --
----------------------
function Perl_Target_myAddOns_Support()
        -- Register the addon in myAddOns
        if (myAddOnsFrame_Register) then
                local Perl_Target_myAddOns_Details = {
                        name = "Perl_Target",
                        version = "Version 0.58",
                        releaseDate = "April 15, 2006",
                        author = "Perl; Maintained by Global",
                        email = "global@g-ball.com",
                        website = "http://www.curse-gaming.com/mod.php?addid=2257",
                        category = MYADDONS_CATEGORY_OTHERS
                };
                Perl_Target_myAddOns_Help = {};
                Perl_Target_myAddOns_Help[1] = "/perl";
                myAddOnsFrame_Register(Perl_Target_myAddOns_Details, Perl_Target_myAddOns_Help);
        end
end

Generated by GNU Enscript 1.6.5.90.