/*
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 1125UTCv1Andrew UrquhartBased on countdown.js
20040331 1408BSTv1.3Andrew UrquhartAttempts to add to the currently window.onload schedule, rather than overriding it
20040507 1243BSTv1.4Andrew UrquhartModified 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_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;
}
