Quantcast

Move ARLFrame.lua to Frame.lua. Update a few engineering things.

Ackis [12-09-09 - 22:54]
Move ARLFrame.lua to Frame.lua.  Update a few engineering things.
Filename
ARLFrame.lua
AckisRecipeList.toc
Frame.lua
RecipeDB/ARL-Engineer.lua
diff --git a/ARLFrame.lua b/ARLFrame.lua
deleted file mode 100644
index 8d49045..0000000
--- a/ARLFrame.lua
+++ /dev/null
@@ -1,4297 +0,0 @@
--------------------------------------------------------------------------------
--- ARLFrame.lua		Frame functions for all of AckisRecipeList
--------------------------------------------------------------------------------
--- File date: @file-date-iso@
--- File revision: @file-revision@
--- Project revision: @project-revision@
--- Project version: @project-version@
--------------------------------------------------------------------------------
--- Please see http://www.wowace.com/projects/arl/for more information.
--------------------------------------------------------------------------------
--- License:
---	Please see LICENSE.txt
-
--- This source code is released under All Rights Reserved.
--------------------------------------------------------------------------------
---- **AckisRecipeList** provides an interface for scanning professions for missing recipes.
--- There are a set of functions which allow you make use of the ARL database outside of ARL.
--- ARL supports all professions currently in World of Warcraft 3.2
--- @class file
--- @name ARLFrame.lua
--------------------------------------------------------------------------------
-
--------------------------------------------------------------------------------
--- Localized Lua globals.
--------------------------------------------------------------------------------
-local _G = getfenv(0)
-
-local string = _G.string
-local sformat = string.format
-local strlower = string.lower
-local smatch = string.match
-
-local select = _G.select
-local type = _G.type
-
-local table = _G.table
-local twipe = table.wipe
-local tinsert, tremove = table.insert, table.remove
-local ipairs, pairs = _G.ipairs, _G.pairs
-
-local math = _G.math
-local floor = math.floor
-
-local tonumber = _G.tonumber
-local tostring = _G.tostring
-
--------------------------------------------------------------------------------
--- Localized Blizzard API.
--------------------------------------------------------------------------------
-
--------------------------------------------------------------------------------
--- AddOn namespace.
--------------------------------------------------------------------------------
-local LibStub = LibStub
-
-local MODNAME		= "Ackis Recipe List"
-local addon		= LibStub("AceAddon-3.0"):GetAddon(MODNAME)
-
-local BFAC		= LibStub("LibBabble-Faction-3.0"):GetLookupTable()
-local L			= LibStub("AceLocale-3.0"):GetLocale(MODNAME)
-local QTip		= LibStub("LibQTip-1.0")
-
-local Player		= addon.Player
-
--------------------------------------------------------------------------------
--- Constants
--------------------------------------------------------------------------------
-local SortedProfessions = {	-- To make tabbing between professions easier
-	{ name = GetSpellInfo(51304),	texture = "alchemy" },		-- 1
-	{ name = GetSpellInfo(51300),	texture = "blacksmith" },	-- 2
-	{ name = GetSpellInfo(51296),	texture = "cooking" },		-- 3
-	{ name = GetSpellInfo(51313),	texture = "enchant" },		-- 4
-	{ name = GetSpellInfo(51306),	texture = "engineer" },		-- 5
-	{ name = GetSpellInfo(45542),	texture = "firstaid" },		-- 6
-	{ name = GetSpellInfo(45363),	texture = "inscribe" },		-- 7
-	{ name = GetSpellInfo(51311),	texture = "jewel" },		-- 8
-	{ name = GetSpellInfo(51302),	texture = "leather" },		-- 9
-	{ name = GetSpellInfo(53428),	texture = "runeforge" },	-- 10
-	{ name = GetSpellInfo(32606),	texture = "smelting" },		-- 11
-	{ name = GetSpellInfo(51309),	texture = "tailor" },		-- 12
-}
-
-local CATEGORY_TEXT = {
-	["general"]	= _G.GENERAL,
-	["obtain"]	= L["Obtain"],
-	["binding"]	= L["Binding"],
-	["item"]	= L["Item"],
-	["player"]	= _G.ROLE,
-	["rep"]		= _G.REPUTATION,
-	["misc"]	= _G.MISCELLANEOUS
-}
-
-local NUM_PROFESSIONS		= 12
-local NUM_RECIPE_LINES		= 24			-- Number of visible lines in the scrollframe.
-local SEASONAL_CATEGORY		= GetCategoryInfo(155)	-- Localized string - "World Events"
-
-local MAINPANEL_NORMAL_WIDTH	= 293
-local MAINPANEL_EXPANDED_WIDTH	= 444
-
-local FILTERMENU_SINGLE_WIDTH	= 136
-local FILTERMENU_DOUBLE_WIDTH	= 300
-local FILTERMENU_HEIGHT		= 312
-
-local FILTERMENU_SMALL		= 112
-local FILTERMENU_LARGE		= 210
-
-local FACTION_HORDE		= BFAC["Horde"]
-local FACTION_ALLIANCE		= BFAC["Alliance"]
-local FACTION_NEUTRAL		= BFAC["Neutral"]
-
--------------------------------------------------------------------------------
--- Acquire flag constants.
--------------------------------------------------------------------------------
-local A_TRAINER, A_VENDOR, A_MOB, A_QUEST, A_SEASONAL, A_REPUTATION, A_WORLD_DROP, A_CUSTOM, A_PVP, A_MAX = 1, 2, 3, 4, 5, 6, 7, 8, 9, 9
-
--------------------------------------------------------------------------------
--- Filter flag constants.
--------------------------------------------------------------------------------
-local F_ALLIANCE, F_HORDE, F_TRAINER, F_VENDOR, F_INSTANCE, F_RAID = 1, 2, 3, 4, 5, 6
-local F_SEASONAL, F_QUEST, F_PVP, F_WORLD_DROP, F_MOB_DROP, F_DISC = 7, 8, 9, 10, 11, 12
-local F_IBOE, F_IBOP, F_IBOA, F_RBOE, F_RBOP, F_RBOA = 36, 37, 38, 40, 41, 42
-
-local BINDING_FLAGS = {
-	[F_IBOE] = L["BOEFilter"],
-	[F_IBOP] = L["BOPFilter"],
-	[F_IBOA] = L["BOAFilter"],
-	[F_RBOE] = L["RecipeBOEFilter"],
-	[F_RBOP] = L["RecipeBOPFilter"],
-	[F_RBOA] = L["RecipeBOAFilter"]
-}
-
--------------------------------------------------------------------------------
--- Define the static popups we're going to call when people haven't scanned or
--- when current filters are blocking all recipes from being displayed.
--------------------------------------------------------------------------------
-StaticPopupDialogs["ARL_NOTSCANNED"] = {
-	text = L["NOTSCANNED"],
-	button1 = _G.OKAY,
-	timeout = 0,
-	exclusive = 1,
-	whileDead = 1,
-	hideOnEscape = 1
-}
-
-StaticPopupDialogs["ARL_ALLFILTERED"] = {
-	text = L["ALL_FILTERED"],
-	button1 = _G.OKAY,
-	timeout = 0,
-	exclusive = 1,
-	whileDead = 1,
-	hideOnEscape = 1
-}
-
-StaticPopupDialogs["ARL_ALLKNOWN"] = {
-	text = L["ARL_ALLKNOWN"],
-	button1 = _G.OKAY,
-	timeout = 0,
-	exclusive = 1,
-	whileDead = 1,
-	hideOnEscape = 1
-}
-
-StaticPopupDialogs["ARL_ALLEXCLUDED"] = {
-	text = L["ARL_ALLEXCLUDED"],
-	button1 = _G.OKAY,
-	timeout = 0,
-	exclusive = 1,
-	whileDead = 1,
-	hideOnEscape = 1
-}
-
-StaticPopupDialogs["ARL_SEARCHFILTERED"] = {
-	text = L["ARL_SEARCHFILTERED"],
-	button1 = _G.OKAY,
-	timeout = 0,
-	exclusive = 1,
-	whileDead = 1,
-	hideOnEscape = 1
-}
-
--------------------------------------------------------------------------------
--- Variables
--------------------------------------------------------------------------------
-local FilterValueMap		-- Assigned in addon:InitializeFrame()
-
-local ARL_SearchText, ARL_LastSearchedText
-
--------------------------------------------------------------------------------
--- Upvalues
--------------------------------------------------------------------------------
-local ReDisplay
-
--------------------------------------------------------------------------------
--- Table cache mechanism
--------------------------------------------------------------------------------
-local AcquireTable, ReleaseTable
-do
-	local table_cache = {}
-
-	-- Returns a table
-	function AcquireTable()
-		local tbl = tremove(table_cache) or {}
-		return tbl
-	end
-
-	-- Cleans the table and stores it in the cache
-	function ReleaseTable(tbl)
-		if not tbl then return end
-		twipe(tbl)
-		tinsert(table_cache, tbl)
-	end
-end	-- do block
-
--------------------------------------------------------------------------------
--- Close all possible pop-up windows
--------------------------------------------------------------------------------
-function addon:ClosePopups()
-	StaticPopup_Hide("ARL_NOTSCANNED")
-	StaticPopup_Hide("ARL_ALLFILTERED")
-	StaticPopup_Hide("ARL_ALLKNOWN")
-	StaticPopup_Hide("ARL_ALLEXCLUDED")
-	StaticPopup_Hide("ARL_SEARCHFILTERED")
-end
-
--------------------------------------------------------------------------------
--- Sets show and hide scripts as well as text for a tooltip for the given frame.
--------------------------------------------------------------------------------
-local SetTooltipScripts
-do
-	local function Show_Tooltip(frame, motion)
-		GameTooltip_SetDefaultAnchor(GameTooltip, frame)
-		GameTooltip:SetText(frame.tooltip_text, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b)
-		GameTooltip:Show()
-	end
-
-	local function Hide_Tooltip()
-		GameTooltip:Hide()
-	end
-
-	function SetTooltipScripts(frame, textLabel)
-		frame.tooltip_text = textLabel
-
-		frame:SetScript("OnEnter", Show_Tooltip)
-		frame:SetScript("OnLeave", Hide_Tooltip)
-	end
-end	-- do
-
--------------------------------------------------------------------------------
--- Generic function for creating buttons.
--------------------------------------------------------------------------------
-local GenericCreateButton
-do
-	-- I hate stretchy buttons. Thanks very much to ckknight for this code
-	-- (found in RockConfig)
-
-	-- when pressed, the button should look pressed
-	local function button_OnMouseDown(this)
-		if this:IsEnabled() then
-			this.left:SetTexture([[Interface\Buttons\UI-Panel-Button-Down]])
-			this.middle:SetTexture([[Interface\Buttons\UI-Panel-Button-Down]])
-			this.right:SetTexture([[Interface\Buttons\UI-Panel-Button-Down]])
-		end
-	end
-
-	-- when depressed, return to normal
-	local function button_OnMouseUp(this)
-		if this:IsEnabled() then
-			this.left:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
-			this.middle:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
-			this.right:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
-		end
-	end
-
-	local function button_Disable(this)
-		this.left:SetTexture([[Interface\Buttons\UI-Panel-Button-Disabled]])
-		this.middle:SetTexture([[Interface\Buttons\UI-Panel-Button-Disabled]])
-		this.right:SetTexture([[Interface\Buttons\UI-Panel-Button-Disabled]])
-		this:__Disable()
-		this:EnableMouse(false)
-	end
-
-	local function button_Enable(this)
-		this.left:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
-		this.middle:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
-		this.right:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
-		this:__Enable()
-		this:EnableMouse(true)
-	end
-
-	function GenericCreateButton(bName, parentFrame, bHeight, bWidth, bNormFont, bHighFont, initText, tAlign, tooltipText, noTextures)
-		local button = CreateFrame("Button", bName, parentFrame)
-
-		button:SetWidth(bWidth)
-		button:SetHeight(bHeight)
-
-		if noTextures == 1 then
-			local left = button:CreateTexture(nil, "BACKGROUND")
-			button.left = left
-			left:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
-
-			local middle = button:CreateTexture(nil, "BACKGROUND")
-			button.middle = middle
-			middle:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
-
-			local right = button:CreateTexture(nil, "BACKGROUND")
-			button.right = right
-			right:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
-
-			left:SetPoint("TOPLEFT")
-			left:SetPoint("BOTTOMLEFT")
-			left:SetWidth(12)
-			left:SetTexCoord(0, 0.09375, 0, 0.6875)
-
-			right:SetPoint("TOPRIGHT")
-			right:SetPoint("BOTTOMRIGHT")
-			right:SetWidth(12)
-			right:SetTexCoord(0.53125, 0.625, 0, 0.6875)
-
-			middle:SetPoint("TOPLEFT", left, "TOPRIGHT")
-			middle:SetPoint("BOTTOMRIGHT", right, "BOTTOMLEFT")
-			middle:SetTexCoord(0.09375, 0.53125, 0, 0.6875)
-
-			button:SetScript("OnMouseDown", button_OnMouseDown)
-			button:SetScript("OnMouseUp", button_OnMouseUp)
-
-			button.__Enable = button.Enable
-			button.__Disable = button.Disable
-			button.Enable = button_Enable
-			button.Disable = button_Disable
-
-			local highlight = button:CreateTexture(nil, "OVERLAY", "UIPanelButtonHighlightTexture")
-			button:SetHighlightTexture(highlight)
-		elseif noTextures == 2 then
-			button:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up")
-			button:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-Down")
-			button:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
-			button:SetDisabledTexture("Interface\\Buttons\\UI-PlusButton-Disabled")
-		elseif noTextures == 3 then
-			button:SetNormalTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Up")
-			button:SetPushedTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Down")
-			button:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
-			button:SetDisabledTexture("Interface\\Buttons\\UI-PlusButton-Disabled")
-		end
-
-		local text = button:CreateFontString(nil, "ARTWORK")
-		button:SetFontString(text)
-		button.text = text
-		text:SetPoint("LEFT", button, "LEFT", 7, 0)
-		text:SetPoint("RIGHT", button, "RIGHT", -7, 0)
-		text:SetJustifyH(tAlign)
-
-		text:SetFontObject(bNormFont)
-		text:SetText(initText)
-
-		if tooltipText and tooltipText ~= "" then
-			SetTooltipScripts(button, tooltipText)
-		end
-		return button
-	end
-end	-- do
-
--------------------------------------------------------------------------------
--- Sort functions
--------------------------------------------------------------------------------
-local SortRecipeList
-do
-	addon.sorted_recipes = {}
-
-	local recipe_list = addon.recipe_list
-
-	local function Sort_SkillAsc(a, b)
-		local reca, recb = recipe_list[a], recipe_list[b]
-
-		if reca["Level"] == recb["Level"] then
-			return reca["Name"] < recb["Name"]
-		else
-			return reca["Level"] < recb["Level"]
-		end
-	end
-
-	local function Sort_SkillDesc(a, b)
-		local reca, recb = recipe_list[a], recipe_list[b]
-
-		if reca["Level"] == recb["Level"] then
-			return reca["Name"] < recb["Name"]
-		else
-			return recb["Level"] < reca["Level"]
-		end
-	end
-
-	local function Sort_Name(a, b)
-		return recipe_list[a]["Name"] < recipe_list[b]["Name"]
-	end
-
-	-- Will only sort based off of the first acquire type
-	local function Sort_Acquisition(a, b)
-		local reca = recipe_list[a]["Acquire"][1]
-		local recb = recipe_list[b]["Acquire"][1]
-
-		if not reca or not recb then
-			return not not reca
-		end
-
-		if reca["Type"] ~= recb["Type"] then
-			return reca["Type"] < recb["Type"]
-		end
-
-		if reca["Type"] == A_CUSTOM then
-			if reca["ID"] == recb["ID"] then
-				return recipe_list[a]["Name"] < recipe_list[b]["Name"]
-			else
-				return reca["ID"] < recb["ID"]
-			end
-		else
-			return recipe_list[a]["Name"] < recipe_list[b]["Name"]
-		end
-	end
-
-	local function Sort_Location(a, b)
-		-- We do the or "" because of nil's, I think this would be better if I just left it as a table which was returned
-		local reca = recipe_list[a]["Locations"] or ""
-		local recb = recipe_list[b]["Locations"] or ""
-
-		reca = smatch(reca,"(%w+), ") or reca
-		recb = smatch(recb,"(%w+), ") or recb
-
-		if reca == recb then
-			return Sort_Acquisition(a, b)
-		else
-			return reca < recb
-		end
-	end
-
-	local sortFuncs = {
-		["SkillAsc"]	= Sort_SkillAsc,
-		["SkillDesc"]	= Sort_SkillDesc,
-		["Name"]	= Sort_Name,
-		["Acquisition"]	= Sort_Acquisition,
-		["Location"]	= Sort_Location,
-	}
-
-	-- Sorts the recipe list according to configuration settings.
-	function SortRecipeList()
-		local sorted_recipes = addon.sorted_recipes
-		twipe(sorted_recipes)
-
-		for n, v in pairs(addon.recipe_list) do
-			tinsert(sorted_recipes, n)
-		end
-		table.sort(sorted_recipes, sortFuncs[addon.db.profile.sorting])
-	end
-end	-- do
-
--------------------------------------------------------------------------------
--- Tooltip functions and data.
--------------------------------------------------------------------------------
-local spell_tip = CreateFrame("GameTooltip", "arlSpellTooltip", UIParent, "GameTooltipTemplate")
-local acquire_tip
-
--- Font Objects needed for acquire_tip
-local narrowFont
-local normalFont
-
-local GenerateTooltipContent
-do
-	-- Fallback in case the user doesn't have LSM-3.0 installed
-	if not LibStub:GetLibrary("LibSharedMedia-3.0", true) then
-
-		local locale = GetLocale()
-		-- Fix for font issues on koKR
-		if locale == "koKR" then
-			narrowFont = "Fonts\\2002.TTF"
-			normalFont = "Fonts\\2002.TTF"
-		else
-			narrowFont = "Fonts\\ARIALN.TTF"
-			normalFont = "Fonts\\FRIZQT__.TTF"
-		end
-	else
-		-- Register LSM 3.0
-		local LSM3 = LibStub("LibSharedMedia-3.0")
-
-		narrowFont = LSM3:Fetch(LSM3.MediaType.FONT, "Arial Narrow")
-		normalFont = LSM3:Fetch(LSM3.MediaType.FONT, "Friz Quadrata TT")
-	end
-	local narrowFontObj = CreateFont(MODNAME.."narrowFontObj")
-	local normalFontObj = CreateFont(MODNAME.."normalFontObj")
-
-	-- I want to do a bit more comprehensive tooltip processing. Things like changing font sizes,
-	-- adding padding to the left hand side, and using better color handling. So... this function
-	-- will do that for me.
-	local function ttAdd(
-			leftPad,		-- number of times to pad two spaces on left side
-			textSize,		-- add to or subtract from addon.db.profile.frameopts.fontsize to get fontsize
-			narrow,			-- if 1, use ARIALN instead of FRITZQ
-			str1,			-- left-hand string
-			hexcolor1,		-- hex color code for left-hand side
-			str2,			-- if present, this is the right-hand string
-			hexcolor2)		-- if present, hex color code for right-hand side
-
-		-- are we changing fontsize or narrow?
-		local fontSize
-
-		if narrow or textSize ~= 0 then
-			local font = narrow and narrowFont or normalFont
-			local fontObj = narrow and narrowFontObj or normalFontObj
-
-			fontSize = addon.db.profile.frameopts.fontsize + textSize
-
-			fontObj:SetFont(font, fontSize)
-			acquire_tip:SetFont(fontObj)
-		end
-
-		-- Add in our left hand padding
-		local loopPad = leftPad
-		local leftStr = str1
-
-		while loopPad > 0 do
-			leftStr = "  " .. leftStr
-			loopPad = loopPad - 1
-		end
-
-		if str2 then
-			local lineNum = acquire_tip:AddLine()
-
-			acquire_tip:SetCell(lineNum, 1, "|cff"..hexcolor1..leftStr.."|r")
-			acquire_tip:SetCell(lineNum, 2, "|cff"..hexcolor2..str2.."|r", "RIGHT")
-		else
-			-- Text spans both columns - set maximum width to match fontSize to maintain uniform tooltip size. -Torhal
-			local width = math.ceil(fontSize * 37.5)
-			local lineNum = acquire_tip:AddLine()
-
-			acquire_tip:SetCell(lineNum, 1, "|cff"..hexcolor1..leftStr.."|r", nil, "LEFT", 2, nil, 0, 0, width, width)
-		end
-	end
-
-	local function SetSpellTooltip(owner, loc, link)
-		local anchor =
-		spell_tip:SetOwner(owner, "ANCHOR_NONE")
-		spell_tip:ClearAllPoints()
-
-		if loc == "Top" then
-			spell_tip:SetPoint("BOTTOMLEFT", owner, "TOPLEFT")
-		elseif loc == "Bottom" then
-			spell_tip:SetPoint("TOPLEFT", owner, "BOTTOMLEFT")
-		elseif loc == "Left" then
-			spell_tip:SetPoint("TOPRIGHT", owner, "TOPLEFT")
-		elseif loc == "Right" then
-			spell_tip:SetPoint("TOPLEFT", owner, "TOPRIGHT")
-		end
-
-		-- Add TipTac Support
-		if TipTac and TipTac.AddModifiedTip and not spell_tip.tiptac then
-			TipTac:AddModifiedTip(spell_tip)
-			spell_tip.tiptac = true
-		end
-
-		-- Set the spell tooltip's scale, and copy its other values from GameTooltip so AddOns which modify it will work.
-		spell_tip:SetBackdrop(GameTooltip:GetBackdrop())
-		spell_tip:SetBackdropColor(GameTooltip:GetBackdropColor())
-		spell_tip:SetBackdropBorderColor(GameTooltip:GetBackdropBorderColor())
-		spell_tip:SetScale(addon.db.profile.frameopts.tooltipscale)
-
-		spell_tip:SetHyperlink(link)
-		spell_tip:Show()
-	end
-
-	local function GetTipFactionInfo(comp_faction)
-		local display_tip = false
-		local color = addon:hexcolor("NEUTRAL")
-		local faction = FACTION_NEUTRAL
-
-		if comp_faction == FACTION_HORDE then
-			color = addon:hexcolor("HORDE")
-
-			if Player["Faction"] == FACTION_HORDE then
-				display_tip = true
-			else
-				faction = FACTION_HORDE
-			end
-		elseif comp_faction == FACTION_ALLIANCE then
-			color = addon:hexcolor("ALLIANCE")
-
-			if Player["Faction"] == FACTION_ALLIANCE then
-				display_tip = true
-			else
-				faction = FACTION_ALLIANCE
-			end
-		else
-			display_tip = true
-		end
-		return display_tip, color, faction
-	end
-
-	function GenerateTooltipContent(owner, rIndex)
-		local spell_tip_anchor = addon.db.profile.spelltooltiplocation
-		local acquire_tip_anchor = addon.db.profile.acquiretooltiplocation
-		local recipe_entry = addon.recipe_list[rIndex]
-		local spell_link = recipe_entry["RecipeLink"]
-		local MainPanel = addon.Frame
-
-		if acquire_tip_anchor == _G.OFF then
-			QTip:Release(acquire_tip)
-
-			-- If we have the spell link tooltip, anchor it to MainPanel instead so it shows
-			if spell_tip_anchor ~= _G.OFF and spell_link then
-				SetSpellTooltip(MainPanel, spell_tip_anchor, spell_link)
-			else
-				spell_tip:Hide()
-			end
-			return
-		end
-		acquire_tip = QTip:Acquire(MODNAME.." Tooltip", 2, "LEFT", "LEFT")
-		acquire_tip:ClearAllPoints()
-
-		if acquire_tip_anchor == "Right" then
-			acquire_tip:SetPoint("TOPLEFT", MainPanel, "TOPRIGHT")
-		elseif acquire_tip_anchor == "Left" then
-			acquire_tip:SetPoint("TOPRIGHT", MainPanel, "TOPLEFT")
-		elseif acquire_tip_anchor == "Top" then
-			acquire_tip:SetPoint("BOTTOMLEFT", MainPanel, "TOPLEFT")
-		elseif acquire_tip_anchor == "Bottom" then
-			acquire_tip:SetPoint("TOPLEFT", MainPanel, "BOTTOMLEFT")
-		elseif acquire_tip_anchor == "Mouse" then
-			local x, y = GetCursorPosition()
-			local uiscale = UIParent:GetEffectiveScale()
-
-			acquire_tip:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", x / uiscale, y / uiscale)
-		end
-
-		if TipTac and TipTac.AddModifiedTip then
-			-- Pass true as second parameter because hooking OnHide causes C stack overflows -Torhal
-			TipTac:AddModifiedTip(acquire_tip, true)
-		end
-		acquire_tip:Clear()
-		acquire_tip:SetScale(addon.db.profile.frameopts.tooltipscale)
-		acquire_tip:AddHeader()
-		acquire_tip:SetCell(1, 1, "|cff"..addon:hexcolor("HIGH")..recipe_entry["Name"], "CENTER", 2)
-
-		-- check if the recipe is excluded
-		local exclude = addon.db.profile.exclusionlist
-
-		if exclude[rIndex] then
-			ttAdd(0, -1, true, L["RECIPE_EXCLUDED"], addon:hexcolor("RED"))
-		end
-
-		-- Add in skill level requirement, colored correctly
-		local color_1 = addon:hexcolor("NORMAL")
-
-		local recipe_level = recipe_entry["Level"]
-		local skill_level = Player["ProfessionLevel"]
-		local color_2
-
-		if recipe_level > skill_level then
-			color_2 = addon:hexcolor("RED")
-		elseif skill_level - recipe_level < 20 then
-			color_2 = addon:hexcolor("ORANGE")
-		elseif skill_level - recipe_level < 30 then
-			color_2 = addon:hexcolor("YELLOW")
-		elseif skill_level - recipe_level < 40 then
-			color_2 = addon:hexcolor("GREEN")
-		else
-			color_2 = addon:hexcolor("MIDGREY")
-		end
-		ttAdd(0, -1, false, L["Required Skill"] .. " :", color_1, recipe_entry["Level"], color_2)
-
-		-- Binding info
-		acquire_tip:AddSeparator()
-		color_1 = addon:hexcolor("NORMAL")
-
-		local recipe_flags = recipe_entry["Flags"]
-
-		for flag, label in pairs(BINDING_FLAGS) do
-			if recipe_flags[flag] then
-				ttAdd(0, -1, true, label, color_1)
-			end
-		end
-		acquire_tip:AddSeparator()
-
-		ttAdd(0, -1, false, L["Obtained From"] .. " : ", addon:hexcolor("NORMAL"))
-
-		local playerFaction = Player["Faction"]
-		local rep_list = addon.reputation_list
-
-		for index, acquire in pairs(recipe_entry["Acquire"]) do
-			local acquire_type = acquire["Type"]
-			local display_tip = false
-
-			if acquire_type == A_TRAINER then
-				local trainer = addon.trainer_list[acquire["ID"]]
-
-				color_1 = addon:hexcolor("TRAINER")
-				display_tip, color_2 = GetTipFactionInfo(trainer["Faction"])
-
-				if display_tip then
-					local coord_text = ""
-
-					if trainer["Coordx"] ~= 0 and trainer["Coordy"] ~= 0 then
-						coord_text = "(" .. trainer["Coordx"] .. ", " .. trainer["Coordy"] .. ")"
-					end
-					ttAdd(0, -2, false, L["Trainer"], color_1, trainer["Name"], color_2)
-
-					color_1 = addon:hexcolor("NORMAL")
-					color_2 = addon:hexcolor("HIGH")
-
-					ttAdd(1, -2, true, trainer["Location"], color_1, coord_text, color_2)
-				end
-			elseif acquire_type == A_VENDOR then
-				local vendor = addon.vendor_list[acquire["ID"]]
-				local faction
-
-				color_1 = addon:hexcolor("VENDOR")
-				display_tip, color_2, faction = GetTipFactionInfo(vendor["Faction"])
-
-				if display_tip then
-					local coord_text = ""
-
-					if vendor["Coordx"] ~= 0 and vendor["Coordy"] ~= 0 then
-						coord_text = "(" .. vendor["Coordx"] .. ", " .. vendor["Coordy"] .. ")"
-					end
-					ttAdd(0, -1, false, L["Vendor"], color_1, vendor["Name"], color_2)
-
-					color_1 = addon:hexcolor("NORMAL")
-					color_2 = addon:hexcolor("HIGH")
-
-					ttAdd(1, -2, true, vendor["Location"], color_1, coord_text, color_2)
-				elseif faction then
-					ttAdd(0, -1, false, faction.." "..L["Vendor"], color_1)
-				end
-			elseif acquire_type == A_MOB then
-				local mob = addon.mob_list[acquire["ID"]]
-				local coord_text = ""
-
-				if mob["Coordx"] ~= 0 and mob["Coordy"] ~= 0 then
-					coord_text = "(" .. mob["Coordx"] .. ", " .. mob["Coordy"] .. ")"
-				end
-				color_1 = addon:hexcolor("MOBDROP")
-				color_2 = addon:hexcolor("HORDE")
-
-				ttAdd(0, -1, false, L["Mob Drop"], color_1, mob["Name"], color_2)
-
-				color_1 = addon:hexcolor("NORMAL")
-				color_2 = addon:hexcolor("HIGH")
-
-				ttAdd(1, -2, true, mob["Location"], color_1, coord_text, color_2)
-			elseif acquire_type == A_QUEST then
-				local quest = addon.quest_list[acquire["ID"]]
-
-				if quest then
-					local faction
-
-					color_1 = addon:hexcolor("QUEST")
-					display_tip, color_2, faction = GetTipFactionInfo(quest["Faction"])
-
-					if display_tip then
-						local coord_text = ""
-
-						if quest["Coordx"] ~= 0 and quest["Coordy"] ~= 0 then
-							coord_text = "(" .. quest["Coordx"] .. ", " .. quest["Coordy"] .. ")"
-						end
-						ttAdd(0, -1, false, L["Quest"], color_1, quest["Name"], color_2)
-
-						color_1 = addon:hexcolor("NORMAL")
-						color_2 = addon:hexcolor("HIGH")
-
-						ttAdd(1, -2, true, quest["Location"], color_1, coord_text, color_2)
-					elseif faction then
-						ttAdd(0, -1, false, faction.." "..L["Quest"], color_1)
-					end
-				end
-			elseif acquire_type == A_SEASONAL then
-				color_1 = addon:hexcolor("SEASON")
-				ttAdd(0, -1, 0, SEASONAL_CATEGORY, color_1, addon.seasonal_list[acquire["ID"]]["Name"], color_1)
-			elseif acquire_type == A_REPUTATION then
-				local repvendor = addon.vendor_list[acquire["RepVendor"]]
-				local coord_text = ""
-
-				if repvendor["Coordx"] ~= 0 and repvendor["Coordy"] ~= 0 then
-					coord_text = "(" .. repvendor["Coordx"] .. ", " .. repvendor["Coordy"] .. ")"
-				end
-				local repfac = rep_list[acquire["ID"]]
-				local repname = repfac["Name"]
-
-				color_1 = addon:hexcolor("REP")
-				color_2 = addon:hexcolor("NORMAL")
-				ttAdd(0, -1, false, _G.REPUTATION, color_1, repname, color_2)
-
-				local rStr = ""
-				local rep_level = acquire["RepLevel"]
-
-				if rep_level == 0 then
-					rStr = FACTION_NEUTRAL
-					color_1 = addon:hexcolor("NEUTRAL")
-				elseif rep_level == 1 then
-					rStr = BFAC["Friendly"]
-					color_1 = addon:hexcolor("FRIENDLY")
-				elseif rep_level == 2 then
-					rStr = BFAC["Honored"]
-					color_1 = addon:hexcolor("HONORED")
-				elseif rep_level == 3 then
-					rStr = BFAC["Revered"]
-					color_1 = addon:hexcolor("REVERED")
-				else
-					rStr = BFAC["Exalted"]
-					color_1 = addon:hexcolor("EXALTED")
-				end
-				display_tip, color_2 = GetTipFactionInfo(repvendor["Faction"])
-
-				if display_tip then
-					ttAdd(1, -2, false, rStr, color_1, repvendor["Name"], color_2)
-
-					color_1 = addon:hexcolor("NORMAL")
-					color_2 = addon:hexcolor("HIGH")
-
-					ttAdd(2, -2, true, repvendor["Location"], color_1, coord_text, color_2)
-				end
-			elseif acquire_type == A_WORLD_DROP then
-				local acquire_id = acquire["ID"]
-
-				if acquire_id == 1 then
-					color_1 = addon:hexcolor("COMMON")
-				elseif acquire_id == 2 then
-					color_1 = addon:hexcolor("UNCOMMON")
-				elseif acquire_id == 3 then
-					color_1 = addon:hexcolor("RARE")
-				elseif acquire_id == 4 then
-					color_1 = addon:hexcolor("EPIC")
-				else
-					color_1 = addon:hexcolor("NORMAL")
-				end
-				ttAdd(0, -1, false, L["World Drop"], color_1)
-			elseif acquire_type == A_CUSTOM then
-				ttAdd(0, -1, false, addon.custom_list[acquire["ID"]]["Name"], addon:hexcolor("NORMAL"))
-			elseif acquire_type == A_PVP then
-				local vendor = addon.vendor_list[acquire["ID"]]
-				local faction
-
-				color_1 = addon:hexcolor("VENDOR")
-				display_tip, color_2, faction = GetTipFactionInfo(vendor["Faction"])
-
-				if display_tip then
-					local coord_text = ""
-
-					if vendor["Coordx"] ~= 0 and vendor["Coordy"] ~= 0 then
-						coord_text = "(" .. vendor["Coordx"] .. ", " .. vendor["Coordy"] .. ")"
-					end
-					ttAdd(0, -1, false, L["Vendor"], color_1, vendor["Name"], color_2)
-
-					color_1 = addon:hexcolor("NORMAL")
-					color_2 = addon:hexcolor("HIGH")
-
-					ttAdd(1, -2, true, vendor["Location"], color_1, coord_text, color_2)
-				elseif faction then
-					ttAdd(0, -1, false, faction.." "..L["Vendor"], color_1)
-				end
-				--@alpha@
-			else	-- Unhandled
-				ttAdd(0, -1, 0, L["Unhandled Recipe"], addon:hexcolor("NORMAL"))
-				--@end-alpha@
-			end
-		end
-		acquire_tip:AddSeparator()
-		acquire_tip:AddSeparator()
-
-		color_1 = addon:hexcolor("NORMAL")
-
-		ttAdd(0, -1, 0, L["ALT_CLICK"], color_1)
-		ttAdd(0, -1, 0, L["CTRL_CLICK"], color_1)
-		ttAdd(0, -1, 0, L["SHIFT_CLICK"], color_1)
-
-		if addon.db.profile.worldmap or addon.db.profile.minimap then
-			ttAdd(0, -1, 0, L["CTRL_SHIFT_CLICK"], color_1)
-		end
-		acquire_tip:Show()
-
-		-- If we have the spell link tooltip, link it to the acquire tooltip.
-		if spell_tip_anchor ~= _G.OFF and spell_link then
-			SetSpellTooltip(acquire_tip, spell_tip_anchor, spell_link)
-		else
-			spell_tip:Hide()
-		end
-	end
-end	-- do
-
--------------------------------------------------------------------------------
--- Create the MainPanel and set its values
--------------------------------------------------------------------------------
-local MainPanel = CreateFrame("Frame", "ARL_MainPanel", UIParent)
-MainPanel:SetWidth(MAINPANEL_NORMAL_WIDTH)
-MainPanel:SetHeight(447)
-MainPanel:SetFrameStrata("DIALOG")
-MainPanel:SetHitRectInsets(5, 5, 5, 5)
-
-MainPanel:EnableMouse(true)
-MainPanel:EnableKeyboard(true)
-MainPanel:SetMovable(true)
-MainPanel:SetClampedToScreen(true)
-MainPanel:Show()
-
-MainPanel.is_expanded = false
-
--- Let the user banish the MainPanel with the ESC key.
-tinsert(UISpecialFrames, "ARL_MainPanel")
-
-addon.Frame = MainPanel
-
-MainPanel.backdrop = MainPanel:CreateTexture("AckisRecipeList.bgTexture", "ARTWORK")
-MainPanel.backdrop:SetTexture("Interface\\Addons\\AckisRecipeList\\img\\main")
-MainPanel.backdrop:SetAllPoints(MainPanel)
-MainPanel.backdrop:SetTexCoord(0, (MAINPANEL_NORMAL_WIDTH/512), 0, (447/512))
-
-MainPanel.title_bar = MainPanel:CreateFontString(nil, "ARTWORK")
-MainPanel.title_bar:SetFontObject("GameFontHighlightSmall")
-MainPanel.title_bar:ClearAllPoints()
-MainPanel.title_bar:SetPoint("TOP", MainPanel, "TOP", 20, -16)
-MainPanel.title_bar:SetJustifyH("CENTER")
-
--------------------------------------------------------------------------------
--- MainPanel scripts/functions.
--------------------------------------------------------------------------------
-MainPanel:SetScript("OnHide",
-		    function(self)
-			    addon:ClosePopups()
-		    end)
-
-MainPanel:SetScript("OnMouseDown", MainPanel.StartMoving)
-
-MainPanel:SetScript("OnMouseUp",
-		    function(self, button)
-			    self:StopMovingOrSizing()
-
-			    local opts = addon.db.profile.frameopts
-			    local from, _, to, x, y = self:GetPoint()
-
-			    opts.anchorFrom = from
-			    opts.anchorTo = to
-
-			    if self.is_expanded then
-				    if opts.anchorFrom == "TOPLEFT" or opts.anchorFrom == "LEFT" or opts.anchorFrom == "BOTTOMLEFT" then
-					    opts.offsetx = x
-				    elseif opts.anchorFrom == "TOP" or opts.anchorFrom == "CENTER" or opts.anchorFrom == "BOTTOM" then
-					    opts.offsetx = x - 151/2
-				    elseif opts.anchorFrom == "TOPRIGHT" or opts.anchorFrom == "RIGHT" or opts.anchorFrom == "BOTTOMRIGHT" then
-					    opts.offsetx = x - 151
-				    end
-			    else
-				    opts.offsetx = x
-			    end
-			    opts.offsety = y
-		    end)
-
-function MainPanel:HighlightCategory(target)
-	if not target then
-		self.filter_menu:Hide()
-	end
-
-	for category in pairs(self.filter_menu) do
-		local toggle = "menu_toggle_" .. category
-
-		if target == category then
-			self[toggle].text:SetText(addon:White(CATEGORY_TEXT[category]))
-		elseif category ~= 0 and category ~= "texture" then
-			self[toggle]:SetChecked(false)
-			self[toggle].text:SetText(addon:Yellow(CATEGORY_TEXT[category]))
-		end
-	end
-end
-
-function MainPanel:ToggleState()
-	if self.is_expanded then
-		self:SetWidth(MAINPANEL_NORMAL_WIDTH)
-
-		self.backdrop:SetTexture([[Interface\Addons\AckisRecipeList\img\main]])
-		self.backdrop:SetAllPoints(self)
-		self.backdrop:SetTexCoord(0, (MAINPANEL_NORMAL_WIDTH/512), 0, (447/512))
-
-		self.progress_bar:SetWidth(195)
-	else
-		self:SetWidth(MAINPANEL_EXPANDED_WIDTH)
-
-		self.backdrop:SetTexture([[Interface\Addons\AckisRecipeList\img\expanded]])
-		self.backdrop:SetAllPoints(self)
-		self.backdrop:SetTexCoord(0, (MAINPANEL_EXPANDED_WIDTH/512), 0, (447/512))
-
-		self.progress_bar:SetWidth(345)
-	end
-	self.is_expanded = not self.is_expanded
-
-	local x, y = self:GetLeft(), self:GetBottom()
-
-	self:ClearAllPoints()
-	self:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", x, y)
-	self:UpdateTitle()
-end
-
-function MainPanel:SetProfession()
-	for k, v in pairs(SortedProfessions) do
-		if v.name == Player["Profession"] then
-			self.profession = k
-			break
-		end
-	end
-	self.mode_button:ChangeTexture(SortedProfessions[self.profession].texture)
-end
-
-function MainPanel:SetPosition()
-	self:ClearAllPoints()
-
-	local opts = addon.db.profile.frameopts
-	local FixedOffsetX = opts.offsetx
-
-	if opts.anchorTo == "" then
-		-- no values yet, clamp to whatever frame is appropriate
-		if ATSWFrame then
-			-- Anchor frame to ATSW
-			self:SetPoint("CENTER", ATSWFrame, "CENTER", 490, 0)
-		elseif CauldronFrame then
-			-- Anchor frame to Cauldron
-			self:SetPoint("CENTER", CauldronFrame, "CENTER", 490, 0)
-		elseif Skillet then
-			-- Anchor frame to Skillet
-			self:SetPoint("CENTER", SkilletFrame, "CENTER", 468, 0)
-		else
-			-- Anchor to default tradeskill frame
-			self:SetPoint("TOPLEFT", TradeSkillFrame, "TOPRIGHT", 10, 0)
-		end
-	else
-		if self.is_expanded then
-			if opts.anchorFrom == "TOPLEFT" or opts.anchorFrom == "LEFT" or opts.anchorFrom == "BOTTOMLEFT" then
-				FixedOffsetX = opts.offsetx
-			elseif opts.anchorFrom == "TOP" or opts.anchorFrom == "CENTER" or opts.anchorFrom == "BOTTOM" then
-				FixedOffsetX = opts.offsetx + 151/2
-			elseif opts.anchorFrom == "TOPRIGHT" or opts.anchorFrom == "RIGHT" or opts.anchorFrom == "BOTTOMRIGHT" then
-				FixedOffsetX = opts.offsetx + 151
-			end
-		end
-		self:SetPoint(opts.anchorFrom, UIParent, opts.anchorTo, FixedOffsetX, opts.offsety)
-	end
-end
-
-function MainPanel:UpdateTitle()
-	if self.is_expanded then
-		local total, active = 0, 0
-
-		for filter, info in pairs(FilterValueMap) do
-			if info.svroot then
-				if info.svroot[filter] == true then
-					active = active + 1
-				end
-				total = total + 1
-			end
-		end
-		self.title_bar:SetFormattedText(addon:Normal("ARL (v.%s) - %s (%d/%d %s)"), addon.version, Player["Profession"], active, total, _G.FILTERS)
-	else
-		self.title_bar:SetFormattedText(addon:Normal("ARL (v.%s) - %s"), addon.version, Player["Profession"])
-	end
-end
-
--------------------------------------------------------------------------------
--- Create the MainPanel.mode_button and assign its values.
--------------------------------------------------------------------------------
-MainPanel.mode_button = CreateFrame("Button", nil, MainPanel, "UIPanelButtonTemplate")
-MainPanel.mode_button:SetWidth(64)
-MainPanel.mode_button:SetHeight(64)
-MainPanel.mode_button:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 1, -2)
-MainPanel.mode_button:RegisterForClicks("LeftButtonUp", "RightButtonUp")
-
-MainPanel.mode_button._normal = MainPanel.mode_button:CreateTexture(nil, "BACKGROUND")
-MainPanel.mode_button._pushed = MainPanel.mode_button:CreateTexture(nil, "BACKGROUND")
-MainPanel.mode_button._disabled = MainPanel.mode_button:CreateTexture(nil, "BACKGROUND")
-
--------------------------------------------------------------------------------
--- MainPanel.mode_button scripts/functions.
--------------------------------------------------------------------------------
-MainPanel.mode_button:SetScript("OnClick",
-				function(self, button, down)
-					-- Known professions should be in Player["Professions"]
-
-					-- This loop is gonna be weird. The reason is because we need to
-					-- ensure that we cycle through all the known professions, but also
-					-- that we do so in order. That means that if the currently displayed
-					-- profession is the last one in the list, we're actually going to
-					-- iterate completely once to get to the currently displayed profession
-					-- and then iterate again to make sure we display the next one in line.
-					-- Further, there is the nuance that the person may not know any
-					-- professions yet at all. User are so annoying.
-					local startLoop = 0
-					local endLoop = 0
-					local displayProf = 0
-
-					-- ok, so first off, if we've never done this before, there is no "current"
-					-- and a single iteration will do nicely, thank you
-					if button == "LeftButton" then
-						-- normal profession switch
-						if MainPanel.profession == 0 then
-							startLoop = 1
-							endLoop = NUM_PROFESSIONS + 1
-						else
-							startLoop = MainPanel.profession + 1
-							endLoop = MainPanel.profession
-						end
-						local index = startLoop
-
-						while index ~= endLoop do
-							if index > NUM_PROFESSIONS then
-								index = 1
-							elseif Player["Professions"][SortedProfessions[index].name] then
-								displayProf = index
-								MainPanel.profession = index
-								break
-							else
-								index = index + 1
-							end
-						end
-					elseif button == "RightButton" then
-						-- reverse profession switch
-						if MainPanel.profession == 0 then
-							startLoop = NUM_PROFESSIONS + 1
-							endLoop = 0
-						else
-							startLoop = MainPanel.profession - 1
-							endLoop = MainPanel.profession
-						end
-						local index = startLoop
-
-						while index ~= endLoop do
-							if index < 1 then
-								index = NUM_PROFESSIONS
-							elseif Player["Professions"][SortedProfessions[index].name] then
-								displayProf = index
-								MainPanel.profession = index
-								break
-							else
-								index = index - 1
-							end
-						end
-					end
-					local is_shown = TradeSkillFrame:IsVisible()
-
-					CastSpellByName(SortedProfessions[MainPanel.profession].name)
-					addon:Scan()
-
-					if not is_shown then
-						TradeSkillFrame:Hide()
-					end
-				end)
-
-function MainPanel.mode_button:ChangeTexture(texture)
-	local normal, pushed, disabled = self._normal, self._pushed, self._disabled
-
-	normal:SetTexture([[Interface\Addons\AckisRecipeList\img\]] .. texture .. [[_up]])
-	normal:SetTexCoord(0, 1, 0, 1)
-	normal:SetAllPoints(self)
-	self:SetNormalTexture(normal)
-
-	pushed:SetTexture([[Interface\Addons\AckisRecipeList\img\]] .. texture .. [[_down]])
-	pushed:SetTexCoord(0, 1, 0, 1)
-	pushed:SetAllPoints(self)
-	self:SetPushedTexture(pushed)
-
-	disabled:SetTexture([[Interface\Addons\AckisRecipeList\img\]] .. texture .. [[_up]])
-	disabled:SetTexCoord(0, 1, 0, 1)
-	disabled:SetAllPoints(self)
-	self:SetDisabledTexture(disabled)
-end
-
--------------------------------------------------------------------------------
--- Create the X-close button, and set its scripts.
--------------------------------------------------------------------------------
-MainPanel.xclose_button = CreateFrame("Button", nil, MainPanel, "UIPanelCloseButton")
-MainPanel.xclose_button:SetPoint("TOPRIGHT", MainPanel, "TOPRIGHT", 5, -6)
-
-MainPanel.xclose_button:SetScript("OnClick",
-				  function(self, button, down)
-					  MainPanel:Hide()
-				  end)
-
--------------------------------------------------------------------------------
--- Create MainPanel.filter_toggle, and set its scripts.
--------------------------------------------------------------------------------
-MainPanel.filter_toggle = GenericCreateButton(nil, MainPanel, 25, 90, "GameFontNormalSmall", "GameFontHighlightSmall", L["FILTER_OPEN"], "CENTER", L["FILTER_OPEN_DESC"], 1)
-MainPanel.filter_toggle:SetPoint("TOPRIGHT", MainPanel, "TOPRIGHT", -8, -40)
-
-MainPanel.filter_toggle:SetScript("OnClick",
-			   function(self, button, down)
-				   if MainPanel.is_expanded then
-					   -- Change the text and tooltip for the filter button
-					   self:SetText(L["FILTER_OPEN"])
-					   SetTooltipScripts(self, L["FILTER_OPEN_DESC"])
-
-					   -- Hide the category buttons
-					   for category in pairs(MainPanel.filter_menu) do
-						   if category ~= 0 and category ~= "texture" then
-							   MainPanel["menu_toggle_" .. category]:Hide()
-						   end
-					   end
-					   MainPanel:HighlightCategory(nil)
-					   MainPanel.filter_reset:Hide()
-				   else
-					   -- Change the text and tooltip for the filter button
-					   self:SetText(L["FILTER_CLOSE"])
-					   SetTooltipScripts(self, L["FILTER_CLOSE_DESC"])
-
-					   -- Show the category buttons
-					   for category in pairs(MainPanel.filter_menu) do
-						   if category ~= 0 and category ~= "texture" then
-							   MainPanel["menu_toggle_" .. category]:Show()
-						   end
-					   end
-					   MainPanel.filter_reset:Show()
-				   end
-				   MainPanel:ToggleState()
-			   end)
-
--------------------------------------------------------------------------------
--- Create MainPanel.filter_reset and set its scripts.
--------------------------------------------------------------------------------
-MainPanel.filter_reset = GenericCreateButton(nil, MainPanel, 25, 90, "GameFontNormalSmall", "GameFontHighlightSmall", _G.RESET, "CENTER",
-					     L["RESET_DESC"], 1)
-MainPanel.filter_reset:SetPoint("TOPRIGHT", MainPanel.filter_toggle, "BOTTOMRIGHT", 0, -2)
-MainPanel.filter_reset:Hide()
-
-do
-	local function recursiveReset(t)
-		-- Thanks to Antiarc for this code
-		for k, v in pairs(t) do
-			if type(v) == "table" then
-				recursiveReset(v)
-			else
-				t[k] = true
-			end
-		end
-	end
-
-	MainPanel.filter_reset:SetScript("OnClick",
-					 function()
-						 local filterdb = addon.db.profile.filters
-
-						 -- Reset all filters to true
-						 recursiveReset(addon.db.profile.filters)
-
-						 -- Reset specific filters to false
-						 filterdb.general.specialty = false
-						 filterdb.general.known = false
-
-						 -- Reset all classes to false
-						 for class in pairs(filterdb.classes) do
-							 filterdb.classes[class] = false
-						 end
-						 -- Set your own class to true
-						 filterdb.classes[strlower(Player["Class"])] = true
-
-						 if MainPanel:IsVisible() then
-							 MainPanel:UpdateTitle()
-							 MainPanel:HighlightCategory(nil)
-							 ReDisplay()
-						 end
-					 end)
-end	-- do
-
--------------------------------------------------------------------------------
--- Create the seven buttons for opening/closing the filter menus
--------------------------------------------------------------------------------
-local CreateFilterMenuButton
-do
-	local CATEGORY_TOOLTIP = {
-		["general"]	= L["FILTERING_GENERAL_DESC"],
-		["obtain"]	= L["FILTERING_OBTAIN_DESC"],
-		["binding"]	= L["FILTERING_BINDING_DESC"],
-		["item"]	= L["FILTERING_ITEM_DESC"],
-		["player"]	= L["FILTERING_PLAYERTYPE_DESC"],
-		["rep"]		= L["FILTERING_REP_DESC"],
-		["misc"]	= L["FILTERING_MISC_DESC"]
-	}
-
-	-- This manages the filter menu panel, as well as checking or unchecking the
-	-- buttons that got us here in the first place
-	local function ToggleFilterMenu(panel)
-		local ChangeFilters = false
-
-		MainPanel.filter_menu.rep.Classic:Hide()
-		MainPanel.filter_menu.rep.BC:Hide()
-		MainPanel.filter_menu.rep.LK:Hide()
-
-		MainPanel.filter_menu.rep.toggle_originalwow:SetChecked(false)
-		MainPanel.filter_menu.rep.toggle_bc:SetChecked(false)
-		MainPanel.filter_menu.rep.toggle_wrath:SetChecked(false)
-
-		local toggle = "menu_toggle_" .. panel
-
-		if MainPanel[toggle]:GetChecked() then
-			-- Display the selected filter_menu category frame
-			MainPanel:HighlightCategory(panel)
-			MainPanel.filter_menu[panel]:Show()
-
-			-- Hide all of the other filter_menu category frames
-			for category in pairs(MainPanel.filter_menu) do
-				if category ~= panel and category ~= 0 and category ~= "texture" then
-					MainPanel.filter_menu[category]:Hide()
-				end
-			end
-			ChangeFilters = true
-		else
-			MainPanel[toggle].text:SetText(addon:Yellow(CATEGORY_TEXT[panel]))
-			ChangeFilters = false
-		end
-
-		if ChangeFilters then
-			-- Depending on which panel we're showing, either display one column
-			-- or two column
-			if panel == "general" or panel == "obtain" or panel == "binding" or panel == "item" or panel == "misc" then
-				MainPanel.filter_menu.texture:ClearAllPoints()
-				MainPanel.filter_menu:SetWidth(FILTERMENU_DOUBLE_WIDTH)
-				MainPanel.filter_menu.texture:SetTexture([[Interface\Addons\AckisRecipeList\img\fly_2col]])
-				MainPanel.filter_menu.texture:SetAllPoints(MainPanel.filter_menu)
-				MainPanel.filter_menu.texture:SetTexCoord(0, (FILTERMENU_DOUBLE_WIDTH/256), 0, (FILTERMENU_HEIGHT/512))
-			elseif panel == "player" or panel == "rep" then
-				MainPanel.filter_menu.texture:ClearAllPoints()
-				MainPanel.filter_menu:SetWidth(FILTERMENU_SINGLE_WIDTH)
-				MainPanel.filter_menu.texture:SetTexture([[Interface\Addons\AckisRecipeList\img\fly_1col]])
-				MainPanel.filter_menu.texture:SetAllPoints(MainPanel.filter_menu)
-				MainPanel.filter_menu.texture:SetTexCoord(0, (FILTERMENU_SINGLE_WIDTH/256), 0, (FILTERMENU_HEIGHT/512))
-			end
-			-- Change the filters to the current panel
-			MainPanel.filter_menu:Show()
-		else
-			-- We're hiding, don't bother changing anything
-			MainPanel.filter_menu:Hide()
-		end
-	end
-
-	function CreateFilterMenuButton(bTex, category)
-		local ExpTextureSize = 34
-		local cButton = CreateFrame("CheckButton", nil, MainPanel)
-
-		cButton:SetWidth(ExpTextureSize)
-		cButton:SetHeight(ExpTextureSize)
-		cButton:SetScript("OnClick",
-				  function(self, button, down)
-					  ToggleFilterMenu(category)
-				  end)
-
-		local bgTex = cButton:CreateTexture(nil, "BACKGROUND")
-		bgTex:SetTexture('Interface/SpellBook/UI-Spellbook-SpellBackground')
-		bgTex:SetHeight(ExpTextureSize + 6)
-		bgTex:SetWidth(ExpTextureSize + 4)
-		bgTex:SetTexCoord(0, (43/64), 0, (43/64))
-		bgTex:SetPoint("CENTER", cButton, "CENTER", 0, 0)
-
-		local iconTex = cButton:CreateTexture(nil, "BORDER")
-		iconTex:SetTexture('Interface/Icons/' .. bTex)
-		iconTex:SetAllPoints(cButton)
-
-		local pushedTexture = cButton:CreateTexture(nil, "ARTWORK")
-		pushedTexture:SetTexture('Interface/Buttons/UI-Quickslot-Depress')
-		pushedTexture:SetAllPoints(cButton)
-		cButton:SetPushedTexture(pushedTexture)
-
-		local highlightTexture = cButton:CreateTexture()
-		highlightTexture:SetTexture('Interface/Buttons/ButtonHilight-Square')
-		highlightTexture:SetAllPoints(cButton)
-		highlightTexture:SetBlendMode('ADD')
-		cButton:SetHighlightTexture(highlightTexture)
-
-		local checkedTexture = cButton:CreateTexture()
-		checkedTexture:SetTexture('Interface/Buttons/CheckButtonHilight')
-		checkedTexture:SetAllPoints(cButton)
-		checkedTexture:SetBlendMode('ADD')
-		cButton:SetCheckedTexture(checkedTexture)
-
-		-- Create the text object to go along with it
-		local cbText = cButton:CreateFontString("cbText", "OVERLAY", "GameFontHighlight")
-		cbText:SetText(addon:Yellow(CATEGORY_TEXT[category]))
-		cbText:SetPoint("LEFT", cButton, "RIGHT", 5, 0)
-		cbText:SetHeight(14)
-		cbText:SetWidth(100)
-		cbText:SetJustifyH("LEFT")
-		cButton.text = cbText
-
-		-- And throw up a tooltip
-		SetTooltipScripts(cButton, CATEGORY_TOOLTIP[category])
-		cButton:Hide()
-
-		return cButton
-	end
-end	-- do
-
-MainPanel.menu_toggle_general = CreateFilterMenuButton("INV_Misc_Note_06", "general")
-MainPanel.menu_toggle_general:SetPoint("TOPRIGHT", MainPanel.filter_reset, "BOTTOMLEFT", -7, -23)
-
-MainPanel.menu_toggle_obtain = CreateFilterMenuButton("Spell_Shadow_MindRot", "obtain")
-MainPanel.menu_toggle_obtain:SetPoint("TOPLEFT", MainPanel.menu_toggle_general, "BOTTOMLEFT", 0, -8)
-
-MainPanel.menu_toggle_binding = CreateFilterMenuButton("INV_Belt_20", "binding")
-MainPanel.menu_toggle_binding:SetPoint("TOPLEFT", MainPanel.menu_toggle_obtain, "BOTTOMLEFT", -0, -8)
-
-MainPanel.menu_toggle_item = CreateFilterMenuButton("INV_Misc_EngGizmos_19", "item")
-MainPanel.menu_toggle_item:SetPoint("TOPLEFT", MainPanel.menu_toggle_binding, "BOTTOMLEFT", -0, -8)
-
-MainPanel.menu_toggle_player = CreateFilterMenuButton("INV_Misc_GroupLooking", "player")
-MainPanel.menu_toggle_player:SetPoint("TOPLEFT", MainPanel.menu_toggle_item, "BOTTOMLEFT", -0, -8)
-
-MainPanel.menu_toggle_rep = CreateFilterMenuButton("INV_Scroll_05", "rep")
-MainPanel.menu_toggle_rep:SetPoint("TOPLEFT", MainPanel.menu_toggle_player, "BOTTOMLEFT", -0, -8)
-
-MainPanel.menu_toggle_misc = CreateFilterMenuButton("Trade_Engineering", "misc")
-MainPanel.menu_toggle_misc:SetPoint("TOPLEFT", MainPanel.menu_toggle_rep, "BOTTOMLEFT", -0, -8)
-
--------------------------------------------------------------------------------
--- Create MainPanel.filter_menu and set its scripts.
--------------------------------------------------------------------------------
-MainPanel.filter_menu = CreateFrame("Frame", "ARL_FilterMenu", MainPanel)
-MainPanel.filter_menu:SetWidth(FILTERMENU_DOUBLE_WIDTH)
-MainPanel.filter_menu:SetHeight(FILTERMENU_HEIGHT)
-MainPanel.filter_menu:SetPoint("TOPLEFT", MainPanel, "TOPRIGHT", -6, -102)
-MainPanel.filter_menu:EnableMouse(true)
-MainPanel.filter_menu:EnableKeyboard(true)
-MainPanel.filter_menu:SetMovable(false)
-MainPanel.filter_menu:SetHitRectInsets(5, 5, 5, 5)
-MainPanel.filter_menu:Hide()
-
--- Set all the current options in the filter menu to make sure they are consistent with the SV options.
-MainPanel.filter_menu:SetScript("OnShow",
-				function()
-					for filter, info in pairs(FilterValueMap) do
-						if info.svroot then
-							info.cb:SetChecked(info.svroot[filter])
-						end
-					end
-					-- Miscellaneous Options
-					ARL_IgnoreCB:SetChecked(addon.db.profile.ignoreexclusionlist)
-				end)
-
-MainPanel.filter_menu.texture = MainPanel.filter_menu:CreateTexture(nil, "ARTWORK")
-MainPanel.filter_menu.texture:SetTexture("Interface\\Addons\\AckisRecipeList\\img\\fly_2col")
-MainPanel.filter_menu.texture:SetAllPoints(MainPanel.filter_menu)
-MainPanel.filter_menu.texture:SetTexCoord(0, (FILTERMENU_DOUBLE_WIDTH/256), 0, (FILTERMENU_HEIGHT/512))
-
--------------------------------------------------------------------------------
--- Function to initialize a check-button with the given values. Used in all of
--- the sub-menus of MainPanel.filter_menu
--------------------------------------------------------------------------------
-local InitializeCheckButton
-do
-	local PUSHDOWN = {
-		["cloak"]	= true,
-		["necklace"]	= true,
-		["ring"]	= true,
-		["trinket"]	= true,
-		["shield"]	= true,
-	}
-	function InitializeCheckButton(cButton, anchorFrame, ttText, scriptVal, row, col, misc)
-		-- set the position of the new checkbox
-		local xPos = 2 + ((col - 1) * 100)
-		local yPos = -3 - ((row - 1) * 17)
-
-		if PUSHDOWN[scriptVal] then
-			yPos = yPos - 5
-		end
-		cButton:SetPoint("TOPLEFT", anchorFrame, "TOPLEFT", xPos, yPos)
-		cButton:SetHeight(24)
-		cButton:SetWidth(24)
-
-		cButton:SetNormalTexture("Interface\\Buttons\\UI-CheckBox-Up")
-		cButton:SetPushedTexture("Interface\\Buttons\\UI-CheckBox-Down")
-		cButton:SetHighlightTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
-		cButton:SetDisabledCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check-Disabled")
-		cButton:SetCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check")
-
-		cButton.text = cButton:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall")
-		cButton.text:SetPoint("LEFT", cButton, "RIGHT", 0, 0)
-
-		-- depending if we're on the misc panel or not, set an alternative OnClick method
-		if misc == 0 then
-			cButton:SetScript("OnClick",
-					  function()
-						  FilterValueMap[scriptVal].svroot[scriptVal] = FilterValueMap[scriptVal].cb:GetChecked() and true or false
-						  MainPanel:UpdateTitle()
-						  ReDisplay()
-					  end)
-		else
-			cButton:SetScript("OnClick",
-					  function()
-						  addon.db.profile.ignoreexclusionlist = not addon.db.profile.ignoreexclusionlist
-						  ReDisplay()
-					  end)
-		end
-		SetTooltipScripts(cButton, ttText, 1)
-	end
-end	-- do
-
--------------------------------------------------------------------------------
--- Create MainPanel.filter_menu.general, and set its scripts.
--------------------------------------------------------------------------------
-MainPanel.filter_menu.general = CreateFrame("Frame", nil, MainPanel.filter_menu)
-MainPanel.filter_menu.general:SetWidth(FILTERMENU_SMALL)
-MainPanel.filter_menu.general:SetHeight(280)
-MainPanel.filter_menu.general:EnableMouse(true)
-MainPanel.filter_menu.general:EnableKeyboard(true)
-MainPanel.filter_menu.general:SetMovable(false)
-MainPanel.filter_menu.general:SetPoint("TOPLEFT", MainPanel.filter_menu, "TOPLEFT", 17, -16)
-MainPanel.filter_menu.general:Hide()
-
--------------------------------------------------------------------------------
--- Create the CheckButtons for MainPanel.filter_menu.general
--------------------------------------------------------------------------------
-MainPanel.filter_menu.general.specialty = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
-InitializeCheckButton(MainPanel.filter_menu.general.specialty, MainPanel.filter_menu.general, L["SPECIALTY_DESC"], "specialty", 1, 1, 0)
-MainPanel.filter_menu.general.specialty.text:SetText(L["Specialties"])
-
-MainPanel.filter_menu.general.skill = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
-InitializeCheckButton(MainPanel.filter_menu.general.skill, MainPanel.filter_menu.general, L["SKILL_DESC"], "skill", 1, 2, 0)
-MainPanel.filter_menu.general.skill.text:SetText(_G.SKILL)
-
-MainPanel.filter_menu.general.faction = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
-InitializeCheckButton(MainPanel.filter_menu.general.faction, MainPanel.filter_menu.general, L["FACTION_DESC"], "faction", 2, 1, 0)
-MainPanel.filter_menu.general.faction.text:SetText(_G.FACTION)
-
-MainPanel.filter_menu.general.known = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
-InitializeCheckButton(MainPanel.filter_menu.general.known, MainPanel.filter_menu.general, L["KNOWN_DESC"], "known", 2, 2, 0)
-MainPanel.filter_menu.general.known.text:SetText(L["Show Known"])
-
-MainPanel.filter_menu.general.unknown = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
-InitializeCheckButton(MainPanel.filter_menu.general.unknown, MainPanel.filter_menu.general, L["UNKNOWN_DESC"], "unknown", 3, 1, 0)
-MainPanel.filter_menu.general.unknown.text:SetText(L["Show Unknown"])
-
--------------------------------------------------------------------------------
--- Create the Class toggle and CheckButtons for MainPanel.filter_menu.general
--------------------------------------------------------------------------------
-MainPanel.filter_menu.general.class_toggle = GenericCreateButton(nil, MainPanel.filter_menu.general, 20, 105, "GameFontHighlight", "GameFontHighlightSmall",
-								 L["Classes"] .. ":", "LEFT", L["CLASS_TEXT_DESC"], 0)
-MainPanel.filter_menu.general.class_toggle:SetPoint("TOPLEFT", MainPanel.filter_menu.general.unknown, "BOTTOMLEFT", -4, -10)
-MainPanel.filter_menu.general.class_toggle:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
-MainPanel.filter_menu.general.class_toggle:RegisterForClicks("LeftButtonUp", "RightButtonUp")
-MainPanel.filter_menu.general.class_toggle:SetScript("OnClick",
-						     function(self, button)
-							     local classes = addon.db.profile.filters.classes
-							     local general = MainPanel.filter_menu.general
-							     local toggle = (button == "LeftButton") and true or false
-
-							     for class in pairs(classes) do
-								     classes[class] = toggle
-								     general[class]:SetChecked(toggle)
-							     end
-
-							     if toggle == false then
-								     local class = strlower(Player["Class"])
-								     classes[class] = true
-								     general[class]:SetChecked(true)
-							     end
-							     MainPanel:UpdateTitle()
-							     ReDisplay()
-						     end)
-
-MainPanel.filter_menu.general.deathknight = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
-InitializeCheckButton(MainPanel.filter_menu.general.deathknight, MainPanel.filter_menu.general, L["CLASS_DESC"], "deathknight", 6, 1, 0)
-MainPanel.filter_menu.general.deathknight.text:SetText(LOCALIZED_CLASS_NAMES_MALE["DEATHKNIGHT"])
-
-MainPanel.filter_menu.general.druid = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
-InitializeCheckButton(MainPanel.filter_menu.general.druid, MainPanel.filter_menu.general, L["CLASS_DESC"], "druid", 6, 2, 0)
-MainPanel.filter_menu.general.druid.text:SetText(LOCALIZED_CLASS_NAMES_MALE["DRUID"])
-
-MainPanel.filter_menu.general.hunter = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
-InitializeCheckButton(MainPanel.filter_menu.general.hunter, MainPanel.filter_menu.general, L["CLASS_DESC"], "hunter", 7, 1, 0)
-MainPanel.filter_menu.general.hunter.text:SetText(LOCALIZED_CLASS_NAMES_MALE["HUNTER"])
-
-MainPanel.filter_menu.general.mage = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
-InitializeCheckButton(MainPanel.filter_menu.general.mage, MainPanel.filter_menu.general, L["CLASS_DESC"], "mage", 7, 2, 0)
-MainPanel.filter_menu.general.mage.text:SetText(LOCALIZED_CLASS_NAMES_MALE["MAGE"])
-
-MainPanel.filter_menu.general.paladin = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
-InitializeCheckButton(MainPanel.filter_menu.general.paladin, MainPanel.filter_menu.general, L["CLASS_DESC"], "paladin", 8, 1, 0)
-MainPanel.filter_menu.general.paladin.text:SetText(LOCALIZED_CLASS_NAMES_MALE["PALADIN"])
-
-MainPanel.filter_menu.general.priest = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
-InitializeCheckButton(MainPanel.filter_menu.general.priest, MainPanel.filter_menu.general, L["CLASS_DESC"], "priest", 8, 2, 0)
-MainPanel.filter_menu.general.priest.text:SetText(LOCALIZED_CLASS_NAMES_MALE["PRIEST"])
-
-MainPanel.filter_menu.general.rogue = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
-InitializeCheckButton(MainPanel.filter_menu.general.rogue, MainPanel.filter_menu.general, L["CLASS_DESC"], "rogue", 9, 1, 0)
-MainPanel.filter_menu.general.rogue.text:SetText(LOCALIZED_CLASS_NAMES_MALE["ROGUE"])
-
-MainPanel.filter_menu.general.shaman = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
-InitializeCheckButton(MainPanel.filter_menu.general.shaman, MainPanel.filter_menu.general, L["CLASS_DESC"], "shaman", 9, 2, 0)
-MainPanel.filter_menu.general.shaman.text:SetText(LOCALIZED_CLASS_NAMES_MALE["SHAMAN"])
-
-MainPanel.filter_menu.general.warlock = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
-InitializeCheckButton(MainPanel.filter_menu.general.warlock, MainPanel.filter_menu.general, L["CLASS_DESC"], "warlock", 10, 1, 0)
-MainPanel.filter_menu.general.warlock.text:SetText(LOCALIZED_CLASS_NAMES_MALE["WARLOCK"])
-
-MainPanel.filter_menu.general.warrior = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
-InitializeCheckButton(MainPanel.filter_menu.general.warrior, MainPanel.filter_menu.general, L["CLASS_DESC"], "warrior", 10, 2, 0)
-MainPanel.filter_menu.general.warrior.text:SetText(LOCALIZED_CLASS_NAMES_MALE["WARRIOR"])
-
--------------------------------------------------------------------------------
--- Create MainPanel.filter_menu.obtain, and set its scripts.
--------------------------------------------------------------------------------
-MainPanel.filter_menu.obtain = CreateFrame("Frame", nil, MainPanel.filter_menu)
-MainPanel.filter_menu.obtain:SetWidth(FILTERMENU_SMALL)
-MainPanel.filter_menu.obtain:SetHeight(280)
-MainPanel.filter_menu.obtain:EnableMouse(true)
-MainPanel.filter_menu.obtain:EnableKeyboard(true)
-MainPanel.filter_menu.obtain:SetMovable(false)
-MainPanel.filter_menu.obtain:SetPoint("TOPLEFT", MainPanel.filter_menu, "TOPLEFT", 17, -16)
-MainPanel.filter_menu.obtain:Hide()
-
--------------------------------------------------------------------------------
--- Create the CheckButtons for MainPanel.filter_menu.obtain
--------------------------------------------------------------------------------
-MainPanel.filter_menu.obtain.instance = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
-InitializeCheckButton(MainPanel.filter_menu.obtain.instance, MainPanel.filter_menu.obtain, L["INSTANCE_DESC"], "instance", 1, 1, 0)
-MainPanel.filter_menu.obtain.instance.text:SetText(_G.INSTANCE)
-
-MainPanel.filter_menu.obtain.raid = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
-InitializeCheckButton(MainPanel.filter_menu.obtain.raid, MainPanel.filter_menu.obtain, L["RAID_DESC"], "raid", 1, 2, 0)
-MainPanel.filter_menu.obtain.raid.text:SetText(_G.RAID)
-
-MainPanel.filter_menu.obtain.quest = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
-InitializeCheckButton(MainPanel.filter_menu.obtain.quest, MainPanel.filter_menu.obtain, L["QUEST_DESC"], "quest", 2, 1, 0)
-MainPanel.filter_menu.obtain.quest.text:SetText(L["Quest"])
-
-MainPanel.filter_menu.obtain.seasonal = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
-InitializeCheckButton(MainPanel.filter_menu.obtain.seasonal, MainPanel.filter_menu.obtain, L["SEASONAL_DESC"], "seasonal", 2, 2, 0)
-MainPanel.filter_menu.obtain.seasonal.text:SetText(SEASONAL_CATEGORY)
-
-MainPanel.filter_menu.obtain.trainer = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
-InitializeCheckButton(MainPanel.filter_menu.obtain.trainer, MainPanel.filter_menu.obtain, L["TRAINER_DESC"], "trainer", 3, 1, 0)
-MainPanel.filter_menu.obtain.trainer.text:SetText(L["Trainer"])
-
-MainPanel.filter_menu.obtain.vendor = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
-InitializeCheckButton(MainPanel.filter_menu.obtain.vendor, MainPanel.filter_menu.obtain, L["VENDOR_DESC"], "vendor", 3, 2, 0)
-MainPanel.filter_menu.obtain.vendor.text:SetText(L["Vendor"])
-
-MainPanel.filter_menu.obtain.pvp = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
-InitializeCheckButton(MainPanel.filter_menu.obtain.pvp, MainPanel.filter_menu.obtain, L["PVP_DESC"], "pvp", 4, 1, 0)
-MainPanel.filter_menu.obtain.pvp.text:SetText(_G.PVP)
-
-MainPanel.filter_menu.obtain.discovery = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
-InitializeCheckButton(MainPanel.filter_menu.obtain.discovery, MainPanel.filter_menu.obtain, L["DISCOVERY_DESC"], "discovery", 4, 2, 0)
-MainPanel.filter_menu.obtain.discovery.text:SetText(L["Discovery"])
-
-MainPanel.filter_menu.obtain.worlddrop = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
-InitializeCheckButton(MainPanel.filter_menu.obtain.worlddrop, MainPanel.filter_menu.obtain, L["WORLD_DROP_DESC"], "worlddrop", 5, 1, 0)
-MainPanel.filter_menu.obtain.worlddrop.text:SetText(L["World Drop"])
-
-MainPanel.filter_menu.obtain.mobdrop = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
-InitializeCheckButton(MainPanel.filter_menu.obtain.mobdrop, MainPanel.filter_menu.obtain, L["MOB_DROP_DESC"], "mobdrop", 5, 2, 0)
-MainPanel.filter_menu.obtain.mobdrop.text:SetText(L["Mob Drop"])
-
-MainPanel.filter_menu.obtain.originalwow = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
-InitializeCheckButton(MainPanel.filter_menu.obtain.originalwow, MainPanel.filter_menu.obtain, L["ORIGINAL_WOW_DESC"], "originalwow", 7, 1, 0)
-MainPanel.filter_menu.obtain.originalwow.text:SetText(_G.EXPANSION_NAME0)
-
-MainPanel.filter_menu.obtain.bc = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
-InitializeCheckButton(MainPanel.filter_menu.obtain.bc, MainPanel.filter_menu.obtain, L["BC_WOW_DESC"], "bc", 8, 1, 0)
-MainPanel.filter_menu.obtain.bc.text:SetText(_G.EXPANSION_NAME1)
-
-MainPanel.filter_menu.obtain.wrath = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
-InitializeCheckButton(MainPanel.filter_menu.obtain.wrath, MainPanel.filter_menu.obtain, L["LK_WOW_DESC"], "wrath", 9, 1, 0)
-MainPanel.filter_menu.obtain.wrath.text:SetText(_G.EXPANSION_NAME2)
-
--------------------------------------------------------------------------------
--- Create MainPanel.filter_menu.binding, and set its scripts.
--------------------------------------------------------------------------------
-MainPanel.filter_menu.binding = CreateFrame("Frame", nil, MainPanel.filter_menu)
-MainPanel.filter_menu.binding:SetWidth(FILTERMENU_LARGE)
-MainPanel.filter_menu.binding:SetHeight(280)
-MainPanel.filter_menu.binding:EnableMouse(true)
-MainPanel.filter_menu.binding:EnableKeyboard(true)
-MainPanel.filter_menu.binding:SetMovable(false)
-MainPanel.filter_menu.binding:SetPoint("TOPLEFT", MainPanel.filter_menu, "TOPLEFT", 17, -16)
-MainPanel.filter_menu.binding:Hide()
-
--------------------------------------------------------------------------------
--- Create the CheckButtons for MainPanel.filter_menu.binding
--------------------------------------------------------------------------------
-MainPanel.filter_menu.binding.itemboe = CreateFrame("CheckButton", nil, MainPanel.filter_menu.binding)
-InitializeCheckButton(MainPanel.filter_menu.binding.itemboe, MainPanel.filter_menu.binding, L["BOE_DESC"], "itemboe", 1, 1, 0)
-MainPanel.filter_menu.binding.itemboe.text:SetText(L["BOEFilter"])
-
-MainPanel.filter_menu.binding.itembop = CreateFrame("CheckButton", nil, MainPanel.filter_menu.binding)
-InitializeCheckButton(MainPanel.filter_menu.binding.itembop, MainPanel.filter_menu.binding, L["BOP_DESC"], "itembop", 2, 1, 0)
-MainPanel.filter_menu.binding.itembop.text:SetText(L["BOPFilter"])
-
-MainPanel.filter_menu.binding.recipeboe = CreateFrame("CheckButton", nil, MainPanel.filter_menu.binding)
-InitializeCheckButton(MainPanel.filter_menu.binding.recipeboe, MainPanel.filter_menu.binding, L["RECIPE_BOE_DESC"], "recipeboe", 3, 1, 0)
-MainPanel.filter_menu.binding.recipeboe.text:SetText(L["RecipeBOEFilter"])
-
-MainPanel.filter_menu.binding.recipebop = CreateFrame("CheckButton", nil, MainPanel.filter_menu.binding)
-InitializeCheckButton(MainPanel.filter_menu.binding.recipebop, MainPanel.filter_menu.binding, L["RECIPE_BOP_DESC"], "recipebop", 4, 1, 0)
-MainPanel.filter_menu.binding.recipebop.text:SetText(L["RecipeBOPFilter"])
-
--------------------------------------------------------------------------------
--- Create MainPanel.filter_menu.item, and set its scripts.
--------------------------------------------------------------------------------
-MainPanel.filter_menu.item = CreateFrame("Frame", nil, MainPanel.filter_menu)
-MainPanel.filter_menu.item:SetWidth(FILTERMENU_LARGE)
-MainPanel.filter_menu.item:SetHeight(280)
-MainPanel.filter_menu.item:EnableMouse(true)
-MainPanel.filter_menu.item:EnableKeyboard(true)
-MainPanel.filter_menu.item:SetMovable(false)
-MainPanel.filter_menu.item:SetPoint("TOPLEFT", MainPanel.filter_menu, "TOPLEFT", 17, -16)
-MainPanel.filter_menu.item:Hide()
-
--------------------------------------------------------------------------------
--- Create the Armor toggle and CheckButtons for MainPanel.filter_menu.item
--------------------------------------------------------------------------------
-MainPanel.filter_menu.item.armor_toggle = GenericCreateButton(nil, MainPanel.filter_menu.item, 20, 105, "GameFontHighlight", "GameFontHighlightSmall", _G.ARMOR_COLON,
-							      "LEFT", L["ARMOR_TEXT_DESC"], 0)
-MainPanel.filter_menu.item.armor_toggle:SetPoint("TOPLEFT", MainPanel.filter_menu.item, "TOPLEFT", -2, -4)
-MainPanel.filter_menu.item.armor_toggle:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
-MainPanel.filter_menu.item.armor_toggle:RegisterForClicks("LeftButtonUp", "RightButtonUp")
-MainPanel.filter_menu.item.armor_toggle:SetScript("OnClick",
-						  function(self, button)
-							  local armors = addon.db.profile.filters.item.armor
-							  local items = MainPanel.filter_menu.item
-							  local toggle = (button == "LeftButton") and true or false
-
-							  for armor in pairs(armors) do
-								  armors[armor] = toggle
-								  items[armor]:SetChecked(toggle)
-							  end
-							  MainPanel:UpdateTitle()
-							  ReDisplay()
-						  end)
-
-MainPanel.filter_menu.item.cloth = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.cloth, MainPanel.filter_menu.item, L["CLOTH_DESC"], "cloth", 2, 1, 0)
-MainPanel.filter_menu.item.cloth.text:SetText(L["Cloth"])
-
-MainPanel.filter_menu.item.leather = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.leather, MainPanel.filter_menu.item, L["LEATHER_DESC"], "leather", 2, 2, 0)
-MainPanel.filter_menu.item.leather.text:SetText(L["Leather"])
-
-MainPanel.filter_menu.item.mail = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.mail, MainPanel.filter_menu.item, L["MAIL_DESC"], "mail", 3, 1, 0)
-MainPanel.filter_menu.item.mail.text:SetText(L["Mail"])
-
-MainPanel.filter_menu.item.plate = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.plate, MainPanel.filter_menu.item, L["PLATE_DESC"], "plate", 3, 2, 0)
-MainPanel.filter_menu.item.plate.text:SetText(L["Plate"])
-
-MainPanel.filter_menu.item.cloak = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.cloak, MainPanel.filter_menu.item, L["CLOAK_DESC"], "cloak", 4, 1, 0)
-MainPanel.filter_menu.item.cloak.text:SetText(L["Cloak"])
-
-MainPanel.filter_menu.item.necklace = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.necklace, MainPanel.filter_menu.item, L["NECKLACE_DESC"], "necklace", 4, 2, 0)
-MainPanel.filter_menu.item.necklace.text:SetText(L["Necklace"])
-
-MainPanel.filter_menu.item.ring = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.ring, MainPanel.filter_menu.item, L["RING_DESC"], "ring", 5, 1, 0)
-MainPanel.filter_menu.item.ring.text:SetText(L["Ring"])
-
-MainPanel.filter_menu.item.trinket = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.trinket, MainPanel.filter_menu.item, L["TRINKET_DESC"], "trinket", 5, 2, 0)
-MainPanel.filter_menu.item.trinket.text:SetText(L["Trinket"])
-
-MainPanel.filter_menu.item.shield = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.shield, MainPanel.filter_menu.item, L["SHIELD_DESC"], "shield", 6, 1, 0)
-MainPanel.filter_menu.item.shield.text:SetText(L["Shield"])
-
--------------------------------------------------------------------------------
--- Create the Weapon toggle and CheckButtons for MainPanel.filter_menu.item
--------------------------------------------------------------------------------
-MainPanel.filter_menu.item.weapon_toggle = GenericCreateButton(nil, MainPanel.filter_menu.item, 20, 105, "GameFontHighlight", "GameFontHighlightSmall", L["Weapon"] .. ":",
-							       "LEFT", L["WEAPON_TEXT_DESC"], 0)
-MainPanel.filter_menu.item.weapon_toggle:SetPoint("TOPLEFT", MainPanel.filter_menu.item, "TOPLEFT", -2, -122)
-
-MainPanel.filter_menu.item.weapon_toggle:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
-MainPanel.filter_menu.item.weapon_toggle:RegisterForClicks("LeftButtonUp", "RightButtonUp")
-MainPanel.filter_menu.item.weapon_toggle:SetScript("OnClick",
-						   function(self, button)
-							   local weapons = addon.db.profile.filters.item.weapon
-							   local items = MainPanel.filter_menu.item
-							   local toggle = (button == "LeftButton") and true or false
-
-							   for weapon in pairs(weapons) do
-								   weapons[weapon] = toggle
-
-								   if FilterValueMap[weapon].svroot then
-									   items[weapon]:SetChecked(toggle)
-								   end
-							   end
-							   MainPanel:UpdateTitle()
-							   ReDisplay()
-						   end)
-
-MainPanel.filter_menu.item.onehand = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.onehand, MainPanel.filter_menu.item, L["ONEHAND_DESC"], "onehand", 9, 1, 0)
-MainPanel.filter_menu.item.onehand.text:SetText(L["One Hand"])
-
-MainPanel.filter_menu.item.twohand = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.twohand, MainPanel.filter_menu.item, L["TWOHAND_DESC"], "twohand", 9, 2, 0)
-MainPanel.filter_menu.item.twohand.text:SetText(L["Two Hand"])
-
-MainPanel.filter_menu.item.dagger = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.dagger, MainPanel.filter_menu.item, L["DAGGER_DESC"], "dagger", 10, 1, 0)
-MainPanel.filter_menu.item.dagger.text:SetText(L["Dagger"])
-
-MainPanel.filter_menu.item.axe = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.axe, MainPanel.filter_menu.item, L["AXE_DESC"], "axe", 10, 2, 0)
-MainPanel.filter_menu.item.axe.text:SetText(L["Axe"])
-
-MainPanel.filter_menu.item.mace = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.mace, MainPanel.filter_menu.item, L["MACE_DESC"], "mace", 11, 1, 0)
-MainPanel.filter_menu.item.mace.text:SetText(L["Mace"])
-
-MainPanel.filter_menu.item.sword = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.sword, MainPanel.filter_menu.item, L["SWORD_DESC"], "sword", 11, 2, 0)
-MainPanel.filter_menu.item.sword.text:SetText(L["Sword"])
-
-MainPanel.filter_menu.item.polearm = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.polearm, MainPanel.filter_menu.item, L["POLEARM_DESC"], "polearm", 12, 1, 0)
-MainPanel.filter_menu.item.polearm.text:SetText(L["Polearm"])
-
-MainPanel.filter_menu.item.fist = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.fist, MainPanel.filter_menu.item, L["FIST_DESC"], "fist", 12, 2, 0)
-MainPanel.filter_menu.item.fist.text:SetText(L["Fist"])
-
-MainPanel.filter_menu.item.staff = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.staff, MainPanel.filter_menu.item, L["STAFF_DESC"], "staff", 13, 1, 0)
-MainPanel.filter_menu.item.staff.text:SetText(addon:Grey(L["Staff"]))
-MainPanel.filter_menu.item.staff:Disable()
-
-MainPanel.filter_menu.item.wand = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.wand, MainPanel.filter_menu.item, L["WAND_DESC"], "wand", 13, 2, 0)
-MainPanel.filter_menu.item.wand.text:SetText(L["Wand"])
-
-MainPanel.filter_menu.item.thrown = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.thrown, MainPanel.filter_menu.item, L["THROWN_DESC"], "thrown", 14, 1, 0)
-MainPanel.filter_menu.item.thrown.text:SetText(L["Thrown"])
-
-MainPanel.filter_menu.item.bow = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.bow, MainPanel.filter_menu.item, L["BOW_DESC"], "bow", 14, 2, 0)
-MainPanel.filter_menu.item.bow.text:SetText(addon:Grey(L["Bow"]))
-MainPanel.filter_menu.item.bow:Disable()
-
-MainPanel.filter_menu.item.crossbow = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.crossbow, MainPanel.filter_menu.item, L["CROSSBOW_DESC"], "crossbow", 15, 1, 0)
-MainPanel.filter_menu.item.crossbow.text:SetText(addon:Grey(L["Crossbow"]))
-MainPanel.filter_menu.item.crossbow:Disable()
-
-MainPanel.filter_menu.item.ammo = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.ammo, MainPanel.filter_menu.item, L["AMMO_DESC"], "ammo", 15, 2, 0)
-MainPanel.filter_menu.item.ammo.text:SetText(L["Ammo"])
-
-MainPanel.filter_menu.item.gun = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
-InitializeCheckButton(MainPanel.filter_menu.item.gun, MainPanel.filter_menu.item, L["GUN_DESC"], "gun", 16, 1, 0)
-MainPanel.filter_menu.item.gun.text:SetText(L["Gun"])
-
--------------------------------------------------------------------------------
--- Create MainPanel.filter_menu.player, and set its scripts.
--------------------------------------------------------------------------------
-MainPanel.filter_menu.player = CreateFrame("Frame", nil, MainPanel.filter_menu)
-MainPanel.filter_menu.player:SetWidth(FILTERMENU_SMALL)
-MainPanel.filter_menu.player:SetHeight(280)
-MainPanel.filter_menu.player:EnableMouse(true)
-MainPanel.filter_menu.player:EnableKeyboard(true)
-MainPanel.filter_menu.player:SetMovable(false)
-MainPanel.filter_menu.player:SetPoint("TOPLEFT", MainPanel.filter_menu, "TOPLEFT", 17, -16)
-MainPanel.filter_menu.player:Hide()
-
--------------------------------------------------------------------------------
--- Create the CheckButtons for MainPanel.filter_menu.player
--------------------------------------------------------------------------------
-MainPanel.filter_menu.player.tank = CreateFrame("CheckButton", nil, MainPanel.filter_menu.player)
-InitializeCheckButton(MainPanel.filter_menu.player.tank, MainPanel.filter_menu.player, L["TANKS_DESC"], "tank", 1, 1, 0)
-MainPanel.filter_menu.player.tank.text:SetText(_G.TANK)
-
-MainPanel.filter_menu.player.melee = CreateFrame("CheckButton", nil, MainPanel.filter_menu.player)
-InitializeCheckButton(MainPanel.filter_menu.player.melee, MainPanel.filter_menu.player, L["MELEE_DPS_DESC"], "melee", 2, 1, 0)
-MainPanel.filter_menu.player.melee.text:SetText(_G.MELEE)
-
-MainPanel.filter_menu.player.healer = CreateFrame("CheckButton", nil, MainPanel.filter_menu.player)
-InitializeCheckButton(MainPanel.filter_menu.player.healer, MainPanel.filter_menu.player, L["HEALERS_DESC"], "healer", 3, 1, 0)
-MainPanel.filter_menu.player.healer.text:SetText(_G.HEALER)
-
-MainPanel.filter_menu.player.caster = CreateFrame("CheckButton", nil, MainPanel.filter_menu.player)
-InitializeCheckButton(MainPanel.filter_menu.player.caster, MainPanel.filter_menu.player, L["CASTER_DPS_DESC"], "caster", 4, 1, 0)
-MainPanel.filter_menu.player.caster.text:SetText(_G.DAMAGER)
-
--------------------------------------------------------------------------------
--- Create MainPanel.filter_menu.rep, and set its scripts.
--------------------------------------------------------------------------------
-MainPanel.filter_menu.rep = CreateFrame("Frame", nil, MainPanel.filter_menu)
-MainPanel.filter_menu.rep:SetWidth(FILTERMENU_SMALL)
-MainPanel.filter_menu.rep:SetHeight(280)
-MainPanel.filter_menu.rep:EnableMouse(true)
-MainPanel.filter_menu.rep:EnableKeyboard(true)
-MainPanel.filter_menu.rep:SetMovable(false)
-MainPanel.filter_menu.rep:SetPoint("TOPLEFT", MainPanel.filter_menu, "TOPLEFT", 17, -16)
-MainPanel.filter_menu.rep:Hide()
-
--------------------------------------------------------------------------------
--- Create the expansion toggles for MainPanel.filter_menu.rep
--------------------------------------------------------------------------------
-do
-	-------------------------------------------------------------------------------
-	-- Generic function to create expansion buttons in MainPanel.filter_menu.rep
-	-------------------------------------------------------------------------------
-	local function CreateExpansionButton(texture, tooltip_text)
-		local cButton = CreateFrame("CheckButton", nil, MainPanel.filter_menu.rep)
-		cButton:SetWidth(100)
-		cButton:SetHeight(46)
-		cButton:SetChecked(false)
-
-		local iconTex = cButton:CreateTexture(nil, "BORDER")
-
-		if texture == "wotlk_logo" then
-			iconTex:SetTexture("Interface\\Addons\\AckisRecipeList\\img\\" .. texture)
-		else
-			iconTex:SetTexture('Interface/Glues/Common/' .. texture)
-		end
-		iconTex:SetWidth(100)
-		iconTex:SetHeight(46)
-		iconTex:SetAllPoints(cButton)
-
-		local pushedTexture = cButton:CreateTexture(nil, "ARTWORK")
-		pushedTexture:SetTexture('Interface/Buttons/UI-Quickslot-Depress')
-		pushedTexture:SetAllPoints(cButton)
-		cButton:SetPushedTexture(pushedTexture)
-
-		local highlightTexture = cButton:CreateTexture()
-		highlightTexture:SetTexture('Interface/Buttons/ButtonHilight-Square')
-		highlightTexture:SetAllPoints(cButton)
-		highlightTexture:SetBlendMode('ADD')
-		cButton:SetHighlightTexture(highlightTexture)
-
-		local checkedTexture = cButton:CreateTexture()
-		checkedTexture:SetTexture('Interface/Buttons/CheckButtonHilight')
-		checkedTexture:SetAllPoints(cButton)
-		checkedTexture:SetBlendMode('ADD')
-		cButton:SetCheckedTexture(checkedTexture)
-
-		-- And throw up a tooltip
-		SetTooltipScripts(cButton, tooltip_text)
-
-		return cButton
-	end
-
-	-------------------------------------------------------------------------------
-	-- Rep Filtering panel switcher
-	-------------------------------------------------------------------------------
-	local function RepFilterSwitch(whichrep)
-		-- 1	MainPanel.filter_menu.rep.toggle_originalwow		Classic Rep
-		-- 2	MainPanel.filter_menu.rep.toggle_bc			Burning Crusade
-		-- 3	MainPanel.filter_menu.rep.toggle_wrath			Wrath of the Lich King
-		local ShowPanel = false
-
-		if whichrep == 1 then
-			if MainPanel.filter_menu.rep.toggle_originalwow:GetChecked() then
-				ShowPanel = true
-				MainPanel.filter_menu.rep.Classic:Show()
-				MainPanel.filter_menu.rep.BC:Hide()
-				MainPanel.filter_menu.rep.LK:Hide()
-				MainPanel.filter_menu.rep.toggle_bc:SetChecked(false)
-				MainPanel.filter_menu.rep.toggle_wrath:SetChecked(false)
-			else
-				ShowPanel = false
-			end
-		elseif whichrep == 2 then
-			if MainPanel.filter_menu.rep.toggle_bc:GetChecked() then
-				ShowPanel = true
-				MainPanel.filter_menu.rep.Classic:Hide()
-				MainPanel.filter_menu.rep.BC:Show()
-				MainPanel.filter_menu.rep.LK:Hide()
-				MainPanel.filter_menu.rep.toggle_originalwow:SetChecked(false)
-				MainPanel.filter_menu.rep.toggle_wrath:SetChecked(false)
-			else
-				ShowPanel = false
-			end
-		else -- whichrep == 3 (WotLK)
-			if MainPanel.filter_menu.rep.toggle_wrath:GetChecked() then
-				ShowPanel = true
-				MainPanel.filter_menu.rep.Classic:Hide()
-				MainPanel.filter_menu.rep.BC:Hide()
-				MainPanel.filter_menu.rep.LK:Show()
-				MainPanel.filter_menu.rep.toggle_originalwow:SetChecked(false)
-				MainPanel.filter_menu.rep.toggle_bc:SetChecked(false)
-			else
-				ShowPanel = false
-			end
-		end
-		local texture = MainPanel.filter_menu.texture
-		texture:ClearAllPoints()
-
-		if ShowPanel then
-			MainPanel.filter_menu:SetWidth(FILTERMENU_DOUBLE_WIDTH)
-
-			texture:SetTexture([[Interface\Addons\AckisRecipeList\img\fly_repcol]])
-			texture:SetAllPoints(MainPanel.filter_menu)
-			texture:SetTexCoord(0, (FILTERMENU_DOUBLE_WIDTH/512), 0, (FILTERMENU_HEIGHT/512))
-
-			MainPanel.filter_menu.rep.Classic:SetPoint("TOPRIGHT", MainPanel.filter_menu, "TOPRIGHT", -7, -14)
-			MainPanel.filter_menu.rep.BC:SetPoint("TOPRIGHT", MainPanel.filter_menu, "TOPRIGHT", -7, -14)
-			MainPanel.filter_menu.rep.LK:SetPoint("TOPRIGHT", MainPanel.filter_menu, "TOPRIGHT", -7, -14)
-		else
-			MainPanel.filter_menu:SetWidth(FILTERMENU_SINGLE_WIDTH)
-
-			texture:SetTexture([[Interface\Addons\AckisRecipeList\img\fly_1col]])
-			texture:SetAllPoints(MainPanel.filter_menu)
-			texture:SetTexCoord(0, (FILTERMENU_SINGLE_WIDTH/256), 0, (FILTERMENU_HEIGHT/512))
-
-			MainPanel.filter_menu.rep.Classic:Hide()
-			MainPanel.filter_menu.rep.BC:Hide()
-			MainPanel.filter_menu.rep.LK:Hide()
-
-			MainPanel.filter_menu.rep.toggle_originalwow:SetChecked(false)
-			MainPanel.filter_menu.rep.toggle_bc:SetChecked(false)
-			MainPanel.filter_menu.rep.toggle_wrath:SetChecked(false)
-		end
-	end
-	MainPanel.filter_menu.rep.toggle_originalwow = CreateExpansionButton("Glues-WoW-Logo", L["FILTERING_OLDWORLD_DESC"])
-	MainPanel.filter_menu.rep.toggle_originalwow:SetPoint("TOPLEFT", MainPanel.filter_menu.rep, "TOPLEFT", 0, -10)
-	MainPanel.filter_menu.rep.toggle_originalwow:SetScript("OnClick",
-				    function()
-					    RepFilterSwitch(1)
-				    end)
-
-	MainPanel.filter_menu.rep.toggle_bc = CreateExpansionButton("GLUES-WOW-BCLOGO", L["FILTERING_BC_DESC"])
-	MainPanel.filter_menu.rep.toggle_bc:SetPoint("TOPLEFT", MainPanel.filter_menu.rep, "TOPLEFT", 0, -60)
-	MainPanel.filter_menu.rep.toggle_bc:SetScript("OnClick",
-						      function()
-							      RepFilterSwitch(2)
-						      end)
-
-	MainPanel.filter_menu.rep.toggle_wrath = CreateExpansionButton("wotlk_logo", L["FILTERING_WOTLK_DESC"])
-	MainPanel.filter_menu.rep.toggle_wrath:SetPoint("TOPLEFT", MainPanel.filter_menu.rep, "TOPLEFT", 0, -110)
-	MainPanel.filter_menu.rep.toggle_wrath:SetScript("OnClick",
-							 function()
-								 RepFilterSwitch(3)
-							 end)
-end	-- do
-
--------------------------------------------------------------------------------
--- Create MainPanel.filter_menu.rep.Classic, and set its scripts.
--------------------------------------------------------------------------------
-MainPanel.filter_menu.rep.Classic = CreateFrame("Frame", nil, MainPanel.filter_menu.rep)
-MainPanel.filter_menu.rep.Classic:SetWidth(150)
-MainPanel.filter_menu.rep.Classic:SetHeight(280)
-MainPanel.filter_menu.rep.Classic:EnableMouse(true)
-MainPanel.filter_menu.rep.Classic:EnableKeyboard(true)
-MainPanel.filter_menu.rep.Classic:SetMovable(false)
-MainPanel.filter_menu.rep.Classic:SetPoint("TOPRIGHT", MainPanel.filter_menu, "TOPRIGHT", -7, -16)
-MainPanel.filter_menu.rep.Classic:Hide()
-
--------------------------------------------------------------------------------
--- Create MainPanel.filter_menu.rep.BC, and set its scripts.
--------------------------------------------------------------------------------
-MainPanel.filter_menu.rep.BC = CreateFrame("Frame", nil, MainPanel.filter_menu.rep)
-MainPanel.filter_menu.rep.BC:SetWidth(150)
-MainPanel.filter_menu.rep.BC:SetHeight(280)
-MainPanel.filter_menu.rep.BC:EnableMouse(true)
-MainPanel.filter_menu.rep.BC:EnableKeyboard(true)
-MainPanel.filter_menu.rep.BC:SetMovable(false)
-MainPanel.filter_menu.rep.BC:SetPoint("TOPRIGHT", MainPanel.filter_menu, "TOPRIGHT", -7, -16)
-MainPanel.filter_menu.rep.BC:Hide()
-
--------------------------------------------------------------------------------
--- Create MainPanel.filter_menu.rep.LK, and set its scripts.
--------------------------------------------------------------------------------
-MainPanel.filter_menu.rep.LK = CreateFrame("Frame", nil, MainPanel.filter_menu.rep)
-MainPanel.filter_menu.rep.LK:SetWidth(150)
-MainPanel.filter_menu.rep.LK:SetHeight(280)
-MainPanel.filter_menu.rep.LK:EnableMouse(true)
-MainPanel.filter_menu.rep.LK:EnableKeyboard(true)
-MainPanel.filter_menu.rep.LK:SetMovable(false)
-MainPanel.filter_menu.rep.LK:SetPoint("TOPRIGHT", MainPanel.filter_menu, "TOPRIGHT", -7, -16)
-MainPanel.filter_menu.rep.LK:Hide()
-
-
--------------------------------------------------------------------------------
--- Create MainPanel.scrollframe and set its scripts.
--------------------------------------------------------------------------------
-MainPanel.scroll_frame = CreateFrame("ScrollFrame", "ARL_MainPanelScrollFrame", MainPanel, "FauxScrollFrameTemplate")
-MainPanel.scroll_frame:SetHeight(322)
-MainPanel.scroll_frame:SetWidth(243)
-MainPanel.scroll_frame:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 20, -97)
-MainPanel.scroll_frame:SetScript("OnVerticalScroll",
-				 function(self, arg1)
-					 self.scrolling = true
-					 FauxScrollFrame_OnVerticalScroll(self, arg1, 16, self.Update)
-					 self.scrolling = nil
-				 end)
-
-MainPanel.scroll_frame.entries = {}
-MainPanel.scroll_frame.state_buttons = {}
-MainPanel.scroll_frame.recipe_buttons = {}
-
-do
-	local highlight = CreateFrame("Frame", nil, UIParent)
-	highlight:SetFrameStrata("TOOLTIP")
-	highlight:Hide()
-
-	highlight._texture = highlight:CreateTexture(nil, "OVERLAY")
-	highlight._texture:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
-	highlight._texture:SetBlendMode("ADD")
-	highlight._texture:SetAllPoints(highlight)
-
-	local function Button_OnEnter(self)
-		GenerateTooltipContent(self, MainPanel.scroll_frame.entries[self.string_index].recipe_id)
-	end
-
-	local function Button_OnLeave()
-		QTip:Release(acquire_tip)
-		spell_tip:Hide()
-	end
-
-	local function Bar_OnEnter(self)
-		highlight:SetParent(self)
-		highlight:SetAllPoints(self)
-		highlight:Show()
-		GenerateTooltipContent(self, MainPanel.scroll_frame.entries[self.string_index].recipe_id)
-	end
-
-	local function Bar_OnLeave()
-		highlight:Hide()
-		highlight:ClearAllPoints()
-		highlight:SetParent(nil)
-		QTip:Release(acquire_tip)
-		spell_tip:Hide()
-	end
-
-	-------------------------------------------------------------------------------
-	-- Colours a skill level based on whether or not the player has a high enough
-	-- skill level or faction to learn it.
-	-------------------------------------------------------------------------------
-	local function ColourSkillLevel(recipeEntry, hasFaction, recipe_text)
-		local skill_level = Player["ProfessionLevel"]
-		local recipe_level = recipeEntry["Level"]
-		local recipeOrange = recipeEntry["Orange"]
-		local recipeYellow = recipeEntry["Yellow"]
-		local recipeGreen = recipeEntry["Green"]
-		local recipeGrey = recipeEntry["Grey"]
-
-		if recipe_level > skill_level or not hasFaction then
-			return addon:Red(recipe_text)
-		elseif skill_level >= recipeGrey then
-			return addon:MidGrey(recipe_text)
-		elseif skill_level >= recipeGreen then
-			return addon:Green(recipe_text)
-		elseif skill_level >= recipeYellow then
-			return addon:Yellow(recipe_text)
-		elseif skill_level >= recipeOrange then
-			return addon:Orange(recipe_text)
-		else
-			--@alpha@
-			addon:Print("DEBUG: ColourSkillLevel fallback: " .. recipe_text)
-			--@end-alpha@
-			return addon:MidGrey(recipe_text)
-		end
-	end
-
-	function MainPanel.scroll_frame:Update(expand_acquires, refresh)
-		local sorted_recipes = addon.sorted_recipes
-		local recipe_list = addon.recipe_list
-		local exclusions = addon.db.profile.exclusionlist
-		local sort_type = addon.db.profile.sorting
-		local skill_sort = (sort_type == "SkillAsc" or sort_type == "SkillDesc")
-		local insert_index = 1
-
-		-- If not refreshing an existing list and not scrolling up/down, wipe and re-initialize the entries.
-		if not refresh and not self.scrolling then
-			for i = 1, #self.entries do
-				ReleaseTable(self.entries[i])
-			end
-			twipe(self.entries)
-
-			for i = 1, #sorted_recipes do
-				local recipe_index = sorted_recipes[i]
-				local recipe_entry = recipe_list[recipe_index]
-
-				if recipe_entry["Display"] and recipe_entry["Search"] then
-					local recipe_string = recipe_entry["Name"]
-
-					if exclusions[recipe_index] then
-						recipe_string = "** " .. recipe_string .. " **"
-					end
-					local recipe_level = recipe_entry["Level"]
-
-					recipe_string = skill_sort and ("[" .. recipe_level .. "] - " .. recipe_string) or (recipe_string .. " - [" .. recipe_level .. "]")
-
-					local t = AcquireTable()
-					t.text = ColourSkillLevel(recipe_entry, Player:HasProperRepLevel(recipe_index), recipe_string)
-
-					t.recipe_id = recipe_index
-					t.is_header = true
-
-					if expand_acquires and recipe_entry["Acquire"] then
-						-- we have acquire information for this. push the title entry into the strings
-						-- and start processing the acquires
-						t.is_expanded = true
-						tinsert(self.entries, insert_index, t)
-						insert_index = self:ExpandEntry(insert_index)
-					else
-						t.is_expanded = false
-						tinsert(self.entries, insert_index, t)
-						insert_index = insert_index + 1
-					end
-				end
-			end
-		end
-
-		-- Reset the current buttons/lines
-		for i = 1, NUM_RECIPE_LINES do
-			local recipe = self.recipe_buttons[i]
-			local state = self.state_buttons[i]
-
-			recipe.string_index = 0
-			recipe:SetText("")
-			recipe:SetScript("OnEnter", nil)
-			recipe:SetScript("OnLeave", nil)
-
-			state.string_index = 0
-			state:Hide()
-			state:SetScript("OnEnter", nil)
-			state:SetScript("OnLeave", nil)
-		end
-		local num_entries = #self.entries
-		local display_lines = NUM_RECIPE_LINES
-
-		if num_entries < display_lines then
-			display_lines = num_entries / 2
-		end
-		FauxScrollFrame_Update(self, num_entries, display_lines, 16)
-		addon:ClosePopups()
-
-		if num_entries > 0 then
-			ARL_ExpandButton:SetNormalFontObject("GameFontNormalSmall")
-			ARL_ExpandButton:Enable()
-
-			-- Populate the buttons with new values
-			local button_index = 1
-			local string_index = button_index + FauxScrollFrame_GetOffset(self)
-			local stayInLoop = true
-
-			while stayInLoop do
-				local cur_state = self.state_buttons[button_index]
-				local cur_entry = self.entries[string_index]
-
-				if cur_entry.is_header then
-					cur_state:Show()
-
-					if cur_entry.is_expanded then
-						cur_state:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up")
-						cur_state:SetPushedTexture("Interface\\Buttons\\UI-MinusButton-Down")
-						cur_state:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
-						cur_state:SetDisabledTexture("Interface\\Buttons\\UI-MinusButton-Disabled")
-					else
-						cur_state:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up")
-						cur_state:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-Down")
-						cur_state:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
-						cur_state:SetDisabledTexture("Interface\\Buttons\\UI-PlusButton-Disabled")
-					end
-					cur_state.string_index = string_index
-					cur_state:SetScript("OnEnter", Button_OnEnter)
-					cur_state:SetScript("OnLeave", Button_OnLeave)
-				else
-					cur_state:Hide()
-				end
-				local cur_recipe = self.recipe_buttons[button_index]
-
-				cur_recipe.string_index = string_index
-				cur_recipe:SetText(cur_entry.text)
-				cur_recipe:SetScript("OnEnter", Bar_OnEnter)
-				cur_recipe:SetScript("OnLeave", Bar_OnLeave)
-
-				button_index = button_index + 1
-				string_index = string_index + 1
-
-				if button_index > NUM_RECIPE_LINES or string_index > num_entries then
-					stayInLoop = false
-				end
-			end
-		else
-			-- disable expand button, it's useless here and would spam the same error again
-			ARL_ExpandButton:SetNormalFontObject("GameFontDisableSmall")
-			ARL_ExpandButton:Disable()
-
-			local showpopup = false
-
-			if not addon.db.profile.hidepopup then
-				showpopup = true
-			end
-
-			-- If we haven't run this before we'll show pop-ups for the first time.
-			if addon.db.profile.addonversion ~= addon.version then
-				addon.db.profile.addonversion = addon.version
-				showpopup = true
-			end
-
-			if Player.recipes_total == 0 then
-				if showpopup then
-					StaticPopup_Show("ARL_NOTSCANNED")
-				end
-			elseif Player.recipes_known == Player.recipes_total then
-				if showpopup then
-					StaticPopup_Show("ARL_ALLKNOWN")
-				end
-			elseif (Player.recipes_total_filtered - Player.recipes_known_filtered) == 0 then
-				if showpopup then
-					StaticPopup_Show("ARL_ALLFILTERED")
-				end
-			elseif Player.excluded_recipes_unknown ~= 0 then
-				if showpopup then
-					StaticPopup_Show("ARL_ALLEXCLUDED")
-				end
-			elseif ARL_SearchText:GetText() ~= "" then
-				StaticPopup_Show("ARL_SEARCHFILTERED")
-			else
-				addon:Print(L["NO_DISPLAY"])
-				addon:Print("DEBUG: recipes_total check for 0")
-				addon:Print("DEBUG: recipes_total: " .. Player.recipes_total)
-				addon:Print("DEBUG: recipes_total check for equal to recipes_total")
-				addon:Print("DEBUG: recipes_known: " .. Player.recipes_known)
-				addon:Print("DEBUG: recipes_total: " .. Player.recipes_total)
-				addon:Print("DEBUG: recipes_total_filtered - recipes_known_filtered = 0")
-				addon:Print("DEBUG: recipes_total_filtered: " .. Player.recipes_total_filtered)
-				addon:Print("DEBUG: recipes_known_filtered: " .. Player.recipes_known_filtered)
-				addon:Print("DEBUG: excluded_recipes_unknown ~= 0")
-				addon:Print("DEBUG: excluded_recipes_unknown: " .. Player.excluded_recipes_unknown)
-			end
-		end
-	end
-	local faction_strings
-
-	local function CheckDisplayFaction(faction)
-		if addon.db.profile.filters.general.faction then
-			return true
-		end
-		return (not faction or faction == BFAC[Player["Faction"]] or faction == FACTION_NEUTRAL)
-	end
-
-	function MainPanel.scroll_frame:ExpandEntry(entry_index)
-		local obtain_filters = addon.db.profile.filters.obtain
-		local recipe_id = self.entries[entry_index].recipe_id
-		local pad = "  "
-
-		-- entry_index is the position in self.entries that we want
-		-- to expand. Since we are expanding the current entry, the return
-		-- value should be the index of the next button after the expansion
-		-- occurs
-		entry_index = entry_index + 1
-
-		for index, acquire in pairs(addon.recipe_list[recipe_id]["Acquire"]) do
-			-- Initialize the first line here, since every type below will have one.
-			local acquire_type = acquire["Type"]
-			local t = AcquireTable()
-			t.recipe_id = recipe_id
-			t.is_expanded = true
-
-			if acquire_type == A_TRAINER and obtain_filters.trainer then
-				local trainer = addon.trainer_list[acquire["ID"]]
-
-				if CheckDisplayFaction(trainer["Faction"]) then
-					local nStr = ""
-
-					if trainer["Faction"] == FACTION_HORDE then
-						nStr = addon:Horde(trainer["Name"])
-					elseif trainer["Faction"] == FACTION_ALLIANCE then
-						nStr = addon:Alliance(trainer["Name"])
-					else
-						nStr = addon:Neutral(trainer["Name"])
-					end
-					t.text = pad .. addon:Trainer(L["Trainer"] .. " : ") .. nStr
-
-					tinsert(self.entries, entry_index, t)
-					entry_index = entry_index + 1
-
-					local coord_text = ""
-
-					if trainer["Coordx"] ~= 0 and trainer["Coordy"] ~= 0 then
-						coord_text = addon:Coords("(" .. trainer["Coordx"] .. ", " .. trainer["Coordy"] .. ")")
-					end
-					t = AcquireTable()
-					t.recipe_id = recipe_id
-					t.is_expanded = true
-					t.text = pad .. pad .. trainer["Location"] .. " " .. coord_text
-
-					tinsert(self.entries, entry_index, t)
-					entry_index = entry_index + 1
-				end
-				-- Right now PVP obtained items are located on vendors so they have the vendor and pvp flag.
-				-- We need to display the vendor in the drop down if we want to see vendors or if we want to see PVP
-				-- This allows us to select PVP only and to see just the PVP recipes
-			elseif acquire_type == A_VENDOR and (obtain_filters.vendor or obtain_filters.pvp) then
-				local vendor = addon.vendor_list[acquire["ID"]]
-
-				if CheckDisplayFaction(vendor["Faction"]) then
-					local nStr = ""
-
-					if vendor["Faction"] == FACTION_HORDE then
-						nStr = addon:Horde(vendor["Name"])
-					elseif vendor["Faction"] == FACTION_ALLIANCE then
-						nStr = addon:Alliance(vendor["Name"])
-					else
-						nStr = addon:Neutral(vendor["Name"])
-					end
-					t.text = pad .. addon:Vendor(L["Vendor"] .. " : ") .. nStr
-
-					tinsert(self.entries, entry_index, t)
-					entry_index = entry_index + 1
-
-					local coord_text = ""
-
-					if vendor["Coordx"] ~= 0 and vendor["Coordy"] ~= 0 then
-						coord_text = addon:Coords("(" .. vendor["Coordx"] .. ", " .. vendor["Coordy"] .. ")")
-					end
-					t = AcquireTable()
-					t.recipe_id = recipe_id
-					t.is_expanded = true
-					t.text = pad .. pad .. vendor["Location"] .. " " .. coord_text
-
-					tinsert(self.entries, entry_index, t)
-					entry_index = entry_index + 1
-				end
-				-- Mobs can be in instances, raids, or specific mob related drops.
-			elseif acquire_type == A_MOB and (obtain_filters.mobdrop or obtain_filters.instance or obtain_filters.raid) then
-				local mob = addon.mob_list[acquire["ID"]]
-				t.text = pad .. addon:MobDrop(L["Mob Drop"] .. " : ") .. addon:Red(mob["Name"])
-
-				tinsert(self.entries, entry_index, t)
-				entry_index = entry_index + 1
-
-				local coord_text = ""
-
-				if mob["Coordx"] ~= 0 and mob["Coordy"] ~= 0 then
-					coord_text = addon:Coords("(" .. mob["Coordx"] .. ", " .. mob["Coordy"] .. ")")
-				end
-				t = AcquireTable()
-				t.recipe_id = recipe_id
-				t.is_expanded = true
-				t.text = pad .. pad .. mob["Location"] .. " " .. coord_text
-
-				tinsert(self.entries, entry_index, t)
-				entry_index = entry_index + 1
-			elseif acquire_type == A_QUEST and obtain_filters.quest then
-				local quest = addon.quest_list[acquire["ID"]]
-
-				if CheckDisplayFaction(quest["Faction"]) then
-					local nStr = ""
-
-					if quest["Faction"] == FACTION_HORDE then
-						nStr = addon:Horde(quest["Name"])
-					elseif quest["Faction"] == FACTION_ALLIANCE then
-						nStr = addon:Alliance(quest["Name"])
-					else
-						nStr = addon:Neutral(quest["Name"])
-					end
-					t.text = pad .. addon:Quest(L["Quest"] .. " : ") .. nStr
-
-					tinsert(self.entries, entry_index, t)
-					entry_index = entry_index + 1
-
-					local coord_text = ""
-
-					if quest["Coordx"] ~= 0 and quest["Coordy"] ~= 0 then
-						coord_text = addon:Coords("(" .. quest["Coordx"] .. ", " .. quest["Coordy"] .. ")")
-					end
-					t = AcquireTable()
-					t.recipe_id = recipe_id
-					t.is_expanded = true
-					t.text = pad .. pad .. quest["Location"] .. " " .. coord_text
-
-					tinsert(self.entries, entry_index, t)
-					entry_index = entry_index + 1
-				end
-			elseif acquire_type == A_SEASONAL and obtain_filters.seasonal then
-				t.text = pad .. addon:Season(SEASONAL_CATEGORY .. " : " .. addon.seasonal_list[acquire["ID"]]["Name"])
-				tinsert(self.entries, entry_index, t)
-				entry_index = entry_index + 1
-			elseif acquire_type == A_REPUTATION then -- Need to check if we're displaying the currently id'd rep or not as well
-				-- Reputation Obtain
-				-- Rep: ID, Faction
-				-- RepLevel = 0 (Neutral), 1 (Friendly), 2 (Honored), 3 (Revered), 4 (Exalted)
-				-- RepVendor - VendorID
-				local rep_vendor = addon.vendor_list[acquire["RepVendor"]]
-
-				if CheckDisplayFaction(rep_vendor["Faction"]) then
-					t.text = pad .. addon:Rep(_G.REPUTATION .. " : ") .. addon.reputation_list[acquire["ID"]]["Name"]
-					tinsert(self.entries, entry_index, t)
-					entry_index = entry_index + 1
-
-					if not faction_strings then
-						faction_strings = {
-							[0] = addon:Neutral(FACTION_NEUTRAL .. " : "),
-							[1] = addon:Friendly(BFAC["Friendly"] .. " : "),
-							[2] = addon:Honored(BFAC["Honored"] .. " : "),
-							[3] = addon:Revered(BFAC["Revered"] .. " : "),
-							[4] = addon:Exalted(BFAC["Exalted"] .. " : ")
-						}
-					end
-					local nStr = ""
-
-					if rep_vendor["Faction"] == FACTION_HORDE then
-						nStr = addon:Horde(rep_vendor["Name"])
-					elseif rep_vendor["Faction"] == FACTION_ALLIANCE then
-						nStr = addon:Alliance(rep_vendor["Name"])
-					else
-						nStr = addon:Neutral(rep_vendor["Name"])
-					end
-					t = AcquireTable()
-					t.recipe_id = recipe_id
-					t.is_expanded = true
-
-					t.text = pad .. pad .. faction_strings[acquire["RepLevel"]] .. nStr
-
-					tinsert(self.entries, entry_index, t)
-					entry_index = entry_index + 1
-
-					local coord_text = ""
-
-					if rep_vendor["Coordx"] ~= 0 and rep_vendor["Coordy"] ~= 0 then
-						coord_text = addon:Coords("(" .. rep_vendor["Coordx"] .. ", " .. rep_vendor["Coordy"] .. ")")
-					end
-					t = AcquireTable()
-					t.recipe_id = recipe_id
-					t.is_expanded = true
-					t.text = pad .. pad .. pad .. rep_vendor["Location"] .. " " .. coord_text
-
-					tinsert(self.entries, entry_index, t)
-					entry_index = entry_index + 1
-				end
-			elseif acquire_type == A_WORLD_DROP and obtain_filters.worlddrop then
-				t.text = pad .. addon:RarityColor(acquire["ID"] + 1, L["World Drop"])
-				tinsert(self.entries, entry_index, t)
-				entry_index = entry_index + 1
-			elseif acquire_type == A_CUSTOM then
-				t.text = pad .. addon:Normal(addon.custom_list[acquire["ID"]]["Name"])
-				tinsert(self.entries, entry_index, t)
-				entry_index = entry_index + 1
-			elseif acquire_type == A_PVP and obtain_filters.pvp then
-				local vendor = addon.vendor_list[acquire["ID"]]
-
-				if CheckDisplayFaction(vendor["Faction"]) then
-					local coord_text = ""
-
-					if vendor["Coordx"] ~= 0 and vendor["Coordy"] ~= 0 then
-						coord_text = addon:Coords("(" .. vendor["Coordx"] .. ", " .. vendor["Coordy"] .. ")")
-					end
-					local nStr = ""
-
-					if vendor["Faction"] == FACTION_HORDE then
-						nStr = addon:Horde(vendor["Name"])
-					elseif vendor["Faction"] == FACTION_ALLIANCE then
-						nStr = addon:Alliance(vendor["Name"])
-					else
-						nStr = addon:Neutral(vendor["Name"])
-					end
-					t.text = pad .. addon:Vendor(L["Vendor"] .. " : ") .. nStr
-
-					tinsert(self.entries, entry_index, t)
-					entry_index = entry_index + 1
-
-					t = AcquireTable()
-					t.recipe_id = recipe_id
-					t.is_expanded = true
-					t.text = pad .. pad .. vendor["Location"] .. " " .. coord_text
-
-					tinsert(self.entries, entry_index, t)
-					entry_index = entry_index + 1
-				end
-				--@alpha@
-			elseif acquire_type > A_MAX then
-				t.text = "Unhandled Acquire Case - Type: " .. acquire_type
-				tinsert(self.entries, entry_index, t)
-				entry_index = entry_index + 1
-				--@end-alpha@
-			end
-		end
-		return entry_index
-	end
-end	-- do
-
--------------------------------------------------------------------------------
--- Create MainPanel.progress_bar and set its scripts
--------------------------------------------------------------------------------
-MainPanel.progress_bar = CreateFrame("StatusBar", nil, MainPanel)
-MainPanel.progress_bar:SetWidth(195)
-MainPanel.progress_bar:SetHeight(14)
-
-MainPanel.progress_bar:ClearAllPoints()
-MainPanel.progress_bar:SetPoint("BOTTOMLEFT", MainPanel, 17, 7)
-
-MainPanel.progress_bar:SetStatusBarTexture("Interface\\Addons\\AckisRecipeList\\img\\progressbar")
-MainPanel.progress_bar:SetOrientation("HORIZONTAL")
-MainPanel.progress_bar:SetStatusBarColor(0.25, 0.25, 0.75)
-
-MainPanel.progress_bar.text = MainPanel.progress_bar:CreateFontString(nil, "ARTWORK")
-MainPanel.progress_bar.text:SetWidth(195)
-MainPanel.progress_bar.text:SetHeight(14)
-MainPanel.progress_bar.text:SetFontObject("GameFontHighlightSmall")
-
-MainPanel.progress_bar.text:ClearAllPoints()
-MainPanel.progress_bar.text:SetPoint("CENTER", MainPanel.progress_bar, "CENTER", 0, 0)
-MainPanel.progress_bar.text:SetJustifyH("CENTER")
-
--- Default values for the progressbar
-do
-	local pbMin = 0
-	local pbMax = 100
-	local pbCur = 50
-
-	MainPanel.progress_bar:SetMinMaxValues(pbMin, pbMax)
-	MainPanel.progress_bar:SetValue(pbCur)
-
-	MainPanel.progress_bar.text:SetFormattedText("%d / %d - %1.1f%%", pbCur, pbMax, pbCur / pbMax * 100)
-end	-- do
-
-function MainPanel.progress_bar:Update()
-	local pbCur, pbMax
-	local settings = addon.db.profile
-
-	if settings.includefiltered then
-		pbCur = Player.recipes_known
-		pbMax = Player.recipes_total
-	else
-		-- We're removing filtered recipes from the final count
-		pbCur = Player.recipes_known_filtered
-		pbMax = Player.recipes_total_filtered
-	end
-
-	if not settings.includeexcluded and not settings.ignoreexclusionlist then
-		pbCur = pbCur - Player.excluded_recipes_unknown
-		pbMax = pbMax - Player.excluded_recipes_known
-	end
-	self:SetMinMaxValues(0, pbMax)
-	self:SetValue(pbCur)
-
-	if (floor(pbCur / pbMax * 100) < 101) and pbCur >= 0 and pbMax >= 0 then
-		self.text:SetFormattedText("%d / %d - %1.1f%%", pbCur, pbMax, pbCur / pbMax * 100)
-	else
-		self.text:SetFormattedText("0 / 0 - %s", L["NOT_YET_SCANNED"])
-	end
-end
-
--------------------------------------------------------------------------------
--- Create the close button, and set its scripts.
--------------------------------------------------------------------------------
-MainPanel.close_button = GenericCreateButton(nil, MainPanel, 22, 69, "GameFontNormalSmall", "GameFontHighlightSmall", L["Close"], "CENTER", L["CLOSE_DESC"], 1)
-MainPanel.close_button:SetPoint("BOTTOMRIGHT", MainPanel, "BOTTOMRIGHT", -4, 3)
-
-MainPanel.close_button:SetScript("OnClick",
-				 function(self, button, down)
-					 MainPanel:Hide()
-				 end)
-
--------------------------------------------------------------------------------
--- Map waypoint code.
--------------------------------------------------------------------------------
-do
-	local BZ = LibStub("LibBabble-Zone-3.0"):GetLookupTable()
-
-	local function LoadZones(c, y, ...)
-		-- Fill up the list for normal lookup
-		for i = 1, select('#', ...), 1 do
-			c[i] = select(i, ...)
-
---			if c[i] == BZ["The Storm Peaks"] then
---				addon:Print("We have a match.")
---			end
-		end
-
-		-- Reverse lookup to make work easier later on
-		for i in pairs(c) do
-			y[c[i]] = i
-		end
-	end
-
-	local C1 = {}
-	local C2 = {}
-	local C3 = {}
-	local C4 = {}
-
-	local c1 = {}
-	local c2 = {}
-	local c3 = {}
-	local c4 = {}
-
---	addon:Print("Loading zones for continent 1")
-	LoadZones(C1, c1, GetMapZones(1))
---	addon:Print("Loading zones for continent 2")
-	LoadZones(C2, c2, GetMapZones(2))
---	addon:Print("Loading zones for continent 3")
-	LoadZones(C3, c3, GetMapZones(3))
---	addon:Print("Loading zones for continent 4")
-	LoadZones(C4, c4, GetMapZones(4))
-
-	local iconlist = {}
-
-	-- Clears all the icons from the world map and the mini-map
-	function addon:ClearMap()
-		if TomTom then
-			for i in pairs(iconlist) do
-				TomTom:RemoveWaypoint(iconlist[i])
-			end
-			iconlist = twipe(iconlist)
-		end
-
-	end
-
-	local function CheckMapDisplay(acquire_entry, flags)
-		local maptrainer = addon.db.profile.maptrainer
-		local mapquest = addon.db.profile.mapquest
-		local mapvendor = addon.db.profile.mapvendor
-		local mapmob = addon.db.profile.mapmob
-		local player_faction = Player["Faction"]
-		local acquire_type = acquire_entry["Type"]
-		local acquire_id = acquire_entry["ID"]
-		local display = false
-
-		if acquire_type == A_TRAINER and maptrainer then
-			local trainer = addon.trainer_list[acquire_id]
-
-			display = (trainer["Faction"] == BFAC[player_faction] or trainer["Faction"] == FACTION_NEUTRAL)
-		elseif acquire_type == A_VENDOR and mapvendor then
-			local vendor = addon.vendor_list[acquire_id]
-
-			display = (vendor["Faction"] == BFAC[player_faction] or vendor["Faction"] == FACTION_NEUTRAL)
-		elseif acquire_type == A_REPUTATION and mapvendor then
-			local vendor = addon.vendor_list[acquire_entry["RepVendor"]]
-
-			display = (vendor["Faction"] == BFAC[player_faction] or vendor["Faction"] == FACTION_NEUTRAL)
-		elseif acquire_type == A_MOB and mapmob then
-			return true
-		elseif  acquire_type == A_QUEST and mapquest then
-			local quest = addon.quest_list[acquire_id]
-
-			display = (quest["Faction"] == BFAC[player_faction] or quest["Faction"] == FACTION_NEUTRAL)
-		elseif acquire_type == A_CUSTOM then
-			if flags[F_TRAINER] and maptrainer then
-				return true
-			elseif flags[F_VENDOR] and mapvendor then
-				return true
-			elseif flags[F_QUEST] and mapquest then
-				return true
-			elseif flags[F_INSTANCE] or flags[F_RAID] or flags[F_WORLD_DROP] or flags[F_MOB_DROP] then
-				return true
-			end
-		end
-		return display
-	end
-
-	local INSTANCE_LOCATIONS = {
-		[BZ["Ahn'kahet: The Old Kingdom"]] = {
-			["loc"] = c4[BZ["Dragonblight"]],
-			["c"] = 4,
-			["x"] = 28.49,
-			["y"] = 51.73,
-		},
-		[BZ["Auchenai Crypts"]] = {
-			["loc"] = c1[BZ["Terokkar Forest"]],
-			["c"] = 3,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["Azjol-Nerub"]] = {
-			["loc"] = c4[BZ["Dragonblight"]],
-			["c"] = 4,
-			["x"] = 26.01,
-			["y"] = 50.83,
-		},
-		[BZ["Blackrock Depths"]] = {
-			["loc"] = c1[BZ["Searing Gorge"]],
-			["c"] = 2,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["Blackrock Spire"]] = {
-			["loc"] = c1[BZ["Searing Gorge"]],
-			["c"] = 2,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["Blackwing Lair"]] = {
-			["loc"] = c1[BZ["Searing Gorge"]],
-			["c"] = 2,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["Dire Maul"]] = {
-			["loc"] = c1[BZ["Feralas"]],
-			["c"] = 1,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["Drak'Tharon Keep"]] = {
-			["loc"] = c1[BZ["Zul'Drak"]],
-			["c"] = 4,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["Gnomeregan"]] = {
-			["loc"] = c1[BZ["Dun Morogh"]],
-			["c"] = 2,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["Halls of Lightning"]] = {
-			["loc"] = c4[BZ["The Storm Peaks"]],
-			["c"] = 4,
-			["x"] = 45.40,
-			["y"] = 21.37,
-		},
-		[BZ["Halls of Stone"]] = {
-			["loc"] = c4[BZ["The Storm Peaks"]],
-			["c"] = 4,
-			["x"] = 39.49,
-			["y"] = 26.92,
-		},
-		[BZ["Karazhan"]] = {
-			["loc"] = c1[BZ["Deadwind Pass"]],
-			["c"] = 2,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["Magisters' Terrace"]] = {
-			["loc"] = c2[BZ["Isle of Quel'Danas"]],
-			["c"] = 2,
-			["x"] = 61.20,
-			["y"] = 30.89,
-		},
-		[BZ["Mana-Tombs"]] = {
-			["loc"] = c1[BZ["Terokkar Forest"]],
-			["c"] = 3,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["The Oculus"]] = {
-			["loc"] = c4[BZ["Borean Tundra"]],
-			["c"] = 4,
-			["x"] = 27.52,
-			["y"] = 26.71,
-		},
-		[BZ["Old Hillsbrad Foothills"]] = {
-			["loc"] = c1[BZ["Tanaris"]],
-			["c"] = 1,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["Onyxia's Lair"]] = {
-			["loc"] = c1[BZ["Dustwallow Marsh"]],
-			["c"] = 1,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["Ruins of Ahn'Qiraj"]] = {
-			["loc"] = c1[BZ["Tanaris"]],
-			["c"] = 1,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["Scholomance"]] = {
-			["loc"] = c1[BZ["Western Plaguelands"]],
-			["c"] = 2,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["Sethekk Halls"]] = {
-			["loc"] = c1[BZ["Terokkar Forest"]],
-			["c"] = 3,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["Shadow Labyrinth"]] = {
-			["loc"] = c1[BZ["Terokkar Forest"]],
-			["c"] = 3,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["Stratholme"]] = {
-			["loc"] = c1[BZ["Eastern Plaguelands"]],
-			["c"] = 2,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["Temple of Ahn'Qiraj"]] = {
-			["loc"] = c1[BZ["Tanaris"]],
-			["c"] = 1,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["The Arcatraz"]] = {
-			["loc"] = c1[BZ["Netherstorm"]],
-			["c"] = 3,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["The Black Morass"]] = {
-			["loc"] = c1[BZ["Tanaris"]],
-			["c"] = 1,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["The Botanica"]] = {
-			["loc"] = c1[BZ["Netherstorm"]],
-			["c"] = 3,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["The Deadmines"]] = {
-			["loc"] = c1[BZ["Westfall"]],
-			["c"] = 2,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["The Mechanar"]] = {
-			["loc"] = c1[BZ["Netherstorm"]],
-			["c"] = 3,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["The Nexus"]] = {
-			["loc"] = c4[BZ["Borean Tundra"]],
-			["c"] = 4,
-			["x"] = 27.50,
-			["y"] = 25.97,
-		},
-		[BZ["The Shattered Halls"]] = {
-			["loc"] = c1[BZ["Hellfire Peninsula"]],
-			["c"] = 3,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["The Slave Pens"]] = {
-			["loc"] = c1[BZ["Zangarmarsh"]],
-			["c"] = 3,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["The Steamvault"]] = {
-			["loc"] = c1[BZ["Zangarmarsh"]],
-			["c"] = 3,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["The Temple of Atal'Hakkar"]] = {
-			["loc"] = c1[BZ["Swamp of Sorrows"]],
-			["c"] = 2,
-			["x"] = 0,
-			["y"] = 0,
-		},
-		[BZ["The Violet Hold"]] = {
-			["loc"] = c4[BZ["Dalaran"]],
-			["c"] = 4,
-			["x"] = 66.78,
-			["y"] = 68.19,
-		},
-		[BZ["Utgarde Keep"]] = {
-			["loc"] = c4[BZ["Howling Fjord"]],
-			["c"] = 4,
-			["x"] = 57.28,
-			["y"] = 46.73,
-		},
-		[BZ["Utgarde Pinnacle"]] = {
-			["loc"] = c4[BZ["Howling Fjord"]],
-			["c"] = 4,
-			["x"] = 57.26,
-			["y"] = 46.67,
-		},
-		[BZ["Zul'Gurub"]] = {
-			["loc"] = c1[BZ["Stranglethorn Vale"]],
-			["c"] = 2,
-			["x"] = 0,
-			["y"] = 0,
-		},
-	}
-	local maplist = {}
-
-	-- Description: Adds mini-map and world map icons with tomtom.
-	-- Expected result: Icons are added to the world map and mini-map.
-	-- Input: An optional recipe ID
-	-- Output: Points are added to the maps
-	function addon:SetupMap(single_recipe)
-		if not TomTom then
-			return
-		end
-		local worldmap = addon.db.profile.worldmap
-		local minimap = addon.db.profile.minimap
-
-		if not (worldmap or minimap) then
-			return
-		end
-		local icontext = "Interface\\AddOns\\AckisRecipeList\\img\\enchant_up"
-
-		-- Get the proper icon to put on the mini-map
-		--		for i, k in pairs(SortedProfessions) do
-		--			if (k["name"] == Player["Profession"]) then
-		--				icontext = "Interface\\AddOns\\AckisRecipeList\\img\\" .. k["texture"] .. "_up"
-		--				break
-		--			end
-		--		end
-		twipe(maplist)
-
-		local recipe_list = addon.recipe_list
-
-		-- We're only getting a single recipe, not a bunch
-		if single_recipe then
-			-- loop through acquire methods, display each
-			for index, acquire in pairs(recipe_list[single_recipe]["Acquire"]) do
-				if CheckMapDisplay(acquire, recipe_list[single_recipe]["Flags"]) then
-					maplist[acquire] = true
-				end
-			end
-		elseif addon.db.profile.autoscanmap then
-			local sorted_recipes = addon.sorted_recipes
-
-			-- Scan through all recipes to display, and add the vendors to a list to get their acquire info
-			for i = 1, #sorted_recipes do
-				local recipe_index = sorted_recipes[i]
-
-				if recipe_list[recipe_index]["Display"] and recipe_list[recipe_index]["Search"] then
-					-- loop through acquire methods, display each
-					for index, acquire in pairs(recipe_list[recipe_index]["Acquire"]) do
-						if CheckMapDisplay(acquire, recipe_list[recipe_index]["Flags"]) then
-							maplist[acquire] = true
-						end
-					end
-				end
-			end
-		end
-
-		--		local ARLWorldMap = CreateFrame("Button","ARLWorldMap",WorldMapDetailFrame)
-		--		ARLWorldMap:ClearAllPoints()
-		--		ARLWorldMap:SetWidth(8)
-		--		ARLWorldMap:SetHeight(8)
-		--		ARLWorldMap.icon = ARLWorldMap:CreateTexture("ARTWORK")
-		--		ARLWorldMap.icon:SetTexture(icontext)
-		--		ARLWorldMap.icon:SetAllPoints()
-
-		--		local ARLMiniMap = CreateFrame("Button","ARLMiniMap",MiniMap)
-		--		ARLMiniMap:ClearAllPoints()
-		--		ARLMiniMap:SetWidth(8)
-		--		ARLMiniMap:SetHeight(8)
-		--		ARLMiniMap.icon = ARLMiniMap:CreateTexture("ARTWORK")
-		--		ARLMiniMap.icon:SetTexture(icontext)
-		--		ARLMiniMap.icon:SetAllPoints()
-
-		for entry in pairs(maplist) do
-			local loc
-			local custom = false
-			local id_num = entry["ID"]
-			local acquire_type = entry["Type"]
-
-			-- Get the entries location
-			if acquire_type == A_TRAINER then
-				loc = addon.trainer_list[id_num]
-			elseif acquire_type == A_VENDOR then
-				loc = addon.vendor_list[id_num]
-			elseif acquire_type == A_REPUTATION then
-				loc = addon.vendor_list[entry["RepVendor"]]
-			elseif acquire_type == A_MOB then
-				loc = addon.mob_list[id_num]
-			elseif acquire_type == A_QUEST then
-				loc = addon.quest_list[id_num]
-			elseif acquire_type == A_CUSTOM then
-				loc = addon.custom_list[id_num]
-				custom = true
-			end
-
-			local name = loc["Name"]
-			local x = loc["Coordx"]
-			local y = loc["Coordy"]
-			local location = loc["Location"]
-			local continent, zone
-
-			if not loc then
-				--@alpha@
-				addon:Printf("DEBUG: No continent/zone map match for ID %d  - loc is nil.", id_num)
-				--@end-alpha@
-			elseif c1[location] then
-				continent = 1
-				zone = c1[location]
-			elseif c2[location] then
-				continent = 2
-				zone = c2[location]
-			elseif c3[location] then
-				continent = 3
-				zone = c3[location]
-			elseif c4[location] then
-				continent = 4
-				zone = c4[location]
-			elseif INSTANCE_LOCATIONS[location] then
-				local info = INSTANCE_LOCATIONS[location]
-
-				continent = info["c"]
-				x = info["x"]
-				y = info["y"]
-				zone = info["loc"]
-				name = name .. " (" .. location .. ")"
-			else
-				--@alpha@
-				addon:Printf("DEBUG: No continent/zone map match for ID %d. Location: %s.", idnum, location)
-				--@end-alpha@
-			end
-
-			--@alpha@
-			if (x < -100) or (x > 100) or (y < -100) or (y > 100) then
-				addon:Printf("DEBUG: Invalid location coordinates for ID %d. Location: %s.", idnum, location)
-			end
-			--@end-alpha@
-
-			if zone and continent then
-				--@alpha@
-				if x == 0 and y == 0 then
-					addon:Printf("DEBUG: Location is \"0, 0\" for ID %d. Location: %s.", idnum, location)
-				end
-				--@end-alpha@
-				local iconuid = TomTom:AddZWaypoint(continent, zone, x, y, name, false, minimap, worldmap)
-
-				tinsert(iconlist, iconuid)
-			else
-				--@alpha@
-				if not zone then
-					self:Printf("No zone for ID %d. Location: %s.", id_num, location)
-				end
-
-				if not continent then
-					self:Printf("No continent for ID %d. Location: %s.", id_num, location)
-				end
-				--@end-alpha@
-			end
-		end
-	end
-end -- do block
-
--- Description: Converting from hex to rgb (Thanks Maldivia)
-local function toRGB(hex)
-	local r, g, b = hex:match("(..)(..)(..)")
-
-	return (tonumber(r, 16) / 256), (tonumber(g,16) / 256), (tonumber(b, 16) / 256)
-end
-
-local function SetSortName()
-	local sort_type = addon.db.profile.sorting
-
-	if sort_type == "Name" then
-		ARL_DD_SortText:SetText(L["Sort"] .. ": " .. _G.NAME)
-	elseif sort_type == "SkillAsc" then
-		ARL_DD_SortText:SetText(L["Sort"] .. ": " .. L["Skill (Asc)"])
-	elseif sort_type == "SkillDesc" then
-		ARL_DD_SortText:SetText(L["Sort"] .. ": " .. L["Skill (Desc)"])
-	elseif sort_type == "Acquisition" then
-		ARL_DD_SortText:SetText(L["Sort"] .. ": " .. L["Acquisition"])
-	elseif sort_type == "Location" then
-		ARL_DD_SortText:SetText(L["Sort"] .. ": " .. L["Location"])
-	end
-
-end
-
-local function ARL_DD_Sort_OnClick(button, value)
-	CloseDropDownMenus()
-	addon.db.profile.sorting = value
-	SetSortName()
-	ReDisplay()
-end
-
-local function ARL_DD_Sort_Initialize()
-	local info = UIDropDownMenu_CreateInfo()
-
-	local k = "Name"
-	info.text = k
-	info.arg1 = info.text
-	info.func = ARL_DD_Sort_OnClick
-	info.checked = (addon.db.profile.sorting == k)
-	UIDropDownMenu_AddButton(info)
-
-	k = "SkillAsc"
-	info.text = k
-	info.arg1 = info.text
-	info.func = ARL_DD_Sort_OnClick
-	info.checked = (addon.db.profile.sorting == k)
-	UIDropDownMenu_AddButton(info)
-
-	k = "SkillDesc"
-	info.text = k
-	info.arg1 = info.text
-	info.func = ARL_DD_Sort_OnClick
-	info.checked = (addon.db.profile.sorting == k)
-	UIDropDownMenu_AddButton(info)
-
-	k = "Acquisition"
-	info.text = k
-	info.arg1 = info.text
-	info.func = ARL_DD_Sort_OnClick
-	info.checked = (addon.db.profile.sorting == k)
-	UIDropDownMenu_AddButton(info)
-
-	k = "Location"
-	info.text = k
-	info.arg1 = info.text
-	info.func = ARL_DD_Sort_OnClick
-	info.checked = (addon.db.profile.sorting == k)
-	UIDropDownMenu_AddButton(info)
-
-	SetSortName()
-end
-
--------------------------------------------------------------------------------
--- Data used in GenerateClickableTT() and its support functions.
--------------------------------------------------------------------------------
-local click_info = {
-	anchor = nil,
-	change_realm = nil,
-	target_realm = nil,
-	modified = nil,
-	name = nil,
-	realm = nil,
-}
-local clicktip
-local GenerateClickableTT	-- Upvalued!
-
--------------------------------------------------------------------------------
--- Clicktip OnMouseUp scripts.
--------------------------------------------------------------------------------
-local function ChangeRealm(cell, arg, button)
-	click_info.modified = true
-	click_info.realm = nil
-	click_info.change_realm = true
-	click_info.target_realm = nil
-	GenerateClickableTT()
-end
-
-local function SelectRealm(cell, arg, button)
-	click_info.modified = true
-
-	if click_info.change_realm then
-		click_info.target_realm = arg
-	end
-	click_info.realm = arg
-	GenerateClickableTT()
-end
-
-local function SelectName(cell, arg, button)
-	click_info.modified = true
-	click_info.name = arg
-
-	-- Wipe tradeskill information for the selected toon. -Torhal
-	if IsAltKeyDown() and button == "LeftButton" then
-		local tskl_list = addon.db.global.tradeskill
-		tskl_list[click_info.realm][click_info.name] = nil
-
-		-- See if there are any toons left on the realm. If not, nuke it as well.
-		local found = false
-		for name in pairs(tskl_list[click_info.realm]) do
-			found = true
-		end
-		if not found then
-			tskl_list[click_info.realm] = nil
-		end
-		local anchor = click_info.anchor
-		twipe(click_info)
-		click_info.anchor = anchor
-		GenerateClickableTT()
-		return
-	end
-	GenerateClickableTT()
-end
-
-local function SelectProfession(cell, arg, button)
-	local tskl_list = addon.db.global.tradeskill
-	click_info.modified = true
-	addon:Print(click_info.name .. " - " .. click_info.realm .. ": " .. tskl_list[click_info.realm][click_info.name][arg])
-end
-
--------------------------------------------------------------------------------
--- Creates a list of names/alts/etc in a tooltip which can be clicked.
--------------------------------------------------------------------------------
-function GenerateClickableTT(anchor)
-	local tskl_list = addon.db.global.tradeskill
-	local tip = clicktip
-	local y, x
-	local prealm = GetRealmName()
-	local target_realm = prealm
-
-	if click_info.change_realm then
-		target_realm = click_info.target_realm
-		click_info.change_realm = nil
-	end
-	tip:Clear()
-
-	if not click_info.realm then
-		local other_realms = nil
-		local header = nil
-
-		for realm in pairs(tskl_list) do
-			if target_realm and (realm ~= target_realm) then
-				other_realms = true
-			end
-
-			if not target_realm and (realm ~= prealm) then
-				if not header then
-					tip:AddHeader(L["Other Realms"])
-					tip:AddSeparator()
-					header = true
-				end
-				y, x = tip:AddLine()
-				tip:SetCell(y, x, realm)
-				tip:SetCellScript(y, x, "OnMouseUp", SelectRealm, realm)
-			elseif realm == target_realm then
-				click_info.realm = realm
-
-				tip:AddHeader(realm)
-				tip:AddSeparator()
-
-				for name in pairs(tskl_list[click_info.realm]) do
-					if name ~= UnitName("player") then
-						y, x = tip:AddLine()
-						tip:SetCell(y, x, name)
-						tip:SetCellScript(y, x, "OnMouseUp", SelectName, name)
-					end
-				end
-			end
-		end
-
-		if other_realms then
-			tip:AddSeparator()
-			y, x = tip:AddLine()
-			tip:SetCell(y, x, L["Other Realms"])
-			tip:SetCellScript(y, x, "OnMouseUp", ChangeRealm)
-		end
-		tip:AddSeparator()
-	elseif not click_info.name then
-		local realm_list = tskl_list[click_info.realm]
-
-		if realm_list then
-			tip:AddLine(click_info.realm)
-			tip:AddSeparator()
-
-			for name in pairs(realm_list) do
-				y, x = tip:AddLine()
-				tip:SetCell(y, x, name)
-				tip:SetCellScript(y, x, "OnMouseUp", SelectName, name)
-			end
-			tip:AddSeparator()
-		end
-	else
-		tip:AddHeader(click_info.name)
-		tip:AddSeparator()
-
-		for prof in pairs(tskl_list[click_info.realm][click_info.name]) do
-			y, x = tip:AddLine()
-			tip:SetCell(y, x, prof)
-			tip:SetCellScript(y, x, "OnMouseUp", SelectProfession, prof)
-		end
-		tip:AddSeparator()
-	end
-
-	if anchor then
-		click_info.anchor = anchor
-		tip:SetPoint("TOP", anchor, "BOTTOM")
-	else
-		tip:SetPoint("TOP", click_info.anchor, "BOTTOM")
-	end
-	tip:Show()
-end
-
--------------------------------------------------------------------------------
--- Initializes runtime elements of MainPanel.
--------------------------------------------------------------------------------
-function addon:InitializeFrame()
-	-------------------------------------------------------------------------------
-	-- Check to see if we're Horde or Alliance, and change the displayed
-	-- reputation strings to be faction-correct.
-	-------------------------------------------------------------------------------
-	local isAlliance = (Player["Faction"] == "Alliance")
-
-	local HonorHold_Thrallmar_FactionText = isAlliance and BFAC["Honor Hold"] or BFAC["Thrallmar"]
-	local Kurenai_Maghar_FactionText = isAlliance and BFAC["Kurenai"] or BFAC["The Mag'har"]
-	local Vanguard_Expedition_FactionText = isAlliance and BFAC["Alliance Vanguard"] or BFAC["Horde Expedition"]
-	local SilverConv_Sunreaver_FactionText = isAlliance and BFAC["The Silver Covenant"] or BFAC["The Sunreavers"]
-	local Valiance_Warsong_FactionText = isAlliance and BFAC["Valiance Expedition"] or BFAC["Warsong Offensive"]
-	local Frostborn_Taunka_FactionText = isAlliance and BFAC["The Frostborn"] or BFAC["The Taunka"]
-	local Explorer_Hand_FactionText = isAlliance and BFAC["Explorers' League"] or BFAC["The Hand of Vengeance"]
-
-	-------------------------------------------------------------------------------
-	-- Create the sort-type DropDown.
-	-------------------------------------------------------------------------------
-	local ARL_DD_Sort = CreateFrame("Frame", "ARL_DD_Sort", MainPanel, "UIDropDownMenuTemplate")
-	ARL_DD_Sort:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 55, -39)
-	ARL_DD_Sort:SetHitRectInsets(16, 16, 0, 0)
-	SetSortName()
-	UIDropDownMenu_SetWidth(ARL_DD_Sort, 105)
-
-	-------------------------------------------------------------------------------
-	-- Create the expand button and set its scripts.
-	-------------------------------------------------------------------------------
-	local ARL_ExpandButton = GenericCreateButton("ARL_ExpandButton", MainPanel, 21, 40, "GameFontNormalSmall", "GameFontHighlightSmall", L["EXPANDALL"], "CENTER",
-						     L["EXPANDALL_DESC"], 1)
-	ARL_ExpandButton:SetPoint("TOPRIGHT", ARL_DD_Sort, "BOTTOMLEFT", -2, 0)
-
-	ARL_ExpandButton:SetScript("OnClick",
-				   function(self, mouse_button, down)
-					   local expand_acquires = (self:GetText() == L["EXPANDALL"])
-
-					   if expand_acquires then
-						   self:SetText(L["CONTRACTALL"])
-						   SetTooltipScripts(self, L["CONTRACTALL_DESC"])
-					   else
-						   self:SetText(L["EXPANDALL"])
-						   SetTooltipScripts(self, L["EXPANDALL_DESC"])
-					   end
-					   MainPanel.scroll_frame:Update(expand_acquires, false)
-				   end)
-	ARL_ExpandButton:SetText(L["EXPANDALL"])
-	SetTooltipScripts(ARL_ExpandButton, L["EXPANDALL_DESC"])
-
-	-------------------------------------------------------------------------------
-	-- The search button, clear button, and search entry box.
-	-------------------------------------------------------------------------------
-	local SearchRecipes
-	do
-		local search_params = {
-			["ItemID"]	= true,
-			["Name"]	= true,
-			["Locations"]	= true,
-			["Specialty"]	= true,
-			["Level"]	= true,
-			["Rarity"]	= true,
-		}
-		-- Scans through the recipe database and toggles the flag on if the item is in the search criteria
-		function SearchRecipes(pattern)
-			if not pattern then
-				return
-			end
-			pattern = pattern:lower()
-
-			local recipe_list = addon.recipe_list
-
-			for index in pairs(recipe_list) do
-				local entry = recipe_list[index]
-				entry["Search"] = false
-
-				for field in pairs(search_params) do
-					local str = entry[field] and tostring(entry[field]):lower() or nil
-
-					if str and str:find(pattern) then
-						entry["Search"] = true
-						break
-					end
-				end
-			end
-		end
-	end	-- do
-
-	local ARL_SearchButton = GenericCreateButton("ARL_SearchButton", MainPanel, 25, 74, "GameFontDisableSmall", "GameFontHighlightSmall", _G.SEARCH, "CENTER",
-						     L["SEARCH_DESC"], 1)
-	ARL_SearchButton:SetPoint("TOPLEFT", ARL_DD_Sort, "BOTTOMRIGHT", 1, 4)
-
-	ARL_SearchButton:Disable()
-	ARL_SearchButton:SetScript("OnClick",
-				   function(this)
-					   local searchtext = ARL_SearchText:GetText()
-					   searchtext = searchtext:trim()
-
-					   if searchtext ~= "" then
-						   ARL_LastSearchedText = searchtext
-
-						   SearchRecipes(searchtext)
-						   MainPanel.scroll_frame:Update(false, false)
-
-						   ARL_ExpandButton:SetText(L["EXPANDALL"])
-						   SetTooltipScripts(ARL_ExpandButton, L["EXPANDALL_DESC"])
-
-						   ARL_SearchButton:SetNormalFontObject("GameFontDisableSmall")
-						   ARL_SearchButton:Disable()
-					   end
-				   end)
-
-	local ARL_ClearButton = GenericCreateButton("ARL_ClearButton", MainPanel, 28, 28, "GameFontNormalSmall", "GameFontHighlightSmall", "", "CENTER", L["CLEAR_DESC"], 3)
-	ARL_ClearButton:SetPoint("RIGHT", ARL_SearchButton, "LEFT", 4, -1)
-
-	ARL_ClearButton:SetScript("OnClick",
-				  function()
-					  local recipe_list = addon.recipe_list
-
-					  -- Reset the search flags
-					  for index in pairs(recipe_list) do
-						  recipe_list[index]["Search"] = true
-					  end
-					  ARL_SearchText:SetText(L["SEARCH_BOX_DESC"])
-
-					  -- Make sure our expand all button is set to expandall
-					  ARL_ExpandButton:SetText(L["EXPANDALL"])
-					  SetTooltipScripts(ARL_ExpandButton, L["EXPANDALL_DESC"])
-
-					  -- Make sure to clear the focus of the searchbox
-					  ARL_SearchText:ClearFocus()
-
-					  -- Disable the search button since we're not searching for anything now
-					  ARL_SearchButton:SetNormalFontObject("GameFontDisableSmall")
-					  ARL_SearchButton:Disable()
-
-					  -- Make sure to clear text for last search
-					  ARL_LastSearchedText = ""
-
-					  MainPanel.scroll_frame:Update(false, false)
-				  end)
-
-	ARL_SearchText = CreateFrame("EditBox", "ARL_SearchText", MainPanel, "InputBoxTemplate")
-	ARL_SearchText:SetText(L["SEARCH_BOX_DESC"])
-	ARL_SearchText:SetScript("OnEnterPressed",
-				 function(this)
-					 local searchtext = ARL_SearchText:GetText()
-					 searchtext = searchtext:trim()
-
-					 if searchtext ~= "" and searchtext ~= L["SEARCH_BOX_DESC"] then
-						 ARL_LastSearchedText = searchtext
-
-						 SearchRecipes(searchtext)
-						 MainPanel.scroll_frame:Update(false, false)
-
-						 ARL_ExpandButton:SetText(L["EXPANDALL"])
-						 SetTooltipScripts(ARL_ExpandButton, L["EXPANDALL_DESC"])
-
-						 ARL_SearchButton:SetNormalFontObject("GameFontDisableSmall")
-						 ARL_SearchButton:Disable()
-					 end
-				 end)
-	ARL_SearchText:SetScript("OnEditFocusGained",
-				 function(this)
-					 if this:GetText() == L["SEARCH_BOX_DESC"] then
-						 this:SetText("")
-					 end
-				 end)
-	ARL_SearchText:SetScript("OnEditFocusLost",
-				 function(this)
-					 if this:GetText() == "" then
-						 this:SetText(L["SEARCH_BOX_DESC"])
-					 end
-				 end)
-	ARL_SearchText:SetScript("OnTextChanged",
-				 function(this)
-					 local text = this:GetText()
-
-					 if text ~= "" and text ~= L["SEARCH_BOX_DESC"] and text ~= ARL_LastSearchedText then
-						 ARL_SearchButton:SetNormalFontObject("GameFontNormalSmall")
-						 ARL_SearchButton:Enable()
-					 else
-						 ARL_SearchButton:SetNormalFontObject("GameFontDisableSmall")
-						 ARL_SearchButton:Disable()
-					 end
-				 end)
-	ARL_SearchText:EnableMouse(true)
-	ARL_SearchText:SetAutoFocus(false)
-	ARL_SearchText:SetFontObject(ChatFontNormal)
-	ARL_SearchText:SetWidth(130)
-	ARL_SearchText:SetHeight(12)
-	ARL_SearchText:SetPoint("RIGHT", ARL_ClearButton, "LEFT", 3, -1)
-	ARL_SearchText:Show()
-
-	-------------------------------------------------------------------------------
-	-- Set the scripts for MainPanel.scroll_frame's buttons.
-	-------------------------------------------------------------------------------
-	do
-		local function RecipeItem_OnClick(self, button)
-			local clickedIndex = self.string_index
-
-			-- Don't do anything if they've clicked on an empty button
-			if not clickedIndex or clickedIndex == 0 then
-				return
-			end
-			local clicked_line = MainPanel.scroll_frame.entries[clickedIndex]
-			local traverseIndex = 0
-
-			-- First, check if this is a "modified" click, and react appropriately
-			if IsModifierKeyDown() then
-				if IsControlKeyDown() and IsShiftKeyDown() then
-					addon:SetupMap(clicked_line.recipe_id)
-				elseif IsShiftKeyDown() then
-					local itemID = addon.recipe_list[clicked_line.recipe_id]["ItemID"]
-
-					if itemID then
-						local _, itemLink = GetItemInfo(itemID)
-
-						if itemLink then
-							ChatFrameEditBox:Insert(itemLink)
-						else
-							addon:Print(L["NoItemLink"])
-						end
-					else
-						addon:Print(L["NoItemLink"])
-					end
-				elseif IsControlKeyDown() then
-					ChatFrameEditBox:Insert(addon.recipe_list[clicked_line.recipe_id]["RecipeLink"])
-				elseif IsAltKeyDown() then
-					-- Code needed here to insert this item into the "Ignore List"
-					addon:ToggleExcludeRecipe(clicked_line.recipe_id)
-					ReDisplay()
-				end
-			elseif clicked_line.is_header then
-				-- three possibilities here (all with no modifiers)
-				-- 1) We clicked on the recipe button on a closed recipe
-				-- 2) We clicked on the recipe button of an open recipe
-				-- 3) we clicked on the expanded text of an open recipe
-				if clicked_line.is_expanded then
-					traverseIndex = clickedIndex + 1
-
-					-- get rid of our expanded lines
-					while (MainPanel.scroll_frame.entries[traverseIndex] and not MainPanel.scroll_frame.entries[traverseIndex].is_header) do
-						ReleaseTable(tremove(MainPanel.scroll_frame.entries, traverseIndex))
-
-						if not MainPanel.scroll_frame.entries[traverseIndex] then
-							break
-						end
-					end
-					clicked_line.is_expanded = false
-				else
-					MainPanel.scroll_frame:ExpandEntry(clickedIndex)
-					clicked_line.is_expanded = true
-				end
-			else
-				-- this inherently implies that we're on an expanded recipe
-				-- first, back up in the list of buttons until we find our recipe line
-				local entries = MainPanel.scroll_frame.entries
-
-				traverseIndex = clickedIndex - 1
-
-				while entries[traverseIndex] and not entries[traverseIndex].is_header do
-					traverseIndex = traverseIndex - 1
-				end
-				entries[traverseIndex].is_expanded = false
-				traverseIndex = traverseIndex + 1
-
-				-- now remove the expanded lines until we get to a recipe again
-				while entries[traverseIndex] and not entries[traverseIndex].is_header do
-					ReleaseTable(tremove(entries, traverseIndex))
-
-					if not entries[traverseIndex] then
-						break
-					end
-				end
-			end
-			MainPanel.scroll_frame:Update(false, true)
-		end
-
-		for i = 1, NUM_RECIPE_LINES do
-			local temp_state = GenericCreateButton("ARL_StateButton" .. i, MainPanel.scroll_frame, 16, 16, "GameFontNormalSmall", "GameFontHighlightSmall",
-							       "", "LEFT", "", 2)
-
-			local temp_recipe = GenericCreateButton("ARL_RecipeButton" .. i, MainPanel.scroll_frame, 16, 224, "GameFontNormalSmall", "GameFontHighlightSmall",
-								"Blort", "LEFT", "", 0)
-
-			if i ~= 1 then
-				temp_state:SetPoint("TOPLEFT", MainPanel.scroll_frame.state_buttons[i - 1], "BOTTOMLEFT", 0, 3)
-				temp_recipe:SetPoint("TOPLEFT", MainPanel.scroll_frame.recipe_buttons[i - 1], "BOTTOMLEFT", 0, 3)
-			else
-				temp_state:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 20, -100)
-				temp_recipe:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 37, -100)
-			end
-			temp_state:SetScript("OnClick", RecipeItem_OnClick)
-			temp_recipe:SetScript("OnClick", RecipeItem_OnClick)
-
-			MainPanel.scroll_frame.state_buttons[i] = temp_state
-			MainPanel.scroll_frame.recipe_buttons[i] = temp_recipe
-		end
-	end	-- do
-
-	-------------------------------------------------------------------------------
-	-- Flyaway virtual frames to group buttons/text easily (and make them easy to show/hide)
-	-------------------------------------------------------------------------------
-
-	-------------------------------------------------------------------------------
-	-- Classic Reputations
-	-------------------------------------------------------------------------------
-	local ARL_Rep_ClassicButton = GenericCreateButton("ARL_Rep_ClassicButton", MainPanel.filter_menu.rep.Classic, 20, 140, "GameFontHighlight", "GameFontHighlightSmall",
-							  _G.REPUTATION .. ":", "LEFT", L["REP_TEXT_DESC"], 0)
-	ARL_Rep_ClassicButton:SetPoint("TOPLEFT", MainPanel.filter_menu.rep.Classic, "TOPLEFT", -2, -4)
-
-	ARL_Rep_ClassicButton:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
-	ARL_Rep_ClassicButton:RegisterForClicks("LeftButtonUp", "RightButtonUp")
-	ARL_Rep_ClassicButton:SetScript("OnClick",
-				   function(self,button)
-					   local filterdb = addon.db.profile.filters.rep
-					   if button == "LeftButton" then
-						   -- Set all Reputations to true
-						   filterdb.argentdawn = true
-						   filterdb.cenarioncircle = true
-						   filterdb.thoriumbrotherhood = true
-						   filterdb.timbermaw = true
-						   filterdb.zandalar = true
-					   elseif button == "RightButton" then
-						   -- Set all Reputations to false
-						   filterdb.argentdawn = false
-						   filterdb.cenarioncircle = false
-						   filterdb.thoriumbrotherhood = false
-						   filterdb.timbermaw = false
-						   filterdb.zandalar = false
-					   end
-					   -- Update the checkboxes with the new value
-					   ARL_RepArgentDawnCB:SetChecked(filterdb.argentdawn)
-					   ARL_RepCenarionCircleCB:SetChecked(filterdb.cenarioncircle)
-					   ARL_RepThoriumCB:SetChecked(filterdb.thoriumbrotherhood)
-					   ARL_RepTimbermawCB:SetChecked(filterdb.timbermaw)
-					   ARL_RepZandalarCB:SetChecked(filterdb.zandalar)
-					   -- Reset our title
-					   MainPanel:UpdateTitle()
-					   -- Use new filters
-					   ReDisplay()
-				   end)
-
-	local ARL_RepArgentDawnCB = CreateFrame("CheckButton", "ARL_RepArgentDawnCB", MainPanel.filter_menu.rep.Classic, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepArgentDawnCB, MainPanel.filter_menu.rep.Classic, sformat(L["SPECIFIC_REP_DESC"], BFAC["Argent Dawn"]), "argentdawn", 2, 1, 0)
-	ARL_RepArgentDawnCBText:SetText(BFAC["Argent Dawn"])
-	ARL_RepArgentDawnCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepCenarionCircleCB = CreateFrame("CheckButton", "ARL_RepCenarionCircleCB", MainPanel.filter_menu.rep.Classic, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepCenarionCircleCB, MainPanel.filter_menu.rep.Classic, sformat(L["SPECIFIC_REP_DESC"], BFAC["Cenarion Circle"]), "cenarioncircle", 3, 1, 0)
-	ARL_RepCenarionCircleCBText:SetText(BFAC["Cenarion Circle"])
-	ARL_RepCenarionCircleCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepThoriumCB = CreateFrame("CheckButton", "ARL_RepThoriumCB", MainPanel.filter_menu.rep.Classic, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepThoriumCB, MainPanel.filter_menu.rep.Classic, sformat(L["SPECIFIC_REP_DESC"], BFAC["Thorium Brotherhood"]), "thoriumbrotherhood", 4, 1, 0)
-	ARL_RepThoriumCBText:SetText(BFAC["Thorium Brotherhood"])
-	ARL_RepThoriumCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepTimbermawCB = CreateFrame("CheckButton", "ARL_RepTimbermawCB", MainPanel.filter_menu.rep.Classic, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepTimbermawCB, MainPanel.filter_menu.rep.Classic, sformat(L["SPECIFIC_REP_DESC"], BFAC["Timbermaw Hold"]), "timbermaw", 5, 1, 0)
-	ARL_RepTimbermawCBText:SetText(BFAC["Timbermaw Hold"])
-	ARL_RepTimbermawCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepZandalarCB = CreateFrame("CheckButton", "ARL_RepZandalarCB", MainPanel.filter_menu.rep.Classic, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepZandalarCB, MainPanel.filter_menu.rep.Classic, sformat(L["SPECIFIC_REP_DESC"], BFAC["Zandalar Tribe"]), "zandalar", 6, 1, 0)
-	ARL_RepZandalarCBText:SetText(BFAC["Zandalar Tribe"])
-	ARL_RepZandalarCBText:SetFont(narrowFont, 11)
-
-	-------------------------------------------------------------------------------
-	-- The Burning Crusade Reputations
-	-------------------------------------------------------------------------------
-	local ARL_Rep_BCButton = GenericCreateButton("ARL_Rep_ClassicButton", MainPanel.filter_menu.rep.BC, 20, 140, "GameFontHighlight", "GameFontHighlightSmall",
-						     _G.REPUTATION .. ":", "LEFT", L["REP_TEXT_DESC"], 0)
-	ARL_Rep_BCButton:SetPoint("TOPLEFT", MainPanel.filter_menu.rep.BC, "TOPLEFT", -2, -4)
-
-	ARL_Rep_BCButton:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
-	ARL_Rep_BCButton:RegisterForClicks("LeftButtonUp", "RightButtonUp")
-	ARL_Rep_BCButton:SetScript("OnClick",
-				   function(self,button)
-					   local filterdb = addon.db.profile.filters.rep
-					   if button == "LeftButton" then
-						   -- Set all Reputations to true
-						   filterdb.aldor = true
-						   filterdb.ashtonguedeathsworn = true
-						   filterdb.cenarionexpedition = true
-						   filterdb.consortium = true
-						   filterdb.hellfire = true
-						   filterdb.keepersoftime = true
-						   filterdb.nagrand = true
-						   filterdb.lowercity = true
-						   filterdb.scaleofthesands = true
-						   filterdb.scryer = true
-						   filterdb.shatar = true
-						   filterdb.shatteredsun = true
-						   filterdb.sporeggar = true
-						   filterdb.violeteye = true
-					   elseif button == "RightButton" then
-						   -- Set all Reputations to false
-						   filterdb.aldor = false
-						   filterdb.ashtonguedeathsworn = false
-						   filterdb.cenarionexpedition = false
-						   filterdb.consortium = false
-						   filterdb.hellfire = false
-						   filterdb.keepersoftime = false
-						   filterdb.nagrand = false
-						   filterdb.lowercity = false
-						   filterdb.scaleofthesands = false
-						   filterdb.scryer = false
-						   filterdb.shatar = false
-						   filterdb.shatteredsun = false
-						   filterdb.sporeggar = false
-						   filterdb.violeteye = false
-					   end
-					   -- Update the checkboxes with the new value
-					   ARL_RepAldorCB:SetChecked(filterdb.aldor)
-					   ARL_RepAshtongueCB:SetChecked(filterdb.ashtonguedeathsworn)
-					   ARL_RepCenarionExpeditionCB:SetChecked(filterdb.cenarionexpedition)
-					   ARL_RepConsortiumCB:SetChecked(filterdb.consortium)
-					   ARL_RepHonorHoldCB:SetChecked(filterdb.hellfire)
-					   ARL_RepKeepersOfTimeCB:SetChecked(filterdb.keepersoftime)
-					   ARL_RepKurenaiCB:SetChecked(filterdb.nagrand)
-					   ARL_RepLowerCityCB:SetChecked(filterdb.lowercity)
-					   ARL_RepScaleSandsCB:SetChecked(filterdb.scaleofthesands)
-					   ARL_RepScryersCB:SetChecked(filterdb.scryer)
-					   ARL_RepShatarCB:SetChecked(filterdb.shatar)
-					   ARL_RepShatteredSunCB:SetChecked(filterdb.shatteredsun)
-					   ARL_RepSporeggarCB:SetChecked(filterdb.sporeggar)
-					   ARL_RepVioletEyeCB:SetChecked(filterdb.violeteye)
-					   -- Reset our title
-					   MainPanel:UpdateTitle()
-					   -- Use new filters
-					   ReDisplay()
-				   end)
-
-	local ARL_RepAldorCB = CreateFrame("CheckButton", "ARL_RepAldorCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepAldorCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Aldor"]), "aldor", 2, 1, 0)
-	ARL_RepAldorCBText:SetText(BFAC["The Aldor"])
-	ARL_RepAldorCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepAshtongueCB = CreateFrame("CheckButton", "ARL_RepAshtongueCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepAshtongueCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["Ashtongue Deathsworn"]), "ashtonguedeathsworn", 3, 1, 0)
-	ARL_RepAshtongueCBText:SetText(BFAC["Ashtongue Deathsworn"])
-	ARL_RepAshtongueCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepCenarionExpeditionCB = CreateFrame("CheckButton", "ARL_RepCenarionExpeditionCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepCenarionExpeditionCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["Cenarion Expedition"]), "cenarionexpedition", 4, 1, 0)
-	ARL_RepCenarionExpeditionCBText:SetText(BFAC["Cenarion Expedition"])
-	ARL_RepCenarionExpeditionCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepConsortiumCB = CreateFrame("CheckButton", "ARL_RepConsortiumCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepConsortiumCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Consortium"]), "consortium", 5, 1, 0)
-	ARL_RepConsortiumCBText:SetText(BFAC["The Consortium"])
-	ARL_RepConsortiumCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepHonorHoldCB = CreateFrame("CheckButton", "ARL_RepHonorHoldCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepHonorHoldCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], HonorHold_Thrallmar_FactionText), "hellfire", 6, 1, 0)
-	ARL_RepHonorHoldCBText:SetText(HonorHold_Thrallmar_FactionText)
-	ARL_RepHonorHoldCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepKeepersOfTimeCB = CreateFrame("CheckButton", "ARL_RepKeepersOfTimeCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepKeepersOfTimeCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["Keepers of Time"]), "keepersoftime", 7, 1, 0)
-	ARL_RepKeepersOfTimeCBText:SetText(BFAC["Keepers of Time"])
-	ARL_RepKeepersOfTimeCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepKurenaiCB = CreateFrame("CheckButton", "ARL_RepKurenaiCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepKurenaiCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], Kurenai_Maghar_FactionText), "nagrand", 8, 1, 0)
-	ARL_RepKurenaiCBText:SetText(Kurenai_Maghar_FactionText)
-	ARL_RepKurenaiCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepLowerCityCB = CreateFrame("CheckButton", "ARL_RepLowerCityCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepLowerCityCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["Lower City"]), "lowercity", 9, 1, 0)
-	ARL_RepLowerCityCBText:SetText(BFAC["Lower City"])
-	ARL_RepLowerCityCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepScaleSandsCB = CreateFrame("CheckButton", "ARL_RepScaleSandsCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepScaleSandsCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Scale of the Sands"]), "scaleofthesands", 10, 1, 0)
-	ARL_RepScaleSandsCBText:SetText(BFAC["The Scale of the Sands"])
-	ARL_RepScaleSandsCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepScryersCB = CreateFrame("CheckButton", "ARL_RepScryersCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepScryersCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Scryers"]), "scryer", 11, 1, 0)
-	ARL_RepScryersCBText:SetText(BFAC["The Scryers"])
-	ARL_RepScryersCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepShatarCB = CreateFrame("CheckButton", "ARL_RepShatarCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepShatarCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Sha'tar"]), "shatar", 12, 1, 0)
-	ARL_RepShatarCBText:SetText(BFAC["The Sha'tar"])
-	ARL_RepShatarCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepShatteredSunCB = CreateFrame("CheckButton", "ARL_RepShatteredSunCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepShatteredSunCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["Shattered Sun Offensive"]), "shatteredsun", 13, 1, 0)
-	ARL_RepShatteredSunCBText:SetText(BFAC["Shattered Sun Offensive"])
-	ARL_RepShatteredSunCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepSporeggarCB = CreateFrame("CheckButton", "ARL_RepSporeggarCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepSporeggarCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["Sporeggar"]), "sporeggar", 14, 1, 0)
-	ARL_RepSporeggarCBText:SetText(BFAC["Sporeggar"])
-	ARL_RepSporeggarCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepVioletEyeCB = CreateFrame("CheckButton", "ARL_RepVioletEyeCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepVioletEyeCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Violet Eye"]), "violeteye", 15, 1, 0)
-	ARL_RepVioletEyeCBText:SetText(BFAC["The Violet Eye"])
-	ARL_RepVioletEyeCBText:SetFont(narrowFont, 11)
-
-	-------------------------------------------------------------------------------
-	-- Wrath of the Lich King Reputations
-	-------------------------------------------------------------------------------
-	local ARL_Rep_LKButton = GenericCreateButton("ARL_Rep_ClassicButton", MainPanel.filter_menu.rep.LK, 20, 140, "GameFontHighlight", "GameFontHighlightSmall",
-						     _G.REPUTATION .. ":", "LEFT", L["REP_TEXT_DESC"], 0)
-	ARL_Rep_LKButton:SetPoint("TOPLEFT", MainPanel.filter_menu.rep.LK, "TOPLEFT", -2, -4)
-
-	ARL_Rep_LKButton:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
-	ARL_Rep_LKButton:RegisterForClicks("LeftButtonUp", "RightButtonUp")
-	ARL_Rep_LKButton:SetScript("OnClick",
-				   function(self,button)
-					   local filterdb = addon.db.profile.filters.rep
-					   if button == "LeftButton" then
-						   -- Set all Reputations to true
-						   filterdb.argentcrusade = true
-						   filterdb.frenzyheart = true
-						   filterdb.ebonblade = true
-						   filterdb.kirintor = true
-						   filterdb.sonsofhodir = true
-						   filterdb.kaluak = true
-						   filterdb.oracles = true
-						   filterdb.wyrmrest = true
-						   filterdb.ashenverdict = true
-						   filterdb.wrathcommon1 = true
-					   elseif button == "RightButton" then
-						   -- Set all Reputations to false
-						   filterdb.argentcrusade = false
-						   filterdb.frenzyheart = false
-						   filterdb.ebonblade = false
-						   filterdb.kirintor = false
-						   filterdb.sonsofhodir = false
-						   filterdb.kaluak = false
-						   filterdb.oracles = false
-						   filterdb.wyrmrest = false
-						   filterdb.ashenverdict = false
-						   filterdb.wrathcommon1 = false
-					   end
-					   -- Update the checkboxes with the new value
-					   ARL_RepArgentCrusadeCB:SetChecked(filterdb.argentcrusade)
-					   ARL_RepFrenzyheartCB:SetChecked(filterdb.frenzyheart)
-					   ARL_RepEbonBladeCB:SetChecked(filterdb.ebonblade)
-					   ARL_RepKirinTorCB:SetChecked(filterdb.kirintor)
-					   ARL_RepSonsOfHodirCB:SetChecked(filterdb.sonsofhodir)
-					   ARL_RepKaluakCB:SetChecked(filterdb.kaluak)
-					   ARL_RepOraclesCB:SetChecked(filterdb.oracles)
-					   ARL_RepWyrmrestCB:SetChecked(filterdb.wyrmrest)
-					   ARL_RepAshenVerdictCB:SetChecked(filterdb.ashenverdict)
-					   ARL_WrathCommon1CB:SetChecked(filterdb.wrathcommon1)
-					   -- Reset our title
-					   MainPanel:UpdateTitle()
-					   -- Use new filters
-					   ReDisplay()
-				   end)
-
-	local ARL_WrathCommon1CB = CreateFrame("CheckButton", "ARL_WrathCommon1CB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_WrathCommon1CB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"],  Vanguard_Expedition_FactionText), "wrathcommon1", 2, 1, 0)
-	ARL_WrathCommon1CBText:SetText(Vanguard_Expedition_FactionText)
-	ARL_WrathCommon1CBText:SetFont(narrowFont, 11)
-
-	local ARL_RepArgentCrusadeCB = CreateFrame("CheckButton", "ARL_RepArgentCrusadeCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepArgentCrusadeCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["Argent Crusade"]), "argentcrusade", 3, 1, 0)
-	ARL_RepArgentCrusadeCBText:SetText(BFAC["Argent Crusade"])
-	ARL_RepArgentCrusadeCBText:SetFont(narrowFont, 11)
-
-	local ARL_WrathCommon5CB = CreateFrame("CheckButton", "ARL_WrathCommon5CB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_WrathCommon5CB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], Explorer_Hand_FactionText), "wrathcommon5", 4, 1, 0)
-	ARL_WrathCommon5CBText:SetText(Explorer_Hand_FactionText)
-	ARL_WrathCommon5CBText:SetFont(narrowFont, 11)
-	ARL_WrathCommon5CBText:SetText(addon:Grey(Explorer_Hand_FactionText))
-	ARL_WrathCommon5CB:Disable()
-
-	local ARL_RepFrenzyheartCB = CreateFrame("CheckButton", "ARL_RepFrenzyheartCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepFrenzyheartCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["Frenzyheart Tribe"]), "frenzyheart", 5, 1, 0)
-	ARL_RepFrenzyheartCBText:SetText(BFAC["Frenzyheart Tribe"])
-	ARL_RepFrenzyheartCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepKaluakCB = CreateFrame("CheckButton", "ARL_RepKaluakCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepKaluakCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Kalu'ak"]), "kaluak", 6, 1, 0)
-	ARL_RepKaluakCBText:SetText(BFAC["The Kalu'ak"])
-	ARL_RepKaluakCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepKirinTorCB = CreateFrame("CheckButton", "ARL_RepKirinTorCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepKirinTorCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["Kirin Tor"]), "kirintor", 7, 1, 0)
-	ARL_RepKirinTorCBText:SetText(BFAC["Kirin Tor"])
-	ARL_RepKirinTorCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepEbonBladeCB = CreateFrame("CheckButton", "ARL_RepEbonBladeCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepEbonBladeCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["Knights of the Ebon Blade"]), "ebonblade", 8, 1, 0)
-	ARL_RepEbonBladeCBText:SetText(BFAC["Knights of the Ebon Blade"])
-	ARL_RepEbonBladeCBText:SetFont(narrowFont, 11)
-
-	local ARL_RepOraclesCB = CreateFrame("CheckButton", "ARL_RepOraclesCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepOraclesCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Oracles"]), "oracles", 9, 1, 0)
-	ARL_RepOraclesCBText:SetText(BFAC["The Oracles"])
-	ARL_RepOraclesCBText:SetFont(narrowFont, 11)
-
-	local ARL_WrathCommon2CB = CreateFrame("CheckButton", "ARL_WrathCommon2CB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_WrathCommon2CB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], SilverConv_Sunreaver_FactionText), "wrathcommon2", 10, 1, 0)
-	ARL_WrathCommon2CBText:SetText(SilverConv_Sunreaver_FactionText)
-	ARL_WrathCommon2CBText:SetFont(narrowFont, 11)
-	ARL_WrathCommon2CBText:SetText(addon:Grey(SilverConv_Sunreaver_FactionText))
-	ARL_WrathCommon2CB:Disable()
-
-	local ARL_RepSonsOfHodirCB = CreateFrame("CheckButton", "ARL_RepSonsOfHodirCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepSonsOfHodirCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Sons of Hodir"]), "sonsofhodir", 11, 1, 0)
-	ARL_RepSonsOfHodirCBText:SetText(BFAC["The Sons of Hodir"])
-	ARL_RepSonsOfHodirCBText:SetFont(narrowFont, 11)
-
-	local ARL_WrathCommon4CB = CreateFrame("CheckButton", "ARL_WrathCommon4CB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_WrathCommon4CB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], Frostborn_Taunka_FactionText), "wrathcommon4", 12, 1, 0)
-	ARL_WrathCommon4CBText:SetText(Frostborn_Taunka_FactionText)
-	ARL_WrathCommon4CBText:SetFont(narrowFont, 11)
-	ARL_WrathCommon4CBText:SetText(addon:Grey(Frostborn_Taunka_FactionText))
-	ARL_WrathCommon4CB:Disable()
-
-	local ARL_WrathCommon3CB = CreateFrame("CheckButton", "ARL_WrathCommon3CB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_WrathCommon3CB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], Valiance_Warsong_FactionText), "wrathcommon3", 13, 1, 0)
-	ARL_WrathCommon3CBText:SetText(Valiance_Warsong_FactionText)
-	ARL_WrathCommon3CBText:SetFont(narrowFont, 11)
-	ARL_WrathCommon3CBText:SetText(addon:Grey(Valiance_Warsong_FactionText))
-	ARL_WrathCommon3CB:Disable()
-
-	local ARL_RepWyrmrestCB = CreateFrame("CheckButton", "ARL_RepWyrmrestCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepWyrmrestCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Wyrmrest Accord"]), "wyrmrest", 14, 1, 0)
-	ARL_RepWyrmrestCBText:SetText(BFAC["The Wyrmrest Accord"])
-	ARL_RepWyrmrestCBText:SetFont(narrowFont, 11)
-
-	local ARL_AshenVerdictCB = CreateFrame("CheckButton", "ARL_RepAshenVerdictCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_RepAshenVerdictCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Ashen Verdict"]), "ashenverdict", 15, 1, 0)
-	ARL_RepAshenVerdictCBText:SetText(BFAC["The Ashen Verdict"])
-	ARL_RepAshenVerdictCBText:SetFont(narrowFont, 11)
-
-	-------------------------------------------------------------------------------
-	-- Miscellaneous Filter Menu
-	-------------------------------------------------------------------------------
-	MainPanel.filter_menu.misc = CreateFrame("Frame", "ARL_FilterMenu_Misc", MainPanel.filter_menu)
-	MainPanel.filter_menu.misc:SetWidth(FILTERMENU_LARGE)
-	MainPanel.filter_menu.misc:SetHeight(280)
-	MainPanel.filter_menu.misc:EnableMouse(true)
-	MainPanel.filter_menu.misc:EnableKeyboard(true)
-	MainPanel.filter_menu.misc:SetMovable(false)
-	MainPanel.filter_menu.misc:SetPoint("TOPLEFT", MainPanel.filter_menu, "TOPLEFT", 17, -16)
-	MainPanel.filter_menu.misc:Hide()
-
-	local ARL_MiscText = MainPanel.filter_menu.misc:CreateFontString("ARL_MiscText", "OVERLAY", "GameFontHighlight")
-	ARL_MiscText:SetText(_G.MISCELLANEOUS .. ":")
-	ARL_MiscText:SetPoint("TOPLEFT", MainPanel.filter_menu.misc, "TOPLEFT", 5, -8)
-	ARL_MiscText:SetHeight(14)
-	ARL_MiscText:SetWidth(150)
-	ARL_MiscText:SetJustifyH("LEFT")
-
-	local ARL_IgnoreCB = CreateFrame("CheckButton", "ARL_IgnoreCB", MainPanel.filter_menu.misc, "UICheckButtonTemplate")
-	InitializeCheckButton(ARL_IgnoreCB, MainPanel.filter_menu.misc, L["DISPLAY_EXCLUSION_DESC"], 0, 2, 1, 1)
-	ARL_IgnoreCBText:SetText(L["Display Exclusions"])
-
-	local ARL_MiscAltText = MainPanel.filter_menu.misc:CreateFontString("ARL_MiscAltBtn", "OVERLAY", "GameFontNormal")
-	ARL_MiscAltText:SetText(L["Alt-Tradeskills"] .. ":")
-	ARL_MiscAltText:SetPoint("TOPLEFT", ARL_IgnoreCB, "BOTTOMLEFT", 4, 0)
-	ARL_MiscAltText:SetHeight(14)
-	ARL_MiscAltText:SetWidth(95)
-	ARL_MiscAltText:SetJustifyH("LEFT")
-
-	local ARL_MiscAltBtn = CreateFrame("Button", "ARL_IgnoreCB", MainPanel.filter_menu.misc)
-	ARL_MiscAltBtn:SetPoint("LEFT", ARL_MiscAltText, "RIGHT")
-	ARL_MiscAltBtn:SetHeight(22)
-	ARL_MiscAltBtn:SetWidth(22)
-	ARL_MiscAltBtn:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up")
-	ARL_MiscAltBtn:SetPushedTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Down")
-	ARL_MiscAltBtn:SetDisabledTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Disabled")
-	ARL_MiscAltBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight")
-	SetTooltipScripts(ARL_MiscAltBtn, L["ALT_TRADESKILL_DESC"], 1)
-	ARL_MiscAltBtn:RegisterForClicks("LeftButtonUp")
-	ARL_MiscAltBtn:SetScript("OnClick",
-				 function(this, button)
-					 if clicktip then
-						 if not click_info.modified then
-							 clicktip = QTip:Release(clicktip)
-							 twipe(click_info)
-						 else
-							 twipe(click_info)
-							 GenerateClickableTT(this)
-						 end
-					 else
-						 clicktip = QTip:Acquire("ARL_Clickable", 1, "CENTER")
-						 twipe(click_info)
-
-						 if TipTac and TipTac.AddModifiedTip then
-							 TipTac:AddModifiedTip(clicktip, true)
-						 end
-						 GenerateClickableTT(this)
-					 end
-				 end)
-	ARL_MiscAltBtn:SetScript("OnHide",
-				 function(this, button)
-					 clicktip = QTip:Release(clicktip)
-					 twipe(click_info)
-				 end)
-
-	-------------------------------------------------------------------------------
-	-- Now that everything exists, populate the global filter table
-	-------------------------------------------------------------------------------
-	local filterdb = addon.db.profile.filters
-	local filter_menu = MainPanel.filter_menu
-
-	FilterValueMap = {
-		------------------------------------------------------------------------------------------------
-		-- General Options
-		------------------------------------------------------------------------------------------------
-		["specialty"]		= { cb = filter_menu.general.specialty,			svroot = filterdb.general },
-		["skill"]		= { cb = filter_menu.general.skill,			svroot = filterdb.general },
-		["faction"]		= { cb = filter_menu.general.faction,			svroot = filterdb.general },
-		["known"]		= { cb = filter_menu.general.known,			svroot = filterdb.general },
-		["unknown"]		= { cb = filter_menu.general.unknown,			svroot = filterdb.general },
-		------------------------------------------------------------------------------------------------
-		-- Classes
-		------------------------------------------------------------------------------------------------
-		["deathknight"]		= { cb = filter_menu.general.deathknight,		svroot = filterdb.classes },
-		["druid"]		= { cb = filter_menu.general.druid,			svroot = filterdb.classes },
-		["hunter"]		= { cb = filter_menu.general.hunter,			svroot = filterdb.classes },
-		["mage"]		= { cb = filter_menu.general.mage,			svroot = filterdb.classes },
-		["paladin"]		= { cb = filter_menu.general.paladin,			svroot = filterdb.classes },
-		["priest"]		= { cb = filter_menu.general.priest,			svroot = filterdb.classes },
-		["rogue"]		= { cb = filter_menu.general.rogue,			svroot = filterdb.classes },
-		["shaman"]		= { cb = filter_menu.general.shaman,			svroot = filterdb.classes },
-		["warlock"]		= { cb = filter_menu.general.warlock,			svroot = filterdb.classes },
-		["warrior"]		= { cb = filter_menu.general.warrior,			svroot = filterdb.classes },
-		------------------------------------------------------------------------------------------------
-		-- Obtain Options
-		------------------------------------------------------------------------------------------------
-		["instance"]		= { cb = filter_menu.obtain.instance,			svroot = filterdb.obtain },
-		["raid"]		= { cb = filter_menu.obtain.raid,			svroot = filterdb.obtain },
-		["quest"]		= { cb = filter_menu.obtain.quest,			svroot = filterdb.obtain },
-		["seasonal"]		= { cb = filter_menu.obtain.seasonal,			svroot = filterdb.obtain },
-		["trainer"]		= { cb = filter_menu.obtain.trainer,			svroot = filterdb.obtain },
-		["vendor"]		= { cb = filter_menu.obtain.vendor,			svroot = filterdb.obtain },
-		["pvp"]			= { cb = filter_menu.obtain.pvp,			svroot = filterdb.obtain },
-		["discovery"]		= { cb = filter_menu.obtain.discovery,			svroot = filterdb.obtain },
-		["worlddrop"]		= { cb = filter_menu.obtain.worlddrop,			svroot = filterdb.obtain },
-		["mobdrop"]		= { cb = filter_menu.obtain.mobdrop,			svroot = filterdb.obtain },
-		["originalwow"]		= { cb = filter_menu.obtain.originalwow,		svroot = filterdb.obtain },
-		["bc"]			= { cb = filter_menu.obtain.bc,				svroot = filterdb.obtain },
-		["wrath"]		= { cb = filter_menu.obtain.wrath,			svroot = filterdb.obtain },
-		------------------------------------------------------------------------------------------------
-		-- Binding Options
-		------------------------------------------------------------------------------------------------
-		["itemboe"]		= { cb = filter_menu.binding.itemboe,			svroot = filterdb.binding },
-		["itembop"]		= { cb = filter_menu.binding.itembop,			svroot = filterdb.binding },
-		["recipeboe"]		= { cb = filter_menu.binding.recipeboe,			svroot = filterdb.binding },
-		["recipebop"]		= { cb = filter_menu.binding.recipebop,			svroot = filterdb.binding },
-		------------------------------------------------------------------------------------------------
-		-- Armor Options
-		------------------------------------------------------------------------------------------------
-		["cloth"]		= { cb = filter_menu.item.cloth,			svroot = filterdb.item.armor },
-		["leather"]		= { cb = filter_menu.item.leather,			svroot = filterdb.item.armor },
-		["mail"]		= { cb = filter_menu.item.mail,				svroot = filterdb.item.armor },
-		["plate"]		= { cb = filter_menu.item.plate,			svroot = filterdb.item.armor },
-		["cloak"]		= { cb = filter_menu.item.cloak,			svroot = filterdb.item.armor },
-		["necklace"]		= { cb = filter_menu.item.necklace,			svroot = filterdb.item.armor },
-		["ring"]		= { cb = filter_menu.item.ring,				svroot = filterdb.item.armor },
-		["trinket"]		= { cb = filter_menu.item.trinket,			svroot = filterdb.item.armor },
-		["shield"]		= { cb = filter_menu.item.shield,			svroot = filterdb.item.armor },
-		------------------------------------------------------------------------------------------------
-		-- Weapon Options
-		------------------------------------------------------------------------------------------------
-		["onehand"]		= { cb = filter_menu.item.onehand,			svroot = filterdb.item.weapon },
-		["twohand"]		= { cb = filter_menu.item.twohand,			svroot = filterdb.item.weapon },
-		["dagger"]		= { cb = filter_menu.item.dagger,			svroot = filterdb.item.weapon },
-		["axe"]			= { cb = filter_menu.item.axe,				svroot = filterdb.item.weapon },
-		["mace"]		= { cb = filter_menu.item.mace,				svroot = filterdb.item.weapon },
-		["sword"]		= { cb = filter_menu.item.sword,			svroot = filterdb.item.weapon },
-		["polearm"]		= { cb = filter_menu.item.polearm,			svroot = filterdb.item.weapon },
-		["fist"]		= { cb = filter_menu.item.fist,				svroot = filterdb.item.weapon },
-		["staff"]		= { cb = filter_menu.item.staff,			svroot = nil },
-		["wand"]		= { cb = filter_menu.item.wand,				svroot = filterdb.item.weapon },
-		["thrown"]		= { cb = filter_menu.item.thrown,			svroot = filterdb.item.weapon },
-		["bow"]			= { cb = filter_menu.item.bow,				svroot = nil },
-		["crossbow"]		= { cb = filter_menu.item.crossbow,			svroot = nil },
-		["ammo"]		= { cb = filter_menu.item.ammo,				svroot = filterdb.item.weapon },
-		["gun"]			= { cb = filter_menu.item.gun,				svroot = filterdb.item.weapon },
-		------------------------------------------------------------------------------------------------
-		-- Role Options
-		------------------------------------------------------------------------------------------------
-		["tank"]		= { cb = filter_menu.player.tank,			svroot = filterdb.player },
-		["melee"]		= { cb = filter_menu.player.melee,			svroot = filterdb.player },
-		["healer"]		= { cb = filter_menu.player.healer,			svroot = filterdb.player },
-		["caster"]		= { cb = filter_menu.player.caster,			svroot = filterdb.player },
-		------------------------------------------------------------------------------------------------
-		-- Old World Rep Options
-		------------------------------------------------------------------------------------------------
-		["argentdawn"]		= { cb = ARL_RepArgentDawnCB,		svroot = filterdb.rep },
-		["cenarioncircle"]	= { cb = ARL_RepCenarionCircleCB,	svroot = filterdb.rep },
-		["thoriumbrotherhood"]	= { cb = ARL_RepThoriumCB,		svroot = filterdb.rep },
-		["timbermaw"]		= { cb = ARL_RepTimbermawCB,		svroot = filterdb.rep },
-		["zandalar"]		= { cb = ARL_RepZandalarCB,		svroot = filterdb.rep },
-		------------------------------------------------------------------------------------------------
-		-- BC Rep Options
-		------------------------------------------------------------------------------------------------
-		["aldor"]		= { cb = ARL_RepAldorCB,		svroot = filterdb.rep },
-		["ashtonguedeathsworn"]	= { cb = ARL_RepAshtongueCB,		svroot = filterdb.rep },
-		["cenarionexpedition"]	= { cb = ARL_RepCenarionExpeditionCB,	svroot = filterdb.rep },
-		["consortium"]		= { cb = ARL_RepConsortiumCB,		svroot = filterdb.rep },
-		["hellfire"]		= { cb = ARL_RepHonorHoldCB,		svroot = filterdb.rep },
-		["keepersoftime"]	= { cb = ARL_RepKeepersOfTimeCB,	svroot = filterdb.rep },
-		["nagrand"]		= { cb = ARL_RepKurenaiCB,		svroot = filterdb.rep },
-		["lowercity"]		= { cb = ARL_RepLowerCityCB,		svroot = filterdb.rep },
-		["scaleofthesands"]	= { cb = ARL_RepScaleSandsCB,		svroot = filterdb.rep },
-		["scryer"]		= { cb = ARL_RepScryersCB,		svroot = filterdb.rep },
-		["shatar"]		= { cb = ARL_RepShatarCB,		svroot = filterdb.rep },
-		["shatteredsun"]	= { cb = ARL_RepShatteredSunCB,		svroot = filterdb.rep },
-		["sporeggar"]		= { cb = ARL_RepSporeggarCB,		svroot = filterdb.rep },
-		["violeteye"]		= { cb = ARL_RepVioletEyeCB,		svroot = filterdb.rep },
-		------------------------------------------------------------------------------------------------
-		-- LK Rep Options
-		------------------------------------------------------------------------------------------------
-		["argentcrusade"]	= { cb = ARL_RepArgentCrusadeCB,	svroot = filterdb.rep },
-		["frenzyheart"]		= { cb = ARL_RepFrenzyheartCB,		svroot = filterdb.rep },
-		["ebonblade"]		= { cb = ARL_RepEbonBladeCB,		svroot = filterdb.rep },
-		["kirintor"]		= { cb = ARL_RepKirinTorCB,		svroot = filterdb.rep },
-		["sonsofhodir"]		= { cb = ARL_RepSonsOfHodirCB,		svroot = filterdb.rep },
-		["kaluak"]		= { cb = ARL_RepKaluakCB,		svroot = filterdb.rep },
-		["oracles"]		= { cb = ARL_RepOraclesCB,		svroot = filterdb.rep },
-		["wyrmrest"]		= { cb = ARL_RepWyrmrestCB,		svroot = filterdb.rep },
-		["ashenverdict"]	= { cb = ARL_RepAshenVerdictCB,		svroot = filterdb.rep },
-		["wrathcommon1"]	= { cb = ARL_WrathCommon1CB,		svroot = filterdb.rep },
-		["wrathcommon2"]	= { cb = ARL_WrathCommon2CB,		svroot = nil },
-		["wrathcommon3"]	= { cb = ARL_WrathCommon3CB,		svroot = nil },
-		["wrathcommon4"]	= { cb = ARL_WrathCommon4CB,		svroot = nil },
-		["wrathcommon5"]	= { cb = ARL_WrathCommon5CB,		svroot = nil },
-	}
-end
-
--------------------------------------------------------------------------------
--- Displays the main recipe frame.
--------------------------------------------------------------------------------
-function addon:DisplayFrame()
-	MainPanel:SetPosition()
-	MainPanel:SetProfession()
-	MainPanel:SetScale(addon.db.profile.frameopts.uiscale)
-
-	ARL_DD_Sort.initialize = ARL_DD_Sort_Initialize				-- Initialize dropdown
-
-	SortRecipeList()
-
-	MainPanel:UpdateTitle()
-	MainPanel.scroll_frame:Update(false, false)
-	MainPanel.progress_bar:Update()
-	MainPanel:Show()
-
-	-- Set the search text to the last searched text or the global default string for the search box
-	-- We should think about either preserving the search everytime arl is open or we clear it completely  - pompachomp
-	ARL_SearchText:SetText(ARL_LastSearchedText  or L["SEARCH_BOX_DESC"])
-end
-
--------------------------------------------------------------------------------
--- Under various conditions, the recipe list will have to be re-displayed.
--- This could happen because a filter changes, a new profession is chosen, or
--- a new search occurred. Use this function to do all the dirty work
---
--- Upvalued at the top of the file.
--------------------------------------------------------------------------------
-function ReDisplay()
-	addon:UpdateFilters()
-	Player:MarkExclusions()
-
-	SortRecipeList()
-	MainPanel.scroll_frame:Update(false, false)
-	MainPanel.progress_bar:Update()
-
-	-- Make sure our expand all button is set to expandall
-	ARL_ExpandButton:SetText(L["EXPANDALL"])
-	SetTooltipScripts(ARL_ExpandButton, L["EXPANDALL_DESC"])
-end
-
--------------------------------------------------------------------------------
---- Creates a new frame with the contents of a text dump so you can copy and paste
--- Code borrowed from Antiarc (Chatter) with permission
--- @name AckisRecipeList:DisplayTextDump
--- @param RecipeDB The database (array) which you wish read data from.
--- @param profession Which profession are you displaying data for
--- @param text The text to be dumped
--------------------------------------------------------------------------------
-do
-	local copy_frame = CreateFrame("Frame", "ARLCopyFrame", UIParent)
-	copy_frame:SetBackdrop({
-				       bgFile = [[Interface\DialogFrame\UI-DialogBox-Background]],
-				       edgeFile = [[Interface\DialogFrame\UI-DialogBox-Border]],
-				       tile = true,
-				       tileSize = 16,
-				       edgeSize = 16,
-				       insets = {
-					       left = 3,
-					       right = 3,
-					       top = 5,
-					       bottom = 3
-				       }
-			       })
-	copy_frame:SetBackdropColor(0, 0, 0, 1)
-	copy_frame:SetWidth(750)
-	copy_frame:SetHeight(400)
-	copy_frame:SetPoint("CENTER", UIParent, "CENTER")
-	copy_frame:SetFrameStrata("DIALOG")
-
-	tinsert(UISpecialFrames, "ARLCopyFrame")
-
-	local scrollArea = CreateFrame("ScrollFrame", "ARLCopyScroll", copy_frame, "UIPanelScrollFrameTemplate")
-	scrollArea:SetPoint("TOPLEFT", copy_frame, "TOPLEFT", 8, -30)
-	scrollArea:SetPoint("BOTTOMRIGHT", copy_frame, "BOTTOMRIGHT", -30, 8)
-
-	local edit_box = CreateFrame("EditBox", nil, copy_frame)
-	edit_box:SetMultiLine(true)
-	edit_box:SetMaxLetters(0)
-	edit_box:EnableMouse(true)
-	edit_box:SetAutoFocus(true)
-	edit_box:SetFontObject(ChatFontNormal)
-	edit_box:SetWidth(650)
-	edit_box:SetHeight(270)
-	edit_box:SetScript("OnEscapePressed",
-			   function()
-				   copy_frame:Hide()
-			   end)
-	edit_box:HighlightText(0)
-
-	scrollArea:SetScrollChild(edit_box)
-
-	local close = CreateFrame("Button", nil, copy_frame, "UIPanelCloseButton")
-	close:SetPoint("TOPRIGHT", copy_frame, "TOPRIGHT")
-
-	copy_frame:Hide()
-
-	function addon:DisplayTextDump(RecipeDB, profession, text)
-		edit_box:SetText((not RecipeDB and not profession) and text or self:GetTextDump(RecipeDB, profession))
-		edit_box:HighlightText(0)
-		copy_frame:Show()
-	end
-end	-- do
diff --git a/AckisRecipeList.toc b/AckisRecipeList.toc
index 438aef1..00bd31d 100644
--- a/AckisRecipeList.toc
+++ b/AckisRecipeList.toc
@@ -65,7 +65,7 @@ local.xml
 AckisRecipeList.lua
 ARLConfig.lua
 ARLColour.lua
-ARLFrame.lua
+Frame.lua
 ARLDatamine.lua
 Player.lua

diff --git a/Frame.lua b/Frame.lua
new file mode 100644
index 0000000..8d49045
--- /dev/null
+++ b/Frame.lua
@@ -0,0 +1,4297 @@
+-------------------------------------------------------------------------------
+-- ARLFrame.lua		Frame functions for all of AckisRecipeList
+-------------------------------------------------------------------------------
+-- File date: @file-date-iso@
+-- File revision: @file-revision@
+-- Project revision: @project-revision@
+-- Project version: @project-version@
+-------------------------------------------------------------------------------
+-- Please see http://www.wowace.com/projects/arl/for more information.
+-------------------------------------------------------------------------------
+-- License:
+--	Please see LICENSE.txt
+
+-- This source code is released under All Rights Reserved.
+-------------------------------------------------------------------------------
+--- **AckisRecipeList** provides an interface for scanning professions for missing recipes.
+-- There are a set of functions which allow you make use of the ARL database outside of ARL.
+-- ARL supports all professions currently in World of Warcraft 3.2
+-- @class file
+-- @name ARLFrame.lua
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+-- Localized Lua globals.
+-------------------------------------------------------------------------------
+local _G = getfenv(0)
+
+local string = _G.string
+local sformat = string.format
+local strlower = string.lower
+local smatch = string.match
+
+local select = _G.select
+local type = _G.type
+
+local table = _G.table
+local twipe = table.wipe
+local tinsert, tremove = table.insert, table.remove
+local ipairs, pairs = _G.ipairs, _G.pairs
+
+local math = _G.math
+local floor = math.floor
+
+local tonumber = _G.tonumber
+local tostring = _G.tostring
+
+-------------------------------------------------------------------------------
+-- Localized Blizzard API.
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+-- AddOn namespace.
+-------------------------------------------------------------------------------
+local LibStub = LibStub
+
+local MODNAME		= "Ackis Recipe List"
+local addon		= LibStub("AceAddon-3.0"):GetAddon(MODNAME)
+
+local BFAC		= LibStub("LibBabble-Faction-3.0"):GetLookupTable()
+local L			= LibStub("AceLocale-3.0"):GetLocale(MODNAME)
+local QTip		= LibStub("LibQTip-1.0")
+
+local Player		= addon.Player
+
+-------------------------------------------------------------------------------
+-- Constants
+-------------------------------------------------------------------------------
+local SortedProfessions = {	-- To make tabbing between professions easier
+	{ name = GetSpellInfo(51304),	texture = "alchemy" },		-- 1
+	{ name = GetSpellInfo(51300),	texture = "blacksmith" },	-- 2
+	{ name = GetSpellInfo(51296),	texture = "cooking" },		-- 3
+	{ name = GetSpellInfo(51313),	texture = "enchant" },		-- 4
+	{ name = GetSpellInfo(51306),	texture = "engineer" },		-- 5
+	{ name = GetSpellInfo(45542),	texture = "firstaid" },		-- 6
+	{ name = GetSpellInfo(45363),	texture = "inscribe" },		-- 7
+	{ name = GetSpellInfo(51311),	texture = "jewel" },		-- 8
+	{ name = GetSpellInfo(51302),	texture = "leather" },		-- 9
+	{ name = GetSpellInfo(53428),	texture = "runeforge" },	-- 10
+	{ name = GetSpellInfo(32606),	texture = "smelting" },		-- 11
+	{ name = GetSpellInfo(51309),	texture = "tailor" },		-- 12
+}
+
+local CATEGORY_TEXT = {
+	["general"]	= _G.GENERAL,
+	["obtain"]	= L["Obtain"],
+	["binding"]	= L["Binding"],
+	["item"]	= L["Item"],
+	["player"]	= _G.ROLE,
+	["rep"]		= _G.REPUTATION,
+	["misc"]	= _G.MISCELLANEOUS
+}
+
+local NUM_PROFESSIONS		= 12
+local NUM_RECIPE_LINES		= 24			-- Number of visible lines in the scrollframe.
+local SEASONAL_CATEGORY		= GetCategoryInfo(155)	-- Localized string - "World Events"
+
+local MAINPANEL_NORMAL_WIDTH	= 293
+local MAINPANEL_EXPANDED_WIDTH	= 444
+
+local FILTERMENU_SINGLE_WIDTH	= 136
+local FILTERMENU_DOUBLE_WIDTH	= 300
+local FILTERMENU_HEIGHT		= 312
+
+local FILTERMENU_SMALL		= 112
+local FILTERMENU_LARGE		= 210
+
+local FACTION_HORDE		= BFAC["Horde"]
+local FACTION_ALLIANCE		= BFAC["Alliance"]
+local FACTION_NEUTRAL		= BFAC["Neutral"]
+
+-------------------------------------------------------------------------------
+-- Acquire flag constants.
+-------------------------------------------------------------------------------
+local A_TRAINER, A_VENDOR, A_MOB, A_QUEST, A_SEASONAL, A_REPUTATION, A_WORLD_DROP, A_CUSTOM, A_PVP, A_MAX = 1, 2, 3, 4, 5, 6, 7, 8, 9, 9
+
+-------------------------------------------------------------------------------
+-- Filter flag constants.
+-------------------------------------------------------------------------------
+local F_ALLIANCE, F_HORDE, F_TRAINER, F_VENDOR, F_INSTANCE, F_RAID = 1, 2, 3, 4, 5, 6
+local F_SEASONAL, F_QUEST, F_PVP, F_WORLD_DROP, F_MOB_DROP, F_DISC = 7, 8, 9, 10, 11, 12
+local F_IBOE, F_IBOP, F_IBOA, F_RBOE, F_RBOP, F_RBOA = 36, 37, 38, 40, 41, 42
+
+local BINDING_FLAGS = {
+	[F_IBOE] = L["BOEFilter"],
+	[F_IBOP] = L["BOPFilter"],
+	[F_IBOA] = L["BOAFilter"],
+	[F_RBOE] = L["RecipeBOEFilter"],
+	[F_RBOP] = L["RecipeBOPFilter"],
+	[F_RBOA] = L["RecipeBOAFilter"]
+}
+
+-------------------------------------------------------------------------------
+-- Define the static popups we're going to call when people haven't scanned or
+-- when current filters are blocking all recipes from being displayed.
+-------------------------------------------------------------------------------
+StaticPopupDialogs["ARL_NOTSCANNED"] = {
+	text = L["NOTSCANNED"],
+	button1 = _G.OKAY,
+	timeout = 0,
+	exclusive = 1,
+	whileDead = 1,
+	hideOnEscape = 1
+}
+
+StaticPopupDialogs["ARL_ALLFILTERED"] = {
+	text = L["ALL_FILTERED"],
+	button1 = _G.OKAY,
+	timeout = 0,
+	exclusive = 1,
+	whileDead = 1,
+	hideOnEscape = 1
+}
+
+StaticPopupDialogs["ARL_ALLKNOWN"] = {
+	text = L["ARL_ALLKNOWN"],
+	button1 = _G.OKAY,
+	timeout = 0,
+	exclusive = 1,
+	whileDead = 1,
+	hideOnEscape = 1
+}
+
+StaticPopupDialogs["ARL_ALLEXCLUDED"] = {
+	text = L["ARL_ALLEXCLUDED"],
+	button1 = _G.OKAY,
+	timeout = 0,
+	exclusive = 1,
+	whileDead = 1,
+	hideOnEscape = 1
+}
+
+StaticPopupDialogs["ARL_SEARCHFILTERED"] = {
+	text = L["ARL_SEARCHFILTERED"],
+	button1 = _G.OKAY,
+	timeout = 0,
+	exclusive = 1,
+	whileDead = 1,
+	hideOnEscape = 1
+}
+
+-------------------------------------------------------------------------------
+-- Variables
+-------------------------------------------------------------------------------
+local FilterValueMap		-- Assigned in addon:InitializeFrame()
+
+local ARL_SearchText, ARL_LastSearchedText
+
+-------------------------------------------------------------------------------
+-- Upvalues
+-------------------------------------------------------------------------------
+local ReDisplay
+
+-------------------------------------------------------------------------------
+-- Table cache mechanism
+-------------------------------------------------------------------------------
+local AcquireTable, ReleaseTable
+do
+	local table_cache = {}
+
+	-- Returns a table
+	function AcquireTable()
+		local tbl = tremove(table_cache) or {}
+		return tbl
+	end
+
+	-- Cleans the table and stores it in the cache
+	function ReleaseTable(tbl)
+		if not tbl then return end
+		twipe(tbl)
+		tinsert(table_cache, tbl)
+	end
+end	-- do block
+
+-------------------------------------------------------------------------------
+-- Close all possible pop-up windows
+-------------------------------------------------------------------------------
+function addon:ClosePopups()
+	StaticPopup_Hide("ARL_NOTSCANNED")
+	StaticPopup_Hide("ARL_ALLFILTERED")
+	StaticPopup_Hide("ARL_ALLKNOWN")
+	StaticPopup_Hide("ARL_ALLEXCLUDED")
+	StaticPopup_Hide("ARL_SEARCHFILTERED")
+end
+
+-------------------------------------------------------------------------------
+-- Sets show and hide scripts as well as text for a tooltip for the given frame.
+-------------------------------------------------------------------------------
+local SetTooltipScripts
+do
+	local function Show_Tooltip(frame, motion)
+		GameTooltip_SetDefaultAnchor(GameTooltip, frame)
+		GameTooltip:SetText(frame.tooltip_text, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b)
+		GameTooltip:Show()
+	end
+
+	local function Hide_Tooltip()
+		GameTooltip:Hide()
+	end
+
+	function SetTooltipScripts(frame, textLabel)
+		frame.tooltip_text = textLabel
+
+		frame:SetScript("OnEnter", Show_Tooltip)
+		frame:SetScript("OnLeave", Hide_Tooltip)
+	end
+end	-- do
+
+-------------------------------------------------------------------------------
+-- Generic function for creating buttons.
+-------------------------------------------------------------------------------
+local GenericCreateButton
+do
+	-- I hate stretchy buttons. Thanks very much to ckknight for this code
+	-- (found in RockConfig)
+
+	-- when pressed, the button should look pressed
+	local function button_OnMouseDown(this)
+		if this:IsEnabled() then
+			this.left:SetTexture([[Interface\Buttons\UI-Panel-Button-Down]])
+			this.middle:SetTexture([[Interface\Buttons\UI-Panel-Button-Down]])
+			this.right:SetTexture([[Interface\Buttons\UI-Panel-Button-Down]])
+		end
+	end
+
+	-- when depressed, return to normal
+	local function button_OnMouseUp(this)
+		if this:IsEnabled() then
+			this.left:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
+			this.middle:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
+			this.right:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
+		end
+	end
+
+	local function button_Disable(this)
+		this.left:SetTexture([[Interface\Buttons\UI-Panel-Button-Disabled]])
+		this.middle:SetTexture([[Interface\Buttons\UI-Panel-Button-Disabled]])
+		this.right:SetTexture([[Interface\Buttons\UI-Panel-Button-Disabled]])
+		this:__Disable()
+		this:EnableMouse(false)
+	end
+
+	local function button_Enable(this)
+		this.left:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
+		this.middle:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
+		this.right:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
+		this:__Enable()
+		this:EnableMouse(true)
+	end
+
+	function GenericCreateButton(bName, parentFrame, bHeight, bWidth, bNormFont, bHighFont, initText, tAlign, tooltipText, noTextures)
+		local button = CreateFrame("Button", bName, parentFrame)
+
+		button:SetWidth(bWidth)
+		button:SetHeight(bHeight)
+
+		if noTextures == 1 then
+			local left = button:CreateTexture(nil, "BACKGROUND")
+			button.left = left
+			left:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
+
+			local middle = button:CreateTexture(nil, "BACKGROUND")
+			button.middle = middle
+			middle:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
+
+			local right = button:CreateTexture(nil, "BACKGROUND")
+			button.right = right
+			right:SetTexture([[Interface\Buttons\UI-Panel-Button-Up]])
+
+			left:SetPoint("TOPLEFT")
+			left:SetPoint("BOTTOMLEFT")
+			left:SetWidth(12)
+			left:SetTexCoord(0, 0.09375, 0, 0.6875)
+
+			right:SetPoint("TOPRIGHT")
+			right:SetPoint("BOTTOMRIGHT")
+			right:SetWidth(12)
+			right:SetTexCoord(0.53125, 0.625, 0, 0.6875)
+
+			middle:SetPoint("TOPLEFT", left, "TOPRIGHT")
+			middle:SetPoint("BOTTOMRIGHT", right, "BOTTOMLEFT")
+			middle:SetTexCoord(0.09375, 0.53125, 0, 0.6875)
+
+			button:SetScript("OnMouseDown", button_OnMouseDown)
+			button:SetScript("OnMouseUp", button_OnMouseUp)
+
+			button.__Enable = button.Enable
+			button.__Disable = button.Disable
+			button.Enable = button_Enable
+			button.Disable = button_Disable
+
+			local highlight = button:CreateTexture(nil, "OVERLAY", "UIPanelButtonHighlightTexture")
+			button:SetHighlightTexture(highlight)
+		elseif noTextures == 2 then
+			button:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up")
+			button:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-Down")
+			button:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
+			button:SetDisabledTexture("Interface\\Buttons\\UI-PlusButton-Disabled")
+		elseif noTextures == 3 then
+			button:SetNormalTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Up")
+			button:SetPushedTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Down")
+			button:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
+			button:SetDisabledTexture("Interface\\Buttons\\UI-PlusButton-Disabled")
+		end
+
+		local text = button:CreateFontString(nil, "ARTWORK")
+		button:SetFontString(text)
+		button.text = text
+		text:SetPoint("LEFT", button, "LEFT", 7, 0)
+		text:SetPoint("RIGHT", button, "RIGHT", -7, 0)
+		text:SetJustifyH(tAlign)
+
+		text:SetFontObject(bNormFont)
+		text:SetText(initText)
+
+		if tooltipText and tooltipText ~= "" then
+			SetTooltipScripts(button, tooltipText)
+		end
+		return button
+	end
+end	-- do
+
+-------------------------------------------------------------------------------
+-- Sort functions
+-------------------------------------------------------------------------------
+local SortRecipeList
+do
+	addon.sorted_recipes = {}
+
+	local recipe_list = addon.recipe_list
+
+	local function Sort_SkillAsc(a, b)
+		local reca, recb = recipe_list[a], recipe_list[b]
+
+		if reca["Level"] == recb["Level"] then
+			return reca["Name"] < recb["Name"]
+		else
+			return reca["Level"] < recb["Level"]
+		end
+	end
+
+	local function Sort_SkillDesc(a, b)
+		local reca, recb = recipe_list[a], recipe_list[b]
+
+		if reca["Level"] == recb["Level"] then
+			return reca["Name"] < recb["Name"]
+		else
+			return recb["Level"] < reca["Level"]
+		end
+	end
+
+	local function Sort_Name(a, b)
+		return recipe_list[a]["Name"] < recipe_list[b]["Name"]
+	end
+
+	-- Will only sort based off of the first acquire type
+	local function Sort_Acquisition(a, b)
+		local reca = recipe_list[a]["Acquire"][1]
+		local recb = recipe_list[b]["Acquire"][1]
+
+		if not reca or not recb then
+			return not not reca
+		end
+
+		if reca["Type"] ~= recb["Type"] then
+			return reca["Type"] < recb["Type"]
+		end
+
+		if reca["Type"] == A_CUSTOM then
+			if reca["ID"] == recb["ID"] then
+				return recipe_list[a]["Name"] < recipe_list[b]["Name"]
+			else
+				return reca["ID"] < recb["ID"]
+			end
+		else
+			return recipe_list[a]["Name"] < recipe_list[b]["Name"]
+		end
+	end
+
+	local function Sort_Location(a, b)
+		-- We do the or "" because of nil's, I think this would be better if I just left it as a table which was returned
+		local reca = recipe_list[a]["Locations"] or ""
+		local recb = recipe_list[b]["Locations"] or ""
+
+		reca = smatch(reca,"(%w+), ") or reca
+		recb = smatch(recb,"(%w+), ") or recb
+
+		if reca == recb then
+			return Sort_Acquisition(a, b)
+		else
+			return reca < recb
+		end
+	end
+
+	local sortFuncs = {
+		["SkillAsc"]	= Sort_SkillAsc,
+		["SkillDesc"]	= Sort_SkillDesc,
+		["Name"]	= Sort_Name,
+		["Acquisition"]	= Sort_Acquisition,
+		["Location"]	= Sort_Location,
+	}
+
+	-- Sorts the recipe list according to configuration settings.
+	function SortRecipeList()
+		local sorted_recipes = addon.sorted_recipes
+		twipe(sorted_recipes)
+
+		for n, v in pairs(addon.recipe_list) do
+			tinsert(sorted_recipes, n)
+		end
+		table.sort(sorted_recipes, sortFuncs[addon.db.profile.sorting])
+	end
+end	-- do
+
+-------------------------------------------------------------------------------
+-- Tooltip functions and data.
+-------------------------------------------------------------------------------
+local spell_tip = CreateFrame("GameTooltip", "arlSpellTooltip", UIParent, "GameTooltipTemplate")
+local acquire_tip
+
+-- Font Objects needed for acquire_tip
+local narrowFont
+local normalFont
+
+local GenerateTooltipContent
+do
+	-- Fallback in case the user doesn't have LSM-3.0 installed
+	if not LibStub:GetLibrary("LibSharedMedia-3.0", true) then
+
+		local locale = GetLocale()
+		-- Fix for font issues on koKR
+		if locale == "koKR" then
+			narrowFont = "Fonts\\2002.TTF"
+			normalFont = "Fonts\\2002.TTF"
+		else
+			narrowFont = "Fonts\\ARIALN.TTF"
+			normalFont = "Fonts\\FRIZQT__.TTF"
+		end
+	else
+		-- Register LSM 3.0
+		local LSM3 = LibStub("LibSharedMedia-3.0")
+
+		narrowFont = LSM3:Fetch(LSM3.MediaType.FONT, "Arial Narrow")
+		normalFont = LSM3:Fetch(LSM3.MediaType.FONT, "Friz Quadrata TT")
+	end
+	local narrowFontObj = CreateFont(MODNAME.."narrowFontObj")
+	local normalFontObj = CreateFont(MODNAME.."normalFontObj")
+
+	-- I want to do a bit more comprehensive tooltip processing. Things like changing font sizes,
+	-- adding padding to the left hand side, and using better color handling. So... this function
+	-- will do that for me.
+	local function ttAdd(
+			leftPad,		-- number of times to pad two spaces on left side
+			textSize,		-- add to or subtract from addon.db.profile.frameopts.fontsize to get fontsize
+			narrow,			-- if 1, use ARIALN instead of FRITZQ
+			str1,			-- left-hand string
+			hexcolor1,		-- hex color code for left-hand side
+			str2,			-- if present, this is the right-hand string
+			hexcolor2)		-- if present, hex color code for right-hand side
+
+		-- are we changing fontsize or narrow?
+		local fontSize
+
+		if narrow or textSize ~= 0 then
+			local font = narrow and narrowFont or normalFont
+			local fontObj = narrow and narrowFontObj or normalFontObj
+
+			fontSize = addon.db.profile.frameopts.fontsize + textSize
+
+			fontObj:SetFont(font, fontSize)
+			acquire_tip:SetFont(fontObj)
+		end
+
+		-- Add in our left hand padding
+		local loopPad = leftPad
+		local leftStr = str1
+
+		while loopPad > 0 do
+			leftStr = "  " .. leftStr
+			loopPad = loopPad - 1
+		end
+
+		if str2 then
+			local lineNum = acquire_tip:AddLine()
+
+			acquire_tip:SetCell(lineNum, 1, "|cff"..hexcolor1..leftStr.."|r")
+			acquire_tip:SetCell(lineNum, 2, "|cff"..hexcolor2..str2.."|r", "RIGHT")
+		else
+			-- Text spans both columns - set maximum width to match fontSize to maintain uniform tooltip size. -Torhal
+			local width = math.ceil(fontSize * 37.5)
+			local lineNum = acquire_tip:AddLine()
+
+			acquire_tip:SetCell(lineNum, 1, "|cff"..hexcolor1..leftStr.."|r", nil, "LEFT", 2, nil, 0, 0, width, width)
+		end
+	end
+
+	local function SetSpellTooltip(owner, loc, link)
+		local anchor =
+		spell_tip:SetOwner(owner, "ANCHOR_NONE")
+		spell_tip:ClearAllPoints()
+
+		if loc == "Top" then
+			spell_tip:SetPoint("BOTTOMLEFT", owner, "TOPLEFT")
+		elseif loc == "Bottom" then
+			spell_tip:SetPoint("TOPLEFT", owner, "BOTTOMLEFT")
+		elseif loc == "Left" then
+			spell_tip:SetPoint("TOPRIGHT", owner, "TOPLEFT")
+		elseif loc == "Right" then
+			spell_tip:SetPoint("TOPLEFT", owner, "TOPRIGHT")
+		end
+
+		-- Add TipTac Support
+		if TipTac and TipTac.AddModifiedTip and not spell_tip.tiptac then
+			TipTac:AddModifiedTip(spell_tip)
+			spell_tip.tiptac = true
+		end
+
+		-- Set the spell tooltip's scale, and copy its other values from GameTooltip so AddOns which modify it will work.
+		spell_tip:SetBackdrop(GameTooltip:GetBackdrop())
+		spell_tip:SetBackdropColor(GameTooltip:GetBackdropColor())
+		spell_tip:SetBackdropBorderColor(GameTooltip:GetBackdropBorderColor())
+		spell_tip:SetScale(addon.db.profile.frameopts.tooltipscale)
+
+		spell_tip:SetHyperlink(link)
+		spell_tip:Show()
+	end
+
+	local function GetTipFactionInfo(comp_faction)
+		local display_tip = false
+		local color = addon:hexcolor("NEUTRAL")
+		local faction = FACTION_NEUTRAL
+
+		if comp_faction == FACTION_HORDE then
+			color = addon:hexcolor("HORDE")
+
+			if Player["Faction"] == FACTION_HORDE then
+				display_tip = true
+			else
+				faction = FACTION_HORDE
+			end
+		elseif comp_faction == FACTION_ALLIANCE then
+			color = addon:hexcolor("ALLIANCE")
+
+			if Player["Faction"] == FACTION_ALLIANCE then
+				display_tip = true
+			else
+				faction = FACTION_ALLIANCE
+			end
+		else
+			display_tip = true
+		end
+		return display_tip, color, faction
+	end
+
+	function GenerateTooltipContent(owner, rIndex)
+		local spell_tip_anchor = addon.db.profile.spelltooltiplocation
+		local acquire_tip_anchor = addon.db.profile.acquiretooltiplocation
+		local recipe_entry = addon.recipe_list[rIndex]
+		local spell_link = recipe_entry["RecipeLink"]
+		local MainPanel = addon.Frame
+
+		if acquire_tip_anchor == _G.OFF then
+			QTip:Release(acquire_tip)
+
+			-- If we have the spell link tooltip, anchor it to MainPanel instead so it shows
+			if spell_tip_anchor ~= _G.OFF and spell_link then
+				SetSpellTooltip(MainPanel, spell_tip_anchor, spell_link)
+			else
+				spell_tip:Hide()
+			end
+			return
+		end
+		acquire_tip = QTip:Acquire(MODNAME.." Tooltip", 2, "LEFT", "LEFT")
+		acquire_tip:ClearAllPoints()
+
+		if acquire_tip_anchor == "Right" then
+			acquire_tip:SetPoint("TOPLEFT", MainPanel, "TOPRIGHT")
+		elseif acquire_tip_anchor == "Left" then
+			acquire_tip:SetPoint("TOPRIGHT", MainPanel, "TOPLEFT")
+		elseif acquire_tip_anchor == "Top" then
+			acquire_tip:SetPoint("BOTTOMLEFT", MainPanel, "TOPLEFT")
+		elseif acquire_tip_anchor == "Bottom" then
+			acquire_tip:SetPoint("TOPLEFT", MainPanel, "BOTTOMLEFT")
+		elseif acquire_tip_anchor == "Mouse" then
+			local x, y = GetCursorPosition()
+			local uiscale = UIParent:GetEffectiveScale()
+
+			acquire_tip:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", x / uiscale, y / uiscale)
+		end
+
+		if TipTac and TipTac.AddModifiedTip then
+			-- Pass true as second parameter because hooking OnHide causes C stack overflows -Torhal
+			TipTac:AddModifiedTip(acquire_tip, true)
+		end
+		acquire_tip:Clear()
+		acquire_tip:SetScale(addon.db.profile.frameopts.tooltipscale)
+		acquire_tip:AddHeader()
+		acquire_tip:SetCell(1, 1, "|cff"..addon:hexcolor("HIGH")..recipe_entry["Name"], "CENTER", 2)
+
+		-- check if the recipe is excluded
+		local exclude = addon.db.profile.exclusionlist
+
+		if exclude[rIndex] then
+			ttAdd(0, -1, true, L["RECIPE_EXCLUDED"], addon:hexcolor("RED"))
+		end
+
+		-- Add in skill level requirement, colored correctly
+		local color_1 = addon:hexcolor("NORMAL")
+
+		local recipe_level = recipe_entry["Level"]
+		local skill_level = Player["ProfessionLevel"]
+		local color_2
+
+		if recipe_level > skill_level then
+			color_2 = addon:hexcolor("RED")
+		elseif skill_level - recipe_level < 20 then
+			color_2 = addon:hexcolor("ORANGE")
+		elseif skill_level - recipe_level < 30 then
+			color_2 = addon:hexcolor("YELLOW")
+		elseif skill_level - recipe_level < 40 then
+			color_2 = addon:hexcolor("GREEN")
+		else
+			color_2 = addon:hexcolor("MIDGREY")
+		end
+		ttAdd(0, -1, false, L["Required Skill"] .. " :", color_1, recipe_entry["Level"], color_2)
+
+		-- Binding info
+		acquire_tip:AddSeparator()
+		color_1 = addon:hexcolor("NORMAL")
+
+		local recipe_flags = recipe_entry["Flags"]
+
+		for flag, label in pairs(BINDING_FLAGS) do
+			if recipe_flags[flag] then
+				ttAdd(0, -1, true, label, color_1)
+			end
+		end
+		acquire_tip:AddSeparator()
+
+		ttAdd(0, -1, false, L["Obtained From"] .. " : ", addon:hexcolor("NORMAL"))
+
+		local playerFaction = Player["Faction"]
+		local rep_list = addon.reputation_list
+
+		for index, acquire in pairs(recipe_entry["Acquire"]) do
+			local acquire_type = acquire["Type"]
+			local display_tip = false
+
+			if acquire_type == A_TRAINER then
+				local trainer = addon.trainer_list[acquire["ID"]]
+
+				color_1 = addon:hexcolor("TRAINER")
+				display_tip, color_2 = GetTipFactionInfo(trainer["Faction"])
+
+				if display_tip then
+					local coord_text = ""
+
+					if trainer["Coordx"] ~= 0 and trainer["Coordy"] ~= 0 then
+						coord_text = "(" .. trainer["Coordx"] .. ", " .. trainer["Coordy"] .. ")"
+					end
+					ttAdd(0, -2, false, L["Trainer"], color_1, trainer["Name"], color_2)
+
+					color_1 = addon:hexcolor("NORMAL")
+					color_2 = addon:hexcolor("HIGH")
+
+					ttAdd(1, -2, true, trainer["Location"], color_1, coord_text, color_2)
+				end
+			elseif acquire_type == A_VENDOR then
+				local vendor = addon.vendor_list[acquire["ID"]]
+				local faction
+
+				color_1 = addon:hexcolor("VENDOR")
+				display_tip, color_2, faction = GetTipFactionInfo(vendor["Faction"])
+
+				if display_tip then
+					local coord_text = ""
+
+					if vendor["Coordx"] ~= 0 and vendor["Coordy"] ~= 0 then
+						coord_text = "(" .. vendor["Coordx"] .. ", " .. vendor["Coordy"] .. ")"
+					end
+					ttAdd(0, -1, false, L["Vendor"], color_1, vendor["Name"], color_2)
+
+					color_1 = addon:hexcolor("NORMAL")
+					color_2 = addon:hexcolor("HIGH")
+
+					ttAdd(1, -2, true, vendor["Location"], color_1, coord_text, color_2)
+				elseif faction then
+					ttAdd(0, -1, false, faction.." "..L["Vendor"], color_1)
+				end
+			elseif acquire_type == A_MOB then
+				local mob = addon.mob_list[acquire["ID"]]
+				local coord_text = ""
+
+				if mob["Coordx"] ~= 0 and mob["Coordy"] ~= 0 then
+					coord_text = "(" .. mob["Coordx"] .. ", " .. mob["Coordy"] .. ")"
+				end
+				color_1 = addon:hexcolor("MOBDROP")
+				color_2 = addon:hexcolor("HORDE")
+
+				ttAdd(0, -1, false, L["Mob Drop"], color_1, mob["Name"], color_2)
+
+				color_1 = addon:hexcolor("NORMAL")
+				color_2 = addon:hexcolor("HIGH")
+
+				ttAdd(1, -2, true, mob["Location"], color_1, coord_text, color_2)
+			elseif acquire_type == A_QUEST then
+				local quest = addon.quest_list[acquire["ID"]]
+
+				if quest then
+					local faction
+
+					color_1 = addon:hexcolor("QUEST")
+					display_tip, color_2, faction = GetTipFactionInfo(quest["Faction"])
+
+					if display_tip then
+						local coord_text = ""
+
+						if quest["Coordx"] ~= 0 and quest["Coordy"] ~= 0 then
+							coord_text = "(" .. quest["Coordx"] .. ", " .. quest["Coordy"] .. ")"
+						end
+						ttAdd(0, -1, false, L["Quest"], color_1, quest["Name"], color_2)
+
+						color_1 = addon:hexcolor("NORMAL")
+						color_2 = addon:hexcolor("HIGH")
+
+						ttAdd(1, -2, true, quest["Location"], color_1, coord_text, color_2)
+					elseif faction then
+						ttAdd(0, -1, false, faction.." "..L["Quest"], color_1)
+					end
+				end
+			elseif acquire_type == A_SEASONAL then
+				color_1 = addon:hexcolor("SEASON")
+				ttAdd(0, -1, 0, SEASONAL_CATEGORY, color_1, addon.seasonal_list[acquire["ID"]]["Name"], color_1)
+			elseif acquire_type == A_REPUTATION then
+				local repvendor = addon.vendor_list[acquire["RepVendor"]]
+				local coord_text = ""
+
+				if repvendor["Coordx"] ~= 0 and repvendor["Coordy"] ~= 0 then
+					coord_text = "(" .. repvendor["Coordx"] .. ", " .. repvendor["Coordy"] .. ")"
+				end
+				local repfac = rep_list[acquire["ID"]]
+				local repname = repfac["Name"]
+
+				color_1 = addon:hexcolor("REP")
+				color_2 = addon:hexcolor("NORMAL")
+				ttAdd(0, -1, false, _G.REPUTATION, color_1, repname, color_2)
+
+				local rStr = ""
+				local rep_level = acquire["RepLevel"]
+
+				if rep_level == 0 then
+					rStr = FACTION_NEUTRAL
+					color_1 = addon:hexcolor("NEUTRAL")
+				elseif rep_level == 1 then
+					rStr = BFAC["Friendly"]
+					color_1 = addon:hexcolor("FRIENDLY")
+				elseif rep_level == 2 then
+					rStr = BFAC["Honored"]
+					color_1 = addon:hexcolor("HONORED")
+				elseif rep_level == 3 then
+					rStr = BFAC["Revered"]
+					color_1 = addon:hexcolor("REVERED")
+				else
+					rStr = BFAC["Exalted"]
+					color_1 = addon:hexcolor("EXALTED")
+				end
+				display_tip, color_2 = GetTipFactionInfo(repvendor["Faction"])
+
+				if display_tip then
+					ttAdd(1, -2, false, rStr, color_1, repvendor["Name"], color_2)
+
+					color_1 = addon:hexcolor("NORMAL")
+					color_2 = addon:hexcolor("HIGH")
+
+					ttAdd(2, -2, true, repvendor["Location"], color_1, coord_text, color_2)
+				end
+			elseif acquire_type == A_WORLD_DROP then
+				local acquire_id = acquire["ID"]
+
+				if acquire_id == 1 then
+					color_1 = addon:hexcolor("COMMON")
+				elseif acquire_id == 2 then
+					color_1 = addon:hexcolor("UNCOMMON")
+				elseif acquire_id == 3 then
+					color_1 = addon:hexcolor("RARE")
+				elseif acquire_id == 4 then
+					color_1 = addon:hexcolor("EPIC")
+				else
+					color_1 = addon:hexcolor("NORMAL")
+				end
+				ttAdd(0, -1, false, L["World Drop"], color_1)
+			elseif acquire_type == A_CUSTOM then
+				ttAdd(0, -1, false, addon.custom_list[acquire["ID"]]["Name"], addon:hexcolor("NORMAL"))
+			elseif acquire_type == A_PVP then
+				local vendor = addon.vendor_list[acquire["ID"]]
+				local faction
+
+				color_1 = addon:hexcolor("VENDOR")
+				display_tip, color_2, faction = GetTipFactionInfo(vendor["Faction"])
+
+				if display_tip then
+					local coord_text = ""
+
+					if vendor["Coordx"] ~= 0 and vendor["Coordy"] ~= 0 then
+						coord_text = "(" .. vendor["Coordx"] .. ", " .. vendor["Coordy"] .. ")"
+					end
+					ttAdd(0, -1, false, L["Vendor"], color_1, vendor["Name"], color_2)
+
+					color_1 = addon:hexcolor("NORMAL")
+					color_2 = addon:hexcolor("HIGH")
+
+					ttAdd(1, -2, true, vendor["Location"], color_1, coord_text, color_2)
+				elseif faction then
+					ttAdd(0, -1, false, faction.." "..L["Vendor"], color_1)
+				end
+				--@alpha@
+			else	-- Unhandled
+				ttAdd(0, -1, 0, L["Unhandled Recipe"], addon:hexcolor("NORMAL"))
+				--@end-alpha@
+			end
+		end
+		acquire_tip:AddSeparator()
+		acquire_tip:AddSeparator()
+
+		color_1 = addon:hexcolor("NORMAL")
+
+		ttAdd(0, -1, 0, L["ALT_CLICK"], color_1)
+		ttAdd(0, -1, 0, L["CTRL_CLICK"], color_1)
+		ttAdd(0, -1, 0, L["SHIFT_CLICK"], color_1)
+
+		if addon.db.profile.worldmap or addon.db.profile.minimap then
+			ttAdd(0, -1, 0, L["CTRL_SHIFT_CLICK"], color_1)
+		end
+		acquire_tip:Show()
+
+		-- If we have the spell link tooltip, link it to the acquire tooltip.
+		if spell_tip_anchor ~= _G.OFF and spell_link then
+			SetSpellTooltip(acquire_tip, spell_tip_anchor, spell_link)
+		else
+			spell_tip:Hide()
+		end
+	end
+end	-- do
+
+-------------------------------------------------------------------------------
+-- Create the MainPanel and set its values
+-------------------------------------------------------------------------------
+local MainPanel = CreateFrame("Frame", "ARL_MainPanel", UIParent)
+MainPanel:SetWidth(MAINPANEL_NORMAL_WIDTH)
+MainPanel:SetHeight(447)
+MainPanel:SetFrameStrata("DIALOG")
+MainPanel:SetHitRectInsets(5, 5, 5, 5)
+
+MainPanel:EnableMouse(true)
+MainPanel:EnableKeyboard(true)
+MainPanel:SetMovable(true)
+MainPanel:SetClampedToScreen(true)
+MainPanel:Show()
+
+MainPanel.is_expanded = false
+
+-- Let the user banish the MainPanel with the ESC key.
+tinsert(UISpecialFrames, "ARL_MainPanel")
+
+addon.Frame = MainPanel
+
+MainPanel.backdrop = MainPanel:CreateTexture("AckisRecipeList.bgTexture", "ARTWORK")
+MainPanel.backdrop:SetTexture("Interface\\Addons\\AckisRecipeList\\img\\main")
+MainPanel.backdrop:SetAllPoints(MainPanel)
+MainPanel.backdrop:SetTexCoord(0, (MAINPANEL_NORMAL_WIDTH/512), 0, (447/512))
+
+MainPanel.title_bar = MainPanel:CreateFontString(nil, "ARTWORK")
+MainPanel.title_bar:SetFontObject("GameFontHighlightSmall")
+MainPanel.title_bar:ClearAllPoints()
+MainPanel.title_bar:SetPoint("TOP", MainPanel, "TOP", 20, -16)
+MainPanel.title_bar:SetJustifyH("CENTER")
+
+-------------------------------------------------------------------------------
+-- MainPanel scripts/functions.
+-------------------------------------------------------------------------------
+MainPanel:SetScript("OnHide",
+		    function(self)
+			    addon:ClosePopups()
+		    end)
+
+MainPanel:SetScript("OnMouseDown", MainPanel.StartMoving)
+
+MainPanel:SetScript("OnMouseUp",
+		    function(self, button)
+			    self:StopMovingOrSizing()
+
+			    local opts = addon.db.profile.frameopts
+			    local from, _, to, x, y = self:GetPoint()
+
+			    opts.anchorFrom = from
+			    opts.anchorTo = to
+
+			    if self.is_expanded then
+				    if opts.anchorFrom == "TOPLEFT" or opts.anchorFrom == "LEFT" or opts.anchorFrom == "BOTTOMLEFT" then
+					    opts.offsetx = x
+				    elseif opts.anchorFrom == "TOP" or opts.anchorFrom == "CENTER" or opts.anchorFrom == "BOTTOM" then
+					    opts.offsetx = x - 151/2
+				    elseif opts.anchorFrom == "TOPRIGHT" or opts.anchorFrom == "RIGHT" or opts.anchorFrom == "BOTTOMRIGHT" then
+					    opts.offsetx = x - 151
+				    end
+			    else
+				    opts.offsetx = x
+			    end
+			    opts.offsety = y
+		    end)
+
+function MainPanel:HighlightCategory(target)
+	if not target then
+		self.filter_menu:Hide()
+	end
+
+	for category in pairs(self.filter_menu) do
+		local toggle = "menu_toggle_" .. category
+
+		if target == category then
+			self[toggle].text:SetText(addon:White(CATEGORY_TEXT[category]))
+		elseif category ~= 0 and category ~= "texture" then
+			self[toggle]:SetChecked(false)
+			self[toggle].text:SetText(addon:Yellow(CATEGORY_TEXT[category]))
+		end
+	end
+end
+
+function MainPanel:ToggleState()
+	if self.is_expanded then
+		self:SetWidth(MAINPANEL_NORMAL_WIDTH)
+
+		self.backdrop:SetTexture([[Interface\Addons\AckisRecipeList\img\main]])
+		self.backdrop:SetAllPoints(self)
+		self.backdrop:SetTexCoord(0, (MAINPANEL_NORMAL_WIDTH/512), 0, (447/512))
+
+		self.progress_bar:SetWidth(195)
+	else
+		self:SetWidth(MAINPANEL_EXPANDED_WIDTH)
+
+		self.backdrop:SetTexture([[Interface\Addons\AckisRecipeList\img\expanded]])
+		self.backdrop:SetAllPoints(self)
+		self.backdrop:SetTexCoord(0, (MAINPANEL_EXPANDED_WIDTH/512), 0, (447/512))
+
+		self.progress_bar:SetWidth(345)
+	end
+	self.is_expanded = not self.is_expanded
+
+	local x, y = self:GetLeft(), self:GetBottom()
+
+	self:ClearAllPoints()
+	self:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", x, y)
+	self:UpdateTitle()
+end
+
+function MainPanel:SetProfession()
+	for k, v in pairs(SortedProfessions) do
+		if v.name == Player["Profession"] then
+			self.profession = k
+			break
+		end
+	end
+	self.mode_button:ChangeTexture(SortedProfessions[self.profession].texture)
+end
+
+function MainPanel:SetPosition()
+	self:ClearAllPoints()
+
+	local opts = addon.db.profile.frameopts
+	local FixedOffsetX = opts.offsetx
+
+	if opts.anchorTo == "" then
+		-- no values yet, clamp to whatever frame is appropriate
+		if ATSWFrame then
+			-- Anchor frame to ATSW
+			self:SetPoint("CENTER", ATSWFrame, "CENTER", 490, 0)
+		elseif CauldronFrame then
+			-- Anchor frame to Cauldron
+			self:SetPoint("CENTER", CauldronFrame, "CENTER", 490, 0)
+		elseif Skillet then
+			-- Anchor frame to Skillet
+			self:SetPoint("CENTER", SkilletFrame, "CENTER", 468, 0)
+		else
+			-- Anchor to default tradeskill frame
+			self:SetPoint("TOPLEFT", TradeSkillFrame, "TOPRIGHT", 10, 0)
+		end
+	else
+		if self.is_expanded then
+			if opts.anchorFrom == "TOPLEFT" or opts.anchorFrom == "LEFT" or opts.anchorFrom == "BOTTOMLEFT" then
+				FixedOffsetX = opts.offsetx
+			elseif opts.anchorFrom == "TOP" or opts.anchorFrom == "CENTER" or opts.anchorFrom == "BOTTOM" then
+				FixedOffsetX = opts.offsetx + 151/2
+			elseif opts.anchorFrom == "TOPRIGHT" or opts.anchorFrom == "RIGHT" or opts.anchorFrom == "BOTTOMRIGHT" then
+				FixedOffsetX = opts.offsetx + 151
+			end
+		end
+		self:SetPoint(opts.anchorFrom, UIParent, opts.anchorTo, FixedOffsetX, opts.offsety)
+	end
+end
+
+function MainPanel:UpdateTitle()
+	if self.is_expanded then
+		local total, active = 0, 0
+
+		for filter, info in pairs(FilterValueMap) do
+			if info.svroot then
+				if info.svroot[filter] == true then
+					active = active + 1
+				end
+				total = total + 1
+			end
+		end
+		self.title_bar:SetFormattedText(addon:Normal("ARL (v.%s) - %s (%d/%d %s)"), addon.version, Player["Profession"], active, total, _G.FILTERS)
+	else
+		self.title_bar:SetFormattedText(addon:Normal("ARL (v.%s) - %s"), addon.version, Player["Profession"])
+	end
+end
+
+-------------------------------------------------------------------------------
+-- Create the MainPanel.mode_button and assign its values.
+-------------------------------------------------------------------------------
+MainPanel.mode_button = CreateFrame("Button", nil, MainPanel, "UIPanelButtonTemplate")
+MainPanel.mode_button:SetWidth(64)
+MainPanel.mode_button:SetHeight(64)
+MainPanel.mode_button:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 1, -2)
+MainPanel.mode_button:RegisterForClicks("LeftButtonUp", "RightButtonUp")
+
+MainPanel.mode_button._normal = MainPanel.mode_button:CreateTexture(nil, "BACKGROUND")
+MainPanel.mode_button._pushed = MainPanel.mode_button:CreateTexture(nil, "BACKGROUND")
+MainPanel.mode_button._disabled = MainPanel.mode_button:CreateTexture(nil, "BACKGROUND")
+
+-------------------------------------------------------------------------------
+-- MainPanel.mode_button scripts/functions.
+-------------------------------------------------------------------------------
+MainPanel.mode_button:SetScript("OnClick",
+				function(self, button, down)
+					-- Known professions should be in Player["Professions"]
+
+					-- This loop is gonna be weird. The reason is because we need to
+					-- ensure that we cycle through all the known professions, but also
+					-- that we do so in order. That means that if the currently displayed
+					-- profession is the last one in the list, we're actually going to
+					-- iterate completely once to get to the currently displayed profession
+					-- and then iterate again to make sure we display the next one in line.
+					-- Further, there is the nuance that the person may not know any
+					-- professions yet at all. User are so annoying.
+					local startLoop = 0
+					local endLoop = 0
+					local displayProf = 0
+
+					-- ok, so first off, if we've never done this before, there is no "current"
+					-- and a single iteration will do nicely, thank you
+					if button == "LeftButton" then
+						-- normal profession switch
+						if MainPanel.profession == 0 then
+							startLoop = 1
+							endLoop = NUM_PROFESSIONS + 1
+						else
+							startLoop = MainPanel.profession + 1
+							endLoop = MainPanel.profession
+						end
+						local index = startLoop
+
+						while index ~= endLoop do
+							if index > NUM_PROFESSIONS then
+								index = 1
+							elseif Player["Professions"][SortedProfessions[index].name] then
+								displayProf = index
+								MainPanel.profession = index
+								break
+							else
+								index = index + 1
+							end
+						end
+					elseif button == "RightButton" then
+						-- reverse profession switch
+						if MainPanel.profession == 0 then
+							startLoop = NUM_PROFESSIONS + 1
+							endLoop = 0
+						else
+							startLoop = MainPanel.profession - 1
+							endLoop = MainPanel.profession
+						end
+						local index = startLoop
+
+						while index ~= endLoop do
+							if index < 1 then
+								index = NUM_PROFESSIONS
+							elseif Player["Professions"][SortedProfessions[index].name] then
+								displayProf = index
+								MainPanel.profession = index
+								break
+							else
+								index = index - 1
+							end
+						end
+					end
+					local is_shown = TradeSkillFrame:IsVisible()
+
+					CastSpellByName(SortedProfessions[MainPanel.profession].name)
+					addon:Scan()
+
+					if not is_shown then
+						TradeSkillFrame:Hide()
+					end
+				end)
+
+function MainPanel.mode_button:ChangeTexture(texture)
+	local normal, pushed, disabled = self._normal, self._pushed, self._disabled
+
+	normal:SetTexture([[Interface\Addons\AckisRecipeList\img\]] .. texture .. [[_up]])
+	normal:SetTexCoord(0, 1, 0, 1)
+	normal:SetAllPoints(self)
+	self:SetNormalTexture(normal)
+
+	pushed:SetTexture([[Interface\Addons\AckisRecipeList\img\]] .. texture .. [[_down]])
+	pushed:SetTexCoord(0, 1, 0, 1)
+	pushed:SetAllPoints(self)
+	self:SetPushedTexture(pushed)
+
+	disabled:SetTexture([[Interface\Addons\AckisRecipeList\img\]] .. texture .. [[_up]])
+	disabled:SetTexCoord(0, 1, 0, 1)
+	disabled:SetAllPoints(self)
+	self:SetDisabledTexture(disabled)
+end
+
+-------------------------------------------------------------------------------
+-- Create the X-close button, and set its scripts.
+-------------------------------------------------------------------------------
+MainPanel.xclose_button = CreateFrame("Button", nil, MainPanel, "UIPanelCloseButton")
+MainPanel.xclose_button:SetPoint("TOPRIGHT", MainPanel, "TOPRIGHT", 5, -6)
+
+MainPanel.xclose_button:SetScript("OnClick",
+				  function(self, button, down)
+					  MainPanel:Hide()
+				  end)
+
+-------------------------------------------------------------------------------
+-- Create MainPanel.filter_toggle, and set its scripts.
+-------------------------------------------------------------------------------
+MainPanel.filter_toggle = GenericCreateButton(nil, MainPanel, 25, 90, "GameFontNormalSmall", "GameFontHighlightSmall", L["FILTER_OPEN"], "CENTER", L["FILTER_OPEN_DESC"], 1)
+MainPanel.filter_toggle:SetPoint("TOPRIGHT", MainPanel, "TOPRIGHT", -8, -40)
+
+MainPanel.filter_toggle:SetScript("OnClick",
+			   function(self, button, down)
+				   if MainPanel.is_expanded then
+					   -- Change the text and tooltip for the filter button
+					   self:SetText(L["FILTER_OPEN"])
+					   SetTooltipScripts(self, L["FILTER_OPEN_DESC"])
+
+					   -- Hide the category buttons
+					   for category in pairs(MainPanel.filter_menu) do
+						   if category ~= 0 and category ~= "texture" then
+							   MainPanel["menu_toggle_" .. category]:Hide()
+						   end
+					   end
+					   MainPanel:HighlightCategory(nil)
+					   MainPanel.filter_reset:Hide()
+				   else
+					   -- Change the text and tooltip for the filter button
+					   self:SetText(L["FILTER_CLOSE"])
+					   SetTooltipScripts(self, L["FILTER_CLOSE_DESC"])
+
+					   -- Show the category buttons
+					   for category in pairs(MainPanel.filter_menu) do
+						   if category ~= 0 and category ~= "texture" then
+							   MainPanel["menu_toggle_" .. category]:Show()
+						   end
+					   end
+					   MainPanel.filter_reset:Show()
+				   end
+				   MainPanel:ToggleState()
+			   end)
+
+-------------------------------------------------------------------------------
+-- Create MainPanel.filter_reset and set its scripts.
+-------------------------------------------------------------------------------
+MainPanel.filter_reset = GenericCreateButton(nil, MainPanel, 25, 90, "GameFontNormalSmall", "GameFontHighlightSmall", _G.RESET, "CENTER",
+					     L["RESET_DESC"], 1)
+MainPanel.filter_reset:SetPoint("TOPRIGHT", MainPanel.filter_toggle, "BOTTOMRIGHT", 0, -2)
+MainPanel.filter_reset:Hide()
+
+do
+	local function recursiveReset(t)
+		-- Thanks to Antiarc for this code
+		for k, v in pairs(t) do
+			if type(v) == "table" then
+				recursiveReset(v)
+			else
+				t[k] = true
+			end
+		end
+	end
+
+	MainPanel.filter_reset:SetScript("OnClick",
+					 function()
+						 local filterdb = addon.db.profile.filters
+
+						 -- Reset all filters to true
+						 recursiveReset(addon.db.profile.filters)
+
+						 -- Reset specific filters to false
+						 filterdb.general.specialty = false
+						 filterdb.general.known = false
+
+						 -- Reset all classes to false
+						 for class in pairs(filterdb.classes) do
+							 filterdb.classes[class] = false
+						 end
+						 -- Set your own class to true
+						 filterdb.classes[strlower(Player["Class"])] = true
+
+						 if MainPanel:IsVisible() then
+							 MainPanel:UpdateTitle()
+							 MainPanel:HighlightCategory(nil)
+							 ReDisplay()
+						 end
+					 end)
+end	-- do
+
+-------------------------------------------------------------------------------
+-- Create the seven buttons for opening/closing the filter menus
+-------------------------------------------------------------------------------
+local CreateFilterMenuButton
+do
+	local CATEGORY_TOOLTIP = {
+		["general"]	= L["FILTERING_GENERAL_DESC"],
+		["obtain"]	= L["FILTERING_OBTAIN_DESC"],
+		["binding"]	= L["FILTERING_BINDING_DESC"],
+		["item"]	= L["FILTERING_ITEM_DESC"],
+		["player"]	= L["FILTERING_PLAYERTYPE_DESC"],
+		["rep"]		= L["FILTERING_REP_DESC"],
+		["misc"]	= L["FILTERING_MISC_DESC"]
+	}
+
+	-- This manages the filter menu panel, as well as checking or unchecking the
+	-- buttons that got us here in the first place
+	local function ToggleFilterMenu(panel)
+		local ChangeFilters = false
+
+		MainPanel.filter_menu.rep.Classic:Hide()
+		MainPanel.filter_menu.rep.BC:Hide()
+		MainPanel.filter_menu.rep.LK:Hide()
+
+		MainPanel.filter_menu.rep.toggle_originalwow:SetChecked(false)
+		MainPanel.filter_menu.rep.toggle_bc:SetChecked(false)
+		MainPanel.filter_menu.rep.toggle_wrath:SetChecked(false)
+
+		local toggle = "menu_toggle_" .. panel
+
+		if MainPanel[toggle]:GetChecked() then
+			-- Display the selected filter_menu category frame
+			MainPanel:HighlightCategory(panel)
+			MainPanel.filter_menu[panel]:Show()
+
+			-- Hide all of the other filter_menu category frames
+			for category in pairs(MainPanel.filter_menu) do
+				if category ~= panel and category ~= 0 and category ~= "texture" then
+					MainPanel.filter_menu[category]:Hide()
+				end
+			end
+			ChangeFilters = true
+		else
+			MainPanel[toggle].text:SetText(addon:Yellow(CATEGORY_TEXT[panel]))
+			ChangeFilters = false
+		end
+
+		if ChangeFilters then
+			-- Depending on which panel we're showing, either display one column
+			-- or two column
+			if panel == "general" or panel == "obtain" or panel == "binding" or panel == "item" or panel == "misc" then
+				MainPanel.filter_menu.texture:ClearAllPoints()
+				MainPanel.filter_menu:SetWidth(FILTERMENU_DOUBLE_WIDTH)
+				MainPanel.filter_menu.texture:SetTexture([[Interface\Addons\AckisRecipeList\img\fly_2col]])
+				MainPanel.filter_menu.texture:SetAllPoints(MainPanel.filter_menu)
+				MainPanel.filter_menu.texture:SetTexCoord(0, (FILTERMENU_DOUBLE_WIDTH/256), 0, (FILTERMENU_HEIGHT/512))
+			elseif panel == "player" or panel == "rep" then
+				MainPanel.filter_menu.texture:ClearAllPoints()
+				MainPanel.filter_menu:SetWidth(FILTERMENU_SINGLE_WIDTH)
+				MainPanel.filter_menu.texture:SetTexture([[Interface\Addons\AckisRecipeList\img\fly_1col]])
+				MainPanel.filter_menu.texture:SetAllPoints(MainPanel.filter_menu)
+				MainPanel.filter_menu.texture:SetTexCoord(0, (FILTERMENU_SINGLE_WIDTH/256), 0, (FILTERMENU_HEIGHT/512))
+			end
+			-- Change the filters to the current panel
+			MainPanel.filter_menu:Show()
+		else
+			-- We're hiding, don't bother changing anything
+			MainPanel.filter_menu:Hide()
+		end
+	end
+
+	function CreateFilterMenuButton(bTex, category)
+		local ExpTextureSize = 34
+		local cButton = CreateFrame("CheckButton", nil, MainPanel)
+
+		cButton:SetWidth(ExpTextureSize)
+		cButton:SetHeight(ExpTextureSize)
+		cButton:SetScript("OnClick",
+				  function(self, button, down)
+					  ToggleFilterMenu(category)
+				  end)
+
+		local bgTex = cButton:CreateTexture(nil, "BACKGROUND")
+		bgTex:SetTexture('Interface/SpellBook/UI-Spellbook-SpellBackground')
+		bgTex:SetHeight(ExpTextureSize + 6)
+		bgTex:SetWidth(ExpTextureSize + 4)
+		bgTex:SetTexCoord(0, (43/64), 0, (43/64))
+		bgTex:SetPoint("CENTER", cButton, "CENTER", 0, 0)
+
+		local iconTex = cButton:CreateTexture(nil, "BORDER")
+		iconTex:SetTexture('Interface/Icons/' .. bTex)
+		iconTex:SetAllPoints(cButton)
+
+		local pushedTexture = cButton:CreateTexture(nil, "ARTWORK")
+		pushedTexture:SetTexture('Interface/Buttons/UI-Quickslot-Depress')
+		pushedTexture:SetAllPoints(cButton)
+		cButton:SetPushedTexture(pushedTexture)
+
+		local highlightTexture = cButton:CreateTexture()
+		highlightTexture:SetTexture('Interface/Buttons/ButtonHilight-Square')
+		highlightTexture:SetAllPoints(cButton)
+		highlightTexture:SetBlendMode('ADD')
+		cButton:SetHighlightTexture(highlightTexture)
+
+		local checkedTexture = cButton:CreateTexture()
+		checkedTexture:SetTexture('Interface/Buttons/CheckButtonHilight')
+		checkedTexture:SetAllPoints(cButton)
+		checkedTexture:SetBlendMode('ADD')
+		cButton:SetCheckedTexture(checkedTexture)
+
+		-- Create the text object to go along with it
+		local cbText = cButton:CreateFontString("cbText", "OVERLAY", "GameFontHighlight")
+		cbText:SetText(addon:Yellow(CATEGORY_TEXT[category]))
+		cbText:SetPoint("LEFT", cButton, "RIGHT", 5, 0)
+		cbText:SetHeight(14)
+		cbText:SetWidth(100)
+		cbText:SetJustifyH("LEFT")
+		cButton.text = cbText
+
+		-- And throw up a tooltip
+		SetTooltipScripts(cButton, CATEGORY_TOOLTIP[category])
+		cButton:Hide()
+
+		return cButton
+	end
+end	-- do
+
+MainPanel.menu_toggle_general = CreateFilterMenuButton("INV_Misc_Note_06", "general")
+MainPanel.menu_toggle_general:SetPoint("TOPRIGHT", MainPanel.filter_reset, "BOTTOMLEFT", -7, -23)
+
+MainPanel.menu_toggle_obtain = CreateFilterMenuButton("Spell_Shadow_MindRot", "obtain")
+MainPanel.menu_toggle_obtain:SetPoint("TOPLEFT", MainPanel.menu_toggle_general, "BOTTOMLEFT", 0, -8)
+
+MainPanel.menu_toggle_binding = CreateFilterMenuButton("INV_Belt_20", "binding")
+MainPanel.menu_toggle_binding:SetPoint("TOPLEFT", MainPanel.menu_toggle_obtain, "BOTTOMLEFT", -0, -8)
+
+MainPanel.menu_toggle_item = CreateFilterMenuButton("INV_Misc_EngGizmos_19", "item")
+MainPanel.menu_toggle_item:SetPoint("TOPLEFT", MainPanel.menu_toggle_binding, "BOTTOMLEFT", -0, -8)
+
+MainPanel.menu_toggle_player = CreateFilterMenuButton("INV_Misc_GroupLooking", "player")
+MainPanel.menu_toggle_player:SetPoint("TOPLEFT", MainPanel.menu_toggle_item, "BOTTOMLEFT", -0, -8)
+
+MainPanel.menu_toggle_rep = CreateFilterMenuButton("INV_Scroll_05", "rep")
+MainPanel.menu_toggle_rep:SetPoint("TOPLEFT", MainPanel.menu_toggle_player, "BOTTOMLEFT", -0, -8)
+
+MainPanel.menu_toggle_misc = CreateFilterMenuButton("Trade_Engineering", "misc")
+MainPanel.menu_toggle_misc:SetPoint("TOPLEFT", MainPanel.menu_toggle_rep, "BOTTOMLEFT", -0, -8)
+
+-------------------------------------------------------------------------------
+-- Create MainPanel.filter_menu and set its scripts.
+-------------------------------------------------------------------------------
+MainPanel.filter_menu = CreateFrame("Frame", "ARL_FilterMenu", MainPanel)
+MainPanel.filter_menu:SetWidth(FILTERMENU_DOUBLE_WIDTH)
+MainPanel.filter_menu:SetHeight(FILTERMENU_HEIGHT)
+MainPanel.filter_menu:SetPoint("TOPLEFT", MainPanel, "TOPRIGHT", -6, -102)
+MainPanel.filter_menu:EnableMouse(true)
+MainPanel.filter_menu:EnableKeyboard(true)
+MainPanel.filter_menu:SetMovable(false)
+MainPanel.filter_menu:SetHitRectInsets(5, 5, 5, 5)
+MainPanel.filter_menu:Hide()
+
+-- Set all the current options in the filter menu to make sure they are consistent with the SV options.
+MainPanel.filter_menu:SetScript("OnShow",
+				function()
+					for filter, info in pairs(FilterValueMap) do
+						if info.svroot then
+							info.cb:SetChecked(info.svroot[filter])
+						end
+					end
+					-- Miscellaneous Options
+					ARL_IgnoreCB:SetChecked(addon.db.profile.ignoreexclusionlist)
+				end)
+
+MainPanel.filter_menu.texture = MainPanel.filter_menu:CreateTexture(nil, "ARTWORK")
+MainPanel.filter_menu.texture:SetTexture("Interface\\Addons\\AckisRecipeList\\img\\fly_2col")
+MainPanel.filter_menu.texture:SetAllPoints(MainPanel.filter_menu)
+MainPanel.filter_menu.texture:SetTexCoord(0, (FILTERMENU_DOUBLE_WIDTH/256), 0, (FILTERMENU_HEIGHT/512))
+
+-------------------------------------------------------------------------------
+-- Function to initialize a check-button with the given values. Used in all of
+-- the sub-menus of MainPanel.filter_menu
+-------------------------------------------------------------------------------
+local InitializeCheckButton
+do
+	local PUSHDOWN = {
+		["cloak"]	= true,
+		["necklace"]	= true,
+		["ring"]	= true,
+		["trinket"]	= true,
+		["shield"]	= true,
+	}
+	function InitializeCheckButton(cButton, anchorFrame, ttText, scriptVal, row, col, misc)
+		-- set the position of the new checkbox
+		local xPos = 2 + ((col - 1) * 100)
+		local yPos = -3 - ((row - 1) * 17)
+
+		if PUSHDOWN[scriptVal] then
+			yPos = yPos - 5
+		end
+		cButton:SetPoint("TOPLEFT", anchorFrame, "TOPLEFT", xPos, yPos)
+		cButton:SetHeight(24)
+		cButton:SetWidth(24)
+
+		cButton:SetNormalTexture("Interface\\Buttons\\UI-CheckBox-Up")
+		cButton:SetPushedTexture("Interface\\Buttons\\UI-CheckBox-Down")
+		cButton:SetHighlightTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
+		cButton:SetDisabledCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check-Disabled")
+		cButton:SetCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check")
+
+		cButton.text = cButton:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall")
+		cButton.text:SetPoint("LEFT", cButton, "RIGHT", 0, 0)
+
+		-- depending if we're on the misc panel or not, set an alternative OnClick method
+		if misc == 0 then
+			cButton:SetScript("OnClick",
+					  function()
+						  FilterValueMap[scriptVal].svroot[scriptVal] = FilterValueMap[scriptVal].cb:GetChecked() and true or false
+						  MainPanel:UpdateTitle()
+						  ReDisplay()
+					  end)
+		else
+			cButton:SetScript("OnClick",
+					  function()
+						  addon.db.profile.ignoreexclusionlist = not addon.db.profile.ignoreexclusionlist
+						  ReDisplay()
+					  end)
+		end
+		SetTooltipScripts(cButton, ttText, 1)
+	end
+end	-- do
+
+-------------------------------------------------------------------------------
+-- Create MainPanel.filter_menu.general, and set its scripts.
+-------------------------------------------------------------------------------
+MainPanel.filter_menu.general = CreateFrame("Frame", nil, MainPanel.filter_menu)
+MainPanel.filter_menu.general:SetWidth(FILTERMENU_SMALL)
+MainPanel.filter_menu.general:SetHeight(280)
+MainPanel.filter_menu.general:EnableMouse(true)
+MainPanel.filter_menu.general:EnableKeyboard(true)
+MainPanel.filter_menu.general:SetMovable(false)
+MainPanel.filter_menu.general:SetPoint("TOPLEFT", MainPanel.filter_menu, "TOPLEFT", 17, -16)
+MainPanel.filter_menu.general:Hide()
+
+-------------------------------------------------------------------------------
+-- Create the CheckButtons for MainPanel.filter_menu.general
+-------------------------------------------------------------------------------
+MainPanel.filter_menu.general.specialty = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
+InitializeCheckButton(MainPanel.filter_menu.general.specialty, MainPanel.filter_menu.general, L["SPECIALTY_DESC"], "specialty", 1, 1, 0)
+MainPanel.filter_menu.general.specialty.text:SetText(L["Specialties"])
+
+MainPanel.filter_menu.general.skill = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
+InitializeCheckButton(MainPanel.filter_menu.general.skill, MainPanel.filter_menu.general, L["SKILL_DESC"], "skill", 1, 2, 0)
+MainPanel.filter_menu.general.skill.text:SetText(_G.SKILL)
+
+MainPanel.filter_menu.general.faction = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
+InitializeCheckButton(MainPanel.filter_menu.general.faction, MainPanel.filter_menu.general, L["FACTION_DESC"], "faction", 2, 1, 0)
+MainPanel.filter_menu.general.faction.text:SetText(_G.FACTION)
+
+MainPanel.filter_menu.general.known = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
+InitializeCheckButton(MainPanel.filter_menu.general.known, MainPanel.filter_menu.general, L["KNOWN_DESC"], "known", 2, 2, 0)
+MainPanel.filter_menu.general.known.text:SetText(L["Show Known"])
+
+MainPanel.filter_menu.general.unknown = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
+InitializeCheckButton(MainPanel.filter_menu.general.unknown, MainPanel.filter_menu.general, L["UNKNOWN_DESC"], "unknown", 3, 1, 0)
+MainPanel.filter_menu.general.unknown.text:SetText(L["Show Unknown"])
+
+-------------------------------------------------------------------------------
+-- Create the Class toggle and CheckButtons for MainPanel.filter_menu.general
+-------------------------------------------------------------------------------
+MainPanel.filter_menu.general.class_toggle = GenericCreateButton(nil, MainPanel.filter_menu.general, 20, 105, "GameFontHighlight", "GameFontHighlightSmall",
+								 L["Classes"] .. ":", "LEFT", L["CLASS_TEXT_DESC"], 0)
+MainPanel.filter_menu.general.class_toggle:SetPoint("TOPLEFT", MainPanel.filter_menu.general.unknown, "BOTTOMLEFT", -4, -10)
+MainPanel.filter_menu.general.class_toggle:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
+MainPanel.filter_menu.general.class_toggle:RegisterForClicks("LeftButtonUp", "RightButtonUp")
+MainPanel.filter_menu.general.class_toggle:SetScript("OnClick",
+						     function(self, button)
+							     local classes = addon.db.profile.filters.classes
+							     local general = MainPanel.filter_menu.general
+							     local toggle = (button == "LeftButton") and true or false
+
+							     for class in pairs(classes) do
+								     classes[class] = toggle
+								     general[class]:SetChecked(toggle)
+							     end
+
+							     if toggle == false then
+								     local class = strlower(Player["Class"])
+								     classes[class] = true
+								     general[class]:SetChecked(true)
+							     end
+							     MainPanel:UpdateTitle()
+							     ReDisplay()
+						     end)
+
+MainPanel.filter_menu.general.deathknight = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
+InitializeCheckButton(MainPanel.filter_menu.general.deathknight, MainPanel.filter_menu.general, L["CLASS_DESC"], "deathknight", 6, 1, 0)
+MainPanel.filter_menu.general.deathknight.text:SetText(LOCALIZED_CLASS_NAMES_MALE["DEATHKNIGHT"])
+
+MainPanel.filter_menu.general.druid = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
+InitializeCheckButton(MainPanel.filter_menu.general.druid, MainPanel.filter_menu.general, L["CLASS_DESC"], "druid", 6, 2, 0)
+MainPanel.filter_menu.general.druid.text:SetText(LOCALIZED_CLASS_NAMES_MALE["DRUID"])
+
+MainPanel.filter_menu.general.hunter = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
+InitializeCheckButton(MainPanel.filter_menu.general.hunter, MainPanel.filter_menu.general, L["CLASS_DESC"], "hunter", 7, 1, 0)
+MainPanel.filter_menu.general.hunter.text:SetText(LOCALIZED_CLASS_NAMES_MALE["HUNTER"])
+
+MainPanel.filter_menu.general.mage = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
+InitializeCheckButton(MainPanel.filter_menu.general.mage, MainPanel.filter_menu.general, L["CLASS_DESC"], "mage", 7, 2, 0)
+MainPanel.filter_menu.general.mage.text:SetText(LOCALIZED_CLASS_NAMES_MALE["MAGE"])
+
+MainPanel.filter_menu.general.paladin = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
+InitializeCheckButton(MainPanel.filter_menu.general.paladin, MainPanel.filter_menu.general, L["CLASS_DESC"], "paladin", 8, 1, 0)
+MainPanel.filter_menu.general.paladin.text:SetText(LOCALIZED_CLASS_NAMES_MALE["PALADIN"])
+
+MainPanel.filter_menu.general.priest = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
+InitializeCheckButton(MainPanel.filter_menu.general.priest, MainPanel.filter_menu.general, L["CLASS_DESC"], "priest", 8, 2, 0)
+MainPanel.filter_menu.general.priest.text:SetText(LOCALIZED_CLASS_NAMES_MALE["PRIEST"])
+
+MainPanel.filter_menu.general.rogue = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
+InitializeCheckButton(MainPanel.filter_menu.general.rogue, MainPanel.filter_menu.general, L["CLASS_DESC"], "rogue", 9, 1, 0)
+MainPanel.filter_menu.general.rogue.text:SetText(LOCALIZED_CLASS_NAMES_MALE["ROGUE"])
+
+MainPanel.filter_menu.general.shaman = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
+InitializeCheckButton(MainPanel.filter_menu.general.shaman, MainPanel.filter_menu.general, L["CLASS_DESC"], "shaman", 9, 2, 0)
+MainPanel.filter_menu.general.shaman.text:SetText(LOCALIZED_CLASS_NAMES_MALE["SHAMAN"])
+
+MainPanel.filter_menu.general.warlock = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
+InitializeCheckButton(MainPanel.filter_menu.general.warlock, MainPanel.filter_menu.general, L["CLASS_DESC"], "warlock", 10, 1, 0)
+MainPanel.filter_menu.general.warlock.text:SetText(LOCALIZED_CLASS_NAMES_MALE["WARLOCK"])
+
+MainPanel.filter_menu.general.warrior = CreateFrame("CheckButton", nil, MainPanel.filter_menu.general)
+InitializeCheckButton(MainPanel.filter_menu.general.warrior, MainPanel.filter_menu.general, L["CLASS_DESC"], "warrior", 10, 2, 0)
+MainPanel.filter_menu.general.warrior.text:SetText(LOCALIZED_CLASS_NAMES_MALE["WARRIOR"])
+
+-------------------------------------------------------------------------------
+-- Create MainPanel.filter_menu.obtain, and set its scripts.
+-------------------------------------------------------------------------------
+MainPanel.filter_menu.obtain = CreateFrame("Frame", nil, MainPanel.filter_menu)
+MainPanel.filter_menu.obtain:SetWidth(FILTERMENU_SMALL)
+MainPanel.filter_menu.obtain:SetHeight(280)
+MainPanel.filter_menu.obtain:EnableMouse(true)
+MainPanel.filter_menu.obtain:EnableKeyboard(true)
+MainPanel.filter_menu.obtain:SetMovable(false)
+MainPanel.filter_menu.obtain:SetPoint("TOPLEFT", MainPanel.filter_menu, "TOPLEFT", 17, -16)
+MainPanel.filter_menu.obtain:Hide()
+
+-------------------------------------------------------------------------------
+-- Create the CheckButtons for MainPanel.filter_menu.obtain
+-------------------------------------------------------------------------------
+MainPanel.filter_menu.obtain.instance = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
+InitializeCheckButton(MainPanel.filter_menu.obtain.instance, MainPanel.filter_menu.obtain, L["INSTANCE_DESC"], "instance", 1, 1, 0)
+MainPanel.filter_menu.obtain.instance.text:SetText(_G.INSTANCE)
+
+MainPanel.filter_menu.obtain.raid = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
+InitializeCheckButton(MainPanel.filter_menu.obtain.raid, MainPanel.filter_menu.obtain, L["RAID_DESC"], "raid", 1, 2, 0)
+MainPanel.filter_menu.obtain.raid.text:SetText(_G.RAID)
+
+MainPanel.filter_menu.obtain.quest = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
+InitializeCheckButton(MainPanel.filter_menu.obtain.quest, MainPanel.filter_menu.obtain, L["QUEST_DESC"], "quest", 2, 1, 0)
+MainPanel.filter_menu.obtain.quest.text:SetText(L["Quest"])
+
+MainPanel.filter_menu.obtain.seasonal = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
+InitializeCheckButton(MainPanel.filter_menu.obtain.seasonal, MainPanel.filter_menu.obtain, L["SEASONAL_DESC"], "seasonal", 2, 2, 0)
+MainPanel.filter_menu.obtain.seasonal.text:SetText(SEASONAL_CATEGORY)
+
+MainPanel.filter_menu.obtain.trainer = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
+InitializeCheckButton(MainPanel.filter_menu.obtain.trainer, MainPanel.filter_menu.obtain, L["TRAINER_DESC"], "trainer", 3, 1, 0)
+MainPanel.filter_menu.obtain.trainer.text:SetText(L["Trainer"])
+
+MainPanel.filter_menu.obtain.vendor = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
+InitializeCheckButton(MainPanel.filter_menu.obtain.vendor, MainPanel.filter_menu.obtain, L["VENDOR_DESC"], "vendor", 3, 2, 0)
+MainPanel.filter_menu.obtain.vendor.text:SetText(L["Vendor"])
+
+MainPanel.filter_menu.obtain.pvp = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
+InitializeCheckButton(MainPanel.filter_menu.obtain.pvp, MainPanel.filter_menu.obtain, L["PVP_DESC"], "pvp", 4, 1, 0)
+MainPanel.filter_menu.obtain.pvp.text:SetText(_G.PVP)
+
+MainPanel.filter_menu.obtain.discovery = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
+InitializeCheckButton(MainPanel.filter_menu.obtain.discovery, MainPanel.filter_menu.obtain, L["DISCOVERY_DESC"], "discovery", 4, 2, 0)
+MainPanel.filter_menu.obtain.discovery.text:SetText(L["Discovery"])
+
+MainPanel.filter_menu.obtain.worlddrop = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
+InitializeCheckButton(MainPanel.filter_menu.obtain.worlddrop, MainPanel.filter_menu.obtain, L["WORLD_DROP_DESC"], "worlddrop", 5, 1, 0)
+MainPanel.filter_menu.obtain.worlddrop.text:SetText(L["World Drop"])
+
+MainPanel.filter_menu.obtain.mobdrop = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
+InitializeCheckButton(MainPanel.filter_menu.obtain.mobdrop, MainPanel.filter_menu.obtain, L["MOB_DROP_DESC"], "mobdrop", 5, 2, 0)
+MainPanel.filter_menu.obtain.mobdrop.text:SetText(L["Mob Drop"])
+
+MainPanel.filter_menu.obtain.originalwow = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
+InitializeCheckButton(MainPanel.filter_menu.obtain.originalwow, MainPanel.filter_menu.obtain, L["ORIGINAL_WOW_DESC"], "originalwow", 7, 1, 0)
+MainPanel.filter_menu.obtain.originalwow.text:SetText(_G.EXPANSION_NAME0)
+
+MainPanel.filter_menu.obtain.bc = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
+InitializeCheckButton(MainPanel.filter_menu.obtain.bc, MainPanel.filter_menu.obtain, L["BC_WOW_DESC"], "bc", 8, 1, 0)
+MainPanel.filter_menu.obtain.bc.text:SetText(_G.EXPANSION_NAME1)
+
+MainPanel.filter_menu.obtain.wrath = CreateFrame("CheckButton", nil, MainPanel.filter_menu.obtain)
+InitializeCheckButton(MainPanel.filter_menu.obtain.wrath, MainPanel.filter_menu.obtain, L["LK_WOW_DESC"], "wrath", 9, 1, 0)
+MainPanel.filter_menu.obtain.wrath.text:SetText(_G.EXPANSION_NAME2)
+
+-------------------------------------------------------------------------------
+-- Create MainPanel.filter_menu.binding, and set its scripts.
+-------------------------------------------------------------------------------
+MainPanel.filter_menu.binding = CreateFrame("Frame", nil, MainPanel.filter_menu)
+MainPanel.filter_menu.binding:SetWidth(FILTERMENU_LARGE)
+MainPanel.filter_menu.binding:SetHeight(280)
+MainPanel.filter_menu.binding:EnableMouse(true)
+MainPanel.filter_menu.binding:EnableKeyboard(true)
+MainPanel.filter_menu.binding:SetMovable(false)
+MainPanel.filter_menu.binding:SetPoint("TOPLEFT", MainPanel.filter_menu, "TOPLEFT", 17, -16)
+MainPanel.filter_menu.binding:Hide()
+
+-------------------------------------------------------------------------------
+-- Create the CheckButtons for MainPanel.filter_menu.binding
+-------------------------------------------------------------------------------
+MainPanel.filter_menu.binding.itemboe = CreateFrame("CheckButton", nil, MainPanel.filter_menu.binding)
+InitializeCheckButton(MainPanel.filter_menu.binding.itemboe, MainPanel.filter_menu.binding, L["BOE_DESC"], "itemboe", 1, 1, 0)
+MainPanel.filter_menu.binding.itemboe.text:SetText(L["BOEFilter"])
+
+MainPanel.filter_menu.binding.itembop = CreateFrame("CheckButton", nil, MainPanel.filter_menu.binding)
+InitializeCheckButton(MainPanel.filter_menu.binding.itembop, MainPanel.filter_menu.binding, L["BOP_DESC"], "itembop", 2, 1, 0)
+MainPanel.filter_menu.binding.itembop.text:SetText(L["BOPFilter"])
+
+MainPanel.filter_menu.binding.recipeboe = CreateFrame("CheckButton", nil, MainPanel.filter_menu.binding)
+InitializeCheckButton(MainPanel.filter_menu.binding.recipeboe, MainPanel.filter_menu.binding, L["RECIPE_BOE_DESC"], "recipeboe", 3, 1, 0)
+MainPanel.filter_menu.binding.recipeboe.text:SetText(L["RecipeBOEFilter"])
+
+MainPanel.filter_menu.binding.recipebop = CreateFrame("CheckButton", nil, MainPanel.filter_menu.binding)
+InitializeCheckButton(MainPanel.filter_menu.binding.recipebop, MainPanel.filter_menu.binding, L["RECIPE_BOP_DESC"], "recipebop", 4, 1, 0)
+MainPanel.filter_menu.binding.recipebop.text:SetText(L["RecipeBOPFilter"])
+
+-------------------------------------------------------------------------------
+-- Create MainPanel.filter_menu.item, and set its scripts.
+-------------------------------------------------------------------------------
+MainPanel.filter_menu.item = CreateFrame("Frame", nil, MainPanel.filter_menu)
+MainPanel.filter_menu.item:SetWidth(FILTERMENU_LARGE)
+MainPanel.filter_menu.item:SetHeight(280)
+MainPanel.filter_menu.item:EnableMouse(true)
+MainPanel.filter_menu.item:EnableKeyboard(true)
+MainPanel.filter_menu.item:SetMovable(false)
+MainPanel.filter_menu.item:SetPoint("TOPLEFT", MainPanel.filter_menu, "TOPLEFT", 17, -16)
+MainPanel.filter_menu.item:Hide()
+
+-------------------------------------------------------------------------------
+-- Create the Armor toggle and CheckButtons for MainPanel.filter_menu.item
+-------------------------------------------------------------------------------
+MainPanel.filter_menu.item.armor_toggle = GenericCreateButton(nil, MainPanel.filter_menu.item, 20, 105, "GameFontHighlight", "GameFontHighlightSmall", _G.ARMOR_COLON,
+							      "LEFT", L["ARMOR_TEXT_DESC"], 0)
+MainPanel.filter_menu.item.armor_toggle:SetPoint("TOPLEFT", MainPanel.filter_menu.item, "TOPLEFT", -2, -4)
+MainPanel.filter_menu.item.armor_toggle:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
+MainPanel.filter_menu.item.armor_toggle:RegisterForClicks("LeftButtonUp", "RightButtonUp")
+MainPanel.filter_menu.item.armor_toggle:SetScript("OnClick",
+						  function(self, button)
+							  local armors = addon.db.profile.filters.item.armor
+							  local items = MainPanel.filter_menu.item
+							  local toggle = (button == "LeftButton") and true or false
+
+							  for armor in pairs(armors) do
+								  armors[armor] = toggle
+								  items[armor]:SetChecked(toggle)
+							  end
+							  MainPanel:UpdateTitle()
+							  ReDisplay()
+						  end)
+
+MainPanel.filter_menu.item.cloth = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.cloth, MainPanel.filter_menu.item, L["CLOTH_DESC"], "cloth", 2, 1, 0)
+MainPanel.filter_menu.item.cloth.text:SetText(L["Cloth"])
+
+MainPanel.filter_menu.item.leather = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.leather, MainPanel.filter_menu.item, L["LEATHER_DESC"], "leather", 2, 2, 0)
+MainPanel.filter_menu.item.leather.text:SetText(L["Leather"])
+
+MainPanel.filter_menu.item.mail = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.mail, MainPanel.filter_menu.item, L["MAIL_DESC"], "mail", 3, 1, 0)
+MainPanel.filter_menu.item.mail.text:SetText(L["Mail"])
+
+MainPanel.filter_menu.item.plate = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.plate, MainPanel.filter_menu.item, L["PLATE_DESC"], "plate", 3, 2, 0)
+MainPanel.filter_menu.item.plate.text:SetText(L["Plate"])
+
+MainPanel.filter_menu.item.cloak = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.cloak, MainPanel.filter_menu.item, L["CLOAK_DESC"], "cloak", 4, 1, 0)
+MainPanel.filter_menu.item.cloak.text:SetText(L["Cloak"])
+
+MainPanel.filter_menu.item.necklace = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.necklace, MainPanel.filter_menu.item, L["NECKLACE_DESC"], "necklace", 4, 2, 0)
+MainPanel.filter_menu.item.necklace.text:SetText(L["Necklace"])
+
+MainPanel.filter_menu.item.ring = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.ring, MainPanel.filter_menu.item, L["RING_DESC"], "ring", 5, 1, 0)
+MainPanel.filter_menu.item.ring.text:SetText(L["Ring"])
+
+MainPanel.filter_menu.item.trinket = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.trinket, MainPanel.filter_menu.item, L["TRINKET_DESC"], "trinket", 5, 2, 0)
+MainPanel.filter_menu.item.trinket.text:SetText(L["Trinket"])
+
+MainPanel.filter_menu.item.shield = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.shield, MainPanel.filter_menu.item, L["SHIELD_DESC"], "shield", 6, 1, 0)
+MainPanel.filter_menu.item.shield.text:SetText(L["Shield"])
+
+-------------------------------------------------------------------------------
+-- Create the Weapon toggle and CheckButtons for MainPanel.filter_menu.item
+-------------------------------------------------------------------------------
+MainPanel.filter_menu.item.weapon_toggle = GenericCreateButton(nil, MainPanel.filter_menu.item, 20, 105, "GameFontHighlight", "GameFontHighlightSmall", L["Weapon"] .. ":",
+							       "LEFT", L["WEAPON_TEXT_DESC"], 0)
+MainPanel.filter_menu.item.weapon_toggle:SetPoint("TOPLEFT", MainPanel.filter_menu.item, "TOPLEFT", -2, -122)
+
+MainPanel.filter_menu.item.weapon_toggle:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
+MainPanel.filter_menu.item.weapon_toggle:RegisterForClicks("LeftButtonUp", "RightButtonUp")
+MainPanel.filter_menu.item.weapon_toggle:SetScript("OnClick",
+						   function(self, button)
+							   local weapons = addon.db.profile.filters.item.weapon
+							   local items = MainPanel.filter_menu.item
+							   local toggle = (button == "LeftButton") and true or false
+
+							   for weapon in pairs(weapons) do
+								   weapons[weapon] = toggle
+
+								   if FilterValueMap[weapon].svroot then
+									   items[weapon]:SetChecked(toggle)
+								   end
+							   end
+							   MainPanel:UpdateTitle()
+							   ReDisplay()
+						   end)
+
+MainPanel.filter_menu.item.onehand = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.onehand, MainPanel.filter_menu.item, L["ONEHAND_DESC"], "onehand", 9, 1, 0)
+MainPanel.filter_menu.item.onehand.text:SetText(L["One Hand"])
+
+MainPanel.filter_menu.item.twohand = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.twohand, MainPanel.filter_menu.item, L["TWOHAND_DESC"], "twohand", 9, 2, 0)
+MainPanel.filter_menu.item.twohand.text:SetText(L["Two Hand"])
+
+MainPanel.filter_menu.item.dagger = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.dagger, MainPanel.filter_menu.item, L["DAGGER_DESC"], "dagger", 10, 1, 0)
+MainPanel.filter_menu.item.dagger.text:SetText(L["Dagger"])
+
+MainPanel.filter_menu.item.axe = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.axe, MainPanel.filter_menu.item, L["AXE_DESC"], "axe", 10, 2, 0)
+MainPanel.filter_menu.item.axe.text:SetText(L["Axe"])
+
+MainPanel.filter_menu.item.mace = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.mace, MainPanel.filter_menu.item, L["MACE_DESC"], "mace", 11, 1, 0)
+MainPanel.filter_menu.item.mace.text:SetText(L["Mace"])
+
+MainPanel.filter_menu.item.sword = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.sword, MainPanel.filter_menu.item, L["SWORD_DESC"], "sword", 11, 2, 0)
+MainPanel.filter_menu.item.sword.text:SetText(L["Sword"])
+
+MainPanel.filter_menu.item.polearm = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.polearm, MainPanel.filter_menu.item, L["POLEARM_DESC"], "polearm", 12, 1, 0)
+MainPanel.filter_menu.item.polearm.text:SetText(L["Polearm"])
+
+MainPanel.filter_menu.item.fist = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.fist, MainPanel.filter_menu.item, L["FIST_DESC"], "fist", 12, 2, 0)
+MainPanel.filter_menu.item.fist.text:SetText(L["Fist"])
+
+MainPanel.filter_menu.item.staff = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.staff, MainPanel.filter_menu.item, L["STAFF_DESC"], "staff", 13, 1, 0)
+MainPanel.filter_menu.item.staff.text:SetText(addon:Grey(L["Staff"]))
+MainPanel.filter_menu.item.staff:Disable()
+
+MainPanel.filter_menu.item.wand = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.wand, MainPanel.filter_menu.item, L["WAND_DESC"], "wand", 13, 2, 0)
+MainPanel.filter_menu.item.wand.text:SetText(L["Wand"])
+
+MainPanel.filter_menu.item.thrown = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.thrown, MainPanel.filter_menu.item, L["THROWN_DESC"], "thrown", 14, 1, 0)
+MainPanel.filter_menu.item.thrown.text:SetText(L["Thrown"])
+
+MainPanel.filter_menu.item.bow = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.bow, MainPanel.filter_menu.item, L["BOW_DESC"], "bow", 14, 2, 0)
+MainPanel.filter_menu.item.bow.text:SetText(addon:Grey(L["Bow"]))
+MainPanel.filter_menu.item.bow:Disable()
+
+MainPanel.filter_menu.item.crossbow = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.crossbow, MainPanel.filter_menu.item, L["CROSSBOW_DESC"], "crossbow", 15, 1, 0)
+MainPanel.filter_menu.item.crossbow.text:SetText(addon:Grey(L["Crossbow"]))
+MainPanel.filter_menu.item.crossbow:Disable()
+
+MainPanel.filter_menu.item.ammo = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.ammo, MainPanel.filter_menu.item, L["AMMO_DESC"], "ammo", 15, 2, 0)
+MainPanel.filter_menu.item.ammo.text:SetText(L["Ammo"])
+
+MainPanel.filter_menu.item.gun = CreateFrame("CheckButton", nil, MainPanel.filter_menu.item)
+InitializeCheckButton(MainPanel.filter_menu.item.gun, MainPanel.filter_menu.item, L["GUN_DESC"], "gun", 16, 1, 0)
+MainPanel.filter_menu.item.gun.text:SetText(L["Gun"])
+
+-------------------------------------------------------------------------------
+-- Create MainPanel.filter_menu.player, and set its scripts.
+-------------------------------------------------------------------------------
+MainPanel.filter_menu.player = CreateFrame("Frame", nil, MainPanel.filter_menu)
+MainPanel.filter_menu.player:SetWidth(FILTERMENU_SMALL)
+MainPanel.filter_menu.player:SetHeight(280)
+MainPanel.filter_menu.player:EnableMouse(true)
+MainPanel.filter_menu.player:EnableKeyboard(true)
+MainPanel.filter_menu.player:SetMovable(false)
+MainPanel.filter_menu.player:SetPoint("TOPLEFT", MainPanel.filter_menu, "TOPLEFT", 17, -16)
+MainPanel.filter_menu.player:Hide()
+
+-------------------------------------------------------------------------------
+-- Create the CheckButtons for MainPanel.filter_menu.player
+-------------------------------------------------------------------------------
+MainPanel.filter_menu.player.tank = CreateFrame("CheckButton", nil, MainPanel.filter_menu.player)
+InitializeCheckButton(MainPanel.filter_menu.player.tank, MainPanel.filter_menu.player, L["TANKS_DESC"], "tank", 1, 1, 0)
+MainPanel.filter_menu.player.tank.text:SetText(_G.TANK)
+
+MainPanel.filter_menu.player.melee = CreateFrame("CheckButton", nil, MainPanel.filter_menu.player)
+InitializeCheckButton(MainPanel.filter_menu.player.melee, MainPanel.filter_menu.player, L["MELEE_DPS_DESC"], "melee", 2, 1, 0)
+MainPanel.filter_menu.player.melee.text:SetText(_G.MELEE)
+
+MainPanel.filter_menu.player.healer = CreateFrame("CheckButton", nil, MainPanel.filter_menu.player)
+InitializeCheckButton(MainPanel.filter_menu.player.healer, MainPanel.filter_menu.player, L["HEALERS_DESC"], "healer", 3, 1, 0)
+MainPanel.filter_menu.player.healer.text:SetText(_G.HEALER)
+
+MainPanel.filter_menu.player.caster = CreateFrame("CheckButton", nil, MainPanel.filter_menu.player)
+InitializeCheckButton(MainPanel.filter_menu.player.caster, MainPanel.filter_menu.player, L["CASTER_DPS_DESC"], "caster", 4, 1, 0)
+MainPanel.filter_menu.player.caster.text:SetText(_G.DAMAGER)
+
+-------------------------------------------------------------------------------
+-- Create MainPanel.filter_menu.rep, and set its scripts.
+-------------------------------------------------------------------------------
+MainPanel.filter_menu.rep = CreateFrame("Frame", nil, MainPanel.filter_menu)
+MainPanel.filter_menu.rep:SetWidth(FILTERMENU_SMALL)
+MainPanel.filter_menu.rep:SetHeight(280)
+MainPanel.filter_menu.rep:EnableMouse(true)
+MainPanel.filter_menu.rep:EnableKeyboard(true)
+MainPanel.filter_menu.rep:SetMovable(false)
+MainPanel.filter_menu.rep:SetPoint("TOPLEFT", MainPanel.filter_menu, "TOPLEFT", 17, -16)
+MainPanel.filter_menu.rep:Hide()
+
+-------------------------------------------------------------------------------
+-- Create the expansion toggles for MainPanel.filter_menu.rep
+-------------------------------------------------------------------------------
+do
+	-------------------------------------------------------------------------------
+	-- Generic function to create expansion buttons in MainPanel.filter_menu.rep
+	-------------------------------------------------------------------------------
+	local function CreateExpansionButton(texture, tooltip_text)
+		local cButton = CreateFrame("CheckButton", nil, MainPanel.filter_menu.rep)
+		cButton:SetWidth(100)
+		cButton:SetHeight(46)
+		cButton:SetChecked(false)
+
+		local iconTex = cButton:CreateTexture(nil, "BORDER")
+
+		if texture == "wotlk_logo" then
+			iconTex:SetTexture("Interface\\Addons\\AckisRecipeList\\img\\" .. texture)
+		else
+			iconTex:SetTexture('Interface/Glues/Common/' .. texture)
+		end
+		iconTex:SetWidth(100)
+		iconTex:SetHeight(46)
+		iconTex:SetAllPoints(cButton)
+
+		local pushedTexture = cButton:CreateTexture(nil, "ARTWORK")
+		pushedTexture:SetTexture('Interface/Buttons/UI-Quickslot-Depress')
+		pushedTexture:SetAllPoints(cButton)
+		cButton:SetPushedTexture(pushedTexture)
+
+		local highlightTexture = cButton:CreateTexture()
+		highlightTexture:SetTexture('Interface/Buttons/ButtonHilight-Square')
+		highlightTexture:SetAllPoints(cButton)
+		highlightTexture:SetBlendMode('ADD')
+		cButton:SetHighlightTexture(highlightTexture)
+
+		local checkedTexture = cButton:CreateTexture()
+		checkedTexture:SetTexture('Interface/Buttons/CheckButtonHilight')
+		checkedTexture:SetAllPoints(cButton)
+		checkedTexture:SetBlendMode('ADD')
+		cButton:SetCheckedTexture(checkedTexture)
+
+		-- And throw up a tooltip
+		SetTooltipScripts(cButton, tooltip_text)
+
+		return cButton
+	end
+
+	-------------------------------------------------------------------------------
+	-- Rep Filtering panel switcher
+	-------------------------------------------------------------------------------
+	local function RepFilterSwitch(whichrep)
+		-- 1	MainPanel.filter_menu.rep.toggle_originalwow		Classic Rep
+		-- 2	MainPanel.filter_menu.rep.toggle_bc			Burning Crusade
+		-- 3	MainPanel.filter_menu.rep.toggle_wrath			Wrath of the Lich King
+		local ShowPanel = false
+
+		if whichrep == 1 then
+			if MainPanel.filter_menu.rep.toggle_originalwow:GetChecked() then
+				ShowPanel = true
+				MainPanel.filter_menu.rep.Classic:Show()
+				MainPanel.filter_menu.rep.BC:Hide()
+				MainPanel.filter_menu.rep.LK:Hide()
+				MainPanel.filter_menu.rep.toggle_bc:SetChecked(false)
+				MainPanel.filter_menu.rep.toggle_wrath:SetChecked(false)
+			else
+				ShowPanel = false
+			end
+		elseif whichrep == 2 then
+			if MainPanel.filter_menu.rep.toggle_bc:GetChecked() then
+				ShowPanel = true
+				MainPanel.filter_menu.rep.Classic:Hide()
+				MainPanel.filter_menu.rep.BC:Show()
+				MainPanel.filter_menu.rep.LK:Hide()
+				MainPanel.filter_menu.rep.toggle_originalwow:SetChecked(false)
+				MainPanel.filter_menu.rep.toggle_wrath:SetChecked(false)
+			else
+				ShowPanel = false
+			end
+		else -- whichrep == 3 (WotLK)
+			if MainPanel.filter_menu.rep.toggle_wrath:GetChecked() then
+				ShowPanel = true
+				MainPanel.filter_menu.rep.Classic:Hide()
+				MainPanel.filter_menu.rep.BC:Hide()
+				MainPanel.filter_menu.rep.LK:Show()
+				MainPanel.filter_menu.rep.toggle_originalwow:SetChecked(false)
+				MainPanel.filter_menu.rep.toggle_bc:SetChecked(false)
+			else
+				ShowPanel = false
+			end
+		end
+		local texture = MainPanel.filter_menu.texture
+		texture:ClearAllPoints()
+
+		if ShowPanel then
+			MainPanel.filter_menu:SetWidth(FILTERMENU_DOUBLE_WIDTH)
+
+			texture:SetTexture([[Interface\Addons\AckisRecipeList\img\fly_repcol]])
+			texture:SetAllPoints(MainPanel.filter_menu)
+			texture:SetTexCoord(0, (FILTERMENU_DOUBLE_WIDTH/512), 0, (FILTERMENU_HEIGHT/512))
+
+			MainPanel.filter_menu.rep.Classic:SetPoint("TOPRIGHT", MainPanel.filter_menu, "TOPRIGHT", -7, -14)
+			MainPanel.filter_menu.rep.BC:SetPoint("TOPRIGHT", MainPanel.filter_menu, "TOPRIGHT", -7, -14)
+			MainPanel.filter_menu.rep.LK:SetPoint("TOPRIGHT", MainPanel.filter_menu, "TOPRIGHT", -7, -14)
+		else
+			MainPanel.filter_menu:SetWidth(FILTERMENU_SINGLE_WIDTH)
+
+			texture:SetTexture([[Interface\Addons\AckisRecipeList\img\fly_1col]])
+			texture:SetAllPoints(MainPanel.filter_menu)
+			texture:SetTexCoord(0, (FILTERMENU_SINGLE_WIDTH/256), 0, (FILTERMENU_HEIGHT/512))
+
+			MainPanel.filter_menu.rep.Classic:Hide()
+			MainPanel.filter_menu.rep.BC:Hide()
+			MainPanel.filter_menu.rep.LK:Hide()
+
+			MainPanel.filter_menu.rep.toggle_originalwow:SetChecked(false)
+			MainPanel.filter_menu.rep.toggle_bc:SetChecked(false)
+			MainPanel.filter_menu.rep.toggle_wrath:SetChecked(false)
+		end
+	end
+	MainPanel.filter_menu.rep.toggle_originalwow = CreateExpansionButton("Glues-WoW-Logo", L["FILTERING_OLDWORLD_DESC"])
+	MainPanel.filter_menu.rep.toggle_originalwow:SetPoint("TOPLEFT", MainPanel.filter_menu.rep, "TOPLEFT", 0, -10)
+	MainPanel.filter_menu.rep.toggle_originalwow:SetScript("OnClick",
+				    function()
+					    RepFilterSwitch(1)
+				    end)
+
+	MainPanel.filter_menu.rep.toggle_bc = CreateExpansionButton("GLUES-WOW-BCLOGO", L["FILTERING_BC_DESC"])
+	MainPanel.filter_menu.rep.toggle_bc:SetPoint("TOPLEFT", MainPanel.filter_menu.rep, "TOPLEFT", 0, -60)
+	MainPanel.filter_menu.rep.toggle_bc:SetScript("OnClick",
+						      function()
+							      RepFilterSwitch(2)
+						      end)
+
+	MainPanel.filter_menu.rep.toggle_wrath = CreateExpansionButton("wotlk_logo", L["FILTERING_WOTLK_DESC"])
+	MainPanel.filter_menu.rep.toggle_wrath:SetPoint("TOPLEFT", MainPanel.filter_menu.rep, "TOPLEFT", 0, -110)
+	MainPanel.filter_menu.rep.toggle_wrath:SetScript("OnClick",
+							 function()
+								 RepFilterSwitch(3)
+							 end)
+end	-- do
+
+-------------------------------------------------------------------------------
+-- Create MainPanel.filter_menu.rep.Classic, and set its scripts.
+-------------------------------------------------------------------------------
+MainPanel.filter_menu.rep.Classic = CreateFrame("Frame", nil, MainPanel.filter_menu.rep)
+MainPanel.filter_menu.rep.Classic:SetWidth(150)
+MainPanel.filter_menu.rep.Classic:SetHeight(280)
+MainPanel.filter_menu.rep.Classic:EnableMouse(true)
+MainPanel.filter_menu.rep.Classic:EnableKeyboard(true)
+MainPanel.filter_menu.rep.Classic:SetMovable(false)
+MainPanel.filter_menu.rep.Classic:SetPoint("TOPRIGHT", MainPanel.filter_menu, "TOPRIGHT", -7, -16)
+MainPanel.filter_menu.rep.Classic:Hide()
+
+-------------------------------------------------------------------------------
+-- Create MainPanel.filter_menu.rep.BC, and set its scripts.
+-------------------------------------------------------------------------------
+MainPanel.filter_menu.rep.BC = CreateFrame("Frame", nil, MainPanel.filter_menu.rep)
+MainPanel.filter_menu.rep.BC:SetWidth(150)
+MainPanel.filter_menu.rep.BC:SetHeight(280)
+MainPanel.filter_menu.rep.BC:EnableMouse(true)
+MainPanel.filter_menu.rep.BC:EnableKeyboard(true)
+MainPanel.filter_menu.rep.BC:SetMovable(false)
+MainPanel.filter_menu.rep.BC:SetPoint("TOPRIGHT", MainPanel.filter_menu, "TOPRIGHT", -7, -16)
+MainPanel.filter_menu.rep.BC:Hide()
+
+-------------------------------------------------------------------------------
+-- Create MainPanel.filter_menu.rep.LK, and set its scripts.
+-------------------------------------------------------------------------------
+MainPanel.filter_menu.rep.LK = CreateFrame("Frame", nil, MainPanel.filter_menu.rep)
+MainPanel.filter_menu.rep.LK:SetWidth(150)
+MainPanel.filter_menu.rep.LK:SetHeight(280)
+MainPanel.filter_menu.rep.LK:EnableMouse(true)
+MainPanel.filter_menu.rep.LK:EnableKeyboard(true)
+MainPanel.filter_menu.rep.LK:SetMovable(false)
+MainPanel.filter_menu.rep.LK:SetPoint("TOPRIGHT", MainPanel.filter_menu, "TOPRIGHT", -7, -16)
+MainPanel.filter_menu.rep.LK:Hide()
+
+
+-------------------------------------------------------------------------------
+-- Create MainPanel.scrollframe and set its scripts.
+-------------------------------------------------------------------------------
+MainPanel.scroll_frame = CreateFrame("ScrollFrame", "ARL_MainPanelScrollFrame", MainPanel, "FauxScrollFrameTemplate")
+MainPanel.scroll_frame:SetHeight(322)
+MainPanel.scroll_frame:SetWidth(243)
+MainPanel.scroll_frame:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 20, -97)
+MainPanel.scroll_frame:SetScript("OnVerticalScroll",
+				 function(self, arg1)
+					 self.scrolling = true
+					 FauxScrollFrame_OnVerticalScroll(self, arg1, 16, self.Update)
+					 self.scrolling = nil
+				 end)
+
+MainPanel.scroll_frame.entries = {}
+MainPanel.scroll_frame.state_buttons = {}
+MainPanel.scroll_frame.recipe_buttons = {}
+
+do
+	local highlight = CreateFrame("Frame", nil, UIParent)
+	highlight:SetFrameStrata("TOOLTIP")
+	highlight:Hide()
+
+	highlight._texture = highlight:CreateTexture(nil, "OVERLAY")
+	highlight._texture:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
+	highlight._texture:SetBlendMode("ADD")
+	highlight._texture:SetAllPoints(highlight)
+
+	local function Button_OnEnter(self)
+		GenerateTooltipContent(self, MainPanel.scroll_frame.entries[self.string_index].recipe_id)
+	end
+
+	local function Button_OnLeave()
+		QTip:Release(acquire_tip)
+		spell_tip:Hide()
+	end
+
+	local function Bar_OnEnter(self)
+		highlight:SetParent(self)
+		highlight:SetAllPoints(self)
+		highlight:Show()
+		GenerateTooltipContent(self, MainPanel.scroll_frame.entries[self.string_index].recipe_id)
+	end
+
+	local function Bar_OnLeave()
+		highlight:Hide()
+		highlight:ClearAllPoints()
+		highlight:SetParent(nil)
+		QTip:Release(acquire_tip)
+		spell_tip:Hide()
+	end
+
+	-------------------------------------------------------------------------------
+	-- Colours a skill level based on whether or not the player has a high enough
+	-- skill level or faction to learn it.
+	-------------------------------------------------------------------------------
+	local function ColourSkillLevel(recipeEntry, hasFaction, recipe_text)
+		local skill_level = Player["ProfessionLevel"]
+		local recipe_level = recipeEntry["Level"]
+		local recipeOrange = recipeEntry["Orange"]
+		local recipeYellow = recipeEntry["Yellow"]
+		local recipeGreen = recipeEntry["Green"]
+		local recipeGrey = recipeEntry["Grey"]
+
+		if recipe_level > skill_level or not hasFaction then
+			return addon:Red(recipe_text)
+		elseif skill_level >= recipeGrey then
+			return addon:MidGrey(recipe_text)
+		elseif skill_level >= recipeGreen then
+			return addon:Green(recipe_text)
+		elseif skill_level >= recipeYellow then
+			return addon:Yellow(recipe_text)
+		elseif skill_level >= recipeOrange then
+			return addon:Orange(recipe_text)
+		else
+			--@alpha@
+			addon:Print("DEBUG: ColourSkillLevel fallback: " .. recipe_text)
+			--@end-alpha@
+			return addon:MidGrey(recipe_text)
+		end
+	end
+
+	function MainPanel.scroll_frame:Update(expand_acquires, refresh)
+		local sorted_recipes = addon.sorted_recipes
+		local recipe_list = addon.recipe_list
+		local exclusions = addon.db.profile.exclusionlist
+		local sort_type = addon.db.profile.sorting
+		local skill_sort = (sort_type == "SkillAsc" or sort_type == "SkillDesc")
+		local insert_index = 1
+
+		-- If not refreshing an existing list and not scrolling up/down, wipe and re-initialize the entries.
+		if not refresh and not self.scrolling then
+			for i = 1, #self.entries do
+				ReleaseTable(self.entries[i])
+			end
+			twipe(self.entries)
+
+			for i = 1, #sorted_recipes do
+				local recipe_index = sorted_recipes[i]
+				local recipe_entry = recipe_list[recipe_index]
+
+				if recipe_entry["Display"] and recipe_entry["Search"] then
+					local recipe_string = recipe_entry["Name"]
+
+					if exclusions[recipe_index] then
+						recipe_string = "** " .. recipe_string .. " **"
+					end
+					local recipe_level = recipe_entry["Level"]
+
+					recipe_string = skill_sort and ("[" .. recipe_level .. "] - " .. recipe_string) or (recipe_string .. " - [" .. recipe_level .. "]")
+
+					local t = AcquireTable()
+					t.text = ColourSkillLevel(recipe_entry, Player:HasProperRepLevel(recipe_index), recipe_string)
+
+					t.recipe_id = recipe_index
+					t.is_header = true
+
+					if expand_acquires and recipe_entry["Acquire"] then
+						-- we have acquire information for this. push the title entry into the strings
+						-- and start processing the acquires
+						t.is_expanded = true
+						tinsert(self.entries, insert_index, t)
+						insert_index = self:ExpandEntry(insert_index)
+					else
+						t.is_expanded = false
+						tinsert(self.entries, insert_index, t)
+						insert_index = insert_index + 1
+					end
+				end
+			end
+		end
+
+		-- Reset the current buttons/lines
+		for i = 1, NUM_RECIPE_LINES do
+			local recipe = self.recipe_buttons[i]
+			local state = self.state_buttons[i]
+
+			recipe.string_index = 0
+			recipe:SetText("")
+			recipe:SetScript("OnEnter", nil)
+			recipe:SetScript("OnLeave", nil)
+
+			state.string_index = 0
+			state:Hide()
+			state:SetScript("OnEnter", nil)
+			state:SetScript("OnLeave", nil)
+		end
+		local num_entries = #self.entries
+		local display_lines = NUM_RECIPE_LINES
+
+		if num_entries < display_lines then
+			display_lines = num_entries / 2
+		end
+		FauxScrollFrame_Update(self, num_entries, display_lines, 16)
+		addon:ClosePopups()
+
+		if num_entries > 0 then
+			ARL_ExpandButton:SetNormalFontObject("GameFontNormalSmall")
+			ARL_ExpandButton:Enable()
+
+			-- Populate the buttons with new values
+			local button_index = 1
+			local string_index = button_index + FauxScrollFrame_GetOffset(self)
+			local stayInLoop = true
+
+			while stayInLoop do
+				local cur_state = self.state_buttons[button_index]
+				local cur_entry = self.entries[string_index]
+
+				if cur_entry.is_header then
+					cur_state:Show()
+
+					if cur_entry.is_expanded then
+						cur_state:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-Up")
+						cur_state:SetPushedTexture("Interface\\Buttons\\UI-MinusButton-Down")
+						cur_state:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
+						cur_state:SetDisabledTexture("Interface\\Buttons\\UI-MinusButton-Disabled")
+					else
+						cur_state:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-Up")
+						cur_state:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-Down")
+						cur_state:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
+						cur_state:SetDisabledTexture("Interface\\Buttons\\UI-PlusButton-Disabled")
+					end
+					cur_state.string_index = string_index
+					cur_state:SetScript("OnEnter", Button_OnEnter)
+					cur_state:SetScript("OnLeave", Button_OnLeave)
+				else
+					cur_state:Hide()
+				end
+				local cur_recipe = self.recipe_buttons[button_index]
+
+				cur_recipe.string_index = string_index
+				cur_recipe:SetText(cur_entry.text)
+				cur_recipe:SetScript("OnEnter", Bar_OnEnter)
+				cur_recipe:SetScript("OnLeave", Bar_OnLeave)
+
+				button_index = button_index + 1
+				string_index = string_index + 1
+
+				if button_index > NUM_RECIPE_LINES or string_index > num_entries then
+					stayInLoop = false
+				end
+			end
+		else
+			-- disable expand button, it's useless here and would spam the same error again
+			ARL_ExpandButton:SetNormalFontObject("GameFontDisableSmall")
+			ARL_ExpandButton:Disable()
+
+			local showpopup = false
+
+			if not addon.db.profile.hidepopup then
+				showpopup = true
+			end
+
+			-- If we haven't run this before we'll show pop-ups for the first time.
+			if addon.db.profile.addonversion ~= addon.version then
+				addon.db.profile.addonversion = addon.version
+				showpopup = true
+			end
+
+			if Player.recipes_total == 0 then
+				if showpopup then
+					StaticPopup_Show("ARL_NOTSCANNED")
+				end
+			elseif Player.recipes_known == Player.recipes_total then
+				if showpopup then
+					StaticPopup_Show("ARL_ALLKNOWN")
+				end
+			elseif (Player.recipes_total_filtered - Player.recipes_known_filtered) == 0 then
+				if showpopup then
+					StaticPopup_Show("ARL_ALLFILTERED")
+				end
+			elseif Player.excluded_recipes_unknown ~= 0 then
+				if showpopup then
+					StaticPopup_Show("ARL_ALLEXCLUDED")
+				end
+			elseif ARL_SearchText:GetText() ~= "" then
+				StaticPopup_Show("ARL_SEARCHFILTERED")
+			else
+				addon:Print(L["NO_DISPLAY"])
+				addon:Print("DEBUG: recipes_total check for 0")
+				addon:Print("DEBUG: recipes_total: " .. Player.recipes_total)
+				addon:Print("DEBUG: recipes_total check for equal to recipes_total")
+				addon:Print("DEBUG: recipes_known: " .. Player.recipes_known)
+				addon:Print("DEBUG: recipes_total: " .. Player.recipes_total)
+				addon:Print("DEBUG: recipes_total_filtered - recipes_known_filtered = 0")
+				addon:Print("DEBUG: recipes_total_filtered: " .. Player.recipes_total_filtered)
+				addon:Print("DEBUG: recipes_known_filtered: " .. Player.recipes_known_filtered)
+				addon:Print("DEBUG: excluded_recipes_unknown ~= 0")
+				addon:Print("DEBUG: excluded_recipes_unknown: " .. Player.excluded_recipes_unknown)
+			end
+		end
+	end
+	local faction_strings
+
+	local function CheckDisplayFaction(faction)
+		if addon.db.profile.filters.general.faction then
+			return true
+		end
+		return (not faction or faction == BFAC[Player["Faction"]] or faction == FACTION_NEUTRAL)
+	end
+
+	function MainPanel.scroll_frame:ExpandEntry(entry_index)
+		local obtain_filters = addon.db.profile.filters.obtain
+		local recipe_id = self.entries[entry_index].recipe_id
+		local pad = "  "
+
+		-- entry_index is the position in self.entries that we want
+		-- to expand. Since we are expanding the current entry, the return
+		-- value should be the index of the next button after the expansion
+		-- occurs
+		entry_index = entry_index + 1
+
+		for index, acquire in pairs(addon.recipe_list[recipe_id]["Acquire"]) do
+			-- Initialize the first line here, since every type below will have one.
+			local acquire_type = acquire["Type"]
+			local t = AcquireTable()
+			t.recipe_id = recipe_id
+			t.is_expanded = true
+
+			if acquire_type == A_TRAINER and obtain_filters.trainer then
+				local trainer = addon.trainer_list[acquire["ID"]]
+
+				if CheckDisplayFaction(trainer["Faction"]) then
+					local nStr = ""
+
+					if trainer["Faction"] == FACTION_HORDE then
+						nStr = addon:Horde(trainer["Name"])
+					elseif trainer["Faction"] == FACTION_ALLIANCE then
+						nStr = addon:Alliance(trainer["Name"])
+					else
+						nStr = addon:Neutral(trainer["Name"])
+					end
+					t.text = pad .. addon:Trainer(L["Trainer"] .. " : ") .. nStr
+
+					tinsert(self.entries, entry_index, t)
+					entry_index = entry_index + 1
+
+					local coord_text = ""
+
+					if trainer["Coordx"] ~= 0 and trainer["Coordy"] ~= 0 then
+						coord_text = addon:Coords("(" .. trainer["Coordx"] .. ", " .. trainer["Coordy"] .. ")")
+					end
+					t = AcquireTable()
+					t.recipe_id = recipe_id
+					t.is_expanded = true
+					t.text = pad .. pad .. trainer["Location"] .. " " .. coord_text
+
+					tinsert(self.entries, entry_index, t)
+					entry_index = entry_index + 1
+				end
+				-- Right now PVP obtained items are located on vendors so they have the vendor and pvp flag.
+				-- We need to display the vendor in the drop down if we want to see vendors or if we want to see PVP
+				-- This allows us to select PVP only and to see just the PVP recipes
+			elseif acquire_type == A_VENDOR and (obtain_filters.vendor or obtain_filters.pvp) then
+				local vendor = addon.vendor_list[acquire["ID"]]
+
+				if CheckDisplayFaction(vendor["Faction"]) then
+					local nStr = ""
+
+					if vendor["Faction"] == FACTION_HORDE then
+						nStr = addon:Horde(vendor["Name"])
+					elseif vendor["Faction"] == FACTION_ALLIANCE then
+						nStr = addon:Alliance(vendor["Name"])
+					else
+						nStr = addon:Neutral(vendor["Name"])
+					end
+					t.text = pad .. addon:Vendor(L["Vendor"] .. " : ") .. nStr
+
+					tinsert(self.entries, entry_index, t)
+					entry_index = entry_index + 1
+
+					local coord_text = ""
+
+					if vendor["Coordx"] ~= 0 and vendor["Coordy"] ~= 0 then
+						coord_text = addon:Coords("(" .. vendor["Coordx"] .. ", " .. vendor["Coordy"] .. ")")
+					end
+					t = AcquireTable()
+					t.recipe_id = recipe_id
+					t.is_expanded = true
+					t.text = pad .. pad .. vendor["Location"] .. " " .. coord_text
+
+					tinsert(self.entries, entry_index, t)
+					entry_index = entry_index + 1
+				end
+				-- Mobs can be in instances, raids, or specific mob related drops.
+			elseif acquire_type == A_MOB and (obtain_filters.mobdrop or obtain_filters.instance or obtain_filters.raid) then
+				local mob = addon.mob_list[acquire["ID"]]
+				t.text = pad .. addon:MobDrop(L["Mob Drop"] .. " : ") .. addon:Red(mob["Name"])
+
+				tinsert(self.entries, entry_index, t)
+				entry_index = entry_index + 1
+
+				local coord_text = ""
+
+				if mob["Coordx"] ~= 0 and mob["Coordy"] ~= 0 then
+					coord_text = addon:Coords("(" .. mob["Coordx"] .. ", " .. mob["Coordy"] .. ")")
+				end
+				t = AcquireTable()
+				t.recipe_id = recipe_id
+				t.is_expanded = true
+				t.text = pad .. pad .. mob["Location"] .. " " .. coord_text
+
+				tinsert(self.entries, entry_index, t)
+				entry_index = entry_index + 1
+			elseif acquire_type == A_QUEST and obtain_filters.quest then
+				local quest = addon.quest_list[acquire["ID"]]
+
+				if CheckDisplayFaction(quest["Faction"]) then
+					local nStr = ""
+
+					if quest["Faction"] == FACTION_HORDE then
+						nStr = addon:Horde(quest["Name"])
+					elseif quest["Faction"] == FACTION_ALLIANCE then
+						nStr = addon:Alliance(quest["Name"])
+					else
+						nStr = addon:Neutral(quest["Name"])
+					end
+					t.text = pad .. addon:Quest(L["Quest"] .. " : ") .. nStr
+
+					tinsert(self.entries, entry_index, t)
+					entry_index = entry_index + 1
+
+					local coord_text = ""
+
+					if quest["Coordx"] ~= 0 and quest["Coordy"] ~= 0 then
+						coord_text = addon:Coords("(" .. quest["Coordx"] .. ", " .. quest["Coordy"] .. ")")
+					end
+					t = AcquireTable()
+					t.recipe_id = recipe_id
+					t.is_expanded = true
+					t.text = pad .. pad .. quest["Location"] .. " " .. coord_text
+
+					tinsert(self.entries, entry_index, t)
+					entry_index = entry_index + 1
+				end
+			elseif acquire_type == A_SEASONAL and obtain_filters.seasonal then
+				t.text = pad .. addon:Season(SEASONAL_CATEGORY .. " : " .. addon.seasonal_list[acquire["ID"]]["Name"])
+				tinsert(self.entries, entry_index, t)
+				entry_index = entry_index + 1
+			elseif acquire_type == A_REPUTATION then -- Need to check if we're displaying the currently id'd rep or not as well
+				-- Reputation Obtain
+				-- Rep: ID, Faction
+				-- RepLevel = 0 (Neutral), 1 (Friendly), 2 (Honored), 3 (Revered), 4 (Exalted)
+				-- RepVendor - VendorID
+				local rep_vendor = addon.vendor_list[acquire["RepVendor"]]
+
+				if CheckDisplayFaction(rep_vendor["Faction"]) then
+					t.text = pad .. addon:Rep(_G.REPUTATION .. " : ") .. addon.reputation_list[acquire["ID"]]["Name"]
+					tinsert(self.entries, entry_index, t)
+					entry_index = entry_index + 1
+
+					if not faction_strings then
+						faction_strings = {
+							[0] = addon:Neutral(FACTION_NEUTRAL .. " : "),
+							[1] = addon:Friendly(BFAC["Friendly"] .. " : "),
+							[2] = addon:Honored(BFAC["Honored"] .. " : "),
+							[3] = addon:Revered(BFAC["Revered"] .. " : "),
+							[4] = addon:Exalted(BFAC["Exalted"] .. " : ")
+						}
+					end
+					local nStr = ""
+
+					if rep_vendor["Faction"] == FACTION_HORDE then
+						nStr = addon:Horde(rep_vendor["Name"])
+					elseif rep_vendor["Faction"] == FACTION_ALLIANCE then
+						nStr = addon:Alliance(rep_vendor["Name"])
+					else
+						nStr = addon:Neutral(rep_vendor["Name"])
+					end
+					t = AcquireTable()
+					t.recipe_id = recipe_id
+					t.is_expanded = true
+
+					t.text = pad .. pad .. faction_strings[acquire["RepLevel"]] .. nStr
+
+					tinsert(self.entries, entry_index, t)
+					entry_index = entry_index + 1
+
+					local coord_text = ""
+
+					if rep_vendor["Coordx"] ~= 0 and rep_vendor["Coordy"] ~= 0 then
+						coord_text = addon:Coords("(" .. rep_vendor["Coordx"] .. ", " .. rep_vendor["Coordy"] .. ")")
+					end
+					t = AcquireTable()
+					t.recipe_id = recipe_id
+					t.is_expanded = true
+					t.text = pad .. pad .. pad .. rep_vendor["Location"] .. " " .. coord_text
+
+					tinsert(self.entries, entry_index, t)
+					entry_index = entry_index + 1
+				end
+			elseif acquire_type == A_WORLD_DROP and obtain_filters.worlddrop then
+				t.text = pad .. addon:RarityColor(acquire["ID"] + 1, L["World Drop"])
+				tinsert(self.entries, entry_index, t)
+				entry_index = entry_index + 1
+			elseif acquire_type == A_CUSTOM then
+				t.text = pad .. addon:Normal(addon.custom_list[acquire["ID"]]["Name"])
+				tinsert(self.entries, entry_index, t)
+				entry_index = entry_index + 1
+			elseif acquire_type == A_PVP and obtain_filters.pvp then
+				local vendor = addon.vendor_list[acquire["ID"]]
+
+				if CheckDisplayFaction(vendor["Faction"]) then
+					local coord_text = ""
+
+					if vendor["Coordx"] ~= 0 and vendor["Coordy"] ~= 0 then
+						coord_text = addon:Coords("(" .. vendor["Coordx"] .. ", " .. vendor["Coordy"] .. ")")
+					end
+					local nStr = ""
+
+					if vendor["Faction"] == FACTION_HORDE then
+						nStr = addon:Horde(vendor["Name"])
+					elseif vendor["Faction"] == FACTION_ALLIANCE then
+						nStr = addon:Alliance(vendor["Name"])
+					else
+						nStr = addon:Neutral(vendor["Name"])
+					end
+					t.text = pad .. addon:Vendor(L["Vendor"] .. " : ") .. nStr
+
+					tinsert(self.entries, entry_index, t)
+					entry_index = entry_index + 1
+
+					t = AcquireTable()
+					t.recipe_id = recipe_id
+					t.is_expanded = true
+					t.text = pad .. pad .. vendor["Location"] .. " " .. coord_text
+
+					tinsert(self.entries, entry_index, t)
+					entry_index = entry_index + 1
+				end
+				--@alpha@
+			elseif acquire_type > A_MAX then
+				t.text = "Unhandled Acquire Case - Type: " .. acquire_type
+				tinsert(self.entries, entry_index, t)
+				entry_index = entry_index + 1
+				--@end-alpha@
+			end
+		end
+		return entry_index
+	end
+end	-- do
+
+-------------------------------------------------------------------------------
+-- Create MainPanel.progress_bar and set its scripts
+-------------------------------------------------------------------------------
+MainPanel.progress_bar = CreateFrame("StatusBar", nil, MainPanel)
+MainPanel.progress_bar:SetWidth(195)
+MainPanel.progress_bar:SetHeight(14)
+
+MainPanel.progress_bar:ClearAllPoints()
+MainPanel.progress_bar:SetPoint("BOTTOMLEFT", MainPanel, 17, 7)
+
+MainPanel.progress_bar:SetStatusBarTexture("Interface\\Addons\\AckisRecipeList\\img\\progressbar")
+MainPanel.progress_bar:SetOrientation("HORIZONTAL")
+MainPanel.progress_bar:SetStatusBarColor(0.25, 0.25, 0.75)
+
+MainPanel.progress_bar.text = MainPanel.progress_bar:CreateFontString(nil, "ARTWORK")
+MainPanel.progress_bar.text:SetWidth(195)
+MainPanel.progress_bar.text:SetHeight(14)
+MainPanel.progress_bar.text:SetFontObject("GameFontHighlightSmall")
+
+MainPanel.progress_bar.text:ClearAllPoints()
+MainPanel.progress_bar.text:SetPoint("CENTER", MainPanel.progress_bar, "CENTER", 0, 0)
+MainPanel.progress_bar.text:SetJustifyH("CENTER")
+
+-- Default values for the progressbar
+do
+	local pbMin = 0
+	local pbMax = 100
+	local pbCur = 50
+
+	MainPanel.progress_bar:SetMinMaxValues(pbMin, pbMax)
+	MainPanel.progress_bar:SetValue(pbCur)
+
+	MainPanel.progress_bar.text:SetFormattedText("%d / %d - %1.1f%%", pbCur, pbMax, pbCur / pbMax * 100)
+end	-- do
+
+function MainPanel.progress_bar:Update()
+	local pbCur, pbMax
+	local settings = addon.db.profile
+
+	if settings.includefiltered then
+		pbCur = Player.recipes_known
+		pbMax = Player.recipes_total
+	else
+		-- We're removing filtered recipes from the final count
+		pbCur = Player.recipes_known_filtered
+		pbMax = Player.recipes_total_filtered
+	end
+
+	if not settings.includeexcluded and not settings.ignoreexclusionlist then
+		pbCur = pbCur - Player.excluded_recipes_unknown
+		pbMax = pbMax - Player.excluded_recipes_known
+	end
+	self:SetMinMaxValues(0, pbMax)
+	self:SetValue(pbCur)
+
+	if (floor(pbCur / pbMax * 100) < 101) and pbCur >= 0 and pbMax >= 0 then
+		self.text:SetFormattedText("%d / %d - %1.1f%%", pbCur, pbMax, pbCur / pbMax * 100)
+	else
+		self.text:SetFormattedText("0 / 0 - %s", L["NOT_YET_SCANNED"])
+	end
+end
+
+-------------------------------------------------------------------------------
+-- Create the close button, and set its scripts.
+-------------------------------------------------------------------------------
+MainPanel.close_button = GenericCreateButton(nil, MainPanel, 22, 69, "GameFontNormalSmall", "GameFontHighlightSmall", L["Close"], "CENTER", L["CLOSE_DESC"], 1)
+MainPanel.close_button:SetPoint("BOTTOMRIGHT", MainPanel, "BOTTOMRIGHT", -4, 3)
+
+MainPanel.close_button:SetScript("OnClick",
+				 function(self, button, down)
+					 MainPanel:Hide()
+				 end)
+
+-------------------------------------------------------------------------------
+-- Map waypoint code.
+-------------------------------------------------------------------------------
+do
+	local BZ = LibStub("LibBabble-Zone-3.0"):GetLookupTable()
+
+	local function LoadZones(c, y, ...)
+		-- Fill up the list for normal lookup
+		for i = 1, select('#', ...), 1 do
+			c[i] = select(i, ...)
+
+--			if c[i] == BZ["The Storm Peaks"] then
+--				addon:Print("We have a match.")
+--			end
+		end
+
+		-- Reverse lookup to make work easier later on
+		for i in pairs(c) do
+			y[c[i]] = i
+		end
+	end
+
+	local C1 = {}
+	local C2 = {}
+	local C3 = {}
+	local C4 = {}
+
+	local c1 = {}
+	local c2 = {}
+	local c3 = {}
+	local c4 = {}
+
+--	addon:Print("Loading zones for continent 1")
+	LoadZones(C1, c1, GetMapZones(1))
+--	addon:Print("Loading zones for continent 2")
+	LoadZones(C2, c2, GetMapZones(2))
+--	addon:Print("Loading zones for continent 3")
+	LoadZones(C3, c3, GetMapZones(3))
+--	addon:Print("Loading zones for continent 4")
+	LoadZones(C4, c4, GetMapZones(4))
+
+	local iconlist = {}
+
+	-- Clears all the icons from the world map and the mini-map
+	function addon:ClearMap()
+		if TomTom then
+			for i in pairs(iconlist) do
+				TomTom:RemoveWaypoint(iconlist[i])
+			end
+			iconlist = twipe(iconlist)
+		end
+
+	end
+
+	local function CheckMapDisplay(acquire_entry, flags)
+		local maptrainer = addon.db.profile.maptrainer
+		local mapquest = addon.db.profile.mapquest
+		local mapvendor = addon.db.profile.mapvendor
+		local mapmob = addon.db.profile.mapmob
+		local player_faction = Player["Faction"]
+		local acquire_type = acquire_entry["Type"]
+		local acquire_id = acquire_entry["ID"]
+		local display = false
+
+		if acquire_type == A_TRAINER and maptrainer then
+			local trainer = addon.trainer_list[acquire_id]
+
+			display = (trainer["Faction"] == BFAC[player_faction] or trainer["Faction"] == FACTION_NEUTRAL)
+		elseif acquire_type == A_VENDOR and mapvendor then
+			local vendor = addon.vendor_list[acquire_id]
+
+			display = (vendor["Faction"] == BFAC[player_faction] or vendor["Faction"] == FACTION_NEUTRAL)
+		elseif acquire_type == A_REPUTATION and mapvendor then
+			local vendor = addon.vendor_list[acquire_entry["RepVendor"]]
+
+			display = (vendor["Faction"] == BFAC[player_faction] or vendor["Faction"] == FACTION_NEUTRAL)
+		elseif acquire_type == A_MOB and mapmob then
+			return true
+		elseif  acquire_type == A_QUEST and mapquest then
+			local quest = addon.quest_list[acquire_id]
+
+			display = (quest["Faction"] == BFAC[player_faction] or quest["Faction"] == FACTION_NEUTRAL)
+		elseif acquire_type == A_CUSTOM then
+			if flags[F_TRAINER] and maptrainer then
+				return true
+			elseif flags[F_VENDOR] and mapvendor then
+				return true
+			elseif flags[F_QUEST] and mapquest then
+				return true
+			elseif flags[F_INSTANCE] or flags[F_RAID] or flags[F_WORLD_DROP] or flags[F_MOB_DROP] then
+				return true
+			end
+		end
+		return display
+	end
+
+	local INSTANCE_LOCATIONS = {
+		[BZ["Ahn'kahet: The Old Kingdom"]] = {
+			["loc"] = c4[BZ["Dragonblight"]],
+			["c"] = 4,
+			["x"] = 28.49,
+			["y"] = 51.73,
+		},
+		[BZ["Auchenai Crypts"]] = {
+			["loc"] = c1[BZ["Terokkar Forest"]],
+			["c"] = 3,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["Azjol-Nerub"]] = {
+			["loc"] = c4[BZ["Dragonblight"]],
+			["c"] = 4,
+			["x"] = 26.01,
+			["y"] = 50.83,
+		},
+		[BZ["Blackrock Depths"]] = {
+			["loc"] = c1[BZ["Searing Gorge"]],
+			["c"] = 2,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["Blackrock Spire"]] = {
+			["loc"] = c1[BZ["Searing Gorge"]],
+			["c"] = 2,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["Blackwing Lair"]] = {
+			["loc"] = c1[BZ["Searing Gorge"]],
+			["c"] = 2,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["Dire Maul"]] = {
+			["loc"] = c1[BZ["Feralas"]],
+			["c"] = 1,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["Drak'Tharon Keep"]] = {
+			["loc"] = c1[BZ["Zul'Drak"]],
+			["c"] = 4,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["Gnomeregan"]] = {
+			["loc"] = c1[BZ["Dun Morogh"]],
+			["c"] = 2,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["Halls of Lightning"]] = {
+			["loc"] = c4[BZ["The Storm Peaks"]],
+			["c"] = 4,
+			["x"] = 45.40,
+			["y"] = 21.37,
+		},
+		[BZ["Halls of Stone"]] = {
+			["loc"] = c4[BZ["The Storm Peaks"]],
+			["c"] = 4,
+			["x"] = 39.49,
+			["y"] = 26.92,
+		},
+		[BZ["Karazhan"]] = {
+			["loc"] = c1[BZ["Deadwind Pass"]],
+			["c"] = 2,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["Magisters' Terrace"]] = {
+			["loc"] = c2[BZ["Isle of Quel'Danas"]],
+			["c"] = 2,
+			["x"] = 61.20,
+			["y"] = 30.89,
+		},
+		[BZ["Mana-Tombs"]] = {
+			["loc"] = c1[BZ["Terokkar Forest"]],
+			["c"] = 3,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["The Oculus"]] = {
+			["loc"] = c4[BZ["Borean Tundra"]],
+			["c"] = 4,
+			["x"] = 27.52,
+			["y"] = 26.71,
+		},
+		[BZ["Old Hillsbrad Foothills"]] = {
+			["loc"] = c1[BZ["Tanaris"]],
+			["c"] = 1,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["Onyxia's Lair"]] = {
+			["loc"] = c1[BZ["Dustwallow Marsh"]],
+			["c"] = 1,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["Ruins of Ahn'Qiraj"]] = {
+			["loc"] = c1[BZ["Tanaris"]],
+			["c"] = 1,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["Scholomance"]] = {
+			["loc"] = c1[BZ["Western Plaguelands"]],
+			["c"] = 2,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["Sethekk Halls"]] = {
+			["loc"] = c1[BZ["Terokkar Forest"]],
+			["c"] = 3,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["Shadow Labyrinth"]] = {
+			["loc"] = c1[BZ["Terokkar Forest"]],
+			["c"] = 3,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["Stratholme"]] = {
+			["loc"] = c1[BZ["Eastern Plaguelands"]],
+			["c"] = 2,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["Temple of Ahn'Qiraj"]] = {
+			["loc"] = c1[BZ["Tanaris"]],
+			["c"] = 1,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["The Arcatraz"]] = {
+			["loc"] = c1[BZ["Netherstorm"]],
+			["c"] = 3,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["The Black Morass"]] = {
+			["loc"] = c1[BZ["Tanaris"]],
+			["c"] = 1,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["The Botanica"]] = {
+			["loc"] = c1[BZ["Netherstorm"]],
+			["c"] = 3,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["The Deadmines"]] = {
+			["loc"] = c1[BZ["Westfall"]],
+			["c"] = 2,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["The Mechanar"]] = {
+			["loc"] = c1[BZ["Netherstorm"]],
+			["c"] = 3,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["The Nexus"]] = {
+			["loc"] = c4[BZ["Borean Tundra"]],
+			["c"] = 4,
+			["x"] = 27.50,
+			["y"] = 25.97,
+		},
+		[BZ["The Shattered Halls"]] = {
+			["loc"] = c1[BZ["Hellfire Peninsula"]],
+			["c"] = 3,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["The Slave Pens"]] = {
+			["loc"] = c1[BZ["Zangarmarsh"]],
+			["c"] = 3,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["The Steamvault"]] = {
+			["loc"] = c1[BZ["Zangarmarsh"]],
+			["c"] = 3,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["The Temple of Atal'Hakkar"]] = {
+			["loc"] = c1[BZ["Swamp of Sorrows"]],
+			["c"] = 2,
+			["x"] = 0,
+			["y"] = 0,
+		},
+		[BZ["The Violet Hold"]] = {
+			["loc"] = c4[BZ["Dalaran"]],
+			["c"] = 4,
+			["x"] = 66.78,
+			["y"] = 68.19,
+		},
+		[BZ["Utgarde Keep"]] = {
+			["loc"] = c4[BZ["Howling Fjord"]],
+			["c"] = 4,
+			["x"] = 57.28,
+			["y"] = 46.73,
+		},
+		[BZ["Utgarde Pinnacle"]] = {
+			["loc"] = c4[BZ["Howling Fjord"]],
+			["c"] = 4,
+			["x"] = 57.26,
+			["y"] = 46.67,
+		},
+		[BZ["Zul'Gurub"]] = {
+			["loc"] = c1[BZ["Stranglethorn Vale"]],
+			["c"] = 2,
+			["x"] = 0,
+			["y"] = 0,
+		},
+	}
+	local maplist = {}
+
+	-- Description: Adds mini-map and world map icons with tomtom.
+	-- Expected result: Icons are added to the world map and mini-map.
+	-- Input: An optional recipe ID
+	-- Output: Points are added to the maps
+	function addon:SetupMap(single_recipe)
+		if not TomTom then
+			return
+		end
+		local worldmap = addon.db.profile.worldmap
+		local minimap = addon.db.profile.minimap
+
+		if not (worldmap or minimap) then
+			return
+		end
+		local icontext = "Interface\\AddOns\\AckisRecipeList\\img\\enchant_up"
+
+		-- Get the proper icon to put on the mini-map
+		--		for i, k in pairs(SortedProfessions) do
+		--			if (k["name"] == Player["Profession"]) then
+		--				icontext = "Interface\\AddOns\\AckisRecipeList\\img\\" .. k["texture"] .. "_up"
+		--				break
+		--			end
+		--		end
+		twipe(maplist)
+
+		local recipe_list = addon.recipe_list
+
+		-- We're only getting a single recipe, not a bunch
+		if single_recipe then
+			-- loop through acquire methods, display each
+			for index, acquire in pairs(recipe_list[single_recipe]["Acquire"]) do
+				if CheckMapDisplay(acquire, recipe_list[single_recipe]["Flags"]) then
+					maplist[acquire] = true
+				end
+			end
+		elseif addon.db.profile.autoscanmap then
+			local sorted_recipes = addon.sorted_recipes
+
+			-- Scan through all recipes to display, and add the vendors to a list to get their acquire info
+			for i = 1, #sorted_recipes do
+				local recipe_index = sorted_recipes[i]
+
+				if recipe_list[recipe_index]["Display"] and recipe_list[recipe_index]["Search"] then
+					-- loop through acquire methods, display each
+					for index, acquire in pairs(recipe_list[recipe_index]["Acquire"]) do
+						if CheckMapDisplay(acquire, recipe_list[recipe_index]["Flags"]) then
+							maplist[acquire] = true
+						end
+					end
+				end
+			end
+		end
+
+		--		local ARLWorldMap = CreateFrame("Button","ARLWorldMap",WorldMapDetailFrame)
+		--		ARLWorldMap:ClearAllPoints()
+		--		ARLWorldMap:SetWidth(8)
+		--		ARLWorldMap:SetHeight(8)
+		--		ARLWorldMap.icon = ARLWorldMap:CreateTexture("ARTWORK")
+		--		ARLWorldMap.icon:SetTexture(icontext)
+		--		ARLWorldMap.icon:SetAllPoints()
+
+		--		local ARLMiniMap = CreateFrame("Button","ARLMiniMap",MiniMap)
+		--		ARLMiniMap:ClearAllPoints()
+		--		ARLMiniMap:SetWidth(8)
+		--		ARLMiniMap:SetHeight(8)
+		--		ARLMiniMap.icon = ARLMiniMap:CreateTexture("ARTWORK")
+		--		ARLMiniMap.icon:SetTexture(icontext)
+		--		ARLMiniMap.icon:SetAllPoints()
+
+		for entry in pairs(maplist) do
+			local loc
+			local custom = false
+			local id_num = entry["ID"]
+			local acquire_type = entry["Type"]
+
+			-- Get the entries location
+			if acquire_type == A_TRAINER then
+				loc = addon.trainer_list[id_num]
+			elseif acquire_type == A_VENDOR then
+				loc = addon.vendor_list[id_num]
+			elseif acquire_type == A_REPUTATION then
+				loc = addon.vendor_list[entry["RepVendor"]]
+			elseif acquire_type == A_MOB then
+				loc = addon.mob_list[id_num]
+			elseif acquire_type == A_QUEST then
+				loc = addon.quest_list[id_num]
+			elseif acquire_type == A_CUSTOM then
+				loc = addon.custom_list[id_num]
+				custom = true
+			end
+
+			local name = loc["Name"]
+			local x = loc["Coordx"]
+			local y = loc["Coordy"]
+			local location = loc["Location"]
+			local continent, zone
+
+			if not loc then
+				--@alpha@
+				addon:Printf("DEBUG: No continent/zone map match for ID %d  - loc is nil.", id_num)
+				--@end-alpha@
+			elseif c1[location] then
+				continent = 1
+				zone = c1[location]
+			elseif c2[location] then
+				continent = 2
+				zone = c2[location]
+			elseif c3[location] then
+				continent = 3
+				zone = c3[location]
+			elseif c4[location] then
+				continent = 4
+				zone = c4[location]
+			elseif INSTANCE_LOCATIONS[location] then
+				local info = INSTANCE_LOCATIONS[location]
+
+				continent = info["c"]
+				x = info["x"]
+				y = info["y"]
+				zone = info["loc"]
+				name = name .. " (" .. location .. ")"
+			else
+				--@alpha@
+				addon:Printf("DEBUG: No continent/zone map match for ID %d. Location: %s.", idnum, location)
+				--@end-alpha@
+			end
+
+			--@alpha@
+			if (x < -100) or (x > 100) or (y < -100) or (y > 100) then
+				addon:Printf("DEBUG: Invalid location coordinates for ID %d. Location: %s.", idnum, location)
+			end
+			--@end-alpha@
+
+			if zone and continent then
+				--@alpha@
+				if x == 0 and y == 0 then
+					addon:Printf("DEBUG: Location is \"0, 0\" for ID %d. Location: %s.", idnum, location)
+				end
+				--@end-alpha@
+				local iconuid = TomTom:AddZWaypoint(continent, zone, x, y, name, false, minimap, worldmap)
+
+				tinsert(iconlist, iconuid)
+			else
+				--@alpha@
+				if not zone then
+					self:Printf("No zone for ID %d. Location: %s.", id_num, location)
+				end
+
+				if not continent then
+					self:Printf("No continent for ID %d. Location: %s.", id_num, location)
+				end
+				--@end-alpha@
+			end
+		end
+	end
+end -- do block
+
+-- Description: Converting from hex to rgb (Thanks Maldivia)
+local function toRGB(hex)
+	local r, g, b = hex:match("(..)(..)(..)")
+
+	return (tonumber(r, 16) / 256), (tonumber(g,16) / 256), (tonumber(b, 16) / 256)
+end
+
+local function SetSortName()
+	local sort_type = addon.db.profile.sorting
+
+	if sort_type == "Name" then
+		ARL_DD_SortText:SetText(L["Sort"] .. ": " .. _G.NAME)
+	elseif sort_type == "SkillAsc" then
+		ARL_DD_SortText:SetText(L["Sort"] .. ": " .. L["Skill (Asc)"])
+	elseif sort_type == "SkillDesc" then
+		ARL_DD_SortText:SetText(L["Sort"] .. ": " .. L["Skill (Desc)"])
+	elseif sort_type == "Acquisition" then
+		ARL_DD_SortText:SetText(L["Sort"] .. ": " .. L["Acquisition"])
+	elseif sort_type == "Location" then
+		ARL_DD_SortText:SetText(L["Sort"] .. ": " .. L["Location"])
+	end
+
+end
+
+local function ARL_DD_Sort_OnClick(button, value)
+	CloseDropDownMenus()
+	addon.db.profile.sorting = value
+	SetSortName()
+	ReDisplay()
+end
+
+local function ARL_DD_Sort_Initialize()
+	local info = UIDropDownMenu_CreateInfo()
+
+	local k = "Name"
+	info.text = k
+	info.arg1 = info.text
+	info.func = ARL_DD_Sort_OnClick
+	info.checked = (addon.db.profile.sorting == k)
+	UIDropDownMenu_AddButton(info)
+
+	k = "SkillAsc"
+	info.text = k
+	info.arg1 = info.text
+	info.func = ARL_DD_Sort_OnClick
+	info.checked = (addon.db.profile.sorting == k)
+	UIDropDownMenu_AddButton(info)
+
+	k = "SkillDesc"
+	info.text = k
+	info.arg1 = info.text
+	info.func = ARL_DD_Sort_OnClick
+	info.checked = (addon.db.profile.sorting == k)
+	UIDropDownMenu_AddButton(info)
+
+	k = "Acquisition"
+	info.text = k
+	info.arg1 = info.text
+	info.func = ARL_DD_Sort_OnClick
+	info.checked = (addon.db.profile.sorting == k)
+	UIDropDownMenu_AddButton(info)
+
+	k = "Location"
+	info.text = k
+	info.arg1 = info.text
+	info.func = ARL_DD_Sort_OnClick
+	info.checked = (addon.db.profile.sorting == k)
+	UIDropDownMenu_AddButton(info)
+
+	SetSortName()
+end
+
+-------------------------------------------------------------------------------
+-- Data used in GenerateClickableTT() and its support functions.
+-------------------------------------------------------------------------------
+local click_info = {
+	anchor = nil,
+	change_realm = nil,
+	target_realm = nil,
+	modified = nil,
+	name = nil,
+	realm = nil,
+}
+local clicktip
+local GenerateClickableTT	-- Upvalued!
+
+-------------------------------------------------------------------------------
+-- Clicktip OnMouseUp scripts.
+-------------------------------------------------------------------------------
+local function ChangeRealm(cell, arg, button)
+	click_info.modified = true
+	click_info.realm = nil
+	click_info.change_realm = true
+	click_info.target_realm = nil
+	GenerateClickableTT()
+end
+
+local function SelectRealm(cell, arg, button)
+	click_info.modified = true
+
+	if click_info.change_realm then
+		click_info.target_realm = arg
+	end
+	click_info.realm = arg
+	GenerateClickableTT()
+end
+
+local function SelectName(cell, arg, button)
+	click_info.modified = true
+	click_info.name = arg
+
+	-- Wipe tradeskill information for the selected toon. -Torhal
+	if IsAltKeyDown() and button == "LeftButton" then
+		local tskl_list = addon.db.global.tradeskill
+		tskl_list[click_info.realm][click_info.name] = nil
+
+		-- See if there are any toons left on the realm. If not, nuke it as well.
+		local found = false
+		for name in pairs(tskl_list[click_info.realm]) do
+			found = true
+		end
+		if not found then
+			tskl_list[click_info.realm] = nil
+		end
+		local anchor = click_info.anchor
+		twipe(click_info)
+		click_info.anchor = anchor
+		GenerateClickableTT()
+		return
+	end
+	GenerateClickableTT()
+end
+
+local function SelectProfession(cell, arg, button)
+	local tskl_list = addon.db.global.tradeskill
+	click_info.modified = true
+	addon:Print(click_info.name .. " - " .. click_info.realm .. ": " .. tskl_list[click_info.realm][click_info.name][arg])
+end
+
+-------------------------------------------------------------------------------
+-- Creates a list of names/alts/etc in a tooltip which can be clicked.
+-------------------------------------------------------------------------------
+function GenerateClickableTT(anchor)
+	local tskl_list = addon.db.global.tradeskill
+	local tip = clicktip
+	local y, x
+	local prealm = GetRealmName()
+	local target_realm = prealm
+
+	if click_info.change_realm then
+		target_realm = click_info.target_realm
+		click_info.change_realm = nil
+	end
+	tip:Clear()
+
+	if not click_info.realm then
+		local other_realms = nil
+		local header = nil
+
+		for realm in pairs(tskl_list) do
+			if target_realm and (realm ~= target_realm) then
+				other_realms = true
+			end
+
+			if not target_realm and (realm ~= prealm) then
+				if not header then
+					tip:AddHeader(L["Other Realms"])
+					tip:AddSeparator()
+					header = true
+				end
+				y, x = tip:AddLine()
+				tip:SetCell(y, x, realm)
+				tip:SetCellScript(y, x, "OnMouseUp", SelectRealm, realm)
+			elseif realm == target_realm then
+				click_info.realm = realm
+
+				tip:AddHeader(realm)
+				tip:AddSeparator()
+
+				for name in pairs(tskl_list[click_info.realm]) do
+					if name ~= UnitName("player") then
+						y, x = tip:AddLine()
+						tip:SetCell(y, x, name)
+						tip:SetCellScript(y, x, "OnMouseUp", SelectName, name)
+					end
+				end
+			end
+		end
+
+		if other_realms then
+			tip:AddSeparator()
+			y, x = tip:AddLine()
+			tip:SetCell(y, x, L["Other Realms"])
+			tip:SetCellScript(y, x, "OnMouseUp", ChangeRealm)
+		end
+		tip:AddSeparator()
+	elseif not click_info.name then
+		local realm_list = tskl_list[click_info.realm]
+
+		if realm_list then
+			tip:AddLine(click_info.realm)
+			tip:AddSeparator()
+
+			for name in pairs(realm_list) do
+				y, x = tip:AddLine()
+				tip:SetCell(y, x, name)
+				tip:SetCellScript(y, x, "OnMouseUp", SelectName, name)
+			end
+			tip:AddSeparator()
+		end
+	else
+		tip:AddHeader(click_info.name)
+		tip:AddSeparator()
+
+		for prof in pairs(tskl_list[click_info.realm][click_info.name]) do
+			y, x = tip:AddLine()
+			tip:SetCell(y, x, prof)
+			tip:SetCellScript(y, x, "OnMouseUp", SelectProfession, prof)
+		end
+		tip:AddSeparator()
+	end
+
+	if anchor then
+		click_info.anchor = anchor
+		tip:SetPoint("TOP", anchor, "BOTTOM")
+	else
+		tip:SetPoint("TOP", click_info.anchor, "BOTTOM")
+	end
+	tip:Show()
+end
+
+-------------------------------------------------------------------------------
+-- Initializes runtime elements of MainPanel.
+-------------------------------------------------------------------------------
+function addon:InitializeFrame()
+	-------------------------------------------------------------------------------
+	-- Check to see if we're Horde or Alliance, and change the displayed
+	-- reputation strings to be faction-correct.
+	-------------------------------------------------------------------------------
+	local isAlliance = (Player["Faction"] == "Alliance")
+
+	local HonorHold_Thrallmar_FactionText = isAlliance and BFAC["Honor Hold"] or BFAC["Thrallmar"]
+	local Kurenai_Maghar_FactionText = isAlliance and BFAC["Kurenai"] or BFAC["The Mag'har"]
+	local Vanguard_Expedition_FactionText = isAlliance and BFAC["Alliance Vanguard"] or BFAC["Horde Expedition"]
+	local SilverConv_Sunreaver_FactionText = isAlliance and BFAC["The Silver Covenant"] or BFAC["The Sunreavers"]
+	local Valiance_Warsong_FactionText = isAlliance and BFAC["Valiance Expedition"] or BFAC["Warsong Offensive"]
+	local Frostborn_Taunka_FactionText = isAlliance and BFAC["The Frostborn"] or BFAC["The Taunka"]
+	local Explorer_Hand_FactionText = isAlliance and BFAC["Explorers' League"] or BFAC["The Hand of Vengeance"]
+
+	-------------------------------------------------------------------------------
+	-- Create the sort-type DropDown.
+	-------------------------------------------------------------------------------
+	local ARL_DD_Sort = CreateFrame("Frame", "ARL_DD_Sort", MainPanel, "UIDropDownMenuTemplate")
+	ARL_DD_Sort:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 55, -39)
+	ARL_DD_Sort:SetHitRectInsets(16, 16, 0, 0)
+	SetSortName()
+	UIDropDownMenu_SetWidth(ARL_DD_Sort, 105)
+
+	-------------------------------------------------------------------------------
+	-- Create the expand button and set its scripts.
+	-------------------------------------------------------------------------------
+	local ARL_ExpandButton = GenericCreateButton("ARL_ExpandButton", MainPanel, 21, 40, "GameFontNormalSmall", "GameFontHighlightSmall", L["EXPANDALL"], "CENTER",
+						     L["EXPANDALL_DESC"], 1)
+	ARL_ExpandButton:SetPoint("TOPRIGHT", ARL_DD_Sort, "BOTTOMLEFT", -2, 0)
+
+	ARL_ExpandButton:SetScript("OnClick",
+				   function(self, mouse_button, down)
+					   local expand_acquires = (self:GetText() == L["EXPANDALL"])
+
+					   if expand_acquires then
+						   self:SetText(L["CONTRACTALL"])
+						   SetTooltipScripts(self, L["CONTRACTALL_DESC"])
+					   else
+						   self:SetText(L["EXPANDALL"])
+						   SetTooltipScripts(self, L["EXPANDALL_DESC"])
+					   end
+					   MainPanel.scroll_frame:Update(expand_acquires, false)
+				   end)
+	ARL_ExpandButton:SetText(L["EXPANDALL"])
+	SetTooltipScripts(ARL_ExpandButton, L["EXPANDALL_DESC"])
+
+	-------------------------------------------------------------------------------
+	-- The search button, clear button, and search entry box.
+	-------------------------------------------------------------------------------
+	local SearchRecipes
+	do
+		local search_params = {
+			["ItemID"]	= true,
+			["Name"]	= true,
+			["Locations"]	= true,
+			["Specialty"]	= true,
+			["Level"]	= true,
+			["Rarity"]	= true,
+		}
+		-- Scans through the recipe database and toggles the flag on if the item is in the search criteria
+		function SearchRecipes(pattern)
+			if not pattern then
+				return
+			end
+			pattern = pattern:lower()
+
+			local recipe_list = addon.recipe_list
+
+			for index in pairs(recipe_list) do
+				local entry = recipe_list[index]
+				entry["Search"] = false
+
+				for field in pairs(search_params) do
+					local str = entry[field] and tostring(entry[field]):lower() or nil
+
+					if str and str:find(pattern) then
+						entry["Search"] = true
+						break
+					end
+				end
+			end
+		end
+	end	-- do
+
+	local ARL_SearchButton = GenericCreateButton("ARL_SearchButton", MainPanel, 25, 74, "GameFontDisableSmall", "GameFontHighlightSmall", _G.SEARCH, "CENTER",
+						     L["SEARCH_DESC"], 1)
+	ARL_SearchButton:SetPoint("TOPLEFT", ARL_DD_Sort, "BOTTOMRIGHT", 1, 4)
+
+	ARL_SearchButton:Disable()
+	ARL_SearchButton:SetScript("OnClick",
+				   function(this)
+					   local searchtext = ARL_SearchText:GetText()
+					   searchtext = searchtext:trim()
+
+					   if searchtext ~= "" then
+						   ARL_LastSearchedText = searchtext
+
+						   SearchRecipes(searchtext)
+						   MainPanel.scroll_frame:Update(false, false)
+
+						   ARL_ExpandButton:SetText(L["EXPANDALL"])
+						   SetTooltipScripts(ARL_ExpandButton, L["EXPANDALL_DESC"])
+
+						   ARL_SearchButton:SetNormalFontObject("GameFontDisableSmall")
+						   ARL_SearchButton:Disable()
+					   end
+				   end)
+
+	local ARL_ClearButton = GenericCreateButton("ARL_ClearButton", MainPanel, 28, 28, "GameFontNormalSmall", "GameFontHighlightSmall", "", "CENTER", L["CLEAR_DESC"], 3)
+	ARL_ClearButton:SetPoint("RIGHT", ARL_SearchButton, "LEFT", 4, -1)
+
+	ARL_ClearButton:SetScript("OnClick",
+				  function()
+					  local recipe_list = addon.recipe_list
+
+					  -- Reset the search flags
+					  for index in pairs(recipe_list) do
+						  recipe_list[index]["Search"] = true
+					  end
+					  ARL_SearchText:SetText(L["SEARCH_BOX_DESC"])
+
+					  -- Make sure our expand all button is set to expandall
+					  ARL_ExpandButton:SetText(L["EXPANDALL"])
+					  SetTooltipScripts(ARL_ExpandButton, L["EXPANDALL_DESC"])
+
+					  -- Make sure to clear the focus of the searchbox
+					  ARL_SearchText:ClearFocus()
+
+					  -- Disable the search button since we're not searching for anything now
+					  ARL_SearchButton:SetNormalFontObject("GameFontDisableSmall")
+					  ARL_SearchButton:Disable()
+
+					  -- Make sure to clear text for last search
+					  ARL_LastSearchedText = ""
+
+					  MainPanel.scroll_frame:Update(false, false)
+				  end)
+
+	ARL_SearchText = CreateFrame("EditBox", "ARL_SearchText", MainPanel, "InputBoxTemplate")
+	ARL_SearchText:SetText(L["SEARCH_BOX_DESC"])
+	ARL_SearchText:SetScript("OnEnterPressed",
+				 function(this)
+					 local searchtext = ARL_SearchText:GetText()
+					 searchtext = searchtext:trim()
+
+					 if searchtext ~= "" and searchtext ~= L["SEARCH_BOX_DESC"] then
+						 ARL_LastSearchedText = searchtext
+
+						 SearchRecipes(searchtext)
+						 MainPanel.scroll_frame:Update(false, false)
+
+						 ARL_ExpandButton:SetText(L["EXPANDALL"])
+						 SetTooltipScripts(ARL_ExpandButton, L["EXPANDALL_DESC"])
+
+						 ARL_SearchButton:SetNormalFontObject("GameFontDisableSmall")
+						 ARL_SearchButton:Disable()
+					 end
+				 end)
+	ARL_SearchText:SetScript("OnEditFocusGained",
+				 function(this)
+					 if this:GetText() == L["SEARCH_BOX_DESC"] then
+						 this:SetText("")
+					 end
+				 end)
+	ARL_SearchText:SetScript("OnEditFocusLost",
+				 function(this)
+					 if this:GetText() == "" then
+						 this:SetText(L["SEARCH_BOX_DESC"])
+					 end
+				 end)
+	ARL_SearchText:SetScript("OnTextChanged",
+				 function(this)
+					 local text = this:GetText()
+
+					 if text ~= "" and text ~= L["SEARCH_BOX_DESC"] and text ~= ARL_LastSearchedText then
+						 ARL_SearchButton:SetNormalFontObject("GameFontNormalSmall")
+						 ARL_SearchButton:Enable()
+					 else
+						 ARL_SearchButton:SetNormalFontObject("GameFontDisableSmall")
+						 ARL_SearchButton:Disable()
+					 end
+				 end)
+	ARL_SearchText:EnableMouse(true)
+	ARL_SearchText:SetAutoFocus(false)
+	ARL_SearchText:SetFontObject(ChatFontNormal)
+	ARL_SearchText:SetWidth(130)
+	ARL_SearchText:SetHeight(12)
+	ARL_SearchText:SetPoint("RIGHT", ARL_ClearButton, "LEFT", 3, -1)
+	ARL_SearchText:Show()
+
+	-------------------------------------------------------------------------------
+	-- Set the scripts for MainPanel.scroll_frame's buttons.
+	-------------------------------------------------------------------------------
+	do
+		local function RecipeItem_OnClick(self, button)
+			local clickedIndex = self.string_index
+
+			-- Don't do anything if they've clicked on an empty button
+			if not clickedIndex or clickedIndex == 0 then
+				return
+			end
+			local clicked_line = MainPanel.scroll_frame.entries[clickedIndex]
+			local traverseIndex = 0
+
+			-- First, check if this is a "modified" click, and react appropriately
+			if IsModifierKeyDown() then
+				if IsControlKeyDown() and IsShiftKeyDown() then
+					addon:SetupMap(clicked_line.recipe_id)
+				elseif IsShiftKeyDown() then
+					local itemID = addon.recipe_list[clicked_line.recipe_id]["ItemID"]
+
+					if itemID then
+						local _, itemLink = GetItemInfo(itemID)
+
+						if itemLink then
+							ChatFrameEditBox:Insert(itemLink)
+						else
+							addon:Print(L["NoItemLink"])
+						end
+					else
+						addon:Print(L["NoItemLink"])
+					end
+				elseif IsControlKeyDown() then
+					ChatFrameEditBox:Insert(addon.recipe_list[clicked_line.recipe_id]["RecipeLink"])
+				elseif IsAltKeyDown() then
+					-- Code needed here to insert this item into the "Ignore List"
+					addon:ToggleExcludeRecipe(clicked_line.recipe_id)
+					ReDisplay()
+				end
+			elseif clicked_line.is_header then
+				-- three possibilities here (all with no modifiers)
+				-- 1) We clicked on the recipe button on a closed recipe
+				-- 2) We clicked on the recipe button of an open recipe
+				-- 3) we clicked on the expanded text of an open recipe
+				if clicked_line.is_expanded then
+					traverseIndex = clickedIndex + 1
+
+					-- get rid of our expanded lines
+					while (MainPanel.scroll_frame.entries[traverseIndex] and not MainPanel.scroll_frame.entries[traverseIndex].is_header) do
+						ReleaseTable(tremove(MainPanel.scroll_frame.entries, traverseIndex))
+
+						if not MainPanel.scroll_frame.entries[traverseIndex] then
+							break
+						end
+					end
+					clicked_line.is_expanded = false
+				else
+					MainPanel.scroll_frame:ExpandEntry(clickedIndex)
+					clicked_line.is_expanded = true
+				end
+			else
+				-- this inherently implies that we're on an expanded recipe
+				-- first, back up in the list of buttons until we find our recipe line
+				local entries = MainPanel.scroll_frame.entries
+
+				traverseIndex = clickedIndex - 1
+
+				while entries[traverseIndex] and not entries[traverseIndex].is_header do
+					traverseIndex = traverseIndex - 1
+				end
+				entries[traverseIndex].is_expanded = false
+				traverseIndex = traverseIndex + 1
+
+				-- now remove the expanded lines until we get to a recipe again
+				while entries[traverseIndex] and not entries[traverseIndex].is_header do
+					ReleaseTable(tremove(entries, traverseIndex))
+
+					if not entries[traverseIndex] then
+						break
+					end
+				end
+			end
+			MainPanel.scroll_frame:Update(false, true)
+		end
+
+		for i = 1, NUM_RECIPE_LINES do
+			local temp_state = GenericCreateButton("ARL_StateButton" .. i, MainPanel.scroll_frame, 16, 16, "GameFontNormalSmall", "GameFontHighlightSmall",
+							       "", "LEFT", "", 2)
+
+			local temp_recipe = GenericCreateButton("ARL_RecipeButton" .. i, MainPanel.scroll_frame, 16, 224, "GameFontNormalSmall", "GameFontHighlightSmall",
+								"Blort", "LEFT", "", 0)
+
+			if i ~= 1 then
+				temp_state:SetPoint("TOPLEFT", MainPanel.scroll_frame.state_buttons[i - 1], "BOTTOMLEFT", 0, 3)
+				temp_recipe:SetPoint("TOPLEFT", MainPanel.scroll_frame.recipe_buttons[i - 1], "BOTTOMLEFT", 0, 3)
+			else
+				temp_state:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 20, -100)
+				temp_recipe:SetPoint("TOPLEFT", MainPanel, "TOPLEFT", 37, -100)
+			end
+			temp_state:SetScript("OnClick", RecipeItem_OnClick)
+			temp_recipe:SetScript("OnClick", RecipeItem_OnClick)
+
+			MainPanel.scroll_frame.state_buttons[i] = temp_state
+			MainPanel.scroll_frame.recipe_buttons[i] = temp_recipe
+		end
+	end	-- do
+
+	-------------------------------------------------------------------------------
+	-- Flyaway virtual frames to group buttons/text easily (and make them easy to show/hide)
+	-------------------------------------------------------------------------------
+
+	-------------------------------------------------------------------------------
+	-- Classic Reputations
+	-------------------------------------------------------------------------------
+	local ARL_Rep_ClassicButton = GenericCreateButton("ARL_Rep_ClassicButton", MainPanel.filter_menu.rep.Classic, 20, 140, "GameFontHighlight", "GameFontHighlightSmall",
+							  _G.REPUTATION .. ":", "LEFT", L["REP_TEXT_DESC"], 0)
+	ARL_Rep_ClassicButton:SetPoint("TOPLEFT", MainPanel.filter_menu.rep.Classic, "TOPLEFT", -2, -4)
+
+	ARL_Rep_ClassicButton:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
+	ARL_Rep_ClassicButton:RegisterForClicks("LeftButtonUp", "RightButtonUp")
+	ARL_Rep_ClassicButton:SetScript("OnClick",
+				   function(self,button)
+					   local filterdb = addon.db.profile.filters.rep
+					   if button == "LeftButton" then
+						   -- Set all Reputations to true
+						   filterdb.argentdawn = true
+						   filterdb.cenarioncircle = true
+						   filterdb.thoriumbrotherhood = true
+						   filterdb.timbermaw = true
+						   filterdb.zandalar = true
+					   elseif button == "RightButton" then
+						   -- Set all Reputations to false
+						   filterdb.argentdawn = false
+						   filterdb.cenarioncircle = false
+						   filterdb.thoriumbrotherhood = false
+						   filterdb.timbermaw = false
+						   filterdb.zandalar = false
+					   end
+					   -- Update the checkboxes with the new value
+					   ARL_RepArgentDawnCB:SetChecked(filterdb.argentdawn)
+					   ARL_RepCenarionCircleCB:SetChecked(filterdb.cenarioncircle)
+					   ARL_RepThoriumCB:SetChecked(filterdb.thoriumbrotherhood)
+					   ARL_RepTimbermawCB:SetChecked(filterdb.timbermaw)
+					   ARL_RepZandalarCB:SetChecked(filterdb.zandalar)
+					   -- Reset our title
+					   MainPanel:UpdateTitle()
+					   -- Use new filters
+					   ReDisplay()
+				   end)
+
+	local ARL_RepArgentDawnCB = CreateFrame("CheckButton", "ARL_RepArgentDawnCB", MainPanel.filter_menu.rep.Classic, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepArgentDawnCB, MainPanel.filter_menu.rep.Classic, sformat(L["SPECIFIC_REP_DESC"], BFAC["Argent Dawn"]), "argentdawn", 2, 1, 0)
+	ARL_RepArgentDawnCBText:SetText(BFAC["Argent Dawn"])
+	ARL_RepArgentDawnCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepCenarionCircleCB = CreateFrame("CheckButton", "ARL_RepCenarionCircleCB", MainPanel.filter_menu.rep.Classic, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepCenarionCircleCB, MainPanel.filter_menu.rep.Classic, sformat(L["SPECIFIC_REP_DESC"], BFAC["Cenarion Circle"]), "cenarioncircle", 3, 1, 0)
+	ARL_RepCenarionCircleCBText:SetText(BFAC["Cenarion Circle"])
+	ARL_RepCenarionCircleCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepThoriumCB = CreateFrame("CheckButton", "ARL_RepThoriumCB", MainPanel.filter_menu.rep.Classic, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepThoriumCB, MainPanel.filter_menu.rep.Classic, sformat(L["SPECIFIC_REP_DESC"], BFAC["Thorium Brotherhood"]), "thoriumbrotherhood", 4, 1, 0)
+	ARL_RepThoriumCBText:SetText(BFAC["Thorium Brotherhood"])
+	ARL_RepThoriumCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepTimbermawCB = CreateFrame("CheckButton", "ARL_RepTimbermawCB", MainPanel.filter_menu.rep.Classic, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepTimbermawCB, MainPanel.filter_menu.rep.Classic, sformat(L["SPECIFIC_REP_DESC"], BFAC["Timbermaw Hold"]), "timbermaw", 5, 1, 0)
+	ARL_RepTimbermawCBText:SetText(BFAC["Timbermaw Hold"])
+	ARL_RepTimbermawCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepZandalarCB = CreateFrame("CheckButton", "ARL_RepZandalarCB", MainPanel.filter_menu.rep.Classic, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepZandalarCB, MainPanel.filter_menu.rep.Classic, sformat(L["SPECIFIC_REP_DESC"], BFAC["Zandalar Tribe"]), "zandalar", 6, 1, 0)
+	ARL_RepZandalarCBText:SetText(BFAC["Zandalar Tribe"])
+	ARL_RepZandalarCBText:SetFont(narrowFont, 11)
+
+	-------------------------------------------------------------------------------
+	-- The Burning Crusade Reputations
+	-------------------------------------------------------------------------------
+	local ARL_Rep_BCButton = GenericCreateButton("ARL_Rep_ClassicButton", MainPanel.filter_menu.rep.BC, 20, 140, "GameFontHighlight", "GameFontHighlightSmall",
+						     _G.REPUTATION .. ":", "LEFT", L["REP_TEXT_DESC"], 0)
+	ARL_Rep_BCButton:SetPoint("TOPLEFT", MainPanel.filter_menu.rep.BC, "TOPLEFT", -2, -4)
+
+	ARL_Rep_BCButton:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
+	ARL_Rep_BCButton:RegisterForClicks("LeftButtonUp", "RightButtonUp")
+	ARL_Rep_BCButton:SetScript("OnClick",
+				   function(self,button)
+					   local filterdb = addon.db.profile.filters.rep
+					   if button == "LeftButton" then
+						   -- Set all Reputations to true
+						   filterdb.aldor = true
+						   filterdb.ashtonguedeathsworn = true
+						   filterdb.cenarionexpedition = true
+						   filterdb.consortium = true
+						   filterdb.hellfire = true
+						   filterdb.keepersoftime = true
+						   filterdb.nagrand = true
+						   filterdb.lowercity = true
+						   filterdb.scaleofthesands = true
+						   filterdb.scryer = true
+						   filterdb.shatar = true
+						   filterdb.shatteredsun = true
+						   filterdb.sporeggar = true
+						   filterdb.violeteye = true
+					   elseif button == "RightButton" then
+						   -- Set all Reputations to false
+						   filterdb.aldor = false
+						   filterdb.ashtonguedeathsworn = false
+						   filterdb.cenarionexpedition = false
+						   filterdb.consortium = false
+						   filterdb.hellfire = false
+						   filterdb.keepersoftime = false
+						   filterdb.nagrand = false
+						   filterdb.lowercity = false
+						   filterdb.scaleofthesands = false
+						   filterdb.scryer = false
+						   filterdb.shatar = false
+						   filterdb.shatteredsun = false
+						   filterdb.sporeggar = false
+						   filterdb.violeteye = false
+					   end
+					   -- Update the checkboxes with the new value
+					   ARL_RepAldorCB:SetChecked(filterdb.aldor)
+					   ARL_RepAshtongueCB:SetChecked(filterdb.ashtonguedeathsworn)
+					   ARL_RepCenarionExpeditionCB:SetChecked(filterdb.cenarionexpedition)
+					   ARL_RepConsortiumCB:SetChecked(filterdb.consortium)
+					   ARL_RepHonorHoldCB:SetChecked(filterdb.hellfire)
+					   ARL_RepKeepersOfTimeCB:SetChecked(filterdb.keepersoftime)
+					   ARL_RepKurenaiCB:SetChecked(filterdb.nagrand)
+					   ARL_RepLowerCityCB:SetChecked(filterdb.lowercity)
+					   ARL_RepScaleSandsCB:SetChecked(filterdb.scaleofthesands)
+					   ARL_RepScryersCB:SetChecked(filterdb.scryer)
+					   ARL_RepShatarCB:SetChecked(filterdb.shatar)
+					   ARL_RepShatteredSunCB:SetChecked(filterdb.shatteredsun)
+					   ARL_RepSporeggarCB:SetChecked(filterdb.sporeggar)
+					   ARL_RepVioletEyeCB:SetChecked(filterdb.violeteye)
+					   -- Reset our title
+					   MainPanel:UpdateTitle()
+					   -- Use new filters
+					   ReDisplay()
+				   end)
+
+	local ARL_RepAldorCB = CreateFrame("CheckButton", "ARL_RepAldorCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepAldorCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Aldor"]), "aldor", 2, 1, 0)
+	ARL_RepAldorCBText:SetText(BFAC["The Aldor"])
+	ARL_RepAldorCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepAshtongueCB = CreateFrame("CheckButton", "ARL_RepAshtongueCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepAshtongueCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["Ashtongue Deathsworn"]), "ashtonguedeathsworn", 3, 1, 0)
+	ARL_RepAshtongueCBText:SetText(BFAC["Ashtongue Deathsworn"])
+	ARL_RepAshtongueCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepCenarionExpeditionCB = CreateFrame("CheckButton", "ARL_RepCenarionExpeditionCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepCenarionExpeditionCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["Cenarion Expedition"]), "cenarionexpedition", 4, 1, 0)
+	ARL_RepCenarionExpeditionCBText:SetText(BFAC["Cenarion Expedition"])
+	ARL_RepCenarionExpeditionCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepConsortiumCB = CreateFrame("CheckButton", "ARL_RepConsortiumCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepConsortiumCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Consortium"]), "consortium", 5, 1, 0)
+	ARL_RepConsortiumCBText:SetText(BFAC["The Consortium"])
+	ARL_RepConsortiumCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepHonorHoldCB = CreateFrame("CheckButton", "ARL_RepHonorHoldCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepHonorHoldCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], HonorHold_Thrallmar_FactionText), "hellfire", 6, 1, 0)
+	ARL_RepHonorHoldCBText:SetText(HonorHold_Thrallmar_FactionText)
+	ARL_RepHonorHoldCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepKeepersOfTimeCB = CreateFrame("CheckButton", "ARL_RepKeepersOfTimeCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepKeepersOfTimeCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["Keepers of Time"]), "keepersoftime", 7, 1, 0)
+	ARL_RepKeepersOfTimeCBText:SetText(BFAC["Keepers of Time"])
+	ARL_RepKeepersOfTimeCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepKurenaiCB = CreateFrame("CheckButton", "ARL_RepKurenaiCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepKurenaiCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], Kurenai_Maghar_FactionText), "nagrand", 8, 1, 0)
+	ARL_RepKurenaiCBText:SetText(Kurenai_Maghar_FactionText)
+	ARL_RepKurenaiCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepLowerCityCB = CreateFrame("CheckButton", "ARL_RepLowerCityCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepLowerCityCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["Lower City"]), "lowercity", 9, 1, 0)
+	ARL_RepLowerCityCBText:SetText(BFAC["Lower City"])
+	ARL_RepLowerCityCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepScaleSandsCB = CreateFrame("CheckButton", "ARL_RepScaleSandsCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepScaleSandsCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Scale of the Sands"]), "scaleofthesands", 10, 1, 0)
+	ARL_RepScaleSandsCBText:SetText(BFAC["The Scale of the Sands"])
+	ARL_RepScaleSandsCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepScryersCB = CreateFrame("CheckButton", "ARL_RepScryersCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepScryersCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Scryers"]), "scryer", 11, 1, 0)
+	ARL_RepScryersCBText:SetText(BFAC["The Scryers"])
+	ARL_RepScryersCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepShatarCB = CreateFrame("CheckButton", "ARL_RepShatarCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepShatarCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Sha'tar"]), "shatar", 12, 1, 0)
+	ARL_RepShatarCBText:SetText(BFAC["The Sha'tar"])
+	ARL_RepShatarCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepShatteredSunCB = CreateFrame("CheckButton", "ARL_RepShatteredSunCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepShatteredSunCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["Shattered Sun Offensive"]), "shatteredsun", 13, 1, 0)
+	ARL_RepShatteredSunCBText:SetText(BFAC["Shattered Sun Offensive"])
+	ARL_RepShatteredSunCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepSporeggarCB = CreateFrame("CheckButton", "ARL_RepSporeggarCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepSporeggarCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["Sporeggar"]), "sporeggar", 14, 1, 0)
+	ARL_RepSporeggarCBText:SetText(BFAC["Sporeggar"])
+	ARL_RepSporeggarCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepVioletEyeCB = CreateFrame("CheckButton", "ARL_RepVioletEyeCB", MainPanel.filter_menu.rep.BC, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepVioletEyeCB, MainPanel.filter_menu.rep.BC, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Violet Eye"]), "violeteye", 15, 1, 0)
+	ARL_RepVioletEyeCBText:SetText(BFAC["The Violet Eye"])
+	ARL_RepVioletEyeCBText:SetFont(narrowFont, 11)
+
+	-------------------------------------------------------------------------------
+	-- Wrath of the Lich King Reputations
+	-------------------------------------------------------------------------------
+	local ARL_Rep_LKButton = GenericCreateButton("ARL_Rep_ClassicButton", MainPanel.filter_menu.rep.LK, 20, 140, "GameFontHighlight", "GameFontHighlightSmall",
+						     _G.REPUTATION .. ":", "LEFT", L["REP_TEXT_DESC"], 0)
+	ARL_Rep_LKButton:SetPoint("TOPLEFT", MainPanel.filter_menu.rep.LK, "TOPLEFT", -2, -4)
+
+	ARL_Rep_LKButton:SetHighlightTexture("Interface\\Buttons\\UI-PlusButton-Hilight")
+	ARL_Rep_LKButton:RegisterForClicks("LeftButtonUp", "RightButtonUp")
+	ARL_Rep_LKButton:SetScript("OnClick",
+				   function(self,button)
+					   local filterdb = addon.db.profile.filters.rep
+					   if button == "LeftButton" then
+						   -- Set all Reputations to true
+						   filterdb.argentcrusade = true
+						   filterdb.frenzyheart = true
+						   filterdb.ebonblade = true
+						   filterdb.kirintor = true
+						   filterdb.sonsofhodir = true
+						   filterdb.kaluak = true
+						   filterdb.oracles = true
+						   filterdb.wyrmrest = true
+						   filterdb.ashenverdict = true
+						   filterdb.wrathcommon1 = true
+					   elseif button == "RightButton" then
+						   -- Set all Reputations to false
+						   filterdb.argentcrusade = false
+						   filterdb.frenzyheart = false
+						   filterdb.ebonblade = false
+						   filterdb.kirintor = false
+						   filterdb.sonsofhodir = false
+						   filterdb.kaluak = false
+						   filterdb.oracles = false
+						   filterdb.wyrmrest = false
+						   filterdb.ashenverdict = false
+						   filterdb.wrathcommon1 = false
+					   end
+					   -- Update the checkboxes with the new value
+					   ARL_RepArgentCrusadeCB:SetChecked(filterdb.argentcrusade)
+					   ARL_RepFrenzyheartCB:SetChecked(filterdb.frenzyheart)
+					   ARL_RepEbonBladeCB:SetChecked(filterdb.ebonblade)
+					   ARL_RepKirinTorCB:SetChecked(filterdb.kirintor)
+					   ARL_RepSonsOfHodirCB:SetChecked(filterdb.sonsofhodir)
+					   ARL_RepKaluakCB:SetChecked(filterdb.kaluak)
+					   ARL_RepOraclesCB:SetChecked(filterdb.oracles)
+					   ARL_RepWyrmrestCB:SetChecked(filterdb.wyrmrest)
+					   ARL_RepAshenVerdictCB:SetChecked(filterdb.ashenverdict)
+					   ARL_WrathCommon1CB:SetChecked(filterdb.wrathcommon1)
+					   -- Reset our title
+					   MainPanel:UpdateTitle()
+					   -- Use new filters
+					   ReDisplay()
+				   end)
+
+	local ARL_WrathCommon1CB = CreateFrame("CheckButton", "ARL_WrathCommon1CB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_WrathCommon1CB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"],  Vanguard_Expedition_FactionText), "wrathcommon1", 2, 1, 0)
+	ARL_WrathCommon1CBText:SetText(Vanguard_Expedition_FactionText)
+	ARL_WrathCommon1CBText:SetFont(narrowFont, 11)
+
+	local ARL_RepArgentCrusadeCB = CreateFrame("CheckButton", "ARL_RepArgentCrusadeCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepArgentCrusadeCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["Argent Crusade"]), "argentcrusade", 3, 1, 0)
+	ARL_RepArgentCrusadeCBText:SetText(BFAC["Argent Crusade"])
+	ARL_RepArgentCrusadeCBText:SetFont(narrowFont, 11)
+
+	local ARL_WrathCommon5CB = CreateFrame("CheckButton", "ARL_WrathCommon5CB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_WrathCommon5CB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], Explorer_Hand_FactionText), "wrathcommon5", 4, 1, 0)
+	ARL_WrathCommon5CBText:SetText(Explorer_Hand_FactionText)
+	ARL_WrathCommon5CBText:SetFont(narrowFont, 11)
+	ARL_WrathCommon5CBText:SetText(addon:Grey(Explorer_Hand_FactionText))
+	ARL_WrathCommon5CB:Disable()
+
+	local ARL_RepFrenzyheartCB = CreateFrame("CheckButton", "ARL_RepFrenzyheartCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepFrenzyheartCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["Frenzyheart Tribe"]), "frenzyheart", 5, 1, 0)
+	ARL_RepFrenzyheartCBText:SetText(BFAC["Frenzyheart Tribe"])
+	ARL_RepFrenzyheartCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepKaluakCB = CreateFrame("CheckButton", "ARL_RepKaluakCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepKaluakCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Kalu'ak"]), "kaluak", 6, 1, 0)
+	ARL_RepKaluakCBText:SetText(BFAC["The Kalu'ak"])
+	ARL_RepKaluakCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepKirinTorCB = CreateFrame("CheckButton", "ARL_RepKirinTorCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepKirinTorCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["Kirin Tor"]), "kirintor", 7, 1, 0)
+	ARL_RepKirinTorCBText:SetText(BFAC["Kirin Tor"])
+	ARL_RepKirinTorCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepEbonBladeCB = CreateFrame("CheckButton", "ARL_RepEbonBladeCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepEbonBladeCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["Knights of the Ebon Blade"]), "ebonblade", 8, 1, 0)
+	ARL_RepEbonBladeCBText:SetText(BFAC["Knights of the Ebon Blade"])
+	ARL_RepEbonBladeCBText:SetFont(narrowFont, 11)
+
+	local ARL_RepOraclesCB = CreateFrame("CheckButton", "ARL_RepOraclesCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepOraclesCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Oracles"]), "oracles", 9, 1, 0)
+	ARL_RepOraclesCBText:SetText(BFAC["The Oracles"])
+	ARL_RepOraclesCBText:SetFont(narrowFont, 11)
+
+	local ARL_WrathCommon2CB = CreateFrame("CheckButton", "ARL_WrathCommon2CB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_WrathCommon2CB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], SilverConv_Sunreaver_FactionText), "wrathcommon2", 10, 1, 0)
+	ARL_WrathCommon2CBText:SetText(SilverConv_Sunreaver_FactionText)
+	ARL_WrathCommon2CBText:SetFont(narrowFont, 11)
+	ARL_WrathCommon2CBText:SetText(addon:Grey(SilverConv_Sunreaver_FactionText))
+	ARL_WrathCommon2CB:Disable()
+
+	local ARL_RepSonsOfHodirCB = CreateFrame("CheckButton", "ARL_RepSonsOfHodirCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepSonsOfHodirCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Sons of Hodir"]), "sonsofhodir", 11, 1, 0)
+	ARL_RepSonsOfHodirCBText:SetText(BFAC["The Sons of Hodir"])
+	ARL_RepSonsOfHodirCBText:SetFont(narrowFont, 11)
+
+	local ARL_WrathCommon4CB = CreateFrame("CheckButton", "ARL_WrathCommon4CB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_WrathCommon4CB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], Frostborn_Taunka_FactionText), "wrathcommon4", 12, 1, 0)
+	ARL_WrathCommon4CBText:SetText(Frostborn_Taunka_FactionText)
+	ARL_WrathCommon4CBText:SetFont(narrowFont, 11)
+	ARL_WrathCommon4CBText:SetText(addon:Grey(Frostborn_Taunka_FactionText))
+	ARL_WrathCommon4CB:Disable()
+
+	local ARL_WrathCommon3CB = CreateFrame("CheckButton", "ARL_WrathCommon3CB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_WrathCommon3CB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], Valiance_Warsong_FactionText), "wrathcommon3", 13, 1, 0)
+	ARL_WrathCommon3CBText:SetText(Valiance_Warsong_FactionText)
+	ARL_WrathCommon3CBText:SetFont(narrowFont, 11)
+	ARL_WrathCommon3CBText:SetText(addon:Grey(Valiance_Warsong_FactionText))
+	ARL_WrathCommon3CB:Disable()
+
+	local ARL_RepWyrmrestCB = CreateFrame("CheckButton", "ARL_RepWyrmrestCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepWyrmrestCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Wyrmrest Accord"]), "wyrmrest", 14, 1, 0)
+	ARL_RepWyrmrestCBText:SetText(BFAC["The Wyrmrest Accord"])
+	ARL_RepWyrmrestCBText:SetFont(narrowFont, 11)
+
+	local ARL_AshenVerdictCB = CreateFrame("CheckButton", "ARL_RepAshenVerdictCB", MainPanel.filter_menu.rep.LK, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_RepAshenVerdictCB, MainPanel.filter_menu.rep.LK, sformat(L["SPECIFIC_REP_DESC"], BFAC["The Ashen Verdict"]), "ashenverdict", 15, 1, 0)
+	ARL_RepAshenVerdictCBText:SetText(BFAC["The Ashen Verdict"])
+	ARL_RepAshenVerdictCBText:SetFont(narrowFont, 11)
+
+	-------------------------------------------------------------------------------
+	-- Miscellaneous Filter Menu
+	-------------------------------------------------------------------------------
+	MainPanel.filter_menu.misc = CreateFrame("Frame", "ARL_FilterMenu_Misc", MainPanel.filter_menu)
+	MainPanel.filter_menu.misc:SetWidth(FILTERMENU_LARGE)
+	MainPanel.filter_menu.misc:SetHeight(280)
+	MainPanel.filter_menu.misc:EnableMouse(true)
+	MainPanel.filter_menu.misc:EnableKeyboard(true)
+	MainPanel.filter_menu.misc:SetMovable(false)
+	MainPanel.filter_menu.misc:SetPoint("TOPLEFT", MainPanel.filter_menu, "TOPLEFT", 17, -16)
+	MainPanel.filter_menu.misc:Hide()
+
+	local ARL_MiscText = MainPanel.filter_menu.misc:CreateFontString("ARL_MiscText", "OVERLAY", "GameFontHighlight")
+	ARL_MiscText:SetText(_G.MISCELLANEOUS .. ":")
+	ARL_MiscText:SetPoint("TOPLEFT", MainPanel.filter_menu.misc, "TOPLEFT", 5, -8)
+	ARL_MiscText:SetHeight(14)
+	ARL_MiscText:SetWidth(150)
+	ARL_MiscText:SetJustifyH("LEFT")
+
+	local ARL_IgnoreCB = CreateFrame("CheckButton", "ARL_IgnoreCB", MainPanel.filter_menu.misc, "UICheckButtonTemplate")
+	InitializeCheckButton(ARL_IgnoreCB, MainPanel.filter_menu.misc, L["DISPLAY_EXCLUSION_DESC"], 0, 2, 1, 1)
+	ARL_IgnoreCBText:SetText(L["Display Exclusions"])
+
+	local ARL_MiscAltText = MainPanel.filter_menu.misc:CreateFontString("ARL_MiscAltBtn", "OVERLAY", "GameFontNormal")
+	ARL_MiscAltText:SetText(L["Alt-Tradeskills"] .. ":")
+	ARL_MiscAltText:SetPoint("TOPLEFT", ARL_IgnoreCB, "BOTTOMLEFT", 4, 0)
+	ARL_MiscAltText:SetHeight(14)
+	ARL_MiscAltText:SetWidth(95)
+	ARL_MiscAltText:SetJustifyH("LEFT")
+
+	local ARL_MiscAltBtn = CreateFrame("Button", "ARL_IgnoreCB", MainPanel.filter_menu.misc)
+	ARL_MiscAltBtn:SetPoint("LEFT", ARL_MiscAltText, "RIGHT")
+	ARL_MiscAltBtn:SetHeight(22)
+	ARL_MiscAltBtn:SetWidth(22)
+	ARL_MiscAltBtn:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up")
+	ARL_MiscAltBtn:SetPushedTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Down")
+	ARL_MiscAltBtn:SetDisabledTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Disabled")
+	ARL_MiscAltBtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight")
+	SetTooltipScripts(ARL_MiscAltBtn, L["ALT_TRADESKILL_DESC"], 1)
+	ARL_MiscAltBtn:RegisterForClicks("LeftButtonUp")
+	ARL_MiscAltBtn:SetScript("OnClick",
+				 function(this, button)
+					 if clicktip then
+						 if not click_info.modified then
+							 clicktip = QTip:Release(clicktip)
+							 twipe(click_info)
+						 else
+							 twipe(click_info)
+							 GenerateClickableTT(this)
+						 end
+					 else
+						 clicktip = QTip:Acquire("ARL_Clickable", 1, "CENTER")
+						 twipe(click_info)
+
+						 if TipTac and TipTac.AddModifiedTip then
+							 TipTac:AddModifiedTip(clicktip, true)
+						 end
+						 GenerateClickableTT(this)
+					 end
+				 end)
+	ARL_MiscAltBtn:SetScript("OnHide",
+				 function(this, button)
+					 clicktip = QTip:Release(clicktip)
+					 twipe(click_info)
+				 end)
+
+	-------------------------------------------------------------------------------
+	-- Now that everything exists, populate the global filter table
+	-------------------------------------------------------------------------------
+	local filterdb = addon.db.profile.filters
+	local filter_menu = MainPanel.filter_menu
+
+	FilterValueMap = {
+		------------------------------------------------------------------------------------------------
+		-- General Options
+		------------------------------------------------------------------------------------------------
+		["specialty"]		= { cb = filter_menu.general.specialty,			svroot = filterdb.general },
+		["skill"]		= { cb = filter_menu.general.skill,			svroot = filterdb.general },
+		["faction"]		= { cb = filter_menu.general.faction,			svroot = filterdb.general },
+		["known"]		= { cb = filter_menu.general.known,			svroot = filterdb.general },
+		["unknown"]		= { cb = filter_menu.general.unknown,			svroot = filterdb.general },
+		------------------------------------------------------------------------------------------------
+		-- Classes
+		------------------------------------------------------------------------------------------------
+		["deathknight"]		= { cb = filter_menu.general.deathknight,		svroot = filterdb.classes },
+		["druid"]		= { cb = filter_menu.general.druid,			svroot = filterdb.classes },
+		["hunter"]		= { cb = filter_menu.general.hunter,			svroot = filterdb.classes },
+		["mage"]		= { cb = filter_menu.general.mage,			svroot = filterdb.classes },
+		["paladin"]		= { cb = filter_menu.general.paladin,			svroot = filterdb.classes },
+		["priest"]		= { cb = filter_menu.general.priest,			svroot = filterdb.classes },
+		["rogue"]		= { cb = filter_menu.general.rogue,			svroot = filterdb.classes },
+		["shaman"]		= { cb = filter_menu.general.shaman,			svroot = filterdb.classes },
+		["warlock"]		= { cb = filter_menu.general.warlock,			svroot = filterdb.classes },
+		["warrior"]		= { cb = filter_menu.general.warrior,			svroot = filterdb.classes },
+		------------------------------------------------------------------------------------------------
+		-- Obtain Options
+		------------------------------------------------------------------------------------------------
+		["instance"]		= { cb = filter_menu.obtain.instance,			svroot = filterdb.obtain },
+		["raid"]		= { cb = filter_menu.obtain.raid,			svroot = filterdb.obtain },
+		["quest"]		= { cb = filter_menu.obtain.quest,			svroot = filterdb.obtain },
+		["seasonal"]		= { cb = filter_menu.obtain.seasonal,			svroot = filterdb.obtain },
+		["trainer"]		= { cb = filter_menu.obtain.trainer,			svroot = filterdb.obtain },
+		["vendor"]		= { cb = filter_menu.obtain.vendor,			svroot = filterdb.obtain },
+		["pvp"]			= { cb = filter_menu.obtain.pvp,			svroot = filterdb.obtain },
+		["discovery"]		= { cb = filter_menu.obtain.discovery,			svroot = filterdb.obtain },
+		["worlddrop"]		= { cb = filter_menu.obtain.worlddrop,			svroot = filterdb.obtain },
+		["mobdrop"]		= { cb = filter_menu.obtain.mobdrop,			svroot = filterdb.obtain },
+		["originalwow"]		= { cb = filter_menu.obtain.originalwow,		svroot = filterdb.obtain },
+		["bc"]			= { cb = filter_menu.obtain.bc,				svroot = filterdb.obtain },
+		["wrath"]		= { cb = filter_menu.obtain.wrath,			svroot = filterdb.obtain },
+		------------------------------------------------------------------------------------------------
+		-- Binding Options
+		------------------------------------------------------------------------------------------------
+		["itemboe"]		= { cb = filter_menu.binding.itemboe,			svroot = filterdb.binding },
+		["itembop"]		= { cb = filter_menu.binding.itembop,			svroot = filterdb.binding },
+		["recipeboe"]		= { cb = filter_menu.binding.recipeboe,			svroot = filterdb.binding },
+		["recipebop"]		= { cb = filter_menu.binding.recipebop,			svroot = filterdb.binding },
+		------------------------------------------------------------------------------------------------
+		-- Armor Options
+		------------------------------------------------------------------------------------------------
+		["cloth"]		= { cb = filter_menu.item.cloth,			svroot = filterdb.item.armor },
+		["leather"]		= { cb = filter_menu.item.leather,			svroot = filterdb.item.armor },
+		["mail"]		= { cb = filter_menu.item.mail,				svroot = filterdb.item.armor },
+		["plate"]		= { cb = filter_menu.item.plate,			svroot = filterdb.item.armor },
+		["cloak"]		= { cb = filter_menu.item.cloak,			svroot = filterdb.item.armor },
+		["necklace"]		= { cb = filter_menu.item.necklace,			svroot = filterdb.item.armor },
+		["ring"]		= { cb = filter_menu.item.ring,				svroot = filterdb.item.armor },
+		["trinket"]		= { cb = filter_menu.item.trinket,			svroot = filterdb.item.armor },
+		["shield"]		= { cb = filter_menu.item.shield,			svroot = filterdb.item.armor },
+		------------------------------------------------------------------------------------------------
+		-- Weapon Options
+		------------------------------------------------------------------------------------------------
+		["onehand"]		= { cb = filter_menu.item.onehand,			svroot = filterdb.item.weapon },
+		["twohand"]		= { cb = filter_menu.item.twohand,			svroot = filterdb.item.weapon },
+		["dagger"]		= { cb = filter_menu.item.dagger,			svroot = filterdb.item.weapon },
+		["axe"]			= { cb = filter_menu.item.axe,				svroot = filterdb.item.weapon },
+		["mace"]		= { cb = filter_menu.item.mace,				svroot = filterdb.item.weapon },
+		["sword"]		= { cb = filter_menu.item.sword,			svroot = filterdb.item.weapon },
+		["polearm"]		= { cb = filter_menu.item.polearm,			svroot = filterdb.item.weapon },
+		["fist"]		= { cb = filter_menu.item.fist,				svroot = filterdb.item.weapon },
+		["staff"]		= { cb = filter_menu.item.staff,			svroot = nil },
+		["wand"]		= { cb = filter_menu.item.wand,				svroot = filterdb.item.weapon },
+		["thrown"]		= { cb = filter_menu.item.thrown,			svroot = filterdb.item.weapon },
+		["bow"]			= { cb = filter_menu.item.bow,				svroot = nil },
+		["crossbow"]		= { cb = filter_menu.item.crossbow,			svroot = nil },
+		["ammo"]		= { cb = filter_menu.item.ammo,				svroot = filterdb.item.weapon },
+		["gun"]			= { cb = filter_menu.item.gun,				svroot = filterdb.item.weapon },
+		------------------------------------------------------------------------------------------------
+		-- Role Options
+		------------------------------------------------------------------------------------------------
+		["tank"]		= { cb = filter_menu.player.tank,			svroot = filterdb.player },
+		["melee"]		= { cb = filter_menu.player.melee,			svroot = filterdb.player },
+		["healer"]		= { cb = filter_menu.player.healer,			svroot = filterdb.player },
+		["caster"]		= { cb = filter_menu.player.caster,			svroot = filterdb.player },
+		------------------------------------------------------------------------------------------------
+		-- Old World Rep Options
+		------------------------------------------------------------------------------------------------
+		["argentdawn"]		= { cb = ARL_RepArgentDawnCB,		svroot = filterdb.rep },
+		["cenarioncircle"]	= { cb = ARL_RepCenarionCircleCB,	svroot = filterdb.rep },
+		["thoriumbrotherhood"]	= { cb = ARL_RepThoriumCB,		svroot = filterdb.rep },
+		["timbermaw"]		= { cb = ARL_RepTimbermawCB,		svroot = filterdb.rep },
+		["zandalar"]		= { cb = ARL_RepZandalarCB,		svroot = filterdb.rep },
+		------------------------------------------------------------------------------------------------
+		-- BC Rep Options
+		------------------------------------------------------------------------------------------------
+		["aldor"]		= { cb = ARL_RepAldorCB,		svroot = filterdb.rep },
+		["ashtonguedeathsworn"]	= { cb = ARL_RepAshtongueCB,		svroot = filterdb.rep },
+		["cenarionexpedition"]	= { cb = ARL_RepCenarionExpeditionCB,	svroot = filterdb.rep },
+		["consortium"]		= { cb = ARL_RepConsortiumCB,		svroot = filterdb.rep },
+		["hellfire"]		= { cb = ARL_RepHonorHoldCB,		svroot = filterdb.rep },
+		["keepersoftime"]	= { cb = ARL_RepKeepersOfTimeCB,	svroot = filterdb.rep },
+		["nagrand"]		= { cb = ARL_RepKurenaiCB,		svroot = filterdb.rep },
+		["lowercity"]		= { cb = ARL_RepLowerCityCB,		svroot = filterdb.rep },
+		["scaleofthesands"]	= { cb = ARL_RepScaleSandsCB,		svroot = filterdb.rep },
+		["scryer"]		= { cb = ARL_RepScryersCB,		svroot = filterdb.rep },
+		["shatar"]		= { cb = ARL_RepShatarCB,		svroot = filterdb.rep },
+		["shatteredsun"]	= { cb = ARL_RepShatteredSunCB,		svroot = filterdb.rep },
+		["sporeggar"]		= { cb = ARL_RepSporeggarCB,		svroot = filterdb.rep },
+		["violeteye"]		= { cb = ARL_RepVioletEyeCB,		svroot = filterdb.rep },
+		------------------------------------------------------------------------------------------------
+		-- LK Rep Options
+		------------------------------------------------------------------------------------------------
+		["argentcrusade"]	= { cb = ARL_RepArgentCrusadeCB,	svroot = filterdb.rep },
+		["frenzyheart"]		= { cb = ARL_RepFrenzyheartCB,		svroot = filterdb.rep },
+		["ebonblade"]		= { cb = ARL_RepEbonBladeCB,		svroot = filterdb.rep },
+		["kirintor"]		= { cb = ARL_RepKirinTorCB,		svroot = filterdb.rep },
+		["sonsofhodir"]		= { cb = ARL_RepSonsOfHodirCB,		svroot = filterdb.rep },
+		["kaluak"]		= { cb = ARL_RepKaluakCB,		svroot = filterdb.rep },
+		["oracles"]		= { cb = ARL_RepOraclesCB,		svroot = filterdb.rep },
+		["wyrmrest"]		= { cb = ARL_RepWyrmrestCB,		svroot = filterdb.rep },
+		["ashenverdict"]	= { cb = ARL_RepAshenVerdictCB,		svroot = filterdb.rep },
+		["wrathcommon1"]	= { cb = ARL_WrathCommon1CB,		svroot = filterdb.rep },
+		["wrathcommon2"]	= { cb = ARL_WrathCommon2CB,		svroot = nil },
+		["wrathcommon3"]	= { cb = ARL_WrathCommon3CB,		svroot = nil },
+		["wrathcommon4"]	= { cb = ARL_WrathCommon4CB,		svroot = nil },
+		["wrathcommon5"]	= { cb = ARL_WrathCommon5CB,		svroot = nil },
+	}
+end
+
+-------------------------------------------------------------------------------
+-- Displays the main recipe frame.
+-------------------------------------------------------------------------------
+function addon:DisplayFrame()
+	MainPanel:SetPosition()
+	MainPanel:SetProfession()
+	MainPanel:SetScale(addon.db.profile.frameopts.uiscale)
+
+	ARL_DD_Sort.initialize = ARL_DD_Sort_Initialize				-- Initialize dropdown
+
+	SortRecipeList()
+
+	MainPanel:UpdateTitle()
+	MainPanel.scroll_frame:Update(false, false)
+	MainPanel.progress_bar:Update()
+	MainPanel:Show()
+
+	-- Set the search text to the last searched text or the global default string for the search box
+	-- We should think about either preserving the search everytime arl is open or we clear it completely  - pompachomp
+	ARL_SearchText:SetText(ARL_LastSearchedText  or L["SEARCH_BOX_DESC"])
+end
+
+-------------------------------------------------------------------------------
+-- Under various conditions, the recipe list will have to be re-displayed.
+-- This could happen because a filter changes, a new profession is chosen, or
+-- a new search occurred. Use this function to do all the dirty work
+--
+-- Upvalued at the top of the file.
+-------------------------------------------------------------------------------
+function ReDisplay()
+	addon:UpdateFilters()
+	Player:MarkExclusions()
+
+	SortRecipeList()
+	MainPanel.scroll_frame:Update(false, false)
+	MainPanel.progress_bar:Update()
+
+	-- Make sure our expand all button is set to expandall
+	ARL_ExpandButton:SetText(L["EXPANDALL"])
+	SetTooltipScripts(ARL_ExpandButton, L["EXPANDALL_DESC"])
+end
+
+-------------------------------------------------------------------------------
+--- Creates a new frame with the contents of a text dump so you can copy and paste
+-- Code borrowed from Antiarc (Chatter) with permission
+-- @name AckisRecipeList:DisplayTextDump
+-- @param RecipeDB The database (array) which you wish read data from.
+-- @param profession Which profession are you displaying data for
+-- @param text The text to be dumped
+-------------------------------------------------------------------------------
+do
+	local copy_frame = CreateFrame("Frame", "ARLCopyFrame", UIParent)
+	copy_frame:SetBackdrop({
+				       bgFile = [[Interface\DialogFrame\UI-DialogBox-Background]],
+				       edgeFile = [[Interface\DialogFrame\UI-DialogBox-Border]],
+				       tile = true,
+				       tileSize = 16,
+				       edgeSize = 16,
+				       insets = {
+					       left = 3,
+					       right = 3,
+					       top = 5,
+					       bottom = 3
+				       }
+			       })
+	copy_frame:SetBackdropColor(0, 0, 0, 1)
+	copy_frame:SetWidth(750)
+	copy_frame:SetHeight(400)
+	copy_frame:SetPoint("CENTER", UIParent, "CENTER")
+	copy_frame:SetFrameStrata("DIALOG")
+
+	tinsert(UISpecialFrames, "ARLCopyFrame")
+
+	local scrollArea = CreateFrame("ScrollFrame", "ARLCopyScroll", copy_frame, "UIPanelScrollFrameTemplate")
+	scrollArea:SetPoint("TOPLEFT", copy_frame, "TOPLEFT", 8, -30)
+	scrollArea:SetPoint("BOTTOMRIGHT", copy_frame, "BOTTOMRIGHT", -30, 8)
+
+	local edit_box = CreateFrame("EditBox", nil, copy_frame)
+	edit_box:SetMultiLine(true)
+	edit_box:SetMaxLetters(0)
+	edit_box:EnableMouse(true)
+	edit_box:SetAutoFocus(true)
+	edit_box:SetFontObject(ChatFontNormal)
+	edit_box:SetWidth(650)
+	edit_box:SetHeight(270)
+	edit_box:SetScript("OnEscapePressed",
+			   function()
+				   copy_frame:Hide()
+			   end)
+	edit_box:HighlightText(0)
+
+	scrollArea:SetScrollChild(edit_box)
+
+	local close = CreateFrame("Button", nil, copy_frame, "UIPanelCloseButton")
+	close:SetPoint("TOPRIGHT", copy_frame, "TOPRIGHT")
+
+	copy_frame:Hide()
+
+	function addon:DisplayTextDump(RecipeDB, profession, text)
+		edit_box:SetText((not RecipeDB and not profession) and text or self:GetTextDump(RecipeDB, profession))
+		edit_box:HighlightText(0)
+		copy_frame:Show()
+	end
+end	-- do
diff --git a/RecipeDB/ARL-Engineer.lua b/RecipeDB/ARL-Engineer.lua
index 63b9295..2069a87 100644
--- a/RecipeDB/ARL-Engineer.lua
+++ b/RecipeDB/ARL-Engineer.lua
@@ -1637,11 +1637,11 @@ function addon:InitEngineering(RecipeDB)
 	 if (version == "0.3.0") then

 		 -- Iceblade Arrow -- 72953
-		 AddRecipe(72953,450,52021,4,2,450,450,450,460)
+		 AddRecipe(72953, 450, 52021, F_EPIC, GAME_WOTLK, 450, 450, 450, 460)
 		 self:addTradeFlags(RecipeDB,72953,F_ALLIANCE,F_HORDE,F_VENDOR,F_ASHEN_VERDICT)
 		 -- self:addTradeAcquire(RecipeDB,72953,A_REPUTATION,1156,2,)
 		 -- Shatter Rounds -- 72952
-		 AddRecipe(72952,450,52020,4,2,450,450,450,460)
+		 AddRecipe(72952, 450, 52020, F_EPIC, GAME_WOTLK, 450, 450, 450, 460)
 		 self:addTradeFlags(RecipeDB,72952,F_ALLIANCE,F_HORDE,F_VENDOR,F_ASHEN_VERDICT)
 		 -- self:addTradeAcquire(RecipeDB,72952,A_REPUTATION,1156,2,)