function spamFlitter(cityName)
{
	window.location.href='mailto:'+cityName+'@justonehotel.com';
	return true;
}

/* ---------------------------- form funcs -------------------------*/


/* -------------------------- calendar funcs ------------------------*/

// Functions for initialising and updating booking form

var stayLen=2;

var daysofmonth   = new makeArray(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

var daysofmonthLY = new makeArray(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

var	oneDay = 24*60*60*1000; // 24hrs * 60 mins * 60 secs * 1000 ms



var maxrooms=5;

var maxadults=4;

var maxchildren=2;

var maxchildage=12;

var default_numadults = 2;

var default_numchildren = 0;

var default_numrooms = 1;

var roomsArray = new Array(default_numrooms);

var roomtype_options = new Array();

roomtype_options[1] = new Array("S","TSU");

roomtype_options[2] = new Array("TW","DB");

var roomtype_option_labels = new Array();

roomtype_option_labels['S'] = "Single";

roomtype_option_labels['TSU'] = "Twin (Sole Use)";

roomtype_option_labels['TW'] = "Twin";

roomtype_option_labels['DB'] = "Double";







function changeHtmlContent(elementid,content){

  if (document.all) {

	  document.getElementById(elementid).innerHTML = content;

		}

  else if (document.getElementById){

    var rng = document.createRange();

    var el = document.getElementById(elementid);

    rng.setStartBefore(el);

    var htmlFrag = rng.createContextualFragment(content);

    while (el.hasChildNodes())

      el.removeChild(el.lastChild);

    el.appendChild(htmlFrag);

    }

  }







function makeArray()    {

    this[0] = arguments.length;

    for (var i = 0; i<arguments.length; i++) {

        this[i+1] = arguments[i];

				}

}







function LeapYear(year) {

    if ((year/4)   != Math.floor(year/4))   return false;

    if ((year/100) != Math.floor(year/100)) return true;

    if ((year/400) != Math.floor(year/400)) return false;

    return true;

}







function getYr(frm, in_out) {

	var now, year, month, day, chkInM, chkInD, chkInY, chkOutM, chkOutD, chkOutY;

	now = new Date;

	year = now.getFullYear();

	month = now.getMonth();

	day = now.getDate();

	

	chkInM = Number(frm.checkinMonth.value);

	chkInD = Number(frm.checkinDay.value);

	chkOutM = Number(frm.checkoutMonth.value);

	chkOutD = Number(frm.checkoutDay.value);

	

	chkInY = ((chkInM < month) || (chkInM==month && chkInD<day)) ? year+1 : year;

	chkOutY = ((chkOutM < chkInM) || (chkOutM==chkInM && chkOutD<=chkInD)) ? chkInY+1 : chkInY;



	if (in_out=='I') {return chkInY}

	else if (in_out=='O') {return chkOutY}

	else {return false}

}







function PopulateDay(objMnth, objDay, fYear)

	{

	var daySel = objDay.value;

	objDay.options.length=0;



	if (LeapYear(fYear)) var days = daysofmonthLY[objMnth.selectedIndex+1]; 

	else                 var days = daysofmonth[objMnth.selectedIndex+1];



	for (var intCounter=0;intCounter<days;intCounter++)

	{

	 objDay[intCounter] = new Option

			(intCounter+1,intCounter+1,false,false);

	}



	if (daySel > days) daySel = days;

	objDay.value = daySel;

	}







function PopulateNumDD(objDD, numOpts, sel) {

  var n = (arguments.length>3) ? arguments[3] : 1;

  objDD.options.length = numOpts;

	for (var i=0; i<numOpts; i++) {

		objDD[i] = new Option(i+n,i+n,(i+n==sel));

		}

	objDD.value = sel;

	}







function PopulateTypeDD(objDD, numAdults, sel) {

  if (numAdults>2) return false;

	var numOpts = roomtype_options[numAdults].length;

  objDD.options.length = numOpts;

	var ddVal, ddText;

	for (var i=0; i<numOpts; i++) {

	  ddVal = roomtype_options[numAdults][i];

		ddText = roomtype_option_labels[ddVal];

		objDD[i] = new Option(ddText, ddVal, (ddVal==sel));

		if (ddVal==sel) {

		  var setIndex = i;

			}

		}

	if (setIndex) {

	  objDD.selectedIndex = setIndex;

		}

	return true;

	}







function PopulateChildAgeDD(objDD, sel) {

  var numOpts = maxchildage+2;

  objDD.options.length = numOpts;

	objDD[0] = new Option('-',null,(sel==''));

	for (var i=1; i<numOpts; i++) {

		objDD[i] = new Option(i-1,i-1,(i-1==sel));

		}

	objDD.value = sel;

	}







function populateRoomsDDs(frmObj, roomsArray) {

	var numberOfChildren, childNum, numberOfAdults, roomArray, ddObj, objName;

	for (roomNumber in roomsArray) {

	  roomArray = roomsArray[roomNumber];

		

	  numberOfAdults = roomArray['numadults'];

		objName = 'room_' + roomNumber + '_numadults';

		eval("ddObj = frmObj." + objName);

		PopulateNumDD(ddObj, maxadults, numberOfAdults);

		

		objName = 'room_' + roomNumber + '_type';

		eval("ddObj = frmObj." + objName);

		PopulateTypeDD(ddObj, numberOfAdults, roomArray['type']);

		

		numberOfChildren = roomArray['numchildren'];

		objName = 'room_' + roomNumber + '_numchildren';

		eval("ddObj = frmObj." + objName);

		PopulateNumDD(ddObj, maxchildren+1, numberOfChildren, 0);

		for (childNum=0;childNum<numberOfChildren;childNum++) {

			objName = 'room_' + roomNumber + '_childage_' + childNum;

			eval("ddObj = frmObj." + objName);

			

			selAge = (roomArray['childages']) ? roomArray['childages'][childNum] : null;

			PopulateChildAgeDD(ddObj, selAge);

			//PopulateChildAgeDD(ddObj, roomArray['childages'][childNum]);

			}



		}

	}

	





function getstayLen(frm) {

  var checkoutYear = getYr(frm,'O');

	checkout_Object.setPicked(checkoutYear, frm.checkoutMonth.value, frm.checkoutDay.value);

	

	var chkIn = new Date(frm.checkinYear.value, frm.checkinMonth.value, frm.checkinDay.value);

	var chkOut = new Date(checkoutYear, frm.checkoutMonth.value, frm.checkoutDay.value);

	

	var diff = new Date(chkOut.getTime() - chkIn.getTime());

	frm.duration.value = Math.round(diff.getTime()/oneDay);

  frm.checkoutYear.value = checkoutYear;

	return frm.duration.value;

}







function updateCheckOut(frm, stayLen) {

	var now = new Date();

	var year = now.getFullYear();

	var month = now.getMonth();

	var day = now.getDate();

	

	var chkInM = frm.checkinMonth.value;

	var chkInD = frm.checkinDay.value;

	var chkInY = getYr(frm,'I');

	if (frm.checkinYear.value != chkInY)

	{

		frm.checkinYear.value = chkInY;

		checkin_Object.setPicked(frm.checkinYear.value, frm.checkinMonth.value, frm.checkinDay.value)

	}

	

	var chkIn = new Date(chkInY, chkInM, chkInD);

	initCheckOut(frm, chkIn, stayLen);

	checkout_Object.setPicked(frm.checkoutYear.value, frm.checkoutMonth.value, frm.checkoutDay.value);

}







function initCheckOut(frm, chkIn, stayLen) {

/* frm : form object

   chkIn : Date object

	 stayLen : integer */

// this assignment has problems when it comes to daylight savings times
//	var chkOut = new Date(chkIn.getTime() + stayLen*oneDay);

// this one seems to be fine - eg December 42nd 2009 = January 11th 2010
	var chkOut = new Date(chkIn.getFullYear(), chkIn.getMonth(), Number(stayLen) + chkIn.getDate());

	

	frm.checkoutYear.value = chkOut.getFullYear();

	frm.checkoutMonth.value = chkOut.getMonth();

	PopulateDay(frm.checkoutMonth, frm.checkoutDay, frm.checkoutYear.value);

	frm.checkoutDay.value = chkOut.getDate();

}







function createChildAgeDDs(index) {

  var childCount = roomsArray[index]['numchildren'];

	if (childCount > 0) {

	  var selHtml = '';

		for (childNum=0;childNum<childCount;childNum++) {

			var objName = 'room_' + String(index) + '_childage_' + String(childNum);

		  selHtml += '<div class="form_seg" style="border:none"><div class="form_seg_label">Child Age: </div>' +

			           '<div class="form_seg_item"><select name="' + objName +

								 '" onChange="roomsArray[' + String(index) +

								 '][\'childages\'][' + childNum + ']=this.value;"></select></div></div>';

			}

		return selHtml;

		}

	else {

		return '';

		}

	}







function createTypeDD(index) {

  var adultCount = roomsArray[index]['numadults'];

	var selHtml = (adultCount>2) ? '' :

								'<div class="form_seg"><div class="form_seg_label">Room Type:&nbsp;</div>' +

								'<div class="form_seg_item" style="float:right;"><select name="room_' + String(index) +

								'_type" onChange="roomsArray[' + String(index) +

								'][\'type\']=this.value;"></select></div></div>';

	return selHtml;

	}







function getRoomHTML(index) {

// header row if more than one room

  var htmlStr = '<div class="form_seg_block_label" style="font-weight:bold;margin-top:5px;">';

	if (roomsArray.length > 1)

	{

		htmlStr += 'Room ' + (index+1);

	}

	htmlStr += '</div>';

	

// #adults and roomtype row

  htmlStr += '<div class="form_seg"><div class="form_seg_label">Number of Adults</div>' +

	           '<div class="form_seg_item" style="float:right;"><select name="room_' +

	           String(index) + '_numadults" onChange="roomsArray[' +

						 String(index) + '][\'numadults\']=this.value;' +

						 'formRooms(this.form,\'roomDetail\',roomsArray,roomsArray.length);return true;">' +

						 '</select></div></div>';

  htmlStr += createTypeDD(index);



// #kids and child ages row

  htmlStr += '<div class="form_seg"><div class="form_seg_label">Number of Children</div>' +

	           '<div class="form_seg_item" style="float:right;"><select name="room_' +

	           String(index) + '_numchildren" onChange="roomsArray[' +

						 String(index) + '][\'numchildren\']=this.value;' +

						 'formRooms(this.form,\'roomDetail\',roomsArray,roomsArray.length);return true;">' +

						 '</select></div></div>';

  htmlStr += createChildAgeDDs(index);

	return htmlStr;

	}







function formRoomsHtml(numRooms) {

	var html = '';

  var existingRooms = roomsArray.length;

	if (numRooms < existingRooms) {

	  deleteRoom(roomsArray, (existingRooms-numRooms));

		}

	else if (numRooms > existingRooms) {

	  addNewRoom(roomsArray, (numRooms-existingRooms));

		}

	var i=0;

	while (i<numRooms) {

	  html += getRoomHTML(i);

		i++;

		}

	return html;

	}





function createRoom(numAdults, roomType, numKids) {



	var room = new Array();

	if (createRoom.arguments.length == 0) {

		numAdults = default_numadults;

		roomType = roomtype_options[default_numadults][0];

		numKids = default_numchildren;

	}



	room['numadults'] = numAdults;

	room['type'] = roomType;

	room['numchildren'] = numKids;

	room['childages'] = new Array();



	return room;



	}







/*

function createRoom() {

	var room = new Array();

	room['numadults'] = default_numadults;

	room['numchildren'] = default_numchildren;

	room['type'] = roomtype_options[default_numadults][0];

	room['childages'] = new Array();

	return room;

	}

*/





function addNewRoom(roomsArr) {

  var i = (arguments.length>1) ? arguments[1] : 1;

	while (i>0) {

		var numRooms = roomsArr.length;

		roomsArr[numRooms] = createRoom();

		i--;

		}

	return roomsArr;

	}







function deleteRoom(roomsArr) {

  var i = (arguments.length>1) ? arguments[1] : 1;

	while (i>0) {

		var numRooms = roomsArr.length;

		roomsArr[numRooms-1] = null;

		roomsArr.length--;

		i--;

    }

	return roomsArr;

	}







function initRooms(roomsArr) {

  var numRooms = roomsArr.length;

	for (var i=0;i<numRooms;i++) {

		roomsArr[i] = createRoom();

		}

	return roomsArr;

	}







function initForm(frm, divName, yrNum, moNum, dayNum, roomArr) {

	if (document.forms.length > 0) {

		var now = new Date;

		if (arguments.length < 3) {

			var chkIn = new Date(now.getTime() + 14*oneDay); // default checkIn to 2 weeks from now

		}

		else {

			var chkIn = new Date(yrNum, moNum, dayNum);

		}



		frm.checkinYear.value = chkIn.getFullYear();

		frm.checkinMonth.value = chkIn.getMonth();

		PopulateDay(frm.checkinMonth, frm.checkinDay, frm.checkinYear.value);

		frm.checkinDay.value = chkIn.getDate();

		checkin_Object.setPicked(frm.checkinYear.value, frm.checkinMonth.value, frm.checkinDay.value);

		

		frm.duration.value = stayLen;

		initCheckOut(frm, chkIn, stayLen);

		checkout_Object.setPicked(frm.checkoutYear.value, frm.checkoutMonth.value, frm.checkoutDay.value);

		

		if (arguments.length < 6) {


			var numRooms = default_numrooms;

			var roomArr = new Array(numRooms);

			roomsArray = initRooms(roomArr);

		}

		else {

			var numRooms = roomArr.length;

		}

		PopulateNumDD(frm.numrooms, maxrooms, numRooms, 1);

		formRooms(frm, divName, roomArr, numRooms);

		frm.numrooms[frm.numrooms.options.length] = new Option((maxrooms+1) + "+", 0);

	}

}







function formRooms(frmObj, divName, roomsArr, numRooms) {

	changeHtmlContent(divName,formRoomsHtml(numRooms));

	populateRoomsDDs(frmObj, roomsArr);

	return true;

}







function postHTTPdata(url) 

{

	var data = (arguments.length > 1) ? arguments[1] : null;

	// branch for native XMLHttpRequest object

	if (window.XMLHttpRequest)

	{

		req = new XMLHttpRequest();

	// branch for IE/Windows ActiveX version

	}

	else if (window.ActiveXObject)

	{

		try

		{

				req = new ActiveXObject("Msxml2.XMLHTTP");

		} catch (e)

			{

				try

				{

						req = new ActiveXObject("Microsoft.XMLHTTP");

				} catch (e) { return true; }

			}

	}

	if (req)

	{

		req.open('POST', url, true);

		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

		req.send(data);

	}

	return true;

}







function validateForm(frmObj)

{

	var errArr = new Array();

	var Today = new Date();

	if (checkin_Object.picked.date < Today)

	{

		errArr[errArr.length] = "You must choose a check-in date in the future!";

	}

	if ((frmObj.duration.value < 1) || (frmObj.duration.value > 21))

	{

		errArr[errArr.length] = "Your stay length can be from 1 night up to a maximum of 21 nights";

	}

	var objPrefix = '';

	var numKids = false;

	var testVal = 0;

	var kidAgeObjName = '';

	for (var i=0;i<frmObj.numrooms.value;i++)

	{

		objPrefix = 'room_' + i + '_';

		eval ('numKids = frmObj.' + objPrefix + 'numchildren.value;');

		if (numKids > 0)

		{

			for (j=0;j<numKids;j++)

			{

				eval ('testVal = frmObj.' + objPrefix + 'childage_' + j + '.value;');

				if (!testVal || testVal==null || testVal=='null')

				{

					errArr[errArr.length] = "Please specify an age for child " + (j+1) + " in room " + (i+1);

				}

			}

		}

	}

	if (errArr.length > 0)

	{

		var errString = '';

		for (i in errArr)

		{

			errString += errArr[i] + "\n";

		}

		var pronounPart = (errArr.length > 1) ? 'these fields' : 'this field';

		errString += "\nPlease amend " + pronounPart +  " and try submitting your request again";

	  alert (errString);

		formValidated = false;

		return false;

	}

	else

	{

		if (frmObj.numrooms.value == 0)

		{

		/* ----------------------------------------------------

				 CHANGE THIS TO GO TO A *SPECIAL* FORM FOR GROUPS

			 ---------------------------------------------------- */

			frmObj.action = '/request/savegroupsession.php';

		}

		/*

		Pretty sure we no longer use thes or even if it ever worked... GD 7/4/09

		postHTTPdata('/request/logsearchsubmit.php',

								 'checksum=' + frmObj.checksum.value + '&formpage=' + frmObj.formpage.value);

		*/

		var qStr = '';

		var concatChar = '';

		var argMatch = /^(formpage|checksum|checkin(Month|Day|Year)|duration|numrooms|room_\d_\w+)$/;

		for (i=0; i<frmObj.elements.length; i++)

		{

			if (argMatch.test(frmObj.elements[i].name))

			{

				qStr += concatChar + frmObj.elements[i].name + '=' + frmObj.elements[i].value;

				concatChar = '&';

			}

		}

		document.cookie = 'savedForm=' + encodeURI(qStr);

		frmObj.day.value = frmObj.checkinDay.value;

		frmObj.month.value = (Number(frmObj.checkinMonth.value)+1);

		frmObj.year.value = frmObj.checkinYear.value;

		return true;

	}

	}



/* -------------------------------- end form funcs ---------------------------*/


/***********************************************

 Fool-Proof Date Input Script with DHTML Calendar

 by Jason Moon - calendar@moonscript.com

 

 modified by Gavin Deas for use on justonehotel.com

 ************************************************/



var checkin_Object, checkout_Object, checkin_ID_Timer, checkout_ID_Timer;



// Customizable variables

var DefaultDateFormat = 'MM/DD/YYYY'; // If no date format is supplied, this will be used instead

var HideWait = 3; // Number of seconds before the calendar will disappear

var UnselectedMonthText = ''; // Text to display in the 1st month list item when the date isn't required

var FontSize = 11; // In pixels

var FontFamily = 'Tahoma';

var CellWidth = 18;

var CellHeight = 16;

var ImageURL = 'http://static.justonehotel.com/templates/j1h-default/images/calendar.jpg';

var NextURL = 'http://static.justonehotel.com/templates/j1h-default/images/next.gif';

var PrevURL = 'http://static.justonehotel.com/templates/j1h-default/images/prev.gif';

var CalBGColor = 'white';

var TopRowBGColor = 'buttonface';

var DayBGColor = 'lightgrey';



// Global variables

var ZCounter = 100;

var Today = new Date();

var Y2kPivotPoint = (Today.getFullYear()-1)%100; // 2-digit years before this point will be created in the 22nd century

var WeekDays = new Array('S','M','T','W','T','F','S');

var MonthDays = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

var MonthNames = new Array('January','February','March','April','May','June','July','August','September','October','November','December');



// Write out the stylesheet definition for the calendar

with (document) {

   writeln('<style>');

   writeln('td.calendarDateInput {letter-spacing:normal;line-height:normal;font-family:' + FontFamily + ',Sans-Serif;font-size:' + FontSize + 'px;}');

   writeln('select.calendarDateInput {letter-spacing:.06em;font-family:Verdana,Sans-Serif;font-size:11px;}');

   writeln('input.calendarDateInput {letter-spacing:.06em;font-family:Verdana,Sans-Serif;font-size:11px;}');

   writeln('</style>');

}



// Only allows certain keys to be used in the date field

function YearDigitsOnly(e) {

   var KeyCode = (e.keyCode) ? e.keyCode : e.which;

   return ((KeyCode == 8) // backspace

        || (KeyCode == 9) // tab

        || (KeyCode == 37) // left arrow

        || (KeyCode == 39) // right arrow

        || (KeyCode == 46) // delete

        || ((KeyCode > 47) && (KeyCode < 58)) // 0 - 9

   );

}



// Gets the absolute pixel position of the supplied element

function GetTagPixels(StartTag, Direction) {

   var PixelAmt = (Direction == 'LEFT') ? StartTag.offsetLeft : StartTag.offsetTop;

   while ((StartTag.tagName != 'BODY') && (StartTag.tagName != 'HTML')) {

      StartTag = StartTag.offsetParent;

      PixelAmt += (Direction == 'LEFT') ? StartTag.offsetLeft : StartTag.offsetTop;

   }

   return PixelAmt;

}



// Is the specified select-list behind the calendar?

function BehindCal(SelectList, CalLeftX, CalRightX, CalTopY, CalBottomY, ListTopY) {

   var ListLeftX = GetTagPixels(SelectList, 'LEFT');

   var ListRightX = ListLeftX + SelectList.offsetWidth;

   var ListBottomY = ListTopY + SelectList.offsetHeight;

   return (((ListTopY < CalBottomY) && (ListBottomY > CalTopY)) && ((ListLeftX < CalRightX) && (ListRightX > CalLeftX)));

}



// For IE, hides any select-lists that are behind the calendar

function FixSelectLists(Over) {

   if (navigator.appName == 'Microsoft Internet Explorer') {

      var CalDiv = this.getCalendar();

      var CalLeftX = CalDiv.offsetLeft;

      var CalRightX = CalLeftX + CalDiv.offsetWidth;

      var CalTopY = CalDiv.offsetTop;

      var CalBottomY = CalTopY + (CellHeight * 9);

      var FoundCalInput = false;

      formLoop :

      for (var j=this.formNumber;j<document.forms.length;j++) {

         for (var i=0;i<document.forms[j].elements.length;i++) {

            if (typeof document.forms[j].elements[i].type == 'string') {

               if ((document.forms[j].elements[i].type == 'hidden') && (document.forms[j].elements[i].name == this.hiddenFieldName)) {

                  FoundCalInput = true;

                  i += 3; // 3 elements between the 1st hidden field and the last year input field

               }

               if (FoundCalInput) {

                  if (document.forms[j].elements[i].type.substr(0,6) == 'select') {

                     ListTopY = GetTagPixels(document.forms[j].elements[i], 'TOP');

                     if (ListTopY < CalBottomY) {

                        if (BehindCal(document.forms[j].elements[i], CalLeftX, CalRightX, CalTopY, CalBottomY, ListTopY)) {

                           document.forms[j].elements[i].style.visibility = (Over) ? 'hidden' : 'visible';

                        }

                     }

                     else break formLoop;

                  }

               }

            }

         }

      }

   }

}



// Displays a message in the status bar when hovering over the calendar days

function DayCellHover(Cell, Over, Color, HoveredDay) {

   Cell.style.backgroundColor = (Over) ? DayBGColor : Color;

   if (Over) {

      if ((this.yearValue == Today.getFullYear()) && (this.monthIndex == Today.getMonth()) && (HoveredDay == Today.getDate())) self.status = 'Click to select today';

      else {

         var Suffix = HoveredDay.toString();

         switch (Suffix.substr(Suffix.length - 1, 1)) {

            case '1' : Suffix += (HoveredDay == 11) ? 'th' : 'st'; break;

            case '2' : Suffix += (HoveredDay == 12) ? 'th' : 'nd'; break;

            case '3' : Suffix += (HoveredDay == 13) ? 'th' : 'rd'; break;

            default : Suffix += 'th'; break;

         }

         self.status = 'Click to select ' + this.monthName + ' ' + Suffix;

      }

   }

   else self.status = '';

   return true;

}



// Sets the form elements after a day has been picked from the calendar

function PickDisplayDay(ClickedDay) {

   this.show();

   var MonthList = this.getMonthList();

   var DayList = this.getDayList();

   var YearField = this.getYearField();

   FixDayList(DayList, GetDayCount(this.displayed.yearValue, this.displayed.monthIndex));

   // Select the month and day in the lists

   for (var i=0;i<MonthList.length;i++) {

      if (MonthList.options[i].value == this.displayed.monthIndex) MonthList.options[i].selected = true;

   }

   for (var j=1;j<=DayList.length;j++) {

      if (j == ClickedDay) DayList.options[j-1].selected = true;

   }

   this.setPicked(this.displayed.yearValue, this.displayed.monthIndex, ClickedDay);

	 

	 // set form fields based on new values

	 conditionalCalendarClick(this.objName);

   

	 // Change the year, if necessary

   YearField.value = this.picked.yearPad;

   YearField.defaultValue = YearField.value;

}



// Builds the HTML for the calendar days

function BuildCalendarDays() {

	 var Day, TextStyle, BackColor

   var Rows = 5;

   if (((this.displayed.dayCount == 31) && (this.displayed.firstDay > 4)) || ((this.displayed.dayCount == 30) && (this.displayed.firstDay == 6))) Rows = 6;

   else if ((this.displayed.dayCount == 28) && (this.displayed.firstDay == 0)) Rows = 4;

   var HTML = '<table width="' + (CellWidth * 7) + '" cellspacing="0" cellpadding="1" style="cursor:default">';

   for (var j=0;j<Rows;j++) {

      HTML += '<tr>';

      for (var i=1;i<=7;i++) {

         Day = (j * 7) + (i - this.displayed.firstDay);

         if ((Day >= 1) && (Day <= this.displayed.dayCount)) {

            if ((this.displayed.yearValue == this.picked.yearValue) && (this.displayed.monthIndex == this.picked.monthIndex) && (Day == this.picked.day)) {

               TextStyle = 'color:white;font-weight:bold;'

               BackColor = DayBGColor;

            }

            else {

               TextStyle = 'color:black;'

               BackColor = CalBGColor;

            }

            if ((this.displayed.yearValue == Today.getFullYear()) && (this.displayed.monthIndex == Today.getMonth()) && (Day == Today.getDate())) TextStyle += 'border:1px solid darkred;padding:0px;';

            HTML += '<td align="center" class="calendarDateInput" style="cursor:default;height:' + CellHeight + 'px;width:' + CellWidth + 'px;' + TextStyle + ';background-color:' + BackColor + '" onClick="' + this.objName + '.pickDay(' + Day + ')" onMouseOver="return ' + this.objName + '.displayed.dayHover(this,true,\'' + BackColor + '\',' + Day + ')" onMouseOut="return ' + this.objName + '.displayed.dayHover(this,false,\'' + BackColor + '\')">' + Day + '</td>';

         }

         else HTML += '<td class="calendarDateInput" style="height:' + CellHeight + 'px">&nbsp;</td>';

      }

      HTML += '</tr>';

   }

   return HTML += '</table>';

}



// Determines which century to use (21st or 22nd) when dealing with 2-digit years

function GetGoodYear(YearDigits) {

		var twoDigityear = (YearDigits % 100);

		var Millennium = (twoDigityear > Y2kPivotPoint) ? 2000 : 2100;

		return Millennium + parseInt(twoDigityear,10);

}



// Returns the number of days in a month (handles leap-years)

function GetDayCount(SomeYear, SomeMonth) {

   return ((SomeMonth == 1) && ((SomeYear % 400 == 0) || ((SomeYear % 4 == 0) && (SomeYear % 100 != 0)))) ? 29 : MonthDays[SomeMonth];

}



// Highlights the buttons

function VirtualButton(Cell, ButtonDown) {

   if (ButtonDown) {

      Cell.style.borderLeft = 'buttonshadow 1px solid';

      Cell.style.borderTop = 'buttonshadow 1px solid';

      Cell.style.borderBottom = 'buttonhighlight 1px solid';

      Cell.style.borderRight = 'buttonhighlight 1px solid';

   }

   else {

      Cell.style.borderLeft = 'buttonhighlight 1px solid';

      Cell.style.borderTop = 'buttonhighlight 1px solid';

      Cell.style.borderBottom = 'buttonshadow 1px solid';

      Cell.style.borderRight = 'buttonshadow 1px solid';

   }

}



// Mouse-over for the previous/next month buttons

function NeighborHover(Cell, Over, DateObj) {

   if (Over) {

      VirtualButton(Cell, false);

      self.status = 'Click to view ' + DateObj.fullName;

   }

   else {

      Cell.style.border = 'buttonface 1px solid';

      self.status = '';

   }

   return true;

}



// Adds/removes days from the day list, depending on the month/year

function FixDayList(DayList, NewDays) {

   var DayPick = DayList.selectedIndex + 1;

   if (NewDays != DayList.length) {

      var OldSize = DayList.length;

      for (var k=Math.min(NewDays,OldSize);k<Math.max(NewDays,OldSize);k++) {

         (k >= NewDays) ? DayList.options[NewDays] = null : DayList.options[k] = new Option(k+1, k+1);

      }

      DayPick = Math.min(DayPick, NewDays);

      DayList.options[DayPick-1].selected = true;

   }

   return DayPick;

}



// Resets the year to its previous valid value when something invalid is entered

function FixYearInput(YearField) {

   var YearRE = new RegExp('\\d{' + YearField.defaultValue.length + '}');

   if (!YearRE.test(YearField.value)) YearField.value = YearField.defaultValue;

}



// Displays a message in the status bar when hovering over the calendar icon

function CalIconHover(Over) {

   var Message = (this.isShowing()) ? 'hide' : 'show';

   self.status = (Over) ? 'Click to ' + Message + ' the calendar' : '';

   return true;

}



// Starts the timer over from scratch

function CalTimerReset() {

   eval('clearTimeout(' + this.timerID + ')');

   eval(this.timerID + '=setTimeout(\'' + this.objName + '.show(true)\',' + (HideWait * 1000) + ')');

}



// The timer for the calendar

function DoTimer(CancelTimer) {

   if (CancelTimer) eval('clearTimeout(' + this.timerID + ')');

   else {

      eval(this.timerID + '=null');

      this.resetTimer();

   }

}



// Show or hide the calendar


function ShowCalendar(hide) {

   if (hide || this.isShowing()) {

      var StopTimer = true;

      this.getCalendar().style.zIndex = --ZCounter;

      this.getCalendar().style.visibility = 'hidden';

      this.fixSelects(false);

   }

   else {

      var StopTimer = false;

      this.fixSelects(true);

      this.getCalendar().style.zIndex = ++ZCounter;

      this.getCalendar().style.visibility = 'visible';

   }

   this.handleTimer(StopTimer);

   self.status = '';

}



// Hides the input elements when the "blank" month is selected

function SetElementStatus(Hide) {

   this.getDayList().style.visibility = (Hide) ? 'hidden' : 'visible';

   this.getYearField().style.visibility = (Hide) ? 'hidden' : 'visible';

   this.getCalendarLink().style.visibility = (Hide) ? 'hidden' : 'visible';

}



// Sets the date, based on the month selected

function CheckMonthChange(MonthList) {

   var DayList = this.getDayList();

   if (MonthList.options[MonthList.selectedIndex].value == '') {

      DayList.selectedIndex = 0;

      this.hideElements(true);

      this.setHidden('');

   }

   else {

      this.hideElements(false);

      if (this.isShowing()) {

         this.resetTimer(); // Gives the user more time to view the calendar with the newly-selected month

         this.getCalendar().style.zIndex = ++ZCounter; // Make sure this calendar is on top of any other calendars

      }

			var now = new Date();

			var selDate = new Date(

				this.picked.yearValue, MonthList.options[MonthList.selectedIndex].value, DayList.selectedIndex + 1

				);

			var selYear = (selDate < now) ? this.picked.yearValue + 1 : this.picked.yearValue;

      var DayPick = FixDayList(DayList, GetDayCount(selYear, MonthList.options[MonthList.selectedIndex].value));

      this.setPicked(selYear, MonthList.options[MonthList.selectedIndex].value, DayPick);

   }

}



// Sets the date, based on the day selected

function CheckDayChange(DayList) {

   if (this.isShowing()) this.show();

   this.setPicked(this.picked.yearValue, this.picked.monthIndex, DayList.selectedIndex+1);

}



// Changes the date when a valid year has been entered

function CheckYearInput(YearField) {

   if ((YearField.value.length == YearField.defaultValue.length) && (YearField.defaultValue != YearField.value)) {

      if (this.isShowing()) {

         this.resetTimer(); // Gives the user more time to view the calendar with the newly-entered year

         this.getCalendar().style.zIndex = ++ZCounter; // Make sure this calendar is on top of any other calendars

      }

      var NewYear = GetGoodYear(YearField.value);

      var MonthList = this.getMonthList();

      var NewDay = FixDayList(this.getDayList(), GetDayCount(NewYear, this.picked.monthIndex));

      this.setPicked(NewYear, this.picked.monthIndex, NewDay);

      YearField.defaultValue = YearField.value;

   }

}



// Holds characteristics about a date

function dateObject() {

   if (Function.call) { // Used when 'call' method of the Function object is supported

      var ParentObject = this;

      var ArgumentStart = 0;

   }

   else { // Used with 'call' method of the Function object is NOT supported

      var ParentObject = arguments[0];

      var ArgumentStart = 1;

   }

   ParentObject.date = (arguments.length == (ArgumentStart+1)) ? new Date(arguments[ArgumentStart+0]) : new Date(arguments[ArgumentStart+0], arguments[ArgumentStart+1], arguments[ArgumentStart+2]);

   ParentObject.yearValue = ParentObject.date.getFullYear();

   ParentObject.monthIndex = ParentObject.date.getMonth();

   ParentObject.monthName = MonthNames[ParentObject.monthIndex];

   ParentObject.fullName = ParentObject.monthName + ' ' + ParentObject.yearValue;

   ParentObject.day = ParentObject.date.getDate();

   ParentObject.dayCount = GetDayCount(ParentObject.yearValue, ParentObject.monthIndex);

   var FirstDate = new Date(ParentObject.yearValue, ParentObject.monthIndex, 1);

   ParentObject.firstDay = FirstDate.getDay();

}



// Keeps track of the date that goes into the hidden field

function storedMonthObject(DateFormat, DateYear, DateMonth, DateDay) {

   (Function.call) ? dateObject.call(this, DateYear, DateMonth, DateDay) : dateObject(this, DateYear, DateMonth, DateDay);

   this.yearPad = this.yearValue.toString();

   this.monthPad = (this.monthIndex < 9) ? '0' + String(this.monthIndex + 1) : this.monthIndex + 1;

   this.dayPad = (this.day < 10) ? '0' + this.day.toString() : this.day;

   // fix for safari problem when monthName is undefined

   if (!this.monthName)

   {this.monthName=""};



   this.monthShort = this.monthName.substr(0,3).toUpperCase();

   // Formats the year with 2 digits instead of 4

   if (DateFormat.indexOf('YYYY') == -1) this.yearPad = this.yearPad.substr(2);

   // Define the date-part delimiter

   if (DateFormat.indexOf('/') >= 0) var Delimiter = '/';

   else if (DateFormat.indexOf('-') >= 0) var Delimiter = '-';

   else var Delimiter = '';

   // Determine the order of the months and days

   if (/DD?.?((MON)|(MM?M?))/.test(DateFormat)) {

      this.formatted = this.dayPad + Delimiter;

      this.formatted += (RegExp.$1.length == 3) ? this.monthShort : this.monthPad;

   }

   else if (/((MON)|(MM?M?))?.?DD?/.test(DateFormat)) {

      this.formatted = (RegExp.$1.length == 3) ? this.monthShort : this.monthPad;

      this.formatted += Delimiter + this.dayPad;

   }

   // Either prepend or append the year to the formatted date

   this.formatted = (DateFormat.substr(0,2) == 'YY') ? this.yearPad + Delimiter + this.formatted : this.formatted + Delimiter + this.yearPad;

}



// Object for the current displayed month

function displayMonthObject(ParentObject, DateYear, DateMonth, DateDay) {

   (Function.call) ? dateObject.call(this, DateYear, DateMonth, DateDay) : dateObject(this, DateYear, DateMonth, DateDay);

   this.displayID = ParentObject.hiddenFieldName + '_Current_ID';

   this.getDisplay = new Function('return document.getElementById(this.displayID)');

   this.dayHover = DayCellHover;

   this.goCurrent = new Function(ParentObject.objName + '.getCalendar().style.zIndex=++ZCounter;' + ParentObject.objName + '.setDisplayed(Today.getFullYear(),Today.getMonth());');

   if (ParentObject.formNumber >= 0) this.getDisplay().innerHTML = this.fullName;

}



// Object for the previous/next buttons

function neighborMonthObject(ParentObject, IDText, DateMS) {

   (Function.call) ? dateObject.call(this, DateMS) : dateObject(this, DateMS);

   this.buttonID = ParentObject.hiddenFieldName + '_' + IDText + '_ID';

   this.hover = new Function('C','O','NeighborHover(C,O,this)');

   this.getButton = new Function('return document.getElementById(this.buttonID)');

   this.go = new Function(ParentObject.objName + '.getCalendar().style.zIndex=++ZCounter;' + ParentObject.objName + '.setDisplayed(this.yearValue,this.monthIndex);');

   if (ParentObject.formNumber >= 0) this.getButton().title = this.monthName;

}



// Sets the currently-displayed month object

function SetDisplayedMonth(DispYear, DispMonth) {

   this.displayed = new displayMonthObject(this, DispYear, DispMonth, 1);

   // Creates the previous and next month objects

   this.previous = new neighborMonthObject(this, 'Previous', this.displayed.date.getTime() - 86400000);

   this.next = new neighborMonthObject(this, 'Next', this.displayed.date.getTime() + (86400000 * (this.displayed.dayCount + 1)));

   // Creates the HTML for the calendar

   if (this.formNumber >= 0) this.getDayTable().innerHTML = this.buildCalendar();

}



// Sets the current selected date

function SetPickedMonth(PickedYear, PickedMonth, PickedDay) {

   this.picked = new storedMonthObject(this.format, PickedYear, PickedMonth, PickedDay);

   this.setHidden(this.picked.formatted);

   this.setDisplayed(PickedYear, PickedMonth);

}



// The calendar object


function calendarObject(DateName, DateFormat, DefaultDate) {



   /* Properties */

   this.hiddenFieldName = DateName;

   this.monthListID = DateName + '_Month_ID';

   this.dayListID = DateName + '_Day_ID';

   this.yearFieldID = DateName + '_Year_ID';

   this.monthDisplayID = DateName + '_Current_ID';

   this.calendarID = DateName + '_ID';

   this.dayTableID = DateName + '_DayTable_ID';

   this.calendarLinkID = this.calendarID + '_Link';

   this.timerID = this.calendarID + '_Timer';

   this.objName = DateName + '_Object';

   this.format = DateFormat;

   this.formNumber = -1;

   this.picked = null;

   this.displayed = null;

   this.previous = null;

   this.next = null;



   /* Methods */

   this.setPicked = SetPickedMonth;

   this.setDisplayed = SetDisplayedMonth;

   this.checkYear = CheckYearInput;

   this.fixYear = FixYearInput;

   this.changeMonth = CheckMonthChange;

   this.changeDay = CheckDayChange;

   this.resetTimer = CalTimerReset;

   this.hideElements = SetElementStatus;

   this.show = ShowCalendar;

   this.handleTimer = DoTimer;

   this.iconHover = CalIconHover;

   this.buildCalendar = BuildCalendarDays;

   this.pickDay = PickDisplayDay;

   this.fixSelects = FixSelectLists;

   this.setHidden = new Function('D','if (this.formNumber >= 0) this.getHiddenField().value=D');

   // Returns a reference to these elements

   this.getHiddenField = new Function('return document.forms[this.formNumber].elements[this.hiddenFieldName]');

   this.getMonthList = new Function('return document.getElementById(this.monthListID)');

   this.getDayList = new Function('return document.getElementById(this.dayListID)');

   this.getYearField = new Function('return document.getElementById(this.yearFieldID)');

   this.getCalendar = new Function('return document.getElementById(this.calendarID)');

   this.getDayTable = new Function('return document.getElementById(this.dayTableID)');

   this.getCalendarLink = new Function('return document.getElementById(this.calendarLinkID)');

   this.getMonthDisplay = new Function('return document.getElementById(this.monthDisplayID)');

   this.isShowing = new Function('return !(this.getCalendar().style.visibility != \'visible\')');



   /* Constructor */

   // Functions used only by the constructor

   function getMonthIndex(MonthAbbr) { // Returns the index (0-11) of the supplied month abbreviation

      for (var MonPos=0;MonPos<MonthNames.length;MonPos++) {

         if (MonthNames[MonPos].substr(0,3).toUpperCase() == MonthAbbr.toUpperCase()) break;

      }

      return MonPos;

   }

   function SetGoodDate(CalObj, Notify) { // Notifies the user about their bad default date, and sets the current system date

      CalObj.setPicked(Today.getFullYear(), Today.getMonth(), Today.getDate());

      if (Notify) alert('WARNING: The supplied date is not in valid \'' + DateFormat + '\' format: ' + DefaultDate + '.\nTherefore, the current system date will be used instead: ' + CalObj.picked.formatted);

   }

   // Main part of the constructor

   if (DefaultDate != '') {

      if ((this.format == 'YYYYMMDD') && (/^(\d{4})(\d{2})(\d{2})$/.test(DefaultDate))) this.setPicked(RegExp.$1, parseInt(RegExp.$2,10)-1, RegExp.$3);

      else {

         // Get the year

         if ((this.format.substr(0,2) == 'YY') && (/^(\d{2,4})(-|\/)/.test(DefaultDate))) { // Year is at the beginning

            var YearPart = GetGoodYear(RegExp.$1);

            // Determine the order of the months and days

            if (/(-|\/)(\w{1,3})(-|\/)(\w{1,3})$/.test(DefaultDate)) {

               var MidPart = RegExp.$2;

               var EndPart = RegExp.$4;

               if (/D$/.test(this.format)) { // Ends with days

                  var DayPart = EndPart;

                  var MonthPart = MidPart;

               }

               else {

                  var DayPart = MidPart;

                  var MonthPart = EndPart;

               }

               MonthPart = (/\d{1,2}/i.test(MonthPart)) ? parseInt(MonthPart,10)-1 : getMonthIndex(MonthPart);

               this.setPicked(YearPart, MonthPart, DayPart);

            }

            else SetGoodDate(this, true);

         }

         else if (/(-|\/)(\d{2,4})$/.test(DefaultDate)) { // Year is at the end

            var YearPart = GetGoodYear(RegExp.$2);

            // Determine the order of the months and days

            if (/^(\w{1,3})(-|\/)(\w{1,3})(-|\/)/.test(DefaultDate)) {

               if (this.format.substr(0,1) == 'D') { // Starts with days

                  var DayPart = RegExp.$1;

                  var MonthPart = RegExp.$3;

               }

               else { // Starts with months

                  var MonthPart = RegExp.$1;

                  var DayPart = RegExp.$3;

               }

               MonthPart = (/\d{1,2}/i.test(MonthPart)) ? parseInt(MonthPart,10)-1 : getMonthIndex(MonthPart);

               this.setPicked(YearPart, MonthPart, DayPart);

            }

            else SetGoodDate(this, true);

         }

         else SetGoodDate(this, true);

      }

   }

}





// Function specific to checkin/checkout dates to provide appropriate onchange params

function conditionalCalendarClick(objName) {

	switch (objName) {

		case 'checkin_Object' :

		  updateCheckOut(document.forms.frm_Search, stayLen);

			break;

		case 'checkout_Object' :

		  stayLen=getstayLen(document.forms.frm_Search);

			break;

		default :

		  var retStr = '';

	}

	return retStr;

}



// Function specific to checkin/checkout dates to provide appropriate onchange params

function conditionalOnChange(dateType) {

	switch (dateType) {

		case 'checkin' :

		  var retStr = 'updateCheckOut(this.form, stayLen);';

			break;

		case 'checkout' :

		  var retStr = 'stayLen=getstayLen(this.form);';

			break;

		default :

		  var retStr = '';

	}

	return retStr;

}



// Main function that creates the form elements

function DateInput(DateName, Required, DateFormat, DefaultDate) {

   if (arguments.length == 0) document.writeln('<span style="color:red;font-size:' + FontSize + 'px;font-family:' + FontFamily + ';">ERROR: Missing required parameter in call to \'DateInput\': [name of hidden date field].</span>');

   else {

      // Handle DateFormat

      if (arguments.length < 3) { // The format wasn't passed in, so use default

         DateFormat = DefaultDateFormat;

         if (arguments.length < 2) Required = false;

      }

      else if (/^(Y{2,4}(-|\/)?)?((MON)|(MM?M?)|(DD?))(-|\/)?((MON)|(MM?M?)|(DD?))((-|\/)Y{2,4})?$/i.test(DateFormat)) DateFormat = DateFormat.toUpperCase();

      else { // Passed-in DateFormat was invalid, use default format instead

         var AlertMessage = 'WARNING: The supplied date format for the \'' + DateName + '\' field is not valid: ' + DateFormat + '\nTherefore, the default date format will be used instead: ' + DefaultDateFormat;

         DateFormat = DefaultDateFormat;

         if (arguments.length == 4) { // DefaultDate was passed in with an invalid date format

            var CurrentDate = new storedMonthObject(DateFormat, Today.getFullYear(), Today.getMonth(), Today.getDate());

            AlertMessage += '\n\nThe supplied date (' + DefaultDate + ') cannot be interpreted with the invalid format.\nTherefore, the current system date will be used instead: ' + CurrentDate.formatted;

            DefaultDate = CurrentDate.formatted;

         }

         alert(AlertMessage);

      }

      // Define the current date if it wasn't set already

      if (!CurrentDate) var CurrentDate = new storedMonthObject(DateFormat, Today.getFullYear(), Today.getMonth(), Today.getDate());

      // Handle DefaultDate

      if (arguments.length < 4) { // The date wasn't passed in

         DefaultDate = (Required) ? CurrentDate.formatted : ''; // If required, use today's date

      }

      // Creates the calendar object!

      eval(DateName + '_Object=new calendarObject(\'' + DateName + '\',\'' + DateFormat + '\',\'' + DefaultDate + '\')');

      // Determine initial viewable state of day, year, and calendar icon

      if ((Required) || (arguments.length == 4)) {

         var InitialStatus = '';

         var InitialDate = eval(DateName + '_Object.picked.formatted');

      }

      else {

         var InitialStatus = ' style="visibility:hidden"';

         var InitialDate = '';

         eval(DateName + '_Object.setPicked(' + Today.getFullYear() + ',' + Today.getMonth() + ',' + Today.getDate() + ')');

      }

      // Create the form elements

      with (document) {

         writeln('<input type="hidden" name="' + DateName + '" value="' + InitialDate + '">');

         // Find this form number

         for (var f=0;f<forms.length;f++) {

            for (var e=0;e<forms[f].elements.length;e++) {

               if (typeof forms[f].elements[e].type == 'string') {

                  if ((forms[f].elements[e].type == 'hidden') && (forms[f].elements[e].name == DateName)) {

                     eval(DateName + '_Object.formNumber='+f);

                     break;

                  }

               }

            }

         }

/******************	 

 MONTH INPUT SELECT

 ******************/

         writeln('<select class="calendarDateInput" id="' + DateName + '_Month_ID" name="' + DateName + 'Month" onChange="' + DateName + '_Object.changeMonth(this);' + conditionalOnChange(DateName) + '">');

         if (!Required) {

            var NoneSelected = (DefaultDate == '') ? ' selected' : '';

            writeln('<option value=""' + NoneSelected + '>' + UnselectedMonthText + '</option>');

         }

				 var MonthSelected;

         for (var i=0;i<12;i++) {

            MonthSelected = ((DefaultDate != '') && (eval(DateName + '_Object.picked.monthIndex') == i)) ? ' selected' : '';

            writeln('<option value="' + i + '"' + MonthSelected + '>' + MonthNames[i].substr(0,3) + '</option>');

         }

         writeln('</select>');

/****************	 

 DAY INPUT SELECT

 ****************/

         writeln('<select' + InitialStatus + ' class="calendarDateInput" id="' + DateName + '_Day_ID" name="' + DateName + 'Day" onChange="' + DateName + '_Object.changeDay(this);' + conditionalOnChange(DateName) + '">');

				 var DaySelected;

         for (var j=1;j<=eval(DateName + '_Object.picked.dayCount');j++) {

            DaySelected = ((DefaultDate != '') && (eval(DateName + '_Object.picked.day') == j)) ? ' selected' : '';

            writeln('<option' + DaySelected + '>' + j + '</option>');

         }

         writeln('</select>');

/*******************

 YEAR INPUT (SHOWN)

         writeln('<input' + InitialStatus + ' class="calendarDateInput" type="text" id="' + DateName + '_Year_ID" name="' + DateName + 'Year" size="' + eval(DateName + '_Object.picked.yearPad.length') + '" maxlength="' + eval(DateName + '_Object.picked.yearPad.length') + '" title="Year" value="' + eval(DateName + '_Object.picked.yearPad') + '" onKeyPress="return YearDigitsOnly(window.event)" onKeyUp="' + DateName + '_Object.checkYear(this)" onBlur="' + DateName + '_Object.fixYear(this)">');

 *******************/



/*******************

 YEAR INPUT (HIDDEN)

 *******************/

         writeln('<input' + InitialStatus + ' class="calendarDateInput" type="hidden" id="' + DateName + '_Year_ID" name="' + DateName + 'Year" size="' + eval(DateName + '_Object.picked.yearPad.length') + '" maxlength="' + eval(DateName + '_Object.picked.yearPad.length') + '" title="Year" value="' + eval(DateName + '_Object.picked.yearPad') + '" />');





/*******************

 CALENDAR ICON

 *******************/

write(String.fromCharCode(13) + '<a' + InitialStatus + ' id="' + DateName + '_ID_Link" href="javascript:' + DateName + '_Object.show()" onMouseOver="return ' + DateName + '_Object.iconHover(true)" onMouseOut="return ' + DateName + '_Object.iconHover(false)"><img width="16" height="15" src="' + ImageURL + '" align="baseline" title="Calendar" border="0"></a>&nbsp;');





/*******************

 CALENDAR 'POPUP'

 *******************/

         writeln('<div id="' + DateName + '_ID" style="position:absolute;visibility:hidden;width:' + (CellWidth * 7) + 'px;background-color:' + CalBGColor + ';border:1px solid dimgray;overflow:visible;" onMouseOver="' + DateName + '_Object.handleTimer(true)" onMouseOut="' + DateName + '_Object.handleTimer(false)">');

         writeln('<table width="' + (CellWidth * 7) + '" cellspacing="0" cellpadding="1">' + String.fromCharCode(13) + '<tr style="background-color:' + TopRowBGColor + ';">');

         writeln('<td id="' + DateName + '_Previous_ID" style="cursor:default" align="center" class="calendarDateInput" style="height:' + CellHeight + 'px;" onClick="' + DateName + '_Object.previous.go()" onMouseDown="VirtualButton(this,true)" onMouseUp="VirtualButton(this,false)" onMouseOver="return ' + DateName + '_Object.previous.hover(this,true)" onMouseOut="return ' + DateName + '_Object.previous.hover(this,false)" title="' + eval(DateName + '_Object.previous.monthName') + '"><img width="5" height="9" src="' + PrevURL + '"></td>');

         writeln('<td id="' + DateName + '_Current_ID" style="cursor:pointer" align="center" class="calendarDateInput" style="height:' + CellHeight + 'px;" colspan="5" onClick="' + DateName + '_Object.displayed.goCurrent()" onMouseOver="self.status=\'Click to view ' + CurrentDate.fullName + '\';return true;" onMouseOut="self.status=\'\';return true;" title="Show Current Month">' + eval(DateName + '_Object.displayed.fullName') + '</td>');

         writeln('<td id="' + DateName + '_Next_ID" style="cursor:default" align="center" class="calendarDateInput" style="height:' + CellHeight + 'px;" onClick="' + DateName + '_Object.next.go()" onMouseDown="VirtualButton(this,true)" onMouseUp="VirtualButton(this,false)" onMouseOver="return ' + DateName + '_Object.next.hover(this,true)" onMouseOut="return ' + DateName + '_Object.next.hover(this,false)" title="' + eval(DateName + '_Object.next.monthName') + '"><img width="5" height="9" src="' + NextURL + '"></td></tr>' + String.fromCharCode(13) + '<tr>');

         for (var w=0;w<7;w++) writeln('<td width="' + CellWidth + '" align="center" class="calendarDateInput" style="height:' + CellHeight + 'px;width:' + CellWidth + 'px;font-weight:bold;border-top:1px solid dimgray;border-bottom:1px solid dimgray;">' + WeekDays[w] + '</td>');

         writeln('</tr>' + String.fromCharCode(13) + '</table>' + String.fromCharCode(13) + '<div id="' + DateName + '_DayTable_ID">' + eval(DateName + '_Object.buildCalendar()') + '</div>' + String.fromCharCode(13) + '</div>');

      }

   }

}

/* ---------------------------------------------------- */

var autoCompleteEntries, autoCompleteSelected, suggDiv, hotelBox, suggestionSelected;



function initFind()

{

	suggDiv = document.getElementById('suggestionBox');

	hotelBox = document.getElementById('findInput');



	hotelBox.onkeyup = autoComplete;

	hotelBox.onkeydown = autoComplete;

	hotelBox.onfocus = function() { this.value = ''; this.onfocus = null; };

}





/***************************************************



	AUTOCOMPLETE AND RELATED EVENT HANDLING FUNCTIONS



 ***************************************************/



function autoComplete(e)

{

	if (document.all)

	{

		e = window.event;

	}

	var k = e.keyCode;

	

	if (e.type=='keydown')

	{

		switch (k)

		{

			case 38: return navigateAutoComplete('up'); break; // up arrow key

			case 40: return navigateAutoComplete('down'); break; // down arrow key

			case 13: // return key

				if (autoCompleteEntries.length==1)

				{

					autoCompleteSelected = 0;

				}

				if ((autoCompleteEntries.length > 0) && (autoCompleteSelected <= autoCompleteEntries.length))

				{

					hotelBox.value = autoCompleteEntries[autoCompleteSelected];

					suggDiv.style.visibility = 'hidden';

					autoCompleteEntries = new Array();

				}

			doSiteRedirect();

			default : null;

		}

		return true;

	}

	else if ( (e.type=='keyup')

					&& (((k>=65) && (k<=90)) || ((k>=48) && (k<=57)) || ((k>=96) && (k<=105))

						 || (k==32) || (k==8) || (k==46)) )

	{

		// is key a space, backspace, delete or a letter?

		switch (k)

		{

			case 46 :

			case 8 : return handleDeletion(k);

			default : return showSuggestions();

		}

	}

	return false;

}





function doSiteRedirect()

{

	if (hotelURLs[hotelBox.value])

	{

		window.location = hotelURLs[hotelBox.value];

	}

}





function handleDeletion()

{

	suggDiv.style.visibility = 'hidden';

	if (!suggestionSelected || (autoCompleteEntries.length > 1))

	{

		return showSuggestions();

	}

	suggestionSelected = false;

	return false;

}





function navigateAutoComplete(direction)

{

	if ((autoCompleteEntries.length > 0) && (suggDiv.style.visibility == 'visible'))

	{

		var pos = autoCompleteSelected;

		switch (direction)

		{

			case 'up' :

				if ((pos < autoCompleteEntries.length) && (pos > 0))

				{

					autoCompleteSelected--;

				}

				break;

			case 'down' :

				if (pos == autoCompleteEntries.length)

				{

					autoCompleteSelected = 0;

				}

				else if ((pos+1) < autoCompleteEntries.length)

				{

					autoCompleteSelected++;

				}

				break;

			default : return false;

		}

		if (document.getElementById('ac_dd_pos' + pos))

		{

			document.getElementById('ac_dd_pos' + pos).className = 'dd_unselected';

		}

		document.getElementById('ac_dd_pos' + autoCompleteSelected).className = 'dd_selected';

		//putInputSuggestion(autoCompleteSelected);

	}

	return false;

}







function showSuggestions()

{

	suggestionSelected = false;

	autoCompleteEntries = new Array();

	var strpat = /^\s*(([a-z0-9]+ ?){2,})\s*$/i;

	if (strpat.test(hotelBox.value))

	{

		var testpat = new RegExp(hotelBox.value.replace(strpat, '$1'), 'i');

		for (var i in hotels)

		{

			if (hotels[i].match(testpat))

			{

				autoCompleteEntries[autoCompleteEntries.length] = hotels[i];

			}

		}

	}

	if (autoCompleteEntries.length > 0)

	{

		var html = '';

		for (i=0; i<autoCompleteEntries.length; i++)

		{

			html += '<div id="ac_dd_pos' + i + '" class="dd_unselected">'

						+ '<a href="' + hotelURLs[autoCompleteEntries[i]] + '">'

						+ autoCompleteEntries[i] + '</a></div>';

		}

		suggDiv.innerHTML = html;

		autoCompleteSelected = i;

		suggDiv.style.visibility = 'visible';

	}

	else if (hotelBox.value.length > 1)

	{

		var html = '<div class="dd_warning">No hotels to show...</div>';

		suggDiv.innerHTML = html;

		suggDiv.style.visibility = 'visible';

	}

	else

	{

		suggDiv.style.visibility = 'hidden';

	}

	return true;

}
/* ------------------------------ end ----------------------------------------*/

/* ------------------------- begin user link share ----------------------------*/
// what makes it work
var linkShareStuffHost = 'http://static.justonehotel.com/templates/j1h-default/';
var linkSharerContainer = null;
var linkSharerCloseTimerId = false;
var linkSharerOpenTimerId = false;
var linkSharerIncludedStylesheet = false;
var linkSharerCurrentTargetElement = null;

// styling info
var linkSharerBorderColor = '#c0c0c0';
var linkSharerColor = '#1a6998';
var linkSharerHeadColor = '#1a6998';
var linkSharerHeadBgColor = '#dddddd';
var linkSharerContentBgColor = '#fafafa';


function linkShareAddSlashes( str )
{
	str=str.replace(/\\/g,'\\\\');
	str=str.replace(/\'/g,"\\'");
	str=str.replace(/\"/g,'\\"');
	return str;
}

// hotelId can be null if you fancy it as such
function openLinkSharer( targetElement, shareUrl, shareTitle, hotelId )
{
	// dont open if there is a readystate variable and it's not 'completed'
	// otherwise IE throws the error "Internet Explorer cannot open the Internet site: Operation Aborted"
	// only IE has the onreadystate thingy
	if ( document.readyState && document.readyState!='complete' )
	{
		return false;
	}
	
	if ( linkSharerContainer )
	{
		if ( linkSharerCurrentTargetElement!=targetElement )
		{
			// If the link sharer is already open for a different target element then close it.
			closeLinkSharer( true );
		}
		else
		{
			// If it's already open for this target element then don't bother trying to open it again.
			// But cancel any previous close request.
			cancelTimedCloseLinkSharer();
			return true;
		}
	}

	// create the link sharer div
	linkSharerContainer = document.createElement('div');
	linkSharerContainer.style.zIndex = 102;
	linkSharerContainer.style.position = 'absolute';
	linkSharerContainer.style.width = '200px';
	linkSharerContainer.id = 'linkSharerContainer';
	linkSharerContainer.onmouseover = function( e ) { cancelTimedCloseLinkSharer(); }
	linkSharerContainer.onmouseout = function( e ) { closeLinkSharer();	}
	linkSharerContainer.style.visibility = 'hidden';
	
	// give it some content
	html = getLinkSharerContent( shareUrl, shareTitle, hotelId );
	linkSharerContainer.innerHTML = html;

	// put it in the right place
	
	document.body.appendChild(linkSharerContainer);
	applyLinkSharerPosition( targetElement );	
	
	// annnnnnd make it visible
	linkSharerOpenTimerId = setTimeout( 'showLinkSharer()', 500 );
	
	return true;
}


function showLinkSharer()
{
	linkSharerContainer.style.visibility = 'visible';
}

function linkSharerIsVisible()
{
	return linkSharerContainer.style.visibility=='visible';
}

// returns an html string with link sharing html in it
function getLinkSharerContent( shareUrl, shareTitle, hotelId )
{
	// these variables are url encoded and then escaped for echoing to javascript
	var urlEscapedShareUrl = linkShareAddSlashes( encodeURIComponent( shareUrl ) );
	var urlEscapedShareTitle = linkShareAddSlashes( encodeURIComponent( shareTitle ) );
	var urlEscapedHotelId = '';
	if ( hotelId )
	{
		urlEscapedHotelId = linkShareAddSlashes( encodeURIComponent( hotelId ) );
	}
	
	// these variables are just escaped for echoing to javascript
	var escapedShareUrl = linkShareAddSlashes( shareUrl );
	var escapedShareTitle = linkShareAddSlashes( shareTitle );
	var escapedHotelId = '';
	if ( hotelId )
	{
		escapedHotelId = linkShareAddSlashes( hotelId );
	}
	html = '<div class="linkSharerContent" style="border-color:' + linkSharerBorderColor + '">';
	html += '<div class="linkSharerTitle" style="background-color:'+linkSharerHeadBgColor+';border-color:' + linkSharerBorderColor + ';color:'+linkSharerHeadColor+'">Bookmark &amp; Share</div><div class="linkSharerServices" style="background-color:'+linkSharerContentBgColor+';">';
	html += '<table cellpadding="0" cellspacing="2">';
	html += '<tr>';
	html += '<td style="width:50%">';
	html += '<a style="color:'+linkSharerColor+'" href="javascript:void(0)" \
		target="_blank" onclick="userLinkShareLog( \'favorites\', \'' + escapedShareUrl + '\', \'' + 
		escapedShareTitle + '\', \'' + escapedHotelId + '\' );linkShareBookmark(\'' + escapedShareTitle + '\', \'' + escapedShareUrl + '\');return false;">' + 
		'<img src="' + linkShareStuffHost + 'images/user_link_share/fave.png" ' + 
		' width="14" height="14"> <span>Bookmark</span></a><br>';
	html += '</td>';
	html += '<td>';
	html += '<a style="color:'+linkSharerColor+'" href="http://del.icio.us/post?url=' + urlEscapedShareUrl + '&title=' + urlEscapedShareTitle + '" target="_blank" \
		onclick="return userLinkShareLog( \'delicious\', \'' + escapedShareUrl + '\', \'' + 
		escapedShareTitle + '\', \'' + escapedHotelId + '\' );">' + 
		'<img src="' + linkShareStuffHost + 'images/user_link_share/deli.png" ' + 
		' width="14" height="14"> <span>Del.icio.us</span></a><br>';
	html += '</td>';
	html += '</tr>';
	html += '<tr>';
	html += '<td>';
	html += '<a style="color:'+linkSharerColor+'" href="http://www.facebook.com/sharer.php?u=' + urlEscapedShareUrl + '" target="_blank" \
		onclick="return userLinkShareLog( \'facebook\', \'' + escapedShareUrl + '\', \'' + 
		escapedShareTitle + '\', \'' + escapedHotelId + '\' );">' + 
		'<img src="' + linkShareStuffHost + 'images/user_link_share/face.png" ' + 
		' width="14" height="14"> <span>Facebook</span></a><br>';
	html += '</td>';
	html += '<td>';
	html += '<a style="color:'+linkSharerColor+'" href="http://www.justonehotel.com/feeds/atom" \
		target="_blank" onclick="return userLinkShareLog( \'feeds\', \'' + escapedShareUrl + '\', \'' + 
		escapedShareTitle + '\', \'' + escapedHotelId + '\' );">' + 
		'<img src="' + linkShareStuffHost + 'images/user_link_share/rss.png" ' + 
		' width="14" height="14"> <span>Feeds</span></a><br>';
	html += '</td>';
	html += '</tr>';
	html += '<tr>';
	html += '<td>';
	html += '<a style="color:'+linkSharerColor+'" href="http://www.google.com/bookmarks/mark?op=add&bkmk=' + 
		urlEscapedShareUrl + '&title=' + urlEscapedShareTitle + '" \
		target="_blank" onclick="return userLinkShareLog( \'google\', \'' + escapedShareUrl + '\', \'' + 
		escapedShareTitle + '\', \'' + escapedHotelId + '\' );">' + 
		'<img src="' + linkShareStuffHost + 'images/user_link_share/goog.png" ' + 
		' width="14" height="14"> <span>Google</span></a><br>';
	html += '</td>';
	html += '<td>';
	html += '<a style="color:'+linkSharerColor+'" href="http://favorites.live.com/quickAdd.aspx?url=' + 
		urlEscapedShareUrl + '&title=' + urlEscapedShareTitle + '&text=&" \
		target="_blank" onclick="return userLinkShareLog( \'live\', \'' + escapedShareUrl + '\', \'' + 
		escapedShareTitle + '\', \'' + escapedHotelId + '\' );">' + 
		'<img src="' + linkShareStuffHost + 'images/user_link_share/live.png" ' + 
		' width="14" height="14"> <span>Live</span></a><br>';
	html += '</td>';
	html += '</tr>';
	html += '<tr>';
	html += '<td>';
	html += '<a style="color:'+linkSharerColor+'" href="http://www.myspace.com/index.cfm?fuseaction=postto&t=' + 
		urlEscapedShareTitle + '&c=&u=' + urlEscapedShareUrl + '&l=" \
		target="_blank" onclick="return userLinkShareLog( \'myspace\', \'' + escapedShareUrl + '\', \'' + 
		escapedShareTitle + '\', \'' + escapedHotelId + '\' );">' + 
		'<img src="' + linkShareStuffHost + 'images/user_link_share/mysp.png" ' + 
		' width="14" height="14"> <span>MySpace</span></a><br>';
	html += '</td>';
	html += '<td>';
	html += '<a style="color:'+linkSharerColor+'" href="http://www.stumbleupon.com/submit?url=' + urlEscapedShareUrl + '" \
		target="_blank" onclick="return userLinkShareLog( \'stumbleupon\', \'' + escapedShareUrl + '\', \'' + 
		escapedShareTitle + '\', \'' + escapedHotelId + '\' );">' + 
		'<img src="' + linkShareStuffHost + 'images/user_link_share/stup.png" ' + 
		' width="14" height="14"> <span>StumbleUpon</span></a><br>';
	html += '</td>';
	html += '</tr>';
	html += '<tr>';
	html += '<td>';
	html += '<a style="color:'+linkSharerColor+'" href="http://twitter.com/timeline/home?status=' + urlEscapedShareUrl + '" \
		target="_blank" onclick="return userLinkShareLog( \'twitter\', \'' + escapedShareUrl + '\', \'' + 
		escapedShareTitle + '\', \'' + escapedHotelId + '\' );">' + 
		'<img src="' + linkShareStuffHost + 'images/user_link_share/twit.png" ' + 
		' width="14" height="14"> <span>Twitter</span></a><br>';
	html += '</td>';
	html += '<td>';
	html += '<a style="color:'+linkSharerColor+'" href="http://bookmarks.yahoo.com/toolbar/savebm?t=' + 
		urlEscapedShareTitle + '&u=' + urlEscapedShareUrl + '" \
		target="_blank" onclick="return userLinkShareLog( \'yahoo\', \'' + escapedShareUrl + '\', \'' + 
		escapedShareTitle + '\', \'' + escapedHotelId + '\' );">' + 
		'<img src="' + linkShareStuffHost + 'images/user_link_share/yaho.png" ' + 
		' width="14" height="14"> <span>Yahoo</span></a><br>';
	html += '</td>';
	html += '</tr>';
	html += '</table>';
	html += '</div>';
	html += '</div>';

	return html;
}



// closes the link sharer after a small period of time
// unless immediate is true or the linksharer isnt visible in which case it clsoes immediatly
function closeLinkSharer( immediate )
{
	if ( linkSharerContainer )
	{
		cancelTimedCloseLinkSharer();
		if ( immediate || !linkSharerIsVisible() )
		{
			if ( linkSharerOpenTimerId )
			{
				weeid = clearTimeout( linkSharerOpenTimerId );
				linkSharerOpenTimerId = false;
			}
			document.body.removeChild( linkSharerContainer );
			linkSharerContainer = null;
		}
		else
		{
			linkSharerCloseTimerId = setTimeout( 'closeLinkSharer(true)', 500 );
		}
	}
	return true;
}



// cancels a timed close of the link sharer
function cancelTimedCloseLinkSharer()
{
	if ( linkSharerCloseTimerId )
	{
		clearTimeout( linkSharerCloseTimerId );
		linkSharerCloseTimerId = false;
	}
}




function applyLinkSharerPosition( targetElement )
{
	// reset the position first
	linkSharerContainer.style.top = '0px';
	linkSharerContainer.style.left = '0px';
	
	// we get the top and left edge co-ordindates
	var top = targetElement.offsetTop;
	var left = targetElement.offsetLeft;
	var currentElement = targetElement;
	while ( currentElement = currentElement.offsetParent )
	{
		top += currentElement.offsetTop;
		left += currentElement.offsetLeft;
	}
	
	// now get the width and height of the target element
	var width = targetElement.offsetWidth;
	var height = targetElement.offsetHeight;

	// using these to work out the classname
	var linkSharerClassVertical = 'Top';
	var linkSharerClassHorizontal = 'Left';
	
	// now we need to work out how big the linkSharerDiv is going to be
	var linkSharerWidth = linkSharerContainer.offsetWidth;
	var linkSharerHeight = linkSharerContainer.offsetHeight;
	
	// by default, the pop tip will go under the target element in the middle
    var linkSharerLeft = left + ( ( width - linkSharerWidth ) / 2 ); // link sharer in middle of targetElement
    //var linkSharerLeft = left; // link sharer to left of targetElement
	var linkSharerTop = top + height + 2;

	// we need to know the size of the windae
	if ( typeof( window.innerWidth ) == 'number' )
	{
		windowWidth = window.innerWidth;
		windowHeight = window.innerHeight;
	}
	else if ( document.documentElement 
		&& ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
	{
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	}
	else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
	{
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}
	
	// we also need ot know how much we've scrolled down
	// default it to 0
	var yScroll = 0;
	if( typeof( window.pageYOffset ) == 'number' )
	{
		yScroll = window.pageYOffset;
	}
	else if( document.body && document.body.scrollTop )
	{
		yScroll = document.body.scrollTop;
	}
	else if( document.documentElement && document.documentElement.scrollTop )
	{
		yScroll = document.documentElement.scrollTop;
	}
	
	
	// let's add a little safety margin on to the width to account for scrollbars and shit,
	// and also increase the allowed height to account fo scrolling
	windowWidth -= 20;
	windowHeight -= 20;
	windowHeight += yScroll;
	
	// the linkSharer will be below the target element with the same 'left' value
	// but perhaps this will make it overlap the bottom or right of the screen :(
	// in these cases, we must adjust
	if ( linkSharerLeft + linkSharerWidth > windowWidth )
	{
		linkSharerLeft -= linkSharerWidth;
	}
	
	if ( linkSharerTop + linkSharerHeight > windowHeight )
	{
		linkSharerTop -= ( linkSharerHeight + height + 5 );
	}

	// dont let it go above or to the left of the screen
	linkSharerLeft = Math.max( linkSharerLeft, 0 );
	linkSharerTop = Math.max( linkSharerTop, 0 );

	linkSharerContainer.style.top = linkSharerTop + 'px';
	linkSharerContainer.style.left = linkSharerLeft + 'px';
}

function userLinkShareLog( serviceCode, shareUrl, title, hotelId )
{	
	// now send the ajax
	var url = '/user_link_share.php';
	var method = 'POST';
	var contentType = 'application/x-www-form-urlencoded';

	// these variables are url encoded and then escaped for echoing to javascript
	var urlEscapedShareUrl = linkShareAddSlashes( encodeURIComponent( shareUrl ) );
	var urlEscapedShareTitle = linkShareAddSlashes( encodeURIComponent( title ) );
	var urlEscapedHotelId = '';
	if ( hotelId )
	{
		urlEscapedHotelId = linkShareAddSlashes( encodeURIComponent( hotelId ) );
	}
	var qString = 'url=' + urlEscapedShareUrl + '&service_code=' + serviceCode + '&title=' + urlEscapedShareTitle;
	if ( hotelId )
	{
		qString += '&hotel_id=' + urlEscapedHotelId;
	}

	// create request object
	var req = false;
	if (window.XMLHttpRequest)
	{
		 // Mozilla, Safari,...
		req = new XMLHttpRequest();
	}
	else if (window.ActiveXObject)
	{ 
		// IE
		try
		{
			req = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			try
			{
				req = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e)
			{
				// ALWAYS return true
				// we dont want to not send the customer to the link
				return true;
			}
		}
	}
	
	// send! send! send!
	req.open( method, url, true );
	req.setRequestHeader( 'Content-Type', contentType );
	req.send( qString );
	
	return true;
}

function linkShareBookmarkAndLog( shareUrl, title, hotelId )
{
	userLinkShareLog( 'favorites', shareUrl, title, hotelId );
	linkShareBookmark( title, shareUrl );
}

function linkShareBookmark( title, url )
{	
	/***********************************************
	* Bookmark site script-  Dynamic Drive DHTML code library (www.dynamicdrive.com)
	* This notice MUST stay intact for legal use
	* Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code
	***********************************************/
	if ( window.sidebar )
	{
		// firefox
		window.sidebar.addPanel(title, url, "");
	}
	else if( window.opera && window.print )
	{ 
		// opera
		var elem = document.createElement('a');
		elem.setAttribute('href',url);
		elem.setAttribute('title',title);
		elem.setAttribute('rel','sidebar');
		elem.click();
	} 
	else if( document.all )
	{
		// ie
		window.external.AddFavorite( url, title );
	}
	else
	{
		alert('Your browser does not support this action - please bookmark this page manually.'); 
	}
}



/* ----------------------------- member functions ------------------------------- */
// JavaScript Document
function addPageEventListener()
{
	if(window.addEventListener) 
	{
		if(typeof messageReceiveFunction =='function')
		{
			window.addEventListener('message',messageReceiveFunction,false);
		}
	} 
	else if(window.attachEvent) 
	{
		if(typeof messageReceiveFunction =='function')
		{
			window.attachEvent('onmessage', messageReceiveFunction);
		}
	}
}

function messageReceiveFunction(e)
{
	var regex = /^https:\/\/(test|www|secure)\.justonehotel\.com/i;
	var eventOrigin = null;
	
	//some versions of opera have undefined e.origin so have to use deprecated e.uri
	if(e.origin==undefined) 
	{
		if(e.uri!=undefined) { eventOrigin=e.uri; }
	}
	else { eventOrigin = e.origin; }
	
	if(regex.test(eventOrigin))
	{
		checkMember(e.data.substring(4));
	}
}

function checkMember(info)
{
	//have to decode first because ie and ff behave differently
	membId = encodeURIComponent(decodeURIComponent(info));
	url = encodeURIComponent(decodeURIComponent(document.location.href));
	queryString = "eId="+membId;
	queryString +="&referrer="+url;
	myAjaxObj = new renamedAjax('/ajax/sessionRebuild.php', doNothing); 
	myAjaxObj.send('POST', queryString);
}

function doNothing(resp)
{
	if(resp!='') 
	{
		if(document.getElementById('welcome'))
		{document.getElementById('welcome').innerHTML = resp;}
		else if(document.getElementById('testWelcome'))
		{document.getElementById('testWelcome').innerHTML = resp;}
	}
}

function getUserInfo(value)
{
	if(	window.location.hash.substr(0,5)=='#:||:')
	{
		var val = window.location.hash.substring(5);
		if ( !value || value=='' )
		{
			value = '#';
		}
		window.location.hash = value;
		checkMember(val);
	}
}

/*

--USAGE
	
		create new ajax object :
			obj = new ajax(url, callbackFunction)
		
		callback function should (optionally) take response text as first argument, response XML as second;

		send request :
			obj.send([ method [, queryString ] ])
		
		callback function should handle the rest...

*/

function renamedAjax(url, callbackFunction)
{
	this.url = url;
	this.setMethod = setMethod;
	this.setQuery = setQuery;
	this.send = send;
	this.createObject = createObject;
	this.setResponseHandler = setResponseHandler;
	this.callback = callbackFunction || function () { };
}


function send()
{
	// optional arguments: method, queryString
	var method = (arguments.length>0) ? arguments[0] : 'GET';
	var qString = (arguments.length>1) ? arguments[1] : null;
	this.rqstObj = this.createObject();
	if (this.rqstObj)
	{
		this.setMethod(method);
		this.setQuery(qString);
		this.setResponseHandler(this);
		this.rqstObj.open(this.method, this.url, true);
		this.rqstObj.setRequestHeader('Content-Type', this.contentType);
		this.rqstObj.send(this.queryString);
		return true;
	}
	alert('AJAX error - you might consider enabling javascript to experience the full functionality of the web, '
			+ 'or getting a newer browser?');
	return false;
}


function setResponseHandler(ajaxObj)
{
	ajaxObj.rqstObj.onreadystatechange = function()
	{
		var rqstObj = ajaxObj.rqstObj;
		if ((rqstObj.readyState == 4) && (rqstObj.status == 200))
		{
			ajaxObj.callback(rqstObj.responseText, rqstObj.responseXML);
			ajaxObj.rqstObj = null;
		}
	}
}


function createObject()
{
	var req = false;
	if (window.XMLHttpRequest)
	{ // Mozilla, Safari,...
		req = new XMLHttpRequest();
	}
	else if (window.ActiveXObject)
	{ // IE
		try
		{
			req = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			try
			{
				req = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e)
			{
				return false;
			}
		}
	}
	return req;
}


function setMethod(method)
{
	if (method == 'POST')
	{
		this.method = 'POST';
		this.contentType = 'application/x-www-form-urlencoded';
	}
	else
	{
		this.method = 'GET';
		this.contentType = 'text/plain';
	}
}


function setQuery(queryString)
{
	// Be careful with this - AJAX can fail silently if this regex is not matched. It may
	// require modification, but make sure you use EncodeURIComponent on any argument values first
	var qMatch = /^[\w%]+=[\w\-%@\.]*(&[\w\-%]+=[\w%@\.\-]*)*$/;
	this.queryString = (qMatch.test(queryString)) ? queryString : null;
}




/* ----------------- POP TIP ---------------------*/

var popTipContainer;
var popTipContent;
var popTipActiveAreas = new Array();

// You simply *must* run this function, in the body of the script
// and not inside any other tags (other than the <script> tag)
function popTipInit()
{
	document.write( '<div id="popTipContainer" class="popTipPointTopLeft" style="top:0px;left:0px;">' + 
			'<div class="popTipTop"></div>' +
			'<div id="popTipContent"></div>' + 
			'<div class="popTipBottom"></div>' +
		'</div>' );
	popTipContainer = document.getElementById( 'popTipContainer' );
	popTipContent = document.getElementById( 'popTipContent' );
	closePopTip();
}



function popTipIsOpen()
{
	return popTipContainer.style.visibility == 'visible';
}


function popTipMouseAwayMonitor( e )
{
	// get the moose pos
	var mouseX = 0;
	var mouseY = 0;
	if (!e) var e = window.event;
	if (e.pageX || e.pageY)
	{
		mouseX = e.pageX;
		mouseY = e.pageY;
	}
	else if (e.clientX || e.clientY)
	{
		mouseX = e.clientX + document.body.scrollLeft
			+ document.documentElement.scrollLeft;
		mouseY = e.clientY + document.body.scrollTop
			+ document.documentElement.scrollTop;
	}
	
	// check each 'active area' to see if the mouse is in any of them
	// if it isn't, then close the thingy
	var inAnyArea = false;
	var area, areaLeft, areaRight, areaTop, areaBottom = null;
	for ( var areaNum=0; areaNum<popTipActiveAreas.length; areaNum++ )
	{
		// introduce a small tolerance value just to be nice
		area = popTipActiveAreas[ areaNum ];
		areaLeft = area[ 0 ] - 5;
		areaRight = area[ 1 ] + 5;
		areaTop = area[ 2 ] - 5;
		areaBottom = area[ 3 ] + 5;
		
		if ( mouseX>=areaLeft && mouseX<=areaRight && mouseY>=areaTop && mouseY<=areaBottom  )
		{
			inAnyArea = true;
			break;
		}
	}
	
	if ( !inAnyArea )
	{
		closePopTip();
	}
}


function openPopTip( targetElement, html, width )
{
	if ( popTipIsOpen() )
	{
		closePopTip();
	}
	if ( !isNaN( width ) )
	{
		popTipContent.style.width = width + 'px';
	}
	else
	{
		popTipContent.style.width = 'auto';
	}
	popTipContent.innerHTML = html;
	applyPopTipPosition( targetElement );
	popTipContainer.style.visibility = 'visible';
	document.onmousemove = popTipMouseAwayMonitor;
}



function closePopTip()
{
	document.onmousemove = null;
	popTipContainer.style.visibility = 'hidden';
	popTipContainer.style.top = '0px';
	popTipContainer.style.left = '0px';
	popTipContent.innerHTML = '';
}




function applyPopTipPosition( targetElement )
{
	// reset the position first
	popTipActiveAreas = new Array();
	popTipContainer.style.top = '0px';
	popTipContainer.style.left = '0px';
	popTipContainer.className = 'popTipPointTopLeft';
	
	// we get the top and left edge co-ordindates
	var top = targetElement.offsetTop;
	var left = targetElement.offsetLeft;
	var currentElement = targetElement;
	while ( currentElement = currentElement.offsetParent )
	{
		top += currentElement.offsetTop;
		left += currentElement.offsetLeft;
	}
	
	// now get the width and height of the target element
	var width = targetElement.offsetWidth;
	var height = targetElement.offsetHeight;
	
	// using these to work out the classname
	var popTipClassVertical = 'Top';
	var popTipClassHorizontal = 'Left';
	
	// now we need to work out how big the popTipDiv is going to be
	var popTipWidth = popTipContainer.offsetWidth;
	var popTipHeight = popTipContainer.offsetHeight;
	
	// by default, the pop tip will go in the middle of the target element
	var popTipLeft = left + ( width / 2 );
	var popTipTop = top + height;

	// we need to know the size of the windae
	if ( typeof( window.innerWidth ) == 'number' )
	{
		windowWidth = window.innerWidth;
		windowHeight = window.innerHeight;
	}
	else if ( document.documentElement 
		&& ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
	{
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	}
	else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
	{
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}
	
	// we also need ot know how much we've scrolled down
	// default it to 0
	var yScroll = 0;
	if( typeof( window.pageYOffset ) == 'number' )
	{
		yScroll = window.pageYOffset;
	}
	else if( document.body && document.body.scrollTop )
	{
		yScroll = document.body.scrollTop;
	}
	else if( document.documentElement && document.documentElement.scrollTop )
	{
		yScroll = document.documentElement.scrollTop;
	}
	
	
	// let's add a little safety margin on to the width to account for scrollbars and shit,
	// and also increase the allowed height to account fo scrolling
	windowWidth -= 20;
	windowHeight -= 20;
	windowHeight += yScroll;
	
	// the popTip will be below the target element with the same 'left' value
	// but perhaps this will make it overlap the bottom or right of the screen :(
	// in these cases, we must adjust
	if ( popTipLeft + popTipWidth > windowWidth )
	{
		popTipLeft -= popTipWidth;
		popTipClassHorizontal = 'Right';
	}
	
	if ( popTipTop + popTipHeight > windowHeight )
	{
		popTipTop -= ( popTipHeight + height );
		popTipClassVertical = 'Bottom';
	}

	// right now, the very edge of the popup box is at the middle of the target
	// this will make it difficult to get nice looking pointers on the popups, so we'll move it 15px to one side
	// so that there's room for a nice graphic
	popTipLeft = ( popTipClassHorizontal=='Left' ) ? popTipLeft - 15 : popTipLeft + 15;

	popTipContainer.className = 'popTipPoint' + popTipClassVertical + popTipClassHorizontal;
	popTipContainer.style.top = popTipTop + 'px';
	popTipContainer.style.left = popTipLeft + 'px';
	
	// make active areas
	var tipArea = new Array( popTipLeft, popTipLeft + popTipWidth, popTipTop, popTipTop + popTipHeight );
	var targetElementArea = new Array( left, left + width, top, top + height );
	popTipActiveAreas[ 0 ] = tipArea;
	popTipActiveAreas[ 1 ] = targetElementArea;
}

/* ------- google plus --------------*/
    var html_doc = document.getElementsByTagName('head').item(0);
    var js = document.createElement('script');
    js.setAttribute('language', 'javascript');
    js.setAttribute('type', 'text/javascript');
    js.setAttribute('src', 'https://apis.google.com/js/plusone.js');
    html_doc.appendChild(js);

