MIRRORTIMER_NUMTIMERS = 3;

MirrorTimerColors = { };
MirrorTimerColors["EXHAUSTION"] = {
	r = 1.00, g = 0.90, b = 0.00
};
MirrorTimerColors["BREATH"] = {
	r = 0.00, g = 0.50, b = 1.00
};
MirrorTimerColors["DEATH"] = {
	r = 1.00, g = 0.70, b = 0.00
};
MirrorTimerColors["FEIGNDEATH"] = {
	r = 1.00, g = 0.70, b = 0.00
};

function MirrorTimer_Show(timer, value, maxvalue, scale, paused, label)

	-- Pick a free dialog to use
	local dialog = nil;
	if ( not dialog ) then
		-- Find an open dialog of the requested type
		for index = 1, MIRRORTIMER_NUMTIMERS, 1 do
			local frame = _G["MirrorTimer"..index];
			if ( frame:IsShown() and (frame.timer == timer) ) then
				dialog = frame;
				break;
			end
		end
	end
	if ( not dialog ) then
		-- Find a free dialog
		for index = 1, STATICPOPUP_NUMDIALOGS, 1 do
			local frame = _G["MirrorTimer"..index];
			if ( not frame:IsShown() ) then
				dialog = frame;
				break;
			end
		end
	end
	if ( not dialog ) then
		return nil;
	end

	dialog.timer = timer;
	dialog.value = (value / 1000);
	dialog.scale = scale;
	if ( paused > 0 ) then
		dialog.paused = 1;
	else
		dialog.paused = nil;
	end

	-- Set the text of the dialog
	local text = _G[dialog:GetName().."Text"];
	text:SetText(label);

	-- Set the status bar of the dialog
	local statusbar = _G[dialog:GetName().."StatusBar"];
	local color = MirrorTimerColors[timer];
	statusbar:SetMinMaxValues(0, (maxvalue / 1000));
	statusbar:SetValue(dialog.value);
	statusbar:SetStatusBarColor(color.r, color.g, color.b);

	dialog:Show();

	return dialog;
end


function MirrorTimerFrame_OnLoad(self)
	self:RegisterEvent("MIRROR_TIMER_PAUSE");
	self:RegisterEvent("MIRROR_TIMER_STOP");
	self:RegisterEvent("PLAYER_ENTERING_WORLD");
	self.timer = nil;
end

function MirrorTimerFrame_OnEvent(self, event, ...)
	if ( event == "PLAYER_ENTERING_WORLD" ) then
		for index=1, MIRRORTIMER_NUMTIMERS do
			local timer, value, maxvalue, scale, paused, label = GetMirrorTimerInfo(index);
			if ( timer ==  "UNKNOWN") then
				self:Hide();
				self.timer = nil;
			else
				MirrorTimer_Show(timer, value, maxvalue, scale, paused, label)
			end
		end
	end
	
	local arg1 = ...;
	if ( not self:IsShown() or (arg1 ~= self.timer) ) then
		return;
	end
	
	if ( event == "MIRROR_TIMER_PAUSE" ) then
		if ( arg1 > 0 ) then
			self.paused = 1;
		else
			self.paused = nil;
		end
		return;
	elseif ( event == "MIRROR_TIMER_STOP" ) then
		self:Hide();
		self.timer = nil;
	end
end

function MirrorTimerFrame_OnUpdate(frame, elapsed)
	if ( frame.paused ) then
		return;
	end
	local statusbar = _G[frame:GetName().."StatusBar"];
	frame.value = GetMirrorTimerProgress(frame.timer)  / 1000;
	statusbar:SetValue(frame.value);
end