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

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--local pointers
	local floor = math.floor --lua local
	local type = type --lua local
	local abs = math.abs --lua local
	local _math_min = math.min
	local _math_max = math.max
	local ipairs = ipairs --lua local
	local gump = Details.gump --details local

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--constants
	local end_window_spacement = 0

--settings
	local animation_speed = 33
	local animation_speed_hightravel_trigger = 5
	local animation_speed_hightravel_maxspeed = 3
	local animation_speed_lowtravel_minspeed = 0.33
	local animation_func_left
	local animation_func_right

	gump:NewColor("DETAILS_API_ICON", .5, .4, .3, 1)
	gump:NewColor("DETAILS_STATISTICS_ICON", .8, .8, .8, 1)

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--core

	function Details:AnimarSplit(barra, goal)
		barra.inicio = barra.split.barra:GetValue()
		barra.fim = goal
		barra.proximo_update = 0
		barra.tem_animacao = true
		barra:SetScript("OnUpdate", self.FazerAnimacaoSplit)
	end

	function Details:FazerAnimacaoSplit(elapsed)
		local velocidade = 0.8

		if (self.fim > self.inicio) then
			self.inicio = self.inicio+velocidade
			self.split.barra:SetValue(self.inicio)

			self.split.div:SetPoint("left", self.split.barra, "left", self.split.barra:GetValue()* (self.split.barra:GetWidth()/100) - 4, 0)

			if (self.inicio+1 >= self.fim) then
				self.tem_animacao = false
				self:SetScript("OnUpdate", nil)
			end
		else
			self.inicio = self.inicio-velocidade
			self.split.barra:SetValue(self.inicio)

			self.split.div:SetPoint("left", self.split.barra, "left", self.split.barra:GetValue()* (self.split.barra:GetWidth()/100) - 4, 0)

			if (self.inicio-1 <= self.fim) then
				self.tem_animacao = false
				self:SetScript("OnUpdate", nil)
			end
		end
		self.proximo_update = 0
	end

	function Details:PerformAnimations(amtLines)
		if (self.bars_sort_direction == 2) then
			for i = _math_min(self.rows_fit_in_window, amtLines) - 1, 1, -1 do
				local row = self.barras [i]
				local row_proxima = self.barras [i-1]

				if (row_proxima and not row.animacao_ignorar) then
					local v = row.statusbar.value
					local v_proxima = row_proxima.statusbar.value

					if (v_proxima > v) then
						if (row.animacao_fim >= v_proxima) then
							row:SetValue(v_proxima)
						else
							row:SetValue(row.animacao_fim)
							row_proxima.statusbar:SetValue(row.animacao_fim)
						end
					end
				end
			end

			for i = 1, self.rows_fit_in_window -1 do
				local row = self.barras [i]
				if (row.animacao_ignorar) then
					row.animacao_ignorar = nil
					if (row.tem_animacao) then
						row.tem_animacao = false
						row:SetScript("OnUpdate", nil)
					end
				else
					if (row.animacao_fim ~= row.animacao_fim2) then
						Details:AnimarBarra (row, row.animacao_fim)
						row.animacao_fim2 = row.animacao_fim
					end
				end
			end
		else
			for i = 2, self.rows_fit_in_window do
				local row = self.barras [i]
				local row_proxima = self.barras [i+1]

				if (row_proxima and not row.animacao_ignorar) then
					local v = row.statusbar.value
					local v_proxima = row_proxima.statusbar.value

					if (v_proxima > v) then
						if (row.animacao_fim >= v_proxima) then
							row:SetValue(v_proxima)
						else
							row:SetValue(row.animacao_fim)
							row_proxima.statusbar:SetValue(row.animacao_fim)
						end
					end
				end
			end

			for i = 2, self.rows_fit_in_window do
				local row = self.barras [i]
				if (row.animacao_ignorar) then
					row.animacao_ignorar = nil
					if (row.tem_animacao) then
						row.tem_animacao = false
						row:SetScript("OnUpdate", nil)
					end
				else
					if (row.animacao_fim ~= row.animacao_fim2) then
						Details:AnimarBarra (row, row.animacao_fim)
						row.animacao_fim2 = row.animacao_fim
					end
				end
			end
		end

	end

	--simple left and right animations by delta time
	local animation_left_simple = function(self, deltaTime)
		self.inicio = self.inicio - (animation_speed * deltaTime)
		self:SetValue(self.inicio)
		if (self.inicio-1 <= self.fim) then
			self.tem_animacao = false
			self:SetScript("OnUpdate", nil)
		end
	end

	local animation_right_simple = function(self, deltaTime)
		self.inicio = self.inicio + (animation_speed * deltaTime)
		self:SetValue(self.inicio)
		if (self.inicio+0.1 >= self.fim) then
			self.tem_animacao = false
			self:SetScript("OnUpdate", nil)
		end
	end

	--animation with acceleration
	local animation_left_with_accel = function(self, deltaTime)
		local distance = self.inicio - self.fim

		-- DefaultSpeed * max of ( min of (Distance / TriggerSpeed , MaxSpeed) , LowSpeed )
		local calcAnimationSpeed = animation_speed * _math_max (_math_min(distance/animation_speed_hightravel_trigger, animation_speed_hightravel_maxspeed), animation_speed_lowtravel_minspeed)

		self.inicio = self.inicio - (calcAnimationSpeed * deltaTime)
		self:SetValue(self.inicio)
		if (self.inicio-0.1 <= self.fim) then
			self.tem_animacao = false
			self:SetScript("OnUpdate", nil)
		end
	end

	local animation_right_with_accel = function(self, deltaTime)
		local distance = self.fim - self.inicio
		local calcAnimationSpeed = animation_speed * _math_max (_math_min(distance/animation_speed_hightravel_trigger, animation_speed_hightravel_maxspeed), animation_speed_lowtravel_minspeed)

		self.inicio = self.inicio + (calcAnimationSpeed * deltaTime)
		self:SetValue(self.inicio)
		if (self.inicio+0.1 >= self.fim) then
			self.tem_animacao = false
			self:SetScript("OnUpdate", nil)
		end
	end

	--initiate with defaults
	animation_func_left  = animation_left_simple
	animation_func_right = animation_right_simple

	function Details:AnimarBarra (esta_barra, fim)
		esta_barra.inicio = esta_barra.statusbar.value
		esta_barra.fim = fim
		esta_barra.tem_animacao = true

		if (esta_barra.fim > esta_barra.inicio) then
			esta_barra:SetScript("OnUpdate", animation_func_right)
		else
			esta_barra:SetScript("OnUpdate", animation_func_left)
		end
	end

	function Details:RefreshAnimationFunctions()
		if (Details.streamer_config.use_animation_accel) then
			animation_func_left  = animation_left_with_accel
			animation_func_right = animation_right_with_accel

		else
			animation_func_left  = animation_left_simple
			animation_func_right = animation_right_simple
		end

		animation_speed = Details.animation_speed
		animation_speed_hightravel_trigger = Details.animation_speed_triggertravel
		animation_speed_hightravel_maxspeed = Details.animation_speed_maxtravel
		animation_speed_lowtravel_minspeed = Details.animation_speed_mintravel
	end

	--deprecated
	function Details:FazerAnimacao_Esquerda (deltaTime)
		self.inicio = self.inicio - (animation_speed * deltaTime)
		self:SetValue(self.inicio)
		if (self.inicio-1 <= self.fim) then
			self.tem_animacao = false
			self:SetScript("OnUpdate", nil)
		end
	end

	function Details:FazerAnimacao_Direita (deltaTime)
		self.inicio = self.inicio + (animation_speed * deltaTime)
		self:SetValue(self.inicio)
		if (self.inicio+0.1 >= self.fim) then
			self.tem_animacao = false
			self:SetScript("OnUpdate", nil)
		end
	end

	function Details:AtualizaPontos()
		local _x, _y = self:GetPositionOnScreen()
		if (not _x) then
 			return
 		end

		local _w, _h = self:GetRealSize()

		local metade_largura = _w/2
		local metade_altura = _h/2

		local statusbar_y_mod = 0
		if (not self.show_statusbar) then
			statusbar_y_mod = 14 * self.baseframe:GetScale()
		end

		if (not self.ponto1) then
			self.ponto1 = {x = _x - metade_largura, y = _y + metade_altura + (statusbar_y_mod*-1)} --topleft
			self.ponto2 = {x = _x - metade_largura, y = _y - metade_altura + statusbar_y_mod} --bottomleft
			self.ponto3 = {x = _x + metade_largura, y = _y - metade_altura + statusbar_y_mod} --bottomright
			self.ponto4 = {x = _x + metade_largura, y = _y + metade_altura + (statusbar_y_mod*-1)} --topright
		else
			self.ponto1.x = _x - metade_largura
			self.ponto1.y = _y + metade_altura + (statusbar_y_mod*-1)
			self.ponto2.x = _x - metade_largura
			self.ponto2.y = _y - metade_altura + statusbar_y_mod
			self.ponto3.x = _x + metade_largura
			self.ponto3.y = _y - metade_altura + statusbar_y_mod
			self.ponto4.x = _x + metade_largura
			self.ponto4.y = _y + metade_altura + (statusbar_y_mod*-1)
		end

	end

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

	--LibWindow-1.1 by Mikk http://www.wowace.com/profiles/mikk/
	--this is the restore function from Libs\LibWindow-1.1\LibWindow-1.1.lua.
	--we can't schedule a new save after restoring, we save it inside the instance without frame references and always attach to UIparent.
	function Details:RestoreLibWindow()
		local frame = self.baseframe
		if (frame) then
			if (self.libwindow.x) then

				local x = self.libwindow.x
				local y = self.libwindow.y
				local point = self.libwindow.point
				local s = self.libwindow.scale

				if s then
					(frame.lw11origSetScale or frame.SetScale)(frame,s)
				else
					s = frame:GetScale()
				end

				if not x or not y then		-- nothing stored in config yet, smack it in the center
					x=0; y=0; point="CENTER"
				end

				x = x/s
				y = y/s

				frame:ClearAllPoints()
				if not point and y==0 then	-- errr why did i do this check again? must have been a reason, but i can't remember it =/
					point="CENTER"
				end

				--Details: using UIParent always in order to not break the positioning when using AddonSkin with ElvUI.
				if not point then	-- we have position, but no point, which probably means we're going from data stored by the addon itself before LibWindow was added to it. It was PROBABLY topleft->bottomleft anchored. Most do it that way.
					frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", x, y) --frame:SetPoint("TOPLEFT", frame:GetParent(), "BOTTOMLEFT", x, y)
					-- make it compute a better attachpoint (on next update)
					--_detalhes:ScheduleTimer("SaveLibWindow", 0.05, self)
					return
				end

				frame:SetPoint(point, UIParent, point, x, y)

			end
		end
	end

	--LibWindow-1.1 by Mikk http://www.wowace.com/profiles/mikk/
	--this is the save function from Libs\LibWindow-1.1\LibWindow-1.1.lua.
	--we need to make it save inside the instance object without frame references and also we must always use UIParent due to embed settings for ElvUI and LUI.

		function Details:SaveLibWindow()
			local frame = self.baseframe
			if (frame) then
				local left = frame:GetLeft()
				if (not left) then
					return Details:ScheduleTimer("SaveLibWindow", 0.05, self)
				end
					--Details: we are always using UIParent here or the addon break when using Embeds.
					local parent = UIParent --local parent = frame:GetParent() or nilParent
					-- No, this won't work very well with frames that aren't parented to nil or UIParent
					local s = frame:GetScale()
					local left,top = frame:GetLeft()*s, frame:GetTop()*s
					local right,bottom = frame:GetRight()*s, frame:GetBottom()*s
					local pwidth, pheight = parent:GetWidth(), parent:GetHeight()

					local x,y,point;
					if left < (pwidth-right) and left < abs((left+right)/2 - pwidth/2) then
						x = left;
						point="LEFT";
					elseif (pwidth-right) < abs((left+right)/2 - pwidth/2) then
						x = right-pwidth;
						point="RIGHT";
					else
						x = (left+right)/2 - pwidth/2;
						point="";
					end

					if bottom < (pheight-top) and bottom < abs((bottom+top)/2 - pheight/2) then
						y = bottom;
						point="BOTTOM"..point;
					elseif (pheight-top) < abs((bottom+top)/2 - pheight/2) then
						y = top-pheight;
						point="TOP"..point;
					else
						y = (bottom+top)/2 - pheight/2;
						-- point=""..point;
					end

					if point=="" then
						point = "CENTER"
					end

				----------------------------------------
				--save inside the instance object
				self.libwindow.x = x
				self.libwindow.y = y
				self.libwindow.point = point
				self.libwindow.scale = s
			end
		end

	--end for libwindow-1.1
--------------------------------------------------------------------------------------------------------

	function Details:SaveMainWindowSize()
		local baseframe_width = self.baseframe:GetWidth()
		if (not baseframe_width) then
			return Details:ScheduleTimer("SaveMainWindowSize", 1, self)
		end
		local baseframe_height = self.baseframe:GetHeight()

		--calc position
		local _x, _y = self:GetPositionOnScreen()
		if (not _x) then
 			return Details:ScheduleTimer("SaveMainWindowSize", 1, self)
 		end

		--save the position
		local _w = baseframe_width
		local _h = baseframe_height

		local mostrando = self.mostrando

		self.posicao[mostrando].x = _x
		self.posicao[mostrando].y = _y
		self.posicao[mostrando].w = _w
		self.posicao[mostrando].h = _h

		--update the 4 points for window groups
		local metade_largura = _w/2
		local metade_altura = _h/2

		local statusbar_y_mod = 0
		if (not self.show_statusbar) then
			statusbar_y_mod = 14 * self.baseframe:GetScale()
		end

		if (not self.ponto1) then
			self.ponto1 = {x = _x - metade_largura, y = _y + metade_altura + (statusbar_y_mod*-1)} --topleft
			self.ponto2 = {x = _x - metade_largura, y = _y - metade_altura + statusbar_y_mod} --bottomleft
			self.ponto3 = {x = _x + metade_largura, y = _y - metade_altura + statusbar_y_mod} --bottomright
			self.ponto4 = {x = _x + metade_largura, y = _y + metade_altura + (statusbar_y_mod*-1)} --topright
		else
			self.ponto1.x = _x - metade_largura
			self.ponto1.y = _y + metade_altura + (statusbar_y_mod*-1)
			self.ponto2.x = _x - metade_largura
			self.ponto2.y = _y - metade_altura + statusbar_y_mod
			self.ponto3.x = _x + metade_largura
			self.ponto3.y = _y - metade_altura + statusbar_y_mod
			self.ponto4.x = _x + metade_largura
			self.ponto4.y = _y + metade_altura + (statusbar_y_mod*-1)
		end

		self.baseframe.BoxBarrasAltura = self.baseframe:GetHeight() - end_window_spacement --espa�o para o final da janela

		return {altura = self.baseframe:GetHeight(), largura = self.baseframe:GetWidth(), x = _x, y = _y}
	end

	function Details:SaveMainWindowPosition (instance)
		if (instance) then
			self = instance
		end
		local mostrando = self.mostrando

		--get sizes
		local baseframe_width = self.baseframe:GetWidth()
		if (not baseframe_width) then
			return Details:ScheduleTimer("SaveMainWindowPosition", 1, self)
		end
		local baseframe_height = self.baseframe:GetHeight()

		--calc position
		local _x, _y = self:GetPositionOnScreen()
		if (not _x) then
 			return Details:ScheduleTimer("SaveMainWindowPosition", 1, self)
 		end

		if (self.mostrando ~= "solo") then
			self:SaveLibWindow()
		end

		--save the position
		local _w = baseframe_width
		local _h = baseframe_height

		self.posicao[mostrando].x = _x
		self.posicao[mostrando].y = _y
		self.posicao[mostrando].w = _w
		self.posicao[mostrando].h = _h

		--update the 4 points for window groups
		local metade_largura = _w/2
		local metade_altura = _h/2

		local statusbar_y_mod = 0
		if (not self.show_statusbar) then
			statusbar_y_mod = 14 * self.baseframe:GetScale()
		end

		if (not self.ponto1) then
			self.ponto1 = {x = _x - metade_largura, y = _y + metade_altura + (statusbar_y_mod*-1)} --topleft
			self.ponto2 = {x = _x - metade_largura, y = _y - metade_altura + statusbar_y_mod} --bottomleft
			self.ponto3 = {x = _x + metade_largura, y = _y - metade_altura + statusbar_y_mod} --bottomright
			self.ponto4 = {x = _x + metade_largura, y = _y + metade_altura + (statusbar_y_mod*-1)} --topright
		else
			self.ponto1.x = _x - metade_largura
			self.ponto1.y = _y + metade_altura + (statusbar_y_mod*-1)
			self.ponto2.x = _x - metade_largura
			self.ponto2.y = _y - metade_altura + statusbar_y_mod
			self.ponto3.x = _x + metade_largura
			self.ponto3.y = _y - metade_altura + statusbar_y_mod
			self.ponto4.x = _x + metade_largura
			self.ponto4.y = _y + metade_altura + (statusbar_y_mod*-1)
		end

		self.baseframe.BoxBarrasAltura = self.baseframe:GetHeight() - end_window_spacement --espa�o para o final da janela

		return {altura = self.baseframe:GetHeight(), largura = self.baseframe:GetWidth(), x = _x, y = _y}
	end

	function Details:RestoreMainWindowPosition (pre_defined)
		if (not pre_defined and self.libwindow.x and self.mostrando == "normal" and not Details.instances_no_libwindow) then
			local s = self.window_scale
			self.baseframe:SetScale(s)
			self.rowframe:SetScale(s)

			self.baseframe:SetWidth(self.posicao[self.mostrando].w)
			self.baseframe:SetHeight(self.posicao[self.mostrando].h)

			self:RestoreLibWindow()
			self.baseframe.BoxBarrasAltura = self.baseframe:GetHeight() - end_window_spacement --espa�o para o final da janela
			return
		end

		local s = self.window_scale
		self.baseframe:SetScale(s)
		self.rowframe:SetScale(s)

		local _scale = self.baseframe:GetEffectiveScale()
		local _UIscale = UIParent:GetScale()

		local novo_x = self.posicao[self.mostrando].x*_UIscale/_scale
		local novo_y = self.posicao[self.mostrando].y*_UIscale/_scale

		if (pre_defined and pre_defined.x) then --overwrite
			novo_x = pre_defined.x*_UIscale/_scale
			novo_y = pre_defined.y*_UIscale/_scale
			self.posicao[self.mostrando].w = pre_defined.largura
			self.posicao[self.mostrando].h = pre_defined.altura

		elseif (pre_defined and not pre_defined.x) then
			Details:Msg("invalid pre_defined table for resize, please rezise the window manually.")
		end

		self.baseframe:SetWidth(self.posicao[self.mostrando].w)
		self.baseframe:SetHeight(self.posicao[self.mostrando].h)

		self.baseframe:ClearAllPoints()
		self.baseframe:SetPoint("CENTER", UIParent, "CENTER", novo_x, novo_y)
	end

	function Details:RestoreMainWindowPositionNoResize (pre_defined, x, y)
		x = x or 0
		y = y or 0

		local _scale = self.baseframe:GetEffectiveScale()
		local _UIscale = UIParent:GetScale()

		local novo_x = self.posicao[self.mostrando].x*_UIscale/_scale
		local novo_y = self.posicao[self.mostrando].y*_UIscale/_scale

		if (pre_defined) then --overwrite
			novo_x = pre_defined.x*_UIscale/_scale
			novo_y = pre_defined.y*_UIscale/_scale
			self.posicao[self.mostrando].w = pre_defined.largura
			self.posicao[self.mostrando].h = pre_defined.altura
		end

		self.baseframe:ClearAllPoints()
		self.baseframe:SetPoint("CENTER", UIParent, "CENTER", novo_x + x, novo_y + y)
		self.baseframe.BoxBarrasAltura = self.baseframe:GetHeight() - end_window_spacement --espa�o para o final da janela
	end

	function Details:CreatePositionTable()
		local t = {pos_table = true}

		if (self.libwindow) then
			t.x = self.libwindow.x
			t.y = self.libwindow.y
			t.scale = self.libwindow.scale
			t.point = self.libwindow.point
		end

		--old way to save positions
		t.x_legacy = self.posicao.normal.x
		t.y_legacy = self.posicao.normal.y

		--size
		t.w = self.posicao.normal.w
		t.h = self.posicao.normal.h

		return t
	end

	function Details:RestorePositionFromPositionTable (t)
		if (not t.pos_table) then
			return
		end

		if (t.x) then
			self.libwindow.x = t.x
			self.libwindow.y = t.y
			self.libwindow.scale = t.scale
			self.libwindow.point = t.point
		end

		self.posicao.normal.x = t.x_legacy
		self.posicao.normal.y = t.y_legacy

		self.posicao.normal.w = t.w
		self.posicao.normal.h = t.h

		return self:RestoreMainWindowPosition()
	end

	function Details:ResetaGump (instancia, tipo, segmento)
		if (not instancia or type(instancia) == "boolean") then
			segmento = tipo
			tipo = instancia
			instancia = self
		end

		if (tipo and tipo == 0x1) then --entrando em combate
			if (instancia.segmento == -1) then --esta mostrando a tabela overall
				return
			end
		end

		if (segmento and instancia.segmento ~= segmento) then
			return
		end

		instancia.barraS = {nil, nil} --zera o iterator
		instancia.rows_showing = 0 --resetou, ent�o n�o esta mostranho nenhuma barra

		for i = 1, instancia.rows_created, 1 do --limpa a refer�ncia do que estava sendo mostrado na barra
			local esta_barra= instancia.barras[i]
			esta_barra.minha_tabela = nil
			esta_barra.animacao_fim = 0
			esta_barra.animacao_fim2 = 0
		end

		if (instancia.rolagem) then
			instancia:EsconderScrollBar() --hida a scrollbar
		end
		instancia.need_rolagem = false
		instancia.bar_mod = nil
	end

	function Details:ReajustaGump()
		if (self.mostrando == "normal") then --somente alterar o tamanho das barras se tiver mostrando o gump normal
			if (not self.baseframe.isStretching and self.stretchToo and #self.stretchToo > 0) then
				if (self.eh_horizontal or self.eh_tudo or (self.verticalSnap and not self.eh_vertical)) then
					for _, instancia in ipairs(self.stretchToo) do
						instancia.baseframe:SetWidth(self.baseframe:GetWidth())
						local mod = (self.baseframe:GetWidth() - instancia.baseframe._place.largura) / 2
						instancia:RestoreMainWindowPositionNoResize (instancia.baseframe._place, mod, nil)
						instancia:BaseFrameSnap()
					end
				end

				if ((self.eh_vertical or self.eh_tudo or not self.eh_horizontal) and (not self.verticalSnap or self.eh_vertical)) then
					for _, instancia in ipairs(self.stretchToo) do
						if (instancia.baseframe) then --esta criada
							instancia.baseframe:SetHeight(self.baseframe:GetHeight())
							local mod
							if (self.eh_vertical) then
								mod = (self.baseframe:GetHeight() - instancia.baseframe._place.altura) / 2
							else
								mod = - (self.baseframe:GetHeight() - instancia.baseframe._place.altura) / 2
							end
							instancia:RestoreMainWindowPositionNoResize (instancia.baseframe._place, nil, mod)
							instancia:BaseFrameSnap()
						end
					end
				end

			elseif (self.baseframe.isStretching and self.stretchToo and #self.stretchToo > 0) then
				if (self.baseframe.stretch_direction == "top") then
					for _, instancia in ipairs(self.stretchToo) do
						instancia.baseframe:SetHeight(self.baseframe:GetHeight())
						local mod = (self.baseframe:GetHeight() - (instancia.baseframe._place.altura or instancia.baseframe:GetHeight())) / 2
						instancia:RestoreMainWindowPositionNoResize (instancia.baseframe._place, nil, mod)
					end

				elseif (self.baseframe.stretch_direction == "bottom") then
					for _, instancia in ipairs(self.stretchToo) do
						instancia.baseframe:SetHeight(self.baseframe:GetHeight())
						local mod = (self.baseframe:GetHeight() - instancia.baseframe._place.altura) / 2
						mod = mod * -1
						instancia:RestoreMainWindowPositionNoResize (instancia.baseframe._place, nil, mod)
					end
				end
			end

			if (self.stretch_button_side == 2) then
				self:StretchButtonAnchor (2)
			end

			--reajusta o freeze
			if (self.freezed) then
				Details:Freeze (self)
			end

			-- -4 difere a precis�o de quando a barra ser� adicionada ou apagada da barra
			self.baseframe.BoxBarrasAltura = (self.baseframe:GetHeight()) - end_window_spacement

			local T = self.rows_fit_in_window
			if (not T) then --primeira vez que o gump esta sendo reajustado
				T = floor(self.baseframe.BoxBarrasAltura / self.row_height)
			end

			--reajustar o local do rel�gio
			local meio = self.baseframe:GetWidth() / 2
			local novo_local = meio - 25

			self.rows_fit_in_window = floor( self.baseframe.BoxBarrasAltura / self.row_height)

			--verifica se precisa criar mais barras
			if (self.rows_fit_in_window > #self.barras) then--verifica se precisa criar mais barras
				for i  = #self.barras+1, self.rows_fit_in_window, 1 do
					gump:CreateNewLine(self, i) --cria nova barra
				end
				self.rows_created = #self.barras
			end

			--faz um cache do tamanho das barras
			self.cached_bar_width = self.barras[1] and self.barras[1]:GetWidth() or 0

			--seta a largura das barras
			if (self.bar_mod and self.bar_mod ~= 0) then
				for index = 1, self.rows_fit_in_window do
					self.barras [index]:SetWidth(self.baseframe:GetWidth()+self.bar_mod)
				end
			else
				for index = 1, self.rows_fit_in_window do
					self.barras [index]:SetWidth(self.baseframe:GetWidth()+self.row_info.space.right)
				end
			end

			--verifica se precisa esconder ou mostrar alguma barra
			local A = self.barraS[1]
			if (not A) then --primeira vez que o resize esta sendo usado, no caso no startup do addon ou ao criar uma nova inst�ncia
				--hida as barras n�o usadas
				for i = 1, self.rows_created, 1 do
					Details.FadeHandler.Fader(self.barras [i], 1)
					self.barras [i].on = false
				end
				return
			end

			local X = self.rows_showing
			local C = self.rows_fit_in_window

			--novo iterator
			local barras_diff = C - T --aqui pega a quantidade de barras, se aumentou ou diminuiu
			if (barras_diff > 0) then --ganhou barras_diff novas barras
				local fim_iterator = self.barraS[2] --posi��o atual
				fim_iterator = fim_iterator+barras_diff --nova posi��o
				local excedeu_iterator = fim_iterator - X --total que ta sendo mostrado - fim do iterator

				if (excedeu_iterator > 0) then --extrapolou
					fim_iterator = X --seta o fim do iterator pra ser na ultima barra
					self.barraS[2] = fim_iterator --fim do iterator setado

					local inicio_iterator = self.barraS[1]
					if (inicio_iterator-excedeu_iterator > 0) then --se as barras que sobraram preenchem o inicio do iterator
						inicio_iterator = inicio_iterator-excedeu_iterator --pega o novo valor do iterator
						self.barraS[1] = inicio_iterator
					else
						self.barraS[1] = 1 --se ganhou mais barras pra cima, ignorar elas e mover o iterator para a poci��o inicial
					end
				else
					--se n�o extrapolou esta okey e esta mostrando a quantidade de barras correta
					self.barraS[2] = fim_iterator
				end

				for index = T+1, C do
					local barra = self.barras[index]
					if (barra) then
						if (index <= X) then
							--Details.FadeHandler.Fader(barra, 0)
							Details.FadeHandler.Fader(barra, "out")
						else
							--if (self.baseframe.isStretching or self.auto_resize) then
								Details.FadeHandler.Fader(barra, 1)
							--else
							--	Details.FadeHandler.Fader(barra, 1)
							--end
						end
					end
				end

			elseif (barras_diff < 0) then --perdeu barras_diff barras
				local fim_iterator = self.barraS[2] --posi��o atual
				if (not (fim_iterator == X and fim_iterator < C)) then --calcula primeiro as barras que foram perdidas s�o barras que n�o estavam sendo usadas
					--perdi X barras, diminui X posi��es no iterator
					local perdeu = abs(barras_diff)

					if (fim_iterator == X) then --se o iterator tiver na ultima posi��o
						perdeu = perdeu - (C - X)
					end

					fim_iterator = fim_iterator - perdeu

					if (fim_iterator < C) then
						fim_iterator = C
					end

					self.barraS[2] = fim_iterator

					for index = T, C+1, -1 do
						local barra = self.barras[index]
						if (barra) then
							if (self.baseframe.isStretching or self.auto_resize) then
								Details.FadeHandler.Fader(barra, 1)
							else
								--Details.FadeHandler.Fader(barra, "in", 0.1)
								Details.FadeHandler.Fader(barra, 1)
							end
						end
					end
				end
			end

			if (X <= C) then --desligar a rolagem
				if (self.rolagem and not self.baseframe.isStretching) then
					self:EsconderScrollBar()
				end
				self.need_rolagem = false

			else --ligar ou atualizar a rolagem
				if (not self.rolagem and not self.baseframe.isStretching) then
					self:MostrarScrollBar()
				end
				self.need_rolagem = true
			end

			--verificar o tamanho dos nomes
			local whichRowLine = 1
			for i = self.barraS[1], self.barraS[2], 1 do
				local esta_barra = self.barras [whichRowLine]
				local tabela = esta_barra.minha_tabela

				if (tabela) then --a barra esta mostrando alguma coisa
					if (tabela._custom) then
						tabela (esta_barra, self)
					elseif (tabela._refresh_window) then
						tabela:_refresh_window (esta_barra, self)
					else
						tabela:RefreshBarra(esta_barra, self, true)
					end
				end

				whichRowLine = whichRowLine+1
			end

			--for�a o pr�ximo refresh
			self.showing[self.atributo].need_refresh = true
		end
	end

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--panels

--cooltip presets
	local preset3_backdrop = {bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]], edgeFile = [[Interface\AddOns\Details\images\border_3]], tile=true,
	edgeSize = 16, tileSize = 64, insets = {left = 3, right = 3, top = 4, bottom = 4}}

	Details.cooltip_preset3_backdrop = preset3_backdrop

	local white_table = {1, 1, 1, 1}
	local black_table = {0, 0, 0, 1}
	local gray_table = {0.37, 0.37, 0.37, 0.95}

	local preset2_backdrop = {bgFile = [[Interface\AddOns\Details\images\background]], edgeFile = [[Interface\Buttons\WHITE8X8]], tile=true,
	edgeSize = 1, tileSize = 64, insets = {left = 0, right = 0, top = 0, bottom = 0}}
	Details.cooltip_preset2_backdrop = preset2_backdrop

	--"Details BarBorder 3"
	function Details:CooltipPreset(preset)
		local GameCooltip = GameCooltip

		GameCooltip:Reset()

		if (preset == 1) then
			GameCooltip:SetOption("TextFont", "Friz Quadrata TT")
			GameCooltip:SetOption("TextColor", "orange")
			GameCooltip:SetOption("TextSize", 12)
			GameCooltip:SetOption("ButtonsYMod", -4)
			GameCooltip:SetOption("YSpacingMod", -4)
			GameCooltip:SetOption("IgnoreButtonAutoHeight", true)
			GameCooltip:SetColor (1, 0.5, 0.5, 0.5, 0.5)

		elseif (preset == 2) then
			GameCooltip:SetOption("TextFont", "Friz Quadrata TT")
			GameCooltip:SetOption("TextColor", "orange")
			GameCooltip:SetOption("TextSize", 12)
			GameCooltip:SetOption("FixedWidth", 220)
			GameCooltip:SetOption("ButtonsYMod", -4)
			GameCooltip:SetOption("YSpacingMod", -4)
			GameCooltip:SetOption("IgnoreButtonAutoHeight", true)
			GameCooltip:SetColor (1, 0, 0, 0, 0)

			GameCooltip:SetOption("LeftBorderSize", -5)
			GameCooltip:SetOption("RightBorderSize", 5)

			GameCooltip:SetBackdrop(1, preset2_backdrop, gray_table, black_table)

		elseif (preset == 2.1) then
			GameCooltip:SetOption("TextFont", "Friz Quadrata TT")
			GameCooltip:SetOption("TextColor", "orange")
			GameCooltip:SetOption("TextSize", 10)
			GameCooltip:SetOption("FixedWidth", 220)
			GameCooltip:SetOption("ButtonsYMod", 0)
			GameCooltip:SetOption("YSpacingMod", -4)
			GameCooltip:SetOption("IgnoreButtonAutoHeight", true)
			GameCooltip:SetColor (1, 0, 0, 0, 0)

			GameCooltip:SetBackdrop(1, preset2_backdrop, gray_table, black_table)

		elseif (preset == 3) then
			GameCooltip:SetOption("TextFont", "Friz Quadrata TT")
			GameCooltip:SetOption("TextColor", "orange")
			GameCooltip:SetOption("TextSize", 12)
			GameCooltip:SetOption("FixedWidth", 220)
			GameCooltip:SetOption("ButtonsYMod", -4)
			GameCooltip:SetOption("YSpacingMod", -4)
			GameCooltip:SetOption("IgnoreButtonAutoHeight", true)
			GameCooltip:SetColor (1, 0.5, 0.5, 0.5, 0.5)

			GameCooltip:SetBackdrop(1, preset3_backdrop, nil, white_table)
		end
	end

--yes no panel

	do
		Details.yesNo = Details.gump:NewPanel(UIParent, _, "DetailsYesNoWindow", _, 500, 80)
		Details.yesNo:SetPoint("center", UIParent, "center")
		Details.gump:NewLabel(Details.yesNo, _, "$parentAsk", "ask", "")
		Details.yesNo ["ask"]:SetPoint("center", Details.yesNo, "center", 0, 25)
		Details.yesNo ["ask"]:SetWidth(480)
		Details.yesNo ["ask"]:SetJustifyH("center")
		Details.yesNo ["ask"]:SetHeight(22)
		Details.gump:NewButton(Details.yesNo, _, "$parentNo", "no", 100, 30, function() Details.yesNo:Hide() end, nil, nil, nil, Loc ["STRING_NO"])
		Details.gump:NewButton(Details.yesNo, _, "$parentYes", "yes", 100, 30, nil, nil, nil, nil, Loc ["STRING_YES"])
		Details.yesNo ["no"]:SetPoint(10, -45)
		Details.yesNo ["yes"]:SetPoint(390, -45)
		Details.yesNo ["no"]:InstallCustomTexture()
		Details.yesNo ["yes"]:InstallCustomTexture()
		Details.yesNo ["yes"]:SetHook("OnMouseUp", function() Details.yesNo:Hide() end)
		function Details:Ask (msg, func, ...)
			Details.yesNo ["ask"].text = msg
			local p1, p2 = ...
			Details.yesNo ["yes"]:SetClickFunction(func, p1, p2)
			Details.yesNo:Show()
		end
		Details.yesNo:Hide()
	end

--cria o frame de wait for plugin
	function Details:CreateWaitForPlugin()
		local WaitForPluginFrame = CreateFrame("frame", "DetailsWaitForPluginFrame" .. self.meu_id, UIParent,"BackdropTemplate")
		local WaitTexture = WaitForPluginFrame:CreateTexture(nil, "overlay")
		WaitTexture:SetTexture("Interface\\CHARACTERFRAME\\Disconnect-Icon")
		WaitTexture:SetWidth(64/2)
		WaitTexture:SetHeight(64/2)
		--WaitTexture:SetDesaturated(true)
		--WaitTexture:SetVertexColor(1, 1, 1, 0.3)
		WaitForPluginFrame.wheel = WaitTexture
		local RotateAnimGroup = WaitForPluginFrame:CreateAnimationGroup()
		local rotate = RotateAnimGroup:CreateAnimation("Alpha")
		--rotate:SetDegrees(360)
		--rotate:SetDuration(5)
		rotate:SetFromAlpha(0.8)
		rotate:SetToAlpha(1)
		--RotateAnimGroup:SetLooping ("repeat")
		rotate:SetTarget(WaitTexture)

		local bgpanel = gump:NewPanel(WaitForPluginFrame, WaitForPluginFrame, "DetailsWaitFrameBG"..self.meu_id, nil, 120, 30, false, false, false)
		bgpanel:SetPoint("center", WaitForPluginFrame, "center")
		bgpanel:SetBackdrop({bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background"})
		bgpanel:SetBackdropColor(.2, .2, .2, 1)

		local label = gump:NewLabel(bgpanel, bgpanel, nil, nil, Loc ["STRING_WAITPLUGIN"])
		label.color = "white"
		label:SetPoint("center", WaitForPluginFrame, "center")
		label:SetJustifyH("left")
		label:Hide()
		WaitTexture:SetPoint("right", label.widget, "topleft", 12, -7)

		WaitForPluginFrame:Hide()
		self.wait_for_plugin_created = true

		function self:WaitForPlugin()
			self:ChangeIcon ([[Interface\GossipFrame\ActiveQuestIcon]])

			--if (WaitForPluginFrame:IsShown() and WaitForPluginFrame:GetParent() == self.baseframe) then
			--	self.waiting_pid = self:ScheduleTimer("ExecDelayedPlugin1", 5, self)
			--end

			WaitForPluginFrame:SetParent(self.baseframe)
			WaitForPluginFrame:SetAllPoints(self.baseframe)
			bgpanel:ClearAllPoints()
			bgpanel:SetPoint("topleft", self.baseframe, 0, 0)
			bgpanel:SetPoint("bottomright", self.baseframe, 0, 0)

			--local size = math.max(self.baseframe:GetHeight()* 0.35, 100)
			--WaitForPluginFrame.wheel:SetWidth(size)
			--WaitForPluginFrame.wheel:SetHeight(size)
			WaitForPluginFrame:Show()
			label:Show()
			bgpanel:Show()
			RotateAnimGroup:Play()

			self.waiting_raid_plugin = true

			self.waiting_pid = self:ScheduleTimer("ExecDelayedPlugin1", 5, self)
		end

		function self:CancelWaitForPlugin()
			RotateAnimGroup:Stop()
			WaitForPluginFrame:Hide()
			label:Hide()
			bgpanel:Hide()
		end

		function self:ExecDelayedPlugin1()

			self.waiting_raid_plugin = nil
			self.waiting_pid = nil

			RotateAnimGroup:Stop()
			WaitForPluginFrame:Hide()
			label:Hide()
			bgpanel:Hide()

			if (self.meu_id == Details.solo) then
				Details.SoloTables:switch(nil, Details.SoloTables.Mode)

			elseif (self.modo == Details._detalhes_props["MODO_RAID"]) then
				Details.RaidTables:EnableRaidMode (self)

			end
		end
	end

	do
		local WaitForPluginFrame = CreateFrame("frame", "DetailsWaitForPluginFrame", UIParent,"BackdropTemplate")
		local WaitTexture = WaitForPluginFrame:CreateTexture(nil, "overlay")
		WaitTexture:SetTexture("Interface\\UNITPOWERBARALT\\Mechanical_Circular_Frame")
		WaitTexture:SetPoint("center", WaitForPluginFrame)
		WaitTexture:SetWidth(180)
		WaitTexture:SetHeight(180)
		WaitForPluginFrame.wheel = WaitTexture
		local RotateAnimGroup = WaitForPluginFrame:CreateAnimationGroup()
		local rotate = RotateAnimGroup:CreateAnimation("Rotation")
		rotate:SetDegrees(360)
		rotate:SetDuration(60)
		RotateAnimGroup:SetLooping ("repeat")

		local bgpanel = gump:NewPanel(UIParent, UIParent, "DetailsWaitFrameBG", nil, 120, 30, false, false, false)
		bgpanel:SetPoint("center", WaitForPluginFrame, "center")
		bgpanel:SetBackdrop({bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background"})
		bgpanel:SetBackdropColor(.2, .2, .2, 1)

		local label = gump:NewLabel(UIParent, UIParent, nil, nil, Loc ["STRING_WAITPLUGIN"]) --localize-me
		label.color = "silver"
		label:SetPoint("center", WaitForPluginFrame, "center")
		label:SetJustifyH("center")
		label:Hide()

		WaitForPluginFrame:Hide()

		function Details:WaitForSoloPlugin(instancia)
			instancia:ChangeIcon ([[Interface\GossipFrame\ActiveQuestIcon]])

			if (WaitForPluginFrame:IsShown() and WaitForPluginFrame:GetParent() == instancia.baseframe) then
				return Details:ScheduleTimer("ExecDelayedPlugin", 5, instancia)
			end

			WaitForPluginFrame:SetParent(instancia.baseframe)
			WaitForPluginFrame:SetAllPoints(instancia.baseframe)
			local size = math.max(instancia.baseframe:GetHeight()* 0.35, 100)
			WaitForPluginFrame.wheel:SetWidth(size)
			WaitForPluginFrame.wheel:SetHeight(size)
			WaitForPluginFrame:Show()
			label:Show()
			bgpanel:Show()
			RotateAnimGroup:Play()

			return Details:ScheduleTimer("ExecDelayedPlugin", 5, instancia)
		end

		function Details:CancelWaitForPlugin()
			RotateAnimGroup:Stop()
			WaitForPluginFrame:Hide()
			label:Hide()
			bgpanel:Hide()
		end

		function Details:ExecDelayedPlugin(instancia)
			RotateAnimGroup:Stop()
			WaitForPluginFrame:Hide()
			label:Hide()
			bgpanel:Hide()

			if (instancia.meu_id == Details.solo) then
				Details.SoloTables:switch(nil, Details.SoloTables.Mode)

			elseif (instancia.meu_id == Details.raid) then
				Details.RaidTables:switch(nil, Details.RaidTables.Mode)

			end
		end
	end

--feedback window
	function Details:OpenFeedbackWindow()
		if (not _G.DetailsFeedbackPanel) then

			gump:CreateSimplePanel(UIParent, 340, 300, Loc ["STRING_FEEDBACK_SEND_FEEDBACK"], "DetailsFeedbackPanel")
			local panel = _G.DetailsFeedbackPanel

			local label = gump:CreateLabel(panel, Loc ["STRING_FEEDBACK_PREFERED_SITE"])
			label:SetPoint("topleft", panel, "topleft", 15, -60)

			local wowi = gump:NewImage(panel, [[Interface\AddOns\Details\images\icons2]], 101, 34, "artwork", {0/512, 101/512, 163/512, 200/512})
			local curse = gump:NewImage(panel, [[Interface\AddOns\Details\images\icons2]], 101, 34, "artwork", {0/512, 101/512, 201/512, 242/512})
			local mmoc = gump:NewImage(panel, [[Interface\AddOns\Details\images\icons2]], 101, 34, "artwork", {0/512, 101/512, 243/512, 285/512})
			wowi:SetDesaturated(true)
			curse:SetDesaturated(true)
			mmoc:SetDesaturated(true)

			wowi:SetPoint("topleft", panel, "topleft", 17, -100)
			curse:SetPoint("topleft", panel, "topleft", 17, -160)
			mmoc:SetPoint("topleft", panel, "topleft", 17, -220)

			local wowi_title = gump:CreateLabel(panel, "Wow Interface:", nil, nil, "GameFontNormal")
			local wowi_desc = gump:CreateLabel(panel, Loc ["STRING_FEEDBACK_WOWI_DESC"], nil, "silver")
			wowi_desc:SetWidth(202)

			wowi_title:SetPoint("topleft", wowi, "topright", 5, 0)
			wowi_desc:SetPoint("topleft", wowi_title, "bottomleft", 0, -1)
			--
			local curse_title = gump:CreateLabel(panel, "Curse:", nil, nil, "GameFontNormal")
			local curse_desc = gump:CreateLabel(panel, Loc ["STRING_FEEDBACK_CURSE_DESC"], nil, "silver")
			curse_desc:SetWidth(202)

			curse_title:SetPoint("topleft", curse, "topright", 5, 0)
			curse_desc:SetPoint("topleft", curse_title, "bottomleft", 0, -1)
			--
			local mmoc_title = gump:CreateLabel(panel, "MMO-Champion:", nil, nil, "GameFontNormal")
			local mmoc_desc = gump:CreateLabel(panel, Loc ["STRING_FEEDBACK_MMOC_DESC"], nil, "silver")
			mmoc_desc:SetWidth(202)

			mmoc_title:SetPoint("topleft", mmoc, "topright", 5, 0)
			mmoc_desc:SetPoint("topleft", mmoc_title, "bottomleft", 0, -1)

			local on_enter = function(self, capsule)
				capsule.image:SetDesaturated(false)
			end
			local on_leave = function(self, capsule)
				capsule.image:SetDesaturated(true)
			end

			local on_click = function(_, _, website)
				if (website == 1) then
					Details:CopyPaste ([[http://www.wowinterface.com/downloads/addcomment.php?action=addcomment&fileid=23056]])

				elseif (website == 2) then
					Details:CopyPaste ([[http://www.curse.com/addons/wow/details]])

				elseif (website == 3) then
					Details:CopyPaste ([[http://www.mmo-champion.com/threads/1480721-New-damage-meter-%28Details!%29-need-help-with-tests-and-feedbacks]])

				end
			end

			local wowi_button = gump:CreateButton(panel, on_click, 103, 34, "", 1)
			wowi_button:SetPoint("topleft", wowi, "topleft", -1, 0)
			wowi_button:InstallCustomTexture (nil, nil, nil, nil, true)
			wowi_button.image = wowi
			wowi_button:SetHook("OnEnter", on_enter)
			wowi_button:SetHook("OnLeave", on_leave)

			local curse_button = gump:CreateButton(panel, on_click, 103, 34, "", 2)
			curse_button:SetPoint("topleft", curse, "topleft", -1, 0)
			curse_button:InstallCustomTexture (nil, nil, nil, nil, true)
			curse_button.image = curse
			curse_button:SetHook("OnEnter", on_enter)
			curse_button:SetHook("OnLeave", on_leave)

			local mmoc_button = gump:CreateButton(panel, on_click, 103, 34, "", 3)
			mmoc_button:SetPoint("topleft", mmoc, "topleft", -1, 0)
			mmoc_button:InstallCustomTexture (nil, nil, nil, nil, true)
			mmoc_button.image = mmoc
			mmoc_button:SetHook("OnEnter", on_enter)
			mmoc_button:SetHook("OnLeave", on_leave)

		end

		_G.DetailsFeedbackPanel:Show()
	end

	--interface menu
	local f = CreateFrame("frame", "DetailsInterfaceOptionsPanel", UIParent,"BackdropTemplate")
	f.name = "Details"
	f.logo = f:CreateTexture(nil, "overlay")
	f.logo:SetPoint("center", f, "center", 0, 0)
	f.logo:SetPoint("top", f, "top", 25, 56)
	f.logo:SetTexture([[Interface\AddOns\Details\images\logotipo]])
	f.logo:SetSize(256, 128)
	--InterfaceOptions_AddCategory (f)

	--open options panel
	f.options_button = CreateFrame("button", nil, f)
	f.options_button:SetText(Loc ["STRING_INTERFACE_OPENOPTIONS"])
	f.options_button:SetPoint("topleft", f, "topleft", 10, -100)
	f.options_button:SetHeight(170)
	f.options_button:SetWidth(170)
	f.options_button:SetScript("OnClick", function(self)
		local lower_instance = Details:GetLowerInstanceNumber()
		if (not lower_instance) then
			--no window opened?
			local instance1 = Details.tabela_instancias [1]
			if (instance1) then
				instance1:Enable()
				return Details:OpenOptionsWindow (instance1)
			else
				instance1 = Details:CriarInstancia(_, true)
				if (instance1) then
					return Details:OpenOptionsWindow (instance1)
				else
					Details:Msg("couldn't open options panel: no window available.")
				end
			end
		end
		Details:OpenOptionsWindow (Details:GetInstance(lower_instance))
	end)

	--create new window
	f.new_window_button = CreateFrame("button", nil, f)
	f.new_window_button:SetText(Loc ["STRING_MINIMAPMENU_NEWWINDOW"])
	f.new_window_button:SetPoint("topleft", f, "topleft", 10, -125)
	f.new_window_button:SetWidth(170)
	f.new_window_button:SetScript("OnClick", function(self)
		Details:CriarInstancia(_, true)
	end)


--update details version window
	function Details:OpenUpdateWindow()

		if (not _G.DetailsUpdateDialog) then
			local updatewindow_frame = CreateFrame("frame", "DetailsUpdateDialog", UIParent, "ButtonFrameTemplate")
			updatewindow_frame:SetFrameStrata("LOW")
			tinsert(UISpecialFrames, "DetailsUpdateDialog")
			updatewindow_frame:SetPoint("center", UIParent, "center")
			updatewindow_frame:SetSize(512, 200)
			--updatewindow_frame.portrait:SetTexture([[Interface\CHARACTERFRAME\TEMPORARYPORTRAIT-FEMALE-GNOME]])

			--updatewindow_frame.TitleText:SetText("A New Version Is Available!") --10.0 fuck

			updatewindow_frame.midtext = updatewindow_frame:CreateFontString(nil, "artwork", "GameFontNormal")
			updatewindow_frame.midtext:SetText("Good news everyone!\nA new version has been forged and is waiting to be looted.")
			updatewindow_frame.midtext:SetPoint("topleft", updatewindow_frame, "topleft", 10, -90)
			updatewindow_frame.midtext:SetJustifyH("center")
			updatewindow_frame.midtext:SetWidth(370)

			updatewindow_frame.gnoma = updatewindow_frame:CreateTexture(nil, "artwork")
			updatewindow_frame.gnoma:SetPoint("topright", updatewindow_frame, "topright", -3, -59)
			updatewindow_frame.gnoma:SetTexture("Interface\\AddOns\\Details\\images\\icons2")
			updatewindow_frame.gnoma:SetSize(105*1.05, 107*1.05)
			updatewindow_frame.gnoma:SetTexCoord(0.2021484375, 0, 0.7919921875, 1)

			local editbox = Details.gump:NewTextEntry(updatewindow_frame, nil, "$parentTextEntry", "text", 387, 14)
			editbox:SetPoint(20, -136)
			editbox:SetAutoFocus(false)
			editbox:SetHook("OnEditFocusGained", function()
				editbox.text = "http://www.curse.com/addons/wow/details"
				editbox:HighlightText()
			end)
			editbox:SetHook("OnEditFocusLost", function()
				editbox.text = "http://www.curse.com/addons/wow/details"
				editbox:HighlightText()
			end)
			editbox:SetHook("OnChar", function()
				editbox.text = "http://www.curse.com/addons/wow/details"
				editbox:HighlightText()
			end)
			editbox.text = "http://www.curse.com/addons/wow/details"

			updatewindow_frame.close = CreateFrame("Button", "DetailsUpdateDialogCloseButton", updatewindow_frame)
			updatewindow_frame.close:SetPoint("bottomleft", updatewindow_frame, "bottomleft", 8, 4)
			updatewindow_frame.close:SetText("Close")

			updatewindow_frame.close:SetScript("OnClick", function(self)
				DetailsUpdateDialog:Hide()
				editbox:ClearFocus()
			end)

			updatewindow_frame:SetScript("OnHide", function()
				editbox:ClearFocus()
			end)

			function Details:UpdateDialogSetFocus()
				DetailsUpdateDialog:Show()
				DetailsUpdateDialogTextEntry.MyObject:SetFocus()
				DetailsUpdateDialogTextEntry.MyObject:HighlightText()
			end
			Details:ScheduleTimer("UpdateDialogSetFocus", 1)
		end
	end



--minimap icon and hotcorner
	function Details:RegisterMinimap()
		local LDB = LibStub("LibDataBroker-1.1", true)
		local LDBIcon = LDB and LibStub("LibDBIcon-1.0", true)

		if LDB then
			local databroker = LDB:NewDataObject ("Details", {
				type = "data source",
				icon = [[Interface\AddOns\Details\images\minimap]],
				text = "0",

				HotCornerIgnore = true,

				OnClick = function(self, button)
					if (button == "LeftButton") then
						if (IsControlKeyDown()) then
							Details:ToggleWindows()
							return
						end
						--1 = open options panel
						if (Details.minimap.onclick_what_todo == 1) then

							if (_G.DetailsOptionsWindow) then
								if (_G.DetailsOptionsWindow:IsShown()) then
									_G.DetailsOptionsWindow:Hide()
									return
								end
							end

							local lower_instance = Details:GetLowerInstanceNumber()
							if (not lower_instance) then
								local instance = Details:GetInstance(1)
								Details.CriarInstancia (_, _, 1)
								Details:OpenOptionsWindow (instance)
							else
								Details:OpenOptionsWindow (Details:GetInstance(lower_instance))
							end

						--2 = reset data
						elseif (Details.minimap.onclick_what_todo == 2) then
							Details.tabela_historico:resetar()

						--3 = show hide windows
						elseif (Details.minimap.onclick_what_todo == 3) then
							local opened = Details:GetOpenedWindowsAmount()

							if (opened == 0) then
								Details:ReabrirTodasInstancias()
							else
								Details:ShutDownAllInstances()
							end
						end

					elseif (button == "RightButton") then
						--minimap menu
						GameTooltip:Hide()
						local GameCooltip = GameCooltip

						GameCooltip:Reset()
						GameCooltip:SetType ("menu")
						GameCooltip:SetOption("ButtonsYMod", -5)
						GameCooltip:SetOption("HeighMod", 5)
						GameCooltip:SetOption("TextSize", 10)

						--344 427 200 268 0.0009765625
						--0.672851, 0.833007, 0.391601, 0.522460

						--GameCooltip:SetBannerImage (1, [[Interface\AddOns\Details\images\icons]], 83*.5, 68*.5, {"bottomleft", "topleft", 1, -4}, {0.672851, 0.833007, 0.391601, 0.522460}, nil)
						--GameCooltip:SetBannerImage (2, "Interface\\PetBattles\\Weather-Windy", 512*.35, 128*.3, {"bottomleft", "topleft", -25, -4}, {0, 1, 1, 0})
						--GameCooltip:SetBannerText (1, "Mini Map Menu", {"left", "right", 2, -5}, "white", 10)

						--reset
						GameCooltip:AddMenu (1, Details.tabela_historico.resetar, true, nil, nil, Loc ["STRING_ERASE_DATA"], nil, true)
						GameCooltip:AddIcon ([[Interface\COMMON\VOICECHAT-MUTED]], 1, 1, 14, 14)

						GameCooltip:AddLine("$div")

						--nova instancia
						GameCooltip:AddMenu (1, Details.CriarInstancia, true, nil, nil, Loc ["STRING_MINIMAPMENU_NEWWINDOW"], nil, true)
						--GameCooltip:AddIcon ([[Interface\Buttons\UI-AttributeButton-Encourage-Up]], 1, 1, 10, 10, 4/16, 12/16, 4/16, 12/16)
						GameCooltip:AddIcon ([[Interface\AddOns\Details\images\icons]], 1, 1, 12, 11, 462/512, 473/512, 1/512, 11/512)

						--reopen all windows
						GameCooltip:AddMenu (1, Details.ReabrirTodasInstancias, true, nil, nil, Loc ["STRING_MINIMAPMENU_REOPENALL"], nil, true)
						GameCooltip:AddIcon ([[Interface\Buttons\UI-MicroStream-Green]], 1, 1, 14, 14, 0.1875, 0.8125, 0.84375, 0.15625)
						--close all windows
						GameCooltip:AddMenu (1, Details.ShutDownAllInstances, true, nil, nil, Loc ["STRING_MINIMAPMENU_CLOSEALL"], nil, true)
						GameCooltip:AddIcon ([[Interface\Buttons\UI-MicroStream-Red]], 1, 1, 14, 14, 0.1875, 0.8125, 0.15625, 0.84375)

						GameCooltip:AddLine("$div")

						--lock
						GameCooltip:AddMenu (1, Details.TravasInstancias, true, nil, nil, Loc ["STRING_MINIMAPMENU_LOCK"], nil, true)
						GameCooltip:AddIcon ([[Interface\PetBattles\PetBattle-LockIcon]], 1, 1, 14, 14, 0.0703125, 0.9453125, 0.0546875, 0.9453125)

						GameCooltip:AddMenu (1, Details.DestravarInstancias, true, nil, nil, Loc ["STRING_MINIMAPMENU_UNLOCK"], nil, true)
						GameCooltip:AddIcon ([[Interface\PetBattles\PetBattle-LockIcon]], 1, 1, 14, 14, 0.0703125, 0.9453125, 0.0546875, 0.9453125, "gray")

						GameCooltip:AddLine("$div")

						--disable minimap icon
						local disable_minimap = function()
							Details.minimap.hide = not value

							LDBIcon:Refresh ("Details", Details.minimap)
							if (Details.minimap.hide) then
								LDBIcon:Hide ("Details")
							else
								LDBIcon:Show ("Details")
							end
						end
						GameCooltip:AddMenu (1, disable_minimap, true, nil, nil, Loc ["STRING_MINIMAPMENU_HIDEICON"], nil, true)
						GameCooltip:AddIcon ([[Interface\Buttons\UI-Panel-HideButton-Disabled]], 1, 1, 14, 14, 7/32, 24/32, 8/32, 24/32, "gray")

						--

						GameCooltip:SetBackdrop(1, Details.tooltip_backdrop, nil, Details.tooltip_border_color)
						GameCooltip:SetWallpaper (1, [[Interface\SPELLBOOK\Spellbook-Page-1]], {.6, 0.1, 0.64453125, 0}, {.8, .8, .8, 0.2}, true)

						GameCooltip:SetOwner(self, "topright", "bottomleft")
						GameCooltip:ShowCooltip()


					end
				end,
				OnTooltipShow = function(tooltip)
					tooltip:AddLine("Details!", 1, 1, 1)
					if (Details.minimap.onclick_what_todo == 1) then
						tooltip:AddLine(Loc ["STRING_MINIMAP_TOOLTIP1"])
					elseif (Details.minimap.onclick_what_todo == 2) then
						tooltip:AddLine(Loc ["STRING_MINIMAP_TOOLTIP11"])
					elseif (Details.minimap.onclick_what_todo == 3) then
						tooltip:AddLine(Loc ["STRING_MINIMAP_TOOLTIP12"])
					end
					tooltip:AddLine(Loc ["STRING_MINIMAP_TOOLTIP2"])
					tooltip:AddLine("|cFFCFCFCFctrl + left click|r: show/hide windows")
				end,
			})

			if (databroker and not LDBIcon:IsRegistered ("Details")) then
				LDBIcon:Register ("Details", databroker, self.minimap)
			end

			Details.databroker = databroker
		end
	end

	function Details:DoRegisterHotCorner()
		--register lib-hotcorners
		local on_click_on_hotcorner_button = function(frame, button)
			if (Details.hotcorner_topleft.onclick_what_todo == 1) then
				local lower_instance = Details:GetLowerInstanceNumber()
				if (not lower_instance) then
					local instance = Details:GetInstance(1)
					Details.CriarInstancia (_, _, 1)
					Details:OpenOptionsWindow (instance)
				else
					Details:OpenOptionsWindow (Details:GetInstance(lower_instance))
				end

			elseif (Details.hotcorner_topleft.onclick_what_todo == 2) then
				Details.tabela_historico:resetar()
			end
		end

		local quickclick_func1 = function(frame, button)
			Details.tabela_historico:resetar()
		end

		local quickclick_func2 = function(frame, button)
			local lower_instance = Details:GetLowerInstanceNumber()
			if (not lower_instance) then
				local instance = Details:GetInstance(1)
				Details.CriarInstancia (_, _, 1)
				Details:OpenOptionsWindow (instance)
			else
				Details:OpenOptionsWindow (Details:GetInstance(lower_instance))
			end
		end

		local tooltip_hotcorner = function()
			GameTooltip:AddLine("Details!", 1, 1, 1, 1)
			if (Details.hotcorner_topleft.onclick_what_todo == 1) then
				GameTooltip:AddLine("|cFF00FF00Left Click:|r open options panel.", 1, 1, 1, 1)

			elseif (Details.hotcorner_topleft.onclick_what_todo == 2) then
				GameTooltip:AddLine("|cFF00FF00Left Click:|r clear all segments.", 1, 1, 1, 1)

			end
		end

		if (_G.HotCorners) then
			_G.HotCorners:RegisterHotCornerButton (
				--absolute name
				"Details",
				--corner
				"TOPLEFT",
				--config table
				Details.hotcorner_topleft,
				--frame _G name
				"DetailsLeftCornerButton",
				--icon
				[[Interface\AddOns\Details\images\minimap]],
				--tooltip
				tooltip_hotcorner,
				--click function
				on_click_on_hotcorner_button,
				--menus
				nil,
				--quick click
				{
					{func = quickclick_func1, name = "Details! - Reset Data"},
					{func = quickclick_func2, name = "Details! - Open Options"}
				},
				--onenter
				nil,
				--onleave
				nil,
				--is install
				true
			)
		end
	end

------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- ~API

function Details:InitializeAPIWindow()
	local DetailsAPI2Frame = gump:CreateSimplePanel(UIParent, 700, 480, "Details! API", "DetailsAPI2Frame")
	DetailsAPI2Frame.Frame = DetailsAPI2Frame
	DetailsAPI2Frame.__name = "API"
	DetailsAPI2Frame.real_name = "DETAILS_APIWINDOW"
	DetailsAPI2Frame.__icon = [[Interface\AddOns\Details\images\icons]]
	DetailsAPI2Frame.__iconcoords = {449/512, 480/512, 62/512, 83/512}
	DetailsAPI2Frame.__iconcolor = "DETAILS_API_ICON"
	DetailsPluginContainerWindow.EmbedPlugin(DetailsAPI2Frame, DetailsAPI2Frame, true)

	function DetailsAPI2Frame.RefreshWindow()
		Details.OpenAPI()
	end
end

function Details.OpenAPI()
	--create the window if not loaded yet
	Details:CreateAPI2Frame()

	DetailsAPI2Frame:Show()
	DetailsAPI2Frame.Refresh() --doesn't exists?
	DetailsPluginContainerWindow.OpenPlugin(DetailsAPI2Frame)
end

function Details:LoadFramesForBroadcastTools()
	--event tracker
	--if enabled and not loaded, load it
	if (Details.event_tracker.enabled and not Details.Broadcaster_EventTrackerLoaded) then
		Details:CreateEventTrackerFrame(UIParent, "DetailsEventTracker")
	end

	--if enabled and loaded, refresh and show
	if (Details.event_tracker.enabled and Details.Broadcaster_EventTrackerLoaded) then
		Details:UpdateEventTrackerFrame()
		_G.DetailsEventTracker:Show()
	end

	--if not enabled but loaded, hide it
	if (not Details.event_tracker.enabled and Details.Broadcaster_EventTrackerLoaded) then
		_G.DetailsEventTracker:Hide()
	end

	--current dps
	local bIsEnabled = Details.realtime_dps_meter.enabled and (Details.realtime_dps_meter.arena_enabled or Details.realtime_dps_meter.mythic_dungeon_enabled)

	--if enabled and not loaded, load it
	if (bIsEnabled and not Details.Broadcaster_CurrentDpsLoaded) then
		Details:CreateCurrentDpsFrame(UIParent, "DetailsCurrentDpsMeter")
	end

	--if enabled, check if can show
	if (bIsEnabled and Details.Broadcaster_CurrentDpsLoaded) then
		if (Details.realtime_dps_meter.mythic_dungeon_enabled) then
			local zoneName, instanceType, difficultyID, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceMapID, instanceGroupSize = GetInstanceInfo()
			if (difficultyID == 8) then
				--player is inside a mythic dungeon
				_G.DetailsCurrentDpsMeter:StartForMythicDungeon()
			end
		end

		if (Details.realtime_dps_meter.arena_enabled) then
			local zoneName, instanceType, difficultyID, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceMapID, instanceGroupSize = GetInstanceInfo()
			if (instanceType == "arena") then
				--player is inside an arena
				_G.DetailsCurrentDpsMeter:StartForArenaMatch()
			end
		end
	end

	--if not enabled but loaded, hide it
	if (not bIsEnabled and Details.Broadcaster_CurrentDpsLoaded) then
		_G.DetailsCurrentDpsMeter:Hide()
	end
end


function Details:FormatBackground(frame) --deprecated I guess
	frame:SetBackdrop({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true})
	frame:SetBackdropColor(.5, .5, .5, .5)
	frame:SetBackdropBorderColor(0, 0, 0, 1)

	if (not frame.__background) then
		frame.__background = frame:CreateTexture(nil, "background")
	end

	frame.__background:SetTexture([[Interface\AddOns\Details\images\background]], true)
	frame.__background:SetAlpha(0.7)
	frame.__background:SetVertexColor(0.27, 0.27, 0.27)
	frame.__background:SetVertTile(true)
	frame.__background:SetHorizTile(true)
	frame.__background:SetAllPoints()
end


function Details.ShowCopyValueFrame(textToShow)
	if (not DetailsCopyValueFrame) then
		local frame = CreateFrame("frame", "DetailsCopyValueFrame", UIParent)
		frame:SetSize(160, 20)
		frame:SetPoint("center", UIParent, "center", 0, 0)
		DetailsFramework:ApplyStandardBackdrop(frame)
		tinsert(UISpecialFrames, "DetailsCopyValueFrame")

		frame.editBox = CreateFrame("editbox", nil, frame)
		frame.editBox:SetPoint("topleft", frame, "topleft")
		frame.editBox:SetAutoFocus(false)
		frame.editBox:SetFontObject("GameFontHighlightSmall")
		frame.editBox:SetAllPoints()
		frame.editBox:SetJustifyH("center")
		frame.editBox:EnableMouse(true)

		frame.editBox:SetScript("OnEnterPressed", function()
			frame.editBox:ClearFocus()
			frame:Hide()
		end)

		frame.editBox:SetScript("OnEscapePressed", function()
			frame.editBox:ClearFocus()
			frame:Hide()
		end)

		frame.editBox:SetScript("OnChar", function()
			frame.editBox:ClearFocus()
			frame:Hide()
		end)
	end

	DetailsCopyValueFrame:Show()
	DetailsCopyValueFrame.editBox:SetText(textToShow or "")
	DetailsCopyValueFrame.editBox:SetFocus()
	DetailsCopyValueFrame.editBox:HighlightText()
end