local name = "ToolTip";
local version = "5.8";
--Author's Notes------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
--[[
	Description:	Drastically improves the game's tooltip.
	Author:		AquaFlare7 (AquaFlare7@comcast.net)
--]]



--onEvent Routines----------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
function aftt_toggleFrames()
	if (aftt_optionFrame:IsVisible()) then
		aftt_optionFrame:Hide();
	else
		aftt_optionFrame:Show();
	end
end

function aftt_buttonToggle(option)
	if (option == "guild") then
		--0, hide	-> toggles to show
		--1, show	-> toggles to showbottom
		--2, showbottom	-> toggles to hide
		if (AF_ToolTip[aftt_localUser]["Guild"] == 0 or AF_ToolTip[aftt_localUser]["Guild"] == nil) then
			AF_ToolTip[aftt_localUser]["Guild"] = 1;
		elseif (AF_ToolTip[aftt_localUser]["Guild"] == 1) then
			AF_ToolTip[aftt_localUser]["Guild"] = 2;
		elseif (AF_ToolTip[aftt_localUser]["Guild"] == 2) then
			AF_ToolTip[aftt_localUser]["Guild"] = 0;
		end
	elseif (option == "reaction") then
		if (AF_ToolTip[aftt_localUser]["ReactionText"] == 1) then
			AF_ToolTip[aftt_localUser]["ReactionText"] = 0;
		else
			AF_ToolTip[aftt_localUser]["ReactionText"] = 1;
		end
	elseif (option == "tapped") then
		if (AF_ToolTip[aftt_localUser]["Tapped"] == 1) then
			AF_ToolTip[aftt_localUser]["Tapped"] = 0;
		else
			AF_ToolTip[aftt_localUser]["Tapped"] = 1;
		end
	elseif (option == "pvp") then
		if (AF_ToolTip[aftt_localUser]["PvP"] == 1) then
			AF_ToolTip[aftt_localUser]["PvP"] = 0;
		else
			AF_ToolTip[aftt_localUser]["PvP"] = 1;
		end
	elseif (option == "fade") then
		if (AF_ToolTip[aftt_localUser]["Fade"] == 1) then
			AF_ToolTip[aftt_localUser]["Fade"] = 0;
		else
			AF_ToolTip[aftt_localUser]["Fade"] = 1;
		end
	elseif (option == "rank") then
		if (AF_ToolTip[aftt_localUser]["Rank"] == 1) then
			AF_ToolTip[aftt_localUser]["Rank"] = 2;
		elseif (AF_ToolTip[aftt_localUser]["Rank"] == 2) then
			AF_ToolTip[aftt_localUser]["Rank"] = 0;
		else
			AF_ToolTip[aftt_localUser]["Rank"] = 1;
		end
	elseif (option == "anchor") then
		--mouse		-> topleft
		--topleft	-> top
		--top		-> topright
		--topright	-> left
		--left		-> center
		--center	-> right
		--right		-> bottomleft
		--bottomleft	-> bottom
		--bottom	-> bottomright
		--bottomright	-> mouse
		if (AF_ToolTip[aftt_localUser]["Anchor"] == "mouse") then
			AF_ToolTip[aftt_localUser]["Anchor"] = "topleft";
			GameTooltip_SetDefaultAnchor = aftt_GameTooltip_SetDefaultAnchor;
		elseif (AF_ToolTip[aftt_localUser]["Anchor"] == "topleft") then
			AF_ToolTip[aftt_localUser]["Anchor"] = "top";
			GameTooltip_SetDefaultAnchor = aftt_GameTooltip_SetDefaultAnchor;
		elseif (AF_ToolTip[aftt_localUser]["Anchor"] == "top") then
			AF_ToolTip[aftt_localUser]["Anchor"] = "topright";
			GameTooltip_SetDefaultAnchor = aftt_GameTooltip_SetDefaultAnchor;
		elseif (AF_ToolTip[aftt_localUser]["Anchor"] == "topright") then
			AF_ToolTip[aftt_localUser]["Anchor"] = "left";
			GameTooltip_SetDefaultAnchor = aftt_GameTooltip_SetDefaultAnchor;
		elseif (AF_ToolTip[aftt_localUser]["Anchor"] == "left") then
			AF_ToolTip[aftt_localUser]["Anchor"] = "center";
			GameTooltip_SetDefaultAnchor = aftt_GameTooltip_SetDefaultAnchor;
		elseif (AF_ToolTip[aftt_localUser]["Anchor"] == "center") then
			AF_ToolTip[aftt_localUser]["Anchor"] = "right";
			GameTooltip_SetDefaultAnchor = aftt_GameTooltip_SetDefaultAnchor;
		elseif (AF_ToolTip[aftt_localUser]["Anchor"] == "right") then
			AF_ToolTip[aftt_localUser]["Anchor"] = "bottomleft";
			GameTooltip_SetDefaultAnchor = aftt_GameTooltip_SetDefaultAnchor;
		elseif (AF_ToolTip[aftt_localUser]["Anchor"] == "bottomleft") then
			AF_ToolTip[aftt_localUser]["Anchor"] = "bottom";
			GameTooltip_SetDefaultAnchor = aftt_GameTooltip_SetDefaultAnchor;
		elseif (AF_ToolTip[aftt_localUser]["Anchor"] == "bottom") then
			AF_ToolTip[aftt_localUser]["Anchor"] = "bottomright";
			GameTooltip_SetDefaultAnchor = aftt_GameTooltip_SetDefaultAnchor;
		elseif (AF_ToolTip[aftt_localUser]["Anchor"] == "bottomright") then
			AF_ToolTip[aftt_localUser]["Anchor"] = "none";
			GameTooltip_SetDefaultAnchor = aftt_GameTooltip_SetDefaultAnchor;
		elseif (AF_ToolTip[aftt_localUser]["Anchor"] == "none") then
			AF_ToolTip[aftt_localUser]["Anchor"] = "mouse";
			GameTooltip_SetDefaultAnchor = aftt_GameTooltip_SetDefaultAnchor;
		end
	elseif (option == "x+") then
		AF_ToolTip[aftt_localUser]["PositionX"] = AF_ToolTip[aftt_localUser]["PositionX"] + 5;
	elseif (option == "y+") then
		AF_ToolTip[aftt_localUser]["PositionY"] = AF_ToolTip[aftt_localUser]["PositionY"] + 5;
	elseif (option == "x-") then
		if (AF_ToolTip[aftt_localUser]["PositionX"] <= 5) then
			AF_ToolTip[aftt_localUser]["PositionX"] = 0;
		else
			AF_ToolTip[aftt_localUser]["PositionX"] = AF_ToolTip[aftt_localUser]["PositionX"] - 5;
		end
	elseif (option == "y-") then
		if (AF_ToolTip[aftt_localUser]["PositionY"] <= 5) then
			AF_ToolTip[aftt_localUser]["PositionY"] = 0;
		else
			AF_ToolTip[aftt_localUser]["PositionY"] = AF_ToolTip[aftt_localUser]["PositionY"] - 5;
		end
	end
end

function aftt_onEvent()
	if (event == "UPDATE_MOUSEOVER_UNIT") then
		if (UnitName("mouseover")) then
			AF_ToolTipRefresh:Show();
		end
	end
end

function aftt_GameTooltip_OnEvent()
	aftt_Old_GameTooltip_OnEvent();
	if (event ~= "CLEAR_TOOLTIP" and UnitExists("mouseover")) then
		aftt_format("mouseover");
	end
end

function aftt_onRefresh()
	--Set our options frame refresh
		if (aftt_optionFrame:IsVisible()) then
			aftt_TextLeft1:SetText("Anchor:");
			aftt_TextRight1:SetText(AF_ToolTip[aftt_localUser]["Anchor"]);
			aftt_TextLeft2:SetText("Offset X:");
			aftt_TextRight2:SetText(AF_ToolTip[aftt_localUser]["PositionX"]);
			aftt_TextLeft3:SetText("Offset Y:");
			aftt_TextRight3:SetText(AF_ToolTip[aftt_localUser]["PositionY"]);
			if (AF_ToolTip[aftt_localUser]["Anchor"] ~= "mouse" and AF_ToolTip[aftt_localUser]["Anchor"] ~= "none") then
				aftt_previous2:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Up");
				aftt_previous3:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Up");
				aftt_next2:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up");
				aftt_next3:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up");
				aftt_TextLeft2:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight2:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextLeft3:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight3:SetVertexColor(1.0, 0.8, 0.0);
			else
				aftt_previous2:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Disabled");
				aftt_previous3:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Disabled");
				aftt_next2:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Disabled");
				aftt_next3:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Disabled");
				aftt_TextLeft2:SetVertexColor(0.3, 0.3, 0.3);
				aftt_TextRight2:SetVertexColor(0.3, 0.3, 0.3);
				aftt_TextLeft3:SetVertexColor(0.3, 0.3, 0.3);
				aftt_TextRight3:SetVertexColor(0.3, 0.3, 0.3);
			end
			aftt_TextLeft4:SetText("Fade:");
			if (AF_ToolTip[aftt_localUser]["Fade"] == 1) then
				aftt_TextLeft4:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight4:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight4:SetText("Enabled");
			else
				aftt_TextLeft4:SetVertexColor(0.4, 0.4, 0.0);
				aftt_TextRight4:SetVertexColor(0.4, 0.4, 0.0);
				aftt_TextRight4:SetText("Disabled");
			end

			aftt_TextLeft5:SetText("PvP:");
			if (AF_ToolTip[aftt_localUser]["PvP"] == 1) then
				aftt_TextLeft5:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight5:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight5:SetText("Shown");
			else
				aftt_TextLeft5:SetVertexColor(0.4, 0.4, 0.0);
				aftt_TextRight5:SetVertexColor(0.4, 0.4, 0.0);
				aftt_TextRight5:SetText("Hidden");
			end

			aftt_TextLeft6:SetText("Tapped:");
			if (AF_ToolTip[aftt_localUser]["Tapped"] == 1) then
				aftt_TextLeft6:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight6:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight6:SetText("Shown");
			else
				aftt_TextLeft6:SetVertexColor(0.4, 0.4, 0.0);
				aftt_TextRight6:SetVertexColor(0.4, 0.4, 0.0);
				aftt_TextRight6:SetText("Hidden");
			end

			aftt_TextLeft7:SetText("Reaction:");
			if (AF_ToolTip[aftt_localUser]["ReactionText"] == 1) then
				aftt_TextLeft7:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight7:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight7:SetText("Shown");
			else
				aftt_TextLeft7:SetVertexColor(0.4, 0.4, 0.0);
				aftt_TextRight7:SetVertexColor(0.4, 0.4, 0.0);
				aftt_TextRight7:SetText("Hidden");
			end

			aftt_TextLeft8:SetText("Guild:");
			if (AF_ToolTip[aftt_localUser]["Guild"] == 1) then
				aftt_TextLeft8:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight8:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight8:SetText("Top");
			elseif (AF_ToolTip[aftt_localUser]["Guild"] == 2) then
				aftt_TextLeft8:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight8:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight8:SetText("Bottom");
			else
				aftt_TextLeft8:SetVertexColor(0.4, 0.4, 0.0);
				aftt_TextRight8:SetVertexColor(0.4, 0.4, 0.0);
				aftt_TextRight8:SetText("Hidden");
			end

			aftt_TextLeft9:SetText("Rank:");
			if (AF_ToolTip[aftt_localUser]["Rank"] == 1) then
				aftt_TextLeft9:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight9:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight9:SetText("Text");
			elseif (AF_ToolTip[aftt_localUser]["Rank"] == 2) then
				aftt_TextLeft9:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight9:SetVertexColor(1.0, 0.8, 0.0);
				aftt_TextRight9:SetText("Numeric");
			else
				aftt_TextLeft9:SetVertexColor(0.4, 0.4, 0.0);
				aftt_TextRight9:SetVertexColor(0.4, 0.4, 0.0);
				aftt_TextRight9:SetText("Hidden");
			end

				aftt_TextLeft10:SetText(aftt_color_chart_name);
				aftt_TextLeft11:SetText(aftt_color_chart_author);
		end
	if (UnitExists("mouseover") == nil) then
		aftt_updateFlag = {
			["Previous"] = "none";
			["Current"] = "none";
			["Reaction"] = 0;
			["EasterEgg"] = 0;
			["Guild"] = 0;
			["PvP"] = 0;
			["RankFlag"] = 0;
		}
		if (AF_ToolTip[aftt_localUser]["Fade"] == 0 or AF_ToolTip[aftt_localUser]["Fade"] == nil) then
			GameTooltip:Hide();
		end
		AF_ToolTipRefresh:Hide();
	else
		aftt_format("mouseover");
	end
end

function aftt_UnitFrame_OnEnter()
	aftt_Old_UnitFrame_OnEnter();
	aftt_updateFlag["Previous"] = "none";
	if (SHOW_NEWBIE_TIPS ~= "1") then
		aftt_format(this.unit);
	end
	aftt_updateFlag["Previous"] = "none";
end

function aftt_UnitFrame_OnLeave()
	if ( SpellIsTargeting() ) then
		SetCursor("CAST_ERROR_CURSOR");
	end
	this.updateTooltip = nil;
	if (SHOW_NEWBIE_TIPS == "1" or AF_ToolTip[aftt_localUser]["Fade"] == 0) then
		GameTooltip:Hide();
	else
		GameTooltip:FadeOut();	
	end
end

function aftt_TargetFrame_OnEnter()
	aftt_Old_TargetFrame_OnEnter();
	aftt_updateFlag["Previous"] = "none";
	aftt_format("mouseover");
	aftt_updateFlag["Previous"] = "none";
end

--preLoad Timer Setup-------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
function aftt_unitInit()
	local playerName = UnitName("player");
	local realmName = GetCVar("realmName");
	if (playerName == nil or playerName == UNKNOWNBEING or playerName == UKNOWNBEING or playerName == UNKNOWNOBJECT) then
		return;
	end
	aftt_playerName = playerName;
	aftt_realmName = realmName;
	aftt_timerDone = 1;
	AF_ToolTipFrame:Hide();
end
aftt_Timer = 0;
aftt_timerDone = nil;
function aftt_onUpdate(arg1)
	aftt_Timer = aftt_Timer + arg1
	if not aftt_timerDone and aftt_Timer>0.2 then
		aftt_unitInit();
		aftt_Timer = 0;
	end
	if (aftt_timerDone == 1) then
		aftt_onLoad();
	end
end



--onLoad Routine------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
function aftt_onLoad()

	--Set our frame with the name and version
		aftt_TextHeader:SetText("AF_" .. name .. " v" .. version);
		aftt_TextHeader2:SetText("Color Chart Details");
		aftt_TextHeader:SetVertexColor(1.0, 1.0, 1.0);
		aftt_TextHeader2:SetVertexColor(1.0, 1.0, 1.0);
		aftt_TextLeft9:SetVertexColor(1.0, 0.8, 0.0);
		aftt_TextLeft10:SetVertexColor(0.0, 0.6, 1.0);
	--Create update table
		aftt_updateFlag = {
			["Previous"] = "none";
			["Current"] = "none";
			["Reaction"] = 0;
			["EasterEgg"] = 0;
			["Guild"] = 0;
			["PvP"] = 0;
			["RankFlag"] = 0;
		}

	--Create user table if it doesnt exist
		aftt_localUser = (aftt_playerName .. "|" .. aftt_realmName);
		if (AF_ToolTip == nil) then
			AF_ToolTip = {};
		end
		if (AF_ToolTip[aftt_localUser] == nil) then
			AF_ToolTip[aftt_localUser] = {
				["Anchor"] = "none";
				["PositionX"] = 0;
				["PositionY"] = 15;
				["Fade"] = 1;
				["PvP"] = 0;
				["ReactionText"] = 0;
				["Guild"] = 1;
				["Rank"] = 1;
				["Tapped"] = 1;
			}
			DEFAULT_CHAT_FRAME:AddMessage("|cffffff00<AF>|rToolTip: User Table for " .. aftt_playerName .. " created successfully!");
		end

	--Register our slash commands for use
		aftt_slashCommands();

	--Swap Blizzard's unit frame mouseover function out for our own (making sure to backup the old function)
		aftt_Old_UnitFrame_OnEnter = UnitFrame_OnEnter;
		UnitFrame_OnEnter = aftt_UnitFrame_OnEnter;
		aftt_Old_UnitFrame_OnLeave = UnitFrame_OnLeave;
		UnitFrame_OnLeave = aftt_UnitFrame_OnLeave;

	--Swap Blizzard's target frame mouseover function out for our own (making sure to backup the old function)
		aftt_Old_TargetFrame_OnEnter = TargetFrame_OnEnter;
		TargetFrame_OnEnter = aftt_TargetFrame_OnEnter;

	--Swap Blizzard's tooltip anchor function out for our own (making sure to backup the old function)
		aftt_OriginalGameTooltip_SetDefaultAnchor = GameTooltip_SetDefaultAnchor;
		GameTooltip_SetDefaultAnchor = aftt_GameTooltip_SetDefaultAnchor;

	--Swap Blizzard's tooltip event function out for our own (making sure to backup the old function)
		aftt_Old_GameTooltip_OnEvent = GameTooltip_OnEvent;
		GameTooltip_OnEvent = aftt_GameTooltip_OnEvent;

	--Set colors
		--loaded from colorChart.lua

	--Output message to let player know AF_ToolTip has loaded, and if there were any missing colors
		DEFAULT_CHAT_FRAME:AddMessage("|cffffff00<AF>|rToolTip: v" .. version .. " " .. aftt_translate_loaded .. " for " .. aftt_playerName .. " of " .. aftt_realmName);
		DEFAULT_CHAT_FRAME:AddMessage("|cffffff00<AF>|rToolTip: Theme: |cff0099FF" .. aftt_color_chart_name .. "|r by |cff0099FF" .. aftt_color_chart_author .. "|r applied");
		if (aftt_variableChecker_Flag == 1) then
			DEFAULT_CHAT_FRAME:AddMessage("|cffffff00<AF>|rToolTip: |cffFF0000[WARNING]|r: some colors are missing from current color chart, defaulting them to white");
		end
end



--Unit MouseOver Routine----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
function aftt_format(unit)


	--Data Collection------------------------------------------
	-----------------------------------------------------------
		--detect if on same unit from previous refresh
			aftt_updateFlag["Current"] = UnitName(unit);
			if (aftt_updateFlag["Current"] == aftt_updateFlag["Previous"] and aftt_updateFlag["Previous"] ~= "none") then
				--do not reset flags, we're on the same unit
			else
				aftt_updateFlag = {
					["EasterEgg"] = 0;
					["Guild"] = 0;
					["PvP"] = 0;
					["RankFlag"] = 0;
				}
			end

		--[[
		--detect Blizzard's tooltip bug that shows bogus data instead of a unit
		--currently disabled due to issues with non enUS client
			local firstLine = GameTooltipTextLeft1:GetText();
			local nameLine, matched;
			if (firstLine) then
				nameLine, matched = string.gsub(GameTooltipTextLeft1:GetText(), (UnitName(unit) .. ".*"), "");
				if (matched == 1) then
					--not bugged
				else
					--bugged, lets hide it
					GameTooltip:Hide();
					--DEFAULT_CHAT_FRAME:AddMessage("Found item bug: " .. firstLine);				
				end
			end
		--]]

		--unit race
			if (UnitRace(unit) and UnitIsPlayer(unit)) then
				--race, it is a player
					aftt_text_race = UnitRace(unit);
			elseif (UnitPlayerControlled(unit)) then
				--creature family, its is a pet
					aftt_text_race = UnitCreatureFamily(unit);
					aftt_color_race = aftt_color_race_mob;
			else
				--creature type, it is a mob
					if (UnitCreatureType(unit) == aftt_translate_notspecified) then
						aftt_text_race = ""
						aftt_color_race = aftt_color_race_mob;
					else
						aftt_text_race = UnitCreatureType(unit);
						aftt_color_race = aftt_color_race_mob;
					end
			end
			if (aftt_text_race == nil) then
				aftt_text_race = ("");
			else
				aftt_text_race = (aftt_text_race .. " ");
			end
				aftt_color_race = "FFFFFF";

		--unit class
			if (UnitClass(unit) and UnitIsPlayer(unit)) then
				aftt_text_class = (UnitClass(unit) .. " ");
				if (UnitClass(unit) == aftt_translate_mage) then
					aftt_color_class = aftt_color_class_mage;
				elseif (UnitClass(unit) == aftt_translate_warlock) then
					aftt_color_class = aftt_color_class_warlock;
				elseif (UnitClass(unit) == aftt_translate_priest) then
					aftt_color_class = aftt_color_class_priest;
				elseif (UnitClass(unit) == aftt_translate_druid) then
					aftt_color_class = aftt_color_class_druid;
				elseif (UnitClass(unit) == aftt_translate_shaman) then
					aftt_color_class = aftt_color_class_shaman;
				elseif (UnitClass(unit) == aftt_translate_paladin) then
					aftt_color_class = aftt_color_class_paladin;
				elseif (UnitClass(unit) == aftt_translate_rogue) then
					aftt_color_class = aftt_color_class_rogue;
				elseif (UnitClass(unit) == aftt_translate_hunter) then
					aftt_color_class = aftt_color_class_hunter;
				elseif (UnitClass(unit) == aftt_translate_warrior) then
					aftt_color_class = aftt_color_class_warrior;
				else
					aftt_color_class = aftt_color_unknown;
				end
			else
				aftt_text_class = "";
				aftt_color_class = aftt_color_unknown;
			end

		--unit elite
			if (UnitClassification(unit) and UnitClassification(unit) ~= "normal" and UnitHealth(unit) > 0) then
				if (UnitClassification(unit) == "elite") then
					aftt_text_elite = ("(" .. aftt_translate_elite .. ")");
					aftt_color_elite = aftt_color_elite_elite;
				elseif (UnitClassification(unit) == "worldboss") then
					aftt_text_elite = ("(" .. aftt_translate_worldboss .. ")");
					aftt_color_elite = aftt_color_elite_worldboss;
				elseif (UnitClassification(unit) == "rare") then
					aftt_text_elite = ("(" .. aftt_translate_rare .. ")");
					aftt_color_elite = aftt_color_elite_rare;
				elseif (UnitClassification(unit) == "rareelite") then
					aftt_text_elite = ("(" .. aftt_translate_rareelite .. ")");
					aftt_color_elite = aftt_color_elite_rareelite;
				else
					aftt_text_elite = ("(" .. UnitClassification(unit) .. ")");
					aftt_color_elite = aftt_color_unknown;
				end
			else
				aftt_text_elite = "";
				aftt_color_elite = aftt_color_unknown;
			end

		--unit name, description and bg color
			if (UnitPlayerControlled(unit)) then
				if (UnitCanAttack(unit, "player") and UnitCanAttack ("player",unit)) then
					--red, hostile, both can attack
						GameTooltip:SetBackdropColor(aftt_background_color["Player_Hostile"]["red"], aftt_background_color["Player_Hostile"]["green"], aftt_background_color["Player_Hostile"]["blue"]);
						aftt_color_name = aftt_color_name_hostile;
						aftt_color_description = aftt_color_description_hostile;
						aftt_text_reaction = aftt_translate_hostile;
				elseif (not UnitCanAttack(unit, "player") and UnitCanAttack("player",unit)) then
					--yellow, neutral, only I can attack
						GameTooltip:SetBackdropColor(aftt_background_color["Player_Neutral"]["red"], aftt_background_color["Player_Neutral"]["green"], aftt_background_color["Player_Neutral"]["blue"]);
						aftt_color_name = aftt_color_name_neutral;
						aftt_color_description = aftt_color_description_neutral;
						aftt_text_reaction = aftt_translate_neutral;
				elseif (UnitCanAttack(unit, "player") and not UnitCanAttack("player",unit)) then
					--purple, caution, only they can attack
						GameTooltip:SetBackdropColor(aftt_background_color["Player_Caution"]["red"], aftt_background_color["Player_Caution"]["green"], aftt_background_color["Player_Caution"]["blue"]);
						aftt_color_name = aftt_color_name_caution;
						aftt_color_description = aftt_color_description_caution;
						aftt_text_reaction = aftt_translate_caution;
				elseif (not UnitCanAttack(unit, "player") and not UnitCanAttack("player",unit)) then
					if (UnitIsPVP(unit)) then
						--green, friendly pvp, neither can attack
							GameTooltip:SetBackdropColor(aftt_background_color["Player_Friendly_PvP"]["red"], aftt_background_color["Player_Friendly_PvP"]["green"], aftt_background_color["Player_Friendly_PvP"]["blue"]);
							aftt_color_name = aftt_color_name_pvp;
							aftt_color_description = aftt_color_description_pvp;
							aftt_text_reaction = aftt_translate_friendly;
					else
						--blue, friendly, neither can attack
							GameTooltip:SetBackdropColor(aftt_background_color["Player_Friendly"]["red"], aftt_background_color["Player_Friendly"]["green"], aftt_background_color["Player_Friendly"]["blue"]);
							aftt_color_name = aftt_color_name_friendly;
							aftt_color_description = aftt_color_description_friendly;
							aftt_text_reaction = aftt_translate_friendly;
					end
				end
			elseif (UnitReaction(unit,"player") and UnitReaction(unit,"player") <= 3) then
				--red, they are hostile
					GameTooltip:SetBackdropColor(aftt_background_color["Mob_Hostile"]["red"], aftt_background_color["Mob_Hostile"]["green"], aftt_background_color["Mob_Hostile"]["blue"]);
					aftt_color_name = aftt_color_name_hostile;
					aftt_text_reaction = aftt_translate_hostile;
					aftt_color_description = aftt_color_description_hostile
			elseif (UnitReaction(unit,"player") and UnitReaction(unit,"player") == 4) then
				--yellow, they are neutral
					GameTooltip:SetBackdropColor(aftt_background_color["Mob_Neutral"]["red"], aftt_background_color["Mob_Neutral"]["green"], aftt_background_color["Mob_Neutral"]["blue"]);
					aftt_color_name = aftt_color_name_neutral;
					aftt_text_reaction = aftt_translate_neutral;
					aftt_color_description = aftt_color_description_neutral
			else
				if (UnitIsPVP(unit)) then
					--green, pvp enabled friend
						GameTooltip:SetBackdropColor(aftt_background_color["Mob_Friendly_PvP"]["red"], aftt_background_color["Mob_Friendly_PvP"]["green"], aftt_background_color["Mob_Friendly_PvP"]["blue"]);
						aftt_color_name = aftt_color_name_pvp;
						aftt_color_description = aftt_color_description_pvp
				else
					--blue, they are friendly
						GameTooltip:SetBackdropColor(aftt_background_color["Mob_Friendly"]["red"], aftt_background_color["Mob_Friendly"]["green"], aftt_background_color["Mob_Friendly"]["blue"]);
						aftt_color_name = aftt_color_name_friendly;
						aftt_color_description = aftt_color_description_friendly;
				end
				aftt_text_reaction = aftt_translate_friendly;
			end
		--unit tapped?
			if (AF_ToolTip[aftt_localUser]["Tapped"] == 1) then
				if (UnitIsTapped(unit)and (not UnitIsTappedByPlayer(unit))) then
					aftt_color_name = aftt_color_name_tapped_by_other;
					aftt_color_description = aftt_color_description_tapped_by_other;
					aftt_text_reaction = aftt_translate_tapped;
				elseif (UnitIsTappedByPlayer(unit)) then
					GameTooltip:SetBackdropColor(aftt_background_color["Mob_Hostile"]["red"], aftt_background_color["Mob_Hostile"]["green"], aftt_background_color["Mob_Hostile"]["blue"]);
					aftt_color_name = aftt_color_name_tapped_by_me;
					aftt_color_description = aftt_color_description_tapped_by_me;
					aftt_text_reaction = aftt_translate_hostile;
				end
			end

		--unit level and level difference color
			if (UnitLevel(unit) and UnitLevel(unit) >= 1) then
				aftt_text_level = UnitLevel(unit);
			else
				aftt_text_level = "??";
			end
			aftt_text_level = (aftt_translate_level .. " " .. aftt_text_level .. " ");
			local levelDiff = UnitLevel(unit) - UnitLevel("player");
			if (UnitFactionGroup(unit) ~= UnitFactionGroup("player")) then
				if ( levelDiff >= 5 or UnitLevel(unit) == -1) then
					aftt_color_level = aftt_color_level_impossible
				elseif ( levelDiff >= 3 ) then
					aftt_color_level = aftt_color_level_hard;
				elseif ( levelDiff >= -2 ) then
					aftt_color_level = aftt_color_level_normal;
				elseif ( -levelDiff <= GetQuestGreenRange() ) then
					aftt_color_level = aftt_color_level_easy;
				else
					aftt_color_level = aftt_color_level_trivial;
				end
			else
					aftt_color_level = aftt_color_level_same_faction;			
			end

		--pvp honor rank
			if (aftt_updateFlag["RankFlag"] == 0) then
				if (UnitPVPRank(unit)) then
				    aftt_rankName, aftt_rankNumber = GetPVPRankInfo(UnitPVPRank("mouseover"), "mouseover");
				end
				if (aftt_rankName == nil) then
				    aftt_rankName = "";			
				else
					aftt_rankName = ("[" .. aftt_rankName .. "] ");
				end
				if (aftt_rankNumber == nil or aftt_rankNumber < 1) then
				    aftt_rankNumber = "";
				else
					aftt_rankNumber = ("[" .. aftt_rankNumber .. "] ");				
				end

				if (AF_ToolTip[aftt_localUser]["Rank"] == 1) then
					aftt_rank = aftt_rankName;
				elseif (AF_ToolTip[aftt_localUser]["Rank"] == 2) then
					aftt_rank = aftt_rankNumber;
				else
					aftt_rank = "";
				end

				aftt_updateFlag["RankFlag"] = 1;
			else
				if (aftt_rank == nil) then
					aftt_rank = "";
				end
			end

		--unit is corpse
			if (UnitHealth(unit) == 0) then
				aftt_text_corpse = aftt_translate_corpse;
				aftt_color_class = aftt_color_corpse;
				aftt_color_race = aftt_color_corpse;
				aftt_color_elite = aftt_color_corpse;
				aftt_color_name = aftt_color_corpse;
				aftt_color_description = aftt_color_corpse;
				aftt_color_level = aftt_color_corpse;
			else
				aftt_text_corpse = "";
			end

	--Output Name Data-----------------------------------------
	-----------------------------------------------------------
		if (AF_ToolTip[aftt_localUser]["ReactionText"] == 1) then
			GameTooltipTextLeft1:SetText("|cff" .. aftt_color_name .. aftt_rank .. UnitName(unit) .. " (" .. aftt_text_reaction .. ")|r")
		else
			GameTooltipTextLeft1:SetText("|cff" .. aftt_color_name .. aftt_rank .. UnitName(unit) .. "|r");
		end

	--Output Level Line Data-----------------------------------
	-----------------------------------------------------------
		local levelLine, matched;
		if (GameTooltipTextLeft2:GetText() == nil) then
			GameTooltip:Hide();
		else
			levelLine, matched = string.gsub(GameTooltipTextLeft2:GetText(), (aftt_translate_level .. ".*"), "");
			if (matched == 1) then
				levelLine = 2;
			else
				if (GameTooltipTextLeft3:GetText()) then
					levelLine, matched = string.gsub(GameTooltipTextLeft3:GetText(), (aftt_translate_level .. ".*"), "");
					if (matched == 1) then
						levelLine = 3;
					else
						levelLine = nil;
					end
				else
					levelLine = nil;
				end
			end
		end
		if (levelLine) then
			getglobal("GameTooltipTextLeft" .. levelLine):SetText("|cff" .. aftt_color_level .. aftt_text_level .. "|r" .. "|cff" .. aftt_color_race .. aftt_text_race .. "|r" .. "|cff" .. aftt_color_class .. aftt_text_class .. "|r" .. "|cff" .. aftt_color_elite .. aftt_text_elite .. "|r" .. "|cff" .. aftt_color_corpse .. aftt_text_corpse .. "|r");
			if (levelLine == 3) then
				GameTooltipTextLeft2:SetText("|cff" .. aftt_color_description .. GameTooltipTextLeft2:GetText() .. "|r")
			end
		end

	--Append Easter Eggs---------------------------------------
	-----------------------------------------------------------
		if (aftt_updateFlag["EasterEgg"] == 0 and UnitName(unit) == "Iniko" and (GetCVar("realmName") == "Chromaggus")) then
			GameTooltip:AddLine("|cff" .. aftt_color_name .. "The Author of AF_ToolTip|r");
			aftt_updateFlag["EasterEgg"] = 1;
		end

	--Show/Hide Guild------------------------------------------
	-----------------------------------------------------------
		if (aftt_updateFlag["Guild"] == 0 and GetGuildInfo(unit)) then
			--Are they guildmates?
			if (GetGuildInfo(unit) == GetGuildInfo("player")) then
				aftt_color_guild = aftt_color_guildmate;
			else
				aftt_color_guild = aftt_color_description;
			end
			if (AF_ToolTip[aftt_localUser]["Guild"] == 0 or AF_ToolTip[aftt_localUser]["Guild"] == nil) then
				--do nothing
			elseif (AF_ToolTip[aftt_localUser]["Guild"] == 1) then
				--Show
				aftt_old_line2 = GameTooltipTextLeft2:GetText();
				aftt_old_line3 = GameTooltipTextLeft3:GetText();
				if (GameTooltipTextLeft3:GetText() ~= nil) then
					GameTooltipTextLeft3:SetText(aftt_old_line2);
				else
					GameTooltip:AddLine(aftt_old_line2);
				end
				if (GameTooltipTextLeft4:GetText() ~= nil) then
					GameTooltipTextLeft3:SetText(aftt_old_line3);
				else
					GameTooltip:AddLine(aftt_old_line3);
				end
				GameTooltipTextLeft2:SetText("|cff" .. aftt_color_guild .. GetGuildInfo(unit) .. "|r");
			elseif (AF_ToolTip[aftt_localUser]["Guild"] == 2) then
				--Show at Bottom
				GameTooltip:AddLine("|cff" .. aftt_color_guild .. GetGuildInfo(unit) .. "|r");
			end
			aftt_updateFlag["Guild"] = 1;
		end

	--Show/Hide PvP--------------------------------------------
	-----------------------------------------------------------
		aftt_lineCount = 1;
		for i = 1, 10 do
			aftt_getLine = getglobal("GameTooltipTextLeft" .. aftt_lineCount);
			if (aftt_getLine:GetText()) then
				local pvpLine, matchPVP;
				pvpLine, matchPVP = string.gsub(aftt_getLine:GetText(), (aftt_translate_pvp .. ".*"), "");
				if (matchPVP == 1) then
					aftt_getLine:SetText("");
					break;
				else
					aftt_lineCount = aftt_lineCount + 1;
				end
			end
		end
		if (AF_ToolTip[aftt_localUser]["PvP"] ~= 1) then

		else
			if (UnitIsPVP(unit)) then
				if (aftt_updateFlag["PvP"] == 0) then
					GameTooltip:AddLine("|cffFFFFFFPvP|r");
					aftt_updateFlag["PvP"] = 1;
				end
			end
		end

	--Show Tooltip---------------------------------------------
	-----------------------------------------------------------
		GameTooltip:Show();
		aftt_updateFlag["Previous"] = UnitName(unit);
end



--Frame Mouseover Routines--------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
