vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        All In One Inventory

        By sarf

        This mod allows you to view and interact with your inventory without caring about bags.

        Thanks goes to SirBender for the background conversion and other stuff! :)

        Thanks to amoeba for the ultra-nice Lock Button! Even if they lacked transparency. :)

        CosmosUI URL:
        http://www.cosmosui.org/forums/viewtopic.php?t=

   ]]


-- Constants
ALLINONEINVENTORY_MAX_ID = 109;
ALLINONEINVENTORY_WIDTH = 350;

ALLINONEINVENTORY_NUM_COLUMNS = 8;
ALLINONEINVENTORY_COLUMNS_MIN = 2;
ALLINONEINVENTORY_COLUMNS_MAX = 16;
ALLINONEINVENTORY_BASE_HEIGHT = 64;
ALLINONEINVENTORY_ROW_HEIGHT = 40;

ALLINONEINVENTORY_BASE_WIDTH = 26;
ALLINONEINVENTORY_COL_WIDTH = 40;

ALLINONEINVENTORY_ALPHA_MIN = 0;
ALLINONEINVENTORY_ALPHA_MAX = 1;

ALLINONEINVENTORY_SCALE_MIN = 0;
ALLINONEINVENTORY_SCALE_MAX = 2;

ALLINONEINVENTORY_SCHEDULENAME_UPDATE = "AllInOneInventory_UpdateBags";
ALLINONEINVENTORY_MAXIMUM_NUMBER_OF_BUTTONS = 109;
ALLINONEINVENTORY_MINIMUM_TIME_BETWEEN_UPDATES = 0.2;

-- Variables
AllInOneInventory_Enabled = 0;
AllInOneInventory_ReplaceBags = 0;
AllInOneInventory_IncludeShotBags = 1;
AllInOneInventory_ShowPrice = 1;
AllInOneInventory_Locked = 0;
AllInOneInventory_SwapBagOrder = 0;
AllInOneInventory_Alpha = 1;
AllInOneInventory_Scale = 1;

AllInOneInventory_ExcludeSlots = {};


AllInOneInventory_IncludeBagZero = 1;
AllInOneInventory_IncludeBagOne = 1;
AllInOneInventory_IncludeBagTwo = 1;
AllInOneInventory_IncludeBagThree = 1;
AllInOneInventory_IncludeBagFour = 1;

AllInOneInventory_ModifyTooltipsAtMerchant = 1;

AllInOneInventory_BagStringIndex = {
        [0] = "Zero",
        [1] = "One",
        [2] = "Two",
        [3] = "Three",
        [4] = "Four",
};

AllInOneInventory_BagsToInclude = {
        [0] = "AllInOneInventory_IncludeBagZero",
        [1] = "AllInOneInventory_IncludeBagOne",
        [2] = "AllInOneInventory_IncludeBagTwo",
        [3] = "AllInOneInventory_IncludeBagThree",
        [4] = "AllInOneInventory_IncludeBagFour",
};


AllInOneInventory_Columns = ALLINONEINVENTORY_NUM_COLUMNS;

AllInOneInventory_Patching_Tooltip = 0;

AllInOneInventory_Saved_SellValue_OnShow = nil;
AllInOneInventory_Saved_UseContainerItem = nil;
AllInOneInventory_Saved_ToggleBag = nil;
AllInOneInventory_Saved_OpenBag = nil;
AllInOneInventory_Saved_CloseBag = nil;
AllInOneInventory_Saved_ToggleBackpack = nil;
AllInOneInventory_Saved_CloseBackpack = nil;
AllInOneInventory_Saved_OpenBackpack = nil;
AllInOneInventory_Saved_BagSlotButton_OnClick = nil;
AllInOneInventory_Saved_BagSlotButton_OnDrag = nil;
AllInOneInventory_Saved_BackpackButton_OnClick = nil;
AllInOneInventory_Saved_CloseAllWindows = nil;
AllInOneInventory_Saved_OpenAllBags = nil;
AllInOneInventory_Saved_DepositBox_RefreshWindows = nil;

function AIOI_Schedule_Own(time, func, p1, p2, p3, p4, p5, p6, p7, p8, p9)
        func(p1, p2, p3, p4, p5, p6, p7, p8, p9);
end

function AIOI_ScheduleByName_Own(name, time, func, p1, p2, p3, p4, p5, p6, p7, p8, p9)
        func(p1, p2, p3, p4, p5, p6, p7, p8, p9);
end

-- executed on load, calls general set-up functions
function AllInOneInventoryScriptFrame_OnLoad()
        local func = AIOI_ScheduleByName_Own;
        if ( Chronos ) and ( Chronos.scheduleByName ) then
                func = Chronos.scheduleByName;
        elseif ( Cosmos_ScheduleByName ) then
                func = Cosmos_ScheduleByName;
        end
        setglobal("AIOI_ScheduleByName", func);
        func = AIOI_Schedule_Own;
        if ( Chronos ) and ( Chronos.schedule ) then
                func = Chronos.schedule;
        elseif ( Cosmos_Schedule ) then
                func = Cosmos_Schedule;
        end
        setglobal("AIOI_Schedule", func);

        AllInOneInventory_Register();
        AllInOneInventory_Setup_Hooks(1);
        --DynamicData.item.addOnInventoryUpdateHandler(AllInOneInventoryFrame_OnInventoryUpdate);
end

function AllInOneInventory_Register_SlashCommands()
        SlashCmdList["ALLINONEINVENTORYSLASHMAIN"] = AllInOneInventory_Main_ChatCommandHandler;
        SLASH_ALLINONEINVENTORYSLASHMAIN1 = "/allinoneinventory";
        SLASH_ALLINONEINVENTORYSLASHMAIN2 = "/aioi";
end

-- registers the mod with the system, integrating it with slash commands and "master" AddOns
function AllInOneInventory_Register()
        this:RegisterEvent("PLAYER_LOGIN");
        this:RegisterEvent("ADDON_LOADED");
        AllInOneInventory_Register_SlashCommands()
end

function AllInOneInventory_Extract_NextParameter(msg)
        local params = msg;
        local command = params;
        local index = strfind(command, " ");
        if ( index ) then
                command = strsub(command, 1, index-1);
                params = strsub(params, index+1);
        else
                params = "";
        end
        return command, params;
end

function AllInOneInventory_GetItemInfo(id)
        local bag, slot = AllInOneInventory_GetIdAsBagSlot(id);
        return GetContainerItemInfo(bag, slot);
end

function AllInOneInventory_GetNumberOfSlotsInBag(bag)
        local slots = 0;
        if ( AllInOneInventory_ShouldIncludeBag(bag) ) then
                slots = GetContainerNumSlots(bag);
                if ( AllInOneInventory_ExcludeSlots ) and ( AllInOneInventory_ExcludeSlots[bag] ) then
                        local n = 0;
                        for k, v in AllInOneInventory_ExcludeSlots[bag] do
                                n = n + 1;
                        end
                        slots = slots - n;
                end
        end
        return slots;
end

AllInOneInventory_GetBags_Table = {};

function AllInOneInventory_GetBags()
        local bag = 0;
        local bags = AllInOneInventory_GetBags_Table;
        for bag = 0, 4 do
                bags[bag] = AllInOneInventory_GetNumberOfSlotsInBag(bag);
        end
        return bags;
end

function AllInOneInventory_GetBagsTotalSlots()
        local bags = AllInOneInventory_GetBags();
        local slots = 0;
        for k, v in bags do
                slots = slots + v;
        end
        return slots;
end

function AllInOneInventory_GetIdAsBagSlot(id)
        if ( not id ) then
                --return 0, 1;
                return nil, nil;
        end
        local bagSlots = AllInOneInventory_GetBags();
        local leftId = id;
        local curSlots = 0;
        local bag, slots;
        local ok = true;
        local bag = 0;
        if ( AllInOneInventory_SwapBagOrder == 1 ) then
                bag = 4;
        end
        while ( ok ) do
                curSlots = bagSlots[bag];
                if ( not curSlots ) then
                        curSlots = 0;
                end
                if ( leftId - curSlots <= 0 ) then
                        if ( AllInOneInventory_ExcludeSlots[bag] ) then
                                for i = 1, leftId do
                                        if ( AllInOneInventory_ExcludeSlots[bag][i] ) then
                                                leftId = leftId + 1;
                                        end
                                end
                        end
                        return bag, leftId;
                else
                        leftId = leftId - curSlots;
                end
                if ( AllInOneInventory_SwapBagOrder == 1 ) then
                        bag = bag - 1;
                        if ( bag < 0 ) then
                                ok = false;
                        end
                else
                        bag = bag + 1;
                        if ( bag > 4 ) then
                                ok = false;
                        end
                end
        end
        return -1, -1;
end

function AllInOneInventory_CommandUsage()
        for k, v in ALLINONEINVENTORY_CHAT_COMMAND_USAGE do
                AllInOneInventory_Print(v);
        end
end

-- Handles chat - e.g. slashcommands - enabling/disabling the AllInOneInventory
function AllInOneInventory_Main_ChatCommandHandler(msg)

        local func = AllInOneInventory_Toggle_Enabled;

        local toggleFunc = true;

        if ( ( not msg) or ( strlen(msg) <= 0 ) ) then
                AllInOneInventory_CommandUsage();
                return;
        end

        local commandName, params = AllInOneInventory_Extract_NextParameter(msg);

        if ( ( commandName ) and ( strlen(commandName) > 0 ) ) then
                commandName = string.lower(commandName);
        else
                commandName = "";
        end

        if ( strfind( commandName, "state" ) ) then
                func = AllInOneInventory_Toggle_Enabled;
        elseif ( ( ( strfind( commandName, "togglebag" ) ) ) ) then
                local bagNumber;
                bagNumber, params = AllInOneInventory_Extract_NextParameter(params);
                func = nil;
                bagNumber = tonumber(bagNumber);
                if ( bagNumber ) then
                        local str = AllInOneInventory_BagStringIndex[bagNumber];
                        if ( str ) then
                                func = getglobal(format("AllInOneInventory_Toggle_IncludeBag%s", str));
                        end
                end
                if ( func ) then
                        func(-1);
                else
                        AllInOneInventory_Print(ALLINFOURINVENTORY_CHAT_NO_SUCH_BAGNUMBER);
                end
                return;
        elseif ( ( ( strfind( commandName, "toggleslot" ) ) ) ) then
                local bagNumber;
                local slotNumber;
                bagNumber, params = AllInOneInventory_Extract_NextParameter(params);
                slotNumber, params = AllInOneInventory_Extract_NextParameter(params);
                return AllInOneInventory_Toggle_ExcludedSlot(bagNumber, slotNumber);
        elseif ( ( strfind( commandName, "swap" ) ) or ( ( strfind( commandName, "order" ) ) ) ) then
                func = AllInOneInventory_Toggle_SwapBagOrder;
                toggleFunc = false;
        elseif ( ( ( strfind( commandName, "toggle" ) ) ) ) then
                func = ToggleAllInOneInventoryFrame;
                toggleFunc = false;
        elseif ( ( strfind( commandName, "show" ) ) ) then
                func = OpenAllInOneInventoryFrame;
                toggleFunc = false;
        elseif ( ( strfind( commandName, "hide" ) ) ) then
                func = CloseAllInOneInventoryFrame;
                toggleFunc = false;
        elseif ( ( strfind( commandName, "replacebag" ) ) or ( ( strfind( commandName, "hijackbag" ) ) ) ) then
                func = AllInOneInventory_Toggle_ReplaceBags;
        elseif ( strfind( commandName, "include" ) ) then
                func = AllInOneInventory_Toggle_IncludeShotBags;
        elseif ( strfind( commandName, "reset" ) ) then
                func = AllInOneInventoryFrame_ResetButton;
                func();
                AllInOneInventory_Print(TEXT(ALLINONEINVENTORY_CHAT_RESETPOSITION));
                return;
        elseif ( ( strfind( commandName, "setcols" ) ) or ( ( strfind( commandName, "cols" ) ) ) or ( ( strfind( commandName, "column" ) ) ) ) then
                func = AllInOneInventory_Change_Columns;
                toggleFunc = false;
                local cols = 0;
                cols, params = AllInOneInventory_Extract_NextParameter(params);
                cols = tonumber(cols);
                if ( not cols ) then
                        AllInOneInventory_CommandUsage();
                        return;
                else
                        return func(1, cols);
                end
        elseif ( strfind( commandName, "alpha" ) ) then
                func = AllInOneInventory_Change_Alpha;
                toggleFunc = false;
                local cols = 0;
                cols, params = AllInOneInventory_Extract_NextParameter(params);
                cols = tonumber(cols);
                if ( not cols ) then
                        AllInOneInventory_CommandUsage();
                        return;
                else
                        return func(1, cols);
                end
        elseif ( strfind( commandName, "scale" ) ) or ( strfind( commandName, "size" ) ) then
                func = AllInOneInventory_Change_Scale;
                toggleFunc = false;
                local cols = 0;
                cols, params = AllInOneInventory_Extract_NextParameter(params);
                cols = tonumber(cols);
                if ( not cols ) then
                        AllInOneInventory_CommandUsage();
                        return;
                else
                        return func(1, cols);
                end
        else
                AllInOneInventory_CommandUsage();
                return;
        end

        if ( toggleFunc ) then
                -- Toggle appropriately
                if ( (string.find(params, 'on')) or ((string.find(params, '1')) and (not string.find(params, '-1')) ) ) then
                        func(1);
                else
                        if ( (string.find(params, 'off')) or (string.find(params, '0')) ) then
                                func(0);
                        else
                                func(-1);
                        end
                end
        else
                func();
        end
end

function UseAllInOneInventoryItem(id)
        local b,s = AllInOneInventory_GetIdAsBagSlot(id);
        if ( ( b > -1 ) and ( s > -1 ) ) then
                return AllInOneInventory_Saved_UseContainerItem(b, s);
        end
        return false;
end

-- Does things with the hooked function
function AllInOneInventory_UseContainerItem(bag, slot)
        if ( not slot ) then
                local b,s = AllInOneInventory_GetIdAsBagSlot(bag);
                if ( ( b > -1 ) and ( s > -1 ) ) then
                        return AllInOneInventory_Saved_UseContainerItem(b, s);
                end
        end
        return AllInOneInventory_Saved_UseContainerItem(bag, slot);
end

AllInOneInventory_ContainerFrames = {
        [1] = "ContainerFrame1",
        [2] = "ContainerFrame2",
        [3] = "ContainerFrame3",
        [4] = "ContainerFrame4",
        [5] = "ContainerFrame5",
        [6] = "ContainerFrame6",
        [7] = "ContainerFrame7",
        [8] = "ContainerFrame8",
        [9] = "ContainerFrame9",
        [10] = "ContainerFrame10",
        [11] = "ContainerFrame11",
};

function AllInOneInventory_ToggleBackpack()
        if ( AllInOneInventory_ReplaceBags == 1 ) then
                if ( AllInOneInventoryFrame:IsVisible() ) then
                        local frame = nil;
                        local frameName = nil;
                        for i=1, NUM_CONTAINER_FRAMES, 1 do
                                frameName = AllInOneInventory_ContainerFrames[i];
                                if ( not frameName ) then frameName = "ContainerFrame"..i; end
                                frame = getglobal(frameName);
                                if ( frame:IsVisible() ) then
                                        frame:Hide();
                                end
                        end
                        CloseAllInOneInventoryFrame();
                else
                        OpenAllInOneInventoryFrame();
                end
        else
                AllInOneInventory_Saved_ToggleBackpack()
        end
        AllInOneInventory_UpdateBagState();
end

function AllInOneInventory_BagSlotButton_OnClick()
        AllInOneInventory_Saved_BagSlotButton_OnClick()
        AllInOneInventory_UpdateBagState();
end

function AllInOneInventory_BagSlotButton_OnDrag()
        AllInOneInventory_Saved_BagSlotButton_OnDrag()
        AllInOneInventory_UpdateBagState();
end

function AllInOneInventory_BackpackButton_OnClick()
        AllInOneInventory_Saved_BackpackButton_OnClick()
        AllInOneInventory_UpdateBagState();
end

function AllInOneInventory_OpenBackpack()
        if ( AllInOneInventory_ReplaceBags == 1 ) then
                OpenAllInOneInventoryFrame();
                return;
        end
        AllInOneInventory_Saved_OpenBackpack();
        AllInOneInventory_UpdateBagState();
end

function AllInOneInventory_CloseBackpack()
        if ( AllInOneInventory_ReplaceBags == 1 ) then
                CloseAllInOneInventoryFrame();
                return;
        end
        AllInOneInventory_Saved_CloseBackpack();
        AllInOneInventory_UpdateBagState();
end

function AllInOneInventory_IsShotBag(bag)
        if ( bag < 0 ) or ( bag > 4 ) then
                return false;
        end
        local name = "MainMenuBarBackpackButton";
        if ( bag > 0 ) then
                name = "CharacterBag"..(bag-1).."Slot";
        end
        local objCount = getglobal(name.."Count");
        if ( objCount ) and ( objCount:IsVisible() ) then
                local tmp = objCount:GetText();
                if ( ( tmp ) and ( strlen(tmp) > 0) ) then
                        return true;
                end
        end
        return false;
end

function AllInOneInventory_ShouldIncludeBag(bag)
        if ( ( bag >= 0 ) and ( bag <= 4 ) ) then
                if ( getglobal(AllInOneInventory_BagsToInclude[bag]) ~= 1 ) then
                        return false;
                end
                if ( ( AllInOneInventory_IncludeShotBags == 1 ) or ( not AllInOneInventory_IsShotBag(bag) ) ) then
                        return true;
                else
                        return false;
                end
                return true;
        end
        return false;
end


function AllInOneInventory_ShouldOverrideBag(bag)
        if ( AllInOneInventory_ReplaceBags == 1 ) then
                if ( AllInOneInventory_ShouldIncludeBag(bag) ) then
                        return true;
                else
                        return false;
                end
        else
                return false;
        end
end

function AllInOneInventory_ToggleBag(bag)
        if ( AllInOneInventory_ShouldOverrideBag(bag) ) then
                ToggleAllInOneInventoryFrame();
                return;
        else
                AllInOneInventory_Saved_ToggleBag(bag);
                AllInOneInventory_UpdateBagState();
        end
end

function AllInOneInventory_CloseBag(bag)
        if ( AllInOneInventory_ShouldOverrideBag(bag) ) then
                return;
        else
                AllInOneInventory_Saved_CloseBag(bag);
                AllInOneInventory_UpdateBagState();
        end
end

function AllInOneInventory_OpenBag(bag)
        if ( AllInOneInventory_ShouldOverrideBag(bag) ) then
                return;
        else
                AllInOneInventory_Saved_OpenBag(bag)
                AllInOneInventory_UpdateBagState();
        end
end

-- Hooks/unhooks functions. If toggle is 1, hooks functions, otherwise it unhooks functions.
--  Hooking functions mean that you replace them with your own functions and then call the
--  original function at your leisure.
function AllInOneInventory_Setup_Hooks(toggle)
        if ( toggle == 1 ) then
                if ( DepositBox_RefreshWindows ) and ( AllInOneInventory_Saved_DepositBox_RefreshWindows ~= DepositBox_RefreshWindows ) and ( AllInOneInventory_Saved_DepositBox_RefreshWindows == nil ) then
                        AllInOneInventory_Saved_DepositBox_RefreshWindows = DepositBox_RefreshWindows;
                        DepositBox_RefreshWindows = AllInOneInventory_DepositBox_RefreshWindows;
                end
                if ( SellValue_OnShow ) and ( SellValue_OnShow ~= AllInOneInventory_SellValue_OnShow ) and (AllInOneInventory_Saved_SellValue_OnShow == nil) then
                        AllInOneInventory_Saved_SellValue_OnShow = SellValue_OnShow;
                        SellValue_OnShow = AllInOneInventory_SellValue_OnShow;
                end
                if ( ( UseContainerItem ~= AllInOneInventory_UseContainerItem ) and (AllInOneInventory_Saved_UseContainerItem == nil) ) then
                        AllInOneInventory_Saved_UseContainerItem = UseContainerItem;
                        UseContainerItem = AllInOneInventory_UseContainerItem;
                end
                if ( ( ToggleBag ~= AllInOneInventory_ToggleBag ) and (AllInOneInventory_Saved_ToggleBag == nil) ) then
                        AllInOneInventory_Saved_ToggleBag = ToggleBag;
                        ToggleBag = AllInOneInventory_ToggleBag;
                end
                if ( ( CloseBag ~= AllInOneInventory_CloseBag ) and (AllInOneInventory_Saved_CloseBag == nil) ) then
                        AllInOneInventory_Saved_CloseBag = CloseBag;
                        CloseBag = AllInOneInventory_CloseBag;
                end
                if ( ( OpenBag ~= AllInOneInventory_OpenBag ) and (AllInOneInventory_Saved_OpenBag == nil) ) then
                        AllInOneInventory_Saved_OpenBag = OpenBag;
                        OpenBag = AllInOneInventory_OpenBag;
                end
                if ( ( ToggleBackpack ~= AllInOneInventory_ToggleBackpack ) and (AllInOneInventory_Saved_ToggleBackpack == nil) ) then
                        AllInOneInventory_Saved_ToggleBackpack = ToggleBackpack;
                        ToggleBackpack = AllInOneInventory_ToggleBackpack;
                end
                if ( ( CloseBackpack ~= AllInOneInventory_CloseBackpack ) and (AllInOneInventory_Saved_CloseBackpack == nil) ) then
                        AllInOneInventory_Saved_CloseBackpack = CloseBackpack;
                        CloseBackpack = AllInOneInventory_CloseBackpack;
                end
                if ( ( OpenBackpack ~= AllInOneInventory_OpenBackpack ) and (AllInOneInventory_Saved_OpenBackpack == nil) ) then
                        AllInOneInventory_Saved_OpenBackpack = OpenBackpack;
                        OpenBackpack = AllInOneInventory_OpenBackpack;
                end
                if ( ( BagSlotButton_OnClick ~= AllInOneInventory_BagSlotButton_OnClick ) and (AllInOneInventory_Saved_BagSlotButton_OnClick == nil) ) then
                        AllInOneInventory_Saved_BagSlotButton_OnClick = BagSlotButton_OnClick;
                        BagSlotButton_OnClick = AllInOneInventory_BagSlotButton_OnClick;
                end
                if ( ( BagSlotButton_OnDrag ~= AllInOneInventory_BagSlotButton_OnDrag ) and (AllInOneInventory_Saved_BagSlotButton_OnDrag == nil) ) then
                        AllInOneInventory_Saved_BagSlotButton_OnDrag = BagSlotButton_OnDrag;
                        BagSlotButton_OnDrag = AllInOneInventory_BagSlotButton_OnDrag;
                end
                if ( ( BackpackButton_OnClick ~= AllInOneInventory_BackpackButton_OnClick ) and (AllInOneInventory_Saved_BackpackButton_OnClick == nil) ) then
                        AllInOneInventory_Saved_BackpackButton_OnClick = BackpackButton_OnClick;
                        BackpackButton_OnClick = AllInOneInventory_BackpackButton_OnClick;
                end
                if ( ( CloseAllWindows ~= AllInOneInventory_CloseAllWindows ) and (AllInOneInventory_Saved_CloseAllWindows == nil) ) then
                        AllInOneInventory_Saved_CloseAllWindows = CloseAllWindows;
                        CloseAllWindows = AllInOneInventory_CloseAllWindows;
                end
                if ( ( OpenAllBags ~= AllInOneInventory_OpenAllBags ) and (AllInOneInventory_Saved_OpenAllBags == nil) ) then
                        AllInOneInventory_Saved_OpenAllBags = OpenAllBags;
                        OpenAllBags = AllInOneInventory_OpenAllBags;
                end
        else
                if ( DepositBox_RefreshWindows == AllInOneInventory_Saved_DepositBox_RefreshWindows ) then
                        AllInOneInventory_Saved_DepositBox_RefreshWindows = DepositBox_RefreshWindows;
                        DepositBox_RefreshWindows = AllInOneInventory_DepositBox_RefreshWindows;
                end
                if ( SellValue_OnShow == AllInOneInventory_SellValue_OnShow) then
                        SellValue_OnShow = AllInOneInventory_Saved_SellValue_OnShow;
                        AllInOneInventory_Saved_SellValue_OnShow = nil;
                end
                if ( UseContainerItem == AllInOneInventory_UseContainerItem) then
                        UseContainerItem = AllInOneInventory_Saved_UseContainerItem;
                        AllInOneInventory_Saved_UseContainerItem = nil;
                end
                if ( ToggleBag == AllInOneInventory_ToggleBag) then
                        ToggleBag = AllInOneInventory_Saved_ToggleBag;
                        AllInOneInventory_Saved_ToggleBag = nil;
                end
                if ( CloseBag == AllInOneInventory_CloseBag) then
                        CloseBag = AllInOneInventory_Saved_CloseBag;
                        AllInOneInventory_Saved_CloseBag = nil;
                end
                if ( OpenBag == AllInOneInventory_OpenBag) then
                        OpenBag = AllInOneInventory_Saved_OpenBag;
                        AllInOneInventory_Saved_OpenBag = nil;
                end
                if ( ToggleBackpack == AllInOneInventory_ToggleBackpack) then
                        ToggleBackpack = AllInOneInventory_Saved_ToggleBackpack;
                        AllInOneInventory_Saved_ToggleBackpack = nil;
                end
                if ( CloseBackpack == AllInOneInventory_CloseBackpack) then
                        CloseBackpack = AllInOneInventory_Saved_CloseBackpack;
                        AllInOneInventory_Saved_CloseBackpack = nil;
                end
                if ( OpenBackpack == AllInOneInventory_OpenBackpack) then
                        OpenBackpack = AllInOneInventory_Saved_OpenBackpack;
                        AllInOneInventory_Saved_OpenBackpack = nil;
                end
                if ( BagSlotButton_OnClick == AllInOneInventory_BagSlotButton_OnClick) then
                        BagSlotButton_OnClick = AllInOneInventory_Saved_BagSlotButton_OnClick;
                        AllInOneInventory_Saved_BagSlotButton_OnClick = nil;
                end
                if ( BagSlotButton_OnDrag == AllInOneInventory_BagSlotButton_OnDrag) then
                        BagSlotButton_OnDrag = AllInOneInventory_Saved_BagSlotButton_OnDrag;
                        AllInOneInventory_Saved_BagSlotButton_OnDrag = nil;
                end
                if ( BackpackButton_OnClick == AllInOneInventory_BackpackButton_OnClick) then
                        BackpackButton_OnClick = AllInOneInventory_Saved_BackpackButton_OnClick;
                        AllInOneInventory_Saved_BackpackButton_OnClick = nil;
                end
                if ( CloseAllWindows == AllInOneInventory_CloseAllWindows) then
                        CloseAllWindows = AllInOneInventory_Saved_CloseAllWindows;
                        AllInOneInventory_Saved_CloseAllWindows = nil;
                end
                if ( OpenAllBags == AllInOneInventory_OpenAllBags) then
                        OpenAllBags = AllInOneInventory_Saved_OpenAllBags;
                        AllInOneInventory_Saved_OpenAllBags = nil;
                end
        end
end

-- Handles events
function AllInOneInventoryScriptFrame_OnEvent(event)
        if ( event == "PLAYER_LOGIN" ) then
                local value = getglobal("AllInOneInventory_Enabled");
                if (value == nil ) then
                        -- defaults to off
                        value = 0;
                end
                AllInOneInventory_Toggle_Enabled(value);
                local value = getglobal("AllInOneInventory_ReplaceBags");
                if (value == nil ) then
                        -- defaults to off
                        value = 0;
                end
                AllInOneInventory_Toggle_ReplaceBags(value);
                local value = getglobal("AllInOneInventory_SwapBagOrder");
                if (value == nil ) then
                        -- defaults to off
                        value = 0;
                end
                AllInOneInventory_Toggle_SwapBagOrder(value);
                local value = getglobal("AllInOneInventory_Alpha");
                if (value == nil ) then
                        -- defaults to off
                        value = 0;
                end
                AllInOneInventory_Change_Alpha(1, value);
                local value = getglobal("AllInOneInventory_Scale");
                if (value == nil ) then
                        -- defaults to off
                        value = 0;
                end
                AllInOneInventory_Change_Scale(1, value);
                local value = getglobal("AllInOneInventory_IncludeShotBags");
                if (value == nil ) then
                        -- defaults to off
                        value = 1;
                end
                AllInOneInventory_Toggle_IncludeShotBags(value);
                local value = getglobal("AllInOneInventory_Columns");
                if (value == nil ) or ( value <= 0 ) then
                        -- defaults to 8
                        value = ALLINONEINVENTORY_NUM_COLUMNS;
                end
                AllInOneInventory_Change_Columns(1, value);
                local func = nil;
                for k, v in AllInOneInventory_BagStringIndex do
                        func = getglobal(string.format("AllInOneInventory_Toggle_IncludeBag%s", v));
                        value = getglobal(string.format("AllInOneInventory_IncludeBag%s", v));
                        if ( not value ) then
                                value = 1;
                        end
                        if ( func ) then
                                func(value);
                        end
                end
                local value = AllInOneInventory_Locked;
                if ( not value ) or ( value <= 0 ) then
                        -- defaults to off
                        value = 0;
                end
                AllInOneInventory_Toggle_Locked(value);
        elseif ( event == "ADDON_LOADED" ) then
                if ( IsAddOnLoaded("DepositBox") ) then
                end
                AllInOneInventory_Setup_Hooks(1);
        end
end

-- Toggles the enabled/disabled state of an option and returns the new state
--  if toggle is 1, it's enabled
--  if toggle is 0, it's disabled
--   otherwise, it's toggled
function AllInOneInventory_Generic_Toggle(toggle, variableName, enableMessage, disableMessage, CosmosVarName)
        local oldvalue = getglobal(variableName);
        local newvalue = toggle;
        if ( ( toggle ~= 1 ) and ( toggle ~= 0 ) ) then
                if (oldvalue == 1) then
                        newvalue = 0;
                elseif ( oldvalue == 0 ) then
                        newvalue = 1;
                else
                        newvalue = 0;
                end
        end
        setglobal(variableName, newvalue);
        if ( newvalue ~= oldvalue ) then
                local text = "";
                if ( newvalue == 1 ) then
                        if ( enableMessage ) then
                                text = TEXT(getglobal(enableMessage));
                        end
                else
                        if ( disableMessage ) then
                                text = TEXT(getglobal(disableMessage));
                        end
                end
                if ( text ) and ( strlen(text) > 0 ) then
                        AllInOneInventory_Print(text);
                end
        end
        return newvalue;
end

-- Toggles the enabled/disabled state of the AllInOneInventory
--  if toggle is 1, it's enabled
--  if toggle is 0, it's disabled
--   otherwise, it's toggled
function AllInOneInventory_Toggle_Enabled(toggle)
        AllInOneInventory_DoToggle_Enabled(toggle, true);
end

-- does the actual toggling
function AllInOneInventory_DoToggle_Enabled(toggle, showText)
        local newvalue = 0;
        if ( showText ) then
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_Enabled", "ALLINONEINVENTORY_CHAT_ENABLED", "ALLINONEINVENTORY_CHAT_DISABLED");
        else
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_Enabled");
        end
end

-- toggling - no text
function AllInOneInventory_Toggle_Enabled_NoChat(toggle)
        AllInOneInventory_DoToggle_Enabled(toggle, false);
end

function AllInOneInventory_Toggle_Enabled(toggle)
        AllInOneInventory_DoToggle_Enabled(toggle, true);
end

-- does the actual toggling
function AllInOneInventory_DoToggle_ReplaceBags(toggle, showText)
        local newvalue = 0;
        if ( showText ) then
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_ReplaceBags", "ALLINONEINVENTORY_CHAT_REPLACEBAGS_ENABLED", "ALLINONEINVENTORY_CHAT_REPLACEBAGS_DISABLED");
        else
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_ReplaceBags");
        end
        if ( newvalue == 1 ) then
                AllInOneInventory_Saved_CloseBackpack();
        end
end

-- toggling - no text
function AllInOneInventory_Toggle_ReplaceBags_NoChat(toggle)
        AllInOneInventory_DoToggle_ReplaceBags(toggle, false);
end

function AllInOneInventory_Toggle_ReplaceBags(toggle)
        AllInOneInventory_DoToggle_ReplaceBags(toggle, true);
end

-- does the actual toggling
function AllInOneInventory_DoToggle_IncludeShotBags(toggle, showText)
        local newvalue = 0;
        if ( showText ) then
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_IncludeShotBags", "ALLINONEINVENTORY_CHAT_INCLUDE_SHOTBAGS_ENABLED", "ALLINONEINVENTORY_CHAT_INCLUDE_SHOTBAGS_DISABLED");
        else
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_IncludeShotBags");
        end
        local frame = getglobal("AllInOneInventoryFrame");
        if ( frame ) then
                AllInOneInventoryFrame_Update(frame);
                AllInOneInventory_UpdateBagState();
        end
end

-- toggling - no text
function AllInOneInventory_Toggle_IncludeShotBags_NoChat(toggle)
        AllInOneInventory_DoToggle_IncludeShotBags(toggle, false);
end

function AllInOneInventory_Toggle_IncludeShotBags(toggle)
        AllInOneInventory_DoToggle_IncludeShotBags(toggle, true);
end

-- does the actual toggling
function AllInOneInventory_DoToggle_IncludeBagZero(toggle, showText)
        local newvalue = 0;
        if ( showText ) then
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_IncludeBagZero", "ALLINONEINVENTORY_CHAT_INCLUDE_BAGZERO_ENABLED", "ALLINONEINVENTORY_CHAT_INCLUDE_BAGZERO_DISABLED");
        else
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_IncludeBagZero");
        end
        local frame = getglobal("AllInOneInventoryFrame");
        if ( frame ) then
                AllInOneInventoryFrame_Update(frame);
                AllInOneInventory_UpdateBagState();
        end
end

-- toggling - no text
function AllInOneInventory_Toggle_IncludeBagZero_NoChat(toggle)
        AllInOneInventory_DoToggle_IncludeBagZero(toggle, false);
end

function AllInOneInventory_Toggle_IncludeBagZero(toggle)
        AllInOneInventory_DoToggle_IncludeBagZero(toggle, true);
end

-- does the actual toggling
function AllInOneInventory_DoToggle_IncludeBagOne(toggle, showText)
        local newvalue = 0;
        if ( showText ) then
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_IncludeBagOne", "ALLINONEINVENTORY_CHAT_INCLUDE_BAGONE_ENABLED", "ALLINONEINVENTORY_CHAT_INCLUDE_BAGONE_DISABLED");
        else
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_IncludeBagOne");
        end
        local frame = getglobal("AllInOneInventoryFrame");
        if ( frame ) then
                AllInOneInventoryFrame_Update(frame);
                AllInOneInventory_UpdateBagState();
        end
end

-- toggling - no text
function AllInOneInventory_Toggle_IncludeBagOne_NoChat(toggle)
        AllInOneInventory_DoToggle_IncludeBagOne(toggle, false);
end

function AllInOneInventory_Toggle_IncludeBagOne(toggle)
        AllInOneInventory_DoToggle_IncludeBagOne(toggle, true);
end

-- does the actual toggling
function AllInOneInventory_DoToggle_IncludeBagTwo(toggle, showText)
        local newvalue = 0;
        if ( showText ) then
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_IncludeBagTwo", "ALLINONEINVENTORY_CHAT_INCLUDE_BAGTWO_ENABLED", "ALLINONEINVENTORY_CHAT_INCLUDE_BAGTWO_DISABLED");
        else
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_IncludeBagTwo");
        end
        local frame = getglobal("AllInOneInventoryFrame");
        if ( frame ) then
                AllInOneInventoryFrame_Update(frame);
                AllInOneInventory_UpdateBagState();
        end
end

-- toggling - no text
function AllInOneInventory_Toggle_IncludeBagTwo_NoChat(toggle)
        AllInOneInventory_DoToggle_IncludeBagTwo(toggle, false);
end

function AllInOneInventory_Toggle_IncludeBagTwo(toggle)
        AllInOneInventory_DoToggle_IncludeBagTwo(toggle, true);
end

-- does the actual toggling
function AllInOneInventory_DoToggle_IncludeBagThree(toggle, showText)
        local newvalue = 0;
        if ( showText ) then
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_IncludeBagThree", "ALLINONEINVENTORY_CHAT_INCLUDE_BAGTHREE_ENABLED", "ALLINONEINVENTORY_CHAT_INCLUDE_BAGTHREE_DISABLED");
        else
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_IncludeBagThree");
        end
        local frame = getglobal("AllInOneInventoryFrame");
        if ( frame ) then
                AllInOneInventoryFrame_Update(frame);
                AllInOneInventory_UpdateBagState();
        end
end

-- toggling - no text
function AllInOneInventory_Toggle_IncludeBagThree_NoChat(toggle)
        AllInOneInventory_DoToggle_IncludeBagThree(toggle, false);
end

function AllInOneInventory_Toggle_IncludeBagThree(toggle)
        AllInOneInventory_DoToggle_IncludeBagThree(toggle, true);
end

-- does the actual toggling
function AllInOneInventory_DoToggle_IncludeBagFour(toggle, showText)
        local newvalue = 0;
        if ( showText ) then
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_IncludeBagFour", "ALLINONEINVENTORY_CHAT_INCLUDE_BAGFOUR_ENABLED", "ALLINONEINVENTORY_CHAT_INCLUDE_BAGFOUR_DISABLED");
        else
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_IncludeBagFour");
        end
        local frame = getglobal("AllInOneInventoryFrame");
        if ( frame ) then
                AllInOneInventoryFrame_Update(frame);
                AllInOneInventory_UpdateBagState();
        end
end

-- toggling - no text
function AllInOneInventory_Toggle_IncludeBagFour_NoChat(toggle)
        AllInOneInventory_DoToggle_IncludeBagFour(toggle, false);
end

function AllInOneInventory_Toggle_IncludeBagFour(toggle)
        AllInOneInventory_DoToggle_IncludeBagFour(toggle, true);
end


function AllInOneInventory_Generic_Number(value, variableName, message, formatValueMessage)
        local oldvalue = getglobal(variableName);
        local newvalue = value;
        if ( type(newvalue) ~= "number" ) then
                newvalue = tonumber(oldvalue);
                if ( not newvalue ) then
                        return;
                end
        end
        setglobal(variableName, newvalue);
        if ( newvalue ~= oldvalue ) then
                local text = nil;
                if ( formatValueMessage ) then
                        text = format(TEXT(getglobal(formatValueMessage)), newvalue);
                elseif ( message ) then
                        text = TEXT(getglobal(formatValueMessage));
                end
                if ( text ) and ( strlen(text) > 0 ) then
                        AllInOneInventory_Print(text);
                end
        end
        return newvalue;
end

function AllInOneInventory_Generic_Value(value, variableName, message, formatValueMessage)
        local oldvalue = getglobal(variableName);
        local newvalue = value;
        setglobal(variableName, newvalue);
        if ( newvalue ~= oldvalue ) then
                local text = nil;
                if ( formatValueMessage ) then
                        text = format(TEXT(getglobal(formatValueMessage)), newvalue);
                elseif ( message ) then
                        text = TEXT(getglobal(formatValueMessage));
                end
                if ( text ) and ( strlen(text) > 0 ) then
                        AllInOneInventory_Print(text);
                end
        end
        return newvalue;
end

-- does the actual setting
function AllInOneInventory_DoChange_Columns(value, showText)
        local newvalue = 0;
        if ( showText ) then
                newvalue = AllInOneInventory_Generic_Number(value, "AllInOneInventory_Columns", nil, "ALLINONEINVENTORY_CHAT_COLUMNS_FORMAT");
        else
                newvalue = AllInOneInventory_Generic_Number(value, "AllInOneInventory_Columns");
        end
        AllInOneInventoryFrame_SetColumns(newvalue);
end

-- toggling - no text
function AllInOneInventory_Change_Columns_NoChat(toggle, value)
        AllInOneInventory_DoChange_Columns(value, false);
end

function AllInOneInventory_Change_Columns(toggle, value)
        AllInOneInventory_DoChange_Columns(value, true);
end

function AllInOneInventory_DoToggle_SwapBagOrder(toggle, showText)
        local newvalue = 0;
        if ( showText ) then
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_SwapBagOrder", "ALLINONEINVENTORY_CHAT_SWAP_BAG_ORDER_ENABLED", "ALLINONEINVENTORY_CHAT_SWAP_BAG_ORDER_DISABLED");
        else
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_SwapBagOrder");
        end
end

function AllInOneInventory_Toggle_SwapBagOrder_NoChat(toggle)
        AllInOneInventory_DoToggle_SwapBagOrder(toggle, false);
end

function AllInOneInventory_Toggle_SwapBagOrder(toggle)
        AllInOneInventory_DoToggle_SwapBagOrder(toggle, true);
end


function AllInOneInventoryFrame_SetAlpha(alpha)
        if ( not alpha ) then
                return;
        end
        if ( type(alpha) ~= "number" ) then
                alpha = tonumber(alpha);
                if ( not alpha ) then
                        return;
                end
        end
        if ( alpha > ALLINONEINVENTORY_ALPHA_MAX ) then
                alpha = ALLINONEINVENTORY_ALPHA_MAX;
        end
        if ( alpha <= ALLINONEINVENTORY_ALPHA_MIN ) then
                local parentAlpha = 1;
                if ( UIParent ) and ( UIParent.GetAlpha ) then
                        parentAlpha = UIParent:GetAlpha();
                        if ( not parentAlpha ) then
                                parentAlpha = 1;
                        end
                end
                if ( parentAlpha ) then
                        alpha = parentAlpha;
                end
        end
        if ( not alpha ) then
                return;
        end
        AllInOneInventoryFrame:SetAlpha(alpha);
end


function AllInOneInventory_DoChange_Alpha(value, showText)
        local newvalue = 0;
        if ( showText ) then
                newvalue = AllInOneInventory_Generic_Number(value, "AllInOneInventory_Alpha", nil, "ALLINONEINVENTORY_CHAT_ALPHA_FORMAT");
        else
                newvalue = AllInOneInventory_Generic_Number(value, "AllInOneInventory_Alpha");
        end
        AllInOneInventoryFrame_SetAlpha(newvalue);
end

-- toggling - no text
function AllInOneInventory_Change_Alpha_NoChat(toggle, value)
        AllInOneInventory_DoChange_Alpha(value, false);
end

function AllInOneInventory_Change_Alpha(toggle, value)
        AllInOneInventory_DoChange_Alpha(value, true);
end

function AllInOneInventoryFrame_SetScale(scale)
        if ( not scale ) then
                return;
        end
        if ( type(scale) ~= "number" ) then
                scale = tonumber(scale);
                if ( not scale ) then
                        return;
                end
        end
        if ( scale > ALLINONEINVENTORY_SCALE_MAX ) then
                scale = ALLINONEINVENTORY_SCALE_MAX;
        end
        if ( scale <= ALLINONEINVENTORY_SCALE_MIN ) then
                scale = 1;
                -- Since patch 1.9, scales are relative to parent.
                -- The code block below is not necessary
                --[[
                local parentScale = 1;
                if ( UIParent ) and ( UIParent.GetScale ) then
                        parentScale = UIParent:GetScale();
                        if ( not parentScale ) then
                                parentScale = 1;
                        end
                end
                if ( parentScale ) then
                        scale = parentScale;
                end
                ]]--
        end
        if ( not scale ) then
                return;
        end
        AllInOneInventoryFrame:SetScale(scale);
end


function AllInOneInventory_DoChange_Scale(value, showText)
        local newvalue = 1;
        if ( showText ) then
                newvalue = AllInOneInventory_Generic_Number(value, "AllInOneInventory_Scale", nil, "ALLINONEINVENTORY_CHAT_SCALE_FORMAT");
        else
                newvalue = AllInOneInventory_Generic_Number(value, "AllInOneInventory_Scale");
        end
        AllInOneInventoryFrame_SetScale(newvalue);
end

-- toggling - no text
function AllInOneInventory_Change_Scale_NoChat(toggle, value)
        AllInOneInventory_DoChange_Scale(value, false);
end

function AllInOneInventory_Change_Scale(toggle, value)
        AllInOneInventory_DoChange_Scale(value, true);
end


-- Prints out text to a chat box.
function AllInOneInventory_Print(msg,r,g,b,frame,id,unknown4th)
        if (not r) then r = 1.0; end
        if (not g) then g = 1.0; end
        if (not b) then b = 0.0; end
        if ( Print ) then
                Print(msg, r, g, b, frame, id, unknown4th);
                return;
        end
        if(unknown4th) then
                local temp = id;
                id = unknown4th;
                unknown4th = id;
        end

        if ( frame ) then
                frame:AddMessage(msg,r,g,b,id,unknown4th);
        else
                if ( DEFAULT_CHAT_FRAME ) then
                        DEFAULT_CHAT_FRAME:AddMessage(msg, r, g, b,id,unknown4th);
                end
        end
end

function AllInOneInventory_IsBagOpen(id)
        local formatStr = "ContainerFrame%d";
        local frame = nil;
        for i = 1, NUM_CONTAINER_FRAMES do
                frame = getglobal(format(formatStr, i));
                if ( ( frame ) and ( frame:IsVisible() ) and ( frame:GetID() == id ) ) then
                        return true;
                end
        end
        return false;
end

function AllInOneInventory_GetBagState(bag, baseToggle)
        if ( AllInOneInventory_ShouldOverrideBag(bag) ) then
                local toggle = (AllInOneInventory_IsBagOpen(bag) or baseToggle);
                if ( ( toggle == true ) or ( toggle == 1 ) ) then
                        return 1;
                else
                        return 0;
                end
        else
                if ( AllInOneInventory_IsBagOpen(bag) ) then
                        return 1;
                else
                        return 0;
                end
        end
end

function AllInOneInventory_UpdateBagState()
        local shouldBeChecked = AllInOneInventoryFrame:IsVisible();
        MainMenuBarBackpackButton:SetChecked(AllInOneInventory_GetBagState(0, shouldBeChecked));
        local bagButton = nil;
        local formatStr = "CharacterBag%dSlot";
        for i = 0, 3 do
                bagButton = getglobal(format(formatStr, i));
                if ( bagButton ) then
                        bagButton:SetChecked(AllInOneInventory_GetBagState(i+1, shouldBeChecked));
                end
        end
end

function ToggleAllInOneInventoryFrame()
        if ( AllInOneInventoryFrame:IsVisible() ) then
                CloseAllInOneInventoryFrame();
        else
                OpenAllInOneInventoryFrame();
        end
        AllInOneInventory_UpdateBagState();
end


function AllInOneInventory_CloseAllWindows(ignoreCenter)
        local wasVisible = AllInOneInventoryFrame:IsVisible();
        CloseAllInOneInventoryFrame();
        local realClosed = nil;
        if ( arg ) then
                realClosed = AllInOneInventory_Saved_CloseAllWindows(ignoreCenter);
        else
                realClosed = AllInOneInventory_Saved_CloseAllWindows();
        end
        if ( wasVisible ) then
                return 1;
        else
                return realClosed;
        end
end

function CloseAllInOneInventoryFrame()
        local value = false;
        local frame = getglobal("AllInOneInventoryFrame");
        if ( frame ) and ( frame:IsVisible() ) then
                frame:Hide();
                value = true;
        end
        AllInOneInventory_UpdateBagState();
        return value;
end

function OpenAllInOneInventoryFrame()
        local value = false;
        local frame = getglobal("AllInOneInventoryFrame");
        if ( frame ) then
                AllInOneInventoryFrame_Update(frame);
                if ( not frame:IsVisible() ) then
                        frame:Show();
                        value = true;
                end
        end
        AllInOneInventory_UpdateBagState();
        return value;
end

function AllInOneInventoryFrame_OnLoad()
        this:RegisterForClicks("LeftButtonUp", "RightButtonUp");
        --DynamicData.item.addOnInventoryUpdateHandler(AllInOneInventoryFrame_OnInventoryUpdate);
        --DynamicData.item.addOnInventoryCooldownUpdateHandler(AllInOneInventoryFrame_OnInventoryCooldownUpdate);
end

AllInOneInventoryFrame_LastInventoryUpdate = {};
ALLINONEINVENTORYFRAME_UPDATE_DELAY = 1;

function AllInOneInventoryFrame_OnInventoryUpdate(bag, scanType)
        local curTime = GetTime();
        local qwe = AllInOneInventoryFrame_LastInventoryUpdate[scanType];
        if ( not qwe ) then
                qwe = 0;
        end
        local fixTime = ALLINONEINVENTORYFRAME_UPDATE_DELAY - (curTime - qwe);
        if ( fixTime <= 0 ) then
                fixTime = 0.01;
        end
        AIOI_ScheduleByName("AIOI_INV_UPDATE_"..scanType, fixTime, AllInOneInventoryFrame_DoInventoryUpdate, bag, scanType);
end

function AllInOneInventoryFrame_DoInventoryUpdate(bag, scanType)
        AllInOneInventoryFrame_LastInventoryUpdate[scanType] = GetTime();
        local frame = getglobal("AllInOneInventoryFrame");
        local func = nil;
        if ( scanType ) then
                if ( ( scanType and DYNAMICDATA_ITEM_SCAN_TYPE_COOLDOWN ) > 0 ) then
                        func = getglobal("AllInOneInventoryFrame_UpdateAllCooldowns");
                end
                if ( ( scanType and DYNAMICDATA_ITEM_SCAN_TYPE_ITEMINFO ) > 0 ) then
                        func = getglobal("AllInOneInventoryFrame_Update");
                end
        else
                func = getglobal("AllInOneInventoryFrame_Update");
        end
        if ( ( frame ) and ( frame:IsVisible() ) ) then
                if ( func ) then
                        func(frame);
                end
        end
end

function AllInOneInventoryFrame_OnInventoryCooldownUpdate()
        local frame = getglobal("AllInOneInventoryFrame");
        if ( frame ) then
                AllInOneInventoryFrame_UpdateAllCooldowns(frame);
                if ( frame:IsVisible() ) then
                        --AllInOneInventoryFrame_Update(frame);
                end
        end
end


function AllInOneInventoryFrame_OnEvent(event)
end

function AllInOneInventoryFrame_OnHide()
        PlaySound("igBackPackClose");
        AllInOneInventory_StopMoving(this);
end

function AllInOneInventoryFrame_OnShow()
        AllInOneInventoryFrame_Update(this);
        PlaySound("igBackPackOpen");
end

function AllInOneInventoryFrame_UpdateAllCooldowns(frame)
        local name = frame:GetName();
        local itemInfo;
        local itemButton;
        local bag, slot;
        for buttonID = 1, ALLINONEINVENTORY_MAXIMUM_NUMBER_OF_BUTTONS do
                itemButton = getglobal(name.."Item"..buttonID);
                if ( itemButton ) and ( itemButton:IsVisible() ) then
                        bag, slot = AllInOneInventory_GetIdAsBagSlot(itemButton:GetID());
                        itemInfo = AllInOneInventoryItems_GetInfo(bag, slot);
                        if ( ( itemInfo ) and ( itemInfo.t ) and ( strlen(itemInfo.t) > 0 ) ) then
                                AllInOneInventoryFrame_UpdateCooldown(itemButton);
                        end
                end
        end
end

function AllInOneInventoryFrame_UpdateButton(frame, buttonID)
        local name = frame:GetName();
        local itemButton = getglobal(name.."Item"..buttonID);

        if ( not itemButton ) or ( not itemButton:IsVisible() ) then
                return;
        end

        local bag, slot = AllInOneInventory_GetIdAsBagSlot(itemButton:GetID());
        if ( bag == -1 ) and ( slot == -1 ) then
                return;
        end

        local itemInfo = AllInOneInventoryItems_GetInfo(bag, slot);

        if ( not itemInfo ) then
                itemInfo = AllInOneInventoryItems_NoItem;
        end

        SetItemButtonTexture(itemButton, itemInfo.t);
        SetItemButtonCount(itemButton, itemInfo.c);

        SetItemButtonDesaturated(itemButton, itemInfo.l, 0.5, 0.5, 0.5);

        if ( ( itemInfo.t ) and ( strlen(itemInfo.t) > 0 ) ) then
                AllInOneInventoryFrame_UpdateCooldown(itemButton);
        else
                local cooldownFrame = getglobal(itemButton:GetName().."Cooldown");
                if ( cooldownFrame ) then
                        cooldownFrame:Hide();
                end
        end

        local readable = itemInfo.r;
        --local normalTexture = getglobal(name.."Item"..j.."NormalTexture");
        --if ( quality and quality ~= -1) then
        --      local color = getglobal("ITEM_QUALITY".. quality .."_COLOR");
        --      normalTexture:SetVertexColor(color.r, color.g, color.b);
        --else
        --      normalTexture:SetVertexColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b);
        --end
        local showSell = nil;
        if ( GameTooltip:IsOwned(itemButton) ) then
                if ( itemInfo.t ) and ( strlen(itemInfo.t) > 0 ) then
                        AllInOneInventory_Patching_Tooltip = 1;
                        local hasCooldown, repairCost = GameTooltip:SetBagItem(bag, slot);
                        if ( hasCooldown ) then
                                itemButton.updateTooltip = TOOLTIP_UPDATE_TIME;
                        else
                                itemButton.updateTooltip = nil;
                        end
                        if ( ( InRepairMode() ) and ( repairCost ) and (repairCost > 0) ) then
                                GameTooltip:AddLine(TEXT(REPAIR_COST), "", 1, 1, 1);
                                SetTooltipMoney(GameTooltip, repairCost);
                                --GameTooltip:Show();
                        elseif ( MerchantFrame:IsVisible() and not locked) then
                                showSell = 1;
                        end
                        AllInOneInventory_ModifyItemTooltip(bag, slot, "GameTooltip");
                        AllInOneInventory_Patching_Tooltip = 0;
                else
                        GameTooltip:Hide();
                end
                if ( showSell ) then
                        ShowContainerSellCursor(bag, slot);
                elseif ( readable ) then
                        ShowInspectCursor();
                else
                        ResetCursor();
                end
        end
end

function AllInOneInventoryFrame_Update(frame)
        if ( not AllInOneInventoryFrame_UpdateLookIfNeeded() ) then
                for j=1, frame.size, 1 do
                        AllInOneInventoryFrame_UpdateButton(frame, j);
                end
        end
end

function AllInOneInventoryFrame_UpdateCooldown(button)
        local bag, slot = AllInOneInventory_GetIdAsBagSlot(button:GetID());
        if ( bag == -1 ) and ( slot == -1 ) then
                return;
        end

        local cooldownFrame = getglobal(button:GetName().."Cooldown");
        local itemInfo = AllInOneInventoryItems_GetInfo(bag, slot);
        local start, duration, enable = 0, 0, 1;
        if ( itemInfo ) then
                start, duration, enable = itemInfo.cs, itemInfo.cd, itemInfo.ce;
        end
        CooldownFrame_SetTimer(cooldownFrame, start, duration, enable);
        if ( ( duration > 0 ) and ( enable == 0 ) ) then
                SetItemButtonTextureVertexColor(button, 0.4, 0.4, 0.4);
        end
end

function AllInOneInventoryFrameItemButton_OnLoad()
        this:RegisterForClicks("LeftButtonUp", "RightButtonUp");
        this:RegisterForDrag("LeftButton");

        this.SplitStack = function(button, split)
                SplitContainerItem(button:GetParent():GetID(), button:GetID(), split);
        end
end

function AllInOneInventory_HandleQuickMount(bag, slot)
        if ( QuickMount_PickupItem ) then
                local itemInfo = AllInOneInventoryItems_GetInfo(bag, slot);
                if ( itemInfo ) and ( itemInfo.t ) and ( strlen(itemInfo.t) >= 0 ) then
                        QuickMount_PickupItem(bag, slot, itemInfo.n, itemInfo.t);
                end
        end
end

function AllInOneInventoryFrameItemButton_OnClick(button, ignoreShift)
        local bag, slot = AllInOneInventory_GetIdAsBagSlot(this:GetID());
        if ( LootDestroyer_DoItem_OnClick ) then
                if ( LootDestroyer_DoItem_OnClick(bag, slot, button, ignoreShift) ) then
                        return;
                end
        end
        if ( button == "LeftButton" ) then
                if ( IsShiftKeyDown() and not ignoreShift ) then
                        if ( ChatFrameEditBox:IsVisible() ) then
                                ChatFrameEditBox:Insert(GetContainerItemLink(bag, slot));
                        else
                                local itemInfo = AllInOneInventoryItems_GetInfo(bag, slot);
                                if ( itemInfo ) and ( not itemInfo.l ) then
                                        this.SplitStack = function(button, split)
                                                SplitContainerItem(bag, slot, split);
                                        end
                                        OpenStackSplitFrame(this.count, this, "BOTTOMRIGHT", "TOPRIGHT");
                                end
                        end
                elseif ( IsControlKeyDown() ) then
                        DressUpItemLink(GetContainerItemLink(bag, slot));
                else
                        AllInOneInventory_HandleQuickMount(bag, slot);
                        PickupContainerItem(bag, slot);
                end
        else
-- Modifier2Sell fixed by daun
                if ( MerchantFrame:IsVisible() ) and ( Modifier2Sell_BagSlotButton_OnClick ) then
                        if ( not Modifier2Sell_BagSlotButton_OnClick(button, ignoreShift, bag, slot) ) then
                                return;
                        end
                end
                if ( IsControlKeyDown() and not ignoreShift ) then
                        return;
                elseif ( IsShiftKeyDown() and MerchantFrame:IsVisible() and not ignoreShift ) then
                        this.SplitStack = function(button, split)
                                SplitContainerItem(bag, slot, split);
                                MerchantItemButton_OnClick("LeftButton");
                        end
                        OpenStackSplitFrame(this.count, this, "BOTTOMRIGHT", "TOPRIGHT");
                elseif ( MerchantFrame:IsVisible() and MerchantFrame.selectedTab == 2 ) then
                        -- Don't sell the item if the buyback tab is selected
                        return;
                else
                        UseContainerItem(bag, slot);
                        StackSplitFrame:Hide();
                end
   end 
end

function AllInOneInventoryFrameItemButton_OnEnter()
        AllInOneInventory_Patching_Tooltip = 1;
        local tooltip = GameTooltip;
        local bag, slot = AllInOneInventory_GetIdAsBagSlot(this:GetID());

        local itemInfo = AllInOneInventoryItems_GetInfo(bag, slot);
        if ( ( not itemInfo ) or ( not itemInfo.t ) or ( strlen(itemInfo.t) <= 0 ) ) then
                tooltip:Hide();
                return;
        end
        tooltip:SetOwner(this, "ANCHOR_LEFT");
        local hasCooldown, repairCost = GameTooltip:SetBagItem(bag, slot);
        if ( hasCooldown ) then
                this.updateTooltip = 1;
        else
                this.updateTooltip = nil;
        end
        if ( InRepairMode() and (repairCost and repairCost > 0) ) then
                tooltip:AddLine(TEXT(REPAIR_COST), "", 1, 1, 1);
                SetTooltipMoney(tooltip, repairCost);
                tooltip:Show();
        elseif ( MerchantFrame:IsVisible() ) then
                ShowContainerSellCursor(bag, slot);
                AllInOneInventoryFrame_RegisterCurrentTooltipSellValue(tooltip, bag, slot);
        elseif ( this.readable ) then
                ShowInspectCursor();
        end

        AllInOneInventory_ModifyItemTooltip(bag, slot, tooltip:GetName());
        AllInOneInventory_Patching_Tooltip = 0;
end

function AllInOneInventoryFrame_RegisterCurrentTooltipSellValue(tooltip, bag, slot)
        local itemInfo = AllInOneInventoryItems_GetInfo(bag, slot);
        if ( not itemInfo ) or ( not itemInfo.n ) or ( strlen(itemInfo.n) <= 0 ) then
                return;
        end
        if ( SellValue_SaveFor ) then
                local moneyFrame = getglobal(tooltip:GetName().."MoneyFrame");
                if ( moneyFrame ) and ( moneyFrame:IsVisible() ) and ( moneyFrame.staticMoney ) then
                        SellValue_SaveFor(bag, slot, itemInfo.n, moneyFrame.staticMoney);
                end
        end
        if ( LootLink_ProcessLinks ) then
                local link = GetContainerItemLink(bag, slot);
                local name = LootLink_ProcessLinks(link);
                if ( LootLink_VendorEntry_Hook ) then
                        local moneyFrame = getglobal(tooltip:GetName().."MoneyFrame");
                        if ( moneyFrame ) and ( moneyFrame:IsVisible() ) and ( moneyFrame.staticMoney ) then
                                if ( itemInfo.c ) and ( itemInfo.c > 0 ) then
                                        local money = moneyFrame.staticMoney / itemInfo.c;
                                        if ( ItemLinks[name] ) then
                                                if ( not ItemLinks[name].price ) and ( not ItemLinks[name].p ) then
                                                        ItemLinks[name].p = money;
                                                end
                                                --LootLink_VendorEntry_Hook(bag, slot, itemInfo.n, moneyFrame.staticMoney);
                                        end
                                end
                        else
                                local stringFormat = tooltip:GetName().."TextLeft%d";
                                local string = nil;
                                local text = nil;
                                for i = 2, 10 do
                                        string = getglobal(stringFormat, i);
                                        if ( string ) and ( string:IsVisible() ) then
                                                text = string:GetText();
                                                if ( text ) and ( text == TEXT(ITEM_UNSELLABLE) ) then
                                                        if ( ItemLinks[name] ) and ( ( ItemLinks[name].p ) or ( ItemLinks[name].price ) )  then
                                                                ItemLinks[name].p = nil;
                                                                ItemLinks[name].price = nil;
                                                        end
                                                end
                                        end
                                end

                        end
                end
        end
end

function AllInOneInventoryFrameItemButton_OnLeave()
        this.updateTooltip = nil;
        if ( GameTooltip:IsOwned(this) ) then
                GameTooltip:Hide();
                ResetCursor();
        end
end

-- modifies the tooltip
function AllInOneInventory_ModifyItemTooltip(bag, slot, tooltipName)
        if ( not tooltipName ) then
                tooltipName = "GameTooltip";
        end
        --AllInOneInventory_ReagentHelper_ModifyItemTooltip(bag, slot, tooltipName);
        AllInOneInventory_LootLink_ModifyItemTooltip(bag, slot, tooltipName);
        AllInOneInventory_SellValue_ModifyItemTooltip(bag, slot, tooltipName);
        local tooltip = getglobal(tooltipName);
        if ( not tooltip ) then
                return;
        end
        tooltip:Show();
end

function AllInOneInventory_SellValue_ModifyItemTooltip(bag, slot, tooltipName)
        local tooltip = getglobal(tooltipName);
        if ( not tooltip ) then
                return;
        end
        if ( not SellValue_AddMoneyToTooltip ) then
                return;
        end
        local itemInfo = AllInOneInventoryItems_GetInfo(bag, slot);

        if ( not SellValues ) or ( MerchantFrame:IsVisible() ) then
                return;
        end

        local itemName = nil;
        local itemCount = nil;
        if ( itemInfo ) then
                itemCount = itemInfo.c;
                if ( itemInfo.n ) then
                        if ( InvList_ShortenItemName ) then
                                itemName = InvList_ShortenItemName(itemInfo.n);
                        else
                                itemName = itemInfo.n;
                        end
                end
        end
        if ( not itemName ) or ( strlen(itemName) <= 0 ) then
                return;
        end
        if ( IsAddOnLoaded("SellValue") ) then
                -- Don't add a tooltip for hidden items for SellValue
                if ( not InvList_TooltipMode ) or
                        ( ( InvList_TooltipMode == 1 ) and ( InvList_HiddenItems ) and ( InvList_HiddenItems[itemName] ) ) then
                        return;
                end
        end

        local price = SellValues[itemName];

        if ( price ) then
                local linesAdded = 0;
                if ( price == 0 ) then
                        local msg = NOSELLPRICE;
                        if ( not msg ) then
                                msg = ITEM_UNSELLABLE;
                        end
                        tooltip:AddLine(msg, 1.0, 1.0, 0);
                        linesAdded = 1;
                else
                        tooltip:AddLine(SELLVALUE_COST, 1.0, 1.0, 0);
                        SetTooltipMoney(tooltip, price);
                        linesAdded = 2;
                end  -- if price > 0

                -- Adjust width to account for new lines
                if ( tooltip:GetWidth() < 120 ) then tooltip:SetWidth(120); end
        end  -- if price
end

function AllInOneInventory_LootLink_ModifyItemTooltip(bag, slot, tooltipName)
        local tooltip = getglobal(tooltipName);
        if ( not tooltip ) then
                tooltip = getglobal("GameTooltip");
                tooltipName = "GameTooltip";
        end
        if ( not tooltip ) then
                return false;
        end
        local shouldModify = true;
        if ( ( InRepairMode() ) or
                ( AllInOneInventory_ModifyTooltipsAtMerchant == 0 ) and ( MerchantFrame:IsVisible() ) ) then
                shouldModify = false;
        end
        if (
                ( LootLink_AddExtraTooltipInfo ) and
                ( shouldModify ) and ( ItemLinks ) ) then
                local itemInfo = AllInOneInventoryItems_GetInfo(bag, slot);
                local name = nil;
                if ( itemInfo ) and ( itemInfo.n ) then
                        name = itemInfo.n;
                end
                local data = ItemLinks[name];
                if ( ( not LootLinkState ) or ( not LootLinkState.HideInfo ) ) and ( name ) and ( data ) then
                        if ( itemInfo ) and ( itemInfo.t ) then
                                if ( AllInOneInventory_ShowPrice == 1 ) then
                                        local money = ItemLinks[name].p;
                                        if ( not money ) and ( ItemLinks[name].price ) then
                                                money = ItemLinks[name].price;
                                        end
                                        local stack = ItemLinks[name].x;
                                        if ( not stack ) and ( ItemLinks[name].stack ) then
                                                stack = ItemLinks[name].stack;
                                        end
                                        if ( money ) then
                                                AIOI_LootLink_SetTooltipMoney(tooltip, itemInfo.c, money, stack);
                                        end
                                end
                                LootLink_AddExtraTooltipInfo(tooltip, name, itemInfo.c, data);
                                --tooltip:Show();
                                if( tooltip == GameTooltip ) then
                                        GameTooltip.llDone = 1;
                                end
                        end
                end
        elseif ( ( LootLink_Tooltip_Hook ) and ( shouldModify ) and ( ItemLinks ) ) then
                local name = nil;
                local itemInfo = AllInOneInventoryItems_GetInfo(bag, slot);
                if ( itemInfo ) then
                        name = itemInfo.n;
                end
                if ( itemInfo ) and ( name ) and ( strlen(name) > 0 ) and ( ItemLinks[name] ) then
                        local data = ItemLinks[name];
                        local money = 0;
                        if ( data.p ) then
                                money = data.p;
                        elseif ( data.price ) then
                                money = data.price;
                        end
                        if ( not money ) then money = 0; end
                        local tooltip = getglobal(tooltipName);
                        if ( not tooltip ) then
                                return;
                        end
                        LootLink_Tooltip_Hook(tooltip, name, money, itemInfo.c, data);
                        --tooltip:Show();
                end
        end
end

function AllInOneInventory_ReagentHelper_ModifyItemTooltip(bag, slot, tooltipName)
        if ( ReagentHelper_ModifyTooltip ) then
                local shouldModifyTooltip = true;
                if ( Auctioneer_GetFilter ) then
                        if ( Auctioneer_GetFilter("all") ) and ( Auctioneer_GetFilter("usage") ) then
                                shouldModifyTooltip = false;
                        end
                end
                if ( shouldModifyTooltip ) then
                        ReagentHelper_ModifyTooltip(tooltipName);
                end
        else
                -- No Labels
        end
end

function AllInOneInventoryFrameItemButton_OnUpdate(elapsed)
        if ( not this.updateTooltip ) then
                return;
        end

        this.updateTooltip = this.updateTooltip - elapsed;
        if ( this.updateTooltip > 0 ) then
                return;
        end

        if ( GameTooltip:IsOwned(this) ) then
                AllInOneInventoryFrameItemButton_OnEnter();
        else
                this.updateTooltip = nil;
        end
end

function AllInOneInventoryFrame_UpdateLookIfNeeded()
        local slots = AllInOneInventory_GetBagsTotalSlots();
        local frame = getglobal("AllInOneInventoryFrame");
        if ( ( frame ) and ( not frame.size ) or ( slots ~= frame.size ) ) then
                AllInOneInventoryFrame_UpdateLook(frame, slots);
                return true;
        end
        return false;
end

function AllInOneInventoryFrame_SetColumns(col)
        if ( type(col) ~= "number" ) then
                col = tonumber(col);
        end
        if ( not col ) then
                return;
        end
        if ( ( col >= ALLINONEINVENTORY_COLUMNS_MIN )
                and ( col <= ALLINONEINVENTORY_COLUMNS_MAX )
                ) then
                AllInOneInventory_Columns = col;
                AllInOneInventoryFrame_UpdateLook(getglobal("AllInOneInventoryFrame"), AllInOneInventory_GetBagsTotalSlots());
        end
end

function AllInOneInventoryFrame_GetAppropriateHeight(rows)
        return ALLINONEINVENTORY_BASE_HEIGHT + ( ALLINONEINVENTORY_ROW_HEIGHT * rows );
end

function AllInOneInventoryFrame_GetAppropriateWidth(cols)
        return ALLINONEINVENTORY_BASE_WIDTH + ( ALLINONEINVENTORY_COL_WIDTH * cols );
end


AllInOneInventoryFrame_AnchorWidgetList = { "MainMenuBar"};

function AllInOneInventoryFrame_AddAnchorWidget(widgetName)
        table.insert(AllInOneInventoryFrame_AnchorWidgetList, widgetName);
end

function AllInOneInventoryFrame_GetAnchorWidget()
        local obj = nil;
        for k, v in AllInOneInventoryFrame_AnchorWidgetList do
                obj = getglobal(v);
                if ( obj ) and ( obj:IsVisible() ) then
                        return v;
                end
        end
        return "UIParent";
end

function AllInOneInventoryFrame_ResetButton()
        AllInOneInventoryFrame_ResetPosition(AllInOneInventoryFrame);
end

function AllInOneInventoryFrame_ResetPosition(frame)
        frame:ClearAllPoints();
        frame:SetPoint("CENTER", "UIParent", "CENTER");
end

function AllInOneInventoryFrame_ResetPositionOld(frame)
        local anchorWidgetName = AllInOneInventoryFrame_GetAnchorWidget();
        local anchorWidget = getglobal(anchorWidgetName);
        local anchorWidgetYOffset = 5;

        if ( anchorWidgetName == "UIParent" ) then
                anchorWidgetYOffset = 54;
        end

        local xPos = -17;

        if ( SideBarLeft_ShouldShiftBagFramesLeftOnShow ) then
                if ( ( SideBarLeft_ShouldShiftBagFramesLeftOnShow() ) and ( SideBar:IsVisible() ) ) then
                        local temp = UIParent:GetWidth() - anchorWidget:GetWidth();
                        if ( SideBarLeft_GetSafeOffset ) then
                                xPos = temp + SideBarLeft_GetSafeOffset();
                        else
                                xPos = temp;
                        end
                        if ( xPos > 0 ) then
                                xPos = 1-xPos;
                        end
                end
        end

        frame:ClearAllPoints();
        frame:SetPoint("BOTTOMRIGHT", anchorWidgetName, "TOPRIGHT", xPos, anchorWidgetYOffset);
end

function AllInOneInventoryFrame_DoNothing()
end

function AllInOneInventoryFrame_UpdateLook(frame, frameSize)
        if ( not frame ) then
                frame = getglobal("AllInOneInventoryFrame");
        end
        if ( ( not frameSize ) or ( frameSize == 0 ) ) then
                frameSize = AllInOneInventory_GetBagsTotalSlots()
        end
        if ( not frame ) or ( not frameSize ) or ( frameSize == 0 )then
                AIOI_ScheduleByName("AIOI_UPDATE_LOOK", 1, AllInOneInventoryFrame_UpdateLook, frame, frameSize);
        else
                AIOI_ScheduleByName("AIOI_UPDATE_LOOK", 1, AllInOneInventoryFrame_DoNothing);
        end
        frame.size = frameSize;

        local name = frame:GetName();
--      local bgTexture = getglobal(name.."BackgroundTexture");
        getglobal(name.."MoneyFrame"):Show();
        local columns = AllInOneInventory_Columns;
        if (columns > frame.size) then columns = frame.size; end -- doesn't make sense to have more columns than slots, just in case sarf decides to increase the upper limit
        if ( columns <= 0 ) then
                columns = 8;
        end
        local rows = ceil(frame.size / columns);
        if ( rows <= 0 ) then
                rows = 1;
        end
        -- Added a short name, in case the long name doesn't fit ;)
        if (columns <= 4) then
                getglobal(name.."Name"):SetText(ALLINONEINVENTORY_BAG_TITLE_SHORT);
        else
                getglobal(name.."Name"):SetText(ALLINONEINVENTORY_BAG_TITLE_LONG);
        end

        local oldHeight = frame:GetHeight();
        local height = AllInOneInventoryFrame_GetAppropriateHeight(rows);
        frame:SetHeight(height);

        local oldWidth = frame:GetWidth();
        local width = AllInOneInventoryFrame_GetAppropriateWidth(columns);
        frame:SetWidth(width);
        if ( frame:IsVisible() ) then
                frame:Show();
        end

--      bgTexture:Hide();

        local diffHeight = ceil(height - oldHeight);
        local diffWidth = ceil(width - oldWidth);

        if ( ( ( diffHeight > 1 ) or ( diffHeight < -1 ) ) or ( ( diffWidth > 1 ) or ( diffWidth < -1 ) ) ) then
                --AllInOneInventoryFrame_ResetPosition(frame);
        end

        -- texture code to make it look like a normal bag...
        local lastColumnIsComplete = false;
        if (rows == floor(frame.size / columns)) then lastColumnIsComplete = true; end

        -- set textures for moneyframe:
        getglobal(name.."TextureBottomMiddle"):SetWidth((columns - 2) * 42 + 70);

        -- show the first row (assumes that columns < frame.size)
        local texture = getglobal(name.."ItemTexture1");
        if ( texture ) then
                texture:SetTexture("Interface\\AddOns\\AllInOneInventory\\Skin\\first_right");
                texture:SetPoint("TOPLEFT", name.."TextureBottomRight", "TOPLEFT", -35, 43);
                texture:Show();
        end
        for i=2, (columns-1), 1 do
                local texture = getglobal(name.."ItemTexture"..i);
                if ( texture ) then
                        texture:SetTexture("Interface\\AddOns\\AllInOneInventory\\Skin\\first_middle");
                        texture:SetPoint("TOPLEFT", name.."ItemTexture"..(i - 1), "TOPLEFT", -42, 0);
                        texture:Show();
                end
        end
        local texture = getglobal(name.."ItemTexture"..columns);
        if ( texture ) then
                texture:SetTexture("Interface\\AddOns\\AllInOneInventory\\Skin\\first_left");
                texture:SetPoint("TOPLEFT", name.."ItemTexture"..(columns - 1), "TOPLEFT", -47, 0);
                texture:Show();
        end

        -- show the other rows
        for j=1, (rows - 1), 1 do
                local texture = getglobal(name.."ItemTexture"..(j * columns + 1));
                if ( texture ) then
                        texture:SetTexture("Interface\\AddOns\\AllInOneInventory\\Skin\\second_right");
                        local textureOffsetX = 0; if (j == 1) then textureOffsetX = -3; end
                        texture:SetPoint("TOPLEFT", name.."ItemTexture"..((j - 1) * columns + 1), "TOPLEFT", textureOffsetX, 41);
                        texture:Show();
                end
                local slotsInRow = columns;
                if ((j + 1) * columns > frame.size) then slotsInRow = frame.size - (j * columns); end
                for i=2, (slotsInRow - 1), 1 do
                        local texture = getglobal(name.."ItemTexture"..(j * columns + i));
                        if ( texture ) then
                                texture:SetTexture("Interface\\AddOns\\AllInOneInventory\\Skin\\second_middle");
                                texture:SetPoint("TOPLEFT", name.."ItemTexture"..(j * columns + i - 1), "TOPLEFT", -42, 0);
                                texture:Show();
                        end
                end
                if (slotsInRow == columns) then
                        local texture = getglobal(name.."ItemTexture"..(j * columns + slotsInRow));
                        if ( texture ) then
                                texture:SetTexture("Interface\\AddOns\\AllInOneInventory\\Skin\\second_left");
                                texture:SetPoint("TOPLEFT", name.."ItemTexture"..(j * columns + slotsInRow - 1), "TOPLEFT", -44, 0);
                                texture:Show();
                        end
                elseif (slotsInRow > 1) then
                        local texture = getglobal(name.."ItemTexture"..(j * columns + slotsInRow));
                        if ( texture ) then
                                texture:SetTexture("Interface\\AddOns\\AllInOneInventory\\Skin\\second_middle");
                                texture:SetPoint("TOPLEFT", name.."ItemTexture"..(j * columns + slotsInRow - 1), "TOPLEFT", -42, 0);
                                texture:Show();
                        end
                end
        end

        getglobal(name.."TextureTopMiddle"):SetWidth((columns - 2) * 42 + 22);
        if (lastColumnIsComplete) then
                local textureOffsetX = 0; if (frame.size == columns) then textureOffsetX = -3; end
                getglobal(name.."TextureTopRight"):SetTexture("Interface\\AddOns\\AllInOneInventory\\Skin\\top_right_large");
                getglobal(name.."TextureTopRight"):SetPoint("BOTTOMLEFT", name.."ItemTexture"..((rows - 1) * columns + 1), "TOPLEFT", 19 + textureOffsetX, 0);
                getglobal(name.."TextureTopMiddle"):SetPoint("BOTTOMRIGHT", name.."TextureTopRight", "BOTTOMLEFT", 0, -34);
                getglobal(name.."CloseButton"):SetPoint("BOTTOMLEFT", name.."TextureTopRight", "BOTTOMLEFT", 4, 12);
        else
                getglobal(name.."TextureTopRight"):SetTexture("Interface\\AddOns\\AllInOneInventory\\Skin\\top_right_small");
                getglobal(name.."TextureTopRight"):SetPoint("BOTTOMLEFT", name.."ItemTexture"..((rows - 1) * columns + 1), "TOPLEFT", 19, 0);
                getglobal(name.."TextureTopMiddle"):SetPoint("BOTTOMRIGHT", name.."TextureTopRight", "BOTTOMLEFT", 0, -51);
                getglobal(name.."CloseButton"):SetPoint("BOTTOMLEFT", name.."TextureTopRight", "BOTTOMLEFT", 4, -5);
        end

        for j=0, (frame.size - 1), 1 do
                local itemButton = getglobal(name.."Item"..(frame.size - j));
                itemButton:SetID(frame.size - j);
                itemButton:ClearAllPoints();
                -- Set first button
                if ( j == 0 ) then
                        itemButton:SetPoint("TOPLEFT", name.."ItemTexture1", "TOPLEFT", 4, -1);
                else
                        if ( mod(j, columns) == 0 ) then
                                itemButton:SetPoint("TOPLEFT", name.."Item"..(frame.size - j + columns), "TOPLEFT", 0, 41);
                        else
                                itemButton:SetPoint("TOPLEFT", name.."Item"..(frame.size - j + 1), "TOPLEFT", -42, 0);
                        end
                end
                itemButton:Show();

                AllInOneInventoryFrame_UpdateButton(frame, (frame.size - j));
        end
        local button = nil;
        local texture = nil;
        for i = frame.size+1, ALLINONEINVENTORY_MAX_ID do
                button = getglobal(name.."Item"..i);
                if ( button ) then
                        button:Hide();
                end
                texture = getglobal(name.."ItemTexture"..i); -- hide the textures, that are not needed
                if ( texture ) then
                        texture:Hide();
                end
        end
end

-- Thanks to 'lugo for this fix!
function AllInOneInventory_OpenAllBags(forceOpen)
        if ( AllInOneInventory_ReplaceBags == 1 ) then
                local bagsOpen = 0;
                local totalBags = 1;
                for i=1, NUM_CONTAINER_FRAMES, 1 do
                        local containerFrame = getglobal(AllInOneInventory_ContainerFrames[i]);
                        if ( not containerFrame ) then break; end
                        local bagButton = getglobal("CharacterBag"..(i -1).."Slot");
                        if (i <= NUM_BAG_FRAMES) then
                                local id = bagButton:GetID() - CharacterBag0Slot:GetID() + 1;
                                if ((not AllInOneInventory_ShouldOverrideBag(id)) and (GetContainerNumSlots(id) > 0)) then
                                        totalBags = totalBags + 1;
                                end
                        end
                        if ( containerFrame:IsVisible() ) then
                                containerFrame:Hide();
                                if (containerFrame:GetID() <= NUM_BAG_FRAMES) then
                                        bagsOpen = bagsOpen + 1;
                                end
                        end
                end

        if (AllInOneInventoryFrame:IsVisible()) then
                CloseAllInOneInventoryFrame();
                bagsOpen = bagsOpen + 1;
        end

        if ( bagsOpen == totalBags and not forceOpen ) then
                return;
        end

        ToggleAllInOneInventoryFrame();
        if ( AllInOneInventoryFrame:IsVisible() ) then
                AllInOneInventory_OpenBag(1);
                AllInOneInventory_OpenBag(2);
                AllInOneInventory_OpenBag(3);
                AllInOneInventory_OpenBag(4);
        end
                return;
        end
        AllInOneInventory_Saved_OpenAllBags(forceOpen);
end

function AllInOneInventory_DepositBox_RefreshWindows()
        AllInOneInventory_Saved_DepositBox_RefreshWindows();
        MoneyFrame_Update("AllInOneInventoryFrameMoneyFrame", GetMoney() - GetCursorMoney());
end


function AIOI_LootLink_SetTooltipMoney(frame, count, money, stack)
        if ( not money ) then return; end
        if ( money <= 0) then return; end
        if ( count and count > 1 ) then
                money = money * count;
                frame:AddLine(format(LOOTLINK_SELL_PRICE_N, count), 1.0, 1.0, 1.0);
        elseif( stack ) then
                frame:AddLine(LOOTLINK_SELL_PRICE_EACH, 1.0, 1.0, 1.0);
        else
                frame:AddLine(LOOTLINK_SELL_PRICE, 1.0, 1.0, 1.0);
        end

        local numLines = frame:NumLines();
        local moneyFrame = getglobal(frame:GetName().."MoneyFrame");
        local newLine = frame:GetName().."TextLeft"..numLines;

        moneyFrame:SetPoint("LEFT", newLine, "RIGHT", 4, 0);
        moneyFrame:Show();
        MoneyFrame_Update(moneyFrame:GetName(), money);
        frame:SetMinimumWidth(moneyFrame:GetWidth() + getglobal(newLine):GetWidth() - 10);
end

function AllInOneInventory_SellValue_OnShow()
        if ( AllInOneInventory_Patching_Tooltip ~= 1 ) then
                AllInOneInventory_Saved_SellValue_OnShow();
        end
end

function AllInOneInventory_StartMoving(frame)
        if ( not frame.isMoving ) and ( frame.isLocked ~= 1 ) then
                frame:StartMoving();
                frame.isMoving = true;
        end
end

function AllInOneInventory_StopMoving(frame)
        if ( frame.isMoving ) then
                frame:StopMovingOrSizing();
                frame.isMoving = false;
        end
end

function AllInOneInventory_ToggleLock(frame)
        if ( frame.isLocked ~= 1 ) then
                frame.isLocked = 1;
        else
                frame.isLocked = nil;
        end
end

function AllInOneInventory_SetLock(frame)
        if ( not frame ) then
                frame = AllInOneInventoryFrame;
        end
        local lockButton = getglobal(frame:GetName().."LockButton");
        if ( AllInOneInventory_Locked ~= 1 ) then
                frame.isLocked = 0;
                if ( lockButton ) then
                        lockButton:SetChecked(1);
                end
        else
                AllInOneInventory_StopMoving(frame);
                frame.isLocked = 1;
                if ( lockButton ) then
                        lockButton:SetChecked(0);
                end
        end
end

function AllInOneInventory_GetLock(frame)
        if ( frame.isLocked == 1 ) then
                return 1;
        else
                return 0;
        end
end

function ToggleLockAllInOneInventoryFrame()
        AllInOneInventory_Toggle_Locked(-1);
end

function AllInOneInventory_Toggle_Locked(toggle)
        AllInOneInventory_DoToggle_Locked(toggle, true);
end

function AllInOneInventory_Toggle_Locked_NoChat(toggle)
        AllInOneInventory_DoToggle_Locked(toggle, false);
end

-- does the actual toggling
function AllInOneInventory_DoToggle_Locked(toggle, showText)
        local newvalue = 0;
        if ( showText ) then
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_Locked", "ALLINONEINVENTORY_CHAT_LOCKED_ENABLED", "ALLINONEINVENTORY_CHAT_LOCKED_DISABLED");
        else
                newvalue = AllInOneInventory_Generic_Toggle(toggle, "AllInOneInventory_Locked");
        end
        local frame = getglobal("AllInOneInventoryFrame");
        if ( frame ) then
                AllInOneInventory_SetLock(frame, newvalue);
        end
end

function AllInOneInventory_Toggle_ExcludedSlot(bag, slot)
        return AllInOneInventory_DoToggle_ExcludedSlot(bag, slot, 1)
end

function AllInOneInventory_Toggle_ExcludedSlot_NoChat(bag, slot)
        return AllInOneInventory_DoToggle_ExcludedSlot(bag, slot)
end

function AllInOneInventory_DoToggle_ExcludedSlot(bag, slot, showText)
        if ( bag ) and ( slot ) then
                if ( type(bag) == "string" ) then
                        bag = tonumber(bag);
                end
                if ( type(slot) == "string" ) then
                        slot = tonumber(slot);
                end
        end
        if ( not bag ) or ( not slot ) then
                if ( showText ) then
                        AllInOneInventory_Print(ALLINONEINVENTORY_TOGGLE_SLOT_FAIL);
                end
                return false;
        end
        if ( not AllInOneInventory_ExcludedSlots ) then
                AllInOneInventory_ExcludedSlots = {};
        end
        if ( not AllInOneInventory_ExcludedSlots[bag] ) then
                AllInOneInventory_ExcludedSlots[bag] = {};
        end
        local newState = ALLINONEINVENTORY_TOGGLE_SLOT_OFF;
        if ( not AllInOneInventory_ExcludedSlots[bag][slot] ) then
                newState = ALLINONEINVENTORY_TOGGLE_SLOT_ON;
                AllInOneInventory_ExcludedSlots[bag][slot] = 1;
        else
                AllInOneInventory_ExcludedSlots[bag][slot] = nil;
        end
        if ( showText ) then
                AllInOneInventory_Print(string.format(ALLINONEINVENTORY_TOGGLE_SLOT, bag, slot, newState));
        end
        return true;
end

function AllInOneInventory_OnMouseDown(button, frame)
        --[[
        if ( button == "LeftButton" ) and ( IsShiftKeyDown() ) then
                ToggleLockAllInOneInventoryFrame();
        else
        end
        ]]--
        AllInOneInventory_StartMoving(frame);
end

setglobal("AIOI_ScheduleByName", AIOI_ScheduleByName_Own);
setglobal("AIOI_Schedule", AIOI_Schedule_Own);