

function calendarReservation(){
	this.arrayWeekDays  = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
	this.arrayWeekDaysShort = new Array('S','M','T','W','T','F','S');
	this.arrayMonths = new Array('January', 'February', 'March', 'April', 'May', 'June','July', 'August', 'September', 'October', 'November', 'December');


	// Make sure to load the ElementFunction class before the calendar
	this.elemClass = new ElementFunctions();
	this.setSelectBoxes = false;
	this.loaded = false;
}

calendarReservation.prototype.getDaysInMonth = function(){
	var days=28;
	var month= this.calendarType.indexOf("arrival") != -1 ? parseFloat(this.arrivalMonth):parseFloat(this.departureMonth);
	var year = this.calendarType.indexOf("arrival") != -1 ? parseFloat(this.arrivalYear): parseFloat(this.departureYear);

	if (month==1||month==3||month==5||month==7||month==8||month==10||month==12) {
 		days=31;
	} else if (month==4 || month==6 || month==9 || month==11) {
 		days=30;
	} else if (month==2 && ( (year%4)==0 && (year%100)!=0 || (year%400)==0 )) {
 		days=29;
	}
	return (days);
}

calendarReservation.prototype.hideCalendar = function(){
	this.elemClass.setVisibility("calendarHeadingArrival",0);
	this.elemClass.setVisibility("calendarHeadingDeparture",0);
	this.elemClass.setVisibility("calendarNavText",0);
	this.elemClass.setVisibility("calendarNavLeft",0);
	this.elemClass.setVisibility("calendarNavRight",0);
	this.elemClass.setVisibility("calendarClose",0);
	
	for (i=0 ; this.arrayWeekDaysShort.length > i; i++){
		this.elemClass.setVisibility("calendarWDay" + i,0);
	}
	
	for (i=1 ; 32 > i; i++){
		this.elemClass.setVisibility("calendarDay" + i,0);
	}
}

calendarReservation.prototype.reDraw = function(adjustment){

		if (this.calendarType.indexOf("arrival") != -1){
			var value = parseFloat(this.arrivalMonth);
			value += adjustment;
			
			if (value > 12){
				value = "01";
				var year = parseFloat(this.arrivalYear);
				year++;
				this.arrivalYear = year.toString();
			}else if (value < 1){
				value = "12";
				var year = parseFloat(this.arrivalYear);
				year--;
				this.arrivalYear = year.toString();
			}else if (value <10){
				value = "0" + value.toString();;
			}

			this.arrivalMonth = value.toString();
		}else{
			var value = parseFloat(this.departureMonth);
			value += adjustment;
			
			if (value > 12){
				value = "01";
				var year = parseFloat(this.departureYear);
				year++;
				this.departureYear = year.toString();
			}else if (value < 1){
				value = "12";
				var year = parseFloat(this.arrivalYear);
				year--;
				this.departureYear = year.toString();
			}else if (value <10){
				value = "0" + value;
			}

			this.departureMonth = value.toString();
		}

		this.drawCalendar(this.calendarType);
}

calendarReservation.prototype.setClassInstanceVariables = function(type,positionElementID){
	this.calendarType = type;
	this.positionElementID = positionElementID;

	var value = this.selectArrivalYear.options[this.selectArrivalYear.selectedIndex].value;
	this.arrivalYear  = value.substring(0,4);
	this.arrivalMonth = value.substring(4,6);
	this.arrivalDay   = this.selectArrivalDay.options[this.selectArrivalDay.selectedIndex].value;

	value = this.selectDepartureYear.options[this.selectDepartureYear.selectedIndex].value;
	this.departureYear  = value.substring(0,4);
	this.departureMonth = value.substring(4,6);
	this.departureDay   = this.selectDepartureDay.options[this.selectDepartureDay.selectedIndex].value;
}

calendarReservation.prototype.setFormValue = function(dayID){
	var valueDay = dayID.toString();
	var valueYearMonth = this.calendarType.indexOf("arrival") != -1 ? this.arrivalYear + this.arrivalMonth : this.departureYear + this.departureMonth;	

	var selectObjYear = this.calendarType.indexOf("arrival") != -1 ? this.selectArrivalYear : this.selectDepartureYear;
	var selectObjDay = this.calendarType.indexOf("arrival") != -1 ? this.selectArrivalDay : this.selectDepartureDay;
	

	for(i = 0; selectObjYear.length >i; i++){
		if ( selectObjYear.options[i].value == valueYearMonth){
			selectObjYear.options[i].selected = true;
			SetDaysInMonth( selectObjYear.form, this.calendarType );
		}
	}

	for(i=0; selectObjDay.length >i;i++){
		if ( selectObjDay.options[i].value == valueDay){
			selectObjDay.options[i].selected = true;
		}
	}

	//Check to make sure the arrival date is NOT before the departure Date.
	//If so add 1 to the arrival date a and reset the departure.

	var aYear = this.selectArrivalYear.options[this.selectArrivalYear.selectedIndex].value;
	var aDay  = this.selectArrivalDay.options[this.selectArrivalDay.selectedIndex].value;
	var dYear = this.selectDepartureYear.options[this.selectDepartureYear.selectedIndex].value;
	var dDay  = this.selectDepartureDay.options[this.selectDepartureDay.selectedIndex].value;
	
	if (aDay < 10){ aDay = "0" + aDay; }
	if (dDay < 10){ dDay = "0" + dDay; }
	var testADate = parseFloat( aYear + aDay );
	var testDDate = parseFloat( dYear + dDay );

	if ( testADate >= testDDate &&  this.calendarType.indexOf("arrival") != -1){

		for(i = 0; this.selectDepartureYear.length >i; i++){
			if ( this.selectDepartureYear.options[i].value == aYear){
				this.selectDepartureYear.options[i].selected = true;
				SetDaysInMonth( selectObjYear.form, 'departure' );
			}
		}

		if (aDay ==  GetDaysInMonth(this.selectDepartureYear.options[this.selectDepartureYear.selectedIndex].value)){
				this.selectDepartureYear.options[this.selectDepartureYear.selectedIndex + 1].selected = true;
				SetDaysInMonth( selectObjYear.form, 'departure' );
				this.selectDepartureDay.options[0].selected = true;
			
		}else{
			this.selectDepartureDay.options[parseFloat(aDay)].selected = true;;
		}
		
		
	}else if ( testDDate <  testADate && this.calendarType.indexOf('departure') != -1){

		if ( this.selectDepartureDay.selectedIndex > 0 && this.selectDepartureDay.options[ this.selectDepartureDay.selectedIndex - 1].text.length >0 ){
			this.selectArrivalYear.options[this.selectDepartureYear.selectedIndex].selected = true;
			SetDaysInMonth( selectObjYear.form, 'arrival' );
			this.selectArrivalDay.options[ this.selectDepartureDay.selectedIndex - 1].selected = true;

		}else{
			var index = this.selectArrivalYear.selectedIndex - 1;
			if (index < 0){ index = 0;}

			this.selectArrivalYear.options[index].selected = true;
			SetDaysInMonth( selectObjYear.form, 'arrival' );
			var numdays = GetDaysInMonth(this.selectArrivalYear.options[ this.selectArrivalYear.selectedIndex  ].value);
				
			this.selectArrivalDay.options[ numdays - 1 ].selected = true;
		}


	}


	this.hideCalendar();


}

calendarReservation.prototype.setGraphics = function(aHeader,dHeader,left,right){
	this.graphicHeaderArrival = this.elemClass.createImg(aHeader);
	this.graphicHeaderDeparture = this.elemClass.createImg(dHeader);
	
	this.graphicNavBack = this.elemClass.createImg(left,'',0,'');
	this.graphicNavNext = this.elemClass.createImg(right,'',0,'');
}

calendarReservation.prototype.setFormSelects = function(className,aYear,aDay,dYear,dDay){
	this.selectArrivalYear = aYear;
	this.selectArrivalDay = aDay;
	this.selectDepartureYear = dYear;
	this.selectDepartureDay = dDay;

	this.className = className;

	this.setSelectBoxes = true;
}

calendarReservation.prototype.writeCalendar = function(calType,n){

	// If the form selectBoxes are not set, load them with the default value.
	if ( ! this.setSelectBoxes ){
		this.setFormSelects('resCalendarClass',document.hotelreservation.arrival_yearmonth, document.hotelreservation.arrival_day, document.hotelreservation.departure_yearmonth, document.hotelreservation.departure_day);
		this.setGraphics('http://graphics2.worldweb.com/images/calendar-checkin.gif','http://graphics2.worldweb.com/images/calendar-checkout.gif','http://graphics.worldweb.com/IconsFrontPage/arrow_red_left.jpg','http://graphics.worldweb.com/IconsFrontPage/arrow_red.jpg');
	}


	this.elemClass.clearContent("calendarContainer");
	var elementRoot = this.elemClass.getElement("calendarContainer");

	
		//Header Graphics
		var divElement =  this.elemClass.createElement("div");
		divElement.setAttribute("align","center");	
		divElement.setAttribute("id", "calendarHeadingArrival");
		divElement.setAttribute("name", "calendarHeadingArrival");
		divElement.appendChild( this.graphicHeaderArrival );
		elementRoot.appendChild( divElement );
		
		divElement =  this.elemClass.createElement("div");
		divElement.setAttribute("align","center");	
		divElement.setAttribute("id", "calendarHeadingDeparture");
		divElement.setAttribute("name", "calendarHeadingDeparture");
		divElement.appendChild( this.graphicHeaderDeparture );
		elementRoot.appendChild( divElement );


		//Container Row for Navigation
		divElement =  this.elemClass.createElement("div");
		divElement.setAttribute("align","center");	
		divElement.setAttribute("id", "calendarNavText");
		divElement.setAttribute("name", "calendarNavText");
		divElement.setAttribute("noWrap", "true");
		elementRoot.appendChild( divElement );
	
		//Graphics Nav Left
		divElement =  this.elemClass.createElement("div");
		divElement.setAttribute("id", "calendarNavLeft");
		divElement.setAttribute("name", "calendarNavLeft");
		divElement.appendChild( this.elemClass.createHref("javascript: "+ this.className + ".reDraw(-1)",this.graphicNavBack) );
		elementRoot.appendChild( divElement );

		//Graphics Nav Right
		divElement =  this.elemClass.createElement("div");
		divElement.setAttribute("id", "calendarNavRight");
		divElement.setAttribute("name", "calendarNavRight");
		divElement.style.zIndex = 100;
		divElement.appendChild( this.elemClass.createHref("javascript: " + this.className + ".reDraw(1)",this.graphicNavNext) );
		elementRoot.appendChild( divElement );

		for (i=0 ; this.arrayWeekDaysShort.length > i; i++){
			var divElement = this.elemClass.createElement("div");
			    divElement.setAttribute("className","calendarContainerCell");
			    divElement.setAttribute("class","calendarContainerCell");
			    divElement.setAttribute("id","calendarWDay"+ i);
			    divElement.setAttribute("name","calendarWDay"+ i);
				divElement.appendChild( this.elemClass.createText(this.arrayWeekDaysShort[i] )); 
				
			elementRoot.appendChild( divElement );
		}
	
		
		for(i=1; 32 > i; i++){
			var divElement = this.elemClass.createElement("div");
			    divElement.setAttribute("className","calendarContainerCell");
			    divElement.setAttribute("class","calendarContainerCell");
			    divElement.setAttribute("id","calendarDay"+ i);
			    divElement.setAttribute("name","calendarDay"+ i);
				
				var textElement =  this.elemClass.createText(i); 
				var hrefElement = this.elemClass.createHref("javascript: "+ this.className +".setFormValue("+i+")", textElement); 
				    hrefElement.setAttribute("id","calendarHref" + i);
				    hrefElement.setAttribute("name","calendarHref" + i);
				divElement.appendChild( hrefElement ); 
			
			elementRoot.appendChild( divElement );
		}

		divElement = this.elemClass.createElement("div");
		divElement.setAttribute("id","calendarClose");
		divElement.setAttribute("name","calendarClose");
				
		var textElement =  this.elemClass.createText("Close"); 
		var hrefElement = this.elemClass.createHref("javascript: "+ this.className + ".hideCalendar()", textElement); 
			hrefElement.style.textDecoration = "none";
		divElement.appendChild( hrefElement );
		elementRoot.appendChild( divElement );
		
		this.loaded = true;
}

calendarReservation.prototype.showCalendar = function(calType,positionElementID){
		if (! this.loaded ){
			this.writeCalendar();
		}
		this.setClassInstanceVariables(calType,positionElementID);

		this.drawCalendar(calType);

}

calendarReservation.prototype.drawCalendar = function(calType){

		var coords = this.elemClass.getElementPositionAbsolute(this.positionElementID);
		coords.y -= 10;
        if (navigator.userAgent.indexOf('MSIE') >= 0 ){
			coords.x += 155;
		}

		var containerLeft = coords.x;
		var containerTop = coords.y;

		if (calType.indexOf("arrival") != -1 ){
			this.elemClass.setVisibility('calendarHeadingArrival',1);
			this.elemClass.setVisibility('calendarHeadingDeparture',0);

			this.elemClass.moveElement("calendarHeadingArrival","absolute",containerLeft,containerTop);
		}else{
			this.elemClass.setVisibility('calendarHeadingArrival',0);
			this.elemClass.setVisibility('calendarHeadingDeparture',1);

			this.elemClass.moveElement("calendarHeadingDeparture","absolute",containerLeft,containerTop);
		}

		// Re-Create the Header based on the stored data
		this.elemClass.clearContent("calendarNavText");

		var headingText = calType.indexOf("arrival") != -1 ? this.arrayMonths[ parseFloat(this.arrivalMonth) -1 ] + " " + this.arrivalYear : this.arrayMonths[ parseFloat(this.departureMonth) -1 ] + " " + this.departureYear ;
		var element = this.elemClass.getElement("calendarNavText");
		element.appendChild( this.elemClass.createText(headingText) );
		this.elemClass.setElementStyle("calendarNavRight","zIndex",100);

		//Add spacing and position header line.
		var containerInner = containerLeft + 15;
		containerTop += 40;

		var tempLeft = containerInner + 5;
		this.elemClass.moveElement("calendarNavLeft","absolute",tempLeft,containerTop);
		tempLeft = containerInner + 31;
		this.elemClass.moveElement("calendarNavText","absolute",tempLeft,containerTop);
		tempLeft = containerInner + 125;
		this.elemClass.moveElement("calendarNavRight","absolute",tempLeft,containerTop);

		this.elemClass.setVisibility('calendarNavText',1);
		this.elemClass.setVisibility('calendarNavRight',1);
		
		var dateObj = new Date();
		if (calType.indexOf("arrival") != -1){
			var month = dateObj.getMonth() + 1
			var year = dateObj.getFullYear();
		
			var value = 1;
			if (parseFloat(this.arrivalYear) == year && parseFloat(this.arrivalMonth) == month){
				value = 0;
			}
			this.elemClass.setVisibility('calendarNavLeft',value);
		}else{
			var month = dateObj.getMonth() + 1
			var year = dateObj.getFullYear();
		
			var value = 1;
			if (parseFloat(this.departureYear) == year && parseFloat(this.departureMonth) == month){
				value = 0;
			}
			this.elemClass.setVisibility('calendarNavLeft',value);
		}

		//Add spacing and position the days of the week.
		containerTop += 20;
		for (i = 0; 7 >i ; i++){
			tempLeft = containerInner + 9 + (i * 20);;
			this.elemClass.moveElement("calendarWDay" + i,"absolute",tempLeft,containerTop );
			this.elemClass.setVisibility('calendarWDay' + i,1);

		}


		//Get the current values of the select box.	
		var aYear = this.selectArrivalYear.options[this.selectArrivalYear.selectedIndex].value;
		var aDay  = parseFloat(this.selectArrivalDay.options[this.selectArrivalDay.selectedIndex].value);
		var dYear = this.selectDepartureYear.options[this.selectDepartureYear.selectedIndex].value;
		var dDay  = parseFloat(this.selectDepartureDay.options[this.selectDepartureDay.selectedIndex].value);

		var checkYear = this.calendarType.indexOf('arrival') != -1 ? this.arrivalYear + this.arrivalMonth : this.departureYear + this.departureMonth;

		//Position the days of the week
		containerTop += 20;
		var daysInMonth = this.getDaysInMonth();
		var dateObj = calType.indexOf("arrival") != -1 	? new Date(this.arrivalYear,(parseFloat(this.arrivalMonth)-1),1) : new Date(this.departureYear, (parseFloat(this.departureMonth)-1),1);
		var dayCount = parseFloat(dateObj.getDay());
		for(i = 1; 32 > i; i++){
	
			tempLeft = containerInner + 6+  (dayCount * 20);
			if (i < 10){ tempLeft += 4; }; // Adjust for the column that are not two digits
			this.elemClass.moveElement("calendarDay" + i,"absolute",tempLeft,containerTop );


			// But a color and remove the underline if it's a day selected as arrival or departure.
			var element = this.elemClass.getElement("calendarHref" + i);
			if ( (aYear == checkYear &&  aDay == i) || 
				 (dYear == checkYear && dDay == i)	
				){
				this.elemClass.setElementStyle("calendarHref" + i, "color", "red");
				this.elemClass.setElementStyle("calendarHref" + i, "textDecoration", "none");
			}else{
				this.elemClass.setElementStyle("calendarHref" + i, "color", "#666666");
				this.elemClass.setElementStyle("calendarHref" + i, "textDecoration", "underline");
			}


			dayCount++;
			if (dayCount > 6){
				dayCount = 0;
				containerTop += 20;
			}
			this.elemClass.setVisibility("calendarDay"+ i,daysInMonth >= i  ? 1 : 0)
		}

		containerTop += 20;
		tempLeft = containerInner + 50;
		this.elemClass.moveElement("calendarClose","absolute",tempLeft,containerTop );
		this.elemClass.setVisibility("calendarClose",1);
}
