/*
---------------------------------------------------------------------------
Hotel Smart Suite (HSS) - Online Edition
Copyright (c) 2008 MindSpring Software, http://www.mindspringsoftware.com
---------------------------------------------------------------------------

HSS Includes 3rd party components provided by the following copyright and licensing agreement(s):

Copyright (c) 2008, Yahoo! Inc.
All rights reserved.

Redistribution and use of this software in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice, this list of conditions and the
      following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    * Neither the name of Yahoo! Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission of Yahoo! Inc.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Copyright (c) 2008 John Resig, http://jquery.com/
	
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
	
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
	
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

*/

// Main Variable to Change JS Debugging on or off
var DEBUG = new Boolean(false); 
var defaultDepartureDateAddDays = 1;	// Number of default days between arrival and departure date for new reservations
var CASH_DRAWER_INCIDENTALS = new Boolean(true); 

/*
 * END USER CONFIG VARIABLES
 */

// Turn caching off for JQuery AJAX
$(document).ready(function() {
	//$.ajaxSetup({cache:false});
});

/*
 * Utilize Yahoo! REST Mapping API to Obtain Lat/Lon/Address Correction
 * 
 * TO DO:
 * 1) Create IIS Proxy for Cross-Domain URL Access
 * 2) Check for Error XML Response
 */
function getLatLon(address, city, state, zip) {
	try {
		var appId = '6UX1iRvV34GyXkqMN8PiJU5F2hwKJSV3wyZxi2ZC2kT4RfFZjylZIJ1vaIUsYw';
		var addr1 = URLEncode(address);
		city = URLEncode(city);
		
		var url = 'http://local.yahooapis.com/MapsService/V1/geocode';
		
		$.post(url, {
			appId: appId,
			street: addr1,
			city: city,
			state: state,
			zip: zip
		}, function(data){
			alert("Data Loaded: " + data);
			
			var xmlobject = getXmlObjectFromString(data);
			try {
				var lat = xmlobject.getElementsByTagName("Latitude")[0].childNodes[0].nodeValue;
				var lon = xmlobject.getElementsByTagName("Longitude")[0].childNodes[0].nodeValue;
				var addr1 = xmlobject.getElementsByTagName("Address")[0].childNodes[0].nodeValue;
				var city = xmlobject.getElementsByTagName("City")[0].childNodes[0].nodeValue;
				var state = xmlobject.getElementsByTagName("State")[0].childNodes[0].nodeValue;
				var zip = xmlobject.getElementsByTagName("Zip")[0].childNodes[0].nodeValue;
				
				var results = new Array(6);
				results[0] = lat;
				results[1] = lon;
				results[2] = addr1;
				results[3] = city;
				results[4] = state;
				results[5] = zip;
				
				return results;
			} 
			catch (e) {
				return '';
			}
		}, "text");
	} catch(e) {
		alert(e.message);		
		return '';
	}
}

/*
 * Obtains Currency Conversion Rates from USD to specified Currency
 * Using Yahoo! Currency Database
 * 
 * TO DO:
 * 1) Create IIS Proxy for Cross-Domain URL Access
 * 2) Parse CSV File Results
 */
function convertCurrency(toCurrency) {
	var url = "http://finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s='. USD . " + toCurrency + " .'=X'";
	alert(url);	

	$.post(url, function(data){
		alert("Data Loaded: " + data);
		
		// Parse the CSV File Here
	}, "text");
}

/*
 * Common Check-In Functions
 */
var isQuickCheckout=new Boolean(false);
var latestXmlResult;
var curRoomRow = 0;
var curRoomRypeId = 0;

function getAvailablility(roomTypeID, row) {
	displayYahooLoader();
	
	// Move the select arrow
	modifyCell(curRoomRow, '<a href="javascript:getAvailablility(' + curRoomRypeId + ',' + curRoomRow + ');">Select</a>');
	curRoomRow = row;
	curRoomRypeId = roomTypeID;
	modifyCell(curRoomRow, '<img src="/images/right1.png" width="22" height="16">');
	
	//alert("Getting available rooms for check-in for room type: " + roomTypeID);
	var arrival_date = $("#arrival_date").val();
	var departure_date = $("#departure_date").val();
	if (arrival_date == '') {
		arrival_date = $("#reservation_checkin").html();
		departure_date = $("#reservation_checkout").html();
	}
	
	$.get("/bi/functions/getCheckInAvailableRooms.asp", { id: roomTypeID, arrival_date: arrival_date, departure_date: departure_date }, function(data){
		  	var xmlobject = getXmlObjectFromString(data);
			latestXmlResult = xmlobject;
		  	
			var fields = new Array("room_id", "room_number", "room_floor", "room_rate", "room_id", "room_days", "room_rate_quote");
			var labels = new Array("pk", "Room Number", "Room Floor", "Room Rate","Room ID", "Days", "Rate Quote");
			
			generateDataTableXml(xmlobject, fields, labels, "record", "RoomListResults", true, 10, 400);
			
			closeYahooLoader();
	});
}

function modifyCell(row, data) {
	var divID = 'CheckInRoomSelect_' + row;
	//console.log(divID);
	if (document.getElementById) {
		var myid = document.getElementById(divID);
		myid.innerHTML = data;
	} else if (document.all) {
		var myid = document.all(divID);
		myid.innerHTML = data;
	}
}
/*
 * End Common Check-In Functions
 */

//change the opacity for different browsers 
function changeOpac(opacity, id) { 
    var object = document.getElementById(id).style; 
    object.opacity = (opacity / 100); 
    object.MozOpacity = (opacity / 100); 
    object.KhtmlOpacity = (opacity / 100); 
    object.filter = "alpha(opacity=" + opacity + ")"; 
} 

function displayNotificationDemo() {
	displayNotification('', 'Server going down from 12amCST to 1amCST.', 'Server Outage');
	displayNotification('', 'You have a sales mtg at 1:30pm.', 'Calendar Reminder');
	displayNotification('', '1 Guest is past checkout.', 'Hotel Task Reminder');	
}

function opacity(id, opacStart, opacEnd, millisec) { 
    //speed for each frame 
    var speed = Math.round(millisec / 100); 
    var timer = 0; 

    //determine the direction for the blending, if start and end are the same nothing happens
    if(opacStart > opacEnd) { 
        for(i = opacStart; i >= opacEnd; i--) { 
            setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed)); 
            timer++; 
        } 
    } else if(opacStart < opacEnd) { 
        for(i = opacStart; i <= opacEnd; i++) 
            { 
            setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed)); 
            timer++; 
        } 
    } 
} 

//change the opacity for different browsers 
function changeOpac(opacity, id) { 
    var object = document.getElementById(id).style; 
    object.opacity = (opacity / 100); 
    object.MozOpacity = (opacity / 100); 
    object.KhtmlOpacity = (opacity / 100); 
    object.filter = "alpha(opacity=" + opacity + ")"; 
} 

function forwardToErrorPage(errorCode) {
	location.href="/common/HSS_Error.asp?err=" + errorCode;
}


function openPopUpCentered(popUpID, title, msg) {
     var elem = document.getElementById(popUpID);
     
     // Obtain PopUpID Width and Height
     var height = elem.style.height.replace('px','');
     var width = elem.style.width.replace('px','');
     
	 var centerWidth = document.body.clientWidth / 2;
     var centerHeight = document.body.clientHeight / 2;
     
     // Obtain the actual popUp Positions
     var xPos = centerWidth - (width / 2);
     var yPos = centerHeight - (height / 2);
     
     // Set Element x and y style position
     elem.style.left = xPos;
     elem.style.top = yPos;
     
     // Display the PopUp
     displayPopUp(popUpID, title, msg);
}

function getElementHeight(Elem) {
	if (ns4) {
		var elem = getObjNN4(document, Elem);
		return elem.clip.height;
	} else {
		if(document.getElementById) {
			var elem = document.getElementById(Elem);
		} else if (document.all){
			var elem = document.all[Elem];
		}
		if (op5) { 
			xPos = elem.style.pixelHeight;
		} else {
			xPos = elem.offsetHeight;
		}
		return xPos;
	} 
}

function getElementWidth(Elem) {
	if (ns4) {
		var elem = getObjNN4(document, Elem);
		return elem.clip.width;
	} else {
		if(document.getElementById) {
			var elem = document.getElementById(Elem);
		} else if (document.all){
			var elem = document.all[Elem];
		}
		if (op5) {
			xPos = elem.style.pixelWidth;
		} else {
			xPos = elem.offsetWidth;
		}
		return xPos;
	}
}

function getSelectValue(formObj) {
	var selObj = document.getElementById(formObj);
	var selIndex = selObj.selectedIndex;
	var selValue = selObj.options[selIndex].value;
	return selValue;
}

function getSelectName(formObj) {
	var selObj = document.getElementById(formObj);
	var selIndex = selObj.selectedIndex;
	var selValue = selObj.options[selIndex].innerHTML;
	return selValue;
}

function checkAll(form, field) {
	var obj = document.forms[form].elements[field];
	var countCheckBoxes = obj.length;
    if(!countCheckBoxes) {
        obj.checked = true;
    } else { 
		for (i = 0; i < obj.length; i++) {
			obj[i].checked = true ;
		}
	}
}

function uncheckAll(form, field) {
	var obj = document.forms[form].elements[field];
	for (i = 0; i < obj.length; i++) {
		obj[i].checked = false ;
	}
}


/*
1000 Milliseconds = 1 Second
*/
function pause(numberMillis) {
     var now = new Date();
     var exitTime = now.getTime() + numberMillis;
     while (true) {
         now = new Date();
         if (now.getTime() > exitTime)
             return;
     }
}

function displayPopUp(id, title, msg) {
  var object = document.getElementById(id);
  //applyFilter('20');  
  displayWindow(object);
  document.getElementById(id + '_title').innerHTML = title;
  document.getElementById(id + '_msg').innerHTML = msg;
  opacity(id, 20, 101, 800);
}
function applyFilter(num) {
  var filter = "alpha(opacity=" + num + ")";
  document.body.style.filter = filter;
}
function closePopUp(id) {
  var object = document.getElementById(id);
  opacity(id, 100, 0, 800);
  applyFilter('101');
  closeWindow(object);
}
function changeOpac(opacity, id) { 
  var object = document.getElementById(id).style; 
  object.opacity = (opacity / 100); 
  object.MozOpacity = (opacity / 100); 
  object.KhtmlOpacity = (opacity / 100); 
  object.filter = "alpha(opacity=" + opacity + ")"; 
}
function displayWindow(id) {
  id.style.display = ""; 
}
function closeWindow(id) { id.style.display = "none"; }

function checkScreenSize() {
	alert("Here!");
}
function toggleFormDisplay(formID) {
	var obj = document.getElementById(formID);
	if (obj.style.display == '') {
		obj.style.display = "none";
		var pos = formID.indexOf('Update', 0);
		if (pos == -1) {
			document.getElementById(formID + 'Update').style.display = "";
		} else {
			document.getElementById(formID.substr("0",pos)).style.display = "";
		}
	}
}

// CONTAINER FUNCTIONS
function transferFormValuesToDiv(formA) {
	var formObjA = document.forms(formA);
	//if (DEBUG) alert(formObjA);
	for ( i = 0; i < formObjA.elements.length; i++ ) {
		var formElemA = formObjA.elements[i];
		var aName = formElemA.name;
		var divObj = document.getElementById(aName);
		if (divObj != null) {
			divObj.innerHTML = formElemA.value;
		}
	}
}

function transferFormValues(formA, formB) {
	var formObjA = document.forms[formA];
	var formObjB = document.forms[formB];
	for ( i = 0; i < formObjA.elements.length; i++ ) {
		var formElemA = formObjA.elements[i];
		var aName = formElemA.name;
		if (formObjB.elements[aName] != null) {
			try {
				formObjB.elements[aName].value = formElemA.value;
				document.getElementById(aName).value = formElemA.value;
			} catch (e) { }
		}
	}
}

function getURLParam( name ) {
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
    return "";
  else
    return results[1];
}

function postPayment(type, amt, number) {
	var newHTML = '<tr><td>' + type + '</td><td>' + amt + '</td><td>' + number + '</td></tr>';
	$('#').append(newHTML);
	
	// post to db
}

function URLencode(str) {
    str = escape(str);
    return str;
}

function logout() {
	alert("Logout keyboard shortkey pressed!");
	location.href="/Auth/HSS_Logout.asp";
}

function currencyFormatter(amount) {
	var i = parseFloat(amount);
	if(isNaN(i)) { i = 0.00; }
	var minus = '';
	if(i < 0) { minus = '-'; }
	i = Math.abs(i);
	i = parseInt((i + .005) * 100);
	i = i / 100;
	s = new String(i);
	if(s.indexOf('.') < 0) { s += '.00'; }
	if(s.indexOf('.') == (s.length - 2)) { s += '0'; }
	s = minus + s;
	return s;
}

function getResultValue(xmlobject) {
	var resultNode = xmlDoc.getElementsByTagName("result");
	if (resultNode.length > 0) {
		return resultNode.childNodes[0].nodeValue;
	} else {
		return "-1"
	}
}

function createTableFromXmlResults(tableName, xmlobject, tagName, labels, fields) {
	var html = '<table cellspacing="0" cellpadding="5" border="0" name="' + tableName + '" class="' + tableName + '_class" >';
	var resultNode = xmlobject.getElementsByTagName(tagName);
	
	html += '<tr class="' + tableName + '_header">';
	for (i=0; i<labels.length; i++) {
		var labelName = labels[i];
		html += '<td align="middle">' + labelName + '</td>';
	}
	html += '</tr>';
	
	for (i=0; i<resultNode.length; i++) {
		var rowClass = tableName + "_";
		if (i % 2 == 0) {
			rowClass += "0";
		} else {
			rowClass += "1";
		}
		
		var recordNode = resultNode[i];
		html += '<tr class="' + rowClass + '">';
		for (j=0; j< fields.length; j++) {
			fieldName = fields[j];
			var fieldValue = getNodeValue(recordNode, fieldName);
			if (fieldValue != "") {
				if (fieldName.indexOf("amount") > 0 || fieldName.indexOf("total") > 0) {
					fieldValue = "$" + currencyFormatter(fieldValue);
				}
			
				html += '<td align="right">' + fieldValue + '</td>';
			}
		}
		html += "</tr>";
	}
	html += "</html>";
	return html;
}

function displayNotification(imgurl, msg, header) {
	header = "<strong>" + header + "</header>";
	if (imgurl != '') {
		msg = '<img src="' + imgurl + '"> ' + msg;
	}
	$.jGrowl(msg, { sticky: true,
					header: header });
}

function getNodeValue(node, fieldName) {
	try {
		var resultVal = node.getElementsByTagName(fieldName)[0].childNodes[0].nodeValue;
		return resultVal;
	} catch(e) {
		return '';
	}
}

// For each node traversed get name/value
// For name, find in Form Object and set value to node value
function bindXmlResultToForm(xmlDoc, formA) {
	//alert(formA);
	try {
		var fomObj = document.forms[formA];
		
		// Loop through record result
		var resultNode = xmlDoc.getElementsByTagName("record");
		//alert(resultNode.length);
		if (resultNode.length > 0) {
				var elemNode = resultNode[0];
				//alert(elemNode.childNodes.length);
				for (i=0; i<elemNode.childNodes.length; i++) {
					try {
						var elementNode = elemNode.childNodes[i];
						var elemName = elementNode.nodeName;
						var fieldValue = "";
				    	if (elementNode.hasChildNodes()) {
					        fieldValue = elementNode.childNodes[0].nodeValue;
					    }
						
						var formElem = document.forms[formA].elements[elemName];
						if (formElem != null) {
							document.forms[formA].elements[elemName].value = fieldValue;
						}
					} catch(e) { forwardToErrorPage("1: " + e.message); }
				}

		}
	} catch(e) { forwardToErrorPage("2: " + e.message); }
}

/*
Validates "Required" Form Fields by Examining Field Label's to see if "*" (asterick) exists
*/
function validateRequiredFields(formName) {
	var errorStr = "";
	var formObj = document.forms[formName];
	for ( i = 0; i < formObj.elements.length; i++ ) {
		var formElem = formObj.elements[i];
		var labelID = formElem.name + "ID";
		var labelObj = document.getElementById(labelID);
		if (labelObj != null) {
			var html = labelObj.innerHTML;
			var pos = html.indexOf("*");
			if (pos > 0) {
				var formElemVal = formElem.value;
				if (formElemVal.length < 1) {
					errorStr += "Missing required field: " + html.substr(pos+8) + "<br>";
					$(labelObj).css({'background-color' : 'yellow', 'font-weight' : 'bolder'});
				} else {
					$(labelObj).css({'background-color' : 'white', 'font-weight' : 'lighter'});
				}
			}
		}
	}
	document.getElementById(formName + ".errors").innerHTML = errorStr;
	if (errorStr.length > 0) {
		return false;
	} else {
		return true;
	}
}

function createURLQueryParamsFromForm(formA, append) {
	var param = "";
	var formObjA = document.forms[formA];
	for ( i = 0; i < formObjA.elements.length; i++ ) {
		var formElemA = formObjA.elements[i];
		var aName = URLencode(formElemA.name);
		var aValue = URLencode(formElemA.value);
		param += "&" + append + aName + "=" + aValue;
	}
	return param;
}

function getXmlObjectFromString(xmlstring) {
	var xmlobject;
	if (navigator.appName == 'Microsoft Internet Explorer') {
		try {
			xmlobject = new ActiveXObject("Microsoft.XMLDOM");
			xmlobject.async = "false";
			xmlobject.loadXML(xmlstring);
		}
 			catch(e) {  }
	} else {
 			//Firefox, Mozilla, Opera, etc.
   		try {
   			xmlobject = (new DOMParser()).parseFromString(xmlstring, "text/xml");
   		}
 			catch(e) {  }
 	}
 	return xmlobject;
 }
 
 
function bindXml(xmlobject, tagName, type) {
	var recordsContainer = xmlobject.getElementsByTagName(tagName);
    var tot_records = recordsContainer.length;
    //if (DEBUG)  alert(tot_records);
    if (tot_records == 0) return 0;
    
   	// Populate the First Record
   	var record = recordsContainer[0];
   	if (record.childNodes.length == 0) return false;
   	for(j=0;j<record.childNodes.length-1;j++) {
    	var field = record.childNodes[j];
    	//alert(field);
    	if (typeof field != "undefined") {
	    	var fieldName = field.nodeName;
	    	var fieldValue = "";
	    	if (field.hasChildNodes()) {
		        fieldValue = field.childNodes[0].nodeValue;
		    }

	    	if (type == 'content') {
	    		try {
	    			var newHTML = '';
	    			if (fieldName.indexOf('url') > 0) {
	    				// It is an image
	    				newHTML = '<img src="' + fileValue + '" />';
	    			} else {
			    		newHTML = fieldValue;
		    		}
		    		var divObj = document.getElementById(fieldName);
			    		if (divObj != null) {
			    			divObj.innerHTML = unescape(newHTML);
			    		}	
		    	} catch (e) {  }
	    	} else  {
	    		// Then we are processing a form
	    		// See what type of text input we are dealing with	
	    		var divObj = document.forms[type].elements[fieldName]
	    		if (typeof divObj != "undefined") {
	    			if (divObj.type == 'select-one') {
	    				//alert(fieldName + ":" + fieldValue);
	    				SetIndex(fieldName, fieldValue);
	    			} else {
	    				document.forms[type].elements[fieldName].value = unescape(fieldValue);
	    			}
	    		}
	    	}

		} else {
			//break;
		}
		
	}

	return tot_records;
}



function SetIndex(in_element, in_value) {
	var list = document.getElementById(in_element);
	if(list&&list.options.length){
		for(var i=0; i<list.options.length; i++){
			if(list.options[i].value == in_value){
				list.selectedIndex = i;
				return;
			}
		}
	}
} 

/*
Populates the Search Result's Grid Based on an Availability Lookup (Search)
Common to Check-In and Lookup Page
*/
function populateFields(xmlstring, type, refer) {
	reservedCheckInRooms = 0;
	var xmlobject = getXmlObjectFromString(xmlstring);
	
	var tot_records = bindXml(xmlobject, "record", "content");
		
	if (tot_records > 0) {
		var fields = new Array("reservation_id","reservation_made","reservation_room_count","arrival_date","departure_date");
		var labels = new Array("Res.Id","Made On","Rooms","Arrival", "Departure");
		generateDataTableXml(xmlobject, fields, labels, "record", "ReservationListResults");
		
		// Bind the User Information
		var result = bindXml(xmlobject, "primaryGuestResults", "content");
		
		// Get Reserved Room Information
		var roomsContainer = xmlobject.getElementsByTagName("room");
    	var tot_rooms = roomsContainer.length;
    	//alert("Found " + tot_rooms + " rooms on this reservation.");
    	if (tot_rooms > 0) {
    		// Display XML DataGrid of Rooms
    		// Room Type Name, Rate
    		// generateDataTableXml(roomsContainer);
    		//if (DEBUG) alert("Found " + tot_rooms + " rooms on this reservation.");
    		var roomFields = new Array("room_id","room_number", "room_type_name","room_rate");
			var roomLabels = new Array("pk","Room Number", "Room Type","Rate");
    		generateDataTableXml(xmlobject, roomFields, roomLabels, "room", "ReservationRoomsListResults");
    		
    		try {
    			var checkInRoomsDiv = document.getElementById("StartReservationFor");
    			//alert(checkInRoomsTable);
    			var resultNode = xmlobject.getElementsByTagName("room");
				var html = '<table border="0" cellspacing="10" class="main_text"><tr><td></td><td><strong>Requested Rooms</strong></td><td><strong>Reserved Rooms</strong></td><td></td></tr>';
				var firstRoomTypeID;
				for (var i=0; i<resultNode.length; i++) {
					var roomNode = resultNode[i];
					// Get Individual Values
					var roomTypeID = roomNode.getElementsByTagName("room_type_id")[0].childNodes[0].nodeValue;
					var roomTypeName = roomNode.getElementsByTagName("room_type_name")[0].childNodes[0].nodeValue;
					var rate = roomNode.getElementsByTagName("room_rate")[0].childNodes[0].nodeValue;
					
					html += '<tr><td id="CheckInRoomSelect_' + i + '">';
					if (i == 0) {
						html += '<img src="/images/r_arrow_select.png">';
						firstRoomTypeID = roomTypeID;
					}
					html += '</td><td>' + roomTypeName + '</td><td>' + '<div id="CheckInRoom_' + i + '"><i>You have not selected a room yet.</i></div></td><td><input type="button" onclick="javascript:getAvailablility(' + roomTypeID + ', ' + i + ');" value="Search Availability"><br /></td></tr>';
					reservedCheckInRooms++;
				}
				html += '</table>';
				
				if (refer == 'CheckIn') {
					document.getElementById("CheckInRequestedRoomTypes").innerHTML = html;
					getAvailablility(firstRoomTypeID, 0);
					var primaryGuestNode = xmlobject.getElementsByTagName("primaryGuestResults");
					var recordNode = xmlobject.getElementsByTagName("record");
					
					// Obtain Additional Info
					guestId = primaryGuestNode[0].getElementsByTagName("guest_id")[0].childNodes[0].nodeValue;     		
					resId = xmlobject.getElementsByTagName("reservation_id")[0].childNodes[0].nodeValue;					
					resDetailId = xmlobject.getElementsByTagName("reservation_detail_id")[0].childNodes[0].nodeValue;			
				}
				
				try {
					var primaryGuestNode = xmlobject.getElementsByTagName("primaryGuestResults");
					var tmpGuestId = primaryGuestNode[0].getElementsByTagName("guest_id")[0].childNodes[0].nodeValue;     		
					var tmpResId = xmlobject.getElementsByTagName("reservation_id")[0].childNodes[0].nodeValue;	
					resDetailId = xmlobject.getElementsByTagName("reservation_detail_id")[0].childNodes[0].nodeValue;
					
					//getFolio(tmpGuestId, tmpResId, resDetailId);
					
				} catch (e) {  }
				
    		} catch (e) { alert(e.message); }
    		
    	}
		
		
	} else {
		try {
			document.getElementById("ReservationListResults").innerHTML = "";
		} catch(e) { }
		return false;
	}
    
    return true;
}

function clearFolioView() {
	try {
		document.getElementById("FolioResults").innerHTML = '';
		document.getElementById("FolioBalance").innerHTML = '';
	} catch(e) { }
}

var myDataTable;
function generateDataTableXml(xmlobject, fields, labels, recordName, divName, scrollable, maxrows, width) {
	try {
		if (typeof scrollable == "undefined") {
			scrollable = false;
		}
		if (typeof maxrows == "undefined") {
			maxrows = -1;
		}
		
		var myDataSource;
		var myColumnDefs = new Array();
	              
	              for (i=0; i<fields.length; i++) {		
			    		if (labels[i] == 'pk') { 
			        		myColumnDefs[i] = {key:fields[i],label:labels[i],sortable:'true',hidden:true};
			        	} else if (labels[i].toLowerCase().indexOf('rate') > -1) { 
							myColumnDefs[i] = {key:fields[i],label:labels[i],sortable:'true',formatter: 'currency'};
						} else {
			        		myColumnDefs[i] = {key:fields[i],label:labels[i],sortable:'true'};
			        	}
			      }
				  
				  var oConfigs;
				  if (maxrows > 1) {
				  	oConfigs = {
				  		paginator: new YAHOO.widget.Paginator({
				  			rowsPerPage: 15,
							generateRequest: true
				  		}),
						width: width
				  	};
				  } else {
				  	oConfigs = { };
				  } 
				  	
	              myDataSource = new YAHOO.util.DataSource(xmlobject);
		              myDataSource.responseType = YAHOO.util.DataSource.TYPE_XML;
		              myDataSource.responseSchema = {
		                  resultNode: recordName,
		                  fields: fields
		              };
		
		              myDataTable = new YAHOO.widget.DataTable(divName, myColumnDefs, myDataSource, oConfigs);
					  
              	 
					  
	              // Subscribe to events for row selection 
		          myDataTable.subscribe("rowMouseoverEvent", myDataTable.onEventHighlightRow); 
		          myDataTable.subscribe("rowMouseoutEvent", myDataTable.onEventUnhighlightRow);
		          myDataTable.subscribe("rowClickEvent", function(oArgs, oArgsTarget) {
		              var elCheckbox = oArgs.target;
		              var record = this.getRecord(elCheckbox);
		              var column = this.getColumn(elCheckbox);

		              var recordIndex = this.getRecordIndex(record);
		              var recordKey = record.getData("id");
		              selectDataGridRow(recordIndex, divName, xmlobject);
		          });  
			
	 
	        // Programmatically select the first row 
	        //this.myDataTable.selectRow(this.myDataTable.getTrEl(0)); 
	        // Programmatically bring focus to the instance so arrow selection works immediately 
	        myDataTable.focus(); 
	         
	        myDataTable = new YAHOO.widget.DataTable("single", 
	                myColumnDefs, myDataSource, { 
	                    caption:"Single-Row Selection with Modifier Keys Disabled", 
	                    selectionMode:"single" 
	                });
	        
	} catch (e) { alert(e.message); }
}

/*
 * Convenience Method
 * Add's Data to a YUI! Data Cell Dynamically via DOM Manipulation/Selectors
 * (simpler impl than creating a YUI Record and then using it's instance setData & setRecord methods)
 * columnIndex/rowIndex - start with 1
 */
function addDataToCell(divName, rowIndex, columnIndex, data) {
    var newHTML = '<div class="yui-dt-liner">' + data + '</div>';
    rowIndex++;
    $("#" + divName + " table tr:eq(" + rowIndex + ") td:eq(" + columnIndex + ")").html(newHTML);
}
	
/* 
 * Convenience Method
 * Gets Data from a YUI! Data Cell DOM Manipulation/Selectors
 * (simpler impl than getRecord().getData('field_name'), which requires instance name)
 * columnIndex/rowIndex - start with 1
 */
function getDataFromCell(divName, rowIndex, columnIndex) {
	rowIndex++;
	var data = $("#" + divName + " table tr:eq(" + rowIndex + ") td:eq(" + columnIndex + ") div").text();
	return data;
}

var last_workspace_name = "";

/*
 * MAIN CALLBACK Function for selecting DataGrid rows
 */
function selectDataGridRow(recordIndex, divName, xmlobject) {
    //console.log(divName);
	if (divName == 'ReservationListResults') {
		try {
			// Obtain new reservation number
			var record = xmlobject.getElementsByTagName("record")[recordIndex];
			var nodeResult = record.getElementsByTagName("reservation_id");
			var fieldValue = nodeResult[0].childNodes[0].nodeValue;
	   		
			// Set the new number and do a lookup
			document.getElementById("reservation_number").value = fieldValue;
			lookupReservation(last_workspace_name);
			
		} catch(e) { alert(e.message); }
	}
	else if (divName == 'ReservationRoomsListResults') {

    } 
    else if (divName == 'ArrivalResults') {
 		try {
			// Obtain new reservation number
			var record = xmlobject.getElementsByTagName("record")[recordIndex];
			var nodeResult = record.getElementsByTagName("reservation_id");
			var fieldValue = nodeResult[0].childNodes[0].nodeValue;

			window.location = '../bi/HSS_BI_Reservation.asp?action=checkInStart&id=' + fieldValue //HSS_CheckIn.asp?rNum=' + fieldValue;			
		} catch(e) { alert(e.message); }
    } 
	else if (divName == 'RoomListResults') {
		// Obtain the room number
		var record = xmlobject.getElementsByTagName("record")[recordIndex];
		var nodeResult = record.getElementsByTagName("room_number");
		var fieldValue = nodeResult[0].childNodes[0].nodeValue;
   		
		var nodeResultID = record.getElementsByTagName("room_id");
		var fieldValueID = nodeResultID[0].childNodes[0].nodeValue;
		//alert(fieldValueID);
		roomId = fieldValueID;
		
		if (isQuickCheckout == true) {
			// run page-level callback
			if (typeof selectRoomQuickCheckInCallback=="function") selectRoomQuickCheckInCallback(fieldValue, roomId);
		
		} else {
			try {
				// Set the new number and do a lookup
				var lookupDivName = 'CheckInRoom_' + curRoomRow;
				$("#" + lookupDivName).html(fieldValue);
				//document.getElementById(lookupDivName).innerHTML = fieldValue;
				
				// Update data table
				addDataToCell("ReservationRoomsListResults", (curRoomRow+1), 1, fieldValue);
				
				satisfiedRooms = 0;
				for (i=0; i<reservedCheckInRooms; i++) {
					var theValue = $('#CheckInRoom_' + i).html();
					if (theValue != null) {
						//console.log("value: " + theValue);
						if (theValue.indexOf('selected') > 0) {
							 break;
						} else {
							satisfiedRooms++;
							//console.log(satisfiedRooms + ":" + reservedCheckInRooms);
							if (satisfiedRooms == reservedCheckInRooms) {
								document.getElementById("CheckInButton").disabled = false;
								document.getElementById("CheckInNotes").innerHTML = '';
							}
						}
					}
				}
				
			} catch(e) { alert(e.message); }
		}
	}
}

var lookupResult = "";

function getLookupResult() {
	return lookupResult;
}

function processError() {
	alert("Missing required field.");
	closeYahooLoader();
}

function lookupReservation(workspaceName, refer, fn) {
		last_workspace_name = workspaceName;
		clearFolioView();
		
		var lookup = "";
		var ID = "";
		// See how we are looking up the reservation
		var reservation_num = "";
		
		// Reset some information before lookup
		try {
			reservation_num = parent.document.getElementById("reservation_number").value;
			
			document.getElementById("CheckOutButtons").style.display = "none";
			document.getElementById("CheckInMessage").innerHTML = '';
		} catch (e) { }
		
		var guest_id;
		try {
			guest_id = document.getElementById("guest_id").value;
		} 
		catch (e) {
		}
		
		var room_number;
		try {
			room_number = document.getElementById("room_number").value;
			if (room_number != '') {
				refer = 'room';
			}
		}
		catch (e) {
		}
		
		//alert(reservation_num + ":" + guest_id);
		if (guest_id != '') {
			lookup = "guest_id";
			ID = guest_id;
		}
		if (reservation_num != '') {
			lookup = "reservation_number";
			ID = reservation_num;
		}
		if (typeof refer != "undefined") {
			if (refer == 'room') {
				lookup = 'room_number';
				ID = document.getElementById("room_number").value;
			}
		}
		
		if (lookup != "" && ID != "") {
			
			displayYahooLoader();

			$.get("/bi/functions/getReservationByID.asp", {
				id: ID,
				type: lookup
			}, function(data){
				lookupResult = data;
				
				document.getElementById("ReservationMsg").innerHTML = "";
				var result = populateFields(data, "content", refer);

				if (result == false) {
					$("#ReservationMsg").html("<i>No reservation information found.</i><br><br>");
					$("#ReservationDetail").hide();
					$("#ReservationButtons").hide();
					
					if (typeof reservationNotFoundCallback == "function") reservationNotFoundCallback();
				}
				else {
					$("#ReservationButtons").show();
					$("#ReservationDetail").show();
					
					if (typeof reservationFoundCallback == "function") reservationFoundCallback();
				}
				
				
				try {
					// See if guest is checked-in
					var xmlobject = getXmlObjectFromString(data);
					
					// Obtain Guest ID
					var record = xmlobject.getElementsByTagName("reservation_guest_id")[0];
					var guest_id = record.childNodes[0].nodeValue;
					
					// Obtain Reservation ID
					var recordB = xmlobject.getElementsByTagName("reservation_id")[0];
					var res_id = recordB.childNodes[0].nodeValue;
					
					// Obtain Reservation Detail ID
					var recordC = xmlobject.getElementsByTagName("reservation_detail_id")[0];
					var res_detail_id = recordC.childNodes[0].nodeValue;
					
					// Obtain Current (Primary) Room Number
					try {
						var roomNode = xmlobject.getElementsByTagName("room");
						var room_num = roomNode[0].getElementsByTagName("room_number")[0].childNodes[0].nodeValue;
						curRoomNumber = room_num;
					} catch(f) {
						curRoomNumber = "";
						//console.log(f.message);
					}
					
					try {
						getFolio(guest_id, res_id, res_detail_id);
					} catch(f) {
					    //console.log(f.message);
					}
					
					var isCheckIn = isGuestCheckedIn(res_id, guest_id, function(CHECKED_IN) {
						//console.log("Is Checked In: " + CHECKED_IN);
					});
					
				} 
				catch (e) {
					//console.log("An exception has occurred...");
					//console.log(e.message);
				}
				
				closeYahooLoader();
				
				if (typeof fn == "function") fn();
				
			}, 'text');
			
		} else {
			processError();
		}

		
	}
	
/*
 * See if user is checked in
 * 
 * TODO: This needs re-worked for better handling and response
 */
function isGuestCheckedIn(res_id, guest_id, fn) {
	$.get("/bi/functions/isGuestCheckedIn.asp", { id: res_id, guest_id: guest_id }, function(data){

			var isCheckedIn = new Boolean(false);		
		  	
			var pos = data.indexOf('Error');
			if (pos > 0) {
				isCheckedIn = false;
			} else {
				isCheckedIn = true;
				// Do page-level work here
				try {
					doIsCheckedIn();
				} 
				catch (e) { }	
			} 
			
			if (typeof fn == "function") fn(isCheckedIn);
			
			return isCheckedIn;
	}, 'text');
}

function isErrorResponse(xmlobject) {
	var errorMsg = "";
	var jData = $( xmlobject );
	
	$(jData).find("Error").each(function(i) {
			errorMsg = $(this).find("Message").text();
	});
	//console.log("errormsg: " + errorMsg);
	
	return errorMsg;
}

/*
 * Date Format 1.2.2
 * (c) 2007-2008 Steven Levithan <stevenlevithan.com>
 * MIT license
 * Includes enhancements by Scott Trenda <scott.trenda.net> and Kris Kowal <cixar.com/~kris.kowal/>
 *
 * Accepts a date, a mask, or a date and a mask.
 * Returns a formatted version of the given date.
 * The date defaults to the current date/time.
 * The mask defaults to dateFormat.masks.default.
 */
var dateFormat = function () {
	var	token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
		timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
		timezoneClip = /[^-+\dA-Z]/g,
		pad = function (val, len) {
			val = String(val);
			len = len || 2;
			while (val.length < len) val = "0" + val;
			return val;
		};

	// Regexes and supporting functions are cached through closure
	return function (date, mask, utc) {
		var dF = dateFormat;

		// You can't provide utc if you skip other args (use the "UTC:" mask prefix)
		if (arguments.length == 1 && (typeof date == "string" || date instanceof String) && !/\d/.test(date)) {
			mask = date;
			date = undefined;
		}

		// Passing date through Date applies Date.parse, if necessary
		date = date ? new Date(date) : new Date();
		if (isNaN(date)) throw new SyntaxError("invalid date");

		mask = String(dF.masks[mask] || mask || dF.masks["default"]);

		// Allow setting the utc argument via the mask
		if (mask.slice(0, 4) == "UTC:") {
			mask = mask.slice(4);
			utc = true;
		}

		var	_ = utc ? "getUTC" : "get",
			d = date[_ + "Date"](),
			D = date[_ + "Day"](),
			m = date[_ + "Month"](),
			y = date[_ + "FullYear"](),
			H = date[_ + "Hours"](),
			M = date[_ + "Minutes"](),
			s = date[_ + "Seconds"](),
			L = date[_ + "Milliseconds"](),
			o = utc ? 0 : date.getTimezoneOffset(),
			flags = {
				d:    d,
				dd:   pad(d),
				ddd:  dF.i18n.dayNames[D],
				dddd: dF.i18n.dayNames[D + 7],
				m:    m + 1,
				mm:   pad(m + 1),
				mmm:  dF.i18n.monthNames[m],
				mmmm: dF.i18n.monthNames[m + 12],
				yy:   String(y).slice(2),
				yyyy: y,
				h:    H % 12 || 12,
				hh:   pad(H % 12 || 12),
				H:    H,
				HH:   pad(H),
				M:    M,
				MM:   pad(M),
				s:    s,
				ss:   pad(s),
				l:    pad(L, 3),
				L:    pad(L > 99 ? Math.round(L / 10) : L),
				t:    H < 12 ? "a"  : "p",
				tt:   H < 12 ? "am" : "pm",
				T:    H < 12 ? "A"  : "P",
				TT:   H < 12 ? "AM" : "PM",
				Z:    utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
				o:    (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
				S:    ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
			};

		return mask.replace(token, function ($0) {
			return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
		});
	};
}();

// Some common format strings
dateFormat.masks = {
	"default":      "ddd mmm dd yyyy HH:MM:ss",
	shortDate:      "m/d/yy",
	mediumDate:     "mmm d, yyyy",
	longDate:       "mmmm d, yyyy",
	fullDate:       "dddd, mmmm d, yyyy",
	shortTime:      "h:MM TT",
	mediumTime:     "h:MM:ss TT",
	longTime:       "h:MM:ss TT Z",
	isoDate:        "yyyy-mm-dd",
	isoTime:        "HH:MM:ss",
	isoDateTime:    "yyyy-mm-dd'T'HH:MM:ss",
	isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
};

// Internationalization strings
dateFormat.i18n = {
	dayNames: [
		"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
		"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
	],
	monthNames: [
		"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
		"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
	]
};

// For convenience...
Date.prototype.format = function (mask, utc) {
	return dateFormat(this, mask, utc);
};


function closeYahooLoader() {
	// Hide the Panel
    YAHOO.example.container.wait.hide();
}

function closePopUpWindowNew() {
	// Hide the Panel
    YAHOO.example.containerB.wait.hide();
}

function displayYahooLoader() {
	YAHOO.namespace("example.container");
        if (!YAHOO.example.container.wait) {

            YAHOO.example.container.wait = 
                    new YAHOO.widget.Panel("wait",  
                                                    { width: "240px", 
                                                      fixedcenter: true, 
                                                      close: false, 
                                                      draggable: false, 
                                                      zindex:4,
                                                      modal: true,
                                                      visible: false
                                                    } 
                                                );
    
            YAHOO.example.container.wait.setHeader("Loading, please wait...");
            YAHOO.example.container.wait.setBody("<img src=\"http://us.i1.yimg.com/us.yimg.com/i/us/per/gr/gp/rel_interstitial_loading.gif\"/>");
            YAHOO.example.container.wait.render(document.body);

        }

        var callback = {
            success : function(o) {
                YAHOO.example.container.wait.hide();
            },
            failure : function(o) {
                YAHOO.example.container.wait.hide();
            }
        }
    
        // Show the Panel
        YAHOO.example.container.wait.show();
}

/*
 * Display's a Pop-Up Using IFRAME Content
 */
function displayPopUpWindowIFrame(width, title, src, height) {
	$("#IFramePopUpContent").attr('src', src);
	//var content = $("#IFramePopUp").html();
	
	//console.log("height:" + height);
	
	var content = '<div id="IFrameContentB">test</div>';
	displayPopUpWindowNew(width, title, content, 100, src, height);
}

/*
 * Display: Creates a Pop-Up Window Using Yahoo UI! with a Modal
 */
function displayPopUpWindowNew(width, title, content, y, src, height) {
	if (typeof y == "undefined") {
		y = 'null';
	}
		
	YAHOO.namespace("example.containerB");
        if (!YAHOO.example.containerB.wait) {

            YAHOO.example.containerB.wait = 
                    new YAHOO.widget.Panel("wait",  
                                                    { width: width, 
                    								  height: height,
                                                      fixedcenter: true, 
                                                      close: false, 
                                                      draggable: true, 
                                                      zindex:6,
                                                      modal: true,
                                                      iframe:true,
                                                      visible: true
                                                    }
                                                );

            YAHOO.example.containerB.wait.renderEvent.subscribe(function() {
            	if (typeof src != "undefined") {
	            	var newHTML = '<iframe id="IFramePopUpContent" style="overflow-x:hidden;background-color:#f2f2f2" src="' + src  + '" frameborder="0" width="100%" height="440"></iframe>';
	            	$("#IFrameContentB").html(newHTML);   
            	}
            });
            
            YAHOO.example.containerB.wait.setHeader(title);
            YAHOO.example.containerB.wait.setBody(content);
            YAHOO.example.containerB.wait.render(document.body);
            
            YAHOO.example.containerB.wait.show();

            
        } else {
        	YAHOO.example.containerB.wait.destroy();
        	YAHOO.example.containerB.wait = null;
        	displayPopUpWindowNew(width, title, content, y, src);	// let's recall the display method
        }
}

/*
 * Display: Changes a Yahoo UI! Container Content
 */
function changeContainerContent(title, content, y) {
	YAHOO.example.containerB.wait.setHeader(title);
    YAHOO.example.containerB.wait.setBody(content);
    YAHOO.example.containerB.wait.render(document.body);
}

/*
 * Utility: Used to convert JSON to XML
 */
function json2xml(o, tab) {
   var toXml = function(v, name, ind) {
      var xml = "";
      if (typeof(v) == "object") {
         var hasChild = false;
         for (var m in v) {
            if (m.charAt(0) == "@")
                xml += " " + m.substr(1) + "=\"" + v[m].toString() + "\"";
            else
               hasChild = true;
         }
         if (hasChild) {
            for (var m in v) {
               if (m=="name") {
                 xml += "<" + v[m] + ">" + v['value'] + "</" + v[m] + ">";
               }
            }
         }
      }
      return xml;
   }, xml="";
   for (var m in o)
      xml += toXml(o[m], m, "");
    return "<form>"+xml+"</form>";
}

/*
 * Utility: Utilizes JQuery to take a form and serialize as JSON and then convert to XML
 */
function serializeFormJSON(formName) {
	var formjson = $('form#' + formName).serializeArray();

    var formxml = json2xml(formjson);
    alert(formxml);
    
	return formxml;
		
		//$.post("/collect.cgi", {
	    //    'data': formxml
	    //},
	    //function (data){
	    //}
 		//);
	
	return '';
}

function checkEnter(e){ 
	try {
		var characterCode;
		
		if (e && e.which) {
			e = e;
			characterCode = e.which;
		}
		else {
			e = event;
			characterCode = e.keyCode; //character code is contained in IE's keyCode property
		}
		
		if (characterCode == 13) { //if generated character code is equal to ascii 13 (if enter key)
			try {
				// Run the executeEnter function if it exists
				performPageEnter();
				
			} 
			catch (e) {
			}
			
			return false;
		}
		else {
			return true;
		}
	} catch(e) {
		return false;
	}
}

function displayError(request, errorType, errorThrown) {
  try {
  	if (errorType == 'timeout') {
  		alert("Request has timed out.  Please try again later");
  	} else {
		alert("An Unexpected Error Has Occurred: " + errorThrown);
	}
  } 
  catch (e) {} 
} 

function daysBetween(date1, date2) {
    var DSTAdjust = 0;
    // constants used for our calculations below
    oneMinute = 1000 * 60;
    var oneDay = oneMinute * 60 * 24;
    // equalize times in case date objects have them
    date1.setHours(0);
    date1.setMinutes(0);
    date1.setSeconds(0);
    date2.setHours(0);
    date2.setMinutes(0);
    date2.setSeconds(0);
    // take care of spans across Daylight Saving Time changes
    if (date2 > date1) {
        DSTAdjust = 
            (date2.getTimezoneOffset() - date1.getTimezoneOffset()) * oneMinute;
    } else {
        DSTAdjust = 
            (date1.getTimezoneOffset() - date2.getTimezoneOffset()) * oneMinute;    
    }
    var diff = Math.abs(date2.getTime() - date1.getTime()) - DSTAdjust;
    return Math.ceil(diff/oneDay);
}

/*
 * Sets the default Arrival and Departure date based on Config Days between and from Todays Date
 * Using configured ID Elements for: arrival_date, departure_date, (ex.)
 */
function setDefaultDates(arrivalDateID, departureDateID, nightsID) {
	//Create default start and end dates
	var arrivalDate = new Date; 
	var departureDate = new Date;
	departureDate.setDate(arrivalDate.getDate()+defaultDepartureDateAddDays);
		
	var displayArrivalDate = arrivalDate.format("m/dd/yyyy");
	var displayDepartureDate = departureDate.format("m/dd/yyyy");
	
	document.getElementById(arrivalDateID).value = displayArrivalDate;
	document.getElementById(departureDateID).value = displayDepartureDate;
	
	setNights(nightsID, arrivalDateID, departureDateID);
}

/*
 * Modify's the Nights Select Based on days between Arrival and Departure
 */
function setNights(nightsID, arrivalDateID, departureDateID) {
	var arrivalDate = document.getElementById(arrivalDateID).value;
	var departureDate = document.getElementById(departureDateID).value;
	
	var days = daysBetween(new Date(arrivalDate), new Date(departureDate));
	SetIndex(nightsID, days)
}

/*
 * Validates that Arrival and Departure Dates are "ok" 
 * (i.e. Departure date doesn't come before Arrival)
 */
function validateDates(arrivalDateID, departureDateID) {
	var todaysDate = new Date();
	todaysDate.setDate(todaysDate.getDate()+1);
	
	var date1 = document.getElementById(arrivalDateID).value;
	var date2 = document.getElementById(departureDateID).value;
	
	var arrivalDate = new Date(date1);
	var departureDate = new Date(date2);
	
	var days = daysBetween(arrivalDate, departureDate);

	/*
	if (todaysDate.getTime() > arrivalDate.getTime() ) {
		alert("The arrival date must be after todays date");
		return false;
	}	
	*/ 	
	if ( (departureDate.getTime() - arrivalDate.getTime()) < 0) {
		alert("The departure date must be after the arrival date.");
		return false;
	}
	if (days > 30) {
		alert("You cannot book more than 30 days online");
		return false;
	}
	
	return true;
}