
function Reservation() {
    var logger = LogFactory.getLog("Reservation.js");
    var thisRes = this;
    var amounts = new Array();
    var valid = false;
    // Page elements to cache
    var statusMessageElem;
    var statusMessageElem2;
    var statusMessage;
    var statusMessage2
    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 = "";
    // The reservation form object
    var reservationForm;
    var submitEnabledContent;
    var submitDisabledContent;
    var submitLinkIds;
    var submitLinks;
    // The Calendar object
    var calendar;
    
    this.getAmount = function (date) {
        return amounts[date];
    };
    
    this.isValid = function () {
        return this.valid;
    };
    
    function setValid(v) {
        thisRes.valid = 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.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()");
        
        // the status message at the bottom of the reservation summary panel
        this.statusMessageElem = document.getElementById("statusMessage");
        
        // select the element below the calendars
        this.statusMessageElem2 = document.getElementById("statusMessage2" );
        
        // the hidden start date input field at top of form
        this.startDateField = this.reservationForm.elements["startDate"];

        // The arrival date in the reservation summary panel        
        this.startDateElem = document.getElementById("startDateElem");
        
        // the hidden end date input field at top of form
        this.endDateField = this.reservationForm.elements["endDate"];
        
        // The departure date in the reservation summary panel        
        this.endDateElem = document.getElementById("endDateElem");
        
        // the hidden element in the room quantity section
        this.numRoomsField = this.reservationForm.elements["numberOfRooms"];
        
        // The number of rooms in the reservation summary panel        
        this.numRoomsElem = document.getElementById("numberOfRoomsElem");
        
        // the number of adults dropdown in the room quantity section
        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");
        
        // promo code text box
        this.promoCodeField = this.reservationForm.elements["stayCode"];
        
        // The booking code in the reservation summary panel        
        this.promoCodeElem = document.getElementById("promoCodeElem");
        // this.iataCodeField   = this.reservationForm.elements["IATANumber"];
        // this.iataCodeElem  = document.getElementById("IATANumber");
        
        // The suite type in the reservation summary panel        
        this.roomTypeElem = document.getElementById("roomTypeElem");
        this.totalAmountElem = document.getElementById("totalAmountElem");
        this.numRoomsField.onchange = onchangeHandler;
        this.numAdultsField.onchange = onchangeHandler;
        this.numChildrenField.onchange = onchangeHandler;
        this.promoCodeField.onchange = onchangeHandler;

        this.promoCodeField.onfocus = function () {
            this.select();
        };
        // this.iataCodeField.onchange = updateContent;
        // this.iataCodeField.onfocus = function() { this.select() };
        this.statusMessage = "";

        // Set up the onchange handler for the room type radio buttons
        var radios = this.reservationForm.elements["roomType"];
        for (var i = 0; i < radios.length; i++) {
            if (radios[i].checked) {
                roomTypeValue = radios[i].alt;
            }
            radios[i].onclick = function (e) {
                var elem = getEventSource(e);
                //alert("Setting roomTypeValue = " + elem.alt);
                logger.debug("Setting roomTypeValue = " + elem.alt);
                roomTypeValue = elem.alt;
                onchangeHandler(e);
                toggleClamShellMenuEvent();
            };
        }
        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 () {
    	//alert("reservation cleardates");
        this.setEndDate("");
        this.setStartDate("");
        //alert("clearDates");
      	if( thisRes.statusMessageElem2 ){
        	thisRes.statusMessageElem2.innerHTML = "<span>&nbsp;</span>";
        }
        this.promoCodeField.value = "";
        onchangeHandler();
    };

    var onchangeHandler = function () {
        setValid(false);
        setStatusMessage("");
        totalAmountValue = "";
        updateContent();
        thisRes.calendar.loadCalendars(true);
        thisRes.validateReservation();
    };

    this.setCalendar = function (cal) {
        this.calendar = cal;
    };

    this.setStartDate = function (date) {
        //alert("Enter setStartDate(" + date + ")");
        logger.debug("Enter setStartDate(", date, ")");
        setStatusMessage("");
        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("");
        this.endDateField.value = date;
        setValid(false);
        this.amounts = new Array();
        if (date.length > 0) {
            this.validateReservation();
        }
        updateContent();
        logger.debug("Exit setEndDate()");
    };

    this.getEndDate = function () {
        return this.endDateField.value;
    };

    this.validateReservation = function () {
        logger.debug("Enter validateReservation()");
        if (!this.reservationForm.elements["roomType"]) {
            // Can't validate without a room type
            return;
        }
        var data = this.getFormPostData();
        logger.debug("data: " + data);
        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) {
                    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 a room type and 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 a room type and your departure date.";
                } else {
                    if (thisRes.endDateField.value == "") {
                        retMsg = "Please select your departure date.";
                    } else {
                        if (roomTypeValue == "") {
                            retMsg = "Please select a room type.";
                        } else {
                            retMsg = "Click Continue to reserve.";
                        }
                    }
                }
            }
        }
        return retMsg;
    }

    function constructStatusMessage() {
        var retMsg = "";
        if ((thisRes.startDateField.value == "") && (roomTypeValue == "")) {
            retMsg = "Please select a room type and 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 a room type and your departure date.";
                } else {
                    if (thisRes.endDateField.value == "") {
                        retMsg = "Please select your departure date.";
                    } else {
                        if (roomTypeValue == "") {
                            retMsg = "Please select a room type.";
                        }
                    }
                }
            }
        }
        return retMsg;
    }

    function updateStatusMessage() {
        setStatusMessage(constructStatusMessage());
    }

    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 "";
        }
    }
}

