vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        MoveAnything! vJ.11000.2
        Based on MA! 1.12 by Skrag

        Read the ReadMe
]]
local function Error( msg )
        Print( msg, 1.0, 0.2, 0.2 );
end

function Print(msg, r, g, b, frame)
        if (not r) then r = 1.0; end
        if (not g) then g = 1.0; end
        if (not b) then b = 1.0; end
        if ( frame ) then
                frame:AddMessage(msg,r,g,b);
        else
                if ( DEFAULT_CHAT_FRAME ) then
                        DEFAULT_CHAT_FRAME:AddMessage(msg, r, g, b);
                end
        end
end

function table.find( table, value )
        for i, v in table do
                if( v == value ) then
                        return i;
                end
        end
        return nil;
end

------------------------------------------------

BINDING_HEADER_MOVEANYTHING = "MoveAnything!";
MA_LEFTARROW = "<";
MA_RIGHTARROW = ">";
CurrentMover = 1;

StaticPopupDialogs["MOVEANYTHING_RESET_CONFIRM"] = {
        text = "Reset all MoveAnything Data?",
        button1 = TEXT(YES),
        button2 = TEXT(NO),
        OnAccept = function()
                MoveAnythingOptions_ResetAll();
        end,
        timeout = 0,
        exclusive = 1,
        showAlert = 1
};

MOVEANYTHING_MOVEATONETIME = 20;
MOVEANYTHING_SCROLL_HEIGHT = 25;

function MoveAnything_ToggleVisibilityOnFrame(frame)
        if ( not frame ) then return; end

        local opt = MoveAnything_FindFrameOptions(frame:GetName(),"ShowFrame");
        
        if( opt and opt.hidden == true ) then
        
                MoveAnything_ShowFrame(frame)
        else
                MoveAnything_HideFrame(frame)
        
        end

end

function TestPos( frame, x, y )
        frame:ClearAllPoints();
        if( frame.HiddenSetPoint ) then
                frame:HiddenSetPoint( "BOTTOMLEFT", frame:GetParent():GetName(), "BOTTOMLEFT", x, y );
        else
                frame:SetPoint( "BOTTOMLEFT", frame:GetParent():GetName(), "BOTTOMLEFT", x, y );
        end
end

function TestInfo()
        Print( "PlayerFrame "..PlayerFrame:GetLeft()..", "..PlayerFrame:GetBottom().." ("..PlayerFrame:GetScale()..")" );
        Print( "PetFrame "..PetFrame:GetLeft()..", "..PetFrame:GetBottom().." ("..PetFrame:GetScale()..")" );
end

function ListFrameOptions()
        local count = 0;
        for i, v in MoveAnything_FrameOptions do
                count = count + 1;
        end
        Print( count.." frame options" );
        for i, v in MoveAnything_FrameOptions do
                Print( "FrameOptions: "..v.name );
        end
end

function ListCustomFrames()
        Print( table.getn( MoveAnything_CustomFrames ).." custom frames" );
        for i, v in MoveAnything_CustomFrames do
                Print( v.name );
        end
end

function MADebOpt( frameName )
        for i, v in MoveAnything_FrameOptions[ frameName ] do
                Print( frameName.."."..i.." = "..tostring(v) );
        end
end

function MADeb()
        ListCustomFrames();
        ListFrameOptions();
end

function MALocate()
        if( not MALocator:IsVisible() ) then
                MALocator:Show();
        end
end

function MoveAnythingUpdater_OnUpdate(arg1)
        if MoveAnythingUpdater:GetScale() == UIParent:GetScale() then
                MoveAnythingUpdater:SetScale(0.2)
                MoveAnything_RefreshPositions()
        end
end

MoveAnything_Frames = {};
MoveAnything_CustomFrames = {};
MoveAnything_CharacterSettings = {};
MoveAnything_UseCharacterSettings = false;
MoveAnything_InitRun = false;
MoveAnything_FrameOptions = nil;

MoveAnything_NoScale = { TooltipMover = true, FramerateMover = true };
MoveAnything_ScaleWH = { MainMenuExpBar = true };
MoveAnything_DetachFromParent = { MainMenuBarPerformanceBarFrame = true };
MoveAnything_NoHide = { MAOptions = true };
MoveAnything_HideList = {};
MoveAnything_HideList["MainMenuBar"] = {
        { "MainMenuBarArtFrame", "BACKGROUND","ARTWORK"},
        { "PetActionBarFrame", "OVERLAY"},
        { "ShapeshiftBarFrame", "OVERLAY"},
        { "MainMenuBar", "DISABLEMOUSE"},
        { "BonusActionBarFrame", "OVERLAY", "DISABLEMOUSE"},
};
MoveAnything_HideList["MainMenuExpBar"] = {
        { "MainMenuExpBar", "WH", "BORDER", "OVERLAY"},
        { "ExhaustionTick", "FRAME"},
        { "MainMenuExpBar", function( show )
                                                        if( show ) then
                                                                MoveAnything_AllowExternalVisibility( MainMenuExpBar.TextString );
                                                        else
                                                                MoveAnything_PreventExternalVisibility( MainMenuExpBar.TextString );
                                                        end
                                                end},
};

MoveAnything_HideUsingWH = { MainMenuExpBar = true };

MoveAnything_MoveOnlyWhenVisible = {};
MoveAnything_MoveOnlyWhenVisible["GroupLootFrame1"] = true;
MoveAnything_MoveOnlyWhenVisible["GroupLootFrame2"] = true;
MoveAnything_MoveOnlyWhenVisible["GroupLootFrame3"] = true;
MoveAnything_MoveOnlyWhenVisible["GroupLootFrame4"] = true;

MoveAnything_DefaultFrameList = {

        { "MAOptions", "MoveAnything! Options Window" },

        { "Separator", "**** Standard Party Frames ****" },
        { "PlayerFrame", "Player" },
        { "TargetFrame", "Target" },
        { "PartyMemberFrame1", "Party Member 1" },
        { "PartyMemberFrame2", "Party Member 2" },
        { "PartyMemberFrame3", "Party Member 3" },
        { "PartyMemberFrame4", "Party Member 4" },

        { "Separator", "**** Pets ****" },
        { "PetFrame", "Pet" },
        { "PartyMemberFrame1PetFrame", "Party Pet 1" },
        { "PartyMemberFrame2PetFrame", "Party Pet 2" },
        { "PartyMemberFrame3PetFrame", "Party Pet 3" },
        { "PartyMemberFrame4PetFrame", "Party Pet 4" },

        { "Separator", "**** Bags ****" },
        { "BagFrame1", "Bag 1 (Backpack)" },
        { "BagFrame2", "Bag 2" },
        { "BagFrame3", "Bag 3" },
        { "BagFrame4", "Bag 4" },
        { "BagFrame5", "Bag 5" },

        { "Separator", "**** Bank ****" },
        { "BankFrame", "Bank Teller Window" },
        { "BankBagFrame1", "Bank Bag 1" },
        { "BankBagFrame2", "Bank Bag 2" },
        { "BankBagFrame3", "Bank Bag 3" },
        { "BankBagFrame4", "Bank Bag 4" },
        { "BankBagFrame5", "Bank Bag 5" },
        { "BankBagFrame6", "Bank Bag 6" },

        { "Separator", "**** Bottom Bar ****" },
        { "MainMenuBar", "Bottom Bar" },
        { "MainMenuBarArtFrame", "Art Frame" },
        { "MainMenuBarMaxLevelBar", "Max Level Bar" },
        { "MainMenuExpBar", "Experience Bar" },
        { "MainMenuBarPerformanceBarFrame", "Lag Meter" },

        { "Separator", "**** Action Button Bars ****" },
        { "BasicActionButtonsMover", "Action Buttons" },
        { "BasicActionButtonsVerticalMover", "Action Buttons (Vertical)" },
        { "PetActionButtonsMover", "Pet Action Buttons" },
        { "PetActionButtonsVerticalMover", "Pet Action Buttons (Vertical)" },
        { "ShapeshiftButtonsMover", "Stance / Aura / Shapeshift Buttons" },
        { "ShapeshiftButtonsVerticalMover", "Stance / Aura / Shapeshift (Vertical)" },

        { "Separator", "**** Bag and Micro Button Bars ****" },
        { "BagButtonsMover", "Bag Buttons" },
        { "BagButtonsVerticalMover", "Bag Buttons (Vertical)" },
        { "MicroButtonsMover", "Micro Buttons" },
        { "MicroButtonsVerticalMover", "Micro Buttons (Vertical)" },

        { "Separator", "**** Extra Action Bars ****" },
        { "MultiBarBottomLeft", "Bottom Left ActionBar" },
        { "MultiBarBottomRight", "Bottom Right ActionBar" },
        { "MultiBarRight", "Right ActionBar" },
        { "MultiBarLeft", "Right ActionBar 2" },

        { "Separator", "**** Minimap and Minimap Hangers ****" },
        { "MinimapCluster", "MiniMap" },
        { "MinimapZoneTextButton", "MiniMap Zone Text" },
        { "MinimapZoomIn", "MiniMap Zoom In Button" },
        { "MinimapZoomOut", "MiniMap Zoom Out Button" },
        { "MiniMapMailFrame", "MiniMap Mail Notification" },
        { "MiniMapTrackingFrame", "MiniMap Tracking" },
        { "MiniMapMeetingStoneFrame", "MiniMap Meeting Stone" },
        { "MiniMapBattlefieldFrame", "MiniMap Battlefield" },
        { "GameTimeFrame", "MiniMap Day-Night Clock" },

        { "Separator", "**** Battle Grounds Elements ****" },
        { "WorldStateAlwaysUpFrame", "Flags Frame"},
        { "AlwaysUpFrame1", "Alliance Flag"},
        { "AlwaysUpFrame2", "Horde Flag"},

        { "Separator", "**** Dice Roll Frames ****" },
        { "GroupLootFrame1", "Dice Roll Frame 1" },
        { "GroupLootFrame2", "Dice Roll Frame 2" },
        { "GroupLootFrame3", "Dice Roll Frame 3" },
        { "GroupLootFrame4", "Dice Roll Frame 4" },

        { "Separator", "**** Miscellaneous Screen Items ****" },
        { "StaticPopup1", "Static Popup Frame" },
        { "UIErrorsFrame", "UI Errors Frame" },
        { "CastingBarFrame", "Casting Bar" },
        { "BuffFrame", "Buff Window" },
        { "TemporaryEnchantFrame", "Item buff/Debuff Windows" },
        { "TooltipMover", "Tooltip" },
        { "FramerateMover", "Framerate" },
        { "DurabilityFrame", "Durability Damage Portrait" },
        { "QuestWatchFrame", "Quest Tracker" },
        { "QuestTimerFrame", "Quest Timer" },
        { "ComboFrame", "Rogue Combo point counter" },
        { "MirrorTimer1", "Breath/Fatigue Bar" },

        { "Separator", "**** General Info Panel Placement ****" },
        { "UIPanelMover1", "Info Panel 1" },
        { "UIPanelMover2", "Info Panel 2" },

        { "Separator", "**** Specific Info Panels ****" },
        { "CharacterFrame", "Character / Pet / Reputation / Skills" },
        { "TradeSkillFrame", "Trade Skills" },
        { "InspectFrame", "Inspect View" },
        { "SpellBookFrame", "Spell Book" },
        { "LootFrame", "Looting Window" },
        { "TaxiFrame", "Flight Paths" },
        { "QuestLogFrame", "Quest Log" },
        { "MerchantFrame", "Merchant Inventory" },
        { "TradeFrame", "Trade Window" },
        { "FriendsFrame", "Friends / Who / Guild / Raid" },
        { "MacroFrame", "Macros" },
        { "MailFrame", "Mailbox" },
        { "TalentFrame", "Talent Tree" },
        { "PetStableFrame", "Pet Stable" },
        { "AuctionFrame", "Auction House" },
}

function MoveAnything_AddPredefinedFrames( frameList )
        for i, val in frameList do
                if( val[1] ) then
                        if( val[1] == "Separator" ) then
                                MoveAnything_AddSeparator( val[2], true );
                        else
                                MoveAnything_AddFrameToMovableList( val[1], val[2], true );
                        end
                end
        end
end

function MoveAnything_AddDefaultFrames()
        MoveAnything_AddPredefinedFrames( MoveAnything_DefaultFrameList );
        MoveAnything_AddPredefinedFrames( MoveAnything_PredefinedCustomFrameList );
end

function MoveAnything_ScaleAllowed( frameName )
        if( MoveAnything_NoScale[ frameName ] or MoveAnything_ScaleWH[ frameName ] ) then
                return false;
        end
        return true;
end

function MAGetParent( frame )
        if ( not frame or not frame.GetParent ) then return; end
        if( frame:GetParent() == nil ) then
                return UIParent;
        end

        return frame:GetParent();
end

function MAGetScale( frame, effective )
        if( frame:GetScale() == nil ) then
                return 1;
        end

        if ( effective ) then
                return frame:GetEffectiveScale();
        else
                return frame:GetScale();
        end
end

function MoveAnything_RefreshPositions()
        if( not MoveAnything_InitRun ) then
                return;
        end

        local frame, parent;
        for i, opt in MoveAnything_FrameOptions do
                frame = getglobal( opt.name );
                if( frame ) then
                        if( opt.movable or opt.hidden ) then
                                MoveAnything_HookFrame( opt.name );
                        end
                        if( opt.movable ) then
                                if( MoveAnything_DetachFromParent[ opt.name ] ) then
                                        parent = UIParent;
                                else
                                        parent = MAGetParent( frame );
                                end
                                frame:HiddenClearAllPoints();
                                frame:HiddenSetPoint( "BOTTOMLEFT", parent:GetName(), "BOTTOMLEFT", opt.x, opt.y );
                                if( opt.scale ) then
                                        frame:HiddenSetScale( opt.scale );
                                        if( frame.attachedChildren ) then
                                                for i, v in frame.attachedChildren do
                                                        v:HiddenSetScale( opt.scale );
                                                end
                                        end
                                end
                        end
                        if( opt.hidden ) then
                                MoveAnything_HideFrame( frame );
                        end
                end
        end
end

function MoveAnything_CurrentSettingsName()
        local settingname = "default";

        if( MoveAnything_UseCharacterSettings ) then
                settingname = GetCVar( "realmName" ).." "..UnitName( "player" );
        end

        return settingname;
end

function MoveAnything_CopySettings( fromName, toName )
        if( MoveAnything_CharacterSettings[toName] == nil ) then
                MoveAnything_CharacterSettings[toName] = {};
        end
        for i, val in MoveAnything_CharacterSettings[fromName] do
                MoveAnything_CharacterSettings[toName][i] = val;
        end
        MoveAnything_FrameOptions = MoveAnything_CharacterSettings[MoveAnything_CurrentSettingsName()];
        MoveAnything_RefreshPositions();
end

function MoveAnything_Init()
        if( MoveAnything_InitRun ) then
                return;
        end

        MoveAnything_AddDefaultFrames();

        -- update settings from old versions
        if( MoveAnything_FrameOptions ~= nil ) then
                MoveAnything_CharacterSettings["default"] = MoveAnything_FrameOptions;
                MoveAnything_FrameOptions = nil;
        end

        local settingname = MoveAnything_CurrentSettingsName();

        if( MoveAnything_CharacterSettings[settingname] == nil ) then
                MoveAnything_CharacterSettings[settingname] = {};
        end
        MoveAnything_FrameOptions = MoveAnything_CharacterSettings[settingname];

        -- now add all the custom frames
        for i, v in MoveAnything_CustomFrames do
                if( not MoveAnything_FindFrame( v.name ) ) then
                        -- pass true for isDefault, so it doesn't get re-added to the custom list
                        MoveAnything_AddFrameToMovableList( v.name, v.helpfulname, true );
                end
        end

        MoveAnything_InitRun = true;

        MoveAnything_RefreshPositions();
end

function MoveAnything_GetFrameCount()
        return table.getn( MoveAnything_Frames );
end

function MoveAnything_ClearFrameOptions( frameName )
        MoveAnything_FrameOptions[frameName] = nil;
        MoveAnything_RemoveIfCustom( frameName );
end

function MoveAnything_FindFrameOptions( frameName, why )
        if( MoveAnything_FrameOptions == nil ) then
                return;
        end
        return MoveAnything_FrameOptions[frameName];
end

function MoveAnything_FindFrame( frameName )
        for i in MoveAnything_Frames do
                if( MoveAnything_Frames[i].name == frameName ) then
                        return MoveAnything_Frames[i];
                end
        end
        return nil;
end

function MoveAnything_RemoveIfCustom( frameName )
        local removed = false;
        for i,v in MoveAnything_CustomFrames do
                if( v.name == frameName ) then
                        table.remove( MoveAnything_CustomFrames, i );
                        removed = true;
                        break;
                end
        end
        if( removed ) then
                for i,v in MoveAnything_Frames do
                        if( v.name == frameName ) then
                                table.remove( MoveAnything_Frames, i );
                                break;
                        end
                end
        end
end

function MoveAnything_PreventExternalVisibility( frame )
        frame.MAWantsToBeVisible = frame:IsVisible();
        frame:Hide();
        frame.HiddenShow = frame.Show;
        frame.HiddenHide = frame.Hide;
        frame.HiddenIsVisible = frame.IsVisible;
        frame.Show = MoveAnything_HiddenShow;
        frame.Hide = MoveAnything_HiddenHide;
        frame.IsVisible = MoveAnything_HiddenIsVisible;
        if( frame.attachedChildren ) then
                for i, val in frame.attachedChildren do
                        MoveAnything_PreventExternalVisibility( val );
                end
        end
end

function MoveAnything_AllowExternalVisibility( frame )
        frame.Show = frame.HiddenShow;
        frame.Hide = frame.HiddenHide;
        frame.IsVisible = frame.HiddenIsVisible;
        frame.HiddenShow = nil;
        frame.HiddenHide = nil;
        frame.HiddenIsVisible = nil;
        if( frame.MAWantsToBeVisible ) then
                frame.MAWantsToBeVisible = nil
                frame:Show();
        end
        if( frame.attachedChildren ) then
                for i, val in frame.attachedChildren do
                        MoveAnything_AllowExternalVisibility( val );
                end
        end
end

function MoveAnything_PreventExternalMovement( frame )
        if( frame.HiddenSetPoint == nil ) then
                frame.HiddenSetPoint = frame.SetPoint;
                frame.SetPoint = function() end;
        end
        if( frame.HiddenSetAllPoints == nil ) then
                frame.HiddenSetAllPoints = frame.SetAllPoints;
                frame.SetAllPoints = function() end;
        end
        if( frame.HiddenClearAllPoints == nil ) then
                frame.HiddenClearAllPoints = frame.ClearAllPoints;
                frame.ClearAllPoints = function() end;
        end
        if( frame.HiddenSetScale == nil ) then
                frame.HiddenSetScale = frame.SetScale;
                frame.SetScale = function() end;
        end
        if( frame.attachedChildren ) then
                for i, val in frame.attachedChildren do
                        MoveAnything_PreventExternalMovement( val );
                end
        end
end

function MoveAnything_AllowExternalMovement( frame )
        if( frame.HiddenSetPoint ) then
                frame.SetPoint = frame.HiddenSetPoint;
                frame.HiddenSetPoint = nil;
        end
        if( frame.HiddenSetAllPoints ) then
                frame.SetAllPoints = frame.HiddenSetAllPoints;
                frame.HiddenSetAllPoints = nil;
        end
        if( frame.HiddenClearAllPoints ) then
                frame.ClearAllPoints = frame.HiddenClearAllPoints;
                frame.HiddenClearAllPoints = nil;
        end
        if( frame.HiddenSetScale ) then
                frame.SetScale = frame.HiddenSetScale;
                frame.HiddenSetScale = nil;
        end
        if( frame.attachedChildren ) then
                for i, val in frame.attachedChildren do
                        MoveAnything_AllowExternalMovement( val );
                end
        end
end

function MoveAnything_HookFrame( frameName )
        local frame = getglobal( frameName );

        if( not MoveAnything_IsFrameHooked( frameName ) ) then
                local opt = MoveAnything_FindFrameOptions( frameName, "HookFrame" );
                if( opt == nil ) then
                        MoveAnything_FrameOptions[frameName] = {};
                        opt = MoveAnything_FrameOptions[frameName];
                        opt.movable = false;
                        opt.hidden = false;
                end
                opt.name = frameName;
                opt.originalLeft, opt.originalBottom = MoveAnything_GetRelativeBottomLeft( frame );
                if( MoveAnything_ScaleWH[ frameName ] ) then
                        opt.originalWidth = frame:GetWidth();
                        opt.originalHeight = frame:GetHeight();
                        opt.originalScale = nil;
                else
                        opt.originalWidth = nil;
                        opt.originalHeight = nil;
                        opt.originalScale = MAGetScale( frame );
                end

        end
        if( UIPanelWindows[frame:GetName()] ) then
                local left = GetLeftFrame();
                local center = GetCenterFrame();

                if( frame == left ) then
                        UIParent.left = nil;
                        if( center ) then
                                MovePanelToLeft();
                        end
                elseif( frame == center and left ) then
                        UIParent.center = nil;
                end
                local opt = MoveAnything_FindFrameOptions( frameName, "Hook UIPanel" );
                if( opt ) then
                        opt.UIPanelWindows = UIPanelWindows[frame:GetName()];
                end
                UIPanelWindows[frame:GetName()] = nil;
        end
        if( frame.OnMoveAnythingHook ) then
                frame.OnMoveAnythingHook( frame );
        end
        MoveAnything_PreventExternalMovement( frame );
end

function MoveAnything_IsFrameHooked( frameName )
        if( frameName == nil ) then return; end
        local opt = MoveAnything_FindFrameOptions( frameName, "IsFrameHooked "..frameName );
        if( opt ) then
                if( opt.movable or opt.hidden ) then
                        return true;
                end
        end
        return false;
end

function MoveAnything_IsFrameHidden( frameName )
        if( frameName == nil ) then return; end
        local opt = MoveAnything_FindFrameOptions( frameName, "IsFrameHooked "..frameName );
        if( opt ) then
                if( opt.hidden ) then
                        return true;
                end
        end
        return false;
end

function MoveAnything_AddFrameToMovableList( frameName, helpfulName, isDefault )
        if( not MoveAnything_FindFrame( frameName ) ) then
                local frame = getglobal( frameName );
                local listOptions = {};
                listOptions.name = frameName;
                listOptions.helpfulName = helpfulName;
                if( listOptions.helpfulName == nil ) then
                        listOptions.helpfulName = listOptions.name;
                end
                table.insert( MoveAnything_Frames, listOptions );
                -- if this is not a built-in default frame, we also need to add it to CustomFrames
                if( not isDefault ) then
                        table.insert( MoveAnything_CustomFrames, listOptions );
                end
                if( MAOptions:IsVisible() ) then
                        MoveAnythingOptions_Update();
                end
        end
end

function MoveAnything_AddSeparator( separatorText, isDefault )
        local listOptions = {};
        listOptions.name = nil;
        listOptions.helpfulName = separatorText;
        table.insert( MoveAnything_Frames, listOptions );
        -- if this is not a built-in default frame, we also need to add it to CustomFrames
        if( not isDefault ) then
                table.insert( MoveAnything_CustomFrames, listOptions );
        end
        if( MAOptions:IsVisible() ) then
                MoveAnythingOptions_Update();
        end
end

function MoveAnything_SizingAnchor( button )
        local s, e = string.find( button:GetName(), "Resize_" )
        local anchorto = string.sub( this:GetName(), e + 1 );
        local anchor;

        if( anchorto == "LEFT" ) then anchor = "RIGHT";
        elseif( anchorto == "RIGHT" ) then anchor = "LEFT";
        elseif( anchorto == "TOP" ) then anchor = "BOTTOM";
        elseif( anchorto == "BOTTOM" ) then anchor = "TOP";
        end

        return anchorto, anchor;
end

function MoveAnything_Move( moveFrameName, helpfulName )
        if( MoveAnything_MoveOnlyWhenVisible[ moveFrameName ] ) then
                local frame = getglobal( moveFrameName );
                if( frame == nil or not frame:IsVisible() ) then
                        Error( "That window may only be moved when it is visible" );
                        return;
                end
        end

        if( not MoveAnything_FindMAFrame( moveFrameName ) ) then
                local frame = MoveAnything_FindAvailableFrame();
                if( frame == nil ) then
                        Error( "You can only move "..MOVEANYTHING_MOVEATONETIME.." frames at once." );
                elseif( getglobal( moveFrameName ) == nil ) then
                        Error( "\""..moveFrameName.."\" is not a valid frame name." );
                else
                        local moveFrame = getglobal( moveFrameName );
                        MoveAnything_AddFrameToMovableList( moveFrameName, helpfulName );
                        MoveAnything_HookFrame( moveFrameName );
                        MoveAnything_Attach( frame, getglobal( moveFrameName ) );
                        if( moveFrame.OnMoveAnythingPostAttach ) then
                                moveFrame.OnMoveAnythingPostAttach( moveFrame );
                        end
                        if( MAOptions:IsVisible() ) then
                                MoveAnythingOptions_Update();
                        end
                end
        end
end

function MA_Mover(dir)
        if ( dir > 0 ) then
                if ( CurrentMover < 20 ) then
                        CurrentMover = CurrentMover + 1;
                else
                        return;
                end
        else
                if ( CurrentMover > 1 ) then
                        CurrentMover = CurrentMover - 1;
                else
                        return;
                end
        end
        MA_NudgerFrameRefresh();
end

function MA_GetFirstMover()
        for i = 1, 20 do
                if ( getglobal("MoveAnything"..i):IsVisible() ) then
                        return i;
                end
        end
end

function MoveAnythingOptions_OnHide()
        MA_MoverOnHide();
end

function MA_MoverOnShow()
        ResizingNudger:Show();
        CurrentMover = tonumber(this:GetID());
        MA_NudgerFrameRefresh();
end

function MA_MoverOnHide()
        if ( MA_GetFirstMover() ) then
                CurrentMover = MA_GetFirstMover();
                MA_NudgerFrameRefresh();
        elseif ( MAOptions:IsVisible() ) then
                CurrentMover = 1;
                MA_NudgerFrameRefresh(1);
        else
                ResizingNudger:Hide();
        end
end

function MA_NudgerOnShow()
        MA_NudgerFrameRefresh();
end

function MA_NudgerFrameRefresh(reset)
        if ( CurrentMover < 20 ) then
                ResizingNudger_MoverPlus:Enable();
        else
                ResizingNudger_MoverPlus:Disable();
        end
        if ( CurrentMover > 1 ) then
                ResizingNudger_MoverMinus:Enable();
        else
                ResizingNudger_MoverMinus:Disable();
        end

        local labelText = "MA "..CurrentMover.."/20";
        if ( not reset and getglobal("MoveAnything"..CurrentMover).tagged ) then
                labelText = labelText.."\n"..getglobal("MoveAnything"..CurrentMover).tagged:GetName();
        end
        ResizingNudgerTitle:SetText(labelText);
end

function MA_NudgerOnUpdate()
        -- This code is ripped from DiscordART :)
        local obj = GetMouseFocus();
        local text = "MouseOver: ";
        local label = ResizingNudgerMouseOver;

        if (obj and obj ~= WorldFrame and obj:GetName()) then
                text = text..obj:GetName();
                if (obj:GetParent()  and obj:GetParent() ~= WorldFrame and obj:GetParent():GetName() ) then
                        text = text.."\nParent: "..obj:GetParent():GetName();
                        if (obj:GetParent():GetParent() and obj:GetParent():GetParent() ~= WorldFrame and obj:GetParent():GetParent():GetName()) then
                                text = text.."\nParent's Parent: "..obj:GetParent():GetParent():GetName();
                        end
                end
        end

        if ( not string.find(text, "ResizingNudger") ) then
                label:SetText(text);
        else
                label:SetText("MouseOver: ");
        end
end

function MoveAnything_MoveFrameUnderCursor()
        local obj = GetMouseFocus();
        if (obj and obj ~= WorldFrame and obj ~= UIParent and obj:GetName()) then
                MoveAnything_ToggleMove( obj:GetName() );
        end
end

function MA_Center(lock)
        local mover = getglobal("MoveAnything"..CurrentMover);
        if ( lock == 0 ) then
                -- Both
                mover:ClearAllPoints();
                mover:SetPoint("CENTER",0,0);
        else
                local x, y;
                x = mover:GetLeft();
                y = mover:GetBottom();

                mover:ClearAllPoints();
                if ( lock == 1 ) then
                        --Horizontal
                        mover:SetPoint("CENTER",0,0);
                        x = mover:GetLeft();
                        mover:ClearAllPoints();
                        mover:SetPoint("BOTTOMLEFT",x,y);
                elseif ( lock == 2 ) then
                        -- Vertical
                        mover:SetPoint("CENTER",0,0);
                        y = mover:GetBottom();
                        mover:ClearAllPoints();
                        mover:SetPoint("BOTTOMLEFT",x,y);
                end
        end

        MoveAnything_UpdatePosition(mover);
end

function MA_Nudge(dir, button)
        local x, y, offsetX, offsetY, parent, mover, offsetAmount;
        mover = getglobal("MoveAnything"..CurrentMover);

        if ( not mover:IsVisible() ) then
                return;
        end

        x = mover:GetLeft();
        y = mover:GetBottom();

        if ( button == "RightButton" ) then
                if ( IsShiftKeyDown() ) then
                        offsetAmount = 250;
                else
                        offsetAmount = 50;
                end
        else
                if ( IsShiftKeyDown() ) then
                        offsetAmount = 10;
                else
                        offsetAmount = 1;
                end
        end

        if ( dir == 1 ) then
                offsetX = 0;
                offsetY = offsetAmount;
        elseif ( dir == 2 ) then
                offsetX = 0;
                offsetY = -offsetAmount;
        elseif ( dir == 3 ) then
                offsetX = -offsetAmount;
                offsetY = 0;
        elseif ( dir == 4 ) then
                offsetX = offsetAmount;
                offsetY = 0;
        end

        mover:ClearAllPoints();
        mover:SetPoint("BOTTOMLEFT","UIParent","BOTTOMLEFT",x + offsetX, y + offsetY);
        MoveAnything_UpdatePosition(mover);
end

function MoveAnything_UpdatePosition( moveFrame )
        local x, y, parent;
        x = nil;
        y = nil;
        parent = nil;
        if( moveFrame.tagged ) then
                if( MoveAnything_DetachFromParent[ moveFrame.tagged:GetName() ] ) then
                        x = moveFrame.tagged:GetLeft();
                        y = moveFrame.tagged:GetBottom();
                        parent = UIParent;
                else
                        x, y = MoveAnything_GetRelativeBottomLeft( moveFrame.tagged );
                        parent = MAGetParent( moveFrame.tagged );
                end
                local opt = MoveAnything_FindFrameOptions( moveFrame.tagged:GetName(), "UpdatePosition" );
                opt.x = x;
                opt.y = y;
        end
        return x, y, parent;
end

function MoveAnything_StopMoving( moveFrameName )
        local frame = MoveAnything_FindMAFrame( moveFrameName );
        if( frame ) then
                MoveAnything_Detach( frame );
                if( MAOptions:IsVisible() ) then
                        MoveAnythingOptions_Update();
                end
        end
end

function MoveAnything_ToggleMove( moveFrameName )
        if( MoveAnything_FindMAFrame( moveFrameName ) ) then
                MoveAnything_StopMoving( moveFrameName );
        else
                MoveAnything_Move( moveFrameName );
        end
end

function MoveAnything_FindMAFrame( moveFrameName )
        local frame;
        for i = 1, MOVEANYTHING_MOVEATONETIME, 1 do
                frame = getglobal( "MoveAnything"..i );
                if( type(frame) ~= "nil" and frame:IsVisible() and frame.tagged == getglobal( moveFrameName ) ) then
                        return frame;
                end
        end
        return nil;
end

function MoveAnything_FindAvailableFrame()
        local frame;
        for i = 1, MOVEANYTHING_MOVEATONETIME, 1 do
                frame = getglobal( "MoveAnything"..i );
                if( not( frame:IsVisible() ) ) then
                        return frame;
                end
        end
        return nil;
end

function MoveAnything_OnSizeChanged( this )
        if( this.tagged ) then
                local s, w, h, opt;

                opt = MoveAnything_FindFrameOptions( this.tagged:GetName(), "OnSizeChanged" );

                if( MoveAnything_ScaleWH[ this.tagged:GetName() ] ) then
                        this.tagged:SetHeight( this:GetHeight() );
                        this.tagged:SetWidth( this:GetWidth() );
                        -- if this ever needs to apply to a frame with attached children,
                        -- we're going to have to figure out what to do, since setting
                        -- the W and H directly is definitely incorrect

                        if( opt ) then
                                opt.width = this:GetHeight();
                                opt.height = this:GetHeight();
                        end
                else
                        if( this.MASizingAnchor == "LEFT" or this.MASizingAnchor == "RIGHT" ) then
                                w = this:GetWidth();
                                h = w * (this.tagged:GetHeight() / this.tagged:GetWidth());
                                if( h < 16 ) then
                                        h = 16;
                                        w = h * (this.tagged:GetWidth() / this.tagged:GetHeight());
                                end
                        else
                                h = this:GetHeight();
                                w = h * (this.tagged:GetWidth() / this.tagged:GetHeight());
                                if( w < 16 ) then
                                        w = 16;
                                        h = w * (this.tagged:GetHeight() / this.tagged:GetWidth());
                                end
                        end
                        s = this:GetWidth() / this.tagged:GetWidth();
                        s = s / MAGetScale( this.tagged:GetParent(), 1  ) * UIParent:GetScale();

                        if( MoveAnything_ScaleAllowed( this.tagged:GetName() ) ) then
                                if( opt ) then
                                        opt.scale = s;
                                end

                                this.tagged:HiddenSetScale( s );
                                if( this.tagged.attachedChildren ) then
                                        for i, v in this.tagged.attachedChildren do
                                                v:HiddenSetScale( s );
                                        end
                                end
                        end
                        this:SetWidth( w );
                        this:SetHeight( h );
                end
        end
end

function MoveAnything_GetParentScaleRatio( frame )
        return MAGetScale( frame, 1 );
end

--[[
function MoveAnything_GetRelativeBottomLeft( tagFrame )
        x = tagFrame:GetLeft();
        if( x ) then
                x = x - MAGetParent( tagFrame ):GetLeft() * MAGetScale( tagFrame );
        end
        y = tagFrame:GetBottom();
        if( y ) then
                y = y - MAGetParent( tagFrame ):GetBottom() * MAGetScale( tagFrame );
        end
        return x,y;
end
]]

function MoveAnything_GetRelativeBottomLeft( tagFrame )
        x = tagFrame:GetLeft();
        if( x ) then
                x = x - MAGetParent( tagFrame ):GetLeft() * MAGetScale( MAGetParent( tagFrame ) ) / MAGetScale( tagFrame );
        end
        y = tagFrame:GetBottom();
        if( y ) then
                y = y - MAGetParent( tagFrame ):GetBottom() * MAGetScale( MAGetParent( tagFrame ) ) / MAGetScale( tagFrame );
        end
        return x,y;
end

function MoveAnything_Attach( moveFrame, tagFrame )
        if( moveFrame.tagged ) then
                MoveAnything_Detach( moveFrame );
        end

        local listOptions = MoveAnything_FindFrame( tagFrame:GetName() );
        local frameOptions = MoveAnything_FindFrameOptions( tagFrame:GetName(), "Attach" );
        frameOptions.movable = true;
        moveFrame.helpfulName = listOptions.helpfulName;

        if( tagFrame.OnBeginMove ) then
                if( not tagFrame:OnBeginMove() ) then
                        MoveAnything_Detach( moveFrame );
                        return;
                end
        end

        local x, y;
        if( tagFrame:GetLeft() == nil ) then tagFrame:Show(); tagFrame:Hide(); end
        x = tagFrame:GetLeft() * MAGetScale( tagFrame, 1 ) / UIParent:GetScale();
        x = x - MAGetParent( tagFrame ):GetLeft() * MAGetScale( MAGetParent( tagFrame ), 1 ) / UIParent:GetScale();
        
        y = tagFrame:GetBottom() * MAGetScale( tagFrame, 1 ) / UIParent:GetScale();
        y = y - MAGetParent( tagFrame ):GetBottom() * MAGetScale( MAGetParent( tagFrame ), 1 ) / UIParent:GetScale();

        moveFrame:ClearAllPoints();
        moveFrame:SetPoint( "BOTTOMLEFT", MAGetParent( tagFrame ):GetName(), "BOTTOMLEFT", x, y );
        moveFrame:SetWidth( tagFrame:GetWidth() * MAGetScale( tagFrame , 1 ) / UIParent:GetScale() );
        moveFrame:SetHeight( tagFrame:GetHeight() * MAGetScale( tagFrame, 1 ) / UIParent:GetScale() );  moveFrame:SetFrameLevel( tagFrame:GetFrameLevel() + 1 );
        tagFrame:HiddenClearAllPoints();
        tagFrame:HiddenSetPoint( "BOTTOMLEFT", moveFrame:GetName(), "BOTTOMLEFT", 0, 0 );

        moveFrame.tagged = tagFrame;

        moveFrame:Show();
end

function MoveAnything_Detach( moveFrame )
        if( moveFrame.tagged ) then
                local x, y, parent = MoveAnything_UpdatePosition( moveFrame );
                moveFrame.tagged:HiddenClearAllPoints();
                moveFrame.tagged:HiddenSetPoint( "BOTTOMLEFT", parent:GetName(), "BOTTOMLEFT", x, y );
        end
        moveFrame:Hide();
        moveFrame.tagged = nil;
end

function MoveAnything_ResetFrameOptions( frameName )
        MoveAnything_StopMoving( frameName );
        local frame = getglobal( frameName );
        if ( not frame ) then return; end

        if( frame.OnMoveAnythingPreReset ) then
                frame.OnMoveAnythingPreReset( frame );
        end

        MoveAnything_AllowExternalMovement( frame );
        local opt = MoveAnything_FindFrameOptions( frameName, "Reset Frame Options" );
        local left = nil;
        local bottom = nil;
        local hidden = false;
        local width = nil;
        local height = nil;
        if( opt ) then
                left = opt.originalLeft;
                bottom = opt.originalBottom;
                width = opt.originalWidth;
                height = opt.originalHeight;
                if( opt.hidden ) then
                        opt.hidden = false;
                        MoveAnything_ShowFrame( frame );
                end
        end
        frame:ClearAllPoints();
        frame:SetPoint( "BOTTOMLEFT", MAGetParent( frame ):GetName(), "BOTTOMLEFT", left, bottom );
        if( MoveAnything_ScaleAllowed( frame:GetName() ) ) then
                frame:SetScale( opt.originalScale );
        end
        if( width ) then frame:SetWidth( width ); end
        if( height ) then frame:SetHeight( height ); end
        if( frame.attachedChildren ) then
                for i, v in frame.attachedChildren do
                        if( MoveAnything_ScaleAllowed( frame:GetName() ) ) then
                                v:SetScale( opt.originalScale );
                        end
                end
        end

        if( frame.OnMoveAnythingPostReset ) then
                frame.OnMoveAnythingPostReset( frame );
        end

        frame.attachedChildren = nil;
        if( opt and opt.UIPanelWindows ) then
                UIPanelWindows[frameName] = opt.UIPanelWindows;
                if( frame:IsVisible() ) then
                        frame:Hide();
                        ShowUIPanel( frame );
                end
        end
        MoveAnything_ClearFrameOptions( frameName );
        if( MAOptions:IsVisible() ) then
                MoveAnythingOptions_Update();
        end
end

function MoveAnything_ToggleOptionsMenu()
        if( MAOptions:IsVisible() ) then
                MAOptions:Hide();
        else
                MAOptions:Show();
        end
end

function MoveAnythingOptions_OnShow()
        ResizingNudger:Show();
        MoveAnythingOptions_Update();
end

function MoveAnything_GetIndex( frame )
        local index = tonumber( string.sub( frame:GetName(), string.len( "MAMove" ) + 1, -1 ) );
        return index + FauxScrollFrame_GetOffset( MAScrollFrame );
end

function MoveAnything_GetMovableFrame( optionsListFrame )
        local index = MoveAnything_GetIndex( optionsListFrame );
        return getglobal( MoveAnything_Frames[index].name );
end

function MoveAnything_OnMoveCheck( button )
        local frame = MoveAnything_GetMovableFrame( MAGetParent( button ) );
        if ( not frame ) then return; end
        if( button:GetChecked() ) then
                MoveAnything_Move( frame:GetName() );
        else
                MoveAnything_StopMoving( frame:GetName() );
        end
        if( MAOptions:IsVisible() ) then
                MoveAnythingOptions_Update();
        end
end

function MoveAnything_HiddenShow( this )
        this.MAWantsToBeVisible = true;
end

function MoveAnything_HiddenHide( this )
        this.MAWantsToBeVisible = false;
end

function MoveAnything_HiddenIsVisible( this )
        return this.MAWantsToBeVisible;
end

function MoveAnything_HideFrame( frame )
        if ( not frame ) then return; end
        if ( not MoveAnything_IsFrameHooked( frame:GetName() ) ) then
                MoveAnything_HookFrame( frame:GetName() );
        end
        local opt = MoveAnything_FindFrameOptions( frame:GetName(), "HideFrame" );
        opt.hidden = true;
        frame.MAWantsToBeVisible = frame:IsVisible();
        if( MoveAnything_HideList[ frame:GetName() ] ) then
                for hIndex, hideEntry in MoveAnything_HideList[ frame:GetName() ] do
                        local val = getglobal( hideEntry[1] );
                        local hideType;
                        for i = 2, table.getn( hideEntry ) do
                                hideType = hideEntry[i];
                                if( type( hideType ) == "function" ) then
                                        hideType( false );
                                elseif( hideType == "DISABLEMOUSE" ) then
                                        val:EnableMouse( false );
                                elseif( hideType == "FRAME" ) then
                                        MoveAnything_PreventExternalVisibility( val );
                                elseif( hideType == "WH" ) then
                                        MoveAnything_StopMoving( frame:GetName() );
                                        val:SetWidth( 1 );
                                        val:SetHeight( 1 );
                                else
                                        val:DisableDrawLayer( hideType );
                                end
                        end
                end
        elseif( MoveAnything_HideUsingWH[ frame:GetName() ] ) then
                MoveAnything_StopMoving( frame:GetName() );
                frame:SetWidth( 1 );
                frame:SetHeight( 1 );
        else
                MoveAnything_PreventExternalVisibility( frame );
        end
end

function MoveAnything_ShowFrame( frame )
        -- if being hidden is the only thing we're controlling with this frame
        -- do a full reset instead of a simple show
        if ( not frame ) then return; end
        local opt = MoveAnything_FindFrameOptions( frame:GetName(), "ShowFrame" );
        if( opt and opt.hidden ) then
                if( not opt.movable ) then
                        MoveAnything_ResetFrameOptions( frame:GetName() );
                        return;
                end
        end

        if( opt ) then
                opt.hidden = false;
        end
        if( MoveAnything_HideList[ frame:GetName() ] ) then
                for hIndex, hideEntry in MoveAnything_HideList[ frame:GetName() ] do
                        local val = getglobal( hideEntry[1] );
                        local hideType;
                        for i = 2, table.getn( hideEntry ) do
                                hideType = hideEntry[i];
                                if( type( hideType ) == "function" ) then
                                        hideType( true );
                                elseif( hideType == "DISABLEMOUSE" ) then
                                        val:EnableMouse( true );
                                elseif( hideType == "FRAME" ) then
                                        MoveAnything_AllowExternalVisibility( val );
                                elseif( hideType == "WH" ) then
                                        val:SetWidth( opt.originalWidth );
                                        val:SetHeight( opt.originalHeight );
                                else
                                        val:EnableDrawLayer( hideType );
                                end
                        end
                end
        elseif( MoveAnything_HideUsingWH[ frame:GetName() ] ) then
                frame:SetWidth( opt.originalWidth );
                frame:SetHeight( opt.originalHeight );
        else
                MoveAnything_AllowExternalVisibility( frame );
        end
end

function MoveAnything_OnHideCheck( button )
        local frame = MoveAnything_GetMovableFrame( MAGetParent( button ) );
        if ( not frame ) then return; end
        if( button:GetChecked() ) then
                MoveAnything_HideFrame( frame );
        else
                MoveAnything_ShowFrame( frame );
        end
        MoveAnythingOptions_Update();
end

function MoveAnything_OnResetCheck( button )
        local frame = MoveAnything_GetMovableFrame( MAGetParent( button ) );
        if ( not frame ) then return; end
        MoveAnything_ResetFrameOptions( frame:GetName() );
end

function MoveAnything_OnCheckCharacterSpecific( button )
        local oldName = MoveAnything_CurrentSettingsName();
        if( button:GetChecked() ) then
                MoveAnything_UseCharacterSettings = true;
                MoveAnything_CopySettings( oldName, MoveAnything_CurrentSettingsName() );
        else
                MoveAnything_UseCharacterSettings = false;
                MoveAnything_CopySettings( oldName, MoveAnything_CurrentSettingsName() );
        end
        MoveAnythingOptions_Update();
end

function MoveAnythingOptions_Update()
        FauxScrollFrame_Update(MAScrollFrame, MoveAnything_GetFrameCount(), 10, MOVEANYTHING_SCROLL_HEIGHT );

        for i=1, 10, 1 do
                local index = FauxScrollFrame_GetOffset(MAScrollFrame) + i;
                if( index <= MoveAnything_GetFrameCount() ) then
                        local f = getglobal( "MAMove"..i.."FrameNameText" );
                        f:SetText( MoveAnything_Frames[index].helpfulName );
                        if( MoveAnything_Frames[index] ) then
                                getglobal( "MAMove"..i ):Show();
                        end

                        local opt = MoveAnything_FindFrameOptions( MoveAnything_Frames[index].name, "MAOptions Update" );
                        if( MoveAnything_Frames[index].name ) then
                                getglobal( "MAMove"..i.."Backdrop" ):Show();
                                getglobal( "MAMove"..i.."Move" ):Show();
                        else
                                getglobal( "MAMove"..i.."Backdrop" ):Hide();
                                getglobal( "MAMove"..i.."Move" ):Hide();
                        end

                        if( MoveAnything_FindMAFrame( MoveAnything_Frames[index].name ) ) then
                                getglobal( "MAMove"..i.."Move" ):SetChecked( 1 );
                        else
                                getglobal( "MAMove"..i.."Move" ):SetChecked( nil );
                        end
                        if( opt and opt.hidden ) then
                                getglobal( "MAMove"..i.."Hide" ):SetChecked( 1 );
                        else
                                getglobal( "MAMove"..i.."Hide" ):SetChecked( nil );
                        end

                        -- disallow hiding?
                        if( not MoveAnything_Frames[index].name or
                                        MoveAnything_NoHide[ MoveAnything_Frames[index].name ] ) then
                                getglobal( "MAMove"..i.."Hide" ):Hide();
                        else
                                getglobal( "MAMove"..i.."Hide" ):Show();
                        end

                        -- add a reset button if it's movable
                        if( MoveAnything_IsFrameHooked( MoveAnything_Frames[index].name ) ) then
                                getglobal( "MAMove"..i.."Reset" ):Show();
                        else
                                getglobal( "MAMove"..i.."Reset" ):Hide();
                        end
                else
                        getglobal( "MAMove"..i ):Hide();
                end

        end

        if( MoveAnything_UseCharacterSettings ) then
                MAOptionsCharacterSpecific:SetChecked( 1 );
        else
                MAOptionsCharacterSpecific:SetChecked( nil );
        end
end

function FuckMe()
        MoveAnything_FrameOptions = {};
end

function MoveAnythingOptions_ResetAll()
        for i,v in MoveAnything_FrameOptions do
                MoveAnything_ResetFrameOptions( v.name );
        end
        MoveAnything_FrameOptions = {};
end

function MoveAnything_FindContainerFrame( id )
        local i = 1;
        local container;
        while( 1 ) do
                container = getglobal( "ContainerFrame"..i );
                if( not container ) then break; end
                if( container:IsVisible() and container:GetID() == id ) then
                        return container;
                end
                i = i + 1;
        end
        return nil;
end

function MoveAnything_GrabContainerFrame( container, movableBag )
        if( movableBag and MoveAnything_IsFrameHooked( movableBag:GetName() ) ) then
                MoveAnything_PreventExternalMovement( container );
                container.MAContainerOriginalScale = MAGetScale( container );
                movableBag:Show();
                container:HiddenClearAllPoints();
                container:HiddenSetScale( MAGetScale( movableBag ) );
                --container:HiddenSetPoint( "BOTTOMLEFT", "UIParent", "BOTTOMLEFT", movableBag:GetLeft(), movableBag:GetBottom() );
                container:HiddenSetPoint( "BOTTOMLEFT", movableBag:GetName(), "BOTTOMLEFT", 0, 0 );
                movableBag.attachedChildren = {};
                table.insert( movableBag.attachedChildren, container );
        end
end

function MoveAnything_RemoveContainerFromList( container )
        -- Remove this bag from the list and collapse the rest of the entries
        local index = 1;
        local tempIndex;
        while ContainerFrame1.bags[index] do
                if ( ContainerFrame1.bags[index] == container:GetName() ) then
                        ContainerFrame1.bagsShown = ContainerFrame1.bagsShown - 1;
                        local tempIndex = index;
                        while ContainerFrame1.bags[tempIndex] do
                                if ( ContainerFrame1.bags[tempIndex + 1] ) then
                                        ContainerFrame1.bags[tempIndex] = ContainerFrame1.bags[tempIndex + 1];
                                else
                                        ContainerFrame1.bags[tempIndex] = nil;
                                end
                                tempIndex = tempIndex + 1;
                        end
                end
                index = index + 1;
        end
        updateContainerFrameAnchors();
end

-- TOOLTIP HOOKS
MoveAnything_OriginalSetDefaultAnchor = GameTooltip_SetDefaultAnchor;
function GameTooltip_SetDefaultAnchor(tooltip, parent)
        if( MoveAnything_IsFrameHooked( "TooltipMover" ) and tooltip == GameTooltip ) then
                -- anchor the tooltip to the side of the mover that is closest to the edge
                local l, r, t, b, a, anchor;
                l = TooltipMover:GetLeft() - UIParent:GetLeft();
                r = UIParent:GetRight() - TooltipMover:GetRight();
                t = UIParent:GetTop() - TooltipMover:GetTop();
                b = TooltipMover:GetBottom() - UIParent:GetBottom();
                a = t;
                anchor = "TOP";
                if( l < a ) then a = l; anchor = "LEFT"; end
                if( r < a ) then a = r; anchor = "RIGHT"; end
                if( b < a ) then a = b; anchor = "BOTTOM"; end

                tooltip:ClearAllPoints();
                tooltip:SetOwner(parent, "ANCHOR_NONE");
                tooltip:SetPoint( anchor, "TooltipMover", anchor, 0, 0 );
                tooltip.default = 1;
        else
                tooltip:ClearAllPoints();
                MoveAnything_OriginalSetDefaultAnchor( tooltip, parent );
        end
end
MoveAnything_OriginalGameTooltip_OnHide = GameTooltip_OnHide;
function GameTooltip_OnHide()
        MoveAnything_AllowExternalMovement( this );
        MoveAnything_OriginalGameTooltip_OnHide();
end

-- BAG FRAME HOOKS
MoveAnything_BagFrames = {};
MoveAnything_OriginalGenerateFrame = ContainerFrame_GenerateFrame;
function ContainerFrame_GenerateFrame(frame, size, id)
        local bag = MoveAnything_BagFrames[id]
        MoveAnything_OriginalGenerateFrame( frame, size, id );
        MoveAnything_GrabContainerFrame( frame, bag );
end
MoveAnything_OriginalOnHide = ContainerFrame_OnHide;
function ContainerFrame_OnHide()
        local bag = MoveAnything_BagFrames[this:GetID()];
        if( bag and MoveAnything_IsFrameHooked( bag:GetName() ) ) then
                MoveAnything_AllowExternalMovement( this );
                if( this.MAContainerOriginalScale ) then
                        this:SetScale( this.MAContainerOriginalScale );
                        this.MAContainerOriginalScale = nil;
                end
                this:ClearAllPoints();
                -- we removed the container from the list before, but now we have to add
                -- it back, since the container code is going to try to remove it, and doesn't
                -- particularly care if it's already gone
                ContainerFrame1.bagsShown = ContainerFrame1.bagsShown + 1;
                ContainerFrame1.bags[ContainerFrame1.bagsShown] = this:GetName();
        end
        MoveAnything_OriginalOnHide();
end
MoveAnything_OriginalOnShow = ContainerFrame_OnShow;
function ContainerFrame_OnShow()
        MoveAnything_OriginalOnShow();
        local bag = MoveAnything_BagFrames[this:GetID()];
        if( bag and MoveAnything_IsFrameHooked( bag:GetName() ) ) then
                MoveAnything_RemoveContainerFromList( this );
        end
end

-- TALENT BUTTON HOOK
MoveAnything_OriginalUpdateTalentButton = UpdateTalentButton;
function UpdateTalentButton()
        if( MoveAnything_IsFrameHooked( "MicroButtonsVerticalMover" ) ) then
                if ( UnitLevel("player") < 10 ) then
                        TalentMicroButton:Hide();
                        QuestLogMicroButton:SetPoint("TOPLEFT", "TalentMicroButton", "TOPLEFT", 0, 0);
                else
                        TalentMicroButton:Show();
                        QuestLogMicroButton:SetPoint("TOPLEFT", "TalentMicroButton", "BOTTOMLEFT", 0, 24);
                end
        else
                MoveAnything_OriginalUpdateTalentButton();
        end
end

--- UI PANEL HOOKS
function MoveAnything_SetLeftFrameLocation()
        local left = GetLeftFrame();
        if( left ) then
                if( MoveAnything_IsFrameHooked( "UIPanelMover1" ) ) then
                        left:ClearAllPoints();
                        left:SetPoint( "TOPLEFT", "UIPanelMover1", "TOPLEFT" );
                        left:SetScale( MAGetScale( UIPanelMover1 ), 1 );
                else
                        left:SetScale( 1 );
                end
        end
end

function MoveAnything_SetCenterFrameLocation()
        -- don't mess with the normal center panels, just the ones
        -- that are pushed over from the left
        if( GetLeftFrame() ) then
                local center = GetCenterFrame();
                if( center ) then
                        if( MoveAnything_IsFrameHooked( "UIPanelMover2" ) ) then
                                center:ClearAllPoints();
                                center:SetPoint( "TOPLEFT", "UIPanelMover2", "TOPLEFT" );
                                center:SetScale( MAGetScale( UIPanelMover2 ), 1 );
                        else
                                center:SetScale( 1 );
                        end
                end
        end
end

MoveAnything_OriginalShowUIPanel = ShowUIPanel;
function ShowUIPanel(frame)
        MoveAnything_OriginalShowUIPanel(frame);
        MoveAnything_SetLeftFrameLocation();
        MoveAnything_SetCenterFrameLocation();
end
MoveAnything_OriginalMovePanelToLeft = MovePanelToLeft;
function MovePanelToLeft()
        MoveAnything_OriginalMovePanelToLeft();
        MoveAnything_SetLeftFrameLocation();
end
MoveAnything_OriginalMovePanelToCenter = MovePanelToCenter;
function MovePanelToCenter()
        MoveAnything_OriginalMovePanelToCenter();
        MoveAnything_SetCenterFrameLocation();
end
MoveAnything_OriginalCloseAllWindows = CloseAllWindows;
function CloseAllWindows(ignoreCenter)
        local closed = nil, oclosed;
        for i, v in MoveAnything_Frames do
                if( MoveAnything_IsFrameHooked( v.name ) ) then
                        local opt = MoveAnything_FindFrameOptions( v.name, "CloseAllWindows" );
                        if( opt and opt.UIPanelWindows ) then
                                if ( type(getglobal(v.name)) ~= "nil" ) then
                                        if( getglobal( v.name ):IsVisible() ) then
                                                getglobal( v.name ):Hide();
                                                closed = true;
                                        end
                                end
                        end
                end
        end
        oclosed = MoveAnything_OriginalCloseAllWindows( ignoreCenter );
        if( oclosed or closed ) then
                return true;
        end
        return nil;
end

--- ACTION BUTTON HOOKS
MoveAnything_OriginalShowBonusActionBar = ShowBonusActionBar;
function ShowBonusActionBar()
        if( MoveAnything_IsFrameHooked( "BasicActionButtonsMover" ) or
                MoveAnything_IsFrameHooked( "BasicActionButtonsVerticalMover" ) or
                MoveAnything_IsFrameHidden( "MainMenuBar" ) ) then
                for i = 1, 12, 1 do
                        getglobal( "ActionButton"..i ):Hide();
                        MoveAnything_PreventExternalVisibility( getglobal( "ActionButton"..i ) );
                end
        end
        MoveAnything_OriginalShowBonusActionBar();
end

MoveAnything_OriginalHideBonusActionBar = HideBonusActionBar;
function HideBonusActionBar()
        local hooked = nil;
        local opt = nil;
        if( MoveAnything_IsFrameHooked( "BasicActionButtonsMover" ) ) then
                hooked = "BasicActionButtonsMover";
        elseif( MoveAnything_IsFrameHooked( "BasicActionButtonsVerticalMover" ) ) then
                hooked = "BasicActionButtonsVerticalMover";
        end
        if( hooked ) then
                opt = MoveAnything_FindFrameOptions( hooked, "HideBonusActionBar" );
        end
        if( hooked or MoveAnything_IsFrameHidden( "MainMenuBar" ) ) then
                for i = 1, 12, 1 do
                        getglobal( "ActionButton"..i ):Show();
                        if( (not opt) or (not opt.hidden) ) then
                                MoveAnything_AllowExternalVisibility( getglobal( "ActionButton"..i ) );
                        end
                end
        end
        MoveAnything_OriginalHideBonusActionBar();
end

SLASH_MOVEANYTHING1 = "/move"
SlashCmdList["MOVEANYTHING"] = function( msg )
        if( msg == nil or string.len( msg ) == 0 ) then
                MoveAnything_ToggleOptionsMenu();
        else
                MoveAnything_ToggleMove( msg );
        end
end

SLASH_UNMOVEANYTHING1 = "/unmove"
SlashCmdList["UNMOVEANYTHING"] = function( msg )
        if( msg ) then
                MoveAnything_StopMoving( msg );
                local frame = getglobal( msg );
                MoveAnything_AllowExternalMovement( frame );
                frame:ClearAllPoints();
                frame:SetPoint( "CENTER", MAGetParent( frame ):GetName(), "CENTER", 0, 0 );
        end
end

SLASH_MOVEANYTHINGCOPYSETTINGS1 = "/movecopy"
SlashCmdList["MOVEANYTHINGCOPYSETTINGS"] = function( msg )
        if( msg == nil or string.len( msg ) == 0 ) then
                Error( "Syntax: /movecopy ServerName PlayerName" );
                Error( "Use /movelist to see a current list of valid settings" );
                return;
        end

        if( MoveAnything_CharacterSettings[msg] == nil ) then
                Error( "No settings for server/character "..msg );
                Error( "Use /movelist to see a current list of valid settings" );
                return;
        end

        MoveAnything_CopySettings( msg, MoveAnything_CurrentSettingsName() );
end

SLASH_MOVEANYTHINGLISTSETTINGS1 = "/movelist"
SlashCmdList["MOVEANYTHINGLISTSETTINGS"] = function( msg )
        Print( "Server/Character Settings List:", 1.0, 1.0, 0.2 );
        Print( "-------------------------------", 1.0, 1.0, 0.2 );
        for i, val in MoveAnything_CharacterSettings do
                local str = i;
                if( val == MoveAnything_FrameOptions ) then
                        str = str.." (Current)";
                end
                Print( str, 1.0, 1.0, 0.2 );
        end
end

SLASH_MOVEANYTHINGDELETESETTINGS1 = "/movedelete"
SLASH_MOVEANYTHINGDELETESETTINGS2 = "/movedel"
SlashCmdList["MOVEANYTHINGDELETESETTINGS"] = function( msg )
        if( msg == nil or string.len( msg ) == 0 ) then
                Error( "Syntax: /movedelete ServerName PlayerName" );
                Error( "Use /movelist to see a current list of valid settings" );
                return;
        end

        if( MoveAnything_CharacterSettings[msg] == nil ) then
                Error( "No settings for server/character "..msg );
                Error( "Use /movelist to see a current list of valid settings" );
                return;
        end

        if( msg == MoveAnything_CurrentSettingsName() ) then
                MoveAnythingOptions_ResetAll();
        else
                MoveAnything_CharacterSettings[msg] = nil;
        end
        MoveAnything_FrameOptions = MoveAnything_CharacterSettings[MoveAnything_CurrentSettingsName()];
        MoveAnything_RefreshPositions();
end

function GameMenu_AddButton( button )
        if( GameMenu_InsertAfter == nil ) then
                GameMenu_InsertAfter = GameMenuButtonMacros;
        end
        if( GameMenu_InsertBefore == nil ) then
                GameMenu_InsertBefore = GameMenuButtonLogout;
        end

        button:ClearAllPoints();
        button:SetPoint( "TOP", GameMenu_InsertAfter:GetName(), "BOTTOM", 0, -1 );
        GameMenu_InsertBefore:SetPoint( "TOP", button:GetName(), "BOTTOM", 0, -1 );
        GameMenu_InsertAfter = button;
        GameMenuFrame:SetHeight( GameMenuFrame:GetHeight() + button:GetHeight() + 2 );
end

if ( GameMenuButtonAddOns ) then
        GameMenu_AddButton(GameMenuButtonAddOns);
end

--TODO:
--ChatFrameEditBox move