/*
ed
*/
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_Format(intS, "s", 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	= 1;
					objW.d_unit			= " day";
					objW.d_units		= " days";
					objW.d_before		= "";
					objW.d_after		= " ";
					objW.d_hidezero		= 0;
					objW.h_mindigits	= 2;
					objW.h_unit			= "h";
					objW.h_units		= "h";
					objW.h_before		= "";
					objW.h_after		= " ";
					objW.h_hidezero		= 0;
					objW.m_mindigits	= 2;
					objW.m_unit			= "m";
					objW.m_units		= "m";
					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;
}
