/////////////////////////////////////////////////////////////////////
//
//	CALENDAR CLASS
//

function calendar(){
	this.selDate = ""; 
	this.dispMonth = new Date();
	this.dispMonth.setDate(1);
	this.targetDiv = "";
	this.dates = Array();
	this.disabledDays = Array();
	this.disabledMonths = Array();
	this.disabledYears = Array();
	this.getPrevDates = getPrevDates; //the few days from previous month that will appear at start of celendar
	this.getNextDates = getNextDates;
	this.getMainDates = getMainDates;
	this.getAllDates = getAllDates;
	this.buildCell = buildCell;
	this.writeHTML = writeHTML;
}
function getAllDates(){
	this.prevDates = this.getPrevDates();
	this.mainDates = this.getMainDates(); 
	this.nextDates = this.getNextDates();
	return (this.prevDates.concat(this.mainDates.concat(this.nextDates)));
}
function getMainDates(){
	var dates = Array();	
	this.monthLength = getMonthLength(this.dispMonth);
	for(i=1;i<=this.monthLength;i++){
		var aDate = new Date(this.dispMonth.getFullYear(), this.dispMonth.getMonth(), i);
		dates.push(aDate);
	}
	return(dates);
}
function getPrevDates(){
	var yr = this.dispMonth.getFullYear();
	if(this.dispMonth.getMonth()==0)
		yr = this.dispMonth.getFullYear()-1;
	this.prevMonth = new Date(this.dispMonth.getFullYear(), this.dispMonth.getMonth()-1, 1);
	this.prevMonth.length = getMonthLength(this.prevMonth);
	this.dispMonth.firstDay = getFirstDay(this.dispMonth);
	var dates = Array();
	for(i=(this.prevMonth.length-(this.dispMonth.firstDay-1));i<=this.prevMonth.length;i++){
		var aDate = new Date(yr, this.prevMonth.getMonth(), i);
		dates.push(aDate);
	}
	return(dates);
}
function getNextDates(){
	var yr = this.dispMonth.getFullYear();
/*	if(this.dispMonth.getMonth()==0)
		var yr = this.dispMonth.getFullYear()+1;*/
	this.nextMonth = new Date(this.dispMonth.getFullYear(), (this.dispMonth.getMonth()+1), 1);
	this.dispMonth.lastDay = getLastDay(this.dispMonth);
	var dates = Array();
	for(i=1;i<=(6-this.dispMonth.lastDay);i++){
		var aDate = new Date(this.dispMonth.getFullYear(), (this.dispMonth.getMonth()+1), i);
		dates.push(aDate);
	}
	return(dates);
}
function buildCell(tdClasses, tdContents, aTag, aHref, aTitle){
	var classes = ""
	for(var j=0;j<tdClasses.length;j++){
		if(j>0)
			classes+=" ";
		classes+=tdClasses[j];	
	}
	if(aTag){
		var contents = document.createElement('a')
		contents.setAttribute('href', aHref);
		contents.setAttribute('title', aTitle);
		contents.appendChild(document.createTextNode(tdContents)); 
	}
	else
		var contents = document.createTextNode(tdContents);
	
	cell = document.createElement('td');
	cell.setAttribute((document.all ? 'className' : 'class'), classes);
	if(aTag){
		cell.setAttribute('onMouseOver', "hover(this)");
		cell.setAttribute('onMouseOut', "unhover(this)");
	}
	cell.appendChild(contents);
	return (cell);
}
function writeHTML(){	
	this.allDates = this.getAllDates();
	
	var headerPrevMonth = document.createElement('a');
	var mnth = this.prevMonth.getMonth();
	headerPrevMonth.setAttribute('href', "javascript:changeDispMonth("+this.targetDiv+", new Date("+this.prevMonth.getFullYear()+","+mnth+",1))");	
	headerPrevMonth.setAttribute('title', monthsShort[this.prevMonth.getMonth()]);
	headerPrevMonth.appendChild(document.createTextNode(monthsShort[this.prevMonth.getMonth()]));
	
	var headerNextMonth = document.createElement('a');
	mnth = this.nextMonth.getMonth();
	headerNextMonth.setAttribute('href', "javascript:changeDispMonth("+this.targetDiv+", new Date("+this.nextMonth.getFullYear()+","+mnth+",1))");	
	headerNextMonth.setAttribute('title', monthsShort[this.nextMonth.getMonth()]);
	headerNextMonth.appendChild(document.createTextNode(monthsShort[this.nextMonth.getMonth()]));	

	var headerTh = document.createElement('th'); 
	headerTh.setAttribute('colSpan', '7');		
	
	headerTh.appendChild(headerPrevMonth);
	headerTh.appendChild(document.createTextNode(monthsFull[this.dispMonth.getMonth()]+" "+this.dispMonth.getFullYear()));
	headerTh.appendChild(headerNextMonth);
	
	var headerTr = document.createElement('tr');
	headerTr.setAttribute((document.all ? 'className' : 'class'), 'header');	
	headerTr.appendChild(headerTh);
	
	var sunTd = document.createElement('td');
	sunTd.setAttribute((document.all ? 'className' : 'class'), 'sun');
	sunTd.appendChild(document.createTextNode("Sun"));
	
	var monTd = document.createElement('td');
	monTd.setAttribute((document.all ? 'className' : 'class'), 'mon');
	monTd.appendChild(document.createTextNode("Mon"));
	
	var tueTd = document.createElement('td');
	tueTd.setAttribute((document.all ? 'className' : 'class'), 'tue');
	tueTd.appendChild(document.createTextNode("Tue"));
	
	var wedTd = document.createElement('td');
	wedTd.setAttribute((document.all ? 'className' : 'class'), 'wed');
	wedTd.appendChild(document.createTextNode("Wed"));

	var thuTd = document.createElement('td');
	thuTd.setAttribute((document.all ? 'className' : 'class'), 'thu');
	thuTd.appendChild(document.createTextNode("Thu"));

	var friTd = document.createElement('td');
	friTd.setAttribute((document.all ? 'className' : 'class'), 'fri');
	friTd.appendChild(document.createTextNode("Fri"));
	
	var satTd = document.createElement('td');
	satTd.setAttribute((document.all ? 'className' : 'class'), 'sat');
	satTd.appendChild(document.createTextNode("Sat"));
	
	var daysTr = document.createElement('tr');
	daysTr.setAttribute((document.all ? 'className' : 'class'), 'days');
	
	daysTr.appendChild(sunTd);
	daysTr.appendChild(monTd);
	daysTr.appendChild(tueTd);
	daysTr.appendChild(wedTd);
	daysTr.appendChild(thuTd);
	daysTr.appendChild(friTd);
	daysTr.appendChild(satTd);
	
	
	var tbody = document.createElement('tbody');
	tbody.appendChild(headerTr);
	tbody.appendChild(daysTr);

	for(i=0;i<this.allDates.length;i++){	
		if(this.allDates[i].getDay()==0){			
			var datesTr = document.createElement('tr');
			datesTr.setAttribute((document.all ? 'className' : 'class'), 'dates');			
		}	
		
		//output += "<td style='border: solid thin black'>"+this.allDates[i].getDay()+" "+this.allDates[i].getDate()+"/"+this.allDates[i].getMonth()+"/"+this.allDates[i].getFullYear()+"</td>\n";
		var state = "available";
		var aTag = true;
		var tdClasses = Array();
		var aTitle = this.allDates[i].getFullYear()+"/"+this.allDates[i].getMonth()+"/"+this.allDates[i].getDate();
		var tdContents = this.allDates[i].getDate();
		if(this.allDates[i].getMonth()==this.dispMonth.getMonth())
			tdClasses.push("currMonth");
		else
			tdClasses.push("notCurrMonth");
		if(compareDates(this.allDates[i], this.selDate))
			tdClasses.push("selectedDate");		
		if(isInArray(this.allDates[i], this.bookedDates)){
			tdClasses.push("booked");
			state = "booked";	
			aTag = this.bookedATag;
		}
		if(this.disabledDays[this.allDates[i].getDay()]){
			tdClasses.push("disabled");
			state = "disabled";
			aTag = this.disabledATag;
		}
		if(this.disabledMonths[this.allDates[i].getMonth()]){
			tdClasses.push("disabled");
			state = "disabled";
			aTag = this.disabledATag;
		}
		if(isInArray(this.allDates[i].getFullYear(), this.disabledYears)){
			tdClasses.push("disabled");
			state = "disabled";
			aTag = this.disabledATag;
		}		
		if(isInArray(this.allDates[i], this.disabledDates)){
			tdClasses.push("disabled");
			state = "disabled";
			aTag = this.disabledATag;
		}		

		var aHref = "javascript:selectDate("+this.targetDiv+", new Date("+this.allDates[i].getFullYear()+", "+this.allDates[i].getMonth()+", "+this.allDates[i].getDate()+"),'"+state+"')";
		
		cell = this.buildCell(tdClasses, tdContents, aTag, aHref, aTitle);
		
		datesTr.appendChild(cell);
		tbody.appendChild(datesTr);
	}
	var table = document.createElement('table');
	table.setAttribute((document.all ? 'className' : 'class'), 'calendar');	
	table.appendChild(tbody);
	//if(document.getElementById(this.targetDiv).childNodes.length>0)
		//document.getElementById(this.targetDiv).removeChild(document.getElementById(this.targetDiv).childNodes[1]);
	document.getElementById(this.targetDiv).innerHTML ="";
	document.getElementById(this.targetDiv).appendChild(table);
	return(table);
}




/////////////////////////////////////////////////////////////////////
//
//	VARIOUS FUNCTIONS
//
var monthsFull = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
var monthsShort = Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
function selectDate(cal, newDate, state){
	//alert(cal.targetDiv+"="+newDate.getFullYear()+"/"+newDate.getMonth()+"/"+newDate.getDate());
	if(state=="available")
		selAvailableDate(cal,newDate)
	if(state=="disabled")
		selDisabledDate(cal, newDate);
	if(state=="booked")
		selBookedDate(cal,newDate)
	changeSelDate(cal, newDate);
}
function changeDispMonth(cal, newMonth){
	cal.dispMonth.setYear(newMonth.getFullYear());
	cal.dispMonth.setMonth(newMonth.getMonth()), 
	cal.HTML = cal.writeHTML();
}
function compareDates(date1, date2){	
	if(date1!="" && date2!=""){
		if(date1.getDate()==date2.getDate() && date1.getMonth()==date2.getMonth() && date1.getFullYear()==date2.getFullYear())
			return(true);
		else
			return(false);	
	}
	else	
		return(false);
}
function changeSelDate(cal, newMonth){
	cal.selDate = new Date(newMonth.getFullYear(), newMonth.getMonth(), newMonth.getDate());
	cal.dispMonth.setYear(newMonth.getFullYear());
	cal.dispMonth.setMonth(newMonth.getMonth()), 
	cal.HTML = cal.writeHTML();
}
function getFirstDay(aDate){
	var dd = new Date(aDate.getFullYear(), aDate.getMonth(), 1);
	return(dd.getDay());
}
function getLastDay(aDate){
	this.monthLength = getMonthLength(aDate);
	var dd = new Date(aDate.getFullYear(), aDate.getMonth(), this.monthLength);
	return(dd.getDay());
}
function getMonthLength(aDate) {	
	var dd = new Date(aDate.getFullYear(), aDate.getMonth()+1, 0);
	return(dd.getDate());
} 
function createCalendar(div){
	//eval(div+".selDate= new Date(2007, 01, 02)");
	eval(div+".targetDiv='"+div+"'");
	eval(div+".HTML = "+div+".writeHTML()");
	eval("document.getElementById("+div+".targetDiv).appendChild("+div+".HTML)");
}
function isInArray(obj, arr){
	var found = false;
	for(var i=0;i<arr.length;i++){
		if(obj.toString()==arr[i].toString())
			found = true;
	}
	return(found);
}
function hover(bt){
	bt.originalClass = bt.className;
	bt.className = "hover";
}
function unhover(bt){
	bt.className = bt.originalClass;
}