Quantcast

data text updates

Steven Jackson [03-11-15 - 04:32]
data text updates
Filename
SVUI_!Core/SVUI_!Core.xml
SVUI_!Core/libs/_SVUI_Lib/External.lua
SVUI_!Core/system/_reports/dps.lua
SVUI_!Core/system/_reports/hps.lua
SVUI_!Core/system/_reports/reputation.lua
SVUI_!Core/system/_reports/template.lua
SVUI_!Core/system/_reports/time.lua
SVUI_!Core/system/_reports/tokens.lua
SVUI_!Core/system/reports.lua
SVUI_Chat/SVUI_Chat.lua
SVUI_QuestTracker/components/quests.lua
SVUI_Skins/components/blizzard/tradeskill.lua
SVUI_UnitFrames/libs/Plugins/oUF_ActionPanel/oUF_ActionPanel.lua
diff --git a/SVUI_!Core/SVUI_!Core.xml b/SVUI_!Core/SVUI_!Core.xml
index f9aeb18..a799ec3 100644
--- a/SVUI_!Core/SVUI_!Core.xml
+++ b/SVUI_!Core/SVUI_!Core.xml
@@ -30,13 +30,13 @@
     <Script file="system\_reports\experience.lua"/>
     <Script file="system\_reports\friends.lua"/>
     <Script file="system\_reports\gold.lua"/>
-    <!-- <Script file="system\_reports\tokens.lua"/> -->
+    <Script file="system\_reports\tokens.lua"/>
     <Script file="system\_reports\guild.lua"/>
-    <!-- <Script file="system\_reports\reputation.lua"/> -->
+    <Script file="system\_reports\reputation.lua"/>
     <Script file="system\_reports\system.lua"/>
-    <!-- <Script file="system\_reports\time.lua"/> -->
+    <Script file="system\_reports\time.lua"/>
     <Script file="system\_reports\dps.lua"/>
-    <!-- <Script file="system\_reports\hps.lua"/> -->
+    <Script file="system\_reports\hps.lua"/>

     <Script file="system\_docklets\profession.lua"/>
     <Script file="system\_docklets\misc.lua"/>
diff --git a/SVUI_!Core/libs/_SVUI_Lib/External.lua b/SVUI_!Core/libs/_SVUI_Lib/External.lua
index 3b29056..b8889ac 100644
--- a/SVUI_!Core/libs/_SVUI_Lib/External.lua
+++ b/SVUI_!Core/libs/_SVUI_Lib/External.lua
@@ -45,6 +45,7 @@ local IsAltKeyDown = _G.IsAltKeyDown;
 --[[
 The following are private and compressed versions of dependancy libraries
 --]]
+local MAX_MINOR         = 999999999;
 local geterrorhandler   = _G.geterrorhandler;
 local CB_MAJOR          = "CallbackHandler-1.0";
 local CB                = LibStub:NewLibrary(CB_MAJOR, MAX_MINOR, true)
diff --git a/SVUI_!Core/system/_reports/dps.lua b/SVUI_!Core/system/_reports/dps.lua
index a9531e1..4e9f990 100644
--- a/SVUI_!Core/system/_reports/dps.lua
+++ b/SVUI_!Core/system/_reports/dps.lua
@@ -28,7 +28,7 @@ local L = SV.L
 local Reports = SV.Reports;
 --[[
 ##########################################################
-CALL TO ARMS STATS
+DPS STATS
 ##########################################################
 ]]--
 local REPORT_NAME = "DPS";
diff --git a/SVUI_!Core/system/_reports/hps.lua b/SVUI_!Core/system/_reports/hps.lua
index 120dd4a..8b2676e 100644
--- a/SVUI_!Core/system/_reports/hps.lua
+++ b/SVUI_!Core/system/_reports/hps.lua
@@ -29,99 +29,106 @@ local L = SV.L
 local Reports = SV.Reports;
 --[[
 ##########################################################
-CALL TO ARMS STATS
+HPS STATS
 ##########################################################
 ]]--
-local StatEvents = {'PLAYER_ENTERING_WORLD', 'COMBAT_LOG_EVENT_UNFILTERED', "PLAYER_LEAVE_COMBAT", 'PLAYER_REGEN_DISABLED', 'UNIT_PET'};
+local REPORT_NAME = "HPS";
+local HEX_COLOR = "22FFFF";
+local TEXT_PATTERN1 = "|cff%s%.1f|r";
+local TEXT_PATTERN2 = "%s |cff00CCFF%s|r";
+local PlayerEvents = {["SPELL_HEAL"] = true, ["SPELL_PERIODIC_HEAL"] = true};
+local playerID, petID = UnitGUID('player');

-local PlayerEvents = {["SPELL_HEAL"] = true, ["SPELL_PERIODIC_HEAL"] = true}
-local playerID = UnitGUID('player')
-local petID
-local healTotal, totalHeal, totalOverHeal, lastHealAmount = 0, 0, 0, 0
-local combatTime = 0
-local timeStamp = 0
-local lastSegment = 0
-local lastPanel
-local hexColor = "FFFFFF";
-local displayString = "|cff%s%.1f|r";
-local dpsString = "%s |cff00CCFF%s|r";
+local Report = Reports:NewReport(REPORT_NAME, {
+	type = "data source",
+	text = REPORT_NAME .. " Info",
+	icon = [[Interface\Addons\SVUI_!Core\assets\icons\SVUI]],
+});

-local join = string.join
-local max = math.max
+Report.events = {"PLAYER_ENTERING_WORLD", "COMBAT_LOG_EVENT_UNFILTERED", "PLAYER_LEAVE_COMBAT", "PLAYER_REGEN_DISABLED", "UNIT_PET"};

-local function Reset()
-	timeStamp = 0
-	combatTime = 0
-	healTotal = 0
-	totalHeal = 0
-	totalOverHeal = 0
-	lastHealAmount = 0
-end
+Report.OnInit = function(self)
+	playerID = UnitGUID('player')
+	petID = UnitGUID("pet")

-local function GetHPS(self)
-	if healTotal == 0 or combatTime == 0 then
-		self.text:SetText(dpsString:format(L["HPS"], "..PAUSED"))
-		self.TText = "No Healing Done"
-		self.TText2 = "Surely there is someone \nwith an ouchie somewhere!"
-	else
-		local HPS = (healTotal) / (combatTime)
-		self.text:SetFormattedText(displayString, hexColor, HPS)
-		self.TText = "HPS:"
-		self.TText2 = HPS
+	if(not self.InnerData) then
+		self.InnerData = {}
 	end
-end

-local function HPS_OnClick(self)
-	Reset()
-	GetHPS(self)
+	self.InnerData.thistime = 0
+	self.InnerData.lasttime = 0
+	self.InnerData.totaltime = 0
+	self.InnerData.lastamount = 0
+	self.InnerData.totalamount = 0
+	self.InnerData.overamount = 0
 end

-local function HPS_OnEnter(self)
-	Reports:SetDataTip(self)
-	Reports.ToolTip:AddDoubleLine("Healing Total:", totalHeal, 1, 1, 1)
-	Reports.ToolTip:AddDoubleLine("OverHealing Total:", totalOverHeal, 1, 1, 1)
-	Reports.ToolTip:AddLine(" ", 1, 1, 1)
-	Reports.ToolTip:AddDoubleLine(self.TText, self.TText2, 1, 1, 1)
-	Reports.ToolTip:AddLine(" ", 1, 1, 1)
-	Reports.ToolTip:AddDoubleLine("[Click]", "Clear HPS", 0,1,0, 0.5,1,0.5)
-	Reports:ShowDataTip(true)
-end
-
-local function HPS_OnEvent(self, event, ...)
-	lastPanel = self
-
+Report.OnEvent = function(self, event, ...)
+	local data = self.InnerData
 	if event == "PLAYER_ENTERING_WORLD" then
 		playerID = UnitGUID('player')
 	elseif event == 'PLAYER_REGEN_DISABLED' or event == "PLAYER_LEAVE_COMBAT" then
 		local now = time()
-		if now - lastSegment > 20 then --time since the last segment
-			Reset()
+		if now - data.lasttime > 20 then --time since the last segment
+			data.thistime = 0
+			data.totaltime = 0
+			data.totalamount = 0
+			data.lastamount = 0
+			data.overamount = 0
 		end
-		lastSegment = now
+		data.lasttime = now
 	elseif event == 'COMBAT_LOG_EVENT_UNFILTERED' then
 		local newTime, event, _, srcGUID, _, _, _, _, _, _, _, _, _, test, lastHealAmount, overHeal = ...
 		if not PlayerEvents[event] then return end
 		if(srcGUID == playerID or srcGUID == petID) then
-			if timeStamp == 0 then timeStamp = newTime end
-			lastSegment = timeStamp
-			combatTime = newTime - timeStamp
-			healTotal = healTotal + (lastHealAmount - overHeal)
-			totalHeal = totalHeal + lastHealAmount
-			totalOverHeal = totalOverHeal + overHeal
+			if data.thistime == 0 then data.thistime = newTime end
+			data.lasttime = data.thistime
+			data.totaltime = newTime - data.thistime
+			data.lastamount = data.lastamount + (lastHealAmount - overHeal)
+			data.totalamount = data.totalamount + data.lastamount
+			data.overamount = data.overamount + overHeal
 		end
 	elseif event == UNIT_PET then
-		petID = UnitGUID("pet")
+		data.petID = UnitGUID("pet")
 	end

-	GetHPS(self)
+	if data.totalamount == 0 or data.totaltime == 0 then
+		self.text:SetText(TEXT_PATTERN2:format(L["HPS"], "..PAUSED"))
+		self.TText = "No Healing Done"
+		self.TText2 = "Surely there is someone \nwith an ouchie somewhere!"
+	else
+		local HPS = (data.totalamount) / (data.totaltime)
+		self.text:SetFormattedText(TEXT_PATTERN1, HEX_COLOR, HPS)
+		self.TText = "HPS:"
+		self.TText2 = HPS
+	end
 end

-local HPSColorUpdate = function()
-	hexColor = SV:HexColor("highlight");
-	if lastPanel ~= nil then
-		HPS_OnEvent(lastPanel)
+Report.OnClick = function(self, button)
+	local data = self.InnerData
+	data.thistime = 0
+	data.totaltime = 0
+	data.totalamount = 0
+	data.lastamount = 0
+	if data.totalamount == 0 or data.totaltime == 0 then
+		self.text:SetText(TEXT_PATTERN2:format(L["HPS"], "..PAUSED"))
+		self.TText = "No Healing Done"
+		self.TText2 = "Surely there is someone \nwith an ouchie somewhere!"
+	else
+		local HPS = (data.totalamount) / (data.totaltime)
+		self.text:SetFormattedText(TEXT_PATTERN1, HEX_COLOR, HPS)
+		self.TText = "HPS:"
+		self.TText2 = HPS
 	end
 end

-SV.Events:On("SHARED_MEDIA_UPDATED", HPSColorUpdate, true)
-Reports:NewReportType('HPS', StatEvents, HPS_OnEvent, nil, HPS_OnClick, HPS_OnEnter)
\ No newline at end of file
+Report.OnEnter = function(self)
+	Reports:SetDataTip(self)
+	Reports.ToolTip:AddDoubleLine("Healing Total:", self.InnerData.totalamount, 1, 1, 1)
+	Reports.ToolTip:AddDoubleLine("OverHealing Total:", self.InnerData.overamount, 1, 1, 1)
+	Reports.ToolTip:AddLine(" ", 1, 1, 1)
+	Reports.ToolTip:AddDoubleLine(self.TText, self.TText2, 1, 1, 1)
+	Reports.ToolTip:AddLine(" ", 1, 1, 1)
+	Reports.ToolTip:AddDoubleLine("[Click]", "Clear HPS", 0,1,0, 0.5,1,0.5)
+	Reports:ShowDataTip(true)
+end
\ No newline at end of file
diff --git a/SVUI_!Core/system/_reports/reputation.lua b/SVUI_!Core/system/_reports/reputation.lua
index db8b39d..9e783c5 100644
--- a/SVUI_!Core/system/_reports/reputation.lua
+++ b/SVUI_!Core/system/_reports/reputation.lua
@@ -30,8 +30,8 @@ local Reports = SV.Reports;
 REPUTATION STATS
 ##########################################################
 ]]--
-local StatEvents = {"PLAYER_ENTERING_WORLD", "UPDATE_FACTION"};
-local RepMenuList = {};
+local HEX_COLOR = "22FFFF";
+local TEXT_PATTERN = "|cff22EF5F%s|r|cff888888 - [|r%d%%|cff888888]|r";
 local standingName = {
 	[1] = "Hated",
 	[2] = "Hostile",
@@ -55,8 +55,8 @@ local function TruncateString(value)
     end
 end
 -- name, description, standingID, barMin, barMax, barValue, _, _, _, _, hasRep, isWatched, isChild
-local function CacheRepData()
-	twipe(RepMenuList)
+local function CacheRepData(data)
+	twipe(data)
 	for factionIndex = 1, GetNumFactions() do
 		local factionName, description, standingID, barMin, barMax, barValue, _, _, _, _, hasRep, isWatched, isChild = GetFactionInfo(factionIndex)
 		if(standingID) then
@@ -66,13 +66,26 @@ local function CacheRepData()
 					SetWatchedFactionIndex(factionIndex)
 				end
 			end
-			tinsert(RepMenuList, {text = factionName, func = fn})
+			tinsert(data, {text = factionName, func = fn})
 		end
 	end
-	tsort(RepMenuList, function(a,b) return a.text < b.text end)
+	tsort(data, function(a,b) return a.text < b.text end)
 end
+--[[
+##########################################################
+STANDARD TYPE
+##########################################################
+]]--
+local REPORT_NAME = "Reputation";
+local Report = Reports:NewReport(REPORT_NAME, {
+	type = "data source",
+	text = REPORT_NAME .. " Info",
+	icon = [[Interface\Addons\SVUI_!Core\assets\icons\SVUI]]
+});
+
+Report.events = {"PLAYER_ENTERING_WORLD", "UPDATE_FACTION"};

-local function Reputation_OnEvent(self, ...)
+Report.OnEvent = function(self, event, ...)
 	if self.barframe:IsShown()then
 		self.text:SetAllPoints(self)
 		self.text:SetJustifyH("CENTER")
@@ -99,11 +112,53 @@ local function Reputation_OnEvent(self, ...)
 			end
 		end
 		friendText = friendText or _G["FACTION_STANDING_LABEL"..ID] or " ";
-		self.text:SetFormattedText("|cff22EF5F%s|r|cff888888 - [|r%d%%|cff888888]|r", friendText, ((value - min) / (max - min) * 100))
+		self.text:SetFormattedText(TEXT_PATTERN , friendText, ((value - min) / (max - min) * 100))
+	end
+end
+
+Report.OnClick = function(self, button)
+	CacheRepData(self.InnerData)
+	SV.Dropdown:Open(self, self.InnerData, "Select Faction")
+end
+
+Report.OnEnter = function(self)
+	Reports:SetDataTip(self)
+	local name, reaction, min, max, value, factionID = GetWatchedFactionInfo()
+	local friendID, _, _, _, _, _, friendTextLevel = GetFriendshipReputation(factionID);
+	if not name then
+		Reports.ToolTip:AddLine("No Watched Factions")
+	else
+		Reports.ToolTip:AddLine(name)
+		Reports.ToolTip:AddLine(' ')
+		Reports.ToolTip:AddDoubleLine(STANDING..':', friendID and friendTextLevel or _G['FACTION_STANDING_LABEL'..reaction], 1, 1, 1)
+		Reports.ToolTip:AddDoubleLine(REPUTATION..':', format('%d / %d (%d%%)', value - min, max - min, (value - min) / (max - min) * 100), 1, 1, 1)
 	end
-end
+	Reports.ToolTip:AddLine(" ", 1, 1, 1)
+	Reports.ToolTip:AddDoubleLine("[Click]", "Change Watched Faction", 0,1,0, 0.5,1,0.5)
+	Reports:ShowDataTip(true)
+end
+
+Report.OnInit = function(self)
+	if(not self.InnerData) then
+		self.InnerData = {}
+	end
+	CacheRepData(self.InnerData)
+end
+--[[
+##########################################################
+BAR TYPE
+##########################################################
+]]--
+local BAR_NAME = "Reputation Bar";
+local ReportBar = Reports:NewReport(BAR_NAME, {
+	type = "data source",
+	text = BAR_NAME,
+	icon = [[Interface\Addons\SVUI_!Core\assets\icons\SVUI]]
+});
+
+ReportBar.events = {"PLAYER_ENTERING_WORLD", "UPDATE_FACTION"};

-local function ReputationBar_OnEvent(self, ...)
+ReportBar.OnEvent = function(self, event, ...)
 	if not self.barframe:IsShown()then
 		self.barframe:Show()
 		self.barframe.icon.texture:SetTexture(SV.media.dock.reputationLabel)
@@ -137,9 +192,14 @@ local function ReputationBar_OnEvent(self, ...)
 		bar:SetValue(value)
 		self.text:SetText(txt)
 	end
-end
+end

-local function Reputation_OnEnter(self)
+Report.OnClick = function(self, button)
+	CacheRepData()
+	SV.Dropdown:Open(self, self.InnerData, "Select Faction")
+end
+
+ReportBar.OnEnter = function(self)
 	Reports:SetDataTip(self)
 	local name, reaction, min, max, value, factionID = GetWatchedFactionInfo()
 	local friendID, _, _, _, _, _, friendTextLevel = GetFriendshipReputation(factionID);
@@ -154,16 +214,11 @@ local function Reputation_OnEnter(self)
 	Reports.ToolTip:AddLine(" ", 1, 1, 1)
 	Reports.ToolTip:AddDoubleLine("[Click]", "Change Watched Faction", 0,1,0, 0.5,1,0.5)
 	Reports:ShowDataTip(true)
-end
-
-local function Reputation_OnClick(self, button)
-	CacheRepData()
-	SV.Dropdown:Open(self, RepMenuList, "Select Faction")
-end
-
-local function Reputation_OnInit(self)
-	CacheRepData()
 end

-Reports:NewReportType("Reputation", StatEvents, Reputation_OnEvent, nil, Reputation_OnClick, Reputation_OnEnter, nil, Reputation_OnInit)
-Reports:NewReportType("Reputation Bar", StatEvents, ReputationBar_OnEvent, nil, Reputation_OnClick, Reputation_OnEnter, nil, Reputation_OnInit)
\ No newline at end of file
+Report.OnInit = function(self)
+	if(not self.InnerData) then
+		self.InnerData = {}
+	end
+	CacheRepData()
+end
\ No newline at end of file
diff --git a/SVUI_!Core/system/_reports/template.lua b/SVUI_!Core/system/_reports/template.lua
index 6b24d4b..98c7563 100644
--- a/SVUI_!Core/system/_reports/template.lua
+++ b/SVUI_!Core/system/_reports/template.lua
@@ -48,7 +48,11 @@ REPORT TEMPLATE
 local REPORT_NAME = "";
 local HEX_COLOR = "22FFFF";
 local TEXT_PATTERN = "|cff%s%s|r";
-
+--SV.media.color.green
+--SV.media.color.normal
+--r, g, b = 0.8, 0.8, 0.8
+--local c = SV.media.color.green
+--r, g, b = c[1], c[2], c[3]
 local Report = Reports:NewReport(REPORT_NAME, {
 	type = "data source",
 	text = REPORT_NAME .. " Info",
diff --git a/SVUI_!Core/system/_reports/time.lua b/SVUI_!Core/system/_reports/time.lua
index 481c8a4..35f9031 100644
--- a/SVUI_!Core/system/_reports/time.lua
+++ b/SVUI_!Core/system/_reports/time.lua
@@ -52,8 +52,8 @@ TIME STATS (Credit: Elv)
 ##########################################################
 ]]--
 local APM = { TIMEMANAGER_PM, TIMEMANAGER_AM }
-local europeDisplayFormat = '';
-local ukDisplayFormat = '';
+local TEXT_PATTERN1 = "%02d|cff22CFFF:|r%02d";
+local TEXT_PATTERN2 = "%d|cff22CFFF:|r%02d|cff22CFFF %s|r";
 local europeDisplayFormat_nocolor = join("", "%02d", ":|r%02d")
 local ukDisplayFormat_nocolor = join("", "", "%d", ":|r%02d", " %s|r")
 local timerLongFormat = "%d:%02d:%02d"
@@ -61,25 +61,12 @@ local timerShortFormat = "%d:%02d"
 local lockoutInfoFormat = "%s%s |cffaaaaaa(%s, %s/%s)"
 local lockoutInfoFormatNoEnc = "%s%s |cffaaaaaa(%s)"
 local formatBattleGroundInfo = "%s: "
-local lockoutColorExtended, lockoutColorNormal = { r=0.3,g=1,b=0.3 }, { r=.8,g=.8,b=.8 }
-local lockoutFormatString = { "%dd %02dh %02dm", "%dd %dh %02dm", "%02dh %02dm", "%dh %02dm", "%dh %02dm", "%dm" }
 local curHr, curMin, curAmPm
 local enteredFrame = false;
 local date = _G.date
-
-local Update, lastPanel; -- UpValue
 local localizedName, isActive, canQueue, startTime, canEnter, _
 local name, instanceID, reset, difficultyId, locked, extended, isRaid, maxPlayers, difficulty, numEncounters, encounterProgress

-local function ValueColorUpdate(hex, r, g, b)
-	europeDisplayFormat = join("", "%02d", hex, ":|r%02d")
-	ukDisplayFormat = join("", "", "%d", hex, ":|r%02d", hex, " %s|r")
-
-	if lastPanel ~= nil then
-		Update(lastPanel, 20000)
-	end
-end
-
 local function ConvertTime(h, m)
 	local AmPm
 	if SV.db.Reports.time24 == true then
@@ -105,22 +92,68 @@ local function CalculateTimeValues(tooltip)
 	end
 end

-local function Click()
-	GameTimeFrame:Click();
-end
+local int = 3
+local Time_OnUpdate = function(self, t)
+	int = int - t
+
+	if int > 0 then return end
+
+	if GameTimeFrame.flashInvite then
+		SV.Animate:Flash(self, 0.53)
+	else
+		SV.Animate:StopFlash(self)
+	end

-local function OnLeave(self)
-	Reports.ToolTip:Hide();
-	enteredFrame = false;
+	if enteredFrame then
+		OnEnter(self)
+	end
+
+	local Hr, Min, AmPm = CalculateTimeValues(false)
+
+	-- no update quick exit
+	if (Hr == curHr and Min == curMin and AmPm == curAmPm) and not (int < -15000) then
+		int = 5
+		return
+	end
+
+	curHr = Hr
+	curMin = Min
+	curAmPm = AmPm
+
+	if AmPm == -1 then
+		self.text:SetFormattedText(TEXT_PATTERN1, Hr, Min)
+	else
+		self.text:SetFormattedText(TEXT_PATTERN2, Hr, Min, APM[AmPm])
+	end
+	int = 5
 end
+--[[
+##########################################################
+REPORT TEMPLATE
+##########################################################
+]]--
+local REPORT_NAME = "Time";
+local HEX_COLOR = "22FFFF";
+
+local Report = Reports:NewReport(REPORT_NAME, {
+	type = "data source",
+	text = REPORT_NAME .. " Info",
+	icon = [[Interface\Addons\SVUI_!Core\assets\icons\SVUI]]
+});
+
+Report.events = {"UPDATE_INSTANCE_INFO"};

-local function OnEvent(self, event)
+Report.OnEvent = function(self, event, ...)
 	if event == "UPDATE_INSTANCE_INFO" and enteredFrame then
 		RequestRaidInfo()
 	end
 end

-local function OnEnter(self)
+Report.OnClick = function(self, button)
+	GameTimeFrame:Click();
+end
+
+Report.OnEnter = function(self)
 	Reports:SetDataTip(self)

 	if(not enteredFrame) then
@@ -139,11 +172,12 @@ local function OnEnter(self)
 			else
 				startTime = SecondsToTime(startTime, false, nil, 3)
 			end
-			Reports.ToolTip:AddDoubleLine(format(formatBattleGroundInfo, localizedName), startTime, 1, 1, 1, lockoutColorNormal.r, lockoutColorNormal.g, lockoutColorNormal.b)
+			Reports.ToolTip:AddDoubleLine(format(formatBattleGroundInfo, localizedName), startTime, 1, 1, 1, 0.8, 0.8, 0.8)
 		end
 	end

-	local oneraid, lockoutColor
+	local oneraid;
+	local r, g, b = 0.8, 0.8, 0.8
 	for i = 1, GetNumSavedInstances() do
 		name, _, reset, difficultyId, locked, extended, _, isRaid, maxPlayers, difficulty, numEncounters, encounterProgress  = GetSavedInstanceInfo(i)
 		if isRaid and (locked or extended) and name then
@@ -153,11 +187,11 @@ local function OnEnter(self)
 				oneraid = true
 			end
 			if extended then
-				lockoutColor = lockoutColorExtended
+				local c = SV.media.color.green
+				r, g, b = c[1], c[2], c[3]
 			else
-				lockoutColor = lockoutColorNormal
-			end
-
+				r, g, b = 0.8, 0.8, 0.8
+			end
 			local _, _, isHeroic, _ = GetDifficultyInfo(difficultyId)
 			if (numEncounters and numEncounters > 0) and (encounterProgress and encounterProgress > 0) then
 				Reports.ToolTip:AddDoubleLine(format(lockoutInfoFormat, maxPlayers, (isHeroic and "H" or "N"), name, encounterProgress, numEncounters), SecondsToTime(reset, false, nil, 3), 1, 1, 1, lockoutColor.r, lockoutColor.g, lockoutColor.b)
@@ -186,61 +220,18 @@ local function OnEnter(self)
 	Reports.ToolTip:AddLine(" ")
 	if AmPm == -1 then
 		Reports.ToolTip:AddDoubleLine(SV.db.Reports.localtime and TIMEMANAGER_TOOLTIP_REALMTIME or TIMEMANAGER_TOOLTIP_LOCALTIME,
-			format(europeDisplayFormat_nocolor, Hr, Min), 1, 1, 1, lockoutColorNormal.r, lockoutColorNormal.g, lockoutColorNormal.b)
+			format(europeDisplayFormat_nocolor, Hr, Min), 1, 1, 1, 0.8, 0.8, 0.8)
 	else
 		Reports.ToolTip:AddDoubleLine(SV.db.Reports.localtime and TIMEMANAGER_TOOLTIP_REALMTIME or TIMEMANAGER_TOOLTIP_LOCALTIME,
-			format(ukDisplayFormat_nocolor, Hr, Min, APM[AmPm]), 1, 1, 1, lockoutColorNormal.r, lockoutColorNormal.g, lockoutColorNormal.b)
+			format(ukDisplayFormat_nocolor, Hr, Min, APM[AmPm]), 1, 1, 1, 0.8, 0.8, 0.8)
 	end

 	Reports.ToolTip:Show()
 end

-local int = 3
-function Update(self, t)
-	int = int - t
-
-	if int > 0 then return end
-
-	if GameTimeFrame.flashInvite then
-		SV.Animate:Flash(self, 0.53)
-	else
-		SV.Animate:StopFlash(self)
-	end
-
-	if enteredFrame then
-		OnEnter(self)
-	end
-
-	local Hr, Min, AmPm = CalculateTimeValues(false)
-
-	-- no update quick exit
-	if (Hr == curHr and Min == curMin and AmPm == curAmPm) and not (int < -15000) then
-		int = 5
-		return
-	end
-
-	curHr = Hr
-	curMin = Min
-	curAmPm = AmPm
-
-	if AmPm == -1 then
-		self.text:SetFormattedText(europeDisplayFormat, Hr, Min)
-	else
-		self.text:SetFormattedText(ukDisplayFormat, Hr, Min, APM[AmPm])
-	end
-	lastPanel = self
-	int = 5
+Report.OnLeave = function(self, button)
+	Reports.ToolTip:Hide();
+	enteredFrame = false;
 end

-local TimeColorUpdate = function()
-	local hexColor = SV:HexColor("highlight")
-	europeDisplayFormat = join("", "%02d|cff", hexColor, ":|r%02d")
-	ukDisplayFormat = join("", "", "%d|cff", hexColor, ":|r%02d|cff", hexColor, " %s|r")
-	if lastPanel ~= nil then
-		Update(lastPanel, 20000)
-	end
-end
-
-SV.Events:On("SHARED_MEDIA_UPDATED", TimeColorUpdate, true)
-
-Reports:NewReportType('Time', {"UPDATE_INSTANCE_INFO"}, OnEvent, Update, Click, OnEnter, OnLeave)
\ No newline at end of file
+Report.OnUpdate = Time_OnUpdate
\ No newline at end of file
diff --git a/SVUI_!Core/system/_reports/tokens.lua b/SVUI_!Core/system/_reports/tokens.lua
index ceee566..87692d5 100644
--- a/SVUI_!Core/system/_reports/tokens.lua
+++ b/SVUI_!Core/system/_reports/tokens.lua
@@ -32,64 +32,33 @@ local Reports = SV.Reports;
 GOLD STATS
 ##########################################################
 ]]--
+local REPORT_NAME = "Tokens";
+local HEX_COLOR = "22FFFF";
+local TEXT_PATTERN = "\124T%s:12\124t %s";
 local playerName = UnitName("player");
 local playerRealm = GetRealmName();

-local TokenEvents = {'PLAYER_ENTERING_WORLD','PLAYER_MONEY','CURRENCY_DISPLAY_UPDATE'};
-
-local function TokenInquiry(id, weekly, capped)
-  local name, amount, tex, week, weekmax, maxed, discovered = GetCurrencyInfo(id)
-  local r, g, b = 1, 1, 1
-  for i = 1, GetNumWatchedTokens() do
-    local _, _, _, itemID = GetBackpackCurrencyInfo(i)
-    if id == itemID then r, g, b = 0.23, 0.88, 0.27 end
-  end
-  local texStr = ("\124T%s:12\124t %s"):format(tex, name)
-  local altStr = ""
-  if weekly then
-    if discovered then
-      if id == 390 then
-        altStr = ("Current: %d | Weekly: %d / %d"):format(amount, week, weekmax)
-      else
-        altStr = ("Current: %d / %d | Weekly: %d / %d"):format(amount, maxed, week, weekmax)
-      end
-      Reports.ToolTip:AddDoubleLine(texStr, altStr, r, g, b, r, g, b)
-    end
-  elseif capped then
-    if id == 392 or id == 395 then maxed = 4000 end
-    if id == 396 then maxed = 3000 end
-    if discovered then
-      altStr = ("%d / %d"):format(amount, maxed)
-      Reports.ToolTip:AddDoubleLine(texStr, altStr, r, g, b, r, g, b)
-    end
-  else
-    if discovered then
-      Reports.ToolTip:AddDoubleLine(texStr, amount, r, g, b, r, g, b)
-    end
-  end
-end
-
-local function TokensEventHandler(self, event,...)
+local Tokens_OnEvent = function(self, event, ...)
     if(not IsLoggedIn() or (not self)) then return end
     local id = self.TokenKey or 738;
     local _, current, tex = GetCurrencyInfo(id)
-    local currentText = ("\124T%s:12\124t %s"):format(tex, current);
+    local currentText = TEXT_PATTERN:format(tex, current);
     self.text:SetText(currentText)
-end
-
-local function AddToTokenMenu(parent, id, key)
-	local name, _, tex, _, _, _, _ = GetCurrencyInfo(id)
-	local itemName = "\124T"..tex..":12\124t "..name;
-	local fn = function()
-		Reports.Accountant["tokens"][playerName][key] = id;
-    parent.TokenKey = id
-		TokensEventHandler(parent)
-	end
-	tinsert(parent.TokenList, {text = itemName, func = fn});
+end
+
+local function AddToTokenMenu(self, id, key)
+  local name, _, tex, _, _, _, _ = GetCurrencyInfo(id)
+  local itemName = "\124T"..tex..":12\124t "..name;
+  local fn = function()
+    Reports.Accountant["tokens"][playerName][key] = id;
+    self.TokenKey = id
+    Tokens_OnEvent(self)
+  end
+  tinsert(self.InnerData, {text = itemName, func = fn});
 end

 local function CacheTokenData(self)
-    twipe(self.TokenList);
+    twipe(self.InnerData);
     local prof1, prof2, archaeology, _, cooking = GetProfessions();
     local key = self:GetName();
     if archaeology then
@@ -143,18 +112,69 @@ local function CacheTokenData(self)
     AddToTokenMenu(self, 824, key)
 end

-local function Tokens_OnEnter(self)
-	Reports:SetDataTip(self)
-	Reports.ToolTip:AddLine(playerName .. "\'s Tokens")
+local function TokenInquiry(id, weekly, capped)
+  local name, amount, tex, week, weekmax, maxed, discovered = GetCurrencyInfo(id)
+  local r, g, b = 1, 1, 1
+  for i = 1, GetNumWatchedTokens() do
+    local _, _, _, itemID = GetBackpackCurrencyInfo(i)
+    if id == itemID then r, g, b = 0.23, 0.88, 0.27 end
+  end
+  local texStr = ("\124T%s:12\124t %s"):format(tex, name)
+  local altStr = ""
+  if weekly then
+    if discovered then
+      if id == 390 then
+        altStr = ("Current: %d | Weekly: %d / %d"):format(amount, week, weekmax)
+      else
+        altStr = ("Current: %d / %d | Weekly: %d / %d"):format(amount, maxed, week, weekmax)
+      end
+      Reports.ToolTip:AddDoubleLine(texStr, altStr, r, g, b, r, g, b)
+    end
+  elseif capped then
+    if id == 392 or id == 395 then maxed = 4000 end
+    if id == 396 then maxed = 3000 end
+    if discovered then
+      altStr = ("%d / %d"):format(amount, maxed)
+      Reports.ToolTip:AddDoubleLine(texStr, altStr, r, g, b, r, g, b)
+    end
+  else
+    if discovered then
+      Reports.ToolTip:AddDoubleLine(texStr, amount, r, g, b, r, g, b)
+    end
+  end
+end
+--[[
+##########################################################
+REPORT TEMPLATE
+##########################################################
+]]--
+local Report = Reports:NewReport(REPORT_NAME, {
+  type = "data source",
+  text = REPORT_NAME .. " Info",
+  icon = [[Interface\Addons\SVUI_!Core\assets\icons\SVUI]]
+});
+
+Report.events = {"PLAYER_ENTERING_WORLD", "PLAYER_MONEY", "CURRENCY_DISPLAY_UPDATE"};

-	Reports.ToolTip:AddLine(" ")
-	Reports.ToolTip:AddLine("Common")
-	TokenInquiry(241)
-	TokenInquiry(416)
-	TokenInquiry(515)
-	TokenInquiry(776)
-	TokenInquiry(777)
-	TokenInquiry(789)
+Report.OnEvent = Tokens_OnEvent;
+
+Report.OnClick = function(self, button)
+  CacheTokenData(self);
+  SV.Dropdown:Open(self, self.InnerData, "Select Currency")
+end
+
+Report.OnEnter = function(self)
+  Reports:SetDataTip(self)
+  Reports.ToolTip:AddLine(playerName .. "\'s Tokens")
+
+  Reports.ToolTip:AddLine(" ")
+  Reports.ToolTip:AddLine("Common")
+  TokenInquiry(241)
+  TokenInquiry(416)
+  TokenInquiry(515)
+  TokenInquiry(776)
+  TokenInquiry(777)
+  TokenInquiry(789)

   Reports.ToolTip:AddLine(" ")
   Reports.ToolTip:AddLine("Garrison")
@@ -166,68 +186,64 @@ local function Tokens_OnEnter(self)
   TokenInquiry(1008)
   TokenInquiry(1017)

-	Reports.ToolTip:AddLine(" ")
-	Reports.ToolTip:AddLine("Raiding and Dungeons")
+  Reports.ToolTip:AddLine(" ")
+  Reports.ToolTip:AddLine("Raiding and Dungeons")
   TokenInquiry(994, false, true)
-	TokenInquiry(697, false, true)
-	TokenInquiry(738)
-	TokenInquiry(615)
-	TokenInquiry(614)
-	TokenInquiry(395, false, true)
-	TokenInquiry(396, false, true)
-
-	Reports.ToolTip:AddLine(" ")
-	Reports.ToolTip:AddLine("PvP")
-	TokenInquiry(390, true)
-	TokenInquiry(392, false, true)
-	TokenInquiry(391)
-
-	local prof1, prof2, archaeology, _, cooking = GetProfessions()
-	if(archaeology or cooking or prof1 == 9 or prof2 == 9) then
-		Reports.ToolTip:AddLine(" ")
-		Reports.ToolTip:AddLine("Professions")
-	end
-	if cooking then
-		TokenInquiry(81)
-		TokenInquiry(402)
-	end
-	if(prof1 == 9 or prof2 == 9) then
-		TokenInquiry(61)
-		TokenInquiry(361)
-		TokenInquiry(698)
-	end
-	if archaeology then
+  TokenInquiry(697, false, true)
+  TokenInquiry(738)
+  TokenInquiry(615)
+  TokenInquiry(614)
+  TokenInquiry(395, false, true)
+  TokenInquiry(396, false, true)
+
+  Reports.ToolTip:AddLine(" ")
+  Reports.ToolTip:AddLine("PvP")
+  TokenInquiry(390, true)
+  TokenInquiry(392, false, true)
+  TokenInquiry(391)
+
+  local prof1, prof2, archaeology, _, cooking = GetProfessions()
+  if(archaeology or cooking or prof1 == 9 or prof2 == 9) then
+    Reports.ToolTip:AddLine(" ")
+    Reports.ToolTip:AddLine("Professions")
+  end
+  if cooking then
+    TokenInquiry(81)
+    TokenInquiry(402)
+  end
+  if(prof1 == 9 or prof2 == 9) then
+    TokenInquiry(61)
+    TokenInquiry(361)
+    TokenInquiry(698)
+  end
+  if archaeology then
     TokenInquiry(821)
     TokenInquiry(829)
     TokenInquiry(944)
-		TokenInquiry(398)
-		TokenInquiry(384)
-		TokenInquiry(393)
-		TokenInquiry(677)
-		TokenInquiry(400)
-		TokenInquiry(394)
-		TokenInquiry(397)
-		TokenInquiry(676)
-		TokenInquiry(401)
-		TokenInquiry(385)
-		TokenInquiry(399)
-	end
-	Reports.ToolTip:AddLine(" ")
+    TokenInquiry(398)
+    TokenInquiry(384)
+    TokenInquiry(393)
+    TokenInquiry(677)
+    TokenInquiry(400)
+    TokenInquiry(394)
+    TokenInquiry(397)
+    TokenInquiry(676)
+    TokenInquiry(401)
+    TokenInquiry(385)
+    TokenInquiry(399)
+  end
+  Reports.ToolTip:AddLine(" ")
   Reports.ToolTip:AddDoubleLine("[Shift + Click]", "Change Watched Token", 0,1,0, 0.5,1,0.5)
-	Reports:ShowDataTip(true)
-end
-
-local function Tokens_OnClick(self, button)
-  CacheTokenData(self);
-	SV.Dropdown:Open(self, self.TokenList, "Select Currency")
+  Reports:ShowDataTip(true)
 end

-local function Tokens_OnInit(self)
+Report.OnInit = function(self)
+  if(not self.InnerData) then
+    self.InnerData = {}
+  end
   Reports:SetAccountantData('tokens', 'table', {})
   local key = self:GetName()
   Reports.Accountant["tokens"][playerName][key] = Reports.Accountant["tokens"][playerName][key] or 738;
   self.TokenKey = Reports.Accountant["tokens"][playerName][key]
   CacheTokenData(self);
-end
-
-Reports:NewReportType('Tokens', TokenEvents, TokensEventHandler, nil,  Tokens_OnClick,  Tokens_OnEnter, nil, Tokens_OnInit)
\ No newline at end of file
+end
\ No newline at end of file
diff --git a/SVUI_!Core/system/reports.lua b/SVUI_!Core/system/reports.lua
index bd1b174..faa938c 100644
--- a/SVUI_!Core/system/reports.lua
+++ b/SVUI_!Core/system/reports.lua
@@ -284,37 +284,66 @@ local function GetDataSlot(parent, index)
 	return parent.Stats.Slots[index];
 end

-function MOD:NewReportType(newStat, eventList, onEvents, update, click, focus, blur, init)
-	if not newStat then return end
-	self.Plugins[newStat] = {}
-	tinsert(StatMenuListing, newStat)
-	if type(eventList) == "table" then
-		self.Plugins[newStat]["events"] = eventList;
-		self.Plugins[newStat]["event_handler"] = onEvents
-	end
-	if update and type(update) == "function" then
-		self.Plugins[newStat]["update_handler"] = update
-	end
-	if click and type(click) == "function" then
-		self.Plugins[newStat]["click_handler"] = click
-	end
-	if focus and type(focus) == "function" then
-		self.Plugins[newStat]["focus_handler"] = focus
-	end
-	if blur and type(blur) == "function" then
-		self.Plugins[newStat]["blur_handler"] = blur
-	end
-	if init and type(init) == "function" then
-		self.Plugins[newStat].OnInit = init
-	end
+local LDB_TEXT_PATTERN = "|cff22CFFF(|r%s|cff22CFFF)|r";
+local LDB_ICON_PATTERN = "\124T%s:12\124t %s";
+local function LDB_AttributeChanged(event, data_name, key, value, obj)
+	local name = obj.ReportName
+	local socket = MOD.References[name]
+	if(not socket) then return end
+	value = value or obj.text
+	icon = obj.icon
+	if(type(value) ~= "string") then
+		value = name
+	end
+	if(not value or value == name) then
+		local prev = socket.text:GetText()
+		if((not prev) or (not prev:find(name)) or (prev == "")) then
+			socket.text:SetText(name)
+		end
+	elseif(icon and type(icon) == "string") then
+		socket.text:SetText(LDB_ICON_PATTERN:format(icon, value))
+	else
+		socket.text:SetText(LDB_TEXT_PATTERN:format(value))
+	end
 end

-local Socket_OnLeave = function(self)
+local function CreateLDB_OnEventHandler(name, obj)
+	return function(self, ...)
+		LDB:RegisterCallback("LibDataBroker_AttributeChanged_"..name, LDB_AttributeChanged)
+		-- LDB:RegisterCallback("LibDataBroker_AttributeChanged_"..name.."_text", LDB_AttributeChanged)
+		-- LDB:RegisterCallback("LibDataBroker_AttributeChanged_"..name.."_label", LDB_AttributeChanged)
+		-- LDB:RegisterCallback("LibDataBroker_AttributeChanged_"..name.."_value", LDB_AttributeChanged)
+		LDB_AttributeChanged(nil, name, nil, nil, obj)
+	end
+end
+
+local Socket_OnEvent = function(self, ...)
+	if(self.eventFunc) then
+		self.eventFunc(self, ...)
+	end
+end
+
+local Socket_OnUpdate = function(self, ...)
+	if(self.updateFunc) then
+		self.updateFunc(self, ...)
+	end
+end
+
+local LDB_OnEnter = function(self, ...)
+	self.OnTooltipShow(GameTooltip)
+end
+
+local Socket_OnEnter = function(self, ...)
+	if(self.enterFunc) then
+		self.enterFunc(self, ...)
+	end
+end
+
+local Socket_OnLeave = function(self, ...)
 	if(self.leaveFunc) then
-		self.leaveFunc(self)
-	else
-		MOD.ToolTip:Hide()
+		self.leaveFunc(self, ...)
 	end
+	MOD.ToolTip:Hide()
 end

 local Socket_OnClick = function(self, button)
@@ -337,30 +366,32 @@ function MOD:EnableReport(socket, name)
 		obj.OnInit(socket)
 	end

-	if obj.events then
-		for i=1, #obj.events do
-			socket:RegisterEvent(obj.events[i])
-		end
-	end
-
 	if obj.OnEvent and obj.events then
 		for i=1, #obj.events do
 			socket:RegisterEvent(obj.events[i])
 		end
-		socket:SetScript("OnEvent", obj.OnEvent)
-		obj.OnEvent(socket, "SVUI_FORCE_RUN")
-	end
+		socket.eventFunc = obj.OnEvent
+		socket:SetScript("OnEvent", Socket_OnEvent)
+		Socket_OnEvent(socket, "SVUI_FORCE_RUN")
+	end

 	if obj.OnUpdate then
-		socket:SetScript("OnUpdate", obj.OnUpdate)
-		obj.OnUpdate(socket, 20000)
+		socket.updateFunc = obj.OnUpdate
 	end
+	socket:SetScript("OnUpdate", Socket_OnUpdate)
+	Socket_OnUpdate(socket, 20000)

-	if obj.OnEnter then
-		socket:SetScript("OnEnter", obj.OnEnter)
-	end
+	if(LDB and obj.LDBName and obj.OnTooltipShow) then
+		print(name .. ' OnTooltipShow')
+		socket:SetScript("OnEnter", LDB_OnEnter)
+	end
+
+	if obj.OnEnter then
+		socket.enterFunc = obj.OnEnter
+	end
+	socket:SetScript("OnEnter", Socket_OnEnter)

-	if obj.OnLeave then
+	if obj.OnLeave then
 		socket.leaveFunc = obj.OnLeave
 	end
 	socket:SetScript("OnLeave", Socket_OnLeave)
@@ -377,11 +408,20 @@ function MOD:EnableReport(socket, name)
 	else
 		socket.Panel:Show()
 	end
+
+	if(LDB and obj.LDBName) then
+		LDB:RegisterCallback("LibDataBroker_AttributeChanged_"..obj.LDBName, LDB_AttributeChanged)
+		LDB_AttributeChanged(nil, name, nil, nil, obj)
+	end
 end

-function MOD:NewReport(name, obj)
+function MOD:NewReport(name, obj, LDBname)
 	if self.Plugins[name] then return end
 	self.Plugins[name] = obj or {}
+	if(LDBname) then
+		self.Plugins[name].LDBName = LDBname
+		self.Plugins[name].ReportName = name
+	end
 	tinsert(StatMenuListing, name)
 	return obj
 end
@@ -458,9 +498,7 @@ do
 	local function setMenuLists()
 		local anchorTable = MOD.Sockets;
 		local statMenu = StatMenuListing;
-
 		tsort(statMenu)
-
 		for reportIndex, parent in ipairs(anchorTable) do
 			local slotKey = tostring(reportIndex)
 			local slots = parent.Stats.Slots;
@@ -478,6 +516,14 @@ do
 	end

 	function MOD:UpdateAllReports()
+		if(LDB) then
+			for dataName, dataObj in LDB:DataObjectIterator() do
+				local listName = dataName:gsub("Broker_", "");
+				if(not MOD.Plugins[listName]) then
+		  			MOD:ReportAdded(nil, dataName, dataObj, true)
+		  		end
+		  	end
+		end
 		if(DIRTY_LIST) then setMenuLists() end

 		local instance, groupType = IsInInstance()
@@ -492,17 +538,16 @@ do
 				local numPoints = #slots;
 				local pvpIndex = parent.Stats.BGStats;
 				local pvpSwitch = (allowPvP and pvpIndex and (PVP_SOCKETS[pvpIndex] == reportIndex))
-				local panelIndex = tostring(reportIndex)
+
 				for i = 1, numPoints do
 					local pvpTable = (pvpSwitch and PVP_INFO_SORTING[pvpIndex]) and PVP_INFO_SORTING[pvpIndex][i]
-					local socket = sockets[i];
+					local socket = slots[i];

 					socket:UnregisterAllEvents()
 					socket:SetScript("OnUpdate", nil)
 					socket:SetScript("OnEnter", nil)
 					socket:SetScript("OnLeave", nil)
 					socket:SetScript("OnClick", nil)
-					socket.text:SetText(nil)

 					if socket.barframe then
 						socket.barframe:Hide()
@@ -522,18 +567,21 @@ do
 						BG_OnUpdate(socket)

 						socket:Show()
-					else
-						for name, config in pairs(reportTable) do
-							for socketKey, panelData in pairs(docks) do
-								if(panelData and type(panelData) == "table") then
-									if(panelIndex == socketKey and panelData[i] and panelData[i] == name) then
-										MOD:EnableReport(socket, name)
-									end
-								elseif(panelData and type(panelData) == "string" and panelData == name) then
-									MOD:EnableReport(socket, name)
+					else
+						local loaded = false;
+						local x = tostring(reportIndex)
+						for n, _ in pairs(reportTable) do
+							for s, d in pairs(docks) do
+								if(d and ((type(d) == "table" and x == s and d[i] and d[i] == n) or (type(d) == "string" and d == n))) then
+									MOD.References[n] = socket
+									MOD:EnableReport(socket, n)
+									loaded = true
 								end
 							end
-						end
+						end
+						if(not loaded) then
+							socket.text:SetText(nil)
+						end
 					end
 				end
 			end
@@ -622,31 +670,16 @@ function MOD:SetAccountantData(dataType, cacheType, defaultValue)
 	end
 end

-function MOD:EnableDataObject(dataName, dataObj, noupdate)
-	local function textUpdate(event, name, key, value, dataobj)
-		if value == nil or (len(value) > 5) or value == 'n/a' or name == value then
-			dataObj.text:SetText(value ~= 'n/a' and value or name)
-		else
-			dataObj.text:SetText(name..': '.. '|cff' .. hexHighlight ..value..'|r')
-		end
-	end
-
-    LDB:RegisterCallback("LibDataBroker_AttributeChanged_"..dataName.."_text", textUpdate)
-	LDB:RegisterCallback("LibDataBroker_AttributeChanged_"..dataName.."_value", textUpdate)
-	LDB.callbacks:Fire("LibDataBroker_AttributeChanged_"..dataName.."_text", dataName, nil, dataObj.text, dataObj)
-
-    local listName = dataName:gsub("Broker_", "");
-    MOD:NewReport(listName, dataObj)
-end
-
 function MOD:ReportAdded(event, dataName, dataObj, noupdate)
 	local t = dataObj.type
 	if t == "data source" or t == "launcher" then
-		self:EnableDataObject(dataName, dataObj, noupdate)
+	    local listName = dataName:gsub("Broker_", "");
+	    MOD:NewReport(listName, dataObj, dataName);
+	    DIRTY_LIST = true
 	else
 		SV:HandleError("LibDataBroker", dataName, "Unknown data broker type")
 	end
-end
+end

 function MOD:Load()
 	local baseWidth, dockHeight = SV.Dock.BottomCenter:GetSize()
@@ -698,20 +731,17 @@ function MOD:Load()
 	self.ToolTip:HookScript("OnShow", _hook_TooltipOnShow)

 	if(LDB) then
-	  	for dataName, dataObj in LDB:DataObjectIterator() do
-	  		self:ReportAdded(nil, dataName, dataObj, true)
+		for dataName, dataObj in LDB:DataObjectIterator() do
+	  		MOD:ReportAdded(nil, dataName, dataObj, true)
 	  	end
-	  	self:UpdateAllReports()
-	  	LDB.RegisterCallback(self, "LibDataBroker_DataObjectCreated", "ReportAdded")
-	else
-		self:UpdateAllReports()
+	  	LDB.RegisterCallback(MOD, "LibDataBroker_DataObjectCreated", "ReportAdded")
 	end
+	MOD:UpdateAllReports()

 	self:RegisterEvent("PLAYER_ENTERING_WORLD", "UpdateAllReports");

-	SV.Events:On("DOCKS_UPDATED", MOD.UpdateAllReports, true);
-
 	local slashDesc = "Toggle PvP stats on docks";
 	SV:AddSlashCommand("bg", slashDesc, SlashPvPStats);
 	SV:AddSlashCommand("pvp", slashDesc, SlashPvPStats);
+	SV.Events:On("DOCKS_UPDATED", MOD.UpdateAllReports, true);
 end
\ No newline at end of file
diff --git a/SVUI_Chat/SVUI_Chat.lua b/SVUI_Chat/SVUI_Chat.lua
index d503b9b..a1049fe 100644
--- a/SVUI_Chat/SVUI_Chat.lua
+++ b/SVUI_Chat/SVUI_Chat.lua
@@ -1342,6 +1342,14 @@ function MOD:UpdateLocals()
 	end
 end

+local function ProxyExpand()
+	MOD:RefreshChatFrames(true);
+end
+
+local function ExpandChatDock()
+	SV.Timers:ExecuteTimer(ProxyExpand, 0.2)
+end
+
 function MOD:ReLoad()
 	self:RefreshChatFrames(true)
 end
@@ -1469,4 +1477,5 @@ function MOD:Load()

 	SV.Events:On("DOCK_LEFT_FADE_IN", DockFadeInChat, true);
 	SV.Events:On("DOCK_LEFT_FADE_OUT", DockFadeOutChat, true);
+	SV.Events:On("DOCK_LEFT_EXPANDED", ExpandChatDock, true);
 end
\ No newline at end of file
diff --git a/SVUI_QuestTracker/components/quests.lua b/SVUI_QuestTracker/components/quests.lua
index f4d2fde..ffe8ca0 100644
--- a/SVUI_QuestTracker/components/quests.lua
+++ b/SVUI_QuestTracker/components/quests.lua
@@ -277,6 +277,7 @@ do
     CreateQuestItemButton = function(index)
     	local buttonName = "SVUI_QuestButton" .. index
         local itembutton = CreateFrame('Button', buttonName, UIParent, 'SecureActionButtonTemplate, SecureHandlerStateTemplate, SecureHandlerAttributeTemplate');
+        itembutton:SetAlpha(0);
         itembutton:SetStyle("Icon");
         itembutton:ModSize(28, 28);
         itembutton:SetID(index);
@@ -304,7 +305,9 @@ do
             if(name == 'item') then
                 if(value and not self:IsShown()) then
                     self:Show()
+                    self:SetAlpha(1)
                 elseif(not value) then
+                	self:SetAlpha(0)
                     self:Hide()
                 end
             end
diff --git a/SVUI_Skins/components/blizzard/tradeskill.lua b/SVUI_Skins/components/blizzard/tradeskill.lua
index 4cad5cf..0d65372 100644
--- a/SVUI_Skins/components/blizzard/tradeskill.lua
+++ b/SVUI_Skins/components/blizzard/tradeskill.lua
@@ -81,17 +81,16 @@ local function TradeSkillStyle()
 	SV.API:Set("PageButton", TradeSkillIncrementButton)

 	TradeSkillIncrementButton:ModPoint("RIGHT", TradeSkillCreateButton, "LEFT", -13, 0)
-	SV.API:Set("CloseButton", TradeSkillFrameCloseButton)
-
-	TradeSkillSkillIcon:SetStyle("!_Frame", "Icon")
+	SV.API:Set("CloseButton", TradeSkillFrameCloseButton)

 	local internalTest = false;

 	hooksecurefunc("TradeSkillFrame_SetSelection", function(_)
-		TradeSkillSkillIcon:SetStyle("!_Frame", "Icon")
+		TradeSkillSkillIcon:SetStyle("Icon")
 		if TradeSkillSkillIcon:GetNormalTexture() then
 			TradeSkillSkillIcon:GetNormalTexture():SetTexCoord(unpack(_G.SVUI_ICON_COORDS))
 		end
+		--TradeSkillSkillIconCount:SetFrameLevel(TradeSkillSkillIcon:GetFrameLevel() + 20)
 		for i=1, MAX_TRADE_SKILL_REAGENTS do
 			local u = _G["TradeSkillReagent"..i]
 			local icon = _G["TradeSkillReagent"..i.."IconTexture"]
@@ -106,7 +105,7 @@ local function TradeSkillStyle()
 					 a2:SetFrameLevel(0)
 				end
 				a2:WrapPoints(icon)
-				a2:SetStyle("!_Frame", "Icon")
+				a2:SetStyle("Icon")
 				icon:SetParent(a2)
 				icon.backdrop = a2
 			end
diff --git a/SVUI_UnitFrames/libs/Plugins/oUF_ActionPanel/oUF_ActionPanel.lua b/SVUI_UnitFrames/libs/Plugins/oUF_ActionPanel/oUF_ActionPanel.lua
index 6d0b628..a90bbef 100644
--- a/SVUI_UnitFrames/libs/Plugins/oUF_ActionPanel/oUF_ActionPanel.lua
+++ b/SVUI_UnitFrames/libs/Plugins/oUF_ActionPanel/oUF_ActionPanel.lua
@@ -26,6 +26,7 @@ local Update = function(self, event, unit)
 	local special = action.special
 	local class = action.class
 	local showSpecial = false
+	local canShowSpecial = (UnitReaction("player", unit) < 5) or false
 	local r,g,b = 0,0,0;
 	local category = UnitClassification(unit)

@@ -34,10 +35,10 @@ local Update = function(self, event, unit)
 	else
 		if(category == "elite") then
 			r,g,b = 1,0.75,0;
-			showSpecial = true
+			showSpecial = canShowSpecial
 		elseif(category == "rare" or category == "rareelite") then
 			r,g,b = 0.59,0.79,1;
-			showSpecial = true
+			showSpecial = canShowSpecial
 		end
 	end