var booking = {
	env : {
		b_simple_weekdays: ['Mo','Tu','We','Th','Fr','Sa','Su'],
		b_simple_weekdays_for_js: ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'],
		b_long_weekdays: ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
	}
}
function addzero( value )
{
	while( value.length<2 ) value = String("0") + value;
	return value;
}
function checkDateOrder(frm, ci_day, ci_month_year, co_day, co_month_year) {
	if (document.getElementById) {
		var frm = document.getElementById(frm);
		// create date object from checkin values
		// set date to 12:00 to avoid problems with one
		// date being wintertime and the other summertime
		var my = frm[ci_month_year].value.split("-");
		var ci = new Date (my[0], my[1]-1, frm[ci_day].value, 12, 0, 0, 0);
		// create date object from checkout values
		my = frm[co_month_year].value.split("-");
		var co = new Date (my[0], my[1]-1, frm[co_day].value, 12, 0, 0, 0);
		// if checkin date is at or after checkout date,
		// add a day full of milliseconds, and set the
		// selectbox values for checkout date to new value
		if (ci >= co){
			co.setTime(ci.getTime() + 1000 * 60 * 60 * 24);
			frm[co_day].value = co.getDate();
			var com = co.getMonth()+1;
			frm[co_month_year].value = co.getFullYear() + "-" + com;
		}
	}
}


Date.MILLISECONDS_PER_DAY = Date.prototype.MILLISECONDS_PER_DAY = 86400000;
var browser = navigator.appName
var version = navigator.appVersion
var startstring = parseFloat(version.indexOf("MSIE"))+1
var browserverion = parseFloat(version.substring(startstring+4,startstring+7))
var isIE5 = ((browser=="Microsoft Internet Explorer") && (browserverion < 6))? true : false;
var isIE6 = ((browser=="Microsoft Internet Explorer") && (browserverion > 5.5) && (browserverion < 6))? true : false;
// Put placeholder in destination input box if empty, and remove when focused

function tickCheckBox(el) {
	if (document.getElementById) {
		if (document.getElementById(el)) {
			document.getElementById(el).checked = false;
		}
	}
	return true;
}
Date.prototype.getTwoDigitMonth = function () {
// Returns a two-digit string from '01' to '12' representing the month property of a Date object.
var month = (this.getMonth() + 1).toFixed().toString();
if (month.length == 1) {
month = '0' + month;
}
return month;
};
function checkDateOrder(me, ci_day, ci_month_year, co_day, co_month_year) {
var
frm = document.getElementById('frm'),
my,
ci = new Date( 0 ),
co = new Date( 0 ),
com,
today = new Date();
// create date object from checkin values
// set date to 12:00 to avoid problems with one
// date being wintertime and the other summertime
if ( frm[ci_day].value !== '0' )
{
ci.setDate( frm[ci_day].value );
}
if ( frm[ci_month_year].value !== '0' )
{
my = frm[ci_month_year].value.split( "-" );
ci.setFullYear( my[0] );
ci.setMonth( my[1] - 1 );
}
ci.setHours( 12 );
ci.setMinutes( 0 );
ci.setSeconds( 0 );
// create date object from checkout values
if ( frm[co_day].value !== '0' )
{
co.setDate( frm[co_day].value );
}
if ( frm[co_month_year].value !== '0' )
{
my = frm[co_month_year].value.split( "-" );
co.setFullYear( my[0] );
co.setMonth( my[1] - 1 );
}
co.setHours( 12 );
co.setMinutes( 0 );
co.setSeconds( 0 );
// If the new checkin date's month does not match
// the current value of the dropdown, then it is
// because the month was incremented creating an
// invalid date (e.g. February 31st).
// We'll cycle back the checkin date until we're in
// the correct month.
if ( frm[ci_month_year].value !== '0' )
{
while ( ci.getMonth() != frm[ci_month_year].value.split( "-" )[1] - 1 )
{
ci.setDate( ci.getDate() - 1 );
frm[ci_day].value = ci.getDate();
}
var cim = ci.getMonth() + 1;
frm[ci_month_year].value = ci.getFullYear() + "-" + cim;
}
// if checkin date is at or after checkout date,
// add a day full of milliseconds, and set the
// selectbox values for checkout date to new value
if ( ci >= co )
{
co.setTime( ci.getTime() + Date.prototype.MILLISECONDS_PER_DAY );
com = co.getMonth() + 1;
if ( frm[ci_day].value !== '0' )
{
frm[co_day].value = co.getDate();
}
if ( frm[ci_month_year].value !== '0' )
{
frm[co_month_year].value = co.getFullYear() + "-" + com;
}
}
}
function updateDaySelect( me )
{
// 1-2 testing
if ( !booking.env.b_simple_weekdays_for_js )
{
return;
}
var frm = document.getElementById('frm');
if ( frm.getAttribute( 'id' ) !== 'frm' && frm.className !== 'availForm' )
{
return;
}
// Check if we have all fields. If not, we are in the first stage
// of the book process and should not auto-update selects since there
// is only the check-in select and the amount of nights.
if ( !frm.checkin_monthday || !frm.checkout_monthday || !frm.checkin_year_month || !frm.checkout_year_month )
{
return;
}
if ( frm.checkin_monthday.value === '0' && frm.checkout_monthday.value === '0' && frm.checkin_year_month.value === '0' && frm.checkout_year_month.value === '0' )
{
return;
}
// If the year-month fields have nonzero values, prepend the day of the week to each monthday in the check-in and check-out monthday Selects.
var
ci_d = frm.checkin_monthday,
co_d = frm.checkout_monthday,
ci_my,
co_my,
todaysDate;
// If the form field has a nonzero value, use it;
if ( frm.checkin_year_month.value !== '0' )
{
ci_my = frm.checkin_year_month.value.split( "-" );
}
else
{
// Use the current date value.
todaysDate = new Date();
ci_my = [ todaysDate.getFullYear(), todaysDate.getTwoDigitMonth() ];
}
if ( frm.checkout_year_month.value !== '0' )
{
co_my = frm.checkout_year_month.value.split( "-" );
}
else
{
todaysDate = new Date();
co_my = [ todaysDate.getFullYear(), todaysDate.getTwoDigitMonth() ];
}
var
ci_sel = Math.max( ci_d.selectedIndex, 0 ),
co_sel = Math.max( co_d.selectedIndex, 0 ),
ci_sel_value = ci_d[ ci_sel ].value,
co_sel_value = co_d[ co_sel ].value,
monthDays = [],
opt,
i;
ci_d.innerHTML = '';
co_d.innerHTML = '';
var MonthdayPromptOption = function ()
{
this.option = {
"_this" : this,
"@selected" : "selected",
"@class" : "day prompt site_experiment_encourage_date_entry_2",
"@value" : 0,
"#text" : "day"
};
};
if ( ci_sel_value === '0' )
{
buildHtmlNode( new MonthdayPromptOption(), ci_d ).selected = true;
}
if ( co_sel_value === '0' )
{
buildHtmlNode( new MonthdayPromptOption(), co_d ).selected = true;
}
function writeMonthdaysOptions( numberOfMonthdaysToShow, yearMonthSelectElement, monthDaysArray, monthDaysSelectElement, monthDaySelectValue )
{
var i, optionElementInnerHTML, optionElement;
for ( i = 0; i < numberOfMonthdaysToShow; i++ )
{
optionElement = document.createElement( 'option' );
optionElementInnerHTML = i + 1;
if ( yearMonthSelectElement.value !== '0' )
{
optionElementInnerHTML = monthDaysArray[i] + ' ' + optionElementInnerHTML;
}
optionElement.innerHTML = optionElementInnerHTML;
optionElement.value = ( i + 1 );
if ( i > 0 && monthDaySelectValue == i + 1 )
{
optionElement.defaultSelected = optionElement.selected = true;
}
monthDaysSelectElement.appendChild( optionElement );
}
}
// Check-in month
monthDays = buildDaysForMonth( ci_my[0], ci_my[1] );
var numberOfMonthdaysToShow = 31;
if ( frm.checkin_year_month.value !== '0' )
{
numberOfMonthdaysToShow = monthDays.length;
}
writeMonthdaysOptions( numberOfMonthdaysToShow, frm.checkin_year_month, monthDays, ci_d, ci_sel_value );
// Checkout month
monthDays = buildDaysForMonth( co_my[0], co_my[1] );
numberOfMonthdaysToShow = 31;
if ( frm.checkout_year_month.value !== '0' )
{
numberOfMonthdaysToShow = monthDays.length;
}
writeMonthdaysOptions( numberOfMonthdaysToShow, frm.checkout_year_month, monthDays, co_d, co_sel_value );
// IE 6 exhibits a bug whereby the value of the monthday select always jumps to zero.
if (isIE6) {
ci_d.value = ci_sel_value;
co_d.value = co_sel_value;
}
}
function buildDaysForMonth( year, month )
{
// Month index starts on 0(-11) in Date()-object
var monthDate = new Date( year, month - 1 );
var orgMonth = monthDate.getMonth();
var dayArray = [], weekDay;
while ( monthDate.getMonth() == orgMonth )
{
// Week starts on Sunday in Date()-object
weekDay = ( monthDate.getDay() == 0 ) ? 6 : ( monthDate.getDay() - 1 );
dayArray.push( booking.env.b_simple_weekdays_for_js[weekDay] );
monthDate.setDate( monthDate.getDate() + 1 );
}
return dayArray;
}
function buildHtmlNode (elementsObject, targetNode, refChild)
{
/*
Accepts an object of elements where the key specifies the tagname unless prefixed by @, in which case it specifies an attribute of the parent, or when it is #cdata, in which case it specifies a CDATA child.
http://xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html
The big flaw now is the case <a><b/><c/><b/><a/>, which cannot be represented as a JS object. In that case interject an array of generic div or span elements.
*/
// If we want to validate as JSON, we must make sure what we pass in is JSON, which it presently isnot.
//elementsObject = booking.json.validate(elementsObject);
var
key,
counter,
found,
newElement,
newNode;
for (key in elementsObject)
{
if (elementsObject.hasOwnProperty(key))
{
var
prefix = key.substring(0, 1),
primaryKey = key.substring(1);
if (prefix != '_') // We??e on a non-DOM key, so skip.
{
if (prefix == '@') // Attribute
{
if (!targetNode.getAttribute(primaryKey))
{
// Perhaps extend this in the future to support multiple class values.
targetNode.setAttribute(primaryKey, elementsObject[key]);
}
}
else
{
if (prefix == '#') // Text or CDATA
{
if (primaryKey == 'text') // Text
{
found = false;
if (targetNode.childNodes && targetNode.childNodes.length > 0)
{
// Traverse text node children and append only if it isn?? already there.
counter = 0;
while (counter < targetNode.childNodes.length && !found)
{
if (targetNode.childNodes[counter].nodeType == Node.TEXT_NODE && targetNode.childNodes[counter].nodeValue == elementsObject[key])
{
found = true;
}
counter++;
}
}
if (!found)
{
// MGP 040209: Cope with strings split by linebreaks - need to insert <br> elements
if ( elementsObject[key].indexOf("\n") == -1 )
{
newNode = document.createTextNode(elementsObject[key]);
if (refChild)
{
targetNode.insertBefore(newNode, refChild);
}
else
{
targetNode.appendChild(newNode);
}
}
else
{
// Found some linebreaks - split the string into component parts
var newNodeParts = elementsObject[key].split("\n");
// Loop through the parts, adding a linebreak after each one (except the last one)
for ( var i = 0; i < newNodeParts.length; i++ )
{
// Check for the existence of a star rating in the text node
if ( newNodeParts[i].match(/\d\*$/) )
{
// Found a star rating - extract the star
lastSpace = newNodeParts[i].lastIndexOf(" ");
newNodeString = newNodeParts[i].substring( 0, lastSpace );
starImgSrc = 'https://q.bstatic.com/static/img/icons/stars/' + newNodeParts[i].substr( lastSpace + 1, 1 ) + 'sterren-small.png';
}
else
{
newNodeString = newNodeParts[i];
starImgSrc = '';
}
newNode = document.createTextNode(newNodeString);
if (refChild)
{
targetNode.insertBefore(newNode, refChild);
if ( starImgSrc )
{
newImg = document.createElement('img');
newImg.setAttribute('src', starImgSrc);
newImg.className = "stars";
targetNode.insertBefore(newImg, refChild);
}
}
else
{
targetNode.appendChild(newNode);
if ( starImgSrc )
{
newImg = document.createElement('img');
newImg.setAttribute('src', starImgSrc);
newImg.className = "stars";
targetNode.appendChild(newImg);
}
}
if ( i < newNodeParts.length - 1)
{
// Add a <br>
newBR = document.createElement("br");
if (refChild)
{
targetNode.insertBefore(newBR, refChild);
}
else
{
targetNode.appendChild(newBR);
}
}
}
}
}
}
else
{
if (primaryKey == 'cdata') // CDATA
{
targetNode.appendChild(document.createCDATASection(elementsObject[key]));
}
}
}
else {
		
	// Element
	// If targetNode was passed into this function, append the new child to it??
	if (targetNode)
	{
	// If elementsObject[key] is an array, we??l create an element of type key for each array member.
	if (elementsObject[key].length > 0)
	{
	for (counter = 0; counter < elementsObject[key].length; counter++)
	{
	if (elementsObject[key][counter])
	{
	if (!elementsObject[key][counter]._node)
	{
	newElement = document.createElement(key);
	elementsObject[key][counter]._node = newElement;
	var r = counter + 1;
	while (r < elementsObject[key].length && !refChild)
	{
	if (elementsObject[key][r])
	{
	refChild = elementsObject[key][r]._node;
	}
	r++;
	}
	if (refChild)
	{
	newNode = targetNode.insertBefore(
	elementsObject[key][counter]._node,
	refChild);
	}
	else
	{
	newNode = targetNode.appendChild(
	elementsObject[key][counter]._node);
	}
	arguments.callee(
	elementsObject[key][counter],
	newNode);
	newElement._elementTree = elementsObject[key][counter];
	}
	else
	{
	arguments.callee(
	elementsObject[key][counter],
	elementsObject[key][counter]._node);
	}
	}
	}
	}
	else
	{
	if (elementsObject[key].length !== 0)
	{
	if (!elementsObject[key]._node)
	{
	newElement = document.createElement(key);
	elementsObject[key]._node = newElement;
	if (refChild)
	{
	newNode = targetNode.insertBefore(
	elementsObject[key]._node,
	refChild);
	}
	else
	{
	newNode = targetNode.appendChild(
	elementsObject[key]._node);
	}
	arguments.callee(
	elementsObject[key],
	newNode);
	newElement._elementTree = elementsObject;
	}
	else
	{
	arguments.callee(
	elementsObject[key],
	elementsObject[key]._node);
	}
	}
	}
	}
	// else create the new element as targetNode.
	else {
		if (!elementsObject[key]._node) {
			arguments.callee(elementsObject[key],
			elementsObject[key]._node = targetNode = document.createElement(key));
		}
			else {
				arguments.callee(elementsObject[key],
				elementsObject[key]._node);
			}
	}
}
}
}
}
}
return targetNode;
};