

local parser = ParserLib:GetInstance("1.1")
local dewdrop = DewdropLib:GetInstance("1.0")
local version = "0.4.7"



SimpleCombatLog = {}
local self = SimpleCombatLog


-- Unnamed frame for events.
if not self.frame then
	self.frame = CreateFrame("Frame");
	self.frame:RegisterEvent("PLAYER_ENTERING_WORLD");
	self.frame:SetScript("OnEvent", function() self:OnEvent() end );
end


-- Event handler for ParserLib.
local function OnCombatEvent(event, info)
	self:OnCombatEvent(event, info)
end



-- Search for the event in eventList.
local function SearchList(list, text)
	for i in list do
		for j in list[i] do
			if list[i][j] == text then return true end
		end
	end
end


		

self.eventTypes = {
	"selfhit", 
	"otherhit", 
	"selfspell", 
	"otherspell", 
	"selfdot", 
	"otherdot", 
	"death", 
	"aura", 
	"enchant", 
	"trade",
	"experience", 
	"honor", 
	"reputation",
	"fail",
}



self.eventList = {

	otherhit = {
		"CHAT_MSG_COMBAT_CREATURE_VS_CREATURE_HITS",
		"CHAT_MSG_COMBAT_CREATURE_VS_CREATURE_MISSES",
		"CHAT_MSG_COMBAT_CREATURE_VS_PARTY_HITS",
		"CHAT_MSG_COMBAT_CREATURE_VS_PARTY_MISSES",
		"CHAT_MSG_COMBAT_CREATURE_VS_SELF_HITS",
		"CHAT_MSG_COMBAT_CREATURE_VS_SELF_MISSES",
		"CHAT_MSG_COMBAT_FRIENDLYPLAYER_HITS",
		"CHAT_MSG_COMBAT_FRIENDLYPLAYER_MISSES",
		"CHAT_MSG_COMBAT_HOSTILEPLAYER_HITS",
		"CHAT_MSG_COMBAT_HOSTILEPLAYER_MISSES",
		"CHAT_MSG_COMBAT_PARTY_HITS",
		"CHAT_MSG_COMBAT_PARTY_MISSES",
	},
		
	reputation = {
		"CHAT_MSG_COMBAT_FACTION_CHANGE",
	},
		
	death = {
		"CHAT_MSG_COMBAT_FRIENDLY_DEATH",
		"CHAT_MSG_COMBAT_HOSTILE_DEATH",
	},

	honor = {
		"CHAT_MSG_COMBAT_HONOR_GAIN",
	},

	selfhit = {
		"CHAT_MSG_COMBAT_PET_HITS",
		"CHAT_MSG_COMBAT_PET_MISSES",
		"CHAT_MSG_COMBAT_SELF_HITS",
		"CHAT_MSG_COMBAT_SELF_MISSES",
		
	},
	
	experience = {
		"CHAT_MSG_COMBAT_XP_GAIN",
	},
	
	aura = {
		"CHAT_MSG_SPELL_AURA_GONE_OTHER",
		"CHAT_MSG_SPELL_AURA_GONE_SELF",
		"CHAT_MSG_SPELL_AURA_GONE_PARTY",
		"CHAT_MSG_SPELL_BREAK_AURA",
	},
	
	otherspell = {
		"CHAT_MSG_SPELL_CREATURE_VS_CREATURE_BUFF",
		"CHAT_MSG_SPELL_CREATURE_VS_CREATURE_DAMAGE",
		"CHAT_MSG_SPELL_CREATURE_VS_PARTY_BUFF",
		"CHAT_MSG_SPELL_CREATURE_VS_PARTY_DAMAGE",
		"CHAT_MSG_SPELL_CREATURE_VS_SELF_BUFF",
		"CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE",
		"CHAT_MSG_SPELL_FRIENDLYPLAYER_BUFF",
		"CHAT_MSG_SPELL_FRIENDLYPLAYER_DAMAGE",
		"CHAT_MSG_SPELL_HOSTILEPLAYER_BUFF",
		"CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE",
		"CHAT_MSG_SPELL_PARTY_BUFF",
		"CHAT_MSG_SPELL_PARTY_DAMAGE",
	},


	fail = {
		"CHAT_MSG_SPELL_FAILED_LOCALPLAYER",
	},
	
	enchant = {
		"CHAT_MSG_SPELL_ITEM_ENCHANTMENTS",
	},
	
	otherdot = {
		"CHAT_MSG_SPELL_PERIODIC_CREATURE_BUFFS",
		"CHAT_MSG_SPELL_PERIODIC_CREATURE_DAMAGE",
		"CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_BUFFS",
		"CHAT_MSG_SPELL_PERIODIC_FRIENDLYPLAYER_DAMAGE",
		"CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_BUFFS",
		"CHAT_MSG_SPELL_PERIODIC_HOSTILEPLAYER_DAMAGE",
		"CHAT_MSG_SPELL_PERIODIC_PARTY_BUFFS",
		"CHAT_MSG_SPELL_PERIODIC_PARTY_DAMAGE",
		"CHAT_MSG_SPELL_DAMAGESHIELDS_ON_OTHERS",
	},


	selfdot = {
		"CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS",
		"CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE",
		"CHAT_MSG_SPELL_DAMAGESHIELDS_ON_SELF",
	},
	
	selfspell = {
		"CHAT_MSG_SPELL_PET_BUFF",
		"CHAT_MSG_SPELL_PET_DAMAGE",
		"CHAT_MSG_SPELL_SELF_BUFF",
		"CHAT_MSG_SPELL_SELF_DAMAGE",
	},

	trade = {
		"CHAT_MSG_SPELL_TRADESKILLS",
	}
}




function SimpleCombatLog:Colorize(value, valueType)
	local c = self:GetColor(valueType)
	
	if not c then return value end

	if not c.b or not c.g or not c.r then
		self:Print("Invalid color field for value " .. valueType, 1, true, 1, 0, 0)
	end
	
	return string.format("|cff%02x%02x%02x%s|r", (c.r*255), (c.g*255), (c.b*255), value)

end

function SimpleCombatLog:GetColor(valueType)
	if not self.savedVars.colors or not self.savedVars.colors[valueType] then
		return self.defaultColors[valueType]
	else
		return self.savedVars.colors[valueType]
	end
end





function SimpleCombatLog:OnEvent()
	if event == "PLAYER_ENTERING_WORLD" then
		self:Initialize()
	end
end

function SimpleCombatLog:Initialize()

	if self.initialized then return end
	
	
	-- Checking saved variables.	
	if not SCL_Config then self:LoadDefaultSettings() else self.savedVars = SCL_Config end

	-- Check for old version saved variables.
	if self.savedVars and not self.savedVars.events then self:LoadDefaultSettings()	end

	if not self.savedVars.minimapButton then self.savedVars.minimapButton = {} end
	
	
	-- Slash commands.
	SLASH_SCL1 = "/scl";
	SlashCmdList["SCL"] = function (msg) self:SlashCommand(msg) end		

	MyMinimapButton:Create("SimpleCombatLog", self.savedVars.minimapButton)
	MyMinimapButton:SetIcon("SimpleCombatLog","Interface\\Icons\\INV_Misc_Food_66")
	MyMinimapButton:SetTooltip("SimpleCombatLog", self.loc.buttonTooltip)

	dewdrop:Register(SimpleCombatLogMinimapButton, 'children', function(level, value) self:OptionOpen(level, value) end )
	
	self.needRefreshChatEvent = true

	self:RefreshSettings()

	self.frame:UnregisterEvent("PLAYER_ENTERING_WORLD")

	
	self.initialized = true

	
end



function SimpleCombatLog:SlashCommand(msg)

	if msg == "suppress" then
		self.savedVars.nosuppress = not self.savedVars.nosuppress
		self.needRefreshChatEvent = true
		self:RefreshSettings()
		self:PrintHelp()
	elseif msg == "optionbutton" then	
		self.savedVars.nooptionbutton = not self.savedVars.nooptionbutton		
		self:RefreshSettings()
	elseif msg == "defaults" then	
		self:Print(self.loc.loaddefault, 1, true)
		self:LoadDefaultSettings()
	elseif msg == "option"  then
		dewdrop:Open(SimpleCombatLogMinimapButton)
		self:PrintHelp()
	else
		self:PrintHelp()
	end
	
	
	
end

function SimpleCombatLog:PrintHelp()
	
	local on
	
	if self.savedVars.nooptionbutton then	on = "Off"	else	on = "On"	end
	
	self:Print(string.format(	"optionbutton (|cff3333ff%s|r) : %s", on, self.loc.help.optionbutton), 1)
	
	if self.savedVars.nosuppress then		on = "Off"	else	on = "On"	end
		
	self:Print(string.format(	"suppress (|cff3333ff%s|r) : %s", on, self.loc.help.suppress), 1 )	
	self:Print(string.format(	"defaults : %s", self.loc.help.defaults), 1)
	self:Print(string.format( "option : %s", self.loc.help.option), 1)

end
		

function SimpleCombatLog:RefreshSettings()


	if self.savedVars.nooptionbutton then
--		MyMinimapButton:Disable("SimpleCombatLog")
	else
--		MyMinimapButton:Enable("SimpleCombatLog")
	end

	if self.needRefreshChatEvent then
		if self.savedVars.nosuppress then
			self:RefreshChatFrameEvents(true)
		else
			self:RefreshChatFrameEvents(false)
		end
		self.needRefreshChatEvent = nil
	end

	for i, v in self.eventTypes do
		if self.savedVars.events[v] and not parser:IsEventRegistered("SimpleCombatLog", self.eventList[v][1]) then
			for j in self.eventList[v] do
				parser:RegisterEvent("SimpleCombatLog", self.eventList[v][j], OnCombatEvent)
			end
		elseif not self.savedVars.events[v] and parser:IsEventRegistered("SimpleCombatLog", self.eventList[v][1]) then
			for j in self.eventList[v] do
				parser:UnregisterEvent("SimpleCombatLog", self.eventList[v][j], OnCombatEvent)
			end
		end
	end
		

	
end



function SimpleCombatLog:OnCombatEvent(event, info)




	if not self:FilterCheck(info) then return end
	
	if info.source == ParserLib_SELF then info.source = self.loc.you end
	if info.victim == ParserLib_SELF then info.victim = self.loc.you end
	if info.sourceGained == ParserLib_SELF then info.sourceGained = self.loc.you end
	
	info.source = self:ColorizeName(info.source)
	info.victim = self:ColorizeName(info.victim)
	info.sourceGained = self:ColorizeName(info.sourceGained)
	
	local extra, trailer
		
	if info.skill == ParserLib_MELEE then info.skill = "melee" end
	if info.skill == ParserLib_DAMAGESHIELD then info.skill = "damage shield" end
	
	if info.isCrit then info.amount = string.format("*%s*", info.amount) end
	if info.isDOT then info.amount = string.format("~%s~", info.amount) end
	
	if info.skill then
		info.skill = self:Colorize(info.skill, "skill")
	end
	
	
	if info.type == "hit" then

	
		if info.element then 
			info.amount = self:Colorize(info.amount, self:GetElementType(info.element))
		else
			info.amount = self:Colorize(info.amount, "physical")
		end
	
	
		if info.isCrit then
			extra = "crit"
		elseif info.isDOT then
			extra = "dot"
		else
			extra = "hit"
		end
		
		trailer = self:GetTrailerString(info)
		self:Print(string.format(self.patterns.hit, info.source, info.skill, extra, info.victim, info.amount) ..  trailer)
				
	elseif info.type == "heal" then
	
		info.amount = self:Colorize(info.amount, "heal")
		self:Print(string.format(self.patterns.heal, info.source, info.skill, info.victim, info.amount))
		
	elseif info.type == "debuff" then
	
		extra = self:Colorize("++", "debuff")
		if info.amountRank then
			info.skill = string.format("%s(%s)", info.skill, info.amountRank)
		end
		
		self:Print(string.format(self.patterns.debuff, info.victim, extra, info.skill))
		
	elseif info.type == "buff" then
	
		extra = self:Colorize("++", "buff")
		if info.amountRank then
			info.skill = string.format("%s(%s)", info.skill, info.amountRank)
		end		
		self:Print(string.format(self.patterns.buff, info.victim, extra, info.skill))
	
		
	elseif info.type == "fade" then
	
		self:Print(string.format(self.patterns.fade, info.victim, info.skill))
		
	elseif info.type == "dispel" then
	
		if not info.isFailed then
			self:Print(string.format(self.patterns.fade, info.victim, info.skill)) -- Use the same pattern 
		else
			self:Print(string.format(self.patterns.failDispel, info.source, info.victim, info.skill))
		end
		
	elseif info.type == "gain" then
		self:Print(string.format(self.patterns.gain, info.source, info.skill, info.victim, info.amount, info.attribute))
		
	elseif info.type == "extraattack" then

		self:Print(string.format(self.patterns.extraattack, info.victim, info.amount, info.skill))
		
	elseif info.type == "honor" then
		
		if info.isDishonor then
			self:Print(string.format(self.patterns.dishonor, info.source))
		else
			
			if info.source then
				trailer = string.format(" (%s %s)", info.sourceRank, info.source)
			else
				trailer = ""
			end
			
			self:Print(string.format(self.patterns.honor, info.amount)..trailer)
		
		end
		
	elseif info.type == "experience" then
		
		trailer = ""
		if info.source then trailer = string.format("%s(%s)", trailer, info.source) end
		if info.bonusAmount then	trailer = string.format("%s(%s%s)", trailer, info.bonusType, info.bonusAmount)	end
		if info.penaltyAmount then trailer = string.format("%s(%s%s)", trailer, info.penaltyType, info.penaltyAmount) end
		if info.amountGroupBonus then trailer = string.format("%s(G+%s)", trailer, info.amountGroupBonus) end
		if info.amountRaidPenalty then trailer = string.format("%s(R-%s)", trailer, info.amountRaidPenalty) end		
		self:Print(string.format(self.patterns.experience, info.amount).. trailer)
		
	elseif info.type == "reputation" then
	
		
		if not info.amount then
			trailer = info.rank
		else
			if info.isNegative then 
				trailer = string.format("-%s", info.amount)
			else
				trailer = string.format("+%s", info.amount)
			end
		end

		self:Print(string.format(self.patterns.reputation, info.faction, trailer))
		
		
	elseif info.type == "feedpet" then

		self:Print(string.format(self.patterns.feedpet, info.victim, info.item))		

	elseif info.type == "enchant" then
			
		self:Print(string.format(self.patterns.enchant, info.source, info.skill, info.victim, info.item))
		
	elseif info.type == "miss" then
			
		self:Print(string.format(self.patterns.miss, info.source, info.skill, self:Colorize(info.missType, "miss"), info.victim))

	elseif info.type == "cast" then
		
		if info.isBegin then
			self:Print(string.format(self.patterns.beginCast, info.source, info.skill))
		else
			if info.victim then
				self:Print(string.format(self.patterns.castTargetted, info.source, info.skill, info.victim))
			else
				self:Print(string.format(self.patterns.cast, info.source, info.skill))
			end
		end
		
	elseif info.type == "interrupt" then
	
		self:Print(string.format(self.patterns.interrupt, info.source, info.victim, info.skill))
				
	elseif info.type == "death" then
	
		if info.source then trailer = string.format("(%s)", info.source) else trailer = "" end
		self:Print(string.format(self.patterns.death, info.victim)..trailer)		
		
	elseif info.type == "environment" then

		trailer = self:GetTrailerString(info)
		self:Print(string.format(self.patterns.environment, info.victim, info.damageType, info.amount)..trailer)
		
	elseif info.type == "create" then
	
		self:Print(string.format(self.patterns.create, info.source, info.item))
				
	elseif info.type == "fail" and self.savedVars.showfailure then
	
		self:Print(string.format(self.patterns.fail, info.skill, info.reason))		
		
	elseif info.type == "drain" then
		
		self:Print(string.format(self.patterns.drain, info.source, info.skill, info.victim, info.amount, info.attribute))
		
		
	elseif info.type == "leech" then
	
		self:Print(string.format(self.patterns.leech, info.source, info.skill, info.victim, info.amount, info.attribute, info.sourceGained, info.amountGained, info.attributeGained))
		
	end
		
end

function SimpleCombatLog:GetElementType(element)
	if element == SPELL_SCHOOL0_CAP then return 'physical'
	elseif element == SPELL_SCHOOL1_CAP then return 'holy'
	elseif element == SPELL_SCHOOL2_CAP then return 'fire'
	elseif element == SPELL_SCHOOL3_CAP then return 'nature'
	elseif element == SPELL_SCHOOL4_CAP then return 'frost'
	elseif element == SPELL_SCHOOL5_CAP then return 'shadow'
	elseif element == SPELL_SCHOOL6_CAP then return 'arcane'
	else return element end
end


function SimpleCombatLog:GetTrailerString(info)
	local trailer = ""
	if info.isCrushing then trailer = trailer .. self.patterns.crushing end
	if info.isGlancing then trailer = trailer .. self.patterns.glancing end
	if info.amountAbsorb then trailer = trailer .. format(self.patterns.absorb, info.amountAbsorb) end
	if info.amountResist then trailer = trailer .. format(self.patterns.resist, info.amountResist) end
	if info.amountBlock then trailer = trailer .. format(self.patterns.block, info.amountBlock) end
	if info.amountVulnerable then trailer = trailer .. format(self.patterns.vulnerable, info.amountVulnerable) end
	return trailer
end

function SimpleCombatLog:FilterCheck(info)
	
	local f = self.savedVars.filters

	if info.type == "hit" then
		if f.hit then return false end
	elseif info.type == "heal" then
		if f.heal then return false end
	elseif info.type == "miss" then
		if f.miss then return false end
	elseif info.type == "gain" then
		if f.gain then return false end
	elseif info.type == "drain" or info.type == "leech" then
		if f.drain then return false end
	elseif info.type == "cast" then
		if f.cast then return false end
	end
	
	if not ( info.source or info.victim ) then return true end
	
	if info.source and not f[self:SearchName(info.source)] then return true end
	if info.victim and not f[self:SearchName(info.victim)] then return true end
	
	return false
	
end

function SimpleCombatLog:RefreshChatFrameEvents(enable)
	for index, value in ChatFrame2.messageTypeList do
		for eventIndex, eventValue in ChatTypeGroup[value] do
			if SearchList(self.eventList, eventValue) then
				if enable then
					ChatFrame2:RegisterEvent(eventValue);
				else
					ChatFrame2:UnregisterEvent(eventValue);
				end
			end
		end
	end
end



function SimpleCombatLog:SearchName(name)
	if name == ParserLib_SELF then return "player" end
	if name == UnitName("player") then return "player" end
	if name == UnitName("pet") then return "pet" end
	for i=1, GetNumPartyMembers() do 
		if name == UnitName("party"..i) then return "party" end
	end
	for i=1, GetNumRaidMembers() do
		if name == UnitName("raid"..i) then return "raid" end
	end
	if name == UnitName("target") then return "target" end	
	
	return 'other'
end

function SimpleCombatLog:ColorizeName(name)
	if not name then return end
	if name == self.loc.you then return self:Colorize(name, "player") end
	
	return self:Colorize(name, self:SearchName(name) )
end

function SimpleCombatLog:Print(msg, id, title, r,g,b)
	if not id then id = self.savedVars.outputframe end
	
	if title then
		msg = "SimpleCombatLog " .. version .. " : " .. msg
	end
		
	getglobal("ChatFrame"..id):AddMessage(msg,r,g,b)
end


function SimpleCombatLog:OptionOpen(level, value)

	if level == 1 then

		dewdrop:AddLine(
			'text', self.loc.title .. version,
			'isTitle', true
		)
		
		dewdrop:AddLine()

		dewdrop:AddLine(
			'text', self.loc.color,
			'hasArrow', true,
			'value', "color"
		)		
	
		dewdrop:AddLine(
			'text', self.loc.filter,
			'hasArrow', true,
			'value', "filter"
		)
		
		dewdrop:AddLine(
			'text', self.loc.event,
			'hasArrow', true,
			'value', "event"
		)		

		dewdrop:AddLine()

		dewdrop:AddLine(
			'text', self.loc.suppress,
			'func', 
			function() 
				self.savedVars.nosuppress = not self.savedVars.nosuppress
				self.needRefreshChatEvent = true
				self:RefreshSettings()
			end,
			'checked', not self.savedVars.nosuppress
		)
		
		dewdrop:AddLine()
		
		dewdrop:AddLine(
			'text', self.loc.default,
			'notCheckable', true,
			'func', function() self:LoadDefaultSettings() end
		)

		
	elseif level == 2 then
	
	
		if value == "color" then

			local c
			
			c = self:GetColor('player')
			dewdrop:AddLine(
				'text', self.loc.player,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,		
				'swatchFunc', function(r,g,b) self:OptionColorChange('player',r,g,b) end
			)
			
			c = self:GetColor('pet')
			dewdrop:AddLine(
				'text', self.loc.pet,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,
				'swatchFunc', function(r,g,b) self:OptionColorChange('pet',r,g,b) end
			)
			
			c = self:GetColor('party')
			dewdrop:AddLine(
				'text', self.loc.party,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,
				'swatchFunc', function(r,g,b) self:OptionColorChange('party',r,g,b) end
			)
			
			c = self:GetColor('raid')
			dewdrop:AddLine(
				'text', self.loc.raid,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,
				'swatchFunc', function(r,g,b) self:OptionColorChange('raid',r,g,b) end
			)
			
			c = self:GetColor('target')
			dewdrop:AddLine(
				'text', self.loc.target,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,
				'swatchFunc', function(r,g,b) self:OptionColorChange('target',r,g,b) end
			)
			
			c = self:GetColor('other')
			dewdrop:AddLine(
				'text', self.loc.other,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,
				'swatchFunc', function(r,g,b) self:OptionColorChange('other',r,g,b) end
			)
			
			dewdrop:AddLine() 
			
						
			c = self:GetColor('skill')
			dewdrop:AddLine(
				'text', self.loc.skill,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,
				'swatchFunc', function(r,g,b) self:OptionColorChange('skill',r,g,b) end
			)


			c = self:GetColor('buff')
			dewdrop:AddLine(
				'text', self.loc.buff,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,
				'swatchFunc', function(r,g,b) self:OptionColorChange('buff',r,g,b) end
			)

			c = self:GetColor('debuff')
			dewdrop:AddLine(
				'text', self.loc.debuff,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,
				'swatchFunc', function(r,g,b) self:OptionColorChange('debuff',r,g,b) end
			)
			
			c = self:GetColor('heal')
			dewdrop:AddLine(
				'text', self.loc.heal,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,
				'swatchFunc', function(r,g,b) self:OptionColorChange('heal',r,g,b) end
			)
			
			c = self:GetColor('miss')
			dewdrop:AddLine(
				'text', self.loc.miss,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,
				'swatchFunc', function(r,g,b) self:OptionColorChange('miss',r,g,b) end
			)
						
			c = self:GetColor('physical')
			dewdrop:AddLine(
				'text', self.loc.physical,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,
				'swatchFunc', function(r,g,b) self:OptionColorChange('physical',r,g,b) end
			)
			
			c = self:GetColor('holy')
			dewdrop:AddLine(
				'text', self.loc.holy,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,
				'swatchFunc', function(r,g,b) self:OptionColorChange('holy',r,g,b) end
			)
			
			c = self:GetColor('fire')
			dewdrop:AddLine(
				'text', self.loc.fire,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,
				'swatchFunc', function(r,g,b) self:OptionColorChange('fire',r,g,b) end
			)
			
			c = self:GetColor('nature')
			dewdrop:AddLine(
				'text', self.loc.nature,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,
				'swatchFunc', function(r,g,b) self:OptionColorChange('nature',r,g,b) end
			)
			
			c = self:GetColor('frost')
			dewdrop:AddLine(
				'text', self.loc.frost,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,
				'swatchFunc', function(r,g,b) self:OptionColorChange('frost',r,g,b) end
			)
			
			c = self:GetColor('shadow')
			dewdrop:AddLine(
				'text', self.loc.shadow,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,
				'swatchFunc', function(r,g,b) self:OptionColorChange('shadow',r,g,b) end
			)
			
			c = self:GetColor('arcane')
			dewdrop:AddLine(
				'text', self.loc.arcane,
				'hasColorSwatch', true,
				'r', c.r,
				'g', c.g,
				'b', c.b,
				'swatchFunc', function(r,g,b) self:OptionColorChange('arcane',r,g,b) end
			)
			

		
		elseif value == 'filter' then

			dewdrop:AddLine(
				'text', self.loc.player,
				'func', function() self.savedVars.filters.player = not self.savedVars.filters.player end,
				'checked', not self.savedVars.filters.player
			)
			dewdrop:AddLine(
				'text', self.loc.pet,
				'func', function() self.savedVars.filters.pet = not self.savedVars.filters.pet end,
				'checked', not self.savedVars.filters.pet
			)
			dewdrop:AddLine(
				'text', self.loc.party,
				'func', function() self.savedVars.filters.party = not self.savedVars.filters.party end,
				'checked', not self.savedVars.filters.party
			)
			dewdrop:AddLine(
				'text', self.loc.raid,
				'func', function() self.savedVars.filters.raid = not self.savedVars.filters.raid end,
				'checked', not self.savedVars.filters.raid
			)
			dewdrop:AddLine(
				'text', self.loc.target,
				'func', function() self.savedVars.filters.target = not self.savedVars.filters.target end,
				'checked', not self.savedVars.filters.target
			)
			dewdrop:AddLine(
				'text', self.loc.other,
				'func', function() self.savedVars.filters.other = not self.savedVars.filters.other end,
				'checked', not self.savedVars.filters.other
			)
			
			dewdrop:AddLine()
			
			dewdrop:AddLine(
				'text', self.loc.hit,
				'func', function() self.savedVars.filters.hit = not self.savedVars.filters.hit end,
				'checked', not self.savedVars.filters.hit
			)
			dewdrop:AddLine(
				'text', self.loc.heal,
				'func', function() self.savedVars.filters.heal = not self.savedVars.filters.heal end,
				'checked', not self.savedVars.filters.heal
			)
			dewdrop:AddLine(
				'text', self.loc.miss,
				'func', function() self.savedVars.filters.miss = not self.savedVars.filters.miss end,
				'checked', not self.savedVars.filters.miss
			)			
			dewdrop:AddLine(
				'text', self.loc.cast,
				'func', function() self.savedVars.filters.cast = not self.savedVars.filters.cast end,
				'checked', not self.savedVars.filters.cast
			)			
			dewdrop:AddLine(
				'text', self.loc.gain,
				'func', function() self.savedVars.filters.gain = not self.savedVars.filters.gain end,
				'checked', not self.savedVars.filters.gain
			)
			dewdrop:AddLine(
				'text', self.loc.drain,
				'func', function() self.savedVars.filters.drain = not self.savedVars.filters.drain end,
				'checked', not self.savedVars.filters.drain
			)
			
			
					
		elseif value == 'event' then
		
			dewdrop:AddLine(
				'text', self.loc.selfhit,
				'func', function() self.savedVars.events.selfhit = not self.savedVars.events.selfhit; self:RefreshSettings() end,
				'checked', self.savedVars.events.selfhit
			)
			dewdrop:AddLine(
				'text', self.loc.otherhit,
				'func', function() self.savedVars.events.otherhit = not self.savedVars.events.otherhit; self:RefreshSettings() end,
				'checked', self.savedVars.events.otherhit
			)
			dewdrop:AddLine(
				'text', self.loc.selfspell,
				'func', function() self.savedVars.events.selfspell = not self.savedVars.events.selfspell; self:RefreshSettings() end,
				'checked', self.savedVars.events.selfspell
			)
			dewdrop:AddLine(
				'text', self.loc.otherspell,
				'func', function() self.savedVars.events.otherspell = not self.savedVars.events.otherspell; self:RefreshSettings() end,
				'checked', self.savedVars.events.otherspell
			)
			dewdrop:AddLine(
				'text', self.loc.selfdot,
				'func', function() self.savedVars.events.selfdot = not self.savedVars.events.selfdot; self:RefreshSettings() end,
				'checked', self.savedVars.events.selfdot
			)
			dewdrop:AddLine(
				'text', self.loc.otherdot,
				'func', function() self.savedVars.events.otherdot = not self.savedVars.events.otherdot; self:RefreshSettings() end,
				'checked', self.savedVars.events.otherdot
			)
			dewdrop:AddLine(
				'text', self.loc.death,
				'func', function() self.savedVars.events.death = not self.savedVars.events.death; self:RefreshSettings() end,
				'checked', self.savedVars.events.death
			)
			dewdrop:AddLine(
				'text', self.loc.aura,
				'func', function() self.savedVars.events.aura = not self.savedVars.events.aura; self:RefreshSettings() end,
				'checked', self.savedVars.events.aura
			)
			dewdrop:AddLine(
				'text', self.loc.enchant,
				'func', function() self.savedVars.events.enchant = not self.savedVars.events.enchant; self:RefreshSettings() end,
				'checked', self.savedVars.events.enchant
			)
			dewdrop:AddLine(
				'text', self.loc.trade,
				'func', function() self.savedVars.events.trade = not self.savedVars.events.trade; self:RefreshSettings() end,
				'checked', self.savedVars.events.trade
			)
			dewdrop:AddLine(
				'text', self.loc.experience,
				'func', function() self.savedVars.events.experience = not self.savedVars.events.experience; self:RefreshSettings() end,
				'checked', self.savedVars.events.experience
			)
			dewdrop:AddLine(
				'text', self.loc.honor,
				'func', function() self.savedVars.events.honor = not self.savedVars.events.honor; self:RefreshSettings() end,
				'checked', self.savedVars.events.honor
			)
			dewdrop:AddLine(
				'text', self.loc.reputation,
				'func', function() self.savedVars.events.reputation = not self.savedVars.events.reputation; self:RefreshSettings() end,
				'checked', self.savedVars.events.reputation
			)
			dewdrop:AddLine(
				'text', self.loc.fail,
				'func', function() self.savedVars.events.fail = not self.savedVars.events.fail; self:RefreshSettings() end,
				'checked', self.savedVars.events.fail
			)
		end
	end


end



function SimpleCombatLog:OptionColorChange(item, r,g,b)

	if not self.savedVars.colors[item] then self.savedVars.colors[item] = {} end
	
	self.savedVars.colors[item].r = r
	self.savedVars.colors[item].g = g
	self.savedVars.colors[item].b = b
end


function SimpleCombatLog:LoadDefaultSettings()

	SCL_Config = {}
	
	self.savedVars = SCL_Config
	self.savedVars.colors = {}
	self.savedVars.filters = {}
	self.savedVars.minimapButton = {}
	
	self.savedVars.events = {}
	for i, v in self.eventTypes do
		if v ~= 'fail' then
			self.savedVars.events[v] = true
		end
	end
	
	self.savedVars.outputframe = 2
	self.savedVars.nosuppress = nil
	self.savedVars.nooptionbutton = nil
	self:RefreshSettings()
end


if not GetParser then function GetParser() 	return parser end end

