vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--============================================================================================--
--============================================================================================--
--                                                                                                                                                                                      --
--                                                        INTERFACE FUNCTIONS                                                                                    --
--                                                                                                                                                                                      --
--============================================================================================--
--============================================================================================--

local function TEXT(key) return Localization.GetString("Wardrobe", key) end

WARDROBE_TEXTCOLORS = {
        {1.00, 0.00, 0.00},     -- red
        {1.00, 0.50, 0.50},     -- light red
        {1.00, 0.50, 0.00},     -- orange
        {1.00, 0.75, 0.50},     -- light orange
        {1.00, 0.75, 0.00},     -- gold
        {1.00, 0.87, 0.50},     -- light gold

        {1.00, 1.00, 0.00},     -- yellow
        {1.00, 1.00, 0.50},     -- light yellow
        {0.50, 1.00, 0.00},     -- yellow-green
        {0.75, 1.00, 0.50},     -- light yellow-green
        {0.00, 1.00, 0.00},     -- green
        {0.50, 1.00, 0.50},     -- light green

        {0.00, 1.00, 0.50},     -- blue-green
        {0.50, 1.00, 0.75},     -- light blue-green
        {0.00, 1.00, 1.00},     -- cyan
        {0.50, 1.00, 1.00},     -- light cyan
        {0.00, 0.00, 1.00},     -- blue
        {0.50, 0.50, 1.00},     -- light blue

        {0.50, 0.00, 1.00},     -- blue-purple
        {0.75, 0.50, 1.00},     -- light blue-purple
        {1.00, 0.00, 1.00},     -- purple
        {1.00, 0.50, 1.00},     -- light purple
        {1.00, 0.00, 0.50},     -- pink-red
        {1.00, 0.50, 0.75}       -- light pink-red
};

WARDROBE_DRABCOLORS = {
        {0.50, 0.00, 0.00},     -- red
        {0.50, 0.25, 0.25},     -- light red
        {0.50, 0.25, 0.00},     -- orange
        {0.50, 0.38, 0.25},     -- light orange
        {0.50, 0.38, 0.00},     -- gold
        {0.50, 0.43, 0.25},     -- light gold
        
        {0.50, 0.50, 0.00},     -- yellow
        {0.50, 0.50, 0.25},     -- light yellow
        {0.25, 0.50, 0.00},     -- yellow-green
        {0.38, 0.50, 0.25},     -- light yellow-green
        {0.00, 0.50, 0.00},     -- green
        {0.25, 0.50, 0.25},     -- light green
        
        {0.00, 0.50, 0.25},     -- blue-green
        {0.25, 0.50, 0.38},     -- light blue-green
        {0.00, 0.50, 0.50},     -- cyan
        {0.25, 0.50, 0.50},     -- light cyan
        {0.00, 0.00, 0.50},     -- blue
        {0.25, 0.25, 0.50},     -- light blue
        
        {0.25, 0.00, 0.50},     -- blue-purple
        {0.38, 0.25, 0.50},     -- light blue-purple
        {0.50, 0.00, 0.50},     -- purple
        {0.50, 0.25, 0.50},     -- light purple
        {0.50, 0.00, 0.25},     -- pink-red
        {0.50, 0.25, 0.38},     -- light pink-red
};

WARDROBE_UNAVAILIBLECOLOR = {0.70, 0.76, 0.65};

--===============================================================================
--
-- UI Menu and Button
--
--===============================================================================

---------------------------------------------------------------------------------
-- Start dragging the wardrobe button
---------------------------------------------------------------------------------
function Wardrobe.OnDragStart()
        if (not Wardrobe.DragLock) then
                Wardrobe.IconFrame:StartMoving()
                Wardrobe.BeingDragged = true;
        end
end


---------------------------------------------------------------------------------
-- Stop dragging the wardrobe button
---------------------------------------------------------------------------------
function Wardrobe.OnDragStop()
        if (Wardrobe.BeingDragged) then
                Wardrobe.IconFrame:StopMovingOrSizing()
                Wardrobe.BeingDragged = false;
                local x,y = this:GetCenter();
                local px,py = this:GetParent():GetCenter();
                local ox = x-px;
                local oy = y-py;
                Wardrobe_Config.xOffset = ox;
                Wardrobe_Config.yOffset = oy;
        end
end

---------------------------------------------------------------------------------
-- Set the DropDownMenu Scale
---------------------------------------------------------------------------------
function Wardrobe.SetDropDownScale(scale)
        scale = tonumber(scale);
        if (not scale) then
                scale = 1;
        end
        if (scale > 1 or scale < .5) then
                Wardrobe.ShowHelp();
                return;
        end
        Wardrobe_Config.DropDownScale = scale;
        DropDownList1:SetScale(scale);
        DropDownList2:SetScale(scale);
        DropDownList3:SetScale(scale);
end

---------------------------------------------------------------------------------
-- Toggle whether the wardrobe button can be moved or not
---------------------------------------------------------------------------------
function Wardrobe.ToggleLockButton(toggle)
        Wardrobe.DragLock = toggle;
        if (Wardrobe.DragLock) then
                Wardrobe.Print(TEXT("TXT_BUTTONLOCKED"));
        else
                Wardrobe.Print(TEXT("TXT_BUTTONUNLOCKED"));
        end
end

---------------------------------------------------------------------------------
-- Toggle whether the wardrobe menu requires a click of the button to show
---------------------------------------------------------------------------------
function Wardrobe.ToggleClickButton(toggle)
        Wardrobe_Config.MustClickUIButton = toggle;
        if (Wardrobe_Config.MustClickUIButton) then
                Wardrobe.Print(TEXT("TXT_BUTTONONCLICK"));
        else
                Wardrobe.Print(TEXT("TXT_BUTTONONMOUSEOVER"));
        end
end


---------------------------------------------------------------------------------
-- Register the wardrobe button 
---------------------------------------------------------------------------------
function Wardrobe.ButtonOnLoad()
        this:RegisterForDrag("LeftButton");
        if (MobileMinimapButtons_AddButton) then
                MobileMinimapButtons_AddButton("Wardrobe_IconFrame", TEXT("TXT_WARDROBEBUTTON"));
        end
end


---------------------------------------------------------------------------------
-- Update function for showing/hiding the wardrobe button 
---------------------------------------------------------------------------------
function Wardrobe.ButtonUpdateVisibility()
        if (TitanGetVar) then
                if (TitanGetVar(WARDROBE_TITAN_ID, "ShowMinimapIcon")) then
                Wardrobe_Config[WD_realmID][WD_charID].MinimapButtonVisible = 1;
                Wardrobe.IconFrame:Show();
        else
                Wardrobe_Config[WD_realmID][WD_charID].MinimapButtonVisible = 0;
                        Wardrobe.IconFrame:Hide();
                end
    elseif (not Wardrobe_Config[WD_realmID][WD_charID].MinimapButtonVisible) or (Wardrobe_Config[WD_realmID][WD_charID].MinimapButtonVisible == 1) then
        Wardrobe_Config[WD_realmID][WD_charID].MinimapButtonVisible = 1;
        Wardrobe.IconFrame:Show();
    else
        Wardrobe.IconFrame:Hide();
    end
end


---------------------------------------------------------------------------------
-- When the user clicks on the UI button (currently disabled)
---------------------------------------------------------------------------------
function Wardrobe.HandleUIMenuTriggerClick()
        if (Wardrobe_Config.MustClickUIButton) then
                Wardrobe.ShowUIMenu();
        end                     
end


---------------------------------------------------------------------------------
-- When the user mouses over the UI button
---------------------------------------------------------------------------------
function Wardrobe.HandleUIMenuTriggerEnter()
        if (not Wardrobe_Config.MustClickUIButton) then
                Wardrobe.ShowUIMenu();
        end
end


---------------------------------------------------------------------------------
-- When the user mouses off the UI button
---------------------------------------------------------------------------------
function Wardrobe.HandleUIMenuTriggerLeave()
        GameTooltip:Hide();
end


---------------------------------------------------------------------------------
-- Show the UI menu
---------------------------------------------------------------------------------
function Wardrobe.ShowUIMenu()
        ToggleDropDownMenu(1, nil, WardrobeDropDown, this:GetName(), 0, 0, "TOPRIGHT");
end

function Wardrobe.DropDown_OnLoad()
        -- Fake menu frame.... who says you need a frame, bah!
        WardrobeDropDown = {
                initialize = Wardrobe.LoadDropDownMenu;
                GetName = function() return "WardrobeDropDown" end;
                SetHeight = function() end;
        }
end

function Wardrobe.LoadDropDownMenu()
        
        local outfitList = Wardrobe.GetListOfOutfits();
        local dropdownList = {};
        
        --Title
        local info = {};
        info.text = UnitName("player").."'s "..TEXT("TEXT_MENU_TITLE");
        info.notClickable = 1;
        info.isTitle = 1;
        UIDropDownMenu_AddButton(info, 1);
        
        for i, text in outfitList do
                info = {};
                info.text = text;
                info.arg1 = i;
                info.notCheckable = true;
                info.justifyH = "CENTER";
                info.func = Wardrobe.WearOutfit;
                UIDropDownMenu_AddButton(info, 1);
        end
        
        info = {};
        info.text = TEXT("TEXT_MENU_OPEN");
        info.notCheckable = true;
        info.justifyH = "CENTER";
        info.func = Wardrobe.ShowMainMenu;
        UIDropDownMenu_AddButton(info, 1);
        
end


---------------------------------------------------------------------------------
-- Handle keybinding clicks
---------------------------------------------------------------------------------
function Wardrobe.Keybinding(outfitNum)
        if (outfitNum <= table.getn(Wardrobe_Config[WD_realmID][WD_charID].Outfit)) then
                Wardrobe.WearOutfit(Wardrobe_Config[WD_realmID][WD_charID].Outfit[outfitNum].OutfitName);
        end
end


--===============================================================================
--
-- Confirmation windows
--
--===============================================================================

---------------------------------------------------------------------------------
-- Confirm a popup menu
---------------------------------------------------------------------------------
function Wardrobe.PopupConfirm_OnClick()

        Wardrobe.NamePopup:Hide();
        Wardrobe.PopupConfirm:Hide();

        if (Wardrobe.PopupFunction == "[Add]") then
                Wardrobe.NewWardrobeName = Wardrobe.NamePopupEditBox:GetText();
                Wardrobe.ShowWardrobe_ConfigurationScreen();
        elseif (Wardrobe.PopupFunction == "[Delete]" or Wardrobe.PopupFunction == "DeleteFromSort") then
                Wardrobe.EraseOutfit(Wardrobe.NamePopupEditBox:GetText());
                if (Wardrobe.PopupFunction == "DeleteFromSort") then
                        Wardrobe.PopulateMainMenu();
                        Wardrobe.ToggleMainMenuFrameVisibility(true);
                end
                Wardrobe.PopupFunction = "";
        elseif (Wardrobe.PopupFunction == "[Edit]") then
                Wardrobe.NewWardrobeName = Wardrobe.NamePopupEditBox:GetText();
                Wardrobe.RenameOutfit(Wardrobe.Rename_OldName, Wardrobe.NewWardrobeName);
                Wardrobe.StoreVirtualOutfit(WARDROBE_TEMP_OUTFIT_NAME, Wardrobe.NewWardrobeName);
                Wardrobe.WearOutfit(Wardrobe.NewWardrobeName, true);
                Wardrobe.PopupFunction = "[Update]";
                Wardrobe.ShowWardrobe_ConfigurationScreen();
        elseif (Wardrobe.PopupFunction == "[Update]") then
                Wardrobe.NewWardrobeName = Wardrobe.NamePopupEditBox:GetText();
                Wardrobe.ShowWardrobe_ConfigurationScreen();
        elseif (Wardrobe.PopupFunction == "[Mounted]") then
                if (not Wardrobe.FoundOutfitName(Wardrobe.NamePopupEditBox:GetText()) or Wardrobe.NamePopupEditBox:GetText() == "") then
                        Wardrobe.Print(TEXT("TXT_MOUNTEDNOTEXIST"));
                        UIErrorsFrame:AddMessage(TEXT("TXT_NOTEXISTERROR"), 0.0, 1.0, 0.0, 1.0, UIERRORS_HOLD_TIME);
                        Wardrobe.PopupFunction = "";
                else
                        Wardrobe.SetMountedOutfit(Wardrobe.NamePopupEditBox:GetText());
                        Wardrobe.PopupFunction = "";
                end
        end
                
end


---------------------------------------------------------------------------------
-- Cancel a popup menu
---------------------------------------------------------------------------------
function Wardrobe.PopupCancel_OnClick()
        Wardrobe.NamePopup:Hide();
        Wardrobe.PopupConfirm:Hide();
        if (Wardrobe.PopupFunction == "DeleteFromSort") then
                Wardrobe.ToggleMainMenuFrameVisibility(true);
        end
end



--===============================================================================
--
-- Paperdoll configuration windows
--
--===============================================================================

---------------------------------------------------------------------------------
-- Show the screen that lets the user confirm his/her wardrobe selection (check off items, etc)
---------------------------------------------------------------------------------
function Wardrobe.ShowWardrobe_ConfigurationScreen()

        Wardrobe.CheckboxToggleState = Wardrobe_Config.DefaultCheckboxState;
        Wardrobe.CurrentOutfitButtonColor = WARDROBE_DEFAULT_BUTTON_COLOR;
        
        for i, slotName in Wardrobe.InventorySlots do
                getglobal("Character"..slotName.."WardrobeCheckBox"):SetCheckedTexture("Interface\\AddOns\\Wardrobe\\Images\\Check");
                --getglobal("Character"..Wardrobe.InventorySlots[i].."WardrobeCheckBox"):SetDisabledCheckedTexture("Interface\\AddOns\\Wardrobe\\Images\\X");
        end

        if (Wardrobe.PopupFunction == "[Add]") then
                if (Wardrobe_Config.DefaultCheckboxState == 1 or Wardrobe_Config.DefaultCheckboxState == 0) then
                        for i, slotName in Wardrobe.InventorySlots do
                                getglobal("Character"..slotName.."WardrobeCheckBox"):SetChecked(Wardrobe_Config.DefaultCheckboxState);
                        end
                else
                        Wardrobe.Print(TEXT("TXT_WARDROBENAME")..tostring(Wardrobe_Config.DefaultCheckboxState));
                end
                
        elseif (Wardrobe.PopupFunction == "[Update]") then
        
                -- for each outfit
                for i, outfit in Wardrobe_Config[WD_realmID][WD_charID].Outfit do
                        
                        -- if it's the wardrobe we're updating
                        if (outfit.OutfitName == Wardrobe.NewWardrobeName) then

                                Wardrobe.CurrentOutfitButtonColor = outfit.ButtonColor;
                                
                                -- for each item in the outfit, set the checkbox
                                for j=1, Wardrobe.InventorySlotsSize do
                                        local IsSlotUsed;
                                        if (not outfit.Item[j]) or (outfit.Item[j].IsSlotUsed ~= 1) then
                                                IsSlotUsed = 0;
                                        else
                                                IsSlotUsed = 1;
                                        end
                                        local checkBoxName = "Character"..Wardrobe.InventorySlots[j].."WardrobeCheckBox";
                                        getglobal(checkBoxName):SetChecked(IsSlotUsed);
                                end
                                break;
                        end
                end
        end
        
        -- show the character paperdoll frame
        Wardrobe.ToggleCharacterPanel();
        
end


---------------------------------------------------------------------------------
-- Toggle the visibility of the character panel
---------------------------------------------------------------------------------
function Wardrobe.ToggleCharacterPanel(dontToggleChar)
        if (not Wardrobe.InToggleCharacterPanel) then
                Wardrobe.InToggleCharacterPanel = true;
                if (Wardrobe.ShowingCharacterPanel == false) then
                        if (not dontToggleChar and (not PaperDollFrame:IsVisible())) then
                                ToggleCharacter("PaperDollFrame");
                        end
                        Wardrobe.CheckboxesFrame:Show();
                        Wardrobe.Orig_HideUIPanel = HideUIPanel;
                        HideUIPanel = Wardrobe.HideUIPanel;
                        Wardrobe.RefreshCharacterPanel();
                        Wardrobe.ColorCycle_CharacterFrame(true);
                        Wardrobe.ShowingCharacterPanel = true;
                else
                        Wardrobe.CheckboxesFrame:Hide();
                        CharacterNameText:SetText(UnitPVPName("player"));
                        Wardrobe.ColorCycle_CharacterFrame(false);
                        CharacterNameText:SetTextColor(1,1,1);
                        Wardrobe.ShowingCharacterPanel = false;
                        if (not dontToggleChar) then
                                ToggleCharacter("PaperDollFrame");
                        end
                end

                Wardrobe.InToggleCharacterPanel = false;
        end
end


---------------------------------------------------------------------------------
-- Refresh the character panel
---------------------------------------------------------------------------------
function Wardrobe.RefreshCharacterPanel()
        CharacterNameText:SetText(Wardrobe.NewWardrobeName);
        CharacterNameText:SetTextColor(WARDROBE_TEXTCOLORS[Wardrobe.CurrentOutfitButtonColor][1],WARDROBE_TEXTCOLORS[Wardrobe.CurrentOutfitButtonColor][2],WARDROBE_TEXTCOLORS[Wardrobe.CurrentOutfitButtonColor][3]);
end


---------------------------------------------------------------------------------
-- Turn on or off color cycling on the character panel
---------------------------------------------------------------------------------
function Wardrobe.ColorCycle_CharacterFrame(toggle)
        if (ColorCycle_AddTableEntry) then
                if (toggle) then
                        for i = 1, table.getn(Wardrobe.InventorySlots) do
                                ColorCycle_PulseWhite(
                                        {
                                                ID = "Character"..Wardrobe.InventorySlots[i].."WardrobeCheckBoxGlow";
                                                globalName = "Character"..Wardrobe.InventorySlots[i].."WardrobeCheckBoxGlow";
                                                cycleType  = "Texture";
                                                color     = {0.0, 0.0, 0.0};
                                                speed     = 0.05;
                                                pause     = 0.25;
                                        }
                                );      
                        end                      
                else
                        for i = 1, table.getn(Wardrobe.InventorySlots) do
                                ColorCycle_PulseWhite(
                                        {
                                                ID        = "Character"..Wardrobe.InventorySlots[i].."WardrobeCheckBoxGlow";
                                                remove  = true;
                                        }
                                );      
                        end
                end
        end
end

---------------------------------------------------------------------------------
-- Hook the HideUIPanel function so that we can trap when the user closes the character panel
---------------------------------------------------------------------------------
function Wardrobe.HideUIPanel(theFrame)

        Wardrobe.Orig_HideUIPanel(theFrame);
        
        if (theFrame == getglobal("CharacterFrame")) then
                Wardrobe.CheckboxesFrame:Hide();                
                Wardrobe.ToggleCharacterPanel(true);
                HideUIPanel = Wardrobe.Orig_HideUIPanel;
                if (not Wardrobe.PressedAcceptButton) then
                        UIErrorsFrame:AddMessage(TEXT("TXT_CHANGECANCELED"), 1.0, 0.0, 0.0, 1.0, UIERRORS_HOLD_TIME); 
                end
                
                -- check to see if we should re-equip our previous outfit
                Wardrobe.CheckForEquipVirtualOutfit(WARDROBE_TEMP_OUTFIT_NAME);
        end
        
        Wardrobe.PressedAcceptButton = false;
end


---------------------------------------------------------------------------------
-- Handle when the user clicks the button to toggle all the checkboxes
---------------------------------------------------------------------------------
function Wardrobe.ToggleCheckboxes()
        if (Wardrobe.CheckboxToggleState == 1) then
                Wardrobe.CheckboxToggleState = 0;
        else
                Wardrobe.CheckboxToggleState = 1;
        end
        for i, slotName in Wardrobe.InventorySlots do
                getglobal("Character"..slotName.."WardrobeCheckBox"):SetChecked(Wardrobe.CheckboxToggleState);
        end     
end


---------------------------------------------------------------------------------
-- When the user accepts the wardrobe confirmation screen
---------------------------------------------------------------------------------
function Wardrobe.ConfirmWardrobeConfigurationScreen()

        -- remember which items were checked and unchecked for this outfit
        Wardrobe.ItemCheckState = { };
        for i, slotName in Wardrobe.InventorySlots do
                if (getglobal("Character"..slotName.."WardrobeCheckBox"):GetChecked()) then
                        Wardrobe.ItemCheckState[i] = 1;
                end
        end
        
        if (CharacterMainHandSlotWardrobeCheckBox:GetChecked() == 1) and (CharacterSecondaryHandSlotWardrobeCheckBox:GetChecked() == 1) then
                --Check for 2h in Main slot and dissable offhand
        end
        
        if (Wardrobe.PopupFunction == "[Add]") then
                Wardrobe.AddNewOutfit(Wardrobe.NewWardrobeName, Wardrobe.CurrentOutfitButtonColor);
                Wardrobe.PopupFunction = "";
        elseif (Wardrobe.PopupFunction == "[Update]") then
                Wardrobe.UpdateOutfit(Wardrobe.NewWardrobeName, Wardrobe.CurrentOutfitButtonColor);
                Wardrobe.PopupFunction = "";
                
                -- check to see if we should re-equip our previous outfit
                Wardrobe.CheckForEquipVirtualOutfit(WARDROBE_TEMP_OUTFIT_NAME);
        end
        
        Wardrobe.PressedAcceptButton = true;
        Wardrobe.ToggleCharacterPanel();
end


---------------------------------------------------------------------------------
-- When the user rejects the wardrobe confirmation screen
---------------------------------------------------------------------------------
function Wardrobe.CancelWardrobe_ConfigurationScreen()
        -- check to see if we should re-equip our previous outfit
        Wardrobe.CheckForEquipVirtualOutfit(WARDROBE_TEMP_OUTFIT_NAME);
end


--===============================================================================
--
-- Main menu
--
--===============================================================================

---------------------------------------------------------------------------------
-- Show the main menu
---------------------------------------------------------------------------------
function Wardrobe.ShowMainMenu()

        Wardrobe.CheckForOurWardrobeID();
        
        -- clear any selected outfits
        for i, outfit in Wardrobe_Config[WD_realmID][WD_charID].Outfit do
                outfit.Selected = false;
        end
        
        Wardrobe.ToggleMainMenuFrameVisibility(true);
        Wardrobe.PopulateMainMenu();
end


---------------------------------------------------------------------------------
-- Toggle the main menu visibility and color cycling
---------------------------------------------------------------------------------
function Wardrobe.ToggleMainMenuFrameVisibility(toggle)
        if (toggle) then
                Wardrobe.MainMenuFrame:Show();
        else
                Wardrobe.MainMenuFrame:Hide();
        end
        
        -- toggle color cycling
        Wardrobe.ColorCycle_MainMenuFrame(toggle);
end


---------------------------------------------------------------------------------
-- Start or stop color cycling on the modification frame
---------------------------------------------------------------------------------
function Wardrobe.ColorCycle_MainMenuFrame(toggle)
        if (ColorCycle_AddTableEntry) then
                if (toggle) then
                        ColorCycle_AddTableEntry(
                                {
                                        ID                = "Wardrobe_MainMenuFrameTitle";
                                        cycleType   = "FontText";
                                        globalName  = "Wardrobe_MainMenuFrameTitle";
                                        cycleSpeed  = 0.01;
                                        okToWait        = {true, true, true};
                                }
                        );
                else
                
                        -- turn off color cycling on the selected outfit
                        for i = 1, WARDROBE_MAX_SCROLL_ENTRIES do
                                local fs = Wardrobe["MainMenuFrameEntry"..i.."Outfit"];
                                if (frameName ~= "Wardrobe_MainMenuFrameEntry"..i) then
                                        if (Wardrobe_Config[WD_realmID][WD_charID].Outfit[fs.OutfitNum]) then
                                                Wardrobe.SetSelectionColor(false, "Wardrobe_MainMenuFrameEntry"..i.."Outfit", fs)
                                        end
                                end
                        end
                        ColorCycle_RemoveEntry("Wardrobe_MainMenuFrameTitle");
                end
        end
end


---------------------------------------------------------------------------------
-- Populate the main menu
---------------------------------------------------------------------------------
function Wardrobe.PopulateMainMenu(maintainSelected)
        Wardrobe.Debug("PopulateMainMenu");

        Wardrobe.CheckForOurWardrobeID();
                
        Wardrobe.SortOutfits();
        
        -- clear any selected item
        for rowCount = 1, WARDROBE_MAX_SCROLL_ENTRIES do
                Wardrobe.SetSelectionColor(false, "Wardrobe_MainMenuFrameEntry"..rowCount.."Outfit", Wardrobe["MainMenuFrameEntry"..rowCount.."Outfit"]);
        end
        
        local fs, totalExistingEntries, totalEntriesShown;
        local rowCount = 1;
        local entryCount = 1;
        local offset = FauxScrollFrame_GetOffset(Wardrobe.SortScrollFrame);
        Wardrobe.Debug("offset = "..offset);
        
        for i = 1, 21 do
                Wardrobe["MainMenuFrameEntry"..i.."Icon"]:Hide();
        end
        
        while rowCount <= WARDROBE_MAX_SCROLL_ENTRIES do

                Wardrobe.Debug("rowCount = "..rowCount);
                Wardrobe.Debug("entryCount = "..entryCount);
                fs = Wardrobe["MainMenuFrameEntry"..rowCount.."Outfit"];
                local outfit = Wardrobe_Config[WD_realmID][WD_charID].Outfit[entryCount + offset];
                if (not outfit) then
                        fs:SetText("");
                        fs.r = 0;
                        fs.g = 0;
                        fs.b = 0;
                        Wardrobe["MainMenuFrameEntry"..rowCount.."Icon"]:Hide();
                        rowCount = rowCount + 1;
                        
                -- if this isn't a virtual outfit
                elseif (not outfit.Virtual) then
                        Wardrobe.Debug("Wasn't Virtual.  Setting text to: "..outfit.OutfitName);
                        fs:SetText(outfit.OutfitName);
                        local buttonColor = outfit.ButtonColor;
                        fs.r = WARDROBE_TEXTCOLORS[buttonColor][1];
                        fs.g = WARDROBE_TEXTCOLORS[buttonColor][2];
                        fs.b = WARDROBE_TEXTCOLORS[buttonColor][3];
                        if (not maintainSelected) then
                                --Wardrobe_Config[WD_realmID][WD_charID].Outfit[entryCount + offset].Selected = false;
                        end;
                        
                        -- if this outfit is selected, highlight it
                        if (outfit.Selected) then
                                Wardrobe.SetSelectionColor(true, "Wardrobe_MainMenuFrameEntry"..rowCount.."Outfit", fs);
                        else
                                fs:SetTextColor(fs.r, fs.g, fs.b);
                        end
                        
                        -- check to see if we should show the mounted icon
                        if (outfit.Special == "mounted") then
                                -- set the texture
                                Wardrobe["MainMenuFrameEntry"..rowCount.."Icon"]:SetNormalTexture("Interface\\AddOns\\Wardrobe\\Images\\Paw");
                                Wardrobe["MainMenuFrameEntry"..rowCount.."Icon"]:Show();

                        -- check to see if we should show the plaguelands icon
                        elseif (outfit.Special == "plague") then
                                -- set the texture
                                Wardrobe["MainMenuFrameEntry"..rowCount.."Icon"]:SetNormalTexture("Interface\\AddOns\\Wardrobe\\Images\\Sword");
                                Wardrobe["MainMenuFrameEntry"..rowCount.."Icon"]:Show();

                        -- check to see if we should show the while-eating icon
                        elseif (outfit.Special == "chowing") then
                                -- set the texture
                                Wardrobe["MainMenuFrameEntry"..rowCount.."Icon"]:SetNormalTexture("Interface\\AddOns\\Wardrobe\\Images\\Food");
                                Wardrobe["MainMenuFrameEntry"..rowCount.."Icon"]:Show();

                        else
                                Wardrobe["MainMenuFrameEntry"..rowCount.."Icon"]:Hide();
                        end
                        rowCount = rowCount + 1; 
                else
                        Wardrobe.Debug("Was Virtual");
                        Wardrobe["MainMenuFrameEntry"..rowCount.."Icon"]:Hide();
                end
                fs.OutfitNum = entryCount + offset;
                entryCount = entryCount + 1;
        end

        FauxScrollFrame_Update(Wardrobe.SortScrollFrame, table.getn(Wardrobe_Config[WD_realmID][WD_charID].Outfit), WARDROBE_MAX_SCROLL_ENTRIES, WARDROBE_MAX_SCROLL_ENTRIES);

        return entryCount, rowCount;    
end


---------------------------------------------------------------------------------
-- when mousing over an entry in the outfit menu, highlight it
---------------------------------------------------------------------------------
function Wardrobe.MainMenuFrameEntry_OnEnter()
        local frameName, number = string.gsub(this:GetName(), "^Wardrobe_", "");
        Wardrobe[frameName.."Outfit"]:SetTextColor(1.0, 1.0, 1.0);
end


---------------------------------------------------------------------------------
-- when the mouse leaves an entry in the outfit menu, return it to its normal color (unless it's selected)
---------------------------------------------------------------------------------
function Wardrobe.MainMenuFrameEntry_OnLeave()
        local frameName, number = string.gsub(this:GetName(), "^Wardrobe_", "");
        local fs = Wardrobe[frameName.."Outfit"];
        if (fs.OutfitNum) and (Wardrobe_Config[WD_realmID][WD_charID].Outfit[fs.OutfitNum]) and (not Wardrobe_Config[WD_realmID][WD_charID].Outfit[fs.OutfitNum].Selected) then
                fs:SetTextColor(fs.r, fs.g, fs.b);
        end     
end


---------------------------------------------------------------------------------
-- when clicking on an entry in the outfit menu
---------------------------------------------------------------------------------
function Wardrobe.MainMenuFrameEntry_OnClick()
        
        --local frameName = this:GetName();
        local frameName, number = string.gsub(this:GetName(), "^Wardrobe_", "");

        -- unselect all items
        Wardrobe.UnselectAllMainMenuItems();
        
        -- select this item
        local fs = Wardrobe[frameName.."Outfit"];
        if (fs) and (fs.OutfitNum) then
                local outfit = Wardrobe_Config[WD_realmID][WD_charID].Outfit[fs.OutfitNum];
                if (outfit) then
                        if (not outfit.Selected) then
                                outfit.Selected = true;
                                Wardrobe.SetSelectionColor(true, "Wardrobe_"..frameName.."Outfit", fs);
                        else
                                outfit.Selected = false;
                        end
                end     
        end     
end


---------------------------------------------------------------------------------
-- unselect all the outfits in the main menu
---------------------------------------------------------------------------------
function Wardrobe.UnselectAllMainMenuItems()

        -- unselect all the other buttons
        for i = 1, WARDROBE_MAX_SCROLL_ENTRIES do
                Wardrobe.SetSelectionColor(false, "Wardrobe_MainMenuFrameEntry"..i.."Outfit", Wardrobe["MainMenuFrameEntry"..i.."Outfit"]);
        end
        
        for i, outfit in Wardrobe_Config[WD_realmID][WD_charID].Outfit do
                outfit.Selected = false;
        end
end


---------------------------------------------------------------------------------
-- set or unset the color of the selected outfit text in the main menu
---------------------------------------------------------------------------------
function Wardrobe.SetSelectionColor(toggle, theGlobal, fs)
        if (toggle) then
                if (ColorCycle_AddTableEntry) then
                        ColorCycle_FlashWhite(
                                {
                                        ID = theGlobal;
                                        cycleType = "FontText";
                                        globalName = theGlobal;
                                        color = {fs.r, fs.g, fs.b};
                                }
                        );
                else
                        fs:SetTextColor(1, 1, 1);
                end
        else
                if (ColorCycle_AddTableEntry) then
                        ColorCycle_FlashWhite(
                                {
                                        ID = theGlobal;
                                        remove = true;
                                }
                        );
                end                             
                fs:SetTextColor(fs.r, fs.g, fs.b);
        end
end


--===============================================================================
--
-- Main menu buttons
--
--===============================================================================

---------------------------------------------------------------------------------
-- when clicking on the new outfit button
---------------------------------------------------------------------------------
function Wardrobe.NewOutfitButtonClick()
        Wardrobe.NamePopupText:SetText(TEXT("TXT_NEWOUTFITNAME"));
        Wardrobe.PopupFunction = "[Add]";
        Wardrobe.UnselectAllMainMenuItems();    
        Wardrobe.ToggleMainMenuFrameVisibility(false);  
        Wardrobe.NamePopup:Show();
end


---------------------------------------------------------------------------------
-- when clicking on the close button
---------------------------------------------------------------------------------
function Wardrobe.MainMenuCloseButton()
        Wardrobe.ColorCycle_MainMenuFrame(false);
        this:GetParent():Hide();
end


---------------------------------------------------------------------------------
-- when clicking on the edit outfit button
---------------------------------------------------------------------------------
function Wardrobe.EditOutfitButtonClick()
        local selectedOutfit = Wardrobe.FindSelectedOutfit();   
        
        if (selectedOutfit) then
                Wardrobe.NewWardrobeName = Wardrobe_Config[WD_realmID][WD_charID].Outfit[selectedOutfit].OutfitName;
                Wardrobe.Rename_OldName = Wardrobe.NewWardrobeName;
                Wardrobe.NamePopupText:SetText("New Name");
                Wardrobe.NamePopupEditBox:SetText(Wardrobe.NewWardrobeName);
                Wardrobe.PopupFunction = "[Edit]";
                Wardrobe.ToggleMainMenuFrameVisibility(false);  
                Wardrobe.NamePopup:Show();
        end
end


---------------------------------------------------------------------------------
-- when clicking on the update outfit button
---------------------------------------------------------------------------------
function Wardrobe.UpdateOutfitButtonClick()
        local selectedOutfit = Wardrobe.FindSelectedOutfit();   
        
        if (selectedOutfit) then
                Wardrobe.NewWardrobeName = Wardrobe_Config[WD_realmID][WD_charID].Outfit[selectedOutfit].OutfitName;
                Wardrobe.PopupFunction = "[Update]";
                Wardrobe.ShowWardrobe_ConfigurationScreen();
        end
end



---------------------------------------------------------------------------------
-- When clicking the special buttons
---------------------------------------------------------------------------------
local WARDROBE_TXT_NOLONGERWORN = {
        mounted = function() return TEXT("TXT_NOLONGERWORNMOUNTERR") end;
        plague = function() return TEXT("TXT_NOLONGERWORNPLAGUEERR") end;
        chowing = function() return TEXT("TXT_NOLONGERWORNEATERR") end;
        swimming = function() return TEXT("TXT_NOLONGERWORNSWIMR") end;
};

local WARDROBE_TXT_WORNWHEN = {
        mounted = function() return TEXT("TXT_WORNWHENMOUNTERR") end;
        plague = function() return TEXT("TXT_WORNPLAGUEERR") end;
        chowing = function() return TEXT("TXT_WORNEATERR") end;
        swimming = function() return TEXT("TXT_WORNSWIMR") end;
};

function Wardrobe.SpecialButtonClick(specialType)
        local outfitNum = Wardrobe.FindSelectedOutfit();
        local alreadyUsingThisOutfitForSpecial = false;
        
        if (outfitNum) then
                local outfit = Wardrobe_Config[WD_realmID][WD_charID].Outfit[outfitNum];
                if (outfit.Special == specialType) then
                        UIErrorsFrame:AddMessage(outfit.OutfitName.." "..WARDROBE_TXT_NOLONGERWORN[specialType](), 0.0, 1.0, 0.0, 1.0, UIERRORS_HOLD_TIME);
                        alreadyUsingThisOutfitForSpecial = true;
                end
                
                -- Clear other special outfits of this type
                for i, outfitI in Wardrobe_Config[WD_realmID][WD_charID].Outfit do
                        if (outfitI.Special == specialType) then
                                outfitI.Special = nil;
                        end
                end
                
                if (not alreadyUsingThisOutfitForSpecial) then
                        outfit.Special = specialType;
                        UIErrorsFrame:AddMessage(outfit.OutfitName.." "..WARDROBE_TXT_WORNWHEN[specialType](), 0.0, 1.0, 0.0, 1.0, UIERRORS_HOLD_TIME);
                end

                Wardrobe.PopulateMainMenu(true);
        end     
end

function Wardrobe.MountButtonClick()
        Wardrobe.SpecialButtonClick("mounted");
end

function Wardrobe.PlaguelandsButtonClick()
        Wardrobe.SpecialButtonClick("plague");
end

function Wardrobe.ChowingButtonClick()
        Wardrobe.SpecialButtonClick("chowing");
end


---------------------------------------------------------------------------------
-- When clicking the move up or move down buttons
---------------------------------------------------------------------------------
function Wardrobe.MoveOutfit_OnClick(direction)
        local outfitNum = Wardrobe.FindSelectedOutfit();
        
        if (outfitNum) then
                local swapNum = Wardrobe.OrderOutfit(outfitNum, direction);
                Wardrobe.SortOutfits();
                Wardrobe.PopulateMainMenu(true);
        end
end


---------------------------------------------------------------------------------
-- When clicking the delete outfit button
---------------------------------------------------------------------------------
function Wardrobe.DeleteOutfit_OnClick()
        selectedOutfit = nil;
        for i, outfit in Wardrobe_Config[WD_realmID][WD_charID].Outfit do
                if (outfit.Selected) then
                        selectedOutfit = i;
                        break;
                end
        end
        
        if (selectedOutfit) then
                Wardrobe.PopupFunction = "DeleteFromSort";
                Wardrobe.NamePopupEditBox:SetText(Wardrobe_Config[WD_realmID][WD_charID].Outfit[selectedOutfit].OutfitName);
                Wardrobe.PopupConfirm:Show();
                Wardrobe.ToggleMainMenuFrameVisibility(false);
                Wardrobe.PopupConfirmText:SetText(TEXT("TXT_REALLYDELETEOUTFIT").."\n\n"..Wardrobe_Config[WD_realmID][WD_charID].Outfit[selectedOutfit].OutfitName);
        else
                UIErrorsFrame:AddMessage(TEXT("TXT_PLEASESELECTDELETE"), 1.0, 0.0, 0.0, 1.0, UIERRORS_HOLD_TIME);
        end
end


--===============================================================================
--
-- Color picker
--
--===============================================================================

---------------------------------------------------------------------------------
-- when clicking on a color in the color picker
---------------------------------------------------------------------------------
function Wardrobe.ColorPickFrameColor_OnClick()
        local selectedOutfit = Wardrobe.FindSelectedOutfit();
        local buttonName = this:GetName();
        local x, y = string.find(buttonName, "%d+");
        Wardrobe.ColorPickFrame.buttonNum = tonumber(string.sub(buttonName, x, y));
        Wardrobe.ColorPickFrameExampleText:SetTextColor(WARDROBE_TEXTCOLORS[Wardrobe.ColorPickFrame.buttonNum][1], 
                                                                                                   WARDROBE_TEXTCOLORS[Wardrobe.ColorPickFrame.buttonNum][2], 
                                                                                                   WARDROBE_TEXTCOLORS[Wardrobe.ColorPickFrame.buttonNum][3]);  

        if (Wardrobe.EnteredColorPickerFromPaperdollFrame) then
                Wardrobe.CurrentOutfitButtonColor = Wardrobe.ColorPickFrame.buttonNum;
        end     
end


---------------------------------------------------------------------------------
-- Show the color selection menu
---------------------------------------------------------------------------------
function Wardrobe.ShowColorPickFrame()

        -- figure out where we were called from
        if (Wardrobe.MainMenuFrame:IsVisible()) then
                Wardrobe.EnteredColorPickerFromPaperdollFrame = false;
        else
                Wardrobe.EnteredColorPickerFromPaperdollFrame = true;
        end
        
        local selectedOutfit = Wardrobe.FindSelectedOutfit();

        if (selectedOutfit or Wardrobe.EnteredColorPickerFromPaperdollFrame) then

                Wardrobe.ColorPickFrame:SetAlpha(1.0);
                Wardrobe.ColorPickFrame:Show();
                Wardrobe.ColorPickFrameGrid:SetFrameLevel(Wardrobe.ColorPickFrameGrid:GetFrameLevel() + 1);
                for i = 1, 24 do
                        Wardrobe["ColorPickFrameBox"..tostring(i).."Texture"]:SetVertexColor(WARDROBE_TEXTCOLORS[i][1],WARDROBE_TEXTCOLORS[i][2],WARDROBE_TEXTCOLORS[i][3],1.0);
                        Wardrobe["ColorPickFrameBox"..tostring(i)]:SetFrameLevel(Wardrobe.ColorPickFrameGrid:GetFrameLevel() - 1);
                end

                if (Wardrobe.EnteredColorPickerFromPaperdollFrame) then
                        Wardrobe.ColorPickFrameExampleText:SetText(Wardrobe.NewWardrobeName);
                        Wardrobe.ColorPickFrameExampleText:SetTextColor(WARDROBE_TEXTCOLORS[Wardrobe.CurrentOutfitButtonColor][1], WARDROBE_TEXTCOLORS[Wardrobe.CurrentOutfitButtonColor][2], WARDROBE_TEXTCOLORS[Wardrobe.CurrentOutfitButtonColor][3]);       
                else
                        Wardrobe.ColorPickFrameExampleText:SetText(Wardrobe_Config[WD_realmID][WD_charID].Outfit[selectedOutfit].OutfitName);
                        local colorNum = Wardrobe_Config[WD_realmID][WD_charID].Outfit[selectedOutfit].ButtonColor;
                        Wardrobe.ColorPickFrameExampleText:SetTextColor(WARDROBE_TEXTCOLORS[colorNum][1], WARDROBE_TEXTCOLORS[colorNum][2], WARDROBE_TEXTCOLORS[colorNum][3]);  
                end
                
                if (not Wardrobe.EnteredColorPickerFromPaperdollFrame) then Wardrobe.ToggleMainMenuFrameVisibility(false); end

        end     
end


---------------------------------------------------------------------------------
-- Accept the color selection menu
---------------------------------------------------------------------------------
function Wardrobe.AcceptColorPickFrame()
        if (Wardrobe.EnteredColorPickerFromPaperdollFrame) then
                Wardrobe.RefreshCharacterPanel();
        end
        if (Wardrobe.ColorPickFrame.buttonNum) then
                Wardrobe.SetSelectedOutfitColor(Wardrobe.ColorPickFrame.buttonNum); 
                Wardrobe.PopulateMainMenu();            
        end
        Wardrobe.HideColorPickFrame();
end


---------------------------------------------------------------------------------
-- set the color of the selected outfit based on which button was clicked in the color selector
---------------------------------------------------------------------------------
function Wardrobe.SetSelectedOutfitColor(num)
        local selectedOutfit = Wardrobe.FindSelectedOutfit();

        if (selectedOutfit) then
                Wardrobe_Config[WD_realmID][WD_charID].Outfit[selectedOutfit].ButtonColor = num;                
                Wardrobe.PopulateMainMenu();
        end
end

---------------------------------------------------------------------------------
-- Hide the color selection menu
---------------------------------------------------------------------------------
function Wardrobe.HideColorPickFrame()
        if (not Wardrobe.EnteredColorPickerFromPaperdollFrame) then
                Wardrobe.ToggleMainMenuFrameVisibility(true);
        end
        Wardrobe.ColorPickFrame.buttonNum = nil;
        Wardrobe.ColorPickFrame:Hide();
end


---------------------------------------------------------------------------------
-- Show the tooltip text
---------------------------------------------------------------------------------
function Wardrobe.ShowButtonTooltip(theText1, theText2, theText3, theText4, theText5)

        -- Set the anchor and text for the tooltip.
        GameTooltip:ClearLines();
        GameTooltip:SetOwner(this, "ANCHOR_BOTTOMLEFT");
        GameTooltip:SetText(theText1, 0.39, 0.77, 0.16);
                
        -- add description lines to the tooltip
        if (theText2) then
                GameTooltip:AddLine(theText2, 0.82, 0.24, 0.79);
        end
        if (theText3) then
                GameTooltip:AddLine(theText3, 0.82, 0.24, 0.79);
        end
        if (theText4) then
                GameTooltip:AddLine(theText4, 0.82, 0.24, 0.79);
        end
        if (theText5) then
                GameTooltip:AddLine(theText5, 0.82, 0.24, 0.79);
        end
        
        -- Adjust width and height to account for new lines and show the tooltip
        -- (the Show() command automatically adjusts the width/height)
        GameTooltip:Show();
end