
local DF = _G ["DetailsFramework"]
if (not DF or not DetailsFrameworkCanLoad) then
	return
end

function DF:CreateScrollBar (master, slave, x, y)
	return DF:NewScrollBar (master, slave, x, y)
end

function DF:NewScrollBar (master, slave, x, y)

	local new_slider = CreateFrame ("Slider", nil, master)
	new_slider.scrollMax = 560 --default - tamanho da janela de fundo

	-- ///// SLIDER /////
	new_slider:SetPoint ("TOPLEFT", master, "TOPRIGHT", x, y)
	new_slider.ativo = true

	new_slider.bg = new_slider:CreateTexture (nil, "BACKGROUND")
	new_slider.bg:SetAllPoints (true)
	new_slider.bg:SetTexture (0, 0, 0, 0)
	--coisinha do meio
	new_slider.thumb = new_slider:CreateTexture (nil, "OVERLAY")
	new_slider.thumb:SetTexture ("Interface\\Buttons\\UI-ScrollBar-Knob")
	new_slider.thumb:SetSize (29, 30)
	new_slider:SetThumbTexture (new_slider.thumb)

	new_slider:SetOrientation ("VERTICAL")
	new_slider:SetSize(16, 100)
	new_slider:SetMinMaxValues(0, new_slider.scrollMax)
	new_slider:SetValue(0)
	new_slider.ultimo = 0

	local botao_cima = CreateFrame ("Button", nil, master)

	botao_cima:SetPoint ("BOTTOM", new_slider, "TOP", 0, -12)
	botao_cima.x = 0
	botao_cima.y = -12

	botao_cima:SetWidth (29)
	botao_cima:SetHeight (32)
	botao_cima:SetNormalTexture ("Interface\\BUTTONS\\UI-ScrollBar-ScrollUpButton-Up")
	botao_cima:SetPushedTexture ("Interface\\BUTTONS\\UI-ScrollBar-ScrollUpButton-Down")
	botao_cima:SetDisabledTexture ("Interface\\BUTTONS\\UI-ScrollBar-ScrollUpButton-Disabled")
	botao_cima:Show()
	botao_cima:Disable()

	local botao_baixo = CreateFrame ("Button", nil, master)
	botao_baixo:SetPoint ("TOP", new_slider, "BOTTOM", 0, 12)
	botao_baixo.x = 0
	botao_baixo.y = 12

	botao_baixo:SetWidth (29)
	botao_baixo:SetHeight (32)
	botao_baixo:SetNormalTexture ("Interface\\BUTTONS\\UI-ScrollBar-ScrollDownButton-Up")
	botao_baixo:SetPushedTexture ("Interface\\BUTTONS\\UI-ScrollBar-ScrollDownButton-Down")
	botao_baixo:SetDisabledTexture ("Interface\\BUTTONS\\UI-ScrollBar-ScrollDownButton-Disabled")
	botao_baixo:Show()
	botao_baixo:Disable()

	master.baixo = botao_baixo
	master.cima = botao_cima
	master.slider = new_slider

	botao_baixo:SetScript ("OnMouseDown", function(self)
		if (not new_slider:IsEnabled()) then
			return
		end

		local current = new_slider:GetValue()
		local minValue, maxValue = new_slider:GetMinMaxValues()
		if (current+5 < maxValue) then
			new_slider:SetValue (current+5)
		else
			new_slider:SetValue (maxValue)
		end
		self.precionado = true
		self.last_up = -0.3
		self:SetScript ("OnUpdate", function(self, elapsed)
			self.last_up = self.last_up + elapsed
			if (self.last_up > 0.03) then
				self.last_up = 0
				local current = new_slider:GetValue()
				local minValue, maxValue = new_slider:GetMinMaxValues()
				if (current+2 < maxValue) then
					new_slider:SetValue (current+2)
				else
					new_slider:SetValue (maxValue)
				end
			end
		end)
	end)
	botao_baixo:SetScript ("OnMouseUp", function(self)
		self.precionado = false
		self:SetScript ("OnUpdate", nil)
	end)

	botao_cima:SetScript ("OnMouseDown", function(self)
		if (not new_slider:IsEnabled()) then
			return
		end

		local current = new_slider:GetValue()
		if (current-5 > 0) then
			new_slider:SetValue (current-5)
		else
			new_slider:SetValue (0)
		end
		self.precionado = true
		self.last_up = -0.3
		self:SetScript ("OnUpdate", function(self, elapsed)
			self.last_up = self.last_up + elapsed
			if (self.last_up > 0.03) then
				self.last_up = 0
				local current = new_slider:GetValue()
				if (current-2 > 0) then
					new_slider:SetValue (current-2)
				else
					new_slider:SetValue (0)
				end
			end
		end)
	end)
	botao_cima:SetScript ("OnMouseUp", function(self)
		self.precionado = false
		self:SetScript ("OnUpdate", nil)
	end)
	--> isso aqui pra quando o slider ativar, o scroll fica na  posi��o zero
	botao_cima:SetScript ("OnEnable", function (self)
		local current = new_slider:GetValue()
		if (current == 0) then
			botao_cima:Disable()
		end
	end)

	new_slider:SetScript ("OnValueChanged", function (self)
		local current = self:GetValue()
		master:SetVerticalScroll (current)

		local minValue, maxValue = new_slider:GetMinMaxValues()

		if (current == minValue) then
			botao_cima:Disable()
		elseif (not botao_cima:IsEnabled()) then
			botao_cima:Enable()
		end

		if (current == maxValue) then
			botao_baixo:Disable()
		elseif (not botao_baixo:IsEnabled()) then
			botao_baixo:Enable()
		end

	end)

	new_slider:SetScript ("OnShow", function (self)
		botao_cima:Show()
		botao_baixo:Show()
	end)

	new_slider:SetScript ("OnDisable", function (self)
		botao_cima:Disable()
		botao_baixo:Disable()
	end)

	new_slider:SetScript ("OnEnable", function (self)
		botao_cima:Enable()
		botao_baixo:Enable()
	end)

	master:SetScript ("OnMouseWheel", function (self, delta)
		if (not new_slider:IsEnabled()) then
			return
		end

		local current = new_slider:GetValue()
		if (delta < 0) then
			--baixo
			local minValue, maxValue = new_slider:GetMinMaxValues()
			if (current + (master.wheel_jump or 20) < maxValue) then
				new_slider:SetValue (current + (master.wheel_jump or 20))
			else
				new_slider:SetValue (maxValue)
			end
		elseif (delta > 0) then
			--cima
			if (current + (master.wheel_jump or 20) > 0) then
				new_slider:SetValue (current - (master.wheel_jump or 20))
			else
				new_slider:SetValue (0)
			end
		end
	end)

	function new_slider:Altura (h)
		self:SetHeight (h)
	end

	function new_slider:Update (desativar)

		if (desativar) then
			new_slider:Disable()
			new_slider:SetValue(0)
			new_slider.ativo = false
			master:EnableMouseWheel (false)
			return
		end

		self.scrollMax = slave:GetHeight()-master:GetHeight()
		if (self.scrollMax > 0) then
			new_slider:SetMinMaxValues (0, self.scrollMax)
			if (not new_slider.ativo) then
				new_slider:Enable()
				new_slider.ativo = true
				master:EnableMouseWheel (true)
			end
		else
			new_slider:Disable()
			new_slider:SetValue(0)
			new_slider.ativo = false
			master:EnableMouseWheel (false)
		end
	end

	function new_slider:cimaPoint (x, y)
		botao_cima:SetPoint ("BOTTOM", new_slider, "TOP", x, (y)-12)
	end

	function new_slider:baixoPoint (x, y)
		botao_baixo:SetPoint ("TOP", new_slider, "BOTTOM", x, (y)+12)
	end

	return new_slider
end
