/*--------------------------------------------------
	Project:	The November Group - Count Down Timer
	Script:		cdt.js
	Includes:	CDT
	Description:
		updates the contents of various elements on the page, whose id matches the passed prefix, and one of the fixed endings ("Days", "Hours", "Minutes", or "Seconds")
--------------------------------------------------*/

//sample settings object
//objSettings={strIdPrefix:"",intDateEnd:0,intDateCurrent:0,blnAllowNegatives:false,blnLeadingZeroDays:false,blnLeadingZeroHours:false,blnLeadingZeroMinutes:false,blnLeadingZeroSeconds:false};

//constructor
function CDT(objSettings)
{
	//properties
	this.intId=CDT.objects.length;
	CDT.objects[CDT.objects.length]=this; //store reference to this object
	
	//set values
	this.strIdPrefix=objSettings.strIdPrefix;
	this.intDateEnd=objSettings.intDateEnd;
	
	//set default values
	this.intDateCurrent=Math.round((new Date()).getTime()/1000); //set current time to local computer time
	this.intTimeDifference=0;
	this.blnAllowNegatives=false;
	this.blnLeadingZeroDays=false;
	this.blnLeadingZeroHours=false;
	this.blnLeadingZeroMinutes=false;
	this.blnLeadingZeroSeconds=false;
	
	//set to passed values
	if(objSettings.intDateCurrent)
	{
		this.intDateCurrent=objSettings.intDateCurrent; //set current time to passed time
		this.intTimeDifference=this.intDateCurrent-Math.round((new Date()).getTime()/1000); //track difference between current local time and passed current time
	}
	if(objSettings.blnAllowNegatives)
		this.blnAllowNegatives=objSettings.blnAllowNegatives;
	if(objSettings.blnLeadingZeroDays)
		this.blnLeadingZeroDays=objSettings.blnLeadingZeroDays;
	if(objSettings.blnLeadingZeroHours)
		this.blnLeadingZeroHours=objSettings.blnLeadingZeroHours;
	if(objSettings.blnLeadingZeroMinutes)
		this.blnLeadingZeroMinutes=objSettings.blnLeadingZeroMinutes;
	if(objSettings.blnLeadingZeroSeconds)
		this.blnLeadingZeroSeconds=objSettings.blnLeadingZeroSeconds;
	this.objInterval=null;
	
	//methods
	this.start=function()
	{
		this.update();
		this.objInterval=setInterval("CDT.objects["+this.getId().toString()+"].update();",1000);
	};
	this.stop=function()
	{
		window.clearInterval(this.objInterval);
	};
	this.update=function()
	{
		var intTime=this.getCurrentTime();
		
		if(document.getElementById(this.strIdPrefix+"Days"))
			document.getElementById(this.strIdPrefix+"Days").innerHTML=this.format(this.getCDTDays(intTime),this.blnLeadingZeroDays);
		if(document.getElementById(this.strIdPrefix+"Hours"))
			document.getElementById(this.strIdPrefix+"Hours").innerHTML=this.format(this.getCDTHours(intTime),this.blnLeadingZeroHours);
		if(document.getElementById(this.strIdPrefix+"Minutes"))
			document.getElementById(this.strIdPrefix+"Minutes").innerHTML=this.format(this.getCDTMinutes(intTime),this.blnLeadingZeroMinutes);
		if(document.getElementById(this.strIdPrefix+"Seconds"))
			document.getElementById(this.strIdPrefix+"Seconds").innerHTML=this.format(this.getCDTSeconds(intTime),this.blnLeadingZeroSeconds);
	};
	
	this.getId=function()
	{
		return this.intId;
	};
	this.getIdPrefix=function()
	{
		return this.strIdPrefix;
	};
	this.getEndTime=function()
	{
		return this.intDateEnd;
	};
	this.getStartTime=function()
	{
		return this.intDateCurrent;
	};
	this.getTimeDifference=function()
	{
		return this.intTimeDifference;
	};
	this.getCurrentTime=function()
	{
		return Math.round((new Date()).getTime()/1000)+this.getTimeDifference();
	};
	
	this.getCDTDays=function(intTime)
	{
		var intSecondsPerDay=86400;
		var intReturnValue=0;
		
		//calculate days
		intReturnValue=Math.floor((this.getEndTime()-intTime)/intSecondsPerDay);
		
		if(intReturnValue<0)
			if(this.blnAllowNegatives)
				intReturnValue++; //compensate for incorrect floor behaviour when number is negative
			else
				intReturnValue=0;
		
		return intReturnValue;
	};
	this.getCDTHours=function(intTime)
	{
		var intSecondsPerDay=86400;
		var intSecondsPerHour=3600;
		var intReturnValue=0;
		
		//calculate hours
		intReturnValue=Math.floor(((this.getEndTime()-intTime)%intSecondsPerDay)/intSecondsPerHour);
		
		if(intReturnValue<0)
			if(this.blnAllowNegatives)
				intReturnValue++; //compensate for incorrect floor behaviour when number is negative
			else
				intReturnValue=0;
		
		return intReturnValue;
	};
	this.getCDTMinutes=function(intTime)
	{
		var intSecondsPerDay=86400;
		var intSecondsPerHour=3600;
		var intSecondsPerMinute=60;
		var intReturnValue=0;
		
		//calculate minutes
		intReturnValue=Math.floor((((this.getEndTime()-intTime)%intSecondsPerDay)%intSecondsPerHour)/intSecondsPerMinute);
		
		if(intReturnValue<0)
			if(this.blnAllowNegatives)
				intReturnValue++; //compensate for incorrect floor behaviour when number is negative
			else
				intReturnValue=0;
		
		return intReturnValue;
	};
	this.getCDTSeconds=function(intTime)
	{
		var intSecondsPerDay=86400;
		var intSecondsPerHour=3600;
		var intSecondsPerMinute=60;
		var intReturnValue=0;
		
		//calculate minutes
		intReturnValue=(((this.getEndTime()-intTime)%intSecondsPerDay)%intSecondsPerHour)%intSecondsPerMinute;
		
		if(intReturnValue<0)
			if(this.blnAllowNegatives)
				intReturnValue++; //compensate for incorrect floor behaviour when number is negative
			else
				intReturnValue=0;
		
		return intReturnValue;
	};
	
	this.format=function(intNumber,blnLeadingZero)
	{
		return ((blnLeadingZero && intNumber<10 ? "0" : "")+intNumber.toString());
	}
}

if(CDT.objects==undefined) CDT.objects=new Array();

if(!CDT.clearAll) CDT.clearAll=function()
{
	//stop all count down timers
	for(var i=0;i<CDT.objects.length;i++)
	{
		CDT.objects[i].stop();
	}
	//remove all count down timers
	CDT.objects=new Array();
};