All pastes #937399 Raw Edit

ElkBuffbars.lua

public lua v1 · immutable
·published 2008-03-10 23:58 UTC
rendered paste body
local _G = getfenv(0)local gratuity = AceLibrary("Gratuity-2.0")local Dewdrop = AceLibrary("Dewdrop-2.0")local LSM3 = LibStub("LibSharedMedia-3.0")local tablet = AceLibrary("Tablet-2.0")local ipairs				= _G.ipairslocal next					= _G.nextlocal pairs					= _G.pairslocal select				= _G.selectlocal tonumber				= _G.tonumberlocal tostring				= _G.tostringlocal type					= _G.typelocal unpack				= _G.unpacklocal GetInventoryItemLink		= _G.GetInventoryItemLinklocal GetInventoryItemTexture	= _G.GetInventoryItemTexturelocal GetInventorySlotInfo		= _G.GetInventorySlotInfolocal GetItemInfo				= _G.GetItemInfolocal GetPlayerBuff				= _G.GetPlayerBufflocal GetPlayerBuffApplications	= _G.GetPlayerBuffApplicationslocal GetPlayerBuffName			= _G.GetPlayerBuffNamelocal GetPlayerBuffTexture		= _G.GetPlayerBuffTexturelocal GetPlayerBuffTimeLeft		= _G.GetPlayerBuffTimeLeftlocal GetPlayerBuffDispelType	= _G.GetPlayerBuffDispelTypelocal GetWeaponEnchantInfo		= _G.GetWeaponEnchantInfolocal GetTrackingTexture		= _G.GetTrackingTexturelocal UnitBuff					= _G.UnitBufflocal UnitDebuff				= _G.UnitDebufflocal math_abs				= _G.math.abslocal strgmatch				= _G.string.gmatchlocal strgsub				= _G.string.gsublocal strmatch				= _G.string.matchlocal strtrim				= _G.string.trimlocal strutf8sub			= _G.string.utf8sublocal table_insert			= _G.table.insertlocal table_remove			= _G.table.removelocal table_sort			= _G.table.sortlocal RANK = _G.RANKlocal L = setmetatable({}, {__index = function(self, key) return key end})ElkBuffBars = AceLibrary("AceAddon-2.0"):new("AceConsole-2.0", "AceDB-2.0", "AceEvent-2.0", "FuBarPlugin-2.0")-- ElkBuffBars = AceLibrary("AceAddon-2.0"):new("AceConsole-2.0", "AceDB-2.0", "AceEvent-2.0", "AceDebug-2.0", "FuBarPlugin-2.0")local ElkBuffBars = ElkBuffBarslocal EBB_Bar = _G.EBB_Barlocal EBB_BarGroup = _G.EBB_BarGroup-- ElkBuffBars.debugFrame = ChatFrame4-- ElkBuffBars:SetDebugging(true)ElkBuffBars.revision = tonumber(string.sub("$Revision: 63558 $", 12, -3)) or 1ElkBuffBars:RegisterDB("ElkBuffBarsDB")ElkBuffBars:RegisterDefaults("profile", {	bargroups = {},	groupspacing = 10,	hidebuffframe = true,	hidetenchframe = true,	hidetrackingframe = true,	shiftannounce = true,	anounceoutofparty = true,	nameoverride = {		BUFF = {},		DEBUFF = {},		TENCH = {},		TRACKING = {},	},	typeoverride = {		BUFF = {},		DEBUFF = {},		TENCH = {},		TRACKING = {},	},})function ElkBuffBars:AddDefaultBargroups()	table_insert(self.db.profile.bargroups,		{			["bars"] = {				["barcolor"]			= {0.3, 0.5, 1, 0.8},								-- <color set>				["barbgcolor"]			= {0, 0.5, 1, 0.3},									-- <color set>			},			["filter"] = {				["type"] = {					["BUFF"] = true,					["TRACKING"] = true,				}			},			anchortext = "BUFFS & TRACKING",			-- <string>		})	table_insert(self.db.profile.bargroups,		{			["bars"] = {				["barcolor"]			= {1, 0, 0, 0.8},									-- <color set>				["barbgcolor"]			= {1, 0, 0, 0.3},									-- <color set>			},			["filter"] = {				["type"] = {					["DEBUFF"] = true,				}			},			anchortext = "DEBUFFS",						-- <string>			anchorshown = false,						-- true, false			stickto = 1,								-- bargroup id			stickside = "",								-- "LEFT", "RIGHT", ""		})	table_insert(self.db.profile.bargroups,		{			["bars"] = {				["barcolor"]			= {0.5, 0, 0.5, 0.8},								-- <color set>				["barbgcolor"]			= {0.5, 0, 0.5, 0.3},								-- <color set>			},			["filter"] = {				["type"] = {					["TENCH"] = true,				}			},			anchortext = "TENCH",						-- <string>			anchorshown = false,						-- true, false			stickto = 2,								-- bargroup id			stickside = "",								-- "LEFT", "RIGHT", ""		})endlocal STICKTO_AREA = 25local INVENTORYSLOT_MAINHAND = GetInventorySlotInfo("MainHandSlot")local INVENTORYSLOT_SECONDARYHAND = GetInventorySlotInfo("SecondaryHandSlot")local updates_disabled = falselocal scan_happend = {}local old_hasMainHandEnchant,	old_mainHandExpiration,	old_mainHandCharges,	old_mainHandName,	old_mainHandRanklocal old_hasOffHandEnchant,	old_offHandExpiration,	old_offHandCharges,		old_offHandName,	old_offHandRanklocal AO_alloptslocal AO_buffsettingslocal AO_groupsettingslocal LSM3_font = LSM3:List("font")local LSM3_statusbar = LSM3:List("statusbar")ElkBuffBars.ShortName = setmetatable({}, { __index = function(self, key)	local name = key	local shortname = ""	if strmatch(name, "[%(%)]") then		name = strtrim(strgsub(strgsub(name, "%b()", ""), "  +", " "))	end	for word in strgmatch(name, "([^ ]+)") do		local alpha, bravo = strutf8sub(word, 1, 1), strutf8sub(word, 2)		if strmatch(bravo, ":") then			shortname = shortname..alpha .. ":"		else			shortname = shortname..alpha		end	end	self[key] = shortname	return shortnameend, })function ElkBuffBars:OnInitialize()	local build = select(2, _G.GetBuildInfo())	if not self.db.account.build or self.db.account.build ~= build or true then		self.db.account.build = build		self.db.account.maxtimes = nil		self.db.account.maxcharges = nil	end	if not self.db.account.maxtimes then		self.db.account.maxtimes = {			BUFF = {},			DEBUFF = {},			TENCH = {},		}	end	if not self.db.account.maxcharges then		self.db.account.maxcharges = {			BUFF = {},			DEBUFF = {},			TENCH = {},		}	endendfunction ElkBuffBars:OnEnable()	self:OnProfileEnable()		-- register events	self:RegisterEvent("PLAYER_ENTERING_WORLD")	self:RegisterBucketEvent("MINIMAP_UPDATE_TRACKING", .2)	self:RegisterBucketEvent("PLAYER_AURAS_CHANGED", .2)	self:RegisterBucketEvent("PLAYER_FOCUS_CHANGED", .2)	self:RegisterBucketEvent("PLAYER_TARGET_CHANGED", .2)	self:RegisterBucketEvent("UNIT_PET", .2)	self:RegisterBucketEvent("UNIT_AURA", .2)	self:ScheduleRepeatingEvent(self.DoUpdates, .5, self)		LSM3.RegisterCallback(self, "LibSharedMedia_Registered", "LibSharedMedia_Update")	LSM3.RegisterCallback(self, "LibSharedMedia_SetGlobal", "LibSharedMedia_Update")	--	self:ScanData_BUFF()	self:ScanData_DEBUFF()	self:ScanData_TENCH()	self:ScanData_TRACKING()--~ 	--~ 	self:RegisterEvent("UNIT_INVENTORY_CHANGED")--~ 		-- hide Blizzard frames	self:PLAYER_ENTERING_WORLD()end--~ 	--~ function ElkBuffBars:UNIT_INVENTORY_CHANGED(...)--~ 	self:PrintComma("UNIT_INVENTORY_CHANGED", ...)--~ 	self:PrintComma(string.match(GetInventoryItemLink("player", INVENTORYSLOT_MAINHAND) or "nil", "|H(item:[^|]*)|") or "nil", string.match(GetInventoryItemLink("player", INVENTORYSLOT_SECONDARYHAND) or "nil", "|H(item:[^|]*)|") or "nil")--~ end--~ 	function ElkBuffBars:OnDisable()	self:OnProfileDisable()endfunction ElkBuffBars:OnProfileEnable()	-- add default bargroups	if #self.db.profile.bargroups == 0 then		self:AddDefaultBargroups()	end	-- check bargroups	self:CheckLayouts()	-- update known names	self:UpdateKnownNames()	-- create bargroups based on stored settings	self:CreateBarGroups()endfunction ElkBuffBars:OnProfileDisable()	-- recycle all bargroups	self:RemoveBarGroups()end-- refresh layouts when new media is setfunction ElkBuffBars:LibSharedMedia_Update(callback, type, handle)	if type == "font" or type == "statusbar" then		for k, v in pairs(self.bargroups) do			v:SetLayout()		end	endendfunction ElkBuffBars:PLAYER_ENTERING_WORLD()--~ 	BuffFrame:Hide()--~ 	TemporaryEnchantFrame:Hide()		self:HandleFrame_Blizzard_BuffFrame(self.db.profile.hidebuffframe)	self:HandleFrame_Blizzard_TemporaryEnchantFrame(self.db.profile.hidetenchframe)	self:HandleFrame_Blizzard_MiniMapTracking(self.db.profile.hidetrackingframe)endlocal hidden_blizzard_frames = {}function ElkBuffBars:HandleFrame_Blizzard_BuffFrame(hide)	if hide then		BuffFrame:UnregisterEvent("PLAYER_AURAS_CHANGED")		BuffFrame:Hide()		hidden_blizzard_frames["BuffFrame"] = true	elseif hidden_blizzard_frames["BuffFrame"] then		BuffFrame:RegisterEvent("PLAYER_AURAS_CHANGED")		BuffFrame:Show()		BuffFrame_Update()		hidden_blizzard_frames["BuffFrame"] = false	endendfunction ElkBuffBars:HandleFrame_Blizzard_TemporaryEnchantFrame(hide)	if hide then		BuffFrame:UnregisterEvent("PLAYER_AURAS_CHANGED")		TemporaryEnchantFrame:Hide()		BuffFrame:SetPoint("TOPRIGHT", "TemporaryEnchantFrame", "TOPRIGHT", 0, 0)		hidden_blizzard_frames["TemporaryEnchantFrame"] = true	elseif hidden_blizzard_frames["TemporaryEnchantFrame"] then		BuffFrame:RegisterEvent("PLAYER_AURAS_CHANGED")		TemporaryEnchantFrame:Show()		hidden_blizzard_frames["TemporaryEnchantFrame"] = false	endendfunction ElkBuffBars:HandleFrame_Blizzard_MiniMapTracking(hide)	if hide then		MiniMapTracking:UnregisterEvent("MINIMAP_UPDATE_TRACKING")		MiniMapTracking:Hide()		hidden_blizzard_frames["MiniMapTracking"] = true	elseif hidden_blizzard_frames["MiniMapTracking"] then		MiniMapTracking:RegisterEvent("MINIMAP_UPDATE_TRACKING")		MiniMapTracking:Show()		MiniMapTracking_Update()		hidden_blizzard_frames["MiniMapTracking"] = false	endend-- ------- cache bars-- -----local barcache = {}function ElkBuffBars:GetBar()	if #barcache > 0 then		return table_remove(barcache, #barcache)	else		return EBB_Bar:new()	endendfunction ElkBuffBars:RecycleBar(bar)	bar:Reset()	table_insert(barcache, bar)end-- ------- cache bargroups-- -----local bargroupcache = {}function ElkBuffBars:GetBarGroup()	if #bargroupcache > 0 then		return table_remove(bargroupcache, #bargroupcache)	else		return EBB_BarGroup:new()	endendfunction ElkBuffBars:RecycleBarGroup(bargroup)	bargroup:Reset()	table_insert(bargroupcache, bargroup)end-- ------- cache datatables-- -----local datatablecache = {}local function GetDataTable()	if #datatablecache > 0 then		return table_remove(datatablecache, #datatablecache)	else		return {}	endendlocal function RecycleDataTable(dt)	table_insert(datatablecache, dt)end-- ------- known names-- -----ElkBuffBars.knownnames = {	BUFF = {},	DEBUFF = {},	TENCH = {},	TRACKING = {},}local knownnames_validate = {	BUFF = {},	DEBUFF = {},	TENCH = {},	TRACKING = {},}function ElkBuffBars:AddKnownName(type, name)	if not self.knownnames[type][name] then		self.knownnames[type][name] = true		AO_buffsettings.args[type].args[name] = self:GetNameOptions(type, name)		table_insert(knownnames_validate[type], name)		table_sort(knownnames_validate[type])	endendfunction ElkBuffBars:UpdateKnownNames()	for type, data in pairs(self.db.profile.nameoverride) do		for name in pairs(data) do			self:AddKnownName(type, name)		end	end	for type, data in pairs(self.db.profile.typeoverride) do		for name in pairs(data) do			self:AddKnownName(type, name)		end	end	for id, bg in pairs(self.db.profile.bargroups) do		if bg.filter.names_include then			for type, data in pairs(bg.filter.names_include) do				for name in pairs(data) do					self:AddKnownName(type, name)				end			end		end		if bg.filter.names_exclude then			for type, data in pairs(bg.filter.names_exclude) do				for name in pairs(data) do					self:AddKnownName(type, name)				end			end		end	endend-- ------- creation/removing of bargroups-- -----ElkBuffBars.bargroups = {}local function ApplyDefaults(defaults, data)	for k, v in pairs(defaults) do		if type(v) == "table" then			if data[k] == nil or type(data[k]) ~= "table" then data[k] = {} end			ApplyDefaults(v, data[k])		else			if data[k] == nil then data[k] = v end		end	endendlocal DEFAULT_LAYOUT = {	["bars"] = {		["icon"]				= "LEFT",											-- "LEFT", "RIGHT", false		["iconcount"]			= true,												-- true, false		["iconcountanchor"]		= "CENTER",											-- <anchor>		["iconcountfont"]		= "Arial Narrow",									-- <LSM3:font>		["iconcountfontsize"]	= 14,												-- <font size>		["iconcountcolor"]		= {1, 1, 1, 1},										-- <color set>		["bar"]					= true,												-- true, false		["bgbar"]				= true,												-- true, false		["bartexture"]			= "Otravi",											-- <LSM3:statusbar>, false		["barright"]			= false,											-- true, false		["textTL"]				= "NAMERANKCOUNT",									-- false, "NAME", "NAMERANK", "NAMECOUNT", "NAMERANKCOUNT", "RANK", "COUNT", "TIMELEFT", "DEBUFFTYPE"		["textTLfont"]			= "Friz Quadrata TT",								-- <LSM3:font>		["textTLfontsize"]		= 14,												-- <font size>		["textTLcolor"]			= {1, 1, 1, 1},										-- <color set>		["textTLalign"]			= "LEFT",											-- left, center, right		["textTR"]				= "TIMELEFT",										-- false, "NAME", "NAMERANK", "NAMECOUNT", "NAMERANKCOUNT", "RANK", "COUNT", "TIMELEFT", "DEBUFFTYPE"		["textTRfont"]			= "Friz Quadrata TT",								-- <LSM3:font>		["textTRfontsize"]		= 14,												-- <font size>		["textTRcolor"]			= {1, 1, 1, 1},										-- <color set>		["textBL"]				= false,											-- false, "NAME", "NAMERANK", "NAMECOUNT", "NAMERANKCOUNT", "RANK", "COUNT", "TIMELEFT", "DEBUFFTYPE"		["textBLfont"]			= "Friz Quadrata TT",								-- <LSM3:font>		["textBLfontsize"]		= 14,												-- <font size>		["textBLcolor"]			= {1, 1, 1, 1},										-- <color set>		["textBLalign"]			= "LEFT",											-- left, center, right		["textBR"]				= false,											-- false, "NAME", "NAMERANK", "NAMECOUNT", "NAMERANKCOUNT", "RANK", "COUNT", "TIMELEFT", "DEBUFFTYPE"		["textBRfont"]			= "Friz Quadrata TT",								-- <LSM3:font>		["textBRfontsize"]		= 14,												-- <font size>		["textBRcolor"]			= {1, 1, 1},										-- <color set>		["barcolor"]			= {0.3, 0.5, 1, 0.8},								-- <color set>		["barbgcolor"]			= {0, 0.5, 1, 0.3},									-- <color set>		["debufftypecolor"]		= true,												-- true, false		["timeformat"]			= "CONDENSED",										-- "DEFAULT", "EXTENDED", "FULL", "SHORT", "CONDENSED"		["width"]				= 250,		["height"]				= 20,		["tooltipanchor"]		= "default",										-- <tooltip anchor>, "default"		timelessfull			= false,											-- true, false		alpha					= 1,												-- alpha value		padding					= 1,												-- 0 - 10		abbreviate_name			= 0,												--	},	["filter"] = {		["type"] = {		}	},	sorting			= "timeleft",						-- timeleft, timemax	target			= "player",							-- player, pet, target	growup			= false,							-- true, false	barspacing		= 0,								-- 0+	anchortext		= "unknown bargroup",				-- <string>	anchorshown		= true,								-- true, false}-- resets corrupt entries in the given layout to default values; returns a now valid layoutfunction ElkBuffBars:CheckLayout(layout)	if not layout or type(layout) ~= "table" then layout = {} end	ApplyDefaults(DEFAULT_LAYOUT, layout)	return layoutendfunction ElkBuffBars:CheckLayouts()	local bglayouts = self.db.profile.bargroups	for k, v in ipairs(bglayouts) do		self:CheckLayout(v)	endendfunction ElkBuffBars:CreateBarGroups()	for k, v in pairs(self.bargroups) do		self:RecycleBarGroup(v)		self.bargroups[k] = nil	end	local bglayouts = self.db.profile.bargroups	for k, v in ipairs(bglayouts) do		self:AddBarGroup(v)	end	for k, v in ipairs(self.bargroups) do		local layout = bglayouts[k]		v:SetPosition()		v:GetContainer():Show()	endendfunction ElkBuffBars:RemoveBarGroups()	for k, v in pairs(self.bargroups) do		self:RecycleBarGroup(v)		self.bargroups[k] = nil		AO_groupsettings[k] = nil	endendfunction ElkBuffBars:AddBarGroup(layout)	if not layout then		layout = {			["bars"] = {			},			["filter"] = {				["type"] = {					["BUFF"] = true,				}			},			anchortext = "new bargroup",				-- <string>		}		table_insert(self.db.profile.bargroups, layout)	end	local bargroup = self:GetBarGroup()	table_insert(self.bargroups, bargroup)	layout.id = #self.bargroups	self:CheckLayout(layout)	bargroup:SetLayout(layout)	table_insert(AO_groupsettings, self:GetGroupOptions(#self.bargroups))	return bargroupendfunction ElkBuffBars:RemoveBarGroup(id)	local bg = table_remove(self.bargroups, id)	table_remove(self.db.profile.bargroups, id)	for k, v in pairs(self.bargroups) do		local layout = v.layout		layout.id = k		if layout.stickto then			if layout.stickto == id then				-- the group we sticked to was removed				local container = v:GetContainer()				layout.stickto = nil				container:ClearAllPoints()				container:SetPoint("CENTER", UIParent, "CENTER", layout.x, layout.y)				v:ToggleAnchor(true)			elseif layout.stickto > id then				layout.stickto = layout.stickto - 1			end		end	end	table_remove(AO_groupsettings)	self:RecycleBarGroup(bg)endfunction ElkBuffBars:CopyBarLayout(target, source)	if target == source then return end	if not source then source = DEFAULT_LAYOUT end	target.bars = {}	ApplyDefaults(source.bars, target.bars)	target.sorting = source.sorting	self.bargroups[target.id]:SetLayout()end-- ------- buff scanning-- -----ElkBuffBars.buffdata = {	focus = {},	pet = {},	player = {},	target = {},}ElkBuffBars.debuffdata = {	focus = {},	pet = {},	player = {},	target = {},}ElkBuffBars.tenchdata = {}ElkBuffBars.trackingdata = {}function ElkBuffBars:MINIMAP_UPDATE_TRACKING()	self:ScanData_TRACKING()	self:DoUpdates()endfunction ElkBuffBars:PLAYER_AURAS_CHANGED()	self:ScanData_BUFF()	self:ScanData_DEBUFF()		self:DoUpdates()endfunction ElkBuffBars:PLAYER_FOCUS_CHANGED()	self:ScanData_Unit_BUFF("focus")	self:ScanData_Unit_DEBUFF("focus")	self:DoUpdates()endfunction ElkBuffBars:PLAYER_TARGET_CHANGED()	self:ScanData_Unit_BUFF("target")	self:ScanData_Unit_DEBUFF("target")	self:DoUpdates()endfunction ElkBuffBars:UNIT_PET(args)	if args["player"] then		self:ScanData_Unit_BUFF("pet")		self:ScanData_Unit_DEBUFF("pet")		self:DoUpdates()	endendlocal watched_unitids = { focus = true, pet = true, target = true }function ElkBuffBars:UNIT_AURA(args)	for arg in pairs(args) do		if watched_unitids[arg] then			self:ScanData_Unit_BUFF(arg)			self:ScanData_Unit_DEBUFF(arg)		end	end	self:DoUpdates()endlocal PATTERN_RANK = RANK.." (%d+)"function ElkBuffBars:ScanData_BUFF()	updates_disabled = true	local maxtimes = self.db.account.maxtimes.BUFF	local maxcharges = self.db.account.maxcharges.BUFF	local datatable = self.buffdata.player	for k, v in pairs(datatable) do		RecycleDataTable(v)		datatable[k] = nil	end	local i = 1	while true do		local buffIndex, untilCancelled = GetPlayerBuff(i, "HELPFUL")		if buffIndex == 0 then break end		local name, rank = GetPlayerBuffName(buffIndex)		self:AddKnownName("BUFF", name)		local tname = name..(rank and (" "..rank) or "")		if rank then			rank = strmatch(rank, PATTERN_RANK)		end		local timeleft = GetPlayerBuffTimeLeft(buffIndex)		local timemax = timeleft		if maxtimes[tname] and timemax < maxtimes[tname] then			timemax = maxtimes[tname]		else--	if timeleft > 0 then self:Debug(i, buffIndex, name, ("%.1f"):format(timeleft / 60)) end			maxtimes[tname] = timemax		end		local charges = GetPlayerBuffApplications(buffIndex) or 0		if charges > 1 and (not maxcharges[tname] or maxcharges[tname] < charges) then			maxcharges[tname] = charges		end		local dt = GetDataTable()		dt.id				= buffIndex		dt.name				= self.db.profile.nameoverride.BUFF[name] or name		dt.realname			= name		dt.rank				= rank and tonumber(rank) or nil		dt.type				= self.db.profile.typeoverride.BUFF[name] or "BUFF"		dt.realtype			= "BUFF"		dt.debufftype		= nil		dt.timeleft			= timeleft		dt.timemax			= timemax		dt.untilcancelled	= (untilCancelled == 1) and true or nil		dt.charges			= charges		dt.maxcharges		= maxcharges[tname]		dt.icon				= GetPlayerBuffTexture(buffIndex)				table_insert(datatable, dt)		i = i + 1	end	scan_happend.player = true	updates_disabled = falseendfunction ElkBuffBars:ScanData_DEBUFF()	updates_disabled = true	local maxtimes = self.db.account.maxtimes.DEBUFF	local maxcharges = self.db.account.maxcharges.DEBUFF	local datatable = self.debuffdata.player	for k, v in pairs(datatable) do		RecycleDataTable(v)		datatable[k] = nil	end	local i = 1	while true do		local buffIndex, untilCancelled = GetPlayerBuff(i, "HARMFUL")		if buffIndex == 0 then break end		local name, rank = GetPlayerBuffName(buffIndex)		self:AddKnownName("DEBUFF", name)		local tname = name..(rank and (" "..rank) or "")		if rank then			rank = strmatch(rank, PATTERN_RANK)		end		local timeleft = GetPlayerBuffTimeLeft(buffIndex)		local timemax = timeleft		if maxtimes[tname] and timemax < maxtimes[tname] then			timemax = maxtimes[tname]		else--	if timeleft > 0 then self:Debug(i, buffIndex, name, ("%.1f"):format(timeleft / 60)) end			maxtimes[tname] = timemax		end		local charges = GetPlayerBuffApplications(buffIndex) or 0		if charges > 1 and (not maxcharges[tname] or maxcharges[tname] < charges) then			maxcharges[tname] = charges		end		local dt = GetDataTable()		dt.id				= buffIndex		dt.name				= self.db.profile.nameoverride.DEBUFF[name] or name		dt.realname			= name		dt.rank				= rank and tonumber(rank) or nil		dt.type				= self.db.profile.typeoverride.DEBUFF[name] or "DEBUFF"		dt.realtype			= "DEBUFF"		dt.debufftype		= GetPlayerBuffDispelType(buffIndex)		dt.timeleft			= timeleft		dt.timemax			= timemax		dt.untilcancelled	= (untilCancelled == 1) and true or nil		dt.charges			= charges		dt.maxcharges		= maxcharges[tname]		dt.icon				= GetPlayerBuffTexture(buffIndex)				table_insert(datatable, dt)		i = i + 1	end	scan_happend.player = true	updates_disabled = falseendfunction ElkBuffBars:ScanData_TENCH()	updates_disabled = true	local maxtimes = self.db.account.maxtimes.TENCH	local maxcharges = self.db.account.maxcharges.TENCH	for k, v in pairs(self.tenchdata) do		RecycleDataTable(v)		self.tenchdata[k] = nil	end	local hasMainHandEnchant, mainHandExpiration, mainHandCharges, hasOffHandEnchant, offHandExpiration, offHandCharges = GetWeaponEnchantInfo()	if ( hasMainHandEnchant ) then		local timeleft = mainHandExpiration / 1000		local timemax = timeleft			local id = INVENTORYSLOT_MAINHAND		local name, rank = self:GetTempBuffName(id)		self:AddKnownName("TENCH", name)		local tname = name..(rank and (" "..rank) or "")--		if rank then--			rank = strmatch(rank, PATTERN_RANK)--		end		if maxtimes[tname] and timemax < maxtimes[tname] then			timemax = maxtimes[tname]		else			maxtimes[tname] = timemax		end		local charges = mainHandCharges or 0		if charges > 1 and (not maxcharges[tname] or maxcharges[tname] < charges) then			maxcharges[tname] = charges		end		local dt = GetDataTable()		dt.id				= id		dt.name				= self.db.profile.nameoverride.TENCH[name] or name		dt.realname			= name		dt.rank				= rank and tonumber(rank) or nil		dt.type				= self.db.profile.typeoverride.TENCH[name] or "TENCH"		dt.realtype			= "TENCH"		dt.debufftype		= nil		dt.timeleft			= timeleft		dt.timemax			= timemax		dt.untilcancelled	= nil		dt.charges			= charges		dt.maxcharges		= maxcharges[tname]		dt.icon				= GetInventoryItemTexture("player", id)				table_insert(self.tenchdata, dt)	end	if ( hasOffHandEnchant ) then		local timeleft = offHandExpiration / 1000		local timemax = timeleft		local id = INVENTORYSLOT_SECONDARYHAND		local name, rank = self:GetTempBuffName(id)		local tname = name..(rank and (" "..rank) or "")		self:AddKnownName("TENCH", name)--		if rank then--			rank = strmatch(rank, PATTERN_RANK)--		end		if maxtimes[tname] and timemax < maxtimes[tname] then			timemax = maxtimes[tname]		else			maxtimes[tname] = timemax		end		local charges = offHandCharges or 0		if charges > 1 and (not maxcharges[tname] or maxcharges[tname] < charges) then			maxcharges[tname] = charges		end		local dt = GetDataTable()		dt.id				= id		dt.name				= self.db.profile.nameoverride.TENCH[name] or name		dt.realname			= name		dt.rank				= rank and tonumber(rank) or nil		dt.type				= self.db.profile.typeoverride.TENCH[name] or "TENCH"		dt.realtype			= "TENCH"		dt.debufftype		= nil		dt.timeleft			= timeleft		dt.timemax			= timemax		dt.untilcancelled	= nil		dt.charges			= charges		dt.maxcharges		= maxcharges[tname]		dt.icon				= GetInventoryItemTexture("player", id)				table_insert(self.tenchdata, dt)	end	scan_happend.player = true	updates_disabled = falseendfunction ElkBuffBars:ScanData_TRACKING()	updates_disabled = true	for k, v in pairs(self.trackingdata) do		RecycleDataTable(v)		self.trackingdata[k] = nil	end	local icon = GetTrackingTexture()	if icon then		local name = self:GetTrackingName()		self:AddKnownName("TRACKING", name)		local dt = GetDataTable()		dt.id				= 1		dt.name				= self.db.profile.nameoverride.TRACKING[name] or name		dt.realname			= name		dt.rank				= nil		dt.type				= self.db.profile.typeoverride.TRACKING[name] or "TRACKING"		dt.realtype			= "TRACKING"		dt.debufftype		= nil		dt.timeleft			= 1		dt.timemax			= 1		dt.untilcancelled	= true		dt.charges			= 0		dt.maxcharges		= nil		dt.icon				= icon				table_insert(self.trackingdata, dt)	end	scan_happend.player = true	updates_disabled = falseendfunction ElkBuffBars:ScanData_Unit_BUFF(unit)	local maxcharges = self.db.account.maxcharges.BUFF	local datatable = self.buffdata[unit]	if not datatable then return end	updates_disabled = true	for k, v in pairs(datatable) do		RecycleDataTable(v)		datatable[k] = nil	end	local i = 1	while true do		local name, rank, icon, charges, timemax, timeleft = UnitBuff(unit, i)		if not icon then break end		local tname = name..(rank and (" "..rank) or "")		self:AddKnownName("BUFF", name)		if rank then			rank = strmatch(rank, PATTERN_RANK)		end		if timemax then			self.db.account.maxtimes.BUFF[tname] = timemax		end		charges = charges or 0		if charges > 1 and (not maxcharges[tname] or maxcharges[tname] < charges) then			maxcharges[tname] = charges		end		local dt = GetDataTable()		dt.id				= i		dt.name				= self.db.profile.nameoverride.BUFF[name] or name		dt.realname			= name		dt.rank				= rank and tonumber(rank) or nil		dt.type				= (self.db.profile.typeoverride.BUFF[name] or "BUFF")		dt.realtype			= "BUFF"		dt.debufftype		= nil		dt.timeleft			= timeleft or 1		dt.timemax			= timemax or 1		dt.untilcancelled	= ((not timemax) or timemax == 0) and true or nil		dt.charges			= charges		dt.maxcharges		= maxcharges[tname]		dt.icon				= icon				table_insert(datatable, dt)		i = i + 1	end	scan_happend[unit] = true	updates_disabled = falseendfunction ElkBuffBars:ScanData_Unit_DEBUFF(unit)	local maxcharges = self.db.account.maxcharges.DEBUFF	local datatable = self.debuffdata[unit]	if not datatable then return end	updates_disabled = true	for k, v in pairs(datatable) do		RecycleDataTable(v)		datatable[k] = nil	end	local i = 1	while true do		local name, rank, icon, charges, debuffType, timemax, timeleft = UnitDebuff(unit, i);		if not icon then break end		local tname = name..(rank and (" "..rank) or "")		self:AddKnownName("DEBUFF", name)		if rank then			rank = strmatch(rank, PATTERN_RANK)		end		if timemax then			self.db.account.maxtimes.DEBUFF[tname] = timemax		end		charges = charges or 0		if charges > 1 and (not maxcharges[tname] or maxcharges[tname] < charges) then			maxcharges[tname] = charges		end		local dt = GetDataTable()		dt.id				= i		dt.name				= self.db.profile.nameoverride.DEBUFF[name] or name		dt.realname			= name		dt.rank				= rank and tonumber(rank) or nil		dt.type				= (self.db.profile.typeoverride.DEBUFF[name] or "DEBUFF")		dt.realtype			= "DEBUFF"		dt.debufftype		= debuffType		dt.timeleft			= timeleft or 1		dt.timemax			= timemax or 1		dt.untilcancelled	= ((not timemax) or timemax == 0) and true or nil		dt.charges			= charges		dt.maxcharges		= maxcharges[tname]		dt.icon				= icon				table_insert(datatable, dt)		i = i + 1	end	scan_happend[unit] = true	updates_disabled = falseendlocal roman_to_arabic = setmetatable({I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000}, {__index=function(self, roman)	local arabic = 0	local maxval = 0	for i = roman:len(), 1, -1 do		local digitval = self[roman:sub(i,i)]		if digitval < maxval then			arabic = arabic - digitval		else			arabic = arabic + digitval			maxval = digitval		end	end	self[roman] = arabic	return arabicend})function ElkBuffBars:GetTempBuffName(id)	local rank	gratuity:SetInventoryItem("player", id)	local _, _, buffname = gratuity:Find("^(.+) %(%d+ [^%)]+%)$")	if buffname then		buffname = strgsub(buffname, " %(%d+ [^%)]+%)", "") -- remove 2nd brackets for buffs with charges		local tname, trank = strmatch(buffname, "(.*) (%d*)$")		if tname then			buffname = tname			rank = trank		else			local tname, trank = strmatch(buffname, "(.*) ([CDILMVX]*)$")			if tname then				buffname = tname				rank = roman_to_arabic[trank]			end		end		return buffname, rank	end	local itemlink = GetInventoryItemLink("player", id)	if itemlink then		local name = GetItemInfo(itemlink)		return name or "Weapon "..id	end	return "Weapon "..idendfunction ElkBuffBars:GetTrackingName()	local name, texture, active, category	local count = GetNumTrackingTypes()	for id=1, count do		name, texture, active, category  = GetTrackingInfo(id)		if active then			return name		end	end	return NONEend------function ElkBuffBars:UpdateTimes(unit)	for k, v in pairs(self.buffdata[unit]) do		if not v.untilcancelled then			local timemax, timeleft = select(5, UnitBuff(unit, v.id))			if not timemax or timemax == 0 or timeleft > v.timeleft then				self:ScanData_Unit_BUFF(unit)				break			end			v.timeleft = timeleft		end	end	for k, v in pairs(self.debuffdata[unit]) do		if not v.untilcancelled then			local timemax, timeleft = select(6, UnitDebuff(unit, v.id))			if not timemax or timemax == 0 or timeleft > v.timeleft then				self:ScanData_Unit_DEBUFF(unit)				break			end			v.timeleft = timeleft		end	endendfunction ElkBuffBars:DoUpdates()	if updates_disabled then return end		for k, v in pairs(self.buffdata.player) do		if not v.untilcancelled then			local timeleft = GetPlayerBuffTimeLeft(v.id)			if timeleft > v.timeleft then				self:ScanData_BUFF()				break			end			v.timeleft = timeleft		end	end	for k, v in pairs(self.debuffdata.player) do		if not v.untilcancelled then			local timeleft = GetPlayerBuffTimeLeft(v.id)			if timeleft > v.timeleft then				self:ScanData_DEBUFF()				break			end			v.timeleft = timeleft		end	end	-- check for changed weaponbuffs	local hasMainHandEnchant, mainHandExpiration, mainHandCharges, hasOffHandEnchant, offHandExpiration, offHandCharges = GetWeaponEnchantInfo()	local mainHandName, mainHandRank	if hasMainHandEnchant then		mainHandName, mainHandRank = self:GetTempBuffName(INVENTORYSLOT_MAINHAND)	end	local offHandName, offHandRank	if hasOffHandEnchant then		offHandName, offHandRank = self:GetTempBuffName(INVENTORYSLOT_SECONDARYHAND)	end	if hasMainHandEnchant ~= old_hasMainHandEnchant or (mainHandExpiration or 0) > (old_mainHandExpiration or 0) or mainHandCharges ~= old_mainHandCharges or mainHandName ~= old_mainHandName or mainHandRank ~= old_mainHandRank		or hasOffHandEnchant ~= old_hasOffHandEnchant or (offHandExpiration or 0) > (old_offHandExpiration or 0) or offHandCharges ~= old_offHandCharges or offHandName ~= old_offHandName or offHandRank ~= old_offHandRank then		self:ScanData_TENCH()		old_hasMainHandEnchant = hasMainHandEnchant		old_mainHandCharges = mainHandCharges		old_mainHandName = mainHandName		old_mainHandRank = mainHandRank		old_hasOffHandEnchant = hasOffHandEnchant		old_offHandCharges = offHandCharges		old_offHandName = offHandName		old_offHandRank = offHandRank	else		for k, v in pairs(self.tenchdata) do			if v.id == INVENTORYSLOT_MAINHAND then				v.timeleft = mainHandExpiration / 1000			end			if v.id == INVENTORYSLOT_SECONDARYHAND then				v.timeleft = offHandExpiration / 1000			end		end	end	old_mainHandExpiration = mainHandExpiration	old_offHandExpiration = offHandExpiration	self:UpdateTimes("focus")	self:UpdateTimes("pet")	self:UpdateTimes("target")	-- if we did a scan, update bar data	if next(scan_happend) then		for k, v in pairs(self.bargroups) do			v:UpdateData(scan_happend)		end		for k in pairs(scan_happend) do			scan_happend[k] = nil		end	else		for k, v in pairs(self.bargroups) do			v:UpdateTimeleft()		end	endendfunction ElkBuffBars:StickGroup(bargroup)	local layout = bargroup.layout	local id = layout.id	local growup = layout.growup	local container = bargroup:GetContainer()	local base_y = growup and container:GetBottom() or container:GetTop()	local base_left = container:GetLeft()	local base_right = container:GetRight()	layout.stickto = nil--	self:Print("Sticking bargroup", id)	for k, v in pairs(self.bargroups) do		local comp_container = v:GetContainer()		local comp_y = growup and comp_container:GetTop() or comp_container:GetBottom()		if math_abs(comp_y - base_y) < STICKTO_AREA then			-- we are on the same y-area			local comp_left = comp_container:GetLeft()			local comp_right = comp_container:GetRight()			local dist_left = math_abs(base_left - comp_left)			local dist_mid = math_abs((base_left + base_right) - (comp_left + comp_right)) / 2			local dist_right = math_abs(base_right - comp_right)			if dist_left <= STICKTO_AREA or dist_mid <= STICKTO_AREA or dist_right <= STICKTO_AREA then--				self:Print(" - sticking to bargroup ", k)				-- we are also on the same x-area				-- check if we would loop-stick to ourself				local parent = v				local hasloop = false				while parent.layout.stickto do					if parent.layout.stickto == id then--						self:Print("   - LOOP FOUND!")						hasloop = true						break					end					parent = self.bargroups[parent.layout.stickto]				end				if not hasloop then					-- we have found a valid group to stick to					layout.stickto = k					local stickdist = STICKTO_AREA					if dist_mid <= STICKTO_AREA then--~ 						self:Print("   - SUCCESS! -> middle")						layout.stickside = ""						stickdist = dist_mid					end					if dist_left <= STICKTO_AREA and dist_left < stickdist then--~ 						self:Print("   - SUCCESS! -> left")						layout.stickside = "LEFT"						stickdist = dist_left					end					if dist_right <= STICKTO_AREA and dist_right < stickdist then--~ 						self:Print("   - SUCCESS! -> right")						layout.stickside = "RIGHT"						stickdist = dist_right--~ 					else--~ 						self:Print("   - |cffff0000ERROR|r")					end					bargroup:SetPosition()					return true				end			end		end	end	return falseend-- ------- FuBar stuff-- -----ElkBuffBars.hasIcon = true	-- icon by Jakobud @ wowace forumsElkBuffBars.hasNoColor = trueElkBuffBars.clickableTooltip = trueElkBuffBars.hideWithoutStandby = trueElkBuffBars.independentProfile = trueElkBuffBars.cannotDetachTooltip = truefunction ElkBuffBars:OnTextUpdate()	self:SetText("ElkBuffBars")endfunction ElkBuffBars:OnTooltipUpdate()	local cat = tablet:AddCategory(		'columns', 2,		'text', L["bargroup"],		'text2', L["type"],		'hideBlankLine', true,		'showWithoutChildren', true	)	for k, v in ipairs(self.bargroups) do		cat:AddLine(	"text",		tostring(k)..". "..(v.layout.anchortext or "???"),						"text2",	v.layout.target,						"hasCheck",	true,						"checked",	v.layout.anchorshown,						"func",		"ToggleAnchor",						"arg1",		v					)	endend-- ------- AceOption table-- -----AO_buffsettings = {	type = "group", name = L["Buffs Settings"], desc = L["Change name and type for known buffs"], args = {		BUFF = {			type = "group", name = "BUFF", desc = "BUFF", args = {},		},		DEBUFF = {			type = "group", name = "DEBUFF", desc = "DEBUFF", args = {},		},		TENCH = {			type = "group", name = "TENCH", desc = "TENCH", args = {},		},		TRACKING = {			type = "group", name = "TRACKING", desc = "TRACKING", args = {},		},	},	order = 101,}AO_groupsettings = {}AO_allopts = {	type = "group", args = {		buffsettings = AO_buffsettings,		groupsettings = {			type = "group", name = L["Group Settings"], desc = L["Changes the settings for the bargroups"], args = AO_groupsettings,			order = 102,		},		newgroup = {			type = "execute", name = L["New Group"], desc = L["Creates a new bargroup"],			func = function()					local bg = ElkBuffBars:AddBarGroup()					bg:SetPosition()					bg:GetContainer():Show()				end,			order = 103,		},		groupspacing = {			type = "range", name = L["Group Spacing"], desc = L["Sets gap between anchored groups"],			min = 0, max = 50, step = 1,			get = function() return ElkBuffBars.db.profile.groupspacing end,			set = function(v)					ElkBuffBars.db.profile.groupspacing = tonumber(v)					for k, bg in ipairs(ElkBuffBars.bargroups) do						bg:SetPosition()					end				end,			order = 104,		},		buffframe = {			type = "toggle", name = L["Hide Blizzard Buff Frame"], desc = L["Toggles active hiding of the Blizzard buff frame"],			get = function() return ElkBuffBars.db.profile.hidebuffframe end,			set = function(v)					ElkBuffBars.db.profile.hidebuffframe = v					ElkBuffBars:HandleFrame_Blizzard_BuffFrame(ElkBuffBars.db.profile.hidebuffframe)				end,			order = 105,		},		tenchframe = {			type = "toggle", name = L["Hide Blizzard TEnch Frame"], desc = L["Toggles active hiding of the Blizzard tench frame"],			get = function() return ElkBuffBars.db.profile.hidetenchframe end,			set = function(v)					ElkBuffBars.db.profile.hidetenchframe = v					ElkBuffBars:HandleFrame_Blizzard_TemporaryEnchantFrame(ElkBuffBars.db.profile.hidetenchframe)				end,			order = 105,		},		trackingframe = {			type = "toggle", name = L["Hide Minimap Tracking Frame"], desc = L["Toggles active hiding of the minimap tracking frame"],			get = function() return ElkBuffBars.db.profile.hidetrackingframe end,			set = function(v)					ElkBuffBars.db.profile.hidetrackingframe = v					ElkBuffBars:HandleFrame_Blizzard_MiniMapTracking(ElkBuffBars.db.profile.hidetrackingframe)				end,			order = 105,		},		shiftannounce = {			type = "toggle", name = L["Shift-click to announce"], desc = L["Toggles shift-click announcing of buffs to party"],			get = function() return ElkBuffBars.db.profile.shiftannounce end,			set = function(v)					ElkBuffBars.db.profile.shiftannounce = v				end,			order = 106,		},		announceoutofparty = {			type = "toggle", name = L["Announce in /say"], desc = L["Toggles announcement of buffs in /say when not in a party"],			get = function() return ElkBuffBars.db.profile.announceoutofparty end,			set = function(v)					ElkBuffBars.db.profile.announceoutofparty = v				end,			order = 107,		},	}}local typeoverride_validate = {BUFF = "BUFF", DEBUFF = "DEBUFF", TENCH = "TENCH", TRACKING = "TRACKING", [""] = L["default"]}function ElkBuffBars:GetNameOptions(type, name)	return {		type = "group", name = name, desc = name, args = {			name = {				type = "text", name = L["Shown Name"], desc = L["Sets the name to show"], usage = "none",				get = function() return ElkBuffBars.db.profile.nameoverride[type][name] or "" end,				set = function(v) ElkBuffBars.db.profile.nameoverride[type][name] = v ~= "" and v or nil end,			},			type = {				type = "text", name = L["New Type"], desc = L["Sets the new type"],				get = function() return ElkBuffBars.db.profile.typeoverride[type][name] or "" end,				set = function(v) ElkBuffBars.db.profile.typeoverride[type][name] = (v ~= "" and v ~= type) and v or nil end,				validate = typeoverride_validate,			}		}	}endlocal function SetNameFilter(groupid, white, type, name, value)	local bg = ElkBuffBars.bargroups[groupid]	local filter = bg.layout.filter	local ftname = white and "names_include" or "names_exclude"	if value then		if not filter[ftname] then			filter[ftname] = {}		end		if not filter[ftname][type] then			filter[ftname][type] = {}		end		filter[ftname][type][name] = true	elseif filter[ftname] and filter[ftname][type] then		filter[ftname][type][name] = nil		local hasdata = false		for _ in pairs(filter[ftname][type]) do			hasdata = true			break		end		if not hasdata then			filter[ftname][type] = nil		end		hasdata = false		for _ in pairs(filter[ftname]) do			hasdata = true			break		end		if not hasdata then			filter[ftname] = nil		end	end	bg:UpdateData()endlocal groupoptionscache = {}function ElkBuffBars:GetGroupOptions(id)	if not groupoptionscache[id] then		groupoptionscache[id] = {			type = "group", name = (L["Group %d"]):format(id), desc = (L["Settings for Group %d"]):format(id), args = {				anchorshown = {					type = "toggle", name = L["Show Anchor"], desc = L["Toggles Anchor"],					get = function() return ElkBuffBars.db.profile.bargroups[id].anchorshown end,					set = function() ElkBuffBars.bargroups[id]:ToggleAnchor() end,					order = 101,				},				anchortext = {					type = "text", name = L["Name"], desc = L["Sets the group's name"], usage = "",					get = function() return ElkBuffBars.db.profile.bargroups[id].anchortext end,					set = function(v)							local bg = ElkBuffBars.bargroups[id]							bg.layout.anchortext = v							if bg.layout.anchorshown then								bg:ToggleAnchor(true)							end						end,					order = 102,				},				bars = {					type = "group", name = L["Bar Layout"], desc = L["Sets the layout for this group's bars"], args = {						bar = {							type = "group", name = L["Bar"], desc = L["Settings for the statusbar"], args = {								bar = {									type = "toggle", name = L["Show Statusbar"], desc = L["Toggles display of the statusbar"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.bar end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.bar = v											bg:SetLayout()										end,									order = 101,								},								bartexture = {									type = "text", name = L["Bar Texture"], desc = L["Sets the bar texture"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.bartexture end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.bartexture = v											bg:SetLayout()										end,									validate = LSM3_statusbar,									order = 102,								},								barcolor = {									type = "color", name = L["Bar Color"], desc = L["Sets the color for the bar"],									get = function() return unpack(ElkBuffBars.db.profile.bargroups[id].bars.barcolor) end,									set = function(r, g, b, a)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.barcolor[1] = r											bg.layout.bars.barcolor[2] = g											bg.layout.bars.barcolor[3] = b											bg.layout.bars.barcolor[4] = a											bg:SetLayout()											if bg.layout.anchorshown then												bg:ToggleAnchor(true)											end										end,									hasAlpha = true,									order = 103,								}, -- <color set>								bgbar = {									type = "toggle", name = L["Show Background"], desc = L["Toggles display of the bar background"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.bgbar end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.bgbar = v											bg:SetLayout()										end,									order = 104,								},								barbgcolor = {									type = "color", name = L["Background Color"], desc = L["Sets the color for the bar's background"],									get = function() return unpack(ElkBuffBars.db.profile.bargroups[id].bars.barbgcolor) end,									set = function(r, g, b, a)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.barbgcolor[1] = r											bg.layout.bars.barbgcolor[2] = g											bg.layout.bars.barbgcolor[3] = b											bg.layout.bars.barbgcolor[4] = a											bg:SetLayout()										end,									hasAlpha = true,									order = 105,								}, -- <color set>								debufftypecolor = {									type = "toggle", name = L["Debuff Coloring"], desc = L["Toggles if the bar is colored by debuff type"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.debufftypecolor end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.debufftypecolor = v											bg:UpdateBars()										end,									order = 106,								},								barright = {									type = "toggle", name = L["Bar Direction LTR"], desc = L["Toggles if the bar depletes from left to right"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.barright end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.barright = v											bg:SetLayout()										end,									order = 107,								},								timelessfull = {									type = "toggle", name = L["Full bars for timeless"], desc = L["Toggles full bars for timeless buffs"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.timelessfull end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.timelessfull = v											bg:UpdateData()										end,									order = 108,								},							},							order = 101,						},						icon = {							type = "group", name = L["Icon"], desc = L["Settings for the icon"], args = {								icon = {									type = "text", name = L["Position"], desc = L["Sets icon showing"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.icon or "false" end,									set = function(v)											if v == "false" then v = false end											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.icon = v											bg:SetLayout()										end,									validate = {["false"] = L["hide"], ["LEFT"] = "Left Side", ["RIGHT"] = "Right Side"},									order = 101,								}, -- "LEFT", "RIGHT", false								iconcount = {									type = "toggle", name = L["Buff Stacks - Show"], desc = L["Toggles showing of buff stacks on the icon"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.iconcount end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.iconcount = v											bg:SetLayout()										end,									order = 102,								}, -- true, false								iconcountanchor = {									type = "text", name = L["Buff Stacks - Anchor"], desc = L["Sets the anchor for the buff stacks on the icon"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.iconcountanchor end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.iconcountanchor = v											bg:SetLayout()										end,									validate = {"TOPLEFT", "TOP", "TOPRIGHT", "LEFT", "CENTER", "RIGHT", "BOTTOMLEFT", "BOTTOM", "BOTTOMRIGHT"},									order = 103,								}, -- <anchor>								iconcountfont = {									type = "text", name = L["Buff Stacks - Font"], desc = L["Sets the font for the buff stacks on the icon"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.iconcountfont end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.iconcountfont = v											bg:SetLayout()										end,									validate = LSM3_font,									order = 104								}, -- <LSM3:font>								iconcountfontsize =  {									type = "range", name = L["Buff Stacks - Font Size"], desc = L["Sets the font size for the buff stacks on the icon"],									min = 4, max = 32, step = 1,									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.iconcountfontsize end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.iconcountfontsize = tonumber(v)											bg:SetLayout()										end,									order = 105,								}, -- <font size>								iconcountcolor = {									type = "color", name = L["Buff Stacks - Font Color"], desc = L["Sets the font color for the buff stacks on the icon"],									get = function() return unpack(ElkBuffBars.db.profile.bargroups[id].bars.iconcountcolor) end,									set = function(r, g, b, a)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.iconcountcolor[1] = r											bg.layout.bars.iconcountcolor[2] = g											bg.layout.bars.iconcountcolor[3] = b											bg.layout.bars.iconcountcolor[4] = a											bg:SetLayout()										end,									hasAlpha = true,									order = 106,								}, -- <color set>							},							order = 102						},						texttl = {							type = "group", name = L["Text topleft"], desc = L["Settings for the topleft text"], args = {								textTL = {									type = "text", name = L["Text shown"], desc = L["Sets the text which is shown"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.textTL or "false" end,									set = function(v)											if v == "false" then v = false end											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textTL = v											bg:SetLayout()										end,									validate = {["false"] = L["hide"], ["NAME"] = L["Name"], ["NAMERANK"] = L["Name, Rank"], ["NAMECOUNT"] = L["Name, Count"], ["NAMERANKCOUNT"] = L["Name, Rank, Count"], ["RANK"] = L["Rank"], ["COUNT"] = L["Count"], ["TIMELEFT"] = L["Time Left"], ["DEBUFFTYPE"] = L["Debuff Type"]},									order = 101,								}, -- false, "NAME", "NAMERANK", "NAMECOUNT", "NAMERANKCOUNT", "RANK", "COUNT", "TIMELEFT", "DEBUFFTYPE"								textTLfont = {									type = "text", name = L["Font"], desc = L["Sets the font"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.textTLfont end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textTLfont = v											bg:SetLayout()										end,									validate = LSM3_font,									order = 102,								}, -- <LSM3:font>								textTLfontsize = {									type = "range", name = L["Font Size"], desc = L["Sets the font size"],									min = 4, max = 32, step = 1,									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.textTLfontsize end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textTLfontsize = tonumber(v)											bg:SetLayout()										end,									order = 102,								}, -- <font size>								textTLcolor = {									type = "color", name = L["Font Color"], desc = L["Sets the font color"],									get = function() return unpack(ElkBuffBars.db.profile.bargroups[id].bars.textTLcolor) end,									set = function(r, g, b, a)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textTLcolor[1] = r											bg.layout.bars.textTLcolor[2] = g											bg.layout.bars.textTLcolor[3] = b											bg.layout.bars.textTLcolor[4] = a											bg:SetLayout()										end,									hasAlpha = true,									order = 103,								}, -- <color set>								textTLalign = {									type = "text", name = L["Alignment"], desc = L["Sets the text alignment (only if topleft text hidden)"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.textTLalign end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textTLalign = v											bg:SetLayout()										end,									validate = {"left", "center", "right"},									order = 104								}, -- left, center, right							},							order = 103,						},						texttr = {							type = "group", name = L["Text topright"], desc = L["Settings for the topright text"], args = {								textTR = {									type = "text", name = L["Text shown"], desc = L["Sets the text which is shown"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.textTR or "false" end,									set = function(v)											if v == "false" then v = false end											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textTR = v											bg:SetLayout()										end,									validate = {["false"] = L["hide"], ["NAME"] = L["Name"], ["NAMERANK"] = L["Name, Rank"], ["NAMECOUNT"] = L["Name, Count"], ["NAMERANKCOUNT"] = L["Name, Rank, Count"], ["RANK"] = L["Rank"], ["COUNT"] = L["Count"], ["TIMELEFT"] = L["Time Left"], ["DEBUFFTYPE"] = L["Debuff Type"]},									order = 101,								}, -- false, "NAME", "NAMERANK", "NAMECOUNT", "NAMERANKCOUNT", "RANK", "COUNT", "TIMELEFT", "DEBUFFTYPE"								textTRfont = {									type = "text", name = L["Font"], desc = L["Sets the font"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.textTRfont end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textTRfont = v											bg:SetLayout()										end,									validate = LSM3_font,									order = 102,								}, -- <LSM3:font>								textTRfontsize = {									type = "range", name = L["Font Size"], desc = L["Sets the font size"],									min = 4, max = 32, step = 1,									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.textTRfontsize end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textTRfontsize = tonumber(v)											bg:SetLayout()										end,									order = 103,								}, -- <font size>								textTRcolor = {									type = "color", name = L["Font Color"], desc = L["Sets the font color"],									get = function() return unpack(ElkBuffBars.db.profile.bargroups[id].bars.textTRcolor) end,									set = function(r, g, b, a)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textTRcolor[1] = r											bg.layout.bars.textTRcolor[2] = g											bg.layout.bars.textTRcolor[3] = b											bg.layout.bars.textTRcolor[4] = a											bg:SetLayout()										end,									hasAlpha = true,									order = 104,								}, -- <color set>							},							order = 104,						},						textbl = {							type = "group", name = L["Text bottomleft"], desc = L["Settings for the bottomleft text"], args = {								textBL = {									type = "text", name = L["Text shown"], desc = L["Sets the text which is shown"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.textBL or "false" end,									set = function(v)											if v == "false" then v = false end											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textBL = v											bg:SetLayout()										end,									validate = {["false"] = L["hide"], ["NAME"] = L["Name"], ["NAMERANK"] = L["Name, Rank"], ["NAMECOUNT"] = L["Name, Count"], ["NAMERANKCOUNT"] = L["Name, Rank, Count"], ["RANK"] = L["Rank"], ["COUNT"] = L["Count"], ["TIMELEFT"] = L["Time Left"], ["DEBUFFTYPE"] = L["Debuff Type"]},									order = 101,								}, -- false, "NAME", "NAMERANK", "NAMECOUNT", "NAMERANKCOUNT", "RANK", "COUNT", "TIMELEFT", "DEBUFFTYPE"								textBLfont = {									type = "text", name = L["Font"], desc = L["Sets the font"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.textBLfont end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textBLfont = v											bg:SetLayout()										end,									validate = LSM3_font,									order = 102,								}, -- <LSM3:font>								textBLfontsize = {									type = "range", name = L["Font Size"], desc = L["Sets the font size"],									min = 4, max = 32, step = 1,									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.textBLfontsize end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textBLfontsize = tonumber(v)											bg:SetLayout()										end,									order = 103,								}, -- <font size>								textBLcolor = {									type = "color", name = L["Font Color"], desc = L["Sets the font color"],									get = function() return unpack(ElkBuffBars.db.profile.bargroups[id].bars.textBLcolor) end,									set = function(r, g, b, a)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textBLcolor[1] = r											bg.layout.bars.textBLcolor[2] = g											bg.layout.bars.textBLcolor[3] = b											bg.layout.bars.textBLcolor[4] = a											bg:SetLayout()										end,									hasAlpha = true,									order = 104,								}, -- <color set>								textBLalign = {									type = "text", name = L["Alignment"], desc = L["Sets the text alignment (only if bottomleft text hidden)"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.textBLalign end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textBLalign = v											bg:SetLayout()										end,									validate = {"left", "center", "right"},									order = 105,								}, -- left, center, right							},							order = 105,						},						textbr = {							type = "group", name = L["Text bottomright"], desc = L["Settings for the bottomright text"], args = {								textBR = {									type = "text", name = L["Text shown"], desc = L["Sets the text which is shown"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.textBR or "false" end,									set = function(v)											if v == "false" then v = false end											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textBR = v											bg:SetLayout()										end,									validate = {["false"] = L["hide"], ["NAME"] = L["Name"], ["NAMERANK"] = L["Name, Rank"], ["NAMECOUNT"] = L["Name, Count"], ["NAMERANKCOUNT"] = L["Name, Rank, Count"], ["RANK"] = L["Rank"], ["COUNT"] = L["Count"], ["TIMELEFT"] = L["Time Left"], ["DEBUFFTYPE"] = L["Debuff Type"]},									order = 101,								}, -- false, "NAME", "NAMERANK", "NAMECOUNT", "NAMERANKCOUNT", "RANK", "COUNT", "TIMELEFT", "DEBUFFTYPE"								textBRfont = {									type = "text", name = L["Font"], desc = L["Sets the font"],									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.textBRfont end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textBRfont = v											bg:SetLayout()										end,									validate = LSM3_font,									order = 102,								}, -- <LSM3:font>								textBRfontsize = {									type = "range", name = L["Font Size"], desc = L["Sets the font size"],									min = 4, max = 32, step = 1,									get = function() return ElkBuffBars.db.profile.bargroups[id].bars.textBRfontsize end,									set = function(v)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textBRfontsize = tonumber(v)											bg:SetLayout()										end,									order = 103,								}, -- <font size>								textBRcolor = {									type = "color", name = L["Font Color"], desc = L["Sets the font color"],									get = function() return unpack(ElkBuffBars.db.profile.bargroups[id].bars.textBRcolor) end,									set = function(r, g, b, a)											local bg = ElkBuffBars.bargroups[id]											bg.layout.bars.textBRcolor[1] = r											bg.layout.bars.textBRcolor[2] = g											bg.layout.bars.textBRcolor[3] = b											bg.layout.bars.textBRcolor[4] = a											bg:SetLayout()										end,									hasAlpha = true,									order = 104,								}, -- <color set>							},							order = 106,						},						abbreviate_name = {							type = "range", name = L["Abbreviate Name"], desc = L["Abbreviate names longer than this (0 = disabled)"],							min = 0, max = 100, step = 1,							get = function() return ElkBuffBars.db.profile.bargroups[id].bars.abbreviate_name end,							set = function(v)									local bg = ElkBuffBars.bargroups[id]									bg.layout.bars.abbreviate_name = tonumber(v)									bg:UpdateText()								end,							order = 107,						},						timeformat = {							type = "text", name = L["Time Format"], desc = L["Sets the format the time is shown in"],							get = function() return ElkBuffBars.db.profile.bargroups[id].bars.timeformat end,							set = function(v)									local bg = ElkBuffBars.bargroups[id]									bg.layout.bars.timeformat = v									bg:UpdateTimeleft()								end,							validate = {"DEFAULT", "EXTENDED", "FULL", "SHORT", "CONDENSED"},							order = 108,						}, -- "DEFAULT", "EXTENDED", "FULL", "SHORT", "CONDENSED"						padding = {							type = "range", name = L["Padding"], desc = L["Sets the padding for the text strings"],							min = 0, max = 10, step = 1,							get = function() return ElkBuffBars.db.profile.bargroups[id].bars.padding end,							set = function(v)									local bg = ElkBuffBars.bargroups[id]									bg.layout.bars.padding = tonumber(v)									bg:SetLayout()								end,							order = 109,						},						tooltipanchor = {							type = "text", name = L["Tooltip Anchor"], desc = L["Sets the anchor for tooltips"],							get = function() return ElkBuffBars.db.profile.bargroups[id].bars.tooltipanchor end,							set = function(v)									local bg = ElkBuffBars.bargroups[id]									bg.layout.bars.tooltipanchor = v								end,							validate = {"default", "ANCHOR_TOPRIGHT", "ANCHOR_RIGHT","ANCHOR_BOTTOMRIGHT", "ANCHOR_TOPLEFT", "ANCHOR_LEFT", "ANCHOR_BOTTOMLEFT", "ANCHOR_CURSOR", "ANCHOR_PRESERVE", "ANCHOR_NONE"},							order = 110,						},						height = {							type = "range", name = L["Height"], desc = L["Sets the bar hight"],							min = 0, max = 100, step = 1,							get = function() return ElkBuffBars.db.profile.bargroups[id].bars.height end,							set = function(v)									local bg = ElkBuffBars.bargroups[id]									local blayout = bg.layout.bars									blayout.height = tonumber(v)									if blayout.height > blayout.width then blayout.height = blayout.width end									bg:SetLayout()									bg:UpdateBarPositions()								end,							order = 111,						},						width = {							type = "range", name = L["Width"], desc = L["Sets the bar Width"],							min = 0, max = 500, step = 1,							get = function() return ElkBuffBars.db.profile.bargroups[id].bars.width end,							set = function(v)									local bg = ElkBuffBars.bargroups[id]									local blayout = bg.layout.bars									blayout.width = tonumber(v)									if blayout.width < blayout.height then blayout.width = blayout.height end									bg:SetLayout()									if bg.layout.anchorshown then										bg:ToggleAnchor(true)									else										bg:UpdateBarPositions()									end								end,							order = 112,						},						alpha = {							type = "range", name = L["Alpha"], desc = L["Sets the groups alpha value"],							isPercent = true,							get = function() return ElkBuffBars.db.profile.bargroups[id].bars.alpha end,							set = function(v)									local bg = ElkBuffBars.bargroups[id]									bg.layout.bars.alpha = tonumber(v)									bg:SetLayout()								end,							order = 113,						},					},					order = 103,				},				barspacing = {					type = "range", name = L["Bar Spacing"], desc = L["Sets gap between bars"],					min = 0, max = 50, step = 1,					get = function() return ElkBuffBars.db.profile.bargroups[id].barspacing end,					set = function(v)							local bg = ElkBuffBars.bargroups[id]							bg.layout.barspacing = tonumber(v)							bg:UpdateBarPositions()						end,					order = 104,				},				growup = {					type = "toggle", name = L["Grow up"], desc = L["Toggles direction of buffs"],					get = function() return ElkBuffBars.db.profile.bargroups[id].growup end,					set = function(v)							local bg = ElkBuffBars.bargroups[id]							bg.layout.growup = v							bg.layout.stickto = nil							bg.layout.stickside = nil							bg:SetLayout()							bg:SetPosition()						end,					order = 105,				},				sorting = {					type = "text", name = L["Sorting"], desc = L["Sets sorting of buffs"],					get = function() return ElkBuffBars.db.profile.bargroups[id].sorting end,					set = function(v)							local bg = ElkBuffBars.bargroups[id]							bg.layout.sorting = v							bg:UpdateData()						end,					validate = {"name", "none", "timeleft", "timemax"},					order = 106,				},				filter = {					type = "group", name = L["Filter"], desc = L["Sets the buffs to show"], args = {						type = {							type = "text", name = L["Type"], desc = L["Sets which types of buffs to show"],							get = function(k) return ElkBuffBars.db.profile.bargroups[id].filter.type[k] or false end,							set = function(k, v)									local bg = ElkBuffBars.bargroups[id]									bg.layout.filter.type[k] = v or nil									bg:UpdateData()								end,							multiToggle = true,							validate = {"BUFF", "DEBUFF", "TENCH", "TRACKING"},							order = 101,						},						untilcancelled = {							type = "text", name = L["Timeless Buffs"], desc = L["Sets if and how to filter Timeless Buffs"],							get = function() return ElkBuffBars.db.profile.bargroups[id].filter.untilcancelled or "none" end,							set = function(v)									local bg = ElkBuffBars.bargroups[id]									if v == "none" then v = nil end									bg.layout.filter.untilcancelled = v									bg:UpdateData()								end,							validate = {only = L["whitelist"], none = L["don't filter"], hide = L["blacklist"]},							order = 102,						},						timemax_min = {							type = "text", name = L["Min. Timemax"], desc = L["Sets a minimum duration for buffs to show."], usage = L["time in seconds"],							get = function() return ElkBuffBars.db.profile.bargroups[id].filter.timemax_min or "" end,							set = function(v)									v = tonumber(v)									local bg = ElkBuffBars.bargroups[id]									bg.layout.filter.timemax_min = (v ~= 0) and v or nil									bg:UpdateData()								end,							order = 103,						},						timemax_max = {							type = "text", name = L["Max. Timemax"], desc = L["Sets a maximum duration for buffs to show."], usage = L["time in seconds"],							get = function() return ElkBuffBars.db.profile.bargroups[id].filter.timemax_max or "" end,							set = function(v)									v = tonumber(v)									local bg = ElkBuffBars.bargroups[id]									bg.layout.filter.timemax_max = (v ~= 0) and v or nil									bg:UpdateData()								end,							order = 104,						},						names_include = {							type = "group", name = L["White List"], desc = L["Only show buffs on white list (disabled if empty)"],							args = {								BUFF = {									type = "text", name = "BUFF", desc = "BUFF",									get = function(k)											local ni = ElkBuffBars.db.profile.bargroups[id].filter.names_include											return ni and ni.BUFF and ni.BUFF[k] or false										end,									set = function(name, value) SetNameFilter(id, true, "BUFF", name, value) end,									multiToggle = true,									validate = knownnames_validate.BUFF,								},								DEBUFF = {									type = "text", name = "DEBUFF", desc = "DEBUFF",									get = function(k)											local ni = ElkBuffBars.db.profile.bargroups[id].filter.names_include											return ni and ni.DEBUFF and ni.DEBUFF[k] or false										end,									set = function(name, value) SetNameFilter(id, true, "DEBUFF", name, value) end,									multiToggle = true,									validate = knownnames_validate.DEBUFF,								},								TENCH = {									type = "text", name = "TENCH", desc = "TENCH",									get = function(k)											local ni = ElkBuffBars.db.profile.bargroups[id].filter.names_include											return ni and ni.TENCH and ni.TENCH[k] or false										end,									set = function(name, value) SetNameFilter(id, true, "TENCH", name, value) end,									multiToggle = true,									validate = knownnames_validate.TENCH,								},								TRACKING = {									type = "text", name = "TRACKING", desc = "TRACKING",									get = function(k)											local ni = ElkBuffBars.db.profile.bargroups[id].filter.names_include											return ni and ni.TRACKING and ni.TRACKING[k] or false										end,									set = function(name, value) SetNameFilter(id, true, "TRACKING", name, value) end,									multiToggle = true,									validate = knownnames_validate.TRACKING,								},							},							order = 105,						},						names_exclude = {							type = "group", name = L["Black List"], desc = L["Don't show buffs on black list"],							args = {								BUFF = {									type = "text", name = "BUFF", desc = "BUFF",									get = function(k)											local ne = ElkBuffBars.db.profile.bargroups[id].filter.names_exclude											return ne and ne.BUFF and ne.BUFF[k] or false										end,									set = function(name, value) SetNameFilter(id, false, "BUFF", name, value) end,									multiToggle = true,									validate = knownnames_validate.BUFF,								},								DEBUFF = {									type = "text", name = "DEBUFF", desc = "DEBUFF",									get = function(k)											local ne = ElkBuffBars.db.profile.bargroups[id].filter.names_exclude											return ne and ne.DEBUFF and ne.DEBUFF[k] or false										end,									set = function(name, value) SetNameFilter(id, false, "DEBUFF", name, value) end,									multiToggle = true,									validate = knownnames_validate.DEBUFF,								},								TENCH = {									type = "text", name = "TENCH", desc = "TENCH",									get = function(k)											local ne = ElkBuffBars.db.profile.bargroups[id].filter.names_exclude											return ne and ne.TENCH and ne.TENCH[k] or false										end,									set = function(name, value) SetNameFilter(id, false, "TENCH", name, value) end,									multiToggle = true,									validate = knownnames_validate.TENCH,								},								TRACKING = {									type = "text", name = "TRACKING", desc = "TRACKING",									get = function(k)											local ne = ElkBuffBars.db.profile.bargroups[id].filter.names_exclude											return ne and ne.TRACKING and ne.TRACKING[k] or false										end,									set = function(name, value) SetNameFilter(id, false, "TRACKING", name, value) end,									multiToggle = true,									validate = knownnames_validate.TRACKING,								},							},							order = 106,						},					},					order = 107,				},				target = {					type = "text", name = L["Target"], desc = L["Sets whos buffs to show"],					get = function() return ElkBuffBars.db.profile.bargroups[id].target end,					set = function(v)							local bg = ElkBuffBars.bargroups[id]							bg.layout.target = v							bg:UpdateData()						end,					validate = {"focus", "pet", "player", "target"},					order = 108,				},				clickthrough = {					type = "toggle", name = L["Disable Mouse"], desc = L["Disable mouse input to allow click-through"],					get = function() return ElkBuffBars.db.profile.bargroups[id].bars.clickthrough end,					set = function(v)							local bg = ElkBuffBars.bargroups[id]							bg.layout.bars.clickthrough = v							bg:SetLayout()						end,					order = 109,				},				copylayout = {					type = "text", name = L["Copy Layout"], desc = L["Copys the layout from another bargroup"], usage = L["group id of the layout"],					get = false,					set = function(v)							v = tonumber(v)							if v ~= id and ElkBuffBars.bargroups[v] then								ElkBuffBars:CopyBarLayout(ElkBuffBars.bargroups[id].layout, ElkBuffBars.bargroups[v].layout)							end						end,					order = 110,				},				resetpos = {					type = "execute", name = L["Reset Position"], desc = L["Resets the bargroup's position to screen center"],					func = function()							local bg = ElkBuffBars.bargroups[id]							bg.layout.x = nil							bg.layout.y = nil							bg.stickto = nil							bg.stickside = nil							bg:SetPosition()						end,					order = 111,				},				remove = {					type = "execute", name = L["Remove Group"], desc = L["Removes the bargroup"],					func = function()							Dewdrop:Close()							ElkBuffBars:RemoveBarGroup(id)						end,					order = 112,				},			}		}	end	return groupoptionscache[id]endfunction ElkBuffBars:ShowDewdrop()	Dewdrop:Open(UIParent, "children", AO_allopts, "cursorX", true, "cursorY", true)endElkBuffBars:RegisterChatCommand({"/ebb"}, {	type = "group", args = {		config = {			type = "execute", name = "config", desc = L["Shows the config menu"],			func = function() ElkBuffBars:ShowDewdrop() end,		}	}})ElkBuffBars.OnMenuRequest = AO_allopts