local Recount = _G.Recount

local Graph = LibStub:GetLibrary("LibGraph-2.0")
local AceLocale = LibStub("AceLocale-3.0")
local L = AceLocale:GetLocale("Recount")

local revision = tonumber(string.sub("$Revision: 1563 $", 12, -3))
if Recount.Version < revision then
	Recount.Version = revision
end

local table = table
local ipairs = ipairs
local string = string
local date = date
local math = math
local pairs = pairs
local type = type
local wipe = wipe


local CreateFrame = CreateFrame
local SendChatMessage = SendChatMessage
local BNSendWhisper = BNSendWhisper

local UIParent = UIParent

local FauxScrollFrame_GetOffset = FauxScrollFrame_GetOffset
local FauxScrollFrame_Update = FauxScrollFrame_Update
local FauxScrollFrame_OnVerticalScroll = FauxScrollFrame_OnVerticalScroll

local me = {}

local Epsilon = 0.000000000000000001

local RowHeight = 14

local function RecountSortFunc(a, b)
	if a[2] > b[2] then
		return true
	end
	return false
end

function Recount:SelectUpperDetailTable(num)
	if num == nil or num < 1 or (Recount.DetailWindow.PieMode.UpperTable and num > table.maxn(Recount.DetailWindow.PieMode.UpperTable)) or Recount.DetailWindow.Locked then
		return
	end

	local Rows = Recount.DetailWindow.PieMode.TopRows

	for i = 1, 8 do
		Rows[i].Background:Hide()
		Rows[i].Selected:Hide()
	end

	if num <= 8 then
		Rows[num].Background:Show()
	end

	local offset = FauxScrollFrame_GetOffset(Recount.DetailWindow.PieMode.ScrollBar1)
	Recount.DetailWindow.PieMode.Selected = num + offset
	if Recount.DetailWindow.PieMode.UpperTable and Recount.DetailWindow.PieMode.UpperTable[num + offset] and Recount.DetailWindow.PieMode.UpperTable[num + offset][3] then
		Recount:FillLowerDetailTable(Recount.DetailWindow.PieMode.UpperTable[num + offset][3])
	end
end

function Recount:SelectUpperDetailTablePie(num)
	if num == nil or num < 1 or (Recount.DetailWindow.PieMode.UpperTable and num > table.maxn(Recount.DetailWindow.PieMode.UpperTable)) or Recount.DetailWindow.Locked then
		return
	end

	local Rows = Recount.DetailWindow.PieMode.TopRows

	local offset = FauxScrollFrame_GetOffset(Recount.DetailWindow.PieMode.ScrollBar1)
	num = num - offset

	for i = 1, 8 do
		Rows[i].Background:Hide()
		Rows[i].Selected:Hide()
	end

	if num >= 1 and num <= 8 then
		Rows[num].Background:Show()
	end


	Recount.DetailWindow.PieMode.Selected = num + offset
	if Recount.DetailWindow.PieMode.UpperTable and Recount.DetailWindow.PieMode.UpperTable[num + offset] and Recount.DetailWindow.PieMode.UpperTable[num + offset][3] then
		Recount:FillLowerDetailTable(Recount.DetailWindow.PieMode.UpperTable[num + offset][3])
	end
end

function Recount:LockUpperDetailTable(num)
	if num == nil or num < 1 or (Recount.DetailWindow.PieMode.UpperTable and num > table.maxn(Recount.DetailWindow.PieMode.UpperTable)) then
		return
	end

	local Rows = Recount.DetailWindow.PieMode.TopRows

	for i = 1, 8 do
		Rows[i].Background:Hide()
		Rows[i].Selected:Hide()
	end

	if num <= 8 then
		Rows[num].Background:Show()
		Rows[num].Selected:Show()
	end

	local offset = FauxScrollFrame_GetOffset(Recount.DetailWindow.PieMode.ScrollBar1)

	if Recount.DetailWindow.Locked and Recount.DetailWindow.PieMode.Selected == (num + offset) then
		Recount.DetailWindow.Locked = nil
		Rows[num].Selected:Hide()
		return
	end

	Recount.DetailWindow.Locked = true
	Recount.DetailWindow.PieMode.Selected = num + offset
	if Recount.DetailWindow.PieMode.UpperTable and Recount.DetailWindow.PieMode.UpperTable[num + offset] and Recount.DetailWindow.PieMode.UpperTable[num + offset][3] then
		Recount:FillLowerDetailTable(Recount.DetailWindow.PieMode.UpperTable[num + offset][3])
	end
end

function me:SelectLowerDetailTable(num)
	if num == nil then
		return
	end

	local Rows = Recount.DetailWindow.PieMode.BotRows

	for i = 1, 8 do
		Rows[i].Background:Hide()
	end

	if num >= 1 and num <= 8 then
		Rows[num].Background:Show()
	end
end

function me:HideDetailModes()
	Recount.DetailWindow.PieMode:Hide()
	Recount.DetailWindow.DeathMode:Hide()
	Recount.DetailWindow.SummaryMode:Hide()
end

local FreeTables = {}

function Recount:FillUpperDetailTable(Data)

	if not Recount.DetailWindow.SummaryEnabled then
		me:HideDetailModes()
		Recount.DetailWindow.PieMode:Show()
	end

	Recount.DetailWindow.CurMode = Recount.DetailWindow.PieMode

	if not Data then
		Data = {}
	end

	local UpperTable = Recount.DetailWindow.PieMode.UpperTable

	for k, v in ipairs(UpperTable) do
		FreeTables[#FreeTables + 1] = v
		UpperTable[k] = nil
	end

	local total = 0
	for k, v in pairs(Data) do
		if v.count and v.count > 0 or v.amount and v.amount > 0 then
			if FreeTables[#FreeTables] then
				UpperTable[#UpperTable + 1] = FreeTables[#FreeTables]
				FreeTables[#FreeTables] = nil

				UpperTable[#UpperTable][1] = k
				UpperTable[#UpperTable][2] = v.amount
				UpperTable[#UpperTable][3] = v.Details
				UpperTable[#UpperTable][6] = v.count
			else
				UpperTable[#UpperTable + 1] = {k, v.amount, v.Details, nil, nil, v.count}
			end


			total = total + v.amount
		end
	end

	table.sort(UpperTable, RecountSortFunc)

	local PieChart = Recount.DetailWindow.PieMode.TopPieChart

	PieChart:ResetPie()

	local MaxNum = table.maxn(UpperTable)

	for k, v in ipairs(UpperTable) do
		if total == 0 then
			v[4] = 100
		else
			v[4] = 100 * v[2] / total
		end

		if k ~= MaxNum then
			v[5] = PieChart:AddPie(v[4])
		else
			v[5] = PieChart:CompletePie()
		end
	end

	me:RefreshUpperDetails()

	--Recount:SetWindowTop(Recount.DetailWindow)
end

function me:RefreshUpperDetails()
	local UpperTable = Recount.DetailWindow.PieMode.UpperTable
	FauxScrollFrame_Update(Recount.DetailWindow.PieMode.ScrollBar1, table.maxn(UpperTable), 8, 13)
	local offset = FauxScrollFrame_GetOffset(Recount.DetailWindow.PieMode.ScrollBar1)

	for i = 1, 8 do
		local entry = UpperTable[i + offset]
		local row = Recount.DetailWindow.PieMode.TopRows[i]
		if entry then
			row.Background:SetVertexColor((entry[5][1] + 0.5) / 2, (entry[5][2] + 0.5) / 2, (entry[5][3] + 0.5) / 2, 0.3)
			row.Selected:SetVertexColor(entry[5][1], entry[5][2], entry[5][3], 1.0)

			if Recount.DetailWindow.PieMode.Selected == i + offset then
				row.Background:Show()
				if Recount.DetailWindow.Locked then
					row.Selected:Show()
				end
			else
				row.Background:Hide()
				row.Selected:Hide()
			end

			row.Key:SetVertexColor(entry[5][1], entry[5][2], entry[5][3], 1.0)
			row.Count:SetText(i + offset)
			row.Name:SetText(entry[1])
			row.ACount:SetText(entry[6])
			row.Amount:SetText(Recount:FormatLongNums(entry[2]))
			row.Percent:SetText(string.format("%.1f", entry[4]).."%")
			row.Data = entry[3]
			row:Show()
		else
			row:Hide()
		end
	end

	if Recount.DetailWindow.PieMode.Selected and UpperTable[Recount.DetailWindow.PieMode.Selected] and UpperTable[Recount.DetailWindow.PieMode.Selected][3] then
		Recount:FillLowerDetailTable(UpperTable[Recount.DetailWindow.PieMode.Selected][3])
	else
		for i = 1, 8 do
			Recount.DetailWindow.PieMode.BotPieChart:ResetPie()
			Recount.DetailWindow.PieMode.BotRows[i]:Hide()
		end
	end
	Recount.DetailWindow:Show()
end

local HitTypeColors = {
	Hit = {0.0, 0.9, 0.0},
	Crit = {0.9, 0.0, 0.0},
	Tick = {1.0, 0.5, 0.0},
	Miss = {0.0, 1.0, 1.0},
	Dodge = {0.5, 0.0, 1.0},
	Parry = {0.5, 0.5, 0.5},
	Resist = {0.0, 0.5, 0.5},
	Immune = {0.5, 0.0, 0.0},
	Block = {0.0, 0.5, 0.0},
	Glancing = {0.5, 1.0, 0.5},
	Crushing = {0.5, 0.0, 0.5},
	Absorb = {0.25, 0.25, 0.25},
}
function Recount:FillLowerDetailTable(Data)
	local dispTable = Recount.DetailWindow.PieMode.LowerTable
	local total = 0

	for k, v in ipairs(dispTable) do
		FreeTables[#FreeTables + 1] = v
		dispTable[k] = nil
	end


	for k, v in pairs(Data) do
		local avg

		if v.count and v.count > 0 then

			if v.amount then
				avg = math.floor(v.amount / v.count + 0.5)
			end

			if FreeTables[#FreeTables] then
				dispTable[#dispTable + 1] = FreeTables[#FreeTables]
				FreeTables[#FreeTables] = nil

				dispTable[#dispTable][1] = k
				dispTable[#dispTable][2] = v.count
				dispTable[#dispTable][3] = v.min
				dispTable[#dispTable][4] = avg
				dispTable[#dispTable][5] = v.max
			else
				dispTable[#dispTable + 1] = {k, v.count, v.min, avg, v.max}
			end
			total = total + v.count
		end
	end

	table.sort(dispTable, RecountSortFunc)

	local PieChart = Recount.DetailWindow.PieMode.BotPieChart

	PieChart:ResetPie()

	local MaxNum = table.maxn(dispTable)

	for k, v in ipairs(dispTable) do
		if total == 0 then
			v[6] = 100
		else
			v[6] = 100 * v[2] / total
		end
		v[7] = HitTypeColors[v[1]]

		if k ~= MaxNum then
			v[7] = PieChart:AddPie(v[6], v[7])
		else
			v[7] = PieChart:CompletePie(v[7])
		end
	end

	for i = 1, 8 do
		local entry = dispTable[i]
		local row = Recount.DetailWindow.PieMode.BotRows[i]
		if entry then
			row.Key:SetVertexColor(entry[7][1], entry[7][2], entry[7][3],1.0)
			row.Background:SetVertexColor((entry[7][1] + 0.5) / 2, (entry[7][2] + 0.5) / 2, (entry[7][3] + 0.5) / 2, 0.3)
			row.Name:SetText(entry[1])
			local countLabel = Recount.DetailWindow.PieMode.BotRowLabels.Count:GetText()
			if countLabel == L["Damage"] or countLabel == L["Healed"] then
				row.Count:SetText(Recount:FormatLongNums(entry[2]))
			else
				row.Count:SetText(entry[2])
			end
			if entry[3] then
				row.Min:SetText(Recount:FormatLongNums(entry[3]))
				row.Min:Show()
			else
				row.Min:Hide()
			end

			if entry[4] then
				row.Avg:SetText(Recount:FormatLongNums(entry[4]))
				row.Avg:Show()
			else
				row.Avg:Hide()
			end

			if entry[5] then
				row.Max:SetText(Recount:FormatLongNums(entry[5]))
				row.Max:Show()
			else
				row.Max:Hide()
			end

			row.Percent:SetText(string.format("%.1f", entry[6]).."%")
			row.Data = entry[3]
			row:Show()
		else
			row:Hide()
		end
	end
end


--The titles are slightly different for various modes
--.TopNames = Names of the entries for the top data
--.TopCount = Names of the count for the top data
--.TopAmount = What we call the amount for the top
--.BotNames = Names of the entries for the bottom
--.BotMin = The minimum label for bottom
--.BotAvg = The average label for bottom
--.BotMax = The minimum label for bottom
--.BotAmount = Label for what the amount is on the bottom
function Recount:SetupDetailTitles(ForWho, MainTitle, Titles)
	Recount.DetailWindow.TitleText = ForWho..MainTitle
	Recount.DetailWindow.ForWho = ForWho
	Recount.DetailWindow.CurTitle = L["Detail Window"].." - "..ForWho..MainTitle
	if not Recount.DetailWindow.SummaryEnabled then
		Recount.DetailWindow.Title:SetText(Recount.DetailWindow.CurTitle)
	end
	local Labels = Recount.DetailWindow.PieMode.TopRowLabels
	Labels.Name:SetText(Titles.TopNames)
	Labels.ACount:SetText(Titles.TopCount)
	Labels.Amount:SetText(Titles.TopAmount)

	Labels = Recount.DetailWindow.PieMode.BotRowLabels
	Labels.Name:SetText(Titles.BotNames)
	Labels.Min:SetText(Titles.BotMin)
	Labels.Avg:SetText(Titles.BotAvg)
	Labels.Max:SetText(Titles.BotMax)
	Labels.Count:SetText(Titles.BotAmount)
end

function Recount:SetDeathDetails(Who, Data)
	if not Recount.DetailWindow.SummaryEnabled then
		me:HideDetailModes()
		Recount.DetailWindow.DeathMode:Show()
	end

	Recount.DetailWindow.CurMode = Recount.DetailWindow.DeathMode


	Recount.DetailWindow.DeathMode.Data = Data
	me:RefreshDeathDetails()

	Recount.DetailWindow.DeathMode.WhosDeaths = Who
	Recount.DetailWindow.CurTitle = L["Detail Window"].." - "..L["Death Details for"].." "..Who
	Recount.DetailWindow.Title:SetText(Recount.DetailWindow.CurTitle)


	Recount.DetailWindow:Show()
end

function me:RefreshDeathDetails()
	local Row, DataRow
	local Data = Recount.DetailWindow.DeathMode.Data
	local size

	if Data then
		size = table.getn(Data)
	else
		size = 0
	end

	FauxScrollFrame_Update(Recount.DetailWindow.DeathMode.ScrollBar1, size, 17, 18)

	local offset = FauxScrollFrame_GetOffset(Recount.DetailWindow.DeathMode.ScrollBar1)
	local Selected = (Recount.DetailWindow.DeathMode.SelectedNum or 1) - offset

	for i = 1, 17 do
		Row = Recount.DetailWindow.DeathMode.Deaths[i] or 0
		DataRow = Data and Data[i + offset]
		if DataRow then
			Row.Data = DataRow
			Row.Time:SetText(date("%H:%M:%S",DataRow.DeathAt))
			if DataRow.KilledBy then
				Row.Who:SetText(DataRow.KilledBy)
			else
				Row.Who:SetText("-")
			end
			Recount:CheckFontStringLength(Row.Who, 80)

			if Selected == i then
				Row.Selected:Show()
			else
				Row.Selected:Hide()
			end

			Row:Show()
		else
			Row:Hide()
		end
	end

end

function Recount:WrapFontString(fontstring, maxwidth)
	local Text = fontstring:GetText()
	local Returning = ""
	local Temp, NextWhite

	while fontstring:GetStringWidth() > maxwidth do
		Temp = string.reverse(Text)
		local _
		_, NextWhite = string.find(Temp,"( +)")

		Returning = string.sub(Text, string.len(Text) - NextWhite + 1, string.len(Text))..Returning
		Text = string.sub(Text, 1, string.len(Text) - NextWhite)
		fontstring:SetText(Text)
	end
	return Returning
end

function Recount:SetDeathLogDetails(id)
	--Recount:DPrint("id: "..id)
	--Recount:DPrint(debugstack(2, 3, 2))
	for i = 1, 17 do
		Recount.DetailWindow.DeathMode.Deaths[i].Selected:Hide()
	end
	Recount.DetailWindow.DeathMode.Deaths[id].Selected:Show()

	local offset = FauxScrollFrame_GetOffset(Recount.DetailWindow.DeathMode.ScrollBar1)

	Recount.DetailWindow.DeathMode.SelectedNum = id + offset
	Recount.DetailWindow.DeathMode.SelectedData = Recount.DetailWindow.DeathMode.Deaths[id].Data

	if Recount.DeathGraph and Recount.DeathGraph:IsShown() then
		me:ShowDeathGraph()
	end
	me:DetermineDeathFilters()
	me:RefreshDeathLogDetails()
end

local DeathLogColors = {
	DAMAGE = {1.0, 0.2, 0.2},
	HEAL = {0.2, 1.0, 0.2},
	MISC = {0.2, 0.2, 0.2}
}

function me:FilterDeathData(filterType, filterIncoming)
	local Data = Recount.DetailWindow.DeathMode.SelectedData
	local FilterData = Recount.DetailWindow.DeathMode.FilteredData

	for _, v in pairs(FilterData) do
		wipe(v)
	end

	if Data==nil then
		return
	end

	for i = 1, #Data.Messages do
		if filterType[Data.MessageType[i]] and filterIncoming[Data.MessageIncoming[i]] then
			table.insert(FilterData.Messages, Data.Messages[i])
			table.insert(FilterData.MessageType, Data.MessageType[i])
			table.insert(FilterData.MessageIncoming, Data.MessageIncoming[i])
			table.insert(FilterData.MessageTimes, Data.MessageTimes[i])
			local health, health_max = Data.Health[i], Data.HealthMax[i]
			if health and health_max then
				table.insert(FilterData.Health, string.format("%d (%d%%)", health, health / health_max * 100))
			else
				table.insert(FilterData.Health, "???")
			end
		end
	end
end

function me:ShowDeathGraph()
	local Data = Recount.DetailWindow.DeathMode.SelectedData
	--local Title = Recount.DetailWindow.DeathMode.WhosDeaths.." killed by "..Data.KilledBy.." at "..date("%H:%M:%S",Data.DeathAt)
	local Health = Recount:GetTable()
	local Hits, Heals

	if Data then
		for k, time in pairs(Data.MessageTimes) do
			Health[#Health + 1] = {time, Data.Health[k] / Data.HealthMax[k] * 100}

			if Data.EventNum[k] then
				if Data.MessageType[k] == "HEAL" then
					if Heals == nil then
						Heals = Recount:GetTable()
					end
					Heals[#Heals + 1] = {time, Data.EventNum[k]}
					--Recount:DPrint("Heal: "..time.." "..Data.EventNum[k])
				elseif Data.MessageType[k] == "DAMAGE" then
					if Hits == nil then
						Hits = Recount:GetTable()
					end
					Hits[#Hits + 1] = {time, Data.EventNum[k]}
					--Recount:DPrint("Hits: "..time.." "..Data.EventNum[k])
				end
			end
		end
	end

	Recount:ShowDeathGraph(Health, Heals, Hits)
end

--Since lines can potentially span multiple lines need to count manually
function me:CountDeathLogLines()
	local lines = 0

	local Data = Recount.DetailWindow.DeathMode.FilteredData
	local Row = Recount.DetailWindow.DeathMode.DeathLog[1]
	local NextLine

	for i = 1, #Data.Messages do
		Row.Msg:SetText("("..L["Health"]..": "..Data.Health[i]..") "..Data.Messages[i])
		lines = lines + 1

		NextLine = Recount:WrapFontString(Row.Msg, 235)
		if NextLine ~= "" then
			Row.Msg:SetText(" "..NextLine)
			lines = lines + 1
			NextLine = Recount:WrapFontString(Row.Msg, 235)
		end

		NextLine = Recount:WrapFontString(Row.Msg, 235)
		if NextLine ~= "" then
			Row.Msg:SetText(" "..NextLine)
			lines = lines + 1
			NextLine = Recount:WrapFontString(Row.Msg, 235)
		end
	end

	return lines
end

function me:DetermineOffset(num)
	if num == 0 then
		return 0
	end

	local lines = 0

	local Data = Recount.DetailWindow.DeathMode.FilteredData
	local Row = Recount.DetailWindow.DeathMode.DeathLog[1]
	local NextLine

	for i = 1, #Data.Messages do
		Row.Msg:SetText("("..L["Health"]..": "..Data.Health[i]..") "..Data.Messages[i])
		lines = lines + 1

		if lines==num then
			return i + 1
		end

		NextLine = Recount:WrapFontString(Row.Msg, 235)
		if NextLine ~= "" then
			Row.Msg:SetText(" "..NextLine)
			lines = lines + 1
			NextLine = Recount:WrapFontString(Row.Msg, 235)

			if lines == num then
				return i + 1
			end
		end

		NextLine = Recount:WrapFontString(Row.Msg, 235)
		if NextLine ~= "" then
			Row.Msg:SetText(" "..NextLine)
			lines = lines + 1
			NextLine = Recount:WrapFontString(Row.Msg, 235)

			if lines == num then
				return i + 1
			end
		end
	end
	return #Data.Messages
end

function me:RefreshDeathLogDetails()
	local Data = Recount.DetailWindow.DeathMode.FilteredData
	local Row, NextLine

	local size
	if not Data or type(Data.Messages) ~= "table" then
		size = 0
	else
		size = me:CountDeathLogLines()
	end

	FauxScrollFrame_Update(Recount.DetailWindow.DeathMode.ScrollBar2, size, 18, 13)
	local offset = me:DetermineOffset(FauxScrollFrame_GetOffset(Recount.DetailWindow.DeathMode.ScrollBar2))
	local RowOffset = 0

	if Data then
		for i = 1, 20 do
			if i + RowOffset > 20 then
				break
			end

			Row = Recount.DetailWindow.DeathMode.DeathLog[i + RowOffset]
			local mess_idx = i + offset
			if Data.Messages[mess_idx] then
				if Data.MessageTimes[mess_idx] < 0 then
					Row.Time:SetFormattedText("%.2f", Data.MessageTimes[mess_idx])
				else
					Row.Time:SetFormattedText("+%.2f", Data.MessageTimes[mess_idx])
				end
				Row.Msg:SetFormattedText("(%s: %s) %s", L["Health"], Data.Health[mess_idx], Data.Messages[mess_idx])

				local Color = DeathLogColors[Data.MessageType[mess_idx]]
				Row.Background:SetVertexColor(Color[1], Color[2], Color[3])
				Row:Show()

				NextLine = Recount:WrapFontString(Row.Msg, 235)
				if NextLine ~= "" and (i + RowOffset) < 20 then
					RowOffset = RowOffset + 1
					Row = Recount.DetailWindow.DeathMode.DeathLog[i + RowOffset]
					Row.Time:SetText("")
					Row.Msg:SetText(" "..NextLine)
					Row.Background:SetVertexColor(Color[1], Color[2], Color[3])
					Row:Show()
				end

				NextLine = Recount:WrapFontString(Row.Msg, 235)
				if NextLine ~= "" and (i + RowOffset) < 20 then
					RowOffset = RowOffset + 1
					Row = Recount.DetailWindow.DeathMode.DeathLog[i + RowOffset]
					Row.Time:SetText("")
					Row.Msg:SetText(" "..NextLine)
					Row.Background:SetVertexColor(Color[1], Color[2], Color[3])
					Row:Show()
				end
			else
				Row:Hide()
			end
		end
	else
		for i = 1, 20 do
			Recount.DetailWindow.DeathMode.DeathLog[i]:Hide()
		end
	end
end


--Summary Report Functions
local FontHeight = 14.5
local RowSpacing = -13.0

local SummaryDamageTypes = {
	"Melee",
	"Physical",
	"Arcane",
	"Fire",
	"Frost",
	"Frostfire",
	"Holy",
	"Nature",
	"Naturefire",
	"Shadow",
}

local SummaryHitTypes = {
	"Glancing",
	"Hit",
	"Crushing",
	"Crit",
	"Miss",
	"Dodge",
	"Parry",
	"Block",
	"Resist",
}
function me:CreateSummaryColumn(Title, Color)
	local theFrame = CreateFrame("Frame", nil, Recount.DetailWindow.SummaryMode)

	theFrame:SetWidth(47)
	theFrame:SetHeight(156 + 26)

	theFrame.Background = theFrame:CreateTexture(nil, "BACKGROUND")
	theFrame.Background:SetAllPoints(theFrame)
	theFrame.Background:SetColorTexture(Color[1], Color[2], Color[3], 0.1)

	theFrame.Selected = theFrame:CreateTexture(nil,"BACKGROUND")
	theFrame.Selected:SetAllPoints(theFrame)
	theFrame.Selected:SetColorTexture(Color[1], Color[2], Color[3], 0.3)
	theFrame.Selected:Hide()

	theFrame.Title = theFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
	theFrame.Title:SetText(Title)
	theFrame.Title:SetPoint("TOP", theFrame, "TOP", 0, -2)
	Recount:AddFontString(theFrame.Title)

	theFrame.Damage = theFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
	theFrame.Damage:SetTextColor(1, 1, 1)
	theFrame.Damage:SetText("-")
	theFrame.Damage:SetPoint("TOP", theFrame, "TOP", 0, RowSpacing)
	theFrame.Damage:SetFont("Fonts\\ARIALN.TTF", 11)
	Recount:AddFontString(theFrame.Damage)

	theFrame.Resisted = theFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
	theFrame.Resisted:SetTextColor(1, 1, 1)
	theFrame.Resisted:SetText("-")
	theFrame.Resisted:SetPoint("TOP", theFrame, "TOP", 0, RowSpacing * 2)
	theFrame.Resisted:SetFont("Fonts\\ARIALN.TTF", 11)
	Recount:AddFontString(theFrame.Resisted)

	theFrame.Blocked = theFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
	theFrame.Blocked:SetTextColor(1, 1, 1)
	theFrame.Blocked:SetText("-")
	theFrame.Blocked:SetPoint("TOP", theFrame, "TOP", 0, RowSpacing * 3)
	theFrame.Blocked:SetFont("Fonts\\ARIALN.TTF", 11)
	Recount:AddFontString(theFrame.Blocked)

	theFrame.Absorbed = theFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
	theFrame.Absorbed:SetTextColor(1, 1, 1)
	theFrame.Absorbed:SetText("-")
	theFrame.Absorbed:SetPoint("TOP", theFrame, "TOP", 0, RowSpacing * 4)
	theFrame.Absorbed:SetFont("Fonts\\ARIALN.TTF", 11)
	Recount:AddFontString(theFrame.Absorbed)

	local i = 5

	for _, k in pairs(SummaryHitTypes) do
		theFrame[k] = theFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
		theFrame[k]:SetTextColor(1, 1, 1)
		theFrame[k]:SetText("-")
		theFrame[k]:SetPoint("TOP", theFrame,"TOP", -11.5, RowSpacing * i)
		theFrame[k]:SetFont("Fonts\\ARIALN.TTF", 11)
		Recount:AddFontString(theFrame[k])
		theFrame[k.."P"] = theFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
		theFrame[k.."P"]:SetTextColor(1, 1, 1)
		theFrame[k.."P"]:SetText("-")
		theFrame[k.."P"]:SetPoint("TOP", theFrame, "TOP", 11.5, RowSpacing * i)
		theFrame[k.."P"]:SetFont("Fonts\\ARIALN.TTF", 11)
		Recount:AddFontString(theFrame[k.."P"])
		i = i + 1
	end

	theFrame.Report = me.ReportElement
	theFrame:EnableMouse(true)
	theFrame.SelectMe = me.SelectSummaryItem
	theFrame:SetScript("OnMouseDown", theFrame.SelectMe)
	return theFrame
end

local SummaryActive = {
	Melee = true,
	Physical = true,
	Arcane = false,
	Fire = false,
	Frost = false,
	Frostfire = false,
	Holy = false,
	Nature = false,
	Naturefire = false,
	Shadow = false,
}

function me:LoadSummaryData(damage, resisted, hitData, blocked, absorbed)
	local SummaryMode = Recount.DetailWindow.SummaryMode
	local damageFrame

	--Reset values
	for _, dt in pairs(SummaryDamageTypes) do
		damageFrame = SummaryMode[dt]
		damageFrame.Damage:SetText("-")
		damageFrame.Resisted:SetText("-")
		damageFrame.Blocked:SetText("-")
		damageFrame.Absorbed:SetText("-")
		for _, ht in pairs(SummaryHitTypes) do
			damageFrame[ht]:SetText("-")
			damageFrame[ht.."P"]:SetText("-")
		end

		SummaryActive[dt] = false
	end

	SummaryActive.Melee = true
	SummaryActive.Physical = true

	if damage then
		for k, v in pairs(damage) do
			if SummaryMode[k] then
				SummaryMode[k].Damage:SetText(v)
				if SummaryMode[k].Damage ~= 0 then
					SummaryActive[k] = true
				end
			end
		end
	end

	if resisted then
		for k, v in pairs(resisted) do
			if SummaryMode[k] then
				SummaryMode[k].Resisted:SetText(v)
				if SummaryMode[k].Resisted ~= 0 then
					SummaryActive[k] = true
				end
			end
		end
	end

	if blocked then
		for k, v in pairs(blocked) do
			if SummaryMode[k] then
				SummaryMode[k].Blocked:SetText(v)
				if SummaryMode[k].Blocked ~= 0 then
					SummaryActive[k] = true
				end
			end
		end
	end

	if absorbed then
		for k, v in pairs(absorbed) do
			if SummaryMode[k] then
				SummaryMode[k].Absorbed:SetText(v)
				if SummaryMode[k].Absorbed ~= 0 then
					SummaryActive[k] = true
				end
			end
		end
	end

	if hitData then
		for k, v in pairs(hitData) do
			damageFrame = SummaryMode[k]
			if damageFrame then
				local Total = v.amount
				for k2, v2 in pairs(v.Details) do
					if k2 == "Tick" then
						Total = Total - v2.count
					end
				end
				for k2, v2 in pairs(v.Details) do
					if damageFrame[k2] then
						damageFrame[k2]:SetText(v2.count)
						local percent = 0
						if Total ~= 0 then
							percent = math.floor(1000 * v2.count / Total + 0.5) / 10
						end
						damageFrame[k2.."P"]:SetText(percent.."%")
						SummaryActive[k] = true

					end
				end
			end
		end
	end

	local numShown = 0
	for k, v in pairs(SummaryActive) do
		if v then
			SummaryMode[k]:Show()
			numShown = numShown + 1
		else
			SummaryMode[k]:Hide()
		end
	end

	local Width = (390 + 30 + 60) / numShown
	for k, v in pairs(SummaryActive) do
		if v then
			SummaryMode[k]:SetWidth(Width - 2)
		end
	end

	Width = (Width - 2) / 4

	local Previous = SummaryMode.AttackLabels
	for _, v in pairs(SummaryDamageTypes) do
		if SummaryMode[v]:IsShown() then
			SummaryMode[v]:SetPoint("TOPLEFT", Previous, "TOPRIGHT", 2, 0)
			Previous = SummaryMode[v]
			local i = 5
			for _, k in pairs(SummaryHitTypes) do
				SummaryMode[v][k]:SetPoint("TOP", SummaryMode[v], "TOP", -Width, RowSpacing * i)
				SummaryMode[v][k.."P"]:SetPoint("TOP", SummaryMode[v], "TOP", Width, RowSpacing * i)
				i = i + 1
			end
		end
	end
end

function me:ReportElement(loc, loc2)
	-- H.Schuetz - Variables should be at the first line in a function
	local Num, Per

	-- H.Schuetz - Begin
	if loc=="REALID" then
		if Recount.DetailWindow.SummaryMode.DamageMode then
			BNSendWhisper(loc2, L["Recount"].." - "..L["Outgoing"].." "..self.Title:GetText().." "..L["Damage Report for"].." "..Recount.DetailWindow.Showing)
		else
			BNSendWhisper(loc2, L["Recount"].." - "..L["Incoming"].." "..self.Title:GetText().." "..L["Damage Report for"].." "..Recount.DetailWindow.Showing)
		end

		Num = self.Damage:GetText()
		if Num ~= "-" then
			BNSendWhisper(loc2, L["Damage"]..": "..Num)
		end

		Num = self.Resisted:GetText()
		if Num ~= "-" then
			BNSendWhisper(loc2, L["Resisted"]..": "..Num)
		end

		Num = self.Blocked:GetText()
		if Num ~= "-" then
			BNSendWhisper(loc2, L["Blocked"]..": "..Num)
		end

		Num = self.Absorbed:GetText()
		if Num ~= "-" then
			BNSendWhisper(loc2, L["Absorbed"]..": "..Num)
		end

		for _, HitType in pairs(SummaryHitTypes) do
			Num = self[HitType]:GetText()
			Per = self[HitType.."P"]:GetText()
			if Num ~= "-" then
				BNSendWhisper(loc2, HitType..": "..Num.."x "..Per)
			end
		end
	else
		if Recount.DetailWindow.SummaryMode.DamageMode then
			SendChatMessage(L["Recount"].." - "..L["Outgoing"].." "..self.Title:GetText().." "..L["Damage Report for"].." "..Recount.DetailWindow.Showing, loc, nil, loc2)
		else
			SendChatMessage(L["Recount"].." - "..L["Incoming"].." "..self.Title:GetText().." "..L["Damage Report for"].." "..Recount.DetailWindow.Showing, loc, nil, loc2)
		end

		Num = self.Damage:GetText()
		if Num~="-" then
			SendChatMessage(L["Damage"]..": "..Num, loc, nil, loc2)
		end

		Num = self.Resisted:GetText()
		if Num~="-" then
			SendChatMessage(L["Resisted"]..": "..Num, loc, nil, loc2)
		end

		Num = self.Blocked:GetText()
		if Num ~= "-" then
			SendChatMessage(L["Blocked"]..": "..Num, loc, nil, loc2)
		end

		Num = self.Absorbed:GetText()
		if Num ~= "-" then
			SendChatMessage(L["Absorbed"]..": "..Num, loc, nil, loc2)
		end

		for _, HitType in pairs(SummaryHitTypes) do
			Num = self[HitType]:GetText()
			Per = self[HitType.."P"]:GetText()
			if Num ~= "-" then
				SendChatMessage(HitType..": "..Num.."x "..Per, loc, nil, loc2)
			end
		end
	end
	-- H.Schuetz - End

	-- H.Schuetz - Old Version
	--[[if Recount.DetailWindow.SummaryMode.DamageMode then
		SendChatMessage(L["Recount"].." - "..L["Outgoing"].." "..self.Title:GetText().." "..L["Damage Report for"].." "..Recount.DetailWindow.Showing, loc, nil, loc2)
	else
		SendChatMessage(L["Recount"].." - "..L["Incoming"].." "..self.Title:GetText().." "..L["Damage Report for"].." "..Recount.DetailWindow.Showing, loc, nil, loc2)
	end

	Num = self.Damage:GetText()
	if Num ~ ="-" then
		SendChatMessage(L["Damage"]..": "..Num, loc, nil, loc2)
	end

	Num = self.Resisted:GetText()
	if Num ~= "-" then
		SendChatMessage(L["Resisted"]..": "..Num, loc, nil, loc2)
	end

	Num = self.Blocked:GetText()
	if Num ~= "-" then
		SendChatMessage(L["Blocked"]..": "..Num, loc, nil, loc2)
	end

	Num = self.Absorbed:GetText()
	if Num ~= "-" then
		SendChatMessage(L["Absorbed"]..": "..Num, loc, nil, loc2)
	end

	for _, HitType in pairs(SummaryHitTypes) do
		Num = self[HitType]:GetText()
		Per = self[HitType.."P"]:GetText()
		if Num ~= "-" then
			SendChatMessage(HitType..": "..Num.."x "..Per, loc, nil, loc2)
		end
	end]]
end

function me:SelectSummaryItem()
	if Recount.DetailWindow.SummaryMode.Selected then
		Recount.DetailWindow.SummaryMode.Selected.Selected:Hide()
		if Recount.DetailWindow.SummaryMode.Selected == self then
			Recount.DetailWindow.SummaryMode.Selected = nil
			return
		end
	end
	Recount.DetailWindow.SummaryMode.Selected = self
	self.Selected:Show()
end

function me:SetValue(v)
	self.Value:SetText(v)
end

function me:CreateDataItem(parent, text, value, font)
	local theFrame = CreateFrame("Frame", nil, parent)

	theFrame:SetWidth(150 + 20 + (50 / 3))

	if not font then
		font = "GameFontNormalSmall"
		theFrame:SetHeight(14)
	else
		theFrame:SetHeight(16)
	end

	theFrame.Text = theFrame:CreateFontString(nil, "OVERLAY", font)
	theFrame.Text:SetText(text)
	theFrame.Text:SetPoint("LEFT", theFrame, "LEFT", 4, 0)
	Recount:AddFontString(theFrame.Text)

	theFrame.Value = theFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
	theFrame.Value:SetText(value)
	theFrame.Value:SetTextColor(1, 1, 1)
	theFrame.Value:SetPoint("RIGHT", theFrame, "RIGHT", -4, 0)
	Recount:AddFontString(theFrame.Value)

	theFrame.SetValue = me.SetValue
	theFrame.GetText = me.GetTextDataItem

	return theFrame
end

function me:GetTextDataItem()
	return self.Text:GetText().." "..(self.Value:GetText() or "0")
end

function me:GetTextTitle()
	return self.Text:GetText()
end

function me:CreateTitle(parent, text, font)
	local theFrame = CreateFrame("Frame", nil, parent)

	theFrame:SetWidth(150 + 20 + (50 / 3))

	if not font then
		font = "GameFontNormalSmall"
		theFrame:SetHeight(14)
	else
		theFrame:SetHeight(16)
	end

	theFrame.Text = theFrame:CreateFontString(nil, "OVERLAY", font)
	theFrame.Text:SetText(text)
	theFrame.Text:SetPoint("CENTER", theFrame, "CENTER", 0, 0)
	Recount:AddFontString(theFrame.Text)

	theFrame.GetText = me.GetTextTitle

	return theFrame
end

local SummarySet = {
	"Total",
	"PerSec",
	"Overhealing",
	"Taken",
	"Time",
	"Focus",
	"Misc"
}

function me:ReportSummarySet(loc, loc2)
	-- H.Schuetz - Begin
	if loc == "REALID" then
		BNSendWhisper(loc2, L["Recount"].." - "..self.Title:GetText().." "..L["Report for"].." "..Recount.DetailWindow.Showing)
		for _, v in pairs(SummarySet) do
			if self[v] then
				BNSendWhisper(loc2, self[v]:GetText())
			end
		end
	else
		SendChatMessage(L["Recount"].." - "..self.Title:GetText().." "..L["Report for"].." "..Recount.DetailWindow.Showing, loc, nil, loc2)
		for _, v in pairs(SummarySet) do
			if self[v] then
				SendChatMessage(self[v]:GetText(), loc, nil, loc2)
			end
		end
	end
	-- H.Schuetz - End

	-- H.Schuetz - Old Version
	--[[SendChatMessage(L["Recount"].." - "..self.Title:GetText().." "..L["Report for"].." "..Recount.DetailWindow.Showing, loc, nil, loc2)
	for _, v in pairs(SummarySet) do
		if self[v] then
			SendChatMessage(self[v]:GetText(), loc, nil, loc2)
		end
	end]]
end

local SummaryLabels = {
	L["Damage"],
	L["Resisted"],
	L["Blocked"],
	L["Absorbed"],
	L["Glancing"],
	L["Hit"],
	L["Crushing"],
	L["Crit"],
	L["Miss"],
	L["Dodge"],
	L["Parry"],
	L["Block"],
	L["Resist"],
}

function me:CreateSummaryMode()
	Recount.DetailWindow.SummaryMode = CreateFrame("Frame", nil, Recount.DetailWindow)

	local theFrame = Recount.DetailWindow.SummaryMode

	theFrame:ClearAllPoints()
	theFrame:SetPoint("BOTTOM", Recount.DetailWindow)
	theFrame:SetHeight(320 - 32 + 26 - 2)
	theFrame:SetWidth(450 + 50 + 60)

	theFrame.AttackLabels = CreateFrame("Frame", nil, theFrame)
	theFrame.AttackLabels:SetWidth(55 + 20)
	theFrame.AttackLabels:SetHeight(156 + 26 + 2)
	theFrame.AttackLabels:SetPoint("BOTTOMLEFT", theFrame, "BOTTOMLEFT", 0, 3)


	local i = 1
	for _, k in pairs(SummaryLabels) do
		theFrame.AttackLabels[k] = theFrame.AttackLabels:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
		theFrame.AttackLabels[k]:SetPoint("TOPRIGHT", theFrame.AttackLabels, "TOPRIGHT", -2, RowSpacing * i)
		theFrame.AttackLabels[k]:SetText(k..":")
		Recount:AddFontString(theFrame.AttackLabels[k])
		i = i + 1
	end
	SummaryLabels = nil

	theFrame.Melee = me:CreateSummaryColumn(L["Melee"], {0.5, 0.5, 0.5})
	theFrame.Melee:SetPoint("TOPLEFT", theFrame.AttackLabels, "TOPRIGHT", 2, 0)

	theFrame.Physical = me:CreateSummaryColumn(L["Physical"], {0.6, 0.4, 0.2})
	theFrame.Physical:SetPoint("TOPLEFT", theFrame.Melee, "TOPRIGHT", 2, 0)

	theFrame.Arcane = me:CreateSummaryColumn(L["Arcane"], {1.0, 1.0, 1.0})
	theFrame.Arcane:SetPoint("TOPLEFT", theFrame.Physical, "TOPRIGHT", 2, 0)

	theFrame.Fire = me:CreateSummaryColumn(L["Fire"], {1.0, 0.0, 0.0})
	theFrame.Fire:SetPoint("TOPLEFT", theFrame.Arcane, "TOPRIGHT", 2, 0)

	theFrame.Frost = me:CreateSummaryColumn(L["Frost"], {0.5, 0.5, 1.0})
	theFrame.Frost:SetPoint("TOPLEFT", theFrame.Fire, "TOPRIGHT", 2, 0)

	theFrame.Frostfire = me:CreateSummaryColumn(L["Frostfire"], {1.0, 0.647, 0.0})
	theFrame.Frostfire:SetPoint("TOPLEFT", theFrame.Frost, "TOPRIGHT", 2, 0)

	theFrame.Holy = me:CreateSummaryColumn(L["Holy"], {1.0, 1.0, 0.5})
	theFrame.Holy:SetPoint("TOPLEFT", theFrame.Frostfire, "TOPRIGHT", 2, 0)

	theFrame.Nature = me:CreateSummaryColumn(L["Nature"], {0.5, 1.0, 0.5})
	theFrame.Nature:SetPoint("TOPLEFT", theFrame.Holy, "TOPRIGHT", 2, 0)

	theFrame.Naturefire = me:CreateSummaryColumn(L["Naturefire"], {1.0, 1.0, 0.0})
	theFrame.Naturefire:SetPoint("TOPLEFT", theFrame.Nature, "TOPRIGHT", 2, 0)

	theFrame.Shadow = me:CreateSummaryColumn(L["Shadow"], {0.5, 0.1, 0.7})
	theFrame.Shadow:SetPoint("TOPLEFT", theFrame.Naturefire, "TOPRIGHT", 2, 0)

	--Damage Data
	theFrame.Damage = CreateFrame("Frame", nil, theFrame)
	theFrame.Damage:SetHeight(105 - 2)
	theFrame.Damage:SetWidth(149 + 20 + (50 / 3))
	theFrame.Damage:SetPoint("TOPLEFT", theFrame, "TOPLEFT", 1, 2)
	theFrame.Damage:SetFrameLevel(theFrame:GetFrameLevel())
	theFrame.Damage.Report = me.ReportSummarySet

	theFrame.Damage.SelectMe = me.SelectSummaryItem
	theFrame.Damage:EnableMouse(true)
	theFrame.Damage:SetScript("OnMouseDown", theFrame.Damage.SelectMe)

	theFrame.Damage.Selected = theFrame.Damage:CreateTexture(nil, "BACKGROUND")
	theFrame.Damage.Selected:SetColorTexture(1.0, 0.0, 0, 0.1)
	theFrame.Damage.Selected:SetAllPoints(theFrame.Damage)
	theFrame.Damage.Selected:Hide()

	theFrame.Damage.Title = me:CreateTitle(theFrame, L["Damage"], "GameFontNormal")
	theFrame.Damage.Title:SetPoint("TOPLEFT", theFrame.Damage, "TOPLEFT", 0, 0)
	theFrame.Damage.Total = me:CreateDataItem(theFrame.Damage, L["Total"]..":", 0)
	theFrame.Damage.Total:SetPoint("TOP", theFrame.Damage.Title, "BOTTOM", 0, 0)
	theFrame.Damage.PerSec = me:CreateDataItem(theFrame.Damage, L["DPS"]..":", 0)
	theFrame.Damage.PerSec:SetPoint("TOP", theFrame.Damage.Total, "BOTTOM", 0, 0)
	theFrame.Damage.Taken = me:CreateDataItem(theFrame.Damage, L["Taken"]..":", 0)
	theFrame.Damage.Taken:SetPoint("TOP", theFrame.Damage.PerSec, "BOTTOM", 0, 0)
	theFrame.Damage.Time = me:CreateDataItem(theFrame.Damage, L["Time"]..":", 0)
	theFrame.Damage.Time:SetPoint("TOP", theFrame.Damage.Taken, "BOTTOM", 0, 0)
	theFrame.Damage.Focus = me:CreateDataItem(theFrame.Damage, L["Damage Focus"]..":", 0)
	theFrame.Damage.Focus:SetPoint("TOP", theFrame.Damage.Time, "BOTTOM", 0, 0)
	theFrame.Damage.Misc = me:CreateDataItem(theFrame.Damage, L["Avg. DOTs Up"]..":", 0)
	theFrame.Damage.Misc:SetPoint("TOP", theFrame.Damage.Focus, "BOTTOM", 0, 0)

	Recount.Colors:RegisterTexture("Other Windows", "Title", Graph:DrawLine(theFrame, 150 + (50 / 3) + 20, 290 + 26 - 2, 150 + (50 / 3) + 20, 186 + 26, 24, {0.5, 0.0, 0.0, 1.0}, "ARTWORK"), {r = 0.5, g = 0.5, b = 0.5, a = 1})

	--Pet Damage
	theFrame.Pet = CreateFrame("Frame", nil, theFrame)
	theFrame.Pet:SetHeight(105 - 2)
	theFrame.Pet:SetWidth(150 + 20 + (50 / 3))
	theFrame.Pet:SetPoint("LEFT", theFrame.Damage, "RIGHT")
	theFrame.Pet:SetFrameLevel(theFrame:GetFrameLevel())
	theFrame.Pet.Report = me.ReportSummarySet

	theFrame.Pet.SelectMe = me.SelectSummaryItem
	theFrame.Pet:EnableMouse(true)
	theFrame.Pet:SetScript("OnMouseDown", function()
		Recount.DetailWindow.SummaryMode.CurrentPet = Recount.DetailWindow.SummaryMode.CurrentPet + 1
		Recount:UpdateSummaryMode(Recount.MainWindow.Selected)
		theFrame.Pet.SelectMe(theFrame.Pet)
	end)

	theFrame.Pet.Selected = theFrame.Damage:CreateTexture(nil, "BACKGROUND")
	theFrame.Pet.Selected:SetColorTexture(1.0, 0.0, 0, 0.1)
	--Recount.Colors:RegisterTexture("Window", "Title", theFrame.Pet.Selected)
	theFrame.Pet.Selected:SetAllPoints(theFrame.Pet)
	theFrame.Pet.Selected:Hide()

	theFrame.Pet.Title = me:CreateDataItem(theFrame, L["Pet Damage"]..":", L["No Pet"], "GameFontNormal")
	theFrame.Pet.Title:SetPoint("TOPLEFT", theFrame.Pet, "TOPLEFT", 0, 0)
	theFrame.Pet.Total = me:CreateDataItem(theFrame.Pet, L["Total"]..":", 0)
	theFrame.Pet.Total:SetPoint("TOP", theFrame.Pet.Title, "BOTTOM", 0, 0)
	theFrame.Pet.PerSec = me:CreateDataItem(theFrame.Pet, L["DPS"]..":", 0)
	theFrame.Pet.PerSec:SetPoint("TOP", theFrame.Pet.Total, "BOTTOM", 0, 0)
	theFrame.Pet.Taken = me:CreateDataItem(theFrame.Pet, L["Taken"]..":", 0)
	theFrame.Pet.Taken:SetPoint("TOP", theFrame.Pet.PerSec, "BOTTOM", 0, 0)
	theFrame.Pet.Time = me:CreateDataItem(theFrame.Pet, L["Pet Time"]..":", 0)
	theFrame.Pet.Time:SetPoint("TOP", theFrame.Pet.Taken, "BOTTOM", 0, 0)
	theFrame.Pet.Focus = me:CreateDataItem(theFrame.Pet, L["Pet Focus"]..":", 0)
	theFrame.Pet.Focus:SetPoint("TOP", theFrame.Pet.Time, "BOTTOM", 0, 0)
	theFrame.Pet.Page = theFrame.Pet:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	theFrame.Pet.Page:SetText("")
	theFrame.Pet.Page:SetPoint("TOP", theFrame.Pet.Focus, "BOTTOM", 0, 0)
	Recount:AddFontString(theFrame.Pet.Page)

	Recount.Colors:RegisterTexture("Other Windows", "Title", Graph:DrawLine(theFrame, 300 + (50 * 2 / 3) + 40, 290 + 26 - 2, 300 + (50 * 2 / 3) + 40, 186 + 26, 24, {0.5, 0.0, 0.0, 1.0}, "ARTWORK"), {r = 0.5, g = 0.5, b = 0.5, a = 1})

	--Healing Line
	theFrame.Healing = CreateFrame("Frame", nil, theFrame)
	theFrame.Healing:SetHeight(105 - 2)
	theFrame.Healing:SetWidth(149 + 20 + (50 / 3))
	theFrame.Healing:SetPoint("LEFT", theFrame.Pet, "RIGHT")
	theFrame.Healing:SetFrameLevel(theFrame:GetFrameLevel())
	theFrame.Healing.Report = me.ReportSummarySet

	theFrame.Healing.SelectMe = me.SelectSummaryItem
	theFrame.Healing:EnableMouse(true)
	theFrame.Healing:SetScript("OnMouseDown", theFrame.Healing.SelectMe)

	theFrame.Healing.Selected = theFrame.Damage:CreateTexture(nil, "BACKGROUND")
	theFrame.Healing.Selected:SetColorTexture(1.0, 0.0, 0, 0.1)
	theFrame.Healing.Selected:SetAllPoints(theFrame.Healing)
	theFrame.Healing.Selected:Hide()

	theFrame.Healing.Title = me:CreateTitle(theFrame, L["Healing"], "GameFontNormal")
	theFrame.Healing.Title:SetPoint("TOPLEFT", theFrame.Healing, "TOPLEFT", 0, 0)
	theFrame.Healing.Total = me:CreateDataItem(theFrame.Healing, L["Total"]..":", 0)
	theFrame.Healing.Total:SetPoint("TOP", theFrame.Healing.Title, "BOTTOM", 0, 0)
	theFrame.Healing.Overhealing = me:CreateDataItem(theFrame.Healing, L["Overhealing"]..":", 0)
	theFrame.Healing.Overhealing:SetPoint("TOP", theFrame.Healing.Total, "BOTTOM", 0, 0)
	theFrame.Healing.Taken = me:CreateDataItem(theFrame.Healing, L["Taken"]..":", 0)
	theFrame.Healing.Taken:SetPoint("TOP", theFrame.Healing.Overhealing, "BOTTOM", 0, 0)
	theFrame.Healing.Time = me:CreateDataItem(theFrame.Healing, L["Time"]..":", 0)
	theFrame.Healing.Time:SetPoint("TOP", theFrame.Healing.Taken, "BOTTOM", 0, 0)
	theFrame.Healing.Focus = me:CreateDataItem(theFrame.Healing, L["Heal Focus"]..":", 0)
	theFrame.Healing.Focus:SetPoint("TOP", theFrame.Healing.Time, "BOTTOM", 0, 0)
	theFrame.Healing.Misc = me:CreateDataItem(theFrame.Healing, L["Avg. HOTs Up"]..":", 0)
	theFrame.Healing.Misc:SetPoint("TOP", theFrame.Healing.Focus, "BOTTOM", 0, 0)

	Recount.Colors:RegisterTexture("Other Windows", "Title", Graph:DrawLine(theFrame, 1, 186 + 26, 449 + 50 + 60, 186 + 26, 24, {0.5, 0.0, 0.0, 1.0}, "ARTWORK"), {r = 0.5, g = 0.5, b = 0.5, a = 1})

	theFrame.DamageMode = true
	theFrame.CurrentPet = 1

	--Frame for switching between done/taken
	theFrame.AttackSummary = CreateFrame("Frame", nil, theFrame)
	local AttackSummary = theFrame.AttackSummary

	AttackSummary:SetWidth(270 + 50)
	AttackSummary:SetHeight(20)
	AttackSummary:SetPoint("TOP", theFrame, "TOP", 0, -104)

	AttackSummary.Background = AttackSummary:CreateTexture(nil, "BACKGROUND")
	AttackSummary.Background:SetAllPoints(AttackSummary)
	AttackSummary.Background:SetColorTexture(0, 0, 0, 0.3)

	AttackSummary.Text = AttackSummary:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	AttackSummary.Text:SetText(L["Attack Summary Outgoing (Click for Incoming)"])
	AttackSummary.Text:SetPoint("CENTER", AttackSummary, "CENTER")
	Recount:AddFontString(AttackSummary.Text)

	AttackSummary:EnableMouse(true)
	AttackSummary:SetScript("OnMouseDown", function()
		Recount.DetailWindow.SummaryMode.DamageMode = not Recount.DetailWindow.SummaryMode.DamageMode

		if Recount.DetailWindow.SummaryMode.DamageMode then
			AttackSummary.Text:SetText(L["Attack Summary Outgoing (Click for Incoming)"])
		else
			AttackSummary.Text:SetText(L["Attack Summary Incoming (Click for Outgoing)"])
		end
		Recount:UpdateSummaryMode(Recount.MainWindow.Selected)
	end)

	theFrame:Hide()
end

function me:CalculateFocus(t)
	local Total = 0
	local Focus, Temp
	Focus = 0

	if t then
		for _, v in pairs(t) do
			Total = Total + v.amount
		end

		if Total ~= 0 then
			for _, v in pairs(t) do
				Temp = v.amount / Total
				Focus = Focus + Temp * Temp
			end
		end
	end

	if Total ~= 0 and Focus ~= 0 then
		return math.floor(10 / Focus + 0.5) / 10, math.floor(Focus * 100 + 0.5)
	else
		return 0, 0
	end
end

function Recount:UpdateSummaryMode(name)
	local Num, Focus
	local data = Recount.db2.combatants[name]
	Recount.DetailWindow.SummaryTitle = L["Summary Report for"].." "..name
	Recount.DetailWindow.Showing = name

	if Recount.DetailWindow.SummaryEnabled then
		Recount.DetailWindow.Title:SetText(Recount.DetailWindow.SummaryTitle)
	end

	local data2 = data.Fights[Recount.db.profile.CurDataSet]

	local timedamage = data2.TimeDamage or 0
	local TotalTime = (data2.TimeHeal or 0) + (timedamage or 0) + Epsilon
	local theFrame = Recount.DetailWindow.SummaryMode

	local damage = data2.Damage or 0
	local activetime = (data2.ActiveTime or 0) + Epsilon
	local damagetaken = data2.DamageTaken or 0
	local dot_time = data2.DOT_Time or 0
	theFrame.Damage.Total:SetValue(damage)
	theFrame.Damage.Taken:SetValue(damagetaken)
	theFrame.Damage.PerSec:SetValue((math.floor(10 * damage / (activetime) + 0.5) / 10))
	theFrame.Damage.Time:SetValue(timedamage.."s ("..math.floor(100 * timedamage / (TotalTime + Epsilon) + 0.5).."%)")
	theFrame.Damage.Misc:SetValue(math.floor(10 * dot_time / (activetime + Epsilon) + 0.5) / 10)

	--Set Pet Data
	if data.Pet and #data.Pet > 0 then
		if Recount.DetailWindow.SummaryMode.CurrentPet > #data.Pet then
			Recount.DetailWindow.SummaryMode.CurrentPet = 1
		end
		--if not Recount.db2.combatants[data.Pet[Recount.DetailWindow.SummaryMode.CurrentPet] ] then
		--	Recount:Print("uninitialized Pet: "..data.Pet[Recount.DetailWindow.SummaryMode.CurrentPet].." "..#data.Pet.." please report")
		--end
		while not Recount.db2.combatants[data.Pet[Recount.DetailWindow.SummaryMode.CurrentPet]] and #data.Pet > 0 do
			for k, v in pairs(data.Pet) do
				if v == data.Pet[Recount.DetailWindow.SummaryMode.CurrentPet] then
					--Recount:Print("removed: "..v)
					table.remove(data.Pet, k) -- Elsia: Remove deleted pet
				--else
					--Recount:Print("eek")
				end
			end
			Recount.DetailWindow.SummaryMode.CurrentPet = Recount.DetailWindow.SummaryMode.CurrentPet + 1
			if Recount.DetailWindow.SummaryMode.CurrentPet > #data.Pet then
				Recount.DetailWindow.SummaryMode.CurrentPet = 1
			end
		end
	end

	if data.Pet and #data.Pet > 0 then
		local currentPet = Recount.DetailWindow.SummaryMode.CurrentPet
		local pet = Recount.db2.combatants[data.Pet[currentPet] ]
		theFrame.Pet.Title:SetValue(pet.Name)
		local petdata2 = pet.Fights[Recount.db.profile.CurDataSet]
		local petdamage = petdata2 and petdata2.Damage or 0
		local petdamagetaken = petdata2 and petdata2.DamageTaken or 0
		local petactivetime = (petdata2 and petdata2.ActiveTime or 0) + Epsilon
		local pettimedamage = petdata2 and petdata2.TimeDamage or 0
		local pettimedamaging = petdata2 and petdata2.TimeDamaging
		theFrame.Pet.Total:SetValue(petdamage.." ("..math.floor(100 * petdamage / (petdamage + damage + Epsilon) + 0.5).."%)")
		theFrame.Pet.Taken:SetValue(petdamagetaken)
		theFrame.Pet.PerSec:SetValue((math.floor(10 * petdamage / petactivetime + 0.5) / 10))
		theFrame.Pet.Time:SetValue(pettimedamage)
		Num, Focus = me:CalculateFocus(pettimedamaging)
		theFrame.Pet.Focus:SetValue(Num.." ("..Focus.."%)")

		if #data.Pet > 1 then
			theFrame.Pet.Page:SetText(L["Click for next Pet"])
		else
			theFrame.Pet.Page:SetText(" ")
		end
	else
		theFrame.Pet.Title:SetValue(L["No Pet"])
		theFrame.Pet.Total:SetValue("0")
		theFrame.Pet.PerSec:SetValue("0")
		theFrame.Pet.Taken:SetValue("0")
		theFrame.Pet.Time:SetValue("0")
		theFrame.Pet.Focus:SetValue("0")
		theFrame.Pet.Page:SetText(" ")
	end

	local healing = data2.Healing or 0
	local absorbs = data2.Absorbs or 0
	local overhealing = data2.Overhealing or 0
	local healingtaken = data2.HealingTaken or 0
	local timeheal = data2.TimeHeal or 0
	local hot_time = data2.HOT_Time or 0

	theFrame.Healing.Total:SetValue((healing + absorbs).." ("..(math.floor(10 * (healing + absorbs) / (activetime) + 0.5) / 10)..")")
	theFrame.Healing.Taken:SetValue(healingtaken)
	theFrame.Healing.Overhealing:SetValue(overhealing.." ("..(math.floor(10 * overhealing / (activetime) + 0.5) / 10)..")".." ("..(math.floor(1000 * overhealing / (overhealing + healing + Epsilon) + 0.5) / 10).."%)")
	theFrame.Healing.Time:SetValue(timeheal.."s ("..math.floor(100 * timeheal / (TotalTime + Epsilon) + 0.5).."%)")
	theFrame.Healing.Misc:SetValue(math.floor(10 * hot_time / (activetime + Epsilon) + 0.5) / 10)


	local timedamaging = data2.TimeDamaging

	Num, Focus = me:CalculateFocus(timedamaging)
	theFrame.Damage.Focus:SetValue(Num.." ("..Focus.."%)")

	local timehealing = data2.TimeHealing

	Num, Focus = me:CalculateFocus(timehealing)
	theFrame.Healing.Focus:SetValue(Num.." ("..Focus.."%)")


	theFrame.Name = name
	if theFrame.DamageMode then
		me:LoadSummaryData(data2.ElementDone, data2.ElementDoneResist, data2.ElementHitsDone, data2.ElementDoneBlock, data2.ElementDoneAbsorb)
	else
		me:LoadSummaryData(data2.ElementTaken, data2.ElementTakenResist, data2.ElementHitsTaken, data2.ElementTakenBlock, data2.ElementTakenAbsorb)
	end
end


--Create Detail Window Function
function Recount:CreateDetailWindow()
	Recount.DetailWindow = CreateFrame("Frame", "Recount_DetailWindow", UIParent, BackdropTemplateMixin and "BackdropTemplate")

	local theFrame = Recount.DetailWindow

	theFrame:ClearAllPoints()
	theFrame:SetPoint("CENTER", UIParent, "CENTER")
	theFrame:SetHeight(320 + 26)
	theFrame:SetWidth(450 + 50 + 60)
	theFrame:SetFrameLevel(Recount.MainWindow:GetFrameLevel() + 10)

	theFrame:SetBackdrop({
		bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16,
		edgeFile = "Interface\\AddOns\\Recount\\textures\\otravi-semi-full-border", edgeSize = 32,
		insets = {left = 1, right = 1, top = 20, bottom = 1},
	})
	theFrame:SetBackdropBorderColor(1.0, 0.0, 0.0)
	theFrame:SetBackdropColor(24 / 255, 24 / 255, 24 / 255)

	Recount.Colors:RegisterBorder("Other Windows", "Title", theFrame)
	Recount.Colors:RegisterBackground("Other Windows", "Background", theFrame)

	theFrame:EnableMouse(true)
	theFrame:SetMovable(true)
	--theFrame:RegisterForDrag("LeftButton")
	--theFrame:SetScript("OnDragStart",theFrame.StartMoving)
	--theFrame:SetScript("OnDragStop",theFrame.StopMovingOrSizing)

	theFrame:SetScript("OnMouseDown", function(this, button)
		if ((not this.isLocked) or (this.isLocked == 0)) and (button == "LeftButton") then
			Recount:SetWindowTop(this)
			this:StartMoving()
			this.isMoving = true
		end
	end)
	theFrame:SetScript("OnMouseUp", function(this)
		if (this.isMoving) then
			local point, relativeTo, relativePoint, xOfs, yOfs = this:GetPoint(1)
			Recount.db.profile.DetailWindowX = xOfs
			Recount.db.profile.DetailWindowY = yOfs
			this:StopMovingOrSizing()
			this.isMoving = false
		end
	end)
	theFrame:SetScript("OnShow", function(this)
		Recount:SetWindowTop(this)
	end)

	theFrame:SetScript("OnHide", function(this)
		if ( this.isMoving ) then
			local point, relativeTo, relativePoint, xOfs, yOfs = this:GetPoint(1)
			Recount.db.profile.DetailWindowX = xOfs
			Recount.db.profile.DetailWindowY = yOfs
			this:StopMovingOrSizing()
			this.isMoving = false
		end
	end)

	theFrame.Title = theFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	theFrame.Title:SetPoint("TOPLEFT", theFrame, "TOPLEFT", 6, -15)
	theFrame.Title:SetTextColor(1.0, 1.0, 1.0, 1.0)
	theFrame.Title:SetText(L["Detail Window"].." - Hostile Abilites")
	Recount:AddFontString(theFrame.Title)

	--Recount.Colors:UnregisterItem(Recount.DetailWindow.Title)
	Recount.Colors:RegisterFont("Other Windows", "Title Text", Recount.DetailWindow.Title)


	theFrame.CloseButton = CreateFrame("Button", nil, theFrame)
	theFrame.CloseButton:SetNormalTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Up")
	theFrame.CloseButton:SetPushedTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Down")
	theFrame.CloseButton:SetHighlightTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Highlight")
	theFrame.CloseButton:SetWidth(20)
	theFrame.CloseButton:SetHeight(20)
	theFrame.CloseButton:SetPoint("TOPRIGHT", theFrame, "TOPRIGHT", -4, -12)
	theFrame.CloseButton:SetScript("OnClick", function(this)
		this:GetParent():Hide()
	end)

	theFrame.LeftButton = CreateFrame("Button", nil, theFrame)
	theFrame.LeftButton:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Up")
	theFrame.LeftButton:SetPushedTexture("Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Down")
	theFrame.LeftButton:SetHighlightTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Highlight.blp")
	theFrame.LeftButton:SetWidth(16)
	theFrame.LeftButton:SetHeight(16)
	theFrame.LeftButton:SetPoint("TOPRIGHT", theFrame, "TOPRIGHT", -40, -14)
	theFrame.LeftButton:SetScript("OnClick", function()
		Recount:DetailWindowPrevMode()
	end)

	theFrame.RightButton = CreateFrame("Button", nil, theFrame)
	theFrame.RightButton:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Up")
	theFrame.RightButton:SetPushedTexture("Interface\\Buttons\\UI-SpellbookIcon-NextPage-Down")
	theFrame.RightButton:SetHighlightTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Highlight.blp")
	theFrame.RightButton:SetWidth(16)
	theFrame.RightButton:SetHeight(16)
	theFrame.RightButton:SetPoint("LEFT", theFrame.LeftButton, "RIGHT", 1, 0)
	theFrame.RightButton:SetScript("OnClick", function()
		Recount:DetailWindowNextMode()
	end)

	theFrame.ReportButton = CreateFrame("Button", nil, theFrame)
	theFrame.ReportButton:SetNormalTexture("Interface\\Buttons\\UI-GuildButton-MOTD-Up")
	theFrame.ReportButton:SetHighlightTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Highlight")
	theFrame.ReportButton:SetWidth(16)
	theFrame.ReportButton:SetHeight(16)
	theFrame.ReportButton:SetPoint("RIGHT", theFrame.LeftButton, "LEFT", -2, 0)
	theFrame.ReportButton:SetScript("OnClick", function()
		Recount:ShowReport("Detail", Recount.ReportDetail)
	end)

	theFrame.SummaryButton = CreateFrame("Button", nil, theFrame)
	theFrame.SummaryButton:SetNormalTexture("Interface\\Addons\\Recount\\Textures\\icon-summary")
	theFrame.SummaryButton:SetHighlightTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Highlight.blp")
	theFrame.SummaryButton:SetWidth(16)
	theFrame.SummaryButton:SetHeight(16)
	theFrame.SummaryButton:SetPoint("RIGHT", theFrame.ReportButton, "LEFT", -2, 0)
	theFrame.SummaryButton:SetScript("OnClick", function()
		Recount.DetailWindow.SummaryEnabled = not Recount.DetailWindow.SummaryEnabled
		if Recount.DetailWindow.SummaryEnabled then
			me:HideDetailModes()
			Recount.DetailWindow.Title:SetText(Recount.DetailWindow.SummaryTitle)
			Recount.DetailWindow.SummaryMode:Show()
		else
			me:HideDetailModes()
			Recount.DetailWindow.Title:SetText(Recount.DetailWindow.CurTitle)
			Recount.DetailWindow.CurMode:Show()
		end
	end)


	theFrame.PieMode = CreateFrame("Frame", "Recount_DetailWindow_PieDetails", theFrame)
	local PieMode = theFrame.PieMode

	PieMode:ClearAllPoints()
	PieMode:SetPoint("BOTTOM", theFrame)
	PieMode:SetHeight(320 - 32 + 26)
	PieMode:SetWidth(450 + 50 + 60)

	PieMode.TopPieChart = Graph:CreateGraphPieChart("Recount_DetailWindow_TopPieChart", PieMode, "LEFT", "LEFT", 0, 72.5, 150, 150)--56.5, 150, 150)
	PieMode.BotPieChart = Graph:CreateGraphPieChart("Recount_DetailWindow_BotPieChart", PieMode, "LEFT", "LEFT", 0, -72.5, 150, 150)--88, 150, 150)

	PieMode.TopPieChart:SetSelectionFunc(Recount.SelectUpperDetailTablePie)
	PieMode.BotPieChart:SetSelectionFunc(me.SelectLowerDetailTable)

	PieMode.TopRowLabels = CreateFrame("FRAME", nil, PieMode)
	local Labels = PieMode.TopRowLabels

	Labels:SetPoint("TOPLEFT", PieMode, "TOP", -70-25, -1)
	Labels:SetWidth(270 + 50)
	Labels:SetHeight(RowHeight)

	Labels.Key = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.Key:SetPoint("LEFT", Labels, "LEFT", 2, 0)
	Labels.Key:SetText("K")
	Recount:AddFontString(Labels.Key)

	Labels.Count = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.Count:SetPoint("LEFT", Labels, "LEFT", 16, 0)
	Labels.Count:SetText("#")
	Recount:AddFontString(Labels.Count)

	Labels.Name = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.Name:SetPoint("LEFT", Labels, "LEFT", 30, 0)
	Labels.Name:SetText(L["Name of Ability"])
	Recount:AddFontString(Labels.Name)

	Labels.ACount = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.ACount:SetPoint("RIGHT", Labels, "RIGHT", -120 + 10, 0)
	Labels.ACount:SetText(L["Count"])
	Recount:AddFontString(Labels.ACount)

	Labels.Amount = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.Amount:SetPoint("RIGHT", Labels, "RIGHT", -50 + 30, 0)
	Labels.Amount:SetText(L["Damage"])
	Recount:AddFontString(Labels.Amount)

	Labels.Percent = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.Percent:SetPoint("RIGHT", Labels, "RIGHT", 4 + 30, 0)
	Labels.Percent:SetText("%")
	Recount:AddFontString(Labels.Percent)

	PieMode.TopRows = { }

	for i = 1, 8 do
		local Row = CreateFrame("FRAME", nil, PieMode)

		Row.id = i
		Row:EnableMouse(true)
		Row:SetScript("OnEnter", function(this)
			Recount:SelectUpperDetailTable(this.id)
		end)
		Row:SetScript("OnMouseDown", function(this)
			Recount:LockUpperDetailTable(this.id)
		end)

		Row:SetWidth(270 + 50 + 30)
		Row:SetHeight(RowHeight)
		Row:SetPoint("TOPLEFT", PieMode, "TOP", -70 - 25, -(RowHeight + 2) * i)

		Row.Background = Row:CreateTexture(nil, "BACKGROUND")
		Row.Background:SetAllPoints(Row)
		Row.Background:SetTexture("Interface\\Buttons\\WHITE8X8.blp")
		Row.Background:Hide()

		Row.Key = Row:CreateTexture(nil, "OVERLAY")
		Row.Key:SetPoint("LEFT", Row, "LEFT", 0, 0)
		Row.Key:SetTexture("Interface\\Buttons\\WHITE8X8.blp")
		Row.Key:SetWidth(RowHeight)
		Row.Key:SetHeight(RowHeight)

		Row.Selected = Row:CreateTexture(nil, "OVERLAY")
		Row.Selected:SetPoint("RIGHT", Row, "LEFT", 0, 0)
		Row.Selected:SetTexture("Interface\\Addons\\Recount\\Textures\\arrow.tga")
		Row.Selected:SetWidth(RowHeight)
		Row.Selected:SetHeight(RowHeight)
		Row.Selected:Hide()


		Row.Count = Row:CreateFontString(nil, "OVERLAY", "GameFontNormal")
		Row.Count:SetPoint("LEFT", Row.Key, "LEFT", 16, 0)
		Row.Count:SetText(i)
		Row.Count:SetTextColor(1.0, 1.0, 1.0, 1.0)
		Recount:AddFontString(Row.Count)

		Row.Name = Row:CreateFontString(nil, "OVERLAY", "GameFontNormal")
		Row.Name:SetPoint("LEFT", Row, "LEFT", 30, 0)
		Row.Name:SetText("Test")
		Row.Name:SetTextColor(1.0, 1.0, 1.0, 1.0)
		Recount:AddFontString(Row.Name)

		Row.ACount = Row:CreateFontString(nil, "OVERLAY", "GameFontNormal")
		Row.ACount:SetPoint("RIGHT", Row, "RIGHT", -120 - 20, 0)
		Row.ACount:SetText("815")
		Row.ACount:SetTextColor(1.0, 1.0, 1.0, 1.0)
		Recount:AddFontString(Row.ACount)

		Row.Amount = Row:CreateFontString(nil, "OVERLAY", "GameFontNormal")
		Row.Amount:SetPoint("RIGHT", Row, "RIGHT", -50, 0)
		Row.Amount:SetText("12345")
		Row.Amount:SetTextColor(1.0, 1.0, 1.0, 1.0)
		Recount:AddFontString(Row.Amount)

		Row.Percent = Row:CreateFontString(nil, "OVERLAY", "GameFontNormal")
		Row.Percent:SetPoint("RIGHT", Row, "RIGHT", 4, 0)
		Row.Percent:SetText("10%")
		Row.Percent:SetTextColor(1.0, 1.0, 1.0, 1.0)
		Recount:AddFontString(Row.Percent)


		PieMode.TopRows[i] = Row
	end

	PieMode.ScrollBar1 = CreateFrame("SCROLLFRAME", "Recount_PieMode_Scrollbar2", PieMode, "FauxScrollFrameTemplate")
	PieMode.ScrollBar1:SetScript("OnVerticalScroll", function(self, offset)
		FauxScrollFrame_OnVerticalScroll(self, offset, 12, me.RefreshUpperDetails)
	end)
	PieMode.ScrollBar1:SetPoint("TOPLEFT", PieMode.TopRows[1], "TOPLEFT")
	PieMode.ScrollBar1:SetPoint("BOTTOMRIGHT", PieMode.TopRows[8], "BOTTOMRIGHT")
	Recount:SetupScrollbar("Recount_PieMode_Scrollbar2")

	local Halfway = (PieMode:GetHeight()) / 2
	Recount.Colors:RegisterTexture("Other Windows", "Title", Graph:DrawLine(PieMode, 2, Halfway, PieMode:GetWidth()-2, Halfway, 24, {0.6, 0.0, 0.0, 1.0}, "ARTWORK"), {r = 0.5, g = 0.5, b = 0.5, a = 1})


	PieMode.BotRowLabels = CreateFrame("FRAME", nil, PieMode)
	local Labels = PieMode.BotRowLabels

	Labels:SetPoint("TOPLEFT", PieMode, "TOP", -70 - 25, -Halfway) -- This is 50/2, the added width of the bars in the view.
	Labels:SetWidth(270 + 50)
	Labels:SetHeight(RowHeight)

	Labels.Key = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.Key:SetPoint("LEFT", Labels, "LEFT", 2, 0)
	Labels.Key:SetText("K")
	Recount:AddFontString(Labels.Key)

	Labels.Pos = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.Pos:SetPoint("LEFT", Labels, "LEFT", 16, 0)
	Labels.Pos:SetText("#")
	Recount:AddFontString(Labels.Pos)

	Labels.Name = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.Name:SetPoint("LEFT", Labels, "LEFT", 30, 0)
	Labels.Name:SetText(L["Type"])
	Recount:AddFontString(Labels.Name)

	Labels.Min = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.Min:SetPoint("RIGHT", Labels, "RIGHT", -185 + 30, 0)
	Labels.Min:SetText(L["Min"])
	Recount:AddFontString(Labels.Min)

	Labels.Avg = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.Avg:SetPoint("RIGHT", Labels, "RIGHT", -140 + 30, 0)
	Labels.Avg:SetText(L["Avg"])
	Recount:AddFontString(Labels.Avg)

	Labels.Max = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.Max:SetPoint("RIGHT", Labels, "RIGHT", -95 + 30, 0)
	Labels.Max:SetText(L["Max"])
	Recount:AddFontString(Labels.Max)

	Labels.Count = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.Count:SetPoint("RIGHT", Labels, "RIGHT", -50 + 30, 0)
	Labels.Count:SetText(L["Count"])
	Recount:AddFontString(Labels.Count)

	Labels.Percent = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.Percent:SetPoint("RIGHT", Labels, "RIGHT", 4 + 30, 0)
	Labels.Percent:SetText("%")
	Recount:AddFontString(Labels.Percent)

	PieMode.BotRows = {}

	for i = 1, 8 do
		local Row = CreateFrame("FRAME", nil, PieMode)

		Row.id = i
		Row:EnableMouse(true)
		Row:SetScript("OnEnter", function(this)
			me:SelectLowerDetailTable(this.id)
		end)

		Row:SetWidth(270 + 50 + 30)
		Row:SetHeight(RowHeight)
		Row:SetPoint("TOPLEFT", PieMode, "TOP", -70 - 25, -Halfway - (RowHeight + 2) * i)

		Row.Background = Row:CreateTexture(nil, "BACKGROUND")
		Row.Background:SetAllPoints(Row)
		Row.Background:SetTexture("Interface\\Buttons\\WHITE8X8.blp")
		Row.Background:Hide()

		Row.Key = Row:CreateTexture(nil, "OVERLAY")
		Row.Key:SetPoint("LEFT", Row, "LEFT", 0, 0)
		Row.Key:SetTexture("Interface\\Buttons\\WHITE8X8.blp")
		Row.Key:SetWidth(12)
		Row.Key:SetHeight(12)

		Row.Pos = Row:CreateFontString(nil, "OVERLAY", "GameFontNormal")
		Row.Pos:SetPoint("LEFT", Row.Key, "LEFT", 16, 0)
		Row.Pos:SetText(i)
		Row.Pos:SetTextColor(1.0, 1.0, 1.0, 1.0)
		Recount:AddFontString(Row.Pos)

		Row.Name = Row:CreateFontString(nil, "OVERLAY", "GameFontNormal")
		Row.Name:SetPoint("LEFT", Row, "LEFT", 30, 0)
		Row.Name:SetText("Test")
		Row.Name:SetTextColor(1.0, 1.0, 1.0, 1.0)
		Recount:AddFontString(Row.Name)

		Row.Min = Row:CreateFontString(nil, "OVERLAY", "GameFontNormal")
		Row.Min:SetPoint("RIGHT", Row, "RIGHT", -185, 0)
		Row.Min:SetText("32")
		Row.Min:SetTextColor(1.0, 1.0, 1.0, 1.0)
		Recount:AddFontString(Row.Min)

		Row.Avg = Row:CreateFontString(nil, "OVERLAY", "GameFontNormal")
		Row.Avg:SetPoint("RIGHT", Row, "RIGHT", -140, 0)
		Row.Avg:SetText("32")
		Row.Avg:SetTextColor(1.0, 1.0, 1.0, 1.0)
		Recount:AddFontString(Row.Avg)

		Row.Max = Row:CreateFontString(nil, "OVERLAY", "GameFontNormal")
		Row.Max:SetPoint("RIGHT", Row, "RIGHT", -95, 0)
		Row.Max:SetText("32")
		Row.Max:SetTextColor(1.0, 1.0, 1.0, 1.0)
		Recount:AddFontString(Row.Max)

		Row.Count = Row:CreateFontString(nil, "OVERLAY", "GameFontNormal")
		Row.Count:SetPoint("RIGHT", Row, "RIGHT", -50, 0)
		Row.Count:SetText("32")
		Row.Count:SetTextColor(1.0, 1.0, 1.0, 1.0)
		Recount:AddFontString(Row.Count)

		Row.Percent = Row:CreateFontString(nil, "OVERLAY", "GameFontNormal")
		Row.Percent:SetPoint("RIGHT", Row, "RIGHT", 4, 0)
		Row.Percent:SetText("10%")
		Row.Percent:SetTextColor(1.0, 1.0, 1.0, 1.0)
		Recount:AddFontString(Row.Percent)


		PieMode.BotRows[i] = Row
	end

	theFrame.DeathMode = CreateFrame("FRAME", "Recount_DetailWindow_DeathMode", theFrame)
	local DeathMode = theFrame.DeathMode

	DeathMode:ClearAllPoints()
	DeathMode:SetPoint("BOTTOM", theFrame)
	DeathMode:SetHeight(320 - 32 + 26)
	DeathMode:SetWidth(450 + 50)

	DeathMode.DeathLabels = CreateFrame("FRAME", nil, DeathMode)
	local Labels = DeathMode.DeathLabels

	Labels:SetPoint("TOPLEFT", DeathMode, "TOPLEFT", 2, 0)
	Labels:SetWidth(150 + 25 - 10)
	Labels:SetHeight(RowHeight)

	Labels.Times = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.Times:SetPoint("LEFT", Labels, "LEFT", 0, 0)
	Labels.Times:SetText(L["Time"])
	Recount:AddFontString(Labels.Times)

	Labels.Who = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.Who:SetPoint("RIGHT", Labels, "RIGHT", -10, 0)
	Labels.Who:SetText(L["Killed By"])
	Recount:AddFontString(Labels.Who)

	DeathMode.Deaths = {}



	for i = 1, 17 do
		local Row = CreateFrame("FRAME", nil, DeathMode)

		Row.id = i
		Row:EnableMouse(true)
		Row:SetScript("OnEnter", function()
			Row.Highlighted:Show()
		end)
		Row:SetScript("OnLeave", function()
			Row.Highlighted:Hide()
		end)
		Row:SetScript("OnMouseDown", function(this)
			Recount:SetDeathLogDetails(this.id)
		end)

		Row:SetWidth(125 + 25 + 25 - 10)
		Row:SetHeight(RowHeight)
		Row:SetPoint("TOPLEFT", DeathMode, "TOPLEFT", 2, -(RowHeight + 2) * i)

		Row.Selected = Row:CreateTexture(nil, "BACKGROUND")
		Row.Selected:SetAllPoints(Row)
		Row.Selected:SetColorTexture(1, 1, 0, 0.3)
		Row.Selected:Hide()

		Row.Highlighted = Row:CreateTexture(nil, "BACKGROUND")
		Row.Highlighted:SetAllPoints(Row)
		Row.Highlighted:SetColorTexture(1, 0, 0, 0.3)
		Row.Highlighted:Hide()

		Row.Time = Row:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
		Row.Time:SetPoint("LEFT", Row, "LEFT", 0, 0)
		Row.Time:SetText(i)
		Row.Time:SetTextColor(1.0, 1.0, 1.0, 1.0)
		Recount:AddFontString(Row.Time)

		Row.Who = Row:CreateFontString(nil, "OVERLAY", "GameFontNormal")
		Row.Who:SetPoint("RIGHT", Row, "RIGHT", -10, 0)
		Row.Who:SetText("Test")
		Row.Who:SetTextColor(1.0, 1.0, 1.0, 1.0)
		Recount:AddFontString(Row.Who)

		DeathMode.Deaths[i] = Row
	end

	DeathMode.ScrollBar1 = CreateFrame("SCROLLFRAME", DeathMode:GetName().."_Scrollbar1", DeathMode, "FauxScrollFrameTemplate")
	DeathMode.ScrollBar1:SetScript("OnVerticalScroll", function(self, offset)
		FauxScrollFrame_OnVerticalScroll(self, offset, 17, me.RefreshDeathDetails)
	end)
	DeathMode.ScrollBar1:SetPoint("TOPLEFT", DeathMode.Deaths[1], "TOPLEFT")
	DeathMode.ScrollBar1:SetPoint("BOTTOMRIGHT", DeathMode.Deaths[17], "BOTTOMRIGHT", -1, 0)

	DeathMode.DeathLogLabels = CreateFrame("FRAME", nil, DeathMode)
	local Labels = DeathMode.DeathLogLabels

	Labels:SetPoint("TOPRIGHT", DeathMode, "TOPRIGHT", 0, 0)
	Labels:SetWidth(300 + 25 - 10)
	Labels:SetHeight(RowHeight)

	Labels.Times = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.Times:SetPoint("LEFT", Labels, "LEFT", 3, -1)
	Labels.Times:SetText(L["Time"])
	Recount:AddFontString(Labels.Times)

	Labels.Who = Labels:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	Labels.Who:SetPoint("LEFT", Labels, "LEFT", 40 + 20, -1)
	Labels.Who:SetText(L["Combat Messages"])
	Recount:AddFontString(Labels.Who)

	DeathMode.DeathLog = {}

	for i = 1, 20 do
		local Row = CreateFrame("FRAME", nil, DeathMode)

		Row.id = i

		Row:SetWidth(270 + 25 - 10)
		Row:SetHeight(13)
		Row:SetPoint("TOPRIGHT", DeathMode, "TOPRIGHT", -25, -14 - 13 * (i - 1))

		Row.Background = Row:CreateTexture(nil, "BACKGROUND")
		Row.Background:SetAllPoints(Row)
		Row.Background:SetColorTexture(1, 1, 1, 0.25)
		Row.Background:Show()

		Row.Time = Row:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
		Row.Time:SetPoint("LEFT", Row, "LEFT", 3, 0)
		Row.Time:SetText(i)
		Row.Time:SetTextColor(1.0, 1.0, 1.0, 1.0)
		Recount:AddFontString(Row.Time)

		Row.Msg = Row:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
		Row.Msg:SetPoint("LEFT", Row, "LEFT", 40, 0)
		Row.Msg:SetText("Test")
		Row.Msg:SetTextColor(1.0, 1.0, 1.0, 1.0)
		Recount:AddFontString(Row.Msg)

		Row:Hide()

		DeathMode.DeathLog[i] = Row
	end

	Recount.Colors:RegisterTexture("Other Windows", "Title", Graph:DrawLine(DeathMode, 150 + 25, 1, 150 + 25, DeathMode:GetHeight() + 1 + 13, 24, {0.5, 0.0, 0.0, 1.0}, "ARTWORK"), {r = 0.5, g = 0.5, b = 0.5, a = 1})

	DeathMode.ScrollBar2 = CreateFrame("SCROLLFRAME", DeathMode:GetName().."_Scrollbar2", DeathMode, "FauxScrollFrameTemplate")
	DeathMode.ScrollBar2:SetScript("OnVerticalScroll", function(self, offset)
		FauxScrollFrame_OnVerticalScroll(self, offset, 12, me.RefreshDeathLogDetails)
	end)
	DeathMode.ScrollBar2:SetPoint("TOPLEFT", DeathMode.DeathLog[1], "TOPLEFT")
	DeathMode.ScrollBar2:SetPoint("BOTTOMRIGHT", DeathMode.DeathLog[20], "BOTTOMRIGHT")


	DeathMode.Damage = CreateFrame("CheckButton", nil, DeathMode)
	me:ConfigureDeathCheckbox(DeathMode.Damage)
	DeathMode.Damage:SetPoint("TOPLEFT", DeathMode.DeathLog[20], "BOTTOMLEFT", 0, -4)

	DeathMode.DamageText = DeathMode:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	DeathMode.DamageText:SetText(L["Damage"])
	DeathMode.DamageText:SetPoint("LEFT", DeathMode.Damage, "RIGHT", 2, 0)
	Recount:AddFontString(DeathMode.DamageText)

	DeathMode.Heal = CreateFrame("CheckButton", nil, DeathMode)
	me:ConfigureDeathCheckbox(DeathMode.Heal)
	DeathMode.Heal:SetPoint("LEFT", DeathMode.Damage, "LEFT", 75, 0)

	DeathMode.HealText = DeathMode:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	DeathMode.HealText:SetText(L["Heals"])
	DeathMode.HealText:SetPoint("LEFT", DeathMode.Heal, "RIGHT", 2, 0)
	Recount:AddFontString(DeathMode.HealText)

	DeathMode.Misc = CreateFrame("CheckButton", nil, DeathMode)
	me:ConfigureDeathCheckbox(DeathMode.Misc)
	DeathMode.Misc:SetPoint("LEFT", DeathMode.Heal, "LEFT", 60, 0)

	DeathMode.MiscText = DeathMode:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	DeathMode.MiscText:SetText(L["Misc"])
	DeathMode.MiscText:SetPoint("LEFT", DeathMode.Misc, "RIGHT", 2, 0)
	Recount:AddFontString(DeathMode.MiscText)

	DeathMode.Incoming = CreateFrame("CheckButton", nil, DeathMode)
	me:ConfigureDeathCheckbox(DeathMode.Incoming)
	DeathMode.Incoming:SetPoint("TOPLEFT", DeathMode.DeathLog[20], "BOTTOMLEFT", 0, -20)

	DeathMode.IncomingText = DeathMode:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	DeathMode.IncomingText:SetText(L["Incoming"])
	DeathMode.IncomingText:SetPoint("LEFT", DeathMode.Incoming, "RIGHT", 2, 0)
	Recount:AddFontString(DeathMode.IncomingText)

	DeathMode.Outgoing = CreateFrame("CheckButton", nil, DeathMode)
	me:ConfigureDeathCheckbox(DeathMode.Outgoing)
	DeathMode.Outgoing:SetPoint("LEFT", DeathMode.Incoming, "LEFT", 80, 0)

	DeathMode.OutgoingText = DeathMode:CreateFontString(nil, "OVERLAY", "GameFontNormal")
	DeathMode.OutgoingText:SetText(L["Outgoing"])
	DeathMode.OutgoingText:SetPoint("LEFT", DeathMode.Outgoing, "RIGHT", 2, 0)
	Recount:AddFontString(DeathMode.OutgoingText)

	DeathMode.ShowDeathGraph = CreateFrame("Button", nil, DeathMode, "UIPanelButtonTemplate")
	DeathMode.ShowDeathGraph:SetWidth(110)
	DeathMode.ShowDeathGraph:SetHeight(24)
	DeathMode.ShowDeathGraph:SetPoint("BOTTOMRIGHT", DeathMode, "BOTTOMRIGHT", -4, 4)
	DeathMode.ShowDeathGraph:SetScript("OnClick", function()
		me:ShowDeathGraph()
	end)
	DeathMode.ShowDeathGraph:SetText(L["Show Graph"])


	Recount.DetailWindow.DeathMode.Damage:SetChecked(Recount.db.profile.FilterDeathType.DAMAGE)
	Recount.DetailWindow.DeathMode.Heal:SetChecked(Recount.db.profile.FilterDeathType.HEAL)
	Recount.DetailWindow.DeathMode.Misc:SetChecked(Recount.db.profile.FilterDeathType.MISC)
	Recount.DetailWindow.DeathMode.Incoming:SetChecked(Recount.db.profile.FilterDeathIncoming[true])
	Recount.DetailWindow.DeathMode.Outgoing:SetChecked(Recount.db.profile.FilterDeathIncoming[false])

	Recount:SetupScrollbar(DeathMode:GetName().."_Scrollbar1")
	Recount:SetupScrollbar(DeathMode:GetName().."_Scrollbar2")

	Recount.DetailWindow.DeathMode.FilteredData = {
		MessageTimes = {},
		Messages = {},
		MessageType = {},
		MessageIncoming = {},
		Health = {},
	}

	theFrame:Hide()

	Recount.DetailWindow.PieMode.UpperTable = {}
	Recount.DetailWindow.PieMode.LowerTable = {}

	me:CreateSummaryMode()
end

function me:DetermineDeathFilters()
	Recount.db.profile.FilterDeathType.DAMAGE = Recount.DetailWindow.DeathMode.Damage:GetChecked() == true
	Recount.db.profile.FilterDeathType.HEAL = Recount.DetailWindow.DeathMode.Heal:GetChecked() == true
	Recount.db.profile.FilterDeathType.MISC = Recount.DetailWindow.DeathMode.Misc:GetChecked() == true

	Recount.db.profile.FilterDeathIncoming[true] = Recount.DetailWindow.DeathMode.Incoming:GetChecked() == true
	Recount.db.profile.FilterDeathIncoming[false] = Recount.DetailWindow.DeathMode.Outgoing:GetChecked() == true

	me:FilterDeathData(Recount.db.profile.FilterDeathType, Recount.db.profile.FilterDeathIncoming)
	me:RefreshDeathLogDetails()
end

function me:ConfigureDeathCheckbox(check)
	check:SetWidth(20)
	check:SetHeight(20)
	check:SetScript("OnClick", function(this)
		if this:GetChecked() then
			this:SetChecked(true)
		else
			this:SetChecked(false)
		end
		me:DetermineDeathFilters()
	end)
	check:SetNormalTexture("Interface\\Buttons\\UI-CheckBox-Up")
	check:SetPushedTexture("Interface\\Buttons\\UI-CheckBox-Down")
	check:SetDisabledCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check-Disabled")
	check:SetCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check")
	check:SetHighlightTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
end

function Recount:ReportDetail(amount, loc, loc2)
	if Recount.DetailWindow.SummaryEnabled then
		if Recount.DetailWindow.SummaryMode.Selected and Recount.DetailWindow.SummaryMode.Selected.Report then
			Recount.DetailWindow.SummaryMode.Selected:Report(loc, loc2)
		else
			Recount:Print("Need to select one of the summary data sets to report")
		end
		return
	end

	if Recount.DetailWindow.PieMode:IsVisible() then
		local UpperTable = Recount.DetailWindow.PieMode.UpperTable
		local Entry

		if not Recount.DetailWindow.Locked then

			if amount > #UpperTable then
				amount = #UpperTable
			end

			-- H.Schuetz - Begin
			if loc == "REALID" then
				BNSendWhisper(loc2,"Recount - "..Recount.DetailWindow.TitleText)
				for i = 1, amount do
					Entry = UpperTable[i]
					BNSendWhisper(loc2, i..". "..(Entry[1] or "").." "..(Entry[6] or "").." "..(Entry[2] or "").." ("..math.floor(Entry[4] + 0.5).."%)")
				end
			else
				SendChatMessage("Recount - "..Recount.DetailWindow.TitleText, loc, nil, loc2)
				for i = 1, amount do
					Entry = UpperTable[i]
					SendChatMessage(i..". "..(Entry[1] or "").." "..(Entry[6] or "").." "..(Entry[2] or "").." ("..math.floor(Entry[4] + 0.5).."%)", loc, nil, loc2)
				end
			end
			-- H.Schuetz - End

			-- H.Schuetz - Old Version
			--[[SendChatMessage("Recount - "..Recount.DetailWindow.TitleText, loc, nil, loc2)
			for i = 1, amount do
				Entry = UpperTable[i]
				SendChatMessage(i..". "..(Entry[1] or "").." "..(Entry[6] or "").." "..(Entry[2] or "").." ("..math.floor(Entry[4] + 0.5).."%)", loc, nil, loc2)
			end]]

		else
			local LowerTable = Recount.DetailWindow.PieMode.LowerTable
			local Min, Avg, Max, Count
			local Labels = Recount.DetailWindow.PieMode.BotRowLabels
			Min = Labels.Min:GetText()
			Avg = Labels.Avg:GetText()
			Max = Labels.Max:GetText()
			Count = Labels.Count:GetText()
			local Text

			if amount > #LowerTable then
				amount = #LowerTable
			end

			-- H.Schuetz - Begin
			if loc == "REALID" then
				BNSendWhisper(loc2,"Recount - "..Recount.DetailWindow.TitleText..": "..UpperTable[Recount.DetailWindow.PieMode.Selected][1])
				for i = 1, amount do
					Entry = LowerTable[i]
					Text = i..". "..Entry[1].." "..Entry[2].." ("..math.floor(Entry[6] + 0.5).."%)"
					if Entry[3] or Entry[4] or Entry[5] then
						Text = Text.." ("
					end
					if Entry[3] then
						Text = Text..Min..": "..Entry[3]
					end
					if Entry[4] then
						Text = Text.." "..Avg..": "..Entry[4]
					end
					if Entry[5] then
						Text = Text.." "..Max..": "..Entry[5]
					end
					if Entry[3] or Entry[4] or Entry[5] then
						Text = Text..")"
					end

					BNSendWhisper(loc2, Text)
				end
			else
				SendChatMessage("Recount - "..Recount.DetailWindow.TitleText..": "..UpperTable[Recount.DetailWindow.PieMode.Selected][1], loc, nil, loc2)
				for i = 1, amount do
					Entry = LowerTable[i]
					Text = i..". "..Entry[1].." "..Entry[2].." ("..math.floor(Entry[6] + 0.5).."%)"
					if Entry[3] or Entry[4] or Entry[5] then
						Text = Text.." ("
					end
					if Entry[3] then
						Text = Text..Min..": "..Entry[3]
					end
					if Entry[4] then
						Text = Text.." "..Avg..": "..Entry[4]
					end
					if Entry[5] then
						Text = Text.." "..Max..": "..Entry[5]
					end
					if Entry[3] or Entry[4] or Entry[5] then
						Text = Text..")"
					end

					SendChatMessage(Text, loc, nil, loc2)
				end
			end
			-- H.Schuetz - End

			-- H.Schuetz - Old Version
			--[[SendChatMessage("Recount - "..Recount.DetailWindow.TitleText..": "..UpperTable[Recount.DetailWindow.PieMode.Selected][1], loc, nil, loc2)
			for i = 1, amount do
				Entry = LowerTable[i]
				Text = i..". "..Entry[1].." "..Entry[2].." ("..math.floor(Entry[6] + 0.5).."%)"
				if Entry[3] or Entry[4] or Entry[5] then
					Text = Text.." ("
				end
				if Entry[3] then
					Text = Text..Min..": "..Entry[3]
				end
				if Entry[4] then
					Text = Text.." "..Avg..": "..Entry[4]
				end
				if Entry[5] then
					Text = Text.." "..Max..": "..Entry[5]
				end
				if Entry[3] or Entry[4] or Entry[5] then
					Text = Text..")"
				end

				SendChatMessage(Text, loc, nil, loc2)
			end]]
		end
	elseif Recount.DetailWindow.DeathMode:IsVisible() then
		if Recount.DetailWindow.DeathMode.SelectedNum and Recount.DetailWindow.DeathMode.Data[Recount.DetailWindow.DeathMode.SelectedNum] then
			local DeathData = Recount.DetailWindow.DeathMode.Data[Recount.DetailWindow.DeathMode.SelectedNum]
			local MsgTimes = Recount.DetailWindow.DeathMode.FilteredData.MessageTimes
			local Msgs = Recount.DetailWindow.DeathMode.FilteredData.Messages
			local Health = Recount.DetailWindow.DeathMode.FilteredData.Health
			local Entries = #MsgTimes
			local Start

			if Entries > amount then
				Start = Entries - amount + 1
			else
				Start = 1
			end

			-- H.Schuetz - Begin
			if loc == "REALID" then
				BNSendWhisper(loc2,"Recount - "..L["Death for "]..Recount.DetailWindow.DeathMode.WhosDeaths..L[" by "]..(DeathData.KilledBy or L["Unknown"])..L[" at "]..date("%H:%M:%S", DeathData.DeathAt))
				for i = Start, Entries do
					if MsgTimes[i] < 0 then
						BNSendWhisper(loc2, string.format("%.2f - ("..L["Health"]..": %s) "..Msgs[i], MsgTimes[i], Health[i]))
					else
						BNSendWhisper(loc2, string.format("+%.2f - ("..L["Health"]..": %s) "..Msgs[i], MsgTimes[i], Health[i]))
					end
				end
			else
				SendChatMessage("Recount - "..L["Death for "]..Recount.DetailWindow.DeathMode.WhosDeaths..L[" by "]..(DeathData.KilledBy or L["Unknown"])..L[" at "]..date("%H:%M:%S", DeathData.DeathAt), loc, nil, loc2)
				for i = Start, Entries do
					if MsgTimes[i] < 0 then
						SendChatMessage(string.format("%.2f - ("..L["Health"]..": %s) "..Msgs[i], MsgTimes[i], Health[i]), loc, nil, loc2)
					else
						SendChatMessage(string.format("+%.2f - ("..L["Health"]..": %s) "..Msgs[i], MsgTimes[i], Health[i]), loc, nil, loc2)
					end
				end
			end
			-- H.Schuetz - End

			-- H.Schuetz - Old Version
			--[[SendChatMessage("Recount - "..L["Death for "]..Recount.DetailWindow.DeathMode.WhosDeaths..L[" by "]..(DeathData.KilledBy or L["Unknown"])..L[" at "]..date("%H:%M:%S",DeathData.DeathAt), loc, nil, loc2)
			for i = Start, Entries do
				if MsgTimes[i] < 0 then
					SendChatMessage(string.format("%.2f - ("..L["Health"]..": %s) "..Msgs[i], MsgTimes[i], Health[i]), loc, nil, loc2)
				else
					SendChatMessage(string.format("+%.2f - ("..L["Health"]..": %s) "..Msgs[i], MsgTimes[i], Health[i]), loc, nil, loc2)
				end
			end]]
		else
			Recount:Print("Need to have a death selected in the detail window to report a death")
		end
	end
end
