0e7d6a3 - Split libraries
authorAleksi Blinnikka <aleksi.blinnikka@gmail.com>
Fri, 29 Dec 2017 08:20:56 +0000
committerAleksi Blinnikka <aleksi.blinnikka@gmail.com>
Fri, 29 Dec 2017 08:20:56 +0000
55 files changed:
RaidFrameCustomization/embeds.xml
RaidFrameCustomizationConfig/RaidFrameCustomizationConfig.toc
RaidFrameCustomizationConfig/libs/AceAddon-3.0/AceAddon-3.0.lua [new file with mode: 0644]
RaidFrameCustomizationConfig/libs/AceAddon-3.0/AceAddon-3.0.xml [new file with mode: 0644]
RaidFrameCustomizationConfig/libs/AceConfig-3.0/AceConfig-3.0.lua [moved from RaidFrameCustomization/libs/AceConfig-3.0/AceConfig-3.0.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceConfig-3.0/AceConfig-3.0.xml [moved from RaidFrameCustomization/libs/AceConfig-3.0/AceConfig-3.0.xml with 100% similarity]
RaidFrameCustomizationConfig/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua [moved from RaidFrameCustomization/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.xml [moved from RaidFrameCustomization/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.xml with 100% similarity]
RaidFrameCustomizationConfig/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua [moved from RaidFrameCustomization/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.xml [moved from RaidFrameCustomization/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.xml with 100% similarity]
RaidFrameCustomizationConfig/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua [moved from RaidFrameCustomization/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.xml [moved from RaidFrameCustomization/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.xml with 100% similarity]
RaidFrameCustomizationConfig/libs/AceConsole-3.0/AceConsole-3.0.lua [moved from RaidFrameCustomization/libs/AceConsole-3.0/AceConsole-3.0.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceConsole-3.0/AceConsole-3.0.xml [moved from RaidFrameCustomization/libs/AceConsole-3.0/AceConsole-3.0.xml with 100% similarity]
RaidFrameCustomizationConfig/libs/AceDB-3.0/AceDB-3.0.lua [new file with mode: 0644]
RaidFrameCustomizationConfig/libs/AceDB-3.0/AceDB-3.0.xml [new file with mode: 0644]
RaidFrameCustomizationConfig/libs/AceDBOptions-3.0/AceDBOptions-3.0.lua [moved from RaidFrameCustomization/libs/AceDBOptions-3.0/AceDBOptions-3.0.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceDBOptions-3.0/AceDBOptions-3.0.xml [moved from RaidFrameCustomization/libs/AceDBOptions-3.0/AceDBOptions-3.0.xml with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0-SharedMediaWidgets/prototypes.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0-SharedMediaWidgets/prototypes.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0-SharedMediaWidgets/widget.xml [moved from RaidFrameCustomization/libs/AceGUI-3.0-SharedMediaWidgets/widget.xml with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/AceGUI-3.0.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/AceGUI-3.0.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/AceGUI-3.0.xml [moved from RaidFrameCustomization/libs/AceGUI-3.0/AceGUI-3.0.xml with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIContainer-SimpleGroup.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIContainer-SimpleGroup.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua [moved from RaidFrameCustomization/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua with 100% similarity]
RaidFrameCustomizationConfig/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua [new file with mode: 0644]
RaidFrameCustomizationConfig/libs/CallbackHandler-1.0/CallbackHandler-1.0.xml [new file with mode: 0644]
RaidFrameCustomizationConfig/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua [new file with mode: 0644]
RaidFrameCustomizationConfig/libs/LibSharedMedia-3.0/lib.xml [new file with mode: 0644]
RaidFrameCustomizationConfig/libs/LibStub/LibStub.lua [new file with mode: 0644]
RaidFrameCustomizationConfig/libs/LibStub/LibStub.toc [new file with mode: 0644]

index fd023a6..3cbeedc 100644 (file)
@@ -7,11 +7,6 @@
 <!--Ace3 Libraries-->
 <Include file="libs\CallbackHandler-1.0\CallbackHandler-1.0.xml" />
 <Include file="libs\AceAddon-3.0\AceAddon-3.0.xml" />
-<Include file="libs\AceGUI-3.0\AceGUI-3.0.xml" />
-<Include file="libs\AceConfig-3.0\AceConfig-3.0.xml" />
-<Include file="libs\AceConsole-3.0\AceConsole-3.0.xml" />
 <Include file="libs\AceDB-3.0\AceDB-3.0.xml" />
-<Include file="libs\AceDBOptions-3.0\AceDBOptions-3.0.xml" />
 <Include file="libs\LibSharedMedia-3.0\lib.xml"/>
-<Include file="libs\AceGUI-3.0-SharedMediaWidgets\widget.xml"/>
 </Ui>
index a875949..aafd06c 100644 (file)
@@ -1,17 +1,10 @@
 ## Interface: 70300
-## Title: Raid Frame Customization
+## Title: Raid Frame Customization Config
 ## Version: 1.0
 ## Author: schyrio
-## Notes: Customization to the standard raid frames
-## SavedVariables: RaidFrameCustomizationDB
+## Notes: Configuration for RaidFrameCustomization
+## LoadOnDemand: 1
 
 embeds.xml
 
-Core.lua
-Indicators.lua
 IndicatorsConfig.lua
-UnitFrameSetupHook.lua
-UpdateNameHook.lua
-UpdateStatusTextHook.lua
-UpdateDispellableDebuffsHook.lua
-LayoutFramesHook.lua
diff --git a/RaidFrameCustomizationConfig/libs/AceAddon-3.0/AceAddon-3.0.lua b/RaidFrameCustomizationConfig/libs/AceAddon-3.0/AceAddon-3.0.lua
new file mode 100644 (file)
index 0000000..a7f7279
--- /dev/null
@@ -0,0 +1,674 @@
+--- **AceAddon-3.0** provides a template for creating addon objects.
+-- It'll provide you with a set of callback functions that allow you to simplify the loading
+-- process of your addon.\\
+-- Callbacks provided are:\\
+-- * **OnInitialize**, which is called directly after the addon is fully loaded.
+-- * **OnEnable** which gets called during the PLAYER_LOGIN event, when most of the data provided by the game is already present.
+-- * **OnDisable**, which is only called when your addon is manually being disabled.
+-- @usage
+-- -- A small (but complete) addon, that doesn't do anything, 
+-- -- but shows usage of the callbacks.
+-- local MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
+-- 
+-- function MyAddon:OnInitialize()
+--   -- do init tasks here, like loading the Saved Variables, 
+--   -- or setting up slash commands.
+-- end
+-- 
+-- function MyAddon:OnEnable()
+--   -- Do more initialization here, that really enables the use of your addon.
+--   -- Register Events, Hook functions, Create Frames, Get information from 
+--   -- the game that wasn't available in OnInitialize
+-- end
+--
+-- function MyAddon:OnDisable()
+--   -- Unhook, Unregister Events, Hide frames that you created.
+--   -- You would probably only use an OnDisable if you want to 
+--   -- build a "standby" mode, or be able to toggle modules on/off.
+-- end
+-- @class file
+-- @name AceAddon-3.0.lua
+-- @release $Id: AceAddon-3.0.lua 1084 2013-04-27 20:14:11Z nevcairiel $
+
+local MAJOR, MINOR = "AceAddon-3.0", 12
+local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+
+if not AceAddon then return end -- No Upgrade needed.
+
+AceAddon.frame = AceAddon.frame or CreateFrame("Frame", "AceAddon30Frame") -- Our very own frame
+AceAddon.addons = AceAddon.addons or {} -- addons in general
+AceAddon.statuses = AceAddon.statuses or {} -- statuses of addon.
+AceAddon.initializequeue = AceAddon.initializequeue or {} -- addons that are new and not initialized
+AceAddon.enablequeue = AceAddon.enablequeue or {} -- addons that are initialized and waiting to be enabled
+AceAddon.embeds = AceAddon.embeds or setmetatable({}, {__index = function(tbl, key) tbl[key] = {} return tbl[key] end }) -- contains a list of libraries embedded in an addon
+
+-- Lua APIs
+local tinsert, tconcat, tremove = table.insert, table.concat, table.remove
+local fmt, tostring = string.format, tostring
+local select, pairs, next, type, unpack = select, pairs, next, type, unpack
+local loadstring, assert, error = loadstring, assert, error
+local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, rawset, rawget
+
+-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
+-- List them here for Mikk's FindGlobals script
+-- GLOBALS: LibStub, IsLoggedIn, geterrorhandler
+
+--[[
+        xpcall safecall implementation
+]]
+local xpcall = xpcall
+
+local function errorhandler(err)
+       return geterrorhandler()(err)
+end
+
+local function CreateDispatcher(argCount)
+       local code = [[
+               local xpcall, eh = ...
+               local method, ARGS
+               local function call() return method(ARGS) end
+       
+               local function dispatch(func, ...)
+                        method = func
+                        if not method then return end
+                        ARGS = ...
+                        return xpcall(call, eh)
+               end
+       
+               return dispatch
+       ]]
+       
+       local ARGS = {}
+       for i = 1, argCount do ARGS[i] = "arg"..i end
+       code = code:gsub("ARGS", tconcat(ARGS, ", "))
+       return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler)
+end
+
+local Dispatchers = setmetatable({}, {__index=function(self, argCount)
+       local dispatcher = CreateDispatcher(argCount)
+       rawset(self, argCount, dispatcher)
+       return dispatcher
+end})
+Dispatchers[0] = function(func)
+       return xpcall(func, errorhandler)
+end
+
+local function safecall(func, ...)
+       -- we check to see if the func is passed is actually a function here and don't error when it isn't
+       -- this safecall is used for optional functions like OnInitialize OnEnable etc. When they are not
+       -- present execution should continue without hinderance
+       if type(func) == "function" then
+               return Dispatchers[select('#', ...)](func, ...)
+       end
+end
+
+-- local functions that will be implemented further down
+local Enable, Disable, EnableModule, DisableModule, Embed, NewModule, GetModule, GetName, SetDefaultModuleState, SetDefaultModuleLibraries, SetEnabledState, SetDefaultModulePrototype
+
+-- used in the addon metatable
+local function addontostring( self ) return self.name end 
+
+-- Check if the addon is queued for initialization
+local function queuedForInitialization(addon)
+       for i = 1, #AceAddon.initializequeue do
+               if AceAddon.initializequeue[i] == addon then
+                       return true
+               end
+       end
+       return false
+end
+
+--- Create a new AceAddon-3.0 addon.
+-- Any libraries you specified will be embeded, and the addon will be scheduled for 
+-- its OnInitialize and OnEnable callbacks.
+-- The final addon object, with all libraries embeded, will be returned.
+-- @paramsig [object ,]name[, lib, ...]
+-- @param object Table to use as a base for the addon (optional)
+-- @param name Name of the addon object to create
+-- @param lib List of libraries to embed into the addon
+-- @usage 
+-- -- Create a simple addon object
+-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceEvent-3.0")
+--
+-- -- Create a Addon object based on the table of a frame
+-- local MyFrame = CreateFrame("Frame")
+-- MyAddon = LibStub("AceAddon-3.0"):NewAddon(MyFrame, "MyAddon", "AceEvent-3.0")
+function AceAddon:NewAddon(objectorname, ...)
+       local object,name
+       local i=1
+       if type(objectorname)=="table" then
+               object=objectorname
+               name=...
+               i=2
+       else
+               name=objectorname
+       end
+       if type(name)~="string" then
+               error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2)
+       end
+       if self.addons[name] then 
+               error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - Addon '%s' already exists."):format(name), 2)
+       end
+       
+       object = object or {}
+       object.name = name
+
+       local addonmeta = {}
+       local oldmeta = getmetatable(object)
+       if oldmeta then
+               for k, v in pairs(oldmeta) do addonmeta[k] = v end
+       end
+       addonmeta.__tostring = addontostring
+       
+       setmetatable( object, addonmeta )
+       self.addons[name] = object
+       object.modules = {}
+       object.orderedModules = {}
+       object.defaultModuleLibraries = {}
+       Embed( object ) -- embed NewModule, GetModule methods
+       self:EmbedLibraries(object, select(i,...))
+       
+       -- add to queue of addons to be initialized upon ADDON_LOADED
+       tinsert(self.initializequeue, object)
+       return object
+end
+
+
+--- Get the addon object by its name from the internal AceAddon registry.
+-- Throws an error if the addon object cannot be found (except if silent is set).
+-- @param name unique name of the addon object
+-- @param silent if true, the addon is optional, silently return nil if its not found
+-- @usage 
+-- -- Get the Addon
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+function AceAddon:GetAddon(name, silent)
+       if not silent and not self.addons[name] then
+               error(("Usage: GetAddon(name): 'name' - Cannot find an AceAddon '%s'."):format(tostring(name)), 2)
+       end
+       return self.addons[name]
+end
+
+-- - Embed a list of libraries into the specified addon.
+-- This function will try to embed all of the listed libraries into the addon
+-- and error if a single one fails.
+--
+-- **Note:** This function is for internal use by :NewAddon/:NewModule
+-- @paramsig addon, [lib, ...]
+-- @param addon addon object to embed the libs in
+-- @param lib List of libraries to embed into the addon
+function AceAddon:EmbedLibraries(addon, ...)
+       for i=1,select("#", ... ) do
+               local libname = select(i, ...)
+               self:EmbedLibrary(addon, libname, false, 4)
+       end
+end
+
+-- - Embed a library into the addon object.
+-- This function will check if the specified library is registered with LibStub
+-- and if it has a :Embed function to call. It'll error if any of those conditions
+-- fails.
+--
+-- **Note:** This function is for internal use by :EmbedLibraries
+-- @paramsig addon, libname[, silent[, offset]]
+-- @param addon addon object to embed the library in
+-- @param libname name of the library to embed
+-- @param silent marks an embed to fail silently if the library doesn't exist (optional)
+-- @param offset will push the error messages back to said offset, defaults to 2 (optional)
+function AceAddon:EmbedLibrary(addon, libname, silent, offset)
+       local lib = LibStub:GetLibrary(libname, true)
+       if not lib and not silent then
+               error(("Usage: EmbedLibrary(addon, libname, silent, offset): 'libname' - Cannot find a library instance of %q."):format(tostring(libname)), offset or 2)
+       elseif lib and type(lib.Embed) == "function" then
+               lib:Embed(addon)
+               tinsert(self.embeds[addon], libname)
+               return true
+       elseif lib then
+               error(("Usage: EmbedLibrary(addon, libname, silent, offset): 'libname' - Library '%s' is not Embed capable"):format(libname), offset or 2)
+       end
+end
+
+--- Return the specified module from an addon object.
+-- Throws an error if the addon object cannot be found (except if silent is set)
+-- @name //addon//:GetModule
+-- @paramsig name[, silent]
+-- @param name unique name of the module
+-- @param silent if true, the module is optional, silently return nil if its not found (optional)
+-- @usage 
+-- -- Get the Addon
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- -- Get the Module
+-- MyModule = MyAddon:GetModule("MyModule")
+function GetModule(self, name, silent)
+       if not self.modules[name] and not silent then
+               error(("Usage: GetModule(name, silent): 'name' - Cannot find module '%s'."):format(tostring(name)), 2)
+       end
+       return self.modules[name]
+end
+
+local function IsModuleTrue(self) return true end
+
+--- Create a new module for the addon.
+-- The new module can have its own embeded libraries and/or use a module prototype to be mixed into the module.\\
+-- A module has the same functionality as a real addon, it can have modules of its own, and has the same API as
+-- an addon object.
+-- @name //addon//:NewModule
+-- @paramsig name[, prototype|lib[, lib, ...]]
+-- @param name unique name of the module
+-- @param prototype object to derive this module from, methods and values from this table will be mixed into the module (optional)
+-- @param lib List of libraries to embed into the addon
+-- @usage 
+-- -- Create a module with some embeded libraries
+-- MyModule = MyAddon:NewModule("MyModule", "AceEvent-3.0", "AceHook-3.0")
+-- 
+-- -- Create a module with a prototype
+-- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
+-- MyModule = MyAddon:NewModule("MyModule", prototype, "AceEvent-3.0", "AceHook-3.0")
+function NewModule(self, name, prototype, ...)
+       if type(name) ~= "string" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2) end
+       if type(prototype) ~= "string" and type(prototype) ~= "table" and type(prototype) ~= "nil" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'prototype' - table (prototype), string (lib) or nil expected got '%s'."):format(type(prototype)), 2) end
+       
+       if self.modules[name] then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - Module '%s' already exists."):format(name), 2) end
+       
+       -- modules are basically addons. We treat them as such. They will be added to the initializequeue properly as well.
+       -- NewModule can only be called after the parent addon is present thus the modules will be initialized after their parent is.
+       local module = AceAddon:NewAddon(fmt("%s_%s", self.name or tostring(self), name))
+       
+       module.IsModule = IsModuleTrue
+       module:SetEnabledState(self.defaultModuleState)
+       module.moduleName = name
+
+       if type(prototype) == "string" then
+               AceAddon:EmbedLibraries(module, prototype, ...)
+       else
+               AceAddon:EmbedLibraries(module, ...)
+       end
+       AceAddon:EmbedLibraries(module, unpack(self.defaultModuleLibraries))
+
+       if not prototype or type(prototype) == "string" then
+               prototype = self.defaultModulePrototype or nil
+       end
+       
+       if type(prototype) == "table" then
+               local mt = getmetatable(module)
+               mt.__index = prototype
+               setmetatable(module, mt)  -- More of a Base class type feel.
+       end
+       
+       safecall(self.OnModuleCreated, self, module) -- Was in Ace2 and I think it could be a cool thing to have handy.
+       self.modules[name] = module
+       tinsert(self.orderedModules, module)
+       
+       return module
+end
+
+--- Returns the real name of the addon or module, without any prefix.
+-- @name //addon//:GetName
+-- @paramsig 
+-- @usage 
+-- print(MyAddon:GetName())
+-- -- prints "MyAddon"
+function GetName(self)
+       return self.moduleName or self.name
+end
+
+--- Enables the Addon, if possible, return true or false depending on success.
+-- This internally calls AceAddon:EnableAddon(), thus dispatching a OnEnable callback
+-- and enabling all modules of the addon (unless explicitly disabled).\\
+-- :Enable() also sets the internal `enableState` variable to true
+-- @name //addon//:Enable
+-- @paramsig 
+-- @usage 
+-- -- Enable MyModule
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyModule = MyAddon:GetModule("MyModule")
+-- MyModule:Enable()
+function Enable(self)
+       self:SetEnabledState(true)
+
+       -- nevcairiel 2013-04-27: don't enable an addon/module if its queued for init still
+       -- it'll be enabled after the init process
+       if not queuedForInitialization(self) then
+               return AceAddon:EnableAddon(self)
+       end
+end
+
+--- Disables the Addon, if possible, return true or false depending on success.
+-- This internally calls AceAddon:DisableAddon(), thus dispatching a OnDisable callback
+-- and disabling all modules of the addon.\\
+-- :Disable() also sets the internal `enableState` variable to false
+-- @name //addon//:Disable
+-- @paramsig 
+-- @usage 
+-- -- Disable MyAddon
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyAddon:Disable()
+function Disable(self)
+       self:SetEnabledState(false)
+       return AceAddon:DisableAddon(self)
+end
+
+--- Enables the Module, if possible, return true or false depending on success.
+-- Short-hand function that retrieves the module via `:GetModule` and calls `:Enable` on the module object.
+-- @name //addon//:EnableModule
+-- @paramsig name
+-- @usage 
+-- -- Enable MyModule using :GetModule
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyModule = MyAddon:GetModule("MyModule")
+-- MyModule:Enable()
+--
+-- -- Enable MyModule using the short-hand
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyAddon:EnableModule("MyModule")
+function EnableModule(self, name)
+       local module = self:GetModule( name )
+       return module:Enable()
+end
+
+--- Disables the Module, if possible, return true or false depending on success.
+-- Short-hand function that retrieves the module via `:GetModule` and calls `:Disable` on the module object.
+-- @name //addon//:DisableModule
+-- @paramsig name
+-- @usage 
+-- -- Disable MyModule using :GetModule
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyModule = MyAddon:GetModule("MyModule")
+-- MyModule:Disable()
+--
+-- -- Disable MyModule using the short-hand
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyAddon:DisableModule("MyModule")
+function DisableModule(self, name)
+       local module = self:GetModule( name )
+       return module:Disable()
+end
+
+--- Set the default libraries to be mixed into all modules created by this object.
+-- Note that you can only change the default module libraries before any module is created.
+-- @name //addon//:SetDefaultModuleLibraries
+-- @paramsig lib[, lib, ...]
+-- @param lib List of libraries to embed into the addon
+-- @usage 
+-- -- Create the addon object
+-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
+-- -- Configure default libraries for modules (all modules need AceEvent-3.0)
+-- MyAddon:SetDefaultModuleLibraries("AceEvent-3.0")
+-- -- Create a module
+-- MyModule = MyAddon:NewModule("MyModule")
+function SetDefaultModuleLibraries(self, ...)
+       if next(self.modules) then
+               error("Usage: SetDefaultModuleLibraries(...): cannot change the module defaults after a module has been registered.", 2)
+       end
+       self.defaultModuleLibraries = {...}
+end
+
+--- Set the default state in which new modules are being created.
+-- Note that you can only change the default state before any module is created.
+-- @name //addon//:SetDefaultModuleState
+-- @paramsig state
+-- @param state Default state for new modules, true for enabled, false for disabled
+-- @usage 
+-- -- Create the addon object
+-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
+-- -- Set the default state to "disabled"
+-- MyAddon:SetDefaultModuleState(false)
+-- -- Create a module and explicilty enable it
+-- MyModule = MyAddon:NewModule("MyModule")
+-- MyModule:Enable()
+function SetDefaultModuleState(self, state)
+       if next(self.modules) then
+               error("Usage: SetDefaultModuleState(state): cannot change the module defaults after a module has been registered.", 2)
+       end
+       self.defaultModuleState = state
+end
+
+--- Set the default prototype to use for new modules on creation.
+-- Note that you can only change the default prototype before any module is created.
+-- @name //addon//:SetDefaultModulePrototype
+-- @paramsig prototype
+-- @param prototype Default prototype for the new modules (table)
+-- @usage 
+-- -- Define a prototype
+-- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
+-- -- Set the default prototype
+-- MyAddon:SetDefaultModulePrototype(prototype)
+-- -- Create a module and explicitly Enable it
+-- MyModule = MyAddon:NewModule("MyModule")
+-- MyModule:Enable()
+-- -- should print "OnEnable called!" now
+-- @see NewModule
+function SetDefaultModulePrototype(self, prototype)
+       if next(self.modules) then
+               error("Usage: SetDefaultModulePrototype(prototype): cannot change the module defaults after a module has been registered.", 2)
+       end
+       if type(prototype) ~= "table" then
+               error(("Usage: SetDefaultModulePrototype(prototype): 'prototype' - table expected got '%s'."):format(type(prototype)), 2)
+       end
+       self.defaultModulePrototype = prototype
+end
+
+--- Set the state of an addon or module
+-- This should only be called before any enabling actually happend, e.g. in/before OnInitialize.
+-- @name //addon//:SetEnabledState
+-- @paramsig state
+-- @param state the state of an addon or module  (enabled=true, disabled=false)
+function SetEnabledState(self, state)
+       self.enabledState = state
+end
+
+
+--- Return an iterator of all modules associated to the addon.
+-- @name //addon//:IterateModules
+-- @paramsig 
+-- @usage 
+-- -- Enable all modules
+-- for name, module in MyAddon:IterateModules() do
+--    module:Enable()
+-- end
+local function IterateModules(self) return pairs(self.modules) end
+
+-- Returns an iterator of all embeds in the addon
+-- @name //addon//:IterateEmbeds
+-- @paramsig 
+local function IterateEmbeds(self) return pairs(AceAddon.embeds[self]) end
+
+--- Query the enabledState of an addon.
+-- @name //addon//:IsEnabled
+-- @paramsig 
+-- @usage 
+-- if MyAddon:IsEnabled() then
+--     MyAddon:Disable()
+-- end
+local function IsEnabled(self) return self.enabledState end
+local mixins = {
+       NewModule = NewModule,
+       GetModule = GetModule,
+       Enable = Enable,
+       Disable = Disable,
+       EnableModule = EnableModule,
+       DisableModule = DisableModule,
+       IsEnabled = IsEnabled,
+       SetDefaultModuleLibraries = SetDefaultModuleLibraries,
+       SetDefaultModuleState = SetDefaultModuleState,
+       SetDefaultModulePrototype = SetDefaultModulePrototype,
+       SetEnabledState = SetEnabledState,
+       IterateModules = IterateModules,
+       IterateEmbeds = IterateEmbeds,
+       GetName = GetName,
+}
+local function IsModule(self) return false end
+local pmixins = {
+       defaultModuleState = true,
+       enabledState = true,
+       IsModule = IsModule,
+}
+-- Embed( target )
+-- target (object) - target object to embed aceaddon in
+--
+-- this is a local function specifically since it's meant to be only called internally
+function Embed(target, skipPMixins)
+       for k, v in pairs(mixins) do
+               target[k] = v
+       end
+       if not skipPMixins then
+               for k, v in pairs(pmixins) do
+                       target[k] = target[k] or v
+               end
+       end
+end
+
+
+-- - Initialize the addon after creation.
+-- This function is only used internally during the ADDON_LOADED event
+-- It will call the **OnInitialize** function on the addon object (if present), 
+-- and the **OnEmbedInitialize** function on all embeded libraries.
+-- 
+-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
+-- @param addon addon object to intialize
+function AceAddon:InitializeAddon(addon)
+       safecall(addon.OnInitialize, addon)
+       
+       local embeds = self.embeds[addon]
+       for i = 1, #embeds do
+               local lib = LibStub:GetLibrary(embeds[i], true)
+               if lib then safecall(lib.OnEmbedInitialize, lib, addon) end
+       end
+       
+       -- we don't call InitializeAddon on modules specifically, this is handled
+       -- from the event handler and only done _once_
+end
+
+-- - Enable the addon after creation.
+-- Note: This function is only used internally during the PLAYER_LOGIN event, or during ADDON_LOADED,
+-- if IsLoggedIn() already returns true at that point, e.g. for LoD Addons.
+-- It will call the **OnEnable** function on the addon object (if present), 
+-- and the **OnEmbedEnable** function on all embeded libraries.\\
+-- This function does not toggle the enable state of the addon itself, and will return early if the addon is disabled.
+--
+-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
+-- Use :Enable on the addon itself instead.
+-- @param addon addon object to enable
+function AceAddon:EnableAddon(addon)
+       if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
+       if self.statuses[addon.name] or not addon.enabledState then return false end
+       
+       -- set the statuses first, before calling the OnEnable. this allows for Disabling of the addon in OnEnable.
+       self.statuses[addon.name] = true
+       
+       safecall(addon.OnEnable, addon)
+       
+       -- make sure we're still enabled before continueing
+       if self.statuses[addon.name] then
+               local embeds = self.embeds[addon]
+               for i = 1, #embeds do
+                       local lib = LibStub:GetLibrary(embeds[i], true)
+                       if lib then safecall(lib.OnEmbedEnable, lib, addon) end
+               end
+       
+               -- enable possible modules.
+               local modules = addon.orderedModules
+               for i = 1, #modules do
+                       self:EnableAddon(modules[i])
+               end
+       end
+       return self.statuses[addon.name] -- return true if we're disabled
+end
+
+-- - Disable the addon
+-- Note: This function is only used internally.
+-- It will call the **OnDisable** function on the addon object (if present), 
+-- and the **OnEmbedDisable** function on all embeded libraries.\\
+-- This function does not toggle the enable state of the addon itself, and will return early if the addon is still enabled.
+--
+-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing. 
+-- Use :Disable on the addon itself instead.
+-- @param addon addon object to enable
+function AceAddon:DisableAddon(addon)
+       if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
+       if not self.statuses[addon.name] then return false end
+       
+       -- set statuses first before calling OnDisable, this allows for aborting the disable in OnDisable.
+       self.statuses[addon.name] = false
+       
+       safecall( addon.OnDisable, addon )
+       
+       -- make sure we're still disabling...
+       if not self.statuses[addon.name] then 
+               local embeds = self.embeds[addon]
+               for i = 1, #embeds do
+                       local lib = LibStub:GetLibrary(embeds[i], true)
+                       if lib then safecall(lib.OnEmbedDisable, lib, addon) end
+               end
+               -- disable possible modules.
+               local modules = addon.orderedModules
+               for i = 1, #modules do
+                       self:DisableAddon(modules[i])
+               end
+       end
+       
+       return not self.statuses[addon.name] -- return true if we're disabled
+end
+
+--- Get an iterator over all registered addons.
+-- @usage 
+-- -- Print a list of all installed AceAddon's
+-- for name, addon in AceAddon:IterateAddons() do
+--   print("Addon: " .. name)
+-- end
+function AceAddon:IterateAddons() return pairs(self.addons) end
+
+--- Get an iterator over the internal status registry.
+-- @usage 
+-- -- Print a list of all enabled addons
+-- for name, status in AceAddon:IterateAddonStatus() do
+--   if status then
+--     print("EnabledAddon: " .. name)
+--   end
+-- end
+function AceAddon:IterateAddonStatus() return pairs(self.statuses) end
+
+-- Following Iterators are deprecated, and their addon specific versions should be used
+-- e.g. addon:IterateEmbeds() instead of :IterateEmbedsOnAddon(addon)
+function AceAddon:IterateEmbedsOnAddon(addon) return pairs(self.embeds[addon]) end
+function AceAddon:IterateModulesOfAddon(addon) return pairs(addon.modules) end
+
+-- Event Handling
+local function onEvent(this, event, arg1)
+       -- 2011-08-17 nevcairiel - ignore the load event of Blizzard_DebugTools, so a potential startup error isn't swallowed up
+       if (event == "ADDON_LOADED"  and arg1 ~= "Blizzard_DebugTools") or event == "PLAYER_LOGIN" then
+               -- if a addon loads another addon, recursion could happen here, so we need to validate the table on every iteration
+               while(#AceAddon.initializequeue > 0) do
+                       local addon = tremove(AceAddon.initializequeue, 1)
+                       -- this might be an issue with recursion - TODO: validate
+                       if event == "ADDON_LOADED" then addon.baseName = arg1 end
+                       AceAddon:InitializeAddon(addon)
+                       tinsert(AceAddon.enablequeue, addon)
+               end
+               
+               if IsLoggedIn() then
+                       while(#AceAddon.enablequeue > 0) do
+                               local addon = tremove(AceAddon.enablequeue, 1)
+                               AceAddon:EnableAddon(addon)
+                       end
+               end
+       end
+end
+
+AceAddon.frame:RegisterEvent("ADDON_LOADED")
+AceAddon.frame:RegisterEvent("PLAYER_LOGIN")
+AceAddon.frame:SetScript("OnEvent", onEvent)
+
+-- upgrade embeded
+for name, addon in pairs(AceAddon.addons) do
+       Embed(addon, true)
+end
+
+-- 2010-10-27 nevcairiel - add new "orderedModules" table
+if oldminor and oldminor < 10 then
+       for name, addon in pairs(AceAddon.addons) do
+               addon.orderedModules = {}
+               for module_name, module in pairs(addon.modules) do
+                       tinsert(addon.orderedModules, module)
+               end
+       end
+end
diff --git a/RaidFrameCustomizationConfig/libs/AceAddon-3.0/AceAddon-3.0.xml b/RaidFrameCustomizationConfig/libs/AceAddon-3.0/AceAddon-3.0.xml
new file mode 100644 (file)
index 0000000..dcf24c7
--- /dev/null
@@ -0,0 +1,4 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
+..\FrameXML\UI.xsd">
+       <Script file="AceAddon-3.0.lua"/>
+</Ui>
diff --git a/RaidFrameCustomizationConfig/libs/AceDB-3.0/AceDB-3.0.lua b/RaidFrameCustomizationConfig/libs/AceDB-3.0/AceDB-3.0.lua
new file mode 100644 (file)
index 0000000..b42b442
--- /dev/null
@@ -0,0 +1,746 @@
+--- **AceDB-3.0** manages the SavedVariables of your addon.
+-- It offers profile management, smart defaults and namespaces for modules.\\
+-- Data can be saved in different data-types, depending on its intended usage.
+-- The most common data-type is the `profile` type, which allows the user to choose
+-- the active profile, and manage the profiles of all of his characters.\\
+-- The following data types are available:
+-- * **char** Character-specific data. Every character has its own database.
+-- * **realm** Realm-specific data. All of the players characters on the same realm share this database.
+-- * **class** Class-specific data. All of the players characters of the same class share this database.
+-- * **race** Race-specific data. All of the players characters of the same race share this database.
+-- * **faction** Faction-specific data. All of the players characters of the same faction share this database.
+-- * **factionrealm** Faction and realm specific data. All of the players characters on the same realm and of the same faction share this database.
+-- * **locale** Locale specific data, based on the locale of the players game client.
+-- * **global** Global Data. All characters on the same account share this database.
+-- * **profile** Profile-specific data. All characters using the same profile share this database. The user can control which profile should be used.
+--
+-- Creating a new Database using the `:New` function will return a new DBObject. A database will inherit all functions
+-- of the DBObjectLib listed here. \\
+-- If you create a new namespaced child-database (`:RegisterNamespace`), you'll get a DBObject as well, but note
+-- that the child-databases cannot individually change their profile, and are linked to their parents profile - and because of that,
+-- the profile related APIs are not available. Only `:RegisterDefaults` and `:ResetProfile` are available on child-databases.
+--
+-- For more details on how to use AceDB-3.0, see the [[AceDB-3.0 Tutorial]].
+--
+-- You may also be interested in [[libdualspec-1-0|LibDualSpec-1.0]] to do profile switching automatically when switching specs.
+--
+-- @usage
+-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("DBExample")
+--
+-- -- declare defaults to be used in the DB
+-- local defaults = {
+--   profile = {
+--     setting = true,
+--   }
+-- }
+--
+-- function MyAddon:OnInitialize()
+--   -- Assuming the .toc says ## SavedVariables: MyAddonDB
+--   self.db = LibStub("AceDB-3.0"):New("MyAddonDB", defaults, true)
+-- end
+-- @class file
+-- @name AceDB-3.0.lua
+-- @release $Id: AceDB-3.0.lua 1142 2016-07-11 08:36:19Z nevcairiel $
+local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 26
+local AceDB, oldminor = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR)
+
+if not AceDB then return end -- No upgrade needed
+
+-- Lua APIs
+local type, pairs, next, error = type, pairs, next, error
+local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, rawset, rawget
+
+-- WoW APIs
+local _G = _G
+
+-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
+-- List them here for Mikk's FindGlobals script
+-- GLOBALS: LibStub
+
+AceDB.db_registry = AceDB.db_registry or {}
+AceDB.frame = AceDB.frame or CreateFrame("Frame")
+
+local CallbackHandler
+local CallbackDummy = { Fire = function() end }
+
+local DBObjectLib = {}
+
+--[[-------------------------------------------------------------------------
+       AceDB Utility Functions
+---------------------------------------------------------------------------]]
+
+-- Simple shallow copy for copying defaults
+local function copyTable(src, dest)
+       if type(dest) ~= "table" then dest = {} end
+       if type(src) == "table" then
+               for k,v in pairs(src) do
+                       if type(v) == "table" then
+                               -- try to index the key first so that the metatable creates the defaults, if set, and use that table
+                               v = copyTable(v, dest[k])
+                       end
+                       dest[k] = v
+               end
+       end
+       return dest
+end
+
+-- Called to add defaults to a section of the database
+--
+-- When a ["*"] default section is indexed with a new key, a table is returned
+-- and set in the host table.  These tables must be cleaned up by removeDefaults
+-- in order to ensure we don't write empty default tables.
+local function copyDefaults(dest, src)
+       -- this happens if some value in the SV overwrites our default value with a non-table
+       --if type(dest) ~= "table" then return end
+       for k, v in pairs(src) do
+               if k == "*" or k == "**" then
+                       if type(v) == "table" then
+                               -- This is a metatable used for table defaults
+                               local mt = {
+                                       -- This handles the lookup and creation of new subtables
+                                       __index = function(t,k)
+                                                       if k == nil then return nil end
+                                                       local tbl = {}
+                                                       copyDefaults(tbl, v)
+                                                       rawset(t, k, tbl)
+                                                       return tbl
+                                               end,
+                               }
+                               setmetatable(dest, mt)
+                               -- handle already existing tables in the SV
+                               for dk, dv in pairs(dest) do
+                                       if not rawget(src, dk) and type(dv) == "table" then
+                                               copyDefaults(dv, v)
+                                       end
+                               end
+                       else
+                               -- Values are not tables, so this is just a simple return
+                               local mt = {__index = function(t,k) return k~=nil and v or nil end}
+                               setmetatable(dest, mt)
+                       end
+               elseif type(v) == "table" then
+                       if not rawget(dest, k) then rawset(dest, k, {}) end
+                       if type(dest[k]) == "table" then
+                               copyDefaults(dest[k], v)
+                               if src['**'] then
+                                       copyDefaults(dest[k], src['**'])
+                               end
+                       end
+               else
+                       if rawget(dest, k) == nil then
+                               rawset(dest, k, v)
+                       end
+               end
+       end
+end
+
+-- Called to remove all defaults in the default table from the database
+local function removeDefaults(db, defaults, blocker)
+       -- remove all metatables from the db, so we don't accidentally create new sub-tables through them
+       setmetatable(db, nil)
+       -- loop through the defaults and remove their content
+       for k,v in pairs(defaults) do
+               if k == "*" or k == "**" then
+                       if type(v) == "table" then
+                               -- Loop through all the actual k,v pairs and remove
+                               for key, value in pairs(db) do
+                                       if type(value) == "table" then
+                                               -- if the key was not explicitly specified in the defaults table, just strip everything from * and ** tables
+                                               if defaults[key] == nil and (not blocker or blocker[key] == nil) then
+                                                       removeDefaults(value, v)
+                                                       -- if the table is empty afterwards, remove it
+                                                       if next(value) == nil then
+                                                               db[key] = nil
+                                                       end
+                                               -- if it was specified, only strip ** content, but block values which were set in the key table
+                                               elseif k == "**" then
+                                                       removeDefaults(value, v, defaults[key])
+                                               end
+                                       end
+                               end
+                       elseif k == "*" then
+                               -- check for non-table default
+                               for key, value in pairs(db) do
+                                       if defaults[key] == nil and v == value then
+                                               db[key] = nil
+                                       end
+                               end
+                       end
+               elseif type(v) == "table" and type(db[k]) == "table" then
+                       -- if a blocker was set, dive into it, to allow multi-level defaults
+                       removeDefaults(db[k], v, blocker and blocker[k])
+                       if next(db[k]) == nil then
+                               db[k] = nil
+                       end
+               else
+                       -- check if the current value matches the default, and that its not blocked by another defaults table
+                       if db[k] == defaults[k] and (not blocker or blocker[k] == nil) then
+                               db[k] = nil
+                       end
+               end
+       end
+end
+
+-- This is called when a table section is first accessed, to set up the defaults
+local function initSection(db, section, svstore, key, defaults)
+       local sv = rawget(db, "sv")
+
+       local tableCreated
+       if not sv[svstore] then sv[svstore] = {} end
+       if not sv[svstore][key] then
+               sv[svstore][key] = {}
+               tableCreated = true
+       end
+
+       local tbl = sv[svstore][key]
+
+       if defaults then
+               copyDefaults(tbl, defaults)
+       end
+       rawset(db, section, tbl)
+
+       return tableCreated, tbl
+end
+
+-- Metatable to handle the dynamic creation of sections and copying of sections.
+local dbmt = {
+       __index = function(t, section)
+                       local keys = rawget(t, "keys")
+                       local key = keys[section]
+                       if key then
+                               local defaultTbl = rawget(t, "defaults")
+                               local defaults = defaultTbl and defaultTbl[section]
+
+                               if section == "profile" then
+                                       local new = initSection(t, section, "profiles", key, defaults)
+                                       if new then
+                                               -- Callback: OnNewProfile, database, newProfileKey
+                                               t.callbacks:Fire("OnNewProfile", t, key)
+                                       end
+                               elseif section == "profiles" then
+                                       local sv = rawget(t, "sv")
+                                       if not sv.profiles then sv.profiles = {} end
+                                       rawset(t, "profiles", sv.profiles)
+                               elseif section == "global" then
+                                       local sv = rawget(t, "sv")
+                                       if not sv.global then sv.global = {} end
+                                       if defaults then
+                                               copyDefaults(sv.global, defaults)
+                                       end
+                                       rawset(t, section, sv.global)
+                               else
+                                       initSection(t, section, section, key, defaults)
+                               end
+                       end
+
+                       return rawget(t, section)
+               end
+}
+
+local function validateDefaults(defaults, keyTbl, offset)
+       if not defaults then return end
+       offset = offset or 0
+       for k in pairs(defaults) do
+               if not keyTbl[k] or k == "profiles" then
+                       error(("Usage: AceDBObject:RegisterDefaults(defaults): '%s' is not a valid datatype."):format(k), 3 + offset)
+               end
+       end
+end
+
+local preserve_keys = {
+       ["callbacks"] = true,
+       ["RegisterCallback"] = true,
+       ["UnregisterCallback"] = true,
+       ["UnregisterAllCallbacks"] = true,
+       ["children"] = true,
+}
+
+local realmKey = GetRealmName()
+local charKey = UnitName("player") .. " - " .. realmKey
+local _, classKey = UnitClass("player")
+local _, raceKey = UnitRace("player")
+local factionKey = UnitFactionGroup("player")
+local factionrealmKey = factionKey .. " - " .. realmKey
+local localeKey = GetLocale():lower()
+
+local regionTable = { "US", "KR", "EU", "TW", "CN" }
+local regionKey = regionTable[GetCurrentRegion()]
+local factionrealmregionKey = factionrealmKey .. " - " .. regionKey
+
+-- Actual database initialization function
+local function initdb(sv, defaults, defaultProfile, olddb, parent)
+       -- Generate the database keys for each section
+
+       -- map "true" to our "Default" profile
+       if defaultProfile == true then defaultProfile = "Default" end
+
+       local profileKey
+       if not parent then
+               -- Make a container for profile keys
+               if not sv.profileKeys then sv.profileKeys = {} end
+
+               -- Try to get the profile selected from the char db
+               profileKey = sv.profileKeys[charKey] or defaultProfile or charKey
+
+               -- save the selected profile for later
+               sv.profileKeys[charKey] = profileKey
+       else
+               -- Use the profile of the parents DB
+               profileKey = parent.keys.profile or defaultProfile or charKey
+
+               -- clear the profileKeys in the DB, namespaces don't need to store them
+               sv.profileKeys = nil
+       end
+
+       -- This table contains keys that enable the dynamic creation
+       -- of each section of the table.  The 'global' and 'profiles'
+       -- have a key of true, since they are handled in a special case
+       local keyTbl= {
+               ["char"] = charKey,
+               ["realm"] = realmKey,
+               ["class"] = classKey,
+               ["race"] = raceKey,
+               ["faction"] = factionKey,
+               ["factionrealm"] = factionrealmKey,
+               ["factionrealmregion"] = factionrealmregionKey,
+               ["profile"] = profileKey,
+               ["locale"] = localeKey,
+               ["global"] = true,
+               ["profiles"] = true,
+       }
+
+       validateDefaults(defaults, keyTbl, 1)
+
+       -- This allows us to use this function to reset an entire database
+       -- Clear out the old database
+       if olddb then
+               for k,v in pairs(olddb) do if not preserve_keys[k] then olddb[k] = nil end end
+       end
+
+       -- Give this database the metatable so it initializes dynamically
+       local db = setmetatable(olddb or {}, dbmt)
+
+       if not rawget(db, "callbacks") then
+               -- try to load CallbackHandler-1.0 if it loaded after our library
+               if not CallbackHandler then CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0", true) end
+               db.callbacks = CallbackHandler and CallbackHandler:New(db) or CallbackDummy
+       end
+
+       -- Copy methods locally into the database object, to avoid hitting
+       -- the metatable when calling methods
+
+       if not parent then
+               for name, func in pairs(DBObjectLib) do
+                       db[name] = func
+               end
+       else
+               -- hack this one in
+               db.RegisterDefaults = DBObjectLib.RegisterDefaults
+               db.ResetProfile = DBObjectLib.ResetProfile
+       end
+
+       -- Set some properties in the database object
+       db.profiles = sv.profiles
+       db.keys = keyTbl
+       db.sv = sv
+       --db.sv_name = name
+       db.defaults = defaults
+       db.parent = parent
+
+       -- store the DB in the registry
+       AceDB.db_registry[db] = true
+
+       return db
+end
+
+-- handle PLAYER_LOGOUT
+-- strip all defaults from all databases
+-- and cleans up empty sections
+local function logoutHandler(frame, event)
+       if event == "PLAYER_LOGOUT" then
+               for db in pairs(AceDB.db_registry) do
+                       db.callbacks:Fire("OnDatabaseShutdown", db)
+                       db:RegisterDefaults(nil)
+
+                       -- cleanup sections that are empty without defaults
+                       local sv = rawget(db, "sv")
+                       for section in pairs(db.keys) do
+                               if rawget(sv, section) then
+                                       -- global is special, all other sections have sub-entrys
+                                       -- also don't delete empty profiles on main dbs, only on namespaces
+                                       if section ~= "global" and (section ~= "profiles" or rawget(db, "parent")) then
+                                               for key in pairs(sv[section]) do
+                                                       if not next(sv[section][key]) then
+                                                               sv[section][key] = nil
+                                                       end
+                                               end
+                                       end
+                                       if not next(sv[section]) then
+                                               sv[section] = nil
+                                       end
+                               end
+                       end
+               end
+       end
+end
+
+AceDB.frame:RegisterEvent("PLAYER_LOGOUT")
+AceDB.frame:SetScript("OnEvent", logoutHandler)
+
+
+--[[-------------------------------------------------------------------------
+       AceDB Object Method Definitions
+---------------------------------------------------------------------------]]
+
+--- Sets the defaults table for the given database object by clearing any
+-- that are currently set, and then setting the new defaults.
+-- @param defaults A table of defaults for this database
+function DBObjectLib:RegisterDefaults(defaults)
+       if defaults and type(defaults) ~= "table" then
+               error("Usage: AceDBObject:RegisterDefaults(defaults): 'defaults' - table or nil expected.", 2)
+       end
+
+       validateDefaults(defaults, self.keys)
+
+       -- Remove any currently set defaults
+       if self.defaults then
+               for section,key in pairs(self.keys) do
+                       if self.defaults[section] and rawget(self, section) then
+                               removeDefaults(self[section], self.defaults[section])
+                       end
+               end
+       end
+
+       -- Set the DBObject.defaults table
+       self.defaults = defaults
+
+       -- Copy in any defaults, only touching those sections already created
+       if defaults then
+               for section,key in pairs(self.keys) do
+                       if defaults[section] and rawget(self, section) then
+                               copyDefaults(self[section], defaults[section])
+                       end
+               end
+       end
+end
+
+--- Changes the profile of the database and all of it's namespaces to the
+-- supplied named profile
+-- @param name The name of the profile to set as the current profile
+function DBObjectLib:SetProfile(name)
+       if type(name) ~= "string" then
+               error("Usage: AceDBObject:SetProfile(name): 'name' - string expected.", 2)
+       end
+
+       -- changing to the same profile, dont do anything
+       if name == self.keys.profile then return end
+
+       local oldProfile = self.profile
+       local defaults = self.defaults and self.defaults.profile
+
+       -- Callback: OnProfileShutdown, database
+       self.callbacks:Fire("OnProfileShutdown", self)
+
+       if oldProfile and defaults then
+               -- Remove the defaults from the old profile
+               removeDefaults(oldProfile, defaults)
+       end
+
+       self.profile = nil
+       self.keys["profile"] = name
+
+       -- if the storage exists, save the new profile
+       -- this won't exist on namespaces.
+       if self.sv.profileKeys then
+               self.sv.profileKeys[charKey] = name
+       end
+
+       -- populate to child namespaces
+       if self.children then
+               for _, db in pairs(self.children) do
+                       DBObjectLib.SetProfile(db, name)
+               end
+       end
+
+       -- Callback: OnProfileChanged, database, newProfileKey
+       self.callbacks:Fire("OnProfileChanged", self, name)
+end
+
+--- Returns a table with the names of the existing profiles in the database.
+-- You can optionally supply a table to re-use for this purpose.
+-- @param tbl A table to store the profile names in (optional)
+function DBObjectLib:GetProfiles(tbl)
+       if tbl and type(tbl) ~= "table" then
+               error("Usage: AceDBObject:GetProfiles(tbl): 'tbl' - table or nil expected.", 2)
+       end
+
+       -- Clear the container table
+       if tbl then
+               for k,v in pairs(tbl) do tbl[k] = nil end
+       else
+               tbl = {}
+       end
+
+       local curProfile = self.keys.profile
+
+       local i = 0
+       for profileKey in pairs(self.profiles) do
+               i = i + 1
+               tbl[i] = profileKey
+               if curProfile and profileKey == curProfile then curProfile = nil end
+       end
+
+       -- Add the current profile, if it hasn't been created yet
+       if curProfile then
+               i = i + 1
+               tbl[i] = curProfile
+       end
+
+       return tbl, i
+end
+
+--- Returns the current profile name used by the database
+function DBObjectLib:GetCurrentProfile()
+       return self.keys.profile
+end
+
+--- Deletes a named profile.  This profile must not be the active profile.
+-- @param name The name of the profile to be deleted
+-- @param silent If true, do not raise an error when the profile does not exist
+function DBObjectLib:DeleteProfile(name, silent)
+       if type(name) ~= "string" then
+               error("Usage: AceDBObject:DeleteProfile(name): 'name' - string expected.", 2)
+       end
+
+       if self.keys.profile == name then
+               error("Cannot delete the active profile in an AceDBObject.", 2)
+       end
+
+       if not rawget(self.profiles, name) and not silent then
+               error("Cannot delete profile '" .. name .. "'. It does not exist.", 2)
+       end
+
+       self.profiles[name] = nil
+
+       -- populate to child namespaces
+       if self.children then
+               for _, db in pairs(self.children) do
+                       DBObjectLib.DeleteProfile(db, name, true)
+               end
+       end
+
+       -- switch all characters that use this profile back to the default
+       if self.sv.profileKeys then
+               for key, profile in pairs(self.sv.profileKeys) do
+                       if profile == name then
+                               self.sv.profileKeys[key] = nil
+                       end
+               end
+       end
+
+       -- Callback: OnProfileDeleted, database, profileKey
+       self.callbacks:Fire("OnProfileDeleted", self, name)
+end
+
+--- Copies a named profile into the current profile, overwriting any conflicting
+-- settings.
+-- @param name The name of the profile to be copied into the current profile
+-- @param silent If true, do not raise an error when the profile does not exist
+function DBObjectLib:CopyProfile(name, silent)
+       if type(name) ~= "string" then
+               error("Usage: AceDBObject:CopyProfile(name): 'name' - string expected.", 2)
+       end
+
+       if name == self.keys.profile then
+               error("Cannot have the same source and destination profiles.", 2)
+       end
+
+       if not rawget(self.profiles, name) and not silent then
+               error("Cannot copy profile '" .. name .. "'. It does not exist.", 2)
+       end
+
+       -- Reset the profile before copying
+       DBObjectLib.ResetProfile(self, nil, true)
+
+       local profile = self.profile
+       local source = self.profiles[name]
+
+       copyTable(source, profile)
+
+       -- populate to child namespaces
+       if self.children then
+               for _, db in pairs(self.children) do
+                       DBObjectLib.CopyProfile(db, name, true)
+               end
+       end
+
+       -- Callback: OnProfileCopied, database, sourceProfileKey
+       self.callbacks:Fire("OnProfileCopied", self, name)
+end
+
+--- Resets the current profile to the default values (if specified).
+-- @param noChildren if set to true, the reset will not be populated to the child namespaces of this DB object
+-- @param noCallbacks if set to true, won't fire the OnProfileReset callback
+function DBObjectLib:ResetProfile(noChildren, noCallbacks)
+       local profile = self.profile
+
+       for k,v in pairs(profile) do
+               profile[k] = nil
+       end
+
+       local defaults = self.defaults and self.defaults.profile
+       if defaults then
+               copyDefaults(profile, defaults)
+       end
+
+       -- populate to child namespaces
+       if self.children and not noChildren then
+               for _, db in pairs(self.children) do
+                       DBObjectLib.ResetProfile(db, nil, noCallbacks)
+               end
+       end
+
+       -- Callback: OnProfileReset, database
+       if not noCallbacks then
+               self.callbacks:Fire("OnProfileReset", self)
+       end
+end
+
+--- Resets the entire database, using the string defaultProfile as the new default
+-- profile.
+-- @param defaultProfile The profile name to use as the default
+function DBObjectLib:ResetDB(defaultProfile)
+       if defaultProfile and type(defaultProfile) ~= "string" then
+               error("Usage: AceDBObject:ResetDB(defaultProfile): 'defaultProfile' - string or nil expected.", 2)
+       end
+
+       local sv = self.sv
+       for k,v in pairs(sv) do
+               sv[k] = nil
+       end
+
+       local parent = self.parent
+
+       initdb(sv, self.defaults, defaultProfile, self)
+
+       -- fix the child namespaces
+       if self.children then
+               if not sv.namespaces then sv.namespaces = {} end
+               for name, db in pairs(self.children) do
+                       if not sv.namespaces[name] then sv.namespaces[name] = {} end
+                       initdb(sv.namespaces[name], db.defaults, self.keys.profile, db, self)
+               end
+       end
+
+       -- Callback: OnDatabaseReset, database
+       self.callbacks:Fire("OnDatabaseReset", self)
+       -- Callback: OnProfileChanged, database, profileKey
+       self.callbacks:Fire("OnProfileChanged", self, self.keys["profile"])
+
+       return self
+end
+
+--- Creates a new database namespace, directly tied to the database.  This
+-- is a full scale database in it's own rights other than the fact that
+-- it cannot control its profile individually
+-- @param name The name of the new namespace
+-- @param defaults A table of values to use as defaults
+function DBObjectLib:RegisterNamespace(name, defaults)
+       if type(name) ~= "string" then
+               error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - string expected.", 2)
+       end
+       if defaults and type(defaults) ~= "table" then
+               error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'defaults' - table or nil expected.", 2)
+       end
+       if self.children and self.children[name] then
+               error ("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - a namespace with that name already exists.", 2)
+       end
+
+       local sv = self.sv
+       if not sv.namespaces then sv.namespaces = {} end
+       if not sv.namespaces[name] then
+               sv.namespaces[name] = {}
+       end
+
+       local newDB = initdb(sv.namespaces[name], defaults, self.keys.profile, nil, self)
+
+       if not self.children then self.children = {} end
+       self.children[name] = newDB
+       return newDB
+end
+
+--- Returns an already existing namespace from the database object.
+-- @param name The name of the new namespace
+-- @param silent if true, the addon is optional, silently return nil if its not found
+-- @usage
+-- local namespace = self.db:GetNamespace('namespace')
+-- @return the namespace object if found
+function DBObjectLib:GetNamespace(name, silent)
+       if type(name) ~= "string" then
+               error("Usage: AceDBObject:GetNamespace(name): 'name' - string expected.", 2)
+       end
+       if not silent and not (self.children and self.children[name]) then
+               error ("Usage: AceDBObject:GetNamespace(name): 'name' - namespace does not exist.", 2)
+       end
+       if not self.children then self.children = {} end
+       return self.children[name]
+end
+
+--[[-------------------------------------------------------------------------
+       AceDB Exposed Methods
+---------------------------------------------------------------------------]]
+
+--- Creates a new database object that can be used to handle database settings and profiles.
+-- By default, an empty DB is created, using a character specific profile.
+--
+-- You can override the default profile used by passing any profile name as the third argument,
+-- or by passing //true// as the third argument to use a globally shared profile called "Default".
+--
+-- Note that there is no token replacement in the default profile name, passing a defaultProfile as "char"
+-- will use a profile named "char", and not a character-specific profile.
+-- @param tbl The name of variable, or table to use for the database
+-- @param defaults A table of database defaults
+-- @param defaultProfile The name of the default profile. If not set, a character specific profile will be used as the default.
+-- You can also pass //true// to use a shared global profile called "Default".
+-- @usage
+-- -- Create an empty DB using a character-specific default profile.
+-- self.db = LibStub("AceDB-3.0"):New("MyAddonDB")
+-- @usage
+-- -- Create a DB using defaults and using a shared default profile
+-- self.db = LibStub("AceDB-3.0"):New("MyAddonDB", defaults, true)
+function AceDB:New(tbl, defaults, defaultProfile)
+       if type(tbl) == "string" then
+               local name = tbl
+               tbl = _G[name]
+               if not tbl then
+                       tbl = {}
+                       _G[name] = tbl
+               end
+       end
+
+       if type(tbl) ~= "table" then
+               error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'tbl' - table expected.", 2)
+       end
+
+       if defaults and type(defaults) ~= "table" then
+               error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaults' - table expected.", 2)
+       end
+
+       if defaultProfile and type(defaultProfile) ~= "string" and defaultProfile ~= true then
+               error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaultProfile' - string or true expected.", 2)
+       end
+
+       return initdb(tbl, defaults, defaultProfile)
+end
+
+-- upgrade existing databases
+for db in pairs(AceDB.db_registry) do
+       if not db.parent then
+               for name,func in pairs(DBObjectLib) do
+                       db[name] = func
+               end
+       else
+               db.RegisterDefaults = DBObjectLib.RegisterDefaults
+               db.ResetProfile = DBObjectLib.ResetProfile
+       end
+end
diff --git a/RaidFrameCustomizationConfig/libs/AceDB-3.0/AceDB-3.0.xml b/RaidFrameCustomizationConfig/libs/AceDB-3.0/AceDB-3.0.xml
new file mode 100644 (file)
index 0000000..108fc70
--- /dev/null
@@ -0,0 +1,4 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
+..\FrameXML\UI.xsd">
+       <Script file="AceDB-3.0.lua"/>
+</Ui>
diff --git a/RaidFrameCustomizationConfig/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua b/RaidFrameCustomizationConfig/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
new file mode 100644 (file)
index 0000000..2a64013
--- /dev/null
@@ -0,0 +1,238 @@
+--[[ $Id: CallbackHandler-1.0.lua 18 2014-10-16 02:52:20Z mikk $ ]]
+local MAJOR, MINOR = "CallbackHandler-1.0", 6
+local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)
+
+if not CallbackHandler then return end -- No upgrade needed
+
+local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end}
+
+-- Lua APIs
+local tconcat = table.concat
+local assert, error, loadstring = assert, error, loadstring
+local setmetatable, rawset, rawget = setmetatable, rawset, rawget
+local next, select, pairs, type, tostring = next, select, pairs, type, tostring
+
+-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
+-- List them here for Mikk's FindGlobals script
+-- GLOBALS: geterrorhandler
+
+local xpcall = xpcall
+
+local function errorhandler(err)
+       return geterrorhandler()(err)
+end
+
+local function CreateDispatcher(argCount)
+       local code = [[
+       local next, xpcall, eh = ...
+
+       local method, ARGS
+       local function call() method(ARGS) end
+
+       local function dispatch(handlers, ...)
+               local index
+               index, method = next(handlers)
+               if not method then return end
+               local OLD_ARGS = ARGS
+               ARGS = ...
+               repeat
+                       xpcall(call, eh)
+                       index, method = next(handlers, index)
+               until not method
+               ARGS = OLD_ARGS
+       end
+
+       return dispatch
+       ]]
+
+       local ARGS, OLD_ARGS = {}, {}
+       for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end
+       code = code:gsub("OLD_ARGS", tconcat(OLD_ARGS, ", ")):gsub("ARGS", tconcat(ARGS, ", "))
+       return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler)
+end
+
+local Dispatchers = setmetatable({}, {__index=function(self, argCount)
+       local dispatcher = CreateDispatcher(argCount)
+       rawset(self, argCount, dispatcher)
+       return dispatcher
+end})
+
+--------------------------------------------------------------------------
+-- CallbackHandler:New
+--
+--   target            - target object to embed public APIs in
+--   RegisterName      - name of the callback registration API, default "RegisterCallback"
+--   UnregisterName    - name of the callback unregistration API, default "UnregisterCallback"
+--   UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.
+
+function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName)
+
+       RegisterName = RegisterName or "RegisterCallback"
+       UnregisterName = UnregisterName or "UnregisterCallback"
+       if UnregisterAllName==nil then  -- false is used to indicate "don't want this method"
+               UnregisterAllName = "UnregisterAllCallbacks"
+       end
+
+       -- we declare all objects and exported APIs inside this closure to quickly gain access
+       -- to e.g. function names, the "target" parameter, etc
+
+
+       -- Create the registry object
+       local events = setmetatable({}, meta)
+       local registry = { recurse=0, events=events }
+
+       -- registry:Fire() - fires the given event/message into the registry
+       function registry:Fire(eventname, ...)
+               if not rawget(events, eventname) or not next(events[eventname]) then return end
+               local oldrecurse = registry.recurse
+               registry.recurse = oldrecurse + 1
+
+               Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...)
+
+               registry.recurse = oldrecurse
+
+               if registry.insertQueue and oldrecurse==0 then
+                       -- Something in one of our callbacks wanted to register more callbacks; they got queued
+                       for eventname,callbacks in pairs(registry.insertQueue) do
+                               local first = not rawget(events, eventname) or not next(events[eventname])      -- test for empty before. not test for one member after. that one member may have been overwritten.
+                               for self,func in pairs(callbacks) do
+                                       events[eventname][self] = func
+                                       -- fire OnUsed callback?
+                                       if first and registry.OnUsed then
+                                               registry.OnUsed(registry, target, eventname)
+                                               first = nil
+                                       end
+                               end
+                       end
+                       registry.insertQueue = nil
+               end
+       end
+
+       -- Registration of a callback, handles:
+       --   self["method"], leads to self["method"](self, ...)
+       --   self with function ref, leads to functionref(...)
+       --   "addonId" (instead of self) with function ref, leads to functionref(...)
+       -- all with an optional arg, which, if present, gets passed as first argument (after self if present)
+       target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]])
+               if type(eventname) ~= "string" then
+                       error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2)
+               end
+
+               method = method or eventname
+
+               local first = not rawget(events, eventname) or not next(events[eventname])      -- test for empty before. not test for one member after. that one member may have been overwritten.
+
+               if type(method) ~= "string" and type(method) ~= "function" then
+                       error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2)
+               end
+
+               local regfunc
+
+               if type(method) == "string" then
+                       -- self["method"] calling style
+                       if type(self) ~= "table" then
+                               error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2)
+                       elseif self==target then
+                               error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2)
+                       elseif type(self[method]) ~= "function" then
+                               error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2)
+                       end
+
+                       if select("#",...)>=1 then      -- this is not the same as testing for arg==nil!
+                               local arg=select(1,...)
+                               regfunc = function(...) self[method](self,arg,...) end
+                       else
+                               regfunc = function(...) self[method](self,...) end
+                       end
+               else
+                       -- function ref with self=object or self="addonId" or self=thread
+                       if type(self)~="table" and type(self)~="string" and type(self)~="thread" then
+                               error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string or thread expected.", 2)
+                       end
+
+                       if select("#",...)>=1 then      -- this is not the same as testing for arg==nil!
+                               local arg=select(1,...)
+                               regfunc = function(...) method(arg,...) end
+                       else
+                               regfunc = method
+                       end
+               end
+
+
+               if events[eventname][self] or registry.recurse<1 then
+               -- if registry.recurse<1 then
+                       -- we're overwriting an existing entry, or not currently recursing. just set it.
+                       events[eventname][self] = regfunc
+                       -- fire OnUsed callback?
+                       if registry.OnUsed and first then
+                               registry.OnUsed(registry, target, eventname)
+                       end
+               else
+                       -- we're currently processing a callback in this registry, so delay the registration of this new entry!
+                       -- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency
+                       registry.insertQueue = registry.insertQueue or setmetatable({},meta)
+                       registry.insertQueue[eventname][self] = regfunc
+               end
+       end
+
+       -- Unregister a callback
+       target[UnregisterName] = function(self, eventname)
+               if not self or self==target then
+                       error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2)
+               end
+               if type(eventname) ~= "string" then
+                       error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2)
+               end
+               if rawget(events, eventname) and events[eventname][self] then
+                       events[eventname][self] = nil
+                       -- Fire OnUnused callback?
+                       if registry.OnUnused and not next(events[eventname]) then
+                               registry.OnUnused(registry, target, eventname)
+                       end
+               end
+               if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then
+                       registry.insertQueue[eventname][self] = nil
+               end
+       end
+
+       -- OPTIONAL: Unregister all callbacks for given selfs/addonIds
+       if UnregisterAllName then
+               target[UnregisterAllName] = function(...)
+                       if select("#",...)<1 then
+                               error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2)
+                       end
+                       if select("#",...)==1 and ...==target then
+                               error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2)
+                       end
+
+
+                       for i=1,select("#",...) do
+                               local self = select(i,...)
+                               if registry.insertQueue then
+                                       for eventname, callbacks in pairs(registry.insertQueue) do
+                                               if callbacks[self] then
+                                                       callbacks[self] = nil
+                                               end
+                                       end
+                               end
+                               for eventname, callbacks in pairs(events) do
+                                       if callbacks[self] then
+                                               callbacks[self] = nil
+                                               -- Fire OnUnused callback?
+                                               if registry.OnUnused and not next(callbacks) then
+                                                       registry.OnUnused(registry, target, eventname)
+                                               end
+                                       end
+                               end
+                       end
+               end
+       end
+
+       return registry
+end
+
+
+-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it
+-- try to upgrade old implicit embeds since the system is selfcontained and
+-- relies on closures to work.
+
diff --git a/RaidFrameCustomizationConfig/libs/CallbackHandler-1.0/CallbackHandler-1.0.xml b/RaidFrameCustomizationConfig/libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
new file mode 100644 (file)
index 0000000..c107f88
--- /dev/null
@@ -0,0 +1,4 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
+..\FrameXML\UI.xsd">
+       <Script file="CallbackHandler-1.0.lua"/>
+</Ui>
diff --git a/RaidFrameCustomizationConfig/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua b/RaidFrameCustomizationConfig/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
new file mode 100644 (file)
index 0000000..ce5ff14
--- /dev/null
@@ -0,0 +1,292 @@
+--[[
+Name: LibSharedMedia-3.0
+Revision: $Revision: 91 $
+Author: Elkano (elkano@gmx.de)
+Inspired By: SurfaceLib by Haste/Otravi (troeks@gmail.com)
+Website: http://www.wowace.com/projects/libsharedmedia-3-0/
+Description: Shared handling of media data (fonts, sounds, textures, ...) between addons.
+Dependencies: LibStub, CallbackHandler-1.0
+License: LGPL v2.1
+]]
+
+local MAJOR, MINOR = "LibSharedMedia-3.0", 6010002 -- 6.1.0 v2 / increase manually on changes
+local lib = LibStub:NewLibrary(MAJOR, MINOR)
+
+if not lib then return end
+
+local _G = getfenv(0)
+
+local pairs            = _G.pairs
+local type             = _G.type
+
+local band                     = _G.bit.band
+
+local table_insert     = _G.table.insert
+local table_sort       = _G.table.sort
+
+local locale = GetLocale()
+local locale_is_western
+local LOCALE_MASK = 0
+lib.LOCALE_BIT_koKR            = 1
+lib.LOCALE_BIT_ruRU            = 2
+lib.LOCALE_BIT_zhCN            = 4
+lib.LOCALE_BIT_zhTW            = 8
+lib.LOCALE_BIT_western = 128
+
+local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
+
+lib.callbacks          = lib.callbacks                 or CallbackHandler:New(lib)
+
+lib.DefaultMedia       = lib.DefaultMedia              or {}
+lib.MediaList          = lib.MediaList                 or {}
+lib.MediaTable         = lib.MediaTable                or {}
+lib.MediaType          = lib.MediaType                 or {}
+lib.OverrideMedia      = lib.OverrideMedia             or {}
+
+local defaultMedia = lib.DefaultMedia
+local mediaList = lib.MediaList
+local mediaTable = lib.MediaTable
+local overrideMedia = lib.OverrideMedia
+
+
+-- create mediatype constants
+lib.MediaType.BACKGROUND       = "background"                  -- background textures
+lib.MediaType.BORDER           = "border"                              -- border textures
+lib.MediaType.FONT                     = "font"                                -- fonts
+lib.MediaType.STATUSBAR                = "statusbar"                   -- statusbar textures
+lib.MediaType.SOUND                    = "sound"                               -- sound files
+
+-- populate lib with default Blizzard data
+-- BACKGROUND
+if not lib.MediaTable.background then lib.MediaTable.background = {} end
+lib.MediaTable.background["None"]                                                                      = [[]]
+lib.MediaTable.background["Blizzard Collections Background"]           = [[Interface\Collections\CollectionsBackgroundTile]]
+lib.MediaTable.background["Blizzard Dialog Background"]                                = [[Interface\DialogFrame\UI-DialogBox-Background]]
+lib.MediaTable.background["Blizzard Dialog Background Dark"]           = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]]
+lib.MediaTable.background["Blizzard Dialog Background Gold"]           = [[Interface\DialogFrame\UI-DialogBox-Gold-Background]]
+lib.MediaTable.background["Blizzard Garrison Background"]                      = [[Interface\Garrison\GarrisonUIBackground]]
+lib.MediaTable.background["Blizzard Garrison Background 2"]                    = [[Interface\Garrison\GarrisonUIBackground2]]
+lib.MediaTable.background["Blizzard Garrison Background 3"]                    = [[Interface\Garrison\GarrisonMissionUIInfoBoxBackgroundTile]]
+lib.MediaTable.background["Blizzard Low Health"]                                       = [[Interface\FullScreenTextures\LowHealth]]
+lib.MediaTable.background["Blizzard Marble"]                                           = [[Interface\FrameGeneral\UI-Background-Marble]]
+lib.MediaTable.background["Blizzard Out of Control"]                           = [[Interface\FullScreenTextures\OutOfControl]]
+lib.MediaTable.background["Blizzard Parchment"]                                                = [[Interface\AchievementFrame\UI-Achievement-Parchment-Horizontal]]
+lib.MediaTable.background["Blizzard Parchment 2"]                                      = [[Interface\AchievementFrame\UI-GuildAchievement-Parchment-Horizontal]]
+lib.MediaTable.background["Blizzard Rock"]                                                     = [[Interface\FrameGeneral\UI-Background-Rock]]
+lib.MediaTable.background["Blizzard Tabard Background"]                                = [[Interface\TabardFrame\TabardFrameBackground]]
+lib.MediaTable.background["Blizzard Tooltip"]                                          = [[Interface\Tooltips\UI-Tooltip-Background]]
+lib.MediaTable.background["Solid"]                                                                     = [[Interface\Buttons\WHITE8X8]]
+lib.DefaultMedia.background = "None"
+
+-- BORDER
+if not lib.MediaTable.border then lib.MediaTable.border = {} end
+lib.MediaTable.border["None"]                                                          = [[]]
+lib.MediaTable.border["Blizzard Achievement Wood"]                     = [[Interface\AchievementFrame\UI-Achievement-WoodBorder]]
+lib.MediaTable.border["Blizzard Chat Bubble"]                          = [[Interface\Tooltips\ChatBubble-Backdrop]]
+lib.MediaTable.border["Blizzard Dialog"]                                       = [[Interface\DialogFrame\UI-DialogBox-Border]]
+lib.MediaTable.border["Blizzard Dialog Gold"]                          = [[Interface\DialogFrame\UI-DialogBox-Gold-Border]]
+lib.MediaTable.border["Blizzard Party"]                                                = [[Interface\CHARACTERFRAME\UI-Party-Border]]
+lib.MediaTable.border["Blizzard Tooltip"]                                      = [[Interface\Tooltips\UI-Tooltip-Border]]
+lib.DefaultMedia.border = "None"
+
+-- FONT
+if not lib.MediaTable.font then lib.MediaTable.font = {} end
+local SML_MT_font = lib.MediaTable.font
+--[[
+All font files are currently in all clients, the following table depicts which font supports which charset as of 5.0.4
+Fonts were checked using langcover.pl from DejaVu fonts (http://sourceforge.net/projects/dejavu/) and FontForge (http://fontforge.org/)
+latin means check for: de, en, es, fr, it, pt
+
+file                           name                                                    latin   koKR    ruRU    zhCN    zhTW
+2002.ttf                       2002                                                    X               X               X               -               -
+2002B.ttf                      2002 Bold                                               X               X               X               -               -
+ARHei.ttf                      AR CrystalzcuheiGBK Demibold    X               -               X               X               X
+ARIALN.TTF                     Arial Narrow                                    X               -               X               -               -
+ARKai_C.ttf                    AR ZhongkaiGBK Medium (Combat)  X               -               X               X               X
+ARKai_T.ttf                    AR ZhongkaiGBK Medium                   X               -               X               X               X
+bHEI00M.ttf                    AR Heiti2 Medium B5                             -               -               -               -               X
+bHEI01B.ttf                    AR Heiti2 Bold B5                               -               -               -               -               X
+bKAI00M.ttf                    AR Kaiti Medium B5                              -               -               -               -               X
+bLEI00D.ttf                    AR Leisu Demi B5                                -               -               -               -               X
+FRIZQT__.TTF           Friz Quadrata TT                                X               -               -               -               -
+FRIZQT___CYR.TTF       FrizQuadrataCTT                                 x               -               X               -               -
+K_Damage.TTF           YDIWingsM                                               -               X               X               -               -
+K_Pagetext.TTF         MoK                                                             X               X               X               -               -
+MORPHEUS.TTF           Morpheus                                                X               -               -               -               -
+MORPHEUS_CYR.TTF       Morpheus                                                X               -               X               -               -
+NIM_____.ttf           Nimrod MT                                               X               -               X               -               -
+SKURRI.TTF                     Skurri                                                  X               -               -               -               -
+SKURRI_CYR.TTF         Skurri                                                  X               -               X               -               -
+
+WARNING: Although FRIZQT___CYR is available on western clients, it doesn't support special European characters e.g. é, ï, ö
+Due to this, we cannot use it as a replacement for FRIZQT__.TTF
+]]
+
+if locale == "koKR" then
+       LOCALE_MASK = lib.LOCALE_BIT_koKR
+--
+       SML_MT_font["굵은 글꼴"]            = [[Fonts\2002B.TTF]]
+       SML_MT_font["기본 글꼴"]            = [[Fonts\2002.TTF]]
+       SML_MT_font["데미지 글꼴"]         = [[Fonts\K_Damage.TTF]]
+       SML_MT_font["퀘스트 글꼴"]         = [[Fonts\K_Pagetext.TTF]]
+--
+       lib.DefaultMedia["font"] = "기본 글꼴" -- someone from koKR please adjust if needed
+--
+elseif locale == "zhCN" then
+       LOCALE_MASK = lib.LOCALE_BIT_zhCN
+--
+       SML_MT_font["伤害数字"]             = [[Fonts\ARKai_C.ttf]]
+       SML_MT_font["默认"]                   = [[Fonts\ARKai_T.ttf]]
+       SML_MT_font["聊天"]                   = [[Fonts\ARHei.ttf]]
+--
+       lib.DefaultMedia["font"] = "默认" -- someone from zhCN please adjust if needed
+--
+elseif locale == "zhTW" then
+       LOCALE_MASK = lib.LOCALE_BIT_zhTW
+--
+       SML_MT_font["提示訊息"]             = [[Fonts\bHEI00M.ttf]]
+       SML_MT_font["聊天"]                   = [[Fonts\bHEI01B.ttf]]
+       SML_MT_font["傷害數字"]             = [[Fonts\bKAI00M.ttf]]
+       SML_MT_font["預設"]                   = [[Fonts\bLEI00D.ttf]]
+--
+       lib.DefaultMedia["font"] = "預設" -- someone from zhTW please adjust if needed
+
+elseif locale == "ruRU" then
+       LOCALE_MASK = lib.LOCALE_BIT_ruRU
+--
+       SML_MT_font["2002"]                                                             = [[Fonts\2002.TTF]]
+       SML_MT_font["2002 Bold"]                                                = [[Fonts\2002B.TTF]]
+       SML_MT_font["AR CrystalzcuheiGBK Demibold"]             = [[Fonts\ARHei.TTF]]
+       SML_MT_font["AR ZhongkaiGBK Medium (Combat)"]   = [[Fonts\ARKai_C.TTF]]
+       SML_MT_font["AR ZhongkaiGBK Medium"]                    = [[Fonts\ARKai_T.TTF]]
+       SML_MT_font["Arial Narrow"]                                             = [[Fonts\ARIALN.TTF]]
+       SML_MT_font["Friz Quadrata TT"]                                 = [[Fonts\FRIZQT___CYR.TTF]]
+       SML_MT_font["MoK"]                                                              = [[Fonts\K_Pagetext.TTF]]
+       SML_MT_font["Morpheus"]                                                 = [[Fonts\MORPHEUS_CYR.TTF]]
+       SML_MT_font["Nimrod MT"]                                                = [[Fonts\NIM_____.ttf]]
+       SML_MT_font["Skurri"]                                                   = [[Fonts\SKURRI_CYR.TTF]]
+--
+       lib.DefaultMedia.font = "Friz Quadrata TT"
+--
+else
+       LOCALE_MASK = lib.LOCALE_BIT_western
+       locale_is_western = true
+--
+       SML_MT_font["2002"]                                                             = [[Fonts\2002.TTF]]
+       SML_MT_font["2002 Bold"]                                                = [[Fonts\2002B.TTF]]
+       SML_MT_font["AR CrystalzcuheiGBK Demibold"]             = [[Fonts\ARHei.TTF]]
+       SML_MT_font["AR ZhongkaiGBK Medium (Combat)"]   = [[Fonts\ARKai_C.TTF]]
+       SML_MT_font["AR ZhongkaiGBK Medium"]                    = [[Fonts\ARKai_T.TTF]]
+       SML_MT_font["Arial Narrow"]                                             = [[Fonts\ARIALN.TTF]]
+       SML_MT_font["Friz Quadrata TT"]                                 = [[Fonts\FRIZQT__.TTF]]
+       SML_MT_font["MoK"]                                                              = [[Fonts\K_Pagetext.TTF]]
+       SML_MT_font["Morpheus"]                                                 = [[Fonts\MORPHEUS_CYR.TTF]]
+       SML_MT_font["Nimrod MT"]                                                = [[Fonts\NIM_____.ttf]]
+       SML_MT_font["Skurri"]                                                   = [[Fonts\SKURRI_CYR.TTF]]
+--
+       lib.DefaultMedia.font = "Friz Quadrata TT"
+--
+end
+
+-- STATUSBAR
+if not lib.MediaTable.statusbar then lib.MediaTable.statusbar = {} end
+lib.MediaTable.statusbar["Blizzard"]                                           = [[Interface\TargetingFrame\UI-StatusBar]]
+lib.MediaTable.statusbar["Blizzard Character Skills Bar"]      = [[Interface\PaperDollInfoFrame\UI-Character-Skills-Bar]]
+lib.MediaTable.statusbar["Blizzard Raid Bar"]                          = [[Interface\RaidFrame\Raid-Bar-Hp-Fill]]
+lib.DefaultMedia.statusbar = "Blizzard"
+
+-- SOUND
+if not lib.MediaTable.sound then lib.MediaTable.sound = {} end
+lib.MediaTable.sound["None"]                                                           = [[Interface\Quiet.ogg]]       -- Relies on the fact that PlaySound[File] doesn't error on non-existing input.
+lib.DefaultMedia.sound = "None"
+
+local function rebuildMediaList(mediatype)
+       local mtable = mediaTable[mediatype]
+       if not mtable then return end
+       if not mediaList[mediatype] then mediaList[mediatype] = {} end
+       local mlist = mediaList[mediatype]
+       -- list can only get larger, so simply overwrite it
+       local i = 0
+       for k in pairs(mtable) do
+               i = i + 1
+               mlist[i] = k
+       end
+       table_sort(mlist)
+end
+
+function lib:Register(mediatype, key, data, langmask)
+       if type(mediatype) ~= "string" then
+               error(MAJOR..":Register(mediatype, key, data, langmask) - mediatype must be string, got "..type(mediatype))
+       end
+       if type(key) ~= "string" then
+               error(MAJOR..":Register(mediatype, key, data, langmask) - key must be string, got "..type(key))
+       end
+       mediatype = mediatype:lower()
+       if mediatype == lib.MediaType.FONT and ((langmask and band(langmask, LOCALE_MASK) == 0) or not (langmask or locale_is_western)) then return false end
+       if mediatype == lib.MediaType.SOUND and type(data) == "string" then
+               local path = data:lower()
+               -- Only ogg and mp3 are valid sounds.
+               if not path:find(".ogg", nil, true) and not path:find(".mp3", nil, true) then
+                       return false
+               end
+       end
+       if not mediaTable[mediatype] then mediaTable[mediatype] = {} end
+       local mtable = mediaTable[mediatype]
+       if mtable[key] then return false end
+       
+       mtable[key] = data
+       rebuildMediaList(mediatype)
+       self.callbacks:Fire("LibSharedMedia_Registered", mediatype, key)
+       return true
+end
+
+function lib:Fetch(mediatype, key, noDefault)
+       local mtt = mediaTable[mediatype]
+       local overridekey = overrideMedia[mediatype]
+       local result = mtt and ((overridekey and mtt[overridekey] or mtt[key]) or (not noDefault and defaultMedia[mediatype] and mtt[defaultMedia[mediatype]])) or nil
+       return result ~= "" and result or nil
+end
+
+function lib:IsValid(mediatype, key)
+       return mediaTable[mediatype] and (not key or mediaTable[mediatype][key]) and true or false
+end
+
+function lib:HashTable(mediatype)
+       return mediaTable[mediatype]
+end
+
+function lib:List(mediatype)
+       if not mediaTable[mediatype] then
+               return nil
+       end
+       if not mediaList[mediatype] then
+               rebuildMediaList(mediatype)
+       end
+       return mediaList[mediatype]
+end
+
+function lib:GetGlobal(mediatype)
+       return overrideMedia[mediatype]
+end
+
+function lib:SetGlobal(mediatype, key)
+       if not mediaTable[mediatype] then
+               return false
+       end
+       overrideMedia[mediatype] = (key and mediaTable[mediatype][key]) and key or nil
+       self.callbacks:Fire("LibSharedMedia_SetGlobal", mediatype, overrideMedia[mediatype])
+       return true
+end
+
+function lib:GetDefault(mediatype)
+       return defaultMedia[mediatype]
+end
+
+function lib:SetDefault(mediatype, key)
+       if mediaTable[mediatype] and mediaTable[mediatype][key] and not defaultMedia[mediatype] then
+               defaultMedia[mediatype] = key
+               return true
+       else
+               return false
+       end
+end
diff --git a/RaidFrameCustomizationConfig/libs/LibSharedMedia-3.0/lib.xml b/RaidFrameCustomizationConfig/libs/LibSharedMedia-3.0/lib.xml
new file mode 100644 (file)
index 0000000..7f2fd53
--- /dev/null
@@ -0,0 +1,4 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
+..\FrameXML\UI.xsd">
+       <Script file="LibSharedMedia-3.0.lua" />
+</Ui>
diff --git a/RaidFrameCustomizationConfig/libs/LibStub/LibStub.lua b/RaidFrameCustomizationConfig/libs/LibStub/LibStub.lua
new file mode 100644 (file)
index 0000000..7e9b5cd
--- /dev/null
@@ -0,0 +1,51 @@
+-- $Id: LibStub.lua 103 2014-10-16 03:02:50Z mikk $
+-- LibStub is a simple versioning stub meant for use in Libraries.  http://www.wowace.com/addons/libstub/ for more info
+-- LibStub is hereby placed in the Public Domain
+-- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
+local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2  -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
+local LibStub = _G[LIBSTUB_MAJOR]
+
+-- Check to see is this version of the stub is obsolete
+if not LibStub or LibStub.minor < LIBSTUB_MINOR then
+       LibStub = LibStub or {libs = {}, minors = {} }
+       _G[LIBSTUB_MAJOR] = LibStub
+       LibStub.minor = LIBSTUB_MINOR
+       
+       -- LibStub:NewLibrary(major, minor)
+       -- major (string) - the major version of the library
+       -- minor (string or number ) - the minor version of the library
+       -- 
+       -- returns nil if a newer or same version of the lib is already present
+       -- returns empty library object or old library object if upgrade is needed
+       function LibStub:NewLibrary(major, minor)
+               assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
+               minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
+               
+               local oldminor = self.minors[major]
+               if oldminor and oldminor >= minor then return nil end
+               self.minors[major], self.libs[major] = minor, self.libs[major] or {}
+               return self.libs[major], oldminor
+       end
+       
+       -- LibStub:GetLibrary(major, [silent])
+       -- major (string) - the major version of the library
+       -- silent (boolean) - if true, library is optional, silently return nil if its not found
+       --
+       -- throws an error if the library can not be found (except silent is set)
+       -- returns the library object if found
+       function LibStub:GetLibrary(major, silent)
+               if not self.libs[major] and not silent then
+                       error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
+               end
+               return self.libs[major], self.minors[major]
+       end
+       
+       -- LibStub:IterateLibraries()
+       -- 
+       -- Returns an iterator for the currently registered libraries
+       function LibStub:IterateLibraries() 
+               return pairs(self.libs) 
+       end
+       
+       setmetatable(LibStub, { __call = LibStub.GetLibrary })
+end
diff --git a/RaidFrameCustomizationConfig/libs/LibStub/LibStub.toc b/RaidFrameCustomizationConfig/libs/LibStub/LibStub.toc
new file mode 100644 (file)
index 0000000..23e7bae
--- /dev/null
@@ -0,0 +1,13 @@
+## Interface: 70000
+## Title: Lib: LibStub
+## Notes: Universal Library Stub
+## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel
+## X-Website: http://www.wowace.com/addons/libstub/
+## X-Category: Library
+## X-License: Public Domain
+## X-Curse-Packaged-Version: 1.0.2-70000
+## X-Curse-Project-Name: LibStub
+## X-Curse-Project-ID: libstub
+## X-Curse-Repository-ID: wow/libstub/mainline
+
+LibStub.lua