// ===================================================================
// ezformcalendar.js
//
// NOTICE: You may use this code for any purpose, commercial or
// private, without any further permission from the author. However,
// you may *NOT* re-distribute this code in any way except through its
// use. That means, you can include it in your product, or your web
// site, or any other form where the code is actually being used, but
// you may not put the plain javascript up on your site for download
// or include it in your javascript libraries for download. 
// ===================================================================

// HISTORY
// ------------------------------------------------------------------
// 7 nov 2006: Initial version

function Calendar(param) {
this.Name=param;
this.SelectedDates=new Array();
this.DateEntries = new Array();
this.FormAndFieldName='notdefined';
this.FormAndFieldNameArray = this.FormAndFieldName.split('.');
this.field=document.forms[this.FormAndFieldNameArray]
this.CalendarType='default';
this.ShowWeeks=false;
this.Border=true;
this.Width=145;
this.CalendarCols=1;
this.CalendarRows=1;
this.MultipleDatesAllowed=false;
this.YearSelector=true;
this.MonthNamesList = new Array('nothing','January','February','March','April','May','June','July','August','September','October','November','December');
this.DayNamesList = new Array('m','t','w','t','f','s','s');
this.TodaysDate=new Date();
this.StartAtMonth=this.TodaysDate.getMonth()+1;
this.StartAtYear=this.TodaysDate.getFullYear();
this.TodayMonth=this.TodaysDate.getMonth()+1;
this.TodayYear=this.TodaysDate.getFullYear();
this.TodayDay=this.TodaysDate.getDate();
this.StartAtDate=new Date(this.StartAtYear,this.StartAtMonth-1,1);
this.LeftArrow='/pub/scripts/calendar/calbutleft.gif';
this.RightArrow='/pub/scripts/calendar/calbutright.gif';
this.LeftArrowMargin=6;
this.RightArrowMargin=6;
this.Holidays='';
this.DateFormat='d/m/y';
this.MinDay=15; this.MinMonth=10; this.MinYear=1582; /* minimum date the calendar can handle */
this.MaxDay=31; this.MaxMonth=12; this.MaxYear=2100; /* maximum date (the calendar can handle more!) */
this.disabled=false;
this.ShowCalendar=function() {
	/* if one date is present in the form field, move the calendar to that date */
	if (this.SelectedDates.length == 1) { 
		var splitterchar=this.DateFormat.charAt(1);
		var temp=this.Replace(splitterchar,'',this.DateFormat);
		var mloc=temp.indexOf('m'); var yloc=temp.indexOf('y');
		var datearray=this.SelectedDates[0].split(splitterchar);
		this.StartAtYear=parseInt(datearray[yloc]); this.StartAtMonth=parseInt(datearray[mloc]); 
		this.StartAtDate=new Date(this.StartAtYear,this.StartAtMonth-1,1);
	} else
	/* move to today */
	{ 
		this.TodaysDate=new Date();
		this.StartAtMonth=this.TodaysDate.getMonth()+1; this.StartAtYear=this.TodaysDate.getFullYear();
		this.StartAtDate=new Date(this.StartAtYear,this.StartAtMonth-1,1);
	}
	/* show calendar */
	this.FillCalendars();
	document.getElementById(this.ParentElement).style.display='inline';
}

this.SetMonthNames=function(param) {
	param='nothing,'+param; this.MonthNamesList= param.split(",");
}

this.SetDayNames=function(param) {
	this.DayNamesList= param.split(",");
}

this.SetDateFormat=function(param) {
	var temp=param;
	temp=this.Replace('mm','m',temp); temp=this.Replace('dd','d',temp); temp=this.Replace('yyyy','y',temp);
	this.DateFormat= temp;
}

this.SetMinDate=function(param) {
	var splitterchar=this.DateFormat.charAt(1);
	var temp=this.Replace(splitterchar,'',this.DateFormat);
	var mloc=temp.indexOf('m'); var dloc=temp.indexOf('d'); var yloc=temp.indexOf('y');
	var datearray=param.split(splitterchar);
	this.MinYear=parseInt(datearray[yloc]); this.MinMonth=parseInt(datearray[mloc]); this.MinDay=parseInt(datearray[dloc]);
	if (new Date(this.MinYear,this.MinMonth-1,this.MinDay) < new Date(1582,10-1,15)) {
		this.MinDay=15; this.MinMonth=10; this.MinYear=1582; 
	} else{
		// if min date is less then today then set minDate as today
		var minDate=new Date()
			minDate.setFullYear(this.MinYear,this.MinMonth-1,1);
		var today = new Date();
		if (minDate>today) {
			this.MinDay=1; this.MinMonth=today.getMonth()+1; this.MinYear=today.getFullYear();
		}
	}
}

this.SetMaxDate=function(param) {
	var splitterchar=this.DateFormat.charAt(1);
	var temp=this.Replace(splitterchar,'',this.DateFormat);
	var mloc=temp.indexOf('m'); var dloc=temp.indexOf('d'); var yloc=temp.indexOf('y');
	var datearray=param.split(splitterchar);
	this.MaxYear=parseInt(datearray[yloc]); this.MaxMonth=parseInt(datearray[mloc]); this.MaxDay=parseInt(datearray[dloc]);
	
	// if max date is greater then today then set maxDate as today
	var maxDate=new Date()
		maxDate.setFullYear(this.MaxYear,this.MaxMonth-1,this.MaxDay-1);
	var today = new Date();
	if (maxDate<today) {
		this.MaxDay=1; this.MaxMonth=today.getMonth()+1; this.MaxYear=today.getFullYear();
	}
	
}


this.InitCalendar=function() {
/* adds html code to the current page */
if (this.CalendarCols != 1 || this.CalendarRows != 1)
{this.YearSelector=false; } /* no year selector when there are multiple months shown */
if (this.MaxYear==this.MinYear)
{this.YearSelector=false; } /* no year selector when there is only one year available */

if (this.Border == true) {var h='<table width='+this.Width+' border="1" cellspacing="0" cellpadding="0" style="z-Index: 9999;" class="Calendar">';} else {var h='<table border="0" cellspacing="0" cellpadding="0">';}
for (var y = 1 ; y < this.CalendarRows+1; y++) { h=h+'<tr>';
for (var x = 1 ; x < this.CalendarCols+1; x++){ h=h+'<td valign=top>';
h=h+'<table cellspacing=0 width='+this.Width+' cellpadding=0 border=0 id="'+this.ParentElement+'_'+x+'_'+y+'" class="Calendar">';
h=h+'<tr><td colspan=9 height=25><table cellspacing=0 cellpadding=0 border=0 width=100% class="CalendarMonthHeading"><tr>';
h=h+'<td width='+this.LeftArrowMargin+'></td>';
if (this.CalendarCols == 1 && this.CalendarRows == 1) { var m = -1;} else {
var m = -(this.CalendarRows*this.CalendarCols)*2+1; }

if (x == 1 && y == 1) {
h=h+'<td id="'+this.ParentElement+'_LeftArrow" width="5" class="CalendarArrow" onclick="'+this.Name+'.MoveMonth('+m+');'+this.Name+'.FillCalendars();"><img src="'+this.LeftArrow+'" width="5" height="9" alt=""></td>'; } else { h=h+'<td width=5></td>'; }

h=h+'<td align=center id="'+this.ParentElement+'_'+x+'_'+y+'_month">&nbsp;</td>';

if (x == this.CalendarCols && y == 1) {
h=h+'<td id="'+this.ParentElement+'_RightArrow" width="5" class="CalendarArrow" onclick="'+this.Name+'.MoveMonth(1);'+this.Name+'.FillCalendars();"><img src="'+this.RightArrow+'" width="5" height="9" alt=""></td>';} else { h=h+'<td width=5></td>';}

h=h+'<td width='+this.RightArrowMargin+'></td></tr></table></td></tr><tr><td height=25>&nbsp;</td><td class=CalendarDayHeading>'+this.DayNamesList[0]+'</td><td class=CalendarDayHeading>'+this.DayNamesList[1]+'</td><td class=CalendarDayHeading>'+this.DayNamesList[2]+'</td><td class=CalendarDayHeading>'+this.DayNamesList[3]+'</td><td class=CalendarDayHeading>'+this.DayNamesList[4]+'</td><td class=CalendarDayHeadingWeekend>'+this.DayNamesList[5]+'</td><td class=CalendarDayHeadingWeekend>'+this.DayNamesList[6]+'</td><td width=14></td></tr>';
for (l=1;l<7;l++) {
h=h+'<tr><td>&nbsp;</td><td onclick="'+this.Name+'.dateclicked(this);">00</td><td onclick="'+this.Name+'.dateclicked(this);">00</td><td onclick="'+this.Name+'.dateclicked(this);" >00</td><td onclick="'+this.Name+'.dateclicked(this);">00</td><td onclick="'+this.Name+'.dateclicked(this);" >00</td><td onclick="'+this.Name+'.dateclicked(this);">00</td><td onclick="'+this.Name+'.dateclicked(this);">00</td><td></td></tr>'; }
h=h+'</table></td>'; }
h=h+'</tr>'; }
h=h+'</table>';
document.getElementById(this.ParentElement).innerHTML=h;
/* prevent drag selections on calendar */
document.getElementById(this.ParentElement).style.MozUserSelect='none';
document.getElementById(this.ParentElement).style.KhtmlUserSelect='none';
document.getElementById(this.ParentElement).onselectstart=new Function ("return false");}

this.FillCalendars=function()
{ for (var y = 1 ; y < this.CalendarRows+1; y++){
for (var x = 1 ; x < this.CalendarCols+1; x++){
drawpre=0; drawpost=0;
if (x == 1 && y == 1) drawpre=-1;
if (x == this.CalendarCols && y == this.CalendarRows) drawpost=-1;
this.DrawCalendar(this.ParentElement+'_'+x+'_'+y,drawpre,drawpost);
/* auto forward month when showing multiple rows */
if (y < this.CalendarRows || x < this.CalendarCols) {this.MoveMonth(1);}}}}

this.MoveMonth=function(AmountOfMonths) {
this.StartAtMonth=this.StartAtMonth+AmountOfMonths;
while (this.StartAtMonth>12) {this.StartAtMonth=this.StartAtMonth-12; this.StartAtYear=this.StartAtYear+1;}
while (this.StartAtMonth<1) {this.StartAtMonth=12+this.StartAtMonth; this.StartAtYear=this.StartAtYear-1;}
this.StartAtDate=new Date(this.StartAtYear,this.StartAtMonth-1,1);
/* check limits and move to limit if exceeded, but only when showing a one month calendar */
if (this.CalendarCols == 1 && this.CalendarRows == 1) { 
if (this.StartAtDate < new Date(this.MinYear,this.MinMonth-1,1))
{ this.StartAtYear=this.MinYear; this.StartAtMonth=this.MinMonth;
this.StartAtDate=new Date(this.StartAtYear,this.StartAtMonth-1,1);}
if (this.StartAtDate > new Date(this.MaxYear,this.MaxMonth-1,1))
{ this.StartAtYear=this.MaxYear; this.StartAtMonth=this.MaxMonth;
this.StartAtDate=new Date(this.StartAtYear,this.StartAtMonth-1,1);} } }

this.MoveYear=function(AmountOfYears) { this.StartAtYear=this.StartAtYear+parseInt(AmountOfYears); this.MoveMonth(0);}

this.IsDaySelected=function(checkday,checkmonth,checkyear) {
	var splitterchar=this.DateFormat.charAt(1);
	var temp=this.Replace(splitterchar,'',this.DateFormat);
	var mloc=temp.indexOf('m'); var dloc=temp.indexOf('d'); var yloc=temp.indexOf('y');
	for(var i=0; i<this.SelectedDates.length; i++) { 
		var datearray=this.SelectedDates[i].split(splitterchar);
		if (checkyear== parseInt(datearray[yloc]) && checkmonth==parseInt(datearray[mloc]) && checkday==parseInt(datearray[dloc]) ) { 
			return true; 
		}
	}
	return false; 
}

this.DrawCalendar=function(CalendarTableId,DrawPre,DrawPost) {
	/* Show/hide arrows when reaching min/max dates */
	if (DrawPre == -1) {
	if (new Date(this.StartAtYear,this.StartAtMonth-1,1) <= new Date(this.MinYear,this.MinMonth-1,1)) {document.getElementById(this.ParentElement+'_LeftArrow').style.visibility='hidden';}
	else {document.getElementById(this.ParentElement+'_LeftArrow').style.visibility='visible';} }
	if (DrawPost == -1) {
	if (new Date(this.StartAtYear,this.StartAtMonth-1,1) >= new Date(this.MaxYear,this.MaxMonth-1,1)) {document.getElementById(this.ParentElement+'_RightArrow').style.visibility='hidden';}
	else {document.getElementById(this.ParentElement+'_RightArrow').style.visibility='visible';} }
	
	if (this.YearSelector) {
	var c=''; a=this.StartAtYear-5; b=this.StartAtYear+5;
	if (a < this.MinYear) {a=this.MinYear;} if (b > this.MaxYear) {b=this.MaxYear;}
	for (var x = a ; x <= b; x++){
	if (x==this.StartAtYear) {c=c+'<option selected value="0">'+x+'</option>'; } else 
	{c=c+'<option value="'+(x-this.StartAtYear)+'">'+x+'</option>'; }}
	document.getElementById(CalendarTableId+'_month').innerHTML=this.MonthNamesList[this.StartAtMonth]+" <select size='1' class='CalendarYearSelector' onChange='"+this.Name+".MoveYear(this.options[this.selectedIndex].value);"+this.Name+".FillCalendars();'>"+c+"</select>";
	} else { document.getElementById(CalendarTableId+'_month').innerHTML=this.MonthNamesList[this.StartAtMonth]+" " +this.StartAtYear;}
	
	var PreviousYear=this.StartAtYear; var PreviousMonth=this.StartAtMonth-1;
	if (PreviousMonth==0) {PreviousMonth=12;PreviousYear=PreviousYear-1;}
	var NextYear=this.StartAtYear; var NextMonth=this.StartAtMonth+1;
	if (NextMonth==13) {NextMonth=1;NextYear=NextYear+1;}
	var rownbr=2; var cellnbr=1;
	
	/* fill first cells with days of the previous month */
	var offset = this.StartAtDate.getDay(); if (offset == 0) offset = 7;
	var fromday=this.DaysInMonth(PreviousMonth,PreviousYear)-offset+2;
	var tillday=this.DaysInMonth(PreviousMonth,PreviousYear)+1;
	if (fromday==tillday) {fromday=fromday-7;}
	for (var curr_day = fromday ; curr_day < tillday; curr_day++)
	{ d=document.getElementById(CalendarTableId).rows[rownbr];
	if (cellnbr==1) { if (this.ShowWeeks == true){ d.cells[0].innerHTML=this.GetISOWeek(PreviousYear,PreviousMonth,curr_day);
	d.cells[0].className="CalendarWeekHeading";}
	else { d.cells[0].innerHTML="00";
	d.cells[0].className="CalendarNoWeekHeading";} }
	if (new Date(PreviousYear,PreviousMonth-1,curr_day) < new Date(this.MinYear,this.MinMonth-1,this.MinDay) || new Date(PreviousYear,PreviousMonth-1,curr_day) > new Date(this.MaxYear,this.MaxMonth-1,this.MaxDay)) 
	{d.cells[cellnbr].innerHTML='&nbsp;'; d.cells[cellnbr].className=''; }
	else { if (DrawPre==-1) {
	d.cells[cellnbr].innerHTML=curr_day;
	d.cells[cellnbr].title=this.DateConvert(curr_day,PreviousMonth,PreviousYear);
	if (this.IsDaySelected(curr_day,PreviousMonth,PreviousYear)==true)
	{ d.cells[cellnbr].className="CalendarOtherMonthDaySelected";
	this.PreviousObjectClicked=d.cells[cellnbr]; }
	else { d.cells[cellnbr].className="CalendarOtherMonthDay"; }}
	else {d.cells[cellnbr].innerHTML='&nbsp;'; d.cells[cellnbr].className='';}}
	cellnbr = cellnbr +1; if (cellnbr == 8) {if (DrawPre==-1) {rownbr=rownbr+1; cellnbr=1;} else {cellnbr=1;} } }
	
	
	
	
	
	
	
	/* make calendar */
	for (var curr_day = 1; curr_day < this.DaysInMonth(this.StartAtMonth,this.StartAtYear)+1; curr_day++) { 
		d=document.getElementById(CalendarTableId).rows[rownbr];
		if (cellnbr==1) { 
			if (this.ShowWeeks == true) {
				d.cells[0].innerHTML=this.GetISOWeek(this.StartAtYear,this.StartAtMonth,curr_day);
				d.cells[0].className="CalendarWeekHeading";
				if(this.DayHeight)
					d.cells[0].style.height=this.DayHeight;
				
			} else { 
				d.cells[0].innerHTML="00";
				d.cells[0].className="CalendarNoWeekHeading"; 
			} 
		}
		
		
		if (this.IsDaySelected(curr_day,this.StartAtMonth,this.StartAtYear)==true && this.DateEntries.length) {
			
			// look for matches in DateEntries

			var str = curr_day;
			
			for(var i=0; i<this.DateEntries.length; i++) {
				var entry_str = this.DateEntries[i].split(",");
				var entry_month = entry_str[0].split("/");
				if((curr_day+'/'+this.StartAtMonth+'/'+this.StartAtYear==entry_str[0]) && this.IsDaySelected(entry_month[0],entry_month[1],entry_month[2])==true) {
					str += '<div class="CalendarDayText">';
					if(entry_str.length==3) {
						str += '<a href="'+entry_str[2]+'">';
					}
					str += entry_str[1];
					if(entry_str.length==3) {
						str += '</a>';
					}					
					str += '</div>';
				}
			}
			
			d.cells[cellnbr].innerHTML = str;
			d.cells[cellnbr].style.width='14%';
		} else {
			d.cells[cellnbr].innerHTML=curr_day;
		}
		
		
		
		
		
		
		
		
		d.cells[cellnbr].title=this.DateConvert(curr_day,this.StartAtMonth,this.StartAtYear);
		
		if (new Date(this.StartAtYear,this.StartAtMonth-1,curr_day) < new Date(this.MinYear,this.MinMonth-1,this.MinDay) || new Date(this.StartAtYear,this.StartAtMonth-1,curr_day) > new Date(this.MaxYear,this.MaxMonth-1,this.MaxDay)) {
			d.cells[cellnbr].innerHTML='&nbsp;'; d.cells[cellnbr].className='';
		} else { 
			if (this.StartAtYear== this.TodayYear && this.StartAtMonth==this.TodayMonth && curr_day==this.TodayDay)	{ 
				d=document.getElementById(CalendarTableId).rows[rownbr];
				if (this.IsDaySelected(curr_day,this.StartAtMonth,this.StartAtYear)==true) {
					d.cells[cellnbr].className="CalendarTodaySelected";
					this.PreviousObjectClicked=d.cells[cellnbr];
				} else {
				d.cells[cellnbr].className="CalendarToday";
				} 
			} else { 
				if (this.IsDaySelected(curr_day,this.StartAtMonth,this.StartAtYear)==true) {
					d.cells[cellnbr].className="CalendarDaySelected";
					
					if(this.CalendarType=='default') {
						d.cells[cellnbr].style.cursor = 'pointer';
					}
					
					this.PreviousObjectClicked=d.cells[cellnbr];
				} else {
					d.cells[cellnbr].className="CalendarNormalDay";
				} 
			}
			if (this.Holidays == 'Belgium' && (cellnbr == 6 || cellnbr == 7)) { 
				d.cells[cellnbr].className=d.cells[cellnbr].className+'Holiday';
			}
		}
		cellnbr=cellnbr+1; if (cellnbr == 8) {
			rownbr=rownbr+1; cellnbr=1;
		}
	}
	
	
	
	/* fill the rest of the cells with days of next month */
	for (var curr_day = 1; curr_day < this.DaysInMonth(this.StartAtMonth,this.StartAtYear)+1; curr_day++)
	{d=document.getElementById(CalendarTableId).rows[rownbr];
	if (rownbr==8) { break;}
	if (cellnbr==1) { if (DrawPost==0 || this.ShowWeeks == false)
	{d.cells[0].innerHTML='00';
	d.cells[0].className="CalendarNoWeekHeading";}
	else {d.cells[0].innerHTML=this.GetISOWeek(NextYear,NextMonth,curr_day);
	d.cells[0].className="CalendarWeekHeading";}}
	if (new Date(NextYear,NextMonth-1,curr_day) < new Date(this.MinYear,this.MinMonth-1,this.MinDay) || new Date(NextYear,NextMonth-1,curr_day) > new Date(this.MaxYear,this.MaxMonth-1,this.MaxDay)) 
	{d.cells[cellnbr].innerHTML='&nbsp;'; d.cells[cellnbr].className='';}
	else { if (DrawPost==0) { d.cells[cellnbr].innerHTML='&nbsp;'; d.cells[cellnbr].className=''; }
	else { d.cells[cellnbr].innerHTML=curr_day;
	d.cells[cellnbr].title=this.DateConvert(curr_day,NextMonth,NextYear);
	if (this.IsDaySelected(curr_day,NextMonth,NextYear)==true)
	{ d.cells[cellnbr].className="CalendarOtherMonthDaySelected";
	this.PreviousObjectClicked=d.cells[cellnbr]; }
	else { d.cells[cellnbr].className="CalendarOtherMonthDay"; } } }
	cellnbr=cellnbr+1; if (cellnbr == 8) {rownbr=rownbr+1; cellnbr=1;}  } 

}


this.GetISOWeek=function(MyYear,MyMonth,MyDay)
/* this function follows the ISO 8601 standard */
{ var DOb = new Date(MyYear,MyMonth-1,MyDay);
if (isNaN(DOb)) return false;
var D = DOb.getDay() ; if (D==0) D=7; // D = ISO DoW
DOb.setDate(DOb.getDate() + (4-D));   // To nearest Thu, mid-week
var YN = DOb.getFullYear();           // YN = ISO W-N Year
var ZBDoCY = Math.floor( (DOb.getTime() - new Date(YN, 0, 1, -6)) / 864e5 );
// uses Jan 1 of YN; -6h allows for Summer Time
var WN = 1 + Math.floor(ZBDoCY/7);
if (WN <= 9) WN = "0" + WN; 
return WN; }

this.DaysInMonth=function(month,year)
{ var daysinmonth = new Array(-1,31,28,31,30,31,30,31,31,30,31,30,31);
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) daysinmonth[2] = 29;
return daysinmonth[month]; }

this.dateclicked=function(obj) {
	if(this.disabled)return;
	
	if(this.CalendarType=='large')return;
	
	switch(obj.className) {
		case 'CalendarOtherMonthDaySelected':
		case 'CalendarTodaySelected':
		case 'CalendarTodaySelectedHoliday':
		case 'CalendarDaySelected':
		case 'CalendarDaySelectedHoliday':
			
			document.location.href='datelist'+this.DateListId+'.cfm?date='+obj.title;
			
		break; 
	} 
}

this.DateConvert=function(d,m,y) {
	var temp=this.DateFormat;
	temp=this.Replace('d',d,temp); temp=this.Replace('m',m,temp); temp=this.Replace('y',y,temp);
	return(temp); 
}

this.Replace=function(needle,str,haystack) {
while(haystack.indexOf(needle)!=-1) { haystack = haystack.replace(needle, str); }
return haystack; }

}