function initFormQS() {
	parent.hasTabs('tabHome');
	if (isEmpty(gInitParms[3])) {
		setDate(gFromDate,"from");
		setDate(gToDate,"to");
	} else {
		setDate(gInitParms[3],"from");
		var toDate = addDays(getDate("from"),gInitParms[4]);
		setDate(toDate,"to");
		setSelectionValue(getCityField(),gInitParms[5]);
		initRooms(gInitParms[2],gInitParms[6]);
	}
	testRooms();
}

function showList(opt,val,text,list) {
	var str='';
	var noOfVal = val.split("|");
	var bldSelStr = buildSelection(opt,val,'',true);
	if (noOfVal.length > 2) {
		str+='<tr><td><table><tr><td class=introsm><B>'+text+'</B></td></tr><tr><td>';
		str+='<SELECT NAME="'+list+'" onChange="sbm();">'+bldSelStr+'</td></tr></table></td></tr>';
	}
	document.writeln(str);
}

function buildCityList(options,values) {
	var o=options.split("|");
	var city='';
	var str='<tr><td valign=top width="33%"><table><tr>';
	var	n=0;
	var v=values.split("|");
	for (var i=0; i<o.length && i<15; i++) {
		n++;
		var comma=o[i].indexOf(',');
		if (comma<0) {
			city=o[i].substring(0);
		} else {
			city=o[i].substring(0,comma);
		}
		var trimCity = trim(v[i]);
		if (city.length > 0)
			str+='<td class=smbold><input type=hidden name='+trimCity+' value=\"'+o[i]+'\"><input class=tableInput type=radio name=city value='+v[i]+'>'+city+'</td>';
		if (n > 4) {
			n=0;
			str+='</tr></table></td><td valign=top width="33%"><table><tr>';
		} else {
			str+='</tr><tr>';
		}
	}
	if (i>4 && i<15) {
		for (i; i<15; i++) {
			n++;
			str+='<td class=smbold>&nbsp;</td>';
			if (n>4 && i<15) {
				n=0;
				str+='</tr></table></td><td valign=top width="33%"><table><tr>';
			} else 
			if (i != 15) {
				str+='</tr><tr>';
			}
		}
	}
	str+='</tr></table></td>';
	document.writeln(str);
}

function onlyCityDesc(options) {
	var o=options.split("|");
	var cityDesc='';
	for (var i=0; i<o.length; i++) {
		var comma=o[i].split(",");
		cityDesc+=comma[0];
		if ((i+1)<o.length)
			cityDesc+="|";
	}
	return cityDesc;
}


// For date handling
function getDayField(type) {
	return eval(gNameRoot+type+"Day");
}

function getMonthYearField(type) {
	return eval(gNameRoot+type+"Date");
}

function getDate(type) {
	return getDspDate(getDayField(type),getMonthYearField(type));
}

function getCalDates() {
	var date=getDate(gDateObj);
	if (date==null)
		date=gFromDate;
	return new Array(date,gStartDate,gEndDate);
}

function setCalDate(date) {
	setDate(date,gDateObj);
	if (gDateObj=="from")
		changeToDate();
	return true;
}

function showCal(event,dateObj) {
	gDateObj=dateObj;
	displayCalendar(event);
}

function isValidDateVal(type) {
	return isValidDspDate(getDate(type),gStartDate,gEndDate);
}

function checkDates() {
	var field;
	if (!isValidDateVal("from")) {
		alert(gMsg4);
		field=getDayField("from")
		field.focus();
		return false;
	}
	if (!isValidDateVal("to")) {
		alert(gMsg4);
		field=getDayField("to")
		field.focus();
		return false;
	}
	if (getDate("from")>getDate("to")) {
		alert(gMsg5);
		field=getDayField("to")
		field.focus();
		return false;
	}
	if (getDate("from")==getDate("to")) {
		alert(gMsg17);
		field=getDayField("to")
		field.focus();
		return false;
	}
	if (dayDiff(getDate('to'),getDate('from'))>90) {
		alert(gMsg18);
		field=getDayField("to")
		field.focus();
		return false;
	}
	return true;
}

function setDate(date,type) {
	setDspDate(date,getDayField(type),getMonthYearField(type));
	return true;
}

function changeToDate() {
	if (isValidDateVal("from")) {
		var newToDate = addDays(getDate("from"),dayDiff(gToDate,gFromDate));
		setDate(newToDate,"to");
	}
	return true;
}



// Hotel room processing...
var gAdults,gChildren;

function getRoomTypeField(roomNumber) {
	return eval(gNameRoot+"Room"+roomNumber);
}

function getRoomCountField(roomNumber) {
	return eval(gNameRoot+"Room"+roomNumber+"Count");
}

function getRoomAgeField(roomNumber,ageNumber) {
	var field="Room"+roomNumber+"Ages"+ageNumber;
	return eval(gNameRoot+field);
}

function getRoomCotField(roomNumber) {
	return eval(gNameRoot+"Room"+roomNumber+"Cots");
}

function getNightsField() {
	return eval(gNameRoot+"Nts");
}

function getRoomLines() {
	return eval(gNameRoot+"roomLines").value;
}

function roomError(msg,number) {
	alert ('('+gRoomText+' '+(++number)+'):'+msg);
}

function initRooms(roomDesc,ages) {
	var max=roomDesc.length / 3;
	if (max==0) return;
	var roomLines=getRoomLines();
	if (max > roomLines) {
		roomLines=max;
	}
	var r=a=0;
	for (var i=0; i<roomLines; i++) {
		var p=i * 3;
		var type=roomDesc.charAt(p++);
		setSelectionValue(getRoomTypeField(r),type);
		var count=parseInt(roomDesc.charAt(p++),10);
		setSelectionValue(getRoomCountField(r),String(count));
		setSelectionValue(getRoomCotField(r),roomDesc.charAt(p++));
		if (isChildRoom(type)) {
			for (var j=0; j<count; j++) {
				var age=parseInt(ages.substr(a,2),10);
				setSelectionValue(getRoomAgeField(r,j),String(age));
				a+=2;
			}
			showAges(r,count);
		}
		r++;
	}
}

function checkRooms() {
	var type,count,cots;
	var roomLines=getRoomLines();
	gPax=gAdults=gChildren=0;
	for (var i=0; i<roomLines; i++) {
		type=getSelectionValue(getRoomTypeField(i));
		count=Number(getSelectionValue(getRoomCountField(i)));
		cots=Number(getSelectionValue(getRoomCotField(i)));
		if (type!=' ' || count!=0 || cots!=0) {
			if (type==' ') {
				roomError(gMsg8,i);
				getRoomTypeField(i).focus();
				return false;
			}
			if (count==0) {
				roomError(gMsg9,i);
				getRoomCountField(i).focus();
				return false;
			}
			// Cots aren't allowed for SBs (do we want this or not?)
			if (type=='4' && cots!=0) {
				roomError(gMsg12,i);
				getRoomCotField(i).focus();
				return false;
			}
			gAdults+= gAdultCounts[type] * count;
			gChildren+= gChildCounts[type] * count;
			var childCount=0;
			for (var j=0; j<3; j++) {
				var age=getSelectionValue(getRoomAgeField(i,j));
				if (age!=null && Number(age)!=0) {
					childCount++;
				}
			}
			if (childCount!=(gChildCounts[type] * count)) {
				// Max of 3 children allowed
				if (count<=3) {
					roomError(gMsg10,i);
					return false;
				}
			}	
		}
	}
	gPax=gAdults + gChildren;
	if (gPax > gMaxPax) {
		alert(gMsg6+(gMaxPax<9?gMsg6a:''));
		return false;
	}
	if (gPax==0) {
		alert(gMsg7);
		return false;
	}
	if (gChildren > gMaxChildren) {
		alert(gMsg14+gMaxChildren);
		return false;
	}
	return true;
}

function isChildRoom(type) {
	return (type=='1' || type=='3');
}

function showAges(number,count) {
	for (var i=0; i<3; i++) {
		var field=getRoomAgeField(number,i);
		if (i<count) {
			showField(field.name,true);
		} else {
			showField(field.name,false);
			field.selectedIndex= 0;
		}
	}
}

function testRooms() {
	var total=0;
	var roomLines=getRoomLines();
	for (var i=0; i<roomLines; i++) {
		var count=0;
		var type=getSelectionValue(getRoomTypeField(i));
		if (isChildRoom(type)) {
			count=Number(getSelectionValue(getRoomCountField(i)));
		}
		showAges(i,count);
		total+=count;
	}
	showField("DivChildTitle",(document.layers) || total > 0);
}

function packageRooms(number) {
	gRooms=gAges="";
	var value="";
	var obj,type,count;
	for (var i=0; i<number; i++) {
		type=getSelectionValue(getRoomTypeField(i));
		gRooms+=type;
		count=getSelectionValue(getRoomCountField(i));
		gRooms+=count;
		gRooms+=String(getSelectionValue(getRoomCotField(i)));
		if (isChildRoom(type)) {
			var nc=Number(count);
			for (var j=0; j<nc; j++) {
				value=getSelectionValue(getRoomAgeField(i,j));
				if (value==null) {
					value='00';
				} else {
					value=pad(value,"0",2);
				}
				gAges+=value;
			}
		}
	}
}

function chgRoomType(obj,number) {
	if (gMaxChildren==0 && isChildRoom(getSelectionValue(obj))) {
		alert(gMsg15);
		obj.selectedIndex=0;
		return;
	}
	var roomCountField=getRoomCountField(number);
	if (getSelectionValue(obj)!=' ') {
		if (getSelectionValue(roomCountField)=='0') {
			setSelectionValue(roomCountField,'1');
		}
	} else {
		setSelectionValue(roomCountField,'0');
	}
	testRooms();
}

function chgRoomCount(obj,number) {
	if (getSelectionValue(obj)=='0') {
		getRoomTypeField(number).selectedIndex=0;
		getRoomCotField(number).selectedIndex=0;
	}
	testRooms();
}
function chgRoomAge(obj,number) {
	if (Number(getSelectionValue(obj))>0) {
		if (!isChildRoom(getSelectionValue(getRoomTypeField(number)))) {
			alert(gMsg13);
			obj.selectedIndex=0;
		}
	}
}



// For special event handling...
function testDestinationSearch(url) {
	var value=getSelectionValue(getCityField());
        if (value == 'SOTHR') {
		displaySearchDest(url);
	}
}

function getCityField() {
	return eval(gNameRoot+"cityCode");
}

function setCity(city, cityName, countryName) {
	return setCommonCity(city,cityName,countryName);
}

function displaySpecialEvent(url,event) {
	gLocationName='';
	var dest=getRadioValue(eval(gNameRoot+"city"));
	if (isEmpty(dest)) {
		dest=getSelectionValue(getCityField());
		if (dest=='' || dest.substring(0,1)=='S') {
			alert(gMsg16);
			getCityField().focus();
			return false;
		}
		with (getCityField())
			gLocationName=options[selectedIndex].text;
	}
	var destType=dest.substr(0,1);
	var destCode=escape(trim(dest.substr(1,4)));
	var toDate=gEventEnd;
	var fromDate=getDate('from');
	if (fromDate) {
		toDate=addDays(fromDate,28);
	} else {
		fromDate=gEventStart;
	}
	if (isEmpty(gLocationName)) {
		gLocationName= getCntyDesc(dest).value;
	}
	var fullUrl=url+'?destType='+destType+'&destCode='+destCode+'&fromDate='+escape(fromDate)+'&toDate='+escape(toDate);
	return openPopUp(fullUrl,event,900,600);
}



// For hotel search handling...
function checkForm() {
	return checkDates() &&
		   checkRooms();
}

function checkDestination(dest, searchPage) {
	gDestCode=gDestDesc='';
	var destCode=dest;
	var destDesc='';
	if (isEmpty(destCode)) {
		destCode=getSelectionValue(getCityField());
		if (destCode=='' || destCode.substring(0,1)=='S') {
			if (searchPage) {
				return true;
			}
			alert(gMsg11);
			getCityField().focus();
			return false;
		}
		with (getCityField())
			destDesc=options[selectedIndex].text;
	}
	if (isEmpty(destDesc)) {
		destDesc = getCntyDesc(destCode).value;
	}
	if (destCode.length < 5) {
		destCode = destCode+" ";
	}
	gDestCode=destCode;
	gDestDesc=destDesc;
	return true;
}

function getCntyDesc(destination) {
	return eval(gNameRoot+destination);
}

function SubmitHHForm(submitter,receiver) {
	if (gLoaded && checkDestination(getRadioValue(submitter.city), false) && checkForm()) {
		with(receiver) {
			packageRooms(getRoomLines());
			destType.value=gDestCode.substr(0,1);
			destCode.value=gDestCode.substr(1,4);
			cityName.value=gDestDesc;
			arrival.value=getDate('from');
			duration.value=dayDiff(getDate('to'),getDate('from'));
			rooms.value=gRooms+' 00 00';
			ages.value=gAges;
			adults.value=gAdults;
			children.value=gChildren;
			parent.gCity=gDestCode;
			with (parent) {
				gRooms= rooms.value;
				gAges= ages.value;
				gAdults= adults.value;				
				gDuration= duration.value;
				gArrival= arrival.value;
				gCategory= "  ";
				gLoc= "  ";
				gBudget= "0";
				gHotelName= " ";
				gOrder= "";
				gStar= "0";
			}
		gLoaded=false;
		submit();
		}
	}
	return false;
}

function submitHHSearch(submitter,receiver) {
	if (gLoaded && checkDestination(getRadioValue(submitter.city), true)) {
		with(receiver) {
			duration.value=dayDiff(getDate('to'),getDate('from'));
			packageRooms(getRoomLines());
			rooms.value=gRooms+' 00 00';
			ages.value=gAges;
			with (parent) {
				gArrival= getDate('from');
				gDuration=duration.value;
				gRooms=rooms.value;
				gAges= ages.value;
				if (!isEmpty(gDestCode))
					gCity=gDestCode;
			}
		gLoaded=false;
		submit();
		}
	}
	return false;
}

// Return the difference, in days, between 2 ISO dates
// The timezone offset is included to ensure all calculations are consistent 
// with UTC (R1377)
function dayDiff(toDate,fromDate) {
	var endDay=cvtISOToDate(toDate);
	var endDayOffset=endDay.getTimezoneOffset()*60000;
	var startDay=cvtISOToDate(fromDate);
	var startDayOffset=startDay.getTimezoneOffset()*60000;
	var offset=endDayOffset-startDayOffset;
	return ((endDay-startDay-offset)/86400000);
}