/***
	STA Travel GETS
	JavaScript for booking modules

	$Revision: 1.2.2.52 $
	Check-In $Date: 2007/05/14 15:36:46 $
***/

/* ============= form switcher ============= */
var bookers = new Array("bookFlights", "bookSleeps", "bookBus", "bookTours",  "bookIns", "bookCards", "euroStar", "bookNoJS");
try{depDefault} catch(e){var depDefault = ''};
/* == prototype lib == */
function $() {
  var elements = new Array();
  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i];
    if (typeof element == 'string') element = document.getElementById(element);
    if (arguments.length == 1) return element;
    elements.push(element);
  }
  return elements;
}
// mark the radio button group
function markSelected(id) { // id = id of element that should be switched on
	var arrPos = null;
	for(var i=0; i<bookers.length; i++) {
		if(bookers[i]==id) arrPos = i;
	}
	for(var i=0; i < document.prodselector.prod.length; i++) {
		document.prodselector.prod[i].disabled = false;
		if (i==arrPos) {
			document.prodselector.prod[i].checked = true;
			addCSSClass(document.prodselector.prod[i].parentNode, "marked");
			if(document.prodselector.prod[0].type) { // assigne value to select/option-field and fire event (see ajaxcore.js)
				$("prodsel").getElementsByTagName("option")[0].value =
					document.prodselector.prod[i].value;
				if(document.prodselector.prod[i].value.lastIndexOf("fs_flights")==-1) {
					fireOnChange("prodsel"); // fire AJAX event
				}
			}
		} else {
			document.prodselector.prod[i].checked = false;
			removeClassName(document.prodselector.prod[i].parentNode, "marked");
		}
		if(document.prodselector.prod[i].value.lastIndexOf("fs_acc")!=-1) {
			resetHcty3(); // reset the list of cities to be consistant
		}
	}
	switchForm(id);
}
function markProd(pvalue){
	//alert('markprod called');
	$("prodsel").getElementsByTagName("option")[0].value = pvalue;
	fireOnChange("prodsel"); // fire AJAX event
}
// switch the traveldetails layer
function switchForm(id) {
	var arrPos = null;
	for(var i=0; i<bookers.length; i++) {
		if(bookers[i]==id) arrPos = i;
	}
	for(var j=0; j < bookers.length; j++) {
		addCSSClass($(bookers[j]), "invisible");
	}
	removeClassName($(id), "invisible");
	// footer fix
	var pageLoaded = $("end") ? 1 : 0; // all loaded?
	if(pageLoaded) {
		$("footer").style.bottom = "1px";
		setTimeout('$("footer").style.bottom = "0px"', 300);
	}
}

// set the active product after loading the modul
function setActProd(actP) {
	if(bookID>3 || bookID<1) return; // bookID does not exist
	else if(actP>5 || actP<0) switchForm(99); //no such product#
	else if(bookID==1 || bookID==2) {
		markSelected(bookers[actP]);
	} else if(bookID==3) {
		var formEl = $("prodsel");
		formEl.selectedIndex = actP;
		formEl.disabled = false;
		window.setTimeout("fireChange()", 1); // firefox fix
	}
	switchForm(bookers[actP]);
}
function fireChange() {fireOnChange("prodsel");}


function setAct() { // for us version
	addCSSClass($("bookNoJS"), "invisible");
	removeClassName($("bookFlights"), "invisible");
}
/* ============= great helpers ============= */
function removeClassName (elem, className) {

	if (elem) elem.className = elem.className.replace(className, "").trim();

}
function addCSSClass (elem, className) {
    if (elem) {
		removeClassName (elem, className);
		elem.className = (elem.className + " " + className).trim();
	}
}
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/,"");
}

/* ============= one way switcher =================== */
function switchOneWay(el,b) { // b is optional
	var num = (b!=null) ? b : "";
	var oneWayEl = $('frtn'+num)
	//FM - these no longer apply4 rebrand, new var fretdate
	//var fadtd_el = $('fadtd'+num);
	//var fadtm_el = $('fadtm'+num);
	var fretdate = $('uiTxtDate4');
	var fadtbtn_el = $('fadtbtn'+num);
	var fadep_el = $('fadepd'+num);
	var faarr_el = $('faarrd'+num);

	if(el.checked) {
		oneWayEl.value = "";
		//fadtd_el.disabled = true;
		//fadtm_el.disabled = true;
		fretdate.disabled = true;
		if(bookID==2) { // only book2 has jaw flights
			fadep_el.disabled = true;
			faarr_el.disabled = true;
		}
	} else {
		oneWayEl.value = "RTN";
		//fadtd_el.disabled = false;
		//fadtm_el.disabled = false;
		fretdate.disabled = false;
		if(bookID==2) { // only book2 has jaw flights
			fadep_el.disabled = false;
			faarr_el.disabled = false;
		}
	}
}

/* ============= set airport array and obj ============ */
var airARR = new Array(); // airport field array
function airOBJ(codeID,nameID,myNum,relNum) {
	this.codeID = codeID;
	this.nameID = nameID;
	this.myNum = myNum;
	this.relNum = relNum;
	airARR[myNum] = this; // fill the airport array
}
airOBJ.prototype = new Object();
airOBJ.prototype.fill = function(valName,valCode) {
	try {
		if (this.nameID == 'fddepd' && depDefault && depDefault != '' && $(this.nameID).value.trim() == '') { // prefill default of nothing entered
		//alert('this is val for depdef...');
			valName = depDefault;
			valCode = depDefaultIata;
		}
	} catch(e) {}
	if ($(this.nameID).type != "select-one") {
		$(this.nameID).value = valName;
	}
	if ($(this.codeID).type != "select-one") {
		// check if filled by autosuggest
		if (valCode != '' && valName.indexOf($(this.codeID).value) == -1) {
			$(this.codeID).value = valCode;
		}
	}
	if(this.relNum>=0 ) { // set the related values?
		var relNameID = $(airARR[this.relNum].nameID); // for book2 the inbound already filled?
		if(!relNameID.disabled) { // double open jaw
			if(bookID==1 || bookID==3 || ((bookID==2) && (relNameID.value=="" || (depDefault && relNameID.value== depDefault)))) {
				$(airARR[this.relNum].nameID).value = valName;
				$(airARR[this.relNum].codeID).value = valCode;
				//alert(valCode);
				//alert(valName);
			}
		} else { // single open jaw
			if(bookID==1 || bookID==3 || bookID==2) {
				$(airARR[this.relNum].nameID).value = valName;
				$(airARR[this.relNum].codeID).value = valCode;
				//alert('in here too..');
			}
		}
	}
}
function setAP(nID,valName,valCode) { // for double open jaw
	var thisNum = -1;
	if (nID && typeof nID == 'object' && nID.type == "select-one" && nID.options.length > 0) {
		valName = nID.options[nID.selectedIndex].text;
		valCode = nID.options[nID.selectedIndex].value;
		for(var i=0; i<airARR.length; i++) {
			if(airARR[i].codeID==nID.id) thisNum=i;
		}
	} else {
		for(var i=0; i<airARR.length; i++) {
			if(airARR[i].nameID==nID) thisNum=i;
		}
	}
	if(thisNum>=0) airARR[thisNum].fill(valName,valCode); // go!
}

// delete default value if user clicks into field
function unset(evt) {
	evt = (evt) ? evt : ((window.event) ? window.event : "");
	var elem = (evt.target) ? evt.target : evt.srcElement;
	if (elem) {
		if (elem.value == depDefault) {
			elem.value='';
			getDepD(elem).value == '';
		}
	}
	if(ie) {
		elem.onblur = function() {
			if (this.value=="") {
				this.value = depDefault;
				getDepD(this).value == depDefaultIata;
			}
		}
	}
}

function getDepD(elem) { // get iata code field
	var elemIdSplit = elem.id.split("_");
	if (elemIdSplit[0]) {
		return $(elemIdSplit[0]);
	}
}

function synchAP(params) {
	if (params) {
		for(var i=0; i<airARR.length; i++) {
			if(airARR[i].nameID==params.inpId) thisNum=i;
		}
		if(thisNum>=0) airARR[thisNum].fill(params.inpVal,params.tarVal);
	}
}

ListHelper = function() {};
ListHelper.createOpt = function(text, value) { // create an option element
	opt = document.createElement("option");
	opt.text =  text;
	opt.value = value;
	return opt;
}
ListHelper.addOpt = function(obj, text, value) { // add an optionlist
	opt = this.createOpt(text,value);
	if(saf) obj.appendChild(opt); // Safari does not understand "add"
	 else obj.options.add(opt);
}

/* ============= calendar functions 2 ================ */
var NOW = new Date(); // global right now date
NOW.setHours(0); NOW.setMinutes(0); NOW.setSeconds(0); NOW.setMilliseconds(0); // reset the values w/no importance

function leapYear(year) {
	if(year%4==0 && year%100!=0) return true;
	else if(year%400==0) return true;
	else return false;
}
function getDays(month,year) { // 0=jan, 1=feb...
	var ar = new Array(31, (leapYear(year))?29:28, 31,30,31,30,31,31,30,31,30,31);
	return ar[month];
}
var MONTHS = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
function getMonthName(month) { // get the month name to send as param
	return MONTHS[month];
}
function getMonthIndex(monName) {
	for(var i=0; i<MONTHS.length; i++) {
		if(monName == MONTHS[i]) return i;
	}
}
/* ============= Date Double DropDown Object ============= */

function calCheckOut(hdur, hidID) { // calc the check out date

	if($('uiTxtDate').value != 'DD-MMM-YYYY') {
		var sd = new Date();
		//alert($(hidID).value);
		sd.setTime( // date + days * secs/day

			transIntoDate($(hidID)).getTime()
			+ hdur
			* (1000 * 60 * 60 * 24));
		// change the display
		//alert(sd);
		$('hadt').firstChild.nodeValue = date2str(sd);
	}
}
// Constructor
function calOBJ(dayID,monID,hidID,hdurId,hadtId,addD,valD,nightsD,pDepDate) { // dayID, mon+year ID, hiddenField ID, duration ID, checkout ID, additional +days, validate +days, nights in hotel, dependant field for date precalc
	this.dayDD = $(dayID); // day DD
	this.monDD = $(monID); // month DD
	this.hidID = $(hidID);
	this.hId = hidID; // just the ID
	this.dayDD.parent = this;
	this.monDD.parent = this;
	this.maxMonths = 11;
	this.monARR = new Array(12);
	this.hdur = (hdurId!="") ? $(hdurId) : null ; // duration in days
	this.hadt = (hadtId!="") ? $(hadtId) : null ; // checkout date
	this.depDate = pDepDate ? pDepDate : null;
	if(this.hdur!=null) {
		this.hdur.parent = this;
		this.nightsD = nightsD; // default value for nights in hotel
		this.hdur.onchange = function() { this.parent.calcCO(); } // event handler
	}
	this.addD = addD; // how many days from today on should the DD be set, default view
	this.valD = (valD!=null) ? valD : 0; // how should the DD be validated? in days in future

	// set the nights for hotel
	if(this.hdur!=null) this.hdur.selectedIndex = this.nightsD - 1;

	this.setToday(this.monDD); // init the calendar on today, fill the dropdowns

	// put the DD on the future date
	if(this.addD != null) { // added day submitted?
		var FUTURE = new Date();
		FUTURE.setTime(NOW.getTime() + this.addD*(24*60*60*1000));
		this.setDDDate(date2str(FUTURE)); // set the additional days
	}

	// event handler:
	this.monDD.onchange = function() {
		this.parent.calcDays();
		this.parent.setHidden(); // is in calcDays()
		if (isUK && this.parent.hId.charAt(0) == 'f' && this.parent.hId.charAt(1) == 'd') { // patched for UK, update inbound
			var arrDate = new Date(transIntoDate(this.parent.hidID).getTime() + ((fadtDD.addD - this.parent.addD) * (24*60*60*1000)));
			if (this.parent.depDate) {
				this.parent.depDate.setDDDate(date2str(arrDate));
			}
		}
		if (this.parent.hdur!=null) this.parent.calcCO(); // calculate the checkout date if necessary
	}
	this.dayDD.onchange = function() {
		this.parent.setHidden();
		if (isUK && this.parent.hId.charAt(0) == 'f' && this.parent.hId.charAt(1) == 'd') {
			var arrDate = new Date(transIntoDate(this.parent.hidID).getTime() + ((fadtDD.addD - this.parent.addD)  * (24*60*60*1000)));
			if (this.parent.depDate) {
				this.parent.depDate.setDDDate(date2str(arrDate));
			}
		}
		if (this.parent.hdur!=null) this.parent.calcCO(); // calculate the checkout date if necessary
	}
}

calOBJ.prototype = new Object();

calOBJ.prototype.kill = function(elem) {
	var counter = elem.length;
	for(var i=0; i<counter; i++) {
		elem.remove(0);
	}
}

calOBJ.prototype.setToday = function(elem) { // sets the hidden field & fills the dropdowns
	this.hidID.value = date2str(NOW);
	var j = NOW.getMonth()-1;
	var y = NOW.getFullYear();
	this.kill(this.monDD);
	for(var i=0; i<=this.maxMonths; i++) {
		if(j<11) {j++;}
		else {j=0; y++;}
		var yy = String(y);
		ListHelper.addOpt(elem, getDisMonthName(j) + ' ' + yy.substring(2), getMonthName(j) + '-' + y);
		this.monARR[i] = j;
	}
	this.calcDays();
	this.dayDD.selectedIndex = NOW.getDate()-1;
	if (this.hdur!=null) this.calcCO(); // calculate the checkout date if necessary
}

calOBJ.prototype.calcDays = function() {
	var tmpSel = (this.dayDD.selectedIndex == -1) ? 0 : this.dayDD.selectedIndex;
	var mNum = getDays(this.monARR[this.monDD.selectedIndex],this.monDD.options[this.monDD.selectedIndex].value.substring(4));
	this.kill(this.dayDD);
	for(var i=1; i<=mNum; i++) {
		var dayNum = (i<10) ? ('0'+i) : i;
		ListHelper.addOpt(this.dayDD, dayNum, dayNum);
	}
	this.dayDD.selectedIndex = (tmpSel<mNum) ? tmpSel : 0;
}

calOBJ.prototype.setHidden = function() {
	this.hidID.value = this.dayDD.options[this.dayDD.selectedIndex].value + '-' + this.monDD.options[this.monDD.selectedIndex].value;
}

calOBJ.prototype.setDDDate = function(v) { // sets the hidden field & adjusts the dropdown
	if(isPast(v)) { // if selected date < NOW
		//this.setToday(this.monDD); // start over, reset the date to today's date
		alert( err_past );
	} else if(str2date(v)<this.getValDate()) {
		alert( err_vald + "" + this.valD + " days");
	} else if(isTooFarFuture(v)) {
		//this.setToday(this.monDD); // start over, reset the date to today's date
		alert( err_future );
	} else {
		this.hidID.value = v;
		var v2 = v.split(/\W+/)[1] + "-" + v.split(/\W+/)[2]; // e.g. Oct-2005
		var els = this.monDD.getElementsByTagName("option");
		for(var i = 0; i < els.length; i++) { // set the dropdown for months
			if(els[i].value == v2) this.monDD.selectedIndex = i;
		}
		this.calcDays(); // change the amount of days/month
		this.dayDD.selectedIndex = v.split(/\W+/)[0]-1; // index is zero-base, months are not
	}
	if (this.hdur!=null) this.calcCO(); // calculate the checkout date if necessary
}

calOBJ.prototype.calcCO = function() { // calc the check out date
	var sd = new Date();
	sd.setTime( // date + days * secs/day
		transIntoDate(this.hidID).getTime()
		+ this.hdur.value
		* (1000 * 60 * 60 * 24));
	// change the display
	this.hadt.firstChild.nodeValue = date2str(sd);
}

calOBJ.prototype.getValDate = function() { // calc the validation date
	var VALDATE = new Date();
	VALDATE.setTime(NOW.getTime() + this.valD*(24*60*60*1000));
	VALDATE.setHours(0); VALDATE.setMinutes(0); VALDATE.setSeconds(0); VALDATE.setMilliseconds(0); // reset the values w/no importance
	return VALDATE;
}

/* accessor methods */
calOBJ.prototype.getMonDD = function() { return this.monDD; }
calOBJ.prototype.getHidID = function() { return this.hId; }
calOBJ.prototype.getHidOBJ = function() { return this.hidID; }
calOBJ.prototype.getHidOBJVal = function() { return this.hidID.value; }
calOBJ.prototype.getValDays = function() { return this.valD; }


var isUk = false; // Global UK marker. set in DOB init
/* ============= Date of Birth Drop Down Object ============= */


/* ============= calendar & aps helpers for external calls from iframe ============= */
var idStorage = null; // APS: ID (String), CAL: ddObj (String)

function showCal(ddObj) {
	var f_Id, hiddenId;
	f_Id = eval(ddObj + ".getMonDD()"); // to calculate the position of the calendar frame
	addCSSClass($("apsFrame"), "invisible"); // make sure that the APS is invisible
	var calObj = $("calFrame");
	var offX = 0; var offY = 0;
	var refObj;
	function getBookDist(obj) {
		//alert('the obj is.. ' + obj.id);
		if(obj.offsetParent.id!="book") {
			offX += obj.offsetParent.offsetTop;
			offY += obj.offsetParent.offsetLeft;
			//alert('offset is.. ' + obj.offsetParent);
			getBookDist(obj.offsetParent);
		} else {refObj=obj; return true;}
	}
	getBookDist(f_Id);
	calObj.style.top = offX + "px";
	//calObj.style.top = 105 + "px";
	calObj.style.left = offY + "px";
	//calObj.style.left = 0 + "px";
	if(osx) calObj.style.width="19em"; // remember the big carbon scrollers
	removeClassName(calObj, "invisible");
	var frameWin = calObj.contentWindow;
	if (frameWin && !saf) frameWin.location.replace(book_cal);
	else calObj.src = book_cal;
	if(ie) calObj.onblur = hideCurFrame;
	idStorage = ddObj;
}
function setDateAndHideCal(date) {
    var calObj = eval(idStorage);
    calObj.setDDDate(calDate2str(date)); // set the hidden field, change the drop down values
	addCSSClass($("calFrame"), "invisible");
	if (isUK && calObj.hId.charAt(0) == 'f' && calObj.hId.charAt(1) == 'd') { // patched for UK, update inbound
		var arrDate = new Date(transIntoDate(calObj.hidID).getTime() + ((fadtDD.addD - calObj.addD)  * (24*60*60*1000)));
		if (calObj.depDate) {
			calObj.depDate.setDDDate(date2str(arrDate));
		}
	}
	idStorage = null;
}
function getTmpDate(){
	if(idStorage!=null) { return eval( idStorage + ".getHidOBJVal();" ); }
	else {
		var dayNum = (NOW.getDate()<10) ? ('0'+NOW.getDate()) : NOW.getDate();
		return dayNum +'-'+ getMonthName(NOW.getMonth()) +'-'+ NOW.getFullYear();
	}
}
function showAps(fieldId, dir) {
	addCSSClass($("calFrame"), "invisible"); // make sure that the calendar is invisible
	var apsObj;
	if(dir==1 || dir==3) {
		addCSSClass($("apsFrame2"), "invisible");
		apsObj = $("apsFrame");
	} else {
		addCSSClass($("apsFrame"), "invisible");
		apsObj = $("apsFrame2");
	}
	var offX = 0; var offY = 0;
	var refObj;
	function getBookDist(obj) {
		if(obj.offsetParent.id!="book") {
			offY += obj.offsetParent.offsetTop;
			offX += obj.offsetParent.offsetLeft;
			getBookDist(obj.offsetParent);
		} else {refObj=obj; return true;}
	}
	getBookDist($(fieldId));
	apsObj.style.top = offY + "px";
	apsObj.style.left = offX + "px";
	if(osx) { apsObj.style.width="21em"; apsObj.style.height="26.5em"; } // remember the big carbon scrollers
	removeClassName(apsObj, "invisible");
	var frameWin = apsObj.contentWindow;
	var apsPage=2; // default
	// dir can be 1 (inbound), 2 (outbound), or 3 (inbound intern.) and 4 (outbound intern.)
	if(dir==1) apsPage = book_aps1;
	else if(dir==2) apsPage = book_aps2;
	else if(dir==3) apsPage = book_aps3;
	else if(dir==4) apsPage = book_aps4;
	if (frameWin && !saf) frameWin.location.replace(apsPage);
	else apsObj.src = apsPage;
	if(ie) apsObj.onblur = hideCurFrame;
	idStorage = fieldId; // remember this!
}
function setApAndHideAps(ap,cv) {
	setAP(idStorage,ap,cv);
	addCSSClass($("apsFrame"), "invisible");
	addCSSClass($("apsFrame2"), "invisible");
	idStorage = null;
}
function hideCurFrame(hey) { // is called from doc within the iframe, onblur
	if(hey=="cal") addCSSClass($("calFrame"), "invisible");
	else if(hey=="aps") {
		addCSSClass($("apsFrame"), "invisible");
		addCSSClass($("apsFrame2"), "invisible");
	} else { // when called by hideFrame.html
		addCSSClass($("calFrame"), "invisible");
		addCSSClass($("apsFrame"), "invisible");
		addCSSClass($("apsFrame2"), "invisible");
	}
}

// helper functions to transform date =================
function calDate2str(d) { // 8/31/2005 > 31-Aug-2005
	var sd =
		d.split("/")[1]  // day
		+ "-" + (getMonthName((d.split("/")[0])-1)) // zero based >> -1
		+ "-" + d.split("/")[2]; // year
	return sd;
}
function str2date(st) { // e.g. st = "11-Oct-2005" transformed into Date-OBJ
	var tARR = st.split("-");
	var tDD = (tARR[0].substr(0,1)!=0) ? tARR[0] : tARR[0].substr(1,1);
	var tMMM = getMonthIndex(tARR[1]);
	var tYYYY = tARR[2];
	var tDate = new Date(tYYYY,tMMM,tDD,0,0,0);
	return tDate;
}
// transform a hidden field into a date object (wrapper for str2date());
function transIntoDate(el) { return str2date(el.value); }

function date2str(D) { // d is a Date object, e.g. NOW > 06-Jan-2006
	var dayNum = (D.getDate()<10) ? ('0'+D.getDate()) : D.getDate();
	str = dayNum +'-'+ getMonthName(D.getMonth()) +'-'+ D.getFullYear();
	return str;
}

/* ============= error check on submit ============= */
function isPast(d1) { // d1 could be 11-Oct-2005
	var d2 = str2date(d1);
	if(d2.getTime() >= NOW.getTime()) return false;
	else return true;
}
function isTooFarFuture(d1) { // if d1 is more than 330 days ahead
	var d2 = str2date(d1);
	var d3 = NOW.getTime() + (1000*60*60*24)*330; // 330 days
	if(d2.getTime() > d3) return true;
	else return false;
}

function valiSubmFlight(el,b) { // flights, b is optional
	//alert('validating...');
	var num = (b!=null) ? b : "";
	var err_txt = "";
	var err_num = 0;
	var fddep_el = $('fddepd'+num); // outb from AP

	var fdarr_el = $('fdarrd'+num); // outb to AP
	var fadep_el = $('fadepd'+num); // inb from AP
	var faarr_el = $('faarrd'+num); // inb to AP
	//var changes here fddt = uiTxtDate2
	var fddt_el = $('uiTxtDate2'+num); // dep date
	var fadt_el = $('uiTxtDate4'+num); // ret date
	var frtn1_ok = $('frtn1'+num).checked; // oneway checked?
	var pxnum = $('fpxnum').value;
	//alert(pxnum);
	for(var p=1; p <= pxnum; p++){
		//var px = "px"+p+"tp_type";
		window['px'+p+'tp_type'] = $('fpx'+p+'tp_type').checked;
		window['px'+p+'tp_age'] = $('fpx'+p+'tp_age').checked;

	}

	// dates
	var fddtDate = transIntoDate(fddt_el);
	var fadtDate = transIntoDate(fadt_el);
	//fm: 16/02/09 commented out as not valid func for new jscript dates
	// validation dates departure
	//var fddtDD_obj = eval("fddtDD"+num);
	//var fddtValDate = fddtDD_obj.getValDate();
	//var fddtValDays = fddtDD_obj.getValDays();
	// validation dates return
	//var fadtDD_obj = eval("fadtDD"+num);
	//var fadtValDate = fadtDD_obj.getValDate();
	//var fadtValDays = fadtDD_obj.getValDays();

	for(var p=1; p <= pxnum; p++) {
		if(!(window['px'+p+'tp_type']) && !(window['px'+p+'tp_age'])){
			$('px'+p+'tp_al').value = 'AL';
			$('px'+p+'tp_al').checked = true;
		}

	}

	for(var p=1; p <= pxnum; p++){
		if(window['px'+p+'tp_type'] && window['px'+p+'tp_age']){
			$('fpx'+p+'tp_age').checked = false;
		}
	}

	// error text
	if(fddep_el.value=="" || fddep_el.value.indexOf("------") > -1 || fdarr_el.value=="" || fadep_el=="" || faarr_el=="") { err_txt += "\n" + err_airport; err_num++; }
	//if(fddtDate<NOW || (fadtDate<NOW && !frtn1_ok)) { err_txt += "\n" + err_past; err_num++; }
	if(isTooFarFuture(date2str(fddtDate)) || (isTooFarFuture(date2str(fadtDate)) && !frtn1_ok)) { err_txt += "\n" + err_future; err_num++; }
	//if(fddtDate < fddtValDate) { err_txt += "\n" + "Departure Date: " + err_vald + fddtValDays + " days"; err_num++; }
	//if(fadtDate < fadtValDate && !frtn1_ok) { err_txt += "\n" + "Return Date: " + err_vald + fadtValDays + " days"; err_num++; }

	if(fddtDate > fadtDate && !frtn1_ok) { err_txt += "\n" + err_return; err_num++; }
	/*if(!isUK && dobVali!="") {
		if(dobVali.lastIndexOf("false")>-1) { err_txt += "\n" + err_general; err_num++; }
		else if (!isPast(dobVali)) { err_txt += "\n" + err_dob; err_num++; }
	} */

	// ## bugfix IE + book1 ##
	// sIFR is taking the focus off the <input>s, so sync the handwritten values onSubmit
	if(ie && bookID==1) {
		if(fddep_el.value != faarr_el.value) faarr_el.value = fddep_el.value;
		if(fdarr_el.value != fadep_el.value) fadep_el.value = fdarr_el.value;
	}

	// any errors? else submit
	if(err_num>0) {
		alert(err_txt);
		return;
	} else if (isUK && paxWidget) {
		try { //patch for UK
		  	//var dobDD = eval("fdobDD" + 2);
		  	var eligElem = $("feligdd" + 2);
		  	var fpxtpField = $("fpxtp" + 2);
		} catch(e) {}
		//removed dobDD from constr
		if (eligElem && fpxtpField) {
			if (paxWidget.pxnumDD.selectedIndex + 1 != 2) {
				//dobDD.resetHidden();
		  	  	fpxtpField.value = '';
			} else {
				//dobDD.setHidden();
		  	  	fpxtpField.value = eligElem.options[eligElem.selectedIndex].value;
			}
		}
	}
	if (isUK) {
		el.innerHTML = "Searching...";
	}

	//fddep

    if($('frtn1').checked == false && ($('fadep').value == "" || $('faarr').value == "")) {
     	$('fadep').value = $('fdarr').value;
		$('faarr').value = $('fddep').value;
	}


	submitForm(el);
	return false;
}

function valiSubmForm(el,type) { // all other || type: h=hotels, t=tours, b=bus&rail
	var err_txt = "";
	var err_num = 0;
	var ddt_el = $('uiTxtDate');
	//var ddt_el = $(type+'ddt'); // dep date hidden field
	var acc_el = $('axch_fs_acc');
	var hcty3_el = $('hcty3');
	var tours_el = $('axch_fs_tours');
	var bus_el = $('axch_fs_busrail');

	// dates
	var ddtDate = transIntoDate(ddt_el);
	// validation dates departure
	//if(type=="h") ddtDD_obj = hddtDD;
	//else if(type=="b") ddtDD_obj = bddtDD;
	//else if(type=="t") ddtDD_obj = tddtDD;
	//var ddtValDate = ddtDD_obj.getValDate();
	//var ddtValDays = ddtDD_obj.getValDays();


	// error text
	if(ddtDate<NOW) { err_txt += "\n" + err_past; err_num++; }
	if(isTooFarFuture(date2str(ddtDate))) { err_txt += "\n" + err_future; err_num++; }
	//if(ddtDate<ddtValDate) { err_txt += "\n" + err_vald + "" + ddtValDays + " days"; err_num++; }

	if(type=="h") { // validation for hotels & hostels
	//validate-com pax numbers here
	var px = $('fnumrooms').value;
	//alert(px);
	var totalpx = 0;

	for(var p=1; p <= px; p++){
		var currno = $('OCC'+p).value;
		totalpx = totalpx + parseInt(currno);
	}

	//write val back to pax var
	$('paxno').value = totalpx;

	for(var rt=1; rt <= px; rt++){
		rmoc = $('OCC'+rt).value;
		if(rmoc==0){ err_txt += "\n" + "Please specify occupants for rooms selected"; err_num++;}

	}

	if(acc_el.value==0) { err_txt += "\n" + err_general; err_num++;}
		else if(hcty3_el.value==0) { err_txt += "\n" + err_general; err_num++;}
	} else if(type=="t") { // validation for tours
		if(tours_el.value==0) { err_txt += "\n" + err_general; err_num++;}
	} else if (type=="b") { // validation for bus & rail
		if(bus_el.value==0) { err_txt += "\n" + err_general; err_num++;};
	}

	// any errors? else submit
	if(err_num>0) alert(err_txt);
	else submitForm(el);
}
getOpt2 = function(text, value, sel) { // create an optionlist
	opt = document.createElement("option");
	opt.text =  text;
	opt.value = value;
	opt.selected = sel;
	return opt;
}


addOpt2 = function(obj, text, value, sel) { // add an optionlist
	opt = this.getOpt2(text,value, sel);
	if(saf) obj.appendChild(opt); // Safari does not understand "add"
	 else obj.options.add(opt);
}

function showAddrooms(n){
	var addrm2 = $("additionalrms2");
	//if(addrm2){ alert('add2 is read');}
	var addrm3 = $("additionalrms3");
	var addrm4 = $("additionalrms4");
	//alert(n);
	if(n==1){

		addCSSClass(addrm2, "invisible");
		addCSSClass(addrm3, "invisible");
		addCSSClass(addrm4, "invisible");
	}
	if(n==2){
		//alert('n was 2');
		removeClassName(addrm2, "invisible");
		//addCSSClass(addrm3, "invisible");
		//addCSSClass(addrm4, "invisible");
	}
	if(n==3){
		removeClassName(addrm3, "invisible");
		addCSSClass(addrm2, "invisible");
		addCSSClass(addrm4, "invisible");
	}
	else {
		removeClassName(addrm4, "invisble");
		addCSSClass(addrm2, "invisible");
		addCSSClass(addrm3, "invisible");

	}
}

/*
function setOptions(o, sn)
    { alert('setops called');
     var rmtp = "RMTP"+sn;

     //OSOUTHGATE | START
     var select2 = returnObjById(rmtp);
     //var select2 = document.bookSleeps.eval(rmtp);
     if (select2 == null) {var select2 = document.bookSleeps.eval(rmtp);}
     //OSOUTHGATE | END

     select2.options.length = 0;
    if (o == "1")
    {  alert(o);
     select2.options[select2.options.length] = new Option('Any','a', 'true');
     select2.options[select2.options.length ] = new Option('Dorm','m');
     select2.options[select2.options.length] = new Option('Single','s');
    }
    if (o == "2")
    { //alert(o);
     selvals = select2.options [select2.options.length];
     alert(selvals);
     select2.options[select2.options.length] = new Option('Any','a');
     select2.options[select2.options.length] = new Option('Dorm','m');
     select2.options[select2.options.length] = new Option('Double','d', 'true');
     select2.options[select2.options.length] = new Option('Twin','t');
    }
    if (o == "3")
    {  alert(o);
     select2.options[select2.options.length] = new Option('Any','a');
     select2.options[select2.options.length] = new Option('Dorm','m');
     select2.options [select2.options.length] = new Option('Triple','r');
    }
    if (o == "4")
    {  alert(o);
     select2.options[select2.options.length] = new Option('Any','a');
     select2.options[select2.options.length] = new Option('Dorm','m');
     select2.options[select2.options.length] = new Option('Quad','q');
    }
    if (o >= "5")
    {
     select2.options[select2.options.length] = new Option('Dorm','m');
    }
    }

     //OSOUTHGATE | START
       function returnObjById( id )
        {
            if (document.getElementById)
                var returnVar = document.getElementById(id);
            else if (document.all)
                var returnVar = document.all[id];
            else if (document.layers)
                var returnVar = document.layers[id];
            return returnVar;
        }

*/

function updateRooms(n){
	//alert(n);
	if(n >= 1){
		var row;
		var roomnumber;
		var occupants;
		var rtypes;

		var rmBox = $("additionalrms");
		if (rmBox) {

				while (rmBox.firstChild)
				{
					rmBox.removeChild(rmBox.firstChild);
				}
				//for to create required params
				for(var x=2; x<=n; x++){

					//var traveller = 'Traveller&nbsp;' + x;
					row = document.createElement('tr');

					roomnumber = document.createElement('td');
					//roomnumber.setAttribute("width","13.5");
					roomnumber.width = "13.5";
					roomnumber.innerHTML = x;
					row.appendChild(roomnumber);

					trow2 = document.createElement('td');
					//trow2.setAttribute("width","101");
					trow2.width = "101";

					occs = 'OCC'+x;
					occupants = document.createElement('select');
					//occupants.setAttribute("id", "OCC"+x);
					occupants.id = "OCC"+x;
					//occupants.setAttribute("name", "OCC"+x);
					occupants.name = "OCC"+x;
					//occupants.setAttribute("onchange", '"setOptions(document.bookSleeps."+occs+".options[document.bookSleeps."+occs+".selectedIndex].value," +x+")"');
					occupants.onchange = function(){
						setOptions(document.bookSleeps.occs.options[document.bookSleeps.occs.selectedIndex].value, x);
					}

					for(var i =1; i <=9; i++){
						if(i==2){
						this.addOpt2(occupants, i, i, 'selected="selected"');
						}
						else {
						this.addOpt2(occupants, i, i);
						}
					}
					trow2.appendChild(occupants);
					//trow2.innerHTML = occupants;
					//row.appendChild(occupants);
					row.appendChild(trow2);

					trow3 = document.createElement('td');

					rtypes = document.createElement('select');
					//rtypes.setAttribute("id", "RMTP"+x);
					rtypes.id = "RMTP"+x;
					//rtypes.setAttribute("name", "RMTP"+x);
					rtypes.name = "RMTP"+x;

					this.addOpt2(rtypes, 'Single','s');
					this.addOpt2(rtypes, 'Double','d');
					this.addOpt2(rtypes, 'Twin','t');
					this.addOpt2(rtypes, 'Triple','q');
					this.addOpt2(rtypes, 'Dorm','m');
				    this.addOpt2(rtypes, 'Any','a','selected="selected"');

					trow3.appendChild(rtypes);
					//trow3.innerHTML = rtypes;
					//row.appendChild(rtypes);
					row.appendChild(trow3)

					rmBox.appendChild(row);

				}

			  removeClassName(rmBox, "invisible");
			} else {
			  addCSSClass(rmBox, "invisible");
			}
	}

}
roomWidget = function(params) { // Constructor Number of Travellers list
	this.params = params;
	this.rmnumDD = $(params.rmnumID); // day DropDown
	this.maxRoom = $(params.maxRoom);
	this.rmnumDD.parent = this;
	this.init(); // init the dropdown, optional. may be done from Tarif widget
}

roomWidget.prototype.kill = function(elem) { // clear child nodes
	var counter = elem.length;
	for(var i=0; i<counter; i++) {
		elem.remove(0);
	}
}
roomWidget.prototype.getOpt2 = function(text, value, sel) { // create an optionlist
	opt = document.createElement("option");
	opt.text =  text;
	opt.value = value;
	opt.selected = sel;
	return opt;
}

roomWidget.prototype.addOpt2 = function(obj, text, value, sel) { // add an optionlist
	opt = this.getOpt2(text,value, sel);
	if(saf) obj.appendChild(opt); // Safari does not understand "add"
	 else obj.options.add(opt);
}

roomWidget.prototype.init = function () { // initializer
	this.kill(this.rmnumDD);
	for(var i=1; i<=this.maxRoom; i++) {
		this.addOpt2(this.rmnumDD, i, i);
	}
	this.rmnumDD.onchange = function() {
			var addrm2 = $("additionalrms2");
			var addrm3 = $("additionalrms3");
			var addrm4 = $("additionalrms4");
		if (addrm2) {
			if (this.selectedIndex + 1 == 2) { //
			  removeClassName(addrm2, "invisible");
			  addCSSClass(addrm3, "invisible");
			  addCSSClass(addrm4, "invisible");
			} else {
			  addCSSClass(addrm2, "invisible");
			}
			if (ie) {
				var pageLoaded = $("end") ? 1 : 0; // all loaded?
				if(pageLoaded) {
					$("footer").style.bottom = "1px";
				  setTimeout('$("footer").style.bottom = "0px"', 300);
				}
			}
	  	}
		if (addrm3) {
			if (this.selectedIndex + 1 == 3) { //

			  removeClassName(addrm2, "invisible");
			  removeClassName(addrm3, "invisible");
			  addCSSClass(addrm4, "invisible");
			} else {
			  addCSSClass(addrm3, "invisible");
			}
			if (ie) {
				var pageLoaded = $("end") ? 1 : 0; // all loaded?
				if(pageLoaded) {
					$("footer").style.bottom = "1px";
				  setTimeout('$("footer").style.bottom = "0px"', 300);
				}
			}
	  	}
		if (addrm4) {
			if (this.selectedIndex + 1 == 4) { //

			  removeClassName(addrm2, "invisible");
			  removeClassName(addrm3, "invisible");
			  removeClassName(addrm4, "invisible");
			} else {
			  addCSSClass(addrm4, "invisible");
			}
			if (ie) {
				var pageLoaded = $("end") ? 1 : 0; // all loaded?
				if(pageLoaded) {
					$("footer").style.bottom = "1px";
				  setTimeout('$("footer").style.bottom = "0px"', 300);
				}
			}
	  	}
	}
}

function returnObjById( id )
        {
            if (document.getElementById)
                var returnVar = document.getElementById(id);
            else if (document.all)
                var returnVar = document.all[id];
            else if (document.layers)
                var returnVar = document.layers[id];
            return returnVar;
        }
/*
roomWidget.prototype.init = function () { // initializer
	this.kill(this.rmnumDD);
	for(var i=1; i<=this.maxRoom; i++) {
		this.addOpt2(this.rmnumDD, i, i);
	}
	this.rmnumDD.onchange = function() {

		var row;
		var roomnumber;
		var occupants;
		var rtypes;

		var rmBox = $("additionalrms");
		if (rmBox) {
			if(this.selectedIndex +1 >= 2){

				while (rmBox.firstChild)
				{
					rmBox.removeChild(rmBox.firstChild);
				}
				//for to create required params: wont work manually as x has to be consequtive
				for(var x=2; x<=this.selectedIndex+1; x++){

					//var traveller = 'Traveller&nbsp;' + x;
					row = document.createElement('div');

					roomnumber = document.createElement('label');
					roomnumber.setAttribute("width","13.5");
					//roomnumber.width = '13.5';
					roomnumber.innerHTML = x+ "&nbsp;&nbsp;";
					row.appendChild(roomnumber);

					//trow2 = document.createElement('');
					//trow2.setAttribute("width","101");
					//trow2.width = '101';

					occs = 'OCC'+x;
					//var selt = returnObjById(occs);
					//alert(selt);
					occupants = document.createElement('select');
					occupants.setAttribute("id", "OCC"+x);
					//occupants.id = 'OCC'+x;
					occupants.setAttribute("name", "OCC"+x);
					//occupants.name = 'OCC'+x;
					//occupants.setAttribute("onchange", "setOptions(document.bookSleeps."+occs+".options[document.bookSleeps."+occs+".selectedIndex].value," +x+");");
					occupants.setAttribute("onchange", "setOptions(document.getElementsById("+occs+").options[document.getElementById("+occs+").selectedIndex].value," +x+");");
					//occupants.setAttribute("onchange", "setOptions(returnObjById("+occs+")," +x+")");
					//occupants.setAttribute("onchange", "alert(this.value)");
					//occupants.onchange = function(occs, x){
						//setOptions(document.bookSleeps.occs.options[document.bookSleeps.occs.selectedIndex].value, x);
					//}
					//occupants.onchange = function(){
						//setOptions(document.bookSleeps.occs.options[document.bookSleeps.occs.selectedIndex].value, x);
					//}

					for(var i =1; i <=9; i++){
						if(i==1){
						addOpt2(occupants, i, i,'true');
						}
						else {
						addOpt2(occupants, i, i);
						}
					}
					//document.getElementById('OCC2').onchange();

					//occupants = occupants + "&nbsp;&nbsp;&nbsp;&nbsp;";
					//trow2.appendChild(occupants);
					//trow2.innerHTML = occupants;
					//row.appendChild(occupants);
					row.appendChild(occupants);

					//trow3 = document.createElement('div');
					space = document.createElement('label');
				    space.innerHTML = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
					row.appendChild(space);

					rtypes = document.createElement('select');
					rtypes.setAttribute("id", "RMTP"+x);
					//rtypes.id = "RMTP"+x;
					rtypes.setAttribute("name", "RMTP"+x);
					//rtypes.name = "RMTP"+x;

					addOpt2(rtypes, 'Single','s','selected="selected"');
					//addOpt2(rtypes, 'Double','d');
					//addOpt2(rtypes, 'Twin','t');
					//addOpt2(rtypes, 'Triple','q');
					addOpt2(rtypes, 'Dorm','m');
				    addOpt2(rtypes, 'Any','a');

					//trow3.appendChild(rtypes);
					//trow3.innerHTML = rtypes;
					//row.appendChild(rtypes);
					row.appendChild(rtypes);

					rmBox.appendChild(row);

				}

			  removeClassName(rmBox, "invisible");
			} else {
			  addCSSClass(rmBox, "invisible");
			}
	}
	}
}

*/

PXUKWidget = function(params) { // Constructor Number of Travellers list
	this.params = params;
	this.pxnumDD = $(params.pxnumID); // day DropDown
	this.maxNum = $(params.maxNum);
	this.pxnumDD.parent = this;
	this.init(); // init the dropdown, optional. may be done from Tarif widget
}

PXUKWidget.prototype.kill = function(elem) { // clear child nodes
	var counter = elem.length;
	for(var i=0; i<counter; i++) {
		elem.remove(0);
	}
}

PXUKWidget.prototype.getOpt = function(text, value) { // create an optionlist
	opt = document.createElement("option");
	opt.text =  text;
	opt.value = value;
	return opt;
}

PXUKWidget.prototype.getInput = function(btype, bname, bid, bvalue) { // create an inputelem
	inpt = document.createElement("input");
	inpt.setAttribute("type", btype);
	//inpt.type =  type;
	inpt.setAttribute("name", bname);
	//inpt.name = name;
	inpt.setAttribute("id", bid);
	//inpt.id = id;
	inpt.setAttribute("value", bvalue);
	//inpt.value = value;
	return inpt;
}
PXUKWidget.prototype.addOpt = function(obj, text, value) { // add an optionlist
	opt = this.getOpt(text,value);
	if(saf) obj.appendChild(opt); // Safari does not understand "add"
	 else obj.options.add(opt);
}
PXUKWidget.prototype.addIn = function(obj, type, name, id, value) { // add inplist
	inpt = this.getInput(btype,bname,bid,bvalue);
	if(saf) obj.appendChild(inpt); // Safari does not understand "add"
}

PXUKWidget.prototype.init = function () { // initializer
	this.kill(this.pxnumDD);
	for(var i=1; i<=this.maxNum; i++) {
		this.addOpt(this.pxnumDD, i, i);
	}
	this.pxnumDD.onchange = function() {
			var addpax2 = $("additionalpax2");
			var addpax3 = $("additionalpax3");
			var addpax4 = $("additionalpax4");
		if (addpax2) {
			if (this.selectedIndex + 1 == 2) { //
			  removeClassName(addpax2, "invisible");
			  addCSSClass(addpax3, "invisible");
			  addCSSClass(addpax4, "invisible");
			} else {
			  addCSSClass(addpax2, "invisible");
			}
			if (ie) {
				var pageLoaded = $("end") ? 1 : 0; // all loaded?
				if(pageLoaded) {
					$("footer").style.bottom = "1px";
				  setTimeout('$("footer").style.bottom = "0px"', 300);
				}
			}
	  	}
		if (addpax3) {
			if (this.selectedIndex + 1 == 3) { //

			  removeClassName(addpax2, "invisible");
			  removeClassName(addpax3, "invisible");
			  addCSSClass(addpax4, "invisible");
			} else {
			  addCSSClass(addpax3, "invisible");
			}
			if (ie) {
				var pageLoaded = $("end") ? 1 : 0; // all loaded?
				if(pageLoaded) {
					$("footer").style.bottom = "1px";
				  setTimeout('$("footer").style.bottom = "0px"', 300);
				}
			}
	  	}
		if (addpax4) {
			if (this.selectedIndex + 1 == 4) { //

			  removeClassName(addpax2, "invisible");
			  removeClassName(addpax3, "invisible");
			  removeClassName(addpax4, "invisible");
			} else {
			  addCSSClass(addpax4, "invisible");
			}
			if (ie) {
				var pageLoaded = $("end") ? 1 : 0; // all loaded?
				if(pageLoaded) {
					$("footer").style.bottom = "1px";
				  setTimeout('$("footer").style.bottom = "0px"', 300);
				}
			}
	  	}

/*		var newCheck;
		var stattype;
		var pxBox = $("pxbox_2");
		if (pxBox) {
			if (this.selectedIndex + 1 >= 2) { // UK: display dob2 only for 2 pax
				while (pxBox.firstChild)
				{
					pxBox.removeChild(pxBox.firstChild);
				}
				//for to create required params
				for(var x=2; x<=this.selectedIndex +1; x++){
					//this.addIn(pxBox, 'checkbox','PXxTP','PXxTP_type', 'SD');
					//this.addIn(pxBox, 'checkbox','PXxTP','PXxTP_age','ZZ');
					var traveller = 'Traveller&nbsp;' + x;
					paxlabel = document.createElement('label');
					if(bookID==2){
						paxlabel.innerHTML = traveller + "&nbsp;";
					} else {
						paxlabel.innerHTML = traveller + "&nbsp;<br>";
					}
					//pxBox.appendChild(paxlabel);
					pxBox.appendChild(paxlabel);

					checkbox = document.createElement('div');
					checkbox.setAttribute("class", "checkbox");
					//checkbox.setAttribute("id", "checkmore");

					newCheck = document.createElement('input');
					newCheck.setAttribute("type", "checkbox");
					newCheck.setAttribute("name", "PX"+x+"TP");
					newCheck.setAttribute("id", "fpx"+x+"tp_type");
					newCheck.setAttribute("value", "SD");
					//changedfrom pxBox to checkbox
					checkbox.appendChild(newCheck);

					stattype = document.createElement('label');
					stattype.setAttribute("class", "longf");
					stattype.setAttribute("style", "width:auto;");
					//stattype.id = "paxt";
					if(bookID==3){
						stattype.innerHTML = " I am a student<br>";
					} else {
						stattype.innerHTML = " I am a student ";
					}
					checkbox.appendChild(stattype);

					newCheck2 = document.createElement('input');
					newCheck2.setAttribute("type", "checkbox");
					newCheck2.setAttribute("name", "PX"+x+"TP");
					newCheck2.setAttribute("id", "fpx"+x+"tp_age");
					newCheck2.setAttribute("value", "ZZ");
					checkbox.appendChild(newCheck2);

					stattype2 = document.createElement('label');
					stattype2.setAttribute("class", "longf");
					stattype2.setAttribute("style", "width:auto;");
					//stattype.id = "paxt";
					stattype2.innerHTML = " I am under 26 <br>";
					checkbox.appendChild(stattype2);
					pxBox.appendChild(checkbox);
				}

			  removeClassName(pxBox, "invisible");
			} else {
			  addCSSClass(pxBox, "invisible");
			}
			if (ie) {
				var pageLoaded = $("end") ? 1 : 0; // all loaded?
				if(pageLoaded) {
					$("footer").style.bottom = "1px";
				  setTimeout('$("footer").style.bottom = "0px"', 300);
				}
			}
	  	} */


	}
}
