Quantcast
-- $Revision: 213 $
-- Cauldron main user interface logic

local L = LibStub("AceLocale-3.0"):GetLocale("Cauldron")

-- CauldronUI = LibStub("AceAddon-3.0"):NewAddon("CauldronUI", "AceEvent-3.0", "AceConsole-3.0", "LibDebugLog-1.0")

local SLOT_NONE = "none";

function CauldronFrame_OnLoad()

--	ButtonFrameTemplate_HideButtonBar(CauldronFrame);
	ButtonFrameTemplate_HideAttic(CauldronFrame);
--	CauldronFrameInsetBg:Hide();

end

function CauldronFrame_OnEvent()
end

function CauldronFrame_OnShow()
end

function CauldronFrame_OnHide()
end

function CauldronSearch_OnTextChanged()
end

function CauldronFrame_Update()
end

function CauldronFrame_Show()
	Cauldron:Frame_Show();
end

--[==[
function CauldronQueueWindowFrame_UpdateQueue()
end

function CauldronQueueWindowFrame_GetTopButton()
end

function CauldronQueueWindowFrame_OnLoad()

   --[[
   self:SetBackdropColor(.05,.05,.05,.8);
                self:SetBackdropBorderColor(.4,.4,.4,1);
                --]]
                -- tinsert(UISpecialFrames, self:GetName());
                -- CauldronQueueWindowFrameTitleText:SetText(Cauldron:LocaleString("Tradeskill Queue").." "..Cauldron.version);

	local scrollFrame = CauldronQueueFrameScrollFrame;
	scrollFrame.update = CauldronQueueWindowFrame_UpdateQueue;
	scrollFrame.dynamic = CauldronQueueWindowFrame_GetTopButton;
--	CauldronQueueFrameScrollFrameScrollBarTrack:Hide();
--	CauldronQueueFrameScrollFrameScrollBar.doNotHide = true;
	HybridScrollFrame_CreateButtons(scrollFrame, "CauldronQueueFrameButtonTemplate");
end
--]==]

function Cauldron:Frame_Show()

self:debug("frame show: "..tostring(CauldronQueueWindowFrame));

	if Cauldron.vars.enabled and not(IsShiftKeyDown() and IsControlKeyDown()) then
-- 		CloseDropDownMenus();

--[==[
		if TradeSkillFrame then
			-- place our frame over the original frame
--			CauldronFrame:SetPoint("TOPLEFT", TradeSkillFrame:GetLeft(), TradeSkillFrame:GetTop());

			-- hide the original tradeskill frame
			if not Cauldron.vars.origFrameStrata then
				Cauldron.vars.origFrameStrata = TradeSkillFrame:GetFrameStrata();
			end
			if not Cauldron.vars.origFrameLevel then
				Cauldron.vars.origFrameLevel = TradeSkillFrame:GetFrameLevel();
			end

			TradeSkillFrame:SetAlpha(0);
--			TradeSkillFrame:ClearAllPoints();
--			TradeSkillFrame:SetPoint("TOPLEFT", 0, 900);
			TradeSkillFrame:SetFrameStrata("BACKGROUND");
			TradeSkillFrame:SetFrameLevel(1);
			-- set the tradeskill frame's width to match ours
--			TradeSkillFrame:SetWidth(692);

			--[[
			-- remove the tradeskill frame from the special frame list
			for i,t in ipairs(UISpecialFrames) do
				if t == TradeSkillFrame:GetName() then
					table.remove(UISpecialFrames, i);
					break;
				end
			end
--			table.remove(
			--]]

		end

		-- put localized text in various labels
		CauldronSkillInfoFrameQueueLabel:SetText(L["Queue"]);
		CauldronQueueAllButton:SetText(L["Queue All"]);
		CauldronQueueButton:SetText(L["Queue"]);
		CauldronProcessButton:SetText(L["Process"]);
		CauldronClearQueueButton:SetText(L["Clear Queue"]);
--]==]

		-- show main UI
		ShowUIPanel(CauldronFrame);
		SetPortraitToTexture(CauldronFramePortrait, GetTradeSkillTexture());
		CauldronFrameTitleText:SetText(L["Cauldron"].." "..Cauldron.version);

		-- show queue UI
		if Cauldron.vars.showQueue then
			ShowUIPanel(CauldronQueueWindowFrame);
			SetPortraitToTexture(CauldronQueueWindowFramePortrait, GetTradeSkillTexture());
			CauldronQueueWindowFrameTitleText:SetText(L["Queue"]);
		end

	 	self:RegisterMessage("Cauldron_Update", "OnCauldronUpdate");

		self:Frame_Update();
	end

end

function Cauldron:Frame_Hide()

 	self:UnregisterEvent("Cauldron_Update");
 	HideUIPanel(CauldronQueueWindowFrame);
 	HideUIPanel(CauldronFrame);

 	--[[
 	if TradeSkillFrame then
 		TradeSkillFrame:SetAlpha(1.0);
 		TradeSkillFrame:SetFrameStrata(Cauldron.vars.origFrameStrata or "MEDIUM");
 		TradeSkillFrame:SetFrameLevel(Cauldron.vars.origFrameLevel or 5);
 	end
 	--]]

end

function Cauldron:Frame_Toggle()

 	if CauldronQueueWindowFrame:IsVisible() then
 		Cauldron:Frame_Hide();
 	else
 		Cauldron:Frame_Show();
 	end

end

function CauldronFrame_Update()
	Cauldron:Frame_Update();
end

function Cauldron:Frame_Update()

	local numTradeSkills = GetNumTradeSkills();
	local name, rank, maxRank = GetTradeSkillLine();

	if name == "UNKNOWN" then
		return;
	end

--	Cauldron:UpdateSkills();

	if CURRENT_TRADESKILL ~= name then

		StopTradeSkillRepeat();

		if CURRENT_TRADESKILL ~= "" then
			-- To fix problem with switching between two tradeskills
--			UIDropDownMenu_Initialize(TradeSkillInvSlotDropDown, TradeSkillInvSlotDropDown_Initialize);
--			UIDropDownMenu_SetSelectedID(TradeSkillInvSlotDropDown, 1);

--			UIDropDownMenu_Initialize(TradeSkillSubClassDropDown, TradeSkillSubClassDropDown_Initialize);
--			UIDropDownMenu_SetSelectedID(TradeSkillSubClassDropDown, 1);
		end
		CURRENT_TRADESKILL = name;
	end

	-- display skill name, level/progress
	self:UpdateSkillInfo(name, rank, maxRank);

--[==[
	-- update search text box
	self:UpdateSearchText();

	-- TODO: update dropdowns
	self:UpdateFilterDropDowns();
--]==]

	-- display list of matching skills
	self:UpdateSkillList();

	-- display queue
	self:UpdateQueue();

	-- update buttons
	self:UpdateButtons();

end

function Cauldron:UpdateSkillInfo(skillName, rank, maxRank)
	--@alpha@
	self:debug("UpdateSkillInfo enter");
	--@end-alpha@

	local skillCount = Cauldron:GetSkillCount(skillName);
--[==[
	CauldronRankFrameSkillName:SetText(skillName.." ("..skillCount.." "..L["skills"]..")");
--]==]
	CauldronSkillNameText:SetText(skillName);
		local prof_title = "";
		for i=1,#PROFESSION_RANKS do
		    local value,title = PROFESSION_RANKS[i][1], PROFESSION_RANKS[i][2];
			if maxRank < value then break end
			prof_title = title;
		end
	CauldronRankInfoText:SetText(prof_title..", "..skillCount.." "..L["skills"]);

	CauldronRankFrame:SetStatusBarColor(0.0, 0.0, 1.0, 0.5);
	CauldronRankFrameBackground:SetVertexColor(0.0, 0.0, 0.75, 0.5);
	CauldronRankFrame:SetMinMaxValues(0, maxRank);
	CauldronRankFrame:SetValue(rank);
	CauldronRankFrameText:SetText(rank.."/"..maxRank);

end

function Cauldron:UpdateSearchText()

--[==[
	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	if (not skillName or skillName == "UNKNOWN") or
	   (not self.vars.playername) or
	   (not self.db.realm.userdata[self.vars.playername]) or
	   (not self.db.realm.userdata[self.vars.playername].skills[skillName]) then
		return;
	end

	local searchText = self.db.realm.userdata[self.vars.playername].skills[skillName].window.search or "";
	if searchText == "" then
		searchText = SEARCH;
	end
	CauldronFiltersSearchEditBox:SetText(searchText);
--]==]

end

function Cauldron:UpdateFilterDropDowns()

	-- TODO

end

function Cauldron:UpdateSkillList()

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	local skillList = Cauldron:GetSkillList(self.vars.playername, skillName);
	if not skillList then
		return;
	end

	local height = 0;

	-- iterate over the list of skills
	for i, skillInfo in ipairs(skillList) do

		local skillFrame = _G["CauldronSkillItem"..i];

		-- check if we have a frame for this position
		if not skillFrame then
			-- create a new frame for the skill information
			if self.db.realm.userdata[self.vars.playername].options.compactView then
				-- TODO
			else
				-- TODO
			end
			skillFrame = CreateFrame("Button",
									 "CauldronSkillItem"..i,
									 CauldronSkillListScrollFrameScrollChild,
									 "CauldronSkillItemNormalCollapsedFrameTemplate");
		end

		--[[
		if self.db.realm.userdata[self.vars.playername].options.compactView then
		    -- set the height of frame
		    skillFrame:SetHeight(25);
		    _G["CauldronSkillItem"..i.."SkillCooldown"]:SetHeight(25);

		    -- rescale the icon frame
		    _G["CauldronSkillItem"..i.."SkillIcon"]:SetWidth(18);
		    _G["CauldronSkillItem"..i.."SkillIcon"]:SetHeight(18);

		    -- reposition the name
		    _G["CauldronSkillItem"..i.."SkillName"]:SetPoint("TOPLEFT", 43, -4);

		    -- hide the category info
		    _G["CauldronSkillItem"..i.."SkillCategory"]:Hide();
		else
		    -- set the height of frame
		    skillFrame:SetHeight(50);
		    _G["CauldronSkillItem"..i.."SkillCooldown"]:SetHeight(50);

		    -- rescale the icon frame
		    _G["CauldronSkillItem"..i.."SkillIcon"]:SetWidth(37);
		    _G["CauldronSkillItem"..i.."SkillIcon"]:SetHeight(37);

		    -- reposition the name
		    _G["CauldronSkillItem"..i.."SkillName"]:SetPoint("TOPLEFT", 62, -4);

		    -- show the category info
		    _G["CauldronSkillItem"..i.."SkillCategory"]:Show();
		end
		--]]

		skillFrame:SetID(i);
		skillFrame.skillIndex = skillInfo.index;

		-- set selection
		if self.db.realm.userdata[self.vars.playername].skills[skillName].window.selected == skillInfo.index then
			_G["CauldronSkillItem"..i.."Selection"]:Show();
		else
			_G["CauldronSkillItem"..i.."Selection"]:Hide();
		end

		-- populate the frame
		local frame = nil;

		-- set name and difficulty color
		frame = _G["CauldronSkillItem"..i.."SkillName"];
		if frame then
			local nameText = skillInfo.name;
			local skillNamePrefix = "";
			if ( ENABLE_COLORBLIND_MODE == "1" ) then
				skillNamePrefix = TradeSkillTypePrefix[skillType].." " or "";
			end
			frame:SetText(skillNamePrefix..nameText);
			if TradeSkillTypeColor then
				local color = TradeSkillTypeColor[skillInfo.difficulty];
				if color then
					frame:SetFontObject(color.font);
					frame.r = color.r;
					frame.g = color.g;
					frame.b = color.b;
				end
			end
		end

		-- set category
		frame = _G["CauldronSkillItem"..i.."SkillCategory"];
		if frame then
			frame:SetText(skillInfo.defaultCategory);
			if TradeSkillTypeColor then
				frame:SetFontObject(TradeSkillTypeColor.header.font);
				frame.r = TradeSkillTypeColor.header.r;
				frame.g = TradeSkillTypeColor.header.g;
				frame.b = TradeSkillTypeColor.header.b;
			end
		end

		-- set favorite check button
		frame = _G["CauldronSkillItem"..i.."FavoriteButton"];
		if frame then
			frame:SetChecked(self.db.realm.userdata[self.vars.playername].skills[skillName].window.skills[skillInfo.name].favorite);
			frame.skillInfo = skillInfo;

			-- set cooldown
			--[[
			frame = _G["CauldronSkillItem"..i.."SkillCooldown"];
			local cooldown = GetTradeSkillCooldown(skillInfo.index);
			if cooldown then
				if not frame:IsVisible() then
					frame:Show();
				end
				frame:SetText(SecondsToTime(cooldown));
			else
				if frame:IsVisible() then
					frame:Hide();
				end
			end
			--]]
		end

		-- set the icon
		frame = _G["CauldronSkillItem"..i.."SkillIcon"];
		if frame then
			frame:SetNormalTexture(skillInfo.icon);
			frame.itemLink = skillInfo.link;
			frame.skillIndex = skillInfo.index;
		end

		-- set the craft count
		frame = _G["CauldronSkillItem"..i.."SkillIconCount"];
		if frame then
			local minMade, maxMade = skillInfo.minMade, skillInfo.maxMade;
			if maxMade > 1 then
				if minMade == maxMade then
					frame:SetText(minMade);
				else
					frame:SetText(minMade.."-"..maxMade);
				end
				if frame:GetWidth() > 39 then
					frame:SetText("~"..floor((minMade + maxMade)/2));
				end
			else
				frame:SetText("");
			end
		end

		-- set the disclosure button texture
		frame = _G["CauldronSkillItem"..i.."DiscloseButton"];
		if frame then
			frame.skillInfo = skillInfo;
			local reagentsExpanded = self.db.realm.userdata[self.vars.playername].skills[skillName].window.skills[skillInfo.name].expanded;
	--		if reagentsExpanded then
				frame:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up");

	--			_G["CauldronSkillItem"..i.."Reagents"]:Show();

				-- fill in the tools info
				--[[
				local spellFocus = BuildColoredListString(GetTradeSkillTools(skillInfo.index));
				local toolsFrame = _G["CauldronSkillItem"..i.."ReagentsToolsInfo"];
				if spellFocus then
					toolsFrame:Show();
					toolsFrame:SetText(L["Requires"]..": "..spellFocus);
					toolsFrame:SetHeight(15);
				else
					toolsFrame:Hide();
					toolsFrame:SetText("");
					toolsFrame:SetHeight(0);
				end
				--]]

				-- fill in the reagents
				-- _G["CauldronSkillItem"..i.."Reagents"]:SetScale(0.86);

				-- get reagents table
				local reagents = skillInfo.reagents;
				local reagentCount = #reagents;

				for j=1,8 do
					local reagentFrame = _G["CauldronSkillItem"..i.."ReagentsItemDetail"..j];

					if reagentFrame then
						if j > reagentCount then
							reagentFrame:Hide();
						else
							local reagentInfo = reagents[j];

							reagentFrame.skillIndex = skillInfo.index;
							reagentFrame.reagentIndex = reagentInfo.index;
							reagentFrame.link = reagentInfo.link;

							local reagentNameFrame = _G["CauldronSkillItem"..i.."ReagentsItemDetail"..j.."Name"];
							local reagentIconFrame = _G["CauldronSkillItem"..i.."ReagentsItemDetail"..j.."IconTexture"];
							Cauldron:info("reagentIconFrame="..tostring(reagentIconFrame));
							local reagentCountFrame = _G["CauldronSkillItem"..i.."ReagentsItemDetail"..j.."Count"];

							-- PARANOIA: check if the reagent name, icon, or link are missing
							if not reagentInfo.name or not reagentInfo.icon or not reagentInfo.link then
								-- Cauldron:error("Reagent info missing; marking recipe for rescan: "..skillInfo.name);
								Cauldron:MarkRecipeForRescan(self.db.realm.userdata[self.vars.playername].skills[skillName], skillInfo.name);
							end

							reagentFrame:Show();
							SetItemButtonTexture(reagentFrame, reagentInfo.icon);
							if reagentNameFrame then
								reagentNameFrame:SetText(reagentInfo.name);
							end

							local playerReagentCount = GetItemCount(reagentInfo.name);

							if playerReagentCount < reagentInfo.numRequired then
								-- Gray out items
								SetItemButtonTextureVertexColor(reagentFrame, 0.5, 0.5, 0.5);
								if reagentNameFrame then
									reagentNameFrame:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b);
								end
							else
								SetItemButtonTextureVertexColor(reagentFrame, 1.0, 1.0, 1.0);
								if reagentNameFrame then
									reagentNameFrame:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
								end
							end
							if playerReagentCount >= 100 then
								playerReagentCount = "*";
							end
							if reagentCountFrame then
								reagentCountFrame:SetText(playerReagentCount.."/"..reagentInfo.numRequired);
							end
						end
					end
				end

				--[[ TODO: only adjust height for expanded views
				local reagentRows = math.floor((reagentCount - 1) / 2) + 1;
				_G["CauldronSkillItem"..i.."Reagents"]:SetHeight(toolsFrame:GetHeight() + (reagentRows * _G["CauldronSkillItem"..i.."ReagentsItemDetail1"]:GetHeight()));
				_G["CauldronSkillItem"..i]:SetHeight(_G["CauldronSkillItem"..i.."SkillIcon"]:GetHeight() + _G["CauldronSkillItem"..i.."Reagents"]:GetHeight());
				--]]
			--[[
			else
				_G["CauldronSkillItem"..i.."Reagents"]:Hide();

				frame:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up");
				_G["CauldronSkillItem"..i]:SetHeight(_G["CauldronSkillItem"..i.."SkillIcon"]:GetHeight());
			end
			--]]
		end

		-- craft count
		frame = _G["CauldronSkillItem"..i.."MiscInfoCount"];
		if frame then
			local potentialCount = Cauldron:GetPotentialCraftCount(skillInfo);
			local text = "";
			if (potentialCount > 0) and (potentialCount > skillInfo.available) then
				text = skillInfo.available.."/"..potentialCount;
			elseif skillInfo.available > 0 then
				text = skillInfo.available;
			end
			frame:SetText(text);
		end

		-- special skill-ups
		frame = _G["CauldronSkillItem"..i.."MiscInfoNumSkillUpsIcon"];
		if frame then
			-- TODO
		end

		-- achievement indicator
		frame = _G["CauldronSkillItem"..i.."MiscInfoAchievement"];
		if frame then
			local achievements = Cauldron:GetAchievementsForSkill(skillInfo);
			local text = "";
			if achievements and #achievements > 0 then
				text = "A";
			end
			frame:SetText(text);
		end

		-- place the frame in the scroll view
		if i > 1 then
			-- anchor to the frame above
			skillFrame:SetPoint("TOPLEFT", _G["CauldronSkillItem"..(i-1)], "BOTTOMLEFT", 0, -2);
		else
			-- anchor to the parent
			skillFrame:SetPoint("TOPLEFT", 0, 0);
		end

		-- adjust the scroll child size
		height = height + skillFrame:GetHeight();
		CauldronSkillListScrollFrameScrollChild:SetHeight(height);

		-- show the frame
		skillFrame:Show();
	end

	-- hide any remaining frames
	local j = #skillList + 1;
	while true do
		local frame = _G["CauldronSkillItem"..j];
		if not frame then
			break;
		end

		frame:Hide();
		frame:SetHeight(0);

		j = j + 1;
	end

end

function Cauldron:UpdateButtons()

	if IsTradeSkillLinked() then
		CauldronQueueAllButton:Disable();
		CauldronQueueButton:Disable();
		-- CauldronAmountDecrementButton:Hide();
		-- CauldronAmountInputBox:Hide();
		-- CauldronAmountIncrementButton:Hide();
		-- CauldronCreateAllButton:Hide();
		-- CauldronCreateButton:Hide();
		CauldronProcessButton:Disable();
		-- CauldronClearQueueButton:();
		return;
	end

		CauldronQueueAllButton:Enable();
		CauldronQueueButton:Enable();
		-- CauldronAmountDecrementButton:Show();
		-- CauldronAmountInputBox:Show();
		-- CauldronAmountIncrementButton:Show();
		-- CauldronCreateAllButton:Show();
		-- CauldronCreateButton:Show();
		-- CauldronProcessButton:();
		-- CauldronClearQueueButton:Show();

	local skillInfo = Cauldron:GetSelectedSkill();

--[[
	if skillInfo then
		CauldronCreateButton:SetText(skillInfo.verb or CREATE);
		if skillInfo.verb then
			CauldronCreateAllButton:Hide();
		end

		CauldronQueueAllButton:Enable();
		CauldronQueueButton:Enable();

		CauldronCreateButton:Show();

		if skillInfo.available ~= 0 then
			CauldronCreateAllButton:Enable();
			CauldronCreateButton:Enable();
		else
			CauldronCreateAllButton:Disable();
			CauldronCreateButton:Disable();
		end
	else
		CauldronQueueAllButton:Disable();
		CauldronQueueButton:Disable();
		CauldronCreateAllButton:Disable();
		CauldronCreateButton:Disable();
	end
--]]

	if not IsTradeSkillLinked() then
		if #CauldronQueue:GetItems(self.db.realm.userdata[self.vars.playername].queue, CURRENT_TRADESKILL) > 0 then
			CauldronProcessButton:Enable();
			CauldronClearQueueButton:Enable();
		else
			CauldronProcessButton:Disable();
			CauldronClearQueueButton:Disable();
		end
	end

end

function Cauldron:OnCauldronUpdate()

	--[[
--	self:Search();
 	local selectionIndex
 	if self.vars.selectionIndex == 0 then
 		selectionIndex = self:GetFirstTradeSkill();
 	else
 		selectionIndex = self.vars.selectionIndex;
 	end
 	--]]

end

function Cauldron:FilterDropDown_OnLoad(dropdown)

--[[
	if CURRENT_TRADESKILL == "" or CURRENT_TRADESKILL == "UNKNOWN" then
		return;
	end
--]]

	UIDropDownMenu_Initialize(dropdown, Cauldron.FilterDropDown_Initialize);
	UIDropDownMenu_SetText(CauldronFiltersFilterDropDown, L["Filters"]);

end

function Cauldron:InvSlotDropDown_OnLoad(dropdown)

--[[
	if CURRENT_TRADESKILL == "" or CURRENT_TRADESKILL == "UNKNOWN" then
		return;
	end
--]]

	UIDropDownMenu_Initialize(dropdown, Cauldron.InvSlotDropDown_Initialize);
	UIDropDownMenu_SetText(CauldronFiltersInvSlotDropDown, L["Slots"]);

end

function Cauldron:CategoryDropDown_OnLoad(dropdown)

--[[
	if CURRENT_TRADESKILL == "" or CURRENT_TRADESKILL == "UNKNOWN" then
		return;
	end
--]]

	UIDropDownMenu_Initialize(dropdown, Cauldron.CategoryDropDown_Initialize);
	UIDropDownMenu_SetText(CauldronFiltersCategoryDropDown, L["Categories"]);

end

function Cauldron:FilterDropDown_Initialize(level)

--[[
	if CURRENT_TRADESKILL == "" or CURRENT_TRADESKILL == "UNKNOWN" then
		return;
	end
--]]

	if not Cauldron.db then
		return;
	end

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	UIDropDownMenu_SetText(CauldronFiltersFilterDropDown, L["Filters"]);

	-- reset item
	local resetFilters = {
		text = L["Reset filters"],
		checked = false,
		tooltipTitle = L["Reset filters"],
		tooltipText = L["Reset all filters on the skills list"],
		func = function(arg1, arg2) Cauldron:FilterDropDown_Reset(arg1) end,
		arg1 = "",
		arg2 = "",
	};
	UIDropDownMenu_AddButton(resetFilters);

	-- spacer
	UIDropDownMenu_AddButton({
		text = "",
		notClickable = true,
	});

	local miscTitle = {
		text = L["View"],
		isTitle = true,
		tooltipTitle = "",
		tooltipText = "",
	};
	UIDropDownMenu_AddButton(miscTitle);

	-- compact
	local compact = {
		text = L["Compact"],
		checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].options.compactView,
		tooltipTitle = L["Compact"],
		tooltipText = L["Display a compacted view of the skill list"],
		func = function(arg1, arg2) Cauldron.db.realm.userdata[Cauldron.vars.playername].options.compactView = not Cauldron.db.realm.userdata[Cauldron.vars.playername].options.compactView; Cauldron:UpdateSkillList(); end,
		arg1 = "compact",
		arg2 = "",
	};
	UIDropDownMenu_AddButton(compact);

	if not IsTradeSkillLinked() then
		-- favorites
		local faves = {
			text = L["Favorites"],
			checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.favorites,
			tooltipTitle = L["Favorites"],
			tooltipText = L["Display only favorite skills"],
			func = function(arg1, arg2) Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.favorites = not Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.favorites; Cauldron:UpdateSkillList(); end,
			arg1 = "favorite",
			arg2 = "",
		};
		UIDropDownMenu_AddButton(faves);

		-- achievements
		local achievements = {
			text = L["Achievements"],
			checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.achievements,
			tooltipTitle = L["Achievements"],
			tooltipText = L["Display only skills for achievements"],
			func = function(arg1, arg2) Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.achievements = not Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.achievements; Cauldron:UpdateSkillList(); end,
			arg1 = "achievement",
			arg2 = "",
		};
		UIDropDownMenu_AddButton(achievements);

		-- spacer
		UIDropDownMenu_AddButton({
			text = "",
			notClickable = true,
		});
	end

	-- sorting

	local sortingTitle = {
		text = L["Sort"],
		isTitle = true,
		tooltipTitle = "",
		tooltipText = "",
	};
	UIDropDownMenu_AddButton(sortingTitle);

	local sortDefault = {
		text = L["Default"],
		checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDefault,
		tooltipTitle = L["Default"],
		tooltipText = L["Set the sorting method to use on the skills list"],
		func = function(arg1, arg2) Cauldron:FilterDropDown_SetSort(arg1) end,
		arg1 = "default",
		arg2 = "",
	};
	UIDropDownMenu_AddButton(sortDefault);

	local sortAlpha = {
		text = L["Alphabetically"],
		checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortAlpha,
		tooltipTitle = L["Alphabetically"],
		tooltipText = L["Set the sorting method to use on the skills list"],
		func = function(arg1, arg2) Cauldron:FilterDropDown_SetSort(arg1) end,
		arg1 = "alpha",
		arg2 = "",
	};
	UIDropDownMenu_AddButton(sortAlpha);

	local sortDifficulty = {
		text = L["By difficulty"],
		checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDifficulty,
		tooltipTitle = L["By difficulty"],
		tooltipText = L["Set the sorting method to use on the skills list"],
		func = function(arg1, arg2) Cauldron:FilterDropDown_SetSort(arg1) end,
		arg1 = "difficulty",
		arg2 = "",
	};
	UIDropDownMenu_AddButton(sortDifficulty);

	local sortItemLevel = {
		text = L["By item level"],
		checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortItemLevel,
		tooltipTitle = L["By item level"],
		tooltipText = L["Set the sorting method to use on the skills list"],
		func = function(arg1, arg2) Cauldron:FilterDropDown_SetSort(arg1) end,
		arg1 = "itemlevel",
		arg2 = "",
	};
	UIDropDownMenu_AddButton(sortItemLevel);

	local sortReqLevel = {
		text = L["By required level"],
		checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortRequiredLevel,
		tooltipTitle = L["By required level"],
		tooltipText = L["Set the sorting method to use on the skills list"],
		func = function(arg1, arg2) Cauldron:FilterDropDown_SetSort(arg1) end,
		arg1 = "reqlevel",
		arg2 = "",
	};
	UIDropDownMenu_AddButton(sortReqLevel);

	--[[
	local sortFaves = {
		text = L["By favorites"],
		checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortFavorites,
		tooltipTitle = L["By favorites"],
		tooltipText = L["Set the sorting method to use on the skills list"],
		func = function(arg1, arg2) Cauldron:FilterDropDown_SetSort(arg1) end,
		arg1 = "favorite",
		arg2 = "",
	};
	UIDropDownMenu_AddButton(sortFaves);
	--]]

	--[[
	local sortBenefit = {
		text = L["By benefit"],
		checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[CURRENT_TRADESKILL].window.filter.sortBenefit,
		tooltipTitle = L["By benefit"],
		tooltipText = L["Set the sorting method to use on the skills list"],
		func = function(arg1, arg2) Cauldron:FilterDropDown_SetSort(arg1) end,
		arg1 = "benefit",
		arg2 = "",
	};
	UIDropDownMenu_AddButton(sortBenefit);
	--]]

	-- spacer
	UIDropDownMenu_AddButton({
		text = "",
		notClickable = true,
	});

	-- skill difficulty

	local difficultyTitle = {
		text = L["Difficulty"],
		isTitle = true,
		tooltipTitle = "",
		tooltipText = "",
	};
	UIDropDownMenu_AddButton(difficultyTitle);

	local difficultyOptimal = {
		text = L["Optimal"],
--		textR = 1.0,
--		textG = 1.0,
--		textB = 1.0,
		checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.optimal,
--		keepShownOnClick = true,
		tooltipTitle = L["Optimal"],
		tooltipText = L["Set whether items of this difficulty level should be shown"],
		func = function(arg1, arg2) Cauldron:FilterDropDown_ToggleDifficulty(arg1) end,
		arg1 = "optimal",
		arg2 = "",
	};
	UIDropDownMenu_AddButton(difficultyOptimal);

	local difficultyMedium = {
		text = L["Medium"],
--		textR = 1.0,
--		textG = 1.0,
--		textB = 1.0,
		checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.medium,
--		keepShownOnClick = true,
		tooltipTitle = L["Medium"],
		tooltipText = L["Set whether items of this difficulty level should be shown"],
		func = function(arg1, arg2) Cauldron:FilterDropDown_ToggleDifficulty(arg1) end,
		arg1 = "medium",
		arg2 = "",
	};
	UIDropDownMenu_AddButton(difficultyMedium);

	local difficultyEasy = {
		text = L["Easy"],
--		textR = 1.0,
--		textG = 1.0,
--		textB = 1.0,
		checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.easy,
--		keepShownOnClick = true,
		tooltipTitle = L["Easy"],
		tooltipText = L["Set whether items of this difficulty level should be shown"],
		func = function(arg1, arg2) Cauldron:FilterDropDown_ToggleDifficulty(arg1) end,
		arg1 = "easy",
		arg2 = "",
	};
	UIDropDownMenu_AddButton(difficultyEasy);

	local difficultyTrivial = {
		text = L["Trivial"],
--		textR = 1.0,
--		textG = 1.0,
--		textB = 1.0,
		checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.trivial,
--		keepShownOnClick = true,
		tooltipTitle = L["Trivial"],
		tooltipText = L["Set whether items of this difficulty level should be shown"],
		func = function(arg1, arg2) Cauldron:FilterDropDown_ToggleDifficulty(arg1) end,
		arg1 = "trivial",
		arg2 = "",
	};
	UIDropDownMenu_AddButton(difficultyTrivial);

	-- spacer
	UIDropDownMenu_AddButton({
		text = "",
		notClickable = true,
	});

	-- reagents availability

	local reagentsTitle = {
		text = L["Reagents"],
		isTitle = true,
		tooltipTitle = "",
		tooltipText = "",
	};
	UIDropDownMenu_AddButton(reagentsTitle);

	-- force check "normal" if the list is linked
	if IsTradeSkillLinked() then
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveAllReagents = false;
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveKeyReagents = false;
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveAnyReagents = false;
	end

	local normal = {
		text = L["Normal"],
		checked = Cauldron:ReagentsFilterNormalCheck(),
		tooltipTitle = L["Reagents"],
		tooltipText = L["Display the normal list of skills"],
		func = function(arg1, arg2) Cauldron:FilterDropDown_SetReagentFilter(arg1) end,
		arg1 = "normal",
		arg2 = "",
	};
	UIDropDownMenu_AddButton(normal);

	if not IsTradeSkillLinked() then

		local haveAllReagents = {
			text = L["Have all"],
			checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveAllReagents,
			tooltipTitle = L["Reagents"],
			tooltipText = L["Set whether skills for which you have all the required reagents are shown in the list"],
			func = function(arg1, arg2) Cauldron:FilterDropDown_SetReagentFilter(arg1) end,
			arg1 = "all",
			arg2 = "",
		};
		UIDropDownMenu_AddButton(haveAllReagents);

		local haveKeyReagents = {
			text = L["Have key"],
			checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveKeyReagents,
			tooltipTitle = L["Reagents"],
			tooltipText = L["Set whether skills for which you have all key reagents (non-vendor available) are shown in the list"],
			func = function(arg1, arg2) Cauldron:FilterDropDown_SetReagentFilter(arg1) end,
			arg1 = "key",
			arg2 = "",
		};
		UIDropDownMenu_AddButton(haveKeyReagents);

		local haveAnyReagents = {
			text = L["Have any"],
			checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveAnyReagents,
			tooltipTitle = L["Reagents"],
			tooltipText = L["Set whether skills for which you have any reagents are shown in the list"],
			func = function(arg1, arg2) Cauldron:FilterDropDown_SetReagentFilter(arg1) end,
			arg1 = "any",
			arg2 = "",
		};
		UIDropDownMenu_AddButton(haveAnyReagents);

	end

end

function Cauldron:FilterDropDown_Reset()

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	-- sorting
	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDefault = true;
	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortAlpha = false;
	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDifficulty = false;
	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortBenefit = false;

	-- difficulty
	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.optimal = true;
	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.medium = true;
	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.easy = true;
	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.trivial = true;

	-- favorites
	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.favorites = false;
	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.favoritesAtTop = false;

	-- availability
	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveAllReagents = false;
	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveKeyReagents = false;
	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveAnyReagents = false;

	-- update the UI
	Cauldron:UpdateSkillList();

end

function Cauldron:FilterDropDown_SetSort(info)

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	local sort = info.arg1;

	if sort == "default" then
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDefault = true;
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortAlpha = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDifficulty = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortItemLevel = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortRequiredLevel = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortFavorites = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortBenefit = false;
	elseif sort == "alpha" then
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDefault = false;
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortAlpha = true;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDifficulty = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortItemLevel = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortRequiredLevel = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortFavorites = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortBenefit = false;
	elseif sort == "difficulty" then
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDefault = false;
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortAlpha = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDifficulty = true;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortItemLevel = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortRequiredLevel = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortFavorites = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortBenefit = false;
	elseif sort == "itemlevel" then
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDefault = false;
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortAlpha = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDifficulty = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortItemLevel = true;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortRequiredLevel = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortFavorites = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortBenefit = false;
	elseif sort == "reqlevel" then
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDefault = false;
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortAlpha = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDifficulty = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortItemLevel = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortRequiredLevel = true;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortFavorites = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortBenefit = false;
	elseif sort == "benefit" then
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDefault = false;
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortAlpha = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDifficulty = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortItemLevel = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortRequiredLevel = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortFavorites = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortBenefit = true;
	elseif sort == "favorite" then
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDefault = false;
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortAlpha = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortDifficulty = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortItemLevel = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortRequiredLevel = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortFavorites = true;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.sortBenefit = false;
	end

	-- update the UI
	Cauldron:UpdateSkillList();

end

function Cauldron:ReagentsFilterNormalCheck()

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	local checked = true;

	if Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveAllReagents or
	   Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveKeyReagents or
	   Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveAnyReagents then
	   	checked = false;
	end

	return checked;
end

function Cauldron:FilterDropDown_SetReagentFilter(info)

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	local reagents = info.arg1;

	if reagents == "normal" then
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveAllReagents = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveKeyReagents = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveAnyReagents = false;
	elseif reagents == "all" then
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveAllReagents = true;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveKeyReagents = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveAnyReagents = false;
	elseif reagents == "key" then
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveAllReagents = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveKeyReagents = true;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveAnyReagents = false;
	elseif reagents == "any" then
		Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveAllReagents = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveKeyReagents = false;
	   	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter.haveAnyReagents = true;
	end

	-- update the UI
	Cauldron:UpdateSkillList();

end

function Cauldron:FilterDropDown_ToggleDifficulty(info)

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.filter[info.arg1] = not Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[CURRENT_TRADESKILL].window.filter[info.arg1];

	-- update the UI
	Cauldron:UpdateSkillList();

end

function Cauldron:InvSlotDropDown_Initialize(level)
	Cauldron:debug("InvSlotDropDown_Initialize enter");

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	UIDropDownMenu_SetText(CauldronFiltersInvSlotDropDown, L["Slots"]);

	local all = UIDropDownMenu_CreateInfo();
	all.text = ALL_INVENTORY_SLOTS; -- L["All slots"],
	all.func = function(arg1, arg2) Cauldron:InvSlotDropDown_SetSlot(arg1) end;
	all.arg1 = "all";
	UIDropDownMenu_AddButton(all);

	local slots = Cauldron:GetSlots(Cauldron.vars.playername, skillName);
	Cauldron:debug("InvSlotDropDown_Initialize: slots="..#slots);

	--[[
	if slots["none"] then
		local none = UIDropDownMenu_CreateInfo();
		none.text = L["(None)"];
		none.checked = slots.none.checked;
		none.func = function(arg1, arg2) Cauldron:InvSlotDropDown_SetSlot(arg1) end;
		none.arg1 = "none";
		UIDropDownMenu_AddButton(none);
	end
	--]]

	for name, _ in pairs(slots) do
		Cauldron:debug("InvSlotDropDown_Initialize: name="..tostring(name));
		if name ~= "" then
			local slot = UIDropDownMenu_CreateInfo();
			slot.text = _G[name] or L["(None)"];
			slot.checked = slots[name].checked;
			slot.func = function(arg1, arg2) Cauldron:InvSlotDropDown_SetSlot(arg1) end;
			slot.arg1 = name;
			UIDropDownMenu_AddButton(slot);
		end
	end

	Cauldron:debug("InvSlotDropDown_Initialize exit");
end

function Cauldron:SlotsFilterAllCheck()
	Cauldron:debug("SlotsFilterAllCheck enter");

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	local checked = true;

	if Cauldron.db then
		for name, slotInfo in pairs(Cauldron:GetSlots(Cauldron.vars.playername, skillName)) do
			if slotInfo.checked then
				checked = false;
				Cauldron:debug("breaking from slot check");
				break;
			end
		end
	end

	self:debug("SlotsFilterAllCheck exit");

	return checked;
end

function Cauldron:InvSlotDropDown_SetSlot(info)
	-- self:debug("InvSlotDropDown_SetSlot enter");

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	Cauldron:debug("InvSlotDropDown_SetSlot: info.arg1="..info.arg1);

	local slots = Cauldron:GetSlots(Cauldron.vars.playername, skillName);

	if info.arg1 == "all" then
		Cauldron:debug("InvSlotDropDown_SetSlot: selecting all slots...");
--		slots["(None)"] = true;
		for name, slotInfo in pairs(slots) do
			Cauldron:debug("InvSlotDropDown_SetSlot: name="..name);
			slotInfo.checked = true;
		end
	--[[
	elseif info.arg1 == "none" then
		Cauldron:debug("InvSlotDropDown_SetSlot: selecting special 'none' slot...");
--		local slotName = "(None)";
		if not slots[slotName] then
			slots[slotName] = true;
		else
			slots[slotName] = not slots[slotName];
		end
	--]]
	else
		self:debug("InvSlotDropDown_SetSlot: select a specific slot: "..info.arg1);
		for name, slotInfo in pairs(slots) do
			Cauldron:debug("InvSlotDropDown_SetSlot: name="..name);
			slotInfo.checked = false;
		end
		slots[info.arg1].checked = true;
--		if not Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.slots[info.arg1] then
--			Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.slots[info.arg1] = true;
--		else
--			Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.slots[info.arg1] = not Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.slots[info.arg1];
--		end
	end

	Cauldron:UpdateSkillList();

	Cauldron:debug("InvSlotDropDown_SetSlot exit");
end

function Cauldron:CategoryDropDown_Initialize(level)

--[[
	if CURRENT_TRADESKILL == "" or CURRENT_TRADESKILL == "UNKNOWN" then
		return;
	end
--]]

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	UIDropDownMenu_SetText(CauldronFiltersCategoryDropDown, L["Categories"]);

	local all = {
		text = L["All categories"],
		checked = false, -- Cauldron:CategoriesFilterAllCheck(),
		tooltipTitle = L["All categories"],
		func = function(arg1, arg2) Cauldron:CategoryDropDown_SetCategory(arg1) end,
		arg1 = "all",
		arg2 = "",
	};
	UIDropDownMenu_AddButton(all);

	local none = {
		text = L["No categories"],
		checked = false, -- Cauldron:CategoriesFilterAllCheck(),
		tooltipTitle = L["No categories"],
		func = function(arg1, arg2) Cauldron:CategoryDropDown_SetCategory(arg1) end,
		arg1 = "none",
		arg2 = "",
	};
	UIDropDownMenu_AddButton(none);

	local categories = Cauldron:GetDefaultCategories(Cauldron.vars.playername, skillName);

	-- sort the category list by alpha
	local c = {};
	for name, _ in pairs(categories) do
		table.insert(c, name);
	end

	table.sort(c);

	for i, name in ipairs(c) do
		local category = {
			text = name,
			checked = Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.categories[name].shown,
			tooltipTitle = name,
			func = function(arg1, arg2) Cauldron:CategoryDropDown_SetCategory(arg1) end,
			arg1 = name,
			arg2 = "",
		};
		UIDropDownMenu_AddButton(category);
	end

end

--[[
function Cauldron:CategoriesFilterAllCheck()
	self:debug("CategoriesFilterAllCheck enter");

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	local checked = true;

	for name, _ in pairs(Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.categories) do
		if Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.categories[name] then
			checked = false;
			break;
		end
	end

	self:debug("CategoriesFilterAllCheck exit");

	return checked;
end
--]]

function Cauldron:CategoryDropDown_SetCategory(info)

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	if info.arg1 == "all" or info.arg1 == "none" then
		for name, _ in pairs(Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.categories) do
			local checked = (info.arg1 == "all");
			Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.categories[name].shown = checked;
		end
	else
		if not IsShiftKeyDown() then
			-- uncheck everything
			for name, _ in pairs(Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.categories) do
				Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.categories[name].shown = false;
			end

			-- check the clicked item
			Cauldron.db.realm.userdata[self.vars.playername].skills[skillName].window.categories[info.arg1].shown = true;
		else
			Cauldron.db.realm.userdata[self.vars.playername].skills[skillName].window.categories[info.arg1].shown = not Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[CURRENT_TRADESKILL].window.categories[info.arg1].shown;
		end
	end

	-- update the UI
	Cauldron:UpdateSkillList();

end

function Cauldron:CollapseAllButton_OnClick(button)

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

    local expand = true;
    local skillCount = 0;
    local expandedCount = 0;
    local collapsedCount = 0;

    -- check if some items are expanded
	for name, info in pairs(Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.skills) do
		if info.expanded then
		    expandedCount = expandedCount + 1;
		else
		    collapsedCount = collapsedCount + 1;
		end
		skillCount = skillCount + 1;
	end

	if expandedCount == 0 then
	    expand = true;
	elseif collapsedCount == 0 then
	    expand = false;
	end

	-- reset all the expanded fields to false
	for name, info in pairs(Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.skills) do
		info.expanded = expand;
	end

	-- unselect the selected skill
	-- Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.selected = 0;

	-- update the UI
	Cauldron:UpdateSkillList();

end

function Cauldron:CollapseItemButton_OnClick(button)

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	local skillInfo = button.skillInfo;

	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.skills[skillInfo.name].expanded = not Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.skills[skillInfo.name].expanded;
	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.selected = skillInfo.index;

	-- update the UI
	Cauldron:UpdateSkillList();

end

function Cauldron:SkillItem_OnEnter(frame)

	local id = frame:GetID();

	local name = _G["CauldronSkillItem"..id.."SkillName"];
	if name then
--		name:
	end

	-- TODO

end

function Cauldron:SkillItem_OnLeave(frame)

-- TODO

end

function Cauldron:SkillItem_OnClick(frame, button, down)

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	-- select this frame
	if frame.skillIndex then
    	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.selected = frame.skillIndex;
    end

	-- update the UI
	Cauldron:UpdateSkillList();
	Cauldron:UpdateButtons();

end

function Cauldron:TradeSkillFilter_OnTextChanged(frame)

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	if (not skillName or skillName == "UNKNOWN") or
	   (not self.vars.playername) or
	   (not self.db.realm.userdata[self.vars.playername]) or
	   (not self.db.realm.userdata[self.vars.playername].skills[skillName]) then
		return;
	end

	local text = frame:GetText();
	if text == SEARCH then
		text = "";
	end

	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.search = text;

	-- update the UI
	Cauldron:UpdateSkillList();

end

function Cauldron:AmountDecrement_OnClick()

	local num = CauldronAmountInputBox:GetNumber();
	num = math.max(1, num - 1);
	CauldronAmountInputBox:SetNumber(num);

end

function Cauldron:AmountIncrement_OnClick()

	local num = CauldronAmountInputBox:GetNumber();
	num = math.min(999, num + 1);
	CauldronAmountInputBox:SetNumber(num);

end

function Cauldron:FavoriteItemButton_OnClick(button)

	local skillName = CURRENT_TRADESKILL;
	if IsTradeSkillLinked() then
		skillName = "Linked-"..skillName;
	end

	local skillInfo = button.skillInfo;

	Cauldron.db.realm.userdata[Cauldron.vars.playername].skills[skillName].window.skills[skillInfo.name].favorite = button:GetChecked();

end

function Cauldron:ConfirmDialog(title, message, okayBtn, okayBtnCB, cancelBtn, cancelBtnCB)

	local gui = Cauldron.libs.GUI;

	-- Create a container frame
	local f = gui:Create("Frame");
	f:SetCallback("OnClose", function(widget) gui:Release(widget) end);
	f:SetTitle(title);
	f:SetStatusText("");
	f:SetLayout("Flow");
	f:SetWidth(200);
	f:SetHeight(100);

	-- Create okay button
	local btn = gui:Create("Button")
	btn:SetWidth(170);
	btn:SetText(okayBtn);
	btn:SetCallback("OnClick", okayBtnCB); -- TODO wrap this callback in another that will close the window
	-- Add the button to the container
	f:AddChild(btn);

	-- Create cancel button
	local btn = gui:Create("Button")
	btn:SetWidth(170);
	btn:SetText(cancelBtn);
	btn:SetCallback("OnClick", cancelBtnCB); -- TODO wrap this callback in another that will close the window
	-- Add the button to the container
	f:AddChild(btn);

	f:Show();
end

function Cauldron:AppendToTooltip(tooltip, skillIndex)
	if not tooltip then
		return;
	end
	if not skillIndex then
		return;
	end


end