/***********************************
	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
	31 Mar 2003	Added support for dd.mm.yyyy (Marco Brinkmann)
				Added dropdown list for year (Marco Brinkmann)
				Added support for ov3 element names (Marco Brinkmann)
	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
	7 Feb 2002	Fixed day highlight when year wasn't current year bug
	9 Jun 2002	Fixed bug with weekend colour
				Amended the code for the date functions extensions. 
				Shortened addDays code considerably
************************************/

	var timeoutDelay = 2000; // milliseconds, change this if you like, set to 0 for the calendar to never auto disappear
	var g_startDay = 0// 0=sunday, 1=monday
	
	// preload images
	var imgUp = new Image(8,12);
	imgUp.src = 'media/img/calendar_up.gif';
	var imgDown = new Image(8,12);
	imgDown.src = 'media/img/calendar_down.gif';

	// used by timeout auto hide functions
	var timeoutId = false;
	
	// get an Element by its Name
    function getIdByName(formName,elementName){
	  formElement = eval("document."+formName);
	  var text="";
	  for(var u =0;u<formElement.elements.length; u++){
      	  text+=formElement.elements[u].name+" =="+ elementName+"\n";
      	  if(formElement.elements[u].name == elementName)
        	return formElement.elements[u];
      }
      alert("Element not found:"+formName+"."+elementName);
  	  return null;
    } 
	
	// 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 : 100px;');
		document.writeln('top : 100px;');
		document.writeln('width : 146px;');;
		browser.platform=='Win32'?height=140:height=145;
		document.writeln('height : ' + height +'px;');
		document.writeln('clip:rect(0px 146px ' + height + 'px 0px);');
		//document.writeln('overflow : hidden;');
		document.writeln('visibility : hidden;');
		document.writeln('background-color : #ffffff');
		document.writeln('}');
		document.writeln('</style>')
		document.write('<div id="container"');
		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' && window.event.srcElement.name!='year') timeoutId=setTimeout('g_Calendar.hide();',timeoutDelay);
	    //if (window.event.srcElement && window.event.srcElement.name!='year') timeoutId=setTimeout('g_Calendar.hide();',timeoutDelay);
	  }
	  if (browser.ns6 || browser.ns4){
	    timeoutId=setTimeout('g_Calendar.hide();',timeoutDelay);
	  }
	}

	// constructor for calendar class
	function Calendar(){
	  g_Calendar = this;
	  // some constants needed throughout the program
	  this.daysOfWeek = new Array("So","Mo","Di","Mi","Do","Fr","Sa");
	  this.months = new Array("Januar","Februar","M&auml;rz","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
	  this.daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	  
	  if (browser.ns4){
	    var tmpLayer = new Layer(149);
		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=152;
	  }

	}
	
 	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">';
	  tmpStr += '<tr>';
	  tmpStr += '<td width="60%" class="cal" align="left">';
	  if (this.hasDropDown) {
	    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 {
	    tmpStr += '<table border="0" cellspacing="0" cellpadding="0"><tr><td><a href="javascript: g_Calendar.changeMonth(-1);"><img name="calendar" src="media/img/calendar_down.gif" width="8" height="12" border="0" alt=""></a></td><td class="cal" width="100%" align="center">' + this.months[this.month] + '</td><td class="cal"><a href="javascript: g_Calendar.changeMonth(+1);"><img name="calendar" src="media/img/calendar_up.gif" width="8" height="12" border="0" alt=""></a></td></tr></table>';
	  }
	  tmpStr += '</td>';
	  /* observation : for some reason if the below event is changed to 'onChange' rather than 'onBlur' it totally crashes IE (4 and 5)!
	  */
	  tmpStr += '<td width="40%" align="right" class="cal">';

	  // create year box
	  if (this.hasDropDown) {
// mb 31.03.03 new
	  	tmpStr += '<select class="year" name="year" onchange="g_Calendar.selectChange();" onBlur="g_Calendar.inputChange();">';
		for (var i=this.dateFromYear;i<=this.dateToYear;i++){
	      tmpStr += '<option value="' + i + '"' 
		  if (i == this.year) tmpStr += ' selected';
		  tmpStr += '>' + i + '</option>';
	    }
	  	tmpStr += '</select>';
/*	mb 31.03.03 out
	    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 + '">';
	mb 31.03.03 end */
	  } else {
	  tmpStr += '<table border="0" cellspacing="0" cellpadding="0"><tr><td class="cal"><a href="javascript: g_Calendar.changeYear(-1);"><img name="calendar" src="media/img/calendar_down.gif" width="8" height="12" border="0" alt=""></a></td><td class="cal" width="100%" align="center">' + this.year + '</td><td class="cal"><a href="javascript: g_Calendar.changeYear(+1);"><img name="calendar" src="media/img/calendar_up.gif" width="8" height="12" border="0" alt=""></a></td></tr></table>'
	  }
	  tmpStr += '</td>';
	  tmpStr += '</tr>';
	  tmpStr += '</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="0" cellpadding="1" class="calBgColor">';
	  tmpStr += '<tr>';
	    for (var i=0;i<7;i++){
		  tmpStr += '<td align="center" class="calDaysColor">' + this.daysOfWeek[(g_startDay+i)%7] + '</td>';
		}
	  tmpStr += '</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="16" 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 += '>';
			 /* 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 + ');">' + iCount + '</a>';
			 } else {
			   tmpStr += '<span class="disabled">' + 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 += '</td>'
		 }
		 tmpStr += '</tr>'
	  }
	  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.year = browser.ns6?this.containerLayer.ownerDocument.forms[0].year.value:this.containerLayer.document.forms[0].year.value;
	  this.writeString(this.buildString());
	}
	
	Calendar.prototype.inputChange = function(){
		var tmp = browser.ns6?this.containerLayer.ownerDocument.forms[0].year.value:this.containerLayer.document.forms[0].year.value;

	  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){
// mb change
//   var tmp = eval('document.' + this.target);
		var tmp = getIdByName(this.form, this.element);
//
	   tmp.value = this.formatDateAsString(day,this.month,this.year);
	    if (browser.ns4) this.containerLayer.hidden=true;
	    if (browser.dom || browser.ie4){
	      this.containerLayer.style.visibility='hidden';
	    }

		// show select boxes
		if (browser.dom && !browser.op) {
			if(!this.sel) {
				this.sel=document.getElementsByTagName("SELECT");
			}
			var sel=this.sel;

			for(i=0;i<sel.length;i++) {
				if(sel[i].style.visibility=="hidden" && sel[i].name!="year" && sel[i].name!="month") {
					sel[i].style.visibility="visible";
				}
			}
		}

	}

	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){
	    this.containerLayer.innerHTML = str;
	  }
	}
	
	// directionX: 0=left, 1=right
	Calendar.prototype.show = function(event, form, element, bhasDropDown, dateFormat, dateFrom, dateTo, directionX){
	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(2020,0,1);
	this.dateToDay = padZero(this.dateTo.getDate());
	this.dateToMonth = padZero(this.dateTo.getMonth());
	this.dateToYear = this.dateTo.getFullYear();

	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 = '/';
	  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;
	  }

	this.x = 0;
	this.x2 = (!browser.dom)?self.innerWidth:self.document.body.offsetWidth-5;
	this.y = 0;
	var widthLayer=154;

	if (browser.ns4){
		switch (directionX) {
			case 0:
				this.x = this.containerLayer.x = event.x+10;
				break;
			case 1:
				this.x = this.containerLayer.x = event.x+10-widthLayer;
				break;
			case 2:
				this.x = this.containerLayer.x = event.x-widthLayer/2+8;
				break;
			default:
				this.x = this.containerLayer.x = event.x+10;
		}

		this.y = this.containerLayer.y = event.y-5;
	}

	if (browser.ie5 || browser.ie4){
		var obj = event.srcElement;

 	    x = 0;
  		while (obj.offsetParent != null) {
    		  x += obj.offsetLeft;
    		  obj = obj.offsetParent;
  		}
  		this.x = x += obj.offsetLeft;

	    y = 0;
// mb 13.06.03 edit (layer technic from ov3 makes the y-position weird, don't know why. Somehow the div y-position is too large)
//		var obj = event.srcElement;
//	    while (obj.offsetParent != null) {
//	    	alert(obj.offsetTop+" "+obj.tagName);
//    		  y += obj.offsetTop;
//   		  obj = obj.offsetParent;
//		}
// 		this.y = y += obj.offsetTop + 20;

		y = event.clientY + document.body.scrollTop;
  		this.y = y += obj.offsetTop + 10;
// mb 13.06.03 end

		switch (directionX) {
			case 0:
		        this.x = x+20;
		        break;
			case 1:
				this.x = x+10-widthLayer;
				break;
			case 2:
		        this.x = x+8-widthLayer/2;
		        break;
			default:
		        this.x = x+20;
		}

		if (this.x < 0) {
			this.x = 0;
		} else {
			if ((this.x+widthLayer) > this.x2) {
				this.x = this.x2-widthLayer;
			}
		}

		this.containerLayer.style.left = this.x;

		if (event.y>0) {
			this.y = this.containerLayer.style.top = y;
			// Should be 275 px
		}

//dumpProps(this.containerLayer);
	}

	if (browser.ns6){
	  	switch (directionX) {
	  		case 0:
				this.x = event.pageX+10;
				break;
			case 1:
				this.x = event.pageX+10-widthLayer;
				break;
			case 2:
				this.x = event.pageX-widthLayer/2+8;
				break;
			default:
				this.x = event.pageX+10;
		}

		if ((this.x+widthLayer) > this.x2) {
			this.x = this.x2 - widthLayer;
		}

		this.containerLayer.style.left = this.x;
		this.y = this.containerLayer.style.top = event.pageY-5 + 20;
	}


	  this.form = form;
	  this.element = element;
       	    	 
//	dumpProps(browser);
// mb change
//	  var tmp = eval('document.' + this.target);

		var tmp = getIdByName(this.form, this.element);
// mb end

	  if (tmp && tmp.value && tmp.value.split(this.dateDelim).length==3 && tmp.value.indexOf('d')==-1){
	    var atmp = tmp.value.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':
		 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());

	// Hide Select boxes
	if (browser.dom && !browser.op) {
		var selx, sely, selw, selh, i
		if(!this.sel) {
			this.sel=document.getElementsByTagName("SELECT")
		}
		var sel=this.sel

	  for(i=0;i<sel.length;i++){
		  selx=0; sely=0; var selp;
			if (sel[i].offsetParent) {
				selp=sel[i];
				while(selp.offsetParent) {
					selp=selp.offsetParent;
					selx+=selp.offsetLeft;
					sely+=selp.offsetTop;
				}
			}

			selx+=sel[i].offsetLeft;
			sely+=sel[i].offsetTop;
			selw=sel[i].offsetWidth;
			selh=sel[i].offsetHeight;			

			if (sel[i].name != "month" && sel[i].name != "year" && selx+selw>this.x && selx<this.x+widthLayer && sely+selh>this.y) {
				if(sel[i].style.visibility!="hidden") {
					sel[i].style.visibility="hidden";
				}
			}
		}
	} // end hide

	  // and then show it!
	   if (browser.ns4) {
		   this.containerLayer.hidden=false;
	   }
	  if (browser.dom || browser.ie4){
	      this.containerLayer.style.visibility='visible';
	  }
	}

function dumpProps2(obj, parent) {
   for (var i in obj) {
      if (parent) { msg = parent + "." + i + "\n" + obj[i]; } else { var msg = i + "\n" + obj[i]; }
      if (!confirm(msg)) { return; }
      if (typeof obj[i] == "object") { 
         if (parent) { dumpProps2(obj[i], parent + "." + i); } else { dumpProps2(obj[i], i); }
      }
   }
}

function dumpProps(obj, parent) {
   var msg='';
   for (var i in obj) {
      if (parent) { msg += parent + "." + i + ": " + obj[i]+"//"; } else { msg += i + ": " + obj[i]+"//"; }
      // if (!confirm(msg)) { return; }
      if (typeof obj[i] == "object") { 
         // if (parent) { dumpProps(obj[i], parent + "." + i); } else { dumpProps(obj[i], i); }
      }
   }
   alert(msg);
}

	Calendar.prototype.hide = function(){
	  if (browser.ns4) this.containerLayer.hidden = true;
	  if (browser.dom || browser.ie4){
	    this.containerLayer.style.visibility='hidden';
	  }

		// show select boxes
		if (browser.dom && !browser.op) {
			if(!this.sel) {
				this.sel=document.getElementsByTagName("SELECT");
			}
			var sel=this.sel;

			for(i=0;i<sel.length;i++) {
				if(sel[i].style.visibility=="hidden" && sel[i].name!="year" && sel[i].name!="month") {
					sel[i].style.visibility="visible";
				}
			}
		}

	  }
	
	function handleDocumentClick(e){
	  if (browser.ie4 || browser.ie5) e = window.event;

	  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!='imgCalendar' && e.target.name!='month'  && e.target.name!='year' && e.target.name!='calendar' && !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));
	    if (e.srcElement.name!='imgCalendar' && e.srcElement.name!='month' && e.srcElement.name!='year' && !bTest & typeof(e.srcElement)!='object'){
		  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
	window.document.onclick=handleDocumentClick;
/*
	window.onerror = function(msg,url,line){
	  alert('******* an error has occurred ********' +
	  '\n\nPlease check that' + 
	  '\n\n1)You have not added any code to the body onload event,'
	  +  '\nif you want to run something as well as the calendar initialisation'
	  + '\ncode, add it to the onload event in the calendar library.'
	  + '\n\n2)You have set the parameters correctly in the g_Calendar.show() method '
	  + '\n\nSee www.totallysmartit.com\\examples\\calendar\\simple.asp for examples'
	  + '\n\n------------------------------------------------------'
	  + '\nError details'
	  + '\nText:' + msg + '\nurl:' + url + '\nline:' + line);
	}
*/