Quantcast
---------------------------------------------------
-- CONFIGURATION -> config.lua
-- NOT HERE!
---------------------------------------------------
local whoa = {}
local config = whoaUnitFrames.config
local buffList = whoaUnitFrames.buffList
local _, class = UnitClass("player")
local color = nil
local h, hMax, hPercent, m, mMax, mPercent = 0

-- aura positioning constants
local AURA_START_X = 5;
local AURA_START_Y = 30;
local AURA_OFFSET_Y = 3
local LARGE_AURA_SIZE = config.largeAuraSize
local SMALL_AURA_SIZE = config.smallAuraSize
local AURA_ROW_WIDTH = 122
local NUM_TOT_AURA_ROWS = 3

local NAME_WIDTH = PlayerName:GetWidth()

---------------------------------------------------
-- HIT INDICATORS
---------------------------------------------------
if not config.hitIndicators then
    PlayerHitIndicator:SetText(nil)
    PlayerHitIndicator.SetText = function() end
    PetHitIndicator:SetText(nil)
    PetHitIndicator.SetText = function() end
end

---------------------------------------------------
-- PETFRAME
---------------------------------------------------
if config.petFrameOnTop then
    PetFrame:ClearAllPoints()
    PetFrame:SetPoint("CENTER", PlayerFrame, "CENTER", -120, 50)
    --PetFrame:SetPoint("CENTER", PlayerFrame, "CENTER", -20, 60)
    PetFrame.SetPoint = function() end
end

---------------------------------------------------
-- DK RUNES
---------------------------------------------------
if class == "DEATHKNIGHT" then
    RuneButtonIndividual1:ClearAllPoints()
    RuneButtonIndividual1:SetPoint("TOPLEFT", PlayerFrameManaBar, "BOTTOMLEFT", -1, -5)
end

---------------------------------------------------
-- CVAR
---------------------------------------------------
-- # new GetCVarBool("statusTextPercentage")
function whoa:showPercent()
    -- # NUMERIC -> false
    -- # PERCENT -> true
    -- # BOTH    -> true
    if GetCVar("statusTextDisplay") == "NUMERIC" then
        return false
    else
        return true
    end
end

---------------------------------------------------
-- CLASSCOLORS
---------------------------------------------------
if config.classColor then
    local function color(statusbar, unit)
        local _, class, c
        if UnitIsPlayer(unit) and UnitIsConnected(unit) and unit == statusbar.unit and UnitClass(unit) then
                _, class = UnitClass(unit)
                c = CUSTOM_CLASS_COLORS and CUSTOM_CLASS_COLORS[class] or RAID_CLASS_COLORS[class]
                statusbar:SetStatusBarColor(c.r, c.g, c.b)
        end
    end
    hooksecurefunc("UnitFrameHealthBar_Update", color)
    hooksecurefunc("HealthBar_OnValueChanged", function(self)
        color(self, self.unit)
    end)
end

---------------------------------------------------
-- PARTY
---------------------------------------------------
function whoa:partyMembersChanged()
    local partyMembers = GetNumPartyMembers()
    if not InCombatLockdown() and partyMembers > 0 then
        for i = 1, partyMembers do
            _G["PartyMemberFrame"..i.."HealthBar"]:ClearAllPoints()
            _G["PartyMemberFrame"..i.."HealthBar"]:SetPoint("TOPLEFT", 45, -15)
            _G["PartyMemberFrame"..i.."HealthBar"]:SetHeight(9)
            _G["PartyMemberFrame"..i.."ManaBar"]:ClearAllPoints()
            _G["PartyMemberFrame"..i.."ManaBar"]:SetPoint("TOPLEFT", 45, -24)
            _G["PartyMemberFrame"..i.."ManaBar"]:SetHeight(6)
            if config.repositionPartyText then
                _G["PartyMemberFrame"..i.."HealthBarText"]:ClearAllPoints()
                _G["PartyMemberFrame"..i.."HealthBarText"]:SetPoint("LEFT", _G["PartyMemberFrame"..i.."HealthBar"], "RIGHT", 0, 0)
                _G["PartyMemberFrame"..i.."ManaBarText"]:ClearAllPoints()
                _G["PartyMemberFrame"..i.."ManaBarText"]:SetPoint("LEFT", _G["PartyMemberFrame"..i.."ManaBar"], "RIGHT", 0, 0)
            end
        end
    end
end

---------------------------------------------------
-- PLAYERFRAME
---------------------------------------------------
function whoa:playerFrame()
    if not UnitHasVehicleUI("player") then
        PlayerName:SetWidth(0.01)
        PlayerFrameGroupIndicatorText:ClearAllPoints()
        PlayerFrameGroupIndicatorText:SetPoint("BOTTOMLEFT", PlayerFrame, "TOP", 0, -20)
        PlayerFrameGroupIndicatorLeft:Hide()
        PlayerFrameGroupIndicatorMiddle:Hide()
        PlayerFrameGroupIndicatorRight:Hide()
        PlayerFrameHealthBar:ClearAllPoints()
        PlayerFrameHealthBar:SetPoint("TOPLEFT", 106, -24)
        PlayerFrameHealthBar:SetHeight(18)
        PlayerFrameHealthBarText:ClearAllPoints()
        PlayerFrameHealthBarText:SetPoint("CENTER", PlayerFrameHealthBar, "CENTER", 0, 0)
        PlayerFrameManaBar:ClearAllPoints()
        PlayerFrameManaBar:SetPoint("TOPLEFT", 106, -45)
        PlayerFrameManaBar:SetHeight(17)
        PlayerFrameManaBarText:ClearAllPoints()
        PlayerFrameManaBarText:SetPoint("CENTER", PlayerFrameManaBar, "CENTER", 0, 0)
    else
        PlayerName:SetWidth(NAME_WIDTH)
        PlayerFrameHealthBar:SetHeight(12)
        PlayerFrameManaBar:SetHeight(12)
    end
--    if config.scale then
--        PlayerFrame:SetScale(config.scale)
--    end
end
local function whoa_playerFrame()
    whoa:playerFrame()
end
hooksecurefunc("PlayerFrame_UpdateArt", whoa_playerFrame)
hooksecurefunc("PlayerFrame_SequenceFinished", whoa_playerFrame)

---------------------------------------------------
-- TARGETFRAME
---------------------------------------------------
function whoa:targetFrame()
    TargetFrame.nameBackground:Hide()
    TargetFrameBackground:Hide()
    TargetFrame.deadText:ClearAllPoints()
    TargetFrame.deadText:SetPoint("CENTER", TargetFrameHealthBar, "CENTER", 0, 0)
    TargetFrameTextureFrameName:ClearAllPoints()
    TargetFrameTextureFrameName:SetPoint("BOTTOMRIGHT", TargetFrame, "TOP", 0, -20)
    TargetFrameHealthBar:ClearAllPoints()
    TargetFrameHealthBar:SetPoint("TOPLEFT", 5, -24)
    TargetFrameHealthBar:SetHeight(18)
    TargetFrameHealthBar.background = TargetFrameHealthBar:CreateTexture("TargetFrameHealthBarBackground", "BACKGROUND")
    TargetFrameHealthBar.background:SetTexture(0, 0, 0, 0.5)
    TargetFrameHealthBar.background:SetAllPoints()
    TargetFrameTextureFrameHealthBarText:ClearAllPoints()
    TargetFrameTextureFrameHealthBarText:SetPoint("CENTER", TargetFrameHealthBar, "CENTER", 0, 0)
    TargetFrameManaBar:ClearAllPoints()
    TargetFrameManaBar:SetPoint("TOPLEFT", 5, -45)
    TargetFrameManaBar:SetHeight(17)
    TargetFrameManaBar.background = TargetFrameManaBar:CreateTexture("TargetFrameManaBarBackground", "BACKGROUND")
    TargetFrameManaBar.background:SetTexture(0, 0, 0, 0.5)
    TargetFrameManaBar.background:SetAllPoints()
    TargetFrameTextureFrameManaBarText:ClearAllPoints()
    TargetFrameTextureFrameManaBarText:SetPoint("CENTER", TargetFrameManaBar, "CENTER", 0, 0)
    TargetFrame.threatNumericIndicator:SetPoint("BOTTOM", PlayerFrame, "TOP", 75, -22)
--    if config.scale then
--        TargetFrame:SetScale(config.scale)
--    end
end

function whoa:targetChanged()
    TargetFrame.nameBackground:Hide()
    TargetFrameBackground:Hide()
    if UnitIsPlayer("target") and config.classColor then
        color = RAID_CLASS_COLORS[select(2, UnitClass("target"))]
    else
        color = FACTION_BAR_COLORS[UnitReaction("target", "player")]
    end
    if ( not UnitPlayerControlled("target") and UnitIsTapDenied("target") and not UnitIsTappedByPlayer("target") and not UnitIsTappedByAllThreatList("target") ) then
        TargetFrameHealthBar:SetStatusBarColor(0.5, 0.5, 0.5)
    else
        if color then
            TargetFrameHealthBar:SetStatusBarColor(color.r, color.g, color.b)
            TargetFrameHealthBar.lockColor = true
        end
    end
end
local function whoa_targetChanged()
    whoa:targetChanged()
end
hooksecurefunc("TargetFrame_CheckFaction", whoa_targetChanged)
hooksecurefunc("TargetFrame_CheckClassification", whoa_targetChanged)

---------------------------------------------------
-- FOCUSFRAME
---------------------------------------------------
function whoa:focusFrame()
    FocusFrame.nameBackground:Hide()
    FocusFrameBackground:Hide()
    FocusFrame.deadText:ClearAllPoints()
    FocusFrame.deadText:SetPoint("CENTER", FocusFrameHealthBar, "CENTER", 0, 0)
    FocusFrameTextureFrameName:ClearAllPoints()
    FocusFrameHealthBar:ClearAllPoints()
    FocusFrameHealthBar:SetPoint("TOPLEFT", 5, -24)
    FocusFrameHealthBar:SetHeight(18)
    FocusFrameHealthBar.background = FocusFrameHealthBar:CreateTexture("FocusFrameHealthBarBackground", "BACKGROUND")
    FocusFrameHealthBar.background:SetTexture(0, 0, 0, 0.5)
    FocusFrameHealthBar.background:SetAllPoints()
    FocusFrameManaBar:ClearAllPoints()
    FocusFrameManaBar:SetPoint("TOPLEFT", 5, -45)
    FocusFrameManaBar:SetHeight(17)
    FocusFrameManaBar.background = FocusFrameManaBar:CreateTexture("FocusFrameManaBarBackground", "BACKGROUND")
    FocusFrameManaBar.background:SetTexture(0, 0, 0, 0.5)
    FocusFrameManaBar.background:SetAllPoints()
    FocusFrame.threatNumericIndicator:SetWidth(0.01)
    FocusFrame.threatNumericIndicator.bg:Hide()
    FocusFrame.threatNumericIndicator.text:Hide()
    FocusFrameTextureFrameHealthBarText:ClearAllPoints()
    FocusFrameTextureFrameHealthBarText:SetPoint("CENTER", FocusFrameHealthBar, "CENTER", 0, 0)
    FocusFrameTextureFrameManaBarText:ClearAllPoints()
    FocusFrameTextureFrameManaBarText:SetPoint("CENTER", FocusFrameManaBar, "CENTER", 0, 0)
--    if config.scale then
--        FocusFrame:SetScale(config.scale)
--    end
end

function whoa:focusChanged()
    FocusFrame.nameBackground:Hide()
    FocusFrameBackground:Hide()
    if UnitIsPlayer("focus") and config.classColor then
        color = RAID_CLASS_COLORS[select(2, UnitClass("focus"))]
    else
        color = FACTION_BAR_COLORS[UnitReaction("focus", "player")]
    end
    if color then
        FocusFrameHealthBar:SetStatusBarColor(color.r, color.g, color.b)
        FocusFrameHealthBar.lockColor = true
    end
end

---------------------------------------------------
-- TARGETOFTARGETFRAME
---------------------------------------------------
function whoa:totFrame()
    -- # TargetOfTarget
    TargetFrameToTHealthBar:ClearAllPoints()
    TargetFrameToTHealthBar:SetPoint("TOPLEFT", 44, -15)
    TargetFrameToTHealthBar:SetHeight(10)
    TargetFrameToTManaBar:ClearAllPoints()
    TargetFrameToTManaBar:SetPoint("TOPLEFT", 44, -25)
    TargetFrameToTManaBar:SetHeight(5)
    -- # TargetOfFocus
    FocusFrameToTHealthBar:ClearAllPoints()
    FocusFrameToTHealthBar:SetPoint("TOPLEFT", 45, -15)
    FocusFrameToTHealthBar:SetHeight(10)
    FocusFrameToTManaBar:ClearAllPoints()
    FocusFrameToTManaBar:SetPoint("TOPLEFT", 45, -25)
    FocusFrameToTManaBar:SetHeight(5)
end

---------------------------------------------------
-- TEXTE
---------------------------------------------------
function whoa:createFrame(name, parent, point, xOffset, yOffset, width, alignment)
    local f = CreateFrame("Frame", name, parent)
    f:SetPoint(point, parent, point, xOffset, yOffset)
    f:SetWidth(width)
    f:SetHeight(20)
    f.text = f:CreateFontString(name.."text", "OVERLAY")
    f.text:SetAllPoints(f)
    f.text:SetFontObject(TextStatusBarText)
    f.text:SetJustifyH(alignment)
end

---------------------------------------------------
-- TOTFRAME FIX
---------------------------------------------------
if config.showToTName then
    whoa:createFrame("ftot", TargetFrame, "RIGHT", 170, -15, 200, "LEFT")
--    local tot = CreateFrame("Button","whoaToT",TargetFrame,"TargetofTargetFrameTemplate")
--    tot:SetPoint("CENTER",0,0)
--    tot:SetWidth(80)
--    tot:SetHeight(22)
--    tot:Show()
--    TargetFrame.totFrame:Show()
--    TargetofTargetFrame.Show()
    function whoa:targetoftarget()
        if (UnitName("targettarget") ~= nil) then
            _G["ftot"].text:SetText(UnitName("targettarget"))
        else
            _G["ftot"].text:SetText("")
        end
    end
--    TargetFrame:HookScript("OnUpdate", function(self, ...)
--        whoa:targetoftarget()
--    end)
    local total = 0
    local function onUpdate(self,elapsed)
        total = total + elapsed
        if total >= 0.2 then
            whoa:targetoftarget()
            total = 0
        end
    end
    _G["ftot"]:SetScript("OnUpdate", onUpdate)
end

whoa:createFrame("fplayerdead",          PlayerFrameHealthBar, "CENTER",  0,  0, 200, "CENTER")
whoa:createFrame("fplayerpercent",       PlayerFrameHealthBar, "LEFT",    0,  0,  40, "RIGHT")
if config.showMaxHealth then
    whoa:createFrame("fplayerhealth",    PlayerFrameHealthBar, "RIGHT",  -5,  5,  75, "RIGHT")
else
    whoa:createFrame("fplayerhealth",    PlayerFrameHealthBar, "RIGHT",  -5,  0,  75, "RIGHT")
end
whoa:createFrame("fplayerhealthmax",     PlayerFrameHealthBar, "RIGHT",  -5, -5,  75, "RIGHT")
whoa:createFrame("fplayermanapercent",   PlayerFrameManaBar,   "LEFT",    0,  0,  40, "RIGHT")
whoa:createFrame("fplayermana",          PlayerFrameManaBar,   "RIGHT",  -5,  0,  75, "RIGHT")

whoa:createFrame("ftargetdead",          TargetFrameHealthBar, "CENTER",  0,  0, 200, "CENTER")
whoa:createFrame("ftargetoffline",       TargetFrameManaBar,   "CENTER",  0,  0, 200, "CENTER")
whoa:createFrame("ftargetpercent",       TargetFrameHealthBar, "LEFT",    0,  0,  40, "RIGHT")
if config.showMaxHealth then
    whoa:createFrame("ftargethealth",    TargetFrameHealthBar, "RIGHT",  -5,  5,  75, "RIGHT")
else
    whoa:createFrame("ftargethealth",    TargetFrameHealthBar, "RIGHT",  -5,  0,  75, "RIGHT")
end
whoa:createFrame("ftargethealthmax",     TargetFrameHealthBar, "RIGHT",  -5, -5,  75, "RIGHT")
whoa:createFrame("ftargetmanapercent",   TargetFrameManaBar,   "LEFT",    0,  0,  40, "RIGHT")
whoa:createFrame("ftargetmana",          TargetFrameManaBar,   "RIGHT",  -5,  0,  75, "RIGHT")

whoa:createFrame("ffocusdead",           FocusFrameHealthBar,  "CENTER",  0, 0, 200, "CENTER")
whoa:createFrame("ffocusoffline",        FocusFrameManaBar,    "CENTER",  0, 0, 200, "CENTER")
whoa:createFrame("ffocuspercent",       FocusFrameHealthBar,  "LEFT",    0,  0,  40, "RIGHT")
if config.showMaxHealth then
    whoa:createFrame("ffocushealth",    FocusFrameHealthBar,  "RIGHT",  -5,  5,  75, "RIGHT")
else
    whoa:createFrame("ffocushealth",    FocusFrameHealthBar,  "RIGHT",  -5,  0,  75, "RIGHT")
end
whoa:createFrame("ffocushealthmax",     FocusFrameHealthBar,  "RIGHT",  -5, -5,  75, "RIGHT")
whoa:createFrame("ffocusmanapercent",   FocusFrameManaBar,    "LEFT",    0,  0,  40, "RIGHT")
whoa:createFrame("ffocusmana",          FocusFrameManaBar,    "RIGHT",  -5,  0,  75, "RIGHT")

if config.customStatusText then
    ftargetoffline.text:SetText(config.phrases["Offline"])
    ffocusoffline.text:SetText(config.phrases["Offline"])
end

function whoa:round(n, dp)
    return math.floor((n * 10^dp) + .5) / (10^dp)
end

function whoa:format(n)
    if not config.customStatusText then
        return n
    end
    local strLen = strlen(n)
--  if config.simpleHealth and n > 999999999 then
    if config.simpleHealth and strLen > 9 then
        return whoa:round(n/1e9, 1)..config.phrases["giga"]
--  elseif config.simpleHealth and n > 999999 then
    elseif config.simpleHealth and strLen > 6 then
        return whoa:round(n/1e6, 1)..config.phrases["mega"]
--  elseif config.simpleHealth and strLen > 5 then -- # no simpleHealth under 100.000
    elseif config.simpleHealth and n > 199999 then -- # no simpleHealth under 199.999
        return whoa:round(n/1e3, 0)..config.phrases["kilo"]
    elseif config.thousandSeparators then
        local left, num, right = string.match(n, '^([^%d]*%d)(%d*)(.-)')
        return left..(num:reverse():gsub('(%d%d%d)', '%1'..config.phrases["1000 separator"]):reverse())..right
    else
        return n
    end
end

function whoa:unitText(unit)
    if unit == "vehicle" then
       unit = "player"
    end
    if config.customStatusText and (unit == "player" or unit == "target" or unit == "focus") then
        h = UnitHealth(unit)
        hMax = UnitHealthMax(unit)
        m = UnitPower(unit)
        if unit == "player" and UnitHasVehicleUI("player") then
            h = UnitHealth("vehicle")
            hMax = UnitHealthMax("vehicle")
            m = UnitPower("vehicle")
        end
        if UnitIsDeadOrGhost(unit) then
            _G["f"..unit.."health"]:Hide()
            _G["f"..unit.."healthmax"]:Hide()
            _G["f"..unit.."percent"]:Hide()
            _G["f"..unit.."dead"]:Show()
            if UnitIsGhost(unit) then
                _G["f"..unit.."dead"].text:SetText(config.phrases["Ghost"])
            else
                _G["f"..unit.."dead"].text:SetText(config.phrases["Dead"])
            end
        else
            _G["f"..unit.."dead"]:Hide()
            if (unit == "player" and GetCVarBool("playerStatusText"))
            or (not (unit == "player") and GetCVarBool("targetStatusText"))
            then
                _G["f"..unit.."health"]:Show()
                _G["f"..unit.."health"].text:SetText(whoa:format(h))
                if config.showMaxHealth then
                    _G["f"..unit.."healthmax"]:Show()
                    _G["f"..unit.."healthmax"].text:SetText(whoa:format(hMax))
                end
                if whoa:showPercent() then
                    if hMax > 0 then
                        hPercent = math.floor((h / hMax) * 100)
                        _G["f"..unit.."percent"]:Show()
                        _G["f"..unit.."percent"].text:SetText(hPercent.."%")
                    end
                else
                    _G["f"..unit.."percent"]:Hide()
                end
            else
                _G["f"..unit.."health"]:Hide()
                _G["f"..unit.."healthmax"]:Hide()
                _G["f"..unit.."percent"]:Hide()
            end
        end
        if m > 0 then
            if UnitIsDeadOrGhost(unit) then
                _G["f"..unit.."mana"]:Hide()
                _G["f"..unit.."manapercent"]:Hide()
            elseif (unit == "player" and GetCVarBool("playerStatusText"))
                or (not (unit == "player") and GetCVarBool("targetStatusText"))
            then
                _G["f"..unit.."mana"]:Show()
                _G["f"..unit.."mana"].text:SetText(whoa:format(m))
                local showManaPercent = false
                if config.autoManaPercent then
                    if UnitPowerType(unit) == 0 then
                        showManaPercent = true
                    end
                end
                if whoa:showPercent() and showManaPercent and ((unit == "player" and not UnitHasVehicleUI("player")) or unit ~= "player") then
                    mMax = UnitPowerMax(unit)
                    if mMax > 0 then
                        mPercent = math.floor((m / mMax) * 100)
                        _G["f"..unit.."manapercent"]:Show()
                        _G["f"..unit.."manapercent"].text:SetText(mPercent.."%")
                    end
                else
                    _G["f"..unit.."manapercent"]:Hide()
                end
            else
                _G["f"..unit.."mana"]:Hide()
                _G["f"..unit.."manapercent"]:Hide()
            end
        else
            _G["f"..unit.."mana"]:Hide()
            _G["f"..unit.."manapercent"]:Hide()
        end
        if unit == "target" or unit == "focus" then
            if UnitIsConnected(unit) then
                _G["f"..unit.."offline"]:Hide()
            else
                _G["f"..unit.."offline"]:Show()
                _G["f"..unit.."mana"]:Hide()
                _G["f"..unit.."manapercent"]:Hide()
            end
        end
    end
end

---------------------------------------------------
-- TARGETBUFFS
---------------------------------------------------
function whoa:targetUpdateAuraPositions(self, auraName, numAuras, numOppositeAuras, largeAuraList, updateFunc, maxRowWidth, offsetX, mirrorAurasVertically)
    local size
    local offsetY = AURA_OFFSET_Y
    local rowWidth = 0
    local firstBuffOnRow = 1
    for i=1, numAuras do
        if ( largeAuraList[i] ) then
            size = LARGE_AURA_SIZE
            offsetY = AURA_OFFSET_Y + AURA_OFFSET_Y
        else
            size = SMALL_AURA_SIZE
        end
        if ( i == 1 ) then
            rowWidth = size
            self.auraRows = self.auraRows + 1
        else
            rowWidth = rowWidth + size + offsetX
        end
        if ( rowWidth > maxRowWidth ) then
            updateFunc(self, auraName, i, numOppositeAuras, firstBuffOnRow, size, offsetX, offsetY, mirrorAurasVertically)
            rowWidth = size
            self.auraRows = self.auraRows + 1
            firstBuffOnRow = i
            offsetY = AURA_OFFSET_Y
        else
            updateFunc(self, auraName, i, numOppositeAuras, i - 1, size, offsetX, offsetY, mirrorAurasVertically)
        end
    end
end
local function whoa_targetUpdateAuraPositions(self, auraName, numAuras, numOppositeAuras, largeAuraList, updateFunc, maxRowWidth, offsetX, mirrorAurasVertically)
    whoa:targetUpdateAuraPositions(self, auraName, numAuras, numOppositeAuras, largeAuraList, updateFunc, maxRowWidth, offsetX, mirrorAurasVertically)
end
hooksecurefunc("TargetFrame_UpdateAuraPositions", whoa_targetUpdateAuraPositions)

function whoa:targetUpdateBuffAnchor(self, buffName, index, numDebuffs, anchorIndex, size, offsetX, offsetY, mirrorVertically)
    local point, relativePoint
    local startY, auraOffsetY
    if ( mirrorVertically ) then
        point = "BOTTOM"
        relativePoint = "TOP"
        startY = -8
        offsetY = -offsetY
        auraOffsetY = -AURA_OFFSET_Y
    else
        point = "TOP"
        relativePoint="BOTTOM"
        startY = AURA_START_Y
        auraOffsetY = AURA_OFFSET_Y
    end

    local buff = _G[buffName..index]
    if ( index == 1 ) then
        if ( UnitIsFriend("player", self.unit) or numDebuffs == 0 ) then
            -- unit is friendly or there are no debuffs...buffs start on top
            buff:SetPoint(point.."LEFT", self, relativePoint.."LEFT", AURA_START_X, startY)
        else
            -- unit is not friendly and we have debuffs...buffs start on bottom
            buff:SetPoint(point.."LEFT", self.debuffs, relativePoint.."LEFT", 0, -offsetY)
        end
        self.buffs:SetPoint(point.."LEFT", buff, point.."LEFT", 0, 0)
        self.buffs:SetPoint(relativePoint.."LEFT", buff, relativePoint.."LEFT", 0, -auraOffsetY)
        self.spellbarAnchor = buff
    elseif ( anchorIndex ~= (index-1) ) then
        -- anchor index is not the previous index...must be a new row
        buff:SetPoint(point.."LEFT", _G[buffName..anchorIndex], relativePoint.."LEFT", 0, -offsetY)
        self.buffs:SetPoint(relativePoint.."LEFT", buff, relativePoint.."LEFT", 0, -auraOffsetY)
        self.spellbarAnchor = buff
    else
        -- anchor index is the previous index
        buff:SetPoint(point.."LEFT", _G[buffName..anchorIndex], point.."RIGHT", offsetX, 0)
    end

    buff:SetWidth(size)
    buff:SetHeight(size)
end
local function whoa_targetUpdateBuffAnchor(self, buffName, index, numDebuffs, anchorIndex, size, offsetX, offsetY, mirrorVertically)
    whoa:targetUpdateBuffAnchor(self, buffName, index, numDebuffs, anchorIndex, size, offsetX, offsetY, mirrorVertically)
end
hooksecurefunc("TargetFrame_UpdateBuffAnchor", whoa_targetUpdateBuffAnchor)

function whoa:targetUpdateDebuffAnchor(self, debuffName, index, numBuffs, anchorIndex, size, offsetX, offsetY, mirrorVertically)
    local buff = _G[debuffName..index];
    local isFriend = UnitIsFriend("player", self.unit);

    --For mirroring vertically
    local point, relativePoint;
    local startY, auraOffsetY;
    if ( mirrorVertically ) then
        point = "BOTTOM";
        relativePoint = "TOP";
        startY = -8;
        offsetY = - offsetY;
        auraOffsetY = -AURA_OFFSET_Y;
    else
        point = "TOP";
        relativePoint="BOTTOM";
        startY = AURA_START_Y;
        auraOffsetY = AURA_OFFSET_Y;
    end

    if ( index == 1 ) then
        if ( isFriend and numBuffs > 0 ) then
            -- unit is friendly and there are buffs...debuffs start on bottom
            buff:SetPoint(point.."LEFT", self.buffs, relativePoint.."LEFT", 0, -offsetY);
        else
            -- unit is not friendly or there are no buffs...debuffs start on top
            buff:SetPoint(point.."LEFT", self, relativePoint.."LEFT", AURA_START_X, startY);
        end
        self.debuffs:SetPoint(point.."LEFT", buff, point.."LEFT", 0, 0);
        self.debuffs:SetPoint(relativePoint.."LEFT", buff, relativePoint.."LEFT", 0, -auraOffsetY);
        if ( ( isFriend ) or ( not isFriend and numBuffs == 0) ) then
            self.spellbarAnchor = buff;
        end
    elseif ( anchorIndex ~= (index-1) ) then
        -- anchor index is not the previous index...must be a new row
        buff:SetPoint(point.."LEFT", _G[debuffName..anchorIndex], relativePoint.."LEFT", 0, -offsetY);
        self.debuffs:SetPoint(relativePoint.."LEFT", buff, relativePoint.."LEFT", 0, -auraOffsetY);
        if ( ( isFriend ) or ( not isFriend and numBuffs == 0) ) then
            self.spellbarAnchor = buff;
        end
    else
        -- anchor index is the previous index
        buff:SetPoint(point.."LEFT", _G[debuffName..(index-1)], point.."RIGHT", offsetX, 0);
    end

    -- Resize
    buff:SetWidth(size);
    buff:SetHeight(size);
    local debuffFrame =_G[debuffName..index.."Border"];
    debuffFrame:SetWidth(size+2);
    debuffFrame:SetHeight(size+2);
end
local function whoa_targetUpdateDebuffAnchor(self, debuffName, index, numBuffs, anchorIndex, size, offsetX, offsetY, mirrorVertically)
    whoa:targetUpdateDebuffAnchor(self, debuffName, index, numBuffs, anchorIndex, size, offsetX, offsetY, mirrorVertically)
end
hooksecurefunc("TargetFrame_UpdateDebuffAnchor", whoa_targetUpdateDebuffAnchor)

---------------------------------------------------
-- CVAR_UPDATES
---------------------------------------------------
if config.customStatusText then
    function PlayerFrameHealthBarText:Show() end
    function PlayerFrameManaBarText:Show() end
    function TargetFrameTextureFrameHealthBarText:Show() end
    function TargetFrameTextureFrameManaBarText:Show() end
    function FocusFrameTextureFrameHealthBarText:Show() end
    function FocusFrameTextureFrameManaBarText:Show() end
    PlayerFrameHealthBarText:Hide()
    PlayerFrameManaBarText:Hide()
    TargetFrameTextureFrameHealthBarText:Hide()
    TargetFrameTextureFrameManaBarText:Hide()
    FocusFrameTextureFrameHealthBarText:Hide()
    FocusFrameTextureFrameManaBarText:Hide()
end

function whoa:cvarUpdate()
    if GetCVarBool("fullSizeFocusFrame") then
        FocusFrameTextureFrameName:SetPoint("BOTTOMRIGHT", FocusFrame, "TOP", 0, -20)
    else
        FocusFrameTextureFrameName:SetPoint("BOTTOMRIGHT", FocusFrame, "TOP", 10, -20)
    end
    whoa:unitText("player")
    whoa:unitText("target")
    whoa:unitText("focus")
end

---------------------------------------------------
-- EVENTS
---------------------------------------------------
local w = CreateFrame("Frame")
w:RegisterEvent("PLAYER_ENTERING_WORLD")
w:RegisterEvent("PLAYER_REGEN_ENABLED")
w:RegisterEvent("PLAYER_TARGET_CHANGED")
w:RegisterEvent("PLAYER_FOCUS_CHANGED")
w:RegisterEvent("CVAR_UPDATE")
w:RegisterEvent("GROUP_ROSTER_UPDATE")
w:RegisterEvent("UNIT_ENTERING_VEHICLE")
w:RegisterEvent("UNIT_ENTERED_VEHICLE")
w:RegisterEvent("UNIT_EXITING_VEHICLE")
w:RegisterEvent("UNIT_EXITED_VEHICLE")
w:RegisterEvent("UNIT_FACTION")
w:RegisterEvent("UNIT_HEALTH")
w:RegisterEvent("UNIT_POWER")
w:RegisterEvent("PARTY_MEMBERS_CHANGED")
function w:OnEvent(event, ...)
    if event == "PLAYER_ENTERING_WORLD" then
        SlashCmdList['RELOAD'] = function() ReloadUI() end
        SLASH_RELOAD1 = '/rl'
        whoa:playerFrame()
        whoa:targetFrame()
        whoa:focusFrame()
        whoa:totFrame()
        whoa:cvarUpdate()
        whoa:unitText("player")
    elseif event == "PLAYER_REGEN_ENABLED" then
        whoa:playerFrame()
    elseif event == "PLAYER_TARGET_CHANGED" then
        whoa:targetChanged()
        whoa:unitText("target")
    elseif event == "PLAYER_FOCUS_CHANGED" then
        whoa:focusChanged()
        whoa:unitText("focus")
    elseif event == "UNIT_FACTION" then
        if arg1 == "focus" then
            whoa:focusChanged()
        end
    elseif event == "GROUP_ROSTER_UPDATE" then
        whoa:focusChanged()
    elseif event == "UNIT_HEALTH" or event == "UNIT_POWER" then
        local unit = ...
        whoa:unitText(unit)
    elseif event == "UNIT_ENTERING_VEHICLE" or event == "UNIT_ENTERED_VEHICLE" then
        whoa:unitText("vehicle")
    elseif event == "UNIT_EXITING_VEHICLE" or event == "UNIT_EXITED_VEHICLE" then
        whoa:unitText("player")
    elseif event == "CVAR_UPDATE" then
        whoa:cvarUpdate()
    elseif event == "PARTY_MEMBERS_CHANGED" then
        whoa:partyMembersChanged()
    end
end
w:SetScript("OnEvent", w.OnEvent)