vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
DurabilityFu = AceLibrary("AceAddon-2.0"):new("FuBarPlugin-2.0", "AceDB-2.0", "AceEvent-2.0", "AceHook-2.0", "AceConsole-2.0")

DurabilityFu:RegisterDB("DurabilityFuDB")
DurabilityFu:RegisterDefaults('profile', {
        showPopup = true,
        showMan = false,
        showAverage = false,
        showHealthy = true,
        popupX = 0,
        popupY = -200,
        autoRepairEquipment = false,
        autoRepairInventory = false,
})

DurabilityFu.version = "2.0." .. string.sub("$Revision: 9763 $", 12, -3)
DurabilityFu.date = string.sub("$Date: 2006-09-01 11:45:46 -1000 (Fri, 01 Sep 2006) $", 8, 17)
DurabilityFu.hasIcon = true
DurabilityFu.canHideText = true

local L = AceLibrary("AceLocale-2.0"):new("FuBar_DurabilityFu")

local Gratuity = AceLibrary("Gratuity-2.0")
local Tablet = AceLibrary("Tablet-2.0")
local Abacus = AceLibrary("Abacus-2.0")
local Crayon = AceLibrary("Crayon-2.0")

local TEXT_SERGEANT, TEXT_HONORED
if AceLibrary("AceDB-2.0").FACTION == FACTION_HORDE then
        TEXT_SERGEANT = PVP_RANK_7_0
else
        TEXT_SERGEANT = PVP_RANK_7_1
end
TEXT_HONORED = FACTION_STANDING_LABEL6

function DurabilityFu:IsShowingPopup()
        return self.db.profile.showPopup
end

function DurabilityFu:ToggleShowingPopup()
        self.db.profile.showPopup = not self.db.profile.showPopup
end

function DurabilityFu:IsAutoRepairingEquipment()
        return self.db.profile.autoRepairEquipment
end

function DurabilityFu:ToggleAutoRepairingEquipment()
        self.db.profile.autoRepairEquipment = not self.db.profile.autoRepairEquipment
end

function DurabilityFu:IsAutoRepairingInventory()
        return self.db.profile.autoRepairInventory
end

function DurabilityFu:ToggleAutoRepairingInventory()
        self.db.profile.autoRepairInventory = not self.db.profile.autoRepairInventory
end

function DurabilityFu:IsShowingMan()
        return self.db.profile.showMan
end

function DurabilityFu:ToggleShowingMan()
        self.db.profile.showMan = not self.db.profile.showMan
--[[    if self.db.profile.showMan and self.manX ~= nil and self.manY ~= nil then
                DurabilityFrame:ClearAllPoints()
                DurabilityFrame:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", self.manX, self.manY)
        elseif DurabilityFrame:GetRight() ~= nil and DurabilityFrame:GetTop() ~= nil then
                self.manX = DurabilityFrame:GetRight() - GetScreenWidth()
                self.manY = DurabilityFrame:GetTop() - GetScreenHeight()
                DurabilityFrame:ClearAllPoints()
                DurabilityFrame:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", self.manX + 3000, self.manY + 3000)
        end]]
        DurabilityFrame_SetAlerts()
end

function DurabilityFu:IsShowingAverage()
        return self.db.profile.showAverage
end

function DurabilityFu:ToggleShowingAverage()
        self.db.profile.showAverage = not self.db.profile.showAverage
        self:Update()
end

function DurabilityFu:IsShowingHealthyItems()
        return self.db.profile.showHealthy
end

function DurabilityFu:ToggleShowingHealthyItems()
        self.db.profile.showHealthy = not self.db.profile.showHealthy
        self:UpdateTooltip()
end

function DurabilityFu:OnEnable()
        self.repairIndex = 0
        self.repairMoney = 0
        self.itemStatus = {
                { value = 0, max = 0, cost = 0, name = INVTYPE_HEAD, slot = "Head" },
                { value = 0, max = 0, cost = 0, name = INVTYPE_SHOULDER, slot = "Shoulder" },
                { value = 0, max = 0, cost = 0, name = INVTYPE_CHEST, slot = "Chest" },
                { value = 0, max = 0, cost = 0, name = INVTYPE_WAIST, slot = "Waist" },
                { value = 0, max = 0, cost = 0, name = INVTYPE_LEGS, slot = "Legs" },
                { value = 0, max = 0, cost = 0, name = INVTYPE_FEET, slot = "Feet" },
                { value = 0, max = 0, cost = 0, name = INVTYPE_WRIST, slot = "Wrist" },
                { value = 0, max = 0, cost = 0, name = INVTYPE_HAND, slot = "Hands" },
                { value = 0, max = 0, cost = 0, name = INVTYPE_WEAPONMAINHAND, slot = "MainHand" },
                { value = 0, max = 0, cost = 0, name = INVTYPE_WEAPONOFFHAND, slot = "SecondaryHand" },
                { value = 0, max = 0, cost = 0, name = INVTYPE_RANGED, slot = "Ranged" },
                { value = 0, max = 0, cost = 0, name = INVENTORY_TOOLTIP },
        }
        
        self:RegisterEvent("PLAYER_UNGHOST", "OnBagUpdate")
        self:RegisterEvent("PLAYER_DEAD", "OnBagUpdate")
        self:RegisterEvent("PLAYER_REGEN_ENABLED", "OnBagUpdate")
        self:RegisterEvent("PLAYER_ENTERING_WORLD")
        self:RegisterEvent("UPDATE_INVENTORY_ALERTS")
        self:RegisterEvent("MERCHANT_SHOW")
        self:RegisterEvent("MERCHANT_CLOSED")
        self:RegisterEvent("FACTION_UPDATE")
        
        self:Hook("DurabilityFrame_SetAlerts")
        DurabilityFrame_SetAlerts()
end

function DurabilityFu:OnDisable()
        StaticPopup_Hide("BOSSPANEL_DURABILITY_POPUP")
        if not self.db.profile.showMan then
                self:ToggleShowingMan()
                self.db.profile.showMan = false
        end
end

local options = {
        type = 'group',
        args = {
                popup = {
                        type = 'toggle',
                        name = L["Show repair popup at vendor"],
                        desc = L["Toggle whether to show the popup at the merchant window"],
                        get = "IsShowingPopup",
                        set = "ToggleShowingPopup",
                },
                showMan = {
                        type = 'toggle',
                        name = L["Show the armored man"],
                        desc = L["Toggle whether to show Blizzard's armored man"],
                        get = "IsShowingMan",
                        set = "ToggleShowingMan",
                },
                average = {
                        type = 'toggle',
                        name = L["Show average value"],
                        desc = L["Toggle whether to show your average or minimum durability"],
                        get = "IsShowingAverage",
                        set = "ToggleShowingAverage",
                },
                healthy = {
                        type = 'toggle',
                        name = L["Show healthy items"],
                        desc = L["Toggle whether to show items that are healthy (100% repaired)"],
                        get = "IsShowingHealthyItems",
                        set = "ToggleShowingHealthyItems",
                },
                autoRepair = {
                        type = 'group',
                        name = L["Auto repair"],
                        desc = L["Auto repair"],
                        args = {
                                equipment = {
                                        type = 'toggle',
                                        name = L["Equipment"],
                                        desc = L["Equipment"],
                                        get = "IsAutoRepairingEquipment",
                                        set = "ToggleAutoRepairingEquipment",
                                },
                                inventory = {
                                        type = 'toggle',
                                        name = L["Inventory"],
                                        desc = L["Inventory"],
                                        get = "IsAutoRepairingInventory",
                                        set = "ToggleAutoRepairingInventory",
                                },
                        }
                },
        },
        handler = DurabilityFu,
}

DurabilityFu:RegisterChatCommand(L["AceConsole-Commands"], options)
DurabilityFu.OnMenuRequest = options

function DurabilityFu:PLAYER_ENTERING_WORLD()
        if not self.isHonored then
                for i = 1, GetNumFactions() do
                        local _, _, standing = GetFactionInfo(i)
                        if standing >= 6 then
                                self.isHonored = true
                                break
                        end
                end
        end
        if not self.isSergeant then
                local _, rankNumber = GetPVPRankInfo(UnitPVPRank("player"))
                if rankNumber >= 3 then
                        self.isSergeant = true
                end
        end
end

function DurabilityFu:FACTION_UPDATE()
        if GetNumFactions() > 0 and not self.isHonored then
                for i = 1, GetNumFactions() do
                        local _, _, standing = GetFactionInfo(i)
                        if standing >= 6 then
                                self.isHonored = true
                                break
                        end
                end
                self:UnregisterEvent("FACTION_UPDATE")
        elseif self.isHonored then
                self:UnregisterEvent("FACTION_UPDATE")
        end
end

local lastUpdate
function DurabilityFu:UpdateBagData()
        if lastUpdate and GetTime() - lastUpdate < 1 then
                return
        end
        lastUpdate = GetTime()
        local minStatus = 1.0
        local minValue = 0
        local minMax = 0
        
        self.itemStatus[12].value = 0
        self.itemStatus[12].max = 0
        self.itemStatus[12].cost = 0
        
        for bag = 0, 4 do       
                for slot = 1, GetContainerNumSlots(bag) do
        
                        local status, value, max, cost = self:GetStatus(slot, bag)
                        if not self:IsShowingAverage() then
                                if status ~= nil and status < minStatus then
                                        minStatus = status
                                        minValue = value
                                        minMax = max
                                        
                                        if (self.repairIndex == 0 or status < self:GetPercent(self.itemStatus[self.repairIndex].value, self.itemStatus[self.repairIndex].max)) and max ~= 0 then
                                                self.repairIndex = 12
                                        end
                                        
                                        self.itemStatus[12].value = value
                                        self.itemStatus[12].max = max
                                end
                        elseif cost ~= nil then
                                self.itemStatus[12].value = self.itemStatus[12].value + value
                                self.itemStatus[12].max = self.itemStatus[12].max + max
                        end
                        if cost ~= nil then
                                self.itemStatus[12].cost = self.itemStatus[12].cost + cost
                        end
                end
        end
        if self:IsShowingAverage() then
                local status = self:GetPercent(self.itemStatus[12].value, self.itemStatus[12].max)
                if (self.repairIndex == 0 or status < self:GetPercent(self.itemStatus[self.repairIndex].value, self.itemStatus[self.repairIndex].max)) and self.itemStatus[12].max ~= 0 then
                        self.repairIndex = 12
                end
        end
end

function DurabilityFu:OnBagUpdate()
        self:UpdateBagData()
        self:UpdateText()
        self:UpdateTooltip()
end

local lastUpdate
function DurabilityFu:UpdateInventoryData(toCheck)
        if lastUpdate and GetTime() - lastUpdate < 1 then
                return
        end
        lastUpdate = GetTime()
        if toCheck == nil then
                toCheck = {}
                for i = 1, 11 do
                        toCheck[i] = true
                end
        end
        
        local minStatus = 1.0
        local minValue = 0
        local minMax = 0
        local minIndex = 0
        
        for index,_ in toCheck do
                local status, value, max, cost = self:GetStatus(index)
                if status ~= nil and status < minStatus then
                        minStatus = status
                        minValue = value
                        minMax = max
                        minIndex = index
                end
                
                self.itemStatus[index].value = value or 0
                self.itemStatus[index].max = max or 0
                self.itemStatus[index].cost = cost or 0
        end

        self.repairIndex = minIndex
        
        if not self:IsShowingMan() then
                self.db.profile.showMan = true
                self:ToggleShowingMan()
        end
end

function DurabilityFu:UPDATE_INVENTORY_ALERTS()
        self:UpdateInventoryData(INVENTORY_ALERT_STATUS_SLOTS)
        self:UpdateText()
        self:UpdateTooltip()
end

function DurabilityFu:MERCHANT_SHOW()
        local dirty = false
        local stop = false
        if CanMerchantRepair() then
                if self:IsAutoRepairingEquipment() then
                        local repairCost = GetRepairAllCost()
                        local money = GetMoney()
                        if money < repairCost then
                                self:Print("Cannot auto-repair equipment. Your money: %s. Needed: %s", Abacus:FormatMoneyFull(money, true), Abacus:FormatMoneyFull(repairCost, true))
                                stop = true
                        elseif repairCost > 0 then
                                RepairAllItems()
                                self:Print("Auto-repaired equipment: %s", Abacus:FormatMoneyFull(repairCost))
                                dirty = true
                        else
                                self:Print("No equipment to auto-repair")
                        end
                end
                if not stop and self:IsAutoRepairingInventory() then
                        local repairCost = self:CalculateInventoryCost()
                        local money = GetMoney()
                        if money < repairCost then
                                self:Print("Cannot auto-repair inventory. Your money: %s. Needed: %s", Abacus:FormatMoneyFull(money, true), Abacus:FormatMoneyFull(repairCost, true))
                        elseif repairCost > 0 then
                                ShowRepairCursor()
                                for bag = 0, 4 do
                                        for slot = 1, GetContainerNumSlots(bag) do
                                                local _,repairCost = Gratuity:SetBagItem(bag, slot)
                                                if repairCost ~= nil and repairCost > 0 then
                                                        PickupContainerItem(bag, slot)
                                                end
                                        end
                                end
                                HideRepairCursor()
                                self:Print("Auto-repaired inventory: %s", Abacus:FormatMoneyFull(repairCost))
                                dirty = true
                        else
                                self:Print("No items in inventory to auto-repair")
                        end
                end
        end
        self.merchantShown = true
        if self:IsShowingPopup() then
                local canRepair, repairCost = CanMerchantRepair(), GetRepairAllCost()
                if canRepair then
                        repairCost = repairCost + self:CalculateInventoryCost()
                        if repairCost > 0 then
                                if dirty then
                                        self:ScheduleEvent(self.OpenPopup, 1, self)
                                else
                                        self:OpenPopup()
                                end
                        end
                end
        end
        self:ScheduleRepeatingEvent(self.name, self.OnUpdate, 1, self)
        self.updateNum = nil
        self:Update()
end

function DurabilityFu:MERCHANT_CLOSED()
        self.merchantShown = false
        self:ClosePopup()
        self:ScheduleRepeatingEvent(self.name, self.OnUpdate, 1, self)
        self.updateNum = nil
        self:Update()
end

function DurabilityFu:CalculateInventoryCost()
        local result = 0
        for bag = 0, 4 do
                for slot = 1, GetContainerNumSlots(bag) do
                        local _,repairCost = Gratuity:SetBagItem(bag, slot)
                        if repairCost ~= nil and repairCost > 0 then
                                result = result + repairCost
                        end
                end
        end
        
        return result
end

function DurabilityFu:GetPercent(quotient, denominator)
        if denominator ~= 0 then
                return quotient / denominator
        else
                return 1
        end
end

function DurabilityFu:GetStatus(index, bag)
        local value = 0
        local max = 0
        local cost = 0
        
        local hasItem, repairCost
        if bag ~= nil then
                _,repairCost = Gratuity:SetBagItem(bag, index)
                hasItem = GetContainerItemInfo(bag, index) ~= nil
        else
                local slotName = self.itemStatus[index].slot .. "Slot"
                
                local id = GetInventorySlotInfo(slotName)
                hasItem,_,repairCost = Gratuity:SetInventoryItem("player", id)
        end
        
        if hasItem then
                if repairCost ~= nil then
                        cost = repairCost
                end
                
                local value, max = Gratuity:FindDeformat(DURABILITY_TEMPLATE, nil, nil, nil, true)
                if value then
                        value = tonumber(value)
                        max = tonumber(max)
                        return self:GetPercent(value, max), value, max, cost
                end
        end
end

function DurabilityFu:OnDataUpdate()
        self:UpdateBagData()
        self:UpdateInventoryData()
end

function DurabilityFu:OnTextUpdate()
        local percent
        if not self:IsShowingAverage() then
                if self.repairIndex == 0 then
                        percent = 1
                else
                        percent = self:GetPercent(self.itemStatus[self.repairIndex].value, self.itemStatus[self.repairIndex].max)
                end
        else
                local value = 0
                local max = 0
                for i,item in self.itemStatus do
                        if i ~= 12 then
                                value = value + item.value
                                max = max + item.max
                        end
                end
                percent = self:GetPercent(value, max)
        end
        self:SetText(string.format("|cff%s%d%%|r", Crayon:GetThresholdHexColor(percent), percent * 100))
end

function DurabilityFu:OnTooltipUpdate()
        local cost = 0
        local cat = Tablet:AddCategory(
                'columns', 3,
                'child_textR', 1,
                'child_textG', 1,
                'child_textB', 0
        )
        for index, item in self.itemStatus do
                if item.max > 0 then
                        cost = cost + item.cost
                        local percent = self:GetPercent(item.value, item.max)
                        if self:IsShowingHealthyItems() or percent < 1 then
                                local r, g, b = Crayon:GetThresholdColor(percent)
                                cat:AddLine(
                                        'text', item.name,
                                        'text2', string.format("%.0f%%", percent * 100),
                                        'text2R', r,
                                        'text2G', g,
                                        'text2B', b,
                                        'text3', Abacus:FormatMoneyShort(item.cost, true)
                                )
                        end
                end
        end
        local value = 0
        local max = 0
        for i,item in self.itemStatus do
                if i ~= 12 then
                        value = value + item.value
                        max = max + item.max
                end
        end
        cat = Tablet:AddCategory(
                'columns', 2,
                'text', L["Total"],
                'child_textR', 1,
                'child_textG', 1,
                'child_textB', 0,
                'child_text2R', 1,
                'child_text2G', 1,
                'child_text2B', 1
        )
        local r, g, b = Crayon:GetThresholdColor(value / max)
        cat:AddLine(
                'text', L["Percent"],
                'text2', string.format("%.0f%%", value / max * 100),
                'text2R', r,
                'text2G', g,
                'text2B', b
        )
        
        cat:AddLine(
                'text', L["Repair cost"],
                'text2', Abacus:FormatMoneyFull(cost, true)
        )
        if not self.merchantShown then
                if self.isSergeant then
                        if self.isHonored then
                        cat:AddLine(
                                'text', TEXT_HONORED .. " / " .. TEXT_SERGEANT,
                                'text2', Abacus:FormatMoneyFull(cost * 0.9, true)
                        )
                        cat:AddLine(
                                'text', TEXT_HONORED .. " & " .. TEXT_SERGEANT,
                                'text2', Abacus:FormatMoneyFull(cost * 0.8, true)
                        )
                        else
                        cat:AddLine(
                                'text', TEXT_SERGEANT,
                                'text2', Abacus:FormatMoneyFull(cost * 0.9, true)
                        )
                        end
                elseif self.isHonored then
                        cat:AddLine(
                                'text', TEXT_HONORED,
                                'text2', Abacus:FormatMoneyFull(cost * 0.9, true)
                        )
                end
        end
end

function DurabilityFu:PromptEquipment_OnClick()
        RepairAllItems()
        self:ClosePopup()
        self:Update()
end

function DurabilityFu:PromptInventory_OnClick()
        ShowRepairCursor()
        for bag = 0, 4 do
                for slot = 1, GetContainerNumSlots(bag) do
                        local _,repairCost = Gratuity:SetBagItem(bag, slot)
                        if repairCost ~= nil and repairCost > 0 then
                                PickupContainerItem(bag, slot)
                        end
                end
        end
        HideRepairCursor()
        self:ClosePopup()
        self:Update()
        self:ScheduleRepeatingEvent(self.name, self.OnUpdate, 1, self)
end

function DurabilityFu:OnUpdate()
        if self.updateNum == nil then
                self.updateNum = 0
        end
        self:Update()
        self.updateNum = self.updateNum + 1
        if self.updateNum >= 5 then
                self:CancelScheduledEvent(self.name)
                self.updateNum = 0
        end
end

function DurabilityFu:PromptBoth_OnClick()
        RepairAllItems()
        self:PromptInventory_OnClick()
end

local popup
function DurabilityFu:ClosePopup()
        if popup then
                popup:Hide()
        end
end

local buttonSize = 32

function DurabilityFu:OpenPopup()
        local canRepair, repairCost = CanMerchantRepair(), GetRepairAllCost()
        if not canRepair then
                return
        end
        repairCost = repairCost + self:CalculateInventoryCost()
        if repairCost == 0 then
                return
        end
        if not popup then
                popup = CreateFrame("Frame", "DurabilityFuPrompt", UIParent)
                popup:SetFrameStrata("DIALOG")
                popup:EnableMouse(true)
                popup:SetMovable(true)
                popup:Hide()
                popup:SetWidth(256)
                popup:SetHeight(160)
                popup:SetPoint("TOP", UIParent, "TOP", self.db.profile.popupX, self.db.profile.popupY)
                
                local header = CreateFrame("Frame", popup:GetName() .. "Header", popup)
                header:SetWidth(192)
                header:SetHeight(32)
                header:SetPoint("TOP", popup, "TOP", 0, 6)
                local texture = header:CreateTexture(popup:GetName() .. "HeaderBar", "ARTWORK")
                texture:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
                texture:SetWidth(384)
                texture:SetHeight(64)
                texture:SetPoint("TOP", header, "TOP", 0, 5)
                texture:Show()
                local text = header:CreateFontString(popup:GetName() .. "HeaderTitle", "ARTWORK")
                text:SetFontObject(GameFontNormal)
                text:SetPoint("CENTER", header, "CENTER", 0, 0)
                text:SetText(self:GetTitle() .. " " .. L["Repair"])
                header:EnableMouse(true)
                header:SetMovable(true)
                header:SetScript("OnMouseDown", function()
                        popup:StartMoving()
                end)
                header:SetScript("OnMouseUp", function()
                        popup:StopMovingOrSizing()
                        self.db.profile.popupY = popup:GetTop() - GetScreenHeight()
                        self.db.profile.popupX = popup:GetCenter() - GetScreenWidth() / 2
                end)
                
                local eqButton = CreateFrame("Button", popup:GetName() .. "EquipmentButton", popup)
                popup.eqButton = eqButton
                eqButton:SetWidth(buttonSize)
                eqButton:SetHeight(buttonSize)
                local texture = eqButton:CreateTexture()
                texture:SetWidth(buttonSize * 1.6458333)
                texture:SetHeight(buttonSize * 1.6458333)
                texture:SetPoint("CENTER", eqButton, "CENTER")
                texture:SetTexture("Interface\\Buttons\\UI-Quickslot2")
                eqButton:SetNormalTexture(texture)
                local texture = eqButton:CreateTexture(nil, "BACKGROUND")
                texture:SetTexture("Interface\\Icons\\INV_Chest_Leather_08")
                texture:SetAllPoints(eqButton)
                eqButton:SetPushedTexture("Interface\\Buttons\\UI-Quickslot-Depress")
                local texture = eqButton:CreateTexture()
                texture:SetTexture("Interface\\Buttons\\ButtonHilight-Square")
                texture:SetAllPoints(eqButton)
                eqButton:SetHighlightTexture(texture)
                local texture = eqButton:CreateTexture()
                texture:SetTexture("Interface\\Icons\\INV_Chest_Leather_08")
                texture:SetDesaturated(true)
                texture:SetAllPoints(eqButton)
                eqButton:SetDisabledTexture(texture)
                eqButton:SetPoint("TOPRIGHT", popup, "TOPRIGHT", -18, -36)
                eqButton:SetScript("OnClick", function()
                        self:PromptEquipment_OnClick()
                end)
                local texture = eqButton:CreateTexture(nil, "ARTWORK")
                texture:SetTexture(0, 0, 0, 0.5)
                texture:SetAllPoints(eqButton)
                local button_Enable = eqButton.Enable
                function eqButton:Enable()
                        button_Enable(self)
                        texture:Hide()
                end
                local button_Disable = eqButton.Disable
                function eqButton:Disable()
                        button_Disable(self)
                        texture:Show()
                end
                
                local invButton = CreateFrame("Button", popup:GetName() .. "InventoryButton", popup)
                popup.invButton = invButton
                invButton:SetWidth(buttonSize)
                invButton:SetHeight(buttonSize)
                local texture = invButton:CreateTexture()
                texture:SetWidth(buttonSize * 1.6458333)
                texture:SetHeight(buttonSize * 1.6458333)
                texture:SetPoint("CENTER", invButton, "CENTER")
                texture:SetTexture("Interface\\Buttons\\UI-Quickslot2")
                invButton:SetNormalTexture(texture)
                local texture = invButton:CreateTexture(nil, "BACKGROUND")
                texture:SetTexture("Interface\\Icons\\INV_Misc_Bag_10")
                texture:SetAllPoints(invButton)
                invButton:SetPushedTexture("Interface\\Buttons\\UI-Quickslot-Depress")
                local texture = invButton:CreateTexture()
                texture:SetTexture("Interface\\Buttons\\ButtonHilight-Square")
                texture:SetAllPoints(invButton)
                invButton:SetHighlightTexture(texture)
                local texture = invButton:CreateTexture()
                texture:SetTexture("Interface\\Icons\\INV_Misc_Bag_10")
                texture:SetDesaturated(true)
                texture:SetAllPoints(invButton)
                invButton:SetDisabledTexture(texture)
                invButton:SetPoint("TOP", eqButton, "BOTTOM", 0, -8)
                invButton:SetScript("OnClick", function()
                        self:PromptInventory_OnClick()
                end)
                local texture = invButton:CreateTexture(nil, "ARTWORK")
                texture:SetTexture(0, 0, 0, 0.5)
                texture:SetAllPoints(invButton)
                local button_Enable = invButton.Enable
                function invButton:Enable()
                        button_Enable(self)
                        texture:Hide()
                end
                local button_Disable = invButton.Disable
                function invButton:Disable()
                        button_Disable(self)
                        texture:Show()
                end
                
                local bothButton = CreateFrame("Button", popup:GetName() .. "BothButton", popup)
                popup.bothButton = bothButton
                bothButton:SetWidth(buttonSize)
                bothButton:SetHeight(buttonSize)
                local texture = bothButton:CreateTexture()
                texture:SetWidth(buttonSize * 1.6458333)
                texture:SetHeight(buttonSize * 1.6458333)
                texture:SetPoint("CENTER", bothButton, "CENTER")
                texture:SetTexture("Interface\\Buttons\\UI-Quickslot2")
                bothButton:SetNormalTexture(texture)
                local texture = bothButton:CreateTexture(nil, "BACKGROUND")
                texture:SetTexture("Interface\\Icons\\Trade_Blacksmithing")
                texture:SetAllPoints(bothButton)
                bothButton:SetPushedTexture("Interface\\Buttons\\UI-Quickslot-Depress")
                local texture = bothButton:CreateTexture()
                texture:SetTexture("Interface\\Buttons\\ButtonHilight-Square")
                texture:SetAllPoints(bothButton)
                bothButton:SetHighlightTexture(texture)
                local texture = bothButton:CreateTexture()
                texture:SetTexture("Interface\\Icons\\Trade_Blacksmithing")
                texture:SetDesaturated(true)
                texture:SetAllPoints(bothButton)
                bothButton:SetDisabledTexture(texture)
                bothButton:SetPoint("TOP", invButton, "BOTTOM", 0, -8)
                bothButton:SetScript("OnClick", function()
                        self:PromptBoth_OnClick()
                end)
                local texture = bothButton:CreateTexture(nil, "ARTWORK")
                texture:SetTexture(0, 0, 0, 0.5)
                texture:SetAllPoints(bothButton)
                local button_Enable = bothButton.Enable
                function bothButton:Enable()
                        button_Enable(self)
                        texture:Hide()
                end
                local button_Disable = bothButton.Disable
                function bothButton:Disable()
                        button_Disable(self)
                        texture:Show()
                end
                
                local closeButton = CreateFrame("Button", popup:GetName() .. "CloseButton", popup)
                popup.closeButton = closeButton
                closeButton:SetWidth(32)
                closeButton:SetHeight(32)
                closeButton:SetPoint("TOPRIGHT", popup, "TOPRIGHT", 0, 0)
                closeButton:SetNormalTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Up")
                closeButton:SetPushedTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Down")
                local texture = closeButton:CreateTexture()
                texture:SetTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Highlight")
                texture:SetBlendMode("ADD")
                closeButton:SetHighlightTexture(texture)
                closeButton:SetScript("OnClick", function()
                        self:ClosePopup()
                end)
                closeButton:Show()
                
                local eqCost = CreateFrame("Frame", popup:GetName() .. "EquipmentCost", popup)
                popup.eqCost = eqCost
                eqCost:SetWidth(96)
                eqCost:SetHeight(13)
                eqCost:SetPoint("RIGHT", eqButton, "LEFT", -8, 0)
                local copper = CreateFrame("Frame", eqCost:GetName() .. "Copper", eqCost)
                copper:SetWidth(32)
                copper:SetHeight(13)
                copper:SetPoint("RIGHT", eqCost, "RIGHT")
                local texture = copper:CreateTexture(copper:GetName() .. "Texture", "ARTWORK")
                texture:SetPoint("RIGHT", copper, "RIGHT")
                texture:SetWidth(13)
                texture:SetHeight(13)
                texture:SetTexture("Interface\\MoneyFrame\\UI-MoneyIcons")
                texture:SetTexCoord(0.5, 0.75, 0, 1)
                local copperText = copper:CreateFontString(copper:GetName() .. "Text", "ARTWORK")
                copperText:SetPoint("RIGHT", texture, "LEFT")
                copperText:SetHeight(13)
                copperText:SetFontObject(NumberFontNormal)
                copperText:SetText(0)
                copperText:SetJustifyH("RIGHT")
                
                local silver = CreateFrame("Frame", eqCost:GetName() .. "Silver", eqCost)
                silver:SetWidth(32)
                silver:SetHeight(13)
                silver:SetPoint("RIGHT", copper, "LEFT")
                local texture = silver:CreateTexture(silver:GetName() .. "Texture", "ARTWORK")
                texture:SetPoint("RIGHT", silver, "RIGHT")
                texture:SetWidth(13)
                texture:SetHeight(13)
                texture:SetTexture("Interface\\MoneyFrame\\UI-MoneyIcons")
                texture:SetTexCoord(0.25, 0.5, 0, 1)
                local silverText = silver:CreateFontString(silver:GetName() .. "Text", "ARTWORK")
                silverText:SetPoint("RIGHT", texture, "LEFT")
                silverText:SetHeight(13)
                silverText:SetFontObject(NumberFontNormal)
                silverText:SetText(0)
                silverText:SetJustifyH("RIGHT")
                
                local gold = CreateFrame("Frame", eqCost:GetName() .. "Gold", eqCost)
                gold:SetWidth(32)
                gold:SetHeight(13)
                gold:SetPoint("RIGHT", silver, "LEFT")
                local texture = gold:CreateTexture(gold:GetName() .. "Texture", "ARTWORK")
                texture:SetPoint("RIGHT", gold, "RIGHT")
                texture:SetWidth(13)
                texture:SetHeight(13)
                texture:SetTexture("Interface\\MoneyFrame\\UI-MoneyIcons")
                texture:SetTexCoord(0, 0.25, 0, 1)
                local goldText = gold:CreateFontString(gold:GetName() .. "Text", "ARTWORK")
                goldText:SetPoint("RIGHT", texture, "LEFT")
                goldText:SetHeight(13)
                goldText:SetFontObject(NumberFontNormal)
                goldText:SetText(0)
                goldText:SetJustifyH("RIGHT")
                function eqCost:SetValue(value)
                        local g = floor(value / 10000)
                        local s = mod(floor(value / 100), 100)
                        local c = mod(value, 100)
                        goldText:SetText(g)
                        silverText:SetText(s)
                        copperText:SetText(c)
                        if g == 0 then
                                gold:Hide()
                                if s == 0 then
                                        silver:Hide()
                                else
                                        silver:Show()
                                end
                        else
                                gold:Show()
                                silver:Show()
                        end
                end
                
                local invCost = CreateFrame("Frame", popup:GetName() .. "InventoryCost", popup)
                popup.invCost = invCost
                invCost:SetWidth(96)
                invCost:SetHeight(13)
                invCost:SetPoint("RIGHT", invButton, "LEFT", -8, 0)
                local copper = CreateFrame("Frame", invCost:GetName() .. "Copper", invCost)
                copper:SetWidth(32)
                copper:SetHeight(13)
                copper:SetPoint("RIGHT", invCost, "RIGHT")
                local texture = copper:CreateTexture(copper:GetName() .. "Texture", "ARTWORK")
                texture:SetPoint("RIGHT", copper, "RIGHT")
                texture:SetWidth(13)
                texture:SetHeight(13)
                texture:SetTexture("Interface\\MoneyFrame\\UI-MoneyIcons")
                texture:SetTexCoord(0.5, 0.75, 0, 1)
                local copperText = copper:CreateFontString(copper:GetName() .. "Text", "ARTWORK")
                copperText:SetPoint("RIGHT", texture, "LEFT")
                copperText:SetHeight(13)
                copperText:SetFontObject(NumberFontNormal)
                copperText:SetText(0)
                copperText:SetJustifyH("RIGHT")
                
                local silver = CreateFrame("Frame", invCost:GetName() .. "Silver", invCost)
                silver:SetWidth(32)
                silver:SetHeight(13)
                silver:SetPoint("RIGHT", copper, "LEFT")
                local texture = silver:CreateTexture(silver:GetName() .. "Texture", "ARTWORK")
                texture:SetPoint("RIGHT", silver, "RIGHT")
                texture:SetWidth(13)
                texture:SetHeight(13)
                texture:SetTexture("Interface\\MoneyFrame\\UI-MoneyIcons")
                texture:SetTexCoord(0.25, 0.5, 0, 1)
                local silverText = silver:CreateFontString(silver:GetName() .. "Text", "ARTWORK")
                silverText:SetPoint("RIGHT", texture, "LEFT")
                silverText:SetHeight(13)
                silverText:SetFontObject(NumberFontNormal)
                silverText:SetText(0)
                silverText:SetJustifyH("RIGHT")
                
                local gold = CreateFrame("Frame", invCost:GetName() .. "Gold", invCost)
                gold:SetWidth(32)
                gold:SetHeight(13)
                gold:SetPoint("RIGHT", silver, "LEFT")
                local texture = gold:CreateTexture(gold:GetName() .. "Texture", "ARTWORK")
                texture:SetPoint("RIGHT", gold, "RIGHT")
                texture:SetWidth(13)
                texture:SetHeight(13)
                texture:SetTexture("Interface\\MoneyFrame\\UI-MoneyIcons")
                texture:SetTexCoord(0, 0.25, 0, 1)
                local goldText = gold:CreateFontString(gold:GetName() .. "Text", "ARTWORK")
                goldText:SetPoint("RIGHT", texture, "LEFT")
                goldText:SetHeight(13)
                goldText:SetFontObject(NumberFontNormal)
                goldText:SetText(0)
                goldText:SetJustifyH("RIGHT")
                function invCost:SetValue(value)
                        local g = floor(value / 10000)
                        local s = mod(floor(value / 100), 100)
                        local c = mod(value, 100)
                        goldText:SetText(g)
                        silverText:SetText(s)
                        copperText:SetText(c)
                        if g == 0 then
                                gold:Hide()
                                if s == 0 then
                                        silver:Hide()
                                else
                                        silver:Show()
                                end
                        else
                                gold:Show()
                                silver:Show()
                        end
                end
                
                local bothCost = CreateFrame("Frame", popup:GetName() .. "BothCost", popup)
                popup.bothCost = bothCost
                bothCost:SetWidth(96)
                bothCost:SetHeight(13)
                bothCost:SetPoint("RIGHT", bothButton, "LEFT", -8, 0)
                local copper = CreateFrame("Frame", bothCost:GetName() .. "Copper", bothCost)
                copper:SetWidth(32)
                copper:SetHeight(13)
                copper:SetPoint("RIGHT", bothCost, "RIGHT")
                local texture = copper:CreateTexture(copper:GetName() .. "Texture", "ARTWORK")
                texture:SetPoint("RIGHT", copper, "RIGHT")
                texture:SetWidth(13)
                texture:SetHeight(13)
                texture:SetTexture("Interface\\MoneyFrame\\UI-MoneyIcons")
                texture:SetTexCoord(0.5, 0.75, 0, 1)
                local copperText = copper:CreateFontString(copper:GetName() .. "Text", "ARTWORK")
                copperText:SetPoint("RIGHT", texture, "LEFT")
                copperText:SetHeight(13)
                copperText:SetFontObject(NumberFontNormal)
                copperText:SetText(0)
                copperText:SetJustifyH("RIGHT")
                
                local silver = CreateFrame("Frame", bothCost:GetName() .. "Silver", bothCost)
                silver:SetWidth(32)
                silver:SetHeight(13)
                silver:SetPoint("RIGHT", copper, "LEFT")
                local texture = silver:CreateTexture(silver:GetName() .. "Texture", "ARTWORK")
                texture:SetPoint("RIGHT", silver, "RIGHT")
                texture:SetWidth(13)
                texture:SetHeight(13)
                texture:SetTexture("Interface\\MoneyFrame\\UI-MoneyIcons")
                texture:SetTexCoord(0.25, 0.5, 0, 1)
                local silverText = silver:CreateFontString(silver:GetName() .. "Text", "ARTWORK")
                silverText:SetPoint("RIGHT", texture, "LEFT")
                silverText:SetHeight(13)
                silverText:SetFontObject(NumberFontNormal)
                silverText:SetText(0)
                silverText:SetJustifyH("RIGHT")
                
                local gold = CreateFrame("Frame", bothCost:GetName() .. "Gold", bothCost)
                gold:SetWidth(32)
                gold:SetHeight(13)
                gold:SetPoint("RIGHT", silver, "LEFT")
                local texture = gold:CreateTexture(gold:GetName() .. "Texture", "ARTWORK")
                texture:SetPoint("RIGHT", gold, "RIGHT")
                texture:SetWidth(13)
                texture:SetHeight(13)
                texture:SetTexture("Interface\\MoneyFrame\\UI-MoneyIcons")
                texture:SetTexCoord(0, 0.25, 0, 1)
                local goldText = gold:CreateFontString(gold:GetName() .. "Text", "ARTWORK")
                goldText:SetPoint("RIGHT", texture, "LEFT")
                goldText:SetHeight(13)
                goldText:SetFontObject(NumberFontNormal)
                goldText:SetText(0)
                goldText:SetJustifyH("RIGHT")
                function bothCost:SetValue(value)
                        local g = floor(value / 10000)
                        local s = mod(floor(value / 100), 100)
                        local c = mod(value, 100)
                        goldText:SetText(g)
                        silverText:SetText(s)
                        copperText:SetText(c)
                        if g == 0 then
                                gold:Hide()
                                if s == 0 then
                                        silver:Hide()
                                else
                                        silver:Show()
                                end
                        else
                                gold:Show()
                                silver:Show()
                        end
                end
                
                local eqLabel = popup:CreateFontString(popup:GetName() .. "EquipmentLabel", "ARTWORK")
                eqLabel:SetPoint("RIGHT", eqCost, "LEFT", -8, 0)
                eqLabel:SetFontObject(GameFontNormal)
                eqLabel:SetText(L["Equipment"])
                
                local invLabel = popup:CreateFontString(popup:GetName() .. "InventoryLabel", "ARTWORK")
                invLabel:SetPoint("RIGHT", invCost, "LEFT", -8, 0)
                invLabel:SetFontObject(GameFontNormal)
                invLabel:SetText(L["Inventory"])
                
                local bothLabel = popup:CreateFontString(popup:GetName() .. "BothLabel", "ARTWORK")
                bothLabel:SetPoint("RIGHT", bothCost, "LEFT", -8, 0)
                bothLabel:SetFontObject(GameFontNormal)
                bothLabel:SetText(L["Total"])
                
                popup:SetBackdrop({
                        bgFile = "Interface\\TutorialFrame\\TutorialFrameBackground",
                        edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
                        tile = true,
                        edgeSize = 16,
                        tileSize = 32,
                        insets = {
                                left = 5,
                                right = 5,
                                top = 5,
                                bottom = 5
                        }
                })
        end
        
        popup:Show()
        
        local equipment = GetRepairAllCost()
        local inventory = self:CalculateInventoryCost()
        local both = equipment + inventory
        popup.bothButton:Disable()
        if equipment == 0 then
                popup.eqButton:Disable()
        else
                popup.eqButton:Enable()
                popup.bothButton:Enable()
        end
        if inventory == 0 then
                popup.invButton:Disable()
        else
                popup.invButton:Enable()
                popup.bothButton:Enable()
        end
        popup.eqCost:SetValue(equipment)
        popup.invCost:SetValue(inventory)
        popup.bothCost:SetValue(both)
end

function DurabilityFu:DurabilityFrame_SetAlerts()
        self.hooks.DurabilityFrame_SetAlerts.orig()
        if not self:IsShowingMan() then
                DurabilityFrame:Hide()
        end
end