Quantcast
local addon, ns = ...
local db, events, F, L = ns:Locals()

local loaded, created

function events:Toggle()
	if loaded then
		if events:IsVisible() then
			events:Hide()
		else
			events:Show()
		end
	elseif created then
		events:CreateContent(events)
	else
		events:CreateOptions(events)
	end
end

function events:CreateOptions(self)
	self:EnableMouse(true)
	self:SetMovable(true)
	self:SetToplevel(true)
	self:SetSize(832, 480)
	self:SetPoint("CENTER",0,0)

	self.texture = self:CreateTexture(nil, "BACKGROUND")
	self.texture:SetAllPoints(self)
	self.texture:SetTexture(.2, .2, .2, 1)

	self:SetBackdrop({
		edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
		tile = true,
		tileSize = 12,
		edgeSize = 12,
		insets = {
			left = -2,
			right = -2,
			top = -2,
			bottom = -2
		}
	})

	self:SetBackdropBorderColor(0, 0, 0, 1)

	self.title_region = self:CreateTitleRegion()
	self.title_region:SetPoint("TOPLEFT", 12, -8)
	self.title_region:SetPoint("BOTTOMRIGHT", self, "TOPRIGHT", -12, -28)

	self.title_region.texture = self:CreateTexture()
	self.title_region.texture:SetAllPoints(self.title_region)
	self.title_region.texture:SetTexture(.1, .1, .1, 1)

	self.title = self:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	self.title:SetText(L.OptionsTitle)
	self.title:SetPoint("TOPLEFT", self.title_region, "TOPLEFT", 8, -(self.title_region:GetHeight() - self.title:GetHeight()))

	self.closeBTN = CreateFrame("Button", nil, self, "UIPanelCloseButton")
	self.closeBTN:SetPoint("TOPRIGHT", self.title_region, "TOPRIGHT", -2, 3)

	created = true

	self:CreateContent(self)
end

function events:CreateContent(self)
	local options = {
		-- {saved_var, desc, saved_var2}
		[1] = {"SortByName", L.SortByNameDesc, false},
		[2] = {"HideConfirmation", L.HideConfirmationDesc, false},
		[3] = {"ConfirmRollAndAssign", L.ConfirmRollAndAssignDesc, "RollAndAssignTimer"},
		[4] = {"ConfirmAssignToRandom", L.ConfirmAssignToRandomDesc, "AssignToRandomTimer"},
	}

	local EditBoxBG = {
		bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
		edgeFile = "Interface\\ChatFrame\\ChatFrameBackground",
		tile = true, edgeSize = 1, tileSize = 5,
	}

	local elements = {}

	local LastElement

	for k, v in pairs(options) do
		elements["OptionsCHK" .. k] = CreateFrame("CheckButton", v[1] .. "CHK", self, "OptionsBaseCheckButtonTemplate")

		local OptionsCHK = elements["OptionsCHK" .. k]
			  OptionsCHK:SetChecked(db.settings[v[1]])

		if k == 1 then
			OptionsCHK:SetPoint("TOPLEFT", self.title_region, "BOTTOMLEFT", 10, -10)
		elseif k == 2 then
			OptionsCHK:SetPoint("TOPLEFT", self.title_region, "BOTTOMLEFT", self:GetWidth()*0.5, -10)
		else
			OptionsCHK:SetPoint("TOPLEFT", elements["OptionsCHK" .. (k - 2)], "BOTTOMLEFT", 0, -5)
		end

		OptionsCHK:SetScript("OnClick", function()
			db.settings[v[1]] = OptionsCHK:GetChecked() and true or false
		end)

		OptionsCHK:SetScript("OnShow", function()
			OptionsCHK:SetChecked(db.settings[v[1]])
		end)

		elements["OptionsLBL" .. k] = OptionsCHK:CreateFontString(nil, "OVERLAY", "GameFontHighlight")

		local OptionsLBL = elements["OptionsLBL" .. k]
			  OptionsLBL:SetPoint("LEFT", OptionsCHK, "RIGHT", 5, 1)
			  OptionsLBL:SetText(v[2])

		if v[3] then
			OptionsCHK:Disable()
			elements["Slider" .. k] = CreateFrame("Slider", v[3] .. "Slider", self, "OptionsSliderTemplate")

			local Slider = elements["Slider" .. k]
				  Slider:SetSize(150, 20)
				  Slider:SetMinMaxValues(1, 30)
				  Slider:SetValueStep(1)
				  Slider:SetOrientation('HORIZONTAL')
				  Slider:SetValue(db.settings[v[3]])
				  Slider.tooltipText = nil
				  getglobal(Slider:GetName() .. 'Low'):SetText('1')
				  getglobal(Slider:GetName() .. 'High'):SetText('30')
				  getglobal(Slider:GetName() .. 'Text'):SetText(string.format(L.TimerValue, db.settings[v[3]]))

			if not db.settings[v[1]] then Slider:Disable() end

			Slider:SetPoint("TOP", OptionsLBL, "BOTTOM", -20, -20)

			elements["EditBox" .. k] = CreateFrame("EditBox", "ConfirmRollAndAssignEdit", self)

			local EditBox = elements["EditBox" .. k]
				  EditBox:SetSize(40, 14)
				  EditBox:SetFontObject(GameFontHighlightSmall)
				  EditBox:SetAutoFocus(false)
				  EditBox:SetJustifyH("CENTER")
				  EditBox:SetText(db.settings[v[3]])
				  EditBox:EnableMouse(true)
				  EditBox:SetBackdrop(EditBoxBG)
				  EditBox:SetBackdropColor(0, 0, 0, 0.5)
				  EditBox:SetBackdropBorderColor(0.3, 0.3, 0.30, 0.80)

			if not db.settings[v[1]] then EditBox:Disable() end

			EditBox:SetPoint("TOP", Slider, "BOTTOM", 0, -10)

			EditBox:SetScript("OnEditFocusGained", function(self)
				self:HighlightText()
			end)

			EditBox:SetScript("OnEnterPressed", function(self)
				local value = tonumber(self:GetText())
				local min, max = Slider:GetMinMaxValues()

				if value and value >= min and value <= max then
					Slider:SetValue(value)
					db.settings[v[3]] = value
					getglobal(Slider:GetName() .. 'Text'):SetText(string.format(L.TimerValue, value))
				else
					self:SetText(db.settings[v[3]])
				end

				self:ClearFocus()
			end)

			EditBox:SetScript("OnEscapePressed", function(self)
				self:SetText(db.settings[v[3]])
				self:ClearFocus()
			end)

			EditBox:SetScript("OnEditFocusLost", function(self)
				self:HighlightText(0, 0)
			end)

			EditBox:SetScript("OnEnter", function(self)
				self:SetBackdropBorderColor(0.5, 0.5, 0.5, 1)
			end)

			EditBox:SetScript("OnLeave", function(self)
				self:SetBackdropBorderColor(0.3, 0.3, 0.3, 0.8)
			end)

			Slider:SetScript("OnValueChanged", function(self, value)
				local halfStep = self:GetValueStep() * 0.5
				value = value + halfStep - (value + halfStep) % self:GetValueStep()

				db.settings[v[3]] = value
				getglobal(Slider:GetName() .. 'Text'):SetText(string.format(L.TimerValue, value))
				EditBox:SetText(value)
				-- StaticPopupDialogs[v[4]].timeout = value
			end)

			OptionsCHK:HookScript("OnClick", function(...)
				if not db.settings[v[1]] then
					Slider:Disable()
					EditBox:Disable()
				else
					Slider:Enable()
					EditBox:Enable()
				end
			end)
		end

		if k % 2 ~= 0 then
			LastElement = k
		end
	end

	local ReservesLBL = self:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
		  ReservesLBL:SetText(L.ReservesInstructions)
		  ReservesLBL:CanWordWrap(True)
		  ReservesLBL:SetWidth(self:GetWidth() - 60)
		  ReservesLBL:SetJustifyH("LEFT")
		  ReservesLBL:SetPoint("TOPLEFT", elements["OptionsCHK" .. LastElement], "BOTTOMLEFT", 0, -75)

	local ItemEditBox = events:EditBoxTemplate("ItemEditBox", L.ItemEditBoxDefault)
		  ItemEditBox:SetWidth((ReservesLBL:GetWidth() - 15)*(2/3))
		  ItemEditBox:SetPoint("TOPLEFT", ReservesLBL, "BOTTOMLEFT", 0, -25)

	local NameEditBox = events:EditBoxTemplate("NameEditBox", L.NameEditBoxDefault)
		  NameEditBox:SetWidth((ReservesLBL:GetWidth() - 15)*(1/3))
		  NameEditBox:SetPoint("TOPLEFT", ItemEditBox, "TOPRIGHT", 3, 0)

	ItemEditBox:SetScript("OnTabPressed", function(self)
		NameEditBox:SetFocus()
	end)

	ItemEditBox:SetScript("OnEnterPressed", ItemEditBox:GetScript("OnTabPressed"))

	NameEditBox:SetScript("OnTabPressed", function(self)
		ItemEditBox:SetFocus()
	end)

	NameEditBox:SetScript("OnEnterPressed", function(self)
		local item = ItemEditBox:GetText()
		local name = self:GetText()

		if item ~= L.ItemEditBoxDefault and name ~= L.NameEditBoxDefault and item ~= "" and name ~= "" then
			db.reserves[item] = name

			self:SetText(L.NameEditBoxDefault)
			ItemEditBox:SetText(L.ItemEditBoxDefault)

			self:SetTextColor(0.5, 0.5, 0.5, 1)
			ItemEditBox:SetTextColor(0.5, 0.5, 0.5, 1)

			ItemEditBox:SetFocus()

			events:LoadReserves()
		else
			if name == L.NameEditBoxDefault then
				self:SetTextColor(0.5, 0.5, 0.5, 1)
			end
			self:HighlightText(0, 0)
			ItemEditBox:SetFocus()
		end
	end)

	local texture = "Interface\\Buttons\\UI-PlusButton-%s.blp"

	local AddBTN = CreateFrame("Button", nil, self)
		  AddBTN:SetSize(16, 16)
		  AddBTN:SetNormalTexture(string.format(texture, "Up"))
		  AddBTN:SetPushedTexture(string.format(texture, "Down"))
		  AddBTN:SetHighlightTexture(string.format(texture, "Up"))
		  AddBTN:SetPoint("TOPLEFT", NameEditBox, "TOPRIGHT", 4, -1)

	AddBTN:SetScript("OnClick", function()
		local item = ItemEditBox:GetText()
		local name = NameEditBox:GetText()

		if item ~= L.ItemEditBoxDefault and name ~= L.NameEditBoxDefault and item ~= "" and name ~= "" then
			db.reserves[item] = name

			ItemEditBox:SetText(L.ItemEditBoxDefault)
			NameEditBox:SetText(L.NameEditBoxDefault)

			ItemEditBox:SetTextColor(0.5, 0.5, 0.5, 1)
			NameEditBox:SetTextColor(0.5, 0.5, 0.5, 1)

			ItemEditBox:ClearFocus()
			NameEditBox:ClearFocus()

			events:LoadReserves()
		end
	end)

	local ScrollFrame = CreateFrame("ScrollFrame", "ReservesScrollFrame", self, "UIPanelScrollFrameTemplate")
		  ScrollFrame:SetPoint("TOPLEFT", ItemEditBox, "BOTTOMLEFT", 0, -10)
		  ScrollFrame:SetPoint("BOTTOMRIGHT", self, "BOTTOMLEFT", self:GetWidth() - 46, 20)

	ScrollFrame.ScrollBar:EnableMouseWheel(true)
	ScrollFrame.ScrollBar:SetScript("OnMouseWheel", function(self, direction)
		ScrollFrameTemplate_OnMouseWheel(ScrollFrame, direction)
	end)

	local ScrollFrameBG = ScrollFrame:CreateTexture(nil, "BACKGROUND", nil, -6)
		  ScrollFrameBG:SetPoint("TOP")
		  ScrollFrameBG:SetPoint("RIGHT", 25, 0)
		  ScrollFrameBG:SetPoint("BOTTOM")
		  ScrollFrameBG:SetWidth(26)
		  ScrollFrameBG:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-ScrollBar.blp")
		  ScrollFrameBG:SetTexCoord(0, 0.45, 0.1640625, 1)
		  ScrollFrameBG:SetAlpha(0.5)

	self.ScrollFrame = ScrollFrame

	local ScrollContent = CreateFrame("Frame", nil, ScrollFrame)
		  ScrollContent:SetSize(ScrollFrame:GetWidth(), ScrollFrame:GetHeight())

	ScrollContent.texture = ScrollContent:CreateTexture(nil, "BACKGROUND")
	ScrollContent.texture:SetAllPoints(ScrollFrame)
	ScrollContent.texture:SetTexture(0.5, 0.5, 0.5, 0.5)

	self.ScrollContent= ScrollContent
	ScrollFrame:SetScrollChild(ScrollContent)

	ScrollFrame:SetScript("OnShow", function()
		events:LoadReserves()
	end)

	events:LoadReserves()

	loaded = true
end

function events:EditBoxTemplate(name, msg)
	local backdrop = {
		bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
		edgeFile = "Interface\\ChatFrame\\ChatFrameBackground",
		tile = true,
		edgeSize = 1,
		tileSize = 5,
	}

	local EditBox = CreateFrame("EditBox", name, events)
		  EditBox:SetHeight(20)
		  EditBox:SetFontObject(GameFontHighlight)
		  EditBox:SetAutoFocus(false)
		  EditBox:SetJustifyH("LEFT")
		  EditBox:EnableMouse(true)
		  EditBox:SetBackdrop(backdrop)
		  EditBox:SetBackdropColor(0, 0, 0, 0.5)
		  EditBox:SetBackdropBorderColor(0.3, 0.3, 0.3, 0.8)
		  EditBox:SetTextInsets(15, 15, 0, 0)
		  EditBox:SetTextColor(0.5, 0.5, 0.5, 1)
		  EditBox:SetText(msg)

	EditBox:SetScript("OnEditFocusGained", function(self)
		self:SetTextColor(1, 1, 1, 1)
		self:HighlightText()
	end)

	EditBox:SetScript("OnEditFocusLost", function(self)
		local text = self:GetText()
		if text == msg or text == "" then
			self:SetTextColor(0.5, 0.5, 0.5, 1)
			if text == ""  then self:SetText(msg) end
		end
		self:HighlightText(0, 0)
	end)

	EditBox:SetScript("OnEnter", function(self)
		self:SetBackdropBorderColor(0.5, 0.5, 0.5, 1)
	end)

	EditBox:SetScript("OnLeave", function(self)
		self:SetBackdropBorderColor(0.3, 0.3, 0.3, 0.8)
	end)

	EditBox:SetScript("OnEscapePressed", function(self)
		local text = self:GetText()
		if text == msg or text == "" then
			self:SetTextColor(0.5, 0.5, 0.5, 1)
			if text == ""  then self:SetText(msg) end
		end
		self:HighlightText(0, 0)
		self:ClearFocus()
	end)

	return EditBox
end

local elements = {}
local counter

function events:LoadReserves()
	for k, v in pairs(elements) do
		v:SetText("")
		v:ClearAllPoints()
		v:Hide()
	end

	counter = 1

	local LastElement

	for k, v in F:pairsByKeys(db.reserves) do
		if not elements["RemoveBTN" .. counter] then
			local texture = "Interface\\Buttons\\UI-MinusButton-%s.blp"
			elements["RemoveBTN" .. counter] = CreateFrame("Button", nil, events.ScrollContent)
			elements["RemoveBTN" .. counter]:SetNormalTexture(string.format(texture, "Up"))
			elements["RemoveBTN" .. counter]:SetPushedTexture(string.format(texture, "Down"))
			elements["RemoveBTN" .. counter]:SetHighlightTexture(string.format(texture, "Up"))
			elements["RemoveBTN" .. counter]:SetSize(16, 16)
		end

		elements["RemoveBTN" .. counter]:SetScript("OnClick", function()
			db.reserves[k] = nil
			events:LoadReserves()
		end)

		if counter == 1 then
			elements["RemoveBTN" .. counter]:SetPoint("TOPLEFT", 15, -10)
		else
			elements["RemoveBTN" .. counter]:SetPoint("TOPLEFT", elements["RemoveBTN" .. (counter - 1)], "BOTTOMLEFT", 0, -5)
		end

		if not elements["ReserveLBL" .. counter] then
			elements["ReserveLBL" .. counter] = events.ScrollContent:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
			elements["ReserveLBL" .. counter]:CanWordWrap(true)
			elements["ReserveLBL" .. counter]:SetJustifyH("LEFT")
			elements["ReserveLBL" .. counter]:SetWidth(events.ScrollContent:GetWidth()/2 - 30)
		end

		elements["ReserveLBL" .. counter]:SetText(k .. " (" .. v .. ")")
		elements["ReserveLBL" .. counter]:SetPoint("TOPLEFT", elements["RemoveBTN" .. counter], "TOPRIGHT", 5, -3)

		elements["ReserveLBL" .. counter]:Show()
		elements["RemoveBTN" .. counter]:Show()

		LastElement = elements["RemoveBTN" .. counter]
		counter = counter + 1
	end
end