vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:

-- Title: TitanRepair v2.17 (improved Performances by Archarodim - 2006-04-21 04:35 CEST)
-- Notes: Adds Durability Info to Titan Panel, also reminds you to repair
-- Author: lua@lumpn.de/Adsertor

TITAN_REPAIR_ID = "Repair";

REPAIR_INDEX = 0;
REPAIR_MONEY = 0;
REPAIR_ITEM_STATUS = {};
REPAIR_ITEM_BAG = {};
-- this index (0) will be never set, just accessed to this state, it simplifies code for TitanRepair_GetMostDamagedItem() when Tit_R_EquipedMinIndex == 0
REPAIR_ITEM_STATUS[0] = { val = 0, max = 0, cost = 0, name = INVTYPE_HEAD, slot = "VIRTUAL" };
--
REPAIR_ITEM_STATUS[1] = { val = 0, max = 0, cost = 0, name = INVTYPE_HEAD, slot = "Head" };
REPAIR_ITEM_STATUS[2] = { val = 0, max = 0, cost = 0, name = INVTYPE_SHOULDER, slot = "Shoulder" };
REPAIR_ITEM_STATUS[3] = { val = 0, max = 0, cost = 0, name = INVTYPE_CHEST, slot = "Chest" };
REPAIR_ITEM_STATUS[4] = { val = 0, max = 0, cost = 0, name = INVTYPE_WAIST, slot = "Waist" };
REPAIR_ITEM_STATUS[5] = { val = 0, max = 0, cost = 0, name = INVTYPE_LEGS, slot = "Legs" };
REPAIR_ITEM_STATUS[6] = { val = 0, max = 0, cost = 0, name = INVTYPE_FEET, slot = "Feet" };
REPAIR_ITEM_STATUS[7] = { val = 0, max = 0, cost = 0, name = INVTYPE_WRIST, slot = "Wrist" };
REPAIR_ITEM_STATUS[8] = { val = 0, max = 0, cost = 0, name = INVTYPE_HAND, slot = "Hands" };
REPAIR_ITEM_STATUS[9] = { val = 0, max = 0, cost = 0, name = INVTYPE_WEAPONMAINHAND, slot = "MainHand" };
REPAIR_ITEM_STATUS[10] = { val = 0, max = 0, cost = 0, name = INVTYPE_WEAPONOFFHAND, slot = "SecondaryHand" };
REPAIR_ITEM_STATUS[11] = { val = 0, max = 0, cost = 0, name = INVTYPE_RANGED, slot = "Ranged" };
REPAIR_ITEM_STATUS[12] = { val = 0, max = 0, cost = 0, name = INVENTORY_TOOLTIP };

INVENTORY_REPAIR_STATUS = {}
INVENTORY_REPAIR_STATUS[0] = { val = 0, max = 0, cost = 0, name = INVENTORY_TOOLTIP };
INVENTORY_REPAIR_STATUS[1] = { val = 0, max = 0, cost = 0, name = INVENTORY_TOOLTIP };
INVENTORY_REPAIR_STATUS[2] = { val = 0, max = 0, cost = 0, name = INVENTORY_TOOLTIP };
INVENTORY_REPAIR_STATUS[3] = { val = 0, max = 0, cost = 0, name = INVENTORY_TOOLTIP };
INVENTORY_REPAIR_STATUS[4] = { val = 0, max = 0, cost = 0, name = INVENTORY_TOOLTIP };


local TitRep_show_debug = false; -- will tell you a lot about what's happening

local Tit_R_WholeScanInProgress = false;
local Tit_R_UpdateCheckDelay    = 2; -- 2 seconds must elaps between scans
local Tit_R_DelayTimer          = 0; -- init the timer
local Tit_R_EquipedMinIndex     = 0; -- keep a record of the most damaged equiped item (used when removing the most damaged item placed in the inventory to switch on an equiped index)
local Tit_R_PleaseCheckBag      = { };
local Tit_R_CouldRepair         = false;
local Tit_R_CheckForUpdate      = false; -- tells the TitanPanelRepairButton_OnUpdate() function that it has something to do

Tit_R_PleaseCheckBag[0]  = 0;
Tit_R_PleaseCheckBag[1]  = 0;
Tit_R_PleaseCheckBag[2]  = 0;
Tit_R_PleaseCheckBag[3]  = 0;
Tit_R_PleaseCheckBag[4]  = 0;
Tit_R_PleaseCheckBag[5]  = 0; -- this will be used for equiped items, not very good but simplify the code...
-- Tit_R_PleaseCheckBag element values meaning:
--  0 means "This bag did not changed, no need to scan it"
--  1 means "Please Check This Bag"
--  2 means "Yes I'm checking, don't disturb me"
--

local InitialLoad = 0; -- Found no use of this

StaticPopupDialogs["REPAIR_CONFIRMATION"] = {
    text = TEXT(REPAIR_LOCALE["confirmation"]),
    button1 = TEXT(YES),
    button2 = TEXT(NO),
    OnAccept = function()
        TitanRepair_RepairItems();
    end,
    OnShow = function()
        MoneyFrame_Update(this:GetName().."MoneyFrame", REPAIR_MONEY);
    end,        
    hasMoneyFrame = 1,
    timeout = 0,
};


function TitanPanelRepairButton_OnLoad()
    -- register plugin
    this.registry = { 
        id = TITAN_REPAIR_ID,
        builtIn = 1,
        version = "2.17.11000",
        menuText = REPAIR_LOCALE["menu"],
        buttonTextFunction = "TitanPanelRepairButton_GetButtonText",
        tooltipTitle = REPAIR_LOCALE["tooltip"],
        tooltipTextFunction = "TitanPanelRepairButton_GetTooltipText",
        icon = "Interface\\AddOns\\Titan\\Artwork\\TitanRepair",
        iconWidth = 16,
        savedVariables = {
            ShowIcon = 1,
            ShowLabelText = 1,
            ShowItemName = TITAN_NIL,
            ShowUndamaged = TITAN_NIL,
            ShowPopup = TITAN_NIL,
            ShowPercentage = TITAN_NIL,
            ShowColoredText = TITAN_NIL,
            RepairInventory = TITAN_NIL,
            ShowInventory = 1 -- this is no longer a problem :-D
        }
    };

    this:RegisterEvent("PLAYER_LEAVING_WORLD");
    this:RegisterEvent("PLAYER_ENTERING_WORLD");
end

function TitanPanelRepairButton_ScanAllItems()
    if (TitanGetVar(TITAN_REPAIR_ID,"ShowInventory") == 1) then
        Tit_R_PleaseCheckBag[0]  = 1;
        Tit_R_PleaseCheckBag[1]  = 1;
        Tit_R_PleaseCheckBag[2]  = 1;
        Tit_R_PleaseCheckBag[3]  = 1;
        Tit_R_PleaseCheckBag[4]  = 1;
    end
    Tit_R_PleaseCheckBag[5]  = 1;

    Tit_R_WholeScanInProgress = true;
    TitanPanelButton_UpdateButton(TITAN_REPAIR_ID);

end

function TitanPanelRepairButton_OnEvent()

    -- NOTE that events test are done in probability order:
    -- The events that fires the most are tested first

    if (event == "UPDATE_INVENTORY_ALERTS") then

        -- register to check the equiped items on next appropriate OnUpdate call
        if (TitRep_show_debug) then -- this if is not necessary but is here to optimize this part the most possible
            tit_debug_bis("Event " .. event .. " TREATED!");
        end
        Tit_R_PleaseCheckBag[5] = 1;
        Tit_R_CheckForUpdate = true;
        return;

    end

    -- when arg1 is > 4 it means that a bank's bag has been updated
    if ( (event == "BAG_UPDATE") and (arg1 < 5) and (TitanGetVar(TITAN_REPAIR_ID,"ShowInventory") == 1)) then

        -- register to check this bag's items on next appropriate OnUpdate call
        if (TitRep_show_debug) then -- this if is not necessary but is here to optimize this part the most possible
            tit_debug_bis("Event " .. event .. " TREATED!");
        end

        Tit_R_PleaseCheckBag[arg1] = 1;
        Tit_R_CheckForUpdate = true;
        return;
    end

    


    if (event == "MERCHANT_SHOW") then
        if TitanGetVar(TITAN_REPAIR_ID,"ShowPopup") == 1 then
            local repairCost, canRepair = GetRepairAllCost();
            if (canRepair) then
                Tit_R_CouldRepair = true;
                if (TitanGetVar(TITAN_REPAIR_ID, "RepairInventory")) then
                    repairCost = repairCost + TitanRepair_GetRepairInvCost();
                end
                if (repairCost > 0) then
                    REPAIR_MONEY = repairCost;
                    StaticPopup_Show("REPAIR_CONFIRMATION");
                end
            end
        end
        return;
    end

    if ( event == "MERCHANT_CLOSED" ) then
        StaticPopup_Hide("REPAIR_CONFIRMATION");
        -- When an object is repaired in a bag, the BAG_UPDATE event is not sent... :'(
        -- so we rescan all
        if (Tit_R_CouldRepair) then
            TitanPanelRepairButton_ScanAllItems();
            Tit_R_CheckForUpdate = true;
            Tit_R_CouldRepair = false;
        end;
        return;
    end

   

    if (event == "PLAYER_ENTERING_WORLD") then
        this:RegisterEvent("BAG_UPDATE");
        this:RegisterEvent("UPDATE_INVENTORY_ALERTS");
        this:RegisterEvent("MERCHANT_SHOW");
        this:RegisterEvent("MERCHANT_CLOSED");

        -- Check everything on world enter (at init and after zoning)
        -- (NOTE: this will take 6 * Tit_R_UpdateCheckDelay seconds to update)
        TitanPanelRepairButton_ScanAllItems();
        Tit_R_CheckForUpdate = true;
        return;
    end

    if (event == "PLAYER_LEAVING_WORLD") then
        this:UnregisterEvent("BAG_UPDATE");
        this:UnregisterEvent("UPDATE_INVENTORY_ALERTS");
        this:UnregisterEvent("MERCHANT_SHOW");
        this:UnregisterEvent("MERCHANT_CLOSED");
        return;
    end

end

-- A little debug function
function tit_debug_bis( Message)
    if (TitRep_show_debug) then
        DEFAULT_CHAT_FRAME:AddMessage("TiT_Rep: " .. Message, 0.5, 0.3, 1);
    end
end


function TitanPanelRepairButton_OnUpdate (Elapsed)

    -- Note that Tit_R_CheckForUpdate is a boolean value, boolean values are easier to test for the cpu
    if (not Tit_R_CheckForUpdate) then
        return;
    end
    Tit_R_CheckForUpdate = false; -- this is the first thing we do so another event that fires while we are here can set it to true

    -- test if a "bag" needs to be scanned
    for tocheck = 0, 5 do
        
        -- if there is one
        if (Tit_R_PleaseCheckBag[tocheck] == 1) then
            Tit_R_CheckForUpdate = true; -- so Tit_R_CheckForUpdate will remain false only if there WAS nothing to do :-) (The WAS is important)
                                         -- and ONLY if no event fires while we were in this loop... We can't miss anything :-D

            -- increase the delay timer
            Tit_R_DelayTimer = Tit_R_DelayTimer + Elapsed;

            -- if enough time has elapsed
            if (Tit_R_DelayTimer > Tit_R_UpdateCheckDelay) then

                -- we are checking...
                Tit_R_PleaseCheckBag[tocheck] = 2;
                -- reset the timer, next update will be made once Tit_R_UpdateCheckDelay seconds have elapsed from now
                Tit_R_DelayTimer = 0;

                if (tocheck ~= 5) then  -- call update inventory function (I've put this test first because there is 5 chances on 6 that it returns true)
                    tit_debug_bis("Upadate: Checking bag " .. tocheck .. " as requested");
                    TitanRepair_GetInventoryInformation(tocheck);
                else                    -- call update equiped items function
                    tit_debug_bis("Upadate: Checking equiped items as requested");
                    TitanRepair_GetEquipedInformation();
                end

                -- test if another check was not asked during this update (avoid to miss something... rare but still)
                if (Tit_R_PleaseCheckBag[tocheck] ~= 1) then
                    -- Check completed
                    Tit_R_PleaseCheckBag[tocheck] = 0;
                end

                -- we break here since we don't have time to scan anything else.
                break;

            else
                break;
            end


        end
    end

-- These lines are commented because they're here just for debugging...
--    if (not Tit_R_CheckForUpdate) then
        -- if we get here it means there was nothing to update (we've gone through 0 to 5 without hitting a bag to check that would have set Tit_R_CheckForUpdatep to true)
--      tit_debug_bis("***No more \"Please\" to handle, easy mode on");
--    end

end;


function TitanRepair_GetStatusPercent(val, max)

    if (max > 0) then
        return (val / max);
    end

    return 1.0;

end;

function TitanRepair_GetMostDamagedItem ()
    -- Get repair status for Equiped items and inventory
    --      NOTE: TitanRepair_GetStatusPercent() will return 1.0 if max value <= 0
    local EquipedItemsStatus   = TitanRepair_GetStatusPercent( REPAIR_ITEM_STATUS[Tit_R_EquipedMinIndex].val, REPAIR_ITEM_STATUS[Tit_R_EquipedMinIndex].max );
    local InventoryItemsStatus = TitanRepair_GetStatusPercent( REPAIR_ITEM_STATUS[12].val,                    REPAIR_ITEM_STATUS[12].max );

    -- if everything is repaired
    if (EquipedItemsStatus == 1.0 and InventoryItemsStatus == 1.0) then
        tit_debug_bis("Everything is repaired");
        return 0;
    end

    -- If something is more or equaly damaged than the current most damaged equiped item
    --
    --   NOTE: The <= is important because InventoryItemsStatus is updated BEFORE EquipedItemsStatus
    --      The typicale case is when you move the most damaged equiped item to your iventory,
    --      when this function will be called by TitanRepair_GetInventoryInformation(), Tit_R_EquipedMinIndex will point to an empty slot: 
    --      since TitanRepair_GetEquipedInformation() won't have been called yet (bag update events are treated before equiped item event),
    --      EquipedItemsStatus will be egual to InventoryItemsStatus...
    --      So the <= is to avoid that Tit_R_EquipedMinIndex points to nothing (even if it has no concequence right now, it may save hours of debugging some day...)

    if ( (InventoryItemsStatus <= EquipedItemsStatus) and (TitanGetVar(TITAN_REPAIR_ID,"ShowInventory") == 1) ) then
        tit_debug_bis("Inventory is more damaged than equiped items");
        return 12;
    else -- if EquipedItemsStatus < InventoryItemsStatus
        tit_debug_bis("Equiped items are more damaged than inventory");
        return Tit_R_EquipedMinIndex;
    end

    -- Typical 6 possibilities:
    --   - InventoryItemsStatus == 1 and EquipedItemsStatus == 1  ==> returns 0
    --   - InventoryItemsStatus <  1 and EquipedItemsStatus == 1  ==> returns 12
    --   - InventoryItemsStatus == 1 and EquipedItemsStatus <  1  ==> ! (InventoryItemsStatus <= EquipedItemsStatus) ==> returns Tit_R_EquipedMinIndex
    --   - InventoryItemsStatus <  1 and EquipedItemsStatus <  1  :
    --          - InventoryItemsStatus  <=  EquipedItemsStatus    ==> returns 12
    --          - InventoryItemsStatus  >   EquipedItemsStatus    ==> ! (InventoryItemsStatus <= EquipedItemsStatus) ==> returns Tit_R_EquipedMinIndex

end;

function TitanRepair_GetInventoryInformation(bag)
    local min_status = 1.0;
    local min_val = 0;
    local min_max = 0;

    TitanRepairTooltip:SetOwner(WorldFrame, "ANCHOR_NONE");

    if (bag > 4) then -- should never get true though, bag > 4 are for the bank's bags
        return;
    end

    -- we re-scan the whole bag so we reset its status
    INVENTORY_REPAIR_STATUS[bag].cost = 0; -- reset this bag globl repair cost
    INVENTORY_REPAIR_STATUS[bag].val  = 0; -- 
    INVENTORY_REPAIR_STATUS[bag].max  = 0; -- 

    for slot = 1, GetContainerNumSlots(bag) do -- find the most damaged item of this bag

        local act_status, act_val, act_max, act_cost = TitanRepair_GetStatus(slot, bag); -- retrieve slot's item repair status

        if (act_status < min_status) then -- if this item is more damaged than the others
            min_status = act_status;
            min_val = act_val;
            min_max = act_max;

            -- set the global bag repair state to this item state
            INVENTORY_REPAIR_STATUS[bag].val = act_val;
            INVENTORY_REPAIR_STATUS[bag].max = act_max;
        end
        -- add this item cost to this bag global repair cost
        INVENTORY_REPAIR_STATUS[bag].cost = INVENTORY_REPAIR_STATUS[bag].cost + act_cost;
    end

    -- We check all the bags so we reset the global inventory status
    REPAIR_ITEM_STATUS[12].cost = 0;    -- reset global repair cost for inventory
    REPAIR_ITEM_STATUS[12].val  = 0;    -- 
    REPAIR_ITEM_STATUS[12].max  = 0;    -- 
    min_status = 1.0;                   -- reset min status to maximum

    -- let's find the bag that contains the most damaged item of the inventory
    for bag = 0, 4 do

        local act_val   = INVENTORY_REPAIR_STATUS[bag].val ;
        local act_max   = INVENTORY_REPAIR_STATUS[bag].max ;
        local act_cost  = INVENTORY_REPAIR_STATUS[bag].cost ;
        local act_status= TitanRepair_GetStatusPercent(act_val, act_max);

        -- if the bag contains a damaged item (else act_status == 1, and min_status <= 1 and so this if never get true)
        if (act_status < min_status) then
            min_status = act_status;
            min_val = act_val;
            min_max = act_max;

            REPAIR_ITEM_STATUS[12].val = act_val;
            REPAIR_ITEM_STATUS[12].max = act_max;
        end
        -- add each bag global repair cost to inventory global repair cost
        REPAIR_ITEM_STATUS[12].cost = REPAIR_ITEM_STATUS[12].cost + act_cost;
    end

    REPAIR_INDEX = TitanRepair_GetMostDamagedItem();

    tit_debug_bis("(inv) REPAIR_INDEX=" ..REPAIR_INDEX );

    -- Update the button text only if we are not waiting for TitanRepair_GetEquipedInformation()
    --      else an incorrect value may be displayed till TitanRepair_GetEquipedInformation() is called
    --      if a whole scan is in progress we update the button ("Updating..." is displayed in that case, so incorrect values are acceptable)
    if ( (Tit_R_PleaseCheckBag[5] == 0) or Tit_R_WholeScanInProgress ) then
        TitanPanelButton_UpdateButton(TITAN_REPAIR_ID);
    else
        tit_debug_bis("Waiting for updating button text");
    end
    TitanPanelButton_UpdateTooltip();
    TitanRepairTooltip:Hide();
end

function TitanRepair_GetEquipedInformation()
        local min_status = 1.0;
        local min_val = 0;
        local min_max = 0;
        local min_index = 0;
        Tit_R_EquipedMinIndex = 0;
        
        TitanRepairTooltip:SetOwner(WorldFrame, "ANCHOR_NONE");

        for index, value in INVENTORY_ALERT_STATUS_SLOTS do -- index begins from 1

                local act_status, act_val, act_max, act_cost = TitanRepair_GetStatus(index);
                if ( act_status < min_status ) then
                        min_status = act_status;
                        min_val = act_val;
                        min_max = act_max;
                        min_index = index;
                end

                REPAIR_ITEM_STATUS[index].val = act_val;
                REPAIR_ITEM_STATUS[index].max = act_max;
                REPAIR_ITEM_STATUS[index].cost = act_cost;
        end
        Tit_R_EquipedMinIndex = min_index;
        

        REPAIR_INDEX = TitanRepair_GetMostDamagedItem();

        -- if a whole update is in progress, and we are here, then we have finished this wole update :)
        -- it has to be here because it changes the text of the button.
        if (Tit_R_WholeScanInProgress) then
            Tit_R_WholeScanInProgress = false;
        end

        tit_debug_bis("(equip) REPAIR_INDEX=" ..REPAIR_INDEX  .. "  min_index=" .. min_index);

        TitanPanelButton_UpdateButton(TITAN_REPAIR_ID);
        TitanPanelButton_UpdateTooltip();
        TitanRepairTooltip:Hide();
end

function TitanRepair_GetStatus(index, bag)
    local val = 0;
    local max = 0;
    local cost = 0;
    local hasItem, repairCost

    if (bag) then
        local _, lRepairCost = TitanRepairTooltip:SetBagItem(bag, index);
        repairCost = lRepairCost;
        hasItem = 1;
    else
        local slotName = REPAIR_ITEM_STATUS[index].slot .. "Slot";

        local id = GetInventorySlotInfo(slotName);
        local lHasItem, _, lRepairCost = TitanRepairTooltip:SetInventoryItem("player", id);
        hasItem = lHasItem;
        repairCost = lRepairCost;
    end

    if (hasItem) then
        if (repairCost) then
            cost = repairCost;
        end

        for i = 1, 30 do
            local field = getglobal("TitanRepairTooltipTextLeft" .. i);
            if (field ~= nil) then
                local text = field:GetText();
                if (text) then
                    -- find durability
                    local _, _, f_val, f_max = string.find(text, REPAIR_LOCALE["pattern"]);
                    if (f_val) then
                        val = tonumber(f_val);
                        max = tonumber(f_max);
                    end
                end                     
            end

        end

    end

    return TitanRepair_GetStatusPercent(val, max), val, max, cost;

end

local Tit_R_LastKnownText = "";
local Tit_R_LastKnownItemFrac = 1.0;
function TitanRepair_GetStatusStr(index, short)
    -- skip if fully repaired
    if (index == 0) then
        return TitanRepair_AutoHighlight(1.0, "100%");
    end

    local valueText = "";

    -- if used for button text
    if (short) then
        valueText = Tit_R_LastKnownText;
    end

    local item_status = REPAIR_ITEM_STATUS[index];
    local item_frac = TitanRepair_GetStatusPercent(item_status.val, item_status.max);

    -- skip if empty slot
    if (item_status.max == 0) then
        if (short) then

            if (not Tit_R_WholeScanInProgress) then
                valueText =  TitanRepair_AutoHighlight(Tit_R_LastKnownItemFrac, valueText .. " (" .. REPAIR_LOCALE["WholeScanInProgress"] .. ")");
            else
                valueText =  TitanRepair_AutoHighlight(Tit_R_LastKnownItemFrac, valueText);
            end

            return valueText;
        else
            return nil;
        end
    end

    -- percent or value
    if (TitanGetVar(TITAN_REPAIR_ID,"ShowPercentage") or short) then
        valueText = string.format("%d%%", item_frac * 100);
    else
        valueText = string.format("%d / %d", item_status.val, item_status.max); 
    end

    
    -- color
    valueText = TitanRepair_AutoHighlight(item_frac, valueText);
    -- name

    if (not short or TitanGetVar(TITAN_REPAIR_ID, "ShowItemName")) then
        valueText = valueText .. " " .. item_status.name;
    end

    -- add repair cost
    local item_cost = TitanRepair_GetCostStr(item_status.cost);
    if (not short and item_cost) then
        valueText = valueText .. "\t" .. item_cost;
    end

    if (short) then
        Tit_R_LastKnownText = valueText;
        Tit_R_LastKnownItemFrac = item_frac;
    end
    return valueText;

end

function TitanRepair_AutoHighlight (item_frac, valueText)
    -- I've changed this so when the ratio is 1, the text is green (green means OK for FPS, Latency, etc...)
    -- beneath 0.91 (so it can be true for 0.90) the text is white
    -- and red if the ratio reach 0.20
    -- I didn't check for <= 0.90 or <= 0.20 because fractional eguality test is not acurate...
    if (TitanGetVar(TITAN_REPAIR_ID, "ShowColoredText")) then
        if (item_frac == 0.0) then
            valueText = TitanUtils_GetRedText(valueText);
        elseif (item_frac < 0.21) then
            valueText = TitanUtils_GetNormalText(valueText);
        elseif (item_frac < 0.91) then 
            valueText = TitanUtils_GetHighlightText(valueText);
        else
            valueText = TitanUtils_GetGreenText(valueText);
        end
    else
        valueText = TitanUtils_GetHighlightText(valueText);
    end

    return valueText;
end

function TitanRepair_GetCostStr(cost)
    if (cost > 0) then
        return TitanUtils_GetHighlightText(string.format("%.2fg" , cost / 10000));
    end

    return nil;
end

-- to move in the localisation files
REPAIR_LOCALE["WholeScanInProgress"] = "Updating...";

function TitanPanelRepairButton_GetButtonText(id)
    -- supports turning off labels
    if (not Tit_R_WholeScanInProgress) then
        return REPAIR_LOCALE["button"], TitanRepair_GetStatusStr(REPAIR_INDEX, 1);
    else
        return REPAIR_LOCALE["button"], TitanRepair_GetStatusStr(REPAIR_INDEX, 1) .. " (" .. REPAIR_LOCALE["WholeScanInProgress"] .. ")";
    end
end


function TitanPanelRepairButton_GetTooltipText()
    local out = "";
    local cost = 0;
    local sum = 0;

    for i = 1, table.getn(REPAIR_ITEM_STATUS) do
        local str = TitanRepair_GetStatusStr(i);

        cost = REPAIR_ITEM_STATUS[i].cost;
        sum = sum + cost;

        if ((str) and (TitanGetVar(TITAN_REPAIR_ID,"ShowUndamaged") or (cost > 0))) then
            out = out .. str .. "\n";
        end
    end

    if (sum > 0) then
        local costStr = TitanRepair_GetCostStr(sum);
        if (costStr) then
            out = out .. "\n" .. REPAIR_COST .. " " .. costStr;
        end
    else
        out = out .. "\n" .. REPAIR_LOCALE["nothing"];
    end

    return out;

end


function TitanPanelRightClickMenu_PrepareRepairMenu()
    TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_REPAIR_ID].menuText);

    local info = {};
    info.text = REPAIR_LOCALE["percentage"];
    info.func = TitanRepair_ShowPercentage;
    info.checked = TitanGetVar(TITAN_REPAIR_ID,"ShowPercentage");
    UIDropDownMenu_AddButton(info);

    local info = {};
    info.text = REPAIR_LOCALE["itemname"];
    info.func = TitanRepair_ShowItemName;
    info.checked = TitanGetVar(TITAN_REPAIR_ID,"ShowItemName");
    UIDropDownMenu_AddButton(info);

    local info = {};
    info.text = REPAIR_LOCALE["undamaged"];
    info.func = TitanRepair_ShowUndamaged;
    info.checked = TitanGetVar(TITAN_REPAIR_ID,"ShowUndamaged");
    UIDropDownMenu_AddButton(info);

    local info = {};
    info.text = REPAIR_LOCALE["popup"];
    info.func = TitanRepair_ShowPop;
    info.checked = TitanGetVar(TITAN_REPAIR_ID,"ShowPopup");
    UIDropDownMenu_AddButton(info);

    local info = {};
    info.text = REPAIR_LOCALE["repinventory"];
    info.func = TitanRepair_RepairInventory;
    info.checked = TitanGetVar(TITAN_REPAIR_ID,"RepairInventory");
    UIDropDownMenu_AddButton(info);

    local info = {};
    info.text = REPAIR_LOCALE["showinventory"];
    info.func = TitanRepair_ShowInventory;
    info.checked = TitanGetVar(TITAN_REPAIR_ID,"ShowInventory");
    UIDropDownMenu_AddButton(info);

    TitanPanelRightClickMenu_AddSpacer();       
    TitanPanelRightClickMenu_AddToggleIcon(TITAN_REPAIR_ID);
    TitanPanelRightClickMenu_AddToggleLabelText(TITAN_REPAIR_ID);
    TitanPanelRightClickMenu_AddToggleColoredText(TITAN_REPAIR_ID);

    TitanPanelRightClickMenu_AddSpacer();       
    TitanPanelRightClickMenu_AddCommand(TITAN_PANEL_MENU_HIDE, TITAN_REPAIR_ID, TITAN_PANEL_MENU_FUNC_HIDE);
end


function TitanRepair_ShowPercentage()
    TitanToggleVar(TITAN_REPAIR_ID, "ShowPercentage");
    TitanPanelButton_UpdateButton(TITAN_REPAIR_ID);
end


function TitanRepair_ShowItemName()
    TitanToggleVar(TITAN_REPAIR_ID, "ShowItemName");
    TitanPanelButton_UpdateButton(TITAN_REPAIR_ID);
end


function TitanRepair_ShowUndamaged()
    TitanToggleVar(TITAN_REPAIR_ID, "ShowUndamaged");
end

function TitanRepair_ShowPop()
    TitanToggleVar(TITAN_REPAIR_ID, "ShowPopup");
end

function TitanRepair_RepairInventory()
    TitanToggleVar(TITAN_REPAIR_ID, "RepairInventory");
end

function TitanRepair_ShowInventory()

    if (Tit_R_WholeScanInProgress) then
        return;
    end

    tit_debug_bis("TitanRepair_ShowInventory has been called !!");
    TitanToggleVar(TITAN_REPAIR_ID, "ShowInventory");

    if TitanGetVar(TITAN_REPAIR_ID,"ShowInventory") ~= 1 then
        REPAIR_ITEM_STATUS[12].cost = 0;
        REPAIR_ITEM_STATUS[12].val = 0;
        REPAIR_ITEM_STATUS[12].max = 0;

    end
    TitanPanelRepairButton_ScanAllItems();
    Tit_R_CheckForUpdate = true;
end

function TitanRepair_RepairItems()
    RepairAllItems();

    if (not TitanGetVar(TITAN_REPAIR_ID, "RepairInventory")) then
        return;
    end

    ShowRepairCursor();
    local bag, slot
    for bag = 0, 4 do   
        for slot = 1, GetContainerNumSlots(bag) do
            local _, repairCost = TitanRepairTooltip:SetBagItem(bag, slot);
            if (repairCost and (repairCost > 0)) then
                UseContainerItem(bag,slot);
                Tit_R_PleaseCheckBag[bag] = 1; -- this bag will be updated
                Tit_R_CheckForUpdate = true;
            end
        end
    end
    HideRepairCursor();
end


function TitanRepair_GetRepairInvCost()
    local result = 0;
    local bag;
    TitanRepairTooltip:SetOwner(WorldFrame, "ANCHOR_NONE");

    for bag = 0, 4 do   
        for slot = 1, GetContainerNumSlots(bag) do
            local _, repairCost = TitanRepairTooltip:SetBagItem(bag, slot);
            if (repairCost and (repairCost > 0)) then
                result = result + repairCost;
            end
        end
    end
    TitanRepairTooltip:Hide();

    return result;
end