	/*
	*****************************************************************************************************
	Author : Lea Smart
	Source : www.totallysmartit.com
	Date : 7/3/2001
	DHTML Calendar
	Version 1.2
	
	You are free to use this code if you retain this header.
	You do not need to link to my site (be nice though!)
	
	Amendments
	22 Jan 2002; Added ns resize bug code; rewrote date functions into Date 'class';
				 Added support for yyyy-mm-dd date format
				 Added support for calendar beginning on any day
	7th Feb 2002 Fixed day highlight when year wasn't current year bug
	9th Jun 2002 Fixed bug with weekend colour
				 Amended the code for the date functions extensions.  Shortened addDays code considerably
	*****************************************************************************************************
	*/
	var timeoutDelay = 0; // milliseconds, change this if you like, set to 0 for the calendar to never auto disappear
	var g_startDay = 0// 0=sunday, 1=monday
	
	// used by timeout auto hide functions
	var timeoutId = false;
	
	//constants for the input type and div
	var CONST_INPUT_TYPE = 'INPUT';
	var CONST_DIV_TYPE = 'DIV';
	
	// the now standard browser sniffer class
	function Browser(){
	  this.dom = document.getElementById?1:0;
	  this.ie4 = (document.all && !this.dom)?1:0;
	  this.ns4 = (document.layers && !this.dom)?1:0;
	  this.ns6 = (this.dom && !document.all)?1:0;
	  this.ie5 = (this.dom && document.all)?1:0;
	  this.ok = this.dom || this.ie4 || this.ns4;
	  this.platform = navigator.platform;
	}
	var browser = new Browser();
		
	// dom browsers require this written to the HEAD section
	
	if (browser.dom || browser.ie4){
	    document.writeln('<style>');
		document.writeln('#container {');
		document.writeln('position : absolute;');
		document.writeln('left : 75px;');
		document.writeln('top : 10px;');
		document.writeln('width : 185px;');
		//browser.platform=='Win32'?height=140:height=145;
		//document.writeln('height : ' + height +'px;');
		//document.writeln('clip:rect(0px 185px ' + height + 'px 0px);');
		//document.writeln('overflow : hidden;');
		document.writeln('margin: 25px 0px 0px -17px ! important;');
		document.writeln('margin: 25px 0px 0px -90px;');
		document.writeln('visibility : hidden;');
		document.writeln('font : normal 10px arial,helvetica,sans-serif;');
		document.writeln('border : solid 1px #000;');
		document.writeln('background-color : #fff;');
		document.writeln('z-index : 1200;');
		document.writeln('}');
		document.writeln('</style>')
		document.write('<div id="container" class="calTxt"');
		if (timeoutDelay) document.write(' onmouseout="calendarTimeout();" onmouseover="if (timeoutId) clearTimeout(timeoutId);"');
		document.write('></div>');
	}
	
	var g_Calendar;  // global to hold the calendar reference, set by constructor
	
	function calendarTimeout(){
	  if (browser.ie4 || browser.ie5){
	    if (window.event.srcElement && window.event.srcElement.name!='month') timeoutId=setTimeout('g_Calendar.hide();',timeoutDelay);
	  }
	  if (browser.ns6 || browser.ns4){
	    timeoutId=setTimeout('g_Calendar.hide();',timeoutDelay);
	  }
	}
	function openDateMsg() {
		Dialog.alert("You may schedule an event up to one year in advance.",
		{windowParameters: {width:300, height:100},
		okLabel: "close"});
	}
	// constructor for calendar class
	function Calendar(){
	  g_Calendar = this;
	  // some constants needed throughout the program
	  this.daysOfWeek = new Array("S","M","T","W","T","F","S");
	  //this.months = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
	  this.months = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec");
	  this.daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	  
	  if (browser.ns4){
	    var tmpLayer = new Layer(127);
		if (timeoutDelay){
		  tmpLayer.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);
		  tmpLayer.onmouseover = function(event) { if (timeoutId) clearTimeout(timeoutId); };
		  tmpLayer.onmouseout = function(event) { timeoutId=setTimeout('g_Calendar.hide()',timeoutDelay);};
		}
	    tmpLayer.x = 100;
	    tmpLayer.y = 100;
	    tmpLayer.bgColor = "#ffffff";
	  }
	  if (browser.dom || browser.ie4){
		var tmpLayer = browser.dom?document.getElementById('container'):document.all.container;
	  }
	  this.containerLayer = tmpLayer;

	  if (browser.ns4 && browser.platform=='Win32') {
	    this.containerLayer.clip.height=134;
	    this.containerLayer.clip.width=127;
	  }

	}
	
 	Calendar.prototype.getFirstDOM = function() {
		var thedate = new Date();
		thedate.setDate(1);
		thedate.setMonth(this.month);
		thedate.setFullYear(this.year);
		return thedate.getDay();
	}

	Calendar.prototype.getDaysInMonth = function (){
	   if (this.month!=1) {
	   return this.daysInMonth[this.month]
	   }
	   else {
	     // is it a leap year
		    if (Date.isLeapYear(this.year)) {
			  return 29;
			}
		    else {
			  return 28;
			}
	   }
	}
	 
	Calendar.prototype.buildString = function(){
	  //var tmpStr = '<form onSubmit="this.year.blur();return false;"><table width="100%" border="0" cellspacing="0" cellpadding="2" class="calBorderColor"><tr><td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="1" class="calBgColor">';
	  // the form thing breaks ie
	  var tmpStr = '<table width="185" border="0" cellspacing="0" cellpadding="0" class="calBorderColor"><tr><td valign="top"><table width="180" border="0" cellspacing="0" cellpadding="1" class="calBgColor" align="center" style="margin-top:3px;">';	  
	  tmpStr += '<tr valign="top">';
	  if (this.hasDropDown) {
	    tmpStr += '<td class="cal" align="left">';
	    tmpStr += '<select class="month" name="month" onchange="g_Calendar.selectChange();">';
		for (var i=0;i<this.months.length;i++){
	      tmpStr += '<option value="' + i + '"' 
		  if (i == this.month) tmpStr += ' selected';
		  tmpStr += '>' + this.months[i] + '</option>';
	    }
	    tmpStr += '</select>';
	  } else {
	  
	  	  /* Disable the back button for current month */
	    var today = new Date();
	  	if((this.month == today.getMonth()) && (this.year == today.getFullYear())){
	 	 tmpStr += '<td style="color:#adadad;" width="49" align="right"><img src="/images/06/arrows/cal_lft_lt.gif" width="20" height="15" border="0" alt="" /></td>';
	 	} else {
	 	 tmpStr += '<td width="49" align="right"><a href="javascript: g_Calendar.changeMonth(-1);" class="calink"><img src="/images/06/arrows/cal_lft.gif" width="20" height="15" border="0" alt="" /></a>';
	 	}
	    tmpStr += '<td class="cal" align="center"><b>&nbsp;' + this.months[this.month] + '</b>&nbsp;';
	  }
	  /* observation : for some reason if the below event is changed to 'onChange' rather than 'onBlur' it totally crashes IE (4 and 5)!
	  */
	  
	  if (this.hasDropDown) { 
	  tmpStr += '<td align="right" class="cal">';
	    tmpStr += '<input class="year" type="text" size="';
	    // get round NS4 win32 lenght of year input problem
	    (browser.ns4 && browser.platform=='Win32')?tmpStr += 1:tmpStr += 4;
	  tmpStr += '" name="year" maxlength="4" onBlur="g_Calendar.inputChange();" value="' + this.year + '">';
	  } else {
	  tmpStr += '<b>' + this.year + '&nbsp;</b></td>';
	  
	  /* Disable the forward button if it is a year ahead of now */
	  	if((this.month >= today.getMonth()) && (this.year >= today.getFullYear() + 1)){
	 	 tmpStr += '<td width="38"><a href="javascript:openDateMsg();" style="color:#ccc;"><img src="/images/06/arrows/cal_rgt_lt.gif" width="20" height="15" border="0" alt="" /></a></td>';
	 	} else {
	 	 tmpStr += '<td width="38"><a href="javascript: g_Calendar.changeMonth(+1);" class="calink"><img src="/images/06/arrows/cal_rgt.gif" width="20" height="15" border="0" alt="" /></a></td>';
	 	}
	 	 tmpStr += '<td align="right" width="11"><a href="javascript:calendarTimeout();" onClick="calendarTimeout();"><img src="/images/06/buttons/close_x.gif" alt="close" border="0" height="11" width="11" /></a></td></tr></table>';
	 	
	  }

	  var iCount = 1;

	  var iFirstDOM = (7+this.getFirstDOM()-g_startDay)%7; // to prevent calling it in a loop

	  var iDaysInMonth = this.getDaysInMonth(); // to prevent calling it in a loop
	  
	  tmpStr += '<table width="100%" border="0" cellspacing="2" cellpadding="0" class="calBgColor">';
	  tmpStr += '<tr>';
	    for (var i=0;i<7;i++){
		  tmpStr += '<td align="center" class="calDaysColor" style="font-weight:bold;">' + this.daysOfWeek[(g_startDay+i)%7] + '</td>';
		}
	  tmpStr += '</tr>';
	  tmpStr += '<tr ><td style="border-top:solid 1px #adadad;" colspan="7"></td></tr>';
	  var tmpFrom = parseInt('' + this.dateFromYear + this.dateFromMonth + this.dateFromDay,10);
	  var tmpTo = parseInt('' + this.dateToYear + this.dateToMonth + this.dateToDay,10);
	  var tmpCompare;
	  for (var j=1;j<=6;j++){
	     tmpStr += '<tr>';
	     for (var i=1;i<=7;i++){
		   tmpStr += '<td width="14%" align="center" '
		   if ( (7*(j-1) + i)>=iFirstDOM+1  && iCount <= iDaysInMonth){
		     if (iCount==this.day && this.year==this.oYear && this.month==this.oMonth) tmpStr += 'class="calHighlightColor"';
			 else {
			    if (i==7-g_startDay || i==((7-g_startDay)%7)+1) tmpStr += 'class="calWeekend"';
				else tmpStr += 'class="cal"';
			 }
		     tmpStr += '><div id="cal'+i+'" style="padding:1px 0px 1px 0px;height:14px;"';
			 /* could create a date object here and compare that but probably more efficient to convert to a number
			   and compare number as numbers are primitives */
			 tmpCompare = parseInt('' + this.year + padZero(this.month) + padZero(iCount),10);
			 if (tmpCompare >= tmpFrom && tmpCompare <= tmpTo) {
			   //tmpStr += '<a class="cal" href="javascript: g_Calendar.clickDay(' + iCount + ');g_Calendar.setStyleColor();">' + iCount + '</a>';
			   tmpStr += ' onclick="javascript: g_Calendar.clickDay(' + iCount + ');"><a href="javascript: g_Calendar.clickDay(' + iCount + ');" style="display:block;height:14px;width:20px;color:#000;text-decoration:none;" class="gryHover">' + iCount + '</a>';
			 } else {
			   tmpStr += '><span style="color:#adadad;">' + iCount + '</span>';
			 }
			 iCount++;
		   } else {
		     if  (i==7-g_startDay || i==((7-g_startDay)%7)+1) tmpStr += 'class="calWeekend"'; else tmpStr +='class="cal"';
			 tmpStr += '>&nbsp;';
		   }
		   tmpStr += '</div></td>'
		 }
		 tmpStr += '</tr>'
	  }
	  tmpStr += '</table></td></tr></table>';
	  //tmpStr += '</table></td></tr></table></form';
	  return tmpStr;
	}
	
	Calendar.prototype.selectChange = function(){
	  this.month = browser.ns6?this.containerLayer.ownerDocument.forms[0].month.selectedIndex:this.containerLayer.document.forms[0].month.selectedIndex;
	  this.writeString(this.buildString());
	}
	
	Calendar.prototype.inputChange = function(){
	  var tmp = browser.ns6?this.containerLayer.ownerDocument.forms[0].year:this.containerLayer.document.forms[0].year;
	  if (tmp.value >=1900 || tmp.value <=2100){
	    this.year = tmp.value;
	    this.writeString(this.buildString());
	  } else {
	    tmp.value = this.year;
	  }
	}
	Calendar.prototype.changeYear = function(incr){
	   (incr==1)?this.year++:this.year--;
	   this.writeString(this.buildString());
	}
	Calendar.prototype.changeMonth = function(incr){
	    if (this.month==11 && incr==1){
	      this.month = 0;
	  	  this.year++;
	    } else {
	      if (this.month==0 && incr==-1){
	        this.month = 11;
		    this.year--;
	      } else {
		    (incr==1)?this.month++:this.month--;
		  }
		}
		this.writeString(this.buildString());
	}
	
	Calendar.prototype.clickDay = function(day){
	   var tmp=$(this.target);
	   if(this.nodeName == CONST_DIV_TYPE) {
	   	tmp.innerHTML = this.formatDateAsString(day,this.month,this.year);
	   } else {
	   	tmp.value = this.formatDateAsString(day,this.month,this.year);
	   }
	   if(this.nodeName == CONST_DIV_TYPE) {
	   	Element.classNames(this.target).set('nonTrans');
	   }
       tmp.style['background'] = '';
	    if (browser.ns4) this.containerLayer.hidden=true;
	    if (browser.dom || browser.ie4){
	      this.containerLayer.style.visibility='hidden';
	    }
	   
	}
	
	Calendar.prototype.setStyleColor = function() {
		var tmp = $(this.target);
		tmp.style.color = '';
	}
	
	Calendar.prototype.formatDateAsString = function(day, month, year){
	  var delim = eval('/\\' + this.dateDelim + '/g');
	   switch (this.dateFormat.replace(delim,"")){
	     case 'ddmmmyyyy': return padZero(day) + this.dateDelim + this.months[month].substr(0,3) + this.dateDelim + year;
		 case 'ddmmyyyy': return padZero(day) + this.dateDelim + padZero(month+1) + this.dateDelim + year;
		 case 'mmddyyyy': return padZero((month+1)) + this.dateDelim + padZero(day) + this.dateDelim + year;
	     case 'yyyymmdd': return year + this.dateDelim + padZero(month+1) + this.dateDelim + padZero(day);
		 default: alert('unsupported date format');
	   }
	}
	Calendar.prototype.writeString = function(str){
	  if (browser.ns4){
	    this.containerLayer.document.open();
	    this.containerLayer.document.write(str);
	    this.containerLayer.document.close();
	  } 
	  if (browser.dom || browser.ie4){
	  	Element.update(this.containerLayer, '<div>'+str+'</div>');
	  }
	}
	
	Calendar.prototype.show = function(event, target, bHasDropDown, dateFormat, dateFrom, dateTo){
		
		if (document.getElementById('overlay_modal')) document.getElementById('overlay_modal').style.visibility = 'hidden';
	
	this.nodeName;
	if($(target) != null) {
		this.nodeName= $(target).nodeName;
	}
	// calendar can restrict choices between 2 dates, if however no restrictions
	// are made, let them choose any date between 1900 and 3000
	this.dateFrom = dateFrom || new Date(1900,0,1);
	this.dateFromDay = padZero(this.dateFrom.getDate());
	this.dateFromMonth = padZero(this.dateFrom.getMonth());
	this.dateFromYear = this.dateFrom.getFullYear();
	this.dateTo = dateTo || new Date();
	this.dateToDay = padZero(this.dateTo.getDate());
	this.dateToMonth = padZero(this.dateTo.getMonth());
	this.dateToYear = this.dateTo.getFullYear()+1;
	this.hasDropDown = bHasDropDown;
	this.dateFormat = dateFormat || 'dd-mmm-yyyy';
	switch (this.dateFormat){
	  case 'dd-mmm-yyyy':
	  case 'dd-mm-yyyy':
	  case 'yyyy-mm-dd':
	    this.dateDelim = '-';
		break;
	  case 'dd/mm/yyyy':
	  case 'mm/dd/yyyy':
	  case 'dd/mmm/yyyy':
	    this.dateDelim = '/';
		break;
	}
	
	  if (browser.ns4) {
	    if (!this.containerLayer.hidden) {
		  this.containerLayer.hidden=true;
		  return;
		}
	   }
	  if (browser.dom || browser.ie4){
	    if (this.containerLayer.style.visibility=='visible') {
		  this.containerLayer.style.visibility='hidden';
		  return;
		}  
	  }

	  if (browser.ie5 || browser.ie4){
	    var event = window.event;
	  }
	  if (browser.ns4){
	    this.containerLayer.x = event.x+10;
	    this.containerLayer.y = event.y-5;
	  }
	  if (browser.ie5 || browser.ie4){
	    var obj = $(target) //event.srcElement;
 	    x = 0;
  		while (obj.offsetParent != null) {
    		  x += obj.offsetLeft;
    		  obj = obj.offsetParent;
  		}
  		x += obj.offsetLeft;
	    y = 0;
		var obj = $(target) //event.srcElement;
	    while (obj.offsetParent != null) {
    		  y += obj.offsetTop;
    		  obj = obj.offsetParent;
  		}
  		y += obj.offsetTop;
		
        this.containerLayer.style.left = x+35;
		this.containerLayer.style.top = y;
	  }
	  if (browser.ns6){
	    this.containerLayer.style.left = event.pageX+10;
		this.containerLayer.style.top = event.pageY-5;
	  }
	  this.target = target;
	  //var tmp = this.target.innerHTML;
	  var tmp;
	  if(this.nodeName == CONST_DIV_TYPE) {
	  	tmp= this.target.innerHTML;
	  } else {
	  	tmp = this.target.value;
	  }
	  if (tmp && tmp.split(this.dateDelim).length==3 && tmp.indexOf('d')==-1 && tmp != 'Date*'){
	    var atmp = tmp.split(this.dateDelim)
		switch (this.dateFormat){
		 case 'dd-mmm-yyyy':
		 case 'dd/mmm/yyyy':
		   for (var i=0;i<this.months.length;i++){
		     if (atmp[1].toLowerCase()==this.months[i].substr(0,3).toLowerCase()){
		       this.month = this.oMonth = i;
			   break;
		     }
		   }
		   this.day = parseInt(atmp[0],10);
		   this.year = this.oYear = parseInt(atmp[2],10);
		   break;
		 case 'dd/mm/yyyy':
		 case 'dd-mm-yyyy':
		   this.month = this.oMonth = parseInt(atmp[1]-1,10); 
		   this.day = parseInt(atmp[0],10);
		   this.year = this.oYear = parseInt(atmp[2],10);
		   break;
		 case 'mm/dd/yyyy':
		 case 'mm-dd-yyyy':
		   this.month = this.oMonth = parseInt(atmp[0]-1,10);
		   this.day = parseInt(atmp[1],10);
		   this.year = this.oYear = parseInt(atmp[2],10);
		   break;
		 case 'yyyy-mm-dd':
		   this.month = this.oMonth = parseInt(atmp[1]-1,10);
		   this.day = parseInt(atmp[2],10);
		   this.year = this.oYear = parseInt(atmp[0],10);
		   break;
		}
	  } else { // no date set, default to today
	    var theDate = new Date();
	  	 this.year = this.oYear = theDate.getFullYear();
	     this.month = this.oMonth = theDate.getMonth();
	     this.day = this.oDay = theDate.getDate();
	  }
	  this.writeString(this.buildString());
	  
	  // and then show it!
	   if (browser.ns4) {
	   this.containerLayer.hidden=false;
	   }
	  if (browser.dom || browser.ie4){
	      this.containerLayer.style.visibility='visible';
	  }
	  
	  if(browser.dom == 1) {
	  	this.containerLayer.hidden = false;
	  	//this.containerLayer.style.visibility = "visible";
	  }
	}
	
	Calendar.prototype.hide = function(){
	  if (browser.ns4) this.containerLayer.hidden = true;
	  if (browser.dom || browser.ie4){
	    this.containerLayer.style.visibility='hidden';
	  }
	}
	
	function handleDocumentClick(e){

	  if (browser.ie4 || browser.ie5) e = window.event;
	  
	  if( !g_Calendar ) return;

	  if (browser.ns6){
	    var bTest = (e.pageX > parseInt(g_Calendar.containerLayer.style.left,10) && e.pageX <  (parseInt(g_Calendar.containerLayer.style.left,10)+125) && e.pageY < (parseInt(g_Calendar.containerLayer.style.top,10)+125) && e.pageY > parseInt(g_Calendar.containerLayer.style.top,10));

	    if (e.target.name != '' && e.target.name!='imgCalendar' && e.target.name!='month'  && e.target.name!='year' && e.target.name!='calendar' && !bTest){
	      //alert("browser ns6 triggered hide <" + e.target.name + "> bTest is " + bTest);
		  g_Calendar.hide(); 
		}
	  }
	  if (browser.ie4 || browser.ie5){
		// extra test to see if user clicked inside the calendar but not on a valid date, we don't want it to disappear in this case
	   var bTest = (e.x > parseInt(g_Calendar.containerLayer.style.left,10) && e.x <  (parseInt(g_Calendar.containerLayer.style.left,10)+125) && e.y < (parseInt(g_Calendar.containerLayer.style.top,10)+125) && e.y > parseInt(g_Calendar.containerLayer.style.top,10));

	    //alert(e.srcElement.name+','+bTest+','+typeof(e.srcElement));
	
	    if (e.srcElement.name != '' && e.srcElement.name!='imgCalendar' && e.srcElement.name!='month' && e.srcElement.name!='year' && !bTest && typeof(e.srcElement)!='object'){
	      //alert("browser ie4 triggered hide");
		  g_Calendar.hide(); 
		}
	  }
	  if (browser.ns4) g_Calendar.hide();
	}
	
	// utility function
	function padZero(num) {
	  return ((num <= 9) ? ("0" + num) : num);
	}
	  // Finally licked extending  native date object;
	  Date.isLeapYear = function(year){ if (year%4==0 && ((year%100!=0) || (year%400==0))) return true; else return false; }
	  Date.daysInYear = function(year){ if (Date.isLeapYear(year)) return 366; else return 365;}
	  var DAY = 1000*60*60*24;
	  Date.prototype.addDays = function(num){
		return new Date((num*DAY)+this.valueOf());
	  }	
	  
	 // events capturing, careful you don't override this by setting something in the onload event of 
	// the body tag
	window.onload=function(){ 
	  //new Calendar(new Date());
	  if (browser.ns4){
	    if (typeof document.NSfix == 'undefined'){
		  document.NSfix = new Object();
	      document.NSfix.initWidth=window.innerWidth;
		  document.NSfix.initHeight=window.innerHeight;
		}
	  }
	}
	if (browser.ns4) window.onresize = function(){
	  if (document.NSfix.initWidth!=window.innerWidth || document.NSfix.initHeight!=window.innerHeight) window.location.reload(false);
	} // ns4 resize bug workaround
	Event.observe(window.document, 'click', handleDocumentClick);
	//window.document.onclick=handleDocumentClick;