--lua locals
local _cstr = string.format
local _math_floor = math.floor
local _table_sort = table.sort
local _table_insert = table.insert
local _table_size = table.getn
local _setmetatable = setmetatable
local _getmetatable = getmetatable
local _ipairs = ipairs
local _pairs = pairs
local _rawget= rawget
local _math_min = math.min
local _math_max = math.max
local _math_abs = math.abs
local _bit_band = bit.band
local _unpack = unpack
local _type = type
--api locals
local _GetSpellInfo = _detalhes.getspellinfo
local GameTooltip = GameTooltip
local _IsInRaid = IsInRaid
local _IsInGroup = IsInGroup
local _GetNumGroupMembers = GetNumGroupMembers
local _GetNumSubgroupMembers = GetNumSubgroupMembers
local _UnitAura = UnitAura
local _UnitGUID = UnitGUID
local _UnitName = UnitName
local format = _G.format

local UnitIsUnit = UnitIsUnit

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

local _detalhes = 		_G._detalhes
local Details = 		_detalhes
local AceLocale = LibStub ("AceLocale-3.0")
local Loc = AceLocale:GetLocale ( "Details" )

local gump = 			_detalhes.gump
local _
local alvo_da_habilidade = 	_detalhes.alvo_da_habilidade
local container_habilidades = 	_detalhes.container_habilidades
local container_combatentes = _detalhes.container_combatentes
local container_pets =		_detalhes.container_pets
local atributo_misc =		_detalhes.atributo_misc
local habilidade_misc = 	_detalhes.habilidade_misc

local container_damage_target = _detalhes.container_type.CONTAINER_DAMAGETARGET_CLASS
local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC
local container_misc = _detalhes.container_type.CONTAINER_MISC_CLASS
local container_misc_target = _detalhes.container_type.CONTAINER_ENERGYTARGET_CLASS
--local container_friendlyfire = _detalhes.container_type.CONTAINER_FRIENDLYFIRE

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

local class_type = _detalhes.atributos.misc

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 UsingCustomLeftText = false
local UsingCustomRightText = false

local FormatTooltipNumber = ToKFunctions [8]
local TooltipMaximizedMethod = 1

local info = _detalhes.playerDetailWindow
local keyName

local headerColor = "yellow"

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

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

function _detalhes.SortGroupMisc (container, keyName2)
	keyName = keyName2
	return _table_sort (container, _detalhes.SortKeyGroupMisc)
end

function _detalhes.SortKeyGroupMisc (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.SortKeySimpleMisc (table1, table2)
	return table1 [keyName] > table2 [keyName]
end

function _detalhes:ContainerSortMisc (container, amount, keyName2)
	keyName = keyName2
	_table_sort (container,  _detalhes.SortKeySimpleMisc)
	
	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

--[[exported]] function _detalhes:GetSpellCastAmount (combat, actorName, spellId)
	local misc_actor = combat:GetActor (4, actorName)
	if (misc_actor) then
		local spell_cast = misc_actor.spell_cast and misc_actor.spell_cast [spellId]
		
		--try to find a spell with the same name and get the amount of casts of that spell object
		if (not spell_cast and misc_actor.spell_cast) then
			local spellname = GetSpellInfo (spellId)
			for casted_spellid, amount in _pairs (misc_actor.spell_cast) do
				local casted_spellname = GetSpellInfo (casted_spellid)
				if (casted_spellname == spellname) then
					return amount, true
				end
			end
		end
		
		if (not spell_cast) then
			return false
		end
		
		return spell_cast
	end
end

function atributo_misc:NovaTabela (serial, nome, link)

	local _new_miscActor = {
		last_event = 0,
		tipo = class_type, --> atributo 4 = misc
		pets = {} --> pets? okey pets
	}
	_setmetatable (_new_miscActor, atributo_misc)
	
	return _new_miscActor
end

function atributo_misc:CreateBuffTargetObject()
	return {
		uptime = 0,
		actived = false,
		activedamt = 0,
		refreshamt = 0,
		appliedamt = 0,
	}
end

local backgroundColor = {0, 0, 0, 1}
local backgroud_bar_damage = {value = 100, texture = [[Interface\AddOns\Details\images\bar_serenity]], color = {1, 0, 0, 0.1}}

function Details:ShowDeathTooltip(combatObject, deathTable)
	local events = deathTable[1]
	local timeOfDeath = deathTable[2]
	local maxHP = deathTable[5]
	local battleress = false
	local lastcooldown = false
	local GameCooltip = GameCooltip

	GameCooltip:Reset()
	GameCooltip:SetType ("tooltipbar")
	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:AddStatusBar (0, 1, 1, 1, 1, 1, false, {value = 100, color = {.3, .3, .3, 1}, specialSpark = false, texture = [[Interface\AddOns\Details\images\bar_serenity]]})

	local barTypeColors = Details.death_log_colors

	--death parser
	for i, event in _ipairs (events) do

		local currentHP = event[5]
		local hp = floor(currentHP / maxHP * 100)
		if (hp > 100) then
			hp = 100
		end

		local evtype = event[1]
		local spellName, _, spellIcon = _GetSpellInfo(event[2])
		local amount = event[3]
		local time = event[4]
		local source = event[6]

		if (time + 12 > timeOfDeath) then
			if (type (evtype) == "boolean") then
				--is damage or heal?
				if (evtype) then --bool true
					--damage
					local overkill = event[10] or 0
					local critical = event[11] and (" " .. TEXT_MODE_A_STRING_RESULT_CRITICAL) or "" -- (Critical)
					local crushing = event[12] and (" " .. TEXT_MODE_A_STRING_RESULT_CRUSHING) or "" -- (Crushing)
					local critOrCrush = critical .. crushing

					if (overkill > 0) then
						--> deprecated as the parser now removes the overkill damage from total damage
						--> this should now sum the overkill from [10] with the damage from [3]
							--check the type of overkill that should be shown
							--if show_totalhitdamage_on_overkill is true it'll show the total damage of the hit
							--if false it shows the total damage of the hit minus the overkill
							--if (not _detalhes.show_totalhitdamage_on_overkill) then
							--	amount = amount - overkill
							--end

						overkill = " (" .. _detalhes:ToK(overkill) .. " |cFFFF8800overkill|r)"
						GameCooltip:AddLine("" .. format("%.1f", time - timeOfDeath) .. "s |cFFFFFF00" .. spellName .. "|r (|cFFC6B0D9" .. source .. "|r)", "-" .. _detalhes:ToK(amount) .. critOrCrush .. overkill .. " (" .. hp .. "%)", 1, "white", "white")
					else
						overkill = ""
						GameCooltip:AddLine("" .. format("%.1f", time - timeOfDeath) .. "s " .. spellName .. " (|cFFC6B0D9" .. source .. "|r)", "-" .. _detalhes:ToK(amount) .. critOrCrush .. overkill .. " (" .. hp .. "%)", 1, "white", "white")
					end

					--iconTexture, frame, side, iconWidth, iconHeight, L, R, T, B

					GameCooltip:AddIcon(spellIcon, nil, nil, nil, nil, .1, .9, .1, .9)

					if (event[9]) then
						--friendly fire
						GameCooltip:AddStatusBar(hp, 1, barTypeColors.friendlyfire, true, backgroud_bar_damage)
					else
						--from a enemy
						GameCooltip:AddStatusBar(hp, 1, barTypeColors.damage, true, backgroud_bar_damage)
					end
				else
					--heal
					if (amount > _detalhes.deathlog_healingdone_min) then
						if (combatObject.is_arena) then
							if (amount > _detalhes.deathlog_healingdone_min_arena) then
								GameCooltip:AddLine("" .. format("%.1f", time - timeOfDeath) .. "s " .. spellName .. " (|cFFC6B0D9" .. source .. "|r)", "+" .. _detalhes:ToK(amount) .. " (" .. hp .. "%)", 1, "white", "white")
								GameCooltip:AddIcon(spellIcon, nil, nil, nil, nil, .1, .9, .1, .9)
								GameCooltip:AddStatusBar(hp, 1, barTypeColors.heal, true)
							end
						else
							GameCooltip:AddLine("" .. format("%.1f", time - timeOfDeath) .. "s " .. spellName .. " (|cFFC6B0D9" .. source .. "|r)", "+" .. _detalhes:ToK(amount) .. " (" .. hp .. "%)", 1, "white", "white")
							GameCooltip:AddIcon(spellIcon, nil, nil, nil, nil, .1, .9, .1, .9)
							GameCooltip:AddStatusBar(hp, 1, barTypeColors.heal, true)
						end
					end
				end

			elseif (type (evtype) == "number") then
				if (evtype == 1) then
					--cooldown
					GameCooltip:AddLine("" .. format("%.1f", time - timeOfDeath) .. "s " .. spellName .. " (" .. source .. ")", "cooldown (" .. hp .. "%)", 1, "white", "white")
					GameCooltip:AddIcon(spellIcon, nil, nil, nil, nil, .1, .9, .1, .9)
					GameCooltip:AddStatusBar(100, 1, barTypeColors.cooldown, true)

				elseif (evtype == 2 and not battleress) then
					--battle ress
					battleress = event

				elseif (evtype == 3) then
					--last cooldown used
					lastcooldown = event

				elseif (evtype == 4) then
					--debuff
					GameCooltip:AddLine("" .. format("%.1f", time - timeOfDeath) .. "s [x" .. amount .. "] " .. spellName .. " (" .. source .. ")", "debuff (" .. hp .. "%)", 1, "white", "white")
					GameCooltip:AddIcon(spellIcon)
					GameCooltip:AddStatusBar(100, 1, barTypeColors.debuff, true)

				end
			end
		end
	end

	GameCooltip:AddLine(deathTable[6] .. " " .. Loc["STRING_TIME_OF_DEATH"] , "-- -- -- ", 1, "white")
	GameCooltip:AddIcon("Interface\\AddOns\\Details\\images\\small_icons", 1, 1, nil, nil, .75, 1, 0, 1)
	GameCooltip:AddStatusBar(0, 1, .5, .5, .5, .5, false, {value = 100, color = {.5, .5, .5, 1}, specialSpark = false, texture = [[Interface\AddOns\Details\images\bar4_vidro]]})

	if (battleress) then
		local spellName, _, spellIcon = _GetSpellInfo (battleress[2])
		GameCooltip:AddLine("+" .. format("%.1f", battleress[4] - timeOfDeath) .. "s " .. spellName .. " (" .. battleress[6] .. ")", "", 1, "white")
		GameCooltip:AddIcon("Interface\\Glues\\CharacterSelect\\Glues-AddOn-Icons", 1, 1, nil, nil, .75, 1, 0, 1)
		GameCooltip:AddStatusBar(0, 1, .5, .5, .5, .5, false, {value = 100, color = {.5, .5, .5, 1}, specialSpark = false, texture = [[Interface\AddOns\Details\images\bar4_vidro]]})
	end

	if (lastcooldown) then
		if (lastcooldown[3] == 1) then
			local spellName, _, spellIcon = _GetSpellInfo (lastcooldown[2])
			GameCooltip:AddLine(format("%.1f", lastcooldown[4] - timeOfDeath) .. "s " .. spellName .. " (" .. Loc ["STRING_LAST_COOLDOWN"] .. ")")
			GameCooltip:AddIcon(spellIcon)
		else
			GameCooltip:AddLine(Loc ["STRING_NOLAST_COOLDOWN"])
			GameCooltip:AddIcon([[Interface\CHARACTERFRAME\UI-Player-PlayTimeUnhealthy]], 1, 1, 18, 18)
		end

		GameCooltip:AddStatusBar(0, 1, 1, 1, 1, 1, false, {value = 100, color = {.3, .3, .3, 1}, specialSpark = false, texture = [[Interface\AddOns\Details\images\bar_serenity]]})
	end

	GameCooltip:SetOption("StatusBarHeightMod", -6)
	GameCooltip:SetOption("FixedWidth", (type(_detalhes.death_tooltip_width) == "number" and _detalhes.death_tooltip_width) or 300)

	GameCooltip:SetOption("TextSize", _detalhes.tooltip.fontsize)
	GameCooltip:SetOption("TextFont",  _detalhes.tooltip.fontface)

	GameCooltip:SetOption("LeftBorderSize", -4)
	GameCooltip:SetOption("RightBorderSize", 5)
	GameCooltip:SetOption("StatusBarTexture", [[Interface\AddOns\Details\images\bar4_reverse]])
	GameCooltip:SetOption("StatusBarTexture", [[Interface\AddOns\Details\images\BantoBar]])
	GameCooltip:SetWallpaper(1, [[Interface\SPELLBOOK\Spellbook-Page-1]], {.6, 0.1, 0.64453125, 0}, {.8, .8, .8, 0.2}, true)

	GameCooltip:SetBackdrop(1, _detalhes.tooltip_backdrop, backgroundColor, _detalhes.tooltip_border_color)
end

function _detalhes:ToolTipDead (instancia, morte, esta_barra)
	local GameCooltip = GameCooltip

	Details:ShowDeathTooltip(instancia:GetShowingCombat(), morte)

	local myPoint = _detalhes.tooltip.anchor_point
	local anchorPoint = _detalhes.tooltip.anchor_relative
	local x_Offset = _detalhes.tooltip.anchor_offset[1]
	local y_Offset = _detalhes.tooltip.anchor_offset[2]

	if (_detalhes.tooltip.anchored_to == 1) then
		GameCooltip:SetHost (esta_barra, myPoint, anchorPoint, x_Offset, y_Offset)
	else
		GameCooltip:SetHost (DetailsTooltipAnchor, myPoint, anchorPoint, x_Offset, y_Offset)
	end

	GameCooltip:ShowCooltip()
end

local function RefreshBarraMorte (morte, barra, instancia)
	atributo_misc:DeadAtualizarBarra (morte, morte.minha_barra, barra.colocacao, instancia)
end

--objeto death:
--[1] tabela [2] time [3] nome [4] classe [5] maxhealth [6] time of death
--[1] true damage/ false heal [2] spellid [3] amount [4] time [5] current health [6] source

local report_table = {}
local ReportSingleDeathFunc = function (IsCurrent, IsReverse, AmtLines)

	AmtLines = AmtLines + 1

	local t = {}
	for i = 1, _math_min (#report_table, AmtLines) do
		local table = report_table [i]
		t [#t+1] = table [1] .. table [4] .. table [2] .. table [3]
	end
	
	local title = tremove (t, 1)
	t = _detalhes.table.reverse (t)
	tinsert (t, 1, title)
	
	_detalhes:SendReportLines (t)
	
end

function atributo_misc:ReportSingleDeadLine (morte, instancia)

	local barra = instancia.barras [morte.minha_barra]
	
	local max_health = morte [5]
	local time_of_death = morte [2]
	
	do
		if (not _detalhes.fontstring_len) then
			_detalhes.fontstring_len = _detalhes.listener:CreateFontString (nil, "background", "GameFontNormal")
		end
		local _, fontSize = FCF_GetChatWindowInfo (1)
		if (fontSize < 1) then
			fontSize = 10
		end
		local fonte, _, flags = _detalhes.fontstring_len:GetFont()
		_detalhes.fontstring_len:SetFont (fonte, fontSize, flags)
		_detalhes.fontstring_len:SetText ("thisisspacement")
	end
	local default_len = _detalhes.fontstring_len:GetStringWidth()
	
	wipe (report_table)
	local report_array = report_table
	report_array[1] = {"Details! " .. Loc ["STRING_REPORT_SINGLE_DEATH"] .. " " .. morte [3] .. " " .. Loc ["STRING_ACTORFRAME_REPORTAT"] .. " " .. morte [6], "", "", ""}
	
	for index, evento in _ipairs (_detalhes.table.reverse (morte [1])) do
		if (evento [1] and type (evento [1]) == "boolean") then --> damage
			if (evento [3]) then
				local elapsed = _cstr ("%.1f", evento [4] - time_of_death) .."s"
				local spellname, _, spellicon = _GetSpellInfo (evento [2])
				local spelllink
				
				if (evento [2] == 1) then
					spelllink = GetSpellLink (6603)
				elseif (evento [2] > 10) then
					spelllink = GetSpellLink (evento [2])
				else
					spelllink = spellname
				end
				
				local source = _detalhes:GetOnlyName (evento [6])
				local amount = evento [3]
				local hp = _math_floor (evento [5] / max_health * 100)
				if (hp > 100) then 
					hp = 100
				end
				
				tinsert (report_array, {elapsed .. " ", spelllink, " (" .. source .. ")", "-" .. _detalhes:ToK (amount) .. " (" .. hp .. "%) "})
			end
			
		elseif (not evento [1] and type (evento [1]) == "boolean") then --> heal
		
			local amount = evento [3]
			
			if (amount > _detalhes.deathlog_healingdone_min) then
				local elapsed = _cstr ("%.1f", evento [4] - time_of_death) .."s"
				local spelllink = GetSpellLink (evento [2])
				local source = _detalhes:GetOnlyName (evento [6])
				local spellname, _, spellicon = _GetSpellInfo (evento [2])
				
				local hp = _math_floor (evento [5] / max_health * 100)
				if (hp > 100) then 
					hp = 100
				end

				if (_detalhes.report_heal_links) then
					tinsert (report_array, {elapsed .. " ", spelllink, " (" .. source .. ")", "+" .. _detalhes:ToK (amount) .. " (" .. hp .. "%) "})
				else
					tinsert (report_array, {elapsed .. " ", spellname, " (" .. source .. ")", "+" .. _detalhes:ToK (amount) .. " (" .. hp .. "%) "})
				end
			end
			
		elseif (type (evento [1]) == "number" and evento [1] == 4) then --> debuff
			
			local elapsed = _cstr ("%.1f", evento [4] - time_of_death) .."s"
			local spelllink = GetSpellLink (evento [2])
			local source = _detalhes:GetOnlyName (evento [6])
			local spellname, _, spellicon = _GetSpellInfo (evento [2])
			local stacks = evento [3]
			local hp = _math_floor (evento [5] / max_health * 100)
			if (hp > 100) then 
				hp = 100
			end

			tinsert (report_array, {elapsed .. " ", "x" .. stacks .. "" .. spelllink, " (" .. source .. ")", "(" .. hp .. "%) "})
		end
	end
	
	_detalhes:SendReportWindow (ReportSingleDeathFunc, nil, nil, true)
end

function atributo_misc:ReportSingleCooldownLine (misc_actor, instancia)

	local reportar

	if (instancia.segmento == -1) then --overall
		reportar = {"Details!: " .. misc_actor.nome .. " - " .. Loc ["STRING_OVERALL"] .. " " .. Loc ["STRING_ATTRIBUTE_MISC_DEFENSIVE_COOLDOWNS"]}
	else
		reportar = {"Details!: " .. misc_actor.nome .. " - " .. Loc ["STRING_ATTRIBUTE_MISC_DEFENSIVE_COOLDOWNS"]}
	end
	
	local meu_total = _math_floor (misc_actor.cooldowns_defensive)
	local cooldowns = misc_actor.cooldowns_defensive_spells._ActorTable
	local cooldowns_used = {}
	
	for spellid, spell in _pairs (cooldowns) do
		cooldowns_used [#cooldowns_used+1] = {spellid, spell.counter, spell}
	end
	_table_sort (cooldowns_used, _detalhes.Sort2)

	for i, spell in _ipairs (cooldowns_used) do
		
		local spelllink = GetSpellLink (spell [1])
		reportar [#reportar+1] = spelllink .. ": " .. spell [2]
		
		for target_name, amount in _pairs (spell[3].targets) do
			if (target_name ~= misc_actor.nome and target_name ~= Loc ["STRING_RAID_WIDE"] and amount > 0) then
				reportar [#reportar+1] = "  -" .. target_name .. ": " .. amount
			end
		end
		
	end

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

local buff_format_name = function (spellid)
	if (_type (spellid) == "string") then
		return spellid
	end
	return _detalhes:GetSpellLink (spellid)
end
local buff_format_amount = function (t)
	local total, percent = unpack (t)
	local m, s = _math_floor (total / 60), _math_floor (total % 60)
	return _cstr ("%.1f", percent) .. "% (" .. m .. "m " .. s .. "s)"
end
local sort_buff_report = function (t1, t2)
	return t1[2][1] > t2[2][1]
end

function atributo_misc:ReportSingleBuffUptimeLine (misc_actor, instance)
	local report_table = {"Details!: " .. misc_actor.nome .. " - " .. Loc ["STRING_ATTRIBUTE_MISC_BUFF_UPTIME"]}
	
	local buffs = {}
	local combat_time = instance.showing:GetCombatTime()
	
	for spellid, spell in _pairs (misc_actor.buff_uptime_spells._ActorTable) do
		local percent = spell.uptime / combat_time * 100
		if (percent < 99.5) then
			buffs [#buffs+1] = {spellid, {spell.uptime, percent}}
		end
	end

	_table_sort (buffs, sort_buff_report)
	_detalhes:FormatReportLines (report_table, buffs, buff_format_name, buff_format_amount)
	return _detalhes:Reportar (report_table, {_no_current = true, _no_inverse = true, _custom = true})
end

function atributo_misc:ReportSingleDebuffUptimeLine (misc_actor, instance)
	local report_table = {"Details!: " .. misc_actor.nome .. " - " .. Loc ["STRING_ATTRIBUTE_MISC_DEBUFF_UPTIME"]}

	local debuffs = {}
	local combat_time = instance.showing:GetCombatTime()
	
	for spellid, spell in _pairs (misc_actor.debuff_uptime_spells._ActorTable) do
		local percent = spell.uptime / combat_time * 100
		debuffs [#debuffs+1] = {spellid, {spell.uptime, percent}}
	end

	_table_sort (debuffs, sort_buff_report)
	_detalhes:FormatReportLines (report_table, debuffs, buff_format_name, buff_format_amount)

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

function atributo_misc:DeadAtualizarBarra (morte, whichRowLine, colocacao, instancia)
	
	morte ["dead"] = true --> marca que esta tabela � uma tabela de mortes, usado no controla na hora de montar o tooltip
	local esta_barra = instancia.barras[whichRowLine] --> pega a refer�ncia da barra na janela
	
	if (not esta_barra) then
		print ("DEBUG: problema com <instancia.esta_barra> "..whichRowLine.." "..lugar)
		return
	end
	
	local tabela_anterior = esta_barra.minha_tabela
	
	esta_barra.minha_tabela = morte
	
	morte.nome = morte [3] --> evita dar erro ao redimencionar a janela
	morte.minha_barra = whichRowLine
	esta_barra.colocacao = colocacao
	
	if (not _getmetatable (morte)) then 
		_setmetatable (morte, {__call = RefreshBarraMorte}) 
		morte._custom = true
	end
	
	esta_barra.lineText1:SetText (colocacao .. ". " .. morte [3]:gsub (("%-.*"), ""))
	esta_barra.lineText2:SetText("")
	esta_barra.lineText3:SetText("")
	esta_barra.lineText4:SetText (morte [6])
	
	esta_barra:SetValue (100)
	if (esta_barra.hidden or esta_barra.fading_in or esta_barra.faded) then
		Details.FadeHandler.Fader (esta_barra, "out")
	end
	
	--> seta a cor da barra e a cor do texto caso eles esteja mostrando com a cor da classe
	local r, g, b, a = _unpack (_detalhes.class_colors [morte[4]])
	_detalhes:SetBarColors (esta_barra, instancia, r, g, b, a)
	
	if (instancia.row_info.use_spec_icons) then
		local nome = morte[3]
		local spec = instancia.showing (1, nome) and instancia.showing (1, nome).spec or (instancia.showing (2, nome) and instancia.showing (2, nome).spec)
		if (spec and spec ~= 0) then
			esta_barra.icone_classe:SetTexture (instancia.row_info.spec_file)
			esta_barra.icone_classe:SetTexCoord (_unpack (_detalhes.class_specs_coords[spec]))
		else
			if (CLASS_ICON_TCOORDS [morte[4]]) then
				esta_barra.icone_classe:SetTexture (instancia.row_info.icon_file)
				esta_barra.icone_classe:SetTexCoord (_unpack (CLASS_ICON_TCOORDS [morte[4]]))
			else
				local texture, l, r, t, b = Details:GetUnknownClassIcon()
				esta_barra.icone_classe:SetTexture(texture)
				esta_barra.icone_classe:SetTexCoord(l, r, t, b)
			end
		end
	else
		if (CLASS_ICON_TCOORDS [morte[4]]) then
			esta_barra.icone_classe:SetTexture (instancia.row_info.icon_file)
			esta_barra.icone_classe:SetTexCoord (_unpack (CLASS_ICON_TCOORDS [morte[4]]))
		else
			local texture, l, r, t, b = Details:GetUnknownClassIcon()
			esta_barra.icone_classe:SetTexture(texture)
			esta_barra.icone_classe:SetTexCoord(l, r, t, b)
		end
	end
	
	esta_barra.icone_classe:SetVertexColor (1, 1, 1)
	
	if (esta_barra.mouse_over and not instancia.baseframe.isMoving) then --> precisa atualizar o tooltip
		gump:UpdateTooltip (whichRowLine, esta_barra, instancia)
	end
	
	esta_barra.lineText1:SetSize (esta_barra:GetWidth() - esta_barra.lineText4:GetStringWidth() - 20, 15)

end

function atributo_misc:RefreshWindow (instancia, tabela_do_combate, forcar, exportar, refresh_needed)
	
	local showing = tabela_do_combate [class_type] --> o que esta sendo mostrado -> [1] - dano [2] - cura --> pega o container com ._NameIndexTable ._ActorTable
	
	if (#showing._ActorTable < 1) then --> n�o h� barras para mostrar
		return _detalhes:EsconderBarrasNaoUsadas (instancia, showing), "", 0, 0
	end
	
	local total = 0	
	instancia.top = 0
	
	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 (exportar) then
		if (_type (exportar) == "boolean") then 		
			if (sub_atributo == 1) then --> CC BREAKS
				keyName = "cc_break"
			elseif (sub_atributo == 2) then --> RESS
				keyName = "ress"
			elseif (sub_atributo == 3) then --> INTERRUPT
				keyName = "interrupt"
			elseif (sub_atributo == 4) then --> DISPELLS
				keyName = "dispell"
			elseif (sub_atributo == 5) then --> DEATHS
				keyName = "dead"
			elseif (sub_atributo == 6) then --> DEFENSIVE COOLDOWNS
				keyName = "cooldowns_defensive"
			elseif (sub_atributo == 7) then --> BUFF UPTIME
				keyName = "buff_uptime"
			elseif (sub_atributo == 8) then --> DEBUFF UPTIME
				keyName = "debuff_uptime"
			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	
		
		--> pega qual a sub key que ser� usada
		if (sub_atributo == 1) then --> CC BREAKS
			keyName = "cc_break"
		elseif (sub_atributo == 2) then --> RESS
			keyName = "ress"
		elseif (sub_atributo == 3) then --> INTERRUPT
			keyName = "interrupt"
		elseif (sub_atributo == 4) then --> DISPELLS
			keyName = "dispell"
		elseif (sub_atributo == 5) then --> DEATHS
			keyName = "dead"
		elseif (sub_atributo == 6) then --> DEFENSIVE COOLDOWNS
			keyName = "cooldowns_defensive"
		elseif (sub_atributo == 7) then --> BUFF UPTIME
			keyName = "buff_uptime"
		elseif (sub_atributo == 8) then --> DEBUFF UPTIME
			keyName = "debuff_uptime"
		end
	
	end
	
	if (keyName == "dead") then 
		local mortes = tabela_do_combate.last_events_tables
		--> n�o precisa reordenar, uma vez que sempre vai da na ordem do �ltimo a morrer at� o primeiro
		-- _table_sort (mortes, function (m1, m2) return m1[2] < m2[2] end) -- [1] = tabela com a morte [2] = tempo [3] = nome do jogador
		instancia.top = 1
		total = #mortes
		
		if (exportar) then 
			return mortes
		end

		if (total < 1) then
			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 (total)
		
		--depois faz a atualiza��o normal dele atrav�s dos_ iterators
		local whichRowLine = 1
		local barras_container = instancia.barras
		local percentage_type = instancia.row_info.percent_type

		for i = instancia.barraS[1], instancia.barraS[2], 1 do --> vai atualizar s� o range que esta sendo mostrado
			if (mortes[i]) then --> corre��o para um raro e desconhecido problema onde mortes[i] � nil
				atributo_misc:DeadAtualizarBarra (mortes[i], whichRowLine, i, instancia)
				whichRowLine = whichRowLine+1
			end
		end
		
		return _detalhes:EndRefresh (instancia, total, tabela_do_combate, showing) --> retorna a tabela que precisa ganhar o refresh
		
	else
	
		if (instancia.atributo == 5) then --> custom
			--> faz o sort da categoria e retorna o amount corrigido
			_table_sort (conteudo, _detalhes.SortIfHaveKey)
			
			--> n�o mostrar resultados com zero
			for i = amount, 1, -1 do --> de tr�s pra frente
				if (not conteudo[i][keyName] or conteudo[i][keyName] < 1) then
					amount = amount - 1
				else
					break
				end
			end

			--> pega o total ja aplicado na tabela do combate
			total = tabela_do_combate.totals [class_type] [keyName]
			
			--> grava o total
			instancia.top = conteudo[1][keyName]
	
		elseif (modo == modo_ALL) then --> mostrando ALL
		
			_table_sort (conteudo, _detalhes.SortIfHaveKey)
			
			--> n�o mostrar resultados com zero
			for i = amount, 1, -1 do --> de tr�s pra frente
				if (not conteudo[i][keyName] or conteudo[i][keyName] < 1) then
					amount = amount - 1
				else
					break
				end
			end

			--> pega o total ja aplicado na tabela do combate
			total = tabela_do_combate.totals [class_type] [keyName]
			
			--> grava o total
			instancia.top = conteudo[1][keyName]
		
		elseif (modo == modo_GROUP) then --> mostrando GROUP
		
			--if (refresh_needed) then
				_table_sort (conteudo, _detalhes.SortGroupIfHaveKey)
			--end
			for index, player in _ipairs (conteudo) do
				if (player.grupo) then --> � um player e esta em grupo
					if (not player[keyName] or 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
	showing:remapear()

	if (exportar) then 
		return total, keyName, instancia.top, amount
	end
	
	if (amount < 1) then --> n�o h� barras para mostrar
		instancia:EsconderScrollBar() --> precisaria esconder a scroll bar
		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
	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 use_animations = _detalhes.is_using_row_animations and (not instancia.baseframe.isStretching and not forcar)
	
	if (total == 0) then
		total = 0.00000001
	end

	UsingCustomLeftText = instancia.row_info.textL_enable_custom_text
	UsingCustomRightText = instancia.row_info.textR_enable_custom_text
	
	if (instancia.bars_sort_direction == 1) then --top to bottom
		for i = instancia.barraS[1], instancia.barraS[2], 1 do --> vai atualizar s� o range que esta sendo mostrado
			conteudo[i]:RefreshLine (instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, nil, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator)
			whichRowLine = whichRowLine+1
		end
		
	elseif (instancia.bars_sort_direction == 2) then --bottom to top
		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, nil, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator)
				whichRowLine = whichRowLine+1
			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
	
	return _detalhes: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_misc:RefreshLine (instancia, barras_container, whichRowLine, lugar, total, sub_atributo, forcar, keyName, is_dead, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator)

	local esta_barra = instancia.barras[whichRowLine] --> pega a refer�ncia da barra na janela
	
	if (not esta_barra) then
		print ("DEBUG: problema com <instancia.esta_barra> "..whichRowLine.." "..lugar)
		return
	end
	
	local tabela_anterior = esta_barra.minha_tabela
	
	esta_barra.minha_tabela = self
	esta_barra.colocacao = lugar
	
	self.minha_barra = esta_barra
	self.colocacao = lugar
	
	local meu_total = _math_floor (self [keyName] or 0) --> total
	if (not meu_total) then
		return
	end
	
	--local porcentagem = meu_total / total * 100
	if (not percentage_type or percentage_type == 1) then
		porcentagem = _cstr ("%.1f", meu_total / total * 100)
	elseif (percentage_type == 2) then
		porcentagem = _cstr ("%.1f", meu_total / instancia.top * 100)
	end
	
	local esta_porcentagem = _math_floor ((meu_total/instancia.top) * 100)

	if (not bars_show_data [1]) then
		meu_total = ""
	end
	if (not bars_show_data [3]) then
		porcentagem = ""
	else
		porcentagem = porcentagem .. "%"
	end
	
	local rightText = meu_total .. bars_brackets[1] .. porcentagem .. bars_brackets[2]
	if (UsingCustomRightText) then
		esta_barra.lineText4:SetText (_string_replace (instancia.row_info.textR_custom_text, meu_total, "", porcentagem, self, instancia.showing, instancia, rightText))
	else
		if (instancia.use_multi_fontstrings) then
			instancia:SetInLineTexts(esta_barra, "", meu_total, porcentagem)
		else
			esta_barra.lineText4:SetText(rightText)
		end
	end
	
	if (esta_barra.mouse_over and not instancia.baseframe.isMoving) then --> precisa atualizar o tooltip
		gump:UpdateTooltip (whichRowLine, esta_barra, instancia)
	end
	
	actor_class_color_r, actor_class_color_g, actor_class_color_b = self:GetBarColor()	

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

function atributo_misc:RefreshBarra2 (esta_barra, instancia, tabela_anterior, forcar, esta_porcentagem, whichRowLine, barras_container, use_animations)
	
	--> primeiro colocado
	if (esta_barra.colocacao == 1) then
		if (not tabela_anterior or tabela_anterior ~= esta_barra.minha_tabela or forcar) then
			esta_barra:SetValue (100)
			
			if (esta_barra.hidden or esta_barra.fading_in or esta_barra.faded) then
				Details.FadeHandler.Fader (esta_barra, "out")
			end
			
			return self:RefreshBarra (esta_barra, instancia)
		else
			return
		end
	else

		if (esta_barra.hidden or esta_barra.fading_in or esta_barra.faded) then
			
			if (use_animations) then
				esta_barra.animacao_fim = esta_porcentagem
			else
				esta_barra:SetValue (esta_porcentagem)
				esta_barra.animacao_ignorar = true
			end
			
			Details.FadeHandler.Fader (esta_barra, "out")
			
			if (instancia.row_info.texture_class_colors) then
				esta_barra.textura:SetVertexColor (actor_class_color_r, actor_class_color_g, actor_class_color_b)
			end
			if (instancia.row_info.texture_background_class_color) then
				esta_barra.background:SetVertexColor (actor_class_color_r, actor_class_color_g, actor_class_color_b)
			end
			
			return self:RefreshBarra (esta_barra, instancia)
			
		else
			--> agora esta comparando se a tabela da barra � diferente da tabela na atualiza��o anterior
			if (not tabela_anterior or tabela_anterior ~= esta_barra.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
					esta_barra.animacao_fim = esta_porcentagem
				else
					esta_barra:SetValue (esta_porcentagem)
					esta_barra.animacao_ignorar = true
				end
			
				esta_barra.last_value = esta_porcentagem --> reseta o ultimo valor da barra
				
				return self:RefreshBarra (esta_barra, instancia)
				
			elseif (esta_porcentagem ~= esta_barra.last_value) then --> continua mostrando a mesma tabela ent�o compara a porcentagem
				--> apenas atualizar
				if (use_animations) then
					esta_barra.animacao_fim = esta_porcentagem
				else
					esta_barra:SetValue (esta_porcentagem)
				end
				esta_barra.last_value = esta_porcentagem
				
				return self:RefreshBarra (esta_barra, instancia)
			end
		end

	end
	
end

function atributo_misc:RefreshBarra (esta_barra, 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 (esta_barra.icone_classe, instancia, class)
	--> texture color
	self:SetBarColors (esta_barra, instancia, actor_class_color_r, actor_class_color_g, actor_class_color_b)
	--> left text
	self:SetBarLeftText (esta_barra, instancia, enemy, arena_enemy, arena_ally, UsingCustomLeftText)

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

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


---------> TOOLTIPS BIFURCA��O ~tooltip
function atributo_misc:ToolTip (instancia, numero, barra, keydown)
	--> seria possivel aqui colocar o icone da classe dele?
	GameTooltip:ClearLines()
	GameTooltip:AddLine (barra.colocacao..". "..self.nome)
	
	if (instancia.sub_atributo == 3) then --> interrupt
		return self:ToolTipInterrupt (instancia, numero, barra, keydown)
	elseif (instancia.sub_atributo == 1) then --> cc_break
		return self:ToolTipCC (instancia, numero, barra, keydown)
	elseif (instancia.sub_atributo == 2) then --> ress 
		return self:ToolTipRess (instancia, numero, barra, keydown)
	elseif (instancia.sub_atributo == 4) then --> dispell
		return self:ToolTipDispell (instancia, numero, barra, keydown)
	elseif (instancia.sub_atributo == 5) then --> mortes
		return self:ToolTipDead (instancia, numero, barra, keydown)
	elseif (instancia.sub_atributo == 6) then --> defensive cooldowns
		return self:ToolTipDefensiveCooldowns (instancia, numero, barra, keydown)
	elseif (instancia.sub_atributo == 7) then --> buff uptime
		return self:ToolTipBuffUptime (instancia, numero, barra, keydown)
	elseif (instancia.sub_atributo == 8) then --> debuff uptime
		return self:ToolTipDebuffUptime (instancia, numero, barra, keydown)
	end
end

--> tooltip locals
local r, g, b
local barAlha = .6

function atributo_misc:ToolTipDead (instancia, numero, barra)
	
	local last_dead = self.dead_log [#self.dead_log]

end

function atributo_misc:ToolTipCC (instancia, numero, barra)

	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 meu_total = self ["cc_break"]
	local habilidades = self.cc_break_spells._ActorTable
	
	--> habilidade usada para tirar o CC
	local icon_size = _detalhes.tooltip.icon_size
	local icon_border = _detalhes.tooltip.icon_border_texcoord
	local lineHeight = _detalhes.tooltip.line_height
	local icon_border = _detalhes.tooltip.icon_border_texcoord
	
	for _spellid, _tabela in _pairs (habilidades) do
		
		--> quantidade
		local nome_magia, _, icone_magia = _GetSpellInfo (_spellid)
		GameCooltip:AddLine (nome_magia, _tabela.cc_break .. " (" .. _cstr ("%.1f", _tabela.cc_break / meu_total * 100) .. "%)")
		GameCooltip:AddIcon (icone_magia, nil, nil, lineHeight, lineHeight, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
		_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)
		
		--> o que quebrou
		local quebrou_oque = _tabela.cc_break_oque
		for spellid_quebrada, amt_quebrada in _pairs (_tabela.cc_break_oque) do 
			local nome_magia, _, icone_magia = _GetSpellInfo (spellid_quebrada)
			GameCooltip:AddLine (nome_magia, amt_quebrada .. "  ")
			GameCooltip:AddIcon ([[Interface\Buttons\UI-GroupLoot-Pass-Down]], nil, 1, 14, 14)
			GameCooltip:AddIcon (icone_magia, nil, 2, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
			GameCooltip:AddStatusBar (100, 1, 1, 0, 0, .2)
		end
		
		--> em quem quebrou
		for target_name, amount in _pairs (_tabela.targets) do
			GameCooltip:AddLine (target_name .. ": ", amount .. "  ")
			
			local classe = _detalhes:GetClass (target_name)
			GameCooltip:AddIcon ([[Interface\AddOns\Details\images\espadas]], nil, 1, lineHeight, lineHeight)
			if (classe) then	
				GameCooltip:AddIcon ([[Interface\AddOns\Details\images\classes_small]], nil, 2, lineHeight, lineHeight, unpack (_detalhes.class_coords [classe]))
			else
				GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, 2, lineHeight, lineHeight, .25, .5, 0, 1)
			end
			
			_detalhes:AddTooltipBackgroundStatusbar()
		end
	end
	
	
	return true
end

function atributo_misc:ToolTipDispell (instancia, numero, barra)

	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 meu_total = _math_floor (self ["dispell"])
	local habilidades = self.dispell_spells._ActorTable
	
--> habilidade usada para dispelar
	local meus_dispells = {}
	for _spellid, _tabela in _pairs (habilidades) do
		if (_tabela.dispell) then
			meus_dispells [#meus_dispells+1] = {_spellid, _math_floor (_tabela.dispell)} --_math_floor valor é nil, uma magia na tabela de dispel, sem dispel?
		else
			Details:Msg("D! table.dispell is invalid. spellId:", _spellid)
		end
	end
	_table_sort (meus_dispells, _detalhes.Sort2)
	
	_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_SPELLS"], headerColor, #meus_dispells, [[Interface\ICONS\Spell_Arcane_ArcaneTorrent]], 0.078125, 0.9375, 0.078125, 0.953125)
	_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)
	
	local icon_size = _detalhes.tooltip.icon_size
	local icon_border = _detalhes.tooltip.icon_border_texcoord
	
	if (#meus_dispells > 0) then
		for i = 1, _math_min (25, #meus_dispells) do
			local esta_habilidade = meus_dispells[i]
			local nome_magia, _, icone_magia = _GetSpellInfo (esta_habilidade[1])
			GameCooltip:AddLine (nome_magia, esta_habilidade[2].." (".._cstr("%.1f", esta_habilidade[2]/meu_total*100).."%)")
			GameCooltip:AddIcon (icone_magia, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
			_detalhes:AddTooltipBackgroundStatusbar()
		end
	else
		GameTooltip:AddLine (Loc ["STRING_NO_SPELL"])
	end
	
--> quais habilidades foram dispaladas
	local buffs_dispelados = {}
	for _spellid, amt in _pairs (self.dispell_oque) do
		buffs_dispelados [#buffs_dispelados+1] = {_spellid, amt}
	end
	_table_sort (buffs_dispelados, _detalhes.Sort2)
	
	_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_DISPELLED"], headerColor, #buffs_dispelados, [[Interface\ICONS\Spell_Arcane_ManaTap]], 0.078125, 0.9375, 0.078125, 0.953125)
	_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)

	if (#buffs_dispelados > 0) then
		for i = 1, _math_min (25, #buffs_dispelados) do
			local esta_habilidade = buffs_dispelados[i]
			local nome_magia, _, icone_magia = _GetSpellInfo (esta_habilidade[1])
			GameCooltip:AddLine (nome_magia, esta_habilidade[2].." (".._cstr("%.1f", esta_habilidade[2]/meu_total*100).."%)")
			GameCooltip:AddIcon (icone_magia, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
			_detalhes:AddTooltipBackgroundStatusbar()
		end
	end

--> alvos dispelados
	
	local alvos_dispelados = {}
	for target_name, amount in _pairs (self.dispell_targets) do
		alvos_dispelados [#alvos_dispelados + 1] = {target_name, _math_floor (amount), amount / meu_total * 100}
	end
	_table_sort (alvos_dispelados, _detalhes.Sort2)

	_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_TARGETS"], headerColor, #alvos_dispelados, [[Interface\ICONS\ACHIEVEMENT_GUILDPERK_EVERYONES A HERO_RANK2]], 0.078125, 0.9375, 0.078125, 0.953125)
	_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)
	
	for i = 1, _math_min (25, #alvos_dispelados) do
		if (alvos_dispelados[i][2] < 1) then
			break
		end
		
		GameCooltip:AddLine (alvos_dispelados[i][1], _detalhes:comma_value (alvos_dispelados[i][2]) .." (".._cstr ("%.1f", alvos_dispelados[i][3]).."%)")
		_detalhes:AddTooltipBackgroundStatusbar()
		
		local targetActor = instancia.showing[4]:PegarCombatente (_, alvos_dispelados[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, 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
	
--> Pet
	local meus_pets = self.pets
	if (#meus_pets > 0) then --> teve ajudantes
		
		local quantidade = {} --> armazena a quantidade de pets iguais
		local interrupts = {} --> armazena as habilidades
		local alvos = {} --> armazena os alvos
		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 = instancia.showing[class_type]:PegarCombatente (nil, nome)
				if (my_self and my_self.dispell) then
					totais [#totais+1] = {nome, my_self.dispell}
				end
			else
				quantidade [nome] = quantidade [nome]+1
			end
		end
	
		local _quantidade = 0
		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] > 0 and (index < 3 or ismaximized)) then
			
				if (not added_logo) then
					added_logo = true

					_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_PETS"], headerColor, #totais, [[Interface\COMMON\friendship-heart]], 0.21875, 0.78125, 0.09375, 0.6875)
					_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)
				end
			
				local n = _table [1]:gsub (("%s%<.*"), "")
				GameCooltip:AddLine (n, _table [2] .. " (" .. _math_floor (_table [2]/self.dispell*100) .. "%)")
				_detalhes:AddTooltipBackgroundStatusbar()
				GameCooltip:AddIcon ([[Interface\AddOns\Details\images\classes_small]], 1, 1, 14, 14, 0.25, 0.49609375, 0.75, 1)
			end
		end
			
	end
	
	return true
end

local UnitReaction = UnitReaction
local UnitDebuff = UnitDebuff

function _detalhes:CloseEnemyDebuffsUptime()
	local combat = _detalhes.tabela_vigente
	local misc_container = combat [4]._ActorTable
	
	for _, actor in _ipairs (misc_container) do 
		if (actor.boss_debuff) then
			for target_name, target in _ipairs (actor.debuff_uptime_targets) do 
				if (target.actived and target.actived_at) then
					target.uptime = target.uptime + _detalhes._tempo - target.actived_at
					actor.debuff_uptime = actor.debuff_uptime + _detalhes._tempo - target.actived_at
					target.actived = false
					target.actived_at = nil
				end
			end
		end
	end
	
	return
end

function _detalhes:CatchRaidDebuffUptime (in_or_out) -- "DEBUFF_UPTIME_IN"

	if (in_or_out == "DEBUFF_UPTIME_OUT") then
		local combat = _detalhes.tabela_vigente
		local misc_container = combat [4]._ActorTable
		
		for _, actor in _ipairs (misc_container) do 
			if (actor.debuff_uptime) then
				for spellid, spell in _pairs (actor.debuff_uptime_spells._ActorTable) do 
					if (spell.actived and spell.actived_at) then
						spell.uptime = spell.uptime + _detalhes._tempo - spell.actived_at
						actor.debuff_uptime = actor.debuff_uptime + _detalhes._tempo - spell.actived_at
						spell.actived = false
						spell.actived_at = nil
					end
				end
			end
		end
		
		return
	end

	local cacheGetTime = GetTime()
	
	if (_IsInRaid()) then
	
		local checked = {}
		
		for raidIndex = 1, _GetNumGroupMembers() do
		
			local target = "raid"..raidIndex.."target"
			local his_target = _UnitGUID (target)
			
			if (his_target and not checked [his_target]) then
				local rect = UnitReaction (target, "player")
				if (rect and rect <= 4) then
					
					checked [his_target] = true
					
					for debuffIndex = 1, 41 do
						local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff (target, debuffIndex)
						if (name and unitCaster) then
							local playerGUID = _UnitGUID (unitCaster)
							if (playerGUID) then

								local playerName, realmName = _UnitName (unitCaster)
								if (realmName and realmName ~= "") then
									playerName = playerName .. "-" .. realmName
								end

								_detalhes.parser:add_debuff_uptime (nil, cacheGetTime, playerGUID, playerName, 0x00000417, his_target, _UnitName (target), 0x842, nil, spellid, name, in_or_out)
							end
						end
					end
				end
			end
		end
		
	elseif (_IsInGroup()) then
		
		local checked = {}
		
		for raidIndex = 1, _GetNumGroupMembers()-1 do
			local his_target = _UnitGUID ("party"..raidIndex.."target")
			local rect = UnitReaction ("party"..raidIndex.."target", "player")
			if (his_target and not checked [his_target] and rect and rect <= 4) then
				
				checked [his_target] = true
				
				for debuffIndex = 1, 40 do
					local name, _, _, _, _, _, _, unitCaster, _, _, spellid  = UnitDebuff ("party"..raidIndex.."target", debuffIndex)
					if (name and unitCaster) then
						local playerName, realmName = _UnitName (unitCaster)
						local playerGUID = _UnitGUID (unitCaster)
						if (playerGUID) then
							if (realmName and realmName ~= "") then
								playerName = playerName .. "-" .. realmName
							end
							
							_detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("party"..raidIndex.."target"), 0x842, nil, spellid, name, in_or_out)
						end
					end
				end
			end
		end
		
		local his_target = _UnitGUID ("playertarget")
		local rect = UnitReaction ("playertarget", "player")
		if (his_target and not checked [his_target] and rect and rect <= 4) then
			for debuffIndex = 1, 40 do
				local name, _, _, _, _, _, _, unitCaster, _, _, spellid  = UnitDebuff ("playertarget", debuffIndex)
				if (name and unitCaster) then
					local playerName, realmName = _UnitName (unitCaster)
					local playerGUID = _UnitGUID (unitCaster)
					if (playerGUID) then
						if (realmName and realmName ~= "") then
							playerName = playerName .. "-" .. realmName
						end
						_detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("playertarget"), 0x842, nil, spellid, name, in_or_out)
					end
				end
			end
		end
		
	else
		local his_target = _UnitGUID ("playertarget")
		if (his_target) then
			local reaction = UnitReaction ("playertarget", "player")
			if (reaction and reaction <= 4) then
				for debuffIndex = 1, 40 do
					local name, _, _, _, _, _, _, unitCaster, _, _, spellid  = UnitDebuff ("playertarget", debuffIndex)
					if (name and unitCaster) then
						local playerName, realmName = _UnitName (unitCaster)
						local playerGUID = _UnitGUID (unitCaster)
						if (playerGUID) then
							if (realmName and realmName ~= "") then
								playerName = playerName .. "-" .. realmName
							end
							_detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("playertarget"), 0x842, nil, spellid, name, in_or_out)
						end
					end
				end
			end
		end
	end
end

--> this shouldn't be hardcoded
local runes_id = {
	[175457] = true, -- focus
	[175456] = true, --hyper
	[175439] = true, --stout
}

--called from control on leave / enter combat
function _detalhes:CatchRaidBuffUptime (in_or_out)

	if (_IsInRaid()) then
	
		local pot_usage = {}
		local focus_augmentation = {}
	
		--> raid groups
		local cacheGetTime = GetTime()
		
		for raidIndex = 1, _GetNumGroupMembers() do
			local RaidIndex = "raid" .. raidIndex
			local playerGUID = _UnitGUID (RaidIndex)

			if (playerGUID) then
			
				local playerName, realmName = _UnitName (RaidIndex)
				if (realmName and realmName ~= "") then
					playerName = playerName .. "-" .. realmName
				end
			
				for buffIndex = 1, 41 do
					local name, _, _, _, _, _, unitCaster, _, _, spellid  = _UnitAura (RaidIndex, buffIndex, nil, "HELPFUL")
					if (name and unitCaster and UnitExists (unitCaster) and UnitExists (RaidIndex) and UnitIsUnit (unitCaster, RaidIndex)) then
						_detalhes.parser:add_buff_uptime (nil, cacheGetTime, playerGUID, playerName, 0x00000514, playerGUID, playerName, 0x00000514, 0x0, spellid, name, in_or_out)

						if (in_or_out == "BUFF_UPTIME_IN") then
							if (_detalhes.PotionList [spellid]) then
								pot_usage [playerName] = spellid

							elseif (runes_id [spellid]) then
								focus_augmentation [playerName] = true
							end
						end
					end
				end
			end
		end

		if (in_or_out == "BUFF_UPTIME_IN") then
			local string_output = "pre-potion: " --> localize-me

			for playername, potspellid in _pairs (pot_usage) do
				local name, _, icon = _GetSpellInfo (potspellid)
				local _, class = UnitClass (playername)
				local class_color = ""
				if (class and RAID_CLASS_COLORS [class]) then
					class_color = RAID_CLASS_COLORS [class].colorStr
				end
				string_output = string_output .. "|c" .. class_color .. playername .. "|r |T" .. icon .. ":14:14:0:0:64:64:0:64:0:64|t "
			end
			
			_detalhes.pre_pot_used = string_output
			
			_detalhes:SendEvent ("COMBAT_PREPOTION_UPDATED", nil, pot_usage, focus_augmentation)
		end
		
	elseif (_IsInGroup()) then
	
		local pot_usage = {}
		local focus_augmentation = {}
		
		--party members
		for groupIndex = 1, _GetNumGroupMembers() - 1 do
			for buffIndex = 1, 41 do
				local name, _, _, _, _, _, unitCaster, _, _, spellid  = _UnitAura ("party"..groupIndex, buffIndex, nil, "HELPFUL")
				if (name and unitCaster and UnitExists (unitCaster) and UnitExists ("party" .. groupIndex) and UnitIsUnit (unitCaster, "party" .. groupIndex)) then
				
					local playerName, realmName = _UnitName ("party"..groupIndex)
					local playerGUID = _UnitGUID ("party"..groupIndex)
					
					if (playerGUID) then
						if (realmName and realmName ~= "") then
							playerName = playerName .. "-" .. realmName
						end
						
						if (in_or_out == "BUFF_UPTIME_IN") then
							if (_detalhes.PotionList [spellid]) then
								pot_usage [playerName] = spellid

							elseif (runes_id [spellid]) then
								focus_augmentation [playerName] = true
							end
						end
					
						_detalhes.parser:add_buff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, playerGUID, playerName, 0x00000417, 0x0, spellid, name, in_or_out)
					end
				end
			end
		end
		
		--player it self
		for buffIndex = 1, 41 do
			local name, _, _, _, _, _, unitCaster, _, _, spellid  = _UnitAura ("player", buffIndex, nil, "HELPFUL")
			if (name and unitCaster and UnitExists (unitCaster) and UnitIsUnit (unitCaster, "player")) then
				local playerName = _UnitName ("player")
				local playerGUID = _UnitGUID ("player")
				if (playerGUID) then
					if (in_or_out == "BUFF_UPTIME_IN") then
						if (_detalhes.PotionList [spellid]) then
							pot_usage [playerName] = spellid
						elseif (runes_id [spellid]) then
							focus_augmentation [playerName] = true
						end
					end
				
					_detalhes.parser:add_buff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, playerGUID, playerName, 0x00000417, 0x0, spellid, name, in_or_out)
				end
			end
		end
		
		if (in_or_out == "BUFF_UPTIME_IN") then
			local string_output = "pre-potion: "
			
			for playername, potspellid in _pairs (pot_usage) do
				local name, _, icon = _GetSpellInfo (potspellid)
				local _, class = UnitClass (playername)
				local class_color = ""
				if (class and RAID_CLASS_COLORS [class]) then
					class_color = RAID_CLASS_COLORS [class].colorStr
				end
				string_output = string_output .. "|c" .. class_color .. playername .. "|r |T" .. icon .. ":14:14:0:0:64:64:0:64:0:64|t "
			end
			
			_detalhes.pre_pot_used = string_output
			_detalhes:SendEvent ("COMBAT_PREPOTION_UPDATED", nil, pot_usage, focus_augmentation)
		end
		
	else
	
		local pot_usage = {}
		local focus_augmentation = {}
		
		for buffIndex = 1, 41 do
			local name, _, _, _, _, _, unitCaster, _, _, spellid  = _UnitAura ("player", buffIndex, nil, "HELPFUL")
			if (name and unitCaster and UnitExists (unitCaster) and UnitIsUnit (unitCaster, "player")) then
				local playerName = _UnitName ("player")
				local playerGUID = _UnitGUID ("player")
				
				if (playerGUID) then
					if (in_or_out == "BUFF_UPTIME_IN") then
						if (_detalhes.PotionList [spellid]) then
							pot_usage [playerName] = spellid
						elseif (runes_id [spellid]) then
							focus_augmentation [playerName] = true
						end
					end
					_detalhes.parser:add_buff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, playerGUID, playerName, 0x00000417, 0x0, spellid, name, in_or_out)
				end
			end
		end
		
		--[
		if (in_or_out == "BUFF_UPTIME_IN") then
			local string_output = "pre-potion: "
			for playername, potspellid in _pairs (pot_usage) do
				local name, _, icon = _GetSpellInfo (potspellid)
				local _, class = UnitClass (playername)
				local class_color = ""
				if (class and RAID_CLASS_COLORS [class]) then
					class_color = RAID_CLASS_COLORS [class].colorStr
				end
				string_output = string_output .. "|c" .. class_color .. playername .. "|r |T" .. icon .. ":14:14:0:0:64:64:0:64:0:64|t "
			end
			
			_detalhes.pre_pot_used = string_output
			_detalhes:SendEvent ("COMBAT_PREPOTION_UPDATED", nil, pot_usage, focus_augmentation)
		end
		
		--]]
		-- _detalhes:Msg (string_output)
		
	end
end

local Sort2Reverse = function (a, b)
	return a[2] < b[2]
end

function atributo_misc:ToolTipDebuffUptime (instancia, numero, barra)
	
	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 meu_total = self ["debuff_uptime"]
	local minha_tabela = self.debuff_uptime_spells._ActorTable
	
--> habilidade usada para interromper
	local debuffs_usados = {}
	
	local _combat_time = instancia.showing:GetCombatTime()
	
	for _spellid, _tabela in _pairs (minha_tabela) do
		debuffs_usados [#debuffs_usados+1] = {_spellid, _tabela.uptime}
	end
	--_table_sort (debuffs_usados, Sort2Reverse)
	_table_sort (debuffs_usados, _detalhes.Sort2)
	
	_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_SPELLS"], headerColor, #debuffs_usados, _detalhes.tooltip_spell_icon.file, unpack (_detalhes.tooltip_spell_icon.coords))
	_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)

	local icon_size = _detalhes.tooltip.icon_size
	local icon_border = _detalhes.tooltip.icon_border_texcoord
	
	if (#debuffs_usados > 0) then
		for i = 1, _math_min (30, #debuffs_usados) do
			local esta_habilidade = debuffs_usados[i]
			
			if (esta_habilidade[2] > 0) then
				local nome_magia, _, icone_magia = _GetSpellInfo (esta_habilidade[1])
				
				local minutos, segundos = _math_floor (esta_habilidade[2]/60), _math_floor (esta_habilidade[2]%60)
				if (esta_habilidade[2] >= _combat_time) then
					--GameCooltip:AddLine (nome_magia, minutos .. "m " .. segundos .. "s" .. " (" .. _cstr ("%.1f", esta_habilidade[2] / _combat_time * 100) .. "%)", nil, "gray", "gray")
					--GameCooltip:AddStatusBar (100, nil, 1, 0, 1, .3, false)
				elseif (minutos > 0) then
					GameCooltip:AddLine (nome_magia, minutos .. "m " .. segundos .. "s" .. " (" .. _cstr ("%.1f", esta_habilidade[2] / _combat_time * 100) .. "%)")
					_detalhes:AddTooltipBackgroundStatusbar (false, esta_habilidade[2] / _combat_time * 100)
				else
					GameCooltip:AddLine (nome_magia, segundos .. "s" .. " (" .. _cstr ("%.1f", esta_habilidade[2] / _combat_time * 100) .. "%)")
					_detalhes:AddTooltipBackgroundStatusbar (false, esta_habilidade[2] / _combat_time * 100)
				end
				
				GameCooltip:AddIcon (icone_magia, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
			end
		end
	else
		GameCooltip:AddLine (Loc ["STRING_NO_SPELL"]) 
	end
	
	return true
	
end

function atributo_misc:ToolTipBuffUptime (instancia, numero, barra)
	
	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 meu_total = self ["buff_uptime"]
	local minha_tabela = self.buff_uptime_spells._ActorTable
	
--> habilidade usada para interromper
	local buffs_usados = {}
	
	local _combat_time = instancia.showing:GetCombatTime()
	
	for _spellid, _tabela in _pairs (minha_tabela) do
		buffs_usados [#buffs_usados+1] = {_spellid, _tabela.uptime}
	end
	--_table_sort (buffs_usados, Sort2Reverse)
	_table_sort (buffs_usados, _detalhes.Sort2)
	
	_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_SPELLS"], headerColor, #buffs_usados, _detalhes.tooltip_spell_icon.file, unpack (_detalhes.tooltip_spell_icon.coords))
	_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)

	local icon_size = _detalhes.tooltip.icon_size
	local icon_border = _detalhes.tooltip.icon_border_texcoord
	
	if (#buffs_usados > 0) then
		for i = 1, _math_min (30, #buffs_usados) do
			local esta_habilidade = buffs_usados[i]
			
			local percent = esta_habilidade[2] / _combat_time * 100
			
			if (esta_habilidade[2] > 0 and percent < 99.5) then
				local nome_magia, _, icone_magia = _GetSpellInfo (esta_habilidade[1])
				
				local minutos, segundos = _math_floor (esta_habilidade[2]/60), _math_floor (esta_habilidade[2]%60)
				if (esta_habilidade[2] >= _combat_time) then
					--GameCooltip:AddLine (nome_magia, minutos .. "m " .. segundos .. "s" .. " (" .. _cstr ("%.1f", esta_habilidade[2] / _combat_time * 100) .. "%)", nil, "gray", "gray")
					--GameCooltip:AddStatusBar (100, nil, 1, 0, 1, .3, false)
				elseif (minutos > 0) then
					GameCooltip:AddLine (nome_magia, minutos .. "m " .. segundos .. "s" .. " (" .. _cstr ("%.1f", percent) .. "%)")
					_detalhes:AddTooltipBackgroundStatusbar (false, percent)
				else
					GameCooltip:AddLine (nome_magia, segundos .. "s" .. " (" .. _cstr ("%.1f", percent) .. "%)")
					_detalhes:AddTooltipBackgroundStatusbar (false, percent)
				end
				
				GameCooltip:AddIcon (icone_magia, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
			end
		end
	else
		GameCooltip:AddLine (Loc ["STRING_NO_SPELL"]) 
	end
	
	return true
	
end

function atributo_misc:ToolTipDefensiveCooldowns (instancia, numero, barra)
	
	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 meu_total = _math_floor (self ["cooldowns_defensive"])
	local minha_tabela = self.cooldowns_defensive_spells._ActorTable
	
--> spells
	local cooldowns_usados = {}
	
	for _spellid, _tabela in _pairs (minha_tabela) do
		cooldowns_usados [#cooldowns_usados+1] = {_spellid, _tabela.counter}
	end
	_table_sort (cooldowns_usados, _detalhes.Sort2)
	
	_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_SPELLS"], headerColor, #cooldowns_usados, _detalhes.tooltip_spell_icon.file, unpack (_detalhes.tooltip_spell_icon.coords))
	_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)
	
	local icon_size = _detalhes.tooltip.icon_size
	local icon_border = _detalhes.tooltip.icon_border_texcoord
	local lineHeight = _detalhes.tooltip.line_height
	
	if (#cooldowns_usados > 0) then
		for i = 1, _math_min (25, #cooldowns_usados) do
			local esta_habilidade = cooldowns_usados[i]
			local nome_magia, _, icone_magia = _GetSpellInfo (esta_habilidade[1])
			GameCooltip:AddLine (nome_magia, esta_habilidade[2].." (".._cstr("%.1f", esta_habilidade[2]/meu_total*100).."%)")
			GameCooltip:AddIcon (icone_magia, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
			_detalhes:AddTooltipBackgroundStatusbar()
		end
	else
		GameCooltip:AddLine (Loc ["STRING_NO_SPELL"]) 
	end

--> targets
	local meus_alvos = self.cooldowns_defensive_targets
	local alvos = {}
	
	for target_name, amount in _pairs (meus_alvos) do
		alvos [#alvos+1] = {target_name, amount}
	end
	_table_sort (alvos, _detalhes.Sort2)
	
	_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_TARGETS"], headerColor, #alvos, _detalhes.tooltip_target_icon.file, unpack (_detalhes.tooltip_target_icon.coords))
	_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)
	
	if (#alvos > 0) then
		for i = 1, _math_min (25, #alvos) do
			GameCooltip:AddLine (_detalhes:GetOnlyName (alvos[i][1]) .. ": ", alvos[i][2], 1, "white", "white")
			_detalhes:AddTooltipBackgroundStatusbar()
			
			GameCooltip:AddIcon ("Interface\\Icons\\PALADIN_HOLY", nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
			
			local targetActor = instancia.showing[4]:PegarCombatente (_, alvos[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, 14, 14, .25, .5, 0, 1)
				else
					local specID = _detalhes:GetSpec (alvos[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, 14, 14, _unpack (_detalhes.class_coords [classe]))
					end
				end
			end
			
		end
	end
	
	return true
	
end

function atributo_misc:ToolTipRess (instancia, numero, barra)

	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 meu_total = self ["ress"]
	local minha_tabela = self.ress_spells._ActorTable
	local lineHeight = _detalhes.tooltip.line_height
	local icon_border = _detalhes.tooltip.icon_border_texcoord
	
--> habilidade usada para interromper
	local meus_ress = {}
	
	for _spellid, _tabela in _pairs (minha_tabela) do
		meus_ress [#meus_ress+1] = {_spellid, _tabela.ress}
	end
	_table_sort (meus_ress, _detalhes.Sort2)
	
	_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_SPELLS"], headerColor, #meus_ress, _detalhes.tooltip_spell_icon.file, unpack (_detalhes.tooltip_spell_icon.coords))
	_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)
	
	if (#meus_ress > 0) then
		for i = 1, _math_min (3, #meus_ress) do
			local esta_habilidade = meus_ress[i]
			local nome_magia, _, icone_magia = _GetSpellInfo (esta_habilidade[1])
			GameCooltip:AddLine (nome_magia, esta_habilidade[2] .. " (" .. _cstr ("%.1f", floor (esta_habilidade[2]) / floor (meu_total) * 100).."%)")
			GameCooltip:AddIcon (icone_magia, nil, nil, lineHeight, lineHeight, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
			_detalhes:AddTooltipBackgroundStatusbar()
		end
	else
		GameCooltip:AddLine (Loc ["STRING_NO_SPELL"]) 
	end

--> quem foi que o cara reviveu
	local meus_alvos = self.ress_targets
	local alvos = {}
	
	for target_name, amount in _pairs (meus_alvos) do
		alvos [#alvos+1] = {target_name, amount}
	end
	_table_sort (alvos, _detalhes.Sort2)
	
	_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_TARGETS"], headerColor, #alvos, _detalhes.tooltip_target_icon.file, unpack (_detalhes.tooltip_target_icon.coords))
	_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)
	
	if (#alvos > 0) then
		for i = 1, _math_min (3, #alvos) do
			GameCooltip:AddLine (alvos[i][1], alvos[i][2])
			_detalhes:AddTooltipBackgroundStatusbar()
			
			local targetActor = instancia.showing[4]:PegarCombatente (_, alvos[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, lineHeight, lineHeight, .25, .5, 0, 1)
				else
					local specID = _detalhes:GetSpec (alvos[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
			end
			
		end
	end
	
	return true

end

function atributo_misc:ToolTipInterrupt (instancia, numero, barra)

	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 meu_total = self ["interrupt"]
	local minha_tabela = self.interrupt_spells._ActorTable
	
	local icon_size = _detalhes.tooltip.icon_size
	local icon_border = _detalhes.tooltip.icon_border_texcoord
	local lineHeight = _detalhes.tooltip.line_height
	
--> habilidade usada para interromper
	local meus_interrupts = {}
	
	for _spellid, _tabela in _pairs (minha_tabela) do
		meus_interrupts [#meus_interrupts+1] = {_spellid, _tabela.counter}
	end
	_table_sort (meus_interrupts, _detalhes.Sort2)
	
	_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_SPELLS"], headerColor, #meus_interrupts, _detalhes.tooltip_spell_icon.file, unpack (_detalhes.tooltip_spell_icon.coords))
	_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)
	
	if (#meus_interrupts > 0) then
		for i = 1, _math_min (25, #meus_interrupts) do
			local esta_habilidade = meus_interrupts[i]
			local nome_magia, _, icone_magia = _GetSpellInfo (esta_habilidade[1])
			GameCooltip:AddLine (nome_magia, esta_habilidade[2].." (".._cstr("%.1f", floor (esta_habilidade[2])/floor (meu_total)*100).."%)")
			GameCooltip:AddIcon (icone_magia, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
			_detalhes:AddTooltipBackgroundStatusbar()
		end
	else
		GameTooltip:AddLine (Loc ["STRING_NO_SPELL"])
	end
	
--> quais habilidades foram interrompidas
	local habilidades_interrompidas = {}
	
	for _spellid, amt in _pairs (self.interrompeu_oque) do
		habilidades_interrompidas [#habilidades_interrompidas+1] = {_spellid, amt}
	end
	_table_sort (habilidades_interrompidas, _detalhes.Sort2)
	
	_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_SPELL_INTERRUPTED"] .. ":", headerColor, #habilidades_interrompidas, _detalhes.tooltip_target_icon.file, unpack (_detalhes.tooltip_target_icon.coords))
	_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)
	
	if (#habilidades_interrompidas > 0) then
		for i = 1, _math_min (25, #habilidades_interrompidas) do
			local esta_habilidade = habilidades_interrompidas[i]
			local nome_magia, _, icone_magia = _GetSpellInfo (esta_habilidade[1])
			GameCooltip:AddLine (nome_magia, esta_habilidade[2].." (".._cstr("%.1f", floor (esta_habilidade[2])/floor (meu_total)*100).."%)")
			GameCooltip:AddIcon (icone_magia, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
			_detalhes:AddTooltipBackgroundStatusbar()
		end
	end
	
--> Pet
	local meus_pets = self.pets
	if (#meus_pets > 0) then --> teve ajudantes
		
		local quantidade = {} --> armazena a quantidade de pets iguais
		local interrupts = {} --> armazena as habilidades
		local alvos = {} --> armazena os alvos
		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 = instancia.showing[class_type]:PegarCombatente (nil, nome)
				if (my_self and my_self.interrupt) then
					totais [#totais+1] = {nome, my_self.interrupt}
				end
			else
				quantidade [nome] = quantidade [nome]+1
			end
		end
	
		local _quantidade = 0
		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] > 0 and (index < 3 or ismaximized)) then
			
				if (not added_logo) then
					added_logo = true

					_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_PETS"], headerColor, #totais, [[Interface\COMMON\friendship-heart]], 0.21875, 0.78125, 0.09375, 0.6875)
					_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha)
				end
			
				local n = _table [1]:gsub (("%s%<.*"), "")
				GameCooltip:AddLine (n, _table [2] .. " (" .. _math_floor (_table [2]/self.interrupt*100) .. "%)")
				_detalhes:AddTooltipBackgroundStatusbar()
				GameCooltip:AddIcon ([[Interface\AddOns\Details\images\classes_small]], 1, 1, 14, 14, 0.25, 0.49609375, 0.75, 1)
			end
		end
			
	end
	
	return true
end


--------------------------------------------- // JANELA DETALHES // ---------------------------------------------


---------> DETALHES BIFURCA��O
function atributo_misc:MontaInfo()
	if (info.sub_atributo == 3) then --> interrupt
		return self:MontaInfoInterrupt()
	end
end

---------> DETALHES bloco da direita BIFURCA��O
function atributo_misc:MontaDetalhes (spellid, barra)
	if (info.sub_atributo == 3) then --> interrupt
		return self:MontaDetalhesInterrupt (spellid, barra)
	end
end

------ Interrupt
function atributo_misc:MontaInfoInterrupt()

	local meu_total = self ["interrupt"]
	
	if (not self.interrupt_spells) then
		return
	end
	
	local minha_tabela = self.interrupt_spells._ActorTable

	local barras = info.barras1
	local instancia = info.instancia
	
	local meus_interrupts = {}

	--player
	for _spellid, _tabela in _pairs (minha_tabela) do --> da foreach em cada spellid do container
		local nome, _, icone = _GetSpellInfo (_spellid)
		_table_insert (meus_interrupts, {_spellid, _tabela.counter, _tabela.counter/meu_total*100, nome, icone})
	end
	--pet
	local ActorPets = self.pets
	local class_color = "FFDDDDDD"
	for _, PetName in _ipairs (ActorPets) do
		local PetActor = instancia.showing (class_type, PetName)
		if (PetActor and PetActor.interrupt and PetActor.interrupt > 0) then 
			local PetSkillsContainer = PetActor.interrupt_spells._ActorTable
			for _spellid, _skill in _pairs (PetSkillsContainer) do --> da foreach em cada spellid do container
				local nome, _, icone = _GetSpellInfo (_spellid)
				_table_insert (meus_interrupts, {_spellid, _skill.counter, _skill.counter/meu_total*100, nome .. " (|c" .. class_color .. PetName:gsub ((" <.*"), "") .. "|r)", icone, PetActor})
			end
		end
	end
	
	_table_sort (meus_interrupts, _detalhes.Sort2)

	local amt = #meus_interrupts
	gump:JI_AtualizaContainerBarras (amt)

	local max_ = meus_interrupts [1][2] --> dano que a primeiro magia vez

	local barra
	for index, tabela in _ipairs (meus_interrupts) do

		barra = barras [index]

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

		--> isso aqui � tudo da sele��o e descele��o das barras
		
		if (not info.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 info.mostrando) then
						info.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
		barra.lineText4:SetText (tabela[2] .." ".. instancia.divisores.abre .._cstr("%.1f", tabela[3]) .."%".. instancia.divisores.fecha) --seta o texto da direita
		
		barra.icone:SetTexture (tabela[5])

		barra.minha_tabela = self --> grava o jogador na barrinho... � estranho pq todas as barras v�o ter o mesmo valor do jogador
		barra.show = tabela[1] --> grava o spellid na barra
		barra:Show() --> mostra a barra

		if (self.detalhes and self.detalhes == barra.show) then
			self:MontaDetalhes (self.detalhes, barra) --> poderia deixar isso pro final e montar uma tail call??
		end
	end

	--> Alvos do interrupt
	local meus_alvos = {}
	for target_name, amount in _pairs (self.interrupt_targets) do
		meus_alvos [#meus_alvos+1] = {target_name, amount}
	end
	_table_sort (meus_alvos, _detalhes.Sort2)
	
	local amt_alvos = #meus_alvos
	if (amt_alvos < 1) then
		return
	end
	gump:JI_AtualizaContainerAlvos (amt_alvos)
	
	local max_alvos = meus_alvos[1][2]
	
	local barra
	for index, tabela in _ipairs (meus_alvos) do
	
		barra = info.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_alvos*100)
		end

		barra.lineText1:SetText (index..instancia.divisores.colocacao..tabela[1]) --seta o texto da esqueda
		barra.lineText4:SetText (tabela[2] .." ".. instancia.divisores.abre .._cstr("%.1f", tabela[2]/meu_total*100) .. instancia.divisores.fecha) --seta o texto da direita
		
		if (barra.mouse_over) then --> atualizar o tooltip
			if (barra.isAlvo) then
				GameTooltip:Hide() 
				GameTooltip:SetOwner (barra, "ANCHOR_TOPRIGHT")
				if (not barra.minha_tabela:MontaTooltipAlvos (barra, index)) then
					return
				end
				GameTooltip:Show()
			end
		end	
		
		barra.minha_tabela = self --> grava o jogador na tabela
		barra.nome_inimigo = tabela [1] --> salva o nome do inimigo na barra --> isso � necess�rio?

		barra:Show()
	end

end


------ Detalhe Info Interrupt
function atributo_misc:MontaDetalhesInterrupt (spellid, barra)

	for _, barra in _ipairs (info.barras3) do 
		barra:Hide()
	end

	local esta_magia = self.interrupt_spells._ActorTable [spellid]
	if (not esta_magia) then
		return
	end
	
	--> icone direito superior
	local nome, _, icone = _GetSpellInfo (spellid)
	local infospell = {nome, nil, icone}

	_detalhes.playerDetailWindow.spell_icone:SetTexture (infospell[3])

	local total = self.interrupt
	local meu_total = esta_magia.counter
	
	local index = 1
	
	local data = {}	
	
	local barras = info.barras3
	local instancia = info.instancia
	
	local habilidades_alvos = {}
	for spellid, amt in pairs (esta_magia.interrompeu_oque) do 
		habilidades_alvos [#habilidades_alvos+1] = {spellid, amt}
	end
	_table_sort (habilidades_alvos, _detalhes.Sort2)
	local max_ = habilidades_alvos[1][2]
	
	local barra
	for index, tabela in _ipairs (habilidades_alvos) do
		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
		
		if (index == 1) then
			barra.textura:SetValue (100)
		else
			barra.textura:SetValue (tabela[2]/max_*100) --> muito mais rapido...
		end
		
		local nome, _, icone = _GetSpellInfo (tabela[1])

		barra.lineText1:SetText (index..instancia.divisores.colocacao..nome) --seta o texto da esqueda
		barra.lineText4:SetText (tabela[2] .." ".. instancia.divisores.abre .._cstr("%.1f", tabela[2]/total*100) .."%".. instancia.divisores.fecha) --seta o texto da direita
		
		barra.icone:SetTexture (icone)

		barra:Show() --> mostra a barra
		
		if (index == 15) then 
			break
		end
	end
	
end


function atributo_misc:MontaTooltipAlvos (esta_barra, index)
	
	local inimigo = esta_barra.nome_inimigo
	
	local container
	if (info.instancia.sub_atributo == 3) then --interrupt
		container = self.interrupt_spells._ActorTable
	end
	
	local habilidades = {}
	local total = self.interrupt
	
	for spellid, tabela in _pairs (container) do
		--> tabela = classe_damage_habilidade
		local alvos = tabela.targets
		for target_name, amount in _ipairs (alvos) do
			--> tabela = classe_target
			if (target_name == inimigo) then
				habilidades [#habilidades+1] = {spellid, amount}
			end
		end
	end
	
	table.sort (habilidades, _detalhes.Sort2)
	
	GameTooltip:AddLine (index..". "..inimigo)
	GameTooltip:AddLine (Loc ["STRING_SPELL_INTERRUPTED"] .. ":") 
	GameTooltip:AddLine (" ")
	
	for index, tabela in _ipairs (habilidades) do
		local nome, rank, icone = _GetSpellInfo (tabela[1])
		if (index < 8) then
			GameTooltip:AddDoubleLine (index..". |T"..icone..":0|t "..nome, tabela[2].." (".._cstr("%.1f", tabela[2]/total*100).."%)", 1, 1, 1, 1, 1, 1)
		else
			GameTooltip:AddDoubleLine (index..". "..nome, tabela[2].." (".._cstr("%.1f", tabela[2]/total*100).."%)", .65, .65, .65, .65, .65, .65)
		end
	end
	
	return true
	
end

--controla se o dps do jogador esta travado ou destravado
function atributo_misc:Iniciar (iniciar)
	return false --retorna se o dps esta aberto ou fechado para este jogador
end

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> core functions

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

	local sub_list = {"cc_break", "ress", "interrupt", "cooldowns_defensive", "dispell", "dead"}

	--> subtract total from a combat table
		function atributo_misc:subtract_total (combat_table)
			for _, sub_attribute in _ipairs (sub_list) do 
				if (self [sub_attribute]) then
					combat_table.totals [class_type][sub_attribute] = combat_table.totals [class_type][sub_attribute] - self [sub_attribute]
					if (self.grupo) then
						combat_table.totals_grupo [class_type][sub_attribute] = combat_table.totals_grupo [class_type][sub_attribute] - self [sub_attribute]
					end
				end
			end
		end
		function atributo_misc:add_total (combat_table)
			for _, sub_attribute in _ipairs (sub_list) do 
				if (self [sub_attribute]) then
					combat_table.totals [class_type][sub_attribute] = combat_table.totals [class_type][sub_attribute] + self [sub_attribute]
					if (self.grupo) then
						combat_table.totals_grupo [class_type][sub_attribute] = combat_table.totals_grupo [class_type][sub_attribute] + self [sub_attribute]
					end
				end
			end
		end

local refresh_alvos = function (container1, container2)
	for target_name, amount in _pairs (container2) do
		container1 [target_name] = container1 [target_name] or 0
	end
end
local refresh_habilidades = function (container1, container2)
	for spellid, habilidade in _pairs (container2._ActorTable) do 
		local habilidade_shadow = container1:PegaHabilidade (spellid, true, nil, true)
		refresh_alvos (habilidade_shadow.targets , habilidade.targets)
	end
end

function atributo_misc:r_onlyrefresh_shadow (actor)

	local overall_misc = _detalhes.tabela_overall [4]
	local shadow = overall_misc._ActorTable [overall_misc._NameIndexTable [actor.nome]]

	if (not actor.nome) then
		actor.nome = "unknown"
	end
	
	if (not shadow) then 
		shadow = overall_misc:PegarCombatente (actor.serial, actor.nome, actor.flag_original, true)
		
		shadow.classe = actor.classe
		shadow.spec = actor.spec
		shadow.grupo = actor.grupo
		shadow.pvp = actor.pvp
		shadow.isTank = actor.isTank
		shadow.boss = actor.boss
		shadow.boss_fight_component = actor.boss_fight_component
		shadow.fight_component = actor.fight_component
		
	end

	_detalhes.refresh:r_atributo_misc (actor, shadow)

	--> spell cast
	if (actor.spell_cast) then
		if (not shadow.spell_cast) then
			shadow.spell_cast = {}
		end
		for spellid, _ in _pairs (actor.spell_cast) do
			shadow.spell_cast [spellid] = shadow.spell_cast [spellid] or 0
		end
	end
	
	--> cc done
		if (actor.cc_done) then
			refresh_alvos (shadow.cc_done_targets, actor.cc_done_targets)
			refresh_habilidades (shadow.cc_done_spells, actor.cc_done_spells)
		end	
	
	--> cooldowns
		if (actor.cooldowns_defensive) then
			refresh_alvos (shadow.cooldowns_defensive_targets, actor.cooldowns_defensive_targets)
			refresh_habilidades (shadow.cooldowns_defensive_spells, actor.cooldowns_defensive_spells)
		end
		
	--> buff uptime
		if (actor.buff_uptime) then
			refresh_alvos (shadow.buff_uptime_targets, actor.buff_uptime_targets)
			refresh_habilidades (shadow.buff_uptime_spells, actor.buff_uptime_spells)
		end
		
	--> debuff uptime
		if (actor.debuff_uptime) then
			refresh_habilidades (shadow.debuff_uptime_spells, actor.debuff_uptime_spells)
			if (actor.boss_debuff) then
				--
			else
				refresh_alvos (shadow.debuff_uptime_targets, actor.debuff_uptime_targets)
			end			
			
		end
		
	--> interrupt
		if (actor.interrupt) then
			refresh_alvos (shadow.interrupt_targets, actor.interrupt_targets)
			refresh_habilidades (shadow.interrupt_spells, actor.interrupt_spells)
			for spellid, habilidade in _pairs (actor.interrupt_spells._ActorTable) do 
				local habilidade_shadow = shadow.interrupt_spells:PegaHabilidade (spellid, true, nil, true)
				habilidade_shadow.interrompeu_oque = habilidade_shadow.interrompeu_oque or {}
			end
		end

	--> ress
		if (actor.ress) then
			refresh_alvos (shadow.ress_targets, actor.ress_targets)
			refresh_habilidades (shadow.ress_spells, actor.ress_spells)
		end

	--> dispell
		if (actor.dispell) then
			refresh_alvos (shadow.dispell_targets, actor.dispell_targets)
			refresh_habilidades (shadow.dispell_spells, actor.dispell_spells)
			for spellid, habilidade in _pairs (actor.dispell_spells._ActorTable) do 
				local habilidade_shadow = shadow.dispell_spells:PegaHabilidade (spellid, true, nil, true)
				habilidade_shadow.dispell_oque = habilidade_shadow.dispell_oque or {}
			end
		end
		
	--> cc break
		if (actor.cc_break) then
			refresh_alvos (shadow.cc_break_targets, actor.cc_break_targets)
			refresh_habilidades (shadow.cc_break_spells, actor.cc_break_spells)
			for spellid, habilidade in _pairs (actor.cc_break_spells._ActorTable) do 
				local habilidade_shadow = shadow.cc_break_spells:PegaHabilidade (spellid, true, nil, true)
				habilidade_shadow.cc_break_oque = habilidade_shadow.cc_break_oque or {}
			end
		end

	return shadow

end

local somar_keys = function (habilidade, habilidade_tabela1)
	for key, value in _pairs (habilidade) do 
		if (_type (value) == "number") then
			if (key ~= "id" and key ~= "spellschool") then
				habilidade_tabela1 [key] = (habilidade_tabela1 [key] or 0) + value
			end
		end
	end
end
local somar_alvos = function (container1, container2)
	for target_name, amount in _pairs (container2) do
		container1 [target_name] = (container1 [target_name] or 0) + amount
	end
end
local somar_habilidades = function (container1, container2)
	for spellid, habilidade in _pairs (container2._ActorTable) do
		local habilidade_tabela1 = container1:PegaHabilidade (spellid, true, nil, false)
		somar_alvos (habilidade_tabela1.targets, habilidade.targets)
		somar_keys (habilidade, habilidade_tabela1)
	end
end

function atributo_misc:r_connect_shadow (actor, no_refresh, combat_object)

	local host_combat = combat_object or _detalhes.tabela_overall

	--> criar uma shadow desse ator se ainda n�o tiver uma
	local overall_misc = host_combat [4]
	local shadow = overall_misc._ActorTable [overall_misc._NameIndexTable [actor.nome]]

	if (not actor.nome) then
		actor.nome = "unknown"
	end
	
	if (not shadow) then 
		shadow = overall_misc:PegarCombatente (actor.serial, actor.nome, actor.flag_original, true)
		
		shadow.classe = actor.classe
		shadow.spec = actor.spec
		shadow.grupo = actor.grupo
		shadow.pvp = actor.pvp
		shadow.isTank = actor.isTank
		shadow.boss = actor.boss
		shadow.boss_fight_component = actor.boss_fight_component
		shadow.fight_component = actor.fight_component
		
	end

	--> aplica a meta e indexes
	if (not no_refresh) then
		_detalhes.refresh:r_atributo_misc (actor, shadow)
	end
	
	--> pets (add unique pet names)
	for _, petName in _ipairs (actor.pets) do
		DetailsFramework.table.addunique (shadow.pets, petName)
	end

	if (actor.spell_cast) then
		if (not shadow.spell_cast) then
			shadow.spell_cast = {}
		end
		
		for spellid, amount in _pairs (actor.spell_cast) do
			shadow.spell_cast [spellid] = (shadow.spell_cast [spellid] or 0) + amount
		end
	end
	
	if (actor.cc_done) then
		if (not shadow.cc_done_targets) then
			shadow.cc_done = _detalhes:GetOrderNumber()
			shadow.cc_done_targets = {}
			shadow.cc_done_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS)
		end
	
		shadow.cc_done = shadow.cc_done + actor.cc_done
		
		somar_alvos (shadow.cc_done_targets, actor.cc_done_targets)
		somar_habilidades (shadow.cc_done_spells, actor.cc_done_spells)
	end
	
	if (actor.cooldowns_defensive) then
		if (not shadow.cooldowns_defensive_targets) then
			shadow.cooldowns_defensive =  _detalhes:GetOrderNumber (actor.nome)
			shadow.cooldowns_defensive_targets = {}
			shadow.cooldowns_defensive_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS)
		end
	
		shadow.cooldowns_defensive = shadow.cooldowns_defensive + actor.cooldowns_defensive
		host_combat.totals[4].cooldowns_defensive = host_combat.totals[4].cooldowns_defensive + actor.cooldowns_defensive
		if (actor.grupo) then
			host_combat.totals_grupo[4].cooldowns_defensive = host_combat.totals_grupo[4].cooldowns_defensive + actor.cooldowns_defensive
		end
		
		somar_alvos (shadow.cooldowns_defensive_targets, actor.cooldowns_defensive_targets)
		somar_habilidades (shadow.cooldowns_defensive_spells, actor.cooldowns_defensive_spells)
	end

	if (actor.buff_uptime) then
		if (not shadow.buff_uptime_targets) then
			shadow.buff_uptime = 0
			shadow.buff_uptime_targets = {}
			shadow.buff_uptime_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS)
		end

		shadow.buff_uptime = shadow.buff_uptime + actor.buff_uptime
		somar_alvos (shadow.buff_uptime_targets, actor.buff_uptime_targets)
		somar_habilidades (shadow.buff_uptime_spells, actor.buff_uptime_spells)
	end
	

	if (actor.debuff_uptime) then
		if (not shadow.debuff_uptime_targets) then
			shadow.debuff_uptime = 0
			if (actor.boss_debuff) then
				shadow.debuff_uptime_targets = {}
				shadow.boss_debuff = true
				shadow.damage_twin = actor.damage_twin
				shadow.spellschool = actor.spellschool
				shadow.damage_spellid = actor.damage_spellid
				shadow.debuff_uptime = 0
			else
				shadow.debuff_uptime_targets = {}
			end
			shadow.debuff_uptime_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS)
		end
	
		shadow.debuff_uptime = shadow.debuff_uptime + actor.debuff_uptime

		for target_name, amount in _pairs (actor.debuff_uptime_targets) do
			if (_type (amount) == "table") then --> boss debuff
				local t = shadow.debuff_uptime_targets [target_name]
				if (not t) then
					shadow.debuff_uptime_targets [target_name] = atributo_misc:CreateBuffTargetObject()
					t = shadow.debuff_uptime_targets [target_name]
				end
				t.uptime = t.uptime + amount.uptime
				t.activedamt = t.activedamt + amount.activedamt
				t.refreshamt = t.refreshamt + amount.refreshamt
				t.appliedamt = t.appliedamt + amount.appliedamt
			else
				shadow.debuff_uptime_targets [target_name] = (shadow.debuff_uptime_targets [target_name] or 0) + amount
			end
		end

		somar_habilidades (shadow.debuff_uptime_spells, actor.debuff_uptime_spells)
	end
		
	--> interrupt
	if (actor.interrupt) then
		if (not shadow.interrupt_targets) then
			shadow.interrupt = 0
			shadow.interrupt_targets = {}
			shadow.interrupt_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) --> cria o container das habilidades usadas para interromper
			shadow.interrompeu_oque = {}
		end
	
		shadow.interrupt = shadow.interrupt + actor.interrupt
		host_combat.totals[4].interrupt = host_combat.totals[4].interrupt + actor.interrupt
		if (actor.grupo) then
			host_combat.totals_grupo[4].interrupt = host_combat.totals_grupo[4].interrupt + actor.interrupt
		end
	
		somar_alvos (shadow.interrupt_targets, actor.interrupt_targets)
		somar_habilidades (shadow.interrupt_spells, actor.interrupt_spells)
		
		for spellid, habilidade in _pairs (actor.interrupt_spells._ActorTable) do 
			local habilidade_shadow = shadow.interrupt_spells:PegaHabilidade (spellid, true, nil, true)
			
			habilidade_shadow.interrompeu_oque = habilidade_shadow.interrompeu_oque or {}
			
			for _spellid, amount in _pairs (habilidade.interrompeu_oque) do
				habilidade_shadow.interrompeu_oque [_spellid] = (habilidade_shadow.interrompeu_oque [_spellid] or 0) + amount
			end
		end
		for spellid, amount in _pairs (actor.interrompeu_oque) do 
			shadow.interrompeu_oque [spellid] = (shadow.interrompeu_oque [spellid] or 0) + amount
		end
	end

	--> ress
	if (actor.ress) then
		if (not shadow.ress_targets) then
			shadow.ress = 0
			shadow.ress_targets = {}
			shadow.ress_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS)
		end
		
		shadow.ress = shadow.ress + actor.ress
		host_combat.totals[4].ress = host_combat.totals[4].ress + actor.ress
		if (actor.grupo) then
			host_combat.totals_grupo[4].ress = host_combat.totals_grupo[4].ress + actor.ress
		end
		
		somar_alvos (shadow.ress_targets, actor.ress_targets)
		somar_habilidades (shadow.ress_spells, actor.ress_spells)
	end

	--> dispell
	if (actor.dispell) then
		if (not shadow.dispell_targets) then
			shadow.dispell = 0
			shadow.dispell_targets = {}
			shadow.dispell_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS)
			shadow.dispell_oque = {}
		end
	
		shadow.dispell = shadow.dispell + actor.dispell
		host_combat.totals[4].dispell = host_combat.totals[4].dispell + actor.dispell
		if (actor.grupo) then
			host_combat.totals_grupo[4].dispell = host_combat.totals_grupo[4].dispell + actor.dispell
		end
		
		somar_alvos (shadow.dispell_targets, actor.dispell_targets)
		somar_habilidades (shadow.dispell_spells, actor.dispell_spells)

		for spellid, habilidade in _pairs (actor.dispell_spells._ActorTable) do 
			local habilidade_shadow = shadow.dispell_spells:PegaHabilidade (spellid, true, nil, true)
			habilidade_shadow.dispell_oque = habilidade_shadow.dispell_oque or {}
			for _spellid, amount in _pairs (habilidade.dispell_oque) do
				habilidade_shadow.dispell_oque [_spellid] = (habilidade_shadow.dispell_oque [_spellid] or 0) + amount
			end
		end
		
		for spellid, amount in _pairs (actor.dispell_oque) do 
			shadow.dispell_oque [spellid] = (shadow.dispell_oque [spellid] or 0) + amount
		end
	end
	
	if (actor.cc_break) then
		if (not shadow.cc_break) then
			shadow.cc_break = 0
			shadow.cc_break_targets = {}
			shadow.cc_break_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) --> cria o container das habilidades usadas para interromper
			shadow.cc_break_oque = {}
		end

		shadow.cc_break = shadow.cc_break + actor.cc_break
		host_combat.totals[4].cc_break = host_combat.totals[4].cc_break + actor.cc_break
		if (actor.grupo) then
			host_combat.totals_grupo[4].cc_break = host_combat.totals_grupo[4].cc_break + actor.cc_break
		end
		
		somar_alvos (shadow.cc_break_targets, actor.cc_break_targets)
		somar_habilidades (shadow.cc_break_spells, actor.cc_break_spells)
		
		for spellid, habilidade in _pairs (actor.cc_break_spells._ActorTable) do 
			local habilidade_shadow = shadow.cc_break_spells:PegaHabilidade (spellid, true, nil, true)
			habilidade_shadow.cc_break_oque = habilidade_shadow.cc_break_oque or {}
			for _spellid, amount in _pairs (habilidade.cc_break_oque) do
				habilidade_shadow.cc_break_oque [_spellid] = (habilidade_shadow.cc_break_oque [_spellid] or 0) + amount
			end
		end
		for spellid, amount in _pairs (actor.cc_break_oque) do
			shadow.cc_break_oque [spellid] = (shadow.cc_break_oque [spellid] or 0) + amount
		end
	end

	return shadow

end

function atributo_misc:ColetarLixo (lastevent)
	return _detalhes:ColetarLixo (class_type, lastevent)
end

function _detalhes.refresh:r_atributo_misc (este_jogador, shadow)
	_setmetatable (este_jogador, _detalhes.atributo_misc)
	este_jogador.__index = _detalhes.atributo_misc
	
	--> refresh spell cast
	if (este_jogador.spell_cast) then
		if (shadow and not shadow.spell_cast) then
			shadow.spell_cast = {}
		end
	end
	
	--> refresh cc done
	if (este_jogador.cc_done) then
		if (shadow and not shadow.cc_done_targets) then
			shadow.cc_done = 0
			shadow.cc_done_targets = {}
			shadow.cc_done_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS)
		end
		_detalhes.refresh:r_container_habilidades (este_jogador.cc_done_spells, shadow and shadow.cc_done_spells)
	end	
	
	--> refresh interrupts
	if (este_jogador.interrupt_targets) then
		if (shadow and not shadow.interrupt_targets) then
			shadow.interrupt = 0
			shadow.interrupt_targets = {}
			shadow.interrupt_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS)
			shadow.interrompeu_oque = {}
		end
		_detalhes.refresh:r_container_habilidades (este_jogador.interrupt_spells, shadow and shadow.interrupt_spells)
	end
	
	--> refresh buff uptime
	if (este_jogador.buff_uptime_targets) then
		if (shadow and not shadow.buff_uptime_targets) then
			shadow.buff_uptime = 0
			shadow.buff_uptime_targets = {}
			shadow.buff_uptime_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS)
		end
		_detalhes.refresh:r_container_habilidades (este_jogador.buff_uptime_spells, shadow and shadow.buff_uptime_spells)
	end
	
	--> refresh buff uptime
	if (este_jogador.debuff_uptime_targets) then
		if (shadow and not shadow.debuff_uptime_targets) then
			shadow.debuff_uptime = 0
			if (este_jogador.boss_debuff) then
				shadow.debuff_uptime_targets = {}
				shadow.boss_debuff = true
				shadow.damage_twin = este_jogador.damage_twin
				shadow.spellschool = este_jogador.spellschool
				shadow.damage_spellid = este_jogador.damage_spellid
				shadow.debuff_uptime = 0
			else
				shadow.debuff_uptime_targets = {}
			end
			shadow.debuff_uptime_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS)
		end
		_detalhes.refresh:r_container_habilidades (este_jogador.debuff_uptime_spells, shadow and shadow.debuff_uptime_spells)
	end
	
	--> refresh cooldowns defensive
	if (este_jogador.cooldowns_defensive_targets) then
		if (shadow and not shadow.cooldowns_defensive_targets) then
			shadow.cooldowns_defensive = 0
			shadow.cooldowns_defensive_targets = {}
			shadow.cooldowns_defensive_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS)
		end
		_detalhes.refresh:r_container_habilidades (este_jogador.cooldowns_defensive_spells, shadow and shadow.cooldowns_defensive_spells)
	end
	
	--> refresh ressers
	if (este_jogador.ress_targets) then
		if (shadow and not shadow.ress_targets) then
			shadow.ress = 0
			shadow.ress_targets = {}
			shadow.ress_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS)
		end
		_detalhes.refresh:r_container_habilidades (este_jogador.ress_spells, shadow and shadow.ress_spells)
	end
	
	--> refresh dispells
	if (este_jogador.dispell_targets) then
		if (shadow and not shadow.dispell_targets) then
			shadow.dispell = 0
			shadow.dispell_targets = {}
			shadow.dispell_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) --> cria o container das habilidades usadas para interromper
			shadow.dispell_oque = {}
		end
		_detalhes.refresh:r_container_habilidades (este_jogador.dispell_spells, shadow and shadow.dispell_spells)
	end
	
	--> refresh cc_breaks
	if (este_jogador.cc_break_targets) then
		if (shadow and not shadow.cc_break) then
			shadow.cc_break = 0
			shadow.cc_break_targets = {}
			shadow.cc_break_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS)
			shadow.cc_break_oque = {}
		end
		_detalhes.refresh:r_container_habilidades (este_jogador.cc_break_spells, shadow and shadow.cc_break_spells)
	end
end

function _detalhes.clear:c_atributo_misc (este_jogador)

	este_jogador.__index = nil
	este_jogador.shadow = nil
	este_jogador.links = nil
	este_jogador.minha_barra = nil
	
	if (este_jogador.cc_done_targets) then
		_detalhes.clear:c_container_habilidades (este_jogador.cc_done_spells)
	end
	
	if (este_jogador.interrupt_targets) then
		_detalhes.clear:c_container_habilidades (este_jogador.interrupt_spells)
	end
	
	if (este_jogador.cooldowns_defensive_targets) then
		_detalhes.clear:c_container_habilidades (este_jogador.cooldowns_defensive_spells)
	end
	
	if (este_jogador.buff_uptime_targets) then
		_detalhes.clear:c_container_habilidades (este_jogador.buff_uptime_spells)
	end
	
	if (este_jogador.debuff_uptime_targets) then
		_detalhes.clear:c_container_habilidades (este_jogador.debuff_uptime_spells)
	end
	
	if (este_jogador.ress_targets) then
		_detalhes.clear:c_container_habilidades (este_jogador.ress_spells)
	end
	
	if (este_jogador.cc_break_targets) then
		_detalhes.clear:c_container_habilidades (este_jogador.cc_break_spells)
	end
	
	if (este_jogador.dispell_targets) then
		_detalhes.clear:c_container_habilidades (este_jogador.dispell_spells)
	end
	
end

atributo_misc.__add = function (tabela1, tabela2)

	if (tabela2.spell_cast) then
		for spellid, amount in _pairs (tabela2.spell_cast) do
			tabela1.spell_cast [spellid] = (tabela1.spell_cast [spellid] or 0) + amount
		end
	end

	if (tabela2.cc_done) then
		tabela1.cc_done = tabela1.cc_done + tabela2.cc_done
		
		for target_name, amount in _pairs (tabela2.cc_done_targets) do
			tabela1.cc_done_targets [target_name] = (tabela1.cc_done_targets [target_name] or 0) + amount
		end
		
		for spellid, habilidade in _pairs (tabela2.cc_done_spells._ActorTable) do 
			local habilidade_tabela1 = tabela1.cc_done_spells:PegaHabilidade (spellid, true, nil, false)
			
			for target_name, amount in _pairs (habilidade.targets) do
				habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) + amount
			end
			
			somar_keys (habilidade, habilidade_tabela1)
		end
	end

	if (tabela2.interrupt) then
	
		if (not tabela1.interrupt) then
			tabela1.interrupt = 0
			tabela1.interrupt_targets = {}
			tabela1.interrupt_spells = container_habilidades:NovoContainer (container_misc)
			tabela1.interrompeu_oque = {}
		end
	
		--> total de interrupts
			tabela1.interrupt = tabela1.interrupt + tabela2.interrupt
		--> soma o interrompeu o que
			for spellid, amount in _pairs (tabela2.interrompeu_oque) do 
				tabela1.interrompeu_oque [spellid] = (tabela1.interrompeu_oque [spellid] or 0) + amount
			end
		--> soma os containers de alvos
			for target_name, amount in _pairs (tabela2.interrupt_targets) do
				tabela1.interrupt_targets [target_name] = (tabela1.interrupt_targets [target_name] or 0) + amount
			end
		
		--> soma o container de habilidades
			for spellid, habilidade in _pairs (tabela2.interrupt_spells._ActorTable) do 
				local habilidade_tabela1 = tabela1.interrupt_spells:PegaHabilidade (spellid, true, nil, false)
				
				habilidade_tabela1.interrompeu_oque = habilidade_tabela1.interrompeu_oque or {}
				for _spellid, amount in _pairs (habilidade.interrompeu_oque) do
					habilidade_tabela1.interrompeu_oque [_spellid] = (habilidade_tabela1.interrompeu_oque [_spellid] or 0) + amount
				end
				
				for target_name, amount in _pairs (habilidade.targets) do
					habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) + amount
				end
				
				somar_keys (habilidade, habilidade_tabela1)
			end

	end
	
	if (tabela2.buff_uptime) then
		if (not tabela1.buff_uptime) then
			tabela1.buff_uptime = 0
			tabela1.buff_uptime_targets = {}
			tabela1.buff_uptime_spells = container_habilidades:NovoContainer (container_misc)
		end
	
		tabela1.buff_uptime = tabela1.buff_uptime + tabela2.buff_uptime
		
		for target_name, amount in _pairs (tabela2.buff_uptime_targets) do
			tabela1.buff_uptime_targets [target_name] = (tabela1.buff_uptime_targets [target_name] or 0) + amount
		end
		
		for spellid, habilidade in _pairs (tabela2.buff_uptime_spells._ActorTable) do 
			local habilidade_tabela1 = tabela1.buff_uptime_spells:PegaHabilidade (spellid, true, nil, false)

			for target_name, amount in _pairs (habilidade.targets) do
				habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) + amount
			end

			somar_keys (habilidade, habilidade_tabela1)
		end
	end
	
	if (tabela2.debuff_uptime) then
		if (not tabela1.debuff_uptime) then
			if (tabela2.boss_debuff) then
				tabela1.debuff_uptime_targets = {}
				tabela1.boss_debuff = true
				tabela1.damage_twin = tabela2.damage_twin
				tabela1.spellschool = tabela2.spellschool
				tabela1.damage_spellid = tabela2.damage_spellid
			else
				tabela1.debuff_uptime_targets = {}
			end
			
			tabela1.debuff_uptime = 0
			tabela1.debuff_uptime_spells = container_habilidades:NovoContainer (container_misc)
		end

		tabela1.debuff_uptime = tabela1.debuff_uptime + tabela2.debuff_uptime
		
		for target_name, amount in _pairs (tabela2.debuff_uptime_targets) do
			if (_type (amount) == "table") then --> boss debuff
				local t = tabela1.debuff_uptime_targets [target_name]
				if (not t) then
					tabela1.debuff_uptime_targets [target_name] = atributo_misc:CreateBuffTargetObject()
					t = tabela1.debuff_uptime_targets [target_name]
				end
				t.uptime = t.uptime + amount.uptime
				t.activedamt = t.activedamt + amount.activedamt
				t.refreshamt = t.refreshamt + amount.refreshamt
				t.appliedamt = t.appliedamt + amount.appliedamt
			else
				tabela1.debuff_uptime_targets [target_name] = (tabela1.debuff_uptime_targets [target_name] or 0) + amount
			end
		end
		
		for spellid, habilidade in _pairs (tabela2.debuff_uptime_spells._ActorTable) do 
			local habilidade_tabela1 = tabela1.debuff_uptime_spells:PegaHabilidade (spellid, true, nil, false)

			for target_name, amount in _pairs (habilidade.targets) do
				habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) + amount
			end
			
			somar_keys (habilidade, habilidade_tabela1)
		end	
	end
	
	if (tabela2.cooldowns_defensive) then
		if (not tabela1.cooldowns_defensive) then
			tabela1.cooldowns_defensive = 0
			tabela1.cooldowns_defensive_targets = {}
			tabela1.cooldowns_defensive_spells = container_habilidades:NovoContainer (container_misc)
		end
	
		tabela1.cooldowns_defensive = tabela1.cooldowns_defensive + tabela2.cooldowns_defensive
		
		for target_name, amount in _pairs (tabela2.cooldowns_defensive_targets) do 
			tabela1.cooldowns_defensive_targets [target_name] = (tabela1.cooldowns_defensive_targets [target_name] or 0) + amount
		end
		
		for spellid, habilidade in _pairs (tabela2.cooldowns_defensive_spells._ActorTable) do 
			local habilidade_tabela1 = tabela1.cooldowns_defensive_spells:PegaHabilidade (spellid, true, nil, false)

			for target_name, amount in _pairs (habilidade.targets) do 
				habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) + amount
			end
			
			somar_keys (habilidade, habilidade_tabela1)
		end	
	end
	
	if (tabela2.ress) then
		if (not tabela1.ress) then
			tabela1.ress = 0
			tabela1.ress_targets = {}
			tabela1.ress_spells = container_habilidades:NovoContainer (container_misc)
		end
	
		tabela1.ress = tabela1.ress + tabela2.ress
		
		for target_name, amount in _pairs (tabela2.ress_targets) do
			tabela1.ress_targets [target_name] = (tabela1.ress_targets [target_name] or 0) + amount
		end
		
		for spellid, habilidade in _pairs (tabela2.ress_spells._ActorTable) do 
			local habilidade_tabela1 = tabela1.ress_spells:PegaHabilidade (spellid, true, nil, false)
			
			for target_name, amount in _pairs (habilidade.targets) do 
				habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) + amount
			end
			
			somar_keys (habilidade, habilidade_tabela1)
		end
	end
	
	if (tabela2.dispell) then
	
		if (not tabela1.dispell) then
			tabela1.dispell = 0
			tabela1.dispell_targets = {}
			tabela1.dispell_spells = container_habilidades:NovoContainer (container_misc)
			tabela1.dispell_oque = {}
		end
	
		tabela1.dispell = tabela1.dispell + tabela2.dispell
		
		for target_name, amount in _pairs (tabela2.dispell_targets) do
			tabela1.dispell_targets [target_name] = (tabela1.dispell_targets [target_name] or 0) + amount
		end
		
		for spellid, habilidade in _pairs (tabela2.dispell_spells._ActorTable) do 
			local habilidade_tabela1 = tabela1.dispell_spells:PegaHabilidade (spellid, true, nil, false)
			
			habilidade_tabela1.dispell_oque = habilidade_tabela1.dispell_oque or {}

			for _spellid, amount in _pairs (habilidade.dispell_oque) do
				habilidade_tabela1.dispell_oque [_spellid] = (habilidade_tabela1.dispell_oque [_spellid] or 0) + amount
			end
			
			for target_name, amount in _pairs (habilidade.targets) do 
				habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) + amount
			end
			
			somar_keys (habilidade, habilidade_tabela1)
		end
		
		for spellid, amount in _pairs (tabela2.dispell_oque) do 
			tabela1.dispell_oque [spellid] = (tabela1.dispell_oque [spellid] or 0) + amount
		end
		
	end
	
	if (tabela2.cc_break) then
	
		if (not tabela1.cc_break) then
			tabela1.cc_break = 0
			tabela1.cc_break_targets = {}
			tabela1.cc_break_spells = container_habilidades:NovoContainer (container_misc)
			tabela1.cc_break_oque = {}
		end
	
		tabela1.cc_break = tabela1.cc_break + tabela2.cc_break
		
		for target_name, amount in _pairs (tabela2.cc_break_targets) do 
			tabela1.cc_break_targets [target_name] = (tabela1.cc_break_targets [target_name] or 0) + amount
		end
		
		for spellid, habilidade in _pairs (tabela2.cc_break_spells._ActorTable) do 
			local habilidade_tabela1 = tabela1.cc_break_spells:PegaHabilidade (spellid, true, nil, false)
			
			habilidade_tabela1.cc_break_oque = habilidade_tabela1.cc_break_oque or {}
			for _spellid, amount in _pairs (habilidade.cc_break_oque) do
				habilidade_tabela1.cc_break_oque [_spellid] = (habilidade_tabela1.cc_break_oque [_spellid] or 0) + amount
			end
			
			for target_name, amount in _pairs (habilidade.targets) do 
				habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) + amount
			end
			
			somar_keys (habilidade, habilidade_tabela1)
		end

		for spellid, amount in _pairs (tabela2.cc_break_oque) do
			tabela1.cc_break_oque [spellid] = (tabela1.cc_break_oque [spellid] or 0) + amount
		end
	end
	
	return tabela1
end

local subtrair_keys = function (habilidade, habilidade_tabela1)
	for key, value in _pairs (habilidade) do 
		if (_type (value) == "number") then
			if (key ~= "id" and key ~= "spellschool") then
				habilidade_tabela1 [key] = (habilidade_tabela1 [key] or 0) - value
			end
		end
	end
end

atributo_misc.__sub = function (tabela1, tabela2)

	if (tabela2.spell_cast) then
		for spellid, amount in _pairs (tabela2.spell_cast) do
			tabela1.spell_cast [spellid] = (tabela1.spell_cast [spellid] or 0) - amount
		end
	end

	if (tabela2.cc_done) then
		tabela1.cc_done = tabela1.cc_done - tabela2.cc_done
		
		for target_name, amount in _pairs (tabela2.cc_done_targets) do
			tabela1.cc_done_targets [target_name] = (tabela1.cc_done_targets [target_name] or 0) - amount
		end
		
		for spellid, habilidade in _pairs (tabela2.cc_done_spells._ActorTable) do 
			local habilidade_tabela1 = tabela1.cc_done_spells:PegaHabilidade (spellid, true, nil, false)
			
			for target_name, amount in _pairs (habilidade.targets) do
				habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) - amount
			end
			
			subtrair_keys (habilidade, habilidade_tabela1)
		end
	end

	if (tabela2.interrupt) then
		--> total de interrupts
			tabela1.interrupt = tabela1.interrupt - tabela2.interrupt
		--> soma o interrompeu o que
			for spellid, amount in _pairs (tabela2.interrompeu_oque) do 
				tabela1.interrompeu_oque [spellid] = (tabela1.interrompeu_oque [spellid] or 0) - amount
			end
		--> soma os containers de alvos
			for target_name, amount in _pairs (tabela2.interrupt_targets) do
				tabela1.interrupt_targets [target_name] = (tabela1.interrupt_targets [target_name] or 0) - amount
			end
		
		--> soma o container de habilidades
			for spellid, habilidade in _pairs (tabela2.interrupt_spells._ActorTable) do 
				local habilidade_tabela1 = tabela1.interrupt_spells:PegaHabilidade (spellid, true, nil, false)
				
				habilidade_tabela1.interrompeu_oque = habilidade_tabela1.interrompeu_oque or {}
				for _spellid, amount in _pairs (habilidade.interrompeu_oque) do
					habilidade_tabela1.interrompeu_oque [_spellid] = (habilidade_tabela1.interrompeu_oque [_spellid] or 0) - amount
				end
				
				for target_name, amount in _pairs (habilidade.targets) do
					habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) - amount
				end
				
				subtrair_keys (habilidade, habilidade_tabela1)
			end
	end
	
	if (tabela2.buff_uptime) then	
		tabela1.buff_uptime = tabela1.buff_uptime - tabela2.buff_uptime
		
		for target_name, amount in _pairs (tabela2.buff_uptime_targets) do
			tabela1.buff_uptime_targets [target_name] = (tabela1.buff_uptime_targets [target_name] or 0) - amount
		end
		
		for spellid, habilidade in _pairs (tabela2.buff_uptime_spells._ActorTable) do 
			local habilidade_tabela1 = tabela1.buff_uptime_spells:PegaHabilidade (spellid, true, nil, false)

			for target_name, amount in _pairs (habilidade.targets) do
				habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) - amount
			end

			subtrair_keys (habilidade, habilidade_tabela1)
		end		
	end
	
	if (tabela2.debuff_uptime) then	
		tabela1.debuff_uptime = tabela1.debuff_uptime - tabela2.debuff_uptime
		
		for target_name, amount in _pairs (tabela2.debuff_uptime_targets) do
			if (_type (amount) == "table") then --> boss debuff
				local t = tabela1.debuff_uptime_targets [target_name]
				if (not t) then
					tabela1.debuff_uptime_targets [target_name] = atributo_misc:CreateBuffTargetObject()
					t = tabela1.debuff_uptime_targets [target_name]
				end
				t.uptime = t.uptime - amount.uptime
				t.activedamt = t.activedamt - amount.activedamt
				t.refreshamt = t.refreshamt - amount.refreshamt
				t.appliedamt = t.appliedamt - amount.appliedamt
			else
				tabela2.debuff_uptime_targets [target_name] = (tabela2.debuff_uptime_targets [target_name] or 0) - amount
			end
		end
		
		for spellid, habilidade in _pairs (tabela2.debuff_uptime_spells._ActorTable) do 
			local habilidade_tabela1 = tabela1.debuff_uptime_spells:PegaHabilidade (spellid, true, nil, false)

			for target_name, amount in _pairs (habilidade.targets) do
				habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) - amount
			end
			
			subtrair_keys (habilidade, habilidade_tabela1)
		end	
	end
	
	if (tabela2.cooldowns_defensive) then	
		tabela1.cooldowns_defensive = tabela1.cooldowns_defensive - tabela2.cooldowns_defensive
		
		for target_name, amount in _pairs (tabela2.cooldowns_defensive_targets) do 
			tabela1.cooldowns_defensive_targets [target_name] = (tabela1.cooldowns_defensive_targets [target_name] or 0) - amount
		end
		
		for spellid, habilidade in _pairs (tabela2.cooldowns_defensive_spells._ActorTable) do 
			local habilidade_tabela1 = tabela1.cooldowns_defensive_spells:PegaHabilidade (spellid, true, nil, false)

			for target_name, amount in _pairs (habilidade.targets) do 
				habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) - amount
			end
			
			subtrair_keys (habilidade, habilidade_tabela1)
		end			
	end
	
	if (tabela2.ress) then
		tabela1.ress = tabela1.ress - tabela2.ress
		
		for target_name, amount in _pairs (tabela2.ress_targets) do
			tabela1.ress_targets [target_name] = (tabela1.ress_targets [target_name] or 0) - amount
		end
		
		for spellid, habilidade in _pairs (tabela2.ress_spells._ActorTable) do 
			local habilidade_tabela1 = tabela1.ress_spells:PegaHabilidade (spellid, true, nil, false)
			
			for target_name, amount in _pairs (habilidade.targets) do 
				habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) - amount
			end
			
			subtrair_keys (habilidade, habilidade_tabela1)
		end
	end
	
	if (tabela2.dispell) then
		tabela1.dispell = tabela1.dispell - tabela2.dispell
		
		for target_name, amount in _pairs (tabela2.dispell_targets) do
			tabela1.dispell_targets [target_name] = (tabela1.dispell_targets [target_name] or 0) - amount
		end
		
		for spellid, habilidade in _pairs (tabela2.dispell_spells._ActorTable) do 
			local habilidade_tabela1 = tabela1.dispell_spells:PegaHabilidade (spellid, true, nil, false)
			
			habilidade_tabela1.dispell_oque = habilidade_tabela1.dispell_oque or {}

			for _spellid, amount in _pairs (habilidade.dispell_oque) do
				habilidade_tabela1.dispell_oque [_spellid] = (habilidade_tabela1.dispell_oque [_spellid] or 0) - amount
			end
			
			for target_name, amount in _pairs (habilidade.targets) do 
				habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) - amount
			end
			
			subtrair_keys (habilidade, habilidade_tabela1)
		end
		
		for spellid, amount in _pairs (tabela2.dispell_oque) do 
			tabela1.dispell_oque [spellid] = (tabela1.dispell_oque [spellid] or 0) - amount
		end
	end
	
	if (tabela2.cc_break) then
	
		tabela1.cc_break = tabela1.cc_break - tabela2.cc_break
		
		for target_name, amount in _pairs (tabela2.cc_break_targets) do 
			tabela1.cc_break_targets [target_name] = (tabela1.cc_break_targets [target_name] or 0) - amount
		end
		
		for spellid, habilidade in _pairs (tabela2.cc_break_spells._ActorTable) do 
			local habilidade_tabela1 = tabela1.cc_break_spells:PegaHabilidade (spellid, true, nil, false)
			
			habilidade_tabela1.cc_break_oque = habilidade_tabela1.cc_break_oque or {}
			for _spellid, amount in _pairs (habilidade.cc_break_oque) do
				habilidade_tabela1.cc_break_oque [_spellid] = (habilidade_tabela1.cc_break_oque [_spellid] or 0) - amount
			end
			
			for target_name, amount in _pairs (habilidade.targets) do 
				habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) - amount
			end
			
			subtrair_keys (habilidade, habilidade_tabela1)
		end

		for spellid, amount in _pairs (tabela2.cc_break_oque) do
			tabela1.cc_break_oque [spellid] = (tabela1.cc_break_oque [spellid] or 0) - amount
		end
	end
	
	return tabela1
end
