/*
	HOTEL RESERVATION FORM 2.0 [SCRIPT ENGINE]
	download at: http://acidmartin.wemakesites.net/?pageId=HotelReservationForm
	created by: Martin Ivanov
	email: acid_martin@yahoo.com, martin@acidmartin.com
	personal website: http://acidmartin.wemakesites.net/
	portfolio: http://wemakesites.net
	
	IMPORTANT REGULATIONS:
	
	1. IF YOU ARE USING THE OBFUSCATED VERSION OF HOTEL RESERVATION FORM, IT IS FORBIDDEN TO DEOBFUSCATE AND MODIFY THIS SRCIPT WITHOUT AUTHOR'S WRITTEN PERMISSION. OTHERWISE SUCH ACTIONS WILL BE CONSIDERED VIOLATIONS OF THE COPYRIGHT LAWS AND LEGAL STEPS WILL BE TAKEN.
	
	2. IF YOU HAVE PURCHASED THE SOURCE CODE OF HOTEL RESERVATION FORM, YOU CANNOT USE THIS SCRIPT ON WEBPAGES WITHOUT
	OBFUSCATING IT. OTHERWISE SUCH ACTIONS WILL BE CONSIDERED VIOLATIONS OF THE COPYRIGHT LAWS AND LEGAL STEPS WILL BE TAKEN.
*/

/* EDITABLE PROPERTIES */

/* general settings */
var reservationformroot = 'Scripts'; // scripts root folder
var reservationformjsskin = 'Vista'; // reservation form skin
var formwidth = '500'; // reservation form width

var validation_enabled = true; // is form validation enabled: "true" or "false"
var enable_print = true; // allow print: "true" or "false"

/* hotel settings */
var hotel_name = 'Woods Farm Accommodation';
var hotel_check_in_hours = '15.00 - 00.00'; // hotel's check-in hours range
var hotel_check_out_hours = '09.00 - 10.00'; // hotel's check-out hours range

/* the text below will appear when the form is printed by the person who is making the reservation and on the preview panel */
var print_form_free_text = [
	'<p>Thank you for choosing Woods Farm Accommodation. Please, print and keep this reservation form for further reference.</p>' +
	'<p>In case of cancellation, you have to contact us on <a href="mailto:reservations@woodsfarm.co.uk">reservations@woodsfarm.co.uk</a> or on the following phone number 01769 551784 or 07774 977 198 this must be at least 2 days before the check-in.</p>' +
	'<p>You will receive a copy of it on the email you have provided and we will send you a confirmation email soon.</p>'
];

/* form strings */
var reservation_first_name_label = 'First Name'; // person's first name label
var reservation_last_name_label = 'Last Name'; // person's last name label
var reservation_email_name_label = 'Email'; // email label
var reservation_phone_label = 'Phone Number'; // phone number label
var reservation_check_in_label = 'Check-in'; // check-in datepicker label
var reservation_check_out_label = 'Check-out'; // check-out datepicker label
var smoking_label = 'Accommodation Type'; // smoking room label
var smoking_yes = 'Farm House'; // "yes" option
var smoking_no = 'B&amp;B'; // "no" option
var number_of_guests_label = 'Number of Guests'; // number of guests label
var max_number_of_guests_count = 10; // number of guests count
var notes_label = 'Notes'; // additional notes label
var book_now_label = 'Book Now'; // "book now" button text
var personal_info_legend = 'Personal Information'; // personal information area text
var dates_legend = 'Reservation Details'; // reservation details area text
var options_legend = 'Reservation Options'; // reservation options area text
var preview_label = 'Print Preview'; // "preview" button label (will appear only if var enable_print = true)
var print_label = 'Print Reservation'; // "print" button label (will appear only if var enable_print= true)
var guestname_label = 'Guest name'; // "guest name" label in the preview panel
var close_label = 'Close'; // "close" link in the preview panel
var reservation_id_string = 'Reservation ID'; // "reservation id" string
var reservation_sent = 'your reservation has been sent'; // message that will be displayed when the reservation form has been processed

/* antispam settings */
var antispam_enabled = true; // is antispam security form code enabled: "true" or "false"
var antispam_label = 'Antispam Check'; // antispam code area text
var new_security_code_label = 'new security code'; // "create new security code" string
var security_code_instructions = 'Please, type the security code on the left in the textbox next to it.'; // security code instrucions that can contain HTML

/* here you can add booking reservations that can contain HTML */
var instructions = [
	'<p>Thank you for choosing Woods Farm Accommodation</p>' +
	'<p>Please, fill and submit the form below to book either self catering or B&amp;B with us. Once we receive your reservation, we will send you a confirmation email.</p>' +
	'<p>All fields except "' + notes_label + '" are required.</p>'
];

/* confirmation email settings */
var confirmation_email_body = 'Thanks for your online booking we will be in contact very soon!!';
var send_booking_confirmation_email_button = 'send confirmation email';

/* END OF EDITABLE PROPERTIES */

var hotelreservationformjs = {};

var brjsSkin = reservationformjsskin;
var brjsFolder = reservationformroot;

var srjsSkin = reservationformjsskin;
var srjsFolder = reservationformroot;
var srjsEnabled = true;
var srjsItemScrolling = true;
var srjsOptionsListHeight = 'auto';

hotelreservationformjs.init = function ()
{
	if (window.addEventListener)
	{
		window.addEventListener('load', function (event)
		{
			renderHotelReservationFormJs ();
		}, false);
	}
	if (window.ActiveXObject)
	{
		window.attachEvent('onload', function (event)
		{
			renderHotelReservationFormJs();
		});
	}
};

function renderHotelReservationFormJs()
{
	loadStylesheet(reservationformroot + '/jQuery.HotelReservationForm.JS/Styles/Styles.css'); // load datepicker skin
	
	loadStylesheet(reservationformroot + '/HotelReservationForm.JS/Scripts/HotelReservationFormJS.css'); // load reservation form base stylesheet
	loadStylesheet(reservationformroot + '/HotelReservationForm.JS/Skins/' + reservationformjsskin + '/Styles.css'); // load reservation form skin

	var loader = $get('HotelReservationFormJs');
	var form = $create('form');
	var flv = true;
	
	form.setAttribute('name', 'contactform');
	form.autoComplete = 'off';
	loader.className = 'HotelReservationFormJs HotelReservationFormJs_' + reservationformjsskin;
	loader.style.width = formwidth + 'px';

	form.innerHTML = [
		'<div id="RelativeFormWrapper">' +
			'<div id="LoadingPanelProperties">loading panel properties</div>' +
			'<div id="LoadingPanelPropertiesDitherColor">dithercolor</div>' +
			'<div id="ReservationInstructions">' + instructions + '</div>' +
			'<fieldset>' +
				'<legend><span>' + personal_info_legend + '</span></legend>' +
				'<ul class="personal-info">' +
					'<li><label for="reservation_first_name_label">' + reservation_first_name_label + '</label><input title="' + reservation_first_name_label + '" type="text" id="reservation_first_name_label" onkeyup="this.className = \'\';" name="firstname" /></li>' +
					'<li><label for="reservation_last_name_label">' + reservation_last_name_label + '</label><input title="' + reservation_last_name_label + '" type="text" id="reservation_last_name_label" onkeyup="this.className = \'\';" name="lastname" /></li>' +
					'<li><label for="reservation_email_name_label">' + reservation_email_name_label + '</label><input title="' + reservation_email_name_label + '" type="text" id="reservation_email_name_label" onkeyup="this.className = \'\';" name="email" /></li>' +
					'<li><label for="reservation_phone_label">' + reservation_phone_label + '</label><input title="' + reservation_phone_label + '" type="text" id="reservation_phone_label" onkeyup="this.className = \'\';" /></li>' +
				'</ul>' +
			'</fieldset>' +
			'<fieldset>' +
				'<legend><span>' + dates_legend + '</span></legend>' +
				'<ul class="check-in-check-out">' +
					'<li><label for="check_in_datepicker">' + reservation_check_in_label + '</label><input title="' + reservation_check_in_label + '" type="text" id="check_in_datepicker" onkeyup="this.className = \'\';" /></li>' +
					'<li><label for="check_out_datepicker">' + reservation_check_out_label + '</label><input title="' + reservation_check_out_label + '" type="text" id="check_out_datepicker" onkeyup="this.className = \'\';" /></li>' +
				'</ul>' +
			'</fieldset>' +
			'<fieldset>' +
				'<legend><span>' + options_legend + '</span></legend>' +
				'<ul class="reservation-options">' +
					'<li><label for="smoking_label">' + smoking_label + '</label>' + 
						'<span><!-- / --></span><select id="smoking_label" title="' + smoking_label + '">' +
							'<option value="' + smoking_no + '" selected="selected">' + smoking_no + '</option>' +
							'<option value="' + smoking_yes + '">' + smoking_yes + '</option>' +
						'</select><span><!-- / --></span>' +
					'</li>' +
					'<li><label for="number_of_guests_label">' + number_of_guests_label + '</label>' +
						'<span><!-- / --></span><select id="number_of_guests_label" title="' + number_of_guests_label + '">' +
							
						'</select><span><!-- / --></span>' +
					'</li>' +
					'<li>' +
						'<label for="notes_label">' + notes_label + '</label>' +
						'<textarea title="' + notes_label + '" id="notes_label" cols="10" rows="5" onkeyup="this.className = \'\';"></textarea>' +
					'</li>' +
				'</ul>' +
			'</fieldset>' +
			'<fieldset id="AntispamPanel">' +
				'<legend><span>' + antispam_label + '</span></legend>' +
				'<div>' +
					'<p>' + security_code_instructions + '</p>' +
					'<label for="SecurityCodeCheck" unselectable="on" style="position: relative;">' + 
							'<span id="SecurityCodeLoader" unselectable="on">' + createGUIDKey() + '</span>' + 
							'<span id="SecurityCodeOverlay" unselectable="on">' +
								'<img width="116" height="48" src="' + reservationformroot + '/HotelReservationForm.JS/Scripts/Transparent.gif" />' +
							'</span>' +
					'</label>' +
					'<input type="text" id="SecurityCodeCheck" size="4" maxlength="4" onkeyup="this.className = \'\';" />' +
					'<p class="new-security-code"><a href="javascript:void(0)" title="' + new_security_code_label + '" onclick="generateNewSecurityCode();" title="new_security_code_label">' + new_security_code_label + '</a></p>' +
				'</div>' +
			'</fieldset>' +
			'<div class="buttons-area">' +
				'<span><!-- / --></span><input type="button" value="' + book_now_label + '" id="SubmitReservation" onclick="validateReservationForm();" /><span><!-- / --></span><span style="margin-left: 4px;"><!-- / --></span><input type="button" id="preview_label" value="' + preview_label + '" onclick="preview()" /><span><!-- / --></span><span style="margin-left: 4px;"><!-- / --></span><input id="print_label" type="button" value="' + print_label + '" onclick="printForm();" /><span><!-- / --></span>' +
				'<span id="ReservationSent">' + reservation_sent + '</span>' +
			'</div>' +
			'<div id="flv" style="display: none;"> </div>' + 
			'<div style="display: none;">' +
				'<input type="text" id="reservationid" name="reservationid" value="' + createGUIDKey() + createGUIDKey() + '" />' +
				'<textarea id="reservationbody" name="reservationbody">lorem ipsum dolor sit amet...</textarea>' +
				'<input type="button" id="LoadingItemFix" />' +
			'</div>' +
		'</div>'
	];
	
	loader.appendChild(form);
	
	$get('SecurityCodeLoader').title = $get('SecurityCodeLoader').innerHTML;
	$get('SecurityCodeOverlay').title = $get('SecurityCodeLoader').innerHTML;
	
	if(flv)
	{
		$get('flv').innerHTML = '';
	}

	if(!antispam_enabled)
	{
		$get('AntispamPanel').style.display = 'none';
	}

	if(enable_print)
	{
		var previewPane = $create('div');
		var previewOverlay = $create('div');

		previewPane.id = 'PreviewPane';
		previewOverlay.id = 'PreviewOverlay';

		previewPane.style.width = loader.offsetWidth - '42' + 'px';
		previewOverlay.style.height = loader.offsetHeight + 'px';

		form.childNodes[0].appendChild(previewPane);
		form.childNodes[0].appendChild(previewOverlay);

		previewclose();
	}
	
	for(var i = 0; i < max_number_of_guests_count; i ++)
	{
		var guestoption = $create('option');
		guestoption.value = i + 1;
		guestoption.innerHTML = i + 1;

		$get('number_of_guests_label').appendChild(guestoption);
	}
	
	replaceButtons();
	replaceSelectBoxes();

	disableReplacedButton('SubmitReservation');

	setTimeout(function(e)
	{
		renderAjaxLoadingPanel();
		enableReplacedButton('SubmitReservation');
	}
	, 5000);
	jQuery.noConflict();
	jQuery(document).ready(function()
	{
		jQuery("#check_in_datepicker").datepicker({showOn: 'both', minDate: 0, buttonImage: '' + reservationformroot + '/HotelReservationForm.JS/Scripts/Transparent.gif', buttonImageOnly: true, dateFormat: 'DD, d MM, yy'});
		jQuery("#check_out_datepicker").datepicker({showOn: 'both', minDate: 0, buttonImage: '' + reservationformroot + '/HotelReservationForm.JS/Scripts/Transparent.gif', buttonImageOnly: true, dateFormat: 'DD, d MM, yy'});
	});

	if(!enable_print)
	{
		$get('print_label_ReplacedButton').className = 'option-disabled';
		$get('preview_label_ReplacedButton').className = 'option-disabled';
	}

	if(window.ActiveXObject)
	{
		setTimeout(function(e)
		{
			$get('LoadingItemFix').click(); // fix the "1 item remaining" statusbar message of Internet Explorer
		}, 10000);
	}
}

function generateNewSecurityCode()
{
	var loader = $get('SecurityCodeLoader');
	var overlay = $get('SecurityCodeOverlay');
	
	loader.style.visibility = 'hidden';
	overlay.style.visibility = 'hidden';
	
	loader.innerHTML = createGUIDKey();
	overlay.title = loader.innerHTML;
	setTimeout(function()
		{
			loader.style.visibility = 'visible';
			overlay.style.visibility = 'visible';
	}, 50);
}

function createGUIDKey() 
{
	return (((1 + Math.random()) * 0x10000)|0).toString(16).substring(1);
}

function preview()
{
	var previewPane = $get('PreviewPane');
	previewPane.innerHTML = [
		'<ul class="preview-pane-options">' +
			'<li id="OptionsPrint"><a href="javascript:void(0)" onclick="printForm()" title="' + print_label + '">' + print_label + '</a></li>' +
			'<li id="OptionsClose"><a href="javascript:void(0)" onclick="previewclose()" title="' + close_label + '">' + close_label + '</a></li>' +
		'</ul>' +
		'<h3>' + hotel_name + '</h3>' +
		'<p>' + print_form_free_text + '</p>' +
		'<ul>' + 
			'<li>' + reservation_id_string + ': <strong>' + $get('reservationid').value + '</strong></li>' +
			'<li>' + guestname_label + ': ' + $get('reservation_first_name_label').value + ' ' + $get('reservation_last_name_label').value + '</li>' +
			'<li>' + reservation_email_name_label + ': <a href="mailito: ' + $get('reservation_email_name_label').value + '">' + $get('reservation_email_name_label').value + '</a></li>' +
			'<li>' + reservation_phone_label + ': ' + $get('reservation_phone_label').value  + '</li>' +
			'<li>' + reservation_check_in_label + ': ' + $get('check_in_datepicker').value + ', ' + hotel_check_in_hours + '</li>' +
			'<li>' + reservation_check_out_label + ': ' + $get('check_out_datepicker').value + ', ' + hotel_check_out_hours + '</li>' +
			'<li>' + number_of_guests_label + ': ' + $get('number_of_guests_label').value + '</li>' +
			'<li>' + smoking_label + ': ' + $get('smoking_label').value + '</li>' +
			'<li>' + notes_label + ': ' + $get('notes_label').value + '</li>' +
		'</ul>'
	];
	previewshow();
	if(!enable_print)
	{
		$get('OptionsPrint').style.display = 'none';
	}
}

function previewclose()
{
	$get('PreviewPane').style.display = 'none';
	$get('PreviewOverlay').style.display = 'none';
}

function previewshow()
{
	var inputs = $get('HotelReservationFormJs').getElementsByTagName('input');
	for(var i = 0; i < inputs.length; i ++)
	{
		inputs[i].blur();
	}
	
	$get('PreviewPane').style.display = 'block';
	$get('PreviewOverlay').style.display = 'block';
}

function printForm()
{
	$get('PreviewPane').style.display = 'block';
	$get('PreviewOverlay').style.display = 'block';
	preview();
	window.print();
}

function attachDomEvent(ElementId, EventType, ClientFunction)
{
	var ClientEventType;
	if(window.attachEvent)
	{
		ClientEventType = 'on' + EventType;
		$get(ElementId).attachEvent(ClientEventType, ClientFunction)
	}
	else
	{
		$get(ElementId).addEventListener(EventType, ClientFunction, false);
	}
}

function $create(element)
{
	return document.createElement(element);
}

function $get(stringId)
{
	return document.getElementById(stringId);
}

function loadStylesheet(file)
{
	var stylesheet = document.createElement('link');
	stylesheet.setAttribute('type', 'text/css');
	stylesheet.setAttribute('rel', 'stylesheet');
	stylesheet.setAttribute('href', file);
	document.getElementsByTagName('head')[0].appendChild(stylesheet);
}

function validateReservationForm()
{
	var name = $get('reservation_first_name_label');
	var surname = $get('reservation_last_name_label');
	var email = $get('reservation_email_name_label');
	var phone = $get('reservation_phone_label');
	var checkin = $get('check_in_datepicker');
	var checkout = $get('check_out_datepicker');
	var notes = $get('notes_label');

	var emailsplit = email.value.split('@');

	if(validation_enabled == true)
	{
		// check first name
		if(name.value == '')
		{
			name.className = 'required-field';
			name.focus();
			return false;
		}
		
		// check last name
		if(surname.value == '')
		{
			surname.className = 'required-field';
			surname.focus();
			return false;
		}
		
		// check email
		if(email.value == '')
		{
			email.className = 'required-field';
			email.focus();
			return false;
		}
		if(email.value.indexOf('@') < 0)
		{
			email.className = 'required-field';
			email.focus();
			return false;
		}
		if(emailsplit[0] == '')
		{
			email.className = 'required-field';
			email.focus();
			return false;
		}
		if(emailsplit[1] == '')
		{
			email.className = 'required-field';
			email.focus();
			return false;
		}
		if(email.value.indexOf('.') < 0)
		{
			email.className = 'required-field';
			email.focus();
			return false;
		}
		
		// check phone number
		if(phone.value == '')
		{
			phone.className = 'required-field';
			phone.focus();
			return false;
		}
		if(isNaN(phone.value))
		{
			phone.className = 'required-field';
			phone.focus();
			return false;
		}

		// check dates
		if(checkin.value == '')
		{
			checkin.className += ' required-field';
			checkin.focus();
			clearRequiredClass(checkin);
			return false;
		}
		if(checkout.value == '')
		{
			checkout.className += ' required-field';
			checkout.focus();
			clearRequiredClass(checkout);
			return false;
		}
		else
		{
			checkSecutityCode();
		}
	}
	else
	{
		checkSecutityCode();
	}
}

function checkSecutityCode()
{
	if(antispam_enabled)
	{
		var codeloader = $get('SecurityCodeLoader');
		var codechecker = $get('SecurityCodeCheck');
		if(codechecker.value == '' || codechecker.value != codeloader.innerHTML)
		{
			codechecker.className = 'required-field';
			codechecker.select();
		}
		else
		{
			submitReservationForm();
		}
	}
	else
	{
		submitReservationForm();
	}
}

function clearRequiredClass(element)
{
	setTimeout(function()
		{
			removeClassName(element, 'required-field');
		}, 1000
	);
}

function removeClassName(oElm, strClassName)
{
	var oClassToRemove = new RegExp((strClassName + "\s?"), "i");
	oElm.className = oElm.className.replace(oClassToRemove, "").replace(/^\s?|\s?$/g, "");
}

/* form submission runtime */
function createRequestObject() 
{
	var ro;
	var browser = navigator.appName;
	if(browser == "Microsoft Internet Explorer")
		{
			ro = new ActiveXObject("Microsoft.XMLHTTP");
	}
	else
	{
		ro = new XMLHttpRequest();
	}
	return ro;
}

var http = createRequestObject();

function submitReservationForm()
{
	populateReservationBody();
	
	var reservation = [
		'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml1.0.dtd">' +
		'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">' +
		'<head>' +
			'<title>Woods Farm Reservation Form</title>' +
			'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />' +
			'<link rel="stylesheet" type="text/css" href="../Scripts/HotelReservationFormJS.css"></link>' +
		'</head>' +
		'<body class="reservation">' +
			'<div class="HotelReservationFormJs">'
			+ $get('reservationbody').value +
			'</div>' +
				'<div class="notes">' +
					'<p></p>' +
				'</div>' +
			'</body>' +
		'</html>'
	];
	
	var isIE7 = /msie|MSIE 7/.test(navigator.userAgent);
	if(!isIE7)
	{
		var reservationid = document.contactform.reservationid.value;
		var email = document.contactform.email.value;
		var firstname = document.contactform.firstname.value;
		var lastname = document.contactform.lastname.value;
	}
	else
	{
		var reservationid = $get('reservationid').value;
		var email = $get('email').value;
		var firstname = $get('firstname').value;
		var lastname = $get('lastname').value;
	}
		
	var extension = '.html';
	var filename = firstname + '_' + lastname + '_' + reservationid + extension;
	var personname = firstname + ' ' + lastname;
	
	http.open('get', reservationformroot + '/HotelReservationForm.JS/Backend/ProcessReservationForm.php?msg='+reservation+'&filename='+filename+'&email='+email+'&personname='+personname);
	http.onreadystatechange = function()
	{
		if(http.readyState == 4)
		{
			setTimeout(function(e)
			{	
				hideLoadingPanel();
				$get('ReservationSent').style.visibility = 'visible';
			}, 2000);
		}
		else
		{
			displayLoadingPanel();
		}
	 }
http.send(null);
	 // finish the server call
	disableReplacedButton('SubmitReservation');
}

function populateReservationBody()
{
	var reservationbody = $get('reservationbody');

	reservationbody.value = [
		'<ul class="preview-pane-options">' +
			'<li id="OptionsPrint"><a href="javascript:void(0)" onclick="window.print()" title="' + print_label + '">' + print_label + '</a></li>' +
			'<li id="OptionsClose"><a href="javascript:void(0)" onclick="window.close()" title="' + close_label + '">' + close_label + '</a></li>' +
		'</ul>' +
		'<h1>Reservation Details</h1>' +
		'<h3>' + hotel_name + '</h3>' +
		'<ul>' + 
			'<li>' + reservation_id_string + ': <strong>' + $get('reservationid').value + '</strong></li>' +
			'<li>' + guestname_label + ': ' + $get('reservation_first_name_label').value + ' ' + $get('reservation_last_name_label').value + '</li>' +
			'<li>' + reservation_email_name_label + ': <a href="mailito: ' + $get('reservation_email_name_label').value + '">' + $get('reservation_email_name_label').value + '</a></li>' +
			'<li>' + reservation_phone_label + ': ' + $get('reservation_phone_label').value  + '</li>' +
			'<li>' + reservation_check_in_label + ': ' + $get('check_in_datepicker').value + ', ' + hotel_check_in_hours + '</li>' +
			'<li>' + reservation_check_out_label + ': ' + $get('check_out_datepicker').value + ', ' + hotel_check_out_hours + '</li>' +
			'<li>' + number_of_guests_label + ': ' + $get('number_of_guests_label').value + '</li>' +
			'<li>' + smoking_label + ': ' + $get('smoking_label').value + '</li>' +
			'<li>' + notes_label + ': ' + $get('notes_label').value + '</li>' +
		'</ul>' +
		'<div>' +
			'<a class="send-confirmation-email" href="mailto:' + $get('reservation_email_name_label').value + '?subject=' + hotel_name + ' Booking Confirmation ID: ' + $get('reservationid').value + '%26body=' + confirmation_email_body + '" target="_blank">' + send_booking_confirmation_email_button + '</a>' +
		'</div>'
	];
}

