WoWInterface SVN EasyDaily

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /tags
    from Rev 1 to Rev 76
    Reverse comparison

Rev 1 → Rev 76

EasyDaily-Beta/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.xml New file
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="AceConfigCmd-3.0.lua"/>
</Ui>
\ No newline at end of file
EasyDaily-Beta/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua New file
0,0 → 1,729
 
--[[
AceConfigCmd-3.0
 
Handles commandline optionstable access
 
REQUIRES: AceConsole-3.0 for command registration (loaded on demand)
 
]]
 
-- TODO: handle disabled / hidden
-- TODO: implement handlers for all types
-- TODO: plugin args
 
 
local MAJOR, MINOR = "AceConfigCmd-3.0", 6
local lib = LibStub:NewLibrary(MAJOR, MINOR)
 
if not lib then return end
 
lib.commands = lib.commands or {}
local commands = lib.commands
 
local cfgreg = LibStub("AceConfigRegistry-3.0")
local AceConsole -- LoD
local AceConsoleName = "AceConsole-3.0"
 
 
local L = setmetatable({}, { -- TODO: replace with proper locale
__index = function(self,k) return k end
})
 
 
 
local function print(msg)
(SELECTED_CHAT_FRAME or DEFAULT_CHAT_FRAME):AddMessage(msg)
end
 
 
-- pickfirstset() - picks the first non-nil value and returns it
 
local function pickfirstset(...)
for i=1,select("#",...) do
if select(i,...)~=nil then
return select(i,...)
end
end
end
 
 
-- err() - produce real error() regarding malformed options tables etc
 
local function err(info,inputpos,msg )
local cmdstr=" "..strsub(info.input, 1, inputpos-1)
error(MAJOR..": /" ..info[0] ..cmdstr ..": "..(msg or "malformed options table"), 2)
end
 
 
-- usererr() - produce chatframe message regarding bad slash syntax etc
 
local function usererr(info,inputpos,msg )
local cmdstr=strsub(info.input, 1, inputpos-1);
print("/" ..info[0] .. " "..cmdstr ..": "..(msg or "malformed options table"))
end
 
 
-- callmethod() - call a given named method (e.g. "get", "set") with given arguments
 
local function callmethod(info, inputpos, tab, methodtype, ...)
local method = info[methodtype]
if not method then
err(info, inputpos, "'"..methodtype.."': not set")
end
 
info.arg = tab.arg
info.option = tab
info.type = tab.type
 
if type(method)=="function" then
return method(info, ...)
elseif type(method)=="string" then
if type(info.handler[method])~="function" then
err(info, inputpos, "'"..methodtype.."': '"..method.."' is not a member function of "..tostring(info.handler))
end
return info.handler[method](info.handler, info, ...)
else
assert(false) -- type should have already been checked on read
end
end
 
-- callfunction() - call a given named function (e.g. "name", "desc") with given arguments
 
local function callfunction(info, tab, methodtype, ...)
local method = tab[methodtype]
 
info.arg = tab.arg
info.option = tab
info.type = tab.type
 
if type(method)=="function" then
return method(info, ...)
else
assert(false) -- type should have already been checked on read
end
end
 
-- do_final() - do the final step (set/execute) along with validation and confirmation
 
local function do_final(info, inputpos, tab, methodtype, ...)
if info.validate then
local res = callmethod(info,inputpos,tab,"validate",...)
if type(res)=="string" then
usererr(info, inputpos, "'"..strsub(info.input, inputpos).."' - "..res)
return
end
end
-- console ignores .confirm
 
callmethod(info,inputpos,tab,methodtype, ...)
end
 
 
-- getparam() - used by handle() to retreive and store "handler", "get", "set", etc
 
local function getparam(info, inputpos, tab, depth, paramname, types, errormsg)
local old,oldat = info[paramname], info[paramname.."_at"]
local val=tab[paramname]
if val~=nil then
if val==false then
val=nil
elseif not types[type(val)] then
err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
end
info[paramname] = val
info[paramname.."_at"] = depth
end
return old,oldat
end
 
 
-- iterateargs(tab) - custom iterator that iterates both t.args and t.plugins.*
local dummytable={}
 
local function iterateargs(tab)
if not tab.plugins then
return pairs(tab.args)
end
 
local argtabkey,argtab=next(tab.plugins)
local v
 
return function(_, k)
while argtab do
k,v = next(argtab, k)
if k then return k,v end
if argtab==tab.args then
argtab=nil
else
argtabkey,argtab = next(tab.plugins, argtabkey)
if not argtabkey then
argtab=tab.args
end
end
end
end
end
 
local function showhelp(info, inputpos, tab, noHead)
if not noHead then
print("|cff33ff99"..info.appName.."|r: Arguments to |cffffff78/"..info[0].."|r "..strsub(info.input,1,inputpos-1)..":")
end
 
local sortTbl = {} -- [1..n]=name
local refTbl = {} -- [name]=tableref
 
for k,v in iterateargs(tab) do
if not refTbl[k] then -- a plugin overriding something in .args
table.insert(sortTbl, k)
refTbl[k] = v
end
end
 
table.sort(sortTbl, function(one, two)
local o1 = refTbl[one].order or 100
local o2 = refTbl[two].order or 100
if type(o1) == "function" or type(o1) == "string" then
info.order = o1
info[#info+1] = one
o1 = callmethod(info, inputpos, refTbl[one], "order")
info[#info] = nil
info.order = nil
end
if type(o2) == "function" or type(o1) == "string" then
info.order = o2
info[#info+1] = two
o2 = callmethod(info, inputpos, refTbl[two], "order")
info[#info] = nil
info.order = nil
end
if o1<0 and o2<0 then return o1<o2 end
if o2<0 then return true end
if o1<0 then return false end
if o1==o2 then return tostring(one)<tostring(two) end -- compare names
return o1<o2
end)
 
for _,k in ipairs(sortTbl) do
local v = refTbl[k]
if not pickfirstset(v.cmdHidden, v.hidden, false) then
-- recursively show all inline groups
local name, desc = v.name, v.desc
if type(name) == "function" then
name = callfunction(info, v, 'name')
end
if type(desc) == "function" then
desc = callfunction(info, v, 'desc')
end
if v.type == "group" and pickfirstset(v.cmdInline, v.inline, false) then
print(" "..(desc or name)..":")
showhelp(info, inputpos, v, true)
else
print(" |cffffff78"..k.."|r - "..(desc or name or ""))
end
end
end
end
 
 
local function keybindingValidateFunc(text)
if text == nil or text == "NONE" then
return nil
end
text = text:upper()
local shift, ctrl, alt
local modifier
while true do
if text == "-" then
break
end
modifier, text = strsplit('-', text, 2)
if text then
if modifier ~= "SHIFT" and modifier ~= "CTRL" and modifier ~= "ALT" then
return false
end
if modifier == "SHIFT" then
if shift then
return false
end
shift = true
end
if modifier == "CTRL" then
if ctrl then
return false
end
ctrl = true
end
if modifier == "ALT" then
if alt then
return false
end
alt = true
end
else
text = modifier
break
end
end
if text == "" then
return false
end
if not text:find("^F%d+$") and text ~= "CAPSLOCK" and text:len() ~= 1 and (text:byte() < 128 or text:len() > 4) and not _G["KEY_" .. text] then
return false
end
local s = text
if shift then
s = "SHIFT-" .. s
end
if ctrl then
s = "CTRL-" .. s
end
if alt then
s = "ALT-" .. s
end
return s
end
 
-- constants used by getparam() calls below
 
local handlertypes = {["table"]=true}
local handlermsg = "expected a table"
 
local functypes = {["function"]=true, ["string"]=true}
local funcmsg = "expected function or member name"
 
-- handle() - selfrecursing function that processes input->optiontable
-- - depth - starts at 0
-- - retfalse - return false rather than produce error if a match is not found (used by inlined groups)
 
local function handle(info, inputpos, tab, depth, retfalse)
 
if not(type(tab)=="table" and type(tab.type)=="string") then err(info,inputpos) end
 
-------------------------------------------------------------------
-- Grab hold of handler,set,get,func,etc if set (and remember old ones)
-- Note that we do NOT validate if method names are correct at this stage,
-- the handler may change before they're actually used!
 
local oldhandler,oldhandler_at = getparam(info,inputpos,tab,depth,"handler",handlertypes,handlermsg)
local oldset,oldset_at = getparam(info,inputpos,tab,depth,"set",functypes,funcmsg)
local oldget,oldget_at = getparam(info,inputpos,tab,depth,"get",functypes,funcmsg)
local oldfunc,oldfunc_at = getparam(info,inputpos,tab,depth,"func",functypes,funcmsg)
local oldvalidate,oldvalidate_at = getparam(info,inputpos,tab,depth,"validate",functypes,funcmsg)
--local oldconfirm,oldconfirm_at = getparam(info,inputpos,tab,depth,"confirm",functypes,funcmsg)
 
-------------------------------------------------------------------
-- Act according to .type of this table
 
if tab.type=="group" then
------------ group --------------------------------------------
 
if type(tab.args)~="table" then err(info, inputpos) end
if tab.plugins and type(tab.plugins)~="table" then err(info,inputpos) end
 
-- grab next arg from input
local _,nextpos,arg = string.find(info.input, " *([^ ]+) *", inputpos)
if not arg then
showhelp(info, inputpos, tab)
return
end
nextpos=nextpos+1
 
-- loop .args and try to find a key with a matching name
for k,v in iterateargs(tab) do
if not(type(k)=="string" and type(v)=="table" and type(v.type)=="string") then err(info,inputpos, "options table child '"..tostring(k).."' is malformed") end
 
-- is this child an inline group? if so, traverse into it
if v.type=="group" and pickfirstset(v.cmdInline, v.inline, false) then
info[depth+1] = k
if handle(info, inputpos, v, depth+1, true)==false then
info[depth+1] = nil
-- wasn't found in there, but that's ok, we just keep looking down here
else
return -- done, name was found in inline group
end
-- matching name and not a inline group
elseif strlower(arg)==strlower(k) then
info[depth+1] = k
return handle(info,nextpos,v,depth+1)
end
end
 
-- no match
if retfalse then
-- restore old infotable members and return false to indicate failure
info.handler,info.handler_at = oldhandler,oldhandler_at
info.set,info.set_at = oldset,oldset_at
info.get,info.get_at = oldget,oldget_at
info.func,info.func_at = oldfunc,oldfunc_at
info.validate,info.validate_at = oldvalidate,oldvalidate_at
--info.confirm,info.confirm_at = oldconfirm,oldconfirm_at
return false
end
 
-- couldn't find the command, display error
usererr(info, inputpos, "'"..arg.."' - " .. L["unknown argument"])
return
end
 
local str = strsub(info.input,inputpos);
 
if tab.type=="execute" then
------------ execute --------------------------------------------
do_final(info, inputpos, tab, "func")
 
 
 
elseif tab.type=="input" then
------------ input --------------------------------------------
 
local res = true
if tab.pattern then
if not(type(tab.pattern)=="string") then err(info, inputpos, "'pattern' - expected a string") end
if not strmatch(str, tab.pattern) then
usererr(info, inputpos, "'"..str.."' - " .. L["invalid input"])
return
end
end
 
do_final(info, inputpos, tab, "set", str)
 
 
 
elseif tab.type=="toggle" then
------------ toggle --------------------------------------------
local b
local str = strtrim(strlower(str))
if str=="" then
b = callmethod(info, inputpos, tab, "get")
 
if tab.tristate then
--cycle in true, nil, false order
if b then
b = nil
elseif b == nil then
b = false
else
b = true
end
else
b = not b
end
 
elseif str==L["on"] then
b = true
elseif str==L["off"] then
b = false
elseif tab.tristate and str==L["default"] then
b = nil
else
if tab.tristate then
usererr(info, inputpos, format(L["'%s' - expected 'on', 'off' or 'default', or no argument to toggle."], str))
else
usererr(info, inputpos, format(L["'%s' - expected 'on' or 'off', or no argument to toggle."], str))
end
return
end
 
do_final(info, inputpos, tab, "set", b)
 
 
elseif tab.type=="range" then
------------ range --------------------------------------------
local val = tonumber(str)
if not val then
usererr(info, inputpos, "'"..str.."' - "..L["expected number"])
return
end
if type(info.step)=="number" then
val = val- (val % info.step)
end
if type(info.min)=="number" and val<info.min then
usererr(info, inputpos, val.." - "..format(L["must be equal to or higher than %s"], tostring(info.min)) )
return
end
if type(info.max)=="number" and val>info.max then
usererr(info, inputpos, val.." - "..format(L["must be equal to or lower than %s"], tostring(info.max)) )
return
end
 
do_final(info, inputpos, tab, "set", val)
 
 
elseif tab.type=="select" then
------------ select ------------------------------------
local str = strtrim(strlower(str))
if str == "" then
--TODO: Show current selection and possible values
return
end
 
local values = tab.values
if type(values) == "function" or type(values) == "string" then
info.values = values
values = callmethod(info, inputpos, tab, "values")
info.values = nil
end
 
local ok
for k,v in pairs(values) do
if strlower(k)==str then
str = k -- overwrite with key (in case of case mismatches)
ok = true
break
end
end
if not ok then
usererr(info, inputpos, "'"..str.."' - "..L["unknown selection"])
return
end
 
do_final(info, inputpos, tab, "set", str)
 
elseif tab.type=="multiselect" then
------------ multiselect -------------------------------------------
local str = strtrim(strlower(str))
if str == "" then
--TODO: Show current values
return
end
 
local values = tab.values
if type(values) == "function" or type(values) == "string" then
info.values = values
values = callmethod(info, inputpos, tab, "values")
info.values = nil
end
 
--build a table of the selections, checking that they exist
--parse for =on =off =default in the process
--table will be key = true for options that should toggle, key = [on|off|default] for options to be set
local sels = {}
for v in string.gmatch(str, "[^ ]+") do
--parse option=on etc
local opt, val = string.match(v,'(.+)=(.+)')
--get option if toggling
if not opt then
opt = v
end
 
--check that the opt is valid
local ok
for k,v in pairs(values) do
if strlower(k)==opt then
opt = k -- overwrite with key (in case of case mismatches)
ok = true
break
end
end
 
if not ok then
usererr(info, inputpos, "'"..opt.."' - "..L["unknown selection"])
return
end
 
--check that if val was supplied it is valid
if val then
if val == L["on"] or val == L["off"] or (tab.tristate and val == L["default"]) then
--val is valid insert it
sels[opt] = val
else
if tab.tristate then
usererr(info, inputpos, format(L["'%s' '%s' - expected 'on', 'off' or 'default', or no argument to toggle."], v, val))
else
usererr(info, inputpos, format(L["'%s' '%s' - expected 'on' or 'off', or no argument to toggle."], v, val))
end
return
end
else
-- no val supplied, toggle
sels[opt] = true
end
end
 
for opt, val in pairs(sels) do
local newval
 
if (val == true) then
--toggle the option
local b = callmethod(info, inputpos, tab, "get", opt)
 
if tab.tristate then
--cycle in true, nil, false order
if b then
b = nil
elseif b == nil then
b = false
else
b = true
end
else
b = not b
end
newval = b
else
--set the option as specified
if val==L["on"] then
newval = true
elseif val==L["off"] then
newval = false
elseif val==L["default"] then
newval = nil
end
end
 
do_final(info, inputpos, tab, "set", opt, newval)
end
 
 
elseif tab.type=="color" then
------------ color --------------------------------------------
local str = strtrim(strlower(str))
if str == "" then
--TODO: Show current value
return
end
 
local r, g, b, a
 
if tab.hasAlpha then
if str:len() == 8 and str:find("^%x*$") then
--parse a hex string
r,g,b,a = tonumber(str:sub(1, 2), 16) / 255, tonumber(str:sub(3, 4), 16) / 255, tonumber(str:sub(5, 6), 16) / 255, tonumber(str:sub(7, 8), 16) / 255
else
--parse seperate values
r,g,b,a = str:match("^([%d%.]+) ([%d%.]+) ([%d%.]+) ([%d%.]+)$")
r,g,b,a = tonumber(r), tonumber(g), tonumber(b), tonumber(a)
end
if not (r and g and b and a) then
usererr(info, inputpos, format(L["'%s' - expected 'RRGGBBAA' or 'r g b a'."], str))
return
end
 
if r >= 0.0 and r <= 1.0 and g >= 0.0 and g <= 1.0 and b >= 0.0 and b <= 1.0 and a >= 0.0 and a <= 1.0 then
--values are valid
elseif r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 and a >= 0 and a <= 255 then
--values are valid 0..255, convert to 0..1
r = r / 255
g = g / 255
b = b / 255
a = a / 255
else
--values are invalid
usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0..1 or 0..255."], str))
end
else
a = 1.0
if str:len() == 6 and str:find("^%x*$") then
--parse a hex string
r,g,b = tonumber(str:sub(1, 2), 16) / 255, tonumber(str:sub(3, 4), 16) / 255, tonumber(str:sub(5, 6), 16) / 255
else
--parse seperate values
r,g,b = str:match("^([%d%.]+) ([%d%.]+) ([%d%.]+)$")
r,g,b = tonumber(r), tonumber(g), tonumber(b)
end
if not (r and g and b) then
usererr(info, inputpos, format(L["'%s' - expected 'RRGGBB' or 'r g b'."], str))
return
end
if r >= 0.0 and r <= 1.0 and g >= 0.0 and g <= 1.0 and b >= 0.0 and b <= 1.0 then
--values are valid
elseif r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 then
--values are valid 0..255, convert to 0..1
r = r / 255
g = g / 255
b = b / 255
else
--values are invalid
usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0-1 or 0-255."], str))
end
end
 
do_final(info, inputpos, tab, "set", r,g,b,a)
 
elseif tab.type=="keybinding" then
------------ keybinding --------------------------------------------
local str = strtrim(strlower(str))
if str == "" then
--TODO: Show current value
return
end
local value = keybindingValidateFunc(str:upper())
if value == false then
usererr(info, inputpos, format(L["'%s' - Invalid Keybinding."], str))
return
end
 
do_final(info, inputpos, tab, "set", value)
 
elseif tab.type=="description" then
------------ description --------------------
-- ignore description, GUI config only
else
err(info, inputpos, "unknown options table item type '"..tostring(tab.type).."'")
end
end
 
 
-----------------------------------------------------------------------
-- HandleCommand(slashcmd, appName, input)
--
-- Call this from a chat command handler to parse the command input as operations on an aceoptions table
--
-- slashcmd (string) - the slash command WITHOUT leading slash (only used for error output)
-- appName (string) - the application name as given to AceConfigRegistry:RegisterOptionsTable()
-- input (string) -- the commandline input (as given by the WoW handler, i.e. without the command itself)
 
function lib:HandleCommand(slashcmd, appName, input)
 
local optgetter = cfgreg:GetOptionsTable(appName)
if not optgetter then
error([[Usage: HandleCommand("slashcmd", "appName", "input"): 'appName' - no options table "]]..tostring(appName)..[[" has been registered]], 2)
end
local options = assert( optgetter("cmd", MAJOR) )
 
local info = { -- Don't try to recycle this, it gets handed off to callbacks and whatnot
[0] = slashcmd,
appName = appName,
options = options,
input = input,
self = self,
handler = self,
uiType = "cmd",
uiName = MAJOR,
}
 
handle(info, 1, options, 0) -- (info, inputpos, table, depth)
end
 
 
 
-----------------------------------------------------------------------
-- CreateChatCommand(slashcmd, appName)
--
-- Utility function to create a slash command handler.
-- Also registers tab completion with AceTab
--
-- slashcmd (string) - the slash command WITHOUT leading slash (only used for error output)
-- appName (string) - the application name as given to AceConfigRegistry:RegisterOptionsTable()
 
function lib:CreateChatCommand(slashcmd, appName)
if not AceConsole then
AceConsole = LibStub(AceConsoleName)
end
if AceConsole.RegisterChatCommand(self, slashcmd, function(input)
lib.HandleCommand(self, slashcmd, appName, input) -- upgradable
end,
true) then -- succesfully registered so lets get the command -> app table in
commands[slashcmd] = appName
end
end
 
-- GetChatCommandOptions(slashcmd)
--
-- Utility function that returns the options table that belongs to a slashcommand
-- mainly used by AceTab
 
function lib:GetChatCommandOptions(slashcmd)
return commands[slashcmd]
end
EasyDaily-Beta/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.xml New file
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="AceConfigRegistry-3.0.lua"/>
</Ui>
\ No newline at end of file
EasyDaily-Beta/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua New file
0,0 → 1,352
--[[
AceConfigRegistry-3.0:
 
Handle central registration of options tables in use by addons and modules. Do nothing else.
 
Options tables can be registered as raw tables, or as function refs that return a table.
These functions receive two arguments: "uiType" and "uiName".
- Valid "uiTypes": "cmd", "dropdown", "dialog". This is verified by the library at call time.
- The "uiName" field is expected to contain the full name of the calling addon, including version, e.g. "FooBar-1.0". This is verified by the library at call time.
 
:IterateOptionsTables() and :GetOptionsTable() always return a function reference that the requesting config handling addon must call with the above arguments.
]]
 
local MAJOR, MINOR = "AceConfigRegistry-3.0", 6
local lib = LibStub:NewLibrary(MAJOR, MINOR)
 
if not lib then return end
 
lib.tables = lib.tables or {}
 
local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
 
if not lib.callbacks then
lib.callbacks = CallbackHandler:New(lib)
end
 
-----------------------------------------------------------------------
-- Validating options table consistency:
 
 
lib.validated = {
-- list of options table names ran through :ValidateOptionsTable automatically.
-- CLEARED ON PURPOSE, since newer versions may have newer validators
cmd = {},
dropdown = {},
dialog = {},
}
 
 
 
local function err(msg, errlvl, ...)
local t = {}
for i=select("#",...),1,-1 do
tinsert(t, (select(i, ...)))
end
error(MAJOR..":ValidateOptionsTable(): "..table.concat(t,".")..msg, errlvl+2)
end
 
 
local isstring={["string"]=true, _="string"}
local isstringfunc={["string"]=true,["function"]=true, _="string or funcref"}
local istable={["table"]=true, _="table"}
local ismethodtable={["table"]=true,["string"]=true,["function"]=true, _="methodname, funcref or table"}
local optstring={["nil"]=true,["string"]=true, _="string"}
local optstringfunc={["nil"]=true,["string"]=true,["function"]=true, _="string or funcref"}
local optnumber={["nil"]=true,["number"]=true, _="number"}
local optmethod={["nil"]=true,["string"]=true,["function"]=true, _="methodname or funcref"}
local optmethodfalse={["nil"]=true,["string"]=true,["function"]=true,["boolean"]={[false]=true}, _="methodname, funcref or false"}
local optmethodnumber={["nil"]=true,["string"]=true,["function"]=true,["number"]=true, _="methodname, funcref or number"}
local optmethodtable={["nil"]=true,["string"]=true,["function"]=true,["table"]=true, _="methodname, funcref or table"}
local optmethodbool={["nil"]=true,["string"]=true,["function"]=true,["boolean"]=true, _="methodname, funcref or boolean"}
local opttable={["nil"]=true,["table"]=true, _="table"}
local optbool={["nil"]=true,["boolean"]=true, _="boolean"}
local optboolnumber={["nil"]=true,["boolean"]=true,["number"]=true, _="boolean or number"}
 
local basekeys={
type=isstring,
name=isstringfunc,
desc=optstringfunc,
order=optmethodnumber,
validate=optmethodfalse,
confirm=optmethodbool,
confirmText=optstring,
disabled=optmethodbool,
hidden=optmethodbool,
guiHidden=optmethodbool,
dialogHidden=optmethodbool,
dropdownHidden=optmethodbool,
cmdHidden=optmethodbool,
icon=optstringfunc,
iconCoords=optmethodtable,
handler=opttable,
get=optmethodfalse,
set=optmethodfalse,
func=optmethodfalse,
arg={["*"]=true},
width=optstring,
}
 
local typedkeys={
header={},
description={
image=optstringfunc,
imageCoords=optmethodtable,
imageHeight=optnumber,
imageWidth=optnumber,
},
group={
args=istable,
plugins=opttable,
inline=optbool,
cmdInline=optbool,
guiInline=optbool,
dropdownInline=optbool,
dialogInline=optbool,
childGroups=optstring,
},
execute={
-- func={
-- ["function"]=true,
-- ["string"]=true,
-- _="methodname or funcref"
-- },
},
input={
pattern=optstring,
usage=optstring,
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
multiline=optboolnumber,
},
toggle={
tristate=optbool,
},
tristate={
},
range={
min=optnumber,
max=optnumber,
step=optnumber,
bigStep=optnumber,
isPercent=optbool,
},
select={
values=ismethodtable,
style={
["nil"]=true,
["string"]={dropdown=true,radio=true},
_="string: 'dropdown' or 'radio'"
},
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
},
multiselect={
values=ismethodtable,
style=optstring,
tristate=optbool,
control=optstring,
dialogControl=optstring,
dropdownControl=optstring,
},
color={
hasAlpha=optbool,
},
keybinding={
-- TODO
},
}
 
local function validateKey(k,errlvl,...)
errlvl=(errlvl or 0)+1
if type(k)~="string" then
err("["..tostring(k).."] - key is not a string", errlvl,...)
end
if strfind(k, "[%c \127]") then
err("["..tostring(k).."] - key name contained spaces (or control characters)", errlvl,...)
end
end
 
local function validateVal(v, oktypes, errlvl,...)
errlvl=(errlvl or 0)+1
local isok=oktypes[type(v)] or oktypes["*"]
 
if not isok then
err(": expected a "..oktypes._..", got '"..tostring(v).."'", errlvl,...)
end
if type(isok)=="table" then -- isok was a table containing specific values to be tested for!
if not isok[v] then
err(": did not expect "..type(v).." value '"..tostring(v).."'", errlvl,...)
end
end
end
 
local function validate(options,errlvl,...)
errlvl=(errlvl or 0)+1
-- basic consistency
if type(options)~="table" then
err(": expected a table, got a "..type(options), errlvl,...)
end
if type(options.type)~="string" then
err(".type: expected a string, got a "..type(options.type), errlvl,...)
end
 
-- get type and 'typedkeys' member
local tk = typedkeys[options.type]
if not tk then
err(".type: unknown type '"..options.type.."'", errlvl,...)
end
 
-- make sure that all options[] are known parameters
for k,v in pairs(options) do
if not (tk[k] or basekeys[k]) then
err(": unknown parameter", errlvl,tostring(k),...)
end
end
 
-- verify that required params are there, and that everything is the right type
for k,oktypes in pairs(basekeys) do
validateVal(options[k], oktypes, errlvl,k,...)
end
for k,oktypes in pairs(tk) do
validateVal(options[k], oktypes, errlvl,k,...)
end
 
-- extra logic for groups
if options.type=="group" then
for k,v in pairs(options.args) do
validateKey(k,errlvl,"args",...)
validate(v, errlvl,k,"args",...)
end
if options.plugins then
for plugname,plugin in pairs(options.plugins) do
if type(plugin)~="table" then
err(": expected a table, got '"..tostring(plugin).."'", errlvl,tostring(plugname),"plugins",...)
end
for k,v in pairs(plugin) do
validateKey(k,errlvl,tostring(plugname),"plugins",...)
validate(v, errlvl,k,tostring(plugname),"plugins",...)
end
end
end
end
end
 
---------------------------------------------------------------------
-- :ValidateOptionsTable(options,name,errlvl)
-- - options - the table
-- - name - (string) name of table, used in error reports
-- - errlvl - (optional number) error level offset, default 0
--
-- Validates basic structure and integrity of an options table
-- Does NOT verify that get/set etc actually exist, since they can be defined at any depth
 
function lib:ValidateOptionsTable(options,name,errlvl)
errlvl=(errlvl or 0)+1
name = name or "Optionstable"
if not options.name then
options.name=name -- bit of a hack, the root level doesn't really need a .name :-/
end
validate(options,errlvl,name)
end
 
------------------------------
-- :NotifyChange(appName)
-- - appName - string identifying the addon
--
-- Fires a ConfigTableChange callback for those listening in on it, allowing config GUIs to refresh
------------------------------
 
function lib:NotifyChange(appName)
if not lib.tables[appName] then return end
lib.callbacks:Fire("ConfigTableChange", appName)
end
 
---------------------------------------------------------------------
-- Registering and retreiving options tables:
 
 
-- validateGetterArgs: helper function for :GetOptionsTable (or, rather, the getter functions returned by it)
 
local function validateGetterArgs(uiType, uiName, errlvl)
errlvl=(errlvl or 0)+2
if uiType~="cmd" and uiType~="dropdown" and uiType~="dialog" then
error(MAJOR..": Requesting options table: 'uiType' - invalid configuration UI type, expected 'cmd', 'dropdown' or 'dialog'", errlvl)
end
if not strmatch(uiName, "[A-Za-z]%-[0-9]") then -- Expecting e.g. "MyLib-1.2"
error(MAJOR..": Requesting options table: 'uiName' - badly formatted or missing version number. Expected e.g. 'MyLib-1.2'", errlvl)
end
end
 
 
---------------------------------------------------------------------
-- :RegisterOptionsTable(appName, options)
-- - appName - string identifying the addon
-- - options - table or function reference
 
function lib:RegisterOptionsTable(appName, options)
if type(options)=="table" then
if options.type~="group" then -- quick sanity checker
error(MAJOR..": RegisterOptionsTable(appName, options): 'options' - missing type='group' member in root group", 2)
end
lib.tables[appName] = function(uiType, uiName, errlvl)
errlvl=(errlvl or 0)+1
validateGetterArgs(uiType, uiName, errlvl)
if not lib.validated[uiType][appName] then
lib:ValidateOptionsTable(options, appName, errlvl) -- upgradable
lib.validated[uiType][appName] = true
end
return options
end
elseif type(options)=="function" then
lib.tables[appName] = function(uiType, uiName, errlvl)
errlvl=(errlvl or 0)+1
validateGetterArgs(uiType, uiName, errlvl)
local tab = assert(options(uiType, uiName))
if not lib.validated[uiType][appName] then
lib:ValidateOptionsTable(tab, appName, errlvl) -- upgradable
lib.validated[uiType][appName] = true
end
return tab
end
else
error(MAJOR..": RegisterOptionsTable(appName, options): 'options' - expected table or function reference", 2)
end
end
 
 
---------------------------------------------------------------------
-- :IterateOptionsTables()
--
-- Returns an iterator of ["appName"]=funcref pairs
 
function lib:IterateOptionsTables()
return pairs(lib.tables)
end
 
 
---------------------------------------------------------------------
-- :GetOptionsTable(appName)
-- - appName - which addon to retreive the options table of
-- Optional:
-- - uiType - "cmd", "dropdown", "dialog"
-- - uiName - e.g. "MyLib-1.0"
--
-- If only appName is given, a function is returned which you
-- can call with (uiType,uiName) to get the table.
-- If uiType&uiName are given, the table is returned.
 
function lib:GetOptionsTable(appName, uiType, uiName)
local f = lib.tables[appName]
if not f then
return nil
end
 
if uiType then
return f(uiType,uiName,1) -- get the table for us
else
return f -- return the function
end
end
EasyDaily-Beta/libs/AceConfig-3.0/AceConfig-3.0.xml New file
0,0 → 1,8
<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">
<Include file="AceConfigRegistry-3.0\AceConfigRegistry-3.0.xml"/>
<Include file="AceConfigCmd-3.0\AceConfigCmd-3.0.xml"/>
<Include file="AceConfigDialog-3.0\AceConfigDialog-3.0.xml"/>
<!--<Include file="AceConfigDropdown-3.0\AceConfigDropdown-3.0.xml"/>-->
<Script file="AceConfig-3.0.lua"/>
</Ui>
\ No newline at end of file
EasyDaily-Beta/libs/AceConfig-3.0/AceConfig-3.0.lua New file
0,0 → 1,43
--[[ $Id: AceConfig-3.0.lua 494 2008-02-03 13:03:56Z nevcairiel $ ]]
--[[
AceConfig-3.0
 
Very light wrapper library that combines all the AceConfig subcomponents into one more easily used whole.
 
Also automatically adds "config", "enable" and "disable" commands to options table as appropriate.
 
]]
 
local MAJOR, MINOR = "AceConfig-3.0", 2
local lib = LibStub:NewLibrary(MAJOR, MINOR)
 
if not lib then return end
 
 
local cfgreg = LibStub("AceConfigRegistry-3.0")
local cfgcmd = LibStub("AceConfigCmd-3.0")
local cfgdlg = LibStub("AceConfigDialog-3.0")
--TODO: local cfgdrp = LibStub("AceConfigDropdown-3.0")
 
 
---------------------------------------------------------------------
-- :RegisterOptionsTable(appName, options, slashcmd, persist)
--
-- - appName - (string) application name
-- - options - table or function ref, see AceConfigRegistry
-- - slashcmd - slash command (string) or table with commands, or nil to NOT create a slash command
 
function lib:RegisterOptionsTable(appName, options, slashcmd)
local ok,msg = pcall(cfgreg.RegisterOptionsTable, self, appName, options)
if not ok then error(msg, 2) end
 
if slashcmd then
if type(slashcmd) == "table" then
for _,cmd in pairs(slashcmd) do
cfgcmd:CreateChatCommand(cmd, appName)
end
else
cfgcmd:CreateChatCommand(slashcmd, appName)
end
end
end
EasyDaily-Beta/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.xml New file
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="AceConfigDialog-3.0.lua"/>
</Ui>
\ No newline at end of file
EasyDaily-Beta/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua New file
0,0 → 1,1755
--[[
AceConfigDialog-3.0
 
]]
local LibStub = LibStub
local MAJOR, MINOR = "AceConfigDialog-3.0", 25
local lib = LibStub:NewLibrary(MAJOR, MINOR)
 
if not lib then return end
 
lib.OpenFrames = lib.OpenFrames or {}
lib.Status = lib.Status or {}
lib.frame = lib.frame or CreateFrame("Frame")
 
lib.frame.apps = lib.frame.apps or {}
lib.frame.closing = lib.frame.closing or {}
 
local gui = LibStub("AceGUI-3.0")
local reg = LibStub("AceConfigRegistry-3.0")
 
local select = select
local pairs = pairs
local type = type
local assert = assert
local tinsert = tinsert
local tremove = tremove
local error = error
local table = table
local unpack = unpack
local string = string
local next = next
local math = math
local _
 
--[[
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", table.concat(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, ...)
return Dispatchers[select('#', ...)](func, ...)
end
 
local width_multiplier = 170
 
--[[
Group Types
Tree - All Descendant Groups will all become nodes on the tree, direct child options will appear above the tree
- Descendant Groups with inline=true and thier children will not become nodes
 
Tab - Direct Child Groups will become tabs, direct child options will appear above the tab control
- Grandchild groups will default to inline unless specified otherwise
 
Select- Same as Tab but with entries in a dropdown rather than tabs
 
 
Inline Groups
- Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border
- If declared on a direct child of a root node of a select group, they will appear above the group container control
- When a group is displayed inline, all descendants will also be inline members of the group
 
]]
 
-- Recycling functions
local new, del, copy
--newcount, delcount,createdcount,cached = 0,0,0
do
local pool = setmetatable({},{__mode='k'})
function new()
--newcount = newcount + 1
local t = next(pool)
if t then
pool[t] = nil
return t
else
--createdcount = createdcount + 1
return {}
end
end
function copy(t)
local c = new()
for k, v in pairs(t) do
c[k] = v
end
return c
end
function del(t)
--delcount = delcount + 1
for k in pairs(t) do
t[k] = nil
end
pool[t] = true
end
-- function cached()
-- local n = 0
-- for k in pairs(pool) do
-- n = n + 1
-- end
-- return n
-- end
end
 
-- picks the first non-nil value and returns it
local function pickfirstset(...)
for i=1,select("#",...) do
if select(i,...)~=nil then
return select(i,...)
end
end
end
 
--gets an option from a given group, checking plugins
local function GetSubOption(group, key)
if group.plugins then
for plugin, t in pairs(group.plugins) do
if t[key] then
return t[key]
end
end
end
 
return group.args[key]
end
 
--Option member type definitions, used to decide how to access it
 
--Is the member Inherited from parent options
local isInherited = {
set = true,
get = true,
func = true,
confirm = true,
validate = true,
disabled = true,
hidden = true
}
 
--Does a string type mean a literal value, instead of the default of a method of the handler
local stringIsLiteral = {
name = true,
desc = true,
icon = true,
usage = true,
width = true,
image = true,
}
 
--Is Never a function or method
local allIsLiteral = {
type = true,
imageWidth = true,
imageHeight = true,
}
 
--gets the value for a member that could be a function
--function refs are called with an info arg
--every other type is returned
local function GetOptionsMemberValue(membername, option, options, path, appName, ...)
--get definition for the member
local inherits = isInherited[membername]
 
 
--get the member of the option, traversing the tree if it can be inherited
local member
 
if inherits then
local group = options
if group[membername] ~= nil then
member = group[membername]
end
for i = 1, #path do
group = GetSubOption(group, path[i])
if group[membername] ~= nil then
member = group[membername]
end
end
else
member = option[membername]
end
 
--check if we need to call a functon, or if we have a literal value
if ( not allIsLiteral[membername] ) and ( type(member) == "function" or ((not stringIsLiteral[membername]) and type(member) == "string") ) then
--We have a function to call
local info = new()
--traverse the options table, picking up the handler and filling the info with the path
local handler
local group = options
handler = group.handler or handler
 
for i = 1, #path do
group = GetSubOption(group, path[i])
info[i] = path[i]
handler = group.handler or handler
end
 
info.options = options
info.appName = appName
info[0] = appName
info.arg = option.arg
info.handler = handler
info.option = option
info.type = option.type
info.uiType = 'dialog'
info.uiName = MAJOR
 
local a, b, c ,d
--using 4 returns for the get of a color type, increase if a type needs more
if type(member) == "function" then
--Call the function
a,b,c,d = member(info, ...)
else
--Call the method
if handler and handler[member] then
a,b,c,d = handler[member](handler, info, ...)
else
error(string.format("Method %s doesn't exist in handler for type %s", member, membername))
end
end
del(info)
return a,b,c,d
else
--The value isnt a function to call, return it
return member
end
end
 
--[[calls an options function that could be inherited, method name or function ref
local function CallOptionsFunction(funcname ,option, options, path, appName, ...)
local info = new()
 
local func
local group = options
local handler
 
--build the info table containing the path
-- pick up functions while traversing the tree
if group[funcname] ~= nil then
func = group[funcname]
end
handler = group.handler or handler
 
for i, v in ipairs(path) do
group = GetSubOption(group, v)
info[i] = v
if group[funcname] ~= nil then
func = group[funcname]
end
handler = group.handler or handler
end
 
info.options = options
info[0] = appName
info.arg = option.arg
 
local a, b, c ,d
if type(func) == "string" then
if handler and handler[func] then
a,b,c,d = handler[func](handler, info, ...)
else
error(string.format("Method %s doesn't exist in handler for type func", func))
end
elseif type(func) == "function" then
a,b,c,d = func(info, ...)
end
del(info)
return a,b,c,d
end
--]]
 
--tables to hold orders and names for options being sorted, will be created with new()
--prevents needing to call functions repeatedly while sorting
local tempOrders
local tempNames
 
local function compareOptions(a,b)
if not a then
return true
end
if not b then
return false
end
local OrderA, OrderB = tempOrders[a] or 100, tempOrders[b] or 100
if OrderA == OrderB then
local NameA = (type(tempNames[a] == "string") and tempNames[a]) or ""
local NameB = (type(tempNames[b] == "string") and tempNames[b]) or ""
return NameA:upper() < NameB:upper()
end
if OrderA < 0 then
if OrderB > 0 then
return false
end
else
if OrderB < 0 then
return true
end
end
return OrderA < OrderB
end
 
 
 
--builds 2 tables out of an options group
-- keySort, sorted keys
-- opts, combined options from .plugins and args
local function BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
tempOrders = new()
tempNames = new()
 
if group.plugins then
for plugin, t in pairs(group.plugins) do
for k, v in pairs(t) do
if not opts[k] then
tinsert(keySort, k)
opts[k] = v
 
path[#path+1] = k
tempOrders[k] = GetOptionsMemberValue("order", v, options, path, appName)
tempNames[k] = GetOptionsMemberValue("name", v, options, path, appName)
path[#path] = nil
end
end
end
end
 
for k, v in pairs(group.args) do
if not opts[k] then
tinsert(keySort, k)
opts[k] = v
 
path[#path+1] = k
tempOrders[k] = GetOptionsMemberValue("order", v, options, path, appName)
tempNames[k] = GetOptionsMemberValue("name", v, options, path, appName)
path[#path] = nil
end
end
 
table.sort(keySort, compareOptions)
 
del(tempOrders)
del(tempNames)
end
 
local function DelTree(tree)
if tree.children then
local childs = tree.children
for i = 1, #childs do
DelTree(childs[i])
del(childs[i])
end
del(childs)
end
end
 
local function CleanUserData(widget, event)
 
local user = widget:GetUserDataTable()
 
if user.path then
del(user.path)
end
 
if widget.type == "TreeGroup" then
local tree = user.tree
widget:SetTree(nil)
if tree then
for i = 1, #tree do
DelTree(tree[i])
del(tree[i])
end
del(tree)
end
end
 
if widget.type == "TabGroup" then
widget:SetTabs(nil)
if user.tablist then
del(user.tablist)
end
end
 
if widget.type == "DropdownGroup" then
widget:SetGroupList(nil)
if user.grouplist then
del(user.grouplist)
end
end
end
 
--[[
Gets a status table for the given appname and options path
]]
function lib:GetStatusTable(appName, path)
local status = self.Status
 
if not status[appName] then
status[appName] = {}
status[appName].status = {}
status[appName].children = {}
end
 
status = status[appName]
 
if path then
for i = 1, #path do
local v = path[i]
if not status.children[v] then
status.children[v] = {}
status.children[v].status = {}
status.children[v].children = {}
end
status = status.children[v]
end
end
 
return status.status
end
 
--[[
Sets the given path to be selected
]]
function lib:SelectGroup(appName, ...)
local path = new()
 
 
local app = reg:GetOptionsTable(appName)
if not app then
error(("%s isn't registed with AceConfigRegistry, unable to open config"):format(appName), 2)
end
local options = app("dialog", MAJOR)
local group = options
local status = self:GetStatusTable(appName, path)
if not status.groups then
status.groups = {}
end
status = status.groups
local treevalue
local treestatus
 
for n = 1, select('#',...) do
local key = select(n, ...)
 
if group.childGroups == "tab" or group.childGroups == "select" then
--if this is a tab or select group, select the group
status.selected = key
--children of this group are no longer extra levels of a tree
treevalue = nil
else
--tree group by default
if treevalue then
--this is an extra level of a tree group, build a uniquevalue for it
treevalue = treevalue.."\001"..key
else
--this is the top level of a tree group, the uniquevalue is the same as the key
treevalue = key
if not status.groups then
status.groups = {}
end
--save this trees status table for any extra levels or groups
treestatus = status
end
--make sure that the tree entry is open, and select it.
--the selected group will be overwritten if a child is the final target but still needs to be open
treestatus.selected = treevalue
treestatus.groups[treevalue] = true
 
end
 
--move to the next group in the path
group = GetSubOption(group, key)
if not group then
break
end
tinsert(path, key)
status = self:GetStatusTable(appName, path)
if not status.groups then
status.groups = {}
end
status = status.groups
end
 
del(path)
reg:NotifyChange(appName)
end
 
local function OptionOnMouseOver(widget, event)
--show a tooltip/set the status bar to the desc text
local user = widget:GetUserDataTable()
local opt = user.option
local options = user.options
local path = user.path
local appName = user.appName
 
GameTooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT")
local name = GetOptionsMemberValue("name", opt, options, path, appName)
local desc = GetOptionsMemberValue("desc", opt, options, path, appName)
local usage = GetOptionsMemberValue("usage", opt, options, path, appName)
 
GameTooltip:SetText(name, 1, .82, 0, 1)
 
if opt.type == 'multiselect' then
GameTooltip:AddLine(user.text,0.5, 0.5, 0.8, 1)
end
if type(desc) == "string" then
GameTooltip:AddLine(desc, 1, 1, 1, 1)
end
if type(usage) == "string" then
GameTooltip:AddLine("Usage: "..usage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, 1)
end
 
GameTooltip:Show()
end
 
local function OptionOnMouseLeave(widget, event)
GameTooltip:Hide()
end
 
local function GetFuncName(option)
local type = option.type
if type == 'execute' then
return 'func'
else
return 'set'
end
end
local function confirmPopup(appName, rootframe, basepath, info, message, func, ...)
if not StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] then
StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] = {}
end
local t = StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"]
for k in pairs(t) do
t[k] = nil
end
t.text = message
t.button1 = ACCEPT
t.button2 = CANCEL
local dialog, oldstrata
t.OnAccept = function()
safecall(func, unpack(t))
if dialog and oldstrata then
dialog:SetFrameStrata(oldstrata)
end
lib:Open(appName, rootframe, basepath and unpack(basepath))
del(info)
end
t.OnCancel = function()
if dialog and oldstrata then
dialog:SetFrameStrata(oldstrata)
end
del(info)
end
for i = 1, select('#', ...) do
t[i] = select(i, ...) or false
end
t.timeout = 0
t.whileDead = 1
t.hideOnEscape = 1
 
dialog = StaticPopup_Show("ACECONFIGDIALOG30_CONFIRM_DIALOG")
if dialog then
oldstrata = dialog:GetFrameStrata()
dialog:SetFrameStrata("TOOLTIP")
end
end
 
local function ActivateControl(widget, event, ...)
--This function will call the set / execute handler for the widget
--widget:GetUserDataTable() contains the needed info
local user = widget:GetUserDataTable()
local option = user.option
local options = user.options
local path = user.path
local info = new()
 
local func
local group = options
local funcname = GetFuncName(option)
local handler
local confirm
local validate
--build the info table containing the path
-- pick up functions while traversing the tree
if group[funcname] ~= nil then
func = group[funcname]
end
handler = group.handler or handler
confirm = group.confirm
validate = group.validate
for i = 1, #path do
local v = path[i]
group = GetSubOption(group, v)
info[i] = v
if group[funcname] ~= nil then
func = group[funcname]
end
handler = group.handler or handler
if group.confirm ~= nil then
confirm = group.confirm
end
if group.validate ~= nil then
validate = group.validate
end
end
 
info.options = options
info.appName = user.appName
info.arg = option.arg
info.handler = handler
info.option = option
info.type = option.type
info.uiType = 'dialog'
info.uiName = MAJOR
 
local name
if type(option.name) == "function" then
name = option.name(info)
elseif type(option.name) == "string" then
name = option.name
else
name = ""
end
local usage = option.usage
local pattern = option.pattern
 
local validated = true
 
if option.type == "input" then
if type(pattern)=="string" then
if not strmatch(..., pattern) then
validated = false
end
end
end
 
local success
if validated and option.type ~= "execute" then
if type(validate) == "string" then
if handler and handler[validate] then
success, validated = safecall(handler[validate], handler, info, ...)
if not success then validated = false end
else
error(string.format("Method %s doesn't exist in handler for type execute", validate))
end
elseif type(validate) == "function" then
success, validated = safecall(validate, info, ...)
if not success then validated = false end
end
end
 
local rootframe = user.rootframe
if type(validated) == "string" then
--validate function returned a message to display
if rootframe.SetStatusText then
rootframe:SetStatusText(validated)
end
PlaySound("igPlayerInviteDecline")
del(info)
return true
elseif not validated then
--validate returned false
if rootframe.SetStatusText then
if usage then
rootframe:SetStatusText(name..": "..usage)
else
if pattern then
rootframe:SetStatusText(name..": Expected "..pattern)
else
rootframe:SetStatusText(name..": Invalid Value")
end
end
end
PlaySound("igPlayerInviteDecline")
del(info)
return true
else
 
local confirmText = option.confirmText
--call confirm func/method
if type(confirm) == "string" then
if handler and handler[confirm] then
success, confirm = safecall(handler[confirm], handler, info, ...)
if success and type(confirm) == "string" then
confirmText = confirm
confirm = true
elseif not success then
confirm = false
end
else
error(string.format("Method %s doesn't exist in handler for type confirm", confirm))
end
elseif type(confirm) == "function" then
success, confirm = safecall(confirm, info, ...)
if success and type(confirm) == "string" then
confirmText = confirm
confirm = true
elseif not success then
confirm = false
end
end
 
--confirm if needed
if type(confirm) == "boolean" then
if confirm then
if not confirmText then
local name, desc = option.name, option.desc
if type(name) == "function" then
name = name(info)
end
if type(desc) == "function" then
desc = desc(info)
end
confirmText = name
if desc then
confirmText = confirmText.." - "..desc
end
end
 
local iscustom = user.rootframe:GetUserData('iscustom')
local rootframe
 
if iscustom then
rootframe = user.rootframe
end
local basepath = user.rootframe:GetUserData('basepath')
if type(func) == "string" then
if handler and handler[func] then
confirmPopup(user.appName, rootframe, basepath, info, confirmText, handler[func], handler, info, ...)
else
error(string.format("Method %s doesn't exist in handler for type func", func))
end
elseif type(func) == "function" then
confirmPopup(user.appName, rootframe, basepath, info, confirmText, func, info, ...)
end
--func will be called and info deleted when the confirm dialog is responded to
return
end
end
 
--call the function
if type(func) == "string" then
if handler and handler[func] then
safecall(handler[func],handler, info, ...)
else
error(string.format("Method %s doesn't exist in handler for type func", func))
end
elseif type(func) == "function" then
safecall(func,info, ...)
end
 
 
 
local iscustom = user.rootframe:GetUserData('iscustom')
local basepath = user.rootframe:GetUserData('basepath')
--full refresh of the frame, some controls dont cause this on all events
if option.type == "color" then
if event == "OnValueConfirmed" then
 
if iscustom then
lib:Open(user.appName, user.rootframe, basepath and unpack(basepath))
else
lib:Open(user.appName, basepath and unpack(basepath))
end
end
elseif option.type == "range" then
if event == "OnMouseUp" then
if iscustom then
lib:Open(user.appName, user.rootframe, basepath and unpack(basepath))
else
lib:Open(user.appName, basepath and unpack(basepath))
end
end
--multiselects don't cause a refresh on 'OnValueChanged' only 'OnClosed'
elseif option.type == "multiselect" then
user.valuechanged = true
else
if iscustom then
lib:Open(user.appName, user.rootframe, basepath and unpack(basepath))
else
lib:Open(user.appName, basepath and unpack(basepath))
end
end
 
end
del(info)
end
 
local function ActivateSlider(widget, event, value)
local option = widget:GetUserData('option')
local min, max, step = option.min or 0, option.max or 100, option.step
if step then
value = math.floor((value - min) / step + 0.5) * step + min
else
value = math.max(math.min(value,max),min)
end
ActivateControl(widget,event,value)
end
 
--called from a checkbox that is part of an internally created multiselect group
--this type is safe to refresh on activation of one control
local function ActivateMultiControl(widget, event, ...)
ActivateControl(widget, event, widget:GetUserData('value'), ...)
local user = widget:GetUserDataTable()
local iscustom = user.rootframe:GetUserData('iscustom')
local basepath = user.rootframe:GetUserData('basepath')
if iscustom then
lib:Open(user.appName, user.rootframe, basepath and unpack(basepath))
else
lib:Open(user.appName, basepath and unpack(basepath))
end
end
 
local function MultiControlOnClosed(widget, event, ...)
local user = widget:GetUserDataTable()
if user.valuechanged then
local iscustom = user.rootframe:GetUserData('iscustom')
local basepath = user.rootframe:GetUserData('basepath')
if iscustom then
lib:Open(user.appName, user.rootframe, basepath and unpack(basepath))
else
lib:Open(user.appName, basepath and unpack(basepath))
end
end
end
 
local function FrameOnClose(widget, event)
local appName = widget:GetUserData('appName')
lib.OpenFrames[appName] = nil
gui:Release(widget)
end
 
local function CheckOptionHidden(option, options, path, appName)
--check for a specific boolean option
local hidden = pickfirstset(option.dialogHidden,option.guiHidden)
if hidden ~= nil then
return hidden
end
 
return GetOptionsMemberValue("hidden", option, options, path, appName)
end
 
local function CheckOptionDisabled(option, options, path, appName)
--check for a specific boolean option
local disabled = pickfirstset(option.dialogDisabled,option.guiDisabled)
if disabled ~= nil then
return disabled
end
 
return GetOptionsMemberValue("disabled", option, options, path, appName)
end
--[[
local function BuildTabs(group, options, path, appName)
local tabs = new()
local text = new()
local keySort = new()
local opts = new()
 
BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
 
for i = 1, #keySort do
local k = keySort[i]
local v = opts[k]
if v.type == "group" then
path[#path+1] = k
local inline = pickfirstset(v.dialogInline,v.guiInline,v.inline, false)
local hidden = CheckOptionHidden(v, options, path, appName)
if not inline and not hidden then
tinsert(tabs, k)
text[k] = GetOptionsMemberValue("name", v, options, path, appName)
end
path[#path] = nil
end
end
 
del(keySort)
del(opts)
 
return tabs, text
end
]]
local function BuildSelect(group, options, path, appName)
local groups = new()
local keySort = new()
local opts = new()
 
BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
 
for i = 1, #keySort do
local k = keySort[i]
local v = opts[k]
if v.type == "group" then
path[#path+1] = k
local inline = pickfirstset(v.dialogInline,v.guiInline,v.inline, false)
local hidden = CheckOptionHidden(v, options, path, appName)
if not inline and not hidden then
groups[k] = GetOptionsMemberValue("name", v, options, path, appName)
end
path[#path] = nil
end
end
 
del(keySort)
del(opts)
 
return groups
end
 
local function BuildSubGroups(group, tree, options, path, appName)
local keySort = new()
local opts = new()
 
BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
 
for i = 1, #keySort do
local k = keySort[i]
local v = opts[k]
if v.type == "group" then
path[#path+1] = k
local inline = pickfirstset(v.dialogInline,v.guiInline,v.inline, false)
local hidden = CheckOptionHidden(v, options, path, appName)
if not inline and not hidden then
local entry = new()
entry.value = k
entry.text = GetOptionsMemberValue("name", v, options, path, appName)
entry.disabled = CheckOptionDisabled(v, options, path, appName)
if not tree.children then tree.children = new() end
tinsert(tree.children,entry)
if (v.childGroups or "tree") == "tree" then
BuildSubGroups(v,entry, options, path, appName)
end
end
path[#path] = nil
end
end
 
del(keySort)
del(opts)
end
 
local function BuildGroups(group, options, path, appName, recurse)
local tree = new()
local keySort = new()
local opts = new()
 
BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
 
for i = 1, #keySort do
local k = keySort[i]
local v = opts[k]
if v.type == "group" then
path[#path+1] = k
local inline = pickfirstset(v.dialogInline,v.guiInline,v.inline, false)
local hidden = CheckOptionHidden(v, options, path, appName)
if not inline and not hidden then
local entry = new()
entry.value = k
entry.text = GetOptionsMemberValue("name", v, options, path, appName)
entry.disabled = CheckOptionDisabled(v, options, path, appName)
tinsert(tree,entry)
if recurse and (v.childGroups or "tree") == "tree" then
BuildSubGroups(v,entry, options, path, appName)
end
end
path[#path] = nil
end
end
del(keySort)
del(opts)
return tree
end
 
local function InjectInfo(control, options, option, path, rootframe, appName)
local user = control:GetUserDataTable()
for i = 1, #path do
user[i] = path[i]
end
user.rootframe = rootframe
user.option = option
user.options = options
user.path = copy(path)
user.appName = appName
control:SetCallback("OnRelease", CleanUserData)
control:SetCallback("OnLeave", OptionOnMouseLeave)
control:SetCallback("OnEnter", OptionOnMouseOver)
end
 
 
--[[
options - root of the options table being fed
container - widget that controls will be placed in
rootframe - Frame object the options are in
path - table with the keys to get to the group being fed
--]]
 
local function FeedOptions(appName, options,container,rootframe,path,group,inline)
local keySort = new()
local opts = new()
 
BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
 
for i = 1, #keySort do
local k = keySort[i]
local v = opts[k]
tinsert(path, k)
local hidden = CheckOptionHidden(v, options, path, appName)
local name = GetOptionsMemberValue("name", v, options, path, appName)
if not hidden then
if v.type == "group" then
if inline or pickfirstset(v.dialogInline,v.guiInline,v.inline, false) then
--Inline group
local GroupContainer
if name and name ~= "" then
GroupContainer = gui:Create("InlineGroup")
GroupContainer:SetTitle(name or "")
else
GroupContainer = gui:Create("SimpleGroup")
end
 
GroupContainer.width = "fill"
GroupContainer:SetLayout("flow")
container:AddChild(GroupContainer)
FeedOptions(appName,options,GroupContainer,rootframe,path,v,true)
end
else
--Control to feed
local control
 
local name = GetOptionsMemberValue("name", v, options, path, appName)
 
if v.type == "execute" then
control = gui:Create("Button")
control:SetText(name)
control:SetCallback("OnClick",ActivateControl)
 
elseif v.type == "input" then
local controlType = v.dialogControl or v.control or (v.multiline and "MultiLineEditBox") or "EditBox"
control = gui:Create(controlType)
if not control then
error(("Invalid Custom Control Type - %s"):format(tostring(controlType)))
end
 
if v.multiline then
local lines = 4
if type(v.multiline) == "number" then
lines = v.multiline
end
control:SetHeight(60 + (14*lines))
end
control:SetLabel(name)
control:SetCallback("OnEnterPressed",ActivateControl)
local text = GetOptionsMemberValue("get",v, options, path, appName)
if type(text) ~= "string" then
text = ""
end
control:SetText(text)
 
elseif v.type == "toggle" then
control = gui:Create("CheckBox")
control:SetLabel(name)
control:SetTriState(v.tristate)
local value = GetOptionsMemberValue("get",v, options, path, appName)
control:SetValue(value)
control:SetCallback("OnValueChanged",ActivateControl)
 
elseif v.type == "range" then
control = gui:Create("Slider")
control:SetLabel(name)
control:SetSliderValues(v.min or 0,v.max or 100, v.bigStep or v.step or 0)
control:SetIsPercent(v.isPercent)
local value = GetOptionsMemberValue("get",v, options, path, appName)
if type(value) ~= "number" then
value = 0
end
control:SetValue(value)
control:SetCallback("OnValueChanged",ActivateSlider)
control:SetCallback("OnMouseUp",ActivateSlider)
 
elseif v.type == "select" then
local values = GetOptionsMemberValue("values", v, options, path, appName)
local controlType = v.dialogControl or v.control or "Dropdown"
control = gui:Create(controlType)
if not control then
error(("Invalid Custom Control Type - %s"):format(tostring(controlType)))
end
control:SetLabel(name)
control:SetList(values)
local value = GetOptionsMemberValue("get",v, options, path, appName)
if not values[value] then
value = nil
end
control:SetValue(value)
control:SetCallback("OnValueChanged",ActivateControl)
 
elseif v.type == "multiselect" then
local values = GetOptionsMemberValue("values", v, options, path, appName)
local disabled = CheckOptionDisabled(v, options, path, appName)
 
local controlType = v.dialogControl or v.control
 
local valuesort = new()
if values then
for value, text in pairs(values) do
tinsert(valuesort, value)
end
end
table.sort(valuesort)
 
if controlType then
control = gui:Create(controlType)
if not control then
error(("Invalid Custom Control Type - %s"):format(tostring(controlType)))
end
control:SetMultiselect(true)
control:SetLabel(name)
control:SetList(values)
control:SetDisabled(disabled)
control:SetCallback("OnValueChanged",ActivateControl)
control:SetCallback("OnClosed", MultiControlOnClosed)
local width = GetOptionsMemberValue("width",v,options,path,appName)
if width == "double" then
control:SetWidth(width_multiplier * 2)
elseif width == "half" then
control:SetWidth(width_multiplier / 2)
elseif width == "full" then
control.width = "fill"
else
control:SetWidth(width_multiplier)
end
--check:SetTriState(v.tristate)
for i = 1, #valuesort do
local key = valuesort[i]
local value = GetOptionsMemberValue("get",v, options, path, appName, key)
control:SetItemValue(key,value)
end
else
control = gui:Create("InlineGroup")
control:SetLayout("Flow")
control:SetTitle(name)
control.width = "fill"
 
control:PauseLayout()
local width = GetOptionsMemberValue("width",v,options,path,appName)
for i = 1, #valuesort do
local value = valuesort[i]
local text = values[value]
local check = gui:Create("CheckBox")
check:SetLabel(text)
check:SetUserData('value', value)
check:SetUserData('text', text)
check:SetDisabled(disabled)
check:SetTriState(v.tristate)
check:SetValue(GetOptionsMemberValue("get",v, options, path, appName, value))
check:SetCallback("OnValueChanged",ActivateMultiControl)
InjectInfo(check, options, v, path, rootframe, appName)
control:AddChild(check)
if width == "double" then
check:SetWidth(width_multiplier * 2)
elseif width == "half" then
check:SetWidth(width_multiplier / 2)
elseif width == "full" then
check.width = "fill"
else
check:SetWidth(width_multiplier)
end
end
control:ResumeLayout()
control:DoLayout()
 
 
end
 
del(valuesort)
 
elseif v.type == "color" then
control = gui:Create("ColorPicker")
control:SetLabel(name)
control:SetHasAlpha(v.hasAlpha)
control:SetColor(GetOptionsMemberValue("get",v, options, path, appName))
control:SetCallback("OnValueChanged",ActivateControl)
control:SetCallback("OnValueConfirmed",ActivateControl)
 
elseif v.type == "keybinding" then
control = gui:Create("Keybinding")
control:SetLabel(name)
control:SetKey(GetOptionsMemberValue("get",v, options, path, appName))
control:SetCallback("OnKeyChanged",ActivateControl)
 
elseif v.type == "header" then
control = gui:Create("Heading")
control:SetText(name)
control.width = "fill"
 
elseif v.type == "description" then
control = gui:Create("Label")
control:SetText(name)
local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)
 
if type(image) == 'string' then
if not width then
width = GetOptionsMemberValue("imageWidth",v, options, path, appName)
end
if not height then
height = GetOptionsMemberValue("imageHeight",v, options, path, appName)
end
if type(imageCoords) == 'table' then
control:SetImage(image, unpack(imageCoords))
else
control:SetImage(image)
end
if type(width) ~= "number" then
width = 32
end
if type(height) ~= "number" then
height = 32
end
control:SetImageSize(width, height)
end
local width = GetOptionsMemberValue("width",v,options,path,appName)
control.width = not width and "fill"
end
 
--Common Init
if control then
if control.width ~= "fill" then
local width = GetOptionsMemberValue("width",v,options,path,appName)
if width == "double" then
control:SetWidth(width_multiplier * 2)
elseif width == "half" then
control:SetWidth(width_multiplier / 2)
elseif width == "full" then
control.width = "fill"
else
control:SetWidth(width_multiplier)
end
end
if control.SetDisabled then
local disabled = CheckOptionDisabled(v, options, path, appName)
control:SetDisabled(disabled)
end
 
InjectInfo(control, options, v, path, rootframe, appName)
container:AddChild(control)
end
 
end
end
tremove(path)
end
container:ResumeLayout()
container:DoLayout()
del(keySort)
del(opts)
end
 
local function BuildPath(path, ...)
for i = 1, select('#',...) do
tinsert(path, (select(i,...)))
end
end
 
 
local function TreeOnButtonEnter(widget, event, uniquevalue, button)
local user = widget:GetUserDataTable()
if not user then return end
local options = user.options
local option = user.option
local path = user.path
local appName = user.appName
 
local feedpath = new()
for i = 1, #path do
feedpath[i] = path[i]
end
 
BuildPath(feedpath, string.split("\001", uniquevalue))
local group = options
for i = 1, #feedpath do
if not group then return end
group = GetSubOption(group, feedpath[i])
end
 
local name = GetOptionsMemberValue("name", group, options, feedpath, appName)
local desc = GetOptionsMemberValue("desc", group, options, feedpath, appName)
 
GameTooltip:SetOwner(button, "ANCHOR_NONE")
if widget.type == "TabGroup" then
GameTooltip:SetPoint("BOTTOM",button,"TOP")
else
GameTooltip:SetPoint("LEFT",button,"RIGHT")
end
 
GameTooltip:SetText(name, 1, .82, 0, 1)
 
if type(desc) == "string" then
GameTooltip:AddLine(desc, 1, 1, 1, 1)
end
 
GameTooltip:Show()
end
 
local function TreeOnButtonLeave(widget, event, value, button)
GameTooltip:Hide()
end
 
 
local function GroupExists(appName, options, path, uniquevalue)
if not uniquevalue then return false end
 
local feedpath = new()
local temppath = new()
for i = 1, #path do
feedpath[i] = path[i]
end
 
BuildPath(feedpath, string.split("\001", uniquevalue))
 
local group = options
for i = 1, #feedpath do
local v = feedpath[i]
temppath[i] = v
group = GetSubOption(group, v)
 
if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then
del(feedpath)
del(temppath)
return false
end
end
del(feedpath)
del(temppath)
return true
end
 
local function GroupSelected(widget, event, uniquevalue)
 
local user = widget:GetUserDataTable()
 
local options = user.options
local option = user.option
local path = user.path
local rootframe = user.rootframe
 
local feedpath = new()
for i = 1, #path do
feedpath[i] = path[i]
end
 
BuildPath(feedpath, string.split("\001", uniquevalue))
local group = options
for i = 1, #feedpath do
group = GetSubOption(group, feedpath[i])
end
widget:ReleaseChildren()
lib:FeedGroup(user.appName,options,widget,rootframe,feedpath)
 
del(feedpath)
end
 
 
 
--[[
This function will feed one group, and any inline child groups into the given container
Select Groups will only have the selection control (tree, tabs, dropdown) fed in
and have a group selected, this event will trigger the feeding of child groups
 
Rules:
If the group is Inline, FeedOptions
If the group has no child groups, FeedOptions
 
If the group is a tab or select group, FeedOptions then add the Group Control
If the group is a tree group FeedOptions then
its parent isnt a tree group: then add the tree control containing this and all child tree groups
if its parent is a tree group, its already a node on a tree
--]]
 
function lib:FeedGroup(appName,options,container,rootframe,path, isRoot)
local group = options
--follow the path to get to the curent group
local inline
local grouptype, parenttype = options.childGroups, "none"
 
 
--temp path table to pass to callbacks as we traverse the tree
local temppath = new()
for i = 1, #path do
local v = path[i]
temppath[i] = v
group = GetSubOption(group, v)
inline = inline or pickfirstset(v.dialogInline,v.guiInline,v.inline, false)
parenttype = grouptype
grouptype = group.childGroups
end
del(temppath)
 
if not parenttype then
parenttype = "tree"
end
 
--check if the group has child groups
local hasChildGroups
for k, v in pairs(group.args) do
if v.type == "group" and not pickfirstset(v.dialogInline,v.guiInline,v.inline, false) then
hasChildGroups = true
end
end
if group.plugins then
for plugin, t in pairs(group.plugins) do
for k, v in pairs(t) do
if v.type == "group" and not pickfirstset(v.dialogInline,v.guiInline,v.inline, false) then
hasChildGroups = true
end
end
end
end
 
container:SetLayout("flow")
local scroll
 
--Add a scrollframe if we are not going to add a group control, this is the inverse of the conditions for that later on
if (not (hasChildGroups and not inline)) or (grouptype ~= "tab" and grouptype ~= "select" and (parenttype == "tree" and not isRoot)) then
if container.type ~= "InlineGroup" then
scroll = gui:Create("ScrollFrame")
scroll:SetLayout("flow")
scroll.width = "fill"
scroll.height = "fill"
container:SetLayout("fill")
container:AddChild(scroll)
container = scroll
end
end
 
FeedOptions(appName,options,container,rootframe,path,group,nil)
 
if scroll then
container:PerformLayout()
local status = self:GetStatusTable(appName, path)
if not status.scroll then
status.scroll = {}
end
scroll:SetStatusTable(status.scroll)
end
 
if hasChildGroups and not inline then
 
if grouptype == "tab" then
 
local tab = gui:Create("TabGroup")
InjectInfo(tab, options, group, path, rootframe, appName)
tab:SetCallback("OnGroupSelected", GroupSelected)
tab:SetCallback("OnTabEnter", TreeOnButtonEnter)
tab:SetCallback("OnTabLeave", TreeOnButtonLeave)
 
local status = lib:GetStatusTable(appName, path)
if not status.groups then
status.groups = {}
end
tab:SetStatusTable(status.groups)
tab.width = "fill"
tab.height = "fill"
 
local tabs = BuildGroups(group, options, path, appName)
tab:SetTabs(tabs)
tab:SetUserData("tablist", tabs)
 
for i = 1, #tabs do
local entry = tabs[i]
if not entry.disabled then
tab:SelectTab((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or entry.value)
break
end
end
 
container:AddChild(tab)
 
elseif grouptype == "select" then
 
local select = gui:Create("DropdownGroup")
InjectInfo(select, options, group, path, rootframe, appName)
select:SetCallback("OnGroupSelected", GroupSelected)
local status = lib:GetStatusTable(appName, path)
if not status.groups then
status.groups = {}
end
select:SetStatusTable(status.groups)
local grouplist = BuildSelect(group, options, path, appName)
select:SetGroupList(grouplist)
select:SetUserData("grouplist", grouplist)
local firstgroup
for k, v in pairs(grouplist) do
if not firstgroup or k < firstgroup then
firstgroup = k
end
end
 
if firstgroup then
select:SetGroup( (GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup)
end
 
select.width = "fill"
select.height = "fill"
 
container:AddChild(select)
 
--assume tree group by default
--if parenttype is tree then this group is already a node on that tree
elseif (parenttype ~= "tree") or isRoot then
local tree = gui:Create("TreeGroup")
InjectInfo(tree, options, group, path, rootframe, appName)
tree:EnableButtonTooltips(false)
 
tree.width = "fill"
tree.height = "fill"
 
tree:SetCallback("OnGroupSelected", GroupSelected)
tree:SetCallback("OnButtonEnter", TreeOnButtonEnter)
tree:SetCallback("OnButtonLeave", TreeOnButtonLeave)
 
local status = lib:GetStatusTable(appName, path)
if not status.groups then
status.groups = {}
end
local treedefinition = BuildGroups(group, options, path, appName, true)
tree:SetStatusTable(status.groups)
 
tree:SetTree(treedefinition)
tree:SetUserData("tree",treedefinition)
 
for i = 1, #treedefinition do
local entry = treedefinition[i]
if not entry.disabled then
tree:SelectByValue((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or entry.value)
break
end
end
 
container:AddChild(tree)
end
end
end
 
local old_CloseSpecialWindows
 
 
local function RefreshOnUpdate(this)
for appName in pairs(this.closing) do
if lib.OpenFrames[appName] then
lib.OpenFrames[appName]:Hide()
end
this.closing[appName] = nil
end
 
if this.closeAll then
for k, v in pairs(lib.OpenFrames) do
v:Hide()
end
this.closeAll = nil
end
 
for appName in pairs(this.apps) do
if lib.OpenFrames[appName] then
local user = lib.OpenFrames[appName]:GetUserDataTable()
lib:Open(appName, user.basepath and unpack(user.basepath))
end
if lib.BlizOptions and lib.BlizOptions[appName] then
local widget = lib.BlizOptions[appName]
local user = widget:GetUserDataTable()
if widget:IsVisible() then
lib:Open(widget:GetUserData('appName'), widget, user.basepath and unpack(user.basepath))
end
end
this.apps[appName] = nil
end
this:SetScript("OnUpdate", nil)
end
 
function lib:CloseAll()
lib.frame.closeAll = true
lib.frame:SetScript("OnUpdate", RefreshOnUpdate)
if next(self.OpenFrames) then
return true
end
end
 
function lib:Close(appName)
if self.OpenFrames[appName] then
lib.frame.closing[appName] = true
lib.frame:SetScript("OnUpdate", RefreshOnUpdate)
return true
end
end
 
function lib:ConfigTableChanged(event, appName)
lib.frame.apps[appName] = true
lib.frame:SetScript("OnUpdate", RefreshOnUpdate)
end
 
reg.RegisterCallback(lib, "ConfigTableChange", "ConfigTableChanged")
 
function lib:SetDefaultSize(appName, width, height)
local status = lib:GetStatusTable(appName)
if type(width) == "number" and type(height) == "number" then
status.width = width
status.height = height
end
end
 
-- :Open(appName, [container], [path ...])
function lib:Open(appName, container, ...)
if not old_CloseSpecialWindows then
old_CloseSpecialWindows = CloseSpecialWindows
CloseSpecialWindows = function()
local found = old_CloseSpecialWindows()
return self:CloseAll() or found
end
end
local app = reg:GetOptionsTable(appName)
if not app then
error(("%s isn't registed with AceConfigRegistry, unable to open config"):format(appName), 2)
end
local options = app("dialog", MAJOR)
 
local f
 
local path = new()
local name = GetOptionsMemberValue("name", options, options, path, appName)
 
--If an optional path is specified add it to the path table before feeding the options
--as container is optional as well it may contain the first element of the path
if type(container) == "string" then
tinsert(path, container)
container = nil
end
for n = 1, select('#',...) do
tinsert(path, (select(n, ...)))
end
 
--if a container is given feed into that
if container then
f = container
f:ReleaseChildren()
f:SetUserData('appName', appName)
f:SetUserData('iscustom', true)
if #path > 0 then
f:SetUserData('basepath', copy(path))
end
local status = lib:GetStatusTable(appName)
if not status.width then
status.width = 700
end
if not status.height then
status.height = 500
end
if f.SetStatusTable then
f:SetStatusTable(status)
end
else
if not self.OpenFrames[appName] then
f = gui:Create("Frame")
self.OpenFrames[appName] = f
else
f = self.OpenFrames[appName]
end
f:ReleaseChildren()
f:SetCallback("OnClose", FrameOnClose)
f:SetUserData('appName', appName)
if #path > 0 then
f:SetUserData('basepath', copy(path))
end
f:SetTitle(name or "")
local status = lib:GetStatusTable(appName)
f:SetStatusTable(status)
end
 
self:FeedGroup(appName,options,f,f,path,true)
if f.Show then
f:Show()
end
del(path)
end
 
lib.BlizOptions = lib.BlizOptions or {}
 
local function FeedToBlizPanel(widget, event)
local path = widget:GetUserData('path')
lib:Open(widget:GetUserData('appName'), widget, path and unpack(path))
end
 
local function ClearBlizPanel(widget, event)
widget:ReleaseChildren()
end
 
function lib:AddToBlizOptions(appName, name, parent, ...)
local BlizOptions = lib.BlizOptions
 
local key = appName
for n = 1, select('#', ...) do
key = key..'\001'..select(n, ...)
end
 
if not BlizOptions[key] then
local group = gui:Create("BlizOptionsGroup")
BlizOptions[key] = group
group:SetName(name or appName, parent)
 
group:SetTitle(name or appName)
group:SetUserData('appName', appName)
if select('#', ...) > 0 then
local path = {}
for n = 1, select('#',...) do
tinsert(path, (select(n, ...)))
end
group:SetUserData('path', path)
end
group:SetCallback("OnShow", FeedToBlizPanel)
group:SetCallback("OnHide", ClearBlizPanel)
InterfaceOptions_AddCategory(group.frame)
return group.frame
else
error(("%s has already been added to the Blizzard Options Window with the given path"):format(appName), 2)
end
end
EasyDaily-Beta/libs/LibDBIcon-1.0/LibDBIcon-1.0.lua New file
0,0 → 1,252
--[[
Name: DBIcon-1.0
Revision: $Rev: 6 $
Author(s): Rabbit (rabbit.magtheridon@gmail.com)
Description: Allows addons to register to recieve a lightweight minimap icon as an alternative to more heavy LDB displays.
Dependencies: LibStub
License: GPL v2 or later.
]]
 
--[[
Copyright (C) 2008 Rabbit
 
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
]]
 
-----------------------------------------------------------------------
-- DBIcon-1.0
--
-- Disclaimer: Most of this code was ripped from Barrel but fixed, streamlined
-- and cleaned up a lot so that it no longer sucks.
--
 
local DBICON10 = "LibDBIcon-1.0"
local DBICON10_MINOR = tonumber(("$Rev: 6 $"):match("(%d+)"))
if not LibStub then error(DBICON10 .. " requires LibStub.") end
local ldb = LibStub("LibDataBroker-1.1", true)
if not ldb then error(DBICON10 .. " requires LibDataBroker-1.1.") end
local lib = LibStub:NewLibrary(DBICON10, DBICON10_MINOR)
if not lib then return end
 
lib.objects = lib.objects or {}
lib.callbackRegistered = lib.callbackRegistered or nil
 
function lib:IconCallback(event, name, key, value, dataobj)
if lib.objects[name] then
lib.objects[name].icon:SetTexture(dataobj.icon)
end
end
if not lib.callbackRegistered then
ldb.RegisterCallback(lib, "LibDataBroker_AttributeChanged__icon", "IconCallback")
lib.callbackRegistered = true
end
 
-- Tooltip code ripped from Fortress
local function getAnchors(frame)
local x, y = frame:GetCenter()
local xFrom, xTo = "", ""
local yFrom, yTo = "", ""
if x < GetScreenWidth() / 3 then
xFrom, xTo = "LEFT", "RIGHT"
elseif x > GetScreenWidth() / 3 then
xFrom, xTo = "RIGHT", "LEFT"
end
if y < GetScreenHeight() / 3 then
yFrom, yTo = "BOTTOM", "TOP"
return "BOTTOM"..xFrom, "TOP"..xTo
elseif y > GetScreenWidth() / 3 then
yFrom, yTo = "TOP", "BOTTOM"
end
local from = yFrom..xFrom
local to = yTo..xTo
return (from == "" and "CENTER" or from), (to == "" and "CENTER" or to)
end
 
local GameTooltip = GameTooltip
local function GT_OnLeave()
GameTooltip:SetScript("OnLeave", GameTooltip.oldOnLeave)
GameTooltip:Hide()
GameTooltip:EnableMouse(false)
end
 
local function PrepareTooltip(frame, anchorFrame)
if frame == GameTooltip then
GameTooltip.oldOnLeave = GameTooltip:GetScript("OnLeave")
GameTooltip:EnableMouse(true)
GameTooltip:SetScript("OnLeave", GT_OnLeave)
end
frame:SetOwner(anchorFrame, "ANCHOR_NONE")
frame:ClearAllPoints()
local from, to = getAnchors(anchorFrame)
frame:SetPoint(from, anchorFrame, to)
end
 
local function onEnter(self)
local o = self.dataObject
if o.tooltip then
PrepareTooltip(o.tooltip, self)
if o.tooltiptext then
o.tooltip:SetText(o.tooltiptext)
end
o.tooltip:Show()
elseif o.OnTooltipShow then
PrepareTooltip(GameTooltip, self)
o.OnTooltipShow(GameTooltip)
GameTooltip:Show()
elseif o.tooltiptext then
PrepareTooltip(GameTooltip, self)
GameTooltip:SetText(o.tooltiptext)
GameTooltip:Show()
end
if o.OnEnter then o.OnEnter(self) end
end
 
local function onLeave(self)
local o = self.dataObject
if MouseIsOver(GameTooltip) and (o.tooltiptext or o.OnTooltipShow) then return end
if o.tooltiptext or o.OnTooltipShow then
GT_OnLeave(GameTooltip)
end
if o.OnLeave then o.OnLeave(self) end
end
--------------------------------------------------------------------------------
 
local minimapShapes = {
["ROUND"] = {true, true, true, true},
["SQUARE"] = {false, false, false, false},
["CORNER-TOPLEFT"] = {true, false, false, false},
["CORNER-TOPRIGHT"] = {false, false, true, false},
["CORNER-BOTTOMLEFT"] = {false, true, false, false},
["CORNER-BOTTOMRIGHT"] = {false, false, false, true},
["SIDE-LEFT"] = {true, true, false, false},
["SIDE-RIGHT"] = {false, false, true, true},
["SIDE-TOP"] = {true, false, true, false},
["SIDE-BOTTOM"] = {false, true, false, true},
["TRICORNER-TOPLEFT"] = {true, true, true, false},
["TRICORNER-TOPRIGHT"] = {true, false, true, true},
["TRICORNER-BOTTOMLEFT"] = {true, true, false, true},
["TRICORNER-BOTTOMRIGHT"] = {false, true, true, true},
}
 
local function updatePosition(button)
local radius = button.db.radius or 80
local rounding = button.db.rounding or 10
local position = button.db.minimapPos or random(0, 360)
button.db.minimapPos = position
button.db.radius = radius
 
local angle = math.rad(position)
local x, y, q = math.cos(angle), math.sin(angle), 1
if x < 0 then q = q + 1 end
if y > 0 then q = q + 2 end
local minimapShape = GetMinimapShape and GetMinimapShape() or "ROUND"
local quadTable = minimapShapes[minimapShape]
if quadTable[q] then
x, y = x*radius, y*radius
else
local diagRadius = math.sqrt(2*(radius)^2)-rounding
x = math.max(-radius, math.min(x*diagRadius, radius))
y = math.max(-radius, math.min(y*diagRadius, radius))
end
button:SetPoint("CENTER", Minimap, "CENTER", x, y)
if not button.db.hide then
button:Show()
else
button:Hide()
end
end
 
local function onClick(self, b) if self.dataObject.OnClick then self.dataObject.OnClick(self, b) end end
local function onMouseDown(self) self.icon:SetTexCoord(0, 1, 0, 1) end
local function onMouseUp(self) self.icon:SetTexCoord(0.05, 0.95, 0.05, 0.95) end
 
local function onUpdate(self)
local mx, my = Minimap:GetCenter()
local px, py = GetCursorPosition()
local scale = Minimap:GetEffectiveScale()
px, py = px / scale, py / scale
self.db.minimapPos = math.deg(math.atan2(py - my, px - mx)) % 360
updatePosition(self)
end
 
local function onDragStart(self)
self:LockHighlight()
self.icon:SetTexCoord(0, 1, 0, 1)
self:SetScript("OnUpdate", onUpdate)
GameTooltip:Hide()
end
 
local function onDragStop(self)
self:SetScript("OnUpdate", nil)
self.icon:SetTexCoord(0.05, 0.95, 0.05, 0.95)
self:UnlockHighlight()
end
 
local function updateAndKill(self, elapsed)
self.total = self.total + elapsed
if self.total <= 15 then
updatePosition(self)
self:SetScript("OnUpdate", nil)
end
end
 
function lib:Register(name, object, db)
if not object.icon then error("Can't register LDB objects without icons set!") end
if lib.objects[name] then error("Already registered, nubcake.") end
 
local button = CreateFrame("Button", "LibDBIcon10_"..name, Minimap)
button.dataObject = object
button.db = db
button:SetFrameStrata("MEDIUM")
button:SetWidth(31); button:SetHeight(31)
button:SetFrameLevel(8)
button:RegisterForClicks("anyUp")
button:RegisterForDrag("LeftButton")
button:SetHighlightTexture("Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight")
local overlay = button:CreateTexture(nil, "OVERLAY")
overlay:SetWidth(53); overlay:SetHeight(53)
overlay:SetTexture("Interface\\Minimap\\MiniMap-TrackingBorder")
overlay:SetPoint("TOPLEFT")
local icon = button:CreateTexture(nil, "BACKGROUND")
icon:SetWidth(20); icon:SetHeight(20)
icon:SetTexture(object.icon)
icon:SetTexCoord(0.05, 0.95, 0.05, 0.95)
icon:SetPoint("TOPLEFT", 7, -5)
button.icon = icon
 
button.total = 0
button:SetScript("OnEnter", onEnter)
button:SetScript("OnLeave", onLeave)
button:SetScript("OnClick", onClick)
button:SetScript("OnDragStart", onDragStart)
button:SetScript("OnDragStop", onDragStop)
button:SetScript("OnMouseDown", onMouseDown)
button:SetScript("OnMouseUp", onMouseUp)
button:SetScript("OnUpdate", updateAndKill)
lib.objects[name] = button
updatePosition(button)
end
 
function lib:Hide(name) lib.objects[name]:Hide() end
function lib:Show(name) lib.objects[name]:Show() end
function lib:IsRegistered(name)
return lib.objects[name] and true or false
end
 
function lib:Refresh(name, db)
local button = lib.objects[name]
if db then button.db = db end
updatePosition(button)
end
EasyDaily-Beta/libs/LibDBIcon-1.0/lib.xml New file
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="LibDBIcon-1.0.lua" />
</Ui>
\ No newline at end of file
EasyDaily-Beta/libs/LibAbacus-3.0/LibAbacus-3.0.lua New file
0,0 → 1,547
--[[
Name: LibAbacus-3.0
Revision: $Rev: 46 $
Author(s): ckknight (ckknight@gmail.com)
Website: http://ckknight.wowinterface.com/
Documentation: http://www.wowace.com/wiki/LibAbacus-3.0
SVN: http://svn.wowace.com/wowace/trunk/LibAbacus-3.0
Description: A library to provide tools for formatting money and time.
License: LGPL v2.1
]]
 
local MAJOR_VERSION = "LibAbacus-3.0"
local MINOR_VERSION = tonumber(("$Revision: 46 $"):match("(%d+)")) + 90000
 
if not LibStub then error(MAJOR_VERSION .. " requires LibStub") end
local Abacus, oldLib = LibStub:NewLibrary(MAJOR_VERSION, MINOR_VERSION)
if not Abacus then
return
end
 
local gsub = string.gsub
 
local COPPER_ABBR
local SILVER_ABBR
local GOLD_ABBR
local GOLD, SILVER, COPPER = GOLD, SILVER, COPPER
 
if not COPPER and COPPER_AMOUNT then
GOLD = GOLD_AMOUNT:gsub("%s*%%d%s*", "")
SILVER = SILVER_AMOUNT:gsub("%s*%%d%s*", "")
COPPER = COPPER_AMOUNT:gsub("%s*%%d%s*", "")
end
 
if (COPPER:byte(1) or 128) > 127 then
-- non-western
COPPER_ABBR = COPPER
SILVER_ABBR = SILVER
GOLD_ABBR = GOLD
else
COPPER_ABBR = COPPER:sub(1, 1):lower()
SILVER_ABBR = SILVER:sub(1, 1):lower()
GOLD_ABBR = GOLD:sub(1, 1):lower()
end
 
local DAYS_ABBR_S1, HOURS_ABBR_S1, MINUTES_ABBR_S1, SECONDS_ABBR_S1
local DAYS_ABBR_P1, HOURS_ABBR_P1, MINUTES_ABBR_P1, SECONDS_ABBR_P1 = DAYS_ABBR_P1, HOURS_ABBR_P1, MINUTES_ABBR_P1, SECONDS_ABBR_P1
 
if not DAYS_ABBR_P1 then
DAYS_ABBR_S1 = gsub(DAYS_ABBR, ".*|4(.-):.-;.*", "%1")
DAYS_ABBR_P1 = gsub(DAYS_ABBR, ".*|4.-:(.-);.*", "%1")
 
HOURS_ABBR_S1 = gsub(HOURS_ABBR, ".*|4(.-):.-;.*", "%1")
HOURS_ABBR_P1 = gsub(HOURS_ABBR, ".*|4.-:(.-);.*", "%1")
 
MINUTES_ABBR_S1 = gsub(MINUTES_ABBR, ".*|4(.-):.-;.*", "%1")
MINUTES_ABBR_P1 = gsub(MINUTES_ABBR, ".*|4.-:(.-);.*", "%1")
 
SECONDS_ABBR_S1 = gsub(SECONDS_ABBR, ".*|4(.-):.-;.*", "%1")
SECONDS_ABBR_P1 = gsub(SECONDS_ABBR, ".*|4.-:(.-);.*", "%1")
else
DAYS_ABBR_S1 = DAYS_ABBR
HOURS_ABBR_S1 = HOURS_ABBR
MINUTES_ABBR_S1 = MINUTES_ABBR
SECONDS_ABBR_S1 = SECONDS_ABBR
end
 
 
local COLOR_WHITE = "ffffff"
local COLOR_GREEN = "00ff00"
local COLOR_RED = "ff0000"
local COLOR_COPPER = "eda55f"
local COLOR_SILVER = "c7c7cf"
local COLOR_GOLD = "ffd700"
 
local L_DAY_ONELETTER_ABBR = DAY_ONELETTER_ABBR:gsub("%s*%%d%s*", "")
local L_HOUR_ONELETTER_ABBR = HOUR_ONELETTER_ABBR:gsub("%s*%%d%s*", "")
local L_MINUTE_ONELETTER_ABBR = MINUTE_ONELETTER_ABBR:gsub("%s*%%d%s*", "")
local L_SECOND_ONELETTER_ABBR = SECOND_ONELETTER_ABBR:gsub("%s*%%d%s*", "")
 
local L_UNDETERMINED = "Undetermined"
 
if ( GetLocale() =="koKR" ) then
L_UNDETERMINED = "측정불가"
elseif ( GetLocale() == "zhTW" ) then
COPPER_ABBR = "銅"
SILVER_ABBR = "銀"
GOLD_ABBR = "金"
 
L_UNDETERMINED = "未定義的"
 
--***************************************
-- zhCN Chinese Simplify
-- 2007/09/19 CN3羽月 雪夜之狼
-- 请保留本翻译作者名 谢谢
-- E=mail:xionglingfeng@Gmail.com
-- Website:http://www.wowtigu.org (Chs)
--***************************************
elseif ( GetLocale() == "zhCN" ) then
COPPER_ABBR = "铜"
SILVER_ABBR = "银"
GOLD_ABBR = "金"
 
L_UNDETERMINED = "未定义的"
--***************************************
-- ruRU Russian, 2008-08-04
-- Author: SLA80, sla80x at Gmail com
--***************************************
elseif ( GetLocale() == "ruRU" ) then
GOLD, SILVER, COPPER = "золота", "серебра", "меди"
GOLD_ABBR, SILVER_ABBR, COPPER_ABBR = "з", "с", "м"
DAYS_ABBR_P1 = "дней"
HOURS_ABBR_S1, HOURS_ABBR_P1 = "ч.", "ч."
MINUTES_ABBR_S1, MINUTES_ABBR_P1 = "мин.", "мин."
SECONDS_ABBR_S1, SECONDS_ABBR_P1 = "сек.", "сек."
L_UNDETERMINED = "Неопределено"
end
 
local inf = 1/0
 
function Abacus:FormatMoneyExtended(value, colorize, textColor)
local gold = abs(value / 10000)
local silver = abs(mod(value / 100, 100))
local copper = abs(mod(value, 100))
 
local negl = ""
local color = COLOR_WHITE
if value > 0 then
if textColor then
color = COLOR_GREEN
end
elseif value < 0 then
negl = "-"
if textColor then
color = COLOR_RED
end
end
if colorize then
if value == inf or value == -inf then
return format("|cff%s%s|r", color, value)
elseif value ~= value then
return format("|cff%s0|r|cff%s %s|r", COLOR_WHITE, COLOR_COPPER, COPPER)
elseif value >= 10000 or value <= -10000 then
return format("|cff%s%s%d|r|cff%s %s|r |cff%s%d|r|cff%s %s|r |cff%s%d|r|cff%s %s|r", color, negl, gold, COLOR_GOLD, GOLD, color, silver, COLOR_SILVER, SILVER, color, copper, COLOR_COPPER, COPPER)
elseif value >= 100 or value <= -100 then
return format("|cff%s%s%d|r|cff%s %s|r |cff%s%d|r|cff%s %s|r", color, negl, silver, COLOR_SILVER, SILVER, color, copper, COLOR_COPPER, COPPER)
else
return format("|cff%s%s%d|r|cff%s %s|r", color, negl, copper, COLOR_COPPER, COPPER)
end
else
if value == inf or value == -inf then
return format("%s", value)
elseif value ~= value then
return format("0 %s", COPPER)
elseif value >= 10000 or value <= -10000 then
return format("%s%d %s %d %s %d %s", negl, gold, GOLD, silver, SILVER, copper, COPPER)
elseif value >= 100 or value <= -100 then
return format("%s%d %s %d %s", negl, silver, SILVER, copper, COPPER)
else
return format("%s%d %s", negl, copper, COPPER)
end
end
end
 
function Abacus:FormatMoneyFull(value, colorize, textColor)
local gold = abs(value / 10000)
local silver = abs(mod(value / 100, 100))
local copper = abs(mod(value, 100))
 
local negl = ""
local color = COLOR_WHITE
if value > 0 then
if textColor then
color = COLOR_GREEN
end
elseif value < 0 then
negl = "-"
if textColor then
color = COLOR_RED
end
end
if colorize then
if value == inf or value == -inf then
return format("|cff%s%s|r", color, value)
elseif value ~= value then
return format("|cff%s0|r|cff%s%s|r", COLOR_WHITE, COLOR_COPPER, COPPER_ABBR)
elseif value >= 10000 or value <= -10000 then
return format("|cff%s%s%d|r|cff%s%s|r |cff%s%d|r|cff%s%s|r |cff%s%d|r|cff%s%s|r", color, negl, gold, COLOR_GOLD, GOLD_ABBR, color, silver, COLOR_SILVER, SILVER_ABBR, color, copper, COLOR_COPPER, COPPER_ABBR)
elseif value >= 100 or value <= -100 then
return format("|cff%s%s%d|r|cff%s%s|r |cff%s%d|r|cff%s%s|r", color, negl, silver, COLOR_SILVER, SILVER_ABBR, color, copper, COLOR_COPPER, COPPER_ABBR)
else
return format("|cff%s%s%d|r|cff%s%s|r", color, negl, copper, COLOR_COPPER, COPPER_ABBR)
end
else
if value == inf or value == -inf then
return format("%s", value)
elseif value ~= value then
return format("0%s", COPPER_ABBR)
elseif value >= 10000 or value <= -10000 then
return format("%s%d%s %d%s %d%s", negl, gold, GOLD_ABBR, silver, SILVER_ABBR, copper, COPPER_ABBR)
elseif value >= 100 or value <= -100 then
return format("%s%d%s %d%s", negl, silver, SILVER_ABBR, copper, COPPER_ABBR)
else
return format("%s%d%s", negl, copper, COPPER_ABBR)
end
end
end
 
function Abacus:FormatMoneyShort(copper, colorize, textColor)
local color = COLOR_WHITE
if textColor then
if copper > 0 then
color = COLOR_GREEN
elseif copper < 0 then
color = COLOR_RED
end
end
if colorize then
if copper == inf or copper == -inf then
return format("|cff%s%s|r", color, copper)
elseif copper ~= copper then
return format("|cff%s0|r|cff%s%s|r", COLOR_WHITE, COLOR_COPPER, COPPER_ABBR)
elseif copper >= 10000 or copper <= -10000 then
return format("|cff%s%.1f|r|cff%s%s|r", color, copper / 10000, COLOR_GOLD, GOLD_ABBR)
elseif copper >= 100 or copper <= -100 then
return format("|cff%s%.1f|r|cff%s%s|r", color, copper / 100, COLOR_SILVER, SILVER_ABBR)
else
return format("|cff%s%d|r|cff%s%s|r", color, copper, COLOR_COPPER, COPPER_ABBR)
end
else
if value == copper or value == -copper then
return format("%s", copper)
elseif copper ~= copper then
return format("0%s", COPPER_ABBR)
elseif copper >= 10000 or copper <= -10000 then
return format("%.1f%s", copper / 10000, GOLD_ABBR)
elseif copper >= 100 or copper <= -100 then
return format("%.1f%s", copper / 100, SILVER_ABBR)
else
return format("%.0f%s", copper, COPPER_ABBR)
end
end
end
 
function Abacus:FormatMoneyCondensed(value, colorize, textColor)
local negl = ""
local negr = ""
if value < 0 then
if colorize and textColor then
negl = "|cffff0000-(|r"
negr = "|cffff0000)|r"
else
negl = "-("
negr = ")"
end
end
local gold = floor(math.abs(value) / 10000)
local silver = mod(floor(math.abs(value) / 100), 100)
local copper = mod(floor(math.abs(value)), 100)
if colorize then
if value == inf or value == -inf then
return format("%s|cff%s%s|r%s", negl, COLOR_COPPER, math.abs(value), negr)
elseif value ~= value then
return format("|cff%s0|r", COLOR_COPPER)
elseif gold ~= 0 then
return format("%s|cff%s%d|r.|cff%s%02d|r.|cff%s%02d|r%s", negl, COLOR_GOLD, gold, COLOR_SILVER, silver, COLOR_COPPER, copper, negr)
elseif silver ~= 0 then
return format("%s|cff%s%d|r.|cff%s%02d|r%s", negl, COLOR_SILVER, silver, COLOR_COPPER, copper, negr)
else
return format("%s|cff%s%d|r%s", negl, COLOR_COPPER, copper, negr)
end
else
if value == inf or value == -inf then
return tostring(value)
elseif value ~= value then
return "0"
elseif gold ~= 0 then
return format("%s%d.%02d.%02d%s", negl, gold, silver, copper, negr)
elseif silver ~= 0 then
return format("%s%d.%02d%s", negl, silver, copper, negr)
else
return format("%s%d%s", negl, copper, negr)
end
end
end
 
local t = {}
function Abacus:FormatDurationExtended(duration, colorize, hideSeconds)
local negative = ""
if duration ~= duration then
duration = 0
end
if duration < 0 then
negative = "-"
duration = -duration
end
local days = floor(duration / 86400)
local hours = mod(floor(duration / 3600), 24)
local mins = mod(floor(duration / 60), 60)
local secs = mod(floor(duration), 60)
for k in pairs(t) do
t[k] = nil
end
if not colorize then
if not duration or duration > 86400*36500 then -- 100 years
return L_UNDETERMINED
end
if days > 1 then
table.insert(t, format("%d %s", days, DAYS_ABBR_P1))
elseif days == 1 then
table.insert(t, format("%d %s", days, DAYS_ABBR_S1))
end
if hours > 1 then
table.insert(t, format("%d %s", hours, HOURS_ABBR_P1))
elseif hours == 1 then
table.insert(t, format("%d %s", hours, HOURS_ABBR_S1))
end
if mins > 1 then
table.insert(t, format("%d %s", mins, MINUTES_ABBR_P1))
elseif mins == 1 then
table.insert(t, format("%d %s", mins, MINUTES_ABBR_S1))
end
if not hideSeconds then
if secs > 1 then
table.insert(t, format("%d %s", secs, SECONDS_ABBR_P1))
elseif secs == 1 then
table.insert(t, format("%d %s", secs, SECONDS_ABBR_S1))
end
end
if table.getn(t) == 0 then
if not hideSeconds then
return "0 " .. SECONDS_ABBR_P1
else
return "0 " .. MINUTES_ABBR_P1
end
else
return negative .. table.concat(t, " ")
end
else
if not duration or duration > 86400*36500 then -- 100 years
return "|cffffffff"..L_UNDETERMINED.."|r"
end
if days > 1 then
table.insert(t, format("|cffffffff%d|r %s", days, DAYS_ABBR_P1))
elseif days == 1 then
table.insert(t, format("|cffffffff%d|r %s", days, DAYS_ABBR_S1))
end
if hours > 1 then
table.insert(t, format("|cffffffff%d|r %s", hours, HOURS_ABBR_P1))
elseif hours == 1 then
table.insert(t, format("|cffffffff%d|r %s", hours, HOURS_ABBR_S1))
end
if mins > 1 then
table.insert(t, format("|cffffffff%d|r %s", mins, MINUTES_ABBR_P1))
elseif mins == 1 then
table.insert(t, format("|cffffffff%d|r %s", mins, MINUTES_ABBR_S1))
end
if not hideSeconds then
if secs > 1 then
table.insert(t, format("|cffffffff%d|r %s", secs, SECONDS_ABBR_P1))
elseif secs == 1 then
table.insert(t, format("|cffffffff%d|r %s", secs, SECONDS_ABBR))
end
end
if table.getn(t) == 0 then
if not hideSeconds then
return "|cffffffff0|r " .. SECONDS_ABBR_P1
else
return "|cffffffff0|r " .. MINUTES_ABBR_P1
end
elseif negative == "-" then
return "|cffffffff-|r" .. table.concat(t, " ")
else
return table.concat(t, " ")
end
end
end
 
function Abacus:FormatDurationFull(duration, colorize, hideSeconds)
local negative = ""
if duration ~= duration then
duration = 0
end
if duration < 0 then
negative = "-"
duration = -duration
end
if not colorize then
if not hideSeconds then
if not duration or duration > 86400*36500 then -- 100 years
return L_UNDETERMINED
elseif duration >= 86400 then
return format("%s%d%s %02d%s %02d%s %02d%s", negative, duration/86400, L_DAY_ONELETTER_ABBR, mod(duration/3600, 24), L_HOUR_ONELETTER_ABBR, mod(duration/60, 60), L_MINUTE_ONELETTER_ABBR, mod(duration, 60), L_SECOND_ONELETTER_ABBR)
elseif duration >= 3600 then
return format("%s%d%s %02d%s %02d%s", negative, duration/3600, L_HOUR_ONELETTER_ABBR, mod(duration/60, 60), L_MINUTE_ONELETTER_ABBR, mod(duration, 60), L_SECOND_ONELETTER_ABBR)
elseif duration >= 120 then
return format("%s%d%s %02d%s", negative, duration/60, L_MINUTE_ONELETTER_ABBR, mod(duration, 60), L_SECOND_ONELETTER_ABBR)
else
return format("%s%d%s", negative, duration, L_SECOND_ONELETTER_ABBR)
end
else
if not duration or duration > 86400*36500 then -- 100 years
return L_UNDETERMINED
elseif duration >= 86400 then
return format("%s%d%s %02d%s %02d%s", negative, duration/86400, L_DAY_ONELETTER_ABBR, mod(duration/3600, 24), L_HOUR_ONELETTER_ABBR, mod(duration/60, 60), L_MINUTE_ONELETTER_ABBR)
elseif duration >= 3600 then
return format("%s%d%s %02d%s", negative, duration/3600, L_HOUR_ONELETTER_ABBR, mod(duration/60, 60), L_MINUTE_ONELETTER_ABBR)
else
return format("%s%d%s", negative, duration/60, L_MINUTE_ONELETTER_ABBR)
end
end
else
if not hideSeconds then
if not duration or duration > 86400*36500 then -- 100 years
return "|cffffffff"..L_UNDETERMINED.."|r"
elseif duration >= 86400 then
return format("|cffffffff%s%d|r%s |cffffffff%02d|r%s |cffffffff%02d|r%s |cffffffff%02d|r%s", negative, duration/86400, L_DAY_ONELETTER_ABBR, mod(duration/3600, 24), L_HOUR_ONELETTER_ABBR, mod(duration/60, 60), L_MINUTE_ONELETTER_ABBR, mod(duration, 60), L_SECOND_ONELETTER_ABBR)
elseif duration >= 3600 then
return format("|cffffffff%s%d|r%s |cffffffff%02d|r%s |cffffffff%02d|r%s", negative, duration/3600, L_HOUR_ONELETTER_ABBR, mod(duration/60, 60), L_MINUTE_ONELETTER_ABBR, mod(duration, 60), L_SECOND_ONELETTER_ABBR)
elseif duration >= 120 then
return format("|cffffffff%s%d|r%s |cffffffff%02d|r%s", negative, duration/60, L_MINUTE_ONELETTER_ABBR, mod(duration, 60), L_SECOND_ONELETTER_ABBR)
else
return format("|cffffffff%s%d|r%s", negative, duration, L_SECOND_ONELETTER_ABBR)
end
else
if not duration or duration > 86400*36500 then -- 100 years
return "|cffffffff"..L_UNDETERMINED.."|r"
elseif duration >= 86400 then
return format("|cffffffff%s%d|r%s |cffffffff%02d|r%s |cffffffff%02d|r%s", negative, duration/86400, L_DAY_ONELETTER_ABBR, mod(duration/3600, 24), L_HOUR_ONELETTER_ABBR, mod(duration/60, 60), L_MINUTE_ONELETTER_ABBR)
elseif duration >= 3600 then
return format("|cffffffff%s%d|r%s |cffffffff%02d|r%s", negative, duration/3600, L_HOUR_ONELETTER_ABBR, mod(duration/60, 60), L_MINUTE_ONELETTER_ABBR)
else
return format("|cffffffff%s%d|r%s", negative, duration/60, L_MINUTE_ONELETTER_ABBR)
end
end
end
end
 
function Abacus:FormatDurationShort(duration, colorize, hideSeconds)
local negative = ""
if duration ~= duration then
duration = 0
end
if duration < 0 then
negative = "-"
duration = -duration
end
if not colorize then
if not duration or duration >= 86400*36500 then -- 100 years
return "***"
elseif duration >= 172800 then
return format("%s%.1f %s", negative, duration/86400, DAYS_ABBR_P1)
elseif duration >= 7200 then
return format("%s%.1f %s", negative, duration/3600, HOURS_ABBR_P1)
elseif duration >= 120 or not hideSeconds then
return format("%s%.1f %s", negative, duration/60, MINUTES_ABBR_P1)
else
return format("%s%.0f %s", negative, duration, SECONDS_ABBR_P1)
end
else
if not duration or duration >= 86400*36500 then -- 100 years
return "|cffffffff***|r"
elseif duration >= 172800 then
return format("|cffffffff%s%.1f|r %s", negative, duration/86400, DAYS_ABBR_P1)
elseif duration >= 7200 then
return format("|cffffffff%s%.1f|r %s", negative, duration/3600, HOURS_ABBR_P1)
elseif duration >= 120 or not hideSeconds then
return format("|cffffffff%s%.1f|r %s", negative, duration/60, MINUTES_ABBR_P1)
else
return format("|cffffffff%s%.0f|r %s", negative, duration, SECONDS_ABBR_P1)
end
end
end
 
function Abacus:FormatDurationCondensed(duration, colorize, hideSeconds)
local negative = ""
if duration ~= duration then
duration = 0
end
if duration < 0 then
negative = "-"
duration = -duration
end
if not colorize then
if hideSeconds then
if not duration or duration >= 86400*36500 then -- 100 years
return format("%s**%s **:**", negative, L_DAY_ONELETTER_ABBR)
elseif duration >= 86400 then
return format("%s%d%s %d:%02d", negative, duration/86400, L_DAY_ONELETTER_ABBR, mod(duration/3600, 24), mod(duration/60, 60))
else
return format("%s%d:%02d", negative, duration/3600, mod(duration/60, 60))
end
else
if not duration or duration >= 86400*36500 then -- 100 years
return negative .. "**:**:**:**"
elseif duration >= 86400 then
return format("%s%d%s %d:%02d:%02d", negative, duration/86400, L_DAY_ONELETTER_ABBR, mod(duration/3600, 24), mod(duration/60, 60), mod(duration, 60))
elseif duration >= 3600 then
return format("%s%d:%02d:%02d", negative, duration/3600, mod(duration/60, 60), mod(duration, 60))
else
return format("%s%d:%02d", negative, duration/60, mod(duration, 60))
end
end
else
if hideSeconds then
if not duration or duration >= 86400*36500 then -- 100 years
return format("|cffffffff%s**|r%s |cffffffff**|r:|cffffffff**|r", negative, L_DAY_ONELETTER_ABBR)
elseif duration >= 86400 then
return format("|cffffffff%s%d|r%s |cffffffff%d|r:|cffffffff%02d|r", negative, duration/86400, L_DAY_ONELETTER_ABBR, mod(duration/3600, 24), mod(duration/60, 60))
else
return format("|cffffffff%s%d|r:|cffffffff%02d|r", negative, duration/3600, mod(duration/60, 60))
end
else
if not duration or duration >= 86400*36500 then -- 100 years
return format("|cffffffff%s**|r%s |cffffffff**|r:|cffffffff**|r:|cffffffff**|r", negative, L_DAY_ONELETTER_ABBR)
elseif duration >= 86400 then
return format("|cffffffff%s%d|r%s |cffffffff%d|r:|cffffffff%02d|r:|cffffffff%02d|r", negative, duration/86400, L_DAY_ONELETTER_ABBR, mod(duration/3600, 24), mod(duration/60, 60), mod(duration, 60))
elseif duration >= 3600 then
return format("|cffffffff%s%d|r:|cffffffff%02d|r:|cffffffff%02d|r", negative, duration/3600, mod(duration/60, 60), mod(duration, 60))
else
return format("|cffffffff%s%d|r:|cffffffff%02d|r", negative, duration/60, mod(duration, 60))
end
end
end
end
 
local function compat()
local Abacus20 = setmetatable({}, {__index = function(self, key)
if type(Abacus[key]) == "function" then
self[key] = function(self, ...)
return Abacus[key](Abacus, ...)
end
else
self[key] = Abacus[key]
end
return self[key]
end})
AceLibrary:Register(Abacus20, "Abacus-2.0", MINOR_VERSION*1000)
end
if AceLibrary then
compat()
elseif Rock then
function Abacus:OnLibraryLoad(major, instance)
if major == "AceLibrary" then
compat()
end
end
end
EasyDaily-Beta/libs/LibAbacus-3.0/lib.xml New file
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="LibAbacus-3.0.lua" />
</Ui>
\ No newline at end of file
EasyDaily-Beta/libs/AceBucket-3.0/AceBucket-3.0.xml New file
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="AceBucket-3.0.lua"/>
</Ui>
\ No newline at end of file
EasyDaily-Beta/libs/AceBucket-3.0/AceBucket-3.0.lua New file
0,0 → 1,257
--[[ $Id: AceBucket-3.0.lua 609 2008-03-26 08:48:54Z nevcairiel $ ]]
 
--[[
This Bucket implementation works as follows:
-- Initially, no schedule is running, and its waiting for the first event to happen.
-- The first event will start the bucket, and get the scheduler running, which will collect all
events in the given interval. When that interval is reached, the bucket is pushed to the
callback and a new schedule is started. When a bucket is empty after its interval, the scheduler is
stopped, and the bucket is only listening for the next event to happen, basicly back in initial state.
]]
 
local MAJOR, MINOR = "AceBucket-3.0", 3
local AceBucket, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
 
if not AceBucket then return end -- No Upgrade needed
 
AceBucket.buckets = AceBucket.buckets or {}
AceBucket.embeds = AceBucket.embeds or {}
 
-- the libraries will be lazyly bound later, to avoid errors due to loading order issues
local AceEvent, AceTimer
 
-- local upvalues
local type = type
local next = next
local pairs = pairs
local select = select
local tonumber = tonumber
local tostring = tostring
 
local bucketCache = setmetatable({}, {__mode='k'})
 
--[[
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", table.concat(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, ...)
return Dispatchers[select('#', ...)](func, ...)
end
 
-- FireBucket ( bucket )
--
-- send the bucket to the callback function and schedule the next FireBucket in interval seconds
local function FireBucket(bucket)
local received = bucket.received
 
-- we dont want to fire empty buckets
if next(received) then
local callback = bucket.callback
if type(callback) == "string" then
safecall(bucket.object[callback], bucket.object, received)
else
safecall(callback, received)
end
 
for k in pairs(received) do
received[k] = nil
end
 
-- if the bucket was not empty, schedule another FireBucket in interval seconds
bucket.timer = AceTimer.ScheduleTimer(bucket, FireBucket, bucket.interval, bucket)
else -- if it was empty, clear the timer and wait for the next event
bucket.timer = nil
end
end
 
-- BucketHandler ( event, arg1 )
--
-- callback func for AceEvent
-- stores arg1 in the received table, and schedules the bucket if necessary
local function BucketHandler(self, event, arg1)
if arg1 == nil then
arg1 = "nil"
end
 
self.received[arg1] = (self.received[arg1] or 0) + 1
 
-- if we are not scheduled yet, start a timer on the interval for our bucket to be cleared
if not self.timer then
self.timer = AceTimer.ScheduleTimer(self, FireBucket, self.interval, self)
end
end
 
-- RegisterBucket( event, interval, callback, isMessage )
--
-- event(string or table) - the event, or a table with the events, that this bucket listens to
-- interval(int) - time between bucket fireings
-- callback(func or string) - function pointer, or method name of the object, that gets called when the bucket is cleared
-- isMessage(boolean) - register AceEvent Messages instead of game events
local function RegisterBucket(self, event, interval, callback, isMessage)
-- try to fetch the librarys
if not AceEvent or not AceTimer then
AceEvent = LibStub:GetLibrary("AceEvent-3.0", true)
AceTimer = LibStub:GetLibrary("AceTimer-3.0", true)
if not AceEvent or not AceTimer then
error(MAJOR .. " requires AceEvent-3.0 and AceTimer-3.0", 3)
end
end
 
if type(event) ~= "string" and type(event) ~= "table" then error("Usage: RegisterBucket(event, interval, callback): 'event' - string or table expected.", 3) end
if not callback then
if type(event) == "string" then
callback = event
else
error("Usage: RegisterBucket(event, interval, callback): cannot omit callback when event is not a string.", 3)
end
end
if not tonumber(interval) then error("Usage: RegisterBucket(event, interval, callback): 'interval' - number expected.", 3) end
if type(callback) ~= "string" and type(callback) ~= "function" then error("Usage: RegisterBucket(event, interval, callback): 'callback' - string or function or nil expected.", 3) end
if type(callback) == "string" and type(self[callback]) ~= "function" then error("Usage: RegisterBucket(event, interval, callback): 'callback' - method not found on target object.", 3) end
 
local bucket = next(bucketCache)
if bucket then
bucketCache[bucket] = nil
else
bucket = { handler = BucketHandler, received = {} }
end
bucket.object, bucket.callback, bucket.interval = self, callback, tonumber(interval)
 
local regFunc = isMessage and AceEvent.RegisterMessage or AceEvent.RegisterEvent
 
if type(event) == "table" then
for _,e in pairs(event) do
regFunc(bucket, e, "handler")
end
else
regFunc(bucket, event, "handler")
end
 
local handle = tostring(bucket)
AceBucket.buckets[handle] = bucket
 
return handle
end
 
-- AceBucket:RegisterBucketEvent(event, interval, callback)
-- AceBucket:RegisterBucketMessage(message, interval, callback)
--
-- event/message(string or table) - the event, or a table with the events, that this bucket listens to
-- interval(int) - time between bucket fireings
-- callback(func or string) - function pointer, or method name of the object, that gets called when the bucket is cleared
function AceBucket:RegisterBucketEvent(event, interval, callback)
return RegisterBucket(self, event, interval, callback, false)
end
 
function AceBucket:RegisterBucketMessage(message, interval, callback)
return RegisterBucket(self, message, interval, callback, true)
end
 
-- AceBucket:UnregisterBucket ( handle )
-- handle - the handle of the bucket as returned by RegisterBucket*
--
-- will unregister any events and messages from the bucket and clear any remaining data
function AceBucket:UnregisterBucket(handle)
local bucket = AceBucket.buckets[handle]
if bucket then
AceEvent.UnregisterAllEvents(bucket)
AceEvent.UnregisterAllMessages(bucket)
 
-- clear any remaining data in the bucket
for k in pairs(bucket.received) do
bucket.received[k] = nil
end
 
if bucket.timer then
AceTimer.CancelTimer(bucket, bucket.timer)
bucket.timer = nil
end
 
AceBucket.buckets[handle] = nil
-- store our bucket in the cache
bucketCache[bucket] = true
end
end
 
-- AceBucket:UnregisterAllBuckets()
--
-- will unregister all bucketed events.
function AceBucket:UnregisterAllBuckets()
-- hmm can we do this more efficient? (it is not done often so shouldn't matter much)
for handle, bucket in pairs(AceBucket.buckets) do
if bucket.object == self then
AceBucket.UnregisterBucket(self, handle)
end
end
end
 
 
 
--- embedding and embed handling
 
local mixins = {
"RegisterBucketEvent",
"RegisterBucketMessage",
"UnregisterBucket",
"UnregisterAllBuckets",
}
 
-- AceBucket:Embed( target )
-- target (object) - target object to embed AceBucket in
--
-- Embeds AceBucket into the target object making the functions from the mixins list available on target:..
function AceBucket:Embed( target )
for _, v in pairs( mixins ) do
target[v] = self[v]
end
self.embeds[target] = true
return target
end
 
--AceBucket:OnEmbedDisable( target )
-- target (object) - target object that AceBucket is embedded in.
--
-- Disables all buckets registered on the object
function AceBucket:OnEmbedDisable( target )
target:UnregisterAllBuckets()
end
 
for addon in pairs(AceBucket.embeds) do
AceBucket:Embed(addon)
end
EasyDaily-Beta/libs/CallbackHandler-1.0/CallbackHandler-1.0.xml New file
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>
\ No newline at end of file
EasyDaily-Beta/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua New file
0,0 → 1,239
--[[ $Id: CallbackHandler-1.0.lua 504 2008-02-07 11:04:06Z nevcairiel $ ]]
local MAJOR, MINOR = "CallbackHandler-1.0", 3
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}
 
local type = type
local pcall = pcall
local pairs = pairs
local assert = assert
local concat = table.concat
local loadstring = loadstring
local next = next
local select = select
local type = type
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", concat(OLD_ARGS, ", ")):gsub("ARGS", concat(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, OnUsed, OnUnused)
-- TODO: Remove this after beta has gone out
assert(not OnUsed and not OnUnused, "ACE-80: OnUsed/OnUnused are deprecated. Callbacks are now done to registry.OnUsed and registry.OnUnused")
 
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"
if type(self)~="table" and type(self)~="string" then
error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string 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.
 
EasyDaily-Beta/libs/AceTimer-3.0/AceTimer-3.0.xml New file
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="AceTimer-3.0.lua"/>
</Ui>
\ No newline at end of file
EasyDaily-Beta/libs/AceTimer-3.0/AceTimer-3.0.lua New file
0,0 → 1,414
--[[ $Id: AceTimer-3.0.lua 639 2008-05-16 08:49:42Z ammo $ ]]
--[[
Basic assumptions:
* In a typical system, we do more re-scheduling per second than there are timer pulses per second
* Regardless of timer implementation, we cannot guarantee timely delivery due to FPS restriction (may be as low as 10)
 
This implementation:
CON: The smallest timer interval is constrained by HZ (currently 1/10s).
PRO: It will still correctly fire any timer slower than HZ over a length of time, e.g. 0.11s interval -> 90 times over 10 seconds
PRO: In lag bursts, the system simly skips missed timer intervals to decrease load
CON: Algorithms depending on a timer firing "N times per minute" will fail
PRO: (Re-)scheduling is O(1) with a VERY small constant. It's a simple linked list insertion in a hash bucket.
CAUTION: The BUCKETS constant constrains how many timers can be efficiently handled. With too many hash collisions, performance will decrease.
 
Major assumptions upheld:
- ALLOWS scheduling multiple timers with the same funcref/method
- ALLOWS scheduling more timers during OnUpdate processing
- ALLOWS unscheduling ANY timer (including the current running one) at any time, including during OnUpdate processing
]]
 
local MAJOR, MINOR = "AceTimer-3.0", 4
local AceTimer, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
 
if not AceTimer then return end -- No upgrade needed
 
AceTimer.hash = AceTimer.hash or {} -- Array of [0..BUCKET-1] = linked list of timers (using .next member)
-- Linked list gets around ACE-88 and ACE-90.
AceTimer.selfs = AceTimer.selfs or {} -- Array of [self]={[handle]=timerobj, [handle2]=timerobj2, ...}
AceTimer.frame = AceTimer.frame or CreateFrame("Frame", "AceTimer30Frame")
 
local type = type
local next = next
local pairs = pairs
local select = select
local tostring = tostring
local floor = floor
local max = max
 
-- Simple ONE-SHOT timer cache. Much more efficient than a full compost for our purposes.
local timerCache = nil
 
--[[
Timers will not be fired more often than HZ-1 times per second.
Keep at intended speed PLUS ONE or we get bitten by floating point rounding errors (n.5 + 0.1 can be n.599999)
If this is ever LOWERED, all existing timers need to be enforced to have a delay >= 1/HZ on lib upgrade.
If this number is ever changed, all entries need to be rehashed on lib upgrade.
]]
local HZ = 11
 
--[[
Prime for good distribution
If this number is ever changed, all entries need to be rehashed on lib upgrade.
]]
local BUCKETS = 131
 
local hash = AceTimer.hash
for i=1,BUCKETS do
hash[i] = hash[i] or false -- make it an integer-indexed array; it's faster than hashes
end
 
--[[
xpcall safecall implementation
]]
local xpcall = xpcall
 
local function errorhandler(err)
return geterrorhandler()(err)
end
 
local function CreateDispatcher(argCount)
local code = [[
local xpcall, eh = ... -- our arguments are received as unnamed values in "..." since we don't have a proper function declaration
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", table.concat(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, ...)
return Dispatchers[select('#', ...)](func, ...)
end
 
local lastint = floor(GetTime() * HZ)
 
----------------------------------------------------------------------
-- OnUpdate handler
--
-- traverse buckets, always chasing "now", and fire timers that have expired
 
local function OnUpdate()
local now = GetTime()
local nowint = floor(now * HZ)
 
-- Have we passed into a new hash bucket?
if nowint == lastint then return end
 
local soon = now + 1 -- +1 is safe as long as 1 < HZ < BUCKETS/2
 
-- Pass through each bucket at most once
-- Happens on e.g. instance loads, but COULD happen on high local load situations also
for curint = (max(lastint, nowint - BUCKETS) + 1), nowint do -- loop until we catch up with "now", usually only 1 iteration
local curbucket = (curint % BUCKETS)+1
-- Yank the list of timers out of the bucket and empty it. This allows reinsertion in the currently-processed bucket from callbacks.
local nexttimer = hash[curbucket]
hash[curbucket] = false -- false rather than nil to prevent the array from becoming a hash
 
while nexttimer do
local timer = nexttimer
nexttimer = timer.next
local when = timer.when
 
if when < soon then
-- Call the timer func, either as a method on given object, or a straight function ref
local callback = timer.callback
if type(callback) == "string" then
safecall(timer.object[callback], timer.object, timer.arg)
elseif callback then
safecall(callback, timer.arg)
else
-- probably nilled out by CancelTimer
timer.delay = nil -- don't reschedule it
end
 
local delay = timer.delay -- NOW make a local copy, can't do it earlier in case the timer cancelled itself in the callback
 
if not delay then
-- single-shot timer (or cancelled)
AceTimer.selfs[timer.object][tostring(timer)] = nil
timerCache = timer
else
-- repeating timer
local newtime = when + delay
if newtime < now then -- Keep lag from making us firing a timer unnecessarily. (Note that this still won't catch too-short-delay timers though.)
newtime = now + delay
end
timer.when = newtime
 
-- add next timer execution to the correct bucket
local bucket = (floor(newtime * HZ) % BUCKETS) + 1
timer.next = hash[bucket]
hash[bucket] = timer
end
else -- if when>=soon
-- reinsert (yeah, somewhat expensive, but shouldn't be happening too often either due to hash distribution)
timer.next = hash[curbucket]
hash[curbucket] = timer
end -- if when<soon ... else
end -- while nexttimer do
end -- for curint=lastint,nowint
 
lastint = nowint
end
 
-----------------------------------------------------------------------
-- Reg( callback, delay, arg, repeating )
--
-- callback( function or string ) - direct function ref or method name in our object for the callback
-- delay(int) - delay for the timer
-- arg(variant) - any argument to be passed to the callback function
-- repeating(boolean) - repeating timer, or oneshot
--
-- returns the handle of the timer for later processing (canceling etc)
local function Reg(self, callback, delay, arg, repeating)
if type(callback) ~= "string" and type(callback) ~= "function" then
local error_origin = repeating and "ScheduleRepeatingTimer" or "ScheduleTimer"
error(MAJOR..": " .. error_origin .. "(callback, delay, arg): 'callback' - function or method name expected.", 3)
end
if type(callback) == "string" then
if type(self)~="table" then
local error_origin = repeating and "ScheduleRepeatingTimer" or "ScheduleTimer"
error(MAJOR..": " .. error_origin .. "(\"methodName\", delay, arg): 'self' - must be a table.", 3)
end
if type(self[callback]) ~= "function" then
local error_origin = repeating and "ScheduleRepeatingTimer" or "ScheduleTimer"
error(MAJOR..": " .. error_origin .. "(\"methodName\", delay, arg): 'methodName' - method not found on target object.", 3)
end
end
 
if delay < (1 / (HZ - 1)) then
delay = 1 / (HZ - 1)
end
 
-- Create and stuff timer in the correct hash bucket
local now = GetTime()
 
local timer = timerCache or {} -- Get new timer object (from cache if available)
timerCache = nil
 
timer.object = self
timer.callback = callback
timer.delay = (repeating and delay)
timer.arg = arg
timer.when = now + delay
 
local bucket = (floor((now+delay)*HZ) % BUCKETS) + 1
timer.next = hash[bucket]
hash[bucket] = timer
 
-- Insert timer in our self->handle->timer registry
local handle = tostring(timer)
 
local selftimers = AceTimer.selfs[self]
if not selftimers then
selftimers = {}
AceTimer.selfs[self] = selftimers
end
selftimers[handle] = timer
selftimers.__ops = (selftimers.__ops or 0) + 1
 
return handle
end
 
 
-----------------------------------------------------------------------
-- AceTimer:ScheduleTimer( callback, delay, arg )
-- AceTimer:ScheduleRepeatingTimer( callback, delay, arg )
--
-- callback( function or string ) - direct function ref or method name in our object for the callback
-- delay(int) - delay for the timer
-- arg(variant) - any argument to be passed to the callback function
--
-- returns a handle to the timer, which is used for cancelling it
function AceTimer:ScheduleTimer(callback, delay, arg)
return Reg(self, callback, delay, arg)
end
 
function AceTimer:ScheduleRepeatingTimer(callback, delay, arg)
return Reg(self, callback, delay, arg, true)
end
 
 
-----------------------------------------------------------------------
-- AceTimer:CancelTimer(handle)
--
-- handle - Opaque object given by ScheduleTimer
-- silent - true: Do not error if the timer does not exist / is already cancelled. Default: false
--
-- Cancels a timer with the given handle, registered by the same 'self' as given in ScheduleTimer
--
-- Returns true if a timer was cancelled
 
function AceTimer:CancelTimer(handle, silent)
if not handle then return end -- nil handle -> bail out without erroring
if type(handle)~="string" then
error(MAJOR..": CancelTimer(handle): 'handle' - expected a string", 2) -- for now, anyway
end
local selftimers = AceTimer.selfs[self]
local timer = selftimers and selftimers[handle]
if silent then
if timer then
timer.callback = nil -- don't run it again
timer.delay = nil -- if this is the currently-executing one: don't even reschedule
-- The timer object is removed in the OnUpdate loop
end
return not not timer -- might return "true" even if we double-cancel. we'll live.
else
if not timer then
geterrorhandler()(MAJOR..": CancelTimer(handle[, silent]): '"..tostring(handle).."' - no such timer registered")
return false
end
if not timer.callback then
geterrorhandler()(MAJOR..": CancelTimer(handle[, silent]): '"..tostring(handle).."' - timer already cancelled or expired")
return false
end
timer.callback = nil -- don't run it again
timer.delay = nil -- if this is the currently-executing one: don't even reschedule
return true
end
end
 
 
-----------------------------------------------------------------------
-- AceTimer:CancelAllTimers()
--
-- Cancels all timers registered to given 'self'
function AceTimer:CancelAllTimers()
if not(type(self)=="string" or type(self)=="table") then
error(MAJOR..": CancelAllTimers(): 'self' - must be a string or a table",2)
end
if self==AceTimer then
error(MAJOR..": CancelAllTimers(): supply a meaningful 'self'", 2)
end
 
local selftimers = AceTimer.selfs[self]
if selftimers then
for handle,v in pairs(selftimers) do
if type(v)=="table" then -- avoid __ops, etc
AceTimer.CancelTimer(self, handle, true)
end
end
end
end
 
 
 
-----------------------------------------------------------------------
-- PLAYER_REGEN_ENABLED: Run through our .selfs[] array step by step
-- and clean it out - otherwise the table indices can grow indefinitely
-- if an addon starts and stops a lot of timers. AceBucket does this!
--
-- See ACE-94 and tests/AceTimer-3.0-ACE-94.lua
 
local lastCleaned = nil
 
local function OnEvent(this, event)
if event~="PLAYER_REGEN_ENABLED" then
return
end
 
-- Get the next 'self' to process
local selfs = AceTimer.selfs
local self = next(selfs, lastCleaned)
if not self then
self = next(selfs)
end
lastCleaned = self
if not self then -- should only happen if .selfs[] is empty
return
end
 
-- Time to clean it out?
local list = selfs[self]
if (list.__ops or 0) < 250 then -- 250 slosh indices = ~10KB wasted (max!). For one 'self'.
return
end
 
-- Create a new table and copy all members over
local newlist = {}
local n=0
for k,v in pairs(list) do
newlist[k] = v
n=n+1
end
newlist.__ops = 0 -- Reset operation count
 
-- And since we now have a count of the number of live timers, check that it's reasonable. Emit a warning if not.
if n>BUCKETS then
DEFAULT_CHAT_FRAME:AddMessage(MAJOR..": Warning: The addon/module '"..tostring(self).."' has "..n.." live timers. Surely that's not intended?")
end
 
selfs[self] = newlist
end
 
-----------------------------------------------------------------------
-- Embed handling
 
AceTimer.embeds = AceTimer.embeds or {}
 
local mixins = {
"ScheduleTimer", "ScheduleRepeatingTimer",
"CancelTimer", "CancelAllTimers"
}
 
function AceTimer:Embed(target)
AceTimer.embeds[target] = true
for _,v in pairs(mixins) do
target[v] = AceTimer[v]
end
return target
end
 
--AceTimer:OnEmbedDisable( target )
-- target (object) - target object that AceTimer is embedded in.
--
-- cancel all timers registered for the object
function AceTimer:OnEmbedDisable( target )
target:CancelAllTimers()
end
 
 
for addon in pairs(AceTimer.embeds) do
AceTimer:Embed(addon)
end
 
-----------------------------------------------------------------------
-- Debug tools (expose copies of internals to test suites)
AceTimer.debug = AceTimer.debug or {}
AceTimer.debug.HZ = HZ
AceTimer.debug.BUCKETS = BUCKETS
 
-----------------------------------------------------------------------
-- Finishing touchups
 
AceTimer.frame:SetScript("OnUpdate", OnUpdate)
AceTimer.frame:SetScript("OnEvent", OnEvent)
AceTimer.frame:RegisterEvent("PLAYER_REGEN_ENABLED")
 
-- In theory, we should hide&show the frame based on there being timers or not.
-- However, this job is fairly expensive, and the chance that there will
-- actually be zero timers running is diminuitive to say the lest.
EasyDaily-Beta/libs/AceEvent-3.0/AceEvent-3.0.xml New file
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="AceEvent-3.0.lua"/>
</Ui>
\ No newline at end of file
EasyDaily-Beta/libs/AceEvent-3.0/AceEvent-3.0.lua New file
0,0 → 1,76
--[[ $Id: AceEvent-3.0.lua 494 2008-02-03 13:03:56Z nevcairiel $ ]]
local MAJOR, MINOR = "AceEvent-3.0", 3
local AceEvent = LibStub:NewLibrary(MAJOR, MINOR)
 
if not AceEvent then return end
 
local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
 
 
AceEvent.frame = AceEvent.frame or CreateFrame("Frame", "AceEvent30Frame") -- our event frame
AceEvent.embeds = AceEvent.embeds or {} -- what objects embed this lib
 
 
-- APIs and registry for blizzard events, using CallbackHandler lib
if not AceEvent.events then
AceEvent.events = CallbackHandler:New(AceEvent,
"RegisterEvent", "UnregisterEvent", "UnregisterAllEvents")
end
 
function AceEvent.events:OnUsed(target, eventname)
AceEvent.frame:RegisterEvent(eventname)
end
 
function AceEvent.events:OnUnused(target, eventname)
AceEvent.frame:UnregisterEvent(eventname)
end
 
 
-- APIs and registry for IPC messages, using CallbackHandler lib
if not AceEvent.messages then
AceEvent.messages = CallbackHandler:New(AceEvent,
"RegisterMessage", "UnregisterMessage", "UnregisterAllMessages"
)
AceEvent.SendMessage = AceEvent.messages.Fire
end
 
--- embedding and embed handling
local mixins = {
"RegisterEvent", "UnregisterEvent",
"RegisterMessage", "UnregisterMessage",
"SendMessage",
"UnregisterAllEvents", "UnregisterAllMessages",
}
 
-- AceEvent:Embed( target )
-- target (object) - target object to embed AceEvent in
--
-- Embeds AceEvent into the target object making the functions from the mixins list available on target:..
function AceEvent:Embed(target)
for k, v in pairs(mixins) do
target[v] = self[v]
end
self.embeds[target] = true
return target
end
 
-- AceEvent:OnEmbedDisable( target )
-- target (object) - target object that is being disabled
--
-- Unregister all events messages etc when the target disables.
-- this method should be called by the target manually or by an addon framework
function AceEvent:OnEmbedDisable(target)
target:UnregisterAllEvents()
target:UnregisterAllMessages()
end
 
-- Script to fire blizzard events into the event listeners
local events = AceEvent.events
AceEvent.frame:SetScript("OnEvent", function(this, event, ...)
events:Fire(event, ...)
end)
 
--- Finally: upgrade our old embeds
for target, v in pairs(AceEvent.embeds) do
AceEvent:Embed(target)
end
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDownGroup.lua New file
0,0 → 1,157
local AceGUI = LibStub("AceGUI-3.0")
 
--[[
Selection Group controls all have an interface to select a group for thier contents
None of them will auto size to thier contents, and should usually be used with a scrollframe
unless you know that the controls will fit inside
]]
 
--------------------------
-- Dropdown Group --
--------------------------
--[[
Events :
OnGroupSelected
 
]]
do
local Type = "DropdownGroup"
local Version = 9
 
local function OnAcquire(self)
self.dropdown:SetText("")
end
 
local function OnRelease(self)
self.frame:ClearAllPoints()
self.frame:Hide()
self.dropdown.list = nil
self.status = nil
for k in pairs(self.localstatus) do
self.localstatus[k] = nil
end
end
 
local PaneBackdrop = {
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true, tileSize = 16, edgeSize = 16,
insets = { left = 3, right = 3, top = 5, bottom = 3 }
}
 
local function SetTitle(self,title)
self.titletext:SetText(title)
end
 
 
local function SelectedGroup(self,event,value)
local group = self.parentgroup
local status = group.status or group.localstatus
status.selected = value
self.parentgroup:Fire("OnGroupSelected", value)
end
 
local function SetGroupList(self,list)
self.dropdown:SetList(list)
end
 
-- called to set an external table to store status in
local function SetStatusTable(self, status)
assert(type(status) == "table")
self.status = status
end
 
local function SetGroup(self,group)
self.dropdown:SetValue(group)
local status = self.status or self.localstatus
status.selected = group
self:Fire("OnGroupSelected", group)
end
 
local function OnWidthSet(self, width)
local content = self.content
local contentwidth = width - 26
if contentwidth < 0 then
contentwidth = 0
end
content:SetWidth(contentwidth)
content.width = contentwidth
end
 
 
local function OnHeightSet(self, height)
local content = self.content
local contentheight = height - 63
if contentheight < 0 then
contentheight = 0
end
content:SetHeight(contentheight)
content.height = contentheight
end
 
local function Constructor()
local frame = CreateFrame("Frame")
local self = {}
self.type = Type
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
 
self.SetTitle = SetTitle
self.SetGroupList = SetGroupList
self.SetGroup = SetGroup
self.SetStatusTable = SetStatusTable
self.OnWidthSet = OnWidthSet
self.OnHeightSet = OnHeightSet
 
self.localstatus = {}
 
self.frame = frame
frame.obj = self
 
 
frame:SetHeight(100)
frame:SetWidth(100)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
 
local titletext = frame:CreateFontString(nil,"OVERLAY","GameFontNormal")
titletext:SetPoint("TOPLEFT",frame,"TOPLEFT",14,0)
titletext:SetPoint("TOPRIGHT",frame,"TOPRIGHT",-14,0)
titletext:SetJustifyH("LEFT")
titletext:SetHeight(18)
 
 
self.titletext = titletext
 
local dropdown = AceGUI:Create("Dropdown")
self.dropdown = dropdown
dropdown.frame:SetParent(frame)
dropdown.parentgroup = self
dropdown:SetCallback("OnValueChanged",SelectedGroup)
 
dropdown.frame:SetPoint("TOPLEFT",titletext,"BOTTOMLEFT",-7,3)
dropdown.frame:Show()
dropdown:SetLabel("")
 
local border = CreateFrame("Frame",nil,frame)
self.border = border
border:SetPoint("TOPLEFT",frame,"TOPLEFT",3,-40)
border:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-3,3)
 
border:SetBackdrop(PaneBackdrop)
border:SetBackdropColor(0.1,0.1,0.1,0.5)
border:SetBackdropBorderColor(0.4,0.4,0.4)
 
--Container Support
local content = CreateFrame("Frame",nil,border)
self.content = content
content.obj = self
content:SetPoint("TOPLEFT",border,"TOPLEFT",10,-10)
content:SetPoint("BOTTOMRIGHT",border,"BOTTOMRIGHT",-10,10)
 
AceGUI:RegisterAsContainer(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-ScrollFrame.lua New file
0,0 → 1,225
local AceGUI = LibStub("AceGUI-3.0")
 
-------------
-- Widgets --
-------------
--[[
Widgets must provide the following functions
Acquire() - Called when the object is aquired, should set everything to a default hidden state
Release() - Called when the object is Released, should remove any anchors and hide the Widget
 
And the following members
frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
type - the type of the object, same as the name given to :RegisterWidget()
 
Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
It will be cleared automatically when a widget is released
Placing values directly into a widget object should be avoided
 
If the Widget can act as a container for other Widgets the following
content - frame or derivitive that children will be anchored to
 
The Widget can supply the following Optional Members
 
 
]]
 
--------------------------
-- Scroll Frame --
--------------------------
do
local Type = "ScrollFrame"
local Version = 3
 
local function OnAcquire(self)
 
end
 
local function OnRelease(self)
self.frame:ClearAllPoints()
self.frame:Hide()
self.status = nil
for k in pairs(self.localstatus) do
self.localstatus[k] = nil
end
end
 
local function SetScroll(self, value)
 
local status = self.status or self.localstatus
 
local frame, child = self.scrollframe, self.content
local viewheight = frame:GetHeight()
local height = child:GetHeight()
local offset
if viewheight > height then
offset = 0
else
offset = floor((height - viewheight) / 1000.0 * value)
end
child:ClearAllPoints()
child:SetPoint("TOPLEFT",frame,"TOPLEFT",0,offset)
child:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,offset)
status.offset = offset
status.scrollvalue = value
end
 
local function MoveScroll(self, value)
local status = self.status or self.localstatus
local frame, child = self.scrollframe, self.content
local height, viewheight = frame:GetHeight(), child:GetHeight()
if height > viewheight then
self.scrollbar:Hide()
else
self.scrollbar:Show()
local diff = height - viewheight
local delta = 1
if value < 0 then
delta = -1
end
self.scrollbar:SetValue(math.min(math.max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
end
end
 
 
local function FixScroll(self)
local status = self.status or self.localstatus
local frame, child = self.scrollframe, self.content
local height, viewheight = frame:GetHeight(), child:GetHeight()
local offset = status.offset
if not offset then
offset = 0
end
local curvalue = self.scrollbar:GetValue()
if viewheight < height then
self.scrollbar:Hide()
self.scrollbar:SetValue(0)
--self.scrollframe:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT",0,0)
else
self.scrollbar:Show()
--self.scrollframe:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT",-16,0)
local value = (offset / (viewheight - height) * 1000)
if value > 1000 then value = 1000 end
self.scrollbar:SetValue(value)
self:SetScroll(value)
if value < 1000 then
child:ClearAllPoints()
child:SetPoint("TOPLEFT",frame,"TOPLEFT",0,offset)
child:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,offset)
status.offset = offset
end
end
end
 
local function OnMouseWheel(this,value)
this.obj:MoveScroll(value)
end
 
local function OnScrollValueChanged(this, value)
this.obj:SetScroll(value)
end
 
local function FixScrollOnUpdate(this)
this:SetScript("OnUpdate", nil)
this.obj:FixScroll()
end
local function OnSizeChanged(this)
--this:SetScript("OnUpdate", FixScrollOnUpdate)
this.obj:FixScroll()
end
 
local function LayoutFinished(self,width,height)
self.content:SetHeight(height or 0 + 20)
self:FixScroll()
end
 
-- called to set an external table to store status in
local function SetStatusTable(self, status)
assert(type(status) == "table")
self.status = status
if not status.scrollvalue then
status.scrollvalue = 0
end
end
 
 
local createdcount = 0
 
local function OnWidthSet(self, width)
local content = self.content
content.width = width
end
 
 
local function OnHeightSet(self, height)
local content = self.content
content.height = height
end
 
local function Constructor()
local frame = CreateFrame("Frame",nil,UIParent)
local self = {}
self.type = Type
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
 
self.MoveScroll = MoveScroll
self.FixScroll = FixScroll
self.SetScroll = SetScroll
self.LayoutFinished = LayoutFinished
self.SetStatusTable = SetStatusTable
self.OnWidthSet = OnWidthSet
self.OnHeightSet = OnHeightSet
 
self.localstatus = {}
self.frame = frame
frame.obj = self
 
--Container Support
local scrollframe = CreateFrame("ScrollFrame",nil,frame)
local content = CreateFrame("Frame",nil,scrollframe)
createdcount = createdcount + 1
local scrollbar = CreateFrame("Slider",("AceConfigDialogScrollFrame%dScrollBar"):format(createdcount),scrollframe,"UIPanelScrollBarTemplate")
local scrollbg = scrollbar:CreateTexture(nil,"BACKGROUND")
scrollbg:SetAllPoints(scrollbar)
scrollbg:SetTexture(0,0,0,0.4)
self.scrollframe = scrollframe
self.content = content
self.scrollbar = scrollbar
 
scrollbar.obj = self
scrollframe.obj = self
content.obj = self
 
scrollframe:SetScrollChild(content)
scrollframe:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
scrollframe:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT",-16,0)
scrollframe:EnableMouseWheel(true)
scrollframe:SetScript("OnMouseWheel", OnMouseWheel)
scrollframe:SetScript("OnSizeChanged", OnSizeChanged)
 
 
content:SetPoint("TOPLEFT",scrollframe,"TOPLEFT",0,0)
content:SetPoint("TOPRIGHT",scrollframe,"TOPRIGHT",0,0)
content:SetHeight(400)
 
scrollbar:SetPoint("TOPLEFT",scrollframe,"TOPRIGHT",0,-16)
scrollbar:SetPoint("BOTTOMLEFT",scrollframe,"BOTTOMRIGHT",0,16)
scrollbar:SetScript("OnValueChanged", OnScrollValueChanged)
scrollbar:SetMinMaxValues(0,1000)
scrollbar:SetValueStep(1)
scrollbar:SetValue(0)
scrollbar:SetWidth(16)
 
self.localstatus.scrollvalue = 0
 
 
self:FixScroll()
AceGUI:RegisterAsContainer(self)
--AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua New file
0,0 → 1,81
local AceGUI = LibStub("AceGUI-3.0")
 
--------------------------
-- Button --
--------------------------
do
local Type = "Button"
local Version = 7
 
local function OnAcquire(self)
end
 
local function OnRelease(self)
self.frame:ClearAllPoints()
self.frame:Hide()
self:SetDisabled(false)
end
 
local function Button_OnClick(this)
this.obj:Fire("OnClick")
AceGUI:ClearFocus()
end
 
local function Button_OnEnter(this)
this.obj:Fire("OnEnter")
end
 
local function Button_OnLeave(this)
this.obj:Fire("OnLeave")
end
 
local function SetText(self, text)
self.text:SetText(text or "")
end
 
local function SetDisabled(self, disabled)
self.disabled = disabled
if disabled then
self.frame:Disable()
else
self.frame:Enable()
end
end
 
local function Constructor()
local num = AceGUI:GetNextWidgetNum(Type)
local frame = CreateFrame("Button","AceGUI30Button"..num,UIParent,"UIPanelButtonTemplate2")
local self = {}
self.num = num
self.type = Type
self.frame = frame
 
local text = frame:GetFontString()
self.text = text
text:SetPoint("LEFT",frame,"LEFT",15,0)
text:SetPoint("RIGHT",frame,"RIGHT",-15,0)
 
frame:SetScript("OnClick",Button_OnClick)
frame:SetScript("OnEnter",Button_OnEnter)
frame:SetScript("OnLeave",Button_OnLeave)
 
self.SetText = SetText
self.SetDisabled = SetDisabled
 
frame:EnableMouse(true)
 
frame:SetHeight(24)
frame:SetWidth(200)
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
 
self.frame = frame
frame.obj = self
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua New file
0,0 → 1,453
--[[ $Id: AceGUIWidget-DropDown-Items.lua 656 2008-05-31 11:47:08Z nargiddley $ ]]--
 
local AceGUI = LibStub("AceGUI-3.0")
 
local function fixlevels(parent,...)
local i = 1
local child = select(i, ...)
while child do
child:SetFrameLevel(parent:GetFrameLevel()+1)
fixlevels(child, child:GetChildren())
i = i + 1
child = select(i, ...)
end
end
 
local function fixstrata(strata, parent, ...)
local i = 1
local child = select(i, ...)
parent:SetFrameStrata(strata)
while child do
fixstrata(strata, child, child:GetChildren())
i = i + 1
child = select(i, ...)
end
end
 
-- ItemBase is the base "class" for all dropdown items.
-- Each item has to use ItemBase.Create(widgetType) to
-- create an initial 'self' value.
-- ItemBase will add common functions and ui event handlers.
-- Be sure to keep basic usage when you override functions.
 
local ItemBase = {
-- NOTE: The ItemBase version is added to each item's version number
-- to ensure proper updates on ItemBase changes.
-- Use at least 1000er steps.
version = 1000,
counter = 0,
}
 
function ItemBase.Frame_OnEnter(this)
local self = this.obj
 
if self.useHighlight then
self.highlight:Show()
end
self:Fire("OnEnter")
 
if self.specialOnEnter then
self.specialOnEnter(self)
end
end
 
function ItemBase.Frame_OnLeave(this)
local self = this.obj
 
self.highlight:Hide()
self:Fire("OnLeave")
 
if self.specialOnLeave then
self.specialOnLeave(self)
end
end
 
-- exported, AceGUI callback
function ItemBase.OnAcquire(self)
self.frame:SetToplevel(true)
self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
end
 
-- exported, AceGUI callback
function ItemBase.OnRelease(self)
self:SetDisabled(false)
self.pullout = nil
self.frame:SetParent(nil)
self.frame:ClearAllPoints()
self.frame:Hide()
end
 
-- exported
-- NOTE: this is called by a Dropdown-Pullout.
-- Do not call this method directly
function ItemBase.SetPullout(self, pullout)
self.pullout = pullout
 
self.frame:SetParent(nil)
self.frame:SetParent(pullout.itemFrame)
self.parent = pullout.itemFrame
fixlevels(pullout.itemFrame, pullout.itemFrame:GetChildren())
end
 
-- exported
function ItemBase.SetText(self, text)
self.text:SetText(text or "")
end
 
-- exported
function ItemBase.GetText(self)
return self.text:GetText()
end
 
-- exported
function ItemBase.SetPoint(self, ...)
self.frame:SetPoint(...)
end
 
-- exported
function ItemBase.Show(self)
self.frame:Show()
end
 
-- exported
function ItemBase.Hide(self)
self.frame:Hide()
end
 
-- exported
function ItemBase.SetDisabled(self, disabled)
self.disabled = disabled
if disabled then
self.useHighlight = false
self.text:SetTextColor(.5, .5, .5)
else
self.useHighlight = true
self.text:SetTextColor(1, 1, 1)
end
end
 
-- exported
-- NOTE: this is called by a Dropdown-Pullout.
-- Do not call this method directly
function ItemBase.SetOnLeave(self, func)
self.specialOnLeave = func
end
 
-- exported
-- NOTE: this is called by a Dropdown-Pullout.
-- Do not call this method directly
function ItemBase.SetOnEnter(self, func)
self.specialOnEnter = func
end
 
function ItemBase.Create(type)
-- NOTE: Most of the following code is copied from AceGUI-3.0/Dropdown widget
local count = AceGUI:GetNextWidgetNum(type)
local frame = CreateFrame("Button", "AceGUI30DropDownItem"..count)
local self = {}
self.frame = frame
frame.obj = self
self.type = type
 
self.useHighlight = true
 
frame:SetHeight(17)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
 
local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
text:SetTextColor(1,1,1)
text:SetJustifyH("LEFT")
text:SetPoint("TOPLEFT",frame,"TOPLEFT",18,0)
text:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-8,0)
self.text = text
 
local highlight = frame:CreateTexture(nil, "OVERLAY")
highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
highlight:SetBlendMode("ADD")
highlight:SetHeight(14)
highlight:ClearAllPoints()
highlight:SetPoint("RIGHT",frame,"RIGHT",-3,0)
highlight:SetPoint("LEFT",frame,"LEFT",5,0)
highlight:Hide()
self.highlight = highlight
 
local check = frame:CreateTexture("OVERLAY")
check:SetWidth(16)
check:SetHeight(16)
check:SetPoint("LEFT",frame,"LEFT",3,-1)
check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
check:Hide()
self.check = check
 
local sub = frame:CreateTexture("OVERLAY")
sub:SetWidth(16)
sub:SetHeight(16)
sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
sub:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow")
sub:Hide()
self.sub = sub
 
frame:SetScript("OnEnter", ItemBase.Frame_OnEnter)
frame:SetScript("OnLeave", ItemBase.Frame_OnLeave)
 
self.OnAcquire = ItemBase.OnAcquire
self.OnRelease = ItemBase.OnRelease
 
self.SetPullout = ItemBase.SetPullout
self.GetText = ItemBase.GetText
self.SetText = ItemBase.SetText
self.SetDisabled = ItemBase.SetDisabled
 
self.SetPoint = ItemBase.SetPoint
self.Show = ItemBase.Show
self.Hide = ItemBase.Hide
 
self.SetOnLeave = ItemBase.SetOnLeave
self.SetOnEnter = ItemBase.SetOnEnter
 
return self
end
 
--[[
Template for items:
 
-- Item:
--
do
local widgetType = "Dropdown-Item-"
local widgetVersion = 1
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
--]]
 
-- Item: Header
-- A single text entry.
-- Special: Different text color and no highlight
do
local widgetType = "Dropdown-Item-Header"
local widgetVersion = 1
 
local function OnEnter(this)
local self = this.obj
self:Fire("OnEnter")
 
if self.specialOnEnter then
self.specialOnEnter(self)
end
end
 
local function OnLeave(this)
local self = this.obj
self:Fire("OnLeave")
 
if self.specialOnLeave then
self.specialOnLeave(self)
end
end
 
-- exported, override
local function SetDisabled(self, disabled)
ItemBase.SetDisabled(self, disabled)
if not disabled then
self.text:SetTextColor(1, 1, 0)
end
end
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
self.SetDisabled = SetDisabled
 
self.frame:SetScript("OnEnter", OnEnter)
self.frame:SetScript("OnLeave", OnLeave)
 
self.text:SetTextColor(1, 1, 0)
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
 
-- Item: Execute
-- A simple button
do
local widgetType = "Dropdown-Item-Execute"
local widgetVersion = 1
 
local function Frame_OnClick(this, button)
local self = this.obj
if self.disabled then return end
self:Fire("OnClick")
if self.pullout then
self.pullout:Close()
end
end
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
self.frame:SetScript("OnClick", Frame_OnClick)
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
 
-- Item: Toggle
-- Some sort of checkbox for dropdown menus.
-- Does not close the pullout on click.
do
local widgetType = "Dropdown-Item-Toggle"
local widgetVersion = 2
 
local function UpdateToggle(self)
if self.value then
self.check:Show()
else
self.check:Hide()
end
end
 
local function OnRelease(self)
ItemBase.OnRelease(self)
self:SetValue(nil)
end
 
local function Frame_OnClick(this, button)
local self = this.obj
if self.disabled then return end
self.value = not self.value
UpdateToggle(self)
self:Fire("OnValueChanged", self.value)
end
 
-- exported
local function SetValue(self, value)
self.value = value
UpdateToggle(self)
end
 
-- exported
local function GetValue(self)
return self.value
end
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
self.frame:SetScript("OnClick", Frame_OnClick)
 
self.SetValue = SetValue
self.GetValue = GetValue
self.OnRelease = OnRelease
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
 
-- Item: Menu
-- Shows a submenu on mouse over
-- Does not close the pullout on click
do
local widgetType = "Dropdown-Item-Menu"
local widgetVersion = 1
 
local function OnEnter(this)
local self = this.obj
self:Fire("OnEnter")
 
if self.specialOnEnter then
self.specialOnEnter(self)
end
 
self.highlight:Show()
 
if not self.disabled and self.submenu then
self.submenu:Open("TOPLEFT", self.frame, "TOPRIGHT", self.pullout:GetRightBorderWidth(), 0, self.frame:GetFrameLevel() + 100)
end
end
 
local function OnHide(this)
local self = this.obj
if self.submenu then
self.submenu:Close()
end
end
 
-- exported
function SetMenu(self, menu)
assert(menu.type == "Dropdown-Pullout")
self.submenu = menu
end
 
-- exported
function CloseMenu(self)
self.submenu:Close()
end
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
self.sub:Show()
 
self.frame:SetScript("OnEnter", OnEnter)
self.frame:SetScript("OnHide", OnHide)
 
self.SetMenu = SetMenu
self.CloseMenu = CloseMenu
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
 
-- Item: Separator
-- A single line to separate items
do
local widgetType = "Dropdown-Item-Separator"
local widgetVersion = 1
 
-- exported, override
local function SetDisabled(self, disabled)
ItemBase.SetDisabled(self, disabled)
self.useHighlight = false
end
 
local function Constructor()
local self = ItemBase.Create(widgetType)
 
self.SetDisabled = SetDisabled
 
local line = self.frame:CreateTexture(nil, "OVERLAY")
line:SetHeight(1)
line:SetTexture(.5, .5, .5)
line:SetPoint("LEFT", self.frame, "LEFT", 10, 0)
line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0)
 
self.text:Hide()
 
self.useHighlight = false
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
end
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-TreeGroup.lua New file
0,0 → 1,673
local AceGUI = LibStub("AceGUI-3.0")
 
-- Recycling functions
local new, del
do
local pool = setmetatable({},{__mode='k'})
function new()
local t = next(pool)
if t then
pool[t] = nil
return t
else
return {}
end
end
function del(t)
for k in pairs(t) do
t[k] = nil
end
pool[t] = true
end
end
 
--------------
-- TreeView --
--------------
 
do
local Type = "TreeGroup"
local Version = 16
 
local DEFAULT_TREE_WIDTH = 175
local DEFAULT_TREE_SIZABLE = true
 
local PaneBackdrop = {
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true, tileSize = 16, edgeSize = 16,
insets = { left = 3, right = 3, top = 5, bottom = 3 }
}
 
local DraggerBackdrop = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = nil,
tile = true, tileSize = 16, edgeSize = 0,
insets = { left = 3, right = 3, top = 7, bottom = 7 }
}
 
local function OnAcquire(self)
self:SetTreeWidth(DEFAULT_TREE_WIDTH,DEFAULT_TREE_SIZABLE)
self:EnableButtonTooltips(true)
end
 
local function OnRelease(self)
 
self.frame:ClearAllPoints()
self.frame:Hide()
self.status = nil
for k, v in pairs(self.localstatus) do
if k == "groups" then
for k2 in pairs(v) do
v[k2] = nil
end
else
self.localstatus[k] = nil
end
end
self.localstatus.scrollvalue = 0
self.localstatus.treewidth = DEFAULT_TREE_WIDTH
self.localstatus.treesizable = DEFAULT_TREE_SIZABLE
end
 
local function GetButtonParents(line)
local parent = line.parent
if parent and parent.value then
return parent.value, GetButtonParents(parent)
end
end
 
local function GetButtonUniqueValue(line)
local parent = line.parent
if parent and parent.value then
return GetButtonUniqueValue(parent).."\001"..line.value
else
return line.value
end
end
 
local function ButtonOnClick(this)
local self = this.obj
self:Fire("OnClick",this.uniquevalue, this.selected)
if not this.selected then
self:SetSelected(this.uniquevalue)
this.selected = true
this:LockHighlight()
self:RefreshTree()
end
AceGUI:ClearFocus()
end
 
local function ExpandOnClick(this)
local button = this.button
local self = button.obj
local status = (self.status or self.localstatus).groups
status[button.uniquevalue] = not status[button.uniquevalue]
self:RefreshTree()
end
 
local function ButtonOnDoubleClick(button)
local self = button.obj
local status = self.status or self.localstatus
local status = (self.status or self.localstatus).groups
status[button.uniquevalue] = not status[button.uniquevalue]
self:RefreshTree()
end
 
local function EnableButtonTooltips(self, enable)
self.enabletooltips = enable
end
 
local function Button_OnEnter(this)
local self = this.obj
self:Fire("OnButtonEnter", this.uniquevalue, this)
 
if self.enabletooltips then
GameTooltip:SetOwner(this, "ANCHOR_NONE")
GameTooltip:SetPoint("LEFT",this,"RIGHT")
GameTooltip:SetText(this.text:GetText(), 1, .82, 0, 1)
 
GameTooltip:Show()
end
end
 
local function Button_OnLeave(this)
local self = this.obj
self:Fire("OnButtonLeave", this.uniquevalue, this)
 
if self.enabletooltips then
GameTooltip:Hide()
end
end
 
 
local buttoncount = 1
local function CreateButton(self)
local button = CreateFrame("Button",("AceGUI30TreeButton%d"):format(buttoncount),self.treeframe, "OptionsListButtonTemplate")
buttoncount = buttoncount + 1
button.obj = self
 
button:SetScript("OnClick",ButtonOnClick)
button:SetScript("OnDoubleClick", ButtonOnDoubleClick)
button:SetScript("OnEnter",Button_OnEnter)
button:SetScript("OnLeave",Button_OnLeave)
 
button.toggle.button = button
button.toggle:SetScript("OnClick",ExpandOnClick)
 
return button
end
 
local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
local self = button.obj
local toggle = button.toggle
local frame = self.frame
local text = treeline.text or ""
local level = treeline.level
local value = treeline.value
local uniquevalue = treeline.uniquevalue
local disabled = treeline.disabled
 
button.treeline = treeline
button.value = value
button.uniquevalue = uniquevalue
if selected then
button:LockHighlight()
button.selected = true
else
button:UnlockHighlight()
button.selected = false
end
local normalText = button.text
local normalTexture = button:GetNormalTexture()
local line = button.line
button.level = level
if ( level == 1 ) then
button:SetNormalFontObject("GameFontNormal")
button:SetHighlightFontObject("GameFontHighlight")
button.text:SetPoint("LEFT", 8, 2)
else
button:SetNormalFontObject("GameFontHighlightSmall")
button:SetHighlightFontObject("GameFontHighlightSmall")
button.text:SetPoint("LEFT", 8 * level, 2)
end
 
if disabled then
button:EnableMouse(false)
button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE)
else
button.text:SetText(text)
button:EnableMouse(true)
end
 
if canExpand then
if not isExpanded then
toggle:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-UP")
toggle:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-DOWN")
else
toggle:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-UP")
toggle:SetPushedTexture("Interface\\Buttons\\UI-MinusButton-DOWN")
end
toggle:Show()
else
toggle:Hide()
end
end
 
 
local function OnScrollValueChanged(this, value)
if this.obj.noupdate then return end
local self = this.obj
local status = self.status or self.localstatus
status.scrollvalue = value
self:RefreshTree()
AceGUI:ClearFocus()
end
 
-- called to set an external table to store status in
local function SetStatusTable(self, status)
assert(type(status) == "table")
self.status = status
if not status.groups then
status.groups = {}
end
if not status.scrollvalue then
status.scrollvalue = 0
end
if not status.treewidth then
status.treewidth = DEFAULT_TREE_WIDTH
end
if not status.treesizable then
status.treesizable = DEFAULT_TREE_SIZABLE
end
self:SetTreeWidth(status.treewidth,status.treesizable)
self:RefreshTree()
end
 
--sets the tree to be displayed
--[[
example tree
 
Alpha
Bravo
-Charlie
-Delta
-Echo
Foxtrot
 
tree = {
{
value = "A",
text = "Alpha"
},
{
value = "B",
text = "Bravo",
children = {
{
value = "C",
text = "Charlie"
},
{
value = "D",
text = "Delta"
children = {
{
value = "E",
text = "Echo"
}
}
}
}
},
{
value = "F",
text = "Foxtrot"
},
}
]]
local function SetTree(self, tree)
if tree then
assert(type(tree) == "table")
end
self.tree = tree
self:RefreshTree()
end
 
local function BuildLevel(self, tree, level, parent)
local lines = self.lines
 
local status = (self.status or self.localstatus)
local groups = status.groups
local hasChildren = self.hasChildren
 
for i, v in ipairs(tree) do
local line = new()
lines[#lines+1] = line
line.value = v.value
line.text = v.text
line.disabled = v.disabled
line.tree = tree
line.level = level
line.parent = parent
line.uniquevalue = GetButtonUniqueValue(line)
 
if v.children then
line.hasChildren = true
else
line.hasChildren = nil
end
if v.children then
if groups[line.uniquevalue] then
self:BuildLevel(v.children, level+1, line)
end
end
end
end
 
--fire an update after one frame to catch the treeframes height
local function FirstFrameUpdate(this)
local self = this.obj
this:SetScript("OnUpdate",nil)
self:RefreshTree()
end
 
local function ResizeUpdate(this)
this.obj:RefreshTree()
end
 
local function RefreshTree(self)
local buttons = self.buttons
local lines = self.lines
 
for i, v in ipairs(buttons) do
v:Hide()
end
while lines[1] do
local t = tremove(lines)
for k in pairs(t) do
t[k] = nil
end
del(t)
end
 
if not self.tree then return end
--Build the list of visible entries from the tree and status tables
local status = self.status or self.localstatus
local groupstatus = status.groups
local tree = self.tree
 
local treeframe = self.treeframe
 
self:BuildLevel(tree, 1)
 
local numlines = #lines
 
local maxlines = (math.floor(((self.treeframe:GetHeight()or 0) - 20 ) / 18))
 
local first, last
 
if numlines <= maxlines then
--the whole tree fits in the frame
status.scrollvalue = 0
self:ShowScroll(false)
first, last = 1, numlines
else
self:ShowScroll(true)
--scrolling will be needed
self.noupdate = true
self.scrollbar:SetMinMaxValues(0, numlines - maxlines)
--check if we are scrolled down too far
if numlines - status.scrollvalue < maxlines then
status.scrollvalue = numlines - maxlines
self.scrollbar:SetValue(status.scrollvalue)
end
self.noupdate = nil
first, last = status.scrollvalue+1, status.scrollvalue + maxlines
end
 
local buttonnum = 1
for i = first, last do
local line = lines[i]
local button = buttons[buttonnum]
if not button then
button = self:CreateButton()
 
buttons[buttonnum] = button
button:SetParent(treeframe)
button:SetFrameLevel(treeframe:GetFrameLevel()+1)
button:ClearAllPoints()
if i == 1 then
if self.showscroll then
button:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",-22,-10)
button:SetPoint("TOPLEFT", self.treeframe, "TOPLEFT", 0, -10)
else
button:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",0,-10)
button:SetPoint("TOPLEFT", self.treeframe, "TOPLEFT", 0, -10)
end
else
button:SetPoint("TOPRIGHT", buttons[buttonnum-1], "BOTTOMRIGHT",0,0)
button:SetPoint("TOPLEFT", buttons[buttonnum-1], "BOTTOMLEFT",0,0)
end
end
 
UpdateButton(button, line, status.selected == line.uniquevalue, line.hasChildren, groupstatus[line.uniquevalue] )
button:Show()
buttonnum = buttonnum + 1
end
 
end
 
local function SetSelected(self, value)
local status = self.status or self.localstatus
if status.selected ~= value then
status.selected = value
self:Fire("OnGroupSelected", value)
end
end
 
local function BuildUniqueValue(...)
local n = select('#', ...)
if n == 1 then
return ...
else
return (...).."\001"..BuildUniqueValue(select(2,...))
end
end
 
local function Select(self, uniquevalue, ...)
local status = self.status or self.localstatus
local groups = status.groups
for i = 1, select('#', ...) do
groups[BuildUniqueValue(select(i, ...))] = true
end
status.selected = uniquevalue
self:RefreshTree()
self:Fire("OnGroupSelected", uniquevalue)
end
 
local function SelectByPath(self, ...)
self:Select(BuildUniqueValue(...), ...)
end
 
--Selects a tree node by UniqueValue
local function SelectByValue(self, uniquevalue)
self:Select(uniquevalue,string.split("\001", uniquevalue))
end
 
 
local function ShowScroll(self, show)
self.showscroll = show
if show then
self.scrollbar:Show()
if self.buttons[1] then
self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",-22,-10)
end
else
self.scrollbar:Hide()
if self.buttons[1] then
self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",0,-10)
end
end
end
 
local function OnWidthSet(self, width)
local content = self.content
local treeframe = self.treeframe
local status = self.status or self.localstatus
 
local contentwidth = width - status.treewidth - 20
if contentwidth < 0 then
contentwidth = 0
end
content:SetWidth(contentwidth)
content.width = contentwidth
 
local maxtreewidth = math.min(400, width - 50)
 
if maxtreewidth > 100 and status.treewidth > maxtreewidth then
self:SetTreeWidth(maxtreewidth, status.treesizable)
end
treeframe:SetMaxResize(maxtreewidth,1600)
end
 
 
local function OnHeightSet(self, height)
local content = self.content
local contentheight = height - 20
if contentheight < 0 then
contentheight = 0
end
content:SetHeight(contentheight)
content.height = contentheight
end
 
 
local function TreeOnMouseWheel(this, delta)
local self = this.obj
if self.showscroll then
local scrollbar = self.scrollbar
local min, max = scrollbar:GetMinMaxValues()
local value = scrollbar:GetValue()
local newvalue = math.min(max,math.max(min,value - delta))
if value ~= newvalue then
scrollbar:SetValue(newvalue)
end
end
end
 
local function SetTreeWidth(self, treewidth, resizable)
if not resizable then
if type(treewidth) == 'number' then
resizable = false
elseif type(treewidth) == 'boolean' then
resizable = treewidth
treewidth = DEFAULT_TREE_WIDTH
else
resizable = false
treewidth = DEFAULT_TREE_WIDTH
end
end
self.treeframe:SetWidth(treewidth)
self.dragger:EnableMouse(resizable)
 
local status = self.status or self.localstatus
status.treewidth = treewidth
status.treesizable = resizable
end
 
local function draggerLeave(this)
this:SetBackdropColor(1, 1, 1, 0)
end
 
local function draggerEnter(this)
this:SetBackdropColor(1, 1, 1, 0.8)
end
 
local function draggerDown(this)
local treeframe = this:GetParent()
treeframe:StartSizing("RIGHT")
end
 
local function draggerUp(this)
local treeframe = this:GetParent()
local self = treeframe.obj
local frame = treeframe:GetParent()
treeframe:StopMovingOrSizing()
--treeframe:SetScript("OnUpdate", nil)
treeframe:SetUserPlaced(false)
--Without this :GetHeight will get stuck on the current height, causing the tree contents to not resize
treeframe:SetHeight(0)
treeframe:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
treeframe:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",0,0)
treeframe.obj:Fire("OnTreeResize",treeframe:GetWidth())
 
local status = self.status or self.localstatus
status.treewidth = treeframe:GetWidth()
end
 
local createdcount = 0
local function Constructor()
local frame = CreateFrame("Frame",nil,UIParent)
local self = {}
self.type = Type
self.lines = {}
self.levels = {}
self.buttons = {}
self.hasChildren = {}
self.localstatus = {}
self.localstatus.groups = {}
 
local treeframe = CreateFrame("Frame",nil,frame)
treeframe.obj = self
treeframe:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
treeframe:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",0,0)
treeframe:SetWidth(DEFAULT_TREE_WIDTH)
treeframe:SetScript("OnUpdate",FirstFrameUpdate)
treeframe:SetScript("OnSizeChanged",ResizeUpdate)
 
treeframe:EnableMouseWheel(true)
treeframe:SetScript("OnMouseWheel", TreeOnMouseWheel)
treeframe:SetBackdrop(PaneBackdrop)
treeframe:SetBackdropColor(0.1,0.1,0.1,0.5)
treeframe:SetBackdropBorderColor(0.4,0.4,0.4)
 
treeframe:SetResizable(true)
treeframe:SetMinResize(100, 1)
treeframe:SetMaxResize(400,1600)
local dragger = CreateFrame("Frame", nil, treeframe)
dragger:SetWidth(8)
dragger:SetPoint("TOP", treeframe, "TOPRIGHT")
dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT")
dragger:SetBackdrop(DraggerBackdrop)
dragger:SetBackdropColor(1, 1, 1, 0)
dragger:SetScript("OnMouseDown", draggerDown)
dragger:SetScript("OnMouseUp", draggerUp)
dragger:SetScript("OnEnter", draggerEnter)
dragger:SetScript("OnLeave", draggerLeave)
 
self.dragger = dragger
self.treeframe = treeframe
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
 
self.SetTree = SetTree
self.SetTreeWidth = SetTreeWidth
self.RefreshTree = RefreshTree
self.SetStatusTable = SetStatusTable
self.BuildLevel = BuildLevel
self.CreateButton = CreateButton
self.SetSelected = SetSelected
self.ShowScroll = ShowScroll
self.SetStatusTable = SetStatusTable
self.Select = Select
self.SelectByValue = SelectByValue
self.SelectByPath = SelectByPath
self.OnWidthSet = OnWidthSet
self.OnHeightSet = OnHeightSet
self.EnableButtonTooltips = EnableButtonTooltips
 
self.frame = frame
frame.obj = self
 
createdcount = createdcount + 1
local scrollbar = CreateFrame("Slider",("AceConfigDialogTreeGroup%dScrollBar"):format(createdcount),treeframe,"UIPanelScrollBarTemplate")
self.scrollbar = scrollbar
local scrollbg = scrollbar:CreateTexture(nil,"BACKGROUND")
scrollbg:SetAllPoints(scrollbar)
scrollbg:SetTexture(0,0,0,0.4)
scrollbar.obj = self
self.noupdate = true
scrollbar:SetPoint("TOPRIGHT",treeframe,"TOPRIGHT",-10,-26)
scrollbar:SetPoint("BOTTOMRIGHT",treeframe,"BOTTOMRIGHT",-10,26)
scrollbar:SetScript("OnValueChanged", OnScrollValueChanged)
scrollbar:SetMinMaxValues(0,0)
self.localstatus.scrollvalue = 0
scrollbar:SetValueStep(1)
scrollbar:SetValue(0)
scrollbar:SetWidth(16)
self.noupdate = nil
 
local border = CreateFrame("Frame",nil,frame)
self.border = border
border:SetPoint("TOPLEFT",treeframe,"TOPRIGHT", 0,0)
border:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
 
border:SetBackdrop(PaneBackdrop)
border:SetBackdropColor(0.1,0.1,0.1,0.5)
border:SetBackdropBorderColor(0.4,0.4,0.4)
 
--Container Support
local content = CreateFrame("Frame",nil,border)
self.content = content
content.obj = self
content:SetPoint("TOPLEFT",border,"TOPLEFT",10,-10)
content:SetPoint("BOTTOMRIGHT",border,"BOTTOMRIGHT",-10,10)
 
AceGUI:RegisterAsContainer(self)
--AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua New file
0,0 → 1,170
local AceGUI = LibStub("AceGUI-3.0")
 
--------------------------
-- ColorPicker --
--------------------------
do
local Type = "ColorPicker"
local Version = 9
 
local function OnAcquire(self)
self.HasAlpha = false
self:SetColor(0,0,0,1)
end
 
local function SetLabel(self, text)
self.text:SetText(text)
end
 
local function SetColor(self,r,g,b,a)
self.r = r
self.g = g
self.b = b
self.a = a or 1
self.colorSwatch:SetVertexColor(r,g,b,a)
end
 
local function Control_OnEnter(this)
this.obj:Fire("OnEnter")
end
 
local function Control_OnLeave(this)
this.obj:Fire("OnLeave")
end
 
local function SetHasAlpha(self, HasAlpha)
self.HasAlpha = HasAlpha
end
 
local function ColorCallback(self,r,g,b,a,isAlpha)
if not self.HasAlpha then
a = 1
end
self:SetColor(r,g,b,a)
if ColorPickerFrame:IsVisible() then
--colorpicker is still open
 
self:Fire("OnValueChanged",r,g,b,a)
else
--colorpicker is closed, color callback is first, ignore it,
--alpha callback is the final call after it closes so confirm now
if isAlpha then
self:Fire("OnValueConfirmed",r,g,b,a)
end
end
end
 
local function ColorSwatch_OnClick(this)
HideUIPanel(ColorPickerFrame)
local self = this.obj
if not self.disabled then
ColorPickerFrame:SetFrameStrata("FULLSCREEN_DIALOG")
 
ColorPickerFrame.func = function()
local r,g,b = ColorPickerFrame:GetColorRGB()
local a = 1 - OpacitySliderFrame:GetValue()
ColorCallback(self,r,g,b,a)
end
 
ColorPickerFrame.hasOpacity = self.HasAlpha
ColorPickerFrame.opacityFunc = function()
local r,g,b = ColorPickerFrame:GetColorRGB()
local a = 1 - OpacitySliderFrame:GetValue()
ColorCallback(self,r,g,b,a,true)
end
local r, g, b, a = self.r, self.g, self.b, self.a
if self.HasAlpha then
ColorPickerFrame.opacity = 1 - (a or 0)
end
ColorPickerFrame:SetColorRGB(r, g, b)
 
ColorPickerFrame.cancelFunc = function()
ColorCallback(self,r,g,b,a,true)
end
ShowUIPanel(ColorPickerFrame)
end
AceGUI:ClearFocus()
end
 
local function OnRelease(self)
self.frame:ClearAllPoints()
self.frame:Hide()
end
 
local function SetDisabled(self, disabled)
self.disabled = disabled
if self.disabled then
self.text:SetTextColor(0.5,0.5,0.5)
else
self.text:SetTextColor(1,1,1)
end
end
 
local function Constructor()
local frame = CreateFrame("Button",nil,UIParent)
local self = {}
self.type = Type
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
 
self.SetLabel = SetLabel
self.SetColor = SetColor
self.SetDisabled = SetDisabled
self.SetHasAlpha = SetHasAlpha
 
self.frame = frame
frame.obj = self
 
local text = frame:CreateFontString(nil,"OVERLAY","GameFontHighlight")
self.text = text
text:SetJustifyH("LEFT")
text:SetTextColor(1,1,1)
frame:SetHeight(24)
frame:SetWidth(200)
text:SetHeight(24)
frame:SetScript("OnClick", ColorSwatch_OnClick)
frame:SetScript("OnEnter",Control_OnEnter)
frame:SetScript("OnLeave",Control_OnLeave)
 
local colorSwatch = frame:CreateTexture(nil, "OVERLAY")
self.colorSwatch = colorSwatch
colorSwatch:SetWidth(19)
colorSwatch:SetHeight(19)
colorSwatch:SetTexture("Interface\\ChatFrame\\ChatFrameColorSwatch")
local texture = frame:CreateTexture(nil, "BACKGROUND")
colorSwatch.texture = texture
texture:SetWidth(16)
texture:SetHeight(16)
texture:SetTexture(1,1,1)
texture:Show()
 
local checkers = frame:CreateTexture(nil, "BACKGROUND")
colorSwatch.checkers = checkers
checkers:SetTexture("Tileset\\Generic\\Checkers")
checkers:SetDesaturated(true)
checkers:SetVertexColor(1,1,1,0.75)
checkers:SetTexCoord(.25,0,0.5,.25)
checkers:SetWidth(14)
checkers:SetHeight(14)
checkers:Show()
 
local highlight = frame:CreateTexture(nil, "BACKGROUND")
self.highlight = highlight
highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
highlight:SetBlendMode("ADD")
highlight:SetAllPoints(frame)
highlight:Hide()
 
texture:SetPoint("CENTER", colorSwatch, "CENTER")
checkers:SetPoint("CENTER", colorSwatch, "CENTER")
colorSwatch:SetPoint("LEFT", frame, "LEFT", 0, 0)
text:SetPoint("LEFT",colorSwatch,"RIGHT",2,0)
text:SetPoint("RIGHT",frame,"RIGHT")
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua New file
0,0 → 1,132
local AceGUI = LibStub("AceGUI-3.0")
 
--------------------------
-- Label --
--------------------------
do
local Type = "Label"
local Version = 8
 
local function OnAcquire(self)
self:SetText("")
self:SetImage(nil)
self:SetColor()
end
 
local function OnRelease(self)
self.frame:ClearAllPoints()
self.frame:Hide()
end
 
local function UpdateImageAnchor(self)
local width = self.frame.width or self.frame:GetWidth() or 0
local image = self.image
local label = self.label
local frame = self.frame
local height
 
label:ClearAllPoints()
image:ClearAllPoints()
 
if self.imageshown then
local imagewidth = image:GetWidth()
if (width - imagewidth) < 200 or (label:GetText() or "") == "" then
--image goes on top centered when less than 200 width for the text, or if there is no text
image:SetPoint("TOP",frame,"TOP",0,0)
label:SetPoint("TOP",image,"BOTTOM",0,0)
label:SetPoint("LEFT",frame,"LEFT",0,0)
label:SetWidth(width)
height = image:GetHeight() + label:GetHeight()
else
--image on the left
image:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
label:SetPoint("TOPLEFT",image,"TOPRIGHT",0,0)
label:SetWidth(width - imagewidth)
height = math.max(image:GetHeight(), label:GetHeight())
end
else
--no image shown
label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
label:SetWidth(width)
height = self.label:GetHeight()
end
 
self.resizing = true
self.frame:SetHeight(height)
self.frame.height = height
self.resizing = nil
end
 
local function SetText(self, text)
self.label:SetText(text or "")
UpdateImageAnchor(self)
end
 
local function SetColor(self, r, g, b)
if not (r and g and b) then
r, g, b = 1, 1, 1
end
self.label:SetVertexColor(r, g, b)
end
 
local function OnWidthSet(self, width)
if self.resizing then return end
UpdateImageAnchor(self)
end
 
local function SetImage(self, path, ...)
local image = self.image
image:SetTexture(path)
 
if image:GetTexture() then
self.imageshown = true
local n = select('#', ...)
if n == 4 or n == 8 then
image:SetTexCoord(...)
end
else
self.imageshown = nil
end
UpdateImageAnchor(self)
end
 
local function SetImageSize(self, width, height)
self.image:SetWidth(width)
self.image:SetHeight(height)
UpdateImageAnchor(self)
end
 
local function Constructor()
local frame = CreateFrame("Frame",nil,UIParent)
local self = {}
self.type = Type
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
self.SetText = SetText
self.SetColor = SetColor
self.frame = frame
self.OnWidthSet = OnWidthSet
self.SetImage = SetImage
self.SetImageSize = SetImageSize
frame.obj = self
 
frame:SetHeight(18)
frame:SetWidth(200)
local label = frame:CreateFontString(nil,"BACKGROUND","GameFontHighlightSmall")
label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
label:SetWidth(200)
label:SetJustifyH("LEFT")
label:SetJustifyV("TOP")
self.label = label
 
local image = frame:CreateTexture(nil,"BACKGROUND")
self.image = image
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
 
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua New file
0,0 → 1,307
 
--[[
--Multiline Editbox Widget, Originally by bam
 
--]]
local assert, error, ipairs, next, pairs, select, tonumber, tostring, type, unpack, pcall, xpcall =
assert, error, ipairs, next, pairs, select, tonumber, tostring, type, unpack, pcall, xpcall
local getmetatable, setmetatable, rawequal, rawget, rawset, getfenv, setfenv, loadstring, debugstack =
getmetatable, setmetatable, rawequal, rawget, rawset, getfenv, setfenv, loadstring, debugstack
local math, string, table = math, string, table
local find, format, gmatch, gsub, tolower, match, toupper, join, split, trim =
string.find, string.format, string.gmatch, string.gsub, string.lower, string.match, string.upper, string.join, string.split, string.trim
local concat, insert, maxn, remove, sort = table.concat, table.insert, table.maxn, table.remove, table.sort
local max, min, abs, ceil, floor = math.max, math.min, math.abs, math.ceil, math.floor
 
local LibStub = assert(LibStub)
 
local ChatFontNormal = ChatFontNormal
local ClearCursor = ClearCursor
local CreateFrame = CreateFrame
local GetCursorInfo = GetCursorInfo
local GetSpellName = GetSpellName
local UIParent = UIParent
local UISpecialFrames = UISpecialFrames
 
-- No global variables after this!
 
local _G = getfenv()
 
local AceGUI = LibStub("AceGUI-3.0")
 
local Version = 7
---------------------
-- Common Elements --
---------------------
 
local FrameBackdrop = {
bgFile="Interface\\DialogFrame\\UI-DialogBox-Background",
edgeFile="Interface\\DialogFrame\\UI-DialogBox-Border",
tile = true, tileSize = 32, edgeSize = 32,
insets = { left = 8, right = 8, top = 8, bottom = 8 }
}
 
local PaneBackdrop = {
 
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true, tileSize = 16, edgeSize = 16,
insets = { left = 3, right = 3, top = 5, bottom = 3 }
}
 
local ControlBackdrop = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true, tileSize = 16, edgeSize = 16,
insets = { left = 3, right = 3, top = 3, bottom = 3 }
}
 
--------------------------
-- Edit box --
--------------------------
--[[
Events :
OnTextChanged
OnEnterPressed
 
]]
do
local Type = "MultiLineEditBox"
 
local MultiLineEditBox = {}
 
local function EditBox_OnEnterPressed(this)
local self = this.obj
local value = this:GetText()
local cancel = self:Fire("OnEnterPressed",value)
if not cancel then
self.button:Disable()
end
end
 
local function Button_OnClick(this)
local editbox = this.obj.editbox
editbox:ClearFocus()
EditBox_OnEnterPressed(editbox)
end
 
local function EditBox_OnReceiveDrag(this)
local self = this.obj
local type, id, info = GetCursorInfo()
if type == "item" then
self:SetText(info)
self:Fire("OnEnterPressed",info)
ClearCursor()
elseif type == "spell" then
local name, rank = GetSpellName(id, info)
if rank and rank:match("%d") then
name = name.."("..rank..")"
end
self:SetText(name)
self:Fire("OnEnterPressed",name)
ClearCursor()
end
self.button:Disable()
AceGUI:ClearFocus()
end
 
function MultiLineEditBox:OnAcquire()
self:SetDisabled(false)
self:ShowButton(true)
end
 
function MultiLineEditBox:OnRelease()
self.frame:ClearAllPoints()
self.frame:Hide()
self:SetDisabled(false)
end
 
function MultiLineEditBox:SetDisabled(disabled)
self.disabled = disabled
if disabled then
self.editbox:EnableMouse(false)
self.scrollframe:EnableMouse(false)
self.editbox:ClearFocus()
self.editbox:SetTextColor(0.5, 0.5, 0.5)
self.label:SetTextColor(0.5,0.5,0.5)
else
self.editbox:EnableMouse(true)
self.scrollframe:EnableMouse(true)
self.editbox:SetTextColor(1, 1, 1)
self.label:SetTextColor(1,.82,0)
end
end
 
function MultiLineEditBox:SetText(text)
text = text or ""
local editbox = self.editbox
local oldText = editbox:GetText()
local dummy = format(" %s", text)
self.lasttext = dummy -- prevents OnTextChanged from firing
editbox:SetText(dummy)
editbox:HighlightText(0, 1)
self.lasttext = oldText
editbox:Insert("")
end
 
function MultiLineEditBox:SetLabel(text)
if (text or "") == "" then
self.backdrop:SetPoint("TOPLEFT",self.frame,"TOPLEFT",0,0)
self.label:Hide()
self.label:SetText("")
else
self.backdrop:SetPoint("TOPLEFT",self.frame,"TOPLEFT",0,-20)
self.label:Show()
self.label:SetText(text)
end
end
 
function MultiLineEditBox:GetText()
return self.editbox:GetText()
end
 
function MultiLineEditBox:ShowButton(show)
if show then
self.backdrop:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT",0,22)
self.button:Show()
else
self.backdrop:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT",0,0)
self.button:Hide()
end
end
 
local function Constructor()
local frame = CreateFrame("Frame", nil, UIParent)
local backdrop = CreateFrame("Frame", nil, frame)
local self = {}
for k, v in pairs(MultiLineEditBox) do self[k] = v end
self.type = Type
self.frame = frame
self.backdrop = backdrop
frame.obj = self
 
backdrop:SetBackdrop(ControlBackdrop)
backdrop:SetBackdropColor(0, 0, 0)
backdrop:SetBackdropBorderColor(0.4, 0.4, 0.4)
 
backdrop:SetPoint("TOPLEFT",frame,"TOPLEFT",0, -20)
backdrop:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,22)
 
local scrollframe = CreateFrame("ScrollFrame", format("%s@%s@%s", Type, "ScrollFrame", tostring(self)), backdrop, "UIPanelScrollFrameTemplate")
scrollframe:SetPoint("TOPLEFT", 5, -6)
scrollframe:SetPoint("BOTTOMRIGHT", -28, 6)
scrollframe.obj = self
self.scrollframe = scrollframe
 
local scrollchild = CreateFrame("Frame", nil, scrollframe)
scrollframe:SetScrollChild(scrollchild)
scrollchild:SetHeight(2)
scrollchild:SetWidth(2)
 
local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,-2)
label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,-2)
label:SetJustifyH("LEFT")
label:SetHeight(18)
self.label = label
 
local editbox = CreateFrame("EditBox", nil, scrollchild)
self.editbox = editbox
editbox.obj = self
editbox:SetPoint("TOPLEFT")
editbox:SetHeight(50)
editbox:SetWidth(50)
editbox:SetMultiLine(true)
-- editbox:SetMaxLetters(7500)
editbox:SetTextInsets(5, 5, 3, 3)
editbox:EnableMouse(true)
editbox:SetAutoFocus(false)
editbox:SetFontObject(ChatFontNormal)
 
local button = CreateFrame("Button",nil,scrollframe,"UIPanelButtonTemplate")
button:SetWidth(80)
button:SetHeight(20)
button:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",0,2)
button:SetText(ACCEPT)
button:SetScript("OnClick", Button_OnClick)
button:Disable()
button:Hide()
self.button = button
button.obj = self
 
scrollframe:EnableMouse(true)
scrollframe:SetScript("OnMouseUp", function() editbox:SetFocus() end)
scrollframe:SetScript("OnEnter", function(this) this.obj:Fire("OnEnter") end)
scrollframe:SetScript("OnLeave", function(this) this.obj:Fire("OnLeave") end)
 
editbox:SetScript("OnEnter", function(this) this.obj:Fire("OnEnter") end)
editbox:SetScript("OnLeave", function(this) this.obj:Fire("OnLeave") end)
 
local function FixSize()
scrollchild:SetHeight(scrollframe:GetHeight())
scrollchild:SetWidth(scrollframe:GetWidth())
editbox:SetWidth(scrollframe:GetWidth())
end
scrollframe:SetScript("OnShow", FixSize)
scrollframe:SetScript("OnSizeChanged", FixSize)
 
editbox:SetScript("OnEscapePressed", editbox.ClearFocus)
editbox:SetScript("OnTextChanged", function(_, ...)
scrollframe:UpdateScrollChildRect()
local value = editbox:GetText()
if value ~= self.lasttext then
self:Fire("OnTextChanged", value)
self.lasttext = value
self.button:Enable()
end
end)
 
editbox:SetScript("OnReceiveDrag", EditBox_OnReceiveDrag)
editbox:SetScript("OnMouseDown", EditBox_OnReceiveDrag)
 
do
local cursorOffset, cursorHeight
local idleTime
local function FixScroll(_, elapsed)
if cursorOffset and cursorHeight then
idleTime = 0
local height = scrollframe:GetHeight()
local range = scrollframe:GetVerticalScrollRange()
local scroll = scrollframe:GetVerticalScroll()
local size = height + range
cursorOffset = -cursorOffset
while cursorOffset < scroll do
scroll = scroll - (height / 2)
if scroll < 0 then scroll = 0 end
scrollframe:SetVerticalScroll(scroll)
end
while cursorOffset + cursorHeight > scroll + height and scroll < range do
scroll = scroll + (height / 2)
if scroll > range then scroll = range end
scrollframe:SetVerticalScroll(scroll)
end
elseif not idleTime or idleTime > 2 then
frame:SetScript("OnUpdate", nil)
idleTime = nil
else
idleTime = idleTime + elapsed
end
cursorOffset = nil
end
editbox:SetScript("OnCursorChanged", function(_, x, y, w, h)
cursorOffset, cursorHeight = y, h
if not idleTime then
frame:SetScript("OnUpdate", FixScroll)
end
end)
end
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(Type, Constructor, Version)
end
 
 
 
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua New file
0,0 → 1,240
local AceGUI = LibStub("AceGUI-3.0")
 
--------------------------
-- Slider --
--------------------------
do
local Type = "Slider"
local Version = 5
 
local function OnAcquire(self)
self:SetDisabled(false)
self:SetSliderValues(0,100,1)
self:SetIsPercent(nil)
self:SetValue(0)
end
 
local function OnRelease(self)
self.frame:ClearAllPoints()
self.frame:Hide()
self.slider:EnableMouseWheel(false)
self:SetDisabled(false)
end
 
local function Control_OnEnter(this)
this.obj:Fire("OnEnter")
end
 
local function Control_OnLeave(this)
this.obj:Fire("OnLeave")
end
 
local function UpdateText(self)
if self.ispercent then
self.editbox:SetText((math.floor(self.value*1000+0.5)/10)..'%')
else
self.editbox:SetText(math.floor(self.value*100+0.5)/100)
end
end
 
local function Slider_OnValueChanged(this)
local self = this.obj
if not this.setup then
local newvalue
newvalue = this:GetValue()
if newvalue ~= self.value and not self.disabled then
self.value = newvalue
self:Fire("OnValueChanged", newvalue)
end
if self.value then
local value = self.value
UpdateText(self)
end
end
end
 
local function Slider_OnMouseUp(this)
local self = this.obj
self:Fire("OnMouseUp",this:GetValue())
end
 
local function Slider_OnMouseWheel(this, v)
local self = this.obj
if not self.disabled then
local value = self.value
if v > 0 then
value = math.min(value + (self.step or 1),self.max)
else
value = math.max(value - (self.step or 1), self.min)
end
self.slider:SetValue(value)
end
end
 
local function SetDisabled(self, disabled)
self.disabled = disabled
if disabled then
self.slider:EnableMouse(false)
self.label:SetTextColor(.5,.5,.5)
self.hightext:SetTextColor(.5,.5,.5)
self.lowtext:SetTextColor(.5,.5,.5)
--self.valuetext:SetTextColor(.5,.5,.5)
self.editbox:SetTextColor(.5,.5,.5)
self.editbox:EnableMouse(false)
self.editbox:ClearFocus()
else
self.slider:EnableMouse(true)
self.label:SetTextColor(1,.82,0)
self.hightext:SetTextColor(1,1,1)
self.lowtext:SetTextColor(1,1,1)
--self.valuetext:SetTextColor(1,1,1)
self.editbox:SetTextColor(1,1,1)
self.editbox:EnableMouse(true)
end
end
 
local function SetValue(self, value)
self.slider.setup = true
self.slider:SetValue(value)
self.value = value
UpdateText(self)
self.slider.setup = nil
end
 
local function SetLabel(self, text)
self.label:SetText(text)
end
 
local function SetSliderValues(self,min, max, step)
local frame = self.slider
frame.setup = true
self.min = min
self.max = max
self.step = step
frame:SetMinMaxValues(min or 0,max or 100)
self.lowtext:SetText(min or 0)
self.hightext:SetText(max or 100)
frame:SetValueStep(step or 1)
frame.setup = nil
end
 
local function EditBox_OnEscapePressed(this)
this:ClearFocus()
end
 
local function EditBox_OnEnterPressed(this)
local self = this.obj
local value = this:GetText()
if self.ispercent then
value = value:gsub('%%','')
value = tonumber(value) / 100
else
value = tonumber(value)
end
 
if value then
self:Fire("OnMouseUp",value)
end
end
 
local function SetIsPercent(self, value)
self.ispercent = value
end
 
local function FrameOnMouseDown(this)
this.obj.slider:EnableMouseWheel(true)
AceGUI:ClearFocus()
end
 
local SliderBackdrop = {
bgFile = "Interface\\Buttons\\UI-SliderBar-Background",
edgeFile = "Interface\\Buttons\\UI-SliderBar-Border",
tile = true, tileSize = 8, edgeSize = 8,
insets = { left = 3, right = 3, top = 6, bottom = 6 }
}
 
local function Constructor()
local frame = CreateFrame("Frame",nil,UIParent)
local self = {}
self.type = Type
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
 
self.frame = frame
frame.obj = self
 
self.SetDisabled = SetDisabled
self.SetValue = SetValue
self.SetSliderValues = SetSliderValues
self.SetLabel = SetLabel
self.SetIsPercent = SetIsPercent
 
self.alignoffset = 25
 
frame:EnableMouse(true)
frame:SetScript("OnMouseDown",FrameOnMouseDown)
self.slider = CreateFrame("Slider",nil,frame)
local slider = self.slider
slider:SetScript("OnEnter",Control_OnEnter)
slider:SetScript("OnLeave",Control_OnLeave)
slider:SetScript("OnMouseUp", Slider_OnMouseUp)
slider.obj = self
slider:SetOrientation("HORIZONTAL")
slider:SetHeight(15)
slider:SetHitRectInsets(0,0,-10,0)
slider:SetBackdrop(SliderBackdrop)
--slider:EnableMouseWheel(true)
slider:SetScript("OnMouseWheel", Slider_OnMouseWheel)
 
local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormal")
label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
label:SetJustifyH("CENTER")
label:SetHeight(15)
self.label = label
 
self.lowtext = slider:CreateFontString(nil,"ARTWORK","GameFontHighlightSmall")
self.lowtext:SetPoint("TOPLEFT",slider,"BOTTOMLEFT",2,3)
 
self.hightext = slider:CreateFontString(nil,"ARTWORK","GameFontHighlightSmall")
self.hightext:SetPoint("TOPRIGHT",slider,"BOTTOMRIGHT",-2,3)
 
 
local editbox = CreateFrame("EditBox",nil,frame)
editbox:SetAutoFocus(false)
editbox:SetFontObject(GameFontHighlightSmall)
editbox:SetPoint("TOP",slider,"BOTTOM",0,0)
editbox:SetHeight(14)
editbox:SetWidth(70)
editbox:SetJustifyH("CENTER")
editbox:EnableMouse(true)
editbox:SetScript("OnEscapePressed",EditBox_OnEscapePressed)
editbox:SetScript("OnEnterPressed",EditBox_OnEnterPressed)
self.editbox = editbox
editbox.obj = self
 
local bg = editbox:CreateTexture(nil,"BACKGROUND")
editbox.bg = bg
bg:SetTexture("Interface\\ChatFrame\\ChatFrameBackground")
bg:SetVertexColor(0,0,0,0.25)
bg:SetAllPoints(editbox)
 
slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Horizontal")
 
frame:SetWidth(200)
frame:SetHeight(44)
slider:SetPoint("TOP",label,"BOTTOM",0,0)
slider:SetPoint("LEFT",frame,"LEFT",3,0)
slider:SetPoint("RIGHT",frame,"RIGHT",-3,0)
 
 
slider:SetValue(self.value or 0)
slider:SetScript("OnValueChanged",Slider_OnValueChanged)
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-TabGroup.lua New file
0,0 → 1,338
local AceGUI = LibStub("AceGUI-3.0")
 
-------------
-- Widgets --
-------------
--[[
Widgets must provide the following functions
Acquire() - Called when the object is aquired, should set everything to a default hidden state
Release() - Called when the object is Released, should remove any anchors and hide the Widget
 
And the following members
frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
type - the type of the object, same as the name given to :RegisterWidget()
 
Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
It will be cleared automatically when a widget is released
Placing values directly into a widget object should be avoided
 
If the Widget can act as a container for other Widgets the following
content - frame or derivitive that children will be anchored to
 
The Widget can supply the following Optional Members
 
 
]]
 
--------------------------
-- Tab Group --
--------------------------
 
do
local Type = "TabGroup"
local Version = 15
 
local PaneBackdrop = {
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true, tileSize = 16, edgeSize = 16,
insets = { left = 3, right = 3, top = 5, bottom = 3 }
}
 
local function OnAcquire(self)
 
end
 
local function OnRelease(self)
self.frame:ClearAllPoints()
self.frame:Hide()
self.status = nil
for k in pairs(self.localstatus) do
self.localstatus[k] = nil
end
self.tablist = nil
end
 
local function Tab_SetText(self, text)
self:_SetText(text)
PanelTemplates_TabResize(self, 0)
end
 
local function UpdateTabLook(self)
if self.disabled then
PanelTemplates_SetDisabledTabState(self)
elseif self.selected then
PanelTemplates_SelectTab(self)
else
PanelTemplates_DeselectTab(self)
end
end
 
local function Tab_SetSelected(self, selected)
self.selected = selected
UpdateTabLook(self)
end
 
local function Tab_OnClick(self)
if not (self.selected or self.disabled) then
self.obj:SelectTab(self.value)
end
end
 
local function Tab_SetDisabled(self, disabled)
self.disabled = disabled
UpdateTabLook(self)
end
 
local function Tab_OnEnter(this)
local self = this.obj
self:Fire("OnTabEnter", self.tabs[this.id].value, this)
end
 
local function Tab_OnLeave(this)
local self = this.obj
self:Fire("OnTabLeave", self.tabs[this.id].value, this)
end
 
local function CreateTab(self, id)
local tabname = "AceGUITabGroup"..self.num.."Tab"..id
local tab = CreateFrame("Button",tabname,self.border,"OptionsFrameTabButtonTemplate")
tab.obj = self
tab.id = id
 
tab:SetScript("OnClick",Tab_OnClick)
tab:SetScript("OnEnter",Tab_OnEnter)
tab:SetScript("OnLeave",Tab_OnLeave)
 
tab._SetText = tab.SetText
tab.SetText = Tab_SetText
tab.SetSelected = Tab_SetSelected
tab.SetDisabled = Tab_SetDisabled
 
return tab
end
 
local function SetTitle(self, text)
self.titletext:SetText(text or "")
end
 
-- called to set an external table to store status in
local function SetStatusTable(self, status)
assert(type(status) == "table")
self.status = status
end
 
local function SelectTab(self, value)
local status = self.status or self.localstatus
 
local found
for i, v in ipairs(self.tabs) do
if v.value == value then
v:SetSelected(true)
found = true
else
v:SetSelected(false)
end
end
status.selected = value
if found then
self:Fire("OnGroupSelected",value)
end
end
 
local function SetTabs(self, tabs)
self.tablist = tabs
self:BuildTabs()
end
 
 
local widths = {}
local rowwidths = {}
local rowends = {}
local function BuildTabs(self)
local status = self.status or self.localstatus
local tablist = self.tablist
 
local tabs = self.tabs
 
for i, v in ipairs(tabs) do
v:Hide()
end
if not tablist then return end
 
 
local width = self.frame.width or self.frame:GetWidth() or 0
 
for i = #widths, 1, -1 do
widths[i] = nil
end
for i = #rowwidths, 1, -1 do
rowwidths[i] = nil
end
for i = #rowends, 1, -1 do
rowends[i] = nil
end
 
--Place Text into tabs and get thier initial width
for i, v in ipairs(tablist) do
local tab = tabs[i]
if not tab then
tab = self:CreateTab(i)
tabs[i] = tab
end
 
tab:Show()
tab:SetText(v.text)
tab:SetDisabled(v.disabled)
tab.value = v.value
 
widths[i] = tab:GetWidth() - 10 --tabs are anchored 10 pixels from the right side of the previous one to reduce spacing
end
 
--First pass, find the minimum number of rows needed to hold all tabs and the initial tab layout
local numtabs = #tablist
local numrows = 1
local usedwidth = 0
 
for i = 1, #tablist do
--If this is not the first tab of a row and there isn't room for it
if usedwidth ~= 0 and (width - usedwidth - widths[i]) < 0 then
rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
rowends[numrows] = i - 1
numrows = numrows + 1
usedwidth = 0
end
usedwidth = usedwidth + widths[i]
end
rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
rowends[numrows] = #tablist
 
--Fix for single tabs being left on the last row, move a tab from the row above if applicable
if numrows > 1 then
--if the last row has only one tab
if rowends[numrows-1] == numtabs-1 then
--if there are more than 2 tabs in the 2nd last row
if (numrows == 2 and rowends[numrows-1] > 2) or (rowends[numrows] - rowends[numrows-1] > 2) then
--move 1 tab from the second last row to the last
rowends[numrows-1] = rowends[numrows-1] - 1
rowwidths[numrows] = rowwidths[numrows] + widths[numtabs-1]
rowwidths[numrows-1] = rowwidths[numrows-1] - widths[numtabs-1]
end
end
end
 
--anchor the rows as defined and resize tabs to fill thier row
local starttab = 1
for row, endtab in ipairs(rowends) do
local first = true
for tabno = starttab, endtab do
local tab = tabs[tabno]
tab:ClearAllPoints()
if first then
tab:SetPoint("TOPLEFT",self.frame,"TOPLEFT",0,-7-(row-1)*20 )
first = false
else
tab:SetPoint("LEFT",tabs[tabno-1],"RIGHT",-10,0)
end
end
--equal padding for each tab to fill the available width
local padding = (width - rowwidths[row]) / (endtab - starttab+1)
for i = starttab, endtab do
PanelTemplates_TabResize(tabs[i], padding)
end
starttab = endtab + 1
end
 
self.borderoffset = 10+((numrows)*20)
self.border:SetPoint("TOPLEFT",self.frame,"TOPLEFT",3,-self.borderoffset)
end
 
local function BuildTabsOnUpdate(this)
BuildTabs(this.obj)
this:SetScript("OnUpdate", nil)
end
 
local function OnWidthSet(self, width)
local content = self.content
local contentwidth = width - 60
if contentwidth < 0 then
contentwidth = 0
end
content:SetWidth(contentwidth)
content.width = contentwidth
BuildTabs(self)
self.frame:SetScript("OnUpdate", BuildTabsOnUpdate)
end
 
 
local function OnHeightSet(self, height)
local content = self.content
local contentheight = height - (self.borderoffset + 23)
if contentheight < 0 then
contentheight = 0
end
content:SetHeight(contentheight)
content.height = contentheight
end
 
local function Constructor()
local frame = CreateFrame("Frame",nil,UIParent)
local self = {}
self.type = Type
 
self.num = AceGUI:GetNextWidgetNum(Type)
 
self.localstatus = {}
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
self.SetTitle = SetTitle
self.CreateTab = CreateTab
self.SelectTab = SelectTab
self.BuildTabs = BuildTabs
self.SetStatusTable = SetStatusTable
self.SetTabs = SetTabs
self.frame = frame
 
self.OnWidthSet = OnWidthSet
self.OnHeightSet = OnHeightSet
 
frame.obj = self
 
frame:SetHeight(100)
frame:SetWidth(100)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
 
local titletext = frame:CreateFontString(nil,"OVERLAY","GameFontNormal")
titletext:SetPoint("TOPLEFT",frame,"TOPLEFT",14,0)
titletext:SetPoint("TOPRIGHT",frame,"TOPRIGHT",-14,0)
titletext:SetJustifyH("LEFT")
titletext:SetHeight(18)
 
self.titletext = titletext
 
local border = CreateFrame("Frame",nil,frame)
self.border = border
self.borderoffset = 27
border:SetPoint("TOPLEFT",frame,"TOPLEFT",3,-27)
border:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-3,3)
 
border:SetBackdrop(PaneBackdrop)
border:SetBackdropColor(0.1,0.1,0.1,0.5)
border:SetBackdropBorderColor(0.4,0.4,0.4)
 
self.tabs = {}
 
--Container Support
local content = CreateFrame("Frame",nil,border)
self.content = content
content.obj = self
content:SetPoint("TOPLEFT",border,"TOPLEFT",10,-10)
content:SetPoint("BOTTOMRIGHT",border,"BOTTOMRIGHT",-10,10)
 
AceGUI:RegisterAsContainer(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua New file
0,0 → 1,217
local AceGUI = LibStub("AceGUI-3.0")
 
--------------------------
-- Keybinding --
--------------------------
 
do
local Type = "Keybinding"
local Version = 11
 
local ControlBackdrop = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true, tileSize = 16, edgeSize = 16,
insets = { left = 3, right = 3, top = 3, bottom = 3 }
}
 
local function Control_OnEnter(this)
this.obj:Fire("OnEnter")
end
 
local function Control_OnLeave(this)
this.obj:Fire("OnLeave")
end
 
local function keybindingMsgFixWidth(this)
this:SetWidth(this.msg:GetWidth()+10)
this:SetScript("OnUpdate",nil)
end
 
local function Keybinding_OnClick(this, button)
if button == "LeftButton" or button == "RightButton" then
local self = this.obj
if self.waitingForKey then
this:EnableKeyboard(false)
self.msgframe:Hide()
this:UnlockHighlight()
self.waitingForKey = nil
else
this:EnableKeyboard(true)
self.msgframe:Show()
this:LockHighlight()
self.waitingForKey = true
end
end
AceGUI:ClearFocus()
end
 
local ignoreKeys = nil
local function Keybinding_OnKeyDown(this, key)
local self = this.obj
if self.waitingForKey then
local keyPressed = key
if keyPressed == "ESCAPE" then
keyPressed = ""
else
if not ignoreKeys then
ignoreKeys = {
["BUTTON1"] = true, ["BUTTON2"] = true,
["UNKNOWN"] = true,
["LSHIFT"] = true, ["LCTRL"] = true, ["LALT"] = true,
["RSHIFT"] = true, ["RCTRL"] = true, ["RALT"] = true,
}
end
if ignoreKeys[keyPressed] then return end
if IsShiftKeyDown() then
keyPressed = "SHIFT-"..keyPressed
end
if IsControlKeyDown() then
keyPressed = "CTRL-"..keyPressed
end
if IsAltKeyDown() then
keyPressed = "ALT-"..keyPressed
end
end
 
this:EnableKeyboard(false)
self.msgframe:Hide()
this:UnlockHighlight()
self.waitingForKey = nil
 
if not self.disabled then
self:SetKey(keyPressed)
self:Fire("OnKeyChanged",keyPressed)
end
end
end
 
local function Keybinding_OnMouseDown(this, button)
if button == "LeftButton" or button == "RightButton" then
return
elseif button == "MiddleButton" then
button = "BUTTON3"
elseif button == "Button4" then
button = "BUTTON4"
elseif button == "Button5" then
button = "BUTTON5"
end
Keybinding_OnKeyDown(this, button)
end
 
local function OnAcquire(self)
self:SetLabel("")
self:SetKey("")
end
 
local function OnRelease(self)
self.frame:ClearAllPoints()
self.frame:Hide()
self.waitingForKey = nil
self.msgframe:Hide()
end
 
local function SetDisabled(self, disabled)
self.disabled = disabled
if disabled then
self.button:Disable()
self.label:SetTextColor(0.5,0.5,0.5)
else
self.button:Enable()
self.label:SetTextColor(1,1,1)
end
end
 
local function SetKey(self, key)
if (key or "") == "" then
self.button:SetText(NOT_BOUND)
self.button:SetNormalFontObject("GameFontNormal")
else
self.button:SetText(key)
self.button:SetNormalFontObject("GameFontHighlight")
end
end
 
local function SetLabel(self, label)
self.label:SetText(label or "")
if (label or "") == "" then
self.alignoffset = nil
self:SetHeight(24)
else
self.alignoffset = 30
self:SetHeight(44)
end
end
 
local function Constructor()
local num = AceGUI:GetNextWidgetNum(Type)
local frame = CreateFrame("Frame",nil,UIParent)
 
local button = CreateFrame("Button","AceGUI-3.0 KeybindingButton"..num,frame,"UIPanelButtonTemplate2")
 
local self = {}
self.type = Type
self.num = num
 
local text = button:GetFontString()
text:SetPoint("LEFT",button,"LEFT",7,0)
text:SetPoint("RIGHT",button,"RIGHT",-7,0)
 
button:SetScript("OnClick",Keybinding_OnClick)
button:SetScript("OnKeyDown",Keybinding_OnKeyDown)
button:SetScript("OnEnter",Control_OnEnter)
button:SetScript("OnLeave",Control_OnLeave)
button:SetScript("OnMouseDown",Keybinding_OnMouseDown)
button:RegisterForClicks("AnyDown")
button:EnableMouse()
 
button:SetHeight(24)
button:SetWidth(200)
button:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT",0,0)
button:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
 
frame:SetWidth(200)
frame:SetHeight(44)
 
self.alignoffset = 30
 
self.button = button
 
local label = frame:CreateFontString(nil,"OVERLAY","GameFontHighlight")
label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
label:SetJustifyH("CENTER")
label:SetHeight(18)
self.label = label
 
local msgframe = CreateFrame("Frame",nil,UIParent)
msgframe:SetHeight(30)
msgframe:SetBackdrop(ControlBackdrop)
msgframe:SetBackdropColor(0,0,0)
msgframe:SetFrameStrata("FULLSCREEN_DIALOG")
msgframe:SetFrameLevel(1000)
self.msgframe = msgframe
local msg = msgframe:CreateFontString(nil,"OVERLAY","GameFontNormal")
msg:SetText("Press a key to bind, ESC to clear the binding or click the button again to cancel")
msgframe.msg = msg
msg:SetPoint("TOPLEFT",msgframe,"TOPLEFT",5,-5)
msgframe:SetScript("OnUpdate", keybindingMsgFixWidth)
msgframe:SetPoint("BOTTOM",button,"TOP",0,0)
msgframe:Hide()
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
self.SetLabel = SetLabel
self.SetDisabled = SetDisabled
self.SetKey = SetKey
 
self.frame = frame
frame.obj = self
button.obj = self
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua New file
0,0 → 1,217
local AceGUI = LibStub("AceGUI-3.0")
 
--------------------------
-- Check Box --
--------------------------
--[[
Events :
OnValueChanged
 
]]
do
local Type = "CheckBox"
local Version = 4
 
local function OnAcquire(self)
self:SetValue(false)
self.tristate = nil
end
 
local function OnRelease(self)
self.frame:ClearAllPoints()
self.frame:Hide()
self.check:Hide()
self.highlight:Hide()
self.down = nil
self.checked = nil
self:SetType()
self:SetDisabled(false)
end
 
local function CheckBox_OnEnter(this)
local self = this.obj
if not self.disabled then
self.highlight:Show()
end
self:Fire("OnEnter")
end
 
local function CheckBox_OnLeave(this)
local self = this.obj
if not self.down then
self.highlight:Hide()
end
self:Fire("OnLeave")
end
 
local function CheckBox_OnMouseUp(this)
local self = this.obj
if not self.disabled then
self:ToggleChecked()
self:Fire("OnValueChanged",self.checked)
self.text:SetPoint("LEFT",self.check,"RIGHT",0,0)
end
self.down = nil
end
 
local function CheckBox_OnMouseDown(this)
local self = this.obj
if not self.disabled then
self.text:SetPoint("LEFT",self.check,"RIGHT",1,-1)
self.down = true
end
AceGUI:ClearFocus()
end
 
local function SetDisabled(self,disabled)
self.disabled = disabled
if disabled then
self.text:SetTextColor(0.5,0.5,0.5)
SetDesaturation(self.check, true)
else
self.text:SetTextColor(1,1,1)
if self.tristate and self.checked == nil then
SetDesaturation(self.check, true)
else
SetDesaturation(self.check, false)
end
end
end
 
local function SetValue(self,value)
local check = self.check
self.checked = value
if value then
SetDesaturation(self.check, false)
check:SetWidth(24)
check:SetHeight(24)
self.check:Show()
else
--Nil is the unknown tristate value
if self.tristate and value == nil then
SetDesaturation(self.check, true)
check:SetWidth(20)
check:SetHeight(20)
self.check:Show()
else
SetDesaturation(self.check, false)
check:SetWidth(24)
check:SetHeight(24)
self.check:Hide()
end
end
end
 
local function SetTriState(self, enabled)
self.tristate = enabled
self:SetValue(self:GetValue())
end
 
local function GetValue(self)
return self.checked
end
 
local function SetType(self, type)
local checkbg = self.checkbg
local check = self.check
local highlight = self.highlight
 
if type == "radio" then
checkbg:SetTexture("Interface\\Buttons\\UI-RadioButton")
checkbg:SetTexCoord(0,0.25,0,1)
check:SetTexture("Interface\\Buttons\\UI-RadioButton")
check:SetTexCoord(0.5,0.75,0,1)
check:SetBlendMode("ADD")
highlight:SetTexture("Interface\\Buttons\\UI-RadioButton")
highlight:SetTexCoord(0.5,0.75,0,1)
else
checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
checkbg:SetTexCoord(0,1,0,1)
check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
check:SetTexCoord(0,1,0,1)
check:SetBlendMode("BLEND")
highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
highlight:SetTexCoord(0,1,0,1)
end
end
 
local function ToggleChecked(self)
local value = self:GetValue()
if self.tristate then
--cycle in true, nil, false order
if value then
self:SetValue(nil)
elseif value == nil then
self:SetValue(false)
else
self:SetValue(true)
end
else
self:SetValue(not self:GetValue())
end
end
 
local function SetLabel(self, label)
self.text:SetText(label)
end
 
local function Constructor()
local frame = CreateFrame("Button",nil,UIParent)
local self = {}
self.type = Type
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
 
self.SetValue = SetValue
self.GetValue = GetValue
self.SetDisabled = SetDisabled
self.SetType = SetType
self.ToggleChecked = ToggleChecked
self.SetLabel = SetLabel
self.SetTriState = SetTriState
 
self.frame = frame
frame.obj = self
 
local text = frame:CreateFontString(nil,"OVERLAY","GameFontHighlight")
self.text = text
 
frame:SetScript("OnEnter",CheckBox_OnEnter)
frame:SetScript("OnLeave",CheckBox_OnLeave)
frame:SetScript("OnMouseUp",CheckBox_OnMouseUp)
frame:SetScript("OnMouseDown",CheckBox_OnMouseDown)
frame:EnableMouse()
local checkbg = frame:CreateTexture(nil,"ARTWORK")
self.checkbg = checkbg
checkbg:SetWidth(24)
checkbg:SetHeight(24)
checkbg:SetPoint("LEFT",frame,"LEFT",0,0)
checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
local check = frame:CreateTexture(nil,"OVERLAY")
self.check = check
check:SetWidth(24)
check:SetHeight(24)
check:SetPoint("CENTER",checkbg,"CENTER",0,0)
check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
 
local highlight = frame:CreateTexture(nil, "BACKGROUND")
self.highlight = highlight
highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
highlight:SetBlendMode("ADD")
highlight:SetAllPoints(checkbg)
highlight:Hide()
 
text:SetJustifyH("LEFT")
frame:SetHeight(24)
frame:SetWidth(200)
text:SetHeight(18)
text:SetPoint("LEFT",check,"RIGHT",0,0)
text:SetPoint("RIGHT",frame,"RIGHT",0,0)
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua New file
0,0 → 1,99
local AceGUI = LibStub("AceGUI-3.0")
 
--------------------------
-- Label --
--------------------------
do
local Type = "Icon"
local Version = 4
 
local function OnAcquire(self)
self:SetText("")
self:SetImage(nil)
end
 
local function OnRelease(self)
self.frame:ClearAllPoints()
self.frame:Hide()
end
 
local function SetText(self, text)
self.label:SetText(text or "")
end
 
local function SetImage(self, path, ...)
local image = self.image
image:SetTexture(path)
 
if image:GetTexture() then
self.imageshown = true
local n = select('#', ...)
if n == 4 or n == 8 then
image:SetTexCoord(...)
end
else
self.imageshown = nil
end
end
 
local function OnClick(this)
this.obj:Fire("OnClick")
AceGUI:ClearFocus()
end
 
local function OnEnter(this)
this.obj.highlight:Show()
end
 
local function OnLeave(this)
this.obj.highlight:Hide()
end
 
local function Constructor()
local frame = CreateFrame("Button",nil,UIParent)
local self = {}
self.type = Type
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
self.SetText = SetText
self.frame = frame
self.SetImage = SetImage
 
frame.obj = self
 
frame:SetHeight(110)
frame:SetWidth(110)
frame:EnableMouse(true)
frame:SetScript("OnClick", OnClick)
frame:SetScript("OnLeave", OnLeave)
frame:SetScript("OnEnter", OnEnter)
local label = frame:CreateFontString(nil,"BACKGROUND","GameFontHighlight")
label:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",0,10)
label:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,10)
label:SetJustifyH("CENTER")
label:SetJustifyV("TOP")
label:SetHeight(18)
self.label = label
 
local image = frame:CreateTexture(nil,"BACKGROUND")
self.image = image
image:SetWidth(64)
image:SetHeight(64)
image:SetPoint("TOP",frame,"TOP",0,-10)
 
local highlight = frame:CreateTexture(nil,"OVERLAY")
self.highlight = highlight
highlight:SetAllPoints(image)
highlight:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-Tab-Highlight")
highlight:SetTexCoord(0,1,0.23,0.77)
highlight:SetBlendMode("ADD")
highlight:Hide()
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
 
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-BlizOptionsGroup.lua New file
0,0 → 1,150
local AceGUI = LibStub("AceGUI-3.0")
 
 
-------------
-- Widgets --
-------------
--[[
Widgets must provide the following functions
Acquire() - Called when the object is aquired, should set everything to a default hidden state
Release() - Called when the object is Released, should remove any anchors and hide the Widget
 
And the following members
frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
type - the type of the object, same as the name given to :RegisterWidget()
 
Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
It will be cleared automatically when a widget is released
Placing values directly into a widget object should be avoided
 
If the Widget can act as a container for other Widgets the following
content - frame or derivitive that children will be anchored to
 
The Widget can supply the following Optional Members
 
 
]]
 
----------------------------------
-- Blizzard Options Group --
----------------------------------
--[[
Group Designed to be added to the bliz interface options panel
]]
 
do
local Type = "BlizOptionsGroup"
local Version = 6
 
local function OnAcquire(self)
 
end
 
local function OnRelease(self)
self.frame:ClearAllPoints()
self.frame:Hide()
self:SetName()
end
 
local function okay(this)
this.obj:Fire("okay")
end
 
local function cancel(this)
this.obj:Fire("cancel")
end
 
local function defaults(this)
this.obj:Fire("defaults")
end
 
local function SetName(self, name, parent)
self.frame.name = name
self.frame.parent = parent
end
 
local function OnShow(this)
this.obj:Fire("OnShow")
end
 
local function OnHide(this)
this.obj:Fire("OnHide")
end
 
local function OnWidthSet(self, width)
local content = self.content
local contentwidth = width - 63
if contentwidth < 0 then
contentwidth = 0
end
content:SetWidth(contentwidth)
content.width = contentwidth
end
 
 
local function OnHeightSet(self, height)
local content = self.content
local contentheight = height - 26
if contentheight < 0 then
contentheight = 0
end
content:SetHeight(contentheight)
content.height = contentheight
end
 
local function SetTitle(self, title)
local content = self.content
content:ClearAllPoints()
if not title or title == "" then
content:SetPoint("TOPLEFT",self.frame,"TOPLEFT",15,-10)
self.label:SetText("")
else
content:SetPoint("TOPLEFT",self.frame,"TOPLEFT",15,-40)
self.label:SetText(title)
end
content:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT",-10,10)
end
 
local function Constructor()
local frame = CreateFrame("Frame")
local self = {}
self.type = Type
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
self.frame = frame
self.SetName = SetName
 
self.OnWidthSet = OnWidthSet
self.OnHeightSet = OnHeightSet
self.SetTitle = SetTitle
 
frame.obj = self
frame.okay = okay
frame.cancel = cancel
frame.defaults = defaults
 
frame:Hide()
frame:SetScript("OnHide",OnHide)
frame:SetScript("OnShow",OnShow)
 
local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalLarge")
self.label = label
label:SetPoint("TOPLEFT", frame, "TOPLEFT", 15, -15)
label:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", 10, -45)
label:SetJustifyH("LEFT")
label:SetJustifyV("TOP")
 
--Container Support
local content = CreateFrame("Frame",nil,frame)
self.content = content
content.obj = self
content:SetPoint("TOPLEFT",frame,"TOPLEFT",15,-10)
content:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-10,10)
 
AceGUI:RegisterAsContainer(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-Frame.lua New file
0,0 → 1,299
local AceGUI = LibStub("AceGUI-3.0")
 
----------------
-- Main Frame --
----------------
--[[
Events :
OnClose
 
]]
do
local Type = "Frame"
local Version = 7
 
local FrameBackdrop = {
bgFile="Interface\\DialogFrame\\UI-DialogBox-Background",
edgeFile="Interface\\DialogFrame\\UI-DialogBox-Border",
tile = true, tileSize = 32, edgeSize = 32,
insets = { left = 8, right = 8, top = 8, bottom = 8 }
}
 
local PaneBackdrop = {
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true, tileSize = 16, edgeSize = 16,
insets = { left = 3, right = 3, top = 5, bottom = 3 }
}
 
local function frameOnClose(this)
this.obj:Fire("OnClose")
end
 
local function closeOnClick(this)
this.obj:Hide()
end
 
local function frameOnMouseDown(this)
AceGUI:ClearFocus()
end
 
local function titleOnMouseDown(this)
this:GetParent():StartMoving()
AceGUI:ClearFocus()
end
 
local function frameOnMouseUp(this)
local frame = this:GetParent()
frame:StopMovingOrSizing()
local self = frame.obj
local status = self.status or self.localstatus
status.width = frame:GetWidth()
status.height = frame:GetHeight()
status.top = frame:GetTop()
status.left = frame:GetLeft()
end
 
local function sizerseOnMouseDown(this)
this:GetParent():StartSizing("BOTTOMRIGHT")
AceGUI:ClearFocus()
end
 
local function sizersOnMouseDown(this)
this:GetParent():StartSizing("BOTTOM")
AceGUI:ClearFocus()
end
 
local function sizereOnMouseDown(this)
this:GetParent():StartSizing("RIGHT")
AceGUI:ClearFocus()
end
 
local function sizerOnMouseUp(this)
this:GetParent():StopMovingOrSizing()
end
 
local function SetTitle(self,title)
self.titletext:SetText(title)
end
 
local function SetStatusText(self,text)
self.statustext:SetText(text)
end
 
local function Hide(self)
self.frame:Hide()
end
 
local function Show(self)
self.frame:Show()
end
 
local function OnAcquire(self)
self.frame:SetParent(UIParent)
self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
self:ApplyStatus()
end
 
local function OnRelease(self)
self.status = nil
for k in pairs(self.localstatus) do
self.localstatus[k] = nil
end
end
 
-- called to set an external table to store status in
local function SetStatusTable(self, status)
assert(type(status) == "table")
self.status = status
self:ApplyStatus()
end
 
local function ApplyStatus(self)
local status = self.status or self.localstatus
local frame = self.frame
self:SetWidth(status.width or 700)
self:SetHeight(status.height or 500)
if status.top and status.left then
frame:SetPoint("TOP",UIParent,"BOTTOM",0,status.top)
frame:SetPoint("LEFT",UIParent,"LEFT",status.left,0)
else
frame:SetPoint("CENTER",UIParent,"CENTER")
end
end
 
local function OnWidthSet(self, width)
local content = self.content
local contentwidth = width - 34
if contentwidth < 0 then
contentwidth = 0
end
content:SetWidth(contentwidth)
content.width = contentwidth
end
 
 
local function OnHeightSet(self, height)
local content = self.content
local contentheight = height - 57
if contentheight < 0 then
contentheight = 0
end
content:SetHeight(contentheight)
content.height = contentheight
end
 
local function Constructor()
local frame = CreateFrame("Frame",nil,UIParent)
local self = {}
self.type = "Frame"
 
self.Hide = Hide
self.Show = Show
self.SetTitle = SetTitle
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
self.SetStatusText = SetStatusText
self.SetStatusTable = SetStatusTable
self.ApplyStatus = ApplyStatus
self.OnWidthSet = OnWidthSet
self.OnHeightSet = OnHeightSet
 
self.localstatus = {}
 
self.frame = frame
frame.obj = self
frame:SetWidth(700)
frame:SetHeight(500)
frame:SetPoint("CENTER",UIParent,"CENTER",0,0)
frame:EnableMouse()
frame:SetMovable(true)
frame:SetResizable(true)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
frame:SetScript("OnMouseDown", frameOnMouseDown)
 
frame:SetBackdrop(FrameBackdrop)
frame:SetBackdropColor(0,0,0,1)
frame:SetScript("OnHide",frameOnClose)
frame:SetMinResize(400,200)
frame:SetToplevel(true)
 
local closebutton = CreateFrame("Button",nil,frame,"UIPanelButtonTemplate")
closebutton:SetScript("OnClick", closeOnClick)
closebutton:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-27,17)
closebutton:SetHeight(20)
closebutton:SetWidth(100)
closebutton:SetText("Close")
 
self.closebutton = closebutton
closebutton.obj = self
 
local statusbg = CreateFrame("Frame",nil,frame)
statusbg:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",15,15)
statusbg:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-132,15)
statusbg:SetHeight(24)
statusbg:SetBackdrop(PaneBackdrop)
statusbg:SetBackdropColor(0.1,0.1,0.1)
statusbg:SetBackdropBorderColor(0.4,0.4,0.4)
self.statusbg = statusbg
 
local statustext = statusbg:CreateFontString(nil,"OVERLAY","GameFontNormal")
self.statustext = statustext
statustext:SetPoint("TOPLEFT",statusbg,"TOPLEFT",7,-2)
statustext:SetPoint("BOTTOMRIGHT",statusbg,"BOTTOMRIGHT",-7,2)
statustext:SetHeight(20)
statustext:SetJustifyH("LEFT")
statustext:SetText("")
 
local title = CreateFrame("Frame",nil,frame)
self.title = title
title:EnableMouse()
title:SetScript("OnMouseDown",titleOnMouseDown)
title:SetScript("OnMouseUp", frameOnMouseUp)
 
 
local titlebg = frame:CreateTexture(nil,"OVERLAY")
titlebg:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
titlebg:SetTexCoord(0.31,0.67,0,0.63)
titlebg:SetPoint("TOP",frame,"TOP",0,12)
titlebg:SetWidth(100)
titlebg:SetHeight(40)
 
local titlebg_l = frame:CreateTexture(nil,"OVERLAY")
titlebg_l:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
titlebg_l:SetTexCoord(0.21,0.31,0,0.63)
titlebg_l:SetPoint("RIGHT",titlebg,"LEFT",0,0)
titlebg_l:SetWidth(30)
titlebg_l:SetHeight(40)
 
local titlebg_right = frame:CreateTexture(nil,"OVERLAY")
titlebg_right:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
titlebg_right:SetTexCoord(0.67,0.77,0,0.63)
titlebg_right:SetPoint("LEFT",titlebg,"RIGHT",0,0)
titlebg_right:SetWidth(30)
titlebg_right:SetHeight(40)
 
title:SetAllPoints(titlebg)
local titletext = title:CreateFontString(nil,"OVERLAY","GameFontNormal")
titletext:SetPoint("TOP",titlebg,"TOP",0,-14)
 
self.titletext = titletext
 
local sizer_se = CreateFrame("Frame",nil,frame)
sizer_se:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
sizer_se:SetWidth(25)
sizer_se:SetHeight(25)
sizer_se:EnableMouse()
sizer_se:SetScript("OnMouseDown",sizerseOnMouseDown)
sizer_se:SetScript("OnMouseUp", sizerOnMouseUp)
self.sizer_se = sizer_se
 
local line1 = sizer_se:CreateTexture(nil, "BACKGROUND")
self.line1 = line1
line1:SetWidth(14)
line1:SetHeight(14)
line1:SetPoint("BOTTOMRIGHT", -8, 8)
line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
local x = 0.1 * 14/17
line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
 
local line2 = sizer_se:CreateTexture(nil, "BACKGROUND")
self.line2 = line2
line2:SetWidth(8)
line2:SetHeight(8)
line2:SetPoint("BOTTOMRIGHT", -8, 8)
line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
local x = 0.1 * 8/17
line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
 
local sizer_s = CreateFrame("Frame",nil,frame)
sizer_s:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-25,0)
sizer_s:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",0,0)
sizer_s:SetHeight(25)
sizer_s:EnableMouse()
sizer_s:SetScript("OnMouseDown",sizersOnMouseDown)
sizer_s:SetScript("OnMouseUp", sizerOnMouseUp)
self.sizer_s = sizer_s
 
local sizer_e = CreateFrame("Frame",nil,frame)
sizer_e:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,25)
sizer_e:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
sizer_e:SetWidth(25)
sizer_e:EnableMouse()
sizer_e:SetScript("OnMouseDown",sizereOnMouseDown)
sizer_e:SetScript("OnMouseUp", sizerOnMouseUp)
self.sizer_e = sizer_e
 
--Container Support
local content = CreateFrame("Frame",nil,frame)
self.content = content
content.obj = self
content:SetPoint("TOPLEFT",frame,"TOPLEFT",17,-27)
content:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-17,40)
 
AceGUI:RegisterAsContainer(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-InlineGroup.lua New file
0,0 → 1,135
local AceGUI = LibStub("AceGUI-3.0")
 
 
-------------
-- Widgets --
-------------
--[[
Widgets must provide the following functions
Acquire() - Called when the object is aquired, should set everything to a default hidden state
Release() - Called when the object is Released, should remove any anchors and hide the Widget
 
And the following members
frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
type - the type of the object, same as the name given to :RegisterWidget()
 
Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
It will be cleared automatically when a widget is released
Placing values directly into a widget object should be avoided
 
If the Widget can act as a container for other Widgets the following
content - frame or derivitive that children will be anchored to
 
The Widget can supply the following Optional Members
 
 
]]
 
--------------------------
-- Inline Group --
--------------------------
--[[
This is a simple grouping container, no selection
It will resize automatically to the height of the controls added to it
]]
 
do
local Type = "InlineGroup"
local Version = 4
 
local function OnAcquire(self)
self:SetWidth(300)
self:SetHeight(100)
end
 
local function OnRelease(self)
self.frame:ClearAllPoints()
self.frame:Hide()
end
 
local PaneBackdrop = {
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
tile = true, tileSize = 16, edgeSize = 16,
insets = { left = 3, right = 3, top = 5, bottom = 3 }
}
 
local function SetTitle(self,title)
self.titletext:SetText(title)
end
 
 
local function LayoutFinished(self, width, height)
self:SetHeight((height or 0) + 40)
end
 
local function OnWidthSet(self, width)
local content = self.content
local contentwidth = width - 20
if contentwidth < 0 then
contentwidth = 0
end
content:SetWidth(contentwidth)
content.width = contentwidth
end
 
 
local function OnHeightSet(self, height)
local content = self.content
local contentheight = height - 20
if contentheight < 0 then
contentheight = 0
end
content:SetHeight(contentheight)
content.height = contentheight
end
 
local function Constructor()
local frame = CreateFrame("Frame",nil,UIParent)
local self = {}
self.type = Type
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
self.SetTitle = SetTitle
self.frame = frame
self.LayoutFinished = LayoutFinished
self.OnWidthSet = OnWidthSet
self.OnHeightSet = OnHeightSet
 
frame.obj = self
 
frame:SetHeight(100)
frame:SetWidth(100)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
 
local titletext = frame:CreateFontString(nil,"OVERLAY","GameFontNormal")
titletext:SetPoint("TOPLEFT",frame,"TOPLEFT",14,0)
titletext:SetPoint("TOPRIGHT",frame,"TOPRIGHT",-14,0)
titletext:SetJustifyH("LEFT")
titletext:SetHeight(18)
 
self.titletext = titletext
 
local border = CreateFrame("Frame",nil,frame)
self.border = border
border:SetPoint("TOPLEFT",frame,"TOPLEFT",3,-17)
border:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-3,3)
 
border:SetBackdrop(PaneBackdrop)
border:SetBackdropColor(0.1,0.1,0.1,0.5)
border:SetBackdropBorderColor(0.4,0.4,0.4)
 
--Container Support
local content = CreateFrame("Frame",nil,border)
self.content = content
content.obj = self
content:SetPoint("TOPLEFT",border,"TOPLEFT",10,-10)
content:SetPoint("BOTTOMRIGHT",border,"BOTTOMRIGHT",-10,10)
 
AceGUI:RegisterAsContainer(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua New file
0,0 → 1,684
--[[ $Id: AceGUIWidget-DropDown.lua 679 2008-09-06 12:51:18Z nargiddley $ ]]--
local min, max, floor = math.min, math.max, math.floor
 
local AceGUI = LibStub("AceGUI-3.0")
 
local function fixlevels(parent,...)
local i = 1
local child = select(i, ...)
while child do
child:SetFrameLevel(parent:GetFrameLevel()+1)
fixlevels(child, child:GetChildren())
i = i + 1
child = select(i, ...)
end
end
 
local function fixstrata(strata, parent, ...)
local i = 1
local child = select(i, ...)
parent:SetFrameStrata(strata)
while child do
fixstrata(strata, child, child:GetChildren())
i = i + 1
child = select(i, ...)
end
end
 
do
local widgetType = "Dropdown-Pullout"
local widgetVersion = 2
 
--[[ Static data ]]--
 
local backdrop = {
bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
edgeSize = 32,
tileSize = 32,
tile = true,
insets = { left = 11, right = 12, top = 12, bottom = 11 },
}
local sliderBackdrop = {
bgFile = "Interface\\Buttons\\UI-SliderBar-Background",
edgeFile = "Interface\\Buttons\\UI-SliderBar-Border",
tile = true, tileSize = 8, edgeSize = 8,
insets = { left = 3, right = 3, top = 3, bottom = 3 }
}
 
local defaultWidth = 200
local defaultMaxHeight = 600
 
--[[ UI Event Handlers ]]--
 
-- HACK: This should be no part of the pullout, but there
-- is no other 'clean' way to response to any item-OnEnter
-- Used to close Submenus when an other item is entered
local function OnEnter(item)
local self = item.pullout
for k, v in ipairs(self.items) do
if v.CloseMenu and v ~= item then
v:CloseMenu()
end
end
end
 
-- See the note in Constructor() for each scroll related function
local function OnMouseWheel(this, value)
this.obj:MoveScroll(value)
end
 
local function OnScrollValueChanged(this, value)
this.obj:SetScroll(value)
end
 
local function OnSizeChanged(this)
this.obj:FixScroll()
end
 
--[[ Exported methods ]]--
 
-- exported
local function SetScroll(self, value)
local status = self.scrollStatus
local frame, child = self.scrollFrame, self.itemFrame
local height, viewheight = frame:GetHeight(), child:GetHeight()
 
local offset
if height > viewheight then
offset = 0
else
offset = floor((viewheight - height) / 1000 * value)
end
child:ClearAllPoints()
child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", self.slider:IsShown() and -12 or 0, offset)
status.offset = offset
status.scrollvalue = value
end
 
-- exported
local function MoveScroll(self, value)
local status = self.scrollStatus
local frame, child = self.scrollFrame, self.itemFrame
local height, viewheight = frame:GetHeight(), child:GetHeight()
 
if height > viewheight then
self.slider:Hide()
else
self.slider:Show()
local diff = height - viewheight
local delta = 1
if value < 0 then
delta = -1
end
self.slider:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
end
end
 
-- exported
local function FixScroll(self)
local status = self.scrollStatus
local frame, child = self.scrollFrame, self.itemFrame
local height, viewheight = frame:GetHeight(), child:GetHeight()
local offset = status.offset or 0
 
if viewheight < height then
self.slider:Hide()
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, offset)
self.slider:SetValue(0)
else
self.slider:Show()
local value = (offset / (viewheight - height) * 1000)
if value > 1000 then value = 1000 end
self.slider:SetValue(value)
self:SetScroll(value)
if value < 1000 then
child:ClearAllPoints()
child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -12, offset)
status.offset = offset
end
end
end
 
-- exported, AceGUI callback
local function OnAcquire(self)
self.frame:SetParent(UIParent)
--self.itemFrame:SetToplevel(true)
end
 
-- exported, AceGUI callback
local function OnRelease(self)
self:Clear()
self.frame:ClearAllPoints()
self.frame:Hide()
end
 
-- exported
local function AddItem(self, item)
self.items[#self.items + 1] = item
 
local h = #self.items * 16
self.itemFrame:SetHeight(h)
self.frame:SetHeight(min(h + 34, self.maxHeight)) -- +34: 20 for scrollFrame placement (10 offset) and +14 for item placement
 
item.frame:SetPoint("LEFT", self.itemFrame, "LEFT")
item.frame:SetPoint("RIGHT", self.itemFrame, "RIGHT")
 
item:SetPullout(self)
item:SetOnEnter(OnEnter)
end
 
-- exported
local function Open(self, point, relFrame, relPoint, x, y)
local items = self.items
local frame = self.frame
local itemFrame = self.itemFrame
 
frame:SetPoint(point, relFrame, relPoint, x, y)
 
 
local height = 8
for i, item in pairs(items) do
if i == 1 then
item:SetPoint("TOP", itemFrame, "TOP", 0, -2)
else
item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1)
end
 
item:Show()
 
height = height + 16
end
itemFrame:SetHeight(height)
fixstrata("TOOLTIP", frame, frame:GetChildren())
frame:Show()
self:Fire("OnOpen")
end
 
-- exported
local function Close(self)
self.frame:Hide()
self:Fire("OnClose")
end
 
-- exported
local function Clear(self)
local items = self.items
for i, item in pairs(items) do
AceGUI:Release(item)
items[i] = nil
end
end
 
-- exported
local function IterateItems(self)
return ipairs(self.items)
end
 
-- exported
local function SetHideOnLeave(self, val)
self.hideOnLeave = val
end
 
-- exported
local function SetMaxHeight(self, height)
self.maxHeight = height or defaultMaxHeight
if self.frame:GetHeight() > height then
self.frame:SetHeight(height)
elseif (self.itemFrame:GetHeight() + 34) < height then
self.frame:SetHeight(self.itemFrame:GetHeight() + 34) -- see :AddItem
end
end
 
-- exported
local function GetRightBorderWidth(self)
return 6 + (self.slider:IsShown() and 12 or 0)
end
 
-- exported
local function GetLeftBorderWidth(self)
return 6
end
 
--[[ Constructor ]]--
 
local function Constructor()
local count = AceGUI:GetNextWidgetNum(widgetType)
local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent)
local self = {}
self.count = count
self.type = widgetType
self.frame = frame
frame.obj = self
 
self.OnAcquire = OnAcquire
self.OnRelease = OnRelease
 
self.AddItem = AddItem
self.Open = Open
self.Close = Close
self.Clear = Clear
self.IterateItems = IterateItems
self.SetHideOnLeave = SetHideOnLeave
 
self.SetScroll = SetScroll
self.MoveScroll = MoveScroll
self.FixScroll = FixScroll
 
self.SetMaxHeight = SetMaxHeight
self.GetRightBorderWidth = GetRightBorderWidth
self.GetLeftBorderWidth = GetLeftBorderWidth
 
self.items = {}
 
self.scrollStatus = {
scrollvalue = 0,
}
 
self.maxHeight = defaultMaxHeight
 
frame:SetBackdrop(backdrop)
frame:SetBackdropColor(0, 0, 0)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
frame:SetClampedToScreen(true)
frame:SetWidth(defaultWidth)
frame:SetHeight(self.maxHeight)
--frame:SetToplevel(true)
 
-- NOTE: The whole scroll frame code is copied from the AceGUI-3.0 widget ScrollFrame
local scrollFrame = CreateFrame("ScrollFrame", nil, frame)
local itemFrame = CreateFrame("Frame", nil, scrollFrame)
 
self.scrollFrame = scrollFrame
self.itemFrame = itemFrame
 
scrollFrame.obj = self
itemFrame.obj = self
 
local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame)
slider:SetOrientation("VERTICAL")
slider:SetHitRectInsets(0, 0, -10, 0)
slider:SetBackdrop(sliderBackdrop)
slider:SetWidth(8)
slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Vertical")
slider:SetFrameStrata("FULLSCREEN_DIALOG")
self.slider = slider
slider.obj = self
 
scrollFrame:SetScrollChild(itemFrame)
scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12)
scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -6, 12)
scrollFrame:EnableMouseWheel(true)
scrollFrame:SetScript("OnMouseWheel", OnMouseWheel)
scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
scrollFrame:SetToplevel(true)
scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG")
 
itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0)
itemFrame:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", -12, 0)
itemFrame:SetHeight(400)
itemFrame:SetToplevel(true)
itemFrame:SetFrameStrata("FULLSCREEN_DIALOG")
 
slider:SetPoint("TOPLEFT", scrollFrame, "TOPRIGHT", -16, 0)
slider:SetPoint("BOTTOMLEFT", scrollFrame, "BOTTOMRIGHT", -16, 0)
slider:SetScript("OnValueChanged", OnScrollValueChanged)
slider:SetMinMaxValues(0, 1000)
slider:SetValueStep(1)
slider:SetValue(0)
 
scrollFrame:Show()
itemFrame:Show()
slider:Hide()
 
self:FixScroll()
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
end
 
do
local widgetType = "Dropdown"
local widgetVersion = 18
 
--[[ Static data ]]--
 
--[[ UI event handler ]]--
 
local function Control_OnEnter(this)
this.obj:Fire("OnEnter")
end
 
local function Control_OnLeave(this)
this.obj:Fire("OnLeave")
end
 
local function Dropdown_OnHide(this)
local self = this.obj
if self.open then
self.pullout:Close()
end
end
 
local function Dropdown_TogglePullout(this)
local self = this.obj
if self.open then
self.open = nil
self.pullout:Close()
AceGUI:ClearFocus()
else
self.open = true
self.pullout:SetWidth(self.frame:GetWidth())
self.pullout:Open("TOPLEFT", self.frame, "BOTTOMLEFT", 0, self.label:IsShown() and -2 or 0)
AceGUI:SetFocus(self)
end
end
 
local function OnPulloutOpen(this)
local self = this.userdata.obj
local value = self.value
 
if not self.multiselect then
for i, item in this:IterateItems() do
item:SetValue(item.userdata.value == value)
end
end
 
self.open = true
end
 
local function OnPulloutClose(this)
local self = this.userdata.obj
self.open = nil
self:Fire("OnClosed")
end
 
local function ShowMultiText(self)
local text
for i, widget in self.pullout:IterateItems() do
if widget.type == "Dropdown-Item-Toggle" then
if widget:GetValue() then
if text then
text = text..", "..widget:GetText()
else
text = widget:GetText()
end
end
end
end
self:SetText(text)
end
 
local function OnItemValueChanged(this, event, checked)
local self = this.userdata.obj
 
if self.multiselect then
self:Fire("OnValueChanged", this.userdata.value, checked)
ShowMultiText(self)
else
if checked then
self:SetValue(this.userdata.value)
self:Fire("OnValueChanged", this.userdata.value)
else
this:SetValue(true)
end
if self.open then
self.pullout:Close()
end
end
end
 
--[[ Exported methods ]]--
 
-- exported, AceGUI callback
local function OnAcquire(self)
local pullout = AceGUI:Create("Dropdown-Pullout")
self.pullout = pullout
pullout.userdata.obj = self
pullout:SetCallback("OnClose", OnPulloutClose)
pullout:SetCallback("OnOpen", OnPulloutOpen)
self.pullout.frame:SetFrameLevel(self.frame:GetFrameLevel() + 1)
fixlevels(self.pullout.frame, self.pullout.frame:GetChildren())
end
 
-- exported, AceGUI callback
local function OnRelease(self)
if self.open then
self.pullout:Close()
end
AceGUI:Release(self.pullout)
 
self:SetText("")
self:SetLabel("")
self:SetDisabled(false)
self:SetMultiselect(false)
 
self.value = nil
self.list = nil
self.open = nil
self.hasClose = nil
 
self.frame:ClearAllPoints()
self.frame:Hide()
end
 
-- exported
local function SetDisabled(self, disabled)
self.disabled = disabled
if disabled then
self.text:SetTextColor(0.5,0.5,0.5)
self.button:Disable()
self.label:SetTextColor(0.5,0.5,0.5)
else
self.button:Enable()
self.label:SetTextColor(1,.82,0)
self.text:SetTextColor(1,1,1)
end
end
 
-- exported
local function ClearFocus(self)
if self.open then
self.pullout:Close()
end
end
 
-- exported
local function SetText(self, text)
self.text:SetText(text or "")
end
 
-- exported
local function SetLabel(self, text)
if text and text ~= "" then
self.label:SetText(text)
self.label:Show()
self.dropdown:SetPoint("TOPLEFT",self.frame,"TOPLEFT",-15,-18)
self.frame:SetHeight(44)
else
self.label:SetText("")
self.label:Hide()
self.dropdown:SetPoint("TOPLEFT",self.frame,"TOPLEFT",-15,0)
self.frame:SetHeight(26)
end
end
 
-- exported
local function SetValue(self, value)
if self.list then
self:SetText(self.list[value] or "")
end
self.value = value
end
 
-- exported
local function SetItemValue(self, item, value)
if not self.multiselect then return end
for i, widget in self.pullout:IterateItems() do
if widget.userdata.value == item then
if widget.SetValue then
widget:SetValue(value)
end
end
end
ShowMultiText(self)
end
 
-- exported
local function SetItemDisabled(self, item, disabled)
for i, widget in self.pullout:IterateItems() do
if widget.userdata.value == item then
widget:SetDisabled(disabled)
end
end
end
 
local function AddListItem(self, value, text)
local item = AceGUI:Create("Dropdown-Item-Toggle")
item:SetText(text)
item.userdata.obj = self
item.userdata.value = value
item:SetCallback("OnValueChanged", OnItemValueChanged)
self.pullout:AddItem(item)
end
 
local function AddCloseButton(self)
if not self.hasClose then
local close = AceGUI:Create("Dropdown-Item-Execute")
close:SetText(CLOSE)
self.pullout:AddItem(close)
self.hasClose = true
end
end
 
-- exported
local sortlist = {}
local function SetList(self, list)
self.list = list
self.pullout:Clear()
self.hasClose = nil
if not list then return end
 
for v in pairs(list) do
sortlist[#sortlist + 1] = v
end
table.sort(sortlist)
 
for i, value in pairs(sortlist) do
AddListItem(self, value, list[value])
sortlist[i] = nil
end
if self.multiselect then
ShowMultiText(self)
AddCloseButton(self)
end
end
 
-- exported
local function AddItem(self, value, text)
if self.list then
self.list[value] = text
AddListItem(self, value, text)
end
end
 
-- exported
local function SetMultiselect(self, multi)
self.multiselect = multi
if multi then
ShowMultiText(self)
AddCloseButton(self)
end
end
 
-- exported
local function GetMultiselect(self)
return self.multiselect
end
 
--[[ Constructor ]]--
 
local function Constructor()
local count = AceGUI:GetNextWidgetNum(widgetType)
local frame = CreateFrame("Frame", nil, UIParent)
local dropdown = CreateFrame("Frame", "AceGUI30DropDown"..count, frame, "UIDropDownMenuTemplate")
 
local self = {}
self.type = widgetType
self.frame = frame
self.dropdown = dropdown
self.count = count
frame.obj = self
dropdown.obj = self
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
 
self.ClearFocus = ClearFocus
 
self.SetText = SetText
self.SetValue = SetValue
self.SetList = SetList
self.SetLabel = SetLabel
self.SetDisabled = SetDisabled
self.AddItem = AddItem
self.SetMultiselect = SetMultiselect
self.GetMultiselect = GetMultiselect
self.SetItemValue = SetItemValue
self.SetItemDisabled = SetItemDisabled
 
self.alignoffset = 31
 
frame:SetHeight(44)
frame:SetWidth(200)
frame:SetScript("OnHide",Dropdown_OnHide)
 
dropdown:ClearAllPoints()
dropdown:SetPoint("TOPLEFT",frame,"TOPLEFT",-15,0)
dropdown:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",17,0)
dropdown:SetScript("OnHide", nil)
 
local left = _G[dropdown:GetName() .. "Left"]
local middle = _G[dropdown:GetName() .. "Middle"]
local right = _G[dropdown:GetName() .. "Right"]
 
middle:ClearAllPoints()
right:ClearAllPoints()
 
middle:SetPoint("LEFT", left, "RIGHT", 0, 0)
middle:SetPoint("RIGHT", right, "LEFT", 0, 0)
right:SetPoint("TOPRIGHT", dropdown, "TOPRIGHT", 0, 17)
 
local button = _G[dropdown:GetName() .. "Button"]
self.button = button
button.obj = self
button:SetScript("OnEnter",Control_OnEnter)
button:SetScript("OnLeave",Control_OnLeave)
button:SetScript("OnClick",Dropdown_TogglePullout)
 
local text = _G[dropdown:GetName() .. "Text"]
self.text = text
text.obj = self
text:ClearAllPoints()
text:SetPoint("RIGHT", right, "RIGHT" ,-43, 2)
text:SetPoint("LEFT", left, "LEFT", 25, 2)
 
local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
label:SetJustifyH("LEFT")
label:SetHeight(18)
label:Hide()
self.label = label
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
end
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua New file
0,0 → 1,204
local AceGUI = LibStub("AceGUI-3.0")
 
--------------------------
-- Edit box --
--------------------------
--[[
Events :
OnTextChanged
OnEnterPressed
 
]]
do
local Type = "EditBox"
local Version = 8
 
local function OnAcquire(self)
self:SetDisabled(false)
self.showbutton = true
end
 
local function OnRelease(self)
self.frame:ClearAllPoints()
self.frame:Hide()
self:SetDisabled(false)
end
 
local function Control_OnEnter(this)
this.obj:Fire("OnEnter")
end
 
local function Control_OnLeave(this)
this.obj:Fire("OnLeave")
end
 
local function EditBox_OnEscapePressed(this)
this:ClearFocus()
end
 
local function ShowButton(self)
if self.showbutton then
self.button:Show()
self.editbox:SetTextInsets(0,20,3,3)
end
end
 
local function HideButton(self)
self.button:Hide()
self.editbox:SetTextInsets(0,0,3,3)
end
 
local function EditBox_OnEnterPressed(this)
local self = this.obj
local value = this:GetText()
local cancel = self:Fire("OnEnterPressed",value)
if not cancel then
HideButton(self)
end
end
 
local function Button_OnClick(this)
local editbox = this.obj.editbox
editbox:ClearFocus()
EditBox_OnEnterPressed(editbox)
end
 
local function EditBox_OnReceiveDrag(this)
local self = this.obj
local type, id, info = GetCursorInfo()
if type == "item" then
self:SetText(info)
self:Fire("OnEnterPressed",info)
ClearCursor()
elseif type == "spell" then
local name, rank = GetSpellName(id, info)
if rank and rank:match("%d") then
name = name.."("..rank..")"
end
self:SetText(name)
self:Fire("OnEnterPressed",name)
ClearCursor()
end
HideButton(self)
AceGUI:ClearFocus()
end
 
local function EditBox_OnTextChanged(this)
local self = this.obj
local value = this:GetText()
if value ~= self.lasttext then
self:Fire("OnTextChanged",value)
self.lasttext = value
ShowButton(self)
end
end
 
local function SetDisabled(self, disabled)
self.disabled = disabled
if disabled then
self.editbox:EnableMouse(false)
self.editbox:ClearFocus()
self.editbox:SetTextColor(0.5,0.5,0.5)
self.label:SetTextColor(0.5,0.5,0.5)
else
self.editbox:EnableMouse(true)
self.editbox:SetTextColor(1,1,1)
self.label:SetTextColor(1,.82,0)
end
end
 
local function SetText(self, text)
self.lasttext = text or ""
self.editbox:SetText(text or "")
self.editbox:SetCursorPosition(0)
HideButton(self)
end
 
local function SetWidth(self, width)
self.frame:SetWidth(width)
end
 
local function SetLabel(self, text)
if text and text ~= "" then
self.label:SetText(text)
self.label:Show()
self.editbox:SetPoint("TOPLEFT",self.frame,"TOPLEFT",7,-18)
self.frame:SetHeight(44)
else
self.label:SetText("")
self.label:Hide()
self.editbox:SetPoint("TOPLEFT",self.frame,"TOPLEFT",7,0)
self.frame:SetHeight(26)
end
end
 
 
local function Constructor()
local num = AceGUI:GetNextWidgetNum(Type)
local frame = CreateFrame("Frame",nil,UIParent)
local editbox = CreateFrame("EditBox","AceGUI-3.0EditBox"..num,frame,"InputBoxTemplate")
 
local self = {}
self.type = Type
self.num = num
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
 
self.SetDisabled = SetDisabled
self.SetText = SetText
self.SetWidth = SetWidth
self.SetLabel = SetLabel
 
self.frame = frame
frame.obj = self
self.editbox = editbox
editbox.obj = self
 
self.alignoffset = 30
 
frame:SetHeight(44)
frame:SetWidth(200)
 
editbox:SetScript("OnEnter",Control_OnEnter)
editbox:SetScript("OnLeave",Control_OnLeave)
 
editbox:SetAutoFocus(false)
editbox:SetFontObject(ChatFontNormal)
editbox:SetScript("OnEscapePressed",EditBox_OnEscapePressed)
editbox:SetScript("OnEnterPressed",EditBox_OnEnterPressed)
editbox:SetScript("OnTextChanged",EditBox_OnTextChanged)
editbox:SetScript("OnReceiveDrag", EditBox_OnReceiveDrag)
editbox:SetScript("OnMouseDown", EditBox_OnReceiveDrag)
 
editbox:SetTextInsets(0,0,3,3)
editbox:SetMaxLetters(256)
 
editbox:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",6,0)
editbox:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
editbox:SetHeight(19)
 
local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,-2)
label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,-2)
label:SetJustifyH("LEFT")
label:SetHeight(18)
self.label = label
 
local button = CreateFrame("Button",nil,editbox,"UIPanelButtonTemplate")
button:SetWidth(40)
button:SetHeight(20)
button:SetPoint("RIGHT",editbox,"RIGHT",-2,0)
button:SetText(OKAY)
button:SetScript("OnClick", Button_OnClick)
button:Hide()
 
self.button = button
button.obj = self
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua New file
0,0 → 1,71
local AceGUI = LibStub("AceGUI-3.0")
 
--------------------------
-- Heading --
--------------------------
do
local Type = "Heading"
local Version = 3
 
local function OnAcquire(self)
self:SetText("")
end
 
local function OnRelease(self)
self.frame:ClearAllPoints()
self.frame:Hide()
end
 
local function SetText(self, text)
self.label:SetText(text or "")
if (text or "") == "" then
self.left:SetPoint("RIGHT",self.frame,"RIGHT",-3,0)
self.right:Hide()
else
self.left:SetPoint("RIGHT",self.label,"LEFT",-5,0)
self.right:Show()
end
end
 
local function Constructor()
local frame = CreateFrame("Frame",nil,UIParent)
local self = {}
self.type = Type
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
self.SetText = SetText
self.frame = frame
frame.obj = self
 
frame:SetHeight(18)
 
local label = frame:CreateFontString(nil,"BACKGROUND","GameFontNormal")
label:SetPoint("TOP",frame,"TOP",0,0)
label:SetPoint("BOTTOM",frame,"BOTTOM",0,0)
label:SetJustifyH("CENTER")
label:SetHeight(18)
self.label = label
 
local left = frame:CreateTexture(nil, "BACKGROUND")
self.left = left
left:SetHeight(8)
left:SetPoint("LEFT",frame,"LEFT",3,0)
left:SetPoint("RIGHT",label,"LEFT",-5,0)
left:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
left:SetTexCoord(0.81, 0.94, 0.5, 1)
 
local right = frame:CreateTexture(nil, "BACKGROUND")
self.right = right
right:SetHeight(8)
right:SetPoint("RIGHT",frame,"RIGHT",-3,0)
right:SetPoint("LEFT",label,"RIGHT",5,0)
right:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
right:SetTexCoord(0.81, 0.94, 0.5, 1)
 
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
EasyDaily-Beta/libs/AceGUI-3.0/widgets/AceGUIWidget-SimpleGroup.lua New file
0,0 → 1,96
local AceGUI = LibStub("AceGUI-3.0")
 
 
-------------
-- Widgets --
-------------
--[[
Widgets must provide the following functions
Acquire() - Called when the object is aquired, should set everything to a default hidden state
Release() - Called when the object is Released, should remove any anchors and hide the Widget
 
And the following members
frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
type - the type of the object, same as the name given to :RegisterWidget()
 
Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
It will be cleared automatically when a widget is released
Placing values directly into a widget object should be avoided
 
If the Widget can act as a container for other Widgets the following
content - frame or derivitive that children will be anchored to
 
The Widget can supply the following Optional Members
 
 
]]
 
--------------------------
-- Simple Group --
--------------------------
--[[
This is a simple grouping container, no selection, no borders
It will resize automatically to the height of the controls added to it
]]
 
do
local Type = "SimpleGroup"
local Version = 4
 
local function OnAcquire(self)
self:SetWidth(300)
self:SetHeight(100)
end
 
local function OnRelease(self)
self.frame:ClearAllPoints()
self.frame:Hide()
end
 
local function LayoutFinished(self, width, height)
self:SetHeight(height or 0)
end
 
local function OnWidthSet(self, width)
local content = self.content
content:SetWidth(width)
content.width = width
end
 
local function OnHeightSet(self, height)
local content = self.content
content:SetHeight(height)
content.height = height
end
 
local function Constructor()
local frame = CreateFrame("Frame",nil,UIParent)
local self = {}
self.type = Type
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
self.frame = frame
self.LayoutFinished = LayoutFinished
self.OnWidthSet = OnWidthSet
self.OnHeightSet = OnHeightSet
 
frame.obj = self
 
frame:SetHeight(100)
frame:SetWidth(100)
frame:SetFrameStrata("FULLSCREEN_DIALOG")
 
--Container Support
local content = CreateFrame("Frame",nil,frame)
self.content = content
content.obj = self
content:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
content:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
 
AceGUI:RegisterAsContainer(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor,Version)
end
EasyDaily-Beta/libs/AceGUI-3.0/AceGUI-3.0.xml New file
0,0 → 1,24
<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="AceGUI-3.0.lua"/>
<Script file="widgets\AceGUIWidget-Button.lua"/>
<Script file="widgets\AceGUIWidget-CheckBox.lua"/>
<Script file="widgets\AceGUIWidget-ColorPicker.lua"/>
<Script file="widgets\AceGUIWidget-DropDownGroup.lua"/>
<Script file="widgets\AceGUIWidget-DropDown.lua"/>
<Script file="widgets\AceGUIWidget-DropDown-Items.lua"/>
<Script file="widgets\AceGUIWidget-EditBox.lua"/>
<Script file="widgets\AceGUIWidget-Frame.lua"/>
<Script file="widgets\AceGUIWidget-Heading.lua"/>
<Script file="widgets\AceGUIWidget-InlineGroup.lua"/>
<Script file="widgets\AceGUIWidget-Keybinding.lua"/>
<Script file="widgets\AceGUIWidget-ScrollFrame.lua"/>
<Script file="widgets\AceGUIWidget-SimpleGroup.lua"/>
<Script file="widgets\AceGUIWidget-Slider.lua"/>
<Script file="widgets\AceGUIWidget-TabGroup.lua"/>
<Script file="widgets\AceGUIWidget-TreeGroup.lua"/>
<Script file="widgets\AceGUIWidget-Label.lua"/>
<Script file="widgets\AceGUIWidget-MultiLineEditBox.lua"/>
<Script file="widgets\AceGUIWidget-BlizOptionsGroup.lua"/>
<Script file="widgets\AceGUIWidget-Icon.lua"/>
</Ui>
\ No newline at end of file
EasyDaily-Beta/libs/AceGUI-3.0/AceGUI-3.0.lua New file
0,0 → 1,703
--[[ $Id: AceGUI-3.0.lua 681 2008-09-06 13:01:59Z nargiddley $ ]]
local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 16
local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)
 
if not AceGUI then return end -- No upgrade needed
 
--local con = LibStub("AceConsole-3.0",true)
 
AceGUI.WidgetRegistry = AceGUI.WidgetRegistry or {}
AceGUI.LayoutRegistry = AceGUI.LayoutRegistry or {}
AceGUI.WidgetBase = AceGUI.WidgetBase or {}
AceGUI.WidgetContainerBase = AceGUI.WidgetContainerBase or {}
AceGUI.WidgetVersions = AceGUI.WidgetVersions or {}
 
-- local upvalues
local WidgetRegistry = AceGUI.WidgetRegistry
local LayoutRegistry = AceGUI.LayoutRegistry
local WidgetVersions = AceGUI.WidgetVersions
 
local pcall = pcall
local select = select
local pairs = pairs
local ipairs = ipairs
local type = type
local assert = assert
local tinsert = tinsert
local tremove = tremove
local CreateFrame = CreateFrame
local UIParent = UIParent
 
--[[
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", table.concat(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, ...)
return Dispatchers[select('#', ...)](func, ...)
end
 
-- Recycling functions
local new, del
do
AceGUI.objPools = AceGUI.objPools or {}
local objPools = AceGUI.objPools
--Returns a new instance, if none are available either returns a new table or calls the given contructor
function new(type,constructor,...)
if not type then
type = "table"
end
if not objPools[type] then
objPools[type] = {}
end
local newObj = tremove(objPools[type])
if not newObj then
newObj = constructor and constructor(...) or {}
end
return newObj
end
-- Releases an instance to the Pool
function del(obj,type)
if not type then
type = "table"
end
if not objPools[type] then
objPools[type] = {}
end
for i,v in ipairs(objPools[type]) do
if v == obj then
error("Attempt to Release Widget that is already released")
return
end
end
tinsert(objPools[type],obj)
end
end
 
 
-------------------
-- API Functions --
-------------------
 
-- Gets a widget Object
 
function AceGUI:Create(type)
local reg = WidgetRegistry
if reg[type] then
local widget = new(type,reg[type])
 
if rawget(widget,'Acquire') then
widget.OnAcquire = widget.Acquire
widget.Acquire = nil
elseif rawget(widget,'Aquire') then
widget.OnAcquire = widget.Aquire
widget.Aquire = nil
end
 
if rawget(widget,'Release') then
widget.OnRelease = rawget(widget,'Release')
widget.Release = nil
end
 
if widget.OnAcquire then
widget:OnAcquire()
else
error(("Widget type %s doesn't supply an OnAcquire Function"):format(type))
end
safecall(widget.ResumeLayout, widget)
return widget
end
end
 
-- Releases a widget Object
function AceGUI:Release(widget)
safecall( widget.PauseLayout, widget )
widget:Fire("OnRelease")
safecall( widget.ReleaseChildren, widget )
 
if widget.OnRelease then
widget:OnRelease()
else
error(("Widget type %s doesn't supply an OnRelease Function"):format(type))
end
for k in pairs(widget.userdata) do
widget.userdata[k] = nil
end
for k in pairs(widget.events) do
widget.events[k] = nil
end
widget.width = nil
--widget.frame:SetParent(nil)
widget.frame:ClearAllPoints()
widget.frame:Hide()
widget.frame:SetParent(nil)
if widget.content then
widget.content.width = nil
widget.content.height = nil
end
del(widget,widget.type)
end
 
-----------
-- Focus --
-----------
 
-----
-- Called when a widget has taken focus
-- e.g. Dropdowns opening, Editboxes gaining kb focus
-----
function AceGUI:SetFocus(widget)
if self.FocusedWidget and self.FocusedWidget ~= widget then
safecall(self.FocusedWidget.ClearFocus, self.FocusedWidget)
end
self.FocusedWidget = widget
end
 
-----
-- Called when something has happened that could cause widgets with focus to drop it
-- e.g. titlebar of a frame being clicked
-----
function AceGUI:ClearFocus()
if self.FocusedWidget then
safecall(self.FocusedWidget.ClearFocus, self.FocusedWidget)
self.FocusedWidget = nil
end
end
 
-------------
-- Widgets --
-------------
--[[
Widgets must provide the following functions
OnAcquire() - Called when the object is acquired, should set everything to a default hidden state
OnRelease() - Called when the object is Released, should remove any anchors and hide the Widget
 
And the following members
frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
type - the type of the object, same as the name given to :RegisterWidget()
 
Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
It will be cleared automatically when a widget is released
Placing values directly into a widget object should be avoided
 
If the Widget can act as a container for other Widgets the following
content - frame or derivitive that children will be anchored to
 
The Widget can supply the following Optional Members
:OnWidthSet(width) - Called when the width of the widget is changed
:OnHeightSet(height) - Called when the height of the widget is changed
Widgets should not use the OnSizeChanged events of thier frame or content members, use these methods instead
AceGUI already sets a handler to the event
:OnLayoutFinished(width, height) - called after a layout has finished, the width and height will be the width and height of the
area used for controls. These can be nil if the layout used the existing size to layout the controls.
 
]]
 
--------------------------
-- Widget Base Template --
--------------------------
do
local function fixlevels(parent,...)
local i = 1
local child = select(i, ...)
while child do
child:SetFrameLevel(parent:GetFrameLevel()+1)
fixlevels(child, child:GetChildren())
i = i + 1
child = select(i, ...)
end
end
 
local WidgetBase = AceGUI.WidgetBase
 
WidgetBase.SetParent = function(self, parent)
local frame = self.frame
frame:SetParent(nil)
frame:SetParent(parent.content)
self.parent = parent
fixlevels(parent.frame,parent.frame:GetChildren())
end
 
WidgetBase.SetCallback = function(self, name, func)
if type(func) == "function" then
self.events[name] = func
end
end
 
WidgetBase.Fire = function(self, name, ...)
if self.events[name] then
local success, ret = safecall(self.events[name], self, name, ...)
if success then
return ret
end
end
end
 
WidgetBase.SetWidth = function(self, width)
self.frame:SetWidth(width)
self.frame.width = width
if self.OnWidthSet then
self:OnWidthSet(width)
end
end
 
WidgetBase.SetHeight = function(self, height)
self.frame:SetHeight(height)
self.frame.height = height
if self.OnHeightSet then
self:OnHeightSet(height)
end
end
 
WidgetBase.IsVisible = function(self)
return self.frame:IsVisible()
end
 
WidgetBase.IsShown= function(self)
return self.frame:IsShown()
end
 
WidgetBase.Release = function(self)
AceGUI:Release(self)
end
 
WidgetBase.SetPoint = function(self, ...)
return self.frame:SetPoint(...)
end
 
WidgetBase.ClearAllPoints = function(self)
return self.frame:ClearAllPoints()
end
 
WidgetBase.GetNumPoints = function(self)
return self.frame:GetNumPoints()
end
 
WidgetBase.GetPoint = function(self, ...)
return self.frame:GetPoint(...)
end
 
WidgetBase.GetUserDataTable = function(self)
return self.userdata
end
 
WidgetBase.SetUserData = function(self, key, value)
self.userdata[key] = value
end
 
WidgetBase.GetUserData = function(self, key)
return self.userdata[key]
end
 
WidgetBase.IsFullHeight = function(self)
return self.height == "fill"
end
 
WidgetBase.SetFullHeight = function(self, isFull)
if isFull then
self.height = "fill"
else
self.height = nil
end
end
 
WidgetBase.IsFullWidth = function(self)
return self.width == "fill"
end
 
WidgetBase.SetFullWidth = function(self, isFull)
if isFull then
self.width = "fill"
else
self.width = nil
end
end
 
-- local function LayoutOnUpdate(this)
-- this:SetScript("OnUpdate",nil)
-- this.obj:PerformLayout()
-- end
 
local WidgetContainerBase = AceGUI.WidgetContainerBase
 
WidgetContainerBase.PauseLayout = function(self)
self.LayoutPaused = true
end
 
WidgetContainerBase.ResumeLayout = function(self)
self.LayoutPaused = nil
end
 
WidgetContainerBase.PerformLayout = function(self)
if self.LayoutPaused then
return
end
safecall(self.LayoutFunc,self.content, self.children)
end
 
--call this function to layout, makes sure layed out objects get a frame to get sizes etc
WidgetContainerBase.DoLayout = function(self)
self:PerformLayout()
-- if not self.parent then
-- self.frame:SetScript("OnUpdate", LayoutOnUpdate)
-- end
end
 
WidgetContainerBase.AddChild = function(self, child)
tinsert(self.children,child)
child:SetParent(self)
child.frame:Show()
self:DoLayout()
end
 
WidgetContainerBase.ReleaseChildren = function(self)
local children = self.children
for i in ipairs(children) do
AceGUI:Release(children[i])
children[i] = nil
end
end
 
WidgetContainerBase.SetLayout = function(self, Layout)
self.LayoutFunc = AceGUI:GetLayout(Layout)
end
 
local function FrameResize(this)
local self = this.obj
if this:GetWidth() and this:GetHeight() then
if self.OnWidthSet then
self:OnWidthSet(this:GetWidth())
end
if self.OnHeightSet then
self:OnHeightSet(this:GetHeight())
end
end
end
 
local function ContentResize(this)
if this:GetWidth() and this:GetHeight() then
this.width = this:GetWidth()
this.height = this:GetHeight()
this.obj:DoLayout()
end
end
 
setmetatable(WidgetContainerBase,{__index=WidgetBase})
 
--One of these function should be called on each Widget Instance as part of its creation process
function AceGUI:RegisterAsContainer(widget)
widget.children = {}
widget.userdata = {}
widget.events = {}
widget.base = WidgetContainerBase
widget.content.obj = widget
widget.frame.obj = widget
widget.content:SetScript("OnSizeChanged",ContentResize)
widget.frame:SetScript("OnSizeChanged",FrameResize)
setmetatable(widget,{__index=WidgetContainerBase})
widget:SetLayout("List")
end
 
function AceGUI:RegisterAsWidget(widget)
widget.userdata = {}
widget.events = {}
widget.base = WidgetBase
widget.frame.obj = widget
widget.frame:SetScript("OnSizeChanged",FrameResize)
setmetatable(widget,{__index=WidgetBase})
end
end
 
 
 
 
------------------
-- Widget API --
------------------
-- Registers a widget Constructor, this function returns a new instance of the Widget
function AceGUI:RegisterWidgetType(Name, Constructor, Version)
assert(type(Constructor) == "function")
assert(type(Version) == "number")
 
local oldVersion = WidgetVersions[Name]
if oldVersion and oldVersion >= Version then return end
 
WidgetVersions[Name] = Version
WidgetRegistry[Name] = Constructor
end
 
-- Registers a Layout Function
function AceGUI:RegisterLayout(Name, LayoutFunc)
assert(type(LayoutFunc) == "function")
if type(Name) == "string" then
Name = Name:upper()
end
LayoutRegistry[Name] = LayoutFunc
end
 
function AceGUI:GetLayout(Name)
if type(Name) == "string" then
Name = Name:upper()
end
return LayoutRegistry[Name]
end
 
AceGUI.counts = AceGUI.counts or {}
 
function AceGUI:GetNextWidgetNum(type)
if not self.counts[type] then
self.counts[type] = 0
end
self.counts[type] = self.counts[type] + 1
return self.counts[type]
end
 
--[[ Widget Template
 
--------------------------
-- Widget Name --
--------------------------
do
local Type = "Type"
 
local function OnAcquire(self)
 
end
 
local function OnRelease(self)
self.frame:ClearAllPoints()
self.frame:Hide()
end
 
 
local function Constructor()
local frame = CreateFrame("Frame",nil,UIParent)
local self = {}
self.type = Type
 
self.OnRelease = OnRelease
self.OnAcquire = OnAcquire
 
self.frame = frame
frame.obj = self
 
--Container Support
--local content = CreateFrame("Frame",nil,frame)
--self.content = content
 
--AceGUI:RegisterAsContainer(self)
AceGUI:RegisterAsWidget(self)
return self
end
 
AceGUI:RegisterWidgetType(Type,Constructor)
end
 
 
]]
 
-------------
-- Layouts --
-------------
 
--[[
A Layout is a func that takes 2 parameters
content - the frame that widgets will be placed inside
children - a table containing the widgets to layout
 
]]
 
-- Very simple Layout, Children are stacked on top of each other down the left side
AceGUI:RegisterLayout("List",
function(content, children)
 
local height = 0
local width = content.width or content:GetWidth() or 0
for i, child in ipairs(children) do
 
 
local frame = child.frame
frame:ClearAllPoints()
frame:Show()
if i == 1 then
frame:SetPoint("TOPLEFT",content,"TOPLEFT",0,0)
else
frame:SetPoint("TOPLEFT",children[i-1].frame,"BOTTOMLEFT",0,0)
end
 
if child.width == "fill" then
child:SetWidth(width)
frame:SetPoint("RIGHT",content,"RIGHT")
if child.OnWidthSet then
child:OnWidthSet(content.width or content:GetWidth())
end
if child.DoLayout then
child:DoLayout()
end
end
 
height = height + (frame.height or frame:GetHeight() or 0)
end
safecall( content.obj.LayoutFinished, content.obj, nil, height )
end
)
 
-- A single control fills the whole content area
AceGUI:RegisterLayout("Fill",
function(content, children)
if children[1] then
children[1]:SetWidth(content:GetWidth() or 0)
children[1]:SetHeight(content:GetHeight() or 0)
children[1].frame:SetAllPoints(content)
children[1].frame:Show()
safecall( content.obj.LayoutFinished, content.obj, nil, children[1].frame:GetHeight() )
end
end
)
 
AceGUI:RegisterLayout("Flow",
function(content, children)
--used height so far
local height = 0
--width used in the current row
local usedwidth = 0
--height of the current row
local rowheight = 0
local rowoffset = 0
local lastrowoffset
 
local width = content.width or content:GetWidth() or 0
 
--control at the start of the row
local rowstart
local rowstartoffset
local lastrowstart
local isfullheight
 
local frameoffset
local lastframeoffset
local oversize
for i, child in ipairs(children) do
oversize = nil
local frame = child.frame
local frameheight = frame.height or frame:GetHeight() or 0
local framewidth = frame.width or frame:GetWidth() or 0
lastframeoffset = frameoffset
frameoffset = child.alignoffset or (frameheight / 2)
 
frame:Show()
frame:ClearAllPoints()
if i == 1 then
-- anchor the first control to the top left
--frame:SetPoint("TOPLEFT",content,"TOPLEFT",0,0)
rowheight = frameheight
rowoffset = frameoffset
rowstart = frame
rowstartoffset = frameoffset
usedwidth = framewidth
if usedwidth > width then
oversize = true
end
else
-- if there isn't available width for the control start a new row
-- if a control is "fill" it will be on a row of its own full width
if usedwidth == 0 or ((framewidth) + usedwidth > width) or child.width == "fill" then
--anchor the previous row, we will now know its height and offset
rowstart:SetPoint("TOPLEFT",content,"TOPLEFT",0,-(height+(rowoffset-rowstartoffset)+3))
height = height + rowheight + 3
--save this as the rowstart so we can anchor it after the row is complete and we have the max height and offset of controls in it
rowstart = frame
rowstartoffset = frameoffset
rowheight = frameheight
rowoffset = frameoffset
usedwidth = frame.width or frame:GetWidth()
if usedwidth > width then
oversize = true
end
-- put the control on the current row, adding it to the width and checking if the height needs to be increased
else
--handles cases where the new height is higher than either control because of the offsets
--math.max(rowheight-rowoffset+frameoffset, frameheight-frameoffset+rowoffset)
 
--offset is always the larger of the two offsets
rowoffset = math.max(rowoffset, frameoffset)
 
rowheight = math.max(rowheight,rowoffset+(frameheight/2))
frame:SetPoint("TOPLEFT",children[i-1].frame,"TOPRIGHT",0,frameoffset-lastframeoffset)
usedwidth = framewidth + usedwidth
end
end
 
if child.width == "fill" then
child:SetWidth(width)
frame:SetPoint("RIGHT",content,"RIGHT",0,0)
 
usedwidth = 0
rowstart = frame
rowstartoffset = frameoffset
 
if child.DoLayout then
child:DoLayout()
end
rowheight = frame.height or frame:GetHeight() or 0
rowoffset = child.alignoffset or (rowheight / 2)
rowstartoffset = rowoffset
elseif oversize then
if width > 1 then
frame:SetPoint("RIGHT",content,"RIGHT",0,0)
end
end
 
if child.height == "fill" then
frame:SetPoint("BOTTOM",content,"BOTTOM")
isfullheight = true
break
end
end
 
--anchor the last row, if its full height needs a special case since its height has just been changed by the anchor
if isfullheight then
rowstart:SetPoint("TOPLEFT",content,"TOPLEFT",0,-height)
elseif rowstart then
rowstart:SetPoint("TOPLEFT",content,"TOPLEFT",0,-(height+(rowoffset-rowstartoffset)+3))
end
 
height = height + rowheight + 3
safecall( content.obj.LayoutFinished, content.obj, nil, height )
end
)
EasyDaily-Beta/libs/AceAddon-3.0/AceAddon-3.0.xml New file
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>
\ No newline at end of file
EasyDaily-Beta/libs/AceAddon-3.0/AceAddon-3.0.lua New file
0,0 → 1,448
--[[ $Id: AceAddon-3.0.lua 654 2008-05-21 13:43:29Z ammo $ ]]
local MAJOR, MINOR = "AceAddon-3.0", 5
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
 
local tinsert, tconcat = table.insert, table.concat
local fmt = string.format
local pairs, next, type = pairs, next, type
 
--[[
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
 
-- AceAddon:NewAddon( [object, ]name, [lib, lib, lib, ...] )
-- [object] (table) - table to use as the base for the addon
-- name (string) - unique addon object name
-- [lib] (string) - optional libs to embed in the addon object
--
-- returns the addon object when succesful
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.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
 
 
-- AceAddon:GetAddon( name, [silent])
-- name (string) - unique addon object name
-- silent (boolean) - if true, addon is optional, silently return nil if its not found
--
-- throws an error if the addon object can not be found (except silent is set)
-- returns the addon object if found
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
 
-- AceAddon:EmbedLibraries( addon, [lib, lib, lib, ...] )
-- addon (object) - addon to embed the libs in
-- [lib] (string) - optional libs to embed
function AceAddon:EmbedLibraries(addon, ...)
for i=1,select("#", ... ) do
local libname = select(i, ...)
self:EmbedLibrary(addon, libname, false, 4)
end
end
 
-- AceAddon:EmbedLibrary( addon, libname, silent, offset )
-- addon (object) - addon to embed the libs in
-- libname (string) - lib to embed
-- [silent] (boolean) - optional, marks an embed to fail silently if the library doesn't exist.
-- [offset] (number) - will push the error messages back to said offset defaults to 2
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
 
-- addon:GetModule( name, [silent])
-- name (string) - unique module object name
-- silent (boolean) - if true, module is optional, silently return nil if its not found
--
-- throws an error if the addon object can not be found (except silent is set)
-- returns the module object if found
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
 
-- addon:NewModule( name, [prototype, [lib, lib, lib, ...] )
-- name (string) - unique module object name for this addon
-- prototype (object) - object to derive this module from, methods and values from this table will be mixed into the module, if a string is passed a lib is assumed
-- [lib] (string) - optional libs to embed in the addon object
--
-- returns the addon object when succesful
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
 
return module
end
 
--addon:GetName()
-- Returns the real name of the addon or module, without any prefix
function GetName(self)
return self.moduleName or self.name
end
 
--addon:Enable()
-- Enables the Addon if possible, return true or false depending on success
function Enable(self)
self:SetEnabledState(true)
return AceAddon:EnableAddon(self)
end
 
--addon:Disable()
-- Disables the Addon if possible, return true or false depending on success
function Disable(self)
self:SetEnabledState(false)
return AceAddon:DisableAddon(self)
end
 
-- addon:EnableModule( name )
-- name (string) - unique module object name
--
-- Enables the Module if possible, return true or false depending on success
function EnableModule(self, name)
local module = self:GetModule( name )
return module:Enable()
end
 
-- addon:DisableModule( name )
-- name (string) - unique module object name
--
-- Disables the Module if possible, return true or false depending on success
function DisableModule(self, name)
local module = self:GetModule( name )
return module:Disable()
end
 
-- addon:SetDefaultModuleLibraries( [lib, lib, lib, ...] )
-- [lib] (string) - libs to embed in every module
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
 
-- addon:SetDefaultModuleState( state )
-- state (boolean) - default state for new modules (enabled=true, disabled=false)
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
 
-- addon:SetDefaultModulePrototype( prototype )
-- prototype (string or table) - the default prototype to use if none is specified on module creation
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
 
-- addon:SetEnabledState ( state )
-- state ( boolean ) - set the state of an addon or module (enabled=true, disabled=false)
--
-- should only be called before any Enabling actually happend, aka in OnInitialize
function SetEnabledState(self, state)
self.enabledState = state
end
 
 
local function IterateModules(self) return pairs(self.modules) end
local function IterateEmbeds(self) return pairs(AceAddon.embeds[self]) 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)
for k, v in pairs(mixins) do
target[k] = v
end
for k, v in pairs(pmixins) do
target[k] = target[k] or v
end
end
 
 
-- AceAddon:IntializeAddon( addon )
-- addon (object) - addon to intialize
--
-- calls OnInitialize on the addon object if available
-- calls OnEmbedInitialize on embedded libs in the addon object if available
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
 
-- AceAddon:EnableAddon( addon )
-- addon (object) - addon to enable
--
-- calls OnEnable on the addon object if available
-- calls OnEmbedEnable on embedded libs in the addon object if available
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
 
-- TODO: handle 'first'? Or let addons do it on their own?
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.
for name, module in pairs(addon.modules) do
self:EnableAddon(module)
end
end
return self.statuses[addon.name] -- return true if we're disabled
end
 
-- AceAddon:DisableAddon( addon )
-- addon (object|string) - addon to disable
--
-- calls OnDisable on the addon object if available
-- calls OnEmbedDisable on embedded libs in the addon object if available
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.
for name, module in pairs(addon.modules) do
self:DisableAddon(module)
end
end
 
return not self.statuses[addon.name] -- return true if we're disabled
end
 
--The next few funcs are just because no one should be reaching into the internal registries
--Thoughts?
function AceAddon:IterateAddons() return pairs(self.addons) end
function AceAddon:IterateEmbedsOnAddon(addon) return pairs(self.embeds[addon]) end
function AceAddon:IterateAddonStatus() return pairs(self.statuses) end
function AceAddon:IterateModulesOfAddon(addon) return pairs(addon.modules) end
 
-- Event Handling
local function onEvent(this, event, arg1)
if event == "ADDON_LOADED" 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)
end
EasyDaily-Beta/libs/AceDB-3.0/AceDB-3.0.xml New file
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>
\ No newline at end of file
EasyDaily-Beta/libs/AceDB-3.0/AceDB-3.0.lua New file
0,0 → 1,626
--[[ $Id: AceDB-3.0.lua 667 2008-06-11 14:34:58Z nevcairiel $ ]]
local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 8
local AceDB, oldminor = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR)
 
if not AceDB then return end -- No upgrade needed
 
local type = type
local pairs, next = pairs, next
local rawget, rawset = rawget, rawset
local setmetatable = setmetatable
 
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)
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 not next(value) 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 not next(db[k]) 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
-- remove all metatables from the db
setmetatable(db, nil)
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
-- Actual database initialization function
local function initdb(sv, defaults, defaultProfile, olddb, parent)
-- Generate the database keys for each section
 
-- Make a container for profile keys
if not sv.profileKeys then sv.profileKeys = {} end
 
-- Try to get the profile selected from the char db
local profileKey = sv.profileKeys[charKey] or defaultProfile or charKey
sv.profileKeys[charKey] = profileKey
 
-- 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,
["profile"] = profileKey,
["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
local function logoutHandler(frame, event)
if event == "PLAYER_LOGOUT" then
for db in pairs(AceDB.db_registry) do
db.callbacks:Fire("OnDatabaseShutdown", db)
for section, key in pairs(db.keys) do
if db.defaults and db.defaults[section] and rawget(db, section) then
removeDefaults(db[section], db.defaults[section])
end
end
end
end
end
 
AceDB.frame:RegisterEvent("PLAYER_LOGOUT")
AceDB.frame:SetScript("OnEvent", logoutHandler)
 
 
--[[-------------------------------------------------------------------------
AceDB Object Method Definitions
---------------------------------------------------------------------------]]
 
-- DBObject:RegisterDefaults(defaults)
-- defaults (table) - A table of defaults for this database
--
-- Sets the defaults table for the given database object by clearing any
-- that are currently set, and then setting the new defaults.
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
 
-- DBObject:SetProfile(name)
-- name (string) - The name of the profile to set as the current profile
--
-- Changes the profile of the database and all of it's namespaces to the
-- supplied named 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
 
if oldProfile and defaults then
-- Remove the defaults from the old profile
removeDefaults(oldProfile, defaults)
end
 
self.profile = nil
self.keys["profile"] = name
self.sv.profileKeys[charKey] = name
 
-- 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
 
-- DBObject:GetProfiles(tbl)
-- tbl (table) - A table to store the profile names in (optional)
--
-- 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.
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
 
-- DBObject:GetCurrentProfile()
--
-- Returns the current profile name used by the database
function DBObjectLib:GetCurrentProfile()
return self.keys.profile
end
 
-- DBObject:DeleteProfile(name)
-- name (string) - The name of the profile to be deleted
--
-- Deletes a named profile. This profile must not be the active profile.
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.sv.profiles, name) and not silent then
error("Cannot delete profile '" .. name .. "'. It does not exist.", 2)
end
 
self.sv.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
 
-- Callback: OnProfileDeleted, database, profileKey
self.callbacks:Fire("OnProfileDeleted", self, name)
end
 
-- DBObject:CopyProfile(name)
-- name (string) - The name of the profile to be copied into the current profile
--
-- Copies a named profile into the current profile, overwriting any conflicting
-- settings.
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.sv.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)
 
local profile = self.profile
local source = self.sv.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
 
-- DBObject:ResetProfile()
-- noChildren (boolean) - if set to true, the reset will not be populated to the child namespaces of this DB object
--
-- Resets the current profile
function DBObjectLib:ResetProfile(noChildren)
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)
end
end
 
-- Callback: OnProfileReset, database
self.callbacks:Fire("OnProfileReset", self)
end
 
-- DBObject:ResetDB(defaultProfile)
-- defaultProfile (string) - The profile name to use as the default
--
-- Resets the entire database, using the string defaultProfile as the default
-- profile.
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
 
-- DBObject:RegisterNamespace(name [, defaults])
-- name (string) - The name of the new namespace
-- defaults (table) - A table of values to use as defaults
--
-- 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
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
 
--[[-------------------------------------------------------------------------
AceDB Exposed Methods
---------------------------------------------------------------------------]]
 
-- AceDB:New(name, defaults, defaultProfile)
-- name (table or string) - The name of variable, or table to use for the database
-- defaults (table) - A table of database defaults
-- defaultProfile (string) - The name of the default profile
--
-- Creates a new database object that can be used to handle database settings
-- and profiles.
function AceDB:New(tbl, defaults, defaultProfile)
if type(tbl) == "string" then
local name = tbl
tbl = getglobal(name)
if not tbl then
tbl = {}
setglobal(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" then
error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaultProfile' - string 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
end
end
EasyDaily-Beta/libs/LibGratuity-3.0/LibGratuity-3.0.lua New file
0,0 → 1,247
--[[
Name: LibGratuity-3.0
Revision: $Rev: 39 $
Author: Tekkub Stoutwrithe (tekkub@gmail.com)
SVN: svn://svn.wowace.com/root/trunk/LibGratuity-3.0
Description: Tooltip parsing library
Dependencies: (optional) Deformat-2.0
]]
 
local vmajor, vminor = "LibGratuity-3.0", 90000 + tonumber(("$Revision: 39 $"):match("%d+"))
 
local lib = LibStub:NewLibrary(vmajor, vminor)
if not lib then
return
end
 
local methods = {
"SetBagItem", "SetAction", "SetAuctionItem", "SetAuctionSellItem", "SetBuybackItem",
"SetCraftItem", "SetCraftSpell", "SetHyperlink", "SetInboxItem", "SetInventoryItem",
"SetLootItem", "SetLootRollItem", "SetMerchantItem", "SetPetAction", "SetPlayerBuff",
"SetQuestItem", "SetQuestLogItem", "SetQuestRewardSpell", "SetSendMailItem", "SetShapeshift",
"SetSpell", "SetTalent", "SetTrackingSpell", "SetTradePlayerItem", "SetTradeSkillItem", "SetTradeTargetItem",
"SetTrainerService", "SetUnit", "SetUnitBuff", "SetUnitDebuff", "SetGuildBankItem",
}
 
function lib:CreateTooltip()
local tt = CreateFrame("GameTooltip")
 
self.vars.tooltip = tt
tt:SetOwner(UIParent, "ANCHOR_NONE")
-- tt:SetOwner(tt, "ANCHOR_NONE")
-- tooltip:SetParent()
 
self.vars.Llines, self.vars.Rlines = {}, {}
for i=1,30 do
self.vars.Llines[i], self.vars.Rlines[i] = tt:CreateFontString(), tt:CreateFontString()
self.vars.Llines[i]:SetFontObject(GameFontNormal)
self.vars.Rlines[i]:SetFontObject(GameFontNormal)
tt:AddFontStrings(self.vars.Llines[i], self.vars.Rlines[i])
end
end
 
 
-- Clears the tooltip completely, none of this "erase left, hide right" crap blizzard does
function lib:Erase()
self.vars.tooltip:ClearLines() -- Ensures tooltip's NumLines is reset
for i=1,30 do self.vars.Rlines[i]:SetText() end -- Clear text from right side (ClearLines only hides them)
-- if not self.vars.tooltip:IsOwned(self.vars.tooltip) then self.vars.tooltip:SetOwner(self.vars.tooltip, "ANCHOR_NONE") end
if not self.vars.tooltip:IsOwned(UIParent) then self.vars.tooltip:SetOwner(UIParent, "ANCHOR_NONE") end
-- if not self.vars.tooltip:IsOwned(self.vars.tooltip) then
-- error("Gratuity's tooltip is not scannable", 2)
-- end
if not self.vars.tooltip:IsOwned(UIParent) then
error("Gratuity's tooltip is not scannable", 2)
end
end
 
 
-- Get the number of lines
-- Arg: endln - If passed and tooltip's NumLines is higher, endln is returned back
function lib:NumLines(endln)
local num = self.vars.tooltip:NumLines()
return endln and num > endln and endln or num or 0
end
 
local FindDefault = function(str, pattern)
return string.find(str, pattern);
end;
 
local FindExact = function(str, pattern)
if (str == pattern) then
return string.find(str, pattern);
end;
end;
 
-- If text is found on tooltip then results of string.find are returned
-- Args:
-- txt - The text string to find
-- startln - First tooltip line to check, default 1
-- endln - Last line to test, default 30
-- ignoreleft / ignoreright - Causes text on one side of the tooltip to be ignored
-- exact - the compare will be an exact match vs the default behaviour of
function lib:Find(txt, startln, endln, ignoreleft, ignoreright, exact)
local searchFunction = FindDefault;
if (exact == true) then
searchFunction = FindExact;
end;
assert(type(txt) == "string" or type(txt) == "number")
local t1, t2 = type(startln or 1), type(self:NumLines(endln))
if (t1 ~= "number" or t2 ~= "number") then print(t1, t2, (startln or 1),self:NumLines(endln)) end
for i=(startln or 1),self:NumLines(endln) do
if not ignoreleft and self.vars.Llines[i] then
local txtl = self.vars.Llines[i]:GetText()
if (txtl and searchFunction(txtl, txt)) then return string.find(txtl, txt) end
end
 
if not ignoreright and self.vars.Rlines[i] then
local txtr = self.vars.Rlines[i]:GetText()
if (txtr and searchFunction(txtr, txt)) then return string.find(txtr, txt) end
end
end
end
 
 
-- Calls Find many times.
-- Args are passed directly to Find, t1-t10 replace the txt arg
-- Returns Find results for the first match found, if any
function lib:MultiFind(startln, endln, ignoreleft, ignoreright, t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
assert(type(t1) == "string" or type(t1) == "number")
if t1 and self:Find(t1, startln, endln, ignoreleft, ignoreright) then return self:Find(t1, startln, endln, ignoreleft, ignoreright)
elseif t2 then return self:MultiFind(startln, endln, ignoreleft, ignoreright, t2,t3,t4,t5,t6,t7,t8,t9,t10) end
end
 
 
local deformat
-- If text is found on tooltip then results of deformat:Deformat are returned
-- Args:
-- txt - The text string to deformat and serach for
-- startln - First tooltip line to check, default 1
-- endln - Last line to test, default 30
-- ignoreleft / ignoreright - Causes text on one side of the tooltip to be ignored
function lib:FindDeformat(txt, startln, endln, ignoreleft, ignoreright)
assert(type(txt) == "string" or type(txt) == "number")
if not deformat then
if not AceLibrary or not AceLibrary:HasInstance("Deformat-2.0") then
error("FindDeformat requires Deformat-2.0 to be available", 2)
end
deformat = AceLibrary("Deformat-2.0")
end
 
for i=(startln or 1),self:NumLines(endln) do
if not ignoreleft and self.vars.Llines[i] then
local txtl = self.vars.Llines[i]:GetText()
if (txtl and deformat(txtl, txt)) then return deformat(txtl, txt) end
end
 
if not ignoreright and self.vars.Rlines[i] then
local txtr = self.vars.Rlines[i]:GetText()
if (txtr and deformat(txtr, txt)) then return deformat(txtr, txt) end
end
end
end
 
 
-- Returns a table of strings pulled from the tooltip, or nil if no strings in tooltip
-- Args:
-- startln - First tooltip line to check, default 1
-- endln - Last line to test, default 30
-- ignoreleft / ignoreright - Causes text on one side of the tooltip to be ignored
function lib:GetText(startln, endln, ignoreleft, ignoreright)
local retval
 
for i=(startln or 1),(endln or 30) do
local txtl, txtr
if not ignoreleft and self.vars.Llines[i] then txtl = self.vars.Llines[i]:GetText() end
if not ignoreright and self.vars.Rlines[i] then txtr = self.vars.Rlines[i]:GetText() end
if txtl or txtr then
if not retval then retval = {} end
local t = {txtl, txtr}
table.insert(retval, t)
end
end
 
return retval
end
 
 
-- Returns the text from a specific line (both left and right unless second arg is true)
-- Args:
-- line - the line number you wish to retrieve
-- getright - if passed the right line will be returned, if not the left will be returned
function lib:GetLine(line, getright)
assert(type(line) == "number")
if self.vars.tooltip:NumLines() < line then return end
if getright then return self.vars.Rlines[line] and self.vars.Rlines[line]:GetText()
elseif self.vars.Llines[line] then
return self.vars.Llines[line]:GetText(), self.vars.Rlines[line]:GetText()
end
end
 
 
-----------------------------------
-- Set tooltip methods --
-----------------------------------
 
-- These methods are designed to immitate the GameTooltip API
local testmethods = {
SetAction = function(id) return HasAction(id) end,
}
local gettrue = function() return true end
 
local function handlePcall(success, ...)
if not success then
geterrorhandler()(...)
return
end
return ...
end
 
function lib:CreateSetMethods()
for _,m in pairs(methods) do
local meth = m
local func = testmethods[meth] or gettrue
self[meth] = function(self, ...)
self:Erase()
if not func(...) then return end
return handlePcall(pcall(self.vars.tooltip[meth], self.vars.tooltip, ...))
end
end
end
 
-- Activate a new instance of this library
if not lib.vars then
lib.vars = {}
lib:CreateTooltip()
end
lib:CreateSetMethods()
 
local function createCompat()
createCompat = nil
local Gratuity20 = setmetatable({}, {__index=function(self, key)
if type(lib[key]) == "function" then
self[key] = function(self, ...)
return lib[key](lib, ...)
end
else
self[key] = lib[key]
end
return self[key]
end})
AceLibrary:Register(Gratuity20, "Gratuity-2.0", vminor+70000000)
end
if not AceLibrary then
local frame = CreateFrame("Frame")
frame:RegisterEvent("ADDON_LOADED")
frame:SetScript("OnEvent", function(this)
if not AceLibrary then
return
end
createCompat()
frame:SetScript("OnEvent", nil)
frame:UnregisterAllEvents()
frame:Hide()
end)
else
createCompat()
end
EasyDaily-Beta/libs/LibGratuity-3.0/lib.xml New file
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="LibGratuity-3.0.lua" />
</Ui>
\ No newline at end of file
EasyDaily-Beta/libs/LibDataBroker-1.1/LibDataBroker-1.1.lua New file
0,0 → 1,90
 
assert(LibStub, "LibDataBroker-1.1 requires LibStub")
assert(LibStub:GetLibrary("CallbackHandler-1.0", true), "LibDataBroker-1.1 requires CallbackHandler-1.0")
 
local lib, oldminor = LibStub:NewLibrary("LibDataBroker-1.1", 4)
if not lib then return end
oldminor = oldminor or 0
 
 
lib.callbacks = lib.callbacks or LibStub:GetLibrary("CallbackHandler-1.0"):New(lib)
lib.attributestorage, lib.namestorage, lib.proxystorage = lib.attributestorage or {}, lib.namestorage or {}, lib.proxystorage or {}
local attributestorage, namestorage, callbacks = lib.attributestorage, lib.namestorage, lib.callbacks
 
if oldminor < 2 then
lib.domt = {
__metatable = "access denied",
__index = function(self, key) return attributestorage[self] and attributestorage[self][key] end,
}
end
 
if oldminor < 3 then
lib.domt.__newindex = function(self, key, value)
if not attributestorage[self] then attributestorage[self] = {} end
if attributestorage[self][key] == value then return end
attributestorage[self][key] = value
local name = namestorage[self]
if not name then return end
callbacks:Fire("LibDataBroker_AttributeChanged", name, key, value, self)
callbacks:Fire("LibDataBroker_AttributeChanged_"..name, name, key, value, self)
callbacks:Fire("LibDataBroker_AttributeChanged_"..name.."_"..key, name, key, value, self)
callbacks:Fire("LibDataBroker_AttributeChanged__"..key, name, key, value, self)
end
end
 
if oldminor < 2 then
function lib:NewDataObject(name, dataobj)
if self.proxystorage[name] then return end
 
if dataobj then
assert(type(dataobj) == "table", "Invalid dataobj, must be nil or a table")
self.attributestorage[dataobj] = {}
for i,v in pairs(dataobj) do
self.attributestorage[dataobj][i] = v
dataobj[i] = nil
end
end
dataobj = setmetatable(dataobj or {}, self.domt)
self.proxystorage[name], self.namestorage[dataobj] = dataobj, name
self.callbacks:Fire("LibDataBroker_DataObjectCreated", name, dataobj)
return dataobj
end
end
 
if oldminor < 1 then
function lib:DataObjectIterator()
return pairs(self.proxystorage)
end
 
function lib:GetDataObjectByName(dataobjectname)
return self.proxystorage[dataobjectname]
end
 
function lib:GetNameByDataObject(dataobject)
return self.namestorage[dataobject]
end
end
 
if oldminor < 4 then
local next = pairs(attributestorage)
function lib:pairs(dataobject_or_name)
local t = type(dataobject_or_name)
assert(t == "string" or t == "table", "Usage: ldb:pairs('dataobjectname') or ldb:pairs(dataobject)")
 
local dataobj = self.proxystorage[dataobject_or_name] or dataobject_or_name
assert(attributestorage[dataobj], "Data object not found")
 
return next, attributestorage[dataobj], nil
end
 
local ipairs_iter = ipairs(attributestorage)
function lib:ipairs(dataobject_or_name)
local t = type(dataobject_or_name)
assert(t == "string" or t == "table", "Usage: ldb:ipairs('dataobjectname') or ldb:ipairs(dataobject)")
 
local dataobj = self.proxystorage[dataobject_or_name] or dataobject_or_name
assert(attributestorage[dataobj], "Data object not found")
 
return ipairs_iter, attributestorage[dataobj], 0
end
end
EasyDaily-Beta/libs/LibDataBroker-1.1/lib.xml New file
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="LibDataBroker-1.1.lua" />
</Ui>
\ No newline at end of file
EasyDaily-Beta/libs/LibStub/LibStub.lua New file
0,0 → 1,30
-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/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]
 
if not LibStub or LibStub.minor < LIBSTUB_MINOR then
LibStub = LibStub or {libs = {}, minors = {} }
_G[LIBSTUB_MAJOR] = LibStub
LibStub.minor = LIBSTUB_MINOR
 
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
 
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
 
function LibStub:IterateLibraries() return pairs(self.libs) end
setmetatable(LibStub, { __call = LibStub.GetLibrary })
end
EasyDaily-Beta/libs/AceLocale-3.0/AceLocale-3.0.xml New file
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="AceLocale-3.0.lua"/>
</Ui>
\ No newline at end of file
EasyDaily-Beta/libs/AceLocale-3.0/AceLocale-3.0.lua New file
0,0 → 1,103
--[[ $Id: AceLocale-3.0.lua 494 2008-02-03 13:03:56Z nevcairiel $ ]]
local MAJOR,MINOR = "AceLocale-3.0", 1
 
local AceLocale, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
 
if not AceLocale then return end -- no upgrade needed
 
local gameLocale = GetLocale()
if gameLocale == "enGB" then
gameLocale = "enUS"
end
 
AceLocale.apps = AceLocale.apps or {} -- array of ["AppName"]=localetableref
AceLocale.appnames = AceLocale.appnames or {} -- array of [localetableref]="AppName"
 
-- This metatable is used on all tables returned from GetLocale
local readmeta = {
__index = function(self, key) -- requesting totally unknown entries: fire off a nonbreaking error and return key
geterrorhandler()(MAJOR..": "..tostring(AceLocale.appnames[self])..": Missing entry for '"..tostring(key).."'")
rawset(self, key, key) -- only need to see the warning once, really
return key
end
}
 
-- Remember the locale table being registered right now (it gets set by :NewLocale())
local registering
 
-- local assert false function
local assertfalse = function() assert(false) end
 
-- This metatable proxy is used when registering nondefault locales
local writeproxy = setmetatable({}, {
__newindex = function(self, key, value)
rawset(registering, key, value == true and key or value) -- assigning values: replace 'true' with key string
end,
__index = assertfalse
})
 
-- This metatable proxy is used when registering the default locale.
-- It refuses to overwrite existing values
-- Reason 1: Allows loading locales in any order
-- Reason 2: If 2 modules have the same string, but only the first one to be
-- loaded has a translation for the current locale, the translation
-- doesn't get overwritten.
--
local writedefaultproxy = setmetatable({}, {
__newindex = function(self, key, value)
if not rawget(registering, key) then
rawset(registering, key, value == true and key or value)
end
end,
__index = assertfalse
})
 
-- AceLocale:NewLocale(application, locale, isDefault)
--
-- application (string) - unique name of addon / module
-- locale (string) - name of locale to register, e.g. "enUS", "deDE", etc...
-- isDefault (string) - if this is the default locale being registered
--
-- Returns a table where localizations can be filled out, or nil if the locale is not needed
function AceLocale:NewLocale(application, locale, isDefault)
 
-- GAME_LOCALE allows translators to test translations of addons without having that wow client installed
-- Ammo: I still think this is a bad idea, for instance an addon that checks for some ingame string will fail, just because some other addon
-- gives the user the illusion that they can run in a different locale? Ditch this whole thing or allow a setting per 'application'. I'm of the
-- opinion to remove this.
local gameLocale = GAME_LOCALE or gameLocale
 
if locale ~= gameLocale and not isDefault then
return -- nop, we don't need these translations
end
 
local app = AceLocale.apps[application]
 
if not app then
app = setmetatable({}, readmeta)
AceLocale.apps[application] = app
AceLocale.appnames[app] = application
end
 
registering = app -- remember globally for writeproxy and writedefaultproxy
 
if isDefault then
return writedefaultproxy
end
 
return writeproxy
end
 
-- AceLocale:GetLocale(application [, silent])
--
-- application (string) - unique name of addon
-- silent (boolean) - if true, the locale is optional, silently return nil if it's not found
--
-- Returns localizations for the current locale (or default locale if translations are missing)
-- Errors if nothing is registered (spank developer, not just a missing translation)
function AceLocale:GetLocale(application, silent)
if not silent and not AceLocale.apps[application] then
error("Usage: GetLocale(application[, silent]): 'application' - No locales registered for '"..tostring(application).."'", 2)
end
return AceLocale.apps[application]
end
EasyDaily-Beta/libs/AceHook-3.0/AceHook-3.0.xml New file
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="AceHook-3.0.lua"/>
</Ui>
\ No newline at end of file
EasyDaily-Beta/libs/AceHook-3.0/AceHook-3.0.lua New file
0,0 → 1,372
--[[ $Id: AceHook-3.0.lua 625 2008-04-13 10:09:12Z nevcairiel $ ]]
local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 4
local AceHook, oldminor = LibStub:NewLibrary(ACEHOOK_MAJOR, ACEHOOK_MINOR)
 
if not AceHook then return end -- No upgrade needed
 
AceHook.embeded = AceHook.embeded or {}
AceHook.registry = AceHook.registry or setmetatable({}, {__index = function(tbl, key) tbl[key] = {} return tbl[key] end })
AceHook.handlers = AceHook.handlers or {}
AceHook.actives = AceHook.actives or {}
AceHook.scripts = AceHook.scripts or {}
AceHook.onceSecure = AceHook.onceSecure or {}
AceHook.hooks = AceHook.hooks or {}
 
-- local upvalues
local registry = AceHook.registry
local handlers = AceHook.handlers
local actives = AceHook.actives
local scripts = AceHook.scripts
local onceSecure = AceHook.onceSecure
 
local _G = _G
local format = string.format
local next = next
local pairs = pairs
local type = type
 
-- functions for later definition
local donothing, createHook, hook
 
local protectedScripts = {
OnClick = true,
}
 
-- upgrading of embeded is done at the bottom of the file
 
local mixins = {
"Hook", "SecureHook",
"HookScript", "SecureHookScript",
"Unhook", "UnhookAll",
"IsHooked",
"RawHook", "RawHookScript"
}
 
-- AceHook:Embed( target )
-- target (object) - target object to embed AceHook in
--
-- Embeds AceEevent into the target object making the functions from the mixins list available on target:..
function AceHook:Embed( target )
for k, v in pairs( mixins ) do
target[v] = self[v]
end
self.embeded[target] = true
-- inject the hooks table safely
target.hooks = target.hooks or {}
return target
end
 
-- AceHook:OnEmbedDisable( target )
-- target (object) - target object that is being disabled
--
-- Unhooks all hooks when the target disables.
-- this method should be called by the target manually or by an addon framework
function AceHook:OnEmbedDisable( target )
target:UnhookAll()
end
 
function createHook(self, handler, orig, secure, failsafe)
local uid
local method = type(handler) == "string"
if failsafe and not secure then
-- failsafe hook creation
uid = function(...)
if actives[uid] then
if method then
self[handler](self, ...)
else
handler(...)
end
end
return orig(...)
end
-- /failsafe hook
else
-- all other hooks
uid = function(...)
if actives[uid] then
if method then
return self[handler](self, ...)
else
return handler(...)
end
elseif not secure then -- backup on non secure
return orig(...)
end
end
-- /hook
end
return uid
end
 
function donothing() end
 
function hook(self, obj, method, handler, script, secure, raw, forceSecure, usage)
if not handler then handler = method end
 
-- These asserts make sure AceHooks's devs play by the rules.
assert(not script or type(script) == "boolean")
assert(not secure or type(secure) == "boolean")
assert(not raw or type(raw) == "boolean")
assert(not forceSecure or type(forceSecure) == "boolean")
assert(usage)
 
-- Error checking Battery!
if obj and type(obj) ~= "table" then
error(format("%s: 'object' - nil or table expected got %s", usage, type(obj)), 3)
end
if type(method) ~= "string" then
error(format("%s: 'method' - string expected got %s", usage, type(method)), 3)
end
if type(handler) ~= "string" and type(handler) ~= "function" then
error(format("%s: 'handler' - nil, string, or function expected got %s", usage, type(handler)), 3)
end
if type(handler) == "string" and type(self[handler]) ~= "function" then
error(format("%s: 'handler' - Handler specified does not exist at self[handler]", usage), 3)
end
if script then
if not secure and obj:IsProtected() and protectedScripts[method] then
error(format("Cannot hook secure script %q; Use SecureHookScript(obj, method, [handler]) instead.", method), 3)
end
if not obj or not obj.GetScript or not obj:HasScript(method) then
error(format("%s: You can only hook a script on a frame object", usage), 3)
end
else
local issecure
if obj then
issecure = onceSecure[obj] and onceSecure[obj][method] or issecurevariable(obj, method)
else
issecure = onceSecure[method] or issecurevariable(method)
end
if issecure then
if forceSecure then
if obj then
onceSecure[obj] = onceSecure[obj] or {}
onceSecure[obj][method] = true
else
onceSecure[method] = true
end
elseif not secure then
error(format("%s: Attempt to hook secure function %s. Use `SecureHook' or add `true' to the argument list to override.", usage, method), 3)
end
end
end
 
local uid
if obj then
uid = registry[self][obj] and registry[self][obj][method]
else
uid = registry[self][method]
end
 
if uid then
if actives[uid] then
-- Only two sane choices exist here. We either a) error 100% of the time or b) always unhook and then hook
-- choice b would likely lead to odd debuging conditions or other mysteries so we're going with a.
error(format("Attempting to rehook already active hook %s.", method))
end
 
if handlers[uid] == handler then -- turn on a decative hook, note enclosures break this ability, small memory leak
actives[uid] = true
return
elseif obj then -- is there any reason not to call unhook instead of doing the following several lines?
if self.hooks and self.hooks[obj] then
self.hooks[obj][method] = nil
end
registry[self][obj][method] = nil
else
if self.hooks then
self.hooks[method] = nil
end
registry[self][method] = nil
end
handlers[uid], actives[uid], scripts[uid] = nil, nil, nil
uid = nil
end
 
local orig
if script then
orig = obj:GetScript(method) or donothing
elseif obj then
orig = obj[method]
else
orig = _G[method]
end
 
if not orig then
error(format("%s: Attempting to hook a non existing target", usage), 3)
end
 
uid = createHook(self, handler, orig, secure, not (raw or secure))
 
if obj then
self.hooks[obj] = self.hooks[obj] or {}
registry[self][obj] = registry[self][obj] or {}
registry[self][obj][method] = uid
 
if not secure then
if script then
obj:SetScript(method, uid)
else
obj[method] = uid
end
self.hooks[obj][method] = orig
else
if script then
obj:HookScript(method, uid)
else
hooksecurefunc(obj, method, uid)
end
end
else
registry[self][method] = uid
 
if not secure then
_G[method] = uid
self.hooks[method] = orig
else
hooksecurefunc(method, uid)
end
end
 
actives[uid], handlers[uid], scripts[uid] = true, handler, script and true or nil
end
 
-- ("function" [, handler] [, hookSecure]) or (object, "method" [, handler] [, hookSecure])
function AceHook:Hook(object, method, handler, hookSecure)
if type(object) == "string" then
method, handler, hookSecure, object = object, method, handler, nil
end
 
if handler == true then
handler, hookSecure = nil, true
end
 
hook(self, object, method, handler, false, false, false, hookSecure or false, "Usage: Hook([object], method, [handler], [hookSecure])")
end
 
-- ("function" [, handler] [, hookSecure]) or (object, "method" [, handler] [, hookSecure])
function AceHook:RawHook(object, method, handler, hookSecure)
if type(object) == "string" then
method, handler, hookSecure, object = object, method, handler, nil
end
 
if handler == true then
handler, hookSecure = nil, true
end
 
hook(self, object, method, handler, false, false, true, hookSecure or false, "Usage: RawHook([object], method, [handler], [hookSecure])")
end
 
-- ("function", handler) or (object, "method", handler)
function AceHook:SecureHook(object, method, handler)
if type(object) == "string" then
method, handler, object = object, method, nil
end
 
hook(self, object, method, handler, false, true, false, false, "Usage: SecureHook([object], method, [handler])")
end
 
function AceHook:HookScript(frame, script, handler)
hook(self, frame, script, handler, true, false, false, false, "Usage: HookScript(object, method, [handler])")
end
 
function AceHook:RawHookScript(frame, script, handler)
hook(self, frame, script, handler, true, false, true, false, "Usage: RawHookScript(object, method, [handler])")
end
 
function AceHook:SecureHookScript(frame, script, handler)
hook(self, frame, script, handler, true, true, false, false, "Usage: SecureHookScript(object, method, [handler])")
end
 
-- ("function") or (object, "method")
function AceHook:Unhook(obj, method)
local usage = "Usage: Unhook([obj], method)"
if type(obj) == "string" then
method, obj = obj, nil
end
 
if obj and type(obj) ~= "table" then
error(format("%s: 'obj' - expecting nil or table got %s", usage, type(obj)), 2)
end
if type(method) ~= "string" then
error(format("%s: 'method' - expeting string got %s", usage, type(method)), 2)
end
 
local uid
if obj then
uid = registry[self][obj] and registry[self][obj][method]
else
uid = registry[self][method]
end
 
if not uid or not actives[uid] then
-- Declining to error on an unneeded unhook since the end effect is the same and this would just be annoying.
return false
end
 
actives[uid], handlers[uid] = nil, nil
 
if obj then
registry[self][obj][method] = nil
registry[self][obj] = next(registry[self][obj]) and registry[self][obj] or nil
 
-- if the hook reference doesnt exist, then its a secure hook, just bail out and dont do any unhooking
if not self.hooks[obj] or not self.hooks[obj][method] then return true end
 
if scripts[uid] and obj:GetScript(method) == uid then -- unhooks scripts
obj:SetScript(method, self.hooks[obj][method] ~= donothing and self.hooks[obj][method] or nil)
scripts[uid] = nil
elseif obj and self.hooks[obj] and self.hooks[obj][method] and obj[method] == uid then -- unhooks methods
obj[method] = self.hooks[obj][method]
end
 
self.hooks[obj][method] = nil
self.hooks[obj] = next(self.hooks[obj]) and self.hooks[obj] or nil
else
registry[self][method] = nil
 
-- if self.hooks[method] doesn't exist, then this is a SecureHook, just bail out
if not self.hooks[method] then return true end
 
if self.hooks[method] and _G[method] == uid then -- unhooks functions
_G[method] = self.hooks[method]
end
 
self.hooks[method] = nil
end
return true
end
 
function AceHook:UnhookAll()
for key, value in pairs(registry[self]) do
if type(key) == "table" then
for method in pairs(value) do
self:Unhook(key, method)
end
else
self:Unhook(key)
end
end
end
 
-- ("function") or (object, "method")
function AceHook:IsHooked(obj, method)
-- we don't check if registry[self] exists, this is done by evil magicks in the metatable
if type(obj) == "string" then
if registry[self][obj] and actives[registry[self][obj]] then
return true, handlers[registry[self][obj]]
end
else
if registry[self][obj] and registry[self][obj][method] and actives[registry[self][obj][method]] then
return true, handlers[registry[self][obj][method]]
end
end
 
return false, nil
end
 
--- Upgrade our old embeded
for target, v in pairs( AceHook.embeded ) do
AceHook:Embed( target )
end
EasyDaily-Beta/libs/AceDBOptions-3.0/AceDBOptions-3.0.xml New file
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="AceDBOptions-3.0.lua"/>
</Ui>
\ No newline at end of file
EasyDaily-Beta/libs/AceDBOptions-3.0/AceDBOptions-3.0.lua New file
0,0 → 1,370
--[[ $Id: AceDBOptions-3.0.lua 668 2008-07-16 10:08:17Z funkydude $ ]]
local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 7
local AceDBOptions, oldminor = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR)
 
if not AceDBOptions then return end -- No upgrade needed
 
AceDBOptions.optionTables = AceDBOptions.optionTables or {}
AceDBOptions.handlers = AceDBOptions.handlers or {}
 
--[[
Localization of AceDBOptions-3.0
]]
 
local L = {
default = "Default",
intro = "You can change the active database profile, so you can have different settings for every character.",
reset_desc = "Reset the current profile back to its default values, in case your configuration is broken, or you simply want to start over.",
reset = "Reset Profile",
reset_sub = "Reset the current profile to the default",
choose_desc = "You can either create a new profile by entering a name in the editbox, or choose one of the already exisiting profiles.",
new = "New",
new_sub = "Create a new empty profile.",
choose = "Existing Profiles",
choose_sub = "Select one of your currently available profiles.",
copy_desc = "Copy the settings from one existing profile into the currently active profile.",
copy = "Copy From",
delete_desc = "Delete existing and unused profiles from the database to save space, and cleanup the SavedVariables file.",
delete = "Delete a Profile",
delete_sub = "Deletes a profile from the database.",
delete_confirm = "Are you sure you want to delete the selected profile?",
profiles = "Profiles",
profiles_sub = "Manage Profiles",
}
 
local LOCALE = GetLocale()
if LOCALE == "deDE" then
L["default"] = "Standard"
L["intro"] = "Hier kannst du das aktive Datenbankprofile \195\164ndern, damit du verschiedene Einstellungen f\195\188r jeden Charakter erstellen kannst, wodurch eine sehr flexible Konfiguration m\195\182glich wird."
L["reset_desc"] = "Setzt das momentane Profil auf Standardwerte zur\195\188ck, f\195\188r den Fall das mit der Konfiguration etwas schief lief oder weil du einfach neu starten willst."
L["reset"] = "Profil zur\195\188cksetzen"
L["reset_sub"] = "Das aktuelle Profil auf Standard zur\195\188cksetzen."
L["choose_desc"] = "Du kannst ein neues Profil erstellen, indem du einen neuen Namen in der Eingabebox 'Neu' eingibst, oder w\195\164hle eines der vorhandenen Profile aus."
L["new"] = "Neu"
L["new_sub"] = "Ein neues Profil erstellen."
L["choose"] = "Vorhandene Profile"
L["choose_sub"] = "W\195\164hlt ein bereits vorhandenes Profil aus."
L["copy_desc"] = "Kopiere die Einstellungen von einem vorhandenen Profil in das aktive Profil."
L["copy"] = "Kopieren von..."
L["delete_desc"] = "L\195\182sche vorhandene oder unbenutzte Profile aus der Datenbank um Platz zu sparen und um die SavedVariables Datei 'sauber' zu halten."
L["delete"] = "Profil l\195\182schen"
L["delete_sub"] = "L\195\182scht ein Profil aus der Datenbank."
L["delete_confirm"] = "Willst du das ausgew\195\164hlte Profil wirklich l\195\182schen?"
L["profiles"] = "Profile"
L["profiles_sub"] = "Profile verwalten"
elseif LOCALE == "frFR" then
L["default"] = "D\195\169faut"
L["intro"] = "Vous pouvez changer le profil actuel afin d'avoir des param\195\168tres diff\195\169rents pour chaque personnage, permettant ainsi d'avoir une configuration tr\195\168s flexible."
L["reset_desc"] = "R\195\169initialise le profil actuel au cas o\195\185 votre configuration est corrompue ou si vous voulez tout simplement faire table rase."
L["reset"] = "R\195\169initialiser le profil"
L["reset_sub"] = "R\195\169initialise le profil actuel avec les param\195\168tres par d\195\169faut."
L["choose_desc"] = "Vous pouvez cr\195\169er un nouveau profil en entrant un nouveau nom dans la bo\195\174te de saisie, ou en choississant un des profils d\195\169j\195\160 existants."
L["new"] = "Nouveau"
L["new_sub"] = "Cr\195\169\195\169e un nouveau profil vierge."
L["choose"] = "Profils existants"
L["choose_sub"] = "Permet de choisir un des profils d\195\169j\195\160 disponibles."
L["copy_desc"] = "Copie les param\195\168tres d'un profil d\195\169j\195\160 existant dans le profil actuellement actif."
L["copy"] = "Copier \195\160 partir de"
L["delete_desc"] = "Supprime les profils existants inutilis\195\169s de la base de donn\195\169es afin de gagner de la place et de nettoyer le fichier SavedVariables."
L["delete"] = "Supprimer un profil"
L["delete_sub"] = "Supprime un profil de la base de donn\195\169es."
L["delete_confirm"] = "Etes-vous s\195\187r de vouloir supprimer le profil s\195\169lectionn\195\169 ?"
L["profiles"] = "Profils"
L["profiles_sub"] = "Gestion des profils"
elseif LOCALE == "koKR" then
L["default"] = "기본값"
L["intro"] = "모든 캐릭터의 다양한 설정과 사용중인 데이터베이스 프로필, 어느것이던지 매우 다루기 쉽게 바꿀수 있습니다."
L["reset_desc"] = "단순히 다시 새롭게 구성을 원하는 경우, 현재 프로필을 기본값으로 초기화 합니다."
L["reset"] = "프로필 초기화"
L["reset_sub"] = "현재의 프로필을 기본값으로 초기화 합니다"
L["choose_desc"] = "새로운 이름을 입력하거나, 이미 있는 프로필중 하나를 선택하여 새로운 프로필을 만들 수 있습니다."
L["new"] = "새로운 프로필"
L["new_sub"] = "새로운 프로필을 만듭니다."
L["choose"] = "프로필 선택"
L["choose_sub"] = "당신이 현재 이용할수 있는 프로필을 선택합니다."
L["copy_desc"] = "현재 사용중인 프로필에, 선택한 프로필의 설정을 복사합니다."
L["copy"] = "복사"
L["delete_desc"] = "데이터베이스에 사용중이거나 저장된 프로파일 삭제로 SavedVariables 파일의 정리와 공간 절약이 됩니다."
L["delete"] = "프로필 삭제"
L["delete_sub"] = "데이터베이스의 프로필을 삭제합니다."
L["delete_confirm"] = "정말로 선택한 프로필의 삭제를 원하십니까?"
L["profiles"] = "프로필"
L["profiles_sub"] = "프로필 설정"
elseif LOCALE == "esES" then
 
elseif LOCALE == "zhTW" then
L["default"] = "預設"
L["intro"] = "你可以選擇一個活動的資料設定檔,這樣你的每個角色就可以擁有不同的設定值,可以給你的插件設定帶來極大的靈活性。"
L["reset_desc"] = "將當前的設定檔恢復到它的預設值,用於你的設定檔損壞,或者你只是想重來的情況。"
L["reset"] = "重置設定檔"
L["reset_sub"] = "將當前的設定檔恢復為預設值"
L["choose_desc"] = "你可以通過在文本框內輸入一個名字創立一個新的設定檔,也可以選擇一個已經存在的設定檔。"
L["new"] = "新建"
L["new_sub"] = "新建一個空的設定檔。"
L["choose"] = "現有的設定檔"
L["choose_sub"] = "從當前可用的設定檔裏面選擇一個。"
L["copy_desc"] = "從當前某個已保存的設定檔複製到當前正使用的設定檔。"
L["copy"] = "複製自"
L["delete_desc"] = "從資料庫裏刪除不再使用的設定檔,以節省空間,並且清理SavedVariables檔。"
L["delete"] = "刪除一個設定檔"
L["delete_sub"] = "從資料庫裏刪除一個設定檔。"
L["delete_confirm"] = "你確定要刪除所選擇的設定檔嗎?"
L["profiles"] = "設定檔"
L["profiles_sub"] = "管理設定檔"
elseif LOCALE == "zhCN" then
L["default"] = "默认"
L["intro"] = "你可以选择一个活动的数据配置文件,这样你的每个角色就可以拥有不同的设置值,可以给你的插件配置带来极大的灵活性。"
L["reset_desc"] = "将当前的配置文件恢复到它的默认值,用于你的配置文件损坏,或者你只是想重来的情况。"
L["reset"] = "重置配置文件"
L["reset_sub"] = "将当前的配置文件恢复为默认值"
L["choose_desc"] = "你可以通过在文本框内输入一个名字创立一个新的配置文件,也可以选择一个已经存在的配置文件。"
L["new"] = "新建"
L["new_sub"] = "新建一个空的配置文件。"
L["choose"] = "现有的配置文件"
L["choose_sub"] = "从当前可用的配置文件里面选择一个。"
L["copy_desc"] = "从当前某个已保存的配置文件复制到当前正使用的配置文件。"
L["copy"] = "复制自"
L["delete_desc"] = "从数据库里删除不再使用的配置文件,以节省空间,并且清理SavedVariables文件。"
L["delete"] = "删除一个配置文件"
L["delete_sub"] = "从数据库里删除一个配置文件。"
L["delete_confirm"] = "你确定要删除所选择的配置文件么?"
L["profiles"] = "配置文件"
L["profiles_sub"] = "管理配置文件"
elseif LOCALE == "ruRU" then
L["default"] = "По умолчанию"
L["intro"] = "Вы можете сменить активный профиль БД, этим вы можете устанавливать различные настройки для каждого персонажа."
L["reset_desc"] = "Сброс текущего профиля на его стандартные значения, в том случаи если ваша конфигурация испорчена, или вы желаете всё перенастроить заново."
L["reset"] = "Сброс профиля"
L["reset"] = "Сброс текущего профиля на стандартный"
L["choose_desc"] = "Вы можете создать новый профиль введя название в поле ввода, или выбрать один из уже существующих профилей."
L["new"] = "Новый"
L["new_sub"] = "Создать новый чистый профиль."
L["choose"] = "Профиля"
L["choose_sub"] = "Выберите один из уже доступных профилей."
L["copy_desc"] = "Скопировать настройки профиля в на данный момент активный профиль."
L["copy"] = "Скопировать с"
L["delete_desc"] = "Удалить существующий и неиспользуемый профиль из БД для сохранения места, и очистить SavedVariables файл."
L["delete"] = "Удалить профиль"
L["delete_sub"] = "Удаления профиля из БД."
L["delete_confirm"] = "Вы уверены что вы хотите удалить выбранный профиль?"
L["profiles"] = "Профиля"
L["profiles_sub"] = "Управление профилями"
end
 
local defaultProfiles
local tmpprofiles = {}
 
--[[
getProfileList(db, common, nocurrent)
 
db - the db object to retrieve the profiles from
common (boolean) - if common is true, getProfileList will add the default profiles to the return list, even if they have not been created yet
nocurrent (boolean) - if true then getProfileList will not display the current profile in the list
]]--
local function getProfileList(db, common, nocurrent)
local profiles = {}
 
-- copy existing profiles into the table
local currentProfile = db:GetCurrentProfile()
for i,v in pairs(db:GetProfiles(tmpprofiles)) do
if not (nocurrent and v == currentProfile) then
profiles[v] = v
end
end
 
-- add our default profiles to choose from ( or rename existing profiles)
for k,v in pairs(defaultProfiles) do
if (common or profiles[k]) and not (nocurrent and k == currentProfile) then
profiles[k] = v
end
end
 
return profiles
end
 
--[[
OptionsHandlerPrototype
prototype class for handling the options in a sane way
]]
local OptionsHandlerPrototype = {}
 
--[[ Reset the profile ]]
function OptionsHandlerPrototype:Reset()
self.db:ResetProfile()
end
 
--[[ Set the profile to value ]]
function OptionsHandlerPrototype:SetProfile(info, value)
self.db:SetProfile(value)
end
 
--[[ returns the currently active profile ]]
function OptionsHandlerPrototype:GetCurrentProfile()
return self.db:GetCurrentProfile()
end
 
--[[
List all active profiles
you can control the output with the .arg variable
currently four modes are supported
 
(empty) - return all available profiles
"nocurrent" - returns all available profiles except the currently active profile
"common" - returns all avaialble profiles + some commonly used profiles ("char - realm", "realm", "class", "Default")
"both" - common except the active profile
]]
function OptionsHandlerPrototype:ListProfiles(info)
local arg = info.arg
local profiles
if arg == "common" and not self.noDefaultProfiles then
profiles = getProfileList(self.db, true, nil)
elseif arg == "nocurrent" then
profiles = getProfileList(self.db, nil, true)
elseif arg == "both" then -- currently not used
profiles = getProfileList(self.db, (not self.noDefaultProfiles) and true, true)
else
profiles = getProfileList(self.db)
end
 
return profiles
end
 
--[[ Copy a profile ]]
function OptionsHandlerPrototype:CopyProfile(info, value)
self.db:CopyProfile(value)
end
 
--[[ Delete a profile from the db ]]
function OptionsHandlerPrototype:DeleteProfile(info, value)
self.db:DeleteProfile(value)
end
 
--[[ fill defaultProfiles with some generic values ]]
local function generateDefaultProfiles(db)
defaultProfiles = {
["Default"] = L["default"],
[db.keys.char] = db.keys.char,
[db.keys.realm] = db.keys.realm,
[db.keys.class] = UnitClass("player")
}
end
 
--[[ create and return a handler object for the db, or upgrade it if it already existed ]]
local function getOptionsHandler(db, noDefaultProfiles)
if not defaultProfiles then
generateDefaultProfiles(db)
end
 
local handler = AceDBOptions.handlers[db] or { db = db, noDefaultProfiles = noDefaultProfiles }
 
for k,v in pairs(OptionsHandlerPrototype) do
handler[k] = v
end
 
AceDBOptions.handlers[db] = handler
return handler
end
 
--[[
the real options table
]]
local optionsTable = {
desc = {
order = 1,
type = "description",
name = L["intro"] .. "\n",
},
descreset = {
order = 9,
type = "description",
name = L["reset_desc"],
},
reset = {
order = 10,
type = "execute",
name = L["reset"],
desc = L["reset_sub"],
func = "Reset",
},
choosedesc = {
order = 20,
type = "description",
name = "\n" .. L["choose_desc"],
},
new = {
name = L["new"],
desc = L["new_sub"],
type = "input",
order = 30,
get = false,
set = "SetProfile",
},
choose = {
name = L["choose"],
desc = L["choose_sub"],
type = "select",
order = 40,
get = "GetCurrentProfile",
set = "SetProfile",
values = "ListProfiles",
arg = "common",
},
copydesc = {
order = 50,
type = "description",
name = "\n" .. L["copy_desc"],
},
copyfrom = {
order = 60,
type = "select",
name = L["copy"],
desc = L["copy_desc"],
get = false,
set = "CopyProfile",
values = "ListProfiles",
arg = "nocurrent",
},
deldesc = {
order = 70,
type = "description",
name = "\n" .. L["delete_desc"],
},
delete = {
order = 80,
type = "select",
name = L["delete"],
desc = L["delete_sub"],
get = false,
set = "DeleteProfile",
values = "ListProfiles",
arg = "nocurrent",
confirm = true,
confirmText = L["delete_confirm"],
},
}
 
--[[
GetOptionsTable(db)
db - the database object to create the options table for
 
creates and returns a option table to be used in your addon
]]
function AceDBOptions:GetOptionsTable(db, noDefaultProfiles)
local tbl = AceDBOptions.optionTables[db] or {
type = "group",
name = L["profiles"],
desc = L["profiles_sub"],
}
 
tbl.handler = getOptionsHandler(db, noDefaultProfiles)
tbl.args = optionsTable
 
AceDBOptions.optionTables[db] = tbl
return tbl
end
 
-- upgrade existing tables
for db,tbl in pairs(AceDBOptions.optionTables) do
tbl.handler = getOptionsHandler(db)
tbl.args = optionsTable
end
EasyDaily-Beta/libs/AceConsole-3.0/AceConsole-3.0.xml New file
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="AceConsole-3.0.lua"/>
</Ui>
\ No newline at end of file
EasyDaily-Beta/libs/AceConsole-3.0/AceConsole-3.0.lua New file
0,0 → 1,221
--[[ $Id: AceConsole-3.0.lua 629 2008-04-22 08:26:12Z ammo $ ]]
local MAJOR,MINOR = "AceConsole-3.0", 6
 
local AceConsole, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
 
if not AceConsole then return end -- No upgrade needed
 
AceConsole.embeds = AceConsole.embeds or {} -- table containing objects AceConsole is embedded in.
AceConsole.commands = AceConsole.commands or {} -- table containing commands registered
AceConsole.weakcommands = AceConsole.weakcommands or {} -- table containing self, command => func references for weak commands that don't persist through enable/disable
 
-- local upvalues
local _G = _G
local pairs = pairs
local select = select
local type = type
local tostring = tostring
local strfind = string.find
local strsub = string.sub
local max = math.max
 
-- AceConsole:Print( [chatframe,] ... )
--
-- Print to DEFAULT_CHAT_FRAME or given chatframe (anything with an .AddMessage member)
function AceConsole:Print(...)
local text = ""
if self ~= AceConsole then
text = "|cff33ff99"..tostring( self ).."|r: "
end
 
local frame = select(1, ...)
if not ( type(frame) == "table" and frame.AddMessage ) then -- Is first argument something with an .AddMessage member?
frame=nil
end
 
for i=(frame and 2 or 1), select("#", ...) do
text = text .. tostring( select( i, ...) ) .." "
end
(frame or DEFAULT_CHAT_FRAME):AddMessage( text )
end
 
 
-- AceConsole:RegisterChatCommand(. command, func, persist )
--
-- command (string) - chat command to be registered WITHOUT leading "/"
-- func (function|membername) - function to call, or self[membername](self, ...) call
-- persist (boolean) - false: the command will be soft disabled/enabled when aceconsole is used as a mixin (default: true)
--
-- Register a simple chat command
function AceConsole:RegisterChatCommand( command, func, persist )
if type(command)~="string" then error([[Usage: AceConsole:RegisterChatCommand( "command", func[, persist ]): 'command' - expected a string]], 2) end
 
if persist==nil then persist=true end -- I'd rather have my addon's "/addon enable" around if the author screws up. Having some extra slash regged when it shouldnt be isn't as destructive. True is a better default. /Mikk
 
local name = "ACECONSOLE_"..command:upper()
 
if type( func ) == "string" then
SlashCmdList[name] = function(input)
self[func](self, input)
end
else
SlashCmdList[name] = func
end
_G["SLASH_"..name.."1"] = "/"..command:lower()
AceConsole.commands[command] = name
-- non-persisting commands are registered for enabling disabling
if not persist then
if not AceConsole.weakcommands[self] then AceConsole.weakcommands[self] = {} end
AceConsole.weakcommands[self][command] = func
end
return true
end
 
 
-- AceConsole:UnregisterChatCommand( command )
--
-- Unregister a chatcommand
function AceConsole:UnregisterChatCommand( command )
local name = AceConsole.commands[command]
if name then
SlashCmdList[name] = nil
_G["SLASH_" .. name .. "1"] = nil
hash_SlashCmdList["/" .. command:upper()] = nil
AceConsole.commands[command] = nil
end
end
 
function AceConsole:IterateChatCommands() return pairs(AceConsole.commands) end
 
 
local function nils(n, ...)
if n>1 then
return nil, nils(n-1, ...)
elseif n==1 then
return nil, ...
else
return ...
end
end
 
 
-- AceConsole:GetArgs(string, numargs, startpos)
--
-- Retreive one or more space-separated arguments from a string.
-- Treats quoted strings and itemlinks as non-spaced.
--
-- string - The raw argument string
-- numargs - How many arguments to get (default 1)
-- startpos - Where in the string to start scanning (default 1)
--
-- Returns arg1, arg2, ..., nextposition
-- Missing arguments will be returned as nils. 'nextposition' is returned as 1e9 at the end of the string.
 
function AceConsole:GetArgs(str, numargs, startpos)
numargs = numargs or 1
startpos = max(startpos or 1, 1)
 
local pos=startpos
 
-- find start of new arg
pos = strfind(str, "[^ ]", pos)
if not pos then -- whoops, end of string
return nils(numargs, 1e9)
end
 
if numargs<1 then
return pos
end
 
-- quoted or space separated? find out which pattern to use
local delim_or_pipe
local ch = strsub(str, pos, pos)
if ch=='"' then
pos = pos + 1
delim_or_pipe='([|"])'
elseif ch=="'" then
pos = pos + 1
delim_or_pipe="([|'])"
else
delim_or_pipe="([| ])"
end
 
startpos = pos
 
while true do
-- find delimiter or hyperlink
local ch,_
pos,_,ch = strfind(str, delim_or_pipe, pos)
 
if not pos then break end
 
if ch=="|" then
-- some kind of escape
 
if strsub(str,pos,pos+1)=="|H" then
-- It's a |H....|hhyper link!|h
pos=strfind(str, "|h", pos+2) -- first |h
if not pos then break end
 
pos=strfind(str, "|h", pos+2) -- second |h
if not pos then break end
elseif strsub(str,pos, pos+1) == "|T" then
-- It's a |T....|t texture
pos=strfind(str, "|t", pos+2)
if not pos then break end
end
 
pos=pos+2 -- skip past this escape (last |h if it was a hyperlink)
 
else
-- found delimiter, done with this arg
return strsub(str, startpos, pos-1), AceConsole:GetArgs(str, numargs-1, pos+1)
end
 
end
 
-- search aborted, we hit end of string. return it all as one argument. (yes, even if it's an unterminated quote or hyperlink)
return strsub(str, startpos), nils(numargs-1, 1e9)
end
 
 
--- embedding and embed handling
 
local mixins = {
"Print",
"RegisterChatCommand",
"UnregisterChatCommand",
"GetArgs",
}
 
-- AceConsole:Embed( target )
-- target (object) - target object to embed AceBucket in
--
-- Embeds AceConsole into the target object making the functions from the mixins list available on target:..
function AceConsole:Embed( target )
for k, v in pairs( mixins ) do
target[v] = self[v]
end
self.embeds[target] = true
return target
end
 
function AceConsole:OnEmbedEnable( target )
if AceConsole.weakcommands[target] then
for command, func in pairs( AceConsole.weakcommands[target] ) do
target:RegisterChatCommand( command, func, false, true ) -- nonpersisting and silent registry
end
end
end
 
function AceConsole:OnEmbedDisable( target )
if AceConsole.weakcommands[target] then
for command, func in pairs( AceConsole.weakcommands[target] ) do
target:UnregisterChatCommand( command ) -- TODO: this could potentially unregister a command from another application in case of command conflicts. Do we care?
end
end
end
 
for addon in pairs(AceConsole.embeds) do
AceConsole:Embed(addon)
end
EasyDaily-Beta/Options.lua New file
0,0 → 1,431
 
local AceConfigDialog = LibStub("AceConfigDialog-3.0")
local Abacus = LibStub("LibAbacus-3.0")
local LDBIcon = LibStub("LibDBIcon-1.0")
 
local L = LibStub("AceLocale-3.0"):GetLocale("EasyDaily_Base")
 
local function getFunc(info)
return (info.arg and EasyDaily.db.profile[info.arg] or EasyDaily.db.profile[info[#info]])
end
local function setFunc(info, value)
local key = info.arg or info[#info]
EasyDaily.db.profile[key] = value
end
 
local t = {
"Alliance",
"Horde",
}
local function isFaction(a)
if ( not a ) or ( a == 3 ) or ( t[a] == UnitFactionGroup("player") ) then
return true
end
end
 
local Faction = {
[47] = 1,
[54] = 1,
[69] = 1,
[72] = 1,
[930] = 1,
[68] = 2,
[76] = 2,
[81] = 2,
[530] = 2,
[911] = 2,
}
 
local function Colorize(r, g, b, ...)
local s = ""
for i = 1, select("#", ...), 1 do
s = s .. select(i, ...)
end
return string.format("|cff%02x%02x%02x%s|r", r*255, g*255, b*255, s)
end
 
local CreateQuestDescription
do
local r = {}
function CreateQuestDescription(t)
table.insert(r, "")
if t.level then
table.insert(r, string.format("%s%s", Colorize(1, .82, 0, L["Quest Level"], ":"), t.level))
end
if t.reqlevel then
table.insert(r, string.format("%s%s", Colorize(1, .82, 0, L["Recomended Level"], ": "), t.reqlevel))
end
if t.snid and t.enid then
if t.snid == t.enid then
table.insert(r, string.format("%s%s", Colorize(1, .82, 0, L["Start"], "/", L["End"], ": "), t.snid))
else
table.insert(r, string.format("%s%s", Colorize(1, .82, 0, string.format("%s:", L["Start"]), ": "), t.snid))
table.insert(r, string.format("%s%s", Colorize(1, .82, 0, string.format("%s:", L["End"]), ": "), t.enid))
end
end
table.insert(r, "")
if t.itemreqs then
table.insert(r, string.format(Colorize(1, .82, 0, L["Recomended Level"], ": ")))
for i, v in ipairs(t.itemreqs) do
table.insert(r, string.format("%s%s", Colorize(1, .82, 0, " - ", GetItemInfo(v[1]) or v[1], " x "), v[2]))
end
table.insert(r, "")
end
local money = 0
if t.xp then
if UnitLevel("player") == 80 then
money = money + t.xp * 6
else
table.insert(r, string.format("%s%s", Colorize(1, .82, 0, L["XP"], ": "), t.xp))
end
end
if t.money then
money = money + t.money
end
if money > 0 then
table.insert(r, string.format("%s%s", Colorize(1, .82, 0, L["Gold"], ": "), Abacus:FormatMoneyFull(money or 0, true)))
end
if t.rep then
table.insert(r, Colorize(1, .82, 0, L["Reputation"], ":"))
for i, v in ipairs(t.rep) do
if v[1] > 0 then
table.insert(r, string.format("%s%s", Colorize(0, 1, 0, " - ", v[2], ": "), v[1]))
else
table.insert(r, string.format("%s%s", Colorize(1, 0, 0, " - ", v[2], ": "), v[1]))
end
end
end
table.insert(r, "")
table.insert(r, string.format("|cffeda55f%s|r", L["Click to enable/disable this quest."]))
local s = table.concat(r, "\n")
for i, v in pairs(r) do
r[i] = nil
end
return s
end
end
 
local function GetDailyOptions()
local t = {}
for i, v in ipairs(EasyDaily.db.profile.data.standard) do
if ( not v.custom ) and v.daily and isFaction(v.side) then
local cat1key = assert(string.format("c1-%s", v.cat1))
if ( not t[cat1key] )then
t[cat1key] = {
type = "group",
name = v.cat1text,
args = {}
}
end
local s
if v.cat2 then
local cat2key = assert(string.format("c1-%s", v.cat2))
if ( not t[cat1key].args[cat2key] )then
t[cat1key].args[cat2key] = {
type = "group",
name = v.cat2text,
args = {}
}
end
s = t[cat1key].args[cat2key]
else
s = t[cat1key]
end
local idkey = assert(string.format("id-%s", v.id))
s.args[idkey] = {
type = "toggle",
name = v.title or string.format("<%s>", L["Translation Not Found!"]),
desc = CreateQuestDescription(v),
get = function(info) return ( not v.disabled ) end,
set = function(info) v.disabled = not v.disabled end,
}
end
end
return t
end
 
local function GetRepOptions()
local t = {}
for i, v in ipairs(EasyDaily.db.profile.data.standard) do
if ( not v.custom ) and ( not v.daily ) and isFaction(v.side) then
for j, k in pairs(v.rep) do
local amount, faction, fid = k[1], k[2], k[3]
if amount > 0 then
if isFaction( Faction[fid] ) then
local cat1key = string.format("c1-f%s", fid)
if ( not t[cat1key] )then
t[cat1key] = {
type = "group",
name = faction,
args = {}
}
end
local idkey = string.format("id-%s", v.id)
t[cat1key].args[idkey] = {
type = "toggle",
name = v.title or string.format("<%s>", L["Translation Not Found!"]),
desc = CreateQuestDescription(v),
get = function(info) return ( not v.disabled ) end,
set = function(info) v.disabled = not v.disabled end,
}
end
end
end
end
end
return t
end
 
local function AvailableModifiers(...)
local mods = { ["Control"] = L["CTRL"], ["Alt"] = L["ALT"], ["Shift"] = L["SHIFT"], ["None"] = L["None"] }
for i = 1, select("#", ...), 1 do
local v = select(i, ...)
if v and v ~= "None" then
mods[v] = nil
end
end
return mods
end
 
local function getOptions()
if not EasyDaily.options then
EasyDaily.options = {
type = "group",
name = string.format("EasyDaily (%s)", EasyDaily.vars.version),
icon = "Interface\\Icons\\INV_Misc_TabardSummer01",
childGroups = "tree",
plugins = {},
args = {
enabled = {
order = 1,
type = "toggle",
name = L["Enabled"],
desc = L["Enable/Disable the addon."],
get = function() return EasyDaily:IsEnabled() end,
set = function(info, value) EasyDaily[value and "Enable" or "Disable"](EasyDaily) end,
width = "half",
},
debug = {
order = 2,
type = "toggle",
name = L["Debug"],
desc = L["Enable/Disable debug mode."],
get = getFunc,
set = setFunc,
},
minimapIcon = {
order = 3,
type = "toggle",
name = L["Minimap Icon"],
desc = L["Show an icon on the Minimap that will open the options menu."],
get = function() return not EasyDaily.db.profile.minimapIcon.hide end,
set = function(info, value) EasyDaily.db.profile.minimapIcon.hide = not value; LDBIcon[value and "Show" or "Hide"](EasyDaily, "EasyDaily") end,
disabled = function() return not LDBIcon end,
},
general = {
order = 10,
type = "group",
name = L["General"],
args = {
advance = {
order = 1,
type = "group",
guiInline = true,
name = L["Auto-Select"],
args = {
single = {
order = 1,
type = "toggle",
name = L["Single Reward"],
desc = L["Auto-Select rewards for quests with one or less reward."],
get = getFunc,
set = setFunc,
},
multiple = {
order = 2,
type = "toggle",
name = L["Multiple Rewards"],
desc = L["Auto-Select rewards for quests with more than one reward."],
get = getFunc,
set = setFunc,
},
gossip = {
order = 3,
type = "toggle",
name = L["Gossip Quests"],
desc = L["Automatically select quests in the gossip window."],
get = getFunc,
set = setFunc,
},
skipflag = {
order = 4,
type = "toggle",
name = L["Skip PvP Flag Popup"],
desc = L["Skips the confirmation popup that appears when accepting a daily that flags you for pvp."],
get = getFunc,
set = setFunc,
},
pause = {
order = 5,
type = "toggle",
name = L["Always Pause"],
desc = L["Always pause on the first quest/gossip window."],
get = getFunc,
set = setFunc,
},
},
},
modifiers = {
order = 2,
type = "group",
guiInline = true,
name = L["Selection Modifiers"],
args = {
overridemodifier = {
order = 1,
type = "select",
name = L["Override"],
desc = L["This modifier overrides all settings to turn-in/accept any avaiable quest."],
values = function() return AvailableModifiers(EasyDaily.db.profile.suspendmodifier) end,
get = getFunc,
set = setFunc,
},
suspendmodifier = {
order = 2,
type = "select",
name = L["Suspend"],
desc = L["This modifier temporarily suspends all turn-in/accept activity."],
values = function() return AvailableModifiers(EasyDaily.db.profile.overridemodifier) end,
get = getFunc,
set = setFunc,
},
},
},
autocheck = {
order = 3,
type = "toggle",
name = L["Auto-localize Quest Titles"],
desc = L["The addon will automatically check for quests with unlocalized titles and attempt to scan for them."],
get = getFunc,
set = setFunc,
width = "double",
},
check = {
order = 4,
type = "execute",
name = L["Localize Quest Titles"],
desc = L["Check for quests with unlocalized titles and attempt to scan for them."],
func = function() EasyDaily:CheckLocalization() end,
},
resetRewards = {
order = 5,
type = "execute",
name = L["Clear Reward Info"],
desc = L["Clears your characters saved reward info."],
confirm = true,
confirmText = L["Are you sure you want to clear your characters saved reward info?"],
func = function() CleanTable(EasyDaily.db.char.reward) end,
},
},
},
quests = {
order = 20,
type = "group",
name = L["Quests"],
args = {
daily = {
order = 1,
type = "group",
name = L["Daily"],
args = GetDailyOptions(),
},
reputation = {
order = 2,
type = "group",
name = L["Reputation"],
args = GetRepOptions(),
},
custom = {
order = 3,
type = "group",
name = L["Custom"],
--~ args = {
--~ description = {
--~ order = 1,
--~ type = "description",
--~ name = L["Note: Disabling these quests will remove them from the options menu."],
--~ },
--~ },
},
},
},
},
}
EasyDaily.options.plugins.profiles = { profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(EasyDaily.db) }
end
 
-- Quest Toggling
EasyDaily.options.args.quests.args.custom.args = {
description = {
order = 1,
type = "description",
name = L["Note: Disabling these quests will remove them from the options menu."],
},
}
 
local c = 1
for i, v in ipairs(EasyDaily.db.profile.data.custom) do
local idkey = string.format("id-*%s", c)
EasyDaily.options.args.quests.args.custom.args[idkey] = {
type = "toggle",
name = v.title,
desc = L["Enable/Disable this quest."],
get = function() return true end,
set = function()
table.remove(EasyDaily.db.profile.data, i)
end,
}
c = c + 1
end
 
return EasyDaily.options
end
 
local function createLDBLauncher()
local L_ED_CLICK = string.format(L["%s to open the options menu"], Colorize(1, 1, 0, L["Click"]))
 
local LDBObj = LibStub("LibDataBroker-1.1"):NewDataObject("EasyDaily", {
type = "launcher",
label = "EasyDaily",
OnClick = function()
if LibStub("AceConfigDialog-3.0").OpenFrames["EasyDaily"] then
LibStub("AceConfigDialog-3.0"):Close("EasyDaily")
else
LibStub("AceConfigDialog-3.0"):Open("EasyDaily")
end
end,
icon = "Interface\\Icons\\INV_Misc_TabardSummer01",
OnTooltipShow = function(tooltip)
if not tooltip or not tooltip.AddLine then return end
tooltip:AddLine("EasyDaily")
tooltip:AddLine(L_ED_CLICK)
end,
})
 
if LDBIcon then
LDBIcon:Register("EasyDaily", LDBObj, EasyDaily.db.profile.minimapIcon)
end
end
 
function EasyDaily:SetupOptions()
LibStub("AceConfig-3.0"):RegisterOptionsTable("EasyDaily", getOptions, "edtest")
AceConfigDialog:SetDefaultSize("EasyDaily", 680, 525)
AceConfigDialog:AddToBlizOptions("EasyDaily", "EasyDaily")
local optFunc = function()
AceConfigDialog:Open("EasyDaily")
end
LibStub("AceConsole-3.0"):RegisterChatCommand("easydaily", optFunc)
LibStub("AceConsole-3.0"):RegisterChatCommand("ed", optFunc)
createLDBLauncher()
end
 
EasyDaily-Beta/QuestData.lua New file
0,0 → 1,5
local L = LibStub("AceLocale-3.0"):GetLocale("EasyDaily_Quest")
 
function EasyDaily:GetQuestData()
return {{side=2,id=819,repeatable=true,xp=1050,rep={{62,L['Darkspear Trolls'],530},{250,L['Orgrimmar'],76},{62,L['Silvermoon City'],911},{62,L['Thunder Bluff'],81},{62,L['Undercity'],68}},title=L['Chen\'s Empty Keg'],enid=3292,level=15,snid=3292,reqlevel=11},{side=2,repeatable=true,id=821,xp=1350,itemreqs={{4893,5},{4894,5}},rep={{88,L['Darkspear Trolls'],530},{350,L['Orgrimmar'],76},{88,L['Thunder Bluff'],81}},title=L['Chen\'s Empty Keg'],enid=3292,level=15,snid=3292,reqlevel=11},{side=2,repeatable=true,id=822,xp=975,itemreqs={{4898,5}},rep={{19,L['Darkspear Trolls'],530},{75,L['Orgrimmar'],76},{18,L['Thunder Bluff'],81}},title=L['Chen\'s Empty Keg'],enid=3292,level=24,snid=3292,reqlevel=11},{side=1,id=1423,rep={{25,L['Stormwind'],72}},repeatable=true,title=L['The Lost Supplies'],enid=5393,level=40,snid=5393,reqlevel=30},{side=3,repeatable=true,id=1707,xp=3950,itemreqs={{8483,5}},rep={{150,L['Gadgetzan'],369}},title=L['Water Pouch Bounty'],enid=7408,level=44,snid=7408,reqlevel=40},{side=3,repeatable=true,id=1878,xp=2800,itemreqs={{8483,5}},rep={{10,L['Gadgetzan'],369}},title=L['Water Pouch Bounty'],enid=7408,level=44,snid=7408,reqlevel=40},{side=3,id=2747,rep={{10,L['Darnassus'],69},{10,L['Thunder Bluff'],81}},repeatable=true,title=L['An Extraordinary Egg'],enid=7763,level=60,snid=7763,reqlevel=42},{side=3,id=2748,rep={{3,L['Darnassus'],69},{3,L['Exodar'],930},{3,L['Gnomeregan Exiles'],54},{3,L['Ironforge'],47},{3,L['Stormwind'],72},{10,L['Darkspear Trolls'],530},{2,L['Silvermoon City'],911},{2,L['Thunder Bluff'],81}},repeatable=true,title=L['A Fine Egg'],enid=7763,level=60,snid=7763,reqlevel=42},{side=3,id=2749,rep={{10,L['Darnassus'],69},{2,L['Exodar'],930},{2,L['Gnomeregan Exiles'],54},{2,L['Ironforge'],47},{2,L['Stormwind'],72},{3,L['Darkspear Trolls'],530},{3,L['Silvermoon City'],911},{10,L['Thunder Bluff'],81}},repeatable=true,title=L['An Ordinary Egg'],enid=7763,level=60,snid=7763,reqlevel=42},{side=3,id=2750,rep={{2,L['Darnassus'],69},{2,L['Exodar'],930},{2,L['Gnomeregan Exiles'],54},{2,L['Ironforge'],47},{2,L['Stormwind'],72},{2,L['Darkspear Trolls'],530},{2,L['Orgrimmar'],76},{2,L['Silvermoon City'],911},{2,L['Thunder Bluff'],81},{2,L['Undercity'],68}},money=900,repeatable=true,title=L['A Bad Egg'],enid=7763,level=60,snid=7763,reqlevel=42},{side=1,repeatable=true,id=3792,xp=550,itemreqs={{11040,5}},rep={{25,L['Darnassus'],69}},title=L['Morrowgrain to Feathermoon Stronghold'],enid=7879,level=55,snid=7879,reqlevel=47},{side=1,repeatable=true,id=3803,xp=550,itemreqs={{11040,10}},rep={{75,L['Darnassus'],69}},title=L['Morrowgrain to Darnassus'],enid=4217,level=55,snid=3516,reqlevel=47},{side=2,repeatable=true,id=3804,xp=550,itemreqs={{11040,10}},rep={{75,L['Thunder Bluff'],81}},title=L['Morrowgrain to Thunder Bluff'],enid=9087,level=55,snid=9087,reqlevel=47},{side=1,id=4970,repeatable=true,rep={{250,L['Wintersaber Trainers'],589}},itemreqs={{12622,5},{12623,5}},title=L['Frostsaber Provisions'],enid=10618,level=60,snid=10618,reqlevel=58},{side=1,id=5201,rep={{250,L['Wintersaber Trainers'],589}},repeatable=true,title=L['Winterfall Intrusion'],enid=10618,level=60,snid=10618,reqlevel=59},{type=1,side=1,id=5981,rep={{350,L['Wintersaber Trainers'],589}},repeatable=true,title=L['Rampaging Giants'],enid=10618,level=60,snid=10618,reqlevel=60},{type=81,side=3,id=6642,repeatable=true,rep={{75,L['Thorium Brotherhood'],59}},itemreqs={{11370,10}},title=L['Favor Amongst the Brotherhood, Dark Iron Ore'],enid=12944,level=60,snid=12944,reqlevel=60},{type=81,side=3,id=6643,rep={{500,L['Thorium Brotherhood'],59}},repeatable=true,title=L['Favor Amongst the Brotherhood, Fiery Core'],enid=12944,level=60,snid=12944,reqlevel=60},{type=81,side=3,id=6644,rep={{500,L['Thorium Brotherhood'],59}},repeatable=true,title=L['Favor Amongst the Brotherhood, Lava Core'],enid=12944,level=60,snid=12944,reqlevel=60},{type=81,side=3,id=6645,repeatable=true,rep={{350,L['Thorium Brotherhood'],59}},itemreqs={{17012,2}},title=L['Favor Amongst the Brotherhood, Core Leather'],enid=12944,level=60,snid=12944,reqlevel=60},{type=81,side=3,id=6646,rep={{500,L['Thorium Brotherhood'],59}},repeatable=true,title=L['Favor Amongst the Brotherhood, Blood of the Mountain'],enid=12944,level=60,snid=12944,reqlevel=60},{side=3,id=6701,rep={{250,L['Ravenholdt'],349}},repeatable=true,title=L['Syndicate Emblems'],enid=6766,level=60,snid=6766,reqlevel=24},{side=2,rep={{2,L['Darkspear Trolls'],530},{1,L['Frostwolf Clan'],729},{2,L['Orgrimmar'],76},{2,L['Silvermoon City'],911},{2,L['Thunder Bluff'],81},{2,L['Undercity'],68}},repeatable=true,id=6741,title=L['More Booty!'],enid=13176,itemreqs={{17422,20}},snid=13176,reqlevel=51},{type=41,side=1,id=6781,rep={{3,L['Darnassus'],69},{3,L['Exodar'],930},{3,L['Gnomeregan Exiles'],54},{3,L['Ironforge'],47},{1,L['Stormpike Guard'],730},{3,L['Stormwind'],72}},repeatable=true,title=L['More Armor Scraps'],enid=13257,itemreqs={{17422,20}},snid=13257,reqlevel=51},{type=41,side=2,id=6801,rep={{3,L['Darkspear Trolls'],530},{1,L['Frostwolf Clan'],729},{3,L['Orgrimmar'],76},{3,L['Silvermoon City'],911},{3,L['Thunder Bluff'],81},{3,L['Undercity'],68}},title=L['Lokholar the Ice Lord'],enid=13236,repeatable=true,snid=13236,reqlevel=51},{type=41,side=1,id=6881,rep={{3,L['Darnassus'],69},{3,L['Exodar'],930},{3,L['Gnomeregan Exiles'],54},{3,L['Ironforge'],47},{1,L['Stormpike Guard'],730},{3,L['Stormwind'],72}},title=L['Ivus the Forest Lord'],enid=13442,repeatable=true,snid=13442,reqlevel=51},{side=2,rep={{3,L['Darkspear Trolls'],530},{1,L['Frostwolf Clan'],729},{3,L['Orgrimmar'],76},{3,L['Silvermoon City'],911},{3,L['Thunder Bluff'],81},{3,L['Undercity'],68}},id=7001,title=L['Empty Stables'],enid=13616,repeatable=true,snid=13616,reqlevel=51},{type=41,side=2,id=7002,rep={{2,L['Darkspear Trolls'],530},{2,L['Frostwolf Clan'],729},{2,L['Orgrimmar'],76},{2,L['Silvermoon City'],911},{2,L['Thunder Bluff'],81},{2,L['Undercity'],68}},title=L['Ram Hide Harnesses'],enid=13441,repeatable=true,snid=13441,reqlevel=51},{type=41,side=1,id=7026,rep={{2,L['Darnassus'],69},{2,L['Exodar'],930},{2,L['Gnomeregan Exiles'],54},{2,L['Ironforge'],47},{2,L['Stormpike Guard'],730},{2,L['Stormwind'],72}},title=L['Ram Riding Harnesses'],enid=13577,repeatable=true,snid=13577,reqlevel=51},{side=1,rep={{2,L['Darnassus'],69},{2,L['Exodar'],930},{2,L['Gnomeregan Exiles'],54},{2,L['Ironforge'],47},{1,L['Stormpike Guard'],730},{2,L['Stormwind'],72}},id=7027,title=L['Empty Stables'],enid=13617,repeatable=true,snid=13617,reqlevel=51},{type=41,side=2,id=7385,rep={{19,L['Darkspear Trolls'],530},{5,L['Frostwolf Clan'],729},{19,L['Orgrimmar'],76},{19,L['Silvermoon City'],911},{19,L['Thunder Bluff'],81},{19,L['Undercity'],68}},repeatable=true,title=L['A Gallon of Blood'],enid=13236,itemreqs={{17306,5}},snid=13236,reqlevel=51},{type=41,side=1,id=7386,rep={{19,L['Darnassus'],69},{19,L['Exodar'],930},{19,L['Gnomeregan Exiles'],54},{19,L['Ironforge'],47},{5,L['Stormpike Guard'],730},{19,L['Stormwind'],72}},repeatable=true,title=L['Crystal Cluster'],enid=13442,itemreqs={{17423,5}},snid=13442,reqlevel=51},{side=3,id=7483,type=81,rep={{500,L['Shen\'dralar'],809}},itemreqs={{18332,2},{12938,2}},repeatable=true,title=L['Libram of Rapidity'],enid=14368,level=60,snid=14368,reqlevel=54},{side=3,id=7484,type=81,rep={{500,L['Shen\'dralar'],809}},itemreqs={{18333,4},{12753,2}},repeatable=true,title=L['Libram of Focus'],enid=14368,level=60,snid=14368,reqlevel=54},{side=3,id=7485,type=81,rep={{500,L['Shen\'dralar'],809}},itemreqs={{18334,2}},repeatable=true,title=L['Libram of Protection'],enid=14368,level=60,snid=14368,reqlevel=54},{side=3,id=7725,rep={{25,L['Booty Bay'],21},{25,L['Everlook'],577},{25,L['Gadgetzan'],369},{25,L['Ratchet'],470}},money=2100,itemreqs={{18956,10}},xp=550,title=L['Again With the Zapped Giants'],repeatable=true,enid=14637,level=55,snid=14637,reqlevel=45},{side=3,id=7726,rep={{25,L['Booty Bay'],21},{25,L['Everlook'],577},{25,L['Gadgetzan'],369},{25,L['Ratchet'],470}},money=2100,itemreqs={{18958,6}},xp=550,title=L['Refuel for the Zapping'],repeatable=true,enid=14637,level=55,snid=14637,reqlevel=45},{side=3,id=7736,repeatable=true,rep={{25,L['Thorium Brotherhood'],59}},itemreqs={{18944,2},{3356,4}},title=L['Restoring Fiery Flux Supplies via Kingsblood'],enid=14624,level=60,snid=14624,reqlevel=45},{type=81,side=3,id=7737,repeatable=true,rep={{25,L['Thorium Brotherhood'],59}},itemreqs={{18945,4}},title=L['Gaining Acceptance'],enid=14624,level=60,snid=14624,reqlevel=45},{side=1,id=7796,repeatable=true,rep={{75,L['Stormwind'],72}},itemreqs={{14047,20}},title=L['Additional Runecloth'],enid=14722,level=60,snid=14722,reqlevel=50},{side=1,id=7801,repeatable=true,rep={{75,L['Darnassus'],69}},itemreqs={{14047,20}},title=L['Additional Runecloth'],enid=14725,level=60,snid=14725,reqlevel=50},{side=1,id=7806,repeatable=true,rep={{75,L['Ironforge'],47}},itemreqs={{14047,20}},title=L['Additional Runecloth'],enid=14723,level=60,snid=14723,reqlevel=50},{side=1,id=7812,repeatable=true,rep={{75,L['Gnomeregan Exiles'],54}},itemreqs={{14047,20}},title=L['Additional Runecloth'],enid=14724,level=60,snid=14724,reqlevel=50},{side=2,id=7819,repeatable=true,rep={{75,L['Undercity'],68}},itemreqs={{14047,20}},title=L['Additional Runecloth'],enid=14729,level=60,snid=14729,reqlevel=50},{side=2,id=7825,repeatable=true,rep={{75,L['Thunder Bluff'],81}},itemreqs={{14047,20}},title=L['Additional Runecloth'],enid=14728,level=60,snid=14728,reqlevel=50},{side=2,repeatable=true,id=7832,xp=950,itemreqs={{14047,20}},rep={{75,L['Orgrimmar'],76}},title=L['Additional Runecloth'],enid=14726,level=60,snid=14726,reqlevel=50},{side=2,id=7837,repeatable=true,rep={{75,L['Darkspear Trolls'],530}},itemreqs={{14047,20}},title=L['Additional Runecloth'],enid=14727,level=60,snid=14727,reqlevel=50},{side=3,id=8195,rep={{25,L['Zandalar Tribe'],270}},repeatable=true,title=L['Zulian, Razzashi, and Hakkari Coins'],enid=15070,level=60,snid=15070,reqlevel=58},{side=3,id=8238,rep={{25,L['Zandalar Tribe'],270}},repeatable=true,title=L['Gurubashi, Vilebranch, and Witherbark Coins'],enid=15070,level=60,snid=15070,reqlevel=58},{side=3,id=8239,rep={{25,L['Zandalar Tribe'],270}},repeatable=true,title=L['Sandfury, Skullsplitter, and Bloodscalp Coins'],enid=15070,level=60,snid=15070,reqlevel=58},{side=3,id=8241,repeatable=true,rep={{25,L['Thorium Brotherhood'],59}},itemreqs={{18944,2},{3575,4}},title=L['Restoring Fiery Flux Supplies via Iron'],enid=14624,level=60,snid=14624,reqlevel=45},{side=3,id=8242,repeatable=true,rep={{25,L['Thorium Brotherhood'],59}},itemreqs={{18944,2},{4234,10}},title=L['Restoring Fiery Flux Supplies via Heavy Leather'],enid=14624,level=60,snid=14624,reqlevel=45},{side=3,id=8249,repeatable=true,rep={{75,L['Ravenholdt'],349},{-75,L['Syndicate'],70}},itemreqs={{16885,5}},title=L['Junkboxes Needed'],enid=6707,level=60,snid=6707,reqlevel=50},{side=3,id=8319,repeatable=true,rep={{500,L['Cenarion Circle'],609}},itemreqs={{20404,10}},title=L['Encrypted Twilight Texts'],enid=15306,level=60,snid=15306,reqlevel=57},{side=3,repeatable=true,id=8466,xp=550,itemreqs={{21377,5}},rep={{150,L['Timbermaw Hold'],576}},title=L['Feathers for Grazle'],enid=11554,level=55,snid=11554,reqlevel=45},{side=3,repeatable=true,id=8467,xp=550,itemreqs={{21377,5}},rep={{150,L['Timbermaw Hold'],576}},title=L['Feathers for Nafien'],enid=15395,level=55,snid=15395,reqlevel=45},{side=3,repeatable=true,id=8469,xp=575,itemreqs={{21383,5}},rep={{150,L['Timbermaw Hold'],576}},title=L['Beads for Salfa'],enid=11556,level=56,snid=11556,reqlevel=50},{side=3,id=8784,rep={{1000,L['Brood of Nozdormu'],910}},repeatable=true,title=L['Secrets of the Qiraji'],enid=15502,level=60,snid=15502,reqlevel=60},{type=81,side=3,rep={{750,L['Sporeggar'],970}},repeatable=true,id=9715,xp=22000,title=L['Bring Me A Shrubbery!'],itemreqs={{24246,5}},enid=17856,level=65,snid=17856,reqlevel=63},{side=3,repeatable=true,id=9743,xp=10750,itemreqs={{24291,6}},rep={{750,L['Sporeggar'],970}},title=L['Natural Enemies'],enid=17923,level=64,snid=17923,reqlevel=61},{type=81,side=3,id=9765,repeatable=true,xp=25300,rep={{250,L['Cenarion Expedition'],942}},title=L['Preparing for War'],enid=17841,level=70,snid=17841,reqlevel=67},{side=3,repeatable=true,id=9802,xp=10400,itemreqs={{24401,10}},rep={{250,L['Cenarion Expedition'],942}},title=L['Plants of Zangarmarsh'],enid=17909,level=63,snid=17909,reqlevel=60},{side=3,repeatable=true,id=9806,xp=10750,itemreqs={{24449,6}},rep={{750,L['Sporeggar'],970}},title=L['Fertile Spores'],enid=17925,level=64,snid=17925,reqlevel=62},{side=3,repeatable=true,id=9808,xp=10750,itemreqs={{24245,10}},rep={{750,L['Sporeggar'],970}},title=L['Glowcap Mushrooms'],enid=17924,level=64,snid=17924,reqlevel=62},{side=3,id=9875,rep={{500,L['Cenarion Expedition'],942}},repeatable=true,title=L['Uncatalogued Species'],enid=17909,level=63,snid=17909,reqlevel=60},{side=3,id=9883,repeatable=true,rep={{250,L['The Consortium'],933}},itemreqs={{25416,10}},title=L['More Crystal Fragments'],enid=18265,level=66,snid=18265,reqlevel=64},{side=3,id=9892,money=3800,rep={{250,L['The Consortium'],933},{10,L['Kurenai'],978}},itemreqs={{25433,10}},repeatable=true,title=L['More Obsidian Warbeads'],enid=18265,level=67,snid=18265,reqlevel=64},{side=3,id=9915,repeatable=true,rep={{250,L['The Consortium'],933}},itemreqs={{25463,3}},title=L['More Heads Full of Ivory'],enid=18333,level=66,snid=18333,reqlevel=64},{side=3,repeatable=true,id=10017,xp=10750,itemreqs={{25802,8}},rep={{250,L['The Aldor'],932},{-275,L['The Scryers'],934}},title=L['Strained Supplies'],enid=18597,level=64,snid=18597,reqlevel=62},{side=3,repeatable=true,id=10024,xp=11000,itemreqs={{25744,8}},rep={{-275,L['The Aldor'],932},{250,L['The Scryers'],934}},title=L['Voren\'thal\'s Visions'],enid=18596,level=65,snid=18596,reqlevel=62},{cat1text=L['Outland'],daily=1,enid=18266,level=60,reqlevel=55,type=41,side=1,id=10106,xp=7150,cat2=3483,cat2text=L['Hellfire Peninsula'],title=L['Hellfire Fortifications'],cat1=8,money=7000,rep={{150,L['Honor Hold'],946}},snid=18266,repeatable=true},{cat1text=L['Outland'],daily=1,enid=18267,level=60,reqlevel=55,type=41,side=2,id=10110,xp=7150,cat2=3483,cat2text=L['Hellfire Peninsula'],title=L['Hellfire Fortifications'],cat1=8,money=7000,rep={{150,L['Thrallmar'],947}},snid=18267,repeatable=true},{side=3,id=10308,repeatable=true,rep={{250,L['The Consortium'],933}},itemreqs={{29209,10}},title=L['Another Heap of Ethereals'],enid=19880,level=68,snid=19880,reqlevel=67},{side=3,id=10326,repeatable=true,rep={{250,L['The Aldor'],932},{-275,L['The Scryers'],934}},itemreqs={{29425,10}},title=L['More Marks of Kil\'jaeden'],enid=18537,level=65,snid=18537,reqlevel=62},{side=3,id=10327,rep={{25,L['The Aldor'],932},{-27,L['The Scryers'],934}},repeatable=true,title=L['Single Mark of Kil\'jaeden'],enid=18537,level=65,snid=18537,reqlevel=62},{side=1,rep={{75,L['Exodar'],930}},itemreqs={{14047,20}},id=10358,title=L['Additional Runecloth'],enid=20604,level=60,snid=20604,repeatable=true},{side=2,rep={{75,L['Silvermoon City'],911}},itemreqs={{14047,20}},id=10363,title=L['Additional Runecloth'],enid=20612,level=60,snid=20612,repeatable=true},{side=3,id=10414,rep={{-27,L['The Aldor'],932},{25,L['The Scryers'],934}},repeatable=true,title=L['Single Firewing Signet'],enid=18531,level=70,snid=18531,reqlevel=64},{side=3,id=10415,repeatable=true,rep={{-275,L['The Aldor'],932},{250,L['The Scryers'],934}},itemreqs={{29426,10}},title=L['More Firewing Signets'],enid=18531,level=70,snid=18531,reqlevel=64},{side=3,id=10416,repeatable=true,xp=15800,rep={{-385,L['The Aldor'],932},{350,L['The Scryers'],934}},title=L['Synthesis of Power'],enid=18530,level=70,snid=18530,reqlevel=64},{side=3,id=10420,repeatable=true,xp=15800,rep={{350,L['The Aldor'],932},{-385,L['The Scryers'],934}},title=L['A Cleansing Light'],enid=18538,level=70,snid=18538,reqlevel=64},{side=1,id=10477,repeatable=true,rep={{500,L['Kurenai'],978}},itemreqs={{25433,10}},title=L['More Warbeads'],enid=18408,level=68,snid=18408,reqlevel=65},{side=2,id=10478,repeatable=true,rep={{500,L['The Mag\'har'],941}},itemreqs={{25433,10}},title=L['More Warbeads!'],enid=18407,level=68,snid=18407,reqlevel=65},{side=3,id=10654,repeatable=true,rep={{250,L['The Aldor'],932},{-275,L['The Scryers'],934}},itemreqs={{30809,10}},title=L['More Marks of Sargeras'],enid=18537,level=70,snid=18537,reqlevel=68},{side=3,id=10655,rep={{25,L['The Aldor'],932},{-27,L['The Scryers'],934}},repeatable=true,title=L['Single Mark of Sargeras'],enid=22214,level=70,snid=18537,reqlevel=68},{side=3,id=10658,repeatable=true,rep={{-275,L['The Aldor'],932},{250,L['The Scryers'],934}},itemreqs={{30810,10}},title=L['More Sunfury Signets'],enid=18531,level=70,snid=18531,reqlevel=68},{side=3,id=10659,rep={{-27,L['The Aldor'],932},{25,L['The Scryers'],934}},repeatable=true,title=L['Single Sunfury Signet'],enid=18531,level=70,snid=18531,reqlevel=68},{side=3,id=10822,rep={{-27,L['The Aldor'],932},{25,L['The Scryers'],934}},repeatable=true,title=L['Single Sunfury Signet'],enid=22211,level=70,snid=22211,reqlevel=68},{side=3,id=10823,repeatable=true,rep={{-275,L['The Aldor'],932},{250,L['The Scryers'],934}},itemreqs={{30810,10}},title=L['More Sunfury Signets'],enid=22211,level=70,snid=22211,reqlevel=68},{side=3,id=10827,repeatable=true,rep={{250,L['The Aldor'],932},{-275,L['The Scryers'],934}},itemreqs={{30809,10}},title=L['More Marks of Sargeras'],enid=22214,level=70,snid=22214,reqlevel=68},{side=3,id=10828,rep={{25,L['The Aldor'],932},{-27,L['The Scryers'],934}},repeatable=true,title=L['Single Mark of Sargeras'],enid=22214,level=70,snid=22214,reqlevel=68},{side=3,id=10918,repeatable=true,rep={{250,L['Lower City'],1011}},itemreqs={{25719,30}},title=L['More Feathers'],enid=22429,level=65,snid=22429,reqlevel=62},{cat2=3679,cat1text=L['Outland'],daily=1,enid=23048,level=70,reqlevel=70,side=3,id=11008,rep={{350,L['Sha\'tari Skyguard'],1031}},cat2text=L['Skettis'],title=L['Fires Over Skettis'],cat1=8,money=119900,repeatable=true,snid=23048,xp=12650},{cat2=3520,cat1text=L['Outland'],daily=1,enid=23140,level=70,reqlevel=70,side=3,id=11015,rep={{250,L['Netherwing'],1015}},cat2text=L['Shadowmoon Valley'],cat1=8,title=L['Netherwing Crystals'],itemreqs={{32427,30}},repeatable=true,money=119900,snid=23140,xp=12650},{cat2=3520,cat1text=L['Outland'],daily=1,enid=23140,level=70,reqlevel=70,side=3,id=11016,rep={{250,L['Netherwing'],1015}},cat2text=L['Shadowmoon Valley'],title=L['Nethermine Flayer Hide'],cat1=8,money=119900,repeatable=true,snid=23140,itemreqs={{32470,35}}},{cat2=3520,cat1text=L['Outland'],daily=1,enid=23140,level=70,reqlevel=70,side=3,id=11017,rep={{250,L['Netherwing'],1015}},cat2text=L['Shadowmoon Valley'],cat1=8,title=L['Netherdust Pollen'],itemreqs={{32468,40}},repeatable=true,money=119900,snid=23140,xp=12650},{cat2=3520,cat1text=L['Outland'],daily=1,enid=23140,level=70,reqlevel=70,side=3,id=11018,rep={{250,L['Netherwing'],1015}},cat2text=L['Shadowmoon Valley'],cat1=8,title=L['Nethercite Ore'],itemreqs={{32464,40}},repeatable=true,money=119900,snid=23140,xp=12650},{cat2=3520,cat1text=L['Outland'],daily=1,enid=23141,level=70,reqlevel=70,side=3,id=11020,rep={{250,L['Netherwing'],1015}},cat2text=L['Shadowmoon Valley'],title=L['A Slow Death'],cat1=8,money=119900,repeatable=true,snid=23141,xp=12650},{cat1text=L['Outland'],daily=1,enid=23120,level=70,reqlevel=70,side=3,id=11023,rep={{500,L['Ogri\'la'],1038},{500,L['Sha\'tari Skyguard'],1031}},cat2=3522,cat2text=L['Blade\'s Edge Mountains'],title=L['Bomb Them Again!'],cat1=8,money=119900,repeatable=true,snid=23120,xp=12650},{cat2=3520,cat1text=L['Outland'],daily=1,enid=23141,level=70,reqlevel=70,side=3,id=11035,rep={{250,L['Netherwing'],1015}},cat2text=L['Shadowmoon Valley'],cat1=8,title=L['The Not-So-Friendly Skies...'],itemreqs={{32509,10}},repeatable=true,money=119900,snid=23141,xp=12650},{cat1text=L['Outland'],daily=1,enid=23253,level=70,reqlevel=70,side=3,id=11051,rep={{350,L['Ogri\'la'],1038}},cat2=3522,cat2text=L['Blade\'s Edge Mountains'],title=L['Banish More Demons'],cat1=8,money=119900,repeatable=true,snid=23253,xp=12650},{cat2=3520,cat1text=L['Outland'],daily=1,enid=23291,level=70,reqlevel=70,side=3,id=11055,rep={{350,L['Netherwing'],1015}},cat2text=L['Shadowmoon Valley'],title=L['The Booterang: A Cure For The Common Worthless Peon'],cat1=8,money=119900,repeatable=true,snid=23291,xp=12650},{cat1text=L['Outland'],daily=1,enid=23335,level=70,reqlevel=70,side=3,id=11066,rep={{350,L['Ogri\'la'],1038},{350,L['Sha\'tari Skyguard'],1031}},cat2=3522,cat2text=L['Blade\'s Edge Mountains'],title=L['Wrangle More Aether Rays!'],cat1=8,money=119900,repeatable=true,snid=23335,xp=12650},{cat2=3520,cat1text=L['Outland'],daily=1,enid=23149,level=70,reqlevel=70,side=3,id=11076,rep={{350,L['Netherwing'],1015}},cat2text=L['Shadowmoon Valley'],cat1=8,title=L['Picking Up The Pieces...'],itemreqs={{32723,15}},repeatable=true,money=182800,snid=23149,xp=15800},{cat2=3520,cat1text=L['Outland'],daily=1,enid=23376,level=70,reqlevel=70,side=3,id=11077,rep={{350,L['Netherwing'],1015}},cat2text=L['Shadowmoon Valley'],title=L['Dragons are the Least of Our Problems'],cat1=8,money=119900,repeatable=true,snid=23376,xp=12650},{cat1text=L['Outland'],daily=1,enid=23233,level=70,reqlevel=70,side=3,id=11080,rep={{350,L['Ogri\'la'],1038}},cat2=3522,cat2text=L['Blade\'s Edge Mountains'],title=L['The Relic\'s Emanation'],cat1=8,money=91000,repeatable=true,snid=23233,xp=9500},{cat2=3679,cat1text=L['Outland'],daily=1,enid=23048,level=70,reqlevel=70,side=3,id=11085,rep={{150,L['Sha\'tari Skyguard'],1031}},cat2text=L['Skettis'],title=L['Escape from Skettis'],cat1=8,money=91000,repeatable=true,snid=23383,xp=9500},{cat2=3520,cat1text=L['Outland'],daily=1,enid=23139,level=70,reqlevel=70,side=3,id=11086,rep={{500,L['Netherwing'],1015}},cat2text=L['Shadowmoon Valley'],title=L['Disrupting the Twilight Portal'],cat1=8,money=119900,repeatable=true,snid=23139,xp=12650},{cat2=3520,cat1text=L['Outland'],daily=1,enid=23139,level=70,reqlevel=70,type=1,side=2,id=11097,rep={{500,L['Netherwing'],1015}},cat2text=L['Shadowmoon Valley'],title=L['The Deadliest Trap Ever Laid'],cat1=8,money=182800,repeatable=true,snid=23434,xp=15800},{cat2=3520,cat1text=L['Outland'],daily=1,enid=23139,level=70,reqlevel=70,type=1,side=3,money=182800,rep={{500,L['Netherwing'],1015}},title=L['The Deadliest Trap Ever Laid'],cat2text=L['Shadowmoon Valley'],cat1=8,repeatable=true,snid=23452,id=11101},{cat1text=L['Seasonal'],daily=1,enid=24519,repeatable=true,side=1,money=44000,rep={{75,L['Stormwind'],72}},cat2=-1003,title=L['Stop the Fires!'],cat2text=L['Hallow\'s End'],cat1=9,id=11131,snid=24519,xp=900},{cat2=495,cat1text=L['Northrend'],daily=1,enid=23895,level=71,reqlevel=69,side=1,id=11153,rep={{38,L['Alliance Vanguard'],1037},{250,L['Valiance Expedition'],1050}},cat2text=L['Howling Fjord'],title=L['Break the Blockade'],cat1=10,money=47000,repeatable=true,snid=23895,xp=20100},{cat1text=L['Seasonal'],daily=1,enid=23973,repeatable=true,side=2,money=44000,rep={{75,L['Orgrimmar'],76}},cat2=-1003,title=L['Stop the Fires!'],cat2text=L['Hallow\'s End'],cat1=9,id=11219,snid=23973,xp=12000},{cat2=-370,side=1,id=11293,cat1text=L['Seasonal'],cat2text=L['Brewfest'],daily=1,title=L['Bark for the Barleybrews!'],cat1=9,enid=23627,repeatable=true,snid=23627,reqlevel=1},{cat2=-370,side=1,id=11294,cat1text=L['Seasonal'],cat2text=L['Brewfest'],daily=1,title=L['Bark for the Thunderbrews!'],cat1=9,enid=23628,repeatable=true,snid=23628,reqlevel=1},{cat2=3358,side=1,id=11335,cat1text=L['Battlegrounds'],xp=6550,type=41,cat2text=L['Arathi Basin'],daily=1,cat1=6,money=44000,enid=15351,title=L['Call to Arms: Arathi Basin'],snid=15351,repeatable=true},{cat2=2597,side=1,id=11336,cat1text=L['Battlegrounds'],xp=12300,type=41,cat2text=L['Alterac Valley'],daily=1,cat1=6,money=44000,enid=15351,title=L['Call to Arms: Alterac Valley'],snid=15351,repeatable=true},{cat2=3820,side=1,id=11337,cat1text=L['Battlegrounds'],xp=12300,type=41,cat2text=L['Eye of the Storm'],daily=1,cat1=6,money=44000,enid=15351,title=L['Call to Arms: Eye of the Storm'],snid=15351,repeatable=true},{cat2=3277,side=1,id=11338,cat1text=L['Battlegrounds'],xp=2350,type=41,cat2text=L['Warsong Gulch'],daily=1,cat1=6,money=44000,enid=15351,title=L['Call to Arms: Warsong Gulch'],snid=15351,repeatable=true},{cat2=3358,side=2,id=11339,cat1text=L['Battlegrounds'],xp=12300,type=41,cat2text=L['Arathi Basin'],daily=1,cat1=6,money=44000,enid=15350,title=L['Call to Arms: Arathi Basin'],snid=15350,repeatable=true},{cat2=2597,side=2,id=11340,cat1text=L['Battlegrounds'],xp=12300,type=41,cat2text=L['Alterac Valley'],daily=1,cat1=6,money=44000,enid=15350,title=L['Call to Arms: Alterac Valley'],snid=15350,repeatable=true},{cat2=3820,side=2,id=11341,cat1text=L['Battlegrounds'],xp=12300,type=41,cat2text=L['Eye of the Storm'],daily=1,cat1=6,money=44000,enid=15350,title=L['Call to Arms: Eye of the Storm'],snid=15350,repeatable=true},{cat2=3277,side=2,id=11342,cat1text=L['Battlegrounds'],xp=12300,type=41,cat2text=L['Warsong Gulch'],daily=1,cat1=6,money=44000,enid=15350,title=L['Call to Arms: Warsong Gulch'],snid=15350,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24369,level=70,reqlevel=70,type=85,side=3,id=11354,rep={{350,L['The Consortium'],933},{350,L['Honor Hold'],946},{350,L['Thrallmar'],947}},cat2=85,title=L['Wanted: Nazan\'s Riding Crop'],cat2text=L['Heroic'],cat1=2,money=246000,snid=24369,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24369,level=70,reqlevel=70,type=85,side=3,id=11362,rep={{350,L['The Consortium'],933},{350,L['Honor Hold'],946},{350,L['Thrallmar'],947}},cat2=85,title=L['Wanted: Keli\'dan\'s Feathered Stave'],cat2text=L['Heroic'],cat1=2,money=246000,snid=24369,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24369,level=70,reqlevel=70,type=85,side=3,id=11363,rep={{350,L['The Consortium'],933},{350,L['Honor Hold'],946},{350,L['Thrallmar'],947}},cat2=85,title=L['Wanted: Bladefist\'s Seal'],cat2text=L['Heroic'],cat1=2,money=246000,snid=24369,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24370,level=70,reqlevel=70,type=81,side=3,id=11364,rep={{250,L['The Consortium'],933},{250,L['Honor Hold'],946},{250,L['Thrallmar'],947}},cat2=81,title=L['Wanted: Shattered Hand Centurions'],cat2text=L['Dungeon'],cat1=2,money=163900,snid=24370,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24369,level=70,reqlevel=70,type=85,side=3,id=11368,rep={{350,L['Cenarion Expedition'],942},{350,L['The Consortium'],933}},cat2=85,title=L['Wanted: The Heart of Quagmirran'],cat2text=L['Heroic'],cat1=2,money=246000,snid=24369,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24369,level=70,reqlevel=70,type=85,side=3,id=11369,rep={{350,L['Cenarion Expedition'],942},{350,L['The Consortium'],933}},cat2=85,title=L['Wanted: A Black Stalker Egg'],cat2text=L['Heroic'],cat1=2,money=246000,snid=24369,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24369,level=70,reqlevel=70,type=85,side=3,id=11370,rep={{350,L['Cenarion Expedition'],942},{350,L['The Consortium'],933}},cat2=85,title=L['Wanted: The Warlord\'s Treatise'],cat2text=L['Heroic'],cat1=2,money=246000,snid=24369,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24370,level=70,reqlevel=70,type=81,side=3,id=11371,rep={{250,L['Cenarion Expedition'],942},{250,L['The Consortium'],933}},cat2=81,title=L['Wanted: Coilfang Myrmidons'],cat2text=L['Dungeon'],cat1=2,money=163900,snid=24370,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24369,level=70,reqlevel=70,type=85,side=3,id=11372,rep={{350,L['Lower City'],1011},{350,L['The Consortium'],933}},cat2=85,title=L['Wanted: The Headfeathers of Ikiss'],cat2text=L['Heroic'],cat1=2,money=246000,snid=24369,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24369,level=70,reqlevel=70,type=85,side=3,id=11373,rep={{500,L['The Consortium'],933}},cat2=85,title=L['Wanted: Shaffar\'s Wondrous Pendant'],cat2text=L['Heroic'],cat1=2,money=246000,snid=24369,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24369,level=70,reqlevel=70,type=85,side=3,id=11374,rep={{350,L['Lower City'],1011},{350,L['The Consortium'],933}},cat2=85,title=L['Wanted: The Exarch\'s Soul Gem'],cat2text=L['Heroic'],cat1=2,money=246000,snid=24369,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24369,level=70,reqlevel=70,type=85,side=3,id=11375,rep={{350,L['Lower City'],1011},{350,L['The Consortium'],933}},cat2=85,title=L['Wanted: Murmur\'s Whisper'],cat2text=L['Heroic'],cat1=2,money=246000,snid=24369,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24370,level=70,reqlevel=70,type=81,side=3,id=11376,rep={{250,L['Lower City'],1011},{250,L['The Consortium'],933}},cat2=81,title=L['Wanted: Malicious Instructors'],cat2text=L['Dungeon'],cat1=2,money=163900,snid=24370,repeatable=true},{cat2=-304,cat1text=L['Professions'],daily=1,enid=24393,level=70,reqlevel=70,side=3,id=11377,cat2text=L['Cooking'],title=L['Revenge is Tasty'],cat1=5,xp=12650,money=75900,snid=24393,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24369,level=70,reqlevel=70,type=85,side=3,id=11378,rep={{350,L['Keepers of Time'],989},{350,L['The Consortium'],933}},cat2=85,title=L['Wanted: The Epoch Hunter\'s Head'],cat2text=L['Heroic'],cat1=2,money=246000,snid=24369,repeatable=true},{cat2=-304,cat1text=L['Professions'],daily=1,enid=24393,level=70,reqlevel=70,side=3,id=11379,cat2text=L['Cooking'],title=L['Super Hot Stew'],cat1=5,xp=12650,money=75900,snid=24393,repeatable=true},{cat2=-304,cat1text=L['Professions'],daily=1,enid=24393,level=70,reqlevel=70,side=3,id=11380,cat2text=L['Cooking'],cat1=5,title=L['Manalicious'],itemreqs={{33849,15}},money=75900,xp=12650,snid=24393,repeatable=true},{cat2=-304,cat1text=L['Professions'],daily=1,enid=24393,level=70,reqlevel=70,side=3,id=11381,cat2text=L['Cooking'],title=L['Soup for the Soul'],cat1=5,xp=12650,money=75900,snid=24393,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24369,level=70,reqlevel=70,type=85,side=3,id=11382,rep={{350,L['Keepers of Time'],989},{350,L['The Consortium'],933}},cat2=85,title=L['Wanted: Aeonus\'s Hourglass'],cat2text=L['Heroic'],cat1=2,money=246000,snid=24369,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24370,level=70,reqlevel=70,type=81,side=3,id=11383,rep={{250,L['Keepers of Time'],989},{250,L['The Consortium'],933}},cat2=81,title=L['Wanted: Rift Lords'],cat2text=L['Dungeon'],cat1=2,money=163900,snid=24370,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24369,level=70,reqlevel=70,type=85,side=3,id=11384,rep={{350,L['The Consortium'],933},{350,L['The Sha\'tar'],935}},cat2=85,title=L['Wanted: A Warp Splinter Clipping'],cat2text=L['Heroic'],cat1=2,money=246000,snid=24369,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24370,level=70,reqlevel=70,type=81,side=3,id=11385,rep={{250,L['The Consortium'],933},{250,L['The Sha\'tar'],935}},cat2=81,title=L['Wanted: Sunseeker Channelers'],cat2text=L['Dungeon'],cat1=2,money=163900,snid=24370,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24369,level=70,reqlevel=70,type=85,side=3,id=11386,rep={{350,L['The Consortium'],933},{350,L['The Sha\'tar'],935}},cat2=85,title=L['Wanted: Pathaleon\'s Projector'],cat2text=L['Heroic'],cat1=2,money=246000,snid=24369,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24370,level=70,reqlevel=70,type=81,side=3,id=11387,rep={{250,L['The Consortium'],933},{250,L['The Sha\'tar'],935}},cat2=81,title=L['Wanted: Tempest-Forge Destroyers'],cat2text=L['Dungeon'],cat1=2,money=163900,snid=24370,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24369,level=70,reqlevel=70,type=85,side=3,id=11388,rep={{350,L['The Consortium'],933},{350,L['The Sha\'tar'],935}},cat2=85,title=L['Wanted: The Scroll of Skyriss'],cat2text=L['Heroic'],cat1=2,money=246000,snid=24369,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24370,level=70,reqlevel=70,type=81,side=3,id=11389,rep={{250,L['The Consortium'],933},{250,L['The Sha\'tar'],935}},cat2=81,title=L['Wanted: Arcatraz Sentinels'],cat2text=L['Dungeon'],cat1=2,money=163900,snid=24370,repeatable=true},{cat1text=L['Northrend'],daily=1,enid=24399,level=71,reqlevel=70,side=1,id=11391,rep={{250,L['Explorers\' League'],1068}},cat2=495,cat2text=L['Howling Fjord'],title=L['Steel Gate Patrol'],cat1=10,money=71000,repeatable=true,snid=24399,xp=20100},{type=81,cat2text=L['Hallow\'s End'],id=11401,cat1text=L['Seasonal'],xp=1150,daily=1,title=L['Call the Headless Horseman'],cat2=-1003,side=3,cat1=9,repeatable=true,reqlevel=65},{cat2=-1003,cat2text=L['Hallow\'s End'],id=11404,cat1text=L['Seasonal'],xp=1150,daily=1,title=L['Call the Headless Horseman'],side=1,cat1=9,repeatable=true,reqlevel=65},{type=81,cat2text=L['Hallow\'s End'],id=11405,cat1text=L['Seasonal'],xp=1200,daily=1,title=L['Call the Headless Horseman'],cat2=-1003,side=2,cat1=9,repeatable=true,reqlevel=65},{side=2,cat2=-370,id=11407,cat1text=L['Seasonal'],cat2text=L['Brewfest'],daily=1,title=L['Bark for Drohn\'s Distillery!'],enid=24498,cat1=9,snid=24498,repeatable=true},{side=2,cat2=-370,id=11408,cat1text=L['Seasonal'],cat2text=L['Brewfest'],daily=1,title=L['Bark for T\'chali\'s Voodoo Brewery!'],enid=24499,cat1=9,snid=24499,repeatable=true},{cat2=495,cat1text=L['Northrend'],daily=1,enid=24810,level=71,reqlevel=70,side=3,id=11472,rep={{500,L['The Kalu\'ak'],1073}},cat2text=L['Howling Fjord'],title=L['The Way to His Heart...'],cat1=10,money=71000,repeatable=true,snid=24810,xp=20100},{cat2=4080,cat1text=L['Eastern Kingdoms'],daily=1,enid=24967,level=70,reqlevel=70,side=3,money=39700,rep={{150,L['Shattered Sun Offensive'],1077}},title=L['The Sanctum Wards'],cat2text=L['Isle of Quel\'Danas'],cat1=0,repeatable=true,snid=24967,id=11496},{cat1text=L['Dungeons'],daily=1,enid=24369,level=70,reqlevel=70,type=85,side=3,id=11499,rep={{350,L['Shattered Sun Offensive'],1077},{350,L['The Consortium'],933}},cat2=85,title=L['Wanted: The Signet Ring of Prince Kael\'thas'],cat2text=L['Heroic'],cat1=2,money=246000,snid=24369,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=24370,level=70,reqlevel=70,type=81,side=3,id=11500,rep={{250,L['Shattered Sun Offensive'],1077},{250,L['The Consortium'],933}},cat2=81,title=L['Wanted: Sisters of Torment'],cat2text=L['Dungeon'],cat1=2,money=163900,snid=24370,repeatable=true},{cat2=3518,cat1text=L['Outland'],daily=1,enid=24866,level=70,reqlevel=64,type=41,side=1,id=11502,rep={{500,L['Kurenai'],978}},cat2text=L['Nagrand'],title=L['In Defense of Halaa'],cat1=8,money=44000,repeatable=true,snid=24866,xp=12650},{cat2=3518,cat1text=L['Outland'],daily=1,enid=24881,level=70,reqlevel=64,type=41,side=2,id=11503,rep={{500,L['The Mag\'har'],941}},cat2text=L['Nagrand'],title=L['Enemies, Old and New'],cat1=8,money=44000,repeatable=true,snid=24881,xp=12650},{cat2=3519,cat1text=L['Outland'],daily=1,enid=24885,reqlevel=63,type=41,side=1,money=44000,xp=12000,title=L['Spirits of Auchindoun'],cat2text=L['Terokkar Forest'],cat1=8,id=11505,snid=24885,repeatable=true},{cat2=3519,cat1text=L['Outland'],daily=1,enid=24886,reqlevel=63,type=41,side=2,money=44000,xp=11300,title=L['Spirits of Auchindoun'],cat2text=L['Terokkar Forest'],cat1=8,id=11506,snid=24886,repeatable=true},{cat1text=L['Outland'],daily=1,enid=24932,level=70,reqlevel=70,side=3,id=11513,rep={{250,L['Shattered Sun Offensive'],1077}},cat2=3522,cat2text=L['Blade\'s Edge Mountains'],title=L['Intercepting the Mana Cells'],cat1=8,money=101000,repeatable=true,snid=24932,itemreqs={{34246,10}}},{cat1text=L['Outland'],daily=1,enid=24932,level=70,reqlevel=70,side=3,id=11514,rep={{250,L['Shattered Sun Offensive'],1077}},cat2=3522,cat2text=L['Blade\'s Edge Mountains'],cat1=8,title=L['Maintaining the Sunwell Portal'],repeatable=true,money=101000,itemreqs={{34246,10}},snid=24932,xp=9500},{cat2=3483,cat1text=L['Outland'],daily=1,enid=24937,level=70,reqlevel=70,side=3,id=11515,cat2text=L['Hellfire Peninsula'],cat1=8,title=L['Blood for Blood'],rep={{250,L['Shattered Sun Offensive'],1077}},money=119900,xp=12650,snid=24937,repeatable=true},{cat1text=L['Outland'],daily=1,enid=24937,level=70,reqlevel=70,side=3,id=11516,rep={{250,L['Shattered Sun Offensive'],1077}},cat2=3483,cat2text=L['Hellfire Peninsula'],title=L['Blast the Gateway'],cat1=8,money=101000,repeatable=true,snid=24937,xp=9500},{cat1text=L['Outland'],daily=1,enid=24975,level=70,reqlevel=70,side=3,id=11520,rep={{350,L['Shattered Sun Offensive'],1077}},cat2=3519,cat2text=L['Terokkar Forest'],title=L['Discovering Your Roots'],cat1=8,money=91000,repeatable=true,snid=24975,itemreqs={{34254,5}}},{cat1text=L['Outland'],daily=1,enid=24975,level=70,reqlevel=70,side=3,id=11521,rep={{350,L['Shattered Sun Offensive'],1077}},cat2=3519,cat2text=L['Terokkar Forest'],cat1=8,title=L['Rediscovering Your Roots'],repeatable=true,money=138800,itemreqs={{34254,5}},snid=24975,xp=15800},{cat2=4080,cat1text=L['Eastern Kingdoms'],daily=1,enid=24967,level=70,reqlevel=70,side=3,id=11523,rep={{150,L['Shattered Sun Offensive'],1077}},cat2text=L['Isle of Quel\'Danas'],title=L['Arm the Wards!'],cat1=0,money=91000,repeatable=true,snid=24967,xp=9500},{cat2=4080,cat1text=L['Eastern Kingdoms'],daily=1,enid=24965,level=70,reqlevel=70,side=3,money=39700,rep={{150,L['Shattered Sun Offensive'],1077}},title=L['Erratic Behavior'],cat2text=L['Isle of Quel\'Danas'],cat1=0,repeatable=true,snid=24965,id=11524},{cat2=4080,cat1text=L['Eastern Kingdoms'],daily=1,enid=24965,level=70,reqlevel=70,side=3,id=11525,rep={{150,L['Shattered Sun Offensive'],1077}},cat2text=L['Isle of Quel\'Danas'],title=L['Further Conversions'],cat1=0,money=91000,repeatable=true,snid=24965,xp=9500},{cat2=4080,cat1text=L['Eastern Kingdoms'],daily=1,enid=25057,level=70,reqlevel=70,side=3,money=91000,rep={{150,L['Shattered Sun Offensive'],1077}},title=L['Distraction at the Dead Scar'],cat2text=L['Isle of Quel\'Danas'],cat1=0,repeatable=true,snid=25057,id=11532},{cat2=4080,cat1text=L['Eastern Kingdoms'],daily=1,enid=25057,level=70,reqlevel=70,side=3,id=11533,rep={{150,L['Shattered Sun Offensive'],1077}},cat2text=L['Isle of Quel\'Danas'],title=L['The Air Strikes Must Continue'],cat1=0,money=91000,repeatable=true,snid=25057,xp=9500},{cat2=4080,cat1text=L['Eastern Kingdoms'],daily=1,enid=25046,level=70,reqlevel=70,side=3,id=11535,rep={{250,L['Shattered Sun Offensive'],1077}},cat2text=L['Isle of Quel\'Danas'],title=L['Making Ready'],cat1=0,money=51500,repeatable=true,snid=25046,itemreqs={{34479,3}}},{cat2=4080,cat1text=L['Eastern Kingdoms'],daily=1,enid=25046,level=70,reqlevel=70,side=3,id=11536,rep={{250,L['Shattered Sun Offensive'],1077}},cat2text=L['Isle of Quel\'Danas'],cat1=0,title=L['Don\'t Stop Now....'],itemreqs={{34479,3}},repeatable=true,money=119900,snid=25046,xp=12650},{cat2=4080,cat1text=L['Eastern Kingdoms'],daily=1,enid=25061,level=70,reqlevel=70,side=3,id=11537,rep={{250,L['Shattered Sun Offensive'],1077}},cat2text=L['Isle of Quel\'Danas'],title=L['The Battle Must Go On'],cat1=0,money=101000,repeatable=true,snid=25061,xp=9500},{cat2=4080,cat1text=L['Eastern Kingdoms'],daily=1,enid=25061,level=70,reqlevel=70,side=3,money=101000,rep={{250,L['Shattered Sun Offensive'],1077}},title=L['The Battle for the Sun\'s Reach Armory'],cat2text=L['Isle of Quel\'Danas'],cat1=0,repeatable=true,snid=25061,id=11538},{cat2=4080,cat1text=L['Eastern Kingdoms'],daily=1,enid=25069,level=70,reqlevel=70,side=3,money=51500,rep={{250,L['Shattered Sun Offensive'],1077}},title=L['Taking the Harbor'],cat2text=L['Isle of Quel\'Danas'],cat1=0,repeatable=true,snid=25069,id=11539},{cat2=4080,cat1text=L['Eastern Kingdoms'],daily=1,enid=25069,level=70,reqlevel=70,side=3,id=11540,rep={{250,L['Shattered Sun Offensive'],1077}},cat2text=L['Isle of Quel\'Danas'],title=L['Crush the Dawnblade'],cat1=0,money=119900,repeatable=true,snid=25069,xp=12650},{cat2=4080,cat1text=L['Eastern Kingdoms'],daily=1,enid=25088,level=70,reqlevel=70,side=3,id=11541,rep={{250,L['Shattered Sun Offensive'],1077}},cat2text=L['Isle of Quel\'Danas'],title=L['Disrupt the Greengill Coast'],cat1=0,money=119900,repeatable=true,snid=25088,xp=12650},{cat2=4080,cat1text=L['Eastern Kingdoms'],daily=1,enid=25108,level=70,reqlevel=70,side=3,money=7500,rep={{250,L['Shattered Sun Offensive'],1077}},title=L['Intercept the Reinforcements'],cat2text=L['Isle of Quel\'Danas'],cat1=0,repeatable=true,snid=25108,id=11542},{cat2=4080,cat1text=L['Eastern Kingdoms'],daily=1,enid=25108,level=70,reqlevel=70,side=3,id=11543,rep={{250,L['Shattered Sun Offensive'],1077}},cat2text=L['Isle of Quel\'Danas'],title=L['Keeping the Enemy at Bay'],cat1=0,money=75900,repeatable=true,snid=25108,xp=12650},{cat2=3520,cat1text=L['Outland'],daily=1,enid=25046,level=70,reqlevel=70,side=3,id=11544,cat2text=L['Shadowmoon Valley'],cat1=8,money=182800,title=L['Ata\'mal Armaments'],xp=15800,itemreqs={{34501,5}},rep={{350,L['Shattered Sun Offensive'],1077}},snid=25046,repeatable=true},{cat2=4080,cat2text=L['Isle of Quel\'Danas'],id=11545,cat1text=L['Eastern Kingdoms'],rep={{150,L['Shattered Sun Offensive'],1077}},side=3,cat1=0,daily=1,title=L['A Charitable Donation'],repeatable=true,enid=25112,level=70,snid=25112,reqlevel=70},{cat1text=L['Eastern Kingdoms'],daily=1,enid=24975,level=70,reqlevel=70,side=3,id=11546,rep={{250,L['Shattered Sun Offensive'],1077}},cat2=4080,cat2text=L['Isle of Quel\'Danas'],cat1=0,title=L['Open for Business'],repeatable=true,money=119900,itemreqs={{34502,5}},snid=24975,xp=12650},{cat1text=L['Eastern Kingdoms'],daily=1,enid=25133,level=70,reqlevel=70,side=3,id=11547,rep={{250,L['Shattered Sun Offensive'],1077}},cat2=4080,cat2text=L['Isle of Quel\'Danas'],title=L['Know Your Ley Lines'],cat1=0,money=119900,repeatable=true,snid=25133,xp=12650},{cat2=4080,cat2text=L['Isle of Quel\'Danas'],id=11548,cat1text=L['Eastern Kingdoms'],rep={{150,L['Shattered Sun Offensive'],1077}},side=3,cat1=0,daily=1,title=L['Your Continued Support'],repeatable=true,enid=25112,level=70,snid=25112,reqlevel=70},{cat2=-101,cat2text=L['Fishing'],id=11665,cat1text=L['Professions'],side=3,cat1=5,daily=1,title=L['Crocolisks in the City'],repeatable=true,enid=25580,level=70,snid=25580,reqlevel=70},{cat2=-101,cat2text=L['Fishing'],id=11666,cat1text=L['Professions'],side=3,cat1=5,daily=1,title=L['Bait Bandits'],repeatable=true,enid=25580,level=70,snid=25580,reqlevel=70},{cat2=-101,cat2text=L['Fishing'],id=11667,cat1text=L['Professions'],side=3,cat1=5,daily=1,title=L['The One That Got Away'],repeatable=true,enid=25580,level=70,snid=25580,reqlevel=70},{cat1text=L['Professions'],daily=1,enid=25580,level=70,reqlevel=70,side=3,id=11668,cat2=-101,title=L['Shrimpin\' Ain\'t Easy'],cat2text=L['Fishing'],cat1=5,itemreqs={{34866,10}},snid=25580,repeatable=true},{cat2=-101,cat2text=L['Fishing'],id=11669,cat1text=L['Professions'],side=3,cat1=5,daily=1,title=L['Felblood Fillet'],repeatable=true,enid=25580,level=70,snid=25580,reqlevel=70},{type=81,side=3,money=44000,cat1text=L['Seasonal'],cat2=-369,cat2text=L['Midsummer Fire Festival'],id=11691,daily=1,cat1=9,title=L['Summon Ahune'],repeatable=true,level=70,snid=25697,reqlevel=68},{cat1text=L['Outland'],daily=1,enid=19202,level=70,reqlevel=70,side=3,id=11875,rep={{250,L['Shattered Sun Offensive'],1077}},cat2=3703,cat2text=L['Shattrath City'],cat1=8,title=L['Gaining the Advantage'],repeatable=true,money=163900,itemreqs={{35229,8}},snid=19202,xp=12650},{cat1text=L['Outland'],daily=1,enid=25140,level=70,reqlevel=70,side=3,id=11877,rep={{250,L['Shattered Sun Offensive'],1077}},cat2=3523,cat2text=L['Netherstorm'],title=L['Sunfury Attack Plans'],cat1=8,money=101000,repeatable=true,snid=25140,xp=9500},{cat2=3518,cat1text=L['Outland'],daily=1,enid=19475,level=70,reqlevel=70,side=1,id=11880,rep={{150,L['Shattered Sun Offensive'],1077}},cat2text=L['Nagrand'],title=L['The Multiphase Survey'],cat1=8,money=91000,repeatable=true,snid=19475,xp=9500},{cat2=-369,cat2text=L['Midsummer Fire Festival'],id=11917,cat1text=L['Seasonal'],xp=1750,daily=1,title=L['Striking Back'],money=350,cat1=9,level=22,repeatable=true,reqlevel=22},{cat2=-369,cat2text=L['Midsummer Fire Festival'],id=11921,cat1text=L['Seasonal'],xp=900,daily=1,title=L['More Torch Tossing'],money=15,cat1=9,repeatable=true},{cat2=-369,cat2text=L['Midsummer Fire Festival'],id=11924,cat1text=L['Seasonal'],xp=900,daily=1,title=L['More Torch Catching'],money=44000,cat1=9,repeatable=true},{cat2=-369,cat2text=L['Midsummer Fire Festival'],id=11925,cat1text=L['Seasonal'],xp=10750,daily=1,title=L['More Torch Catching'],money=44000,cat1=9,repeatable=true},{cat2=-369,cat2text=L['Midsummer Fire Festival'],id=11926,cat1text=L['Seasonal'],xp=10400,daily=1,title=L['More Torch Tossing'],money=15,cat1=9,repeatable=true},{cat2=4024,cat1text=L['Northrend'],daily=1,enid=26117,level=71,reqlevel=70,side=3,id=11940,rep={{250,L['The Wyrmrest Accord'],1091}},cat2text=L['Coldarra'],title=L['Drake Hunt'],cat1=10,money=71000,repeatable=true,snid=26117,xp=20100},{cat2=3537,cat1text=L['Northrend'],daily=1,enid=26213,level=72,reqlevel=68,side=3,id=11945,rep={{500,L['The Kalu\'ak'],1073}},cat2text=L['Borean Tundra'],cat1=10,title=L['Preparing for the Worst'],itemreqs={{35711,8}},repeatable=true,money=50000,snid=26213,xp=20300},{cat2=-369,cat2text=L['Midsummer Fire Festival'],id=11947,cat1text=L['Seasonal'],daily=1,title=L['Striking Back'],cat1=9,level=32,money=800,repeatable=true},{cat2=-369,cat2text=L['Midsummer Fire Festival'],id=11948,cat1text=L['Seasonal'],xp=5050,daily=1,title=L['Striking Back'],money=1500,cat1=9,level=43,repeatable=true,reqlevel=42},{cat2=-369,cat2text=L['Midsummer Fire Festival'],id=11952,cat1text=L['Seasonal'],xp=7050,daily=1,title=L['Striking Back'],money=1900,cat1=9,level=51,repeatable=true,reqlevel=49},{cat2=-369,cat2text=L['Midsummer Fire Festival'],id=11953,cat1text=L['Seasonal'],xp=9550,daily=1,title=L['Striking Back'],money=2300,cat1=9,level=60,repeatable=true,reqlevel=56},{cat2=-369,cat2text=L['Midsummer Fire Festival'],id=11954,cat1text=L['Seasonal'],xp=11650,daily=1,title=L['Striking Back'],money=9400,cat1=9,level=67,repeatable=true,reqlevel=64},{cat2=65,cat1text=L['Northrend'],daily=1,enid=26228,level=72,reqlevel=71,side=3,id=11960,rep={{500,L['The Kalu\'ak'],1073}},cat2text=L['Dragonblight'],cat1=10,title=L['Planning for the Future'],itemreqs={{35692,12}},repeatable=true,money=50000,snid=26228,xp=20300},{cat2=394,cat2text=L['Grizzly Hills'],id=12038,cat1text=L['Northrend'],xp=20300,side=3,money=50000,daily=1,title=L['Seared Scourge'],cat1=10,enid=26604,level=72,snid=26604,repeatable=true},{type=81,side=3,id=12062,cat1text=L['Seasonal'],cat2=-370,cat2text=L['Brewfest'],cat1=9,daily=1,title=L['Insult Coren Direbrew'],repeatable=true,enid=23872,level=70,snid=26719,reqlevel=70},{cat2=-1003,cat2text=L['Hallow\'s End'],id=12133,cat1text=L['Seasonal'],xp=900,daily=1,cat1=9,side=1,enid=24519,title=L['Smash the Pumpkin'],snid=24519,repeatable=true},{cat2=-1003,cat2text=L['Hallow\'s End'],money=44000,cat1text=L['Seasonal'],xp=12000,side=1,daily=1,title=L['"Let the Fires Come!"'],id=12135,enid=24519,cat1=9,snid=24519,repeatable=true},{cat2=-1003,cat2text=L['Hallow\'s End'],money=44000,cat1text=L['Seasonal'],xp=11300,side=2,daily=1,title=L['"Let the Fires Come!"'],id=12139,enid=23973,cat1=9,snid=23973,repeatable=true},{cat2=-1003,cat2text=L['Hallow\'s End'],id=12155,cat1text=L['Seasonal'],xp=12000,daily=1,cat1=9,side=2,enid=23973,title=L['Smash the Pumpkin'],snid=23973,repeatable=true},{cat2=394,cat1text=L['Northrend'],daily=1,enid=27120,level=74,reqlevel=73,side=2,id=12170,rep={{250,L['Horde Expedition'],1052}},cat2text=L['Grizzly Hills'],title=L['Blackriver Brawl'],cat1=10,money=56000,repeatable=true,snid=27120,xp=20750},{cat1text=L['Northrend'],daily=1,enid=27371,level=74,reqlevel=73,side=1,money=56000,xp=20750,cat2=394,title=L['Shredder Repair'],cat2text=L['Grizzly Hills'],cat1=10,repeatable=true,snid=27371,id=12244},{cat2=394,cat1text=L['Northrend'],daily=1,enid=27416,level=74,reqlevel=73,side=1,id=12268,xp=20750,cat2text=L['Grizzly Hills'],title=L['Pieces Parts'],cat1=10,money=56000,repeatable=true,snid=27416,itemreqs={{37412,4},{37413,3},{37416,2}}},{cat1text=L['Northrend'],daily=1,enid=27423,level=74,reqlevel=74,side=2,id=12270,rep={{250,L['Warsong Offensive'],1085}},cat2=394,cat2text=L['Grizzly Hills'],title=L['Shred the Alliance'],cat1=10,money=56000,repeatable=true,snid=27423,xp=20750},{cat2=394,cat1text=L['Northrend'],daily=1,enid=27422,level=74,reqlevel=74,side=2,id=12280,rep={{250,L['Warsong Offensive'],1085}},cat2text=L['Grizzly Hills'],cat1=10,title=L['Making Repairs'],itemreqs={{37412,4},{37413,3},{37416,2}},repeatable=true,money=56000,snid=27422,xp=20750},{cat2=394,cat1text=L['Northrend'],daily=1,enid=27451,level=74,reqlevel=74,side=2,id=12284,rep={{250,L['Warsong Offensive'],1085}},cat2text=L['Grizzly Hills'],title=L['Keep \'Em on Their Heels'],cat1=10,money=56000,repeatable=true,snid=27451,xp=20750},{cat2=394,cat1text=L['Northrend'],daily=1,enid=27464,level=74,reqlevel=74,side=2,id=12288,rep={{250,L['Warsong Offensive'],1085}},cat2text=L['Grizzly Hills'],title=L['Overwhelmed!'],cat1=10,money=56000,repeatable=true,snid=27464,xp=20750},{cat2=394,cat1text=L['Northrend'],daily=1,enid=27468,level=74,reqlevel=73,side=1,id=12289,rep={{37,L['Alliance Vanguard'],1037},{250,L['Valiance Expedition'],1050}},cat2text=L['Grizzly Hills'],title=L['Kick \'Em While They\'re Down'],cat1=10,money=56000,repeatable=true,snid=27468,xp=20750},{cat2=394,cat1text=L['Northrend'],daily=1,enid=27484,level=74,reqlevel=73,side=1,id=12296,rep={{37,L['Alliance Vanguard'],1037},{250,L['Valiance Expedition'],1050}},cat2text=L['Grizzly Hills'],title=L['Life or Death'],cat1=10,money=56000,repeatable=true,snid=27484,xp=20750},{cat1text=L['Northrend'],daily=1,enid=27520,level=74,reqlevel=73,type=1,side=1,id=12314,xp=20750,cat2=394,title=L['Down With Captain Zorna!'],cat2text=L['Grizzly Hills'],cat1=10,money=56000,snid=27520,repeatable=true},{cat1text=L['Northrend'],daily=1,enid=27532,level=74,reqlevel=74,type=1,side=2,id=12315,xp=20750,cat2=394,title=L['Crush Captain Brightwater!'],cat2text=L['Grizzly Hills'],cat1=10,money=56000,snid=27532,repeatable=true},{cat1text=L['Northrend'],daily=1,enid=27562,level=74,reqlevel=73,side=1,money=56000,xp=20750,cat2=394,title=L['Keep Them at Bay!'],cat2text=L['Grizzly Hills'],cat1=10,repeatable=true,snid=27562,id=12316},{cat1text=L['Northrend'],daily=1,enid=27563,level=74,reqlevel=74,side=2,money=56000,xp=20750,cat2=394,title=L['Keep Them at Bay'],cat2text=L['Grizzly Hills'],cat1=10,repeatable=true,snid=27563,id=12317},{cat1text=L['Northrend'],daily=1,enid=27602,level=74,reqlevel=73,side=1,money=56000,xp=20750,cat2=394,title=L['Smoke \'Em Out'],cat2text=L['Grizzly Hills'],cat1=10,repeatable=true,snid=27602,id=12323},{cat1text=L['Northrend'],daily=1,enid=27606,level=74,reqlevel=74,side=2,money=56000,xp=20750,cat2=394,title=L['Smoke \'Em Out'],cat2text=L['Grizzly Hills'],cat1=10,repeatable=true,snid=27606,id=12324},{cat2=65,cat1text=L['Northrend'],daily=1,enid=27575,level=74,reqlevel=71,side=3,id=12372,rep={{250,L['The Wyrmrest Accord'],1091}},cat2text=L['Dragonblight'],title=L['Defending Wyrmrest Temple'],cat1=10,money=56000,repeatable=true,snid=27575,xp=20750},{cat2=394,cat2text=L['Grizzly Hills'],money=56000,cat1text=L['Northrend'],side=2,id=12432,daily=1,title=L['Riding the Red Rocket'],cat1=10,enid=27708,level=74,snid=27708,repeatable=true},{cat1text=L['Northrend'],daily=1,enid=27759,level=74,reqlevel=73,side=1,money=56000,xp=20750,cat2=394,title=L['Riding the Red Rocket'],cat2text=L['Grizzly Hills'],cat1=10,repeatable=true,snid=27759,id=12437},{cat1text=L['Northrend'],daily=1,enid=27783,level=74,reqlevel=73,type=41,side=1,id=12444,xp=20750,cat2=394,cat2text=L['Grizzly Hills'],title=L['Blackriver Skirmish'],cat1=10,money=56000,rep={{38,L['Alliance Vanguard'],1037},{250,L['Valiance Expedition'],1050}},snid=27783,repeatable=true},{cat2=66,cat1text=L['Northrend'],daily=1,enid=28039,level=76,reqlevel=75,side=3,id=12501,rep={{250,L['Argent Crusade'],1106}},cat2text=L['Zul\'Drak'],title=L['Troll Patrol'],cat1=10,money=62000,repeatable=true,snid=28039,xp=21150},{cat2=66,cat1text=L['Northrend'],daily=1,enid=28042,level=76,reqlevel=75,side=3,id=12502,rep={{75,L['Argent Crusade'],1106}},cat2text=L['Zul\'Drak'],title=L['Troll Patrol: High Standards'],cat1=10,money=15800,repeatable=true,snid=28042,xp=5300},{cat2=66,cat1text=L['Northrend'],daily=1,enid=28044,level=76,reqlevel=75,side=3,id=12509,rep={{250,L['Argent Crusade'],1106}},cat2text=L['Zul\'Drak'],title=L['Troll Patrol: Intestinal Fortitude'],cat1=10,money=15800,repeatable=true,snid=28044,xp=5300},{cat2=66,cat1text=L['Northrend'],daily=1,enid=28043,level=76,reqlevel=75,side=3,id=12519,rep={{25,L['Argent Crusade'],1106}},cat2text=L['Zul\'Drak'],cat1=10,title=L['Troll Patrol: Whatdya Want, a Medal?'],itemreqs={{38333,7}},repeatable=true,money=15800,snid=28043,xp=5300},{cat2=66,cat1text=L['Northrend'],daily=1,enid=28205,level=76,reqlevel=75,side=3,id=12541,rep={{75,L['Argent Crusade'],1106}},cat2text=L['Zul\'Drak'],title=L['Troll Patrol: The Alchemist\'s Apprentice'],cat1=10,money=15800,repeatable=true,snid=28205,xp=5300},{cat2=66,cat1text=L['Northrend'],daily=1,enid=28039,level=76,reqlevel=75,side=3,id=12563,rep={{250,L['Argent Crusade'],1106}},cat2text=L['Zul\'Drak'],title=L['Troll Patrol'],cat1=10,money=62000,repeatable=true,snid=28039,xp=21150},{cat2=66,cat1text=L['Northrend'],daily=1,enid=28042,level=76,repeatable=true,side=3,id=12564,rep={{75,L['Argent Crusade'],1106}},title=L['Troll Patrol: Something for the Pain'],cat2text=L['Zul\'Drak'],cat1=10,itemreqs={{38552,5}},snid=28042,money=15800},{cat2=66,cat1text=L['Northrend'],daily=1,enid=28044,level=76,repeatable=true,side=3,money=15800,xp=5300,title=L['Troll Patrol: Done to Death'],cat2text=L['Zul\'Drak'],cat1=10,rep={{75,L['Argent Crusade'],1106}},snid=28044,id=12568},{cat2=3711,cat2text=L['Sholazar Basin'],money=33000,cat1text=L['Northrend'],rep={{17214,L['Frenzyheart Tribe'],1104}},side=3,id=12582,daily=1,title=L['Frenzyheart Champion'],cat1=10,enid=28668,level=77,snid=28216,repeatable=true},{cat2=66,cat1text=L['Northrend'],daily=1,enid=28043,level=76,repeatable=true,side=3,id=12585,xp=5300,cat2text=L['Zul\'Drak'],title=L['Troll Patrol: Creature Comforts'],cat1=10,money=15800,rep={{75,L['Argent Crusade'],1106}},snid=28043,itemreqs={{38563,20}}},{cat2=66,cat1text=L['Northrend'],daily=1,enid=28039,level=76,reqlevel=76,side=3,money=62000,rep={{250,L['Argent Crusade'],1106}},title=L['Troll Patrol'],cat2text=L['Zul\'Drak'],cat1=10,repeatable=true,snid=28039,id=12587},{cat2=66,cat2text=L['Zul\'Drak'],money=15800,cat1text=L['Northrend'],rep={{75,L['Argent Crusade'],1106}},side=3,id=12588,daily=1,title=L['Troll Patrol: Can You Dig It?'],cat1=10,enid=28042,level=76,snid=28042,repeatable=true},{cat2=66,cat2text=L['Zul\'Drak'],money=15800,cat1text=L['Northrend'],rep={{75,L['Argent Crusade'],1106}},side=3,id=12591,daily=1,title=L['Troll Patrol: Throwing Down'],cat1=10,enid=28044,level=76,snid=28044,repeatable=true},{cat2=66,cat2text=L['Zul\'Drak'],money=15800,cat1text=L['Northrend'],rep={{75,L['Argent Crusade'],1106}},side=3,id=12594,daily=1,title=L['Troll Patrol: Couldn\'t Care Less'],cat1=10,enid=28043,level=76,snid=28043,repeatable=true},{cat2=66,cat2text=L['Zul\'Drak'],id=12601,cat1text=L['Northrend'],daily=1,title=L['The Alchemist\'s Apprentice'],cat1=10,level=76,money=15800,repeatable=true},{cat2=66,cat2text=L['Zul\'Drak'],id=12602,cat1text=L['Northrend'],daily=1,title=L['The Alchemist\'s Apprentice'],cat1=10,level=76,money=15800,repeatable=true},{cat1text=L['Northrend'],daily=1,enid=28039,level=76,repeatable=true,side=3,money=186000,xp=26450,cat2=66,title=L['Congratulations!'],cat2text=L['Zul\'Drak'],cat1=10,rep={{350,L['Argent Crusade'],1106}},snid=28039,id=12604},{cat2=3711,cat2text=L['Sholazar Basin'],money=33000,cat1text=L['Northrend'],rep={{2450,L['The Oracles'],1105}},side=3,id=12689,daily=1,title=L['Hand of the Oracles'],cat1=10,enid=28121,level=77,snid=28667,repeatable=true},{cat2=3711,cat1text=L['Northrend'],daily=1,enid=28138,level=77,reqlevel=77,side=3,id=12702,rep={{500,L['Frenzyheart Tribe'],1104}},cat2text=L['Sholazar Basin'],cat1=10,title=L['Chicken Party!'],itemreqs={{38483,12}},repeatable=true,money=65000,snid=28138,xp=21400},{cat2=3711,cat2text=L['Sholazar Basin'],money=136000,cat1text=L['Northrend'],rep={{350,L['Frenzyheart Tribe'],1104}},side=1,id=12703,daily=1,title=L['Kartak\'s Rampage'],cat1=10,enid=28106,level=78,snid=29146,repeatable=true},{cat2=3711,cat1text=L['Northrend'],daily=1,enid=28027,level=77,reqlevel=77,side=3,id=12704,rep={{250,L['The Oracles'],1105}},cat2text=L['Sholazar Basin'],cat1=10,title=L['Appeasing the Great Rain Stone'],itemreqs={{38575,6}},repeatable=true,money=65000,snid=28027,xp=21400},{cat2=3711,cat2text=L['Sholazar Basin'],money=136000,cat1text=L['Northrend'],rep={{350,L['The Oracles'],1105}},side=3,id=12705,daily=1,title=L['Will of the Titans'],cat1=10,enid=28107,level=78,snid=29149,repeatable=true},{cat2=3711,cat1text=L['Northrend'],daily=1,enid=29006,level=80,reqlevel=80,side=3,money=74000,rep={{500,L['The Oracles'],1105}},title=L['Song of Wind and Water'],cat2text=L['Sholazar Basin'],cat1=10,repeatable=true,snid=29006,id=12726},{cat2=3711,cat2text=L['Sholazar Basin'],money=74000,cat1text=L['Northrend'],rep={{500,L['Frenzyheart Tribe'],1104}},side=3,id=12732,daily=1,title=L['The Heartblood\'s Strength'],cat1=10,enid=29043,level=80,snid=29043,repeatable=true},{cat2=3711,cat2text=L['Sholazar Basin'],money=74000,cat1text=L['Northrend'],rep={{500,L['Frenzyheart Tribe'],1104}},side=3,id=12734,daily=1,title=L['Rejek: First Blood'],cat1=10,enid=29043,level=80,snid=29043,repeatable=true},{cat2=3711,cat2text=L['Sholazar Basin'],money=74000,cat1text=L['Northrend'],rep={{500,L['The Oracles'],1105}},side=3,id=12735,daily=1,title=L['A Cleansing Song'],cat1=10,enid=29006,level=80,snid=29006,repeatable=true},{cat2=3711,cat2text=L['Sholazar Basin'],money=74000,cat1text=L['Northrend'],rep={{250,L['The Oracles'],1105}},side=3,id=12736,daily=1,title=L['Song of Reflection'],cat1=10,enid=29006,level=80,snid=29006,repeatable=true},{cat2=3711,cat1text=L['Northrend'],daily=1,enid=29006,level=80,reqlevel=80,side=3,money=74000,rep={{250,L['The Oracles'],1105}},title=L['Song of Fecundity'],cat2text=L['Sholazar Basin'],cat1=10,repeatable=true,snid=29006,id=12737},{cat2=3711,cat2text=L['Sholazar Basin'],money=74000,cat1text=L['Northrend'],rep={{250,L['Frenzyheart Tribe'],1104}},side=3,id=12741,daily=1,title=L['Strength of the Tempest'],cat1=10,enid=29043,level=80,snid=29043,repeatable=true},{cat2=3711,cat2text=L['Sholazar Basin'],money=74000,cat1text=L['Northrend'],rep={{500,L['Frenzyheart Tribe'],1104}},side=3,id=12758,daily=1,title=L['A Hero\'s Headgear'],cat1=10,enid=29043,level=80,snid=29043,repeatable=true},{cat2=3711,cat2text=L['Sholazar Basin'],money=136000,cat1text=L['Northrend'],rep={{350,L['Frenzyheart Tribe'],1104}},side=1,id=12759,daily=1,title=L['Tools of War'],cat1=10,enid=28106,level=78,snid=29146,repeatable=true},{cat2=3711,cat2text=L['Sholazar Basin'],money=136000,cat1text=L['Northrend'],rep={{350,L['Frenzyheart Tribe'],1104}},side=1,id=12760,daily=1,title=L['Secret Strength of the Frenzyheart'],cat1=10,enid=28106,level=78,snid=29146,repeatable=true},{cat2=3711,cat2text=L['Sholazar Basin'],money=136000,cat1text=L['Northrend'],rep={{350,L['The Oracles'],1105}},side=3,id=12761,daily=1,title=L['Mastery of the Crystals'],cat1=10,enid=28107,level=78,snid=29149,repeatable=true},{cat2=3711,cat2text=L['Sholazar Basin'],money=136000,cat1text=L['Northrend'],rep={{350,L['The Oracles'],1105}},side=3,id=12762,daily=1,title=L['Power of the Great Ones'],cat1=10,enid=28107,level=78,snid=29149,repeatable=true},{cat2=210,cat1text=L['Northrend'],daily=1,enid=29396,level=80,reqlevel=78,side=3,id=12813,rep={{250,L['Knights of the Ebon Blade'],1098}},cat2text=L['Icecrown'],title=L['From Their Corpses, Rise!'],cat1=10,money=74000,repeatable=true,snid=29396,xp=22050},{cat2=210,cat1text=L['Northrend'],daily=1,enid=29405,level=80,reqlevel=78,side=3,id=12815,rep={{250,L['Knights of the Ebon Blade'],1098}},cat2text=L['Icecrown'],title=L['No Fly Zone'],cat1=10,money=74000,repeatable=true,snid=29405,xp=22050},{cat2=67,cat1text=L['Northrend'],daily=1,enid=29428,level=78,reqlevel=77,side=3,money=68000,xp=21600,title=L['Overstock'],cat2text=L['The Storm Peaks'],cat1=10,repeatable=true,snid=29428,id=12833},{cat2=210,cat1text=L['Northrend'],daily=1,enid=29456,level=80,reqlevel=78,side=3,id=12838,xp=22050,cat2text=L['Icecrown'],title=L['Intelligence Gathering'],cat1=10,money=74000,repeatable=true,snid=29456,itemreqs={{40640,5}}},{cat2=67,cat1text=L['Northrend'],daily=1,enid=29732,level=78,repeatable=true,side=1,money=68000,xp=21600,title=L['Pushed Too Far'],cat2text=L['The Storm Peaks'],cat1=10,rep={{250,L['The Frostborn'],1126}},snid=29732,id=12869},{cat1text=L['Professions'],daily=1,enid=28701,reqlevel=77,side=3,money=65000,rep={{75,L['Kirin Tor'],1090}},cat2=-373,title=L['Shipment: Blood Jade Amulet '],cat2text=L['Jewelcrafting'],cat1=5,id=12958,snid=28701,repeatable=true},{cat1text=L['Professions'],daily=1,enid=28701,reqlevel=77,side=3,money=74000,rep={{75,L['Kirin Tor'],1090}},cat2=-373,title=L['Shipment: Glowing Ivory Figurine'],cat2text=L['Jewelcrafting'],cat1=5,id=12959,snid=28701,repeatable=true},{cat1text=L['Professions'],daily=1,enid=28701,level=77,reqlevel=77,side=3,money=65000,rep={{250,L['Kirin Tor'],1090}},cat2=-373,title=L['Shipment: Wicked Sun Brooch '],cat2text=L['Jewelcrafting'],cat1=5,repeatable=true,snid=28701,id=12960},{cat1text=L['Professions'],daily=1,enid=28701,level=77,repeatable=true,side=3,money=65000,rep={{250,L['Kirin Tor'],1090}},title=L['Shipment: Intricate Bone Figurine'],cat2=-373,cat2text=L['Jewelcrafting'],cat1=5,snid=28701,id=12961},{cat1text=L['Professions'],daily=1,enid=28701,level=77,repeatable=true,side=3,money=65000,xp=20750,cat2=-373,title=L['Shipment: Bright Armor Relic'],cat2text=L['Jewelcrafting'],cat1=5,rep={{75,L['Kirin Tor'],1090}},snid=28701,id=12962},{cat2=-373,cat2text=L['Jewelcrafting'],id=12963,cat1text=L['Professions'],rep={{250,L['Kirin Tor'],1090}},side=3,daily=1,title=L['Shipment: Shifting Sun Curio '],money=53000,enid=28701,cat1=5,snid=28701,repeatable=true},{cat2=67,cat2text=L['The Storm Peaks'],id=12977,cat1text=L['Northrend'],rep={{250,L['The Sons of Hodir'],1119}},side=3,money=74000,daily=1,title=L['Blowing Hodir\'s Horn'],xp=22050,cat1=10,level=80,repeatable=true,reqlevel=78},{cat2=67,cat1text=L['Northrend'],daily=1,level=80,reqlevel=78,side=3,money=74000,xp=22050,cat2text=L['The Storm Peaks'],title=L['Hot and Cold'],cat1=10,itemreqs={{42252,5}},id=12981,rep={{250,L['The Sons of Hodir'],1119}},repeatable=true},{cat2=67,side=3,id=12994,cat1text=L['Northrend'],cat2text=L['The Storm Peaks'],money=74000,cat1=10,daily=1,title=L['Spy Hunter'],repeatable=true,enid=30294,level=80,snid=30294,reqlevel=80},{cat2=210,cat1text=L['Northrend'],daily=1,enid=29343,level=80,reqlevel=77,side=3,id=12995,rep={{250,L['Knights of the Ebon Blade'],1098}},cat2text=L['Icecrown'],title=L['Leave Our Mark'],cat1=10,money=74000,repeatable=true,snid=29343,xp=22050},{cat2=67,cat2text=L['The Storm Peaks'],id=13003,cat1text=L['Northrend'],rep={{350,L['The Sons of Hodir'],1119}},side=3,daily=1,title=L['Thrusting Hodir\'s Spear'],money=148000,cat1=10,level=80,repeatable=true,reqlevel=80},{cat2=67,cat1text=L['Northrend'],daily=1,level=80,reqlevel=78,side=3,money=74000,xp=22050,cat2text=L['The Storm Peaks'],title=L['Polishing the Helm'],cat1=10,itemreqs={{42640,5}},id=13006,rep={{250,L['The Sons of Hodir'],1119}},repeatable=true},{cat2=67,cat2text=L['The Storm Peaks'],id=13046,cat1text=L['Northrend'],rep={{250,L['The Sons of Hodir'],1119}},side=3,daily=1,title=L['Feeding Arngrim'],money=74000,cat1=10,level=80,repeatable=true,reqlevel=80},{cat2=210,cat1text=L['Northrend'],daily=1,enid=30074,level=80,reqlevel=78,side=3,id=13069,rep={{250,L['Knights of the Ebon Blade'],1098}},cat2text=L['Icecrown'],title=L['Shoot \'Em Up'],cat1=10,money=74000,repeatable=true,snid=30074,xp=22050},{cat2=210,cat1text=L['Northrend'],daily=1,enid=30216,level=80,reqlevel=78,side=3,id=13071,rep={{250,L['Knights of the Ebon Blade'],1098}},cat2text=L['Icecrown'],title=L['Vile Like Fire!'],cat1=10,money=37000,repeatable=true,snid=30216,xp=22050},{cat1text=L['Professions'],daily=1,enid=29527,reqlevel=70,side=1,money=137300,xp=15550,cat2=-304,cat2text=L['Cooking'],title=L['Infused Mushroom Meatloaf'],cat1=5,rep={{150,L['Kirin Tor'],1090}},id=13100,snid=28705,repeatable=true},{cat1text=L['Professions'],daily=1,enid=29049,itemreqs={{34747,12}},reqlevel=70,side=1,id=13101,xp=15550,cat2=-304,cat2text=L['Cooking'],title=L['Convention at the Legerdemain'],cat1=5,money=140200,rep={{150,L['Kirin Tor'],1090}},snid=28705,repeatable=true},{cat1text=L['Professions'],daily=1,enid=29532,reqlevel=70,side=1,money=137300,xp=15550,cat2=-304,cat2text=L['Cooking'],title=L['Sewer Stew'],cat1=5,rep={{150,L['Kirin Tor'],1090}},id=13102,snid=28705,repeatable=true},{cat1text=L['Professions'],daily=1,enid=28718,reqlevel=70,side=1,money=137300,xp=15550,cat2=-304,cat2text=L['Cooking'],title=L['Cheese for Glowergold'],cat1=5,rep={{150,L['Kirin Tor'],1090}},id=13103,snid=28705,repeatable=true},{cat1text=L['Professions'],daily=1,enid=28160,reqlevel=70,side=1,money=133400,xp=15550,cat2=-304,cat2text=L['Cooking'],title=L['Mustard Dogs!'],cat1=5,rep={{150,L['Kirin Tor'],1090}},id=13107,snid=28705,repeatable=true},{cat1text=L['Professions'],daily=1,enid=29527,reqlevel=72,side=2,money=44000,xp=15550,cat2=-304,cat2text=L['Cooking'],title=L['Infused Mushroom Meatloaf'],cat1=5,rep={{150,L['Kirin Tor'],1090}},id=13112,snid=29631,repeatable=true},{cat1text=L['Professions'],daily=1,enid=29049,itemreqs={{34747,12}},reqlevel=70,side=2,id=13113,xp=15550,cat2=-304,cat2text=L['Cooking'],title=L['Convention at the Legerdemain'],cat1=5,money=137300,rep={{150,L['Kirin Tor'],1090}},snid=29631,repeatable=true},{cat1text=L['Professions'],daily=1,enid=29532,reqlevel=77,side=2,money=44000,xp=15550,cat2=-304,cat2text=L['Cooking'],title=L['Sewer Stew'],cat1=5,rep={{150,L['Kirin Tor'],1090}},id=13114,snid=29631,repeatable=true},{cat1text=L['Professions'],daily=1,enid=28718,reqlevel=71,side=2,money=39000,xp=15550,cat2=-304,cat2text=L['Cooking'],title=L['Cheese for Glowergold'],cat1=5,rep={{150,L['Kirin Tor'],1090}},id=13115,snid=29631,repeatable=true},{cat1text=L['Professions'],daily=1,enid=28160,reqlevel=72,side=2,money=51000,xp=15550,cat2=-304,cat2text=L['Cooking'],title=L['Mustard Dogs!'],cat1=5,rep={{150,L['Kirin Tor'],1090}},id=13116,snid=29631,repeatable=true},{cat1text=L['Northrend'],daily=1,level=80,repeatable=true,type=41,side=1,id=13153,cat2=4197,title=L['Warding the Warriors'],cat2text=L['Wintergrasp'],cat1=10,money=74000,snid=31051,itemreqs={{44808,10}}},{cat1text=L['Northrend'],daily=1,level=80,repeatable=true,type=41,side=1,id=13154,cat2=4197,title=L['Bones and Arrows'],cat2text=L['Wintergrasp'],cat1=10,money=74000,snid=31052,itemreqs={{43323,10}}},{cat1text=L['Northrend'],daily=1,level=80,repeatable=true,type=41,side=1,id=13156,cat2=4197,title=L['A Rare Herb'],cat2text=L['Wintergrasp'],cat1=10,money=74000,snid=31054,itemreqs={{44809,10}}},{cat1text=L['Northrend'],daily=1,enid=31036,level=80,reqlevel=80,type=41,side=1,money=74000,cat2=4197,title=L['No Mercy for the Merciless'],cat2text=L['Wintergrasp'],cat1=10,id=13177,snid=31036,repeatable=true},{cat1text=L['Northrend'],daily=1,enid=31091,level=80,reqlevel=80,type=41,side=2,money=74000,cat2=4197,title=L['Slay them all!'],cat2text=L['Wintergrasp'],cat1=10,id=13178,snid=31091,repeatable=true},{cat1text=L['Northrend'],daily=1,enid=31036,level=80,reqlevel=80,type=41,side=1,money=74000,cat2=4197,title=L['No Mercy for the Merciless'],cat2text=L['Wintergrasp'],cat1=10,id=13179,snid=31036,repeatable=true},{cat1text=L['Northrend'],daily=1,enid=31091,level=80,reqlevel=80,type=41,side=2,money=74000,cat2=4197,title=L['Slay them all!'],cat2text=L['Wintergrasp'],cat1=10,id=13180,snid=31091,repeatable=true},{cat1text=L['Northrend'],daily=1,enid=15351,level=80,reqlevel=80,type=41,side=1,money=74000,cat2=4197,title=L['Victory in Wintergrasp'],cat2text=L['Wintergrasp'],cat1=10,id=13181,snid=31153,repeatable=true},{cat1text=L['Northrend'],daily=1,enid=31151,level=80,reqlevel=80,type=41,side=2,money=74000,cat2=4197,title=L['Victory in Wintergrasp'],cat2text=L['Wintergrasp'],cat1=10,id=13183,snid=31151,repeatable=true},{cat1text=L['Northrend'],daily=1,enid=31107,level=80,reqlevel=80,type=41,side=2,money=74000,cat2=4197,title=L['Stop the Siege'],cat2text=L['Wintergrasp'],cat1=10,id=13185,snid=31107,repeatable=true},{cat1text=L['Northrend'],daily=1,enid=31036,level=80,reqlevel=80,type=41,side=1,money=74000,cat2=4197,title=L['Stop the Siege'],cat2text=L['Wintergrasp'],cat1=10,id=13186,snid=31109,repeatable=true},{cat2=85,cat1text=L['Dungeons'],daily=1,enid=26653,level=80,reqlevel=80,type=85,side=3,money=222000,title=L['All Things in Good Time'],cat2text=L['Heroic'],cat1=2,id=13190,snid=26653,repeatable=true},{cat1text=L['Northrend'],daily=1,enid=31091,level=80,reqlevel=80,type=41,side=2,id=13191,cat2=4197,cat2text=L['Wintergrasp'],title=L['Fueling the Demolishers'],cat1=10,money=74000,itemreqs={{43314,10}},snid=31106,repeatable=true},{cat1text=L['Northrend'],daily=1,level=80,repeatable=true,type=41,side=2,id=13192,cat2=4197,title=L['Warding the Walls'],cat2text=L['Wintergrasp'],cat1=10,money=74000,snid=31101,itemreqs={{43322,10}}},{cat1text=L['Northrend'],daily=1,enid=31102,level=80,reqlevel=80,type=41,side=2,id=13193,cat2=4197,cat2text=L['Wintergrasp'],title=L['Bones and Arrows'],cat1=10,money=74000,itemreqs={{43323,10}},snid=31102,repeatable=true},{cat1text=L['Northrend'],daily=1,level=80,repeatable=true,type=41,side=2,id=13194,cat2=4197,title=L['Healing with Roses'],cat2text=L['Wintergrasp'],cat1=10,money=74000,snid=31053,itemreqs={{43324,10}}},{cat1text=L['Northrend'],daily=1,level=80,repeatable=true,type=41,side=1,id=13195,cat2=4197,title=L['A Rare Herb'],cat2text=L['Wintergrasp'],cat1=10,money=74000,snid=31054,itemreqs={{44809,10}}},{cat1text=L['Northrend'],daily=1,enid=31052,level=80,repeatable=true,type=41,side=1,money=74000,cat2=4197,title=L['Bones and Arrows'],cat2text=L['Wintergrasp'],cat1=10,id=13196,snid=31052,itemreqs={{43323,10}}},{cat1text=L['Northrend'],daily=1,level=80,repeatable=true,type=41,side=1,id=13197,cat2=4197,title=L['Fueling the Demolishers'],cat2text=L['Wintergrasp'],cat1=10,money=74000,snid=31108,itemreqs={{43314,10}}},{cat1text=L['Northrend'],daily=1,level=80,repeatable=true,type=41,side=1,id=13198,cat2=4197,title=L['Warding the Warriors'],cat2text=L['Wintergrasp'],cat1=10,money=74000,snid=31051,itemreqs={{44808,10}}},{cat1text=L['Northrend'],daily=1,level=80,repeatable=true,type=41,side=2,id=13199,cat2=4197,title=L['Bones and Arrows'],cat2text=L['Wintergrasp'],cat1=10,money=74000,snid=31102,itemreqs={{43323,10}}},{cat1text=L['Northrend'],daily=1,level=80,repeatable=true,type=41,side=2,id=13200,cat2=4197,title=L['Fueling the Demolishers'],cat2text=L['Wintergrasp'],cat1=10,money=74000,snid=31106,itemreqs={{43314,10}}},{cat1text=L['Northrend'],daily=1,level=80,repeatable=true,type=41,side=2,id=13201,cat2=4197,title=L['Healing with Roses'],cat2text=L['Wintergrasp'],cat1=10,money=74000,snid=31053,itemreqs={{43324,10}}},{cat1text=L['Northrend'],daily=1,level=80,repeatable=true,type=41,side=2,id=13202,cat2=4197,title=L['Jinxing the Walls'],cat2text=L['Wintergrasp'],cat1=10,money=74000,snid=31101,itemreqs={{43322,10}}},{cat1text=L['Northrend'],daily=1,enid=31108,level=80,reqlevel=80,type=41,side=1,money=74000,cat2=4197,title=L['Defend the Siege'],cat2text=L['Wintergrasp'],cat1=10,id=13222,snid=31108,repeatable=true},{cat1text=L['Northrend'],daily=1,enid=31107,level=80,repeatable=true,type=41,side=2,money=74000,title=L['Defend the Siege'],cat2=4197,cat2text=L['Wintergrasp'],cat1=10,snid=31107,id=13223},{type=41,side=1,money=74000,cat1text=L['Northrend'],cat2=210,cat2text=L['Icecrown'],id=13233,daily=1,cat1=10,title=L['No Mercy!'],repeatable=true,level=80,snid=30344,reqlevel=79},{cat2=210,cat1text=L['Northrend'],daily=1,enid=30824,level=80,reqlevel=78,type=41,side=2,money=74000,title=L['Make Them Pay!'],cat2text=L['Icecrown'],cat1=10,id=13234,snid=30824,repeatable=true},{cat2=81,cat1text=L['Dungeons'],daily=1,enid=31439,level=80,reqlevel=80,type=81,side=3,id=13240,rep={{75,L['Kirin Tor'],1090}},cat2text=L['Dungeon'],title=L['Timear Foresees Centrifuge Constructs in your Future!'],cat1=2,money=148000,repeatable=true,snid=31439},{cat2=81,cat1text=L['Dungeons'],daily=1,enid=31439,level=80,reqlevel=80,type=81,side=3,id=13241,rep={{75,L['Kirin Tor'],1090}},cat2text=L['Dungeon'],title=L['Timear Foresees Ymirjar Berserkers in your Future!'],cat1=2,money=148000,repeatable=true,snid=31439},{cat2=81,cat1text=L['Dungeons'],daily=1,enid=31439,level=80,reqlevel=78,type=81,side=3,id=13243,rep={{75,L['Kirin Tor'],1090}},cat2text=L['Dungeon'],title=L['Timear Foresees Infinite Agents in your Future!'],cat1=2,money=148000,repeatable=true,snid=31439},{cat2=81,cat1text=L['Dungeons'],daily=1,enid=31439,level=80,reqlevel=78,type=81,side=3,id=13244,rep={{75,L['Kirin Tor'],1090}},cat2text=L['Dungeon'],title=L['Timear Foresees Titanium Vanguards in your Future!'],cat1=2,money=148000,repeatable=true,snid=31439},{cat1text=L['Dungeons'],daily=1,enid=20735,level=80,reqlevel=80,type=85,side=3,id=13245,rep={{75,L['Kirin Tor'],1090}},cat2=85,title=L['Proof of Demise: Ingvar the Plunderer'],cat2text=L['Heroic'],cat1=2,money=222000,snid=20735,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=20735,level=80,reqlevel=80,type=85,side=3,money=222000,cat2=85,title=L['Proof of Demise: Keristrasza'],cat2text=L['Heroic'],cat1=2,id=13246,snid=20735,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=20735,level=80,reqlevel=80,type=85,side=3,money=222000,cat2=85,title=L['Proof of Demise: Ley-Guardian Eregos'],cat2text=L['Heroic'],cat1=2,id=13247,snid=20735,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=20735,level=80,reqlevel=80,type=85,side=3,money=222000,cat2=85,title=L['Proof of Demise: King Ymiron'],cat2text=L['Heroic'],cat1=2,id=13248,snid=20735,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=20735,level=80,reqlevel=80,type=85,side=3,money=222000,cat2=85,title=L['Proof of Demise: The Prophet Tharon\'ja'],cat2text=L['Heroic'],cat1=2,id=13249,snid=20735,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=20735,level=80,reqlevel=80,type=85,side=3,money=222000,cat2=85,title=L['Proof of Demise: Gal\'darah'],cat2text=L['Heroic'],cat1=2,id=13250,snid=20735,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=20735,level=80,reqlevel=80,type=85,side=3,money=222000,cat2=85,title=L['Proof of Demise: Mal\'Ganis'],cat2text=L['Heroic'],cat1=2,id=13251,snid=20735,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=20735,level=80,reqlevel=80,type=85,side=3,money=222000,cat2=85,title=L['Proof of Demise: Sjonnir The Ironshaper'],cat2text=L['Heroic'],cat1=2,id=13252,snid=20735,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=20735,level=80,reqlevel=80,type=85,side=3,money=222000,cat2=85,title=L['Proof of Demise: Loken'],cat2text=L['Heroic'],cat1=2,id=13253,snid=20735,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=20735,level=80,reqlevel=80,type=85,side=3,money=222000,cat2=85,title=L['Proof of Demise: Anub\'arak'],cat2text=L['Heroic'],cat1=2,id=13254,snid=20735,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=20735,level=80,reqlevel=80,type=85,side=3,money=222000,cat2=85,title=L['Proof of Demise: Herald Volazj'],cat2text=L['Heroic'],cat1=2,id=13255,snid=20735,repeatable=true},{cat1text=L['Dungeons'],daily=1,enid=20735,level=80,reqlevel=80,type=85,side=3,money=222000,cat2=85,title=L['Proof of Demise: Cyanigosa'],cat2text=L['Heroic'],cat1=2,id=13256,snid=20735,repeatable=true},{cat2=210,cat1text=L['Northrend'],daily=1,enid=30825,level=80,reqlevel=79,side=2,money=74000,xp=22050,title=L['Volatility'],cat2text=L['Icecrown'],cat1=10,repeatable=true,snid=30825,id=13261},{cat2=210,side=2,id=13276,cat1text=L['Northrend'],cat2text=L['Icecrown'],money=74000,cat1=10,daily=1,title=L['That\'s Abominable!'],repeatable=true,enid=29795,level=80,snid=29795,reqlevel=79},{cat2=210,cat1text=L['Northrend'],daily=1,enid=31776,level=80,reqlevel=78,type=41,side=1,id=13280,rep={{250,L['Valiance Expedition'],1050}},cat2text=L['Icecrown'],title=L['King of the Mountain'],cat1=10,money=74000,repeatable=true,snid=31776,xp=22050},{type=1,cat2text=L['Icecrown'],money=222000,cat1text=L['Northrend'],cat2=210,side=2,daily=1,title=L['Neutralizing the Plague'],id=13281,cat1=10,level=80,snid=29795,repeatable=true},{cat2=210,cat1text=L['Northrend'],daily=1,enid=31781,level=80,reqlevel=78,type=41,side=2,id=13283,rep={{250,L['Warsong Offensive'],1085}},cat2text=L['Icecrown'],title=L['King of the Mountain'],cat1=10,money=74000,repeatable=true,snid=31781,xp=22050},{cat2=210,cat1text=L['Northrend'],daily=1,enid=31808,level=80,reqlevel=79,side=1,id=13284,rep={{250,L['Valiance Expedition'],1050}},cat2text=L['Icecrown'],title=L['Assault by Ground'],cat1=10,money=74000,repeatable=true,snid=31737,xp=22050},{cat2=210,side=1,id=13289,cat1text=L['Northrend'],cat2text=L['Icecrown'],money=74000,cat1=10,daily=1,title=L['That\'s Abominable!'],repeatable=true,enid=29799,level=80,snid=29799,reqlevel=79},{cat2=210,cat1text=L['Northrend'],daily=1,enid=30345,level=80,reqlevel=78,side=1,money=74000,xp=22050,title=L['The Solution Solution'],cat2text=L['Icecrown'],cat1=10,repeatable=true,snid=30345,id=13292},{type=1,side=1,id=13297,cat1text=L['Northrend'],cat2=210,cat2text=L['Icecrown'],money=222000,daily=1,cat1=10,title=L['Neutralizing the Plague'],enid=29799,level=80,snid=29799,repeatable=true},{cat2=210,cat1text=L['Northrend'],daily=1,enid=31259,level=80,reqlevel=77,side=1,id=13300,rep={{250,L['Argent Crusade'],1106}},cat2text=L['Icecrown'],title=L['Slaves to Saronite'],cat1=10,money=74000,repeatable=true,snid=31259,xp=22050},{cat2=210,cat1text=L['Northrend'],daily=1,enid=31834,level=80,reqlevel=78,side=2,id=13301,rep={{250,L['Warsong Offensive'],1085}},cat2text=L['Icecrown'],title=L['Assault by Ground'],cat1=10,money=74000,repeatable=true,snid=31833,xp=22050},{cat2=210,cat1text=L['Northrend'],daily=1,enid=31261,level=80,reqlevel=78,side=2,id=13302,rep={{250,L['Argent Crusade'],1106}},cat2text=L['Icecrown'],title=L['Slaves to Saronite'],cat1=10,money=74000,repeatable=true,snid=31261,xp=22050},{cat2=210,cat1text=L['Northrend'],daily=1,enid=31808,level=80,reqlevel=78,side=1,id=13309,rep={{250,L['Valiance Expedition'],1050}},cat2text=L['Icecrown'],title=L['Assault by Air'],cat1=10,money=74000,repeatable=true,snid=31808,xp=22050},{cat2=210,cat1text=L['Northrend'],daily=1,enid=31834,level=80,reqlevel=78,side=2,id=13310,rep={{250,L['Warsong Offensive'],1085}},cat2text=L['Icecrown'],title=L['Assault by Air'],cat1=10,money=74000,repeatable=true,snid=31834,xp=22050},{cat2=210,cat2text=L['Icecrown'],id=13322,cat1text=L['Northrend'],side=1,money=74000,daily=1,title=L['Retest Now'],cat1=10,enid=30345,level=80,snid=30345,repeatable=true},{cat2=210,side=1,id=13323,cat1text=L['Northrend'],cat2text=L['Icecrown'],money=74000,cat1=10,daily=1,title=L['Drag and Drop'],repeatable=true,enid=29799,level=80,snid=29799,reqlevel=80},{cat2=210,cat1text=L['Northrend'],daily=1,enid=32301,level=80,reqlevel=77,side=2,id=13330,rep={{250,L['Warsong Offensive'],1085}},cat2text=L['Icecrown'],title=L['Blood of the Chosen'],cat1=10,money=74000,repeatable=true,snid=32301,xp=22050},{cat2=210,cat2text=L['Icecrown'],id=13331,cat1text=L['Northrend'],side=2,money=74000,daily=1,title=L['Keeping the Alliance Blind'],cat1=10,enid=30824,level=80,snid=30824,repeatable=true},{cat2=210,side=1,money=74000,cat1text=L['Northrend'],cat2text=L['Icecrown'],id=13333,cat1=10,daily=1,title=L['Capture More Dispatches'],itemreqs={{44220,6}},enid=30344,level=80,snid=30344,repeatable=true},{cat2=210,cat1text=L['Northrend'],daily=1,enid=32302,level=80,reqlevel=77,side=1,id=13336,rep={{250,L['Valiance Expedition'],1050}},cat2text=L['Icecrown'],title=L['Blood of the Chosen'],cat1=10,money=74000,repeatable=true,snid=32302,xp=22050},{cat2=210,side=1,id=13344,cat1text=L['Northrend'],cat2text=L['Icecrown'],money=74000,cat1=10,daily=1,title=L['Not a Bug'],repeatable=true,enid=29799,level=80,snid=29799,reqlevel=80},{type=1,side=1,id=13350,cat1text=L['Northrend'],cat2=210,cat2text=L['Icecrown'],money=222000,daily=1,cat1=10,title=L['No Rest For The Wicked'],enid=29799,level=80,snid=29799,repeatable=true},{cat2=210,side=2,id=13353,cat1text=L['Northrend'],cat2text=L['Icecrown'],money=74000,cat1=10,daily=1,title=L['Drag and Drop'],repeatable=true,enid=29795,level=80,snid=29795,reqlevel=80},{cat2=210,cat2text=L['Icecrown'],id=13357,cat1text=L['Northrend'],side=2,money=74000,daily=1,title=L['Retest Now'],cat1=10,enid=30825,level=80,snid=30825,repeatable=true},{cat2=210,side=2,id=13365,cat1text=L['Northrend'],cat2text=L['Icecrown'],money=74000,cat1=10,daily=1,title=L['Not a Bug'],repeatable=true,enid=29795,level=80,snid=29795,reqlevel=80},{type=1,side=2,id=13368,cat1text=L['Northrend'],cat2=210,cat2text=L['Icecrown'],money=222000,daily=1,cat1=10,title=L['No Rest For The Wicked'],enid=29795,level=80,snid=29795,repeatable=true},{cat2=210,side=2,id=13376,cat1text=L['Northrend'],cat2text=L['Icecrown'],money=74000,cat1=10,daily=1,title=L['Total Ohmage: The Valley of Lost Hope!'],repeatable=true,enid=32430,level=80,snid=32430,reqlevel=79},{cat2=210,cat1text=L['Northrend'],daily=1,enid=32444,level=80,reqlevel=79,side=1,money=74000,xp=22050,title=L['Putting the Hertz: The Valley of Lost Hope'],cat2text=L['Icecrown'],cat1=10,repeatable=true,snid=32444,id=13382},{cat2=210,cat1text=L['Northrend'],daily=1,enid=32444,level=80,reqlevel=79,side=1,money=74000,xp=22050,title=L['Static Shock Troops: the Bombardment'],cat2text=L['Icecrown'],cat1=10,repeatable=true,snid=32444,id=13404},{cat2=210,cat1text=L['Northrend'],daily=1,enid=32430,level=80,reqlevel=79,side=2,money=74000,xp=22050,title=L['Riding the Wavelength: The Bombardment'],cat2text=L['Icecrown'],cat1=10,repeatable=true,snid=32430,id=13406},{cat2=210,cat1text=L['Northrend'],daily=1,enid=32548,level=80,reqlevel=80,side=3,money=74000,rep={{250,L['The Wyrmrest Accord'],1091}},title=L['Aces High!'],cat2text=L['Icecrown'],cat1=10,repeatable=true,snid=32548,id=13414},{cat1text=L['Northrend'],daily=1,enid=29796,level=79,reqlevel=79,side=3,money=55000,xp=16350,cat2=67,title=L['Maintaining Discipline'],cat2text=L['The Storm Peaks'],cat1=10,repeatable=true,snid=29796,id=13422},{cat1text=L['Northrend'],daily=1,enid=29796,level=80,reqlevel=79,side=3,money=74000,cat2=67,title=L['Defending Your Title'],cat2text=L['The Storm Peaks'],cat1=10,id=13423,snid=29796,repeatable=true},{cat1text=L['Northrend'],daily=1,enid=29796,level=80,reqlevel=80,side=3,money=74000,cat2=67,title=L['Back to the Pit'],cat2text=L['The Storm Peaks'],cat1=10,id=13424,snid=29796,repeatable=true},{cat1text=L['Northrend'],daily=1,enid=29796,level=80,reqlevel=78,side=3,money=74000,xp=22050,cat2=67,title=L['The Aberrations Must Die'],cat2text=L['The Storm Peaks'],cat1=10,repeatable=true,snid=29796,id=13425},{cat2=2597,side=1,id=13427,cat1text=L['Battlegrounds'],xp=12300,type=41,cat2text=L['Alterac Valley'],daily=1,cat1=6,money=44000,enid=15351,title=L['Call to Arms: Alterac Valley'],snid=15351,repeatable=true},{cat2=2597,cat2text=L['Alterac Valley'],id=13428,cat1text=L['Battlegrounds'],type=41,side=2,daily=1,title=L['Call to Arms: Alterac Valley'],money=44000,enid=15350,cat1=6,snid=15350,repeatable=true}}
end
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/embeds.xml New file
0,0 → 1,21
<Ui xmlns="http://www.blizzard.com/wow/ui/">
<Script file="libs\LibStub\LibStub.lua"/>
<Include file="libs\CallbackHandler-1.0\CallbackHandler-1.0.xml"/>
<Include file="libs\AceAddon-3.0\AceAddon-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\AceEvent-3.0\AceEvent-3.0.xml"/>
<Include file="libs\AceTimer-3.0\AceTimer-3.0.xml"/>
<Include file="libs\AceBucket-3.0\AceBucket-3.0.xml"/>
<Include file="libs\AceConsole-3.0\AceConsole-3.0.xml"/>
<Include file="libs\AceHook-3.0\AceHook-3.0.xml"/>
<Include file="libs\AceLocale-3.0\AceLocale-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\LibGratuity-3.0\lib.xml"/>
<Include file="libs\LibAbacus-3.0\lib.xml"/>
 
<Include file="libs\LibDataBroker-1.1\lib.xml"/>
<Include file="libs\LibDBIcon-1.0\lib.xml"/>
</Ui>
EasyDaily-Beta/links.lua New file
0,0 → 1,84
---------------------------------------------------------------------------------
--
-- Copyright (C) 2006-2008 Prat Development Team
--
-- This program is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License
-- as published by the Free Software Foundation; either version 2
-- of the License, or (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to:
--
-- Free Software Foundation, Inc.,
-- 51 Franklin Street, Fifth Floor,
-- Boston, MA 02110-1301, USA.
--
--
-------------------------------------------------------------------------------
 
local _G = _G
local LibStub = LibStub
 
local pairs, ipairs = pairs, ipairs
local tinsert, tremove, tconcat = table.insert, table.remove, table.concat
 
local CustomLinks = LibStub("AceAddon-3.0"):NewAddon("CustomLinks", "AceHook-3.0")
 
function BuildLink(linktype, data, text, color, link_start, link_end)
return "|cff"..(color or "ffffff").."|H"..linktype..":"..data.."|h"..(link_start or "[")..text..(link_end or "]").."|h|r"
end
 
do
 
LinkRegistry = {}
local LinkOwners = {}
 
-- linktype = { linkid, linkfunc, handler }
function RegisterLinkType(linktype, who)
if linktype and linktype.linkid and linktype.linkfunc then
tinsert(LinkRegistry, linktype)
 
local idx = #LinkRegistry
 
if idx then
LinkOwners[idx] = who
end
 
return idx
end
end
 
function UnregisterAllLinkTypes(who)
for k, owner in pairs(LinkOwners) do
if owner == who then
UnregisterLinkType(k)
end
end
end
 
function UnregisterLinkType(idx)
tremove(LinkRegistry, idx)
end
 
function CustomLinks:SetItemRef(link, ...)
for i,reg_link in ipairs(LinkRegistry) do
if reg_link.linkid == link:sub(1, (reg_link.linkid):len()) then
if (reg_link.linkfunc(reg_link.handler, link, ...) == false) then
return false
end
end
end
return self.hooks["SetItemRef"](link, ...)
end
 
CustomLinks:RawHook("SetItemRef", true)
 
end
 
 
EasyDaily-Beta/locales/base/Babelfish.lua New file
0,0 → 1,157
--[[
Babelfish Script (Modified for EasyDaily base locales)
]]
 
-- CONFIG --
 
--[[
Translators may add their name under their maintained locale(s)
]]
 
local translators = {
-- ["enUS"] = {
-- "Example",
-- "Example2",
-- },
["ruRU"] = {
"StingerSoft",
},
}
 
--[[
The name of the AceLocale-3.0 Category, as being used in :NewLocale and :GetLocale
]]
local localeName = "EasyDaily_Base"
 
--[[
Prefix to all files if this script is run from a subdir, for example
]]
local filePrefix = "../../"
 
--[[
List of all files to parse
]]
local files = {
"EasyDaily.lua",
"Options.lua",
}
 
--[[
The Language your addon was originally written in
]]
local baseLocale = "enUS"
 
--[[
The supported Languages
-- DO NOT INCLUDE the base locale here!
]]
local locale = {
"deDE",
"frFR",
"esES",
"esMX",
"zhCN",
"zhTW",
"koKR",
"ruRU",
}
-- CODE --
 
local strings = {}
local varcontent = {}
 
-- extract data from saved variable file
for idx, lang in ipairs(locale) do
local file = io.open(string.format("data_%s.lua", lang), "r")
if file then
varcontent[lang] = assert(loadstring(file:read("*all")))()
end
end
 
-- extract data from specified lua files
for idx,filename in pairs(files) do
local file = io.open(string.format("%s%s", filePrefix or "", filename), "r")
assert(file, "Could not open " .. filename)
local text = file:read("*all")
 
for match in string.gmatch(text, "L%[\"(.-)\"%]") do
strings[match] = true
end
for match in string.gmatch(text, "L%['(.-)'%]") do
strings[match] = true
end
end
 
local work = {}
for k,v in pairs(strings) do
table.insert(work, k)
end
table.sort(work)
 
local AceLocaleHeader = "local L ="
local BabbleFishHeader = "L = {} -- "
 
local function replaceHeader(content)
return content:gsub(AceLocaleHeader, BabbleFishHeader):gsub("\\", "\\\\"):gsub("\\\"", "\\\\\"")
end
 
local localizedStrings = {}
 
table.insert(locale, baseLocale)
-- load existing data from locale files
for idx, lang in ipairs(locale) do
local file = io.open(lang .. ".lua", "r")
if file then
local content = file:read("*all")
content = replaceHeader(content)
assert(loadstring(content))()
localizedStrings[lang] = L
file:close()
end
if not localizedStrings[lang] then
localizedStrings[lang] = {}
end
end
 
for j, k in pairs(varcontent) do
for l, m in pairs(k) do
localizedStrings[j][l] = m
end
end
 
-- Write locale files
for idx, lang in ipairs(locale) do
local file = io.open(lang .. ".lua", "w")
assert(file, "Could not open ".. lang .. ".lua for writing")
file:write("--[[ Generated by Babelfish script.\n\n")
if lang == baseLocale then
file:write(" - This is the base locale. Values can be \"true\" so they default to their key, or any string to override that behaviour.\n\n")
else
file:write(" - Do not add strings manually, only translate existing strings.\n")
file:write(" - Please make sure to save the file as UTF-8, BUT WITHOUT THE UTF-8 BOM HEADER.\n")
file:write(" - If you wish to leave your name for credit, please insert it into in the translator\n")
file:write(" name table (located in Babelscript.lua)\n\n")
end
if translators[lang] then
file:write(string.format(" Translations by: %s\n\n", table.concat(translators[lang], " & ")))
end
if lang == baseLocale then
file:write(string.format("]] local L = LibStub(\"AceLocale-3.0\"):NewLocale(\"%s\", \"%s\", true); if not L then return end\n\n", localeName, lang))
else
file:write(string.format("]] local L = LibStub(\"AceLocale-3.0\"):NewLocale(\"%s\", \"%s\"); if not L then return end\n\n", localeName, lang))
end
local L = localizedStrings[lang]
for idx, match in ipairs(work) do
if type(L[match]) == "string" then
file:write(string.format("L[\"%s\"] = \"%s\"\n", match, L[match]))
else
if lang ~= baseLocale then
local value = type(localizedStrings[baseLocale][match]) == "string" and localizedStrings[baseLocale][match] or "true"
file:write(string.format("-- L[\"%s\"] = %s\n", match, value))
else
file:write(string.format("L[\"%s\"] = true\n", match))
end
end
end
file:close()
end
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/base/esES.lua New file
0,0 → 1,66
--[[ Generated by Babelfish script.
 
- Do not add strings manually, only translate existing strings.
- Please make sure to save the file as UTF-8, BUT WITHOUT THE UTF-8 BOM HEADER.
- If you wish to leave your name for credit, please insert it into in the translator
name table (located in Babelscript.lua)
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Base", "esES"); if not L then return end
 
-- L["%s to open the options menu"] = true
-- L["ALT"] = true
-- L["Always Pause"] = true
-- L["Always pause on the first quest/gossip window."] = true
-- L["Are you sure you want to clear your characters saved reward info?"] = true
-- L["Auto"] = true
-- L["Auto-Select"] = true
-- L["Auto-Select rewards for quests with more than one reward."] = true
-- L["Auto-Select rewards for quests with one or less reward."] = true
-- L["Auto-localize Quest Titles"] = true
-- L["Automatically select quests in the gossip window."] = true
-- L["CTRL"] = true
-- L["Check for quests with unlocalized titles and attempt to scan for them."] = true
-- L["Clear Reward Info"] = true
-- L["Clears your characters saved reward info."] = true
-- L["Click"] = true
-- L["Click to enable/disable this quest."] = true
-- L["Custom"] = true
-- L["Daily"] = true
-- L["Debug"] = true
-- L["Enable/Disable debug mode."] = true
-- L["Enable/Disable the addon."] = true
-- L["Enable/Disable this quest."] = true
-- L["Enabled"] = true
-- L["End"] = true
-- L["General"] = true
-- L["Gold"] = true
-- L["Gossip Quests"] = true
-- L["Here"] = true
-- L["Localization compeleted! Some options will still be disabled until you %s your UI."] = true
-- L["Localize Quest Titles"] = true
-- L["Localizing quests. This may take a while."] = true
-- L["Minimap Icon"] = true
-- L["Multiple Rewards"] = true
-- L["None"] = true
-- L["Note: Disabling these quests will remove them from the options menu."] = true
-- L["Override"] = true
-- L["Quest Level"] = true
-- L["Quests"] = true
-- L["Recomended Level"] = true
-- L["Reload"] = true
-- L["Reputation"] = true
-- L["Required Items"] = true
-- L["SHIFT"] = true
-- L["Selection Modifiers"] = true
-- L["Show an icon on the Minimap that will open the options menu."] = true
-- L["Single Reward"] = true
-- L["Skip PvP Flag Popup"] = true
-- L["Skips the confirmation popup that appears when accepting a daily that flags you for pvp."] = true
-- L["Start"] = true
-- L["Suspend"] = true
-- L["The addon will automatically check for quests with unlocalized titles and attempt to scan for them."] = true
-- L["The current locale is missing %d quest titles. Please click %s to localize them."] = true
-- L["This modifier overrides all settings to turn-in/accept any avaiable quest."] = true
-- L["This modifier temporarily suspends all turn-in/accept activity."] = true
-- L["Translation Not Found!"] = true
-- L["XP"] = true
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/base/frFR.lua New file
0,0 → 1,66
--[[ Generated by Babelfish script.
 
- Do not add strings manually, only translate existing strings.
- Please make sure to save the file as UTF-8, BUT WITHOUT THE UTF-8 BOM HEADER.
- If you wish to leave your name for credit, please insert it into in the translator
name table (located in Babelscript.lua)
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Base", "frFR"); if not L then return end
 
-- L["%s to open the options menu"] = true
-- L["ALT"] = true
-- L["Always Pause"] = true
-- L["Always pause on the first quest/gossip window."] = true
-- L["Are you sure you want to clear your characters saved reward info?"] = true
-- L["Auto"] = true
-- L["Auto-Select"] = true
-- L["Auto-Select rewards for quests with more than one reward."] = true
-- L["Auto-Select rewards for quests with one or less reward."] = true
-- L["Auto-localize Quest Titles"] = true
-- L["Automatically select quests in the gossip window."] = true
-- L["CTRL"] = true
-- L["Check for quests with unlocalized titles and attempt to scan for them."] = true
-- L["Clear Reward Info"] = true
-- L["Clears your characters saved reward info."] = true
-- L["Click"] = true
-- L["Click to enable/disable this quest."] = true
-- L["Custom"] = true
-- L["Daily"] = true
-- L["Debug"] = true
-- L["Enable/Disable debug mode."] = true
-- L["Enable/Disable the addon."] = true
-- L["Enable/Disable this quest."] = true
-- L["Enabled"] = true
-- L["End"] = true
-- L["General"] = true
-- L["Gold"] = true
-- L["Gossip Quests"] = true
-- L["Here"] = true
-- L["Localization compeleted! Some options will still be disabled until you %s your UI."] = true
-- L["Localize Quest Titles"] = true
-- L["Localizing quests. This may take a while."] = true
-- L["Minimap Icon"] = true
-- L["Multiple Rewards"] = true
-- L["None"] = true
-- L["Note: Disabling these quests will remove them from the options menu."] = true
-- L["Override"] = true
-- L["Quest Level"] = true
-- L["Quests"] = true
-- L["Recomended Level"] = true
-- L["Reload"] = true
-- L["Reputation"] = true
-- L["Required Items"] = true
-- L["SHIFT"] = true
-- L["Selection Modifiers"] = true
-- L["Show an icon on the Minimap that will open the options menu."] = true
-- L["Single Reward"] = true
-- L["Skip PvP Flag Popup"] = true
-- L["Skips the confirmation popup that appears when accepting a daily that flags you for pvp."] = true
-- L["Start"] = true
-- L["Suspend"] = true
-- L["The addon will automatically check for quests with unlocalized titles and attempt to scan for them."] = true
-- L["The current locale is missing %d quest titles. Please click %s to localize them."] = true
-- L["This modifier overrides all settings to turn-in/accept any avaiable quest."] = true
-- L["This modifier temporarily suspends all turn-in/accept activity."] = true
-- L["Translation Not Found!"] = true
-- L["XP"] = true
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/base/deDE.lua New file
0,0 → 1,66
--[[ Generated by Babelfish script.
 
- Do not add strings manually, only translate existing strings.
- Please make sure to save the file as UTF-8, BUT WITHOUT THE UTF-8 BOM HEADER.
- If you wish to leave your name for credit, please insert it into in the translator
name table (located in Babelscript.lua)
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Base", "deDE"); if not L then return end
 
-- L["%s to open the options menu"] = true
-- L["ALT"] = true
-- L["Always Pause"] = true
-- L["Always pause on the first quest/gossip window."] = true
-- L["Are you sure you want to clear your characters saved reward info?"] = true
-- L["Auto"] = true
-- L["Auto-Select"] = true
-- L["Auto-Select rewards for quests with more than one reward."] = true
-- L["Auto-Select rewards for quests with one or less reward."] = true
-- L["Auto-localize Quest Titles"] = true
-- L["Automatically select quests in the gossip window."] = true
-- L["CTRL"] = true
-- L["Check for quests with unlocalized titles and attempt to scan for them."] = true
-- L["Clear Reward Info"] = true
-- L["Clears your characters saved reward info."] = true
-- L["Click"] = true
-- L["Click to enable/disable this quest."] = true
-- L["Custom"] = true
-- L["Daily"] = true
-- L["Debug"] = true
-- L["Enable/Disable debug mode."] = true
-- L["Enable/Disable the addon."] = true
-- L["Enable/Disable this quest."] = true
-- L["Enabled"] = true
-- L["End"] = true
-- L["General"] = true
-- L["Gold"] = true
-- L["Gossip Quests"] = true
-- L["Here"] = true
-- L["Localization compeleted! Some options will still be disabled until you %s your UI."] = true
-- L["Localize Quest Titles"] = true
-- L["Localizing quests. This may take a while."] = true
-- L["Minimap Icon"] = true
-- L["Multiple Rewards"] = true
-- L["None"] = true
-- L["Note: Disabling these quests will remove them from the options menu."] = true
-- L["Override"] = true
-- L["Quest Level"] = true
-- L["Quests"] = true
-- L["Recomended Level"] = true
-- L["Reload"] = true
-- L["Reputation"] = true
-- L["Required Items"] = true
-- L["SHIFT"] = true
-- L["Selection Modifiers"] = true
-- L["Show an icon on the Minimap that will open the options menu."] = true
-- L["Single Reward"] = true
-- L["Skip PvP Flag Popup"] = true
-- L["Skips the confirmation popup that appears when accepting a daily that flags you for pvp."] = true
-- L["Start"] = true
-- L["Suspend"] = true
-- L["The addon will automatically check for quests with unlocalized titles and attempt to scan for them."] = true
-- L["The current locale is missing %d quest titles. Please click %s to localize them."] = true
-- L["This modifier overrides all settings to turn-in/accept any avaiable quest."] = true
-- L["This modifier temporarily suspends all turn-in/accept activity."] = true
-- L["Translation Not Found!"] = true
-- L["XP"] = true
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/base/zhCN.lua New file
0,0 → 1,66
--[[ Generated by Babelfish script.
 
- Do not add strings manually, only translate existing strings.
- Please make sure to save the file as UTF-8, BUT WITHOUT THE UTF-8 BOM HEADER.
- If you wish to leave your name for credit, please insert it into in the translator
name table (located in Babelscript.lua)
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Base", "zhCN"); if not L then return end
 
-- L["%s to open the options menu"] = true
-- L["ALT"] = true
-- L["Always Pause"] = true
-- L["Always pause on the first quest/gossip window."] = true
-- L["Are you sure you want to clear your characters saved reward info?"] = true
-- L["Auto"] = true
-- L["Auto-Select"] = true
-- L["Auto-Select rewards for quests with more than one reward."] = true
-- L["Auto-Select rewards for quests with one or less reward."] = true
-- L["Auto-localize Quest Titles"] = true
-- L["Automatically select quests in the gossip window."] = true
-- L["CTRL"] = true
-- L["Check for quests with unlocalized titles and attempt to scan for them."] = true
-- L["Clear Reward Info"] = true
-- L["Clears your characters saved reward info."] = true
-- L["Click"] = true
-- L["Click to enable/disable this quest."] = true
-- L["Custom"] = true
-- L["Daily"] = true
-- L["Debug"] = true
-- L["Enable/Disable debug mode."] = true
-- L["Enable/Disable the addon."] = true
-- L["Enable/Disable this quest."] = true
-- L["Enabled"] = true
-- L["End"] = true
-- L["General"] = true
-- L["Gold"] = true
-- L["Gossip Quests"] = true
-- L["Here"] = true
-- L["Localization compeleted! Some options will still be disabled until you %s your UI."] = true
-- L["Localize Quest Titles"] = true
-- L["Localizing quests. This may take a while."] = true
-- L["Minimap Icon"] = true
-- L["Multiple Rewards"] = true
-- L["None"] = true
-- L["Note: Disabling these quests will remove them from the options menu."] = true
-- L["Override"] = true
-- L["Quest Level"] = true
-- L["Quests"] = true
-- L["Recomended Level"] = true
-- L["Reload"] = true
-- L["Reputation"] = true
-- L["Required Items"] = true
-- L["SHIFT"] = true
-- L["Selection Modifiers"] = true
-- L["Show an icon on the Minimap that will open the options menu."] = true
-- L["Single Reward"] = true
-- L["Skip PvP Flag Popup"] = true
-- L["Skips the confirmation popup that appears when accepting a daily that flags you for pvp."] = true
-- L["Start"] = true
-- L["Suspend"] = true
-- L["The addon will automatically check for quests with unlocalized titles and attempt to scan for them."] = true
-- L["The current locale is missing %d quest titles. Please click %s to localize them."] = true
-- L["This modifier overrides all settings to turn-in/accept any avaiable quest."] = true
-- L["This modifier temporarily suspends all turn-in/accept activity."] = true
-- L["Translation Not Found!"] = true
-- L["XP"] = true
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/base/koKR.lua New file
0,0 → 1,66
--[[ Generated by Babelfish script.
 
- Do not add strings manually, only translate existing strings.
- Please make sure to save the file as UTF-8, BUT WITHOUT THE UTF-8 BOM HEADER.
- If you wish to leave your name for credit, please insert it into in the translator
name table (located in Babelscript.lua)
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Base", "koKR"); if not L then return end
 
-- L["%s to open the options menu"] = true
-- L["ALT"] = true
-- L["Always Pause"] = true
-- L["Always pause on the first quest/gossip window."] = true
-- L["Are you sure you want to clear your characters saved reward info?"] = true
-- L["Auto"] = true
-- L["Auto-Select"] = true
-- L["Auto-Select rewards for quests with more than one reward."] = true
-- L["Auto-Select rewards for quests with one or less reward."] = true
-- L["Auto-localize Quest Titles"] = true
-- L["Automatically select quests in the gossip window."] = true
-- L["CTRL"] = true
-- L["Check for quests with unlocalized titles and attempt to scan for them."] = true
-- L["Clear Reward Info"] = true
-- L["Clears your characters saved reward info."] = true
-- L["Click"] = true
-- L["Click to enable/disable this quest."] = true
-- L["Custom"] = true
-- L["Daily"] = true
-- L["Debug"] = true
-- L["Enable/Disable debug mode."] = true
-- L["Enable/Disable the addon."] = true
-- L["Enable/Disable this quest."] = true
-- L["Enabled"] = true
-- L["End"] = true
-- L["General"] = true
-- L["Gold"] = true
-- L["Gossip Quests"] = true
-- L["Here"] = true
-- L["Localization compeleted! Some options will still be disabled until you %s your UI."] = true
-- L["Localize Quest Titles"] = true
-- L["Localizing quests. This may take a while."] = true
-- L["Minimap Icon"] = true
-- L["Multiple Rewards"] = true
-- L["None"] = true
-- L["Note: Disabling these quests will remove them from the options menu."] = true
-- L["Override"] = true
-- L["Quest Level"] = true
-- L["Quests"] = true
-- L["Recomended Level"] = true
-- L["Reload"] = true
-- L["Reputation"] = true
-- L["Required Items"] = true
-- L["SHIFT"] = true
-- L["Selection Modifiers"] = true
-- L["Show an icon on the Minimap that will open the options menu."] = true
-- L["Single Reward"] = true
-- L["Skip PvP Flag Popup"] = true
-- L["Skips the confirmation popup that appears when accepting a daily that flags you for pvp."] = true
-- L["Start"] = true
-- L["Suspend"] = true
-- L["The addon will automatically check for quests with unlocalized titles and attempt to scan for them."] = true
-- L["The current locale is missing %d quest titles. Please click %s to localize them."] = true
-- L["This modifier overrides all settings to turn-in/accept any avaiable quest."] = true
-- L["This modifier temporarily suspends all turn-in/accept activity."] = true
-- L["Translation Not Found!"] = true
-- L["XP"] = true
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/base/enUS.lua New file
0,0 → 1,63
--[[ Generated by Babelfish script.
 
- This is the base locale. Values can be "true" so they default to their key, or any string to override that behaviour.
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Base", "enUS", true); if not L then return end
 
L["%s to open the options menu"] = true
L["ALT"] = true
L["Always Pause"] = true
L["Always pause on the first quest/gossip window."] = true
L["Are you sure you want to clear your characters saved reward info?"] = true
L["Auto"] = true
L["Auto-Select"] = true
L["Auto-Select rewards for quests with more than one reward."] = true
L["Auto-Select rewards for quests with one or less reward."] = true
L["Auto-localize Quest Titles"] = true
L["Automatically select quests in the gossip window."] = true
L["CTRL"] = true
L["Check for quests with unlocalized titles and attempt to scan for them."] = true
L["Clear Reward Info"] = true
L["Clears your characters saved reward info."] = true
L["Click"] = true
L["Click to enable/disable this quest."] = true
L["Custom"] = true
L["Daily"] = true
L["Debug"] = true
L["Enable/Disable debug mode."] = true
L["Enable/Disable the addon."] = true
L["Enable/Disable this quest."] = true
L["Enabled"] = true
L["End"] = true
L["General"] = true
L["Gold"] = true
L["Gossip Quests"] = true
L["Here"] = true
L["Localization compeleted! Some options will still be disabled until you %s your UI."] = true
L["Localize Quest Titles"] = true
L["Localizing quests. This may take a while."] = true
L["Minimap Icon"] = true
L["Multiple Rewards"] = true
L["None"] = true
L["Note: Disabling these quests will remove them from the options menu."] = true
L["Override"] = true
L["Quest Level"] = true
L["Quests"] = true
L["Recomended Level"] = true
L["Reload"] = true
L["Reputation"] = true
L["Required Items"] = true
L["SHIFT"] = true
L["Selection Modifiers"] = true
L["Show an icon on the Minimap that will open the options menu."] = true
L["Single Reward"] = true
L["Skip PvP Flag Popup"] = true
L["Skips the confirmation popup that appears when accepting a daily that flags you for pvp."] = true
L["Start"] = true
L["Suspend"] = true
L["The addon will automatically check for quests with unlocalized titles and attempt to scan for them."] = true
L["The current locale is missing %d quest titles. Please click %s to localize them."] = true
L["This modifier overrides all settings to turn-in/accept any avaiable quest."] = true
L["This modifier temporarily suspends all turn-in/accept activity."] = true
L["Translation Not Found!"] = true
L["XP"] = true
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/base/esMX.lua New file
0,0 → 1,66
--[[ Generated by Babelfish script.
 
- Do not add strings manually, only translate existing strings.
- Please make sure to save the file as UTF-8, BUT WITHOUT THE UTF-8 BOM HEADER.
- If you wish to leave your name for credit, please insert it into in the translator
name table (located in Babelscript.lua)
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Base", "esMX"); if not L then return end
 
-- L["%s to open the options menu"] = true
-- L["ALT"] = true
-- L["Always Pause"] = true
-- L["Always pause on the first quest/gossip window."] = true
-- L["Are you sure you want to clear your characters saved reward info?"] = true
-- L["Auto"] = true
-- L["Auto-Select"] = true
-- L["Auto-Select rewards for quests with more than one reward."] = true
-- L["Auto-Select rewards for quests with one or less reward."] = true
-- L["Auto-localize Quest Titles"] = true
-- L["Automatically select quests in the gossip window."] = true
-- L["CTRL"] = true
-- L["Check for quests with unlocalized titles and attempt to scan for them."] = true
-- L["Clear Reward Info"] = true
-- L["Clears your characters saved reward info."] = true
-- L["Click"] = true
-- L["Click to enable/disable this quest."] = true
-- L["Custom"] = true
-- L["Daily"] = true
-- L["Debug"] = true
-- L["Enable/Disable debug mode."] = true
-- L["Enable/Disable the addon."] = true
-- L["Enable/Disable this quest."] = true
-- L["Enabled"] = true
-- L["End"] = true
-- L["General"] = true
-- L["Gold"] = true
-- L["Gossip Quests"] = true
-- L["Here"] = true
-- L["Localization compeleted! Some options will still be disabled until you %s your UI."] = true
-- L["Localize Quest Titles"] = true
-- L["Localizing quests. This may take a while."] = true
-- L["Minimap Icon"] = true
-- L["Multiple Rewards"] = true
-- L["None"] = true
-- L["Note: Disabling these quests will remove them from the options menu."] = true
-- L["Override"] = true
-- L["Quest Level"] = true
-- L["Quests"] = true
-- L["Recomended Level"] = true
-- L["Reload"] = true
-- L["Reputation"] = true
-- L["Required Items"] = true
-- L["SHIFT"] = true
-- L["Selection Modifiers"] = true
-- L["Show an icon on the Minimap that will open the options menu."] = true
-- L["Single Reward"] = true
-- L["Skip PvP Flag Popup"] = true
-- L["Skips the confirmation popup that appears when accepting a daily that flags you for pvp."] = true
-- L["Start"] = true
-- L["Suspend"] = true
-- L["The addon will automatically check for quests with unlocalized titles and attempt to scan for them."] = true
-- L["The current locale is missing %d quest titles. Please click %s to localize them."] = true
-- L["This modifier overrides all settings to turn-in/accept any avaiable quest."] = true
-- L["This modifier temporarily suspends all turn-in/accept activity."] = true
-- L["Translation Not Found!"] = true
-- L["XP"] = true
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/base/zhTW.lua New file
0,0 → 1,66
--[[ Generated by Babelfish script.
 
- Do not add strings manually, only translate existing strings.
- Please make sure to save the file as UTF-8, BUT WITHOUT THE UTF-8 BOM HEADER.
- If you wish to leave your name for credit, please insert it into in the translator
name table (located in Babelscript.lua)
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Base", "zhTW"); if not L then return end
 
-- L["%s to open the options menu"] = true
-- L["ALT"] = true
-- L["Always Pause"] = true
-- L["Always pause on the first quest/gossip window."] = true
-- L["Are you sure you want to clear your characters saved reward info?"] = true
-- L["Auto"] = true
-- L["Auto-Select"] = true
-- L["Auto-Select rewards for quests with more than one reward."] = true
-- L["Auto-Select rewards for quests with one or less reward."] = true
-- L["Auto-localize Quest Titles"] = true
-- L["Automatically select quests in the gossip window."] = true
-- L["CTRL"] = true
-- L["Check for quests with unlocalized titles and attempt to scan for them."] = true
-- L["Clear Reward Info"] = true
-- L["Clears your characters saved reward info."] = true
-- L["Click"] = true
-- L["Click to enable/disable this quest."] = true
-- L["Custom"] = true
-- L["Daily"] = true
-- L["Debug"] = true
-- L["Enable/Disable debug mode."] = true
-- L["Enable/Disable the addon."] = true
-- L["Enable/Disable this quest."] = true
-- L["Enabled"] = true
-- L["End"] = true
-- L["General"] = true
-- L["Gold"] = true
-- L["Gossip Quests"] = true
-- L["Here"] = true
-- L["Localization compeleted! Some options will still be disabled until you %s your UI."] = true
-- L["Localize Quest Titles"] = true
-- L["Localizing quests. This may take a while."] = true
-- L["Minimap Icon"] = true
-- L["Multiple Rewards"] = true
-- L["None"] = true
-- L["Note: Disabling these quests will remove them from the options menu."] = true
-- L["Override"] = true
-- L["Quest Level"] = true
-- L["Quests"] = true
-- L["Recomended Level"] = true
-- L["Reload"] = true
-- L["Reputation"] = true
-- L["Required Items"] = true
-- L["SHIFT"] = true
-- L["Selection Modifiers"] = true
-- L["Show an icon on the Minimap that will open the options menu."] = true
-- L["Single Reward"] = true
-- L["Skip PvP Flag Popup"] = true
-- L["Skips the confirmation popup that appears when accepting a daily that flags you for pvp."] = true
-- L["Start"] = true
-- L["Suspend"] = true
-- L["The addon will automatically check for quests with unlocalized titles and attempt to scan for them."] = true
-- L["The current locale is missing %d quest titles. Please click %s to localize them."] = true
-- L["This modifier overrides all settings to turn-in/accept any avaiable quest."] = true
-- L["This modifier temporarily suspends all turn-in/accept activity."] = true
-- L["Translation Not Found!"] = true
-- L["XP"] = true
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/base/ruRU.lua New file
0,0 → 1,68
--[[ Generated by Babelfish script.
 
- Do not add strings manually, only translate existing strings.
- Please make sure to save the file as UTF-8, BUT WITHOUT THE UTF-8 BOM HEADER.
- If you wish to leave your name for credit, please insert it into in the translator
name table (located in Babelscript.lua)
 
Translations by: StingerSoft
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Base", "ruRU"); if not L then return end
 
-- L["%s to open the options menu"] = true
-- L["ALT"] = true
L["Always Pause"] = "Всегда приост."
L["Always pause on the first quest/gossip window."] = "Всегда приостанавливать на первом задании/окне беседы."
L["Are you sure you want to clear your characters saved reward info?"] = "Вы действительно хотите очистить информацию по сохранённым наградам?"
L["Auto"] = "Авто"
L["Auto-Select"] = "Авто-Выбор"
L["Auto-Select rewards for quests with more than one reward."] = "Авто-выбор наград за задание, если их больше одной."
L["Auto-Select rewards for quests with one or less reward."] = "Авто-выбор награды за задание, если в задание одна награда."
-- L["Auto-localize Quest Titles"] = true
L["Automatically select quests in the gossip window."] = "Автоматический выбор задания в окне беседы."
-- L["CTRL"] = true
-- L["Check for quests with unlocalized titles and attempt to scan for them."] = true
L["Clear Reward Info"] = "Очистить данные о наградах"
L["Clears your characters saved reward info."] = "Очистить сохранённую информацию о наградах для вашего персонажа."
-- L["Click"] = true
-- L["Click to enable/disable this quest."] = true
L["Custom"] = "Пользовательские"
-- L["Daily"] = true
-- L["Debug"] = true
-- L["Enable/Disable debug mode."] = true
L["Enable/Disable the addon."] = "Вкл/Выкл аддон"
L["Enable/Disable this quest."] = "Вкл/Выкл данное задание"
L["Enabled"] = "Включено"
-- L["End"] = true
L["General"] = "Общее"
-- L["Gold"] = true
L["Gossip Quests"] = "Задание с беседы"
L["Here"] = "тут"
L["Localization compeleted! Some options will still be disabled until you %s your UI."] = "Определение завершено! Некоторые настройки всё еще отключены, %s ваш UI."
-- L["Localize Quest Titles"] = true
L["Localizing quests. This may take a while."] = "Определение заданий. Это займёт некоторое время."
-- L["Minimap Icon"] = true
L["Multiple Rewards"] = "Многочисленные награды"
-- L["None"] = true
-- L["Note: Disabling these quests will remove them from the options menu."] = true
L["Override"] = "Замена"
-- L["Quest Level"] = true
L["Quests"] = "Задания"
-- L["Recomended Level"] = true
L["Reload"] = "перезагрузите"
L["Reputation"] = "Репутация"
-- L["Required Items"] = true
-- L["SHIFT"] = true
L["Selection Modifiers"] = "Модификаторы выбора"
-- L["Show an icon on the Minimap that will open the options menu."] = true
L["Single Reward"] = "Одиночные награды"
-- L["Skip PvP Flag Popup"] = true
-- L["Skips the confirmation popup that appears when accepting a daily that flags you for pvp."] = true
-- L["Start"] = true
L["Suspend"] = "Приостановить"
-- L["The addon will automatically check for quests with unlocalized titles and attempt to scan for them."] = true
L["The current locale is missing %d quest titles. Please click %s to localize them."] = "Текущее определение заглавия задания %d, отсутствует. Пожалуйста нажмите на %s, для его определения."
L["This modifier overrides all settings to turn-in/accept any avaiable quest."] = "Данный модификатор заменил все настройки сдатия/взятия для любого доступного задания."
L["This modifier temporarily suspends all turn-in/accept activity."] = "Данный модификатор временно приостановил процесс сдатия/взятия."
-- L["Translation Not Found!"] = true
-- L["XP"] = true
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/locales.xml New file
0,0 → 1,20
<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="base\enUS.lua"/>
<Script file="base\deDE.lua"/>
<Script file="base\frFR.lua"/>
<Script file="base\koKR.lua"/>
<Script file="base\ruRU.lua"/>
<Script file="base\zhCN.lua"/>
<Script file="base\zhTW.lua"/>
 
<Script file="quest\enUS.lua"/>
<Script file="quest\deDE.lua"/>
<Script file="quest\frFR.lua"/>
<Script file="quest\koKR.lua"/>
<Script file="quest\ruRU.lua"/>
<Script file="quest\zhCN.lua"/>
<Script file="quest\zhTW.lua"/>
 
</Ui>
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/quest/koKR.lua New file
0,0 → 1,407
--[[ (Generated by Babelfish script)
 
ATTENTION: DO NOT MANUALLY ADD/EDIT THESE SCRIPT GENERATED LOCALES
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Quest", "koKR"); if not L then return end
 
L['"Let the Fires Come!"'] = false
L['A Bad Egg'] = false
L['A Charitable Donation'] = false
L['A Cleansing Light'] = false
L['A Cleansing Song'] = false
L['A Fine Egg'] = false
L['A Gallon of Blood'] = false
L['A Hero\'s Headgear'] = false
L['A Rare Herb'] = false
L['A Slow Death'] = false
L['Aces High!'] = false
L['Additional Runecloth'] = false
L['Again With the Zapped Giants'] = false
L['All Things in Good Time'] = false
L['Alliance Vanguard'] = false
L['Alterac Valley'] = false
L['An Extraordinary Egg'] = false
L['An Ordinary Egg'] = false
L['Another Heap of Ethereals'] = false
L['Appeasing the Great Rain Stone'] = false
L['Arathi Basin'] = false
L['Argent Crusade'] = false
L['Arm the Wards!'] = false
L['Assault by Air'] = false
L['Assault by Ground'] = false
L['Ata\'mal Armaments'] = false
L['Back to the Pit'] = false
L['Bait Bandits'] = false
L['Banish More Demons'] = false
L['Bark for Drohn\'s Distillery!'] = false
L['Bark for T\'chali\'s Voodoo Brewery!'] = false
L['Bark for the Barleybrews!'] = false
L['Bark for the Thunderbrews!'] = false
L['Battlegrounds'] = false
L['Beads for Salfa'] = false
L['Blackriver Brawl'] = false
L['Blackriver Skirmish'] = false
L['Blade\'s Edge Mountains'] = false
L['Blast the Gateway'] = false
L['Blood for Blood'] = false
L['Blood of the Chosen'] = false
L['Blowing Hodir\'s Horn'] = false
L['Bomb Them Again!'] = false
L['Bones and Arrows'] = false
L['Booty Bay'] = false
L['Borean Tundra'] = false
L['Break the Blockade'] = false
L['Brewfest'] = false
L['Bring Me A Shrubbery!'] = false
L['Brood of Nozdormu'] = false
L['Call the Headless Horseman'] = false
L['Call to Arms: Alterac Valley'] = false
L['Call to Arms: Arathi Basin'] = false
L['Call to Arms: Eye of the Storm'] = false
L['Call to Arms: Warsong Gulch'] = false
L['Capture More Dispatches'] = false
L['Cenarion Circle'] = false
L['Cenarion Expedition'] = false
L['Cheese for Glowergold'] = false
L['Chen\'s Empty Keg'] = false
L['Chicken Party!'] = false
L['Coldarra'] = false
L['Congratulations!'] = false
L['Convention at the Legerdemain'] = false
L['Cooking'] = false
L['Crocolisks in the City'] = false
L['Crush Captain Brightwater!'] = false
L['Crush the Dawnblade'] = false
L['Crystal Cluster'] = false
L['Darkspear Trolls'] = false
L['Darnassus'] = false
L['Defend the Siege'] = false
L['Defending Wyrmrest Temple'] = false
L['Defending Your Title'] = false
L['Discovering Your Roots'] = false
L['Disrupt the Greengill Coast'] = false
L['Disrupting the Twilight Portal'] = false
L['Distraction at the Dead Scar'] = false
L['Don\'t Stop Now....'] = false
L['Down With Captain Zorna!'] = false
L['Drag and Drop'] = false
L['Dragonblight'] = false
L['Dragons are the Least of Our Problems'] = false
L['Drake Hunt'] = false
L['Dungeon'] = false
L['Dungeons'] = false
L['Eastern Kingdoms'] = false
L['Empty Stables'] = false
L['Encrypted Twilight Texts'] = false
L['Enemies, Old and New'] = false
L['Erratic Behavior'] = false
L['Escape from Skettis'] = false
L['Everlook'] = false
L['Exodar'] = false
L['Explorers\' League'] = false
L['Eye of the Storm'] = false
L['Favor Amongst the Brotherhood, Blood of the Mountain'] = false
L['Favor Amongst the Brotherhood, Core Leather'] = false
L['Favor Amongst the Brotherhood, Dark Iron Ore'] = false
L['Favor Amongst the Brotherhood, Fiery Core'] = false
L['Favor Amongst the Brotherhood, Lava Core'] = false
L['Feathers for Grazle'] = false
L['Feathers for Nafien'] = false
L['Feeding Arngrim'] = false
L['Felblood Fillet'] = false
L['Fertile Spores'] = false
L['Fires Over Skettis'] = false
L['Fishing'] = false
L['Frenzyheart Champion'] = false
L['Frenzyheart Tribe'] = false
L['From Their Corpses, Rise!'] = false
L['Frostsaber Provisions'] = false
L['Frostwolf Clan'] = false
L['Fueling the Demolishers'] = false
L['Further Conversions'] = false
L['Gadgetzan'] = false
L['Gaining Acceptance'] = false
L['Gaining the Advantage'] = false
L['Glowcap Mushrooms'] = false
L['Gnomeregan Exiles'] = false
L['Grizzly Hills'] = false
L['Gurubashi, Vilebranch, and Witherbark Coins'] = false
L['Hallow\'s End'] = false
L['Hand of the Oracles'] = false
L['Healing with Roses'] = false
L['Hellfire Fortifications'] = false
L['Hellfire Peninsula'] = false
L['Heroic'] = false
L['Honor Hold'] = false
L['Horde Expedition'] = false
L['Hot and Cold'] = false
L['Howling Fjord'] = false
L['Icecrown'] = false
L['In Defense of Halaa'] = false
L['Infused Mushroom Meatloaf'] = false
L['Insult Coren Direbrew'] = false
L['Intelligence Gathering'] = false
L['Intercept the Reinforcements'] = false
L['Intercepting the Mana Cells'] = false
L['Ironforge'] = false
L['Isle of Quel\'Danas'] = false
L['Ivus the Forest Lord'] = false
L['Jewelcrafting'] = false
L['Jinxing the Walls'] = false
L['Junkboxes Needed'] = false
L['Kartak\'s Rampage'] = false
L['Keep \'Em on Their Heels'] = false
L['Keep Them at Bay'] = false
L['Keep Them at Bay!'] = false
L['Keepers of Time'] = false
L['Keeping the Alliance Blind'] = false
L['Keeping the Enemy at Bay'] = false
L['Kick \'Em While They\'re Down'] = false
L['King of the Mountain'] = false
L['Kirin Tor'] = false
L['Knights of the Ebon Blade'] = false
L['Know Your Ley Lines'] = false
L['Kurenai'] = false
L['Leave Our Mark'] = false
L['Libram of Focus'] = false
L['Libram of Protection'] = false
L['Libram of Rapidity'] = false
L['Life or Death'] = false
L['Lokholar the Ice Lord'] = false
L['Lower City'] = false
L['Maintaining Discipline'] = false
L['Maintaining the Sunwell Portal'] = false
L['Make Them Pay!'] = false
L['Making Ready'] = false
L['Making Repairs'] = false
L['Manalicious'] = false
L['Mastery of the Crystals'] = false
L['Midsummer Fire Festival'] = false
L['More Armor Scraps'] = false
L['More Booty!'] = false
L['More Crystal Fragments'] = false
L['More Feathers'] = false
L['More Firewing Signets'] = false
L['More Heads Full of Ivory'] = false
L['More Marks of Kil\'jaeden'] = false
L['More Marks of Sargeras'] = false
L['More Obsidian Warbeads'] = false
L['More Sunfury Signets'] = false
L['More Torch Catching'] = false
L['More Torch Tossing'] = false
L['More Warbeads'] = false
L['More Warbeads!'] = false
L['Morrowgrain to Darnassus'] = false
L['Morrowgrain to Feathermoon Stronghold'] = false
L['Morrowgrain to Thunder Bluff'] = false
L['Mustard Dogs!'] = false
L['Nagrand'] = false
L['Natural Enemies'] = false
L['Nethercite Ore'] = false
L['Netherdust Pollen'] = false
L['Nethermine Flayer Hide'] = false
L['Netherstorm'] = false
L['Netherwing'] = false
L['Netherwing Crystals'] = false
L['Neutralizing the Plague'] = false
L['No Fly Zone'] = false
L['No Mercy for the Merciless'] = false
L['No Mercy!'] = false
L['No Rest For The Wicked'] = false
L['Northrend'] = false
L['Not a Bug'] = false
L['Ogri\'la'] = false
L['Open for Business'] = false
L['Orgrimmar'] = false
L['Outland'] = false
L['Overstock'] = false
L['Overwhelmed!'] = false
L['Picking Up The Pieces...'] = false
L['Pieces Parts'] = false
L['Planning for the Future'] = false
L['Plants of Zangarmarsh'] = false
L['Polishing the Helm'] = false
L['Power of the Great Ones'] = false
L['Preparing for War'] = false
L['Preparing for the Worst'] = false
L['Professions'] = false
L['Proof of Demise: Anub\'arak'] = false
L['Proof of Demise: Cyanigosa'] = false
L['Proof of Demise: Gal\'darah'] = false
L['Proof of Demise: Herald Volazj'] = false
L['Proof of Demise: Ingvar the Plunderer'] = false
L['Proof of Demise: Keristrasza'] = false
L['Proof of Demise: King Ymiron'] = false
L['Proof of Demise: Ley-Guardian Eregos'] = false
L['Proof of Demise: Loken'] = false
L['Proof of Demise: Mal\'Ganis'] = false
L['Proof of Demise: Sjonnir The Ironshaper'] = false
L['Proof of Demise: The Prophet Tharon\'ja'] = false
L['Pushed Too Far'] = false
L['Putting the Hertz: The Valley of Lost Hope'] = false
L['Ram Hide Harnesses'] = false
L['Ram Riding Harnesses'] = false
L['Rampaging Giants'] = false
L['Ratchet'] = false
L['Ravenholdt'] = false
L['Rediscovering Your Roots'] = false
L['Refuel for the Zapping'] = false
L['Rejek: First Blood'] = false
L['Restoring Fiery Flux Supplies via Heavy Leather'] = false
L['Restoring Fiery Flux Supplies via Iron'] = false
L['Restoring Fiery Flux Supplies via Kingsblood'] = false
L['Retest Now'] = false
L['Revenge is Tasty'] = false
L['Riding the Red Rocket'] = false
L['Riding the Wavelength: The Bombardment'] = false
L['Sandfury, Skullsplitter, and Bloodscalp Coins'] = false
L['Seared Scourge'] = false
L['Seasonal'] = false
L['Secret Strength of the Frenzyheart'] = false
L['Secrets of the Qiraji'] = false
L['Sewer Stew'] = false
L['Sha\'tari Skyguard'] = false
L['Shadowmoon Valley'] = false
L['Shattered Sun Offensive'] = false
L['Shattrath City'] = false
L['Shen\'dralar'] = false
L['Shipment: Blood Jade Amulet '] = false
L['Shipment: Bright Armor Relic'] = false
L['Shipment: Glowing Ivory Figurine'] = false
L['Shipment: Intricate Bone Figurine'] = false
L['Shipment: Shifting Sun Curio '] = false
L['Shipment: Wicked Sun Brooch '] = false
L['Sholazar Basin'] = false
L['Shoot \'Em Up'] = false
L['Shred the Alliance'] = false
L['Shredder Repair'] = false
L['Shrimpin\' Ain\'t Easy'] = false
L['Silvermoon City'] = false
L['Single Firewing Signet'] = false
L['Single Mark of Kil\'jaeden'] = false
L['Single Mark of Sargeras'] = false
L['Single Sunfury Signet'] = false
L['Skettis'] = false
L['Slaves to Saronite'] = false
L['Slay them all!'] = false
L['Smash the Pumpkin'] = false
L['Smoke \'Em Out'] = false
L['Song of Fecundity'] = false
L['Song of Reflection'] = false
L['Song of Wind and Water'] = false
L['Soup for the Soul'] = false
L['Spirits of Auchindoun'] = false
L['Sporeggar'] = false
L['Spy Hunter'] = false
L['Static Shock Troops: the Bombardment'] = false
L['Steel Gate Patrol'] = false
L['Stop the Fires!'] = false
L['Stop the Siege'] = false
L['Stormpike Guard'] = false
L['Stormwind'] = false
L['Strained Supplies'] = false
L['Strength of the Tempest'] = false
L['Striking Back'] = false
L['Summon Ahune'] = false
L['Sunfury Attack Plans'] = false
L['Super Hot Stew'] = false
L['Syndicate'] = false
L['Syndicate Emblems'] = false
L['Synthesis of Power'] = false
L['Taking the Harbor'] = false
L['Terokkar Forest'] = false
L['That\'s Abominable!'] = false
L['The Aberrations Must Die'] = false
L['The Air Strikes Must Continue'] = false
L['The Alchemist\'s Apprentice'] = false
L['The Aldor'] = false
L['The Battle Must Go On'] = false
L['The Battle for the Sun\'s Reach Armory'] = false
L['The Booterang: A Cure For The Common Worthless Peon'] = false
L['The Consortium'] = false
L['The Deadliest Trap Ever Laid'] = false
L['The Frostborn'] = false
L['The Heartblood\'s Strength'] = false
L['The Kalu\'ak'] = false
L['The Lost Supplies'] = false
L['The Mag\'har'] = false
L['The Multiphase Survey'] = false
L['The Not-So-Friendly Skies...'] = false
L['The One That Got Away'] = false
L['The Oracles'] = false
L['The Relic\'s Emanation'] = false
L['The Sanctum Wards'] = false
L['The Scryers'] = false
L['The Sha\'tar'] = false
L['The Solution Solution'] = false
L['The Sons of Hodir'] = false
L['The Storm Peaks'] = false
L['The Way to His Heart...'] = false
L['The Wyrmrest Accord'] = false
L['Thorium Brotherhood'] = false
L['Thrallmar'] = false
L['Thrusting Hodir\'s Spear'] = false
L['Thunder Bluff'] = false
L['Timbermaw Hold'] = false
L['Timear Foresees Centrifuge Constructs in your Future!'] = false
L['Timear Foresees Infinite Agents in your Future!'] = false
L['Timear Foresees Titanium Vanguards in your Future!'] = false
L['Timear Foresees Ymirjar Berserkers in your Future!'] = false
L['Tools of War'] = false
L['Total Ohmage: The Valley of Lost Hope!'] = false
L['Troll Patrol'] = false
L['Troll Patrol: Can You Dig It?'] = false
L['Troll Patrol: Couldn\'t Care Less'] = false
L['Troll Patrol: Creature Comforts'] = false
L['Troll Patrol: Done to Death'] = false
L['Troll Patrol: High Standards'] = false
L['Troll Patrol: Intestinal Fortitude'] = false
L['Troll Patrol: Something for the Pain'] = false
L['Troll Patrol: The Alchemist\'s Apprentice'] = false
L['Troll Patrol: Throwing Down'] = false
L['Troll Patrol: Whatdya Want, a Medal?'] = false
L['Uncatalogued Species'] = false
L['Undercity'] = false
L['Valiance Expedition'] = false
L['Victory in Wintergrasp'] = false
L['Vile Like Fire!'] = false
L['Volatility'] = false
L['Voren\'thal\'s Visions'] = false
L['Wanted: A Black Stalker Egg'] = false
L['Wanted: A Warp Splinter Clipping'] = false
L['Wanted: Aeonus\'s Hourglass'] = false
L['Wanted: Arcatraz Sentinels'] = false
L['Wanted: Bladefist\'s Seal'] = false
L['Wanted: Coilfang Myrmidons'] = false
L['Wanted: Keli\'dan\'s Feathered Stave'] = false
L['Wanted: Malicious Instructors'] = false
L['Wanted: Murmur\'s Whisper'] = false
L['Wanted: Nazan\'s Riding Crop'] = false
L['Wanted: Pathaleon\'s Projector'] = false
L['Wanted: Rift Lords'] = false
L['Wanted: Shaffar\'s Wondrous Pendant'] = false
L['Wanted: Shattered Hand Centurions'] = false
L['Wanted: Sisters of Torment'] = false
L['Wanted: Sunseeker Channelers'] = false
L['Wanted: Tempest-Forge Destroyers'] = false
L['Wanted: The Epoch Hunter\'s Head'] = false
L['Wanted: The Exarch\'s Soul Gem'] = false
L['Wanted: The Headfeathers of Ikiss'] = false
L['Wanted: The Heart of Quagmirran'] = false
L['Wanted: The Scroll of Skyriss'] = false
L['Wanted: The Signet Ring of Prince Kael\'thas'] = false
L['Wanted: The Warlord\'s Treatise'] = false
L['Warding the Walls'] = false
L['Warding the Warriors'] = false
L['Warsong Gulch'] = false
L['Warsong Offensive'] = false
L['Water Pouch Bounty'] = false
L['Will of the Titans'] = false
L['Winterfall Intrusion'] = false
L['Wintergrasp'] = false
L['Wintersaber Trainers'] = false
L['Wrangle More Aether Rays!'] = false
L['Your Continued Support'] = false
L['Zandalar Tribe'] = false
L['Zul\'Drak'] = false
L['Zulian, Razzashi, and Hakkari Coins'] = false
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/quest/enUS.lua New file
0,0 → 1,407
--[[ (Generated by Babelfish script)
 
ATTENTION: DO NOT MANUALLY ADD/EDIT THESE SCRIPT GENERATED LOCALES
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Quest", "enUS", true); if not L then return end
 
L['"Let the Fires Come!"'] = true
L['A Bad Egg'] = true
L['A Charitable Donation'] = true
L['A Cleansing Light'] = true
L['A Cleansing Song'] = true
L['A Fine Egg'] = true
L['A Gallon of Blood'] = true
L['A Hero\'s Headgear'] = true
L['A Rare Herb'] = true
L['A Slow Death'] = true
L['Aces High!'] = true
L['Additional Runecloth'] = true
L['Again With the Zapped Giants'] = true
L['All Things in Good Time'] = true
L['Alliance Vanguard'] = true
L['Alterac Valley'] = true
L['An Extraordinary Egg'] = true
L['An Ordinary Egg'] = true
L['Another Heap of Ethereals'] = true
L['Appeasing the Great Rain Stone'] = true
L['Arathi Basin'] = true
L['Argent Crusade'] = true
L['Arm the Wards!'] = true
L['Assault by Air'] = true
L['Assault by Ground'] = true
L['Ata\'mal Armaments'] = true
L['Back to the Pit'] = true
L['Bait Bandits'] = true
L['Banish More Demons'] = true
L['Bark for Drohn\'s Distillery!'] = true
L['Bark for T\'chali\'s Voodoo Brewery!'] = true
L['Bark for the Barleybrews!'] = true
L['Bark for the Thunderbrews!'] = true
L['Battlegrounds'] = true
L['Beads for Salfa'] = true
L['Blackriver Brawl'] = true
L['Blackriver Skirmish'] = true
L['Blade\'s Edge Mountains'] = true
L['Blast the Gateway'] = true
L['Blood for Blood'] = true
L['Blood of the Chosen'] = true
L['Blowing Hodir\'s Horn'] = true
L['Bomb Them Again!'] = true
L['Bones and Arrows'] = true
L['Booty Bay'] = true
L['Borean Tundra'] = true
L['Break the Blockade'] = true
L['Brewfest'] = true
L['Bring Me A Shrubbery!'] = true
L['Brood of Nozdormu'] = true
L['Call the Headless Horseman'] = true
L['Call to Arms: Alterac Valley'] = true
L['Call to Arms: Arathi Basin'] = true
L['Call to Arms: Eye of the Storm'] = true
L['Call to Arms: Warsong Gulch'] = true
L['Capture More Dispatches'] = true
L['Cenarion Circle'] = true
L['Cenarion Expedition'] = true
L['Cheese for Glowergold'] = true
L['Chen\'s Empty Keg'] = true
L['Chicken Party!'] = true
L['Coldarra'] = true
L['Congratulations!'] = true
L['Convention at the Legerdemain'] = true
L['Cooking'] = true
L['Crocolisks in the City'] = true
L['Crush Captain Brightwater!'] = true
L['Crush the Dawnblade'] = true
L['Crystal Cluster'] = true
L['Darkspear Trolls'] = true
L['Darnassus'] = true
L['Defend the Siege'] = true
L['Defending Wyrmrest Temple'] = true
L['Defending Your Title'] = true
L['Discovering Your Roots'] = true
L['Disrupt the Greengill Coast'] = true
L['Disrupting the Twilight Portal'] = true
L['Distraction at the Dead Scar'] = true
L['Don\'t Stop Now....'] = true
L['Down With Captain Zorna!'] = true
L['Drag and Drop'] = true
L['Dragonblight'] = true
L['Dragons are the Least of Our Problems'] = true
L['Drake Hunt'] = true
L['Dungeon'] = true
L['Dungeons'] = true
L['Eastern Kingdoms'] = true
L['Empty Stables'] = true
L['Encrypted Twilight Texts'] = true
L['Enemies, Old and New'] = true
L['Erratic Behavior'] = true
L['Escape from Skettis'] = true
L['Everlook'] = true
L['Exodar'] = true
L['Explorers\' League'] = true
L['Eye of the Storm'] = true
L['Favor Amongst the Brotherhood, Blood of the Mountain'] = true
L['Favor Amongst the Brotherhood, Core Leather'] = true
L['Favor Amongst the Brotherhood, Dark Iron Ore'] = true
L['Favor Amongst the Brotherhood, Fiery Core'] = true
L['Favor Amongst the Brotherhood, Lava Core'] = true
L['Feathers for Grazle'] = true
L['Feathers for Nafien'] = true
L['Feeding Arngrim'] = true
L['Felblood Fillet'] = true
L['Fertile Spores'] = true
L['Fires Over Skettis'] = true
L['Fishing'] = true
L['Frenzyheart Champion'] = true
L['Frenzyheart Tribe'] = true
L['From Their Corpses, Rise!'] = true
L['Frostsaber Provisions'] = true
L['Frostwolf Clan'] = true
L['Fueling the Demolishers'] = true
L['Further Conversions'] = true
L['Gadgetzan'] = true
L['Gaining Acceptance'] = true
L['Gaining the Advantage'] = true
L['Glowcap Mushrooms'] = true
L['Gnomeregan Exiles'] = true
L['Grizzly Hills'] = true
L['Gurubashi, Vilebranch, and Witherbark Coins'] = true
L['Hallow\'s End'] = true
L['Hand of the Oracles'] = true
L['Healing with Roses'] = true
L['Hellfire Fortifications'] = true
L['Hellfire Peninsula'] = true
L['Heroic'] = true
L['Honor Hold'] = true
L['Horde Expedition'] = true
L['Hot and Cold'] = true
L['Howling Fjord'] = true
L['Icecrown'] = true
L['In Defense of Halaa'] = true
L['Infused Mushroom Meatloaf'] = true
L['Insult Coren Direbrew'] = true
L['Intelligence Gathering'] = true
L['Intercept the Reinforcements'] = true
L['Intercepting the Mana Cells'] = true
L['Ironforge'] = true
L['Isle of Quel\'Danas'] = true
L['Ivus the Forest Lord'] = true
L['Jewelcrafting'] = true
L['Jinxing the Walls'] = true
L['Junkboxes Needed'] = true
L['Kartak\'s Rampage'] = true
L['Keep \'Em on Their Heels'] = true
L['Keep Them at Bay'] = true
L['Keep Them at Bay!'] = true
L['Keepers of Time'] = true
L['Keeping the Alliance Blind'] = true
L['Keeping the Enemy at Bay'] = true
L['Kick \'Em While They\'re Down'] = true
L['King of the Mountain'] = true
L['Kirin Tor'] = true
L['Knights of the Ebon Blade'] = true
L['Know Your Ley Lines'] = true
L['Kurenai'] = true
L['Leave Our Mark'] = true
L['Libram of Focus'] = true
L['Libram of Protection'] = true
L['Libram of Rapidity'] = true
L['Life or Death'] = true
L['Lokholar the Ice Lord'] = true
L['Lower City'] = true
L['Maintaining Discipline'] = true
L['Maintaining the Sunwell Portal'] = true
L['Make Them Pay!'] = true
L['Making Ready'] = true
L['Making Repairs'] = true
L['Manalicious'] = true
L['Mastery of the Crystals'] = true
L['Midsummer Fire Festival'] = true
L['More Armor Scraps'] = true
L['More Booty!'] = true
L['More Crystal Fragments'] = true
L['More Feathers'] = true
L['More Firewing Signets'] = true
L['More Heads Full of Ivory'] = true
L['More Marks of Kil\'jaeden'] = true
L['More Marks of Sargeras'] = true
L['More Obsidian Warbeads'] = true
L['More Sunfury Signets'] = true
L['More Torch Catching'] = true
L['More Torch Tossing'] = true
L['More Warbeads'] = true
L['More Warbeads!'] = true
L['Morrowgrain to Darnassus'] = true
L['Morrowgrain to Feathermoon Stronghold'] = true
L['Morrowgrain to Thunder Bluff'] = true
L['Mustard Dogs!'] = true
L['Nagrand'] = true
L['Natural Enemies'] = true
L['Nethercite Ore'] = true
L['Netherdust Pollen'] = true
L['Nethermine Flayer Hide'] = true
L['Netherstorm'] = true
L['Netherwing'] = true
L['Netherwing Crystals'] = true
L['Neutralizing the Plague'] = true
L['No Fly Zone'] = true
L['No Mercy for the Merciless'] = true
L['No Mercy!'] = true
L['No Rest For The Wicked'] = true
L['Northrend'] = true
L['Not a Bug'] = true
L['Ogri\'la'] = true
L['Open for Business'] = true
L['Orgrimmar'] = true
L['Outland'] = true
L['Overstock'] = true
L['Overwhelmed!'] = true
L['Picking Up The Pieces...'] = true
L['Pieces Parts'] = true
L['Planning for the Future'] = true
L['Plants of Zangarmarsh'] = true
L['Polishing the Helm'] = true
L['Power of the Great Ones'] = true
L['Preparing for War'] = true
L['Preparing for the Worst'] = true
L['Professions'] = true
L['Proof of Demise: Anub\'arak'] = true
L['Proof of Demise: Cyanigosa'] = true
L['Proof of Demise: Gal\'darah'] = true
L['Proof of Demise: Herald Volazj'] = true
L['Proof of Demise: Ingvar the Plunderer'] = true
L['Proof of Demise: Keristrasza'] = true
L['Proof of Demise: King Ymiron'] = true
L['Proof of Demise: Ley-Guardian Eregos'] = true
L['Proof of Demise: Loken'] = true
L['Proof of Demise: Mal\'Ganis'] = true
L['Proof of Demise: Sjonnir The Ironshaper'] = true
L['Proof of Demise: The Prophet Tharon\'ja'] = true
L['Pushed Too Far'] = true
L['Putting the Hertz: The Valley of Lost Hope'] = true
L['Ram Hide Harnesses'] = true
L['Ram Riding Harnesses'] = true
L['Rampaging Giants'] = true
L['Ratchet'] = true
L['Ravenholdt'] = true
L['Rediscovering Your Roots'] = true
L['Refuel for the Zapping'] = true
L['Rejek: First Blood'] = true
L['Restoring Fiery Flux Supplies via Heavy Leather'] = true
L['Restoring Fiery Flux Supplies via Iron'] = true
L['Restoring Fiery Flux Supplies via Kingsblood'] = true
L['Retest Now'] = true
L['Revenge is Tasty'] = true
L['Riding the Red Rocket'] = true
L['Riding the Wavelength: The Bombardment'] = true
L['Sandfury, Skullsplitter, and Bloodscalp Coins'] = true
L['Seared Scourge'] = true
L['Seasonal'] = true
L['Secret Strength of the Frenzyheart'] = true
L['Secrets of the Qiraji'] = true
L['Sewer Stew'] = true
L['Sha\'tari Skyguard'] = true
L['Shadowmoon Valley'] = true
L['Shattered Sun Offensive'] = true
L['Shattrath City'] = true
L['Shen\'dralar'] = true
L['Shipment: Blood Jade Amulet '] = true
L['Shipment: Bright Armor Relic'] = true
L['Shipment: Glowing Ivory Figurine'] = true
L['Shipment: Intricate Bone Figurine'] = true
L['Shipment: Shifting Sun Curio '] = true
L['Shipment: Wicked Sun Brooch '] = true
L['Sholazar Basin'] = true
L['Shoot \'Em Up'] = true
L['Shred the Alliance'] = true
L['Shredder Repair'] = true
L['Shrimpin\' Ain\'t Easy'] = true
L['Silvermoon City'] = true
L['Single Firewing Signet'] = true
L['Single Mark of Kil\'jaeden'] = true
L['Single Mark of Sargeras'] = true
L['Single Sunfury Signet'] = true
L['Skettis'] = true
L['Slaves to Saronite'] = true
L['Slay them all!'] = true
L['Smash the Pumpkin'] = true
L['Smoke \'Em Out'] = true
L['Song of Fecundity'] = true
L['Song of Reflection'] = true
L['Song of Wind and Water'] = true
L['Soup for the Soul'] = true
L['Spirits of Auchindoun'] = true
L['Sporeggar'] = true
L['Spy Hunter'] = true
L['Static Shock Troops: the Bombardment'] = true
L['Steel Gate Patrol'] = true
L['Stop the Fires!'] = true
L['Stop the Siege'] = true
L['Stormpike Guard'] = true
L['Stormwind'] = true
L['Strained Supplies'] = true
L['Strength of the Tempest'] = true
L['Striking Back'] = true
L['Summon Ahune'] = true
L['Sunfury Attack Plans'] = true
L['Super Hot Stew'] = true
L['Syndicate'] = true
L['Syndicate Emblems'] = true
L['Synthesis of Power'] = true
L['Taking the Harbor'] = true
L['Terokkar Forest'] = true
L['That\'s Abominable!'] = true
L['The Aberrations Must Die'] = true
L['The Air Strikes Must Continue'] = true
L['The Alchemist\'s Apprentice'] = true
L['The Aldor'] = true
L['The Battle Must Go On'] = true
L['The Battle for the Sun\'s Reach Armory'] = true
L['The Booterang: A Cure For The Common Worthless Peon'] = true
L['The Consortium'] = true
L['The Deadliest Trap Ever Laid'] = true
L['The Frostborn'] = true
L['The Heartblood\'s Strength'] = true
L['The Kalu\'ak'] = true
L['The Lost Supplies'] = true
L['The Mag\'har'] = true
L['The Multiphase Survey'] = true
L['The Not-So-Friendly Skies...'] = true
L['The One That Got Away'] = true
L['The Oracles'] = true
L['The Relic\'s Emanation'] = true
L['The Sanctum Wards'] = true
L['The Scryers'] = true
L['The Sha\'tar'] = true
L['The Solution Solution'] = true
L['The Sons of Hodir'] = true
L['The Storm Peaks'] = true
L['The Way to His Heart...'] = true
L['The Wyrmrest Accord'] = true
L['Thorium Brotherhood'] = true
L['Thrallmar'] = true
L['Thrusting Hodir\'s Spear'] = true
L['Thunder Bluff'] = true
L['Timbermaw Hold'] = true
L['Timear Foresees Centrifuge Constructs in your Future!'] = true
L['Timear Foresees Infinite Agents in your Future!'] = true
L['Timear Foresees Titanium Vanguards in your Future!'] = true
L['Timear Foresees Ymirjar Berserkers in your Future!'] = true
L['Tools of War'] = true
L['Total Ohmage: The Valley of Lost Hope!'] = true
L['Troll Patrol'] = true
L['Troll Patrol: Can You Dig It?'] = true
L['Troll Patrol: Couldn\'t Care Less'] = true
L['Troll Patrol: Creature Comforts'] = true
L['Troll Patrol: Done to Death'] = true
L['Troll Patrol: High Standards'] = true
L['Troll Patrol: Intestinal Fortitude'] = true
L['Troll Patrol: Something for the Pain'] = true
L['Troll Patrol: The Alchemist\'s Apprentice'] = true
L['Troll Patrol: Throwing Down'] = true
L['Troll Patrol: Whatdya Want, a Medal?'] = true
L['Uncatalogued Species'] = true
L['Undercity'] = true
L['Valiance Expedition'] = true
L['Victory in Wintergrasp'] = true
L['Vile Like Fire!'] = true
L['Volatility'] = true
L['Voren\'thal\'s Visions'] = true
L['Wanted: A Black Stalker Egg'] = true
L['Wanted: A Warp Splinter Clipping'] = true
L['Wanted: Aeonus\'s Hourglass'] = true
L['Wanted: Arcatraz Sentinels'] = true
L['Wanted: Bladefist\'s Seal'] = true
L['Wanted: Coilfang Myrmidons'] = true
L['Wanted: Keli\'dan\'s Feathered Stave'] = true
L['Wanted: Malicious Instructors'] = true
L['Wanted: Murmur\'s Whisper'] = true
L['Wanted: Nazan\'s Riding Crop'] = true
L['Wanted: Pathaleon\'s Projector'] = true
L['Wanted: Rift Lords'] = true
L['Wanted: Shaffar\'s Wondrous Pendant'] = true
L['Wanted: Shattered Hand Centurions'] = true
L['Wanted: Sisters of Torment'] = true
L['Wanted: Sunseeker Channelers'] = true
L['Wanted: Tempest-Forge Destroyers'] = true
L['Wanted: The Epoch Hunter\'s Head'] = true
L['Wanted: The Exarch\'s Soul Gem'] = true
L['Wanted: The Headfeathers of Ikiss'] = true
L['Wanted: The Heart of Quagmirran'] = true
L['Wanted: The Scroll of Skyriss'] = true
L['Wanted: The Signet Ring of Prince Kael\'thas'] = true
L['Wanted: The Warlord\'s Treatise'] = true
L['Warding the Walls'] = true
L['Warding the Warriors'] = true
L['Warsong Gulch'] = true
L['Warsong Offensive'] = true
L['Water Pouch Bounty'] = true
L['Will of the Titans'] = true
L['Winterfall Intrusion'] = true
L['Wintergrasp'] = true
L['Wintersaber Trainers'] = true
L['Wrangle More Aether Rays!'] = true
L['Your Continued Support'] = true
L['Zandalar Tribe'] = true
L['Zul\'Drak'] = true
L['Zulian, Razzashi, and Hakkari Coins'] = true
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/quest/esMX.lua New file
0,0 → 1,407
--[[ (Generated by Babelfish script)
 
ATTENTION: DO NOT MANUALLY ADD/EDIT THESE SCRIPT GENERATED LOCALES
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Quest", "esMX"); if not L then return end
 
L['"Let the Fires Come!"'] = false
L['A Bad Egg'] = false
L['A Charitable Donation'] = false
L['A Cleansing Light'] = false
L['A Cleansing Song'] = false
L['A Fine Egg'] = false
L['A Gallon of Blood'] = false
L['A Hero\'s Headgear'] = false
L['A Rare Herb'] = false
L['A Slow Death'] = false
L['Aces High!'] = false
L['Additional Runecloth'] = false
L['Again With the Zapped Giants'] = false
L['All Things in Good Time'] = false
L['Alliance Vanguard'] = false
L['Alterac Valley'] = false
L['An Extraordinary Egg'] = false
L['An Ordinary Egg'] = false
L['Another Heap of Ethereals'] = false
L['Appeasing the Great Rain Stone'] = false
L['Arathi Basin'] = false
L['Argent Crusade'] = false
L['Arm the Wards!'] = false
L['Assault by Air'] = false
L['Assault by Ground'] = false
L['Ata\'mal Armaments'] = false
L['Back to the Pit'] = false
L['Bait Bandits'] = false
L['Banish More Demons'] = false
L['Bark for Drohn\'s Distillery!'] = false
L['Bark for T\'chali\'s Voodoo Brewery!'] = false
L['Bark for the Barleybrews!'] = false
L['Bark for the Thunderbrews!'] = false
L['Battlegrounds'] = false
L['Beads for Salfa'] = false
L['Blackriver Brawl'] = false
L['Blackriver Skirmish'] = false
L['Blade\'s Edge Mountains'] = false
L['Blast the Gateway'] = false
L['Blood for Blood'] = false
L['Blood of the Chosen'] = false
L['Blowing Hodir\'s Horn'] = false
L['Bomb Them Again!'] = false
L['Bones and Arrows'] = false
L['Booty Bay'] = false
L['Borean Tundra'] = false
L['Break the Blockade'] = false
L['Brewfest'] = false
L['Bring Me A Shrubbery!'] = false
L['Brood of Nozdormu'] = false
L['Call the Headless Horseman'] = false
L['Call to Arms: Alterac Valley'] = false
L['Call to Arms: Arathi Basin'] = false
L['Call to Arms: Eye of the Storm'] = false
L['Call to Arms: Warsong Gulch'] = false
L['Capture More Dispatches'] = false
L['Cenarion Circle'] = false
L['Cenarion Expedition'] = false
L['Cheese for Glowergold'] = false
L['Chen\'s Empty Keg'] = false
L['Chicken Party!'] = false
L['Coldarra'] = false
L['Congratulations!'] = false
L['Convention at the Legerdemain'] = false
L['Cooking'] = false
L['Crocolisks in the City'] = false
L['Crush Captain Brightwater!'] = false
L['Crush the Dawnblade'] = false
L['Crystal Cluster'] = false
L['Darkspear Trolls'] = false
L['Darnassus'] = false
L['Defend the Siege'] = false
L['Defending Wyrmrest Temple'] = false
L['Defending Your Title'] = false
L['Discovering Your Roots'] = false
L['Disrupt the Greengill Coast'] = false
L['Disrupting the Twilight Portal'] = false
L['Distraction at the Dead Scar'] = false
L['Don\'t Stop Now....'] = false
L['Down With Captain Zorna!'] = false
L['Drag and Drop'] = false
L['Dragonblight'] = false
L['Dragons are the Least of Our Problems'] = false
L['Drake Hunt'] = false
L['Dungeon'] = false
L['Dungeons'] = false
L['Eastern Kingdoms'] = false
L['Empty Stables'] = false
L['Encrypted Twilight Texts'] = false
L['Enemies, Old and New'] = false
L['Erratic Behavior'] = false
L['Escape from Skettis'] = false
L['Everlook'] = false
L['Exodar'] = false
L['Explorers\' League'] = false
L['Eye of the Storm'] = false
L['Favor Amongst the Brotherhood, Blood of the Mountain'] = false
L['Favor Amongst the Brotherhood, Core Leather'] = false
L['Favor Amongst the Brotherhood, Dark Iron Ore'] = false
L['Favor Amongst the Brotherhood, Fiery Core'] = false
L['Favor Amongst the Brotherhood, Lava Core'] = false
L['Feathers for Grazle'] = false
L['Feathers for Nafien'] = false
L['Feeding Arngrim'] = false
L['Felblood Fillet'] = false
L['Fertile Spores'] = false
L['Fires Over Skettis'] = false
L['Fishing'] = false
L['Frenzyheart Champion'] = false
L['Frenzyheart Tribe'] = false
L['From Their Corpses, Rise!'] = false
L['Frostsaber Provisions'] = false
L['Frostwolf Clan'] = false
L['Fueling the Demolishers'] = false
L['Further Conversions'] = false
L['Gadgetzan'] = false
L['Gaining Acceptance'] = false
L['Gaining the Advantage'] = false
L['Glowcap Mushrooms'] = false
L['Gnomeregan Exiles'] = false
L['Grizzly Hills'] = false
L['Gurubashi, Vilebranch, and Witherbark Coins'] = false
L['Hallow\'s End'] = false
L['Hand of the Oracles'] = false
L['Healing with Roses'] = false
L['Hellfire Fortifications'] = false
L['Hellfire Peninsula'] = false
L['Heroic'] = false
L['Honor Hold'] = false
L['Horde Expedition'] = false
L['Hot and Cold'] = false
L['Howling Fjord'] = false
L['Icecrown'] = false
L['In Defense of Halaa'] = false
L['Infused Mushroom Meatloaf'] = false
L['Insult Coren Direbrew'] = false
L['Intelligence Gathering'] = false
L['Intercept the Reinforcements'] = false
L['Intercepting the Mana Cells'] = false
L['Ironforge'] = false
L['Isle of Quel\'Danas'] = false
L['Ivus the Forest Lord'] = false
L['Jewelcrafting'] = false
L['Jinxing the Walls'] = false
L['Junkboxes Needed'] = false
L['Kartak\'s Rampage'] = false
L['Keep \'Em on Their Heels'] = false
L['Keep Them at Bay'] = false
L['Keep Them at Bay!'] = false
L['Keepers of Time'] = false
L['Keeping the Alliance Blind'] = false
L['Keeping the Enemy at Bay'] = false
L['Kick \'Em While They\'re Down'] = false
L['King of the Mountain'] = false
L['Kirin Tor'] = false
L['Knights of the Ebon Blade'] = false
L['Know Your Ley Lines'] = false
L['Kurenai'] = false
L['Leave Our Mark'] = false
L['Libram of Focus'] = false
L['Libram of Protection'] = false
L['Libram of Rapidity'] = false
L['Life or Death'] = false
L['Lokholar the Ice Lord'] = false
L['Lower City'] = false
L['Maintaining Discipline'] = false
L['Maintaining the Sunwell Portal'] = false
L['Make Them Pay!'] = false
L['Making Ready'] = false
L['Making Repairs'] = false
L['Manalicious'] = false
L['Mastery of the Crystals'] = false
L['Midsummer Fire Festival'] = false
L['More Armor Scraps'] = false
L['More Booty!'] = false
L['More Crystal Fragments'] = false
L['More Feathers'] = false
L['More Firewing Signets'] = false
L['More Heads Full of Ivory'] = false
L['More Marks of Kil\'jaeden'] = false
L['More Marks of Sargeras'] = false
L['More Obsidian Warbeads'] = false
L['More Sunfury Signets'] = false
L['More Torch Catching'] = false
L['More Torch Tossing'] = false
L['More Warbeads'] = false
L['More Warbeads!'] = false
L['Morrowgrain to Darnassus'] = false
L['Morrowgrain to Feathermoon Stronghold'] = false
L['Morrowgrain to Thunder Bluff'] = false
L['Mustard Dogs!'] = false
L['Nagrand'] = false
L['Natural Enemies'] = false
L['Nethercite Ore'] = false
L['Netherdust Pollen'] = false
L['Nethermine Flayer Hide'] = false
L['Netherstorm'] = false
L['Netherwing'] = false
L['Netherwing Crystals'] = false
L['Neutralizing the Plague'] = false
L['No Fly Zone'] = false
L['No Mercy for the Merciless'] = false
L['No Mercy!'] = false
L['No Rest For The Wicked'] = false
L['Northrend'] = false
L['Not a Bug'] = false
L['Ogri\'la'] = false
L['Open for Business'] = false
L['Orgrimmar'] = false
L['Outland'] = false
L['Overstock'] = false
L['Overwhelmed!'] = false
L['Picking Up The Pieces...'] = false
L['Pieces Parts'] = false
L['Planning for the Future'] = false
L['Plants of Zangarmarsh'] = false
L['Polishing the Helm'] = false
L['Power of the Great Ones'] = false
L['Preparing for War'] = false
L['Preparing for the Worst'] = false
L['Professions'] = false
L['Proof of Demise: Anub\'arak'] = false
L['Proof of Demise: Cyanigosa'] = false
L['Proof of Demise: Gal\'darah'] = false
L['Proof of Demise: Herald Volazj'] = false
L['Proof of Demise: Ingvar the Plunderer'] = false
L['Proof of Demise: Keristrasza'] = false
L['Proof of Demise: King Ymiron'] = false
L['Proof of Demise: Ley-Guardian Eregos'] = false
L['Proof of Demise: Loken'] = false
L['Proof of Demise: Mal\'Ganis'] = false
L['Proof of Demise: Sjonnir The Ironshaper'] = false
L['Proof of Demise: The Prophet Tharon\'ja'] = false
L['Pushed Too Far'] = false
L['Putting the Hertz: The Valley of Lost Hope'] = false
L['Ram Hide Harnesses'] = false
L['Ram Riding Harnesses'] = false
L['Rampaging Giants'] = false
L['Ratchet'] = false
L['Ravenholdt'] = false
L['Rediscovering Your Roots'] = false
L['Refuel for the Zapping'] = false
L['Rejek: First Blood'] = false
L['Restoring Fiery Flux Supplies via Heavy Leather'] = false
L['Restoring Fiery Flux Supplies via Iron'] = false
L['Restoring Fiery Flux Supplies via Kingsblood'] = false
L['Retest Now'] = false
L['Revenge is Tasty'] = false
L['Riding the Red Rocket'] = false
L['Riding the Wavelength: The Bombardment'] = false
L['Sandfury, Skullsplitter, and Bloodscalp Coins'] = false
L['Seared Scourge'] = false
L['Seasonal'] = false
L['Secret Strength of the Frenzyheart'] = false
L['Secrets of the Qiraji'] = false
L['Sewer Stew'] = false
L['Sha\'tari Skyguard'] = false
L['Shadowmoon Valley'] = false
L['Shattered Sun Offensive'] = false
L['Shattrath City'] = false
L['Shen\'dralar'] = false
L['Shipment: Blood Jade Amulet '] = false
L['Shipment: Bright Armor Relic'] = false
L['Shipment: Glowing Ivory Figurine'] = false
L['Shipment: Intricate Bone Figurine'] = false
L['Shipment: Shifting Sun Curio '] = false
L['Shipment: Wicked Sun Brooch '] = false
L['Sholazar Basin'] = false
L['Shoot \'Em Up'] = false
L['Shred the Alliance'] = false
L['Shredder Repair'] = false
L['Shrimpin\' Ain\'t Easy'] = false
L['Silvermoon City'] = false
L['Single Firewing Signet'] = false
L['Single Mark of Kil\'jaeden'] = false
L['Single Mark of Sargeras'] = false
L['Single Sunfury Signet'] = false
L['Skettis'] = false
L['Slaves to Saronite'] = false
L['Slay them all!'] = false
L['Smash the Pumpkin'] = false
L['Smoke \'Em Out'] = false
L['Song of Fecundity'] = false
L['Song of Reflection'] = false
L['Song of Wind and Water'] = false
L['Soup for the Soul'] = false
L['Spirits of Auchindoun'] = false
L['Sporeggar'] = false
L['Spy Hunter'] = false
L['Static Shock Troops: the Bombardment'] = false
L['Steel Gate Patrol'] = false
L['Stop the Fires!'] = false
L['Stop the Siege'] = false
L['Stormpike Guard'] = false
L['Stormwind'] = false
L['Strained Supplies'] = false
L['Strength of the Tempest'] = false
L['Striking Back'] = false
L['Summon Ahune'] = false
L['Sunfury Attack Plans'] = false
L['Super Hot Stew'] = false
L['Syndicate'] = false
L['Syndicate Emblems'] = false
L['Synthesis of Power'] = false
L['Taking the Harbor'] = false
L['Terokkar Forest'] = false
L['That\'s Abominable!'] = false
L['The Aberrations Must Die'] = false
L['The Air Strikes Must Continue'] = false
L['The Alchemist\'s Apprentice'] = false
L['The Aldor'] = false
L['The Battle Must Go On'] = false
L['The Battle for the Sun\'s Reach Armory'] = false
L['The Booterang: A Cure For The Common Worthless Peon'] = false
L['The Consortium'] = false
L['The Deadliest Trap Ever Laid'] = false
L['The Frostborn'] = false
L['The Heartblood\'s Strength'] = false
L['The Kalu\'ak'] = false
L['The Lost Supplies'] = false
L['The Mag\'har'] = false
L['The Multiphase Survey'] = false
L['The Not-So-Friendly Skies...'] = false
L['The One That Got Away'] = false
L['The Oracles'] = false
L['The Relic\'s Emanation'] = false
L['The Sanctum Wards'] = false
L['The Scryers'] = false
L['The Sha\'tar'] = false
L['The Solution Solution'] = false
L['The Sons of Hodir'] = false
L['The Storm Peaks'] = false
L['The Way to His Heart...'] = false
L['The Wyrmrest Accord'] = false
L['Thorium Brotherhood'] = false
L['Thrallmar'] = false
L['Thrusting Hodir\'s Spear'] = false
L['Thunder Bluff'] = false
L['Timbermaw Hold'] = false
L['Timear Foresees Centrifuge Constructs in your Future!'] = false
L['Timear Foresees Infinite Agents in your Future!'] = false
L['Timear Foresees Titanium Vanguards in your Future!'] = false
L['Timear Foresees Ymirjar Berserkers in your Future!'] = false
L['Tools of War'] = false
L['Total Ohmage: The Valley of Lost Hope!'] = false
L['Troll Patrol'] = false
L['Troll Patrol: Can You Dig It?'] = false
L['Troll Patrol: Couldn\'t Care Less'] = false
L['Troll Patrol: Creature Comforts'] = false
L['Troll Patrol: Done to Death'] = false
L['Troll Patrol: High Standards'] = false
L['Troll Patrol: Intestinal Fortitude'] = false
L['Troll Patrol: Something for the Pain'] = false
L['Troll Patrol: The Alchemist\'s Apprentice'] = false
L['Troll Patrol: Throwing Down'] = false
L['Troll Patrol: Whatdya Want, a Medal?'] = false
L['Uncatalogued Species'] = false
L['Undercity'] = false
L['Valiance Expedition'] = false
L['Victory in Wintergrasp'] = false
L['Vile Like Fire!'] = false
L['Volatility'] = false
L['Voren\'thal\'s Visions'] = false
L['Wanted: A Black Stalker Egg'] = false
L['Wanted: A Warp Splinter Clipping'] = false
L['Wanted: Aeonus\'s Hourglass'] = false
L['Wanted: Arcatraz Sentinels'] = false
L['Wanted: Bladefist\'s Seal'] = false
L['Wanted: Coilfang Myrmidons'] = false
L['Wanted: Keli\'dan\'s Feathered Stave'] = false
L['Wanted: Malicious Instructors'] = false
L['Wanted: Murmur\'s Whisper'] = false
L['Wanted: Nazan\'s Riding Crop'] = false
L['Wanted: Pathaleon\'s Projector'] = false
L['Wanted: Rift Lords'] = false
L['Wanted: Shaffar\'s Wondrous Pendant'] = false
L['Wanted: Shattered Hand Centurions'] = false
L['Wanted: Sisters of Torment'] = false
L['Wanted: Sunseeker Channelers'] = false
L['Wanted: Tempest-Forge Destroyers'] = false
L['Wanted: The Epoch Hunter\'s Head'] = false
L['Wanted: The Exarch\'s Soul Gem'] = false
L['Wanted: The Headfeathers of Ikiss'] = false
L['Wanted: The Heart of Quagmirran'] = false
L['Wanted: The Scroll of Skyriss'] = false
L['Wanted: The Signet Ring of Prince Kael\'thas'] = false
L['Wanted: The Warlord\'s Treatise'] = false
L['Warding the Walls'] = false
L['Warding the Warriors'] = false
L['Warsong Gulch'] = false
L['Warsong Offensive'] = false
L['Water Pouch Bounty'] = false
L['Will of the Titans'] = false
L['Winterfall Intrusion'] = false
L['Wintergrasp'] = false
L['Wintersaber Trainers'] = false
L['Wrangle More Aether Rays!'] = false
L['Your Continued Support'] = false
L['Zandalar Tribe'] = false
L['Zul\'Drak'] = false
L['Zulian, Razzashi, and Hakkari Coins'] = false
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/quest/zhTW.lua New file
0,0 → 1,407
--[[ (Generated by Babelfish script)
 
ATTENTION: DO NOT MANUALLY ADD/EDIT THESE SCRIPT GENERATED LOCALES
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Quest", "zhTW"); if not L then return end
 
L['"Let the Fires Come!"'] = false
L['A Bad Egg'] = false
L['A Charitable Donation'] = false
L['A Cleansing Light'] = false
L['A Cleansing Song'] = false
L['A Fine Egg'] = false
L['A Gallon of Blood'] = false
L['A Hero\'s Headgear'] = false
L['A Rare Herb'] = false
L['A Slow Death'] = false
L['Aces High!'] = false
L['Additional Runecloth'] = false
L['Again With the Zapped Giants'] = false
L['All Things in Good Time'] = false
L['Alliance Vanguard'] = false
L['Alterac Valley'] = false
L['An Extraordinary Egg'] = false
L['An Ordinary Egg'] = false
L['Another Heap of Ethereals'] = false
L['Appeasing the Great Rain Stone'] = false
L['Arathi Basin'] = false
L['Argent Crusade'] = false
L['Arm the Wards!'] = false
L['Assault by Air'] = false
L['Assault by Ground'] = false
L['Ata\'mal Armaments'] = false
L['Back to the Pit'] = false
L['Bait Bandits'] = false
L['Banish More Demons'] = false
L['Bark for Drohn\'s Distillery!'] = false
L['Bark for T\'chali\'s Voodoo Brewery!'] = false
L['Bark for the Barleybrews!'] = false
L['Bark for the Thunderbrews!'] = false
L['Battlegrounds'] = false
L['Beads for Salfa'] = false
L['Blackriver Brawl'] = false
L['Blackriver Skirmish'] = false
L['Blade\'s Edge Mountains'] = false
L['Blast the Gateway'] = false
L['Blood for Blood'] = false
L['Blood of the Chosen'] = false
L['Blowing Hodir\'s Horn'] = false
L['Bomb Them Again!'] = false
L['Bones and Arrows'] = false
L['Booty Bay'] = false
L['Borean Tundra'] = false
L['Break the Blockade'] = false
L['Brewfest'] = false
L['Bring Me A Shrubbery!'] = false
L['Brood of Nozdormu'] = false
L['Call the Headless Horseman'] = false
L['Call to Arms: Alterac Valley'] = false
L['Call to Arms: Arathi Basin'] = false
L['Call to Arms: Eye of the Storm'] = false
L['Call to Arms: Warsong Gulch'] = false
L['Capture More Dispatches'] = false
L['Cenarion Circle'] = false
L['Cenarion Expedition'] = false
L['Cheese for Glowergold'] = false
L['Chen\'s Empty Keg'] = false
L['Chicken Party!'] = false
L['Coldarra'] = false
L['Congratulations!'] = false
L['Convention at the Legerdemain'] = false
L['Cooking'] = false
L['Crocolisks in the City'] = false
L['Crush Captain Brightwater!'] = false
L['Crush the Dawnblade'] = false
L['Crystal Cluster'] = false
L['Darkspear Trolls'] = false
L['Darnassus'] = false
L['Defend the Siege'] = false
L['Defending Wyrmrest Temple'] = false
L['Defending Your Title'] = false
L['Discovering Your Roots'] = false
L['Disrupt the Greengill Coast'] = false
L['Disrupting the Twilight Portal'] = false
L['Distraction at the Dead Scar'] = false
L['Don\'t Stop Now....'] = false
L['Down With Captain Zorna!'] = false
L['Drag and Drop'] = false
L['Dragonblight'] = false
L['Dragons are the Least of Our Problems'] = false
L['Drake Hunt'] = false
L['Dungeon'] = false
L['Dungeons'] = false
L['Eastern Kingdoms'] = false
L['Empty Stables'] = false
L['Encrypted Twilight Texts'] = false
L['Enemies, Old and New'] = false
L['Erratic Behavior'] = false
L['Escape from Skettis'] = false
L['Everlook'] = false
L['Exodar'] = false
L['Explorers\' League'] = false
L['Eye of the Storm'] = false
L['Favor Amongst the Brotherhood, Blood of the Mountain'] = false
L['Favor Amongst the Brotherhood, Core Leather'] = false
L['Favor Amongst the Brotherhood, Dark Iron Ore'] = false
L['Favor Amongst the Brotherhood, Fiery Core'] = false
L['Favor Amongst the Brotherhood, Lava Core'] = false
L['Feathers for Grazle'] = false
L['Feathers for Nafien'] = false
L['Feeding Arngrim'] = false
L['Felblood Fillet'] = false
L['Fertile Spores'] = false
L['Fires Over Skettis'] = false
L['Fishing'] = false
L['Frenzyheart Champion'] = false
L['Frenzyheart Tribe'] = false
L['From Their Corpses, Rise!'] = false
L['Frostsaber Provisions'] = false
L['Frostwolf Clan'] = false
L['Fueling the Demolishers'] = false
L['Further Conversions'] = false
L['Gadgetzan'] = false
L['Gaining Acceptance'] = false
L['Gaining the Advantage'] = false
L['Glowcap Mushrooms'] = false
L['Gnomeregan Exiles'] = false
L['Grizzly Hills'] = false
L['Gurubashi, Vilebranch, and Witherbark Coins'] = false
L['Hallow\'s End'] = false
L['Hand of the Oracles'] = false
L['Healing with Roses'] = false
L['Hellfire Fortifications'] = false
L['Hellfire Peninsula'] = false
L['Heroic'] = false
L['Honor Hold'] = false
L['Horde Expedition'] = false
L['Hot and Cold'] = false
L['Howling Fjord'] = false
L['Icecrown'] = false
L['In Defense of Halaa'] = false
L['Infused Mushroom Meatloaf'] = false
L['Insult Coren Direbrew'] = false
L['Intelligence Gathering'] = false
L['Intercept the Reinforcements'] = false
L['Intercepting the Mana Cells'] = false
L['Ironforge'] = false
L['Isle of Quel\'Danas'] = false
L['Ivus the Forest Lord'] = false
L['Jewelcrafting'] = false
L['Jinxing the Walls'] = false
L['Junkboxes Needed'] = false
L['Kartak\'s Rampage'] = false
L['Keep \'Em on Their Heels'] = false
L['Keep Them at Bay'] = false
L['Keep Them at Bay!'] = false
L['Keepers of Time'] = false
L['Keeping the Alliance Blind'] = false
L['Keeping the Enemy at Bay'] = false
L['Kick \'Em While They\'re Down'] = false
L['King of the Mountain'] = false
L['Kirin Tor'] = false
L['Knights of the Ebon Blade'] = false
L['Know Your Ley Lines'] = false
L['Kurenai'] = false
L['Leave Our Mark'] = false
L['Libram of Focus'] = false
L['Libram of Protection'] = false
L['Libram of Rapidity'] = false
L['Life or Death'] = false
L['Lokholar the Ice Lord'] = false
L['Lower City'] = false
L['Maintaining Discipline'] = false
L['Maintaining the Sunwell Portal'] = false
L['Make Them Pay!'] = false
L['Making Ready'] = false
L['Making Repairs'] = false
L['Manalicious'] = false
L['Mastery of the Crystals'] = false
L['Midsummer Fire Festival'] = false
L['More Armor Scraps'] = false
L['More Booty!'] = false
L['More Crystal Fragments'] = false
L['More Feathers'] = false
L['More Firewing Signets'] = false
L['More Heads Full of Ivory'] = false
L['More Marks of Kil\'jaeden'] = false
L['More Marks of Sargeras'] = false
L['More Obsidian Warbeads'] = false
L['More Sunfury Signets'] = false
L['More Torch Catching'] = false
L['More Torch Tossing'] = false
L['More Warbeads'] = false
L['More Warbeads!'] = false
L['Morrowgrain to Darnassus'] = false
L['Morrowgrain to Feathermoon Stronghold'] = false
L['Morrowgrain to Thunder Bluff'] = false
L['Mustard Dogs!'] = false
L['Nagrand'] = false
L['Natural Enemies'] = false
L['Nethercite Ore'] = false
L['Netherdust Pollen'] = false
L['Nethermine Flayer Hide'] = false
L['Netherstorm'] = false
L['Netherwing'] = false
L['Netherwing Crystals'] = false
L['Neutralizing the Plague'] = false
L['No Fly Zone'] = false
L['No Mercy for the Merciless'] = false
L['No Mercy!'] = false
L['No Rest For The Wicked'] = false
L['Northrend'] = false
L['Not a Bug'] = false
L['Ogri\'la'] = false
L['Open for Business'] = false
L['Orgrimmar'] = false
L['Outland'] = false
L['Overstock'] = false
L['Overwhelmed!'] = false
L['Picking Up The Pieces...'] = false
L['Pieces Parts'] = false
L['Planning for the Future'] = false
L['Plants of Zangarmarsh'] = false
L['Polishing the Helm'] = false
L['Power of the Great Ones'] = false
L['Preparing for War'] = false
L['Preparing for the Worst'] = false
L['Professions'] = false
L['Proof of Demise: Anub\'arak'] = false
L['Proof of Demise: Cyanigosa'] = false
L['Proof of Demise: Gal\'darah'] = false
L['Proof of Demise: Herald Volazj'] = false
L['Proof of Demise: Ingvar the Plunderer'] = false
L['Proof of Demise: Keristrasza'] = false
L['Proof of Demise: King Ymiron'] = false
L['Proof of Demise: Ley-Guardian Eregos'] = false
L['Proof of Demise: Loken'] = false
L['Proof of Demise: Mal\'Ganis'] = false
L['Proof of Demise: Sjonnir The Ironshaper'] = false
L['Proof of Demise: The Prophet Tharon\'ja'] = false
L['Pushed Too Far'] = false
L['Putting the Hertz: The Valley of Lost Hope'] = false
L['Ram Hide Harnesses'] = false
L['Ram Riding Harnesses'] = false
L['Rampaging Giants'] = false
L['Ratchet'] = false
L['Ravenholdt'] = false
L['Rediscovering Your Roots'] = false
L['Refuel for the Zapping'] = false
L['Rejek: First Blood'] = false
L['Restoring Fiery Flux Supplies via Heavy Leather'] = false
L['Restoring Fiery Flux Supplies via Iron'] = false
L['Restoring Fiery Flux Supplies via Kingsblood'] = false
L['Retest Now'] = false
L['Revenge is Tasty'] = false
L['Riding the Red Rocket'] = false
L['Riding the Wavelength: The Bombardment'] = false
L['Sandfury, Skullsplitter, and Bloodscalp Coins'] = false
L['Seared Scourge'] = false
L['Seasonal'] = false
L['Secret Strength of the Frenzyheart'] = false
L['Secrets of the Qiraji'] = false
L['Sewer Stew'] = false
L['Sha\'tari Skyguard'] = false
L['Shadowmoon Valley'] = false
L['Shattered Sun Offensive'] = false
L['Shattrath City'] = false
L['Shen\'dralar'] = false
L['Shipment: Blood Jade Amulet '] = false
L['Shipment: Bright Armor Relic'] = false
L['Shipment: Glowing Ivory Figurine'] = false
L['Shipment: Intricate Bone Figurine'] = false
L['Shipment: Shifting Sun Curio '] = false
L['Shipment: Wicked Sun Brooch '] = false
L['Sholazar Basin'] = false
L['Shoot \'Em Up'] = false
L['Shred the Alliance'] = false
L['Shredder Repair'] = false
L['Shrimpin\' Ain\'t Easy'] = false
L['Silvermoon City'] = false
L['Single Firewing Signet'] = false
L['Single Mark of Kil\'jaeden'] = false
L['Single Mark of Sargeras'] = false
L['Single Sunfury Signet'] = false
L['Skettis'] = false
L['Slaves to Saronite'] = false
L['Slay them all!'] = false
L['Smash the Pumpkin'] = false
L['Smoke \'Em Out'] = false
L['Song of Fecundity'] = false
L['Song of Reflection'] = false
L['Song of Wind and Water'] = false
L['Soup for the Soul'] = false
L['Spirits of Auchindoun'] = false
L['Sporeggar'] = false
L['Spy Hunter'] = false
L['Static Shock Troops: the Bombardment'] = false
L['Steel Gate Patrol'] = false
L['Stop the Fires!'] = false
L['Stop the Siege'] = false
L['Stormpike Guard'] = false
L['Stormwind'] = false
L['Strained Supplies'] = false
L['Strength of the Tempest'] = false
L['Striking Back'] = false
L['Summon Ahune'] = false
L['Sunfury Attack Plans'] = false
L['Super Hot Stew'] = false
L['Syndicate'] = false
L['Syndicate Emblems'] = false
L['Synthesis of Power'] = false
L['Taking the Harbor'] = false
L['Terokkar Forest'] = false
L['That\'s Abominable!'] = false
L['The Aberrations Must Die'] = false
L['The Air Strikes Must Continue'] = false
L['The Alchemist\'s Apprentice'] = false
L['The Aldor'] = false
L['The Battle Must Go On'] = false
L['The Battle for the Sun\'s Reach Armory'] = false
L['The Booterang: A Cure For The Common Worthless Peon'] = false
L['The Consortium'] = false
L['The Deadliest Trap Ever Laid'] = false
L['The Frostborn'] = false
L['The Heartblood\'s Strength'] = false
L['The Kalu\'ak'] = false
L['The Lost Supplies'] = false
L['The Mag\'har'] = false
L['The Multiphase Survey'] = false
L['The Not-So-Friendly Skies...'] = false
L['The One That Got Away'] = false
L['The Oracles'] = false
L['The Relic\'s Emanation'] = false
L['The Sanctum Wards'] = false
L['The Scryers'] = false
L['The Sha\'tar'] = false
L['The Solution Solution'] = false
L['The Sons of Hodir'] = false
L['The Storm Peaks'] = false
L['The Way to His Heart...'] = false
L['The Wyrmrest Accord'] = false
L['Thorium Brotherhood'] = false
L['Thrallmar'] = false
L['Thrusting Hodir\'s Spear'] = false
L['Thunder Bluff'] = false
L['Timbermaw Hold'] = false
L['Timear Foresees Centrifuge Constructs in your Future!'] = false
L['Timear Foresees Infinite Agents in your Future!'] = false
L['Timear Foresees Titanium Vanguards in your Future!'] = false
L['Timear Foresees Ymirjar Berserkers in your Future!'] = false
L['Tools of War'] = false
L['Total Ohmage: The Valley of Lost Hope!'] = false
L['Troll Patrol'] = false
L['Troll Patrol: Can You Dig It?'] = false
L['Troll Patrol: Couldn\'t Care Less'] = false
L['Troll Patrol: Creature Comforts'] = false
L['Troll Patrol: Done to Death'] = false
L['Troll Patrol: High Standards'] = false
L['Troll Patrol: Intestinal Fortitude'] = false
L['Troll Patrol: Something for the Pain'] = false
L['Troll Patrol: The Alchemist\'s Apprentice'] = false
L['Troll Patrol: Throwing Down'] = false
L['Troll Patrol: Whatdya Want, a Medal?'] = false
L['Uncatalogued Species'] = false
L['Undercity'] = false
L['Valiance Expedition'] = false
L['Victory in Wintergrasp'] = false
L['Vile Like Fire!'] = false
L['Volatility'] = false
L['Voren\'thal\'s Visions'] = false
L['Wanted: A Black Stalker Egg'] = false
L['Wanted: A Warp Splinter Clipping'] = false
L['Wanted: Aeonus\'s Hourglass'] = false
L['Wanted: Arcatraz Sentinels'] = false
L['Wanted: Bladefist\'s Seal'] = false
L['Wanted: Coilfang Myrmidons'] = false
L['Wanted: Keli\'dan\'s Feathered Stave'] = false
L['Wanted: Malicious Instructors'] = false
L['Wanted: Murmur\'s Whisper'] = false
L['Wanted: Nazan\'s Riding Crop'] = false
L['Wanted: Pathaleon\'s Projector'] = false
L['Wanted: Rift Lords'] = false
L['Wanted: Shaffar\'s Wondrous Pendant'] = false
L['Wanted: Shattered Hand Centurions'] = false
L['Wanted: Sisters of Torment'] = false
L['Wanted: Sunseeker Channelers'] = false
L['Wanted: Tempest-Forge Destroyers'] = false
L['Wanted: The Epoch Hunter\'s Head'] = false
L['Wanted: The Exarch\'s Soul Gem'] = false
L['Wanted: The Headfeathers of Ikiss'] = false
L['Wanted: The Heart of Quagmirran'] = false
L['Wanted: The Scroll of Skyriss'] = false
L['Wanted: The Signet Ring of Prince Kael\'thas'] = false
L['Wanted: The Warlord\'s Treatise'] = false
L['Warding the Walls'] = false
L['Warding the Warriors'] = false
L['Warsong Gulch'] = false
L['Warsong Offensive'] = false
L['Water Pouch Bounty'] = false
L['Will of the Titans'] = false
L['Winterfall Intrusion'] = false
L['Wintergrasp'] = false
L['Wintersaber Trainers'] = false
L['Wrangle More Aether Rays!'] = false
L['Your Continued Support'] = false
L['Zandalar Tribe'] = false
L['Zul\'Drak'] = false
L['Zulian, Razzashi, and Hakkari Coins'] = false
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/quest/ruRU.lua New file
0,0 → 1,407
--[[ (Generated by Babelfish script)
 
ATTENTION: DO NOT MANUALLY ADD/EDIT THESE SCRIPT GENERATED LOCALES
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Quest", "ruRU"); if not L then return end
 
L['"Let the Fires Come!"'] = '"И гори все огнем!"'
L['A Bad Egg'] = 'Плохое яйцо'
L['A Charitable Donation'] = 'Никто не забыт...'
L['A Cleansing Light'] = 'Очищающий Свет'
L['A Cleansing Song'] = 'Песнь Очищения'
L['A Fine Egg'] = 'Хорошее яйцо'
L['A Gallon of Blood'] = 'Галлон крови'
L['A Hero\'s Headgear'] = 'Геройский шлем'
L['A Rare Herb'] = 'Редкое растение'
L['A Slow Death'] = 'Медленная смерть'
L['Aces High!'] = 'Проверка боем'
L['Additional Runecloth'] = 'Больше рунической ткани'
L['Again With the Zapped Giants'] = 'Новая ликвидация великанов'
L['All Things in Good Time'] = 'Все хорошо в свое время'
L['Alliance Vanguard'] = false
L['Alterac Valley'] = false
L['An Extraordinary Egg'] = 'Необычное яйцо'
L['An Ordinary Egg'] = 'Обычное яйцо'
L['Another Heap of Ethereals'] = 'Еще одна группа духов Астрала'
L['Appeasing the Great Rain Stone'] = 'Умиротворение великого камня дождя'
L['Arathi Basin'] = false
L['Argent Crusade'] = false
L['Arm the Wards!'] = 'Подпитка для силового поля'
L['Assault by Air'] = 'Атака с воздуха'
L['Assault by Ground'] = 'Атака пехоты'
L['Ata\'mal Armaments'] = 'Оружие Ата\'мала'
L['Back to the Pit'] = 'Обратно в Яму Клыка'
L['Bait Bandits'] = 'Поймай бандюгу'
L['Banish More Demons'] = 'Демонов – долой!'
L['Bark for Drohn\'s Distillery!'] = 'Зазывала винокурни Дрона!'
L['Bark for T\'chali\'s Voodoo Brewery!'] = 'Зазывала Пивоваренного завода Тчали Вуду!'
L['Bark for the Barleybrews!'] = 'Зазывалы Ячменевца!'
L['Bark for the Thunderbrews!'] = 'Зазывалы Грозоваров!'
L['Battlegrounds'] = false
L['Beads for Salfa'] = 'Бусы для Сальфы'
L['Blackriver Brawl'] = 'Схватка в Черноречье'
L['Blackriver Skirmish'] = 'Резня в Черноречье'
L['Blade\'s Edge Mountains'] = false
L['Blast the Gateway'] = 'Взрыв врат'
L['Blood for Blood'] = 'Кровь за кровь'
L['Blood of the Chosen'] = 'Кровь избранных'
L['Blowing Hodir\'s Horn'] = 'Звуки рога Холдира'
L['Bomb Them Again!'] = 'Еще разок задать им жару!'
L['Bones and Arrows'] = 'Кости и стрелы'
L['Booty Bay'] = false
L['Borean Tundra'] = false
L['Break the Blockade'] = 'Прорвать блокаду'
L['Brewfest'] = false
L['Bring Me A Shrubbery!'] = 'Принеси мне кустики!'
L['Brood of Nozdormu'] = false
L['Call the Headless Horseman'] = 'Вызов всадника без головы'
L['Call to Arms: Alterac Valley'] = 'К оружию! Альтеракская долина'
L['Call to Arms: Arathi Basin'] = 'К оружию! Низина Арати'
L['Call to Arms: Eye of the Storm'] = 'К оружию! Око Бури'
L['Call to Arms: Warsong Gulch'] = 'К оружию! Ущелье Песни Войны'
L['Capture More Dispatches'] = 'Перехват донесений'
L['Cenarion Circle'] = false
L['Cenarion Expedition'] = false
L['Cheese for Glowergold'] = 'Сыр для Златоплава'
L['Chen\'s Empty Keg'] = 'Пустой бочонок Чена'
L['Chicken Party!'] = 'И снова цыплята!'
L['Coldarra'] = false
L['Congratulations!'] = 'Поздравляем!'
L['Convention at the Legerdemain'] = 'Сбор в Приюте фокусника'
L['Cooking'] = false
L['Crocolisks in the City'] = 'Кроколиски в городе'
L['Crush Captain Brightwater!'] = 'Смерть капитану Брайтвотеру!'
L['Crush the Dawnblade'] = 'Клинки Рассвета должны быть сокрушены!'
L['Crystal Cluster'] = 'Гроздь кристаллов'
L['Darkspear Trolls'] = false
L['Darnassus'] = false
L['Defend the Siege'] = 'Защита осадных машин'
L['Defending Wyrmrest Temple'] = 'Защита храма Драконьего Покоя'
L['Defending Your Title'] = 'Подтверждение победы'
L['Discovering Your Roots'] = 'Смотри в корень'
L['Disrupt the Greengill Coast'] = 'Зачистить залив Зеленожабрых!'
L['Disrupting the Twilight Portal'] = 'Разрушение Сумеречного Портала'
L['Distraction at the Dead Scar'] = 'Отвлекающий маневр на Тропе Мертвых'
L['Don\'t Stop Now....'] = 'Продолжаем...'
L['Down With Captain Zorna!'] = 'Смерть капитану Зорне!'
L['Drag and Drop'] = 'Перенос'
L['Dragonblight'] = false
L['Dragons are the Least of Our Problems'] = 'Драконы – это не самое страшное'
L['Drake Hunt'] = 'Охота на драконов'
L['Dungeon'] = false
L['Dungeons'] = false
L['Eastern Kingdoms'] = false
L['Empty Stables'] = 'Пустые стойла'
L['Encrypted Twilight Texts'] = 'Зашифрованные Сумеречные тексты'
L['Enemies, Old and New'] = 'Враги старые и враги новые'
L['Erratic Behavior'] = 'Хаотичное поведение'
L['Escape from Skettis'] = 'Побег из Скеттиса'
L['Everlook'] = false
L['Exodar'] = false
L['Explorers\' League'] = false
L['Eye of the Storm'] = false
L['Favor Amongst the Brotherhood, Blood of the Mountain'] = 'Покровительство братства, кровь горы'
L['Favor Amongst the Brotherhood, Core Leather'] = 'Покровительство братства, сердцевинная кожа'
L['Favor Amongst the Brotherhood, Dark Iron Ore'] = 'Покровительство братства, черное железо'
L['Favor Amongst the Brotherhood, Fiery Core'] = 'Покровительство братства, огненное ядро'
L['Favor Amongst the Brotherhood, Lava Core'] = 'Покровительство братства, ядро лавы'
L['Feathers for Grazle'] = 'Перья для Гразла'
L['Feathers for Nafien'] = 'Перья для Нафиэна'
L['Feeding Arngrim'] = 'Муки Арнгрима'
L['Felblood Fillet'] = 'Филе сквернокровного луциана'
L['Fertile Spores'] = 'Прорастающие споры'
L['Fires Over Skettis'] = 'Огонь над Скеттисом'
L['Fishing'] = false
L['Frenzyheart Champion'] = 'Воитель Бешеного Сердца'
L['Frenzyheart Tribe'] = false
L['From Their Corpses, Rise!'] = 'Из праха восстаньте!'
L['Frostsaber Provisions'] = 'Накормить ледопардов'
L['Frostwolf Clan'] = false
L['Fueling the Demolishers'] = 'Горючее для разрушителей'
L['Further Conversions'] = 'Дальнейшая перенастройка'
L['Gadgetzan'] = false
L['Gaining Acceptance'] = 'Завоевать благосклонность'
L['Gaining the Advantage'] = 'Обретение преимущества'
L['Glowcap Mushrooms'] = 'Грибы-пламеневики'
L['Gnomeregan Exiles'] = false
L['Grizzly Hills'] = false
L['Gurubashi, Vilebranch, and Witherbark Coins'] = 'Монеты племен= Гурубаши, Порочная Ветвь и Сухокожие'
L['Hallow\'s End'] = false
L['Hand of the Oracles'] = 'Длань Оракулов'
L['Healing with Roses'] = 'Целительные розы'
L['Hellfire Fortifications'] = 'Штурмовые укрепления'
L['Hellfire Peninsula'] = false
L['Heroic'] = false
L['Honor Hold'] = false
L['Horde Expedition'] = false
L['Hot and Cold'] = 'Жар и холод'
L['Howling Fjord'] = false
L['Icecrown'] = false
L['In Defense of Halaa'] = 'Защита Халаа'
L['Infused Mushroom Meatloaf'] = 'Мясной рулет в странногрибном соусе'
L['Insult Coren Direbrew'] = 'Оскорбить Корена Худовара'
L['Intelligence Gathering'] = 'Сбор информации'
L['Intercept the Reinforcements'] = 'Перехватить подкрепление'
L['Intercepting the Mana Cells'] = 'Перехват контейнеров с маной'
L['Ironforge'] = false
L['Isle of Quel\'Danas'] = false
L['Ivus the Forest Lord'] = 'Ивус Лесной Властелин'
L['Jewelcrafting'] = false
L['Jinxing the Walls'] = 'Заколдованные стены'
L['Junkboxes Needed'] = 'Принести лари'
L['Kartak\'s Rampage'] = 'Мощь Картака'
L['Keep \'Em on Their Heels'] = 'Преследуй по пятам'
L['Keep Them at Bay'] = 'Припрем их к стенке'
L['Keep Them at Bay!'] = 'Припрем их к стенке!'
L['Keepers of Time'] = false
L['Keeping the Alliance Blind'] = 'Ослепление Альянса'
L['Keeping the Enemy at Bay'] = 'Загнать врага в угол'
L['Kick \'Em While They\'re Down'] = 'Нападем, пока враг слаб!'
L['King of the Mountain'] = 'Царь горы'
L['Kirin Tor'] = false
L['Knights of the Ebon Blade'] = false
L['Know Your Ley Lines'] = 'Знай свою силовую линию!'
L['Kurenai'] = false
L['Leave Our Mark'] = 'Наша метка'
L['Libram of Focus'] = '"Манускрипт Средоточия"'
L['Libram of Protection'] = '"Манускрипт Защиты'
L['Libram of Rapidity'] = '"Манускрипт Скорости"'
L['Life or Death'] = 'На грани жизни и смерти'
L['Lokholar the Ice Lord'] = 'Локолар Владыка Льда'
L['Lower City'] = false
L['Maintaining Discipline'] = 'Поучить уму-разуму'
L['Maintaining the Sunwell Portal'] = 'Поддержка портала Солнечного Колодца'
L['Make Them Pay!'] = 'Они заплатят!'
L['Making Ready'] = 'Подготовка к работе'
L['Making Repairs'] = 'Текущий ремонт'
L['Manalicious'] = 'Мания'
L['Mastery of the Crystals'] = 'Власть над кристаллами'
L['Midsummer Fire Festival'] = false
L['More Armor Scraps'] = 'Больше обломков брони'
L['More Booty!'] = 'Больше добычи!'
L['More Crystal Fragments'] = 'Снова осколки кристалла'
L['More Feathers'] = 'Больше перьев'
L['More Firewing Signets'] = 'Больше перстней Огнекрылов'
L['More Heads Full of Ivory'] = 'Кость на вес воздуха'
L['More Marks of Kil\'jaeden'] = 'Больше знаков Кил\'джедена'
L['More Marks of Sargeras'] = 'Больше знаков Саргераса'
L['More Obsidian Warbeads'] = 'Поиски обсидиановых боевых ожерелий'
L['More Sunfury Signets'] = 'Больше перстней Ярости Солнца'
L['More Torch Catching'] = 'Опять жонглирование факелами'
L['More Torch Tossing'] = 'Опять бросаем факелы'
L['More Warbeads'] = 'Боевые ожерелья'
L['More Warbeads!'] = 'Боевые ожерелья!'
L['Morrowgrain to Darnassus'] = 'Рассветница для Дарнасса'
L['Morrowgrain to Feathermoon Stronghold'] = 'Рассветница для Крепости Оперенной Луны'
L['Morrowgrain to Thunder Bluff'] = 'Рассветница для Громового Утеса'
L['Mustard Dogs!'] = 'Сосиски с горчицей!'
L['Nagrand'] = false
L['Natural Enemies'] = 'Природные враги'
L['Nethercite Ore'] = 'Хаотитовая Руда'
L['Netherdust Pollen'] = 'Пыльца хаотического пыльника'
L['Nethermine Flayer Hide'] = 'Шкуры живодеров-пустокопов'
L['Netherstorm'] = false
L['Netherwing'] = false
L['Netherwing Crystals'] = 'Кристаллы Крыльев Пустоты'
L['Neutralizing the Plague'] = 'Избавление от чумы'
L['No Fly Zone'] = 'Закрытое воздушное пространство'
L['No Mercy for the Merciless'] = 'Беспощадным пощады не будет'
L['No Mercy!'] = 'Пощады не будет!'
L['No Rest For The Wicked'] = 'Пусть злодеи не ведают покоя'
L['Northrend'] = false
L['Not a Bug'] = 'Тайный шпион'
L['Ogri\'la'] = false
L['Open for Business'] = 'Взаимовыгодный бизнес'
L['Orgrimmar'] = false
L['Outland'] = false
L['Overstock'] = 'Излишки'
L['Overwhelmed!'] = 'В военном лазарете'
L['Picking Up The Pieces...'] = 'Собрать по кусочкам...'
L['Pieces Parts'] = 'Запчасти'
L['Planning for the Future'] = 'Планы на будущее'
L['Plants of Zangarmarsh'] = 'Растения Зангартопи'
L['Polishing the Helm'] = 'Полировка шлема'
L['Power of the Great Ones'] = 'Могущество Великих'
L['Preparing for War'] = 'Готовься к войне'
L['Preparing for the Worst'] = 'Подготовка к самому худшему'
L['Professions'] = false
L['Proof of Demise: Anub\'arak'] = 'Доказательство смерти= Ануб\'арак'
L['Proof of Demise: Cyanigosa'] = 'Доказательство смерти= Синигоса'
L['Proof of Demise: Gal\'darah'] = 'Доказательство смерти= Гал\'дара'
L['Proof of Demise: Herald Volazj'] = 'Доказательство смерти= глашатай Волаж'
L['Proof of Demise: Ingvar the Plunderer'] = 'Доказательство смерти= Ингвар Расхититель'
L['Proof of Demise: Keristrasza'] = 'Доказательство смерти= Керистраза'
L['Proof of Demise: King Ymiron'] = 'Доказательство смерти= король Имирон'
L['Proof of Demise: Ley-Guardian Eregos'] = 'Доказательство смерти= хранитель энергии Эрегос'
L['Proof of Demise: Loken'] = 'Доказательство смерти= Локен'
L['Proof of Demise: Mal\'Ganis'] = 'Доказательство смерти= Мал\'Ганис'
L['Proof of Demise: Sjonnir The Ironshaper'] = 'Доказательство смерти= Сьоннир Железодел'
L['Proof of Demise: The Prophet Tharon\'ja'] = 'Доказательство смерти= пророк Тарон\'джа'
L['Pushed Too Far'] = 'Все слишком далеко зашло'
L['Putting the Hertz: The Valley of Lost Hope'] = 'Килотонны смерти'
L['Ram Hide Harnesses'] = 'Упряжь из бараньей кожи'
L['Ram Riding Harnesses'] = 'Упряжь ездовых баранов'
L['Rampaging Giants'] = 'Истребление великанов'
L['Ratchet'] = false
L['Ravenholdt'] = false
L['Rediscovering Your Roots'] = 'И опять – смотри в корень'
L['Refuel for the Zapping'] = 'Новая энергия для уменьшения'
L['Rejek: First Blood'] = 'Реджек= первая кровь'
L['Restoring Fiery Flux Supplies via Heavy Leather'] = 'Пополнить запасы огненного плавня с помощью тяжелой кожи'
L['Restoring Fiery Flux Supplies via Iron'] = 'Пополнить запасы огненного плавня с помощью железа'
L['Restoring Fiery Flux Supplies via Kingsblood'] = 'Пополнить запасы огненного плавня с помощью королевской крови'
L['Retest Now'] = 'Все переиграть'
L['Revenge is Tasty'] = 'Месть сладка'
L['Riding the Red Rocket'] = 'Верхом на красной ракете'
L['Riding the Wavelength: The Bombardment'] = 'Новое излучение. Бомбардировка'
L['Sandfury, Skullsplitter, and Bloodscalp Coins'] = 'Монеты племен= Песчаная Буря, Дробители Черепов и Кровавый Скальп'
L['Seared Scourge'] = 'Пылающая Плеть'
L['Seasonal'] = false
L['Secret Strength of the Frenzyheart'] = 'Тайная сила Бешеных Сердец'
L['Secrets of the Qiraji'] = 'Секреты Кираи'
L['Sewer Stew'] = 'Рагу для завсегдатаев Стоков'
L['Sha\'tari Skyguard'] = false
L['Shadowmoon Valley'] = false
L['Shattered Sun Offensive'] = false
L['Shattrath City'] = false
L['Shen\'dralar'] = false
L['Shipment: Blood Jade Amulet '] = 'Заказ от торговой компании= амулет из кровавого нефрита'
L['Shipment: Bright Armor Relic'] = 'Заказ от торговой компании= реликвия Сияющей брони'
L['Shipment: Glowing Ivory Figurine'] = 'Заказ от торговой компании= блестящая статуэтка из бивня'
L['Shipment: Intricate Bone Figurine'] = 'Заказ от торговой компании= изысканная костяная статуэтка'
L['Shipment: Shifting Sun Curio '] = 'Заказ от торговой компании= реликвия Восходящего Солнца'
L['Shipment: Wicked Sun Brooch '] = 'Заказ от торговой компании= брошь Беспощадного солнца'
L['Sholazar Basin'] = false
L['Shoot \'Em Up'] = 'Пристрели их'
L['Shred the Alliance'] = 'Искрошить Альянс'
L['Shredder Repair'] = 'Починка крошшеров'
L['Shrimpin\' Ain\'t Easy'] = 'Ловить креветок – это не жук чихнул'
L['Silvermoon City'] = false
L['Single Firewing Signet'] = false
L['Single Mark of Kil\'jaeden'] = false
L['Single Mark of Sargeras'] = false
L['Single Sunfury Signet'] = false
L['Skettis'] = false
L['Slaves to Saronite'] = 'Рабы саронитовых шахт'
L['Slay them all!'] = 'Убить всех и каждого!'
L['Smash the Pumpkin'] = 'Разбей тыкву!'
L['Smoke \'Em Out'] = 'Выкурим их!'
L['Song of Fecundity'] = 'Песнь Плодородия'
L['Song of Reflection'] = 'Песнь Размышления'
L['Song of Wind and Water'] = 'Песнь Ветра и Воды'
L['Soup for the Soul'] = 'Супчик для души'
L['Spirits of Auchindoun'] = 'Духи Аукиндона'
L['Sporeggar'] = false
L['Spy Hunter'] = 'Контрразведчик'
L['Static Shock Troops: the Bombardment'] = 'Войска статического разряда= Бомбардировка'
L['Steel Gate Patrol'] = 'Патрулирование Стальных Ворот'
L['Stop the Fires!'] = 'Гаси пожар!'
L['Stop the Siege'] = 'Остановка осады'
L['Stormpike Guard'] = false
L['Stormwind'] = false
L['Strained Supplies'] = 'Нехватка припасов'
L['Strength of the Tempest'] = 'Сила Бури'
L['Striking Back'] = 'Ответный удар'
L['Summon Ahune'] = 'Призовите Ахуна'
L['Sunfury Attack Plans'] = 'Военные планы Ярости Солнца'
L['Super Hot Stew'] = 'Очень горячая похлебка'
L['Syndicate'] = false
L['Syndicate Emblems'] = 'Эмблемы Синдиката'
L['Synthesis of Power'] = 'Преобразование силы'
L['Taking the Harbor'] = 'Захват гавани'
L['Terokkar Forest'] = false
L['That\'s Abominable!'] = 'Как все погано!'
L['The Aberrations Must Die'] = 'Смерть гнусным тварям!'
L['The Air Strikes Must Continue'] = 'Воздушные атаки должны продолжаться!'
L['The Alchemist\'s Apprentice'] = 'В подмастерья к алхимику'
L['The Aldor'] = false
L['The Battle Must Go On'] = 'Битва должна продолжаться!'
L['The Battle for the Sun\'s Reach Armory'] = 'Сражение за оружейную Солнечного Предела'
L['The Booterang: A Cure For The Common Worthless Peon'] = 'Ботиранг= Лекарство для нерадивых работников'
L['The Consortium'] = false
L['The Deadliest Trap Ever Laid'] = 'Самая Опасная Ловушка'
L['The Frostborn'] = false
L['The Heartblood\'s Strength'] = 'Сила Крови сердца'
L['The Kalu\'ak'] = false
L['The Lost Supplies'] = 'Потерянные припасы'
L['The Mag\'har'] = false
L['The Multiphase Survey'] = 'Мультифазовый подход'
L['The Not-So-Friendly Skies...'] = 'Недружелюбные небеса'
L['The One That Got Away'] = 'Та самая рыбка'
L['The Oracles'] = false
L['The Relic\'s Emanation'] = 'Излучение реликвии'
L['The Sanctum Wards'] = 'Охрана святилища'
L['The Scryers'] = false
L['The Sha\'tar'] = false
L['The Solution Solution'] = 'Решение проблемы'
L['The Sons of Hodir'] = false
L['The Storm Peaks'] = false
L['The Way to His Heart...'] = 'Путь к ее сердцу...'
L['The Wyrmrest Accord'] = false
L['Thorium Brotherhood'] = false
L['Thrallmar'] = false
L['Thrusting Hodir\'s Spear'] = 'Бросая копье Ходира'
L['Thunder Bluff'] = false
L['Timbermaw Hold'] = false
L['Timear Foresees Centrifuge Constructs in your Future!'] = 'Предвидение Времягода= центрифужные создания в вашем будущем!'
L['Timear Foresees Infinite Agents in your Future!'] = 'Предвидение Времягода= посланники драконов Бесконечности в вашем будущем!'
L['Timear Foresees Titanium Vanguards in your Future!'] = 'Предвидение Времягода= лучшие титаниевые воины в вашем будущем!'
L['Timear Foresees Ymirjar Berserkers in your Future!'] = 'Предвидение Времягода= ямиржарские берсерки в вашем будущем!'
L['Tools of War'] = 'Орудия войны'
L['Total Ohmage: The Valley of Lost Hope!'] = 'Война продолжается'
L['Troll Patrol'] = 'Тролльский дозор'
L['Troll Patrol: Can You Dig It?'] = 'Трольский патруль= будем копать'
L['Troll Patrol: Couldn\'t Care Less'] = 'Тролльский дозор= зачистка местности'
L['Troll Patrol: Creature Comforts'] = 'Тролльский дозор= животворящее тепло'
L['Troll Patrol: Done to Death'] = 'Тролльский дозор= смертельная усталость'
L['Troll Patrol: High Standards'] = 'Тролльский дозор= выше знамена!'
L['Troll Patrol: Intestinal Fortitude'] = 'Тролльский дозор= сила духа'
L['Troll Patrol: Something for the Pain'] = 'Тролльский дозор= обезболивающее снадобье'
L['Troll Patrol: The Alchemist\'s Apprentice'] = 'Тролльский дозор= в подмастерья к алхимику'
L['Troll Patrol: Throwing Down'] = 'Тролльский дозор= подрывные работы'
L['Troll Patrol: Whatdya Want, a Medal?'] = 'Тролльский дозор= сбор медальонов'
L['Uncatalogued Species'] = 'Неизвестный науке вид'
L['Undercity'] = false
L['Valiance Expedition'] = false
L['Victory in Wintergrasp'] = 'Победа на Озере Ледяных Оков'
L['Vile Like Fire!'] = 'Злоб любит огонь!'
L['Volatility'] = 'Зря старались!'
L['Voren\'thal\'s Visions'] = 'Видения Ворен\'таля'
L['Wanted: A Black Stalker Egg'] = 'Требуется= яйцо Черной Охотницы'
L['Wanted: A Warp Splinter Clipping'] = 'Заказ= Отросток Узлодревня'
L['Wanted: Aeonus\'s Hourglass'] = 'Заказ= песочные часы Эонуса'
L['Wanted: Arcatraz Sentinels'] = 'Розыск= Часовые Аркатраца'
L['Wanted: Bladefist\'s Seal'] = 'Заказ= печать Острорука'
L['Wanted: Coilfang Myrmidons'] = 'Розыск= Мирмидоны Резервуара Кривого Клыка'
L['Wanted: Keli\'dan\'s Feathered Stave'] = 'Заказ= Украшенный перьями посох Кели\'дана'
L['Wanted: Malicious Instructors'] = 'Разыскиваются= Злобные инструкторы'
L['Wanted: Murmur\'s Whisper'] = 'Разыскивается= Шепот Бормотуна'
L['Wanted: Nazan\'s Riding Crop'] = 'Заказ= Ездовой хлыстик Назана'
L['Wanted: Pathaleon\'s Projector'] = 'Заказ= Проектор Паталеона'
L['Wanted: Rift Lords'] = 'Розыск= Повелители временных разломов'
L['Wanted: Shaffar\'s Wondrous Pendant'] = 'Разыскивается= Заговоренный Амулет Шаффара'
L['Wanted: Shattered Hand Centurions'] = 'РАЗЫСКИВАЮТСЯ= Центурионы клана Изувеченной Длани'
L['Wanted: Sisters of Torment'] = 'Заказ= сестры Терзаний'
L['Wanted: Sunseeker Channelers'] = 'Розыск= Солнцеловы-чаротворцы'
L['Wanted: Tempest-Forge Destroyers'] = 'Розыск= Разрушители Бурегорна'
L['Wanted: The Epoch Hunter\'s Head'] = 'Розыск= Голова Охотника Вечности'
L['Wanted: The Exarch\'s Soul Gem'] = 'Разыскивается= Самоцвет души Экзарха'
L['Wanted: The Headfeathers of Ikiss'] = 'Разыскиваются= головные перья Айкисса'
L['Wanted: The Heart of Quagmirran'] = 'Требуется= сердце Квагмирран'
L['Wanted: The Scroll of Skyriss'] = 'Заказ= Свиток Скайрисса'
L['Wanted: The Signet Ring of Prince Kael\'thas'] = 'Заказ= перстень-печатка принца Кель\'таса'
L['Wanted: The Warlord\'s Treatise'] = 'Требуется= трактат полководца'
L['Warding the Walls'] = 'Охрана стен'
L['Warding the Warriors'] = 'Охрана для воинов'
L['Warsong Gulch'] = false
L['Warsong Offensive'] = false
L['Water Pouch Bounty'] = 'Награда за воду'
L['Will of the Titans'] = 'Воля Титанов'
L['Winterfall Intrusion'] = 'Вторжение племени Зимней Спячки'
L['Wintergrasp'] = false
L['Wintersaber Trainers'] = false
L['Wrangle More Aether Rays!'] = 'Нам нужно больше воздухоскатов!'
L['Your Continued Support'] = 'Щедрое пожертвование'
L['Zandalar Tribe'] = false
L['Zul\'Drak'] = false
L['Zulian, Razzashi, and Hakkari Coins'] = 'Монеты племен= Зулиан, Раззаши и Хаккари'
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/quest/Babelfish.lua New file
0,0 → 1,163
--[[
Babelfish Script (Modified for EasyDaily quest locales)
 
Importing Quest Titles from EasyDaily's Saved Variables:
 
1) Place a copy of your EasyDaily saved variables in the quest locale folder. (Located
at EasyDaily\locales\quest\)
2) (Optional) Insert your name into the translator table, as the example shows.
3) Run this lua script.
 
]]
 
-- CONFIG --
 
--[[
Translators may add their name under their maintained locale(s)
]]
 
local translators = {
-- ["enUS"] = {
-- "Example",
-- "Example2",
-- },
}
 
--[[
The name of the AceLocale-3.0 Category, as being used in :NewLocale and :GetLocale
]]
local localeName = "EasyDaily_Quest"
 
--[[
Prefix to all files if this script is run from a subdir, for example
]]
local filePrefix = "../../"
 
--[[
List of all files to parse
]]
local files = {
"QuestData.lua",
}
 
--[[
The Language your addon was originally written in
]]
local baseLocale = "enUS"
 
--[[
The supported Languages
-- DO NOT INCLUDE the base locale here!
]]
local locale = {
"deDE",
"frFR",
"esES",
"esMX",
"zhCN",
"zhTW",
"koKR",
"ruRU"
}
-- CODE --
 
local strings = {}
 
local varcontent = {}
 
-- extract data from saved variable file
for idx, lang in ipairs(locale) do
local file = io.open(string.format("data_%s.lua", lang), "r")
if file then
varcontent[lang] = assert(loadstring(file:read("*all")))()
end
end
 
-- extract data from specified lua files
for idx, filename in pairs(files) do
local file = io.open(string.format("%s%s", filePrefix or "", filename), "r")
assert(file, "Could not open " .. filename)
local text = file:read("*all")
 
local i = 1
for match in string.gmatch(text, "L%['(.-)'%]") do
strings[ match:gsub("\\", "") ] = true
i = i + 1
end
end
 
local work = {}
 
for k,v in pairs(strings) do table.insert(work, k) end
table.sort(work)
 
local AceLocaleHeader = "local L ="
local BabbleFishHeader = "L = {} -- "
 
local function replaceHeader(content)
return content:gsub(AceLocaleHeader, BabbleFishHeader)
end
 
local localizedStrings = {}
 
table.insert(locale, baseLocale)
-- load existing data from locale files
for idx, lang in ipairs(locale) do
local file = io.open(lang .. ".lua", "r")
if file then
local content = file:read("*all")
content = replaceHeader(content)
--~ print(content)
assert(loadstring(content))()
localizedStrings[lang] = L
file:close()
else
localizedStrings[lang] = {}
end
end
 
for j, k in pairs(localizedStrings) do
for l, m in pairs(k) do
if type(m) == "string" then
if string.find(m, "{(.-)}") then
localizedStrings[j][l] = false
end
end
end
end
 
for j, k in pairs(varcontent) do
for l, m in pairs(k) do
localizedStrings[j][l] = m
end
end
 
-- Write locale files
for idx, lang in ipairs(locale) do
local file = io.open(lang .. ".lua", "w")
assert(file, "Could not open ".. lang .. ".lua for writing")
file:write("--[[ (Generated by Babelfish script)\n\n")
file:write(" ATTENTION: DO NOT MANUALLY ADD/EDIT THESE SCRIPT GENERATED LOCALES\n\n")
if translators[lang] then
file:write(string.format(" Translations by: %s\n\n", table.concat(translators[lang], " & ")))
end
if lang == baseLocale then
file:write(string.format("]] local L = LibStub(\"AceLocale-3.0\"):NewLocale(\"%s\", \"%s\", true); if not L then return end\n\n", localeName, lang))
else
file:write(string.format("]] local L = LibStub(\"AceLocale-3.0\"):NewLocale(\"%s\", \"%s\"); if not L then return end\n\n", localeName, lang))
end
local L = localizedStrings[lang]
for idx, match in ipairs(work) do
if L and type(L[match]) == "string" then
file:write(string.format("L['%s'] = '%s'\n", string.gsub(match, "'", "\\'"), string.gsub(L[match], "'", "\\'")))
else
if lang ~= baseLocale then
local value = type(localizedStrings[baseLocale][match]) == "string" and localizedStrings[baseLocale][match] or "false"
file:write(string.format("L['%s'] = %s\n", string.gsub(match, "'", "\\'"), value))
else
file:write(string.format("L['%s'] = true\n", string.gsub(match, "'", "\\'")))
end
end
end
file:close()
end
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/quest/esES.lua New file
0,0 → 1,407
--[[ (Generated by Babelfish script)
 
ATTENTION: DO NOT MANUALLY ADD/EDIT THESE SCRIPT GENERATED LOCALES
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Quest", "esES"); if not L then return end
 
L['"Let the Fires Come!"'] = '"¡Dejad que el fuego se acerque!"'
L['A Bad Egg'] = 'Un huevo pasado'
L['A Charitable Donation'] = 'Una donación caritativa'
L['A Cleansing Light'] = 'La Luz purificadora'
L['A Cleansing Song'] = false
L['A Fine Egg'] = 'Un huevo de primera'
L['A Gallon of Blood'] = 'Un galón de sangre'
L['A Hero\'s Headgear'] = false
L['A Rare Herb'] = false
L['A Slow Death'] = 'Una muerte lenta'
L['Aces High!'] = false
L['Additional Runecloth'] = 'Un donativo extra de paño rúnico'
L['Again With the Zapped Giants'] = 'Encoge más gigantes'
L['All Things in Good Time'] = false
L['Alliance Vanguard'] = false
L['Alterac Valley'] = false
L['An Extraordinary Egg'] = 'Un huevo muy especial'
L['An Ordinary Egg'] = 'Un huevo normal'
L['Another Heap of Ethereals'] = 'Otro montón de etéreos'
L['Appeasing the Great Rain Stone'] = false
L['Arathi Basin'] = false
L['Argent Crusade'] = false
L['Arm the Wards!'] = '¡Armad los resguardos!'
L['Assault by Air'] = false
L['Assault by Ground'] = false
L['Ata\'mal Armaments'] = 'Armamentos de Ata\'mal'
L['Back to the Pit'] = false
L['Bait Bandits'] = 'Pilluelos de cebo'
L['Banish More Demons'] = 'Destierra más demonios'
L['Bark for Drohn\'s Distillery!'] = '¡Grita por la destilería de Drohn!'
L['Bark for T\'chali\'s Voodoo Brewery!'] = '¡Grita por la Destilería vudú de T\'chali'
L['Bark for the Barleybrews!'] = '¡Grita por los Cebadiz!'
L['Bark for the Thunderbrews!'] = '¡Grita por los Cebatruenos!'
L['Battlegrounds'] = false
L['Beads for Salfa'] = 'Cuentas para Salfa'
L['Blackriver Brawl'] = false
L['Blackriver Skirmish'] = false
L['Blade\'s Edge Mountains'] = false
L['Blast the Gateway'] = 'Destroza el portal'
L['Blood for Blood'] = 'Sangre por sangre'
L['Blood of the Chosen'] = false
L['Blowing Hodir\'s Horn'] = false
L['Bomb Them Again!'] = '¡Bombardéalos de nuevo!'
L['Bones and Arrows'] = false
L['Booty Bay'] = false
L['Borean Tundra'] = false
L['Break the Blockade'] = false
L['Brewfest'] = false
L['Bring Me A Shrubbery!'] = '¡Otra mata!'
L['Brood of Nozdormu'] = false
L['Call the Headless Horseman'] = 'Invoca a El Jinete decapitado'
L['Call to Arms: Alterac Valley'] = 'Llamada a las armas= Valle de Alterac'
L['Call to Arms: Arathi Basin'] = 'Llamada a las armas= Cuenca de Arathi'
L['Call to Arms: Eye of the Storm'] = 'Llamada a las armas= Ojo de la Tormenta'
L['Call to Arms: Warsong Gulch'] = 'Llamada a las armas= Garganta Grito de Guerra'
L['Capture More Dispatches'] = false
L['Cenarion Circle'] = false
L['Cenarion Expedition'] = false
L['Cheese for Glowergold'] = false
L['Chen\'s Empty Keg'] = 'El barril vacío de Chen'
L['Chicken Party!'] = false
L['Coldarra'] = false
L['Congratulations!'] = false
L['Convention at the Legerdemain'] = false
L['Cooking'] = false
L['Crocolisks in the City'] = 'Crocoliscos en la ciudad'
L['Crush Captain Brightwater!'] = false
L['Crush the Dawnblade'] = 'Aplasta a los Hojalba'
L['Crystal Cluster'] = 'Recogida de cristal'
L['Darkspear Trolls'] = false
L['Darnassus'] = false
L['Defend the Siege'] = false
L['Defending Wyrmrest Temple'] = false
L['Defending Your Title'] = false
L['Discovering Your Roots'] = 'Descubriendo tus raíces'
L['Disrupt the Greengill Coast'] = 'Perturbar la Costa Branquia Verde'
L['Disrupting the Twilight Portal'] = 'Perturbar el Portal Crepuscular'
L['Distraction at the Dead Scar'] = 'Distracción en La Cicatriz Muerta'
L['Don\'t Stop Now....'] = 'No te pares ahora'
L['Down With Captain Zorna!'] = false
L['Drag and Drop'] = false
L['Dragonblight'] = false
L['Dragons are the Least of Our Problems'] = 'Los dragones son el menor de nuestros problemas'
L['Drake Hunt'] = 'Caza de dracos'
L['Dungeon'] = false
L['Dungeons'] = false
L['Eastern Kingdoms'] = false
L['Empty Stables'] = 'Establos vacíos'
L['Encrypted Twilight Texts'] = 'Textos Crepusculares codificados'
L['Enemies, Old and New'] = 'Enemigos, viejos y nuevos'
L['Erratic Behavior'] = 'Comportamiento errático'
L['Escape from Skettis'] = 'Fuga de Skettis'
L['Everlook'] = false
L['Exodar'] = false
L['Explorers\' League'] = false
L['Eye of the Storm'] = false
L['Favor Amongst the Brotherhood, Blood of the Mountain'] = 'El favor de la Hermandad, gota de sangre de la montaña'
L['Favor Amongst the Brotherhood, Core Leather'] = 'El favor de la Hermandad, cuero del núcleo'
L['Favor Amongst the Brotherhood, Dark Iron Ore'] = 'El favor de la Hermandad, mena de hierro negro'
L['Favor Amongst the Brotherhood, Fiery Core'] = 'El favor de la Hermandad, núcleos ardientes'
L['Favor Amongst the Brotherhood, Lava Core'] = 'El favor de la Hermandad, núcleo de lava'
L['Feathers for Grazle'] = 'Plumas para Grazle'
L['Feathers for Nafien'] = 'Plumas para Nafien'
L['Feeding Arngrim'] = false
L['Felblood Fillet'] = 'Filete de sangrevil'
L['Fertile Spores'] = 'Esporas fértiles'
L['Fires Over Skettis'] = 'Fuego sobre Skettis'
L['Fishing'] = false
L['Frenzyheart Champion'] = false
L['Frenzyheart Tribe'] = false
L['From Their Corpses, Rise!'] = false
L['Frostsaber Provisions'] = 'Provisiones Sable de Hielo'
L['Frostwolf Clan'] = false
L['Fueling the Demolishers'] = false
L['Further Conversions'] = 'Más transformaciones'
L['Gadgetzan'] = false
L['Gaining Acceptance'] = 'Ganarse el respeto'
L['Gaining the Advantage'] = 'Lograr ventaja'
L['Glowcap Mushrooms'] = 'Fluochampiñones'
L['Gnomeregan Exiles'] = false
L['Grizzly Hills'] = false
L['Gurubashi, Vilebranch, and Witherbark Coins'] = 'Las monedas Gurubashi, Vilrama y Secacorteza'
L['Hallow\'s End'] = false
L['Hand of the Oracles'] = false
L['Healing with Roses'] = false
L['Hellfire Fortifications'] = 'Fortificaciones del Fuego Infernal'
L['Hellfire Peninsula'] = false
L['Heroic'] = false
L['Honor Hold'] = false
L['Horde Expedition'] = false
L['Hot and Cold'] = false
L['Howling Fjord'] = false
L['Icecrown'] = false
L['In Defense of Halaa'] = 'En defensa de Halaa'
L['Infused Mushroom Meatloaf'] = false
L['Insult Coren Direbrew'] = 'Insulta a Coren Cerveza Temible'
L['Intelligence Gathering'] = false
L['Intercept the Reinforcements'] = 'Interceptar a los refuerzos'
L['Intercepting the Mana Cells'] = 'Interceptar las células de maná'
L['Ironforge'] = false
L['Isle of Quel\'Danas'] = false
L['Ivus the Forest Lord'] = 'Ivus, el Señor del Bosque'
L['Jewelcrafting'] = false
L['Jinxing the Walls'] = false
L['Junkboxes Needed'] = 'Se necesitan cajas de trastos'
L['Kartak\'s Rampage'] = false
L['Keep \'Em on Their Heels'] = false
L['Keep Them at Bay'] = false
L['Keep Them at Bay!'] = false
L['Keepers of Time'] = false
L['Keeping the Alliance Blind'] = false
L['Keeping the Enemy at Bay'] = 'Mantén al enemigo a raya'
L['Kick \'Em While They\'re Down'] = false
L['King of the Mountain'] = false
L['Kirin Tor'] = false
L['Knights of the Ebon Blade'] = false
L['Know Your Ley Lines'] = 'Conoce tus líneas Ley'
L['Kurenai'] = false
L['Leave Our Mark'] = false
L['Libram of Focus'] = 'El tratado sobre enfoque'
L['Libram of Protection'] = 'El tratado sobre protección'
L['Libram of Rapidity'] = 'El tratado sobre rapidez'
L['Life or Death'] = false
L['Lokholar the Ice Lord'] = 'Lokholar, el Señor del Hielo'
L['Lower City'] = false
L['Maintaining Discipline'] = false
L['Maintaining the Sunwell Portal'] = 'Hay que mantener el Portal de La Fuente del Sol'
L['Make Them Pay!'] = false
L['Making Ready'] = 'Preparándose'
L['Making Repairs'] = false
L['Manalicious'] = 'Manalicioso'
L['Mastery of the Crystals'] = false
L['Midsummer Fire Festival'] = false
L['More Armor Scraps'] = 'Más restos de armadura'
L['More Booty!'] = '¡Más botines!'
L['More Crystal Fragments'] = 'Más trozos de cristal'
L['More Feathers'] = 'Más plumas'
L['More Firewing Signets'] = 'Más sellos Ala de Fuego'
L['More Heads Full of Ivory'] = 'Más cabezas llenas de marfil'
L['More Marks of Kil\'jaeden'] = 'Más marcas de Kil\'jaeden'
L['More Marks of Sargeras'] = 'Más marcas de Sargeras'
L['More Obsidian Warbeads'] = 'Más abalorios de guerra de obsidiana'
L['More Sunfury Signets'] = 'Más sellos Furia del Sol'
L['More Torch Catching'] = 'Más caza de antorchas'
L['More Torch Tossing'] = 'Más lanzamiento de antorchas'
L['More Warbeads'] = 'Más abalorios de guerra'
L['More Warbeads!'] = '¡Más abalorios de guerra!'
L['Morrowgrain to Darnassus'] = false
L['Morrowgrain to Feathermoon Stronghold'] = 'Mañagrana a Bastión Plumaluna'
L['Morrowgrain to Thunder Bluff'] = 'Mañagrana para Cima del Trueno'
L['Mustard Dogs!'] = false
L['Nagrand'] = false
L['Natural Enemies'] = 'Enemigos naturales'
L['Nethercite Ore'] = 'Mineral de abisalita'
L['Netherdust Pollen'] = 'Polen de polvo abisal'
L['Nethermine Flayer Hide'] = 'Pellejo de despellejador mina abisal'
L['Netherstorm'] = false
L['Netherwing'] = false
L['Netherwing Crystals'] = 'Cristales de Ala Abisal'
L['Neutralizing the Plague'] = false
L['No Fly Zone'] = false
L['No Mercy for the Merciless'] = false
L['No Mercy!'] = false
L['No Rest For The Wicked'] = false
L['Northrend'] = false
L['Not a Bug'] = false
L['Ogri\'la'] = false
L['Open for Business'] = 'Abierto al negocio'
L['Orgrimmar'] = false
L['Outland'] = false
L['Overstock'] = false
L['Overwhelmed!'] = false
L['Picking Up The Pieces...'] = 'Recogiendo los pedazos...'
L['Pieces Parts'] = false
L['Planning for the Future'] = false
L['Plants of Zangarmarsh'] = 'Plantas de Marisma de Zangar'
L['Polishing the Helm'] = false
L['Power of the Great Ones'] = false
L['Preparing for War'] = 'Preparativos de guerra'
L['Preparing for the Worst'] = 'Preparándose para lo peor'
L['Professions'] = false
L['Proof of Demise: Anub\'arak'] = false
L['Proof of Demise: Cyanigosa'] = false
L['Proof of Demise: Gal\'darah'] = false
L['Proof of Demise: Herald Volazj'] = false
L['Proof of Demise: Ingvar the Plunderer'] = false
L['Proof of Demise: Keristrasza'] = false
L['Proof of Demise: King Ymiron'] = false
L['Proof of Demise: Ley-Guardian Eregos'] = false
L['Proof of Demise: Loken'] = false
L['Proof of Demise: Mal\'Ganis'] = false
L['Proof of Demise: Sjonnir The Ironshaper'] = false
L['Proof of Demise: The Prophet Tharon\'ja'] = false
L['Pushed Too Far'] = false
L['Putting the Hertz: The Valley of Lost Hope'] = false
L['Ram Hide Harnesses'] = 'Arneses para carneros de montar'
L['Ram Riding Harnesses'] = 'Arneses para carneros de montar'
L['Rampaging Giants'] = 'Gigantes arrasadores'
L['Ratchet'] = false
L['Ravenholdt'] = false
L['Rediscovering Your Roots'] = 'Redescubriendo tus raíces'
L['Refuel for the Zapping'] = 'Más combustible para el Ultra-reductor'
L['Rejek: First Blood'] = false
L['Restoring Fiery Flux Supplies via Heavy Leather'] = 'Fabricar flujo ígneo con cuero pesado'
L['Restoring Fiery Flux Supplies via Iron'] = 'Fabricar flujo ígneo con hierro'
L['Restoring Fiery Flux Supplies via Kingsblood'] = 'Fabricar flujo ígneo con sangrerregia'
L['Retest Now'] = false
L['Revenge is Tasty'] = 'La venganza es sabrosa'
L['Riding the Red Rocket'] = false
L['Riding the Wavelength: The Bombardment'] = false
L['Sandfury, Skullsplitter, and Bloodscalp Coins'] = 'Las monedas Furiarena, Machacacráneos y Sangrapellejo'
L['Seared Scourge'] = false
L['Seasonal'] = false
L['Secret Strength of the Frenzyheart'] = false
L['Secrets of the Qiraji'] = 'Los secretos de los qiraji'
L['Sewer Stew'] = false
L['Sha\'tari Skyguard'] = false
L['Shadowmoon Valley'] = false
L['Shattered Sun Offensive'] = false
L['Shattrath City'] = false
L['Shen\'dralar'] = false
L['Shipment: Blood Jade Amulet '] = false
L['Shipment: Bright Armor Relic'] = false
L['Shipment: Glowing Ivory Figurine'] = false
L['Shipment: Intricate Bone Figurine'] = false
L['Shipment: Shifting Sun Curio '] = false
L['Shipment: Wicked Sun Brooch '] = false
L['Sholazar Basin'] = false
L['Shoot \'Em Up'] = false
L['Shred the Alliance'] = false
L['Shredder Repair'] = false
L['Shrimpin\' Ain\'t Easy'] = 'No es fácil pescar gambas'
L['Silvermoon City'] = false
L['Single Firewing Signet'] = false
L['Single Mark of Kil\'jaeden'] = false
L['Single Mark of Sargeras'] = false
L['Single Sunfury Signet'] = false
L['Skettis'] = false
L['Slaves to Saronite'] = false
L['Slay them all!'] = false
L['Smash the Pumpkin'] = 'Aplasta la calabaza'
L['Smoke \'Em Out'] = false
L['Song of Fecundity'] = false
L['Song of Reflection'] = false
L['Song of Wind and Water'] = false
L['Soup for the Soul'] = 'Sopa para el alma'
L['Spirits of Auchindoun'] = 'Espíritus de Auchindoun'
L['Sporeggar'] = false
L['Spy Hunter'] = false
L['Static Shock Troops: the Bombardment'] = false
L['Steel Gate Patrol'] = false
L['Stop the Fires!'] = '¡Todos contra el fuego!'
L['Stop the Siege'] = false
L['Stormpike Guard'] = false
L['Stormwind'] = false
L['Strained Supplies'] = 'Cortos de suministros'
L['Strength of the Tempest'] = false
L['Striking Back'] = 'El contraataque'
L['Summon Ahune'] = 'Invocar a Ahune'
L['Sunfury Attack Plans'] = 'Planes de ataque Furia del Sol'
L['Super Hot Stew'] = 'Un estofado súper picante'
L['Syndicate'] = false
L['Syndicate Emblems'] = 'Emblemas de la Hermandad'
L['Synthesis of Power'] = 'Síntesis de poder'
L['Taking the Harbor'] = 'Tomar el puerto'
L['Terokkar Forest'] = false
L['That\'s Abominable!'] = false
L['The Aberrations Must Die'] = false
L['The Air Strikes Must Continue'] = 'Los ataques aéreos deben continuar'
L['The Alchemist\'s Apprentice'] = false
L['The Aldor'] = false
L['The Battle Must Go On'] = 'La batalla debe continuar'
L['The Battle for the Sun\'s Reach Armory'] = 'La batalla por el Arsenal de Tramo del Sol'
L['The Booterang: A Cure For The Common Worthless Peon'] = 'El botarang= una cura para el insignificante trabajador común'
L['The Consortium'] = false
L['The Deadliest Trap Ever Laid'] = 'La trampa más mortal jamás tendida'
L['The Frostborn'] = false
L['The Heartblood\'s Strength'] = false
L['The Kalu\'ak'] = false
L['The Lost Supplies'] = 'Los suministros perdidos'
L['The Mag\'har'] = false
L['The Multiphase Survey'] = 'La multi-algo o cualquier-cosa encuesta'
L['The Not-So-Friendly Skies...'] = 'Los cielos no tan amistosos...'
L['The One That Got Away'] = 'Aquel que se escapó'
L['The Oracles'] = false
L['The Relic\'s Emanation'] = 'La emanación de la reliquia'
L['The Sanctum Wards'] = 'Los resguardos del sagrario'
L['The Scryers'] = false
L['The Sha\'tar'] = false
L['The Solution Solution'] = false
L['The Sons of Hodir'] = false
L['The Storm Peaks'] = false
L['The Way to His Heart...'] = false
L['The Wyrmrest Accord'] = false
L['Thorium Brotherhood'] = false
L['Thrallmar'] = false
L['Thrusting Hodir\'s Spear'] = false
L['Thunder Bluff'] = false
L['Timbermaw Hold'] = false
L['Timear Foresees Centrifuge Constructs in your Future!'] = false
L['Timear Foresees Infinite Agents in your Future!'] = false
L['Timear Foresees Titanium Vanguards in your Future!'] = false
L['Timear Foresees Ymirjar Berserkers in your Future!'] = false
L['Tools of War'] = false
L['Total Ohmage: The Valley of Lost Hope!'] = false
L['Troll Patrol'] = false
L['Troll Patrol: Can You Dig It?'] = false
L['Troll Patrol: Couldn\'t Care Less'] = false
L['Troll Patrol: Creature Comforts'] = false
L['Troll Patrol: Done to Death'] = false
L['Troll Patrol: High Standards'] = false
L['Troll Patrol: Intestinal Fortitude'] = false
L['Troll Patrol: Something for the Pain'] = false
L['Troll Patrol: The Alchemist\'s Apprentice'] = false
L['Troll Patrol: Throwing Down'] = false
L['Troll Patrol: Whatdya Want, a Medal?'] = false
L['Uncatalogued Species'] = 'Especie sin catalogar'
L['Undercity'] = false
L['Valiance Expedition'] = false
L['Victory in Wintergrasp'] = false
L['Vile Like Fire!'] = false
L['Volatility'] = false
L['Voren\'thal\'s Visions'] = 'Visiones de Voren\'thal'
L['Wanted: A Black Stalker Egg'] = 'Se busca= un huevo de acechadora negra.'
L['Wanted: A Warp Splinter Clipping'] = 'Se busca= un esqueje de disidente de distorsión'
L['Wanted: Aeonus\'s Hourglass'] = 'Se busca= el reloj de arena de Aeonus'
L['Wanted: Arcatraz Sentinels'] = 'Se busca= centinelas de Arcatraz'
L['Wanted: Bladefist\'s Seal'] = 'Se busca= el sello de Garrafilada'
L['Wanted: Coilfang Myrmidons'] = 'Se busca= mirmidones Colmillo Torcido'
L['Wanted: Keli\'dan\'s Feathered Stave'] = 'Se busca= el bastón con plumas de Keli\'dan'
L['Wanted: Malicious Instructors'] = 'Se busca= instructoras maliciosas'
L['Wanted: Murmur\'s Whisper'] = 'Se busca= el susurro de Murmur'
L['Wanted: Nazan\'s Riding Crop'] = 'Se busca= fusta de montar de Nazan'
L['Wanted: Pathaleon\'s Projector'] = 'Se busca= el proyector de Pathaleon'
L['Wanted: Rift Lords'] = 'Se busca= señores de la falla'
L['Wanted: Shaffar\'s Wondrous Pendant'] = 'Se busca= el amuleto maravilloso de Shaffar'
L['Wanted: Shattered Hand Centurions'] = 'Se busca= centuriones Mano Destrozada'
L['Wanted: Sisters of Torment'] = 'Se busca= hermanas del Tormento'
L['Wanted: Sunseeker Channelers'] = 'Se busca= canalizadores Buscasol'
L['Wanted: Tempest-Forge Destroyers'] = 'Se busca= destructores de Forja de Tempestad'
L['Wanted: The Epoch Hunter\'s Head'] = 'Se busca= la cabeza del cazador de eras'
L['Wanted: The Exarch\'s Soul Gem'] = 'Se busca= la gema de alma del exarca'
L['Wanted: The Headfeathers of Ikiss'] = 'Se busca= las plumas del tocado de Ikiss'
L['Wanted: The Heart of Quagmirran'] = 'Se busca= el corazón de Quagmirran'
L['Wanted: The Scroll of Skyriss'] = 'Se busca= el pergamino de Cieloriss'
L['Wanted: The Signet Ring of Prince Kael\'thas'] = 'Se busca= el sello del Príncipe Kael\'thas'
L['Wanted: The Warlord\'s Treatise'] = 'Se busca= el Tratado del Señor de la Guerra'
L['Warding the Walls'] = false
L['Warding the Warriors'] = false
L['Warsong Gulch'] = false
L['Warsong Offensive'] = false
L['Water Pouch Bounty'] = 'Cazador de faltriqueras de agua'
L['Will of the Titans'] = false
L['Winterfall Intrusion'] = 'Intrusión Nevada'
L['Wintergrasp'] = false
L['Wintersaber Trainers'] = false
L['Wrangle More Aether Rays!'] = '¡Atrapa más rayas de aether!'
L['Your Continued Support'] = 'Tu incesante apoyo'
L['Zandalar Tribe'] = false
L['Zul\'Drak'] = false
L['Zulian, Razzashi, and Hakkari Coins'] = 'Las monedas Zulian, Razzashi y Hakkari'
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/quest/frFR.lua New file
0,0 → 1,407
--[[ (Generated by Babelfish script)
 
ATTENTION: DO NOT MANUALLY ADD/EDIT THESE SCRIPT GENERATED LOCALES
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Quest", "frFR"); if not L then return end
 
L['"Let the Fires Come!"'] = 'Que viennent les flammes !'
L['A Bad Egg'] = 'Un mauvais œuf'
L['A Charitable Donation'] = 'Un don charitable'
L['A Cleansing Light'] = 'Une Lumière purificatrice'
L['A Cleansing Song'] = false
L['A Fine Egg'] = 'Un œuf de premier choix'
L['A Gallon of Blood'] = 'Quelques litres de sang'
L['A Hero\'s Headgear'] = false
L['A Rare Herb'] = false
L['A Slow Death'] = 'Une mort lente'
L['Aces High!'] = false
L['Additional Runecloth'] = 'Encore de l\'étoffe runique'
L['Again With the Zapped Giants'] = 'Le retour des géants rétrécis'
L['All Things in Good Time'] = false
L['Alliance Vanguard'] = false
L['Alterac Valley'] = false
L['An Extraordinary Egg'] = 'Un œuf extraordinaire'
L['An Ordinary Egg'] = 'Un œuf ordinaire'
L['Another Heap of Ethereals'] = 'Un autre monceau d\'éthériens'
L['Appeasing the Great Rain Stone'] = false
L['Arathi Basin'] = false
L['Argent Crusade'] = false
L['Arm the Wards!'] = 'Armez les protections !'
L['Assault by Air'] = false
L['Assault by Ground'] = false
L['Ata\'mal Armaments'] = 'Les armes d\'Ata\'mal'
L['Back to the Pit'] = false
L['Bait Bandits'] = 'Succomber à vos appâts'
L['Banish More Demons'] = 'Bannissez plus de démons'
L['Bark for Drohn\'s Distillery!'] = 'Des aboyeurs pour la distillerie Drohn !'
L['Bark for T\'chali\'s Voodoo Brewery!'] = 'Des aboyeurs pour la brasserie vaudou de T\'chali !'
L['Bark for the Barleybrews!'] = 'Des aboyeurs pour les Brasselorge !'
L['Bark for the Thunderbrews!'] = 'Des aboyeurs pour les Tonnebière !'
L['Battlegrounds'] = false
L['Beads for Salfa'] = 'Des perles pour Salfa'
L['Blackriver Brawl'] = false
L['Blackriver Skirmish'] = false
L['Blade\'s Edge Mountains'] = false
L['Blast the Gateway'] = 'Détruire la porte'
L['Blood for Blood'] = 'Sang pour sang'
L['Blood of the Chosen'] = false
L['Blowing Hodir\'s Horn'] = false
L['Bomb Them Again!'] = 'Bombardez-les encore !'
L['Bones and Arrows'] = false
L['Booty Bay'] = false
L['Borean Tundra'] = false
L['Break the Blockade'] = false
L['Brewfest'] = false
L['Bring Me A Shrubbery!'] = 'Ramenez-moi un jardinet !'
L['Brood of Nozdormu'] = false
L['Call the Headless Horseman'] = 'L\'appel du Cavalier sans tête'
L['Call to Arms: Alterac Valley'] = 'Appel aux armes = vallée d\'Alterac'
L['Call to Arms: Arathi Basin'] = 'Appel aux armes = bassin d\'Arathi'
L['Call to Arms: Eye of the Storm'] = 'Appel aux armes = Œil du cyclone'
L['Call to Arms: Warsong Gulch'] = 'Appel aux armes = goulet des Chanteguerres'
L['Capture More Dispatches'] = false
L['Cenarion Circle'] = false
L['Cenarion Expedition'] = false
L['Cheese for Glowergold'] = false
L['Chen\'s Empty Keg'] = 'Tonneau vide de Chen'
L['Chicken Party!'] = false
L['Coldarra'] = false
L['Congratulations!'] = false
L['Convention at the Legerdemain'] = false
L['Cooking'] = false
L['Crocolisks in the City'] = 'Les crocilisques sont lâchés'
L['Crush Captain Brightwater!'] = false
L['Crush the Dawnblade'] = 'Écraser la Lame de l\'aube'
L['Crystal Cluster'] = 'Grappes de cristaux'
L['Darkspear Trolls'] = false
L['Darnassus'] = false
L['Defend the Siege'] = false
L['Defending Wyrmrest Temple'] = false
L['Defending Your Title'] = false
L['Discovering Your Roots'] = 'À la découverte de vos racines'
L['Disrupt the Greengill Coast'] = 'Déstabilisation de la Côte de Verte-branchie'
L['Disrupting the Twilight Portal'] = 'Perturber la Porte du crépuscule'
L['Distraction at the Dead Scar'] = 'Diversion à la Malebrèche'
L['Don\'t Stop Now....'] = 'Ne vous arrêtez pas…'
L['Down With Captain Zorna!'] = false
L['Drag and Drop'] = false
L['Dragonblight'] = false
L['Dragons are the Least of Our Problems'] = 'Les dragons sont les derniers de nos soucis'
L['Drake Hunt'] = 'La chasse au drake'
L['Dungeon'] = false
L['Dungeons'] = false
L['Eastern Kingdoms'] = false
L['Empty Stables'] = 'Écuries vides'
L['Encrypted Twilight Texts'] = 'Les textes du crépuscule cryptés'
L['Enemies, Old and New'] = 'Ennemis, anciens et nouveaux'
L['Erratic Behavior'] = 'Comportement erratique'
L['Escape from Skettis'] = 'L\'évasion de Skettis'
L['Everlook'] = false
L['Exodar'] = false
L['Explorers\' League'] = false
L['Eye of the Storm'] = false
L['Favor Amongst the Brotherhood, Blood of the Mountain'] = 'Faveur auprès de la Confrérie, Sang de la montagne'
L['Favor Amongst the Brotherhood, Core Leather'] = 'Faveur auprès de la Confrérie, Cuir du Magma'
L['Favor Amongst the Brotherhood, Dark Iron Ore'] = 'Faveur auprès de la Confrérie, Minerai de sombrefer'
L['Favor Amongst the Brotherhood, Fiery Core'] = 'Faveur auprès de la Confrérie, Noyau de feu'
L['Favor Amongst the Brotherhood, Lava Core'] = 'Faveur auprès de la Confrérie, Noyau de lave'
L['Feathers for Grazle'] = 'Des plumes pour Grifleur'
L['Feathers for Nafien'] = 'Des plumes pour Nafien'
L['Feeding Arngrim'] = false
L['Felblood Fillet'] = 'Filet de gangresang'
L['Fertile Spores'] = 'Des spores fertiles'
L['Fires Over Skettis'] = 'Un déluge de feu sur Skettis'
L['Fishing'] = false
L['Frenzyheart Champion'] = false
L['Frenzyheart Tribe'] = false
L['From Their Corpses, Rise!'] = false
L['Frostsaber Provisions'] = 'Provisions de sabres-de-givre'
L['Frostwolf Clan'] = false
L['Fueling the Demolishers'] = false
L['Further Conversions'] = 'Plus de conversions'
L['Gadgetzan'] = false
L['Gaining Acceptance'] = 'Se faire accepter'
L['Gaining the Advantage'] = 'Prendre l\'avantage'
L['Glowcap Mushrooms'] = 'Les chapeluisants'
L['Gnomeregan Exiles'] = false
L['Grizzly Hills'] = false
L['Gurubashi, Vilebranch, and Witherbark Coins'] = 'Pièces Gurubashi, Vilebranche et Fânécorce'
L['Hallow\'s End'] = false
L['Hand of the Oracles'] = false
L['Healing with Roses'] = false
L['Hellfire Fortifications'] = 'Les fortifications des Flammes infernales'
L['Hellfire Peninsula'] = false
L['Heroic'] = false
L['Honor Hold'] = false
L['Horde Expedition'] = false
L['Hot and Cold'] = false
L['Howling Fjord'] = false
L['Icecrown'] = false
L['In Defense of Halaa'] = 'La défense de Halaa'
L['Infused Mushroom Meatloaf'] = false
L['Insult Coren Direbrew'] = 'Insulter Coren Navrebière'
L['Intelligence Gathering'] = false
L['Intercept the Reinforcements'] = 'Intercepter les renforts'
L['Intercepting the Mana Cells'] = 'Intercepter des cellules de mana'
L['Ironforge'] = false
L['Isle of Quel\'Danas'] = false
L['Ivus the Forest Lord'] = 'Ivus le Seigneur des forêts'
L['Jewelcrafting'] = false
L['Jinxing the Walls'] = false
L['Junkboxes Needed'] = 'Demande de coffrets'
L['Kartak\'s Rampage'] = false
L['Keep \'Em on Their Heels'] = false
L['Keep Them at Bay'] = false
L['Keep Them at Bay!'] = false
L['Keepers of Time'] = false
L['Keeping the Alliance Blind'] = false
L['Keeping the Enemy at Bay'] = 'Tenir l\'ennemi à distance'
L['Kick \'Em While They\'re Down'] = false
L['King of the Mountain'] = false
L['Kirin Tor'] = false
L['Knights of the Ebon Blade'] = false
L['Know Your Ley Lines'] = 'Les lignes telluriques et vous'
L['Kurenai'] = false
L['Leave Our Mark'] = false
L['Libram of Focus'] = 'Libram de focalisation'
L['Libram of Protection'] = 'Libram de Protection'
L['Libram of Rapidity'] = 'Libram de Rapidité'
L['Life or Death'] = false
L['Lokholar the Ice Lord'] = 'Lokholar le Seigneur des Glaces'
L['Lower City'] = false
L['Maintaining Discipline'] = false
L['Maintaining the Sunwell Portal'] = 'Maintenir le portail du Puits de soleil'
L['Make Them Pay!'] = false
L['Making Ready'] = 'Préparatifs'
L['Making Repairs'] = false
L['Manalicious'] = 'Manalicieux'
L['Mastery of the Crystals'] = false
L['Midsummer Fire Festival'] = false
L['More Armor Scraps'] = 'Plus de morceaux d\'armure !'
L['More Booty!'] = 'Plus de butin !'
L['More Crystal Fragments'] = 'Encore des fragments de cristal'
L['More Feathers'] = 'Plus de plumes'
L['More Firewing Signets'] = 'De nouvelles chevalières Aile-de-feu'
L['More Heads Full of Ivory'] = 'Encore plus d\'ivoire plein la tête'
L['More Marks of Kil\'jaeden'] = 'De nouvelles marques de Kil\'jaeden'
L['More Marks of Sargeras'] = 'De nouvelles marques de Sargeras'
L['More Obsidian Warbeads'] = 'Encore des perles de guerre d\'obsidienne'
L['More Sunfury Signets'] = 'De nouvelles chevalières Solfurie'
L['More Torch Catching'] = 'Attraper plus de torches'
L['More Torch Tossing'] = 'Lancer plus de torches'
L['More Warbeads'] = 'Plus de perles de guerre'
L['More Warbeads!'] = 'Plus de perles de guerre !'
L['Morrowgrain to Darnassus'] = 'De la fibre d\'aurore pour Darnassus'
L['Morrowgrain to Feathermoon Stronghold'] = 'De la Fibre d\'aurore au bastion de Pennelune'
L['Morrowgrain to Thunder Bluff'] = 'Des Fibres d\'aurore pour les Pitons du Tonnerre'
L['Mustard Dogs!'] = false
L['Nagrand'] = false
L['Natural Enemies'] = 'Ennemis par nature'
L['Nethercite Ore'] = 'Du minerai de néanticite'
L['Netherdust Pollen'] = 'Du pollen de pruinéante'
L['Nethermine Flayer Hide'] = 'Des peaux d\'écorcheurs mine-néant'
L['Netherstorm'] = false
L['Netherwing'] = false
L['Netherwing Crystals'] = 'Les cristaux de l\'Aile-du-Néant'
L['Neutralizing the Plague'] = false
L['No Fly Zone'] = false
L['No Mercy for the Merciless'] = false
L['No Mercy!'] = false
L['No Rest For The Wicked'] = false
L['Northrend'] = false
L['Not a Bug'] = false
L['Ogri\'la'] = false
L['Open for Business'] = 'On est ouvert'
L['Orgrimmar'] = false
L['Outland'] = false
L['Overstock'] = false
L['Overwhelmed!'] = false
L['Picking Up The Pieces...'] = 'Ramasser les morceaux…'
L['Pieces Parts'] = false
L['Planning for the Future'] = false
L['Plants of Zangarmarsh'] = 'Les plantes du marécage de Zangar'
L['Polishing the Helm'] = false
L['Power of the Great Ones'] = false
L['Preparing for War'] = 'Les préparatifs de guerre'
L['Preparing for the Worst'] = false
L['Professions'] = false
L['Proof of Demise: Anub\'arak'] = false
L['Proof of Demise: Cyanigosa'] = false
L['Proof of Demise: Gal\'darah'] = false
L['Proof of Demise: Herald Volazj'] = false
L['Proof of Demise: Ingvar the Plunderer'] = false
L['Proof of Demise: Keristrasza'] = false
L['Proof of Demise: King Ymiron'] = false
L['Proof of Demise: Ley-Guardian Eregos'] = false
L['Proof of Demise: Loken'] = false
L['Proof of Demise: Mal\'Ganis'] = false
L['Proof of Demise: Sjonnir The Ironshaper'] = false
L['Proof of Demise: The Prophet Tharon\'ja'] = false
L['Pushed Too Far'] = false
L['Putting the Hertz: The Valley of Lost Hope'] = false
L['Ram Hide Harnesses'] = 'Harnais en cuir de bélier'
L['Ram Riding Harnesses'] = 'Harnais pour béliers'
L['Rampaging Giants'] = 'Géants déchaînés'
L['Ratchet'] = false
L['Ravenholdt'] = false
L['Rediscovering Your Roots'] = 'À la redécouverte de vos racines'
L['Refuel for the Zapping'] = 'Encore du carburant pour la zappette'
L['Rejek: First Blood'] = false
L['Restoring Fiery Flux Supplies via Heavy Leather'] = 'Réapprovisionnement en flux embrasé (Cuir lourd)'
L['Restoring Fiery Flux Supplies via Iron'] = 'Réapprovisionnement en flux embrasé (Fer)'
L['Restoring Fiery Flux Supplies via Kingsblood'] = 'Réapprovisionnement en flux embrasé (Sang-royal)'
L['Retest Now'] = false
L['Revenge is Tasty'] = 'La vengeance est un plat…'
L['Riding the Red Rocket'] = false
L['Riding the Wavelength: The Bombardment'] = false
L['Sandfury, Skullsplitter, and Bloodscalp Coins'] = 'Pièces Furie-des-sables, Casse-crâne et Scalp-rouge'
L['Seared Scourge'] = false
L['Seasonal'] = false
L['Secret Strength of the Frenzyheart'] = false
L['Secrets of the Qiraji'] = 'Les secrets des Qiraji'
L['Sewer Stew'] = false
L['Sha\'tari Skyguard'] = false
L['Shadowmoon Valley'] = false
L['Shattered Sun Offensive'] = false
L['Shattrath City'] = false
L['Shen\'dralar'] = false
L['Shipment: Blood Jade Amulet '] = false
L['Shipment: Bright Armor Relic'] = false
L['Shipment: Glowing Ivory Figurine'] = false
L['Shipment: Intricate Bone Figurine'] = false
L['Shipment: Shifting Sun Curio '] = false
L['Shipment: Wicked Sun Brooch '] = false
L['Sholazar Basin'] = false
L['Shoot \'Em Up'] = false
L['Shred the Alliance'] = false
L['Shredder Repair'] = false
L['Shrimpin\' Ain\'t Easy'] = 'Les crevettes, c’est pas pour les mauviettes'
L['Silvermoon City'] = false
L['Single Firewing Signet'] = false
L['Single Mark of Kil\'jaeden'] = false
L['Single Mark of Sargeras'] = false
L['Single Sunfury Signet'] = false
L['Skettis'] = false
L['Slaves to Saronite'] = false
L['Slay them all!'] = false
L['Smash the Pumpkin'] = 'Ecraser la citrouille'
L['Smoke \'Em Out'] = false
L['Song of Fecundity'] = false
L['Song of Reflection'] = false
L['Song of Wind and Water'] = false
L['Soup for the Soul'] = 'Une soupe pour l\'âme'
L['Spirits of Auchindoun'] = 'Les esprits d\'Auchindoun'
L['Sporeggar'] = false
L['Spy Hunter'] = false
L['Static Shock Troops: the Bombardment'] = false
L['Steel Gate Patrol'] = false
L['Stop the Fires!'] = 'Éteignez les incendies !'
L['Stop the Siege'] = false
L['Stormpike Guard'] = false
L['Stormwind'] = false
L['Strained Supplies'] = 'Des réserves durement sollicitées'
L['Strength of the Tempest'] = false
L['Striking Back'] = 'Contre-attaquer'
L['Summon Ahune'] = 'L\'invocation d\'Ahune'
L['Sunfury Attack Plans'] = 'Les plans d\'attaque solfurie'
L['Super Hot Stew'] = 'Un ragoût très épicé'
L['Syndicate'] = false
L['Syndicate Emblems'] = 'Emblèmes du Syndicat'
L['Synthesis of Power'] = 'Synthèse de puissance'
L['Taking the Harbor'] = 'Prendre le port'
L['Terokkar Forest'] = false
L['That\'s Abominable!'] = false
L['The Aberrations Must Die'] = false
L['The Air Strikes Must Continue'] = 'Les frappes aériennes doivent continuer'
L['The Alchemist\'s Apprentice'] = false
L['The Aldor'] = false
L['The Battle Must Go On'] = 'La bataille doit continuer'
L['The Battle for the Sun\'s Reach Armory'] = 'La bataille pour l\'Armurerie des Confins du soleil'
L['The Booterang: A Cure For The Common Worthless Peon'] = 'Le botterang = un traitement pour les péons bons à rien'
L['The Consortium'] = false
L['The Deadliest Trap Ever Laid'] = 'Le plus mortel des pièges'
L['The Frostborn'] = false
L['The Heartblood\'s Strength'] = false
L['The Kalu\'ak'] = false
L['The Lost Supplies'] = 'Les marchandises perdues'
L['The Mag\'har'] = false
L['The Multiphase Survey'] = 'L’examen multiphase'
L['The Not-So-Friendly Skies...'] = 'Les cieux pas si cléments…'
L['The One That Got Away'] = 'Celui qui s\'échappa'
L['The Oracles'] = false
L['The Relic\'s Emanation'] = 'Les émanations des reliques'
L['The Sanctum Wards'] = 'Les protections du sanctum'
L['The Scryers'] = false
L['The Sha\'tar'] = false
L['The Solution Solution'] = false
L['The Sons of Hodir'] = false
L['The Storm Peaks'] = false
L['The Way to His Heart...'] = false
L['The Wyrmrest Accord'] = false
L['Thorium Brotherhood'] = false
L['Thrallmar'] = false
L['Thrusting Hodir\'s Spear'] = false
L['Thunder Bluff'] = false
L['Timbermaw Hold'] = false
L['Timear Foresees Centrifuge Constructs in your Future!'] = false
L['Timear Foresees Infinite Agents in your Future!'] = false
L['Timear Foresees Titanium Vanguards in your Future!'] = false
L['Timear Foresees Ymirjar Berserkers in your Future!'] = false
L['Tools of War'] = false
L['Total Ohmage: The Valley of Lost Hope!'] = false
L['Troll Patrol'] = false
L['Troll Patrol: Can You Dig It?'] = false
L['Troll Patrol: Couldn\'t Care Less'] = false
L['Troll Patrol: Creature Comforts'] = false
L['Troll Patrol: Done to Death'] = false
L['Troll Patrol: High Standards'] = false
L['Troll Patrol: Intestinal Fortitude'] = false
L['Troll Patrol: Something for the Pain'] = false
L['Troll Patrol: The Alchemist\'s Apprentice'] = false
L['Troll Patrol: Throwing Down'] = false
L['Troll Patrol: Whatdya Want, a Medal?'] = false
L['Uncatalogued Species'] = 'Une espèce non cataloguée'
L['Undercity'] = false
L['Valiance Expedition'] = false
L['Victory in Wintergrasp'] = false
L['Vile Like Fire!'] = false
L['Volatility'] = false
L['Voren\'thal\'s Visions'] = 'Les visions de Voren\'thal'
L['Wanted: A Black Stalker Egg'] = 'On recherche = Un œuf de traqueuse noire'
L['Wanted: A Warp Splinter Clipping'] = 'On recherche = Une rognure de Brise-dimension'
L['Wanted: Aeonus\'s Hourglass'] = 'On recherche = Le sablier d\'Aeonus'
L['Wanted: Arcatraz Sentinels'] = 'On recherche = Des sentinelles de l\'Arcatraz'
L['Wanted: Bladefist\'s Seal'] = 'On recherche = Le sceau de Lamepoing'
L['Wanted: Coilfang Myrmidons'] = 'On recherche = Des myrmidons de Glissecroc'
L['Wanted: Keli\'dan\'s Feathered Stave'] = 'On recherche = Le bâton à plumes de Keli\'dan'
L['Wanted: Malicious Instructors'] = 'On recherche = Des instructrices malveillantes'
L['Wanted: Murmur\'s Whisper'] = 'On recherche = Le murmure de Marmon'
L['Wanted: Nazan\'s Riding Crop'] = 'On recherche = La cravache de Nazan'
L['Wanted: Pathaleon\'s Projector'] = 'On recherche = Le projecteur de Pathaleon'
L['Wanted: Rift Lords'] = 'On recherche = Des seigneurs des failles'
L['Wanted: Shaffar\'s Wondrous Pendant'] = 'On recherche = L\'amulette merveilleuse de Shaffar'
L['Wanted: Shattered Hand Centurions'] = 'On recherche = Des centurions de la Main brisée'
L['Wanted: Sisters of Torment'] = 'On recherche = les sœurs du tourment'
L['Wanted: Sunseeker Channelers'] = 'On recherche = Des canalistes Cherche-soleil'
L['Wanted: Tempest-Forge Destroyers'] = 'On recherche = Des destructeurs Forge-tempête'
L['Wanted: The Epoch Hunter\'s Head'] = 'On recherche = La tête du chasseur d\'époques'
L['Wanted: The Exarch\'s Soul Gem'] = 'On recherche = La gemme d\'âme de l\'exarque'
L['Wanted: The Headfeathers of Ikiss'] = 'On recherche = Le panache d\'Ikiss'
L['Wanted: The Heart of Quagmirran'] = 'On recherche = Le cœur de Bourbierreux'
L['Wanted: The Scroll of Skyriss'] = 'On recherche = Le parchemin de Cieuriss'
L['Wanted: The Signet Ring of Prince Kael\'thas'] = 'On recherche = La chevalière du prince Kael\'thas'
L['Wanted: The Warlord\'s Treatise'] = 'On recherche = Le traité du seigneur de guerre'
L['Warding the Walls'] = false
L['Warding the Warriors'] = false
L['Warsong Gulch'] = false
L['Warsong Offensive'] = false
L['Water Pouch Bounty'] = 'Prime de la poche à eau'
L['Will of the Titans'] = false
L['Winterfall Intrusion'] = 'L\'incursion des Tombe-hiver'
L['Wintergrasp'] = false
L['Wintersaber Trainers'] = false
L['Wrangle More Aether Rays!'] = 'Allez dompter d’autres raies de l’éther !'
L['Your Continued Support'] = 'Votre soutien indéfectible'
L['Zandalar Tribe'] = false
L['Zul\'Drak'] = false
L['Zulian, Razzashi, and Hakkari Coins'] = 'Pièces zuliennes, razzashi et hakkari'
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/quest/deDE.lua New file
0,0 → 1,407
--[[ (Generated by Babelfish script)
 
ATTENTION: DO NOT MANUALLY ADD/EDIT THESE SCRIPT GENERATED LOCALES
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Quest", "deDE"); if not L then return end
 
L['"Let the Fires Come!"'] = '"Lasset die Feuer kommen!"'
L['A Bad Egg'] = 'Ein schlechtes Ei'
L['A Charitable Donation'] = false
L['A Cleansing Light'] = 'Ein reinigendes Licht'
L['A Cleansing Song'] = false
L['A Fine Egg'] = 'Ein gutes Ei'
L['A Gallon of Blood'] = 'Eine Gallone Blut'
L['A Hero\'s Headgear'] = false
L['A Rare Herb'] = false
L['A Slow Death'] = 'Ein langsamer Tod'
L['Aces High!'] = false
L['Additional Runecloth'] = 'Noch mehr Runenstoff'
L['Again With the Zapped Giants'] = 'Und wieder unter den geschrumpften Riesen'
L['All Things in Good Time'] = false
L['Alliance Vanguard'] = false
L['Alterac Valley'] = false
L['An Extraordinary Egg'] = false
L['An Ordinary Egg'] = 'Ein gewöhnliches Ei'
L['Another Heap of Ethereals'] = 'Noch ein Hügel voller Astraler'
L['Appeasing the Great Rain Stone'] = false
L['Arathi Basin'] = false
L['Argent Crusade'] = false
L['Arm the Wards!'] = 'Fahrt die Barrieren hoch!'
L['Assault by Air'] = false
L['Assault by Ground'] = false
L['Ata\'mal Armaments'] = 'Waffen von Ata\'mal'
L['Back to the Pit'] = false
L['Bait Bandits'] = 'Köderbanditen'
L['Banish More Demons'] = 'Bannt mehr Dämonen'
L['Bark for Drohn\'s Distillery!'] = 'Marktschreier für die Brauerei Drohn!'
L['Bark for T\'chali\'s Voodoo Brewery!'] = 'Marktschreier für T\'chalis Voodoobrauerei!'
L['Bark for the Barleybrews!'] = 'Marktschreier für die Gerstenbräus!'
L['Bark for the Thunderbrews!'] = 'Marktschreier für die Donnerbräus!'
L['Battlegrounds'] = false
L['Beads for Salfa'] = 'Perlen für Salfa'
L['Blackriver Brawl'] = false
L['Blackriver Skirmish'] = false
L['Blade\'s Edge Mountains'] = false
L['Blast the Gateway'] = 'Vernichtet den Durchgang'
L['Blood for Blood'] = 'Blut für Blut'
L['Blood of the Chosen'] = false
L['Blowing Hodir\'s Horn'] = false
L['Bomb Them Again!'] = 'Und wieder ein Bombenangriff!'
L['Bones and Arrows'] = false
L['Booty Bay'] = false
L['Borean Tundra'] = false
L['Break the Blockade'] = false
L['Brewfest'] = false
L['Bring Me A Shrubbery!'] = 'Bringt mir ein Gebüsch!'
L['Brood of Nozdormu'] = false
L['Call the Headless Horseman'] = 'Ruft den kopflosen Reiter'
L['Call to Arms: Alterac Valley'] = 'Ruf zu den Waffen= Alteractal'
L['Call to Arms: Arathi Basin'] = 'Ruf zu den Waffen= Arathibecken'
L['Call to Arms: Eye of the Storm'] = 'Ruf zu den Waffen= Auge des Sturms'
L['Call to Arms: Warsong Gulch'] = 'Ruf zu den Waffen= Kriegshymnenschlucht'
L['Capture More Dispatches'] = false
L['Cenarion Circle'] = false
L['Cenarion Expedition'] = false
L['Cheese for Glowergold'] = false
L['Chen\'s Empty Keg'] = 'Chens leeres Fässchen'
L['Chicken Party!'] = false
L['Coldarra'] = false
L['Congratulations!'] = false
L['Convention at the Legerdemain'] = false
L['Cooking'] = false
L['Crocolisks in the City'] = 'Krokilisken in der Stadt'
L['Crush Captain Brightwater!'] = false
L['Crush the Dawnblade'] = 'Vernichtet die Dämmerklingen'
L['Crystal Cluster'] = 'Haufenweise Kristalle'
L['Darkspear Trolls'] = false
L['Darnassus'] = false
L['Defend the Siege'] = false
L['Defending Wyrmrest Temple'] = false
L['Defending Your Title'] = false
L['Discovering Your Roots'] = 'Die eigenen Wurzeln entdecken'
L['Disrupt the Greengill Coast'] = 'Belästigung an der Küste der Grünkiemen'
L['Disrupting the Twilight Portal'] = 'Schwächt das Portal des Zwielichts'
L['Distraction at the Dead Scar'] = 'Ablenkungsmanöver an der Todesschneise'
L['Don\'t Stop Now....'] = 'Hört jetzt nicht auf!'
L['Down With Captain Zorna!'] = false
L['Drag and Drop'] = false
L['Dragonblight'] = false
L['Dragons are the Least of Our Problems'] = 'Drachen sind unsere geringste Sorge'
L['Drake Hunt'] = false
L['Dungeon'] = false
L['Dungeons'] = false
L['Eastern Kingdoms'] = false
L['Empty Stables'] = 'Verwaiste Ställe'
L['Encrypted Twilight Texts'] = 'Verschlüsselte Schattenhammertexte'
L['Enemies, Old and New'] = 'Feinde - alte und neue'
L['Erratic Behavior'] = 'Unberechenbares Verhalten'
L['Escape from Skettis'] = 'Flucht aus Skettis'
L['Everlook'] = false
L['Exodar'] = false
L['Explorers\' League'] = false
L['Eye of the Storm'] = false
L['Favor Amongst the Brotherhood, Blood of the Mountain'] = 'Gunst der Bruderschaft, Blut des Berges'
L['Favor Amongst the Brotherhood, Core Leather'] = 'Gunst der Bruderschaft, Kernleder'
L['Favor Amongst the Brotherhood, Dark Iron Ore'] = 'Gunst der Bruderschaft, Dunkeleisenerz'
L['Favor Amongst the Brotherhood, Fiery Core'] = 'Gunst der Bruderschaft, Feuerkern'
L['Favor Amongst the Brotherhood, Lava Core'] = 'Gunst der Bruderschaft, Lavakern'
L['Feathers for Grazle'] = 'Federn für Grazle'
L['Feathers for Nafien'] = 'Federn für Nafien'
L['Feeding Arngrim'] = false
L['Felblood Fillet'] = 'Teufelsblutfilet'
L['Fertile Spores'] = 'Fruchtbare Sporen'
L['Fires Over Skettis'] = 'Feuer über Skettis'
L['Fishing'] = false
L['Frenzyheart Champion'] = false
L['Frenzyheart Tribe'] = false
L['From Their Corpses, Rise!'] = false
L['Frostsaber Provisions'] = 'Frostsäblerverpflegung'
L['Frostwolf Clan'] = false
L['Fueling the Demolishers'] = false
L['Further Conversions'] = 'Weitere Konvertierungen'
L['Gadgetzan'] = false
L['Gaining Acceptance'] = 'Erlangte Anerkennung'
L['Gaining the Advantage'] = 'Einen Vorteil gewinnen'
L['Glowcap Mushrooms'] = 'Glühkappenpilze'
L['Gnomeregan Exiles'] = false
L['Grizzly Hills'] = false
L['Gurubashi, Vilebranch, and Witherbark Coins'] = 'Münzen der Gurubashi, Blutfratzen und Bleichborken'
L['Hallow\'s End'] = false
L['Hand of the Oracles'] = false
L['Healing with Roses'] = false
L['Hellfire Fortifications'] = 'Höllenfeuerbefestigungen'
L['Hellfire Peninsula'] = false
L['Heroic'] = false
L['Honor Hold'] = false
L['Horde Expedition'] = false
L['Hot and Cold'] = false
L['Howling Fjord'] = false
L['Icecrown'] = false
L['In Defense of Halaa'] = 'Zur Verteidigung von Halaa'
L['Infused Mushroom Meatloaf'] = false
L['Insult Coren Direbrew'] = 'Beleidigt Coren Düsterbräu'
L['Intelligence Gathering'] = false
L['Intercept the Reinforcements'] = 'Haltet die Verstärkung auf'
L['Intercepting the Mana Cells'] = 'Manazellen abfangen'
L['Ironforge'] = false
L['Isle of Quel\'Danas'] = false
L['Ivus the Forest Lord'] = 'Ivus der Waldfürst'
L['Jewelcrafting'] = false
L['Jinxing the Walls'] = false
L['Junkboxes Needed'] = false
L['Kartak\'s Rampage'] = false
L['Keep \'Em on Their Heels'] = false
L['Keep Them at Bay'] = false
L['Keep Them at Bay!'] = false
L['Keepers of Time'] = false
L['Keeping the Alliance Blind'] = false
L['Keeping the Enemy at Bay'] = 'Den Feind vom Leibe halten'
L['Kick \'Em While They\'re Down'] = false
L['King of the Mountain'] = false
L['Kirin Tor'] = false
L['Knights of the Ebon Blade'] = false
L['Know Your Ley Lines'] = 'Kenne deine Leylinien'
L['Kurenai'] = false
L['Leave Our Mark'] = false
L['Libram of Focus'] = 'Buchband des Fokus'
L['Libram of Protection'] = 'Buchband des Schutzes'
L['Libram of Rapidity'] = 'Buchband der Schnelligkeit'
L['Life or Death'] = false
L['Lokholar the Ice Lord'] = 'Lokholar der Eislord'
L['Lower City'] = false
L['Maintaining Discipline'] = false
L['Maintaining the Sunwell Portal'] = 'Das Sonnenbrunnenportal aufrechterhalten'
L['Make Them Pay!'] = false
L['Making Ready'] = 'Vorbereitungen'
L['Making Repairs'] = false
L['Manalicious'] = 'Manaziös'
L['Mastery of the Crystals'] = false
L['Midsummer Fire Festival'] = false
L['More Armor Scraps'] = 'Mehr Rüstungsfetzen'
L['More Booty!'] = 'Mehr Beute!'
L['More Crystal Fragments'] = 'Noch mehr Kristallfragmente'
L['More Feathers'] = 'Mehr Federn'
L['More Firewing Signets'] = 'Mehr Siegel der Feuerschwingen'
L['More Heads Full of Ivory'] = 'Noch mehr Elfenbein'
L['More Marks of Kil\'jaeden'] = 'Mehr Male von Kil\'jaeden'
L['More Marks of Sargeras'] = 'Mehr Male des Sargeras'
L['More Obsidian Warbeads'] = 'Noch mehr Obsidiankriegsperlen'
L['More Sunfury Signets'] = 'Mehr Siegel des Sonnenzorns'
L['More Torch Catching'] = 'Noch einmal Fackeln fangen'
L['More Torch Tossing'] = 'Noch einmal Fackeln werfen'
L['More Warbeads'] = 'Mehr Kriegsperlen'
L['More Warbeads!'] = 'Mehr Kriegsperlen!'
L['Morrowgrain to Darnassus'] = 'Morgenkorn nach Darnassus'
L['Morrowgrain to Feathermoon Stronghold'] = 'Morgenkorn für die Mondfederfeste'
L['Morrowgrain to Thunder Bluff'] = 'Morgenkorn nach Donnerfels'
L['Mustard Dogs!'] = false
L['Nagrand'] = false
L['Natural Enemies'] = 'Natürliche Feinde'
L['Nethercite Ore'] = 'Netheriterz'
L['Netherdust Pollen'] = 'Netherstaubpollen'
L['Nethermine Flayer Hide'] = 'Balg eines Netherminenschinders'
L['Netherstorm'] = false
L['Netherwing'] = false
L['Netherwing Crystals'] = 'Kristalle der Netherschwingen'
L['Neutralizing the Plague'] = false
L['No Fly Zone'] = false
L['No Mercy for the Merciless'] = false
L['No Mercy!'] = false
L['No Rest For The Wicked'] = false
L['Northrend'] = false
L['Not a Bug'] = false
L['Ogri\'la'] = false
L['Open for Business'] = 'Geschäft geöffnet'
L['Orgrimmar'] = false
L['Outland'] = false
L['Overstock'] = false
L['Overwhelmed!'] = false
L['Picking Up The Pieces...'] = 'Die Dinge in den Griff bekommen...'
L['Pieces Parts'] = false
L['Planning for the Future'] = false
L['Plants of Zangarmarsh'] = 'Pflanzen der Zangarmarschen'
L['Polishing the Helm'] = false
L['Power of the Great Ones'] = false
L['Preparing for War'] = 'Kriegsvorbereitungen'
L['Preparing for the Worst'] = false
L['Professions'] = false
L['Proof of Demise: Anub\'arak'] = false
L['Proof of Demise: Cyanigosa'] = false
L['Proof of Demise: Gal\'darah'] = false
L['Proof of Demise: Herald Volazj'] = false
L['Proof of Demise: Ingvar the Plunderer'] = false
L['Proof of Demise: Keristrasza'] = false
L['Proof of Demise: King Ymiron'] = false
L['Proof of Demise: Ley-Guardian Eregos'] = false
L['Proof of Demise: Loken'] = false
L['Proof of Demise: Mal\'Ganis'] = false
L['Proof of Demise: Sjonnir The Ironshaper'] = false
L['Proof of Demise: The Prophet Tharon\'ja'] = false
L['Pushed Too Far'] = false
L['Putting the Hertz: The Valley of Lost Hope'] = false
L['Ram Hide Harnesses'] = 'Widderledernes Zaumzeug'
L['Ram Riding Harnesses'] = 'Widderzaumzeug'
L['Rampaging Giants'] = 'Tobende Riesen'
L['Ratchet'] = false
L['Ravenholdt'] = false
L['Rediscovering Your Roots'] = 'Eure Wurzeln wiederentdecken'
L['Refuel for the Zapping'] = 'Neuer Treibstoff fürs Schrumpfen'
L['Rejek: First Blood'] = false
L['Restoring Fiery Flux Supplies via Heavy Leather'] = 'Nachschub an feurigem Fluxus= Schweres Leder'
L['Restoring Fiery Flux Supplies via Iron'] = 'Nachschub an feurigem Fluxus= Eisen'
L['Restoring Fiery Flux Supplies via Kingsblood'] = 'Nachschub an feurigem Fluxus= Königsblut'
L['Retest Now'] = false
L['Revenge is Tasty'] = 'Rache ist süß'
L['Riding the Red Rocket'] = false
L['Riding the Wavelength: The Bombardment'] = false
L['Sandfury, Skullsplitter, and Bloodscalp Coins'] = 'Münzen der Sandwüter, Schädelspalter und Blutskalpe'
L['Seared Scourge'] = false
L['Seasonal'] = false
L['Secret Strength of the Frenzyheart'] = false
L['Secrets of the Qiraji'] = 'Geheimnisse der Qiraji'
L['Sewer Stew'] = false
L['Sha\'tari Skyguard'] = false
L['Shadowmoon Valley'] = false
L['Shattered Sun Offensive'] = false
L['Shattrath City'] = false
L['Shen\'dralar'] = false
L['Shipment: Blood Jade Amulet '] = false
L['Shipment: Bright Armor Relic'] = false
L['Shipment: Glowing Ivory Figurine'] = false
L['Shipment: Intricate Bone Figurine'] = false
L['Shipment: Shifting Sun Curio '] = false
L['Shipment: Wicked Sun Brooch '] = false
L['Sholazar Basin'] = false
L['Shoot \'Em Up'] = false
L['Shred the Alliance'] = false
L['Shredder Repair'] = false
L['Shrimpin\' Ain\'t Easy'] = 'Garnelenfangen ist nicht einfach'
L['Silvermoon City'] = false
L['Single Firewing Signet'] = false
L['Single Mark of Kil\'jaeden'] = false
L['Single Mark of Sargeras'] = false
L['Single Sunfury Signet'] = false
L['Skettis'] = false
L['Slaves to Saronite'] = false
L['Slay them all!'] = false
L['Smash the Pumpkin'] = 'Zermatsch den Kürbis'
L['Smoke \'Em Out'] = false
L['Song of Fecundity'] = false
L['Song of Reflection'] = false
L['Song of Wind and Water'] = false
L['Soup for the Soul'] = 'Suppe für die Seele'
L['Spirits of Auchindoun'] = 'Geister von Auchindoun'
L['Sporeggar'] = false
L['Spy Hunter'] = false
L['Static Shock Troops: the Bombardment'] = false
L['Steel Gate Patrol'] = false
L['Stop the Fires!'] = 'Löscht das Feuer!'
L['Stop the Siege'] = false
L['Stormpike Guard'] = false
L['Stormwind'] = false
L['Strained Supplies'] = 'Schwindende Vorräte'
L['Strength of the Tempest'] = false
L['Striking Back'] = 'Zurückschlagen'
L['Summon Ahune'] = 'Beschwört Ahune'
L['Sunfury Attack Plans'] = 'Angriffspläne des Sonnenzorns'
L['Super Hot Stew'] = 'Superheißes Ragout'
L['Syndicate'] = false
L['Syndicate Emblems'] = 'Syndikatsembleme'
L['Synthesis of Power'] = 'Bündelung der Macht'
L['Taking the Harbor'] = 'Den Hafen einnehmen'
L['Terokkar Forest'] = false
L['That\'s Abominable!'] = false
L['The Aberrations Must Die'] = false
L['The Air Strikes Must Continue'] = 'Die Luftangriffe müssen weitergehen'
L['The Alchemist\'s Apprentice'] = false
L['The Aldor'] = false
L['The Battle Must Go On'] = 'Die Schlacht muss weitergehen'
L['The Battle for the Sun\'s Reach Armory'] = 'Die Schlacht um die Waffenkammer der Sonnenweiten'
L['The Booterang: A Cure For The Common Worthless Peon'] = 'Der Schuhmerang= Das Mittel gegen den wertlosen Peon'
L['The Consortium'] = false
L['The Deadliest Trap Ever Laid'] = 'Die tödlichste Falle aller Zeiten'
L['The Frostborn'] = false
L['The Heartblood\'s Strength'] = false
L['The Kalu\'ak'] = false
L['The Lost Supplies'] = 'Die verlorenen Vorräte'
L['The Mag\'har'] = false
L['The Multiphase Survey'] = 'Die Multiphasen-Vermessung'
L['The Not-So-Friendly Skies...'] = 'Ein Schatten am Horizont'
L['The One That Got Away'] = 'Der Eine, der entkam'
L['The Oracles'] = false
L['The Relic\'s Emanation'] = 'Die Strahlung des Relikts'
L['The Sanctum Wards'] = 'Die Barrieren des Sanktums'
L['The Scryers'] = false
L['The Sha\'tar'] = false
L['The Solution Solution'] = false
L['The Sons of Hodir'] = false
L['The Storm Peaks'] = false
L['The Way to His Heart...'] = false
L['The Wyrmrest Accord'] = false
L['Thorium Brotherhood'] = false
L['Thrallmar'] = false
L['Thrusting Hodir\'s Spear'] = false
L['Thunder Bluff'] = false
L['Timbermaw Hold'] = false
L['Timear Foresees Centrifuge Constructs in your Future!'] = false
L['Timear Foresees Infinite Agents in your Future!'] = false
L['Timear Foresees Titanium Vanguards in your Future!'] = false
L['Timear Foresees Ymirjar Berserkers in your Future!'] = false
L['Tools of War'] = false
L['Total Ohmage: The Valley of Lost Hope!'] = false
L['Troll Patrol'] = false
L['Troll Patrol: Can You Dig It?'] = false
L['Troll Patrol: Couldn\'t Care Less'] = false
L['Troll Patrol: Creature Comforts'] = false
L['Troll Patrol: Done to Death'] = false
L['Troll Patrol: High Standards'] = false
L['Troll Patrol: Intestinal Fortitude'] = false
L['Troll Patrol: Something for the Pain'] = false
L['Troll Patrol: The Alchemist\'s Apprentice'] = false
L['Troll Patrol: Throwing Down'] = false
L['Troll Patrol: Whatdya Want, a Medal?'] = false
L['Uncatalogued Species'] = 'Nicht katalogisierte Gattung'
L['Undercity'] = false
L['Valiance Expedition'] = false
L['Victory in Wintergrasp'] = false
L['Vile Like Fire!'] = false
L['Volatility'] = false
L['Voren\'thal\'s Visions'] = 'Voren\'thals Visionen'
L['Wanted: A Black Stalker Egg'] = 'Gesucht= Ei der Schattenmutter'
L['Wanted: A Warp Splinter Clipping'] = 'Gesucht= Warpzweigsplitter'
L['Wanted: Aeonus\'s Hourglass'] = 'Gesucht= Aeonus\' Stundenglas'
L['Wanted: Arcatraz Sentinels'] = 'Gesucht= Schildwachen der Arkatraz'
L['Wanted: Bladefist\'s Seal'] = 'Gesucht= Messerfausts Siegel'
L['Wanted: Coilfang Myrmidons'] = 'Gesucht= Myrmidonen des Echsenkessels'
L['Wanted: Keli\'dan\'s Feathered Stave'] = 'Gesucht= Keli\'dans gefiederter Stab'
L['Wanted: Malicious Instructors'] = 'Gesucht= Bösartige Ausbilderinnen'
L['Wanted: Murmur\'s Whisper'] = 'Gesucht= Murmurs Flüstern'
L['Wanted: Nazan\'s Riding Crop'] = 'Gesucht= Nazans Reitgerte'
L['Wanted: Pathaleon\'s Projector'] = 'Gesucht= Pathaleons Projektionsgerät'
L['Wanted: Rift Lords'] = 'Gesucht= Fürsten der Zeitenrisse'
L['Wanted: Shaffar\'s Wondrous Pendant'] = 'Gesucht= Shaffars wundersames Amulett'
L['Wanted: Shattered Hand Centurions'] = 'Gesucht= Zenturionen der Zerschmetterten Hand'
L['Wanted: Sisters of Torment'] = 'Gesucht= Schwestern der Qual'
L['Wanted: Sunseeker Channelers'] = 'Gesucht= Kanalisierer der Sonnensucher'
L['Wanted: Tempest-Forge Destroyers'] = 'Gesucht= Zerstörer der Sturmschmiede'
L['Wanted: The Epoch Hunter\'s Head'] = 'Gesucht= Der Kopf des Epochenjägers'
L['Wanted: The Exarch\'s Soul Gem'] = 'Gesucht= Der Seelenedelstein des Exarchen'
L['Wanted: The Headfeathers of Ikiss'] = 'Gesucht= Die Kopfschmuckfedern von Ikiss'
L['Wanted: The Heart of Quagmirran'] = 'Gesucht= Das Herz von Quagmirran'
L['Wanted: The Scroll of Skyriss'] = 'Gesucht= Horizontiss\' Schriftrolle'
L['Wanted: The Signet Ring of Prince Kael\'thas'] = 'Gesucht= Der Siegelring von Prinz Kael\'thas'
L['Wanted: The Warlord\'s Treatise'] = 'Gesucht= Die Aufzeichnungen des Kriegsherren'
L['Warding the Walls'] = false
L['Warding the Warriors'] = false
L['Warsong Gulch'] = false
L['Warsong Offensive'] = false
L['Water Pouch Bounty'] = 'Wasserbeutelkopfgeld'
L['Will of the Titans'] = false
L['Winterfall Intrusion'] = 'Eindringlinge der Winterfelle'
L['Wintergrasp'] = false
L['Wintersaber Trainers'] = false
L['Wrangle More Aether Rays!'] = 'Bändigt noch mehr Ätherrochen!'
L['Your Continued Support'] = 'Eure weitere Unterstützung'
L['Zandalar Tribe'] = false
L['Zul\'Drak'] = false
L['Zulian, Razzashi, and Hakkari Coins'] = 'Münzen der Razzashi, Hakkari und zulianische Münzen'
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/locales/quest/zhCN.lua New file
0,0 → 1,407
--[[ (Generated by Babelfish script)
 
ATTENTION: DO NOT MANUALLY ADD/EDIT THESE SCRIPT GENERATED LOCALES
 
]] local L = LibStub("AceLocale-3.0"):NewLocale("EasyDaily_Quest", "zhCN"); if not L then return end
 
L['"Let the Fires Come!"'] = false
L['A Bad Egg'] = false
L['A Charitable Donation'] = false
L['A Cleansing Light'] = false
L['A Cleansing Song'] = false
L['A Fine Egg'] = false
L['A Gallon of Blood'] = false
L['A Hero\'s Headgear'] = false
L['A Rare Herb'] = false
L['A Slow Death'] = false
L['Aces High!'] = false
L['Additional Runecloth'] = false
L['Again With the Zapped Giants'] = false
L['All Things in Good Time'] = false
L['Alliance Vanguard'] = false
L['Alterac Valley'] = false
L['An Extraordinary Egg'] = false
L['An Ordinary Egg'] = false
L['Another Heap of Ethereals'] = false
L['Appeasing the Great Rain Stone'] = false
L['Arathi Basin'] = false
L['Argent Crusade'] = false
L['Arm the Wards!'] = false
L['Assault by Air'] = false
L['Assault by Ground'] = false
L['Ata\'mal Armaments'] = false
L['Back to the Pit'] = false
L['Bait Bandits'] = false
L['Banish More Demons'] = false
L['Bark for Drohn\'s Distillery!'] = false
L['Bark for T\'chali\'s Voodoo Brewery!'] = false
L['Bark for the Barleybrews!'] = false
L['Bark for the Thunderbrews!'] = false
L['Battlegrounds'] = false
L['Beads for Salfa'] = false
L['Blackriver Brawl'] = false
L['Blackriver Skirmish'] = false
L['Blade\'s Edge Mountains'] = false
L['Blast the Gateway'] = false
L['Blood for Blood'] = false
L['Blood of the Chosen'] = false
L['Blowing Hodir\'s Horn'] = false
L['Bomb Them Again!'] = false
L['Bones and Arrows'] = false
L['Booty Bay'] = false
L['Borean Tundra'] = false
L['Break the Blockade'] = false
L['Brewfest'] = false
L['Bring Me A Shrubbery!'] = false
L['Brood of Nozdormu'] = false
L['Call the Headless Horseman'] = false
L['Call to Arms: Alterac Valley'] = false
L['Call to Arms: Arathi Basin'] = false
L['Call to Arms: Eye of the Storm'] = false
L['Call to Arms: Warsong Gulch'] = false
L['Capture More Dispatches'] = false
L['Cenarion Circle'] = false
L['Cenarion Expedition'] = false
L['Cheese for Glowergold'] = false
L['Chen\'s Empty Keg'] = false
L['Chicken Party!'] = false
L['Coldarra'] = false
L['Congratulations!'] = false
L['Convention at the Legerdemain'] = false
L['Cooking'] = false
L['Crocolisks in the City'] = false
L['Crush Captain Brightwater!'] = false
L['Crush the Dawnblade'] = false
L['Crystal Cluster'] = false
L['Darkspear Trolls'] = false
L['Darnassus'] = false
L['Defend the Siege'] = false
L['Defending Wyrmrest Temple'] = false
L['Defending Your Title'] = false
L['Discovering Your Roots'] = false
L['Disrupt the Greengill Coast'] = false
L['Disrupting the Twilight Portal'] = false
L['Distraction at the Dead Scar'] = false
L['Don\'t Stop Now....'] = false
L['Down With Captain Zorna!'] = false
L['Drag and Drop'] = false
L['Dragonblight'] = false
L['Dragons are the Least of Our Problems'] = false
L['Drake Hunt'] = false
L['Dungeon'] = false
L['Dungeons'] = false
L['Eastern Kingdoms'] = false
L['Empty Stables'] = false
L['Encrypted Twilight Texts'] = false
L['Enemies, Old and New'] = false
L['Erratic Behavior'] = false
L['Escape from Skettis'] = false
L['Everlook'] = false
L['Exodar'] = false
L['Explorers\' League'] = false
L['Eye of the Storm'] = false
L['Favor Amongst the Brotherhood, Blood of the Mountain'] = false
L['Favor Amongst the Brotherhood, Core Leather'] = false
L['Favor Amongst the Brotherhood, Dark Iron Ore'] = false
L['Favor Amongst the Brotherhood, Fiery Core'] = false
L['Favor Amongst the Brotherhood, Lava Core'] = false
L['Feathers for Grazle'] = false
L['Feathers for Nafien'] = false
L['Feeding Arngrim'] = false
L['Felblood Fillet'] = false
L['Fertile Spores'] = false
L['Fires Over Skettis'] = false
L['Fishing'] = false
L['Frenzyheart Champion'] = false
L['Frenzyheart Tribe'] = false
L['From Their Corpses, Rise!'] = false
L['Frostsaber Provisions'] = false
L['Frostwolf Clan'] = false
L['Fueling the Demolishers'] = false
L['Further Conversions'] = false
L['Gadgetzan'] = false
L['Gaining Acceptance'] = false
L['Gaining the Advantage'] = false
L['Glowcap Mushrooms'] = false
L['Gnomeregan Exiles'] = false
L['Grizzly Hills'] = false
L['Gurubashi, Vilebranch, and Witherbark Coins'] = false
L['Hallow\'s End'] = false
L['Hand of the Oracles'] = false
L['Healing with Roses'] = false
L['Hellfire Fortifications'] = false
L['Hellfire Peninsula'] = false
L['Heroic'] = false
L['Honor Hold'] = false
L['Horde Expedition'] = false
L['Hot and Cold'] = false
L['Howling Fjord'] = false
L['Icecrown'] = false
L['In Defense of Halaa'] = false
L['Infused Mushroom Meatloaf'] = false
L['Insult Coren Direbrew'] = false
L['Intelligence Gathering'] = false
L['Intercept the Reinforcements'] = false
L['Intercepting the Mana Cells'] = false
L['Ironforge'] = false
L['Isle of Quel\'Danas'] = false
L['Ivus the Forest Lord'] = false
L['Jewelcrafting'] = false
L['Jinxing the Walls'] = false
L['Junkboxes Needed'] = false
L['Kartak\'s Rampage'] = false
L['Keep \'Em on Their Heels'] = false
L['Keep Them at Bay'] = false
L['Keep Them at Bay!'] = false
L['Keepers of Time'] = false
L['Keeping the Alliance Blind'] = false
L['Keeping the Enemy at Bay'] = false
L['Kick \'Em While They\'re Down'] = false
L['King of the Mountain'] = false
L['Kirin Tor'] = false
L['Knights of the Ebon Blade'] = false
L['Know Your Ley Lines'] = false
L['Kurenai'] = false
L['Leave Our Mark'] = false
L['Libram of Focus'] = false
L['Libram of Protection'] = false
L['Libram of Rapidity'] = false
L['Life or Death'] = false
L['Lokholar the Ice Lord'] = false
L['Lower City'] = false
L['Maintaining Discipline'] = false
L['Maintaining the Sunwell Portal'] = false
L['Make Them Pay!'] = false
L['Making Ready'] = false
L['Making Repairs'] = false
L['Manalicious'] = false
L['Mastery of the Crystals'] = false
L['Midsummer Fire Festival'] = false
L['More Armor Scraps'] = false
L['More Booty!'] = false
L['More Crystal Fragments'] = false
L['More Feathers'] = false
L['More Firewing Signets'] = false
L['More Heads Full of Ivory'] = false
L['More Marks of Kil\'jaeden'] = false
L['More Marks of Sargeras'] = false
L['More Obsidian Warbeads'] = false
L['More Sunfury Signets'] = false
L['More Torch Catching'] = false
L['More Torch Tossing'] = false
L['More Warbeads'] = false
L['More Warbeads!'] = false
L['Morrowgrain to Darnassus'] = false
L['Morrowgrain to Feathermoon Stronghold'] = false
L['Morrowgrain to Thunder Bluff'] = false
L['Mustard Dogs!'] = false
L['Nagrand'] = false
L['Natural Enemies'] = false
L['Nethercite Ore'] = false
L['Netherdust Pollen'] = false
L['Nethermine Flayer Hide'] = false
L['Netherstorm'] = false
L['Netherwing'] = false
L['Netherwing Crystals'] = false
L['Neutralizing the Plague'] = false
L['No Fly Zone'] = false
L['No Mercy for the Merciless'] = false
L['No Mercy!'] = false
L['No Rest For The Wicked'] = false
L['Northrend'] = false
L['Not a Bug'] = false
L['Ogri\'la'] = false
L['Open for Business'] = false
L['Orgrimmar'] = false
L['Outland'] = false
L['Overstock'] = false
L['Overwhelmed!'] = false
L['Picking Up The Pieces...'] = false
L['Pieces Parts'] = false
L['Planning for the Future'] = false
L['Plants of Zangarmarsh'] = false
L['Polishing the Helm'] = false
L['Power of the Great Ones'] = false
L['Preparing for War'] = false
L['Preparing for the Worst'] = false
L['Professions'] = false
L['Proof of Demise: Anub\'arak'] = false
L['Proof of Demise: Cyanigosa'] = false
L['Proof of Demise: Gal\'darah'] = false
L['Proof of Demise: Herald Volazj'] = false
L['Proof of Demise: Ingvar the Plunderer'] = false
L['Proof of Demise: Keristrasza'] = false
L['Proof of Demise: King Ymiron'] = false
L['Proof of Demise: Ley-Guardian Eregos'] = false
L['Proof of Demise: Loken'] = false
L['Proof of Demise: Mal\'Ganis'] = false
L['Proof of Demise: Sjonnir The Ironshaper'] = false
L['Proof of Demise: The Prophet Tharon\'ja'] = false
L['Pushed Too Far'] = false
L['Putting the Hertz: The Valley of Lost Hope'] = false
L['Ram Hide Harnesses'] = false
L['Ram Riding Harnesses'] = false
L['Rampaging Giants'] = false
L['Ratchet'] = false
L['Ravenholdt'] = false
L['Rediscovering Your Roots'] = false
L['Refuel for the Zapping'] = false
L['Rejek: First Blood'] = false
L['Restoring Fiery Flux Supplies via Heavy Leather'] = false
L['Restoring Fiery Flux Supplies via Iron'] = false
L['Restoring Fiery Flux Supplies via Kingsblood'] = false
L['Retest Now'] = false
L['Revenge is Tasty'] = false
L['Riding the Red Rocket'] = false
L['Riding the Wavelength: The Bombardment'] = false
L['Sandfury, Skullsplitter, and Bloodscalp Coins'] = false
L['Seared Scourge'] = false
L['Seasonal'] = false
L['Secret Strength of the Frenzyheart'] = false
L['Secrets of the Qiraji'] = false
L['Sewer Stew'] = false
L['Sha\'tari Skyguard'] = false
L['Shadowmoon Valley'] = false
L['Shattered Sun Offensive'] = false
L['Shattrath City'] = false
L['Shen\'dralar'] = false
L['Shipment: Blood Jade Amulet '] = false
L['Shipment: Bright Armor Relic'] = false
L['Shipment: Glowing Ivory Figurine'] = false
L['Shipment: Intricate Bone Figurine'] = false
L['Shipment: Shifting Sun Curio '] = false
L['Shipment: Wicked Sun Brooch '] = false
L['Sholazar Basin'] = false
L['Shoot \'Em Up'] = false
L['Shred the Alliance'] = false
L['Shredder Repair'] = false
L['Shrimpin\' Ain\'t Easy'] = false
L['Silvermoon City'] = false
L['Single Firewing Signet'] = false
L['Single Mark of Kil\'jaeden'] = false
L['Single Mark of Sargeras'] = false
L['Single Sunfury Signet'] = false
L['Skettis'] = false
L['Slaves to Saronite'] = false
L['Slay them all!'] = false
L['Smash the Pumpkin'] = false
L['Smoke \'Em Out'] = false
L['Song of Fecundity'] = false
L['Song of Reflection'] = false
L['Song of Wind and Water'] = false
L['Soup for the Soul'] = false
L['Spirits of Auchindoun'] = false
L['Sporeggar'] = false
L['Spy Hunter'] = false
L['Static Shock Troops: the Bombardment'] = false
L['Steel Gate Patrol'] = false
L['Stop the Fires!'] = false
L['Stop the Siege'] = false
L['Stormpike Guard'] = false
L['Stormwind'] = false
L['Strained Supplies'] = false
L['Strength of the Tempest'] = false
L['Striking Back'] = false
L['Summon Ahune'] = false
L['Sunfury Attack Plans'] = false
L['Super Hot Stew'] = false
L['Syndicate'] = false
L['Syndicate Emblems'] = false
L['Synthesis of Power'] = false
L['Taking the Harbor'] = false
L['Terokkar Forest'] = false
L['That\'s Abominable!'] = false
L['The Aberrations Must Die'] = false
L['The Air Strikes Must Continue'] = false
L['The Alchemist\'s Apprentice'] = false
L['The Aldor'] = false
L['The Battle Must Go On'] = false
L['The Battle for the Sun\'s Reach Armory'] = false
L['The Booterang: A Cure For The Common Worthless Peon'] = false
L['The Consortium'] = false
L['The Deadliest Trap Ever Laid'] = false
L['The Frostborn'] = false
L['The Heartblood\'s Strength'] = false
L['The Kalu\'ak'] = false
L['The Lost Supplies'] = false
L['The Mag\'har'] = false
L['The Multiphase Survey'] = false
L['The Not-So-Friendly Skies...'] = false
L['The One That Got Away'] = false
L['The Oracles'] = false
L['The Relic\'s Emanation'] = false
L['The Sanctum Wards'] = false
L['The Scryers'] = false
L['The Sha\'tar'] = false
L['The Solution Solution'] = false
L['The Sons of Hodir'] = false
L['The Storm Peaks'] = false
L['The Way to His Heart...'] = false
L['The Wyrmrest Accord'] = false
L['Thorium Brotherhood'] = false
L['Thrallmar'] = false
L['Thrusting Hodir\'s Spear'] = false
L['Thunder Bluff'] = false
L['Timbermaw Hold'] = false
L['Timear Foresees Centrifuge Constructs in your Future!'] = false
L['Timear Foresees Infinite Agents in your Future!'] = false
L['Timear Foresees Titanium Vanguards in your Future!'] = false
L['Timear Foresees Ymirjar Berserkers in your Future!'] = false
L['Tools of War'] = false
L['Total Ohmage: The Valley of Lost Hope!'] = false
L['Troll Patrol'] = false
L['Troll Patrol: Can You Dig It?'] = false
L['Troll Patrol: Couldn\'t Care Less'] = false
L['Troll Patrol: Creature Comforts'] = false
L['Troll Patrol: Done to Death'] = false
L['Troll Patrol: High Standards'] = false
L['Troll Patrol: Intestinal Fortitude'] = false
L['Troll Patrol: Something for the Pain'] = false
L['Troll Patrol: The Alchemist\'s Apprentice'] = false
L['Troll Patrol: Throwing Down'] = false
L['Troll Patrol: Whatdya Want, a Medal?'] = false
L['Uncatalogued Species'] = false
L['Undercity'] = false
L['Valiance Expedition'] = false
L['Victory in Wintergrasp'] = false
L['Vile Like Fire!'] = false
L['Volatility'] = false
L['Voren\'thal\'s Visions'] = false
L['Wanted: A Black Stalker Egg'] = false
L['Wanted: A Warp Splinter Clipping'] = false
L['Wanted: Aeonus\'s Hourglass'] = false
L['Wanted: Arcatraz Sentinels'] = false
L['Wanted: Bladefist\'s Seal'] = false
L['Wanted: Coilfang Myrmidons'] = false
L['Wanted: Keli\'dan\'s Feathered Stave'] = false
L['Wanted: Malicious Instructors'] = false
L['Wanted: Murmur\'s Whisper'] = false
L['Wanted: Nazan\'s Riding Crop'] = false
L['Wanted: Pathaleon\'s Projector'] = false
L['Wanted: Rift Lords'] = false
L['Wanted: Shaffar\'s Wondrous Pendant'] = false
L['Wanted: Shattered Hand Centurions'] = false
L['Wanted: Sisters of Torment'] = false
L['Wanted: Sunseeker Channelers'] = false
L['Wanted: Tempest-Forge Destroyers'] = false
L['Wanted: The Epoch Hunter\'s Head'] = false
L['Wanted: The Exarch\'s Soul Gem'] = false
L['Wanted: The Headfeathers of Ikiss'] = false
L['Wanted: The Heart of Quagmirran'] = false
L['Wanted: The Scroll of Skyriss'] = false
L['Wanted: The Signet Ring of Prince Kael\'thas'] = false
L['Wanted: The Warlord\'s Treatise'] = false
L['Warding the Walls'] = false
L['Warding the Warriors'] = false
L['Warsong Gulch'] = false
L['Warsong Offensive'] = false
L['Water Pouch Bounty'] = false
L['Will of the Titans'] = false
L['Winterfall Intrusion'] = false
L['Wintergrasp'] = false
L['Wintersaber Trainers'] = false
L['Wrangle More Aether Rays!'] = false
L['Your Continued Support'] = false
L['Zandalar Tribe'] = false
L['Zul\'Drak'] = false
L['Zulian, Razzashi, and Hakkari Coins'] = false
Property changes : Added: svn:mergeinfo
EasyDaily-Beta/EasyDaily.lua New file
0,0 → 1,612
--[[ ]]
EasyDaily = LibStub("AceAddon-3.0"):NewAddon("EasyDaily", "AceEvent-3.0", "AceBucket-3.0", "AceConsole-3.0", "AceHook-3.0", "AceTimer-3.0")
--[[
 
]]
 
local MAJOR, MINOR, REVISION = 1, 5, ("$Revision$"):match("(%d+)")
local VERSION = string.format("%s.%s.%s", MAJOR, MINOR, REVISION)
local RESETDB = 4
 
local L = LibStub("AceLocale-3.0"):GetLocale("EasyDaily_Base")
local QD = LibStub("AceLocale-3.0"):GetLocale("EasyDaily_Quest")
 
local _G = _G
 
--------------------------------------------------------------------------------------------------
-- Local Functions & Variables
--------------------------------------------------------------------------------------------------
 
EasyDaily.vars = {}
EasyDaily.vars.current = {}
EasyDaily.vars.options = {}
 
local function Print(...)
EasyDaily:Print(...)
end
 
local function Debug(...)
if EasyDaily.db and EasyDaily.db.profile and EasyDaily.db.profile.debug then
if Experimental and Experimental.PrintLiteral then
Experimental:PrintLiteral("Debug:", ...)
else
EasyDaily:Print("Debug:", ...)
end
end
end
 
local function CleanTable(t)
for i, v in pairs(t) do
if type(v) == "table" then
CleanTable(t[i])
else
t[i] = nil
end
end
end
 
local Gratuity = LibStub("LibGratuity-3.0")
 
--------------------------------------------------------------------------------------------------
-- Quest Table / Profile Defaults
--------------------------------------------------------------------------------------------------
 
local LOCALE = GetLocale()
 
local defaults = {
global = {},
profile = {
single = true,
multiple = true,
gossip = true,
pause = false,
autocheck = false,
overridemodifier = "Shift",
suspendmodifier = "Alt",
skipflag = false,
minimapIcon = {},
data = {
custom = {},
},
},
char = {
reward = {},
},
}
 
--------------------------------------------------------------------------------------------------
-- Enable/Disable
--------------------------------------------------------------------------------------------------
 
function EasyDaily:OnInitialize()
 
defaults.profile.data.standard = self:GetQuestData()
 
self.db = LibStub("AceDB-3.0"):New("EasyDailyDB", defaults, "Default")
 
if ( not self.db.global.resetDB ) or self.db.global.resetDB < RESETDB then
self.db:ResetDB("Default")
Print("Saved variables reset to default.")
self.db.global.resetDB = RESETDB
end
 
self.vars.version = string.format("v%s.%s.%s", MAJOR, MINOR, REVISION)
 
self.db.global.locale = LOCALE
 
self.vars.getlocales = {}
 
self:CheckLocalization()
 
self:SetupOptions()
 
for i = 1, NUMGOSSIPBUTTONS, 1 do
local b = _G[ "GossipTitleButton" .. i ]
b:RegisterForClicks("LeftButtonUp", "RightButtonUp")
end
for i = 1, MAX_NUM_QUESTS, 1 do
local b = _G[ "QuestTitleButton" .. i ]
b:RegisterForClicks("LeftButtonUp", "RightButtonUp")
b:SetScript("OnClick", function(...)
QuestTitleButton_OnClick(...)
end)
end
 
end
 
function EasyDaily:OnEnable()
 
self:RegisterEvent("QUEST_GREETING")
self:RegisterEvent("GOSSIP_SHOW")
self:RegisterEvent("QUEST_DETAIL")
self:RegisterEvent("QUEST_PROGRESS")
self:RegisterEvent("QUEST_COMPLETE")
self:RegisterEvent("UPDATE_MOUSEOVER_UNIT")
 
self:RegisterBucketEvent({
"QUEST_FINISHED",
"GOSSIP_CLOSED",
}, .15, "CloseFrameBucket")
 
self:Hook("GetQuestReward", true)
 
self:RawHook("GetActiveTitle", true)
self:RawHook("GetAvailableTitle", true)
 
self:RawHook("GossipTitleButton_OnClick", true)
self:RawHook("QuestTitleButton_OnClick", true)
self:RawHook("GossipFrameAvailableQuestsUpdate", true)
self:RawHook("GossipFrameActiveQuestsUpdate", true)
 
--~ self:Hook("SelectGossipOption", true)
 
end
 
function EasyDaily:OnDisable()
 
self:UnregisterEvent("QUEST_GREETING")
self:UnregisterEvent("GOSSIP_SHOW")
self:UnregisterEvent("QUEST_DETAIL")
self:UnregisterEvent("QUEST_PROGRESS")
self:UnregisterEvent("QUEST_COMPLETE")
self:UnregisterEvent("UPDATE_MOUSEOVER_UNIT")
 
self:UnregisterBucket("CloseFrameBucket")
 
self:Unhook("GetQuestReward")
 
self:Unhook("GetActiveTitle")
self:Unhook("GetAvailableTitle")
 
self:Unhook("GossipTitleButton_OnClick")
self:Unhook("QuestTitleButton_OnClick")
self:Unhook("GossipFrameAvailableQuestsUpdate")
self:Unhook("GossipFrameActiveQuestsUpdate")
 
--~ self:Unhook("SelectGossipOption")
 
end
 
--------------------------------------------------------------------------------------------------
-- Quest Title Localization
--------------------------------------------------------------------------------------------------
 
--~ RegisterLinkType( { linkid = "gfunc", linkfunc = function(...)
--~ Print(...)
--~ return false
--~ end }, "Basic" )
 
RegisterLinkType( { linkid = "edlocale", linkfunc = function(...)
Print(L["Localizing quests. This may take a while."])
EasyDaily:BuildLocalization()
return false
end }, "EasyDaily" )
 
RegisterLinkType({ linkid = "rldui", linkfunc = function(...)
_G.ReloadUI()
return false
end }, "EasyDaily")
 
function EasyDaily:CheckLocalization()
for i, t in pairs(self.db.profile.data.standard) do
if t.id and ( not t.title ) then
table.insert( self.vars.getlocales, t.id )
end
end
if #self.vars.getlocales > 0 then
if self.db.profile.autocheck then
self:BuildLocalization()
else
Print((L["The current locale is missing %d quest titles. Please click %s to localize them."]):format( #self.vars.getlocales, BuildLink("edlocale", "EasyDaily", L["Here"], "ffa0a0") ))
end
end
end
 
function EasyDaily:BuildLocalization()
if self.vars.lcheck then
local line = Gratuity:GetLine(1)
Debug("Link built: " .. tostring(line))
if line then
for i, t in pairs(self.db.profile.data.standard) do
if t.id and t.id == self.vars.getlocales[1] then
t.title = line
t.transid = t.id
end
end
table.remove(self.vars.getlocales, 1)
self.vars.lcheck = not self.vars.lcheck
end
else
Debug("Building link: " .. self.vars.getlocales[1])
Gratuity:SetHyperlink( "quest:" .. self.vars.getlocales[1] )
self.vars.lcheck = not self.vars.lcheck
end
if #self.vars.getlocales > 0 then
self:ScheduleTimer("BuildLocalization", 0.25)
else
self.vars.lcheck = nil
Print((L["Localization compeleted! Some options will still be disabled until you %s your UI."]):format( BuildLink("rldui", "EasyDaily", L["Reload"], "ffa0a0") ))
end
end
 
function EasyDaily:IsModifierKeyDown(mod)
local func = _G[ "Is" .. mod .. "KeyDown" ]
if func then
return func()
end
end
 
--------------------------------------------------------------------------------------------------
-- Quest/Gossip Change State
--------------------------------------------------------------------------------------------------
 
function EasyDaily:GossipTitleButton_OnClick(frame, button)
if button == "RightButton" then
if ( frame.type == "Available" ) then
local title = select( ( frame:GetID() - 1 ) * 3 + 1, GetGossipAvailableQuests() )
self:ToggleQuestState(title)
elseif ( frame.type == "Active" ) then
local title = select( ( frame:GetID() - 1 ) * 3 + 1, GetGossipActiveQuests() )
self:ToggleQuestState(title)
else
return
end
self:ClearCurrentInfo(true)
GossipFrameUpdate()
else
return self.hooks["GossipTitleButton_OnClick"](frame, button)
end
end
 
function EasyDaily:QuestTitleButton_OnClick(frame, button)
if button == "RightButton" then
if ( frame.isActive == 1 ) then
self:ToggleQuestState( self.hooks["GetActiveTitle"]( frame:GetID() ) )
else
self:ToggleQuestState( self.hooks["GetAvailableTitle"]( frame:GetID() ) )
end
self:ClearCurrentInfo(true)
QuestFrameGreetingPanel:Hide()
QuestFrameGreetingPanel:Show()
else
return self.hooks["QuestTitleButton_OnClick"](frame, button)
end
end
 
function EasyDaily:CanAutoTurnQuest(title)
return self:IsModifierKeyDown(self.db.profile.overridemodifier)
or ( ( not self:IsModifierKeyDown(self.db.profile.suspendmodifier) )
and ( ( not GossipFrame:IsShown() ) or self.db.profile.gossip )
and ( ( not self.db.profile.pause ) or self.vars.current.shown )
and ( self:IsActiveQuest(title) ) )
end
 
function EasyDaily:CanAdvanceGossip(title, isActive)
local t = self:GetQuestTableByTitle(title)
local s = self:CanAutoTurnQuest(title)
if s and ( ( t and t.repeatable ) or isActive ) then
local q = GetQuestLogSelection()
for i = 1, GetNumQuestLogEntries(), 1 do
local questTitle, _, _, _, isHeader, _, isComplete = GetQuestLogTitle(i)
if ( not isHeader ) and questTitle:find(title) then
SelectQuestLogEntry(i)
QuestLog_Update()
local numObj = GetNumQuestLeaderBoards()
SelectQuestLogEntry(q)
QuestLog_Update()
return ( numObj == 0 ) or ( isComplete and ( isComplete == 1 ) )
end
end
return self:QuestHasReqItems(title)
else
return s
end
end
 
--------------------------------------------------------------------------------------------------
-- Quest/Gossip Frame Events and Functions
--------------------------------------------------------------------------------------------------
 
function EasyDaily:QUEST_GREETING()
Debug("QUEST_GREETING")
local numActive = GetNumActiveQuests()
if ( numActive > 0 ) then
for i = 1, numActive, 1 do
local title = self.hooks["GetActiveTitle"](i)
if self:CanAdvanceGossip(title, true) then
Debug("Selecting Active")
return SelectActiveQuest(i)
end
end
end
local numAvailable = GetNumAvailableQuests()
if ( numAvailable > 0 ) then
for i = 1, numAvailable, 1 do
local title = self.hooks["GetAvailableTitle"](i)
if self:CanAdvanceGossip(title) then
Debug("Selecting Available")
return SelectAvailableQuest(i)
end
end
end
end
 
function EasyDaily:GOSSIP_SHOW()
Debug("GOSSIP_SHOW")
local j = { GetGossipActiveQuests() }
local k = 1
while j[k] do
Debug("Checking Active: ", j[k])
if self:CanAdvanceGossip(j[k], true) then
Debug("Selecting Active")
return SelectGossipActiveQuest( ( k + 2 ) / 3 )
end
k = k + 3
end
local v = { GetGossipAvailableQuests() }
local i = 1
while v[i] do
Debug("Checking Available: ", v[i])
if self:CanAdvanceGossip(v[i]) then
Debug("Selecting Available")
return SelectGossipAvailableQuest( ( i + 2 ) / 3 )
end
i = i + 3
end
end
 
function EasyDaily:QUEST_DETAIL(...)
Debug("QUEST_DETAIL")
if self:CanAutoTurnQuest( GetTitleText() ) then
if ( not self.db.profile.skipflag ) and QuestFlagsPVP() then
QuestFrame.dialog = StaticPopup_Show("CONFIRM_ACCEPT_PVP_QUEST")
else
AcceptQuest()
end
end
end
 
function EasyDaily:QUEST_PROGRESS()
Debug("QUEST_PROGRESS")
if self:CanAutoTurnQuest( GetTitleText() ) then
return CompleteQuest()
--~ local t = self:GetQuestTableByTitle(title)
--~ if t then
--~ t.itemreqs = {}
--~ for i = 1, GetNumQuestItems(), 1 do
--~ local _, _, num = GetQuestItemInfo("required", 1)
--~ local itemLink = GetQuestItemLink("required", i)
--~ local _, itemID = strsplit(":", string.match(itemLink, "^|c%x+|H(.+)|h%[.*%]") or "" )
--~ if itemID then
--~ table.insert( t.itemreqs, {itemID, num} )
--~ end
--~ end
--~ end
--~ return DeclineQuest()
end
end
 
function EasyDaily:QUEST_COMPLETE()
Debug("QUEST_COMPLETE")
local title = GetTitleText()
if self:CanAutoTurnQuest(title) then
local option
if GetNumQuestChoices() > 0 then
option = self.db.profile.multiple and self.db.char.reward[title]
elseif self.db.profile.single then
option = 0
end
if option then
GetQuestReward(option)
end
end
end
 
--[[
function EasyDaily:AvailableGossip(...)
for i = 1, select("#", ...), 1 do
local gossip = select(i, ...)
if self.vars.special.npcgossip[ self:GetNpcName() ] then
return (i + 1) / 2
end
end
end]]
 
--------------------------------------------------------------------------------------------------
-- Function Hooks
--------------------------------------------------------------------------------------------------
 
function EasyDaily:GetActiveTitle(i)
local title = self.hooks["GetActiveTitle"](i)
if self:IsActiveQuest(title) then
title = title .. string.format(" (%s)", L["Auto"])
end
return title
end
 
function EasyDaily:GetAvailableTitle(i)
local title = self.hooks["GetAvailableTitle"](i)
if self:IsActiveQuest(title) then
title = title .. string.format(" (%s)", L["Auto"])
end
return title
end
 
function EasyDaily:GetQuestReward(option)
local title = GetTitleText()
if self.db.profile.multiple and self:IsActiveQuest(title) and GetNumQuestChoices() > 0 then
self.db.char.reward[title] = option
end
end
 
function EasyDaily:GossipFrameAvailableQuestsUpdate(...)
local r = { ... }
local l = select("#", ...)
for i = 1, l, 3 do
if self:IsActiveQuest(r[i]) then
r[i] = string.format("%s (%s)", r[i], L["Auto"])
end
end
return self.hooks["GossipFrameAvailableQuestsUpdate"]( unpack(r, 1, l) )
end
 
function EasyDaily:GossipFrameActiveQuestsUpdate(...)
local r = { ... }
local l = select("#", ...)
for i = 1, l, 3 do
if self:IsActiveQuest(r[i]) then
r[i] = string.format("%s (%s)", r[i], L["Auto"])
end
end
return self.hooks["GossipFrameActiveQuestsUpdate"]( unpack(r, 1, l) )
end
 
--------------------------------------------------------------------------------------------------
-- Other Functions
--------------------------------------------------------------------------------------------------
 
function EasyDaily:GetQuestTableByTitle(title)
if title then
for i, t in ipairs(self.db.profile.data.standard) do
if t and t.title and t.title == title then
return t, true
end
end
for i, t in ipairs(self.db.profile.data.custom) do
if t and t.title and t.title == title then
return t
end
end
end
end
 
function EasyDaily:ToggleQuestState(title)
local t, isStandard = EasyDaily:GetQuestTableByTitle(title)
if isStandard then
t.disabled = not t.disabled
else
table.insert( self.db.profile.data.custom, { title = title } )
end
end
 
function EasyDaily:IsActiveQuest(title)
local t, isStandard = self:GetQuestTableByTitle(title)
return t and ( not t.disabled ), isStandard
end
 
function EasyDaily:QuestHasReqItems(title)
local t = EasyDaily:GetQuestTableByTitle(title)
local r
if t and t.itemreqs then
for j, k in ipairs(t.itemreqs) do
local count = self:CountContainerItem(k[1])
if count and ( count < k[2] ) then
Debug("Quest requirements are not met for", title)
r = true; break
end
end
return ( not r )
end
end
 
--------------------------------------------------------------------------------------------------
-- Item Functions
--------------------------------------------------------------------------------------------------
 
function EasyDaily:SearchContainerItemInfo(search, first)
local searchID
if type(search) ~= "number" then
local _, searchLink = GetItemInfo(search)
_, searchID = strsplit(":", string.match(searchLink, "^|c%x+|H(.+)|h%[.*%]") )
end
if searchID then
local r = {}
for bag = 0, 4, 1 do
for slot = 1, GetContainerNumSlots(bag), 1 do
local itemLink = GetContainerItemLink(bag, slot)
if itemLink then
local _, itemID = strsplit(":", string.match(itemLink, "^|c%x+|H(.+)|h%[.*%]"))
if itemID and itemID == searchID then
local itemName, _, _, _, itemMinLevel, itemType, itemSubType, itemStackCount = GetItemInfo(itemLink)
local texture, itemCount, locked = GetContainerItemInfo(bag, slot)
local _, itemID = strsplit(":", string.match(itemLink, "^|c%x+|H(.+)|h%[.*%]") )
local t = {
bag = bag,
slot = slot,
name = itemName,
link = itemLink,
count = itemCount,
maxcount = itemStackCount,
locked = locked,
texture = texture,
minlevel = (itemMinLevel > 0) and itemMinLevel,
id = itemID,
}
if first then
return t
else
table.insert(r, t)
end
end
end
end
end
return r
end
end
 
function EasyDaily:CountContainerItem(searchItem)
local t = self:SearchContainerItemInfo(searchItem)
local count = 0
if t then
for i, v in ipairs(t) do
count = ( v.count or 0 ) + count
end
end
return count, t
end
 
--------------------------------------------------------------------------------------------------
-- Temporarily Stored NPC Data
--------------------------------------------------------------------------------------------------
 
function EasyDaily:CloseFrameBucket()
return self:ClearCurrentInfo()
end
 
function EasyDaily:ClearCurrentInfo(force)
if force or ( ( not QuestFrame:IsShown() ) and ( not GossipFrame:IsShown() ) ) then
Debug("Cleaning current info.")
CleanTable(self.vars.current)
end
end
 
function EasyDaily:GetNpcID()
if not self.vars.current.npc then
self.vars.current.npc = UnitGUID("npc") and tonumber( strsub( UnitGUID("npc"), -12, -7), 16)
end
return self.vars.current.npc
end
 
function EasyDaily:GetQuestTableByNpc(id)
local r = {}
for i, t in ipairs(self.db.profile.data.standard) do
if t then
if t.snid and t.snid == snid then
table.insert(r, string)
elseif t.enid and t.enid == enid then
table.insert(r, t)
end
end
end
 
end
 
function EasyDaily:UPDATE_MOUSEOVER_UNIT()
local guid = UnitGUID("mouseover")
if guid and strsub(guid, -16, -14) == "F13" then
local id = tonumber( strsub(guid, -12, -7), 16)
 
end
end
 
Property changes : Added: svn:keywords + Rev
EasyDaily-Beta/EasyDaily.toc New file
0,0 → 1,14
## Interface: 30000
## Title: EasyDaily
## Notes: Auto-Accepts/Completes Daily Quests!
## Authors: Draake
## SavedVariables: EasyDailyDB
 
embeds.xml
locales\locales.xml
 
links.lua
 
EasyDaily.lua
QuestData.lua
options.lua