// Set initial values for global variables
var num_RoomsRequired;
var obj_Occupancy;
var obj_ChildAges;

/* Sets up the number of rooms and the like */
var arr_RoomData = [];
var arr_ChildAges = [];
for (i=0;i<6;i++) arr_RoomData[i] = {'a':2,'c':0,'s':false};

var minStringLen = 2;
var lastSearch = "";
var currentSearch = 0;
var hideElements = Array('nightsDrop','roomsRequiredSelect','daysLaterSelectFrame','departureSelectEle','agesOuterFrame');

/************************************************************************/
/* Internal call functions												*/
/************************************************************************/
function js_DOMCreateDiv(str_Class, str_Text, obj_ChildNode) {
	el_NewDiv = document.createElement("DIV");
	if (str_Class.len > 0) {
		if (navigator.userAgent.indexOf('MSIE') == -1) 
			el_NewDiv.setAttribute("class", str_Class);
		else
			el_NewDiv.setAttribute("className", str_Class);
	}
	if (str_Text != '') {
		el_NewText = document.createTextNode(str_Text);
		el_NewDiv.appendChild(el_NewText);
	}
	if (obj_ChildNode)
		el_NewDiv.appendChild(obj_ChildNode);
	return el_NewDiv;
}

function js_DOMCreateP(str_Class, str_Text, obj_ChildNode) {
	el_NewDiv = document.createElement("P");
	if (str_Class.len > 0) {
		if (navigator.userAgent.indexOf('MSIE') == -1) 
			el_NewDiv.setAttribute("class", str_Class);
		else
			el_NewDiv.setAttribute("className", str_Class);
	}
	if (str_Text != '') {
		el_NewText = document.createTextNode(str_Text);
		el_NewDiv.appendChild(el_NewText);
	}
	if (obj_ChildNode)
		el_NewDiv.appendChild(obj_ChildNode);
	return el_NewDiv;
}

function js_checkChildAgesFilled(formEle) {
	while (formEle.tagName!=='FORM') formEle=formEle.parentNode;	
	rExp=/frm_Child[0-9]/gi;
	allSet=true;
	if(formEle.elements.length>0) for(i=0;i<formEle.elements.length;i++) if(formEle.elements[i].id.search(rExp)>-1 && formEle.elements[i].options[formEle.elements[i].selectedIndex].value==-1) allSet=false;
	return allSet;
}

function js_DOMCreateSelect(str_FieldName, num_Min, num_Max) {
	el_NewSelect = document.createElement('SELECT');
	el_NewSelect.setAttribute('name', str_FieldName);
	el_NewSelect.setAttribute('id', str_FieldName);
	rExp=/frm_Child[0-9]/gi;
	if (str_FieldName.search(rExp)>-1) {
		js_addOption(el_NewSelect,'-1','-',false);
		if(document.getElementById('holSearchSubmit')) {
			el_NewSelect.onchange=function(){js_checkChildAgesFilled(this)};
		}
	}
	rExp=/frm_AdultsRoom[0-9]/gi;
	for (j = num_Min; j <= num_Max; j++) 
		if ((str_FieldName.search(rExp)>-1) && (j==2))
			js_addOption(el_NewSelect, j, j, true);
		else
			js_addOption(el_NewSelect, j, j, false);
	return el_NewSelect;
}

function js_SelectRoomOccupants(num_Rooms) {
	for (rl = 0; rl < num_Rooms; rl++) {
		num_RoomNum = rl + 1;
		var num_children = parseInt(obj_Occupancy["occupancy"][rl]["num_numchildren"]) + parseInt(obj_Occupancy["occupancy"][rl]["num_numinfants"]);
		js_selectValue('frm_AdultsRoom'+(num_RoomNum), obj_Occupancy["occupancy"][rl]["num_numadults"], false);
		js_selectValue('frm_ChildrenRoom'+(num_RoomNum), num_children, false);
	}
}

function js_SelectChildAges() {
	var num_Children = 0;
	for (i = 1; i <= num_RoomsRequired; i++) {
		num_Children = num_Children + parseInt($('frm_ChildrenRoom'+i).value)
	}
	for (ch = 1; ch <= num_Children; ch++) {
		js_selectValue('frm_Child'+(ch), arr_ChildAges[ch-1], false);
	}
}


// Function to add an option to a select list
function js_addOption(obj_docElem, str_value, str_text, bol_Selected) {
	var newElem = document.createElement("OPTION");
	newElem.value = str_value;
	newElem.text = str_text;
	if (bol_Selected) newElem.selected = 'selected';
	if (navigator.userAgent.indexOf('MSIE') == -1)
		obj_docElem.add(newElem, null);
	else
		obj_docElem.add(newElem);
}

// Function to select a value in the select list
function js_selectValue(str_formID, str_changeToValue, bol_CallOnChange) {
	var obj_SelectList = $(str_formID);
	var num_SelectListItems = obj_SelectList.childNodes.length;
	if (num_SelectListItems != 0) {
		for (i=0; i<num_SelectListItems; i++) {
			if (obj_SelectList.childNodes[i].value == str_changeToValue) {
				obj_SelectList.childNodes[i].selected = true;
				if (bol_CallOnChange)
					obj_SelectList.onchange();
				return true;
			}
		}
	}
}

// Function to remove the first child of a select list
function js_removeFirstChild(obj_docElem) {
	obj_docElem.removeChild(obj_docElem.firstChild);
}

// Function to remove all items from a select list
function js_removeAllChildren(obj_docElem) {
	if (obj_docElem !== null && obj_docElem.firstChild) {
		while (obj_docElem.firstChild) {
			obj_docElem.removeChild(obj_docElem.firstChild);
		}
	}
}


/***************************************************************************************/
/* Check destination functions for holidays and flights */
/***************************************************************************************/
function checkHolidayForm(formObj) {
	if ($('num_destID')) {
		if ($('num_destID').value == 0) {
			alert('Please select a destination from the list. Thank you.');
			return false;
		}
	}
	if ($('num_deptID')) {
		if ($('num_deptID').value == 0) {
			alert('Please select a specific station/airport to travel from. Thank you.');
			return false;
		}
	}
	if ($('cal1input')) {
		if (checkYCalDate(1) == false) {
			alert('Please enter date in the format DD/MM/YYYY');
			return false;
		}
	}
	if ($('cal2input')) {
		if (checkYCalDate(2) == false) {
			alert('Please enter date in the format DD/MM/YYYY');
			return false;
		}
	}
	
	if(!js_checkChildAgesFilled(formObj)) {
		alert('Please enter the ages of all under 18s before continuing');
		return false;
	}
	
	return true;
}

/************************************************************************/
/* External call functions												*/
/************************************************************************/

// Function to initialise the search form
function initHolidaySearchForm() {
	for (i=1;i<10;i++) {
		if ($('JSonly_'+i)) {
			$('JSonly_'+i).style.display = 'block';
		} else break;
	}
	for (i=1;i<10;i++) {
		if ($('JSonlyrow_'+i)) {
			$('JSonlyrow_'+i).style.display = 'table-row';
		} else break;
	}
	
	try {$('cal1input').style.backgroundImage='url(/images/icon_calendar.gif)';} catch (e) {}
	try {$('cal2input').style.backgroundImage='url(/images/icon_calendar.gif)';} catch (e) {}
	try {num_RoomsRequired = $('frm_RoomsRequired').value;} catch (e) {}
	
	
	try {
		if ($('hs_ChildAges')) $('hs_ChildAges').style.display = 'block';
		js_OutputRoomOccupants(num_RoomsRequired);
		js_selectValue('frm_AdultsRoom1', 2, false);
		if (obj_Occupancy)
			js_SelectRoomOccupants(num_RoomsRequired);
		js_OutputChildAges();
		js_SelectChildAges();
	} catch (e) {}
	
	try {
		// MSO7139
		// Room population would go here, but on main search is not an issue
		hsf_SetNumRooms(num_RoomsRequired);
	} catch (e){}
}

function js_OutputRoomOccupants(num_Rooms) {
	obj_Occupants = $('hs_Occupants');
	num_RoomsRequired = num_Rooms;
	js_removeAllChildren(obj_Occupants);
	for (i = 1; i <= num_Rooms; i++) {
		// Create select lists
		obj_AdultsSelect = js_DOMCreateSelect('frm_AdultsRoom'+i, 1, 9);
		obj_ChildrenSelect = js_DOMCreateSelect('frm_ChildrenRoom'+i, 0, 9);
		// Create div's
		obj_RoomNumber = js_DOMCreateP('hs_OccupantsRoomNumber', 'Room '+i);
		//obj_RoomNumber.style.padding = '0px';obj_RoomNumber.style.margin = '0px';
		obj_Adults = js_DOMCreateDiv('hs_OccupantsAdults', '', obj_AdultsSelect);
		obj_Children = js_DOMCreateDiv('hs_OccupantsChildren', '', obj_ChildrenSelect);
		if (navigator.userAgent.indexOf('MSIE') == -1)
			obj_Children.onchange = js_OutputChildAges;
		//obj_Clear = js_DOMCreateDiv('hs_Clear', '');
		obj_frame = js_DOMCreateDiv('','');
		// Append the div's to the main object
		obj_frame.appendChild(obj_RoomNumber);
		obj_frame.appendChild(obj_Adults);
		obj_frame.appendChild(obj_Children);
		obj_Occupants.appendChild(obj_frame);
		//obj_Occupants.appendChild(obj_Clear);
		if (navigator.userAgent.indexOf('MSIE') != -1)
			eventAttached = document.getElementById('frm_ChildrenRoom'+i).attachEvent('onchange', js_OutputChildAges);
	}
	js_OutputChildAges();
}

function js_OutputChildAges() {
	obj_ChildAges = $('hs_ChildAges');
	if (obj_ChildAges !== null) {
		js_removeAllChildren(obj_ChildAges);
		var num_Children = 0;
		for (i = 1; i <= num_RoomsRequired; i++) {
			num_Children = num_Children + parseInt($('frm_ChildrenRoom'+i).value)
		}
		if (num_Children != 0) {
		obj_IntroText = js_DOMCreateDiv('hs_ChildIntroText', 'Please specify the ages of under 18s at time of travel.');
			obj_IntroText.style.padding = "5px";
			obj_ChildAges.appendChild(obj_IntroText);
			//obj_ChildAges.appendChild(obj_Clear);
			for (i = 1; i <= num_Children; i++) {
				// Create select lists
				obj_ChildAgeSelect = js_DOMCreateSelect('frm_Child'+i, 0, 17);
				// Create div's
			obj_frame = js_DOMCreateDiv('','');
			obj_ChildNumber = js_DOMCreateP('hs_ChildrenNumber', '#'+i+' under 18');
			obj_ChildNumber.style.padding = '0px';obj_ChildNumber.style.margin = '0px';
				obj_ChildAge = js_DOMCreateDiv('hs_Children', '', obj_ChildAgeSelect);
				//obj_Clear = js_DOMCreateDiv('hs_Clear', '');
				// Append the div's to the main object
				obj_frame.appendChild(obj_ChildNumber);
				obj_frame.appendChild(obj_ChildAge);
				obj_ChildAges.appendChild(obj_frame);
				//obj_ChildAges.appendChild(obj_Clear);
			}
			obj_ChildAges.style.display = 'block';
		} else {
			obj_ChildAges.style.display = 'none';
		}
	}
}

/* MSO7139 :: generates new style dropdowns for rooms and child ages */
function hsf_ParseRooms() {
	/* Use arr_RoomData to populate the rooms */
	var canvas = $('hsf_roomcanvas');
	var c_child = 0;
	var el_list = [];
	var t_div;var t_txt;var t_opt;var t_sel;
	var tempchild;
	
	/* Empty canvas */
	while (canvas.firstChild) canvas.removeChild(canvas.firstChild);
	for (var i=0;i<arr_RoomData.length;i++) {
		if (arr_RoomData[i].s) {
			// Generate the room
				// Title
					t_txt = document.createTextNode('Room '+(i+1)+':');
					t_div = document.createElement('div');t_div.className = 'hsf_left';t_div.appendChild(t_txt);
					el_list[el_list.length]=t_div;
				// Dropdowns - adult
					t_sel = document.createElement('select');
					t_sel.name = 'frm_AdultsRoom'+(i+1);
					t_sel.id = 'f_ar_'+(i+1);
					t_sel.onchange = function(n_room) {hsf_SetRoomOcc(n_room,'a',$('f_ar_'+n_room).value);}.bind(this,(i+1));
					for (j=1;j<10;j++) {
						t_opt = document.createElement('option');
						t_opt.value = j;
						if (j == arr_RoomData[i].a) t_opt.selected=true;
						t_txt = document.createTextNode(j);
						t_opt.appendChild(t_txt);
						t_sel.appendChild(t_opt);
					}
					t_div = document.createElement('div');t_div.className = 'hsf_centerhalf';t_div.appendChild(t_sel);
					el_list[el_list.length]=t_div;
				// Dropdowns - child
					t_sel = document.createElement('select');
					t_sel.name = 'frm_ChildrenRoom'+(i+1);
					t_sel.id = 'f_cr_'+(i+1);
					t_sel.onchange = function(n_room) {hsf_SetRoomOcc(n_room,'c',$('f_cr_'+n_room).value);}.bind(this,(i+1));
					for (j=0;j<10;j++) {
						t_opt = document.createElement('option');
						t_opt.value = j;
						if (j == arr_RoomData[i].c) t_opt.selected=true;
						t_txt = document.createTextNode(j);
						t_opt.appendChild(t_txt);
						t_sel.appendChild(t_opt);
					}
					t_div = document.createElement('div');t_div.className = 'hsf_centerhalf';t_div.appendChild(t_sel);
					el_list[el_list.length]=t_div;
					
					t_div = document.createElement('div');t_div.className='hsf_clear';
					el_list[el_list.length]=t_div;
					
				// Child ages 
					if (arr_RoomData[i].c > 0) {
						for (j=0;j<arr_RoomData[i].c;j++) {
							c_child++;
							switch (c_child%10) {
								case 1 : c_ext = 'st'; break;
								case 2 : c_ext = 'nd'; break;
								case 3 : c_ext = 'rd'; break;
								default : c_ext = 'th'; break;
							}
							
							this_age = 99;
							if (arr_ChildAges.length > j) this_age = arr_ChildAges[j];
							else arr_ChildAges[j] = this_age;
							
							t_txt = document.createTextNode('Age of '+c_child+c_ext+' \'under 18\' at time of travel');
							t_div = document.createElement('div');t_div.className = 'hsf_lefthalf';t_div.appendChild(t_txt);
							el_list[el_list.length]=t_div;
							
							t_sel = document.createElement('select');
							t_sel.name = 'frm_Child'+c_child;
							t_sel.id = 'f_c_'+c_child;
							t_sel.onchange = function(n_child) {hsf_SetChildage(n_child,$('f_c_'+n_child).value);}.bind(this,c_child);
							t_opt = document.createElement('option');
							t_opt.value = '-';t_txt = document.createTextNode(t_opt.value);
							t_opt.appendChild(t_txt);t_sel.appendChild(t_opt);
							for (k=0;k<18;k++) {
								t_opt = document.createElement('option');
								t_opt.value = k;t_txt = document.createTextNode(t_opt.value);
								if (arr_ChildAges[c_child-1] == k) t_opt.selected = true;
								t_opt.appendChild(t_txt);t_sel.appendChild(t_opt);
							}
							t_div = document.createElement('div');t_div.className = 'hsf_centerhalf';t_div.appendChild(t_sel);
							el_list[el_list.length]=t_div;
							
							t_div = document.createElement('div');t_div.className='hsf_clear';
							el_list[el_list.length]=t_div;
						}
					}
		} else {break;}
	}
	for (i=0;i<el_list.length;i++) canvas.appendChild(el_list[i]);
}

function hsf_SetRoomOcc(n_room,s_type,n_number) {
	switch (s_type) {
		case 'c' :	arr_RoomData[n_room-1].c = n_number;
					hsf_ParseRooms();
					break;
		case 'a' :	arr_RoomData[n_room-1].a = n_number;
					break;
	}
}

function hsf_SetChildage(n_child,n_number) {
	arr_ChildAges[n_child-1] = n_number;
}

function hsf_SetNumRooms(n_rooms) {
	for(var i=0;i<n_rooms;i++) arr_RoomData[i].s = true;
	if (n_rooms < arr_RoomData.length) for(var j=n_rooms;j<arr_RoomData.length;j++)  arr_RoomData[j].s = false;
	hsf_ParseRooms();
}
/* END of MSO7139 */

function toggle_advSearch() {
	if($('hs_adv_hide')) var B=$('hs_adv_hide').style.display;
	if($('hs_adv_show')) var A=$('hs_adv_show').style.display;
	if (A && B) {
		$('hs_adv_show').style.display=B;
		$('hs_adv_hide').style.display=A;
		if($('hs_adv_1')) $('hs_adv_1').style.display=A;
		if($('hs_adv_2')) $('hs_adv_2').style.display=A;
		if($('hs_adv_3')) $('hs_adv_3').style.display=A;
		if($('hs_adv_4')) $('hs_adv_4').style.display=A;
	}
}



// FUNCTIONS FOR AJAX HOTEL SEARCH (FREEFORM)


function js_suggestHotel(searchString) {
	if ( searchString != lastSearch) {
		//js_hideAllPopups();
		if (searchString.length >= minStringLen) {
			// Perform search
				// Search token
				currentSearch++;
				// Update last search variable
				lastSearch = searchString;
				
				// Generate query string with string attached, not forgetting to specify if it's departure or destination
				var url = '/hotel_search_ajax.cfm';
				var pars = 'method=suggestHotel&currentSearch='+currentSearch+'&searchString='+searchString;
	
				// Submit the query string and then this function is done
				var myAjax = new Ajax.Request(	url, 
						{
							method: 'get', 
							parameters: pars, 
							onComplete: js_updateSuggestionField
						});
		} else {
			// If string is too short, clear out element
			js_hideAllPopups();
			var obj_divElement = $('hotel_suggestions');
			while (obj_divElement.firstChild) obj_divElement.removeChild(obj_divElement.firstChild);
			lastSearch = "";
		}
	}
}

function js_hideAndSelect() {
	// Find selected index
	selIndex = js_findSelectedIndex();
	// If there is a selected index, then execute onclick
	if (!isNaN(selIndex)) {
		$('hotel_suggestions').style.display = 'none';
		if ($('li_hotel_' + selIndex + '_text')) {
			$('hotel_name').value = $('li_hotel_' + selIndex + '_text').value;
			$('hotel_value').value = $('li_hotel_' + selIndex + '_id').value;
			if ($('sl_hotel_value')) $('sl_hotel_value').innerHTML = $('li_hotel_' + selIndex + '_id').value;
			lastSearch = $('hotel_name').value
		}
	}
	
	// Finally hide the element and show selects again
	js_hideAllPopups();
}

function js_findSelectedIndex() {
	// Need to first see if there is a list in the defined direction
	if (document.getElementById('hotel_ul')) {
		list = document.getElementById('hotel_ul');
		// Then need to find out how many children
		nChildren = list.childNodes.length;
		if (nChildren > 0) {
			// Then need to go through the children to find which is currently selected
			for (i = 0; i < nChildren; i++) {
				if (list.childNodes[i] && list.childNodes[i].className && list.childNodes[i].className == 'frm_suggest_list_hover') {
					return i;
				}
			}
		}
	}
	// If none is selected then false needs to be returned
	return false;
}

function js_highlightSelection(selIndex) {
	// Determine previously selected index
	curIndex = js_findSelectedIndex();
	if (document.getElementById('hotel_ul') && curIndex !== selIndex) {
		list = document.getElementById('hotel_ul');
		
		if (selIndex == 'n' || selIndex == 'p') {
			if (selIndex == 'n' && curIndex < list.childNodes.length - 1) {
				selIndex = curIndex + 1;
			} else if (selIndex == 'p' && curIndex > 0) {
				selIndex = curIndex - 1;
			}
		}
		if (!isNaN(selIndex)) {
			// Find current selected index, and unset that
			list.childNodes[selIndex].className = 'frm_suggest_list_hover';
			if (curIndex !== false) list.childNodes[curIndex].className = '';
		}
	}
}
function js_moveSelection(e) {
	if (!e) e = window.event;
	if (e.keyCode == 38) {
		// Move up
		js_highlightSelection('p');
	} else if (e.keyCode == 40) {
		// Move down
		js_highlightSelection('n');
	} else if (e.keyCode == 9 || e.keyCode == 13) {
		// Tab so deselect
		js_hideAndSelect();
	} else if ((e.keyCode == 8 || e.keyCode == 46) && document.getElementById('hotel_value').value != '') {
		// If something has been deleted unset airport code and all that jazz
		document.getElementById('hotel_value').value = '';
		while (document.getElementById('hotel_suggestions').firstChild) document.getElementById('hotel_suggestions').removeChild(document.getElementById('hotel_suggestions').firstChild);
	}
}

function js_updateSuggestionField(responseData) {
	// Need text field, div, and hidden
	var xml_data = responseData.responseXML;
	var searchid = xml_data.getElementsByTagName('r')[0].getAttribute('sid');
	var searchterm = $('hotel_name').value;
	// If this matches the current search id, continue
	if (searchid == currentSearch && searchterm.length >= minStringLen) {
		var obj_divElement = $('hotel_suggestions');
		var num_Elements = xml_data.getElementsByTagName('p').length;
		// Clear out the div
		while (obj_divElement.firstChild) obj_divElement.removeChild(obj_divElement.firstChild);
		// If there are any results then enter them,hiding stuff first
		obj_divElement.style.display = 'none';
		if (num_Elements > 0) {
			// Regexp string for the entered text
			rExp = new RegExp('('+searchterm.replace(/ /g,'|')+')','gi');
			
			// Now cycle through any results adding to the div
			newUL = document.createElement('ul');
			newUL.id = 'hotel_ul';
			for (var i = 0; i < num_Elements; i++) {
				hotelDEBUG = xml_data.getElementsByTagName('p')[i];
				hotelName = xml_data.getElementsByTagName('p')[i].firstChild.data;
				hotelID = xml_data.getElementsByTagName('p')[i].getAttribute('id');
				divText = hotelName.replace(rExp,'<span class="selHighlight">$1</span>');
				newUL.innerHTML += '<li onmouseover="js_highlightSelection(' + i + ')" onclick="js_hideAndSelect()"><input type="hidden" id="li_hotel_' + i + '_text" value="' + hotelName + '" /><input type="hidden" id="li_hotel_' + i + '_id" value="' + hotelID + '">' + divText + '</li>';
			}
			obj_divElement.appendChild(newUL);
			
			// And display, hiding selects for IE
			if (navigator.userAgent.match('MSIE 6')) {
				for (i=0; i<hideElements.length; i++) {
					if (document.getElementById(hideElements[i])) document.getElementById(hideElements[i]).style.visibility = 'hidden';	
				}
			}
			// Disable submit button until done to prevent submission on enter
			document.getElementById('submitButton').disabled=true;
			obj_divElement.style.display = 'block';
			// Highlight first choice
			js_highlightSelection(0);
		} else {
			// No results, say so
			obj_divElement.innerHTML += '<div class="noFFResults"><i>no results found</i></div>'
			obj_divElement.style.display = 'block';
		}
		if (document.getElementById("hideDiv")) 		document.getElementById("hideDiv").style.display = 'block';
	}
}

function js_hideAllPopups() {
//		document.getElementById("calanchor").style.display = 'none';
		document.getElementById('hotel_suggestions').style.display = 'none';
		if (document.getElementById("hideDiv")) document.getElementById("hideDiv").style.display = 'none';

		if (navigator.userAgent.match('MSIE 6')) {
			for (i=0; i<hideElements.length; i++) {
				if (document.getElementById(hideElements[i])) document.getElementById(hideElements[i]).style.visibility = 'visible';	
			}
		}
		document.getElementById('submitButton').disabled=false;
}

