changeset 23:e837384ac363

Separating objective tracker module
author Nenue
date Sun, 10 Apr 2016 04:35:32 -0400
parents 9b3fa734abff
children 66b927b46776
files ObjectiveCore.lua ObjectiveEvents.lua ObjectiveFrame.lua ObjectiveInfo.lua ObjectiveSecure.xml ObjectiveStyle.lua ObjectiveTracker.xml ObjectiveTracker/ObjectiveCore.lua ObjectiveTracker/ObjectiveEvents.lua ObjectiveTracker/ObjectiveFrame.lua ObjectiveTracker/ObjectiveInfo.lua ObjectiveTracker/ObjectiveSecure.xml ObjectiveTracker/ObjectiveStyle.lua ObjectiveTracker/ObjectiveTracker.xml ObjectiveTracker/ObjectiveUI.lua ObjectiveTracker/ObjectiveWidgets.lua ObjectiveTracker/ObjectiveWidgets.xml ObjectiveTracker/QuestTracker.lua ObjectiveTracker/XPTracker.lua ObjectiveUI.lua ObjectiveWidgets.lua ObjectiveWidgets.xml Veneer.toc XPTracker.lua
diffstat 24 files changed, 3827 insertions(+), 3675 deletions(-) [+]
line wrap: on
line diff
--- a/ObjectiveCore.lua	Sat Apr 09 07:32:45 2016 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,436 +0,0 @@
---- ${PACKAGE_NAME}
--- @file-author@
--- @project-revision@ @project-hash@
--- @file-revision@ @file-hash@
--- Created: 3/26/2016 1:51 AM
-local B, _G = select(2,...).frame, _G
-local pairs, setmetatable, type, tostring, band, format = _G.pairs, _G.setmetatable, _G.type, _G.tostring, bit.band, string.format
-local ipairs, tinsert, hooksecurefunc = _G.ipairs, _G.tinsert, _G.hooksecurefunc
-local PlaySoundFile, IsQuestTask, SortQuestWatches, GetCurrentMapAreaID, GetZoneText, GetMinimapZoneText = PlaySoundFile, IsQuestTask, SortQuestWatches, GetCurrentMapAreaID, GetZoneText, GetMinimapZoneText
-local AddQuestWatch, SetSuperTrackedQuestID, GetNumQuestWatches, AUTO_QUEST_WATCH, MAX_WATCHABLE_QUESTS = AddQuestWatch, SetSuperTrackedQuestID, GetNumQuestWatches, AUTO_QUEST_WATCH, MAX_WATCHABLE_QUESTS
-local QuestPOIUpdateIcons, GetCVar, IsPlayerInMicroDungeon, WorldMapFrame, GetCVarBool, SetMapToCurrentZone = QuestPOIUpdateIcons, GetCVar, IsPlayerInMicroDungeon, WorldMapFrame, GetCVarBool, SetMapToCurrentZone
-local AddAutoQuestPopUp = AddAutoQuestPopUp
-local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
-local print = B.print('Objectives')
-local ObjectiveTrackerFrame, VeneerObjectiveScroll, CreateFrame = _G.ObjectiveTrackerFrame, _G.VeneerObjectiveScroll, _G.CreateFrame
-local Wrapper = _G.VeneerObjectiveWrapper
-local Scroller = VeneerObjectiveWrapper.scrollArea
-local Scroll = _G.VeneerObjectiveScroll
-
---- Performance values
---[[
-  self:RegisterEvent("QUEST_LOG_UPDATE");
-	self:RegisterEvent("TRACKED_ACHIEVEMENT_LIST_CHANGED");
-	self:RegisterEvent("QUEST_WATCH_LIST_CHANGED");
-	self:RegisterEvent("QUEST_AUTOCOMPLETE");
-	self:RegisterEvent("QUEST_ACCEPTED");
-	self:RegisterEvent("SUPER_TRACKED_QUEST_CHANGED");
-	self:RegisterEvent("SCENARIO_UPDATE");
-	self:RegisterEvent("SCENARIO_CRITERIA_UPDATE");
-	self:RegisterEvent("TRACKED_ACHIEVEMENT_UPDATE");
-	self:RegisterEvent("ZONE_CHANGED_NEW_AREA");
-	self:RegisterEvent("ZONE_CHANGED");
-	self:RegisterEvent("QUEST_POI_UPDATE");
-	self:RegisterEvent("VARIABLES_LOADED");
-	self:RegisterEvent("QUEST_TURNED_IN");
-	self:RegisterEvent("PLAYER_MONEY");
- ]]
-
-
---- These are the bitfields used by Blizzard_ObjectiveTracker to determine which segments get parsed.
---- They are replicated here so that plugins can make use of any securehook args involving this info.
-local OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST                       -- 0x0100
-local OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP = OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP	-- 0x0200
-local OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE = OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE		-- 0x0400
-local OBJECTIVE_TRACKER_UPDATE_MODULE_SCENARIO = OBJECTIVE_TRACKER_UPDATE_MODULE_SCENARIO	    		        -- 0x0800
-local OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT	= OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT           -- 0x1000
-
-
-local OBJECTIVE_TRACKER_UPDATE_STATIC = OBJECTIVE_TRACKER_UPDATE_STATIC					                         	-- 0x0000
-local OBJECTIVE_TRACKER_UPDATE_ALL = OBJECTIVE_TRACKER_UPDATE_ALL			                    	          		-- 0xFFFF
-local OBJECTIVE_TRACKER_UPDATE_ID = OBJECTIVE_TRACKER_UPDATE_ID                                           -- 0
-
-local OBJECTIVE_TRACKER_UPDATE_QUEST = OBJECTIVE_TRACKER_UPDATE_QUEST				        	                  	-- 0x0001
-local OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED = OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED		               		    -- 0x0002
-local OBJECTIVE_TRACKER_UPDATE_TASK_ADDED = OBJECTIVE_TRACKER_UPDATE_TASK_ADDED		    	              		-- 0x0004
-local OBJECTIVE_TRACKER_UPDATE_SCENARIO = OBJECTIVE_TRACKER_UPDATE_SCENARIO			      	                 	-- 0x0008
-local OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE = OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE		       	-- 0x0010
-local OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT			                   	-- 0x0020
-local OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED		  	      -- 0x0040
-local OBJECTIVE_TRACKER_UPDATE_SCENARIO_BONUS_DELAYED = OBJECTIVE_TRACKER_UPDATE_SCENARIO_BONUS_DELAYED		-- 0x0080
-
-local OBJECTIVE_TRACKER_UPDATE_REASON = OBJECTIVE_TRACKER_UPDATE_ALL -- default
---- Used to determine which trackers are listening for money events
-mod.watchMoneyReasons = 0
-
---- Baseline defaults table; values defined in the files that they pertain to
-mod.defaults = {}
-
---- Tracker display order
-mod.orderedNames = {'Bonus', 'AutoQuest', 'Quest', 'Cheevs'}
-
---- ipairs() argument tables
-mod.orderedHandlers = setmetatable({}, {__mode = "k"})
-mod.orderedTrackers = setmetatable({}, {__mode = "k"})
-mod.indexedTrackers = setmetatable({}, {__mode = "k"})
-
---- pairs() argument tables
-mod.namedTrackers = setmetatable({}, {__mode = "k"})
-
-local WRAPPER_ANCHOR_POINT = 'TOPRIGHT'
-local WRAPPER_OFFSET_X = 0
-local WRAPPER_OFFSET_Y = -200
-local WRAPPER_MAX_HEIGHT = 670
-local WRAPPER_WIDTH = 280
-local WRAPPER_HEADER_HEIGHT = 24
-
-mod.defaults.Wrapper = {
-  AnchorPoint = WRAPPER_ANCHOR_POINT,
-  OffsetX = WRAPPER_OFFSET_X,
-  OffsetY = WRAPPER_OFFSET_Y,
-  Height = WRAPPER_MAX_HEIGHT,
-  Width = WRAPPER_WIDTH,
-  HeaderHeight = WRAPPER_HEADER_HEIGHT,
-  TextSpacing = 3,
-  TitleSpacing = 3,
-}
-
-
-
---- Tracker module definitions begin here; innards dealing with data retreival and output are defined further in
-mod.DefaultHandler = {
-  previousHeight = 0,
-
-  name = "temp",
-  displayName = "temp",
-  updateReasonModule = 0xFF00,
-  updateReasonEvent  = 0x00FF,
-
-  numWatched = 0,   --- number of entries being handled
-  numBlocks = 0,    --- number of blocks created
-  actualBlocks = 0, --- number of blocks in use
-
-  freeBlocks = {},  --- block heap
-  usedBlocks = {},
-
-  Info = {},        -- find data by ID
-  BlockInfo = {},   -- find data by block ID
-  Watched = {},     -- find watchIndex by data ID
-  WatchInfo = {},   -- find data by watch index
-  WatchBlock = {},  -- find block by watch index
-}
-
-mod.AutoQuest = {
-  name = "AutoQuest",
-  displayName = "Notice",
-  updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST,
-  updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST +
-      OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED,
-}
-mod.Quest = {
-  name = "Quest",
-  displayName = "Quests",
-  updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST,
-  updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST +
-      OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED,
-}
-mod.Cheevs = {
-  name = "Cheevs",
-  displayName = "Achievements",
-  updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT,
-  updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT +
-      OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED,
-}
-mod.Bonus = {
-  name = "Bonus",
-  displayName = "Bonus Objectives",
-  updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE,
-  updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST + OBJECTIVE_TRACKER_UPDATE_TASK_ADDED
-}
-
-local Tracker_string = function (self)
-  return self.name
-end
-local Tracker_call = function (self, reason)
-  self:Update(reason)
-end
-local Handler_Initialize = function (self, name, index)
-  print('Initializing |cFF00FFFF'..name..'|r module...')
-
-  local handler = setmetatable(mod[name] or {}, {
-    __tostring = Tracker_string,
-    __call = Tracker_call
-  })
-  if type(mod.orderedHandlers[index]) == 'table' then
-    return mod.orderedHandlers[index]
-  end
-
-  print('|cFFFFFF00Acquiring locals')
-  local preset = {}
-  for k, _ in pairs(handler) do
-    preset[k] = true
-  end
-
-
-  print('|cFFFF8800Inheriting')
-  for k, v in pairs(self) do
-    if not handler[k] then
-      if type(v) == 'table' then
-        -- assume all tables to be local data; don't inherit or ref
-        handler[k] = {}
-      else
-        handler[k] = self[k]
-      end
-      print('copying', k)
-    end
-  end
-  print('|cFFFF4400'..tostring(name)..'|r:')
-  for k, v in pairs(handler) do
-    print(format("%32s %8s %s", (preset[k] and '|cFFFFFFFF' or '|cFFFFFF00') .. k .. '|r', type(v), tostring(v)))
-  end
-
-  mod[name] = handler
-
-  local trackerName = 'Veneer'..name..'Tracker'
-  local handler = mod[name]
-  local frame = CreateFrame('Frame', trackerName, _G.VeneerObjectiveScroll, 'VeneerTrackerTemplate')
-  frame.title:SetText(handler.displayName)
-  mod.SetBlockStyle(frame, 'Tracker', 'Normal')
-  handler.frame = frame
-  handler.trackerName = trackerName
-  handler.lines = {}
-  mod.orderedTrackers[index] = frame
-  mod.namedTrackers[name] = frame
-  mod.indexedTrackers[handler] = frame
-  print('|cFFFF0088' .. trackerName .. '|r created for |cFF00FFFF' .. handler.displayName .. '|r module')
-
-  mod.orderedHandlers[index] = handler
-  return true
-end
-
-local Event = {}
-Event.QUEST_LOG_UPDATE =  function()
-  return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST + OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE
-end
-Event.QUEST_ACCEPTED = function(questLogIndex, questID)
-  if ( IsQuestTask(questID) ) then
-    return OBJECTIVE_TRACKER_UPDATE_TASK_ADDED, questID
-  else
-    if ( AUTO_QUEST_WATCH == "1" and GetNumQuestWatches() < MAX_WATCHABLE_QUESTS ) then
-      AddQuestWatch(questLogIndex);
-      SetSuperTrackedQuestID(questID);
-    end
-    return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST
-  end
-end
-Event.QUEST_WATCH_LIST_CHANGED = function(questID, added)
-  if ( added ) then
-    if ( not IsQuestTask(questID) ) then
-      return OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, questID, added
-    end
-  else
-    return OBJECTIVE_TRACKER_UPDATE_QUEST, questID, added
-  end
-end
-Event.QUEST_POI_UPDATE = function()
-
-  QuestPOIUpdateIcons();
-  if ( GetCVar("trackQuestSorting") == "proximity" ) then
-    SortQuestWatches();
-  end
-
-  return OBJECTIVE_TRACKER_UPDATE_ALL
-
-end
-Event.SUPER_TRACKED_QUEST_CHANGED = function()
-  return OBJECTIVE_TRACKER_UPDATE_QUEST
-end
-Event.ZONE_CHANGED = function()
-
-  local inMicroDungeon = IsPlayerInMicroDungeon();
-  if ( inMicroDungeon ~= mod.inMicroDungeon ) then
-    if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then
-      SetMapToCurrentZone();			-- update the zone to get the right POI numbers for the tracker
-    end
-    --SortQuestWatches();
-    mod.inMicroDungeon = inMicroDungeon;
-  end
-end
-Event.QUEST_AUTOCOMPLETE = function(questId)
-  AddAutoQuestPopUp(questId, "COMPLETE");
-  return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST + OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP
-end
-Event.SCENARIO_CRITERIA_UPDATE =  function()
-  return OBJECTIVE_TRACKER_UPDATE_SCENARIO
-end
-Event.SCENARIO_UPDATE = function(newStage)
-  if ( newStage ) then
-    return OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE
-  else
-    return OBJECTIVE_TRACKER_UPDATE_SCENARIO
-  end
-end
-Event.TRACKED_ACHIEVEMENT_UPDATE = function()
-  return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT
-end
-Event.TRACKED_ACHIEVEMENT_LIST_CHANGED = function(achievementID, added)
-  if ( added ) then
-    return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED, achievementID
-  else
-    return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT
-  end
-end
-Event.ZONE_CHANGED_NEW_AREA = function ()
-  if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then
-    SetMapToCurrentZone();			-- update the zone to get the right POI numbers for the tracker
-  end
-  SortQuestWatches();
-  mod.currentZoneArea = GetCurrentMapAreaID()
-  print('Updating zone ID to', mod.currentZoneArea, '=', GetZoneText(), GetMinimapZoneText())
-
-
-  return OBJECTIVE_TRACKER_UPDATE_TASK_ADDED
-end
-
-
-Event.PLAYER_MONEY = function()
-  if mod.watchMoneyReasons > 0 then
-    return mod.watchMoneyReasons
-  end
-end
-Event.CRITERIA_COMPLETE = function()
-  return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE
-end
-Event.QUEST_TURN_IN = function(questID, xp, money)
-  if ( IsQuestTask(questID) ) then
-    mod.Bonus:OnTurnIn(questID, xp, money)
-    print('updating bonus modules (code', OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, ',', questID, xp, money)
-    return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, questID, xp, money
-  else
-    return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST, questID, xp, money
-  end
-end
-mod.Event = Event
-
---- Done once per ui load
-local BlizzHooks = {
-  ['AddQuestWatch'] = 'AddQuestWatch',
-  ['RemoveQuestWatch'] = 'RemoveQuestWatch',
-  ['AbandonQuest'] = 'AbandonQuest',
-  ['AcknowledgeAutoAcceptQuest'] = 'AcknowledgeAutoAcceptQuest',
-  ['AddAutoQuestPopUp'] = 'AddAutoQuestPopUp',
-  ['RemoveAutoQuestPopUp'] = 'RemoveAutoQuestPopUp',
-  ['AddTrackedAchievement'] = 'AddTrackedAchievement',
-  ['RemoveTrackedAchievement'] = 'RemoveTrackedAchievement',
-  ['SetSuperTrackedQuestID'] = 'SetSuperTrackedQuestID'
-}
-local VeneerData
-
-mod.SetWatchMoney = function(watchMoney, reason)
-  if watchMoney then
-    if band(mod.watchMoneyReasons, reason) == 0 then
-      mod.watchMoneyReasons = mod.watchMoneyReasons + reason;
-    end
-  else
-    if band(mod.watchMoneyReasons, reason) > 0 then
-      mod.watchMoneyReasons = mod.watchMoneyReasons - reason;
-    end
-  end
-end
-
-
-function mod:OnInitialize()
-  local c = mod.Conf.Wrapper
-  VeneerData = _G.VeneerData
-  VeneerData.CallLog = VeneerData.CallLog or {}
-  if not mod.isHooked then
-    mod.isHooked = true
-    for blizzFunc, veneerFunc in pairs(BlizzHooks) do
-      if mod[veneerFunc] then
-        hooksecurefunc(blizzFunc, mod[veneerFunc])
-      else
-        hooksecurefunc(blizzFunc, function(...)
-          print('|cFFFF0088securehook('..tostring(blizzFunc)..')|r args:', ...)
-          tinsert(VeneerData.CallLog, {blizzFunc, ...})
-        end)
-      end
-    end
-  end
-
-  mod.Conf.TasksLog = mod.Conf.TasksLog or {}
-
-  Scroller:SetScrollChild(Scroll)
-  Scroller:SetWidth(c.Width)
-  Scroll:SetWidth(c.Width)
-  Scroll:ClearAllPoints()
-  Scroll:SetPoint('TOP', Scroller, 'TOP')
-  ObjectiveTrackerFrame:UnregisterAllEvents()
-  ObjectiveTrackerFrame:Hide()
-end
-
-function mod:OnEvent (event, ...)
-  local isHandled
-  print('OnEvent(|cFF00FF00'.. event ..'|r):', ...)
-  local reason, arg1, arg2, arg3
-  if Event[event] then
-    if type(Event[event]) == 'function' then
-      PlaySoundFile([[Interface\Addons\SharedMedia_MyMedia\sound\Info.ogg]])
-      reason, arg1, arg2, arg3 = Event[event](...)
-    elseif type(Event[event]) == 'table' then
-      PlaySoundFile([[Interface\Addons\SharedMedia_MyMedia\sound\Link.ogg]])
-      for i, action in ipairs(Event[event]) do
-        if type(action) == 'function' then
-          reason, arg1, arg2, arg3 = action(event, ...)
-        else
-          reason = action
-        end
-
-        if reason then
-          mod:Update(reason, arg1, arg2, arg3)
-        end
-      end
-    else
-      PlaySoundFile([[Interface\Addons\SharedMedia_MyMedia\sound\Heart.ogg]])
-      reason = Event[event]
-    end
-  else
-    PlaySoundFile([[Interface\Addons\SharedMedia_MyMedia\sound\Quack.ogg]])
-  end
-  if reason then
-    mod:Update(reason, arg1, arg2, arg3)
-  else
-    print('no reason value returned')
-    PlaySoundFile([[Interface\Addons\SharedMedia_MyMedia\sound\Quack.ogg]])
-  end
-end
-
---- Done any time the the minimize button is toggled up
-function mod:OnEnable()
-  for id, name in ipairs(mod.orderedNames) do
-    if not mod.orderedHandlers[id] then
-      Handler_Initialize(mod.DefaultHandler, name, id)
-    end
-  end
-
-  for event, action in pairs(Event) do
-    print('|cFFFF0088listen to', event, 'for action|r', tostring(action))
-    Wrapper:RegisterEvent(event)
-  end
-
-  Wrapper:SetScript('OnEvent', mod.OnEvent)
-
-  local c = mod.Conf.Wrapper
-  --Wrapper:SetPoint(c.AnchorPoint, UIParent, c.AnchorPoint, c.OffsetX, c.OffsetY)
-  --B.Conf.FramePosition[Wrapper:GetName()] = {c.AnchorPoint, c.AnchorPoint, c.OffsetX, c.OffsetY}
-  Wrapper:SetWidth(c.Width)
-
-
-  mod.InitializeWidgets()
-  mod:Update()
-end
-
-function mod:OnDisable()
-  Wrapper:UnregisterAllEvents()
-end
-
-
--- a/ObjectiveEvents.lua	Sat Apr 09 07:32:45 2016 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
---- ${PACKAGE_NAME}
--- @file-author@
--- @project-revision@ @project-hash@
--- @file-revision@ @file-hash@
--- Created: 3/30/2016 1:23 AM
-local B = select(2,...).frame
-local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
-local print = B.print('Objectives')
-
---------------------------------------------------------------------
---- Events that are handled by Blizzard_ObjectiveTracker
---------------------------------------------------------------------
-
--------------------------------------------------------------------
---- Function hooks for BlizzUI compatibility
--------------------------------------------------------------------
-mod.AddQuestWatch = function(questID)
-    mod:Update(0x00000003)
-end
-
-local Quest = mod.Quest
-mod.RemoveQuestWatch = function(questIndex, ...)
-  print('|cFFFF8800RemoveQuestWatch', questIndex, ...)
-
-  local info = mod.Quest.LogInfo[questIndex]
-
-  -- remove quest refs
-  local block = Quest.QuestBlock[info.questID]
-  Quest.QuestBlock[info.questID] = nil
-  Quest.LogBlock[questIndex] = nil
-
-  -- remove if they still match
-  if Quest.WatchInfo[info.watchIndex] == info then
-    print('cleaning dead WatchInfo entry')
-    Quest.WatchInfo[info.watchIndex] = nil
-  end
-  for i = 1, #info.objectives do
-    Quest.lines[block.blockIndex][i]:Hide()
-  end
-
-  mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST)
-end
-
-mod.AddTrackedAchievement = function(cheevID)
-  mod.CleanWidgets()
-  mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT)
-end
-
-
-mod.RemoveTrackedAchievement = function(cheevID)
-  print('|cFFFF8800UntrackAchievement', cheevID)
-  mod.CleanWidgets()
-  mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT)
-end
-
-mod.AcceptQuest = function()
-  mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST_ADDED)
-end
-
-mod.AbandonQuest = function()
-  QuestPOIUpdateIcons()
-  mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST)
-end
-mod.TurnInQuest = function()
-  QuestPOIUpdateIcons()
-  mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST)
-end
-mod.AddAutoQuestPopUp = function(...)
-   mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP)
-end
-mod.RemoveAutoQuestPopUp = function(...)
-  mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP)
-end
-
-
-
-mod.SetSuperTrackedQuestID = function(questID)
-  --mod:Update()
-end
\ No newline at end of file
--- a/ObjectiveFrame.lua	Sat Apr 09 07:32:45 2016 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,825 +0,0 @@
---- ${PACKAGE_NAME}
--- @file-author@
--- @project-revision@ @project-hash@
--- @file-revision@ @file-hash@
--- Created: 3/30/2016 12:49 AM
-local B = select(2,...).frame
-local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
-local ipairs, max, min, unpack, floor, pairs, tostring, type, band = ipairs, max, min, unpack, floor, pairs, tostring, type, bit.band
-local IsResting, UnitXP, UnitXPMax, GetXPExhaustion = IsResting, UnitXP, UnitXPMax, GetXPExhaustion
-local UnitLevel, IsQuestWatched, UIParent = UnitLevel, IsQuestWatched, UIParent
-local Default, AutoQuest, Quest, Bonus, Cheevs = mod.DefaultHandler, mod.AutoQuest, mod.Quest, mod.Bonus, mod.Cheevs
-local CreateFrame = CreateFrame
-local print = B.print('Tracker')
-local unitLevel = 1
-local OBJECTIVE_TRACKER_UPDATE_REASON = OBJECTIVE_TRACKER_UPDATE_REASON
-local debug = false
---------------------------------------------------------------------
---- Global frame layout
---------------------------------------------------------------------
-
---- Upvalues
-local Wrapper = VeneerObjectiveWrapper
-local Scroller = Wrapper.scrollArea
-local Scroll = VeneerObjectiveScroll
-local orderedHandlers = mod.orderedHandlers
-local orderedNames = mod.orderedNames
-
---- Temp values set during updates
-local wrapperWidth, wrapperHeight
-local scrollWidth, scrollHeight
-local previousBlock
-local currentBlock
---- todo: source these from config
-local itemButtonSize, itemButtonSpacing =  36, 1
-local titleFont, textFont = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Regular.ttf]]
-local titleSize, textSize = 16, 16
-local titlebg, textbg = {'HORIZONTAL', 1, 0, .7, .25, 1, 0, .7, .125}, {'HORIZONTAL', 0, 0, 0, 0.4, 0, 0, 0, 0}
-local titleOutline, textOutline = "OUTLINE", "OUTLINE"
-local titleSpacing, textSpacing = 3, 3
-local titleIndent, textIndent = 2, 5
-local blockSpacing = 1
-local wrapperMaxWidth, wrapperMaxHeight = 270, 490 -- these are the hard bounds, actual *Height variables are changed
-local wrapperHeadFont, wrapperHeadSize, wrapperHeadOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 16, 'NONE'
-local headerFont, headerSize, headerHeight = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 18, 24
-local headerOutline, headerColor, headerSpacing = 'OUTLINE', {1,1,1,1}, 2
-local wrapperPosition = {'RIGHT', UIParent, 'RIGHT', -84, 0 }
-local rewardSize = 32
-local oprint = B.print('Objectives')
-local bprint = B.print('Block')
-local tprint = B.print('Tracker')
-local lprint = B.print('Line')
-
-local band = bit.band
-local currentPosition, anchorFrame, anchorPoint
-
-Default.GetLine = function(handler, blockIndex, lineIndex)
-  local print = lprint
-  if not handler.lines[blockIndex] then
-    handler.lines[blockIndex] = {}
-  end
-  local lines = handler.lines[blockIndex]
-  if not lines[lineIndex] then
-    print('        |cFF00FF88created line #'..lineIndex..' from for '..handler.name..' block #'..blockIndex)
-    lines[lineIndex] = CreateFrame('Frame', 'Vn'..handler.name .. blockIndex..'ObjectiveLine'..lineIndex, handler:GetBlock(blockIndex), 'VeneerTrackerObjective')
-    local line = lines[lineIndex]
-    line.index = lineIndex
-    line.height = 0
-    line.status:SetSpacing(textSpacing)
-    line.status:SetPoint('LEFT', line, 'LEFT', textIndent, 0)
-    B.SetConfigLayers(line)
-
-    if lines[lineIndex+1] then
-      lines[lineIndex+1]:ClearAllPoints()
-    end
-
-    if debug then
-      for _, region in ipairs(lines[lineIndex].debug) do
-        region:Show()
-      end
-    end
-
-  end
-  return lines[lineIndex]
-end
-
-Default.GetBlock = function(handler, blockIndex)
-  local print = bprint
-  local block = handler.usedBlocks[blockIndex]
-
-  if not handler.usedBlocks[blockIndex] then
-    if #handler.freeBlocks >= 1 then
-      block = handler.freeBlocks[#handler.freeBlocks]
-      handler.freeBlocks[#handler.freeBlocks] = nil
-    else
-      block = CreateFrame('Frame', 'Veneer'..tostring(handler)..'Block'..blockIndex, Scroll, 'VeneerTrackerBlock')
-      block.GetLine = function(block, lineIndex, data) return handler:GetLine(blockIndex, lineIndex, data) end
-      block.UpdateLine = function(block, lineIndex, data) return handler:UpdateLine(block, lineIndex, data) end
-      block.UpdateObjectives = function(block) return handler:UpdateObjectives(block) end
-      block.SetTag = function(block, ...) return handler.SetTag(block, ...) end
-
-      local c = mod.Conf.Wrapper
-      block.blockIndex = blockIndex
-      block.SetStyle = mod.SetBlockStyle
-      block:SetWidth(c.Width)
-
-      block.title:SetSpacing(c.TitleSpacing)
-      block.title:SetPoint('TOP', block, 'TOP', 0, -titleSpacing)
-
-      block.titlebg:SetTexture(1,1,1,1)
-      block.titlebg:SetGradientAlpha(unpack(titlebg))
-      block.titlebg:SetPoint('TOP', block, 'TOP', 0, 0)
-      block.titlebg:SetPoint('BOTTOM', block.title, 'BOTTOM', 0, -titleSpacing)
-
-      block.status:SetSpacing(c.TextSpacing)
-      block.status:SetPoint('TOP', block.titlebg, 'BOTTOM', 0, -textSpacing)
-      block.status:SetPoint('LEFT', block.titlebg, 'LEFT', textIndent, 0)
-
-      block.statusbg:SetPoint('TOP', block.titlebg, 'BOTTOM', 0, 0)
-      block.statusbg:SetPoint('BOTTOM', block, 'BOTTOM', 0, 0)
-      block.statusbg:SetTexture(1,1,1,1)
-      block.statusbg:SetGradientAlpha(unpack(textbg))
-
-      block.SelectionOverlay:SetPoint('TOPLEFT')
-      block.SelectionOverlay:SetPoint('BOTTOMRIGHT')
-
-      block.icon:SetSize(rewardSize, rewardSize)
-      block.icon:SetPoint('TOPRIGHT', block, 'TOPRIGHT', -2, -2)
-
-
-      --- methods for event handlers
-
-      block.Select = handler.Select
-      block.Open = handler.Open
-      block.Remove = handler.Remove
-      block.Link = handler.Link
-      block:SetScript('OnMouseUp', handler.OnMouseUp)
-      block:SetScript('OnMouseDown', handler.OnMouseDown)
-      block.attachmentHeight = 0
-      block:ClearAllPoints()
-
-      B.SetConfigLayers(block)
-
-      if debug then
-        for _, region in ipairs(block.debug) do
-          region:Show()
-        end
-      end
-    end
-    handler.usedBlocks[blockIndex] = block
-  end
-  return handler.usedBlocks[blockIndex]
-end
-
-Default.SetTag = function (block, tagName, tagPoint, tagAnchor, tagRelative)
-  local print = bprint
-  local tag = block[tagName]
-  if block.info[tagName] and tag then
-    tag:SetTexCoord(unpack(block.info[tagName]))
-    tag:Show()
-    tag:SetPoint(tagPoint, tagAnchor, tagRelative, 0, 0)
-    tagPoint, tagAnchor, tagRelative = 'TOPRIGHT', tag, 'TOPLEFT'
-  else
-    block[tagName]:Hide()
-  end
-  return tagPoint, tagAnchor, tagRelative
-end
-
-Default.UpdateObjectives = function(handler, block)
-  local print = lprint
-  local info = block.info
-
-  print('   |cFF00FF00doing objectives', block:GetName())
-
-  -- set the starting positions
-  block.endPoint = block.status
-  local completionScore, completionMax = 0, 0
-  local displayObjectiveHeader = false
-
-  if info.description and #info.description >= 1 then
-    print('   |cFF00FFFF  header line:|r', info.description)
-    block.status:SetText(info.description)
-    displayObjectiveHeader = true
-  end
-
-  local attachmentHeight = 0
-  if info.objectives then
-    attachmentHeight = textSpacing * 2
-    for i, data in ipairs(info.objectives) do
-      print('     |cFF88FF00#', i, data.type, data.text)
-      displayObjectiveHeader = true
-      local line = block:GetLine(i)
-      line.height = 0
-      block:UpdateLine(line, data)
-
-      line:ClearAllPoints()
-      if line.widget then
-        local widgetPosition = 0
-        line.widget:SetPoint('TOP', line, 'TOP', 0, -widgetPosition)
-        line.widget:Show()
-        line.height = line.widget:GetHeight() + textSpacing
-
-        if line.displayText and #line.displayText >= 1 then
-          widgetPosition = line.status:GetHeight() + textSpacing
-          line.status:SetText(line.displayText)
-          line.height = floor(line.status:GetStringHeight()+.5) + textSpacing + line.widget.height
-          print('      - progressbar has text, adjust')
-        end
-      elseif line.displayText then
-        line.status:SetText(line.displayText)
-        line.height = floor(line.status:GetStringHeight()+.5) + textSpacing
-
-      end
-      attachmentHeight = attachmentHeight + line.height
-
-      line:Show()
-
-      line:SetPoint('LEFT', block, 'LEFT', 0, 0)
-      line:SetPoint('TOP', block.endPoint, 'BOTTOM', 0, 0)
-      line:SetPoint('RIGHT', block, 'RIGHT', 0, 0)
-      line:SetHeight(line.height)
-
-
-      print('      sz', line:GetSize())
-      print('      pt', line:GetPoint(1))
-      print('     |cFF44BBFF#', i, 'anchoring line, size:', line.height, 'current endpoint:', line.statusbg)
-
-      block.endPoint = line
-    end
-
-    if attachmentHeight > 0 then
-      block.attachmentHeight = attachmentHeight
-      print('     |cFF00FF00attachment:', block.attachmentHeight)
-    end
-
-    local lines = handler.lines[block.blockIndex]
-    local numObjectives = #info.objectives
-    local numLines = #lines
-    if lines and numLines > numObjectives then
-      print('   has extra lines, need to clean up;', numLines, numObjectives)
-      for  i = numObjectives+1, numLines do
-        print('    hide', i, lines[i]:GetName())
-        lines[i]:Hide()
-      end
-    end
-  end
-
-
-
-  print('   displayHeader:', displayObjectiveHeader)
-
-  if debug then
-    for i, region in ipairs(block.debug) do
-      for j = 1, region:GetNumPoints() do
-        local _, target = region:GetPoint(j)
-        if target:IsVisible() then
-          region:Hide()
-        else
-          region:Show()
-        end
-      end
-    end
-  end
-
-  block.completionScore = completionScore / completionMax
-end
-
-Bonus.UpdateObjectives = function(handler, block)
-  Default.UpdateObjectives(handler, block)
-end
-
-local CLICK_TO_COMPLETE = 'Click to Complete'
-local CLICK_TO_ACCEPT = 'Click to Accept'
-
-AutoQuest.UpdateObjectives = function(handler, block)
-  local print = lprint
-  if block.info.type == 'OFFER' then
-    block.status:SetText(CLICK_TO_ACCEPT)
-  end
-
-end
-
-Quest.UpdateObjectives = function(handler, block)
-  local print = lprint
-  print('|cFF00FFFFUpdateObjectives()')
-  local info = block.info
-  local completionText
-  if info.isAutoComplete then
-    local questID, popupType = GetAutoQuestPopUp(info.questLogIndex)
-    if popupType == 'COMPLETE' then
-      completionText = CLICK_TO_COMPLETE
-    end
-  end
-  if info.isComplete then
-    if not completionText then
-      completionText = GetQuestLogCompletionText(info.questLogIndex)
-    end
-  else
-    Default.UpdateObjectives(handler, block)
-  end
-end
-
---- Module-specific display variables
--- * height   - height of whatever display widget is involved in conveying the task
--- * money    - boolean that determines listening for money events or not
--- * progress - number ranging 0 to 2 indicating none/partial/full completion respectively
-
-Quest.UpdateLine = function(handler, block, line, data)
-  local print = lprint
-  print('      |cFFFF0088', block:GetName(), line.index, data.type)
-  local objectiveType = data.type
-  local r, g, b, a = 0, 1, 1, 1
-  line.progress = 0
-  if data.finished then
-    line.progress = 2
-    r, g, b, a = 0, 1, 0, 1
-  elseif objectiveType == 'monster' then
-    r, g, b, a = 1, 0, .45, 1
-  elseif objectiveType == 'item' then
-    r, g, b, a = .8, .8, .8, 1
-  elseif objectiveType == 'object' then
-    r, g, b, a = 1, 1, 1, 1
-  elseif objectiveType == 'player' then
-    r, g, b, a = 0, 0.8, 1, 1
-  end
-
-  line.displayColor = {r, g, b, a}
-  line.status:SetTextColor(r, g, b, a)
-  line.displayText = data.text
-
-  return line
-end
-
-Bonus.UpdateLine = function(handler, block, line, data)
-  local info = block.info
-  local print = lprint
-
-
-  line.displayColor = 'FFFFFF'
-  line.displayText = data.text
-  line.progress = 0
-  print('  ', data.objectiveIndex,'|cFFFF0088-|r', data.objectiveType, data.text)
-  if data.objectiveType == 'progressbar' then
-    line.widgetType = 'ProgressBar'
-    print('    |cFFFF44DDpercent='..tostring(GetQuestProgressBarPercent(info.questID)))
-    data.value = GetQuestProgressBarPercent(info.questID) or 0
-    data.maxValue = 100
-    if  data.value >= data.maxValue then
-      line.progress = 1
-    elseif data.value > 0 then
-      line.progress = 2
-    end
-    line.format = PERCENTAGE_STRING
-    local widget = mod.SetWidget(line, data, 'ProgressBar', info.questID..'-'..data.objectiveIndex)
-    print('    |cFFFF0022** text:|r', data.text, '|cFFFF0022value:|r', data.value, '|cFFFF0022max:|r', data.maxValue)
-    widget:SetPoint('TOP', line, 'TOP', 0, 0)
-
-    line.widget = widget
-    line.height = widget.height
-  else
-    line.displayText = data.text
-    line.widget = nil
-  end
-  return line
-end
-
-Cheevs.UpdateLine = function(handler, block, line, data)
-  local print = B.print('CheevsLine')
-  line.progress = 0
-  print('  ', data.objectiveIndex,'|cFF0088FF-|r', data.objectiveType, data.text)
-  if data.flags then
-    if band(data.flags, 0x00000001) > 0 then
-      line.format = "%d/%d"
-      line.widget = mod.SetWidget(line, data, 'ProgressBar', data.criteriaID)
-      line.height = line.widget.height
-    elseif band(data.flags, 0x00000002) then
-      line.widget = nil
-    else
-      line.widget = nil
-      line.displayColor = 'FFFFFF'
-      line.displayText = line.text
-
-    end
-  else
-
-      line.displayText = data.text
-  end
-  print('line.type =', data.type)
-  print('  ** qtyStr:', data.quantityString, 'qty:', data.quantity, 'assetID:', data.assetID)
-end
-Default.UpdateLine = function(block, line)
-  if line.finished then
-    line.progress = 2
-  elseif line.quantity > 0 then
-    line.progress  = 1
-  else
-    line.progress = 0
-  end
-  return line
-end
-
-
-mod.Quest.numButtons = 0
-local usedButtons = mod.Quest.itemButtons
-local freeButtons = mod.Quest.freeButtons
---[=[
-mod.UpdateWrapper = function(reason)
-  print('|cFF00FFFFUpdateWrapper:|r', reason)
-  unitLevel = UnitLevel('player')
-  wrapperWidth = mod.Conf.Wrapper.WrapperWidth
-  scrollWidth = mod.Conf.Wrapper.WrapperWidth
-  local wrapperBlocks = 0
-  -- Update scroll child vertical size
-  scrollHeight = 0
-  for i, handler in ipairs(orderedHandlers) do
-    mod.UpdateTracker(handler)
-    local frame = handler.frame
-    if handler.actualBlocks >= 1 then
-      frame:SetParent(Scroll)
-      frame:SetPoint('TOPLEFT', Scroll, 'TOPLEFT', 0, - scrollHeight)
-      frame:SetSize(wrapperWidth, frame.height)
-      print('|cFF00FFFF'..frame:GetName()..'|r h:|cFF00FF00', frame.height, '|r y:|cFF00FF00', -scrollHeight)
-      scrollHeight = scrollHeight + frame.height
-      frame:Show()
-    else
-      frame:Hide()
-    end
-    wrapperBlocks = wrapperBlocks + handler.actualBlocks
-  end
-  print('final scrollHeight:', scrollHeight)
-
-
-
-  -- Update frame dimensions
-  if scrollHeight > wrapperMaxHeight then
-    print('  is larger than', wrapperMaxHeight)
-    wrapperHeight = wrapperMaxHeight
-  else
-    wrapperHeight = scrollHeight
-    B.Conf.ObjectiveScroll = 0
-  end
-  scrollWidth = floor(scrollWidth+.5)
-  scrollHeight = floor(scrollHeight+.5)
-  wrapperWidth = floor(wrapperWidth+.5)
-  wrapperHeight = floor(wrapperHeight+.5)
-  headerHeight = floor(headerHeight+.5)
-
-  if wrapperBlocks >= 1 then
-    for i, region in ipairs(Wrapper.headerComplex) do
-      region:Show()
-    end
-  else
-    for i, region in ipairs(Wrapper.headerComplex) do
-      region:Hide()
-    end
-    return
-  end
-  --[[wrapperHeight = scrollHeight
-
-  print('|cFFFFFF00params:|r scroller:', scrollWidth .. ',' .. scrollHeight, 'scroll:', scrollWidth .. ',' .. scrollHeight,
-  'wrapper:', wrapperWidth .. ',' .. wrapperHeight,
-  'header:', headerHeight)]]
-
-  --Scroller:SetSize(wrapperWidth, wrapperHeight)
-  Scroller:SetPoint('TOPLEFT', Wrapper, 'TOPLEFT', 0, 0)
-  Scroller:SetPoint('BOTTOMRIGHT', Wrapper, 'BOTTOMRIGHT')
-
-
-  Scroll:SetSize(scrollWidth, scrollHeight)
-  Scroll:SetPoint('TOPLEFT', Scroller, 'TOPLEFT', 0, B.Conf.ObjectiveScroll or 0)
-  Scroll:SetPoint('RIGHT', Scroller, 'RIGHT')
-
-  --Scroller:UpdateScrollChildRect()
-  Wrapper:SetSize(wrapperWidth, wrapperHeight)
-
-  --[[ update action buttons
-  print('|cFF00FF00'..Scroll:GetName()..'|r:', Scroll:GetWidth(), Scroll:GetHeight(),
-    '|cFF00FF00'..Scroller:GetName()..'|r:', Scroller:GetWidth(), Scroller:GetHeight(),
-    '|cFF00FF00'..Wrapper:GetName()..'|r:', Wrapper:GetWidth(), Wrapper:GetHeight(),
-    '|cFF0088FFvScrollRange|r:', floor(Scroller:GetVerticalScrollRange()+.5)
-  )
-  --]]
-  mod.UpdateActionButtons()
-
-end
---]=]
-
-
-Default.Update = function (self, reason, ...)
-  local print = tprint
-  local tracker = self.frame
-  local blockIndex = 0
-  local trackerHeight = floor(tracker.titlebg:GetHeight()+.5)
-
-  self.currentAnchor = tracker.titlebg
-  local numWatched = self:GetNumWatched()
-  local numBlocks = self.numBlocks
-  local actualBlocks = 0
-  for watchIndex = 1, 25 do
-    blockIndex = blockIndex + 1
-    if watchIndex <= numWatched then
-      local info = self:GetInfo(watchIndex)
-      if info then
-        local currentBlock = self:UpdateBlock(blockIndex, info)
-        currentBlock:SetPoint('TOPLEFT', self.currentAnchor, 'BOTTOMLEFT', 0, 0)
-        currentBlock:SetPoint('RIGHT', tracker,'RIGHT', 0, 0)
-        self.currentAnchor = currentBlock
-        print('    |cFFFFFF00'..watchIndex..'|r', '|cFF00FF00'..currentBlock:GetName()..'|r', currentBlock.height, trackerHeight)
-        trackerHeight = trackerHeight + currentBlock.height
-        numBlocks = max(numBlocks, watchIndex)
-        actualBlocks = actualBlocks + 1
-      else
-        print('    |cFFFF0000bad GetInfo data for #'..watchIndex)
-      end
-
-    elseif watchIndex <= numBlocks then
-      local used = self.usedBlocks
-      local free = self.freeBlocks
-      print('clean up dead quest block')
-      if used[blockIndex] then
-        used[blockIndex]:Hide()
-        used[blockIndex]:ClearAllPoints()
-        free[#free+1]= used[blockIndex]
-        used[blockIndex] = nil
-      end
-    else
-      print('  |cFFFF9900END|r @', blockIndex)
-      break -- done with quest stuff
-    end
-  end
-  self.numWatched = numWatched
-  self.numBlocks = numBlocks
-  self.actualBlocks = actualBlocks
-
-  tracker.previousHeight = tracker.height
-  if numBlocks >= 1 then
-    previousBlock = nil
-
-    tracker.height = trackerHeight
-    tracker:SetHeight(tracker.height)
-    tracker:Show()
-
-
-  else
-    tracker.height = 0
-    tracker:Hide()
-  end
-
-  return tracker.numWatched, tracker.numAll
-end
-
---- Updates the selected block frame to display the given info batch
--- If `previousBlock` is set, it will attempt to anchor to that
--- @param blockNum the ordered block to be updated, not a watchIndex value
--- @param info the reference returned by the GetXInfo functions
--- REMEMBER: t.info and questData[questID] are the same table
-Default.UpdateBlock = function (self, blockIndex, info)
-  local print = bprint
-  print('  Read list item |cFF00FFFF'..blockIndex..'|r')
-  if not blockIndex or not info then
-    return
-  end
-  local frame = self.frame
-  local block = self:GetBlock(blockIndex)
-  block.handler = self
-  block.info = info
-  block.mainStyle = info.mainStyle or 'Normal'
-  block.subStyle = info.subStyle
-
-  info.blockIndex = blockIndex
-  if info.questID then self.QuestBlock[info.questID] = block end
-  if info.questLogIndex then self.LogBlock[info.questLogIndex] = block end
-  if info.watchIndex then self.WatchBlock[info.watchIndex] = block end
-  self.BlockInfo[blockIndex] = info
-
-  block.endPoint = block.titlebg
-  block.attachmentHeight = 0
-  block:UpdateObjectives()
-
-  block.title:SetText(info.title)
-  local titleHeight = floor(block.title:GetHeight()+.5)
-  local statusHeight = floor(block.status:GetHeight()+.5)
-  local attachmentHeight =floor(block.attachmentHeight + .5)
-  local titlebgHeight = titleHeight + titleSpacing*2
-  local statusbgHeight = statusHeight + textSpacing*2
-
-  block.titlebg:SetHeight(titlebgHeight)
-
-
-  print('    |cFF0088FFanchor to', self.currentAnchor:GetName())
-
-  print('    |cFF00FF00total sizes:')
-  print('       attachment:', attachmentHeight)
-  print('            title:', titlebgHeight, '('.. titleHeight..')')
-  --block.titlebg:SetHeight(block.title:GetHeight() + mod.Conf.Wrapper.TitleSpacing)
-  block.height = titlebgHeight + attachmentHeight
-  if statusHeight > 1 then
-    block.height = block.height + statusbgHeight
-    print('           status:', statusbgHeight, '('.. statusHeight..')')
-  else
-    print('      |cFFFF0088             skipped')
-  end
-  block:SetHeight(block.height)
-
-  print('           |cFFFFFF00height|r:', block.height)
-  print('  |cFF00FFFF)|r -> ', block, block:GetHeight())
-
-  block:Show()
-
-
-  if info.specialItem and not info.itemButton then
-    print('    - |cFF00FFFFgenerating item button for info set')
-    info.itemButton = mod.SetItemButton(block, info)
-  else
-    --info.itemButton = nil
-  end
-
-  local tagPoint, tagAnchor, tagRelative = 'TOPRIGHT', block, 'TOPRIGHT'
-  if info.rewardInfo then
-    print('has immediate reward')
-    if info.rewardInfo[1].type == 'currency' or info.rewardInfo[1].type == 'item' then
-      block.icon:Show()
-      block.iconLabel:SetText(info.rewardInfo[1].count)
-      block.icon:SetPoint(tagPoint, tagAnchor, tagRelative, -2, -2)
-      tagPoint, tagAnchor, tagRelative = 'TOPRIGHT', block.icon, 'TOPLEFT'
-      block.icon:SetTexture(info.rewardInfo[1].texture)
-    end
-  else
-    block.icon:Hide()
-  end
-
-  if info.selected then
-    block.SelectionOverlay:Show()
-  else
-    block.SelectionOverlay:Hide()
-  end
-
-  -- workaround for scrollchild issue where layers fall out of sync: in this case, it's by 1 vertical pixel
-  block.highlight:SetPoint('TOPLEFT', block, 'TOPLEFT', 0, 1)
-  block.lowlight:SetPoint('BOTTOMLEFT', block, 'BOTTOMLEFT', 0, 1)
-
-  tagPoint, tagAnchor, tagRelative = block:SetTag('frequencyTag', tagPoint, tagAnchor, tagRelative)
-  tagPoint, tagAnchor, tagRelative = block:SetTag('typeTag', tagPoint, tagAnchor, tagRelative)
-  tagPoint, tagAnchor, tagRelative = block:SetTag('completionTag', tagPoint, tagAnchor, tagRelative)
-
-  return block
-end
-----------
---- Top level methods
-
-local tick = 0
-function mod:Update (reason, ...)
-  tick = tick + 1
-  local print = tprint
-  reason = reason or OBJECTIVE_TRACKER_UPDATE_REASON
-  local updateWrapper = 0
-  local hasStuff
-  local insertingStuff
-
-  print(format('%d |cFFFF%04X Update()', tick, bit.lshift(reason, 4)), reason, ...)
-  currentPosition = 0
-  anchorPoint = 'TOP'
-  anchorFrame = Scroll
-
-  local wrapperHeight = 0
-  for id, handler in pairs(mod.orderedHandlers) do
-    local frame = handler.frame
-
-    print(format('|cFF00FFFF%s and(%04X vs %04x+%04x) = %04X|r', handler.name, reason, handler.updateReasonModule, handler.updateReasonEvents, band(reason, handler.updateReasonModule + handler.updateReasonEvents)))
-    if band(reason, handler.updateReasonModule + handler.updateReasonEvents) > 0 then
-      handler:Update(reason, ...)
-      print(' |cFF00FF00'..id..'|r', handler.displayName, 'count:', handler.numWatched)
-      insertingStuff = true
-    else
-      print(' |cFFFF0088'..id..'|r', 'no reason to update')
-    end
-
-    if handler.numWatched >= 1 then
-      hasStuff = true
-      currentPosition = currentPosition + 1
-      frame:SetParent(Scroll)
-      frame:SetPoint('TOP', anchorFrame, anchorPoint, 0, 0)
-      print('  |cFF00BBFFpinning to', anchorFrame:GetName(), anchorPoint)
-      anchorFrame = handler.frame
-      anchorPoint = 'BOTTOM'
-
-      print('current frame height:', frame.height)
-      wrapperHeight = wrapperHeight + frame.height
-      print('|cFFFF0088total height:', wrapperHeight)
-    else
-      handler.frame:Hide()
-    end
-  end
-
-
-  if  hasStuff or insertingStuff then
-    print('updating height to', wrapperHeight)
-    Wrapper:SetHeight(wrapperHeight)
-    Scroller:SetHeight(wrapperHeight)
-    Scroll:SetHeight(wrapperHeight)
-    Scroller:SetVerticalScroll(B.Conf.ObjectiveScroll or 0)
-    print('|cFFFF8800Wrapper:', Wrapper:GetSize())
-    for i = 1, Wrapper:GetNumPoints() do
-      print(' ', Wrapper:GetPoint(i))
-    end
-    print('  |cFF00FFFFScroller:', Scroller:GetSize())
-    for i = 1, Scroller:GetNumPoints() do
-      print(' ', Scroller:GetPoint(i))
-    end
-    print('  |cFF00FFFFScroll:', Scroll:GetSize())
-    for i = 1, Scroll:GetNumPoints() do
-      print(' ', Scroll:GetPoint(i))
-    end
-
-    Wrapper:Show()
-    Scroller:Show()
-    Scroll:Show()
-  end
-
-end
-
---- Queue any active item buttons for update for that frame
-mod.UpdateActionButtons = function(updateReason)
-  Scroller.snap_upper = 0
-  Scroller.snap_lower = 0
-  local print = B.print('ItemButton')
-  if updateReason then
-    print = B.print('IB_'..updateReason)
-  end
-
-  local previousItem
-  for questID, itemButton in pairs(usedButtons) do
-    local info= mod.Quest.Info[questID]
-
-    print('|cFF00FFFF'.. questID .. '|r', itemButton:GetName())
-    local block = mod.Quest.QuestBlock[questID]
-    if block then
-        -- Dispatch the probe
-      if IsQuestWatched(info.questLogIndex) then
-        itemButton.previousItem = previousItem
-        print('  |cFFFFFF00probing', block:GetName())
-        block:SetScript('OnUpdate', function()
-          if block:GetBottom() and not InCombatLockdown() then
-            print('  '..block:GetName()..' |cFF00FF00probe hit!')
-            mod.UpdateBlockAction(block, itemButton, itemButton.previousItem) -- needs to be previousItem from this scope
-            block:SetScript('OnUpdate', nil)
-
-          end
-        end)
-        previousItem = itemButton
-      else
-        print('hidden block or unwatched quest')
-        itemButton.previousItem = nil
-        itemButton:Hide()
-      end
-    elseif itemButton:IsVisible() then
-      print('  |cFFFF0088hiding unwatched quest button', itemButton:GetName())
-      itemButton.previousItem = nil
-      itemButton:Hide()
-    else
-      print('  |cFFBBBBBBignoring hidden log quest button', itemButton:GetName())
-    end
-  end
-end
-
-mod.UpdateBlockAction = function (block, itemButton)
-  print('**|cFF0088FF'..itemButton:GetName(), '|r:Update()')
-  if itemButton.questID ~= block.info.questID then
-    print('** |cFFFF0088mismatched block assignment', itemButton.questID,'<~>', block.info.questID)
-    -- something happened between this and last frame, go back and set new probes
-    return mod.UpdateActionButtons()
-  end
-
-  local previousItem = itemButton.previousItem
-  local upper_bound = Scroller:GetTop() + Scroller.snap_upper
-  local lower_bound = Scroller:GetBottom() + Scroller.snap_lower + itemButtonSize
-  local point, anchor, relative
-
-  if block:GetBottom() < lower_bound then
-    print('** ',block:GetName() ,'|cFFFFFF00bottom =', floor(block:GetBottom()+.5), 'threschold =', floor(lower_bound+.5))
-    if previousItem then
-      print('adjusting', previousItem:GetName())
-      previousItem:ClearAllPoints()
-      previousItem:SetPoint('BOTTOM', itemButton, 'TOP', 0, itemButtonSpacing)
-    end
-    itemButton:ClearAllPoints()
-    itemButton.x = Wrapper:GetLeft() -4
-    itemButton.y = Wrapper:GetBottom()
-    point, anchor, relative = 'BOTTOMRIGHT', UIParent, 'BOTTOMLEFT'
-    Scroller.snap_lower = Scroller.snap_lower + itemButtonSize + itemButtonSpacing
-
-  elseif block:GetTop() > upper_bound then
-    print('** ',block:GetName() ,'|cFFFFFF00top =', floor(block:GetTop()+.5), 'threschold =', floor(upper_bound+.5))
-    itemButton:ClearAllPoints()
-    if previousItem then
-      print('latch onto another piece')
-      point, anchor, relative ='TOP', previousItem, 'BOTTOM'
-      itemButton.x = 0
-      itemButton.y = -itemButtonSpacing
-    else
-      print('latch at corner', Scroller:GetLeft() -itemButtonSpacing, Scroller:GetTop())
-      point, anchor, relative = 'TOPRIGHT', UIParent, 'BOTTOMLEFT'
-      itemButton.x = Scroller:GetLeft() -4
-      itemButton.y = Scroller:GetTop()
-    end
-    itemButton:Show()
-    Scroller.snap_upper = Scroller.snap_upper - (itemButtonSize + itemButtonSpacing)
-  else
-    print('** ',block:GetName() ,'|cFF00FF00span =', floor(block:GetBottom()+.5), floor(block:GetTop()+.5), 'threschold =', floor(lower_bound+.5))
-    itemButton:ClearAllPoints()
-    itemButton.x = block:GetLeft() - itemButtonSpacing
-    itemButton.y = block:GetTop()
-    point, anchor, relative = 'TOPRIGHT', UIParent, 'BOTTOMLEFT'
-  end
-
-  itemButton:SetPoint(point, anchor, relative, itemButton.x, itemButton.y)
-  itemButton:Show()
-end
-
-mod.UpdateItemButtonCooldown = function(button)
-
-end
-
-local unitLevel = UnitLevel('player')
-
-
--- a/ObjectiveInfo.lua	Sat Apr 09 07:32:45 2016 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,573 +0,0 @@
-local B = select(2,...).frame
-local wipe, pairs, ipairs, min, max, unpack, format, mod = table.wipe, pairs, ipairs, min, max, unpack, format, mod
-local tinsert, tostring = tinsert, tostring
-local GetQuestTagInfo, GetQuestLogTitle = GetQuestTagInfo, GetQuestLogTitle
-local GetNumQuestLogEntries, GetNumQuestWatches, GetQuestLogCompletionText, IsQuestWatched, IsQuestHardWatched, GetQuestLogSpecialItemInfo, GetQuestLogSpecialItemCooldown = GetNumQuestLogEntries, GetNumQuestWatches, GetQuestLogCompletionText, IsQuestWatched, IsQuestHardWatched, GetQuestLogSpecialItemInfo, GetQuestLogSpecialItemCooldown
-local GetNumAutoQuestPopUps, GetAutoQuestPopUp, GetTasksTable, GetNumQuestLogTasks, GetTaskInfo, GetQuestObjectiveInfo = GetNumAutoQuestPopUps, GetAutoQuestPopUp, GetTasksTable, GetNumQuestLogTasks, GetTaskInfo, GetQuestObjectiveInfo
-local GetNumQuestLogRewardCurrencies, GetQuestLogRewardCurrencyInfo, GetNumQuestLogRewards, GetQuestLogRewardInfo, GetQuestLogRewardMoney, GetMoneyString = GetNumQuestLogRewardCurrencies, GetQuestLogRewardCurrencyInfo, GetNumQuestLogRewards, GetQuestLogRewardInfo, GetQuestLogRewardMoney, GetMoneyString
-local GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo = GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo
-local GetQuestWatchIndex, GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo = GetQuestWatchIndex, GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo
-local QuestHasPOIInfo, GetDistanceSqToQuest, GetQuestFactionGroup = QuestHasPOIInfo, GetDistanceSqToQuest, GetQuestFactionGroup
-local GetTrackedAchievements, GetNumTrackedAchievements, GetAchievementInfo = GetTrackedAchievements, GetNumTrackedAchievements, GetAchievementInfo
-local GetMoney, floor = GetMoney, floor
-local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
-local print = B.print('Info')
-local QUEST_TAG_DUNGEON = QUEST_TAG_DUNGEON
-local QUEST_TAG_GROUP = QUEST_TAG_GROUP
-local QUEST_TAG_ACCOUNT = QUEST_TAG_ACCOUNT
-local QUEST_TAG_TCOORDS = QUEST_TAG_TCOORDS
-local LE_QUEST_FREQUENCY_DAILY = LE_QUEST_FREQUENCY_DAILY
-local LE_QUEST_FREQUENCY_WEEKLY = LE_QUEST_FREQUENCY_WEEKLY
-local FACTION_ALLIANCE, LE_QUEST_FACTION_HORDE, FACTION_HORDE, LE_QUEST_FACTION_HORDE = FACTION_ALLIANCE, LE_QUEST_FACTION_HORDE, FACTION_HORDE, LE_QUEST_FACTION_HORDE
-
-local Tracker, Bonus, AutoQuest, Quest, Cheevs = T.DefaultTracker, T.Bonus, T.AutoQuest, T.Quest, T.Cheevs
---------------------------------------------------------------------
---- Tracker-specific data retrieval functions
---------------------------------------------------------------------
-
-
-local DoQuestRewards= function(t, questID)
-  local rewards = {}
-  t.numCurrencies = GetNumQuestLogRewardCurrencies(questID)
-  for i = 1, t.numCurrencies do
-    local name, texture, count = GetQuestLogRewardCurrencyInfo(i, questID)
-    tinsert(rewards,{
-      type = 'currency',
-      index = i,
-      name = name,
-      texture = texture,
-      count = count
-    });
-  end
-  -- items
-  t.numItems = GetNumQuestLogRewards(questID)
-  for i = 1, t.numItems do
-    local name, texture, count, quality, isUsable = GetQuestLogRewardInfo(i, questID)
-    tinsert(rewards, {
-      type = 'item',
-      index = i ,
-      name = name,
-      texture = texture,
-      count = count,
-      quality = quality,
-      isUsable = isUsable
-    });
-  end
-  -- money
-
-  local money = GetQuestLogRewardMoney(questID)
-  if ( money > 0 ) then
-    tinsert(rewards, {
-      type = 'money',
-      name = GetMoneyString(money),
-      texture = "Interface\\Icons\\inv_misc_coin_01",
-      count = 0,
-    });
-  end
-
-  if #rewards >= 1 then
-    t.rewardInfo = rewards
-  end
-end
-
-
------------------------------
---- AUTO_QUEST
-AutoQuest.LogInfo = {}
-AutoQuest.LogBlock = {}
-AutoQuest.QuestBlock = {}
-AutoQuest.WatchBlock = {}
-function AutoQuest:GetNumWatched ()
-  print(self.name, self)
-  Quest:GetNumWatched()
-  self.numWatched = GetNumAutoQuestPopUps()
-
-  return self.numWatched
-end
-AutoQuest.GetInfo = function(self, popupIndex)
-
-
-  local questID, type = GetAutoQuestPopUp(popupIndex)
-  local questIndex = GetQuestLogIndexByID(questID)
-  local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle(questIndex)
-
-  self.Info[questID] = self.Info[questID] or {}
-  local popup = self.Info[questID]
-  popup.title = title
-  popup.description = type
-  popup.popupType = type
-  popup.questID = questID
-  popup.questIndex = questIndex
-  popup.popupIndex = popupIndex
-
-  self.Info[questID] = popup
-  self.WatchInfo[popupIndex] = popup
-
-
-  return self.Info[questID]
-end
-
------------------------------
---- BONUS OBJECTIVE
--- The default UI pops them up as you enter their relevant areas, but the data is actually available at all times.
--- The only requirement is that you've been to said area and progressed any of the objectives.
--- Blizzard deal with this fact by caching any task data collected during session and masking out whatever gets completed.
--- For the addon's module structure to work, GetNumWatched method also invokes a tasks table scan.
--- That composes the table searched by GetInfo().
-
-------------------------------------------------------------------------------------------
---- These functions are copied from Blizzard_BonusObjectiveTracker.lua;
--- It's kind of dumb, but this avoids the risk of code taint.
-
---- Returns a tasks table modified to include recently completed objectives
-local UnitName, GetRealmName = UnitName, GetRealmName
-local InternalGetTasksTable = function()
-  local completedTasks = T.Conf.TasksLog
-  local char = UnitName("player")
-  local realm = GetRealmName()
-  local tasks = GetTasksTable()
-
-  for questID, data in pairs(Bonus.Info) do
-
-    print('  -- questID:', questID, #data.objectives)
-      for i, o in ipairs(data.objectives) do
-        print('    --', i, o.text)
-      end
-
-  end
-
-
-  for questID, data in pairs(completedTasks) do
-    if questID > 0  then
-      local found = false
-      for i = 1, #tasks do
-        if tasks[i] == questID then
-          found = true
-          break
-        end
-      end
-      -- if it's not part of the current table, then try to insert it where it was last found
-      if not found then
-        if data.watchIndex < #tasks then
-          tinsert(tasks, data.watchIndex, data)
-        else
-          tinsert(tasks, data)
-        end
-      end
-    end
-  end
-  return tasks
-end
-
---- Returns an entry from the composed tasks table if possible, otherwise makes an API pull
-local InternalGetTaskInfo = function(questID)
-  local completedTasks = T.Conf.TasksLog
-  if completedTasks[questID] then
-    return true, true, #completedTasks[questID].objectives
-  else
-    return GetTaskInfo(questID)
-  end
-end
-
---- Same as above but for the objective entries
-local InternalGetQuestObjectiveInfo = function(questID, objectiveIndex)
-  local completedTasks = T.Conf.TasksLog
-  if ( completedTasks[questID] ) then
-    print('using internal data')
-    return completedTasks[questID].objectives[objectiveIndex], completedTasks[questID].objectiveType, true;
-  else
-    return GetQuestObjectiveInfo(questID, objectiveIndex, false);
-  end
-end
-
---- end redundant copy of silliness
-------------------------------------------------------------------------------------------
-
-Bonus.Completed = {}
-Bonus.POI = {}
-Bonus.Scenario = {}
-Bonus.QuestBlock = {}
-Bonus.WatchInfo = {}
-function Bonus:GetNumWatched ()
-  print(self.name, self)
-
-  local tasks = InternalGetTasksTable()
-  local numWatched = 0
-  local numAll = 0
-  self.WatchInfo = {}
-  print('|cFFFFFF00Bonus.GetNumWatched()|r', #tasks)
-  print('  TasksTable pull:')
-  for i, questID in ipairs(tasks) do
-    local isInArea, isOnMap, numObjectives = InternalGetTaskInfo(questID)
-    local existingTask = self.QuestBlock[questID]
-    local displayObjectiveHeader = false;
-    local test = (isInArea or (isOnMap and existingTask))
-    --local test = true
-    if test then
-      self.Info[questID] = self.Info[questID] or {}
-
-      local t = self.Info[questID]
-      self.WatchInfo[i] = t
-      t.isInArea = isInArea
-      t.isOnMap = isOnMap
-      t.existingTask = existingTask
-      t.questID = questID
-      t.objectives = {}
-      t.taskIndex = i
-
-
-      DoQuestRewards(t, questID)
-
-      local taskTitle
-      local taskFinished = true;
-      for objectiveIndex = 1, numObjectives do
-        local text, objectiveType, finished, displayAsObjective = InternalGetQuestObjectiveInfo(questID, objectiveIndex, false);
-        displayObjectiveHeader = displayObjectiveHeader or displayAsObjective;
-        if not taskTitle then
-          if objectiveType == 'progressbar' and not text:match('^%d%+\\%d+') then
-            taskTitle = text
-            text = ''
-          end
-        end
-
-
-        print('  --', text, objectiveType, finished, displayAsObjective)
-        t.objectives[objectiveIndex] = t.objectives[objectiveIndex] or  {}
-        local  o = t.objectives[objectiveIndex]
-
-        o.objectiveIndex = objectiveIndex
-        o.text = text
-        o.objectiveType = objectiveType
-        o.finished = finished
-        o.displayAsObjective = displayAsObjective
-        print('     |cFF00FF88*', objectiveIndex, text)
-      end
-
-      -- didn't get a name from progress bar? what about area name
-      if not taskTitle then
-        if isInArea then
-          taskTitle = GetMapNameByID(GetCurrentMapAreaID())
-        end
-      end
-      t.title = taskTitle
-    end
-
-    print ('    |cFF00FF88#', i, 'questID', questID, 'inArea', isInArea, 'onMap', isOnMap, 'existing', (existingTask and 'Y' or 'N'), (test and '|cFF00FF00show|r' or '|cFFFF0088hide|r'))
-  end
-
-
-  self.numAll = #tasks
-  self.numWatched = #self.WatchInfo
-  print('  stats:', self.numAll, 'active tasks,', self.numWatched, 'nearby or animating')
-  --return #tasks
-  return #self.WatchInfo
-end
-
---- info cleanup done when  turn-ins are detected
-Bonus.OnTurnIn = function(self, questID, xp, money)
-  print('|cFFFF8800'..self.name..':OnTurnIn call', questID, xp, money)
-
-
-
-end
-
-Bonus.GetInfo = function(self, taskIndex)
-  print(self.name, self)
-  return self.WatchInfo[taskIndex]
-end
-
-Bonus.Store = function(questID)
-
-  if not questID then
-    print('|cFFFF4400invalid quest ID', questID)
-    return
-  end
-
-  Bonus.Info[questID] = Bonus.Info[questID] or {}
-  local t = Bonus.Info[questID]
-  local isInArea, isOnMap, numObjectives = GetTaskInfo(questID)
-  t.questID = questID
-  t.numObjectives = numObjectives
-  t.isInArea  = isInArea
-  t.isOnMap = isOnMap
-
-  print('    isInArea', isInArea, 'isOnMap', isOnMap, 'numObj', numObjectives)
-  local displayObjectives = false
-  local isComplete = true
-  if numObjectives >= 1 then
-    print('     ', numObjectives,'objective rows')
-    t.objectives = {}
-    for i = 1, t.numObjectives do
-      t.objectives[i] = {}
-      local o = t.objectives[i]
-      o.index = i
-      --local text, objectiveType, finished, displayAsObjective =
-      o.text, o.objectiveType, o.finished, o.displayAsObjective = GetQuestObjectiveInfo(questID, i, false)
-
-      print(i, '==>', o.text, o.objectiveType, o.finished, o.displayAsObjective)
-      t.displayObjectives = t.displayObjectives or o.displayAsObjective
-      t.isComplete = t.isComplete and o.finished
-
-    end
-  end
-
-  t.displayObjectives = displayObjectives
-
-  DoQuestRewards(t, questID)
-
-  Bonus.TasksTable[questID] = t
-
-  return t
-end
-
------------------------------
---- QUEST
-Quest.itemButtons = {}
-Quest.freeButtons = {}
-Quest.POI = {}
-Quest.QuestBlock = {}
-Quest.LogBlock = {}
-Quest.LogInfo = {}
-
-function Quest:GetNumWatched ()
-  print(self.name, self)
-  self.numAll = GetNumQuestLogEntries()
-  self.numWatched = GetNumQuestWatches()
-  return self.numWatched, self.numAll
-end
-Quest.GetInfo = function (self, watchIndex)
-  print('|cFF00DDFFQuest|r.|cFF0088FFGetInfo(|r'.. tostring(watchIndex)..'|r)')
-  local questID, title, questIndex, numObjectives, requiredMoney, isComplete,
-  startEvent, isAutoComplete, failureTime, timeElapsed, questType, isTask, isStory, isOnMap, hasLocalPOI = GetQuestWatchInfo(watchIndex)
-
-  if not questIndex then
-    return
-  end
-
-  local _, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, _, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle(questIndex)
-
-
-  if not questID then
-    return
-  end
-  Quest.Info[questID] = Quest.Info[questID] or {}
-
-  local q = Quest.Info[questID]
-  q.watchIndex = watchIndex
-  q.type = 'Quest'
-  q.questID = questID
-  q.title = title
-  q.level = level
-  q.displayQuestID = displayQuestID
-  q.suggestedGroup = suggestedGroup
-  q.questLogIndex = questIndex
-  q.numObjectives = numObjectives
-  q.requiredMoney = requiredMoney
-  q.isComplete = isComplete
-  q.startEvent = startEvent
-  q.isAutoComplete = isAutoComplete
-  q.failureTime = failureTime
-  q.timeElapsed = timeElapsed
-  q.questType = questType
-  q.isTask = isTask
-  q.isStory = isStory
-  q.isOnMap = isOnMap
-  q.hasLocalPOI = hasLocalPOI
-  q.frequency = frequency
-  q.isComplete = isComplete
-  q.isStory = isStory
-  q.isTask = isTask
-
-  --- resolve icon type and template
-  local tagID, tagName = GetQuestTagInfo(questID)
-  if ( tagName ) then
-    local factionGroup = GetQuestFactionGroup(questID);
-    -- Faction-specific account quests have additional info in the tooltip
-    if ( tagID == QUEST_TAG_ACCOUNT and factionGroup ) then
-      local factionString = FACTION_ALLIANCE;
-      if ( factionGroup == LE_QUEST_FACTION_HORDE ) then
-        factionString = FACTION_HORDE;
-      end
-      tagName = format("%s (%s)", tagName, factionString);
-    end
-    if ( QUEST_TAG_TCOORDS[tagID] ) then
-      local questTypeIcon;
-      if ( tagID == QUEST_TAG_ACCOUNT and factionGroup ) then
-        q.typeTag = QUEST_TAG_TCOORDS["ALLIANCE"];
-        if ( factionGroup == LE_QUEST_FACTION_HORDE ) then
-          q.typeTag= QUEST_TAG_TCOORDS["HORDE"];
-        end
-      else
-        q.typeTag = QUEST_TAG_TCOORDS[tagID];
-      end
-    end
-  end
-
-  if ( frequency == LE_QUEST_FREQUENCY_DAILY ) then
-    q.frequencyTag = QUEST_TAG_TCOORDS["DAILY"]
-    q.mainStyle = 'Daily'
-  elseif ( frequency == LE_QUEST_FREQUENCY_WEEKLY ) then
-    q.frequencyTag = QUEST_TAG_TCOORDS["WEEKLY"]
-    q.mainStyle = 'Daily'
-  end
-  if ( isComplete and isComplete < 0 ) then
-    q.completionTag = QUEST_TAG_TCOORDS["FAILED"]
-    q.subStyle = 'Failed'
-  elseif isComplete then
-    q.completionTag = QUEST_TAG_TCOORDS["COMPLETED"]
-    q.subStyle = 'Complete'
-  end
-  q.tagID = tagID
-  q.tagName = tagName
-
-
-
-  --q.isBreadCrumb = isBreadCrumb
-  q.completionText= GetQuestLogCompletionText(questIndex)
-  q.numObjectives = GetNumQuestLeaderBoards(questIndex)
-  q.objectives = {}
-  for i = 1, q.numObjectives do
-    local text, type, finished = GetQuestLogLeaderBoard(i, questIndex)
-    print(format('   #%d %s %s %s', i, tostring(type), tostring(text), tostring(finished)))
-    q.objectives[i] = {
-      index = i,
-      type = type,
-      text = text,
-      finished = finished
-    }
-    if type == 'event' then
-    elseif type == 'monster' then
-    elseif type == 'object' then
-    elseif type == 'reputation' then
-    elseif type == 'item' then
-    end
-  end
-
-  if requiredMoney >= 1 then
-    local money = GetMoney()
-    local moneyText = money
-    local requiredSilver, requiredCopper
-    local requiredGold = (requiredMoney > 10000) and (floor(requiredMoney/10000)) or nil
-    if mod(requiredMoney, 10000) ~= 0 then
-      requiredSilver = (requiredMoney > 100) and (mod(requiredMoney, 10000) / 100) or nil
-      if mod(requiredMoney, 100) ~= 0 then
-        requiredCopper = mod(requiredMoney, 100)
-      end
-    end
-
-    -- round the money value down
-    if requiredMoney > 9999 and not (requiredSilver or requiredCopper) then
-      moneyText = floor(money/10000)
-    elseif requiredMoney < 10000 and mod(requiredMoney,100) == 0 then
-      moneyText = floor(money/100)
-    end
-
-    local text = moneyText
-    local index = #q.objectives + 1
-    local finished = (GetMoney() >= requiredMoney)
-
-    if not finished then
-      text = text .. ' / ' .. GetCoinTextureString(requiredMoney, 15)
-    else
-      text = '' .. GetCoinTextureString(requiredMoney, 15)
-    end
-    q.objectives[index] = {
-      index = index,
-      type = 'progressbar',
-      quantity = money,
-      requiredQuantity = requiredMoney,
-      text = text,
-      finished = finished
-    }
-    print(format('   #%d %s %s %s', index, 'money', text, tostring(finished)))
-  end
-
-
-  local link, icon, charges = GetQuestLogSpecialItemInfo(questIndex)
-  local start, duration, enable = GetQuestLogSpecialItemCooldown(questIndex)
-  if link or icon or charges then
-    q.specialItem = {
-      questID = questID,
-      questIndex = questIndex,
-      link = link,
-      charges = charges,
-      icon = icon,
-      start = start,
-      duration = duration,
-      enable = enable,
-    }
-  end
-
-  if QuestHasPOIInfo(questID) then
-    local distance, onContinent = GetDistanceSqToQuest(questIndex)
-      if distance ~= nil and distance > 0 then
-      self.POI[questIndex] = {
-        questIndex = questIndex,
-        questID = questID,
-        distance = distance,
-        onContinent = onContinent
-      }
-    end
-  end
-
-
-  q.selected =  (questID == GetSuperTrackedQuestID()) -- call directly so artifact data doesn't become an issue
-  self.WatchInfo[watchIndex] = q
-  self.LogInfo[questIndex] = q
-  print('- logIndex =', questIndex, 'title =', title)
-  return q
-end
-
-Quest.GetClosest = function()
-  local minID
-  local minDist = math.huge
-  for i =  1, Quest.GetNumWatched() do
-      local info = Quest.GetInfo(i)
-      if info.hasLocalPOI then
-        local distance, onContinent = GetDistanceSqToQuest(info.questIndex)
-      end
-  end
-end
-
-
-Cheevs.GetNumWatched = function(self)
-  print('|cFF00FF00' .. GetTime())
-  Cheevs.trackedCheevs = {GetTrackedAchievements()}
-  return GetNumTrackedAchievements()
-end
-Cheevs.GetInfo = function(self, index)
-  local cheevID = Cheevs.trackedCheevs[index]
-  local id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuildAch, wasEarnedByMe, earnedBy = GetAchievementInfo(cheevID)
-
-  self.Info[cheevID] = {}
-  local c = self.Info[cheevID]
-  c.type = 'Cheevs'
-  c.watchIndex = index
-  c.cheevID = cheevID
-  c.title = name
-  c.points, c.completed, c.month, c.day, c.year, c.description, c.flags, c.icon, c.rewardText, c.isGuildAch, c.wasEarnedByMe, c.earnedBy =
-  points, completed, month, day, year, description, flags, icon, rewardText, isGuildAch, wasEarnedByMe, earnedBy
-  c.numObjectives = GetAchievementNumCriteria(cheevID)
-  c.objectives = {}
-  for i = 1, c.numObjectives do
-    local description, type, completed, quantity, requiredQuantity, characterName, flags, assetID, quantityString, criteriaID = GetAchievementCriteriaInfo(cheevID, i)
-    c.objectives[i] = {
-      objectiveIndex = i,
-      cheevID = cheevID,
-      text = description,
-      type = type,
-      finished = completed,
-      value = quantity,
-      maxValue = requiredQuantity,
-      characterName = characterName,
-      flags = flags,
-      assetID = assetID,
-      quantityString = quantityString,
-      criteriaID = criteriaID,
-    }
-  end
-  print('Cheevs.|cFF0088FFGetInfo|r('..index..')', 'obj:', GetAchievementNumCriteria(cheevID), name, description)
-
-  self.WatchInfo[index] = c
-  return self.Info[cheevID]
-end
--- a/ObjectiveSecure.xml	Sat Apr 09 07:32:45 2016 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-<Ui>
-  <!--
-   The following was lifted from QuestKing, mainly to spare the horrors of writing a global space frame script
-  -->
-  <Button name="VeneerItemButtonTemplate" inherits="SecureActionButtonTemplate" virtual="true">
-    <Attributes>
-      <Attribute name="type" value="item" />
-    </Attributes>
-    <Layers>
-      <Layer level="ARTWORK">
-        <FontString parentKey="HotKey" inherits="NumberFontNormalSmallGray" justifyH="LEFT" text="RANGE_INDICATOR">
-          <Size x="29" y="10"/>
-          <Anchors>
-            <Anchor point="TOPRIGHT" x="16" y="-2"/>
-          </Anchors>
-        </FontString>
-      </Layer>
-      <Layer level="BORDER">
-        <Texture parentKey="icon"/>
-        <FontString parentKey="Count" inherits="NumberFontNormal" justifyH="RIGHT" hidden="true">
-          <Anchors>
-            <Anchor point="BOTTOMRIGHT" x="-3" y="2"/>
-          </Anchors>
-        </FontString>
-      </Layer>
-    </Layers>
-    <Frames>
-      <Cooldown parentKey="Cooldown" inherits="CooldownFrameTemplate"/>
-    </Frames>
-    <Scripts>
-      <OnLoad>
-        self:RegisterForClicks("AnyUp");
-      </OnLoad>
-      <OnEvent>
-        if (event == "PLAYER_TARGET_CHANGED") then
-          self.rangeTimer = -1;
-        elseif (event == "BAG_UPDATE_COOLDOWN") then
-          Veneer_QuestObjectiveItem_UpdateCooldown(self)
-        end
-      </OnEvent>
-      <OnUpdate function="Veneer_QuestObjectiveItem_OnUpdate" />
-      <OnShow>
-        self:RegisterEvent("PLAYER_TARGET_CHANGED");
-        self:RegisterEvent("BAG_UPDATE_COOLDOWN");
-      </OnShow>
-      <OnHide>
-        self:UnregisterEvent("PLAYER_TARGET_CHANGED");
-        self:UnregisterEvent("BAG_UPDATE_COOLDOWN");
-      </OnHide>
-      <OnEnter>
-        GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
-        GameTooltip:SetQuestLogSpecialItem(self.questLogIndex);
-      </OnEnter>
-      <OnLeave>
-        GameTooltip:Hide();
-      </OnLeave>
-    </Scripts>
-    <NormalTexture parentKey="NormalTexture" file="Interface\Buttons\UI-Quickslot2">
-      <Anchors>
-        <Anchor point="CENTER"/>
-      </Anchors>
-    </NormalTexture>
-    <PushedTexture file="Interface\Buttons\UI-Quickslot-Depress"/>
-    <HighlightTexture file="Interface\Buttons\ButtonHilight-Square" alphaMode="ADD"/>
-  </Button>
-</Ui>
\ No newline at end of file
--- a/ObjectiveStyle.lua	Sat Apr 09 07:32:45 2016 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,506 +0,0 @@
-local B = select(2,...).frame
-local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
-local print = B.print('SetStyle')
--------------------------------------------------------------
---- Deals with swapping between different color palettes
----
-
-local titleFont, textFont = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Regular.ttf]]
-local titleSize, textSize = 16, 15
-local titleOutline, textOutline = "OUTLINE", "OUTLINE"
-local titleSpacing, textSpacing = 3, 3
-local unpack, type, pairs, tconcat = unpack, type, pairs, table.concat
-local wrapperHeadFont, wrapperHeadSize, wrapperHeadOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 16, 'NONE'
-local headerFont, headerSize = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 24
-local headerOutline, headerSpacing = 'OUTLINE', 2
-
-
-mod.defaults.Style = {
-  Format = {
-    Frame = {
-      Width = 270,
-    },
-    title = {
-      Indent = 0,
-      Spacing = 0,
-    },
-    status = {
-      Indent = 5,
-      Spacing = 0,
-    }
-  },
-  FontBank = {
-    ['Normal'] = _G.VeneerCriteriaFontNormal,
-    ['Progress'] = _G.VeneerCriteriaFontProgress,
-    ['Complete'] = _G.VeneerCriteriaFontComplete,
-    ['Failed'] = _G.VeneerCriteriaFontFailed,
-  },
-  Normal = {
-    title = {
-      TextColor = {1, 1, 1, 1},
-      Width = 270,
-      Spacing = 0,
-      Indent = 2,
-    },
-    titlebg = {
-    },
-    status = {
-      Width = 270,
-      Spacing = 0,
-    },
-    statusbg = {
-    },
-    Frame = {
-    }
-  },
-  Tracker = {
-    Normal = {
-      title = {
-        Font = {headerFont, headerSize, headerOutline}, Spacing = headerSpacing,
-        Indent = 2,
-        TextColor = {1, .9, .2, 1},
-      },
-      titlebg = {
-        Gradient = {'VERTICAL', MinColor = {0,0,0,0.25}, MaxColor = {0,0,0,.15}},
-      }
-    }
-  },
-  TrackerBlock = {
-    Normal = {
-      titlebg = {
-        Indent = 2,
-        Gradient = { 'HORIZONTAL', MinColor = {0.7, 0, 0.9, 1}, MaxColor = {.7, 0, 0.9, .1}},
-      },
-      title = {
-        TextColor = {1,1,1,1},
-        Font = {titleFont, titleSize, titleOutline},
-        Spacing = titleSpacing,
-      },
-      status = {
-        TextColor = {1,1,1,1},
-        Font = {textFont, textSize, textOutline},
-        Spacing = textSpacing,
-      },
-      statusbg = {
-        Gradient = { 'HORIZONTAL', MinColor = {0.2, .4, 1, 1}, MaxColor = {.7, 0, 0.9, .1}},
-      }
-    },
-    Daily = {
-      titlebg = {
-        Gradient = {'HORIZONTAL', MinColor = {0, .4, 1, 1},          MaxColor = {0, 0.4, 1, .1},        },
-      },
-      statusbg = {
-        Gradient = {'HORIZONTAL', MinColor = {0, .4, 1, 1},          MaxColor = {0, 0.35, .90, .1},        },
-      },
-      title = {
-        TextColor = {0.7,1,1,1},
-        Font = {titleFont, titleSize, titleOutline},
-        Spacing = titleSpacing,
-      },
-      status = {
-        TextColor = {1,1,1,1},
-        Font = {textFont, textSize, textOutline},
-        Spacing = textSpacing,
-      },
-    },
-    Super = {
-      title = {
-        TextColor = {1,1,1,1},
-        Font = {titleFont, titleSize, titleOutline},
-        Spacing = titleSpacing, BackgroundFullWidth = true
-      },
-      titlebg = {
-        Gradient = { 'HORIZONTAL', MinColor = {0, .7, .6, 1}, MaxColor = {0, .7, .6, 1}},
-      },
-      status = {
-        TextColor = {1,1,1,1},
-        Font = {textFont, textSize, textOutline},
-        Spacing = textSpacing,
-      },
-      statusbg = {
-        Gradient = { 'HORIZONTAL', MinColor = {0, .7, .6, 1}, MaxColor = {0, .7, .6, 1} },
-      },
-    },
-    MouseDown = {
-      title = {
-        Font = {titleFont, titleSize, titleOutline},
-        Spacing = titleSpacing,
-      },
-      titlebg = {
-        Gradient = {'HORIZONTAL',  MinColor = {0.2, .4, 1, 1}, MaxColor = {0.2, .4, 1, 1},        },
-      },
-      status = {
-        Font = {textFont, textSize, textOutline},
-        Spacing = textSpacing,
-      },
-      statusbg = {
-        Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 1}, MaxColor = {0.2, .4, 1, 1},        },
-      }
-    },
-    Complete = {
-      title = {
-        TextColor = {1,1,1,1},
-        Font = {titleFont, titleSize, titleOutline},        Spacing = titleSpacing,
-      },
-      titlebg = {
-        Gradient = {'HORIZONTAL', MinColor = {0, 1, 0, 1},          MaxColor = {0, 1, 0, 1},        },
-      },
-      status = {
-        TextColor = {1,1,1,1},
-        Font = {textFont, textSize, textOutline},        Spacing = textSpacing,
-      },
-      statusbg = {
-        Gradient = {'HORIZONTAL', MinColor = {0, 1, 0, 1},          MaxColor = {0, 1, 0, 1},        },
-      }
-    },
-    AutoQuest = {
-      Normal = {
-        titlebg = {
-          Indent = 2,
-          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 1}, MaxColor = {.7, 0, 0.9, 1}},
-        },
-        title = {
-          TextColor = {1,1,1,1},
-          Font = {titleFont, titleSize, titleOutline},
-          Spacing = titleSpacing,
-        },
-        status = {
-          TextColor = {0,1,0,1},
-          Font = {textFont, textSize, textOutline},
-          Spacing = textSpacing,
-        },
-        statusbg = {
-          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 1}, MaxColor = {.7, 0, 0.9, 1}},
-        }
-      },
-    },
-    Cheevs =  {
-      Normal = {
-
-        title = {
-          Font = {titleFont, titleSize, titleOutline},
-          Spacing = titleSpacing,
-        },
-        titlebg = {
-          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 1}, MaxColor = {.7, 0, 0.9, 1}},
-
-        },
-        status = {
-          Font = {textFont, textSize, textOutline},
-          Spacing = textSpacing,
-        },
-        statusbg = {
-          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 1}, MaxColor = {.7, 0, 0.9, 1}},
-        },
-      },
-      Complete = {
-        title = {
-          Font = {titleFont, titleSize, titleOutline},
-          Spacing = titleSpacing,
-        },
-        titlebg = {
-          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 1}, MaxColor = {.7, 0, 0.9, 1}},
-        },
-        status = {
-          Font = {textFont, textSize, textOutline},
-          Spacing = textSpacing,
-        },
-        statusbg = {
-          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 1}, MaxColor = {.7, 0, 0.9, 1}},
-        },
-      },
-    }
-  }
-}
-
-local style_cache_func = {}
-local block_vars = {
-  ['titleSize'] = {'titleWidth', 'titleHeight'},
-  ['FrameSize'] = {'width', 'height'}
-}
-local attrib_vars = {
-  ['Font'] = {'height'},
-}
-
-mod.BlockStyleCache = {}
-local style_cache = mod.BlockStyleCache
-mod.regions = {}
-mod.regionStyles = {}
-mod.SetBlockStyle = function(frame, frameType, ...)
-  -- var names intended to reflect argument order
-  print('|cFFFFFF00'..frame:GetName()..'|r', frameType, ...)
-  --@debug@
-  local c = mod.defaults.Normal
-  local style_list = {... }
-  local styleName = frameType .. '-' .. table.concat(style_list,'')
-  local previousClass = {mod.Conf.Style[frameType] }
-  local previousClassString = {'frame' }
-  local parentName
-
-  if not style_cache[styleName] then
-    local style = {}
-
-    --[[
-    if mod.defaults.Style[frameType] then
-      print(' setting style class |cFF00FFFF'..frameType)
-    else
-      print(' resorting to class Normal (missing |cFFFF8800'.. frameType..'|r)')
-    end
-    --]]
-    local normal = mod.defaults.Style.Normal
-    local root =  mod.defaults.Style[frameType] or normal
-    for i, className in ipairs(style_list) do
-      print('|cFF00FF00'..i..'|r', className)
-      local class = normal
-      local childClass
-      if previousClass  then
-        for i = #previousClass, 1, -1  do
-          print('checking if '..className..' child of '.. previousClassString[i])
-          if previousClass[i][className] then
-            print('  it is!')
-            childClass = previousClass[i][className]
-            parentName = previousClassString[i]
-            break
-          end
-        end
-      end
-      if childClass then
-        class = childClass
-        print('  ChildClass '..parentName..'.|cFFFF0088'.. className .. '|r')
-      elseif root[className] then
-        class = root[className]
-        print('  SubClass |cFF0088FF'.. className .. '|r')
-      elseif normal[className] then
-        class = normal[className]
-        print('  SubClass Normal.|cFFFF0088'..className..'|r')
-      else
-        --print('  SubClass not found '..className..'')
-      end
-      tinsert(previousClass, class)
-      tinsert(previousClassString, className)
-
-      for elementName, element in pairs(class) do
-        if not elementName:match('^%u') then
-          --print('   scanning Element |cFF8800FF'.. elementName ..'|r')
-          if not style[elementName] then
-            style[elementName] = {}
-          end
-          for key, value in pairs(element) do
-            if mod.SetBlockAttribute[key] then
-              --print('   |cFF00FF00'..elementName..'|r.|cFF00FFFF'..key..' =', (type(value) == 'table' and ('{'..table.concat(value,', ')..'}') or tostring(value)))
-              style[elementName][key] = value
-            end
-
-          end
-        end
-
-      end
-    end
-
-    for k, elements in pairs(mod.defaults.Style.Normal) do
-      if not style[k] and type(elements) ~= 'table' then
-        style[k] = elements
-      end
-    end
-
-
-    --[[print('result for: ', frame:GetName())
-    for k,v in pairs(style) do
-      if type(v) == 'table' and not k:match('^%u') then
-        for kk, vv in pairs(v) do
-        --print('  |cFFFFFF00'..k..'|r.|cFF00FF00'..kk..'|r =', (type(vv) == 'table' and ('{'..table.concat(vv,', ')..'}') or tostring(vv)))
-        end
-      else
-        --print(' |cFFFFFFFF' .. k ..'|r =', tostring(v))
-      end
-    end
-    --]]
-    print('saving |cFFFFFF00'..styleName)
-    style_cache[styleName] = style
-  else
-
-    print('using |cFFFF00FF'..styleName)
-  end
-
-  local style = style_cache[styleName]
-
-  if not style_cache_func[styleName] then
-    local code =
-        "return function (frame)\n"..
-        "  local func = Veneer.ObjectiveTracker.SetBlockAttribute\n"..
-        "  local cache = Veneer.ObjectiveTracker.BlockStyleCache"
-            --.. "  print('CacheFunc', '|cFFFFFF00SET|r "..styleName.." |cFFFFFF00ON|r', frame:GetName()) "
-
-    for elementName, styleset in pairs(style) do
-        code = code ..
-            "\n if frame['"..elementName.."'] then"
-
-        for attributeName, value in pairs(styleset) do
-          if mod.SetBlockAttribute[attributeName] then
-            --print('  add function '..elementName..':'.. attributeName ..'(', (type(value) == 'table' and ('{'..table.concat(value,', ')..'}') or tostring(value)), ')')
-
-
-            --mod.SetBlockAttribute[attributeName](region, value)
-            code = code
-                --.. "\n    print('CacheFunc', '  applying', '|cFF00FFFF" .. attributeName .. "|r to', '|cFF0088FF"..elementName.."|r', cache['"..styleName.."']['"..elementName.."']['".. attributeName .."'])"
-                .. "\n\n    func['" .. attributeName .. "'](frame['"..elementName.."'],"..
-                " cache['"..styleName.."']['"..elementName.."']['".. attributeName .."'])"
-
-            --- Set any frame.blah variables used in Updates
-            if block_vars[elementName .. attributeName] then
-              --print('|cFF008800BVar|r', elementName..attributeName)
-              for i, blockKey in ipairs(block_vars[elementName .. attributeName]) do
-                --print('  assigning |cFF008800'..blockKey..'|r')
-                frame[blockKey] = (type(value) == 'table') and value[i] or value
-              end
-            end
-
-          end
-        end
-        code = code ..
-            "\n  else"..
-            --"\n    print('CacheFunc', '  |cFFFF4400missing', frame:GetName()..'."..elementName.."')"..
-            "\n  end"
-    end
-    code = code .. "\nend"
-    local result = assert(loadstring(code))
-    --print('storing style func', styleName, result())
-    style_cache_func[styleName] = result()
-
-  end
-  style_cache_func[styleName](frame)
-
-  --- Hardcoding the sizing vars for sanity
-  local defaultWidth = mod.Conf.Wrapper.Width
-  local normalSettings = mod.defaults.Style.Format
-  frame.width = defaultWidth
-  frame.statusWidth = defaultWidth - normalSettings.status.Indent
-  frame.titleWidth = defaultWidth - normalSettings.title.Indent
-  frame.attachmentHeight = frame.attachmentHeight or 0
-
-  if frame.title then
-    frame.titleHeight = frame.title and frame.title:GetStringHeight() or 0
-    if frame.titleHeight > 0 then
-      print('add spacing to', frame.titleHeight)
-      frame.titleHeight = frame.titleHeight + (frame.title.spacing or 0)*2
-    end
-
-    frame.title.spacing = frame.title.spacing or frame.title:GetSpacing()
-    frame.title:SetPoint('LEFT', frame, 'LEFT', normalSettings.title.Indent)
-    frame.title:SetPoint('TOP', frame, 'TOP', 0, -frame.title.spacing)
-    frame.title:SetWidth(frame.width)
-    if frame.titlebg then
-      frame.titlebg:SetHeight(frame.titleHeight)
-      frame.titlebg:SetWidth(frame.width)
-    end
-    print('  titleHeight', frame.titleHeight, 'indent', normalSettings.title.Indent, 'spacing', frame.title.spacing)
-    print('    -- text:', frame.title:GetSize())
-    print('    --   bg:', frame.titlebg:GetSize())
-
-  else
-    frame.titleHeight = 0
-  end
-
-
-  if frame.status and (frame.status:GetText() or frame.attachmentHeight > 0) then
-    frame.statusHeight   = frame.status and frame.status:GetStringHeight()  or 0
-    if frame.statusHeight > 0 then
-      frame.statusHeight = frame.statusHeight  + (frame.status.spacing or 0)*2
-    end
-
-    frame.status.spacing = frame.status.spacing or frame.status:GetSpacing()
-
-    frame.status:SetWidth(frame.width)
-    frame.status:SetPoint('LEFT', frame, 'LEFT', normalSettings.status.Indent, 0)
-    frame.status:SetPoint('TOP', frame.titlebg, 'BOTTOM', 0, 0)
-    --frame.status:SetHeight(frame.statusHeight)
-    if frame.statusbg then
-
-      --frame.statusbg:SetHeight(frame.statusHeight + (frame.attachmentHeight or 0))
-      --frame.statusbg:SetPoint('BOTTOM', frame, 'BOTTOM', 0, 0)
-      frame.statusbg:SetWidth(frame.width)
-    end
-    print('  status tHeight', frame.statusHeight, 'indent', normalSettings.status.Indent, 'spacing', frame.status.spacing)
-  else
-    if frame.status then
-      frame.status:Hide()
-    end
-    if frame.statusbg then
-      frame.statusbg:Hide()
-    end
-    frame.statusHeight = 0
-  end
-
-  frame.height = frame.titleHeight + frame.statusHeight + (frame.attachmentHeight or 0)
-  frame:SetSize(frame.width, frame.height)
-  print('  |cFF0088FFsizing frame', frame.width, frame.height)
-end
-
---- Argument containers
-local o -- text flag
-local a1, a2, a3, a4, b1, b2, b3, b4 -- color1, color2
-local f1, f2, f3 -- font
-local w1, w2 -- size
-local p1, p2, p3, x, y -- path/point args
-mod.SetBlockAttribute = {}
-local sb = mod.SetBlockAttribute
-local print = B.print('Attribute')
-sb.Gradient = function(region, value)
-  print('|cFF8844FFGradient|r', region:GetName(), unpack(value))
-  o = value[1]
-  a1, a2, a3, a4 = unpack(value.MinColor)
-  b1, b2, b3, b4 = unpack(value.MaxColor)
-  region:SetVertexColor(1,1,1)
-  region:SetTexture(1,1,1,1)
-  region:SetGradientAlpha(o, a1, a2, a3, a4, b1, b2, b3, b4)
-end
-
-sb.Background = function(region, value)
-  print('|cFF0088FFBackground|r', unpack(value))
-  region:SetVertexColor(1,1,1) -- reset
-  region:SetTexture(unpack(value))
-end
-sb.BackgroundComplex = function (region, value)
-  local left, tile, right = value.Left, value.Tile, value.Right
-
-end
-sb.Font = function(region, value)
-  f1, f2, f3 = unpack(value)
-  print('|cFFFFFF00Font|r', f1, f2, f3)
-  region:SetFont(f1, f2, f3)
-end
-
-sb.Spacing = function(region, value)
-  print('FontSpacing', region:GetName(), value)
-  region:SetSpacing(value)
-  region.spacing = value
-end
-
-sb.TextColor = function(region, value)
-  a1, a2, a3, a4 = unpack(value)
-  print('TextColor', a1, a2, a3, a4)
-  region:SetTextColor(a1, a2, a3, a4)
-end
-sb.Texture = function(region, value)
-
-  p1, a1, a2, a3, a4 = unpack(value)
-  print('Texture', p1, a1, a2, a3, a4)
-  region:SetTexture(p1)
-  if a1 then
-    region:SetTexCoord(a1, a2, a3, a4)
-  end
-end
-sb.Width = function(region, value)
-  w1 = value
-  region:SetWidth(w1)
-end
-
-sb.Height = function(region, value)
-  w2 = value
-  region:SetHeight(w2)
-end
-sb.Size = function(region, value)
-  w1, w2 = unpack(value)
-  region:SetSize(w1, w2)
-end
-
--- a/ObjectiveTracker.xml	Sat Apr 09 07:32:45 2016 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,475 +0,0 @@
-<Ui>
-
-  <Frame name="VeneerObjectiveWrapper"  parent="UIParent" enableMouse="false" frameStrata="LOW">
-    <TitleRegion>
-      <Size x="300" y="30" />
-      <Anchors>
-        <Anchor point="TOP" />
-        <Anchor point="BOTTOM" relativePoint="TOP" x="0" y="-30" />
-      </Anchors>
-    </TitleRegion>
-    <Scripts>
-      <OnLoad>
-        self.toggle = true
-        --self.drag = true
-        Veneer.OnLoad(self)
-      </OnLoad>
-      <OnShow>
-      </OnShow>
-      <OnDragStart>
-        Veneer.OnDragStart(self)
-      </OnDragStart>
-      <OnDragStop>
-        Veneer.OnDragStop(self)
-        Veneer.ObjectiveTracker.UpdateActionButtons()
-      </OnDragStop>
-      <!--@config@-->
-      <!--@end-config@-->
-    </Scripts>
-    <Anchors>
-      <Anchor point="TOPRIGHT" x="-60" y="-240" />
-    </Anchors>
-    <Layers>
-
-      <Layer level="ARTWORK">
-        <Texture parentKey="BackgroundLeft" parentArray="headerComplex" />
-        <Texture parentKey="BackgroundRight" parentArray="headerComplex" />
-        <Texture parentKey="BackgroundTile" parentArray="headerComplex" />
-        <Texture parentKey="headerComplexBounds" parentArray="config" alphaMode="ADD" hidden="true">
-          <Color r="0" g="0" b="1" a="0.5" />
-          <Anchors>
-            <Anchor point="TOPLEFT" relativeKey="$parent.BackgroundLeft" />
-            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.BackgroundRight" />
-          </Anchors>
-        </Texture>
-        <Texture parentKey="FrameBounds" parentArray="config" alphaMode="ADD" hidden="true">
-          <Color r="1" g="0" b="1" a="0.25" />
-          <Anchors>
-            <Anchor point="TOPLEFT" />
-            <Anchor point="BOTTOMRIGHT"  />
-          </Anchors>
-        </Texture>
-        <!--<Texture desatuated="true" parentKey="LineGlow" hidden="false" alpha="0" alphaMode="ADD" atlas="OBJFX_LineGlow" useAtlasSize="true">
-          <Anchors>
-            <Anchor point="LEFT" relativeKey="$parent.Background" x="-21" y="18"/>
-          </Anchors>
-        </Texture>
-        <Texture parentKey="SoftGlow" hidden="false" alpha="0" alphaMode="ADD" atlas="OBJFX_Glow" useAtlasSize="true">
-          <Anchors>
-            <Anchor point="CENTER" relativeKey="$parent.Background" relativePoint="LEFT" x="49" y="20"/>
-          </Anchors>
-        </Texture>
-        <Texture parentKey="StarBurst" hidden="false" alpha="0" alphaMode="ADD" atlas="OBJFX_StarBurst" useAtlasSize="true">
-          <Anchors>
-            <Anchor point="CENTER" relativeKey="$parent.SoftGlow" x="29"/>
-          </Anchors>
-        </Texture>
-        <Texture parentKey="LineSheen" hidden="false" alpha="0" alphaMode="ADD" atlas="OBJFX_LineBurst">
-          <Size x="60" y="15"/>
-          <Anchors>
-            <Anchor point="CENTER" relativeKey="$parent.SoftGlow" x="29" y="-13"/>
-          </Anchors>
-        </Texture>-->
-      </Layer>
-      <Layer level="OVERLAY">
-
-        <!--<Texture name="$parentTCR" parentKey="outlineClosed" file="Interface\FrameGeneral\UI-Frame">
-          <Size x="40" y="30" />
-          <Color r="1" g="1" b="1" a="1" />
-          <TexCoords top=".0156" bottom=".0265" left=".625" right=".875" />
-          <Anchors>
-            <Anchor point="TOPRIGHT" relativePoint="TOPRIGHT" x="2" y="2" />
-          </Anchors>
-        </Texture>-->
-
-      </Layer>
-    </Layers>
-    <Frames>
-
-      <ScrollFrame name="$parentScrollFrame" enableMouseWheel="true" parentKey="scrollArea" parentArray="minimizeFrames">
-        <Anchors>
-          <Anchor point="TOP" />
-        </Anchors>
-        <Layers>
-          <Layer level="BACKGROUND">
-            <Texture setAllPoints="true" parentKey="bg">
-              <Color r="0.15" g=".3" b=".3" a="0" />
-            </Texture>
-          </Layer>
-        </Layers>
-        <Frames>
-
-
-          <Frame name="VeneerObjectiveScroll">
-            <Anchors>
-              <Anchor point="TOP" />
-            </Anchors>
-            <Layers>
-              <Layer level="BACKGROUND">
-                <Texture setAllPoints="true" parentKey="bg">
-                  <Color r="1" g="1" b="1" a="1" />
-                  <Gradient orientation="HORIZONTAL">
-                    <MinColor r="0" g="0.5" b="0.5" a="0" />
-                    <MaxColor r="0" g="0.5" b="0.5" a="0" />
-                  </Gradient>
-                </Texture>
-              </Layer>
-            </Layers>
-          </Frame>
-        </Frames>
-      </ScrollFrame>
-
-      <Frame name="$parentStatusHeader" parentKey="header" frameStrata="MEDIUM">
-        <Layers>
-          <Layer level="OVERLAY">
-            <FontString name="$parentTitle" parentKey="status" inherits="VeneerStatusFont" text="status test" justifyH="RIGHT">
-              <Anchors>
-                <Anchor point="TOPRIGHT" x="-64" y="0" />
-              </Anchors>
-            </FontString>
-          </Layer>
-        </Layers>
-      </Frame>
-
-      <Button name="$parentCloseButton" parentKey="CloseButton" enableMouse="true" frameStrata="MEDIUM">
-        <Size x="16" y="16" />
-        <HighlightTexture file="Interface\Buttons\UI-Panel-MinimizeButton-Highlight" alphaMode="ADD"/>
-        <Anchors>
-          <Anchor point="TOPRIGHT" relativePoint="TOPRIGHT" x="-2" y="0" />
-        </Anchors>
-      </Button>
-
-      <Button name="$parentQuestMapButton" parentArray="minimizeFrames" parentKey="QuestMapButton" frameStrata="MEDIUM">
-        <Size x="42" y="16" />
-        <HighlightTexture file="Interface\Buttons\UI-Panel-MinimizeButton-Highlight" alphaMode="ADD"/>
-        <Anchors>
-          <Anchor point="TOPRIGHT" relativePoint="TOPLEFT" relativeKey="$parent.CloseButton" x="0" y="0" />
-        </Anchors>
-      </Button>
-    </Frames>
-  </Frame>
-
-
-
-
-  <Frame name="$parentXP" parent="VeneerObjectiveWrapper" parentKey="XPBar" hidden="true">
-    <Size x="250" y="24" />
-    <Anchors>
-      <Anchor point="TOPLEFT" />
-    </Anchors>
-    <Layers>
-      <Layer level="BACKGROUND">
-        <Texture name="$parentBackground" parentKey="statusbg" setAllPoints="true"/>
-      </Layer>
-      <Layer level="ARTWORK">
-
-        <Texture name="$parentForeground" parentKey="foreground">
-          <Anchors>
-            <Anchor point="TOPLEFT" />
-            <Anchor point="BOTTOMLEFT" />
-          </Anchors>
-        </Texture>
-        <Texture name="$parentRested" parentKey="rested" >
-          <Anchors>
-            <Anchor point="TOPLEFT" />
-            <Anchor point="BOTTOMLEFT" />
-          </Anchors>
-        </Texture>
-      </Layer>
-      <Layer level="OVERLAY">
-        <FontString inherits="VeneerFontNormal" parentKey="title">
-          <Anchors>
-            <Anchor point="CENTER" />
-          </Anchors>
-        </FontString>
-      </Layer>
-    </Layers>
-  </Frame>
-
-  <!-- Header Panel -->
-
-  <!-- Background panels -->
-
-  <Frame name="VeneerTrackerTemplate" parent="UIParent" virtual="true">
-    <Layers>
-      <Layer level="BACKGROUND">
-        <Texture name="$parentTitleBackground" parentKey="titlebg">
-          <Anchors>
-            <Anchor point="TOPLEFT" />
-            <Anchor point="RIGHT" />
-          </Anchors>
-          <Color r="1" g="1" b="1" a="1" />
-          <Gradient orientation="HORIZONTAL">
-            <MinColor r="0" g="0" b="0" a="0.1" />
-            <MaxColor r="0" g="0" b="0" a="0" />
-          </Gradient>
-        </Texture>
-      </Layer>
-      <Layer level="OVERLAY">
-        <FontString name="$parentTitle" inherits="VeneerFontHighlight" text="OBJ" parentKey="title" justifyH="LEFT">
-          <Anchors>
-            <Anchor point="TOP" relativeKey="$parent.titlebg" />
-            <Anchor point="BOTTOM" relativeKey="$parent.titlebg"  />
-            <Anchor point="LEFT" relativeKey="$parent.titlebg" />
-            <Anchor point="RIGHT" relativeKey="$parent" />
-          </Anchors>
-        </FontString>
-        <FontString name="$parentStatus" inherits="VeneerStatusFont" parentKey="status" justifyH="RIGHT">
-          <Anchors>
-            <Anchor point="TOP" relativeKey="$parent.titlebg" />
-            <Anchor point="BOTTOM" relativeKey="$parent.titlebg"  />
-            <Anchor point="LEFT" relativeKey="$parent.titlebg" />
-            <Anchor point="RIGHT" relativeKey="$parent" />
-          </Anchors>
-        </FontString>
-      </Layer>
-    </Layers>
-  </Frame>
-
-
-  <Frame name="VeneerTrackerBlock" parent="VeneerObjectiveScroll" virtual="true" enableMouse="true">
-    <Layers>
-      <Layer level="BACKGROUND">
-        <Texture name="$parentTitleBackground" parentKey="titlebg">
-          <Color r="1" g="1" b="1" a="1" />
-          <Anchors>
-            <Anchor point="LEFTTOP" x="0" y="0" />
-            <Anchor point="RIGHT" />
-          </Anchors>
-        </Texture>
-        <Texture name="$parentStatusBackground" parentKey="statusbg">
-          <Anchors>
-            <Anchor point="LEFT" />
-            <Anchor point="RIGHT" />
-            <Anchor point="TOP" relativePoint="BOTTOM" relativeKey="$parent.titlebg" />
-            <Anchor point="BOTTOM" x="0" y="0" />
-          </Anchors>
-          <Color r="1" g="1" b="1" a="1" />
-          <Gradient orientation="HORIZONTAL">
-            <MinColor r="0" g="0" b="0" a=".15" />
-            <MaxColor r="0" g="0" b="0" a=".35" />
-          </Gradient>
-        </Texture>
-      </Layer>
-      <Layer level="ARTWORK">
-        <Texture name="$parentItemTile" parentKey="icon" alphaMode="BLEND" hidden="true">
-          <Anchors>
-            <Anchor point="TOPRIGHT" x="0" y="0" />
-          </Anchors>
-        </Texture>
-        <Texture parentKey="typeTag" file="Interface\QuestFrame\QuestTypeIcons" alphaMode="ADD" hidden="true">
-          <Size x="18" y="18"/>
-          <Anchors>
-            <Anchor point="TOPRIGHT" relativePoint="TOPLEFT" relativeKey="$parent.FrequencyTag" x="-3" y="-3"/>
-
-          </Anchors>
-        </Texture>
-        <Texture parentKey="frequencyTag" file="Interface\QuestFrame\QuestTypeIcons" alphaMode="ADD" hidden="true">
-          <Size x="18" y="18"/>
-          <Anchors>
-            <Anchor point="TOPRIGHT" relativePoint="TOPLEFT" relativeKey="$parent.CompletionTag" x="-3" y="-3"/>
-
-          </Anchors>
-        </Texture>
-        <Texture parentKey="completionTag" file="Interface\QuestFrame\QuestTypeIcons" alphaMode="ADD" hidden="true">
-          <Size x="18" y="18"/>
-          <Anchors>
-            <Anchor point="TOPRIGHT" relativePoint="TOPLEFT" relativeKey="$parent.icon" x="-3" y="-3"/>
-
-          </Anchors>
-        </Texture>
-        <Texture name="$parentMoneyTile" parentKey="money" hidden="true" />
-
-        <Texture parentKey="SelectionOverlay" alphaMode="ADD" hidden="true">
-          <Anchors>
-            <Anchor point="TOPLEFT" />
-            <Anchor point="BOTTOMRIGHT" />
-          </Anchors>
-          <Color r="1" g="1" b="1" a="1" />
-          <Gradient orientation="HORIZONTAL">
-            <MaxColor r="1" g="0" b="0" a="0.7" />
-            <MinColor r="1" g="0" b="0" a="0.7" />
-          </Gradient>
-        </Texture>
-      </Layer>
-      <Layer level="OVERLAY">
-        <FontString name="$parentTitle" parentKey="title" inherits="VeneerTitleFont" justifyH="LEFT" justifyV="TOP">
-          <Anchors>
-            <Anchor point="TOP" relativeKey="$parent.titlebg" />
-            <Anchor point="LEFT" relativeKey="$parent" />
-            <Anchor point="RIGHT" relativeKey="$parent" />
-          </Anchors>
-        </FontString>
-        <FontString name="$parentStatus" parentKey="status" inherits="VeneerCriteriaFontNormal" justifyH="LEFT" justifyV="TOP" wordwrap="true">
-          <Anchors>
-            <Anchor point="TOP" relativeKey="$parent.statusbg" />
-            <Anchor point="LEFT"  relativeKey="$parent" />
-            <Anchor point="RIGHT" relativeKey="$parent" />
-          </Anchors>
-        </FontString>
-        <FontString name="$parentDebugText" parentKey="debugText" inherits="VeneerCriteriaFontNormal" justifyH="RIGHT" justifyV="TOP">
-          <Anchors>
-            <Anchor point="TOPRIGHT" relativePoint="TOPRIGHT" />
-          </Anchors>
-        </FontString>
-        <FontString name="$parentItemTileText" parentKey="iconLabel" inherits="VeneerNumberFont">
-          <Anchors>
-            <Anchor point="TOPRIGHT" x="-1" y="-4" relativeKey="$parent.icon" />
-          </Anchors>
-        </FontString>
-
-
-        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
-          <Anchors>
-            <Anchor point="TOPLEFT" relativeKey="$parent.status" />
-            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.status" relativePoint="BOTTOMLEFT" x="1" y="0" />
-          </Anchors>
-          <Color r="1" g="1" b="1" a="1" />
-        </Texture>
-        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
-          <Anchors>
-            <Anchor point="TOPLEFT" relativeKey="$parent.status" />
-            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.status" relativePoint="TOPRIGHT" x="0" y="-1" />
-          </Anchors>
-          <Color r="1" g="1" b="1" a="1" />
-        </Texture>
-        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
-          <Anchors>
-            <Anchor point="TOPLEFT" relativeKey="$parent.status" relativePoint="BOTTOMLEFT" x="0" y="1" />
-            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.status" />
-          </Anchors>
-          <Color r="1" g="1" b="1" a="1" />
-        </Texture>
-
-        <Texture alphaMode="ADD" parentArray="config" hidden="true">
-          <Anchors>
-            <Anchor point="TOPLEFT" relativeKey="$parent.statusbg" x="-30" y="0" />
-            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.status" relativePoint="TOPRIGHT" x="30" y="0" />
-          </Anchors>
-          <Color r="0" g="1" b="0" a="0.5" />
-        </Texture>
-        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
-          <Anchors>
-            <Anchor point="TOPLEFT" x="-35" y="0" />
-            <Anchor point="BOTTOMRIGHT" relativePoint="TOPRIGHT" x="0" y="-1" />
-          </Anchors>
-          <Color r="1" g="0" b="0" a="1" />
-        </Texture>
-        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
-          <Anchors>
-            <Anchor point="TOPLEFT" relativePoint="BOTTOMLEFT" x="0" y="1" />
-            <Anchor point="BOTTOMRIGHT" x="35" y="0" />
-          </Anchors>
-          <Color r="1" g=".5" b="0" a="1" />
-        </Texture>
-
-      </Layer>
-      <Layer level="HIGHLIGHT">
-        <Texture name="$parentHighLight" parentKey="highlight">
-          <Anchors>
-            <Anchor point="TOPLEFT" />
-            <Anchor point="BOTTOMRIGHT" relativePoint="TOPRIGHT" x="0" y="-4"/>
-          </Anchors>
-          <Color r="1" g="1" b="1" a="1" />
-          <Gradient orientation="VERTICAL">
-            <MaxColor r="1" g="0" b=".5" a="1" />
-            <MinColor r="1" g="0" b=".5" a="0" />
-          </Gradient>
-        </Texture>
-        <Texture name="$parentLowLight" parentKey="lowlight">
-          <Anchors>
-            <Anchor point="TOP" relativePoint="BOTTOM" x="0" y="14" />
-            <Anchor point="BOTTOM"  x="0" y="0"/>
-            <Anchor point="RIGHT" />
-            <Anchor point="LEFT" />
-          </Anchors>
-          <Color r="1" g="1" b="1" a="1" />
-          <Gradient orientation="VERTICAL">
-            <MaxColor r="1" g="0" b=".5" a="0" />
-            <MinColor r="1" g="0" b=".5" a="1" />
-          </Gradient>
-        </Texture>
-      </Layer>
-    </Layers>
-  </Frame>
-
-  <Frame name="VeneerTrackerObjective" virtual="true" hidden="true">
-    <Anchors>
-      <Anchor point="RIGHT" />
-    </Anchors>
-    <Layers>
-      <Layer level="OVERLAY">
-        <FontString inherits="VeneerCriteriaFontNormal" parentKey="status" wordwrap="true" justifyH="LEFT" justifyV="TOP">
-          <Anchors>
-            <Anchor point="TOP" />
-            <Anchor point="LEFT" />
-            <Anchor point="RIGHT" />
-          </Anchors>
-        </FontString>
-
-        <!-- debugging guides -->
-        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
-          <Anchors>
-            <Anchor point="TOPLEFT" x="0" y="600" />
-            <Anchor point="BOTTOMRIGHT"  relativePoint="BOTTOMLEFT" x="1" y="-600" />
-          </Anchors>
-          <Color r="0" g="1" b="0" a="1" />
-        </Texture>
-        <Texture alphaMode="ADD" parentArray="config" hidden="true">
-          <Anchors>
-            <Anchor point="TOPLEFT" relativeKey="$parent" x="0" y="600" />
-            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.status" relativePoint="BOTTOMLEFT" x="0" y="-600" />
-          </Anchors>
-          <Color r="0" g=".4" b="1" a=".25" />
-        </Texture>
-        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
-          <Anchors>
-            <Anchor point="TOPLEFT" relativeKey="$parent.status" relativePoint="TOPRIGHT" x="-1" y="200" />
-            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.status" x="0" y="-600" />
-          </Anchors>
-          <Color r="0" g="1" b="0" a=".5" />
-        </Texture>
-
-        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
-          <Anchors>
-            <Anchor point="TOPLEFT" relativeKey="$parent.status" x="-30" y="0" />
-            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.status" relativePoint="TOPRIGHT" x="0" y="-1" />
-          </Anchors>
-          <Color r="1" g="0" b="0" a="0.5" />
-        </Texture>
-        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
-          <Anchors>
-            <Anchor point="TOPLEFT" relativePoint="BOTTOMLEFT" relativeKey="$parent.status" x="0" y="1" />
-            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.status" relativePoint="BOTTOMRIGHT" x="30" y="0" />
-          </Anchors>
-          <Color r="1" g="0" b="0" a="0.5" />
-        </Texture>
-
-        <!-- end debugging guides -->
-
-      </Layer>
-      <Layer level="BACKGROUND">
-        <Texture parentKey="statusbg">
-          <Anchors>
-            <Anchor point="TOP" />
-            <Anchor point="LEFT" />
-            <Anchor point="RIGHT" />
-            <Anchor point="BOTTOM" />
-          </Anchors>
-        </Texture>
-      </Layer>
-    </Layers>
-  </Frame>
-
-  <Include file="ObjectiveSecure.xml" />
-  <Include file="ObjectiveWidgets.xml" />
-
-  <Script file="ObjectiveCore.lua" />
-  <Script file="ObjectiveInfo.lua" />
-  <Script file="ObjectiveUI.lua" />
-  <Script file="ObjectiveStyle.lua" />
-  <Script file="ObjectiveFrame.lua" />
-  <Script file="ObjectiveEvents.lua" />
-  <Script file="ObjectiveWidgets.lua" />
-  <Script file="XPTracker.lua" />
-</Ui>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ObjectiveTracker/ObjectiveCore.lua	Sun Apr 10 04:35:32 2016 -0400
@@ -0,0 +1,451 @@
+--- ${PACKAGE_NAME}
+-- @file-author@
+-- @project-revision@ @project-hash@
+-- @file-revision@ @file-hash@
+-- Created: 3/26/2016 1:51 AM
+local B, _G = select(2,...).frame, _G
+local pairs, setmetatable, type, tostring, band, format = _G.pairs, _G.setmetatable, _G.type, _G.tostring, bit.band, string.format
+local ipairs, tinsert, hooksecurefunc = _G.ipairs, _G.tinsert, _G.hooksecurefunc
+local PlaySoundFile, IsQuestTask, SortQuestWatches, GetCurrentMapAreaID, GetZoneText, GetMinimapZoneText = PlaySoundFile, IsQuestTask, SortQuestWatches, GetCurrentMapAreaID, GetZoneText, GetMinimapZoneText
+local AddQuestWatch, SetSuperTrackedQuestID, GetNumQuestWatches, AUTO_QUEST_WATCH, MAX_WATCHABLE_QUESTS = AddQuestWatch, SetSuperTrackedQuestID, GetNumQuestWatches, AUTO_QUEST_WATCH, MAX_WATCHABLE_QUESTS
+local QuestPOIUpdateIcons, GetCVar, IsPlayerInMicroDungeon, WorldMapFrame, GetCVarBool, SetMapToCurrentZone = QuestPOIUpdateIcons, GetCVar, IsPlayerInMicroDungeon, WorldMapFrame, GetCVarBool, SetMapToCurrentZone
+local AddAutoQuestPopUp = AddAutoQuestPopUp
+local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
+local print = B.print('Objectives')
+local ObjectiveTrackerFrame, VeneerObjectiveScroll, CreateFrame = _G.ObjectiveTrackerFrame, _G.VeneerObjectiveScroll, _G.CreateFrame
+local Wrapper = _G.VeneerObjectiveWrapper
+local Scroller = VeneerObjectiveWrapper.scrollArea
+local Scroll = _G.VeneerObjectiveScroll
+
+--- Performance values
+--[[
+  self:RegisterEvent("QUEST_LOG_UPDATE");
+	self:RegisterEvent("TRACKED_ACHIEVEMENT_LIST_CHANGED");
+	self:RegisterEvent("QUEST_WATCH_LIST_CHANGED");
+	self:RegisterEvent("QUEST_AUTOCOMPLETE");
+	self:RegisterEvent("QUEST_ACCEPTED");
+	self:RegisterEvent("SUPER_TRACKED_QUEST_CHANGED");
+	self:RegisterEvent("SCENARIO_UPDATE");
+	self:RegisterEvent("SCENARIO_CRITERIA_UPDATE");
+	self:RegisterEvent("TRACKED_ACHIEVEMENT_UPDATE");
+	self:RegisterEvent("ZONE_CHANGED_NEW_AREA");
+	self:RegisterEvent("ZONE_CHANGED");
+	self:RegisterEvent("QUEST_POI_UPDATE");
+	self:RegisterEvent("VARIABLES_LOADED");
+	self:RegisterEvent("QUEST_TURNED_IN");
+	self:RegisterEvent("PLAYER_MONEY");
+ ]]
+
+
+--- These are the bitfields used by Blizzard_ObjectiveTracker to determine which segments get parsed.
+--- They are replicated here so that plugins can make use of any securehook args involving this info.
+local OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST                       -- 0x0100
+local OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP = OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP	-- 0x0200
+local OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE = OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE		-- 0x0400
+local OBJECTIVE_TRACKER_UPDATE_MODULE_SCENARIO = OBJECTIVE_TRACKER_UPDATE_MODULE_SCENARIO	    		        -- 0x0800
+local OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT	= OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT           -- 0x1000
+
+
+local OBJECTIVE_TRACKER_UPDATE_STATIC = OBJECTIVE_TRACKER_UPDATE_STATIC					                         	-- 0x0000
+local OBJECTIVE_TRACKER_UPDATE_ALL = OBJECTIVE_TRACKER_UPDATE_ALL			                    	          		-- 0xFFFF
+local OBJECTIVE_TRACKER_UPDATE_ID = OBJECTIVE_TRACKER_UPDATE_ID                                           -- 0
+
+local OBJECTIVE_TRACKER_UPDATE_QUEST = OBJECTIVE_TRACKER_UPDATE_QUEST				        	                  	-- 0x0001
+local OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED = OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED		               		    -- 0x0002
+local OBJECTIVE_TRACKER_UPDATE_TASK_ADDED = OBJECTIVE_TRACKER_UPDATE_TASK_ADDED		    	              		-- 0x0004
+local OBJECTIVE_TRACKER_UPDATE_SCENARIO = OBJECTIVE_TRACKER_UPDATE_SCENARIO			      	                 	-- 0x0008
+local OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE = OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE		       	-- 0x0010
+local OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT			                   	-- 0x0020
+local OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED		  	      -- 0x0040
+local OBJECTIVE_TRACKER_UPDATE_SCENARIO_BONUS_DELAYED = OBJECTIVE_TRACKER_UPDATE_SCENARIO_BONUS_DELAYED		-- 0x0080
+
+local OBJECTIVE_TRACKER_UPDATE_REASON = OBJECTIVE_TRACKER_UPDATE_ALL -- default
+--- Used to determine which trackers are listening for money events
+mod.watchMoneyReasons = 0
+
+--- Baseline defaults table; values defined in the files that they pertain to
+mod.defaults = {}
+
+--- Tracker display order
+mod.orderedNames = {'Bonus', 'AutoQuest', 'Quest', 'Cheevs'}
+
+--- ipairs() argument tables
+mod.orderedHandlers = setmetatable({}, {__mode = "k"})
+mod.orderedTrackers = setmetatable({}, {__mode = "k"})
+mod.indexedTrackers = setmetatable({}, {__mode = "k"})
+
+--- pairs() argument tables
+mod.namedTrackers = setmetatable({}, {__mode = "k"})
+
+local WRAPPER_ANCHOR_POINT = 'TOPRIGHT'
+local WRAPPER_OFFSET_X = 0
+local WRAPPER_OFFSET_Y = -200
+local WRAPPER_MAX_HEIGHT = 670
+local WRAPPER_WIDTH = 280
+local WRAPPER_HEADER_HEIGHT = 24
+
+mod.defaults.Wrapper = {
+  AnchorPoint = WRAPPER_ANCHOR_POINT,
+  OffsetX = WRAPPER_OFFSET_X,
+  OffsetY = WRAPPER_OFFSET_Y,
+  Height = WRAPPER_MAX_HEIGHT,
+  Width = WRAPPER_WIDTH,
+  HeaderHeight = WRAPPER_HEADER_HEIGHT,
+  TextSpacing = 3,
+  TitleSpacing = 3,
+}
+
+
+
+--- Tracker module definitions begin here; innards dealing with data retreival and output are defined further in
+mod.DefaultHandler = {
+  previousHeight = 0,
+
+  name = "temp",
+  displayName = "temp",
+  updateReasonModule = 0xFF00,
+  updateReasonEvent  = 0x00FF,
+
+  numWatched = 0,   --- number of entries being handled
+  numBlocks = 0,    --- number of blocks created
+  actualBlocks = 0, --- number of blocks in use
+
+  freeBlocks = {},  --- block heap
+  usedBlocks = {},
+
+  Info = {},        -- find data by ID
+  BlockInfo = {},   -- find data by block ID
+  Watched = {},     -- find watchIndex by data ID
+  WatchInfo = {},   -- find data by watch index
+  WatchBlock = {},  -- find block by watch index
+}
+
+mod.AutoQuest = {
+  name = "AutoQuest",
+  displayName = "Notice",
+  updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST,
+  updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST +
+      OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED,
+}
+mod.Quest = {
+  name = "Quest",
+  displayName = "Quests",
+  updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST,
+  updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST +
+      OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED,
+}
+mod.Cheevs = {
+  name = "Cheevs",
+  displayName = "Achievements",
+  updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT,
+  updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT +
+      OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED,
+}
+mod.Bonus = {
+  name = "Bonus",
+  displayName = "Bonus Objectives",
+  updateReasonModule = OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE,
+  updateReasonEvents = OBJECTIVE_TRACKER_UPDATE_QUEST + OBJECTIVE_TRACKER_UPDATE_TASK_ADDED
+}
+
+local Tracker_string = function (self)
+  return self.name
+end
+local Tracker_call = function (self, reason)
+  self:Update(reason)
+end
+local Handler_Initialize = function (self, name, index)
+  print('Initializing |cFF00FFFF'..name..'|r module...')
+
+  local handler = setmetatable(mod[name] or {}, {
+    __tostring = Tracker_string,
+    __call = Tracker_call
+  })
+  if type(mod.orderedHandlers[index]) == 'table' then
+    return mod.orderedHandlers[index]
+  end
+
+  print('|cFFFFFF00Acquiring locals')
+  local preset = {}
+  for k, _ in pairs(handler) do
+    preset[k] = true
+  end
+
+
+  print('|cFFFF8800Inheriting')
+  for k, v in pairs(self) do
+    if not handler[k] then
+      if type(v) == 'table' then
+        -- assume all tables to be local data; don't inherit or ref
+        handler[k] = {}
+      else
+        handler[k] = self[k]
+      end
+      print('copying', k)
+    end
+  end
+  print('|cFFFF4400'..tostring(name)..'|r:')
+  for k, v in pairs(handler) do
+    print(format("%32s %8s %s", (preset[k] and '|cFFFFFFFF' or '|cFFFFFF00') .. k .. '|r', type(v), tostring(v)))
+  end
+
+  mod[name] = handler
+
+  local trackerName = 'Veneer'..name..'Tracker'
+  local handler = mod[name]
+  local frame = CreateFrame('Frame', trackerName, _G.VeneerObjectiveScroll, 'VeneerTrackerTemplate')
+  frame.title:SetText(handler.displayName)
+  mod.SetBlockStyle(frame, 'Tracker', 'Normal')
+  handler.frame = frame
+  handler.trackerName = trackerName
+  handler.lines = {}
+  mod.orderedTrackers[index] = frame
+  mod.namedTrackers[name] = frame
+  mod.indexedTrackers[handler] = frame
+  print('|cFFFF0088' .. trackerName .. '|r created for |cFF00FFFF' .. handler.displayName .. '|r module')
+
+  mod.orderedHandlers[index] = handler
+  return true
+end
+
+local Event = {}
+Event.QUEST_LOG_UPDATE =  function()
+  return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST + OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE
+end
+Event.QUEST_ACCEPTED = function(questLogIndex, questID)
+  if ( IsQuestTask(questID) ) then
+    return OBJECTIVE_TRACKER_UPDATE_TASK_ADDED, questID
+  else
+    if ( AUTO_QUEST_WATCH == "1" and GetNumQuestWatches() < MAX_WATCHABLE_QUESTS ) then
+      AddQuestWatch(questLogIndex);
+      SetSuperTrackedQuestID(questID);
+    end
+    return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST
+  end
+end
+
+Event.QUEST_WATCH_LIST_CHANGED = function(questID, added)
+  if ( added ) then
+    if ( not IsQuestTask(questID) ) then
+      return OBJECTIVE_TRACKER_UPDATE_QUEST_ADDED, questID, added
+    end
+  else
+    return OBJECTIVE_TRACKER_UPDATE_QUEST, questID, added
+  end
+end
+
+Event.QUEST_POI_UPDATE = function()
+  QuestPOIUpdateIcons();
+  if ( GetCVar("trackQuestSorting") == "proximity" ) then
+    SortQuestWatches();
+  end
+  return OBJECTIVE_TRACKER_UPDATE_ALL
+end
+Event.SUPER_TRACKED_QUEST_CHANGED = function()
+  return OBJECTIVE_TRACKER_UPDATE_QUEST
+end
+Event.ZONE_CHANGED = function()
+
+  local inMicroDungeon = IsPlayerInMicroDungeon();
+  if ( inMicroDungeon ~= mod.inMicroDungeon ) then
+    if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then
+      SetMapToCurrentZone();			-- update the zone to get the right POI numbers for the tracker
+    end
+    --SortQuestWatches();
+    mod.inMicroDungeon = inMicroDungeon;
+  end
+end
+Event.QUEST_AUTOCOMPLETE = function(questId)
+  AddAutoQuestPopUp(questId, "COMPLETE");
+  return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST + OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP
+end
+Event.SCENARIO_CRITERIA_UPDATE =  function()
+  return OBJECTIVE_TRACKER_UPDATE_SCENARIO
+end
+Event.SCENARIO_UPDATE = function(newStage)
+  if ( newStage ) then
+    return OBJECTIVE_TRACKER_UPDATE_SCENARIO_NEW_STAGE
+  else
+    return OBJECTIVE_TRACKER_UPDATE_SCENARIO
+  end
+end
+Event.TRACKED_ACHIEVEMENT_UPDATE = function()
+  return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT
+end
+Event.TRACKED_ACHIEVEMENT_LIST_CHANGED = function(achievementID, added)
+  if ( added ) then
+    return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED, achievementID
+  else
+    return OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT
+  end
+end
+Event.ZONE_CHANGED_NEW_AREA = function ()
+  if ( not WorldMapFrame:IsShown() and GetCVarBool("questPOI") ) then
+    SetMapToCurrentZone();			-- update the zone to get the right POI numbers for the tracker
+  end
+  SortQuestWatches();
+  mod.currentZoneArea = GetCurrentMapAreaID()
+  print('Updating zone ID to', mod.currentZoneArea, '=', GetZoneText(), GetMinimapZoneText())
+
+
+  return OBJECTIVE_TRACKER_UPDATE_TASK_ADDED
+end
+
+
+Event.PLAYER_MONEY = function()
+  if mod.watchMoneyReasons > 0 then
+    return mod.watchMoneyReasons
+  end
+end
+Event.CRITERIA_COMPLETE = function()
+  return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE
+end
+Event.QUEST_TURN_IN = function(questID, xp, money)
+  if ( IsQuestTask(questID) ) then
+    mod.Bonus:OnTurnIn(questID, xp, money)
+    print('updating bonus modules (code', OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, ',', questID, xp, money)
+    return OBJECTIVE_TRACKER_UPDATE_MODULE_BONUS_OBJECTIVE, questID, xp, money
+  else
+    return OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST, questID, xp, money
+  end
+end
+mod.Event = Event
+
+--- Done once per ui load
+local BlizzHooks = {
+  ['AddQuestWatch'] = 'AddQuestWatch',
+  ['RemoveQuestWatch'] = 'RemoveQuestWatch',
+  ['AbandonQuest'] = 'AbandonQuest',
+  ['AcknowledgeAutoAcceptQuest'] = 'AcknowledgeAutoAcceptQuest',
+  ['AddAutoQuestPopUp'] = 'AddAutoQuestPopUp',
+  ['RemoveAutoQuestPopUp'] = 'RemoveAutoQuestPopUp',
+  ['AddTrackedAchievement'] = 'AddTrackedAchievement',
+  ['RemoveTrackedAchievement'] = 'RemoveTrackedAchievement',
+  ['SetSuperTrackedQuestID'] = 'SetSuperTrackedQuestID'
+}
+local VeneerData
+
+mod.SetWatchMoney = function(watchMoney, reason)
+  if watchMoney then
+    if band(mod.watchMoneyReasons, reason) == 0 then
+      mod.watchMoneyReasons = mod.watchMoneyReasons + reason;
+    end
+  else
+    if band(mod.watchMoneyReasons, reason) > 0 then
+      mod.watchMoneyReasons = mod.watchMoneyReasons - reason;
+    end
+  end
+end
+mod.animateReasons = 0
+mod.SetAnimate = function(animate, reason)
+  if animate then
+    if band(mod.animateReasons, reason) == 0 then
+      mod.animateReasons = mod.animateReasons + reason
+    end
+  else
+    if band(mod.animateReasons, reason) > 0 then
+      mod.animateReasons = mod.animateReasons - reason
+    end
+  end
+end
+
+
+function mod:OnInitialize()
+  local c = mod.Conf.Wrapper
+  VeneerData = _G.VeneerData
+  VeneerData.CallLog = VeneerData.CallLog or {}
+  if not mod.isHooked then
+    mod.isHooked = true
+    for blizzFunc, veneerFunc in pairs(BlizzHooks) do
+      if mod[veneerFunc] then
+        hooksecurefunc(blizzFunc, mod[veneerFunc])
+      else
+        hooksecurefunc(blizzFunc, function(...)
+          print('|cFFFF0088securehook('..tostring(blizzFunc)..')|r args:', ...)
+          tinsert(VeneerData.CallLog, {blizzFunc, ...})
+        end)
+      end
+    end
+  end
+
+  mod.Conf.TasksLog = mod.Conf.TasksLog or {}
+
+  Scroller:SetScrollChild(Scroll)
+  Scroller:SetWidth(c.Width)
+  Scroll:SetWidth(c.Width)
+  Scroll:ClearAllPoints()
+  Scroll:SetPoint('TOP', Scroller, 'TOP')
+  ObjectiveTrackerFrame:UnregisterAllEvents()
+  ObjectiveTrackerFrame:Hide()
+
+  if B.Conf.FrameState[Wrapper:GetName()] == 0 then
+    Scroller:Hide()
+  end
+end
+
+local Play = function(file) if Devian and Devian.InWorkspace() then PlaySoundFile(file) end end
+
+function mod:OnEvent (event, ...)
+  local isHandled
+  print('OnEvent(|cFF00FF00'.. event ..'|r):', ...)
+  local reason, arg1, arg2, arg3
+  if Event[event] then
+    if type(Event[event]) == 'function' then
+      Play([[Interface\Addons\SharedMedia_MyMedia\sound\Info.ogg]])
+      reason, arg1, arg2, arg3 = Event[event](...)
+    elseif type(Event[event]) == 'table' then
+      Play([[Interface\Addons\SharedMedia_MyMedia\sound\Link.ogg]])
+      for i, action in ipairs(Event[event]) do
+        if type(action) == 'function' then
+          reason, arg1, arg2, arg3 = action(event, ...)
+        else
+          reason = action
+        end
+
+        if reason then
+          mod:Update(reason, arg1, arg2, arg3)
+        end
+      end
+    else
+      Play([[Interface\Addons\SharedMedia_MyMedia\sound\Heart.ogg]])
+      reason = Event[event]
+    end
+  else
+    Play([[Interface\Addons\SharedMedia_MyMedia\sound\Quack.ogg]])
+  end
+  if reason then
+    mod:Update(reason, arg1, arg2, arg3)
+  else
+    print('no reason value returned')
+    Play([[Interface\Addons\SharedMedia_MyMedia\sound\Quack.ogg]])
+  end
+end
+
+--- Done any time the the minimize button is toggled up
+function mod:OnEnable()
+  for id, name in ipairs(mod.orderedNames) do
+    if not mod.orderedHandlers[id] then
+      Handler_Initialize(mod.DefaultHandler, name, id)
+    end
+  end
+
+  for event, action in pairs(Event) do
+    print('|cFFFF0088listen to', event, 'for action|r', tostring(action))
+    Wrapper:RegisterEvent(event)
+  end
+
+  Wrapper:SetScript('OnEvent', mod.OnEvent)
+  local c = mod.Conf.Wrapper
+  Wrapper:SetWidth(c.Width)
+
+  mod.InitializeWidgets()
+  mod:Update()
+
+
+end
+
+function mod:OnDisable()
+  Wrapper:UnregisterAllEvents()
+end
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ObjectiveTracker/ObjectiveEvents.lua	Sun Apr 10 04:35:32 2016 -0400
@@ -0,0 +1,76 @@
+--- ${PACKAGE_NAME}
+-- @file-author@
+-- @project-revision@ @project-hash@
+-- @file-revision@ @file-hash@
+-- Created: 3/30/2016 1:23 AM
+local B = select(2,...).frame
+local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
+local print = B.print('Objectives')
+
+--------------------------------------------------------------------
+--- Events that are handled by Blizzard_ObjectiveTracker
+--------------------------------------------------------------------
+
+-------------------------------------------------------------------
+--- Function hooks for BlizzUI compatibility
+-------------------------------------------------------------------
+mod.AddQuestWatch = function(questID)
+    mod:Update(0x00000003)
+end
+
+local Quest = mod.Quest
+mod.RemoveQuestWatch = function(questIndex, ...)
+  print('|cFFFF8800RemoveQuestWatch', questIndex, ...)
+
+  local info = mod.Quest.LogInfo[questIndex]
+
+  -- remove quest refs
+  local block = Quest.QuestBlock[info.questID]
+  Quest.QuestBlock[info.questID] = nil
+  Quest.LogBlock[questIndex] = nil
+
+  -- remove if they still match
+  if Quest.WatchInfo[info.watchIndex] == info then
+    print('cleaning dead WatchInfo entry')
+    Quest.WatchInfo[info.watchIndex] = nil
+  end
+
+  mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST)
+end
+
+mod.AddTrackedAchievement = function(cheevID)
+  mod.CleanWidgets()
+  mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT)
+end
+
+
+mod.RemoveTrackedAchievement = function(cheevID)
+  print('|cFFFF8800UntrackAchievement', cheevID)
+  mod.CleanWidgets()
+  mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT)
+end
+
+mod.AcceptQuest = function()
+  mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST_ADDED)
+end
+
+mod.AbandonQuest = function()
+  QuestPOIUpdateIcons()
+  mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST)
+end
+mod.TurnInQuest = function()
+  QuestPOIUpdateIcons()
+  mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_QUEST)
+end
+mod.AddAutoQuestPopUp = function(...)
+   mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP)
+end
+mod.RemoveAutoQuestPopUp = function(...)
+  mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_AUTO_QUEST_POPUP)
+end
+
+
+
+mod.SetSuperTrackedQuestID = function(questID)
+  --mod:Update()
+end
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ObjectiveTracker/ObjectiveFrame.lua	Sun Apr 10 04:35:32 2016 -0400
@@ -0,0 +1,861 @@
+--- ${PACKAGE_NAME}
+-- @file-author@
+-- @project-revision@ @project-hash@
+-- @file-revision@ @file-hash@
+-- Created: 3/30/2016 12:49 AM
+local B = select(2,...).frame
+local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
+local _G, ipairs, max, min, unpack, floor, pairs, tostring, type, band = _G, ipairs, max, min, unpack, floor, pairs, tostring, type, bit.band
+local IsResting, UnitXP, UnitXPMax, GetXPExhaustion = IsResting, UnitXP, UnitXPMax, GetXPExhaustion
+local UnitLevel, IsQuestWatched, UIParent = UnitLevel, IsQuestWatched, UIParent
+local GetAutoQuestPopUp, GetQuestLogCompletionText = GetAutoQuestPopUp, GetQuestLogCompletionText
+local PERCENTAGE_STRING, GetQuestProgressBarPercent = PERCENTAGE_STRING, GetQuestProgressBarPercent
+local Default, AutoQuest, Quest, Bonus, Cheevs = T.DefaultHandler, T.AutoQuest, T.Quest, T.Bonus, T.Cheevs
+local InCombatLockdown, format, lshift, CreateFrame = InCombatLockdown, format, bit.lshift, CreateFrame
+local print = B.print('Tracker')
+local unitLevel = 1
+local OBJECTIVE_TRACKER_UPDATE_REASON = OBJECTIVE_TRACKER_UPDATE_REASON
+local debug = false
+--------------------------------------------------------------------
+--- Global frame layout
+--------------------------------------------------------------------
+
+--- Upvalues
+local Wrapper = _G.VeneerObjectiveWrapper
+local Scroller = Wrapper.scrollArea
+local Scroll = _G.VeneerObjectiveScroll
+local orderedHandlers = T.orderedHandlers
+local orderedNames = T.orderedNames
+
+--- Temp values set during updates
+local wrapperWidth, wrapperHeight
+local scrollWidth, scrollHeight
+local previousBlock
+local currentBlock
+--- todo: source these from config
+local itemButtonSize, itemButtonSpacing =  36, 1
+local titleFont, textFont = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Regular.ttf]]
+local titleSize, textSize = 16, 16
+local titlebg, textbg = {'HORIZONTAL', 1, 0, .7, .25, 1, 0, .7, .125}, {'HORIZONTAL', 0, 0, 0, 0.4, 0, 0, 0, 0 }
+local titlebg_daily, textbg_daily = {'HORIZONTAL', 0, .7, 1, .25, 0, 1, .7, .125}, {'HORIZONTAL', 0, .7, 1, .1, 0, 1, .7, .075 }
+local textbg_account,titlebg_account = {'HORIZONTAL', 0, .45, 1, .25, 0,  .45, 1, .125}, {'HORIZONTAL', 0, .45, 1, 0.4, 0,  .41, 1, .085 }
+local selectionbg = {'HORIZONTAL', 1, 1, 1, 0, 1, 1, 1, 0.225}
+local titleOutline, textOutline = "OUTLINE", "OUTLINE"
+local titleSpacing, textSpacing, blockSpacing = 3, 3, 1
+local titleIndent, textIndent,selectionIndent = 2, 5, 50
+local wrapperMaxWidth, wrapperMaxHeight = 270, 490 -- these are the hard bounds, actual *Height variables are changed
+local wrapperHeadFont, wrapperHeadSize, wrapperHeadOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 16, 'NONE'
+local headerFont, headerSize, headerHeight = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 18, 24
+local headerOutline, headerColor, headerSpacing = 'OUTLINE', {1,1,1,1}, 2
+local wrapperPosition = {'RIGHT', UIParent, 'RIGHT', -84, 0 }
+local rewardSize = 32
+local oprint = B.print('Objectives')
+local bprint = B.print('Block')
+local tprint = B.print('Tracker')
+local lprint = B.print('Line')
+
+local currentPosition, anchorFrame, anchorPoint
+
+T.colors ={
+  default = {
+    titlebg = {'HORIZONTAL', 1, 0, .7, .25,    1, 0, .7, .125},
+    textbg = {'HORIZONTAL', 0, 0, 0, 0.4,      0, 0, 0, 0 },
+    selectionbg = {'HORIZONTAL', 1, 1, 1, 0, 1, 1, 1, 0.225},
+  },
+  daily = {
+    titlebg = {'HORIZONTAL', 0, .7, 1, .25,  0, 1, .7, .125},
+    textbg = {'HORIZONTAL', 0, .7, 1, .1,    0, 1, .7, .075 },
+  },
+  weekly = {
+    titlebg = {'HORIZONTAL', 0, .35, .7, .25,   0, .35, .7, .125},
+    textbg = {'HORIZONTAL', 0, .35, .7, .1,     0, .35, .7, .075 },
+  },
+  account = {
+    titlebg = {'HORIZONTAL', .1, .1, .1, .25, .1, .1, .1, .125},
+    textbg = {'HORIZONTAL', .1, .1, .1, 0.4, .1, .1, .1, .085 },
+  },
+  -- alliance
+  faction_1 = {
+    titlebg = {'HORIZONTAL', .2, .4, 1, 0.4, .2, .4, 1, .085 },
+    textbg = {'HORIZONTAL', .2, .4, 1, 0.4, .2, .4, 1, .085 },
+  },
+  -- horde
+  faction_2 = {
+    titlebg = {'HORIZONTAL', .6, 0, 0.4, 0.4,  .6, 0, 0.4, .085 },
+    textbg = {'HORIZONTAL', .6, 0, 0.4, 0.4,   .6, 0, 0.4, .085 },
+  }
+}
+
+T.AddBlock = function(handler, block)
+  local print = bprint
+end
+
+--- Used as an iterator of sorts for cascaded tag icon placements (the daily/faction/account icons)
+T.AddTag = function (block, tagName, tagPoint, tagAnchor, tagRelative)
+  local print = bprint
+  local tag = block[tagName]
+  if block.info[tagName] and tag then
+    tag:SetTexCoord(unpack(block.info[tagName]))
+    tag:Show()
+    tag:SetPoint(tagPoint, tagAnchor, tagRelative, 0, 0)
+    tagPoint, tagAnchor, tagRelative = 'TOPRIGHT', tag, 'TOPLEFT'
+  else
+    block[tagName]:Hide()
+  end
+  return tagPoint, tagAnchor, tagRelative
+end
+
+--- Adds the given line to the current content and advances the anchor pointer to that new line for the following call.
+T.AddLine = function(block, line)
+  local print = lprint
+  line:ClearAllPoints()
+  line:SetPoint('LEFT', block, 'LEFT', 0, 0)
+  line:SetPoint('TOP', block.endPoint, 'BOTTOM', 0, -textSpacing)
+  line:SetPoint('RIGHT', block, 'RIGHT', 0, 0)
+  line:SetHeight(line.height)
+  line:Show()
+
+  block.endIndex = line.index
+  block.numLines = block.numLines + 1
+  block.attachmentHeight = block.attachmentHeight + (line.height + textSpacing)
+  print('     |cFF0088FFsetting line #'..block.numLines..' for|r', block.info.title, "\n            |cFF0088FFsize:|r", line.height,
+    "|cFF0088FFpoint:|r", line:GetPoint(1), "|cFF0088FFwidget:|r", (line.widget and 'Y' or 'N'))
+  block.endPoint = line
+end
+
+--- Creates or retrieves a complete line data object
+T.GetLine = function(handler, block, lineIndex)
+  local print = lprint
+  local blockIndex = block.index
+  if not block.lines then
+    block.lines = {}
+  end
+  local lines = block.lines
+  if not lines[lineIndex] then
+    print('     |cFF00FF88created line #'..lineIndex..' from for '..handler.name..' block #'..blockIndex)
+    lines[lineIndex] = CreateFrame('Frame', 'Vn'..handler.name .. blockIndex..'ObjectiveLine'..lineIndex, block, 'VeneerTrackerObjective')
+    local line = lines[lineIndex]
+    line.index = lineIndex
+    line.height = 0
+    line.status:SetSpacing(textSpacing)
+    line.status:SetPoint('LEFT', line, 'LEFT', textIndent, 0)
+    B.SetConfigLayers(line)
+
+    if lines[lineIndex+1] then
+      lines[lineIndex+1]:ClearAllPoints()
+    end
+
+    if debug then
+      for _, region in ipairs(lines[lineIndex].debug) do
+        region:Show()
+      end
+    end
+
+  end
+  return lines[lineIndex]
+end
+
+--- Creates or retrieves a complete block frame object
+T.GetBlock = function(handler, blockIndex)
+  local print = bprint
+  local block = handler.usedBlocks[blockIndex]
+
+  if not handler.usedBlocks[blockIndex] then
+    if #handler.freeBlocks >= 1 then
+      block = handler.freeBlocks[#handler.freeBlocks]
+      handler.freeBlocks[#handler.freeBlocks] = nil
+    else
+      block = CreateFrame('Frame', 'Veneer'..tostring(handler)..'Block'..blockIndex, Scroll, 'VeneerTrackerBlock')
+
+
+
+      local c = T.Conf.Wrapper
+      block.index = blockIndex
+      block.SetStyle = T.SetBlockStyle
+      block:SetWidth(c.Width)
+
+      block.title:SetSpacing(c.TitleSpacing)
+      block.title:SetPoint('TOP', block, 'TOP', 0, -titleSpacing)
+
+      block.titlebg:SetTexture(1,1,1,1)
+      block.titlebg:SetGradientAlpha(unpack(colors.default.titlebg))
+      block.titlebg:SetPoint('TOP', block, 'TOP', 0, 0)
+      block.titlebg:SetPoint('BOTTOM', block.title, 'BOTTOM', 0, -titleSpacing)
+
+      block.status:SetSpacing(c.TextSpacing)
+      block.status:SetPoint('TOP', block.titlebg, 'BOTTOM', 0, -textSpacing)
+      block.status:SetPoint('LEFT', block.titlebg, 'LEFT', textIndent, 0)
+
+      block.statusbg:SetPoint('TOP', block.titlebg, 'BOTTOM', 0, 0)
+      block.statusbg:SetPoint('BOTTOM', block, 'BOTTOM', 0, 0)
+      block.statusbg:SetTexture(1,1,1,1)
+      block.statusbg:SetGradientAlpha(unpack(colors.default.textbg))
+
+      block.SelectionOverlay:SetGradientAlpha(unpack(colors.default.selectionbg))
+      block.SelectionOverlay:SetPoint('TOPLEFT', selectionIndent, 0)
+      block.SelectionOverlay:SetPoint('BOTTOMRIGHT')
+
+      block.icon:SetSize(rewardSize, rewardSize)
+      block.icon:SetPoint('TOPRIGHT', block, 'TOPRIGHT', -2, -2)
+
+
+      --- methods for event handlers
+
+      block.Select = handler.Select
+      block.Open = handler.Open
+      block.Remove = handler.Remove
+      block.Link = handler.Link
+      block:SetScript('OnMouseUp', handler.OnMouseUp)
+      block:SetScript('OnMouseDown', handler.OnMouseDown)
+      block.attachmentHeight = 0
+      block:ClearAllPoints()
+
+      B.SetConfigLayers(block)
+
+      if debug then
+        for _, region in ipairs(block.debug) do
+          region:Show()
+        end
+      end
+    end
+    handler.usedBlocks[blockIndex] = block
+  end
+  return handler.usedBlocks[blockIndex]
+end
+
+--- Module-specific data wrangling that has to happen during UpdateBlock()
+ -- Most of this is sculpting objectives data into a parsible list.
+ -- Some of it is additional block manipulation that doesn't quite fit with the other modules..
+Bonus.UpdateObjectives = function(handler, block)
+  Default.UpdateObjectives(handler, block)
+end
+
+
+--- They are not exactly quests, but the aliases used to signal that a quest was pushed into your log by the environment.
+ -- Once accepted they never appear again unless the quest is dropped (daily reset/abandon quest)
+local CLICK_TO_COMPLETE = 'Click to Complete'
+local CLICK_TO_ACCEPT = 'Click to Accept'
+AutoQuest.UpdateObjectives = function(handler, block)
+  local print = lprint
+  if block.info.type == 'OFFER' then
+    block.status:SetText(CLICK_TO_ACCEPT)
+  end
+end
+
+
+
+
+--- Does the main iterations for populating block content.
+ -- Hooked by corresponding handler functions where additional details need to be sorted.
+Default.UpdateObjectives = function(handler, block)
+  local print = lprint
+  local info = block.info
+  print('   |cFF00FF00default objectives routine', block:GetName())
+
+  -- reset the starting positions
+  block.attachmentHeight = 0
+  block.endPoint = block.titlebg
+  local completionScore, completionMax = 0, 0
+  local displayObjectiveHeader = false
+
+  if info.description and #info.description >= 1 then
+    print('   |cFF00FFFF  header line:|r', info.description)
+    block.status:SetText(info.description)
+    displayObjectiveHeader = true
+  end
+
+  --- The first line is going to be used no matter what, so it is hard-pulled.
+   -- It also ensures that we're in the right position for cleaning up the leftover lines.
+  local lineIndex = 1
+  local line = T.GetLine(handler, block, lineIndex)
+
+  block.numLines = 0
+  block.attachmentHeight = 0
+  if info.isComplete then
+    print('     overriding line #1 for a completed block')
+    if line.widget then
+      line.widget:Hide()
+    end
+    line.status:SetText(info.completionText)
+    line.height = floor(line.status:GetHeight()+.5) + textSpacing
+    T.AddLine(block, line)
+  else
+    if info.objectives then
+      for i, data in ipairs(info.objectives) do
+        print('     |cFF88FF00#', i, data.type, data.text)
+        displayObjectiveHeader = true
+        line.height = 0
+        handler:UpdateLine(block, line, data)
+
+        -- For progressbar and timer lines, status text may be used as the title heading
+        if line.widget then
+          local widgetPosition = 0
+          --- WIDGET POSITION -------------------------------------------------
+          line.widget:SetPoint('TOP', line, 'TOP', 0, -widgetPosition)
+          line.widget:Show()
+          line.height = line.widget:GetHeight() + textSpacing
+          ---------------------------------------------------------------------
+          if line.displayText and #line.displayText >= 1 then
+            widgetPosition = line.status:GetHeight() + textSpacing
+            line.status:SetText(line.displayText)
+            line.height = floor(line.status:GetStringHeight()+.5) + textSpacing + line.widget.height
+            print('      - progressbar has text, adjust')
+          end
+        elseif line.displayText then
+          line.status:SetText(line.displayText)
+          line.height = floor(line.status:GetStringHeight()+.5)
+        end
+
+        T.AddLine(block, line)
+
+        --print('      sz', line:GetWidth(), line:GetHeight(), 'pt', line:GetPoint(1))
+        --print('     |cFF44BBFF#', i, 'anchoring line, size:', line.height, 'current endpoint:', line.statusbg)
+
+        lineIndex = lineIndex + 1
+        line = T.GetLine(handler, block, lineIndex)
+      end
+    end
+  end
+
+  while (block.lines[lineIndex+1]) do
+    print('      - hide |cFFFF0088'..lineIndex..'|r')
+    block.lines[lineIndex]:Hide()
+    lineIndex = lineIndex +1
+  end
+
+
+
+  if lineIndex > 0 then
+    block.attachmentHeight = block.attachmentHeight + textSpacing * 2
+    print('     |cFF00FF00attachment:', block.attachmentHeight)
+  end
+
+
+  --[[
+  local lines = handler.lines[block.index]
+  if lines and #lines > block.numLines then
+    print('   |cFFFF008' .. (#lines - block.numLines) .. ' extra lines to hide.')
+    for  i = block.numLines + 1, #lines do
+      print('    hide', i, lines[i]:GetName())
+      lines[i]:Hide()
+    end
+  end
+  ]]
+
+
+  if debug then
+    for i, region in ipairs(block.debug) do
+      for j = 1, region:GetNumPoints() do
+        local _, target = region:GetPoint(j)
+        if target:IsVisible() then
+          region:Hide()
+        else
+          region:Show()
+        end
+      end
+    end
+  end
+
+  block.completionScore = completionScore / completionMax
+end
+
+
+--- Module-specific display variables
+-- * height   - height of whatever display widget is involved in conveying the task
+-- * money    - boolean that determines listening for money events or not
+-- * progress - number ranging 0 to 2 indicating none/partial/full completion respectively
+
+
+
+Bonus.UpdateLine = function(handler, block, line, data)
+  local info = block.info
+  local print = lprint
+
+
+  line.displayColor = 'FFFFFF'
+  line.displayText = data.text
+  line.progress = 0
+  print('  ', data.objectiveIndex,'|cFFFF0088-|r', data.objectiveType, data.text)
+  if data.objectiveType == 'progressbar' then
+    line.widgetType = 'ProgressBar'
+    print('    |cFFFF44DDpercent='..tostring(GetQuestProgressBarPercent(info.questID)))
+    data.value = GetQuestProgressBarPercent(info.questID) or 0
+    data.maxValue = 100
+    if  data.value >= data.maxValue then
+      line.progress = 1
+    elseif data.value > 0 then
+      line.progress = 2
+    end
+    line.format = PERCENTAGE_STRING
+    local widget = T.SetWidget(line, data, 'ProgressBar', info.questID..'-'..data.objectiveIndex)
+    print('    |cFFFF0022** text:|r', data.text, '|cFFFF0022value:|r', data.value, '|cFFFF0022max:|r', data.maxValue)
+    widget:SetPoint('TOP', line, 'TOP', 0, 0)
+
+    line.widget = widget
+    line.height = widget.height
+  else
+    line.displayText = data.text
+    line.widget = nil
+  end
+  return line
+end
+
+Cheevs.UpdateLine = function(handler, block, line, data)
+  local print = B.print('CheevsLine')
+  line.progress = 0
+  print('  ', data.objectiveIndex,'|cFF0088FF-|r', data.objectiveType, data.text)
+  if data.flags then
+    if band(data.flags, 0x00000001) > 0 then
+      line.format = "%d/%d"
+      line.widget = T.SetWidget(line, data, 'ProgressBar', data.criteriaID)
+      line.height = line.widget.height
+    elseif band(data.flags, 0x00000002) then
+      line.widget = nil
+    else
+      line.widget = nil
+      line.displayColor = 'FFFFFF'
+      line.displayText = line.text
+
+    end
+  else
+
+      line.displayText = data.text
+  end
+  print('line.type =', data.type)
+  print('  ** qtyStr:', data.quantityString, 'qty:', data.quantity, 'assetID:', data.assetID)
+end
+Default.UpdateLine = function(block, line)
+  if line.finished then
+    line.progress = 2
+  elseif line.quantity > 0 then
+    line.progress  = 1
+  else
+    line.progress = 0
+  end
+  return line
+end
+
+
+T.Quest.numButtons = 0
+local usedButtons = T.Quest.itemButtons
+local freeButtons = T.Quest.freeButtons
+--[=[
+T.UpdateWrapper = function(reason)
+  print('|cFF00FFFFUpdateWrapper:|r', reason)
+  unitLevel = UnitLevel('player')
+  wrapperWidth = T.Conf.Wrapper.WrapperWidth
+  scrollWidth = T.Conf.Wrapper.WrapperWidth
+  local wrapperBlocks = 0
+  -- Update scroll child vertical size
+  scrollHeight = 0
+  for i, handler in ipairs(orderedHandlers) do
+    T.UpdateTracker(handler)
+    local frame = handler.frame
+    if handler.actualBlocks >= 1 then
+      frame:SetParent(Scroll)
+      frame:SetPoint('TOPLEFT', Scroll, 'TOPLEFT', 0, - scrollHeight)
+      frame:SetSize(wrapperWidth, frame.height)
+      print('|cFF00FFFF'..frame:GetName()..'|r h:|cFF00FF00', frame.height, '|r y:|cFF00FF00', -scrollHeight)
+      scrollHeight = scrollHeight + frame.height
+      frame:Show()
+    else
+      frame:Hide()
+    end
+    wrapperBlocks = wrapperBlocks + handler.actualBlocks
+  end
+  print('final scrollHeight:', scrollHeight)
+
+
+
+  -- Update frame dimensions
+  if scrollHeight > wrapperMaxHeight then
+    print('  is larger than', wrapperMaxHeight)
+    wrapperHeight = wrapperMaxHeight
+  else
+    wrapperHeight = scrollHeight
+    B.Conf.ObjectiveScroll = 0
+  end
+  scrollWidth = floor(scrollWidth+.5)
+  scrollHeight = floor(scrollHeight+.5)
+  wrapperWidth = floor(wrapperWidth+.5)
+  wrapperHeight = floor(wrapperHeight+.5)
+  headerHeight = floor(headerHeight+.5)
+
+  if wrapperBlocks >= 1 then
+    for i, region in ipairs(Wrapper.headerComplex) do
+      region:Show()
+    end
+  else
+    for i, region in ipairs(Wrapper.headerComplex) do
+      region:Hide()
+    end
+    return
+  end
+  --[[wrapperHeight = scrollHeight
+
+  print('|cFFFFFF00params:|r scroller:', scrollWidth .. ',' .. scrollHeight, 'scroll:', scrollWidth .. ',' .. scrollHeight,
+  'wrapper:', wrapperWidth .. ',' .. wrapperHeight,
+  'header:', headerHeight)]]
+
+  --Scroller:SetSize(wrapperWidth, wrapperHeight)
+  Scroller:SetPoint('TOPLEFT', Wrapper, 'TOPLEFT', 0, 0)
+  Scroller:SetPoint('BOTTOMRIGHT', Wrapper, 'BOTTOMRIGHT')
+
+
+  Scroll:SetSize(scrollWidth, scrollHeight)
+  Scroll:SetPoint('TOPLEFT', Scroller, 'TOPLEFT', 0, B.Conf.ObjectiveScroll or 0)
+  Scroll:SetPoint('RIGHT', Scroller, 'RIGHT')
+
+  --Scroller:UpdateScrollChildRect()
+  Wrapper:SetSize(wrapperWidth, wrapperHeight)
+
+  --[[ update action buttons
+  print('|cFF00FF00'..Scroll:GetName()..'|r:', Scroll:GetWidth(), Scroll:GetHeight(),
+    '|cFF00FF00'..Scroller:GetName()..'|r:', Scroller:GetWidth(), Scroller:GetHeight(),
+    '|cFF00FF00'..Wrapper:GetName()..'|r:', Wrapper:GetWidth(), Wrapper:GetHeight(),
+    '|cFF0088FFvScrollRange|r:', floor(Scroller:GetVerticalScrollRange()+.5)
+  )
+  --]]
+  T.UpdateActionButtons()
+
+end
+--]=]
+
+
+Default.Update = function (self, reason, ...)
+  local print = tprint
+  local tracker = self.frame
+  local blockIndex = 0
+  local trackerHeight = floor(tracker.titlebg:GetHeight()+.5)
+
+  self.currentAnchor = tracker.titlebg
+  local numWatched = self:GetNumWatched()
+  local numBlocks = self.numBlocks
+  local actualBlocks = 0
+  for watchIndex = 1, 25 do
+    blockIndex = blockIndex + 1
+    if watchIndex <= numWatched then
+      local info = self:GetInfo(watchIndex)
+      if info then
+        local currentBlock = self:UpdateBlock(blockIndex, info)
+        currentBlock:SetPoint('TOPLEFT', self.currentAnchor, 'BOTTOMLEFT', 0, 0)
+        currentBlock:SetPoint('RIGHT', tracker,'RIGHT', 0, 0)
+        self.currentAnchor = currentBlock
+        print('    |cFFFFFF00'..watchIndex..'|r', '|cFF00FF00'..currentBlock:GetName()..'|r', currentBlock.height, trackerHeight)
+        trackerHeight = trackerHeight + currentBlock.height
+        numBlocks = max(numBlocks, watchIndex)
+        actualBlocks = actualBlocks + 1
+      else
+        print('    |cFFFF0000bad GetInfo data for #'..watchIndex)
+      end
+
+    elseif watchIndex <= numBlocks then
+      local used = self.usedBlocks
+      local free = self.freeBlocks
+      print('clean up dead quest block')
+      if used[blockIndex] then
+        used[blockIndex]:Hide()
+        used[blockIndex]:ClearAllPoints()
+        free[#free+1]= used[blockIndex]
+        used[blockIndex] = nil
+      end
+    else
+      print('  |cFFFF9900END|r @', blockIndex)
+      break -- done with quest stuff
+    end
+  end
+  self.numWatched = numWatched
+  self.numBlocks = numBlocks
+  self.actualBlocks = actualBlocks
+
+  tracker.previousHeight = tracker.height
+  if numBlocks >= 1 then
+    previousBlock = nil
+
+    tracker.height = trackerHeight
+    tracker:SetHeight(tracker.height)
+    tracker:Show()
+
+
+  else
+    tracker.height = 0
+    tracker:Hide()
+  end
+
+  return tracker.numWatched, tracker.numAll
+end
+
+--- Updates the selected block frame to display the given info batch
+-- If `previousBlock` is set, it will attempt to anchor to that
+-- @param blockNum the ordered block to be updated, not a watchIndex value
+-- @param info the reference returned by the GetXInfo functions
+-- REMEMBER: t.info and questData[questID] are the same table
+Default.UpdateBlock = function (handler, blockIndex, info)
+  local print = bprint
+  print('  Read list item |cFF00FFFF'..blockIndex..'|r')
+  if not blockIndex or not info then
+    return
+  end
+  local frame = handler.frame
+  local block = T.GetBlock(handler, blockIndex)
+  block.handler = handler
+  block.info = info
+  block.mainStyle = info.mainStyle or 'Normal'
+  block.subStyle = info.subStyle
+
+  info.blockIndex = blockIndex
+  if info.questID then handler.QuestBlock[info.questID] = block end
+  if info.questLogIndex then handler.LogBlock[info.questLogIndex] = block end
+  if info.watchIndex then handler.WatchBlock[info.watchIndex] = block end
+  handler.BlockInfo[blockIndex] = info
+
+  block.endPoint = block.titlebg
+  block.attachmentHeight = 0
+  handler:UpdateObjectives(block)
+
+  block.title:SetText(info.title)
+  local titleHeight = floor(block.title:GetHeight()+.5)
+  local statusHeight = floor(block.status:GetHeight()+.5)
+  local attachmentHeight =floor(block.attachmentHeight + .5)
+  local titlebgHeight = titleHeight + titleSpacing*2
+  local statusbgHeight = statusHeight + textSpacing*2
+
+  block.titlebg:SetHeight(titlebgHeight)
+
+
+  print('    |cFF0088FFanchor to', handler.currentAnchor:GetName())
+
+  print('    |cFF00FF00total sizes:')
+  print('       attachment:', attachmentHeight)
+  print('            title:', titlebgHeight, '('.. titleHeight..')')
+  --block.titlebg:SetHeight(block.title:GetHeight() + T.Conf.Wrapper.TitleSpacing)
+  block.height = titlebgHeight + attachmentHeight
+  if statusHeight > 1 then
+    block.height = block.height + statusbgHeight
+    print('           status:', statusbgHeight, '('.. statusHeight..')')
+  else
+    print('      |cFFFF0088             skipped')
+  end
+  block:SetHeight(block.height)
+
+  print('           |cFFFFFF00height|r:', block.height)
+  print('  |cFF00FFFF)|r -> ', block, block:GetHeight())
+
+  block:Show()
+
+  if info.specialItem and not info.itemButton then
+    print('    - |cFF00FFFFgenerating item button for info set')
+    info.itemButton = T.SetItemButton(block, info)
+  else
+    --info.itemButton = nil
+  end
+
+  local tagPoint, tagAnchor, tagRelative = 'TOPRIGHT', block, 'TOPRIGHT'
+  if info.rewardInfo then
+    print('has immediate reward')
+    if info.rewardInfo[1].type == 'currency' or info.rewardInfo[1].type == 'item' then
+      block.icon:Show()
+      block.iconLabel:SetText(info.rewardInfo[1].count)
+      block.icon:SetPoint(tagPoint, tagAnchor, tagRelative, -2, -2)
+      tagPoint, tagAnchor, tagRelative = 'TOPRIGHT', block.icon, 'TOPLEFT'
+      block.icon:SetTexture(info.rewardInfo[1].texture)
+    end
+  else
+    block.icon:Hide()
+  end
+
+  if info.selected then
+    block.SelectionOverlay:Show()
+  else
+    block.SelectionOverlay:Hide()
+  end
+  -- workaround for scrollchild issue where layers fall out of sync: in this case, it's by 1 vertical pixel
+  --block.highlight:SetPoint('TOPLEFT', block, 'TOPLEFT', 0, 1)
+  --block.lowlight:SetPoint('BOTTOMLEFT', block, 'BOTTOMLEFT', 0, 1)
+
+  tagPoint, tagAnchor, tagRelative = T.AddTag(block, 'frequencyTag', tagPoint, tagAnchor, tagRelative)
+  tagPoint, tagAnchor, tagRelative = T.AddTag(block, 'typeTag', tagPoint, tagAnchor, tagRelative)
+  tagPoint, tagAnchor, tagRelative = T.AddTag(block, 'completionTag', tagPoint, tagAnchor, tagRelative)
+
+  return block
+end
+----------
+--- Top level methods
+
+local tick = 0
+function T:Update (reason, ...)
+  tick = tick + 1
+  local print = tprint
+  reason = reason or OBJECTIVE_TRACKER_UPDATE_REASON
+  local updateWrapper = 0
+  local hasStuff
+  local insertingStuff
+
+  print(format('%d |cFFFF%04X Update()', tick, lshift(reason, 4)), reason, ...)
+  currentPosition = 0
+  anchorPoint = 'TOP'
+  anchorFrame = Scroll
+
+  local wrapperHeight = 0
+  for id, handler in pairs(T.orderedHandlers) do
+    local frame = handler.frame
+
+    print(format('|cFF00FFFF%s and(%04X vs %04x+%04x) = %04X|r', handler.name, reason, handler.updateReasonModule, handler.updateReasonEvents, band(reason, handler.updateReasonModule + handler.updateReasonEvents)))
+    if band(reason, handler.updateReasonModule + handler.updateReasonEvents) > 0 then
+      handler:Update(reason, ...)
+      print(' |cFF00FF00'..id..'|r', handler.displayName, 'count:', handler.numWatched)
+      insertingStuff = true
+    else
+      print(' |cFFFF0088'..id..'|r', 'no reason to update')
+    end
+
+    if handler.numWatched >= 1 then
+      hasStuff = true
+      currentPosition = currentPosition + 1
+      frame:SetParent(Scroll)
+      frame:SetPoint('TOP', anchorFrame, anchorPoint, 0, 0)
+      print('  |cFF00BBFFpinning to', anchorFrame:GetName(), anchorPoint)
+      anchorFrame = handler.frame
+      anchorPoint = 'BOTTOM'
+
+      print('current frame height:', frame.height)
+      wrapperHeight = wrapperHeight + frame.height
+      print('|cFFFF0088total height:', wrapperHeight)
+    else
+      handler.frame:Hide()
+    end
+  end
+
+
+  if  hasStuff or insertingStuff then
+    print('updating height to', wrapperHeight)
+    Wrapper:SetHeight(wrapperHeight)
+    Scroller:SetHeight(wrapperHeight)
+    Scroll:SetHeight(wrapperHeight)
+    Scroller:SetVerticalScroll(B.Conf.ObjectiveScroll or 0)
+    print('|cFFFF8800Wrapper:', Wrapper:GetSize())
+    for i = 1, Wrapper:GetNumPoints() do
+      print(' ', Wrapper:GetPoint(i))
+    end
+    print('  |cFF00FFFFScroller:', Scroller:GetSize())
+    for i = 1, Scroller:GetNumPoints() do
+      print(' ', Scroller:GetPoint(i))
+    end
+    print('  |cFF00FFFFScroll:', Scroll:GetSize())
+    for i = 1, Scroll:GetNumPoints() do
+      print(' ', Scroll:GetPoint(i))
+    end
+
+    Wrapper:Show()
+    Scroller:Show()
+    Scroll:Show()
+  end
+  Quest.GetClosest()
+
+end
+
+--- Queue any active item buttons for update for that frame
+T.UpdateActionButtons = function(updateReason)
+  Scroller.snap_upper = 0
+  Scroller.snap_lower = 0
+  local print = B.print('ItemButton')
+  if updateReason then
+    print = B.print('IB_'..updateReason)
+  end
+
+  local previousItem
+  for questID, itemButton in pairs(usedButtons) do
+    local info= T.Quest.Info[questID]
+
+    print('|cFF00FFFF'.. questID .. '|r', itemButton:GetName())
+    local block = T.Quest.QuestBlock[questID]
+    if block then
+        -- Dispatch the probe
+      if IsQuestWatched(info.questLogIndex) then
+        itemButton.previousItem = previousItem
+        print('  |cFFFFFF00probing', block:GetName())
+        block:SetScript('OnUpdate', function()
+          if block:GetBottom() and not InCombatLockdown() then
+            print('  '..block:GetName()..' |cFF00FF00probe hit!')
+            T.UpdateBlockAction(block, itemButton, itemButton.previousItem) -- needs to be previousItem from this scope
+            block:SetScript('OnUpdate', nil)
+
+          end
+        end)
+        previousItem = itemButton
+      else
+        print('hidden block or unwatched quest')
+        itemButton.previousItem = nil
+        itemButton:Hide()
+      end
+    elseif itemButton:IsVisible() then
+      print('  |cFFFF0088hiding unwatched quest button', itemButton:GetName())
+      itemButton.previousItem = nil
+      itemButton:Hide()
+    else
+      print('  |cFFBBBBBBignoring hidden log quest button', itemButton:GetName())
+    end
+  end
+end
+
+T.UpdateBlockAction = function (block, itemButton)
+  print('**|cFF0088FF'..itemButton:GetName(), '|r:Update()')
+  if itemButton.questID ~= block.info.questID then
+    print('** |cFFFF0088mismatched block assignment', itemButton.questID,'<~>', block.info.questID)
+    -- something happened between this and last frame, go back and set new probes
+    return T.UpdateActionButtons()
+  end
+
+  local previousItem = itemButton.previousItem
+  local upper_bound = Scroller:GetTop() + Scroller.snap_upper
+  local lower_bound = Scroller:GetBottom() + Scroller.snap_lower + itemButtonSize
+  local point, anchor, relative
+
+  if block:GetBottom() < lower_bound then
+    print('** ',block:GetName() ,'|cFFFFFF00bottom =', floor(block:GetBottom()+.5), 'threschold =', floor(lower_bound+.5))
+    if previousItem then
+      print('adjusting', previousItem:GetName())
+      previousItem:ClearAllPoints()
+      previousItem:SetPoint('BOTTOM', itemButton, 'TOP', 0, itemButtonSpacing)
+    end
+    itemButton:ClearAllPoints()
+    itemButton.x = Wrapper:GetLeft() -4
+    itemButton.y = Wrapper:GetBottom()
+    point, anchor, relative = 'BOTTOMRIGHT', UIParent, 'BOTTOMLEFT'
+    Scroller.snap_lower = Scroller.snap_lower + itemButtonSize + itemButtonSpacing
+
+  elseif block:GetTop() > upper_bound then
+    print('** ',block:GetName() ,'|cFFFFFF00top =', floor(block:GetTop()+.5), 'threschold =', floor(upper_bound+.5))
+    itemButton:ClearAllPoints()
+    if previousItem then
+      print('latch onto another piece')
+      point, anchor, relative ='TOP', previousItem, 'BOTTOM'
+      itemButton.x = 0
+      itemButton.y = -itemButtonSpacing
+    else
+      print('latch at corner', Scroller:GetLeft() -itemButtonSpacing, Scroller:GetTop())
+      point, anchor, relative = 'TOPRIGHT', UIParent, 'BOTTOMLEFT'
+      itemButton.x = Scroller:GetLeft() -4
+      itemButton.y = Scroller:GetTop()
+    end
+    itemButton:Show()
+    Scroller.snap_upper = Scroller.snap_upper - (itemButtonSize + itemButtonSpacing)
+  else
+    print('** ',block:GetName() ,'|cFF00FF00span =', floor(block:GetBottom()+.5), floor(block:GetTop()+.5), 'threschold =', floor(lower_bound+.5))
+    itemButton:ClearAllPoints()
+    itemButton.x = block:GetLeft() - itemButtonSpacing
+    itemButton.y = block:GetTop()
+    point, anchor, relative = 'TOPRIGHT', UIParent, 'BOTTOMLEFT'
+  end
+
+  itemButton:SetPoint(point, anchor, relative, itemButton.x, itemButton.y)
+  itemButton:Show()
+end
+
+T.UpdateItemButtonCooldown = function(button)
+
+end
+
+local unitLevel = UnitLevel('player')
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ObjectiveTracker/ObjectiveInfo.lua	Sun Apr 10 04:35:32 2016 -0400
@@ -0,0 +1,324 @@
+local B = select(2,...).frame
+local wipe, pairs, ipairs, min, max, unpack = table.wipe, pairs, ipairs, min, max, unpack
+local tinsert, tostring, format, mod = tinsert, tostring, format, mod
+local GetQuestTagInfo, GetQuestLogTitle = GetQuestTagInfo, GetQuestLogTitle
+local GetNumQuestLogEntries, GetNumQuestWatches, GetQuestLogCompletionText, IsQuestWatched, IsQuestHardWatched, GetQuestLogSpecialItemInfo, GetQuestLogSpecialItemCooldown = GetNumQuestLogEntries, GetNumQuestWatches, GetQuestLogCompletionText, IsQuestWatched, IsQuestHardWatched, GetQuestLogSpecialItemInfo, GetQuestLogSpecialItemCooldown
+local GetNumAutoQuestPopUps, GetAutoQuestPopUp, GetTasksTable, GetNumQuestLogTasks, GetTaskInfo, GetQuestObjectiveInfo = GetNumAutoQuestPopUps, GetAutoQuestPopUp, GetTasksTable, GetNumQuestLogTasks, GetTaskInfo, GetQuestObjectiveInfo
+local GetNumQuestLogRewardCurrencies, GetQuestLogRewardCurrencyInfo, GetNumQuestLogRewards, GetQuestLogRewardInfo, GetQuestLogRewardMoney, GetMoneyString = GetNumQuestLogRewardCurrencies, GetQuestLogRewardCurrencyInfo, GetNumQuestLogRewards, GetQuestLogRewardInfo, GetQuestLogRewardMoney, GetMoneyString
+local GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo = GetNumQuestLeaderBoards, GetAchievementNumCriteria, GetQuestLogLeaderBoard, GetAchievementCriteriaInfo
+local GetQuestWatchIndex, GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo = GetQuestWatchIndex, GetQuestLogIndexByID, GetSuperTrackedQuestID, SetSuperTrackedQuestID, GetQuestWatchInfo
+local QuestHasPOIInfo, GetDistanceSqToQuest, GetQuestFactionGroup = QuestHasPOIInfo, GetDistanceSqToQuest, GetQuestFactionGroup
+local GetTrackedAchievements, GetNumTrackedAchievements, GetAchievementInfo = GetTrackedAchievements, GetNumTrackedAchievements, GetAchievementInfo
+local GetMoney, floor = GetMoney, floor
+local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
+local print = B.print('Info')
+local QUEST_TAG_DUNGEON = QUEST_TAG_DUNGEON
+local QUEST_TAG_GROUP = QUEST_TAG_GROUP
+local QUEST_TAG_ACCOUNT = QUEST_TAG_ACCOUNT
+local QUEST_TAG_TCOORDS = QUEST_TAG_TCOORDS
+local LE_QUEST_FREQUENCY_DAILY = LE_QUEST_FREQUENCY_DAILY
+local LE_QUEST_FREQUENCY_WEEKLY = LE_QUEST_FREQUENCY_WEEKLY
+local FACTION_ALLIANCE, LE_QUEST_FACTION_HORDE, FACTION_HORDE, LE_QUEST_FACTION_HORDE = FACTION_ALLIANCE, LE_QUEST_FACTION_HORDE, FACTION_HORDE, LE_QUEST_FACTION_HORDE
+
+local Tracker, Bonus, AutoQuest, Quest, Cheevs = T.DefaultTracker, T.Bonus, T.AutoQuest, T.Quest, T.Cheevs
+--------------------------------------------------------------------
+--- Tracker-specific data retrieval functions
+--------------------------------------------------------------------
+
+
+local DoQuestRewards= function(t, questID)
+  local rewards = {}
+  t.numCurrencies = GetNumQuestLogRewardCurrencies(questID)
+  for i = 1, t.numCurrencies do
+    local name, texture, count = GetQuestLogRewardCurrencyInfo(i, questID)
+    tinsert(rewards,{
+      type = 'currency',
+      index = i,
+      name = name,
+      texture = texture,
+      count = count
+    });
+  end
+  -- items
+  t.numItems = GetNumQuestLogRewards(questID)
+  for i = 1, t.numItems do
+    local name, texture, count, quality, isUsable = GetQuestLogRewardInfo(i, questID)
+    tinsert(rewards, {
+      type = 'item',
+      index = i ,
+      name = name,
+      texture = texture,
+      count = count,
+      quality = quality,
+      isUsable = isUsable
+    });
+  end
+  -- money
+
+  local money = GetQuestLogRewardMoney(questID)
+  if ( money > 0 ) then
+    tinsert(rewards, {
+      type = 'money',
+      name = GetMoneyString(money),
+      texture = "Interface\\Icons\\inv_misc_coin_01",
+      count = 0,
+    });
+  end
+
+  if #rewards >= 1 then
+    t.rewardInfo = rewards
+  end
+end
+
+
+-----------------------------
+--- AUTO_QUEST
+AutoQuest.LogInfo = {}
+AutoQuest.LogBlock = {}
+AutoQuest.QuestBlock = {}
+AutoQuest.WatchBlock = {}
+function AutoQuest:GetNumWatched ()
+  print(self.name, self)
+  Quest:GetNumWatched()
+  self.numWatched = GetNumAutoQuestPopUps()
+
+  return self.numWatched
+end
+AutoQuest.GetInfo = function(self, popupIndex)
+
+
+  local questID, type = GetAutoQuestPopUp(popupIndex)
+  local questLogIndex = GetQuestLogIndexByID(questID)
+  local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle(questIndex)
+
+  self.Info[questID] = self.Info[questID] or {}
+  local popup = self.Info[questID]
+  popup.title = title
+  popup.description = type
+  popup.popupType = type
+  popup.questID = questID
+  popup.questLogIndex = questLogIndex
+  popup.popupIndex = popupIndex
+
+  self.Info[questID] = popup
+  self.WatchInfo[popupIndex] = popup
+
+
+  return self.Info[questID]
+end
+
+-----------------------------
+--- BONUS OBJECTIVE
+-- The default UI pops them up as you enter their relevant areas, but the data is actually available at all times.
+-- The only requirement is that you've been to said area and progressed any of the objectives.
+-- Blizzard deal with this fact by caching any task data collected during session and masking out whatever gets completed.
+-- For the addon's module structure to work, GetNumWatched method also invokes a tasks table scan.
+-- That composes the table searched by GetInfo().
+
+------------------------------------------------------------------------------------------
+--- These functions are copied from Blizzard_BonusObjectiveTracker.lua;
+-- It's kind of dumb, but this avoids the risk of code taint.
+
+--- Returns a tasks table modified to include recently completed objectives
+local UnitName, GetRealmName = UnitName, GetRealmName
+local InternalGetTasksTable = function()
+  local savedTasks = T.Conf.TasksLog
+  local char = UnitName("player")
+  local realm = GetRealmName()
+  local tasks = GetTasksTable()
+
+  for questID, data in pairs(Bonus.Info) do
+
+    print('  -- questID:', questID, #data.objectives)
+      for i, o in ipairs(data.objectives) do
+        print('    --', i, o.text)
+      end
+
+  end
+
+
+  for questID, data in pairs(savedTasks) do
+    if questID > 0  then
+      local found = false
+      for i = 1, #tasks do
+        if tasks[i] == questID then
+          found = true
+          break
+        end
+      end
+      -- if it's not part of the current table, then try to insert it where it was last found
+      if not found then
+        if data.watchIndex < #tasks then
+          tinsert(tasks, data.watchIndex, data)
+        else
+          tinsert(tasks, data)
+        end
+      end
+    end
+  end
+  return tasks
+end
+
+--- Returns an entry from the composed tasks table if possible, otherwise makes an API pull
+local InternalGetTaskInfo = function(questID)
+  local completedTasks = T.Conf.TasksLog
+  if completedTasks[questID] then
+    return true, true, #completedTasks[questID].objectives
+  else
+    return GetTaskInfo(questID)
+  end
+end
+
+--- Same as above but for the objective entries
+local InternalGetQuestObjectiveInfo = function(questID, objectiveIndex)
+  local completedTasks = T.Conf.TasksLog
+  if ( completedTasks[questID] ) then
+    print('using internal data')
+    return completedTasks[questID].objectives[objectiveIndex], completedTasks[questID].objectiveType, true;
+  else
+    return GetQuestObjectiveInfo(questID, objectiveIndex, false);
+  end
+end
+
+--- end redundant copy of silliness
+------------------------------------------------------------------------------------------
+
+Bonus.Completed = {}
+Bonus.POI = {}
+Bonus.Scenario = {}
+Bonus.QuestBlock = {}
+Bonus.WatchInfo = {}
+function Bonus:GetNumWatched ()
+  print(self.name, self)
+
+  local tasks = InternalGetTasksTable()
+  local numWatched = 0
+  local numAll = 0
+  self.WatchInfo = {}
+  print('|cFFFFFF00Bonus.GetNumWatched()|r', #tasks)
+  print('  TasksTable pull:')
+  for i, questID in ipairs(tasks) do
+    local isInArea, isOnMap, numObjectives = InternalGetTaskInfo(questID)
+    local existingTask = self.QuestBlock[questID]
+    local displayObjectiveHeader = false;
+    local test = (isInArea or (isOnMap and existingTask))
+    --local test = true
+    if test then
+      self.Info[questID] = self.Info[questID] or {}
+
+      local t = self.Info[questID]
+      self.WatchInfo[i] = t
+      t.isInArea = isInArea
+      t.isOnMap = isOnMap
+      t.existingTask = existingTask
+      t.questID = questID
+      t.objectives = {}
+      t.taskIndex = i
+
+
+      DoQuestRewards(t, questID)
+
+      local taskTitle
+      local taskFinished = true;
+      for objectiveIndex = 1, numObjectives do
+        local text, objectiveType, finished, displayAsObjective = InternalGetQuestObjectiveInfo(questID, objectiveIndex, false);
+        displayObjectiveHeader = displayObjectiveHeader or displayAsObjective;
+        if not taskTitle then
+          if objectiveType == 'progressbar' and not text:match('^%d%+\\%d+') then
+            taskTitle = text
+            text = ''
+          end
+        end
+
+
+        print('  --', text, objectiveType, finished, displayAsObjective)
+        t.objectives[objectiveIndex] = t.objectives[objectiveIndex] or  {}
+        local  o = t.objectives[objectiveIndex]
+
+        o.objectiveIndex = objectiveIndex
+        o.text = text
+        o.objectiveType = objectiveType
+        o.finished = finished
+        o.displayAsObjective = displayAsObjective
+        print('     |cFF00FF88*', objectiveIndex, text)
+      end
+
+      -- didn't get a name from progress bar? what about area name
+      if not taskTitle then
+        if isInArea then
+          taskTitle = GetMapNameByID(GetCurrentMapAreaID())
+        end
+      end
+      t.title = taskTitle
+    end
+
+    print ('    |cFF00FF88#', i, 'questID', questID, 'inArea', isInArea, 'onMap', isOnMap, 'existing', (existingTask and 'Y' or 'N'), (test and '|cFF00FF00show|r' or '|cFFFF0088hide|r'))
+  end
+
+
+  self.numAll = #tasks
+  self.numWatched = #self.WatchInfo
+  print('  stats:', self.numAll, 'active tasks,', self.numWatched, 'nearby or animating')
+  --return #tasks
+  return #self.WatchInfo
+end
+
+--- info cleanup done when  turn-ins are detected
+Bonus.OnTurnIn = function(self, questID, xp, money)
+  print('|cFFFF8800'..self.name..':OnTurnIn call', questID, xp, money)
+  local savedTasks = B.Conf.TasksLog
+
+  self.Info[questID].completedTime = GetTime()
+  self.Info[questID].animate = true
+  T.SetAnimate(self.watchReason)
+  savedTasks[questID] = self.Info[questID]
+end
+
+Bonus.GetInfo = function(self, taskIndex)
+  print(self.name, self)
+  return self.WatchInfo[taskIndex]
+end
+
+
+
+Cheevs.GetNumWatched = function(self)
+  print('|cFF00FF00' .. GetTime())
+  Cheevs.trackedCheevs = {GetTrackedAchievements()}
+  return GetNumTrackedAchievements()
+end
+Cheevs.GetInfo = function(self, index)
+  local cheevID = Cheevs.trackedCheevs[index]
+  local id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuildAch, wasEarnedByMe, earnedBy = GetAchievementInfo(cheevID)
+
+  self.Info[cheevID] = {}
+  local c = self.Info[cheevID]
+  c.type = 'Cheevs'
+  c.watchIndex = index
+  c.cheevID = cheevID
+  c.title = name
+  c.points, c.completed, c.month, c.day, c.year, c.description, c.flags, c.icon, c.rewardText, c.isGuildAch, c.wasEarnedByMe, c.earnedBy =
+  points, completed, month, day, year, description, flags, icon, rewardText, isGuildAch, wasEarnedByMe, earnedBy
+  c.numObjectives = GetAchievementNumCriteria(cheevID)
+  c.objectives = {}
+  for i = 1, c.numObjectives do
+    local description, type, completed, quantity, requiredQuantity, characterName, flags, assetID, quantityString, criteriaID = GetAchievementCriteriaInfo(cheevID, i)
+    c.objectives[i] = {
+      objectiveIndex = i,
+      cheevID = cheevID,
+      text = description,
+      type = type,
+      finished = completed,
+      value = quantity,
+      maxValue = requiredQuantity,
+      characterName = characterName,
+      flags = flags,
+      assetID = assetID,
+      quantityString = quantityString,
+      criteriaID = criteriaID,
+    }
+  end
+  print('Cheevs.|cFF0088FFGetInfo|r('..index..')', 'obj:', GetAchievementNumCriteria(cheevID), name, description)
+
+  self.WatchInfo[index] = c
+  return self.Info[cheevID]
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ObjectiveTracker/ObjectiveSecure.xml	Sun Apr 10 04:35:32 2016 -0400
@@ -0,0 +1,66 @@
+<Ui>
+  <!--
+   The following was lifted from QuestKing, mainly to spare the horrors of writing a global space frame script
+  -->
+  <Button name="VeneerItemButtonTemplate" inherits="SecureActionButtonTemplate" virtual="true">
+    <Attributes>
+      <Attribute name="type" value="item" />
+    </Attributes>
+    <Layers>
+      <Layer level="ARTWORK">
+        <FontString parentKey="HotKey" inherits="NumberFontNormalSmallGray" justifyH="LEFT" text="RANGE_INDICATOR">
+          <Size x="29" y="10"/>
+          <Anchors>
+            <Anchor point="TOPRIGHT" x="16" y="-2"/>
+          </Anchors>
+        </FontString>
+      </Layer>
+      <Layer level="BORDER">
+        <Texture parentKey="icon"/>
+        <FontString parentKey="Count" inherits="NumberFontNormal" justifyH="RIGHT" hidden="true">
+          <Anchors>
+            <Anchor point="BOTTOMRIGHT" x="-3" y="2"/>
+          </Anchors>
+        </FontString>
+      </Layer>
+    </Layers>
+    <Frames>
+      <Cooldown parentKey="Cooldown" inherits="CooldownFrameTemplate"/>
+    </Frames>
+    <Scripts>
+      <OnLoad>
+        self:RegisterForClicks("AnyUp");
+      </OnLoad>
+      <OnEvent>
+        if (event == "PLAYER_TARGET_CHANGED") then
+          self.rangeTimer = -1;
+        elseif (event == "BAG_UPDATE_COOLDOWN") then
+          Veneer_QuestObjectiveItem_UpdateCooldown(self)
+        end
+      </OnEvent>
+      <OnUpdate function="Veneer_QuestObjectiveItem_OnUpdate" />
+      <OnShow>
+        self:RegisterEvent("PLAYER_TARGET_CHANGED");
+        self:RegisterEvent("BAG_UPDATE_COOLDOWN");
+      </OnShow>
+      <OnHide>
+        self:UnregisterEvent("PLAYER_TARGET_CHANGED");
+        self:UnregisterEvent("BAG_UPDATE_COOLDOWN");
+      </OnHide>
+      <OnEnter>
+        GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
+        GameTooltip:SetQuestLogSpecialItem(self.questLogIndex);
+      </OnEnter>
+      <OnLeave>
+        GameTooltip:Hide();
+      </OnLeave>
+    </Scripts>
+    <NormalTexture parentKey="NormalTexture" file="Interface\Buttons\UI-Quickslot2">
+      <Anchors>
+        <Anchor point="CENTER"/>
+      </Anchors>
+    </NormalTexture>
+    <PushedTexture file="Interface\Buttons\UI-Quickslot-Depress"/>
+    <HighlightTexture file="Interface\Buttons\ButtonHilight-Square" alphaMode="ADD"/>
+  </Button>
+</Ui>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ObjectiveTracker/ObjectiveStyle.lua	Sun Apr 10 04:35:32 2016 -0400
@@ -0,0 +1,506 @@
+local B = select(2,...).frame
+local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
+local print = B.print('SetStyle')
+-------------------------------------------------------------
+--- Deals with swapping between different color palettes
+---
+
+local titleFont, textFont = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Regular.ttf]]
+local titleSize, textSize = 16, 15
+local titleOutline, textOutline = "OUTLINE", "OUTLINE"
+local titleSpacing, textSpacing = 3, 3
+local unpack, type, pairs, tconcat = unpack, type, pairs, table.concat
+local wrapperHeadFont, wrapperHeadSize, wrapperHeadOutline = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 16, 'NONE'
+local headerFont, headerSize = [[Interface\Addons\SharedMedia_MyMedia\font\ArchivoNarrow-Bold.ttf]], 24
+local headerOutline, headerSpacing = 'OUTLINE', 2
+
+
+mod.defaults.Style = {
+  Format = {
+    Frame = {
+      Width = 270,
+    },
+    title = {
+      Indent = 0,
+      Spacing = 0,
+    },
+    status = {
+      Indent = 5,
+      Spacing = 0,
+    }
+  },
+  FontBank = {
+    ['Normal'] = _G.VeneerCriteriaFontNormal,
+    ['Progress'] = _G.VeneerCriteriaFontProgress,
+    ['Complete'] = _G.VeneerCriteriaFontComplete,
+    ['Failed'] = _G.VeneerCriteriaFontFailed,
+  },
+  Normal = {
+    title = {
+      TextColor = {1, 1, 1, 1},
+      Width = 270,
+      Spacing = 0,
+      Indent = 2,
+    },
+    titlebg = {
+    },
+    status = {
+      Width = 270,
+      Spacing = 0,
+    },
+    statusbg = {
+    },
+    Frame = {
+    }
+  },
+  Tracker = {
+    Normal = {
+      title = {
+        Font = {headerFont, headerSize, headerOutline}, Spacing = headerSpacing,
+        Indent = 2,
+        TextColor = {1, .9, .2, 1},
+      },
+      titlebg = {
+        Gradient = {'VERTICAL', MinColor = {0,0,0,0.25}, MaxColor = {0,0,0,.15}},
+      }
+    }
+  },
+  TrackerBlock = {
+    Normal = {
+      titlebg = {
+        Indent = 2,
+        Gradient = { 'HORIZONTAL', MinColor = {0.7, 0, 0.9, 1}, MaxColor = {.7, 0, 0.9, .1}},
+      },
+      title = {
+        TextColor = {1,1,1,1},
+        Font = {titleFont, titleSize, titleOutline},
+        Spacing = titleSpacing,
+      },
+      status = {
+        TextColor = {1,1,1,1},
+        Font = {textFont, textSize, textOutline},
+        Spacing = textSpacing,
+      },
+      statusbg = {
+        Gradient = { 'HORIZONTAL', MinColor = {0.2, .4, 1, 1}, MaxColor = {.7, 0, 0.9, .1}},
+      }
+    },
+    Daily = {
+      titlebg = {
+        Gradient = {'HORIZONTAL', MinColor = {0, .4, 1, 1},          MaxColor = {0, 0.4, 1, .1},        },
+      },
+      statusbg = {
+        Gradient = {'HORIZONTAL', MinColor = {0, .4, 1, 1},          MaxColor = {0, 0.35, .90, .1},        },
+      },
+      title = {
+        TextColor = {0.7,1,1,1},
+        Font = {titleFont, titleSize, titleOutline},
+        Spacing = titleSpacing,
+      },
+      status = {
+        TextColor = {1,1,1,1},
+        Font = {textFont, textSize, textOutline},
+        Spacing = textSpacing,
+      },
+    },
+    Super = {
+      title = {
+        TextColor = {1,1,1,1},
+        Font = {titleFont, titleSize, titleOutline},
+        Spacing = titleSpacing, BackgroundFullWidth = true
+      },
+      titlebg = {
+        Gradient = { 'HORIZONTAL', MinColor = {0, .7, .6, 1}, MaxColor = {0, .7, .6, 1}},
+      },
+      status = {
+        TextColor = {1,1,1,1},
+        Font = {textFont, textSize, textOutline},
+        Spacing = textSpacing,
+      },
+      statusbg = {
+        Gradient = { 'HORIZONTAL', MinColor = {0, .7, .6, 1}, MaxColor = {0, .7, .6, 1} },
+      },
+    },
+    MouseDown = {
+      title = {
+        Font = {titleFont, titleSize, titleOutline},
+        Spacing = titleSpacing,
+      },
+      titlebg = {
+        Gradient = {'HORIZONTAL',  MinColor = {0.2, .4, 1, 1}, MaxColor = {0.2, .4, 1, 1},        },
+      },
+      status = {
+        Font = {textFont, textSize, textOutline},
+        Spacing = textSpacing,
+      },
+      statusbg = {
+        Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 1}, MaxColor = {0.2, .4, 1, 1},        },
+      }
+    },
+    Complete = {
+      title = {
+        TextColor = {1,1,1,1},
+        Font = {titleFont, titleSize, titleOutline},        Spacing = titleSpacing,
+      },
+      titlebg = {
+        Gradient = {'HORIZONTAL', MinColor = {0, 1, 0, 1},          MaxColor = {0, 1, 0, 1},        },
+      },
+      status = {
+        TextColor = {1,1,1,1},
+        Font = {textFont, textSize, textOutline},        Spacing = textSpacing,
+      },
+      statusbg = {
+        Gradient = {'HORIZONTAL', MinColor = {0, 1, 0, 1},          MaxColor = {0, 1, 0, 1},        },
+      }
+    },
+    AutoQuest = {
+      Normal = {
+        titlebg = {
+          Indent = 2,
+          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 1}, MaxColor = {.7, 0, 0.9, 1}},
+        },
+        title = {
+          TextColor = {1,1,1,1},
+          Font = {titleFont, titleSize, titleOutline},
+          Spacing = titleSpacing,
+        },
+        status = {
+          TextColor = {0,1,0,1},
+          Font = {textFont, textSize, textOutline},
+          Spacing = textSpacing,
+        },
+        statusbg = {
+          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 1}, MaxColor = {.7, 0, 0.9, 1}},
+        }
+      },
+    },
+    Cheevs =  {
+      Normal = {
+
+        title = {
+          Font = {titleFont, titleSize, titleOutline},
+          Spacing = titleSpacing,
+        },
+        titlebg = {
+          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 1}, MaxColor = {.7, 0, 0.9, 1}},
+
+        },
+        status = {
+          Font = {textFont, textSize, textOutline},
+          Spacing = textSpacing,
+        },
+        statusbg = {
+          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 1}, MaxColor = {.7, 0, 0.9, 1}},
+        },
+      },
+      Complete = {
+        title = {
+          Font = {titleFont, titleSize, titleOutline},
+          Spacing = titleSpacing,
+        },
+        titlebg = {
+          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 1}, MaxColor = {.7, 0, 0.9, 1}},
+        },
+        status = {
+          Font = {textFont, textSize, textOutline},
+          Spacing = textSpacing,
+        },
+        statusbg = {
+          Gradient = {'HORIZONTAL', MinColor = {0.2, .4, 1, 1}, MaxColor = {.7, 0, 0.9, 1}},
+        },
+      },
+    }
+  }
+}
+
+local style_cache_func = {}
+local block_vars = {
+  ['titleSize'] = {'titleWidth', 'titleHeight'},
+  ['FrameSize'] = {'width', 'height'}
+}
+local attrib_vars = {
+  ['Font'] = {'height'},
+}
+
+mod.BlockStyleCache = {}
+local style_cache = mod.BlockStyleCache
+mod.regions = {}
+mod.regionStyles = {}
+mod.SetBlockStyle = function(frame, frameType, ...)
+  -- var names intended to reflect argument order
+  print('|cFFFFFF00'..frame:GetName()..'|r', frameType, ...)
+  --@debug@
+  local c = mod.defaults.Normal
+  local style_list = {... }
+  local styleName = frameType .. '-' .. table.concat(style_list,'')
+  local previousClass = {mod.Conf.Style[frameType] }
+  local previousClassString = {'frame' }
+  local parentName
+
+  if not style_cache[styleName] then
+    local style = {}
+
+    --[[
+    if mod.defaults.Style[frameType] then
+      print(' setting style class |cFF00FFFF'..frameType)
+    else
+      print(' resorting to class Normal (missing |cFFFF8800'.. frameType..'|r)')
+    end
+    --]]
+    local normal = mod.defaults.Style.Normal
+    local root =  mod.defaults.Style[frameType] or normal
+    for i, className in ipairs(style_list) do
+      print('|cFF00FF00'..i..'|r', className)
+      local class = normal
+      local childClass
+      if previousClass  then
+        for i = #previousClass, 1, -1  do
+          print('checking if '..className..' child of '.. previousClassString[i])
+          if previousClass[i][className] then
+            print('  it is!')
+            childClass = previousClass[i][className]
+            parentName = previousClassString[i]
+            break
+          end
+        end
+      end
+      if childClass then
+        class = childClass
+        print('  ChildClass '..parentName..'.|cFFFF0088'.. className .. '|r')
+      elseif root[className] then
+        class = root[className]
+        print('  SubClass |cFF0088FF'.. className .. '|r')
+      elseif normal[className] then
+        class = normal[className]
+        print('  SubClass Normal.|cFFFF0088'..className..'|r')
+      else
+        --print('  SubClass not found '..className..'')
+      end
+      tinsert(previousClass, class)
+      tinsert(previousClassString, className)
+
+      for elementName, element in pairs(class) do
+        if not elementName:match('^%u') then
+          --print('   scanning Element |cFF8800FF'.. elementName ..'|r')
+          if not style[elementName] then
+            style[elementName] = {}
+          end
+          for key, value in pairs(element) do
+            if mod.SetBlockAttribute[key] then
+              --print('   |cFF00FF00'..elementName..'|r.|cFF00FFFF'..key..' =', (type(value) == 'table' and ('{'..table.concat(value,', ')..'}') or tostring(value)))
+              style[elementName][key] = value
+            end
+
+          end
+        end
+
+      end
+    end
+
+    for k, elements in pairs(mod.defaults.Style.Normal) do
+      if not style[k] and type(elements) ~= 'table' then
+        style[k] = elements
+      end
+    end
+
+
+    --[[print('result for: ', frame:GetName())
+    for k,v in pairs(style) do
+      if type(v) == 'table' and not k:match('^%u') then
+        for kk, vv in pairs(v) do
+        --print('  |cFFFFFF00'..k..'|r.|cFF00FF00'..kk..'|r =', (type(vv) == 'table' and ('{'..table.concat(vv,', ')..'}') or tostring(vv)))
+        end
+      else
+        --print(' |cFFFFFFFF' .. k ..'|r =', tostring(v))
+      end
+    end
+    --]]
+    print('saving |cFFFFFF00'..styleName)
+    style_cache[styleName] = style
+  else
+
+    print('using |cFFFF00FF'..styleName)
+  end
+
+  local style = style_cache[styleName]
+
+  if not style_cache_func[styleName] then
+    local code =
+        "return function (frame)\n"..
+        "  local func = Veneer.ObjectiveTracker.SetBlockAttribute\n"..
+        "  local cache = Veneer.ObjectiveTracker.BlockStyleCache"
+            --.. "  print('CacheFunc', '|cFFFFFF00SET|r "..styleName.." |cFFFFFF00ON|r', frame:GetName()) "
+
+    for elementName, styleset in pairs(style) do
+        code = code ..
+            "\n if frame['"..elementName.."'] then"
+
+        for attributeName, value in pairs(styleset) do
+          if mod.SetBlockAttribute[attributeName] then
+            --print('  add function '..elementName..':'.. attributeName ..'(', (type(value) == 'table' and ('{'..table.concat(value,', ')..'}') or tostring(value)), ')')
+
+
+            --mod.SetBlockAttribute[attributeName](region, value)
+            code = code
+                --.. "\n    print('CacheFunc', '  applying', '|cFF00FFFF" .. attributeName .. "|r to', '|cFF0088FF"..elementName.."|r', cache['"..styleName.."']['"..elementName.."']['".. attributeName .."'])"
+                .. "\n\n    func['" .. attributeName .. "'](frame['"..elementName.."'],"..
+                " cache['"..styleName.."']['"..elementName.."']['".. attributeName .."'])"
+
+            --- Set any frame.blah variables used in Updates
+            if block_vars[elementName .. attributeName] then
+              --print('|cFF008800BVar|r', elementName..attributeName)
+              for i, blockKey in ipairs(block_vars[elementName .. attributeName]) do
+                --print('  assigning |cFF008800'..blockKey..'|r')
+                frame[blockKey] = (type(value) == 'table') and value[i] or value
+              end
+            end
+
+          end
+        end
+        code = code ..
+            "\n  else"..
+            --"\n    print('CacheFunc', '  |cFFFF4400missing', frame:GetName()..'."..elementName.."')"..
+            "\n  end"
+    end
+    code = code .. "\nend"
+    local result = assert(loadstring(code))
+    --print('storing style func', styleName, result())
+    style_cache_func[styleName] = result()
+
+  end
+  style_cache_func[styleName](frame)
+
+  --- Hardcoding the sizing vars for sanity
+  local defaultWidth = mod.Conf.Wrapper.Width
+  local normalSettings = mod.defaults.Style.Format
+  frame.width = defaultWidth
+  frame.statusWidth = defaultWidth - normalSettings.status.Indent
+  frame.titleWidth = defaultWidth - normalSettings.title.Indent
+  frame.attachmentHeight = frame.attachmentHeight or 0
+
+  if frame.title then
+    frame.titleHeight = frame.title and frame.title:GetStringHeight() or 0
+    if frame.titleHeight > 0 then
+      print('add spacing to', frame.titleHeight)
+      frame.titleHeight = frame.titleHeight + (frame.title.spacing or 0)*2
+    end
+
+    frame.title.spacing = frame.title.spacing or frame.title:GetSpacing()
+    frame.title:SetPoint('LEFT', frame, 'LEFT', normalSettings.title.Indent)
+    frame.title:SetPoint('TOP', frame, 'TOP', 0, -frame.title.spacing)
+    frame.title:SetWidth(frame.width)
+    if frame.titlebg then
+      frame.titlebg:SetHeight(frame.titleHeight)
+      frame.titlebg:SetWidth(frame.width)
+    end
+    print('  titleHeight', frame.titleHeight, 'indent', normalSettings.title.Indent, 'spacing', frame.title.spacing)
+    print('    -- text:', frame.title:GetSize())
+    print('    --   bg:', frame.titlebg:GetSize())
+
+  else
+    frame.titleHeight = 0
+  end
+
+
+  if frame.status and (frame.status:GetText() or frame.attachmentHeight > 0) then
+    frame.statusHeight   = frame.status and frame.status:GetStringHeight()  or 0
+    if frame.statusHeight > 0 then
+      frame.statusHeight = frame.statusHeight  + (frame.status.spacing or 0)*2
+    end
+
+    frame.status.spacing = frame.status.spacing or frame.status:GetSpacing()
+
+    frame.status:SetWidth(frame.width)
+    frame.status:SetPoint('LEFT', frame, 'LEFT', normalSettings.status.Indent, 0)
+    frame.status:SetPoint('TOP', frame.titlebg, 'BOTTOM', 0, 0)
+    --frame.status:SetHeight(frame.statusHeight)
+    if frame.statusbg then
+
+      --frame.statusbg:SetHeight(frame.statusHeight + (frame.attachmentHeight or 0))
+      --frame.statusbg:SetPoint('BOTTOM', frame, 'BOTTOM', 0, 0)
+      frame.statusbg:SetWidth(frame.width)
+    end
+    print('  status tHeight', frame.statusHeight, 'indent', normalSettings.status.Indent, 'spacing', frame.status.spacing)
+  else
+    if frame.status then
+      frame.status:Hide()
+    end
+    if frame.statusbg then
+      frame.statusbg:Hide()
+    end
+    frame.statusHeight = 0
+  end
+
+  frame.height = frame.titleHeight + frame.statusHeight + (frame.attachmentHeight or 0)
+  frame:SetSize(frame.width, frame.height)
+  print('  |cFF0088FFsizing frame', frame.width, frame.height)
+end
+
+--- Argument containers
+local o -- text flag
+local a1, a2, a3, a4, b1, b2, b3, b4 -- color1, color2
+local f1, f2, f3 -- font
+local w1, w2 -- size
+local p1, p2, p3, x, y -- path/point args
+mod.SetBlockAttribute = {}
+local sb = mod.SetBlockAttribute
+local print = B.print('Attribute')
+sb.Gradient = function(region, value)
+  print('|cFF8844FFGradient|r', region:GetName(), unpack(value))
+  o = value[1]
+  a1, a2, a3, a4 = unpack(value.MinColor)
+  b1, b2, b3, b4 = unpack(value.MaxColor)
+  region:SetVertexColor(1,1,1)
+  region:SetTexture(1,1,1,1)
+  region:SetGradientAlpha(o, a1, a2, a3, a4, b1, b2, b3, b4)
+end
+
+sb.Background = function(region, value)
+  print('|cFF0088FFBackground|r', unpack(value))
+  region:SetVertexColor(1,1,1) -- reset
+  region:SetTexture(unpack(value))
+end
+sb.BackgroundComplex = function (region, value)
+  local left, tile, right = value.Left, value.Tile, value.Right
+
+end
+sb.Font = function(region, value)
+  f1, f2, f3 = unpack(value)
+  print('|cFFFFFF00Font|r', f1, f2, f3)
+  region:SetFont(f1, f2, f3)
+end
+
+sb.Spacing = function(region, value)
+  print('FontSpacing', region:GetName(), value)
+  region:SetSpacing(value)
+  region.spacing = value
+end
+
+sb.TextColor = function(region, value)
+  a1, a2, a3, a4 = unpack(value)
+  print('TextColor', a1, a2, a3, a4)
+  region:SetTextColor(a1, a2, a3, a4)
+end
+sb.Texture = function(region, value)
+
+  p1, a1, a2, a3, a4 = unpack(value)
+  print('Texture', p1, a1, a2, a3, a4)
+  region:SetTexture(p1)
+  if a1 then
+    region:SetTexCoord(a1, a2, a3, a4)
+  end
+end
+sb.Width = function(region, value)
+  w1 = value
+  region:SetWidth(w1)
+end
+
+sb.Height = function(region, value)
+  w2 = value
+  region:SetHeight(w2)
+end
+sb.Size = function(region, value)
+  w1, w2 = unpack(value)
+  region:SetSize(w1, w2)
+end
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ObjectiveTracker/ObjectiveTracker.xml	Sun Apr 10 04:35:32 2016 -0400
@@ -0,0 +1,486 @@
+<Ui>
+
+  <Frame name="VeneerObjectiveWrapper"  parent="UIParent" enableMouse="false" frameStrata="LOW">
+    <TitleRegion>
+      <Size x="300" y="30" />
+      <Anchors>
+        <Anchor point="TOP" />
+        <Anchor point="BOTTOM" relativePoint="TOP" x="0" y="-30" />
+      </Anchors>
+    </TitleRegion>
+    <Scripts>
+      <OnLoad>
+        self.toggle = true
+        --self.drag = true
+        Veneer.OnLoad(self)
+      </OnLoad>
+      <OnShow>
+      </OnShow>
+      <OnDragStart>
+        Veneer.OnDragStart(self)
+      </OnDragStart>
+      <OnDragStop>
+        Veneer.OnDragStop(self)
+        Veneer.ObjectiveTracker.UpdateActionButtons()
+      </OnDragStop>
+      <!--@config@-->
+      <!--@end-config@-->
+    </Scripts>
+    <Anchors>
+      <Anchor point="TOPRIGHT" x="-60" y="-240" />
+    </Anchors>
+    <Layers>
+
+      <Layer level="ARTWORK">
+        <Texture parentKey="BackgroundLeft" parentArray="headerComplex" />
+        <Texture parentKey="BackgroundRight" parentArray="headerComplex" />
+        <Texture parentKey="BackgroundTile" parentArray="headerComplex" />
+        <Texture parentKey="headerComplexBounds" parentArray="config" alphaMode="ADD" hidden="true">
+          <Color r="0" g="0" b="1" a="0.5" />
+          <Anchors>
+            <Anchor point="TOPLEFT" relativeKey="$parent.BackgroundLeft" />
+            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.BackgroundRight" />
+          </Anchors>
+        </Texture>
+        <Texture parentKey="FrameBounds" parentArray="config" alphaMode="ADD" hidden="true">
+          <Color r="1" g="0" b="1" a="0.25" />
+          <Anchors>
+            <Anchor point="TOPLEFT" />
+            <Anchor point="BOTTOMRIGHT"  />
+          </Anchors>
+        </Texture>
+        <!--<Texture desatuated="true" parentKey="LineGlow" hidden="false" alpha="0" alphaMode="ADD" atlas="OBJFX_LineGlow" useAtlasSize="true">
+          <Anchors>
+            <Anchor point="LEFT" relativeKey="$parent.Background" x="-21" y="18"/>
+          </Anchors>
+        </Texture>
+        <Texture parentKey="SoftGlow" hidden="false" alpha="0" alphaMode="ADD" atlas="OBJFX_Glow" useAtlasSize="true">
+          <Anchors>
+            <Anchor point="CENTER" relativeKey="$parent.Background" relativePoint="LEFT" x="49" y="20"/>
+          </Anchors>
+        </Texture>
+        <Texture parentKey="StarBurst" hidden="false" alpha="0" alphaMode="ADD" atlas="OBJFX_StarBurst" useAtlasSize="true">
+          <Anchors>
+            <Anchor point="CENTER" relativeKey="$parent.SoftGlow" x="29"/>
+          </Anchors>
+        </Texture>
+        <Texture parentKey="LineSheen" hidden="false" alpha="0" alphaMode="ADD" atlas="OBJFX_LineBurst">
+          <Size x="60" y="15"/>
+          <Anchors>
+            <Anchor point="CENTER" relativeKey="$parent.SoftGlow" x="29" y="-13"/>
+          </Anchors>
+        </Texture>-->
+      </Layer>
+      <Layer level="OVERLAY">
+
+        <!--<Texture name="$parentTCR" parentKey="outlineClosed" file="Interface\FrameGeneral\UI-Frame">
+          <Size x="40" y="30" />
+          <Color r="1" g="1" b="1" a="1" />
+          <TexCoords top=".0156" bottom=".0265" left=".625" right=".875" />
+          <Anchors>
+            <Anchor point="TOPRIGHT" relativePoint="TOPRIGHT" x="2" y="2" />
+          </Anchors>
+        </Texture>-->
+
+      </Layer>
+    </Layers>
+    <Frames>
+
+      <ScrollFrame name="$parentScrollFrame" enableMouseWheel="true" parentKey="scrollArea" parentArray="minimizeFrames">
+        <Anchors>
+          <Anchor point="TOP" />
+        </Anchors>
+        <Layers>
+          <Layer level="BACKGROUND">
+            <Texture setAllPoints="true" parentKey="bg">
+              <Color r="0.15" g=".3" b=".3" a="0" />
+            </Texture>
+          </Layer>
+        </Layers>
+        <Frames>
+
+
+          <Frame name="VeneerObjectiveScroll">
+            <Anchors>
+              <Anchor point="TOP" />
+            </Anchors>
+            <Layers>
+              <Layer level="BACKGROUND">
+                <Texture setAllPoints="true" parentKey="bg">
+                  <Color r="1" g="1" b="1" a="1" />
+                  <Gradient orientation="HORIZONTAL">
+                    <MinColor r="0" g="0.5" b="0.5" a="0" />
+                    <MaxColor r="0" g="0.5" b="0.5" a="0" />
+                  </Gradient>
+                </Texture>
+              </Layer>
+            </Layers>
+          </Frame>
+        </Frames>
+      </ScrollFrame>
+
+      <Frame name="$parentStatusHeader" parentKey="header" frameStrata="MEDIUM">
+        <Layers>
+          <Layer level="OVERLAY">
+            <FontString name="$parentTitle" parentKey="status" inherits="VeneerStatusFont" text="status test" justifyH="RIGHT">
+              <Anchors>
+                <Anchor point="TOPRIGHT" x="-64" y="0" />
+              </Anchors>
+            </FontString>
+          </Layer>
+        </Layers>
+      </Frame>
+
+      <Button name="$parentCloseButton" parentKey="CloseButton" enableMouse="true" frameStrata="MEDIUM">
+        <Size x="16" y="16" />
+        <HighlightTexture file="Interface\Buttons\UI-Panel-MinimizeButton-Highlight" alphaMode="ADD"/>
+        <Anchors>
+          <Anchor point="TOPRIGHT" relativePoint="TOPRIGHT" x="-2" y="0" />
+        </Anchors>
+      </Button>
+
+      <Button name="$parentQuestMapButton" parentArray="minimizeFrames" parentKey="QuestMapButton" frameStrata="MEDIUM">
+        <Size x="42" y="16" />
+        <HighlightTexture file="Interface\Buttons\UI-Panel-MinimizeButton-Highlight" alphaMode="ADD"/>
+        <Anchors>
+          <Anchor point="TOPRIGHT" relativePoint="TOPLEFT" relativeKey="$parent.CloseButton" x="0" y="0" />
+        </Anchors>
+      </Button>
+    </Frames>
+  </Frame>
+
+
+
+
+  <Frame name="$parentXP" parent="VeneerObjectiveWrapper" parentKey="XPBar" hidden="true">
+    <Size x="250" y="24" />
+    <Anchors>
+      <Anchor point="TOPLEFT" />
+    </Anchors>
+    <Layers>
+      <Layer level="BACKGROUND">
+        <Texture name="$parentBackground" parentKey="statusbg" setAllPoints="true"/>
+      </Layer>
+      <Layer level="ARTWORK">
+
+        <Texture name="$parentForeground" parentKey="foreground">
+          <Anchors>
+            <Anchor point="TOPLEFT" />
+            <Anchor point="BOTTOMLEFT" />
+          </Anchors>
+        </Texture>
+        <Texture name="$parentRested" parentKey="rested" >
+          <Anchors>
+            <Anchor point="TOPLEFT" />
+            <Anchor point="BOTTOMLEFT" />
+          </Anchors>
+        </Texture>
+      </Layer>
+      <Layer level="OVERLAY">
+        <FontString inherits="VeneerFontNormal" parentKey="title">
+          <Anchors>
+            <Anchor point="CENTER" />
+          </Anchors>
+        </FontString>
+      </Layer>
+    </Layers>
+  </Frame>
+
+  <!-- Header Panel -->
+
+  <!-- Background panels -->
+
+  <Frame name="VeneerTrackerTemplate" parent="UIParent" virtual="true">
+    <Layers>
+      <Layer level="BACKGROUND">
+        <Texture name="$parentTitleBackground" parentKey="titlebg">
+          <Anchors>
+            <Anchor point="TOPLEFT" />
+            <Anchor point="RIGHT" />
+          </Anchors>
+          <Color r="1" g="1" b="1" a="1" />
+          <Gradient orientation="HORIZONTAL">
+            <MinColor r="0" g="0" b="0" a="0.1" />
+            <MaxColor r="0" g="0" b="0" a="0" />
+          </Gradient>
+        </Texture>
+      </Layer>
+      <Layer level="OVERLAY">
+        <FontString name="$parentTitle" inherits="VeneerFontHighlight" text="OBJ" parentKey="title" justifyH="LEFT">
+          <Anchors>
+            <Anchor point="TOP" relativeKey="$parent.titlebg" />
+            <Anchor point="BOTTOM" relativeKey="$parent.titlebg"  />
+            <Anchor point="LEFT" relativeKey="$parent.titlebg" />
+            <Anchor point="RIGHT" relativeKey="$parent" />
+          </Anchors>
+        </FontString>
+        <FontString name="$parentStatus" inherits="VeneerStatusFont" parentKey="status" justifyH="RIGHT">
+          <Anchors>
+            <Anchor point="TOP" relativeKey="$parent.titlebg" />
+            <Anchor point="BOTTOM" relativeKey="$parent.titlebg"  />
+            <Anchor point="LEFT" relativeKey="$parent.titlebg" />
+            <Anchor point="RIGHT" relativeKey="$parent" />
+          </Anchors>
+        </FontString>
+      </Layer>
+    </Layers>
+  </Frame>
+
+
+  <Frame name="VeneerTrackerBlock" parent="VeneerObjectiveScroll" virtual="true" enableMouse="true">
+    <TitleRegion>
+      <Anchors>
+        <Anchor point="TOPLEFT" />
+        <Anchor point="BOTTOMRIGHT" relativeKey="TOPRIGHT" x="0" y="-22" />
+      </Anchors>
+    </TitleRegion>
+    <Layers>
+      <Layer level="BACKGROUND">
+        <Texture name="$parentTitleBackground" parentKey="titlebg">
+          <Color r="1" g="1" b="1" a="1" />
+          <Anchors>
+            <Anchor point="LEFTTOP" x="0" y="0" />
+            <Anchor point="RIGHT" />
+          </Anchors>
+        </Texture>
+        <Texture name="$parentStatusBackground" parentKey="statusbg">
+          <Anchors>
+            <Anchor point="LEFT" />
+            <Anchor point="RIGHT" />
+            <Anchor point="TOP" relativePoint="BOTTOM" relativeKey="$parent.titlebg" />
+            <Anchor point="BOTTOM" x="0" y="0" />
+          </Anchors>
+          <Color r="1" g="1" b="1" a="1" />
+          <Gradient orientation="HORIZONTAL">
+            <MinColor r="0" g="0" b="0" a=".15" />
+            <MaxColor r="0" g="0" b="0" a=".35" />
+          </Gradient>
+        </Texture>
+      </Layer>
+      <Layer level="ARTWORK">
+        <Texture name="$parentItemTile" parentKey="icon" alphaMode="BLEND" hidden="true">
+          <Anchors>
+            <Anchor point="TOPRIGHT" x="0" y="0" />
+          </Anchors>
+        </Texture>
+        <Texture parentKey="typeTag" file="Interface\QuestFrame\QuestTypeIcons" alphaMode="ADD" hidden="true">
+          <Size x="18" y="18"/>
+          <Anchors>
+            <Anchor point="TOPRIGHT" relativePoint="TOPLEFT" relativeKey="$parent.FrequencyTag" x="-3" y="-3"/>
+
+          </Anchors>
+        </Texture>
+        <Texture parentKey="frequencyTag" file="Interface\QuestFrame\QuestTypeIcons" alphaMode="ADD" hidden="true">
+          <Size x="18" y="18"/>
+          <Anchors>
+            <Anchor point="TOPRIGHT" relativePoint="TOPLEFT" relativeKey="$parent.CompletionTag" x="-3" y="-3"/>
+
+          </Anchors>
+        </Texture>
+        <Texture parentKey="completionTag" file="Interface\QuestFrame\QuestTypeIcons" alphaMode="ADD" hidden="true">
+          <Size x="18" y="18"/>
+          <Anchors>
+            <Anchor point="TOPRIGHT" relativePoint="TOPLEFT" relativeKey="$parent.icon" x="-3" y="-3"/>
+
+          </Anchors>
+        </Texture>
+        <Texture name="$parentMoneyTile" parentKey="money" hidden="true" />
+
+        <Texture parentKey="SelectionOverlay" alphaMode="ADD" hidden="true">
+          <Anchors>
+            <Anchor point="TOPLEFT" />
+            <Anchor point="BOTTOMRIGHT" />
+          </Anchors>
+          <Color r="1" g="1" b="1" a="1" />
+          <Gradient orientation="HORIZONTAL">
+            <MaxColor r="1" g="0" b="0" a="0.7" />
+            <MinColor r="1" g="0" b="0" a="0.7" />
+          </Gradient>
+        </Texture>
+      </Layer>
+      <Layer level="OVERLAY">
+        <FontString name="$parentTitle" parentKey="title" inherits="VeneerTitleFont" justifyH="LEFT" justifyV="TOP">
+          <Anchors>
+            <Anchor point="TOP" relativeKey="$parent.titlebg" />
+            <Anchor point="LEFT" relativeKey="$parent" />
+            <Anchor point="RIGHT" relativeKey="$parent" />
+          </Anchors>
+        </FontString>
+        <FontString name="$parentStatus" parentKey="status" inherits="VeneerCriteriaFontNormal" justifyH="LEFT" justifyV="TOP" wordwrap="true">
+          <Anchors>
+            <Anchor point="TOP" relativeKey="$parent.statusbg" />
+            <Anchor point="LEFT"  relativeKey="$parent" />
+            <Anchor point="RIGHT" relativeKey="$parent" />
+          </Anchors>
+        </FontString>
+        <FontString name="$parentDebugText" parentKey="debugText" inherits="VeneerCriteriaFontNormal" justifyH="RIGHT" justifyV="TOP">
+          <Anchors>
+            <Anchor point="TOPRIGHT" relativePoint="TOPRIGHT" />
+          </Anchors>
+        </FontString>
+        <FontString name="$parentItemTileText" parentKey="iconLabel" inherits="VeneerNumberFont">
+          <Anchors>
+            <Anchor point="TOPRIGHT" x="-1" y="-4" relativeKey="$parent.icon" />
+          </Anchors>
+        </FontString>
+
+
+        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
+          <Anchors>
+            <Anchor point="TOPLEFT" relativeKey="$parent.status" />
+            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.status" relativePoint="BOTTOMLEFT" x="1" y="0" />
+          </Anchors>
+          <Color r="1" g="1" b="1" a="1" />
+        </Texture>
+        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
+          <Anchors>
+            <Anchor point="TOPLEFT" relativeKey="$parent.status" />
+            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.status" relativePoint="TOPRIGHT" x="0" y="-1" />
+          </Anchors>
+          <Color r="1" g="1" b="1" a="1" />
+        </Texture>
+        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
+          <Anchors>
+            <Anchor point="TOPLEFT" relativeKey="$parent.status" relativePoint="BOTTOMLEFT" x="0" y="1" />
+            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.status" />
+          </Anchors>
+          <Color r="1" g="1" b="1" a="1" />
+        </Texture>
+
+        <Texture alphaMode="ADD" parentArray="config" hidden="true">
+          <Anchors>
+            <Anchor point="TOPLEFT" relativeKey="$parent.statusbg" x="-30" y="0" />
+            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.status" relativePoint="TOPRIGHT" x="30" y="0" />
+          </Anchors>
+          <Color r="0" g="1" b="0" a="0.5" />
+        </Texture>
+        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
+          <Anchors>
+            <Anchor point="TOPLEFT" x="-35" y="0" />
+            <Anchor point="BOTTOMRIGHT" relativePoint="TOPRIGHT" x="0" y="-1" />
+          </Anchors>
+          <Color r="1" g="0" b="0" a="1" />
+        </Texture>
+        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
+          <Anchors>
+            <Anchor point="TOPLEFT" relativePoint="BOTTOMLEFT" x="0" y="1" />
+            <Anchor point="BOTTOMRIGHT" x="35" y="0" />
+          </Anchors>
+          <Color r="1" g=".5" b="0" a="1" />
+        </Texture>
+
+      </Layer>
+      <Layer level="HIGHLIGHT">
+        <Texture name="$parentHighLight" parentKey="highlight">
+          <Anchors>
+            <Anchor point="TOPLEFT" />
+            <Anchor point="BOTTOMRIGHT" relativePoint="TOPRIGHT" x="0" y="-4"/>
+          </Anchors>
+          <Color r="1" g="1" b="1" a="1" />
+          <Gradient orientation="VERTICAL">
+            <MaxColor r="1" g="1" b="1" a=".5" />
+            <MinColor r="1" g="1" b="1" a="0" />
+          </Gradient>
+        </Texture>
+        <Texture name="$parentLowLight" parentKey="lowlight">
+          <Anchors>
+            <Anchor point="TOP" relativePoint="BOTTOM" x="0" y="14" />
+            <Anchor point="BOTTOM"  x="0" y="0"/>
+            <Anchor point="RIGHT" />
+            <Anchor point="LEFT" />
+          </Anchors>
+          <Color r="1" g="1" b="1" a="1" />
+          <Gradient orientation="VERTICAL">
+            <MaxColor r="1" g="1" b="1" a="0" />
+            <MinColor r="1" g="1" b="1" a=".5" />
+          </Gradient>
+        </Texture>
+      </Layer>
+    </Layers>
+  </Frame>
+
+  <Frame name="VeneerTrackerObjective" virtual="true" hidden="true">
+    <Anchors>
+      <Anchor point="RIGHT" />
+    </Anchors>
+    <Layers>
+      <Layer level="OVERLAY">
+        <FontString inherits="VeneerCriteriaFontNormal" parentKey="status" wordwrap="true" justifyH="LEFT" justifyV="TOP">
+          <Anchors>
+            <Anchor point="TOP" />
+            <Anchor point="LEFT" />
+            <Anchor point="RIGHT" />
+          </Anchors>
+        </FontString>
+
+        <!-- debugging guides -->
+        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
+          <Anchors>
+            <Anchor point="TOPLEFT" x="0" y="600" />
+            <Anchor point="BOTTOMRIGHT"  relativePoint="BOTTOMLEFT" x="1" y="-600" />
+          </Anchors>
+          <Color r="0" g="1" b="0" a="1" />
+        </Texture>
+        <Texture alphaMode="ADD" parentArray="config" hidden="true">
+          <Anchors>
+            <Anchor point="TOPLEFT" relativeKey="$parent" x="0" y="600" />
+            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.status" relativePoint="BOTTOMLEFT" x="0" y="-600" />
+          </Anchors>
+          <Color r="0" g=".4" b="1" a=".25" />
+        </Texture>
+        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
+          <Anchors>
+            <Anchor point="TOPLEFT" relativeKey="$parent.status" relativePoint="TOPRIGHT" x="-1" y="200" />
+            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.status" x="0" y="-600" />
+          </Anchors>
+          <Color r="0" g="1" b="0" a=".5" />
+        </Texture>
+
+        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
+          <Anchors>
+            <Anchor point="TOPLEFT" relativeKey="$parent.status" x="-30" y="0" />
+            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.status" relativePoint="TOPRIGHT" x="0" y="-1" />
+          </Anchors>
+          <Color r="1" g="0" b="0" a="0.5" />
+        </Texture>
+        <Texture alphaMode="BLEND" parentArray="config" hidden="true">
+          <Anchors>
+            <Anchor point="TOPLEFT" relativePoint="BOTTOMLEFT" relativeKey="$parent.status" x="0" y="1" />
+            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.status" relativePoint="BOTTOMRIGHT" x="30" y="0" />
+          </Anchors>
+          <Color r="1" g="0" b="0" a="0.5" />
+        </Texture>
+
+        <!-- end debugging guides -->
+
+      </Layer>
+      <Layer level="BACKGROUND">
+        <Texture parentKey="statusbg">
+          <Anchors>
+            <Anchor point="TOP" />
+            <Anchor point="LEFT" />
+            <Anchor point="RIGHT" />
+            <Anchor point="BOTTOM" />
+          </Anchors>
+        </Texture>
+      </Layer>
+    </Layers>
+  </Frame>
+
+  <Include file="ObjectiveSecure.xml" />
+  <Include file="ObjectiveWidgets.xml" />
+
+  <Script file="ObjectiveCore.lua" />
+  <Script file="ObjectiveInfo.lua" />
+  <Script file="ObjectiveUI.lua" />
+  <Script file="ObjectiveStyle.lua" />
+  <Script file="ObjectiveFrame.lua" />
+  <Script file="ObjectiveEvents.lua" />
+  <Script file="ObjectiveWidgets.lua" />
+  <Script file="QuestTracker.lua" />
+  <Script file="AchievementsTracker.lua" />
+  <Script file="AutoQuestPopUpTracker.lua" />
+  <Script file="BonusObjectiveTracker.lua" />
+  <Script file="ScenarioTracker.lua" />
+  <Script file="XPTracker.lua" />
+</Ui>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ObjectiveTracker/ObjectiveUI.lua	Sun Apr 10 04:35:32 2016 -0400
@@ -0,0 +1,118 @@
+--- ${PACKAGE_NAME}
+-- @file-author@
+-- @project-revision@ @project-hash@
+-- @file-revision@ @file-hash@
+-- Created: 3/29/2016 7:07 PM
+local B = select(2,...).frame
+local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
+local print = B.print('Objectives')
+local Default, AutoQuest, Quest, Cheevs = mod.DefaultHandler, mod.AutoQuest, mod.Quest, mod.Cheevs
+local itemButtonSize, itemButtonSpacing =  36, 1
+local tremove, tremovebyval = table.remove, table.removebyval
+
+--------------------------------------------------------------------
+--- Functions responsible for:
+--- - UI interactions that propagate to the BlizzardUI (sending RemoveQuestWatch() on remove quest action)
+--- -
+--------------------------------------------------------------------
+
+Default.Select = function(self) end
+Default.Open = function(self) end
+Default.Remove = function(self) end
+Default.Report = function(self)
+  print('Stats:', self.numWatched,'items tracked,', self.numBlocks,'blocks assigned.')
+end
+
+Default.OnMouseUp = function(self, button)
+  print(self.handler.name, self.mainStyle, self.subStyle)
+  if button == 'LeftButton' then
+    if IsModifiedClick("CHATLINK") and ChatEdit_GetActiveWindow() then
+      self:Link()
+    elseif IsModifiedClick("QUESTWATCHTOGGLE") then
+      self:Remove()
+    else
+      self:Select()
+    end
+  elseif button == 'RightButton' then
+    self:Open()
+  end
+  self.initialButton = nil
+  self.modChatLink = nil
+  self.modQuestWatch = nil
+  mod:Update(self.handler.updateReasonModule)
+  print('|cFFFF8800'..tostring(self:GetName())..':MouseUp()|r')
+end
+
+Default.OnMouseDown = function(self, button)
+  print(IsModifiedClick("CHATLINK"), IsModifiedClick("QUESTWATCHTOGGLE"))
+  print(self.info.title)
+end
+
+
+AutoQuest.Select = function(self)
+  if self.info.popupType == 'OFFER'  then
+    ShowQuestOffer(self.info.questIndex)
+  else
+    ShowQuestComplete(self.info.questIndex)
+  end
+  RemoveAutoQuestPopUp(self.info.questID)
+end
+
+Quest.Select = function(self)
+  if self.info.isAutoComplete and self.info.isComplete then
+    ShowQuestComplete(self.info.questLogIndex)
+  else
+    SetSuperTrackedQuestID(self.info.questID)
+  end
+end
+
+Quest.Link = function(self)
+  local questLink = GetQuestLink(block.questLogIndex);
+  if ( questLink ) then
+    ChatEdit_InsertLink(questLink);
+  end
+end
+Quest.Open = function(self)
+  QuestMapFrame_OpenToQuestDetails(self.info.questID)
+end
+
+Quest.Remove = function(self)
+  print('removing', self.info.questLogIndex, 'from watcher')
+  RemoveQuestWatch(self.info.questLogIndex)
+end
+
+
+-----------------------------
+--- CHEEVS
+Cheevs.Select = function(self)
+  --mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT)
+end
+Cheevs.Remove = function(self)
+  RemoveTrackedAchievement(self.info.cheevID)
+end
+Cheevs.OnMouseUp = function(self, button)
+  Default.OnMouseUp(self, button)
+end
+Cheevs.Link = function(self)
+  local achievementLink = GetAchievementLink(self.info.cheevID);
+  if ( achievementLink ) then
+    ChatEdit_InsertLink(achievementLink);
+  end
+end
+
+Cheevs.Open = function(self)
+  if ( not AchievementFrame ) then
+    AchievementFrame_LoadUI();
+  end
+  if ( not AchievementFrame:IsShown() ) then
+    AchievementFrame_ToggleAchievementFrame();
+  end
+  AchievementFrame_SelectAchievement(self.info.cheevID);
+end
+
+local Bonus = mod.Bonus
+Bonus.Select = function(self, questID)
+  Bonus:OnTurnIn(self.info.questID, 0, 30800)
+end
+Bonus.Remove = function(self, questID)
+end
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ObjectiveTracker/ObjectiveWidgets.lua	Sun Apr 10 04:35:32 2016 -0400
@@ -0,0 +1,439 @@
+local B = select(2,...).frame
+local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
+local print = B.print('WidgetFactory')
+local UIParent = UIParent
+local GetQuestLogSpecialItemInfo, IsQuestLogSpecialItemInRange, GetQuestLogSpecialItemCooldown = GetQuestLogSpecialItemInfo, IsQuestLogSpecialItemInRange, GetQuestLogSpecialItemCooldown
+local CooldownFrame_SetTimer, SetItemButtonTextureVertexColor, CreateFrame, VeneerObjectiveScroll = CooldownFrame_SetTimer, SetItemButtonTextureVertexColor, CreateFrame, VeneerObjectiveScroll
+local tremove, tinsert, tContains, pairs, setmetatable = tremove, tinsert, tContains, pairs, setmetatable
+
+--- frame refs
+local Wrapper = _G.VeneerObjectiveWrapper
+local Scroller = Wrapper.scrollArea
+local CloseButton = Wrapper.CloseButton
+local QuestMapButton = Wrapper.QuestMapButton
+local Scroll = _G.VeneerObjectiveScroll
+
+local panelButtons = {
+  CloseButton = {
+    closedSwatch = {
+      [[Interface\Buttons\UI-Panel-QuestHideButton]],
+      [[Interface\Buttons\UI-Panel-QuestHideButton]],
+      0, 0.5, 0.5, 1,
+      0.5, 1, 0.5, 1,
+    },
+    openSwatch = {
+      [[Interface\Buttons\UI-Panel-QuestHideButton]],
+      [[Interface\Buttons\UI-Panel-QuestHideButton]],
+      0.5, 1, 0.5, 1,
+      0, 0.5, 0.5, 1,
+    },
+    parent = 'VeneerObjectiveWrapper'
+  },
+  QuestMapButton = {
+    closedSwatch = {
+      [[Interface\QUESTFRAME\UI-QUESTMAP_BUTTON]],
+      [[Interface\QUESTFRAME\UI-QUESTMAP_BUTTON]],
+      0, 1, 0.5, 1,
+      0, 1, 0, 0.5,
+    },
+    openSwatch = {
+      [[Interface\QUESTFRAME\UI-QUESTMAP_BUTTON]],
+      [[Interface\QUESTFRAME\UI-QUESTMAP_BUTTON]],
+      0, 1, 0, 0.5,
+      0, 1, 0.5, 1,
+    }
+  }
+}
+
+local Scroller_OnShow = function()
+  Wrapper.watchMoneyReasons = 0;
+  --mod:Update()
+  --mod:OnInitialize()
+  for i, region in ipairs(Wrapper.headerComplex) do
+    region:Show()
+  end
+end
+
+local Scroller_OnHide = function()
+  local self = Wrapper
+  Wrapper:UnregisterAllEvents()
+  Wrapper:SetScript('OnEvent', nil)
+  for i, region in ipairs(Wrapper.headerComplex) do
+    region:Hide()
+  end
+end
+
+local Scroller_OnMouseWheel = function(self, delta)
+  local r = Scroll:GetHeight() - Scroller:GetHeight()
+  local s = B.Conf.ObjectiveScroll - delta * floor(r/5+.5)
+  local from = self:GetVerticalScroll()
+  print('|cFF00FF00OnMouseWheel', 'scroll =', s)
+  if s >= r then
+    s = r
+  elseif s < 1 then
+    s = 0
+  end
+  self:SetVerticalScroll(s)
+  B.Conf.ObjectiveScroll = s
+  print('|cFF00FF00OnMouseWheel', 'from = ', from, 'scroll =', s, ' range =', r, 'current =', self:GetVerticalScroll())
+
+  mod.UpdateActionButtons('SCROLLING')
+end
+
+local UpdatePanelButton = function (self, state)
+  state = state and B.Conf.FrameState[state] or 1
+  local swatch = (state == 1) and self.openSwatch or self.closedSwatch
+  self:SetNormalTexture(swatch[1])
+  self:SetPushedTexture(swatch[2])
+  if #swatch >= 6 then
+    self:GetNormalTexture():SetTexCoord(swatch[3], swatch[4], swatch[5], swatch[6])
+  end
+  if #swatch == 10 then
+    self:GetPushedTexture():SetTexCoord(swatch[7], swatch[8], swatch[9], swatch[10])
+  end
+
+end
+
+local OnClick = {}
+OnClick.CloseButton = function(self)
+  Wrapper:Minimize()
+  UpdatePanelButton(self, self.parent)
+end
+
+OnClick.QuestMapButton = function()
+  ToggleWorldMap()
+end
+
+
+mod.InitializeWidgets = function()
+  --- tracker scroll
+  Scroller:SetScript('OnMouseWheel', Scroller_OnMouseWheel)
+  Scroller:SetScript('OnShow', Scroller_OnShow)
+  Scroller:SetScript('OnHide', Scroller_OnHide)
+  for name, swatch in pairs(panelButtons) do
+    local source = swatch and swatch or panelButtons.CloseButton
+    local button = Wrapper[name]
+    button.parent = swatch.parent
+    button.openSwatch = source.openSwatch
+    button.closedSwatch = source.closedSwatch
+    if OnClick[name] then
+      button:SetScript('OnClick', OnClick[name])
+    end
+    UpdatePanelButton(button, button.parent)
+  end
+end
+
+----------------------------------------------------------------------------------------
+--- XML and script code lifted from "QuestKing 2" by Barjack,
+---   found at http://mods.curse.com/addons/wow/questking
+----------------------------------------------------------------------------------------
+local usedButtons = mod.Quest.itemButtons
+local freeButtons = mod.Quest.freeButtons
+mod.SetItemButton = function(block, info)
+  local itemInfo = info.specialItem
+  if not itemInfo then
+    return
+  end
+
+  --- Quest.GetInfo().specialItem :: {link = link, charges = charges, icon = icon, start = start, duration = duration, enable = enable}
+
+
+  local itemButton
+  if not info.itemButton then
+    if #freeButtons >= 1 then
+      print('    |cFF00FFFFfound a free button')
+      itemButton = freeButtons[#freeButtons]
+      freeButtons[#freeButtons] = nil
+      if itemButton.block then
+        itemButton.block.itemButton = nil
+        itemButton.block = nil
+      end
+    else
+      local buttonIndex = mod.Quest.numButtons + #freeButtons + 1
+      itemButton = CreateFrame('Button', 'VeneerQuestItemButton' .. buttonIndex, UIParent, 'VeneerItemButtonTemplate')
+      itemButton.buttonIndex = buttonIndex
+      itemButton:SetSize(36, 36)
+      itemButton:GetNormalTexture():SetSize(36 * (5/3), 36 * (5/3))
+      print('    |cFFFF4400starting new button', itemButton:GetName())
+    end
+    mod.Quest.numButtons = mod.Quest.numButtons + 1
+  else
+    itemButton = info.itemButton
+    print('    |cFF00FF00found assigned button', itemButton:GetName())
+
+  end
+  -- set values
+
+  info.itemButton = itemButton
+  usedButtons[info.questID] = itemButton
+  print('      |cFF8800FFassigning|r', itemButton:GetName(), 'to quest|cFF00FF00', info.questID, '|rat|cFFFFFF00', block:GetName(),'|r')
+
+  for k,v in pairs(usedButtons) do
+    print('|cFFFF44DD'..k..'|r', v:GetName())
+  end
+
+  itemButton:SetAttribute("type", "item")
+  itemButton:SetAttribute("item", itemInfo.link)
+
+  itemButton.questID = info.questID
+  itemButton.questLogIndex = info.questLogIndex
+  itemButton.charges = itemInfo.charges
+  itemButton.rangeTimer = -1
+  itemButton.block = block
+
+  SetItemButtonTexture(itemButton, itemInfo.icon)
+  SetItemButtonCount(itemButton, itemInfo.charges)
+  Veneer_QuestObjectiveItem_UpdateCooldown(itemButton);
+
+  return itemButton
+end
+--- Clear an itemButton from the given block
+mod.FreeItemButtons = function(block)
+
+  if block.itemButton then
+    local itemButton = block.itemButton
+    if itemButton.questID ~= block.info.questID then
+      block.itemButton = nil
+      itemButton.block = mod.Quest.InfoBlock[itemButton.questID]
+    else
+      itemButton.block = nil
+      itemButton:Hide()
+
+      usedButtons[itemButton.questID] = nil
+      freeButtons[#freeButtons + 1] = itemButton
+      mod.Quest.numButtons = mod.Quest.numButtons - 1
+      print('|cFFFF0088released', itemButton:GetName(),'and', block:GetName())
+    end
+  end
+end
+
+function Veneer_QuestObjectiveItem_OnUpdate (self, elapsed)
+  -- Handle range indicator
+  local rangeTimer = self.rangeTimer
+  if (rangeTimer) then
+    rangeTimer = rangeTimer - elapsed
+    if (rangeTimer <= 0) then
+      local link, item, charges, showItemWhenComplete = GetQuestLogSpecialItemInfo(self.questLogIndex)
+      if ((not charges) or (charges ~= self.charges)) then
+        mod:Update()
+        return
+      end
+
+      local count = self.HotKey
+      local valid = IsQuestLogSpecialItemInRange(self.questLogIndex)
+      if (valid == 0) then
+        count:Show()
+        count:SetVertexColor(1.0, 0.1, 0.1)
+      elseif (valid == 1) then
+        count:Show()
+        count:SetVertexColor(0.6, 0.6, 0.6)
+      else
+        count:Hide()
+      end
+      rangeTimer = TOOLTIP_UPDATE_TIME
+    end
+
+    self.rangeTimer = rangeTimer
+  end
+end
+
+function Veneer_QuestObjectiveItem_UpdateCooldown (itemButton)
+  local start, duration, enable = GetQuestLogSpecialItemCooldown(itemButton.questLogIndex)
+  if (start) then
+    CooldownFrame_SetTimer(itemButton.Cooldown, start, duration, enable)
+    if (duration > 0 and enable == 0) then
+      SetItemButtonTextureVertexColor(itemButton, 0.4, 0.4, 0.4)
+    else
+      SetItemButtonTextureVertexColor(itemButton, 1, 1, 1)
+    end
+  end
+end
+
+-----------------------------------------
+-- Criteria frames
+
+--[[
+      text = description,
+      type = type,
+      finished = completed,
+      quantity = quantity,
+      requiredQuantity = requiredQuantity,
+      characterName = characterName,
+      flags = flags,
+      assetID = assetID,
+      quantityString = quantityString,
+      criteriaID = criteriaID,
+]]
+local newWidgetID = 0
+mod.WidgetRegistry = {}
+local wr = mod.WidgetRegistry
+
+--- Get a usable widget for the given achievement criteria set.
+-- Returns a frame object with dimensioning parameters needed to size the receiving tracker block
+mod.SetWidget = function(line, data, objectiveType, objectiveKey)
+  local print = B.print('ObjectiveWidgets')
+  local widgetType = objectiveType
+  local widget
+  if wr[widgetType] and wr[widgetType].used[objectiveKey] then
+    widget = wr[widgetType].used[objectiveKey]
+    print('|cFF00FF00Updating ('..objectiveKey..')', widget)
+  elseif not wr[widgetType] or #wr[widgetType].free == 0 then
+    widget = CreateFrame('Frame', 'VeneerObjective' .. widgetType .. (wr[widgetType] and (wr[widgetType].lastn+1) or (1)), VeneerObjectiveScroll, 'VeneerObjectiveCriteria' .. widgetType)
+
+    print('|cFFFF0088Creating `'..widget:GetName()..'` id', wr[widgetType].lastn)
+  else
+    widget = tremove(wr[widgetType].free)
+    print('|cFFFFFF00Acquiring released widget', widget:GetName())
+  end
+
+
+  wr[widgetType].used[objectiveKey] = widget
+  widget.line = line
+  widget.objective = data
+  widget.key = objectiveKey
+  mod.InitializeWidget(widget)
+  return widget
+end
+
+--- WidgetTemplate 'OnLoad'
+mod.RegisterWidget = function(frame)
+  local print = B.print('ObjectiveWidgets')
+  local widgetType = frame.widgetType
+  if not wr[frame.widgetType] then
+    print('|cFFFF4400[[WidgetTemplate]]|r', widgetType)
+    wr[widgetType] = { lastn = 1, free = {}, used = {}, usedIndex = {}, freeIndex = {} }
+  else
+    print('|cFF0088FF+ [[WidgetTemplate]]r', widgetType, wr[widgetType].lastn)
+    wr[widgetType].lastn = wr[widgetType].lastn + 1
+  end
+end
+
+--- WidgetTemplate 'OnShow'
+mod.InitializeWidget = setmetatable({}, {
+  __call = function(t, frame)
+    -- todo: config pull
+
+    frame:SetWidth(mod.Conf.Wrapper.Width - mod.Conf.Style.Format.status.Indent * 2)
+    frame:SetScript('OnEvent', mod.UpdateWidget[frame.widgetType])
+    frame:RegisterEvent('TRACKED_ACHIEVEMENT_UPDATE')
+    frame:RegisterEvent('TRACKED_ACHIEVEMENT_LIST_CHANGED')
+    frame:RegisterEvent('CRITERIA_UPDATE')
+    frame:RegisterEvent('CRITERIA_COMPLETE')
+    frame:RegisterEvent('CRITERIA_EARNED')
+    t[frame.widgetType](frame)
+    mod.UpdateWidget[frame.widgetType](frame)
+  end,
+})
+
+--- WidgetTemplate 'OnEvent'
+mod.UpdateWidget = setmetatable({}, {
+  __call = function(t, frame)
+    if not frame.widgetType then
+      error('Invalid widget template, needs .widgetType')
+      return
+    end
+
+    return t[frame.widgetType](frame)
+  end
+})
+
+--- WidgetTemplate 'OnHide'
+mod.ReleaseWidget = function(frame)
+  --[[
+  local print = B.print('ObjectiveWidgets')
+  local reg = wr[frame.widgetType]
+  if reg and reg.used[frame.key] then
+    reg.used[frame.key] = nil
+    frame.line = nil
+    frame.info = nil
+    frame:UnregisterAllEvents()
+    tinsert(reg.free, frame)
+    print('|cFFBBBBBBreleased from service', frame:GetName())
+  end
+  ]]
+end
+
+--- RemoveTrackedAchievement post-hook
+mod.CleanWidgets = function()
+  local print = B.print('ObjectiveWidgets')
+  local tracked = {GetTrackedAchievements() }
+  local tasks = GetTasksTable()
+  for type, reg in pairs(mod.WidgetRegistry) do
+    print('collecting', type)
+    for key, frame in pairs(reg.used) do
+      if frame.objective.cheevID then
+        local id = frame.objective.cheevID
+
+        if id and not tContains(tracked, id) then
+
+          print('  untracked achievement', id, 'associated with', key, frame:GetName())
+          frame:Hide()
+        end
+      elseif frame.objective.questID then
+        -- do something for quest task
+      end
+    end
+  end
+end
+
+
+
+mod.defaults.WidgetStyle = {
+
+}
+
+local progressHeight = 16
+local progressBorder = 1
+local progressIndent = 3
+local progressFont = _G.VeneerCriteriaFontNormal
+
+
+mod.InitializeWidget.ProgressBar = function(self)
+  local c = mod.Conf.Wrapper
+  self.height = progressHeight + c.TextSpacing
+  self.width = c.Width - c.TextSpacing
+  self.indent = progressIndent
+
+  self:SetHeight(progressHeight)
+  self.bg:SetHeight(progressHeight)
+  self.bg:SetWidth(self.width)
+  self.fg:ClearAllPoints()
+  self.fg:SetPoint('BOTTOMLEFT', self, 'BOTTOMLEFT', progressBorder, progressBorder)
+  self.fg:SetHeight(progressHeight - progressBorder *  2)
+  self.status:SetFontObject(progressFont)
+  self.status:SetText(self.objective.quantityString)
+end
+
+mod.UpdateWidget.ProgressBar = function (self)
+  local quantity, requiredQuantity = self.objective.value, self.objective.maxValue
+  print('update vals:')
+  for k,v in pairs(self.line) do
+    print(k, v)
+  end
+
+  if self.line.format then
+    self.status:SetFormattedText(self.line.format, quantity, requiredQuantity)
+  end
+
+  local progress = (quantity / requiredQuantity)
+  if progress >= 1 then
+    self.fg:Show()
+    self.fg:SetWidth(self.width  - progressBorder * 2)
+  elseif progress > 0 then
+    self.fg:Show()
+    print('color:', 1-progress*2 , progress*2 - 1,0,1)
+    print('width:', (self.width  -progressBorder * 2) * progress)
+    self.fg:SetTexture(1-progress*2 , progress*2,0,1)
+    self.fg:SetWidth((self.width  -progressBorder * 2) * progress)
+  else
+    self.fg:Hide()
+  end
+end
+
+
+mod.InitializeWidget.Hidden = function (self)
+  self.height = 0
+end
+mod.UpdateWidget.Hidden = function (self)
+  self.height=  0
+end
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ObjectiveTracker/ObjectiveWidgets.xml	Sun Apr 10 04:35:32 2016 -0400
@@ -0,0 +1,100 @@
+<Ui>
+  <!-- houses objective widget templates -->
+
+  <Frame name="VeneerObjectiveCriteriaProgressBar" virtual="true" hidden="true">
+    <Size x="250" y="30" />
+    <Scripts>
+      <OnLoad>
+        self.widgetType = 'ProgressBar'
+        Veneer.ObjectiveTracker.RegisterWidget(self)
+      </OnLoad>
+      <OnShow>
+        Veneer.ObjectiveTracker.InitializeWidget(self)
+      </OnShow>
+      <OnHide>
+        Veneer.ObjectiveTracker.ReleaseWidget(self)
+      </OnHide>
+      <OnEvent>
+
+      </OnEvent>
+    </Scripts>
+    <Layers>
+      <Layer level="BORDER">
+        <Texture name="$parentBackground" parentKey="bg">
+          <Color r="0" g="0" b="0" a="0.70" />
+          <Anchors>
+            <Anchor point="BOTTOMLEFT" />
+            <Anchor point="TOPRIGHT" />
+          </Anchors>
+        </Texture>
+      </Layer>
+      <Layer level="ARTWORK">
+
+        <Texture name="$parentForeground" parentKey="fg">
+          <Color r="1" g="1" b="1" a="0.7" />
+        </Texture>
+        <Texture name="$parentIcon" parentKey="icon" alphaMode="MOD">
+          <Anchors>
+            <Anchor point="TOPLEFT" relativeKey="$parent.fg" />
+            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.fg" />
+          </Anchors>
+        </Texture>
+      </Layer>
+      <Layer level="OVERLAY">
+        <FontString name="$parentStatus" parentKey="status" inherits="VeneerCriteriaFont">
+          <Anchors>
+            <Anchor point="CENTER" />
+          </Anchors>
+        </FontString>
+      </Layer>
+    </Layers>
+  </Frame>
+
+  <Frame name="VeneerObjectiveCriteriaEvent" virtual="true" hidden="true">
+    <Size x="250" y="24" />
+    <Scripts>
+      <OnLoad>
+        self.widgetType = 'Event'
+        self.lines = 1
+        Veneer.ObjectiveTracker.RegisterWidget(self)
+      </OnLoad>
+      <OnShow>
+        Veneer.ObjectiveTracker.InitializeWidget(self)
+      </OnShow>
+      <OnHide>
+        Veneer.ObjectiveTracker.ReleaseWidget(self)
+      </OnHide>
+    </Scripts>
+    <Layers>
+      <Layer level="OVERLAY">
+        <FontString name="$parentStatusText" parentKey="status" inherits="VeneerCriteriaFont">
+
+        </FontString>
+      </Layer>
+    </Layers>
+  </Frame>
+
+  <Frame name="VeneerObjectiveCriteriaHidden" virtual="true" hidden="true">
+    <Size x="250" y="24" />
+    <Scripts>
+      <OnLoad>
+        self.widgetType = 'Hidden'
+        self.lines = 0
+        Veneer.ObjectiveTracker.RegisterWidget(self)
+      </OnLoad>
+      <OnShow>
+        Veneer.ObjectiveTracker.InitializeWidget(self)
+      </OnShow>
+      <OnHide>
+        Veneer.ObjectiveTracker.ReleaseWidget(self)
+      </OnHide>
+    </Scripts>
+    <Layers>
+      <Layer level="OVERLAY">
+        <FontString name="$parentStatusText" parentKey="status" inherits="VeneerCriteriaFont">
+
+        </FontString>
+      </Layer>
+    </Layers>
+  </Frame>
+</Ui>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ObjectiveTracker/QuestTracker.lua	Sun Apr 10 04:35:32 2016 -0400
@@ -0,0 +1,307 @@
+local B = select(2,...).frame
+local T = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
+local _G, ipairs, max, min, unpack, floor, pairs, tostring, type, band = _G, ipairs, max, min, unpack, floor, pairs, tostring, type, bit.band
+local GetAutoQuestPopUp, GetQuestLogCompletionText = GetAutoQuestPopUp, GetQuestLogCompletionText
+local Default, Quest = T.DefaultHandler, T.Quest
+local format = format
+local print = B.print('Tracker')
+local lprint = B.print('Line')
+
+local colors = T.colors
+Quest.UpdateObjectives = function(handler, block)
+  local print = lprint
+  print('|cFF00FFFFUpdateObjectives()')
+  local info = block.info
+
+  local titlebg, textbg = colors.default.titlebg, colors.default.textbg
+  print((info.isAccount and 'isAccount' or ''), (info.isFaction and 'isFaction' or ''), (info.isDaily and 'isDaily' or ''), (info.isWeekly and 'isWeekly' or ''), info.tagID, info.tagName)
+
+  if info.isAccount then
+    if info.isFaction then
+      print('     faction', info.tagID)
+      titlebg, textbg = colors['faction_'..info.tagID].titlebg, colors.default.textbg
+    else
+      print('     account', info.isAccount, info.isFaction)
+      titlebg, textbg = colors.account.titlebg, colors.account.textbg
+    end
+  elseif info.isDaily then
+    print('     daily', info.frequency)
+    titlebg, textbg = colors.daily.titlebg, colors.daily.textbg
+  elseif info.isWeekly then
+    print('     weekly', info.frequency)
+    titlebg, textbg = colors.weekly.titlebg, colors.weekly.textbg
+  end
+
+  block.titlebg:SetGradientAlpha(unpack(titlebg))
+  block.statusbg:SetGradientAlpha(unpack(textbg))
+
+  local completionText
+  if info.isAutoComplete then
+    local questID, popupType = GetAutoQuestPopUp(info.questLogIndex)
+    if popupType == 'COMPLETE' then
+      print('    :: auto-complete quest :: set the message')
+      info.completionText = CLICK_TO_COMPLETE
+    end
+  end
+  if info.isComplete then
+    if not completionText or info.completionText then
+      info.completionText = GetQuestLogCompletionText(info.questLogIndex)
+    end
+    print('    :: complete quest :: show instruction: "'.. tostring(info.completionText) .. '"')
+  end
+
+  Default.UpdateObjectives(handler, block)
+end
+
+Quest.UpdateLine = function(handler, block, line, data)
+  local print = lprint
+  local objectiveType = data.type
+  local r, g, b, a = 0, 1, 1, 1
+
+  line.progress = 0
+  if data.finished then
+    line.progress = 2
+    r, g, b, a = 0, 1, 0, 1
+  elseif objectiveType == 'monster' then
+    r, g, b, a = 1, .55, .2, 1
+  elseif objectiveType == 'item' then
+    r, g, b, a = .8, .8, .8, 1
+  elseif objectiveType == 'object' then
+    r, g, b, a = 1, 1, 1, 1
+  elseif objectiveType == 'player' then
+    r, g, b, a = 0, 0.8, 1, 1
+  end
+  print(format('     |cFF%02X%02X%02X%0.1f, %0.1f, %0.1f|r', (r * 255), g * 255, b * 255, r, g, b))
+
+  line.displayColor = {r, g, b, a}
+  line.status:SetTextColor(r, g, b, a)
+  line.displayText = data.text
+
+  return line
+end
+
+-----------------------------
+--- QUEST
+Quest.itemButtons = {}
+Quest.freeButtons = {}
+Quest.POI = {}
+Quest.QuestBlock = {}
+Quest.LogBlock = {}
+Quest.LogInfo = {}
+
+function Quest:GetNumWatched ()
+  print(self.name, self)
+  self.numAll = GetNumQuestLogEntries()
+  self.numWatched = GetNumQuestWatches()
+  return self.numWatched, self.numAll
+end
+Quest.GetInfo = function (self, watchIndex)
+  print('|cFF00DDFFQuest|r.|cFF0088FFGetInfo(|r'.. tostring(watchIndex)..'|r)')
+  local questID, title, questIndex, numObjectives, requiredMoney, isComplete,
+  startEvent, isAutoComplete, failureTime, timeElapsed, questType, isTask, isStory, isOnMap, hasLocalPOI = GetQuestWatchInfo(watchIndex)
+
+  if not questIndex then
+    return
+  end
+
+  local _, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, _, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle(questIndex)
+
+
+  if not questID then
+    return
+  end
+  Quest.Info[questID] = Quest.Info[questID] or {}
+
+  local q = Quest.Info[questID]
+  q.watchIndex = watchIndex
+  q.type = 'Quest'
+  q.questID = questID
+  q.title = title
+  q.level = level
+  q.displayQuestID = displayQuestID
+  q.suggestedGroup = suggestedGroup
+  q.questLogIndex = questIndex
+  q.numObjectives = numObjectives
+  q.requiredMoney = requiredMoney
+  q.isComplete = isComplete
+  q.startEvent = startEvent
+  q.isAutoComplete = isAutoComplete
+  q.failureTime = failureTime
+  q.timeElapsed = timeElapsed
+  q.questType = questType
+  q.isTask = isTask
+  q.isStory = isStory
+  q.isOnMap = isOnMap
+  q.hasLocalPOI = hasLocalPOI
+  q.frequency = frequency
+  q.isComplete = isComplete
+  q.isStory = isStory
+  q.isTask = isTask
+
+  --- resolve icon type and template
+  local questTagID, tagName = GetQuestTagInfo(questID)
+  local tagID
+
+  local factionGroup = GetQuestFactionGroup(questID);
+  if( questTagID and questTagID == QUEST_TAG_ACCOUNT ) then
+    if( factionGroup ) then
+      tagID = "ALLIANCE";
+      if ( factionGroup == LE_QUEST_FACTION_HORDE ) then
+        tagID = "HORDE";
+      end
+      q.isFaction = true
+    else
+      tagID = QUEST_TAG_ACCOUNT;
+      q.isAccount = true
+    end
+    q.typeTag = QUEST_TAG_TCOORDS[tagID]
+  elseif ( factionGroup) then
+    tagID = "ALLIANCE";
+    if ( factionGroup == LE_QUEST_FACTION_HORDE ) then
+      tagID = "HORDE";
+    end
+    q.isFaction = true
+  end
+
+  if( frequency == LE_QUEST_FREQUENCY_DAILY and (not isComplete or isComplete == 0) ) then
+    tagID = "DAILY";
+    q.frequencyTag = QUEST_TAG_TCOORDS["DAILY"]
+    q.isDaily = true
+  elseif( frequency == LE_QUEST_FREQUENCY_WEEKLY and (not isComplete or isComplete == 0) )then
+    tagID = "WEEKLY";
+    q.frequencyTag = QUEST_TAG_TCOORDS["WEEKLY"]
+    q.isWeekly = true
+  elseif( questTagID ) then
+    tagID = questTagID;
+  end
+
+  if ( isComplete and isComplete < 0 ) then
+    q.completionTag = QUEST_TAG_TCOORDS["FAILED"]
+    q.isFailed = true
+  elseif isComplete then
+    q.completionTag = QUEST_TAG_TCOORDS["COMPLETED"]
+  end
+
+
+  q.tagID = questTagID
+  q.tagName = tagName
+
+
+
+  --q.isBreadCrumb = isBreadCrumb
+  q.completionText= GetQuestLogCompletionText(questIndex)
+  q.numObjectives = GetNumQuestLeaderBoards(questIndex)
+  q.objectives = {}
+  for i = 1, q.numObjectives do
+    local text, type, finished = GetQuestLogLeaderBoard(i, questIndex)
+    print(format('   #%d %s %s %s', i, tostring(type), tostring(text), tostring(finished)))
+    q.objectives[i] = {
+      index = i,
+      type = type,
+      text = text,
+      finished = finished
+    }
+    if type == 'event' then
+    elseif type == 'monster' then
+    elseif type == 'object' then
+    elseif type == 'reputation' then
+    elseif type == 'item' then
+    end
+  end
+
+  if requiredMoney >= 1 then
+    local money = GetMoney()
+    local moneyText = money
+    local requiredSilver, requiredCopper
+    local requiredGold = (requiredMoney > 10000) and (floor(requiredMoney/10000)) or nil
+    if mod(requiredMoney, 10000) ~= 0 then
+      requiredSilver = (requiredMoney > 100) and (mod(requiredMoney, 10000) / 100) or nil
+      if mod(requiredMoney, 100) ~= 0 then
+        requiredCopper = mod(requiredMoney, 100)
+      end
+    end
+
+    -- round the money value down
+    if requiredMoney > 9999 and not (requiredSilver or requiredCopper) then
+      moneyText = floor(money/10000)
+    elseif requiredMoney < 10000 and mod(requiredMoney,100) == 0 then
+      moneyText = floor(money/100)
+    end
+
+    local text = moneyText
+    local index = #q.objectives + 1
+    local finished = (GetMoney() >= requiredMoney)
+
+    if not finished then
+      text = text .. ' / ' .. GetCoinTextureString(requiredMoney, 12)
+    else
+      text = '' .. GetCoinTextureString(requiredMoney, 12)
+    end
+    q.objectives[index] = {
+      index = index,
+      type = 'progressbar',
+      quantity = money,
+      requiredQuantity = requiredMoney,
+      text = text,
+      finished = finished
+    }
+    print(format('   #%d %s %s %s', index, 'money', text, tostring(finished)))
+  end
+
+
+  local link, icon, charges = GetQuestLogSpecialItemInfo(questIndex)
+  local start, duration, enable = GetQuestLogSpecialItemCooldown(questIndex)
+  if link or icon or charges then
+    q.specialItem = {
+      questID = questID,
+      questIndex = questIndex,
+      link = link,
+      charges = charges,
+      icon = icon,
+      start = start,
+      duration = duration,
+      enable = enable,
+    }
+  end
+
+  if QuestHasPOIInfo(questID) then
+    local distance, onContinent = GetDistanceSqToQuest(questIndex)
+    if distance ~= nil and distance > 0 then
+      self.POI[questIndex] = {
+        questIndex = questIndex,
+        questID = questID,
+        distance = distance,
+        onContinent = onContinent
+      }
+    end
+  end
+
+
+  q.selected =  (questID == GetSuperTrackedQuestID()) -- call directly so artifact data doesn't become an issue
+  self.WatchInfo[watchIndex] = q
+  self.LogInfo[questIndex] = q
+  print('- logIndex =', questIndex, 'title =', title)
+  return q
+end
+
+Quest.GetClosest = function()
+  local minID, minTitle
+  local minDist = math.huge
+  local numQuests = GetNumQuestLogEntries()
+  for questIndex =  1, numQuests do
+    local distance, onContinent = GetDistanceSqToQuest(questIndex)
+    local title, level, _, _, _, _, _, _, questID = GetQuestLogTitle(questIndex)
+    if onContinent and distance < minDist then
+      minDist = distance
+      minTitle = title
+      minID = questID
+    end
+  end
+
+  print('nearest quest is', minTitle, 'by', math.sqrt(minDist))
+  return minID, minTitle, minDist
+end
+
+Quest.OnTurnIn = function(self, questID, xp, money)
+
+end
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ObjectiveTracker/XPTracker.lua	Sun Apr 10 04:35:32 2016 -0400
@@ -0,0 +1,92 @@
+--- ${PACKAGE_NAME}
+-- @file-author@
+-- @project-revision@ @project-hash@
+-- @file-revision@ @file-hash@
+-- Created: 4/6/2016 4:44 AM
+
+local B = select(2,...).frame
+local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
+local tostring = tostring
+local UnitLevel, IsResting, UnitXP, UnitXPMax, GetXPExhaustion, IsXPUserDisabled = UnitLevel, IsResting, UnitXP, UnitXPMax, GetXPExhaustion, IsXPUserDisabled
+local Wrapper = _G.VeneerObjectiveWrapper
+local print = B.print('XPTracker')
+
+mod.InitializeXPTracker = function()
+  local XPBar = Wrapper.XPBar
+  if UnitLevel('player') == 100 then
+    XPBar:Hide()
+    return
+  end
+
+  --- xp bar
+  XPBar:SetWidth(mod.Conf.Wrapper.WrapperWidth - Wrapper.CloseButton:GetWidth())
+  XPBar.statusbg:SetAllPoints(XPBar)
+  XPBar:RegisterEvent('DISABLE_XP_GAIN')
+  XPBar:RegisterEvent('ENABLE_XP_GAIN')
+  XPBar:SetScript('OnEvent', mod.UpdateXP)
+
+  if not IsXPUserDisabled() then
+    mod.EnableXP(XPBar)
+  else
+    mod.DisableXP(XPBar)
+  end
+
+  mod.UpdateXP(XPBar)
+end
+
+mod.EnableXP = function(self)
+  self:RegisterEvent('PLAYER_XP_UPDATE')
+  self:RegisterEvent('PLAYER_LEVEL_UP')
+  self:RegisterEvent('PLAYER_UPDATE_RESTING')
+  self.statusbg:SetTexture(0,0,0,.25)
+  self:Show()
+end
+
+mod.DisableXP = function(self)
+  self:UnregisterEvent('PLAYER_XP_UPDATE')
+  self:UnregisterEvent('PLAYER_LEVEL_UP')
+  self:UnregisterEvent('PLAYER_UPDATE_RESTING')
+  self.statusbg:SetTexture(0.5,0.5,0.5,0.5)
+  self:Hide()
+end
+
+mod.UpdateXP = function(self, event)
+  if event == 'DISABLE_XP_GAIN' then
+    mod.DisableXP(self)
+  elseif event == 'ENABLE_XP_GAIN' then
+    mod.EnableXP(self)
+  end
+
+  if not IsXPUserDisabled() then
+
+    local xp = UnitXP('player')
+    local xpmax = UnitXPMax('player')
+    local rest = GetXPExhaustion()
+    self.foreground:SetWidth((xp/xpmax) * self:GetWidth())
+    if rest then
+      self.rested:ClearAllPoints()
+      if xp == 0 then
+        self.rested:SetPoint('TOPLEFT', self, 'TOPLEFT', 0, 0)
+      else
+        self.rested:SetPoint('TOPLEFT', self.fg, 'TOPRIGHT', 0, 0)
+      end
+
+      if (xp + rest) > xpmax then
+        self.rested:SetPoint('BOTTOMRIGHT', self, 'BOTTOMRIGHT', 0, 0)
+      else
+        self.rested:SetWidth((rest/xpmax) * self:GetWidth())
+      end
+      self.rested:SetPoint('BOTTOM', self, 'BOTTOM')
+      self.rested:Show()
+    else
+      self.rested:Hide()
+    end
+
+    if IsResting() then
+      self.statusbg:SetTexture(.2,.8,.2,.5)
+    else
+      self.statusbg:SetTexture(0,0,0,.25)
+    end
+    self.xpText:SetText(xp .. '/'.. xpmax .. (rest and (' ('..tostring(rest)..')') or ''))
+  end
+end
\ No newline at end of file
--- a/ObjectiveUI.lua	Sat Apr 09 07:32:45 2016 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,118 +0,0 @@
---- ${PACKAGE_NAME}
--- @file-author@
--- @project-revision@ @project-hash@
--- @file-revision@ @file-hash@
--- Created: 3/29/2016 7:07 PM
-local B = select(2,...).frame
-local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
-local print = B.print('Objectives')
-local Default, AutoQuest, Quest, Cheevs = mod.DefaultHandler, mod.AutoQuest, mod.Quest, mod.Cheevs
-local itemButtonSize, itemButtonSpacing =  36, 1
-local tremove, tremovebyval = table.remove, table.removebyval
-
---------------------------------------------------------------------
---- Functions responsible for:
---- - UI interactions that propagate to the BlizzardUI (sending RemoveQuestWatch() on remove quest action)
---- -
---------------------------------------------------------------------
-
-Default.Select = function(self) end
-Default.Open = function(self) end
-Default.Remove = function(self) end
-Default.Report = function(self)
-  print('Stats:', self.numWatched,'items tracked,', self.numBlocks,'blocks assigned.')
-end
-
-Default.OnMouseUp = function(self, button)
-  print(self.handler.name, self.mainStyle, self.subStyle)
-  if button == 'LeftButton' then
-    if IsModifiedClick("CHATLINK") and ChatEdit_GetActiveWindow() then
-      self:Link()
-    elseif IsModifiedClick("QUESTWATCHTOGGLE") then
-      self:Remove()
-    else
-      self:Select()
-    end
-  elseif button == 'RightButton' then
-    self:Open()
-  end
-  self.initialButton = nil
-  self.modChatLink = nil
-  self.modQuestWatch = nil
-  mod:Update(self.handler.updateReasonModule)
-  print('|cFFFF8800'..tostring(self:GetName())..':MouseUp()|r')
-end
-
-Default.OnMouseDown = function(self, button)
-  print(IsModifiedClick("CHATLINK"), IsModifiedClick("QUESTWATCHTOGGLE"))
-  print(self.info.title)
-end
-
-
-AutoQuest.Select = function(self)
-  if self.info.popupType == 'OFFER'  then
-    ShowQuestOffer(self.info.questIndex)
-  else
-    ShowQuestComplete(self.info.questIndex)
-  end
-  RemoveAutoQuestPopUp(self.info.questID)
-end
-
-Quest.Select = function(self)
-  if self.info.isAutoComplete and self.info.isComplete then
-    ShowQuestComplete(self.info.questLogIndex)
-  else
-    SetSuperTrackedQuestID(self.info.questID)
-  end
-end
-
-Quest.Link = function(self)
-  local questLink = GetQuestLink(block.questLogIndex);
-  if ( questLink ) then
-    ChatEdit_InsertLink(questLink);
-  end
-end
-Quest.Open = function(self)
-  QuestMapFrame_OpenToQuestDetails(self.info.questID)
-end
-
-Quest.Remove = function(self)
-  print('removing', self.info.questLogIndex, 'from watcher')
-  RemoveQuestWatch(self.info.questLogIndex)
-end
-
-
------------------------------
---- CHEEVS
-Cheevs.Select = function(self)
-  --mod:Update(OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT)
-end
-Cheevs.Remove = function(self)
-  RemoveTrackedAchievement(self.info.cheevID)
-end
-Cheevs.OnMouseUp = function(self, button)
-  Default.OnMouseUp(self, button)
-end
-Cheevs.Link = function(self)
-  local achievementLink = GetAchievementLink(self.info.cheevID);
-  if ( achievementLink ) then
-    ChatEdit_InsertLink(achievementLink);
-  end
-end
-
-Cheevs.Open = function(self)
-  if ( not AchievementFrame ) then
-    AchievementFrame_LoadUI();
-  end
-  if ( not AchievementFrame:IsShown() ) then
-    AchievementFrame_ToggleAchievementFrame();
-  end
-  AchievementFrame_SelectAchievement(self.info.cheevID);
-end
-
-local Bonus = mod.Bonus
-Bonus.Select = function(self, questID)
-  Bonus:OnTurnIn(self.info.questID, 0, 30800)
-end
-Bonus.Remove = function(self, questID)
-end
\ No newline at end of file
--- a/ObjectiveWidgets.lua	Sat Apr 09 07:32:45 2016 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,439 +0,0 @@
-local B = select(2,...).frame
-local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
-local print = B.print('WidgetFactory')
-local UIParent = UIParent
-local GetQuestLogSpecialItemInfo, IsQuestLogSpecialItemInRange, GetQuestLogSpecialItemCooldown = GetQuestLogSpecialItemInfo, IsQuestLogSpecialItemInRange, GetQuestLogSpecialItemCooldown
-local CooldownFrame_SetTimer, SetItemButtonTextureVertexColor, CreateFrame, VeneerObjectiveScroll = CooldownFrame_SetTimer, SetItemButtonTextureVertexColor, CreateFrame, VeneerObjectiveScroll
-local tremove, tinsert, tContains, pairs, setmetatable = tremove, tinsert, tContains, pairs, setmetatable
-
---- frame refs
-local Wrapper = _G.VeneerObjectiveWrapper
-local Scroller = Wrapper.scrollArea
-local CloseButton = Wrapper.CloseButton
-local QuestMapButton = Wrapper.QuestMapButton
-local Scroll = _G.VeneerObjectiveScroll
-
-local panelButtons = {
-  CloseButton = {
-    closedSwatch = {
-      [[Interface\Buttons\UI-Panel-QuestHideButton]],
-      [[Interface\Buttons\UI-Panel-QuestHideButton]],
-      0, 0.5, 0.5, 1,
-      0.5, 1, 0.5, 1,
-    },
-    openSwatch = {
-      [[Interface\Buttons\UI-Panel-QuestHideButton]],
-      [[Interface\Buttons\UI-Panel-QuestHideButton]],
-      0.5, 1, 0.5, 1,
-      0, 0.5, 0.5, 1,
-    },
-    parent = 'VeneerObjectiveWrapper'
-  },
-  QuestMapButton = {
-    closedSwatch = {
-      [[Interface\QUESTFRAME\UI-QUESTMAP_BUTTON]],
-      [[Interface\QUESTFRAME\UI-QUESTMAP_BUTTON]],
-      0, 1, 0.5, 1,
-      0, 1, 0, 0.5,
-    },
-    openSwatch = {
-      [[Interface\QUESTFRAME\UI-QUESTMAP_BUTTON]],
-      [[Interface\QUESTFRAME\UI-QUESTMAP_BUTTON]],
-      0, 1, 0, 0.5,
-      0, 1, 0.5, 1,
-    }
-  }
-}
-
-local Scroller_OnShow = function()
-  Wrapper.watchMoneyReasons = 0;
-  --mod:Update()
-  --mod:OnInitialize()
-  for i, region in ipairs(Wrapper.headerComplex) do
-    region:Show()
-  end
-end
-
-local Scroller_OnHide = function()
-  local self = Wrapper
-  Wrapper:UnregisterAllEvents()
-  Wrapper:SetScript('OnEvent', nil)
-  for i, region in ipairs(Wrapper.headerComplex) do
-    region:Hide()
-  end
-end
-
-local Scroller_OnMouseWheel = function(self, delta)
-  local r = Scroll:GetHeight() - Scroller:GetHeight()
-  local s = B.Conf.ObjectiveScroll - delta * floor(r/5+.5)
-  local from = self:GetVerticalScroll()
-  print('|cFF00FF00OnMouseWheel', 'scroll =', s)
-  if s >= r then
-    s = r
-  elseif s < 1 then
-    s = 0
-  end
-  self:SetVerticalScroll(s)
-  B.Conf.ObjectiveScroll = s
-  print('|cFF00FF00OnMouseWheel', 'from = ', from, 'scroll =', s, ' range =', r, 'current =', self:GetVerticalScroll())
-
-  mod.UpdateActionButtons('SCROLLING')
-end
-
-local UpdatePanelButton = function (self, state)
-  state = state and B.Conf.FrameState[state] or 1
-  local swatch = (state == 1) and self.openSwatch or self.closedSwatch
-  self:SetNormalTexture(swatch[1])
-  self:SetPushedTexture(swatch[2])
-  if #swatch >= 6 then
-    self:GetNormalTexture():SetTexCoord(swatch[3], swatch[4], swatch[5], swatch[6])
-  end
-  if #swatch == 10 then
-    self:GetPushedTexture():SetTexCoord(swatch[7], swatch[8], swatch[9], swatch[10])
-  end
-
-end
-
-local OnClick = {}
-OnClick.CloseButton = function(self)
-  Wrapper:Minimize()
-  UpdatePanelButton(self, self.parent)
-end
-
-OnClick.QuestMapButton = function()
-  ToggleWorldMap()
-end
-
-
-mod.InitializeWidgets = function()
-  --- tracker scroll
-  Scroller:SetScript('OnMouseWheel', Scroller_OnMouseWheel)
-  Scroller:SetScript('OnShow', Scroller_OnShow)
-  Scroller:SetScript('OnHide', Scroller_OnHide)
-  for name, swatch in pairs(panelButtons) do
-    local source = swatch and swatch or panelButtons.CloseButton
-    local button = Wrapper[name]
-    button.parent = swatch.parent
-    button.openSwatch = source.openSwatch
-    button.closedSwatch = source.closedSwatch
-    if OnClick[name] then
-      button:SetScript('OnClick', OnClick[name])
-    end
-    UpdatePanelButton(button, button.parent)
-  end
-end
-
-----------------------------------------------------------------------------------------
---- XML and script code lifted from "QuestKing 2" by Barjack,
----   found at http://mods.curse.com/addons/wow/questking
-----------------------------------------------------------------------------------------
-local usedButtons = mod.Quest.itemButtons
-local freeButtons = mod.Quest.freeButtons
-mod.SetItemButton = function(block, info)
-  local itemInfo = info.specialItem
-  if not itemInfo then
-    return
-  end
-
-  --- Quest.GetInfo().specialItem :: {link = link, charges = charges, icon = icon, start = start, duration = duration, enable = enable}
-
-
-  local itemButton
-  if not info.itemButton then
-    if #freeButtons >= 1 then
-      print('    |cFF00FFFFfound a free button')
-      itemButton = freeButtons[#freeButtons]
-      freeButtons[#freeButtons] = nil
-      if itemButton.block then
-        itemButton.block.itemButton = nil
-        itemButton.block = nil
-      end
-    else
-      local buttonIndex = mod.Quest.numButtons + #freeButtons + 1
-      itemButton = CreateFrame('Button', 'VeneerQuestItemButton' .. buttonIndex, UIParent, 'VeneerItemButtonTemplate')
-      itemButton.buttonIndex = buttonIndex
-      itemButton:SetSize(36, 36)
-      itemButton:GetNormalTexture():SetSize(36 * (5/3), 36 * (5/3))
-      print('    |cFFFF4400starting new button', itemButton:GetName())
-    end
-    mod.Quest.numButtons = mod.Quest.numButtons + 1
-  else
-    itemButton = info.itemButton
-    print('    |cFF00FF00found assigned button', itemButton:GetName())
-
-  end
-  -- set values
-
-  info.itemButton = itemButton
-  usedButtons[info.questID] = itemButton
-  print('      |cFF8800FFassigning|r', itemButton:GetName(), 'to quest|cFF00FF00', info.questID, '|rat|cFFFFFF00', block:GetName(),'|r')
-
-  for k,v in pairs(usedButtons) do
-    print('|cFFFF44DD'..k..'|r', v:GetName())
-  end
-
-  itemButton:SetAttribute("type", "item")
-  itemButton:SetAttribute("item", itemInfo.link)
-
-  itemButton.questID = info.questID
-  itemButton.questLogIndex = info.questLogIndex
-  itemButton.charges = itemInfo.charges
-  itemButton.rangeTimer = -1
-  itemButton.block = block
-
-  SetItemButtonTexture(itemButton, itemInfo.icon)
-  SetItemButtonCount(itemButton, itemInfo.charges)
-  Veneer_QuestObjectiveItem_UpdateCooldown(itemButton);
-
-  return itemButton
-end
---- Clear an itemButton from the given block
-mod.FreeItemButtons = function(block)
-
-  if block.itemButton then
-    local itemButton = block.itemButton
-    if itemButton.questID ~= block.info.questID then
-      block.itemButton = nil
-      itemButton.block = mod.Quest.InfoBlock[itemButton.questID]
-    else
-      itemButton.block = nil
-      itemButton:Hide()
-
-      usedButtons[itemButton.questID] = nil
-      freeButtons[#freeButtons + 1] = itemButton
-      mod.Quest.numButtons = mod.Quest.numButtons - 1
-      print('|cFFFF0088released', itemButton:GetName(),'and', block:GetName())
-    end
-  end
-end
-
-function Veneer_QuestObjectiveItem_OnUpdate (self, elapsed)
-  -- Handle range indicator
-  local rangeTimer = self.rangeTimer
-  if (rangeTimer) then
-    rangeTimer = rangeTimer - elapsed
-    if (rangeTimer <= 0) then
-      local link, item, charges, showItemWhenComplete = GetQuestLogSpecialItemInfo(self.questLogIndex)
-      if ((not charges) or (charges ~= self.charges)) then
-        mod:Update()
-        return
-      end
-
-      local count = self.HotKey
-      local valid = IsQuestLogSpecialItemInRange(self.questLogIndex)
-      if (valid == 0) then
-        count:Show()
-        count:SetVertexColor(1.0, 0.1, 0.1)
-      elseif (valid == 1) then
-        count:Show()
-        count:SetVertexColor(0.6, 0.6, 0.6)
-      else
-        count:Hide()
-      end
-      rangeTimer = TOOLTIP_UPDATE_TIME
-    end
-
-    self.rangeTimer = rangeTimer
-  end
-end
-
-function Veneer_QuestObjectiveItem_UpdateCooldown (itemButton)
-  local start, duration, enable = GetQuestLogSpecialItemCooldown(itemButton.questLogIndex)
-  if (start) then
-    CooldownFrame_SetTimer(itemButton.Cooldown, start, duration, enable)
-    if (duration > 0 and enable == 0) then
-      SetItemButtonTextureVertexColor(itemButton, 0.4, 0.4, 0.4)
-    else
-      SetItemButtonTextureVertexColor(itemButton, 1, 1, 1)
-    end
-  end
-end
-
------------------------------------------
--- Criteria frames
-
---[[
-      text = description,
-      type = type,
-      finished = completed,
-      quantity = quantity,
-      requiredQuantity = requiredQuantity,
-      characterName = characterName,
-      flags = flags,
-      assetID = assetID,
-      quantityString = quantityString,
-      criteriaID = criteriaID,
-]]
-local newWidgetID = 0
-mod.WidgetRegistry = {}
-local wr = mod.WidgetRegistry
-
---- Get a usable widget for the given achievement criteria set.
--- Returns a frame object with dimensioning parameters needed to size the receiving tracker block
-mod.SetWidget = function(line, data, objectiveType, objectiveKey)
-  local print = B.print('ObjectiveWidgets')
-  local widgetType = objectiveType
-  local widget
-  if wr[widgetType] and wr[widgetType].used[objectiveKey] then
-    widget = wr[widgetType].used[objectiveKey]
-    print('|cFF00FF00Updating ('..objectiveKey..')', widget)
-  elseif not wr[widgetType] or #wr[widgetType].free == 0 then
-    widget = CreateFrame('Frame', 'VeneerObjective' .. widgetType .. (wr[widgetType] and (wr[widgetType].lastn+1) or (1)), VeneerObjectiveScroll, 'VeneerObjectiveCriteria' .. widgetType)
-
-    print('|cFFFF0088Creating `'..widget:GetName()..'` id', wr[widgetType].lastn)
-  else
-    widget = tremove(wr[widgetType].free)
-    print('|cFFFFFF00Acquiring released widget', widget:GetName())
-  end
-
-
-  wr[widgetType].used[objectiveKey] = widget
-  widget.line = line
-  widget.objective = data
-  widget.key = objectiveKey
-  mod.InitializeWidget(widget)
-  return widget
-end
-
---- WidgetTemplate 'OnLoad'
-mod.RegisterWidget = function(frame)
-  local print = B.print('ObjectiveWidgets')
-  local widgetType = frame.widgetType
-  if not wr[frame.widgetType] then
-    print('|cFFFF4400[[WidgetTemplate]]|r', widgetType)
-    wr[widgetType] = { lastn = 1, free = {}, used = {}, usedIndex = {}, freeIndex = {} }
-  else
-    print('|cFF0088FF+ [[WidgetTemplate]]r', widgetType, wr[widgetType].lastn)
-    wr[widgetType].lastn = wr[widgetType].lastn + 1
-  end
-end
-
---- WidgetTemplate 'OnShow'
-mod.InitializeWidget = setmetatable({}, {
-  __call = function(t, frame)
-    -- todo: config pull
-
-    frame:SetWidth(mod.Conf.Wrapper.Width - mod.Conf.Style.Format.status.Indent * 2)
-    frame:SetScript('OnEvent', mod.UpdateWidget[frame.widgetType])
-    frame:RegisterEvent('TRACKED_ACHIEVEMENT_UPDATE')
-    frame:RegisterEvent('TRACKED_ACHIEVEMENT_LIST_CHANGED')
-    frame:RegisterEvent('CRITERIA_UPDATE')
-    frame:RegisterEvent('CRITERIA_COMPLETE')
-    frame:RegisterEvent('CRITERIA_EARNED')
-    t[frame.widgetType](frame)
-    mod.UpdateWidget[frame.widgetType](frame)
-  end,
-})
-
---- WidgetTemplate 'OnEvent'
-mod.UpdateWidget = setmetatable({}, {
-  __call = function(t, frame)
-    if not frame.widgetType then
-      error('Invalid widget template, needs .widgetType')
-      return
-    end
-
-    return t[frame.widgetType](frame)
-  end
-})
-
---- WidgetTemplate 'OnHide'
-mod.ReleaseWidget = function(frame)
-  --[[
-  local print = B.print('ObjectiveWidgets')
-  local reg = wr[frame.widgetType]
-  if reg and reg.used[frame.key] then
-    reg.used[frame.key] = nil
-    frame.line = nil
-    frame.info = nil
-    frame:UnregisterAllEvents()
-    tinsert(reg.free, frame)
-    print('|cFFBBBBBBreleased from service', frame:GetName())
-  end
-  ]]
-end
-
---- RemoveTrackedAchievement post-hook
-mod.CleanWidgets = function()
-  local print = B.print('ObjectiveWidgets')
-  local tracked = {GetTrackedAchievements() }
-  local tasks = GetTasksTable()
-  for type, reg in pairs(mod.WidgetRegistry) do
-    print('collecting', type)
-    for key, frame in pairs(reg.used) do
-      if frame.objective.cheevID then
-        local id = frame.objective.cheevID
-
-        if id and not tContains(tracked, id) then
-
-          print('  untracked achievement', id, 'associated with', key, frame:GetName())
-          frame:Hide()
-        end
-      elseif frame.objective.questID then
-        -- do something for quest task
-      end
-    end
-  end
-end
-
-
-
-mod.defaults.WidgetStyle = {
-
-}
-
-local progressHeight = 16
-local progressBorder = 1
-local progressIndent = 3
-local progressFont = _G.VeneerCriteriaFontNormal
-
-
-mod.InitializeWidget.ProgressBar = function(self)
-  local c = mod.Conf.Wrapper
-  self.height = progressHeight + c.TextSpacing
-  self.width = c.Width - c.TextSpacing
-  self.indent = progressIndent
-
-  self:SetHeight(progressHeight)
-  self.bg:SetHeight(progressHeight)
-  self.bg:SetWidth(self.width)
-  self.fg:ClearAllPoints()
-  self.fg:SetPoint('BOTTOMLEFT', self, 'BOTTOMLEFT', progressBorder, progressBorder)
-  self.fg:SetHeight(progressHeight - progressBorder *  2)
-  self.status:SetFontObject(progressFont)
-  self.status:SetText(self.objective.quantityString)
-end
-
-mod.UpdateWidget.ProgressBar = function (self)
-  local quantity, requiredQuantity = self.objective.value, self.objective.maxValue
-  print('update vals:')
-  for k,v in pairs(self.line) do
-    print(k, v)
-  end
-
-  if self.line.format then
-    self.status:SetFormattedText(self.line.format, quantity, requiredQuantity)
-  end
-
-  local progress = (quantity / requiredQuantity)
-  if progress >= 1 then
-    self.fg:Show()
-    self.fg:SetWidth(self.width  - progressBorder * 2)
-  elseif progress > 0 then
-    self.fg:Show()
-    print('color:', 1-progress*2 , progress*2 - 1,0,1)
-    print('width:', (self.width  -progressBorder * 2) * progress)
-    self.fg:SetTexture(1-progress*2 , progress*2,0,1)
-    self.fg:SetWidth((self.width  -progressBorder * 2) * progress)
-  else
-    self.fg:Hide()
-  end
-end
-
-
-mod.InitializeWidget.Hidden = function (self)
-  self.height = 0
-end
-mod.UpdateWidget.Hidden = function (self)
-  self.height=  0
-end
\ No newline at end of file
--- a/ObjectiveWidgets.xml	Sat Apr 09 07:32:45 2016 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-<Ui>
-  <!-- houses objective widget templates -->
-
-  <Frame name="VeneerObjectiveCriteriaProgressBar" virtual="true" hidden="true">
-    <Size x="250" y="30" />
-    <Scripts>
-      <OnLoad>
-        self.widgetType = 'ProgressBar'
-        Veneer.ObjectiveTracker.RegisterWidget(self)
-      </OnLoad>
-      <OnShow>
-        Veneer.ObjectiveTracker.InitializeWidget(self)
-      </OnShow>
-      <OnHide>
-        Veneer.ObjectiveTracker.ReleaseWidget(self)
-      </OnHide>
-      <OnEvent>
-
-      </OnEvent>
-    </Scripts>
-    <Layers>
-      <Layer level="BORDER">
-        <Texture name="$parentBackground" parentKey="bg">
-          <Color r="0" g="0" b="0" a="0.70" />
-          <Anchors>
-            <Anchor point="BOTTOMLEFT" />
-            <Anchor point="TOPRIGHT" />
-          </Anchors>
-        </Texture>
-      </Layer>
-      <Layer level="ARTWORK">
-
-        <Texture name="$parentForeground" parentKey="fg">
-          <Color r="1" g="1" b="1" a="0.7" />
-        </Texture>
-        <Texture name="$parentIcon" parentKey="icon" alphaMode="MOD">
-          <Anchors>
-            <Anchor point="TOPLEFT" relativeKey="$parent.fg" />
-            <Anchor point="BOTTOMRIGHT" relativeKey="$parent.fg" />
-          </Anchors>
-        </Texture>
-      </Layer>
-      <Layer level="OVERLAY">
-        <FontString name="$parentStatus" parentKey="status" inherits="VeneerCriteriaFont">
-          <Anchors>
-            <Anchor point="CENTER" />
-          </Anchors>
-        </FontString>
-      </Layer>
-    </Layers>
-  </Frame>
-
-  <Frame name="VeneerObjectiveCriteriaEvent" virtual="true" hidden="true">
-    <Size x="250" y="24" />
-    <Scripts>
-      <OnLoad>
-        self.widgetType = 'Event'
-        self.lines = 1
-        Veneer.ObjectiveTracker.RegisterWidget(self)
-      </OnLoad>
-      <OnShow>
-        Veneer.ObjectiveTracker.InitializeWidget(self)
-      </OnShow>
-      <OnHide>
-        Veneer.ObjectiveTracker.ReleaseWidget(self)
-      </OnHide>
-    </Scripts>
-    <Layers>
-      <Layer level="OVERLAY">
-        <FontString name="$parentStatusText" parentKey="status" inherits="VeneerCriteriaFont">
-
-        </FontString>
-      </Layer>
-    </Layers>
-  </Frame>
-
-  <Frame name="VeneerObjectiveCriteriaHidden" virtual="true" hidden="true">
-    <Size x="250" y="24" />
-    <Scripts>
-      <OnLoad>
-        self.widgetType = 'Hidden'
-        self.lines = 0
-        Veneer.ObjectiveTracker.RegisterWidget(self)
-      </OnLoad>
-      <OnShow>
-        Veneer.ObjectiveTracker.InitializeWidget(self)
-      </OnShow>
-      <OnHide>
-        Veneer.ObjectiveTracker.ReleaseWidget(self)
-      </OnHide>
-    </Scripts>
-    <Layers>
-      <Layer level="OVERLAY">
-        <FontString name="$parentStatusText" parentKey="status" inherits="VeneerCriteriaFont">
-
-        </FontString>
-      </Layer>
-    </Layers>
-  </Frame>
-</Ui>
\ No newline at end of file
--- a/Veneer.toc	Sat Apr 09 07:32:45 2016 -0400
+++ b/Veneer.toc	Sun Apr 10 04:35:32 2016 -0400
@@ -10,4 +10,4 @@
 ## OptionalDeps: Devian
 Core.xml
 BuffFrame.xml
-ObjectiveTracker.xml
\ No newline at end of file
+ObjectiveTracker\ObjectiveTracker.xml
\ No newline at end of file
--- a/XPTracker.lua	Sat Apr 09 07:32:45 2016 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
---- ${PACKAGE_NAME}
--- @file-author@
--- @project-revision@ @project-hash@
--- @file-revision@ @file-hash@
--- Created: 4/6/2016 4:44 AM
-
-local B = select(2,...).frame
-local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
-local tostring = tostring
-local UnitLevel, IsResting, UnitXP, UnitXPMax, GetXPExhaustion, IsXPUserDisabled = UnitLevel, IsResting, UnitXP, UnitXPMax, GetXPExhaustion, IsXPUserDisabled
-local Wrapper = _G.VeneerObjectiveWrapper
-local print = B.print('XPTracker')
-
-mod.InitializeXPTracker = function()
-  local XPBar = Wrapper.XPBar
-  if UnitLevel('player') == 100 then
-    XPBar:Hide()
-    return
-  end
-
-  --- xp bar
-  XPBar:SetWidth(mod.Conf.Wrapper.WrapperWidth - Wrapper.CloseButton:GetWidth())
-  XPBar.statusbg:SetAllPoints(XPBar)
-  XPBar:RegisterEvent('DISABLE_XP_GAIN')
-  XPBar:RegisterEvent('ENABLE_XP_GAIN')
-  XPBar:SetScript('OnEvent', mod.UpdateXP)
-
-  if not IsXPUserDisabled() then
-    mod.EnableXP(XPBar)
-  else
-    mod.DisableXP(XPBar)
-  end
-
-  mod.UpdateXP(XPBar)
-end
-
-mod.EnableXP = function(self)
-  self:RegisterEvent('PLAYER_XP_UPDATE')
-  self:RegisterEvent('PLAYER_LEVEL_UP')
-  self:RegisterEvent('PLAYER_UPDATE_RESTING')
-  self.statusbg:SetTexture(0,0,0,.25)
-  self:Show()
-end
-
-mod.DisableXP = function(self)
-  self:UnregisterEvent('PLAYER_XP_UPDATE')
-  self:UnregisterEvent('PLAYER_LEVEL_UP')
-  self:UnregisterEvent('PLAYER_UPDATE_RESTING')
-  self.statusbg:SetTexture(0.5,0.5,0.5,0.5)
-  self:Hide()
-end
-
-mod.UpdateXP = function(self, event)
-  if event == 'DISABLE_XP_GAIN' then
-    mod.DisableXP(self)
-  elseif event == 'ENABLE_XP_GAIN' then
-    mod.EnableXP(self)
-  end
-
-  if not IsXPUserDisabled() then
-
-    local xp = UnitXP('player')
-    local xpmax = UnitXPMax('player')
-    local rest = GetXPExhaustion()
-    self.foreground:SetWidth((xp/xpmax) * self:GetWidth())
-    if rest then
-      self.rested:ClearAllPoints()
-      if xp == 0 then
-        self.rested:SetPoint('TOPLEFT', self, 'TOPLEFT', 0, 0)
-      else
-        self.rested:SetPoint('TOPLEFT', self.fg, 'TOPRIGHT', 0, 0)
-      end
-
-      if (xp + rest) > xpmax then
-        self.rested:SetPoint('BOTTOMRIGHT', self, 'BOTTOMRIGHT', 0, 0)
-      else
-        self.rested:SetWidth((rest/xpmax) * self:GetWidth())
-      end
-      self.rested:SetPoint('BOTTOM', self, 'BOTTOM')
-      self.rested:Show()
-    else
-      self.rested:Hide()
-    end
-
-    if IsResting() then
-      self.statusbg:SetTexture(.2,.8,.2,.5)
-    else
-      self.statusbg:SetTexture(0,0,0,.25)
-    end
-    self.xpText:SetText(xp .. '/'.. xpmax .. (rest and (' ('..tostring(rest)..')') or ''))
-  end
-end
\ No newline at end of file