--[[
-- Name: TinyTip
-- Author: Thrae of Maelstrom (aka "Matthew Carras")
-- Release Date: 6-25-06
--
-- These functions include more extragant features having
-- specifically to do with textures,
-- such as the PvP Rank Icon or buffs and debuffs.
--]]

local _G = getfenv(0)
local GameTooltip, UIParent,GTStatusBar = _G.GameTooltip, _G.UIParent, _G.GameTooltipStatusBar
local fClearAllPoints, fSetPoint, fHide,fShow,fGetScale = UIParent.ClearAllPoints, UIParent.SetPoint, UIParent.Hide, UIParent.Show, UIParent.GetScale
local txSetTexture, txSetTexCoord, txShow, txHide = _G.CharacterFramePortrait.SetTexture, _G.CharacterFramePortrait.SetTexCoord, _G.CharacterFramePortrait.Show, _G.CharacterFramePortrait.Hide
local db,EventFrame,ExtrasFrame
local tooltip = GameTooltip
local gtAddLine = GameTooltip.AddLine
local fsSetText, fsGetText, fsShow, fsHide = _G.GameTooltipTextLeft1.SetText, _G.GameTooltipTextLeft1.GetText, _G.GameTooltipTextLeft1.Show, _G.GameTooltipTextLeft1.Hide
local strformat= string.format

local TextureTable,NumTextures, NumUnusedTextures, BuffFrame, PvPTexture, PvPIconFrame, RTIcon, RTIconFrame

local i,dtable,tmp,tmp2

_G.TinyTipIconsExists = true

local function SetTextureTable(path,count)
	local tx
	if NumUnusedTextures > 0 then
		tx = TextureTable[ (NumTextures - NumUnusedTextures) + 1 ]
		txSetTexture(tx, path)
		if count and count > 0 then fsSetText(tx.fs, count ) else fsHide(tx.fs) end
		txShow(tx)
		NumUnusedTextures = NumUnusedTextures - 1
	else
		NumTextures = NumTextures + 1
		tinsert(TextureTable, BuffFrame:CreateTexture())
		tx = TextureTable[ NumTextures ]
		txSetTexture(tx, path)
		tx.fs = ExtrasFrame:CreateFontString(nil, "ARTWORK", "NumberFontNormal")
		if count and count > 0 then fsSetText(tx.fs, count) else fsHide(tx.fs) end
		fsShow(tx.fs)
		txShow(tx)
	end

	return tx
end

function TinyTipIcons_ResetTextureTable()
	NumUnusedTextures = NumTextures
end

function TinyTipIcons_Init(_db,_EventFrame, _ExtrasFrame, _gtAddLine, _tooltip)
	if _db then db = _db end
	if _EventFrame then EventFrame = _EventFrame end
	if _ExtrasFrame then ExtrasFrame = _ExtrasFrame end
	if _gtAddLine then gtAddLine = _gtAddLine end
	if _tooltip then tooltip = _tooltip end

	if db["PvPIcon"] then
		if not PvPIconFrame then PvPIconFrame = _G.CreateFrame("Frame", nil, ExtrasFrame) PvPIconFrame:Show() end
		if not PvPTexture then PvPTexture = PvPIconFrame:CreateTexture(nil, "ARTWORK") end
		PvPTexture:SetPoint(db["PvPIconAnchor1"] or "TOPRIGHT", tooltip, db["PvPIconAnchor2"] or "TOPLEFT", db["PvPIconOffX"] or 0, db["PvPIconOffY"] or 0)
		txHide(PvPTexture)
		PvPIconFrame:SetScale(db["PvPIconScale"] or 0.7)
	end
	if db["RTIcon"] then
		if not RTIconFrame then
			RTIconFrame = _G.CreateFrame("Frame", nil, ExtrasFrame)
			RTIconFrame:Show()
		end
		RTIconFrame:SetScale(db["RTIconScale"] or 0.1)
		if not RTIcon then
			RTIcon = RTIconFrame:CreateTexture(nil, "ARTWORK")
			txSetTexture(RTIcon, "Interface\\TargetingFrame\\UI-RaidTargetingIcons")
			txHide(RTIcon)
		end
		if db["PvPIcon"] and PvPTexture then 
			RTIcon:SetPoint(db["RTIconAnchor1"] or "TOPLEFT", PvPTexture, db["RTIconAnchor2"] or "BOTTOMLEFT", db["RTIconOffX"] or 0, db["RTIconOffY"] or 0)
		else
			RTIcon:SetPoint(db["RTIconAnchor1"] or "TOPRIGHT", tooltip, db["RTIconAnchor2"] or "TOPLEFT", db["RTIconOffX"] or 0, db["RTIconOffY"] or 0)
		end
	end
	if (db["Buffs"] or db["Debuffs"]) then
		if not BuffFrame then
			BuffFrame = _G.CreateFrame("Frame", nil, ExtrasFrame)
			BuffFrame:Show()
		end
		BuffFrame:SetScale(db["BuffScale"] or 0.2)
		if not TextureTable then
			TextureTable = {}
			NumTextures,NumUnusedTextures = 0,0
		end
	else
		TextureTable = nil
	end
end

function TinyTipIcons_ResetRTIcon(unit,numRaid)
	tmp = GetRaidTargetIndex(unit)
	if numRaid and numRaid > 0 and tmp and tmp > 0 then
		tmp = _G.UnitPopupButtons["RAID_TARGET_" .. tmp] 
		if tmp then
			txSetTexCoord(RTIcon, tmp.tCoordLeft, tmp.tCoordRight, tmp.tCoordTop, tmp.tCoordBottom )
			txShow(RTIcon)
			fShow(ExtrasFrame)
		end
	else
		txHide(RTIcon)
	end
end

function TinyTipIcons_ResetPvPIcon(rank,isplayer)
	if isplayer and rank > 0 then
		txSetTexture(PvPTexture, strformat("%s%02d",
						       "Interface\\PvPRankBadges\\PvPRank",
							rank))
		txShow(PvPTexture)
		fShow(ExtrasFrame)
	else
		txHide(PvPTexture)
	end
end

function TinyTipIcons_HideUnusedTextures()
	local tx
	i = NumUnusedTextures
	while i > 0 do
		tx = TextureTable[ NumTextures - i + 1 ]
		txHide(tx)
		fsHide(tx.fs)
		i = i - 1
	end
end

local lastTx
function TinyTipIcons_ShowBuffs(unit)
	local flag, count = db["Buffs"], 0
	tmp,tmp2 = nil,nil
	if flag then
	if flag == 1 then num = 8
	else num = 32 end
	for i = 1,num,1 do
			tmp,tmp2 = _G.UnitBuff(unit, i, flag ~= 1)
			if tmp then
				count = count + 1
				if flag ~= 3 then
					tmp = SetTextureTable( tmp,tmp2 )
					fClearAllPoints(tmp)
					if count == 1 then
						fSetPoint(tmp, db["BuffAnchor1"] or "BOTTOM", (db["ExtraTooltip"] and _G.TinyTipExtras_Tooltip) or GameTooltip, db["BuffAnchor2"] or "TOPLEFT", db["BuffOffX"] or 0, db["BuffOffY"] or (-2 / fGetScale(UIParent)) )
					else
						fSetPoint(tmp, "LEFT", lastTx, "RIGHT", 0, 0)
					end
					fSetPoint(tmp.fs, "BOTTOM", tmp, "TOP", 0, 0)
					lastTx = tmp
				end
		end
	end
	if flag == 3 and count > 0 then
		gtAddLine( tooltip, strformat("%s %s: (|cFFFFFFFF%d|r)", _G.UnitClass("player"), TinyTipExtrasLocale_Buffs, count) )
	end
	fShow(ExtrasFrame)
end
end
function TinyTipIcons_ShowDebuffs(unit)
	local flag, count = db["Debuffs"], 0
	tmp,tmp2 = nil,nil
	if flag then
	if flag >= 4 then
		if not dtable then dtable = {} end
		for i,_ in TinyTipExtrasLocale_DebuffMap do
			dtable[i] = 0
		end
	end
	if flag == 1 then num = 8 
	else num = 32 end
	for i = 1,num,1 do
		if flag >= 4 and _G.UnitIsFriend(unit,"player") then
			_,_,tmp = _G.UnitDebuff(unit,i,flag ~= 5)
			if tmp then dtable[ tmp ] = dtable[ tmp ] + 1 end
		else
			tmp,tmp2 = _G.UnitDebuff(unit, i, flag ~= 1)
			if tmp then
					count = count + 1
					if flag ~= 3 then
						tmp = SetTextureTable( tmp,tmp2 )
						fClearAllPoints(tmp)
						if count == 1 then
							fSetPoint(tmp, db["DebuffAnchor1"] or "TOP", (db["ManaBar"] and _G.TinyTipExtras_ManaBar) or GTStatusBar, db["DebuffAnchor2"] or "BOTTOMLEFT", db["DebuffOffX"] or 0, db["DebuffOffY"] or (2 / fGetScale(UIParent)) )
						else
							fSetPoint(tmp, "LEFT", lastTx, "RIGHT", 0, 0)
						end
						fSetPoint(tmp.fs, "TOP", tmp, "BOTTOM", 0, 0)
						lastTx = tmp
					end
			end
		end
	end
	if dtable then
		for i,num in dtable do
			if num > 0 then
				gtAddLine(tooltip, strformat( "%s: (|cFFFFFFFF%d|r)", TinyTipExtrasLocale_DebuffMap[ i ], num) )
			end
		end
	elseif flag == 3 and count > 0 then
		gtAddLine(tooltip, strformat("%s: (|cFFFFFFFF%d|r)", TinyTipExtrasLocale_DispellableDebuffs, count) )
	end
	fShow(ExtrasFrame)
end
end
