
function Reservation() {
	var logger = LogFactory.getLog("Reservation.js");
	var thisRes = this;
	// amounts is an array of daily rates indexed by date ie: amounts[date] = amount where date="080629" amount="209" 
	var amounts = new Array();
	// Is the reservation valid or not
	var valid = false;
    // Page elements to cache
	var statusMessageElem;
    // var statusMessageElem2;
	var statusMessage;
	var startDateElem;
	var startDateField;
	var endDateElem;
	var endDateField;
	//var numRoomsElem;
	var numRoomsField;
	var numAdultsElem;
	var numAdultsField;
	var numChildrenElem;
	var numChildrenField;
	var promoCodeElem;
	var promoCodeField;
	var numberOfNightsElem;
	var roomTypeElem;
	var roomTypeValue = "";
	var totalAmountElem;
	var totalAmountValue = "";
	var artElem;
	//var altElem;
	var reservationForm;
	var submitEnabledContent;
	var submitDisabledContent;
	var submitLinkIds;
	var submitLinks;
    // The Calendar object
	var calendar;
	var artMessage = "<div class='calTempMessage'><img src=\"/images/img-defaultstate.jpg\" width=\"582\" height=\"185\" alt=\"Please select your dates of stay.\"></div>";
	
	this.setTotalAmountValue = function (value) {
	    totalAmountValue = value;
	};
	
	this.setRoomTypeValue = function (value) {
	    roomTypeValue = value;
	}

	this.getAmount = function (date) {
		return amounts[date];
	};
	
	this.isValid = function () {
		return this.valid;
	};
	
	function setValid(v) {
		thisRes.valid = v;
	}
	
	this.setValid = function (v) {
		setValid(v);
	};

	function setStatusMessage(msg) {
		thisRes.statusMessage = msg;
		var tmpMsg = msg;
		if (msg == "") {
			tmpMsg = "<span>&nbsp;</span>";
		} else {
		}
		thisRes.statusMessageElem.innerHTML = tmpMsg;
        // if( thisRes.statusMessageElem2 ){
        // thisRes.statusMessageElem2.innerHTML = tmpMsg;
        // }
	}
	
	this.setStatusMessage = function(msg) {
	    setStatusMessage(msg);
	};

    // The reservation form object
	this.setReservationForm = function (rf) {
		this.reservationForm = rf;
	};
	this.setSubmitEnabledContent = function (cont) {
		this.submitEnabledContent = cont;
	};
	this.setSubmitDisabledContent = function (cont) {
		this.submitDisabledContent = cont;
	};
	this.setSubmitLinkIds = function () {
		submitLinkIds = arguments;
	};
	this.init = function () {
		logger.debug("Enter init()");
		this.statusMessageElem = document.getElementById("statusMessage");
        // this.statusMessageElem2 = document.getElementById("statusMessage2" );
		this.startDateField = this.reservationForm.elements["startDate"];
        // JG this.startDateElem  = document.getElementById("startDate");
		this.startDateElem = document.getElementById("startDateElem");
		this.endDateField = this.reservationForm.elements["endDate"];
		this.endDateElem = document.getElementById("endDateElem");
		this.numRoomsField = this.reservationForm.elements["numberOfRooms"];
		//this.numRoomsElem = document.getElementById("numberOfRoomsElem");
		this.numAdultsField = this.reservationForm.elements["numberOfAdults"];
		this.numAdultsElem = document.getElementById("numberOfAdultsElem");
		this.numChildrenField = this.reservationForm.elements["numberOfChildren"];
		this.numChildrenElem = document.getElementById("numberOfChildrenElem");
		this.numberOfNightsElem = document.getElementById("numberOfNightsElem");
		this.promoCodeField = this.reservationForm.elements["stayCode"];
		this.promoCodeElem = document.getElementById("promoCodeElem");
		this.artElem = document.getElementById("getAvailableRoomTypes");
		this.artElem.innerHTML = artMessage;
		//this.altElem = document.getElementById("altContent");

        // this.iataCodeField   = this.reservationForm.elements["IATANumber"];
        // this.iataCodeElem  = document.getElementById("IATANumber");
		this.roomTypeElem = document.getElementById("roomTypeElem");
		this.totalAmountElem = document.getElementById("totalAmountElem");
//		this.roomTypeRateField = this.reservationForm.elements["roomTypeRate"];
//		this.roomTypeRateField.onchange = roomTypeRateOnChangeHandler;
		this.numRoomsField.onchange = onchangeHandler;
		this.numAdultsField.onchange = promoOnChangeHandler;
		this.numChildrenField.onchange = promoOnChangeHandler;
		this.promoCodeField.onchange = promoOnChangeHandler;
		this.promoCodeField.onfocus = function () {
			this.select();
		};
        // this.iataCodeField.onchange = updateContent;
        // this.iataCodeField.onfocus = function() { this.select() };
		this.statusMessage = "";

		submitLinks = new Array(submitLinkIds.length);
		for (var i = 0; i < submitLinkIds.length; i++) {
			submitLinks[i] = document.getElementById(submitLinkIds[i]);
		}
		document.getElementById("cal1").onmouseover = function () {
			ddrivetip(constructTipMessage());
		};
		document.getElementById("cal1").onmouseout = function () {
			hideddrivetip();
		};
		document.getElementById("cal2").onmouseover = function () {
			ddrivetip(constructTipMessage());
		};
		document.getElementById("cal2").onmouseout = function () {
			hideddrivetip();
		};
		updateContent();
		logger.debug("Exit init()");
	};
	this.handleRoomTypeChange = function (rmTypeVal) {
		roomTypeValue = rmTypeVal;
		onchangeHandler();
	};
	this.clearDates = function () {
		this.setEndDate("");
		this.setStartDate("");
		var artElem = document.getElementById("getAvailableRoomTypes");
		artElem.innerHTML = artMessage;
		artElem.style.display = "block";
		//var alt = document.getElementById("altContent");
		//alt.style.display = "block";
		onchangeHandler();
	};
	var onchangeHandler = function () {
		logger.debug("Enter onchangeHandler");
		setValid(false);
		setStatusMessage("");
		totalAmountValue = "";
		updateContent();
		thisRes.calendar.loadCalendars(true);
		thisRes.validateReservation();
		logger.debug("Leave onchangeHandler");
	};
	var promoOnChangeHandler = function () {
        var y=document.getElementById("stayCode").value;
        document.getElementById("stayCode").value=y.toUpperCase();
        thisRes.promoOnChangeHandlerImpl();
	    /*
		logger.debug("Enter promoOnChangeHandler");
		setValid(false);
		setStatusMessage("");
		totalAmountValue = "";
		roomTypeValue = "";
		updateContent();
		thisRes.getAvailableRoomTypes();
		thisRes.calendar.loadCalendars(true);
		//thisRes.validateReservation();
		logger.debug("Leave promoOnChangeHandler");
		*/
	};
	
	this.promoOnChangeHandlerImpl = function () {
		logger.debug("Enter promoOnChangeHandler");
		setValid(false);
		setStatusMessage("");
		totalAmountValue = "";
		roomTypeValue = "";
		updateContent();
		thisRes.getAvailableRoomTypes();
		thisRes.calendar.loadCalendars(true);
		//thisRes.validateReservation();
		logger.debug("Leave promoOnChangeHandler");
	};
	
	var radioOnchangeHandler = function (e) {
		logger.debug("Enter radioOnchangeHandler");
        var elem = getEventSource(e);
        // id = associated rate code
        elem.form.elements["rateCode"].value = elem.id;
		setValid(false);
		setStatusMessage("");
		totalAmountValue = "";
		updateContent();
		thisRes.validateReservation();
		logger.debug("Leave radioOnchangeHandler");
	};

	this.setCalendar = function (cal) {
		this.calendar = cal;
	};
	this.setStartDate = function (date) {
		logger.debug("Enter setStartDate(", date, ")");
		setStatusMessage("");
		totalAmountValue = "";
		roomTypeValue = "";
		this.startDateField.value = date;
		setValid(false);
		this.amounts = new Array();
		updateContent();
		logger.debug("Exit setStartDate()");
	};
	this.getStartDate = function () {
		return this.startDateField.value;
	};
	this.setEndDate = function (date) {
		logger.debug("Enter setEndDate(", date, ")");
		setStatusMessage("");
		totalAmountValue = "";
		roomTypeValue = "";
		this.endDateField.value = date;
		setValid(false);
		this.amounts = new Array();
		if (date.length > 0) {
			if (!this.reservationForm.elements["roomType"]) {
				logger.debug("Call to GetRoomTypesAvailable would go here!");
				this.getAvailableRoomTypes();
			} else {
				this.validateReservation();
			}
		} else {
			var art = document.getElementById("getAvailableRoomTypes");
			art.innerHTML = artMessage;
			art.style.display = "block";
			//var alt = document.getElementById("altContent");
			//alt.style.display = "block";
		}
		updateContent();
		logger.debug("Exit setEndDate()");
	};
	this.getEndDate = function () {
		return this.endDateField.value;
	};
	this.validateReservation = function () {
		logger.debug("Enter validateReservation()");
		var radios = this.reservationForm.elements["roomType"];
		var isChecked = false;
		if (radios) {
			for (var i = 0; i < radios.length; i++) {
				if (radios[i].checked) {
					roomTypeValue = radios[i].alt;
					isChecked = true;
					continue;
				}
			}
		}
		if (!isChecked) {
            // Can't validate without a selected room type
			return;
		}
		var data = this.getFormPostData();
		var tmpMsg = "Validating reservation request...";
		setStatusMessage(tmpMsg);
		var http = getHTTPObject();
		var cursorHelper = new CursorHelper();
		cursorHelper.setNewCursor("wait");
		http.open("POST", "/ValidateReservation.do");
		http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		http.onreadystatechange = function () {
                // handleValidateReservation() - anonymous function
			tmpMsg = tmpMsg + ".";
			setStatusMessage(tmpMsg);
			if (http.readyState == 4) {
				if (http.status == 200) {
					logger.debug("Validate Reservation response = " + http.responseText);
					parseReservationResponse(http.responseXML);
					thisRes.calendar.updateCalendars();
				} else {
					logger.warn("Problem with response, code = ", http.status, "\n", http.responseText);
				}
				cursorHelper.removeCursor();
			}
		};
		http.send(data);
		logger.debug("Exit validateReservation()");
	};
	function parseReservationResponse(respXml) {
		logger.debug("Enter parseReservationResponse()");

        // Use tmp variables - then set the real ones at the end
		var tmpValid = false;
		var tmpAmounts = new Array();
		var tmpStatusMsg = "";
		var tmpTotalAmount = 0;

        // Find out if we are valid or not
		var tNodes = respXml.getElementsByTagName("valid");
		for (var i = 0; i < tNodes.length; i++) {
			var v = tNodes[i].getAttribute("value");
			if (v.toLowerCase() == "true") {
				tmpValid = true;
				tmpStatusMessage = "Reservation is valid!";
			} else {
				tmpValid = false;
				tmpStatusMessage = "Reservation is NOT valid!";
			}
		}
		tNodes = respXml.getElementsByTagName("day-detail");
		for (var i = 0; i < tNodes.length; i++) {
			var date = tNodes[i].getAttribute("date");
			var amount = tNodes[i].getAttribute("amount");
			tmpTotalAmount += 1 * amount;
			tmpAmounts[date] = amount;
		}
		tNodes = respXml.getElementsByTagName("error");
		if (tNodes.length > 0) {
			tmpStatusMsg = "";
		}
		for (var i = 0; i < tNodes.length; i++) {
			tmpStatusMsg += tNodes[i].getAttribute("value");
		}

        // Now set the real variables after parsing is done
		setValid(tmpValid);
		amounts = tmpAmounts;
		if (tmpTotalAmount > 0) {
			totalAmountValue = formatCurrency(tmpTotalAmount);
		}
		setStatusMessage(tmpStatusMsg);
		updateContent();
		logger.debug("Exit parseReservationResponse()");
	}
	this.getFormPostData = function () {
		logger.debug("Enter getFormPostData()");
		var postData = "";
		var first = true;
		for (var i = 0; i < thisRes.reservationForm.length; i++) {
			current = thisRes.reservationForm.elements[i];
			/*
            alert(i + ":n" +
                  "name: " + current.name + "n" +
                  "type: " + current.type + "n" +
                  "value: " + current.value );
            */
			if (first) {
				if (current.name == "roomType") {
					if (current.checked == true) {
						postData += current.name + "=" + escape(current.value);
					}
				} else {
					postData += current.name + "=" + escape(current.value);
				}
				first = false;
			} else {
				if (current.name == "roomType") {
					if (current.checked == true) {
						postData += "&" + current.name + "=" + escape(current.value);
					}
				} else {
					postData += "&" + current.name + "=" + escape(current.value);
				}
			}
		}
		logger.debug("Exit getFormPostData(): ", postData);
		return postData;
	};
	function constructTipMessage() {
		var retMsg = "";
		if ((thisRes.startDateField.value == "") && (roomTypeValue == "")) {
			retMsg = "Please select the dates of your stay.";
		} else {
			if (thisRes.startDateField.value == "") {
				retMsg = "Please select the dates of your stay.";
			} else {
				if ((thisRes.endDateField.value == "") && (roomTypeValue == "")) {
					retMsg = "Please select your departure date.";
				} else {
					if (thisRes.endDateField.value == "") {
						retMsg = "Please select your departure date.";
					} else {
						if (roomTypeValue == "") {
							retMsg = "Please select a room type if available or different dates for your stay";
						} else {
							retMsg = "Click Continue to reserve.";
						}
					}
				}
			}
		}
		return retMsg;
	}
	function constructStatusMessage() {
		var retMsg = "";
		if ((thisRes.startDateField.value == "") && (roomTypeValue == "")) {
			retMsg = "Please select the dates of your stay to see available room types.";
		} else {
			if (thisRes.startDateField.value == "") {
				retMsg = "Please select the dates of your stay.";
			} else {
				if ((thisRes.endDateField.value == "") && (roomTypeValue == "")) {
					retMsg = "Please select your departure date to see available room types.";
				} else {
					if (thisRes.endDateField.value == "") {
						retMsg = "Please select your departure date.";
					} else {
						if (roomTypeValue == "") {
							retMsg = "Please select a room type to continue.";
						}
					}
				}
			}
		}
		return retMsg;
	}
	function updateStatusMessage() {
		setStatusMessage(constructStatusMessage());
	}
	this.updateContent = function () {
	    updateContent();
	};
	function updateContent() {
		logger.debug("Enter updateContent()");
		thisRes.startDateElem.innerHTML = getDisplayDateFromField(thisRes.startDateField.value);
		thisRes.endDateElem.innerHTML = getDisplayDateFromField(thisRes.endDateField.value);
		//thisRes.numRoomsElem.innerHTML = thisRes.numRoomsField.value;
		thisRes.numAdultsElem.innerHTML = thisRes.numAdultsField.value;
		thisRes.numChildrenElem.innerHTML = thisRes.numChildrenField.value;
		thisRes.numberOfNightsElem.innerHTML = getNumberOfNights();
		thisRes.promoCodeElem.innerHTML = thisRes.promoCodeField.value;
        // thisRes.iataCodeElem.innerHTML = thisRes.iataCodeField.value;
        // thisRes.statusMessageElem.innerHTML = thisRes.statusMessage;
		thisRes.roomTypeElem.innerHTML = roomTypeValue;
		thisRes.totalAmountElem.innerHTML = totalAmountValue;
		for (var i = 0; i < submitLinks.length; i++) {
			if (thisRes.isValid()) {
				submitLinks[i].innerHTML = thisRes.submitEnabledContent;
				submitLinks[i].onclick = function () {
					thisRes.reservationForm.submit();
					return false;
				};
				submitLinks[i].onmouseover = function () {
					window.status = "Continue with your reservation";
					return true;
				};
				submitLinks[i].onmouseout = clearStatus;
			} else {
				submitLinks[i].innerHTML = thisRes.submitDisabledContent;
				submitLinks[i].onclick = function () {
					updateStatusMessage();
					return false;
				};
				submitLinks[i].onmouseover = function () {
					window.status = "Please complete the form";
					return true;
				};
				submitLinks[i].onmouseout = clearStatus;
			}
		}
		updateTipMessage(constructTipMessage());
		logger.debug("Exit updateContent()");
	}
	function clearStatus() {
		window.status = "";
		return true;
	}
	function getNumberOfNights() {
		var numNights = "";
		if (thisRes.startDateField.value && thisRes.endDateField.value) {
			var sd = getDateFromField(thisRes.startDateField.value);
			var ed = getDateFromField(thisRes.endDateField.value);
			numNights = Math.ceil((ed.getTime() - sd.getTime()) / (1000 * 3600 * 24));
		}
		return numNights;
	}
	function getDateFromField(fieldVal) {
		if (fieldVal.length > 0) {
			var year = "20" + fieldVal.substr(0, 2);
			var month = fieldVal.substr(2, 2) - 1;
			var day = fieldVal.substr(4, 2);
			return new Date(year, month, day);
		}
	}
	function getDisplayDateFromField(fieldVal) {
		if (fieldVal.length > 0) {
			return fieldVal.substr(2, 2) + "/" + fieldVal.substr(4, 2) + "/" + fieldVal.substr(0, 2);
		} else {
			return "";
		}
	}
	this.getAvailableRoomTypes = function () {
		logger.debug("getAvailableRoomTypes");
		var eDt = this.reservationForm.elements["endDate"];
		if (!eDt || eDt.value == "") {
            // Can't get available rooms without endDate
			return;
		}
		cal.disableLeftRight;
		var artElem = document.getElementById("getAvailableRoomTypes");
		//var altElem = document.getElementById("altContent");
		//altElem.style.display = "none";
		artElem.style.display = "block";
		artElem.innerHTML = "<div class='calTempMessage'>Retrieving available room types ....</div>";
		var http = getHTTPObject();
		var cursorHelper = new CursorHelper();
		cursorHelper.setNewCursor("wait");
		var data = this.getFormPostData();
		var form = this.reservationForm;
		http.open("POST", "/GetRoomTypesAvailable.do");
		http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		http.onreadystatechange = function () {
			if (http.readyState == 4) {
				if (http.status == 200) {
					logger.debug("in handleHttpResponse() - setting innerHTML = " + http.responseText);
					var artElem = document.getElementById("getAvailableRoomTypes");
					artElem.innerHTML = http.responseText;
					if (document.getElementById("groupTabs")) {
    					var groupTabs=new ddtabcontent("groupTabs");
    					groupTabs.setpersist(true);
    					groupTabs.setselectedClassTarget("link");
    					groupTabs.init();
    					var radios = document.ReservationRequestForm.elements["roomType"];
    					
    					if (radios) {
    						for (var i = 0; i < radios.length; i++) {
    							//alert("got a radio");
    							radios[i].onclick = function (e) {
    								var elem = getEventSource(e);
    								//setFloorPlan(elem.alt);
    								radioOnchangeHandler(e);
    								roomTypeValue = elem.alt;
    							};
    						}
    					}
					}
					cal.enableLeftRight;
				} else {
					logger.warn("Problem with response, code = ", http.status, "\n", http.responseText);
				}
				cursorHelper.removeCursor();
			}
		};
		http.send(data);
		//this.handleRoomTypeChange( "" );
		/*
		*/
		logger.debug("getAvailableRoomTypes");
	};
}


