vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--------------------------------------------------------------------------
-- MyBagsCore
-- Author: Ramble
--
-- Credits
--   Svarten for MyInventory
--   Turan for OneBag
--   Sarf for AIOI and initail concept
--------------------------------------------------------------------------

local MYBAGS_BOTTOMOFFSET = 20
local MYBAGS_COLWIDTH     = 40
local MYBAGS_ROWHEIGHT    = 40

local MYBAGS_MAXBAGSLOTS  = 28

local MIN_SCALE_VAL     = "0.2"
local MAX_SCALE_VAL     = "2.0"

local MYBAGS_SLOTCOLOR     = { 0.5, 0.5, 0.5 }
local MYBAGS_AMMOCOLOR     = { 0.6, 0.6, 0.1 }
local MYBAGS_SHARDCOLOR    = { 0.6, 0.3, 0.6 }
local MYBAGS_ENCHANTCOLOR  = { 0.2, 0.2, 1.0 }
local MYBAGS_ENGINEERCOLOR = { 0.6, 0.0, 0.0 }
local MYBAGS_HERBCOLOR     = { 0.0, 0.6, 0.0 }
local MYBAGS_KEYRINGCOLOR  = { 0.7, 0.4, 0.4 }

local CHARACTER_DELIMITOR = " " .. ACE_TEXT_OF .. " " -- surrounding spaces are needed

MYBAGS_KC_CHARS = nil
MYBAGS_CACHE_CHARS = nil

MyBagsCoreClass = AceAddonClass:new({
        version           = "0.4.6 (11100)",
        releaseDate   = "07/19/06",
        category             = "inventory",
        author            = "Ramble (modified by Isharra)",
        email                     = "isharra (at) gmail (dot) com",
        website           = "http://isharra.wowinterface.com",
        aceCompatible = "103",

   MAXBAGSLOTS = 36,
   minColumns = 2,
   maxColumns = 24,

   _TOPOFFSET    = 28,
   _BOTTOMOFFSET = 20,
   _LEFTOFFSET   =  8,
   _RIGHTOFFSET  =  3,

})
ace:RegisterFunctions(MyBagsCoreClass, {
        ColorConvertHexToDigit = function(h)
                if(strlen(h)~=6) then return 0,0,0 end
                local r={a=10,b=11,c=12,d=13,e=14,f=15}
                return ((tonumber(strsub(h,1,1)) or r[strsub(h,1,1)] or 0) * 16 +
                                (tonumber(strsub(h,2,2)) or r[strsub(h,2,2)] or 0))/255,
                           ((tonumber(strsub(h,3,3)) or r[strsub(h,3,3)] or 0) * 16 +
                                (tonumber(strsub(h,4,4)) or r[strsub(h,4,4)] or 0))/255,
                           ((tonumber(strsub(h,5,5)) or r[strsub(h,5,5)] or 0) * 16 +
                                (tonumber(strsub(h,6,6)) or r[strsub(h,6,6)] or 0))/255
        end,

        GetItemInfoFromLink = function(l)
                if(not l) then return end
                local _,_,c,id,il,n=strfind(l,"|cff(%x+)|Hitem:(%d+)(:%d+:%d+:%d+)|h%[(.-)%]|h|r")
                return n,c,id..il,id
        end,

        IsSpecialtyBagFromLink = function(b)
                local _,_,_,i=ace.GetItemInfoFromLink(b)
                if(not i) then return end
                local _,_,_,_,c,d=GetItemInfo(i)
                return ace.IsSpecialtyBag(c,d)
        end,

        IsSpecialtyBagFromID = function(i)
                if(not i) then return end
                local _,_,_,_,c,d=GetItemInfo(i)
                return ace.IsSpecialtyBag(c,d)
        end,

        IsSpecialtyBag = function(itype,isubtype)
                if(strlower(itype or "")==strlower(ACEG_TEXT_AMMO)) then return 1 end
                if(strlower(itype or "")==strlower(ACEG_TEXT_QUIVER)) then return 2 end
                if(strlower(isubtype or "")==strlower(ACEG_TEXT_SOUL)) then return 3 end
                if(strlower(isubtype or "")==strlower(ACEG_TEXT_ENCHANT)) then return 4 end
                if(strlower(isubtype or "")==strlower(ACEG_TEXT_ENGINEER)) then return 5 end
                if(strlower(isubtype or "")==strlower(ACEG_TEXT_HERB)) then return 6 end
        end,

SplitString = function(s,p,n)
        if (type(s) ~= "string") then
                error("SplitString must be passed a string as the first argument", 2)
        end

    local l,sp,ep = {},0
    while(sp) do
        sp,ep=strfind(s,p)
        if(sp) then
            tinsert(l,strsub(s,1,sp-1))
            s=strsub(s,ep+1)
        else
            tinsert(l,s)
            break
        end
        if(n) then n=n-1 end
        if(n and (n==0)) then tinsert(l,s) break end
    end
    return unpack(l)
end,
})

function MyBagsCoreClass:Initialize()
        self.GetOpt = function(var) return self.db:get(self.profilePath,var)    end
        self.SetOpt = function(var,val) self.db:set(self.profilePath,var,val)   end
        self.TogOpt = function(var) return self.db:toggle(self.profilePath,var) end
        self.Result = function(text, val, map)
                if( map ) then val = map[val or 0] or val end
                self.cmd:result(text, " ", ACEG_TEXT_NOW_SET_TO, " ",
                                                format(ACEG_DISPLAY_OPTION, val or ACE_CMD_REPORT_NO_VAL)
                                           )
        end
        self.Error  = function(...) self.cmd:result(format(unpack(arg))) end
        self.TogMsg = function(var,text) self.Result(text,self.TogOpt(var),ACEG_MAP_ONOFF) end
        self.frame = getglobal(self.frameName)
        self.frame.self = self
--      self:IsLive()
end
function MyBagsCoreClass:Enable()
        self:RegisterEvents()
        self:HookFunctions()
        if self.GetOpt("Scale") then
                self.frame:SetScale(self.GetOpt("Scale"))
        end
        self:SetUISpecialFrames()
        self:SetFrozen()
        self:SetLockTexture()
        local point = self.GetOpt("Anchor")
        if point then
                self.frame:ClearAllPoints()
                self.frame:SetPoint(string.upper(point), self.frame:GetParent():GetName(), string.upper(point), 0, 0)
        end
        if self:CanSaveItems() then
                self:LoadDropDown()
        else
                self.SetOpt("Player")
        end
        self:ChkCompanion()
        if self.GetOpt("Strata") then
                self.frame:SetFrameStrata(self.GetOpt("Strata"))
        end
end
function MyBagsCoreClass:RegisterEvents()
        self:RegisterEvent("BAG_UPDATE")
        self:RegisterEvent("BAG_UPDATE_COOLDOWN",     "LayoutFrameOnEvent")
        self:RegisterEvent("ITEM_LOCK_CHANGED",       "LayoutFrameOnEvent")
        -- I hate ITEM_LOCK_CHANGED but without it dragging to the actionbars never resets the item button.
--      self:RegisterEvent("UPDATE_INVENTORY_ALERTS", "LayoutFrameOnEvent")
end
function MyBagsCoreClass:HookFunctions()
        self:Hook("ToggleBag")
        self:Hook("OpenBag")
        self:Hook("CloseBag")
end
function MyBagsCoreClass:ToggleBag(bag)
--      self:debug("ToggleBagHook")
        if self.GetOpt("Replace") and self:IncludeBag(bag) then
                self:Toggle()
        else
                self.Hooks["ToggleBag"].orig(bag)
        end
end
function MyBagsCoreClass:OpenBag(bag)
--      self:debug("OpenBagHook")
        if (self.GetOpt("Replace") and self:IncludeBag(bag)) then
                self:Open()
        elseif not self.isBank then
                self.Hooks["OpenBag"].orig(bag)
        end
end
function MyBagsCoreClass:CloseBag(bag)
--      self:debug("CloseBagHook")
        if not self.Freeze and (self.GetOpt("Replace") and self:IncludeBag(bag)) then
                self:Close()
        elseif not self.isBank then
                self.Hooks["CloseBag"].orig(bag)
        end
end

function MyBagsCoreClass:TooltipSetOwner(owner, anchor)
        if not owner then owner = UIParent end
        local parent = owner:GetParent()
        if parent and (parent == self.frame or parent:GetParent() == self.frame ) then
                local point = self.GetOpt("Anchor") or "bottomright"
                if point == "topleft" or point == "bottomleft" then
                        anchor = "ANCHOR_RIGHT"
                else
                        anchor = "ANCHOR_LEFT"
                end
        else
                anchor = "ANCHOR_PRESERVE"
        end
        GameTooltip:SetOwner(owner, anchor)
end
-- Frame Toggle {{{
function MyBagsCoreClass:Open()
        if not self.frame:IsVisible() then self.frame:Show() end
        if self.Player and self.Player ~= ace.char.id then
                self.Player = ace.char.id
                local dropDown = getglobal(self.frameName .. "CharSelectDropDown")
                if dropDown then
                   UIDropDownMenu_SetSelectedValue(dropDown, ace.char.id)
                end
        end
        self:LayoutFrame()
end
function MyBagsCoreClass:Close()
        if self.frame:IsVisible() then self.frame:Hide() end
end
function MyBagsCoreClass:Toggle()
        if self.frame:IsVisible() then
                self:Close()
        else
                self:Open()
        end
end

function MyBagsCoreClass:GetHyperlink(ID)
        local _,        link = GetItemInfo("item:" .. ID)
        return link
end
function MyBagsCoreClass:GetTextLink(ID)
   local myName, myLink, myQuality = GetItemInfo("item:" .. ID)
   local        _,_,_,myColor = GetItemQualityColor(myQuality or 0)
        local textLink = "|cff" .. (strsub(myColor,5)) ..  "|H" .. myLink .. "|h[" .. myName .. "]|h|r"
   return textLink
end

--ITEMBUTTONS--
function MyBagsCoreClass:ItemButton_OnLoad()
        getglobal(this:GetName().."NormalTexture"):SetTexture("Interface\\AddOns\\MyBags\\Skin\\Button");
        ContainerFrameItemButton_OnLoad()
end
function MyBagsCoreClass:ItemButton_OnLeave()
        GameTooltip:Hide()
        local bagButton = getglobal(this:GetParent():GetName() .. "Bag")
        if bagButton then bagButton:UnlockHighlight() end
        CursorUpdate()
end
function MyBagsCoreClass:ItemButton_OnClick(button, ignoreShift)
        if self.isLive then
                if this.hasItem then self.watchLock = 1 end
                if self.isBank and this:GetParent():GetID() == BANK_CONTAINER then
                        BankFrameItemButtonGeneric_OnClick(button)
                else
                        ContainerFrameItemButton_OnClick(button, ignoreShift)
                end
        else
                if button == "LeftButton" and IsControlKeyDown() and not ignoreShift then
                        local _, _, ID = self:GetInfo(this:GetParent():GetID(), this:GetID() )
                        if DressUpItemLink and ID ~= "" then
                                DressUpItemLink("item:"..ID)
                        end
                elseif (button == "LeftButton" ) and ( IsShiftKeyDown() and not ignoreShift) then
                        if (ChatFrameEditBox:IsVisible()) then
                                local _, _, ID = self:GetInfo(this:GetParent():GetID(), this:GetID() )
                                local textLink
                                if ID then textLink = self:GetTextLink(ID) end
                                if textLink then ChatFrameEditBox:Insert(textLink)  end
                        end
                end
        end
end
function MyBagsCoreClass:ItemButton_OnEnter()
        if self.GetOpt("HlBags") == 1 then
                local bagButton = getglobal(this:GetParent():GetName() .. "Bag")
                if bagButton then bagButton:LockHighlight() end
        end
        self:TooltipSetOwner(this)
        if self.isLive then
                if this:GetParent() == MyBankFrameBank then -- OnEnter for BankItems is in XML, need 1.7 to use actual code
                        GameTooltip:SetInventoryItem("player", BankButtonIDToInvSlotID(this:GetID()))
                else
                        ContainerFrameItemButton_OnEnter(this)
                end
        else
                local ID
                _, _, ID = self:GetInfo(this:GetParent():GetID(), this:GetID())
                if ID then
                        local hyperlink = self:GetHyperlink(ID)
                        if hyperlink then GameTooltip:SetHyperlink(hyperlink) end
                end
        end
        if ( this.readable or (IsControlKeyDown() and this.hasItem) ) then
                ShowInspectCursor()
        end
end
function MyBagsCoreClass:ItemButton_OnDragStart()
        if self.isLive then
                self:ItemButton_OnClick("LeftButton", 1)
        end
end
function MyBagsCoreClass:ItemButton_OnReceiveDrag()
        if self.isLive then
                self:ItemButton_OnClick("LeftButton", 1)
        end
end
function MyBagsCoreClass:ItemButton_OnUpdate(arg1)
end

--BAGBUTTONS--
function MyBagsCoreClass:BagButton_OnEnter()
        local bagFrame = this:GetParent()
        local setTooltip = true
        self:TooltipSetOwner(this)
        if self.isLive then
                local invSlot = self:BagIDToInvSlotID(bagFrame:GetID())
                if not invSlot or (not GameTooltip:SetInventoryItem("player", invSlot)) or bagFrame:GetID() == KEYRING_CONTAINER then
                        setTooltip = false
                end
        else
                _, _, ID = self:GetInfo(this:GetParent():GetID())
                if bagFrame:GetID() == 0 then
                        GameTooltip:SetText(BACKPACK_TOOLTIP, 1.0,1.0,1.0)
                elseif bagFrame:GetID() == KEYRING_CONTAINER then
                        setTooltip = false
                elseif ID then
                        hyperlink = self:GetHyperlink(ID)
                        if hyperlink then
                                GameTooltip:SetHyperlink(hyperlink)
                        end
                else
                        setTooltip = false
                end
        end
        if not setTooltip then
                local keyBinding
                if self.isBank then
                        if self.isLive and not self:IsBagSlotUsable(bagFrame:GetID()) then
                                GameTooltip:SetText(BANK_BAG_PURCHASE)
                                if MyBank.atBank then
                                        local cost = GetBankSlotCost()
                                        GameTooltip:AddLine("Purchase:", "", 1, 1, 1)
                                        SetTooltipMoney(GameTooltip, cost)
                                        if GetMoney() > cost then
                                                SetMoneyFrameColor("GameTooltipMoneyFrame", 1.0, 1.0, 1.0)
                                        else
                                                SetMoneyFrameColor("GameTooltipMoneyFrame", 1.0, 0.1, 0.1)
                                        end
                                        GameTooltip:Show()
                                end
                                keyBinding = GetBindingKey("TOGGLEBAG"..(4-this:GetID()))
                        else
                                GameTooltip:SetText(BANK_BAG)
                        end
                else
                        if bagFrame:GetID() == 0 then -- SetScript("OnEnter", MainMenuBarBackpackButton:GetScript("OnEnter"))
                                GameTooltip:SetText(BACKPACK_TOOLTIP, 1.0,1.0,1.0)
                                keyBinding = GetBindingKey("TOGGLEBACKPACK")
                        elseif bagFrame:GetID() == KEYRING_CONTAINER then
                                GameTooltip:SetText(KEYRING, 1.0,1.0,1.0)
                                keyBinding = GetBindingKey("TOGGLEKEYRING")
                        else
                                GameTooltip:SetText(EQUIP_CONTAINER)
                        end
                end
        end
        if self.GetOpt("HlItems") == 1 then -- Highlight
                local i
                for i = 1, self.MAXBAGSLOTS do
                        local button = getglobal(bagFrame:GetName() .. "Item" .. i)
                        if button then
                                button:LockHighlight()
                        end
                end
        end
end
function MyBagsCoreClass:BagButton_OnLeave()
        SetMoneyFrameColor("GameTooltipMoneyFrame", 1.0, 1.0, 1.0);
        GameTooltip:Hide()
        for i = 1, self.MAXBAGSLOTS do
                button = getglobal(this:GetParent():GetName() .. "Item" .. i)
                if button then  button:UnlockHighlight() end
        end
end
function MyBagsCoreClass:BagButton_OnClick(button, ignoreShift)
        if self.isBank then
                this:SetChecked(nil)
        else
                this:SetChecked(self:IncludeBag(this:GetID()))
        end
        if self.isLive then
                if button == "LeftButton" then
                        if not self:IsBagSlotUsable(this:GetParent():GetID()) then
                                local cost = GetBankSlotCost()
                                if GetMoney() > cost then
                                        if not StaticPopupDialogs["PURCHASE_BANKBAG"] then      return end
                                        StaticPopup_Show("PURCHASE_BANKBAG")
                                end
                                return
                        end
                        if (not IsShiftKeyDown()) then
                        self:BagButton_OnReceiveDrag()
                        else
                        end
                else
                        if (IsShiftKeyDown()) then
                                self.db:toggle({self.profilePath, "BagSlot" .. this:GetParent():GetID() }, "Exclude")
                                self.Hooks["CloseBag"].orig(this:GetParent():GetID())
                                self:LayoutFrame()
                        end
                end
        end
end
function MyBagsCoreClass:BagButton_OnDragStart()
        if self.isLive then
                local bagFrame = this:GetParent()
                local invID = self:BagIDToInvSlotID(bagFrame:GetID())
                if invID then
                        PickupBagFromSlot(invID)
                        PlaySound("BAGMENUBUTTONPRESS")
                        self.watchLock = 1
                end
        end
end
function MyBagsCoreClass:BagButton_OnReceiveDrag()
        if self.isLive then
                local bagFrame = this:GetParent()
                local invID = self:BagIDToInvSlotID(bagFrame:GetID())
                local hadItem
                if not invID then
                        hadItem = PutItemInBackpack()
                elseif bagFrame:GetID() == KEYRING_CONTAINER then
                        PutKeyInKeyRing()
                else
                        hadItem = PutItemInBag(invID)
                end
                if not hadItem then
                        if not self:IncludeBag(bagFrame:GetID()) then
                                if bagFrame:GetID() == KEYRING_CONTAINER then
                                        self.Hooks["ToggleKeyRing"].orig()
                                else
                                        self.Hooks["ToggleBag"].orig(bagFrame:GetID())
                                end
                        end
                end
        end
end

function MyBagsCoreClass:LoadDropDown()
        local dropDown = getglobal(self.frameName .. "CharSelectDropDown")
        local dropDownButton = getglobal(self.frameName .. "CharSelectDropDownButton")
        if not dropDown then return end
        local last_this = getglobal("this")
        setglobal("this", dropDownButton)
        UIDropDownMenu_Initialize(dropDown, self.UserDropDown_Initialize)
        UIDropDownMenu_SetSelectedValue(dropDown, self:GetCurrentPlayer())
        UIDropDownMenu_SetWidth(140, dropDown)
        OptionsFrame_EnableDropDown(dropDown)
        setglobal("this", last_this)
end
function MyBagsCoreClass:UserDropDown_Initialize()
        --if not KC_Items then return end
        local chars
        local hasList = 0
        if KC_Items then
                chars = KC_Items.common:GetCharList(ace.char.realm, ace.char.faction)
                for key, value in chars do
                        hasList = 1
                        MYBAGS_KC_CHARS = chars
                        break
                end
                if charCount == 0 then 
                        self.GetOpt("Player")
                        return 
                end
        elseif MyBagsCache then
                chars = MyBagsCache:GetCharList()
                for key, value in chars do
                        hasList = 1
                        MYBAGS_CACHE_CHARS = chars
                        break
                end
                if hasList == 0 then 
                        self.GetOpt("Player")
                        return 
                end
        else
                return
        end
        MyBank:debug("Character list is available")
        local frame = this:GetParent():GetParent():GetParent()
        local selectedValue = UIDropDownMenu_GetSelectedValue(this)

        for key, value in chars do
                info = {
                        ["text"] = key,
                        ["value"] = key,
                        ["func"] = frame.self.UserDropDown_OnClick,
                        ["owner"] = frame.self,
                        ["checked"] = nil,
                }
                if selectedValue == info.value then info.checked = 1 end
                UIDropDownMenu_AddButton(info)
        end
end
function MyBagsCoreClass:UserDropDown_OnClick()
        self = this.owner
        local dropDown = getglobal(self.frameName .. "CharSelectDropDown")
        self.Player = this.value
        UIDropDownMenu_SetSelectedValue(dropDown, this.value)
        self:LayoutFrame()
end
function MyBagsCoreClass:GetCurrentPlayer()
        if self.Player then return self.Player end
        return ace.char.id
end

function MyBagsCoreClass:CanSaveItems()
        local live = self:IsLive()
        self.isLive = FALSE
        if self:GetInfoFunc() ~= self.GetInfoNone then
                self.isLive = live
                return TRUE
        end
        self.isLive = live
        return FALSE
end
function MyBagsCoreClass:IsLive()
        local isLive = true
        local charID = self:GetCurrentPlayer()
        if charID ~= ace.char.id then isLive = false end
        if self.isBank and not MyBank.atBank then isLive = false end
        self.isLive = isLive
        return isLive
end
function MyBagsCoreClass:BagIDToInvSlotID(bag, isBank)
        if bag == -1 or bag >= 5 and bag <= 10 then isBank = 1 end
        if isBank then return BankButtonIDToInvSlotID(bag, 1)   end
        return ContainerIDToInventoryID(bag)
end

function MyBagsCoreClass:IncludeBag(bag)
        if self.isBank and bag == BANK_CONTAINER then return TRUE end
        if not self.isBank and bag == KEYRING_CONTAINER then
                if self.db:get({self.profilePath, "BagSlot"..bag} , "Exclude") then
                        return FALSE
                end
                return TRUE
        end
        if bag < self.firstBag or bag > (self.firstBag + self.totalBags-1) then
                return FALSE
        else
                if self.db:get({self.profilePath, "BagSlot"..bag} , "Exclude") then
                        return FALSE
                end
                return TRUE
        end
end
function MyBagsCoreClass:IsBagSlotUsable(bag)
        if not self.isBank then return TRUE end
        local slots, full = GetNumBankSlots()
        if (bag+1 - self.firstBag) <= slots  then return TRUE end
        return FALSE
end

function MyBagsCoreClass:GetCash()
        if self.isLive then return GetMoney()
        elseif  IsAddOnLoaded("MyBagsCache") then
                local charID = self:GetCurrentPlayer()
                return MyBagsCache:GetCash(charID)
        end
        return nil
end     
function MyBagsCoreClass:GetInfo(bag, slot)
        local infofunc = self:GetInfoFunc()
        if infofunc then
                return infofunc(self, bag, slot)
        end
        return nil, 0, nil, nil, nil, nil, nil
end
function MyBagsCoreClass:GetInfoLive(bag, slot)
        local texture, count, ID
        local locked, quality, readable
        local itemLink

        self.Player = ace.char.id
        if slot ~= nil then
                -- it's an item
                texture, count, locked, _ , readable = GetContainerItemInfo(bag, slot)
                itemLink = GetContainerItemLink(bag, slot)
                if itemLink then
                        _, quality, _, ID = ace.GetItemInfoFromLink(itemLink)
                end
        else
                -- it's a bag
                        if(bag == KEYRING_CONTAINER) then
                                count = GetKeyRingSize()
                        else
                                count = GetContainerNumSlots(bag)
                        end
                        local inventoryID = self:BagIDToInvSlotID(bag)
                        if inventoryID then
                                texture = GetInventoryItemTexture("player", inventoryID)
                                itemLink = GetInventoryItemLink("player", inventoryID)
                                if itemLink then
                                        _, quality, _, ID = ace.GetItemInfoFromLink(itemLink)
                                end
                                locked = IsInventoryItemLocked(inventoryID)
                                readable = ace.IsSpecialtyBagFromLink(itemLink)
                        else
                                texture = "Interface\\Buttons\\Button-Backpack-Up"
                                count = 16
                        end
        end
        count = tonumber(count)
        if count == nil then count = 0 end
        return texture, count, ID, locked, quality, readable, nil
end
function MyBagsCoreClass:GetInfoMyBagsCache(bag,slot,charID)
        local charID = self:GetCurrentPlayer()
        local texture, count, ID, locked, quality, readable, name
        if self.isEquipment then
                slot = bag
                texture, count, ID, quality, name = MyBagsCache:GetInfo("equipment", bag, charID)
        else -- data.Texture, data.Count, data.Link, data.Color, data.Name
                texture, count, ID, quality, name = MyBagsCache:GetInfo(bag, slot, charID)
                if not slot and ID then
                        local _,_,_,_,c,d=GetItemInfo("item:"..ID)
                        readable = ace.IsSpecialtyBag(c,d)
                end
        end
        count = tonumber(count)
        if count == nil then count = 0 end
        return texture, count, ID, nil, quality, readable, name
end
function MyBagsCoreClass:GetInfoNone(bag, slot)
        return nil, 0, nil, nil, nil, nil, nil
end

function MyBagsCoreClass:GetSlotCount()
        local slots, used, displaySlots = 0, 0, 0
        if self.isBank then
                if self:CanSaveItems() or self.isLive then
                        slots = 24 
                        displaySlots = 24 
                end
                for i = 1, slots do
                        if (self:GetInfo(BANK_CONTAINER, i)) then used = used + 1 end
                end
        end
        for bagIndex = 0, self.totalBags -1 do
                local bagFrame = getglobal(self.frameName .. "Bag" .. bagIndex)
                if bagFrame and self:IncludeBag(bagFrame:GetID()) then
                        local bagID = bagFrame:GetID()
                        local bagSlots, specBag
                        _, bagSlots, _, _, _, specBag = self:GetInfo(bagID)
                        bagSlots = ace.tonum(bagSlots)
                        if not specBag or specBag == "" then
                                slots = slots + bagSlots
                                displaySlots = displaySlots + bagSlots
                                for i = 1, bagSlots do
                                        if self:GetInfo(bagID, i) then used = used + 1 end
                                end
                        else
                                displaySlots = displaySlots + bagSlots
                        end
                end
        end
        if self:IncludeBag(KEYRING_CONTAINER) then
                _, bagSlots, _, _, _, specBag = self:GetInfo(KEYRING_CONTAINER)
                displaySlots = displaySlots + bagSlots
        end
        return slots, used, displaySlots
end

function MyBagsCoreClass:LayoutOptions()
        local playerSelectFrame = getglobal(self.frameName .. "CharSelect")
        local title = getglobal(self.frameName .. "Name")
        local cash = getglobal(self.frameName .. "MoneyFrame")
        local slots = getglobal(self.frameName .. "Slots")
        local buttons = getglobal(self.frameName .. "Buttons")
        self:UpdateTitle()
        if self.GetOpt("Title") == TRUE then   title:Show()
        else                                   title:Hide() end
        if self.GetOpt("Cash") == TRUE then
                local cashvalue = self:GetCash()
                if cashvalue then
                        MoneyFrame_Update(self.frameName .. "MoneyFrame", cashvalue)
                        cash:Show()
                else
                        cash:Hide()
                end
        else                                   cash:Hide()      end
        if self.GetOpt("Buttons") == TRUE then buttons:Show()
        else                                   buttons:Hide()   end
        self:SetFrameMode(self.GetOpt("Graphics"))
        if self.GetOpt("Player") == TRUE then
                playerSelectFrame:Show()
        else
                playerSelectFrame:Hide()
        end
        playerSelectFrame:ClearAllPoints()

        if (self.GetOpt("Graphics")) == "art" then
                playerSelectFrame:SetPoint("TOP", self.frameName, "TOP", 22, -38)
                self._TOPOFFSET = 32
        elseif self.GetOpt("Title") or self.GetOpt("Buttons") then
                playerSelectFrame:SetPoint("TOP", self.frameName, "TOP", 0, -38)
                self._TOPOFFSET = 28
        else
                playerSelectFrame:SetPoint("TOP", self.frameName, "TOP", 0, -18)
                self._TOPOFFSET =  8
        end
        if self.GetOpt("Cash") or (not self.isEquipment and self.GetOpt("Count") ~= "none") then
                self._BOTTOMOFFSET = 25
        else
                self._BOTTOMOFFSET = 3
        end
        if (self.frame.isBank) then
--              self:debug("self.frame.isBank") -- does this ever occur?
                MYBAGS_BOTTOMOFFSET = MYBAGS_BOTTOMOFFSET+20
                cash:ClearAllPoints()
                cash:SetPoint("BOTTOMRIGHT", self.frameName, "BOTTOMRIGHT", 0, 25)
        end

        if self.GetOpt("Player") == TRUE or self.GetOpt("Graphics") == "art" then
                self.curRow = self.curRow + 1
        end
        if self.GetOpt("Bag") == "bar" then
                self.curRow = self.curRow + 1
        end
        local count, used, displaySlots = nil
        if not (self.isEquipment) then
                count, used, displaySlots = self:GetSlotCount()
                count = ace.tonum(count)
                displaySlots = ace.tonum(displaySlots)
                if self.GetOpt("Count") == "free" then
                        slots:Show()
                        slots:SetText(format(MYBAGS_SLOTS_DD, (count - used), count ))
                elseif self.GetOpt("Count") == "used" then
                        slots:Show()
                        slots:SetText(format(MYBAGS_SLOTS_DD, (used), count ))
                else
                        slots:Hide()
                end
                if self.GetOpt("Reverse") then
                        self.reverseOrder = TRUE
                else
                        self.reverseOrder = nil
                end
        end
        if self.GetOpt("AIOI") then
                self.aioiOrder = TRUE
                local columns = self.GetOpt("Columns")
                if not (self.isEquipment) and self.GetOpt("Bag") == "before" then displaySlots = displaySlots + self.totalBags end
                columns = ace.tonum(columns)
                if self.isEquipment then displaySlots = 20 end
                self.curCol = columns - (mod(displaySlots, columns) )
                if self.curCol == columns then self.curCol = 0 end
        else
                self.aioiOrder = nil
        end

end
function MyBagsCoreClass:UpdateTitle()
        local title1 = 4
        local title2 = 7
        if self.GetOpt("Graphics") == "art" then
                title1 = 5
                title2 = 9
        end
        local columns = self.GetOpt("Columns")
        local titleString
        if columns > title2 then
                titleString = MYBAGS_TITLE2
        elseif columns > title1 then
                titleString = MYBAGS_TITLE1
        else
                titleString = MYBAGS_TITLE0
        end
        titleString = titleString .. getglobal(string.upper(self.frameName) .. "_TITLE")
        local title = getglobal(self.frameName .. "Name")
   local player, realm = ace.SplitString(self:GetCurrentPlayer(), CHARACTER_DELIMITOR)
        title:SetText(format(titleString, player, realm))
end
function MyBagsCoreClass:SetFrameMode(mode)
        local frame = self.frame
        local frameName = self.frameName
        local textureTopLeft, textureTop, textureTopRight
        local textureLeft, textureCenter, textureRight
        local textureBottomLeft, textureBottom, textureBottomRight
        local texturePortrait
        local frameTitle
        local frameButtonBar = getglobal(frameName .. "Buttons")
        textureTopLeft     = getglobal(frameName .. "TextureTopLeft")
        textureTopCenter   = getglobal(frameName .. "TextureTopCenter")
        textureTopRight    = getglobal(frameName .. "TextureTopRight")

        textureLeft        = getglobal(frameName .. "TextureLeft")
        textureCenter      = getglobal(frameName .. "TextureCenter")
        textureRight       = getglobal(frameName .. "TextureRight")

        textureBottomLeft  = getglobal(frameName .. "TextureBottomLeft")
        textureBottomCenter= getglobal(frameName .. "TextureBottomCenter")
        textureBottomRight = getglobal(frameName .. "TextureBottomRight")
        texturePortrait    = getglobal(frameName .. "Portrait")
        frameTitle = getglobal(frameName .. "Name")
        frameTitle:ClearAllPoints()
        frameButtonBar:ClearAllPoints()
        if mode == "art" then
                frameTitle:SetPoint("TOPLEFT", frameName, "TOPLEFT", 70, -10)
                frameTitle:Show()
                frameButtonBar:Show()
                frameButtonBar:SetPoint("TOPRIGHT", frameName, "TOPRIGHT", 10, 0)
                frame:SetBackdropColor(0,0,0,0)
                frame:SetBackdropBorderColor(0,0,0,0)
                textureTopLeft:Show()
                textureTopCenter:Show()
                textureTopRight:Show()
                textureLeft:Show()
                textureCenter:Show()
                textureRight:Show()
                textureBottomLeft:Show()
                textureBottomCenter:Show()
                textureBottomRight:Show()
                texturePortrait:Show()
        else
                frameTitle:SetPoint("TOPLEFT", frameName, "TOPLEFT", 5, -6)
                frameButtonBar:SetPoint("TOPRIGHT", frameName, "TOPRIGHT", 0, 0)
                textureTopLeft:Hide()
                textureTopCenter:Hide()
                textureTopRight:Hide()
                textureLeft:Hide()
                textureCenter:Hide()
                textureRight:Hide()
                textureBottomLeft:Hide()
                textureBottomCenter:Hide()
                textureBottomRight:Hide()
                texturePortrait:Hide()
                if mode == "default" then
                        local BackColor = self.GetOpt("BackColor") or {0.7,0,0,0}
                        local a, r, g, b = unpack(BackColor)
                        frame:SetBackdropColor(r,g,b,a)
                        frame:SetBackdropBorderColor(1,1,1,a)
                else
                        frame:SetBackdropColor(0,0,0,0)
                        frame:SetBackdropBorderColor(0,0,0,0)
                end
        end
end
function MyBagsCoreClass:GetXY(row, col)
        return (self._LEFTOFFSET + (col * MYBAGS_COLWIDTH)),  (0 - self._TOPOFFSET - (row * MYBAGS_ROWHEIGHT))
end
function MyBagsCoreClass:LayoutBagFrame(bagFrame)
        local bagFrameName = bagFrame:GetName()
        local slot
        local itemBase = bagFrameName .. "Item"
        local bagButton = getglobal(bagFrameName .. "Bag")
        local texture, count, _, locked, quality, ammo
        local slotColor = ((self.GetOpt("SlotColor")) or MYBAGS_SLOTCOLOR)
        local ammoColor = ((self.GetOpt("AmmoColor")) or MYBAGS_AMMOCOLOR)
        local shardColor = ((self.GetOpt("ShardColor")) or MYBAGS_SHARDCOLOR)
        local enchantColor = ((self.GetOpt("EnchantColor")) or MYBAGS_ENCHANTCOLOR)
        local engColor = ((self.GetOpt("EngColor")) or MYBAGS_ENGINEERCOLOR)
        local herbColor = ((self.GetOpt("HerbColor")) or MYBAGS_HERBCOLOR)
        local keyringColor = ((self.GetOpt("KeyRingColor")) or MYBAGS_KEYRINGCOLOR)
        self.watchLock = nil

        texture, count, _, locked, _, specialty = self:GetInfo(bagFrame:GetID())
        bagFrame.size = ace.tonum(count)
        if bagButton and bagFrame:GetID() ~= BANK_CONTAINER then
                if not texture then _, texture = GetInventorySlotInfo("Bag0Slot")       end
                if not self.isLive or (self.isLive and self:IsBagSlotUsable(bagFrame:GetID())) then
                        SetItemButtonTextureVertexColor(bagButton, 1.0, 1.0, 1.0)
                        SetItemButtonDesaturated(bagButton, locked, 0.5, 0.5, 0.5)
                else
                        SetItemButtonTextureVertexColor(bagButton, 1.0, 0.1, 0.1)
                end
                SetItemButtonTexture(bagButton, texture)
                if self.GetOpt("Bag") == "bar" then
                        local col, row = 0, 0
                        if self.GetOpt("Player") or self.GetOpt("Graphics") == "art" then row = 1 end
                        if self.isBank then
                                col = (self.GetOpt("Columns") - self.totalBags)/2
                        else
                                col = (self.GetOpt("Columns") - self.totalBags -.5)/2
                        end
                        if bagFrame:GetID() == KEYRING_CONTAINER then
                                col = col + 5 - self.firstBag
                        else
                                col = col + bagFrame:GetID() - self.firstBag
                        end
                        bagButton:Show()
                        bagButton:ClearAllPoints()
                        bagButton:SetPoint("TOPLEFT", self.frameName, "TOPLEFT", self:GetXY(row, col))
                elseif self.GetOpt("Bag") == "before" then
                        if self.curCol >= self.GetOpt("Columns") then
                                self.curCol  = 0
                                self.curRow = self.curRow + 1
                        end
                        bagButton:Show()
                        bagButton:ClearAllPoints()
                        bagButton:SetPoint("TOPLEFT", self.frameName, "TOPLEFT", self:GetXY(self.curRow,self.curCol))
                        self.curCol = self.curCol + 1
                else
                        bagButton:Hide()
                end
                if not self:IncludeBag(bagFrame:GetID()) or self.isBank then
                        bagButton:SetChecked(nil)
                else
                        bagButton:SetChecked(1)
                end
        end
--      local maxIndex = MYBAGS_MAXBAGSLOTS
--      if bagFrame.maxIndex then maxIndex = bagFrame.maxIndex end
        if bagFrame.size < 1 or not self:IncludeBag(bagFrame:GetID()) then
                bagFrame.size = 0
        else
                for slot = 1, bagFrame.size do
                        local itemButton = getglobal(itemBase .. slot) or CreateFrame("Button", itemBase .. slot, bagFrame, "MyBagsItemButtonTemplate")
                        itemButton:SetID(slot)
                        if self.curCol >= self.GetOpt("Columns") then
                                self.curCol = 0
                                self.curRow = self.curRow + 1
                        end
                        itemButton:Show()
                        itemButton:ClearAllPoints()
                        itemButton:SetPoint("TOPLEFT", self.frame:GetName(), "TOPLEFT", self:GetXY(self.curRow, self.curCol))
                        self.curCol = self.curCol + 1
                        texture, count, id, locked, quality = self:GetInfo(bagFrame:GetID(), slot)
                        if id and id ~= "" then itemButton.hasItem = 1
                        else quality = nil end
                        if self.isLive then
                                local start,duration, enable = GetContainerItemCooldown(bagFrame:GetID(), slot)
                                local cooldown = getglobal(itemButton:GetName() .. "Cooldown")
                                CooldownFrame_SetTimer(cooldown,start,duration,enable)
                                if duration>0 and enable==0 then
                                        SetItemButtonTextureVertexColor(itemButton, 0.4,0.4,0.4)
                                end
                        end
                        SetItemButtonTexture(itemButton, (texture or ""))
                        SetItemButtonCount(itemButton, count)
                        SetItemButtonDesaturated(itemButton, locked, 0.5, 0.5, 0.5)
                        if locked and locked ~= "" then
                                itemButton:LockHighlight()
                                self.watchLock =1
                        else itemButton:UnlockHighlight() end
                        if quality and self.GetOpt("Border") then
                                SetItemButtonNormalTextureVertexColor(itemButton, ace.ColorConvertHexToDigit(quality))
                        else
                                SetItemButtonNormalTextureVertexColor(itemButton, unpack(slotColor))
                                if (specialty == 1 or specialty == 2) then
                                        SetItemButtonNormalTextureVertexColor(itemButton, unpack(ammoColor))
                                elseif specialty == 3 then
                                        SetItemButtonNormalTextureVertexColor(itemButton, unpack(shardColor))
                                elseif specialty == 4 then
                                        SetItemButtonNormalTextureVertexColor(itemButton, unpack(enchantColor))
                                elseif specialty == 5 then
                                        SetItemButtonNormalTextureVertexColor(itemButton, unpack(engColor))
                                elseif specialty == 6 then
                                        SetItemButtonNormalTextureVertexColor(itemButton, unpack(herbColor))
                                elseif bagFrame:GetID() == KEYRING_CONTAINER then
                                        SetItemButtonNormalTextureVertexColor(itemButton, unpack(keyringColor))
                                end
                        end
                end
        end
        if(bagFrame.size) then
                local slot = bagFrame.size + 1
                local itemButton = getglobal(itemBase .. slot) 
                while itemButton do
                        itemButton:Hide()
                        slot = slot + 1
                        itemButton = getglobal(itemBase .. slot) 
                end
        end
end
function MyBagsCoreClass:LayoutFrame()
--      local time = GetTime()
--      if not self.frame or not self.frame:IsVisible() then return end
        if not self.frame:IsVisible() then return end
        self.isLive = self:IsLive()
        local bagBase = self.frameName .. "Bag"
        local bagIndex, bagFrame
        self.curRow, self.curCol = 0,0
        self:LayoutOptions()
        if self.isEquipment then
                self:LayoutEquipmentFrame(self)
        else
                if self.reverseOrder then
                        if not self.isBank then
                                bagFrame = getglobal(self.frameName .. "KeyRing")
                                bagFrame:SetID(KEYRING_CONTAINER)
                                self:LayoutBagFrame(bagFrame)
                        end
                        for bag = self.totalBags-1,0,-1  do
                                bagFrame = getglobal(bagBase .. bag)
                                if (bagFrame) then
                                        self:LayoutBagFrame(bagFrame)
                                end
                        end
                        if self.isBank then
                                bagFrame = getglobal(self.frameName .. "Bank")
                                self:LayoutBagFrame(bagFrame)
                        end
                else
                        if self.isBank then
                                bagFrame = getglobal(self.frameName .. "Bank")
                                self:LayoutBagFrame(bagFrame)
                        end
                        for bag = 0, self.totalBags-1 do
                                bagFrame = getglobal(bagBase .. bag)
                                if (bagFrame) then
                                        self:LayoutBagFrame(bagFrame)
                                end
                        end
                        if not self.isBank then
                                bagFrame = getglobal(self.frameName .. "KeyRing")
                                bagFrame:SetID(KEYRING_CONTAINER)
                                self:LayoutBagFrame(bagFrame)
                        end
                end
        end
        if self.curCol == 0 then self.curRow = self.curRow - 1 end
        self.frame:SetWidth(self._LEFTOFFSET + self._RIGHTOFFSET + self.GetOpt("Columns") * MYBAGS_COLWIDTH)
        self.frame:SetHeight(self._TOPOFFSET + self._BOTTOMOFFSET + (self.curRow + 1) * MYBAGS_ROWHEIGHT)
--      self:debug("LayoutFrame ".. GetTime()-time)
end
function MyBagsCoreClass:LayoutFrameOnEvent()
--      local time = GetTime()
        if event == "UNIT_INVENTORY_CHANGED" and arg1 ~= "player" then return end
        if event == "ITEM_LOCK_CHANGED" and not self.watchLock then return end
        if self.isLive then
                self:LayoutFrame()
        end
--      self:debug("LayoutFrameOnEvent "..event.." ".. GetTime()-time)
end
function MyBagsCoreClass:LockButton_OnClick()
        self.TogOpt("Lock")
        self:SetLockTexture()
end

function MyBagsCoreClass:SetLockTexture()
        local button = getglobal(self.frameName .. "ButtonsLockButtonNormalTexture")
        local texture = "Interface\\AddOns\\MyBags\\Skin\\LockButton-"
        if not self.GetOpt("Lock") then texture = texture .. "Un" end
        texture = texture .. "Locked-Up"
        button:SetTexture(texture)
        if self.GetOpt("Lock") and self.GetOpt("Graphics") == "none" then
--              self:debug("Mouse clicks pass through")
                self.frame:EnableMouse(nil)
        else
--              self:debug("Mouse clicks intercepted")
                self.frame:EnableMouse(1)
        end
end
function MyBagsCoreClass:SetFrozen()
        if self.GetOpt("Freeze") == "always" then
                self.Freeze = "always"
        elseif self.GetOpt("Freeze") == "sticky" then
                self.Freeze = "sticky"
        else
                self.Freeze = nil
        end
end
function MyBagsCoreClass:SetUISpecialFrames()
        if self.GetOpt("NoEsc") then
                for k,v in UISpecialFrames do
                        if v == (self.frameName) then
                                table.remove(UISpecialFrames, k)
                        end
                end
        else
                table.insert(UISpecialFrames, self.frameName)
        end
end

--CHAT CMD OPTIONS {{{
function MyBagsCoreClass:SetColumns(cols)
        cols = ace.tonum(cols)

        if( (cols >= self.minColumns) and (cols <= self.maxColumns) ) then
                self.SetOpt("Columns", cols)
                self:LayoutFrame()
                --self.Result(ONEBAG_TEXT_COLS, cols)
        else
                --self.Result(ONEBAG_COLUMN_LIMIT_MSG, self.minColumns, self.maxColumns)
        end
end
function MyBagsCoreClass:SetReplace()
        self.TogMsg("Replace", "Replace default bags")
        self:LayoutFrame()
end
function MyBagsCoreClass:SetBagDisplay(opt)
        self.SetOpt("Bag", opt)
        self.Result("Bag Buttons", opt)
        self:LayoutFrame()
end
function MyBagsCoreClass:SetGraphicsDisplay(opt)
        local a, r, g, b
        opt, a, r, g, b = unpack(ace.ParseWords(opt))
--      self:debug("opt: |" .. opt .."| ")
        if opt ~= "default" and opt~="art" and opt~="none" then
                return
        end
        self.SetOpt("Graphics", opt)
        if a then
                self.SetOpt("BackColor", {ace.tonum(a), ace.tonum(r), ace.tonum(g), ace.tonum(b)})
        else
                self.SetOpt("BackColor")
        end
        self.Result("Background", opt)
        self:LayoutFrame()
end
function MyBagsCoreClass:SetHighlight(mode)
        if mode == "items" then
                self.TogMsg("HlItems", "Highlight")
        else
                self.TogMsg("HlBags", "Highlight")
        end
end
function MyBagsCoreClass:SetFreeze(opt)
        opt = strlower(opt)
        if opt == "freeze always" then opt = "always" end
        if opt == "freeze sticky" then opt = "sticky" end
        if opt == "freeze none" then opt = "none" end
        self.Result("Freeze", opt)
        self.SetOpt("Freeze", opt)
        self:SetFrozen()
end
function MyBagsCoreClass:SetNoEsc()
        self.TogMsg("NoEsc", "NoEsc")
        self:SetUISpecialFrames()
end
function MyBagsCoreClass:SetLock()
        self.TogMsg("Lock", "Lock")
        self:SetLockTexture()
end
function MyBagsCoreClass:SetTitle()
        self.TogMsg("Title", "Frame Title")
        self:LayoutFrame()
end
function MyBagsCoreClass:SetCash()
        self.TogMsg("Cash", "Money Display")
        self:LayoutFrame()
end
function MyBagsCoreClass:SetButtons()
        self.TogMsg("Buttons", "Frame Buttons")
        self:LayoutFrame()
end
function MyBagsCoreClass:SetAIOI()
        self.TogMsg("AIOI", "toggle partial row placement")
        self:LayoutFrame()
end
function MyBagsCoreClass:SetReverse()
        self.TogMsg("Reverse", "reverse bag ordering")
        self:LayoutFrame()
end
function MyBagsCoreClass:SetBorder()
        self.TogMsg("Border", "Quality Borders")
        self:LayoutFrame()
end
function MyBagsCoreClass:SetPlayerSel()
        if self:CanSaveItems() then
--              self:debug("CanSaveItems")
                self.TogMsg("Player", "Player selection")
        else
--              self:debug("Can'tSaveItems")
                self.SetOpt("Player")
        end
        self:LayoutFrame()
end
function MyBagsCoreClass:SetCount(mode)
        self.SetOpt("Count", mode)
        self.Result("Count", mode)
        self:LayoutFrame()
end
function MyBagsCoreClass:SetScale(scale)
        scale = ace.tonum(scale)
        if scale == 0 then
                self.SetOpt("Scale")
                self.frame:SetScale(self.frame:GetParent():GetScale())
                self.Result("Scale", ACEG_TEXT_DEFAULT)
        elseif (( scale < ace.tonum(MIN_SCALE_VAL)) or (scale > ace.tonum(MAX_SCALE_VAL))) then
                self.Error("Invalid Scale")
        else
                self.SetOpt("Scale", scale)
                self.frame:SetScale(scale)
                self.Result("Scale", scale)
        end
end
function MyBagsCoreClass:SetStrata(strata)
        strata = strupper(strata)
--      if strata =="BACKGROUND" or strata =="LOW" or strata =="MEDIUM" or strata =="HIGH" or strata =="DIALOG" or strata =="FULLSCREEN" or strata =="FULLSCREEN_DIALOG" or strata =="TOOLTIP" then
        if strata =="BACKGROUND" or strata =="LOW" or strata =="MEDIUM" or strata =="HIGH" or strata =="DIALOG" then
                self.SetOpt("Strata", strata)
                self.frame:SetFrameStrata(strata)
                self.Result("Strata", strata)
        else
                self.Error("Invalid strata")
        end
end
function MyBagsCoreClass:Report()
        self.cmd:report({
                {text="Columns", val=self.GetOpt("Columns")},
                {text="Graphics", val=self.GetOpt("Graphics")},
                {text="Lock", val=self.GetOpt("Lock"),map=ACEG_MAP_ONOFF},
                {text="NoEsc", val=self.GetOpt("NoEsc"),map=ACEG_MAP_ONOFF},
                {text="Title", val=self.GetOpt("Title"),map=ACEG_MAP_ONOFF},
                {text="Cash", val=self.GetOpt("Cash"),map=ACEG_MAP_ONOFF},
                {text="Buttons", val=self.GetOpt("Buttons"),map=ACEG_MAP_ONOFF},
                {text="Border", val=self.GetOpt("Border"),map=ACEG_MAP_ONOFF},
                {text="Player", val=self.GetOpt("Player"),map=ACEG_MAP_ONOFF},
                {text="AIOI", val=self.GetOpt("AIOI"),map=ACEG_MAP_ONOFF},
                {text="Scale", val=self.GetOpt("Scale")},
                {text="Strata", val=self.GetOpt("Strata")},
                {text="Anchor", val=self.GetOpt("Anchor")},
                {text="Default Slot Color", val=ace.concat(self.GetOpt("SlotColor") or MYBAGS_SLOTCOLOR," ")},
        })
        if not self.isEquipment then
                self.cmd:report({
                        {text="Default Slot Color", val=ace.concat(self.GetOpt("SlotColor") or MYBAGS_SLOTCOLOR," ")},
                        {text="Ammo Slot Color", val=ace.concat(self.GetOpt("AmmoColor") or MYBAGS_AMMOCOLOR," ")},
                        {text="Soul Slot Color", val=ace.concat(self.GetOpt("SoulColor") or MYBAGS_SHARDCOLOR," ")},
                        {text="Enchanting Slot Color", val=ace.concat(self.GetOpt("EnchantColor") or MYBAGS_ENCHANTCOLOR," ")},
                        {text="Engineering Slot Color", val=ace.concat(self.GetOpt("EngColor") or MYBAGS_ENGINEERCOLOR," ")},
                        {text="Herb Slot Color", val=ace.concat(self.GetOpt("HerbColor") or MYBAGS_HERBCOLOR," ")},
                        {text="Replace", val=self.GetOpt("Replace"),map=ACEG_MAP_ONOFF},
                        {text="Bag", val=self.GetOpt("Bag")},
                        {text="HlItems", val=self.GetOpt("HlItems"),map=ACEG_MAP_ONOFF},
                        {text="HlBags", val=self.GetOpt("HlBags"),map=ACEG_MAP_ONOFF},
                        {text="Freeze", val=self.GetOpt("Freeze")},
                        {text="Reverse", val=self.GetOpt("Reverse"),map=ACEG_MAP_ONOFF},
                        {text="Count", val=self.GetOpt("Count")},
                        {text="Anchor", val=self.GetOpt("Anchor")},
                })
                if not self.isBank then
                        self.cmd:report({
                                {text="Companion", val=self.GetOpt("Companion"),map=ACEG_MAP_ONOFF},
                        })
                end
        end
end
function MyBagsCoreClass:ResetSettings()
        self.db:reset(self.profilePath, self.defaults)
        self.Error("Settings reset to default")
        self:ResetAnchor()
        self:SetLockTexture()
        self:SetUISpecialFrames()
        self:SetFrozen()
        self:LayoutFrame()
end
function MyBagsCoreClass:ResetAnchor()
        if not self:SetAnchor(self.defaults.Anchor) then return end
        anchorframe = self.frame:GetParent()
        anchorframe:ClearAllPoints()
        anchorframe:SetPoint(self.anchorPoint, self.anchorParent, self.anchorPoint, self.anchorOffsetX, self.anchorOffsetY)
        self.frame:ClearAllPoints()
        self.frame:SetPoint(self.anchorPoint, anchorframe, self.anchorPoint, 0, 0)
        self.Error("Anchor Reset")
end
function MyBagsCoreClass:SetAnchor(point)
        if     point == "topleft" then
        elseif point == "topright" then
        elseif point == "bottomleft" then
        elseif point == "bottomright" then
        else self.Error("Invalid Entry for Anchor") return end
        local anchorframe = self.frame:GetParent()
        local top = self.frame:GetTop()
        local left = self.frame:GetLeft()
        local top1 = anchorframe:GetTop()
        local left1 = anchorframe:GetLeft()
        if not top or not left or not left1 or not top1 then
                self.Error("Frame must be open to set anchor") return
        end
        self.frame:ClearAllPoints()
        anchorframe:ClearAllPoints()
        anchorframe:SetPoint(string.upper(point), self.frameName, string.upper(point), 0, 0)
        top = anchorframe:GetTop()
        left = anchorframe:GetLeft()
        if not top or not left then
                anchorframe:ClearAllPoints()
                anchorframe:SetPoint("BOTTOMLEFT", "UIParent", "BOTTOMLEFT", left1, top1-10)
                point = string.upper(self.GetOpt("Anchor") or "bottomright")
                self.frame:SetPoint(point, anchorframe:GetName(), point, 0,0)
                self.Error("Frame must be open to set anchor") return
        end
        anchorframe:ClearAllPoints()
        anchorframe:SetPoint("BOTTOMLEFT", "UIParent", "BOTTOMLEFT", left, top-10)
        self.frame:SetPoint(string.upper(point), anchorframe:GetName(), string.upper(point), 0, 0)
        self.SetOpt("Anchor", point)
        self.Result("Anchor", point)
        self.anchorPoint = string.upper(point)
        return TRUE
end
function MyBagsCoreClass:SetSpecialtyBagSlotColor(opt)
        local r, g, b
        opt, r, g, b = unpack(ace.ParseWords(opt))
--      self:debug("opt: |" .. opt .."| ")
        if opt == "default" then
                if r then
                        self.SetOpt("SlotColor", { ace.tonum(r), ace.tonum(g), ace.tonum(b)})
                else
                        self.SetOpt("SlotColor")
                end
        end
        if opt == "ammo" then
                if r then
                        self.SetOpt("AmmoColor", { ace.tonum(r), ace.tonum(g), ace.tonum(b)})
                else
                        self.SetOpt("AmmoColor")
                end
        end
        if opt == "soul" or opt == "shard" then
                if r then
                        self.SetOpt("ShardColor", {ace.tonum(r), ace.tonum(g), ace.tonum(b)})
                else
                        self.SetOpt("ShardColor")
                end
        end
        if opt == "enchant" then
                if r then
                        self.SetOpt("EnchantColor", {ace.tonum(r), ace.tonum(g), ace.tonum(b)})
                else
                        self.SetOpt("EnchantColor")
                end
        end
        if opt == "engineer" then
                if r then
                        self.SetOpt("EngColor", {ace.tonum(r), ace.tonum(g), ace.tonum(b)})
                else
                        self.SetOpt("EngColor")
                end
        end
        if opt == "herb" then
                if r then
                        self.SetOpt("HerbColor", {ace.tonum(r), ace.tonum(g), ace.tonum(b)})
                else
                        self.SetOpt("HerbColor")
                end
        end
        if opt == "keyring" then
                if r then
                        self.SetOpt("KeyRingColor", {ace.tonum(r), ace.tonum(g), ace.tonum(b)})
                else
                        self.SetOpt("KeyRingColor")
                end
        end
        self.Result("SlotColor", opt)
        self:LayoutFrame()
end
function MyBagsCoreClass:SetCompanion()
        if self.GetOpt("Companion") then
                self:UnregisterEvent("AUCTION_HOUSE_SHOW")
                self:UnregisterEvent("AUCTION_HOUSE_CLOSED")
                self:UnregisterEvent("BANKFRAME_OPENED")
                self:UnregisterEvent("BANKFRAME_CLOSED")
                self:UnregisterEvent("MAIL_CLOSED")
                self:UnregisterEvent("TRADE_CLOSED")
                self:UnregisterEvent("TRADE_SHOW")
        end
        self.TogMsg("Companion", "Companion")
        self:ChkCompanion()
end
function MyBagsCoreClass:ChkCompanion()
        if self.GetOpt("Companion") then
                self:RegisterEvent("AUCTION_HOUSE_SHOW","CompanionOpen")
                self:RegisterEvent("AUCTION_HOUSE_CLOSED","CompanionClose")
                self:RegisterEvent("BANKFRAME_OPENED","CompanionOpen")
                self:RegisterEvent("BANKFRAME_CLOSED","CompanionClose")
                self:RegisterEvent("MAIL_CLOSED","CompanionClose")
                self:RegisterEvent("TRADE_CLOSED","CompanionClose")
                self:RegisterEvent("TRADE_SHOW","CompanionOpen")
        end
end