/*
Script: CountDownPro Timer
Description: Counts down or up from a date, fully customisable display, customisable events when countdown reaches zero!
Author: Andrew Urquhart
Home: http://www.andrewu.co.uk/clj/countdown/pro/
History:
20040317 1125UTC	v1		Andrew Urquhart		Based on countdown.js
20040331 1408BST	v1.3	Andrew Urquhart		Attempts to add to the currently window.onload schedule, rather than overriding it
20040507 1243BST	v1.4	Andrew Urquhart		Modified plural behaviour to act as a replacement for the mainlabel rather than a concatenation for those languages (e.g. Greek) that don't use concatenation for plurals but different words
*/
function CD_GetFormat(strTagId) {
	var metaTags = document.getElementsByTagName("meta");
	if (metaTags && metaTags.length) {
		// Loop over all meta tags
		for (var i=0; i<metaTags.length; ++i) {
			// Look for one that matches the counterId
			if (metaTags.item(i).scheme == strTagId) {
				// Match found, add meta data to collection
				var name	= metaTags.item(i).name;
				var content	= metaTags.item(i).content;
				if (name.indexOf("mindigits") > 0 || name.indexOf("hidezero") > 0) {
					// Content is an integer
					window[strTagId][name] = parseInt(content, 10);
				}
				else {
					// Content is a string
					window[strTagId][name]  = content;
				}
			}
		}
	}
};

function CD_UpdateDisplay(strContent, strTagId) {
	var objElem = document.getElementById(strTagId);
	if (objElem && (typeof objElem.innerHTML).toString().toLowerCase() != 'undefined') {
		objElem.innerHTML = strContent;
	}
};

function CD_Tick(strTagId, strEventDate) {
	var objNow			= new Date();
	var objW			= window[strTagId];
	if (objW.msoffset) {
		// Correct for client's slow/fast clock
		objNow.setUTCMilliseconds(objNow.getUTCMilliseconds() + objW.msoffset);
	}
	var intMsDelay		= 1000 - objNow.getUTCMilliseconds();
	var intEventDate	= new Date(strEventDate).valueOf();
	CD_DrawTime(objNow, strTagId, intEventDate);

	// Has counter has reached zero and is an event is defined?
	if (intEventDate <= objNow.valueOf() && (objW.event_msg || objW.event_redirecturl)) {
		var msg			= "<span id=\"" + strTagId + "_complete\">" + objW.event_msg + "</span>";
		var audioSrc	= objW.event_audio_src;
		var redirectUrl	= objW.event_redirecturl;

		if (redirectUrl) {
			// Redirect to a URI
			location.href = redirectUrl;
		}
		else if (audioSrc) {
			// Show message and play tune, then stop.
			var strMimeType	= objW.event_audio_mimetype;
			var audioObject = "<object style=\"visibility: hidden;\" id=\"MediaPlayer\" width=\"2\" height=\"2\" type=\"" + strMimeType + "\" codebase=\"http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,7,1112\"><param name=\"filename\" value=\"" + audioSrc + "\"><param name=\"autoStart\" value=\"true\"><param name=\"showControls\" value=\"false\"><param name=\"ShowStatusBar\" value=\"false\"><param name=\"Autorewind\" value=\"true\"><param name=\"ShowDisplay\" value=\"false\"><embed src=\"" + audioSrc + "\" width=\"2\" height=\"2\" type=\"" + strMimeType + "\" autostart=\"1\" showcontrols=\"0\" showstatusbar=\"0\" autorewind=\"1\" showdisplay=\"0\"></embed></object>";
			CD_UpdateDisplay(msg + audioObject, strTagId);
		}
		else {
			// Just show message and stop.
			CD_UpdateDisplay(msg, strTagId);
		}
	}
	else {
		// Keep ticking
		setTimeout("CD_Tick(\"" + strTagId + "\", " + intEventDate + ")", intMsDelay);
	}
}

function CD_DrawTime(strDate, strTagId, intEventDate) {
	var intMS = intEventDate - strDate.valueOf();
	if (intMS <= 0) {
		intMS *= -1;
	}
	var intD = Math.floor(intMS / 864E5);
	intMS = intMS - (intD * 864E5);
	var intH = Math.floor(intMS / 36E5);
	intMS = intMS - (intH * 36E5);
	var intM = Math.floor(intMS / 6E4);
	intMS = intMS - (intM * 6E4);
	var intS = Math.floor(intMS / 1E3);
	var strTmp = CD_Format(intD, "d", strTagId) + CD_Format(intH, "h", strTagId) + CD_Format(intM, "m", strTagId);
	CD_UpdateDisplay(strTmp, strTagId);
}

function CD_Format(intData, strPrefix, strTagId) {
	var objW = window[strTagId];
	if (intData == 0 && objW[strPrefix + "_hidezero"]) {
		return "";
	}
	var strResult = "" + intData;
	var intMinDigits = objW[strPrefix + "_mindigits"];
	if (intData.toString().length < intMinDigits) {
		strResult = "0000000000" + strResult;
		strResult = strResult.substring(strResult.length, strResult.length - intMinDigits);
	}
	if (intData != 1) {
		strResult += objW[strPrefix + "_units"];
	}
	else {
		strResult += objW[strPrefix + "_unit"];
	}
	return objW[strPrefix + "_before"] + strResult + objW[strPrefix + "_after"];
}

function CD_Init() {
	var strTagPrefix	= "countdown";
	var objElem			= true; // temp value
	if (document.getElementById) {
		for (var i=1; objElem; ++i) {
			var strTagId = strTagPrefix + i;
			objElem = document.getElementById(strTagId);

			if (objElem && (typeof objElem.innerHTML).toString().toLowerCase() != 'undefined') {
				// OK, found a counter, start it ticking
				var strDate	= objElem.innerHTML;
				if (!isNaN(new Date(strDate).valueOf())) {
					// Default formatting data
					var objW = window[strTagId] = new Object();
					objW.d_mindigits	= 2;
					objW.d_unit			= "";
					objW.d_units		= "";
					objW.d_before		= "";
					objW.d_after		= ":";
					objW.d_hidezero		= 0;
					objW.h_mindigits	= 2;
					objW.h_unit			= "";
					objW.h_units		= "";
					objW.h_before		= "";
					objW.h_after		= ":";
					objW.h_hidezero		= 0;
					objW.m_mindigits	= 2;
					objW.m_unit			= "";
					objW.m_units		= "";
					objW.m_before		= "";
					objW.m_after		= "";
					objW.m_hidezero		= 0;
					objW.s_mindigits	= 2;
					objW.s_unit			= "s";
					objW.s_units		= "s";
					objW.s_before		= "";
					objW.s_after		= " ";
					objW.s_hidezero		= 0;
					objW.event_msg		= "";
					objW.event_audio_src		= "";
					objW.event_audio_mimetype	= "";
					objW.event_redirecturl		= "";
					objW.servertime		= "";

					// User-defined formatting data, overrides data in global-scope object objW
					CD_GetFormat(strTagId);

					// Calculate client-server time offset (ms)
					if (objW.servertime) {
						objW.msoffset = parseInt((new Date(objW.servertime).valueOf() - (new Date()).valueOf())/1000, 10) * 1000; // MS truncated as causes non-integer second display update issue
					}
					else {
						objW.msoffset = 0;
					}

					// Start ticking
					CD_Tick(strTagId, strDate);

					// Make visible (if hidden)
					if (objElem.style) {
						objElem.style.visibility = "visible";
					}
				}
				else {
					// Bad date format, show subtle error
					objElem.innerHTML = strDate + "<a href=\"http://www.andrewu.co.uk/clj/countdown/pro/\" title=\"CountdownPro Error: Invalid date format used, check documentation (see link)\">*</a>";
				}
			}
		}
	}
}

// Try not to commandeer the default onload handler if possible
if (window.attachEvent) {
	window.attachEvent('onload', CD_Init);
}
else if (window.addEventListener) {
	window.addEventListener("load", CD_Init, false);
}
else {
	window.onload = CD_Init;
}
