-- 
-- UberQuest
--
-- Drop in replacement for Blizzards QuestLog providing a dualpane view, 
-- full panes for the questlisting and a second full pane for the quest description itself.
-- Contains integrated "Quest Minion" with the following:
--   *) No lockups at login, or at least I haven't had any!
--   *) Locking QuestMinion window - When locked, mouse "clickthrough" to the 3d world behind.
--   *) Color selector for background.
-- 
--  Author: Marc aka Saien on Hyjal
--  WOWSaien@gmail.com
--  http://64.168.251.69/wow
--
--
--  Modded for Localisation by Schurke@Destromath
-- 
-- Changes 1.72 (KKram version)
-- - TOC Update  (11100)
-- - UI changes (position of buttons)
-- - Fixed bug introduced by Blizzard patch 1.11
-- Changes 1.71
-- - TOC Update only (11000)
-- Changes 1.7
-- - texture problems with WoW 1.9 should now be fixed.
-- - Partymembers with same Quests will now be shown. (thx to Naboradd)
-- Changes 1.6
-- - Bugfixes for WoW 1.9
-- Changes 1.51
-- - Added support for myAddOns (thx to NetSapiens)
-- Changes 1.5
-- - Original Questlog Sounds Added.
-- - Now the Questminion is scaleable with a slider in the options.
-- Changes 1.4
-- - Added a Keybinding to show/hide the minion.
-- - Uberquests is now Movable (no other addon needed)
-- Changes 1.31
-- - fixed french localization (special characters)
-- Changes 1.3
-- - better questlevels in questlog and minion
-- (dungeon quests are now shown as [40D], elite quests as [40+] and raidquests as [40R])
-- Changes 1.21
-- - fixed french localization (special characters)
-- Changes 1.2
-- - added french translation (thx to KKram)
-- - little bugfix (thx to KKram)
-- - cosmetic changes
-- Changes 1.1
-- - based on sourcecode V2005.10.10
-- - more translations
-- - still no french translation 
-- Changes
-- 2005.10.10
--   TOC update to 1.8
-- 2005.09.21
--   Quest minion will not initialize for 10 seconds after login. This should finally 
--     squash any problems during login and unintended auto adding of quests when add 
--     new quest config is selected.
--   Removed speed quest option as it's now part of Blizzard UI
-- 2005.09.13
--   New TOC 1700 and adjust to 1.7 changes
-- 2005.08.07
--   Maintenance change: Timing during login, to hopefully improve perceived lockups
--   New TOC 1600
-- 2005.06.07
--   Fixed bug introduced by Blizzard patch 1.5
--   Updated to now show how many party members have that quest as well. Just like Blizzards does.
--   New TOC 1500
-- 2005.03.27
--   Speed quest display option.
--   TOC update to 1300
-- 2005.03.05
--   Fix bug in config when prior to bg color being set for the first time
--   Colorizing for quest objectives is in.
--   Updated TOC to 4216
-- 2005.02.20
--   Updated toc to 4211
--   Improved "new quest" handling
--   Added color selecting, including alpha, to config

UBERQUEST_VERSION = "1.7(modded)" -- Notice the cleverly disguised date.

UIPanelWindows["UberQuest_List"] = { area = "doublewide", pushable = 997 };
BINDING_HEADER_UBERQUEST_SEP = "Uber Quest";
BINDING_NAME_UBERQUEST_CONFIG = "Quest Log";

UBERQUEST_QUESTS_DISPLAYED = 22;
UBERQUEST_QUESTLINE_HEIGHT = 16;



UberQuest_Player = nil; --global
UberQuest_Minion_ColorPicker = { r = 1, g = 1, b = 1 }; -- global
UBERQUEST_MINIONSCALE = 100; --UberMinionScale = 100; --global
local UberQuest_Config_Loaded = nil;
local UberQuest_ThereAreQuests = nil;
local UberQuest_MinionSetOnce = nil;
local UberQuest_QuestTitles = nil;
local UberQuest_SelectedQuest = nil;
local UberQuest_ActivityTracker = {};
local UberQuest_GotFullList = nil;
local UberQuest_DelayedConfigInit = nil;
local UberQuest_InfoRequested = {};

-- myAddons Support 
	UberQuestDetails = {
		name = "UberQuest(Modded)",
		version = "1.51",
		releaseDate = "2005.11.21",
		author = "Saien (Modded by Schurke)",
		email = "schurke@uniquefighter.de",
		website = "http://www.curse-gaming.com/mod.php?addid=2505",
		category = MYADDONS_CATEGORY_QUESTS
	};
--

local function UberQuest_Minion_Reset()
	UberQuest_Minion:ClearAllPoints();
	UberQuest_Minion:SetPoint("CENTER","UIParent","CENTER",0,0);
	if (not UberQuest_Minion:IsVisible()) then
		UberQuest_MinionShowHide();
	end
end

local function UberQuest_Items_Update(questState)
	local isQuestLog = 0;
	if ( questState == "UberQuest_Details_ScrollChild_" ) then -- that's one change
		isQuestLog = 1;
	end
	local numQuestRewards;
	local numQuestChoices;
	local numQuestSpellRewards = 0;
	local money;
	local spacerFrame;
	if ( isQuestLog == 1 ) then
		numQuestRewards = GetNumQuestLogRewards();
		numQuestChoices = GetNumQuestLogChoices();
		if ( GetQuestLogRewardSpell() ) then
			numQuestSpellRewards = 1;
		end
		money = GetQuestLogRewardMoney();
		spacerFrame = UberQuest_Details_ScrollChild_SpacerFrame; -- that's two!
		-- All this crap copied for TWO changes.
	else
		numQuestRewards = GetNumQuestRewards();
		numQuestChoices = GetNumQuestChoices();
		if ( GetRewardSpell() ) then
			numQuestSpellRewards = 1;
		end
		money = GetRewardMoney();
		spacerFrame = QuestSpacerFrame;
	end

	local totalRewards = numQuestRewards + numQuestChoices + numQuestSpellRewards;
	local questItemName = questState.."Item";
	local material = QuestFrame_GetMaterial();
	local  questItemReceiveText = getglobal(questState.."ItemReceiveText")
	if ( totalRewards == 0 and money == 0 ) then
		getglobal(questState.."RewardTitleText"):Hide();
	else
		getglobal(questState.."RewardTitleText"):Show();
		QuestFrame_SetTitleTextColor(getglobal(questState.."RewardTitleText"), material);
		QuestFrame_SetAsLastShown(getglobal(questState.."RewardTitleText"), spacerFrame);
	end
	if ( money == 0 ) then
		getglobal(questState.."MoneyFrame"):Hide();
	else
		getglobal(questState.."MoneyFrame"):Show();
		QuestFrame_SetAsLastShown(getglobal(questState.."MoneyFrame"), spacerFrame);
		MoneyFrame_Update(questState.."MoneyFrame", money);
	end
	
	for i=totalRewards + 1, MAX_NUM_ITEMS, 1 do
		getglobal(questItemName..i):Hide();
	end
	local questItem, name, texture, quality, isUsable, numItems = 1;
	if ( numQuestChoices > 0 ) then
		getglobal(questState.."ItemChooseText"):Show();
		QuestFrame_SetTextColor(getglobal(questState.."ItemChooseText"), material);
		QuestFrame_SetAsLastShown(getglobal(questState.."ItemChooseText"), spacerFrame);
		for i=1, numQuestChoices, 1 do	
			questItem = getglobal(questItemName..i);
			questItem.type = "choice";
			numItems = 1;
			if ( isQuestLog == 1 ) then
				name, texture, numItems, quality, isUsable = GetQuestLogChoiceInfo(i);
			else
				name, texture, numItems, quality, isUsable = GetQuestItemInfo(questItem.type, i);
			end
			questItem:SetID(i)
			questItem:Show();
			-- For the tooltip
			questItem.rewardType = "item"
			QuestFrame_SetAsLastShown(questItem, spacerFrame);
			getglobal(questItemName..i.."Name"):SetText(name);
			SetItemButtonCount(questItem, numItems);
			SetItemButtonTexture(questItem, texture);
			if ( isUsable ) then
				SetItemButtonTextureVertexColor(questItem, 1.0, 1.0, 1.0);
				SetItemButtonNameFrameVertexColor(questItem, 1.0, 1.0, 1.0);
			else
				SetItemButtonTextureVertexColor(questItem, 0.9, 0, 0);
				SetItemButtonNameFrameVertexColor(questItem, 0.9, 0, 0);
			end
			if ( i > 1 ) then
				if ( mod(i,2) == 1 ) then
					questItem:SetPoint("TOPLEFT", questItemName..(i - 2), "BOTTOMLEFT", 0, -2);
				else
					questItem:SetPoint("TOPLEFT", questItemName..(i - 1), "TOPRIGHT", 1, 0);
				end
			else
				questItem:SetPoint("TOPLEFT", questState.."ItemChooseText", "BOTTOMLEFT", -3, -5);
			end
			
		end
	else
		getglobal(questState.."ItemChooseText"):Hide();
	end
	local rewardsCount = 0;
	if ( numQuestRewards > 0 or money > 0 or numQuestSpellRewards > 0) then
		QuestFrame_SetTextColor(questItemReceiveText, material);
		-- Anchor the reward text differently if there are choosable rewards
		if ( numQuestChoices > 0  ) then
			questItemReceiveText:SetText(TEXT(REWARD_ITEMS));
			local index = numQuestChoices;
			if ( mod(index, 2) == 0 ) then
				index = index - 1;
			end
			questItemReceiveText:SetPoint("TOPLEFT", questItemName..index, "BOTTOMLEFT", 3, -5);
		else 
			questItemReceiveText:SetText(TEXT(REWARD_ITEMS_ONLY));
			questItemReceiveText:SetPoint("TOPLEFT", questState.."RewardTitleText", "BOTTOMLEFT", 3, -5);
		end
		questItemReceiveText:Show();
		QuestFrame_SetAsLastShown(questItemReceiveText, spacerFrame);
		-- Setup mandatory rewards
		for i=1, numQuestRewards, 1 do
			questItem = getglobal(questItemName..(i + numQuestChoices));
			questItem.type = "reward";
			numItems = 1;
			if ( isQuestLog == 1 ) then
				name, texture, numItems, quality, isUsable = GetQuestLogRewardInfo(i);
			else
				name, texture, numItems, quality, isUsable = GetQuestItemInfo(questItem.type, i);
			end
			questItem:SetID(i)
			questItem:Show();
			-- For the tooltip
			questItem.rewardType = "item";
			QuestFrame_SetAsLastShown(questItem, spacerFrame);
			getglobal(questItemName..(i + numQuestChoices).."Name"):SetText(name);
			SetItemButtonCount(questItem, numItems);
			SetItemButtonTexture(questItem, texture);
			if ( isUsable ) then
				SetItemButtonTextureVertexColor(questItem, 1.0, 1.0, 1.0);
				SetItemButtonNameFrameVertexColor(questItem, 1.0, 1.0, 1.0);
			else
				SetItemButtonTextureVertexColor(questItem, 0.5, 0, 0);
				SetItemButtonNameFrameVertexColor(questItem, 1.0, 0, 0);
			end
			
			if ( i > 1 ) then
				if ( mod(i,2) == 1 ) then
					questItem:SetPoint("TOPLEFT", questItemName..((i + numQuestChoices) - 2), "BOTTOMLEFT", 0, -2);
				else
					questItem:SetPoint("TOPLEFT", questItemName..((i + numQuestChoices) - 1), "TOPRIGHT", 1, 0);
				end
			else
				questItem:SetPoint("TOPLEFT", questState.."ItemReceiveText", "BOTTOMLEFT", -3, -5);
			end
			rewardsCount = rewardsCount + 1;
		end
		-- Setup spell reward
		if ( numQuestSpellRewards > 0 ) then
			if ( isQuestLog == 1 ) then
				texture, name = GetQuestLogRewardSpell();
			else
				texture, name = GetRewardSpell();
			end
			questItem = getglobal(questItemName..(rewardsCount + numQuestChoices + 1));
			questItem:Show();
			-- For the tooltip
			questItem.rewardType = "spell";
			SetItemButtonCount(questItem, 0);
			SetItemButtonTexture(questItem, texture);
			getglobal(questItemName..(rewardsCount + numQuestChoices + 1).."Name"):SetText(name);
			if ( rewardsCount > 0 ) then
				if ( mod(rewardsCount,2) == 0 ) then
					questItem:SetPoint("TOPLEFT", questItemName..((rewardsCount + numQuestChoices) - 1), "BOTTOMLEFT", 0, -2);
				else
					questItem:SetPoint("TOPLEFT", questItemName..((rewardsCount + numQuestChoices)), "TOPRIGHT", 1, 0);
				end
			else
				questItem:SetPoint("TOPLEFT", questState.."ItemReceiveText", "BOTTOMLEFT", -3, -5);
			end
		end
	else	
		questItemReceiveText:Hide();
	end
	if ( questState == "QuestReward" ) then
		QuestFrameCompleteQuestButton:Enable();
		QuestFrameRewardPanel.itemChoice = 0;
		QuestRewardItemHighlight:Hide();
	end
end

local function UberQuest_Details_Update()
	local questID = GetQuestLogSelection();
	local questTitle = GetQuestLogTitle(questID);
	if ( not questTitle ) then
		questTitle = "";
	end
	if ( IsCurrentQuestFailed() ) then
		questTitle = questTitle.." - ("..TEXT(FAILED)..")";
	end
	UberQuest_Details_ScrollChild_QuestTitle:SetText(questTitle);

	local questDescription;
	local questObjectives;
	questDescription, questObjectives = GetQuestLogQuestText();
	UberQuest_Details_ScrollChild_ObjectivesText:SetText(questObjectives);
	
	local questTimer = GetQuestLogTimeLeft();
	if ( questTimer ) then
		UberQuest_Details.hasTimer = 1;
		UberQuest_Details.timePassed = 0;
		UberQuest_Details_ScrollChild_TimerText:Show();
		UberQuest_Details_ScrollChild_TimerText:SetText(TEXT(TIME_REMAINING).." "..SecondsToTime(questTimer));
		UberQuest_Details_ScrollChild_Objective1:SetPoint("TOPLEFT", "UberQuest_Details_ScrollChild_TimerText", "BOTTOMLEFT", 0, -10);
	else
		UberQuest_Details.hasTimer = nil;
		UberQuest_Details_ScrollChild_TimerText:Hide();
		UberQuest_Details_ScrollChild_Objective1:SetPoint("TOPLEFT", "UberQuest_Details_ScrollChild_ObjectivesText", "BOTTOMLEFT", 0, -10);
	end
	
	local numObjectives = GetNumQuestLeaderBoards();
	for i=1, numObjectives, 1 do
		local string = getglobal("UberQuest_Details_ScrollChild_Objective"..i);
		local text;
		local type;
		local finished;
		text, type, finished = GetQuestLogLeaderBoard(i);
		if ( not text or strlen(text) == 0 ) then
			text = type;
		end
		if ( finished ) then
			string:SetTextColor(0.2, 0.2, 0.2);
			text = text.." ("..TEXT(COMPLETE)..")";
		else
			string:SetTextColor(0, 0, 0);
		end
		string:SetText(text);
		string:Show();
		QuestFrame_SetAsLastShown(string,UberQuest_Details_ScrollChild_SpacerFrame);
	end

	for i=numObjectives + 1, MAX_OBJECTIVES, 1 do
		getglobal("UberQuest_Details_ScrollChild_Objective"..i):Hide();
	end
	
	-- If there's money required then anchor and display it
	if ( GetQuestLogRequiredMoney() > 0 ) then
		if ( numObjectives > 0 ) then
			UberQuest_Details_ScrollChild_RequiredMoneyText:SetPoint("TOPLEFT", "UberQuest_Details_ScrollChild_Objective"..numObjectives, "BOTTOMLEFT", 0, -4);
		else
			UberQuest_Details_ScrollChild_RequiredMoneyText:SetPoint("TOPLEFT", "UberQuest_Details_ScrollChild_ObjectivesText", "BOTTOMLEFT", 0, -10);
		end
		
		MoneyFrame_Update("UberQuest_Details_ScrollChild_RequiredMoneyFrame", GetQuestLogRequiredMoney());
		
		if ( GetQuestLogRequiredMoney() > GetMoney() ) then
			-- Not enough money
			UberQuest_Details_ScrollChild_RequiredMoneyText:SetTextColor(0, 0, 0);
			SetMoneyFrameColor("UberQuest_Details_ScrollChild_RequiredMoneyFrame", 1.0, 0.1, 0.1);
		else
			UberQuest_Details_ScrollChild_RequiredMoneyText:SetTextColor(0.2, 0.2, 0.2);
			SetMoneyFrameColor("UberQuest_Details_ScrollChild_RequiredMoneyFrame", 1.0, 1.0, 1.0);
		end
		UberQuest_Details_ScrollChild_RequiredMoneyText:Show();
		UberQuest_Details_ScrollChild_RequiredMoneyFrame:Show();
	else
		UberQuest_Details_ScrollChild_RequiredMoneyText:Hide();
		UberQuest_Details_ScrollChild_RequiredMoneyFrame:Hide();
	end

	if ( GetQuestLogRequiredMoney() > 0 ) then
		UberQuest_Details_ScrollChild_DescriptionTitle:SetPoint("TOPLEFT", "UberQuest_Details_ScrollChild_RequiredMoneyText", "BOTTOMLEFT", 0, -10);
	elseif ( numObjectives > 0 ) then
		UberQuest_Details_ScrollChild_DescriptionTitle:SetPoint("TOPLEFT", "UberQuest_Details_ScrollChild_Objective"..numObjectives, "BOTTOMLEFT", 0, -10);
	else
		if ( questTimer ) then
			UberQuest_Details_ScrollChild_DescriptionTitle:SetPoint("TOPLEFT", "UberQuest_Details_ScrollChild_TimerText", "BOTTOMLEFT", 0, -10);
		else
			UberQuest_Details_ScrollChild_DescriptionTitle:SetPoint("TOPLEFT", "UberQuest_Details_ScrollChild_ObjectivesText", "BOTTOMLEFT", 0, -10);
		end
	end
	if ( questDescription ) then
		UberQuest_Details_ScrollChild_QuestDescription:SetText(questDescription);
		 QuestFrame_SetAsLastShown(UberQuest_Details_ScrollChild_QuestDescription,UberQuest_Details_ScrollChild_SpacerFrame);
	end
	local numRewards = GetNumQuestLogRewards();
	local numChoices = GetNumQuestLogChoices();
	local money = GetQuestLogRewardMoney();

	if ( (numRewards + numChoices + money) > 0 ) then
		UberQuest_Details_ScrollChild_RewardTitleText:Show();
		QuestFrame_SetAsLastShown(UberQuest_Details_ScrollChild_RewardTitleText,UberQuest_Details_ScrollChild_SpacerFrame);
	else
		UberQuest_Details_ScrollChild_RewardTitleText:Hide();
	end

	UberQuest_Items_Update("UberQuest_Details_ScrollChild_");
	UberQuest_Details_ScrollScrollBar:SetValue(0);
	UberQuest_Details_Scroll:UpdateScrollChildRect();
end

local function UberQuest_List_SetSelection(questID)
	local selectedQuest;
	if ( questID == 0 ) then
		UberQuest_Details_Scroll:Hide();
		return;
	end
	UberQuest_Details_Scroll:Show();

	-- Get xml id
	local id = questID - FauxScrollFrame_GetOffset(UberQuest_List_Scroll);
	
	UberQuest_SelectedQuest = questID;
	SelectQuestLogEntry(questID);
	local titleButton = getglobal("UberQuest_List_Title"..id);
	local titleButtonTag = getglobal("UberQuest_List_Title"..id.."Tag");
	local questLogTitleText, level, questTag, isHeader, isCollapsed = GetQuestLogTitle(questID);
	if ( isHeader ) then
		if ( isCollapsed ) then
			ExpandQuestHeader(questID);
			return;
		else
			CollapseQuestHeader(questID);
			return;
		end
	else
		-- Set newly selected quest and highlight it
		UberQuest_List.selectedButtonID = questID;
		local scrollFrameOffset = FauxScrollFrame_GetOffset(UberQuest_List_Scroll);
		if ( questID > scrollFrameOffset and questID <= (scrollFrameOffset + UBERQUEST_QUESTS_DISPLAYED) and questID <= GetNumQuestLogEntries() ) then
			titleButton:LockHighlight();
			titleButtonTag:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
			UberQuest_List_HighlightFrame_SkillHighlight:SetVertexColor(titleButton.r, titleButton.g, titleButton.b);
			UberQuest_List_HighlightFrame:SetPoint("TOPLEFT", "UberQuest_List_Title"..id, "TOPLEFT", 5, 0);
			UberQuest_List_HighlightFrame:Show();
		end
	end
	if ( GetQuestLogSelection() > GetNumQuestLogEntries() ) then
		return;
	end
	UberQuest_Details_Title:SetText ("Uber Quest ("..UBERQUEST_VERSION..")");
	UberQuest_Details:Show();
	UberQuest_Details_Update();
end

local function UberQuest_SetFirstValidSelection()
	-- Intentionally left at QuestLog_
	local selectableQuest = QuestLog_GetFirstSelectableQuest();
	UberQuest_List_SetSelection(selectableQuest);
end


local function UberQuest_ConfigInit()
	UberQuest_Config_Loaded = 1;
	if (not UberQuest_Config) then 
		UberQuest_Config = {};
		UberQuest_Config.showquestlevels = 1;
		UberQuest_Config.useminion = 1;
		UberQuest_Config.addnewquests = 1;
		UberQuest_Config.UberMinionScale = 100;
	end
	-- In General: No reason, IMO, for per-player config options since 
	-- people are going to want consistant QuestLog views anyways. Or at least I do.
	-- The exception is for options regarding onscreen placement, and (duh) 
	-- Quests selected for minion
	if (not UberQuest_Config[UberQuest_Player]) then
		UberQuest_Config[UberQuest_Player] = {};
	end
	if (not UberQuest_Config[UberQuest_Player].selected) then
		UberQuest_Config[UberQuest_Player].selected = {};
	end

	UberQuest_Config.speedquest = nil;
	if (UberQuest_Config.useminion) then
		if (UberQuest_Config[UberQuest_Player].minionvisible) then
			if (not UberQuest_Minion:IsVisible()) then
				UberQuest_MinionShowHide();
			end
		end
		if (UberQuest_Config[UberQuest_Player].lockminion) then
			UberQuest_Minion_Move:Hide()
		else
			UberQuest_Minion_Move:Show()
		end
		if (UberQuest_Config.color and UberQuest_Config.color.r and UberQuest_Config.color.g and UberQuest_Config.color.b and UberQuest_Config.color.opacity) then
			UberQuest_MinionBackdrop:SetBackdropColor(UberQuest_Config.color.r, UberQuest_Config.color.g, UberQuest_Config.color.b);
			local alpha = 1.0 - UberQuest_Config.color.opacity;
			UberQuest_MinionBackdrop:SetAlpha(alpha);
		else
			UberQuest_MinionBackdrop:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b);
			UberQuest_MinionBackdrop:SetAlpha(1);
		end
		if (UberQuest_Config[UberQuest_Player].lock and
			UberQuest_Config[UberQuest_Player].lock.corner and
			UberQuest_Config[UberQuest_Player].lock.pointone and
			UberQuest_Config[UberQuest_Player].lock.pointtwo) then
			UberQuest_Minion:ClearAllPoints();
			UberQuest_Minion:SetPoint(UberQuest_Config[UberQuest_Player].lock.corner,"UIParent","BOTTOMLEFT",UberQuest_Config[UberQuest_Player].lock.pointone,UberQuest_Config[UberQuest_Player].lock.pointtwo);
		end
		
		--  Load Scale settings
		
		if (UberQuest_Config[UberQuest_Player]["scale"]) then
			local scale = 1;
			scale = UberQuest_Config[UberQuest_Player]["scale"];
			UberQuest_Minion:SetScale(UIParent:GetScale() * scale);
			UberMinionScale:SetValue(scale * 100);
		end
		
		
		
	end
	UberQuest_List_ConfigButton:Enable();
	UberQuest_List_SummonMinion:Enable();
	
	
	
end

function UberQuest_DelayedConfigInit_OnUpdate(elapsed)
	if (UberQuest_DelayedConfigInit) then
		UberQuest_DelayedConfigInit = UberQuest_DelayedConfigInit - elapsed;
		if (UberQuest_DelayedConfigInit < 0) then
			UberQuest_ConfigInit();
			UberQuest_DelayedConfigInit = nil;
			UberQuest:Hide();
		end
	else -- Stop receiving OnUpdates
		UberQuest:Hide();
	end
end

function UberQuest_OnLoad()
	this:RegisterEvent("PLAYER_ENTERING_WORLD"); 
	this:RegisterEvent("QUEST_LOG_UPDATE");
	this:RegisterEvent("PARTY_MEMBERS_CHANGED");
	this:RegisterEvent("ADDON_LOADED");
	

	-- DEFAULT_CHAT_FRAME:AddMessage("UberQuest ("..UBERQUEST_VERSION..") "..UBERQUEST_LOADED..".");

	UberQuest_oldToggleQuestLog = ToggleQuestLog;
	ToggleQuestLog = UberQuest_ListShowHide;

	local playerName = UnitName("player");
	if (playerName ~= UKNOWNBEING and playerName ~= UNKNOWNOBJECT) then
		UberQuest_Player = playerName;
	end
end

function UberQuest_OnEvent()
	-- Register the addon in myAddOns
	if(event == "ADDON_LOADED" and myAddOnsFrame_Register) then
			myAddOnsFrame_Register(UberQuestDetails);
	end
	--
	if (event == "PLAYER_ENTERING_WORLD") then
		if (UberQuest_Player and not UberQuest_Config_Loaded) then
			UberQuest_DelayedConfigInit = 10;
			UberQuest:Show();
		end
	elseif (UberQuest_Config_Loaded and event == "QUEST_LOG_UPDATE") then
		UberQuest_List_Update();
		if (UberQuest_Details:IsVisible()) then
			UberQuest_Details_Update();
		end
		if (UberQuest_Minion:IsVisible() and UberQuest_Config[UberQuest_Player].selected) then
			UberQuest_Minion_Update();
		end
	elseif ( event == "PARTY_MEMBERS_CHANGED" ) then
		-- Pushable == Sharable. Blizzard likes things straight forward
		if ( GetQuestLogPushable() and GetNumPartyMembers() > 0 ) then
			UberQuest_List_ShareButton:Enable();
		else
			UberQuest_List_ShareButton:Disable();
		end
	end
end

function UberQuest_List_OnLoad()
	this.selectedButtonID = 2;
end

function UberQuest_ListShowHide()
	if (UberQuest_List:IsVisible()) then
		HideUIPanel(UberQuest_List);
		PlaySound("igQuestLogClose");
	else
		UberQuest_List_Title:SetText ("Uber Quest ("..UBERQUEST_VERSION..")");
		ShowUIPanel(UberQuest_List);
		UberQuest_List_Update();
		PlaySound("igQuestLogOpen");
		if (UberQuest_Details:IsVisible()) then
			UberQuest_Details_Update();
		end
	end
end

function UberQuest_List_Update()
	local i;
	UberQuest_QuestTitles = {};
	if (UberQuest_Config.useminion) then
		UberQuest_List_SummonMinion:Show();
	else
		UberQuest_List_SummonMinion:Hide();
		UberQuest_Minion:Hide();
	end
	-- Copied muchly from QuestLog_Update(), Blizzard code, with updates for sexual prowess.
	local numEntries, numQuests = GetNumQuestLogEntries();
	if ( numEntries == 0 ) then
		--EmptyQuestLogFrame:Show();
		UberQuest_List_AbandonButton:Disable();
		UberQuest_List.hasTimer = nil;
		UberQuest_List_ExpandButtonFrame:Hide();
	else
		--EmptyQuestLogFrame:Hide();
		UberQuest_List_AbandonButton:Enable();
		UberQuest_List_ExpandButtonFrame:Show();
		-- UberQuest_Details_Title:SetText ("Uber Quest ("..UBERQUEST_VERSION..")");
		-- UberQuest_Details:Show();
		-- UberQuest_Details_Update();
	end
	-- Update Quest Count
	UberQuest_List_QuestCount:SetText(format(QUEST_LOG_COUNT_TEMPLATE, numQuests, MAX_QUESTLOG_QUESTS));
	UberQuest_List_CountMiddle:SetWidth(UberQuest_List_QuestCount:GetWidth());

	-- ScrollFrame update
	FauxScrollFrame_Update(UberQuest_List_Scroll, numEntries, UBERQUEST_QUESTS_DISPLAYED, UBERQUEST_QUESTLINE_HEIGHT, nil, nil, nil, UberQuest_List_HighlightFrame, 293, 316 )

	if (numQuests and numQuests > 0) then
		local i;
		for i=1, numEntries, 1 do
			local index = i;
			local quest, level, questTag, isHeader, isCollapsed = GetQuestLogTitle(i);
			if (quest and not isHeader) then
				if (UberQuest_GotFullList and UberQuest_Config.addnewquests and not UberQuest_ActivityTracker[quest]) then
					UberQuest_Config[UberQuest_Player].selected[quest] = 1;
				end
				if (not UberQuest_ActivityTracker[quest]) then
					UberQuest_ActivityTracker[quest] = {};
				end
			end
		end
		if (UberQuest_ActivityTracker ~= {}) then
			UberQuest_GotFullList = true;
		end
	end
	local numPartyMembers = GetNumPartyMembers();
	-- Update the quest listing
	UberQuest_List_HighlightFrame:Hide();
	for i=1, UBERQUEST_QUESTS_DISPLAYED, 1 do
		local questIndex = i + FauxScrollFrame_GetOffset(UberQuest_List_Scroll);
		local questLogTitle = getglobal("UberQuest_List_Title"..i);
		local questTitleTag = getglobal("UberQuest_List_Title"..i.."Tag");
		local questNormalText = getglobal("UberQuest_List_Title"..i.."NormalText");
		local questHighlightText = getglobal("UberQuest_List_Title"..i.."NormalText"); --		local questHighlightText = getglobal("UberQuest_List_Title"..i.."HighlightText");
		local questDisabledText = getglobal("UberQuest_List_Title"..i.."NormalText"); --		local questDisabledText = getglobal("UberQuest_List_Title"..i.."DisabledText");
		local questNumGroupMates = getglobal("UberQuest_List_Title"..i.."GroupMates");
		if ( questIndex <= numEntries ) then
			local questLogTitleText, level, questTag, isHeader, isCollapsed, isComplete = GetQuestLogTitle(questIndex);
			local color;
			if ( isHeader ) then
				if ( questLogTitleText ) then
					questLogTitle:SetText(questLogTitleText);
				else
					questLogTitle:SetText("");
				end
				
				if ( isCollapsed ) then
					questLogTitle:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up");
				else
					questLogTitle:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up"); 
				end
				questNumGroupMates:SetText("");
				getglobal("UberQuest_List_Title"..i.."Highlight"):SetTexture("Interface\\Buttons\\UI-PlusButton-Hilight");
				getglobal("UberQuest_List_Title"..i.."_MinionSelect"):Hide();
			else
				UberQuest_QuestTitles[i] = questLogTitleText;
				if (UberQuest_Config.useminion) then
					getglobal("UberQuest_List_Title"..i.."_MinionSelect"):Show();
					getglobal("UberQuest_List_Title"..i.."_MinionSelect"):SetChecked(UberQuest_Config[UberQuest_Player].selected[questLogTitleText]);
				else
					getglobal("UberQuest_List_Title"..i.."_MinionSelect"):Hide();
				end
			
				-- Better Questlevels		
						
				if ( UberQuest_Config.showquestlevels == 1 ) then		
						if ( questTag == ELITE ) then
							questLogTitle:SetText("  ["..level.."+] "..questLogTitleText);
						else									
							if ( questTag == RAID ) then
								questLogTitle:SetText("  ["..level.."R] "..questLogTitleText);
																
							else
								if ( questTag == "Dungeon" or questTag == "Donjon" ) then
									questLogTitle:SetText("  ["..level.."D] "..questLogTitleText);
								else				
									questLogTitle:SetText("  ["..level.."] "..questLogTitleText);
								end
							end
						end
				else
					questLogTitle:SetText("  "..questLogTitleText);
				end		
				
				questLogTitle:SetNormalTexture("");
				getglobal("UberQuest_List_Title"..i.."Highlight"):SetTexture("");
				local partyMembersOnQuest = 0;
				for j=1, numPartyMembers do
					local isOnQuest = IsUnitOnQuest(questIndex, "party"..j);
					if ( isOnQuest and isOnQuest == 1 ) then
						partyMembersOnQuest = partyMembersOnQuest + 1;
					end
				end
				if ( partyMembersOnQuest > 0 ) then
					questNumGroupMates:SetText("["..partyMembersOnQuest.."]");
				else
					questNumGroupMates:SetText("");
				end
			end
			-- Set the quest tag
			if ( isComplete ) then
				questTag = COMPLETE;
			end
			if ( questTag ) then
				questTitleTag:SetText("("..questTag..")");
				-- Shrink text to accomdate quest tags without wrapping
				-- This is just wrong, so very very wrong.
				-- (Elite) is coming out at width 80
				if (questTag == "Elite" or questTag == "Raid") then
					questNormalText:SetWidth(225);
					questHighlightText:SetWidth(225);
					questDisabledText:SetWidth(225);
				elseif (questTag == "Complete") then
					questNormalText:SetWidth(205);
					questHighlightText:SetWidth(205);
					questDisabledText:SetWidth(205);
				else
					questNormalText:SetWidth(275 - 5 - questTitleTag:GetWidth());
					questHighlightText:SetWidth(275 - 5 - questTitleTag:GetWidth());
					questDisabledText:SetWidth(275 - 5 - questTitleTag:GetWidth());
				end
			else
				questTitleTag:SetText("");
				-- Reset to max text width
				questNormalText:SetWidth(275);
				questHighlightText:SetWidth(275);
				questDisabledText:SetWidth(275);
			end

			-- Color the quest title and highlight according to the difficulty level
			local playerLevel = UnitLevel("player");
			if ( isHeader ) then
				color = QuestDifficultyColor["header"];
			else
				color = GetDifficultyColor(level);
			end
			questTitleTag:SetTextColor(color.r, color.g, color.b);
			questLogTitle:SetTextColor(color.r, color.g, color.b);
			questNumGroupMates:SetTextColor(color.r, color.g, color.b);
			questLogTitle.r = color.r;
			questLogTitle.g = color.g;
			questLogTitle.b = color.b;
			questLogTitle:Show();

			-- Place the highlight and lock the highlight state
			if ( UberQuest_List.selectedButtonID and GetQuestLogSelection() == questIndex ) then
			UberQuest_List_HighlightFrame:SetPoint("TOPLEFT", "UberQuest_List_Title"..i, "TOPLEFT", 0, 0);
			UberQuest_List_HighlightFrame:Show();
				questTitleTag:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
				questLogTitle:LockHighlight();
			else
				questLogTitle:UnlockHighlight();
			end
		else
			questLogTitle:Hide();
		end
	end
		
	-- Set the expand/collapse all button texture
	local numHeaders = 0;
	local notExpanded = 0;
	-- Somewhat redundant loop, but cleaner than the alternatives
	for i=1, numEntries, 1 do
		local index = i;
		local questLogTitleText, level, questTag, isHeader, isCollapsed = GetQuestLogTitle(i);
		if ( questLogTitleText and isHeader ) then
			numHeaders = numHeaders + 1;
			if ( isCollapsed ) then
				notExpanded = notExpanded + 1;
			end
		end
	end
	-- If all headers are not expanded then show collapse button, otherwise show the expand button
	if ( notExpanded ~= numHeaders ) then
		UberQuest_List_ExpandButtonFrame_CollapseAllButton.collapsed = nil;
		UberQuest_List_ExpandButtonFrame_CollapseAllButton:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up");
	else
		UberQuest_List_ExpandButtonFrame_CollapseAllButton.collapsed = 1;
		UberQuest_List_ExpandButtonFrame_CollapseAllButton:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up");
	end

	-- Update Quest Count
	UberQuest_List_QuestCount:SetText(format(QUEST_LOG_COUNT_TEMPLATE, numQuests, MAX_QUESTLOG_QUESTS));
	UberQuest_List_CountMiddle:SetWidth(UberQuest_List_QuestCount:GetWidth());

	-- If no selection then set it to the first available quest
	if ( GetQuestLogSelection() == 0 ) then
		UberQuest_SetFirstValidSelection();
	end

	-- Determine whether the selected quest is pushable or not
	if ( numEntries == 0 ) then
		UberQuest_List_ShareButton:Disable();
	elseif ( GetQuestLogPushable() and GetNumPartyMembers() > 0 ) then
		UberQuest_List_ShareButton:Enable();
	else
		UberQuest_List_ShareButton:Disable();
	end
end

function UberQuest_DetailsShowHide()
	if (UberQuest_Details:IsVisible()) then
		UberQuest_Details:Hide();
	else
		UberQuest_Details_Title:SetText ("Uber Quest ("..UBERQUEST_VERSION..")");
		UberQuest_Details:Show();
		UberQuest_Details_Update();
	end
end

function UberQuest_ConfigShowHide()
	if (UberQuest_ConfigFrame:IsVisible()) then
		UberQuest_ConfigFrame:Hide();
	else
		UberQuest_ConfigFrame:Show();
		UberQuest_Config_Update();
	end
end

function UberQuest_Config_Update()
	UberQuest_ConfigFrame_ShowQuestLevels:SetChecked(UberQuest_Config.showquestlevels);
	UberQuest_ConfigFrame_UseMinion:SetChecked(UberQuest_Config.useminion);
	UberQuest_ConfigFrame_LockMinion:SetChecked(UberQuest_Config[UberQuest_Player].lockminion);
	UberQuest_ConfigFrame_MinionAddNew:SetChecked(UberQuest_Config.addnewquests);
	UberQuest_ConfigFrame_ColorizeObjective:SetChecked(UberQuest_Config[UberQuest_Player].colorizeobjectives);
	
	if (UberQuest_Config.useminion) then
		UberQuest_ConfigFrame_LockMinion:Enable();
		UberQuest_ConfigFrame_MinionAddNew:Enable();
		UberQuest_ConfigFrame_ColorizeObjective:Enable();
	else
		UberQuest_ConfigFrame_LockMinion:Disable();
		UberQuest_ConfigFrame_MinionAddNew:Disable();
		UberQuest_ConfigFrame_ColorizeObjective:Disable();
	end
	if (UberQuest_Config.color and UberQuest_Config.color.r and UberQuest_Config.color.g and UberQuest_Config.color.b and UberQuest_Config.color.opacity) then
		UberQuest_Minion_ColorPicker = { r = UberQuest_Config.color.r, 
						 g = UberQuest_Config.color.g, 
						 b = UberQuest_Config.color.b }; 
		UberQuest_ConfigFrame_BGColorSwatchBg:SetVertexColor(UberQuest_Config.color.r, 
								UberQuest_Config.color.g, 
								UberQuest_Config.color.b);
	else
		UberQuest_Minion_ColorPicker = { r = TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, 
						 g = TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, 
						 b = TOOLTIP_DEFAULT_BACKGROUND_COLOR.b }; 
		UberQuest_ConfigFrame_BGColorSwatchBg:SetVertexColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, 
								TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, 
								TOOLTIP_DEFAULT_BACKGROUND_COLOR.b);
	end
end

function UberQuest_Minion_OnOff(val)
	if (val) then
	else
		if (UberQuest_Minion:IsVisible()) then
			UberQuest_MinionShowHide();
		end
	end
end

function UberQuest_MinionSelect_OnClick()
	if (UberQuest_QuestTitles[this:GetParent():GetID()]) then
		if (this:GetChecked()) then
			UberQuest_Config[UberQuest_Player].selected[UberQuest_QuestTitles[this:GetParent():GetID()]] = 1;
		else
			UberQuest_Config[UberQuest_Player].selected[UberQuest_QuestTitles[this:GetParent():GetID()]] = nil;
		end
		if (UberQuest_Minion:IsVisible()) then
			UberQuest_Minion_Update();
		end
	end
end

function UberQuest_MinionShowHide()
	if (UberQuest_Config and UberQuest_Player and UberQuest_Config[UberQuest_Player]) then
		if (UberQuest_Minion:IsVisible()) then
			UberQuest_Minion:Hide();
			UberQuest_List_SummonMinion:SetText(UBERQUEST_SUMMONMINION);
			UberQuest_Config[UberQuest_Player].minionvisible = nil;
		else
			UberQuest_Minion:Show();
			UberQuest_List_SummonMinion:SetText(UBERQUEST_DISMISSMINION);
			UberQuest_Minion_Update();
			UberQuest_Config[UberQuest_Player].minionvisible = 1;
		end
	end
end

function UberQuest_Minion_Update()
	local function ConvertColorFormat(color) 
		local function dec2hex(decnum)
			if (decnum == 0) then return "00"; end
    			local hexnum="";
 			local tempval;
			decnum = 255*decnum;
			if ((decnum-math.floor(decnum)) > 0) then
				decnum = decnum + 1;
			end
			decnum = math.floor(decnum);
			while (decnum ~= 0) do
    				tempval = math.mod(decnum,16);
    				if (tempval > 9) then
					tempval = string.char(tempval + 55);
				end
				hexnum = tempval..hexnum;
				decnum = math.floor(decnum / 16); 
				if (decnum < 16) then
					if (decnum > 9) then
						decnum = string.char(decnum + 55);
					end
					hexnum = decnum..hexnum; 
					decnum = 0 
				end
			end
			return hexnum;
		end
		return (dec2hex(color.r)..dec2hex(color.g)..dec2hex(color.b));
	end
	local function DifficultyColor(now,max)
		local startrange = QuestDifficultyColor["impossible"];
		local midrange = QuestDifficultyColor["difficult"];
		local endrange = QuestDifficultyColor["standard"];
		now = tonumber(now); 
		max = tonumber(max);
		if (not now or now == 0 or now > max) then
			return ConvertColorFormat(startrange);
		elseif (now == (max / 2)) then
			return ConvertColorFormat(midrange);
		elseif (now == max) then
			return ConvertColorFormat(endrange);
		elseif (now <= (max / 2)) then
			local color = {};
			local percent = now / max;
			color.r = startrange.r;
			color.g = startrange.g + ((midrange.g - startrange.g) * percent);
			color.b = startrange.b - ((startrange.b - midrange.b) * percent);
			return ConvertColorFormat(color);
		else 
			local color = {};
			local percent = now / max;
			color.r = midrange.r - ((midrange.r - endrange.r) * percent);
			color.g = midrange.g - ((midrange.g - endrange.g) * percent);
			color.b = midrange.b + ((endrange.b - midrange.b) * percent);
			return ConvertColorFormat(color);
		end
	end
	local applytext = "";
	local questlist = {};
	local i = 1;
	local j;
	if (UberQuest_Config and UberQuest_Player and UberQuest_Config[UberQuest_Player] and UberQuest_Config[UberQuest_Player].selected and UberQuest_Config[UberQuest_Player].selected ~= {}) then
		local category = nil;
		local questLogTitleText, level, questTag, isHeader, isCollapsed, isComplete = GetQuestLogTitle(i);
		while (questLogTitleText) do
			if (isHeader) then
				category = questLogTitleText;
			elseif (UberQuest_Config[UberQuest_Player].selected[questLogTitleText]) then
				questlist[questLogTitleText] = i;
				UberQuests_ThereAreQuests = 1;

				if (applytext ~= "") then
					applytext = applytext.."\n";
				end
				local color = ConvertColorFormat(GetDifficultyColor(level));

				-- Better Questlevels to Minion	
				
				if ( UberQuest_Config.showquestlevels == 1 ) then		
						if ( questTag == ELITE ) then
							applytext = applytext.."|cff"..color.."["..level.."+] "..questLogTitleText.."|r";
						else									
							if ( questTag == RAID ) then
								applytext = applytext.."|cff"..color.."["..level.."R] "..questLogTitleText.."|r";
							else
								if ( questTag == "Dungeon" or questTag == "Donjon" ) then
									applytext = applytext.."|cff"..color.."["..level.."D] "..questLogTitleText.."|r";
								else				
									applytext = applytext.."|cff"..color.."["..level.."] "..questLogTitleText.."|r";
								end
							end
						end
				else
					applytext = applytext.."|cff"..color..questLogTitleText.."|r";
				end
				
				if (isComplete) then
					color = ConvertColorFormat(QuestDifficultyColor["header"]);
					applytext = applytext.." |cff"..color.."("..UBERQUEST_QCOMPLETE..")|r";
				else
					SelectQuestLogEntry(i);
					for j = 1, GetNumQuestLeaderBoards(), 1 do
						local text, typ, finished = GetQuestLogLeaderBoard(j);
						if ( not text or strlen(text) == 0 ) then
							text = typ;
						end
						if (finished) then
							color = ConvertColorFormat(QuestDifficultyColor["header"]);
							applytext = applytext.."\n  |cff"..color..text.." ("..UBERQUEST_QCOMPLETE..")|r";
						else
							local item, now, max;
							for item, now, max in string.gfind(text,"([^:]+): (%d+)/(%d+)$") do
								if (item and now and max) then
									if (UberQuest_Config[UberQuest_Player].colorizeobjectives) then
										color = DifficultyColor(now,max);
									else
										color = "ffffff";
									end

								end
							end
							applytext = applytext.."\n  |cff"..color..text.."|r";
						end
					end
				end
			end
			i = i + 1;
			questLogTitleText, level, questTag, isHeader, isCollapsed, isComplete = GetQuestLogTitle(i);
		end
		if (applytext == "") then
			UberQuest_Minion_Text:SetText(UBERQUEST_MINION_NOQUESTS);
		else
			UberQuest_Minion_Text:SetText(applytext);
		end
		if (UberQuests_ThereAreQuests) then
			for i in UberQuest_Config[UberQuest_Player].selected do
				if (not questlist[i]) then
					UberQuest_Config[UberQuest_Player].selected[i] = nil;
					UberQuest_ActivityTracker[i] = nil;
				end
			end
		end
	else
		UberQuest_Minion_Text:SetText(UBERQUEST_MINION_NOQUESTS);
	end
	if (UberQuest_SelectedQuest) then
		SelectQuestLogEntry(UberQuest_SelectedQuest);
	end
	local width = UberQuest_Minion_Text:GetWidth() + 15;
	local height = UberQuest_Minion_Text:GetHeight() + 15;
	if (width < 100) then width = 100; end
	if (height < 30) then height = 30; end
	if (UberQuest_MinionSetOnce) then
		-- Running this before the Width and Height are set at least once always 
		-- screws up the corner locking.
		UberQuest_Minion_LockCornerForGrowth();
	end
	UberQuest_MinionSetOnce = 1;
	UberQuest_Minion:SetWidth(width);
	UberQuest_Minion:SetHeight(height);
end

function UberQuest_Minion_LockCornerForGrowth()
	local Left = UberQuest_Minion:GetLeft();
	local Right = UberQuest_Minion:GetRight();
	local Top = UberQuest_Minion:GetTop();
	local Bottom = UberQuest_Minion:GetBottom();
	local lock;
	local pointone;
	local pointtwo;
	local TOPBOTTOM_MEDIAN = 384;
	local LEFTRIGHT_MEDIAN = 512;
	if (Left and Right and Top and Bottom) then
		if (Bottom < TOPBOTTOM_MEDIAN and Top > TOPBOTTOM_MEDIAN) then
			local topcross = Top - TOPBOTTOM_MEDIAN;
			local bottomcross = TOPBOTTOM_MEDIAN - Bottom;
			if (bottomcross > topcross) then
				lock = "BOTTOM";
				pointtwo = Bottom;
			else
				lock = "TOP";
				pointtwo = Top;
			end
		elseif (Top > TOPBOTTOM_MEDIAN) then
			lock = "TOP";
			pointtwo = Top;
		elseif (Bottom < TOPBOTTOM_MEDIAN) then
			lock = "BOTTOM";
			pointtwo = Bottom;
		end
		if (Left < LEFTRIGHT_MEDIAN and Right > LEFTRIGHT_MEDIAN) then
			-- Minion crossed the LEFT/RIGHT median
			local leftcross = LEFTRIGHT_MEDIAN - Left;
			local rightcross = Right - LEFTRIGHT_MEDIAN;
			if (rightcross > leftcross) then
				lock = lock.."RIGHT";
				pointone = Right;
			else
				lock = lock.."LEFT";
				pointone = Left;
			end
		elseif (Left < LEFTRIGHT_MEDIAN) then
			lock = lock.."LEFT";
			pointone = Left;
		elseif (Right > LEFTRIGHT_MEDIAN) then
			lock = lock.."RIGHT";
			pointone = Right;
		end
		if (lock and lock ~= "" and pointone and pointtwo) then
			UberQuest_Minion:ClearAllPoints();
			UberQuest_Minion:SetPoint(lock,"UIParent","BOTTOMLEFT",pointone,pointtwo);
			UberQuest_Config[UberQuest_Player].lock = {};
			UberQuest_Config[UberQuest_Player].lock.corner = lock;
			UberQuest_Config[UberQuest_Player].lock.pointone = pointone;
			UberQuest_Config[UberQuest_Player].lock.pointtwo = pointtwo;
		elseif (UberQuests_ThereAreQuests and
			UberQuest_Config[UberQuest_Player].lock and
			UberQuest_Config[UberQuest_Player].lock.corner and
			UberQuest_Config[UberQuest_Player].lock.pointone and
			UberQuest_Config[UberQuest_Player].lock.pointtwo) then
			UberQuest_Minion:ClearAllPoints();
			UberQuest_Minion:SetPoint(UberQuest_Config[UberQuest_Player].lock.corner,"UIParent","BOTTOMLEFT",UberQuest_Config[UberQuest_Player].lock.pointone,UberQuest_Config[UberQuest_Player].lock.pointtwo);
		end
	end
end

function UberQuest_TitleButton_OnClick(button)
	if ( button == "LeftButton" ) then
		if ( IsShiftKeyDown() and ChatFrameEditBox:IsVisible() ) then
			ChatFrameEditBox:Insert(this:GetText());
		end
		UberQuest_List_SetSelection(this:GetID() + FauxScrollFrame_GetOffset(UberQuest_List_Scroll))
		UberQuest_List_Update();
	end
end

function UberQuest_Minion_ColorPick()
	ColorPickerFrame.func = UberQuest_Minion_SetColor;
	ColorPickerFrame.hasOpacity = 1;
	ColorPickerFrame.opacityFunc = UberQuest_Minion_SetOpacity;
	ColorPickerFrame.cancelFunc = UberQuest_Minion_Cancel;
	if (UberQuest_Config.color and UberQuest_Config.color.r and UberQuest_Config.color.g and UberQuest_Config.color.b and UberQuest_Config.color.opacity) then
		ColorPickerFrame:SetColorRGB(	UberQuest_Config.color.r,
						UberQuest_Config.color.g,
						UberQuest_Config.color.b);
		ColorPickerFrame.opacity = UberQuest_Config.color.opacity;
		ColorPickerFrame.previousValues = {r=UberQuest_Config.color.r, g=UberQuest_Config.color.g, b=UberQuest_Config.color.b, opacity=UberQuest_Config.color.opacity};
	else
		ColorPickerFrame:SetColorRGB(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r,TOOLTIP_DEFAULT_BACKGROUND_COLOR.g,TOOLTIP_DEFAULT_BACKGROUND_COLOR.b);
		ColorPickerFrame.previousValues = {r=TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, g=TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, b=TOOLTIP_DEFAULT_BACKGROUND_COLOR.b, opacity=0};
		ColorPickerFrame.opacity = 0;
	end
	ShowUIPanel(ColorPickerFrame);
end

function UberQuest_Minion_SetColor()
	local r,g,b = ColorPickerFrame:GetColorRGB();
	UberQuest_MinionBackdrop:SetBackdropColor(r, g, b);
	if (not UberQuest_Config.color) then
		UberQuest_Config.color = {};
	end
	UberQuest_Config.color.r = r;
	UberQuest_Config.color.g = g;
	UberQuest_Config.color.b = b;
	UberQuest_Config_Update();
end

function UberQuest_Minion_SetOpacity()
	local alpha = 1.0 - OpacitySliderFrame:GetValue();
	UberQuest_MinionBackdrop:SetAlpha(alpha);
	if (not UberQuest_Config.color) then
		UberQuest_Config.color = {};
	end
	UberQuest_Config.color.opacity = OpacitySliderFrame:GetValue();
end

function UberQuest_Minion_Cancel(previousValues)
	if (not UberQuest_Config.color) then
		UberQuest_Config.color = {};
	end
	if (previousValues.r and previousValues.g and previousValues.b) then
		UberQuest_MinionBackdrop:SetBackdropColor(previousValues.r, previousValues.g, previousValues.b);
		UberQuest_Config.color.r = previousValues.r;
		UberQuest_Config.color.g = previousValues.g;
		UberQuest_Config.color.b = previousValues.b;
	end
	if (previousValues.opacity) then
		local alpha = 1.0 - previousValues.opacity;
		UberQuest_MinionBackdrop:SetAlpha(alpha);
		UberQuest_Config.color.opacity = previousValues.opacity;
	end
	UberQuest_Config_Update();
end

function UberMinion_Scale_Update()
	local scale = UberMinionScale:GetValue() / 100;
	UberQuest_Minion:SetScale(UIParent:GetScale() * scale);
	UberQuest_Config[UberQuest_Player]["scale"] = scale;
	UberQuest_Minion_Update();
end


function QuestLogTitleButton_OnEnter()
		-- Set highlight
	getglobal(this:GetName().."Tag"):SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);

		-- Set group info tooltip
	QuestLog_UpdatePartyInfoTooltip();
end


function QuestLog_UpdatePartyInfoTooltip()
	local index = this:GetID() + FauxScrollFrame_GetOffset(UberQuest_List_Scroll);
	local numPartyMembers = GetNumPartyMembers();
		if ( numPartyMembers == 0 or this.isHeader ) then
			return;
		end
	GameTooltip_SetDefaultAnchor(GameTooltip, this);

	local questLogTitleText = GetQuestLogTitle(index);
	GameTooltip:SetText(questLogTitleText);

	local isOnQuest, unitName, partyMemberOnQuest;
		for i=1, numPartyMembers do
			isOnQuest = IsUnitOnQuest( index, "party"..i);
			unitName = UnitName("party"..i);
				if ( isOnQuest and isOnQuest == 1 ) then
					if ( not partyMemberOnQuest ) then
						GameTooltip:AddLine(HIGHLIGHT_FONT_COLOR_CODE..PARTY_QUEST_STATUS_ON..FONT_COLOR_CODE_CLOSE);
						partyMemberOnQuest = 1;
					end
					GameTooltip:AddLine(LIGHTYELLOW_FONT_COLOR_CODE..unitName..FONT_COLOR_CODE_CLOSE);
				end
		end
	if ( not partyMemberOnQuest ) then
		GameTooltip:AddLine(HIGHLIGHT_FONT_COLOR_CODE..PARTY_QUEST_STATUS_NONE..FONT_COLOR_CODE_CLOSE);
	end
	GameTooltip:Show();
end