/*************
 TMinus.js  - Time counting script used by TMinus Module for DNN 
 
 Revision History
 V1.0 18-jun-2004	- initial version
 V1.1 23-jun-2004	- convert to array of objects 
 
**************/

var unitmonths  = "mons";
var unitmonth   = "mon";
var unitdays    = "days";
var unitday     = "day";
var unithours   = "hrs";
var unithour    = "hr";
var unitminutes = "mins";
var unitminute  = "min";
var unitseconds = "secs";
var unitsecond  = "sec";
var unitand     = "and";

var millisecperhour = 60 * 60 * 1000;
var millisecperday = 24 * millisecperhour;
var millisecpermon = 30 * millisecperday;

function countdown(){
	if (DisplayEvents.length == 0) {
		setTimeout("countdown()",1000);
		return;
	}		
	var smsg = '';
    var timemsg = '';

	var datediff = 0;
    var dmon = 0;
	var dday = 0;
	var dleft = 0;
	var dhour = 0;
	var hleft = 0;
	var dmin = 0;
	var	mleft = 0;
	var dsec = 0;
	var secdiff = 0;
	var displaycode = 0;
    var processcode = 0;
    var during = 0;
    
    for (var iEvent=0; iEvent < DisplayEvents.length; iEvent++) {
    
		displaycode = DisplayEvents[iEvent].DisplayCode;
		processcode = DisplayEvents[iEvent].ProcessCode;
	    
		var today = new Date();
		datediff = DisplayEvents[iEvent].EventDate - today;
			
		if ((processcode & 8) != 0) {
			secdiff = Math.floor( datediff / 1000 );
			if ( secdiff  <= 0 && secdiff > -DisplayEvents[iEvent].Duration) {
				datediff = (DisplayEvents[iEvent].EventDate - today) + (DisplayEvents[iEvent].Duration * 1000);
				during = 1;
			}	
		}	
						
		if (datediff > 0) {
			//time remaining until event
			secdiff = Math.floor( datediff / 1000 );
			
			if ((displaycode & 1) != 0) {
				dmon  = Math.floor( datediff / millisecpermon );
				datediff = Math.floor( datediff % millisecpermon );
			}
			dday  = Math.floor( datediff / millisecperday );
			dleft = Math.floor( datediff % millisecperday );
			dhour = Math.floor( dleft / millisecperhour );
			hleft = Math.floor( dleft % millisecperhour );
			dmin  = Math.floor( hleft /60000 );
			mleft = Math.floor( hleft % 60000 );
			dsec  = Math.floor( mleft /1000);
		}
		else {
			//event has started
			secdiff = Math.ceil( datediff / 1000 );
			
			//event has passed so remove duration from calculation
			if (Math.abs(secdiff) > DisplayEvents[iEvent].Duration) {
				datediff = datediff + (DisplayEvents[iEvent].Duration * 1000);
			}
			
			if ((displaycode & 1) != 0) {
				dmon  = Math.floor( datediff / millisecpermon );
				datediff = Math.ceil( datediff % millisecpermon );
			}
			
			dday  = Math.ceil( datediff / millisecperday );
			dleft = Math.ceil( datediff % millisecperday );
			dhour = Math.ceil( dleft / millisecperhour );
			hleft = Math.ceil( dleft % millisecperhour );
			dmin  = Math.ceil( hleft /60000 );
			mleft = Math.ceil( hleft % 60000 );
			dsec  = Math.ceil( mleft /1000);
		}
		
		if ( (dday == 0) && (displaycode < 4) ) displaycode += 4;
		if ( (dday == 0) && (dhour == 0) && (displaycode < 8) ) displaycode += 8;
		if ( (dday == 0) && (dhour == 0) && (dmin == 0) && (displaycode < 16) ) displaycode += 16;

		
	//if passed day of event
		if (secdiff  <= -DisplayEvents[iEvent].Duration) {
			
			timemsg = DisplayEvents[iEvent].AfterMsg;
			
			// no message if expired - do not reset timer
			if ((processcode & 1) != 0) {
				if (DisplayEvents[iEvent].Clear == 0) {
					DisplayEvents[iEvent].Span.innerHTML = '';
					DisplayEvents[iEvent].Clear = 1;
				}
				return;
			}
			
			if ((processcode & 2) != 0) {
				timemsg =  BuildDisplay(displaycode, -dmon, -dday, -dhour, -dmin, -dsec, -secdiff );
				timemsg =  BuildTimeMsg(timemsg, DisplayEvents[iEvent].AfterMsg);
				//timemsg = timemsg + " " + DisplayEvents[iEvent].AfterMsg;
			}
			
			if ((processcode & 4) != 0) {
				timemsg = '<font color=red>' + timemsg + '</font>';
			}
		}	
		
	//if on day of event
		else if(during ==1 || (secdiff  <= 0 && secdiff > -DisplayEvents[iEvent].Duration)) {
		
			if ((processcode & 8) != 0) {
				// 04-feb-07 - change &2 or &8
				if ( secdiff < 0 ) {
					timemsg =  BuildDisplay(displaycode, -dmon,  -dday, -dhour, -dmin, -dsec, -secdiff );
				}	
				else  {
					timemsg =  BuildDisplay(displaycode, dmon,  dday, dhour, dmin, dsec, secdiff );
				}	
				timemsg =  BuildTimeMsg(timemsg, DisplayEvents[iEvent].DuringMsg);
				//timemsg = timemsg + " " + DisplayEvents[iEvent].DuringMsg;
			}
			else {
				timemsg = DisplayEvents[iEvent].DuringMsg + ' ' +RepeatStr('.', (Math.abs(secdiff) % 4)) ;
			}		
		}

	//else, if not yet
		else {

			timemsg =  BuildDisplay(displaycode, dmon, dday, dhour, dmin, dsec, -secdiff );
			timemsg =  BuildTimeMsg(timemsg, DisplayEvents[iEvent].BeforeMsg);
			//timemsg + " " + DisplayEvents[iEvent].BeforeMsg;
		}
			
		// display and reset timer	
		DisplayEvents[iEvent].Span.innerHTML = DisplayEvents[iEvent].PrefixTags + timemsg + DisplayEvents[iEvent].SuffixTags;	
		
	} // end of for iEvent loop
		
	setTimeout("countdown()",1000);
}

function BuildDisplay(iDisplay, iMonths, iDays, iHours, iMins, iSecs, iTotalSecs) {

	var smsg;

	displayed = 0;
	smsg= "<span class='lcdstyle'>";

	//iDisplay = 15;
	
	iTotalSecs = Math.abs(iTotalSecs);

	if ( ((iDisplay & 1 ) != 0) && (iMonths > 0) ) {
	    if (iMonths == 1) 
			smsg= smsg + iMonths + " " + "<sup>"+ unitmonth +"</sup>";
	    else
			smsg= smsg + iMonths + " " + "<sup>"+ unitmonths +"</sup>";
		displayed = 1;
	}

	if ( ((iDisplay & 2 ) != 0) && (iDays > 0) ) {
		if (smsg.length > 0) {
			smsg = smsg + " ";
			}
		if (iDays == 1) 
			smsg= smsg + iDays + " " + "<sup>"+ unitday +"</sup>";
		else
			smsg= smsg + iDays + " " + "<sup>"+ unitdays +"</sup>";
		displayed += 1;
	}
	
	if ( ((iDisplay & 4 ) != 0) && ((iDays > 0) || (iHours > 0)) ) {
		if (smsg.length > 0) {
			smsg = smsg + " ";
			}
		if (iHours == 1) 
			smsg = smsg + iHours + " " + "<sup>"+ unithour +"</sup>";
		else
			smsg = smsg + iHours + " " + "<sup>"+ unithours +"</sup>";
		displayed += 1;
	}
	
	if ( ((iDisplay & 8 ) != 0) && ((iDays > 0) || (iHours > 0) || (iMins > 0)) ) {
		if (smsg.length > 0) {
			smsg= smsg + " ";
			}
		if (iMins == 1) 
		    smsg= smsg + iMins + " " + "<sup>"+ unitminute +"</sup>";
		else
		    smsg= smsg + iMins + " " + "<sup>"+ unitminutes +"</sup>";
		displayed += 1;
	}
	
	if ((iDisplay & 16 ) != 0) {
		if (displayed > 1) {
			smsg= smsg + " ";
			}
		if (smsg.length > 0) {
			//smsg= smsg + " " + unitand + " ";
			smsg= smsg + "";
			}
		if (iSecs == 1) 
			smsg= smsg + iSecs + " " + "<sup>"+ unitsecond +"</sup>";
		else
		    smsg= smsg + iSecs + " " + "<sup>"+ unitseconds +"</sup>";
		displayed += 1;
	}	

	if ((iDisplay & 32 ) != 0) {
		smsg= iTotalSecs + " " + "<sup>"+ unitseconds +"</sup>";
	}
	
	if ((iDisplay & 64 ) != 0) {
		itemp  = Math.floor( iTotalSecs / 60 );
		smsg= itemp + " " + "<sup>"+unitminutes+"</sup>";
	}

	if ((iDisplay & 128 ) != 0) {
		itemp  = Math.floor( iTotalSecs / 3600 );
		smsg= itemp + " " + "<sup>"+ unithours +"</sup>";
	}
	
	if ((iDisplay & 256 ) != 0) {
		itemp  = Math.floor( iTotalSecs / 86400 );
		smsg= itemp + " " + "<sup>"+ unitdays +"</sup>";
	}
			
			smsg = smsg + "</span>";
	return smsg;
}

function BuildTimeMsg(TimeMsg, UserMsg) {
    var iptr;
    var result;
    var pattern = "[TimeMsg]";
    
    iptr = UserMsg.indexOf(pattern);
    if (iptr > 0) {
        result = UserMsg.substring(0, iptr-1);
        result += " " + TimeMsg;
        iptr += pattern.length;
        result += " " + UserMsg.substring(iptr, UserMsg.length);
    }
    else
    {
	    result = TimeMsg + " " + UserMsg;
	}    
	return result;
}

function RepeatStr(thestr, itimes) {
	var result = '';

	for (var i=0; i < itimes; i++) {
		result += thestr;
	}
	return result;
}

function start_countdown(){
	countdown();
}

function DisplayEvent(SpanName, EventDate, Duration, DisplayCode, ProcessCode,
						PrefixTags, SuffixTags, 
						BeforeMsg, DuringMsg, AfterMsg) {
						
	this.Span   		= document.getElementById(SpanName); 
	this.Clear			= 0;
	
	this.EventDate		= EventDate;
	this.Duration		= Duration;
	
	this.DisplayCode	= DisplayCode;
	this.ProcessCode	= ProcessCode;
	
	this.PrefixTags		= PrefixTags;
	this.SuffixTags		= SuffixTags;
	
	this.BeforeMsg		= BeforeMsg;
	this.DuringMsg		= DuringMsg;
	this.AfterMsg		= AfterMsg;
}

function DefineEvent(theSpan,
					 theYear, theMonth, theDay,
					 theHour, theMinute, theSecond,
					 theDuration, 
					 theDisplay, theProcess,
					 thePrefix, theSuffix, 
					 theBeforeMsg, theDuringMsg, theAfterMsg) {

	var eventdate = new Date();
	var eventyear	= 0;
	var eventmonth	= 0;
	var eventday	= 0;
	var eventhour   = 0;
	var eventminute = 0;
	var eventsecond = 0;
	var eventduration = 0;

	var prefixtags = "";
	var suffixtags = "";
	
	var beforemsg = "";
	var aftermsg = "";
	var duringmsg = "";
	
	eventyear	= theYear;
	eventmonth	= theMonth;
	eventday	= theDay;
	eventhour	= theHour;
	eventminute	= theMinute;
	eventsecond = theSecond;
	eventduration = theDuration;
	displaycode = theDisplay;
	processcode = theProcess;
	prefixtags	= TagFix(thePrefix);
	suffixtags  = TagFix(theSuffix);
	beforemsg	= TagFix(theBeforeMsg);
	duringmsg	= TagFix(theDuringMsg);
	aftermsg	= TagFix(theAfterMsg);

	//UTC Date
	if ((processcode & 1024) != 0) {
		eventdate.setUTCFullYear( eventyear, eventmonth-1, eventday);
		eventdate.setUTCHours(eventhour, eventminute, eventsecond, 0);
	}
	else {
		eventdate.setFullYear( eventyear, eventmonth-1, eventday);
		eventdate.setHours(eventhour, eventminute, eventsecond, 0);
	}
	
	DisplayEvents[DisplayEvents.length] = new DisplayEvent(theSpan, eventdate, theDuration,
							theDisplay, theProcess, prefixtags, suffixtags, 
							beforemsg, duringmsg, aftermsg);
}

function TagFix(intag) {
	outtag = intag;
	outtag = outtag.replace(/&lt;/gi, "<");	
	outtag = outtag.replace(/&gt;/gi, ">");	
	outtag = outtag.replace(/&quot;/gi, '"');	
	outtag = outtag.replace(/&amp;/gi, "&");	
	return 	outtag;
}

//Starts here --

var DisplayEvents = new Array();

window.onload=start_countdown;

//end of script
