
var global_now = new Date(2012,1,22,18,39,51,0);
var started;
var finished;

// Variables

var now;
var target;
var targetminusmonths;
var targetminusyears;
var msDiff=0;
var sDiff=0;
var mDiff=0;
var hDiff=0;
var dDiff=0;
var WDiff=0;
var MDiff=0;
var YDiff=0;
var timeoutID=0;

var year="2012";
var mon="8";
var dat="18";
var hrs="19";
var min="0";
var sec="0";
var ryr = 0;
var rmo = 0;
var rwe = 0;
var rda = 0;
var rhr = 0;
var rmi = 0;
var rse = 0;

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

// Defaults (-1 = no replacement yet)
var yrslabel='years';
var yrslabels=-1;
var yrslabel_smpl=-1;
var yrslabel_sing='year';
var yrslabel_ones=-1;
var monlabel='months';
var monlabels=-1;
var monlabel_smpl=-1;
var monlabel_sing='month';
var monlabel_ones=-1;
var weeklabel='weeks';
var weeklabels=-1;
var weeklabel_smpl=-1;
var weeklabel_sing='week';
var weeklabel_ones=-1;
var dayslabel='days';
var dayslabels=-1;
var dayslabel_smpl=-1;
var dayslabel_sing='day';
var dayslabel_ones=-1;
var hrslabel='hours';
var hrslabels=-1;
var hrslabel_smpl=-1;
var hrslabel_sing='hour';
var hrslabel_ones=-1;
var minlabel='minutes';
var minlabels=-1;
var minlabel_smpl=-1;
var minlabel_sing='minute';
var minlabel_ones=-1;
var seclabel='seconds';
var seclabels=-1;
var seclabel_smpl=-1;
var seclabel_sing='second';
var seclabel_ones=-1;	

// getFull year returns the proper year
// old browsers use getYear implemented here to work until 2070.
function retYear(datetime) {
	var year = 2000;
	if (datetime.getFullYear) {
		year = datetime.getFullYear();
	} else if (datetime.getYear) { 
		year = datetime.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;
}

// Return month difference between now and target
function ret_monDiff(tgt_year,tgt_mon,tgt_dat,tgt_hrs,tgt_min,tgt_sec,now_year,now_mon,now_dat,now_hrs,now_min,now_sec) {
	var res=0;
	var tgt_dattim=((tgt_dat*24+tgt_hrs*1)*60+tgt_min*1)*60+tgt_sec*1;
	var now_dattim=((now_dat*24+now_hrs*1)*60+now_min*1)*60+now_sec*1;
	res=(tgt_year-now_year)*12+tgt_mon*1-now_mon-((now_dattim>tgt_dattim)?1:0);
	return (res>0)?res:0;
}

// Correct date for targetminusmonths value calculation
function monDatCorr(year,mon,dat) {
	mon++;
	var dat_new=dat;
	if ((4==mon||6==mon||9==mon||11==mon) && dat>30) {
		dat_new=30;
	} else if (2==mon && dat>29 && year%4==0 && (year%100!=0||year%400==0)) {
		dat_new=29;
	} else if (2==mon && dat>28) {
		dat_new=28;
	}
	return dat_new;
}

function set_target(now) {

	var now_year=retYear(now);
	var now_mon=now.getMonth();
	var now_dat=now.getDate();
	var now_hrs=now.getHours();
	var now_min=now.getMinutes();
	var now_sec=now.getSeconds();

	target = new Date(year,mon-1,dat,hrs,min,sec);

	// Calculate the number of whole months between now and target
	var monDiff=ret_monDiff(year,mon,dat,hrs,min,sec,now_year,now_mon+1,now_dat,now_hrs,now_min,now_sec);

	// Calculate the number of whole years and corrected year
	var yearDiff=Math.floor(monDiff/12);
	var yearCorr=year-yearDiff;

	// Determine the target minus all the years.
	targetminusyears=new Date(yearCorr,mon,dat,hrs,min,sec);

	// Calculate remainder months and corrected month
	var remMon=monDiff%12;
	
	var monCorr=mon-1-remMon;
	if (monCorr<0) {yearCorr--;monCorr+=12;}
	if (monCorr>11) {yearCorr++;monCorr-=12;}

	var datCorr=monDatCorr(yearCorr,monCorr,dat);

	// Determine target minus all the months
	targetminusmonths=new Date(yearCorr,monCorr,datCorr,hrs,min,sec);

}

// Return the correct unit label
function timeunit_label(units,plur,sing) {
	var out="";
	if (-1!=plur) {
		if (1==units && -1!=sing)
			out=sing;	
		else
			out=plur;
	}
	return out;
}

// Calculate msDiff
function calcDiffs(now) {
	// Ignore months if we are showing months or years.
	// calc msDiff using targetminusmonths
		if (0<=show.indexOf('M')) {
			msDiff=targetminusmonths.getTime()-now.getTime();
		} else if (0<=show.indexOf('Y')) {
			msDiff=targetminusyears.getTime()-now.getTime();
		} else {
			msDiff=target.getTime()-now.getTime();
		}
	if (0<=show.indexOf('M')||0<=show.indexOf('Y')) {
		MDiff=target.getMonth()-targetminusmonths.getMonth()+12*(retYear(target)-retYear(targetminusmonths));
	}
}

// Update the clock every 1000 milliseconds
function updateDom() {

	started = new Date();
	dateparse = Date.parse(started);
	started = new Date(dateparse);

	now = new Date(global_now);
	
	calcDiffs(now);
		// Add one to the lowest unit to compensate for Math.floor
		if (0<=show.indexOf('s')) {
			msDiff+=1000;
		} else if (0<=show.indexOf('m')) {
			msDiff+=60000;
		} else if (0<=show.indexOf('h')) {
			msDiff+=3600000;
		} else if (0<=show.indexOf('d')) {
			msDiff+=86400000;
		} else if (0<=show.indexOf('W')) {
			msDiff+=604800000;
		}
		if (msDiff<0) {
			set_target(now);
			calcDiffs(now);
		}

	// If less than zero? Set to zero.
	if (msDiff<0) { msDiff=0; }

			msRem=msDiff;
			MRem=MDiff;
			if (0<=show.indexOf('Y')) {
				YDiff=Math.floor(MRem/12);
				MRem=MRem%12;
			}
			if (0<=show.indexOf('M')) {
				MDiff=MRem;
			}
			if (0<=show.indexOf('W')) {
				WDiff=Math.floor(msRem/msPerWeek);
				msRem=msRem%msPerWeek;
			}
			if (0<=show.indexOf('d')) {
				dDiff=Math.floor(msRem/msPerDay);
				msRem=msRem%msPerDay;
			}
			if (0<=show.indexOf('h')) {
				hDiff=Math.floor(msRem/msPerHour);
				msRem=msRem%msPerHour;
			}
			if (0<=show.indexOf('m')) {
				mDiff=Math.floor(msRem/msPerMinute);
				msRem=msRem%msPerMinute;
			}
			if (0<=show.indexOf('s')) {
				sDiff=Math.floor(msRem/msPerSecond);
				// msRem=msRem%msPerSecond;
			}

		var output;
		
		output  = YDiff;
		output += " " + timeunit_label(YDiff,yrslabel,yrslabel_sing) + ", ";
		output += MDiff;
		output += " " + timeunit_label(MDiff,monlabel,monlabel_sing) + ", ";
		output += WDiff;
		output += " " + timeunit_label(WDiff,weeklabel,weeklabel_sing) + ", ";
		output += dDiff;
		output += " " + timeunit_label(dDiff,dayslabel,dayslabel_sing) + ", ";
		output += hDiff;
		output += " " + timeunit_label(hDiff,hrslabel,hrslabel_sing) + ", ";
		output += mDiff;
		output += " " + timeunit_label(mDiff,minlabel,minlabel_sing) + " and ";
		output += sDiff;
		output += " " + timeunit_label(sDiff,seclabel,seclabel_sing);
		output += " until the <a href='http://eij.org.uk'>Essex International Jamboree 2012</a>";
		
		document.getElementById('countdown').innerHTML = output;

		//timeoutID=setTimeout('updateDom()',1010 - now%1000)
		
		dateparse = Date.parse(global_now);
		global_now = new Date(dateparse + 1000);
		
		finished = new Date();
		dateparse = Date.parse(finished);
		finished = new Date(dateparse);
		
		timeoutID=setTimeout('updateDom()',1000-(finished-started));
}

function helloGo() {

	now = new Date(global_now);

	// show - time units to show
	show="YMWdhms";

	// Default values
	if (year==-1 || year.length<1 || !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 (-1==ryr || ryr.length<1 || !isNumber(ryr)) ryr=0;
	if (-1==rmo || rmo.length<1 || !isNumber(rmo)) rmo=0;
	if (-1==rwe || rwe.length<1 || !isNumber(rwe)) rwe=0;
	if (-1==rda || rda.length<1 || !isNumber(rda)) rda=0;
	if (-1==rhr || rhr.length<1 || !isNumber(rhr)) rhr=0;
	if (-1==rmi || rmi.length<1 || !isNumber(rmi)) rmi=0;
	if (-1==rse || rse.length<1 || !isNumber(rse)) rse=0;

	// Set the target time to countdown to.
	set_target(now);
	updateDom();
}

// If browser is not DOM compliant make user aware.
function helloDom() {
	if (
        !document.getElementById ||
        !document.getElementById('countdown')
    ) {
		alert("Sorry, your browser is not able to show the countdown to the Essex International Jamboree.");
    } else {
		helloGo();
	}
}

// Bye - clear timeout
function bye () {
	clearTimeout(timeoutID);
}

// Onload & onunload
window.onload=helloDom;
window.onunload=bye;


