var calendar_control=null;
var calendar_control_date=null;
var calendar_today_date=null;
var calendar_boundary_date=null;
var calendar_unavailable_dates=new Array();
var calendar_unavailable_start_date=null;
var calendar_unavailable_end_date=null;

function isDateUnavailable(x) {

	if (calendar_unavailable_start_date!=null && calendar_unavailable_end_date!=null) {
	
		if (
			dateCompare(x,calendar_unavailable_start_date)==-1 
			|| 
			dateCompare(x,calendar_unavailable_end_date)==1	
			)
			return true;
	
	}

	for (var i=0;i<calendar_unavailable_dates.length;i++) {
		y=calendar_unavailable_dates[i];
		if (dateCompare(x,y)==0) {
			return true;
			break;
		};
	};
	
	return false;
};

function dateCompare(x,y) {

	if (x.getMonth()==y.getMonth() && x.getFullYear()==y.getFullYear() && x.getDate()==y.getDate()) {
		return 0;
	} else {
	
		var xUTC=Date.UTC(x.getFullYear(),x.getMonth(),x.getDate());
		var yUTC=Date.UTC(y.getFullYear(),y.getMonth(),y.getDate());
		
		if (xUTC>yUTC) {
			return 1;
		} else {
			return -1;
		}
	}

}

function getMonthName(x) {
	switch (x) {
		case 0: return "January";
		case 1: return "February";
		case 2: return "March";
		case 3: return "April";
		case 4: return "May";
		case 5: return "June";
		case 6: return "July";
		case 7: return "August";
		case 8: return "September";
		case 9: return "October";
		case 10: return "November";
		case 11: return "December";
	};
};

function disableCalendar() {
	hideCalendar();
};

function startCalendar() {

	initStartForm();

	tryToPopulateStartInfo();
}

function initStartForm() {

//alert("In initStartForm");

	if (package_start_date!='' && package_end_date!='') {
	
		calendar_unavailable_start_date=makeDate(package_start_date,true);
		
//		var today_date=new Date();
//alert("Calling addDays from initStartForm");
		var today_date=addDays(new Date(),7);
//alert("today_date = " + today_date);		
		
		if (calendar_unavailable_start_date<today_date) 
			calendar_unavailable_start_date=today_date;
		
		calendar_unavailable_end_date=makeDate(package_end_date,true);
		
		calendar_boundary_date=calendar_unavailable_start_date;
		calendar_control_date=calendar_unavailable_start_date;
		calendar_today_date=calendar_unavailable_start_date;

		_F("check_in_date").value=formatDate(calendar_unavailable_start_date);

	}

	if (package_minimum_nights!='') {
		var x=_F("NumberOfNights");
		
		if (x) {		
		
			var remove=new Array();
		
			for (var i=0;i<x.options.length;i++) {			
				var t=x.options[i].text;
				if (t!='-') {			
					if (parseInt(package_minimum_nights)>parseInt(t)) {						
						remove.push(x.options[i]);						
					}
				}
			}
			
			for (var i=0;i<remove.length;i++) {
				x.removeChild(remove[i]);
			}
			
			if (x.options.length>1) 
				x.selectedIndex=1;
		}
	}
}

function initCalendar() {
//alert("In initCalendar");
//alert("In initCalendar, new Date = " + new Date());
	calendar_boundary_date=addDays(new Date(),7);
//alert("In initCalendar, calendar_boundary_date = " + calendar_boundary_date);
	//calendar_boundary_date=addDays(makeDate("9/24/2006",true),7);

	calendar_control_date=calendar_boundary_date;

//alert(calendar_boundary_date);

//alert("In initCalendar, calendar_control_date = " + calendar_control_date);
	calendar_today_date=calendar_boundary_date;
	//_F("check_in_date").value=formatDate(calendar_control_date);

};

function createCalendar() {
	//document.onclick=disableCalendar;
	calendar_control="z";
	var x=_F("calendar");
	if (x) {
		
		var left_coor=null;

		if (window.innerWidth) 
			left_coor=window.innerWidth;
		else 
			left_coor=document.body.clientWidth;
		
		left_coor=left_coor/2 - 340;
		
		x.style.left=left_coor;
		
		var table=x.appendChild(_C("TABLE"));
		table.cellPadding=1;
		table.cellSpacing=0;
		var tbody=table.appendChild(_C("TBODY"));
		var tr=tbody.appendChild(_C("TR"));
		var x;

		tr.className="close_calendar_row";
		td=tr.appendChild(_C("TD"));
		td.style.textAlign="right";
		td.colSpan=7;
		x=td.appendChild(_C("A"));
		x.href="#";
		x.id="close_calendar";
		x.appendChild(_T("close"));
		x.onclick=disableCalendar;

		tr=tbody.appendChild(_C("TR"));
		tr.className="month_row";
		td=tr.appendChild(_C("TD"));
		x=td.appendChild(_C("A"));
		x.href="#";
		x.id="left_month";
		x.appendChild(_T("<"));
		x.onclick=processChangeMonth;
		
		td=tr.appendChild(_C("TD"));
		td.colSpan=5;
		td.id="month_name";
		td.className="month_name";
		td=tr.appendChild(_C("TD"));
		
		td.style.textAlign="right";
		x=td.appendChild(_C("A"));
		x.href="#";
		x.id="right_month";
		x.appendChild(_T(">"));
		x.onclick=processChangeMonth;
				
		tr=tbody.appendChild(_C("TR"));
		tr.className="week_days";
		for (var i=0;i<7;i++) {
			td=tr.appendChild(_C("TD"));
			switch (i) {
				case 0: x="S";break;
				case 1: x="M";break;
				case 2: x="T";break;
				case 3: x="W";break;
				case 4: x="T";break;
				case 5: x="F";break;
				case 6: x="S";break;
			};
			td.appendChild(_T(x));
		};		
		for (var j=0;j<6;j++) {
			tr=tbody.appendChild(_C("TR"));	
			tr.className="days";
			for (var i=0;i<7;i++) {			
				td=tr.appendChild(_C("TD"));
				if (i==0 || i==6) {
					td.className="weekend";
				};
			};
		};		
		fillCalendar();
	};
};

function isLeapYear(x) {
//alert("In isLeapYear, x = " + x);
  return new Date(x,1,29).getDate()==29;
}

function addDays(x,y) {
//alert("In addDays, x= " + x + "  y = " + y);
	var year=x.getFullYear();
//alert("In addDays, set year = " + year);
	var month=x.getMonth();
//alert("In addDays, set month = " + month);
	var day=x.getDate();
//alert("In addDays, set day = " + day);
	day=day + y;
//alert("in addDays, added to day, now = " + day);

	var max=getMonthMaxDay(month);
//alert("In addDays, back from getMonthMaxDay, max = " + max);
	if (day>max) {
		month=month + 1;
		day=day - max;
		if (month==12) {
			year=year + 1;
			month=0;
		}
	};			

	return new Date(year, month, day);
};

function getMonthMaxDay(x) {

	var d=new Date();

	if(calendar_control_date!=null) {

		d=calendar_control_date;		

	}


	switch (x) {
		case 0: return 31;
		case 1: 
		return ((isLeapYear(d.getFullYear())) ? 29 : 28);
		//return ((isLeapYear(d.getFullYear())) ? 29 : 28);		
		
		case 2: return 31;
		case 3: return 30;
		case 4: return 31;
		case 5: return 30;
		case 6: return 31;
		case 7: return 31;
		case 8: return 30;
		case 9: return 31;
		case 10: return 30;
		case 11: return 31;
	};
};

function changeMonth(z) {
	x=z.getAttribute("date");	
	if (x) {
		var a=x.split("/");
		var d=new Date(a[2],a[0],a[1]);
		if (d<calendar_boundary_date) return;
		calendar_control_date=d;
		fillCalendar();
	};
};

function changeCalendar(e) {	

	var dis=this.getAttribute("dis");		
	if (dis=="1") {
		if (!e) {
			var e = window.event
		};
		e.cancelBubble = true;
		if (e.stopPropagation) e.stopPropagation();
		return false;
	};
	
	x=this.getAttribute("date");		
	var a=x.split("/");
	var d=new Date(a[2],parseInt(a[0]) - 1,a[1]);

	if (x) {
		calendar_control_date=d;
		fillCalendar();
	};
	
	_F("check_in_date").value=(d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear();

	hideCalendar();
	return false;
};

function showSelect(b) {
	var els=document.getElementsByTagName("SELECT");
	for (var i=0;i<els.length;i++) {
		els[i].style.visibility= (b) ? "visible" : "hidden";
	};
};

function disableLink(x) {
	x.setAttribute("dis","1");
	x.style.textDecoration="none";
	x.style.fontWeight="normal";
	x.style.color="#000000";
	x.style.cursor="default";
};

function enableLink(x) {	
	x.style.cursor="hand";
	x.style.textDecoration="underline";
	x.setAttribute("dis","0");
};

function makeDate(x,b) {
	var a=x.split("/");

	//a[2]=trim(a[2],"0");
	a[2]=parseInt(trimStart(a[2],"0"));

	a[2]=parseInt(a[2]);

	a[2]=(a[2] < 100) ? (2000 + a[2]) : a[2];
	
	return new Date(a[2],(b) ? (a[0]-1) : a[0],a[1]);
};

function formatDate(x) {
	return (x.getMonth() + 1) + "/" + x.getDate() + "/" + x.getFullYear();
};

function isValidYear(x) {
	if (IsInteger(x)) {

		var y=parseInt(x);
		
		return true;
		
	}
	return false;
}

function validateDate(x) {
//alert("In validateDate");
	var a=x.split("/");
	if (a.length!=3) {
		return false;
	};
	
	if (a[0]>12) return false;
	if (a[1]>getMonthMaxDay(a[0]-1)) return false;

	window.status=isPositiveNumber(a[2]);

	if (!isValidYear(a[2])) return false;
	
	return true;
};

function fillCalendar() {
//alert("In fillCalendar");
	var firstDaysRow = 3;
	var x=_F("calendar");
	if (x) {
		var year=calendar_control_date.getFullYear();
		var month=calendar_control_date.getMonth();
		var d=new Date(year,month,1);
		
		_F("month_name").innerHTML=getMonthName(calendar_control_date.getMonth()) + " " + calendar_control_date.getFullYear(); 
		
		var year1=year;
		var month1=month - 1;
		if (month1<0) {
			month1=11;
			year1=year1-1;
		};
		
		var year2=year;
		var month2=month + 1;
		if (month2>11) {
			month2=0;
			year2=year2+1;
		};
		
		var d1=new Date(year1,month1,1);
		var n=d.getDay(); 
		var max=getMonthMaxDay(month);
		var max1=getMonthMaxDay(month1);
		var max2=getMonthMaxDay(month2);
		
		var k=calendar_control_date.getDate();

		if (k>max1) k=1;

		_F("left_month").setAttribute("date",month1 + "/" + k + "/" + year1);

		if (k>max2) k=1;
		_F("right_month").setAttribute("date",month2 + "/" + k + "/" + year2);
		
		var max1=getMonthMaxDay(month1)
		var els=x.getElementsByTagName("TR");
		var index=-1;
		var index1=1;
		for (var i=firstDaysRow;i<els.length;i++) {
			var tr=els[i];
			for (var j=0;j<7;j++) {
				var td=tr.childNodes[j];
				if (i==firstDaysRow) {
					if (j==n) {
						index=1;
					};
				};
				var cd;
				var t;
				var a=_C("A");
				a.href="#";
				a.onclick=changeCalendar;
				if (index>0 && index<=max) {
					t=index
					if (
						calendar_today_date.getDate() == index && 
						calendar_control_date.getMonth()==calendar_today_date.getMonth() &&
						calendar_control_date.getFullYear()==calendar_today_date.getFullYear()
						) {
						a.className="today";
					} else {
						a.className="active";
					};
					cd=makeDate((month) + "/" + index + "/" + year);					
					index++;
				} else {
					if (i==firstDaysRow) {
						// t=max1 - n + j;
						// this needs to add one because the day of the week is zero based
						t=max1 - n + j + 1;
						cd=makeDate((month1) + "/" + t + "/" + year1);					
					} else {
						t=index1;
						cd=makeDate((month2) + "/" + index1 + "/" + year2);					
						index1++;
					};
					a.className="not_active";
				};					
				if (cd<calendar_boundary_date || isDateUnavailable(cd)) {
					disableLink(a);
				} else {
					enableLink(a);
				};
				
				a.setAttribute("date",formatDate(cd));					
				a.appendChild(_T(t));
				if (td.hasChildNodes()) 
					td.replaceChild(a,td.childNodes[0]);			
				else
					td.appendChild(a);			
			};
		};		
	};
};

function processChangeMonth(e) {
	if (!e) {
		var e = window.event
	};
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
	changeMonth(((e.target) ? e.target : e.srcElement));
	return false;
};

function processShowCalendar(e) {
//alert("In processShowCalendar");

	if (!e) {
		var e = window.event
	};
	
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
	showCalendar();
};

function showCalendar() {
//alert("In showCalendar");
	var x=_F("calendar");
	if (x) {
		showSelect(false);
		if (calendar_control==null) {
			createCalendar();
		} else {
			if (makeDate(_F("check_in_date").value)!=calendar_control_date) {
				var a=new Array();
				
				if (validateDate(_F("check_in_date").value)) {
					a=_F("check_in_date").value.split("/");
					
					a[2]=parseInt(a[2]);
					
					a[2]=(parseInt(a[2]) < 100) ? (2000 + a[2]) : a[2];
					
				} else {
					a.push(calendar_boundary_date.getMonth() + 1);
					a.push(calendar_boundary_date.getDate());
					a.push(calendar_boundary_date.getFullYear());
				};				
				

				calendar_control_date=new Date(a[2],parseInt(a[0]) - 1,a[1]);		
				
				fillCalendar()
			};
		};				

		x.style.display="block";

	};	
	//window.event.cancel
	return false;
};
function hideCalendar() {
	var x=_F("calendar");
	if (x) x.style.display="none";
	showSelect(true);
};
