--[[
 QuickMountEquip
    By Robert Jenkins (Merrem@Perenolde / Flarin@Sen'Jin)
  
  Automates equipping of items when mounting/dismounting

	UI based on Totem Stomper by AlexYoshi
  
]]
QME_Registered = nil;
QuickMount_Version = "2.20";

QuickMount_ConfigMap = nil;
QuickMount_Disabled = false;

-- Current Player information...
QMCP = "";

QuickMount_SavedBagFunc = nil;
QuickMount_SavedInvFunc = nil;
QuickMount_SavedUseFunc = nil;

local combat_flag = false;
local attack_button = 0;

local MOUNT = 1;
local UNMOUNT = 2;
local QM_SET_COUNT = 2;
local QM_SET_SIZE = 5;
local IGNORE_SWITCH = false;

local QM_NIL = -100;

local QuickMount_CurrentID = QM_NIL;
local QuickMount_CurrentBag = QM_NIL;
local QuickMount_CurrentSlot = QM_NIL;
local QuickMount_CurrentName = "";
local QuickMount_CurrentTexture = "";

local QuickMount_AutoDetect = false;

function QuickMount_RegisterEvents()
	this:RegisterEvent("VARIABLES_LOADED")		-- configuration loading
	if not Fetch_Frame then
		this:RegisterEvent("UNIT_NAME_UPDATE")	-- configuration loading
	end
	this:RegisterEvent("PLAYER_AURAS_CHANGED")	-- mount buff check
	this:RegisterEvent("ACTIONBAR_UPDATE_USABLE")	-- flight path check
	this:RegisterEvent("PLAYER_REGEN_DISABLED")	-- combat check
	this:RegisterEvent("PLAYER_REGEN_ENABLED")	-- combat check
	this:RegisterEvent("DELETE_ITEM_CONFIRM")		-- delete check
end

function QuickMount_UnregisterEvents()
	this:UnregisterEvent("PLAYER_AURAS_CHANGED")    -- mount buff check
	this:UnregisterEvent("ACTIONBAR_UPDATE_USABLE") -- flight path check
	this:UnregisterEvent("PLAYER_REGEN_DISABLED")   -- combat check
	this:UnregisterEvent("PLAYER_REGEN_ENABLED")    -- combat check
end

function QuickMount_ShowUsage()
	QM_Print("/mountequip on | off | quiet | verbose | flightpoint [on/off] | auto-reconfig [on/off] | config | status | load profileName | save profileName | delete profileName | profiles | detect\n");
end

function QuickMount_Toggle()
	QuickMount_Config("config");
end

-- Show/hide the Main Frame
function QuickMount_Config(msg)
	if QuickMount_CheckPlayer() == false then
		QM_Print("Sorry, QuickMountEquip variables aren't loaded yet.");
		return;
	end
	if msg == nil or msg == "" then
		msg = "config";
	end

	local args = {n=0}
	local function helper(word) table.insert(args, word) end
	string.gsub(msg, "[_%w]+", helper);

	if args[1] == 'off' then
		QuickMount_Disabled = true;
		QM_Print("QuickMountEquip disabled.");
	elseif args[1] == 'on' then
		QuickMount_Disabled = false;
		QM_Print("QuickMountEquip enabled.");
	elseif args[1] == 'quiet' then
		QuickMount_ConfigMap[QMCP]["Quiet"] = true;
		QM_Print("QuickMountEquip verbosity off.");
	elseif args[1] == 'verbose' then
		QuickMount_ConfigMap[QMCP]["Quiet"] = false;
		QM_Print("QuickMountEquip verbosity on.");
	elseif args[1] == 'flightpoint' or args[1] == 'flightpath' then
		if ( args[2] == nil or args[2] == '' or ( args[2] ~= 'on' and args[2] ~= 'off' ) ) then
			QM_Print("Do you want to turn flightpoint checking on or off?");
		else
			if args[2] == 'on' then
				QuickMount_ConfigMap[QMCP]["FlightPoint"] = true;
				QM_Print("QuickMountEquip Flight Point checking on.");
			else
				QuickMount_ConfigMap[QMCP]["FlightPoint"] = false;
				QM_Print("QuickMountEquip Flight Point checking off.");
			end
		end
	elseif args[1] == 'save' then
		if args[2] == nil or args[2] == '' then
			QM_Print("No profile name specified.");
		else
			QuickMount_ConfigMap["Profile" .. args[2]] = QuickMount_ConfigMap[QMCP];
			QM_Print("QuickMountEquip profile '" .. args[2] .. "' saved.");
		end
      elseif args[1] == 'load' then
		if args[2] == nil or args[2] == '' then
			QM_Print("No profile name specified.");
		else
			if QuickMount_ConfigMap["Profile" .. args[2]] then
				local last_action = QuickMount_ConfigMap[QMCP]["last_action"];
				QuickMount_ConfigMap[QMCP] = QuickMount_ConfigMap["Profile" .. args[2]];
				QuickMount_ConfigMap[QMCP]["last_action"] = last_action;
				QM_Print("QuickMountEquip profile '" .. args[2] .. "' loaded.");
			else
				QM_Print("QuickMountEquip profile '" .. args[2] .. "' not found!");
			end
		end
      elseif args[1] == 'delete' then
		if args[2] == nil or args[2] == '' then
			QM_Print("No profile name specified.");
		else
			if QuickMount_ConfigMap["Profile" .. args[2]] then
				QuickMount_ConfigMap["Profile" .. args[2]] = nil;
				QM_Print("QuickMountEquip profile '" .. args[2] .. "' deleted.");
			else
				QM_Print("QuickMountEquip profile '" .. args[2] .. "' not found!");
			end
		end
	elseif args[1] == 'profiles' then
		QM_Print("Profiles:");
		table.foreach(QuickMount_ConfigMap, function(k,v) if string.find(k, "Profile") then QM_Print(string.gsub(k, "Profile", '')) end end);
	elseif args[1] == 'detect' then
		if args[2] == nil or args[2] == '' then
			QM_Print("** Experimental / Advanced **");
			QM_Print("Do '/mountequip detect now' to attempt to detect the name of your mount. You should be unmounted and have zero buffs when you attempt this.");
			QM_Print("Then do '/mountequip detect on' to use the detected mount when mounting");
			QM_Print("Or '/mountequip detect off' to turn off the use of the detected mount");
			QM_Print("Or '/mountequip detect clear' to clear the detected setting completely");
			QM_Print("NOTE: If doing this fixes your mounting problem, please let the author know, so it can be automatically included in the next release.");
		elseif args[2] == 'now' then
			QM_Print("This will attempt to detect the name of your mount. The next buff that appears will be assumed to be your mount. This works best if you start out with zero buffs. You should mount up NOW.");
			QuickMount_AutoDetect = true;
			QuickMount_ConfigMap[QMCP]["DetectedIcon"] = nil;
			QuickMount_ConfigMap[QMCP]["UseDetectedIcon"] = false;
		elseif args[2] == 'on' then
			if QuickMount_ConfigMap[QMCP]["DetectedIcon"] ~= nil then
				QuickMount_ConfigMap[QMCP]["UseDetectedIcon"] = true;
				QM_Print("Auto-Detected mount option turned on");
			else
				QM_Print("Can't turn on use of the detected icon, since detection hasn't been done yet.");
			end
		elseif args[2] == 'off' then
			QuickMount_ConfigMap[QMCP]["UseDetectedIcon"] = false;
			QM_Print("Auto-Detected mount option turned off");
		elseif args[2] == 'clear' then
			QuickMount_ConfigMap[QMCP]["DetectedIcon"] = nil;
			QuickMount_ConfigMap[QMCP]["UseDetectedIcon"] = false;
			QM_Print("Cleared detect options.");
		end
	elseif args[1] == 'auto-reconfig' then
		local status = "";
		if args[2] == nil or args[2] == '' then
			if QuickMount_ConfigMap[QMCP]["auto-reconfig"] == true then
				QuickMount_ConfigMap[QMCP]["auto-reconfig"] = false;
				status = "toggled OFF";
			else
				QuickMount_ConfigMap[QMCP]["auto-reconfig"] = true;
				status = "toggled ON";
			end 
		elseif args[2] == 'on' then
			QuickMount_ConfigMap[QMCP]["auto-reconfig"] = true;
			status = "ON";
		elseif args[2] == 'off' then
			QuickMount_ConfigMap[QMCP]["auto-reconfig"] = false;
			status = "OFF";
		end
		QM_Print("Auto-reconfiguring is now " .. status);
	elseif args[1] == 'status' then
		QuickMount_ShowUsage();
		local status = "QuickMountEquip is currently";
		if QuickMount_Disabled == true then
			status = status .. " disabled";
		else
			status = status .. " enabled";
		end
		status = status .. ", flight point checking is";
		if QuickMount_ConfigMap[QMCP]["FlightPoint"] == false then
			status = status .. " off";
		else
			status = status .. " on";
		end
		status = status .. ", use of detected mount icon ";
		if QuickMount_ConfigMap[QMCP]["DetectedIcon"] ~= nil then
			status = status .. "(" .. QuickMount_ConfigMap[QMCP]["DetectedIcon"] .. ") is";
		else
			status = status .. "is";
		end
		if QuickMount_ConfigMap[QMCP]["UseDetectedIcon"] == false then
			status = status .. " off";
		else
			status = status .. " on";
		end
		status = status .. ", auto-reconfigure is";
		if QuickMount_ConfigMap[QMCP]["auto-reconfig"] == false then
			status = status .. " off";
		else
			status = status .. " on";
		end
		if QuickMount_ConfigMap[QMCP]["Quiet"] == false then
			status = status .. ", and is in verbose mode.";
		else
			status = status .. ", and is in quiet mode.";
		end
		QM_Print(status);
	elseif args[1] == 'config' then
            -- Reset attack_button, just in case they rearranged hot keys.
		attack_button = 0
		if ( QuickMountFrame ) then 
			if ( QuickMountFrame:IsVisible() ) then 
				HideUIPanel(QuickMountFrame);
			else	
				ShowUIPanel(QuickMountFrame);
			end
		else
			QM_Print("QuickMountEquip did not load. Please check your logs/FrameXML.log file and report this error");
		end
	else
		QuickMount_ShowUsage();
	end
end

function QuickMount_CheckPlayer()
	if QMCP == "" then
		local playername;
		if Fetch_Frame then
			if not Fetch_Done then
				return false;
			else
				playername = Fetch_PlayerName
			end
		else
			playername = UnitName("player");
			if playername == nil or playername == UKNOWNBEING or playername == UNKNOWNOBJECT then
				return false;
			end
		end
		QMCP = GetCVar("realmName") .. "." .. playername;
		-- Convert old config
		if QuickMount_ButtonMap ~= nil and QuickMount_ButtonMap[1] ~= nil then
			QuickMount_ConfigMap = {};
			QuickMount_ConfigMap[QMCP] = QuickMount_ButtonMap;
			QuickMount_ConfigMap[QMCP]["Quiet"] = false;
			QuickMount_ConfigMap[QMCP]["FlightPoint"] = false;
			QuickMount_ConfigMap[QMCP]["auto-reconfig"] = false;
		end
		if QuickMount_ConfigMap == nil or QuickMount_ConfigMap[QMCP] == nil then
			QuickMount_Reset();
		end
		if QuickMount_ConfigMap[QMCP]["FlightPoint"] == nil then
			QuickMount_ConfigMap[QMCP]["FlightPoint"] = false;
		end
		if QuickMount_ConfigMap[QMCP]["UseDetectedIcon"] == nil then
			QuickMount_ConfigMap[QMCP]["UseDetectedIcon"] = false;
		end
		if QuickMount_ConfigMap[QMCP]["auto-reconfig"] == nil then
			QuickMount_ConfigMap[QMCP]["auto-reconfig"] = false;
		end
		QuickMount_UpdateAllSets();
	end
	if QMCP == "" or QMCP == "NONE" then
		return false;
	else
		return true;
	end
end

-- Reset QuickMount
function QuickMount_Reset()
	if QuickMount_CheckPlayer() == false then
		return;
      end
	if QuickMount_ConfigMap == nil then
		QuickMount_ConfigMap = {};
	end
	QuickMount_ConfigMap[QMCP]={index=nil;};
	for i=1,QM_SET_COUNT,1 do
		QuickMount_ConfigMap[QMCP][i]={index=nil;};
		for j=1,QM_SET_SIZE,1 do
			QuickMount_ConfigMap[QMCP][i][j]= {id=QM_NIL;bag=QM_NIL;slot=QM_NIL;texture="";name="";};
		end
		QuickMount_ConfigMap[QMCP]["Quiet"] = false;
		QuickMount_ConfigMap[QMCP]["FlightPoint"] = false;
		QuickMount_ConfigMap[QMCP]["UseDetectedIcon"] = false;
		QuickMount_ConfigMap[QMCP]["DetectedIcon"] = nil;
		QuickMount_ConfigMap[QMCP]["auto-reconfig"] = false;
	end
end

function QuickMount_GetBuffName(buffIndex)
	local x, y = GetPlayerBuff(buffIndex, "HELPFUL");
	QuickMountTooltip:SetUnitBuff("player", buffIndex);
      local Bname = QuickMountTooltipTextLeft1:GetText();
	if ( Bname ~= nil ) then
		return Bname;
	end
	return nil;
end

function QuickMount_GetItemName(bag, slot)
	local bagNumber = bag;
	local name = "";
	if ( type(bagNumber) ~= "number" ) then
		bagNumber = tonumber(bag);
	end
	if (bagNumber <= QM_NIL) then
		QuickMountTooltip:SetInventoryItem("player", slot);
	else
		QuickMountTooltip:SetBagItem(bag, slot);
	end
	name = QuickMountTooltipTextLeft1:GetText();
	if name == nil then
		name = "";
	end
	return name;
end

function QuickMount_PickupContainerItem(bag, slot)
	local empty = true;
	local autoflag = false;
	local name = '';
	-- If we are set to auto-reconfigure, and we're unmounted and they are manually swapping items, configure.
	if ( QuickMount_CheckPlayer() == true and IGNORE_SWITCH == false and QuickMount_ConfigMap[QMCP]["auto-reconfig"] == true and QuickMount_ConfigMap[QMCP]["last_action"] ~= true and QuickMount_CurrentBag == QM_NIL and QuickMount_CurrentName ~= '' and CursorHasItem() ) then
		autoflag = true;
	end
	if ( QuickMount_SavedBagFunc ) then
		QuickMount_SavedBagFunc(bag, slot);
	end
	local texture, itemCount, locked = GetContainerItemInfo(bag, slot);
	if ( texture ) then
      	name = QuickMount_GetItemName(bag, slot)
	end
	if IGNORE_SWITCH == false and CursorHasItem() then
		QuickMount_PickupItem(bag, slot, name, texture)
		empty = false
	end
	if ( autoflag and not CursorHasItem() and name ~= nil and name ~= '') then
		-- Check the UNMOUNT config for this item, swap if found
		for i in QuickMount_ConfigMap[QMCP][UNMOUNT] do
               	if QuickMount_ConfigMap[QMCP][UNMOUNT][i].id > 0 and QuickMount_ConfigMap[QMCP][UNMOUNT][i].name == QuickMount_CurrentName then
				QuickMount_PickupItem(bag, slot, name, texture);
				QuickMount_ConfigMap[QMCP][UNMOUNT][i] = {id=QuickMount_CurrentID,bag=QuickMount_CurrentBag,slot=QuickMount_CurrentSlot,name=QuickMount_CurrentName,texture=QuickMount_CurrentTexture};
				QuickMount_UpdateSet("QuickMountButtonSet",UNMOUNT,QM_SET_SIZE);
			end
		end
	end
	if empty then
		QuickMount_ResetItem();
	end
end

function QuickMount_PickupInventoryItem(slot)
	local empty = true;
	local autoflag = false;
	local name = '';
	-- If we are set to auto-reconfigure, and we're unmounted and they are manually swapping items, configure.
	if ( QuickMount_CheckPlayer() == true and IGNORE_SWITCH == false and QuickMount_ConfigMap[QMCP]["auto-reconfig"] == true and QuickMount_ConfigMap[QMCP]["last_action"] ~= true and QuickMount_CurrentBag ~= QM_NIL and CursorHasItem() ) then
		autoflag = true;
	end
	if ( QuickMount_SavedInvFunc ) then
      		QuickMount_SavedInvFunc(slot);
	end
	local texture = GetInventoryItemTexture("player", slot);
	if ( texture ) then
		name = QuickMount_GetItemName(QM_NIL, slot)
	end
	if IGNORE_SWITCH == false and CursorHasItem() and name ~= '' then
		QuickMount_PickupItem(QM_NIL, slot, name, texture)
		empty = false
	end
	if ( autoflag and not CursorHasItem() and name ~= nil and name ~= '') then
		-- Check the UNMOUNT config for this item, swap if found
		for i in QuickMount_ConfigMap[QMCP][UNMOUNT] do
               	if QuickMount_ConfigMap[QMCP][UNMOUNT][i].id > 0 and QuickMount_ConfigMap[QMCP][UNMOUNT][i].name == name then
				QuickMount_ConfigMap[QMCP][UNMOUNT][i] = {id=QuickMount_CurrentID,bag=QuickMount_CurrentBag,slot=QuickMount_CurrentSlot,name=QuickMount_CurrentName,texture=QuickMount_CurrentTexture};
				QuickMount_UpdateSet("QuickMountButtonSet",UNMOUNT,QM_SET_SIZE);
			end
		end
	end
	if empty then
		QuickMount_ResetItem();
	end
end

function QuickMount_UseContainerItem(bag, slot)
	local empty = true;
	local autoflag = false;
	local name_before = '';
	local name_after = '';

	if ( bag >= 0 and QuickMount_CheckPlayer() == true and IGNORE_SWITCH == false and QuickMount_ConfigMap[QMCP]["auto-reconfig"] == true and QuickMount_ConfigMap[QMCP]["last_action"] ~= true and QuickMount_CurrentBag == QM_NIL and QuickMount_CurrentName == '' and CursorHasItem() ~= true ) then
		autoflag = true;

		-- local texture_before, itemCount_before, locked_before = GetContainerItemInfo(bag, slot);
		-- if ( texture_before ) then
      		-- name_before = QuickMount_GetItemName(bag, slot)
		-- end
	end

	if ( QuickMount_SavedUseFunc ) then
		QuickMount_SavedUseFunc(bag, slot);
	end

	if ( autoflag ) then
		local texture_after, itemCount_after, locked_after = GetContainerItemInfo(bag, slot);
		if ( texture_after ) then
      		name_after = QuickMount_GetItemName(bag, slot)
		end

		if ( not CursorHasItem() and name_before ~= name_after and name_before ~= nil and name_before ~= '' and name_after ~= nil and name_after ~= '' ) then
			-- Check the UNMOUNT config for this item, swap if found
			for i in QuickMount_ConfigMap[QMCP][UNMOUNT] do
               		if QuickMount_ConfigMap[QMCP][UNMOUNT][i].id > 0 and QuickMount_ConfigMap[QMCP][UNMOUNT][i].name == name_after then
					QuickMount_PickupItem(bag, slot, name_before, texture_before);
					QuickMount_ConfigMap[QMCP][UNMOUNT][i] = {id=QuickMount_CurrentID,bag=QuickMount_CurrentBag,slot=QuickMount_CurrentSlot,name=QuickMount_CurrentName,texture=QuickMount_CurrentTexture};
					QuickMount_UpdateSet("QuickMountButtonSet",UNMOUNT,QM_SET_SIZE);
				end
			end
		end
	end
end

function QuickMount_OnLoad()
	-- Set the header
	local name = this:GetName();
	local header = getglobal(name.."TitleText");

	if ( header ) then 
		header:SetText("|cFFee9966Mount Equipment|r");
	end

      QuickMount_Reset();
	-- RegisterForSave("QuickMount_ConfigMap");
	QuickMount_RegisterEvents();

	local temp = PickupContainerItem;
	if ( QuickMount_HookFunction("PickupContainerItem", "QuickMount_PickupContainerItem") ) then
		QuickMount_SavedBagFunc = temp;
	end
	
	local temp = PickupInventoryItem;
	if ( QuickMount_HookFunction("PickupInventoryItem", "QuickMount_PickupInventoryItem") ) then
		QuickMount_SavedInvFunc = temp;
	end

	local temp = UseContainerItem;
	if ( QuickMount_HookFunction("UseContainerItem", "QuickMount_UseContainerItem") ) then
		QuickMount_SavedUseFunc = temp;
	end

	-- Slash Commands
	SlashCmdList["MOUNTEQUIP"] = function(msg) QuickMount_Config(msg); end
	setglobal("SLASH_MOUNTEQUIP1", "/mountequip");

  QME_Registered = 0;
end

function QuickMount_HookFunction(func, newfunc)
	local oldValue = getglobal(func);
	if ( oldValue ~= getglobal(newfunc) ) then
		setglobal(func, getglobal(newfunc));
		return true;
	end
	return false;
end

function QuickMount_ShowHelp()
	local helptext = getglobal("QuickMountFrameHelpText");
	if helptext then
		helptext:SetText("Drag Equipment you want auto-equipped into the squares. (Spurs, etc.) Shift click to clear item. Items that go in the same inventory slot should 'line up'. (Boots in slot 1, Trinkets in slot 2, etc.)");
	end
end

function QuickMount_Enable_Toggle(which)
	if which then
		QuickMount_Disabled = false;
	else
		QuickMount_Disabled = true;
	end 
end

function QuickMount_Quiet_Toggle(which)
	QuickMount_ConfigMap[QMCP]["Quiet"] = which;
end

function QuickMount_FlightPoint_Toggle(which)
	QuickMount_ConfigMap[QMCP]["FlightPoint"] = which;
end


function QuickMount_UseDetectedIcon_Toggle(which)
	QuickMount_ConfigMap[QMCP]["UseDetectedIcon"] = which;
end

function QuickMount_AutoReconfig_Toggle(which)
	QuickMount_ConfigMap[QMCP]["auto-reconfig"] = which;
end

function QuickMount_OnShow()
	local checked;

	QuickMount_ShowHelp()

	-- Configure checkboxes
	if (QuickMount_Disabled == false) then
		checked = 1;
	else
		checked = 0;
	end
		
	QuickMountCheck1:SetChecked(checked);
	QuickMountCheck1Text:SetText("QuickMountEquip enabled.");
	QuickMountCheck1.myToolTip = "Check to enable QuickMountEquip.";
	QuickMountCheck1.ExecuteCommand = QuickMount_Enable_Toggle;

	if (QuickMount_ConfigMap[QMCP]["Quiet"] == true) then
		checked = 1;
	else
		checked = 0;
	end

	QuickMountCheck2:SetChecked(checked);
	QuickMountCheck2Text:SetText("Don't show equip message spam.");
	QuickMountCheck2.myToolTip = "Check to disable equip messages.";
	QuickMountCheck2.ExecuteCommand = QuickMount_Quiet_Toggle;

	if (QuickMount_ConfigMap[QMCP]["FlightPoint"] == true) then
		checked = 1;
	else
		checked = 0;
	end

	QuickMountCheck3:SetChecked(checked);
	QuickMountCheck3Text:SetText("Griffin / FlightPoint check enabled.");
      QuickMountCheck3.myToolTip = "Check to enable Griffin / FlightPoint checking.\n(Might also trigger on druid shapeshifting, or\nwhenever your attack button gets disabled outside\nof combat.)";
	QuickMountCheck3.ExecuteCommand = QuickMount_FlightPoint_Toggle;

	if (QuickMount_ConfigMap[QMCP]["UseDetectedIcon"] == true and QuickMount_ConfigMap[QMCP]["DetectedIcon"] ~= nil) then
		checked = 1;
	else
		checked = 0;
	end

      local ourIcon = QuickMount_ConfigMap[QMCP]["DetectedIcon"];
	if ourIcon == nil then
		ourIcon = 'NOT DETECTED YET';
	end
	QuickMountCheck4:SetChecked(checked);
	QuickMountCheck4Text:SetText("Use auto-detected mount icon");
      QuickMountCheck4.myToolTip = "Check to enable the mount auto-detected by\n/mountequip detect\n\nCurrently: " .. ourIcon .. "\n\n** Usually shouldn't be necessary. **";
	QuickMountCheck4.ExecuteCommand = QuickMount_UseDetectedIcon_Toggle;

	if (QuickMount_ConfigMap[QMCP]["auto-reconfig"] == true) then
		checked = 1;
	else
		checked = 0;
	end

	QuickMountCheck5:SetChecked(checked);
	QuickMountCheck5Text:SetText("Auto-reconfigure.");
      QuickMountCheck5.myToolTip = "Check to enable Auto-reconfiguring.\nThis will automatically reconfigure the add-on if you\nmanually swap a configured item with another.\nOnly works while unmounted and with the\nunmounted equipment line.";
	QuickMountCheck5.ExecuteCommand = QuickMount_AutoReconfig_Toggle;

end

function QuickMount_OnHide()
	QuickMount_DropItem();
	if MYADDONS_ACTIVE_OPTIONSFRAME == this then
		ShowUIPanel(myAddOnsFrame);
	end
end

function QME_RegisterUltimateUI()
		UltimateUI_RegisterButton (
			"Mount Equipment",
			"Auto-Equip",
			"|cFF00CC00QuickMountEquip|r\nAllows you to select \nequipment to be auto-equipped \nas you mount/dismount",
			"Interface\\Icons\\Ability_Mount_RidingHorse",
			QuickMount_Toggle,
			function()
				return true; -- The button is enabled
			end
		);
	QME_Registered = 1;
end

function QuickMount_OnEvent(event)
  local mounted = false
  local sheeped = false
  local clogged = false

  if event == "VARIABLES_LOADED" then
    QMCP = "";
    clogged = true;
    -- Add myAddOns support
    if myAddOnsList then
      myAddOnsList.QuickMountEquip = {name = "QuickMountEquip", description = "Automatically switches gear when you mount", version = QuickMount_Version, frame = "QuickMountFrame", optionsframe = "QuickMountFrame"};
    end
	if( QME_Registered == 0 ) then
		if ( UltimateUI_RegisterButton ) then
			QME_RegisterUltimateUI();
		end
	end
  end

  if event == "UNIT_NAME_UPDATE" and arg1 == "player" then
    QMCP = "";
    clogged = true;
  end

  if QuickMount_CheckPlayer() == false then
    return;
  end

  if clogged == true or QuickMount_Disabled == true then
    return;
  end

  if event == "DELETE_ITEM_CONFIRM" then
    -- If the GUI frame is open, don't let them delete anything.
    if ( QuickMountFrame and QuickMountFrame:IsVisible() ) then 
      QuickMount_DropItem();
    end
    return;
  end

  if event == "PLAYER_REGEN_DISABLED" then
    combat_flag = true
  end
  if event == "PLAYER_REGEN_ENABLED" then
    combat_flag = false
  end

  -- Can't switch inventory while in combat, so ignore if in combat
  if combat_flag == false then
    local _, Pclass = UnitClass("player");
    local detectedIcon = nil;
    for i = 1,16 do
	local buff_texture = UnitBuff("player", i)
	local debuff_texture = UnitDebuff("player", i)
	if QuickMount_AutoDetect == true then
		if buff_texture then
			local parts = {n=0}
			local function helper(word) table.insert(parts, word) end
			string.gsub(buff_texture, "[_%w]+", helper);

			QuickMount_ConfigMap[QMCP]["DetectedIcon"] = parts[parts.n];
		end
	else
      	if debuff_texture and string.find(debuff_texture, "Polymorph") then
        		sheeped = true
        		return;
      	end
		if Pclass == "PALADIN" or Pclass == "WARLOCK" then
        		-- Paladin/Warlock Mount... Hopefully no other buff uses the same texture...
	  		if buff_texture and string.find(buff_texture, "Spell_Nature_Swiftness") then
	    			mounted = true
          			break;
        		end
      	end
		if QuickMount_ConfigMap[QMCP]["UseDetectedIcon"] == true and QuickMount_ConfigMap[QMCP]["DetectedIcon"] ~= nil then
			detectedIcon = QuickMount_ConfigMap[QMCP]["DetectedIcon"];
		end
      	if buff_texture and ( string.find(buff_texture, "Mount") or string.find(buff_texture, "Foot_Kodo") or ( detectedIcon ~= nil and string.find(buff_texture, detectedIcon) ) ) then
        		-- Make sure it isn't "Aspect of the xxx" or "Tiger's Fury"
        		local BuffName = QuickMount_GetBuffName(i);
        		local Skip = false;
        		if BuffName and ( string.find(BuffName, "Aspect") or string.find(BuffName, "Aspekt") or string.find(BuffName, "Tiger's Fury") ) then
          			Skip = true
        		end
        		if Skip == false then
          			mounted = true
          			break;
        		end
      	end
	end
    end

    if QuickMount_AutoDetect == true then
      if QuickMount_ConfigMap[QMCP]["DetectedIcon"] ~= nil then
	  QuickMount_AutoDetect = false;
	  -- QuickMount_ConfigMap[QMCP]["UseDetectedIcon"] = true;
	  QM_Print("Detected mount icon of: " .. QuickMount_ConfigMap[QMCP]["DetectedIcon"]);
	end
	return;
    end

    -- Test for flight path. Search for an attack button and see if it's disabled. This assumes the
    --   only time attack is disabled outside of combat is because of flight paths.
    --     Whoops... Polymorph takes them out of combat, *and* disables attack. Bleh.
    if QuickMount_ConfigMap[QMCP]["FlightPoint"] == true and mounted == false and sheeped == false and attack_button ~= QM_NIL then
	if attack_button == 0 then
        attack_button = QM_NIL
        -- Search for an attack button, and remember it.
        for i = 1,72 do
          if IsAttackAction(i) then
            attack_button = i
            break;
          end
        end
      end
	if attack_button ~= QM_NIL then
        local isusable, mana = IsUsableAction(attack_button)
        if isusable == nil or isusable == false then
          mounted = true
        end
      end
    end

    -- Only attempt to equip if it's different from last time.
    if QuickMount_ConfigMap[QMCP]["last_action"] == nil or QuickMount_ConfigMap[QMCP]["last_action"] ~= mounted then
      QuickMount_ConfigMap[QMCP]["last_action"] = mounted
      local row1, row2;
      if mounted then
        row1 = MOUNT;
	  row2 = UNMOUNT;
      else
        row1 = UNMOUNT;
	  row2 = MOUNT;
      end     
      IGNORE_SWITCH = true;   
      items = "";
      for i in QuickMount_ConfigMap[QMCP][row1] do
	  local x, y;
          x = QM_NIL; y = QM_NIL;
	  if QuickMount_ConfigMap[QMCP][row1][i].id > 0 and QuickMount_ConfigMap[QMCP][row2][i].id > 0 and QuickMount_ConfigMap[QMCP][row1][i].name ~= QuickMount_ConfigMap[QMCP][row2][i].name then
          -- Swap Items
	    x, y = QuickMount_FindInvItem(QuickMount_ConfigMap[QMCP][row2][i].name, true);
	    if CursorHasItem() then
            x, y = QuickMount_FindBagItem(QuickMount_ConfigMap[QMCP][row1][i].name, true);
            if CursorHasItem() then
              y = QM_NIL;
              AutoEquipCursorItem();
            end
          else 
            x, y = QuickMount_FindBagItem(QuickMount_ConfigMap[QMCP][row1][i].name, true, true);
          end
        elseif QuickMount_ConfigMap[QMCP][row1][i].id > 0 then
          x, y = QuickMount_FindBagItem(QuickMount_ConfigMap[QMCP][row1][i].name, true, true);
        end
        if y >= 0 then
          items = items .. ' "' .. QuickMount_ConfigMap[QMCP][row1][i].name .. '"';
        end
      end
      if items ~= "" and QuickMount_ConfigMap[QMCP]["Quiet"] == false then
	      QM_Print("Equipped" .. items);
      end
      IGNORE_SWITCH = false;
    end -- last_action
  end -- combat_flag
end

function QM_Print(msg)
	DEFAULT_CHAT_FRAME:AddMessage(msg);
end

function QuickMount_ButtonLoad()
	this:RegisterForDrag("LeftButton", "RightButton");
	this:RegisterForClicks("LeftButtonUp", "RightButtonUp");	
end

function QuickMount_FindBagItem(name, pickup, equip)
	if name == nil then
		return QM_NIL, QM_NIL;
	end
	-- Look in bags.
	for i = 0, 4, 1 do
		local numSlot = GetContainerNumSlots(i);
		for y = 1, numSlot, 1 do
			if (strupper(QuickMount_GetItemName(i, y)) == strupper(name)) then
				if pickup or equip then
					PickupContainerItem(i,y);
					if equip then
						AutoEquipCursorItem();
					end
				end
				return i,y;
			end
		end
	end

	return QM_NIL, QM_NIL;
end

function QuickMount_FindInvItem(name, pickup)
	if name == nil then
		return QM_NIL, QM_NIL;
	end

	-- Look in inventory.
	for i = 1, 19, 1 do
		if (strupper(QuickMount_GetItemName(QM_NIL, i)) == strupper(name)) then
			if pickup then
				PickupInventoryItem(i);
			end
			return QM_NIL, i;
		end
	end 

	return QM_NIL, QM_NIL;
end

function QuickMount_FindItem(bag, slot, name, pickup, equip)
	if name == nil then
		return QM_NIL, QM_NIL;
	end
	-- First look where it's suggested we look.
--[[  NOT WORKING... Cacheing problem?
	if (strupper(QuickMount_GetItemName(bag,slot)) == strupper(name)) then
		if pickup then
			if bag >= 0 then
				PickupContainerItem(bag,slot);
			else
				PickupInventoryItem(slot);
			end
		end
		return bag, slot;
	end
]]

      local x, y = QuickMount_FindBagItem(name, pickup, equip);
	
	if equip then
		return x, y;
	end

      if x < 0 then
		x, y = QuickMount_FindInvItem(name, pickup);
	end
	
	return x, y;
end

-- Erases the old button with the hand
function QuickMount_SetButton(row, col) 
	if QuickMount_CheckPlayer() == false then
		return;
	end
	-- Set the new button
	QuickMount_ConfigMap[QMCP][row][col] = {id=QuickMount_CurrentID,bag=QuickMount_CurrentBag,slot=QuickMount_CurrentSlot,name=QuickMount_CurrentName,texture=QuickMount_CurrentTexture};
	QuickMount_DropItem();

	QuickMount_ButtonUpdate(this);	
end

-- Swaps the specified button into hand
function QuickMount_SwapButton(row,col)
	if QuickMount_CheckPlayer() == false then
		return;
	end
	-- Store the old value if one exists
	local temp = nil;
	if ( QuickMount_ConfigMap[QMCP][row][col].id > 0 ) then 
		temp = QuickMount_ConfigMap[QMCP][row][col];
	end

	-- Drop the current button
	QuickMount_SetButton(row, col);
	
	-- Load the old one into the cursor
	if ( temp ) then 
		if ( temp.id > 0 ) then
			local bag, slot = QuickMount_FindItem(temp.bag, temp.slot, temp.name, true);
			QuickMount_PickupItem(bag, slot, temp.name, temp.texture);
		end
	end
end


-- Button Event Handler
function QuickMount_ButtonEvent(event)
end

-- Move the Equipment around
function QuickMount_ButtonDragStart()
	local col, row = QuickMount_GetCurrentLocation(this);		

	-- Pick up the current item
	QuickMount_SwapButton(row,col);
end

--
-- Swap or pick up if clicked with or without a full hand
-- 
function QuickMount_ButtonClick(button)
	if QuickMount_CheckPlayer() == false then
		return;
	end
	local col, row = QuickMount_GetCurrentLocation(this);		

      if IsShiftKeyDown() then
		QuickMount_ConfigMap[QMCP][row][col] = {id=QM_NIL;bag=QM_NIL;slot=QM_NIL;texture="";name="";};
		QuickMount_ButtonUpdate(this);
	elseif IsAltKeyDown() then
		-- PrintTable(QuickMount_ConfigMap[QMCP][row][col]);
	else
		-- Pick up the current item
		QuickMount_SwapButton(row,col);
	end
end

function QuickMount_ButtonDragEnd()
	if QuickMount_CheckPlayer() == false then
		return;
	end
	if( QuickMount_CurrentID > 0 ) then
		local col, row = QuickMount_GetCurrentLocation(this);		
		QuickMount_SwapButton(row,col);
	end
end

-- Displays the tooltip of the item in the box.
function QuickMount_ButtonEnter()
	if QuickMount_CheckPlayer() == false then
		return;
	end
	local col, row = QuickMount_GetCurrentLocation(this);		

	local id = QuickMount_ConfigMap[QMCP][row][col].id;
	local tooltip = QuickMount_ConfigMap[QMCP][row][col].name;

	if ( id > 0 ) then 
		GameTooltip:SetOwner(this, "ANCHOR_RIGHT");
		if ( GameTooltip:SetText(tooltip) ) then
			this.updateTooltip = TOOLTIP_UPDATE_TIME;
		else
			this.updateTooltip = nil;
		end	
	end
end

function QuickMount_ButtonLeave()
	GameTooltip:Hide();
end

function QuickMount_ButtonLoad()
end

-- Self Texture Button
function QuickMount_SetSelfTexture(button, row, col)
	if QuickMount_CheckPlayer() == false then
		return;
	end 
	local name = button:GetName();	
	local icon = getglobal(name.."Icon");

	if (  QuickMount_ConfigMap[QMCP][row] == nil ) then return end
	local id = QuickMount_ConfigMap[QMCP][row][col].id;

	if ( id > 0 ) then 
		-- Set the pretty texture
		local texture = QuickMount_ConfigMap[QMCP][row][col].texture;
		if ( texture ) then
			icon:SetTexture(texture);
			icon:Show();
		else
			icon:Hide();
		end
	else
		icon:Hide();
	end
end	

-- Button Update
function QuickMount_ButtonUpdate(button)
	-- Check the button
	if ( button == nil ) then return; end
	
	-- Uncheck it
	button:SetChecked("false");
	local col, row = QuickMount_GetCurrentLocation(button);

	-- Check for errors
	if ( col == nil or row == nil ) then return; end
	
	-- Enable the button
	button:Enable();
	QuickMount_SetSelfTexture(button, row, col);
end

function QuickMount_UpdateSet(setbasename,set,size)
	if set == nul then return; end

	for i=1,size,1 do
		QuickMount_ButtonUpdate(getglobal(setbasename..set..i));
	end
end

function QuickMount_UpdateAllSets()
	for set=1,QM_SET_COUNT,1 do
		QuickMount_UpdateSet("QuickMountButtonSet",set,QM_SET_SIZE);
	end
end

-- Tracks the last item picked up
function QuickMount_PickupItem(bag, slot, name, texture) 
	QuickMount_CurrentID = 1;
	QuickMount_CurrentBag = bag;
	QuickMount_CurrentSlot = slot;
	QuickMount_CurrentName = name;
	QuickMount_CurrentTexture = texture;
end

function QuickMount_ResetItem()
	QuickMount_CurrentID = QM_NIL;
	QuickMount_CurrentBag = QM_NIL;
	QuickMount_CurrentSlot = QM_NIL;
	QuickMount_CurrentName = "";
	QuickMount_CurrentTexture = "";
end

function QuickMount_DropItem()
	if CursorHasItem() then
		if QuickMount_CurrentBag >= 0 then
			PickupContainerItem(QuickMount_CurrentBag,QuickMount_CurrentSlot);
      	elseif QuickMount_CurrentSlot >= 0 then
			PickupInventoryItem(QuickMount_CurrentSlot);
		end
	end
	QuickMount_ResetItem();
end

function QuickMountCheckButton_OnClick()
	if (this:GetChecked()) then
		this.ExecuteCommand(true);
	else
		this.ExecuteCommand(false);
	end
end

function QuickMountCheckButton_OnEnter()
	GameTooltip:SetOwner(this, "ANCHOR_RIGHT");
	if ( GameTooltip:SetText(this.myToolTip) ) then
		this.updateTooltip = TOOLTIP_UPDATE_TIME;
	else
		this.updateTooltip = nil;
	end	
end

function QuickMountCheckButton_OnLeave()
	GameTooltip:Hide();
end

-- Returns the current button location
function QuickMount_GetCurrentLocation(object)
	return object:GetID(), object:GetParent():GetID();
end
