API 100008

CrazyDutchGuy [07-31-14 - 18:40]
API 100008
Filename
GuildChat.lua
GuildChat.txt
Libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
Libs/LibAddonMenu-2.0/controls/button.lua
Libs/LibAddonMenu-2.0/controls/checkbox.lua
Libs/LibAddonMenu-2.0/controls/colorpicker.lua
Libs/LibAddonMenu-2.0/controls/custom.lua
Libs/LibAddonMenu-2.0/controls/description.lua
Libs/LibAddonMenu-2.0/controls/dropdown.lua
Libs/LibAddonMenu-2.0/controls/editbox.lua
Libs/LibAddonMenu-2.0/controls/header.lua
Libs/LibAddonMenu-2.0/controls/panel.lua
Libs/LibAddonMenu-2.0/controls/slider.lua
Libs/LibAddonMenu-2.0/controls/submenu.lua
Libs/LibAddonMenu-2.0/controls/texture.lua
Libs/libGuildInfo/LibGuildInfo.lua
diff --git a/GuildChat.lua b/GuildChat.lua
index bd14e12..e625cfd 100644
--- a/GuildChat.lua
+++ b/GuildChat.lua
@@ -1,202 +1,202 @@
-local LC = LibStub('libChat-1.0')
-local LGI = LibStub("LibGuildInfo-1.0")
-local LAM2 = LibStub("LibAddonMenu-2.0")
-
-local GuildChat = {}
-
-local characterNameMenuOptions =
-{
-	[1] = "@account",
-	[2] = "character",
-	[3] = "character@account",
-}
-
-local colorOptions =
-{
-	[1] = "Alliance",
-	[2] = "Class",
-	[3] = "None",
-	[4] = "Custom1",
-	[5] = "Custom2",
-	[6] = "Custom3",
-	[7] = "Custom4",
-}
-
-local Addon =
-{
-    Name = "GuildChat",
-    NameSpaced = "Guild Chat",
-    Author = "CrazyDutchGuy & Wobin",
-    Version = "4.4",
-    Defaults = {
-		characterName = characterNameMenuOptions[1],
-		guildRank = false,
-		colors =
-		{
-			["Aldmeri Dominion"] = "ffff00",
-			["Daggerfall Convenant"]= "4169E1",
-			["Ebonhart Pact"] = "8B0000",
-			["Dragon Knight"] = "CA0000",
-			["Sorcerer"] = "0096FF",
-			["Nightblade"] = "9900F1",
-			["Templar"] = "EFEFEF",
-			["Custom1"] = "FFFFFF",
-			["Custom2"] = "FFFFFF",
-			["Custom3"] = "FFFFFF",
-			["Custom4"] = "FFFFFF",
-		},
-		["coloring"] =
-		{
-			["@account"] = colorOptions[2],
-			["character"] = colorOptions[2],
-			["guildRank"] = colorOptions[3],
-			["level"] = colorOptions[1],
-		},
-		characterLevel = true,
-	}
-}
-
-
-local ChannelInfo = ZO_ChatSystem_GetChannelInfo()
-local CategoryMapping = ZO_ChatSystem_GetEventCategoryMappings()
-
-function GuildChat:GetLevel(name)
-	return LGI:GetLevelByMemberName(name) or 0
-end
-
-function GuildChat:GetClassColour(name)
-	return GuildChat.settings.colors[LGI:GetClassNameByMemberName(name)]
-end
-
-function GuildChat:GetAtColour(name)
-	return GuildChat.settings.colors[LGI:GetAllianceNameByMemberName(name)]
-end
-
-local function getSavedColor(tableEntry,name)
-	if GuildChat.settings.coloring[tableEntry] == colorOptions[1] then
-		if GuildChat:GetAtColour(name) then	return "|c" .. GuildChat:GetAtColour(name) end
-	elseif GuildChat.settings.coloring[tableEntry] == colorOptions[2] then
-		if GuildChat:GetClassColour(name) then return "|c" .. GuildChat:GetClassColour(name) end
-	elseif GuildChat.settings.coloring[tableEntry] == colorOptions[3] then
-		return ""
-	elseif GuildChat.settings.coloring[tableEntry] == colorOptions[4] or
-	       GuildChat.settings.coloring[tableEntry] == colorOptions[5] or
-	       GuildChat.settings.coloring[tableEntry] == colorOptions[6] or
-	       GuildChat.settings.coloring[tableEntry] == colorOptions[7] then
-		return "|c" .. GuildChat.settings.colors[GuildChat.settings.coloring[tableEntry]]
-	end
-	return ""
-end
-
-function GuildChat:GetCharacterNameLink(name)
-	local memberInfo = LGI:GetGuildMemberByMemberName(name)
-	local characterName = nil
-	local characterLink = ""
-
-	if memberInfo then characterName = memberInfo.characterName end
-	if characterName then characterLink = ZO_LinkHandler_CreatePlayerLink(characterName) end
-
-	if GuildChat.settings.characterName == characterNameMenuOptions[1] then
-		return getSavedColor("@account", name) .. ZO_LinkHandler_CreatePlayerLink(name) .. "|r"
-	elseif GuildChat.settings.characterName == characterNameMenuOptions[2] then
-		return getSavedColor("character", name) .. characterLink .. "|r"
-	elseif GuildChat.settings.characterName == characterNameMenuOptions[3] then
-		return getSavedColor("character", name) .. characterLink .. "|r" .. getSavedColor("@account", name) .. ZO_LinkHandler_CreatePlayerLink(name) .. "|r"
-	end
-	return ""
-end
-
-function GuildChat:GetName(channelId, fromName, text)
-	if not LGI:GetGuildMemberByMemberName(fromName) then return fromName end -- For whispers and tells from people not in one of your guilds
-
-	local formattedName = ""
-
-	if GuildChat.settings.guildRank then formattedName = formattedName .. getSavedColor("guildRank", fromName) .. "[" .. LGI:GetGuildRankByMemberName(fromName) .. "]" .. "|r" end
-	if GuildChat.settings.characterLevel then formattedName = formattedName .. getSavedColor("level", fromName) .. "[" .. GuildChat:GetLevel(fromName) .. "]" .. "|r" end
-	formattedName = formattedName .. GuildChat:GetCharacterNameLink(fromName)
-
-	return formattedName
-end
-
-function GuildChat:Register()
-	LC:registerName(function(...) return GuildChat:GetName(...) end)
-	EVENT_MANAGER:UnregisterForEvent(Addon.Name, EVENT_PLAYER_ACTIVATED )
-end
-
-local function RGBtoHEX(r,g,b,a)
-	-- We can't have chat strings with alpha channels
-	--return string.format("%.2x%.2x%.2x%.2x", math.floor(a * 255),math.floor(r * 255), math.floor(g * 255), math.floor(b * 255))
-	return string.format("%.2x%.2x%.2x", math.floor(r * 255), math.floor(g * 255), math.floor(b * 255))
-end
-
-local function HEXtoRGB(hex)
-    local a, r, g, b
-
-    if(string.len(hex) == 8)
-    then
-        a, r, g, b = tonumber("0x"..string.sub(hex, 1, 2)) / 255, tonumber("0x"..string.sub(hex, 3, 4)) / 255, tonumber("0x"..string.sub(hex, 5, 6)) / 255, tonumber("0x"..string.sub(hex, 7, 8)) / 255
-    elseif(string.len(hex) == 6)
-    then
-        a, r, g, b = 1, tonumber("0x"..string.sub(hex, 1, 2)) / 255, tonumber("0x"..string.sub(hex, 3, 4)) / 255, tonumber("0x"..string.sub(hex, 5, 6)) / 255
-    end
-
-    if(a)
-    then
-        return r, g, b, a
-    end
-
-end
-
-local function createLAM2Panel()
-    local panelData =
-    {
-        type = "panel",
-        name = Addon.NameSpaced,
-        displayName = "|cFFFFB0" .. Addon.NameSpaced .. "|r",
-        author = Addon.Author,
-        version = Addon.Version,
-    }
-
-    local optionsData = {}
-
-    table.insert(optionsData, { type = "header", name = "Chat Options", })
-    table.insert(optionsData, { type = "dropdown", name = "Set the name to be", tooltip = "Guild Chat can display Account and/or Character name", choices = characterNameMenuOptions, getFunc = function() return GuildChat.settings.characterName end, setFunc = function(value) GuildChat.settings.characterName = value end, })
-    table.insert(optionsData, { type = "checkbox", name = "Show Guild Rank", nil, getFunc = function() return GuildChat.settings.guildRank end, setFunc = function(value) GuildChat.settings.guildRank = value end, })
-    table.insert(optionsData, { type = "checkbox", name = "Show Character Level", nil, getFunc = function() return GuildChat.settings.characterLevel end, setFunc = function(value) GuildChat.settings.characterLevel = value end, })
-    table.insert(optionsData, { type = "header", name = "Coloring Options", })
-    table.insert(optionsData, { type = "dropdown", name = "Account Name", nil, choices = colorOptions, getFunc = function() return GuildChat.settings.coloring["@account"] end, setFunc = function(value) GuildChat.settings.coloring["@account"] = value end, })
-    table.insert(optionsData, { type = "dropdown", name = "Character Name", nil, choices = colorOptions, getFunc = function() return GuildChat.settings.coloring["character"] end, setFunc = function(value) GuildChat.settings.coloring["character"] = value end, })
-    table.insert(optionsData, { type = "dropdown", name = "Character Level", nil, choices = colorOptions, getFunc = function() return GuildChat.settings.coloring["level"] end, setFunc = function(value) GuildChat.settings.coloring["level"] = value end, })
-    table.insert(optionsData, { type = "dropdown", name = "Guild Ranking", nil, choices = colorOptions, getFunc = function() return GuildChat.settings.coloring["guildRank"] end, setFunc = function(value) GuildChat.settings.coloring["guildRank"] = value end, })
-    table.insert(optionsData, { type = "header", name = "Faction Colors", })
-    table.insert(optionsData, { type = "colorpicker", name = "Aldmeri Dominion", tooltip = "Aldmeri Dominion Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Aldmeri Dominion"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Aldmeri Dominion"] = RGBtoHEX(r,g,b,a) end, })
-    table.insert(optionsData, { type = "colorpicker", name = "Daggerfall Convenant", tooltip = "Daggerfall Convenant Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Daggerfall Convenant"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Daggerfall Convenant"] = RGBtoHEX(r,g,b,a) end, })
-    table.insert(optionsData, { type = "colorpicker", name = "Ebonhart Pact", tooltip = "Ebonhart Pact Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Ebonhart Pact"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Ebonhart Pact"] = RGBtoHEX(r,g,b,a) end, })
-    table.insert(optionsData, { type = "header", name = "Class Colors", })
-    table.insert(optionsData, { type = "colorpicker", name = "Dragon Knight", tooltip = "Dragon Knight Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Dragon Knight"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Dragon Knight"] = RGBtoHEX(r,g,b,a) end, })
-    table.insert(optionsData, { type = "colorpicker", name = "Sorcerer", tooltip = "Sorcerer Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Sorcerer"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Sorcerer"] = RGBtoHEX(r,g,b,a) end, })
-    table.insert(optionsData, { type = "colorpicker", name = "Nightblade", tooltip = "Nightblade Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Nightblade"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Nightblade"] = RGBtoHEX(r,g,b,a) end, })
-    table.insert(optionsData, { type = "colorpicker", name = "Templar", tooltip = "Templar Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Templar"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Templar"] = RGBtoHEX(r,g,b,a) end, })
-    table.insert(optionsData, { type = "header", name = "Custom Colors", })
-    table.insert(optionsData, { type = "colorpicker", name = "Custom #1", tooltip = "Custom #1 Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Custom1"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Custom1"] = RGBtoHEX(r,g,b,a) end, })
-    table.insert(optionsData, { type = "colorpicker", name = "Custom #2", tooltip = "Custom #2 Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Custom2"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Custom2"] = RGBtoHEX(r,g,b,a) end, })
-    table.insert(optionsData, { type = "colorpicker", name = "Custom #3", tooltip = "Custom #3 Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Custom3"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Custom3"] = RGBtoHEX(r,g,b,a) end, })
-    table.insert(optionsData, { type = "colorpicker", name = "Custom #4", tooltip = "Custom #4 Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Custom4"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Custom4"] = RGBtoHEX(r,g,b,a) end, })
-
-   	LAM2:RegisterAddonPanel(Addon.Name.."LAM2Options", panelData)
-    LAM2:RegisterOptionControls(Addon.Name.."LAM2Options", optionsData)
-end
-
-function GuildChat:EVENT_ADD_ON_LOADED(eventId, addonName)
-	if addonName ~= Addon.Name then return end
-
-	GuildChat.settings = ZO_SavedVars:NewAccountWide('GuildChat_Settings', 4, nil, Addon.Defaults)
-
-	createLAM2Panel()
-
-	EVENT_MANAGER:UnregisterForEvent( Addon.Name, EVENT_ADD_ON_LOADED )
-end
-
-EVENT_MANAGER:RegisterForEvent(Addon.Name, EVENT_ADD_ON_LOADED, function(...) GuildChat:EVENT_ADD_ON_LOADED(...) end)
-EVENT_MANAGER:RegisterForEvent(Addon.Name, EVENT_PLAYER_ACTIVATED, function(...) zo_callLater(GuildChat.Register, 5000) end)
-
+local LC = LibStub('libChat-1.0')
+local LGI = LibStub("LibGuildInfo-1.0")
+local LAM2 = LibStub("LibAddonMenu-2.0")
+
+local GuildChat = {}
+
+local characterNameMenuOptions =
+{
+	[1] = "@account",
+	[2] = "character",
+	[3] = "character@account",
+}
+
+local colorOptions =
+{
+	[1] = "Alliance",
+	[2] = "Class",
+	[3] = "None",
+	[4] = "Custom1",
+	[5] = "Custom2",
+	[6] = "Custom3",
+	[7] = "Custom4",
+}
+
+local Addon =
+{
+    Name = "GuildChat",
+    NameSpaced = "Guild Chat",
+    Author = "CrazyDutchGuy & Wobin",
+    Version = "4.4",
+    Defaults = {
+		characterName = characterNameMenuOptions[1],
+		guildRank = false,
+		colors =
+		{
+			["Aldmeri Dominion"] = "ffff00",
+			["Daggerfall Convenant"]= "4169E1",
+			["Ebonhart Pact"] = "8B0000",
+			["Dragon Knight"] = "CA0000",
+			["Sorcerer"] = "0096FF",
+			["Nightblade"] = "9900F1",
+			["Templar"] = "EFEFEF",
+			["Custom1"] = "FFFFFF",
+			["Custom2"] = "FFFFFF",
+			["Custom3"] = "FFFFFF",
+			["Custom4"] = "FFFFFF",
+		},
+		["coloring"] =
+		{
+			["@account"] = colorOptions[2],
+			["character"] = colorOptions[2],
+			["guildRank"] = colorOptions[3],
+			["level"] = colorOptions[1],
+		},
+		characterLevel = true,
+	}
+}
+
+
+local ChannelInfo = ZO_ChatSystem_GetChannelInfo()
+local CategoryMapping = ZO_ChatSystem_GetEventCategoryMappings()
+
+function GuildChat:GetLevel(name)
+	return LGI:GetLevelByMemberName(name) or 0
+end
+
+function GuildChat:GetClassColour(name)
+	return GuildChat.settings.colors[LGI:GetClassNameByMemberName(name)]
+end
+
+function GuildChat:GetAtColour(name)
+	return GuildChat.settings.colors[LGI:GetAllianceNameByMemberName(name)]
+end
+
+local function getSavedColor(tableEntry,name)
+	if GuildChat.settings.coloring[tableEntry] == colorOptions[1] then
+		if GuildChat:GetAtColour(name) then	return "|c" .. GuildChat:GetAtColour(name) end
+	elseif GuildChat.settings.coloring[tableEntry] == colorOptions[2] then
+		if GuildChat:GetClassColour(name) then return "|c" .. GuildChat:GetClassColour(name) end
+	elseif GuildChat.settings.coloring[tableEntry] == colorOptions[3] then
+		return ""
+	elseif GuildChat.settings.coloring[tableEntry] == colorOptions[4] or
+	       GuildChat.settings.coloring[tableEntry] == colorOptions[5] or
+	       GuildChat.settings.coloring[tableEntry] == colorOptions[6] or
+	       GuildChat.settings.coloring[tableEntry] == colorOptions[7] then
+		return "|c" .. GuildChat.settings.colors[GuildChat.settings.coloring[tableEntry]]
+	end
+	return ""
+end
+
+function GuildChat:GetCharacterNameLink(name)
+	local memberInfo = LGI:GetGuildMemberByMemberName(name)
+	local characterName = nil
+	local characterLink = ""
+
+	if memberInfo then characterName = memberInfo.characterName end
+	if characterName then characterLink = ZO_LinkHandler_CreatePlayerLink(characterName) end
+
+	if GuildChat.settings.characterName == characterNameMenuOptions[1] then
+		return getSavedColor("@account", name) .. ZO_LinkHandler_CreatePlayerLink(name) .. "|r"
+	elseif GuildChat.settings.characterName == characterNameMenuOptions[2] then
+		return getSavedColor("character", name) .. characterLink .. "|r"
+	elseif GuildChat.settings.characterName == characterNameMenuOptions[3] then
+		return getSavedColor("character", name) .. characterLink .. "|r" .. getSavedColor("@account", name) .. ZO_LinkHandler_CreatePlayerLink(name) .. "|r"
+	end
+	return ""
+end
+
+function GuildChat:GetName(channelId, fromName, text)
+	if not LGI:GetGuildMemberByMemberName(fromName) then return fromName end -- For whispers and tells from people not in one of your guilds
+
+	local formattedName = ""
+
+	if GuildChat.settings.guildRank then formattedName = formattedName .. getSavedColor("guildRank", fromName) .. "[" .. LGI:GetGuildRankByMemberName(fromName) .. "]" .. "|r" end
+	if GuildChat.settings.characterLevel then formattedName = formattedName .. getSavedColor("level", fromName) .. "[" .. GuildChat:GetLevel(fromName) .. "]" .. "|r" end
+	formattedName = formattedName .. GuildChat:GetCharacterNameLink(fromName)
+
+	return formattedName
+end
+
+function GuildChat:Register()
+	LC:registerName(function(...) return GuildChat:GetName(...) end)
+	EVENT_MANAGER:UnregisterForEvent(Addon.Name, EVENT_PLAYER_ACTIVATED )
+end
+
+local function RGBtoHEX(r,g,b,a)
+	-- We can't have chat strings with alpha channels
+	--return string.format("%.2x%.2x%.2x%.2x", math.floor(a * 255),math.floor(r * 255), math.floor(g * 255), math.floor(b * 255))
+	return string.format("%.2x%.2x%.2x", math.floor(r * 255), math.floor(g * 255), math.floor(b * 255))
+end
+
+local function HEXtoRGB(hex)
+    local a, r, g, b
+
+    if(string.len(hex) == 8)
+    then
+        a, r, g, b = tonumber("0x"..string.sub(hex, 1, 2)) / 255, tonumber("0x"..string.sub(hex, 3, 4)) / 255, tonumber("0x"..string.sub(hex, 5, 6)) / 255, tonumber("0x"..string.sub(hex, 7, 8)) / 255
+    elseif(string.len(hex) == 6)
+    then
+        a, r, g, b = 1, tonumber("0x"..string.sub(hex, 1, 2)) / 255, tonumber("0x"..string.sub(hex, 3, 4)) / 255, tonumber("0x"..string.sub(hex, 5, 6)) / 255
+    end
+
+    if(a)
+    then
+        return r, g, b, a
+    end
+
+end
+
+local function createLAM2Panel()
+    local panelData =
+    {
+        type = "panel",
+        name = Addon.NameSpaced,
+        displayName = "|cFFFFB0" .. Addon.NameSpaced .. "|r",
+        author = Addon.Author,
+        version = Addon.Version,
+    }
+
+    local optionsData = {}
+
+    table.insert(optionsData, { type = "header", name = "Chat Options", })
+    table.insert(optionsData, { type = "dropdown", name = "Set the name to be", tooltip = "Guild Chat can display Account and/or Character name", choices = characterNameMenuOptions, getFunc = function() return GuildChat.settings.characterName end, setFunc = function(value) GuildChat.settings.characterName = value end, })
+    table.insert(optionsData, { type = "checkbox", name = "Show Guild Rank", nil, getFunc = function() return GuildChat.settings.guildRank end, setFunc = function(value) GuildChat.settings.guildRank = value end, })
+    table.insert(optionsData, { type = "checkbox", name = "Show Character Level", nil, getFunc = function() return GuildChat.settings.characterLevel end, setFunc = function(value) GuildChat.settings.characterLevel = value end, })
+    table.insert(optionsData, { type = "header", name = "Coloring Options", })
+    table.insert(optionsData, { type = "dropdown", name = "Account Name", nil, choices = colorOptions, getFunc = function() return GuildChat.settings.coloring["@account"] end, setFunc = function(value) GuildChat.settings.coloring["@account"] = value end, })
+    table.insert(optionsData, { type = "dropdown", name = "Character Name", nil, choices = colorOptions, getFunc = function() return GuildChat.settings.coloring["character"] end, setFunc = function(value) GuildChat.settings.coloring["character"] = value end, })
+    table.insert(optionsData, { type = "dropdown", name = "Character Level", nil, choices = colorOptions, getFunc = function() return GuildChat.settings.coloring["level"] end, setFunc = function(value) GuildChat.settings.coloring["level"] = value end, })
+    table.insert(optionsData, { type = "dropdown", name = "Guild Ranking", nil, choices = colorOptions, getFunc = function() return GuildChat.settings.coloring["guildRank"] end, setFunc = function(value) GuildChat.settings.coloring["guildRank"] = value end, })
+    table.insert(optionsData, { type = "header", name = "Faction Colors", })
+    table.insert(optionsData, { type = "colorpicker", name = "Aldmeri Dominion", tooltip = "Aldmeri Dominion Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Aldmeri Dominion"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Aldmeri Dominion"] = RGBtoHEX(r,g,b,a) end, })
+    table.insert(optionsData, { type = "colorpicker", name = "Daggerfall Convenant", tooltip = "Daggerfall Convenant Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Daggerfall Convenant"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Daggerfall Convenant"] = RGBtoHEX(r,g,b,a) end, })
+    table.insert(optionsData, { type = "colorpicker", name = "Ebonhart Pact", tooltip = "Ebonhart Pact Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Ebonhart Pact"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Ebonhart Pact"] = RGBtoHEX(r,g,b,a) end, })
+    table.insert(optionsData, { type = "header", name = "Class Colors", })
+    table.insert(optionsData, { type = "colorpicker", name = "Dragon Knight", tooltip = "Dragon Knight Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Dragon Knight"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Dragon Knight"] = RGBtoHEX(r,g,b,a) end, })
+    table.insert(optionsData, { type = "colorpicker", name = "Sorcerer", tooltip = "Sorcerer Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Sorcerer"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Sorcerer"] = RGBtoHEX(r,g,b,a) end, })
+    table.insert(optionsData, { type = "colorpicker", name = "Nightblade", tooltip = "Nightblade Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Nightblade"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Nightblade"] = RGBtoHEX(r,g,b,a) end, })
+    table.insert(optionsData, { type = "colorpicker", name = "Templar", tooltip = "Templar Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Templar"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Templar"] = RGBtoHEX(r,g,b,a) end, })
+    table.insert(optionsData, { type = "header", name = "Custom Colors", })
+    table.insert(optionsData, { type = "colorpicker", name = "Custom #1", tooltip = "Custom #1 Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Custom1"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Custom1"] = RGBtoHEX(r,g,b,a) end, })
+    table.insert(optionsData, { type = "colorpicker", name = "Custom #2", tooltip = "Custom #2 Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Custom2"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Custom2"] = RGBtoHEX(r,g,b,a) end, })
+    table.insert(optionsData, { type = "colorpicker", name = "Custom #3", tooltip = "Custom #3 Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Custom3"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Custom3"] = RGBtoHEX(r,g,b,a) end, })
+    table.insert(optionsData, { type = "colorpicker", name = "Custom #4", tooltip = "Custom #4 Color.", getFunc = function() return HEXtoRGB(GuildChat.settings.colors["Custom4"]) end, setFunc = function(r,g,b,a) GuildChat.settings.colors["Custom4"] = RGBtoHEX(r,g,b,a) end, })
+
+   	LAM2:RegisterAddonPanel(Addon.Name.."LAM2Options", panelData)
+    LAM2:RegisterOptionControls(Addon.Name.."LAM2Options", optionsData)
+end
+
+function GuildChat:EVENT_ADD_ON_LOADED(eventId, addonName)
+	if addonName ~= Addon.Name then return end
+
+	GuildChat.settings = ZO_SavedVars:NewAccountWide('GuildChat_Settings', 4, nil, Addon.Defaults)
+
+	createLAM2Panel()
+
+	EVENT_MANAGER:UnregisterForEvent( Addon.Name, EVENT_ADD_ON_LOADED )
+end
+
+EVENT_MANAGER:RegisterForEvent(Addon.Name, EVENT_ADD_ON_LOADED, function(...) GuildChat:EVENT_ADD_ON_LOADED(...) end)
+EVENT_MANAGER:RegisterForEvent(Addon.Name, EVENT_PLAYER_ACTIVATED, function(...) zo_callLater(GuildChat.Register, 5000) end)
+
diff --git a/GuildChat.txt b/GuildChat.txt
index 6fdca77..daa5728 100644
--- a/GuildChat.txt
+++ b/GuildChat.txt
@@ -1,27 +1,27 @@
-## Title: |cFFFFB0Guild Chat|r by |c00C000CrazyDutchGuy & Wobin|r
-## APIVersion: 100007
-## Version: @project-version@
-## SavedVariables: GuildChat_Settings
-## OptionalDependsOn: LibStub LibAddonMenu-2.0
-
-Libs/LibStub/LibStub.lua
-
-Libs/libChat/libChat.lua
-
-libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
-libs/LibAddonMenu-2.0/controls/panel.lua
-libs/LibAddonMenu-2.0/controls/submenu.lua
-libs/LibAddonMenu-2.0/controls/button.lua
-libs/LibAddonMenu-2.0/controls/checkbox.lua
-libs/LibAddonMenu-2.0/controls/colorpicker.lua
-libs/LibAddonMenu-2.0/controls/custom.lua
-libs/LibAddonMenu-2.0/controls/description.lua
-libs/LibAddonMenu-2.0/controls/dropdown.lua
-libs/LibAddonMenu-2.0/controls/editbox.lua
-libs/LibAddonMenu-2.0/controls/header.lua
-libs/LibAddonMenu-2.0/controls/slider.lua
-libs/LibAddonMenu-2.0/controls/texture.lua
-
-Libs/LibGuildInfo/LibGuildInfo.lua
-
+## Title: |cFFFFB0Guild Chat|r by |c00C000CrazyDutchGuy & Wobin|r
+## APIVersion: 100008
+## Version: @project-version@
+## SavedVariables: GuildChat_Settings
+## OptionalDependsOn: LibStub LibAddonMenu-2.0
+
+Libs/LibStub/LibStub.lua
+
+Libs/libChat/libChat.lua
+
+libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
+libs/LibAddonMenu-2.0/controls/panel.lua
+libs/LibAddonMenu-2.0/controls/submenu.lua
+libs/LibAddonMenu-2.0/controls/button.lua
+libs/LibAddonMenu-2.0/controls/checkbox.lua
+libs/LibAddonMenu-2.0/controls/colorpicker.lua
+libs/LibAddonMenu-2.0/controls/custom.lua
+libs/LibAddonMenu-2.0/controls/description.lua
+libs/LibAddonMenu-2.0/controls/dropdown.lua
+libs/LibAddonMenu-2.0/controls/editbox.lua
+libs/LibAddonMenu-2.0/controls/header.lua
+libs/LibAddonMenu-2.0/controls/slider.lua
+libs/LibAddonMenu-2.0/controls/texture.lua
+
+Libs/LibGuildInfo/LibGuildInfo.lua
+
 GuildChat.lua
\ No newline at end of file
diff --git a/Libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua b/Libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
index 80f9755..f9dcf3f 100644
--- a/Libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
+++ b/Libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
@@ -1,304 +1,304 @@
---	LibAddonMenu-2.0 & its files © Ryan Lakanen (Seerah)	--
---	All Rights Reserved										--
---	Permission is granted to use Seerah's LibAddonMenu-2.0	--
---	in your project. Any modifications to LibAddonMenu-2.0	--
---	may not be redistributed.								--
---------------------------------------------------------------
-
-
---Register LAM with LibStub
-local MAJOR, MINOR = "LibAddonMenu-2.0", 9
-local lam, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
-if not lam then return end	--the same or newer version of this lib is already loaded into memory
-
-
---UPVALUES--
-local wm = WINDOW_MANAGER
-local cm = CALLBACK_MANAGER
-local tinsert = table.insert
-local optionsWindow = ZO_OptionsWindowSettingsScrollChild
-local _
-
-local addonsForList = {}
-local addonToOptionsMap = {}
-local optionsCreated = {}
-local widgets = {}
-
-
---METHOD: REGISTER WIDGET--
---each widget has its version checked before loading,
---so we only have the most recent one in memory
---Usage:
---	widgetType = "string"; the type of widget being registered
---	widgetVersion = integer; the widget's version number
-LAMCreateControl = LAMCreateControl or {}
-local lamcc = LAMCreateControl
-
-function lam:RegisterWidget(widgetType, widgetVersion)
-	if widgets[widgetType] and widgets[widgetType] >= widgetVersion then
-		return false
-	else
-		widgets[widgetType] = widgetVersion
-		return true
-	end
-end
-
-
---METHOD: OPEN TO ADDON PANEL--
---opens to a specific addon's option panel
---Usage:
---	panel = userdata; the panel returned by the :RegisterOptionsPanel method
---local settings = {en = "Settings", de = "Einstellungen", fr = "Réglages"}
---local locSettings = settings[GetCVar("Language.2")]
-local locSettings = GetString(SI_GAME_MENU_SETTINGS)
-function lam:OpenToPanel(panel)
-	SCENE_MANAGER:Show("gameMenuInGame")
-	zo_callLater(function()
-			ZO_GameMenu_InGame.gameMenu.headerControls[locSettings]:SetOpen(true)
-			SCENE_MANAGER:AddFragment(OPTIONS_WINDOW_FRAGMENT)
-			ZO_OptionsWindow_ChangePanels(lam.panelID)
-			panel:SetHidden(false)
-		end, 200)
-end
-
-
---INTERNAL FUNCTION
---creates controls when options panel is first shown
---controls anchoring of these controls in the panel
-local function CreateOptionsControls(panel)
-	local addonID = panel:GetName()
-	local optionsTable = addonToOptionsMap[addonID]
-
-	if optionsTable then
-		local lastAddedControl, lacAtHalfRow
-		for _, widgetData in ipairs(optionsTable) do
-			local widgetType = widgetData.type
-			if widgetType == "submenu" then
-				local submenu = LAMCreateControl[widgetType](panel, widgetData)
-				if lastAddedControl then
-					submenu:SetAnchor(TOPLEFT, lastAddedControl, BOTTOMLEFT, 0, 15)
-				else
-					submenu:SetAnchor(TOPLEFT)
-				end
-				lastAddedControl = submenu
-				lacAtHalfRow = false
-
-				local lastAddedControlSub, lacAtHalfRowSub
-				for _, subWidgetData in ipairs(widgetData.controls) do
-					local subWidgetType = subWidgetData.type
-					local subWidget = LAMCreateControl[subWidgetType](submenu, subWidgetData)
-					local isHalf = subWidgetData.width == "half"
-					if lastAddedControlSub then
-						if lacAtHalfRowSub and isHalf then
-							subWidget:SetAnchor(TOPLEFT, lastAddedControlSub, TOPRIGHT, 5, 0)
-							lacAtHalfRowSub = false
-						else
-							subWidget:SetAnchor(TOPLEFT, lastAddedControlSub, BOTTOMLEFT, 0, 15)
-							lacAtHalfRowSub = isHalf and true or false
-							lastAddedControlSub = subWidget
-						end
-					else
-						subWidget:SetAnchor(TOPLEFT)
-						lacAtHalfRowSub = isHalf and true or false
-						lastAddedControlSub = subWidget
-					end
-				end
-			else
-				local widget = LAMCreateControl[widgetType](panel, widgetData)
-				local isHalf = widgetData.width == "half"
-				if lastAddedControl then
-					if lacAtHalfRow and isHalf then
-						widget:SetAnchor(TOPLEFT, lastAddedControl, TOPRIGHT, 10, 0)
-						lacAtHalfRow = false
-					else
-						widget:SetAnchor(TOPLEFT, lastAddedControl, BOTTOMLEFT, 0, 15)
-						lacAtHalfRow = isHalf and true or false
-						lastAddedControl = widget
-					end
-				else
-					widget:SetAnchor(TOPLEFT)
-					lacAtHalfRow = isHalf and true or false
-					lastAddedControl = widget
-				end
-			end
-		end
-	end
-
-	optionsCreated[addonID] = true
-	cm:FireCallbacks("LAM-PanelControlsCreated", panel)
-end
-
-
---INTERNAL FUNCTION
---handles switching between panels
-local function ToggleAddonPanels(panel)	--called in OnShow of newly shown panel
-	local currentlySelected = LAMAddonPanelsMenu.currentlySelected
-	if currentlySelected and currentlySelected ~= panel then
-		currentlySelected:SetHidden(true)
-	end
-	LAMAddonPanelsMenu.currentlySelected = panel
-
-	if not optionsCreated[panel:GetName()] then	--if this is the first time opening this panel, create these options
-		CreateOptionsControls(panel)
-	end
-
-	cm:FireCallbacks("LAM-RefreshPanel", panel)
-end
-
-
---METHOD: REGISTER ADDON PANEL
---registers your addon with LibAddonMenu and creates a panel
---Usage:
---	addonID = "string"; unique ID which will be the global name of your panel
---	panelData = table; data object for your panel - see controls\panel.lua
-function lam:RegisterAddonPanel(addonID, panelData)
-	local panel = lamcc.panel(nil, panelData, addonID)	--addonID==global name of panel
-	panel:SetHidden(true)
-	panel:SetAnchor(TOPLEFT, LAMAddonPanelsMenu, TOPRIGHT, 10, 0)
-	panel:SetAnchor(BOTTOMLEFT, LAMAddonPanelsMenu, BOTTOMRIGHT, 10, 0)
-	panel:SetWidth(549)
-	panel:SetDrawLayer(DL_OVERLAY)
-	tinsert(addonsForList, {panel = addonID, name = panelData.name})
-	panel:SetHandler("OnShow", ToggleAddonPanels)
-	if panelData.slashCommand then
-		SLASH_COMMANDS[panelData.slashCommand] = function()
-			lam:OpenToPanel(panel)
-		end
-	end
-
-	return panel	--return for authors creating options manually
-end
-
-
---METHOD: REGISTER OPTION CONTROLS
---registers the options you want shown for your addon
---these are stored in a table where each key-value pair is the order
---of the options in the panel and the data for that control, respectively
---see exampleoptions.lua for an example
---see controls\<widget>.lua for each widget type
---Usage:
---	addonID = "string"; the same string passed to :RegisterAddonPanel
---	optionsTable = table; the table containing all of the options controls and their data
-function lam:RegisterOptionControls(addonID, optionsTable)	--optionsTable = {sliderData, buttonData, etc}
-	addonToOptionsMap[addonID] = optionsTable
-end
-
-
---INTERNAL FUNCTION
---handles switching between LAM's Addon Settings panel and other panels in the Settings menu
-local oldDefaultButton = ZO_OptionsWindowResetToDefaultButton
-local oldCallback = oldDefaultButton.callback
-local dummyFunc = function() end
-local panelWindow = ZO_OptionsWindow
-local bgL = ZO_OptionsWindowBGLeft
-local bgR = ZO_OptionsWindowBGLeftBGRight
-local function HandlePanelSwitching(panel)
-	if panel == lam.panelID then	--our addon settings panel
-		oldDefaultButton:SetCallback(dummyFunc)
-		oldDefaultButton:SetHidden(true)
-		oldDefaultButton:SetAlpha(0)	--just because it still bugs out
-		panelWindow:SetDimensions(999, 960)
-		bgL:SetWidth(666)
-		bgR:SetWidth(333)
-	else
-		local shown = LAMAddonPanelsMenu.currentlySelected
-		if shown then shown:SetHidden(true) end
-		oldDefaultButton:SetCallback(oldCallback)
-		oldDefaultButton:SetHidden(false)
-		oldDefaultButton:SetAlpha(1)
-		panelWindow:SetDimensions(768, 914)
-		bgL:SetWidth(512)
-		bgR:SetWidth(256)
-	end
-end
-
-
---INTERNAL FUNCTION
---creates LAM's Addon Settings panel
-local function CreateAddonSettingsPanel()
-	if not LAMSettingsPanelCreated then
-		local controlPanelID = "LAM_ADDON_SETTINGS_PANEL"
-		--Russian for TERAB1T's RuESO addon, which creates an "ru" locale
-		--game font does not support Cyrillic, so they are using custom fonts + extended latin charset
-		local controlPanelNames = {en = "Addon Settings", fr = "Extensions", de = "Erweiterungen", ru = "Îacòpoéêè äoïoìîeîèé"}
-
-		ZO_OptionsWindow_AddUserPanel(controlPanelID, controlPanelNames[GetCVar("Language.2")] or controlPanelName["en"])
-
-		lam.panelID = _G[controlPanelID]
-
-		ZO_PreHook("ZO_OptionsWindow_ChangePanels", HandlePanelSwitching)
-
-		LAMSettingsPanelCreated = true
-	end
-end
-
-
---INTERNAL FUNCTION
---adds each registered addon to the menu in LAM's panel
-local function CreateAddonButtons(list, addons)
-	for i = 1, #addons do
-		local button = wm:CreateControlFromVirtual("LAMAddonMenuButton"..i, list.scrollChild, "ZO_DefaultTextButton")
-		button.name = addons[i].name
-		button.panel = _G[addons[i].panel]
-		button:SetText(button.name)
-		button:SetHorizontalAlignment(TEXT_ALIGN_LEFT)
-		button:SetWidth(190)
-		if i == 1 then
-			button:SetAnchor(TOPLEFT, list.scrollChild, TOPLEFT, 5, 5)
-		else
-			button:SetAnchor(TOPLEFT, _G["LAMAddonMenuButton"..i-1], BOTTOMLEFT)
-		end
-		button:SetHandler("OnClicked", function(self) self.panel:SetHidden(false) end)
-	end
-end
-
-
---INTERNAL FUNCTION
---creates the left-hand menu in LAM's panel
-local function CreateAddonList()
-	local list
-	--check if an earlier loaded copy of LAM created it already
-	list = LAMAddonPanelsMenu or wm:CreateControlFromVirtual("LAMAddonPanelsMenu", optionsWindow, "ZO_ScrollContainer")
-	list:ClearAnchors()
-	list:SetAnchor(TOPLEFT)
-	list:SetHeight(675)
-	list:SetWidth(200)
-
-	list.bg = list.bg or wm:CreateControl(nil, list, CT_BACKDROP)
-	local bg = list.bg
-	bg:SetAnchorFill()	--offsets of 8?
-	bg:SetEdgeTexture("EsoUI\\Art\\miscellaneous\\borderedinsettransparent_edgefile.dds", 128, 16)
-	bg:SetCenterColor(0, 0, 0, 0)
-
-	list.scrollChild = LAMAddonPanelsMenuScrollChild
-	list.scrollChild:SetResizeToFitPadding(0, 15)
-
-	local generatedButtons
-	list:SetHandler("OnShow", function(self)
-			if not generatedButtons and #addonsForList > 0 then
-				--we're about to show our list for the first time - let's sort the buttons before creating them
-				table.sort(addonsForList, function(a, b)
-						return a.name < b.name
-					end)
-				CreateAddonButtons(list, addonsForList)
-				self.currentlySelected = LAMAddonMenuButton1 and LAMAddonMenuButton1.panel
-				--since our addon panels don't have a parent, let's make sure they hide when we're done with them
-				ZO_PreHookHandler(ZO_OptionsWindow, "OnHide", function() self.currentlySelected:SetHidden(true) end)
-				generatedButtons = true
-			end
-			if self.currentlySelected then self.currentlySelected:SetHidden(false) end
-		end)
-
-	list.controlType = OPTIONS_CUSTOM
-	list.panel = lam.panelID
-
-	ZO_OptionsWindow_InitializeControl(list)
-
-	return list
-end
-
-
---INITIALIZING
-CreateAddonSettingsPanel()
-CreateAddonList()
-
+--	LibAddonMenu-2.0 & its files © Ryan Lakanen (Seerah)	--
+--	All Rights Reserved										--
+--	Permission is granted to use Seerah's LibAddonMenu-2.0	--
+--	in your project. Any modifications to LibAddonMenu-2.0	--
+--	may not be redistributed.								--
+--------------------------------------------------------------
+
+
+--Register LAM with LibStub
+local MAJOR, MINOR = "LibAddonMenu-2.0", 9
+local lam, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+if not lam then return end	--the same or newer version of this lib is already loaded into memory
+
+
+--UPVALUES--
+local wm = WINDOW_MANAGER
+local cm = CALLBACK_MANAGER
+local tinsert = table.insert
+local optionsWindow = ZO_OptionsWindowSettingsScrollChild
+local _
+
+local addonsForList = {}
+local addonToOptionsMap = {}
+local optionsCreated = {}
+local widgets = {}
+
+
+--METHOD: REGISTER WIDGET--
+--each widget has its version checked before loading,
+--so we only have the most recent one in memory
+--Usage:
+--	widgetType = "string"; the type of widget being registered
+--	widgetVersion = integer; the widget's version number
+LAMCreateControl = LAMCreateControl or {}
+local lamcc = LAMCreateControl
+
+function lam:RegisterWidget(widgetType, widgetVersion)
+	if widgets[widgetType] and widgets[widgetType] >= widgetVersion then
+		return false
+	else
+		widgets[widgetType] = widgetVersion
+		return true
+	end
+end
+
+
+--METHOD: OPEN TO ADDON PANEL--
+--opens to a specific addon's option panel
+--Usage:
+--	panel = userdata; the panel returned by the :RegisterOptionsPanel method
+--local settings = {en = "Settings", de = "Einstellungen", fr = "Réglages"}
+--local locSettings = settings[GetCVar("Language.2")]
+local locSettings = GetString(SI_GAME_MENU_SETTINGS)
+function lam:OpenToPanel(panel)
+	SCENE_MANAGER:Show("gameMenuInGame")
+	zo_callLater(function()
+			ZO_GameMenu_InGame.gameMenu.headerControls[locSettings]:SetOpen(true)
+			SCENE_MANAGER:AddFragment(OPTIONS_WINDOW_FRAGMENT)
+			ZO_OptionsWindow_ChangePanels(lam.panelID)
+			panel:SetHidden(false)
+		end, 200)
+end
+
+
+--INTERNAL FUNCTION
+--creates controls when options panel is first shown
+--controls anchoring of these controls in the panel
+local function CreateOptionsControls(panel)
+	local addonID = panel:GetName()
+	local optionsTable = addonToOptionsMap[addonID]
+
+	if optionsTable then
+		local lastAddedControl, lacAtHalfRow
+		for _, widgetData in ipairs(optionsTable) do
+			local widgetType = widgetData.type
+			if widgetType == "submenu" then
+				local submenu = LAMCreateControl[widgetType](panel, widgetData)
+				if lastAddedControl then
+					submenu:SetAnchor(TOPLEFT, lastAddedControl, BOTTOMLEFT, 0, 15)
+				else
+					submenu:SetAnchor(TOPLEFT)
+				end
+				lastAddedControl = submenu
+				lacAtHalfRow = false
+
+				local lastAddedControlSub, lacAtHalfRowSub
+				for _, subWidgetData in ipairs(widgetData.controls) do
+					local subWidgetType = subWidgetData.type
+					local subWidget = LAMCreateControl[subWidgetType](submenu, subWidgetData)
+					local isHalf = subWidgetData.width == "half"
+					if lastAddedControlSub then
+						if lacAtHalfRowSub and isHalf then
+							subWidget:SetAnchor(TOPLEFT, lastAddedControlSub, TOPRIGHT, 5, 0)
+							lacAtHalfRowSub = false
+						else
+							subWidget:SetAnchor(TOPLEFT, lastAddedControlSub, BOTTOMLEFT, 0, 15)
+							lacAtHalfRowSub = isHalf and true or false
+							lastAddedControlSub = subWidget
+						end
+					else
+						subWidget:SetAnchor(TOPLEFT)
+						lacAtHalfRowSub = isHalf and true or false
+						lastAddedControlSub = subWidget
+					end
+				end
+			else
+				local widget = LAMCreateControl[widgetType](panel, widgetData)
+				local isHalf = widgetData.width == "half"
+				if lastAddedControl then
+					if lacAtHalfRow and isHalf then
+						widget:SetAnchor(TOPLEFT, lastAddedControl, TOPRIGHT, 10, 0)
+						lacAtHalfRow = false
+					else
+						widget:SetAnchor(TOPLEFT, lastAddedControl, BOTTOMLEFT, 0, 15)
+						lacAtHalfRow = isHalf and true or false
+						lastAddedControl = widget
+					end
+				else
+					widget:SetAnchor(TOPLEFT)
+					lacAtHalfRow = isHalf and true or false
+					lastAddedControl = widget
+				end
+			end
+		end
+	end
+
+	optionsCreated[addonID] = true
+	cm:FireCallbacks("LAM-PanelControlsCreated", panel)
+end
+
+
+--INTERNAL FUNCTION
+--handles switching between panels
+local function ToggleAddonPanels(panel)	--called in OnShow of newly shown panel
+	local currentlySelected = LAMAddonPanelsMenu.currentlySelected
+	if currentlySelected and currentlySelected ~= panel then
+		currentlySelected:SetHidden(true)
+	end
+	LAMAddonPanelsMenu.currentlySelected = panel
+
+	if not optionsCreated[panel:GetName()] then	--if this is the first time opening this panel, create these options
+		CreateOptionsControls(panel)
+	end
+
+	cm:FireCallbacks("LAM-RefreshPanel", panel)
+end
+
+
+--METHOD: REGISTER ADDON PANEL
+--registers your addon with LibAddonMenu and creates a panel
+--Usage:
+--	addonID = "string"; unique ID which will be the global name of your panel
+--	panelData = table; data object for your panel - see controls\panel.lua
+function lam:RegisterAddonPanel(addonID, panelData)
+	local panel = lamcc.panel(nil, panelData, addonID)	--addonID==global name of panel
+	panel:SetHidden(true)
+	panel:SetAnchor(TOPLEFT, LAMAddonPanelsMenu, TOPRIGHT, 10, 0)
+	panel:SetAnchor(BOTTOMLEFT, LAMAddonPanelsMenu, BOTTOMRIGHT, 10, 0)
+	panel:SetWidth(549)
+	panel:SetDrawLayer(DL_OVERLAY)
+	tinsert(addonsForList, {panel = addonID, name = panelData.name})
+	panel:SetHandler("OnShow", ToggleAddonPanels)
+	if panelData.slashCommand then
+		SLASH_COMMANDS[panelData.slashCommand] = function()
+			lam:OpenToPanel(panel)
+		end
+	end
+
+	return panel	--return for authors creating options manually
+end
+
+
+--METHOD: REGISTER OPTION CONTROLS
+--registers the options you want shown for your addon
+--these are stored in a table where each key-value pair is the order
+--of the options in the panel and the data for that control, respectively
+--see exampleoptions.lua for an example
+--see controls\<widget>.lua for each widget type
+--Usage:
+--	addonID = "string"; the same string passed to :RegisterAddonPanel
+--	optionsTable = table; the table containing all of the options controls and their data
+function lam:RegisterOptionControls(addonID, optionsTable)	--optionsTable = {sliderData, buttonData, etc}
+	addonToOptionsMap[addonID] = optionsTable
+end
+
+
+--INTERNAL FUNCTION
+--handles switching between LAM's Addon Settings panel and other panels in the Settings menu
+local oldDefaultButton = ZO_OptionsWindowResetToDefaultButton
+local oldCallback = oldDefaultButton.callback
+local dummyFunc = function() end
+local panelWindow = ZO_OptionsWindow
+local bgL = ZO_OptionsWindowBGLeft
+local bgR = ZO_OptionsWindowBGLeftBGRight
+local function HandlePanelSwitching(panel)
+	if panel == lam.panelID then	--our addon settings panel
+		oldDefaultButton:SetCallback(dummyFunc)
+		oldDefaultButton:SetHidden(true)
+		oldDefaultButton:SetAlpha(0)	--just because it still bugs out
+		panelWindow:SetDimensions(999, 960)
+		bgL:SetWidth(666)
+		bgR:SetWidth(333)
+	else
+		local shown = LAMAddonPanelsMenu.currentlySelected
+		if shown then shown:SetHidden(true) end
+		oldDefaultButton:SetCallback(oldCallback)
+		oldDefaultButton:SetHidden(false)
+		oldDefaultButton:SetAlpha(1)
+		panelWindow:SetDimensions(768, 914)
+		bgL:SetWidth(512)
+		bgR:SetWidth(256)
+	end
+end
+
+
+--INTERNAL FUNCTION
+--creates LAM's Addon Settings panel
+local function CreateAddonSettingsPanel()
+	if not LAMSettingsPanelCreated then
+		local controlPanelID = "LAM_ADDON_SETTINGS_PANEL"
+		--Russian for TERAB1T's RuESO addon, which creates an "ru" locale
+		--game font does not support Cyrillic, so they are using custom fonts + extended latin charset
+		local controlPanelNames = {en = "Addon Settings", fr = "Extensions", de = "Erweiterungen", ru = "Îacòpoéêè äoïoìîeîèé"}
+
+		ZO_OptionsWindow_AddUserPanel(controlPanelID, controlPanelNames[GetCVar("Language.2")] or controlPanelName["en"])
+
+		lam.panelID = _G[controlPanelID]
+
+		ZO_PreHook("ZO_OptionsWindow_ChangePanels", HandlePanelSwitching)
+
+		LAMSettingsPanelCreated = true
+	end
+end
+
+
+--INTERNAL FUNCTION
+--adds each registered addon to the menu in LAM's panel
+local function CreateAddonButtons(list, addons)
+	for i = 1, #addons do
+		local button = wm:CreateControlFromVirtual("LAMAddonMenuButton"..i, list.scrollChild, "ZO_DefaultTextButton")
+		button.name = addons[i].name
+		button.panel = _G[addons[i].panel]
+		button:SetText(button.name)
+		button:SetHorizontalAlignment(TEXT_ALIGN_LEFT)
+		button:SetWidth(190)
+		if i == 1 then
+			button:SetAnchor(TOPLEFT, list.scrollChild, TOPLEFT, 5, 5)
+		else
+			button:SetAnchor(TOPLEFT, _G["LAMAddonMenuButton"..i-1], BOTTOMLEFT)
+		end
+		button:SetHandler("OnClicked", function(self) self.panel:SetHidden(false) end)
+	end
+end
+
+
+--INTERNAL FUNCTION
+--creates the left-hand menu in LAM's panel
+local function CreateAddonList()
+	local list
+	--check if an earlier loaded copy of LAM created it already
+	list = LAMAddonPanelsMenu or wm:CreateControlFromVirtual("LAMAddonPanelsMenu", optionsWindow, "ZO_ScrollContainer")
+	list:ClearAnchors()
+	list:SetAnchor(TOPLEFT)
+	list:SetHeight(675)
+	list:SetWidth(200)
+
+	list.bg = list.bg or wm:CreateControl(nil, list, CT_BACKDROP)
+	local bg = list.bg
+	bg:SetAnchorFill()	--offsets of 8?
+	bg:SetEdgeTexture("EsoUI\\Art\\miscellaneous\\borderedinsettransparent_edgefile.dds", 128, 16)
+	bg:SetCenterColor(0, 0, 0, 0)
+
+	list.scrollChild = LAMAddonPanelsMenuScrollChild
+	list.scrollChild:SetResizeToFitPadding(0, 15)
+
+	local generatedButtons
+	list:SetHandler("OnShow", function(self)
+			if not generatedButtons and #addonsForList > 0 then
+				--we're about to show our list for the first time - let's sort the buttons before creating them
+				table.sort(addonsForList, function(a, b)
+						return a.name < b.name
+					end)
+				CreateAddonButtons(list, addonsForList)
+				self.currentlySelected = LAMAddonMenuButton1 and LAMAddonMenuButton1.panel
+				--since our addon panels don't have a parent, let's make sure they hide when we're done with them
+				ZO_PreHookHandler(ZO_OptionsWindow, "OnHide", function() self.currentlySelected:SetHidden(true) end)
+				generatedButtons = true
+			end
+			if self.currentlySelected then self.currentlySelected:SetHidden(false) end
+		end)
+
+	list.controlType = OPTIONS_CUSTOM
+	list.panel = lam.panelID
+
+	ZO_OptionsWindow_InitializeControl(list)
+
+	return list
+end
+
+
+--INITIALIZING
+CreateAddonSettingsPanel()
+CreateAddonList()
+
diff --git a/Libs/LibAddonMenu-2.0/controls/button.lua b/Libs/LibAddonMenu-2.0/controls/button.lua
index 090a812..205b25c 100644
--- a/Libs/LibAddonMenu-2.0/controls/button.lua
+++ b/Libs/LibAddonMenu-2.0/controls/button.lua
@@ -1,87 +1,87 @@
---[[buttonData = {
-	type = "button",
-	name = "My Button",
-	tooltip = "Button's tooltip text.",
-	func = function() end,
-	width = "full",	--or "half" (optional)
-	disabled = function() return db.someBooleanSetting end,	--or boolean (optional)
-	icon = "icon\\path.dds",	--(optional)
-	warning = "Will need to reload the UI.",	--(optional)
-	reference = "MyAddonButton"	--(optional) unique global reference to control
-}	]]
-
-
-local widgetVersion = 3
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("button", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-local cm = CALLBACK_MANAGER
-local tinsert = table.insert
-
-local function UpdateDisabled(control)
-	local disable
-	if type(control.data.disabled) == "function" then
-		disable = control.data.disabled()
-	else
-		disable = control.data.disabled
-	end
-
-	control.button:SetEnabled(not disable)
-end
-
-
---controlName is optional
-function LAMCreateControl.button(parent, buttonData, controlName)
-	local control = wm:CreateTopLevelWindow(controlName or buttonData.reference)
-	control:SetParent(parent.scroll or parent)
-
-	local isHalfWidth = buttonData.width == "half"
-	control:SetDimensions(isHalfWidth and 250 or 510, isHalfWidth and 55 or 28)
-	control:SetMouseEnabled(true)
-
-	if buttonData.icon then
-		control.button = wm:CreateControl(nil, control, CT_BUTTON)
-		control.button:SetDimensions(26, 26)
-		control.button:SetNormalTexture(buttonData.icon)
-		control.button:SetPressedOffset(2, 2)
-	else
-		--control.button = wm:CreateControlFromVirtual(controlName.."Button", control, "ZO_DefaultButton")
-		control.button = wm:CreateControlFromVirtual(nil, control, "ZO_DefaultButton")
-		control.button:SetWidth(isHalfWidth and 180 or 200)
-		control.button:SetText(buttonData.name)
-	end
-	local button = control.button
-	button:SetAnchor(isHalfWidth and CENTER or RIGHT)
-	button:SetClickSound("Click")
-	button.tooltipText = buttonData.tooltip
-	button:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
-	button:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
-	button:SetHandler("OnClicked", function(self, ...)
-			buttonData.func(self, ...)
-			if control.panel.data.registerForRefresh then
-				cm:FireCallbacks("LAM-RefreshPanel", control)
-			end
-		end)
-
-	if buttonData.warning then
-		control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-		control.warning:SetAnchor(RIGHT, button, LEFT, -5, 0)
-		control.warning.tooltipText = buttonData.warning
-	end
-
-	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
-	control.data = buttonData
-
-	if buttonData.disabled then
-		control.UpdateDisabled = UpdateDisabled
-		control:UpdateDisabled()
-
-		--this is here because buttons don't have an UpdateValue method
-		if control.panel.data.registerForRefresh then	--if our parent window wants to refresh controls, then add this to the list
-			tinsert(control.panel.controlsToRefresh, control)
-		end
-	end
-
-	return control
+--[[buttonData = {
+	type = "button",
+	name = "My Button",
+	tooltip = "Button's tooltip text.",
+	func = function() end,
+	width = "full",	--or "half" (optional)
+	disabled = function() return db.someBooleanSetting end,	--or boolean (optional)
+	icon = "icon\\path.dds",	--(optional)
+	warning = "Will need to reload the UI.",	--(optional)
+	reference = "MyAddonButton"	--(optional) unique global reference to control
+}	]]
+
+
+local widgetVersion = 3
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("button", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+local cm = CALLBACK_MANAGER
+local tinsert = table.insert
+
+local function UpdateDisabled(control)
+	local disable
+	if type(control.data.disabled) == "function" then
+		disable = control.data.disabled()
+	else
+		disable = control.data.disabled
+	end
+
+	control.button:SetEnabled(not disable)
+end
+
+
+--controlName is optional
+function LAMCreateControl.button(parent, buttonData, controlName)
+	local control = wm:CreateTopLevelWindow(controlName or buttonData.reference)
+	control:SetParent(parent.scroll or parent)
+
+	local isHalfWidth = buttonData.width == "half"
+	control:SetDimensions(isHalfWidth and 250 or 510, isHalfWidth and 55 or 28)
+	control:SetMouseEnabled(true)
+
+	if buttonData.icon then
+		control.button = wm:CreateControl(nil, control, CT_BUTTON)
+		control.button:SetDimensions(26, 26)
+		control.button:SetNormalTexture(buttonData.icon)
+		control.button:SetPressedOffset(2, 2)
+	else
+		--control.button = wm:CreateControlFromVirtual(controlName.."Button", control, "ZO_DefaultButton")
+		control.button = wm:CreateControlFromVirtual(nil, control, "ZO_DefaultButton")
+		control.button:SetWidth(isHalfWidth and 180 or 200)
+		control.button:SetText(buttonData.name)
+	end
+	local button = control.button
+	button:SetAnchor(isHalfWidth and CENTER or RIGHT)
+	button:SetClickSound("Click")
+	button.tooltipText = buttonData.tooltip
+	button:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
+	button:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
+	button:SetHandler("OnClicked", function(self, ...)
+			buttonData.func(self, ...)
+			if control.panel.data.registerForRefresh then
+				cm:FireCallbacks("LAM-RefreshPanel", control)
+			end
+		end)
+
+	if buttonData.warning then
+		control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+		control.warning:SetAnchor(RIGHT, button, LEFT, -5, 0)
+		control.warning.tooltipText = buttonData.warning
+	end
+
+	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
+	control.data = buttonData
+
+	if buttonData.disabled then
+		control.UpdateDisabled = UpdateDisabled
+		control:UpdateDisabled()
+
+		--this is here because buttons don't have an UpdateValue method
+		if control.panel.data.registerForRefresh then	--if our parent window wants to refresh controls, then add this to the list
+			tinsert(control.panel.controlsToRefresh, control)
+		end
+	end
+
+	return control
 end
\ No newline at end of file
diff --git a/Libs/LibAddonMenu-2.0/controls/checkbox.lua b/Libs/LibAddonMenu-2.0/controls/checkbox.lua
index b178043..52bfc87 100644
--- a/Libs/LibAddonMenu-2.0/controls/checkbox.lua
+++ b/Libs/LibAddonMenu-2.0/controls/checkbox.lua
@@ -1,170 +1,170 @@
---[[checkboxData = {
-	type = "checkbox",
-	name = "My Checkbox",
-	tooltip = "Checkbox's tooltip text.",
-	getFunc = function() return db.var end,
-	setFunc = function(value) db.var = value doStuff() end,
-	width = "full",	--or "half" (optional)
-	disabled = function() return db.someBooleanSetting end,	--or boolean (optional)
-	warning = "Will need to reload the UI.",	--(optional)
-	default = defaults.var,	--(optional)
-	reference = "MyAddonCheckbox"	--(optional) unique global reference to control
-}	]]
-
-
-local widgetVersion = 5
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("checkbox", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-local cm = CALLBACK_MANAGER
-local tinsert = table.insert
---label
-local enabledColor = ZO_DEFAULT_ENABLED_COLOR
-local enabledHLcolor = ZO_HIGHLIGHT_TEXT
-local disabledColor = ZO_DEFAULT_DISABLED_COLOR
-local disabledHLcolor = ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR
---checkbox
-local checkboxColor = ZO_NORMAL_TEXT
-local checkboxHLcolor = ZO_HIGHLIGHT_TEXT
-
-
-local function UpdateDisabled(control)
-	local disable
-	if type(control.data.disabled) == "function" then
-		disable = control.data.disabled()
-	else
-		disable = control.data.disabled
-	end
-
-	control.label:SetColor((disable and ZO_DEFAULT_DISABLED_COLOR or control.value and ZO_DEFAULT_ENABLED_COLOR or ZO_DEFAULT_DISABLED_COLOR):UnpackRGBA())
-	control.checkbox:SetColor((disable and ZO_DEFAULT_DISABLED_COLOR or ZO_NORMAL_TEXT):UnpackRGBA())
-	--control:SetMouseEnabled(not disable)
-	--control:SetMouseEnabled(true)
-
-	control.isDisabled = disable
-end
-
-local function ToggleCheckbox(control)
-	if control.value then
-		control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-		control.checkbox:SetText(control.checkedText)
-	else
-		control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-		control.checkbox:SetText(control.uncheckedText)
-	end
-end
-
-local function UpdateValue(control, forceDefault, value)
-	if forceDefault then	--if we are forcing defaults
-		value = control.data.default
-		control.data.setFunc(value)
-	elseif value ~= nil then	--our value could be false
-		control.data.setFunc(value)
-		--after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
-		if control.panel.data.registerForRefresh then
-			cm:FireCallbacks("LAM-RefreshPanel", control)
-		end
-	else
-		value = control.data.getFunc()
-	end
-	control.value = value
-
-	ToggleCheckbox(control)
-end
-
-local function OnMouseEnter(control)
-	ZO_Options_OnMouseEnter(control)
-
-	if control.isDisabled then return end
-
-	local label = control.label
-	if control.value then
-		label:SetColor(ZO_HIGHLIGHT_TEXT:UnpackRGBA())
-	else
-		label:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
-	end
-	control.checkbox:SetColor(ZO_HIGHLIGHT_TEXT:UnpackRGBA())
-end
-
-local function OnMouseExit(control)
-    ZO_Options_OnMouseExit(control)
-
-	if control.isDisabled then return end
-
-	local label = control.label
-	if control.value then
-		label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-	else
-		label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-	end
-	control.checkbox:SetColor(ZO_NORMAL_TEXT:UnpackRGBA())
-end
-
-
---controlName is optional
-function LAMCreateControl.checkbox(parent, checkboxData, controlName)
-	local control = wm:CreateTopLevelWindow(controlName or checkboxData.reference)
-	control:SetParent(parent.scroll or parent)
-	control:SetMouseEnabled(true)
-	control.tooltipText = checkboxData.tooltip
-	control:SetHandler("OnMouseEnter", OnMouseEnter)
-	control:SetHandler("OnMouseExit", OnMouseExit)
-	control:SetHandler("OnMouseUp", function(control)
-			if control.isDisabled then return end
-			PlaySound(SOUNDS.DEFAULT_CLICK)
-			control.value = not control.value
-			control:UpdateValue(false, control.value)
-		end)
-
-	control.label = wm:CreateControl(nil, control, CT_LABEL)
-	local label = control.label
-	label:SetFont("ZoFontWinH4")
-	label:SetText(checkboxData.name)
-	label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
-	label:SetHeight(26)
-
-	control.checkbox = wm:CreateControl(nil, control, CT_LABEL)
-	local checkbox = control.checkbox
-	checkbox:SetFont("ZoFontGameBold")
-	checkbox:SetColor(ZO_NORMAL_TEXT:UnpackRGBA())
-	control.checkedText = GetString(SI_CHECK_BUTTON_ON):upper()
-	control.uncheckedText = GetString(SI_CHECK_BUTTON_OFF):upper()
-
-	local isHalfWidth = checkboxData.width == "half"
-	if isHalfWidth then
-		control:SetDimensions(250, 55)
-		checkbox:SetDimensions(100, 26)
-		checkbox:SetAnchor(BOTTOMRIGHT)
-		label:SetAnchor(TOPLEFT)
-		label:SetAnchor(TOPRIGHT)
-	else
-		control:SetDimensions(510, 30)
-		checkbox:SetDimensions(200, 26)
-		checkbox:SetAnchor(RIGHT)
-		label:SetAnchor(LEFT)
-		label:SetAnchor(RIGHT, checkbox, LEFT, -5, 0)
-	end
-
-	if checkboxData.warning then
-		control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-		control.warning:SetAnchor(RIGHT, checkbox, LEFT, -5, 0)
-		control.warning.tooltipText = checkboxData.warning
-	end
-
-	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
-	control.data = checkboxData
-
-	if checkboxData.disabled then
-		control.UpdateDisabled = UpdateDisabled
-		control:UpdateDisabled()
-	end
-	control.UpdateValue = UpdateValue
-	control:UpdateValue()
-
-	if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then	--if our parent window wants to refresh controls, then add this to the list
-		tinsert(control.panel.controlsToRefresh, control)
-	end
-
-	return control
+--[[checkboxData = {
+	type = "checkbox",
+	name = "My Checkbox",
+	tooltip = "Checkbox's tooltip text.",
+	getFunc = function() return db.var end,
+	setFunc = function(value) db.var = value doStuff() end,
+	width = "full",	--or "half" (optional)
+	disabled = function() return db.someBooleanSetting end,	--or boolean (optional)
+	warning = "Will need to reload the UI.",	--(optional)
+	default = defaults.var,	--(optional)
+	reference = "MyAddonCheckbox"	--(optional) unique global reference to control
+}	]]
+
+
+local widgetVersion = 5
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("checkbox", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+local cm = CALLBACK_MANAGER
+local tinsert = table.insert
+--label
+local enabledColor = ZO_DEFAULT_ENABLED_COLOR
+local enabledHLcolor = ZO_HIGHLIGHT_TEXT
+local disabledColor = ZO_DEFAULT_DISABLED_COLOR
+local disabledHLcolor = ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR
+--checkbox
+local checkboxColor = ZO_NORMAL_TEXT
+local checkboxHLcolor = ZO_HIGHLIGHT_TEXT
+
+
+local function UpdateDisabled(control)
+	local disable
+	if type(control.data.disabled) == "function" then
+		disable = control.data.disabled()
+	else
+		disable = control.data.disabled
+	end
+
+	control.label:SetColor((disable and ZO_DEFAULT_DISABLED_COLOR or control.value and ZO_DEFAULT_ENABLED_COLOR or ZO_DEFAULT_DISABLED_COLOR):UnpackRGBA())
+	control.checkbox:SetColor((disable and ZO_DEFAULT_DISABLED_COLOR or ZO_NORMAL_TEXT):UnpackRGBA())
+	--control:SetMouseEnabled(not disable)
+	--control:SetMouseEnabled(true)
+
+	control.isDisabled = disable
+end
+
+local function ToggleCheckbox(control)
+	if control.value then
+		control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+		control.checkbox:SetText(control.checkedText)
+	else
+		control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+		control.checkbox:SetText(control.uncheckedText)
+	end
+end
+
+local function UpdateValue(control, forceDefault, value)
+	if forceDefault then	--if we are forcing defaults
+		value = control.data.default
+		control.data.setFunc(value)
+	elseif value ~= nil then	--our value could be false
+		control.data.setFunc(value)
+		--after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
+		if control.panel.data.registerForRefresh then
+			cm:FireCallbacks("LAM-RefreshPanel", control)
+		end
+	else
+		value = control.data.getFunc()
+	end
+	control.value = value
+
+	ToggleCheckbox(control)
+end
+
+local function OnMouseEnter(control)
+	ZO_Options_OnMouseEnter(control)
+
+	if control.isDisabled then return end
+
+	local label = control.label
+	if control.value then
+		label:SetColor(ZO_HIGHLIGHT_TEXT:UnpackRGBA())
+	else
+		label:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
+	end
+	control.checkbox:SetColor(ZO_HIGHLIGHT_TEXT:UnpackRGBA())
+end
+
+local function OnMouseExit(control)
+    ZO_Options_OnMouseExit(control)
+
+	if control.isDisabled then return end
+
+	local label = control.label
+	if control.value then
+		label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+	else
+		label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+	end
+	control.checkbox:SetColor(ZO_NORMAL_TEXT:UnpackRGBA())
+end
+
+
+--controlName is optional
+function LAMCreateControl.checkbox(parent, checkboxData, controlName)
+	local control = wm:CreateTopLevelWindow(controlName or checkboxData.reference)
+	control:SetParent(parent.scroll or parent)
+	control:SetMouseEnabled(true)
+	control.tooltipText = checkboxData.tooltip
+	control:SetHandler("OnMouseEnter", OnMouseEnter)
+	control:SetHandler("OnMouseExit", OnMouseExit)
+	control:SetHandler("OnMouseUp", function(control)
+			if control.isDisabled then return end
+			PlaySound(SOUNDS.DEFAULT_CLICK)
+			control.value = not control.value
+			control:UpdateValue(false, control.value)
+		end)
+
+	control.label = wm:CreateControl(nil, control, CT_LABEL)
+	local label = control.label
+	label:SetFont("ZoFontWinH4")
+	label:SetText(checkboxData.name)
+	label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
+	label:SetHeight(26)
+
+	control.checkbox = wm:CreateControl(nil, control, CT_LABEL)
+	local checkbox = control.checkbox
+	checkbox:SetFont("ZoFontGameBold")
+	checkbox:SetColor(ZO_NORMAL_TEXT:UnpackRGBA())
+	control.checkedText = GetString(SI_CHECK_BUTTON_ON):upper()
+	control.uncheckedText = GetString(SI_CHECK_BUTTON_OFF):upper()
+
+	local isHalfWidth = checkboxData.width == "half"
+	if isHalfWidth then
+		control:SetDimensions(250, 55)
+		checkbox:SetDimensions(100, 26)
+		checkbox:SetAnchor(BOTTOMRIGHT)
+		label:SetAnchor(TOPLEFT)
+		label:SetAnchor(TOPRIGHT)
+	else
+		control:SetDimensions(510, 30)
+		checkbox:SetDimensions(200, 26)
+		checkbox:SetAnchor(RIGHT)
+		label:SetAnchor(LEFT)
+		label:SetAnchor(RIGHT, checkbox, LEFT, -5, 0)
+	end
+
+	if checkboxData.warning then
+		control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+		control.warning:SetAnchor(RIGHT, checkbox, LEFT, -5, 0)
+		control.warning.tooltipText = checkboxData.warning
+	end
+
+	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
+	control.data = checkboxData
+
+	if checkboxData.disabled then
+		control.UpdateDisabled = UpdateDisabled
+		control:UpdateDisabled()
+	end
+	control.UpdateValue = UpdateValue
+	control:UpdateValue()
+
+	if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then	--if our parent window wants to refresh controls, then add this to the list
+		tinsert(control.panel.controlsToRefresh, control)
+	end
+
+	return control
 end
\ No newline at end of file
diff --git a/Libs/LibAddonMenu-2.0/controls/colorpicker.lua b/Libs/LibAddonMenu-2.0/controls/colorpicker.lua
index 42e8e25..5cb314b 100644
--- a/Libs/LibAddonMenu-2.0/controls/colorpicker.lua
+++ b/Libs/LibAddonMenu-2.0/controls/colorpicker.lua
@@ -1,138 +1,138 @@
---[[colorpickerData = {
-	type = "colorpicker",
-	name = "My Color Picker",
-	tooltip = "Color Picker's tooltip text.",
-	getFunc = function() return db.r, db.g, db.b, db.a end,	--(alpha is optional)
-	setFunc = function(r,g,b,a) db.r=r, db.g=g, db.b=b, db.a=a end,	--(alpha is optional)
-	width = "full",	--or "half" (optional)
-	disabled = function() return db.someBooleanSetting end,	--or boolean (optional)
-	warning = "Will need to reload the UI.",	--(optional)
-	default = {defaults.r, defaults.g, defaults.b, defaults.a},	--(optional) table of default color values
-	reference = "MyAddonColorpicker"	--(optional) unique global reference to control
-}	]]
-
-
-local widgetVersion = 3
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("colorpicker", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-local cm = CALLBACK_MANAGER
-local tinsert = table.insert
-
-
-local function UpdateDisabled(control)
-	local disable
-	if type(control.data.disabled) == "function" then
-		disable = control.data.disabled()
-	else
-		disable = control.data.disabled
-	end
-
-	if disable then
-		control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-	else
-		control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-	end
-
-	control.isDisabled = disable
-end
-
-local function UpdateValue(control, forceDefault, valueR, valueG, valueB, valueA)
-	if forceDefault then	--if we are forcing defaults
-		local color = control.data.default
-		valueR, valueG, valueB, valueA = color.r, color.g, color.b, color.a
-		control.data.setFunc(valueR, valueG, valueB, valueA)
-	elseif valueR and valueG and valueB then
-		control.data.setFunc(valueR, valueG, valueB, valueA or 1)
-		--after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
-		if control.panel.data.registerForRefresh then
-			cm:FireCallbacks("LAM-RefreshPanel", control)
-		end
-	else
-		valueR, valueG, valueB, valueA = control.data.getFunc()
-	end
-
-	control.thumb:SetColor(valueR, valueG, valueB, valueA or 1)
-end
-
-
-function LAMCreateControl.colorpicker(parent, colorpickerData, controlName)
-	local control = wm:CreateTopLevelWindow(controlName or colorpickerData.reference)
-	control:SetParent(parent.scroll or parent)
-	control:SetMouseEnabled(true)
-	control.tooltipText = colorpickerData.tooltip
-	control:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
-	control:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
-
-	control.label = wm:CreateControl(nil, control, CT_LABEL)
-	local label = control.label
-	label:SetDimensions(300, 26)
-	label:SetAnchor(TOPLEFT)
-	label:SetFont("ZoFontWinH4")
-	label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
-	label:SetText(colorpickerData.name)
-
-	control.color = wm:CreateControl(nil, control, CT_CONTROL)
-	local color = control.color
-
-	local isHalfWidth = colorpickerData.width == "half"
-	if isHalfWidth then
-		control:SetDimensions(250, 55)
-		label:SetDimensions(250, 26)
-		color:SetDimensions(100, 24)
-		color:SetAnchor(TOPRIGHT, label, BOTTOMRIGHT)
-	else
-		control:SetDimensions(510, 30)
-		label:SetDimensions(300, 26)
-		color:SetDimensions(200, 24)
-		color:SetAnchor(TOPRIGHT)
-	end
-
-	control.thumb = wm:CreateControl(nil, color, CT_TEXTURE)
-	local thumb = control.thumb
-	thumb:SetDimensions(36, 18)
-	thumb:SetAnchor(LEFT, color, LEFT, 4, 0)
-
-	color.border = wm:CreateControl(nil, color, CT_TEXTURE)
-	local border = color.border
-	border:SetTexture("EsoUI\\Art\\ChatWindow\\chatOptions_bgColSwatch_frame.dds")
-	border:SetTextureCoords(0, .625, 0, .8125)
-	border:SetDimensions(40, 22)
-	border:SetAnchor(CENTER, thumb, CENTER, 0, 0)
-
-	local function ColorPickerCallback(r, g, b, a)
-			control:UpdateValue(false, r, g, b, a)
-		end
-
-	control:SetHandler("OnMouseUp", function(self, btn, upInside)
-			if self.isDisabled then return end
-
-			if upInside then
-				local r, g, b, a = colorpickerData.getFunc()
-				COLOR_PICKER:Show(ColorPickerCallback, r, g, b, a, colorpickerData.name)
-			end
-		end)
-
-	if colorpickerData.warning then
-		control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-		control.warning:SetAnchor(RIGHT, control.color, LEFT, -5, 0)
-		control.warning.tooltipText = colorpickerData.warning
-	end
-
-	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
-	control.data = colorpickerData
-
-	if colorpickerData.disabled then
-		control.UpdateDisabled = UpdateDisabled
-		control:UpdateDisabled()
-	end
-	control.UpdateValue = UpdateValue
-	control:UpdateValue()
-
-	if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then	--if our parent window wants to refresh controls, then add this to the list
-		tinsert(control.panel.controlsToRefresh, control)
-	end
-
-	return control
+--[[colorpickerData = {
+	type = "colorpicker",
+	name = "My Color Picker",
+	tooltip = "Color Picker's tooltip text.",
+	getFunc = function() return db.r, db.g, db.b, db.a end,	--(alpha is optional)
+	setFunc = function(r,g,b,a) db.r=r, db.g=g, db.b=b, db.a=a end,	--(alpha is optional)
+	width = "full",	--or "half" (optional)
+	disabled = function() return db.someBooleanSetting end,	--or boolean (optional)
+	warning = "Will need to reload the UI.",	--(optional)
+	default = {defaults.r, defaults.g, defaults.b, defaults.a},	--(optional) table of default color values
+	reference = "MyAddonColorpicker"	--(optional) unique global reference to control
+}	]]
+
+
+local widgetVersion = 3
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("colorpicker", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+local cm = CALLBACK_MANAGER
+local tinsert = table.insert
+
+
+local function UpdateDisabled(control)
+	local disable
+	if type(control.data.disabled) == "function" then
+		disable = control.data.disabled()
+	else
+		disable = control.data.disabled
+	end
+
+	if disable then
+		control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+	else
+		control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+	end
+
+	control.isDisabled = disable
+end
+
+local function UpdateValue(control, forceDefault, valueR, valueG, valueB, valueA)
+	if forceDefault then	--if we are forcing defaults
+		local color = control.data.default
+		valueR, valueG, valueB, valueA = color.r, color.g, color.b, color.a
+		control.data.setFunc(valueR, valueG, valueB, valueA)
+	elseif valueR and valueG and valueB then
+		control.data.setFunc(valueR, valueG, valueB, valueA or 1)
+		--after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
+		if control.panel.data.registerForRefresh then
+			cm:FireCallbacks("LAM-RefreshPanel", control)
+		end
+	else
+		valueR, valueG, valueB, valueA = control.data.getFunc()
+	end
+
+	control.thumb:SetColor(valueR, valueG, valueB, valueA or 1)
+end
+
+
+function LAMCreateControl.colorpicker(parent, colorpickerData, controlName)
+	local control = wm:CreateTopLevelWindow(controlName or colorpickerData.reference)
+	control:SetParent(parent.scroll or parent)
+	control:SetMouseEnabled(true)
+	control.tooltipText = colorpickerData.tooltip
+	control:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
+	control:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
+
+	control.label = wm:CreateControl(nil, control, CT_LABEL)
+	local label = control.label
+	label:SetDimensions(300, 26)
+	label:SetAnchor(TOPLEFT)
+	label:SetFont("ZoFontWinH4")
+	label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
+	label:SetText(colorpickerData.name)
+
+	control.color = wm:CreateControl(nil, control, CT_CONTROL)
+	local color = control.color
+
+	local isHalfWidth = colorpickerData.width == "half"
+	if isHalfWidth then
+		control:SetDimensions(250, 55)
+		label:SetDimensions(250, 26)
+		color:SetDimensions(100, 24)
+		color:SetAnchor(TOPRIGHT, label, BOTTOMRIGHT)
+	else
+		control:SetDimensions(510, 30)
+		label:SetDimensions(300, 26)
+		color:SetDimensions(200, 24)
+		color:SetAnchor(TOPRIGHT)
+	end
+
+	control.thumb = wm:CreateControl(nil, color, CT_TEXTURE)
+	local thumb = control.thumb
+	thumb:SetDimensions(36, 18)
+	thumb:SetAnchor(LEFT, color, LEFT, 4, 0)
+
+	color.border = wm:CreateControl(nil, color, CT_TEXTURE)
+	local border = color.border
+	border:SetTexture("EsoUI\\Art\\ChatWindow\\chatOptions_bgColSwatch_frame.dds")
+	border:SetTextureCoords(0, .625, 0, .8125)
+	border:SetDimensions(40, 22)
+	border:SetAnchor(CENTER, thumb, CENTER, 0, 0)
+
+	local function ColorPickerCallback(r, g, b, a)
+			control:UpdateValue(false, r, g, b, a)
+		end
+
+	control:SetHandler("OnMouseUp", function(self, btn, upInside)
+			if self.isDisabled then return end
+
+			if upInside then
+				local r, g, b, a = colorpickerData.getFunc()
+				COLOR_PICKER:Show(ColorPickerCallback, r, g, b, a, colorpickerData.name)
+			end
+		end)
+
+	if colorpickerData.warning then
+		control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+		control.warning:SetAnchor(RIGHT, control.color, LEFT, -5, 0)
+		control.warning.tooltipText = colorpickerData.warning
+	end
+
+	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
+	control.data = colorpickerData
+
+	if colorpickerData.disabled then
+		control.UpdateDisabled = UpdateDisabled
+		control:UpdateDisabled()
+	end
+	control.UpdateValue = UpdateValue
+	control:UpdateValue()
+
+	if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then	--if our parent window wants to refresh controls, then add this to the list
+		tinsert(control.panel.controlsToRefresh, control)
+	end
+
+	return control
 end
\ No newline at end of file
diff --git a/Libs/LibAddonMenu-2.0/controls/custom.lua b/Libs/LibAddonMenu-2.0/controls/custom.lua
index 8d58ef3..447cf5e 100644
--- a/Libs/LibAddonMenu-2.0/controls/custom.lua
+++ b/Libs/LibAddonMenu-2.0/controls/custom.lua
@@ -1,31 +1,31 @@
---[[customData = {
-	type = "custom",
-	reference = "MyAddonCustomControl",	--unique name for your control to use as reference
-	width = "full",	--or "half" (optional)
-}	]]
-
-local widgetVersion = 3
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("custom", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-function LAMCreateControl.custom(parent, customData, controlName)
-	local control = wm:CreateTopLevelWindow(controlName or customData.reference)
-	control:SetResizeToFitDescendents(true)
-	control:SetParent(parent.scroll or parent)
-
-	local isHalfWidth = customData.width == "half"
-	if isHalfWidth then	--note these restrictions
-		control:SetDimensionConstraints(250, 55, 250, 100)
-		control:SetDimensions(250, 55)
-	else
-		control:SetDimensionConstraints(510, 30, 510, 100)
-		control:SetDimensions(510, 30)
-	end
-
-	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
-	control.data = customData
-
-	return control
+--[[customData = {
+	type = "custom",
+	reference = "MyAddonCustomControl",	--unique name for your control to use as reference
+	width = "full",	--or "half" (optional)
+}	]]
+
+local widgetVersion = 3
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("custom", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+function LAMCreateControl.custom(parent, customData, controlName)
+	local control = wm:CreateTopLevelWindow(controlName or customData.reference)
+	control:SetResizeToFitDescendents(true)
+	control:SetParent(parent.scroll or parent)
+
+	local isHalfWidth = customData.width == "half"
+	if isHalfWidth then	--note these restrictions
+		control:SetDimensionConstraints(250, 55, 250, 100)
+		control:SetDimensions(250, 55)
+	else
+		control:SetDimensionConstraints(510, 30, 510, 100)
+		control:SetDimensions(510, 30)
+	end
+
+	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
+	control.data = customData
+
+	return control
 end
\ No newline at end of file
diff --git a/Libs/LibAddonMenu-2.0/controls/description.lua b/Libs/LibAddonMenu-2.0/controls/description.lua
index 41161f9..700fd75 100644
--- a/Libs/LibAddonMenu-2.0/controls/description.lua
+++ b/Libs/LibAddonMenu-2.0/controls/description.lua
@@ -1,53 +1,53 @@
---[[descriptionData = {
-	type = "description",
-	title = "My Title",	--(optional)
-	text = "My description text to display.",
-	width = "full",	--or "half" (optional)
-	reference = "MyAddonDescription"	--(optional) unique global reference to control
-}	]]
-
-
-local widgetVersion = 3
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("description", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-function LAMCreateControl.description(parent, descriptionData, controlName)
-	local control = wm:CreateTopLevelWindow(controlName or descriptionData.reference)
-	control:SetResizeToFitDescendents(true)
-	control:SetParent(parent.scroll or parent)
-	local isHalfWidth = descriptionData.width == "half"
-	if isHalfWidth then
-		control:SetDimensionConstraints(250, 55, 250, 100)
-		control:SetDimensions(250, 55)
-	else
-		control:SetDimensionConstraints(510, 40, 510, 100)
-		control:SetDimensions(510, 30)
-	end
-
-	control.desc = wm:CreateControl(nil, control, CT_LABEL)
-	local desc = control.desc
-	desc:SetVerticalAlignment(TEXT_ALIGN_TOP)
-	desc:SetFont("ZoFontGame")
-	desc:SetText(descriptionData.text)
-	desc:SetWidth(isHalfWidth and 250 or 510)
-
-	if descriptionData.title then
-		control.title = wm:CreateControl(nil, control, CT_LABEL)
-		local title = control.title
-		title:SetWidth(isHalfWidth and 250 or 510)
-		title:SetAnchor(TOPLEFT, control, TOPLEFT)
-		title:SetFont("ZoFontWinH4")
-		title:SetText(descriptionData.title)
-		desc:SetAnchor(TOPLEFT, title, BOTTOMLEFT)
-	else
-		desc:SetAnchor(TOPLEFT)
-	end
-
-	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
-	control.data = descriptionData
-
-	return control
-
+--[[descriptionData = {
+	type = "description",
+	title = "My Title",	--(optional)
+	text = "My description text to display.",
+	width = "full",	--or "half" (optional)
+	reference = "MyAddonDescription"	--(optional) unique global reference to control
+}	]]
+
+
+local widgetVersion = 3
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("description", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+function LAMCreateControl.description(parent, descriptionData, controlName)
+	local control = wm:CreateTopLevelWindow(controlName or descriptionData.reference)
+	control:SetResizeToFitDescendents(true)
+	control:SetParent(parent.scroll or parent)
+	local isHalfWidth = descriptionData.width == "half"
+	if isHalfWidth then
+		control:SetDimensionConstraints(250, 55, 250, 100)
+		control:SetDimensions(250, 55)
+	else
+		control:SetDimensionConstraints(510, 40, 510, 100)
+		control:SetDimensions(510, 30)
+	end
+
+	control.desc = wm:CreateControl(nil, control, CT_LABEL)
+	local desc = control.desc
+	desc:SetVerticalAlignment(TEXT_ALIGN_TOP)
+	desc:SetFont("ZoFontGame")
+	desc:SetText(descriptionData.text)
+	desc:SetWidth(isHalfWidth and 250 or 510)
+
+	if descriptionData.title then
+		control.title = wm:CreateControl(nil, control, CT_LABEL)
+		local title = control.title
+		title:SetWidth(isHalfWidth and 250 or 510)
+		title:SetAnchor(TOPLEFT, control, TOPLEFT)
+		title:SetFont("ZoFontWinH4")
+		title:SetText(descriptionData.title)
+		desc:SetAnchor(TOPLEFT, title, BOTTOMLEFT)
+	else
+		desc:SetAnchor(TOPLEFT)
+	end
+
+	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
+	control.data = descriptionData
+
+	return control
+
 end
\ No newline at end of file
diff --git a/Libs/LibAddonMenu-2.0/controls/dropdown.lua b/Libs/LibAddonMenu-2.0/controls/dropdown.lua
index 65b2b13..137196e 100644
--- a/Libs/LibAddonMenu-2.0/controls/dropdown.lua
+++ b/Libs/LibAddonMenu-2.0/controls/dropdown.lua
@@ -1,153 +1,153 @@
---[[dropdownData = {
-	type = "dropdown",
-	name = "My Dropdown",
-	tooltip = "Dropdown's tooltip text.",
-	choices = {"table", "of", "choices"},
-	sort = "name-up", --or "name-down", "numeric-up", "numeric-down" (optional) - if not provided, list will not be sorted
-	getFunc = function() return db.var end,
-	setFunc = function(var) db.var = var doStuff() end,
-	width = "full",	--or "half" (optional)
-	disabled = function() return db.someBooleanSetting end,	--or boolean (optional)
-	warning = "Will need to reload the UI.",	--(optional)
-	default = defaults.var,	--(optional)
-	reference = "MyAddonDropdown"	--(optional) unique global reference to control
-}	]]
-
-
-local widgetVersion = 4
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("dropdown", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-local cm = CALLBACK_MANAGER
-local tinsert = table.insert
-
-
-local function UpdateDisabled(control)
-	local disable
-	if type(control.data.disabled) == "function" then
-		disable = control.data.disabled()
-	else
-		disable = control.data.disabled
-	end
-
-	control.dropdown:SetEnabled(not disable)
-	if disable then
-		control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-	else
-		control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-	end
-end
-
-local function UpdateValue(control, forceDefault, value)
-	if forceDefault then	--if we are forcing defaults
-		value = control.data.default
-		control.data.setFunc(value)
-		control.dropdown:SetSelectedItem(value)
-	elseif value then
-		control.data.setFunc(value)
-		--after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
-		if control.panel.data.registerForRefresh then
-			cm:FireCallbacks("LAM-RefreshPanel", control)
-		end
-	else
-		value = control.data.getFunc()
-		control.dropdown:SetSelectedItem(value)
-	end
-end
-
-local function DropdownCallback(choice, choiceText, choice)
-	choice.control:UpdateValue(false, choiceText)
-end
-
-local function UpdateChoices(control, choices)
-	control.dropdown:ClearItems()	--remove previous choices	--(need to call :SetSelectedItem()?)
-
-	--build new list of choices
-	local choices = choices or control.data.choices
-	for i = 1, #choices do
-		local entry = control.dropdown:CreateItemEntry(choices[i], DropdownCallback)
-		entry.control = control
-		control.dropdown:AddItem(entry, not control.data.sort and ZO_COMBOBOX_SUPRESS_UPDATE)	--if sort type/order isn't specified, then don't sort
-	end
-end
-
-local function GrabSortingInfo(sortInfo)
-	local t, i = {}, 1
-	for info in string.gmatch(sortInfo, "([^%-]+)") do
-		t[i] = info
-		i = i + 1
-	end
-
-	return t
-end
-
-
-local comboboxCount = 1
-function LAMCreateControl.dropdown(parent, dropdownData, controlName)
-	local control = wm:CreateTopLevelWindow(controlName or dropdownData.reference)
-	control:SetParent(parent.scroll or parent)
-	control:SetMouseEnabled(true)
-	control.tooltipText = dropdownData.tooltip
-	control:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
-	control:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
-
-	control.label = wm:CreateControl(nil, control, CT_LABEL)
-	local label = control.label
-	label:SetAnchor(TOPLEFT)
-	label:SetFont("ZoFontWinH4")
-	label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
-	label:SetText(dropdownData.name)
-
-	control.combobox = wm:CreateControlFromVirtual(parent:GetName().."Combobox"..comboboxCount, control, "ZO_ComboBox")
-	comboboxCount = comboboxCount + 1
-	local combobox = control.combobox
-	combobox:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
-	combobox:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
-	control.dropdown = ZO_ComboBox_ObjectFromContainer(combobox)
-	local dropdown = control.dropdown
-	if dropdownData.sort then
-		local sortInfo = GrabSortingInfo(dropdownData.sort)
-		local sortType, sortOrder = sortInfo[1], sortInfo[2]
-		dropdown:SetSortOrder(sortOrder == "up" and ZO_SORT_ORDER_UP or ZO_SORT_ORDER_DOWN, sortType == "name" and ZO_SORT_BY_NAME or ZO_SORT_BY_NAME_NUMERIC)
-	end
-
-	local isHalfWidth = dropdownData.width == "half"
-	if isHalfWidth then
-		control:SetDimensions(250, 55)
-		label:SetDimensions(250, 26)
-		combobox:SetDimensions(240, 26)
-		--dropdown:SetWidth(240)
-		combobox:SetAnchor(TOPRIGHT, label, BOTTOMRIGHT)
-	else
-		control:SetDimensions(510, 30)
-		label:SetDimensions(300, 26)
-		combobox:SetDimensions(200, 26)
-		--dropdown:SetWidth(200)
-		combobox:SetAnchor(TOPRIGHT)
-	end
-
-	if warning then
-		control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-		control.warning:SetAnchor(RIGHT, combobox, LEFT, -5, 0)
-		control.warning.tooltipText = warningText
-	end
-
-	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
-	control.data = dropdownData
-
-	if dropdownData.disabled then
-		control.UpdateDisabled = UpdateDisabled
-		control:UpdateDisabled()
-	end
-	control.UpdateChoices = UpdateChoices
-	control:UpdateChoices(dropdownData.choices)
-	control.UpdateValue = UpdateValue
-	control:UpdateValue()
-
-	if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then	--if our parent window wants to refresh controls, then add this to the list
-		tinsert(control.panel.controlsToRefresh, control)
-	end
-
-	return control
+--[[dropdownData = {
+	type = "dropdown",
+	name = "My Dropdown",
+	tooltip = "Dropdown's tooltip text.",
+	choices = {"table", "of", "choices"},
+	sort = "name-up", --or "name-down", "numeric-up", "numeric-down" (optional) - if not provided, list will not be sorted
+	getFunc = function() return db.var end,
+	setFunc = function(var) db.var = var doStuff() end,
+	width = "full",	--or "half" (optional)
+	disabled = function() return db.someBooleanSetting end,	--or boolean (optional)
+	warning = "Will need to reload the UI.",	--(optional)
+	default = defaults.var,	--(optional)
+	reference = "MyAddonDropdown"	--(optional) unique global reference to control
+}	]]
+
+
+local widgetVersion = 4
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("dropdown", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+local cm = CALLBACK_MANAGER
+local tinsert = table.insert
+
+
+local function UpdateDisabled(control)
+	local disable
+	if type(control.data.disabled) == "function" then
+		disable = control.data.disabled()
+	else
+		disable = control.data.disabled
+	end
+
+	control.dropdown:SetEnabled(not disable)
+	if disable then
+		control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+	else
+		control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+	end
+end
+
+local function UpdateValue(control, forceDefault, value)
+	if forceDefault then	--if we are forcing defaults
+		value = control.data.default
+		control.data.setFunc(value)
+		control.dropdown:SetSelectedItem(value)
+	elseif value then
+		control.data.setFunc(value)
+		--after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
+		if control.panel.data.registerForRefresh then
+			cm:FireCallbacks("LAM-RefreshPanel", control)
+		end
+	else
+		value = control.data.getFunc()
+		control.dropdown:SetSelectedItem(value)
+	end
+end
+
+local function DropdownCallback(choice, choiceText, choice)
+	choice.control:UpdateValue(false, choiceText)
+end
+
+local function UpdateChoices(control, choices)
+	control.dropdown:ClearItems()	--remove previous choices	--(need to call :SetSelectedItem()?)
+
+	--build new list of choices
+	local choices = choices or control.data.choices
+	for i = 1, #choices do
+		local entry = control.dropdown:CreateItemEntry(choices[i], DropdownCallback)
+		entry.control = control
+		control.dropdown:AddItem(entry, not control.data.sort and ZO_COMBOBOX_SUPRESS_UPDATE)	--if sort type/order isn't specified, then don't sort
+	end
+end
+
+local function GrabSortingInfo(sortInfo)
+	local t, i = {}, 1
+	for info in string.gmatch(sortInfo, "([^%-]+)") do
+		t[i] = info
+		i = i + 1
+	end
+
+	return t
+end
+
+
+local comboboxCount = 1
+function LAMCreateControl.dropdown(parent, dropdownData, controlName)
+	local control = wm:CreateTopLevelWindow(controlName or dropdownData.reference)
+	control:SetParent(parent.scroll or parent)
+	control:SetMouseEnabled(true)
+	control.tooltipText = dropdownData.tooltip
+	control:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
+	control:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
+
+	control.label = wm:CreateControl(nil, control, CT_LABEL)
+	local label = control.label
+	label:SetAnchor(TOPLEFT)
+	label:SetFont("ZoFontWinH4")
+	label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
+	label:SetText(dropdownData.name)
+
+	control.combobox = wm:CreateControlFromVirtual(parent:GetName().."Combobox"..comboboxCount, control, "ZO_ComboBox")
+	comboboxCount = comboboxCount + 1
+	local combobox = control.combobox
+	combobox:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
+	combobox:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
+	control.dropdown = ZO_ComboBox_ObjectFromContainer(combobox)
+	local dropdown = control.dropdown
+	if dropdownData.sort then
+		local sortInfo = GrabSortingInfo(dropdownData.sort)
+		local sortType, sortOrder = sortInfo[1], sortInfo[2]
+		dropdown:SetSortOrder(sortOrder == "up" and ZO_SORT_ORDER_UP or ZO_SORT_ORDER_DOWN, sortType == "name" and ZO_SORT_BY_NAME or ZO_SORT_BY_NAME_NUMERIC)
+	end
+
+	local isHalfWidth = dropdownData.width == "half"
+	if isHalfWidth then
+		control:SetDimensions(250, 55)
+		label:SetDimensions(250, 26)
+		combobox:SetDimensions(240, 26)
+		--dropdown:SetWidth(240)
+		combobox:SetAnchor(TOPRIGHT, label, BOTTOMRIGHT)
+	else
+		control:SetDimensions(510, 30)
+		label:SetDimensions(300, 26)
+		combobox:SetDimensions(200, 26)
+		--dropdown:SetWidth(200)
+		combobox:SetAnchor(TOPRIGHT)
+	end
+
+	if warning then
+		control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+		control.warning:SetAnchor(RIGHT, combobox, LEFT, -5, 0)
+		control.warning.tooltipText = warningText
+	end
+
+	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
+	control.data = dropdownData
+
+	if dropdownData.disabled then
+		control.UpdateDisabled = UpdateDisabled
+		control:UpdateDisabled()
+	end
+	control.UpdateChoices = UpdateChoices
+	control:UpdateChoices(dropdownData.choices)
+	control.UpdateValue = UpdateValue
+	control:UpdateValue()
+
+	if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then	--if our parent window wants to refresh controls, then add this to the list
+		tinsert(control.panel.controlsToRefresh, control)
+	end
+
+	return control
 end
\ No newline at end of file
diff --git a/Libs/LibAddonMenu-2.0/controls/editbox.lua b/Libs/LibAddonMenu-2.0/controls/editbox.lua
index 3b92ea0..b20163d 100644
--- a/Libs/LibAddonMenu-2.0/controls/editbox.lua
+++ b/Libs/LibAddonMenu-2.0/controls/editbox.lua
@@ -1,153 +1,153 @@
---[[editboxData = {
-	type = "editbox",
-	name = "My Editbox",
-	tooltip = "Editbox's tooltip text.",
-	getFunc = function() return db.text end,
-	setFunc = function(text) db.text = text doStuff() end,
-	isMultiline = true,	--boolean
-	width = "full",	--or "half" (optional)
-	disabled = function() return db.someBooleanSetting end,	--or boolean (optional)
-	warning = "Will need to reload the UI.",	--(optional)
-	default = defaults.text,	--(optional)
-	reference = "MyAddonEditbox"	--(optional) unique global reference to control
-}	]]
-
-
-local widgetVersion = 4
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("editbox", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-local cm = CALLBACK_MANAGER
-local tinsert = table.insert
-
-
-local function UpdateDisabled(control)
-	local disable
-	if type(control.data.disabled) == "function" then
-		disable = control.data.disabled()
-	else
-		disable = control.data.disabled
-	end
-
-	if disable then
-		control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-		control.editbox:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
-	else
-		control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-		control.editbox:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-	end
-	--control.editbox:SetEditEnabled(not disable)
-	control.editbox:SetMouseEnabled(not disable)
-end
-
-local function UpdateValue(control, forceDefault, value)
-	if forceDefault then	--if we are forcing defaults
-		value = control.data.default
-		control.data.setFunc(value)
-		control.editbox:SetText(value)
-	elseif value then
-		control.data.setFunc(value)
-		--after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
-		if control.panel.data.registerForRefresh then
-			cm:FireCallbacks("LAM-RefreshPanel", control)
-		end
-	else
-		value = control.data.getFunc()
-		control.editbox:SetText(value)
-	end
-end
-
-
-function LAMCreateControl.editbox(parent, editboxData, controlName)
-	local control = wm:CreateTopLevelWindow(controlName or editboxData.reference)
-	control:SetParent(parent.scroll or parent)
-	control:SetMouseEnabled(true)
-	control:SetResizeToFitDescendents(true)
-	control.tooltipText = editboxData.tooltip
-	control:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
-	control:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
-
-	control.label = wm:CreateControl(nil, control, CT_LABEL)
-	local label = control.label
-	label:SetAnchor(TOPLEFT)
-	label:SetFont("ZoFontWinH4")
-	label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
-	label:SetText(editboxData.name)
-
-	control.bg = wm:CreateControlFromVirtual(nil, control, "ZO_EditBackdrop")
-	local bg = control.bg
-
-	if editboxData.isMultiline then
-		control.editbox = wm:CreateControlFromVirtual(nil, bg, "ZO_DefaultEditMultiLineForBackdrop")
-		control.editbox:SetHandler("OnMouseWheel", function(self, delta)
-				if self:HasFocus() then	--only set focus to new spots if the editbox is currently in use
-					local cursorPos = self:GetCursorPosition()
-					local text = self:GetText()
-					local textLen = text:len()
-					local newPos
-					if delta > 0 then	--scrolling up
-						local reverseText = text:reverse()
-						local revCursorPos = textLen - cursorPos
-						local revPos = reverseText:find("\n", revCursorPos+1)
-						newPos = revPos and textLen - revPos
-					else	--scrolling down
-						newPos = text:find("\n", cursorPos+1)
-					end
-					if newPos then	--if we found a new line, then scroll, otherwise don't
-						self:SetCursorPosition(newPos)
-					end
-				end
-			end)
-	else
-		control.editbox = wm:CreateControlFromVirtual(nil, bg, "ZO_DefaultEditForBackdrop")
-	end
-	local editbox = control.editbox
-	editbox:SetText(editboxData.getFunc())
-	editbox:SetMaxInputChars(3000)
-	editbox:SetHandler("OnFocusLost", function(self) control:UpdateValue(false, self:GetText()) end)
-	editbox:SetHandler("OnEscape", function(self) self:LoseFocus() control:UpdateValue(false, self:GetText()) end)
-	editbox:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
-	editbox:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
-
-	local isHalfWidth = editboxData.width == "half"
-	if isHalfWidth then
-		control:SetDimensions(250, 55)
-		label:SetDimensions(250, 26)
-		bg:SetDimensions(225, editboxData.isMultiline and 74 or 24)
-		bg:SetAnchor(TOPRIGHT, label, BOTTOMRIGHT)
-		if editboxData.isMultiline then
-			editbox:SetDimensionConstraints(210, 74, 210, 500)
-		end
-	else
-		control:SetDimensions(510, 30)
-		label:SetDimensions(300, 26)
-		bg:SetDimensions(200, editboxData.isMultiline and 100 or 24)
-		bg:SetAnchor(TOPRIGHT)
-		if editboxData.isMultiline then
-			editbox:SetDimensionConstraints(185, 100, 185, 500)
-		end
-	end
-
-	if editboxData.warning then
-		control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-		control.warning:SetAnchor(TOPRIGHT, control.bg, TOPLEFT, -5, 0)
-		control.warning.tooltipText = editboxData.warning
-	end
-
-	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
-	control.data = editboxData
-
-	if editboxData.disabled then
-		control.UpdateDisabled = UpdateDisabled
-		control:UpdateDisabled()
-	end
-	control.UpdateValue = UpdateValue
-	control:UpdateValue()
-
-	if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then	--if our parent window wants to refresh controls, then add this to the list
-		tinsert(control.panel.controlsToRefresh, control)
-	end
-
-	return control
+--[[editboxData = {
+	type = "editbox",
+	name = "My Editbox",
+	tooltip = "Editbox's tooltip text.",
+	getFunc = function() return db.text end,
+	setFunc = function(text) db.text = text doStuff() end,
+	isMultiline = true,	--boolean
+	width = "full",	--or "half" (optional)
+	disabled = function() return db.someBooleanSetting end,	--or boolean (optional)
+	warning = "Will need to reload the UI.",	--(optional)
+	default = defaults.text,	--(optional)
+	reference = "MyAddonEditbox"	--(optional) unique global reference to control
+}	]]
+
+
+local widgetVersion = 4
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("editbox", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+local cm = CALLBACK_MANAGER
+local tinsert = table.insert
+
+
+local function UpdateDisabled(control)
+	local disable
+	if type(control.data.disabled) == "function" then
+		disable = control.data.disabled()
+	else
+		disable = control.data.disabled
+	end
+
+	if disable then
+		control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+		control.editbox:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
+	else
+		control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+		control.editbox:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+	end
+	--control.editbox:SetEditEnabled(not disable)
+	control.editbox:SetMouseEnabled(not disable)
+end
+
+local function UpdateValue(control, forceDefault, value)
+	if forceDefault then	--if we are forcing defaults
+		value = control.data.default
+		control.data.setFunc(value)
+		control.editbox:SetText(value)
+	elseif value then
+		control.data.setFunc(value)
+		--after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
+		if control.panel.data.registerForRefresh then
+			cm:FireCallbacks("LAM-RefreshPanel", control)
+		end
+	else
+		value = control.data.getFunc()
+		control.editbox:SetText(value)
+	end
+end
+
+
+function LAMCreateControl.editbox(parent, editboxData, controlName)
+	local control = wm:CreateTopLevelWindow(controlName or editboxData.reference)
+	control:SetParent(parent.scroll or parent)
+	control:SetMouseEnabled(true)
+	control:SetResizeToFitDescendents(true)
+	control.tooltipText = editboxData.tooltip
+	control:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
+	control:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
+
+	control.label = wm:CreateControl(nil, control, CT_LABEL)
+	local label = control.label
+	label:SetAnchor(TOPLEFT)
+	label:SetFont("ZoFontWinH4")
+	label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
+	label:SetText(editboxData.name)
+
+	control.bg = wm:CreateControlFromVirtual(nil, control, "ZO_EditBackdrop")
+	local bg = control.bg
+
+	if editboxData.isMultiline then
+		control.editbox = wm:CreateControlFromVirtual(nil, bg, "ZO_DefaultEditMultiLineForBackdrop")
+		control.editbox:SetHandler("OnMouseWheel", function(self, delta)
+				if self:HasFocus() then	--only set focus to new spots if the editbox is currently in use
+					local cursorPos = self:GetCursorPosition()
+					local text = self:GetText()
+					local textLen = text:len()
+					local newPos
+					if delta > 0 then	--scrolling up
+						local reverseText = text:reverse()
+						local revCursorPos = textLen - cursorPos
+						local revPos = reverseText:find("\n", revCursorPos+1)
+						newPos = revPos and textLen - revPos
+					else	--scrolling down
+						newPos = text:find("\n", cursorPos+1)
+					end
+					if newPos then	--if we found a new line, then scroll, otherwise don't
+						self:SetCursorPosition(newPos)
+					end
+				end
+			end)
+	else
+		control.editbox = wm:CreateControlFromVirtual(nil, bg, "ZO_DefaultEditForBackdrop")
+	end
+	local editbox = control.editbox
+	editbox:SetText(editboxData.getFunc())
+	editbox:SetMaxInputChars(3000)
+	editbox:SetHandler("OnFocusLost", function(self) control:UpdateValue(false, self:GetText()) end)
+	editbox:SetHandler("OnEscape", function(self) self:LoseFocus() control:UpdateValue(false, self:GetText()) end)
+	editbox:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
+	editbox:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
+
+	local isHalfWidth = editboxData.width == "half"
+	if isHalfWidth then
+		control:SetDimensions(250, 55)
+		label:SetDimensions(250, 26)
+		bg:SetDimensions(225, editboxData.isMultiline and 74 or 24)
+		bg:SetAnchor(TOPRIGHT, label, BOTTOMRIGHT)
+		if editboxData.isMultiline then
+			editbox:SetDimensionConstraints(210, 74, 210, 500)
+		end
+	else
+		control:SetDimensions(510, 30)
+		label:SetDimensions(300, 26)
+		bg:SetDimensions(200, editboxData.isMultiline and 100 or 24)
+		bg:SetAnchor(TOPRIGHT)
+		if editboxData.isMultiline then
+			editbox:SetDimensionConstraints(185, 100, 185, 500)
+		end
+	end
+
+	if editboxData.warning then
+		control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+		control.warning:SetAnchor(TOPRIGHT, control.bg, TOPLEFT, -5, 0)
+		control.warning.tooltipText = editboxData.warning
+	end
+
+	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
+	control.data = editboxData
+
+	if editboxData.disabled then
+		control.UpdateDisabled = UpdateDisabled
+		control:UpdateDisabled()
+	end
+	control.UpdateValue = UpdateValue
+	control:UpdateValue()
+
+	if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then	--if our parent window wants to refresh controls, then add this to the list
+		tinsert(control.panel.controlsToRefresh, control)
+	end
+
+	return control
 end
\ No newline at end of file
diff --git a/Libs/LibAddonMenu-2.0/controls/header.lua b/Libs/LibAddonMenu-2.0/controls/header.lua
index 9712e24..ea6a097 100644
--- a/Libs/LibAddonMenu-2.0/controls/header.lua
+++ b/Libs/LibAddonMenu-2.0/controls/header.lua
@@ -1,36 +1,36 @@
---[[headerData = {
-	type = "header",
-	name = "My Header",
-	width = "full",	--or "half" (optional)
-	reference = "MyAddonHeader"	--(optional) unique global reference to control
-}	]]
-
-
-local widgetVersion = 3
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("header", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-function LAMCreateControl.header(parent, headerData, controlName)
-	local control = wm:CreateTopLevelWindow(controlName or headerData.reference)
-	control:SetParent(parent.scroll or parent)
-	local isHalfWidth = headerData.width == "half"
-	control:SetDimensions(isHalfWidth and 250 or 510, 30)
-
-	control.divider = wm:CreateControlFromVirtual(nil, control, "ZO_Options_Divider")
-	local divider = control.divider
-	divider:SetWidth(isHalfWidth and 250 or 510)
-	divider:SetAnchor(TOPLEFT)
-
-	control.header = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
-	local header = control.header
-	header:SetAnchor(TOPLEFT, divider, BOTTOMLEFT)
-	header:SetAnchor(BOTTOMRIGHT)
-	header:SetText(headerData.name)
-
-	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
-	control.data = headerData
-
-	return control
+--[[headerData = {
+	type = "header",
+	name = "My Header",
+	width = "full",	--or "half" (optional)
+	reference = "MyAddonHeader"	--(optional) unique global reference to control
+}	]]
+
+
+local widgetVersion = 3
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("header", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+function LAMCreateControl.header(parent, headerData, controlName)
+	local control = wm:CreateTopLevelWindow(controlName or headerData.reference)
+	control:SetParent(parent.scroll or parent)
+	local isHalfWidth = headerData.width == "half"
+	control:SetDimensions(isHalfWidth and 250 or 510, 30)
+
+	control.divider = wm:CreateControlFromVirtual(nil, control, "ZO_Options_Divider")
+	local divider = control.divider
+	divider:SetWidth(isHalfWidth and 250 or 510)
+	divider:SetAnchor(TOPLEFT)
+
+	control.header = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
+	local header = control.header
+	header:SetAnchor(TOPLEFT, divider, BOTTOMLEFT)
+	header:SetAnchor(BOTTOMRIGHT)
+	header:SetText(headerData.name)
+
+	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
+	control.data = headerData
+
+	return control
 end
\ No newline at end of file
diff --git a/Libs/LibAddonMenu-2.0/controls/panel.lua b/Libs/LibAddonMenu-2.0/controls/panel.lua
index ed3d2ff..cf4603b 100644
--- a/Libs/LibAddonMenu-2.0/controls/panel.lua
+++ b/Libs/LibAddonMenu-2.0/controls/panel.lua
@@ -1,136 +1,136 @@
---[[panelData = {
-	type = "panel",
-	name = "Window Title",
-	displayName = "My Longer Window Title",	--(optional) (can be useful for long addon names or if you want to colorize it)
-	author = "Seerah",	--(optional)
-	version = "2.0",	--(optional)
-	slashCommand = "/myaddon",	--(optional) will register a keybind to open to this panel (don't forget to include the slash!)
-	registerForRefresh = true,	--boolean (optional) (will refresh all options controls when a setting is changed and when the panel is shown)
-	registerForDefaults = true,	--boolean (optional) (will set all options controls back to default values)
-	resetFunc = function() print("defaults reset") end,	--(optional) custom function to run after settings are reset to defaults
-}	]]
-
-
-local widgetVersion = 5
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("panel", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-local cm = CALLBACK_MANAGER
-
-local function RefreshPanel(control)
-	local panel = control.panel or control	--callback can be fired by a single control or by the panel showing
-	local panelControls = panel.controlsToRefresh
-
-	for i = 1, #panelControls do
-		local updateControl = panelControls[i]
-		if  updateControl ~= control then
-			if updateControl.UpdateValue then
-				updateControl:UpdateValue()
-			end
-			if updateControl.UpdateDisabled then
-				updateControl:UpdateDisabled()
-			end
-		end
-	end
-end
-
-local function ForceDefaults(panel)
-	local panelControls = panel.controlsToRefresh
-
-	for i = 1, #panelControls do
-		local updateControl = panelControls[i]
-		if updateControl.UpdateValue and updateControl.data.default ~= nil then
-			updateControl:UpdateValue(true)
-		end
-	end
-
-	if panel.data.resetFunc then
-		panel.data.resetFunc()
-	end
-
-	cm:FireCallbacks("LAM-RefreshPanel", panel)
-end
-ESO_Dialogs["LAM_DEFAULTS"] = {
-	title = {
-		text = SI_OPTIONS_RESET_TITLE,
-	},
-	mainText = {
-		text = SI_OPTIONS_RESET_PROMPT,
-		align = TEXT_ALIGN_CENTER,
-	},
-	buttons = {
-		[1] = {
-			text = SI_OPTIONS_RESET,
-			callback = function(dialog) ForceDefaults(dialog.data[1]) end,
-		},
-		[2] = {
-			text = SI_DIALOG_CANCEL,
-		},
-	},
-}
-
-local scrollCount = 1
-function LAMCreateControl.panel(parent, panelData, controlName)
-	local control = wm:CreateTopLevelWindow(controlName)
-	control:SetParent(parent)
-
-	control.bg = wm:CreateControl(nil, control, CT_BACKDROP)
-	local bg = control.bg
-	bg:SetAnchorFill()
-	bg:SetEdgeTexture("EsoUI\\Art\\miscellaneous\\borderedinsettransparent_edgefile.dds", 128, 16)
-	bg:SetCenterColor(0, 0, 0, 0)
-
-	control.label = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
-	local label = control.label
-	label:SetAnchor(TOPLEFT, control, TOPLEFT, 10, 10)
-	label:SetText(panelData.displayName and panelData.displayName or panelData.name)
-
-	if panelData.author or panelData.version then
-		control.info = wm:CreateControl(nil, control, CT_LABEL)
-		local info = control.info
-		info:SetFont("$(CHAT_FONT)|14|soft-shadow-thin")
-		info:SetColor(ZO_HIGHLIGHT_TEXT:UnpackRGBA())
-		info:SetHeight(13)
-		info:SetAnchor(TOPRIGHT, control, BOTTOMRIGHT, -5, 2)
-		if panelData.author and panelData.version then
-			--info:SetText("Version: "..panelData.version.."  -  "..GetString(SI_ADDON_MANAGER_AUTHOR)..": "..panelData.author)
-			info:SetText(string.format("Version: %s  -  %s: %s", panelData.version, GetString(SI_ADDON_MANAGER_AUTHOR), panelData.author))
-		elseif panelData.author then
-			info:SetText(string.format("%s: %s", GetString(SI_ADDON_MANAGER_AUTHOR), panelData.author))
-		else
-			info:SetText("Version: "..panelData.version)
-		end
-	end
-
-	control.container = wm:CreateControlFromVirtual("LAMAddonPanelContainer"..scrollCount, control, "ZO_ScrollContainer")
-	scrollCount = scrollCount + 1
-	local container = control.container
-	container:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, 20)
-	container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, -3, -3)
-	control.scroll = GetControl(control.container, "ScrollChild")
-	control.scroll:SetResizeToFitPadding(0, 20)
-
-	if panelData.registerForDefaults then
-		control.defaultButton = wm:CreateControlFromVirtual(nil, control, "ZO_DefaultTextButton")
-		local defaultButton = control.defaultButton
-		defaultButton:SetFont("ZoFontDialogKeybindDescription")
-		defaultButton:SetHorizontalAlignment(TEXT_ALIGN_LEFT)
-		--defaultButton:SetText("Reset To Defaults")
-		defaultButton:SetText(GetString(SI_OPTIONS_RESET_TITLE))
-		defaultButton:SetDimensions(200, 30)
-		defaultButton:SetAnchor(TOPLEFT, control, BOTTOMLEFT, 0, 2)
-		defaultButton:SetHandler("OnClicked", function()
-				ZO_Dialogs_ShowDialog("LAM_DEFAULTS", {control})
-			end)
-	end
-
-	if panelData.registerForRefresh then
-		cm:RegisterCallback("LAM-RefreshPanel", RefreshPanel)
-	end
-
-	control.data = panelData
-	control.controlsToRefresh = {}
-
-	return control
+--[[panelData = {
+	type = "panel",
+	name = "Window Title",
+	displayName = "My Longer Window Title",	--(optional) (can be useful for long addon names or if you want to colorize it)
+	author = "Seerah",	--(optional)
+	version = "2.0",	--(optional)
+	slashCommand = "/myaddon",	--(optional) will register a keybind to open to this panel (don't forget to include the slash!)
+	registerForRefresh = true,	--boolean (optional) (will refresh all options controls when a setting is changed and when the panel is shown)
+	registerForDefaults = true,	--boolean (optional) (will set all options controls back to default values)
+	resetFunc = function() print("defaults reset") end,	--(optional) custom function to run after settings are reset to defaults
+}	]]
+
+
+local widgetVersion = 5
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("panel", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+local cm = CALLBACK_MANAGER
+
+local function RefreshPanel(control)
+	local panel = control.panel or control	--callback can be fired by a single control or by the panel showing
+	local panelControls = panel.controlsToRefresh
+
+	for i = 1, #panelControls do
+		local updateControl = panelControls[i]
+		if  updateControl ~= control then
+			if updateControl.UpdateValue then
+				updateControl:UpdateValue()
+			end
+			if updateControl.UpdateDisabled then
+				updateControl:UpdateDisabled()
+			end
+		end
+	end
+end
+
+local function ForceDefaults(panel)
+	local panelControls = panel.controlsToRefresh
+
+	for i = 1, #panelControls do
+		local updateControl = panelControls[i]
+		if updateControl.UpdateValue and updateControl.data.default ~= nil then
+			updateControl:UpdateValue(true)
+		end
+	end
+
+	if panel.data.resetFunc then
+		panel.data.resetFunc()
+	end
+
+	cm:FireCallbacks("LAM-RefreshPanel", panel)
+end
+ESO_Dialogs["LAM_DEFAULTS"] = {
+	title = {
+		text = SI_OPTIONS_RESET_TITLE,
+	},
+	mainText = {
+		text = SI_OPTIONS_RESET_PROMPT,
+		align = TEXT_ALIGN_CENTER,
+	},
+	buttons = {
+		[1] = {
+			text = SI_OPTIONS_RESET,
+			callback = function(dialog) ForceDefaults(dialog.data[1]) end,
+		},
+		[2] = {
+			text = SI_DIALOG_CANCEL,
+		},
+	},
+}
+
+local scrollCount = 1
+function LAMCreateControl.panel(parent, panelData, controlName)
+	local control = wm:CreateTopLevelWindow(controlName)
+	control:SetParent(parent)
+
+	control.bg = wm:CreateControl(nil, control, CT_BACKDROP)
+	local bg = control.bg
+	bg:SetAnchorFill()
+	bg:SetEdgeTexture("EsoUI\\Art\\miscellaneous\\borderedinsettransparent_edgefile.dds", 128, 16)
+	bg:SetCenterColor(0, 0, 0, 0)
+
+	control.label = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
+	local label = control.label
+	label:SetAnchor(TOPLEFT, control, TOPLEFT, 10, 10)
+	label:SetText(panelData.displayName and panelData.displayName or panelData.name)
+
+	if panelData.author or panelData.version then
+		control.info = wm:CreateControl(nil, control, CT_LABEL)
+		local info = control.info
+		info:SetFont("$(CHAT_FONT)|14|soft-shadow-thin")
+		info:SetColor(ZO_HIGHLIGHT_TEXT:UnpackRGBA())
+		info:SetHeight(13)
+		info:SetAnchor(TOPRIGHT, control, BOTTOMRIGHT, -5, 2)
+		if panelData.author and panelData.version then
+			--info:SetText("Version: "..panelData.version.."  -  "..GetString(SI_ADDON_MANAGER_AUTHOR)..": "..panelData.author)
+			info:SetText(string.format("Version: %s  -  %s: %s", panelData.version, GetString(SI_ADDON_MANAGER_AUTHOR), panelData.author))
+		elseif panelData.author then
+			info:SetText(string.format("%s: %s", GetString(SI_ADDON_MANAGER_AUTHOR), panelData.author))
+		else
+			info:SetText("Version: "..panelData.version)
+		end
+	end
+
+	control.container = wm:CreateControlFromVirtual("LAMAddonPanelContainer"..scrollCount, control, "ZO_ScrollContainer")
+	scrollCount = scrollCount + 1
+	local container = control.container
+	container:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, 20)
+	container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, -3, -3)
+	control.scroll = GetControl(control.container, "ScrollChild")
+	control.scroll:SetResizeToFitPadding(0, 20)
+
+	if panelData.registerForDefaults then
+		control.defaultButton = wm:CreateControlFromVirtual(nil, control, "ZO_DefaultTextButton")
+		local defaultButton = control.defaultButton
+		defaultButton:SetFont("ZoFontDialogKeybindDescription")
+		defaultButton:SetHorizontalAlignment(TEXT_ALIGN_LEFT)
+		--defaultButton:SetText("Reset To Defaults")
+		defaultButton:SetText(GetString(SI_OPTIONS_RESET_TITLE))
+		defaultButton:SetDimensions(200, 30)
+		defaultButton:SetAnchor(TOPLEFT, control, BOTTOMLEFT, 0, 2)
+		defaultButton:SetHandler("OnClicked", function()
+				ZO_Dialogs_ShowDialog("LAM_DEFAULTS", {control})
+			end)
+	end
+
+	if panelData.registerForRefresh then
+		cm:RegisterCallback("LAM-RefreshPanel", RefreshPanel)
+	end
+
+	control.data = panelData
+	control.controlsToRefresh = {}
+
+	return control
 end
\ No newline at end of file
diff --git a/Libs/LibAddonMenu-2.0/controls/slider.lua b/Libs/LibAddonMenu-2.0/controls/slider.lua
index a0932e7..a355156 100644
--- a/Libs/LibAddonMenu-2.0/controls/slider.lua
+++ b/Libs/LibAddonMenu-2.0/controls/slider.lua
@@ -1,182 +1,182 @@
---[[sliderData = {
-	type = "slider",
-	name = "My Slider",
-	tooltip = "Slider's tooltip text.",
-	min = 0,
-	max = 20,
-	step = 1,	--(optional)
-	getFunc = function() return db.var end,
-	setFunc = function(value) db.var = value doStuff() end,
-	width = "full",	--or "half" (optional)
-	disabled = function() return db.someBooleanSetting end,	--or boolean (optional)
-	warning = "Will need to reload the UI.",	--(optional)
-	default = defaults.var,	--(optional)
-	reference = "MyAddonSlider"	--(optional) unique global reference to control
-}	]]
-
-
-local widgetVersion = 3
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("slider", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-local cm = CALLBACK_MANAGER
-local round = zo_round
-local strformat = string.format
-local tinsert = table.insert
-
-local function UpdateDisabled(control)
-	local disable
-	if type(control.data.disabled) == "function" then
-		disable = control.data.disabled()
-	else
-		disable = control.data.disabled
-	end
-
-	control.slider:SetEnabled(not disable)
-	control.slidervalue:SetEditEnabled(not disable)
-	if disable then
-		control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-		control.minText:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-		control.maxText:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-		control.slidervalue:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
-	else
-		control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-		control.minText:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-		control.maxText:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-		control.slidervalue:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-	end
-end
-
-local function UpdateValue(control, forceDefault, value)
-	if forceDefault then	--if we are forcing defaults
-		value = control.data.default
-		control.data.setFunc(value)
-	elseif value and value >= control.data.min and value <= control.data.max then
-		control.data.setFunc(value)
-		--after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
-		if control.panel.data.registerForRefresh then
-			cm:FireCallbacks("LAM-RefreshPanel", control)
-		end
-	else
-		value = control.data.getFunc()
-	end
-
-	control.slider:SetValue(value)
-	control.slidervalue:SetText(value)
-end
-
-
-function LAMCreateControl.slider(parent, sliderData, controlName)
-	local control = wm:CreateTopLevelWindow(controlName or sliderData.reference)
-	control:SetParent(parent.scroll or parent)
-	local isHalfWidth = sliderData.width == "half"
-	if isHalfWidth then
-		control:SetDimensions(250, 55)
-	else
-		control:SetDimensions(510, 40)
-	end
-	control:SetMouseEnabled(true)
-	control.tooltipText = sliderData.tooltip
-	control:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
-	control:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
-
-	control.label = wm:CreateControl(nil, control, CT_LABEL)
-	local label = control.label
-	label:SetFont("ZoFontWinH4")
-	label:SetDimensions(isHalfWidth and 250 or 300, 26)
-	label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
-	label:SetAnchor(isHalfWidth and TOPLEFT or LEFT)
-	label:SetText(sliderData.name)
-
-	--skipping creating the backdrop...  Is this the actual slider texture?
-	control.slider = wm:CreateControl(nil, control, CT_SLIDER)
-	local slider = control.slider
-	slider:SetDimensions(190, 14)
-	if isHalfWidth then
-		slider:SetAnchor(TOPRIGHT, label, BOTTOMRIGHT, -5, 2)
-	else
-		slider:SetAnchor(RIGHT, control, RIGHT, -5, -5)
-	end
-	slider:SetMouseEnabled(true)
-	slider:SetOrientation(ORIENTATION_HORIZONTAL)
-	--put nil for highlighted texture file path, and what look to be texture coords
-	slider:SetThumbTexture("EsoUI\\Art\\Miscellaneous\\scrollbox_elevator.dds", "EsoUI\\Art\\Miscellaneous\\scrollbox_elevator_disabled.dds", nil, 8, 16)
-	local minValue = sliderData.min
-	local maxValue = sliderData.max
-	slider:SetMinMax(minValue, maxValue)
-	slider:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
-	slider:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseExit(control) end)
-
-	slider.bg = wm:CreateControl(nil, slider, CT_BACKDROP)
-	local bg = slider.bg
-	bg:SetCenterColor(0, 0, 0)
-	bg:SetAnchor(TOPLEFT, slider, TOPLEFT, 0, 4)
-	bg:SetAnchor(BOTTOMRIGHT, slider, BOTTOMRIGHT, 0, -4)
-	bg:SetEdgeTexture("EsoUI\\Art\\Tooltips\\UI-SliderBackdrop.dds", 32, 4)
-
-	control.minText = wm:CreateControl(nil, slider, CT_LABEL)
-	local minText = control.minText
-	minText:SetFont("ZoFontGameSmall")
-	minText:SetAnchor(TOPLEFT, slider, BOTTOMLEFT)
-	minText:SetText(sliderData.min)
-
-	control.maxText = wm:CreateControl(nil, slider, CT_LABEL)
-	local maxText = control.maxText
-	maxText:SetFont("ZoFontGameSmall")
-	maxText:SetAnchor(TOPRIGHT, slider, BOTTOMRIGHT)
-	maxText:SetText(sliderData.max)
-
-	control.slidervalueBG = wm:CreateControlFromVirtual(nil, slider, "ZO_EditBackdrop")
-	control.slidervalueBG:SetDimensions(50, 16)
-	control.slidervalueBG:SetAnchor(TOP, slider, BOTTOM, 0, 0)
-	control.slidervalue = wm:CreateControlFromVirtual(nil, control.slidervalueBG, "ZO_DefaultEditForBackdrop")
-	local slidervalue = control.slidervalue
-	slidervalue:ClearAnchors()
-	slidervalue:SetAnchor(TOPLEFT, slidervaluebg, TOPLEFT, 3, 1)
-	slidervalue:SetAnchor(BOTTOMRIGHT, slidervaluebg, BOTTOMRIGHT, -3, -1)
-	slidervalue:SetTextType(TEXT_TYPE_NUMERIC)
-	slidervalue:SetFont("ZoFontGameSmall")
-	slidervalue:SetHandler("OnEscape", function(self)
-			self:LoseFocus()
-			control:UpdateValue()
-		end)
-	slidervalue:SetHandler("OnEnter", function(self)
-			self:LoseFocus()
-			control:UpdateValue(false, tonumber(self:GetText()))
-		end)
-
-	local range = maxValue - minValue
-	slider:SetValueStep(sliderData.step or 1)
-	slider:SetHandler("OnValueChanged", function(self, value, eventReason)
-			if eventReason == EVENT_REASON_SOFTWARE then return end
-			self:SetValue(value)	--do we actually need this line?
-			slidervalue:SetText(value)
-		end)
-	slider:SetHandler("OnSliderReleased", function(self, value)
-			--sliderData.setFunc(value)
-			control:UpdateValue(false, value)	--does this work here instead?
-		end)
-
-	if sliderData.warning then
-		control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-		control.warning:SetAnchor(RIGHT, slider, LEFT, -5, 0)
-		control.warning.tooltipText = sliderData.warning
-	end
-
-	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
-	control.data = sliderData
-
-	if sliderData.disabled then
-		control.UpdateDisabled = UpdateDisabled
-		control:UpdateDisabled()
-	end
-	control.UpdateValue = UpdateValue
-	control:UpdateValue()
-
-	if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then	--if our parent window wants to refresh controls, then add this to the list
-		tinsert(control.panel.controlsToRefresh, control)
-	end
-
-	return control
+--[[sliderData = {
+	type = "slider",
+	name = "My Slider",
+	tooltip = "Slider's tooltip text.",
+	min = 0,
+	max = 20,
+	step = 1,	--(optional)
+	getFunc = function() return db.var end,
+	setFunc = function(value) db.var = value doStuff() end,
+	width = "full",	--or "half" (optional)
+	disabled = function() return db.someBooleanSetting end,	--or boolean (optional)
+	warning = "Will need to reload the UI.",	--(optional)
+	default = defaults.var,	--(optional)
+	reference = "MyAddonSlider"	--(optional) unique global reference to control
+}	]]
+
+
+local widgetVersion = 3
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("slider", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+local cm = CALLBACK_MANAGER
+local round = zo_round
+local strformat = string.format
+local tinsert = table.insert
+
+local function UpdateDisabled(control)
+	local disable
+	if type(control.data.disabled) == "function" then
+		disable = control.data.disabled()
+	else
+		disable = control.data.disabled
+	end
+
+	control.slider:SetEnabled(not disable)
+	control.slidervalue:SetEditEnabled(not disable)
+	if disable then
+		control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+		control.minText:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+		control.maxText:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+		control.slidervalue:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
+	else
+		control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+		control.minText:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+		control.maxText:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+		control.slidervalue:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+	end
+end
+
+local function UpdateValue(control, forceDefault, value)
+	if forceDefault then	--if we are forcing defaults
+		value = control.data.default
+		control.data.setFunc(value)
+	elseif value and value >= control.data.min and value <= control.data.max then
+		control.data.setFunc(value)
+		--after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
+		if control.panel.data.registerForRefresh then
+			cm:FireCallbacks("LAM-RefreshPanel", control)
+		end
+	else
+		value = control.data.getFunc()
+	end
+
+	control.slider:SetValue(value)
+	control.slidervalue:SetText(value)
+end
+
+
+function LAMCreateControl.slider(parent, sliderData, controlName)
+	local control = wm:CreateTopLevelWindow(controlName or sliderData.reference)
+	control:SetParent(parent.scroll or parent)
+	local isHalfWidth = sliderData.width == "half"
+	if isHalfWidth then
+		control:SetDimensions(250, 55)
+	else
+		control:SetDimensions(510, 40)
+	end
+	control:SetMouseEnabled(true)
+	control.tooltipText = sliderData.tooltip
+	control:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
+	control:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
+
+	control.label = wm:CreateControl(nil, control, CT_LABEL)
+	local label = control.label
+	label:SetFont("ZoFontWinH4")
+	label:SetDimensions(isHalfWidth and 250 or 300, 26)
+	label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
+	label:SetAnchor(isHalfWidth and TOPLEFT or LEFT)
+	label:SetText(sliderData.name)
+
+	--skipping creating the backdrop...  Is this the actual slider texture?
+	control.slider = wm:CreateControl(nil, control, CT_SLIDER)
+	local slider = control.slider
+	slider:SetDimensions(190, 14)
+	if isHalfWidth then
+		slider:SetAnchor(TOPRIGHT, label, BOTTOMRIGHT, -5, 2)
+	else
+		slider:SetAnchor(RIGHT, control, RIGHT, -5, -5)
+	end
+	slider:SetMouseEnabled(true)
+	slider:SetOrientation(ORIENTATION_HORIZONTAL)
+	--put nil for highlighted texture file path, and what look to be texture coords
+	slider:SetThumbTexture("EsoUI\\Art\\Miscellaneous\\scrollbox_elevator.dds", "EsoUI\\Art\\Miscellaneous\\scrollbox_elevator_disabled.dds", nil, 8, 16)
+	local minValue = sliderData.min
+	local maxValue = sliderData.max
+	slider:SetMinMax(minValue, maxValue)
+	slider:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
+	slider:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseExit(control) end)
+
+	slider.bg = wm:CreateControl(nil, slider, CT_BACKDROP)
+	local bg = slider.bg
+	bg:SetCenterColor(0, 0, 0)
+	bg:SetAnchor(TOPLEFT, slider, TOPLEFT, 0, 4)
+	bg:SetAnchor(BOTTOMRIGHT, slider, BOTTOMRIGHT, 0, -4)
+	bg:SetEdgeTexture("EsoUI\\Art\\Tooltips\\UI-SliderBackdrop.dds", 32, 4)
+
+	control.minText = wm:CreateControl(nil, slider, CT_LABEL)
+	local minText = control.minText
+	minText:SetFont("ZoFontGameSmall")
+	minText:SetAnchor(TOPLEFT, slider, BOTTOMLEFT)
+	minText:SetText(sliderData.min)
+
+	control.maxText = wm:CreateControl(nil, slider, CT_LABEL)
+	local maxText = control.maxText
+	maxText:SetFont("ZoFontGameSmall")
+	maxText:SetAnchor(TOPRIGHT, slider, BOTTOMRIGHT)
+	maxText:SetText(sliderData.max)
+
+	control.slidervalueBG = wm:CreateControlFromVirtual(nil, slider, "ZO_EditBackdrop")
+	control.slidervalueBG:SetDimensions(50, 16)
+	control.slidervalueBG:SetAnchor(TOP, slider, BOTTOM, 0, 0)
+	control.slidervalue = wm:CreateControlFromVirtual(nil, control.slidervalueBG, "ZO_DefaultEditForBackdrop")
+	local slidervalue = control.slidervalue
+	slidervalue:ClearAnchors()
+	slidervalue:SetAnchor(TOPLEFT, slidervaluebg, TOPLEFT, 3, 1)
+	slidervalue:SetAnchor(BOTTOMRIGHT, slidervaluebg, BOTTOMRIGHT, -3, -1)
+	slidervalue:SetTextType(TEXT_TYPE_NUMERIC)
+	slidervalue:SetFont("ZoFontGameSmall")
+	slidervalue:SetHandler("OnEscape", function(self)
+			self:LoseFocus()
+			control:UpdateValue()
+		end)
+	slidervalue:SetHandler("OnEnter", function(self)
+			self:LoseFocus()
+			control:UpdateValue(false, tonumber(self:GetText()))
+		end)
+
+	local range = maxValue - minValue
+	slider:SetValueStep(sliderData.step or 1)
+	slider:SetHandler("OnValueChanged", function(self, value, eventReason)
+			if eventReason == EVENT_REASON_SOFTWARE then return end
+			self:SetValue(value)	--do we actually need this line?
+			slidervalue:SetText(value)
+		end)
+	slider:SetHandler("OnSliderReleased", function(self, value)
+			--sliderData.setFunc(value)
+			control:UpdateValue(false, value)	--does this work here instead?
+		end)
+
+	if sliderData.warning then
+		control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+		control.warning:SetAnchor(RIGHT, slider, LEFT, -5, 0)
+		control.warning.tooltipText = sliderData.warning
+	end
+
+	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
+	control.data = sliderData
+
+	if sliderData.disabled then
+		control.UpdateDisabled = UpdateDisabled
+		control:UpdateDisabled()
+	end
+	control.UpdateValue = UpdateValue
+	control:UpdateValue()
+
+	if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then	--if our parent window wants to refresh controls, then add this to the list
+		tinsert(control.panel.controlsToRefresh, control)
+	end
+
+	return control
 end
\ No newline at end of file
diff --git a/Libs/LibAddonMenu-2.0/controls/submenu.lua b/Libs/LibAddonMenu-2.0/controls/submenu.lua
index e635249..932a3de 100644
--- a/Libs/LibAddonMenu-2.0/controls/submenu.lua
+++ b/Libs/LibAddonMenu-2.0/controls/submenu.lua
@@ -1,107 +1,107 @@
---[[submenuData = {
-	type = "submenu",
-	name = "Submenu Title",
-	tooltip = "My submenu tooltip",	--(optional)
-	controls = {sliderData, buttonData}	--(optional) used by LAM
-	reference = "MyAddonSubmenu"	--(optional) unique global reference to control
-}	]]
-
-local widgetVersion = 4
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("submenu", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-local am = ANIMATION_MANAGER
-
-
-local function AnimateSubmenu(clicked)
-	local control = clicked:GetParent()
-	control.open = not control.open
-
-	if control.open then
-		control.animation:PlayFromStart()
-	else
-		control.animation:PlayFromEnd()
-	end
-end
-
-
-function LAMCreateControl.submenu(parent, submenuData, controlName)
-	local control = wm:CreateTopLevelWindow(controlName or submenuData.reference)
-	control:SetParent(parent.scroll or parent)
-	control.panel = parent
-	control:SetDimensions(523, 40)
-
-	control.label = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
-	local label = control.label
-	label:SetAnchor(TOPLEFT, control, TOPLEFT, 5, 5)
-	label:SetDimensions(520, 30)
-	label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
-	label:SetText(submenuData.name)
-	label:SetMouseEnabled(true)
-	if submenuData.tooltip then
-		label.tooltipText = submenuData.tooltip
-		label:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
-		label:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
-	end
-
-	control.scroll = wm:CreateControl(nil, control, CT_SCROLL)
-	local scroll = control.scroll
-	scroll:SetParent(control)
-	scroll:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, 10)
-	scroll:SetDimensionConstraints(525, 0, 525, 2500)
-
-	control.bg = wm:CreateControl(nil, label, CT_BACKDROP)
-	local bg = control.bg
-	bg:SetAnchor(TOPLEFT, label, TOPLEFT, -5, -5)
-	bg:SetAnchor(BOTTOMRIGHT, scroll, BOTTOMRIGHT, -7, 0)
-	bg:SetEdgeTexture("EsoUI\\Art\\Tooltips\\UI-Border.dds", 128, 16)
-	bg:SetCenterTexture("EsoUI\\Art\\Tooltips\\UI-TooltipCenter.dds")
-	bg:SetInsets(16, 16, -16, -16)
-
-	control.arrow = wm:CreateControl(nil, bg, CT_TEXTURE)
-	local arrow = control.arrow
-	arrow:SetDimensions(28, 28)
-	arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortdown.dds")	--list_sortup for the other way
-	arrow:SetAnchor(TOPRIGHT, bg, TOPRIGHT, -5, 5)
-
-	--figure out the cool animation later...
-	control.animation = am:CreateTimeline()
-	local animation = control.animation
-	animation:SetPlaybackType(ANIMATION_SIZE, 0)	--2nd arg = loop count
-	--animation:SetDuration(1)
-	--animation:SetEasingFunction(ZO_LinearEase)	--is this needed?
-	--animation:SetHeightStartAndEnd(40, 80)	--SetStartAndEndHeight
-	--animation:SetStartAndEndHeight(40, 80)	--SetStartAndEndHeight
-	--animation:SetAnimatedControl(control)
-
-	control:SetResizeToFitDescendents(true)
-	control.open = false
-	label:SetHandler("OnMouseUp", AnimateSubmenu)
-	animation:SetHandler("OnStop", function(self, completedPlaying)
-			scroll:SetResizeToFitDescendents(control.open)
-			if control.open then
-				control.arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortup.dds")
-				scroll:SetResizeToFitPadding(5, 20)
-			else
-				control.arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortdown.dds")
-				scroll:SetResizeToFitPadding(5, 0)
-				scroll:SetHeight(0)
-			end
-		end)
-
-	--small strip at the bottom of the submenu that you can click to close it
-	control.btmToggle = wm:CreateControl(nil, control, CT_TEXTURE)
-	local btmToggle = control.btmToggle
-	btmToggle:SetMouseEnabled(true)
-	btmToggle:SetAnchor(BOTTOMLEFT, control.scroll, BOTTOMLEFT)
-	btmToggle:SetAnchor(BOTTOMRIGHT, control.scroll, BOTTOMRIGHT)
-	btmToggle:SetHeight(15)
-	btmToggle:SetAlpha(0)
-	btmToggle:SetHandler("OnMouseUp", AnimateSubmenu)
-
-	control.data = submenuData
-
-	return control
-end
-
+--[[submenuData = {
+	type = "submenu",
+	name = "Submenu Title",
+	tooltip = "My submenu tooltip",	--(optional)
+	controls = {sliderData, buttonData}	--(optional) used by LAM
+	reference = "MyAddonSubmenu"	--(optional) unique global reference to control
+}	]]
+
+local widgetVersion = 4
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("submenu", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+local am = ANIMATION_MANAGER
+
+
+local function AnimateSubmenu(clicked)
+	local control = clicked:GetParent()
+	control.open = not control.open
+
+	if control.open then
+		control.animation:PlayFromStart()
+	else
+		control.animation:PlayFromEnd()
+	end
+end
+
+
+function LAMCreateControl.submenu(parent, submenuData, controlName)
+	local control = wm:CreateTopLevelWindow(controlName or submenuData.reference)
+	control:SetParent(parent.scroll or parent)
+	control.panel = parent
+	control:SetDimensions(523, 40)
+
+	control.label = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
+	local label = control.label
+	label:SetAnchor(TOPLEFT, control, TOPLEFT, 5, 5)
+	label:SetDimensions(520, 30)
+	label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
+	label:SetText(submenuData.name)
+	label:SetMouseEnabled(true)
+	if submenuData.tooltip then
+		label.tooltipText = submenuData.tooltip
+		label:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
+		label:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
+	end
+
+	control.scroll = wm:CreateControl(nil, control, CT_SCROLL)
+	local scroll = control.scroll
+	scroll:SetParent(control)
+	scroll:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, 10)
+	scroll:SetDimensionConstraints(525, 0, 525, 2500)
+
+	control.bg = wm:CreateControl(nil, label, CT_BACKDROP)
+	local bg = control.bg
+	bg:SetAnchor(TOPLEFT, label, TOPLEFT, -5, -5)
+	bg:SetAnchor(BOTTOMRIGHT, scroll, BOTTOMRIGHT, -7, 0)
+	bg:SetEdgeTexture("EsoUI\\Art\\Tooltips\\UI-Border.dds", 128, 16)
+	bg:SetCenterTexture("EsoUI\\Art\\Tooltips\\UI-TooltipCenter.dds")
+	bg:SetInsets(16, 16, -16, -16)
+
+	control.arrow = wm:CreateControl(nil, bg, CT_TEXTURE)
+	local arrow = control.arrow
+	arrow:SetDimensions(28, 28)
+	arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortdown.dds")	--list_sortup for the other way
+	arrow:SetAnchor(TOPRIGHT, bg, TOPRIGHT, -5, 5)
+
+	--figure out the cool animation later...
+	control.animation = am:CreateTimeline()
+	local animation = control.animation
+	animation:SetPlaybackType(ANIMATION_SIZE, 0)	--2nd arg = loop count
+	--animation:SetDuration(1)
+	--animation:SetEasingFunction(ZO_LinearEase)	--is this needed?
+	--animation:SetHeightStartAndEnd(40, 80)	--SetStartAndEndHeight
+	--animation:SetStartAndEndHeight(40, 80)	--SetStartAndEndHeight
+	--animation:SetAnimatedControl(control)
+
+	control:SetResizeToFitDescendents(true)
+	control.open = false
+	label:SetHandler("OnMouseUp", AnimateSubmenu)
+	animation:SetHandler("OnStop", function(self, completedPlaying)
+			scroll:SetResizeToFitDescendents(control.open)
+			if control.open then
+				control.arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortup.dds")
+				scroll:SetResizeToFitPadding(5, 20)
+			else
+				control.arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortdown.dds")
+				scroll:SetResizeToFitPadding(5, 0)
+				scroll:SetHeight(0)
+			end
+		end)
+
+	--small strip at the bottom of the submenu that you can click to close it
+	control.btmToggle = wm:CreateControl(nil, control, CT_TEXTURE)
+	local btmToggle = control.btmToggle
+	btmToggle:SetMouseEnabled(true)
+	btmToggle:SetAnchor(BOTTOMLEFT, control.scroll, BOTTOMLEFT)
+	btmToggle:SetAnchor(BOTTOMRIGHT, control.scroll, BOTTOMRIGHT)
+	btmToggle:SetHeight(15)
+	btmToggle:SetAlpha(0)
+	btmToggle:SetHandler("OnMouseUp", AnimateSubmenu)
+
+	control.data = submenuData
+
+	return control
+end
+
diff --git a/Libs/LibAddonMenu-2.0/controls/texture.lua b/Libs/LibAddonMenu-2.0/controls/texture.lua
index 8ce85de..7035bcc 100644
--- a/Libs/LibAddonMenu-2.0/controls/texture.lua
+++ b/Libs/LibAddonMenu-2.0/controls/texture.lua
@@ -1,50 +1,50 @@
---[[textureData = {
-	type = "texture",
-	image = "file/path.dds",
-	imageWidth = 64,	--max of 250 for half width, 510 for full
-	imageHeight = 32,	--max of 100
-	tooltip = "Image's tooltip text.",	--(optional)
-	width = "full",	--or "half" (optional)
-	reference = "MyAddonTexture"	--(optional) unique global reference to control
-}	]]
-
---add texture coords support?
-
-local widgetVersion = 3
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("texture", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-function LAMCreateControl.texture(parent, textureData, controlName)
-	local control = wm:CreateTopLevelWindow(controlName or textureData.reference)
-	control:SetResizeToFitDescendents(true)
-	control:SetParent(parent.scroll or parent)
-
-	local isHalfWidth = textureData.width == "half"
-	if isHalfWidth then
-		control:SetDimensionConstraints(250, 55, 250, 100)
-		control:SetDimensions(250, 55)
-	else
-		control:SetDimensionConstraints(510, 30, 510, 100)
-		control:SetDimensions(510, 30)
-	end
-
-	control.texture = wm:CreateControl(nil, control, CT_TEXTURE)
-	local texture = control.texture
-	texture:SetAnchor(CENTER)
-	texture:SetDimensions(textureData.imageWidth, textureData.imageHeight)
-	texture:SetTexture(textureData.image)
-
-	if textureData.tooltip then
-		texture:SetMouseEnabled(true)
-		texture.tooltipText = textureData.tooltip
-		texture:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
-		texture:SetHandler("OnMouseEnter", ZO_Options_OnMouseExit)
-	end
-
-	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
-	control.data = textureData
-
-	return control
+--[[textureData = {
+	type = "texture",
+	image = "file/path.dds",
+	imageWidth = 64,	--max of 250 for half width, 510 for full
+	imageHeight = 32,	--max of 100
+	tooltip = "Image's tooltip text.",	--(optional)
+	width = "full",	--or "half" (optional)
+	reference = "MyAddonTexture"	--(optional) unique global reference to control
+}	]]
+
+--add texture coords support?
+
+local widgetVersion = 3
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("texture", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+function LAMCreateControl.texture(parent, textureData, controlName)
+	local control = wm:CreateTopLevelWindow(controlName or textureData.reference)
+	control:SetResizeToFitDescendents(true)
+	control:SetParent(parent.scroll or parent)
+
+	local isHalfWidth = textureData.width == "half"
+	if isHalfWidth then
+		control:SetDimensionConstraints(250, 55, 250, 100)
+		control:SetDimensions(250, 55)
+	else
+		control:SetDimensionConstraints(510, 30, 510, 100)
+		control:SetDimensions(510, 30)
+	end
+
+	control.texture = wm:CreateControl(nil, control, CT_TEXTURE)
+	local texture = control.texture
+	texture:SetAnchor(CENTER)
+	texture:SetDimensions(textureData.imageWidth, textureData.imageHeight)
+	texture:SetTexture(textureData.image)
+
+	if textureData.tooltip then
+		texture:SetMouseEnabled(true)
+		texture.tooltipText = textureData.tooltip
+		texture:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
+		texture:SetHandler("OnMouseEnter", ZO_Options_OnMouseExit)
+	end
+
+	control.panel = parent.panel or parent	--if this is in a submenu, panel is its parent
+	control.data = textureData
+
+	return control
 end
\ No newline at end of file
diff --git a/Libs/libGuildInfo/LibGuildInfo.lua b/Libs/libGuildInfo/LibGuildInfo.lua
index ffe1c71..05cad1b 100644
--- a/Libs/libGuildInfo/LibGuildInfo.lua
+++ b/Libs/libGuildInfo/LibGuildInfo.lua
@@ -1,170 +1,170 @@
-local MAJOR, MINOR = "LibGuildInfo-1.0", 2
-local LibGuildInfo, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
-if not LibGuildInfo then return end	--the same or newer version of this lib is already loaded into memory
-
-local Classes = {[1] = "Dragon Knight", [2]="Sorcerer", [3]="Nightblade", [6]="Templar"}
-local Alliances = {[1] = "Aldmeri Dominion", [2] = "Ebonhart Pact", [3] = "Daggerfall Convenant"}
--- API --
-
--- If the table for the name is empty, that means the member has left the guild (thus the 'next' usage)
--- All future API should funnel through this function, or be aware of the limitations
-function LibGuildInfo:GetGuildMemberByMemberName(name)
-	local member = name:find("@") and self.DisplayNames[name:lower()] or self.CharacterNames[name:lower()]
-	if member and next(member) then return member end
-end
-
-function LibGuildInfo:GetClassNumByMemberName(name)
-	local member = self:GetGuildMemberByMemberName(name)
-	if member then return member.class end
-end
-
-function LibGuildInfo:GetClassNameByMemberName(name)
-	local classNum = self:GetClassNumByMemberName(name)
-	if classNum and Classes[classNum] then return Classes[classNum] end
-end
-
-function LibGuildInfo:GetLevelByMemberName(name)
-	local member = self:GetGuildMemberByMemberName(name)
-	if member then
-		if member.level < 50 then return member.level end
-		return "V" .. member.veteranRank
-	end
-end
-
-function LibGuildInfo:GetAllianceNumByMemberName(name)
-	local member = self:GetGuildMemberByMemberName(name)
-	if member then return member.alliance end
-end
-
-function LibGuildInfo:GetAllianceNameByMemberName(name)
-	local allianceNum = self:GetAllianceNumByMemberName(name)
-	if allianceNum and Alliances[allianceNum] then return Alliances[allianceNum] end
-end
-
-function LibGuildInfo:GetGuildRankIndexByMemberName(name)
-	local member = self:GetGuildMemberByMemberName(name)
-	if member then return member.rankIndex end
-end
-
-function LibGuildInfo:GetGuildRankByMemberName(name)
-	local rankIndex = self:GetGuildRankIndexByMemberName(name)
-	if rankIndex == 1 then
-		return "GL"
-	else
-		return "R"..rankIndex
-	end
-end
-
--- Setup functions --
-
--- This is my deep table copy function, that bypasses previously copied tables
--- to avoid infinite loops when it comes to recursive copying. Essentially a copy
--- of the ZO_DeepCopyTable, but without the game locking
-
-local visitedTables = {}
-
-function LibGuildInfo:DeepTableCopy(source, subCall)
-    local dest =  {}
-
-    for k, v in pairs(source) do
-        if type(v) == "table" and not visitedTables[v] then
-        	visitedTables[v] = true
-            dest[k] = self:DeepTableCopy(v, true)
-        else
-            dest[k] = v
-        end
-    end
-
-    if not subCall then visitedTables = {} end
-
-    return dest
-end
-
-
-function LibGuildInfo:DataLoaded()
-	if self.GuildDataLoaded then return end
-
-	self.GuildDataLoaded = true
-
-	local currentGuildId = GUILD_ROSTER.guildId
-
-	self.GuildRoster = {}
-
-	for i=1, GetNumGuilds() do
-		GUILD_ROSTER:SetGuildId(i)
-		self.GuildRoster[i] = self:DeepTableCopy(GUILD_ROSTER["masterList"])
-	end
-
-	GUILD_ROSTER:SetGuildId(currentGuildId)
-	self:ProcessData()
-end
-
-function LibGuildInfo:ProcessData()
-	self.DisplayNames = self.DisplayNames or {}
-
-	ZO_ClearTable(self.DisplayNames)
-
-	for i,roster in pairs(self.GuildRoster) do
-		for i,v in pairs(roster) do
-			self.DisplayNames[v.displayName:lower()] = v
-		end
-	end
-
-	self.CharacterNames = self.CharacterNames or {}
-
-	ZO_ClearTable(self.CharacterNames)
-
-	for i, roster in pairs(self.GuildRoster) do
-		for i,v in pairs(roster) do
-			self.CharacterNames[v.characterName:lower()] = v
-		end
-	end
-end
-
-function LibGuildInfo:FindInCurrentRoster(name)
-	for i,v in pairs(GUILD_ROSTER["masterList"]) do
-		if name:find("@") and v.displayName:lower() == name:lower() or v.characterName == name:lower() then
-			return v
-		end
-	end
-end
-
-function LibGuildInfo:OnGuildMemberAdded(guildId, displayName)
-	if not self.GuildDataLoaded then return end
-	local currentGuildId = GUILD_ROSTER.guildId
-
-	GUILD_ROSTER:SetGuildId(guildId)
-	local v = self:DeepTableCopy(self:FindInCurrentRoster(displayName))
-	table.insert(self.GuildRoster[guildId], v)
-	self.DisplayNames[v.displayName:lower()] = v
-	self.CharacterNames[v.characterName:lower()] = v
-
-	GUILD_ROSTER:SetGuildId(currentGuildId)
-end
-
--- If they're removed from the guild, empty the table out
-function LibGuildInfo:OnGuildMemberRemoved(guildId, displayName)
-	if not self.GuildDataLoaded then return end
-	local v = self.DisplayNames[displayName:lower()]
-	ZO_ClearTable(v)
-end
-
--- We just shallow copy into the existing table so as not to lose the
--- table references everywhere by replacing it
-function LibGuildInfo:OnGuildMemberCharacterUpdated(guildId, displayName)
-	if not self.GuildDataLoaded then return end
-	local currentGuildId = GUILD_ROSTER.guildId
-
-	GUILD_ROSTER:SetGuildId(guildId)
-	local v = self:FindInCurrentRoster(displayName)
-	ZO_ShallowTableCopy(v,self.DisplayNames[displayName:lower()])
-	GUILD_ROSTER:SetGuildId(currentGuildId)
-end
-
-EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_PLAYER_ACTIVATED, function() LibGuildInfo:DataLoaded() end)
-EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_GUILD_MEMBER_ADDED, function(_, guildId, displayName) LibGuildInfo:OnGuildMemberAdded(guildId, displayName) end)
-EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_GUILD_MEMBER_REMOVED, function(_, guildId, displayName) LibGuildInfo:OnGuildMemberRemoved(guildId, displayName) end)
-EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_GUILD_MEMBER_CHARACTER_UPDATED,  function(_, guildId, displayName) LibGuildInfo:OnGuildMemberCharacterUpdated(guildId, displayName) end)
-EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_GUILD_MEMBER_CHARACTER_LEVEL_CHANGED,	function(_, guildId, displayName) LibGuildInfo:OnGuildMemberCharacterUpdated(guildId, displayName) end)
-EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_GUILD_MEMBER_CHARACTER_VETERAN_RANK_CHANGED, function(_, guildId, displayName) LibGuildInfo:OnGuildMemberCharacterUpdated(guildId, displayName) end)
-EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_GUILD_MEMBER_RANK_CHANGED, function(_, guildId, displayName) LibGuildInfo:OnGuildMemberCharacterUpdated(guildId, displayName) end)
+local MAJOR, MINOR = "LibGuildInfo-1.0", 2
+local LibGuildInfo, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+if not LibGuildInfo then return end	--the same or newer version of this lib is already loaded into memory
+
+local Classes = {[1] = "Dragon Knight", [2]="Sorcerer", [3]="Nightblade", [6]="Templar"}
+local Alliances = {[1] = "Aldmeri Dominion", [2] = "Ebonhart Pact", [3] = "Daggerfall Convenant"}
+-- API --
+
+-- If the table for the name is empty, that means the member has left the guild (thus the 'next' usage)
+-- All future API should funnel through this function, or be aware of the limitations
+function LibGuildInfo:GetGuildMemberByMemberName(name)
+	local member = name:find("@") and self.DisplayNames[name:lower()] or self.CharacterNames[name:lower()]
+	if member and next(member) then return member end
+end
+
+function LibGuildInfo:GetClassNumByMemberName(name)
+	local member = self:GetGuildMemberByMemberName(name)
+	if member then return member.class end
+end
+
+function LibGuildInfo:GetClassNameByMemberName(name)
+	local classNum = self:GetClassNumByMemberName(name)
+	if classNum and Classes[classNum] then return Classes[classNum] end
+end
+
+function LibGuildInfo:GetLevelByMemberName(name)
+	local member = self:GetGuildMemberByMemberName(name)
+	if member then
+		if member.level < 50 then return member.level end
+		return "V" .. member.veteranRank
+	end
+end
+
+function LibGuildInfo:GetAllianceNumByMemberName(name)
+	local member = self:GetGuildMemberByMemberName(name)
+	if member then return member.alliance end
+end
+
+function LibGuildInfo:GetAllianceNameByMemberName(name)
+	local allianceNum = self:GetAllianceNumByMemberName(name)
+	if allianceNum and Alliances[allianceNum] then return Alliances[allianceNum] end
+end
+
+function LibGuildInfo:GetGuildRankIndexByMemberName(name)
+	local member = self:GetGuildMemberByMemberName(name)
+	if member then return member.rankIndex end
+end
+
+function LibGuildInfo:GetGuildRankByMemberName(name)
+	local rankIndex = self:GetGuildRankIndexByMemberName(name)
+	if rankIndex == 1 then
+		return "GL"
+	else
+		return "R"..rankIndex
+	end
+end
+
+-- Setup functions --
+
+-- This is my deep table copy function, that bypasses previously copied tables
+-- to avoid infinite loops when it comes to recursive copying. Essentially a copy
+-- of the ZO_DeepCopyTable, but without the game locking
+
+local visitedTables = {}
+
+function LibGuildInfo:DeepTableCopy(source, subCall)
+    local dest =  {}
+
+    for k, v in pairs(source) do
+        if type(v) == "table" and not visitedTables[v] then
+        	visitedTables[v] = true
+            dest[k] = self:DeepTableCopy(v, true)
+        else
+            dest[k] = v
+        end
+    end
+
+    if not subCall then visitedTables = {} end
+
+    return dest
+end
+
+
+function LibGuildInfo:DataLoaded()
+	if self.GuildDataLoaded then return end
+
+	self.GuildDataLoaded = true
+
+	local currentGuildId = GUILD_ROSTER.guildId
+
+	self.GuildRoster = {}
+
+	for i=1, GetNumGuilds() do
+		GUILD_ROSTER:SetGuildId(i)
+		self.GuildRoster[i] = self:DeepTableCopy(GUILD_ROSTER["masterList"])
+	end
+
+	GUILD_ROSTER:SetGuildId(currentGuildId)
+	self:ProcessData()
+end
+
+function LibGuildInfo:ProcessData()
+	self.DisplayNames = self.DisplayNames or {}
+
+	ZO_ClearTable(self.DisplayNames)
+
+	for i,roster in pairs(self.GuildRoster) do
+		for i,v in pairs(roster) do
+			self.DisplayNames[v.displayName:lower()] = v
+		end
+	end
+
+	self.CharacterNames = self.CharacterNames or {}
+
+	ZO_ClearTable(self.CharacterNames)
+
+	for i, roster in pairs(self.GuildRoster) do
+		for i,v in pairs(roster) do
+			self.CharacterNames[v.characterName:lower()] = v
+		end
+	end
+end
+
+function LibGuildInfo:FindInCurrentRoster(name)
+	for i,v in pairs(GUILD_ROSTER["masterList"]) do
+		if name:find("@") and v.displayName:lower() == name:lower() or v.characterName == name:lower() then
+			return v
+		end
+	end
+end
+
+function LibGuildInfo:OnGuildMemberAdded(guildId, displayName)
+	if not self.GuildDataLoaded then return end
+	local currentGuildId = GUILD_ROSTER.guildId
+
+	GUILD_ROSTER:SetGuildId(guildId)
+	local v = self:DeepTableCopy(self:FindInCurrentRoster(displayName))
+	table.insert(self.GuildRoster[guildId], v)
+	self.DisplayNames[v.displayName:lower()] = v
+	self.CharacterNames[v.characterName:lower()] = v
+
+	GUILD_ROSTER:SetGuildId(currentGuildId)
+end
+
+-- If they're removed from the guild, empty the table out
+function LibGuildInfo:OnGuildMemberRemoved(guildId, displayName)
+	if not self.GuildDataLoaded then return end
+	local v = self.DisplayNames[displayName:lower()]
+	ZO_ClearTable(v)
+end
+
+-- We just shallow copy into the existing table so as not to lose the
+-- table references everywhere by replacing it
+function LibGuildInfo:OnGuildMemberCharacterUpdated(guildId, displayName)
+	if not self.GuildDataLoaded then return end
+	local currentGuildId = GUILD_ROSTER.guildId
+
+	GUILD_ROSTER:SetGuildId(guildId)
+	local v = self:FindInCurrentRoster(displayName)
+	ZO_ShallowTableCopy(v,self.DisplayNames[displayName:lower()])
+	GUILD_ROSTER:SetGuildId(currentGuildId)
+end
+
+EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_PLAYER_ACTIVATED, function() LibGuildInfo:DataLoaded() end)
+EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_GUILD_MEMBER_ADDED, function(_, guildId, displayName) LibGuildInfo:OnGuildMemberAdded(guildId, displayName) end)
+EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_GUILD_MEMBER_REMOVED, function(_, guildId, displayName) LibGuildInfo:OnGuildMemberRemoved(guildId, displayName) end)
+EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_GUILD_MEMBER_CHARACTER_UPDATED,  function(_, guildId, displayName) LibGuildInfo:OnGuildMemberCharacterUpdated(guildId, displayName) end)
+EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_GUILD_MEMBER_CHARACTER_LEVEL_CHANGED,	function(_, guildId, displayName) LibGuildInfo:OnGuildMemberCharacterUpdated(guildId, displayName) end)
+EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_GUILD_MEMBER_CHARACTER_VETERAN_RANK_CHANGED, function(_, guildId, displayName) LibGuildInfo:OnGuildMemberCharacterUpdated(guildId, displayName) end)
+EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_GUILD_MEMBER_RANK_CHANGED, function(_, guildId, displayName) LibGuildInfo:OnGuildMemberCharacterUpdated(guildId, displayName) end)