
do
	local Details = Details
	if (not Details) then
		print ("Details! Not Found.")
		return
	end

	local _
	local DF = _G.DetailsFramework
	local _ipairs = ipairs
	local unpack = _G.unpack
	local gameCooltip = GameCooltip2

	--> minimal details version required to run this plugin
	local MINIMAL_DETAILS_VERSION_REQUIRED = 136
	local COMPARETWO_VERSION = "v1.0.0"

	--> create a plugin object
	local compareTwo = Details:NewPluginObject ("Details_Compare2", _G.DETAILSPLUGIN_ALWAYSENABLED)
	--> just localizing here the plugin's main frame
	local frame = compareTwo.Frame

	--> set the description
	compareTwo:SetPluginDescription("Replaces the default comparison window on the player breakdown.")

	--> when receiving an event from details, handle it here
	local handle_details_event = function (event, ...)

		if (event == "COMBAT_PLAYER_ENTER") then

		elseif (event == "COMBAT_PLAYER_LEAVE") then

		elseif (event == "PLUGIN_DISABLED") then
			--> plugin has been disabled at the details options panel

		elseif (event == "PLUGIN_ENABLED") then
			--> plugin has been enabled at the details options panel

		elseif (event == "DETAILS_DATA_SEGMENTREMOVED") then
			--> old segment got deleted by the segment limit

		elseif (event == "DETAILS_DATA_RESET") then
			--> combat data got wiped

		end
	end

	function compareTwo.InstallAdvancedCompareWindow()

        --colors to use on percent number
		local red = "FFFFAAAA"
		local green = "FFAAFFAA"
		local plus = red .. "-" 
		local minor = green .. "+"

		local comparisonFrameSettings = {
			--main player scroll frame
			mainScrollWidth = 250,
			petColor = "|cFFCCBBBB",

			--spell scroll
			spellScrollHeight = 300,
			spellLineAmount = 14,
			spellLineHeight = 20,

			--target scroll
			targetScrollHeight = 130,
			targetScrollLineAmount = 6,
			targetScrollLineHeight = 20,

			--comparison scrolls
			comparisonScrollWidth = 140,
			targetMaxLines = 16,
			targetTooltipLineHeight = 16,

			--font settings
			fontSize = 10,
			playerNameSize = 12,
			playerNameYOffset = 12,

			--line colors
			lineOnEnterColor = {.85, .85, .85, .5},

			--tooltips
			tooltipBorderColor = {.2, .2, .2, .9},
		}

		local comparisonLineContrast = {{1, 1, 1, .1}, {1, 1, 1, 0}}
		local latestLinesHighlighted = {}
		local comparisonTooltips = {nextTooltip = 0}
		local comparisonTargetTooltips = {nextTooltip = 0}

		local resetTargetComparisonTooltip = function()
			comparisonTargetTooltips.nextTooltip = 0
			for _, tooltip in ipairs (comparisonTargetTooltips) do
				for i = 1, #tooltip.lines do
					local line = tooltip.lines [i]
					line.spellIcon:SetTexture ("")
					line.spellName:SetText ("")
					line.spellAmount:SetText ("")
					line.spellPercent:SetText ("")
					line:Hide()
				end
				
				tooltip:Hide()
				tooltip:ClearAllPoints()
			end
		end
		
		local resetComparisonTooltip = function()
			comparisonTooltips.nextTooltip = 0
			for _, tooltip in ipairs (comparisonTooltips) do
				tooltip:Hide()
				tooltip:ClearAllPoints()
			end
		end
		
		local getTargetComparisonTooltip = function()
			comparisonTargetTooltips.nextTooltip = comparisonTargetTooltips.nextTooltip + 1
			local tooltip = comparisonTargetTooltips [comparisonTargetTooltips.nextTooltip]
			
			if (tooltip) then
				return tooltip
			end
			
			tooltip = CreateFrame ("frame", nil, UIParent, "BackdropTemplate")
			tooltip:SetFrameStrata ("tooltip")
			tooltip:SetSize (1, 1)
			Details.gump:CreateBorder (tooltip)
			tooltip:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true})
			tooltip:SetBackdropColor (.2, .2, .2, .99)
			tooltip:SetBackdropBorderColor (unpack (comparisonFrameSettings.tooltipBorderColor))
			tooltip:SetHeight (77)
			
			local bg_color = {0.5, 0.5, 0.5}
			local bg_texture = [[Interface\AddOns\Details\images\bar_background]]
			local bg_alpha = 1
			local bg_height = 12
			local colors = {{26/255, 26/255, 26/255}, {19/255, 19/255, 19/255}, {26/255, 26/255, 26/255}, {34/255, 39/255, 42/255}, {42/255, 51/255, 60/255}}
			
			--player name label
			tooltip.player_name_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
			tooltip.player_name_label:SetPoint ("bottomleft", tooltip, "topleft", 1, 2)
			tooltip.player_name_label:SetTextColor (1, .7, .1, .834)
			DetailsFramework:SetFontSize (tooltip.player_name_label, 11)
			
			local name_bg = tooltip:CreateTexture (nil, "artwork")
			name_bg:SetTexture (bg_texture)
			name_bg:SetPoint ("bottomleft", tooltip, "topleft", 0, 1)
			name_bg:SetPoint ("bottomright", tooltip, "topright", 0, 1)
			name_bg:SetHeight (bg_height + 2)
			name_bg:SetAlpha (bg_alpha)
			name_bg:SetVertexColor (unpack (colors[2]))
			
			comparisonTargetTooltips [comparisonTargetTooltips.nextTooltip] = tooltip
			
			tooltip.lines = {}
			
			local lineHeight = comparisonFrameSettings.targetTooltipLineHeight
			local fontSize = 10
			
			for i = 1, comparisonFrameSettings.targetMaxLines do
				local line = CreateFrame ("frame", nil, tooltip, "BackdropTemplate")
				line:SetPoint ("topleft", tooltip, "topleft", 0, -(i-1) * (lineHeight + 1))
				line:SetPoint ("topright", tooltip, "topright", 0, -(i-1) * (lineHeight + 1))
				line:SetHeight (lineHeight)
				
				line:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
				line:SetBackdropColor (0, 0, 0, 0.2)
				
				local spellIcon = line:CreateTexture ("$parentIcon", "overlay")
				spellIcon:SetSize (lineHeight -2 , lineHeight - 2)
				
				local spellName = line:CreateFontString ("$parentName", "overlay", "GameFontNormal")
				local spellAmount = line:CreateFontString ("$parentAmount", "overlay", "GameFontNormal")
				local spellPercent = line:CreateFontString ("$parentPercent", "overlay", "GameFontNormal")
				DetailsFramework:SetFontSize (spellName, fontSize)
				DetailsFramework:SetFontSize (spellAmount, fontSize)
				DetailsFramework:SetFontSize (spellPercent, fontSize)
				
				spellIcon:SetPoint ("left", line, "left", 2, 0)
				spellName:SetPoint ("left", spellIcon, "right", 2, 0)
				spellAmount:SetPoint ("right", line, "right", -2, 0)
				spellPercent:SetPoint ("right", line, "right", -40, 0)
				
				spellName:SetJustifyH ("left")
				spellAmount:SetJustifyH ("right")
				spellPercent:SetJustifyH ("right")
				
				line.spellIcon = spellIcon
				line.spellName = spellName
				line.spellAmount = spellAmount
				line.spellPercent = spellPercent
				
				tooltip.lines [#tooltip.lines+1] = line
				
				if (i % 2 == 0) then
					line:SetBackdropColor (unpack (comparisonLineContrast [1]))
					line.BackgroundColor = comparisonLineContrast [1]
				else
					line:SetBackdropColor (unpack (comparisonLineContrast [2]))
					line.BackgroundColor = comparisonLineContrast [2]
				end
			end
			
			return tooltip
		end
		
		local getComparisonTooltip = function()
			comparisonTooltips.nextTooltip = comparisonTooltips.nextTooltip + 1
			local tooltip = comparisonTooltips [comparisonTooltips.nextTooltip]
			
			if (tooltip) then
				return tooltip
			end
			
			tooltip = CreateFrame ("frame", nil, UIParent, "BackdropTemplate")
			tooltip:SetFrameStrata ("tooltip")
			tooltip:SetSize (1, 1)
			Details.gump:CreateBorder (tooltip)
			tooltip:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true})
			tooltip:SetBackdropColor (0, 0, 0, 1)
			tooltip:SetBackdropBorderColor (unpack (comparisonFrameSettings.tooltipBorderColor))
			tooltip:SetHeight (77)
			
			comparisonTooltips [comparisonTooltips.nextTooltip] = tooltip
			
			--prototype
			local y = -3
			local x_start = 2
			
			local bg_color = {0.5, 0.5, 0.5}
			local bg_texture = [[Interface\AddOns\Details\images\bar_background]]
			local bg_alpha = 1
			local bg_height = 12
			local colors = {{26/255, 26/255, 26/255}, {19/255, 19/255, 19/255}, {26/255, 26/255, 26/255}, {34/255, 39/255, 42/255}, {42/255, 51/255, 60/255}}
			
			local background = tooltip:CreateTexture (nil, "border")
			background:SetTexture ([[Interface\SPELLBOOK\Spellbook-Page-1]])
			background:SetTexCoord (.6, 0.1, 0, 0.64453125)
			background:SetVertexColor (0, 0, 0, 0.2)
			background:SetPoint ("topleft", tooltip, "topleft", 0, 0)
			background:SetPoint ("bottomright", tooltip, "bottomright", 0, 0)
			
			--player name label
			tooltip.player_name_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
			tooltip.player_name_label:SetPoint ("bottomleft", tooltip, "topleft", 1, 2)
			tooltip.player_name_label:SetTextColor (1, .7, .1, .834)
			DetailsFramework:SetFontSize (tooltip.player_name_label, 11)
			
			local name_bg = tooltip:CreateTexture (nil, "artwork")
			name_bg:SetTexture (bg_texture)
			name_bg:SetPoint ("bottomleft", tooltip, "topleft", 0, 1)
			name_bg:SetPoint ("bottomright", tooltip, "topright", 0, 1)
			name_bg:SetHeight (bg_height + 2)
			name_bg:SetAlpha (bg_alpha)
			name_bg:SetVertexColor (unpack (colors[2]))
			
			--cast line
			tooltip.casts_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
			tooltip.casts_label:SetPoint ("topleft", tooltip, "topleft", x_start, -2 + (y*0))
			tooltip.casts_label:SetText ("Casts:")
			tooltip.casts_label:SetJustifyH ("left")
			tooltip.casts_label2 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
			tooltip.casts_label2:SetPoint ("topright", tooltip, "topright", -x_start, -2 + (y*0))
			tooltip.casts_label2:SetText ("0")
			tooltip.casts_label2:SetJustifyH ("right")
			tooltip.casts_label3 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
			tooltip.casts_label3:SetPoint ("topright", tooltip, "topright", -x_start - 46, -2 + (y*0))
			tooltip.casts_label3:SetText ("0")
			tooltip.casts_label3:SetJustifyH ("right")
			
			--hits
			tooltip.hits_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
			tooltip.hits_label:SetPoint ("topleft", tooltip, "topleft", x_start, -14 + (y*1))
			tooltip.hits_label:SetText ("Hits:")
			tooltip.hits_label:SetJustifyH ("left")
			tooltip.hits_label2 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
			tooltip.hits_label2:SetPoint ("topright", tooltip, "topright", -x_start, -14 + (y*1))
			tooltip.hits_label2:SetText ("0")
			tooltip.hits_label2:SetJustifyH ("right")
			tooltip.hits_label3 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
			tooltip.hits_label3:SetPoint ("topright", tooltip, "topright", -x_start - 46, -14 + (y*1))
			tooltip.hits_label3:SetText ("0")
			tooltip.hits_label3:SetJustifyH ("right")
			
			--average
			tooltip.average_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
			tooltip.average_label:SetPoint ("topleft", tooltip, "topleft", x_start, -26 + (y*2))
			tooltip.average_label:SetText ("Average:")
			tooltip.average_label:SetJustifyH ("left")
			tooltip.average_label2 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
			tooltip.average_label2:SetPoint ("topright", tooltip, "topright", -x_start, -26 + (y*2))
			tooltip.average_label2:SetText ("0")
			tooltip.average_label2:SetJustifyH ("right")
			tooltip.average_label3 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
			tooltip.average_label3:SetPoint ("topright", tooltip, "topright", -x_start - 46, -26 + (y*2))
			tooltip.average_label3:SetText ("0")
			tooltip.average_label3:SetJustifyH ("right")
			
			--critical
			tooltip.crit_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
			tooltip.crit_label:SetPoint ("topleft", tooltip, "topleft", x_start, -38 + (y*3))
			tooltip.crit_label:SetText ("Critical:")
			tooltip.crit_label:SetJustifyH ("left")
			tooltip.crit_label2 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
			tooltip.crit_label2:SetPoint ("topright", tooltip, "topright", -x_start, -38 + (y*3))
			tooltip.crit_label2:SetText ("0")
			tooltip.crit_label2:SetJustifyH ("right")
			tooltip.crit_label3 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
			tooltip.crit_label3:SetPoint ("topright", tooltip, "topright", -x_start - 46, -38 + (y*3))
			tooltip.crit_label3:SetText ("0")
			tooltip.crit_label3:SetJustifyH ("right")
			
			--uptime
			tooltip.uptime_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
			tooltip.uptime_label:SetPoint ("topleft", tooltip, "topleft", x_start, -50 + (y*4))
			tooltip.uptime_label:SetText ("Uptime:")
			tooltip.uptime_label:SetJustifyH ("left")
			tooltip.uptime_label2 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
			tooltip.uptime_label2:SetPoint ("topright", tooltip, "topright", -x_start, -50 + (y*4))
			tooltip.uptime_label2:SetText ("0")
			tooltip.uptime_label2:SetJustifyH ("right")
			tooltip.uptime_label3 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
			tooltip.uptime_label3:SetPoint ("topright", tooltip, "topright", -x_start - 46, -50 + (y*4))
			tooltip.uptime_label3:SetText ("0")
			tooltip.uptime_label3:SetJustifyH ("right")
			
			for i = 1, 5 do
				local bg_line1 = tooltip:CreateTexture (nil, "artwork")
				bg_line1:SetTexture (bg_texture)
				bg_line1:SetPoint ("topleft", tooltip, "topleft", 0, -2 + (((i-1) * 12) * -1) + (y * (i-1)) + 2)
				bg_line1:SetPoint ("topright", tooltip, "topright", -0, -2 + (((i-1) * 12) * -1)  + (y * (i-1)) + 2)
				bg_line1:SetHeight (bg_height + 4)
				bg_line1:SetAlpha (bg_alpha)
				bg_line1:SetVertexColor (unpack (colors[i]))
			end
			
			return tooltip
		end
		
		--fill the tooltip for the main player being compared
		--actualPlayerName is the name of the player being compared, playerName can be the name of a pet
		local fillMainSpellTooltip = function (line, rawSpellTable, actualPlayerName, playerName)
			local tooltip = getComparisonTooltip()
			local formatFunc = Details:GetCurrentToKFunction()
			local spellId = rawSpellTable.id
			
			tooltip.player_name_label:SetText (Details:GetOnlyName (actualPlayerName))
			
			local fullPercent = "100%"
			local noData = "-"
			
			--amount of casts
			local combatObject = Details:GetCombatFromBreakdownWindow()
			local castAmount = combatObject:GetSpellCastAmount(playerName, GetSpellInfo(spellId))
			local playerMiscObject = combatObject:GetActor(DETAILS_ATTRIBUTE_MISC, playerName)
			
			if (castAmount > 0) then
				tooltip.casts_label2:SetText (fullPercent)
				tooltip.casts_label3:SetText (castAmount)
				DetailsFramework:SetFontColor (tooltip.casts_label2, "gray")
				DetailsFramework:SetFontColor (tooltip.casts_label3, "white")
			else
				tooltip.casts_label2:SetText (noData)
				tooltip.casts_label3:SetText (noData)
				DetailsFramework:SetFontColor (tooltip.casts_label2, "silver")
				DetailsFramework:SetFontColor (tooltip.casts_label3, "silver")
			end
			
			--hit amount
			tooltip.hits_label2:SetText (fullPercent)
			DetailsFramework:SetFontColor (tooltip.hits_label2, "gray")
			tooltip.hits_label3:SetText (rawSpellTable.counter)
			DetailsFramework:SetFontColor (tooltip.hits_label3, "white")
			
			--average
			tooltip.average_label2:SetText (fullPercent)
			DetailsFramework:SetFontColor (tooltip.average_label2, "gray")
			local average = rawSpellTable.total / rawSpellTable.counter
			tooltip.average_label3:SetText (formatFunc (_, average))
			
			--critical strikes
			tooltip.crit_label2:SetText (fullPercent)
			DetailsFramework:SetFontColor (tooltip.crit_label2, "gray")
			tooltip.crit_label3:SetText (rawSpellTable.c_amt)
			
			--uptime
			local uptime = 0
			if (playerMiscObject) then
				local spell = playerMiscObject.debuff_uptime_spells and playerMiscObject.debuff_uptime_spells._ActorTable and playerMiscObject.debuff_uptime_spells._ActorTable [spellId]
				if (spell) then
					local minutos, segundos = floor (spell.uptime / 60), floor (spell.uptime % 60)
					uptime = spell.uptime
					tooltip.uptime_label2:SetText (fullPercent)
					tooltip.uptime_label3:SetText (minutos .. "m " .. segundos .. "s")
					
					DetailsFramework:SetFontColor (tooltip.uptime_label2, "gray")
					DetailsFramework:SetFontColor (tooltip.uptime_label3, "white")
				else
					tooltip.uptime_label2:SetText (noData)
					tooltip.uptime_label3:SetText (noData)
					DetailsFramework:SetFontColor (tooltip.uptime_label2, "gray")
					DetailsFramework:SetFontColor (tooltip.uptime_label3, "gray")
				end
			else
				tooltip.uptime_label2:SetText (noData)
				tooltip.uptime_label3:SetText (noData)
				DetailsFramework:SetFontColor (tooltip.uptime_label2, "gray")
				DetailsFramework:SetFontColor (tooltip.uptime_label3, "gray")
			end
			
			--show tooltip
			tooltip:SetPoint ("bottom", line, "top", 0, 2)
			tooltip:SetWidth (line:GetWidth())
			tooltip:Show()
			
			--highlight line
			line:SetBackdropColor (unpack (comparisonFrameSettings.lineOnEnterColor))
			latestLinesHighlighted [#latestLinesHighlighted + 1] = line
			
			return true, castAmount, rawSpellTable.counter, average, rawSpellTable.c_amt, uptime
		end
		
		local getPercentComparison = function (value1, value2)
			if (value1 == 0 and value2 == 0) then
				return "|c" .. minor .. "0%|r"
			
			elseif (value1 >= value2) then
				local diff = value1 - value2
				local up

				if (diff == 0 or value2 == 0) then --stop div by zero ptr
					up = "0"
				else
					up = diff / value2 * 100
					up = floor (up)
					
					if (up > 999) then
						up = "" .. 999
					end
				end
				
				return "|c" .. minor .. up .. "%|r"
			else
				local diff = value2 - value1
				local down

				if (diff == 0 or value1 == 0) then --stop div by zero ptr
					down = "0"
				else
					down = diff / value1 * 100
					down = floor (down)
					if (down > 999) then
						down = "" .. 999
					end
				end
				
				return "|c" .. plus .. down .. "%|r"
			end		
		end
		
		--fill the tooltip for comparison lines
		--actualPlayerName is the name of the player being compared, playerName can be the name of a pet
		local fillComparisonSpellTooltip = function (line, rawSpellTable, actualPlayerName, playerName, mainCastAmount, mainHitCounter, mainAverageDamage, mainCritAmount, mainAuraUptime)
			local tooltip = getComparisonTooltip()
			local formatFunc = Details:GetCurrentToKFunction()
			local spellId = rawSpellTable.id
			local noData = "-"

			tooltip.player_name_label:SetText(Details:GetOnlyName(actualPlayerName))

			--amount of casts	
			local combatObject = Details:GetCombatFromBreakdownWindow()
			local playerMiscObject = combatObject:GetActor (DETAILS_ATTRIBUTE_MISC, playerName)

			local castAmount = combatObject:GetSpellCastAmount(playerName, GetSpellInfo(spellId))
			if (castAmount > 0) then
				tooltip.casts_label2:SetText (getPercentComparison (mainCastAmount, castAmount))
				tooltip.casts_label3:SetText (castAmount)
				DetailsFramework:SetFontColor (tooltip.casts_label2, "white")
				DetailsFramework:SetFontColor (tooltip.casts_label3, "white")
			else
				tooltip.casts_label2:SetText (noData)
				tooltip.casts_label3:SetText (noData)
				DetailsFramework:SetFontColor (tooltip.casts_label2, "silver")
				DetailsFramework:SetFontColor (tooltip.casts_label3, "silver")
			end
			
			--hits
			tooltip.hits_label2:SetText (getPercentComparison (mainHitCounter, rawSpellTable.counter))
			tooltip.hits_label3:SetText (rawSpellTable.counter)
			DetailsFramework:SetFontColor (tooltip.hits_label2, "white")
			DetailsFramework:SetFontColor (tooltip.hits_label3, "white")
			
			--average
			local average = rawSpellTable.total / rawSpellTable.counter
			tooltip.average_label2:SetText (getPercentComparison (mainAverageDamage, average))
			tooltip.average_label3:SetText (formatFunc (_, average))
			DetailsFramework:SetFontColor (tooltip.average_label3, "white")
			DetailsFramework:SetFontColor (tooltip.average_label2, "white")
			
			--critical strikes
			tooltip.crit_label2:SetText (getPercentComparison (mainCritAmount, rawSpellTable.c_amt))
			tooltip.crit_label3:SetText (rawSpellTable.c_amt)
			DetailsFramework:SetFontColor (tooltip.crit_label2, "white")
			DetailsFramework:SetFontColor (tooltip.crit_label2, "white")
			
			--uptime
			local uptime = 0
			if (playerMiscObject) then
				local spell = playerMiscObject.debuff_uptime_spells and playerMiscObject.debuff_uptime_spells._ActorTable and playerMiscObject.debuff_uptime_spells._ActorTable [spellId]
				if (spell) then
					local minutos, segundos = floor (spell.uptime / 60), floor (spell.uptime % 60)
					uptime = spell.uptime
					tooltip.uptime_label2:SetText (getPercentComparison (mainAuraUptime, uptime))
					tooltip.uptime_label3:SetText (minutos .. "m " .. segundos .. "s")
					
					DetailsFramework:SetFontColor (tooltip.uptime_label2, "white")
					DetailsFramework:SetFontColor (tooltip.uptime_label3, "white")
				else
					tooltip.uptime_label2:SetText (noData)
					tooltip.uptime_label3:SetText (noData)
					DetailsFramework:SetFontColor (tooltip.uptime_label2, "gray")
					DetailsFramework:SetFontColor (tooltip.uptime_label3, "gray")
				end
			else
				tooltip.uptime_label2:SetText (noData)
				tooltip.uptime_label3:SetText (noData)
				DetailsFramework:SetFontColor (tooltip.uptime_label2, "gray")
				DetailsFramework:SetFontColor (tooltip.uptime_label3, "gray")
			end
			
			--show tooltip
			tooltip:SetPoint ("bottom", line, "top", 0, 2)
			tooltip:SetWidth (line:GetWidth())
			tooltip:Show()
			
			--highlight line
			line:SetBackdropColor (unpack (comparisonFrameSettings.lineOnEnterColor))
			latestLinesHighlighted [#latestLinesHighlighted + 1] = line
		end
		
		local comparisonLineOnEnter = function (self)
			local scrollFrame = self:GetParent()
			local frame = scrollFrame:GetParent()
			
			if (not frame.GetPlayerInfo) then
				frame = frame:GetParent()
			end
		
			--check if this is a spell or a target line
			if (self.lineType == "mainPlayerSpell" or self.lineType == "comparisonPlayerSpell") then
			
				--get data
				local spellTable = self.spellTable
				local isPet = spellTable.npcId
				local npcId = spellTable.npcId
				local spellId = spellTable.spellId
				
				local mainPlayerObject = frame.GetMainPlayerObject()
				local mainSpellTable = frame.GetMainSpellTable()
				local allComparisonFrames = frame.GetAllComparisonFrames()
				
				local mainFrameScroll = frame.mainFrameScroll
				local playerObject, playerName = frame.GetPlayerInfo (scrollFrame)
				
				--store the spell information from the main tooltip
				local mainHasTooltip, castAmount, hitCounter, averageDamage, critAmount, auraUptime
				
				--iterate on the main player scroll and find the line
				local mainFrameLines = mainFrameScroll:GetFrames()
				for i = 1, #mainFrameLines do 
					local line = mainFrameLines [i]
					if (line.spellTable and line:IsShown()) then
						if (isPet) then
							if (line.spellTable.spellId == spellId and line.spellTable.npcId == npcId) then
								--main line for the hover over spell
								local rawSpellTable = line.spellTable.rawSpellTable
								mainHasTooltip, castAmount, hitCounter, averageDamage, critAmount, auraUptime = fillMainSpellTooltip (line, rawSpellTable, mainPlayerObject:Name(), line.spellTable.originalName)
								break
							end
						else
							if (line.spellTable.spellId == spellId and not line.spellTable.npcId) then
								--main line for the hover over spell
								local rawSpellTable = line.spellTable.rawSpellTable
								mainHasTooltip, castAmount, hitCounter, averageDamage, critAmount, auraUptime = fillMainSpellTooltip (line, rawSpellTable, mainPlayerObject:Name(), mainPlayerObject:Name())
								break
							end
						end
					end
				end
				
				if (mainHasTooltip) then
					--iterate among all other comparison scrolls
					for i = 1, #allComparisonFrames do
						local comparisonFrame = allComparisonFrames [i]
						if (comparisonFrame:IsShown()) then
							local scrollFrame = comparisonFrame.spellsScroll
							local playerObject, playerName = frame.GetPlayerInfo (comparisonFrame)
							
							local frameLines = scrollFrame:GetFrames()
							for i = 1, #frameLines do 
								local line = frameLines [i]
								if (line.spellTable and line:IsShown() and line.spellTable.rawSpellTable) then
									if (isPet) then
										if (line.spellTable.spellId == spellId and line.spellTable.npcId == npcId) then
											--line for the hover over spell in a comparison scroll frame
											local rawSpellTable = line.spellTable.rawSpellTable
											fillComparisonSpellTooltip (line, rawSpellTable, playerName, line.spellTable.originalName, castAmount, hitCounter, averageDamage, critAmount, auraUptime)
										end
									else
										if (line.spellTable.spellId == spellId and not line.spellTable.npcId) then
											--line for the hover over spell in a comparison scroll frame
											local rawSpellTable = line.spellTable.rawSpellTable
											fillComparisonSpellTooltip (line, rawSpellTable, playerName, playerName, castAmount, hitCounter, averageDamage, critAmount, auraUptime)
										end
									end
								end
							end
						end
					end
				end
				
				
				
				
			elseif (self.lineType == "mainPlayerTarget" or self.lineType == "comparisonPlayerTarget") then
				
				local targetName = self.targetTable.originalName
				local attribute = Details:GetDisplayTypeFromBreakdownWindow()
				
				--build a list of spells used by the main actor
				local mainPlayerObject = frame.GetMainPlayerObject()
				local damageDoneBySpell = {}
				
				--find the main line
				--iterate on the main player scroll and find the line
				local mainLine
				local mainFrameScroll = frame.targetFrameScroll
				local mainFrameLines = mainFrameScroll:GetFrames()
				
				for i = 1, #mainFrameLines do 
					local line = mainFrameLines [i]
					if (line.targetTable and line:IsShown()) then
						if (line.targetTable.originalName == targetName) then
							mainLine = line
							break
						end
					end
				end
				
				if (not mainLine) then
					return
				end
				
				--spells
				for spellId, spellTable in pairs (mainPlayerObject:GetActorSpells()) do
					local damageOnTarget = spellTable.targets [targetName]
					if (damageOnTarget and damageOnTarget > 0) then
						damageDoneBySpell [#damageDoneBySpell + 1] = {spellTable, damageOnTarget, mainPlayerObject:Name(), mainPlayerObject, false}
					end
				end
				
				--pets
				for _, petName in ipairs (mainPlayerObject:Pets()) do
					local petObject = Details:GetCombatFromBreakdownWindow():GetActor (attribute, petName)
					if (petObject) then
						for spellId, spellTable in pairs (petObject:GetActorSpells()) do
							local damageOnTarget = spellTable.targets [targetName]
							if (damageOnTarget and damageOnTarget > 0) then
								damageDoneBySpell [#damageDoneBySpell + 1] = {spellTable, damageOnTarget, petName, petObject, DetailsFramework:GetNpcIdFromGuid (petObject.serial)}
							end
						end
					end
				end
				
				table.sort (damageDoneBySpell, DetailsFramework.SortOrder2)

				local tooltip = getTargetComparisonTooltip()
				local formatFunc = Details:GetCurrentToKFunction()
				local mainHasTooltip = false
				tooltip.player_name_label:SetText (mainPlayerObject:GetDisplayName())
				
				for i = 1, #damageDoneBySpell do
					local damageTable = damageDoneBySpell [i]
					local spellTable = damageTable [1]
					local damageDone = damageTable [2]
					local actorName = damageTable [3]
					local actorObject = damageTable [4]
					local npcId = damageTable [5]
					
					local spellName, _, spellIcon = Details.GetSpellInfo (spellTable.id)
					
					local line = tooltip.lines [i]
					if (not line) then
						break
					end
					
					if (npcId) then
						spellName = spellName .. " (" .. comparisonFrameSettings.petColor .. actorName:gsub (" <.*", "") .. "|r)"
					end
					
					line.spellName:SetText (spellName)
					DetailsFramework:TruncateText (line.spellName, mainFrameScroll:GetWidth() - 110)
					
					line.spellIcon:SetTexture (spellIcon)
					line.spellIcon:SetTexCoord (.1, .9, .1, .9)
					line.spellAmount:SetText ("100%")
					DetailsFramework:SetFontColor (line.spellAmount, "gray")
					line.spellPercent:SetText (formatFunc (_, damageDone))
					
					line:Show()
					mainHasTooltip = true
				end
				
				--comparison
				if (mainHasTooltip) then
					local allComparisonFrames = frame.GetAllComparisonFrames()
					local combatObject = Details:GetCombatFromBreakdownWindow()
					
					--iterate among all other comparison scrolls
					for i = 1, #allComparisonFrames do
						local comparisonFrame = allComparisonFrames [i]
						if (comparisonFrame:IsShown()) then
							local scrollFrame = comparisonFrame.targetsScroll
							local playerObject, playerName = frame.GetPlayerInfo (comparisonFrame)
							
							local targetLines = scrollFrame:GetFrames()
							for o = 1, #targetLines do
								local line = targetLines [o]
								if (line and line.targetTable and line:IsShown()) then
									if (line.targetTable.originalName == targetName) then
										
										--get a tooltip for this actor
										local actorTooltip = getTargetComparisonTooltip()
										
										actorTooltip:SetPoint ("bottom", line, "top", 0, 2)
										actorTooltip:SetWidth (line:GetWidth())
										actorTooltip:SetHeight (min (comparisonFrameSettings.targetMaxLines, #damageDoneBySpell) * comparisonFrameSettings.targetTooltipLineHeight + comparisonFrameSettings.targetMaxLines)
										actorTooltip:Show()
										
										actorTooltip.player_name_label:SetText (playerObject:GetDisplayName())
										
										--highlight line
										line:SetBackdropColor (unpack (comparisonFrameSettings.lineOnEnterColor))
										latestLinesHighlighted [#latestLinesHighlighted + 1] = line
										
										--iterate among all spells in the first tooltip and fill here
										--if is a pet line, need to get the data from the player pet instead
										
										
										for a = 1, #damageDoneBySpell do
											local damageTable = damageDoneBySpell [a]
											local spellTable = damageTable [1]
											local damageDone = damageTable [2]
											local actorName = damageTable [3]
											local actorObject = damageTable [4]
											local npcId = damageTable [5]
											
											local foundSpell
											
											-- i is also the tooltip line index
											
											if (not npcId) then
												local spellObject = playerObject:GetSpell (spellTable.id)
												if (spellObject) then
													local damageOnTarget = spellObject.targets [targetName] or 0
													if (damageOnTarget > 0) then
														--this actor did damage on this target, add into the tooltip
														local tooltipLine = actorTooltip.lines [a]
														if (not tooltipLine) then
															break
														end
														
														local spellName, _, spellIcon = Details.GetSpellInfo (spellTable.id)
														
														tooltipLine.spellName:SetText ("")
														tooltipLine.spellIcon:SetTexture (spellIcon)
														tooltipLine.spellIcon:SetTexCoord (.1, .9, .1, .9)
														
														-- calculate percent 
														local mainSpellDamageOnTarget = 0
														-- find this spell in the main actor table
														for u = 1, #damageDoneBySpell do
															local mainSpell = damageDoneBySpell [u]

															local spellTableMain = damageTable [1]
															local damageDoneMain = damageTable [2]
															local actorNameMain = damageTable [3]
															local actorObjectMain = damageTable [4]
															local npcIdMain = damageTable [5]
															
															if (not npcIdMain and spellTableMain.id == spellObject.id) then
																--found the spell in the main table
																mainSpellDamageOnTarget = damageDoneMain
																break
															end
														end
														
														tooltipLine.spellAmount:SetText (getPercentComparison (mainSpellDamageOnTarget, damageOnTarget))
														tooltipLine.spellPercent:SetText (formatFunc (_, damageOnTarget))
														
														tooltipLine:Show()
														foundSpell = true
													end
												end
											else
												--iterate among all pets the player has and find one with the same npcId
												for _, petName in ipairs (playerObject:Pets()) do
													local petObject = combatObject:GetActor (attribute, petName)
													if (petObject) then
														local petNpcId = DetailsFramework:GetNpcIdFromGuid (petObject.serial)
														if (petNpcId and petNpcId == npcId) then
															--found the correct pet
															local spellObject = petObject:GetSpell (spellTable.id)
															if (spellObject) then
																local damageOnTarget = spellObject.targets [targetName] or 0
																if (damageOnTarget > 0) then
																	--this pet did damage on this target, add into the tooltip

																	local tooltipLine = actorTooltip.lines [a]
																	if (not tooltipLine) then
																		break
																	end
																	
																	-- calculate percent 
																	local mainSpellDamageOnTarget = 0
																	-- find this spell in the main actor table
																	for u = 1, #damageDoneBySpell do
																		local mainSpell = damageDoneBySpell [u]

																		local spellTableMain = damageTable [1]
																		local damageDoneMain = damageTable [2]
																		local actorNameMain = damageTable [3]
																		local actorObjectMain = damageTable [4]
																		local npcIdMain = damageTable [5]
																		
																		if (npcIdMain and npcIdMain == petNpcId and spellTableMain.id == spellObject.id) then
																			--found the spell in the main table
																			mainSpellDamageOnTarget = damageDoneMain
																			break
																		end
																	end
																	
																	local spellName, _, spellIcon = Details.GetSpellInfo (spellTable.id)
																	
																	tooltipLine.spellName:SetText ("")
																	tooltipLine.spellIcon:SetTexture (spellIcon)
																	tooltipLine.spellIcon:SetTexCoord (.1, .9, .1, .9)
																	tooltipLine.spellAmount:SetText (getPercentComparison (mainSpellDamageOnTarget, damageOnTarget))
																	tooltipLine.spellPercent:SetText (formatFunc (_, damageOnTarget))
																	
																	tooltipLine:Show()
																	foundSpell = true
																end
															end
														end
													end
												end

											end
											
											if (not foundSpell) then
												--add an empty line in the tooltip
												local tooltipLine = actorTooltip.lines [a]
												if (tooltipLine) then
													tooltipLine:Show()
												end
											end
										end
										
										--break the loop to find the correct line
										break
									end
								end
							end
						end
					end
				end
				
				--highlight line
				mainLine:SetBackdropColor (unpack (comparisonFrameSettings.lineOnEnterColor))
				latestLinesHighlighted [#latestLinesHighlighted + 1] = mainLine
				
				tooltip:SetPoint ("bottom", mainLine, "top", 0, 2)
				tooltip:SetWidth (mainLine:GetWidth())
				tooltip:SetHeight (min (comparisonFrameSettings.targetMaxLines, #damageDoneBySpell) * comparisonFrameSettings.targetTooltipLineHeight + comparisonFrameSettings.targetMaxLines)
				tooltip:Show()
			end
		end
		
		local comparisonLineOnLeave = function (self)
			for i = #latestLinesHighlighted, 1, -1 do
				local line = latestLinesHighlighted [i]
				line:SetBackdropColor (unpack (line.BackgroundColor))
				tremove (latestLinesHighlighted, i)
			end
			
			resetComparisonTooltip()
			resetTargetComparisonTooltip()
		end

		local playerComparisonCreate = function (tab, frame)
			
			frame.isComparisonTab = true
			
			--regular functions for comparison API
			function frame.GetMainPlayerName()
				return frame.mainPlayerObject:Name()
			end
			function frame.GetMainPlayerObject()
				return frame.mainPlayerObject
			end
			
			function frame.GetMainSpellTable()
				return frame.mainSpellTable
			end
			function frame.GetMainTargetTable()
				return frame.mainTargetTable
			end
			
			function frame.GetAllComparisonFrames()
				return frame.comparisonFrames
			end
			
			function frame.GetPlayerInfo (f)
				if (f.mainPlayerObject) then
					return f.mainPlayerObject, f.mainPlayerObject:Name()
				else
					return f.playerObject, f.playerObject:Name()
				end
			end
			
			--main player spells (scroll box with the spells the player used)
			local mainPlayerCreateline = function (self, index)
				local lineHeight = self.lineHeight
				local lineWidth = self.scrollWidth
				local fontSize = self.fontSize
				
				local line = CreateFrame ("button", "$parentLine" .. index, self, "BackdropTemplate")
				line:SetPoint ("topleft", self, "topleft", 1, -((index-1) * (lineHeight+1)))
				line:SetSize (lineWidth -2, lineHeight)
				
				line:SetScript ("OnEnter", comparisonLineOnEnter)
				line:SetScript ("OnLeave", comparisonLineOnLeave)
				
				line:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
				line:SetBackdropColor (0, 0, 0, 0.2)
				
				local spellIcon = line:CreateTexture ("$parentIcon", "overlay")
				spellIcon:SetSize (lineHeight -2 , lineHeight - 2)
				
				local spellName = line:CreateFontString ("$parentName", "overlay", "GameFontNormal")
				local spellAmount = line:CreateFontString ("$parentAmount", "overlay", "GameFontNormal")
				local spellPercent = line:CreateFontString ("$parentPercent", "overlay", "GameFontNormal")
				DetailsFramework:SetFontSize (spellName, fontSize)
				DetailsFramework:SetFontSize (spellAmount, fontSize)
				DetailsFramework:SetFontSize (spellPercent, fontSize)
				
				spellIcon:SetPoint ("left", line, "left", 2, 0)
				spellName:SetPoint ("left", spellIcon, "right", 2, 0)
				spellAmount:SetPoint ("right", line, "right", -2, 0)
				spellPercent:SetPoint ("right", line, "right", -40, 0)
				
				spellName:SetJustifyH ("left")
				spellAmount:SetJustifyH ("right")
				spellPercent:SetJustifyH ("right")
				
				line.spellIcon = spellIcon
				line.spellName = spellName
				line.spellAmount = spellAmount
				line.spellPercent = spellPercent
				
				return line
			end

			--the refresh function receives an already prepared table and just update the lines
			local mainPlayerRefreshSpellScroll = function (self, data, offset, totalLines)
				for i = 1, totalLines do
					local index = i + offset
					local spellTable = data [index]
					
					if (spellTable) then
						local line = self:GetLine (i)
						
						--store the line into the spell table
						spellTable.line = line
						line.spellTable = spellTable
						
						local spellId = spellTable.spellId
						local spellName = spellTable.spellName
						local spellIcon = spellTable.spellIcon
						local amountDone = spellTable.amount
						
						line.spellId = spellId
						
						line.spellIcon:SetTexture (spellIcon)
						line.spellIcon:SetTexCoord (.1, .9, .1, .9)
						
						line.spellName:SetText (spellName)
						DetailsFramework:TruncateText (line.spellName, line:GetWidth() - 70)
						
						local formatFunc = Details:GetCurrentToKFunction()
						line.spellAmount:SetText (formatFunc (_, amountDone))

						if (i % 2 == 0) then
							line:SetBackdropColor (unpack (comparisonLineContrast [1]))
							line.BackgroundColor = comparisonLineContrast [1]
						else
							line:SetBackdropColor (unpack (comparisonLineContrast [2]))
							line.BackgroundColor = comparisonLineContrast [2]
						end
					end
				end
			end
			
			local mainPlayerRefreshTargetScroll = function (self, data, offset, totalLines)
				for i = 1, totalLines do
					local index = i + offset
					local targetTable = data [index]
					
					if (targetTable) then
						local line = self:GetLine (i)
						
						--store the line into the target table
						targetTable.line = line
						line.targetTable = targetTable
						
						local targetName = targetTable.targetName
						local amountDone = targetTable.amount
						
						line.targetName = targetName
						
						line.spellIcon:SetTexture ("") --todo - fill this texture
						line.spellIcon:SetTexCoord (.1, .9, .1, .9)
						
						line.spellName:SetText (targetName)
						DetailsFramework:TruncateText (line.spellName, line:GetWidth() - 50)
						
						local formatFunc = Details:GetCurrentToKFunction()
						line.spellAmount:SetText (formatFunc (_, amountDone))

						if (i % 2 == 0) then
							line:SetBackdropColor (unpack (comparisonLineContrast [1]))
							line.BackgroundColor = comparisonLineContrast [1]
						else
							line:SetBackdropColor (unpack (comparisonLineContrast [2]))
							line.BackgroundColor = comparisonLineContrast [2]
						end
					end
				end
			end
			
			--main player spells scroll
			local mainPlayerFrameScroll = DetailsFramework:CreateScrollBox (frame, "$parentComparisonMainPlayerSpellsScroll", mainPlayerRefreshSpellScroll, {}, comparisonFrameSettings.mainScrollWidth, comparisonFrameSettings.spellScrollHeight, comparisonFrameSettings.spellLineAmount, comparisonFrameSettings.spellLineHeight)
			mainPlayerFrameScroll:SetPoint ("topleft", frame, "topleft", 5, -30)
			mainPlayerFrameScroll.lineHeight = comparisonFrameSettings.spellLineHeight
			mainPlayerFrameScroll.scrollWidth = comparisonFrameSettings.mainScrollWidth
			mainPlayerFrameScroll.fontSize = comparisonFrameSettings.fontSize
			
			mainPlayerFrameScroll:HookScript ("OnVerticalScroll", function (self, offset) 
				frame.RefreshAllComparisonScrollFrames()
			end)			
			
			--create lines
			for i = 1, comparisonFrameSettings.spellLineAmount do 
				local line = mainPlayerFrameScroll:CreateLine (mainPlayerCreateline)
				line.lineType = "mainPlayerSpell"
			end
			DetailsFramework:ReskinSlider (mainPlayerFrameScroll)
			
			frame.mainFrameScroll = mainPlayerFrameScroll
			
			--main player targets (scroll box with enemies the player applied damage)
			local mainTargetFrameScroll = DetailsFramework:CreateScrollBox (frame, "$parentComparisonMainPlayerTargetsScroll", mainPlayerRefreshTargetScroll, {}, comparisonFrameSettings.mainScrollWidth, comparisonFrameSettings.targetScrollHeight, comparisonFrameSettings.targetScrollLineAmount, comparisonFrameSettings.targetScrollLineHeight)
			mainTargetFrameScroll:SetPoint ("topleft", mainPlayerFrameScroll, "bottomleft", 0, -20)
			mainTargetFrameScroll.lineHeight = comparisonFrameSettings.targetScrollLineHeight
			mainTargetFrameScroll.scrollWidth = comparisonFrameSettings.mainScrollWidth
			mainTargetFrameScroll.fontSize = comparisonFrameSettings.fontSize
			
			--create lines
			for i = 1, comparisonFrameSettings.targetScrollLineAmount do 
				local line = mainTargetFrameScroll:CreateLine (mainPlayerCreateline)
				line.lineType = "mainPlayerTarget"
			end
			DetailsFramework:ReskinSlider (mainTargetFrameScroll)
			
			frame.targetFrameScroll = mainTargetFrameScroll

			--main player name
			frame.mainPlayerName = DetailsFramework:CreateLabel (mainPlayerFrameScroll)
			frame.mainPlayerName:SetPoint ("topleft", mainPlayerFrameScroll, "topleft", 2, comparisonFrameSettings.playerNameYOffset)
			frame.mainPlayerName.fontsize = comparisonFrameSettings.playerNameSize
			
			--create the framework for the comparing players
			local settings = {
				--comparison frame
				height = 600,
			}
			
			frame.comparisonFrames = {}
			frame.comparisonScrollFrameIndex = 0
			
			function frame.ResetComparisonFrames()
				frame.comparisonScrollFrameIndex = 0
				for _, comparisonFrame in ipairs (frame.comparisonFrames) do
					comparisonFrame:Hide()
					comparisonFrame.playerObject = nil
					comparisonFrame.spellsScroll.playerObject = nil
				end
			end
			
			local comparisonPlayerRefreshTargetScroll  = function (self, data, offset, totalLines)
				offset = FauxScrollFrame_GetOffset (mainPlayerFrameScroll)
				
				for i = 1, totalLines do
					local index = i + offset
					local targetTable = data [index]
					
					if (targetTable) then
						local line = self:GetLine (i)
						line:SetWidth (comparisonFrameSettings.comparisonScrollWidth - 2)
						
						--store the line into the target table
						targetTable.line = line
						line.targetTable = targetTable
						
						line.spellIcon:SetTexture ("")
						
						local mainPlayerAmount = targetTable.mainTargetAmount
						local amountDone = targetTable.amount
						
						if (mainPlayerAmount) then
							local formatFunc = Details:GetCurrentToKFunction()
							
							if (mainPlayerAmount > amountDone) then
								local diff = mainPlayerAmount - amountDone
								local up = diff / amountDone * 100
								up = floor (up)
								if (up > 999) then
									up = "" .. 999
								end
								
								line.spellPercent:SetText ("|c" .. minor .. up .. "%|r")
							else
								local diff = amountDone - mainPlayerAmount
								local down = diff / mainPlayerAmount * 100
								down = floor (down)
								if (down > 999) then
									down = "" .. 999
								end
								
								line.spellPercent:SetText ("|c" .. plus .. down .. "%|r")
							end
							
							line.spellAmount:SetText (formatFunc (_, amountDone))
						else
							line.spellPercent:SetText ("")
							line.spellAmount:SetText ("")
						end

						if (i % 2 == 0) then
							line:SetBackdropColor (unpack (comparisonLineContrast [1]))
							line.BackgroundColor = comparisonLineContrast [1]
						else
							line:SetBackdropColor (unpack (comparisonLineContrast [2]))
							line.BackgroundColor = comparisonLineContrast [2]
						end
					end
				end
			end
			
			--refresh a spell scroll on a comparison frame
			local comparisonPlayerRefreshSpellScroll = function (self, data, offset, totalLines)
			
				offset = FauxScrollFrame_GetOffset (mainPlayerFrameScroll)
			
				for i = 1, totalLines do
					local index = i + offset
					local spellTable = data[index]
					
					if (spellTable) then
						local line = self:GetLine(i)
						line:SetWidth(comparisonFrameSettings.comparisonScrollWidth - 2)
						
						--store the line into the spell table
						spellTable.line = line
						line.spellTable = spellTable
						
						local spellId = spellTable.spellId
						local spellName = spellTable.spellName
						local spellIcon = spellTable.spellIcon
						local amountDone = spellTable.amount
						
						line.spellId = spellId
						
						line.spellIcon:SetTexture(spellIcon)
						line.spellIcon:SetTexCoord(.1, .9, .1, .9)
						
						line.spellName:SetText("") --won't show the spell name, only the icon
						
						local percent = 1
						
						local mainFrame = self:GetParent().mainPlayer
						local mainSpellTable = self:GetParent().mainSpellTable
						local mainPlayerAmount = spellTable.mainSpellAmount
						
						if (mainPlayerAmount) then
							local formatFunc = Details:GetCurrentToKFunction()
							
							if (mainPlayerAmount > amountDone) then
								local diff = mainPlayerAmount - amountDone
								local up

								if (diff == 0 or mainPlayerAmount == 0) then --stop div by zero ptr
									up = "0"
								else
									up = diff / amountDone * 100
									up = floor (up)
									if (up > 999) then
										up = "" .. 999
									end
								end
								
								line.spellPercent:SetText ("|c" .. minor .. up .. "%|r")
							else
								local down
								local diff = amountDone - mainPlayerAmount
								if (diff == 0 or mainPlayerAmount == 0) then --stop div by zero ptr
									down = "0"
								else
									down = diff / mainPlayerAmount * 100
									down = floor(down)
									if (down > 999) then
										down = "" .. 999
									end
								end
								
								line.spellPercent:SetText("|c" .. plus .. down .. "%|r")
							end
							
							line.spellAmount:SetText(formatFunc(_, amountDone))
						else
							line.spellPercent:SetText("")
							line.spellAmount:SetText("")
						end

						if (i % 2 == 0) then
							line:SetBackdropColor (unpack (comparisonLineContrast [1]))
							line.BackgroundColor = comparisonLineContrast [1]
						else
							line:SetBackdropColor (unpack (comparisonLineContrast [2]))
							line.BackgroundColor = comparisonLineContrast [2]
						end
					end
				end
			end			
			
			function frame.RefreshAllComparisonScrollFrames()
				for _, comparisonFrame in ipairs (frame.comparisonFrames) do
					comparisonFrame.spellsScroll:Refresh()
				end
			end
			
			--get a frame which has two scrolls, one for spells and another for targets
			function frame.GetComparisonScrollFrame()
				frame.comparisonScrollFrameIndex = frame.comparisonScrollFrameIndex + 1
				
				local comparisonFrame = frame.comparisonFrames [frame.comparisonScrollFrameIndex]
				if (comparisonFrame) then
					comparisonFrame:Show()
					return comparisonFrame
				end
				
				local newComparisonFrame = CreateFrame ("frame", "DetailsComparisonFrame" .. frame.comparisonScrollFrameIndex, frame, "BackdropTemplate")
				frame.comparisonFrames [frame.comparisonScrollFrameIndex] = newComparisonFrame
				newComparisonFrame:SetSize (comparisonFrameSettings.comparisonScrollWidth, settings.height)
				
				if (frame.comparisonScrollFrameIndex == 1) then
					newComparisonFrame:SetPoint ("topleft", mainPlayerFrameScroll, "topright", 30, 0)
				else
					newComparisonFrame:SetPoint ("topleft", frame.comparisonFrames [frame.comparisonScrollFrameIndex - 1], "topright", 10, 0)
				end
				
				--create the spell comparison scroll
					--player name
					newComparisonFrame.playerName = DetailsFramework:CreateLabel (newComparisonFrame)
					newComparisonFrame.playerName:SetPoint ("topleft", newComparisonFrame, "topleft", 2, comparisonFrameSettings.playerNameYOffset)
					newComparisonFrame.playerName.fontsize = comparisonFrameSettings.playerNameSize
					
					--spells scroll
					local spellsScroll = DetailsFramework:CreateScrollBox (newComparisonFrame, "$parentComparisonPlayerSpellsScroll", comparisonPlayerRefreshSpellScroll, {}, comparisonFrameSettings.comparisonScrollWidth, comparisonFrameSettings.spellScrollHeight, comparisonFrameSettings.spellLineAmount, comparisonFrameSettings.spellLineHeight)
					spellsScroll:SetPoint ("topleft", newComparisonFrame, "topleft", 0, 0)
					spellsScroll.lineHeight = comparisonFrameSettings.spellLineHeight
					spellsScroll.scrollWidth = comparisonFrameSettings.mainScrollWidth
					spellsScroll.fontSize = comparisonFrameSettings.fontSize
					_G [spellsScroll:GetName() .. "ScrollBar"]:Hide()
					
						--create lines
						for i = 1, comparisonFrameSettings.spellLineAmount do 
							local line = spellsScroll:CreateLine (mainPlayerCreateline)
							line.lineType = "comparisonPlayerSpell"
						end
						DetailsFramework:ReskinSlider (spellsScroll)
						
						newComparisonFrame.spellsScroll = spellsScroll
					
					--targets scroll
					local targetsScroll = DetailsFramework:CreateScrollBox (newComparisonFrame, "$parentComparisonPlayerTargetsScroll", comparisonPlayerRefreshTargetScroll, {}, comparisonFrameSettings.comparisonScrollWidth, comparisonFrameSettings.targetScrollHeight, comparisonFrameSettings.targetScrollLineAmount, comparisonFrameSettings.targetScrollLineHeight)
					targetsScroll:SetPoint ("topleft", newComparisonFrame, "topleft", 0, -comparisonFrameSettings.spellScrollHeight - 20)
					targetsScroll.lineHeight = comparisonFrameSettings.spellLineHeight
					targetsScroll.scrollWidth = comparisonFrameSettings.mainScrollWidth
					targetsScroll.fontSize = comparisonFrameSettings.fontSize
					_G [targetsScroll:GetName() .. "ScrollBar"]:Hide()
					
						--create lines
						for i = 1, comparisonFrameSettings.targetScrollLineAmount do 
							local line = targetsScroll:CreateLine (mainPlayerCreateline)
							line.lineType = "comparisonPlayerTarget"
						end
						DetailsFramework:ReskinSlider (targetsScroll)
						
						newComparisonFrame.targetsScroll = targetsScroll
					
				return newComparisonFrame
			end
			
			if (not frame.__background) then
				DetailsFramework:ApplyStandardBackdrop(frame)
				frame.__background:SetAlpha(0.6)
			end
		end
		
		local buildSpellAndTargetTables = function (player, combat, attribute)
			--build the spell list for the main player including pets
			local allPlayerSpells = player:GetActorSpells()
			local resultSpellTable = {}
			
			for spellId, spellTable in pairs(allPlayerSpells) do
				local spellName, _, spellIcon = Details.GetSpellInfo (spellId)
				resultSpellTable [#resultSpellTable + 1] = {spellId, spellTable.total, spellName = spellName, spellIcon = spellIcon, spellId = spellId, amount = spellTable.total, rawSpellTable = spellTable}
			end
			
			--pets
			local petAbilities = {}
			for _, petName in ipairs(player:Pets()) do
				local petObject = combat:GetActor(attribute, petName)
				if (petObject) then
					local allPetSpells = petObject:GetActorSpells()
					local petNpcId = DetailsFramework:GetNpcIdFromGuid(petObject.serial)
					for spellId, spellTable in pairs(allPetSpells) do
						petAbilities[spellId] = petAbilities[spellId] or {total = 0, rawSpellTable = spellTable}
						petAbilities[spellId].total = petAbilities[spellId].total + spellTable.total
					end
				end
			end

			for spellId, petSpellTable in pairs(petAbilities) do
				local spellName, _, spellIcon = Details.GetSpellInfo(spellId)
				resultSpellTable [#resultSpellTable + 1] = {spellId, petSpellTable.total, spellName = spellName, spellIcon = spellIcon, spellId = spellId, amount = petSpellTable.total, rawSpellTable = petSpellTable.rawSpellTable}
			end
			
			table.sort (resultSpellTable, DetailsFramework.SortOrder2)
			
			--build the target list for the main player
			local resultTargetTable = {}
			for targetName, amountDone in pairs (player.targets) do
				resultTargetTable [#resultTargetTable + 1] = {targetName, amountDone, targetName = Details:RemoveOwnerName (targetName), amount = amountDone, originalName = targetName, rawPlayerObject = player}
			end
			
			table.sort (resultTargetTable, DetailsFramework.SortOrder2)
			
			return resultSpellTable, resultTargetTable
		end
		
		--main tab function to be executed when the tab is shown
		local playerComparisonFill = function (tab, player, combat)
			local frame = tab.frame

			--update player name
			frame.mainPlayerName.text = player:GetDisplayName()
			
			frame.mainPlayerObject = player
			frame.mainFrameScroll.mainPlayerObject = player
			
			--reset the comparison scroll frame
			frame.ResetComparisonFrames()
			resetComparisonTooltip()
			resetTargetComparisonTooltip()
			
			local attribute = Details:GetDisplayTypeFromBreakdownWindow()
			local resultSpellTable, resultTargetTable = buildSpellAndTargetTables (player, combat, attribute)

			--update the two main scroll frames
			frame.mainFrameScroll:SetData (resultSpellTable)
			frame.mainFrameScroll:Refresh()
			
			frame.targetFrameScroll:SetData (resultTargetTable)
			frame.targetFrameScroll:Refresh()
			
			frame.mainSpellTable = resultSpellTable
			frame.mainTargetTable = resultTargetTable
			
			--search the combat for players with the same spec and build a scroll frame for them
			--to keep consistency, sort these players with the max amount of damage or healing they have done
			local actorContainer = combat:GetContainer (attribute)
			local playersWithSameSpec = {}
			
			for _, playerObject in actorContainer:ListActors() do
				if (playerObject:IsPlayer() and playerObject.spec == player.spec and playerObject.serial ~= player.serial) then
					playersWithSameSpec [#playersWithSameSpec + 1] = {playerObject, playerObject.total}
				end
			end
			
			table.sort (playersWithSameSpec, DetailsFramework.SortOrder2)
			
			frame.comparisonSpellTable = {}
			frame.comparisonTargetTable = {}
			
			for i = 1, #playersWithSameSpec do
				--other player with the same spec
				local playerObject = playersWithSameSpec[i][1]
				local otherPlayerSpellTable, otherPlayerTargetTable = buildSpellAndTargetTables (playerObject, combat, attribute)
				
				frame.comparisonSpellTable [#frame.comparisonSpellTable + 1] = otherPlayerSpellTable
				frame.comparisonTargetTable [#frame.comparisonTargetTable + 1] = otherPlayerTargetTable
				
				local comparisonFrame = frame.GetComparisonScrollFrame()
				comparisonFrame.mainPlayer = player
				comparisonFrame.mainSpellTable = resultSpellTable
				comparisonFrame.mainTargetTable = resultTargetTable
				
				comparisonFrame.playerObject = playerObject
				comparisonFrame.playerName.text = playerObject:GetDisplayName()
				
				--iterate among spells of the main player and check if the spell exists on this player
					local otherPlayerResultSpellTable = {}
					
					for i = 1, #resultSpellTable do
						local spellTable = resultSpellTable [i]
						
						local found = false
						
						--iterate amont spell of the other player which the main player is being compared
						for o = 1, #otherPlayerSpellTable do
							local otherSpellTable = otherPlayerSpellTable[o]
						
							--check if this is a pet
							if (spellTable.npcId) then
								--match the npcId before match the spellId
								if (otherSpellTable.npcId == spellTable.npcId) then
									if (otherSpellTable.spellId == spellTable.spellId) then
										found = true
										--insert the amount of the main spell in the table
										otherSpellTable.mainSpellAmount = spellTable.amount
										otherPlayerResultSpellTable [#otherPlayerResultSpellTable+1] = otherSpellTable
										break
									end
								end
							else
								if (otherSpellTable.spellId == spellTable.spellId) then
									found = true
									--insert the amount of the main spell in the table
									otherSpellTable.mainSpellAmount = spellTable.amount
									otherPlayerResultSpellTable [#otherPlayerResultSpellTable+1] = otherSpellTable
									break
								end
							end
						end
						
						if (not found) then
							otherPlayerResultSpellTable [#otherPlayerResultSpellTable+1] = {0, 0, spellName = "", spellIcon = "", spellId = 0, amount = 0}
						end
					end

					--call the update function
					comparisonFrame.spellsScroll.playerObject = playerObject
					comparisonFrame.spellsScroll:SetData (otherPlayerResultSpellTable)
					comparisonFrame.spellsScroll:Refresh()
				
				--iterate among targets of the main player and check if the target exists on this player
					local otherPlayerResultTargetsTable = {}
					
					for i = 1, #resultTargetTable do
						local targetTable = resultTargetTable [i]
						
						local found = false
						
						--iterate amont targets of the other player which the main player is being compared
						for o = 1, #otherPlayerTargetTable do
							local otherTargetTable = otherPlayerTargetTable[o]
						
							if (otherTargetTable.originalName == targetTable.originalName) then
								found = true
								--insert the amount of the main spell in the table
								otherTargetTable.mainTargetAmount = targetTable.amount
								otherPlayerResultTargetsTable [#otherPlayerResultTargetsTable+1] = otherTargetTable
								break
							end
						end

						if (not found) then
							otherPlayerResultTargetsTable [#otherPlayerResultTargetsTable+1] = {"", 0, targetName = "", amount = 0, originalName = ""}
						end
					end

					--call the update function
					comparisonFrame.targetsScroll:SetData (otherPlayerResultTargetsTable)
					comparisonFrame.targetsScroll:Refresh()
			end
		end

		local iconTableCompare = {
			texture = [[Interface\AddOns\Details\images\icons]],
			--coords = {363/512, 381/512, 0/512, 17/512},
			coords = {383/512, 403/512, 0/512, 15/512},
			width = 16,
			height = 14,
		}

		Details:CreatePlayerDetailsTab ("New Compare", "Compare", --[1] tab name [2] localized name
			function (tabOBject, playerObject)  --[2] condition
				
				local attribute = Details:GetDisplayTypeFromBreakdownWindow()
				local combat = Details:GetCombatFromBreakdownWindow()
				
				if (attribute > 2) then
					return false
				end
				
				local playerSpec = playerObject.spec or "no-spec"
				local playerSerial = playerObject.serial
				local showTab = false
				
				for index, actor in _ipairs (combat [attribute]._ActorTable) do 
					if (actor.spec == playerSpec and actor.serial ~= playerSerial) then
						showTab = true
						break
					end
				end
				
				if (showTab) then
					return true
				end
				
				--return false
				return true --debug?
			end,
			
			playerComparisonFill, --[3] fill function
			
			nil, --[4] onclick
			
			playerComparisonCreate, --[5] oncreate
			iconTableCompare, --[6] icon table

			{
				attributes = {
					[1] = {1, 2, 3, 4, 5, 6, 7, 8},
					[2] = {1, 2, 3, 4, 5, 6, 7, 8},
				},
				tabNameToReplace = "Compare",
				bIsCompareTab = true,
			} --replace tab [attribute] = [sub attributes]
		)
	end

---------------------------------------------------------------------------------------------------------------------------------------

	function compareTwo:OnEvent(_, event, ...)
		if (event == "ADDON_LOADED") then
			local AddonName = select(1, ...)
			if (AddonName == "Details_Compare2") then
				--> every plugin must have a OnDetailsEvent function
				function compareTwo:OnDetailsEvent(event, ...)
					return handle_details_event(event, ...)
				end

				--> Install: install -> if successful installed; saveddata -> a table saved inside details db, used to save small amount of data like configs
				local install, saveddata = Details:InstallPlugin("RAID", "Compare 2.0", "Interface\\Icons\\Ability_Warrior_BattleShout", compareTwo, "DETAILS_PLUGIN_COMPARETWO_WINDOW", MINIMAL_DETAILS_VERSION_REQUIRED, "Terciob", COMPARETWO_VERSION)
				if (type(install) == "table" and install.error) then
					print(install.error)
				end

				--> registering details events we need
				Details:RegisterEvent(compareTwo, "COMBAT_PLAYER_ENTER") --when details creates a new segment, not necessary the player entering in combat.
				Details:RegisterEvent(compareTwo, "COMBAT_PLAYER_LEAVE") --when details finishs a segment, not necessary the player leaving the combat.
				Details:RegisterEvent(compareTwo, "DETAILS_DATA_RESET") --details combat data has been wiped

				compareTwo.InstallAdvancedCompareWindow()

				--this plugin does not show in lists of plugins
				compareTwo.NoMenu = true
			end
		end
	end
end