--[[

	TipBuddy: ---------
		copyright 2005 by Chester

]]


function TipBuddy_OnLoad()

	this:RegisterEvent("VARIABLES_LOADED");
	this:RegisterEvent("PLAYER_LOGIN");

	this:RegisterEvent("UPDATE_MOUSEOVER_UNIT");
	this:RegisterEvent("UNIT_LEVEL");
	this:RegisterEvent("UNIT_FACTION");
	this:RegisterEvent("UNIT_DYNAMIC_FLAGS");
	this:RegisterEvent("UNIT_CLASSIFICATION_CHANGED");
	this:RegisterEvent("PLAYER_PVPLEVEL_CHANGED");
	this:RegisterEvent("UNIT_AURA");
	this:RegisterEvent("PLAYER_FLAGS_CHANGED");
	this:RegisterEvent("UNIT_HEALTH");
	this:RegisterEvent("UNIT_MAXHEALTH");
	this:RegisterEvent("UNIT_MANA");
	this:RegisterEvent("UNIT_RAGE");
	this:RegisterEvent("UNIT_FOCUS");
	this:RegisterEvent("UNIT_ENERGY");
	this:RegisterEvent("UNIT_HAPPINESS");
	this:RegisterEvent("UNIT_MAXMANA");
	this:RegisterEvent("UNIT_MAXRAGE");
	this:RegisterEvent("UNIT_MAXFOCUS");
	this:RegisterEvent("UNIT_MAXENERGY");
	this:RegisterEvent("UNIT_MAXHAPPINESS");
	this:RegisterEvent("UNIT_DISPLAYPOWER");
	this:RegisterEvent("UNIT_PVP_UPDATE");
	this:RegisterEvent("UPDATE_SHAPESHIFT_FORMS");

	SLASH_TIPBUDDY1 = "/tipbuddy";
	SLASH_TIPBUDDY2 = "/tbuddy";
	SLASH_TIPBUDDY3 = "/tip";
	SlashCmdList["TIPBUDDY"] = function(msg)
		TipBuddy_SlashCommand(msg);
	end
	
	-- commented out cause it fucked up my buttons
	-- Add TipBuddy_OptionsFrame to the UIPanelWindows list
	--UIPanelWindows['TipBuddy_OptionsFrame'] = {area = 'center', pushable = 0};
end

local lGameTooltip_OnEvent_Orig;
local lGameTooltip_OnShow_Orig;
local lGameTooltip_FadeOut_Orig;
function TipBuddy_OnEvent()
	if( event == "VARIABLES_LOADED" ) then
		--TB_AddMessage(TB_WHT_TXT.."VARIABLES_LOADED");
		TipBuddy_Variable_Initialize();
		TB_GameTooltip_IniHooks();

		TipBuddy.uiscale = TipBuddy_GetUIScale();
		
		--hooking GameTooltip's OnEvent
		lGameTooltip_OnEvent_Orig = GameTooltip:GetScript("OnEvent");
		GameTooltip:SetScript( "OnEvent", TipBuddy_GameTooltip_OnEvent );

		--hooking GameTooltip's OnShow
		lGameTooltip_OnShow_Orig = GameTooltip:GetScript("OnShow");
		GameTooltip:SetScript( "OnShow", TipBuddy_GameTooltip_OnShow );

		if (TipBuddy_SavedVars["general"].framepos_L or TipBuddy_SavedVars["general"].framepos_T) then
			TipBuddy_Header_Frame:SetPoint("TOPLEFT", "UIParent", "BOTTOMLEFT", TipBuddy_SavedVars["general"].framepos_L, TipBuddy_SavedVars["general"].framepos_T);
		end
		if (not TipBuddy_SavedVars["general"].delaytime) then
			TipBuddy_SavedVars["general"].delaytime = "0.5";
		end
		if (not TipBuddy_SavedVars["general"].fadetime) then
			TipBuddy_SavedVars["general"].fadetime = "0.3";
		end
		if (not TipBuddy_SavedVars["general"].gtt_anchored) then
			TipBuddy_SavedVars["general"].gtt_anchored = 0;	
		end

		if (TipBuddy_SavedVars["general"].anchored == 1) then
			if (not TipBuddy_SavedVars["general"].anchor_vis_first or TipBuddy_SavedVars["general"].anchor_vis == 1) then
				TipBuddy_SavedVars["general"].anchor_vis_first = 1;
				TipBuddy_Header_Frame:Show();
			else
				TipBuddy_Header_Frame:Show();
				TipBuddy_Header_Frame:Hide();
			end
			TipBuddy.anchor, TipBuddy.fanchor, TipBuddy.offset = TipBuddy_GetFrameAnchorPos();
			this:SetPoint(TipBuddy.anchor, "TipBuddy_Header_Frame", TipBuddy.fanchor, 0, 1);
		else
			if (not TipBuddy_SavedVars["general"].anchor_vis_first) then
				TipBuddy_ResetAnchorPos();
				TipBuddy_Header_Frame:Hide();
			else
				TipBuddy_Header_Frame:Show();
				TipBuddy_Header_Frame:Hide();
			end
		end

		if( DEFAULT_CHAT_FRAME ) then
			DEFAULT_CHAT_FRAME:AddMessage("|cffffd200TipBuddy |cffffff00v"..TIPBUDDY_VERSION.." loaded.");
		end

		TipBuddy_InitializeTextColors();

	elseif( event == "PLAYER_LOGIN" ) then	
		-- Add TipBuddy to myAddOns addons list
		if (myAddOnsFrame) then	
			myAddOnsList.TipBuddy = {
					name = "|cff20ff20TipBuddy", 
					description = "Enhanced, configurable unit tooltip.", 
					version = "|cffffff00"..TIPBUDDY_VERSION,
					author = "chester",
					email = "chester.dent@gmail.com",
					category = MYADDONS_CATEGORY_OTHERS, 
					frame = "TipBuddy_OptionsFrame",
					optionsframe = "TipBuddy_OptionsFrame"
					};
		end

		TipBuddy.xpoint, TipBuddy.xpos, TipBuddy.ypos = TipBuddy_GetFrameCursorOffset();
		TipBuddy.anchor, TipBuddy.fanchor, TipBuddy.offset = TipBuddy_GetFrameAnchorPos();
		GameTooltip:SetOwner(UIParent, "ANCHOR_RIGHT"); 
		GameTooltip:SetPoint("BOTTOM", "TipBuddy_Parent_Frame", "CENTER", 0, 0);
		GameTooltip:SetText(" ");
		GameTooltip:SetBackdrop({bgFile="Interface\\AddOns\\TipBuddy\\gfx\\UI-Tooltip-Background",edgeFile="Interface\\Tooltips\\UI-Tooltip-Border",tile=true,tileSize=32,edgeSize=16,insets={ left = 4, right = 4, top = 4, bottom = 4 }});
		GameTooltip:Hide();
		TipBuddyTooltip:SetOwner(UIParent, "ANCHOR_RIGHT"); 
		TipBuddyTooltip:SetPoint("BOTTOM", "TipBuddy_Parent_Frame", "CENTER", 0, 0);
		TipBuddyTooltip:SetText("  ");
		TipBuddyTooltip:SetBackdrop({bgFile="Interface\\AddOns\\TipBuddy\\gfx\\UI-Tooltip-Background",edgeFile="Interface\\Tooltips\\UI-Tooltip-Border",tile=true,tileSize=32,edgeSize=16,insets={ left = 4, right = 4, top = 4, bottom = 4 }});
		TipBuddyTooltip:Hide();
		--TB_AddMessage("loading:  ("..TipBuddyTooltip:GetTop()..")");
		TipBuddy_Main_Frame:SetBackdrop({bgFile="Interface\\AddOns\\TipBuddy\\gfx\\UI-Tooltip-Background",edgeFile="Interface\\Tooltips\\UI-Tooltip-Border",tile=true,tileSize=32,edgeSize=8,insets={ left = 2, right = 2, top = 2, bottom = 2 }});

--/script TipBuddyTooltip:SetOwner(TipBuddy_Parent_Frame); TipBuddyTooltip:SetPoint("BOTTOM", "TipBuddy_Parent_Frame", "CENTER", 0, 0); TipBuddyTooltip:SetText("player");
--/script TipBuddyTooltip:SetOwner(TipBuddy_Parent_Frame); TipBuddyTooltip:SetPoint("BOTTOM", "TipBuddy_Parent_Frame"); TipBuddyTooltip:SetText("player");

--/script TipBuddyTooltip:SetPoint("BOTTOM", "TipBuddy_Parent_Frame", "CENTER", 0, 0);	
	
	elseif (event == "UPDATE_MOUSEOVER_UNIT" or 
		event == "UNIT_LEVEL" or
		event == "UNIT_FACTION" or
		event == "PLAYER_PVPLEVEL_CHANGED" or
		event == "UNIT_DYNAMIC_FLAGS" or
		event == "UNIT_MAXHEALTH") then
		if (UnitExists("mouseover")) then
			--TB_AddMessage(TB_WHT_TXT.."UPDATE_MOUSEOVER_UNIT");
			TipBuddy.hasTarget = 1;
			TipBuddy_ShowUnitTooltip();
		elseif (TipBuddy.targetUnit and TipBuddy.targetUnit == arg1) then
			TipBuddy.hasTarget = 1;
			TipBuddy_ShowUnitTooltip();
		end
	
	--this fires after mouseover_unit when buffs change
	elseif ( event == "UNIT_AURA" and (arg1 == "mouseover" or string.find(arg1, "party"))) then
		if ((arg1 == "mouseover") or (TipBuddy.targetUnit and TipBuddy.targetUnit == arg1)) then
			----TB_AddMessage(TB_WHT_TXT.."UNIT_AURA");
			TipBuddy_TargetBuffs_Update( TipBuddy.targetType, arg1 );	
		end
	elseif ( event == "UNIT_HEALTH" ) then
		if ((arg1 == "mouseover") or (TipBuddy.targetUnit and TipBuddy.targetUnit == arg1)) then
			----TB_AddMessage(TB_WHT_TXT.."UNIT_HEALTH or UNIT_MAXHEALTH");
			if (UnitHealth(arg1) <= 0) then
				TipBuddy_ShowUnitTooltip();
				return;
			end
			
			if (TipBuddy.compactvis) then
				TipBuddy_UpdateHealthText( TipBuddy_HealthText, TipBuddy.targetType, arg1 );
				TipBuddy_UpdateManaText( TipBuddy_ManaText, TipBuddy.targetType, arg1 );
				TipBuddy_TargetInfo_FindExtras( arg1 );
			else
				TipBuddyTooltipStatusBar:SetValue(UnitHealth(arg1));
				TipBuddy_UpdateHealthText( TipBuddy_HealthTextGTT, TipBuddy.targetType, arg1 );
				TipBuddy_UpdateManaText( TipBuddy_ManaTextGTT, TipBuddy.targetType, arg1 );
			end
		end
	elseif ( event == "UNIT_MANA" or event == "UNIT_RAGE" or event == "UNIT_FOCUS" or event == "UNIT_ENERGY" or event == "UNIT_HAPPINESS" or event == "UNIT_MAXMANA" or event == "UNIT_MAXRAGE" or event == "UNIT_MAXFOCUS" or event == "UNIT_MAXENERGY" or event == "UNIT_MAXHAPPINESS" or event == "UNIT_DISPLAYPOWER" or event == "UPDATE_SHAPESHIFT_FORMS") then
		if ( arg1 == "mouseover" or UnitIsPlayer("mouseover")) then
			----TB_AddMessage("UNIT_MANA");
			if (not TipBuddy.targetType) then
				TipBuddy.targetType = TipBuddy_TargetInfo_GetTargetType( arg1 );	
			end
			if (not TipBuddy_SavedVars[TipBuddy.targetType]) then
				return;
			elseif ( TipBuddy_SavedVars[TipBuddy.targetType].off ~= 0 ) then
				------TB_AddMessage(TB_WHT_TXT.."UNIT_MANA - go");
				TipBuddy_SetFrame_Visibility( TipBuddy.targetType, arg1, 1 );
				TipBuddy_SetFrame_BackgroundColor( TipBuddy.targetType, arg1 );
			end
		end
	end
end

function TipBuddy_SlashCommand(msg)
	if( not msg or msg == "" ) then
		TipBuddy_ToggleOptionsFrame();
	end
	if( msg == "rankname" ) then
		if (TipBuddy_SavedVars["general"].rankname == 1) then
			TipBuddy_SavedVars["general"].rankname = 0;
			DEFAULT_CHAT_FRAME:AddMessage("|cff20ff20TipBuddy: No longer showing full rank title in name.");
		else
			TipBuddy_SavedVars["general"].rankname = 1;
			DEFAULT_CHAT_FRAME:AddMessage("|cff20ff20TipBuddy: Showing full rank titles in name.");
		end
	end
	if( msg == "resetanchor" ) then
		TipBuddy_ResetAnchorPos();
		DEFAULT_CHAT_FRAME:AddMessage("|cff20ff20TipBuddy: Resetting TipBuddyAnchor position.");
	end
	if( msg == "report" ) then
		TipBuddy_ReportVarStats();
	end
	if( msg == "blizdefault" ) then
		if (TipBuddy_SavedVars["general"].blizdefault == 1) then
			TipBuddy_SavedVars["general"].blizdefault = 0;
			DEFAULT_CHAT_FRAME:AddMessage("|cff20ff20TipBuddy: Default tooltips are now enhanced.");
		else
			TipBuddy_SavedVars["general"].blizdefault = 1;
			DEFAULT_CHAT_FRAME:AddMessage("|cff20ff20TipBuddy: Default tooltips are no longer enhanced.");
		end
	end
	if (string.find(msg, "extras") ~= nil) then
		local type = "";
		for type in string.gfind(msg, "extras%s(.+)") do
			type = TipBuddy_ToggleExtras(type);
			----TB_AddMessage(type);
		end
		if (not type) then
			DEFAULT_CHAT_FRAME:AddMessage("|cff20ff20TipBuddy: Please specify a target type (ex: /tip extras pc_friend)");
			return;
		end
		return;
	end
	if (string.find(msg, "scale") ~= nil) then
		--local i, s = string.find(msg, "%d+");
		for scale in string.gfind(msg, "scale%s(%d.*)") do
			TipBuddy.s = tonumber(scale);
		end
		if (TipBuddy.s) then
			if (TipBuddy.s > 2) then
				TipBuddy.s = 2;
			elseif (TipBuddy.s < 0.25) then
				TipBuddy.s = 0.25;
			end
			GameTooltip:SetScale(2);
			TipBuddyTooltip:SetScale(2);
			--GameTooltip:SetScale(UIParent:GetScale() * TipBuddy.s);
			TipBuddy_SetEffectiveScale(GameTooltip, TipBuddy.s, UIParent);
			TipBuddy_SetEffectiveScale(TipBuddyTooltip, TipBuddy.s, UIParent);
			--TipBuddy_SavedVars["general"].gtt_scale = (UIParent:GetScale() * TipBuddy.s);
			TipBuddy_SavedVars["general"].gtt_scale = TipBuddy.s;
		else
			DEFAULT_CHAT_FRAME:AddMessage("|cff20ff20TipBuddy: Please type a scale number after 'scale' (valid numbers: 0.25-2)");
		end
		return;
	end

end



function TipBuddy_ShowUnitTooltip(unit, refresh)
	if (not unit) then
		unit = "mouseover";	
	end
	if (not refresh) then
		TipBuddy.targetUnit = unit;
		TipBuddy.uName = UnitName(unit);
		TipBuddy.uLevel = UnitLevel(unit);
		TipBuddy.uClass = UnitClass(unit);
		TipBuddy.uRace = UnitRace(unit);
		TipBuddy.uGuild = GetGuildInfo(unit);
		TipBuddy.uReaction = TipBuddy_GetUnitReaction(unit);

		--TB_AddMessage("ShowUnitTooltip");
		TipBuddy.targetType = TipBuddy_TargetInfo_GetTargetType( unit );
	else
		--TB_AddMessage("ShowUnitTooltip -- refresh!");
	end
		
	TipBuddy_SetFrame_Visibility( TipBuddy.targetType, unit, refresh );
	TipBuddy_SetFrame_BackgroundColor( TipBuddy.targetType, unit );
	TipBuddy_ShowRank( TipBuddy.targetType, unit );
	TipBuddy_TargetBuffs_Update( TipBuddy.targetType, unit );
	
	--local text = getglobal("GameTooltipTextLeft1");
	--if (not text or not TipBuddy.uName or not string.find(text:GetText(), TipBuddy_FixMagicChars(TipBuddy.uName)) ) then
	--end
end

--------------------------------------------------------------------------------------------------------------------------------------
-- CHECK PET
--------------------------------------------------------------------------------------------------------------------------------------
--[[
UNITNAME_TITLE_CHARM = "%s's Minion"; -- %s is the name of the unit's charmer
UNITNAME_TITLE_CREATION = "%s's Creation";
UNITNAME_TITLE_GUARDIAN = "%s's Guardian";
UNITNAME_TITLE_MINION = "%s's Minion";
UNITNAME_TITLE_PET = "%s's Pet"; -- %s is the name of the unit's summoner
]]--
function TipBuddy_TargetInfo_CheckPet() 
	for i=1, (GameTooltip:NumLines()), 1 do
		local tipstring = getglobal("GameTooltipTextLeft"..i);
		if (not tipstring or not tipstring:GetText()) then
			return;
		end
		if ( string.find(tipstring:GetText(), TB_minion) ) then
			return 1;
		end
		if ( string.find(tipstring:GetText(), TB_creation) ) then
			return 1;
		end
		if ( string.find(tipstring:GetText(), TB_guardian) ) then
			return 1;
		end
		if ( string.find(tipstring:GetText(), TB_pet) ) then
			return 1;
		end
	end
	return;
end

--------------------------------------------------------------------------------------------------------------------------------------
-- GET TARGET TYPE
--------------------------------------------------------------------------------------------------------------------------------------
function TipBuddy_TargetInfo_GetTargetType( unit )
	if (not unit) then
		return;
	end
	if ( ( UnitHealth(unit) <= 0 ) ) then
		return ( "corpse" );
	elseif ( ( UnitHealthMax(unit) > 0 ) ) then
		if (string.find(unit, "party.+")) then
			return ( "pc_party" );	
		end
		if (UnitPlayerControlled(unit)) then
			if (UnitIsFriend(unit, "player")) then
				if ( UnitIsUnit(unit, "pet") or TipBuddy_TargetInfo_CheckPet() ) then
					TB_AddMessage("1 - pet_friend");
					return ( "pet_friend" );
				end
				
				if (UnitInParty(unit)) then
					TB_AddMessage("1 - pc_party");
					return ( "pc_party" );	
				else
					return ( "pc_friend" );
				end				
			elseif (UnitIsEnemy(unit, "player")) then
				if ( TipBuddy_TargetInfo_CheckPet() ) then
					return ( "pet_enemy" );
				else
					return ( "pc_enemy" );
				end
			else
				TB_AddMessage("2 - pet_friend");
				return ( "pet_friend" );
			end				
		else
			if (UnitIsFriend(unit, "player")) then
				if ( TipBuddy_TargetInfo_CheckPet() ) then
					return ( "pet_friend" );
				else
					return ( "npc_friend" );
				end
			elseif (UnitIsEnemy(unit, "player")) then
				if ( TipBuddy_TargetInfo_CheckPet() ) then
					return ( "pet_enemy" );
				else
					return ( "npc_enemy" );
				end
			else --neutral
				return ( "npc_neutral" );			
			end
		end	
	else
		TipBuddy_Hide( TipBuddy_Main_Frame );
		return;	
	end
end

--------------------------------------------------------------------------------------------------------------------------------------
-- GET EXTRAS
--------------------------------------------------------------------------------------------------------------------------------------

function TipBuddy_TargetInfo_FindExtras( unit )
	TipBuddy_GTT_GetExtraLines(20, unit);	
	TipBuddy_TargetInfo_ShowExtras();
end

function TipBuddy_TargetInfo_ShowExtras()
	----TB_AddMessage("SHOWING_EXTRAS");
	if (TipBuddy.gtt_xtra) then
		local lineL, LineR;
		for i=1, 20, 1 do
			getglobal("TipBuddy_Xtra"..i.."_Text"):Hide();	
			getglobal("TipBuddy_Xtra"..i.."_Text"):SetText("");	
			getglobal("TipBuddy_XtraR"..i.."_Text"):Hide();
			getglobal("TipBuddy_XtraR"..i.."_Text"):SetText("");
		end
		for i=1, table.getn(TipBuddy.gtt_xtra), 1 do
			lineL = getglobal("TipBuddy_Xtra"..i.."_Text");
			----TB_AddMessage(TEXT(TipBuddy.gtt_xtra[i]))
			if (TipBuddy.gtt_xtra[i.."color"]) then
				lineL:SetVertexColor(TipBuddy.gtt_xtra[i.."color"].r, TipBuddy.gtt_xtra[i.."color"].g, TipBuddy.gtt_xtra[i.."color"].b);
			else
				lineL:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
			end
			if (TipBuddy.gtt_xtraR[i.."color"]) then
				lineR:SetVertexColor(TipBuddy.gtt_xtraR[i.."color"].r, TipBuddy.gtt_xtraR[i.."color"].g, TipBuddy.gtt_xtraR[i.."color"].b);
			else
				lineR:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
			end
			if (TipBuddy.gtt_xtraR) then
				lineL:SetText(TEXT(TipBuddy.gtt_xtra[i]));
				lineL:Show();
				lineR = getglobal("TipBuddy_XtraR"..i.."_Text");
				------TB_AddMessage(TEXT(TipBuddy.gtt_xtraR[i]))
				lineR:SetText(TEXT(TipBuddy.gtt_xtraR[i]));
				lineR:Show();
			else
				lineL:SetText(TEXT(TipBuddy.gtt_xtra[i]));
				lineL:Show();	
			end
		end
	end
end

function TipBuddy_GTT_GetExtraLines( numlines, unit )
	TB_AddMessage("getting extra lines");
	if (not numlines) then
		return;	
	end	
	TipBuddy.gtt_xtra = {};
	TipBuddy.gtt_xtraR = {};
	if (not TipBuddy.gtt_lastline) then
		if (GameTooltip:IsVisible()) then
			TipBuddy.gtt_lastline = GameTooltip:NumLines();	
		else
			TipBuddy.gtt_lastline = 2;
		end
	end
		TB_AddMessage("!! lastline: "..TipBuddy.gtt_lastline..", numlines (stored): "..TipBuddy.gtt_numlines..", numlines (real): "..GameTooltip:NumLines());
	if (numlines > TipBuddy.gtt_lastline) then
		TB_AddMessage("numlines > TipBuddy.gtt_lastline");
		--/script GameTooltipTextLeft1:SetText(GameTooltipTextLeft1:GetText().."\nSecondLine");GameTooltip:Show();
		local line, text;
		local j = 1;
		for i=TipBuddy.gtt_lastline + 1, numlines, 1 do
			line = getglobal("GameTooltipTextLeft"..i);
			lineR = getglobal("GameTooltipTextRight"..i);
			if (not line or not line:GetText() or string.find(line:GetText(), PVP_ENABLED)) then
				return;
			else
				TipBuddy.gtt_xtra[j.."color"] = {};
				TipBuddy.gtt_xtra[j.."color"].r, TipBuddy.gtt_xtra[j.."color"].g, TipBuddy.gtt_xtra[j.."color"].b = line:GetTextColor();
				text = line:GetText();
			end
			--GREEN_FONT_COLOR_CODE..PVP_RANK_CIVILIAN..FONT_COLOR_CODE_CLOSE
			TipBuddy.gtt_xtra[j] = text;
			if (lineR:GetText() and lineR:IsShown()) then
				TipBuddy.gtt_xtraR[j.."color"] = {};
				TipBuddy.gtt_xtraR[j.."color"].r, TipBuddy.gtt_xtraR[j.."color"].g, TipBuddy.gtt_xtraR[j.."color"].b = lineR:GetTextColor();
				TipBuddy.gtt_xtraR[j] = lineR:GetText();
			else
				TipBuddy.gtt_xtraR[j] = "";
			end
			TB_AddMessage(line:GetText());
			j = j + 1;
			--/script ----TB_AddMessage(GameTooltipTextLeft2:GetText());
		end		
	else
		return;
	end
end

function TipBuddy_GTT_AddExtras()
	if (TipBuddy.gtt_xtra) then
		--TB_AddMessage(TB_WHT_TXT.."Adding Extras");
		for i=1, table.getn(TipBuddy.gtt_xtra), 1 do
			local lCr, lCg, lCb, rCr, rCg, rCb;
			if (TipBuddy.gtt_xtra[i.."color"]) then
				lCr, lCg, lCb = TipBuddy.gtt_xtra[i.."color"].r, TipBuddy.gtt_xtra[i.."color"].g, TipBuddy.gtt_xtra[i.."color"].b;
			else
				lCr, lCg, lCb = HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b;
			end
			if (TipBuddy.gtt_xtraR and TipBuddy.gtt_xtraR[i.."color"]) then
				rCr, rCg, rCb = TipBuddy.gtt_xtraR[i.."color"].r, TipBuddy.gtt_xtraR[i.."color"].g, TipBuddy.gtt_xtraR[i.."color"].b;
			else
				rCr, rCg, rCb = HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b;
			end

			if (TipBuddy.gtt_xtraR) then
				TipBuddyTooltip:AddDoubleLine(TipBuddy.gtt_xtra[i], TipBuddy.gtt_xtraR[i], lCr, lCg, lCb, rCr, rCg, rCb);
			else
				TipBuddyTooltip:AddLine(TipBuddy.gtt_xtra[i], lCr, lCg, lCb);
			end					
		end
	end
end

--------------------------------------------------------------------------------------------------------------------------------------
-- VISIBILITY
--------------------------------------------------------------------------------------------------------------------------------------
-- Target Types are:
-- pc_friend
-- pc_party
-- pc_enemy
-- npc_friend
-- npc_neutral
-- npc_enemy
-- pet_friend
-- pet_enemy

function TipBuddy_SetFrame_Visibility( type, unit, refresh )
	if (not type or not unit) then
		return;	
	end

	local targettype = TipBuddy_SavedVars[type];
	if (not targettype) then
		----TB_AddMessage("BUG! NO SAVED VARS FOR: "..type);
		TipBuddy_SetFrame_BackgroundColor( "corpse", unit );
		return;	
	end

	local targettype = TipBuddy_SavedVars[type];
	----TB_AddMessage("1: "..GameTooltipTextLeft2:GetText());
	if (TipBuddy_SavedVars["general"].blizdefault == 1) then

	elseif ( targettype.off == 1 ) then

		TipBuddy_ForceHide(TipBuddy_Main_Frame);
		if (not TipBuddy_Main_Frame:IsVisible()) then		
			TipBuddy_Main_Frame:Show();
			TipBuddy_Main_Frame:SetAlpha(1);
		end
		TipBuddy.compactvis = 1;
	else
		TipBuddy_ForceHide( TipBuddy_Main_Frame );
	end
	TipBuddy_SetFrame_TargetType( type, unit, refresh );
	TipBuddy.vis = 1;
	TipBuddy.gotextras = 1;
end

function TipBuddy_TargetInfo_CheckName( type, unit )

	TipBuddy.gtt_namecolor = "";
	local targettype = TipBuddy_SavedVars[type];
	if (targettype.off == 2) then
		return;
	end

	if (not type or not unit) then
		TipBuddy.gtt_namecolor = tbcolor_unknown;
		if (UnitName(unit)) then
			TipBuddy.gtt_name = UnitName(unit);
		else
			TipBuddy.gtt_name = TB_notspecified;	
		end
		return;	
	end

	if (UnitHealth(unit) <= 0) then
		TipBuddy.gtt_namecolor = tbcolor_corpse;	
	elseif (TipBuddy.uReaction) then
		TipBuddy.gtt_namecolor = getglobal("tbcolor_nam_"..TipBuddy.uReaction);
	elseif ( UnitIsTapped(unit) and not UnitIsTappedByPlayer(unit) ) then
		TipBuddy.gtt_namecolor = (tbcolor_nam_tappedother.." >");
	elseif (UnitIsTappedByPlayer(unit)) then
		TipBuddy.gtt_namecolor = (tbcolor_nam_tappedplayer);
	else
		TipBuddy.gtt_namecolor = tbcolor_unknown;
	end
	
	if (TipBuddy.refresh == 1 and TipBuddy.gtt_name ~= nil) then
		return;
	end

	if (TipBuddy.uName) then
		TipBuddy.gtt_name = TipBuddy.uName;
	else
		TipBuddy.gtt_name = TB_notspecified;	
	end
	if (UnitPlayerControlled(unit) and targettype.rnm == 1) then
		if (unit == "player" or unit == "mouseover" or unit == "target" ) then
			TipBuddy.gtt_name = UnitPVPName(unit);
		elseif (getglobal("GameTooltipTextLeft1"):GetText()) then
			TipBuddy.gtt_name = getglobal("GameTooltipTextLeft1"):GetText(); 
		end
	end
end

--------------------------------------------------------------------------------------------------------------------------------------
-- GET TARGET's TARGET
--------------------------------------------------------------------------------------------------------------------------------------

function TipBuddy_TargetInfo_TargetsTarget( type, unit )
	if (not TipBuddy.gtt_target) then
		TipBuddy.gtt_target = "";	
	end
	if (TipBuddy_SavedVars[type].trg == 0 and TipBuddy_SavedVars[type].off ~= 2) then
		------TB_AddMessage("TT for "..type.." is turned off");
		return;	
	end
	local tunit = unit.."target";
	local target = UnitName(tunit);
	if (target) then
		if (target == UNKNOWNOBJECT) then
			return;
		end
		local treaction = TipBuddy_GetUnitReaction( tunit );
		local tcolor = "";
		TipBuddy.tt = 1;
		if (target == UnitName("player")) then
			tcolor = TB_WHT_TXT;
			if (TipBuddy_SavedVars[type].trg_2l and TipBuddy_SavedVars[type].trg_2l == 1) then
				TipBuddy.gtt_target = "\n"..tcolor.." [YOU]";
			else
				TipBuddy.gtt_target = tcolor.." : [YOU]";
			end
			------TB_AddMessage("target = "..tcolor.." [YOU]");
			return;
		elseif (target == UnitInParty(tunit)) then
			if (TipBuddy_SavedVars[type].trg_pa == 0) then
				return;
			else
				tcolor = TB_PNK_TXT;
			end
		elseif (UnitHealth(tunit) <= 0) then
			tcolor = TB_DGY_TXT;	
		--elseif (treaction) then
		elseif ( UnitPlayerControlled(tunit) ) then
		--[[
TB_NML_TXT = "|cffffd200"
TB_WHT_TXT = "|cffffffff"
TB_GRY_TXT = "|cffC0C0C0"
TB_DGY_TXT = "|cff585858"
TB_RED_TXT = "|cffff2020"
TB_GRN_TXT = "|cff20ff20"
TB_YLW_TXT = "|cffffff00"
TB_BLE_TXT = "|cff3366ff"
TB_PNK_TXT = "|cffff00ff"
TB_DBL_TXT = "|cff3399ff"
TB_DGN_TXT = "|cff339900"
TB_DRD_TXT = "|cffcc0000"
]]
			if ( UnitCanAttack(tunit, "player") or UnitCanAttack("player", tunit) ) then
				if (TipBuddy_SavedVars[type].trg_en == 0) then
					return;
				else
					tcolor = TB_RED_TXT;
				end
				--return "hostile";
			else
				-- All other players are green
				if (TipBuddy_SavedVars[type].trg_pl == 0) then
					return;
				else
					tcolor = TB_GRN_TXT;	
					--return "friendly";
				end
			end
		elseif ( UnitIsEnemy(tunit, "player") ) then
			if (TipBuddy_SavedVars[type].trg_en == 0) then
				return;
			else
				tcolor = TB_RED_TXT;	
				--return "pvp";
			end
		else
			if (TipBuddy_SavedVars[type].trg_np == 0) then
				return;
			else
				tcolor = TB_BLE_TXT;
			end
		end
		--TipBuddy.gtt_target = tcolor.."  ["..TB_WHT_TXT..UnitName(unit.."target")..tcolor.."]";
		if (TipBuddy_SavedVars[type].trg_2l and TipBuddy_SavedVars[type].trg_2l == 1) then
			TipBuddy.gtt_target = "\n"..TB_WHT_TXT.." "..tcolor.."["..UnitName(unit.."target").."]";
		else
			TipBuddy.gtt_target = TB_WHT_TXT.." : "..tcolor.."["..UnitName(unit.."target").."]";
			------TB_AddMessage("target = "..tcolor.."["..UnitName(unit.."target").."]");
		end
	else
		TipBuddy.tt = 0;
	end
end

function TipBuddy_Adv_TargetsTarget( unit )
	local tunit = unit.."target";
	local target = UnitName(tunit);
	if (target) then
		local treaction = TipBuddy_GetUnitReaction( tunit );
		local tcolor = "";
		if (target == UnitName("player")) then
			return "YOU", TB_WHT_TXT;
		elseif (target == UnitInParty(tunit)) then
			return target, TB_PNK_TXT;
		elseif (UnitHealth(tunit) <= 0) then
			return target, TB_DGY_TXT;
		elseif ( UnitPlayerControlled(tunit) ) then
			if ( UnitCanAttack(tunit, "player") or UnitCanAttack("player", tunit) ) then
				--return "hostile";
				return target, TB_RED_TXT;
			else
				--return "friendly";
				return target, TB_GRN_TXT;
			end
		elseif ( UnitIsEnemy(tunit, "player") ) then
			--return "pvp";
			return target, TB_RED_TXT;
		else
			return target, TB_BLE_TXT;
		end
	else
		return "", "";
	end
end

--------------------------------------------------------------------------------------------------------------------------------------
-- GET GUILD
--------------------------------------------------------------------------------------------------------------------------------------
function TipBuddy_TargetInfo_GetGuild( type, unit )
	if (not unit or not type) then
		return;	
	end
	if (TipBuddy.refresh == 1) then
		------TB_AddMessage("REFRESH == 1");
		if (TipBuddy.gtt_guild == "" or TipBuddy.gtt_guild == nil) then
			return;	
		end
	end

	--/script GameTooltip_SetDefaultAnchor(GameTooltip, UIParent);GameTooltip:SetUnit("partypet1"); ----TB_AddMessage(GameTooltipTextLeft2:GetText());
	local targettype = TipBuddy_SavedVars[type];
	TipBuddy.gtt_guildcolor = "";
	if (targettype.off ~= 2) then
		if (TipBuddy.uGuild and GetGuildInfo("player") and TipBuddy.uGuild == GetGuildInfo("player")) then
			TipBuddy.gtt_guildcolor = tbcolor_gld_mate;
		elseif ( UnitIsTapped(unit) and not UnitIsTappedByPlayer(unit) ) then
			TipBuddy.gtt_guildcolor = (tbcolor_gld_tappedother);
		elseif (UnitIsTappedByPlayer(unit)) then
			TipBuddy.gtt_guildcolor = (tbcolor_gld_tappedplayer);
		elseif (TipBuddy.uReaction) then
			TipBuddy.gtt_guildcolor = getglobal("tbcolor_gld_"..TipBuddy.uReaction);
		else
			TipBuddy.gtt_guildcolor = tbcolor_unknown;
		end
		if (TipBuddy.refresh == 1) then
			return;	
		end
	end

	if (unit == "party1" or unit == "partypet1" or unit == "party2" or unit == "partypet2" or unit == "party3" or unit == "partypet3" or unit == "party4" or unit == "partypet4" or unit == "party5" or unit == "partypet5" ) then
		if ( TipBuddy.uGuild ) then
			TipBuddy.gtt_guild = TipBuddy.uGuild;
			------TB_AddMessage(GetGuildInfo(unit));
		end
		if (not TipBuddy.gtt_guild) then
			TipBuddy.gtt_guild = "";	
		end
		return;
	elseif (UnitPlayerControlled(unit) or (GameTooltipTextLeft2:GetText() and string.find(GameTooltipTextLeft2:GetText(), PLAYER ) ) ) then
		if ( type == "pet_friend" or type == "pet_enemy" ) then
			TipBuddy.gtt_guild = (GameTooltipTextLeft2:GetText());
			------TB_AddMessage("player pet guild: "..TipBuddy.gtt_guild);
			return;
		elseif ( TipBuddy.uGuild ) then
			TipBuddy.gtt_guild = TipBuddy.uGuild;
			------TB_AddMessage("player guild: "..TipBuddy.gtt_guild);
		end
		return;
	else
		------TB_AddMessage("GUILD: npc, testing...");
		if (not GameTooltipTextLeft2:GetText()) then
			------TB_AddMessage("GUILD: npc, line 2 is blank");
			return;	
		end
		if ( type == "pet_friend" or type == "pet_enemy" ) then
			TipBuddy.gtt_guild = (GameTooltipTextLeft2:GetText());
			------TB_AddMessage("pet guild: "..TipBuddy.gtt_guild);
			return;
		end		
		if (string.find(GameTooltipTextLeft2:GetText(), TB_level ) ) then
			------TB_AddMessage("GUILD: npc, line 2 is level");
			return;
		else
			TipBuddy.gtt_guild = (GameTooltipTextLeft2:GetText());
			----TB_AddMessage("title guild: "..TipBuddy.gtt_guild);
		end
	end

end

--------------------------------------------------------------------------------------------------------------------------------------
-- GET CLASS/TYPE
--------------------------------------------------------------------------------------------------------------------------------------
function TipBuddy_TargetInfo_GetClass( type, unit )
	--TipBuddy.uClass
	local targettype = TipBuddy_SavedVars[type];
	TipBuddy.gtt_classlvlcolor = "";
	TipBuddy.gtt_classcorpse = "";
	TipBuddy.gtt_classcolor = "";
	TipBuddy.gtt_class = "";
	TipBuddy.gtt_race = "";
	if (targettype.off == 2) then
		return;
	elseif (TipBuddy_SavedVars["general"].classcolor == 1) then
		TipBuddy.gtt_classlvlcolor = "";
	elseif ( UnitCanAttack(unit, "player") or UnitCanAttack("player", unit) or UnitIsPVP(unit) ) then
		-- Hostile Units, use con color system
		TipBuddy.gtt_classlvlcolor = TipBuddy_GetDifficultyColor(TipBuddy.uLevel);
	else
		-- Friendly (non-PvP flagged) Units, we don't want to use the con color cause we don't care
		TipBuddy.gtt_classlvlcolor = tbcolor_lvl_same_faction;
	end
	if (UnitHealth(unit) <= 0) then
		TipBuddy.gtt_classlvlcolor = tbcolor_corpse;
		TipBuddy.gtt_classcorpse = " "..CORPSE.."|r";
	end

	if ( UnitPlayerControlled(unit) or TipBuddy.uRace) then
		if (targettype.rac == 1 and TipBuddy.uRace ~= nil) then
			TipBuddy.gtt_race = (tbcolor_race..TipBuddy.uRace.." |r");
		else
			TipBuddy.gtt_race = "|r";
		end

		--coloring class text
		if (UnitClass(unit) == TB_mage) then
			TipBuddy.gtt_classcolor = tbcolor_cls_mage;
		elseif (UnitClass(unit) == TB_warlock) then
			TipBuddy.gtt_classcolor = tbcolor_cls_warlock;
		elseif (UnitClass(unit) == TB_priest) then
			TipBuddy.gtt_classcolor = tbcolor_cls_priest;
		elseif (UnitClass(unit) == TB_druid) then
			TipBuddy.gtt_classcolor = tbcolor_cls_druid;
		elseif (UnitClass(unit) == TB_shaman) then
			TipBuddy.gtt_classcolor = tbcolor_cls_shaman;
		elseif (UnitClass(unit) == TB_paladin) then
			TipBuddy.gtt_classcolor = tbcolor_cls_paladin;
		elseif (UnitClass(unit) == TB_rogue) then
			TipBuddy.gtt_classcolor = tbcolor_cls_rogue;
		elseif (UnitClass(unit) == TB_hunter) then
			TipBuddy.gtt_classcolor = tbcolor_cls_hunter;
		elseif (UnitClass(unit) == TB_warrior) then
			TipBuddy.gtt_classcolor = tbcolor_cls_warrior;
		else
			TipBuddy.gtt_classcolor = tbcolor_cls_other;
		end
	else
		TipBuddy.gtt_classcolor = tbcolor_cls_other;
	end
	--/script ----TB_AddMessage(UnitCreatureFamily("mouseover"));
	if ( type == "pet_friend" or type == "pet_enemy" ) then
		TipBuddy.gtt_race = "";
		if (UnitCreatureFamily(unit)) then
			TipBuddy.gtt_class = UnitCreatureFamily(unit).."|r";
			return;
		else
			TipBuddy.gtt_class = "|r";
		end
		return;
	end

	------TB_AddMessage("Get Class - "..unit);
--	/script ----TB_AddMessage(UnitCreatureType(unit));
	if ( UnitPlayerControlled(unit) or TipBuddy.uRace) then
		TipBuddy.gtt_class = TipBuddy.uClass.."|r";
	elseif ( UnitCreatureFamily(unit) ) then
		TipBuddy.gtt_class = UnitCreatureFamily(unit).."|r";
	else
		if ( UnitCreatureType(unit) == TB_notspecified) then
			TipBuddy.gtt_class = TB_creature.."|r";
		else
			if (not UnitCreatureType(unit)) then
				TipBuddy.gtt_class = "|r";
			else
				TipBuddy.gtt_class = UnitCreatureType(unit).."|r";	
			end
		end
	end
end

--------------------------------------------------------------------------------------------------------------------------------------
-- GET LEVEL
--------------------------------------------------------------------------------------------------------------------------------------
function TipBuddy_TargetInfo_GetLevel( type, unit )
	local targettype = TipBuddy_SavedVars[type];
	if (not unit or targettype.off == 2) then
		return;	
	end

	local targetLevel = TipBuddy.uLevel;
	if ( targetLevel == -1 ) then
		targetLevel = 100;
	end

	-- Color level number
	local color;
	if (UnitHealth(unit) <= 0) then
		color = tbcolor_corpse;
		------TB_AddMessage("level color = corpse");
	elseif ( UnitCanAttack(unit, "player") or UnitCanAttack("player", unit) or UnitIsPVP(unit) ) then
		-- Hostile unit of friendly unit flagged for PvP
		color = TipBuddy_GetDifficultyColor(targetLevel);
		------TB_AddMessage("level color = hostile or pvp");
	else
		color = tbcolor_lvl_same_faction;
		------TB_AddMessage("level color = same fac");
	end
	
	if ( targetLevel == 100 ) then
		targetLevel = "??";
	end

	TipBuddy.classification = UnitClassification(unit);
	if ( not targetLevel or targetLevel == 0 ) then
		TipBuddy.gtt_level = ("|r");
		TipBuddy_TargetLevel_Text:SetText(TipBuddy.gtt_level);
	elseif ( TipBuddy.classification == "worldboss" ) then
		TipBuddy.gtt_level = (color..targetLevel..tbcolor_elite_worldboss.." ("..TB_worldboss..")|r");
		TipBuddy_TargetLevel_Text:SetText(TipBuddy.gtt_level);
	elseif ( TipBuddy.classification == "rareelite"  ) then
		TipBuddy.gtt_level = (color.."+"..targetLevel..tbcolor_elite_rare.." ("..TB_rare..")|r");
		TipBuddy_TargetLevel_Text:SetText(TipBuddy.gtt_level);
	elseif ( TipBuddy.classification == "elite"  ) then
		TipBuddy.gtt_level = (color.."+"..targetLevel.."|r");
		TipBuddy_TargetLevel_Text:SetText(TipBuddy.gtt_level);
	elseif ( TipBuddy.classification == "rare"  ) then
		TipBuddy.gtt_level = (color..targetLevel..tbcolor_elite_rare.." ("..TB_rare..")|r");
		TipBuddy_TargetLevel_Text:SetText(TipBuddy.gtt_level);
	else
		TipBuddy.gtt_level = (color..targetLevel.."|r");
		TipBuddy_TargetLevel_Text:SetText(TipBuddy.gtt_level);
	end
end

--------------------------------------------------------------------------------------------------------------------------------------
-- GET/SHOW CITY FACTION
--------------------------------------------------------------------------------------------------------------------------------------
function TipBuddy_TargetInfo_ShowCityFaction( type, unit )
	if (UnitPlayerControlled(unit) or unit == "player" or unit == "party1" or unit == "partypet1" or unit == "party2" or unit == "partypet2" or unit == "party3" or unit == "partypet3" or unit == "party4" or unit == "partypet4" or unit == "party5" or unit == "partypet5" ) then
		------TB_AddMessage("CityFac: found a player");
		return;
	end
	local line;
	for i=1, (GameTooltip:NumLines()), 1 do
		local tipline = getglobal("GameTooltipTextLeft"..i);
		if (not tipline or not tipline:GetText()) then
			------TB_AddMessage("tipline: "..i.." is empty");
			return;	
		end
		if ( string.find(tipline:GetText(), TB_level..".+") ) then
			line = getglobal("GameTooltipTextLeft"..(i + 1));
			if (line:GetText() == "\n" or line:GetText() == nil) then
				------TB_AddMessage("Line after Level is empty");
				break;
			end

			if (string.find(line:GetText(), PVP_ENABLED) or line:GetText() == nil) then
				------TB_AddMessage("CityFac: found PvP or something");
				break;
			else
				local first = string.sub(line:GetText(), 0 , 1);
				if (first and TB_Factions[first]) then
					------TB_AddMessage("testing cityfac: ("..line:GetText()..")  Line: "..(i+1));
					for j=1, table.getn(TB_Factions[first]), 1 do
						if (line:GetText() == TB_Factions[first][j]) then
							------TB_AddMessage("found cityfac: ("..line:GetText()..")  Line: "..(i+1));
							TipBuddy.gtt_lastline = i+1;
							TipBuddy.gtt_cityfac = tbcolor_cityfac..line:GetText();
							break;			
						end
					end
				end
			end				
		end	
	end
end

function TipBuddy_ConfirmLastLine(unit)
	local line;
	if (not unit) then
		unit = "mouseover";
		TipBuddy.targetUnit = unit;
	end
	if (not TipBuddy.gtt_numlines) then
		if (GameTooltip:IsVisible()) then
			TipBuddy.gtt_numlines = GameTooltip:NumLines();	
		else
			TipBuddy.gtt_numlines = 2;
		end
	end
	for i=TipBuddy.gtt_numlines, 1, -1 do
		line = getglobal("GameTooltipTextLeft"..i);
		if (not line or not line:GetText()) then
			return;	
		end
		----TB_AddMessage("LASTLINE: i = "..i..", text: "..line:GetText());
		if (string.find(line:GetText(), PVP_ENABLED) 
		or string.find(line:GetText(), TB_level ) 
		or (TipBuddy.gtt_cityfac ~= "" and string.find(line:GetText(), TipBuddy.gtt_cityfac ) ) ) then
			if (i > TipBuddy.gtt_lastline) then
				TipBuddy.gtt_lastline = i;
				------TB_AddMessage("i>LL: "..TipBuddy.gtt_lastline);
				break;
			else
				------TB_AddMessage("i!>LL: "..TipBuddy.gtt_lastline);
				break;
			end
		end
	end
end

--------------------------------------------------------------------------------------------------------------------------------------
-- HEALTH / MANA
--------------------------------------------------------------------------------------------------------------------------------------
function TipBuddy_UnitFrame_UpdateHealth( unit )
	UnitFrameHealthBar_Update(TipBuddy_TargetFrameHealthBar, unit);
end

function TipBuddy_UnitFrame_UpdateMana( unit )

	local manatype = UnitPowerType(unit);
	local info = ManaBarColor[manatype];

	info = ManaBarColor[manatype];
	TipBuddy_TargetFrameManaBar:SetStatusBarColor(info.r, info.g, info.b);	
	UnitFrameManaBar_Update(TipBuddy_TargetFrameManaBar, unit);
end

--------------------------------------------------------------------------------------------------------------------------------------
-- HEALTH TEXT
--------------------------------------------------------------------------------------------------------------------------------------
function TipBuddy_UpdateHealthText( frame, type, unit )
	if (not type) then
		if (frame) then
			frame:Hide();	
		end
		return;
	elseif (not frame) then
		return
	elseif (not TipBuddy_SavedVars[type] or not TipBuddy_SavedVars[type].txt_hth or TipBuddy_SavedVars[type].txt_hth == 0) then
		TipBuddy_SavedVars[type].txt_hth = 0;
		frame:Hide();
		return;	
	end
	--/script DEFAULT_CHAT_FRAME:AddMessage(UnitInParty("target"));
	--TipBuddy_HealthTextGTT, TipBuddy_UpdateHealthTextGTT( TipBuddy_HealthTextGTT, unit )
	--TipBuddy_HealthText
	local health = UnitHealth(unit);
	--local percent = tonumber(format("%.0f", ( (health / UnitHealthMax(unit)) * 100 ) ));
	local text = getglobal(frame:GetName().."Text");
	TB_AddMessage("health of:  "..unit);
	if ( unit == "player" or UnitInParty(unit) or UnitInRaid(unit) ) then
		text:SetText( health.." / "..UnitHealthMax(unit) );	
	elseif ( type == "pet_friend" and UnitName("mouseover") == UnitName("pet") ) then
		text:SetText( health.." / "..UnitHealthMax(unit) );
		--/script DEFAULT_CHAT_FRAME:AddMessage(UnitName("partypet1"));
	else
		if (MobHealthDB) then
			local ppp = MobHealth_PPP(UnitName(unit)..":"..UnitLevel(unit));
			local curHP = math.floor(health * ppp + 0.5);
			local maxHP = math.floor(100 * ppp + 0.5);

			if (curHP and maxHP and maxHP ~= 0) then
				text:SetText( curHP.." / "..maxHP );
				------TB_AddMessage(curHP.." / "..maxHP);
			else
				text:SetText( health.."%" );
			end
		else
			text:SetText( health.."%" );
		end
	end
	frame:Show();
end

function TipBuddy_UpdateManaText( frame, type, unit )
	if (not frame or not unit or TipBuddy_SavedVars[type].txt_mna == 0) then
		return;
	end
	frame:Hide();
	--local percent = (UnitMana(unit) / UnitManaMax(unit)) * 100;
	--local mana = UnitMana(unit);
	local text = getglobal(frame:GetName().."Text");
	if (UnitMana(unit) and UnitMana(unit) > 0) then
		frame:Show();
		text:SetText( UnitMana(unit).." / "..UnitManaMax(unit) );	
	end
end

--------------------------------------------------------------------------------------------------------------------------------------
-- GET/SHOW BUFFS
--------------------------------------------------------------------------------------------------------------------------------------
function TipBuddy_TargetBuffs_Initialize()
	local frame, bframe;
	for i=1, 8 do
		frame = "TipBuddy_BuffFrame";
		bframe = getglobal(frame.."B"..i);
		bframe:Hide();
		bframe = getglobal(frame.."D"..i);
		bframe:Hide();
		frame = "TipBuddy_BuffFrameGTT";
		bframe = getglobal(frame.."B"..i);
		bframe:Hide();
		bframe = getglobal(frame.."D"..i);
		bframe:Hide();
	end
end

function TipBuddy_TargetBuffs_Update( type, unit )
	if (not unit or not type) then
		TipBuddy_TargetBuffs_Initialize(type, unit);
		return;	
	end
	local debuff, buff;
	local frame, bframe;
	local targettype = TipBuddy_SavedVars[type];
	if ( TipBuddy_SavedVars["general"].blizdefault == 1 or targettype.off ~= 1 ) then
		frame = "TipBuddy_BuffFrameGTT";
	else
		frame = "TipBuddy_BuffFrame";
	end
	for i=1, 8 do
		buff = UnitBuff(unit, i);
		bframe = getglobal(frame.."B"..i);
		if ( buff ) then
			--/script ----TB_AddMessage(UnitCreatureFamily("mouseover"));
			----TB_AddMessage(buff);
			if ( targettype.bff == 1 ) then
				getglobal(frame.."B"..i.."Icon"):SetTexture(buff);
				bframe:Show();
				bframe.id = i;	
				--TB_AddMessage(buff);
			else
				bframe:Hide();	
			end
		else
			bframe:Hide();
		end
	end
	for i=1, 8 do
		debuff = UnitDebuff(unit, i);
		bframe = getglobal(frame.."D"..i);
		if ( debuff ) then
			if ( targettype.bff == 1 ) then
				getglobal(frame.."D"..i.."Icon"):SetTexture(debuff);
				bframe:Show();
			else
				bframe:Hide();
			end
		else
			bframe:Hide();
		end
		bframe.id = i;
	end
end


function TipBuddy_ShowRank( type, unit )
	------TB_AddMessage("TipBuddy_ShowRank");
	TipBuddy_RankFrameGTT:Hide();
	TipBuddy_RankFrame:Hide();

	if (not type or not unit or ( TipBuddy_SavedVars[type].rnk == 0 )) then
		------TB_AddMessage("no type or unit");
		return;				
	end

	local rankName, rankNumber = GetPVPRankInfo(UnitPVPRank(unit));
	local rankFrame, srankFrame;

	if ( TipBuddy_SavedVars[type].off == 1 ) then
		rankFrame = getglobal("TipBuddy_RankFrame");
		srankFrame = "TipBuddy_RankFrame";
	else
		rankFrame = getglobal("TipBuddy_RankFrameGTT");
		srankFrame = "TipBuddy_RankFrameGTT";		
	end
	local rankFrameIcon = getglobal(srankFrame.."Icon");
	
	-- /script DEFAULT_CHAT_FRAME:AddMessage(UnitPVPRank("target"));
	if (not UnitPlayerControlled(unit) or rankNumber == 0) then
		rankFrame:Hide();
		return;	
	end
	-- Set icon
	if ( rankNumber > 0 ) then
		rankFrameIcon:SetTexture(format("%s%02d","Interface\\PvPRankBadges\\PvPRank",rankNumber));
		rankFrame:Show();	
	else
		rankFrame:Hide();
	end
end

--------------------------------------------------------------------------------------------------------------------------------------
-- GET/SHOW FACTION
--------------------------------------------------------------------------------------------------------------------------------------
function TipBuddy_TargetInfo_ShowFaction( type, unit )
	TipBuddy_FactionFrameGTT:Hide();
	TipBuddy_FactionFrame:Hide();
	if (not unit) then
		return;
	end

	local factionGroup = UnitFactionGroup(unit);
	if (not factionGroup) then
		return;
	end

	local frame, sframe;
	if ( TipBuddy_SavedVars[TipBuddy.targetType].off == 1 ) then
		frame = getglobal("TipBuddy_FactionFrame");
		sframe = "TipBuddy_FactionFrame";
	else
		frame = getglobal("TipBuddy_FactionFrameGTT");
		sframe = "TipBuddy_FactionFrameGTT";		
	end
	local frameIcon = getglobal(sframe.."Icon");
	local frameText = getglobal(sframe.."Text");
	--how in the world does this happen?

	if ( UnitIsPVPFreeForAll(unit) ) then
		frameIcon:SetTexture("Interface\\TargetingFrame\\UI-PVP-FFA");
		frame:Show();
		if (TipBuddy_SavedVars[TipBuddy.targetType].txt_pvp == 1) then
			frameIcon:Hide();
			frameText:Show();
			frameText:SetText("FFA");
		else
			frameIcon:Show();
			frameText:Hide();			
		end
	elseif ( UnitIsPVP(unit) ) then
		------TB_AddMessage("txt_pvp = "..TipBuddy_SavedVars[TipBuddy.targetType].txt_pvp);
		frameIcon:SetTexture("Interface\\TargetingFrame\\UI-PVP-"..factionGroup);
		frame:Show();
		if (TipBuddy_SavedVars[TipBuddy.targetType].txt_pvp == 1) then
			frameIcon:Hide();
			frameText:Show();
			frameText:SetText("PvP");
		else
			frameIcon:Show();
			frameText:Hide();			
		end
	else
		frame:Hide();
	end
end

function TipBuddy_SetFrame_TargetType( type, unit, refresh )		

	if (TipBuddy_SavedVars.debug == 1 and TipBuddy.uName) then
		------TB_AddMessage(TipBuddy.uName.." == TT: "..GameTooltipTextLeft1:GetText());	
	end

	local targettype = TipBuddy_SavedVars[type];
	if (TipBuddy_SavedVars["general"].blizdefault ~= 1) then
		if (refresh) then
			------TB_AddMessage("!! lastline: "..TipBuddy.gtt_lastline..", numlines (stored): "..TipBuddy.gtt_numlines..", numlines (real): "..GameTooltip:NumLines());
			TipBuddy.refresh = 1;
			----TB_AddMessage("!! REFRESH");
		else
			----TB_AddMessage("!! CLEARING ALL DATA");
			TipBuddy.refresh = nil;
			TipBuddy.gtt_numlines = GameTooltip:NumLines();
			TipBuddy.gtt_lastline = 1;
			TipBuddy.gtt_xtra = nil;
			TipBuddy.gtt_name = "";
			TipBuddy.gtt_target = "";
			TipBuddy.gtt_guild = "";
			TipBuddy.gtt_level = "";
			TipBuddy.gtt_race = "";
			TipBuddy.gtt_class = "";
			TipBuddy.gtt_cityfac = "";
		end

		if (not TipBuddy.gtt_numlines) then
			TipBuddy.gtt_numlines = 0;	
		end

		TipBuddy_TargetInfo_CheckName( type, unit );
		TipBuddy_TargetInfo_TargetsTarget( type, unit );
		TipBuddy_TargetInfo_GetGuild( type, unit );
		TipBuddy_TargetInfo_GetClass( type, unit );
		TipBuddy_TargetInfo_GetLevel( type, unit );
		if (TipBuddy.refresh ~= 1) then
			TipBuddy_TargetInfo_ShowCityFaction( type, unit );
			TipBuddy_ConfirmLastLine(unit);
			if ( targettype.off ~= 1 ) then
				TipBuddy_GTT_GetExtraLines(TipBuddy.gtt_numlines);
			end
		end		
	end

	if ( targettype.off == 1 ) then
		if (TipBuddy_SavedVars["general"].blizdefault == 1) then
			TipBuddy_ClearFade(TipBuddyTooltip, 1);
			TipBuddyTooltip:SetUnit(unit);	
			TipBuddy_GTT_AddExtras();
			TipBuddyTooltip:Show();
		else
			TipBuddy_TargetName_Text:SetText(TipBuddy.gtt_namecolor..TipBuddy.gtt_name..TipBuddy.gtt_target);
			TipBuddy_TargetName_Text:Show();

			if ( targettype.gld == 1 ) then
				if (TipBuddy.gtt_guildcolor and TipBuddy.gtt_guild and TipBuddy.gtt_guild ~= "" ) then
					----TB_AddMessage(TB_RED_TXT.."Guild text = "..TB_YLW_TXT..TipBuddy.gtt_guild);
					TipBuddy_TargetGuild_Text:SetText(TipBuddy.gtt_guildcolor.."<"..TipBuddy.gtt_guild..TipBuddy.gtt_guildcolor..">");
					TipBuddy_TargetGuild_Text:Show();				
				else
					TipBuddy_TargetGuild_Text:Hide();
				end
			else
				TipBuddy_TargetGuild_Text:Hide();
			end
			if ( targettype.hth == 1 ) then
				TipBuddy_TargetFrameHealthBar:Show();
				------TB_AddMessage(unit);
				if (UnitMana( unit ) > 0) then
					TipBuddy_TargetFrameManaBar:Show();
				else
					TipBuddy_TargetFrameManaBar:Hide();
				end
				TipBuddy_UnitFrame_UpdateHealth( unit );
				TipBuddy_UnitFrame_UpdateMana( unit );
				TipBuddy_UpdateHealthText( TipBuddy_HealthText, type, unit );
				TipBuddy_UpdateManaText( TipBuddy_ManaText, type, unit );
			else
				TipBuddy_TargetFrameHealthBar:Hide();
				TipBuddy_TargetFrameManaBar:Hide();
			end
			if ( targettype.cfc == 1 and TipBuddy.gtt_cityfac ~= "" ) then
				TipBuddy_TargetCityFac_Text:SetText(tbcolor_cityfac..TipBuddy.gtt_cityfac);
				TipBuddy_TargetCityFac_Text:Show();
			else
				TipBuddy_TargetCityFac_Text:Hide();
			end
			if ( targettype.cls == 1 ) then
				if (TipBuddy.gtt_class == "" and TipBuddy.gtt_level == "") then
					TipBuddy_TargetClass_Text:Hide();
					TipBuddy_TargetLevel_Text:Hide();				
				elseif (TipBuddy.gtt_class and TipBuddy.gtt_class ~= "" ) then
					TipBuddy_TargetClass_Text:SetText(TipBuddy.gtt_race..TipBuddy.gtt_classcolor..TipBuddy.gtt_classlvlcolor..TipBuddy.gtt_class..TipBuddy.gtt_classcorpse);		
					TipBuddy_TargetClass_Text:Show();			
				else
					TipBuddy_TargetClass_Text:Hide();
					TipBuddy_TargetLevel_Text:Hide();			
				end

				TipBuddy_TargetLevel_Text:Show();
			else
				TipBuddy_TargetClass_Text:Hide();
				TipBuddy_TargetLevel_Text:Hide();
			end
			TipBuddy_TargetInfo_FindExtras( unit );

			TipBuddy_FrameHeights_Initialize(type);
			TipBuddy_SetFrame_Width();
		end
	else
		--TB_AddMessage(getglobal("TipBuddyTooltipTextLeft1"):GetText());
		TipBuddy_ClearFade(TipBuddyTooltip, 1);
		TipBuddyTooltip:SetUnit(unit);
		----TB_AddMessage("setunit show:  ("..TipBuddyTooltip:GetTop()..")");

		--/script TipBuddy_SavedVars.npc_friend.off = 2
		if (TipBuddy_SavedVars["general"].blizdefault == 1) then

		elseif (targettype.off == 2) then
			GameTooltip.variables1 = {};
			GameTooltip.variables2 = {};
			if (not targettype.ebx1) then
				targettype.ebx1 = "";	
			end
			if (not targettype.ebx2) then
				targettype.ebx2 = "";	
			end
			local ebtext1 = targettype.ebx1;
			local ebtext2 = targettype.ebx2;
			for variable, value in TB_VARIABLE_FUNCTIONS do
				if (string.find(ebtext1, variable)) then
					GameTooltip.variables1[variable] = true;			
				end
				if (string.find(ebtext2, variable)) then
					GameTooltip.variables2[variable] = true;			
				end
			end
			
			local maxchar = 256;
			TipBuddyTooltipTextLeft1:SetTextColor(1, 1, 1);
			if ((not ebtext1) or ebtext1 == "") then 
				TipBuddyTooltip:SetText("     ");
				--TipBuddyTooltipTextLeft1:Show();
			else
				for var in GameTooltip.variables1 do
					ebtext1 = TB_VARIABLE_FUNCTIONS[var].func(ebtext1, unit);
				end
				if (maxchar and string.len(ebtext1) > maxchar) then
					ebtext1 = string.sub(ebtext1, 1, maxchar);
				end
				TipBuddyTooltip:SetText(ebtext1);	
				--TipBuddyTooltipTextLeft1:Show();
			end

			maxchar = 2048;
			if ((not ebtext2) or ebtext2 == "") then 
				--TipBuddyTooltipTextLeft2:SetText(" ");
				--TipBuddyTooltipTextLeft1:Show();
			else
				for var in GameTooltip.variables2 do
					ebtext2 = TB_VARIABLE_FUNCTIONS[var].func(ebtext2, unit);
				end
				if (maxchar and string.len(ebtext2) > maxchar) then
					ebtext2 = string.sub(ebtext2, 1, maxchar);
				end

				--strip out the empty lines
				ebtext2 = string.gsub(ebtext2, "|r\n|r\n", "|r\n");
				ebtext2 = string.gsub(ebtext2, "^|r\n", "");

				TipBuddyTooltip:AddLine(ebtext2);
				TipBuddyTooltipTextLeft2:SetTextColor(1, 1, 1);
			end
		else

			TipBuddyTooltip:SetText(TipBuddy.gtt_namecolor..TipBuddy.gtt_name..TipBuddy.gtt_target);

			if ( targettype.gld == 1 and TipBuddy.gtt_guild and TipBuddy.gtt_guild ~= "" ) then
				if (TipBuddy.gtt_guild ~= nil) then
					TipBuddyTooltip:AddLine(TipBuddy.gtt_guildcolor.."<"..TipBuddy.gtt_guild..TipBuddy.gtt_guildcolor..">".."|r");
				end
			end
			if ( targettype.cls == 1 ) then
				if (TipBuddy.gtt_class == nil) then
					TipBuddy.gtt_class = "";	
				end
				if (TipBuddy.gtt_class == "" and TipBuddy.gtt_level == "") then
					
				else
					TipBuddyTooltip:AddLine(TipBuddy.gtt_level.."|r  "..TipBuddy.gtt_race..TipBuddy.gtt_classcolor..TipBuddy.gtt_classlvlcolor..TipBuddy.gtt_class..TipBuddy.gtt_classcorpse.."|r");
				end
			end
			if ( targettype.cfc == 1 and TipBuddy.gtt_cityfac ~= "" ) then
				TipBuddyTooltip:AddLine(TipBuddy.gtt_cityfac.."|r");
			end
		end
		
		TipBuddy_GTT_AddExtras();
		
		if ( targettype.hth == 1 ) then
			TipBuddyTooltipStatusBar:Show();
		else
			TipBuddyTooltipStatusBar:Hide();
		end

		TipBuddyTooltip:Show();
		TipBuddy_UpdateHealthText( TipBuddy_HealthTextGTT, type, unit );
	end
	if ( targettype.fac == 1 ) then
		TipBuddy_TargetInfo_ShowFaction( type, unit );
	else
		TipBuddy_FactionFrameGTT:Hide();
		TipBuddy_FactionFrame:Hide();
	end
end

--------------------------------------------------------------------------------------------------------------------------------------
-- SET BACKGROUND COLOR
--------------------------------------------------------------------------------------------------------------------------------------
function TipBuddy_SetFrame_BackgroundColor( type, unit )
	--TB_AddMessage(TB_WHT_TXT.."Background Color");
	if (not unit or not type) then
		TipBuddy_SetFrame_NonUnit_BackgroundColor( type );
		------TB_AddMessage("NO UNIT OR TYPE - SETTING BG");
		return;
	end
	local targettype = TipBuddy_SavedVars[type];
	local r, br, g, bg, b, bb, a, ba;

	if (not targettype.c_bdp) then
		targettype.c_bdp = 0;	
	end
	if (not targettype.c_bdb) then
		targettype.c_bdb = 0;	
	end

	----TB_AddMessage("bdp = "..targettype.c_bdp);
	if (GetGuildInfo("player") and GetGuildInfo(unit) == GetGuildInfo("player")) then
		type = "guild";
		targettype = TipBuddy_SavedVars[type];
		r, g, b, a = targettype.bgcolor.r, targettype.bgcolor.g, targettype.bgcolor.b, targettype.bgcolor.a; 	
		----TB_AddMessage("setting BG color to Guild");		
	elseif (targettype.c_bdp and targettype.c_bdp == 1) then
	--[[
	tbcolor_lvl_impossible =		TipBuddy_RGBToHexColor(colors.lvl_imp.r, colors.lvl_imp.g, colors.lvl_imp.b);
	tbcolor_lvl_verydifficult =		TipBuddy_RGBToHexColor(colors.lvl_vdf.r, colors.lvl_vdf.g, colors.lvl_vdf.b);
	tbcolor_lvl_difficult =			TipBuddy_RGBToHexColor(colors.lvl_dif.r, colors.lvl_dif.g, colors.lvl_dif.b);
	tbcolor_lvl_standard =			TipBuddy_RGBToHexColor(colors.lvl_stn.r, colors.lvl_stn.g, colors.lvl_stn.b);
	tbcolor_lvl_trivial =			TipBuddy_RGBToHexColor(colors.lvl_trv.r, colors.lvl_trv.g, colors.lvl_trv.b);
	]]		
		local levelDiff = UnitLevel(unit) - UnitLevel("player");
		local colors = TipBuddy_SavedVars["textcolors"];
		if ( levelDiff >= 5 ) then
			r, g, b = colors.lvl_imp.r, colors.lvl_imp.g, colors.lvl_imp.b; 
		elseif ( levelDiff >= 3 ) then
			r, g, b = colors.lvl_vdf.r, colors.lvl_vdf.g, colors.lvl_vdf.b; 
		elseif ( levelDiff >= -2 ) then
			r, g, b = colors.lvl_dif.r, colors.lvl_dif.g, colors.lvl_dif.b;
		elseif ( -levelDiff <= GetQuestGreenRange() ) then
			r, g, b = colors.lvl_stn.r, colors.lvl_stn.g, colors.lvl_stn.b; 
		else
			r, g, b = colors.lvl_trv.r, colors.lvl_trv.g, colors.lvl_trv.b;
		end
		r, g, b = TB_NoNegative(r - 0.35), TB_NoNegative(g - 0.35), TB_NoNegative(b - 0.35);
		a = targettype.bgcolor.a; 
	elseif (targettype.c_bdp and targettype.c_bdp == 2) then
		local reaction = TipBuddy_GetUnitReaction( unit );
		local colors = TipBuddy_SavedVars["textcolors"];
		----TB_AddMessage("reaction = "..reaction);
--[[	tbcolor_nam_hostile =			TipBuddy_RGBToHexColor(colors.nam_hos.r, colors.nam_hos.g, colors.nam_hos.b);
	tbcolor_nam_neutral =			TipBuddy_RGBToHexColor(colors.nam_neu.r, colors.nam_neu.g, colors.nam_neu.b);
	tbcolor_nam_friendly =			TipBuddy_RGBToHexColor(colors.nam_fri.r, colors.nam_fri.g, colors.nam_fri.b);
	tbcolor_nam_caution =			TipBuddy_RGBToHexColor(colors.nam_cau.r, colors.nam_cau.g, colors.nam_cau.b);
	tbcolor_nam_pvp =			TipBuddy_RGBToHexColor(colors.nam_pvp.r, colors.nam_pvp.g, colors.nam_pvp.b);
	tbcolor_nam_tappedplayer =		TipBuddy_RGBToHexColor(colors.nam_tpp.r, colors.nam_tpp.g, colors.nam_tpp.b);
	tbcolor_nam_tappedother =		TipBuddy_RGBToHexColor(colors.nam_tpo.r, colors.nam_tpo.g, colors.nam_tpo.b);]]
		if (reaction == "hostile") then
			r, g, b = colors.nam_hos.r, colors.nam_hos.g, colors.nam_hos.b;
		elseif (reaction == "neutral") then
			r, g, b = colors.nam_neu.r, colors.nam_neu.g, colors.nam_neu.b;
		elseif (reaction == "friendly") then
			r, g, b = colors.nam_fri.r, colors.nam_fri.g, colors.nam_fri.b;
		elseif (reaction == "caution") then
			r, g, b = colors.nam_cau.r, colors.nam_cau.g, colors.nam_cau.b;
		elseif (reaction == "pvp") then
			r, g, b = colors.nam_pvp.r, colors.nam_pvp.g, colors.nam_pvp.b;
		elseif (reaction == "tappedplayer") then
			r, g, b = colors.nam_tpp.r, colors.nam_tpp.g, colors.nam_tpp.b;
		elseif (reaction == "tappedother") then
			r, g, b = colors.nam_tpo.r, colors.nam_tpo.g, colors.nam_tpo.b;
		else
			r, g, b = targettype.bgcolor.r, targettype.bgcolor.g, targettype.bgcolor.b;
		end
		r, g, b = TB_NoNegative(r - 0.35), TB_NoNegative(g - 0.35), TB_NoNegative(b - 0.35);
		a = targettype.bgcolor.a; 
	else
		r, g, b, a = targettype.bgcolor.r, targettype.bgcolor.g, targettype.bgcolor.b, targettype.bgcolor.a; 	
		----TB_AddMessage("setting BG color to Custom");
	end

	if (targettype.c_bdb and targettype.c_bdb == 1) then
	--[[
	tbcolor_lvl_impossible =		TipBuddy_RGBToHexColor(colors.lvl_imp.r, colors.lvl_imp.g, colors.lvl_imp.b);
	tbcolor_lvl_verydifficult =		TipBuddy_RGBToHexColor(colors.lvl_vdf.r, colors.lvl_vdf.g, colors.lvl_vdf.b);
	tbcolor_lvl_difficult =			TipBuddy_RGBToHexColor(colors.lvl_dif.r, colors.lvl_dif.g, colors.lvl_dif.b);
	tbcolor_lvl_standard =			TipBuddy_RGBToHexColor(colors.lvl_stn.r, colors.lvl_stn.g, colors.lvl_stn.b);
	tbcolor_lvl_trivial =			TipBuddy_RGBToHexColor(colors.lvl_trv.r, colors.lvl_trv.g, colors.lvl_trv.b);
	]]		
		local levelDiff = UnitLevel(unit) - UnitLevel("player");
		local colors = TipBuddy_SavedVars["textcolors"];
		if ( levelDiff >= 5 ) then
			br, bg, bb = colors.lvl_imp.r, colors.lvl_imp.g, colors.lvl_imp.b; 
		elseif ( levelDiff >= 3 ) then
			br, bg, bb = colors.lvl_vdf.r, colors.lvl_vdf.g, colors.lvl_vdf.b; 
		elseif ( levelDiff >= -2 ) then
			br, bg, bb = colors.lvl_dif.r, colors.lvl_dif.g, colors.lvl_dif.b;
		elseif ( -levelDiff <= GetQuestGreenRange() ) then
			br, bg, bb = colors.lvl_stn.r, colors.lvl_stn.g, colors.lvl_stn.b; 
		else
			br, bg, bb = colors.lvl_trv.r, colors.lvl_trv.g, colors.lvl_trv.b;
		end
		ba = targettype.bgbcolor.a; 
	elseif (targettype.c_bdb and targettype.c_bdb == 2) then
		local reaction = TipBuddy_GetUnitReaction( unit );
		local colors = TipBuddy_SavedVars["textcolors"];
--[[	tbcolor_nam_hostile =			TipBuddy_RGBToHexColor(colors.nam_hos.r, colors.nam_hos.g, colors.nam_hos.b);
	tbcolor_nam_neutral =			TipBuddy_RGBToHexColor(colors.nam_neu.r, colors.nam_neu.g, colors.nam_neu.b);
	tbcolor_nam_friendly =			TipBuddy_RGBToHexColor(colors.nam_fri.r, colors.nam_fri.g, colors.nam_fri.b);
	tbcolor_nam_caution =			TipBuddy_RGBToHexColor(colors.nam_cau.r, colors.nam_cau.g, colors.nam_cau.b);
	tbcolor_nam_pvp =			TipBuddy_RGBToHexColor(colors.nam_pvp.r, colors.nam_pvp.g, colors.nam_pvp.b);
	tbcolor_nam_tappedplayer =		TipBuddy_RGBToHexColor(colors.nam_tpp.r, colors.nam_tpp.g, colors.nam_tpp.b);
	tbcolor_nam_tappedother =		TipBuddy_RGBToHexColor(colors.nam_tpo.r, colors.nam_tpo.g, colors.nam_tpo.b);]]
		if (reaction == "hostile") then
			br, bg, bb = colors.nam_hos.r, colors.nam_hos.g, colors.nam_hos.b;
		elseif (reaction == "neutral") then
			br, bg, bb = colors.nam_neu.r, colors.nam_neu.g, colors.nam_neu.b;
		elseif (reaction == "friendly") then
			br, bg, bb = colors.nam_fri.r, colors.nam_fri.g, colors.nam_fri.b;
		elseif (reaction == "caution") then
			br, bg, bb = colors.nam_cau.r, colors.nam_cau.g, colors.nam_cau.b;
		elseif (reaction == "pvp") then
			br, bg, bb = colors.nam_pvp.r, colors.nam_pvp.g, colors.nam_pvp.b;
		elseif (reaction == "tappedplayer") then
			br, bg, bb = colors.nam_tpp.r, colors.nam_tpp.g, colors.nam_tpp.b;
		elseif (reaction == "tappedother") then
			br, bg, bb = colors.nam_tpo.r, colors.nam_tpo.g, colors.nam_tpo.b;
		else
			br, bg, bb = targettype.bgcolor.r, targettype.bgcolor.g, targettype.bgcolor.b;
		end
		ba = targettype.bgbcolor.a; 
	else
		targettype = TipBuddy_SavedVars[type];
		if (not targettype.bgbcolor) then
			targettype.bgbcolor = {};
			targettype.bgbcolor.r = 0.8;
			targettype.bgbcolor.g = 0.8;
			targettype.bgbcolor.b = 0.9;
			targettype.bgbcolor.a = 1;	
		end
		br, bg, bb, ba = targettype.bgbcolor.r, targettype.bgbcolor.g, targettype.bgbcolor.b, targettype.bgbcolor.a; 	
	end

	--if (TipBuddy_SavedVars["general"].blizdefault == 1) then
	--	GameTooltip:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b, 1);
	--	GameTooltip:SetBackdropBorderColor(0.8, 0.8, 0.9, 1);
	if (TipBuddy.compactvis) then
		TipBuddy_Main_Frame:SetBackdropColor( r, g, b, a );
		TipBuddy_Main_Frame:SetBackdropBorderColor( 0, 0, 0, 0.9 );
	else
		TipBuddyTooltip:SetBackdropColor( r, g, b, a );
		--/script GameTooltip:SetBackdropBorderColor( 1, 1, 1, 1 );
		TipBuddyTooltip:SetBackdropBorderColor( br, bg, bb, ba );
	end
	if (TipBuddy_SavedVars["general"].blizdefault == 1) then
		TipBuddyTooltipTextLeft1:SetTextColor(GameTooltip_UnitColor(unit));
	end
	----TB_AddMessage(r.." - "..g.." - "..b.." - "..a);
end

--------------------------------------------------------------------------------------------------------------------------------------
-- SET NON-UNIT BACKGROUND COLOR
--------------------------------------------------------------------------------------------------------------------------------------
function TipBuddy_SetFrame_NonUnit_BackgroundColor( type )
	if (not type) then
		type = "general";	
	end
	local targettype = TipBuddy_SavedVars[type];
	if (not targettype.bgcolor) then
		targettype.bgcolor = {};
		targettype.bgcolor.r = 0.1;
		targettype.bgcolor.g = 0.1;
		targettype.bgcolor.b = 0.1;
		targettype.bgcolor.a = 0.78;	
	end
	if (not targettype.bgbcolor) then
		targettype.bgbcolor = {};
		targettype.bgbcolor.r = 0.8;
		targettype.bgbcolor.g = 0.8;
		targettype.bgbcolor.b = 0.9;
		targettype.bgbcolor.a = 1;	
	end

	--TB_AddMessage("NU: "..targettype.bgcolor.r.." - "..targettype.bgcolor.g.." - "..targettype.bgcolor.b.." - "..targettype.bgcolor.a);
	GameTooltip:SetBackdropColor( targettype.bgcolor.r, targettype.bgcolor.g, targettype.bgcolor.b, targettype.bgcolor.a );
	GameTooltip:SetBackdropBorderColor( targettype.bgbcolor.r, targettype.bgbcolor.g, targettype.bgbcolor.b, targettype.bgbcolor.a );
end


--------------------------------------------------------------------------------------------------------------------------------------
-- PARENT ON UPDATE
--------------------------------------------------------------------------------------------------------------------------------------
function TipBuddy_ParentTip_OnUpdate()
	--if (TipBuddy_Main_Frame:IsVisible() or GameTooltip:IsVisible()) then
	this:ClearAllPoints();

	local x, y = TipBuddy_PositionFrameToCursor();

	if (not TipBuddy.xpoint or not TipBuddy.xpos or not TipBuddy.anchor or not TipBuddy.fanchor) then
		TipBuddy.xpoint, TipBuddy.xpos, TipBuddy.ypos = TipBuddy_GetFrameCursorOffset();
		TipBuddy.anchor, TipBuddy.fanchor, TipBuddy.offset = TipBuddy_GetFrameAnchorPos();				
	end

	if ( UnitExists("mouseover") or TipBuddy.anchorparent == "UIParent") then
		if (TipBuddy_SavedVars["general"].anchored == 1) then
			this:SetPoint(TipBuddy.anchor, "TipBuddy_Header_Frame", TipBuddy.fanchor, 0, 0);
		else
			this:SetPoint(TipBuddy.xpoint, "UIParent", "BOTTOMLEFT", x, y);
		end
	else
		if (TipBuddy_SavedVars["general"].nonunit_anchor == 0) then
			this:SetPoint(TipBuddy.xpoint, "UIParent", "BOTTOMLEFT", x, y);				
		elseif (TipBuddy_SavedVars["general"].nonunit_anchor == 1) then
			this:SetPoint(TipBuddy.anchor, "TipBuddy_Header_Frame", TipBuddy.fanchor, 0, 0);
		else
			this:SetPoint(TipBuddy.xpoint, "UIParent", "BOTTOMLEFT", x, y);	
		end
		--/script TipBuddyTooltipx:SetOwner(TipBuddy_Parent_Frame, "ANCHOR_RIGHT"); TipBuddyTooltipx:SetUnit("player");
	end

	if ( UnitExists("mouseover") or TipBuddy.unitframe == 1) then
		if (TipBuddy.hasTarget and TipBuddy.hasTarget == 1) then
			--TB_AddMessage(TB_WHT_TXT.."ParentTip_OnUpdate");
			GameTooltip:SetAlpha(0);
		end
	elseif (TipBuddy.hasTarget == 1) then
		local text1 = getglobal("GameTooltipTextLeft1"):GetText();
		--TB_AddMessage(tbcolor_nam_hostile..TipBuddy.uName.." - "..getglobal("GameTooltipTextLeft1"):GetText());
		if (text1 == nil or TipBuddy.gtt_name == nil or string.find(text1, TipBuddy_FixMagicChars(TipBuddy.gtt_name))) then
			GameTooltip:Hide();
			------TB_AddMessage(TEXT(text1).." - "..TEXT(TipBuddy.gtt_name));
			if (TipBuddy_SavedVars["general"].gtt_fade == 1) then
				--TipBuddyTooltip:FadeOut();
				----TB_AddMessage("fading tt");

				TipBuddy_Hide( TipBuddyTooltip );	
			else
				TipBuddy_ForceHide( TipBuddyTooltip );
				--TB_AddMessage("hiding tt");
			end
		end
		--/script GameTooltipTextLeft1:SetTextColor(GameTooltip_UnitColor("mouseover"));
		if (TipBuddy_Main_Frame:IsVisible()) then
			TipBuddy_Hide( TipBuddy_Main_Frame );	
		end

		TipBuddy.hasTarget = 0;
		--TB_AddMessage("TipBuddy.hasTarget = 0");
		TipBuddy.uName = nil;
		TipBuddy.vis = nil;
	end
	
	if (not TipBuddy.first) then
		GameTooltip.default = nil;
		TipBuddy.first = 1;	
		--TB_AddMessage("first time:  ("..TipBuddyTooltip:GetTop()..")");
	end
end

function TipBuddyTooltip_OnUpdate()
	if ( this.fadingout ) then
		if ( this:GetAlpha() <= 0 ) then
			TipBuddy_FadeOut_Finished(this);
		end
	elseif ( this.fadingin ) then
		if ( this:GetAlpha() >= 1 ) then
			TipBuddy_FadeIn_Finished(this);
		end
	end
	if (this:IsVisible()) then
		if ((TipBuddy.hasTarget ~= 1) and (not this.fadingout)) then

			if (not this.startTime or not this.endTime) then
				TipBuddy_ForceHide( this );
				return;
			end
			GameTooltip:SetAlpha(0);
			local fraction = (GetTime() - this.startTime) / (this.endTime - this.startTime);
			if ( fraction >= 1.0 ) then
				TipBuddy_FadeOut( this );
			end	
		end
	end
end

--------------------------------------------------------------------------------------------------------------------------------------
-- MAIN ON UPDATE
--------------------------------------------------------------------------------------------------------------------------------------
function TipBuddy_MainTip_OnUpdate()
	--/script TipBuddy_SavedVars["general"].cursorpos = 1;
	--/script TipBuddy_SavedVars["general"].cursorpos = 0;

	if ( this.fadingout ) then
		if ( this:GetAlpha() <= 0 ) then
			TipBuddy_FadeOut_Finished(this);
		end
	elseif ( this.fadingin ) then
		if ( this:GetAlpha() >= 1 ) then
			TipBuddy_FadeIn_Finished(this);
		end
	end
	if (this:IsVisible()) then
		if ((TipBuddy.hasTarget ~= 1) and (not this.fadingout)) then
			TipBuddy.compactvis = nil;
			--/script ----TB_AddMessage(TipBuddy_Main_Frame.fadingout);
			if (not this.startTime or not this.endTime) then
				TipBuddy_SetFrame_NonUnit_BackgroundColor();
				TipBuddy_ForceHide( this );
				return;
			end
			GameTooltip:SetAlpha(0);
			local fraction = (GetTime() - this.startTime) / (this.endTime - this.startTime);
			if ( fraction >= 1.0 ) then
				TipBuddy_FadeOut( this );
			elseif (GameTooltip:IsVisible() and TipBuddy.compactvis ~= 1) then	
				TipBuddy_SetFrame_NonUnit_BackgroundColor();
				TipBuddy_ForceHide( this );
			end	
		elseif (GameTooltip:IsVisible() and TipBuddy.compactvis ~= 1) then	
			TipBuddy_SetFrame_NonUnit_BackgroundColor();
			TipBuddy_ForceHide( this );
		end
	end
end

--------------------------------------------------------------------------------------------------------------------------------------
-- SET ANCHOR
--------------------------------------------------------------------------------------------------------------------------------------
-- if it is set to be anchored, anchor it to TipBuddyAnchor
-- otherwise, set it to the cursor
function TipBuddy_SetFrame_Anchor( frame )
	--TB_AddMessage(TB_WHT_TXT.."SetFrame_Anchor");
	if (not TipBuddy.xpoint or not TipBuddy.anchor) then
		TipBuddy.xpoint, TipBuddy.xpos, TipBuddy.ypos = TipBuddy_GetFrameCursorOffset();
		TipBuddy.anchor, TipBuddy.fanchor, TipBuddy.offset = TipBuddy_GetFrameAnchorPos();				
	end
	frame:ClearAllPoints();
	if (TipBuddy_SavedVars["general"].anchored == 1) then
		frame:SetPoint(TipBuddy.anchor, "TipBuddy_Parent_Frame", TipBuddy.fanchor, 0, TipBuddy.offset);
	else
		frame:SetPoint(TipBuddy.xpoint, "TipBuddy_Parent_Frame", "CENTER", 0, 0);
	end
end

--------------------------------------------------------------------------------------------------------------------------------------
-- SET HEIGHTS (COMPACT)
--------------------------------------------------------------------------------------------------------------------------------------
-- /script TipBuddy_SavedVars["general"].scalemod = "1";
-- /script TipBuddy_SavedVars["general"].scalemod = "0";

function TipBuddy_FrameHeights_Initialize( type )
	local scale = TipBuddy_SavedVars["general"].scalemod;

	TipBuddy_FactionFrameIcon:SetHeight( 30 + (scale * 1.5) );
	TipBuddy_FactionFrameIcon:SetWidth( 30 + (scale * 1.5) );

	TipBuddy_TargetName_Text:SetTextHeight( 11 + scale );
	TipBuddy_TargetName_TextR:SetTextHeight( 11 + scale );
	if (type and TipBuddy.tt and TipBuddy.tt == 1 and TipBuddy_SavedVars[type] and TipBuddy_SavedVars[type].trg_2l and TipBuddy_SavedVars[type].trg_2l == 1) then
		TipBuddy_TargetName_Text:SetHeight( (11 + scale) * 2);
		TipBuddy_TargetName_TextR:SetHeight( (11 + scale) * 2);
	else
		TipBuddy_TargetName_Text:SetHeight( 11 + scale );
		TipBuddy_TargetName_TextR:SetHeight( 11 + scale );
	end

	TipBuddy_TargetGuild_Text:SetTextHeight( 8 + scale );
	TipBuddy_TargetGuild_Text:SetHeight( 8 + scale );
	TipBuddy_TargetGuild_TextR:SetTextHeight( 8 + scale );
	TipBuddy_TargetGuild_TextR:SetHeight( 8 + scale );

	TipBuddy_TargetLevel_Text:SetTextHeight( 10 + scale );
	TipBuddy_TargetLevel_Text:SetHeight( 10 + scale );
	--TipBuddy_TargetLevel_Text:SetTextHeight( 8 + scale );
	--TipBuddy_TargetLevel_Text:SetHeight( 8 + scale );
	TipBuddy_TargetClass_Text:SetTextHeight( 10 + scale );
	TipBuddy_TargetClass_Text:SetHeight( 10 + scale );

	TipBuddy_TargetCityFac_Text:SetTextHeight( 8 + scale );
	TipBuddy_TargetCityFac_Text:SetHeight( 8 + scale );
	TipBuddy_TargetCityFac_TextR:SetTextHeight( 8 + scale );
	TipBuddy_TargetCityFac_TextR:SetHeight( 8 + scale );

	for i=1, 20, 1 do
		local line;
		line = getglobal("TipBuddy_Xtra"..i.."_Text");
		line:SetTextHeight( 8 + scale );
		line:SetHeight( 8 + scale );
		line = getglobal("TipBuddy_XtraR"..i.."_Text");
		line:SetTextHeight( 8 + scale );
		line:SetHeight( 8 + scale );
	end

	TipBuddy_TargetFrameHealthBar:SetHeight( 5 + scale );
	TipBuddy_TargetFrameManaBar:SetHeight( 3 + scale );
	TipBuddy_HealthTextText:SetTextHeight( TipBuddy_TargetFrameHealthBar:GetHeight() + 6 );
	TipBuddy_ManaTextText:SetTextHeight( TipBuddy_TargetFrameManaBar:GetHeight() + 3.5 );

	TipBuddy_RankFrameIcon:SetHeight( 12 + scale );
	TipBuddy_RankFrameIcon:SetWidth( 12 + scale );

-- hack to fix the fonts scaling badly
	TipBuddy_Main_Frame:SetScale(2);
	TipBuddy_Main_Frame:SetScale(1);

	TipBuddy_SetFrame_Height();
end

function TipBuddy_SetFrame_Width()
	local scale = TipBuddy_SavedVars["general"].scalemod;
	
	local targetNameLength = TipBuddy_TargetName_Text:GetStringWidth() + (4 + scale); 
	local targetClassLength = (TipBuddy_TargetClass_Text:GetStringWidth() + TipBuddy_TargetLevel_Text:GetStringWidth() + (scale + 10)); 
	local targetGuildLength = TipBuddy_TargetGuild_Text:GetStringWidth() + (4 + scale); 

	if (not TipBuddy_TargetClass_Text:IsVisible()) then
		targetClassLength = 1;	
	end
	if (not TipBuddy_TargetGuild_Text:IsVisible()) then
		targetGuildLength = 1;	
	end

	if (targetNameLength > targetGuildLength) then
		if (targetNameLength < targetClassLength) then
			targetNameLength = targetClassLength;
		end
	elseif (targetGuildLength > targetClassLength) then
		targetNameLength = targetGuildLength;
	else
		targetNameLength = targetClassLength;
	end

	local t1 = targetNameLength;
	local t2;
	for i=1, 20, 1 do
		t2 = (getglobal("TipBuddy_Xtra"..i.."_Text"):GetStringWidth() + (5 + scale)) + (getglobal("TipBuddy_XtraR"..i.."_Text"):GetStringWidth() + (12 + scale));
		if (t1 < t2) then
			t1 = t2;	
		end		
	end

	if (t1 < 72) then
		t1 = 72;
	end
	TipBuddy_Main_Frame:SetWidth(t1 + scale);

	TipBuddy_TargetFrameHealthBar:SetWidth(TipBuddy_Main_Frame:GetWidth() - 6);
	TipBuddy_TargetFrameManaBar:SetWidth(TipBuddy_Main_Frame:GetWidth() - 6);
end

--/script foc = GetMouseFocus(); DEFAULT_CHAT_FRAME:AddMessage(foc:GetName());

function TipBuddy_SetFrame_Height()
	local scale = TipBuddy_SavedVars["general"].scalemod;
	local nameFrame = TipBuddy_TargetName_Text:GetHeight();
	local guildFrame = TipBuddy_TargetGuild_Text:GetHeight();
	local classFrame = TipBuddy_TargetLevel_Text:GetHeight();
	local healthFrame = TipBuddy_TargetFrameHealthBar:GetHeight();
	local manaFrame = TipBuddy_TargetFrameManaBar:GetHeight();
	local cityfacFrame = TipBuddy_TargetCityFac_Text:GetHeight();
	local lastparent = "TipBuddy_TargetName_Text";
	local lastparentr = "TipBuddy_TargetName_TextR";

	if (TipBuddy_TargetName_Text:IsVisible()) then
		nameFrame = TipBuddy_TargetName_Text:GetHeight();
	else
		nameFrame = 0;	
	end

	if (TipBuddy_TargetGuild_Text:IsVisible()) then
		guildFrame = TipBuddy_TargetGuild_Text:GetHeight();
		TipBuddy_TargetGuild_Text:SetPoint("TOPLEFT", lastparent, "BOTTOMLEFT", 0, 1);
		TipBuddy_TargetGuild_TextR:SetPoint("TOPRIGHT", lastparentr, "BOTTOMRIGHT", 0, 1);
		lastparent = "TipBuddy_TargetGuild_Text";
		lastparentr = "TipBuddy_TargetGuild_TextR";
	else
		guildFrame = 0;	
	end

	if (TipBuddy_TargetFrameHealthBar:IsVisible()) then
		healthFrame = (TipBuddy_TargetFrameHealthBar:GetHeight() + 5);
		TipBuddy_TargetFrameHealthBar:SetPoint("TOPLEFT", lastparent, "BOTTOMLEFT", 2, -4);
		lastparent = "TipBuddy_TargetFrameHealthBar";
		lastparentr = "TipBuddy_TargetFrameHealthBar";
	else
		healthFrame = 0;	
	end

	if (TipBuddy_TargetFrameManaBar:IsVisible()) then
		manaFrame = (TipBuddy_TargetFrameManaBar:GetHeight() + 4);
		lastparent = "TipBuddy_TargetFrameManaBar";
		lastparentr = "TipBuddy_TargetFrameManaBar";
	else
		manaFrame = 0;	
	end

	if (TipBuddy_TargetCityFac_Text:IsVisible()) then
		------TB_AddMessage(lastparent);
		cityfacFrame = TipBuddy_TargetCityFac_Text:GetHeight();
		TipBuddy_TargetCityFac_Text:SetPoint("TOPLEFT", lastparent, "BOTTOMLEFT", 0, 0);
		TipBuddy_TargetCityFac_TextR:SetPoint("TOPRIGHT", lastparentr, "BOTTOMRIGHT", 0, 0);
		lastparent = "TipBuddy_TargetCityFac_Text";
		lastparentr = "TipBuddy_TargetCityFac_TextR";
	else
		cityfacFrame = 0;	
	end

	if (TipBuddy_TargetLevel_Text:IsVisible()) then
	------TB_AddMessage(lastparent);
		classFrame = (TipBuddy_TargetLevel_Text:GetHeight() + 1);
		TipBuddy_TargetLevel_Text:SetPoint("TOPLEFT", lastparent, "BOTTOMLEFT", 0, -1);
		TipBuddy_TargetClass_Text:SetPoint("TOPRIGHT", lastparentr, "BOTTOMRIGHT", 0, -1);
		lastparent = "TipBuddy_TargetLevel_Text";
		lastparentr = "TipBuddy_TargetClass_Text";
	else
		classFrame = 0;	
	end

	if (TipBuddy_Xtra1_Text:IsVisible()) then
		TipBuddy_Xtra1_Text:SetPoint("TOPLEFT", lastparent, "BOTTOMLEFT", 0, -3);
		TipBuddy_XtraR1_Text:SetPoint("TOPRIGHT", lastparentr, "BOTTOMRIGHT", 0, -3);
	end

	local xtraHeight = 0;
	for i=1, 20, 1 do
		local xtraLineL = getglobal("TipBuddy_Xtra"..i.."_Text");
		local xtraLineR = getglobal("TipBuddy_XtraR"..i.."_Text");
		if (xtraLineL:IsVisible()) then
			xtraHeight = ( xtraHeight + xtraLineL:GetHeight() + 1 );
		else
			if (xtraLineR:IsVisible()) then
				xtraHeight = ( xtraHeight + xtraLineL:GetHeight() + 1 );
			end
		end
	end
	if (xtraHeight ~= 0) then	
		xtraHeight = xtraHeight + 2;	
	end

	local tipFrameHeight = ((nameFrame + guildFrame + classFrame + healthFrame + manaFrame + cityfacFrame + xtraHeight) + 4);
	TipBuddy_Main_Frame:SetHeight(tipFrameHeight);
end

--------------------------------------------------------------------------------------------------------------------------------------
-- POSITIONING
--------------------------------------------------------------------------------------------------------------------------------------

--/script ----TB_AddMessage(UIParent:GetWidth()..", "..UIParent:GetHeight()); local x, y = GetCursorPosition(UIParent); ----TB_AddMessage(x..", "..y);
function TipBuddy_PositionFrameToCursor()

	local x, y = GetCursorPosition(UIParent);

	x = (x / TipBuddy.uiscale) + TipBuddy.xpos;
	y = (y / TipBuddy.uiscale) + TipBuddy.ypos;

	local x1, x2, y1, y2, tip;
	if (TipBuddyTooltip:IsVisible()) then
		tip = getglobal("TipBuddyTooltip");
	elseif (TipBuddy_Main_Frame:IsVisible()) then
		tip = getglobal("TipBuddy_Main_Frame");
	else
		tip = getglobal("GameTooltip");
	end

	if ( TipBuddy.xpoint == "LEFT" ) then
		x1 = 0;
		x2 = (TipBuddy.uiwidth - tip:GetWidth());
	elseif ( TipBuddy.xpoint == "RIGHT" ) then
		x1 = tip:GetWidth();
		x2 = TipBuddy.uiwidth;
	else
		x1 = tip:GetWidth() * 0.5;
		x2 = (TipBuddy.uiwidth - x1);
	end

	y1 = (TipBuddy.uiheight - tip:GetHeight());
	if ( TipBuddy.xpoint == "TOP" ) then
		y2 = tip:GetHeight();
	elseif ( xpoint == "BOTTOM" ) then
		y2 = 0;
	else
		y2 = (tip:GetHeight() * 0.5);
	end

------TB_AddMessage(x1..", "..y2);
	if ( x < x1 ) then
		x = x1;
	end
	if ( x > x2 ) then
		x = x2;
	end
	if ( y > y1 ) then
		y = y1;
	end
	if ( y < y2 ) then
		y = y2;
	end
	
	return x, y;
end

function TipBuddy_GetIconAnchorPos( frame )
	local x, y = TipBuddy_PositionFrameToCursor();

	if (not frame or not frame:GetLeft()) then
		return;	
	end
	if (not TipBuddy.uiwidth) then
		TipBuddy.uiscale = UIParent:GetScale();
		TipBuddy.uiwidth = UIParent:GetWidth() / TipBuddy.uiscale;
		TipBuddy.uiheight = UIParent:GetHeight() / TipBuddy.uiscale;			
	end	
	if (y > (TipBuddy.uiheight * 0.75)) then
		--topright
		if (x > (TipBuddy.uiwidth * 0.75)) then
			if (frame and frame:GetLeft() <= (TipBuddy.uiwidth * 0.2)) then
				------TB_AddMessage("ANCHOR_NONE");
				return "ANCHOR_NONE", "BOTTOM", "TOP";
			end
			------TB_AddMessage("ANCHOR_BOTTOMLEFT");
			return "ANCHOR_BOTTOMLEFT", "TOPRIGHT", "BOTTOMLEFT";
		--topmidright
		elseif (x > (TipBuddy.uiwidth * 0.5)) then
			if (frame and frame:GetLeft() <= (TipBuddy.uiwidth * 0.2)) then
				------TB_AddMessage("ANCHOR_NONE");
				return "ANCHOR_NONE", "BOTTOM", "TOP";
			end
			------TB_AddMessage("ANCHOR_BOTTOMLEFT");
			return "ANCHOR_BOTTOMLEFT", "TOPRIGHT", "BOTTOMRIGHT";
		--cursor is topmidleft
		elseif (x > (TipBuddy.uiwidth * 0.25)) then
			if (frame and frame:GetRight() >= (TipBuddy.uiwidth * 0.8)) then
				------TB_AddMessage("ANCHOR_NONE");
				return "ANCHOR_NONE", "BOTTOM", "TOP";
			end
			------TB_AddMessage("ANCHOR_BOTTOMRIGHT");
			return "ANCHOR_BOTTOMRIGHT", "TOPLEFT", "BOTTOMLEFT";
		--cursor is topleft
		else
			if (frame and frame:GetRight() >= (TipBuddy.uiwidth * 0.8)) then
				------TB_AddMessage("ANCHOR_NONE");
				return "ANCHOR_NONE", "BOTTOM", "TOP";
			end
			------TB_AddMessage("ANCHOR_BOTTOMRIGHT");
			return "ANCHOR_BOTTOMRIGHT", "TOPLEFT", "BOTTOMRIGHT";
		end

	elseif (y > (TipBuddy.uiheight * 0.25)) then
		--midright
		if (x > (TipBuddy.uiwidth * 0.75)) then
			if (frame and frame:GetLeft() <= (TipBuddy.uiwidth * 0.2)) then
				------TB_AddMessage("ANCHOR_NONE");
				return "ANCHOR_NONE", "BOTTOM", "TOP";
			end
			------TB_AddMessage("ANCHOR_NONE");
			return "ANCHOR_NONE", "BOTTOMRIGHT", "BOTTOMLEFT";
		else
			if (frame and frame:GetRight() >= (TipBuddy.uiwidth * 0.8)) then
				------TB_AddMessage("ANCHOR_NONE");
				return "ANCHOR_NONE", "BOTTOM", "TOP";
			end
			------TB_AddMessage("ANCHOR_NONE");
			return "ANCHOR_NONE", "BOTTOMLEFT", "BOTTOMRIGHT";
		end
	else

		if (x > (TipBuddy.uiwidth * 0.75)) then
			if (frame and frame:GetLeft() <= (TipBuddy.uiwidth * 0.2)) then
				------TB_AddMessage("ANCHOR_NONE");
				return "ANCHOR_NONE", "BOTTOM", "TOP";
			end
			------TB_AddMessage("ANCHOR_LEFT");
			return "ANCHOR_LEFT", "BOTTOMRIGHT", "TOPLEFT";
		else
			if (frame and frame:GetRight() >= (TipBuddy.uiwidth * 0.8)) then
				------TB_AddMessage("ANCHOR_NONE");
				return "ANCHOR_NONE", "BOTTOM", "TOP";
			end
			------TB_AddMessage("ANCHOR_RIGHT");
			return "ANCHOR_RIGHT", "BOTTOMLEFT", "TOPRIGHT";
		end		
	end
end

function TipBuddy_GetFrameCursorOffset()
	local curpos = TipBuddy_SavedVars["general"].cursorpos;
	TipBuddy.uiscale = UIParent:GetScale();
	TipBuddy.uiwidth = UIParent:GetWidth() / TipBuddy.uiscale;
	TipBuddy.uiheight = UIParent:GetHeight() / TipBuddy.uiscale;

	-- set the position of the tooltip in relation to the cursor
	if (curpos == "Top") then
		xpoint = "BOTTOM";
	elseif (curpos == "Right") then
		xpoint = "LEFT";		
	elseif (curpos == "Left") then
		xpoint = "RIGHT";
	elseif (curpos == "Bottom") then
		xpoint = "TOP";
	else
		xpoint = "BOTTOM";
	end
	return xpoint, TipBuddy_SavedVars["general"].offset_x, TipBuddy_SavedVars["general"].offset_y;
end

function TipBuddy_GetFrameAnchorPos()
	local anchorpos = TipBuddy_SavedVars["general"].anchor_pos;

	if (anchorpos == "Top Right") then
		anchor = "BOTTOMRIGHT";
		fanchor = "TOPRIGHT";
		offset = -2;
	elseif (anchorpos == "Top Left") then
		anchor = "BOTTOMLEFT";
		fanchor = "TOPLEFT";
		offset = -2;
	elseif (anchorpos == "Bottom Right") then
		anchor = "TOPRIGHT";
		fanchor = "BOTTOMRIGHT";
		offset = 2;
	elseif (anchorpos == "Bottom Left") then
		anchor = "TOPLEFT";
		fanchor = "BOTTOMLEFT";
		offset = 2;
	elseif (anchorpos == "Top Center") then
		anchor = "BOTTOM";
		fanchor = "TOP";
		offset = -2;
	elseif (anchorpos == "Bottom Center") then
		anchor = "TOP";
		fanchor = "BOTTOM";
		offset = 2;
	end
	return anchor, fanchor, offset;
end

--------------------------------------------------------------------------------------------------------------------------------------
-- FADING
--------------------------------------------------------------------------------------------------------------------------------------

function TipBuddy_Hide( frame )
	------TB_AddMessage("TipBuddy_Hide");
	TipBuddy.hasTarget = 0;
	--TB_AddMessage("TipBuddy.hasTarget = 0");

	if (frame:GetName() == "TipBuddy_Main_Frame") then
		if (GameTooltip:IsVisible() and TipBuddy.compactvis ~= 1 and not UnitExists("mouseover")) then
			TipBuddy_ForceHide(frame);
			return;
		elseif (UnitExists("mouseover")) then
			TipBuddy_ForceHide(frame);
			return;
		elseif ( frame.fadingout ) then
			return;
		end
	end

	local delayTime;
	if (TipBuddy_SavedVars["general"].delaytime) then
		delayTime = TipBuddy_SavedVars["general"].delaytime;
	else
		delayTime = 0;
	end
	TipBuddy.uName = nil;

	frame.startTime = GetTime();
	frame.endTime = frame.startTime + (0.01 + delayTime);
end

function TipBuddy_FadeOut( frame, func )
	--TB_AddMessage("TipBuddy_FadeOut");
	if (frame:GetName() == "TipBuddy_Main_Frame") then
		TipBuddy.compactvis = nil;
	end
	if ( frame.fadingout ) then
		return;
	end

	frame.fadingout = 1;
	frame.fadingin = nil;
	frame.targetalpha = 0;
	frame.animfunc_fade = func;

	local fadeTime;
	if (TipBuddy_SavedVars["general"].fadetime) then
		fadeTime = TipBuddy_SavedVars["general"].fadetime;
	else
		fadeTime = 0;
	end
	UIFrameFadeRemoveFrame(frame);
	UIFrameFadeOut( frame, (0.01 + fadeTime), frame:GetAlpha(), frame.targetalpha );
end

function TipBuddy_FadeOut_Finished()
	--TB_AddMessage("TipBuddy_FadeOut_Finished");
	this:Hide();
	this:SetAlpha( 1 );

	this.fadingout = nil;
	if ( this.animfunc_fade ) then
		this.animfunc_fade();
	end
end

function TipBuddy_FadeIn( frame, func )
	------TB_AddMessage("TipBuddy_FadeIn");
	if ( frame.fadingin ) then
		return;
	end
	if ( frame.fadingout ) then
		UIFrameFadeRemoveFrame(frame);
	end

	frame.fadingin = 1;
	frame.fadingout = nil;
	frame.targetalpha = 1;
	frame.animfunc_fade = func;
	UIFrameFadeRemoveFrame(frame);
	UIFrameFadeIn( frame, 0.01, 0.9, frame.targetalpha );
end

function TipBuddy_FadeIn_Finished()
	------TB_AddMessage("TipBuddy_FadeIn_Finished");
	this:SetAlpha( 1 );

	this.fadingin = nil;
	if ( this.animfunc_fade ) then
		this.animfunc_fade();
	end
end

--------------------------------------------------------------------------------------------------------------------------------------
-- GAMETOOLTIP
--------------------------------------------------------------------------------------------------------------------------------------
function TB_GameTooltip_IniHooks()
		TB_AddMessage("GameTooltip_OnLoad");
		--hooking GameTooltip's AddLine
		if( not GameTooltip.tborgAddLine ) then
			GameTooltip.tborgAddLine = GameTooltip.AddLine;
			GameTooltip.AddLine = TipBuddy_GameTooltip_AddLine;
		end
		--hooking GameTooltip's AddDoubleLine
		if( not GameTooltip.tborgAddDoubleLine ) then
			GameTooltip.tborgAddDoubleLine = GameTooltip.AddDoubleLine;
			GameTooltip.AddDoubleLine = TipBuddy_GameTooltip_AddDoubleLine;
			----TB_AddMessage("adding double line hook");
		end
		--hooking GameTooltip's SetUnit
		if( not GameTooltip.orgSetUnit ) then
			GameTooltip.orgSetUnit = GameTooltip.SetUnit;
			GameTooltip.SetUnit = TipBuddy_GameTooltip_SetUnit;
		end
		--hooking GameTooltip's FadeOut
		if( not GameTooltip.orgFadeOut ) then
			GameTooltip.orgFadeOut = GameTooltip.FadeOut;
			GameTooltip.FadeOut = TipBuddy_GameTooltip_FadeOut;
		end
		--hooking GameTooltip's SetOwner
		if( not GameTooltip.orgSetOwner ) then
			--TB_AddMessage( tbcolor_nam_hostile.."hooking setowner" )
			GameTooltip.orgSetOwner = GameTooltip.SetOwner;
			GameTooltip.SetOwner = TipBuddy_GameTooltip_SetOwner;
		end
		--hooking GameTooltip's SetPoint
		if( not GameTooltip.orgSetPoint ) then
			--TB_AddMessage( tbcolor_nam_hostile.."hooking setpoint" )
			GameTooltip.orgSetPoint = GameTooltip.SetPoint;
			GameTooltip.SetPoint = TipBuddy_GameTooltip_SetPoint;
		end	
end
--hook
local originalGameTooltip_SetDefaultAnchor;
originalGameTooltip_SetDefaultAnchor = GameTooltip_SetDefaultAnchor;
function GameTooltip_SetDefaultAnchor(tooltip, parent)
	TB_AddMessage(TB_WHT_TXT.."GTT SETANCHOR");
	TipBuddy.defanch = 1;
	originalGameTooltip_SetDefaultAnchor( tooltip, parent );
	if (tooltip:GetName() ~= "GameTooltip" and tooltip:GetName() ~= "TipBuddyTooltip") then
		TipBuddy.defanch = nil;
		return;
	end
	if (parent) then
		TipBuddy.anchorparent = parent:GetName();
		--TB_AddMessage("GTT_PARENT = "..parent:GetName());
	else
		--TB_AddMessage("GTT HAS NO PARENT ");
	end
	--/script GameTooltip:SetOwner(PetActionButton5, "ANCHOR_NONE");
	if (not TipBuddy.first) then
		tooltip:Show();	
	end
	if (not TipBuddy.xpoint or not TipBuddy.anchor) then
		TipBuddy.xpoint, TipBuddy.xpos, TipBuddy.ypos = TipBuddy_GetFrameCursorOffset();
		TipBuddy.anchor, TipBuddy.fanchor, TipBuddy.offset = TipBuddy_GetFrameAnchorPos();				
	end
	TipBuddyTooltip:ClearAllPoints();
	GameTooltip:ClearAllPoints();
	TB_AddMessage("GameTooltip:ClearAllPoints()");
	if (UnitExists("mouseover") or TipBuddy.unitframe == 1) then
		GameTooltip:orgSetOwner(parent, "ANCHOR_NONE");
		GameTooltip:orgSetPoint("TOPLEFT", "UIParent", "BOTTOMRIGHT", 256, -256);
		GameTooltip.default = 0;
		TB_AddMessage("GameTooltip:orgSetPoint");
		local newparent = TipBuddy_Parent_Frame;
		if (parent.unit) then
			GameTooltip:SetUnit(parent.unit);
			TB_AddMessage(parent:GetName());
			newparent = parent;
		end
		if ( TipBuddy_SavedVars["general"].anchored == 1) then
			TB_AddMessage("GTT-ANCHORED = 1  "..TipBuddy.offset);
			TipBuddyTooltip:SetOwner(newparent, "ANCHOR_NONE");
			TipBuddyTooltip:SetPoint(TipBuddy.anchor, "TipBuddy_Parent_Frame", TipBuddy.fanchor, 0, TipBuddy.offset);	
		else
			TipBuddyTooltip:SetOwner(newparent, "ANCHOR_NONE");
			TipBuddyTooltip:SetPoint(TipBuddy.xpoint, "TipBuddy_Parent_Frame", "CENTER", 0, 0);
			TB_AddMessage("GTT-ANCHORED = 0   "..TipBuddy.xpoint);
		end
	else
		if (parent == getglobal("UIParent")) then
			if ( TipBuddy_SavedVars["general"].anchored == 1) then
				TB_AddMessage("GTT-ANCHORED = 1");
				tooltip:SetOwner(parent, "ANCHOR_NONE");
				tooltip:SetPoint(TipBuddy.anchor, "TipBuddy_Parent_Frame", TipBuddy.fanchor, 0, TipBuddy.offset);	
				tooltip.default = nil;
			else
				if (TipBuddy_SavedVars["general"].gtt_fade == 1) then
					tooltip:SetOwner(parent, "ANCHOR_NONE");
					tooltip:SetPoint(TipBuddy.xpoint, "TipBuddy_Parent_Frame", "CENTER", 0, 0);
					tooltip.default = nil;	
					TB_AddMessage("GTT-ANCHORED = 0");
				else
					TB_AddMessage("GTT-ANCHORED = CURSOR");
					tooltip:SetOwner(parent, "ANCHOR_CURSOR");
					tooltip.default = nil;
				end
			end
		elseif (TipBuddy_SavedVars["general"].nonunit_anchor == 0) then
	--		-- Or to the cursor
			tooltip:SetOwner(parent, "ANCHOR_NONE");
			tooltip:SetPoint(TipBuddy.xpoint, "TipBuddy_Parent_Frame", "CENTER", 0, 0);
			tooltip.default = nil;	
			TB_AddMessage("GTT-NONUNIT_ANCHOR = 0");
		elseif (TipBuddy_SavedVars["general"].nonunit_anchor == 1) then
			tooltip:SetOwner(parent, "ANCHOR_NONE");
			tooltip:SetPoint(TipBuddy.anchor, "TipBuddy_Parent_Frame", TipBuddy.fanchor, 0, TipBuddy.offset);	
			tooltip.default = nil;	
			TB_AddMessage("GTT-NONUNIT_ANCHOR = xxx");
		elseif (TipBuddy_SavedVars["general"].nonunit_anchor == 2) then
			local oanchor, ganchor, panchor = TipBuddy_GetIconAnchorPos(parent);
			tooltip:ClearAllPoints();
			tooltip:SetOwner(parent, oanchor);
			tooltip:SetPoint(ganchor, parent:GetName(), panchor, 0, 0);
			tooltip.default = nil;	
		end	
		TipBuddy_ForceHide( TipBuddyTooltip );
	end
	TipBuddy.defanch = nil;
end

function TipBuddy_GTT_ClearExtras()
	TipBuddy.gotextras = nil;
	TipBuddy.gtt_xtra = nil;
	TipBuddy.gtt_xtraR = nil;
	TipBuddy.vis = nil;
end

-- hook for GameTooltip_OnShow
function TipBuddy_GameTooltip_OnShow()
	TB_AddMessage(TB_WHT_TXT.."GTT OnShow");
	TipBuddy.xpoint, TipBuddy.xpos, TipBuddy.ypos = TipBuddy_GetFrameCursorOffset();
	TipBuddy.anchor, TipBuddy.fanchor, TipBuddy.offset = TipBuddy_GetFrameAnchorPos();

	if (lGameTooltip_OnShow_Orig) then
		lGameTooltip_OnShow_Orig();	
	end		
	TB_AddMessage(TB_WHT_TXT.."end GTT OnShow");
	if (TipBuddy_SavedVars["general"].reposmods and TipBuddy_SavedVars["general"].reposmods == 1) then
		--this adjusts the xy of the tooltip position ONLY if GameTooltip_SetDefaultAnchor hasn't 
		--been called and then ONLY if it extends off the screen.
		if (TipBuddy.d_own and (TipBuddy.d_own):GetName()) then
			local owner = TipBuddy.d_own or this:GetParent();
			TB_AddMessage("reposmods");
			if (UnitExists("mouseover") or TipBuddy.unitframe == 1) then

			else
				--local x2, y2 = TipBuddy_PositionFrameToCursor();
				if (not TipBuddy.uiwidth or not TipBuddy.uiheight) then
					TipBuddy.uiscale = UIParent:GetScale();
					TipBuddy.uiwidth = UIParent:GetWidth() / TipBuddy.uiscale;
					TipBuddy.uiheight = UIParent:GetHeight() / TipBuddy.uiscale;			
				end	
				if (GameTooltip:IsVisible() and GameTooltip:GetLeft()) then
					local scale = TipBuddy_SavedVars["general"].gtt_scale;
					local left = GameTooltip:GetLeft()* scale;
					local right = GameTooltip:GetRight()* scale;
					local top = GameTooltip:GetTop()* scale;
					local bottom = GameTooltip:GetBottom()* scale;
					local x, y = 0, 0;
					local off = false;
					if (left and left < -4) then
						x = (left * -1)/scale;
						off = true;
					elseif (right and right > TipBuddy.uiwidth+8) then
						x = (TipBuddy.uiwidth - right)/scale;
						off = true;
					end
					if (top and top > TipBuddy.uiheight+16) then
						y = (TipBuddy.uiheight - top)/scale;
						off = true;
					elseif (bottom and bottom < -4) then
						y = (bottom * -1)/scale;
						off = true;
					end
					TB_AddMessage("scale="..scale.."  x="..x.."  -  y="..y.."  -  top="..top.."  -  height="..TipBuddy.uiheight);
					--only readjust it if it extends off the screen
					if (owner and owner:GetName() and off == true) then
						TB_AddMessage("GameTooltip off edge");
						--local _, ganchor, panchor = TipBuddy_GetIconAnchorPos(owner);
						GameTooltip:ClearAllPoints();
						GameTooltip:SetPoint(TipBuddy.d_anch1, owner:GetName(), TipBuddy.d_anch2, x, y);
						--GameTooltip:orgSetPoint(ganchor, owner:GetName(), panchor, 0, 0);
						--/script GameTooltip:ClearAllPoints();GameTooltip:SetPoint(TipBuddy.anchor, this:GetParent():GetName(), TipBuddy.fanchor, 100, 0);
						--GameTooltip.default = nil;				
					end
				end		
				TipBuddy_ForceHide( TipBuddyTooltip );
			end
		end
	end
	if (not UnitExists("mouseover") and TipBuddy.unitframe ~= 1) then
		TipBuddy_SetFrame_BackgroundColor();
		TipBuddy_ForceHide( TipBuddyTooltip );
	end
end

--hook
local originalGameTooltip_OnHide;
originalGameTooltip_OnHide = GameTooltip_OnHide;
function GameTooltip_OnHide()
	originalGameTooltip_OnHide();
	TipBuddy_GTT_ClearExtras();
	TipBuddy.d_own = nil;
	TipBuddy.d_point = nil;
	
	--TipBuddyTooltip:Hide();
	TB_AddMessage("hiding GTT");

	--TipBuddy_TargetBuffs_Update();
	--TipBuddy_ShowRank( TipBuddy.targetType, this.unit );
	--TipBuddy_TargetInfo_ShowFaction( TipBuddy.targetType, this.unit );
end

-- hook for GameTooltip_OnEvent
function TipBuddy_GameTooltip_OnEvent()
	lGameTooltip_OnEvent_Orig(event);
	--TB_AddMessage("GTT_0NEVENT called");
end

-- hook for GameTooltip_SetUnit
function TipBuddy_GameTooltip_SetUnit(this, unit)
	--TB_AddMessage( "SET UNIT!!" )
	TipBuddy_GTT_ClearExtras();
	GameTooltip:orgSetUnit(unit);
end

-- hook for GameTooltip_FadeOut
function TipBuddy_GameTooltip_FadeOut()
	TB_AddMessage( "FadeOut" )
	GameTooltip:orgFadeOut();	
end

-- hook for GameTooltip_SetOwner
function TipBuddy_GameTooltip_SetOwner( this, owner, position, x, y )
	TipBuddy.d_own = nil;
	TipBuddy.d_point = nil;
	GameTooltip:orgSetOwner(owner, position, x, y);	
	TB_AddMessage(TB_WHT_TXT.."SetOwner");
	--if this tooltip has had its default anchor set, then don't modify it any further
	if (TipBuddy_SavedVars["general"].gtt_scale) then
		GameTooltip:SetScale(2);
		local ttScale = TipBuddy_SavedVars["general"].gtt_scale;
		if (EnhancedTooltip and EnhancedTooltip:IsVisible()) then
			ttScale = 1.0;
		end
		TipBuddy_SetEffectiveScale(GameTooltip, ttScale, UIParent);
	end
	if (TipBuddy.defanch) then
		return;	
	end
	--/script if (GameTooltip:IsOwned(BrowseButton1Item)) then TB_AddMessage("0wn3d")end;
	TB_AddMessage(TB_WHT_TXT.."SetOwner Modify");
	if (owner and owner:GetName() and TipBuddy_SavedVars["general"].reposmods and TipBuddy_SavedVars["general"].reposmods == 1) then	
		--need to check for the position because some mods don't set a position
		if (position) then
			TB_AddMessage(position..GetTime());
			position = string.gsub(position, "ANCHOR_", "");
			--TB_AddMessage(position);
			if (TB_ANCHOR[position]) then
				TipBuddy.d_anch1 = TB_ANCHOR[position].a;
				TipBuddy.d_anch2 = TB_ANCHOR[position].b;	
			elseif (position == "NONE") then
				--don't do anything
				return;
			else
				TipBuddy.d_anch1 = "BOTTOMRIGHT";
				TipBuddy.d_anch2 = "BOTTOMLEFT";
			end				
		else
			--if no positioned was passed, use the default position for anchoring
			TipBuddy.d_anch1 = "BOTTOMRIGHT";
			TipBuddy.d_anch2 = "BOTTOMLEFT";
		end
		--TB_AddMessage(owner:GetName());
		TipBuddy.d_own = owner;
		--we have to set the anchor to NONE because otherwise, we can't reposition it with SetPoint
		GameTooltip:orgSetOwner(owner, "ANCHOR_NONE");
		if (not x) then
			x = 0;	
		end
		if (not y) then
			y = 0;	
		end
		GameTooltip:ClearAllPoints();
		GameTooltip:orgSetPoint(TipBuddy.d_anch1, owner:GetName(), TipBuddy.d_anch2, x, y);	
		--TB_AddMessage(TipBuddy.d_anch1);
	end
	TB_AddMessage(TB_WHT_TXT.."endSetOwner");
	--"ANCHOR_NONE"
end

-- hook for GameTooltip_SetPoint
function TipBuddy_GameTooltip_SetPoint( this, pos1, parent, pos2, x, y )
	if (not pos1 or not parent) then
		return;	
	end
	TipBuddy.d_point = 1;
	if (TipBuddy_SavedVars["general"].gtt_scale) then
		TipBuddyTooltip:SetScale(2);	
		TipBuddy_SetEffectiveScale(TipBuddyTooltip, TipBuddy_SavedVars["general"].gtt_scale, UIParent);
		TB_AddMessage("SCALE = "..TipBuddy_SavedVars["general"].gtt_scale);
	end
	GameTooltip:orgSetPoint(pos1, parent, pos2, x, y);
	TB_AddMessage(TB_WHT_TXT.."SetPoint");
end

--/script GameTooltip:AddDoubleLine("text", "something", 1, 0, 1, 0, 0, 1);
function TipBuddy_GameTooltip_AddLine( frame, text, r, g, b, nowrap )
	if (not TipBuddy.targetUnit) then
		TipBuddy.targetUnit = "mouseover";	
	end

	GameTooltip:tborgAddLine(text, r, g, b, nowrap);
	if (not text or text == "") then
		return;	
	end
	--TB_AddMessage("GTTADDLINE!!!!!!!!!:  adding = "..string.gsub(text, " ", "_"));
	if (not TipBuddyTooltip:IsVisible() and not TipBuddy_Main_Frame:IsVisible() and not TipBuddy.vis) then
		if (TipBuddy_SavedVars["general"].blizdefault == 1 and not TipBuddy.gotextras) then
			if (not TipBuddy.gtt_xtra) then
				TipBuddy.gtt_xtra = {};
			end
			for i=1, 32, 1 do
				if (not TipBuddy.gtt_xtra[i]) then
					TipBuddy.gtt_xtra[i.."color"] = {};
					TipBuddy.gtt_xtra[i.."color"].r, TipBuddy.gtt_xtra[i.."color"].g, TipBuddy.gtt_xtra[i.."color"].b = r, g, b;
					TipBuddy.gtt_xtra[i] = text;
					--TB_AddMessage("GTTADDLINE!!!!!!!!!:  adding = "..text);
					break;
				end
			end				
		end
		return;
	end

	if (not TipBuddy.targetType) then
		TipBuddy.targetType = TipBuddy_TargetInfo_GetTargetType( TipBuddy.targetUnit );	
	end
	--TB_AddMessage("GTTADDLINE!!!!!!!!!:  "..TipBuddy.targetType.." = '"..string.gsub(text, " ", "_").."'");

	if (TipBuddy_Main_Frame:IsVisible()) then
		local line;
		for i=1, 20, 1 do	
			line = getglobal("TipBuddy_Xtra"..i.."_Text");
			if (line:GetText() and line:IsShown()) then
				----TB_AddMessage("line:  "..i.." = occupied");
				--return;	
			else
				----TB_AddMessage("line:  "..i.." = free.....setting text: "..text);
				line:SetText(text);
				if (not r) then
					r, g, b = NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b;	
				end
				line:SetTextColor(r, g, b);
				line:Show();
				break;
			end
		end

		TipBuddy_FrameHeights_Initialize(TipBuddy.targetType);
		TipBuddy_SetFrame_Width();		
	else
		if (text == " ") then
			return;	
		end
		TipBuddyTooltip:AddLine(text, r, g, b, nowrap);
		TipBuddyTooltip:Show();
	end

end

--/script GameTooltip:AddDoubleLine("text", "something", 1, 0, 1, 0, 0, 1);
function TipBuddy_GameTooltip_AddDoubleLine( frame, textL, textR, Lr, Lg, Lb, Rr, Rg, Rb )
	if (not TipBuddy.targetUnit) then
		TipBuddy.targetUnit = "mouseover";	
	end

	GameTooltip:tborgAddDoubleLine(textL, textR, Lr, Lg, Lb, Rr, Rg, Rb);
	if (not textL or textL == "") then
		return;	
	end
	--TB_AddMessage("GTTADDDOUBLELINE!!!!!!!!!:  adding = "..textL);
	if (not TipBuddyTooltip:IsVisible() and not TipBuddy_Main_Frame:IsVisible() and not TipBuddy.vis) then
		if (TipBuddy_SavedVars["general"].blizdefault == 1 and not TipBuddy.gotextras) then
			if (not TipBuddy.gtt_xtra) then
				TipBuddy.gtt_xtra = {};
			end
			if (not TipBuddy.gtt_xtraR) then
				TipBuddy.gtt_xtraR = {};
			end
			for i=1, 32, 1 do
				if (not TipBuddy.gtt_xtra[i]) then
					TipBuddy.gtt_xtra[i.."color"] = {};
					TipBuddy.gtt_xtra[i.."color"].r, TipBuddy.gtt_xtra[i.."color"].g, TipBuddy.gtt_xtra[i.."color"].b = Lr, Lg, Lb;
					TipBuddy.gtt_xtra[i] = textL;
					if (textR) then
						TipBuddy.gtt_xtraR[i.."color"] = {};
						TipBuddy.gtt_xtraR[i.."color"].r, TipBuddy.gtt_xtraR[i.."color"].g, TipBuddy.gtt_xtraR[i.."color"].b = Rr, Rg, Rb;
						TipBuddy.gtt_xtraR[i] = textR;
					end	
					--TB_AddMessage("GTTADDDOUBLELINE!!!!!!!!!:  adding = "..textL.." : "..textR);
					break;
				end
			end				
		end
		return;
	end
	if (not TipBuddy.targetType) then
		TipBuddy.targetType = TipBuddy_TargetInfo_GetTargetType( TipBuddy.targetUnit );	
	end
	----TB_AddMessage("GTTADDDOUBLELINE!!!!!!!!!:  "..TipBuddy.targetType.." = "..textL.." : "..textR);

	if (TipBuddy_Main_Frame:IsVisible()) then
		local lineL, lineR;
		for i=1, 20, 1 do	
			lineL = getglobal("TipBuddy_Xtra"..i.."_Text");
			lineR = getglobal("TipBuddy_XtraR"..i.."_Text");
			if (lineL:GetText() and lineL:IsShown()) then
				--return;	
			else
				lineL:SetText(textL);
				if (not Lr) then
					Lr, Lg, Lb = NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b;	
				end
				lineL:SetTextColor(Lr, Lg, Lb);
				lineL:Show();
				lineR:SetText(textR);
				if (not Rr) then
					Rr, Rg, Rb = NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b;	
				end
				lineR:SetTextColor(Rr, Rg, Rb);
				lineR:Show();
				break;		
			end
		end
		TipBuddy_FrameHeights_Initialize(TipBuddy.targetType);
		TipBuddy_SetFrame_Width();
	else
		TipBuddyTooltip:AddDoubleLine(textL, textR, Lr, Lg, Lb, Rr, Rg, Rb);
		TipBuddyTooltip:Show();
		--/script TipBuddyTooltip:AddDoubleLine("what", "the fuck");TipBuddyTooltip:Show();
	end
end


--------------------------------------------------------------------------------------------------------------------------------------
-- UNITFRAME HOOKS
--------------------------------------------------------------------------------------------------------------------------------------
--hook
local originalUnitFrame_OnEnter;
originalUnitFrame_OnEnter = UnitFrame_OnEnter;
function UnitFrame_OnEnter()
	originalUnitFrame_OnEnter();
	this.elapsed = 1.0;

	TipBuddy.unitframe = 1;
	TipBuddy.hasTarget = 1;
	TipBuddy.targetUnit = this.unit;	
	----TB_AddMessage("entering unit frame: "..this.unit);
	--TipBuddy.targetType = TipBuddy_TargetInfo_GetTargetType( this.unit );

	GameTooltip_SetDefaultAnchor(TipBuddyTooltip, this);
	--GameTooltip:SetUnit(this.unit);
	TipBuddy_ShowUnitTooltip(this.unit);
	--/script TipBuddy_ShowUnitTooltip("target");

	-- hiding health and mana bars because they won't update
	if ( TipBuddy_SavedVars[TipBuddy.targetType].off == 1 ) then
		TipBuddy_TargetFrameHealthBar:Hide();
		TipBuddy_TargetFrameManaBar:Hide();
		-- setting frame size again
		TipBuddy_FrameHeights_Initialize(TipBuddy.targetType);
		TipBuddy_SetFrame_Width();
	end
end

--hook
local originalUnitFrame_OnLeave;
originalUnitFrame_OnLeave = UnitFrame_OnLeave;
function UnitFrame_OnLeave()
	originalUnitFrame_OnLeave();
	TipBuddy.unitframe = 0;
	TipBuddy.hasTarget = 0;
	TipBuddy.targetUnit = nil;
	------TB_AddMessage("leaving unit frame");
	TipBuddy.uName = nil;
	TipBuddy.vis = nil;
end

--hook
local originalUnitFrame_OnUpdate;
originalUnitFrame_OnUpdate = UnitFrame_OnUpdate;
function UnitFrame_OnUpdate(elapsed)
	originalUnitFrame_OnUpdate(elapsed);

	if ( TipBuddy.unitframe == 1 and TipBuddyTooltip:IsOwned(this)) then
		this.elapsed = this.elapsed - elapsed;
		if ( this.elapsed <= 0 ) then
			this.elapsed = 1.0;
			--TB_AddMessage(this.unit);

			TipBuddy_ShowUnitTooltip(this.unit, 1);
			-- hiding health and mana bars because they won't update
			TipBuddy_TargetFrameHealthBar:Hide();
			TipBuddy_TargetFrameManaBar:Hide();
			-- setting frame size again
			TipBuddy_FrameHeights_Initialize(TipBuddy.targetType);
			TipBuddy_SetFrame_Width();

			TipBuddy.hasTarget = 1;
			----TB_AddMessage("TipBuddy.hasTarget = 1");
		end
	end
end

--hook
local originalPlayerFrame_OnUpdate;
originalPlayerFrame_OnUpdate = PlayerFrame_OnUpdate;
function PlayerFrame_OnUpdate(elapsed)
	originalPlayerFrame_OnUpdate(elapsed);

	if ( TipBuddy.unitframe == 1 and TipBuddyTooltip:IsOwned(this)) then
		this.elapsed = this.elapsed - elapsed;
		if ( this.elapsed <= 0 ) then
			this.elapsed = 1.0;
			------TB_AddMessage(this.unit);
			TipBuddy_ShowUnitTooltip(this.unit, 1);
			-- hiding health and mana bars because they won't update
			TipBuddy_TargetFrameHealthBar:Hide();
			TipBuddy_TargetFrameManaBar:Hide();
			-- setting frame size again
			TipBuddy_FrameHeights_Initialize(TipBuddy.targetType);
			TipBuddy_SetFrame_Width();
			TipBuddy.hasTarget = 1;
			----TB_AddMessage("TipBuddy.hasTarget = 1");
		end
	end
end
