
local _detalhes = 		_G.Details
local _
local addonName, Details222 = ...

local AceLocale = LibStub("AceLocale-3.0")
local Loc = AceLocale:GetLocale ( "Details" )
local Translit = LibStub("LibTranslit-1.0")

--lua locals
local _math_floor = math.floor
local setmetatable = setmetatable
local pairs = pairs
local ipairs = ipairs
local _unpack = unpack
local type = type
local _table_sort = table.sort
local _cstr = string.format
local tinsert = table.insert
local _math_min = math.min
local _math_ceil = math.ceil
--api locals
local GetSpellInfo = Details222.GetSpellInfo
local _GetSpellInfo = _detalhes.getspellinfo
local IsInRaid = IsInRaid
local IsInGroup = IsInGroup

local _string_replace = _detalhes.string.replace --details api
local gump = 			_detalhes.gump

local detailsFramework = DetailsFramework

local alvo_da_habilidade = 	_detalhes.alvo_da_habilidade
local container_habilidades = 	_detalhes.container_habilidades
local container_combatentes =	_detalhes.container_combatentes
local healingClass =		_detalhes.atributo_heal
local habilidade_cura = 		_detalhes.habilidade_cura

local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC
local container_heal = _detalhes.container_type.CONTAINER_HEAL_CLASS
local container_heal_target = _detalhes.container_type.CONTAINER_HEALTARGET_CLASS

local modo_ALONE = _detalhes.modos.alone
local modo_GROUP = _detalhes.modos.group
local modo_ALL = _detalhes.modos.all

local class_type = _detalhes.atributos.cura

local DATA_TYPE_START = _detalhes._detalhes_props.DATA_TYPE_START
local DATA_TYPE_END = _detalhes._detalhes_props.DATA_TYPE_END

local div_abre = _detalhes.divisores.abre
local div_fecha = _detalhes.divisores.fecha
local div_lugar = _detalhes.divisores.colocacao

local ToKFunctions = _detalhes.ToKFunctions
local SelectedToKFunction = ToKFunctions [1]
local UsingCustomRightText = false
local UsingCustomLeftText = false

local FormatTooltipNumber = ToKFunctions [8]
local TooltipMaximizedMethod = 1

local headerColor = "yellow"

local breakdownWindowFrame = Details.BreakdownWindowFrame
local keyName

function healingClass:NovaTabela (serial, nome, link)
	local alphabetical = _detalhes:GetOrderNumber(nome)

	--constructor
	local thisActor = {
		tipo = class_type, --atributo 2 = cura

		total = alphabetical,
		totalover = alphabetical,
		totalabsorb = alphabetical,
		totaldenied = alphabetical,
		custom = 0,

		total_without_pet = alphabetical,
		totalover_without_pet = alphabetical,

		healing_taken = alphabetical, --total de cura que este jogador recebeu
		healing_from = {}, --armazena os nomes que deram cura neste jogador

		iniciar_hps = false,  --dps_started
		last_event = 0,
		on_hold = false,
		delay = 0,
		last_value = nil, --ultimo valor que este jogador teve, salvo quando a barra dele � atualizada
		last_hps = 0, --cura por segundo

		end_time = nil,
		start_time = 0,

		pets = {}, --nome j� formatado: pet nome <owner nome>

		heal_enemy = {}, --quando o jogador cura um inimigo
		heal_enemy_amt = 0,

		--container armazenar� os IDs das habilidades usadas por este jogador
		spells = container_habilidades:NovoContainer (container_heal),
		--container armazenar� os seriais dos alvos que o player aplicou dano
		targets = {},
		targets_overheal = {},
		targets_absorbs = {}
	}

	detailsFramework:Mixin(thisActor, Details222.Mixins.ActorMixin)
	setmetatable(thisActor, healingClass)

	return thisActor
end


-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--npc healing taken

--local npchealingtaken_tooltip_background = {value = 100, color = {0.1960, 0.1960, 0.1960, 0.9097}, texture = [[Interface\AddOns\Details\images\bar_background2]]}

--tooltip function

local on_switch_NHT_show = function(instance) --npc healing taken
	instance:TrocaTabela(instance, true, 1, 8)
	return true
end

--local NHT_search_code = [[]]


function _detalhes.SortGroupHeal (container, keyName2)
	keyName = keyName2
	return _table_sort (container, _detalhes.SortKeyGroupHeal)
end

function _detalhes.SortKeyGroupHeal (table1, table2)
	if (table1.grupo and table2.grupo) then
		return table1 [keyName] > table2 [keyName]
	elseif (table1.grupo and not table2.grupo) then
		return true
	elseif (not table1.grupo and table2.grupo) then
		return false
	else
		return table1 [keyName] > table2 [keyName]
	end
end

function _detalhes.SortKeySimpleHeal (table1, table2)
	return table1 [keyName] > table2 [keyName]
end

function _detalhes:ContainerSortHeal (container, amount, keyName2)
	keyName = keyName2
	_table_sort (container, _detalhes.SortKeySimpleHeal)

	if (amount) then
		for i = amount, 1, -1 do --de tr�s pra frente
			if (container[i][keyName] < 1) then
				amount = amount-1
			else
				break
			end
		end

		return amount
	end
end

function healingClass:ContainerRefreshHps (container, combat_time)

	local total = 0

	if (_detalhes.time_type == 2 or _detalhes.time_type == 3 or not _detalhes:CaptureGet("heal")) then
		for _, actor in ipairs(container) do
			if (actor.grupo) then
				actor.last_hps = actor.total / combat_time
			else
				actor.last_hps = actor.total / actor:Tempo()
			end
			total = total + actor.last_hps
		end
	else
		for _, actor in ipairs(container) do
			actor.last_hps = actor.total / actor:Tempo()
			total = total + actor.last_hps
		end
	end

	return total
end

function healingClass:ReportSingleDamagePreventedLine (actor, instancia)
	local barra = instancia.barras [actor.minha_barra]

	local reportar = {"Details!: " .. actor.nome .. " - " .. Loc ["STRING_ATTRIBUTE_HEAL_PREVENT"]}
	for i = 2, GameCooltip:GetNumLines()-2 do
		local texto_left, texto_right = GameCooltip:GetText (i)
		if (texto_left and texto_right) then
			texto_left = texto_left:gsub(("|T(.*)|t "), "")
			reportar [#reportar+1] = ""..texto_left.." "..texto_right..""
		end
	end

	return _detalhes:Reportar (reportar, {_no_current = true, _no_inverse = true, _custom = true})
end

function healingClass:RefreshWindow (instancia, tabela_do_combate, forcar, exportar)
	if not Details222.UpdateIsAllowed() then return end --temporary stop updates in th new dlc

	local showing = tabela_do_combate [class_type] --o que esta sendo mostrado -> [1] - dano [2] - cura

	--n�o h� barras para mostrar -- not have something to show
	if (#showing._ActorTable < 1) then --n�o h� barras para mostrar
		--colocado isso recentemente para fazer as barras de dano sumirem na troca de atributo
		return _detalhes:HideBarsNotInUse(instancia, showing), "", 0, 0
	end

	--total
	local total = 0
	--top actor #1
	instancia.top = 0

	local using_cache = false

	local sub_atributo = instancia.sub_atributo --o que esta sendo mostrado nesta inst�ncia
	local conteudo = showing._ActorTable
	local amount = #conteudo
	local modo = instancia.modo

	if detailsFramework.IsAddonApocalypseWow() then
		instancia:CheckForSecretsAndAspects()
	end

	--pega qual a sub key que ser� usada
	if (exportar) then

		if (type(exportar) == "boolean") then
			if (sub_atributo == 1) then --healing DONE
				keyName = "total"
			elseif (sub_atributo == 2) then --HPS
				keyName = "last_hps"
			elseif (sub_atributo == 3) then --overheal
				keyName = "totalover"
			elseif (sub_atributo == 4) then --healing take
				keyName = "healing_taken"
			elseif (sub_atributo == 5) then --enemy heal
				keyName = "heal_enemy_amt"
			elseif (sub_atributo == 6) then --absorbs
				keyName = "totalabsorb"
			elseif (sub_atributo == 7) then --heal absorb
				keyName = "totaldenied"
			end
		else
			keyName = exportar.key
			modo = exportar.modo
		end
	elseif (instancia.atributo == 5) then --custom
		keyName = "custom"
		total = tabela_do_combate.totals [instancia.customName]
	else
		if (sub_atributo == 1) then --healing DONE
			keyName = "total"
		elseif (sub_atributo == 2) then --HPS
			keyName = "last_hps"
		elseif (sub_atributo == 3) then --overheal
			keyName = "totalover"
		elseif (sub_atributo == 4) then --healing take
			keyName = "healing_taken"
		elseif (sub_atributo == 5) then --enemy heal
			keyName = "heal_enemy_amt"
		elseif (sub_atributo == 6) then --absorbs
			keyName = "totalabsorb"
		elseif (sub_atributo == 7) then --heal absorb
			keyName = "totaldenied"
		end
	end

	if (instancia.atributo == 5) then --custom
		--faz o sort da categoria e retorna o amount corrigido
		amount = _detalhes:ContainerSortHeal (conteudo, amount, keyName)

		--grava o total
		instancia.top = conteudo[1][keyName]

	elseif (instancia.modo == modo_ALL or sub_atributo == 5 or sub_atributo == 7) then --mostrando ALL

		amount = _detalhes:ContainerSortHeal (conteudo, amount, keyName)

		if (sub_atributo == 2) then --hps
			local combat_time = instancia.showing:GetCombatTime()
			total = healingClass:ContainerRefreshHps (conteudo, combat_time)
		else
			--pega o total ja aplicado na tabela do combate
			total = tabela_do_combate.totals [class_type]
		end

		--grava o total
		instancia.top = conteudo[1][keyName]

	elseif (instancia.modo == modo_GROUP) then --mostrando GROUP

		if (_detalhes.in_combat and instancia.segmento == 0 and not exportar) then
			using_cache = true
		end

		if (using_cache) then
			conteudo = _detalhes.cache_healing_group

			if (sub_atributo == 2) then --hps
				local combat_time = instancia.showing:GetCombatTime()
				healingClass:ContainerRefreshHps (conteudo, combat_time)
			end

			if (#conteudo < 1) then
				return _detalhes:HideBarsNotInUse(instancia, showing), "", 0, 0
			end

			_detalhes:ContainerSortHeal (conteudo, nil, keyName)

			if (conteudo[1][keyName] < 1) then
				amount = 0
			else
				instancia.top = conteudo[1][keyName]
				amount = #conteudo
			end

			for i = 1, amount do
				total = total + conteudo[i][keyName]
			end

		else
			if (sub_atributo == 2) then --hps
				local combat_time = instancia.showing:GetCombatTime()
				healingClass:ContainerRefreshHps (conteudo, combat_time)
			end

			_detalhes.SortGroupHeal (conteudo, keyName)
		end
		--
		if (not using_cache) then
			for index, player in ipairs(conteudo) do
				if (player.grupo) then --� um player e esta em grupo
					if (player[keyName] < 1) then --dano menor que 1, interromper o loop
						amount = index - 1
						break
					elseif (index == 1) then --esse IF aqui, precisa mesmo ser aqui? n�o daria pra pega-lo com uma chave [1] nad grupo == true?
						instancia.top = conteudo[1][keyName]
					end

					total = total + player[keyName]
				else
					amount = index-1
					break
				end
			end
		end

	end

	--refaz o mapa do container
	--se for cache n�o precisa remapear
	showing:remapear()

	if (exportar) then
		return total, keyName, instancia.top, amount
	end

	if (amount < 1) then --n�o h� barras para mostrar
		instancia:EsconderScrollBar()
		return _detalhes:EndRefresh (instancia, total, tabela_do_combate, showing) --retorna a tabela que precisa ganhar o refresh
	end

	--estra mostrando ALL ent�o posso seguir o padr�o correto? primeiro, atualiza a scroll bar...
	instancia:RefreshScrollBar (amount)

	--depois faz a atualiza��o normal dele atrav�s dos iterators
	local whichRowLine = 1
	local barras_container = instancia.barras --evita buscar N vezes a key .barras dentro da inst�ncia
	local percentage_type = instancia.row_info.percent_type
	local bars_show_data = instancia.row_info.textR_show_data
	local bars_brackets = instancia:GetBarBracket()
	local bars_separator = instancia:GetBarSeparator()
	local baseframe = instancia.baseframe

	local use_animations = _detalhes.is_using_row_animations and (not baseframe.isStretching and not forcar and not baseframe.isResizing)

	if (total == 0) then
		total = 0.00000001
	end

	local myPos
	local following = instancia.following.enabled

	if (following) then
		if (using_cache) then
			local pname = _detalhes.playername
			for i, actor in ipairs(conteudo) do
				if (actor.nome == pname) then
					myPos = i
					break
				end
			end
		else
			myPos = showing._NameIndexTable [_detalhes.playername]
		end
	end

	local combat_time = instancia.showing:GetCombatTime()
	UsingCustomLeftText = instancia.row_info.textL_enable_custom_text
	UsingCustomRightText = instancia.row_info.textR_enable_custom_text

	local use_total_bar = false
	if (instancia.total_bar.enabled) then
		use_total_bar = true

		if (instancia.total_bar.only_in_group and (not IsInGroup() and not IsInRaid())) then
			use_total_bar = false
		end
	end

	if (instancia.bars_sort_direction == 1) then --top to bottom

		if (use_total_bar and instancia.barraS[1] == 1) then

			whichRowLine = 2
			local iter_last = instancia.barraS[2]
			if (iter_last == instancia.rows_fit_in_window) then
				iter_last = iter_last - 1
			end

			local row1 = barras_container [1]
			row1.minha_tabela = nil
			row1.lineText1:SetText(Loc ["STRING_TOTAL"])
			if (instancia.use_multi_fontstrings) then
				instancia:SetInLineTexts(row1, "", _detalhes:ToK2 (total), _detalhes:ToK (total / combat_time))
			else
				row1.lineText4:SetText(_detalhes:ToK2 (total) .. " (" .. _detalhes:ToK (total / combat_time) .. ")")
			end

			row1:SetValue(100)
			local r, g, b = unpack(instancia.total_bar.color)
			row1.textura:SetVertexColor(r, g, b)

			row1.icone_classe:SetTexture(instancia.total_bar.icon)
			row1.icone_classe:SetTexCoord(0.0625, 0.9375, 0.0625, 0.9375)

			Details.FadeHandler.Fader(row1, "out")

			if (following and myPos and myPos+1 > instancia.rows_fit_in_window and instancia.barraS[2] < myPos+1) then
				for i = instancia.barraS[1], iter_last-1, 1 do --vai atualizar s� o range que esta sendo mostrado
					if (conteudo[i]) then
						conteudo[i]:RefreshLine(instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator)
						whichRowLine = whichRowLine+1
					end
				end

				conteudo[myPos]:RefreshLine(instancia, barras_container, whichRowLine, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator)
				whichRowLine = whichRowLine+1
			else

				for i = instancia.barraS[1], iter_last, 1 do --vai atualizar s� o range que esta sendo mostrado
					if (conteudo[i]) then
						conteudo[i]:RefreshLine(instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator)
						whichRowLine = whichRowLine+1
					end
				end
			end

		else
			if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then
				for i = instancia.barraS[1], instancia.barraS[2]-1, 1 do --vai atualizar s� o range que esta sendo mostrado
					if (conteudo[i]) then
						conteudo[i]:RefreshLine(instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator)
						whichRowLine = whichRowLine+1
					end
				end

				conteudo[myPos]:RefreshLine(instancia, barras_container, whichRowLine, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator)
				whichRowLine = whichRowLine+1
			else
				for i = instancia.barraS[1], instancia.barraS[2], 1 do --vai atualizar s� o range que esta sendo mostrado
					if (conteudo[i]) then
						conteudo[i]:RefreshLine(instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator)
						whichRowLine = whichRowLine+1
					end
				end
			end
		end

	elseif (instancia.bars_sort_direction == 2) then --bottom to top

		if (use_total_bar and instancia.barraS[1] == 1) then

			whichRowLine = 2
			local iter_last = instancia.barraS[2]
			if (iter_last == instancia.rows_fit_in_window) then
				iter_last = iter_last - 1
			end

			local row1 = barras_container [1]
			row1.minha_tabela = nil
			row1.lineText1:SetText(Loc ["STRING_TOTAL"])
			--
			if (instancia.use_multi_fontstrings) then
				instancia:SetInLineTexts(row1, "", _detalhes:ToK2(total), _detalhes:ToK(total / combat_time))
			else
				row1.lineText4:SetText(_detalhes:ToK2 (total) .. " (" .. _detalhes:ToK (total / combat_time) .. ")")
			end

			row1:SetValue(100)
			local r, g, b = unpack(instancia.total_bar.color)
			row1.textura:SetVertexColor(r, g, b)

			row1.icone_classe:SetTexture(instancia.total_bar.icon)
			row1.icone_classe:SetTexCoord(0.0625, 0.9375, 0.0625, 0.9375)

			Details.FadeHandler.Fader(row1, "out")

			if (following and myPos and myPos+1 > instancia.rows_fit_in_window and instancia.barraS[2] < myPos+1) then
				conteudo[myPos]:RefreshLine(instancia, barras_container, whichRowLine, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator)
				whichRowLine = whichRowLine+1
				for i = iter_last-1, instancia.barraS[1], -1 do --vai atualizar s� o range que esta sendo mostrado
					if (conteudo[i]) then
						conteudo[i]:RefreshLine(instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator)
						whichRowLine = whichRowLine+1
					end
				end
			else
				for i = iter_last, instancia.barraS[1], -1 do --vai atualizar s� o range que esta sendo mostrado
					if (conteudo[i]) then
						conteudo[i]:RefreshLine(instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator)
						whichRowLine = whichRowLine+1
					end
				end
			end
		else
			if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then
				conteudo[myPos]:RefreshLine(instancia, barras_container, whichRowLine, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator)
				whichRowLine = whichRowLine+1
				for i = instancia.barraS[2]-1, instancia.barraS[1], -1 do --vai atualizar s� o range que esta sendo mostrado
					if (conteudo[i]) then
						conteudo[i]:RefreshLine(instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator)
						whichRowLine = whichRowLine+1
					end
				end
			else
				for i = instancia.barraS[2], instancia.barraS[1], -1 do --vai atualizar s� o range que esta sendo mostrado
					if (conteudo[i]) then
						conteudo[i]:RefreshLine(instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator)
						whichRowLine = whichRowLine+1
					end
				end
			end
		end

	end

	if (use_animations) then
		instancia:PerformAnimations (whichRowLine - 1)
	end

	if (instancia.atributo == 5) then --custom
		--zerar o .custom dos Actors
		for index, player in ipairs(conteudo) do
			if (player.custom > 0) then
				player.custom = 0
			else
				break
			end
		end
	end

	--beta, hidar barras n�o usadas durante um refresh for�ado
	if (forcar) then
		if (instancia.modo == 2) then --group
			for i = whichRowLine, instancia.rows_fit_in_window  do
				Details.FadeHandler.Fader(instancia.barras [i], "in", Details.fade_speed)
			end
		end
	end

	instancia:AutoAlignInLineFontStrings()

	-- showing.need_refresh = false
	return Details:EndRefresh (instancia, total, tabela_do_combate, showing) --retorna a tabela que precisa ganhar o refresh

end

local actor_class_color_r, actor_class_color_g, actor_class_color_b

--function atributo_heal:RefreshLine(instancia, whichRowLine, lugar, total, sub_atributo, forcar)
function healingClass:RefreshLine(instancia, barras_container, whichRowLine, lugar, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator)

	local thisLine = instancia.barras[whichRowLine] --pega a refer�ncia da barra na janela

	if (not thisLine) then
		print("DEBUG: problema com <instancia.thisLine> "..whichRowLine.." "..lugar)
		return
	end

	thisLine.statusbar:SetMinMaxValues(0, 100)

	local tabela_anterior = thisLine.minha_tabela

	thisLine.minha_tabela = self --grava uma refer�ncia dessa classe de dano na barra
	self.minha_barra = thisLine --salva uma refer�ncia da barra no objeto do jogador

	thisLine.colocacao = lugar --salva na barra qual a coloca��o dela.
	self.colocacao = lugar --salva qual a coloca��o do jogador no objeto dele

	local healing_total = self.total --total de dano que este jogador deu
	local hps

	--local porcentagem = self [keyName] / total * 100
	local porcentagem
	local esta_porcentagem

	if (percentage_type == 1) then
		porcentagem = _cstr ("%.1f", self [keyName] / total * 100)

	elseif (percentage_type == 2) then
		porcentagem = _cstr ("%.1f", self [keyName] / instancia.top * 100)
	end

	if ((_detalhes.time_type == 2 and self.grupo) or _detalhes.time_type == 3 or (not _detalhes:CaptureGet("heal") and not _detalhes:CaptureGet("aura")) or instancia.segmento == -1) then
		if (instancia.segmento == -1 and combat_time == 0) then
			local p = _detalhes.tabela_vigente(2, self.nome)
			if (p) then
				local t = p:Tempo()
				hps = healing_total / t
				self.last_hps = hps
			else
				hps = healing_total / combat_time
				self.last_hps = hps
			end
		else
			hps = healing_total / combat_time
			self.last_hps = hps
		end
	else -- /dump _detalhes:GetCombat(2)(1, "Ditador").on_hold
		if (not self.on_hold) then
			hps = healing_total/self:Tempo() --calcula o dps deste objeto
			self.last_hps = hps --salva o dps dele
		else
			hps = self.last_hps

			if (hps == 0) then --n�o calculou o dps dele ainda mas entrou em standby
				hps = healing_total/self:Tempo()
				self.last_hps = hps
			end
		end
	end

	-- >>>>>>>>>>>>>>> texto da direita
	if (instancia.atributo == 5) then --custom
		--
		if (instancia.use_multi_fontstrings) then
			instancia:SetInLineTexts(thisLine, "", _detalhes:ToK (self.custom), porcentagem .. "%")
		else
			thisLine.lineText4:SetText(_detalhes:ToK (self.custom) .. " (" .. porcentagem .. "%)")
		end
		esta_porcentagem = _math_floor((self.custom/instancia.top) * 100)

	else
		if (sub_atributo == 1) then --mostrando healing done

			hps = _math_floor(hps)
			local formated_heal = SelectedToKFunction (_, healing_total)
			local formated_hps = SelectedToKFunction (_, hps)
			thisLine.ps_text = formated_hps

			if (not bars_show_data [1]) then
				formated_heal = ""
			end
			if (not bars_show_data [2]) then
				formated_hps = ""
			end
			if (not bars_show_data [3]) then
				porcentagem = ""
			else
				porcentagem = porcentagem .. "%"
			end

			local rightText = formated_heal .. bars_brackets[1] .. formated_hps .. bars_separator .. porcentagem .. bars_brackets[2]
			if (UsingCustomRightText) then
				thisLine.lineText4:SetText(_string_replace (instancia.row_info.textR_custom_text, formated_heal, formated_hps, porcentagem, self, instancia.showing, instancia, rightText))
			else
				if (instancia.use_multi_fontstrings) then
					instancia:SetInLineTexts(thisLine, formated_heal, formated_hps, porcentagem)
				else
					thisLine.lineText4:SetText(rightText)
				end
			end
			esta_porcentagem = _math_floor((healing_total/instancia.top) * 100)

		elseif (sub_atributo == 2) then --mostrando hps

			hps = _math_floor(hps)
			local formated_heal = SelectedToKFunction (_, healing_total)
			local formated_hps = SelectedToKFunction (_, hps)
			thisLine.ps_text = formated_hps

			if (not bars_show_data [1]) then
				formated_hps = ""
			end
			if (not bars_show_data [2]) then
				formated_heal = ""
			end
			if (not bars_show_data [3]) then
				porcentagem = ""
			else
				porcentagem = porcentagem .. "%"
			end

			local rightText = formated_hps .. bars_brackets[1] .. formated_heal .. bars_separator .. porcentagem .. bars_brackets[2]
			if (UsingCustomRightText) then
				thisLine.lineText4:SetText(_string_replace (instancia.row_info.textR_custom_text, formated_hps, formated_heal, porcentagem, self, instancia.showing, instancia, rightText))
			else
				if (instancia.use_multi_fontstrings) then
					instancia:SetInLineTexts(thisLine, formated_hps, formated_heal, porcentagem)
				else
					thisLine.lineText4:SetText(rightText)
				end
			end

			esta_porcentagem = _math_floor((hps/instancia.top) * 100)

		elseif (sub_atributo == 3) then --mostrando overall

			local formated_overheal = SelectedToKFunction (_, self.totalover)

			local percent = self.totalover / (self.totalover + self.total) * 100
			local overheal_percent = _cstr ("%.1f", percent)

			local rr, gg, bb = _detalhes:percent_color (percent, true)
			rr, gg, bb = _detalhes:hex (_math_floor(rr*255)), _detalhes:hex (_math_floor(gg*255)), _detalhes:hex (_math_floor(bb*255))
			overheal_percent = "|cFF" .. rr .. gg .. bb .. overheal_percent .. "|r"

			if (not bars_show_data [1]) then
				formated_overheal = ""
			end
			if (not bars_show_data [3]) then
				overheal_percent = ""
			else
				overheal_percent = overheal_percent .. "%"
			end

			local rightText = formated_overheal .. bars_brackets[1] .. overheal_percent .. bars_brackets[2]
			if (UsingCustomRightText) then
				thisLine.lineText4:SetText(_string_replace (instancia.row_info.textR_custom_text, formated_overheal, "", overheal_percent, self, instancia.showing, instancia, rightText))
			else
				if (instancia.use_multi_fontstrings) then
					instancia:SetInLineTexts(thisLine, "", formated_overheal, overheal_percent)
				else
					thisLine.lineText4:SetText(rightText)
				end
			end

			esta_porcentagem = _math_floor((self.totalover/instancia.top) * 100)

		elseif (sub_atributo == 4) then --mostrando healing taken

			local formated_healtaken = SelectedToKFunction (_, self.healing_taken)

			if (not bars_show_data [1]) then
				formated_healtaken = ""
			end
			if (not bars_show_data [3]) then
				porcentagem = ""
			else
				porcentagem = porcentagem .. "%"
			end

			local rightText = formated_healtaken .. bars_brackets[1] .. porcentagem .. bars_brackets[2]
			if (UsingCustomRightText) then
				thisLine.lineText4:SetText(_string_replace (instancia.row_info.textR_custom_text, formated_healtaken, "", porcentagem, self, instancia.showing, instancia, rightText))
			else
				if (instancia.use_multi_fontstrings) then
					instancia:SetInLineTexts(thisLine, "", formated_healtaken, porcentagem)
				else
					thisLine.lineText4:SetText(rightText)
				end
			end

			esta_porcentagem = _math_floor((self.healing_taken/instancia.top) * 100)

		elseif (sub_atributo == 5) then --mostrando enemy heal

			local formated_enemyheal = SelectedToKFunction (_, self.heal_enemy_amt)

			if (not bars_show_data [1]) then
				formated_enemyheal = ""
			end
			if (not bars_show_data [3]) then
				porcentagem = ""
			else
				porcentagem = porcentagem .. "%"
			end

			local rightText = formated_enemyheal .. bars_brackets[1] .. porcentagem .. bars_brackets[2]
			if (UsingCustomRightText) then
				thisLine.lineText4:SetText(_string_replace (instancia.row_info.textR_custom_text, formated_enemyheal, "", porcentagem, self, instancia.showing, instancia, rightText))
			else
				if (instancia.use_multi_fontstrings) then
					instancia:SetInLineTexts(thisLine, "", formated_enemyheal, porcentagem)
				else
					thisLine.lineText4:SetText(rightText)
				end
			end
			esta_porcentagem = _math_floor((self.heal_enemy_amt/instancia.top) * 100)

		elseif (sub_atributo == 6) then --mostrando damage prevented

			local formated_absorbs = SelectedToKFunction (_, self.totalabsorb)

			if (not bars_show_data [1]) then
				formated_absorbs = ""
			end
			if (not bars_show_data [3]) then
				porcentagem = ""
			else
				porcentagem = porcentagem .. "%"
			end

			local rightText = formated_absorbs .. bars_brackets[1] .. porcentagem .. bars_brackets[2]
			if (UsingCustomRightText) then
				thisLine.lineText4:SetText(_string_replace (instancia.row_info.textR_custom_text, formated_absorbs, "", porcentagem, self, instancia.showing, instancia, rightText))
			else
				if (instancia.use_multi_fontstrings) then
					instancia:SetInLineTexts(thisLine, "", formated_absorbs, porcentagem)
				else
					thisLine.lineText4:SetText(rightText)
				end
			end
			esta_porcentagem = _math_floor((self.totalabsorb/instancia.top) * 100)

		elseif (sub_atributo == 7) then --mostrando cura negada

			local formated_absorbs = SelectedToKFunction (_, self.totaldenied)

			if (not bars_show_data [1]) then
				formated_absorbs = ""
			end
			if (not bars_show_data [3]) then
				porcentagem = ""
			else
				porcentagem = porcentagem .. "%"
			end

			local rightText = formated_absorbs .. bars_brackets[1] .. porcentagem .. bars_brackets[2]
			if (UsingCustomRightText) then
				thisLine.lineText4:SetText(_string_replace (instancia.row_info.textR_custom_text, formated_absorbs, "", porcentagem, self, instancia.showing, instancia, rightText))
			else
				if (instancia.use_multi_fontstrings) then
					instancia:SetInLineTexts(thisLine, "", formated_absorbs, porcentagem)
				else
					thisLine.lineText4:SetText(rightText)
				end
			end
			esta_porcentagem = _math_floor((self.totaldenied/instancia.top) * 100)

		end
	end

	if (thisLine.mouse_over and not instancia.baseframe.isMoving) then --precisa atualizar o tooltip
		gump:UpdateTooltip (whichRowLine, thisLine, instancia)
	end

	actor_class_color_r, actor_class_color_g, actor_class_color_b = self:GetBarColor()

	return self:RefreshBarra2 (thisLine, instancia, tabela_anterior, forcar, esta_porcentagem, whichRowLine, barras_container, use_animations)
end

function healingClass:RefreshBarra2 (thisLine, instancia, tabela_anterior, forcar, esta_porcentagem, whichRowLine, barras_container, use_animations)

	--primeiro colocado
	if (thisLine.colocacao == 1) then
		if (not tabela_anterior or tabela_anterior ~= thisLine.minha_tabela or forcar) then
			thisLine:SetValue(100)
			thisLine:Show()

			if (thisLine.hidden or thisLine.fading_in or thisLine.faded) then
				Details.FadeHandler.Fader(thisLine, "out")
			end

			return self:RefreshBarra(thisLine, instancia)
		else
			return
		end
	else

		if (thisLine.hidden or thisLine.fading_in or thisLine.faded) then

			thisLine:SetValue(esta_porcentagem)
			if (use_animations) then
				thisLine.animacao_fim = esta_porcentagem
			else
				thisLine.animacao_ignorar = true
			end

			Details.FadeHandler.Fader(thisLine, "out")

			if (instancia.row_info.texture_class_colors) then
				thisLine.textura:SetVertexColor(actor_class_color_r, actor_class_color_g, actor_class_color_b)
			end
			if (instancia.row_info.texture_background_class_color) then
				thisLine.background:SetVertexColor(actor_class_color_r, actor_class_color_g, actor_class_color_b)
			end

			return self:RefreshBarra(thisLine, instancia)

		else
			--agora esta comparando se a tabela da barra � diferente da tabela na atualiza��o anterior
			if (not tabela_anterior or tabela_anterior ~= thisLine.minha_tabela or forcar) then --aqui diz se a barra do jogador mudou de posi��o ou se ela apenas ser� atualizada

				if (use_animations) then
					thisLine.animacao_fim = esta_porcentagem
				else
					thisLine:SetValue(esta_porcentagem)
					thisLine.animacao_ignorar = true
				end

				thisLine.last_value = esta_porcentagem --reseta o ultimo valor da barra

				return self:RefreshBarra(thisLine, instancia)

			elseif (esta_porcentagem ~= thisLine.last_value) then --continua mostrando a mesma tabela ent�o compara a porcentagem
				--apenas atualizar
				if (use_animations) then
					thisLine.animacao_fim = esta_porcentagem
				else
					thisLine:SetValue(esta_porcentagem)
				end
				thisLine.last_value = esta_porcentagem

				return self:RefreshBarra(thisLine, instancia)
			end
		end

	end

end

function healingClass:RefreshBarra(thisLine, instancia, from_resize)

	local class, enemy, arena_enemy, arena_ally = self.classe, self.enemy, self.arena_enemy, self.arena_ally

	if (from_resize) then
		actor_class_color_r, actor_class_color_g, actor_class_color_b = self:GetBarColor()
	end

	--icon
	self:SetClassIcon (thisLine.icone_classe, instancia, class)
	
	if(thisLine.mouse_over) then
		local classIcon = thisLine:GetClassIcon()
		thisLine.iconHighlight:SetTexture(classIcon:GetTexture())
		thisLine.iconHighlight:SetTexCoord(classIcon:GetTexCoord())
		thisLine.iconHighlight:SetVertexColor(classIcon:GetVertexColor())
	end
	--texture color
	self:SetBarColors(thisLine, instancia, actor_class_color_r, actor_class_color_g, actor_class_color_b)
	--left text
	self:SetBarLeftText (thisLine, instancia, enemy, arena_enemy, arena_ally, UsingCustomLeftText)

	thisLine.lineText1:SetSize(thisLine:GetWidth() - thisLine.lineText4:GetStringWidth() - 20, 15)

end

function _detalhes:CloseShields(combat)
	if (not _detalhes.parser_options.shield_overheal) then
		return
	end

	local shieldCache = _detalhes.ShieldCache
	local container = combat[2]
	local timeNow = time()
	local parser = _detalhes.parser
	local getSpellInfo = GetSpellInfo --does not add the spell into the spell info cache

	for targetName, spellid_table in pairs(shieldCache) do
		local tgt = container:PegarCombatente (_, targetName)
		if (tgt) then
			for spellid, owner_table in pairs(spellid_table) do
				local spellname = getSpellInfo(spellid)
				for owner, amount in pairs(owner_table) do
					if (amount > 0) then
						local obj = container:PegarCombatente (_, owner)
						if (obj) then
							parser:heal("SPELL_AURA_REMOVED", timeNow, obj.serial, owner, obj.flag_original, tgt.serial, targetName, tgt.flag_original, nil, spellid, spellname, nil, 0, _math_ceil (amount), 0, 0, nil, true)
						end
					end
				end
			end
		end
	end
end

--------------------------------------------- // TOOLTIPS // ---------------------------------------------


---------TOOLTIPS BIFURCA��O ~tooltip
function healingClass:ToolTip (instancia, numero, barra, keydown)
	--seria possivel aqui colocar o icone da classe dele?

	if (instancia.atributo == 5) then --custom
		return self:TooltipForCustom (barra)
	else
		--GameTooltip:ClearLines()
		--GameTooltip:AddLine(barra.colocacao..". "..self.nome)
		if (instancia.sub_atributo <= 3) then --healing done, HPS or Overheal
			return self:ToolTip_HealingDone (instancia, numero, barra, keydown)
		elseif (instancia.sub_atributo == 6) then --healing done, HPS or Overheal
			return self:ToolTip_HealingDone (instancia, numero, barra, keydown)
		elseif (instancia.sub_atributo == 4) then --healing taken
			return self:ToolTip_HealingTaken (instancia, numero, barra, keydown)
		elseif (instancia.sub_atributo == 7) then --heal denied
			return self:ToolTip_HealingDenied (instancia, numero, barra, keydown)
		end
	end
end
--tooltip locals
local r, g, b
local barAlha = .6

---------HEAL DENIED
function healingClass:ToolTip_HealingDenied (instancia, numero, barra, keydown)

	local owner = self.owner
	if (owner and owner.classe) then
		r, g, b = unpack(_detalhes.class_colors [owner.classe])
	else
		r, g, b = unpack(_detalhes.class_colors [self.classe])
	end

	local container = instancia.showing [2]
	local totalDenied = self.totaldenied

	local spellList = {} --spells the player used to deny heal
	local targetList = {} --all players affected
	local spellsDenied = {} --all spells which had heal denied
	local healersDenied = {} --heal denied on healers

	local icon_size = _detalhes.tooltip.icon_size
	local icon_border = _detalhes.tooltip.icon_border_texcoord

	for spellID, spell in pairs(self.spells._ActorTable) do
		if (spell.totaldenied > 0 and spell.heal_denied) then
			--my spells which denied heal
			tinsert(spellList, {spell, spell.totaldenied})

			--players affected
			for playerName, amount in pairs(spell.targets) do
				targetList [playerName] = (targetList [playerName] or 0) + amount
			end

			--spells with heal denied
			for spellID, amount in pairs(spell.heal_denied) do
				spellsDenied [spellID] = (spellsDenied [spellID] or 0) + amount
			end

			--healers denied
			for healerName, amount in pairs(spell.heal_denied_healers) do
				healersDenied [healerName] = (healersDenied [healerName] or 0) + amount
			end
		end
	end

	--Spells
		table.sort (spellList, _detalhes.Sort2)
		--_detalhes:AddTooltipSpellHeaderText ("Spells", headerColor, #spellList, [[Interface\TUTORIALFRAME\UI-TutorialFrame-LevelUp]], 0.10546875, 0.89453125, 0.05859375, 0.6796875)
		--_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)

		local ismaximized = false
		if (keydown == "shift" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 3) then
			--GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay2)
			--_detalhes:AddTooltipHeaderStatusbar (r, g, b, 1)
			ismaximized = true
		else
			--GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay1)
			--_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)
		end

		local tooltip_max_abilities = _detalhes.tooltip.tooltip_max_abilities
		if (ismaximized) then
			tooltip_max_abilities = 99
		end

		for i = 1, _math_min(tooltip_max_abilities, #spellList) do
			local spellObject, spellTotal = unpack(spellList [i])

			if (spellTotal < 1) then
				break
			end

			local spellName, _, spellIcon = _GetSpellInfo(spellObject.id)

			GameCooltip:AddLine(spellName .. ": ", FormatTooltipNumber (_, spellTotal) .. " (" .. _cstr ("%.1f", spellTotal / totalDenied) .."%)")

			GameCooltip:AddIcon (spellIcon, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
			_detalhes:AddTooltipBackgroundStatusbar()
		end

	-- follow esta bugado com este display

	--Target Players
		local playerSorted = {}
		for playerName, amount in pairs(targetList) do
			tinsert(playerSorted, {playerName, amount})
		end
		table.sort (playerSorted, _detalhes.Sort2)
		_detalhes:AddTooltipSpellHeaderText ("Targets", headerColor, #playerSorted, [[Interface\TUTORIALFRAME\UI-TutorialFrame-LevelUp]], 0.10546875, 0.89453125, 0.05859375, 0.6796875)
		_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)

		local ismaximized = false
		if (keydown == "ctrl" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 4) then
			GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_ctrl]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay2)
			_detalhes:AddTooltipHeaderStatusbar (r, g, b, 1)
			ismaximized = true
		else
			GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_ctrl]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay1)
			_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)
		end

		local tooltip_max_abilities2 = _detalhes.tooltip.tooltip_max_targets
		if (ismaximized) then
			tooltip_max_abilities2 = 99
		end

		for i = 1, _math_min(tooltip_max_abilities2, #playerSorted) do

			local playerName, amountDenied = unpack(playerSorted [i])

			GameCooltip:AddLine(playerName .. ": ", FormatTooltipNumber (_, amountDenied) .." (" .. _cstr ("%.1f", amountDenied / totalDenied * 100) .. "%)")
			_detalhes:AddTooltipBackgroundStatusbar()

			local targetActor = container:PegarCombatente (nil, playerName) or instancia.showing [1]:PegarCombatente (nil, playerName)
			if (targetActor) then
				local classe = targetActor.classe
				if (not classe) then
					classe = "UNKNOW"
				end
				if (classe == "UNKNOW") then
					GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, 14, 14, .25, .5, 0, 1)
				else
					GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\classes_small", nil, nil, 14, 14, _unpack(_detalhes.class_coords [classe]))
				end
			end

		end

	-- Spells Affected
		local spellsSorted = {}
		for spellID, amount in pairs(spellsDenied) do
			tinsert(spellsSorted, {spellID, amount})
		end
		table.sort (spellsSorted, _detalhes.Sort2)
		_detalhes:AddTooltipSpellHeaderText ("Spells Affected", headerColor, #spellsSorted, [[Interface\TUTORIALFRAME\UI-TutorialFrame-LevelUp]], 0.10546875, 0.89453125, 0.05859375, 0.6796875)
		_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)

		local ismaximized = false
		local tooltip_max_abilities3 = _detalhes.tooltip.tooltip_max_targets
		if (keydown == "alt" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 5) then
			tooltip_max_abilities3 = 99
			ismaximized = true
		end

		for i = 1, _math_min(tooltip_max_abilities3, #spellsSorted) do

			local spellID, spellTotal = unpack(spellsSorted [i])

			if (spellTotal < 1) then
				break
			end

			local spellName, _, spellIcon = _GetSpellInfo(spellID)

			GameCooltip:AddLine(spellName .. ": ", FormatTooltipNumber (_, spellTotal) .. " (" .. _cstr ("%.1f", spellTotal / totalDenied) .."%)")

			GameCooltip:AddIcon (spellIcon, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
			_detalhes:AddTooltipBackgroundStatusbar()

		end

	--healers denied

		_detalhes:AddTooltipSpellHeaderText ("Healers", headerColor, #spellsSorted, [[Interface\TUTORIALFRAME\UI-TutorialFrame-LevelUp]], 0.10546875, 0.89453125, 0.05859375, 0.6796875)
		_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)

		local healersSorted = {}
		for healerName, amount in pairs(healersDenied) do
			tinsert(healersSorted, {healerName, amount})
		end
		table.sort (healersSorted, _detalhes.Sort2)

		for i = 1, #healersSorted do
			local playerName, amountDenied = unpack(healersSorted [i])

			GameCooltip:AddLine(playerName .. ": ", FormatTooltipNumber (_, amountDenied) .." (" .. _cstr ("%.1f", amountDenied / totalDenied * 100) .. "%)")
			_detalhes:AddTooltipBackgroundStatusbar()

			local targetActor = container:PegarCombatente (nil, playerName) or instancia.showing [1]:PegarCombatente (nil, playerName)
			if (targetActor) then
				local classe = targetActor.classe
				if (not classe) then
					classe = "UNKNOW"
				end
				if (classe == "UNKNOW") then
					GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, 14, 14, .25, .5, 0, 1)
				else
					GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\classes_small", nil, nil, 14, 14, _unpack(_detalhes.class_coords [classe]))
				end
			end
	end

	return true
end

---------HEALING TAKEN
function healingClass:ToolTip_HealingTaken (instancia, numero, barra, keydown)

	local owner = self.owner
	if (owner and owner.classe) then
		r, g, b = unpack(_detalhes.class_colors [owner.classe])
	else
		r, g, b = unpack(_detalhes.class_colors [self.classe])
	end

	local curadores = self.healing_from
	local total_curado = self.healing_taken

	local tabela_do_combate = instancia.showing
	local showing = tabela_do_combate [class_type] --o que esta sendo mostrado -> [1] - dano [2] - cura --pega o container com ._NameIndexTable ._ActorTable

	local meus_curadores = {}

	for nome, _ in pairs(curadores) do --agressores seria a lista de nomes
		local este_curador = showing._ActorTable[showing._NameIndexTable[nome]]
		if (este_curador) then --checagem por causa do total e do garbage collector que n�o limpa os nomes que deram dano
			local alvos = este_curador.targets
			local este_alvo = alvos [self.nome]
			if (este_alvo and este_alvo > 0) then
				meus_curadores [#meus_curadores+1] = {nome, este_alvo, este_curador.classe}
			end
		end
	end

	--_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_FROM"], headerColor, #meus_curadores, [[Interface\TUTORIALFRAME\UI-TutorialFrame-LevelUp]], 0.10546875, 0.89453125, 0.05859375, 0.6796875)
	--_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)

	local ismaximized = false

	if (keydown == "shift" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 3) then
		--GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay2)
		--_detalhes:AddTooltipHeaderStatusbar (r, g, b, 1)
		ismaximized = true
	else
		--GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay1)
		--_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)
	end

	_table_sort (meus_curadores, function(a, b) return a[2] > b[2] end)
	local max = #meus_curadores
	if (max > 9) then
		max = 9
	end

	if (ismaximized) then
		max = 99
	end

	local lineHeight = _detalhes.tooltip.line_height

	for i = 1, _math_min(max, #meus_curadores) do

		local onyName = _detalhes:GetOnlyName(meus_curadores[i][1])
		--translate cyrillic alphabet to western alphabet by Vardex (https://github.com/Vardex May 22, 2019)
		if (instancia.row_info.textL_translit_text) then
			onyName = Translit:Transliterate(onyName, "!")
		end

		GameCooltip:AddLine(onyName, FormatTooltipNumber (_, meus_curadores[i][2]).." (".._cstr ("%.1f", (meus_curadores[i][2]/total_curado) * 100).."%)")
		local classe = meus_curadores[i][3]
		if (not classe) then
			classe = "UNKNOW"
		end
		if (classe == "UNKNOW") then
			GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, lineHeight, lineHeight, .25, .5, 0, 1)
		else
			local specID = _detalhes:GetSpec(meus_curadores[i][1])
			if (specID) then
				local texture, l, r, t, b = _detalhes:GetSpecIcon (specID, false)
				GameCooltip:AddIcon (texture, 1, 1, lineHeight, lineHeight, l, r, t, b)
			else
				GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\classes_small", nil, nil, lineHeight, lineHeight, _unpack(_detalhes.class_coords [classe]))
			end
		end

		_detalhes:AddTooltipBackgroundStatusbar (false, meus_curadores[i][2] / meus_curadores[1][2] * 100)

	end

	return true
end

---------HEALING DONE / HPS / OVERHEAL
local background_heal_vs_absorbs = {value = 100, color = {1, 1, 0, .25}, specialSpark = false, texture = [[Interface\AddOns\Details\images\bar4_glass]]}

function healingClass:ToolTip_HealingDone (instance, numero, barra, keydown)

	local owner = self.owner
	if (owner and owner.classe) then
		r, g, b = unpack(_detalhes.class_colors [owner.classe])
	else
		r, g, b = unpack(_detalhes.class_colors [self.classe])
	end

	local combatObject = instance:GetCombat()

	local ActorHealingTable = {}
	local ActorHealingTargets = {}
	local ActorSkillsContainer = self.spells._ActorTable

	local actor_key, skill_key = "total", "total"
	if (instance.sub_atributo == 3) then
		actor_key, skill_key = "totalover", "overheal"
	elseif (instance.sub_atributo == 6) then
		actor_key, skill_key = "totalabsorb", "totalabsorb"
	end

	local meu_tempo
	if (_detalhes.time_type == 1 or not self.grupo) then
		meu_tempo = self:Tempo()
	elseif (_detalhes.time_type == 2 or _detalhes.time_type == 3) then
		meu_tempo = combatObject:GetCombatTime()
	end

	local ActorTotal = self [actor_key]

	--add actor spells
	for _spellid, _skill in pairs(ActorSkillsContainer) do
		local SkillName, _, SkillIcon = _GetSpellInfo(_spellid)
		if (_skill [skill_key] > 0 or _skill.anti_heal) then
			tinsert(ActorHealingTable, {
				_spellid,
				_skill [skill_key],
				_skill [skill_key]/ActorTotal*100,
				{SkillName, nil, SkillIcon},
				_skill [skill_key]/meu_tempo,
				_skill.total,
				false,
				_skill.anti_heal,
			})
		end
	end

	--add actor pets
	for petIndex, petName in ipairs(self:Pets()) do
		local petActor = combatObject[class_type]:PegarCombatente (nil, petName)
		if (petActor) then
			for _spellid, _skill in pairs(petActor:GetActorSpells()) do
				if (_skill [skill_key] > 0) then
					local SkillName, _, SkillIcon = _GetSpellInfo(_spellid)
					local petName = petName:gsub((" <.*"), "")
					ActorHealingTable [#ActorHealingTable+1] = {
						_spellid,
						_skill [skill_key],
						_skill [skill_key]/ActorTotal*100,
						{SkillName, nil, SkillIcon},
						_skill [skill_key]/meu_tempo,
						_skill.total,
						petName
					}
				end
			end
		end
	end

	_table_sort (ActorHealingTable, _detalhes.Sort2)

	--TOP Curados
	ActorSkillsContainer = self.targets
	for targetName, amount in pairs(ActorSkillsContainer) do
		if (amount > 0) then
			--translate cyrillic alphabet to western alphabet by Vardex (https://github.com/Vardex May 22, 2019)
			if (instance.row_info.textL_translit_text) then
				targetName = Translit:Transliterate(targetName, "!")
			end

			tinsert(ActorHealingTargets, {targetName, amount, amount / ActorTotal * 100})
		end
	end
	_table_sort (ActorHealingTargets, _detalhes.Sort2)

	--Mostra as habilidades no tooltip
	--_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_SPELLS"], headerColor, #ActorHealingTable, [[Interface\RAIDFRAME\Raid-Icon-Rez]], 0.109375, 0.890625, 0.0625, 0.90625)

	local ismaximized = false
	if (keydown == "shift" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 3) then
		--GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay2)
		--_detalhes:AddTooltipHeaderStatusbar (r, g, b, 1)
		ismaximized = true
	else
		--GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay1)
		--_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)
	end

	local tooltip_max_abilities = _detalhes.tooltip.tooltip_max_abilities
	if (instance.sub_atributo == 3 or instance.sub_atributo == 2) then
		tooltip_max_abilities = 9
	end

	if (ismaximized) then
		tooltip_max_abilities = 99
	end

	local icon_size = _detalhes.tooltip.icon_size
	local icon_border = _detalhes.tooltip.icon_border_texcoord

	local topAbility = ActorHealingTable [1] and ActorHealingTable [1][2] or 0

	for i = 1, _math_min(tooltip_max_abilities, #ActorHealingTable) do
		if (ActorHealingTable[i][2] < 1) then
			local antiHeal = ActorHealingTable[i][8]
			if (not antiHeal) then
				break
			end
		end

		local spellName = ActorHealingTable[i][4][1]

		local petName = ActorHealingTable[i][7]
		if (petName) then
			spellName = spellName .. " (|cFFCCBBBB" .. petName .. "|r)"
		end

		if (instance.sub_atributo == 2) then --hps

			local formatedTotal = FormatTooltipNumber (_,  _math_floor(ActorHealingTable[i][5]))
			local antiHeal = ActorHealingTable[i][8]
			if (antiHeal) then
				formatedTotal = formatedTotal .. " [|cFFFF5500" .. FormatTooltipNumber (_, _math_floor(antiHeal)) .." " .. Loc ["STRING_DAMAGE"] .."|r] "
			end

			GameCooltip:AddLine(spellName , formatedTotal .. " (".._cstr ("%.1f", ActorHealingTable[i][3]).."%)")

		elseif (instance.sub_atributo == 3) then --overheal
			local overheal = ActorHealingTable[i][2]
			local total = ActorHealingTable[i][6]
			local formatedTotal = FormatTooltipNumber (_,  _math_floor(ActorHealingTable[i][2]))

			local antiHeal = ActorHealingTable[i][8]
			if (antiHeal) then
				formatedTotal = formatedTotal .. " [|cFFFF5500" .. FormatTooltipNumber (_, _math_floor(antiHeal)) .." " .. Loc ["STRING_DAMAGE"] .."|r] "
			end

			GameCooltip:AddLine(spellName .." (|cFFFF3333" .. _math_floor( (overheal / (overheal+total)) *100)  .. "%|r)", formatedTotal .. " (".._cstr ("%.1f", ActorHealingTable[i][3]).."%)")

		else
			local formatedTotal = FormatTooltipNumber (_, ActorHealingTable[i][2])
			local antiHeal = ActorHealingTable[i][8]
			if (antiHeal) then
				formatedTotal = formatedTotal .. " [|cFFFF5500" .. FormatTooltipNumber (_, _math_floor(antiHeal)) .." " .. Loc ["STRING_DAMAGE"] .."|r] "
			end
			GameCooltip:AddLine(spellName , formatedTotal .. " (" .. _cstr ("%.1f", ActorHealingTable[i][3]) .. "%)")

		end

		GameCooltip:AddIcon (ActorHealingTable[i][4][3], nil, nil, icon_size.W+4, icon_size.H+4, icon_border.L, icon_border.R, icon_border.T, icon_border.B)

		_detalhes:AddTooltipBackgroundStatusbar (false, ActorHealingTable[i][2] / topAbility * 100)
	end

	if (instance.sub_atributo == 6) then
		GameCooltip:AddLine("")
		GameCooltip:AddLine(Loc ["STRING_REPORT_LEFTCLICK"], nil, 1, _unpack(self.click_to_report_color))
		GameCooltip:AddIcon ([[Interface\TUTORIALFRAME\UI-TUTORIAL-FRAME]], 1, 1, 12, 16, 0.015625, 0.13671875, 0.4375, 0.59765625)

		GameCooltip:ShowCooltip()
	end

	local container = combatObject [2]
	local topTarget = ActorHealingTargets [1] and ActorHealingTargets [1][2] or 0

	if (instance.sub_atributo == 1) then -- 1 or 2 -> healing done or hps
		_detalhes:AddTooltipSpellHeaderText ("", headerColor, 1, false, 0.1, 0.9, 0.1, 0.9, true) --add a space
		_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_TARGETS"], headerColor, #ActorHealingTargets, [[Interface\TUTORIALFRAME\UI-TutorialFrame-LevelUp]], 0.10546875, 0.89453125, 0.05859375, 0.6796875)

		local ismaximized = false
		if (keydown == "ctrl" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 4) then
			GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_ctrl]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay2)
			_detalhes:AddTooltipHeaderStatusbar (r, g, b, 1)
			ismaximized = true
		else
			GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_ctrl]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay1)
			_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)
		end

		local tooltip_max_abilities2 = _detalhes.tooltip.tooltip_max_targets
		if (ismaximized) then
			tooltip_max_abilities2 = 99
		end

		for i = 1, _math_min(tooltip_max_abilities2, #ActorHealingTargets) do
			if (ActorHealingTargets[i][2] < 1) then
				break
			end

			if (ismaximized and ActorHealingTargets[i][1]:find(_detalhes.playername)) then
				GameCooltip:AddLine(ActorHealingTargets[i][1], FormatTooltipNumber (_, ActorHealingTargets[i][2]) .." (".._cstr ("%.1f", ActorHealingTargets[i][3]).."%)", nil, "yellow")
				GameCooltip:AddStatusBar (100, 1, .5, .5, .5, .7)
			else
				GameCooltip:AddLine(ActorHealingTargets[i][1], FormatTooltipNumber (_, ActorHealingTargets[i][2]) .." (".._cstr ("%.1f", ActorHealingTargets[i][3]).."%)")
				_detalhes:AddTooltipBackgroundStatusbar (false, ActorHealingTargets[i][2] / topTarget * 100)
			end

			local targetActor = container:PegarCombatente (nil, ActorHealingTargets[i][1])

			if (targetActor) then
				local classe = targetActor.classe
				if (not classe) then
					classe = "UNKNOW"
				end
				if (classe == "UNKNOW") then
					GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, icon_size.W, icon_size.H, .25, .5, 0, 1)
				else
					GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\classes_small", nil, nil, icon_size.W, icon_size.H, _unpack(_detalhes.class_coords [classe]))
				end
			end
		end
	end

	--PETS
	local meus_pets = self.pets

	if (#meus_pets > 0 and (instance.sub_atributo == 1 or instance.sub_atributo == 2 or instance.sub_atributo == 3)) then --teve ajudantes

		local quantidade = {} --armazena a quantidade de pets iguais
		local totais = {} --armazena o dano total de cada objeto

		for index, nome in ipairs(meus_pets) do
			if (not quantidade [nome]) then
				quantidade [nome] = 1

				local my_self = combatObject [class_type]:PegarCombatente (nil, nome)

				if (my_self) then
					local meu_tempo
					if (_detalhes.time_type == 1 or not self.grupo) then
						meu_tempo = my_self:Tempo()
					elseif (_detalhes.time_type == 2 or _detalhes.time_type == 3) then
						meu_tempo = combatObject:GetCombatTime()
					end

					if (instance.sub_atributo == 3) then
						totais [#totais+1] = {nome, my_self.totalover, my_self.total_without_pet}
					else
						totais [#totais+1] = {nome, my_self.total_without_pet, my_self.total_without_pet / meu_tempo}
					end

				end

			else
				quantidade [nome] = quantidade [nome]+1
			end
		end

		local added_logo = false

		_table_sort (totais, _detalhes.Sort2)

		local ismaximized = false
		if (keydown == "alt" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 5) then
			ismaximized = true
		end

		for index, _table in ipairs(totais) do

			if (_table [2] >= 1 and (index < 3 or ismaximized)) then

				if (not added_logo) then
					added_logo = true
					_detalhes:AddTooltipSpellHeaderText ("", headerColor, 1, false, 0.1, 0.9, 0.1, 0.9, true) --add a space
					_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_PETS"], headerColor, #totais, [[Interface\COMMON\friendship-heart]], 0.21875, 0.78125, 0.09375, 0.6875)

					if (ismaximized) then
						GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_alt]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay2)
						_detalhes:AddTooltipHeaderStatusbar (r, g, b, 1)
					else
						GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_alt]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay1)
						_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)
					end

				end

				local n = _table [1]:gsub(("%s%<.*"), "")
				if (instance.sub_atributo == 3) then --overheal
					GameCooltip:AddLine(n .. " (|cFFFF3333" .. _math_floor( (_table [2] / (_table [2] + _table [3])) * 100)  .. "%|r):", FormatTooltipNumber (_,  _math_floor(_table [2])) .. " (" .. _math_floor( (_table [2] / (_table [2] + _table [3])) * 100) .. "%)")

				elseif (instance.sub_atributo == 2) then --hps
					GameCooltip:AddLine(n, FormatTooltipNumber (_,  _math_floor(_table [3])) .. " (" .. _math_floor(_table [2]/self.total*100) .. "%)")
				else
					GameCooltip:AddLine(n, FormatTooltipNumber (_, _table [2]) .. " (" .. _math_floor(_table [2]/self.total*100) .. "%)")
				end
				_detalhes:AddTooltipBackgroundStatusbar()
				GameCooltip:AddIcon ([[Interface\AddOns\Details\images\classes_small]], 1, 1, icon_size.W, icon_size.H, 0.25, 0.49609375, 0.75, 1)
			end
		end
	end

	--~Phases
	if (instance.sub_atributo == 1 or instance.sub_atributo == 2) then
		local segment = combatObject
		if (segment and self.grupo) then
			local bossInfo = segment:GetBossInfo()
			local phasesInfo = segment:GetPhases()
			if (bossInfo and phasesInfo) then
				if (#phasesInfo > 1) then
					_detalhes:AddTooltipSpellHeaderText ("", headerColor, 1, false, 0.1, 0.9, 0.1, 0.9, true) --add a space
					_detalhes:AddTooltipSpellHeaderText ("Healing by Encounter Phase", headerColor, 1, [[Interface\Garrison\orderhall-missions-mechanic8]], 11/64, 53/64, 11/64, 53/64)
					_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)

					local playerPhases = {}
					local totalDamage = 0

					for phase, playersTable in pairs(phasesInfo.heal) do --each phase

						local allPlayers = {} --all players for this phase
						for playerName, amount in pairs(playersTable) do
							tinsert(allPlayers, {playerName, amount})
							totalDamage = totalDamage + amount
						end
						table.sort (allPlayers, function(a, b) return a[2] > b[2] end)

						local myRank = 0
						for i = 1, #allPlayers do
							if (allPlayers [i] [1] == self.nome) then
								myRank = i
								break
							end
						end

						tinsert(playerPhases, {phase, playersTable [self.nome] or 0, myRank, (playersTable [self.nome] or 0) / totalDamage * 100})
					end

					table.sort (playerPhases, function(a, b) return a[1] < b[1] end)

					for i = 1, #playerPhases do
						--[1] Phase Number [2] Amount Done [3] Rank [4] Percent
						GameCooltip:AddLine("|cFFF0F0F0Phase|r " .. playerPhases [i][1], FormatTooltipNumber (_, playerPhases [i][2]) .. " (|cFFFFFF00#" .. playerPhases [i][3] ..  "|r, " .. _cstr ("%.1f", playerPhases [i][4]) .. "%)")
						GameCooltip:AddIcon ([[Interface\Garrison\orderhall-missions-mechanic9]], 1, 1, 14, 14, 11/64, 53/64, 11/64, 53/64)
						_detalhes:AddTooltipBackgroundStatusbar()
					end
				end
			end
		end
	end

	return true
end


--------------------------------------------- // JANELA DETALHES // ---------------------------------------------
---------- bifurca��o
function healingClass:MontaInfo()
	if (breakdownWindowFrame.sub_atributo == 1 or breakdownWindowFrame.sub_atributo == 2) then
		self:MontaInfoHealingDone()

		--[=[
		local bNeedUpdateAgain = false

		--sort by healing done
		---@type df_headerframe
		local spellsHeader = DetailsSpellBreakdownTab.GetSpellScrollFrame().Header
		local totalHeader = spellsHeader:GetHeaderColumnByName("amount")
		if (totalHeader and totalHeader:IsShown()) then
			local columnSelected, order, key, name = spellsHeader:GetSelectedColumn()
			if (name == "overheal") then
				totalHeader:Click()
				bNeedUpdateAgain = true
			end
		end

		---@type df_headerframe
		local targetsHeader = DetailsSpellBreakdownTab.GetTargetScrollFrame().Header
		local totalHeader = targetsHeader:GetHeaderColumnByName("amount")
		if (totalHeader and totalHeader:IsShown()) then
			local columnSelected, order, key, name = targetsHeader:GetSelectedColumn()
			if (name == "overheal") then
				totalHeader:Click()
				bNeedUpdateAgain = true
			end
		end

		if (bNeedUpdateAgain) then
			self:MontaInfoHealingDone()
		end
		--]=]

	elseif (breakdownWindowFrame.sub_atributo == 3) then
		self:MontaInfoHealingDone()

		--[=[
		local bNeedUpdateAgain = false

		--sort by overhealing
		---@type df_headerframe
		local spellsHeader = DetailsSpellBreakdownTab.GetSpellScrollFrame().Header
		local overhealHeader = spellsHeader:GetHeaderColumnByName("overheal")
		if (overhealHeader and overhealHeader:IsShown()) then
			local columnSelected, order, key, name = spellsHeader:GetSelectedColumn()
			if (name ~= "overheal") then
				overhealHeader:Click()
				bNeedUpdateAgain = true
			end
		end

		---@type df_headerframe
		local targetsHeader = DetailsSpellBreakdownTab.GetTargetScrollFrame().Header
		local overhealHeader = targetsHeader:GetHeaderColumnByName("overheal")
		if (overhealHeader and overhealHeader:IsShown()) then
			local columnSelected, order, key, name = targetsHeader:GetSelectedColumn()
			if (name ~= "overheal") then
				overhealHeader:Click()
				bNeedUpdateAgain = true
			end
		end

		if (bNeedUpdateAgain) then
			self:MontaInfoHealingDone()
		end
		--]=]

	elseif (breakdownWindowFrame.sub_atributo == 4) then
		self:MontaInfoHealTaken()
	end
end

local healingTakenHeadersAllowed = {icon = true, name = true, rank = true, amount = true, persecond = true, percent = true}
function healingClass:MontaInfoHealTaken()
	---@type actor
	local actorObject = self
	---@type instance
	local instance = breakdownWindowFrame.instancia
	---@type combat
	local combatObject = instance:GetCombat()
	---@type string
	local actorName = actorObject:Name()

	---@type number
	local healTakenTotal = actorObject.healing_taken
	---@type table<string, boolean>
	local healTakenFrom = actorObject.healing_from
	---@type actorcontainer
	local healContainer = combatObject:GetContainer(class_type)

	local resultTable = {}

	---@type string
	for healerName in pairs(healTakenFrom) do
		local sourceActorObject = healContainer:GetActor(healerName)
		if (sourceActorObject) then
			---@type table<string, number>
			local targets = sourceActorObject:GetTargets()
			---@type number|nil
			local amountOfHeal = targets[actorName]
			if (amountOfHeal) then
				---@type texturetable
				local iconTable = Details:GetActorIcon(sourceActorObject)

				---@type {name: string, amount: number, icon: texturetable}
				local healTakenTable = {name = healerName, total = amountOfHeal, icon = iconTable}

				resultTable[#resultTable+1] = healTakenTable
			end
		end
	end

	resultTable.totalValue = healTakenTotal
	resultTable.combatTime = combatObject:GetCombatTime()
	resultTable.headersAllowed = healingTakenHeadersAllowed

	Details222.BreakdownWindow.SendGenericData(resultTable, actorObject, combatObject, instance)

	if true then return end

	local healing_taken = self.healing_taken
	local curandeiros = self.healing_from
	local instancia = breakdownWindowFrame.instancia
	local tabela_do_combate = instancia.showing
	local showing = tabela_do_combate [class_type] --o que esta sendo mostrado -> [1] - dano [2] - cura --pega o container com ._NameIndexTable ._ActorTable
	local barras = breakdownWindowFrame.barras1
	local meus_curandeiros = {}

	local este_curandeiro
	for nome, _ in pairs(curandeiros) do
		este_curandeiro = showing._ActorTable[showing._NameIndexTable[nome]]
		if (este_curandeiro) then
			local alvos = este_curandeiro.targets
			local este_alvo = alvos [self.nome]
			if (este_alvo) then
				meus_curandeiros [#meus_curandeiros+1] = {nome, este_alvo, este_alvo/healing_taken*100, este_curandeiro.classe}
			end
		end
	end

	local amt = #meus_curandeiros

	if (amt < 1) then
		return true
	end

	_table_sort (meus_curandeiros, _detalhes.Sort2)

	gump:JI_AtualizaContainerBarras (amt)

	local max_ = meus_curandeiros [1] and meus_curandeiros [1][2] or 0

	local barra
	for index, tabela in ipairs(meus_curandeiros) do
		barra = barras [index]
		if (not barra) then
			barra = gump:CriaNovaBarraInfo1 (instancia, index)
		end

		self:FocusLock(barra, tabela[1])

		--hes:UpdadeInfoBar(row, index, spellid, name, value, max, percent, icon, detalhes)

		local texCoords = CLASS_ICON_TCOORDS [tabela[4]]
		if (not texCoords) then
			texCoords = _detalhes.class_coords ["UNKNOW"]
		end

		local formated_value = SelectedToKFunction (_, _math_floor(tabela[2]))
		self:UpdadeInfoBar(barra, index, tabela[1], tabela[1], tabela[2], formated_value, max_, tabela[3], "Interface\\AddOns\\Details\\images\\classes_small", true, texCoords)
	end

end

function healingClass:MontaInfoOverHealing() --this should be deprecated now
--pegar as habilidade de dar sort no heal

	local instancia = breakdownWindowFrame.instancia
	local total = self.totalover
	local tabela = self.spells._ActorTable
	local minhas_curas = {}
	local barras = breakdownWindowFrame.barras1

	for spellid, tabela in pairs(tabela) do
		local nome, _, icone = _GetSpellInfo(spellid)
		tinsert(minhas_curas, {spellid, tabela.overheal, tabela.overheal/total*100, nome, icone})
	end

	--add pets
	local ActorPets = self.pets
	local class_color = "FFDDDDDD"
	for _, PetName in ipairs(ActorPets) do
		local PetActor = instancia.showing (class_type, PetName)
		if (PetActor) then
			local PetSkillsContainer = PetActor.spells._ActorTable
			for _spellid, _skill in pairs(PetSkillsContainer) do --da foreach em cada spellid do container
				local nome, _, icone = _GetSpellInfo(_spellid)
				tinsert(minhas_curas, {_spellid, _skill.overheal, _skill.overheal/total*100, nome .. " (|c" .. class_color .. PetName:gsub((" <.*"), "") .. "|r)", icone, PetActor})
			end
		end
	end

	_table_sort (minhas_curas, _detalhes.Sort2)

	local amt = #minhas_curas
	gump:JI_AtualizaContainerBarras (amt)

	local max_ = minhas_curas[1] and minhas_curas[1][2] or 0

	for index, tabela in ipairs(minhas_curas) do

		local barra = barras [index]

		if (not barra) then
			barra = gump:CriaNovaBarraInfo1 (instancia, index)
			barra.textura:SetStatusBarColor(1, 1, 1, 1)
			barra.on_focus = false
		end

		if (not breakdownWindowFrame.mostrando_mouse_over) then
			if (tabela[1] == self.detalhes) then --tabela [1] = spellid = spellid que esta na caixa da direita
				if (not barra.on_focus) then --se a barra n�o tiver no foco
					barra.textura:SetStatusBarColor(129/255, 125/255, 69/255, 1)
					barra.on_focus = true
					if (not breakdownWindowFrame.mostrando) then
						breakdownWindowFrame.mostrando = barra
					end
				end
			else
				if (barra.on_focus) then
					barra.textura:SetStatusBarColor(1, 1, 1, 1) --volta a cor antiga
					barra:SetAlpha(.9) --volta a alfa antiga
					barra.on_focus = false
				end
			end
		end

		if (index == 1) then
			barra.textura:SetValue(100)
		else
			barra.textura:SetValue(tabela[2]/max_*100) --muito mais rapido...
		end

		barra.lineText1:SetText(index..instancia.divisores.colocacao..tabela[4]) --seta o texto da esqueda

		local formated_value = SelectedToKFunction (_, _math_floor(tabela[2]))
		barra.lineText4:SetText(formated_value .." (".. _cstr ("%.1f", tabela[3]) .."%)")

		barra.icone:SetTexture(tabela[5])

		barra.other_actor = tabela [6]
		barra.minha_tabela = self
		barra.show = tabela[1]
		barra:Show()

		if (self.detalhes and self.detalhes == barra.show) then
			self:MontaDetalhes (self.detalhes, barra)
		end
	end

	--TOP OVERHEALED
	local jogadores_overhealed = {}
	tabela = self.targets_overheal
	local heal_container = instancia.showing[2]
	for target_name, amount in pairs(tabela) do
		local classe = "UNKNOW"
		local actor_object = heal_container._ActorTable [heal_container._NameIndexTable [tabela.nome]]
		if (actor_object) then
			classe = actor_object.classe
		end
		tinsert(jogadores_overhealed, {target_name, amount, amount/total*100, classe})
	end
	_table_sort (jogadores_overhealed, _detalhes.Sort2)

	local amt_alvos = #jogadores_overhealed
	gump:JI_AtualizaContainerAlvos (amt_alvos)

	local max_inimigos = jogadores_overhealed[1] and jogadores_overhealed[1][2] or 0

	for index, tabela in ipairs(jogadores_overhealed) do

		local barra = breakdownWindowFrame.barras2 [index]

		if (not barra) then
			barra = gump:CriaNovaBarraInfo2 (instancia, index)
			barra.textura:SetStatusBarColor(1, 1, 1, 1)
		end

		if (index == 1) then
			barra.textura:SetValue(100)
		else
			barra.textura:SetValue(tabela[2]/max_*100)
		end

		barra.lineText1:SetText(index..instancia.divisores.colocacao..tabela[1]) --seta o texto da esqueda
		barra.lineText4:SetText(_detalhes:comma_value (tabela[2]) .." ".. instancia.divisores.abre .. _cstr ("%.1f", tabela[3]) .. instancia.divisores.fecha)
		barra.lineText1:SetWidth(barra:GetWidth() - barra.lineText4:GetStringWidth() - 30)

		-- icon
		barra.icone:SetTexture([[Interface\AddOns\Details\images\classes_small]])

		local texCoords = _detalhes.class_coords [tabela[4]]
		if (not texCoords) then
			texCoords = _detalhes.class_coords ["UNKNOW"]
		end
		barra.icone:SetTexCoord(_unpack(texCoords))

		barra.minha_tabela = self
		barra.nome_inimigo = tabela [1]

		barra:Show()
	end
end

function healingClass:MontaInfoHealingDone()
	---@type actor
	local actorObject = self
	---@type instance
	local instance = breakdownWindowFrame.instancia
	---@type combat
	local combatObject = instance:GetCombat()
	---@type string
	local playerName = actorObject:Name()

	---@type number
	local actorTotal = actorObject.total
	---@type table
	local actorSpellsSorted = {}
	---@type table<number, spelltable>
	local actorSpells = actorObject:GetSpellList()

	--get time
	local actorCombatTime
	if (Details.time_type == 1 or not actorObject.grupo) then
		actorCombatTime = actorObject:Tempo()
	elseif (Details.time_type == 2 or Details.use_realtimedps) then
		actorCombatTime = breakdownWindowFrame:GetCombat():GetCombatTime()
	end

	--actor spells
	---@type table<string, number>
	local alreadyAdded = {}
	for spellId, spellTable in pairs(actorSpells) do
		---@cast spellId number
		---@cast spellTable spelltable

		spellTable.ChartData = nil

		---@type string
		local spellName = _GetSpellInfo(spellId)
		if (spellName) then
			---@type number in which index the spell with the same name was stored
			local index = alreadyAdded[spellName]
			if (index) then
				---@type spelltableadv
				local bkSpellData = actorSpellsSorted[index]

				bkSpellData.spellTables[#bkSpellData.spellTables+1] = spellTable

				---@type bknesteddata
				local nestedData = {spellId = spellId, spellTable = spellTable, actorName = "", value = 0}
				bkSpellData.nestedData[#bkSpellData.nestedData+1] = nestedData
				bkSpellData.bCanExpand = true
			else
				---@type spelltableadv
				local bkSpellData = {
					id = spellId,
					spellschool = spellTable.spellschool,
					bIsExpanded = Details222.BreakdownWindow.IsSpellExpanded(spellId),
					bCanExpand = false,

					spellTables = {spellTable},
					nestedData = {{spellId = spellId, spellTable = spellTable, actorName = "", value = 0}},
				}
				detailsFramework:Mixin(bkSpellData, Details.SpellTableMixin)

				actorSpellsSorted[#actorSpellsSorted+1] = bkSpellData
				alreadyAdded[spellName] = #actorSpellsSorted
			end
		end
	end

	--pets spells
	local actorPets = actorObject:GetPets()
	for _, petName in ipairs(actorPets) do
		---@type actor
		local petActor = combatObject(DETAILS_ATTRIBUTE_HEAL, petName)
		if (petActor) then --PET
			local spells = petActor:GetSpellList()
			for spellId, spellTable in pairs(spells) do
				---@cast spellId number
				---@cast spellTable spelltable

				spellTable.ChartData = nil
				--PET
				---@type string
				local spellName = _GetSpellInfo(spellId)
				if (spellName) then
					---@type number in which index the spell with the same name was stored
					local index = alreadyAdded[spellName]
					if (index) then --PET
						---@type spelltableadv
						local bkSpellData = actorSpellsSorted[index]

						bkSpellData.spellTables[#bkSpellData.spellTables+1] = spellTable

						---@type bknesteddata
						local nestedData = {spellId = spellId, spellTable = spellTable, actorName = petName, value = 0}
						bkSpellData.nestedData[#bkSpellData.nestedData+1] = nestedData
						bkSpellData.bCanExpand = true
					else --PET
						---@type spelltableadv
						local bkSpellData = {
							id = spellId,
							actorName = petName,
							spellschool = spellTable.spellschool,
							expanded = Details222.BreakdownWindow.IsSpellExpanded(spellId),
							bCanExpand = false,

							spellTables = {spellTable},
							nestedData = {{spellId = spellId, spellTable = spellTable, actorName = petName, value = 0}},
						}
						detailsFramework:Mixin(bkSpellData, Details.SpellTableMixin)

						actorSpellsSorted[#actorSpellsSorted+1] = bkSpellData
						alreadyAdded[spellName] = #actorSpellsSorted
					end
				end
			end
		end
	end

	for i = 1, #actorSpellsSorted do
		---@type spelltableadv
		local bkSpellData = actorSpellsSorted[i]
		Details.SpellTableMixin.SumSpellTables(bkSpellData.spellTables, bkSpellData)
		--Details:Destroy(bkSpellData, "spellTables")
	end

	--table.sort(actorSpellsSorted, Details.Sort2)
	table.sort(actorSpellsSorted, function(t1, t2)
		return t1.total > t2.total
	end)

	actorSpellsSorted.totalValue = actorTotal
	actorSpellsSorted.combatTime = actorCombatTime

	--cleanup
	Details:Destroy(alreadyAdded)

	--actorSpellsSorted has the spell infomation, need to pass to the summary tab
	--send to the breakdown window
	Details222.BreakdownWindow.SendSpellData(actorSpellsSorted, actorObject, combatObject, instance)

	--targets

	---an array of breakdowntargettable
	---@type breakdowntargettable[]
	local targetList = {}

	--get the targets table: in the class heal, an actor has two targets table, one for normal healing and one for overheal
	---@type targettable
	local normalTargetsTable = self:GetTargets("targets")
	---@type targettable
	local overhealTargetsTable = self:GetTargets("targets_overheal")

	local targetTotalValue = 0
	local targetOverhealTotalValue = 0

	--build the data required by the breakdown window
	for targetName, amount in pairs(normalTargetsTable) do
		if (amount > 0) then
			local overhealAmount = overhealTargetsTable[targetName] or 0
			---@type breakdowntargettable
			local bkTargetData = {
				name = targetName,
				total = amount,
				overheal = overhealAmount,
			}
			targetTotalValue = targetTotalValue + amount
			targetOverhealTotalValue = targetOverhealTotalValue + (overhealAmount)
			tinsert(targetList, bkTargetData)
		end
	end

	for targetName, amount in pairs(overhealTargetsTable) do
		if (amount > 0) then
			if (not normalTargetsTable[targetName]) then
				---@type breakdowntargettable
				local bkTargetData = {
					name = targetName,
					total = 0,
					overheal = amount,
				}
				targetOverhealTotalValue = targetOverhealTotalValue + (amount)
				tinsert(targetList, bkTargetData)
			end
		end
	end

	targetList.totalValue = targetTotalValue
	targetList.totalValueOverheal = targetOverhealTotalValue
	targetList.combatTime = actorCombatTime

	Details222.BreakdownWindow.SendTargetData(targetList, actorObject, combatObject, instance)
end

function healingClass:MontaTooltipAlvos (thisLine, index, instancia)

	local inimigo = thisLine.nome_inimigo
	local container = self.spells._ActorTable
	local habilidades = {}
	local total
	local sub_atributo = breakdownWindowFrame.instancia.sub_atributo

	local targets_key = ""

	if (sub_atributo == 3) then --overheal
		total = self.totalover
		targets_key = "_overheal"
	else
		total = self.total
	end

	_detalhes:FormatCooltipForSpells()
	GameCooltip:SetOwner(thisLine, "bottom", "top", 4, -2)
	GameCooltip:SetOption("MinWidth", max(230, thisLine:GetWidth()*0.98))

	--add spells
	for spellid, tabela in pairs(container) do
		for target_name, amount in pairs(tabela ["targets" .. targets_key]) do
			if (target_name == inimigo) then
				local nome, _, icone = _GetSpellInfo(spellid)
				habilidades [#habilidades+1] = {nome, amount, icone}
			end
		end
	end

	--add pets
	local ActorPets = self.pets
	for _, PetName in ipairs(ActorPets) do
		local PetActor = instancia.showing (class_type, PetName)
		if (PetActor) then
			local PetSkillsContainer = PetActor.spells._ActorTable
			for _spellid, _skill in pairs(PetSkillsContainer) do

				for target_name, amount in pairs(_skill ["targets" .. targets_key]) do
					if (target_name == inimigo) then
						local nome, _, icone = _GetSpellInfo(_spellid)
						habilidades [#habilidades+1] = {nome, amount, icone}
					end
				end

			end
		end
	end

	_table_sort (habilidades, _detalhes.Sort2)

	--get time type
	local meu_tempo
	if (_detalhes.time_type == 1 or not self.grupo) then
		meu_tempo = self:Tempo()
	elseif (_detalhes.time_type == 2 or _detalhes.time_type == 3) then
		meu_tempo = breakdownWindowFrame.instancia.showing:GetCombatTime()
	end

	local is_hps = breakdownWindowFrame.instancia.sub_atributo == 2

	if (is_hps) then
		--GameTooltip:AddLine(index..". "..inimigo)
		--GameTooltip:AddLine(Loc ["STRING_HEALING_HPS_FROM"] .. ":")
		--GameTooltip:AddLine(" ")
		_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_HEALING_HPS_FROM"] .. ":", {1, 0.9, 0.0, 1}, 1, _detalhes.tooltip_spell_icon.file, unpack(_detalhes.tooltip_spell_icon.coords))
		_detalhes:AddTooltipHeaderStatusbar (1, 1, 1, 1)
	else
		--GameTooltip:AddLine(index..". "..inimigo)
		--GameTooltip:AddLine(Loc ["STRING_HEALING_FROM"] .. ":")
		--GameTooltip:AddLine(" ")
		_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_HEALING_FROM"] .. ":", {1, 0.9, 0.0, 1}, 1, _detalhes.tooltip_spell_icon.file, unpack(_detalhes.tooltip_spell_icon.coords))
		_detalhes:AddTooltipHeaderStatusbar (1, 1, 1, 1)
	end

	local icon_size = _detalhes.tooltip.icon_size
	local icon_border = _detalhes.tooltip.icon_border_texcoord
	local topSpellHeal = habilidades[1] and habilidades[1][2]

	if (topSpellHeal) then
		for index, tabela in ipairs(habilidades) do
			if (tabela [2] < 1) then
				break
			end

			local spellName, spellIcon = tabela[1], tabela [3]

			if (is_hps) then
				GameCooltip:AddLine(spellName, _detalhes:comma_value (_math_floor(tabela[2]/meu_tempo)).." (".. _cstr ("%.1f", tabela[2]/total*100).."%)")
			else
				GameCooltip:AddLine(spellName, SelectedToKFunction (_, tabela[2]).." (".. _cstr ("%.1f", tabela[2]/total*100).."%)")
			end

			GameCooltip:AddIcon (spellIcon, nil, nil, icon_size.W + 4, icon_size.H + 4, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
			_detalhes:AddTooltipBackgroundStatusbar (false, tabela[2] / topSpellHeal * 100)
		end
	end

	GameCooltip:Show()

	return true

end

function healingClass:MontaDetalhes (spellid, barra)
	--bifurga��es
	if (breakdownWindowFrame.sub_atributo == 1 or breakdownWindowFrame.sub_atributo == 2 or breakdownWindowFrame.sub_atributo == 3) then
		return self:MontaDetalhesHealingDone (spellid, barra)
	elseif (breakdownWindowFrame.sub_atributo == 4) then
		healingClass:MontaDetalhesHealingTaken (spellid, barra)
	end
end

function healingClass:MontaDetalhesHealingTaken (nome, barra)

	local barras = breakdownWindowFrame.barras3
	local instancia = breakdownWindowFrame.instancia

	local tabela_do_combate = breakdownWindowFrame.instancia.showing
	local showing = tabela_do_combate [class_type] --o que esta sendo mostrado -> [1] - dano [2] - cura --pega o container com ._NameIndexTable ._ActorTable

	local este_curandeiro = showing._ActorTable[showing._NameIndexTable[nome]]
	local conteudo = este_curandeiro.spells._ActorTable --pairs[] com os IDs das magias

	local actor = breakdownWindowFrame.jogador.nome

	local total = este_curandeiro.targets [actor]

	local minhas_magias = {}

	for spellid, tabela in pairs(conteudo) do --da foreach em cada spellid do container
		if (tabela.targets [actor]) then
			local spell_nome, _, icone = _GetSpellInfo(spellid)
			tinsert(minhas_magias, {spellid, tabela.targets [actor], tabela.targets [actor] / total*100, spell_nome, icone})
		end
	end

	_table_sort (minhas_magias, _detalhes.Sort2)

	local max_ = minhas_magias[1] and minhas_magias[1][2] or 0 --dano que a primeiro magia vez

	local lastIndex = 1
	local barra
	for index, tabela in ipairs(minhas_magias) do
		lastIndex = index
		barra = barras [index]

		if (not barra) then --se a barra n�o existir, criar ela ent�o
			barra = gump:CriaNovaBarraInfo3 (instancia, index)
			barra.textura:SetStatusBarColor(1, 1, 1, 1) --isso aqui � a parte da sele��o e descele��o
		end

		barra.show = tabela[1]

		if (index == 1) then
			barra.textura:SetValue(100)
		else
			barra.textura:SetValue(tabela[2]/max_*100) --muito mais rapido...
		end

		barra.lineText1:SetText(index..instancia.divisores.colocacao..tabela[4]) --seta o texto da esqueda
		barra.lineText4:SetText(_detalhes:comma_value (tabela[2]) .." ".. instancia.divisores.abre .._cstr("%.1f", tabela[3]) .."%".. instancia.divisores.fecha)

		barra.icone:SetTexture(tabela[5])

		barra:Show() --mostra a barra

		if (index == 15) then
			break
		end
	end

	for i = lastIndex+1, #barras do
		barras[i]:Hide()
	end

end

local absorbed_table = {c = {1, 1, 1, 0.4}, p = 0}
local overhealing_table = {c = {0.5, 0.1, 0.1, 0.4}, p = 0}
local anti_heal_table = {c = {0.5, 0.1, 0.1, 0.4}, p = 0}
local normal_table = {c = {1, 1, 1, 0.4}, p = 0}
local critical_table = {c = {1, 1, 1, 0.4}, p = 0}

local data_table = {}
local t1, t2, t3, t4 = {}, {}, {}, {}

function healingClass:MontaDetalhesHealingDone (spellid, barra) --deprecated with the new breakdown window

	local esta_magia
	if (barra.other_actor) then
		esta_magia = barra.other_actor.spells._ActorTable [spellid]
	else
		esta_magia = self.spells._ActorTable [spellid]
	end

	if (not esta_magia) then
		return
	end

	--icone direito superior
	local spellName, _, icone = _GetSpellInfo(spellid)
	breakdownWindowFrame.spell_icone:SetTexture(icone)

	local total = self.total

	local overheal = esta_magia.overheal
	local meu_total = esta_magia.total + overheal

	local meu_tempo
	if (_detalhes.time_type == 1 or not self.grupo) then
		meu_tempo = self:Tempo()
	elseif (_detalhes.time_type == 2 or _detalhes.time_type == 3) then
		meu_tempo = breakdownWindowFrame.instancia.showing:GetCombatTime()
	end

	local total_hits = esta_magia.counter
	local index = 1
	local data = data_table

	Details:Destroy(t1)
	Details:Destroy(t2)
	Details:Destroy(t3)
	Details:Destroy(t4)
	Details:Destroy(data)

	if (esta_magia.total > 0) then

	--GERAL
		local media = esta_magia.total/total_hits

		local this_hps = nil
		if (esta_magia.counter > esta_magia.c_amt) then
			this_hps = Loc ["STRING_HPS"] .. ": " .. _detalhes:comma_value (esta_magia.total/meu_tempo)
		else
			this_hps = Loc ["STRING_HPS"] .. ": " .. Loc ["STRING_SEE_BELOW"]
		end

		local heal_string
		if (esta_magia.is_shield) then
			heal_string = Loc ["STRING_SHIELD_HEAL"]
		else
			heal_string = Loc ["STRING_HEAL"]
		end

		local hits_string = "" .. total_hits
		local cast_string = Loc ["STRING_CAST"] .. ": "

		local misc_actor = breakdownWindowFrame.instancia.showing (4, self:name())
		if (misc_actor) then
			local buff_uptime = misc_actor.buff_uptime_spells and misc_actor.buff_uptime_spells._ActorTable [spellid] and misc_actor.buff_uptime_spells._ActorTable [spellid].uptime
			if (buff_uptime) then
				hits_string = hits_string .. "  |cFFDDDD44(" .. _math_floor(buff_uptime / breakdownWindowFrame.instancia.showing:GetCombatTime() * 100) .. "% uptime)|r"
			end

			local amountOfCasts = breakdownWindowFrame.instancia.showing:GetSpellCastAmount(self:Name(), spellName)
			if (not amountOfCasts) then
				amountOfCasts = "(|cFFFFFF00?|r)"
			end
			cast_string = cast_string .. amountOfCasts
		end

		gump:SetaDetalheInfoTexto( index, 100,
			--Loc ["STRING_GERAL"],
			cast_string,
			heal_string .. ": " .. _detalhes:ToK (esta_magia.total),
			"", --Loc ["STRING_PERCENTAGE"] .. ": " .. _cstr ("%.1f", esta_magia.total/total*100) .. "%",
			Loc ["STRING_AVERAGE"] .. ": " .. _detalhes:comma_value (media),
			this_hps,
			Loc ["STRING_HITS"] .. ": " .. hits_string)

	--NORMAL
		local normal_hits = esta_magia.n_amt
		if (normal_hits > 0) then
			local normal_curado = esta_magia.n_total
			local media_normal = normal_curado/normal_hits
			media_normal = max(media_normal, 0.000001)

			local T = (meu_tempo*normal_curado)/esta_magia.total
			local P = media/media_normal*100
			T = P*T/100

			data[#data+1] = t1

			if (esta_magia.is_shield) then
				t1[3] = Loc ["STRING_ABSORBED"]
				normal_table.p = esta_magia.total / (esta_magia.total+esta_magia.overheal) * 100
			else
				t1[3] = heal_string
				normal_table.p = normal_hits/total_hits*100
			end

			t1[1] = esta_magia.n_amt
			t1[2] = normal_table

			t1[4] = Loc ["STRING_MINIMUM_SHORT"] .. ": " .. _detalhes:comma_value (esta_magia.n_min)
			t1[5] = Loc ["STRING_MAXIMUM_SHORT"] .. ": " .. _detalhes:comma_value (esta_magia.n_max)
			t1[6] = Loc ["STRING_AVERAGE"] .. ": " .. _detalhes:comma_value (media_normal)
			t1[7] = Loc ["STRING_HPS"] .. ": " .. _detalhes:comma_value (normal_curado / max(T, 0.001))
			t1[8] = normal_hits .. " / ".. _cstr ("%.1f", normal_hits / max(total_hits, 0.001) * 100) .. "%"

		end

	--CRITICO
		if (esta_magia.c_amt > 0) then
			local media_critico = esta_magia.c_total/esta_magia.c_amt
			local T = (meu_tempo*esta_magia.c_total)/esta_magia.total
			local P = media/max(media_critico, 0.0001)*100
			T = P*T/100
			local crit_hps = esta_magia.c_total/T
			if (not crit_hps) then
				crit_hps = 0
			end

			data[#data+1] = t2
			critical_table.p = esta_magia.c_amt/total_hits*100

			t2[1] = esta_magia.c_amt
			t2[2] = critical_table
			t2[3] = Loc ["STRING_HEAL_CRIT"]
			t2[4] = Loc ["STRING_MINIMUM_SHORT"] .. ": " .. _detalhes:comma_value (esta_magia.c_min)
			t2[5] = Loc ["STRING_MAXIMUM_SHORT"] .. ": " .. _detalhes:comma_value (esta_magia.c_max)
			t2[6] = Loc ["STRING_AVERAGE"] .. ": " .. _detalhes:comma_value (media_critico)
			t2[7] = Loc ["STRING_HPS"] .. ": " .. _detalhes:comma_value (crit_hps)
			t2[8] = esta_magia.c_amt .. " [|cFFC0C0C0".. _cstr ("%.1f", esta_magia.c_amt / max(total_hits, 0.001) * 100) .. "%|r]"

		end
	end

	_table_sort (data, _detalhes.Sort1)

--	for i = #data+1, 2 do --para o antiheal aparecer na penultima barra
--		data[i] = nil
--	end

	--anti heal
		if (esta_magia.anti_heal and esta_magia.anti_heal > 0) then
			local porcentagem_anti_heal = esta_magia.anti_heal / meu_total * 100
			data[3] = t3

			anti_heal_table.p = porcentagem_anti_heal

			t3[1] = esta_magia.anti_heal
			t3[2] = anti_heal_table
			t3[3] = "Anti Heal"

			t3[4] = ""
			t3[5] = ""
			t3[6] = ""
			t3[7] = ""
			t3[8] = _detalhes:comma_value (esta_magia.anti_heal) .. " / " .. _cstr ("%.1f", porcentagem_anti_heal) .. "%"

		--empowered
		elseif (esta_magia.e_total and esta_magia.e_heal) then
			local empowerLevelSum = esta_magia.e_total --total sum of empower levels
			local empowerAmount = esta_magia.e_amt --amount of casts with empower
			local empowerAmountPerLevel = esta_magia.e_lvl --{[1] = 4; [2] = 9; [3] = 15}
			local empowerHealPerLevel = esta_magia.e_heal --{[1] = 54548745, [2] = 74548745}

			data[3] = t3

			local level1AverageHeal = "0"
			local level2AverageHeal = "0"
			local level3AverageHeal = "0"
			local level4AverageHeal = "0"
			local level5AverageHeal = "0"

			if (empowerHealPerLevel[1]) then
				level1AverageHeal = Details:ToK(empowerHealPerLevel[1] / empowerAmountPerLevel[1])
			end
			if (empowerHealPerLevel[2]) then
				level2AverageHeal = Details:ToK(empowerHealPerLevel[2] / empowerAmountPerLevel[2])
			end
			if (empowerHealPerLevel[3]) then
				level3AverageHeal = Details:ToK(empowerHealPerLevel[3] / empowerAmountPerLevel[3])
			end
			if (empowerHealPerLevel[4]) then
				level4AverageHeal = Details:ToK(empowerHealPerLevel[4] / empowerAmountPerLevel[4])
			end
			if (empowerHealPerLevel[5]) then
				level5AverageHeal = Details:ToK(empowerHealPerLevel[5] / empowerAmountPerLevel[5])
			end

			t3[1] = 0
			t3[2] = {p = 100, c = {0.282353, 0.239216, 0.545098, 0.6}}
			t3[3] = "Spell Empower Average Level: " .. format("%.2f", empowerLevelSum / empowerAmount)
			t3[4] = ""
			t3[5] = ""
			t3[6] = ""
			t3[10] = ""
			t3[11] = ""

			if (level1AverageHeal ~= "0") then
				t3[4] = "Level 1 Average: " .. level1AverageHeal .. " (" .. (empowerAmountPerLevel[1] or 0) .. ")"
			end

			if (level2AverageHeal ~= "0") then
				t3[6] = "Level 2 Average: " .. level2AverageHeal .. " (" .. (empowerAmountPerLevel[2] or 0) .. ")"
			end

			if (level3AverageHeal ~= "0") then
				t3[11] = "Level 3 Average: " .. level3AverageHeal .. " (" .. (empowerAmountPerLevel[3] or 0) .. ")"
			end

			if (level4AverageHeal ~= "0") then
				t3[10] = "Level 4 Average: " .. level4AverageHeal .. " (" .. (empowerAmountPerLevel[4] or 0) .. ")"
			end

			if (level5AverageHeal ~= "0") then
				t3[5] = "Level 5 Average: " .. level5AverageHeal .. " (" .. (empowerAmountPerLevel[5] or 0) .. ")"
			end
		end

--	for i = #data+1, 3 do --para o overheal aparecer na ultima barra
--		data[i] = nil
--	end

	--overhealing
		if (overheal > 0) then
			local porcentagem_overheal = overheal/meu_total*100
			data[4] = t4

			overhealing_table.p = porcentagem_overheal

			t4[1] = overheal
			t4[2] = overhealing_table

			if (esta_magia.is_shield) then
				t4[3] = Loc ["STRING_SHIELD_OVERHEAL"]
			else
				t4[3] = Loc ["STRING_OVERHEAL"]
			end

			t4[4] = ""
			t4[5] = ""
			t4[6] = ""
			t4[7] = ""
			t4[8] = _detalhes:comma_value (overheal) .. " / " .. _cstr ("%.1f", porcentagem_overheal) .. "%"
		end

	for index = 1, 4 do
		local tabela = data[index]
		if (not tabela) then
			gump:HidaDetalheInfo (index+1)
		else
			gump:SetaDetalheInfoTexto(index+1, tabela[2], tabela[3], tabela[4], tabela[5], tabela[6], tabela[7], tabela[8])
		end
	end

end

--controla se o dps do jogador esta travado ou destravado
function healingClass:GetOrChangeActivityStatus (iniciar)
	if (iniciar == nil) then
		return self.iniciar_hps --retorna se o dps esta aberto ou fechado para este jogador
	elseif (iniciar) then
		self.iniciar_hps = true
		Details222.TimeMachine.AddActor(self)
	else
		self.iniciar_hps = false
		Details222.TimeMachine.RemoveActor(self)
	end
end

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--core functions

	--atualize a funcao de abreviacao
		function healingClass:UpdateSelectedToKFunction()
			SelectedToKFunction = ToKFunctions [_detalhes.ps_abbreviation]
			FormatTooltipNumber = ToKFunctions [_detalhes.tooltip.abbreviation]
			TooltipMaximizedMethod = _detalhes.tooltip.maximize_method
			headerColor = _detalhes.tooltip.header_text_color
		end

	--subtract total from a combat table
		function healingClass:subtract_total (combat_table)
			combat_table.totals [class_type] = combat_table.totals [class_type] - self.total
			if (self.grupo) then
				combat_table.totals_grupo [class_type] = combat_table.totals_grupo [class_type] - self.total
			end
		end
		function healingClass:add_total (combat_table)
			combat_table.totals [class_type] = combat_table.totals [class_type] + self.total
			if (self.grupo) then
				combat_table.totals_grupo [class_type] = combat_table.totals_grupo [class_type] + self.total
			end
		end

	---sum the passed actor into a combat, if the combat isn't passed, it will use the overall combat
	---the function returns the actor that was created of found in the combat passed
	---@param actorObject actor
	---@param bRefreshActor boolean|nil
	---@param combatObject combat|nil
	---@return actor
	function healingClass:AddToCombat(actorObject, bRefreshActor, combatObject)
		--check if there's a custom combat, if not just use the overall container
		combatObject = combatObject or _detalhes.tabela_overall --same as Details:GetCombat(DETAILS_SEGMENTID_OVERALL)

		--check if the combatObject has an actor with the same name, if not, just create one new
		local actorContainer = combatObject[DETAILS_ATTRIBUTE_HEAL] --same as combatObject:GetContainer(DETAILS_ATTRIBUTE_HEAL)
		local overallActor = actorContainer._ActorTable[actorContainer._NameIndexTable[actorObject.nome]] --same as actorContainer:GetActor(actorObject:Name())

		if (not overallActor) then
			overallActor = actorContainer:GetOrCreateActor(actorObject.serial, actorObject.nome, actorObject.flag_original, true)
			overallActor.classe = actorObject.classe
			overallActor:SetSpecId(actorObject.spec)
			overallActor.pvp = actorObject.pvp
			overallActor.isTank = actorObject.isTank
			overallActor.boss = actorObject.boss
			overallActor.start_time = time() - 3
			overallActor.end_time = time()
		end

		overallActor.displayName = actorObject.displayName or actorObject.nome
		overallActor.boss_fight_component = actorObject.boss_fight_component or overallActor.boss_fight_component
		overallActor.fight_component = actorObject.fight_component or overallActor.fight_component
		overallActor.grupo = actorObject.grupo or overallActor.grupo

		--check if need to restore meta tables and indexes for this actor
		if (bRefreshActor) then
			--this call will reenable the metatable, __index and set the metatable on the .spells container
			Details.refresh:r_atributo_heal(actorObject)
		end

		--elapsed time
		local endTime = actorObject.end_time
		if (not actorObject.end_time) then
			endTime = time()
		end

		local tempo = endTime - actorObject.start_time
		overallActor.start_time = overallActor.start_time - tempo

		--pets (add unique pet names)
		for _, petName in ipairs(actorObject.pets) do
			DetailsFramework.table.addunique(overallActor.pets, petName)
		end

		---@cast actorObject actorheal

		--total healing done and total overheal
		overallActor.total = overallActor.total + actorObject.total
		overallActor.totalover = overallActor.totalover + actorObject.totalover

		--healing done by shields
		overallActor.totalabsorb = overallActor.totalabsorb + actorObject.totalabsorb

		--enemy healing done
		overallActor.heal_enemy_amt = overallActor.heal_enemy_amt + actorObject.heal_enemy_amt

		--heal denied
		overallActor.totaldenied = overallActor.totaldenied + actorObject.totaldenied

		--healing done without pets
		overallActor.total_without_pet = overallActor.total_without_pet + actorObject.total_without_pet
		overallActor.totalover_without_pet = overallActor.totalover_without_pet + actorObject.totalover_without_pet

		--healing taken
		overallActor.healing_taken = overallActor.healing_taken + actorObject.healing_taken

		--total no combate overall (captura de dados)
		combatObject.totals[2] = combatObject.totals[2] + actorObject.total
		if (actorObject.grupo) then --same as Details:IsGroupPlayer()
			combatObject.totals_grupo[2] = combatObject.totals_grupo[2] + actorObject.total
		end

		--copy healing taken from
		for healerName, _ in pairs(actorObject.healing_from) do
			overallActor.healing_from[healerName] = true
		end

		--copy enemy healing
		for spellId, amount in pairs(actorObject.heal_enemy) do
			overallActor.heal_enemy[spellId] = (overallActor.heal_enemy[spellId] or 0) + amount
		end

		--copy target tables
		for targetName, amount in pairs(actorObject.targets) do
			overallActor.targets[targetName] = (overallActor.targets[targetName] or 0) + amount
		end

		for targetName, amount in pairs(actorObject.targets_overheal) do
			overallActor.targets_overheal[targetName] = (overallActor.targets_overheal[targetName] or 0) + amount
		end

		for targetName, amount in pairs(actorObject.targets_absorbs) do
			overallActor.targets_absorbs[targetName] = (overallActor.targets_absorbs[targetName] or 0) + amount
		end

		---@type spellcontainer
		local overallSpellsContainer = overallActor.spells --same as overallActor:GetSpellContainer("spell")

		--copy spell table
		for spellId, spellTable in pairs(actorObject.spells._ActorTable) do --same as overallSpellsContainer:GetRawSpellTable()
			--var name has 'overall' but this function accepts any combat table
			local overallSpellTable = overallSpellsContainer:GetOrCreateSpell(spellId, true)

			--sum spell targets
			for targetName, amount in pairs(spellTable.targets) do
				overallSpellTable.targets[targetName] = (overallSpellTable.targets[targetName] or 0) + amount
			end

			for targetName, amount in pairs(spellTable.targets_overheal) do
				overallSpellTable.targets_overheal[targetName] = (overallSpellTable.targets_overheal[targetName] or 0) + amount
			end

			for targetName, amount in pairs(spellTable.targets_absorbs) do
				overallSpellTable.targets_absorbs[targetName] = (overallSpellTable.targets_absorbs[targetName] or 0) + amount
			end

			--copy heal denied if it exists
			if (spellTable.heal_denied) then
				overallSpellTable.heal_denied = overallSpellTable.heal_denied or {}
				overallSpellTable.heal_denied_healers = overallSpellTable.heal_denied_healers or {}
				--copy
				for spellID, amount in pairs(spellTable.heal_denied) do
					overallSpellTable.heal_denied[spellID] = (overallSpellTable.heal_denied[spellID] or 0) + amount
				end
				for healerName, amount in pairs(spellTable.heal_denied_healers) do
					overallSpellTable.heal_denied_healers[healerName] = (overallSpellTable.heal_denied_healers[healerName] or 0) + amount
				end
			end

			overallSpellTable.spellschool = spellTable.spellschool

			--sum all values of the spelltable which can be summed
			for key, value in pairs(spellTable) do
				if (type(value) == "number") then
					if (key ~= "id" and key ~= "spellschool") then
						if (not overallSpellTable[key]) then
							overallSpellTable[key] = 0
						end

						if (key == "n_min" or key == "c_min") then
							if (overallSpellTable[key] > value) then
								overallSpellTable[key] = value
							end
						elseif (key == "n_max" or key == "c_max") then
							if (overallSpellTable[key] < value) then
								overallSpellTable[key] = value
							end
						else
							overallSpellTable[key] = overallSpellTable[key] + value
						end
					end

				--empowered spells
				elseif(key == "e_heal" or key == "e_lvl") then
					if (not overallSpellTable[key]) then
						overallSpellTable[key] = {}
					end
					for empowermentLevel, empowermentValue in pairs(spellTable[key]) do
						overallSpellTable[key][empowermentLevel] = empowermentValue
					end
				end
			end
		end

		return overallActor
	end

healingClass.__add = function(tabela1, tabela2)
	--tempo decorrido
		local tempo = (tabela2.end_time or time()) - tabela2.start_time
		tabela1.start_time = tabela1.start_time - tempo

	--total de cura
		tabela1.total = tabela1.total + tabela2.total
	--total de overheal
		tabela1.totalover = tabela1.totalover + tabela2.totalover
	--total de absorbs
		tabela1.totalabsorb = tabela1.totalabsorb + tabela2.totalabsorb
	--total de cura feita em inimigos
		tabela1.heal_enemy_amt = tabela1.heal_enemy_amt + tabela2.heal_enemy_amt
	--total de cura negada
		tabela1.totaldenied = tabela1.totaldenied + tabela2.totaldenied

	--total sem pets
		tabela1.total_without_pet = tabela1.total_without_pet + tabela2.total_without_pet
		tabela1.totalover_without_pet = tabela1.totalover_without_pet + tabela2.totalover_without_pet
	--total de cura recebida
		tabela1.healing_taken = tabela1.healing_taken + tabela2.healing_taken

	--soma o healing_from
		for nome, _ in pairs(tabela2.healing_from) do
			tabela1.healing_from [nome] = true
		end

	--somar o heal_enemy
		for spellid, amount in pairs(tabela2.heal_enemy) do
			if (tabela1.heal_enemy [spellid]) then
				tabela1.heal_enemy [spellid] = tabela1.heal_enemy [spellid] + amount
			else
				tabela1.heal_enemy [spellid] = amount
			end
		end

	--somar o container de alvos
		for target_name, amount in pairs(tabela2.targets) do
			tabela1.targets[target_name] = (tabela1.targets[target_name] or 0) + amount
		end
		for target_name, amount in pairs(tabela2.targets_overheal) do
			tabela1.targets_overheal[target_name] = (tabela1.targets_overheal[target_name] or 0) + amount
		end
		for target_name, amount in pairs(tabela2.targets_absorbs) do
			tabela1.targets_absorbs[target_name] = (tabela1.targets_absorbs[target_name] or 0) + amount
		end

	--soma o container de habilidades
		for spellid, habilidade in pairs(tabela2.spells._ActorTable) do
			--pega a habilidade no primeiro ator
			local habilidade_tabela1 = tabela1.spells:PegaHabilidade (spellid, true, "SPELL_HEAL", false)
			--soma os alvos
			for target_name, amount in pairs(habilidade.targets) do
				habilidade_tabela1.targets = (habilidade_tabela1.targets[target_name] or 0) + amount
			end
			for target_name, amount in pairs(habilidade.targets_overheal) do
				habilidade_tabela1.targets_overheal = (habilidade_tabela1.targets_overheal[target_name] or 0) + amount
			end
			for target_name, amount in pairs(habilidade.targets_absorbs) do
				habilidade_tabela1.targets_absorbs = (habilidade_tabela1.targets_absorbs[target_name] or 0) + amount
			end

			--copia o container de heal negado se ele existir
			if (habilidade.heal_denied) then
				habilidade_tabela1.heal_denied = habilidade_tabela1.heal_denied or {}
				habilidade_tabela1.heal_denied_healers = habilidade_tabela1.heal_denied_healers or {}
				--copia
				for spellID, amount in pairs(habilidade.heal_denied) do
					habilidade_tabela1.heal_denied[spellID] = (habilidade_tabela1.heal_denied[spellID] or 0) + amount
				end
				for healerName, amount in pairs(habilidade.heal_denied_healers) do
					habilidade_tabela1.heal_denied_healers[healerName] = (habilidade_tabela1.heal_denied_healers[healerName] or 0) + amount
				end
			end

			--soma os valores da habilidade
			for key, value in pairs(habilidade) do
				if (type(value) == "number") then
					if (key ~= "id") then
						if (not habilidade_tabela1 [key]) then
							habilidade_tabela1 [key] = 0
						end
						if (key == "n_min" or key == "c_min") then
							if (habilidade_tabela1 [key] > value) then
								habilidade_tabela1 [key] = value
							end
						elseif (key == "n_max" or key == "c_max") then
							if (habilidade_tabela1 [key] < value) then
								habilidade_tabela1 [key] = value
							end
						else
							habilidade_tabela1 [key] = habilidade_tabela1 [key] + value
						end
					end
				elseif(key == "e_heal" or key == "e_lvl") then
					if (not habilidade_tabela1[key]) then
						habilidade_tabela1[key] = {}
					end
					for empowermentLevel, empowermentValue in pairs(habilidade[key]) do 
						habilidade_tabela1[key][empowermentLevel] = habilidade_tabela1[key][empowermentValue] or 0 + empowermentValue
					end
				end
			end
		end

	return tabela1
end

healingClass.__sub = function(tabela1, tabela2)

	--tempo decorrido
		local tempo = (tabela2.end_time or time()) - tabela2.start_time
		tabela1.start_time = tabela1.start_time + tempo

	--total de cura
		tabela1.total = tabela1.total - tabela2.total
	--total de overheal
		tabela1.totalover = tabela1.totalover - tabela2.totalover
	--total de absorbs
		tabela1.totalabsorb = tabela1.totalabsorb - tabela2.totalabsorb
	--total de cura feita em inimigos
		tabela1.heal_enemy_amt = tabela1.heal_enemy_amt - tabela2.heal_enemy_amt
	--total de cura negada
		tabela1.totaldenied = tabela1.totaldenied - tabela2.totaldenied

	--total sem pets
		tabela1.total_without_pet = tabela1.total_without_pet - tabela2.total_without_pet
		tabela1.totalover_without_pet = tabela1.totalover_without_pet - tabela2.totalover_without_pet
	--total de cura recebida
		tabela1.healing_taken = tabela1.healing_taken - tabela2.healing_taken

	--reduz o heal_enemy
		for spellid, amount in pairs(tabela2.heal_enemy) do
			if (tabela1.heal_enemy [spellid]) then
				tabela1.heal_enemy [spellid] = tabela1.heal_enemy [spellid] - amount
			else
				tabela1.heal_enemy [spellid] = amount
			end
		end

	--reduz o container de alvos
		for target_name, amount in pairs(tabela2.targets) do
			if (tabela1.targets [target_name]) then
				tabela1.targets [target_name] = tabela1.targets [target_name] - amount
			end
		end
		for target_name, amount in pairs(tabela2.targets_overheal) do
			if (tabela1.targets_overheal [target_name]) then
				tabela1.targets_overheal [target_name] = tabela1.targets_overheal [target_name] - amount
			end
		end
		for target_name, amount in pairs(tabela2.targets_absorbs) do
			if (tabela1.targets_absorbs [target_name]) then
				tabela1.targets_absorbs [target_name] = tabela1.targets_absorbs [target_name] - amount
			end
		end

	--reduz o container de habilidades
		for spellid, habilidade in pairs(tabela2.spells._ActorTable) do
			--pega a habilidade no primeiro ator
			local habilidade_tabela1 = tabela1.spells:PegaHabilidade (spellid, true, "SPELL_HEAL", false)
			--alvos
			for target_name, amount in pairs(habilidade.targets) do
				if (habilidade_tabela1.targets [target_name]) then
					habilidade_tabela1.targets [target_name] = habilidade_tabela1.targets [target_name] - amount
				end
			end
			for target_name, amount in pairs(habilidade.targets_overheal) do
				if (habilidade_tabela1.targets_overheal [target_name]) then
					habilidade_tabela1.targets_overheal [target_name] = habilidade_tabela1.targets_overheal [target_name] - amount
				end
			end
			for target_name, amount in pairs(habilidade.targets_absorbs) do
				if (habilidade_tabela1.targets_absorbs [target_name]) then
					habilidade_tabela1.targets_absorbs [target_name] = habilidade_tabela1.targets_absorbs [target_name] - amount
				end
			end

			--copia o container de heal negado se ele existir
			if (habilidade.heal_denied) then
				habilidade_tabela1.heal_denied = habilidade_tabela1.heal_denied or {}
				habilidade_tabela1.heal_denied_healers = habilidade_tabela1.heal_denied_healers or {}
				--copia
				for spellID, amount in pairs(habilidade.heal_denied) do
					habilidade_tabela1.heal_denied [spellID] = (habilidade_tabela1.heal_denied [spellID] or 0) - amount
				end
				for healerName, amount in pairs(habilidade.heal_denied_healers) do
					habilidade_tabela1.heal_denied_healers [healerName] = (habilidade_tabela1.heal_denied_healers [healerName] or 0) - amount
				end
			end

			--soma os valores da habilidade
			for key, value in pairs(habilidade) do
				if (type(value) == "number") then
					if (key ~= "id") then
						if (not habilidade_tabela1 [key]) then
							habilidade_tabela1 [key] = 0
						end
						if (key == "n_min" or key == "c_min") then
							if (habilidade_tabela1 [key] > value) then
								habilidade_tabela1 [key] = value
							end
						elseif (key == "n_max" or key == "c_max") then
							if (habilidade_tabela1 [key] < value) then
								habilidade_tabela1 [key] = value
							end
						else
							habilidade_tabela1 [key] = habilidade_tabela1 [key] - value
						end
					end
				end
			end
		end

	return tabela1
end

function Details.refresh:r_atributo_heal(thisActor)
	detailsFramework:Mixin(thisActor, Details222.Mixins.ActorMixin)

	setmetatable(thisActor, healingClass)
	thisActor.__index = healingClass

	Details.refresh:r_container_habilidades(thisActor.spells)
end

function Details.clear:c_atributo_heal (este_jogador)
	este_jogador.__index = nil
	este_jogador.links = nil
	este_jogador.minha_barra = nil

	Details.clear:c_container_habilidades (este_jogador.spells)
end
