// Copyright 1995-2006 Otto de Voogd - http://www.7is7.com/otto/

// If you wish to use (a portion of) this code, whether for personal or
// commercial purposes, you may do so on the condition that you place a
// clearly visible, indexable and followable, live link to 
// http://www.7is7.com/otto/countdclock.html on the page where you use
// this code stating that your page uses (portions) of this code.

// Except for the link request above all other conditions applying to the
// (re-)use of this code shall be those set out in the GNU GPL license
// version 2 of the license which states among other things that this
// software comes with ABSOLUTELY NO WARRANTY.
// See http://www.gnu.org/copyleft/gpl.html for a copy of the GNU GPL license.

// Javascript library for countdown clock pages.

var lt = unescape('%3C');
var gt = unescape('%3E');

// Variables

var now;
var target;
var timezoneoffset=0;
var msDiff=0;
var sDiff=0;
var mDiff=0;
var hDiff=0;
var dDiff=0;
var timeoutID=0;

var title = -1;

var tz;
var year = 0;
var mon = 0;
var dat = 0;
var hrs = 0;
var min = 0;
var sec = 0;

msPerDay = 24*60*60*1000;
msPerHour = 60*60*1000;
msPerMinute = 60*1000;
msPerSecond = 1000;

// Defaults (-1 = do not change, remains English)
var lang = -1;
var dayslabel = -1;
var hrslabel = -1;
var minlabel = -1;
var seclabel = -1;
var installlinktext = -1;
var loaded_lang_js = 0;
var cdir="down";

var datestyle = "us";
var dayNames = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');	
var monNames = new Array('January','February','March','April','May','June','July','August','September','October','November','December');	

// Determine Language
lang = getQsVal("lang");
if (-1==lang) lang = getCookieVal("lang");

// Load language file if not English.
if ((-1!=lang) && ("en"!=lang)) {
	document.write(lt+'script type="text/javascript" src="countdown/lang-'+lang+'.js"'+gt+lt+'/script'+gt);
} else {
	loaded_lang_js = 1;
}

// getFull year returns the proper year
// old browsers use getYear implemented here to work until 2070.

function retYear(now) {
	var year = 2000;
	if (now.getFullYear) {
		year = now.getFullYear();
	} else if (now.getYear) { 
		year = now.getYear() % 100;
		year += (year<70) ? 2000 : 1900;
	}
	return year;
}

// We *try* to check if number is a number

function isNumber(number) {
	if (isFinite) {
		if (!isFinite(number)) return 0;
	} else if (isNaN) {
		if (!isNaN(number)) return 0;
	}
	return 1;
}

// Function to replace text

function replace_text_ById(id,str) {
	if (
		document.getElementById(id) &&
		document.getElementById(id).firstChild
	) {
		document.getElementById(id).firstChild.nodeValue=unescape(str);
	}
}

// Function to turn change display of certain elements

function set_display(id,setting) {
	if (
		document.getElementById(id) &&
		document.getElementById(id).style
	) document.getElementById(id).style.display=setting;
}

// We are trying to match the entire name.
// Which means preceded by the start of the string or a seperator (pre)
// and followed by "=".

function getObjVal(obj,pre,sep,name) {
	name = name + "=";
	var start = obj.indexOf (name,0);
	if (start == -1) return start;
	if (start != 0) {
		name = pre + name;
		var start = obj.indexOf (name,0)
		if (start == -1) return start;
	}
	start += name.length;
	var end = obj.indexOf (sep,start);
	if (end == -1) end = obj.length;
	return obj.substring (start,end);
}

// Use getObjVal to extract a value from the Query String.

function getQsVal(name) {
	return getObjVal(location.search.substring(1),"&","&",name);
}

// Use getObjVal to extract a cookie value.

function getCookieVal(name) {
	return getObjVal(document.cookie,"; ",";",name);
}

// Set cookie 

function setCookie(name,value) {
	var expdate = new Date ();
	expdate.setTime (expdate.getTime() + (msPerDay * 366 * 2));
	document.cookie = name + "=" + escape (value) + "; expires=" + expdate.toGMTString();
}

// Set Values

function setYear(value) {
	if (value != "next" && !isNumber(value)) {
		value = retYear(now)+1;
		if (document.clock.year) document.clock.year.value=value;
	}
	year=value
	setCookie('year',value)
	set_target(now);
}

function setMonth(value) {
	if (value<1 || value>12 || !isNumber(value)) {
		value=1;
		if (document.clock.month) document.clock.month.value=value;
	}
	mon=value
	setCookie('month',value)
	set_target(now);
}

function setDate(value) {
	if (value < 1 || value > 31 || !isNumber(value)) {
		value = 1;
		if (document.clock.date) document.clock.date.value=value;
	}
	dat=value
	setCookie('date',value)
	set_target(now);
}

function setHrs(value) {
	if (value < 0 || value > 23 || !isNumber(value)) {
		value = 1;
		if (document.clock.hrs) document.clock.hrs.value=value;
	}
	hrs=value
	setCookie('hrs',value)
	set_target(now);
}

function setMin(value) {
	if (value < 0 || value > 59 || !isNumber(value)) {
		value = 1;
		if (document.clock.min) document.clock.min.value=value;
	}
	min=value
	setCookie('min',value)
	set_target(now);
}

function setSec(value) {
	if (value < 0 || value > 59 || !isNumber(value)) {
		value = 1;
		if (document.clock.sec) document.clock.sec.value=value;
	}
	sec=value
	setCookie('sec',value)
	set_target(now);
}

// Calculate the timezoneoffset
// Correct the time for UTC setting or given tz value
// else we leave it at the local value (if -1 nothing was entered).

function calc_timezoneoffset() {
	if ( "UTC" == tz ) {
		timezoneoffset = target.getTimezoneOffset() * 60000;
	} else if ( -1 != tz && isNumber(tz) ) {
        // Force tz to be a number by substracting 0.
		timezoneoffset = (target.getTimezoneOffset() + (tz-0)) * 60000;
	} else {
		timezoneoffset = 0;
	}
}

// Set the target date (can vary if year is "next")
// If year is next, it means the next occurence of given date
// hence we determine if it is this year or next year.

function set_target(now) {
	if (year == "next") {
		var useyear = retYear(now);
		target = new Date(useyear,mon-1,dat,hrs,min,sec);
		calc_timezoneoffset();
		if (target.getTime()-timezoneoffset-now.getTime() < 0) {
			target = new Date(useyear+1,mon-1,dat,hrs,min,sec)
			calc_timezoneoffset();
		}
	} else {
		target = new Date(year,mon-1,dat,hrs,min,sec)
		calc_timezoneoffset();
	}

}

// Update the clock every 1000 milliseconds

function update_dom() {
	now = new Date();
	msDiff = target.getTime()-timezoneoffset-now.getTime();
	if ("up"==cdir) {
		msDiff=-msDiff;
	} else {
		if (msDiff<0) {
			set_target(now);
			msDiff = target.getTime()-timezoneoffset-now.getTime();
			modify_clock(now);
		}
	}
	// If less than zero? Set to zero.
	if (msDiff<0) { msDiff=0; }

	if (document.getElementById('oSec')) {
		sDiff=Math.floor(msDiff/msPerSecond);
		mDiff=Math.floor(msDiff/msPerMinute);
		hDiff=Math.floor(msDiff/msPerHour);
		dDiff=Math.floor(msDiff/msPerDay);
		if (-1!=mode && 0<mode.length && 0<=mode.indexOf('r')) {
			document.getElementById('oSec').firstChild.nodeValue=sDiff%60;
			document.getElementById('oMin').firstChild.nodeValue=mDiff%60;
			document.getElementById('oHrs').firstChild.nodeValue=hDiff%24;
			document.getElementById('oDays').firstChild.nodeValue=dDiff;
		} else {
			document.getElementById('oSec').firstChild.nodeValue=sDiff;
			document.getElementById('oMin').firstChild.nodeValue=mDiff;
			document.getElementById('oHrs').firstChild.nodeValue=hDiff;
			document.getElementById('oDays').firstChild.nodeValue=dDiff;
		}

		timeoutID=setTimeout('update_dom()',1050 - now%1000)
	}
}

// Language setting
// Let's change all the little texts

function modify_language() {
	if (-1!=dayslabel) replace_text_ById('oDaysLabel',dayslabel);
	if (-1!=hrslabel) replace_text_ById('oHrsLabel',hrslabel);
	if (-1!=minlabel) replace_text_ById('oMinLabel',minlabel);
	if (-1!=seclabel) replace_text_ById('oSecLabel',seclabel);
	if (-1!=installlinktext) replace_text_ById('InstallLink',installlinktext);
}

// We modify the clock

function modify_clock(now) {

	// if the user has set the title replace our original title.

	if (
		(-1!=title) &&
		document.getElementById('oTitle').firstChild.firstChild
	) {
		document.getElementById('oTitle').firstChild.firstChild.nodeValue = unescape(title);
		if (document.title) { document.title = unescape(title); }
	}

	// if the user has fixed the date through the querystring show it

	if (location.search &&
		((-1 != getQsVal("year")) || (-1 != getQsVal("datestr"))) &&
		document.getElementById('oToDate')
	) {
		// dispyear is different from var year as year can contain "next"
		dispyear = target.getFullYear();
		mon=target.getMonth()+1;
		dat=target.getDate();
		hrs=target.getHours();
		min=target.getMinutes();
		sec=target.getSeconds();

		var dayName = "";
		if (target.getDay) dayName = dayNames[target.getDay()];

		var monName = monNames[mon-1];

		var txtDate;
		if ("eu"==datestyle) {
			txtDate=unescape(dayName)+" "+dat+" "+unescape( monName)+" "+dispyear;
		} else {
			txtDate=unescape(dayName)+" "+unescape(monName)+" "+dat+", "+dispyear;
		}

		var txtTime;
		if (0!=sec) {
			txtTime=" "+((hrs<10)?"0":"")+hrs+":"+((min<10)?"0":"")+min+":"+((sec<10)?"0":"")+sec;
		} else {
			if ((0 != hrs) || (0 != min)) {
				txtTime=" "+((hrs<10)?"0":"")+hrs+":"+((min<10)?"0":"")+min;
			} else {
				txtTime="";
			}
		}

		var txtTZ = " ";
		if ( "UTC" == tz ) {
			txtTZ += "UTC";
		} else if ( -1 != tz && isNumber(tz) ) {
			var off_sign = ((tz<0)?"-":"+");
			tz = ((tz<0)?-tz:tz);
			var off_hrs = Math.floor(tz/60);
			var off_min = tz-Math.floor(tz/60)*60;
			txtTZ += "[" + off_sign + ((off_hrs<10)?"0":"") + off_hrs + ":" + ((off_min<10)?"0":"") + off_min + "]";
		} else {
			txtTZ = "";
		}

		if (document.getElementById('oToDate').firstChild) {
			document.getElementById('oToDate').removeChild(document.getElementById('oToDate').firstChild);
		}
		var txtNode = document.createTextNode(txtDate + txtTime + txtTZ);
		if (document.getElementById('oToDate')) {
			document.getElementById('oToDate').appendChild(txtNode);
		}
		// Turn off date form 
		set_display('oUntilTxt','none');
		set_display('oUntilForm','none');
	} else {
		// Turn on date form to allow visitor to enter a date.
		set_display('oUntilTxt','block');
		set_display('oUntilForm','block');
	}

	// Hide countdown elements that are not wanted
	if (-1!=show && 0<show.length) {
		if (0<=show.indexOf('d')) set_display('oDaysLine','block');
		if (0<=show.indexOf('h')) set_display('oHrsLine','block');
		if (0<=show.indexOf('m')) set_display('oMinLine','block');
		if (0<=show.indexOf('s')) set_display('oSecLine','block');
	} else {
		set_display('oDaysLine','block');
		set_display('oHrsLine','block');
		set_display('oMinLine','block');
		set_display('oSecLine','block');
	}

	// If the clock was the result of a search plugin search pass the
	// query string on so that user can generate the appropriate code
	// for his settings quickly.
	if (location.search && -1 != getQsVal('sourceid') && document.getElementById('InstallLink')) {
		document.getElementById('InstallLink').setAttribute('href','http://www.7is7.com/otto/countdclock.html' + location.search);
	}

}

// If location.search exists and the year is set we assume that the date
// needs to be set from the querystring. Otherwise we check the cookies.

function hello_go () {
	now=new Date();

	// Update the background color first
	// works for both dom and nodom
	var bgcolor=getQsVal("bgcolor");
	if (bgcolor==-1 || bgcolor.length < 2) bgcolor=getCookieVal("bgcolor");
	if (bgcolor!=-1 && bgcolor.length > 1 && document.bgColor) {
		document.bgColor=unescape(bgcolor);
	}

	// Determine the date to countdown to
	if (location.search && (getQsVal("datestr") != -1)) {
		var datestr=unescape(getQsVal("datestr"));
		datestr=datestr.replace(/\+/g," ");
		target=new Date(Date.parse(datestr));
		year=target.getFullYear();
		mon=target.getMonth()+1;
		dat=target.getDate();
		hrs=target.getHours();
		min=target.getMinutes();
		sec=target.getSeconds();
		tz=getQsVal("tz");
		if (!isNumber(target.getTime())) alert (datestr+" is not a valid date!");
	} else if (location.search && (getQsVal("year")!=-1)) {
		year=getQsVal("year");
		mon=getQsVal("month");
		dat=getQsVal("date");
		hrs=getQsVal("hrs");
		min=getQsVal("min");
		sec=getQsVal("sec");
		tz=getQsVal("tz");
	} else {
		year=getCookieVal("year");
		mon=getCookieVal("month");
		dat=getCookieVal("date");
		hrs=getCookieVal("hrs");
		min=getCookieVal("min");
		sec=getCookieVal("sec");
		// Theoretical - no way to set this cookies right now
		tz=getCookieVal("tz");
	}

	// title - title to display
	title=getQsVal("title");
	if (-1==title ) title=getCookieVal("title");

	// show - days, hours, minutes or seconds
	show=getQsVal("show");
	if (-1==show) show=getCookieVal("show");

	// cdir - count direction (up or down)
	cdir=getQsVal("cdir");
	if (-1==cdir) cdir=getCookieVal("cdir");

	// mode - countdown mode: standard (s) vs. traditional (t).
	mode=getQsVal("mode");
	if (-1==mode) mode=getCookieVal("mode");

	// Default values

	if (year==-1 || year.length<1 || (year != "next" && !isNumber(year))) year=retYear(now)+1;
	if (mon==-1 || mon.length<1 || !isNumber(mon)) mon=1;
	if (dat==-1 || dat.length<1 || !isNumber(dat)) dat=1;
	if (hrs==-1 || hrs.length<1 || !isNumber(hrs)) hrs=0;
	if (min==-1 || min.length<1 || !isNumber(min)) min=0;
	if (sec==-1 || sec.length<1 || !isNumber(sec)) sec=0;

	if (document.clock) {
		if (document.clock.year) document.clock.year.value=year;
		if (document.clock.month) document.clock.month.value=mon;
		if (document.clock.date) document.clock.date.value=dat;
		if (document.clock.hrs) document.clock.hrs.value=hrs;
		if (document.clock.min) document.clock.min.value=min;
		if (document.clock.sec) document.clock.sec.value=sec;
		if (document.clock.title) document.clock.title.value=title;
	}

	if (document.genform) {
		if (document.genform.year) document.genform.year.value=year;
		if (document.genform.month) document.genform.month.value=mon;
		if (document.genform.date) document.genform.date.value=dat;
		if (document.genform.hrs) document.genform.hrs.value=hrs;
		if (document.genform.min) document.genform.min.value=min;
		if (document.genform.sec) document.genform.sec.value=sec;
		if (-1 != title && document.genform.title)
			document.genform.title.value=unescape(title);
		if (-1 != lang && document.genform.lang)
			document.genform.lang.value=unescape(lang);
	}

	// Set the target time to countdown to.

	set_target(now);
	modify_clock(now);
	update_dom();
}

// If browser is not DOM compliant ask to send user to Firefox download page.

function hello_dom () {

	if (
        !document.getElementById ||
        !document.getElementById('oTitle') ||
        !document.getElementById('oTitle').firstChild
    ) {
        if (
			window.confirm("Your browser is not DOM compliant.\n" +
            "Try using Firefox (getfirefox.com)...")
        ) {
            location.href="http://www.spreadfirefox.com/?q=affiliates&amp;id=89185&amp;t=197";
        }
    } else {
		hello_go();
	}
}

// Set library loaded var

var loaded_countdown_js = 1;

// That's All Folks!

