
function Reservation() {
    var logger = LogFactory.getLog("Reservation.js");

    var thisRes = this;

    var amounts = new Array();
    this.getAmount = function(date) {
        return amounts[date];
    }

    var valid = false;
    this.isValid = function() {
        return this.valid;
    }

    function setValid( v ) {
        thisRes.valid = v;
    }

    // Page elements to cache
    var statusMessageElem;
    // var statusMessageElem2;
    var statusMessage;

    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;
        // }
    }

    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;
    this.setReservationForm = function(rf) {
        this.reservationForm = rf;
    }

    var submitEnabledContent;
    this.setSubmitEnabledContent = function(cont) {
        this.submitEnabledContent = cont;
    }

    var submitDisabledContent;
    this.setSubmitDisabledContent = function(cont) {
        this.submitDisabledContent = cont;
    }

    var submitLinkIds;
    var submitLinks;
    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.iataCodeField   = this.reservationForm.elements["IATANumber"];
        // this.iataCodeElem  = document.getElementById("IATANumber");

        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);
                onchangeHandler(e);
                roomTypeValue = elem.alt;
                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() {
        this.setEndDate("");
        this.setStartDate("");
        onchangeHandler();
    }

    var onchangeHandler = function() {
        setValid( false );
        setStatusMessage("");
        totalAmountValue = "";
        updateContent();
        thisRes.calendar.loadCalendars(true);
        thisRes.validateReservation();
    }

    // The Calendar object
    var calendar;
    this.setCalendar = function(cal) {
        this.calendar = cal;
    }

    this.setStartDate = function(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()");
        //alert("reservation validateReservation 1"); 
        if( ! this.reservationForm.elements["roomType"] ) {
            // Can't validate without a room type
            //alert("reservation validateReservation 2"); 
            return;
        }
        //alert("reservation validateReservation 3"); 
        var data = this.getFormPostData();
        //alert(data);
        var tmpMsg = "Validating reservation request...";
        setStatusMessage( tmpMsg );
        //alert("reservation validateReservation 4"); 
        var http = getHTTPObject();
        var cursorHelper = new CursorHelper();
        cursorHelper.setNewCursor("wait");
        http.open("POST", "/reservation/ValidateReservation.do");
            http.setRequestHeader("Content-Type",
                                     "application/x-www-form-urlencoded");
        //alert("reservation validateReservation 5");                              
        http.onreadystatechange =
            function() {
                // handleValidateReservation() - anonymous function
                //alert("reservation validateReservation 6"); 
                tmpMsg = tmpMsg + ".";
                setStatusMessage( tmpMsg );
                if (http.readyState == 4 ) {
                    if( http.status == 200 ) {
                        //alert("reservation validateReservation 7"); 
                        parseReservationResponse( http.responseXML );
                        thisRes.calendar.updateCalendars();
                    } else {
                        logger.warn("Problem with response, code = ",
                                    http.status, "\n",
                                    http.responseText);
                                   // alert("reservation validateReservation 9"); 
                    }
                    cursorHelper.removeCursor();
                }
            }

        http.send( data );
        //alert("reservation validateReservation 10"); 
        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];
            
            logger.debug(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 "";
        }
    }

}

