/***********************************************************************************************************
Example :
	g_Calendar = new Calendar(new Date());
	<a href="javascript: void(0);" onmouseover="if (timeoutId) clearTimeout(timeoutId);window.status='Show Calendar';return true;" onmouseout="if (timeoutDelay) calendarTimeout();window.status='';" onclick="g_Calendar.show(event,'formname.textboxname', false, 'dataformat', new Date()); return false;"><img src="'+this.g_imgRoot +'calendar.gif" name="imgCalendar" width="34" height="21" border="0" alt=""></a>
***********************************************************************************************************/
var timeoutDelay = 300; // 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 = this.g_imgRoot + 'up.gif';

var imgDown = new Image(8,12);
imgDown.src = this.g_imgRoot+ 'down.gif';

// used by timeout auto hide functions
var timeoutId = false;
var browser = new Browser();
var g_Calendar;  // global to hold the calendar reference, set by constructor
/***********************************************************************************************************/
// 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;
}
// dom browsers require this written to the HEAD section
if (browser.dom || browser.ie4)
{	
    document.write('<div id="container" class="CssCalendar" style="z-index:100"');
	if (timeoutDelay) document.write(' onmouseout="calendarTimeout();" onmouseover="if (timeoutId) clearTimeout(timeoutId);"');
	document.write('></div>');
	document.write('<Iframe id="containercover" class="CalIframe" src="javascript:false;" style="z-index:99"');
	document.write('></IFrame>');
}
/***********************************************************************************************************/
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 (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("Zo","Ma","Di","Wo","Do","Vr","Za");
	this.months = new Array("Jan","Feb","Mar","April","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Dec");
	this.daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	this.timeoutDelay = 300;

	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;
	}
	if (browser.dom || browser.ie4){
		var tmpLayer = browser.dom?document.getElementById('container'):document.all.container;
		var tmpCover = browser.dom?document.getElementById('containercover'):document.all.containercover;
	}
	this.containerLayer = tmpLayer;
	this.containerCover = tmpCover
	if (browser.ns4 && browser.platform=='Win32'){
		this.containerLayer.clip.height=140;
		this.containerLayer.clip.width=160;
	}
	if (browser.ns4){
		if (typeof document.NSfix == 'undefined'){
			document.NSfix = new Object();
			document.NSfix.initWidth=window.innerWidth;
			document.NSfix.initHeight=window.innerHeight;
		}
	}
}
/***********************************************************************************************************/
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 = '<table width="100%" border="0" cellspacing="0" cellpadding="2" class="TableBorder">'
	tmpStr += '<form onSubmit="this.year.blur();return false;">'
	tmpStr += '<tr><td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="1" class="Content"><tr><td colspan="2" class="cal" align="center">Kalender</td></tr>';
	tmpStr += '<tr>';
	tmpStr += '<td width="50%" class="content" align="right">';
	if (this.hasDropDown) {
		tmpStr += '<select class="content" name="month" onchange="g_Calendar.selectChange();" isSalenderControl="true">';
		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="'+this.g_imgRoot +'down.gif" width="8" height="12" border="0" alt=""></a></td><td class="content" width="100%" align="center">' + this.months[this.month] + '</td><td class="content"><a href="javascript: g_Calendar.changeMonth(+1);"><img name="calendar" src="'+this.g_imgRoot +'up.gif" width="8" height="12" border="0" alt=""></a></td></tr></table>';
	tmpStr += '</td>';
	tmpStr += '<td width="50%" align="left" class="content">';
	if (this.hasDropDown) {
		tmpStr +='<select class="content" name="year" onchange="g_Calendar.inputChange();" isSalenderControl="true">';
		for (var i=1900;i<=2100;i++){
			tmpStr += '<option value="' + i + '"'
			if (i == this.year) tmpStr += ' selected';
				tmpStr += '>' + i + '</option>';
		}
		tmpStr += '</select>';
	}else{
		tmpStr += '<table border="0" cellspacing="0" cellpadding="0"><tr><td class="content"><a href="javascript: g_Calendar.changeYear(-1);"><img name="calendar" src="'+this.g_imgRoot +'down.gif" width="8" height="12" border="0" alt=""></a></td><td class="content" width="100%" align="center">' + this.year + '</td><td class="content"><a href="javascript: g_Calendar.changeYear(+1);"><img name="calendar" src=" '+ this.g_imgRoot +'up.gif" width="8" runat="server" height="12" border="0" alt=""></a></td></tr></table>'
	}
	tmpStr += '</td>';
	tmpStr += '</tr><tr height="1px"><td></td></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
	var strCssClass = "content";
	tmpStr += '<table width="100%" border="0" cellspacing="0" cellpadding="1" class="content">';
	tmpStr += '<tr>';
	for (var i=0;i<7;i++){
		if(i==0 || i==6)
			strCssClass = "ContentWeekend";
		else
			strCssClass = "content";
		tmpStr += '<td align="center" class="'+ strCssClass +'">' + 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="OBDateEnabled"';
					else
						tmpStr += 'class="content"';
				}
				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="content" href="javascript: g_Calendar.clickDay(' + iCount + ');">' + iCount + '</a>';
				//else
					//tmpStr += '<span class="OBDateDisabled">' + iCount + '</span>';
				iCount++;
			}else {
				if  (i==7-g_startDay || i==((7-g_startDay)%7)+1) tmpStr += 'class="content"'; else tmpStr +='class="OBDateEnabled"';
					tmpStr += '>&nbsp;';
			}
			tmpStr += '</td>'
		}
		tmpStr += '</tr>'
	}
	tmpStr += '</table></td></tr>'
	tmpStr += '</form>'
	tmpStr +='</table>'
	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 = eval('document.' + this.target);
	try{
		tmp.value = this.formatDateAsString(day,this.month,this.year);
	}
	catch(Exe){}
	if (browser.ns4){
	    this.containerLayer.hidden=true;
	    this.containerCover.hidden=true;
	}
	if (browser.dom || browser.ie4){
	    this.containerLayer.style.visibility='hidden';
	    this.containerCover.style.visibility='hidden';
	}
}
/***********************************************************************************************************/
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;
	}
}
/***********************************************************************************************************/
Calendar.prototype.SetLocation = function(event){	
	if (browser.ns4){
		this.containerLayer.x = event.x+10;
		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;
		}
		x += obj.offsetLeft;
		y = 0;
		var obj = event.srcElement;
		while (obj.offsetParent != null) {
			y += obj.offsetTop;
			obj = obj.offsetParent;
		}
		y += obj.offsetTop;
		this.containerLayer.style.left = x+35;
		if (event.y>0)this.containerLayer.style.top = y;
	}
	if (browser.ns6)
	{
		this.containerLayer.style.left = event.pageX+10;
		this.containerLayer.style.top = event.pageY-5;
	}
	var intLeft = parseInt(this.containerLayer.style.left.toString().substring(0,this.containerLayer.style.left.toString().length-2));	
	var intTop = parseInt(this.containerLayer.style.top.toString().substring(0,this.containerLayer.style.top.toString().length-2));		
	this.containerLayer.style.left = intLeft-12;
	this.containerLayer.style.top = intTop;
}
/*********************************************************************************************************** /
Calendar.prototype.SetLocation = function(event){
	var tWidth = document.body.clientWidth;
	var tHeight =document.body.clientHeight;
	var sWidth = document.body.scrollLeft;
	var sHeight =document.body.scrollTop;
	var imgWidth = 0;
	var imgHeight = 0;
	var divWidth = 160;
	var divHeight = 140;
	var x = 0;
	var y = 0;	
	x = event.clientX - event.offsetX + divWidth;
	y = event.clientY - event.offsetY + divHeight;	
	if((x + divWidth - sWidth) > tWidth && (x - divWidth - imgWidth - sWidth) >= 0)
	{
		x -= (imgWidth + divWidth);
	}
	if((y + divHeight - sHeight) > tHeight && (y - divHeight + imgHeight - sHeight) >= 0)
	{
		y += (imgHeight - divHeight);
	}
	this.containerLayer.style.left = x;
	this.containerLayer.style.top = y;
}
/***********************************************************************************************************/
Calendar.prototype.show = function(event, target, bHasDropDown, dateFormat, dateFrom, dateTo,imgRoot)
{
	// 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(3000,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';
	this.g_imgRoot =  imgRoot;

	switch (this.dateFormat)
	{
	  case 'dd-mmm-yyyy':
	  case 'dd-mm-yyyy':
	  case 'mm-dd-yyyy':
	  case 'yyyy-mm-dd':
			this.dateDelim = '-';
			break;
	  case 'dd/mm/yyyy':
	  case 'mm/dd/yyyy':
	  case 'dd/mmm/yyyy':
			this.dateDelim = '/';
			break;
	}
		
	  this.SetLocation(event);
	  this.target = target;
	  var tmp;
	  try{
		tmp = eval('document.' + this.target);
	  }catch(exc){
		tmp = eval(this.target);
	  }

	  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':
		   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;
		this.containerCover.style.width = this.containerLayer.offsetWidth;
		this.containerCover.style.height = this.containerLayer.offsetHeight;
		this.containerCover.style.top = this.containerLayer.style.top;
		this.containerCover.style.left = this.containerLayer.style.left;
		this.containerCover.style.zIndex = this.containerLayer.style.zIndex - 1;
	   	this.containerCover.hidden=false;
	   }
	  if (browser.dom || browser.ie4)
	  {
		this.containerCover.style.width = this.containerLayer.offsetWidth;
		this.containerCover.style.height = this.containerLayer.offsetHeight;
		this.containerCover.style.top = this.containerLayer.style.top;
		this.containerCover.style.left = this.containerLayer.style.left;
		this.containerCover.style.zIndex = this.containerLayer.style.zIndex - 1;
	    this.containerLayer.style.visibility='visible';
	    this.containerCover.style.visibility='visible';
	  }
	}
/***********************************************************************************************************/
Calendar.prototype.hide = function()
{
	if (browser.ns4) {
		this.containerLayer.hidden=true;
		this.containerCover.hidden=true;
	}
	if (browser.dom || browser.ie4){
		this.containerLayer.style.visibility='hidden';
		this.containerCover.style.visibility='hidden';
	}
}
/***********************************************************************************************************/
function handleDocumentClick(e)
{
	if(typeof(g_Calendar)=='undefined' || g_Calendar == null)
		return;
	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)+140) && e.y < (parseInt(g_Calendar.containerLayer.style.top,10)+140) && 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'){
		if (e.srcElement.name!='imgCalendar' && e.srcElement.name!='month' && e.srcElement.name!='year' && !bTest){
			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()
{
	g_Calendar=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;
		}
	}
	try{
		hideControls(this);
	}catch(Exc){
		//Do Nothing		
	}
}

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;
/***********************************************************************************************************/
function showCalendar(field,dateFormat)
{
	try
	{
		var dtFromDate='';
		var dtToDate='';
		var dtString="";
		var fieldname ="";

		if(''==dateFormat || dateFormat==null)
			dateFormat = 'dd/mm/yy';

		var dtDate = document.frmIncomeCapture.elements[field.name].value;
		if(''==dtDate || dtDate==null){
			dtFromDate = null;
		}
		else{
			if(dtDate.indexOf("/") > 0)
				dtString=dtDate.split("/");
			else
				dtString=dtDate.split("-");

			switch(dateFormat)
			{
				case 'dd/mm/yy':
					year = parseInt(dtString[2],10);
					year = year>=70?1900+year:2000+year;
					dtFromDate=new Date(year,parseInt(dtString[1],10),parseInt(dtString[0],10));
					break;
				case 'dd/mm/yyyy':
					//dtFromDate=new Date(dtDate.substr(3,2)+"/"+dtDate.substr(0,2)+"/"+dtDate.substr(6,4));
					dtFromDate=new Date(parseInt(dtString[2],10),parseInt(dtString[1],10),parseInt(dtString[0],10));
					break;
			}
		}
		fieldname = field.form.name + "." + field.id;
		
		g_Calendar.show(event,fieldname, true, dateFormat,dtFromDate);
		
		return false;
	}
	catch(exc){
		alert("Unable to generate calendar control\n" + exc.message);
		//displayProperties(exc);
	}
}
