Quantcast

Rename a bunch of files, making them shorter.

Ackis [12-09-09 - 22:56]
Rename a bunch of files, making them shorter.
Filename
ARL.lua
ARLColour.lua
ARLConfig.lua
ARLDatamine.lua
AckisRecipeList.lua
AckisRecipeList.toc
Colour.lua
Config.lua
Datamine.lua
Frame.lua
diff --git a/ARL.lua b/ARL.lua
new file mode 100644
index 0000000..5521324
--- /dev/null
+++ b/ARL.lua
@@ -0,0 +1,1737 @@
+-------------------------------------------------------------------------------
+-- AckisRecipeList.lua
+-------------------------------------------------------------------------------
+-- File date: @file-date-iso@
+-- File revision: @file-revision@
+-- Project revision: @project-revision@
+-- Project version: @project-version@
+-------------------------------------------------------------------------------
+-- Authors: Ackis, Zhinjio, Jim-Bim, Torhal, Pompy
+-------------------------------------------------------------------------------
+-- 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 AckisRecipeList.lua
+-- @release 1.0
+
+-------------------------------------------------------------------------------
+-- Localized Lua globals.
+-------------------------------------------------------------------------------
+local _G = getfenv(0)
+
+local tostring = _G.tostring
+local tonumber = _G.tonumber
+
+local pairs, ipairs = _G.pairs, _G.ipairs
+local select = _G.select
+
+local table = _G.table
+local twipe = table.wipe
+local tconcat = table.concat
+local tinsert = table.insert
+
+local string = _G.string
+local strformat = string.format
+local strfind = string.find
+local strmatch = string.match
+local strlower = string.lower
+
+-------------------------------------------------------------------------------
+-- Localized Blizzard API.
+-------------------------------------------------------------------------------
+local GetNumTradeSkills = _G.GetNumTradeSkills
+local GetSpellInfo = _G.GetSpellInfo
+
+-------------------------------------------------------------------------------
+-- AddOn namespace.
+-------------------------------------------------------------------------------
+local LibStub	= _G.LibStub
+local MODNAME	= "Ackis Recipe List"
+local addon	= LibStub("AceAddon-3.0"):NewAddon(MODNAME, "AceConsole-3.0", "AceEvent-3.0")
+_G.AckisRecipeList = addon
+
+--@alpha@
+_G.ARL = addon
+--@end-alpha@
+
+local L	= LibStub("AceLocale-3.0"):GetLocale(MODNAME)
+
+local BFAC = LibStub("LibBabble-Faction-3.0"):GetLookupTable()
+
+--------------------------------------------------------------------------------------------------------------------
+-- Acquire types
+--------------------------------------------------------------------------------------------------------------------
+local A_TRAINER, A_VENDOR, A_MOB, A_QUEST, A_SEASONAL, A_REPUTATION, A_WORLD_DROP, A_CUSTOM = 1, 2, 3, 4, 5, 6, 7, 8
+
+------------------------------------------------------------------------------
+-- Constants.
+------------------------------------------------------------------------------
+local NUM_FILTER_FLAGS = 128
+local PROFESSION_INITS = {}	-- Professions initialization functions.
+
+------------------------------------------------------------------------------
+-- Database tables
+------------------------------------------------------------------------------
+local RecipeList = {}
+local CustomList = {}
+local MobList = {}
+local QuestList = {}
+local ReputationList = {}
+local TrainerList = {}
+local SeasonalList = {}
+local VendorList = {}
+local AllSpecialtiesTable = {}
+local SpecialtyTable
+
+addon.custom_list	= CustomList
+addon.mob_list		= MobList
+addon.quest_list	= QuestList
+addon.recipe_list	= RecipeList
+addon.reputation_list	= ReputationList
+addon.trainer_list	= TrainerList
+addon.seasonal_list	= SeasonalList
+addon.vendor_list	= VendorList
+
+
+------------------------------------------------------------------------------
+-- Data which is stored regarding a players statistics (luadoc copied from Collectinator, needs updating)
+------------------------------------------------------------------------------
+-- @class table
+-- @name Player
+-- @field known_filtered Total number of items known filtered during the scan.
+-- @field Faction Player's faction
+-- @field Class Player's class
+-- @field ["Reputation"] Listing of players reputation levels
+local Player = {}
+addon.Player = Player
+
+-- Global Frame Variables
+addon.optionsFrame = {}
+
+-------------------------------------------------------------------------------
+-- Check to see if we have mandatory libraries loaded. If not, notify the user
+-- which are missing and return.
+-------------------------------------------------------------------------------
+local MissingLibraries
+do
+	local REQUIRED_LIBS = {
+		"AceLocale-3.0",
+		"LibBabble-Boss-3.0",
+		"LibBabble-Faction-3.0",
+		"LibBabble-Zone-3.0",
+	}
+	function MissingLibraries()
+		local missing = false
+
+		for idx, lib in ipairs(REQUIRED_LIBS) do
+			if not LibStub:GetLibrary(lib, true) then
+				missing = true
+				addon:Print(strformat(L["MISSING_LIBRARY"], lib))
+			end
+		end
+		return missing
+	end
+end -- do
+
+if MissingLibraries() then
+	--@debug@
+	addon:Print("You are using an SVN version of ARL.  As per WowAce/Curseforge standards, SVN externals are not set up.  You will have to install Ace3, Babble-Faction-3.0, Babble-Zone-3.0, Babble-Boss-3.0, LibAboutPanel, and LibSharedMedia-3.0 in order for the addon to function correctly.")
+	--@end-debug@
+	_G.AckisRecipeList = nil
+	return
+end
+
+function addon:DEBUG(str, ...)
+	print(string.format(addon:Red("DEBUG: ") .. tostring(str), ...))
+end
+
+do
+	local output = {}
+
+	function addon:DumpMembers(match)
+		twipe(output)
+		tinsert(output, "Addon Object members.\n")
+
+		local count = 0
+
+		for key, value in pairs(self) do
+			local val_type = type(value)
+
+			if not match or val_type == match then
+				tinsert(output, key.. " ("..val_type..")")
+				count = count + 1
+			end
+		end
+		tinsert(output, string.format("\n%d found\n", count))
+		self:DisplayTextDump(nil, nil, tconcat(output, "\n"))
+	end
+end	-- do
+
+-------------------------------------------------------------------------------
+-- Initialization functions
+-------------------------------------------------------------------------------
+function addon:OnInitialize()
+	-- Set default options, which are to include everything in the scan
+	local defaults = {
+		global = {
+			-- Saving alts tradeskills (needs to be global so all profiles can access it)
+			tradeskill = {},
+		},
+		profile = {
+			-------------------------------------------------------------------------------
+			-- Frame options
+			-------------------------------------------------------------------------------
+			frameopts = {
+				offsetx = 0,
+				offsety = 0,
+				anchorTo = "",
+				anchorFrom = "",
+				uiscale = 1,
+				tooltipscale = .9,
+				fontsize = 11,
+			},
+
+			-------------------------------------------------------------------------------
+			-- Sorting Options
+			-------------------------------------------------------------------------------
+			sorting = "SkillAsc",
+
+			-------------------------------------------------------------------------------
+			-- Display Options
+			-------------------------------------------------------------------------------
+			includefiltered = false,
+			includeexcluded = false,
+			closeguionskillclose = false,
+			ignoreexclusionlist = false,
+			scanbuttonlocation = "TR",
+			spelltooltiplocation = "Right",
+			acquiretooltiplocation = "Right",
+			hidepopup = false,
+			minimap = true,
+			worldmap = true,
+			autoscanmap = false,
+			scantrainers = false,
+			scanvendors = false,
+			autoloaddb = false,
+			maptrainer = false,
+			mapvendor = true,
+			mapmob = true,
+			mapquest = true,
+
+			-------------------------------------------------------------------------------
+			-- Recipe Exclusion
+			-------------------------------------------------------------------------------
+			exclusionlist = {},
+
+			-------------------------------------------------------------------------------
+			-- Filter Options
+			-------------------------------------------------------------------------------
+			filters = {
+				-------------------------------------------------------------------------------
+				-- General Filters
+				-------------------------------------------------------------------------------
+				general = {
+					faction = true,
+					specialty = false,
+					skill = true,
+					known = false,
+					unknown = true,
+				},
+				-------------------------------------------------------------------------------
+				-- Obtain Filters
+				-------------------------------------------------------------------------------
+				obtain = {
+					trainer = true,
+					vendor = true,
+					instance = true,
+					raid = true,
+					seasonal = true,
+					quest = true,
+					pvp = true,
+					discovery = true,
+					worlddrop = true,
+					mobdrop = true,
+					originalwow = true,
+					bc = true,
+					wrath = true,
+				},
+				-------------------------------------------------------------------------------
+				-- Item Filters (Armor/Weapon)
+				-------------------------------------------------------------------------------
+				item = {
+					armor = {
+						cloth = true,
+						leather = true,
+						mail = true,
+						plate = true,
+						trinket = true,
+						cloak = true,
+						ring = true,
+						necklace = true,
+						shield = true,
+					},
+					weapon = {
+						onehand = true,
+						twohand = true,
+						axe = true,
+						sword = true,
+						mace = true,
+						polearm = true,
+						dagger = true,
+						fist = true,
+						staff = true,
+						wand = true,
+						thrown = true,
+						bow = true,
+						crossbow = true,
+						ammo = true,
+						gun = true,
+					},
+				},
+				-------------------------------------------------------------------------------
+				-- Binding Filters
+				-------------------------------------------------------------------------------
+				binding = {
+					itemboe = true,
+					itembop = true,
+					recipebop = true,
+					recipeboe = true,
+				},
+				-------------------------------------------------------------------------------
+				-- Player Role Filters
+				-------------------------------------------------------------------------------
+				player = {
+					melee = true,
+					tank = true,
+					healer = true,
+					caster = true,
+				},
+				-------------------------------------------------------------------------------
+				-- Reputation Filters
+				-------------------------------------------------------------------------------
+				rep = {
+					aldor = true,
+					scryer = true,
+					argentdawn = true,
+					ashtonguedeathsworn = true,
+					cenarioncircle = true,
+					cenarionexpedition = true,
+					consortium = true,
+					hellfire = true,
+					keepersoftime = true,
+					nagrand = true,
+					lowercity = true,
+					scaleofthesands = true,
+					shatar = true,
+					shatteredsun = true,
+					sporeggar = true,
+					thoriumbrotherhood = true,
+					timbermaw = true,
+					violeteye = true,
+					zandalar = true,
+					argentcrusade = true,
+					frenzyheart = true,
+					ebonblade = true,
+					kirintor = true,
+					sonsofhodir = true,
+					kaluak = true,
+					oracles = true,
+					wyrmrest = true,
+					wrathcommon1 = true,
+					wrathcommon2 = true,
+					wrathcommon3 = true,
+					wrathcommon4 = true,
+					wrathcommon5 = true,
+					ashenverdict = true,
+				},
+				-------------------------------------------------------------------------------
+				-- Class Filters
+				-------------------------------------------------------------------------------
+				classes = {
+					deathknight = true,
+					druid = true,
+					hunter = true,
+					mage = true,
+					paladin = true,
+					priest = true,
+					rogue = true,
+					shaman = true,
+					warlock = true,
+					warrior = true,
+				},
+			}
+		}
+	}
+	self.db = LibStub("AceDB-3.0"):New("ARLDB2", defaults)
+
+	if not self.db then
+		self:Print("Error: Database not loaded correctly.  Please exit out of WoW and delete the ARL database file (AckisRecipeList.lua) found in: \\World of Warcraft\\WTF\\Account\\<Account Name>>\\SavedVariables\\")
+		return
+	end
+	local version = GetAddOnMetadata("AckisRecipeList", "Version")
+	version = string.gsub(version, "@project.revision@", "SVN")
+	self.version = version
+
+	self:SetupOptions()
+
+	-- Register slash commands
+	self:RegisterChatCommand("arl", "ChatCommand")
+	self:RegisterChatCommand("ackisrecipelist", "ChatCommand")
+
+	-------------------------------------------------------------------------------
+	-- Create the scan button
+	-------------------------------------------------------------------------------
+	local scan_button = CreateFrame("Button", nil, UIParent, "UIPanelButtonTemplate")
+	scan_button:SetHeight(20)
+
+	scan_button:RegisterForClicks("LeftButtonUp")
+	scan_button:SetScript("OnClick",
+			      function(self, button, down)
+				      local cprof = GetTradeSkillLine()
+				      local current_prof = Player["Profession"]
+
+				      if addon.Frame:IsVisible() then
+					      if IsShiftKeyDown() and not IsAltKeyDown() and not IsControlKeyDown() then
+						      -- Shift only (Text dump)
+						      addon:Scan(true)
+					      elseif not IsShiftKeyDown() and IsAltKeyDown() and not IsControlKeyDown() then
+						      -- Alt only (Wipe icons from map)
+						      addon:ClearMap()
+					      elseif not IsShiftKeyDown() and not IsAltKeyDown() and not IsControlKeyDown() and current_prof == cprof then
+						      -- If we have the same profession open, then we close the scanned window
+						      addon.Frame:Hide()
+					      elseif not IsShiftKeyDown() and not IsAltKeyDown() and not IsControlKeyDown() then
+						      -- If we have a different profession open we do a scan
+						      addon:Scan(false)
+						      addon:SetupMap()
+					      end
+				      else
+					      if IsShiftKeyDown() and not IsAltKeyDown() and not IsControlKeyDown() then
+						      -- Shift only (Text dump)
+						      addon:Scan(true)
+					      elseif not IsShiftKeyDown() and IsAltKeyDown() and not IsControlKeyDown() then
+						      -- Alt only (Wipe icons from map)
+						      addon:ClearMap()
+					      elseif not IsShiftKeyDown() and not IsAltKeyDown() and not IsControlKeyDown() then
+						      -- No modification
+						      addon:Scan(false)
+						      addon:SetupMap()
+					      end
+				      end
+			      end)
+
+	scan_button:SetScript("OnEnter",
+			      function(this)
+				      GameTooltip_SetDefaultAnchor(GameTooltip, this)
+				      GameTooltip:SetText(L["SCAN_RECIPES_DESC"])
+				      GameTooltip:Show()
+			      end)
+	scan_button:SetScript("OnLeave", function() GameTooltip:Hide() end)
+	scan_button:SetText(L["Scan"])
+
+	self.scan_button = scan_button
+
+	-------------------------------------------------------------------------------
+	-- Populate the profession initialization functions.
+	-------------------------------------------------------------------------------
+	PROFESSION_INITS[GetSpellInfo(51304)] = addon.InitAlchemy
+	PROFESSION_INITS[GetSpellInfo(51300)] = addon.InitBlacksmithing
+	PROFESSION_INITS[GetSpellInfo(51296)] = addon.InitCooking
+	PROFESSION_INITS[GetSpellInfo(51313)] = addon.InitEnchanting
+	PROFESSION_INITS[GetSpellInfo(51306)] = addon.InitEngineering
+	PROFESSION_INITS[GetSpellInfo(45542)] = addon.InitFirstAid
+	PROFESSION_INITS[GetSpellInfo(51302)] = addon.InitLeatherworking
+	PROFESSION_INITS[GetSpellInfo(32606)] = addon.InitSmelting
+	PROFESSION_INITS[GetSpellInfo(51309)] = addon.InitTailoring
+	PROFESSION_INITS[GetSpellInfo(51311)] = addon.InitJewelcrafting
+	PROFESSION_INITS[GetSpellInfo(45363)] = addon.InitInscription
+	PROFESSION_INITS[GetSpellInfo(53428)] = addon.InitRuneforging
+
+	-------------------------------------------------------------------------------
+	-- Initialize the databases
+	-------------------------------------------------------------------------------
+	self:InitCustom(CustomList)
+	self:InitMob(MobList)
+	self:InitQuest(QuestList)
+	self:InitReputation(ReputationList)
+	self:InitTrainer(TrainerList)
+	self:InitSeasons(SeasonalList)
+	self:InitVendor(VendorList)
+
+	-------------------------------------------------------------------------------
+	-- Hook GameTooltip so we can show information on mobs that drop/sell/train
+	-------------------------------------------------------------------------------
+        GameTooltip:HookScript("OnTooltipSetUnit",
+		       function(self)
+			       local name, unit = self:GetUnit()
+
+			       if not unit then
+				       return
+			       end
+			       local guid = UnitGUID(unit)
+
+			       if not guid then
+				       return
+			       end
+			       local GUID = tonumber(string.sub(guid, 8, 12), 16)
+			       local mob = MobList[GUID]
+			       local shifted = IsShiftKeyDown()
+
+			       if mob and mob["DropList"] then
+				       for spell_id in pairs(mob["DropList"]) do
+					       local recipe = RecipeList[spell_id]
+
+					       if not recipe["Known"] or shifted then
+						       local _, _, _, hex = GetItemQualityColor(recipe["Rarity"])
+
+						       self:AddLine("Drops: "..hex..recipe["Name"].."|r ("..recipe["Level"]..")")
+					       end
+				       end
+				       return
+			       end
+			       local vendor = VendorList[GUID]
+
+			       if vendor and vendor["SellList"] then
+				       for spell_id in pairs(vendor["SellList"]) do
+					       local recipe = RecipeList[spell_id]
+					       local skill_level = Player["Professions"][GetSpellInfo(recipe["Profession"])]
+					       local has_skill = skill_level and skill_level >= recipe["Level"]
+
+					       if ((not recipe["Known"] and has_skill) or shifted) and Player:IsCorrectFaction(recipe["Flags"]) then
+						       local _, _, _, hex = GetItemQualityColor(recipe["Rarity"])
+
+						       self:AddLine("Sells: "..hex..recipe["Name"].."|r ("..recipe["Level"]..")")
+					       end
+				       end
+				       return
+			       end
+			       local trainer = TrainerList[GUID]
+
+			       if trainer and trainer["TrainList"] then
+				       for spell_id in pairs(trainer["TrainList"]) do
+					       local recipe = RecipeList[spell_id]
+					       local skill_level = Player["Professions"][GetSpellInfo(recipe["Profession"])]
+					       local has_skill = skill_level and skill_level >= recipe["Level"]
+
+					       if ((not recipe["Known"] and has_skill) or shifted) and Player:IsCorrectFaction(recipe["Flags"]) then
+						       local _, _, _, hex = GetItemQualityColor(recipe["Rarity"])
+
+						       self:AddLine("Trains: "..hex..recipe["Name"].."|r ("..recipe["Level"]..")")
+					       end
+				       end
+				       return
+			       end
+		       end)
+end
+
+---Function run when the addon is enabled.  Registers events and pre-loads certain variables.
+function addon:OnEnable()
+	self:RegisterEvent("TRADE_SKILL_SHOW")	-- Make addon respond to the tradeskill windows being shown
+	self:RegisterEvent("TRADE_SKILL_CLOSE")	-- Addon responds to tradeskill windows being closed.
+
+	if addon.db.profile.scantrainers then
+		self:RegisterEvent("TRAINER_SHOW")
+	end
+
+	if addon.db.profile.scanvendors then
+		self:RegisterEvent("MERCHANT_SHOW")
+	end
+
+	-------------------------------------------------------------------------------
+	-- Set the parent and scripts for addon.scan_button.
+	-------------------------------------------------------------------------------
+	local scan_button = self.scan_button
+
+	if Skillet and Skillet:IsActive() then
+		scan_button:SetParent(SkilletFrame)
+		Skillet:AddButtonToTradeskillWindow(scan_button)
+		scan_button:SetWidth(80)
+	elseif MRTUIUtils_RegisterWindowOnShow then
+		MRTUIUtils_RegisterWindowOnShow(function()
+							scan_button:SetParent(MRTSkillFrame)
+							scan_button:ClearAllPoints()
+							scan_button:SetPoint("RIGHT", MRTSkillFrameCloseButton, "LEFT", 4, 0)
+							scan_button:SetWidth(scan_button:GetTextWidth() + 10)
+							scan_button:Show()
+						end)
+  	elseif ATSWFrame then
+		scan_button:SetParent(ATSWFrame)
+		scan_button:ClearAllPoints()
+
+		if TradeJunkieMain and TJ_OpenButtonATSW then
+			scan_button:SetPoint("RIGHT", TJ_OpenButtonATSW, "LEFT", 0, 0)
+		else
+			scan_button:SetPoint("RIGHT", ATSWOptionsButton, "LEFT", 0, 0)
+		end
+		scan_button:SetHeight(ATSWOptionsButton:GetHeight())
+		scan_button:SetWidth(ATSWOptionsButton:GetWidth())
+	elseif CauldronFrame then
+		scan_button:SetParent(CauldronFrame)
+		scan_button:ClearAllPoints()
+		scan_button:SetPoint("TOP", CauldronFrame, "TOPRIGHT", -58, -52)
+		scan_button:SetWidth(90)
+	end
+
+	local buttonparent = scan_button:GetParent()
+	local framelevel = buttonparent:GetFrameLevel()
+	local framestrata = buttonparent:GetFrameStrata()
+
+	-- Set the frame level of the button to be 1 deeper than its parent
+	scan_button:SetFrameLevel(framelevel + 1)
+	scan_button:SetFrameStrata(framestrata)
+	scan_button:Enable()
+
+	-- Add an option so that ARL will work with Manufac
+	if Manufac then
+		Manufac.options.args.ARLScan = {
+			type = 'execute',
+			name = L["Scan"],
+			desc = L["SCAN_RECIPES_DESC"],
+			func = function() addon:Scan(false) end,
+			order = 550,
+		}
+	end
+
+--[[
+	-- If we're using Skillet, use Skillet's API to work with getting tradeskills
+	if (Skillet) and (Skillet.GetNumTradeSkills) and
+	(Skillet.GetTradeSkillLine) and (Skillet.GetTradeSkillInfo) and
+	(Skillet.GetTradeSkillRecipeLink) and (Skillet.ExpandTradeSkillSubClass) then
+		self:Print("Enabling Skillet advanced features.")
+		GetNumTradeSkills = function(...) return Skillet:GetNumTradeSkills(...) end
+		GetTradeSkillLine = function(...) return Skillet:GetTradeSkillLine(...) end
+		GetTradeSkillInfo = function(...) return Skillet:GetTradeSkillInfo(...) end
+		GetTradeSkillRecipeLink = function(...) return Skillet:GetTradeSkillRecipeLink(...) end
+		ExpandTradeSkillSubClass = function(...) return Skillet:ExpandTradeSkillSubClass(...) end
+	end
+]]--
+	-------------------------------------------------------------------------------
+	-- Initialize the main panel frame.
+	-------------------------------------------------------------------------------
+	self:InitializeFrame()
+	self.InitializeFrame = nil
+
+	-------------------------------------------------------------------------------
+	-- Initialize the player's data.
+	-------------------------------------------------------------------------------
+	do
+		Player["Faction"] = UnitFactionGroup("player")
+		Player["Class"] = select(2, UnitClass("player"))
+
+		-------------------------------------------------------------------------------
+		-- Get the player's reputation levels.
+		-------------------------------------------------------------------------------
+		Player["Reputation"] = {}
+		Player:SetReputationLevels()
+
+		-------------------------------------------------------------------------------
+		-- Get the player's professions.
+		-------------------------------------------------------------------------------
+		Player["Professions"] = {
+			[GetSpellInfo(51304)] = false, -- Alchemy
+			[GetSpellInfo(51300)] = false, -- Blacksmithing
+			[GetSpellInfo(51296)] = false, -- Cooking
+			[GetSpellInfo(51313)] = false, -- Enchanting
+			[GetSpellInfo(51306)] = false, -- Engineering
+			[GetSpellInfo(45542)] = false, -- First Aid
+			[GetSpellInfo(51302)] = false, -- Leatherworking
+			[GetSpellInfo(32606)] = false, -- Mining
+			[GetSpellInfo(51309)] = false, -- Tailoring
+			[GetSpellInfo(51311)] = false, -- Jewelcrafting
+			[GetSpellInfo(45363)] = false, -- Inscription
+			[GetSpellInfo(53428)] = false, -- Runeforging
+		}
+		Player:SetProfessions()
+	end	-- do
+
+	-------------------------------------------------------------------------------
+	-- Initialize the SpecialtyTable and AllSpecialtiesTable.
+	-------------------------------------------------------------------------------
+	do
+		local AlchemySpec = {
+			[GetSpellInfo(28674)] = 28674,
+			[GetSpellInfo(28678)] = 28678,
+			[GetSpellInfo(28676)] = 28676,
+		}
+
+		local BlacksmithSpec = {
+			[GetSpellInfo(9788)] = 9788,	-- Armorsmith
+			[GetSpellInfo(17041)] = 17041,	-- Master Axesmith
+			[GetSpellInfo(17040)] = 17040,	-- Master Hammersmith
+			[GetSpellInfo(17039)] = 17039,	-- Master Swordsmith
+			[GetSpellInfo(9787)] = 9787,	-- Weaponsmith
+		}
+
+		local EngineeringSpec = {
+			[GetSpellInfo(20219)] = 20219, -- Gnomish
+			[GetSpellInfo(20222)] = 20222, -- Goblin
+		}
+
+		local LeatherworkSpec = {
+			[GetSpellInfo(10657)] = 10657, -- Dragonscale
+			[GetSpellInfo(10659)] = 10659, -- Elemental
+			[GetSpellInfo(10661)] = 10661, -- Tribal
+		}
+
+		local TailorSpec = {
+			[GetSpellInfo(26797)] = 26797, -- Spellfire
+			[GetSpellInfo(26801)] = 26801, -- Shadoweave
+			[GetSpellInfo(26798)] = 26798, -- Primal Mooncloth
+		}
+
+		SpecialtyTable = {
+			[GetSpellInfo(51304)] = AlchemySpec,
+			[GetSpellInfo(51300)] = BlacksmithSpec,
+			[GetSpellInfo(51306)] = EngineeringSpec,
+			[GetSpellInfo(51302)] = LeatherworkSpec,
+			[GetSpellInfo(51309)] = TailorSpec,
+		}
+
+		-- Populate the Specialty table with all Specialties, adding alchemy even though no recipes have alchemy filters
+		for i in pairs(AlchemySpec) do AllSpecialtiesTable[i] = true end
+		for i in pairs(BlacksmithSpec) do AllSpecialtiesTable[i] = true end
+		for i in pairs(EngineeringSpec) do AllSpecialtiesTable[i] = true end
+		for i in pairs(LeatherworkSpec) do AllSpecialtiesTable[i] = true end
+		for i in pairs(TailorSpec) do AllSpecialtiesTable[i] = true end
+	end	-- do
+end
+
+---Run when the addon is disabled. Ace3 takes care of unregistering events, etc.
+function addon:OnDisable()
+	addon.Frame:Hide()
+
+	-- Remove the option from Manufac
+	if Manufac then
+		Manufac.options.args.ARLScan = nil
+	end
+end
+
+-------------------------------------------------------------------------------
+-- Event handling functions
+-------------------------------------------------------------------------------
+
+---Event used for datamining when a trainer is shown.
+function addon:TRAINER_SHOW()
+	self:ScanSkillLevelData(true)
+	self:ScanTrainerData(true)
+end
+
+function addon:MERCHANT_SHOW()
+	addon:ScanVendor()
+end
+
+do
+	local GetTradeSkillListLink = _G.GetTradeSkillListLink
+	local UnitName = _G.UnitName
+	local GetRealmName = _G.GetRealmName
+	local IsTradeSkillLinked = _G.IsTradeSkillLinked
+
+	function addon:TRADE_SKILL_SHOW()
+		-- If this is our own skill, save it, if not don't save it
+		if not IsTradeSkillLinked() then
+			local tradelink = GetTradeSkillListLink()
+
+			if tradelink then
+				local pname = UnitName("player")
+				local prealm = GetRealmName()
+				local tradename = GetTradeSkillLine()
+
+				-- Actual alt information saved here. -Torhal
+				addon.db.global.tradeskill = addon.db.global.tradeskill or {}
+				addon.db.global.tradeskill[prealm] = addon.db.global.tradeskill[prealm] or {}
+				addon.db.global.tradeskill[prealm][pname] = addon.db.global.tradeskill[prealm][pname] or {}
+
+				addon.db.global.tradeskill[prealm][pname][tradename] = tradelink
+			end
+		end
+		local scan_button = self.scan_button
+		local scan_parent = self.scan_button:GetParent()
+
+		if not scan_parent or scan_parent == UIParent then
+			scan_button:SetParent(TradeSkillFrame)
+			scan_button:ClearAllPoints()
+
+			local loc = addon.db.profile.scanbuttonlocation
+
+			if loc == "TR" then
+				scan_button:SetPoint("RIGHT", TradeSkillFrameCloseButton, "LEFT",4,0)
+			elseif loc == "TL" then
+				scan_button:SetPoint("LEFT", TradeSkillFramePortrait, "RIGHT",2,12)
+			elseif loc == "BR" then
+				scan_button:SetPoint("TOP", TradeSkillCancelButton, "BOTTOM",0,-5)
+			elseif loc == "BL" then
+				scan_button:SetPoint("TOP", TradeSkillCreateAllButton, "BOTTOM",0,-5)
+			end
+			scan_button:SetWidth(scan_button:GetTextWidth() + 10)
+		end
+		self.scan_button:Show()
+	end
+end
+
+function addon:TRADE_SKILL_CLOSE()
+	if addon.db.profile.closeguionskillclose then
+		self.Frame:Hide()
+	end
+
+	if not Skillet then
+		addon.scan_button:Hide()
+	end
+end
+
+-------------------------------------------------------------------------------
+-- Tradeskill functions
+-- Recipe DB Structures are defined in Documentation.lua
+-------------------------------------------------------------------------------
+
+--- Adds a tradeskill recipe into the specified recipe database.
+-- @name AckisRecipeList:addTradeSkill
+-- @usage AckisRecipeList:addTradeSkill(RecipeDB,2329,1,2454,1,2259,0,1,55,75,95)
+-- @param RecipeDB The database (array) which you wish to add data too.
+-- @param SpellID The [[http://www.wowwiki.com/SpellLink | Spell ID]] of the recipe being added to the database.
+-- @param SkillLevel The skill level at which the recipe may be learned.
+-- @param ItemID The [[http://www.wowwiki.com/ItemLink | Item ID]] that is created by the recipe, or nil
+-- @param Rarity The rarity of the recipe.
+-- @param Profession The profession ID that uses the recipe.  See [[database-documentation]] for a listing of profession IDs.
+-- @param Specialty The specialty that uses the recipe (ie: goblin engineering) or nil or blank
+-- @param Game Game version recipe was found in, for example, Original, BC, or Wrath.
+-- @param Orange Level at which recipe is considered orange.
+-- @param Yellow Level at which recipe is considered yellow.
+-- @param Green Level at which recipe is considered green.
+-- @param Grey Level at which recipe is considered grey.
+-- @return None, array is passed as a reference.
+function addon:addTradeSkill(RecipeDB, SpellID, SkillLevel, ItemID, Rarity, Profession, Specialty, Game, Orange, Yellow, Green, Grey)
+	local spellLink = GetSpellLink(SpellID)
+	local profession_id = GetSpellInfo(Profession)
+	local recipe_name = GetSpellInfo(SpellID)
+
+	if RecipeDB[SpellID] then
+		--@alpha@
+		self:Print("Duplicate recipe: "..profession_id.." "..tostring(SpellID).." "..recipe_name)
+		--@end-alpha@
+		return
+	end
+
+	-------------------------------------------------------------------------------
+	-- Create a table inside the RecipeListing table which stores all information
+	-- about a recipe
+	-------------------------------------------------------------------------------
+	RecipeDB[SpellID] = {
+		["Level"] = SkillLevel,
+		["ItemID"] = ItemID,
+		["Rarity"] = Rarity,
+		["Profession"] = profession_id,
+		["Locations"] = nil,
+		["RecipeLink"] = spellLink,
+		["Name"] = recipe_name,
+		["Display"] = true,				-- Set to be displayed until the filtering occurs
+		["Search"] = true,				-- Set to be showing in the search results
+		["Flags"] = {},					-- Create the flag space in the RecipeDB
+		["Acquire"] = {},				-- Create the Acquire space in the RecipeDB
+		["Specialty"] = Specialty,			-- Assumption: there will only be 1 speciality for a trade skill
+		["Game"] = Game,
+		["Orange"] = Orange or SkillLevel,		-- If we don't have an orange value in the db, just assume the skill level
+		["Yellow"] = Yellow or SkillLevel + 10,		-- If we don't have a yellow value in the db, just assume the skill level
+		["Green"] = Green or SkillLevel + 15,		-- If we don't have a green value in the db, just assume the skill level
+		["Grey"] = Grey or SkillLevel + 20,		-- If we don't have a grey value in the db, just assume the skill level
+	}
+	local recipe = RecipeDB[SpellID]
+
+	if not recipe["Name"] then
+		self:Print(strformat(L["SpellIDCache"], SpellID))
+	end
+
+	-- Set all the flags to be false, will also set the padding spaces to false as well.
+	for i = 1, NUM_FILTER_FLAGS, 1 do
+		recipe["Flags"][i] = false
+	end
+end
+
+--- Adds filtering flags to a specific tradeskill.
+-- @name AckisRecipeList:addTradeFlags
+-- @usage AckisRecipeList:addTradeFlags(RecipeDB,2329,1,2,3,21,22,23,24,25,26,27,28,29,30,36,41,51,52)
+-- @param RecipeDB The database (array) which you wish to add flags too.
+-- @param SpellID The [[http://www.wowwiki.com/SpellLink | Spell ID]] of the recipe which flags are being added to.
+-- @param ... A listing of filtering flags.  See [[database-documentation]] for a listing of filtering flags.
+-- @return None, array is passed as a reference.
+function addon:addTradeFlags(RecipeDB, SpellID, ...)
+	-- flags are defined in Documentation.lua
+	local numvars = select('#',...)
+	local flags = RecipeDB[SpellID]["Flags"]
+
+	-- Find out how many flags we're adding
+	for i = 1, numvars, 1 do
+		-- Get the value of the current flag
+		local flag = select(i, ...)
+		flags[flag] = true
+	end
+end
+
+--- Adds acquire methods to a specific tradeskill.
+-- @name AckisRecipeList:addTradeAcquire
+-- @usage AckisRecipeList:addTradeAcquire:(RecipeDB,2329,8,8)
+-- @param RecipeDB The database (array) which you wish to add acquire methods too.
+-- @param SpellID The [[http://www.wowwiki.com/SpellLink | Spell ID]] of the recipe which acquire methods are being added to.
+-- @param ... A listing of acquire methods.  See [[database-documentation]] for a listing of acquire methods and how they behave.
+-- @return None, array is passed as a reference.
+do
+	-- Tables for getting the locations
+	local location_list = {}
+	local location_checklist = {}
+
+	local function LocationSort(a, b)
+		return a < b
+	end
+
+	function addon:addTradeAcquire(DB, SpellID, ...)
+		local numvars = select('#', ...)	-- Find out how many flags we're adding
+		local index = 1				-- Index for the number of Acquire entries we have
+		local i = 1				-- Index for which variables we're parsing through
+		local acquire = DB[SpellID]["Acquire"]
+
+		twipe(location_list)
+		twipe(location_checklist)
+
+		while i < numvars do
+			local acquire_type, acquire_id = select(i, ...)
+			i = i + 2
+
+			--@alpha@
+			if acquire[index] then
+				self:Print("addTradeAcquire called more than once for SpellID "..SpellID)
+			end
+			--@end-alpha@
+
+			acquire[index] = {
+				["Type"] = acquire_type,
+				["ID"] = acquire_id
+			}
+			local location
+
+			if not acquire_type then
+				self:Print("SpellID: "..SpellID.." has no acquire type.")
+			elseif acquire_type == A_TRAINER then
+				if not acquire_id then
+					--@alpha@
+					self:Print("SpellID "..SpellID..": TrainerID is nil.")
+					--@end-alpha@
+				elseif not TrainerList[acquire_id] then
+					--@alpha@
+					self:Print("SpellID "..SpellID..": TrainerID "..acquire_id.." does not exist in the database.")
+					--@end-alpha@
+				else
+					location = TrainerList[acquire_id]["Location"]
+
+					if not location_checklist[location] then
+						tinsert(location_list, location)
+						location_checklist[location] = true
+					end
+					TrainerList[acquire_id]["TrainList"] = TrainerList[acquire_id]["TrainList"] or {}
+					TrainerList[acquire_id]["TrainList"][SpellID] = true
+				end
+			elseif acquire_type == A_VENDOR then
+				if not acquire_id then
+					--@alpha@
+					self:Print("SpellID "..SpellID..": VendorID is nil.")
+					--@end-alpha@
+				elseif not VendorList[acquire_id] then
+					--@alpha@
+					self:Print("SpellID "..SpellID..": VendorID "..acquire_id.." does not exist in the database.")
+					--@end-alpha@
+				else
+					location = VendorList[acquire_id]["Location"]
+
+					if not location_checklist[location] then
+						tinsert(location_list, location)
+						location_checklist[location] = true
+					end
+					VendorList[acquire_id]["SellList"] = VendorList[acquire_id]["SellList"] or {}
+					VendorList[acquire_id]["SellList"][SpellID] = true
+				end
+			elseif acquire_type == A_MOB then
+				if not acquire_id then
+					--@alpha@
+					self:Print("SpellID "..SpellID..": MobID is nil.")
+					--@end-alpha@
+				elseif not MobList[acquire_id] then
+					--@alpha@
+					self:Print("SpellID "..SpellID..": Mob ID "..acquire_id.." does not exist in the database.")
+					--@end-alpha@
+				else
+					location = MobList[acquire_id]["Location"]
+
+					if not location_checklist[location] then
+						tinsert(location_list, location)
+						location_checklist[location] = true
+					end
+					MobList[acquire_id]["DropList"] = MobList[acquire_id]["DropList"] or {}
+					MobList[acquire_id]["DropList"][SpellID] = true
+				end
+			elseif acquire_type == A_QUEST then
+				if not acquire_id then
+					--@alpha@
+					self:Print("SpellID "..SpellID..": QuestID is nil.")
+					--@end-alpha@
+				elseif not QuestList[acquire_id] then
+					--@alpha@
+					self:Print("SpellID "..SpellID..": Quest ID "..acquire_id.." does not exist in the database.")
+					--@end-alpha@
+				else
+					location = QuestList[acquire_id]["Location"]
+
+					if not location_checklist[location] then
+						tinsert(location_list, location)
+						location_checklist[location] = true
+					end
+				end
+				--@alpha@
+			elseif acquire_type == A_SEASONAL then
+				if not acquire_id then
+					self:Print("SpellID "..SpellID..": SeasonalID is nil.")
+				end
+				--@end-alpha@
+			elseif acquire_type == A_REPUTATION then
+				local RepLevel, RepVendor = select(i, ...)
+				i = i + 2
+
+				acquire[index]["RepLevel"] = RepLevel
+				acquire[index]["RepVendor"] = RepVendor
+				VendorList[RepVendor]["SellList"] = VendorList[RepVendor]["SellList"] or {}
+				VendorList[RepVendor]["SellList"][SpellID] = true
+
+				location = VendorList[RepVendor]["Location"]
+
+				if not location_checklist[location] then
+					tinsert(location_list, location)
+					location_checklist[location] = true
+				end
+
+				--@alpha@
+				if not acquire_id then
+					self:Print("SpellID "..SpellID..": ReputationID is nil.")
+				elseif not ReputationList[acquire_id] then
+					self:Print("SpellID "..SpellID..": ReputationID "..acquire_id.." does not exist in the database.")
+				end
+
+				if not RepVendor then
+					self:Print("SpellID "..SpellID..": Reputation VendorID is nil.")
+				elseif not VendorList[RepVendor] then
+					self:Print("SpellID "..SpellID..": Reputation VendorID "..RepVendor.." does not exist in the database.")
+				end
+				--@end-alpha@
+			elseif acquire_type == A_WORLD_DROP then
+				local location = L["World Drop"]
+
+				if not location_checklist[location] then
+					tinsert(location_list, location)
+					location_checklist[location] = true
+				end
+			end
+			index = index + 1
+		end
+		-- Populate the location field with all the data
+		table.sort(location_list, LocationSort)
+		DB[SpellID]["Locations"] = (#location_list == 0 and "" or tconcat(location_list, ", "))
+	end
+end	-- do block
+
+--- Adds an item to a specific database listing (ie: vendor, mob, etc)
+-- @name AckisRecipeList:addLookupList
+-- @usage AckisRecipeList:addLookupList:(VendorDB,NPC ID, NPC Name, NPC Location, X Coord, Y Coord, Faction)
+-- @param DB Database which the entry will be stored.
+-- @param ID Unique identified for the entry.
+-- @param Name Name of the entry.
+-- @param Loc Location of the entry in the world.
+-- @param Coordx X coordinate of where the entry is found.
+-- @param Coordy Y coordinate of where the entry is found.
+-- @param Faction Faction identifier for the entry.
+-- @return None, array is passed as a reference.
+--For individual database structures, see Documentation.lua
+do
+	local FACTION_NAMES = {
+		[1]	= BFAC["Neutral"],
+		[2]	= BFAC["Alliance"],
+		[3]	= BFAC["Horde"]
+	}
+	function addon:addLookupList(DB, ID, Name, Loc, Coordx, Coordy, Faction)
+		if DB[ID] then
+			--@alpha@
+			self:Print("Duplicate lookup: "..tostring(ID).." "..Name)
+			--@end-alpha@
+			return
+		end
+
+		DB[ID] = {
+			["Name"]	= Name,
+			["Location"]	= Loc or L["Unknown Zone"],
+			["Faction"]	= Faction and FACTION_NAMES[Faction + 1] or nil
+		}
+		if Coordx and Coordy then
+			DB[ID]["Coordx"] = Coordx
+			DB[ID]["Coordy"] = Coordy
+		end
+
+		--@alpha@
+		if not Loc then
+			self:Print("Spell ID: " .. ID .. " (" .. DB[ID]["Name"] .. ") has an unknown location.")
+		end
+		--@end-alpha@
+	end
+end	-- do
+
+-------------------------------------------------------------------------------
+-- Filter flag functions
+-------------------------------------------------------------------------------
+do
+	local F_ALLIANCE, F_HORDE = 1, 2
+
+	-------------------------------------------------------------------------------
+	-- Item "rarity"
+	-------------------------------------------------------------------------------
+	local R_COMMON, R_UNCOMMON, R_RARE, R_EPIC, R_LEGENDARY, R_ARTIFACT = 1, 2, 3, 4, 5, 6
+
+	-- HardFilterFlags and SoftFilterFlags are used to determine if a recipe should be shown based on the value of the key compared to the value of its saved_var.
+	-- Its keys and values are populated the first time CanDisplayRecipe() is called.
+	local HardFilterFlags, SoftFilterFlags, RepFilterFlags
+
+	local F_DK, F_DRUID, F_HUNTER, F_MAGE, F_PALADIN, F_PRIEST, F_SHAMAN, F_ROGUE, F_WARLOCK, F_WARRIOR = 21, 22, 23, 24, 25, 26, 27, 28, 29, 30
+	local ClassFilterFlags = {
+		["deathknight"]	= F_DK,		["druid"]	= F_DRUID,	["hunter"]	= F_HUNTER,
+		["mage"]	= F_MAGE,	["paladin"]	= F_PALADIN,	["priest"]	= F_PRIEST,
+		["shaman"]	= F_SHAMAN,	["rogue"]	= F_ROGUE,	["warlock"]	= F_WARLOCK,
+		["warrior"]	= F_WARRIOR,
+	}
+
+	---Scans a specific recipe to determine if it is to be displayed or not.
+	local function CanDisplayRecipe(recipe)
+		-------------------------------------------------------------------------------
+		-- Origin
+		-------------------------------------------------------------------------------
+		local GAME_ORIG, GAME_TBC, GAME_WOTLK = 0, 1, 2
+
+		-- For flag info see comments at start of file in comments
+		local filter_db = addon.db.profile.filters
+		local general_filters = filter_db.general
+		local recipe_flags = recipe["Flags"]
+
+		-- See Documentation file for logic explanation
+		-------------------------------------------------------------------------------
+		-- Stage 1
+		-- Loop through exclusive flags (hard filters)
+		-- If one of these does not pass we do not display the recipe
+		-- So to be more efficient we'll just leave this function if there's a false
+		-------------------------------------------------------------------------------
+
+		-- Display both horde and alliance factions?
+		if not general_filters.faction and not Player:IsCorrectFaction(recipe_flags) then
+			return false
+		end
+
+		-- Display all skill levels?
+		if not general_filters.skill and recipe["Level"] > Player["ProfessionLevel"] then
+			return false
+		end
+
+		-- Display all specialities?
+		if not general_filters.specialty then
+			local specialty = recipe["Specialty"]
+
+			if specialty and specialty ~= Player["Specialty"] then
+				return false
+			end
+		end
+		local obtain_filters = filter_db.obtain
+		local game_version = recipe["Game"]
+
+		-- Filter out game recipes
+		if not obtain_filters.originalwow and game_version == GAME_ORIG then
+			return false
+		end
+
+		if not obtain_filters.bc and game_version == GAME_TBC then
+			return false
+		end
+
+		if not obtain_filters.wrath and game_version == GAME_WOTLK then
+			return false
+		end
+
+		-------------------------------------------------------------------------------
+		-- Check the hard filter flags
+		-------------------------------------------------------------------------------
+		if not HardFilterFlags then
+			local F_IBOE, F_IBOP, F_IBOA, F_RBOE, F_RBOP, F_RBOA = 36, 37, 38, 40, 41, 42
+			local F_DPS, F_TANK, F_HEALER, F_CASTER = 51, 52, 53, 54
+			local F_CLOTH, F_LEATHER, F_MAIL, F_PLATE, F_CLOAK, F_TRINKET, F_RING, F_NECK, F_SHIELD = 56, 57, 58, 59, 60, 61, 62, 63, 64
+			local F_1H, F_2H, F_AXE, F_SWORD, F_MACE, F_POLEARM, F_DAGGER = 66, 67, 68, 69, 70, 71, 72
+			local F_STAFF, F_WAND, F_THROWN, F_BOW, F_XBOW, F_AMMO, F_FIST, F_GUN = 73, 74, 75, 76, 77, 78, 79, 80
+
+			local binding_filters	= filter_db.binding
+			local player_filters	= filter_db.player
+			local armor_filters	= filter_db.item.armor
+			local weapon_filters	= filter_db.item.weapon
+
+			HardFilterFlags = {
+				------------------------------------------------------------------------------------------------
+				-- Binding flags.
+				------------------------------------------------------------------------------------------------
+				["itemboe"]	= { flag = F_IBOE,	sv_root = binding_filters },
+				["itembop"]	= { flag = F_IBOP,	sv_root = binding_filters },
+				["itemboa"]	= { flag = F_IBOA,	sv_root = binding_filters },
+				["recipeboe"]	= { flag = F_RBOE,	sv_root = binding_filters },
+				["recipebop"]	= { flag = F_RBOP,	sv_root = binding_filters },
+				["recipeboa"]	= { flag = F_RBOA,	sv_root = binding_filters },
+				------------------------------------------------------------------------------------------------
+				-- Player Type flags.
+				------------------------------------------------------------------------------------------------
+				["melee"]	= { flag = F_DPS,	sv_root = player_filters },
+				["tank"]	= { flag = F_TANK,	sv_root = player_filters },
+				["healer"]	= { flag = F_HEALER,	sv_root = player_filters },
+				["caster"]	= { flag = F_CASTER,	sv_root = player_filters },
+				------------------------------------------------------------------------------------------------
+				-- Armor flags.
+				------------------------------------------------------------------------------------------------
+				["cloth"]	= { flag = F_CLOTH,	sv_root = armor_filters },
+				["leather"]	= { flag = F_LEATHER,	sv_root = armor_filters },
+				["mail"]	= { flag = F_MAIL,	sv_root = armor_filters },
+				["plate"]	= { flag = F_PLATE,	sv_root = armor_filters },
+				["trinket"]	= { flag = F_TRINKET,	sv_root = armor_filters },
+				["cloak"]	= { flag = F_CLOAK,	sv_root = armor_filters },
+				["ring"]	= { flag = F_RING,	sv_root = armor_filters },
+				["necklace"]	= { flag = F_NECK,	sv_root = armor_filters },
+				["shield"]	= { flag = F_SHIELD,	sv_root = armor_filters },
+				------------------------------------------------------------------------------------------------
+				-- Weapon flags.
+				------------------------------------------------------------------------------------------------
+				["onehand"]	= { flag = F_1H,	sv_root = weapon_filters },
+				["twohand"]	= { flag = F_2H,	sv_root = weapon_filters },
+				["axe"]		= { flag = F_AXE,	sv_root = weapon_filters },
+				["sword"]	= { flag = F_SWORD,	sv_root = weapon_filters },
+				["mace"]	= { flag = F_MACE,	sv_root = weapon_filters },
+				["polearm"]	= { flag = F_POLEARM,	sv_root = weapon_filters },
+				["dagger"]	= { flag = F_DAGGER,	sv_root = weapon_filters },
+				["fist"]	= { flag = F_FIST,	sv_root = weapon_filters },
+				["gun"]		= { flag = F_GUN,	sv_root = weapon_filters },
+				["staff"]	= { flag = F_STAFF,	sv_root = weapon_filters },
+				["wand"]	= { flag = F_WAND,	sv_root = weapon_filters },
+				["thrown"]	= { flag = F_THROWN,	sv_root = weapon_filters },
+				["bow"]		= { flag = F_BOW,	sv_root = weapon_filters },
+				["crossbow"]	= { flag = F_XBOW,	sv_root = weapon_filters },
+				["ammo"]	= { flag = F_AMMO,	sv_root = weapon_filters },
+			}
+		end
+
+		for filter, data in pairs(HardFilterFlags) do
+			if recipe_flags[data.flag] and not data.sv_root[filter] then
+				return false
+			end
+		end
+
+		-------------------------------------------------------------------------------
+		-- Check the reputation filter flags
+		-------------------------------------------------------------------------------
+		if not RepFilterFlags then
+			local rep_filters = filter_db.rep
+
+			local F_ARGENTDAWN, F_CENARION_CIRCLE, F_THORIUM_BROTHERHOOD, F_TIMBERMAW_HOLD, F_ZANDALAR = 96, 97, 98, 99, 100
+			local F_ALDOR, F_ASHTONGUE, F_CENARION_EXPEDITION, F_HELLFIRE, F_CONSORTIUM = 101, 102, 103, 104, 105
+			local F_KOT, F_LOWERCITY, F_NAGRAND, F_SCALE_SANDS, F_SCRYER, F_SHATAR = 106, 107, 108, 109, 110, 111
+			local F_SHATTEREDSUN, F_SPOREGGAR, F_VIOLETEYE = 112, 113, 114
+			local F_ARGENTCRUSADE, F_FRENZYHEART, F_EBONBLADE, F_KIRINTOR, F_HODIR = 115, 116, 117, 118, 119
+			local F_KALUAK, F_ORACLES, F_WYRMREST, F_WRATHCOMMON1, F_WRATHCOMMON2 = 120, 121, 122, 123, 124
+			local F_WRATHCOMMON3, F_WRATHCOMMON4, F_WRATHCOMMON5, F_ASHEN_VERDICT = 125, 126, 127, 128
+
+			RepFilterFlags = {
+				[F_ARGENTDAWN]		= rep_filters.argentdawn,
+				[F_CENARION_CIRCLE]	= rep_filters.cenarioncircle,
+				[F_THORIUM_BROTHERHOOD]	= rep_filters.thoriumbrotherhood,
+				[F_TIMBERMAW_HOLD]	= rep_filters.timbermaw,
+				[F_ZANDALAR]		= rep_filters.zandalar,
+				[F_ALDOR]		= rep_filters.aldor,
+				[F_ASHTONGUE]		= rep_filters.ashtonguedeathsworn,
+				[F_CENARION_EXPEDITION]	= rep_filters.cenarionexpedition,
+				[F_HELLFIRE]		= rep_filters.hellfire,
+				[F_CONSORTIUM]		= rep_filters.consortium,
+				[F_KOT]			= rep_filters.keepersoftime,
+				[F_LOWERCITY]		= rep_filters.lowercity,
+				[F_NAGRAND]		= rep_filters.nagrand,
+				[F_SCALE_SANDS]		= rep_filters.scaleofthesands,
+				[F_SCRYER]		= rep_filters.scryer,
+				[F_SHATAR]		= rep_filters.shatar,
+				[F_SHATTEREDSUN]	= rep_filters.shatteredsun,
+				[F_SPOREGGAR]		= rep_filters.sporeggar,
+				[F_VIOLETEYE]		= rep_filters.violeteye,
+				[F_ARGENTCRUSADE]	= rep_filters.argentcrusade,
+				[F_FRENZYHEART]		= rep_filters.frenzyheart,
+				[F_EBONBLADE]		= rep_filters.ebonblade,
+				[F_KIRINTOR]		= rep_filters.kirintor,
+				[F_HODIR]		= rep_filters.sonsofhodir,
+				[F_KALUAK]		= rep_filters.kaluak,
+				[F_ORACLES]		= rep_filters.oracles,
+				[F_WYRMREST]		= rep_filters.wyrmrest,
+				[F_WRATHCOMMON1]	= rep_filters.wrathcommon1,
+				[F_WRATHCOMMON2]	= rep_filters.wrathcommon2,
+				[F_WRATHCOMMON3]	= rep_filters.wrathcommon3,
+				[F_WRATHCOMMON4]	= rep_filters.wrathcommon4,
+				[F_WRATHCOMMON5]	= rep_filters.wrathcommon5,
+				[F_ASHEN_VERDICT]	= rep_filters.ashenverdict,
+			}
+		end
+		local rep_display = true
+
+		for flag in pairs(RepFilterFlags) do
+			if recipe_flags[flag] then
+				rep_display = RepFilterFlags[flag] and true or false
+			end
+		end
+
+		if not rep_display then
+			return false
+		end
+
+		-------------------------------------------------------------------------------
+		-- Check the class filter flags
+		-------------------------------------------------------------------------------
+		local toggled_off, toggled_on = 0, 0
+		local class_filters = filter_db.classes
+
+		-- Now we check to see if _all_ of the pertinent class flags are toggled off. If even one is toggled on, we still show the recipe.
+		for class, flag in pairs(ClassFilterFlags) do
+			if recipe_flags[flag] then
+				if class_filters[class] then
+					toggled_on = toggled_on + 1
+				elseif not class_filters[class] then
+					toggled_off = toggled_off + 1
+				end
+			end
+		end
+
+		if toggled_off > 0 and toggled_on == 0 then
+			return false
+		end
+
+		------------------------------------------------------------------------------------------------
+		-- Stage 2
+		-- loop through nonexclusive (soft filters) flags until one is true
+		-- If one of these is true (ie: we want to see trainers and there is a trainer flag) we display the recipe
+		------------------------------------------------------------------------------------------------
+		if not SoftFilterFlags then
+			local F_TRAINER, F_VENDOR, F_INSTANCE, F_RAID, F_SEASONAL, F_QUEST, F_PVP, F_WORLD_DROP, F_MOB_DROP, F_DISC = 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
+
+			SoftFilterFlags = {
+				["trainer"]	= { flag = F_TRAINER,		sv_root = obtain_filters },
+				["vendor"]	= { flag = F_VENDOR,		sv_root = obtain_filters },
+				["instance"]	= { flag = F_INSTANCE,		sv_root = obtain_filters },
+				["raid"]	= { flag = F_RAID,		sv_root = obtain_filters },
+				["seasonal"]	= { flag = F_SEASONAL,		sv_root = obtain_filters },
+				["quest"]	= { flag = F_QUEST,		sv_root = obtain_filters },
+				["pvp"]		= { flag = F_PVP,		sv_root = obtain_filters },
+				["worlddrop"]	= { flag = F_WORLD_DROP,	sv_root = obtain_filters },
+				["mobdrop"]	= { flag = F_MOB_DROP,		sv_root = obtain_filters },
+				["discovery"]	= { flag = F_DISC,		sv_root = obtain_filters },
+			}
+		end
+
+		for filter, data in pairs(SoftFilterFlags) do
+			if recipe_flags[data.flag] and data.sv_root[filter] then
+				return true
+			end
+		end
+
+		-- If we get here it means that no flags matched our values
+		return false
+	end
+
+	---Scans the recipe listing and updates the filters according to user preferences
+	function addon:UpdateFilters()
+		local general_filters = addon.db.profile.filters.general
+		local recipes_total = 0
+		local recipes_known = 0
+		local recipes_total_filtered = 0
+		local recipes_known_filtered = 0
+		local can_display = false
+		local current_profession = Player["Profession"]
+
+		for recipe_id, recipe in pairs(RecipeList) do
+			if recipe["Profession"] == current_profession then
+				local is_known = recipe["Known"]
+
+				can_display = CanDisplayRecipe(recipe)
+				recipes_total = recipes_total + 1
+				recipes_known = recipes_known + (is_known and 1 or 0)
+
+				if can_display then
+					recipes_total_filtered = recipes_total_filtered + 1
+					recipes_known_filtered = recipes_known_filtered + (is_known and 1 or 0)
+
+					if not general_filters.known and is_known then
+						can_display = false
+					end
+
+					if not general_filters.unknown and not is_known then
+						can_display = false
+					end
+				end
+			else
+				can_display = false
+			end
+			RecipeList[recipe_id]["Display"] = can_display
+		end
+		Player.recipes_total = recipes_total
+		Player.recipes_known = recipes_known
+		Player.recipes_total_filtered = recipes_total_filtered
+		Player.recipes_known_filtered = recipes_known_filtered
+		end
+
+end	-- do
+
+-------------------------------------------------------------------------------
+-- ARL Logic Functions
+-------------------------------------------------------------------------------
+
+---Determines which profession we are dealing with and loads up the recipe information for it.
+local function InitializeRecipe(profession)
+	if not profession then
+		--@alpha@
+		addon:Print("nil profession passed to InitializeRecipe()")
+		--@end-alpha@
+		return
+	end
+	local func = PROFESSION_INITS[profession]
+
+	if func then
+		return func(addon, RecipeList)
+	else
+		addon:Print(L["UnknownTradeSkill"]:format(profession))
+		return 0
+	end
+end
+
+---Determines what to do when the slash command is called.
+function addon:ChatCommand(input)
+
+	-- Open About panel if there's no parameters or if we do /arl about
+	if not input or (input and input:trim() == "") or input == strlower(L["Sorting"]) or input == strlower(L["Sort"])  or input == strlower(_G.DISPLAY) then
+		InterfaceOptionsFrame_OpenToCategory(self.optionsFrame)
+	elseif (input == strlower(L["About"])) then
+		if (self.optionsFrame["About"]) then
+			InterfaceOptionsFrame_OpenToCategory(self.optionsFrame["About"])
+		else
+			InterfaceOptionsFrame_OpenToCategory(self.optionsFrame)
+		end
+	elseif (input == strlower(L["Profile"])) then
+		InterfaceOptionsFrame_OpenToCategory(self.optionsFrame["Profiles"])
+	elseif (input == strlower(_G.FILTER)) then
+		InterfaceOptionsFrame_OpenToCategory(self.optionsFrame["Filters"])
+	elseif (input == strlower(L["Documentation"])) then
+		InterfaceOptionsFrame_OpenToCategory(self.optionsFrame["Documentation"])
+	elseif (input == strlower(L["Scan"])) then
+		self:Scan(false)
+	elseif (input == strlower("scandata")) then
+		self:ScanSkillLevelData()
+	elseif (input == strlower("scanprof")) then
+		self:ScanProfession("all")
+	else
+		-- What happens when we get here?
+		LibStub("AceConfigCmd-3.0"):HandleCommand("arl", "Ackis Recipe List", input)
+	end
+
+end
+
+-------------------------------------------------------------------------------
+-- Recipe Scanning Functions
+-------------------------------------------------------------------------------
+do
+	-- List of tradeskill headers, used in addon:Scan()
+	local header_list = {}
+
+	--- Causes a scan of the tradeskill to be conducted. Function called when the scan button is clicked.   Parses recipes and displays output
+	-- @name AckisRecipeList:Scan
+	-- @usage AckisRecipeList:Scan(true)
+	-- @param textdump Boolean indicating if we want the output to be a text dump, or if we want to use the ARL GUI.
+	-- @return A frame with either the text dump, or the ARL frame.
+	function addon:Scan(textdump)
+		local scan_parent = self.scan_button:GetParent()
+
+		-- The scan button is re-parented to whichever interface it's anchored to, whether it's TradeSkillFrame or a replacement AddOn,
+		-- so we make sure its parent exists and is visible before proceeding.
+		if not scan_parent or scan_parent == UIParent or not scan_parent:IsVisible() then
+			self:Print(L["OpenTradeSkillWindow"])
+			return
+		end
+		local current_prof, prof_level = GetTradeSkillLine()
+
+		-- Set the current profession and its level, and update the cached data.
+		Player["Profession"] = current_prof
+		Player["ProfessionLevel"] = prof_level
+
+		-- Make sure we're only updating a profession the character actually knows - this could be a scan from a tradeskill link.
+		if not IsTradeSkillLinked() and Player["Professions"][current_prof] then
+			Player["Professions"][current_prof] = prof_level
+		end
+
+		-- Get the current profession Specialty
+		local specialty = SpecialtyTable[Player["Profession"]]
+
+		for index = 1, 25, 1 do
+			local spellName = GetSpellName(index, BOOKTYPE_SPELL)
+
+			if not spellName or index == 25 then
+				Player["Specialty"] = nil
+				break
+			elseif specialty and specialty[spellName] then
+				Player["Specialty"] = specialty[spellName]
+				break
+			end
+		end
+
+		-- Add the recipes to the database
+		-- TODO: Figure out what this variable was supposed to be for - it isn't used anywhere. -Torhal
+		Player.totalRecipes = InitializeRecipe(Player["Profession"])
+
+		--- Set the known flag to false for every recipe in the database.
+		for SpellID in pairs(RecipeList) do
+			RecipeList[SpellID]["Known"] = false
+		end
+
+		-------------------------------------------------------------------------------
+		-- Scan all recipes and mark the ones we know
+		-------------------------------------------------------------------------------
+		twipe(header_list)
+
+		if MRTUIUtils_PushFilterSelection then
+			MRTUIUtils_PushFilterSelection()
+		else
+			if not Skillet and TradeSkillFrameAvailableFilterCheckButton:GetChecked() then
+				TradeSkillFrameAvailableFilterCheckButton:SetChecked(false)
+				TradeSkillOnlyShowMakeable(false)
+			end
+
+			-- Clear the inventory slot filter
+			UIDropDownMenu_Initialize(TradeSkillInvSlotDropDown, TradeSkillInvSlotDropDown_Initialize)
+			UIDropDownMenu_SetSelectedID(TradeSkillInvSlotDropDown, 1)
+			SetTradeSkillInvSlotFilter(0, 1, 1)
+
+			-- Clear the sub-classes filters
+			UIDropDownMenu_Initialize(TradeSkillSubClassDropDown, TradeSkillSubClassDropDown_Initialize)
+			UIDropDownMenu_SetSelectedID(TradeSkillSubClassDropDown, 1)
+			SetTradeSkillSubClassFilter(0, 1, 1)
+
+			-- Expand all headers so we can see all the recipes there are
+			for i = GetNumTradeSkills(), 1, -1 do
+				local name, tradeType, _, isExpanded = GetTradeSkillInfo(i)
+
+				if tradeType == "header" and not isExpanded then
+					header_list[name] = true
+					ExpandTradeSkillSubClass(i)
+				end
+			end
+		end
+		local recipes_found = 0
+
+		for i = 1, GetNumTradeSkills() do
+			local tradeName, tradeType = GetTradeSkillInfo(i)
+
+			if tradeType ~= "header" then
+				-- Get the trade skill link for the specified recipe
+				local SpellLink = GetTradeSkillRecipeLink(i)
+				local SpellString = strmatch(SpellLink, "^|c%x%x%x%x%x%x%x%x|H%w+:(%d+)")
+				local recipe = RecipeList[tonumber(SpellString)]
+
+				if recipe then
+					recipe["Known"] = true
+					recipes_found = recipes_found + 1
+				else
+					self:Print(self:Red(tradeName .. " " .. SpellString) .. self:White(L["MissingFromDB"]))
+				end
+			end
+		end
+
+		-- Close all the headers we've opened
+		-- If Mr Trader is installed use that API
+		if MRTUIUtils_PopFilterSelection then
+			MRTUIUtils_PopFilterSelection()
+		else
+			-- Collapse all headers that were collapsed before
+			for i = GetNumTradeSkills(), 1, -1 do
+				local name, tradeType, _, isExpanded = GetTradeSkillInfo(i)
+
+				if header_list[name] then
+					CollapseTradeSkillSubClass(i)
+				end
+			end
+		end
+		-- TODO: Figure out what this variable was supposed to be for - it isn't used anywhere. -Torhal
+		Player.foundRecipes = recipes_found
+
+		self:UpdateFilters()
+		Player:MarkExclusions()
+
+		if textdump then
+			self:DisplayTextDump(RecipeList, Player["Profession"])
+		else
+			self:DisplayFrame()
+		end
+	end
+end
+
+-------------------------------------------------------------------------------
+-- Recipe Exclusion Functions
+-------------------------------------------------------------------------------
+---Removes or adds a recipe to the exclusion list.
+function addon:ToggleExcludeRecipe(SpellID)
+	local exclusion_list = addon.db.profile.exclusionlist
+
+	exclusion_list[SpellID] = (not exclusion_list[SpellID] and true or nil)
+end
+
+---Prints all the ID's in the exclusion list out into chat.
+function addon:ViewExclusionList()
+	local exclusion_list = addon.db.profile.exclusionlist
+
+	-- Parse all items in the exclusion list
+	for i in pairs(exclusion_list) do
+		self:Print(i .. ": " .. GetSpellInfo(i))
+	end
+end
+
+function addon:ClearExclusionList()
+	local exclusion_list = addon.db.profile.exclusionlist
+
+	exclusion_list = twipe(exclusion_list)
+end
+
+-------------------------------------------------------------------------------
+-- Text dumping functions
+-------------------------------------------------------------------------------
+do
+	-------------------------------------------------------------------------------
+	-- Provides a string of comma separated values for all recipe information
+	-------------------------------------------------------------------------------
+	local text_table = {}
+	local acquire_list = {}
+
+	local ACQUIRE_NAMES = {
+		[A_TRAINER]	= "Trainer",
+		[A_VENDOR]	= "Vendor",
+		[A_MOB]		= "Mob Drop",
+		[A_QUEST]	= "Quest",
+		[A_SEASONAL]	= "Seasonal",
+		[A_REPUTATION]	= "Reputation",
+		[A_WORLD_DROP]	= "World Drop",
+		[A_CUSTOM]	= "Custom",
+	}
+
+	function addon:GetTextDump(RecipeDB, profession)
+		twipe(text_table)
+
+		tinsert(text_table, strformat("Ackis Recipe List Text Dump for %s.  ", profession))
+		tinsert(text_table, "Text output of all recipes and acquire information.  Output is in the form of comma separated values.\n")
+		tinsert(text_table, "Spell ID,Recipe Name,Skill Level,ARL Filter Flags,Acquire Methods,Known\n")
+
+		for SpellID in pairs(RecipeDB) do
+			local recipe_prof = GetSpellInfo(RecipeDB[SpellID]["Profession"])
+
+			if recipe_prof == profession then
+				-- Add Spell ID, Name and Skill Level to the list
+				tinsert(text_table, SpellID)
+				tinsert(text_table, ",")
+				tinsert(text_table, RecipeDB[SpellID]["Name"])
+				tinsert(text_table, ",")
+				tinsert(text_table, RecipeDB[SpellID]["Level"])
+				tinsert(text_table, ",\"")
+
+				-- Add in all the filter flags
+				local recipe_flags = RecipeDB[SpellID]["Flags"]
+				local prev
+
+				-- Find out which flags are marked as "true"
+				for i = 1, NUM_FILTER_FLAGS, 1 do
+					if recipe_flags[i] then
+						if prev then
+							tinsert(text_table, ",")
+						end
+						tinsert(text_table, i)
+						prev = true
+					end
+				end
+				tinsert(text_table, "\",\"")
+
+				-- Find out which unique acquire methods we have
+				local acquire = RecipeDB[SpellID]["Acquire"]
+				twipe(acquire_list)
+
+				for i in pairs(acquire) do
+					local acquire_type = acquire[i]["Type"]
+
+					acquire_list[ACQUIRE_NAMES[acquire_type]] = true
+				end
+
+				-- Add all the acquire methods in
+				prev = false
+
+				for i in pairs(acquire_list) do
+					if prev then
+						tinsert(text_table, ",")
+					end
+					tinsert(text_table, i)
+					prev = true
+				end
+
+				if (RecipeDB[SpellID]["Known"]) then
+					tinsert(text_table, "\",true\n")
+				else
+					tinsert(text_table, "\",false\n")
+				end
+			end
+		end
+		return tconcat(text_table, "")
+	end
+
+end
+
+---Clears all saved tradeskills
+function addon:ClearSavedSkills()
+	twipe(addon.db.global.tradeskill)
+
+	if addon.db.profile.tradeskill then
+		addon.db.profile.tradeskill = nil
+	end
+
+end
+
+-------------------------------------------------------------------------------
+-- API to interface with external AddOns.
+-------------------------------------------------------------------------------
+--- Initialize the recipe database with a specific profession
+-- @name AckisRecipeList:AddRecipeData
+-- @usage AckisRecipeList:AddRecipeData(GetSpellInfo(51304))
+-- @param profession Spell ID of the profession which you want to populate the database with.
+-- @return Boolean indicating if the operation was successful.  The recipe database will be populated with appropriate data.
+function addon:AddRecipeData(profession)
+	return InitializeRecipe(profession)
+end
+
+--- Initialize the recipe database
+-- @name AckisRecipeList:InitRecipeData
+-- @usage AckisRecipeList:InitRecipeData()
+-- @return Boolean indicating if the operation was successful.  The recipe database will be populated with appropriate data.
+-- @return Arrays containing the RecipeList, MobList, TrainerList, VendorList, QuestList, ReputationList, SeasonalList.
+function addon:InitRecipeData()
+	return false, RecipeList, MobList, TrainerList, VendorList, QuestList, ReputationList, SeasonalList
+end
+
+--- Get recipe information from ARL
+-- @name AckisRecipeList:GetRecipeData
+-- @param spellID The spell ID of the recipe you want information about.
+-- @return Table containing all spell ID information or nil if it's not found.
+function addon:GetRecipeData(spellID)
+	return RecipeList[spellID]
+end
diff --git a/ARLColour.lua b/ARLColour.lua
deleted file mode 100644
index 0b9c7d0..0000000
--- a/ARLColour.lua
+++ /dev/null
@@ -1,320 +0,0 @@
---[[
-
-****************************************************************************************
-
-ARLColour.lua
-
-Colouring functions for ARL
-
-File date: @file-date-iso@
-File revision: @file-revision@
-Project revision: @project-revision@
-Project version: @project-version@
-
-Code adopted from Crayon library
-
-****************************************************************************************
-
-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.
-
-************************************************************************
-
-]]--
-
-
-local MODNAME			= "Ackis Recipe List"
-local addon				= LibStub("AceAddon-3.0"):GetAddon(MODNAME)
-
---[[
-
-	Colour constants
-
-]]--
-
-local RED		= "ff0000"
-local ORANGE	= "ff7f00"
-local YELLOW	= "ffff00"
-local GREEN		= "00ff00"
-local WHITE		= "ffffff"
-local COPPER	= "eda55f"
-local SILVER	= "c7c7cf"
-local GOLD		= "ffd700"
-local PURPLE	= "9980CC"
-local BLUE		= "0000ff"
-local CYAN		= "00ffff"
-local BLACK		= "000000"
-local GREY		= "666666"
-local MIDGREY	= "858585"
-local NEUTRAL	= "bfbfbf"
-local FRIENDLY	= WHITE
-local HONORED	= "00ff00"
-local REVERED	= "3f66e5"
-local EXALTED	= "9933cc"
-
-local TRAINER	= "d9cb9e"
-local VENDOR	= "aad372"
-local QUEST		= "2359ff"
-local REP		= "ff7c0a"
-local SEASON	= "80590e"
-local MOBDROP	= "ffffc0"
-
-local POOR		= "919191"
-local COMMON	= WHITE
-local UNCOMMON	= "00A900"
-local RARE		= "0062C3"
-local EPIC		= "B343FF"
-local LEGENDARY	= "FA9900"
-local ARTIFACT	= "e5cc80"
-
-local HIGH		= WHITE
-local NORMAL	= "ffd100"
-
-local HORDE		= RED
-local ALLIANCE	= "00ffff"
-
---[[
-
-	Text colourization functions
-
-]]--
-
-function addon:RGBtoHEX(r,g,b)
-	return string.format("%2x%2x%2x", r*255, g*255, b*255)
-end
-
-
--- Changes any string of text to the specified hex colour
-function addon:Colourize(hexColour, text)
-
-	return "|cff" .. tostring(hexColour or 'ffffff') .. tostring(text) .. "|r"
-
-end
-
--- Converts text to Neutral Colour
-function addon:Neutral(text)
-	return self:Colourize(NEUTRAL, text)
-end
-
--- Converts text to Friendly Colour
-function addon:Friendly(text)
-	return self:Colourize(FRIENDLY, text)
-end
-
--- Converts text to Honored Colour
-function addon:Honored(text)
-	return self:Colourize(HONORED, text)
-end
-
--- Converts text to Revered Colour
-function addon:Revered(text)
-	return self:Colourize(REVERED, text)
-end
-
--- Converts text to Exalted Colour
-function addon:Exalted(text)
-	return self:Colourize(EXALTED, text)
-end
-
-function addon:Horde(text)
-	return self:Colourize(RED, text)
-end
-
-function addon:Alliance(text)
-	return self:Colourize(CYAN, text)
-end
-
-function addon:Coords(text)
-	return self:Colourize(WHITE, text)
-end
-
-function addon:Trainer(text)
-	return self:Colourize(TRAINER, text)
-end
-
-function addon:Vendor(text)
-	return self:Colourize(VENDOR, text)
-end
-
-function addon:Quest(text)
-	return self:Colourize(QUEST, text)
-end
-
-function addon:Rep(text)
-	return self:Colourize(REP, text)
-end
-
-function addon:Season(text)
-	return self:Colourize(SEASON, text)
-end
-
-function addon:MobDrop(text)
-	return self:Colourize(MOBDROP, text)
-end
-
--- Rarity Colors
-function addon:Poor(text)
-	return self:Colourize(POOR, text)
-end
-
-function addon:Common(text)
-	return self:Colourize(COMMON, text)
-end
-
-function addon:Uncommon(text)
-	return self:Colourize(UNCOMMON, text)
-end
-
-function addon:Rare(text)
-	return self:Colourize(RARE, text)
-end
-
-function addon:Epic(text)
-	return self:Colourize(EPIC, text)
-end
-
-function addon:Legendary(text)
-	return self:Colourize(LEGENDARY, text)
-end
-
-function addon:Artifact(text)
-	return self:Colourize(ARTIFACT, text)
-end
-
-function addon:RarityColor(rarityColor, text)
-	if (rarityColor == 1) then
-		return self:Colourize(POOR, text)
-	elseif (rarityColor == 2) then
-		return self:Colourize(COMMON, text)
-	elseif (rarityColor == 3) then
-		return self:Colourize(UNCOMMON, text)
-	elseif (rarityColor == 4) then
-		return self:Colourize(RARE, text)
-	elseif (rarityColor == 5) then
-		return self:Colourize(EPIC, text)
-	elseif (rarityColor == 6) then
-		return self:Colourize(LEGENDARY, text)
-	else
-		return self:Colourize(ARTIFACT, text)
-	end
-end
-
--- Converts text to Red
-function addon:Red(text)
-	return self:Colourize(RED, text)
-end
-
--- Converts text to Orange
-function addon:Orange(text)
-	return self:Colourize(ORANGE, text)
-end
-
--- Converts text to Yellow
-function addon:Yellow(text)
-	return self:Colourize(YELLOW, text)
-end
-
--- Converts text to Green
-function addon:Green(text)
-	return self:Colourize(GREEN, text)
-end
-
--- Converts text to White
-function addon:White(text)
-	return self:Colourize(WHITE, text)
-end
-
--- Converts text to Copper
-function addon:Copper(text)
-	return self:Colourize(COPPER, text)
-end
-
--- Converts text to Silver
-function addon:Silver(text)
-	return self:Colourize(SILVER, text)
-end
-
--- Converts text to Gold
-function addon:Gold(text)
-	return self:Colourize(GOLD, text)
-end
-
--- Converts text to Purple
-function addon:Purple(text)
-	return self:Colourize(PURPLE, text)
-end
-
--- Converts text to Blue
-function addon:Blue(text)
-	return self:Colourize(BLUE, text)
-end
-
--- Converts text to Cyan
-function addon:Cyan(text)
-	return self:Colourize(CYAN, text)
-end
-
--- Converts text to Black
-function addon:Black(text)
-	return self:Colourize(BLACK, text)
-end
-
--- Converts text to Grey
-function addon:Grey(text)
-	return self:Colourize(GREY, text)
-end
-
--- Converts text to Middle Grey
-function addon:MidGrey(text)
-	return self:Colourize(MIDGREY, text)
-end
-
--- Standard bliz yellowish sort of thing
-function addon:Normal(text)
-	return self:Colourize(NORMAL, text)
-end
-
--- used for tooltip rgb stuff
-function addon:hexcolor(colorstring)
-	if (colorstring == "NEUTRAL")			then return NEUTRAL
-	elseif (colorstring == "FRIENDLY")		then return FRIENDLY
-	elseif (colorstring == "HONORED")		then return HONORED
-	elseif (colorstring == "REVERED")		then return REVERED
-	elseif (colorstring == "EXALTED")		then return EXALTED
-
-	elseif (colorstring == "TRAINER")		then return TRAINER
-	elseif (colorstring == "VENDOR")		then return VENDOR
-	elseif (colorstring == "QUEST")			then return QUEST
-	elseif (colorstring == "REP")			then return REP
-	elseif (colorstring == "SEASON")		then return SEASON
-	elseif (colorstring == "MOBDROP")		then return MOBDROP
-
-	elseif (colorstring == "POOR")			then return POOR
-	elseif (colorstring == "COMMON")		then return COMMON
-	elseif (colorstring == "UNCOMMON")		then return UNCOMMON
-	elseif (colorstring == "RARE")			then return RARE
-	elseif (colorstring == "EPIC")			then return EPIC
-	elseif (colorstring == "LEGENDARY")		then return LEGENDARY
-	elseif (colorstring == "ARTIFACT")		then return ARTIFACT
-
-	elseif (colorstring == "HORDE")			then return HORDE
-	elseif (colorstring == "ALLIANCE")		then return ALLIANCE
-
-	elseif (colorstring == "BLACK")			then return BLACK
-	elseif (colorstring == "ORANGE")		then return ORANGE
-	elseif (colorstring == "GREEN")			then return GREEN
-	elseif (colorstring == "YELLOW")		then return YELLOW
-	elseif (colorstring == "GREY")			then return GREY
-	elseif (colorstring == "MIDGREY")		then return MIDGREY
-	elseif (colorstring == "RED")			then return RED
-
-	elseif (colorstring == "HIGH")			then return HIGH
---	elseif (colorstring == "NORMAL")		then return NORMAL
-	else
-		return NORMAL
-	end
-end
\ No newline at end of file
diff --git a/ARLConfig.lua b/ARLConfig.lua
deleted file mode 100644
index 54e9c85..0000000
--- a/ARLConfig.lua
+++ /dev/null
@@ -1,701 +0,0 @@
---[[
-
-****************************************************************************************
-
-ARLConfig.lua
-
-Ace3 Configuration options for ARL
-
-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.
-
-************************************************************************
-
-]]--
-
-local MODNAME		= "Ackis Recipe List"
-local addon		= LibStub("AceAddon-3.0"):GetAddon(MODNAME)
-
-local BFAC		= LibStub("LibBabble-Faction-3.0"):GetLookupTable()
-local LC		= LOCALIZED_CLASS_NAMES_MALE
-local L			= LibStub("AceLocale-3.0"):GetLocale(MODNAME)
-
-local AceConfig 	= LibStub("AceConfig-3.0")
-local AceConfigReg 	= LibStub("AceConfigRegistry-3.0")
-local AceConfigDialog 	= LibStub("AceConfigDialog-3.0")
-
-local modularOptions = {}
-
-local function giveProfiles()
-	return LibStub("AceDBOptions-3.0"):GetOptionsTable(addon.db)
-end
-
-local function ResetGUI()
-	addon.db.profile.frameopts.offsetx = 0
-	addon.db.profile.frameopts.offsety = 0
-	addon.db.profile.frameopts.anchorTo = ""
-	addon.db.profile.frameopts.anchorFrom = ""
-	addon.db.profile.frameopts.uiscale = 1
-	addon.db.profile.frameopts.tooltipscale = .9
-	addon.db.profile.frameopts.fontsize = 11
-end
-
-local options
-
-local function fullOptions()
-	if not options then
-		options = {
-			type = "group",
-			name = MODNAME,
-			args = {
-				general = {
-					order	= 1,
-					type	= "group",
-					name	= L["Main Options"],
-					desc	= L["MAIN_OPTIONS_DESC"],
-					args	= {
-						header1 = {
-							order	= 10,
-							type	= "header",
-							name	= L["General Options"],
-						},
-						version = {
-							order	= 11,
-							type	= "description",
-							name	= _G.GAME_VERSION_LABEL .. ": " .. addon.version .. "\n",
-						},
-						run = {
-							order	= 12,
-							type	= "execute",
-							name	= L["Scan"],
-							desc	= L["SCAN_RECIPES_DESC"],
-							func	= function(info) addon:Scan(false) end,
-						},
-						textdump = {
-							order	= 13,
-							type	= "execute",
-							name	= L["Text Dump"],
-							desc	= L["TEXT_DUMP_DESC"],
-							func	= function(info) addon:Scan(true) end,
-						},
-						exclusionlist = {
-							order	= 14,
-							type	= "execute",
-							name	= L["View Exclusion List"],
-							desc	= L["VIEW_EXCLUSION_LIST_DESC"],
-							func	= function(info) addon:ViewExclusionList() end,
-						},
-						clearexclusionlist = {
-							order	= 15,
-							type	= "execute",
-							name	= L["Clear Exclusion List"],
-							desc	= L["CLEAR_EXCLUSION_LIST_DESC"],
-							func	= function(info) addon:ClearExclusionList() end,
-						},
-						resetallfilters = {
-							order	= 16,
-							type	= "execute",
-							name	= L["Reset All Filters"],
-							desc	= L["RESET_DESC"],
-							func	= function(info) addon.resetFilters() end,
-						},
-						resetguiwindow = {
-							order	= 17,
-							type	= "execute",
-							name	= L["Reset Window Position"],
-							desc	= L["RESET_WINDOW_DESC"],
-							func	= function(info) ResetGUI() end,
-						},
-						spacer1 = {
-							order	= 19,
-							type	= "description",
-							name	= "\n",
-						},
-						header1a = {
-							order	= 20,
-							type	= "header",
-							name	= L["Main Filter Options"],
-						},
-						mainfilter_desc = {
-							order	= 21,
-							type	= "description",
-							name	= L["MAINFILTER_OPTIONS_DESC"] .. "\n",
-						},
-						includefiltered = {
-							order	= 22,
-							type	= "toggle",
-							name	= L["Include Filtered"],
-							desc	= L["FILTERCOUNT_DESC"],
-							get		= function() return addon.db.profile.includefiltered end,
-							set		= function() addon.db.profile.includefiltered = not addon.db.profile.includefiltered end,
-						},
-						includeexcluded = {
-							order	= 23,
-							type	= "toggle",
-							name	= L["Include Excluded"],
-							desc	= L["EXCLUDECOUNT_DESC"],
-							get		= function() return addon.db.profile.includeexcluded end,
-							set		= function() addon.db.profile.includeexcluded = not addon.db.profile.includeexcluded end,
-						},
-						ignoreexclusionlist = {
-							order	= 24,
-							type	= "toggle",
-							name	= L["Display Exclusions"],
-							desc	= L["DISPLAY_EXCLUSION_DESC"],
-							get		= function() return addon.db.profile.ignoreexclusionlist end,
-							set		= function() addon.db.profile.ignoreexclusionlist = not addon.db.profile.ignoreexclusionlist end,
-						},
-						spacer2 = {
-							order	= 39,
-							type	= "description",
-							name	= "\n",
-						},
-						header3 = {
-							order	= 40,
-							type	= "header",
-							name	= L["Sorting Options"],
-						},
-						sort_desc =	{
-							order	= 41,
-							type	= "description",
-							name	= L["SORTING_OPTIONS_DESC"] .. "\n",
-						},
-						sorting = {
-							order	= 45,
-							type	= "select",
-							name	= L["Sorting"],
-							desc	= L["SORTING_DESC"],
-							get	= function()
-									  return addon.db.profile.sorting
-								  end,
-							set	= function(info, name)
-									  addon.db.profile.sorting = name
-								  end,
-							values	= function()
-									  return {
-										  Name = _G.NAME,
-										  SkillAsc = L["Skill (Asc)"],
-										  SkillDesc = L["Skill (Desc)"],
-										  Acquisition = L["Acquisition"],
-										  Location = L["Location"]
-									  }
-								  end,
-						},
-					},
-				},
-			},
-		}
-
-		for k,v in pairs(modularOptions) do
-			options.args[k] = (type(v) == "function") and v() or v
-		end
-
-	end
-
-	return options
-
-end
-
-local arlmap = nil
-
-local function giveMap()
-
-	local tomtomsupport = true
-
-	if ((TomTom) or ((TomTom) and (Carbonite))) then
-		tomtomsupport = false
-	end
-
-	if (not arlmap) then
-
-	arlmap = {
-			order	= 1,
-			type	= "group",
-			name	= L["Map Options"],
-			desc	= L["MAP_OPTIONS_DESC"],
-			args	= {
-				map_desc =	{
-					order	= 1,
-					type	= "description",
-					name	= L["MAP_OPTIONS_DESC"] .. "\n",
-				},
-				autoscanmap = {
-					order	= 2,
-					type	= "toggle",
-					name	= L["Auto Scan Map"],
-					desc	= L["AUTOSCANMAP_DESC"],
-					disabled = tomtomsupport,
-					get		= function() return addon.db.profile.autoscanmap end,
-					set		= function() addon.db.profile.autoscanmap = not addon.db.profile.autoscanmap end,
-				},
-				worldmap = {
-					order	= 3,
-					type	= "toggle",
-					name	= _G.WORLD_MAP,
-					desc	= L["WORLDMAP_DESC"],
-					disabled = tomtomsupport,
-					get		= function() return addon.db.profile.worldmap end,
-					set		= function() addon.db.profile.worldmap = not addon.db.profile.worldmap end,
-				},
-				minimap = {
-					order	= 4,
-					type	= "toggle",
-					name	= L["Mini Map"],
-					desc	= L["MINIMAP_DESC"],
-					disabled = tomtomsupport,
-					get		= function() return addon.db.profile.minimap end,
-					set		= function() addon.db.profile.minimap = not addon.db.profile.minimap end,
-				},
-				maptrainer = {
-					order	= 5,
-					type	= "toggle",
-					name	= L["Trainer"],
-					desc	= L["MAP_TRAINER_DESC"],
-					disabled = tomtomsupport,
-					get		= function() return addon.db.profile.maptrainer end,
-					set		= function() addon.db.profile.maptrainer = not addon.db.profile.maptrainer end,
-				},
-				mapvendor = {
-					order	= 6,
-					type	= "toggle",
-					name	= L["Vendor"],
-					desc	= L["MAP_VENDOR_DESC"],
-					disabled = tomtomsupport,
-					get		= function() return addon.db.profile.mapvendor end,
-					set		= function() addon.db.profile.mapvendor = not addon.db.profile.mapvendor end,
-				},
-				mapmob = {
-					order	= 7,
-					type	= "toggle",
-					name	= L["Monster"],
-					desc	= L["MAP_MONSTER_DESC"],
-					disabled = tomtomsupport,
-					get		= function() return addon.db.profile.mapmob end,
-					set		= function() addon.db.profile.mapmob = not addon.db.profile.mapmob end,
-				},
-				mapquest = {
-					order	= 8,
-					type	= "toggle",
-					name	= L["Quest"],
-					desc	= L["MAP_QUEST_DESC"],
-					disabled = tomtomsupport,
-					get		= function() return addon.db.profile.mapquest end,
-					set		= function() addon.db.profile.mapquest = not addon.db.profile.mapquest end,
-				},
-				clearmap = {
-					order	= 20,
-					type	= "execute",
-					name	= L["Clear Waypoints"],
-					disabled = tomtomsupport,
-					desc	= L["CLEAR_WAYPOINTS_DESC"],
-					func	= function() addon:ClearMap() end,
-				},
-			},
-		}
-
-	end
-
-	return arlmap
-
-end
-
-local datamine = nil
-
-local function giveDatamine()
-
-	if (not datamine) then
-
-	datamine = {
-			order	= 1,
-			type	= "group",
-			name	= L["Datamine Options"],
-			desc	= L["DATAMINE_OPTIONS_DESC"],
-			args = {
-				datamine_desc =	{
-					order	= 1,
-					type	= "description",
-					name	= L["DATAMINE_OPTIONS_DESC"] .. "\n",
-				},
-				datamine_warn =	{
-					order	= 2,
-					type	= "description",
-					name	= L["DATAMINE_WARNING_DESC"] .. "\n",
-				},
-				generatelinks = {
-					order	= 73,
-					type	= "execute",
-					name	= L["Generate Tradeskill Links"],
-					desc	= L["GENERATE_LINKS_DESC"],
-					func	= function() addon:GenerateLinks() end,
-				},
-				scantrainerskills = {
-					order	= 75,
-					type	= "execute",
-					name	= L["Compare Trainer Skills"],
-					desc	= L["COMPARE_TRAINER_SKILL_DESC"],
-					func	= function() addon:ScanSkillLevelData() end,
-				},
-				scantraineracquire = {
-					order	= 76,
-					type	= "execute",
-					name	= L["Compare Trainer Acquire"],
-					desc	= L["COMPARE_TRAINER_ACQUIRE_DESC"],
-					func	= function() addon:ScanTrainerData() end,
-				},
-				scanentiredatabase = {
-					order	= 77,
-					type	= "execute",
-					name	= L["Scan Entire Database"],
-					desc	= L["SCAN_ENTIRE_DB_DESC"],
-					func	= function() addon:TooltipScanDatabase() end,
-				},
-				scanvendor = {
-					order	= 78,
-					type	= "execute",
-					name	= L["Scan Vendor"],
-					desc	= L["SCAN_VENDOR_DESC"],
-					func	= function() addon:ScanVendor() end,
-				},
-				scanprofessiontooltip = {
-					type = "input",
-					name = L["Scan Professions"],
-					desc = L["SCAN_PROF_DB_DESC"],
-					get = false,
-					set = function(info, v) addon:ScanProfession(v) end,
-					order = 79,
-				},
-				scanspellid = {
-					type = "input",
-					name = L["Scan Spell ID"],
-					desc = L["SCAN_SPELL_ID_DESC"],
-					get = false,
-					set = function(info, v) addon:TooltipScanRecipe(tonumber(v),false,false) end,
-					order = 80,
-				},
-				scantrainers = {
-					order	= 90,
-					type	= "toggle",
-					name	= L["Auto Scan Trainers"],
-					desc	= L["AUTOSCAN_TRAINERS_DESC"],
-					get		= function() return addon.db.profile.scantrainers end,
-					set		= function()
-									if (addon.db.profile.scantrainers) then
-										addon:UnregisterEvent("TRAINER_SHOW")
-									else
-										addon:RegisterEvent("TRAINER_SHOW")
-									end
-									addon.db.profile.scantrainers = not addon.db.profile.scantrainers
-								end,
-				},
-				scanvendors = {
-					order	= 91,
-					type	= "toggle",
-					name	= L["Auto Scan Vendors"],
-					desc	= L["AUTOSCAN_VENDORS_DESC"],
-					get		= function() return addon.db.profile.scanvendors end,
-					set		= function()
-									if (addon.db.profile.scanvendors) then
-										addon:UnregisterEvent("MERCHANT_SHOW")
-									else
-										addon:RegisterEvent("MERCHANT_SHOW")
-									end
-									addon.db.profile.scanvendors = not addon.db.profile.scanvendors
-								end,
-				},
-				autoloaddb = {
-					order	= 100,
-					type	= "toggle",
-					name	= L["Auto Load Recipe Database"],
-					desc	= L["AUTOLOAD_DB_DESC"],
-					get		= function() return addon.db.profile.autoloaddb end,
-					set		= function() addon.db.profile.autoloaddb = not addon.db.profile.autoloaddb end,
-				},
-			},
-		}
-
-	end
-
-	return datamine
-
-end
-
-local documentation = nil
-
-local function giveDocs()
-
-	if (not documentation) then
-
-		documentation = {
-			order = 1,
-			type = "group",
-			name = L["ARL Documentation"],
-			desc = L["ARL_DOC_DESC"],
-			args = {
-				header1 = {
-					order	= 1,
-					type	= "header",
-					name	= L["ARL Documentation"],
-				},
-				desc1 = {
-					order	= 2,
-					type	= "description",
-					name	= L["ARL_DOC_DESC"],
-				},
-				header2 = {
-					order	= 3,
-					type	= "header",
-					name	= L["Using Filters"],
-				},
-				desc2 = {
-					order	= 4,
-					type	= "description",
-					name	= L["USING_FILTERS_DESC"],
-				},
-				header3 = {
-					order	= 5,
-					type	= "header",
-					name	= L["Common Issues"],
-				},
-				desc3 = {
-					order	= 6,
-					type	= "description",
-					name	= L["COMMON_ISSUES_DESC"],
-				},
-				header4 = {
-					order	= 7,
-					type	= "header",
-					name	= L["Reporting Bugs"],
-				},
-				desc4 = {
-					order	= 8,
-					type	= "description",
-					name	= L["REPORTING_BUGS_DESC"],
-				},
-				header5 = {
-					order	= 9,
-					type	= "header",
-					name	= L["Exclusion Issues"],
-				},
-				desc5 = {
-					order	= 10,
-					type	= "description",
-					name	= L["EXCLUSION_ISSUES_DESC"],
-				},
-				header6 = {
-					order	= 11,
-					type	= "header",
-					name	= L["Map Issues"],
-				},
-				desc6 = {
-					order	= 12,
-					type	= "description",
-					name	= L["MAP_ISSUES_DESC"],
-				},
-				header7 = {
-					order	= 13,
-					type	= "header",
-					name	= L["Game Commands"],
-				},
-				desc7 = {
-					order	= 14,
-					type	= "description",
-					name	= L["GAME_COMMANDS_DESC"],
-				},
-			},
-		}
-
-	end
-
-	return documentation
-
-end
-
-local displayoptions = nil
-
-local function giveDisplay()
-	if not displayoptions then
-		displayoptions = {
-			order = 1,
-			type = "group",
-			name = L["Display Options"],
-			desc = L["DISPLAY_OPTIONS_DESC"],
-			args = {
-				display_desc =	{
-					order	= 1,
-					type	= "description",
-					name	= L["MAP_OPTIONS_DESC"] .. "\n",
-				},
-				scanbuttonlocation = {
-					order	= 2,
-					type	= "select",
-					name	= L["Scan Button Position"],
-					desc	= L["SCANBUTTONPOSITION_DESC"],
-					get		= function() return addon.db.profile.scanbuttonlocation end,
-					set		= function(info,name) addon.db.profile.scanbuttonlocation = name end,
-					values	= function() return {TR = L["Top Right"], TL = L["Top Left"], BR = L["Bottom Right"], BL = L["Bottom Left"]} end,
-				},
-				uiscale = {
-					order	= 3,
-					type	= "range",
-					name	= _G.UI_SCALE,
-					desc	= L["UI_SCALE_DESC"],
-					min		= .5,
-					max		= 1.5,
-					step	= .05,
-					bigStep = .05,
-					get		= function() return addon.db.profile.frameopts.uiscale end,
-					set		= function(info, v)
-								  addon.db.profile.frameopts.uiscale = v
-								  addon.Frame:SetScale(v)
-							  end,
-				},
-				fontsize = {
-					order	= 4,
-					type	= "range",
-					name	= _G.FONT_SIZE,
-					desc	= L["FONT_SIZE_DESC"],
-					min		= 6,
-					max		= 20,
-					step	= 1,
-					bigStep = 1,
-					get		= function() return addon.db.profile.frameopts.fontsize end,
-					set		= function(info, v) addon.db.profile.frameopts.fontsize = v end,
-				},
-				closegui = {
-					order	= 5,
-					type	= "toggle",
-					name	= L["Close GUI"],
-					desc	= L["CLOSEGUI_DESC"],
-					get		= function() return addon.db.profile.closeguionskillclose end,
-					set		= function() addon.db.profile.closeguionskillclose = not addon.db.profile.closeguionskillclose end,
-				},
-				hidepopup = {
-					order	= 6,
-					type	= "toggle",
-					name	= L["Hide Pop-Up"],
-					desc	= L["HIDEPOPUP_DESC"],
-					get		= function() return addon.db.profile.hidepopup end,
-					set		= function() addon.db.profile.hidepopup = not addon.db.profile.hidepopup end,
-				},
-				spacer1 = {
-					order	= 10,
-					type	= "description",
-					name	= "\n",
-				},
-				tooltip_header = {
-					order	= 11,
-					type	= "header",
-					name	= L["Tooltip Options"],
-				},
-				tooltip_desc =	{
-					order	= 12,
-					type	= "description",
-					name	= L["TOOLTIP_OPTIONS_DESC"] .. "\n",
-				},
-				tooltipscale = {
-					order	= 20,
-					type	= "range",
-					name	= L["Tooltip Scale"],
-					desc	= L["TOOLTIP_SCALE_DESC"],
-					min		= .5,
-					max		= 1.5,
-					step	= .05,
-					bigStep = .05,
-					get		= function()
-								  return addon.db.profile.frameopts.tooltipscale
-							  end,
-					set		= function(info, v)
-								  addon.db.profile.frameopts.tooltipscale = v
-							  end,
-				},
-				acquiretooltiplocation = {
-					order	= 21,
-					type	= "select",
-					name	= L["Tooltip (Acquire) Position"],
-					desc	= L["ACQUIRETOOLTIPPOSITION_DESC"],
-					get	= function()
-							  return addon.db.profile.acquiretooltiplocation
-						  end,
-					set	= function(info, name)
-							  addon.db.profile.acquiretooltiplocation = name
-						  end,
-					values	= function()
-							  return {
-								  Right = L["Right"],
-								  Left = L["Left"],
-								  Top = L["Top"],
-								  Bottom = L["Bottom"],
-								  Off = _G.OFF,
-								  Mouse = _G.MOUSE_LABEL
-							  }
-						  end,
-				},
-				spelltooltiplocation = {
-					order	= 22,
-					type	= "select",
-					name	= L["Tooltip (Recipe) Position"],
-					desc	= L["SPELLTOOLTIPPOSITION_DESC"],
-					get	= function()
-							  return addon.db.profile.spelltooltiplocation
-						  end,
-					set	= function(info,name)
-							  addon.db.profile.spelltooltiplocation = name
-						  end,
-					values	= function()
-							  return {
-								  Right = L["Right"],
-								  Left = L["Left"],
-								  Top = L["Top"],
-								  Bottom = L["Bottom"],
-								  Off = _G.OFF
-							  }
-						  end,
-				},
-			},
-		}
-	end
-	return displayoptions
-end
-
-function addon:SetupOptions()
-	AceConfigReg:RegisterOptionsTable(MODNAME, fullOptions)
-	self.optionsFrame = AceConfigDialog:AddToBlizOptions(MODNAME, nil, nil, "general")
-
-	-- Add in the about panel to the Bliz options (but not the ace3 config)
-	if LibStub:GetLibrary("LibAboutPanel", true) then
-		self.optionsFrame["About"] = LibStub:GetLibrary("LibAboutPanel").new(MODNAME, MODNAME)
-	else
-		self:Print("Lib AboutPanel not loaded.")
-	end
-
-	-- Fill up our modular options...
-	self:RegisterModuleOptions("Datamining", giveDatamine(), L["Datamine Options"])
-	self:RegisterModuleOptions("Display", giveDisplay(), L["Display Options"])
-	self:RegisterModuleOptions("Documentation", giveDocs(), L["ARL Documentation"])
-	self:RegisterModuleOptions("Map", giveMap(), L["Map Options"])
-	self:RegisterModuleOptions("Profiles", giveProfiles(), L["Profile Options"])
-end
-
--- Description: Function which extends our options table in a modular way
--- Expected result: add a new modular options table to the modularOptions upvalue as well as the Blizzard config
--- Input:
---		name			: index of the options table in our main options table
---		optionsTable	: the sub-table to insert
---		displayName	: the name to display in the config interface for this set of options
--- Output: None.
-
-function addon:RegisterModuleOptions(name, optionsTable, displayName)
-	modularOptions[name] = optionsTable
-	self.optionsFrame[name] = AceConfigDialog:AddToBlizOptions(MODNAME, displayName, MODNAME, name)
-end
diff --git a/ARLDatamine.lua b/ARLDatamine.lua
deleted file mode 100644
index 18c80d3..0000000
--- a/ARLDatamine.lua
+++ /dev/null
@@ -1,2346 +0,0 @@
---[[
-
-************************************************************************
-
-ARLDatamine.lua
-
-In-game datamining functions for ARL
-
-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.
-
-************************************************************************
-
-]]--
-
-
--------------------------------------------------------------------------------
--- AddOn namespace.
--------------------------------------------------------------------------------
-local MODNAME			= "Ackis Recipe List"
-local addon			= LibStub("AceAddon-3.0"):GetAddon(MODNAME)
-
-local L				= LibStub("AceLocale-3.0"):GetLocale(MODNAME)
-
-
--------------------------------------------------------------------------------
--- Upvalues globals.
--------------------------------------------------------------------------------
-local table, string = table, string
-
-local tconcat, tinsert, tsort, twipe = table.concat, table.insert, table.sort, table.wipe
-local strlower, strmatch = string.lower, string.match
-local gsub = string.gsub
-local tonumber, tostring = tonumber, tostring
-local ipairs, pairs = ipairs, pairs
-
--------------------------------------------------------------------------------
--- Upvalued Blizzard API.
--------------------------------------------------------------------------------
-local UnitName = UnitName
-local UnitGUID = UnitGUID
-local UnitExists = UnitExists
-local UnitIsPlayer = UnitIsPlayer
-local UnitIsEnemy = UnitIsEnemy
-local GetNumTrainerServices = GetNumTrainerServices
-local GetTrainerServiceInfo = GetTrainerServiceInfo
-local IsTradeskillTrainer = IsTradeskillTrainer
-local SetTrainerServiceTypeFilter = SetTrainerServiceTypeFilter
-local GetTrainerServiceTypeFilter = GetTrainerServiceTypeFilter
-local GetTrainerServiceSkillReq = GetTrainerServiceSkillReq
-local GetMerchantNumItems = GetMerchantNumItems
-local GetMerchantItemLink = GetMerchantItemLink
-local GetMerchantItemInfo = GetMerchantItemInfo
-local GetSpellInfo = GetSpellInfo
-
--------------------------------------------------------------------------------
--- Tradeskill professions
--------------------------------------------------------------------------------
-local PROFESSIONS = {
-	["Alchemy"]		= GetSpellInfo(51304),
-	["Blacksmithing"]	= GetSpellInfo(51300),
-	["Cooking"]		= GetSpellInfo(51296),
-	["Enchanting"]		= GetSpellInfo(51313),
-	["Engineering"]		= GetSpellInfo(51306),
-	["FirstAid"]		= GetSpellInfo(45542),
-	["Inscription"]		= GetSpellInfo(45363),
-	["Jewelcrafting"]	= GetSpellInfo(51311),
-	["Leatherworking"]	= GetSpellInfo(51302),
-	["Runeforging"]		= GetSpellInfo(53428),
-	["Smelting"]		= GetSpellInfo(32606),
-	["Tailoring"]		= GetSpellInfo(51309),
-}
-
--------------------------------------------------------------------------------
--- Mined via Data-tools
--- Table is Public Domain now
--- Look up table of Spell IDs to the recipe which trains them.
--------------------------------------------------------------------------------
-local SPELL_ITEM = {
-	-------------------------------------------------------------------------------
-	-- First Aid
-	-------------------------------------------------------------------------------
-	[7929] = 16112, 	[7935] = 6454, 		[10840] = 16113, 	[23787] = 19442,
-	[27032] = 21992, 	[27033] = 21993, 	[45546] = 39152,
-
-	-------------------------------------------------------------------------------
-	-- Alchemy
-	-------------------------------------------------------------------------------
-	[2333] = 3396, 		[2335] = 2555, 		[3172] = 3393, 		[3174] = 3394,
-	[3175] = 3395, 		[3188] = 6211, 		[3230] = 2553, 		[3449] = 6068,
-	[3450] = 3830, 		[3451] = 3831, 		[3453] = 3832, 		[3454] = 14634,
-	[4508] = 4597, 		[4942] = 4624, 		[6617] = 5640, 		[6618] = 5643,
-	[6624] = 5642, 		[7255] = 6053, 		[7256] = 6054, 		[7257] = 6055,
-	[7258] = 6056, 		[7259] = 6057, 		[8240] = 6663, 		[11453] = 9293,
-	[11456] = 10644, 	[11458] = 9294, 	[11459] = 9303, 	[11464] = 9295,
-	[11466] = 9296, 	[11468] = 9297, 	[11472] = 9298, 	[11473] = 9302,
-	[11476] = 9301, 	[11477] = 9300, 	[11479] = 9304, 	[11480] = 9305,
-	[17187] = 12958, 	[17552] = 13476, 	[17553] = 13477, 	[17554] = 13478,
-	[17555] = 13479, 	[17556] = 13480, 	[17557] = 13481, 	[17559] = 13482,
-	[17560] = 13483, 	[17561] = 13484, 	[17562] = 13485, 	[17563] = 13486,
-	[17564] = 13487, 	[17565] = 13488, 	[17566] = 13489, 	[17570] = 13490,
-	[17571] = 13491, 	[17572] = 13492, 	[17573] = 13493, 	[17574] = 13494,
-	[17575] = 13495, 	[17576] = 13496, 	[17577] = 13497, 	[17578] = 13499,
-	[17580] = 13501, 	[17632] = 13517, 	[17634] = 13518, 	[17635] = 31354,
-	[17636] = 31356, 	[17637] = 31355, 	[17638] = 31357, 	[21923] = 17709,
-	[22732] = 18257, 	[24365] = 20011, 	[24366] = 20012, 	[24367] = 20013,
-	[24368] = 20014, 	[25146] = 20761, 	[26277] = 21547, 	[28543] = 22900,
-	[28546] = 22901, 	[28549] = 22902, 	[28550] = 22903, 	[28552] = 22904,
-	[28553] = 24001, 	[28554] = 22906, 	[28555] = 22907, 	[28556] = 22908,
-	[28557] = 22909, 	[28558] = 22910, 	[28562] = 22911, 	[28563] = 22912,
-	[28564] = 35295, 	[28565] = 22914, 	[28566] = 22915, 	[28567] = 22916,
-	[28568] = 30443, 	[28569] = 22918, 	[28570] = 22919, 	[28571] = 22920,
-	[28572] = 22921, 	[28573] = 22922, 	[28575] = 22923, 	[28576] = 22924,
-	[28577] = 22925, 	[28578] = 35294, 	[28579] = 22927, 	[29688] = 23574,
-	[32765] = 25869, 	[32766] = 29232, 	[38960] = 31680, 	[38961] = 31682,
-	[38962] = 31681, 	[39637] = 32070, 	[39639] = 32071, 	[42736] = 33209,
-	[47046] = 35752, 	[47048] = 35753, 	[47049] = 35754, 	[47050] = 35755,
-	[53936] = 44564, 	[53937] = 44566, 	[53938] = 44568, 	[53939] = 44565,
-	[53942] = 44567,
-
-	-------------------------------------------------------------------------------
-	-- Blacksmithing
-	-------------------------------------------------------------------------------
-	[2667] = 2881, 		[2673] = 5578, 		[3295] = 2883, 		[3297] = 3608,
-	[3321] = 3609, 		[3325] = 3610, 		[3330] = 2882, 		[3334] = 3611,
-	[3336] = 3612, 		[3492] = 12162, 	[3493] = 3866, 		[3494] = 10858,
-	[3495] = 3867, 		[3496] = 12163, 	[3497] = 3868, 		[3498] = 12164,
-	[3500] = 3869, 		[3503] = 6047, 		[3504] = 3870, 		[3505] = 3871,
-	[3507] = 3872, 		[3511] = 3873, 		[3513] = 3874, 		[3515] = 3875,
-	[6518] = 5543, 		[7221] = 6044, 		[7222] = 6045, 		[7224] = 6046,
-	[8367] = 6735, 		[9811] = 7978, 		[9813] = 7979, 		[9814] = 7980,
-	[9818] = 7981, 		[9820] = 7982, 		[9933] = 7975, 		[9937] = 7995,
-	[9939] = 7976, 		[9945] = 7983, 		[9950] = 7984, 		[9952] = 7985,
-	[9964] = 7989, 		[9966] = 7991, 		[9970] = 7990, 		[9995] = 7992,
-	[9997] = 8029, 		[10005] = 7993, 	[10009] = 8028,		[10013] = 8030,
-	[11454] = 10713, 	[11643] = 9367, 	[12259] = 10424, 	[15292] = 11610,
-	[15293] = 11614, 	[15294] = 11611, 	[15295] = 11615, 	[15296] = 11612,
-	[15973] = 12261, 	[16642] = 12682, 	[16643] = 12683, 	[16644] = 12684,
-	[16645] = 12685, 	[16646] = 12687, 	[16647] = 12688, 	[16648] = 12689,
-	[16649] = 12690, 	[16650] = 12691, 	[16651] = 12692, 	[16652] = 12693,
-	[16653] = 12694, 	[16654] = 12695, 	[16655] = 12699, 	[16656] = 12697,
-	[16657] = 12700, 	[16658] = 12701, 	[16659] = 12702, 	[16660] = 12698,
-	[16661] = 12703, 	[16662] = 12704, 	[16663] = 12705, 	[16664] = 12706,
-	[16665] = 12707, 	[16667] = 12696, 	[16724] = 12711, 	[16725] = 12713,
-	[16726] = 12714, 	[16728] = 12716, 	[16729] = 12717, 	[16730] = 12715,
-	[16731] = 12718, 	[16732] = 12719, 	[16741] = 12720, 	[16742] = 12725,
-	[16744] = 12726, 	[16745] = 12727, 	[16746] = 12728, 	[16969] = 12819,
-	[16970] = 12821, 	[16971] = 12823, 	[16973] = 12824, 	[16978] = 12825,
-	[16983] = 12827, 	[16984] = 12828, 	[16985] = 12830, 	[16988] = 12833,
-	[16990] = 12834, 	[16991] = 12835, 	[16992] = 12836, 	[16993] = 12837,
-	[16994] = 12838, 	[16995] = 12839, 	[20872] = 17049, 	[20873] = 17053,
-	[20874] = 17051, 	[20876] = 17052, 	[20890] = 17059, 	[20897] = 17060,
-	[21161] = 18592, 	[21913] = 17706, 	[22757] = 18264, 	[23628] = 19202,
-	[23629] = 19204, 	[23632] = 19203, 	[23633] = 19205, 	[23636] = 19206,
-	[23637] = 19207, 	[23638] = 19208, 	[23639] = 19209, 	[23650] = 19210,
-	[23652] = 19211, 	[23653] = 19212, 	[24136] = 19776, 	[24137] = 19777,
-	[24138] = 19778, 	[24139] = 19779, 	[24140] = 19780, 	[24141] = 19781,
-	[24399] = 20040, 	[24912] = 20553, 	[24913] = 20555, 	[24914] = 20554,
-	[27585] = 22209, 	[27586] = 22219, 	[27587] = 22222, 	[27588] = 22214,
-	[27589] = 22220, 	[27590] = 22221, 	[27829] = 22388, 	[27830] = 22390,
-	[27832] = 22389, 	[28461] = 22766, 	[28462] = 22767, 	[28463] = 22768,
-	[29566] = 23590, 	[29568] = 23591, 	[29569] = 23592, 	[29571] = 23593,
-	[29603] = 23594, 	[29605] = 23595, 	[29606] = 23596, 	[29608] = 23597,
-	[29610] = 23599, 	[29611] = 23598, 	[29613] = 23600, 	[29614] = 23601,
-	[29615] = 23602, 	[29616] = 23603, 	[29617] = 23604, 	[29619] = 23605,
-	[29620] = 23606, 	[29621] = 23607, 	[29622] = 23621, 	[29628] = 23608,
-	[29629] = 23609, 	[29630] = 23610, 	[29642] = 23611, 	[29643] = 23612,
-	[29645] = 23613, 	[29648] = 23615, 	[29649] = 23617, 	[29656] = 23618,
-	[29657] = 24002, 	[29658] = 23620, 	[29662] = 23622, 	[29663] = 23623,
-	[29664] = 23624, 	[29668] = 23625, 	[29669] = 23626, 	[29671] = 23627,
-	[29672] = 23628, 	[29692] = 23629, 	[29693] = 23630, 	[29694] = 23631,
-	[29695] = 23632, 	[29696] = 23633, 	[29697] = 23634, 	[29698] = 23635,
-	[29699] = 23636, 	[29700] = 23637, 	[29728] = 23638, 	[29729] = 23639,
-	[32285] = 25526, 	[32656] = 25846, 	[32657] = 25847, 	[34608] = 28632,
-	[36389] = 30321, 	[36390] = 30322, 	[36391] = 30323, 	[36392] = 30324,
-	[38473] = 31390, 	[38475] = 31391, 	[38476] = 31392, 	[38477] = 31393,
-	[38478] = 31394, 	[38479] = 31395, 	[40033] = 32441, 	[40034] = 32442,
-	[40035] = 32443, 	[40036] = 32444, 	[41132] = 32736, 	[41133] = 32737,
-	[41134] = 32738, 	[41135] = 32739, 	[42688] = 35296, 	[43549] = 33792,
-	[43846] = 33954, 	[46140] = 35208, 	[46141] = 35209, 	[46142] = 35210,
-	[46144] = 35211, 	[54978] = 41124, 	[54979] = 41123, 	[54980] = 41120,
-	[54981] = 41122, 	[62202] = 44938, 	[63187] = 45088, 	[63188] = 45089,
-	[63189] = 45090, 	[63190] = 45091, 	[63191] = 45092, 	[63192] = 45093,
-	[67091] = 47622, 	[67130] = 47460, 	[67092] = 47623, 	[67131] = 47641,
-	[67096] = 47627, 	[67135] = 47642, 	[67095] = 47626, 	[67134] = 47643,
-	[67093] = 47624, 	[67132] = 47644, 	[67094] = 47625, 	[67133] = 47645,
-
-	-------------------------------------------------------------------------------
-	-- Cooking
-	-------------------------------------------------------------------------------
-	[2542] = 2697, 		[2543] = 728, 		[2545] = 2698, 		[2547] = 2699,
-	[2548] = 2700, 		[2549] = 2701, 		[2795] = 2889, 		[3370] = 3678,
-	[3371] = 3679, 		[3372] = 3680, 		[3373] = 3681, 		[3376] = 3682,
-	[3377] = 3683, 		[3397] = 3734, 		[3398] = 3735, 		[3399] = 3736,
-	[3400] = 3737, 		[4094] = 4609, 		[6412] = 5482, 		[6413] = 5483,
-	[6414] = 5484, 		[6415] = 5485, 		[6416] = 5486, 		[6417] = 44977,
-	[6418] = 5488, 		[6419] = 5489, 		[6501] = 5528, 		[7213] = 6039,
-	[7751] = 6325, 		[7752] = 6326, 		[7753] = 6328, 		[7754] = 6329,
-	[7755] = 6330, 		[7827] = 6368, 		[7828] = 6369, 		[8238] = 6661,
-	[8607] = 6892, 		[9513] = 18160, 	[15853] = 12227, 	[15855] = 12228,
-	[15856] = 12229, 	[15861] = 12231, 	[15863] = 12232, 	[15865] = 12233,
-	[15906] = 12239, 	[15910] = 12240, 	[15915] = 16111, 	[15933] = 16110,
-	[15935] = 12226, 	[18238] = 13939, 	[18239] = 13940, 	[18240] = 13942,
-	[18241] = 13941, 	[18242] = 13943, 	[18243] = 13945, 	[18244] = 13946,
-	[18245] = 13947, 	[18246] = 13948, 	[18247] = 13949, 	[20626] = 16767,
-	[20916] = 17062, 	[21143] = 17200, 	[21144] = 17201, 	[22480] = 18046,
-	[22761] = 18267, 	[24418] = 20075, 	[25659] = 21025, 	[25704] = 21099,
-	[25954] = 21219, 	[28267] = 22647, 	[33276] = 27685, 	[33277] = 27686,
-	[33278] = 27687, 	[33279] = 27684, 	[33284] = 27688, 	[33285] = 27689,
-	[33286] = 27690, 	[33287] = 27691, 	[33288] = 27692, 	[33289] = 27693,
-	[33290] = 27694, 	[33291] = 27695, 	[33292] = 27696, 	[33293] = 27697,
-	[33294] = 27698, 	[33295] = 27699, 	[33296] = 27700, 	[36210] = 30156,
-	[38867] = 31675, 	[38868] = 31674, 	[43707] = 33870, 	[43758] = 33871,
-	[43761] = 33869, 	[43765] = 33873, 	[43772] = 33875, 	[43779] = 33925,
-	[45022] = 34413, 	[45555] = 43018, 	[45556] = 43019, 	[45557] = 43020,
-	[45558] = 43021, 	[45559] = 43022, 	[45567] = 43023, 	[45568] = 43024,
-	[45570] = 43026, 	[45571] = 43025, 	[45695] = 34834, 	[46684] = 35564,
-	[46688] = 35566, 	[53056] = 39644, 	[57423] = 43017, 	[57433] = 43027,
-	[57434] = 43028, 	[57435] = 43029, 	[57436] = 43030, 	[57437] = 43031,
-	[57438] = 43032, 	[57439] = 43033, 	[57440] = 43034, 	[57441] = 43035,
-	[57442] = 43036, 	[57443] = 43037, 	[58512] = 43507, 	[58521] = 43508,
-	[58523] = 43509, 	[58525] = 43510, 	[58527] = 43505, 	[58528] = 43506,
-	[62350] = 44954,
-
-	-------------------------------------------------------------------------------
-	-- Enchanting
-	-------------------------------------------------------------------------------
-	[7443] = 6342, 		[7766] = 6344, 		[7776] = 6346, 		[7782] = 6347,
-	[7786] = 6348, 		[7793] = 6349, 		[7859] = 6375, 		[7867] = 6377,
-	[13380] = 11038, 	[13419] = 11039, 	[13464] = 11081, 	[13522] = 11098,
-	[13536] = 11101, 	[13612] = 11150, 	[13617] = 11151, 	[13620] = 11152,
-	[13646] = 11163, 	[13653] = 11164, 	[13655] = 11165, 	[13687] = 11167,
-	[13689] = 11168, 	[13698] = 11166, 	[13817] = 11202, 	[13841] = 11203,
-	[13846] = 11204, 	[13868] = 11205, 	[13882] = 11206, 	[13898] = 11207,
-	[13915] = 11208, 	[13931] = 11223, 	[13933] = 11224, 	[13945] = 11225,
-	[13947] = 11226, 	[15596] = 11813, 	[15596] = 45050,
-	[20009] = 16218, 	[20010] = 16246, 	[20011] = 16251, 	[20012] = 16219,
- 	[20014] = 16216, 	[20015] = 16224, 	[20016] = 16222,
-	[20017] = 16217, 	[20020] = 16215, 	[20023] = 16245, 	[20024] = 16220,
-	[20025] = 16253, 	[20026] = 16221, 	[20028] = 16242, 	[20029] = 16223,
-	[20030] = 16247, 	[20031] = 16250, 	[20032] = 16254, 	[20033] = 16248,
-	[20034] = 16252, 	[20035] = 16255, 	[20036] = 16249, 	[20051] = 16243,
-	[21931] = 17725, 	[22749] = 18259, 	[22750] = 18260, 	[23799] = 19444,
-	[23800] = 19445, 	[23801] = 19446, 	[23802] = 19447, 	[23803] = 19448,
-	[23804] = 19449, 	[25072] = 33153, 	[25072] = 20726, 	[25073] = 20727,
-	[25074] = 20728, 	[25078] = 20729, 	[25079] = 20730, 	[25080] = 33152,
-	[25080] = 20731, 	[25081] = 20732, 	[25082] = 20733, 	[25083] = 33149,
-	[25083] = 20734, 	[25084] = 20735, 	[25084] = 33150, 	[25084] = 33151,
-	[25086] = 20736, 	[25086] = 33148, 	[25124] = 20758, 	[25125] = 20752,
-	[25126] = 20753, 	[25127] = 20754, 	[25128] = 20755, 	[25129] = 20756,
-	[25130] = 20757, 	[27837] = 22392, 	[27906] = 22530, 	[27911] = 22531,
-	[27911] = 24000, 	[27913] = 22532, 	[27914] = 22533, 	[27917] = 22534,
-	[27920] = 22535, 	[27924] = 22536, 	[27926] = 22537, 	[27927] = 22538,
-	[27945] = 22539, 	[27946] = 22540, 	[27947] = 22541, 	[27948] = 35298,
-	[27948] = 22542, 	[27950] = 22543, 	[27951] = 22544, 	[27954] = 22545,
-	[27960] = 24003, 	[27960] = 22547, 	[27962] = 22548, 	[27967] = 22552,
-	[27968] = 22551, 	[27971] = 22554, 	[27972] = 22553, 	[27975] = 22555,
-	[27977] = 22556, 	[27981] = 22560, 	[27982] = 22561, 	[27984] = 22559,
-	[28003] = 22558, 	[28004] = 22557, 	[28016] = 22562, 	[28019] = 22563,
-	[28022] = 22565, 	[32665] = 25848, 	[32667] = 25849, 	[33992] = 28270,
-	[33994] = 28271, 	[33997] = 28272, 	[33999] = 28273, 	[34003] = 28274,
-	[34005] = 28276, 	[34006] = 28277, 	[34007] = 35299, 	[34007] = 28279,
-	[34008] = 35297, 	[34008] = 28280, 	[34009] = 28282, 	[34010] = 28281,
-	[42620] = 33165, 	[42974] = 33307, 	[44483] = 37332, 	[44494] = 37333,
-	[44524] = 37344, 	[44556] = 37331, 	[44575] = 44484, 	[44576] = 44494,
-	[44588] = 37340, 	[44590] = 37334, 	[44591] = 37347, 	[44595] = 44473,
-	[44596] = 37330, 	[44621] = 37339, 	[44625] = 44485, 	[44631] = 37349,
-	[45765] = 34872, 	[46578] = 35498, 	[46594] = 35500, 	[47051] = 35756,
-	[47672] = 44471, 	[47898] = 44472, 	[47899] = 44488, 	[47901] = 44491,
-	[59619] = 44496, 	[59621] = 44492, 	[59625] = 44495, 	[60691] = 44483,
-	[60692] = 44489, 	[60707] = 44486, 	[60714] = 44487, 	[60763] = 44490,
-	[60767] = 44498, 	[62256] = 44944, 	[62257] = 44945, 	[62948] = 45059,
-	[64441] = 46027, 	[64579] = 46348,
-
-	-------------------------------------------------------------------------------
-	--Engineering
-	-------------------------------------------------------------------------------
-	[3928] = 4408, 		[3933] = 4409, 		[3939] = 13309,		[3940] = 4410,
-	[3944] = 4411, 		[3952] = 14639, 	[3954] = 4412, 		[3957] = 13308,
-	[3959] = 4413, 		[3960] = 4414, 		[3966] = 4415, 		[3968] = 4416,
-	[3969] = 13311, 	[3971] = 7742, 		[3972] = 4417, 		[3979] = 13310,
-	[8243] = 6672, 		[8339] = 6716, 		[9269] = 7560, 		[9273] = 7561,
-	[12587] = 10601, 	[12597] = 10602, 	[12607] = 10603, 	[12614] = 10604,
-	[12615] = 10605, 	[12616] = 10606, 	[12617] = 10607, 	[12620] = 10608,
-	[12624] = 10609, 	[15628] = 11828, 	[15633] = 11827, 	[19790] = 16041,
-	[19791] = 16042, 	[19792] = 16043, 	[19793] = 16044, 	[19794] = 16045,
-	[19795] = 16047, 	[19796] = 16048, 	[19799] = 16049, 	[19800] = 16051,
-	[19814] = 16046, 	[19815] = 16050, 	[19819] = 16052, 	[19825] = 16053,
-	[19830] = 16054, 	[19831] = 16055, 	[19833] = 16056, 	[21940] = 17720,
-	[22793] = 18290, 	[22795] = 18292, 	[22797] = 18291, 	[23066] = 18647,
-	[23067] = 18649, 	[23068] = 18648, 	[23069] = 18650, 	[23071] = 18651,
-	[23077] = 18652, 	[23078] = 18653, 	[23079] = 18655, 	[23080] = 18656,
-	[23081] = 18657, 	[23082] = 18658, 	[23096] = 18654, 	[23129] = 18661,
-	[23507] = 19027, 	[24356] = 20000, 	[24357] = 20001, 	[26416] = 21724,
-	[26417] = 21725, 	[26418] = 21726, 	[26420] = 21727, 	[26421] = 21728,
-	[26422] = 21729, 	[26423] = 21730, 	[26424] = 21731, 	[26425] = 21732,
-	[26426] = 21733, 	[26427] = 21734, 	[26428] = 21735, 	[26442] = 44919,
-	[26443] = 44918, 	[28327] = 22729, 	[30313] = 23799, 	[30314] = 23800,
-	[30315] = 23802, 	[30316] = 23803, 	[30317] = 23804, 	[30318] = 23805,
-	[30325] = 23806, 	[30329] = 23807, 	[30332] = 23808, 	[30334] = 23809,
-	[30337] = 23810, 	[30341] = 23811, 	[30344] = 23814, 	[30347] = 23815,
-	[30348] = 23816, 	[30349] = 23817, 	[30547] = 23874, 	[30548] = 23888,
-	[30551] = 35310, 	[30552] = 35311, 	[30556] = 23887, 	[32814] = 25887,
-	[39895] = 32381, 	[43676] = 33804, 	[44391] = 34114, 	[46106] = 35191,
-	[46107] = 35187, 	[46108] = 35189, 	[46109] = 35190, 	[46110] = 35192,
-	[46111] = 35186, 	[46112] = 35193, 	[46113] = 35194, 	[46114] = 35195,
-	[46115] = 35196, 	[46116] = 35197, 	[46697] = 35582,  [60866] = 44502, 	[60867] = 44503,
-
-	-------------------------------------------------------------------------------
-	--Inscription
-	-------------------------------------------------------------------------------
-
-	-------------------------------------------------------------------------------
-	--Jewelcrafting
-	-------------------------------------------------------------------------------
-	[25320] = 20856, 	[25323] = 20855, 	[25339] = 20854, 	[25610] = 20970,
-	[25612] = 20971, 	[25617] = 20973, 	[25618] = 20974, 	[25619] = 20975,
-	[25622] = 20976, 	[26873] = 21940, 	[26875] = 21941, 	[26878] = 21942,
-	[26881] = 21943, 	[26882] = 21944, 	[26887] = 21945, 	[26896] = 21947,
-	[26897] = 21948, 	[26900] = 21949, 	[26906] = 21952, 	[26909] = 21953,
-	[26910] = 21954, 	[26912] = 21955, 	[26914] = 21956, 	[26915] = 21957,
-	[28903] = 23130, 	[28905] = 23131, 	[28906] = 23133, 	[28907] = 23134,
-	[28910] = 23135, 	[28912] = 23136, 	[28914] = 23137, 	[28915] = 23138,
-	[28916] = 23140, 	[28917] = 23141, 	[28918] = 31359, 	[28924] = 23143,
-	[28927] = 23145, 	[28933] = 23146, 	[28936] = 23147,
-	[28938] = 23148, 	[28944] = 23149, 	[28947] = 23150, 	[28948] = 23151,
-	[28950] = 23152, 	[28953] = 23153, 	[28955] = 23154, 	[28957] = 23155,
-	[31053] = 24158, 	[31054] = 24159, 	[31055] = 24160, 	[31056] = 24161,
-	[31057] = 24162, 	[31058] = 24163, 	[31060] = 24164, 	[31061] = 24165,
-	[31062] = 24174, 	[31063] = 24175, 	[31064] = 24176, 	[31065] = 24177,
-	[31066] = 24178, 	[31067] = 24166, 	[31068] = 24167, 	[31070] = 24168,
-	[31071] = 24169, 	[31072] = 24170, 	[31076] = 24171, 	[31077] = 24172,
-	[31078] = 24173, 	[31079] = 24179, 	[31080] = 31358, 	[31081] = 24181,
-	[31082] = 24182, 	[31083] = 24183, 	[31084] = 24193, 	[31085] = 24194,
-	[31087] = 24195, 	[31088] = 35305, 	[31089] = 35306, 	[31090] = 24197,
-	[31091] = 24198, 	[31092] = 35304, 	[31094] = 24201, 	[31095] = 24202,
-	[31096] = 24203, 	[31097] = 24204, 	[31098] = 35307, 	[31099] = 24206,
-	[31100] = 24207, 	[31101] = 24208, 	[31102] = 24209, 	[31103] = 24210,
-	[31104] = 24211, 	[31105] = 24212, 	[31106] = 24213, 	[31107] = 24214,
-	[31108] = 24215, 	[31109] = 24216, 	[31110] = 24217, 	[31111] = 24218,
-	[31112] = 24219, 	[31113] = 24220, 	[31149] = 24200, 	[32866] = 25902,
-	[32867] = 25903, 	[32868] = 25905, 	[32869] = 25906, 	[32870] = 25904,
-	[32871] = 25907, 	[32872] = 25909, 	[32873] = 25908, 	[32874] = 25910,
-	[34069] = 28291, 	[34590] = 28596, 	[37855] = 30826, 	[38503] = 31401,
-	[38504] = 31402, 	[39451] = 31870, 	[39452] = 31875, 	[39455] = 31871,
-	[39458] = 31872, 	[39462] = 31877, 	[39463] = 31876, 	[39466] = 31873,
-	[39467] = 31874, 	[39470] = 31878, 	[39471] = 31879, 	[39705] = 35244,
-	[39706] = 35246, 	[39710] = 35250, 	[39711] = 35248, 	[39712] = 35245,
-	[39713] = 35249, 	[39714] = 35247, 	[39715] = 35263, 	[39716] = 35264,
-	[39717] = 35262, 	[39718] = 35265, 	[39719] = 35255, 	[39720] = 35260,
-	[39721] = 35259, 	[39722] = 35256, 	[39723] = 35261, 	[39724] = 35258,
-	[39725] = 35257, 	[39727] = 35243, 	[39728] = 35242, 	[39729] = 35238,
-	[39730] = 35240, 	[39731] = 35239, 	[39732] = 35241, 	[39733] = 35267,
-	[39734] = 35269, 	[39735] = 35268, 	[39736] = 35266, 	[39737] = 35270,
-	[39738] = 35271, 	[39739] = 35252, 	[39740] = 35254, 	[39741] = 35251,
-	[39742] = 35253, 	[39961] = 33622, 	[39963] = 32411, 	[42558] = 33305,
-	[42588] = 33155, 	[42589] = 33156, 	[42590] = 33157, 	[42591] = 33158,
-	[42592] = 33159, 	[42593] = 33160, 	[43493] = 33783, 	[44794] = 34689,
-	[46122] = 35198, 	[46123] = 35538, 	[46124] = 35200, 	[46125] = 35201,
-	[46126] = 35533, 	[46127] = 35203, 	[46403] = 35322, 	[46404] = 35323,
-	[46405] = 35325, 	[46597] = 35502, 	[46601] = 35505, 	[46775] = 35695,
-	[46776] = 35696, 	[46777] = 35697, 	[46778] = 35698, 	[46779] = 35699,
-	[46803] = 35708, 	[47053] = 35769, 	[47054] = 35766, 	[47055] = 35767,
-	[47056] = 35768, 	[48789] = 37504, 	[53830] = 41576, 	[53857] = 41559,
-	[53865] = 41575, 	[53869] = 41574, 	[53875] = 41566, 	[53877] = 41562,
-	[53879] = 41565, 	[53884] = 41563, 	[53885] = 41561, 	[53888] = 41564,
-	[53917] = 41567, 	[53919] = 41572, 	[53921] = 41568, 	[53924] = 41571,
-	[53929] = 41573, 	[53932] = 41570, 	[53933] = 41569, 	[53943] = 41560,
-	[53945] = 41577, 	[53946] = 41718, 	[53948] = 41719, 	[53949] = 41578,
-	[53950] = 41817, 	[53951] = 41790, 	[53952] = 42138, 	[53954] = 41581,
-	[53955] = 41728, 	[53957] = 41720, 	[53958] = 41580, 	[53959] = 41791,
-	[53960] = 41727, 	[53961] = 41579, 	[53962] = 41784, 	[53963] = 41747,
-	[53964] = 41785, 	[53965] = 41725, 	[53966] = 41783, 	[53967] = 41701,
-	[53968] = 41740, 	[53970] = 41796, 	[53971] = 41703, 	[53972] = 41820,
-	[53973] = 41702, 	[53974] = 41726, 	[53975] = 41789, 	[53976] = 41777,
-	[53977] = 41780, 	[53978] = 41734, 	[53979] = 41794, 	[53980] = 41582,
-	[53981] = 41733, 	[53982] = 41792, 	[53983] = 41689, 	[53984] = 41686,
-	[53985] = 41688, 	[53986] = 41730, 	[53987] = 41690, 	[53988] = 41721,
-	[53990] = 41732, 	[53991] = 41687, 	[53992] = 41779, 	[53993] = 41722,
-	[53994] = 41818, 	[53995] = 41795, 	[53996] = 41723, 	[53997] = 41698,
-	[53998] = 41697, 	[54000] = 41738, 	[54001] = 41693, 	[54002] = 41699,
-	[54003] = 41781, 	[54004] = 41782, 	[54005] = 41737, 	[54006] = 41694,
-	[54008] = 41724, 	[54009] = 41696, 	[54010] = 41739, 	[54011] = 41692,
-	[54012] = 41819, 	[54013] = 41736, 	[54014] = 41735, 	[54019] = 41793,
-	[54023] = 41778, 	[55384] = 41705, 	[55387] = 41743, 	[55388] = 41744,
-	[55389] = 41704, 	[55390] = 41786, 	[55392] = 41706, 	[55393] = 41742,
-	[55395] = 41787, 	[55396] = 41708, 	[55397] = 41798, 	[55398] = 41799,
-	[55400] = 41710, 	[55401] = 41797, 	[55403] = 41711, 	[55404] = 41709,
-	[55405] = 41788, 	[55407] = 41707, 	[56049] = 42298, 	[56052] = 42301,
-	[56053] = 42309, 	[56054] = 42299, 	[56055] = 42314, 	[56056] = 42302,
-	[56074] = 42300, 	[56076] = 42303, 	[56077] = 42304, 	[56079] = 42305,
-	[56081] = 42306, 	[56083] = 42307, 	[56084] = 42308, 	[56085] = 42310,
-	[56086] = 42311, 	[56087] = 42312, 	[56088] = 42313, 	[56089] = 42315,
-	[56496] = 42648, 	[56497] = 42649, 	[56498] = 42650, 	[56499] = 42651,
-	[56500] = 42652, 	[56501] = 42653, 	[58147] = 43317, 	[58148] = 43318,
-	[58149] = 43319, 	[58150] = 43320, 	[58492] = 43485, 	[58507] = 43497,
-	[58954] = 43597,   [66556] = 46937, [66447] =  46917 , [66429] =  46899,
-	[66557] =  46938, [66430] =  46900, [66432] =  46902, [66433] =  46903,
- [66497] =  46924, [66561] =  46942, [66434] = 46904, [66498] =  46925,
- [66499] =  46926, [66436] =  46906, [66500] =  46927, [66437] =  46907,
- [66501] =  46928, [66565] =  46946, [66438] =  46908, [66502] = 46929,
- [66566] =  46947, [66439] =  46909, [66503] = 46930  , [66567] =  46948,
- [66440] = 46910, [66504] =  46931, [66441] =  46911, [66505] =  46932,
- [66569] =  46950, [66442] = 46912, [66506] = 46933, [66570] =  46951,
- [66443] =  46913, [66444] = 46914, [66572] = 46953, [66445] =  46915,
- [66573] = 46956, [66446] =  46916, [66574] =  47007, [66575] = 47008,
- [66448] =  46918, [66576] =  47010, [66449] =  46919, [66577] =  47011,
- [66450] = 46920, [66578] = 47012, [66451] =  46921, [66579] = 47015,
- [66452] =  46922, [66580] =  47016, [66453] = 46923, [66581] =  47017,
- [66582] =  47018, [66583] = 47019, [66584] =  47020, [66586] =  47022,
- [68253] =  49112, [66338] = 46897, [66571] =  46952, [66564] = 46945,
- [66562] =  46943, [66560] =  46941, [66558] =  46939, [66554] =  46935,
- [66559] =  46940, [66585] =  47021, [66555] = 46936, [66587] =  47023,
- [66431] =  46901, [66428] =  46898, [66435] = 46905, [66563] = 46944,
- [66553] = 46934 , [66568] = 46949,
-
-	-------------------------------------------------------------------------------
-	--Leatherworking
-	-------------------------------------------------------------------------------
-	[2158] = 2406, 		[2163] = 2407, 		[2164] = 2408, 		[2169] = 2409,
-	[3762] = 4293, 		[3765] = 7360, 		[3767] = 4294, 		[3769] = 4296,
-	[3771] = 4297, 		[3772] = 7613, 		[3773] = 4299, 		[3775] = 4298,
-	[3777] = 4300, 		[3778] = 14635, 	[3779] = 4301, 		[4096] = 13287,
-	[4097] = 13288, 	[5244] = 5083, 		[6702] = 5786, 		[6703] = 5787,
-	[6704] = 5788, 		[6705] = 5789, 		[7133] = 5972, 		[7149] = 5973,
-	[7153] = 5974, 		[7953] = 6474, 		[7954] = 6475, 		[7955] = 6476,
-	[8322] = 6710, 		[9064] = 7288, 		[9070] = 7289, 		[9072] = 7290,
-	[9146] = 7361, 		[9147] = 7362, 		[9148] = 7363, 		[9149] = 7364,
-	[9195] = 7449, 		[9197] = 7450, 		[9202] = 7451, 		[9207] = 7452,
-	[9208] = 7453, 		[10490] = 8384, 	[10509] = 8385, 	[10516] = 8409,
-	[10520] = 8386, 	[10525] = 8395, 	[10529] = 8403, 	[10531] = 8387,
-	[10533] = 8397, 	[10542] = 8398, 	[10544] = 8404, 	[10546] = 8405,
-	[10554] = 8399, 	[10560] = 8389, 	[10562] = 8390, 	[10564] = 8400,
-	[10566] = 8406, 	[10568] = 8401, 	[10570] = 8402, 	[10572] = 8407,
-	[10574] = 8408, 	[19048] = 15724, 	[19049] = 15725, 	[19050] = 15726,
-	[19051] = 15727, 	[19052] = 15728, 	[19053] = 15729, 	[19054] = 15730,
-	[19055] = 15731, 	[19059] = 15732, 	[19060] = 15733, 	[19061] = 15734,
-	[19062] = 15735, 	[19063] = 15737, 	[19064] = 15738, 	[19065] = 15739,
-	[19066] = 15740, 	[19067] = 15741, 	[19068] = 20253, 	[19070] = 15743,
-	[19071] = 15744, 	[19072] = 15745, 	[19073] = 15746, 	[19074] = 15747,
-	[19075] = 15748, 	[19076] = 15749, 	[19077] = 15751, 	[19078] = 15752,
-	[19079] = 15753, 	[19080] = 20254, 	[19081] = 15755, 	[19082] = 15756,
-	[19083] = 15757, 	[19084] = 15758, 	[19085] = 15759, 	[19086] = 15760,
-	[19087] = 15761, 	[19088] = 15762, 	[19089] = 15763, 	[19090] = 15764,
-	[19091] = 15765, 	[19092] = 15768, 	[19093] = 15769, 	[19094] = 15770,
-	[19095] = 15771, 	[19097] = 15772, 	[19098] = 15773, 	[19100] = 15774,
-	[19101] = 15775, 	[19102] = 15776, 	[19103] = 15777, 	[19104] = 15779,
-	[19107] = 15781, 	[20853] = 17022, 	[20854] = 17023, 	[20855] = 17025,
-	[21943] = 17722, 	[22711] = 18239, 	[22727] = 18252, 	[22921] = 18514,
-	[22922] = 18515, 	[22923] = 18516, 	[22926] = 18517, 	[22927] = 18518,
-	[22928] = 18519, 	[23190] = 18731, 	[23399] = 18949, 	[23703] = 19326,
-	[23704] = 19327, 	[23705] = 19328, 	[23706] = 19329, 	[23707] = 19330,
-	[23708] = 19331, 	[23709] = 19332, 	[23710] = 19333, 	[24121] = 19769,
-	[24122] = 19770, 	[24123] = 19771, 	[24124] = 19772, 	[24125] = 19773,
-	[24703] = 20382, 	[24846] = 20506, 	[24847] = 20507, 	[24848] = 20508,
-	[24849] = 20509, 	[24850] = 20510, 	[24851] = 20511, 	[24940] = 20576,
-	[26279] = 21548, 	[28472] = 22771, 	[28473] = 22770, 	[28474] = 22769,
-	[32455] = 25720, 	[32457] = 25721, 	[32458] = 25722, 	[32461] = 25725,
-	[32482] = 25726, 	[32485] = 25728, 	[32487] = 25729, 	[32488] = 25731,
-	[32489] = 25730, 	[32490] = 25732, 	[32493] = 25733, 	[32494] = 25734,
-	[32495] = 25735, 	[32496] = 25736, 	[32497] = 25737, 	[32498] = 29213,
-	[32499] = 29214, 	[32500] = 29215, 	[32501] = 29217, 	[32502] = 29219,
-	[32503] = 29218, 	[35520] = 29669, 	[35521] = 29672, 	[35522] = 29673,
-	[35523] = 29674, 	[35524] = 29675, 	[35525] = 29677, 	[35526] = 29682,
-	[35527] = 29684, 	[35528] = 29691, 	[35529] = 29689, 	[35530] = 30444,
-	[35531] = 29693, 	[35532] = 29698, 	[35533] = 29700, 	[35534] = 29701,
-	[35535] = 29702, 	[35536] = 29703, 	[35537] = 29704, 	[35538] = 29713,
-	[35539] = 34175, 	[35543] = 29717, 	[35544] = 34173, 	[35549] = 31361,
-	[35554] = 31362, 	[35555] = 29720, 	[35557] = 29721, 	[35558] = 29723,
-	[35559] = 35302, 	[35560] = 29725, 	[35561] = 29726, 	[35562] = 35303,
-	[35563] = 29728, 	[35564] = 29729, 	[35567] = 29730, 	[35568] = 35300,
-	[35572] = 29732, 	[35573] = 35301, 	[35574] = 29734, 	[36349] = 30301,
-	[36351] = 30302, 	[36352] = 30303, 	[36353] = 30304, 	[36355] = 30305,
-	[36357] = 30306, 	[36358] = 30307, 	[36359] = 30308, 	[39997] = 32429,
-	[40001] = 32431, 	[40002] = 32432, 	[40003] = 32433, 	[40004] = 32434,
-	[40005] = 32435, 	[40006] = 32436, 	[41156] = 32744, 	[41157] = 35523,
-	[41158] = 35527, 	[41160] = 35528, 	[41161] = 35517, 	[41162] = 35524,
-	[41163] = 35520, 	[41164] = 35521, 	[42546] = 33124, 	[42731] = 33205,
-	[44359] = 34200, 	[44768] = 34218, 	[44953] = 34262, 	[45117] = 34491,
-	[46132] = 35546, 	[46133] = 35541, 	[46134] = 35214, 	[46135] = 35215,
-	[46136] = 35216, 	[46137] = 35217, 	[46138] = 35218, 	[46139] = 35549,
-	[50970] = 44509, 	[50971] = 44510, 	[52733] = 32430, 	[57683] = 43097,
-	[57692] = 44559, 	[57694] = 44560, 	[57696] = 44561, 	[57699] = 44562,
-	[57701] = 44563, 	[60645] = 44511, 	[60647] = 44512, 	[60697] = 44513,
-	[60702] = 44514, 	[60703] = 44515, 	[60704] = 44516, 	[60705] = 44517,
-	[60706] = 44518, 	[60711] = 44519, 	[60712] = 44520, 	[60715] = 44521,
-	[60716] = 44522, 	[60718] = 44523, 	[60720] = 44524, 	[60721] = 44525,
-	[60723] = 44526, 	[60725] = 44527, 	[60727] = 44528, 	[60728] = 44530,
-	[60729] = 44531, 	[60730] = 44532, 	[60731] = 44533, 	[60732] = 44534,
-	[60734] = 44535, 	[60735] = 44536, 	[60737] = 44537, 	[60743] = 44538,
-	[60746] = 44539, 	[60747] = 44540, 	[60748] = 44541, 	[60749] = 44542,
-	[60750] = 44543, 	[60751] = 44544, 	[60752] = 44545, 	[60754] = 44546,
-	[60755] = 44547, 	[60756] = 44548, 	[60757] = 44549, 	[60758] = 44550,
-	[60759] = 44551, 	[60760] = 44552, 	[60761] = 44553, 	[60996] = 44584,
-	[60997] = 44585, 	[60998] = 44586, 	[60999] = 44587, 	[61000] = 44588,
-	[61002] = 44589, 	[62176] = 44932, 	[62177] = 44933, 	[63194] = 45094,
-	[63195] = 45095, 	[63196] = 45096, 	[63197] = 45097, 	[63198] = 45098,
-	[63199] = 45099, 	[63200] = 45100, 	[63201] = 45101,
-
-	-------------------------------------------------------------------------------
-	--Smelting
-	-------------------------------------------------------------------------------
-	[22967] = 44956, 	[46353] = 35273,
-
-	-------------------------------------------------------------------------------
-	--Tailoring
-	-------------------------------------------------------------------------------
-	[2389] = 2598, 		[2403] = 2601, 		[3758] = 4292, 		[3844] = 4346,
-	[3847] = 4345, 		[3849] = 4347, 		[3851] = 4349, 		[3854] = 7114,
-	[3856] = 4350, 		[3857] = 14630, 	[3858] = 4351, 		[3860] = 4352,
-	[3862] = 4355, 		[3863] = 4353, 		[3864] = 4356, 		[3868] = 4348,
-	[3869] = 14627, 	[3870] = 6401, 		[3872] = 4354, 		[3873] = 10728,
-	[6686] = 5771, 		[6688] = 5772, 		[6692] = 5773, 		[6693] = 5774,
-	[6695] = 5775, 		[7629] = 6271, 		[7630] = 6270, 		[7633] = 6272,
-	[7639] = 6274, 		[7643] = 6275, 		[7892] = 6390, 		[7893] = 6391,
-	[8780] = 7092, 		[8782] = 7091, 		[8784] = 7090, 		[8786] = 7089,
-	[8789] = 7087, 		[8793] = 7084, 		[8795] = 7085, 		[8797] = 7086,
-	[8802] = 7088, 		[12047] = 10316, 	[12056] = 10300, 	[12059] = 10301,
-	[12060] = 10302, 	[12064] = 10311, 	[12066] = 10312, 	[12075] = 10314,
-	[12078] = 10315, 	[12080] = 10317, 	[12081] = 10318, 	[12084] = 10320,
-	[12085] = 10321, 	[12086] = 10463, 	[12089] = 10323, 	[12091] = 10325,
-	[12093] = 10326, 	[18403] = 14466, 	[18404] = 14467, 	[18405] = 14468,
-	[18406] = 14469, 	[18407] = 14470, 	[18408] = 14471, 	[18409] = 14472,
-	[18410] = 14473, 	[18411] = 14474, 	[18412] = 14476, 	[18413] = 14477,
-	[18414] = 14478, 	[18415] = 14479, 	[18416] = 14480, 	[18417] = 14481,
-	[18418] = 14482, 	[18419] = 14483, 	[18420] = 14484, 	[18421] = 14485,
-	[18422] = 14486, 	[18423] = 14488, 	[18424] = 14489, 	[18434] = 14490,
-	[18436] = 14493, 	[18437] = 14492, 	[18438] = 14491, 	[18439] = 14494,
-	[18440] = 14497, 	[18441] = 14495, 	[18442] = 14496, 	[18444] = 14498,
-	[18445] = 14499, 	[18446] = 14500, 	[18447] = 14501, 	[18448] = 14507,
-	[18449] = 14504, 	[18450] = 14505, 	[18451] = 14506, 	[18452] = 14509,
-	[18453] = 14508, 	[18454] = 14511, 	[18455] = 14510, 	[18456] = 14512,
-	[18457] = 14513, 	[18458] = 14514, 	[18560] = 14526, 	[20848] = 17017,
-	[20849] = 17018, 	[21945] = 17724, 	[22759] = 18265, 	[22866] = 18414,
-	[22867] = 18415, 	[22868] = 18416, 	[22869] = 18417, 	[22870] = 18418,
-	[22902] = 18487, 	[23662] = 19215, 	[23663] = 19218, 	[23664] = 19216,
-	[23665] = 19217, 	[23666] = 19219, 	[23667] = 19220, 	[24091] = 19764,
-	[24092] = 19765, 	[24093] = 19766, 	[24901] = 20546, 	[24902] = 20548,
-	[24903] = 20547, 	[26085] = 21358, 	[26087] = 21371, 	[26403] = 44916,
-	[26407] = 44917, 	[26747] = 21892, 	[26749] = 21893, 	[26750] = 21894,
-	[26751] = 21895, 	[26752] = 21908, 	[26753] = 21909, 	[26754] = 21910,
-	[26755] = 21911, 	[26756] = 21912, 	[26757] = 21914, 	[26758] = 21913,
-	[26759] = 21915, 	[26760] = 21916, 	[26761] = 21918, 	[26762] = 21917,
-	[26763] = 21919, 	[26773] = 21896, 	[26774] = 21897, 	[26775] = 21898,
-	[26776] = 21899, 	[26777] = 21900, 	[26778] = 21901, 	[26779] = 21902,
-	[26780] = 21903, 	[26781] = 21904, 	[26782] = 21905, 	[26783] = 21906,
-	[26784] = 21907, 	[27658] = 22307, 	[27659] = 22308, 	[27660] = 22309,
-	[27724] = 22310, 	[27725] = 22312, 	[28210] = 22683, 	[28480] = 22774,
-	[28481] = 22773, 	[28482] = 22772, 	[31373] = 24316, 	[31430] = 24292,
-	[31431] = 24293, 	[31432] = 24294, 	[31433] = 24295, 	[31434] = 35308,
-	[31435] = 24297, 	[31437] = 24298, 	[31438] = 24299, 	[31440] = 24300,
-	[31441] = 24301, 	[31442] = 35309, 	[31443] = 24303, 	[31444] = 24304,
-	[31448] = 24305, 	[31449] = 24306, 	[31450] = 24307, 	[31451] = 24308,
-	[31452] = 24309, 	[31453] = 24310, 	[31454] = 24311, 	[31455] = 24312,
-	[31456] = 24313, 	[31459] = 24314, 	[36315] = 30280, 	[36316] = 30281,
-	[36317] = 30282, 	[36318] = 30283, 	[36686] = 30483, 	[37873] = 30833,
-	[37882] = 30842, 	[37883] = 30843, 	[37884] = 30844, 	[40020] = 32437,
-	[40021] = 32438, 	[40023] = 32439, 	[40024] = 32440, 	[40060] = 32447,
-	[41205] = 35518, 	[41206] = 32755, 	[41207] = 32752, 	[41208] = 32753,
-	[44950] = 34261, 	[44958] = 34319, 	[46128] = 35204, 	[46129] = 35205,
-	[46130] = 35206, 	[46131] = 35207, 	[49677] = 37915, 	[50194] = 38229,
-	[50644] = 38327, 	[50647] = 38328, 	[55993] = 42172, 	[55994] = 42173,
-	[55996] = 42175, 	[55997] = 42177, 	[55998] = 42176, 	[55999] = 42178,
-	[56004] = 42183, 	[56005] = 42184, 	[56006] = 42185, 	[56009] = 42187,
-	[56011] = 42188, 	[63924] = 45774,
-}
-
--------------------------------------------------------------------------------
--- Look up table of spell IDs for recipes which do not have a player flag
--- BASICALLY A TEMPORARY STORAGE FOR IDS, SO WE CAN SEE CLEANER SCANS AND WHAT NOT,
--- WE'LL GO BACK HERE LATER DOWN THE ROAD.
--------------------------------------------------------------------------------
-local NO_PLAYER_FLAG = {
-	[30344] = true, 		[30341] = true, 		[32814] = true, 		[23066] = true,
-	[26421] = true, 		[36955] = true, 		[19788] = true, 		[23129] = true,
-	[26422] = true, 		[12715] = true, 		[12899] = true, 		[56459] = true,
-	[30307] = true, 		[26423] = true, 		[3918] = true,	 		[23067] = true,
-	[30308] = true, 		[3953] = true,			[15255] = true, 		[26424] = true,
-	[30548] = true, 		[44157] = true, 		[56462] = true, 		[19567] = true,
-	[30552] = true, 		[23068] = true, 		[44155] = true, 		[28327] = true,
-	[26425] = true, 		[56461] = true, 		[68067] = true, 		[15633] = true,
-	[23096] = true, 		[12589] = true, 		[26442] = true, 		[26426] = true,
-	[67920] = true, 		[9273] = true,			[3926] = true,			[6458] = true,
-	[19793] = true, 		[55252] = true, 		[9271] = true,			[26427] = true,
-	[26443] = true, 		[30551] = true, 		[23486] = true, 		[3922] = true,
-	[3924] = true,			[12590] = true, 		[3928] = true,			[3942] = true,
-	[26428] = true, 		[3952] = true,	 		[22704] = true, 		[12902] = true,
-	[30569] = true, 		[15628] = true, 		[12895] = true, 		[21940] = true,
-	[56349] = true, 		[12584] = true, 		[56477] = true, 		[30348] = true,
-	[26416] = true, 		[53281] = true, 		[23507] = true,			[12075] = true,
-	[12079] = true,			[26746] = true,			[56000] = true,
-
-		-----------------------------------------------------------------------------------------
-	---JEWELCRAFTING
-	-----------------------------------------------------------------------------------------
-	[55401] = true, [53995] = true, [66432] = true, [25255] = true,
-[66497] = true, [53996] = true, [56074] = true, [56202] = true,
- [66434] = true, [32801] = true, [28948] = true, [53997] = true,
- [39963] = true, [32866] = true, [66501] = true, [39452] = true,
- [53934] = true, [66502] = true, [55405] = true, [58954] = true,
- [56205] = true, [37855] = true, [38175] = true, [25305] = true,
- [25321] = true, [66505] = true, [54000] = true, [39742] = true,
- [56206] = true, [66506] = true, [32869] = true, [54001] = true,
- [56079] = true, [32259] = true, [32870] = true, [56208] = true,
- [32807] = true, [32871] = true, [26873] = true, [31061] = true,
- [32872] = true, [42591] = true, [46779] = true, [56530] = true,
- [42592] = true, [31062] = true, [56083] = true, [32874] = true,
- [56531] = true, [31063] = true, [56085] = true, [38503] = true,
- [56086] = true, [28938] = true, [38504] = true, [31064] = true,
- [31096] = true, [55384] = true, [25278] = true, [68253] = true,
- [43493] = true, [26925] = true, [31065] = true, [46403] = true,
- [53852] = true, [53916] = true, [39722] = true, [25615] = true,
- [28924] = true, [26926] = true, [53853] = true, [36526] = true,
- [31098] = true, [55388] = true, [46405] = true, [53854] = true,
- [39724] = true, [55389] = true, [26927] = true, [31051] = true,
- [53919] = true, [39725] = true, [55390] = true, [53856] = true,
- [53920] = true, [53952] = true, [26880] = true, [53857] = true,
- [31052] = true, [34069] = true, [25490] = true, [55393] = true,
- [39451] = true, [53956] = true, [44794] = true, [36524] = true,
- [55395] = true, [38068] = true, [28944] = true, [53957] = true,
- [31066] = true, [31082] = true, [66428] = true, [26909] = true,
- [55396] = true, [31097] = true, [25284] = true, [56084] = true,
- [62941] = true, [66431] = true, [53894] = true, [53958] = true,
- [58146] = true, [31099] = true, [47053] = true, [31067] = true,
- [28917] = true, [26903] = true, [36525] = true, [66503] = true,
- [56197] = true, [47054] = true, [53961] = true, [39715] = true,
- [31092] = true, [53960] = true, [31077] = true, [31101] = true,
- [39719] = true, [55399] = true, [31113] = true, [32808] = true,
- [53917] = true, [63743] = true, [39720] = true, [39721] = true,
- [42590] = true, [58149] = true, [56199] = true, [47056] = true,
- [28950] = true, [47280] = true, [32809] = true, [31072] = true,
-[25318] = true, [66429] = true, [62242] = true,
----------------------------------------------------------------------------------------
-
----------------------------------------------------------------------------------------
----COOKING
----------------------------------------------------------------------------------------
-[62050]= true, [22761]= true, [62051]= true, [8607]= true,
-[18238]= true, [6413]= true, [6417]= true, [42296]= true,
-[45557]= true, [6501]= true, [45558]= true, [18239]= true,
- [7752]= true, [7828]= true, [45560]= true, [64358]= true,
- [57421]= true, [45561]= true, [13028]= true, [2543]= true,
- [2545]= true, [25659]= true, [58512]= true, [45565]= true,
- [42305]= true, [45566]= true, [62350]= true, [7753]= true,
- [45695]= true, [9513]= true, [18244]= true, [20626]= true,
- [45569]= true, [43779]= true, [18245]= true, [45571]= true,
- [18246]= true, [37836]= true, [57433]= true, [20916]= true,
- [58521]= true, [18247]= true, [57435]= true, [7754]= true,
- [53056]= true, [58523]= true, [57437]= true, [57438]= true,
- [58525]= true, [45570]= true, [2538]= true, [2540]= true,
- [2548]= true, [33290]= true, [45562]= true, [15906]= true,
- [18241]= true, [45559]= true, [45551]= true, [57443]= true,
- [58527]= true, [43758]= true, [58528]= true, [8238]= true,
- [7751]= true, [7755]= true, [43761]= true, [7827]= true,
- [45552]= true, [45553]= true,
- ---------------------------------------------------------------------------------------
-
-  ---------------------------------------------------------------------------------------
-  ---BLACKSMITHING
-   ---------------------------------------------------------------------------------------
- [10015] = true, [55202] = true, [16726] = true, [24399] = true,
-[15293] = true, [32655] = true, [3320] = true, [40033] = true,
-[34545] = true, [61010] = true, [16639] = true, [3115] = true,
-[3116] = true, [3117] = true, [16648] = true, [40034] = true,
- [9920] = true, [9928] = true, [29558] = true, [55839] = true,
- [9964] = true, [7818] = true, [55732] = true, [29694] = true,
- [3326] = true, [9950] = true, [59405] = true, [12260] = true,
- [16983] = true, [16991] = true, [23650] = true, [16640] = true,
- [2741] = true, [3513] = true, [3497] = true, [8768] = true,
- [19666] = true, [2662] = true, [2663] = true, [20201] = true,
- [16664] = true, [15294] = true, [3496] = true, [16645] = true,
- [29569] = true, [2737] = true, [14380] = true, [16992] = true,
- [36125] = true, [19667] = true, [22757] = true, [16665] = true,
- [59406] = true, [2738] = true, [2739] = true, [2740] = true,
- [24913] = true, [9933] = true, [20873] = true, [36126] = true,
- [40035] = true, [8880] = true, [23636] = true, [3292] = true,
- [3293] = true, [21161] = true, [32656] = true, [19668] = true,
- [9921] = true, [7222] = true, [3319] = true, [15295] = true,
- [20874] = true, [20890] = true, [3337] = true, [34546] = true,
- [16970] = true, [16978] = true, [61008] = true, [7224] = true,
- [11454] = true, [19669] = true, [55656] = true, [16667] = true,
- [16731] = true, [61009] = true, [9926] = true, [16984] = true,
- [21913] = true, [40036] = true, [9974] = true, [32657] = true,
- [32285] = true, [23638] = true, [10011] = true, [36131] = true,
- [27830] = true,  [32284] = true, [16732] = true, [15292] = true,
- [15296] = true, [38478] = true, [20876] = true, [38475] = true,
- [23653] = true, [3325] = true, [14379] = true,  [29729] = true,
- [2661] = true,  [29728] = true, [16655] = true, [16993] = true,
- [3491] = true, [3494] = true, [3501] = true, [9959] = true,
- [9983] = true, [36262] = true, [10003] = true, [10007] = true,
-  ---------------------------------------------------------------------------------------
-
-  ---------------------------------------------------------------------------------------
-----INSCRIPTION
-  ---------------------------------------------------------------------------------------
-  [58315] = true, [58331] = true, [58347] = true, [56974] = true, [56990] = true,
-[64256] = true, [64304] = true, [57166] = true, [57709] = true, [57214] = true,
- [57230] = true, [50603] = true, [57262] = true, [59338] = true, [58332] = true,
- [56959] = true, [56975] = true, [56991] = true, [57007] = true, [57023] = true,
- [53462] = true, [64257] = true, [64273] = true, [64289] = true, [57151] = true,
- [57167] = true, [57183] = true, [57710] = true, [57215] = true, [57247] = true,
- [50620] = true, [58301] = true, [59339] = true, [58333] = true, [59387] = true,
- [52840] = true, [59499] = true, [56960] = true, [56976] = true, [57008] = true,
- [57024] = true, [64258] = true, [64274] = true, [57168] = true, [57184] = true,
- [61288] = true, [57216] = true, [57232] = true, [58286] = true, [58302] = true,
- [59340] = true, [48114] = true, [64051] = true, [59484] = true, [59500] = true,
- [56961] = true, [56977] = true, [57009] = true, [57025] = true, [61177] = true,
- [64259] = true, [57121] = true, [64291] = true, [57153] = true, [57169] = true,
- [57185] = true, [57712] = true, [57217] = true, [57233] = true, [58287] = true,
- [58303] = true, [58319] = true, [56946] = true, [56978] = true, [56994] = true,
- [57010] = true, [57026] = true, [64260] = true, [57122] = true, [57154] = true,
- [57170] = true, [57186] = true, [57713] = true, [57218] = true, [57234] = true,
- [57266] = true, [59326] = true, [58320] = true, [58336] = true, [59486] = true,
- [59502] = true, [56963] = true, [56995] = true, [57011] = true, [57027] = true,
- [64261] = true, [64277] = true, [57155] = true, [57187] = true, [57714] = true,
- [57219] = true, [57235] = true, [58289] = true, [58305] = true, [58321] = true,
- [58337] = true, [69385] = true, [57243] = true, [64314] = true, [64313] = true,
- [56958] = true, [59487] = true, [59503] = true, [58288] = true, [56980] = true,
- [56996] = true, [57012] = true, [57028] = true, [59501] = true, [56948] = true,
- [57264] = true, [64246] = true, [64262] = true, [57124] = true, [64294] = true,
- [57156] = true, [57172] = true, [57188] = true, [57715] = true, [57220] = true,
- [57236] = true, [57268] = true, [58306] = true, [58322] = true, [58338] = true,
- [48247] = true, [57133] = true, [57270] = true, [57131] = true, [57129] = true,
- [50604] = true, [59488] = true, [59504] = true, [56965] = true, [56981] = true,
- [56997] = true, [57013] = true, [57029] = true, [64280] = true, [57114] = true,
- [64286] = true, [58299] = true, [57125] = true, [64295] = true, [64311] = true,
- [57164] = true, [57189] = true, [57716] = true, [57221] = true, [57237] = true,
- [57269] = true, [58307] = true, [58323] = true, [58339] = true, [64307] = true,
- [57119] = true, [57246] = true, [68166] = true, [64282] = true, [57250] = true,
- [59489] = true, [56957] = true, [56982] = true, [56998] = true, [57014] = true,
- [57117] = true, [64305] = true, [61677] = true, [52843] = true, [57126] = true,
- [64296] = true, [57158] = true, [64310] = true, [57190] = true, [56956] = true,
- [57238] = true, [60336] = true, [58308] = true, [58324] = true, [58340] = true,
- [64315] = true, [56949] = true, [56950] = true, [64308] = true, [56955] = true,
- [59490] = true, [59315] = true, [56983] = true, [56999] = true, [64267] = true,
- [57031] = true, [56954] = true, [64276] = true, [57249] = true, [64249] = true,
- [56953] = true, [57127] = true, [64297] = true, [57159] = true, [64275] = true,
- [57191] = true, [57207] = true, [57223] = true, [57239] = true, [50612] = true,
- [60337] = true, [57208] = true, [58325] = true, [48121] = true, [56952] = true,
- [56947] = true, [56951] = true, [64268] = true, [57123] = true, [59475] = true,
- [59491] = true, [56968] = true, [56984] = true, [57000] = true, [48248] = true,
- [58565] = true, [58317] = true, [64266] = true, [57252] = true, [64250] = true,
- [57112] = true, [57128] = true, [64298] = true, [57160] = true, [58316] = true,
- [57703] = true, [57719] = true, [57224] = true, [57240] = true, [57272] = true,
- [58310] = true, [58326] = true, [58342] = true, [57201] = true, [56945] = true,
-[57200] = true, [56944] = true, [57711] = true, [56985] = true, [57001] = true,
-[57199] = true, [57033] = true, [56943] = true, [57198] = true, [64251] = true,
-[57113] = true, [64283] = true, [64299] = true, [57161] = true, [57197] = true,
-[57704] = true, [57209] = true, [57225] = true, [57241] = true, [50614] = true,
-[57273] = true, [58311] = true, [58327] = true, [58343] = true, [52738] = true,
-[57196] = true, [64278] = true, [57195] = true, [58318] = true, [64284] = true,
-[57006] = true, [64316] = true, [56986] = true, [57002] = true, [59560] = true,
-[57034] = true, [58341] = true, [57192] = true, [64252] = true, [67600] = true,
- [57130] = true, [64300] = true, [57162] = true, [57244] = true,   [57194] = true,
- [57210] = true, [57226] = true, [50599] = true, [57258] = true, [58296] = true,
- [58312] = true, [58328] = true, [58344] = true, [52739] = true, [58298] = true,
- [57274] = true, [57265] = true, [57251] = true, [59478] = true, [56971] = true,
- [56987] = true, [57003] = true, [57019] = true, [57035] = true, [57259] = true,
- [57263] = true, [57271] = true, [64253] = true, [57115] = true, [64285] = true,
- [57242] = true, [57163] = true, [57120] = true, [57706] = true, [57211] = true,
- [57227] = true, [50600] = true, [50616] = true, [58297] = true, [58313] = true,
- [58329] = true, [58345] = true, [50602] = true, [57248] = true, [59559] = true,
- [57157] = true, [57257] = true, [64309] = true, [64317] = true, [56972] = true,
- [56988] = true, [57004] = true, [57020] = true, [57036] = true, [62162] = true,
- [57030] = true, [64254] = true, [57116] = true, [57132] = true, [64302] = true,
- [64318] = true, [64270] = true, [57707] = true, [57212] = true, [57228] = true,
- [50601] = true, [57260] = true, [57276] = true, [58314] = true, [58330] = true,
- [58346] = true, [45382] = true, [57267] = true, [57275] = true, [64312] = true,
- [64279] = true, [50598] = true, [59480] = true, [59496] = true, [56973] = true,
- [56989] = true, [57005] = true, [57021] = true, [50619] = true, [50618] = true,
- [65245] = true, [50617] = true, [64255] = true, [64271] = true, [64287] = true,
- [64303] = true, [57165] = true, [57181] = true, [57708] = true, [57213] = true,
- [57229] = true, [57245] = true, [57261] = true, [57277] = true, [57253] = true,
-   ---------------------------------------------------------------------------------------
-
-   ---------------------------------------------------------------------------------------
-----ENCHANTING
-   ---------------------------------------------------------------------------------------
-   [46578] = true, [25125] = true, [13612] = true, [13620] = true, [13628] = true,
-[13640] = true, [13644] = true, [13648] = true, [59625] = true, [13700] = true,
- [17181] = true, [27920] = true, [27960] = true, [28016] = true, [45765] = true,
- [14810] = true, [63746] = true, [13836] = true, [20008] = true, [20032] = true,
- [13868] = true, [13421] = true, [13948] = true, [27905] = true, [27945] = true,
- [13501] = true, [7786] = true, [7788] = true, [13529] = true, [32664] = true,
- [44506] = true, [25127] = true, [20025] = true, [20033] = true, [13617] = true,
- [64579] = true, [60619] = true, [13657] = true, [13693] = true, [27914] = true,
- [44555] = true, [27954] = true, [27962] = true, [14807] = true, [32665] = true,
- [7421] = true, [13817] = true, [25072] = true, [44492] = true, [44524] = true,
- [7443] = true, [44556] = true, [25128] = true, [20026] = true, [7457] = true,
- [13378] = true, [34001] = true, [13917] = true, [13933] = true, [13937] = true,
- [13941] = true, [44621] = true, [28003] = true, [28027] = true, [13522] = true,
- [13538] = true, [25081] = true, [44494] = true, [20011] = true, [25129] = true,
- [44590] = true, [47672] = true, [20051] = true, [13622] = true, [13626] = true,
- [69412] = true, [60623] = true, [44383] = true, [13698] = true, [13702] = true,
- [23804] = true, [44623] = true, [28004] = true, [28028] = true, [14293] = true,
- [32667] = true, [13822] = true, [25082] = true, [44576] = true, [20028] = true,
- [20036] = true, [13890] = true, [13898] = true, [60609] = true, [59619] = true,
- [47898] = true, [7745] = true, [27957] = true, [13503] = true, [34006] = true,
- [7793] = true, [7795] = true, [59636] = true, [25083] = true, [20029] = true,
- [13631] = true, [13655] = true, [7861] = true, [7863] = true, [62256] = true,
- [13695] = true, [13858] = true, [44483] = true, [27968] = true, [7857] = true,
- [27967] = true, [42615] = true, [27958] = true, [42613] = true, [25084] = true,
- [20017] = true, [33992] = true, [34008] = true, [13663] = true, [60653] = true,
- [44528] = true, [14809] = true, [27961] = true, [47901] = true, [7418] = true,
- [7420] = true, [44488] = true, [7426] = true, [44616] = true, [13841] = true,
- [44596] = true, [17180] = true, [7454] = true, [33993] = true, [34009] = true,
- [27950] = true, [20031] = true, [13915] = true, [47900] = true, [13943] = true,
- [13947] = true, [13945] = true, [13464] = true, [27927] = true, [7771] = true,
- [20014] = true, [20030] = true, [27947] = true, [33994] = true, [28022] = true,
- [60692] = true, [25130] = true, [34005] = true, [13794] = true, [7748] = true,
- [44588] = true, [15596] = true, [7776] = true, [44584] = true, [13607] = true,
- [13653] = true, [20020] = true,
-    ---------------------------------------------------------------------------------------
-
-    ---------------------------------------------------------------------------------------
----TAILORING
-    ---------------------------------------------------------------------------------------
-	[12055] = true, [12059] = true, [12071] = true, [46131] = true, [23664] = true,
-[31433] = true, [31441] = true, [7624] = true, [26403] = true, [24902] = true,
- [22866] = true, [56001] = true, [18411] = true, [18419] = true, [18451] = true,
- [28208] = true, [6686] = true, [8766] = true, [23665] = true, [8786] = true,
- [26747] = true, [56002] = true, [26763] = true, [26779] = true, [31434] = true,
- [31450] = true, [60969] = true, [28480] = true, [22867] = true, [56003] = true,
- [18404] = true, [18412] = true, [18420] = true, [12044] = true, [63924] = true,
- [12056] = true, [12064] = true, [12080] = true, [12084] = true, [23666] = true,
- [56004] = true, [26780] = true, [31459] = true, [7892] = true, [60971] = true,
- [28481] = true, [22868] = true, [20848] = true, [56005] = true, [18405] = true,
- [19435] = true, [26086] = true, [18437] = true, [18453] = true, [27659] = true,
- [28210] = true, [40021] = true, [23667] = true, [26773] = true, [26781] = true,
- [26759] = true, [8774] = true, [31460] = true, [24903] = true, [3755] = true,
- [37882] = true, [3757] = true, [3758] = true, [50194] = true, [18446] = true,
- [6692] = true, [28482] = true, [22869] = true, [18439] = true, [20849] = true,
- [18440] = true, [2389] = true, [56007] = true, [18455] = true, [6521] = true,
- [18445] = true, [18406] = true, [18414] = true, [18422] = true, [12045] = true,
- [36318] = true, [18454] = true, [27660] = true, [24091] = true, [12065] = true,
- [12069] = true, [12077] = true, [12081] = true, [12085] = true, [27724] = true,
- [12093] = true, [40060] = true, [26087] = true, [26749] = true, [31373] = true,
- [26750] = true, [26782] = true, [28205] = true, [28209] = true, [36686] = true,
- [3813] = true, [2394] = true, [7629] = true, [18438] = true, [7633] = true,
- [40023] = true, [49677] = true, [26407] = true, [18452] = true, [7643] = true,
- [22870] = true, [26755] = true, [22902] = true, [3869] = true, [55993] = true,
- [8789] = true, [3839] = true, [3841] = true, [3844] = true, [18407] = true,
- [18415] = true, [3847] = true, [3848] = true, [3851] = true, [3852] = true,
- [24092] = true, [3854] = true, [3856] = true, [3857] = true, [8760] = true,
- [27725] = true, [8776] = true, [8780] = true, [8784] = true, [3865] = true,
- [55994] = true, [3868] = true, [26783] = true, [3871] = true, [3872] = true,
- [3873] = true, [31438] = true, [22759] = true, [12091] = true, [8804] = true,
- [8772] = true, [18560] = true, [18447] = true, [44950] = true, [60993] = true,
- [55899] = true, [55898] = true, [55995] = true, [2385] = true, [21945] = true,
- [6688] = true, [12066] = true, [18416] = true, [8465] = true, [12046] = true,
- [18448] = true, [3915] = true, [24093] = true, [8489] = true, [2386] = true,
- [12078] = true, [12082] = true, [60994] = true, [55900] = true, [2392] = true,
- [2393] = true, [23662] = true, [2396] = true, [55996] = true, [2399] = true,
- [26784] = true, [2402] = true, [2403] = true, [2406] = true, [31431] = true,
- [3864] = true, [8782] = true, [37884] = true, [37883] = true, [26751] = true,
- [50647] = true, [8802] = true, [8467] = true, [7893] = true, [40020] = true,
- [41208] = true, [22813] = true, [41207] = true, [37873] = true, [2387] = true,
- [55997] = true, [26085] = true, [8799] = true, [27658] = true, [8483] = true,
- [3914] = true, [18401] = true, [56006] = true, [18441] = true, [18449] = true,
- [28207] = true, [55769] = true, [18413] = true, [18421] = true, [46129] = true,
- [2963] = true, [2964] = true, [12061] = true, [12086] = true, [23663] = true,
- [26745] = true, [55998] = true, [3863] = true, [8764] = true, [31440] = true,
- [31448] = true, [12089] = true, [6695] = true, [40024] = true, [60990] = true,
- [50644] = true, [8793] = true, [46130] = true, [24901] = true, [3870] = true,
- [31437] = true, [44958] = true, [55999] = true, [3845] = true, [6693] = true,
- [3866] = true, [18456] = true, [18410] = true, [18418] = true, [2397] = true,
- [18434] = true, [18450] = true,
-     ---------------------------------------------------------------------------------------
-
-     ---------------------------------------------------------------------------------------
-	 ----LEATHERWORKING
-	 ---------------------------------------------------------------------------------------
-[9198] = true, [23704] = true, [60996] = true, [35549] = true, [22921] = true,
- [50958] = true, [10509] = true, [10525] = true, [19053] = true, [19085] = true,
- [19101] = true, [2149] = true, [36349] = true, [2153] = true, [60997] = true,
- [2159] = true, [2163] = true, [2165] = true, [35582] = true, [50959] = true,
- [46132] = true, [23705] = true, [60998] = true, [22922] = true, [46133] = true,
- [24121] = true, [19054] = true, [19070] = true, [19086] = true, [19102] = true,
- [32465] = true, [32481] = true, [22331] = true, [35520] = true, [35584] = true,
- [9207] = true, [6661] = true, [46134] = true, [23706] = true, [61000] = true,
- [35521] = true, [35585] = true, [50962] = true, [10518] = true, [39997] = true,
- [24122] = true, [19055] = true, [19087] = true, [19103] = true, [32466] = true,
- [32482] = true, [36353] = true, [35522] = true, [35554] = true, [50963] = true,
- [44953] = true, [46136] = true, [23707] = true, [61002] = true, [35523] = true,
- [35555] = true, [35587] = true, [50964] = true, [46137] = true, [24123] = true,
- [19072] = true, [19104] = true, [9064] = true, [9072] = true, [69386] = true,
- [32499] = true, [36355] = true, [7133] = true, [35524] = true, [35588] = true,
- [7153] = true, [9208] = true, [46138] = true, [23708] = true, [69388] = true,
- [35525] = true, [35557] = true, [10487] = true, [10511] = true, [46139] = true,
- [24124] = true, [19073] = true, [19089] = true, [32468] = true, [32500] = true,
- [10647] = true, [28472] = true, [35526] = true, [35558] = true, [45117] = true,
- [60622] = true, [23709] = true, [35527] = true, [3774] = true, [3778] = true,
- [3780] = true, [40003] = true, [24125] = true, [19058] = true, [19074] = true,
- [32485] = true, [32501] = true, [36359] = true, [3816] = true, [3818] = true,
- [28473] = true, [35528] = true, [35560] = true, [9193] = true, [40004] = true,
- [23710] = true, [8322] = true, [35529] = true, [35561] = true, [50970] = true,
- [2881] = true, [10520] = true, [40005] = true, [10544] = true, [10552] = true,
- [10560] = true, [19091] = true, [19107] = true, [32454] = true, [32502] = true,
- [28474] = true, [35530] = true, [50971] = true, [62448] = true, [7953] = true,
- [41157] = true, [36074] = true, [24846] = true, [35531] = true, [22928] = true,
- [28219] = true, [41158] = true, [36075] = true, [32487] = true, [32503] = true,
- [7126] = true, [9146] = true, [35532] = true, [35564] = true, [9194] = true,
- [9202] = true, [24655] = true, [36076] = true, [24847] = true, [35533] = true,
- [5244] = true, [10529] = true, [28220] = true, [19093] = true, [32456] = true,
- [52733] = true, [2158] = true, [2160] = true, [2162] = true, [2166] = true,
- [24848] = true, [35535] = true, [35567] = true, [28221] = true, [19094] = true,
- [44359] = true, [57690] = true, [32457] = true, [32473] = true, [32489] = true,
- [9147] = true, [35536] = true, [35568] = true, [9195] = true, [41163] = true,
- [6703] = true, [24849] = true, [20853] = true, [10482] = true, [10490] = true,
- [28222] = true, [10546] = true, [10554] = true, [41164] = true, [10570] = true,
- [19095] = true, [57692] = true, [32458] = true, [10650] = true, [35538] = true,
- [42731] = true, [24850] = true, [20854] = true, [44970] = true, [28223] = true,
- [19048] = true, [19064] = true, [19080] = true, [57694] = true, [9148] = true,
- [35540] = true, [35572] = true, [24851] = true, [20855] = true, [45100] = true,
- [10531] = true, [28224] = true, [57696] = true, [10619] = true, [19081] = true,
- [22727] = true, [35539] = true, [19079] = true, [10566] = true, [19065] = true,
- [10574] = true, [19097] = true, [60647] = true, [3753] = true, [9065] = true,
- [44343] = true, [3763] = true, [3767] = true, [3773] = true, [3775] = true,
- [3777] = true, [3779] = true, [32455] = true, [24940] = true, [19050] = true,
- [19082] = true, [23190] = true, [32461] = true, [60999] = true, [3817] = true,
- [44344] = true, [9149] = true, [35544] = true, [9197] = true, [19077] = true,
- [9060] = true, [19076] = true, [35573] = true, [40001] = true, [19066] = true,
- [19090] = true, [19098] = true, [22711] = true, [57699] = true, [9059] = true,
- [32480] = true, [64661] = true, [10562] = true, [40002] = true, [50936] = true,
- [6705] = true, [9058] = true, [24703] = true, [22923] = true, [60645] = true,
- [35577] = true, [2152] = true, [10556] = true, [10572] = true, [44770] = true,
- [36077] = true, [19059] = true, [19075] = true, [35580] = true, [20648] = true,
- [2169] = true, [60643] = true, [19088] = true, [6702] = true, [6704] = true,
- [35543] = true, [7149] = true, [36078] = true, [36079] = true, [23703] = true,
- [35534] = true, [57701] = true, [46135] = true, [19047] = true, [20649] = true,
- [40006] = true, [3765] = true, [41156] = true, [3771] = true, [50956] = true,
- [19061] = true, [20650] = true, [32467] = true, [35537] = true, [22926] = true,
- [4096] = true, [19062] = true, [44768] = true, [35576] = true, [19063] = true,
- [9062] = true, [9070] = true, [32495] = true,
- ---------------------------------------------------------------------------------------
-
-  ---------------------------------------------------------------------------------------
- -----ALCHEMY
-   ---------------------------------------------------------------------------------------
-  [53898] = true, [28579] = true, [17566] = true, [53771] = true, [7256] = true,
-[53899] = true, [11452] = true, [11460] = true, [11468] = true, [3170] = true,
- [3172] = true, [3174] = true, [3176] = true, [53836] = true, [53900] = true,
- [28564] = true, [28580] = true, [54220] = true, [17551] = true, [53773] = true,
- [53837] = true, [62213] = true, [54221] = true, [53774] = true, [53838] = true,
- [6617] = true, [53902] = true, [28581] = true, [2331] = true, [2335] = true,
- [2337] = true, [53775] = true, [53839] = true, [11453] = true, [7836] = true,
- [24266] = true, [41500] = true, [53904] = true, [53936] = true, [28566] = true,
- [28582] = true, [3452] = true, [3454] = true, [33732] = true, [17553] = true,
- [22732] = true, [53777] = true, [53905] = true, [53937] = true, [33733] = true,
- [62409] = true, [25146] = true, [41502] = true, [53938] = true, [28551] = true,
- [28567] = true, [28583] = true, [62410] = true, [7181] = true, [17570] = true,
- [17634] = true, [53779] = true, [7257] = true, [53939] = true, [11478] = true,
- [17187] = true, [53812] = true, [28552] = true, [28568] = true, [28584] = true,
- [60366] = true, [57425] = true, [17635] = true, [53781] = true, [60367] = true,
- [4508] = true, [53782] = true, [24365] = true, [6618] = true, [53942] = true,
- [28569] = true, [28585] = true, [29688] = true, [57427] = true, [17556] = true,
- [17572] = true, [17636] = true, [53783] = true, [11479] = true, [7837] = true,
- [7841] = true, [53784] = true, [24366] = true, [53848] = true, [28554] = true,
- [28570] = true, [28586] = true, [58868] = true, [33741] = true, [24367] = true,
- [28555] = true, [28571] = true, [17574] = true, [17638] = true, [7258] = true,
- [11448] = true, [11456] = true, [11464] = true, [11480] = true, [3171] = true,
- [3173] = true, [3175] = true, [24368] = true, [28572] = true, [28588] = true,
- [45061] = true, [66658] = true, [17559] = true, [17575] = true, [66659] = true,
- [66660] = true, [63732] = true, [28573] = true, [66662] = true, [17560] = true,
- [2330] = true, [2332] = true, [2334] = true, [66663] = true, [11457] = true,
- [11465] = true, [11473] = true, [66664] = true, [3449] = true, [3451] = true,
- [3453] = true, [17561] = true, [17577] = true, [28543] = true, [28575] = true,
- [7179] = true, [17562] = true, [17578] = true, [7255] = true, [7259] = true,
- [11458] = true, [11466] = true, [38962] = true, [53776] = true, [12609] = true,
- [53780] = true, [60893] = true, [58871] = true, [3448] = true, [3450] = true,
- [3447] = true, [4942] = true, [28576] = true, [15833] = true, [17576] = true,
- [41503] = true, [60350] = true, [41501] = true, [17563] = true, [42736] = true,
- [54213] = true, [41458] = true, [6624] = true, [39636] = true, [28577] = true,
- [32765] = true, [38070] = true, [17564] = true, [17580] = true, [53895] = true,
- [11451] = true, [39637] = true, [28546] = true, [28562] = true, [28578] = true,
- [60354] = true, [32766] = true, [17565] = true, [22808] = true, [39639] = true,
- [60355] = true, [56519] = true,
-  ---------------------------------------------------------------------------------------
-
-  ---------------------------------------------------------------------------------------
-  ----ENGINEERING
-  ---------------------------------------------------------------------------------------
-  [23081] = true, [12586] = true, [12594] = true, [12622] = true, [30347] = true,
-[44391] = true, [30547] = true, [56464] = true, [12754] = true, [12758] = true,
- [23489] = true, [23082] = true, [8243] = true, [9269] = true, [30316] = true,
- [30332] = true, [12906] = true, [8339] = true, [26420] = true, [56514] = true,
- [39971] = true, [12599] = true, [12603] = true, [12607] = true, [43676] = true,
- [12619] = true, [54998] = true, [30349] = true, [56468] = true, [12755] = true,
- [12759] = true, [63750] = true, [39973] = true, [56465] = true, [56469] = true,
- [30318] = true, [30334] = true, [55016] = true, [12903] = true, [54793] = true,
- [19795] = true, [8895] = true, [19819] = true, [30558] = true, [39895] = true,
- [23069] = true, [23077] = true, [12596] = true, [30303] = true, [56471] = true,
- [12624] = true, [19796] = true, [56472] = true, [12760] = true, [63770] = true,
- [23070] = true, [23078] = true, [61471] = true, [30304] = true, [30312] = true,
- [12908] = true, [12597] = true, [3930] = true, [24356] = true, [67839] = true,
- [67326] = true, [56474] = true, [30560] = true, [30568] = true, [30314] = true,
- [3929] = true, [56475] = true, [19830] = true, [3946] = true, [54736] = true,
- [30563] = true, [24357] = true, [30337] = true, [12591] = true, [19814] = true,
- [60866] = true, [12716] = true, [23071] = true, [23079] = true, [12585] = true,
- [3923] = true, [3925] = true, [30305] = true, [12621] = true, [30329] = true,
- [3931] = true, [3932] = true, [3933] = true, [3936] = true, [3937] = true,
- [3938] = true, [3939] = true, [3941] = true, [56473] = true, [3944] = true,
- [3945] = true, [3947] = true, [54999] = true, [3949] = true, [3950] = true,
- [26417] = true, [12717] = true, [3954] = true, [3955] = true, [3957] = true,
- [3958] = true, [3961] = true, [3962] = true, [3963] = true, [3965] = true,
- [3966] = true, [3967] = true, [3968] = true, [3969] = true, [3971] = true,
- [3972] = true, [3973] = true, [7430] = true, [3977] = true, [3978] = true,
- [3979] = true, [19790] = true, [23080] = true, [12620] = true, [30309] = true,
- [30346] = true, [12905] = true, [41307] = true, [8334] = true, [56460] = true,
- [56476] = true, [12718] = true, [26418] = true, [19791] = true, [3960] = true,
- [19815] = true, [13240] = true, [19831] = true, [30570] = true, [19799] = true,
- [30306] = true, [30310] = true, [26011] = true, [36954] = true, [3919] = true,
- [3920] = true, [19800] = true, [12617] = true, [30311] = true, [56463] = true,
----------------------------------------------------------------------------------------
-}
-
-local function LoadRecipe()
-	local recipe_list = addon.recipe_list
-
-	if (not recipe_list) then
-		if (addon.db.profile.autoloaddb) then
-			local dbloaded
-			dbloaded, recipe_list = addon:InitRecipeData()
-
-			if (not dbloaded) then return end
-
-			for idx, prof in pairs(PROFESSIONS) do
-				addon:AddRecipeData(prof)
-			end
-		else
-			addon:Print(L["DATAMINER_NODB_ERROR"])
-			return
-		end
-	else
-		-- Recipe DB exists, we just need to populate it now
-		if (addon.db.profile.autoloaddb) then
-			for idx, prof in pairs(PROFESSIONS) do
-				addon:AddRecipeData(prof)
-			end
-		end
-	end
-	return recipe_list
-
-end
-
--------------------------------------------------------------------------------
--- Creates a reverse lookup for a recipe list
--------------------------------------------------------------------------------
-local CreateReverseLookup
-do
-	local reverse_lookup = {}
-
-	function CreateReverseLookup(recipe_list)
-		if (not recipe_list) then
-			addon:Print(L["DATAMINER_NODB_ERROR"])
-			return
-		end
-
-		twipe(reverse_lookup)
-
-		for i in pairs(recipe_list) do
-			--if t[recipe_list[i]["Name"]] then addon:Print("Dupe: " .. i) end
-			reverse_lookup[recipe_list[i]["Name"]] = i
-		end
-
-		return reverse_lookup
-	end
-
-end
-
--------------------------------------------------------------------------------
--- Tooltip for data-mining.
--------------------------------------------------------------------------------
-local ARLDatamineTT = CreateFrame("GameTooltip", "ARLDatamineTT", UIParent, "GameTooltipTemplate")
-
-do
-	-- Tables used in all the Scan functions within this do block. -Torhal
-	local info, output = {}, {}
-
-	--- Function to compare the skill levels of a trainers recipes with those in the ARL database.
-	-- @name AckisRecipeList:ScanSkillLevelData
-	-- @param autoscan True when autoscan is enabled in preferences, it will surpress output letting you know when a scan has occured.
-	-- @return Does a comparison of the information in your internal ARL database, and those items which are available on the trainer.  Compares the skill levels between the two.
-	function addon:ScanSkillLevelData(autoscan)
-		if not IsTradeskillTrainer() then
-			if not autoscan then
-				self:Print(L["DATAMINER_SKILLLEVEL_ERROR"])
-			end
-			return
-		end
-		local recipe_list = LoadRecipe()	-- Get internal database
-
-		if not recipe_list then
-			self:Print(L["DATAMINER_NODB_ERROR"])
-			return
-		end
-		-- Get the initial trainer filters
-		local avail = GetTrainerServiceTypeFilter("available")
-		local unavail = GetTrainerServiceTypeFilter("unavailable")
-		local used = GetTrainerServiceTypeFilter("used")
-
-		-- Clear the trainer filters
-		SetTrainerServiceTypeFilter("available", 1)
-		SetTrainerServiceTypeFilter("unavailable", 1)
-		SetTrainerServiceTypeFilter("used", 1)
-
-		twipe(info)
-
-		-- Get the skill levels from the trainer
-		for i = 1, GetNumTrainerServices(), 1 do
-			local name = GetTrainerServiceInfo(i)
-			local _, skilllevel = GetTrainerServiceSkillReq(i)
-
-			if not skilllevel then
-				skilllevel = 0
-			end
-			info[name] = skilllevel
-		end
-		local found = false
-
-		twipe(output)
-
-		for i in pairs(recipe_list) do
-			local i_name = recipe_list[i]["Name"]
-
-			if info[i_name] and info[i_name] ~= recipe_list[i]["Level"] then
-				found = true
-				tinsert(output, L["DATAMINER_SKILLELVEL"]:format(i_name, recipe_list[i]["Level"], info[i_name]))
-			end
-		end
-		tinsert(output, "Trainer Skill Level Scan Complete.")
-
-		if found then
-			self:DisplayTextDump(nil, nil, tconcat(output, "\n"))
-		end
-		-- Reset the filters to what they were before
-		SetTrainerServiceTypeFilter("available", avail or 0)
-		SetTrainerServiceTypeFilter("unavailable", unavail or 0)
-		SetTrainerServiceTypeFilter("used", used or 0)
-	end
-
-	local teach, noteach = {}, {}
-
-	--- Function to compare which recipes are available from a trainer and compare with the internal ARL database.
-	-- @name AckisRecipeList:ScanTrainerData
-	-- @param autoscan True when autoscan is enabled in preferences, it will surpress output letting you know when a scan has occured.
-	-- @return Does a comparison of the information in your internal ARL database, and those items which are available on the trainer.
-	-- Compares the acquire information of the ARL database with what is available on the trainer.
-	function addon:ScanTrainerData(autoscan)
-		if not (UnitExists("target") and (not UnitIsPlayer("target")) and (not UnitIsEnemy("player", "target"))) then	-- Make sure the target exists and is a NPC
-			if not autoscan then
-				self:Print(L["DATAMINER_TRAINER_NOTTARGETTED"])
-			end
-			return
-		end
-		local targetname = UnitName("target")	-- Get its name
-		local targetID = tonumber(string.sub(UnitGUID("target"), -12, -7), 16)	-- Get the NPC ID
-
-		if not IsTradeskillTrainer() then		-- Are we at a trade skill trainer?
-			if not autoscan then
-				self:Print(L["DATAMINER_SKILLLEVEL_ERROR"])
-			end
-			return
-		end
-		local recipe_list = LoadRecipe()	-- Get internal database
-
-		if not recipe_list then
-			self:Print(L["DATAMINER_NODB_ERROR"])
-			return
-		end
-
-		-- Get the initial trainer filters
-		local avail = GetTrainerServiceTypeFilter("available")
-		local unavail = GetTrainerServiceTypeFilter("unavailable")
-		local used = GetTrainerServiceTypeFilter("used")
-
-		-- Clear the trainer filters
-		SetTrainerServiceTypeFilter("available", 1)
-		SetTrainerServiceTypeFilter("unavailable", 1)
-		SetTrainerServiceTypeFilter("used", 1)
-
-		if (GetNumTrainerServices() == 0) then
-			self:Print("Warning: Trainer is bugged, reporting 0 trainer items.")
-		end
-		twipe(info)
-
-		-- Get all the names of recipes from the trainer
-		for i = 1, GetNumTrainerServices(), 1 do
-			local name = GetTrainerServiceInfo(i)
-			info[name] = true
-		end
-		twipe(teach)
-		twipe(noteach)
-		twipe(output)
-
-		-- Dump out trainer info
-		tinsert(output, L["DATAMINER_TRAINER_INFO"]:format(targetname, targetID))
-
-		local teachflag = false
-		local noteachflag = false
-
-		for i in pairs(recipe_list) do
-			local i_name = recipe_list[i]["Name"]
-			local acquire = recipe_list[i]["Acquire"]
-			local flags = recipe_list[i]["Flags"]
-
-			-- If the trainer teaches this recipe
-			if info[i_name] then
-				local found = false
-
-				-- Parse acquire info
-				for j in pairs(acquire) do
-					if (acquire[j]["Type"] == 1) then
-						if (acquire[j]["ID"] == targetID) then
-							found = true
-						end
-					end
-				end
-
-				if (not found) then
-					tinsert(teach, i)
-					teachflag = true
-
-					if (not flags[3]) then
-						tinsert(output, ": Trainer flag needs to be set.")
-					end
-				end
-				-- Trainer does not teach this recipe
-			else
-				local found = false
-				-- Parse acquire info
-				for j in pairs(acquire) do
-					if (acquire[j]["Type"] == 1) then
-						if (acquire[j]["ID"] == targetID) then
-							found = true
-						end
-					end
-				end
-
-				if found then
-					noteachflag = true
-					tinsert(noteach, i)
-				end
-			end
-		end
-
-		if teachflag then
-			tinsert(output, "Missing entries (need to be added):")
-			tsort(teach)
-
-			for i in ipairs(teach) do
-				tinsert(output, L["DATAMINER_TRAINER_TEACH"]:format(teach[i], recipe_list[teach[i]]["Name"]))
-			end
-		end
-
-		if noteachflag then
-			tinsert(output, "Extra entries (need to be removed):")
-			tsort(noteach)
-
-			for i in ipairs(noteach) do
-				tinsert(output, L["DATAMINER_TRAINER_NOTTEACH"]:format(noteach[i], recipe_list[noteach[i]]["Name"]))
-			end
-		end
-		tinsert(output, "Trainer Acquire Scan Complete.")
-		tinsert(output, "If you're doing an engineering scan,  there may be some goggles listed as extra.  These goggles ONLY show up for those classes who can make them,  so they may be false positives.")
-
-		if teachflag or noteachflag then
-			self:DisplayTextDump(nil, nil, tconcat(output, "\n"))
-		end
-		-- Reset the filters to what they were before
-		SetTrainerServiceTypeFilter("available", avail or 0)
-		SetTrainerServiceTypeFilter("unavailable", unavail or 0)
-		SetTrainerServiceTypeFilter("used", used or 0)
-	end
-end	-- do
-
---- Generates tradeskill links for all professions so you can scan them for completeness.
--- @name AckisRecipeList:GenerateLinks
--- @return Generates tradeskill links with all recipes.  Used for testing to see if a recipe is missing from the database or not.
-function addon:GenerateLinks()
-	-- This code adopted from Gnomish Yellow Pages with permission
-
-	local guid = UnitGUID("player")
-	local playerGUID = gsub(guid, "0x0+", "")
-
-	-- Listing of all tradeskill professions
-	local tradelist = {51304, 51300, 51313, 51306, 45363, 51311, 51302, 51309, 51296, 45542}
-
---[[
-	local encodingLength = floor((#recipeList+5) / 6)
-
-	local encodedString = string.rep("/", encodingLength)
-]]--
-	local bitmap = {}
-	bitmap[45542] = "8bffAA" -- First Aid (6)
-	--bitmap[51296] = "2/7///7///9////7//////////g+/B" -- Cooking (30)
-	bitmap[51296] = "2/7///7///9////7//////////gC8/B" -- Cooking
-	--bitmap[51306] = "4/////////////3nFA+///9+/P7//f//n//9dgdJgHA87/3f/TolD" -- Engineering (53)
-	bitmap[51306] = "4/////////////3nFA+///9+/P7//f//n//9dgdJgHA87/3f/Tol3B" -- Engineering
-	--bitmap[51302] = "e+//////////////v//P+f///3///7/9f9//////////f///////HQ5+////B4//+///////5///////PA/Eg//" -- LW (87)
-	bitmap[51302] = "e+//////////////v//P+f///3///7/9f9//////////f///////HQ5+////B4//+//////////////////HgAAw/P" -- Leatherworking
-	--bitmap[51302] = string.rep("/", 87)
-	--bitmap[51304] = "2//v//////f////3//v///////6//////////9////X" -- Alchemy (43)
-	bitmap[51304] = "2//v//////f////3//v///////5//////////9/////v" -- Alchemy
-	--bitmap[51304] = string.rep("/", 43) -- Alchemy (43)
-	--bitmap[51300] = string.rep("/", 85) -- Blacksmithing (85)
-	--bitmap[51309] = string.rep("/", 71) -- Tailoring (71)
-	bitmap[51309] = "YIEMCCgAicAjAGIAiQKAACBRxgBEAAAAAAAAA45BAqBQBAKAAAEAAAIICLHqiAuKAAAEABAAA"
-	--bitmap[51311] = string.rep("/", 83) -- JC 83
-	bitmap[51311] = "8fJRMqkmRwipmMHAQAACEAAQw/AgDkMJIAQgCA4AAwHMKFr/TCEx6tip+z7WyNsRWrnhm7wGPAAOgAUEALFAAWJWfqsBCAB"
-	--bitmap[45363] = string.rep("/", 74) -- Inscription (74)
-	--bitmap[51313] = "4//////////7///////////w//++/9vn7///////3P/t/n//BAB" -- Enchanting
-	--bitmap[51313] = "4//////////7///////////w//++/9vn7///////3P/t/n//BAD" -- Enchanting (51)
-	bitmap[51313] = "4//////////7///////////w//+//9/n7///////3f//////ZsD" -- Enchanting
-	--bitmap[51313] = string.rep("/", 51) -- Enchanting (51)
-
-	for i in pairs(tradelist) do
-
-		local tradeName = GetSpellInfo(tradelist[i])
-		local tradelink = {}
-		tradelink[1] = "|cffffd000|Htrade:"
-		tradelink[2] = tradelist[i]
-		tradelink[3] = ":450:450:"
-		tradelink[4] = playerGUID
-		tradelink[5] = ":"
-		tradelink[6] = bitmap[tradelist[i]]
-		tradelink[7] = "|h["
-		tradelink[8] = tradeName
-		tradelink[9] = "]|h|r"
-
-		if (bitmap[tradelist[i]]) then
-			self:Print(tconcat(tradelink, ""))
-		else
-			self:Print("I don't have the bitmap for " .. tradeName .. " yet (Professions were updated in 3.2.  If you want to help,  talk to me on IRC.")
-		end
-		-- /script DEFAULT_CHAT_FRAME:AddMessage(gsub(GetTradeSkillListLink(), "\124", "\124\124"))
-	end
-
-end
-
--------------------------------------------------------------------------------
---- Scans the items in the specified profession
--------------------------------------------------------------------------------
-do
-	local ORDERED_PROFESSIONS = {
-		strlower(PROFESSIONS.Alchemy), 		-- 1 Alchemy
-		strlower(PROFESSIONS.Blacksmithing), 	-- 2 Blacksmithing
-		strlower(PROFESSIONS.Cooking), 		-- 3 Cooking
-		strlower(PROFESSIONS.Enchanting), 	-- 4 Enchanting
-		strlower(PROFESSIONS.Engineering), 	-- 5 Engineering
-		strlower(PROFESSIONS.FirstAid), 		-- 6 First Aid
-		strlower(PROFESSIONS.Inscription), 	-- 7 Inscription
-		strlower(PROFESSIONS.Jewelcrafting), 	-- 8 Jewelcrafting
-		strlower(PROFESSIONS.Leatherworking), 	-- 9 Leatherworking
-		strlower(PROFESSIONS.Runeforging), 	-- 10 Runeforging
-		strlower(PROFESSIONS.Smelting), 		-- 11 Smelting
-		strlower(PROFESSIONS.Tailoring), 	-- 12 Tailoring
-	}
-	local recipe_list = {}
-	local output = {}
-
-	local function ProfessionScan(prof_name)
-		local master_list = LoadRecipe()
-
-		if not master_list then
-			addon:Print(L["DATAMINER_NODB_ERROR"])
-			return
-		end
-		twipe(recipe_list)
-
-		for i in pairs(master_list) do
-			local prof = strlower(master_list[i]["Profession"])
-
-			if prof and prof == prof_name then
-				recipe_list[i] = master_list[i]
-			end
-		end
-		twipe(output)
-
-		-- Parse the entire recipe database
-		for i in pairs(recipe_list) do
-			local ttscantext = addon:TooltipScanRecipe(i, false, true)
-
-			if (ttscantext) then
-				tinsert(output, ttscantext)
-			end
-		end
-		addon:DisplayTextDump(nil, nil, tconcat(output, "\n"))
-		ARLDatamineTT:Hide()
-	end
-
-	--- Parses all recipes for a specified profession, scanning their tool tips.
-	-- @name AckisRecipeList:ScanProfession
-	-- @usage AckisRecipeList:ScanProfession("first aid")
-	-- @param prof_name The profession name or the spell ID of it, which you wish to scan.
-	-- @return Recipes in the given profession have their tooltips scanned.
-	function addon:ScanProfession(prof_name)
-		if (type(prof_name) == "number") then
-			prof_name = GetSpellInfo(prof_name)
-		end
-
-		local found = false
-		prof_name = strlower(prof_name)
-
-		local scan_all = prof_name == "all"
-
-		if not scan_all then
-			for idx, name in ipairs(ORDERED_PROFESSIONS) do
-				if prof_name == name then
-					found = true
-					break
-				end
-			end
-
-			if not found then
-				self:Print(L["DATAMINER_NODB_ERROR"])
-				return
-			end
-
-			ProfessionScan(prof_name)
-		else
-			for idx, name in ipairs(ORDERED_PROFESSIONS) do
-				ProfessionScan(name)
-			end
-		end
-	end
-end	-- do
-
-local RECIPE_NAMES = {
-	-- JC
-	["design: "] = true,
-	-- LW or Tailoring
-	["pattern: "] = true,
-	-- Alchemy or Cooking
-	["recipe: "] = true,
-	-- BS
-	["plans: "] = true,
-	-- Enchanting
-	["formula: "] = true,
-	-- Engineering
-	["schematic: "] = true,
-	-- First Aid
-	["manual: "] = true,
-
-	["alchemy: "] = true,
-	["blacksmithing: "] = true,
-	["cooking: "] = true,
-	["enchanting: "] = true,
-	["engineering: "] = true,
-	["first aid: "] = true,
-	["inscription: "] = true,
-	["jewelcrafting: "] = true,
-	["leatherworking: "] = true,
-	["tailoring: "] = true,
-}
-
---- Scans the items on a vendor, determining which recipes are available if any and compares it with the database entries.
--- @name AckisRecipeList:ScanVendor
--- @usage AckisRecipeList:ScanVendor()
--- @return Obtains all the vendor information on tradeskill recipes and attempts to compare the current vendor with the internal database.
-do
-	local output = {}
-
-	function addon:ScanVendor()
-		if not (UnitExists("target") and (not UnitIsPlayer("target")) and (not UnitIsEnemy("player", "target"))) then	-- Make sure the target exists and is a NPC
-			self:Print(L["DATAMINER_VENDOR_NOTTARGETTED"])
-			return
-		end
-		local recipe_list = LoadRecipe()		-- Get internal database
-
-		if not recipe_list then
-			self:Print(L["DATAMINER_NODB_ERROR"])
-			return
-		end
-		local reverse_lookup = CreateReverseLookup(recipe_list)
-		local targetname = UnitName("target")		-- Get its name
-		local targetID = tonumber(string.sub(UnitGUID("target"), -12, -7), 16)		-- Get the NPC ID
-		local added = false
-
-		twipe(output)
-
-		-- Parse all the items on the merchant
-		for i = 1, GetMerchantNumItems(), 1 do
-			local name, _, _, _, numAvailable = GetMerchantItemInfo(i)
-
-			if name then
-				-- Lets scan recipes only on vendors
-				local matchtext = strmatch(name, "%a+: ")
-				-- Check to see if we're dealing with a recipe
-				if matchtext and RECIPE_NAMES[strlower(matchtext)] then
-					local recipename = gsub(name, "%a+\: ", "")	-- Get rid of the first part of the item
-					local spellid = reverse_lookup[recipename]	-- Find out what spell ID we're using
-
-					-- Do the scan if we have the spell ID
-					if (spellid) then
-						added = true
-						local ttscantext = addon:TooltipScanRecipe(spellid, true, true)
-
-						if (ttscantext) then
-							tinsert(output, ttscantext)
-						end
-						-- Ok now we know it's a vendor, lets check the database to see if the vendor is listed as an acquire method.
-						local acquire = recipe_list[spellid]["Acquire"]
-						local found = false
-
-						for i in pairs(acquire) do
-							local atype = acquire[i]["Type"]
-							-- If the acquire type is a vendor
-							if (((atype == 2) and (acquire[i]["ID"] == targetID))
-							    or ((atype == 6) and (acquire[i]["RepVendor"] == targetID))) then
-								found = true
-							end
-						end
-
-						if (not found) then
-							tinsert(output, "Vendor ID missing from " .. spellid)
-						end
-					else
-						--@debug@
-						added = true
-						tinsert(output, "Spell ID not found for: " .. name)
-						--@end-debug@
-					end
-				end
-			end
-		end
-
-		if added then
-			self:DisplayTextDump(nil, nil, tconcat(output, "\n"))
-		end
-		ARLDatamineTT:Hide()
-	end
-end	-- do
-
---- Parses all the recipes in the database, and scanning their tooltips.
--- @name AckisRecipeList:TooltipScanDatabase
--- @usage AckisRecipeList:TooltipScanDatabase()
--- @return Entire recipe database has its tooltips scanned.
-do
-	local output = {}
-
-	function addon:TooltipScanDatabase()
-		-- Get internal database
-		local recipe_list = LoadRecipe()
-
-		if (not recipe_list) then
-			self:Print(L["DATAMINER_NODB_ERROR"])
-			return
-		end
-		twipe(output)
-
-		-- Parse the entire recipe database
-		for i in pairs(recipe_list) do
-
-			local ttscantext = addon:TooltipScanRecipe(i, false, true)
-			if (ttscantext) then
-				tinsert(output, ttscantext)
-			end
-		end
-		self:DisplayTextDump(nil, nil, tconcat(output, "\n"))
-	end
-end	-- do
---- Parses a specific recipe in the database, and scanning its tooltip.
--- @name AckisRecipeList:TooltipScanRecipe
--- @param spellid The [[[http://www.wowwiki.com/SpellLink | Spell ID]]] of the recipe being added to the database.
--- @param is_vendor Boolean to determine if we're viewing a vendor or not.
--- @param is_largescan Boolean to determine if we're doing a large scan.
--- @return Recipe has its tooltips scanned.
-do
-
-	---------------------------------------------------------------------------------------------------------
-	----This table, DO_NOT_SCAN, contains itemid's that will not cache on the servers
-	---------------------------------------------------------------------------------------------------------
-
-	local DO_NOT_SCAN = {
-		-------------------------------------------------------------------------------
-		--Leatherworking
-		-------------------------------------------------------------------------------
-		[35214] = true,	[32434] = true,	[15769] = true,
-		[32431] = true,	[32432] = true,	[35215] = true,	[35521] = true,
-		[35520] = true,	[35524] = true,	[35517] = true,	[35528] = true,
-		[35527] = true,	[35523] = true,	[35549] = true,	[35218] = true,
-		[35217] = true,	[35216] = true,	[35546] = true,	[35541] = true, [15756] = true,
-		[15777] = true,  [32433] = true,  [29729] = true,  [29732] = true,   [32744] = true,
-
-		-------------------------------------------------------------------------------
-		--Tailoring
-		-------------------------------------------------------------------------------
-		[14477] = true, [14485] = true, [30281] = true, [14478] = true, [14500] = true,
-		[32439] = true, [14479] = true, [32447] = true, [14480] = true, [32437] = true,
-		[14495] = true, [14505] = true, [35204] = true,  [35205] = true,   [35206] = true,
-
-		-------------------------------------------------------------------------------
-		--Jewelcrafting
-		-------------------------------------------------------------------------------
-		[23130] = true,  [23140] = true, [23137] = true, [23131] = true, [23148] = true,
-		[35538] = true, [35201] = true, [35533] = true, [35200] = true,  [23147] = true,
-		[23135] = true,  [35203] = true,
-
-		-------------------------------------------------------------------------------
-		--Alchemy
-		-------------------------------------------------------------------------------
-		[22925] = true,  [13480] = true,  [13481] = true,   [13493] = true,
-
-		-------------------------------------------------------------------------------
-		--Cooking
-		-------------------------------------------------------------------------------
-		[39644] = true,
-
-		-------------------------------------------------------------------------------
-		--Blacksmithing
-		-------------------------------------------------------------------------------
-		[32441] = true,   [32443] = true,  [12687] = true, [12714] = true,  [12688 ] = true,
-		[35211] = true,  [35209] = true, [35210] = true,    [12706] = true,  [7982] = true,
-
-		-------------------------------------------------------------------------------
-		--Engineering
-		-------------------------------------------------------------------------------
-		[35196] = true,    [21734] = true,  [18292] = true,  [21727] = true,  [21735] = true,  [16053] = true,  [21729] = true,
-		[16047] = true,[21730] = true,[21731] = true,[21732] = true,[4411] = true,   [21733] = true,  [21728] = true,
-
-	}
-
-	local output = {}
-
-	function addon:TooltipScanRecipe(spell_id, is_vendor, is_largescan)
-		local recipe_list = LoadRecipe()
-
-		if not recipe_list then
-			self:Print(L["DATAMINER_NODB_ERROR"])
-			return
-		end
-		local spell_info = recipe_list[spell_id]
-
-		if not spell_info then
-			self:Print(string.format("Spell ID %d does not exist in the database.", tonumber(spell_id)))
-			return
-		end
-		local recipe_name = spell_info["Name"]
-		local game_vers = spell_info["Game"]
-
-		twipe(output)
-
-		if not game_vers then
-			tinsert(output, "No expansion information: " .. tostring(spell_id) .. " " .. recipe_name)
-		elseif game_vers > 2 then
-			tinsert(output, "Expansion information too high: " .. tostring(spell_id) .. " " .. recipe_name)
-		end
-		local Orange = spell_info["Orange"]
-		local Yellow = spell_info["Yellow"]
-		local Green = spell_info["Green"]
-		local Grey = spell_info["Grey"]
-		local SkillLevel = spell_info["Level"]
-
-		if not Orange then
-			tinsert(output, "No skill level information: " .. tostring(spell_id) .. " " .. recipe_name)
-		else
-			-- Highest level is greater than the skill of the recipe
-			if Orange > SkillLevel then
-				tinsert(output, "Skill Level Error (Orange > Skill): " .. tostring(spell_id) .. " " .. recipe_name)
-			end
-			-- Level info is messed up
-			if Orange > Yellow or Orange > Green or Orange > Grey or Yellow > Green or Yellow > Grey or Green > Grey then
-				tinsert(output, "Skill Level Error: " .. tostring(spell_id) .. " " .. recipe_name)
-			end
-		end
-		local recipe_link = spell_info["RecipeLink"]
-
-		if not recipe_link then
-			if spell_info["Profession"] ~= GetSpellInfo(53428) then		-- Lets hide this output for runeforging.
-				self:Print("Missing RecipeLink for ID " .. spell_id .. " - " .. recipe_name .. " (Normal for DK abilities.")
-			end
-			return
-		end
-		ARLDatamineTT:SetOwner(WorldFrame, "ANCHOR_NONE")
-		GameTooltip_SetDefaultAnchor(ARLDatamineTT, UIParent)
-		ARLDatamineTT:SetHyperlink(recipe_link)	-- Link exists, so load the tooltip for scanning
-
-		-- Lets check to see if it's a recipe tooltip
-		local text = strlower(_G["ARLDatamineTTTextLeft1"]:GetText())
-		local match_text = strmatch(text, "%a+: ")
-
-		-- Check to see if we're dealing with a recipe
-		if not RECIPE_NAMES[match_text] then
-			ARLDatamineTT:Hide()
-			return
-		end
-		local reverse_lookup = CreateReverseLookup(recipe_list)
-
---		tinsert(output, "RECIPE SCAN")
-
---		for i = 1, ARLDatamineTT:NumLines(), 1 do
---			local text_l = _G["ARLDatamineTTTextLeft" .. i]:GetText()
---			local text_r = _G["ARLDatamineTTTextRight" .. i]:GetText()
---			local text
-
---			if text_r then
---				text = text_l .. "(Left) " .. text_r .. "(Right)"
---			else
---				text = text_l
---			end
-
---			tinsert(output, text)
---		end
-		self:ScanToolTip(recipe_name, recipe_list, reverse_lookup, is_vendor, false)
-
-		local item_id = SPELL_ITEM[spell_id]
-
---		tinsert(output, "ITEM SCAN")
-		-- We have a reverse look-up for the item which creates the spell (aka the recipe itself)
-		if item_id then
-			if not DO_NOT_SCAN[item_id] then
-				local incache = GetItemInfo(item_id)
-
-			   if incache then
-
-				ARLDatamineTT:SetHyperlink("item:" .. item_id .. ":0:0:0:0:0:0:0")
-
---				for i = 1, ARLDatamineTT:NumLines(), 1 do
---					local text_l = _G["ARLDatamineTTTextLeft" .. i]:GetText()
---					local text_r = _G["ARLDatamineTTTextRight" .. i]:GetText()
---					local text
-
---					if text_r then
---						text = text_l .. "(Left) " .. text_r .. "(Right)"
---					else
---						text = text_l
---					end
-
---					tinsert(output, text)
---				end
-				-- Scan the recipe item (aka pattern)
-				self:ScanToolTip(recipe_name, recipe_list, reverse_lookup, is_vendor, true)
-			else
-				tinsert(output, "Item ID: " .. item_id .. " not in cache.  If you have Querier use /iq " .. item_id)
-			end
-		end
-			-- We are dealing with a recipe that does not have an item to learn it from
-		else
-			-- Lets check the recipe flags to see if we have a data error and the item should exist
-			local flags = spell_info["Flags"]
-
-			if (flags[4] or flags[5] or flags[6]) then
-				tinsert(output, "Spell/Item ID: " .. spell_id .. " does not exist in the SPELL_ITEM table.")
-			end
-		end
-		ARLDatamineTT:Hide()
-
-		-- Add the flag scan to the table if it's not nil
-		local results = self:PrintScanResults()
-
-		if not results then
-			return
-		end
-		tinsert(output, results)
-
-		if is_largescan then
-			return tconcat(output, "\n")
-		else
-			self:Print(tconcat(output, "\n"))
-		end
-	end
-end	-- do
-
--------------------------------------------------------------------------------
--- Tooltip-scanning code
--------------------------------------------------------------------------------
-do
-	local SPECIALTY_TEXT = {
-		["requires spellfire tailoring"] = 26797,
-		["requires mooncloth tailoring"] = 26798,
-		["requires shadoweave tailoring"] = 26801,
-		["requires dragonscale leatherworking"] = 10657,
-		["requires elemental leatherworking"] = 10659,
-		["requires tribal leatherworking"] = 10661,
-		["requires gnomish engineer"] = 20219,
-		["requires goblin engineer"] = 20222,
-		["requires armorsmith"] = 9788,
-		["requires master axesmith"] = 17041,
-		["requires master hammersmith"] = 17040,
-		["requires master swordsmith"] = 17039,
-		["requires weaponsmith"] = 9787,
-	}
-
-	local FACTION_TEXT = {
-		["thorium brotherhood"] = 98,
-		["zandalar tribe"] = 100,
-		["argent dawn"] = 96,
-		["timbermaw hold"] = 99,
-		["cenarion circle"] = 97,
-		["the aldor"] = 101,
-		["the consortium"] = 105,
-		["the scryers"] = 110,
-		["the sha'tar"] = 111,
-		["the mag'har"] = 108,
-		["cenarion expedition"] = 103,
-		["honor hold"] = 104,
-		["thrallmar"] = 104,
-		["the violet eye"] = 114,
-		["sporeggar"] = 113,
-		["kurenai"] = 108,
-		["keepers of time"] = 106,
-		["the scale of the sands"] = 109,
-		["lower city"] = 107,
-		["ashtongue deathsworn"] = 102,
-		["alliance vanguard"] = 131,
-		["valiance expedition"] = 126,
-		["horde expedition"] = 130,
-		["the taunka"] = 128,
-		["the hand of vengeance"] = 127,
-		["explorers' league"] = 125,
-		["the kalu'ak"] = 120,
-		["shattered sun offensive"] = 112,
-		["warsong offensive"] = 129,
-		["kirin tor"] = 118,
-		["the wyrmrest accord"] = 122,
-		["knights of the ebon blade"] = 117,
-		["frenzyheart tribe"] = 116,
-		["the oracles"] = 121,
-		["argent crusade"] = 115,
-		["the sons of hodir"] = 119,
-	}
-
-	local FACTION_LEVELS = {
-		["neutral"] = 0,
-		["friendly"] = 1,
-		["honored"] = 2,
-		["revered"] = 3,
-		["exalted"] = 4,
-	}
-
-	local CLASS_TYPES = {
-		["Death Knight"]	= 21, 	["Druid"]	= 22, 	["Hunter"]	= 23,
-		["Mage"]		= 24, 	["Paladin"]	= 25, 	["Priest"]	= 26,
-		["Shaman"]		= 27, 	["Rogue"]	= 28, 	["Warlock"]	= 29,
-		["Warrior"]		= 30,
-	}
-
-	local ORDERED_CLASS_TYPES = {
-		[1]	= "Death Knight", 	[2]	= "Druid", 	[3]	= "Hunter",
-		[4]	= "Mage", 		[5]	= "Paladin", 	[6]	= "Priest",
-		[7]	= "Shaman", 		[8]	= "Rogue", 	[9]	= "Warlock",
-		[10]	= "Warrior",
-	}
-
-	local ROLE_TYPES = {
-		["dps"]		= 51, 	["tank"]	= 52, 	["healer"]	= 53,
-		["caster"]	= 54, 	["RESERVED1"]	= 55,
-	}
-
-	local ORDERED_ROLE_TYPES = {
-		[1]	= "dps", 	[2]	= "tank", 	[3]	= "healer",
-		[4]	= "caster", 	[5]	= "RESERVED1",
-	}
-
-	local ENCHANT_TO_ITEM = {
-		["Cloak"]	= "Back",
-		["Ring"]	= "Finger",
-		["2H Weapon"]	= "Two-Hand",
-	}
-
-	local ITEM_TYPES = {
-		-- Armor types
-		["Cloth"]	= 56, 	["Leather"]	= 57, 	["Mail"]	= 58,
-		["Plate"]	= 59, 	["Back"]	= 60, 	["Trinket"]	= 61,
-		["Finger"]	= 62, 	["Neck"]	= 63, 	["Shield"]	= 64,
-		["RESERVED2"]	= 65,
-
-		-- Weapon types
-		["One-Hand"]	= 66, 	["Two-Hand"]	= 67, 	["Axe"]		= 68,
-		["Sword"]	= 69, 	["Mace"]	= 70, 	["Polearm"]	= 71,
-		["Dagger"]	= 72, 	["Staff"]	= 73, 	["Wand"]	= 74,
-		["Thrown"]	= 75, 	["Bow"]		= 76, 	["CrossBow"]	= 77,
-		["Ammo"]	= 78, 	["Fist Weapon"]	= 79, 	["Gun"]		= 80,
-	}
-
-	local ORDERED_ITEM_TYPES = {
-		-- Armor types
-		[1]	= "Cloth", 	[2]	= "Leather", 	[3]	= "Mail",
-		[4]	= "Plate", 	[5]	= "Back", 	[6]	= "Trinket",
-		[7]	= "Finger", 	[8]	= "Neck", 	[9]	= "Shield",
-		[10]	= "RESERVED2",
-
-		-- Weapon types
-		[11]	= "One-Hand", 	[12]	= "Two-Hand", 	[13]	= "Axe",
-		[14]	= "Sword", 	[15]	= "Mace", 	[16]	= "Polearm",
-		[17]	= "Dagger", 	[18]	= "Staff", 	[19]	= "Wand",
-		[20]	= "Thrown", 	[21]	= "Bow", 	[22]	= "CrossBow",
-		[23]	= "Ammo", 	[24]	= "Fist Weapon", 	[25]	= "Gun",
-	}
-
-	-- Table to store scanned information. Wiped and re-used every scan.
-	local scan_data = {}
-
-	--- Parses the mining tooltip for certain keywords, comparing them with the database flags.
-	-- @name AckisRecipeList:ScanToolTip
-	-- @param name The name of the recipe
-	-- @param recipe_list Recipe database
-	-- @param reverse_lookup Reverse lookup database
-	-- @param is_vendor Boolean to indicate if we're scanning a vendor.
-	-- @param is_item Boolean to indicate if we're scanning an item tooltip.
-	-- @return Scans a tooltip, and outputs the missing or extra filter flags.
-	function addon:ScanToolTip(name, recipe_list, reverse_lookup, is_vendor, is_item)
-		-- We only want to wipe the table if we're scanning a new entry (not an item associated with a spell ID)
-		if not is_item then
-			twipe(scan_data)
-		end
-		scan_data.match_name = name
-		scan_data.recipe_list = recipe_list
-		scan_data.reverse_lookup = reverse_lookup
-		scan_data.is_vendor = is_vendor
-		scan_data.is_item = is_item
-
-		-- Parse all the lines of the tooltip
-		for i = 1, ARLDatamineTT:NumLines(), 1 do
-			local text_l = _G["ARLDatamineTTTextLeft" .. i]:GetText()
-			local text_r = _G["ARLDatamineTTTextRight" .. i]:GetText()
-			local text
-
-			if text_r then
-				text = text_l .. " " .. text_r
-			else
-				text = text_l
-			end
-
-			local text = strlower(text)
-
-			-- Check for recipe/item binding
-			-- The recipe binding is within the first few lines of the tooltip always
-			if strmatch(text, "binds when picked up") then
-				if (i < 3) then
-					scan_data.boprecipe = true
-				else
-					scan_data.bopitem = true
-				end
-			end
-
-			-- Recipe Specialities
-			if SPECIALTY_TEXT[text] then
-				scan_data.specialty = SPECIALTY_TEXT[text]
-			end
-
-			-- Recipe Reputations
-			local rep, replevel = strmatch(text_l, "Requires (.+) %- (.+)")
-
-			if rep and replevel and FACTION_TEXT[rep] then
-				scan_data.repid = FACTION_TEXT[rep]
-				scan_data.repidlevel = FACTION_LEVELS[replevel]
-			end
-
-			-- Flag so that we don't bother checking for classes if we're sure of the class
-			-- AKA +spell hit == caster DPS only no matter what other stats are on it
-			-- Saves processing cycles and it won't cause the flags to be overwritten if a non-specific stat is found after
-			scan_data.verifiedclass = false
-
-			if (not scan_data.verifiedclass) then
-				-- Certain stats can be considered for a specific role (aka spell hit == caster dps).
-				if (strmatch(text, "strength") and (strmatch(text, "strength of the clefthoof") == nil) and (strmatch(text,  "set:") == nil)) then
-					scan_data.dps = true
-					scan_data.caster = false
-					scan_data.healer = false
-				elseif (strmatch(text, "agility")) then
-					scan_data.dps = true
-					scan_data.caster = false
-					scan_data.healer = false
-				elseif (strmatch(text, "spirit")) then
-					scan_data.dps = false
-					scan_data.tank = false
-					scan_data.caster = true
-					scan_data.healer = true
-				elseif (strmatch(text, "spell power")) then
-					scan_data.dps = false
-					scan_data.tank = false
-					scan_data.caster = true
-					scan_data.healer = true
-				elseif (strmatch(text, "spell crit")) then
-					scan_data.dps = false
-					scan_data.tank = false
-					scan_data.caster = true
-					scan_data.healer = true
-				elseif (strmatch(text, "spell hit")) then
-					scan_data.dps = false
-					scan_data.tank = false
-					scan_data.caster = true
-					scan_data.healer = false
-					scan_data.verifiedclass = true
-				elseif (strmatch(text, "spell penetration")) then
-					scan_data.dps = false
-					scan_data.tank = false
-					scan_data.caster = true
-					scan_data.healer = false
-					scan_data.verifiedclass = true
-				elseif (strmatch(text, "mana per 5 sec.") or (strmatch(text, "mana every 5 seconds"))) then
-					scan_data.dps = false
-					scan_data.tank = false
-					scan_data.caster = true
-					scan_data.healer = true
-				elseif (strmatch(text, "attack power")) then
-					scan_data.dps = true
-					scan_data.caster = false
-					scan_data.healer = false
-				elseif (strmatch(text, "expertise")) then
-					scan_data.dps = true
-					scan_data.tank = true
-					scan_data.caster = false
-					scan_data.healer = false
-				elseif (strmatch(text, "melee crit")) then
-					scan_data.dps = true
-					scan_data.caster = false
-					scan_data.healer = false
-				elseif (strmatch(text, "critical hit")) then
-					scan_data.dps = true
-					scan_data.caster = false
-					scan_data.healer = false
-				elseif (strmatch(text, "weapon damage")) then
-					scan_data.dps = true
-					scan_data.caster = false
-					scan_data.healer = false
-				elseif (strmatch(text, "ranged crit")) then
-					scan_data.dps = true
-					scan_data.tank = false
-					scan_data.caster = false
-					scan_data.healer = false
-					scan_data.verifiedclass = true
-				elseif (strmatch(text, "melee haste")) then
-					scan_data.dps = true
-					scan_data.caster = false
-					scan_data.healer = false
-				elseif (strmatch(text, "ranged haste")) then
-					scan_data.dps = true
-					scan_data.tank = false
-					scan_data.caster = false
-					scan_data.healer = false
-					scan_data.verifiedclass = true
-				elseif (strmatch(text, "melee hit")) then
-					scan_data.dps = true
-					scan_data.caster = false
-					scan_data.healer = false
-				elseif (strmatch(text, "ranged hit")) then
-					scan_data.dps = true
-					scan_data.tank = false
-					scan_data.caster = false
-					scan_data.healer = false
-					scan_data.verifiedclass = true
-				elseif (strmatch(text, "armor pen")) then
-					scan_data.dps = true
-					scan_data.caster = false
-					scan_data.healer = false
-				elseif (strmatch(text, "feral attack power")) then
-					scan_data.tank = true
-					scan_data.dps = true
-					scan_data.caster = false
-					scan_data.healer = false
-				elseif (strmatch(text, "defense") and (strmatch(text, "defenseless") == nil)) then
-					scan_data.dps = false
-					scan_data.tank = true
-					scan_data.caster = false
-					scan_data.healer = false
-					scan_data.verifiedclass = true
-				elseif (strmatch(text, "block")) then
-					scan_data.dps = false
-					scan_data.tank = true
-					scan_data.caster = false
-					scan_data.healer = false
-					scan_data.verifiedclass = true
-				elseif (strmatch(text, "parry")) then
-					scan_data.dps = false
-					scan_data.tank = true
-					scan_data.caster = false
-					scan_data.healer = false
-					scan_data.verifiedclass = true
-				elseif (strmatch(text, "dodge") and (strmatch(text,  "set:") == nil)) then
-					scan_data.dps = false
-					scan_data.tank = true
-					scan_data.caster = false
-					scan_data.healer = false
-					scan_data.verifiedclass = true
-				end
-			end
-
-			-- Classes
-			local class_type = strmatch(text_l, "Classes: (.+)")
-
-			if class_type then
-				for idx, class in ipairs(ORDERED_CLASS_TYPES) do
-					if strmatch(class_type, class) then
-						scan_data[class] = true
-						scan_data.found_class = true
-					end
-				end
-			end
-
-			-- Armor types
-			if ITEM_TYPES[text_l] then
-				scan_data[text_l] = true
-			elseif text_l == "Held In Off-hand" or text_l == "Off Hand" or text_l == "Main Hand" then	-- Special cases.
-				scan_data["One-Hand"] = true
-			elseif text_l == "Projectile" then
-				scan_data["Ammo"] = true
-			end
-
-			if text_r and ITEM_TYPES[text_r] then
-				scan_data[text_r] = true
-			end
-
-			-- Enchantment voodoo
-			local ench_type, _ = strmatch(text_l, "Enchant (.+) %- (.+)")
-
-			if ench_type then
-				if ITEM_TYPES[ench_type] then
-					scan_data[ench_type] = true
-				elseif ITEM_TYPES[ENCHANT_TO_ITEM[ench_type]] then
-					scan_data[ENCHANT_TO_ITEM[ench_type]] = true
-				elseif ench_type == "Weapon" then		-- Special case.
-					scan_data["One-Hand"] = true
-					scan_data["Two-Hand"] = true
-				end
-			end
-		end	-- for
-	end
-
-	-- Flag data for printing. Wiped and re-used.
-	local missing_flags = {}
-	local extra_flags = {}
-	local output = {}
-
-	--- Prints out the results of the tooltip scan.
-	-- @name AckisRecipeList:PrintScanResults
-	function addon:PrintScanResults()
-		-- Parse the recipe database until we get a match on the name
-		local recipe_name = gsub(scan_data.match_name, "%a+%?: ", "")
-		local spell_id = scan_data.reverse_lookup[recipe_name]
-
-		if (not spell_id) then
-			self:Print("Recipe " .. recipe_name .. " has no reverse lookup")
-			return
-		end
-
-		local flags = scan_data.recipe_list[spell_id]["Flags"]
-		local acquire = scan_data.recipe_list[spell_id]["Acquire"]
-		twipe(missing_flags)
-		twipe(extra_flags)
-		twipe(output)
-
-		-- If we're a vendor scan,  do some extra checks
-		if (scan_data.is_vendor) then
-			-- Check to see if the vendor flag is set
-			if (not flags[4]) then
-				tinsert(missing_flags, "4 (Vendor)")
-			end
-
-			-- Check to see if we're in a PVP zone
-			if (((GetSubZoneText() == "Wintergrasp Fortress") or (GetSubZoneText() == "Halaa")) and (not flags[9])) then
-				tinsert(missing_flags, "9 (PvP)")
-			elseif ((flags[9]) and not ((GetSubZoneText() == "Wintergrasp Fortress") or (GetSubZoneText() == "Halaa"))) then
-				tinsert(extra_flags, "9 (PvP)")
-			end
-		end
-
-		-- -- If we've picked up at least one class flag
-		if (scan_data.found_class) then
-			for k, v in ipairs(ORDERED_CLASS_TYPES) do
-				if scan_data[v] and not flags[CLASS_TYPES[v]] then
-					tinsert(missing_flags, tostring(CLASS_TYPES[v]).." ("..v..")")
-				elseif not scan_data[v] and flags[CLASS_TYPES[v]] then
-					tinsert(extra_flags, tostring(CLASS_TYPES[v]).." ("..v..")")
-				end
-			end
-		end
-
-		-- BoP Item
-		if (scan_data.is_item) then
-			if (scan_data.bopitem) and (not flags[37]) then
-				tinsert(missing_flags, "37 (BoP Item)")
-				-- If it's a BoP item and flags BoE is set, mark it as extra
-				if (flags[36]) then
-					tinsert(extra_flags, "36 (BoE Item)")
-				end
-				-- If it's a BoP item and flags BoA is set, mark it as extra
-				if (flags[38]) then
-					tinsert(extra_flags, "38 (BoA Item)")
-				end
-				-- BoE Item, assuming it's not BoA
-			elseif (not flags[36]) and (not scan_data.bopitem) then
-				tinsert(missing_flags, "36 (BoE Item)")
-				-- If it's a BoE item and flags BoP is set, mark it as extra
-				if (flags[37]) then
-					tinsert(extra_flags, "37 (BoP Item)")
-				end
-				-- If it's a BoE item and flags BoA is set, mark it as extra
-				if (flags[38]) then
-					tinsert(extra_flags, "38 (BoA Item)")
-				end
-			end
-		else
-			-- BoP Recipe
-			if (scan_data.boprecipe) and (not flags[41]) then
-				tinsert(missing_flags, "41 (BoP Recipe)")
-				-- If it's a BoP recipe and flags BoE is set, mark it as extra
-				if (flags[40]) then
-					tinsert(extra_flags, "40 (BoE Recipe)")
-				end
-				-- If it's a BoP recipe and flags BoA is set, mark it as extra
-				if (flags[42]) then
-					tinsert(extra_flags, "42 (BoA Recipe)")
-				end
-				-- Not BoP recipe, assuming it's not BoA - trainer-taught recipes don't have bind information,  skip those.
-			elseif not flags[3] and (not flags[40]) and (not scan_data.boprecipe) then
-				tinsert(missing_flags, "40 (BoE Recipe)")
-				-- If it's a BoE recipe and flags BoP is set, mark it as extra
-				if (flags[41]) then
-					tinsert(extra_flags, "41 (BoP Recipe)")
-				end
-				-- If it's a BoE recipe and flags BoA is set, mark it as extra
-				if (flags[42]) then
-					tinsert(extra_flags, "42 (BoA Recipe)")
-				end
-			end
-		end
-
-		for k, v in ipairs(ORDERED_ROLE_TYPES) do
-			if scan_data[v] and not flags[ROLE_TYPES[v]] then
-				tinsert(missing_flags, tostring(ROLE_TYPES[v]).." ("..v..")")
-			elseif not scan_data[v] and flags[ROLE_TYPES[v]] then
-				tinsert(extra_flags, tostring(ROLE_TYPES[v]).." ("..v..")")
-			end
-		end
-
-		for k, v in ipairs(ORDERED_ITEM_TYPES) do
-			if scan_data[v] and not flags[ITEM_TYPES[v]] then
-				tinsert(missing_flags, tostring(ITEM_TYPES[v]).." ("..v..")")
-			elseif not scan_data[v] and flags[ITEM_TYPES[v]] then
-				tinsert(extra_flags, tostring(ITEM_TYPES[v]).." ("..v..")")
-			end
-		end
-
-		-- Reputations
-		local repid = scan_data.repid
-		local addedtotable = false
-
-		if repid and not flags[repid] then
-			tinsert(missing_flags, repid)
-
-			for i, j in pairs(acquire) do
-				if (acquire[j]["Type"] == 6) then
-					local tmpacquire = acquire[j]
-
-					if (tmpacquire["RepLevel"] ~= scan_data.repidlevel) then
-						tinsert(output, "Rep level wrong. " .. recipe_name .. " (" .. spell_id .. ")")
-					end
-				end
-			end
-		end
-
-		if (#missing_flags > 0) or (#extra_flags > 0) then
-			addedtotable = true
-			tinsert(output, recipe_name .. " (" .. spell_id .. ")")
-
-			-- Add a string of the missing flag numbers
-			if (#missing_flags > 0) then
-				tinsert(output, "Missing flags: " .. tconcat(missing_flags, ", "))
-			end
-
-			-- Add a string of the extra flag numbers
-			if (#extra_flags > 0) then
-				tinsert(output, "Extra flags: " .. tconcat(extra_flags, ", "))
-			end
-
-			local found_type = false
-
-			for k, v in ipairs(ORDERED_ITEM_TYPES) do
-				if scan_data[v] then
-					found_type = true
-					break
-				end
-			end
-
-			if not found_type then
-				tinsert(output, "Missing: item type flag")
-			end
-		end
-
-		-- Check to see if we have a horde/alliance flag,  all recipes must have one of these
-		if (not flags[1]) and (not flags[2]) then
-			addedtotable = true
-			tinsert(output, "Horde or alliance not selected. " .. recipe_name .. " (" .. spell_id .. ")")
-		end
-
-		-- Check to see if we have an obtain method flag,  all recipes must have at least one of these
-		if ((not flags[3]) and (not flags[4]) and (not flags[5]) and (not flags[6]) and (not flags[7])
-		and (not flags[8]) and (not flags[9]) and (not flags[10]) and (not flags[11]) and (not flags[12])) then
-			addedtotable = true
-			tinsert(output, "No obtain flag. " .. recipe_name .. " (" .. spell_id .. ")")
-		end
-
-		-- Check for recipe binding information,  all recipes must have one of these
-		if (not flags[40]) and (not flags[41]) and (not flags[42]) then
-			addedtotable = true
-			tinsert(output, "No recipe binding information. " .. recipe_name .. " (" .. spell_id .. ")")
-		end
-
-		-- Check for item binding information,  all recipes must have one of these
-		if (not flags[36]) and (not flags[37]) and (not flags[38]) then
-			addedtotable = true
-			tinsert(output, "No item binding information. " .. recipe_name .. " (" .. spell_id .. ")")
-		end
-
-		-- We need to code this better.  Some items (aka bags) won't have a role at all.
-		-- Check for player role flags
-		if (not scan_data.tank) and (not scan_data.healer) and (not scan_data.caster) and (not scan_data.dps) and (not NO_PLAYER_FLAG[spell_id]) then
-			addedtotable = true
-			tinsert(output, "No player role flag. " .. recipe_name .. " (" .. spell_id .. ").")
-		end
-
-		if (scan_data.specialty) then
-			if (not scan_data.recipe_list[spell_id]["Specialty"]) then
-				addedtotable = true
-				tinsert(output, "Recipe: " ..  recipe_name .. " (" .. spell_id .. ") Missing Specialty: " .. scan_data.specialty)
-			elseif (scan_data.recipe_list[spell_id]["Specialty"] ~= scan_data.specialty) then
-				tinsert(output, "Recipe: " ..  recipe_name .. " (" .. spell_id .. ") Wrong Specialty, the correct one is: " .. scan_data.specialty)
-			end
-		elseif (scan_data.recipe_list[spell_id]["Specialty"]) then
-			addedtotable = true
-			tinsert(output, "Recipe: " ..  recipe_name .. " (" .. spell_id .. ") Extra Specialty: " .. scan_data.recipe_list[spell_id]["Specialty"])
-		end
-
-		if (addedtotable) then
-			return tconcat(output, "\n")
-		else
-			return nil
-		end
-
-	end
-
-end
\ No newline at end of file
diff --git a/AckisRecipeList.lua b/AckisRecipeList.lua
deleted file mode 100644
index 5521324..0000000
--- a/AckisRecipeList.lua
+++ /dev/null
@@ -1,1737 +0,0 @@
--------------------------------------------------------------------------------
--- AckisRecipeList.lua
--------------------------------------------------------------------------------
--- File date: @file-date-iso@
--- File revision: @file-revision@
--- Project revision: @project-revision@
--- Project version: @project-version@
--------------------------------------------------------------------------------
--- Authors: Ackis, Zhinjio, Jim-Bim, Torhal, Pompy
--------------------------------------------------------------------------------
--- 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 AckisRecipeList.lua
--- @release 1.0
-
--------------------------------------------------------------------------------
--- Localized Lua globals.
--------------------------------------------------------------------------------
-local _G = getfenv(0)
-
-local tostring = _G.tostring
-local tonumber = _G.tonumber
-
-local pairs, ipairs = _G.pairs, _G.ipairs
-local select = _G.select
-
-local table = _G.table
-local twipe = table.wipe
-local tconcat = table.concat
-local tinsert = table.insert
-
-local string = _G.string
-local strformat = string.format
-local strfind = string.find
-local strmatch = string.match
-local strlower = string.lower
-
--------------------------------------------------------------------------------
--- Localized Blizzard API.
--------------------------------------------------------------------------------
-local GetNumTradeSkills = _G.GetNumTradeSkills
-local GetSpellInfo = _G.GetSpellInfo
-
--------------------------------------------------------------------------------
--- AddOn namespace.
--------------------------------------------------------------------------------
-local LibStub	= _G.LibStub
-local MODNAME	= "Ackis Recipe List"
-local addon	= LibStub("AceAddon-3.0"):NewAddon(MODNAME, "AceConsole-3.0", "AceEvent-3.0")
-_G.AckisRecipeList = addon
-
---@alpha@
-_G.ARL = addon
---@end-alpha@
-
-local L	= LibStub("AceLocale-3.0"):GetLocale(MODNAME)
-
-local BFAC = LibStub("LibBabble-Faction-3.0"):GetLookupTable()
-
---------------------------------------------------------------------------------------------------------------------
--- Acquire types
---------------------------------------------------------------------------------------------------------------------
-local A_TRAINER, A_VENDOR, A_MOB, A_QUEST, A_SEASONAL, A_REPUTATION, A_WORLD_DROP, A_CUSTOM = 1, 2, 3, 4, 5, 6, 7, 8
-
-------------------------------------------------------------------------------
--- Constants.
-------------------------------------------------------------------------------
-local NUM_FILTER_FLAGS = 128
-local PROFESSION_INITS = {}	-- Professions initialization functions.
-
-------------------------------------------------------------------------------
--- Database tables
-------------------------------------------------------------------------------
-local RecipeList = {}
-local CustomList = {}
-local MobList = {}
-local QuestList = {}
-local ReputationList = {}
-local TrainerList = {}
-local SeasonalList = {}
-local VendorList = {}
-local AllSpecialtiesTable = {}
-local SpecialtyTable
-
-addon.custom_list	= CustomList
-addon.mob_list		= MobList
-addon.quest_list	= QuestList
-addon.recipe_list	= RecipeList
-addon.reputation_list	= ReputationList
-addon.trainer_list	= TrainerList
-addon.seasonal_list	= SeasonalList
-addon.vendor_list	= VendorList
-
-
-------------------------------------------------------------------------------
--- Data which is stored regarding a players statistics (luadoc copied from Collectinator, needs updating)
-------------------------------------------------------------------------------
--- @class table
--- @name Player
--- @field known_filtered Total number of items known filtered during the scan.
--- @field Faction Player's faction
--- @field Class Player's class
--- @field ["Reputation"] Listing of players reputation levels
-local Player = {}
-addon.Player = Player
-
--- Global Frame Variables
-addon.optionsFrame = {}
-
--------------------------------------------------------------------------------
--- Check to see if we have mandatory libraries loaded. If not, notify the user
--- which are missing and return.
--------------------------------------------------------------------------------
-local MissingLibraries
-do
-	local REQUIRED_LIBS = {
-		"AceLocale-3.0",
-		"LibBabble-Boss-3.0",
-		"LibBabble-Faction-3.0",
-		"LibBabble-Zone-3.0",
-	}
-	function MissingLibraries()
-		local missing = false
-
-		for idx, lib in ipairs(REQUIRED_LIBS) do
-			if not LibStub:GetLibrary(lib, true) then
-				missing = true
-				addon:Print(strformat(L["MISSING_LIBRARY"], lib))
-			end
-		end
-		return missing
-	end
-end -- do
-
-if MissingLibraries() then
-	--@debug@
-	addon:Print("You are using an SVN version of ARL.  As per WowAce/Curseforge standards, SVN externals are not set up.  You will have to install Ace3, Babble-Faction-3.0, Babble-Zone-3.0, Babble-Boss-3.0, LibAboutPanel, and LibSharedMedia-3.0 in order for the addon to function correctly.")
-	--@end-debug@
-	_G.AckisRecipeList = nil
-	return
-end
-
-function addon:DEBUG(str, ...)
-	print(string.format(addon:Red("DEBUG: ") .. tostring(str), ...))
-end
-
-do
-	local output = {}
-
-	function addon:DumpMembers(match)
-		twipe(output)
-		tinsert(output, "Addon Object members.\n")
-
-		local count = 0
-
-		for key, value in pairs(self) do
-			local val_type = type(value)
-
-			if not match or val_type == match then
-				tinsert(output, key.. " ("..val_type..")")
-				count = count + 1
-			end
-		end
-		tinsert(output, string.format("\n%d found\n", count))
-		self:DisplayTextDump(nil, nil, tconcat(output, "\n"))
-	end
-end	-- do
-
--------------------------------------------------------------------------------
--- Initialization functions
--------------------------------------------------------------------------------
-function addon:OnInitialize()
-	-- Set default options, which are to include everything in the scan
-	local defaults = {
-		global = {
-			-- Saving alts tradeskills (needs to be global so all profiles can access it)
-			tradeskill = {},
-		},
-		profile = {
-			-------------------------------------------------------------------------------
-			-- Frame options
-			-------------------------------------------------------------------------------
-			frameopts = {
-				offsetx = 0,
-				offsety = 0,
-				anchorTo = "",
-				anchorFrom = "",
-				uiscale = 1,
-				tooltipscale = .9,
-				fontsize = 11,
-			},
-
-			-------------------------------------------------------------------------------
-			-- Sorting Options
-			-------------------------------------------------------------------------------
-			sorting = "SkillAsc",
-
-			-------------------------------------------------------------------------------
-			-- Display Options
-			-------------------------------------------------------------------------------
-			includefiltered = false,
-			includeexcluded = false,
-			closeguionskillclose = false,
-			ignoreexclusionlist = false,
-			scanbuttonlocation = "TR",
-			spelltooltiplocation = "Right",
-			acquiretooltiplocation = "Right",
-			hidepopup = false,
-			minimap = true,
-			worldmap = true,
-			autoscanmap = false,
-			scantrainers = false,
-			scanvendors = false,
-			autoloaddb = false,
-			maptrainer = false,
-			mapvendor = true,
-			mapmob = true,
-			mapquest = true,
-
-			-------------------------------------------------------------------------------
-			-- Recipe Exclusion
-			-------------------------------------------------------------------------------
-			exclusionlist = {},
-
-			-------------------------------------------------------------------------------
-			-- Filter Options
-			-------------------------------------------------------------------------------
-			filters = {
-				-------------------------------------------------------------------------------
-				-- General Filters
-				-------------------------------------------------------------------------------
-				general = {
-					faction = true,
-					specialty = false,
-					skill = true,
-					known = false,
-					unknown = true,
-				},
-				-------------------------------------------------------------------------------
-				-- Obtain Filters
-				-------------------------------------------------------------------------------
-				obtain = {
-					trainer = true,
-					vendor = true,
-					instance = true,
-					raid = true,
-					seasonal = true,
-					quest = true,
-					pvp = true,
-					discovery = true,
-					worlddrop = true,
-					mobdrop = true,
-					originalwow = true,
-					bc = true,
-					wrath = true,
-				},
-				-------------------------------------------------------------------------------
-				-- Item Filters (Armor/Weapon)
-				-------------------------------------------------------------------------------
-				item = {
-					armor = {
-						cloth = true,
-						leather = true,
-						mail = true,
-						plate = true,
-						trinket = true,
-						cloak = true,
-						ring = true,
-						necklace = true,
-						shield = true,
-					},
-					weapon = {
-						onehand = true,
-						twohand = true,
-						axe = true,
-						sword = true,
-						mace = true,
-						polearm = true,
-						dagger = true,
-						fist = true,
-						staff = true,
-						wand = true,
-						thrown = true,
-						bow = true,
-						crossbow = true,
-						ammo = true,
-						gun = true,
-					},
-				},
-				-------------------------------------------------------------------------------
-				-- Binding Filters
-				-------------------------------------------------------------------------------
-				binding = {
-					itemboe = true,
-					itembop = true,
-					recipebop = true,
-					recipeboe = true,
-				},
-				-------------------------------------------------------------------------------
-				-- Player Role Filters
-				-------------------------------------------------------------------------------
-				player = {
-					melee = true,
-					tank = true,
-					healer = true,
-					caster = true,
-				},
-				-------------------------------------------------------------------------------
-				-- Reputation Filters
-				-------------------------------------------------------------------------------
-				rep = {
-					aldor = true,
-					scryer = true,
-					argentdawn = true,
-					ashtonguedeathsworn = true,
-					cenarioncircle = true,
-					cenarionexpedition = true,
-					consortium = true,
-					hellfire = true,
-					keepersoftime = true,
-					nagrand = true,
-					lowercity = true,
-					scaleofthesands = true,
-					shatar = true,
-					shatteredsun = true,
-					sporeggar = true,
-					thoriumbrotherhood = true,
-					timbermaw = true,
-					violeteye = true,
-					zandalar = true,
-					argentcrusade = true,
-					frenzyheart = true,
-					ebonblade = true,
-					kirintor = true,
-					sonsofhodir = true,
-					kaluak = true,
-					oracles = true,
-					wyrmrest = true,
-					wrathcommon1 = true,
-					wrathcommon2 = true,
-					wrathcommon3 = true,
-					wrathcommon4 = true,
-					wrathcommon5 = true,
-					ashenverdict = true,
-				},
-				-------------------------------------------------------------------------------
-				-- Class Filters
-				-------------------------------------------------------------------------------
-				classes = {
-					deathknight = true,
-					druid = true,
-					hunter = true,
-					mage = true,
-					paladin = true,
-					priest = true,
-					rogue = true,
-					shaman = true,
-					warlock = true,
-					warrior = true,
-				},
-			}
-		}
-	}
-	self.db = LibStub("AceDB-3.0"):New("ARLDB2", defaults)
-
-	if not self.db then
-		self:Print("Error: Database not loaded correctly.  Please exit out of WoW and delete the ARL database file (AckisRecipeList.lua) found in: \\World of Warcraft\\WTF\\Account\\<Account Name>>\\SavedVariables\\")
-		return
-	end
-	local version = GetAddOnMetadata("AckisRecipeList", "Version")
-	version = string.gsub(version, "@project.revision@", "SVN")
-	self.version = version
-
-	self:SetupOptions()
-
-	-- Register slash commands
-	self:RegisterChatCommand("arl", "ChatCommand")
-	self:RegisterChatCommand("ackisrecipelist", "ChatCommand")
-
-	-------------------------------------------------------------------------------
-	-- Create the scan button
-	-------------------------------------------------------------------------------
-	local scan_button = CreateFrame("Button", nil, UIParent, "UIPanelButtonTemplate")
-	scan_button:SetHeight(20)
-
-	scan_button:RegisterForClicks("LeftButtonUp")
-	scan_button:SetScript("OnClick",
-			      function(self, button, down)
-				      local cprof = GetTradeSkillLine()
-				      local current_prof = Player["Profession"]
-
-				      if addon.Frame:IsVisible() then
-					      if IsShiftKeyDown() and not IsAltKeyDown() and not IsControlKeyDown() then
-						      -- Shift only (Text dump)
-						      addon:Scan(true)
-					      elseif not IsShiftKeyDown() and IsAltKeyDown() and not IsControlKeyDown() then
-						      -- Alt only (Wipe icons from map)
-						      addon:ClearMap()
-					      elseif not IsShiftKeyDown() and not IsAltKeyDown() and not IsControlKeyDown() and current_prof == cprof then
-						      -- If we have the same profession open, then we close the scanned window
-						      addon.Frame:Hide()
-					      elseif not IsShiftKeyDown() and not IsAltKeyDown() and not IsControlKeyDown() then
-						      -- If we have a different profession open we do a scan
-						      addon:Scan(false)
-						      addon:SetupMap()
-					      end
-				      else
-					      if IsShiftKeyDown() and not IsAltKeyDown() and not IsControlKeyDown() then
-						      -- Shift only (Text dump)
-						      addon:Scan(true)
-					      elseif not IsShiftKeyDown() and IsAltKeyDown() and not IsControlKeyDown() then
-						      -- Alt only (Wipe icons from map)
-						      addon:ClearMap()
-					      elseif not IsShiftKeyDown() and not IsAltKeyDown() and not IsControlKeyDown() then
-						      -- No modification
-						      addon:Scan(false)
-						      addon:SetupMap()
-					      end
-				      end
-			      end)
-
-	scan_button:SetScript("OnEnter",
-			      function(this)
-				      GameTooltip_SetDefaultAnchor(GameTooltip, this)
-				      GameTooltip:SetText(L["SCAN_RECIPES_DESC"])
-				      GameTooltip:Show()
-			      end)
-	scan_button:SetScript("OnLeave", function() GameTooltip:Hide() end)
-	scan_button:SetText(L["Scan"])
-
-	self.scan_button = scan_button
-
-	-------------------------------------------------------------------------------
-	-- Populate the profession initialization functions.
-	-------------------------------------------------------------------------------
-	PROFESSION_INITS[GetSpellInfo(51304)] = addon.InitAlchemy
-	PROFESSION_INITS[GetSpellInfo(51300)] = addon.InitBlacksmithing
-	PROFESSION_INITS[GetSpellInfo(51296)] = addon.InitCooking
-	PROFESSION_INITS[GetSpellInfo(51313)] = addon.InitEnchanting
-	PROFESSION_INITS[GetSpellInfo(51306)] = addon.InitEngineering
-	PROFESSION_INITS[GetSpellInfo(45542)] = addon.InitFirstAid
-	PROFESSION_INITS[GetSpellInfo(51302)] = addon.InitLeatherworking
-	PROFESSION_INITS[GetSpellInfo(32606)] = addon.InitSmelting
-	PROFESSION_INITS[GetSpellInfo(51309)] = addon.InitTailoring
-	PROFESSION_INITS[GetSpellInfo(51311)] = addon.InitJewelcrafting
-	PROFESSION_INITS[GetSpellInfo(45363)] = addon.InitInscription
-	PROFESSION_INITS[GetSpellInfo(53428)] = addon.InitRuneforging
-
-	-------------------------------------------------------------------------------
-	-- Initialize the databases
-	-------------------------------------------------------------------------------
-	self:InitCustom(CustomList)
-	self:InitMob(MobList)
-	self:InitQuest(QuestList)
-	self:InitReputation(ReputationList)
-	self:InitTrainer(TrainerList)
-	self:InitSeasons(SeasonalList)
-	self:InitVendor(VendorList)
-
-	-------------------------------------------------------------------------------
-	-- Hook GameTooltip so we can show information on mobs that drop/sell/train
-	-------------------------------------------------------------------------------
-        GameTooltip:HookScript("OnTooltipSetUnit",
-		       function(self)
-			       local name, unit = self:GetUnit()
-
-			       if not unit then
-				       return
-			       end
-			       local guid = UnitGUID(unit)
-
-			       if not guid then
-				       return
-			       end
-			       local GUID = tonumber(string.sub(guid, 8, 12), 16)
-			       local mob = MobList[GUID]
-			       local shifted = IsShiftKeyDown()
-
-			       if mob and mob["DropList"] then
-				       for spell_id in pairs(mob["DropList"]) do
-					       local recipe = RecipeList[spell_id]
-
-					       if not recipe["Known"] or shifted then
-						       local _, _, _, hex = GetItemQualityColor(recipe["Rarity"])
-
-						       self:AddLine("Drops: "..hex..recipe["Name"].."|r ("..recipe["Level"]..")")
-					       end
-				       end
-				       return
-			       end
-			       local vendor = VendorList[GUID]
-
-			       if vendor and vendor["SellList"] then
-				       for spell_id in pairs(vendor["SellList"]) do
-					       local recipe = RecipeList[spell_id]
-					       local skill_level = Player["Professions"][GetSpellInfo(recipe["Profession"])]
-					       local has_skill = skill_level and skill_level >= recipe["Level"]
-
-					       if ((not recipe["Known"] and has_skill) or shifted) and Player:IsCorrectFaction(recipe["Flags"]) then
-						       local _, _, _, hex = GetItemQualityColor(recipe["Rarity"])
-
-						       self:AddLine("Sells: "..hex..recipe["Name"].."|r ("..recipe["Level"]..")")
-					       end
-				       end
-				       return
-			       end
-			       local trainer = TrainerList[GUID]
-
-			       if trainer and trainer["TrainList"] then
-				       for spell_id in pairs(trainer["TrainList"]) do
-					       local recipe = RecipeList[spell_id]
-					       local skill_level = Player["Professions"][GetSpellInfo(recipe["Profession"])]
-					       local has_skill = skill_level and skill_level >= recipe["Level"]
-
-					       if ((not recipe["Known"] and has_skill) or shifted) and Player:IsCorrectFaction(recipe["Flags"]) then
-						       local _, _, _, hex = GetItemQualityColor(recipe["Rarity"])
-
-						       self:AddLine("Trains: "..hex..recipe["Name"].."|r ("..recipe["Level"]..")")
-					       end
-				       end
-				       return
-			       end
-		       end)
-end
-
----Function run when the addon is enabled.  Registers events and pre-loads certain variables.
-function addon:OnEnable()
-	self:RegisterEvent("TRADE_SKILL_SHOW")	-- Make addon respond to the tradeskill windows being shown
-	self:RegisterEvent("TRADE_SKILL_CLOSE")	-- Addon responds to tradeskill windows being closed.
-
-	if addon.db.profile.scantrainers then
-		self:RegisterEvent("TRAINER_SHOW")
-	end
-
-	if addon.db.profile.scanvendors then
-		self:RegisterEvent("MERCHANT_SHOW")
-	end
-
-	-------------------------------------------------------------------------------
-	-- Set the parent and scripts for addon.scan_button.
-	-------------------------------------------------------------------------------
-	local scan_button = self.scan_button
-
-	if Skillet and Skillet:IsActive() then
-		scan_button:SetParent(SkilletFrame)
-		Skillet:AddButtonToTradeskillWindow(scan_button)
-		scan_button:SetWidth(80)
-	elseif MRTUIUtils_RegisterWindowOnShow then
-		MRTUIUtils_RegisterWindowOnShow(function()
-							scan_button:SetParent(MRTSkillFrame)
-							scan_button:ClearAllPoints()
-							scan_button:SetPoint("RIGHT", MRTSkillFrameCloseButton, "LEFT", 4, 0)
-							scan_button:SetWidth(scan_button:GetTextWidth() + 10)
-							scan_button:Show()
-						end)
-  	elseif ATSWFrame then
-		scan_button:SetParent(ATSWFrame)
-		scan_button:ClearAllPoints()
-
-		if TradeJunkieMain and TJ_OpenButtonATSW then
-			scan_button:SetPoint("RIGHT", TJ_OpenButtonATSW, "LEFT", 0, 0)
-		else
-			scan_button:SetPoint("RIGHT", ATSWOptionsButton, "LEFT", 0, 0)
-		end
-		scan_button:SetHeight(ATSWOptionsButton:GetHeight())
-		scan_button:SetWidth(ATSWOptionsButton:GetWidth())
-	elseif CauldronFrame then
-		scan_button:SetParent(CauldronFrame)
-		scan_button:ClearAllPoints()
-		scan_button:SetPoint("TOP", CauldronFrame, "TOPRIGHT", -58, -52)
-		scan_button:SetWidth(90)
-	end
-
-	local buttonparent = scan_button:GetParent()
-	local framelevel = buttonparent:GetFrameLevel()
-	local framestrata = buttonparent:GetFrameStrata()
-
-	-- Set the frame level of the button to be 1 deeper than its parent
-	scan_button:SetFrameLevel(framelevel + 1)
-	scan_button:SetFrameStrata(framestrata)
-	scan_button:Enable()
-
-	-- Add an option so that ARL will work with Manufac
-	if Manufac then
-		Manufac.options.args.ARLScan = {
-			type = 'execute',
-			name = L["Scan"],
-			desc = L["SCAN_RECIPES_DESC"],
-			func = function() addon:Scan(false) end,
-			order = 550,
-		}
-	end
-
---[[
-	-- If we're using Skillet, use Skillet's API to work with getting tradeskills
-	if (Skillet) and (Skillet.GetNumTradeSkills) and
-	(Skillet.GetTradeSkillLine) and (Skillet.GetTradeSkillInfo) and
-	(Skillet.GetTradeSkillRecipeLink) and (Skillet.ExpandTradeSkillSubClass) then
-		self:Print("Enabling Skillet advanced features.")
-		GetNumTradeSkills = function(...) return Skillet:GetNumTradeSkills(...) end
-		GetTradeSkillLine = function(...) return Skillet:GetTradeSkillLine(...) end
-		GetTradeSkillInfo = function(...) return Skillet:GetTradeSkillInfo(...) end
-		GetTradeSkillRecipeLink = function(...) return Skillet:GetTradeSkillRecipeLink(...) end
-		ExpandTradeSkillSubClass = function(...) return Skillet:ExpandTradeSkillSubClass(...) end
-	end
-]]--
-	-------------------------------------------------------------------------------
-	-- Initialize the main panel frame.
-	-------------------------------------------------------------------------------
-	self:InitializeFrame()
-	self.InitializeFrame = nil
-
-	-------------------------------------------------------------------------------
-	-- Initialize the player's data.
-	-------------------------------------------------------------------------------
-	do
-		Player["Faction"] = UnitFactionGroup("player")
-		Player["Class"] = select(2, UnitClass("player"))
-
-		-------------------------------------------------------------------------------
-		-- Get the player's reputation levels.
-		-------------------------------------------------------------------------------
-		Player["Reputation"] = {}
-		Player:SetReputationLevels()
-
-		-------------------------------------------------------------------------------
-		-- Get the player's professions.
-		-------------------------------------------------------------------------------
-		Player["Professions"] = {
-			[GetSpellInfo(51304)] = false, -- Alchemy
-			[GetSpellInfo(51300)] = false, -- Blacksmithing
-			[GetSpellInfo(51296)] = false, -- Cooking
-			[GetSpellInfo(51313)] = false, -- Enchanting
-			[GetSpellInfo(51306)] = false, -- Engineering
-			[GetSpellInfo(45542)] = false, -- First Aid
-			[GetSpellInfo(51302)] = false, -- Leatherworking
-			[GetSpellInfo(32606)] = false, -- Mining
-			[GetSpellInfo(51309)] = false, -- Tailoring
-			[GetSpellInfo(51311)] = false, -- Jewelcrafting
-			[GetSpellInfo(45363)] = false, -- Inscription
-			[GetSpellInfo(53428)] = false, -- Runeforging
-		}
-		Player:SetProfessions()
-	end	-- do
-
-	-------------------------------------------------------------------------------
-	-- Initialize the SpecialtyTable and AllSpecialtiesTable.
-	-------------------------------------------------------------------------------
-	do
-		local AlchemySpec = {
-			[GetSpellInfo(28674)] = 28674,
-			[GetSpellInfo(28678)] = 28678,
-			[GetSpellInfo(28676)] = 28676,
-		}
-
-		local BlacksmithSpec = {
-			[GetSpellInfo(9788)] = 9788,	-- Armorsmith
-			[GetSpellInfo(17041)] = 17041,	-- Master Axesmith
-			[GetSpellInfo(17040)] = 17040,	-- Master Hammersmith
-			[GetSpellInfo(17039)] = 17039,	-- Master Swordsmith
-			[GetSpellInfo(9787)] = 9787,	-- Weaponsmith
-		}
-
-		local EngineeringSpec = {
-			[GetSpellInfo(20219)] = 20219, -- Gnomish
-			[GetSpellInfo(20222)] = 20222, -- Goblin
-		}
-
-		local LeatherworkSpec = {
-			[GetSpellInfo(10657)] = 10657, -- Dragonscale
-			[GetSpellInfo(10659)] = 10659, -- Elemental
-			[GetSpellInfo(10661)] = 10661, -- Tribal
-		}
-
-		local TailorSpec = {
-			[GetSpellInfo(26797)] = 26797, -- Spellfire
-			[GetSpellInfo(26801)] = 26801, -- Shadoweave
-			[GetSpellInfo(26798)] = 26798, -- Primal Mooncloth
-		}
-
-		SpecialtyTable = {
-			[GetSpellInfo(51304)] = AlchemySpec,
-			[GetSpellInfo(51300)] = BlacksmithSpec,
-			[GetSpellInfo(51306)] = EngineeringSpec,
-			[GetSpellInfo(51302)] = LeatherworkSpec,
-			[GetSpellInfo(51309)] = TailorSpec,
-		}
-
-		-- Populate the Specialty table with all Specialties, adding alchemy even though no recipes have alchemy filters
-		for i in pairs(AlchemySpec) do AllSpecialtiesTable[i] = true end
-		for i in pairs(BlacksmithSpec) do AllSpecialtiesTable[i] = true end
-		for i in pairs(EngineeringSpec) do AllSpecialtiesTable[i] = true end
-		for i in pairs(LeatherworkSpec) do AllSpecialtiesTable[i] = true end
-		for i in pairs(TailorSpec) do AllSpecialtiesTable[i] = true end
-	end	-- do
-end
-
----Run when the addon is disabled. Ace3 takes care of unregistering events, etc.
-function addon:OnDisable()
-	addon.Frame:Hide()
-
-	-- Remove the option from Manufac
-	if Manufac then
-		Manufac.options.args.ARLScan = nil
-	end
-end
-
--------------------------------------------------------------------------------
--- Event handling functions
--------------------------------------------------------------------------------
-
----Event used for datamining when a trainer is shown.
-function addon:TRAINER_SHOW()
-	self:ScanSkillLevelData(true)
-	self:ScanTrainerData(true)
-end
-
-function addon:MERCHANT_SHOW()
-	addon:ScanVendor()
-end
-
-do
-	local GetTradeSkillListLink = _G.GetTradeSkillListLink
-	local UnitName = _G.UnitName
-	local GetRealmName = _G.GetRealmName
-	local IsTradeSkillLinked = _G.IsTradeSkillLinked
-
-	function addon:TRADE_SKILL_SHOW()
-		-- If this is our own skill, save it, if not don't save it
-		if not IsTradeSkillLinked() then
-			local tradelink = GetTradeSkillListLink()
-
-			if tradelink then
-				local pname = UnitName("player")
-				local prealm = GetRealmName()
-				local tradename = GetTradeSkillLine()
-
-				-- Actual alt information saved here. -Torhal
-				addon.db.global.tradeskill = addon.db.global.tradeskill or {}
-				addon.db.global.tradeskill[prealm] = addon.db.global.tradeskill[prealm] or {}
-				addon.db.global.tradeskill[prealm][pname] = addon.db.global.tradeskill[prealm][pname] or {}
-
-				addon.db.global.tradeskill[prealm][pname][tradename] = tradelink
-			end
-		end
-		local scan_button = self.scan_button
-		local scan_parent = self.scan_button:GetParent()
-
-		if not scan_parent or scan_parent == UIParent then
-			scan_button:SetParent(TradeSkillFrame)
-			scan_button:ClearAllPoints()
-
-			local loc = addon.db.profile.scanbuttonlocation
-
-			if loc == "TR" then
-				scan_button:SetPoint("RIGHT", TradeSkillFrameCloseButton, "LEFT",4,0)
-			elseif loc == "TL" then
-				scan_button:SetPoint("LEFT", TradeSkillFramePortrait, "RIGHT",2,12)
-			elseif loc == "BR" then
-				scan_button:SetPoint("TOP", TradeSkillCancelButton, "BOTTOM",0,-5)
-			elseif loc == "BL" then
-				scan_button:SetPoint("TOP", TradeSkillCreateAllButton, "BOTTOM",0,-5)
-			end
-			scan_button:SetWidth(scan_button:GetTextWidth() + 10)
-		end
-		self.scan_button:Show()
-	end
-end
-
-function addon:TRADE_SKILL_CLOSE()
-	if addon.db.profile.closeguionskillclose then
-		self.Frame:Hide()
-	end
-
-	if not Skillet then
-		addon.scan_button:Hide()
-	end
-end
-
--------------------------------------------------------------------------------
--- Tradeskill functions
--- Recipe DB Structures are defined in Documentation.lua
--------------------------------------------------------------------------------
-
---- Adds a tradeskill recipe into the specified recipe database.
--- @name AckisRecipeList:addTradeSkill
--- @usage AckisRecipeList:addTradeSkill(RecipeDB,2329,1,2454,1,2259,0,1,55,75,95)
--- @param RecipeDB The database (array) which you wish to add data too.
--- @param SpellID The [[http://www.wowwiki.com/SpellLink | Spell ID]] of the recipe being added to the database.
--- @param SkillLevel The skill level at which the recipe may be learned.
--- @param ItemID The [[http://www.wowwiki.com/ItemLink | Item ID]] that is created by the recipe, or nil
--- @param Rarity The rarity of the recipe.
--- @param Profession The profession ID that uses the recipe.  See [[database-documentation]] for a listing of profession IDs.
--- @param Specialty The specialty that uses the recipe (ie: goblin engineering) or nil or blank
--- @param Game Game version recipe was found in, for example, Original, BC, or Wrath.
--- @param Orange Level at which recipe is considered orange.
--- @param Yellow Level at which recipe is considered yellow.
--- @param Green Level at which recipe is considered green.
--- @param Grey Level at which recipe is considered grey.
--- @return None, array is passed as a reference.
-function addon:addTradeSkill(RecipeDB, SpellID, SkillLevel, ItemID, Rarity, Profession, Specialty, Game, Orange, Yellow, Green, Grey)
-	local spellLink = GetSpellLink(SpellID)
-	local profession_id = GetSpellInfo(Profession)
-	local recipe_name = GetSpellInfo(SpellID)
-
-	if RecipeDB[SpellID] then
-		--@alpha@
-		self:Print("Duplicate recipe: "..profession_id.." "..tostring(SpellID).." "..recipe_name)
-		--@end-alpha@
-		return
-	end
-
-	-------------------------------------------------------------------------------
-	-- Create a table inside the RecipeListing table which stores all information
-	-- about a recipe
-	-------------------------------------------------------------------------------
-	RecipeDB[SpellID] = {
-		["Level"] = SkillLevel,
-		["ItemID"] = ItemID,
-		["Rarity"] = Rarity,
-		["Profession"] = profession_id,
-		["Locations"] = nil,
-		["RecipeLink"] = spellLink,
-		["Name"] = recipe_name,
-		["Display"] = true,				-- Set to be displayed until the filtering occurs
-		["Search"] = true,				-- Set to be showing in the search results
-		["Flags"] = {},					-- Create the flag space in the RecipeDB
-		["Acquire"] = {},				-- Create the Acquire space in the RecipeDB
-		["Specialty"] = Specialty,			-- Assumption: there will only be 1 speciality for a trade skill
-		["Game"] = Game,
-		["Orange"] = Orange or SkillLevel,		-- If we don't have an orange value in the db, just assume the skill level
-		["Yellow"] = Yellow or SkillLevel + 10,		-- If we don't have a yellow value in the db, just assume the skill level
-		["Green"] = Green or SkillLevel + 15,		-- If we don't have a green value in the db, just assume the skill level
-		["Grey"] = Grey or SkillLevel + 20,		-- If we don't have a grey value in the db, just assume the skill level
-	}
-	local recipe = RecipeDB[SpellID]
-
-	if not recipe["Name"] then
-		self:Print(strformat(L["SpellIDCache"], SpellID))
-	end
-
-	-- Set all the flags to be false, will also set the padding spaces to false as well.
-	for i = 1, NUM_FILTER_FLAGS, 1 do
-		recipe["Flags"][i] = false
-	end
-end
-
---- Adds filtering flags to a specific tradeskill.
--- @name AckisRecipeList:addTradeFlags
--- @usage AckisRecipeList:addTradeFlags(RecipeDB,2329,1,2,3,21,22,23,24,25,26,27,28,29,30,36,41,51,52)
--- @param RecipeDB The database (array) which you wish to add flags too.
--- @param SpellID The [[http://www.wowwiki.com/SpellLink | Spell ID]] of the recipe which flags are being added to.
--- @param ... A listing of filtering flags.  See [[database-documentation]] for a listing of filtering flags.
--- @return None, array is passed as a reference.
-function addon:addTradeFlags(RecipeDB, SpellID, ...)
-	-- flags are defined in Documentation.lua
-	local numvars = select('#',...)
-	local flags = RecipeDB[SpellID]["Flags"]
-
-	-- Find out how many flags we're adding
-	for i = 1, numvars, 1 do
-		-- Get the value of the current flag
-		local flag = select(i, ...)
-		flags[flag] = true
-	end
-end
-
---- Adds acquire methods to a specific tradeskill.
--- @name AckisRecipeList:addTradeAcquire
--- @usage AckisRecipeList:addTradeAcquire:(RecipeDB,2329,8,8)
--- @param RecipeDB The database (array) which you wish to add acquire methods too.
--- @param SpellID The [[http://www.wowwiki.com/SpellLink | Spell ID]] of the recipe which acquire methods are being added to.
--- @param ... A listing of acquire methods.  See [[database-documentation]] for a listing of acquire methods and how they behave.
--- @return None, array is passed as a reference.
-do
-	-- Tables for getting the locations
-	local location_list = {}
-	local location_checklist = {}
-
-	local function LocationSort(a, b)
-		return a < b
-	end
-
-	function addon:addTradeAcquire(DB, SpellID, ...)
-		local numvars = select('#', ...)	-- Find out how many flags we're adding
-		local index = 1				-- Index for the number of Acquire entries we have
-		local i = 1				-- Index for which variables we're parsing through
-		local acquire = DB[SpellID]["Acquire"]
-
-		twipe(location_list)
-		twipe(location_checklist)
-
-		while i < numvars do
-			local acquire_type, acquire_id = select(i, ...)
-			i = i + 2
-
-			--@alpha@
-			if acquire[index] then
-				self:Print("addTradeAcquire called more than once for SpellID "..SpellID)
-			end
-			--@end-alpha@
-
-			acquire[index] = {
-				["Type"] = acquire_type,
-				["ID"] = acquire_id
-			}
-			local location
-
-			if not acquire_type then
-				self:Print("SpellID: "..SpellID.." has no acquire type.")
-			elseif acquire_type == A_TRAINER then
-				if not acquire_id then
-					--@alpha@
-					self:Print("SpellID "..SpellID..": TrainerID is nil.")
-					--@end-alpha@
-				elseif not TrainerList[acquire_id] then
-					--@alpha@
-					self:Print("SpellID "..SpellID..": TrainerID "..acquire_id.." does not exist in the database.")
-					--@end-alpha@
-				else
-					location = TrainerList[acquire_id]["Location"]
-
-					if not location_checklist[location] then
-						tinsert(location_list, location)
-						location_checklist[location] = true
-					end
-					TrainerList[acquire_id]["TrainList"] = TrainerList[acquire_id]["TrainList"] or {}
-					TrainerList[acquire_id]["TrainList"][SpellID] = true
-				end
-			elseif acquire_type == A_VENDOR then
-				if not acquire_id then
-					--@alpha@
-					self:Print("SpellID "..SpellID..": VendorID is nil.")
-					--@end-alpha@
-				elseif not VendorList[acquire_id] then
-					--@alpha@
-					self:Print("SpellID "..SpellID..": VendorID "..acquire_id.." does not exist in the database.")
-					--@end-alpha@
-				else
-					location = VendorList[acquire_id]["Location"]
-
-					if not location_checklist[location] then
-						tinsert(location_list, location)
-						location_checklist[location] = true
-					end
-					VendorList[acquire_id]["SellList"] = VendorList[acquire_id]["SellList"] or {}
-					VendorList[acquire_id]["SellList"][SpellID] = true
-				end
-			elseif acquire_type == A_MOB then
-				if not acquire_id then
-					--@alpha@
-					self:Print("SpellID "..SpellID..": MobID is nil.")
-					--@end-alpha@
-				elseif not MobList[acquire_id] then
-					--@alpha@
-					self:Print("SpellID "..SpellID..": Mob ID "..acquire_id.." does not exist in the database.")
-					--@end-alpha@
-				else
-					location = MobList[acquire_id]["Location"]
-
-					if not location_checklist[location] then
-						tinsert(location_list, location)
-						location_checklist[location] = true
-					end
-					MobList[acquire_id]["DropList"] = MobList[acquire_id]["DropList"] or {}
-					MobList[acquire_id]["DropList"][SpellID] = true
-				end
-			elseif acquire_type == A_QUEST then
-				if not acquire_id then
-					--@alpha@
-					self:Print("SpellID "..SpellID..": QuestID is nil.")
-					--@end-alpha@
-				elseif not QuestList[acquire_id] then
-					--@alpha@
-					self:Print("SpellID "..SpellID..": Quest ID "..acquire_id.." does not exist in the database.")
-					--@end-alpha@
-				else
-					location = QuestList[acquire_id]["Location"]
-
-					if not location_checklist[location] then
-						tinsert(location_list, location)
-						location_checklist[location] = true
-					end
-				end
-				--@alpha@
-			elseif acquire_type == A_SEASONAL then
-				if not acquire_id then
-					self:Print("SpellID "..SpellID..": SeasonalID is nil.")
-				end
-				--@end-alpha@
-			elseif acquire_type == A_REPUTATION then
-				local RepLevel, RepVendor = select(i, ...)
-				i = i + 2
-
-				acquire[index]["RepLevel"] = RepLevel
-				acquire[index]["RepVendor"] = RepVendor
-				VendorList[RepVendor]["SellList"] = VendorList[RepVendor]["SellList"] or {}
-				VendorList[RepVendor]["SellList"][SpellID] = true
-
-				location = VendorList[RepVendor]["Location"]
-
-				if not location_checklist[location] then
-					tinsert(location_list, location)
-					location_checklist[location] = true
-				end
-
-				--@alpha@
-				if not acquire_id then
-					self:Print("SpellID "..SpellID..": ReputationID is nil.")
-				elseif not ReputationList[acquire_id] then
-					self:Print("SpellID "..SpellID..": ReputationID "..acquire_id.." does not exist in the database.")
-				end
-
-				if not RepVendor then
-					self:Print("SpellID "..SpellID..": Reputation VendorID is nil.")
-				elseif not VendorList[RepVendor] then
-					self:Print("SpellID "..SpellID..": Reputation VendorID "..RepVendor.." does not exist in the database.")
-				end
-				--@end-alpha@
-			elseif acquire_type == A_WORLD_DROP then
-				local location = L["World Drop"]
-
-				if not location_checklist[location] then
-					tinsert(location_list, location)
-					location_checklist[location] = true
-				end
-			end
-			index = index + 1
-		end
-		-- Populate the location field with all the data
-		table.sort(location_list, LocationSort)
-		DB[SpellID]["Locations"] = (#location_list == 0 and "" or tconcat(location_list, ", "))
-	end
-end	-- do block
-
---- Adds an item to a specific database listing (ie: vendor, mob, etc)
--- @name AckisRecipeList:addLookupList
--- @usage AckisRecipeList:addLookupList:(VendorDB,NPC ID, NPC Name, NPC Location, X Coord, Y Coord, Faction)
--- @param DB Database which the entry will be stored.
--- @param ID Unique identified for the entry.
--- @param Name Name of the entry.
--- @param Loc Location of the entry in the world.
--- @param Coordx X coordinate of where the entry is found.
--- @param Coordy Y coordinate of where the entry is found.
--- @param Faction Faction identifier for the entry.
--- @return None, array is passed as a reference.
---For individual database structures, see Documentation.lua
-do
-	local FACTION_NAMES = {
-		[1]	= BFAC["Neutral"],
-		[2]	= BFAC["Alliance"],
-		[3]	= BFAC["Horde"]
-	}
-	function addon:addLookupList(DB, ID, Name, Loc, Coordx, Coordy, Faction)
-		if DB[ID] then
-			--@alpha@
-			self:Print("Duplicate lookup: "..tostring(ID).." "..Name)
-			--@end-alpha@
-			return
-		end
-
-		DB[ID] = {
-			["Name"]	= Name,
-			["Location"]	= Loc or L["Unknown Zone"],
-			["Faction"]	= Faction and FACTION_NAMES[Faction + 1] or nil
-		}
-		if Coordx and Coordy then
-			DB[ID]["Coordx"] = Coordx
-			DB[ID]["Coordy"] = Coordy
-		end
-
-		--@alpha@
-		if not Loc then
-			self:Print("Spell ID: " .. ID .. " (" .. DB[ID]["Name"] .. ") has an unknown location.")
-		end
-		--@end-alpha@
-	end
-end	-- do
-
--------------------------------------------------------------------------------
--- Filter flag functions
--------------------------------------------------------------------------------
-do
-	local F_ALLIANCE, F_HORDE = 1, 2
-
-	-------------------------------------------------------------------------------
-	-- Item "rarity"
-	-------------------------------------------------------------------------------
-	local R_COMMON, R_UNCOMMON, R_RARE, R_EPIC, R_LEGENDARY, R_ARTIFACT = 1, 2, 3, 4, 5, 6
-
-	-- HardFilterFlags and SoftFilterFlags are used to determine if a recipe should be shown based on the value of the key compared to the value of its saved_var.
-	-- Its keys and values are populated the first time CanDisplayRecipe() is called.
-	local HardFilterFlags, SoftFilterFlags, RepFilterFlags
-
-	local F_DK, F_DRUID, F_HUNTER, F_MAGE, F_PALADIN, F_PRIEST, F_SHAMAN, F_ROGUE, F_WARLOCK, F_WARRIOR = 21, 22, 23, 24, 25, 26, 27, 28, 29, 30
-	local ClassFilterFlags = {
-		["deathknight"]	= F_DK,		["druid"]	= F_DRUID,	["hunter"]	= F_HUNTER,
-		["mage"]	= F_MAGE,	["paladin"]	= F_PALADIN,	["priest"]	= F_PRIEST,
-		["shaman"]	= F_SHAMAN,	["rogue"]	= F_ROGUE,	["warlock"]	= F_WARLOCK,
-		["warrior"]	= F_WARRIOR,
-	}
-
-	---Scans a specific recipe to determine if it is to be displayed or not.
-	local function CanDisplayRecipe(recipe)
-		-------------------------------------------------------------------------------
-		-- Origin
-		-------------------------------------------------------------------------------
-		local GAME_ORIG, GAME_TBC, GAME_WOTLK = 0, 1, 2
-
-		-- For flag info see comments at start of file in comments
-		local filter_db = addon.db.profile.filters
-		local general_filters = filter_db.general
-		local recipe_flags = recipe["Flags"]
-
-		-- See Documentation file for logic explanation
-		-------------------------------------------------------------------------------
-		-- Stage 1
-		-- Loop through exclusive flags (hard filters)
-		-- If one of these does not pass we do not display the recipe
-		-- So to be more efficient we'll just leave this function if there's a false
-		-------------------------------------------------------------------------------
-
-		-- Display both horde and alliance factions?
-		if not general_filters.faction and not Player:IsCorrectFaction(recipe_flags) then
-			return false
-		end
-
-		-- Display all skill levels?
-		if not general_filters.skill and recipe["Level"] > Player["ProfessionLevel"] then
-			return false
-		end
-
-		-- Display all specialities?
-		if not general_filters.specialty then
-			local specialty = recipe["Specialty"]
-
-			if specialty and specialty ~= Player["Specialty"] then
-				return false
-			end
-		end
-		local obtain_filters = filter_db.obtain
-		local game_version = recipe["Game"]
-
-		-- Filter out game recipes
-		if not obtain_filters.originalwow and game_version == GAME_ORIG then
-			return false
-		end
-
-		if not obtain_filters.bc and game_version == GAME_TBC then
-			return false
-		end
-
-		if not obtain_filters.wrath and game_version == GAME_WOTLK then
-			return false
-		end
-
-		-------------------------------------------------------------------------------
-		-- Check the hard filter flags
-		-------------------------------------------------------------------------------
-		if not HardFilterFlags then
-			local F_IBOE, F_IBOP, F_IBOA, F_RBOE, F_RBOP, F_RBOA = 36, 37, 38, 40, 41, 42
-			local F_DPS, F_TANK, F_HEALER, F_CASTER = 51, 52, 53, 54
-			local F_CLOTH, F_LEATHER, F_MAIL, F_PLATE, F_CLOAK, F_TRINKET, F_RING, F_NECK, F_SHIELD = 56, 57, 58, 59, 60, 61, 62, 63, 64
-			local F_1H, F_2H, F_AXE, F_SWORD, F_MACE, F_POLEARM, F_DAGGER = 66, 67, 68, 69, 70, 71, 72
-			local F_STAFF, F_WAND, F_THROWN, F_BOW, F_XBOW, F_AMMO, F_FIST, F_GUN = 73, 74, 75, 76, 77, 78, 79, 80
-
-			local binding_filters	= filter_db.binding
-			local player_filters	= filter_db.player
-			local armor_filters	= filter_db.item.armor
-			local weapon_filters	= filter_db.item.weapon
-
-			HardFilterFlags = {
-				------------------------------------------------------------------------------------------------
-				-- Binding flags.
-				------------------------------------------------------------------------------------------------
-				["itemboe"]	= { flag = F_IBOE,	sv_root = binding_filters },
-				["itembop"]	= { flag = F_IBOP,	sv_root = binding_filters },
-				["itemboa"]	= { flag = F_IBOA,	sv_root = binding_filters },
-				["recipeboe"]	= { flag = F_RBOE,	sv_root = binding_filters },
-				["recipebop"]	= { flag = F_RBOP,	sv_root = binding_filters },
-				["recipeboa"]	= { flag = F_RBOA,	sv_root = binding_filters },
-				------------------------------------------------------------------------------------------------
-				-- Player Type flags.
-				------------------------------------------------------------------------------------------------
-				["melee"]	= { flag = F_DPS,	sv_root = player_filters },
-				["tank"]	= { flag = F_TANK,	sv_root = player_filters },
-				["healer"]	= { flag = F_HEALER,	sv_root = player_filters },
-				["caster"]	= { flag = F_CASTER,	sv_root = player_filters },
-				------------------------------------------------------------------------------------------------
-				-- Armor flags.
-				------------------------------------------------------------------------------------------------
-				["cloth"]	= { flag = F_CLOTH,	sv_root = armor_filters },
-				["leather"]	= { flag = F_LEATHER,	sv_root = armor_filters },
-				["mail"]	= { flag = F_MAIL,	sv_root = armor_filters },
-				["plate"]	= { flag = F_PLATE,	sv_root = armor_filters },
-				["trinket"]	= { flag = F_TRINKET,	sv_root = armor_filters },
-				["cloak"]	= { flag = F_CLOAK,	sv_root = armor_filters },
-				["ring"]	= { flag = F_RING,	sv_root = armor_filters },
-				["necklace"]	= { flag = F_NECK,	sv_root = armor_filters },
-				["shield"]	= { flag = F_SHIELD,	sv_root = armor_filters },
-				------------------------------------------------------------------------------------------------
-				-- Weapon flags.
-				------------------------------------------------------------------------------------------------
-				["onehand"]	= { flag = F_1H,	sv_root = weapon_filters },
-				["twohand"]	= { flag = F_2H,	sv_root = weapon_filters },
-				["axe"]		= { flag = F_AXE,	sv_root = weapon_filters },
-				["sword"]	= { flag = F_SWORD,	sv_root = weapon_filters },
-				["mace"]	= { flag = F_MACE,	sv_root = weapon_filters },
-				["polearm"]	= { flag = F_POLEARM,	sv_root = weapon_filters },
-				["dagger"]	= { flag = F_DAGGER,	sv_root = weapon_filters },
-				["fist"]	= { flag = F_FIST,	sv_root = weapon_filters },
-				["gun"]		= { flag = F_GUN,	sv_root = weapon_filters },
-				["staff"]	= { flag = F_STAFF,	sv_root = weapon_filters },
-				["wand"]	= { flag = F_WAND,	sv_root = weapon_filters },
-				["thrown"]	= { flag = F_THROWN,	sv_root = weapon_filters },
-				["bow"]		= { flag = F_BOW,	sv_root = weapon_filters },
-				["crossbow"]	= { flag = F_XBOW,	sv_root = weapon_filters },
-				["ammo"]	= { flag = F_AMMO,	sv_root = weapon_filters },
-			}
-		end
-
-		for filter, data in pairs(HardFilterFlags) do
-			if recipe_flags[data.flag] and not data.sv_root[filter] then
-				return false
-			end
-		end
-
-		-------------------------------------------------------------------------------
-		-- Check the reputation filter flags
-		-------------------------------------------------------------------------------
-		if not RepFilterFlags then
-			local rep_filters = filter_db.rep
-
-			local F_ARGENTDAWN, F_CENARION_CIRCLE, F_THORIUM_BROTHERHOOD, F_TIMBERMAW_HOLD, F_ZANDALAR = 96, 97, 98, 99, 100
-			local F_ALDOR, F_ASHTONGUE, F_CENARION_EXPEDITION, F_HELLFIRE, F_CONSORTIUM = 101, 102, 103, 104, 105
-			local F_KOT, F_LOWERCITY, F_NAGRAND, F_SCALE_SANDS, F_SCRYER, F_SHATAR = 106, 107, 108, 109, 110, 111
-			local F_SHATTEREDSUN, F_SPOREGGAR, F_VIOLETEYE = 112, 113, 114
-			local F_ARGENTCRUSADE, F_FRENZYHEART, F_EBONBLADE, F_KIRINTOR, F_HODIR = 115, 116, 117, 118, 119
-			local F_KALUAK, F_ORACLES, F_WYRMREST, F_WRATHCOMMON1, F_WRATHCOMMON2 = 120, 121, 122, 123, 124
-			local F_WRATHCOMMON3, F_WRATHCOMMON4, F_WRATHCOMMON5, F_ASHEN_VERDICT = 125, 126, 127, 128
-
-			RepFilterFlags = {
-				[F_ARGENTDAWN]		= rep_filters.argentdawn,
-				[F_CENARION_CIRCLE]	= rep_filters.cenarioncircle,
-				[F_THORIUM_BROTHERHOOD]	= rep_filters.thoriumbrotherhood,
-				[F_TIMBERMAW_HOLD]	= rep_filters.timbermaw,
-				[F_ZANDALAR]		= rep_filters.zandalar,
-				[F_ALDOR]		= rep_filters.aldor,
-				[F_ASHTONGUE]		= rep_filters.ashtonguedeathsworn,
-				[F_CENARION_EXPEDITION]	= rep_filters.cenarionexpedition,
-				[F_HELLFIRE]		= rep_filters.hellfire,
-				[F_CONSORTIUM]		= rep_filters.consortium,
-				[F_KOT]			= rep_filters.keepersoftime,
-				[F_LOWERCITY]		= rep_filters.lowercity,
-				[F_NAGRAND]		= rep_filters.nagrand,
-				[F_SCALE_SANDS]		= rep_filters.scaleofthesands,
-				[F_SCRYER]		= rep_filters.scryer,
-				[F_SHATAR]		= rep_filters.shatar,
-				[F_SHATTEREDSUN]	= rep_filters.shatteredsun,
-				[F_SPOREGGAR]		= rep_filters.sporeggar,
-				[F_VIOLETEYE]		= rep_filters.violeteye,
-				[F_ARGENTCRUSADE]	= rep_filters.argentcrusade,
-				[F_FRENZYHEART]		= rep_filters.frenzyheart,
-				[F_EBONBLADE]		= rep_filters.ebonblade,
-				[F_KIRINTOR]		= rep_filters.kirintor,
-				[F_HODIR]		= rep_filters.sonsofhodir,
-				[F_KALUAK]		= rep_filters.kaluak,
-				[F_ORACLES]		= rep_filters.oracles,
-				[F_WYRMREST]		= rep_filters.wyrmrest,
-				[F_WRATHCOMMON1]	= rep_filters.wrathcommon1,
-				[F_WRATHCOMMON2]	= rep_filters.wrathcommon2,
-				[F_WRATHCOMMON3]	= rep_filters.wrathcommon3,
-				[F_WRATHCOMMON4]	= rep_filters.wrathcommon4,
-				[F_WRATHCOMMON5]	= rep_filters.wrathcommon5,
-				[F_ASHEN_VERDICT]	= rep_filters.ashenverdict,
-			}
-		end
-		local rep_display = true
-
-		for flag in pairs(RepFilterFlags) do
-			if recipe_flags[flag] then
-				rep_display = RepFilterFlags[flag] and true or false
-			end
-		end
-
-		if not rep_display then
-			return false
-		end
-
-		-------------------------------------------------------------------------------
-		-- Check the class filter flags
-		-------------------------------------------------------------------------------
-		local toggled_off, toggled_on = 0, 0
-		local class_filters = filter_db.classes
-
-		-- Now we check to see if _all_ of the pertinent class flags are toggled off. If even one is toggled on, we still show the recipe.
-		for class, flag in pairs(ClassFilterFlags) do
-			if recipe_flags[flag] then
-				if class_filters[class] then
-					toggled_on = toggled_on + 1
-				elseif not class_filters[class] then
-					toggled_off = toggled_off + 1
-				end
-			end
-		end
-
-		if toggled_off > 0 and toggled_on == 0 then
-			return false
-		end
-
-		------------------------------------------------------------------------------------------------
-		-- Stage 2
-		-- loop through nonexclusive (soft filters) flags until one is true
-		-- If one of these is true (ie: we want to see trainers and there is a trainer flag) we display the recipe
-		------------------------------------------------------------------------------------------------
-		if not SoftFilterFlags then
-			local F_TRAINER, F_VENDOR, F_INSTANCE, F_RAID, F_SEASONAL, F_QUEST, F_PVP, F_WORLD_DROP, F_MOB_DROP, F_DISC = 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
-
-			SoftFilterFlags = {
-				["trainer"]	= { flag = F_TRAINER,		sv_root = obtain_filters },
-				["vendor"]	= { flag = F_VENDOR,		sv_root = obtain_filters },
-				["instance"]	= { flag = F_INSTANCE,		sv_root = obtain_filters },
-				["raid"]	= { flag = F_RAID,		sv_root = obtain_filters },
-				["seasonal"]	= { flag = F_SEASONAL,		sv_root = obtain_filters },
-				["quest"]	= { flag = F_QUEST,		sv_root = obtain_filters },
-				["pvp"]		= { flag = F_PVP,		sv_root = obtain_filters },
-				["worlddrop"]	= { flag = F_WORLD_DROP,	sv_root = obtain_filters },
-				["mobdrop"]	= { flag = F_MOB_DROP,		sv_root = obtain_filters },
-				["discovery"]	= { flag = F_DISC,		sv_root = obtain_filters },
-			}
-		end
-
-		for filter, data in pairs(SoftFilterFlags) do
-			if recipe_flags[data.flag] and data.sv_root[filter] then
-				return true
-			end
-		end
-
-		-- If we get here it means that no flags matched our values
-		return false
-	end
-
-	---Scans the recipe listing and updates the filters according to user preferences
-	function addon:UpdateFilters()
-		local general_filters = addon.db.profile.filters.general
-		local recipes_total = 0
-		local recipes_known = 0
-		local recipes_total_filtered = 0
-		local recipes_known_filtered = 0
-		local can_display = false
-		local current_profession = Player["Profession"]
-
-		for recipe_id, recipe in pairs(RecipeList) do
-			if recipe["Profession"] == current_profession then
-				local is_known = recipe["Known"]
-
-				can_display = CanDisplayRecipe(recipe)
-				recipes_total = recipes_total + 1
-				recipes_known = recipes_known + (is_known and 1 or 0)
-
-				if can_display then
-					recipes_total_filtered = recipes_total_filtered + 1
-					recipes_known_filtered = recipes_known_filtered + (is_known and 1 or 0)
-
-					if not general_filters.known and is_known then
-						can_display = false
-					end
-
-					if not general_filters.unknown and not is_known then
-						can_display = false
-					end
-				end
-			else
-				can_display = false
-			end
-			RecipeList[recipe_id]["Display"] = can_display
-		end
-		Player.recipes_total = recipes_total
-		Player.recipes_known = recipes_known
-		Player.recipes_total_filtered = recipes_total_filtered
-		Player.recipes_known_filtered = recipes_known_filtered
-		end
-
-end	-- do
-
--------------------------------------------------------------------------------
--- ARL Logic Functions
--------------------------------------------------------------------------------
-
----Determines which profession we are dealing with and loads up the recipe information for it.
-local function InitializeRecipe(profession)
-	if not profession then
-		--@alpha@
-		addon:Print("nil profession passed to InitializeRecipe()")
-		--@end-alpha@
-		return
-	end
-	local func = PROFESSION_INITS[profession]
-
-	if func then
-		return func(addon, RecipeList)
-	else
-		addon:Print(L["UnknownTradeSkill"]:format(profession))
-		return 0
-	end
-end
-
----Determines what to do when the slash command is called.
-function addon:ChatCommand(input)
-
-	-- Open About panel if there's no parameters or if we do /arl about
-	if not input or (input and input:trim() == "") or input == strlower(L["Sorting"]) or input == strlower(L["Sort"])  or input == strlower(_G.DISPLAY) then
-		InterfaceOptionsFrame_OpenToCategory(self.optionsFrame)
-	elseif (input == strlower(L["About"])) then
-		if (self.optionsFrame["About"]) then
-			InterfaceOptionsFrame_OpenToCategory(self.optionsFrame["About"])
-		else
-			InterfaceOptionsFrame_OpenToCategory(self.optionsFrame)
-		end
-	elseif (input == strlower(L["Profile"])) then
-		InterfaceOptionsFrame_OpenToCategory(self.optionsFrame["Profiles"])
-	elseif (input == strlower(_G.FILTER)) then
-		InterfaceOptionsFrame_OpenToCategory(self.optionsFrame["Filters"])
-	elseif (input == strlower(L["Documentation"])) then
-		InterfaceOptionsFrame_OpenToCategory(self.optionsFrame["Documentation"])
-	elseif (input == strlower(L["Scan"])) then
-		self:Scan(false)
-	elseif (input == strlower("scandata")) then
-		self:ScanSkillLevelData()
-	elseif (input == strlower("scanprof")) then
-		self:ScanProfession("all")
-	else
-		-- What happens when we get here?
-		LibStub("AceConfigCmd-3.0"):HandleCommand("arl", "Ackis Recipe List", input)
-	end
-
-end
-
--------------------------------------------------------------------------------
--- Recipe Scanning Functions
--------------------------------------------------------------------------------
-do
-	-- List of tradeskill headers, used in addon:Scan()
-	local header_list = {}
-
-	--- Causes a scan of the tradeskill to be conducted. Function called when the scan button is clicked.   Parses recipes and displays output
-	-- @name AckisRecipeList:Scan
-	-- @usage AckisRecipeList:Scan(true)
-	-- @param textdump Boolean indicating if we want the output to be a text dump, or if we want to use the ARL GUI.
-	-- @return A frame with either the text dump, or the ARL frame.
-	function addon:Scan(textdump)
-		local scan_parent = self.scan_button:GetParent()
-
-		-- The scan button is re-parented to whichever interface it's anchored to, whether it's TradeSkillFrame or a replacement AddOn,
-		-- so we make sure its parent exists and is visible before proceeding.
-		if not scan_parent or scan_parent == UIParent or not scan_parent:IsVisible() then
-			self:Print(L["OpenTradeSkillWindow"])
-			return
-		end
-		local current_prof, prof_level = GetTradeSkillLine()
-
-		-- Set the current profession and its level, and update the cached data.
-		Player["Profession"] = current_prof
-		Player["ProfessionLevel"] = prof_level
-
-		-- Make sure we're only updating a profession the character actually knows - this could be a scan from a tradeskill link.
-		if not IsTradeSkillLinked() and Player["Professions"][current_prof] then
-			Player["Professions"][current_prof] = prof_level
-		end
-
-		-- Get the current profession Specialty
-		local specialty = SpecialtyTable[Player["Profession"]]
-
-		for index = 1, 25, 1 do
-			local spellName = GetSpellName(index, BOOKTYPE_SPELL)
-
-			if not spellName or index == 25 then
-				Player["Specialty"] = nil
-				break
-			elseif specialty and specialty[spellName] then
-				Player["Specialty"] = specialty[spellName]
-				break
-			end
-		end
-
-		-- Add the recipes to the database
-		-- TODO: Figure out what this variable was supposed to be for - it isn't used anywhere. -Torhal
-		Player.totalRecipes = InitializeRecipe(Player["Profession"])
-
-		--- Set the known flag to false for every recipe in the database.
-		for SpellID in pairs(RecipeList) do
-			RecipeList[SpellID]["Known"] = false
-		end
-
-		-------------------------------------------------------------------------------
-		-- Scan all recipes and mark the ones we know
-		-------------------------------------------------------------------------------
-		twipe(header_list)
-
-		if MRTUIUtils_PushFilterSelection then
-			MRTUIUtils_PushFilterSelection()
-		else
-			if not Skillet and TradeSkillFrameAvailableFilterCheckButton:GetChecked() then
-				TradeSkillFrameAvailableFilterCheckButton:SetChecked(false)
-				TradeSkillOnlyShowMakeable(false)
-			end
-
-			-- Clear the inventory slot filter
-			UIDropDownMenu_Initialize(TradeSkillInvSlotDropDown, TradeSkillInvSlotDropDown_Initialize)
-			UIDropDownMenu_SetSelectedID(TradeSkillInvSlotDropDown, 1)
-			SetTradeSkillInvSlotFilter(0, 1, 1)
-
-			-- Clear the sub-classes filters
-			UIDropDownMenu_Initialize(TradeSkillSubClassDropDown, TradeSkillSubClassDropDown_Initialize)
-			UIDropDownMenu_SetSelectedID(TradeSkillSubClassDropDown, 1)
-			SetTradeSkillSubClassFilter(0, 1, 1)
-
-			-- Expand all headers so we can see all the recipes there are
-			for i = GetNumTradeSkills(), 1, -1 do
-				local name, tradeType, _, isExpanded = GetTradeSkillInfo(i)
-
-				if tradeType == "header" and not isExpanded then
-					header_list[name] = true
-					ExpandTradeSkillSubClass(i)
-				end
-			end
-		end
-		local recipes_found = 0
-
-		for i = 1, GetNumTradeSkills() do
-			local tradeName, tradeType = GetTradeSkillInfo(i)
-
-			if tradeType ~= "header" then
-				-- Get the trade skill link for the specified recipe
-				local SpellLink = GetTradeSkillRecipeLink(i)
-				local SpellString = strmatch(SpellLink, "^|c%x%x%x%x%x%x%x%x|H%w+:(%d+)")
-				local recipe = RecipeList[tonumber(SpellString)]
-
-				if recipe then
-					recipe["Known"] = true
-					recipes_found = recipes_found + 1
-				else
-					self:Print(self:Red(tradeName .. " " .. SpellString) .. self:White(L["MissingFromDB"]))
-				end
-			end
-		end
-
-		-- Close all the headers we've opened
-		-- If Mr Trader is installed use that API
-		if MRTUIUtils_PopFilterSelection then
-			MRTUIUtils_PopFilterSelection()
-		else
-			-- Collapse all headers that were collapsed before
-			for i = GetNumTradeSkills(), 1, -1 do
-				local name, tradeType, _, isExpanded = GetTradeSkillInfo(i)
-
-				if header_list[name] then
-					CollapseTradeSkillSubClass(i)
-				end
-			end
-		end
-		-- TODO: Figure out what this variable was supposed to be for - it isn't used anywhere. -Torhal
-		Player.foundRecipes = recipes_found
-
-		self:UpdateFilters()
-		Player:MarkExclusions()
-
-		if textdump then
-			self:DisplayTextDump(RecipeList, Player["Profession"])
-		else
-			self:DisplayFrame()
-		end
-	end
-end
-
--------------------------------------------------------------------------------
--- Recipe Exclusion Functions
--------------------------------------------------------------------------------
----Removes or adds a recipe to the exclusion list.
-function addon:ToggleExcludeRecipe(SpellID)
-	local exclusion_list = addon.db.profile.exclusionlist
-
-	exclusion_list[SpellID] = (not exclusion_list[SpellID] and true or nil)
-end
-
----Prints all the ID's in the exclusion list out into chat.
-function addon:ViewExclusionList()
-	local exclusion_list = addon.db.profile.exclusionlist
-
-	-- Parse all items in the exclusion list
-	for i in pairs(exclusion_list) do
-		self:Print(i .. ": " .. GetSpellInfo(i))
-	end
-end
-
-function addon:ClearExclusionList()
-	local exclusion_list = addon.db.profile.exclusionlist
-
-	exclusion_list = twipe(exclusion_list)
-end
-
--------------------------------------------------------------------------------
--- Text dumping functions
--------------------------------------------------------------------------------
-do
-	-------------------------------------------------------------------------------
-	-- Provides a string of comma separated values for all recipe information
-	-------------------------------------------------------------------------------
-	local text_table = {}
-	local acquire_list = {}
-
-	local ACQUIRE_NAMES = {
-		[A_TRAINER]	= "Trainer",
-		[A_VENDOR]	= "Vendor",
-		[A_MOB]		= "Mob Drop",
-		[A_QUEST]	= "Quest",
-		[A_SEASONAL]	= "Seasonal",
-		[A_REPUTATION]	= "Reputation",
-		[A_WORLD_DROP]	= "World Drop",
-		[A_CUSTOM]	= "Custom",
-	}
-
-	function addon:GetTextDump(RecipeDB, profession)
-		twipe(text_table)
-
-		tinsert(text_table, strformat("Ackis Recipe List Text Dump for %s.  ", profession))
-		tinsert(text_table, "Text output of all recipes and acquire information.  Output is in the form of comma separated values.\n")
-		tinsert(text_table, "Spell ID,Recipe Name,Skill Level,ARL Filter Flags,Acquire Methods,Known\n")
-
-		for SpellID in pairs(RecipeDB) do
-			local recipe_prof = GetSpellInfo(RecipeDB[SpellID]["Profession"])
-
-			if recipe_prof == profession then
-				-- Add Spell ID, Name and Skill Level to the list
-				tinsert(text_table, SpellID)
-				tinsert(text_table, ",")
-				tinsert(text_table, RecipeDB[SpellID]["Name"])
-				tinsert(text_table, ",")
-				tinsert(text_table, RecipeDB[SpellID]["Level"])
-				tinsert(text_table, ",\"")
-
-				-- Add in all the filter flags
-				local recipe_flags = RecipeDB[SpellID]["Flags"]
-				local prev
-
-				-- Find out which flags are marked as "true"
-				for i = 1, NUM_FILTER_FLAGS, 1 do
-					if recipe_flags[i] then
-						if prev then
-							tinsert(text_table, ",")
-						end
-						tinsert(text_table, i)
-						prev = true
-					end
-				end
-				tinsert(text_table, "\",\"")
-
-				-- Find out which unique acquire methods we have
-				local acquire = RecipeDB[SpellID]["Acquire"]
-				twipe(acquire_list)
-
-				for i in pairs(acquire) do
-					local acquire_type = acquire[i]["Type"]
-
-					acquire_list[ACQUIRE_NAMES[acquire_type]] = true
-				end
-
-				-- Add all the acquire methods in
-				prev = false
-
-				for i in pairs(acquire_list) do
-					if prev then
-						tinsert(text_table, ",")
-					end
-					tinsert(text_table, i)
-					prev = true
-				end
-
-				if (RecipeDB[SpellID]["Known"]) then
-					tinsert(text_table, "\",true\n")
-				else
-					tinsert(text_table, "\",false\n")
-				end
-			end
-		end
-		return tconcat(text_table, "")
-	end
-
-end
-
----Clears all saved tradeskills
-function addon:ClearSavedSkills()
-	twipe(addon.db.global.tradeskill)
-
-	if addon.db.profile.tradeskill then
-		addon.db.profile.tradeskill = nil
-	end
-
-end
-
--------------------------------------------------------------------------------
--- API to interface with external AddOns.
--------------------------------------------------------------------------------
---- Initialize the recipe database with a specific profession
--- @name AckisRecipeList:AddRecipeData
--- @usage AckisRecipeList:AddRecipeData(GetSpellInfo(51304))
--- @param profession Spell ID of the profession which you want to populate the database with.
--- @return Boolean indicating if the operation was successful.  The recipe database will be populated with appropriate data.
-function addon:AddRecipeData(profession)
-	return InitializeRecipe(profession)
-end
-
---- Initialize the recipe database
--- @name AckisRecipeList:InitRecipeData
--- @usage AckisRecipeList:InitRecipeData()
--- @return Boolean indicating if the operation was successful.  The recipe database will be populated with appropriate data.
--- @return Arrays containing the RecipeList, MobList, TrainerList, VendorList, QuestList, ReputationList, SeasonalList.
-function addon:InitRecipeData()
-	return false, RecipeList, MobList, TrainerList, VendorList, QuestList, ReputationList, SeasonalList
-end
-
---- Get recipe information from ARL
--- @name AckisRecipeList:GetRecipeData
--- @param spellID The spell ID of the recipe you want information about.
--- @return Table containing all spell ID information or nil if it's not found.
-function addon:GetRecipeData(spellID)
-	return RecipeList[spellID]
-end
diff --git a/AckisRecipeList.toc b/AckisRecipeList.toc
index 00bd31d..c875234 100644
--- a/AckisRecipeList.toc
+++ b/AckisRecipeList.toc
@@ -62,11 +62,11 @@ embeds.xml
 # Localization files
 local.xml

-AckisRecipeList.lua
-ARLConfig.lua
-ARLColour.lua
+ARL.lua
+Config.lua
+Colour.lua
 Frame.lua
-ARLDatamine.lua
+Datamine.lua
 Player.lua

 # Recipe database files
diff --git a/Colour.lua b/Colour.lua
new file mode 100644
index 0000000..0b9c7d0
--- /dev/null
+++ b/Colour.lua
@@ -0,0 +1,320 @@
+--[[
+
+****************************************************************************************
+
+ARLColour.lua
+
+Colouring functions for ARL
+
+File date: @file-date-iso@
+File revision: @file-revision@
+Project revision: @project-revision@
+Project version: @project-version@
+
+Code adopted from Crayon library
+
+****************************************************************************************
+
+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.
+
+************************************************************************
+
+]]--
+
+
+local MODNAME			= "Ackis Recipe List"
+local addon				= LibStub("AceAddon-3.0"):GetAddon(MODNAME)
+
+--[[
+
+	Colour constants
+
+]]--
+
+local RED		= "ff0000"
+local ORANGE	= "ff7f00"
+local YELLOW	= "ffff00"
+local GREEN		= "00ff00"
+local WHITE		= "ffffff"
+local COPPER	= "eda55f"
+local SILVER	= "c7c7cf"
+local GOLD		= "ffd700"
+local PURPLE	= "9980CC"
+local BLUE		= "0000ff"
+local CYAN		= "00ffff"
+local BLACK		= "000000"
+local GREY		= "666666"
+local MIDGREY	= "858585"
+local NEUTRAL	= "bfbfbf"
+local FRIENDLY	= WHITE
+local HONORED	= "00ff00"
+local REVERED	= "3f66e5"
+local EXALTED	= "9933cc"
+
+local TRAINER	= "d9cb9e"
+local VENDOR	= "aad372"
+local QUEST		= "2359ff"
+local REP		= "ff7c0a"
+local SEASON	= "80590e"
+local MOBDROP	= "ffffc0"
+
+local POOR		= "919191"
+local COMMON	= WHITE
+local UNCOMMON	= "00A900"
+local RARE		= "0062C3"
+local EPIC		= "B343FF"
+local LEGENDARY	= "FA9900"
+local ARTIFACT	= "e5cc80"
+
+local HIGH		= WHITE
+local NORMAL	= "ffd100"
+
+local HORDE		= RED
+local ALLIANCE	= "00ffff"
+
+--[[
+
+	Text colourization functions
+
+]]--
+
+function addon:RGBtoHEX(r,g,b)
+	return string.format("%2x%2x%2x", r*255, g*255, b*255)
+end
+
+
+-- Changes any string of text to the specified hex colour
+function addon:Colourize(hexColour, text)
+
+	return "|cff" .. tostring(hexColour or 'ffffff') .. tostring(text) .. "|r"
+
+end
+
+-- Converts text to Neutral Colour
+function addon:Neutral(text)
+	return self:Colourize(NEUTRAL, text)
+end
+
+-- Converts text to Friendly Colour
+function addon:Friendly(text)
+	return self:Colourize(FRIENDLY, text)
+end
+
+-- Converts text to Honored Colour
+function addon:Honored(text)
+	return self:Colourize(HONORED, text)
+end
+
+-- Converts text to Revered Colour
+function addon:Revered(text)
+	return self:Colourize(REVERED, text)
+end
+
+-- Converts text to Exalted Colour
+function addon:Exalted(text)
+	return self:Colourize(EXALTED, text)
+end
+
+function addon:Horde(text)
+	return self:Colourize(RED, text)
+end
+
+function addon:Alliance(text)
+	return self:Colourize(CYAN, text)
+end
+
+function addon:Coords(text)
+	return self:Colourize(WHITE, text)
+end
+
+function addon:Trainer(text)
+	return self:Colourize(TRAINER, text)
+end
+
+function addon:Vendor(text)
+	return self:Colourize(VENDOR, text)
+end
+
+function addon:Quest(text)
+	return self:Colourize(QUEST, text)
+end
+
+function addon:Rep(text)
+	return self:Colourize(REP, text)
+end
+
+function addon:Season(text)
+	return self:Colourize(SEASON, text)
+end
+
+function addon:MobDrop(text)
+	return self:Colourize(MOBDROP, text)
+end
+
+-- Rarity Colors
+function addon:Poor(text)
+	return self:Colourize(POOR, text)
+end
+
+function addon:Common(text)
+	return self:Colourize(COMMON, text)
+end
+
+function addon:Uncommon(text)
+	return self:Colourize(UNCOMMON, text)
+end
+
+function addon:Rare(text)
+	return self:Colourize(RARE, text)
+end
+
+function addon:Epic(text)
+	return self:Colourize(EPIC, text)
+end
+
+function addon:Legendary(text)
+	return self:Colourize(LEGENDARY, text)
+end
+
+function addon:Artifact(text)
+	return self:Colourize(ARTIFACT, text)
+end
+
+function addon:RarityColor(rarityColor, text)
+	if (rarityColor == 1) then
+		return self:Colourize(POOR, text)
+	elseif (rarityColor == 2) then
+		return self:Colourize(COMMON, text)
+	elseif (rarityColor == 3) then
+		return self:Colourize(UNCOMMON, text)
+	elseif (rarityColor == 4) then
+		return self:Colourize(RARE, text)
+	elseif (rarityColor == 5) then
+		return self:Colourize(EPIC, text)
+	elseif (rarityColor == 6) then
+		return self:Colourize(LEGENDARY, text)
+	else
+		return self:Colourize(ARTIFACT, text)
+	end
+end
+
+-- Converts text to Red
+function addon:Red(text)
+	return self:Colourize(RED, text)
+end
+
+-- Converts text to Orange
+function addon:Orange(text)
+	return self:Colourize(ORANGE, text)
+end
+
+-- Converts text to Yellow
+function addon:Yellow(text)
+	return self:Colourize(YELLOW, text)
+end
+
+-- Converts text to Green
+function addon:Green(text)
+	return self:Colourize(GREEN, text)
+end
+
+-- Converts text to White
+function addon:White(text)
+	return self:Colourize(WHITE, text)
+end
+
+-- Converts text to Copper
+function addon:Copper(text)
+	return self:Colourize(COPPER, text)
+end
+
+-- Converts text to Silver
+function addon:Silver(text)
+	return self:Colourize(SILVER, text)
+end
+
+-- Converts text to Gold
+function addon:Gold(text)
+	return self:Colourize(GOLD, text)
+end
+
+-- Converts text to Purple
+function addon:Purple(text)
+	return self:Colourize(PURPLE, text)
+end
+
+-- Converts text to Blue
+function addon:Blue(text)
+	return self:Colourize(BLUE, text)
+end
+
+-- Converts text to Cyan
+function addon:Cyan(text)
+	return self:Colourize(CYAN, text)
+end
+
+-- Converts text to Black
+function addon:Black(text)
+	return self:Colourize(BLACK, text)
+end
+
+-- Converts text to Grey
+function addon:Grey(text)
+	return self:Colourize(GREY, text)
+end
+
+-- Converts text to Middle Grey
+function addon:MidGrey(text)
+	return self:Colourize(MIDGREY, text)
+end
+
+-- Standard bliz yellowish sort of thing
+function addon:Normal(text)
+	return self:Colourize(NORMAL, text)
+end
+
+-- used for tooltip rgb stuff
+function addon:hexcolor(colorstring)
+	if (colorstring == "NEUTRAL")			then return NEUTRAL
+	elseif (colorstring == "FRIENDLY")		then return FRIENDLY
+	elseif (colorstring == "HONORED")		then return HONORED
+	elseif (colorstring == "REVERED")		then return REVERED
+	elseif (colorstring == "EXALTED")		then return EXALTED
+
+	elseif (colorstring == "TRAINER")		then return TRAINER
+	elseif (colorstring == "VENDOR")		then return VENDOR
+	elseif (colorstring == "QUEST")			then return QUEST
+	elseif (colorstring == "REP")			then return REP
+	elseif (colorstring == "SEASON")		then return SEASON
+	elseif (colorstring == "MOBDROP")		then return MOBDROP
+
+	elseif (colorstring == "POOR")			then return POOR
+	elseif (colorstring == "COMMON")		then return COMMON
+	elseif (colorstring == "UNCOMMON")		then return UNCOMMON
+	elseif (colorstring == "RARE")			then return RARE
+	elseif (colorstring == "EPIC")			then return EPIC
+	elseif (colorstring == "LEGENDARY")		then return LEGENDARY
+	elseif (colorstring == "ARTIFACT")		then return ARTIFACT
+
+	elseif (colorstring == "HORDE")			then return HORDE
+	elseif (colorstring == "ALLIANCE")		then return ALLIANCE
+
+	elseif (colorstring == "BLACK")			then return BLACK
+	elseif (colorstring == "ORANGE")		then return ORANGE
+	elseif (colorstring == "GREEN")			then return GREEN
+	elseif (colorstring == "YELLOW")		then return YELLOW
+	elseif (colorstring == "GREY")			then return GREY
+	elseif (colorstring == "MIDGREY")		then return MIDGREY
+	elseif (colorstring == "RED")			then return RED
+
+	elseif (colorstring == "HIGH")			then return HIGH
+--	elseif (colorstring == "NORMAL")		then return NORMAL
+	else
+		return NORMAL
+	end
+end
\ No newline at end of file
diff --git a/Config.lua b/Config.lua
new file mode 100644
index 0000000..54e9c85
--- /dev/null
+++ b/Config.lua
@@ -0,0 +1,701 @@
+--[[
+
+****************************************************************************************
+
+ARLConfig.lua
+
+Ace3 Configuration options for ARL
+
+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.
+
+************************************************************************
+
+]]--
+
+local MODNAME		= "Ackis Recipe List"
+local addon		= LibStub("AceAddon-3.0"):GetAddon(MODNAME)
+
+local BFAC		= LibStub("LibBabble-Faction-3.0"):GetLookupTable()
+local LC		= LOCALIZED_CLASS_NAMES_MALE
+local L			= LibStub("AceLocale-3.0"):GetLocale(MODNAME)
+
+local AceConfig 	= LibStub("AceConfig-3.0")
+local AceConfigReg 	= LibStub("AceConfigRegistry-3.0")
+local AceConfigDialog 	= LibStub("AceConfigDialog-3.0")
+
+local modularOptions = {}
+
+local function giveProfiles()
+	return LibStub("AceDBOptions-3.0"):GetOptionsTable(addon.db)
+end
+
+local function ResetGUI()
+	addon.db.profile.frameopts.offsetx = 0
+	addon.db.profile.frameopts.offsety = 0
+	addon.db.profile.frameopts.anchorTo = ""
+	addon.db.profile.frameopts.anchorFrom = ""
+	addon.db.profile.frameopts.uiscale = 1
+	addon.db.profile.frameopts.tooltipscale = .9
+	addon.db.profile.frameopts.fontsize = 11
+end
+
+local options
+
+local function fullOptions()
+	if not options then
+		options = {
+			type = "group",
+			name = MODNAME,
+			args = {
+				general = {
+					order	= 1,
+					type	= "group",
+					name	= L["Main Options"],
+					desc	= L["MAIN_OPTIONS_DESC"],
+					args	= {
+						header1 = {
+							order	= 10,
+							type	= "header",
+							name	= L["General Options"],
+						},
+						version = {
+							order	= 11,
+							type	= "description",
+							name	= _G.GAME_VERSION_LABEL .. ": " .. addon.version .. "\n",
+						},
+						run = {
+							order	= 12,
+							type	= "execute",
+							name	= L["Scan"],
+							desc	= L["SCAN_RECIPES_DESC"],
+							func	= function(info) addon:Scan(false) end,
+						},
+						textdump = {
+							order	= 13,
+							type	= "execute",
+							name	= L["Text Dump"],
+							desc	= L["TEXT_DUMP_DESC"],
+							func	= function(info) addon:Scan(true) end,
+						},
+						exclusionlist = {
+							order	= 14,
+							type	= "execute",
+							name	= L["View Exclusion List"],
+							desc	= L["VIEW_EXCLUSION_LIST_DESC"],
+							func	= function(info) addon:ViewExclusionList() end,
+						},
+						clearexclusionlist = {
+							order	= 15,
+							type	= "execute",
+							name	= L["Clear Exclusion List"],
+							desc	= L["CLEAR_EXCLUSION_LIST_DESC"],
+							func	= function(info) addon:ClearExclusionList() end,
+						},
+						resetallfilters = {
+							order	= 16,
+							type	= "execute",
+							name	= L["Reset All Filters"],
+							desc	= L["RESET_DESC"],
+							func	= function(info) addon.resetFilters() end,
+						},
+						resetguiwindow = {
+							order	= 17,
+							type	= "execute",
+							name	= L["Reset Window Position"],
+							desc	= L["RESET_WINDOW_DESC"],
+							func	= function(info) ResetGUI() end,
+						},
+						spacer1 = {
+							order	= 19,
+							type	= "description",
+							name	= "\n",
+						},
+						header1a = {
+							order	= 20,
+							type	= "header",
+							name	= L["Main Filter Options"],
+						},
+						mainfilter_desc = {
+							order	= 21,
+							type	= "description",
+							name	= L["MAINFILTER_OPTIONS_DESC"] .. "\n",
+						},
+						includefiltered = {
+							order	= 22,
+							type	= "toggle",
+							name	= L["Include Filtered"],
+							desc	= L["FILTERCOUNT_DESC"],
+							get		= function() return addon.db.profile.includefiltered end,
+							set		= function() addon.db.profile.includefiltered = not addon.db.profile.includefiltered end,
+						},
+						includeexcluded = {
+							order	= 23,
+							type	= "toggle",
+							name	= L["Include Excluded"],
+							desc	= L["EXCLUDECOUNT_DESC"],
+							get		= function() return addon.db.profile.includeexcluded end,
+							set		= function() addon.db.profile.includeexcluded = not addon.db.profile.includeexcluded end,
+						},
+						ignoreexclusionlist = {
+							order	= 24,
+							type	= "toggle",
+							name	= L["Display Exclusions"],
+							desc	= L["DISPLAY_EXCLUSION_DESC"],
+							get		= function() return addon.db.profile.ignoreexclusionlist end,
+							set		= function() addon.db.profile.ignoreexclusionlist = not addon.db.profile.ignoreexclusionlist end,
+						},
+						spacer2 = {
+							order	= 39,
+							type	= "description",
+							name	= "\n",
+						},
+						header3 = {
+							order	= 40,
+							type	= "header",
+							name	= L["Sorting Options"],
+						},
+						sort_desc =	{
+							order	= 41,
+							type	= "description",
+							name	= L["SORTING_OPTIONS_DESC"] .. "\n",
+						},
+						sorting = {
+							order	= 45,
+							type	= "select",
+							name	= L["Sorting"],
+							desc	= L["SORTING_DESC"],
+							get	= function()
+									  return addon.db.profile.sorting
+								  end,
+							set	= function(info, name)
+									  addon.db.profile.sorting = name
+								  end,
+							values	= function()
+									  return {
+										  Name = _G.NAME,
+										  SkillAsc = L["Skill (Asc)"],
+										  SkillDesc = L["Skill (Desc)"],
+										  Acquisition = L["Acquisition"],
+										  Location = L["Location"]
+									  }
+								  end,
+						},
+					},
+				},
+			},
+		}
+
+		for k,v in pairs(modularOptions) do
+			options.args[k] = (type(v) == "function") and v() or v
+		end
+
+	end
+
+	return options
+
+end
+
+local arlmap = nil
+
+local function giveMap()
+
+	local tomtomsupport = true
+
+	if ((TomTom) or ((TomTom) and (Carbonite))) then
+		tomtomsupport = false
+	end
+
+	if (not arlmap) then
+
+	arlmap = {
+			order	= 1,
+			type	= "group",
+			name	= L["Map Options"],
+			desc	= L["MAP_OPTIONS_DESC"],
+			args	= {
+				map_desc =	{
+					order	= 1,
+					type	= "description",
+					name	= L["MAP_OPTIONS_DESC"] .. "\n",
+				},
+				autoscanmap = {
+					order	= 2,
+					type	= "toggle",
+					name	= L["Auto Scan Map"],
+					desc	= L["AUTOSCANMAP_DESC"],
+					disabled = tomtomsupport,
+					get		= function() return addon.db.profile.autoscanmap end,
+					set		= function() addon.db.profile.autoscanmap = not addon.db.profile.autoscanmap end,
+				},
+				worldmap = {
+					order	= 3,
+					type	= "toggle",
+					name	= _G.WORLD_MAP,
+					desc	= L["WORLDMAP_DESC"],
+					disabled = tomtomsupport,
+					get		= function() return addon.db.profile.worldmap end,
+					set		= function() addon.db.profile.worldmap = not addon.db.profile.worldmap end,
+				},
+				minimap = {
+					order	= 4,
+					type	= "toggle",
+					name	= L["Mini Map"],
+					desc	= L["MINIMAP_DESC"],
+					disabled = tomtomsupport,
+					get		= function() return addon.db.profile.minimap end,
+					set		= function() addon.db.profile.minimap = not addon.db.profile.minimap end,
+				},
+				maptrainer = {
+					order	= 5,
+					type	= "toggle",
+					name	= L["Trainer"],
+					desc	= L["MAP_TRAINER_DESC"],
+					disabled = tomtomsupport,
+					get		= function() return addon.db.profile.maptrainer end,
+					set		= function() addon.db.profile.maptrainer = not addon.db.profile.maptrainer end,
+				},
+				mapvendor = {
+					order	= 6,
+					type	= "toggle",
+					name	= L["Vendor"],
+					desc	= L["MAP_VENDOR_DESC"],
+					disabled = tomtomsupport,
+					get		= function() return addon.db.profile.mapvendor end,
+					set		= function() addon.db.profile.mapvendor = not addon.db.profile.mapvendor end,
+				},
+				mapmob = {
+					order	= 7,
+					type	= "toggle",
+					name	= L["Monster"],
+					desc	= L["MAP_MONSTER_DESC"],
+					disabled = tomtomsupport,
+					get		= function() return addon.db.profile.mapmob end,
+					set		= function() addon.db.profile.mapmob = not addon.db.profile.mapmob end,
+				},
+				mapquest = {
+					order	= 8,
+					type	= "toggle",
+					name	= L["Quest"],
+					desc	= L["MAP_QUEST_DESC"],
+					disabled = tomtomsupport,
+					get		= function() return addon.db.profile.mapquest end,
+					set		= function() addon.db.profile.mapquest = not addon.db.profile.mapquest end,
+				},
+				clearmap = {
+					order	= 20,
+					type	= "execute",
+					name	= L["Clear Waypoints"],
+					disabled = tomtomsupport,
+					desc	= L["CLEAR_WAYPOINTS_DESC"],
+					func	= function() addon:ClearMap() end,
+				},
+			},
+		}
+
+	end
+
+	return arlmap
+
+end
+
+local datamine = nil
+
+local function giveDatamine()
+
+	if (not datamine) then
+
+	datamine = {
+			order	= 1,
+			type	= "group",
+			name	= L["Datamine Options"],
+			desc	= L["DATAMINE_OPTIONS_DESC"],
+			args = {
+				datamine_desc =	{
+					order	= 1,
+					type	= "description",
+					name	= L["DATAMINE_OPTIONS_DESC"] .. "\n",
+				},
+				datamine_warn =	{
+					order	= 2,
+					type	= "description",
+					name	= L["DATAMINE_WARNING_DESC"] .. "\n",
+				},
+				generatelinks = {
+					order	= 73,
+					type	= "execute",
+					name	= L["Generate Tradeskill Links"],
+					desc	= L["GENERATE_LINKS_DESC"],
+					func	= function() addon:GenerateLinks() end,
+				},
+				scantrainerskills = {
+					order	= 75,
+					type	= "execute",
+					name	= L["Compare Trainer Skills"],
+					desc	= L["COMPARE_TRAINER_SKILL_DESC"],
+					func	= function() addon:ScanSkillLevelData() end,
+				},
+				scantraineracquire = {
+					order	= 76,
+					type	= "execute",
+					name	= L["Compare Trainer Acquire"],
+					desc	= L["COMPARE_TRAINER_ACQUIRE_DESC"],
+					func	= function() addon:ScanTrainerData() end,
+				},
+				scanentiredatabase = {
+					order	= 77,
+					type	= "execute",
+					name	= L["Scan Entire Database"],
+					desc	= L["SCAN_ENTIRE_DB_DESC"],
+					func	= function() addon:TooltipScanDatabase() end,
+				},
+				scanvendor = {
+					order	= 78,
+					type	= "execute",
+					name	= L["Scan Vendor"],
+					desc	= L["SCAN_VENDOR_DESC"],
+					func	= function() addon:ScanVendor() end,
+				},
+				scanprofessiontooltip = {
+					type = "input",
+					name = L["Scan Professions"],
+					desc = L["SCAN_PROF_DB_DESC"],
+					get = false,
+					set = function(info, v) addon:ScanProfession(v) end,
+					order = 79,
+				},
+				scanspellid = {
+					type = "input",
+					name = L["Scan Spell ID"],
+					desc = L["SCAN_SPELL_ID_DESC"],
+					get = false,
+					set = function(info, v) addon:TooltipScanRecipe(tonumber(v),false,false) end,
+					order = 80,
+				},
+				scantrainers = {
+					order	= 90,
+					type	= "toggle",
+					name	= L["Auto Scan Trainers"],
+					desc	= L["AUTOSCAN_TRAINERS_DESC"],
+					get		= function() return addon.db.profile.scantrainers end,
+					set		= function()
+									if (addon.db.profile.scantrainers) then
+										addon:UnregisterEvent("TRAINER_SHOW")
+									else
+										addon:RegisterEvent("TRAINER_SHOW")
+									end
+									addon.db.profile.scantrainers = not addon.db.profile.scantrainers
+								end,
+				},
+				scanvendors = {
+					order	= 91,
+					type	= "toggle",
+					name	= L["Auto Scan Vendors"],
+					desc	= L["AUTOSCAN_VENDORS_DESC"],
+					get		= function() return addon.db.profile.scanvendors end,
+					set		= function()
+									if (addon.db.profile.scanvendors) then
+										addon:UnregisterEvent("MERCHANT_SHOW")
+									else
+										addon:RegisterEvent("MERCHANT_SHOW")
+									end
+									addon.db.profile.scanvendors = not addon.db.profile.scanvendors
+								end,
+				},
+				autoloaddb = {
+					order	= 100,
+					type	= "toggle",
+					name	= L["Auto Load Recipe Database"],
+					desc	= L["AUTOLOAD_DB_DESC"],
+					get		= function() return addon.db.profile.autoloaddb end,
+					set		= function() addon.db.profile.autoloaddb = not addon.db.profile.autoloaddb end,
+				},
+			},
+		}
+
+	end
+
+	return datamine
+
+end
+
+local documentation = nil
+
+local function giveDocs()
+
+	if (not documentation) then
+
+		documentation = {
+			order = 1,
+			type = "group",
+			name = L["ARL Documentation"],
+			desc = L["ARL_DOC_DESC"],
+			args = {
+				header1 = {
+					order	= 1,
+					type	= "header",
+					name	= L["ARL Documentation"],
+				},
+				desc1 = {
+					order	= 2,
+					type	= "description",
+					name	= L["ARL_DOC_DESC"],
+				},
+				header2 = {
+					order	= 3,
+					type	= "header",
+					name	= L["Using Filters"],
+				},
+				desc2 = {
+					order	= 4,
+					type	= "description",
+					name	= L["USING_FILTERS_DESC"],
+				},
+				header3 = {
+					order	= 5,
+					type	= "header",
+					name	= L["Common Issues"],
+				},
+				desc3 = {
+					order	= 6,
+					type	= "description",
+					name	= L["COMMON_ISSUES_DESC"],
+				},
+				header4 = {
+					order	= 7,
+					type	= "header",
+					name	= L["Reporting Bugs"],
+				},
+				desc4 = {
+					order	= 8,
+					type	= "description",
+					name	= L["REPORTING_BUGS_DESC"],
+				},
+				header5 = {
+					order	= 9,
+					type	= "header",
+					name	= L["Exclusion Issues"],
+				},
+				desc5 = {
+					order	= 10,
+					type	= "description",
+					name	= L["EXCLUSION_ISSUES_DESC"],
+				},
+				header6 = {
+					order	= 11,
+					type	= "header",
+					name	= L["Map Issues"],
+				},
+				desc6 = {
+					order	= 12,
+					type	= "description",
+					name	= L["MAP_ISSUES_DESC"],
+				},
+				header7 = {
+					order	= 13,
+					type	= "header",
+					name	= L["Game Commands"],
+				},
+				desc7 = {
+					order	= 14,
+					type	= "description",
+					name	= L["GAME_COMMANDS_DESC"],
+				},
+			},
+		}
+
+	end
+
+	return documentation
+
+end
+
+local displayoptions = nil
+
+local function giveDisplay()
+	if not displayoptions then
+		displayoptions = {
+			order = 1,
+			type = "group",
+			name = L["Display Options"],
+			desc = L["DISPLAY_OPTIONS_DESC"],
+			args = {
+				display_desc =	{
+					order	= 1,
+					type	= "description",
+					name	= L["MAP_OPTIONS_DESC"] .. "\n",
+				},
+				scanbuttonlocation = {
+					order	= 2,
+					type	= "select",
+					name	= L["Scan Button Position"],
+					desc	= L["SCANBUTTONPOSITION_DESC"],
+					get		= function() return addon.db.profile.scanbuttonlocation end,
+					set		= function(info,name) addon.db.profile.scanbuttonlocation = name end,
+					values	= function() return {TR = L["Top Right"], TL = L["Top Left"], BR = L["Bottom Right"], BL = L["Bottom Left"]} end,
+				},
+				uiscale = {
+					order	= 3,
+					type	= "range",
+					name	= _G.UI_SCALE,
+					desc	= L["UI_SCALE_DESC"],
+					min		= .5,
+					max		= 1.5,
+					step	= .05,
+					bigStep = .05,
+					get		= function() return addon.db.profile.frameopts.uiscale end,
+					set		= function(info, v)
+								  addon.db.profile.frameopts.uiscale = v
+								  addon.Frame:SetScale(v)
+							  end,
+				},
+				fontsize = {
+					order	= 4,
+					type	= "range",
+					name	= _G.FONT_SIZE,
+					desc	= L["FONT_SIZE_DESC"],
+					min		= 6,
+					max		= 20,
+					step	= 1,
+					bigStep = 1,
+					get		= function() return addon.db.profile.frameopts.fontsize end,
+					set		= function(info, v) addon.db.profile.frameopts.fontsize = v end,
+				},
+				closegui = {
+					order	= 5,
+					type	= "toggle",
+					name	= L["Close GUI"],
+					desc	= L["CLOSEGUI_DESC"],
+					get		= function() return addon.db.profile.closeguionskillclose end,
+					set		= function() addon.db.profile.closeguionskillclose = not addon.db.profile.closeguionskillclose end,
+				},
+				hidepopup = {
+					order	= 6,
+					type	= "toggle",
+					name	= L["Hide Pop-Up"],
+					desc	= L["HIDEPOPUP_DESC"],
+					get		= function() return addon.db.profile.hidepopup end,
+					set		= function() addon.db.profile.hidepopup = not addon.db.profile.hidepopup end,
+				},
+				spacer1 = {
+					order	= 10,
+					type	= "description",
+					name	= "\n",
+				},
+				tooltip_header = {
+					order	= 11,
+					type	= "header",
+					name	= L["Tooltip Options"],
+				},
+				tooltip_desc =	{
+					order	= 12,
+					type	= "description",
+					name	= L["TOOLTIP_OPTIONS_DESC"] .. "\n",
+				},
+				tooltipscale = {
+					order	= 20,
+					type	= "range",
+					name	= L["Tooltip Scale"],
+					desc	= L["TOOLTIP_SCALE_DESC"],
+					min		= .5,
+					max		= 1.5,
+					step	= .05,
+					bigStep = .05,
+					get		= function()
+								  return addon.db.profile.frameopts.tooltipscale
+							  end,
+					set		= function(info, v)
+								  addon.db.profile.frameopts.tooltipscale = v
+							  end,
+				},
+				acquiretooltiplocation = {
+					order	= 21,
+					type	= "select",
+					name	= L["Tooltip (Acquire) Position"],
+					desc	= L["ACQUIRETOOLTIPPOSITION_DESC"],
+					get	= function()
+							  return addon.db.profile.acquiretooltiplocation
+						  end,
+					set	= function(info, name)
+							  addon.db.profile.acquiretooltiplocation = name
+						  end,
+					values	= function()
+							  return {
+								  Right = L["Right"],
+								  Left = L["Left"],
+								  Top = L["Top"],
+								  Bottom = L["Bottom"],
+								  Off = _G.OFF,
+								  Mouse = _G.MOUSE_LABEL
+							  }
+						  end,
+				},
+				spelltooltiplocation = {
+					order	= 22,
+					type	= "select",
+					name	= L["Tooltip (Recipe) Position"],
+					desc	= L["SPELLTOOLTIPPOSITION_DESC"],
+					get	= function()
+							  return addon.db.profile.spelltooltiplocation
+						  end,
+					set	= function(info,name)
+							  addon.db.profile.spelltooltiplocation = name
+						  end,
+					values	= function()
+							  return {
+								  Right = L["Right"],
+								  Left = L["Left"],
+								  Top = L["Top"],
+								  Bottom = L["Bottom"],
+								  Off = _G.OFF
+							  }
+						  end,
+				},
+			},
+		}
+	end
+	return displayoptions
+end
+
+function addon:SetupOptions()
+	AceConfigReg:RegisterOptionsTable(MODNAME, fullOptions)
+	self.optionsFrame = AceConfigDialog:AddToBlizOptions(MODNAME, nil, nil, "general")
+
+	-- Add in the about panel to the Bliz options (but not the ace3 config)
+	if LibStub:GetLibrary("LibAboutPanel", true) then
+		self.optionsFrame["About"] = LibStub:GetLibrary("LibAboutPanel").new(MODNAME, MODNAME)
+	else
+		self:Print("Lib AboutPanel not loaded.")
+	end
+
+	-- Fill up our modular options...
+	self:RegisterModuleOptions("Datamining", giveDatamine(), L["Datamine Options"])
+	self:RegisterModuleOptions("Display", giveDisplay(), L["Display Options"])
+	self:RegisterModuleOptions("Documentation", giveDocs(), L["ARL Documentation"])
+	self:RegisterModuleOptions("Map", giveMap(), L["Map Options"])
+	self:RegisterModuleOptions("Profiles", giveProfiles(), L["Profile Options"])
+end
+
+-- Description: Function which extends our options table in a modular way
+-- Expected result: add a new modular options table to the modularOptions upvalue as well as the Blizzard config
+-- Input:
+--		name			: index of the options table in our main options table
+--		optionsTable	: the sub-table to insert
+--		displayName	: the name to display in the config interface for this set of options
+-- Output: None.
+
+function addon:RegisterModuleOptions(name, optionsTable, displayName)
+	modularOptions[name] = optionsTable
+	self.optionsFrame[name] = AceConfigDialog:AddToBlizOptions(MODNAME, displayName, MODNAME, name)
+end
diff --git a/Datamine.lua b/Datamine.lua
new file mode 100644
index 0000000..18c80d3
--- /dev/null
+++ b/Datamine.lua
@@ -0,0 +1,2346 @@
+--[[
+
+************************************************************************
+
+ARLDatamine.lua
+
+In-game datamining functions for ARL
+
+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.
+
+************************************************************************
+
+]]--
+
+
+-------------------------------------------------------------------------------
+-- AddOn namespace.
+-------------------------------------------------------------------------------
+local MODNAME			= "Ackis Recipe List"
+local addon			= LibStub("AceAddon-3.0"):GetAddon(MODNAME)
+
+local L				= LibStub("AceLocale-3.0"):GetLocale(MODNAME)
+
+
+-------------------------------------------------------------------------------
+-- Upvalues globals.
+-------------------------------------------------------------------------------
+local table, string = table, string
+
+local tconcat, tinsert, tsort, twipe = table.concat, table.insert, table.sort, table.wipe
+local strlower, strmatch = string.lower, string.match
+local gsub = string.gsub
+local tonumber, tostring = tonumber, tostring
+local ipairs, pairs = ipairs, pairs
+
+-------------------------------------------------------------------------------
+-- Upvalued Blizzard API.
+-------------------------------------------------------------------------------
+local UnitName = UnitName
+local UnitGUID = UnitGUID
+local UnitExists = UnitExists
+local UnitIsPlayer = UnitIsPlayer
+local UnitIsEnemy = UnitIsEnemy
+local GetNumTrainerServices = GetNumTrainerServices
+local GetTrainerServiceInfo = GetTrainerServiceInfo
+local IsTradeskillTrainer = IsTradeskillTrainer
+local SetTrainerServiceTypeFilter = SetTrainerServiceTypeFilter
+local GetTrainerServiceTypeFilter = GetTrainerServiceTypeFilter
+local GetTrainerServiceSkillReq = GetTrainerServiceSkillReq
+local GetMerchantNumItems = GetMerchantNumItems
+local GetMerchantItemLink = GetMerchantItemLink
+local GetMerchantItemInfo = GetMerchantItemInfo
+local GetSpellInfo = GetSpellInfo
+
+-------------------------------------------------------------------------------
+-- Tradeskill professions
+-------------------------------------------------------------------------------
+local PROFESSIONS = {
+	["Alchemy"]		= GetSpellInfo(51304),
+	["Blacksmithing"]	= GetSpellInfo(51300),
+	["Cooking"]		= GetSpellInfo(51296),
+	["Enchanting"]		= GetSpellInfo(51313),
+	["Engineering"]		= GetSpellInfo(51306),
+	["FirstAid"]		= GetSpellInfo(45542),
+	["Inscription"]		= GetSpellInfo(45363),
+	["Jewelcrafting"]	= GetSpellInfo(51311),
+	["Leatherworking"]	= GetSpellInfo(51302),
+	["Runeforging"]		= GetSpellInfo(53428),
+	["Smelting"]		= GetSpellInfo(32606),
+	["Tailoring"]		= GetSpellInfo(51309),
+}
+
+-------------------------------------------------------------------------------
+-- Mined via Data-tools
+-- Table is Public Domain now
+-- Look up table of Spell IDs to the recipe which trains them.
+-------------------------------------------------------------------------------
+local SPELL_ITEM = {
+	-------------------------------------------------------------------------------
+	-- First Aid
+	-------------------------------------------------------------------------------
+	[7929] = 16112, 	[7935] = 6454, 		[10840] = 16113, 	[23787] = 19442,
+	[27032] = 21992, 	[27033] = 21993, 	[45546] = 39152,
+
+	-------------------------------------------------------------------------------
+	-- Alchemy
+	-------------------------------------------------------------------------------
+	[2333] = 3396, 		[2335] = 2555, 		[3172] = 3393, 		[3174] = 3394,
+	[3175] = 3395, 		[3188] = 6211, 		[3230] = 2553, 		[3449] = 6068,
+	[3450] = 3830, 		[3451] = 3831, 		[3453] = 3832, 		[3454] = 14634,
+	[4508] = 4597, 		[4942] = 4624, 		[6617] = 5640, 		[6618] = 5643,
+	[6624] = 5642, 		[7255] = 6053, 		[7256] = 6054, 		[7257] = 6055,
+	[7258] = 6056, 		[7259] = 6057, 		[8240] = 6663, 		[11453] = 9293,
+	[11456] = 10644, 	[11458] = 9294, 	[11459] = 9303, 	[11464] = 9295,
+	[11466] = 9296, 	[11468] = 9297, 	[11472] = 9298, 	[11473] = 9302,
+	[11476] = 9301, 	[11477] = 9300, 	[11479] = 9304, 	[11480] = 9305,
+	[17187] = 12958, 	[17552] = 13476, 	[17553] = 13477, 	[17554] = 13478,
+	[17555] = 13479, 	[17556] = 13480, 	[17557] = 13481, 	[17559] = 13482,
+	[17560] = 13483, 	[17561] = 13484, 	[17562] = 13485, 	[17563] = 13486,
+	[17564] = 13487, 	[17565] = 13488, 	[17566] = 13489, 	[17570] = 13490,
+	[17571] = 13491, 	[17572] = 13492, 	[17573] = 13493, 	[17574] = 13494,
+	[17575] = 13495, 	[17576] = 13496, 	[17577] = 13497, 	[17578] = 13499,
+	[17580] = 13501, 	[17632] = 13517, 	[17634] = 13518, 	[17635] = 31354,
+	[17636] = 31356, 	[17637] = 31355, 	[17638] = 31357, 	[21923] = 17709,
+	[22732] = 18257, 	[24365] = 20011, 	[24366] = 20012, 	[24367] = 20013,
+	[24368] = 20014, 	[25146] = 20761, 	[26277] = 21547, 	[28543] = 22900,
+	[28546] = 22901, 	[28549] = 22902, 	[28550] = 22903, 	[28552] = 22904,
+	[28553] = 24001, 	[28554] = 22906, 	[28555] = 22907, 	[28556] = 22908,
+	[28557] = 22909, 	[28558] = 22910, 	[28562] = 22911, 	[28563] = 22912,
+	[28564] = 35295, 	[28565] = 22914, 	[28566] = 22915, 	[28567] = 22916,
+	[28568] = 30443, 	[28569] = 22918, 	[28570] = 22919, 	[28571] = 22920,
+	[28572] = 22921, 	[28573] = 22922, 	[28575] = 22923, 	[28576] = 22924,
+	[28577] = 22925, 	[28578] = 35294, 	[28579] = 22927, 	[29688] = 23574,
+	[32765] = 25869, 	[32766] = 29232, 	[38960] = 31680, 	[38961] = 31682,
+	[38962] = 31681, 	[39637] = 32070, 	[39639] = 32071, 	[42736] = 33209,
+	[47046] = 35752, 	[47048] = 35753, 	[47049] = 35754, 	[47050] = 35755,
+	[53936] = 44564, 	[53937] = 44566, 	[53938] = 44568, 	[53939] = 44565,
+	[53942] = 44567,
+
+	-------------------------------------------------------------------------------
+	-- Blacksmithing
+	-------------------------------------------------------------------------------
+	[2667] = 2881, 		[2673] = 5578, 		[3295] = 2883, 		[3297] = 3608,
+	[3321] = 3609, 		[3325] = 3610, 		[3330] = 2882, 		[3334] = 3611,
+	[3336] = 3612, 		[3492] = 12162, 	[3493] = 3866, 		[3494] = 10858,
+	[3495] = 3867, 		[3496] = 12163, 	[3497] = 3868, 		[3498] = 12164,
+	[3500] = 3869, 		[3503] = 6047, 		[3504] = 3870, 		[3505] = 3871,
+	[3507] = 3872, 		[3511] = 3873, 		[3513] = 3874, 		[3515] = 3875,
+	[6518] = 5543, 		[7221] = 6044, 		[7222] = 6045, 		[7224] = 6046,
+	[8367] = 6735, 		[9811] = 7978, 		[9813] = 7979, 		[9814] = 7980,
+	[9818] = 7981, 		[9820] = 7982, 		[9933] = 7975, 		[9937] = 7995,
+	[9939] = 7976, 		[9945] = 7983, 		[9950] = 7984, 		[9952] = 7985,
+	[9964] = 7989, 		[9966] = 7991, 		[9970] = 7990, 		[9995] = 7992,
+	[9997] = 8029, 		[10005] = 7993, 	[10009] = 8028,		[10013] = 8030,
+	[11454] = 10713, 	[11643] = 9367, 	[12259] = 10424, 	[15292] = 11610,
+	[15293] = 11614, 	[15294] = 11611, 	[15295] = 11615, 	[15296] = 11612,
+	[15973] = 12261, 	[16642] = 12682, 	[16643] = 12683, 	[16644] = 12684,
+	[16645] = 12685, 	[16646] = 12687, 	[16647] = 12688, 	[16648] = 12689,
+	[16649] = 12690, 	[16650] = 12691, 	[16651] = 12692, 	[16652] = 12693,
+	[16653] = 12694, 	[16654] = 12695, 	[16655] = 12699, 	[16656] = 12697,
+	[16657] = 12700, 	[16658] = 12701, 	[16659] = 12702, 	[16660] = 12698,
+	[16661] = 12703, 	[16662] = 12704, 	[16663] = 12705, 	[16664] = 12706,
+	[16665] = 12707, 	[16667] = 12696, 	[16724] = 12711, 	[16725] = 12713,
+	[16726] = 12714, 	[16728] = 12716, 	[16729] = 12717, 	[16730] = 12715,
+	[16731] = 12718, 	[16732] = 12719, 	[16741] = 12720, 	[16742] = 12725,
+	[16744] = 12726, 	[16745] = 12727, 	[16746] = 12728, 	[16969] = 12819,
+	[16970] = 12821, 	[16971] = 12823, 	[16973] = 12824, 	[16978] = 12825,
+	[16983] = 12827, 	[16984] = 12828, 	[16985] = 12830, 	[16988] = 12833,
+	[16990] = 12834, 	[16991] = 12835, 	[16992] = 12836, 	[16993] = 12837,
+	[16994] = 12838, 	[16995] = 12839, 	[20872] = 17049, 	[20873] = 17053,
+	[20874] = 17051, 	[20876] = 17052, 	[20890] = 17059, 	[20897] = 17060,
+	[21161] = 18592, 	[21913] = 17706, 	[22757] = 18264, 	[23628] = 19202,
+	[23629] = 19204, 	[23632] = 19203, 	[23633] = 19205, 	[23636] = 19206,
+	[23637] = 19207, 	[23638] = 19208, 	[23639] = 19209, 	[23650] = 19210,
+	[23652] = 19211, 	[23653] = 19212, 	[24136] = 19776, 	[24137] = 19777,
+	[24138] = 19778, 	[24139] = 19779, 	[24140] = 19780, 	[24141] = 19781,
+	[24399] = 20040, 	[24912] = 20553, 	[24913] = 20555, 	[24914] = 20554,
+	[27585] = 22209, 	[27586] = 22219, 	[27587] = 22222, 	[27588] = 22214,
+	[27589] = 22220, 	[27590] = 22221, 	[27829] = 22388, 	[27830] = 22390,
+	[27832] = 22389, 	[28461] = 22766, 	[28462] = 22767, 	[28463] = 22768,
+	[29566] = 23590, 	[29568] = 23591, 	[29569] = 23592, 	[29571] = 23593,
+	[29603] = 23594, 	[29605] = 23595, 	[29606] = 23596, 	[29608] = 23597,
+	[29610] = 23599, 	[29611] = 23598, 	[29613] = 23600, 	[29614] = 23601,
+	[29615] = 23602, 	[29616] = 23603, 	[29617] = 23604, 	[29619] = 23605,
+	[29620] = 23606, 	[29621] = 23607, 	[29622] = 23621, 	[29628] = 23608,
+	[29629] = 23609, 	[29630] = 23610, 	[29642] = 23611, 	[29643] = 23612,
+	[29645] = 23613, 	[29648] = 23615, 	[29649] = 23617, 	[29656] = 23618,
+	[29657] = 24002, 	[29658] = 23620, 	[29662] = 23622, 	[29663] = 23623,
+	[29664] = 23624, 	[29668] = 23625, 	[29669] = 23626, 	[29671] = 23627,
+	[29672] = 23628, 	[29692] = 23629, 	[29693] = 23630, 	[29694] = 23631,
+	[29695] = 23632, 	[29696] = 23633, 	[29697] = 23634, 	[29698] = 23635,
+	[29699] = 23636, 	[29700] = 23637, 	[29728] = 23638, 	[29729] = 23639,
+	[32285] = 25526, 	[32656] = 25846, 	[32657] = 25847, 	[34608] = 28632,
+	[36389] = 30321, 	[36390] = 30322, 	[36391] = 30323, 	[36392] = 30324,
+	[38473] = 31390, 	[38475] = 31391, 	[38476] = 31392, 	[38477] = 31393,
+	[38478] = 31394, 	[38479] = 31395, 	[40033] = 32441, 	[40034] = 32442,
+	[40035] = 32443, 	[40036] = 32444, 	[41132] = 32736, 	[41133] = 32737,
+	[41134] = 32738, 	[41135] = 32739, 	[42688] = 35296, 	[43549] = 33792,
+	[43846] = 33954, 	[46140] = 35208, 	[46141] = 35209, 	[46142] = 35210,
+	[46144] = 35211, 	[54978] = 41124, 	[54979] = 41123, 	[54980] = 41120,
+	[54981] = 41122, 	[62202] = 44938, 	[63187] = 45088, 	[63188] = 45089,
+	[63189] = 45090, 	[63190] = 45091, 	[63191] = 45092, 	[63192] = 45093,
+	[67091] = 47622, 	[67130] = 47460, 	[67092] = 47623, 	[67131] = 47641,
+	[67096] = 47627, 	[67135] = 47642, 	[67095] = 47626, 	[67134] = 47643,
+	[67093] = 47624, 	[67132] = 47644, 	[67094] = 47625, 	[67133] = 47645,
+
+	-------------------------------------------------------------------------------
+	-- Cooking
+	-------------------------------------------------------------------------------
+	[2542] = 2697, 		[2543] = 728, 		[2545] = 2698, 		[2547] = 2699,
+	[2548] = 2700, 		[2549] = 2701, 		[2795] = 2889, 		[3370] = 3678,
+	[3371] = 3679, 		[3372] = 3680, 		[3373] = 3681, 		[3376] = 3682,
+	[3377] = 3683, 		[3397] = 3734, 		[3398] = 3735, 		[3399] = 3736,
+	[3400] = 3737, 		[4094] = 4609, 		[6412] = 5482, 		[6413] = 5483,
+	[6414] = 5484, 		[6415] = 5485, 		[6416] = 5486, 		[6417] = 44977,
+	[6418] = 5488, 		[6419] = 5489, 		[6501] = 5528, 		[7213] = 6039,
+	[7751] = 6325, 		[7752] = 6326, 		[7753] = 6328, 		[7754] = 6329,
+	[7755] = 6330, 		[7827] = 6368, 		[7828] = 6369, 		[8238] = 6661,
+	[8607] = 6892, 		[9513] = 18160, 	[15853] = 12227, 	[15855] = 12228,
+	[15856] = 12229, 	[15861] = 12231, 	[15863] = 12232, 	[15865] = 12233,
+	[15906] = 12239, 	[15910] = 12240, 	[15915] = 16111, 	[15933] = 16110,
+	[15935] = 12226, 	[18238] = 13939, 	[18239] = 13940, 	[18240] = 13942,
+	[18241] = 13941, 	[18242] = 13943, 	[18243] = 13945, 	[18244] = 13946,
+	[18245] = 13947, 	[18246] = 13948, 	[18247] = 13949, 	[20626] = 16767,
+	[20916] = 17062, 	[21143] = 17200, 	[21144] = 17201, 	[22480] = 18046,
+	[22761] = 18267, 	[24418] = 20075, 	[25659] = 21025, 	[25704] = 21099,
+	[25954] = 21219, 	[28267] = 22647, 	[33276] = 27685, 	[33277] = 27686,
+	[33278] = 27687, 	[33279] = 27684, 	[33284] = 27688, 	[33285] = 27689,
+	[33286] = 27690, 	[33287] = 27691, 	[33288] = 27692, 	[33289] = 27693,
+	[33290] = 27694, 	[33291] = 27695, 	[33292] = 27696, 	[33293] = 27697,
+	[33294] = 27698, 	[33295] = 27699, 	[33296] = 27700, 	[36210] = 30156,
+	[38867] = 31675, 	[38868] = 31674, 	[43707] = 33870, 	[43758] = 33871,
+	[43761] = 33869, 	[43765] = 33873, 	[43772] = 33875, 	[43779] = 33925,
+	[45022] = 34413, 	[45555] = 43018, 	[45556] = 43019, 	[45557] = 43020,
+	[45558] = 43021, 	[45559] = 43022, 	[45567] = 43023, 	[45568] = 43024,
+	[45570] = 43026, 	[45571] = 43025, 	[45695] = 34834, 	[46684] = 35564,
+	[46688] = 35566, 	[53056] = 39644, 	[57423] = 43017, 	[57433] = 43027,
+	[57434] = 43028, 	[57435] = 43029, 	[57436] = 43030, 	[57437] = 43031,
+	[57438] = 43032, 	[57439] = 43033, 	[57440] = 43034, 	[57441] = 43035,
+	[57442] = 43036, 	[57443] = 43037, 	[58512] = 43507, 	[58521] = 43508,
+	[58523] = 43509, 	[58525] = 43510, 	[58527] = 43505, 	[58528] = 43506,
+	[62350] = 44954,
+
+	-------------------------------------------------------------------------------
+	-- Enchanting
+	-------------------------------------------------------------------------------
+	[7443] = 6342, 		[7766] = 6344, 		[7776] = 6346, 		[7782] = 6347,
+	[7786] = 6348, 		[7793] = 6349, 		[7859] = 6375, 		[7867] = 6377,
+	[13380] = 11038, 	[13419] = 11039, 	[13464] = 11081, 	[13522] = 11098,
+	[13536] = 11101, 	[13612] = 11150, 	[13617] = 11151, 	[13620] = 11152,
+	[13646] = 11163, 	[13653] = 11164, 	[13655] = 11165, 	[13687] = 11167,
+	[13689] = 11168, 	[13698] = 11166, 	[13817] = 11202, 	[13841] = 11203,
+	[13846] = 11204, 	[13868] = 11205, 	[13882] = 11206, 	[13898] = 11207,
+	[13915] = 11208, 	[13931] = 11223, 	[13933] = 11224, 	[13945] = 11225,
+	[13947] = 11226, 	[15596] = 11813, 	[15596] = 45050,
+	[20009] = 16218, 	[20010] = 16246, 	[20011] = 16251, 	[20012] = 16219,
+ 	[20014] = 16216, 	[20015] = 16224, 	[20016] = 16222,
+	[20017] = 16217, 	[20020] = 16215, 	[20023] = 16245, 	[20024] = 16220,
+	[20025] = 16253, 	[20026] = 16221, 	[20028] = 16242, 	[20029] = 16223,
+	[20030] = 16247, 	[20031] = 16250, 	[20032] = 16254, 	[20033] = 16248,
+	[20034] = 16252, 	[20035] = 16255, 	[20036] = 16249, 	[20051] = 16243,
+	[21931] = 17725, 	[22749] = 18259, 	[22750] = 18260, 	[23799] = 19444,
+	[23800] = 19445, 	[23801] = 19446, 	[23802] = 19447, 	[23803] = 19448,
+	[23804] = 19449, 	[25072] = 33153, 	[25072] = 20726, 	[25073] = 20727,
+	[25074] = 20728, 	[25078] = 20729, 	[25079] = 20730, 	[25080] = 33152,
+	[25080] = 20731, 	[25081] = 20732, 	[25082] = 20733, 	[25083] = 33149,
+	[25083] = 20734, 	[25084] = 20735, 	[25084] = 33150, 	[25084] = 33151,
+	[25086] = 20736, 	[25086] = 33148, 	[25124] = 20758, 	[25125] = 20752,
+	[25126] = 20753, 	[25127] = 20754, 	[25128] = 20755, 	[25129] = 20756,
+	[25130] = 20757, 	[27837] = 22392, 	[27906] = 22530, 	[27911] = 22531,
+	[27911] = 24000, 	[27913] = 22532, 	[27914] = 22533, 	[27917] = 22534,
+	[27920] = 22535, 	[27924] = 22536, 	[27926] = 22537, 	[27927] = 22538,
+	[27945] = 22539, 	[27946] = 22540, 	[27947] = 22541, 	[27948] = 35298,
+	[27948] = 22542, 	[27950] = 22543, 	[27951] = 22544, 	[27954] = 22545,
+	[27960] = 24003, 	[27960] = 22547, 	[27962] = 22548, 	[27967] = 22552,
+	[27968] = 22551, 	[27971] = 22554, 	[27972] = 22553, 	[27975] = 22555,
+	[27977] = 22556, 	[27981] = 22560, 	[27982] = 22561, 	[27984] = 22559,
+	[28003] = 22558, 	[28004] = 22557, 	[28016] = 22562, 	[28019] = 22563,
+	[28022] = 22565, 	[32665] = 25848, 	[32667] = 25849, 	[33992] = 28270,
+	[33994] = 28271, 	[33997] = 28272, 	[33999] = 28273, 	[34003] = 28274,
+	[34005] = 28276, 	[34006] = 28277, 	[34007] = 35299, 	[34007] = 28279,
+	[34008] = 35297, 	[34008] = 28280, 	[34009] = 28282, 	[34010] = 28281,
+	[42620] = 33165, 	[42974] = 33307, 	[44483] = 37332, 	[44494] = 37333,
+	[44524] = 37344, 	[44556] = 37331, 	[44575] = 44484, 	[44576] = 44494,
+	[44588] = 37340, 	[44590] = 37334, 	[44591] = 37347, 	[44595] = 44473,
+	[44596] = 37330, 	[44621] = 37339, 	[44625] = 44485, 	[44631] = 37349,
+	[45765] = 34872, 	[46578] = 35498, 	[46594] = 35500, 	[47051] = 35756,
+	[47672] = 44471, 	[47898] = 44472, 	[47899] = 44488, 	[47901] = 44491,
+	[59619] = 44496, 	[59621] = 44492, 	[59625] = 44495, 	[60691] = 44483,
+	[60692] = 44489, 	[60707] = 44486, 	[60714] = 44487, 	[60763] = 44490,
+	[60767] = 44498, 	[62256] = 44944, 	[62257] = 44945, 	[62948] = 45059,
+	[64441] = 46027, 	[64579] = 46348,
+
+	-------------------------------------------------------------------------------
+	--Engineering
+	-------------------------------------------------------------------------------
+	[3928] = 4408, 		[3933] = 4409, 		[3939] = 13309,		[3940] = 4410,
+	[3944] = 4411, 		[3952] = 14639, 	[3954] = 4412, 		[3957] = 13308,
+	[3959] = 4413, 		[3960] = 4414, 		[3966] = 4415, 		[3968] = 4416,
+	[3969] = 13311, 	[3971] = 7742, 		[3972] = 4417, 		[3979] = 13310,
+	[8243] = 6672, 		[8339] = 6716, 		[9269] = 7560, 		[9273] = 7561,
+	[12587] = 10601, 	[12597] = 10602, 	[12607] = 10603, 	[12614] = 10604,
+	[12615] = 10605, 	[12616] = 10606, 	[12617] = 10607, 	[12620] = 10608,
+	[12624] = 10609, 	[15628] = 11828, 	[15633] = 11827, 	[19790] = 16041,
+	[19791] = 16042, 	[19792] = 16043, 	[19793] = 16044, 	[19794] = 16045,
+	[19795] = 16047, 	[19796] = 16048, 	[19799] = 16049, 	[19800] = 16051,
+	[19814] = 16046, 	[19815] = 16050, 	[19819] = 16052, 	[19825] = 16053,
+	[19830] = 16054, 	[19831] = 16055, 	[19833] = 16056, 	[21940] = 17720,
+	[22793] = 18290, 	[22795] = 18292, 	[22797] = 18291, 	[23066] = 18647,
+	[23067] = 18649, 	[23068] = 18648, 	[23069] = 18650, 	[23071] = 18651,
+	[23077] = 18652, 	[23078] = 18653, 	[23079] = 18655, 	[23080] = 18656,
+	[23081] = 18657, 	[23082] = 18658, 	[23096] = 18654, 	[23129] = 18661,
+	[23507] = 19027, 	[24356] = 20000, 	[24357] = 20001, 	[26416] = 21724,
+	[26417] = 21725, 	[26418] = 21726, 	[26420] = 21727, 	[26421] = 21728,
+	[26422] = 21729, 	[26423] = 21730, 	[26424] = 21731, 	[26425] = 21732,
+	[26426] = 21733, 	[26427] = 21734, 	[26428] = 21735, 	[26442] = 44919,
+	[26443] = 44918, 	[28327] = 22729, 	[30313] = 23799, 	[30314] = 23800,
+	[30315] = 23802, 	[30316] = 23803, 	[30317] = 23804, 	[30318] = 23805,
+	[30325] = 23806, 	[30329] = 23807, 	[30332] = 23808, 	[30334] = 23809,
+	[30337] = 23810, 	[30341] = 23811, 	[30344] = 23814, 	[30347] = 23815,
+	[30348] = 23816, 	[30349] = 23817, 	[30547] = 23874, 	[30548] = 23888,
+	[30551] = 35310, 	[30552] = 35311, 	[30556] = 23887, 	[32814] = 25887,
+	[39895] = 32381, 	[43676] = 33804, 	[44391] = 34114, 	[46106] = 35191,
+	[46107] = 35187, 	[46108] = 35189, 	[46109] = 35190, 	[46110] = 35192,
+	[46111] = 35186, 	[46112] = 35193, 	[46113] = 35194, 	[46114] = 35195,
+	[46115] = 35196, 	[46116] = 35197, 	[46697] = 35582,  [60866] = 44502, 	[60867] = 44503,
+
+	-------------------------------------------------------------------------------
+	--Inscription
+	-------------------------------------------------------------------------------
+
+	-------------------------------------------------------------------------------
+	--Jewelcrafting
+	-------------------------------------------------------------------------------
+	[25320] = 20856, 	[25323] = 20855, 	[25339] = 20854, 	[25610] = 20970,
+	[25612] = 20971, 	[25617] = 20973, 	[25618] = 20974, 	[25619] = 20975,
+	[25622] = 20976, 	[26873] = 21940, 	[26875] = 21941, 	[26878] = 21942,
+	[26881] = 21943, 	[26882] = 21944, 	[26887] = 21945, 	[26896] = 21947,
+	[26897] = 21948, 	[26900] = 21949, 	[26906] = 21952, 	[26909] = 21953,
+	[26910] = 21954, 	[26912] = 21955, 	[26914] = 21956, 	[26915] = 21957,
+	[28903] = 23130, 	[28905] = 23131, 	[28906] = 23133, 	[28907] = 23134,
+	[28910] = 23135, 	[28912] = 23136, 	[28914] = 23137, 	[28915] = 23138,
+	[28916] = 23140, 	[28917] = 23141, 	[28918] = 31359, 	[28924] = 23143,
+	[28927] = 23145, 	[28933] = 23146, 	[28936] = 23147,
+	[28938] = 23148, 	[28944] = 23149, 	[28947] = 23150, 	[28948] = 23151,
+	[28950] = 23152, 	[28953] = 23153, 	[28955] = 23154, 	[28957] = 23155,
+	[31053] = 24158, 	[31054] = 24159, 	[31055] = 24160, 	[31056] = 24161,
+	[31057] = 24162, 	[31058] = 24163, 	[31060] = 24164, 	[31061] = 24165,
+	[31062] = 24174, 	[31063] = 24175, 	[31064] = 24176, 	[31065] = 24177,
+	[31066] = 24178, 	[31067] = 24166, 	[31068] = 24167, 	[31070] = 24168,
+	[31071] = 24169, 	[31072] = 24170, 	[31076] = 24171, 	[31077] = 24172,
+	[31078] = 24173, 	[31079] = 24179, 	[31080] = 31358, 	[31081] = 24181,
+	[31082] = 24182, 	[31083] = 24183, 	[31084] = 24193, 	[31085] = 24194,
+	[31087] = 24195, 	[31088] = 35305, 	[31089] = 35306, 	[31090] = 24197,
+	[31091] = 24198, 	[31092] = 35304, 	[31094] = 24201, 	[31095] = 24202,
+	[31096] = 24203, 	[31097] = 24204, 	[31098] = 35307, 	[31099] = 24206,
+	[31100] = 24207, 	[31101] = 24208, 	[31102] = 24209, 	[31103] = 24210,
+	[31104] = 24211, 	[31105] = 24212, 	[31106] = 24213, 	[31107] = 24214,
+	[31108] = 24215, 	[31109] = 24216, 	[31110] = 24217, 	[31111] = 24218,
+	[31112] = 24219, 	[31113] = 24220, 	[31149] = 24200, 	[32866] = 25902,
+	[32867] = 25903, 	[32868] = 25905, 	[32869] = 25906, 	[32870] = 25904,
+	[32871] = 25907, 	[32872] = 25909, 	[32873] = 25908, 	[32874] = 25910,
+	[34069] = 28291, 	[34590] = 28596, 	[37855] = 30826, 	[38503] = 31401,
+	[38504] = 31402, 	[39451] = 31870, 	[39452] = 31875, 	[39455] = 31871,
+	[39458] = 31872, 	[39462] = 31877, 	[39463] = 31876, 	[39466] = 31873,
+	[39467] = 31874, 	[39470] = 31878, 	[39471] = 31879, 	[39705] = 35244,
+	[39706] = 35246, 	[39710] = 35250, 	[39711] = 35248, 	[39712] = 35245,
+	[39713] = 35249, 	[39714] = 35247, 	[39715] = 35263, 	[39716] = 35264,
+	[39717] = 35262, 	[39718] = 35265, 	[39719] = 35255, 	[39720] = 35260,
+	[39721] = 35259, 	[39722] = 35256, 	[39723] = 35261, 	[39724] = 35258,
+	[39725] = 35257, 	[39727] = 35243, 	[39728] = 35242, 	[39729] = 35238,
+	[39730] = 35240, 	[39731] = 35239, 	[39732] = 35241, 	[39733] = 35267,
+	[39734] = 35269, 	[39735] = 35268, 	[39736] = 35266, 	[39737] = 35270,
+	[39738] = 35271, 	[39739] = 35252, 	[39740] = 35254, 	[39741] = 35251,
+	[39742] = 35253, 	[39961] = 33622, 	[39963] = 32411, 	[42558] = 33305,
+	[42588] = 33155, 	[42589] = 33156, 	[42590] = 33157, 	[42591] = 33158,
+	[42592] = 33159, 	[42593] = 33160, 	[43493] = 33783, 	[44794] = 34689,
+	[46122] = 35198, 	[46123] = 35538, 	[46124] = 35200, 	[46125] = 35201,
+	[46126] = 35533, 	[46127] = 35203, 	[46403] = 35322, 	[46404] = 35323,
+	[46405] = 35325, 	[46597] = 35502, 	[46601] = 35505, 	[46775] = 35695,
+	[46776] = 35696, 	[46777] = 35697, 	[46778] = 35698, 	[46779] = 35699,
+	[46803] = 35708, 	[47053] = 35769, 	[47054] = 35766, 	[47055] = 35767,
+	[47056] = 35768, 	[48789] = 37504, 	[53830] = 41576, 	[53857] = 41559,
+	[53865] = 41575, 	[53869] = 41574, 	[53875] = 41566, 	[53877] = 41562,
+	[53879] = 41565, 	[53884] = 41563, 	[53885] = 41561, 	[53888] = 41564,
+	[53917] = 41567, 	[53919] = 41572, 	[53921] = 41568, 	[53924] = 41571,
+	[53929] = 41573, 	[53932] = 41570, 	[53933] = 41569, 	[53943] = 41560,
+	[53945] = 41577, 	[53946] = 41718, 	[53948] = 41719, 	[53949] = 41578,
+	[53950] = 41817, 	[53951] = 41790, 	[53952] = 42138, 	[53954] = 41581,
+	[53955] = 41728, 	[53957] = 41720, 	[53958] = 41580, 	[53959] = 41791,
+	[53960] = 41727, 	[53961] = 41579, 	[53962] = 41784, 	[53963] = 41747,
+	[53964] = 41785, 	[53965] = 41725, 	[53966] = 41783, 	[53967] = 41701,
+	[53968] = 41740, 	[53970] = 41796, 	[53971] = 41703, 	[53972] = 41820,
+	[53973] = 41702, 	[53974] = 41726, 	[53975] = 41789, 	[53976] = 41777,
+	[53977] = 41780, 	[53978] = 41734, 	[53979] = 41794, 	[53980] = 41582,
+	[53981] = 41733, 	[53982] = 41792, 	[53983] = 41689, 	[53984] = 41686,
+	[53985] = 41688, 	[53986] = 41730, 	[53987] = 41690, 	[53988] = 41721,
+	[53990] = 41732, 	[53991] = 41687, 	[53992] = 41779, 	[53993] = 41722,
+	[53994] = 41818, 	[53995] = 41795, 	[53996] = 41723, 	[53997] = 41698,
+	[53998] = 41697, 	[54000] = 41738, 	[54001] = 41693, 	[54002] = 41699,
+	[54003] = 41781, 	[54004] = 41782, 	[54005] = 41737, 	[54006] = 41694,
+	[54008] = 41724, 	[54009] = 41696, 	[54010] = 41739, 	[54011] = 41692,
+	[54012] = 41819, 	[54013] = 41736, 	[54014] = 41735, 	[54019] = 41793,
+	[54023] = 41778, 	[55384] = 41705, 	[55387] = 41743, 	[55388] = 41744,
+	[55389] = 41704, 	[55390] = 41786, 	[55392] = 41706, 	[55393] = 41742,
+	[55395] = 41787, 	[55396] = 41708, 	[55397] = 41798, 	[55398] = 41799,
+	[55400] = 41710, 	[55401] = 41797, 	[55403] = 41711, 	[55404] = 41709,
+	[55405] = 41788, 	[55407] = 41707, 	[56049] = 42298, 	[56052] = 42301,
+	[56053] = 42309, 	[56054] = 42299, 	[56055] = 42314, 	[56056] = 42302,
+	[56074] = 42300, 	[56076] = 42303, 	[56077] = 42304, 	[56079] = 42305,
+	[56081] = 42306, 	[56083] = 42307, 	[56084] = 42308, 	[56085] = 42310,
+	[56086] = 42311, 	[56087] = 42312, 	[56088] = 42313, 	[56089] = 42315,
+	[56496] = 42648, 	[56497] = 42649, 	[56498] = 42650, 	[56499] = 42651,
+	[56500] = 42652, 	[56501] = 42653, 	[58147] = 43317, 	[58148] = 43318,
+	[58149] = 43319, 	[58150] = 43320, 	[58492] = 43485, 	[58507] = 43497,
+	[58954] = 43597,   [66556] = 46937, [66447] =  46917 , [66429] =  46899,
+	[66557] =  46938, [66430] =  46900, [66432] =  46902, [66433] =  46903,
+ [66497] =  46924, [66561] =  46942, [66434] = 46904, [66498] =  46925,
+ [66499] =  46926, [66436] =  46906, [66500] =  46927, [66437] =  46907,
+ [66501] =  46928, [66565] =  46946, [66438] =  46908, [66502] = 46929,
+ [66566] =  46947, [66439] =  46909, [66503] = 46930  , [66567] =  46948,
+ [66440] = 46910, [66504] =  46931, [66441] =  46911, [66505] =  46932,
+ [66569] =  46950, [66442] = 46912, [66506] = 46933, [66570] =  46951,
+ [66443] =  46913, [66444] = 46914, [66572] = 46953, [66445] =  46915,
+ [66573] = 46956, [66446] =  46916, [66574] =  47007, [66575] = 47008,
+ [66448] =  46918, [66576] =  47010, [66449] =  46919, [66577] =  47011,
+ [66450] = 46920, [66578] = 47012, [66451] =  46921, [66579] = 47015,
+ [66452] =  46922, [66580] =  47016, [66453] = 46923, [66581] =  47017,
+ [66582] =  47018, [66583] = 47019, [66584] =  47020, [66586] =  47022,
+ [68253] =  49112, [66338] = 46897, [66571] =  46952, [66564] = 46945,
+ [66562] =  46943, [66560] =  46941, [66558] =  46939, [66554] =  46935,
+ [66559] =  46940, [66585] =  47021, [66555] = 46936, [66587] =  47023,
+ [66431] =  46901, [66428] =  46898, [66435] = 46905, [66563] = 46944,
+ [66553] = 46934 , [66568] = 46949,
+
+	-------------------------------------------------------------------------------
+	--Leatherworking
+	-------------------------------------------------------------------------------
+	[2158] = 2406, 		[2163] = 2407, 		[2164] = 2408, 		[2169] = 2409,
+	[3762] = 4293, 		[3765] = 7360, 		[3767] = 4294, 		[3769] = 4296,
+	[3771] = 4297, 		[3772] = 7613, 		[3773] = 4299, 		[3775] = 4298,
+	[3777] = 4300, 		[3778] = 14635, 	[3779] = 4301, 		[4096] = 13287,
+	[4097] = 13288, 	[5244] = 5083, 		[6702] = 5786, 		[6703] = 5787,
+	[6704] = 5788, 		[6705] = 5789, 		[7133] = 5972, 		[7149] = 5973,
+	[7153] = 5974, 		[7953] = 6474, 		[7954] = 6475, 		[7955] = 6476,
+	[8322] = 6710, 		[9064] = 7288, 		[9070] = 7289, 		[9072] = 7290,
+	[9146] = 7361, 		[9147] = 7362, 		[9148] = 7363, 		[9149] = 7364,
+	[9195] = 7449, 		[9197] = 7450, 		[9202] = 7451, 		[9207] = 7452,
+	[9208] = 7453, 		[10490] = 8384, 	[10509] = 8385, 	[10516] = 8409,
+	[10520] = 8386, 	[10525] = 8395, 	[10529] = 8403, 	[10531] = 8387,
+	[10533] = 8397, 	[10542] = 8398, 	[10544] = 8404, 	[10546] = 8405,
+	[10554] = 8399, 	[10560] = 8389, 	[10562] = 8390, 	[10564] = 8400,
+	[10566] = 8406, 	[10568] = 8401, 	[10570] = 8402, 	[10572] = 8407,
+	[10574] = 8408, 	[19048] = 15724, 	[19049] = 15725, 	[19050] = 15726,
+	[19051] = 15727, 	[19052] = 15728, 	[19053] = 15729, 	[19054] = 15730,
+	[19055] = 15731, 	[19059] = 15732, 	[19060] = 15733, 	[19061] = 15734,
+	[19062] = 15735, 	[19063] = 15737, 	[19064] = 15738, 	[19065] = 15739,
+	[19066] = 15740, 	[19067] = 15741, 	[19068] = 20253, 	[19070] = 15743,
+	[19071] = 15744, 	[19072] = 15745, 	[19073] = 15746, 	[19074] = 15747,
+	[19075] = 15748, 	[19076] = 15749, 	[19077] = 15751, 	[19078] = 15752,
+	[19079] = 15753, 	[19080] = 20254, 	[19081] = 15755, 	[19082] = 15756,
+	[19083] = 15757, 	[19084] = 15758, 	[19085] = 15759, 	[19086] = 15760,
+	[19087] = 15761, 	[19088] = 15762, 	[19089] = 15763, 	[19090] = 15764,
+	[19091] = 15765, 	[19092] = 15768, 	[19093] = 15769, 	[19094] = 15770,
+	[19095] = 15771, 	[19097] = 15772, 	[19098] = 15773, 	[19100] = 15774,
+	[19101] = 15775, 	[19102] = 15776, 	[19103] = 15777, 	[19104] = 15779,
+	[19107] = 15781, 	[20853] = 17022, 	[20854] = 17023, 	[20855] = 17025,
+	[21943] = 17722, 	[22711] = 18239, 	[22727] = 18252, 	[22921] = 18514,
+	[22922] = 18515, 	[22923] = 18516, 	[22926] = 18517, 	[22927] = 18518,
+	[22928] = 18519, 	[23190] = 18731, 	[23399] = 18949, 	[23703] = 19326,
+	[23704] = 19327, 	[23705] = 19328, 	[23706] = 19329, 	[23707] = 19330,
+	[23708] = 19331, 	[23709] = 19332, 	[23710] = 19333, 	[24121] = 19769,
+	[24122] = 19770, 	[24123] = 19771, 	[24124] = 19772, 	[24125] = 19773,
+	[24703] = 20382, 	[24846] = 20506, 	[24847] = 20507, 	[24848] = 20508,
+	[24849] = 20509, 	[24850] = 20510, 	[24851] = 20511, 	[24940] = 20576,
+	[26279] = 21548, 	[28472] = 22771, 	[28473] = 22770, 	[28474] = 22769,
+	[32455] = 25720, 	[32457] = 25721, 	[32458] = 25722, 	[32461] = 25725,
+	[32482] = 25726, 	[32485] = 25728, 	[32487] = 25729, 	[32488] = 25731,
+	[32489] = 25730, 	[32490] = 25732, 	[32493] = 25733, 	[32494] = 25734,
+	[32495] = 25735, 	[32496] = 25736, 	[32497] = 25737, 	[32498] = 29213,
+	[32499] = 29214, 	[32500] = 29215, 	[32501] = 29217, 	[32502] = 29219,
+	[32503] = 29218, 	[35520] = 29669, 	[35521] = 29672, 	[35522] = 29673,
+	[35523] = 29674, 	[35524] = 29675, 	[35525] = 29677, 	[35526] = 29682,
+	[35527] = 29684, 	[35528] = 29691, 	[35529] = 29689, 	[35530] = 30444,
+	[35531] = 29693, 	[35532] = 29698, 	[35533] = 29700, 	[35534] = 29701,
+	[35535] = 29702, 	[35536] = 29703, 	[35537] = 29704, 	[35538] = 29713,
+	[35539] = 34175, 	[35543] = 29717, 	[35544] = 34173, 	[35549] = 31361,
+	[35554] = 31362, 	[35555] = 29720, 	[35557] = 29721, 	[35558] = 29723,
+	[35559] = 35302, 	[35560] = 29725, 	[35561] = 29726, 	[35562] = 35303,
+	[35563] = 29728, 	[35564] = 29729, 	[35567] = 29730, 	[35568] = 35300,
+	[35572] = 29732, 	[35573] = 35301, 	[35574] = 29734, 	[36349] = 30301,
+	[36351] = 30302, 	[36352] = 30303, 	[36353] = 30304, 	[36355] = 30305,
+	[36357] = 30306, 	[36358] = 30307, 	[36359] = 30308, 	[39997] = 32429,
+	[40001] = 32431, 	[40002] = 32432, 	[40003] = 32433, 	[40004] = 32434,
+	[40005] = 32435, 	[40006] = 32436, 	[41156] = 32744, 	[41157] = 35523,
+	[41158] = 35527, 	[41160] = 35528, 	[41161] = 35517, 	[41162] = 35524,
+	[41163] = 35520, 	[41164] = 35521, 	[42546] = 33124, 	[42731] = 33205,
+	[44359] = 34200, 	[44768] = 34218, 	[44953] = 34262, 	[45117] = 34491,
+	[46132] = 35546, 	[46133] = 35541, 	[46134] = 35214, 	[46135] = 35215,
+	[46136] = 35216, 	[46137] = 35217, 	[46138] = 35218, 	[46139] = 35549,
+	[50970] = 44509, 	[50971] = 44510, 	[52733] = 32430, 	[57683] = 43097,
+	[57692] = 44559, 	[57694] = 44560, 	[57696] = 44561, 	[57699] = 44562,
+	[57701] = 44563, 	[60645] = 44511, 	[60647] = 44512, 	[60697] = 44513,
+	[60702] = 44514, 	[60703] = 44515, 	[60704] = 44516, 	[60705] = 44517,
+	[60706] = 44518, 	[60711] = 44519, 	[60712] = 44520, 	[60715] = 44521,
+	[60716] = 44522, 	[60718] = 44523, 	[60720] = 44524, 	[60721] = 44525,
+	[60723] = 44526, 	[60725] = 44527, 	[60727] = 44528, 	[60728] = 44530,
+	[60729] = 44531, 	[60730] = 44532, 	[60731] = 44533, 	[60732] = 44534,
+	[60734] = 44535, 	[60735] = 44536, 	[60737] = 44537, 	[60743] = 44538,
+	[60746] = 44539, 	[60747] = 44540, 	[60748] = 44541, 	[60749] = 44542,
+	[60750] = 44543, 	[60751] = 44544, 	[60752] = 44545, 	[60754] = 44546,
+	[60755] = 44547, 	[60756] = 44548, 	[60757] = 44549, 	[60758] = 44550,
+	[60759] = 44551, 	[60760] = 44552, 	[60761] = 44553, 	[60996] = 44584,
+	[60997] = 44585, 	[60998] = 44586, 	[60999] = 44587, 	[61000] = 44588,
+	[61002] = 44589, 	[62176] = 44932, 	[62177] = 44933, 	[63194] = 45094,
+	[63195] = 45095, 	[63196] = 45096, 	[63197] = 45097, 	[63198] = 45098,
+	[63199] = 45099, 	[63200] = 45100, 	[63201] = 45101,
+
+	-------------------------------------------------------------------------------
+	--Smelting
+	-------------------------------------------------------------------------------
+	[22967] = 44956, 	[46353] = 35273,
+
+	-------------------------------------------------------------------------------
+	--Tailoring
+	-------------------------------------------------------------------------------
+	[2389] = 2598, 		[2403] = 2601, 		[3758] = 4292, 		[3844] = 4346,
+	[3847] = 4345, 		[3849] = 4347, 		[3851] = 4349, 		[3854] = 7114,
+	[3856] = 4350, 		[3857] = 14630, 	[3858] = 4351, 		[3860] = 4352,
+	[3862] = 4355, 		[3863] = 4353, 		[3864] = 4356, 		[3868] = 4348,
+	[3869] = 14627, 	[3870] = 6401, 		[3872] = 4354, 		[3873] = 10728,
+	[6686] = 5771, 		[6688] = 5772, 		[6692] = 5773, 		[6693] = 5774,
+	[6695] = 5775, 		[7629] = 6271, 		[7630] = 6270, 		[7633] = 6272,
+	[7639] = 6274, 		[7643] = 6275, 		[7892] = 6390, 		[7893] = 6391,
+	[8780] = 7092, 		[8782] = 7091, 		[8784] = 7090, 		[8786] = 7089,
+	[8789] = 7087, 		[8793] = 7084, 		[8795] = 7085, 		[8797] = 7086,
+	[8802] = 7088, 		[12047] = 10316, 	[12056] = 10300, 	[12059] = 10301,
+	[12060] = 10302, 	[12064] = 10311, 	[12066] = 10312, 	[12075] = 10314,
+	[12078] = 10315, 	[12080] = 10317, 	[12081] = 10318, 	[12084] = 10320,
+	[12085] = 10321, 	[12086] = 10463, 	[12089] = 10323, 	[12091] = 10325,
+	[12093] = 10326, 	[18403] = 14466, 	[18404] = 14467, 	[18405] = 14468,
+	[18406] = 14469, 	[18407] = 14470, 	[18408] = 14471, 	[18409] = 14472,
+	[18410] = 14473, 	[18411] = 14474, 	[18412] = 14476, 	[18413] = 14477,
+	[18414] = 14478, 	[18415] = 14479, 	[18416] = 14480, 	[18417] = 14481,
+	[18418] = 14482, 	[18419] = 14483, 	[18420] = 14484, 	[18421] = 14485,
+	[18422] = 14486, 	[18423] = 14488, 	[18424] = 14489, 	[18434] = 14490,
+	[18436] = 14493, 	[18437] = 14492, 	[18438] = 14491, 	[18439] = 14494,
+	[18440] = 14497, 	[18441] = 14495, 	[18442] = 14496, 	[18444] = 14498,
+	[18445] = 14499, 	[18446] = 14500, 	[18447] = 14501, 	[18448] = 14507,
+	[18449] = 14504, 	[18450] = 14505, 	[18451] = 14506, 	[18452] = 14509,
+	[18453] = 14508, 	[18454] = 14511, 	[18455] = 14510, 	[18456] = 14512,
+	[18457] = 14513, 	[18458] = 14514, 	[18560] = 14526, 	[20848] = 17017,
+	[20849] = 17018, 	[21945] = 17724, 	[22759] = 18265, 	[22866] = 18414,
+	[22867] = 18415, 	[22868] = 18416, 	[22869] = 18417, 	[22870] = 18418,
+	[22902] = 18487, 	[23662] = 19215, 	[23663] = 19218, 	[23664] = 19216,
+	[23665] = 19217, 	[23666] = 19219, 	[23667] = 19220, 	[24091] = 19764,
+	[24092] = 19765, 	[24093] = 19766, 	[24901] = 20546, 	[24902] = 20548,
+	[24903] = 20547, 	[26085] = 21358, 	[26087] = 21371, 	[26403] = 44916,
+	[26407] = 44917, 	[26747] = 21892, 	[26749] = 21893, 	[26750] = 21894,
+	[26751] = 21895, 	[26752] = 21908, 	[26753] = 21909, 	[26754] = 21910,
+	[26755] = 21911, 	[26756] = 21912, 	[26757] = 21914, 	[26758] = 21913,
+	[26759] = 21915, 	[26760] = 21916, 	[26761] = 21918, 	[26762] = 21917,
+	[26763] = 21919, 	[26773] = 21896, 	[26774] = 21897, 	[26775] = 21898,
+	[26776] = 21899, 	[26777] = 21900, 	[26778] = 21901, 	[26779] = 21902,
+	[26780] = 21903, 	[26781] = 21904, 	[26782] = 21905, 	[26783] = 21906,
+	[26784] = 21907, 	[27658] = 22307, 	[27659] = 22308, 	[27660] = 22309,
+	[27724] = 22310, 	[27725] = 22312, 	[28210] = 22683, 	[28480] = 22774,
+	[28481] = 22773, 	[28482] = 22772, 	[31373] = 24316, 	[31430] = 24292,
+	[31431] = 24293, 	[31432] = 24294, 	[31433] = 24295, 	[31434] = 35308,
+	[31435] = 24297, 	[31437] = 24298, 	[31438] = 24299, 	[31440] = 24300,
+	[31441] = 24301, 	[31442] = 35309, 	[31443] = 24303, 	[31444] = 24304,
+	[31448] = 24305, 	[31449] = 24306, 	[31450] = 24307, 	[31451] = 24308,
+	[31452] = 24309, 	[31453] = 24310, 	[31454] = 24311, 	[31455] = 24312,
+	[31456] = 24313, 	[31459] = 24314, 	[36315] = 30280, 	[36316] = 30281,
+	[36317] = 30282, 	[36318] = 30283, 	[36686] = 30483, 	[37873] = 30833,
+	[37882] = 30842, 	[37883] = 30843, 	[37884] = 30844, 	[40020] = 32437,
+	[40021] = 32438, 	[40023] = 32439, 	[40024] = 32440, 	[40060] = 32447,
+	[41205] = 35518, 	[41206] = 32755, 	[41207] = 32752, 	[41208] = 32753,
+	[44950] = 34261, 	[44958] = 34319, 	[46128] = 35204, 	[46129] = 35205,
+	[46130] = 35206, 	[46131] = 35207, 	[49677] = 37915, 	[50194] = 38229,
+	[50644] = 38327, 	[50647] = 38328, 	[55993] = 42172, 	[55994] = 42173,
+	[55996] = 42175, 	[55997] = 42177, 	[55998] = 42176, 	[55999] = 42178,
+	[56004] = 42183, 	[56005] = 42184, 	[56006] = 42185, 	[56009] = 42187,
+	[56011] = 42188, 	[63924] = 45774,
+}
+
+-------------------------------------------------------------------------------
+-- Look up table of spell IDs for recipes which do not have a player flag
+-- BASICALLY A TEMPORARY STORAGE FOR IDS, SO WE CAN SEE CLEANER SCANS AND WHAT NOT,
+-- WE'LL GO BACK HERE LATER DOWN THE ROAD.
+-------------------------------------------------------------------------------
+local NO_PLAYER_FLAG = {
+	[30344] = true, 		[30341] = true, 		[32814] = true, 		[23066] = true,
+	[26421] = true, 		[36955] = true, 		[19788] = true, 		[23129] = true,
+	[26422] = true, 		[12715] = true, 		[12899] = true, 		[56459] = true,
+	[30307] = true, 		[26423] = true, 		[3918] = true,	 		[23067] = true,
+	[30308] = true, 		[3953] = true,			[15255] = true, 		[26424] = true,
+	[30548] = true, 		[44157] = true, 		[56462] = true, 		[19567] = true,
+	[30552] = true, 		[23068] = true, 		[44155] = true, 		[28327] = true,
+	[26425] = true, 		[56461] = true, 		[68067] = true, 		[15633] = true,
+	[23096] = true, 		[12589] = true, 		[26442] = true, 		[26426] = true,
+	[67920] = true, 		[9273] = true,			[3926] = true,			[6458] = true,
+	[19793] = true, 		[55252] = true, 		[9271] = true,			[26427] = true,
+	[26443] = true, 		[30551] = true, 		[23486] = true, 		[3922] = true,
+	[3924] = true,			[12590] = true, 		[3928] = true,			[3942] = true,
+	[26428] = true, 		[3952] = true,	 		[22704] = true, 		[12902] = true,
+	[30569] = true, 		[15628] = true, 		[12895] = true, 		[21940] = true,
+	[56349] = true, 		[12584] = true, 		[56477] = true, 		[30348] = true,
+	[26416] = true, 		[53281] = true, 		[23507] = true,			[12075] = true,
+	[12079] = true,			[26746] = true,			[56000] = true,
+
+		-----------------------------------------------------------------------------------------
+	---JEWELCRAFTING
+	-----------------------------------------------------------------------------------------
+	[55401] = true, [53995] = true, [66432] = true, [25255] = true,
+[66497] = true, [53996] = true, [56074] = true, [56202] = true,
+ [66434] = true, [32801] = true, [28948] = true, [53997] = true,
+ [39963] = true, [32866] = true, [66501] = true, [39452] = true,
+ [53934] = true, [66502] = true, [55405] = true, [58954] = true,
+ [56205] = true, [37855] = true, [38175] = true, [25305] = true,
+ [25321] = true, [66505] = true, [54000] = true, [39742] = true,
+ [56206] = true, [66506] = true, [32869] = true, [54001] = true,
+ [56079] = true, [32259] = true, [32870] = true, [56208] = true,
+ [32807] = true, [32871] = true, [26873] = true, [31061] = true,
+ [32872] = true, [42591] = true, [46779] = true, [56530] = true,
+ [42592] = true, [31062] = true, [56083] = true, [32874] = true,
+ [56531] = true, [31063] = true, [56085] = true, [38503] = true,
+ [56086] = true, [28938] = true, [38504] = true, [31064] = true,
+ [31096] = true, [55384] = true, [25278] = true, [68253] = true,
+ [43493] = true, [26925] = true, [31065] = true, [46403] = true,
+ [53852] = true, [53916] = true, [39722] = true, [25615] = true,
+ [28924] = true, [26926] = true, [53853] = true, [36526] = true,
+ [31098] = true, [55388] = true, [46405] = true, [53854] = true,
+ [39724] = true, [55389] = true, [26927] = true, [31051] = true,
+ [53919] = true, [39725] = true, [55390] = true, [53856] = true,
+ [53920] = true, [53952] = true, [26880] = true, [53857] = true,
+ [31052] = true, [34069] = true, [25490] = true, [55393] = true,
+ [39451] = true, [53956] = true, [44794] = true, [36524] = true,
+ [55395] = true, [38068] = true, [28944] = true, [53957] = true,
+ [31066] = true, [31082] = true, [66428] = true, [26909] = true,
+ [55396] = true, [31097] = true, [25284] = true, [56084] = true,
+ [62941] = true, [66431] = true, [53894] = true, [53958] = true,
+ [58146] = true, [31099] = true, [47053] = true, [31067] = true,
+ [28917] = true, [26903] = true, [36525] = true, [66503] = true,
+ [56197] = true, [47054] = true, [53961] = true, [39715] = true,
+ [31092] = true, [53960] = true, [31077] = true, [31101] = true,
+ [39719] = true, [55399] = true, [31113] = true, [32808] = true,
+ [53917] = true, [63743] = true, [39720] = true, [39721] = true,
+ [42590] = true, [58149] = true, [56199] = true, [47056] = true,
+ [28950] = true, [47280] = true, [32809] = true, [31072] = true,
+[25318] = true, [66429] = true, [62242] = true,
+---------------------------------------------------------------------------------------
+
+---------------------------------------------------------------------------------------
+---COOKING
+---------------------------------------------------------------------------------------
+[62050]= true, [22761]= true, [62051]= true, [8607]= true,
+[18238]= true, [6413]= true, [6417]= true, [42296]= true,
+[45557]= true, [6501]= true, [45558]= true, [18239]= true,
+ [7752]= true, [7828]= true, [45560]= true, [64358]= true,
+ [57421]= true, [45561]= true, [13028]= true, [2543]= true,
+ [2545]= true, [25659]= true, [58512]= true, [45565]= true,
+ [42305]= true, [45566]= true, [62350]= true, [7753]= true,
+ [45695]= true, [9513]= true, [18244]= true, [20626]= true,
+ [45569]= true, [43779]= true, [18245]= true, [45571]= true,
+ [18246]= true, [37836]= true, [57433]= true, [20916]= true,
+ [58521]= true, [18247]= true, [57435]= true, [7754]= true,
+ [53056]= true, [58523]= true, [57437]= true, [57438]= true,
+ [58525]= true, [45570]= true, [2538]= true, [2540]= true,
+ [2548]= true, [33290]= true, [45562]= true, [15906]= true,
+ [18241]= true, [45559]= true, [45551]= true, [57443]= true,
+ [58527]= true, [43758]= true, [58528]= true, [8238]= true,
+ [7751]= true, [7755]= true, [43761]= true, [7827]= true,
+ [45552]= true, [45553]= true,
+ ---------------------------------------------------------------------------------------
+
+  ---------------------------------------------------------------------------------------
+  ---BLACKSMITHING
+   ---------------------------------------------------------------------------------------
+ [10015] = true, [55202] = true, [16726] = true, [24399] = true,
+[15293] = true, [32655] = true, [3320] = true, [40033] = true,
+[34545] = true, [61010] = true, [16639] = true, [3115] = true,
+[3116] = true, [3117] = true, [16648] = true, [40034] = true,
+ [9920] = true, [9928] = true, [29558] = true, [55839] = true,
+ [9964] = true, [7818] = true, [55732] = true, [29694] = true,
+ [3326] = true, [9950] = true, [59405] = true, [12260] = true,
+ [16983] = true, [16991] = true, [23650] = true, [16640] = true,
+ [2741] = true, [3513] = true, [3497] = true, [8768] = true,
+ [19666] = true, [2662] = true, [2663] = true, [20201] = true,
+ [16664] = true, [15294] = true, [3496] = true, [16645] = true,
+ [29569] = true, [2737] = true, [14380] = true, [16992] = true,
+ [36125] = true, [19667] = true, [22757] = true, [16665] = true,
+ [59406] = true, [2738] = true, [2739] = true, [2740] = true,
+ [24913] = true, [9933] = true, [20873] = true, [36126] = true,
+ [40035] = true, [8880] = true, [23636] = true, [3292] = true,
+ [3293] = true, [21161] = true, [32656] = true, [19668] = true,
+ [9921] = true, [7222] = true, [3319] = true, [15295] = true,
+ [20874] = true, [20890] = true, [3337] = true, [34546] = true,
+ [16970] = true, [16978] = true, [61008] = true, [7224] = true,
+ [11454] = true, [19669] = true, [55656] = true, [16667] = true,
+ [16731] = true, [61009] = true, [9926] = true, [16984] = true,
+ [21913] = true, [40036] = true, [9974] = true, [32657] = true,
+ [32285] = true, [23638] = true, [10011] = true, [36131] = true,
+ [27830] = true,  [32284] = true, [16732] = true, [15292] = true,
+ [15296] = true, [38478] = true, [20876] = true, [38475] = true,
+ [23653] = true, [3325] = true, [14379] = true,  [29729] = true,
+ [2661] = true,  [29728] = true, [16655] = true, [16993] = true,
+ [3491] = true, [3494] = true, [3501] = true, [9959] = true,
+ [9983] = true, [36262] = true, [10003] = true, [10007] = true,
+  ---------------------------------------------------------------------------------------
+
+  ---------------------------------------------------------------------------------------
+----INSCRIPTION
+  ---------------------------------------------------------------------------------------
+  [58315] = true, [58331] = true, [58347] = true, [56974] = true, [56990] = true,
+[64256] = true, [64304] = true, [57166] = true, [57709] = true, [57214] = true,
+ [57230] = true, [50603] = true, [57262] = true, [59338] = true, [58332] = true,
+ [56959] = true, [56975] = true, [56991] = true, [57007] = true, [57023] = true,
+ [53462] = true, [64257] = true, [64273] = true, [64289] = true, [57151] = true,
+ [57167] = true, [57183] = true, [57710] = true, [57215] = true, [57247] = true,
+ [50620] = true, [58301] = true, [59339] = true, [58333] = true, [59387] = true,
+ [52840] = true, [59499] = true, [56960] = true, [56976] = true, [57008] = true,
+ [57024] = true, [64258] = true, [64274] = true, [57168] = true, [57184] = true,
+ [61288] = true, [57216] = true, [57232] = true, [58286] = true, [58302] = true,
+ [59340] = true, [48114] = true, [64051] = true, [59484] = true, [59500] = true,
+ [56961] = true, [56977] = true, [57009] = true, [57025] = true, [61177] = true,
+ [64259] = true, [57121] = true, [64291] = true, [57153] = true, [57169] = true,
+ [57185] = true, [57712] = true, [57217] = true, [57233] = true, [58287] = true,
+ [58303] = true, [58319] = true, [56946] = true, [56978] = true, [56994] = true,
+ [57010] = true, [57026] = true, [64260] = true, [57122] = true, [57154] = true,
+ [57170] = true, [57186] = true, [57713] = true, [57218] = true, [57234] = true,
+ [57266] = true, [59326] = true, [58320] = true, [58336] = true, [59486] = true,
+ [59502] = true, [56963] = true, [56995] = true, [57011] = true, [57027] = true,
+ [64261] = true, [64277] = true, [57155] = true, [57187] = true, [57714] = true,
+ [57219] = true, [57235] = true, [58289] = true, [58305] = true, [58321] = true,
+ [58337] = true, [69385] = true, [57243] = true, [64314] = true, [64313] = true,
+ [56958] = true, [59487] = true, [59503] = true, [58288] = true, [56980] = true,
+ [56996] = true, [57012] = true, [57028] = true, [59501] = true, [56948] = true,
+ [57264] = true, [64246] = true, [64262] = true, [57124] = true, [64294] = true,
+ [57156] = true, [57172] = true, [57188] = true, [57715] = true, [57220] = true,
+ [57236] = true, [57268] = true, [58306] = true, [58322] = true, [58338] = true,
+ [48247] = true, [57133] = true, [57270] = true, [57131] = true, [57129] = true,
+ [50604] = true, [59488] = true, [59504] = true, [56965] = true, [56981] = true,
+ [56997] = true, [57013] = true, [57029] = true, [64280] = true, [57114] = true,
+ [64286] = true, [58299] = true, [57125] = true, [64295] = true, [64311] = true,
+ [57164] = true, [57189] = true, [57716] = true, [57221] = true, [57237] = true,
+ [57269] = true, [58307] = true, [58323] = true, [58339] = true, [64307] = true,
+ [57119] = true, [57246] = true, [68166] = true, [64282] = true, [57250] = true,
+ [59489] = true, [56957] = true, [56982] = true, [56998] = true, [57014] = true,
+ [57117] = true, [64305] = true, [61677] = true, [52843] = true, [57126] = true,
+ [64296] = true, [57158] = true, [64310] = true, [57190] = true, [56956] = true,
+ [57238] = true, [60336] = true, [58308] = true, [58324] = true, [58340] = true,
+ [64315] = true, [56949] = true, [56950] = true, [64308] = true, [56955] = true,
+ [59490] = true, [59315] = true, [56983] = true, [56999] = true, [64267] = true,
+ [57031] = true, [56954] = true, [64276] = true, [57249] = true, [64249] = true,
+ [56953] = true, [57127] = true, [64297] = true, [57159] = true, [64275] = true,
+ [57191] = true, [57207] = true, [57223] = true, [57239] = true, [50612] = true,
+ [60337] = true, [57208] = true, [58325] = true, [48121] = true, [56952] = true,
+ [56947] = true, [56951] = true, [64268] = true, [57123] = true, [59475] = true,
+ [59491] = true, [56968] = true, [56984] = true, [57000] = true, [48248] = true,
+ [58565] = true, [58317] = true, [64266] = true, [57252] = true, [64250] = true,
+ [57112] = true, [57128] = true, [64298] = true, [57160] = true, [58316] = true,
+ [57703] = true, [57719] = true, [57224] = true, [57240] = true, [57272] = true,
+ [58310] = true, [58326] = true, [58342] = true, [57201] = true, [56945] = true,
+[57200] = true, [56944] = true, [57711] = true, [56985] = true, [57001] = true,
+[57199] = true, [57033] = true, [56943] = true, [57198] = true, [64251] = true,
+[57113] = true, [64283] = true, [64299] = true, [57161] = true, [57197] = true,
+[57704] = true, [57209] = true, [57225] = true, [57241] = true, [50614] = true,
+[57273] = true, [58311] = true, [58327] = true, [58343] = true, [52738] = true,
+[57196] = true, [64278] = true, [57195] = true, [58318] = true, [64284] = true,
+[57006] = true, [64316] = true, [56986] = true, [57002] = true, [59560] = true,
+[57034] = true, [58341] = true, [57192] = true, [64252] = true, [67600] = true,
+ [57130] = true, [64300] = true, [57162] = true, [57244] = true,   [57194] = true,
+ [57210] = true, [57226] = true, [50599] = true, [57258] = true, [58296] = true,
+ [58312] = true, [58328] = true, [58344] = true, [52739] = true, [58298] = true,
+ [57274] = true, [57265] = true, [57251] = true, [59478] = true, [56971] = true,
+ [56987] = true, [57003] = true, [57019] = true, [57035] = true, [57259] = true,
+ [57263] = true, [57271] = true, [64253] = true, [57115] = true, [64285] = true,
+ [57242] = true, [57163] = true, [57120] = true, [57706] = true, [57211] = true,
+ [57227] = true, [50600] = true, [50616] = true, [58297] = true, [58313] = true,
+ [58329] = true, [58345] = true, [50602] = true, [57248] = true, [59559] = true,
+ [57157] = true, [57257] = true, [64309] = true, [64317] = true, [56972] = true,
+ [56988] = true, [57004] = true, [57020] = true, [57036] = true, [62162] = true,
+ [57030] = true, [64254] = true, [57116] = true, [57132] = true, [64302] = true,
+ [64318] = true, [64270] = true, [57707] = true, [57212] = true, [57228] = true,
+ [50601] = true, [57260] = true, [57276] = true, [58314] = true, [58330] = true,
+ [58346] = true, [45382] = true, [57267] = true, [57275] = true, [64312] = true,
+ [64279] = true, [50598] = true, [59480] = true, [59496] = true, [56973] = true,
+ [56989] = true, [57005] = true, [57021] = true, [50619] = true, [50618] = true,
+ [65245] = true, [50617] = true, [64255] = true, [64271] = true, [64287] = true,
+ [64303] = true, [57165] = true, [57181] = true, [57708] = true, [57213] = true,
+ [57229] = true, [57245] = true, [57261] = true, [57277] = true, [57253] = true,
+   ---------------------------------------------------------------------------------------
+
+   ---------------------------------------------------------------------------------------
+----ENCHANTING
+   ---------------------------------------------------------------------------------------
+   [46578] = true, [25125] = true, [13612] = true, [13620] = true, [13628] = true,
+[13640] = true, [13644] = true, [13648] = true, [59625] = true, [13700] = true,
+ [17181] = true, [27920] = true, [27960] = true, [28016] = true, [45765] = true,
+ [14810] = true, [63746] = true, [13836] = true, [20008] = true, [20032] = true,
+ [13868] = true, [13421] = true, [13948] = true, [27905] = true, [27945] = true,
+ [13501] = true, [7786] = true, [7788] = true, [13529] = true, [32664] = true,
+ [44506] = true, [25127] = true, [20025] = true, [20033] = true, [13617] = true,
+ [64579] = true, [60619] = true, [13657] = true, [13693] = true, [27914] = true,
+ [44555] = true, [27954] = true, [27962] = true, [14807] = true, [32665] = true,
+ [7421] = true, [13817] = true, [25072] = true, [44492] = true, [44524] = true,
+ [7443] = true, [44556] = true, [25128] = true, [20026] = true, [7457] = true,
+ [13378] = true, [34001] = true, [13917] = true, [13933] = true, [13937] = true,
+ [13941] = true, [44621] = true, [28003] = true, [28027] = true, [13522] = true,
+ [13538] = true, [25081] = true, [44494] = true, [20011] = true, [25129] = true,
+ [44590] = true, [47672] = true, [20051] = true, [13622] = true, [13626] = true,
+ [69412] = true, [60623] = true, [44383] = true, [13698] = true, [13702] = true,
+ [23804] = true, [44623] = true, [28004] = true, [28028] = true, [14293] = true,
+ [32667] = true, [13822] = true, [25082] = true, [44576] = true, [20028] = true,
+ [20036] = true, [13890] = true, [13898] = true, [60609] = true, [59619] = true,
+ [47898] = true, [7745] = true, [27957] = true, [13503] = true, [34006] = true,
+ [7793] = true, [7795] = true, [59636] = true, [25083] = true, [20029] = true,
+ [13631] = true, [13655] = true, [7861] = true, [7863] = true, [62256] = true,
+ [13695] = true, [13858] = true, [44483] = true, [27968] = true, [7857] = true,
+ [27967] = true, [42615] = true, [27958] = true, [42613] = true, [25084] = true,
+ [20017] = true, [33992] = true, [34008] = true, [13663] = true, [60653] = true,
+ [44528] = true, [14809] = true, [27961] = true, [47901] = true, [7418] = true,
+ [7420] = true, [44488] = true, [7426] = true, [44616] = true, [13841] = true,
+ [44596] = true, [17180] = true, [7454] = true, [33993] = true, [34009] = true,
+ [27950] = true, [20031] = true, [13915] = true, [47900] = true, [13943] = true,
+ [13947] = true, [13945] = true, [13464] = true, [27927] = true, [7771] = true,
+ [20014] = true, [20030] = true, [27947] = true, [33994] = true, [28022] = true,
+ [60692] = true, [25130] = true, [34005] = true, [13794] = true, [7748] = true,
+ [44588] = true, [15596] = true, [7776] = true, [44584] = true, [13607] = true,
+ [13653] = true, [20020] = true,
+    ---------------------------------------------------------------------------------------
+
+    ---------------------------------------------------------------------------------------
+---TAILORING
+    ---------------------------------------------------------------------------------------
+	[12055] = true, [12059] = true, [12071] = true, [46131] = true, [23664] = true,
+[31433] = true, [31441] = true, [7624] = true, [26403] = true, [24902] = true,
+ [22866] = true, [56001] = true, [18411] = true, [18419] = true, [18451] = true,
+ [28208] = true, [6686] = true, [8766] = true, [23665] = true, [8786] = true,
+ [26747] = true, [56002] = true, [26763] = true, [26779] = true, [31434] = true,
+ [31450] = true, [60969] = true, [28480] = true, [22867] = true, [56003] = true,
+ [18404] = true, [18412] = true, [18420] = true, [12044] = true, [63924] = true,
+ [12056] = true, [12064] = true, [12080] = true, [12084] = true, [23666] = true,
+ [56004] = true, [26780] = true, [31459] = true, [7892] = true, [60971] = true,
+ [28481] = true, [22868] = true, [20848] = true, [56005] = true, [18405] = true,
+ [19435] = true, [26086] = true, [18437] = true, [18453] = true, [27659] = true,
+ [28210] = true, [40021] = true, [23667] = true, [26773] = true, [26781] = true,
+ [26759] = true, [8774] = true, [31460] = true, [24903] = true, [3755] = true,
+ [37882] = true, [3757] = true, [3758] = true, [50194] = true, [18446] = true,
+ [6692] = true, [28482] = true, [22869] = true, [18439] = true, [20849] = true,
+ [18440] = true, [2389] = true, [56007] = true, [18455] = true, [6521] = true,
+ [18445] = true, [18406] = true, [18414] = true, [18422] = true, [12045] = true,
+ [36318] = true, [18454] = true, [27660] = true, [24091] = true, [12065] = true,
+ [12069] = true, [12077] = true, [12081] = true, [12085] = true, [27724] = true,
+ [12093] = true, [40060] = true, [26087] = true, [26749] = true, [31373] = true,
+ [26750] = true, [26782] = true, [28205] = true, [28209] = true, [36686] = true,
+ [3813] = true, [2394] = true, [7629] = true, [18438] = true, [7633] = true,
+ [40023] = true, [49677] = true, [26407] = true, [18452] = true, [7643] = true,
+ [22870] = true, [26755] = true, [22902] = true, [3869] = true, [55993] = true,
+ [8789] = true, [3839] = true, [3841] = true, [3844] = true, [18407] = true,
+ [18415] = true, [3847] = true, [3848] = true, [3851] = true, [3852] = true,
+ [24092] = true, [3854] = true, [3856] = true, [3857] = true, [8760] = true,
+ [27725] = true, [8776] = true, [8780] = true, [8784] = true, [3865] = true,
+ [55994] = true, [3868] = true, [26783] = true, [3871] = true, [3872] = true,
+ [3873] = true, [31438] = true, [22759] = true, [12091] = true, [8804] = true,
+ [8772] = true, [18560] = true, [18447] = true, [44950] = true, [60993] = true,
+ [55899] = true, [55898] = true, [55995] = true, [2385] = true, [21945] = true,
+ [6688] = true, [12066] = true, [18416] = true, [8465] = true, [12046] = true,
+ [18448] = true, [3915] = true, [24093] = true, [8489] = true, [2386] = true,
+ [12078] = true, [12082] = true, [60994] = true, [55900] = true, [2392] = true,
+ [2393] = true, [23662] = true, [2396] = true, [55996] = true, [2399] = true,
+ [26784] = true, [2402] = true, [2403] = true, [2406] = true, [31431] = true,
+ [3864] = true, [8782] = true, [37884] = true, [37883] = true, [26751] = true,
+ [50647] = true, [8802] = true, [8467] = true, [7893] = true, [40020] = true,
+ [41208] = true, [22813] = true, [41207] = true, [37873] = true, [2387] = true,
+ [55997] = true, [26085] = true, [8799] = true, [27658] = true, [8483] = true,
+ [3914] = true, [18401] = true, [56006] = true, [18441] = true, [18449] = true,
+ [28207] = true, [55769] = true, [18413] = true, [18421] = true, [46129] = true,
+ [2963] = true, [2964] = true, [12061] = true, [12086] = true, [23663] = true,
+ [26745] = true, [55998] = true, [3863] = true, [8764] = true, [31440] = true,
+ [31448] = true, [12089] = true, [6695] = true, [40024] = true, [60990] = true,
+ [50644] = true, [8793] = true, [46130] = true, [24901] = true, [3870] = true,
+ [31437] = true, [44958] = true, [55999] = true, [3845] = true, [6693] = true,
+ [3866] = true, [18456] = true, [18410] = true, [18418] = true, [2397] = true,
+ [18434] = true, [18450] = true,
+     ---------------------------------------------------------------------------------------
+
+     ---------------------------------------------------------------------------------------
+	 ----LEATHERWORKING
+	 ---------------------------------------------------------------------------------------
+[9198] = true, [23704] = true, [60996] = true, [35549] = true, [22921] = true,
+ [50958] = true, [10509] = true, [10525] = true, [19053] = true, [19085] = true,
+ [19101] = true, [2149] = true, [36349] = true, [2153] = true, [60997] = true,
+ [2159] = true, [2163] = true, [2165] = true, [35582] = true, [50959] = true,
+ [46132] = true, [23705] = true, [60998] = true, [22922] = true, [46133] = true,
+ [24121] = true, [19054] = true, [19070] = true, [19086] = true, [19102] = true,
+ [32465] = true, [32481] = true, [22331] = true, [35520] = true, [35584] = true,
+ [9207] = true, [6661] = true, [46134] = true, [23706] = true, [61000] = true,
+ [35521] = true, [35585] = true, [50962] = true, [10518] = true, [39997] = true,
+ [24122] = true, [19055] = true, [19087] = true, [19103] = true, [32466] = true,
+ [32482] = true, [36353] = true, [35522] = true, [35554] = true, [50963] = true,
+ [44953] = true, [46136] = true, [23707] = true, [61002] = true, [35523] = true,
+ [35555] = true, [35587] = true, [50964] = true, [46137] = true, [24123] = true,
+ [19072] = true, [19104] = true, [9064] = true, [9072] = true, [69386] = true,
+ [32499] = true, [36355] = true, [7133] = true, [35524] = true, [35588] = true,
+ [7153] = true, [9208] = true, [46138] = true, [23708] = true, [69388] = true,
+ [35525] = true, [35557] = true, [10487] = true, [10511] = true, [46139] = true,
+ [24124] = true, [19073] = true, [19089] = true, [32468] = true, [32500] = true,
+ [10647] = true, [28472] = true, [35526] = true, [35558] = true, [45117] = true,
+ [60622] = true, [23709] = true, [35527] = true, [3774] = true, [3778] = true,
+ [3780] = true, [40003] = true, [24125] = true, [19058] = true, [19074] = true,
+ [32485] = true, [32501] = true, [36359] = true, [3816] = true, [3818] = true,
+ [28473] = true, [35528] = true, [35560] = true, [9193] = true, [40004] = true,
+ [23710] = true, [8322] = true, [35529] = true, [35561] = true, [50970] = true,
+ [2881] = true, [10520] = true, [40005] = true, [10544] = true, [10552] = true,
+ [10560] = true, [19091] = true, [19107] = true, [32454] = true, [32502] = true,
+ [28474] = true, [35530] = true, [50971] = true, [62448] = true, [7953] = true,
+ [41157] = true, [36074] = true, [24846] = true, [35531] = true, [22928] = true,
+ [28219] = true, [41158] = true, [36075] = true, [32487] = true, [32503] = true,
+ [7126] = true, [9146] = true, [35532] = true, [35564] = true, [9194] = true,
+ [9202] = true, [24655] = true, [36076] = true, [24847] = true, [35533] = true,
+ [5244] = true, [10529] = true, [28220] = true, [19093] = true, [32456] = true,
+ [52733] = true, [2158] = true, [2160] = true, [2162] = true, [2166] = true,
+ [24848] = true, [35535] = true, [35567] = true, [28221] = true, [19094] = true,
+ [44359] = true, [57690] = true, [32457] = true, [32473] = true, [32489] = true,
+ [9147] = true, [35536] = true, [35568] = true, [9195] = true, [41163] = true,
+ [6703] = true, [24849] = true, [20853] = true, [10482] = true, [10490] = true,
+ [28222] = true, [10546] = true, [10554] = true, [41164] = true, [10570] = true,
+ [19095] = true, [57692] = true, [32458] = true, [10650] = true, [35538] = true,
+ [42731] = true, [24850] = true, [20854] = true, [44970] = true, [28223] = true,
+ [19048] = true, [19064] = true, [19080] = true, [57694] = true, [9148] = true,
+ [35540] = true, [35572] = true, [24851] = true, [20855] = true, [45100] = true,
+ [10531] = true, [28224] = true, [57696] = true, [10619] = true, [19081] = true,
+ [22727] = true, [35539] = true, [19079] = true, [10566] = true, [19065] = true,
+ [10574] = true, [19097] = true, [60647] = true, [3753] = true, [9065] = true,
+ [44343] = true, [3763] = true, [3767] = true, [3773] = true, [3775] = true,
+ [3777] = true, [3779] = true, [32455] = true, [24940] = true, [19050] = true,
+ [19082] = true, [23190] = true, [32461] = true, [60999] = true, [3817] = true,
+ [44344] = true, [9149] = true, [35544] = true, [9197] = true, [19077] = true,
+ [9060] = true, [19076] = true, [35573] = true, [40001] = true, [19066] = true,
+ [19090] = true, [19098] = true, [22711] = true, [57699] = true, [9059] = true,
+ [32480] = true, [64661] = true, [10562] = true, [40002] = true, [50936] = true,
+ [6705] = true, [9058] = true, [24703] = true, [22923] = true, [60645] = true,
+ [35577] = true, [2152] = true, [10556] = true, [10572] = true, [44770] = true,
+ [36077] = true, [19059] = true, [19075] = true, [35580] = true, [20648] = true,
+ [2169] = true, [60643] = true, [19088] = true, [6702] = true, [6704] = true,
+ [35543] = true, [7149] = true, [36078] = true, [36079] = true, [23703] = true,
+ [35534] = true, [57701] = true, [46135] = true, [19047] = true, [20649] = true,
+ [40006] = true, [3765] = true, [41156] = true, [3771] = true, [50956] = true,
+ [19061] = true, [20650] = true, [32467] = true, [35537] = true, [22926] = true,
+ [4096] = true, [19062] = true, [44768] = true, [35576] = true, [19063] = true,
+ [9062] = true, [9070] = true, [32495] = true,
+ ---------------------------------------------------------------------------------------
+
+  ---------------------------------------------------------------------------------------
+ -----ALCHEMY
+   ---------------------------------------------------------------------------------------
+  [53898] = true, [28579] = true, [17566] = true, [53771] = true, [7256] = true,
+[53899] = true, [11452] = true, [11460] = true, [11468] = true, [3170] = true,
+ [3172] = true, [3174] = true, [3176] = true, [53836] = true, [53900] = true,
+ [28564] = true, [28580] = true, [54220] = true, [17551] = true, [53773] = true,
+ [53837] = true, [62213] = true, [54221] = true, [53774] = true, [53838] = true,
+ [6617] = true, [53902] = true, [28581] = true, [2331] = true, [2335] = true,
+ [2337] = true, [53775] = true, [53839] = true, [11453] = true, [7836] = true,
+ [24266] = true, [41500] = true, [53904] = true, [53936] = true, [28566] = true,
+ [28582] = true, [3452] = true, [3454] = true, [33732] = true, [17553] = true,
+ [22732] = true, [53777] = true, [53905] = true, [53937] = true, [33733] = true,
+ [62409] = true, [25146] = true, [41502] = true, [53938] = true, [28551] = true,
+ [28567] = true, [28583] = true, [62410] = true, [7181] = true, [17570] = true,
+ [17634] = true, [53779] = true, [7257] = true, [53939] = true, [11478] = true,
+ [17187] = true, [53812] = true, [28552] = true, [28568] = true, [28584] = true,
+ [60366] = true, [57425] = true, [17635] = true, [53781] = true, [60367] = true,
+ [4508] = true, [53782] = true, [24365] = true, [6618] = true, [53942] = true,
+ [28569] = true, [28585] = true, [29688] = true, [57427] = true, [17556] = true,
+ [17572] = true, [17636] = true, [53783] = true, [11479] = true, [7837] = true,
+ [7841] = true, [53784] = true, [24366] = true, [53848] = true, [28554] = true,
+ [28570] = true, [28586] = true, [58868] = true, [33741] = true, [24367] = true,
+ [28555] = true, [28571] = true, [17574] = true, [17638] = true, [7258] = true,
+ [11448] = true, [11456] = true, [11464] = true, [11480] = true, [3171] = true,
+ [3173] = true, [3175] = true, [24368] = true, [28572] = true, [28588] = true,
+ [45061] = true, [66658] = true, [17559] = true, [17575] = true, [66659] = true,
+ [66660] = true, [63732] = true, [28573] = true, [66662] = true, [17560] = true,
+ [2330] = true, [2332] = true, [2334] = true, [66663] = true, [11457] = true,
+ [11465] = true, [11473] = true, [66664] = true, [3449] = true, [3451] = true,
+ [3453] = true, [17561] = true, [17577] = true, [28543] = true, [28575] = true,
+ [7179] = true, [17562] = true, [17578] = true, [7255] = true, [7259] = true,
+ [11458] = true, [11466] = true, [38962] = true, [53776] = true, [12609] = true,
+ [53780] = true, [60893] = true, [58871] = true, [3448] = true, [3450] = true,
+ [3447] = true, [4942] = true, [28576] = true, [15833] = true, [17576] = true,
+ [41503] = true, [60350] = true, [41501] = true, [17563] = true, [42736] = true,
+ [54213] = true, [41458] = true, [6624] = true, [39636] = true, [28577] = true,
+ [32765] = true, [38070] = true, [17564] = true, [17580] = true, [53895] = true,
+ [11451] = true, [39637] = true, [28546] = true, [28562] = true, [28578] = true,
+ [60354] = true, [32766] = true, [17565] = true, [22808] = true, [39639] = true,
+ [60355] = true, [56519] = true,
+  ---------------------------------------------------------------------------------------
+
+  ---------------------------------------------------------------------------------------
+  ----ENGINEERING
+  ---------------------------------------------------------------------------------------
+  [23081] = true, [12586] = true, [12594] = true, [12622] = true, [30347] = true,
+[44391] = true, [30547] = true, [56464] = true, [12754] = true, [12758] = true,
+ [23489] = true, [23082] = true, [8243] = true, [9269] = true, [30316] = true,
+ [30332] = true, [12906] = true, [8339] = true, [26420] = true, [56514] = true,
+ [39971] = true, [12599] = true, [12603] = true, [12607] = true, [43676] = true,
+ [12619] = true, [54998] = true, [30349] = true, [56468] = true, [12755] = true,
+ [12759] = true, [63750] = true, [39973] = true, [56465] = true, [56469] = true,
+ [30318] = true, [30334] = true, [55016] = true, [12903] = true, [54793] = true,
+ [19795] = true, [8895] = true, [19819] = true, [30558] = true, [39895] = true,
+ [23069] = true, [23077] = true, [12596] = true, [30303] = true, [56471] = true,
+ [12624] = true, [19796] = true, [56472] = true, [12760] = true, [63770] = true,
+ [23070] = true, [23078] = true, [61471] = true, [30304] = true, [30312] = true,
+ [12908] = true, [12597] = true, [3930] = true, [24356] = true, [67839] = true,
+ [67326] = true, [56474] = true, [30560] = true, [30568] = true, [30314] = true,
+ [3929] = true, [56475] = true, [19830] = true, [3946] = true, [54736] = true,
+ [30563] = true, [24357] = true, [30337] = true, [12591] = true, [19814] = true,
+ [60866] = true, [12716] = true, [23071] = true, [23079] = true, [12585] = true,
+ [3923] = true, [3925] = true, [30305] = true, [12621] = true, [30329] = true,
+ [3931] = true, [3932] = true, [3933] = true, [3936] = true, [3937] = true,
+ [3938] = true, [3939] = true, [3941] = true, [56473] = true, [3944] = true,
+ [3945] = true, [3947] = true, [54999] = true, [3949] = true, [3950] = true,
+ [26417] = true, [12717] = true, [3954] = true, [3955] = true, [3957] = true,
+ [3958] = true, [3961] = true, [3962] = true, [3963] = true, [3965] = true,
+ [3966] = true, [3967] = true, [3968] = true, [3969] = true, [3971] = true,
+ [3972] = true, [3973] = true, [7430] = true, [3977] = true, [3978] = true,
+ [3979] = true, [19790] = true, [23080] = true, [12620] = true, [30309] = true,
+ [30346] = true, [12905] = true, [41307] = true, [8334] = true, [56460] = true,
+ [56476] = true, [12718] = true, [26418] = true, [19791] = true, [3960] = true,
+ [19815] = true, [13240] = true, [19831] = true, [30570] = true, [19799] = true,
+ [30306] = true, [30310] = true, [26011] = true, [36954] = true, [3919] = true,
+ [3920] = true, [19800] = true, [12617] = true, [30311] = true, [56463] = true,
+---------------------------------------------------------------------------------------
+}
+
+local function LoadRecipe()
+	local recipe_list = addon.recipe_list
+
+	if (not recipe_list) then
+		if (addon.db.profile.autoloaddb) then
+			local dbloaded
+			dbloaded, recipe_list = addon:InitRecipeData()
+
+			if (not dbloaded) then return end
+
+			for idx, prof in pairs(PROFESSIONS) do
+				addon:AddRecipeData(prof)
+			end
+		else
+			addon:Print(L["DATAMINER_NODB_ERROR"])
+			return
+		end
+	else
+		-- Recipe DB exists, we just need to populate it now
+		if (addon.db.profile.autoloaddb) then
+			for idx, prof in pairs(PROFESSIONS) do
+				addon:AddRecipeData(prof)
+			end
+		end
+	end
+	return recipe_list
+
+end
+
+-------------------------------------------------------------------------------
+-- Creates a reverse lookup for a recipe list
+-------------------------------------------------------------------------------
+local CreateReverseLookup
+do
+	local reverse_lookup = {}
+
+	function CreateReverseLookup(recipe_list)
+		if (not recipe_list) then
+			addon:Print(L["DATAMINER_NODB_ERROR"])
+			return
+		end
+
+		twipe(reverse_lookup)
+
+		for i in pairs(recipe_list) do
+			--if t[recipe_list[i]["Name"]] then addon:Print("Dupe: " .. i) end
+			reverse_lookup[recipe_list[i]["Name"]] = i
+		end
+
+		return reverse_lookup
+	end
+
+end
+
+-------------------------------------------------------------------------------
+-- Tooltip for data-mining.
+-------------------------------------------------------------------------------
+local ARLDatamineTT = CreateFrame("GameTooltip", "ARLDatamineTT", UIParent, "GameTooltipTemplate")
+
+do
+	-- Tables used in all the Scan functions within this do block. -Torhal
+	local info, output = {}, {}
+
+	--- Function to compare the skill levels of a trainers recipes with those in the ARL database.
+	-- @name AckisRecipeList:ScanSkillLevelData
+	-- @param autoscan True when autoscan is enabled in preferences, it will surpress output letting you know when a scan has occured.
+	-- @return Does a comparison of the information in your internal ARL database, and those items which are available on the trainer.  Compares the skill levels between the two.
+	function addon:ScanSkillLevelData(autoscan)
+		if not IsTradeskillTrainer() then
+			if not autoscan then
+				self:Print(L["DATAMINER_SKILLLEVEL_ERROR"])
+			end
+			return
+		end
+		local recipe_list = LoadRecipe()	-- Get internal database
+
+		if not recipe_list then
+			self:Print(L["DATAMINER_NODB_ERROR"])
+			return
+		end
+		-- Get the initial trainer filters
+		local avail = GetTrainerServiceTypeFilter("available")
+		local unavail = GetTrainerServiceTypeFilter("unavailable")
+		local used = GetTrainerServiceTypeFilter("used")
+
+		-- Clear the trainer filters
+		SetTrainerServiceTypeFilter("available", 1)
+		SetTrainerServiceTypeFilter("unavailable", 1)
+		SetTrainerServiceTypeFilter("used", 1)
+
+		twipe(info)
+
+		-- Get the skill levels from the trainer
+		for i = 1, GetNumTrainerServices(), 1 do
+			local name = GetTrainerServiceInfo(i)
+			local _, skilllevel = GetTrainerServiceSkillReq(i)
+
+			if not skilllevel then
+				skilllevel = 0
+			end
+			info[name] = skilllevel
+		end
+		local found = false
+
+		twipe(output)
+
+		for i in pairs(recipe_list) do
+			local i_name = recipe_list[i]["Name"]
+
+			if info[i_name] and info[i_name] ~= recipe_list[i]["Level"] then
+				found = true
+				tinsert(output, L["DATAMINER_SKILLELVEL"]:format(i_name, recipe_list[i]["Level"], info[i_name]))
+			end
+		end
+		tinsert(output, "Trainer Skill Level Scan Complete.")
+
+		if found then
+			self:DisplayTextDump(nil, nil, tconcat(output, "\n"))
+		end
+		-- Reset the filters to what they were before
+		SetTrainerServiceTypeFilter("available", avail or 0)
+		SetTrainerServiceTypeFilter("unavailable", unavail or 0)
+		SetTrainerServiceTypeFilter("used", used or 0)
+	end
+
+	local teach, noteach = {}, {}
+
+	--- Function to compare which recipes are available from a trainer and compare with the internal ARL database.
+	-- @name AckisRecipeList:ScanTrainerData
+	-- @param autoscan True when autoscan is enabled in preferences, it will surpress output letting you know when a scan has occured.
+	-- @return Does a comparison of the information in your internal ARL database, and those items which are available on the trainer.
+	-- Compares the acquire information of the ARL database with what is available on the trainer.
+	function addon:ScanTrainerData(autoscan)
+		if not (UnitExists("target") and (not UnitIsPlayer("target")) and (not UnitIsEnemy("player", "target"))) then	-- Make sure the target exists and is a NPC
+			if not autoscan then
+				self:Print(L["DATAMINER_TRAINER_NOTTARGETTED"])
+			end
+			return
+		end
+		local targetname = UnitName("target")	-- Get its name
+		local targetID = tonumber(string.sub(UnitGUID("target"), -12, -7), 16)	-- Get the NPC ID
+
+		if not IsTradeskillTrainer() then		-- Are we at a trade skill trainer?
+			if not autoscan then
+				self:Print(L["DATAMINER_SKILLLEVEL_ERROR"])
+			end
+			return
+		end
+		local recipe_list = LoadRecipe()	-- Get internal database
+
+		if not recipe_list then
+			self:Print(L["DATAMINER_NODB_ERROR"])
+			return
+		end
+
+		-- Get the initial trainer filters
+		local avail = GetTrainerServiceTypeFilter("available")
+		local unavail = GetTrainerServiceTypeFilter("unavailable")
+		local used = GetTrainerServiceTypeFilter("used")
+
+		-- Clear the trainer filters
+		SetTrainerServiceTypeFilter("available", 1)
+		SetTrainerServiceTypeFilter("unavailable", 1)
+		SetTrainerServiceTypeFilter("used", 1)
+
+		if (GetNumTrainerServices() == 0) then
+			self:Print("Warning: Trainer is bugged, reporting 0 trainer items.")
+		end
+		twipe(info)
+
+		-- Get all the names of recipes from the trainer
+		for i = 1, GetNumTrainerServices(), 1 do
+			local name = GetTrainerServiceInfo(i)
+			info[name] = true
+		end
+		twipe(teach)
+		twipe(noteach)
+		twipe(output)
+
+		-- Dump out trainer info
+		tinsert(output, L["DATAMINER_TRAINER_INFO"]:format(targetname, targetID))
+
+		local teachflag = false
+		local noteachflag = false
+
+		for i in pairs(recipe_list) do
+			local i_name = recipe_list[i]["Name"]
+			local acquire = recipe_list[i]["Acquire"]
+			local flags = recipe_list[i]["Flags"]
+
+			-- If the trainer teaches this recipe
+			if info[i_name] then
+				local found = false
+
+				-- Parse acquire info
+				for j in pairs(acquire) do
+					if (acquire[j]["Type"] == 1) then
+						if (acquire[j]["ID"] == targetID) then
+							found = true
+						end
+					end
+				end
+
+				if (not found) then
+					tinsert(teach, i)
+					teachflag = true
+
+					if (not flags[3]) then
+						tinsert(output, ": Trainer flag needs to be set.")
+					end
+				end
+				-- Trainer does not teach this recipe
+			else
+				local found = false
+				-- Parse acquire info
+				for j in pairs(acquire) do
+					if (acquire[j]["Type"] == 1) then
+						if (acquire[j]["ID"] == targetID) then
+							found = true
+						end
+					end
+				end
+
+				if found then
+					noteachflag = true
+					tinsert(noteach, i)
+				end
+			end
+		end
+
+		if teachflag then
+			tinsert(output, "Missing entries (need to be added):")
+			tsort(teach)
+
+			for i in ipairs(teach) do
+				tinsert(output, L["DATAMINER_TRAINER_TEACH"]:format(teach[i], recipe_list[teach[i]]["Name"]))
+			end
+		end
+
+		if noteachflag then
+			tinsert(output, "Extra entries (need to be removed):")
+			tsort(noteach)
+
+			for i in ipairs(noteach) do
+				tinsert(output, L["DATAMINER_TRAINER_NOTTEACH"]:format(noteach[i], recipe_list[noteach[i]]["Name"]))
+			end
+		end
+		tinsert(output, "Trainer Acquire Scan Complete.")
+		tinsert(output, "If you're doing an engineering scan,  there may be some goggles listed as extra.  These goggles ONLY show up for those classes who can make them,  so they may be false positives.")
+
+		if teachflag or noteachflag then
+			self:DisplayTextDump(nil, nil, tconcat(output, "\n"))
+		end
+		-- Reset the filters to what they were before
+		SetTrainerServiceTypeFilter("available", avail or 0)
+		SetTrainerServiceTypeFilter("unavailable", unavail or 0)
+		SetTrainerServiceTypeFilter("used", used or 0)
+	end
+end	-- do
+
+--- Generates tradeskill links for all professions so you can scan them for completeness.
+-- @name AckisRecipeList:GenerateLinks
+-- @return Generates tradeskill links with all recipes.  Used for testing to see if a recipe is missing from the database or not.
+function addon:GenerateLinks()
+	-- This code adopted from Gnomish Yellow Pages with permission
+
+	local guid = UnitGUID("player")
+	local playerGUID = gsub(guid, "0x0+", "")
+
+	-- Listing of all tradeskill professions
+	local tradelist = {51304, 51300, 51313, 51306, 45363, 51311, 51302, 51309, 51296, 45542}
+
+--[[
+	local encodingLength = floor((#recipeList+5) / 6)
+
+	local encodedString = string.rep("/", encodingLength)
+]]--
+	local bitmap = {}
+	bitmap[45542] = "8bffAA" -- First Aid (6)
+	--bitmap[51296] = "2/7///7///9////7//////////g+/B" -- Cooking (30)
+	bitmap[51296] = "2/7///7///9////7//////////gC8/B" -- Cooking
+	--bitmap[51306] = "4/////////////3nFA+///9+/P7//f//n//9dgdJgHA87/3f/TolD" -- Engineering (53)
+	bitmap[51306] = "4/////////////3nFA+///9+/P7//f//n//9dgdJgHA87/3f/Tol3B" -- Engineering
+	--bitmap[51302] = "e+//////////////v//P+f///3///7/9f9//////////f///////HQ5+////B4//+///////5///////PA/Eg//" -- LW (87)
+	bitmap[51302] = "e+//////////////v//P+f///3///7/9f9//////////f///////HQ5+////B4//+//////////////////HgAAw/P" -- Leatherworking
+	--bitmap[51302] = string.rep("/", 87)
+	--bitmap[51304] = "2//v//////f////3//v///////6//////////9////X" -- Alchemy (43)
+	bitmap[51304] = "2//v//////f////3//v///////5//////////9/////v" -- Alchemy
+	--bitmap[51304] = string.rep("/", 43) -- Alchemy (43)
+	--bitmap[51300] = string.rep("/", 85) -- Blacksmithing (85)
+	--bitmap[51309] = string.rep("/", 71) -- Tailoring (71)
+	bitmap[51309] = "YIEMCCgAicAjAGIAiQKAACBRxgBEAAAAAAAAA45BAqBQBAKAAAEAAAIICLHqiAuKAAAEABAAA"
+	--bitmap[51311] = string.rep("/", 83) -- JC 83
+	bitmap[51311] = "8fJRMqkmRwipmMHAQAACEAAQw/AgDkMJIAQgCA4AAwHMKFr/TCEx6tip+z7WyNsRWrnhm7wGPAAOgAUEALFAAWJWfqsBCAB"
+	--bitmap[45363] = string.rep("/", 74) -- Inscription (74)
+	--bitmap[51313] = "4//////////7///////////w//++/9vn7///////3P/t/n//BAB" -- Enchanting
+	--bitmap[51313] = "4//////////7///////////w//++/9vn7///////3P/t/n//BAD" -- Enchanting (51)
+	bitmap[51313] = "4//////////7///////////w//+//9/n7///////3f//////ZsD" -- Enchanting
+	--bitmap[51313] = string.rep("/", 51) -- Enchanting (51)
+
+	for i in pairs(tradelist) do
+
+		local tradeName = GetSpellInfo(tradelist[i])
+		local tradelink = {}
+		tradelink[1] = "|cffffd000|Htrade:"
+		tradelink[2] = tradelist[i]
+		tradelink[3] = ":450:450:"
+		tradelink[4] = playerGUID
+		tradelink[5] = ":"
+		tradelink[6] = bitmap[tradelist[i]]
+		tradelink[7] = "|h["
+		tradelink[8] = tradeName
+		tradelink[9] = "]|h|r"
+
+		if (bitmap[tradelist[i]]) then
+			self:Print(tconcat(tradelink, ""))
+		else
+			self:Print("I don't have the bitmap for " .. tradeName .. " yet (Professions were updated in 3.2.  If you want to help,  talk to me on IRC.")
+		end
+		-- /script DEFAULT_CHAT_FRAME:AddMessage(gsub(GetTradeSkillListLink(), "\124", "\124\124"))
+	end
+
+end
+
+-------------------------------------------------------------------------------
+--- Scans the items in the specified profession
+-------------------------------------------------------------------------------
+do
+	local ORDERED_PROFESSIONS = {
+		strlower(PROFESSIONS.Alchemy), 		-- 1 Alchemy
+		strlower(PROFESSIONS.Blacksmithing), 	-- 2 Blacksmithing
+		strlower(PROFESSIONS.Cooking), 		-- 3 Cooking
+		strlower(PROFESSIONS.Enchanting), 	-- 4 Enchanting
+		strlower(PROFESSIONS.Engineering), 	-- 5 Engineering
+		strlower(PROFESSIONS.FirstAid), 		-- 6 First Aid
+		strlower(PROFESSIONS.Inscription), 	-- 7 Inscription
+		strlower(PROFESSIONS.Jewelcrafting), 	-- 8 Jewelcrafting
+		strlower(PROFESSIONS.Leatherworking), 	-- 9 Leatherworking
+		strlower(PROFESSIONS.Runeforging), 	-- 10 Runeforging
+		strlower(PROFESSIONS.Smelting), 		-- 11 Smelting
+		strlower(PROFESSIONS.Tailoring), 	-- 12 Tailoring
+	}
+	local recipe_list = {}
+	local output = {}
+
+	local function ProfessionScan(prof_name)
+		local master_list = LoadRecipe()
+
+		if not master_list then
+			addon:Print(L["DATAMINER_NODB_ERROR"])
+			return
+		end
+		twipe(recipe_list)
+
+		for i in pairs(master_list) do
+			local prof = strlower(master_list[i]["Profession"])
+
+			if prof and prof == prof_name then
+				recipe_list[i] = master_list[i]
+			end
+		end
+		twipe(output)
+
+		-- Parse the entire recipe database
+		for i in pairs(recipe_list) do
+			local ttscantext = addon:TooltipScanRecipe(i, false, true)
+
+			if (ttscantext) then
+				tinsert(output, ttscantext)
+			end
+		end
+		addon:DisplayTextDump(nil, nil, tconcat(output, "\n"))
+		ARLDatamineTT:Hide()
+	end
+
+	--- Parses all recipes for a specified profession, scanning their tool tips.
+	-- @name AckisRecipeList:ScanProfession
+	-- @usage AckisRecipeList:ScanProfession("first aid")
+	-- @param prof_name The profession name or the spell ID of it, which you wish to scan.
+	-- @return Recipes in the given profession have their tooltips scanned.
+	function addon:ScanProfession(prof_name)
+		if (type(prof_name) == "number") then
+			prof_name = GetSpellInfo(prof_name)
+		end
+
+		local found = false
+		prof_name = strlower(prof_name)
+
+		local scan_all = prof_name == "all"
+
+		if not scan_all then
+			for idx, name in ipairs(ORDERED_PROFESSIONS) do
+				if prof_name == name then
+					found = true
+					break
+				end
+			end
+
+			if not found then
+				self:Print(L["DATAMINER_NODB_ERROR"])
+				return
+			end
+
+			ProfessionScan(prof_name)
+		else
+			for idx, name in ipairs(ORDERED_PROFESSIONS) do
+				ProfessionScan(name)
+			end
+		end
+	end
+end	-- do
+
+local RECIPE_NAMES = {
+	-- JC
+	["design: "] = true,
+	-- LW or Tailoring
+	["pattern: "] = true,
+	-- Alchemy or Cooking
+	["recipe: "] = true,
+	-- BS
+	["plans: "] = true,
+	-- Enchanting
+	["formula: "] = true,
+	-- Engineering
+	["schematic: "] = true,
+	-- First Aid
+	["manual: "] = true,
+
+	["alchemy: "] = true,
+	["blacksmithing: "] = true,
+	["cooking: "] = true,
+	["enchanting: "] = true,
+	["engineering: "] = true,
+	["first aid: "] = true,
+	["inscription: "] = true,
+	["jewelcrafting: "] = true,
+	["leatherworking: "] = true,
+	["tailoring: "] = true,
+}
+
+--- Scans the items on a vendor, determining which recipes are available if any and compares it with the database entries.
+-- @name AckisRecipeList:ScanVendor
+-- @usage AckisRecipeList:ScanVendor()
+-- @return Obtains all the vendor information on tradeskill recipes and attempts to compare the current vendor with the internal database.
+do
+	local output = {}
+
+	function addon:ScanVendor()
+		if not (UnitExists("target") and (not UnitIsPlayer("target")) and (not UnitIsEnemy("player", "target"))) then	-- Make sure the target exists and is a NPC
+			self:Print(L["DATAMINER_VENDOR_NOTTARGETTED"])
+			return
+		end
+		local recipe_list = LoadRecipe()		-- Get internal database
+
+		if not recipe_list then
+			self:Print(L["DATAMINER_NODB_ERROR"])
+			return
+		end
+		local reverse_lookup = CreateReverseLookup(recipe_list)
+		local targetname = UnitName("target")		-- Get its name
+		local targetID = tonumber(string.sub(UnitGUID("target"), -12, -7), 16)		-- Get the NPC ID
+		local added = false
+
+		twipe(output)
+
+		-- Parse all the items on the merchant
+		for i = 1, GetMerchantNumItems(), 1 do
+			local name, _, _, _, numAvailable = GetMerchantItemInfo(i)
+
+			if name then
+				-- Lets scan recipes only on vendors
+				local matchtext = strmatch(name, "%a+: ")
+				-- Check to see if we're dealing with a recipe
+				if matchtext and RECIPE_NAMES[strlower(matchtext)] then
+					local recipename = gsub(name, "%a+\: ", "")	-- Get rid of the first part of the item
+					local spellid = reverse_lookup[recipename]	-- Find out what spell ID we're using
+
+					-- Do the scan if we have the spell ID
+					if (spellid) then
+						added = true
+						local ttscantext = addon:TooltipScanRecipe(spellid, true, true)
+
+						if (ttscantext) then
+							tinsert(output, ttscantext)
+						end
+						-- Ok now we know it's a vendor, lets check the database to see if the vendor is listed as an acquire method.
+						local acquire = recipe_list[spellid]["Acquire"]
+						local found = false
+
+						for i in pairs(acquire) do
+							local atype = acquire[i]["Type"]
+							-- If the acquire type is a vendor
+							if (((atype == 2) and (acquire[i]["ID"] == targetID))
+							    or ((atype == 6) and (acquire[i]["RepVendor"] == targetID))) then
+								found = true
+							end
+						end
+
+						if (not found) then
+							tinsert(output, "Vendor ID missing from " .. spellid)
+						end
+					else
+						--@debug@
+						added = true
+						tinsert(output, "Spell ID not found for: " .. name)
+						--@end-debug@
+					end
+				end
+			end
+		end
+
+		if added then
+			self:DisplayTextDump(nil, nil, tconcat(output, "\n"))
+		end
+		ARLDatamineTT:Hide()
+	end
+end	-- do
+
+--- Parses all the recipes in the database, and scanning their tooltips.
+-- @name AckisRecipeList:TooltipScanDatabase
+-- @usage AckisRecipeList:TooltipScanDatabase()
+-- @return Entire recipe database has its tooltips scanned.
+do
+	local output = {}
+
+	function addon:TooltipScanDatabase()
+		-- Get internal database
+		local recipe_list = LoadRecipe()
+
+		if (not recipe_list) then
+			self:Print(L["DATAMINER_NODB_ERROR"])
+			return
+		end
+		twipe(output)
+
+		-- Parse the entire recipe database
+		for i in pairs(recipe_list) do
+
+			local ttscantext = addon:TooltipScanRecipe(i, false, true)
+			if (ttscantext) then
+				tinsert(output, ttscantext)
+			end
+		end
+		self:DisplayTextDump(nil, nil, tconcat(output, "\n"))
+	end
+end	-- do
+--- Parses a specific recipe in the database, and scanning its tooltip.
+-- @name AckisRecipeList:TooltipScanRecipe
+-- @param spellid The [[[http://www.wowwiki.com/SpellLink | Spell ID]]] of the recipe being added to the database.
+-- @param is_vendor Boolean to determine if we're viewing a vendor or not.
+-- @param is_largescan Boolean to determine if we're doing a large scan.
+-- @return Recipe has its tooltips scanned.
+do
+
+	---------------------------------------------------------------------------------------------------------
+	----This table, DO_NOT_SCAN, contains itemid's that will not cache on the servers
+	---------------------------------------------------------------------------------------------------------
+
+	local DO_NOT_SCAN = {
+		-------------------------------------------------------------------------------
+		--Leatherworking
+		-------------------------------------------------------------------------------
+		[35214] = true,	[32434] = true,	[15769] = true,
+		[32431] = true,	[32432] = true,	[35215] = true,	[35521] = true,
+		[35520] = true,	[35524] = true,	[35517] = true,	[35528] = true,
+		[35527] = true,	[35523] = true,	[35549] = true,	[35218] = true,
+		[35217] = true,	[35216] = true,	[35546] = true,	[35541] = true, [15756] = true,
+		[15777] = true,  [32433] = true,  [29729] = true,  [29732] = true,   [32744] = true,
+
+		-------------------------------------------------------------------------------
+		--Tailoring
+		-------------------------------------------------------------------------------
+		[14477] = true, [14485] = true, [30281] = true, [14478] = true, [14500] = true,
+		[32439] = true, [14479] = true, [32447] = true, [14480] = true, [32437] = true,
+		[14495] = true, [14505] = true, [35204] = true,  [35205] = true,   [35206] = true,
+
+		-------------------------------------------------------------------------------
+		--Jewelcrafting
+		-------------------------------------------------------------------------------
+		[23130] = true,  [23140] = true, [23137] = true, [23131] = true, [23148] = true,
+		[35538] = true, [35201] = true, [35533] = true, [35200] = true,  [23147] = true,
+		[23135] = true,  [35203] = true,
+
+		-------------------------------------------------------------------------------
+		--Alchemy
+		-------------------------------------------------------------------------------
+		[22925] = true,  [13480] = true,  [13481] = true,   [13493] = true,
+
+		-------------------------------------------------------------------------------
+		--Cooking
+		-------------------------------------------------------------------------------
+		[39644] = true,
+
+		-------------------------------------------------------------------------------
+		--Blacksmithing
+		-------------------------------------------------------------------------------
+		[32441] = true,   [32443] = true,  [12687] = true, [12714] = true,  [12688 ] = true,
+		[35211] = true,  [35209] = true, [35210] = true,    [12706] = true,  [7982] = true,
+
+		-------------------------------------------------------------------------------
+		--Engineering
+		-------------------------------------------------------------------------------
+		[35196] = true,    [21734] = true,  [18292] = true,  [21727] = true,  [21735] = true,  [16053] = true,  [21729] = true,
+		[16047] = true,[21730] = true,[21731] = true,[21732] = true,[4411] = true,   [21733] = true,  [21728] = true,
+
+	}
+
+	local output = {}
+
+	function addon:TooltipScanRecipe(spell_id, is_vendor, is_largescan)
+		local recipe_list = LoadRecipe()
+
+		if not recipe_list then
+			self:Print(L["DATAMINER_NODB_ERROR"])
+			return
+		end
+		local spell_info = recipe_list[spell_id]
+
+		if not spell_info then
+			self:Print(string.format("Spell ID %d does not exist in the database.", tonumber(spell_id)))
+			return
+		end
+		local recipe_name = spell_info["Name"]
+		local game_vers = spell_info["Game"]
+
+		twipe(output)
+
+		if not game_vers then
+			tinsert(output, "No expansion information: " .. tostring(spell_id) .. " " .. recipe_name)
+		elseif game_vers > 2 then
+			tinsert(output, "Expansion information too high: " .. tostring(spell_id) .. " " .. recipe_name)
+		end
+		local Orange = spell_info["Orange"]
+		local Yellow = spell_info["Yellow"]
+		local Green = spell_info["Green"]
+		local Grey = spell_info["Grey"]
+		local SkillLevel = spell_info["Level"]
+
+		if not Orange then
+			tinsert(output, "No skill level information: " .. tostring(spell_id) .. " " .. recipe_name)
+		else
+			-- Highest level is greater than the skill of the recipe
+			if Orange > SkillLevel then
+				tinsert(output, "Skill Level Error (Orange > Skill): " .. tostring(spell_id) .. " " .. recipe_name)
+			end
+			-- Level info is messed up
+			if Orange > Yellow or Orange > Green or Orange > Grey or Yellow > Green or Yellow > Grey or Green > Grey then
+				tinsert(output, "Skill Level Error: " .. tostring(spell_id) .. " " .. recipe_name)
+			end
+		end
+		local recipe_link = spell_info["RecipeLink"]
+
+		if not recipe_link then
+			if spell_info["Profession"] ~= GetSpellInfo(53428) then		-- Lets hide this output for runeforging.
+				self:Print("Missing RecipeLink for ID " .. spell_id .. " - " .. recipe_name .. " (Normal for DK abilities.")
+			end
+			return
+		end
+		ARLDatamineTT:SetOwner(WorldFrame, "ANCHOR_NONE")
+		GameTooltip_SetDefaultAnchor(ARLDatamineTT, UIParent)
+		ARLDatamineTT:SetHyperlink(recipe_link)	-- Link exists, so load the tooltip for scanning
+
+		-- Lets check to see if it's a recipe tooltip
+		local text = strlower(_G["ARLDatamineTTTextLeft1"]:GetText())
+		local match_text = strmatch(text, "%a+: ")
+
+		-- Check to see if we're dealing with a recipe
+		if not RECIPE_NAMES[match_text] then
+			ARLDatamineTT:Hide()
+			return
+		end
+		local reverse_lookup = CreateReverseLookup(recipe_list)
+
+--		tinsert(output, "RECIPE SCAN")
+
+--		for i = 1, ARLDatamineTT:NumLines(), 1 do
+--			local text_l = _G["ARLDatamineTTTextLeft" .. i]:GetText()
+--			local text_r = _G["ARLDatamineTTTextRight" .. i]:GetText()
+--			local text
+
+--			if text_r then
+--				text = text_l .. "(Left) " .. text_r .. "(Right)"
+--			else
+--				text = text_l
+--			end
+
+--			tinsert(output, text)
+--		end
+		self:ScanToolTip(recipe_name, recipe_list, reverse_lookup, is_vendor, false)
+
+		local item_id = SPELL_ITEM[spell_id]
+
+--		tinsert(output, "ITEM SCAN")
+		-- We have a reverse look-up for the item which creates the spell (aka the recipe itself)
+		if item_id then
+			if not DO_NOT_SCAN[item_id] then
+				local incache = GetItemInfo(item_id)
+
+			   if incache then
+
+				ARLDatamineTT:SetHyperlink("item:" .. item_id .. ":0:0:0:0:0:0:0")
+
+--				for i = 1, ARLDatamineTT:NumLines(), 1 do
+--					local text_l = _G["ARLDatamineTTTextLeft" .. i]:GetText()
+--					local text_r = _G["ARLDatamineTTTextRight" .. i]:GetText()
+--					local text
+
+--					if text_r then
+--						text = text_l .. "(Left) " .. text_r .. "(Right)"
+--					else
+--						text = text_l
+--					end
+
+--					tinsert(output, text)
+--				end
+				-- Scan the recipe item (aka pattern)
+				self:ScanToolTip(recipe_name, recipe_list, reverse_lookup, is_vendor, true)
+			else
+				tinsert(output, "Item ID: " .. item_id .. " not in cache.  If you have Querier use /iq " .. item_id)
+			end
+		end
+			-- We are dealing with a recipe that does not have an item to learn it from
+		else
+			-- Lets check the recipe flags to see if we have a data error and the item should exist
+			local flags = spell_info["Flags"]
+
+			if (flags[4] or flags[5] or flags[6]) then
+				tinsert(output, "Spell/Item ID: " .. spell_id .. " does not exist in the SPELL_ITEM table.")
+			end
+		end
+		ARLDatamineTT:Hide()
+
+		-- Add the flag scan to the table if it's not nil
+		local results = self:PrintScanResults()
+
+		if not results then
+			return
+		end
+		tinsert(output, results)
+
+		if is_largescan then
+			return tconcat(output, "\n")
+		else
+			self:Print(tconcat(output, "\n"))
+		end
+	end
+end	-- do
+
+-------------------------------------------------------------------------------
+-- Tooltip-scanning code
+-------------------------------------------------------------------------------
+do
+	local SPECIALTY_TEXT = {
+		["requires spellfire tailoring"] = 26797,
+		["requires mooncloth tailoring"] = 26798,
+		["requires shadoweave tailoring"] = 26801,
+		["requires dragonscale leatherworking"] = 10657,
+		["requires elemental leatherworking"] = 10659,
+		["requires tribal leatherworking"] = 10661,
+		["requires gnomish engineer"] = 20219,
+		["requires goblin engineer"] = 20222,
+		["requires armorsmith"] = 9788,
+		["requires master axesmith"] = 17041,
+		["requires master hammersmith"] = 17040,
+		["requires master swordsmith"] = 17039,
+		["requires weaponsmith"] = 9787,
+	}
+
+	local FACTION_TEXT = {
+		["thorium brotherhood"] = 98,
+		["zandalar tribe"] = 100,
+		["argent dawn"] = 96,
+		["timbermaw hold"] = 99,
+		["cenarion circle"] = 97,
+		["the aldor"] = 101,
+		["the consortium"] = 105,
+		["the scryers"] = 110,
+		["the sha'tar"] = 111,
+		["the mag'har"] = 108,
+		["cenarion expedition"] = 103,
+		["honor hold"] = 104,
+		["thrallmar"] = 104,
+		["the violet eye"] = 114,
+		["sporeggar"] = 113,
+		["kurenai"] = 108,
+		["keepers of time"] = 106,
+		["the scale of the sands"] = 109,
+		["lower city"] = 107,
+		["ashtongue deathsworn"] = 102,
+		["alliance vanguard"] = 131,
+		["valiance expedition"] = 126,
+		["horde expedition"] = 130,
+		["the taunka"] = 128,
+		["the hand of vengeance"] = 127,
+		["explorers' league"] = 125,
+		["the kalu'ak"] = 120,
+		["shattered sun offensive"] = 112,
+		["warsong offensive"] = 129,
+		["kirin tor"] = 118,
+		["the wyrmrest accord"] = 122,
+		["knights of the ebon blade"] = 117,
+		["frenzyheart tribe"] = 116,
+		["the oracles"] = 121,
+		["argent crusade"] = 115,
+		["the sons of hodir"] = 119,
+	}
+
+	local FACTION_LEVELS = {
+		["neutral"] = 0,
+		["friendly"] = 1,
+		["honored"] = 2,
+		["revered"] = 3,
+		["exalted"] = 4,
+	}
+
+	local CLASS_TYPES = {
+		["Death Knight"]	= 21, 	["Druid"]	= 22, 	["Hunter"]	= 23,
+		["Mage"]		= 24, 	["Paladin"]	= 25, 	["Priest"]	= 26,
+		["Shaman"]		= 27, 	["Rogue"]	= 28, 	["Warlock"]	= 29,
+		["Warrior"]		= 30,
+	}
+
+	local ORDERED_CLASS_TYPES = {
+		[1]	= "Death Knight", 	[2]	= "Druid", 	[3]	= "Hunter",
+		[4]	= "Mage", 		[5]	= "Paladin", 	[6]	= "Priest",
+		[7]	= "Shaman", 		[8]	= "Rogue", 	[9]	= "Warlock",
+		[10]	= "Warrior",
+	}
+
+	local ROLE_TYPES = {
+		["dps"]		= 51, 	["tank"]	= 52, 	["healer"]	= 53,
+		["caster"]	= 54, 	["RESERVED1"]	= 55,
+	}
+
+	local ORDERED_ROLE_TYPES = {
+		[1]	= "dps", 	[2]	= "tank", 	[3]	= "healer",
+		[4]	= "caster", 	[5]	= "RESERVED1",
+	}
+
+	local ENCHANT_TO_ITEM = {
+		["Cloak"]	= "Back",
+		["Ring"]	= "Finger",
+		["2H Weapon"]	= "Two-Hand",
+	}
+
+	local ITEM_TYPES = {
+		-- Armor types
+		["Cloth"]	= 56, 	["Leather"]	= 57, 	["Mail"]	= 58,
+		["Plate"]	= 59, 	["Back"]	= 60, 	["Trinket"]	= 61,
+		["Finger"]	= 62, 	["Neck"]	= 63, 	["Shield"]	= 64,
+		["RESERVED2"]	= 65,
+
+		-- Weapon types
+		["One-Hand"]	= 66, 	["Two-Hand"]	= 67, 	["Axe"]		= 68,
+		["Sword"]	= 69, 	["Mace"]	= 70, 	["Polearm"]	= 71,
+		["Dagger"]	= 72, 	["Staff"]	= 73, 	["Wand"]	= 74,
+		["Thrown"]	= 75, 	["Bow"]		= 76, 	["CrossBow"]	= 77,
+		["Ammo"]	= 78, 	["Fist Weapon"]	= 79, 	["Gun"]		= 80,
+	}
+
+	local ORDERED_ITEM_TYPES = {
+		-- Armor types
+		[1]	= "Cloth", 	[2]	= "Leather", 	[3]	= "Mail",
+		[4]	= "Plate", 	[5]	= "Back", 	[6]	= "Trinket",
+		[7]	= "Finger", 	[8]	= "Neck", 	[9]	= "Shield",
+		[10]	= "RESERVED2",
+
+		-- Weapon types
+		[11]	= "One-Hand", 	[12]	= "Two-Hand", 	[13]	= "Axe",
+		[14]	= "Sword", 	[15]	= "Mace", 	[16]	= "Polearm",
+		[17]	= "Dagger", 	[18]	= "Staff", 	[19]	= "Wand",
+		[20]	= "Thrown", 	[21]	= "Bow", 	[22]	= "CrossBow",
+		[23]	= "Ammo", 	[24]	= "Fist Weapon", 	[25]	= "Gun",
+	}
+
+	-- Table to store scanned information. Wiped and re-used every scan.
+	local scan_data = {}
+
+	--- Parses the mining tooltip for certain keywords, comparing them with the database flags.
+	-- @name AckisRecipeList:ScanToolTip
+	-- @param name The name of the recipe
+	-- @param recipe_list Recipe database
+	-- @param reverse_lookup Reverse lookup database
+	-- @param is_vendor Boolean to indicate if we're scanning a vendor.
+	-- @param is_item Boolean to indicate if we're scanning an item tooltip.
+	-- @return Scans a tooltip, and outputs the missing or extra filter flags.
+	function addon:ScanToolTip(name, recipe_list, reverse_lookup, is_vendor, is_item)
+		-- We only want to wipe the table if we're scanning a new entry (not an item associated with a spell ID)
+		if not is_item then
+			twipe(scan_data)
+		end
+		scan_data.match_name = name
+		scan_data.recipe_list = recipe_list
+		scan_data.reverse_lookup = reverse_lookup
+		scan_data.is_vendor = is_vendor
+		scan_data.is_item = is_item
+
+		-- Parse all the lines of the tooltip
+		for i = 1, ARLDatamineTT:NumLines(), 1 do
+			local text_l = _G["ARLDatamineTTTextLeft" .. i]:GetText()
+			local text_r = _G["ARLDatamineTTTextRight" .. i]:GetText()
+			local text
+
+			if text_r then
+				text = text_l .. " " .. text_r
+			else
+				text = text_l
+			end
+
+			local text = strlower(text)
+
+			-- Check for recipe/item binding
+			-- The recipe binding is within the first few lines of the tooltip always
+			if strmatch(text, "binds when picked up") then
+				if (i < 3) then
+					scan_data.boprecipe = true
+				else
+					scan_data.bopitem = true
+				end
+			end
+
+			-- Recipe Specialities
+			if SPECIALTY_TEXT[text] then
+				scan_data.specialty = SPECIALTY_TEXT[text]
+			end
+
+			-- Recipe Reputations
+			local rep, replevel = strmatch(text_l, "Requires (.+) %- (.+)")
+
+			if rep and replevel and FACTION_TEXT[rep] then
+				scan_data.repid = FACTION_TEXT[rep]
+				scan_data.repidlevel = FACTION_LEVELS[replevel]
+			end
+
+			-- Flag so that we don't bother checking for classes if we're sure of the class
+			-- AKA +spell hit == caster DPS only no matter what other stats are on it
+			-- Saves processing cycles and it won't cause the flags to be overwritten if a non-specific stat is found after
+			scan_data.verifiedclass = false
+
+			if (not scan_data.verifiedclass) then
+				-- Certain stats can be considered for a specific role (aka spell hit == caster dps).
+				if (strmatch(text, "strength") and (strmatch(text, "strength of the clefthoof") == nil) and (strmatch(text,  "set:") == nil)) then
+					scan_data.dps = true
+					scan_data.caster = false
+					scan_data.healer = false
+				elseif (strmatch(text, "agility")) then
+					scan_data.dps = true
+					scan_data.caster = false
+					scan_data.healer = false
+				elseif (strmatch(text, "spirit")) then
+					scan_data.dps = false
+					scan_data.tank = false
+					scan_data.caster = true
+					scan_data.healer = true
+				elseif (strmatch(text, "spell power")) then
+					scan_data.dps = false
+					scan_data.tank = false
+					scan_data.caster = true
+					scan_data.healer = true
+				elseif (strmatch(text, "spell crit")) then
+					scan_data.dps = false
+					scan_data.tank = false
+					scan_data.caster = true
+					scan_data.healer = true
+				elseif (strmatch(text, "spell hit")) then
+					scan_data.dps = false
+					scan_data.tank = false
+					scan_data.caster = true
+					scan_data.healer = false
+					scan_data.verifiedclass = true
+				elseif (strmatch(text, "spell penetration")) then
+					scan_data.dps = false
+					scan_data.tank = false
+					scan_data.caster = true
+					scan_data.healer = false
+					scan_data.verifiedclass = true
+				elseif (strmatch(text, "mana per 5 sec.") or (strmatch(text, "mana every 5 seconds"))) then
+					scan_data.dps = false
+					scan_data.tank = false
+					scan_data.caster = true
+					scan_data.healer = true
+				elseif (strmatch(text, "attack power")) then
+					scan_data.dps = true
+					scan_data.caster = false
+					scan_data.healer = false
+				elseif (strmatch(text, "expertise")) then
+					scan_data.dps = true
+					scan_data.tank = true
+					scan_data.caster = false
+					scan_data.healer = false
+				elseif (strmatch(text, "melee crit")) then
+					scan_data.dps = true
+					scan_data.caster = false
+					scan_data.healer = false
+				elseif (strmatch(text, "critical hit")) then
+					scan_data.dps = true
+					scan_data.caster = false
+					scan_data.healer = false
+				elseif (strmatch(text, "weapon damage")) then
+					scan_data.dps = true
+					scan_data.caster = false
+					scan_data.healer = false
+				elseif (strmatch(text, "ranged crit")) then
+					scan_data.dps = true
+					scan_data.tank = false
+					scan_data.caster = false
+					scan_data.healer = false
+					scan_data.verifiedclass = true
+				elseif (strmatch(text, "melee haste")) then
+					scan_data.dps = true
+					scan_data.caster = false
+					scan_data.healer = false
+				elseif (strmatch(text, "ranged haste")) then
+					scan_data.dps = true
+					scan_data.tank = false
+					scan_data.caster = false
+					scan_data.healer = false
+					scan_data.verifiedclass = true
+				elseif (strmatch(text, "melee hit")) then
+					scan_data.dps = true
+					scan_data.caster = false
+					scan_data.healer = false
+				elseif (strmatch(text, "ranged hit")) then
+					scan_data.dps = true
+					scan_data.tank = false
+					scan_data.caster = false
+					scan_data.healer = false
+					scan_data.verifiedclass = true
+				elseif (strmatch(text, "armor pen")) then
+					scan_data.dps = true
+					scan_data.caster = false
+					scan_data.healer = false
+				elseif (strmatch(text, "feral attack power")) then
+					scan_data.tank = true
+					scan_data.dps = true
+					scan_data.caster = false
+					scan_data.healer = false
+				elseif (strmatch(text, "defense") and (strmatch(text, "defenseless") == nil)) then
+					scan_data.dps = false
+					scan_data.tank = true
+					scan_data.caster = false
+					scan_data.healer = false
+					scan_data.verifiedclass = true
+				elseif (strmatch(text, "block")) then
+					scan_data.dps = false
+					scan_data.tank = true
+					scan_data.caster = false
+					scan_data.healer = false
+					scan_data.verifiedclass = true
+				elseif (strmatch(text, "parry")) then
+					scan_data.dps = false
+					scan_data.tank = true
+					scan_data.caster = false
+					scan_data.healer = false
+					scan_data.verifiedclass = true
+				elseif (strmatch(text, "dodge") and (strmatch(text,  "set:") == nil)) then
+					scan_data.dps = false
+					scan_data.tank = true
+					scan_data.caster = false
+					scan_data.healer = false
+					scan_data.verifiedclass = true
+				end
+			end
+
+			-- Classes
+			local class_type = strmatch(text_l, "Classes: (.+)")
+
+			if class_type then
+				for idx, class in ipairs(ORDERED_CLASS_TYPES) do
+					if strmatch(class_type, class) then
+						scan_data[class] = true
+						scan_data.found_class = true
+					end
+				end
+			end
+
+			-- Armor types
+			if ITEM_TYPES[text_l] then
+				scan_data[text_l] = true
+			elseif text_l == "Held In Off-hand" or text_l == "Off Hand" or text_l == "Main Hand" then	-- Special cases.
+				scan_data["One-Hand"] = true
+			elseif text_l == "Projectile" then
+				scan_data["Ammo"] = true
+			end
+
+			if text_r and ITEM_TYPES[text_r] then
+				scan_data[text_r] = true
+			end
+
+			-- Enchantment voodoo
+			local ench_type, _ = strmatch(text_l, "Enchant (.+) %- (.+)")
+
+			if ench_type then
+				if ITEM_TYPES[ench_type] then
+					scan_data[ench_type] = true
+				elseif ITEM_TYPES[ENCHANT_TO_ITEM[ench_type]] then
+					scan_data[ENCHANT_TO_ITEM[ench_type]] = true
+				elseif ench_type == "Weapon" then		-- Special case.
+					scan_data["One-Hand"] = true
+					scan_data["Two-Hand"] = true
+				end
+			end
+		end	-- for
+	end
+
+	-- Flag data for printing. Wiped and re-used.
+	local missing_flags = {}
+	local extra_flags = {}
+	local output = {}
+
+	--- Prints out the results of the tooltip scan.
+	-- @name AckisRecipeList:PrintScanResults
+	function addon:PrintScanResults()
+		-- Parse the recipe database until we get a match on the name
+		local recipe_name = gsub(scan_data.match_name, "%a+%?: ", "")
+		local spell_id = scan_data.reverse_lookup[recipe_name]
+
+		if (not spell_id) then
+			self:Print("Recipe " .. recipe_name .. " has no reverse lookup")
+			return
+		end
+
+		local flags = scan_data.recipe_list[spell_id]["Flags"]
+		local acquire = scan_data.recipe_list[spell_id]["Acquire"]
+		twipe(missing_flags)
+		twipe(extra_flags)
+		twipe(output)
+
+		-- If we're a vendor scan,  do some extra checks
+		if (scan_data.is_vendor) then
+			-- Check to see if the vendor flag is set
+			if (not flags[4]) then
+				tinsert(missing_flags, "4 (Vendor)")
+			end
+
+			-- Check to see if we're in a PVP zone
+			if (((GetSubZoneText() == "Wintergrasp Fortress") or (GetSubZoneText() == "Halaa")) and (not flags[9])) then
+				tinsert(missing_flags, "9 (PvP)")
+			elseif ((flags[9]) and not ((GetSubZoneText() == "Wintergrasp Fortress") or (GetSubZoneText() == "Halaa"))) then
+				tinsert(extra_flags, "9 (PvP)")
+			end
+		end
+
+		-- -- If we've picked up at least one class flag
+		if (scan_data.found_class) then
+			for k, v in ipairs(ORDERED_CLASS_TYPES) do
+				if scan_data[v] and not flags[CLASS_TYPES[v]] then
+					tinsert(missing_flags, tostring(CLASS_TYPES[v]).." ("..v..")")
+				elseif not scan_data[v] and flags[CLASS_TYPES[v]] then
+					tinsert(extra_flags, tostring(CLASS_TYPES[v]).." ("..v..")")
+				end
+			end
+		end
+
+		-- BoP Item
+		if (scan_data.is_item) then
+			if (scan_data.bopitem) and (not flags[37]) then
+				tinsert(missing_flags, "37 (BoP Item)")
+				-- If it's a BoP item and flags BoE is set, mark it as extra
+				if (flags[36]) then
+					tinsert(extra_flags, "36 (BoE Item)")
+				end
+				-- If it's a BoP item and flags BoA is set, mark it as extra
+				if (flags[38]) then
+					tinsert(extra_flags, "38 (BoA Item)")
+				end
+				-- BoE Item, assuming it's not BoA
+			elseif (not flags[36]) and (not scan_data.bopitem) then
+				tinsert(missing_flags, "36 (BoE Item)")
+				-- If it's a BoE item and flags BoP is set, mark it as extra
+				if (flags[37]) then
+					tinsert(extra_flags, "37 (BoP Item)")
+				end
+				-- If it's a BoE item and flags BoA is set, mark it as extra
+				if (flags[38]) then
+					tinsert(extra_flags, "38 (BoA Item)")
+				end
+			end
+		else
+			-- BoP Recipe
+			if (scan_data.boprecipe) and (not flags[41]) then
+				tinsert(missing_flags, "41 (BoP Recipe)")
+				-- If it's a BoP recipe and flags BoE is set, mark it as extra
+				if (flags[40]) then
+					tinsert(extra_flags, "40 (BoE Recipe)")
+				end
+				-- If it's a BoP recipe and flags BoA is set, mark it as extra
+				if (flags[42]) then
+					tinsert(extra_flags, "42 (BoA Recipe)")
+				end
+				-- Not BoP recipe, assuming it's not BoA - trainer-taught recipes don't have bind information,  skip those.
+			elseif not flags[3] and (not flags[40]) and (not scan_data.boprecipe) then
+				tinsert(missing_flags, "40 (BoE Recipe)")
+				-- If it's a BoE recipe and flags BoP is set, mark it as extra
+				if (flags[41]) then
+					tinsert(extra_flags, "41 (BoP Recipe)")
+				end
+				-- If it's a BoE recipe and flags BoA is set, mark it as extra
+				if (flags[42]) then
+					tinsert(extra_flags, "42 (BoA Recipe)")
+				end
+			end
+		end
+
+		for k, v in ipairs(ORDERED_ROLE_TYPES) do
+			if scan_data[v] and not flags[ROLE_TYPES[v]] then
+				tinsert(missing_flags, tostring(ROLE_TYPES[v]).." ("..v..")")
+			elseif not scan_data[v] and flags[ROLE_TYPES[v]] then
+				tinsert(extra_flags, tostring(ROLE_TYPES[v]).." ("..v..")")
+			end
+		end
+
+		for k, v in ipairs(ORDERED_ITEM_TYPES) do
+			if scan_data[v] and not flags[ITEM_TYPES[v]] then
+				tinsert(missing_flags, tostring(ITEM_TYPES[v]).." ("..v..")")
+			elseif not scan_data[v] and flags[ITEM_TYPES[v]] then
+				tinsert(extra_flags, tostring(ITEM_TYPES[v]).." ("..v..")")
+			end
+		end
+
+		-- Reputations
+		local repid = scan_data.repid
+		local addedtotable = false
+
+		if repid and not flags[repid] then
+			tinsert(missing_flags, repid)
+
+			for i, j in pairs(acquire) do
+				if (acquire[j]["Type"] == 6) then
+					local tmpacquire = acquire[j]
+
+					if (tmpacquire["RepLevel"] ~= scan_data.repidlevel) then
+						tinsert(output, "Rep level wrong. " .. recipe_name .. " (" .. spell_id .. ")")
+					end
+				end
+			end
+		end
+
+		if (#missing_flags > 0) or (#extra_flags > 0) then
+			addedtotable = true
+			tinsert(output, recipe_name .. " (" .. spell_id .. ")")
+
+			-- Add a string of the missing flag numbers
+			if (#missing_flags > 0) then
+				tinsert(output, "Missing flags: " .. tconcat(missing_flags, ", "))
+			end
+
+			-- Add a string of the extra flag numbers
+			if (#extra_flags > 0) then
+				tinsert(output, "Extra flags: " .. tconcat(extra_flags, ", "))
+			end
+
+			local found_type = false
+
+			for k, v in ipairs(ORDERED_ITEM_TYPES) do
+				if scan_data[v] then
+					found_type = true
+					break
+				end
+			end
+
+			if not found_type then
+				tinsert(output, "Missing: item type flag")
+			end
+		end
+
+		-- Check to see if we have a horde/alliance flag,  all recipes must have one of these
+		if (not flags[1]) and (not flags[2]) then
+			addedtotable = true
+			tinsert(output, "Horde or alliance not selected. " .. recipe_name .. " (" .. spell_id .. ")")
+		end
+
+		-- Check to see if we have an obtain method flag,  all recipes must have at least one of these
+		if ((not flags[3]) and (not flags[4]) and (not flags[5]) and (not flags[6]) and (not flags[7])
+		and (not flags[8]) and (not flags[9]) and (not flags[10]) and (not flags[11]) and (not flags[12])) then
+			addedtotable = true
+			tinsert(output, "No obtain flag. " .. recipe_name .. " (" .. spell_id .. ")")
+		end
+
+		-- Check for recipe binding information,  all recipes must have one of these
+		if (not flags[40]) and (not flags[41]) and (not flags[42]) then
+			addedtotable = true
+			tinsert(output, "No recipe binding information. " .. recipe_name .. " (" .. spell_id .. ")")
+		end
+
+		-- Check for item binding information,  all recipes must have one of these
+		if (not flags[36]) and (not flags[37]) and (not flags[38]) then
+			addedtotable = true
+			tinsert(output, "No item binding information. " .. recipe_name .. " (" .. spell_id .. ")")
+		end
+
+		-- We need to code this better.  Some items (aka bags) won't have a role at all.
+		-- Check for player role flags
+		if (not scan_data.tank) and (not scan_data.healer) and (not scan_data.caster) and (not scan_data.dps) and (not NO_PLAYER_FLAG[spell_id]) then
+			addedtotable = true
+			tinsert(output, "No player role flag. " .. recipe_name .. " (" .. spell_id .. ").")
+		end
+
+		if (scan_data.specialty) then
+			if (not scan_data.recipe_list[spell_id]["Specialty"]) then
+				addedtotable = true
+				tinsert(output, "Recipe: " ..  recipe_name .. " (" .. spell_id .. ") Missing Specialty: " .. scan_data.specialty)
+			elseif (scan_data.recipe_list[spell_id]["Specialty"] ~= scan_data.specialty) then
+				tinsert(output, "Recipe: " ..  recipe_name .. " (" .. spell_id .. ") Wrong Specialty, the correct one is: " .. scan_data.specialty)
+			end
+		elseif (scan_data.recipe_list[spell_id]["Specialty"]) then
+			addedtotable = true
+			tinsert(output, "Recipe: " ..  recipe_name .. " (" .. spell_id .. ") Extra Specialty: " .. scan_data.recipe_list[spell_id]["Specialty"])
+		end
+
+		if (addedtotable) then
+			return tconcat(output, "\n")
+		else
+			return nil
+		end
+
+	end
+
+end
\ No newline at end of file
diff --git a/Frame.lua b/Frame.lua
index 8d49045..ed4cacc 100644
--- a/Frame.lua
+++ b/Frame.lua
@@ -9,8 +9,7 @@
 -- Please see http://www.wowace.com/projects/arl/for more information.
 -------------------------------------------------------------------------------
 -- License:
---	Please see LICENSE.txt
-
+-- Please see LICENSE.txt
 -- This source code is released under All Rights Reserved.
 -------------------------------------------------------------------------------
 --- **AckisRecipeList** provides an interface for scanning professions for missing recipes.