/*Select handler - http://www.texotela.co.uk/code/jquery/select/*/
eval(function(p,a,c,k,e,r){e=function(c){return(c<62?'':e(parseInt(c/62)))+((c=c%62)>35?String.fromCharCode(c+29):c.toString(36))};if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'[3-9q-suw-zA-Y]'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}(';(6(h){h.w.L=6(){5 j=6(a,f,c,g){5 d=document.createElement("S");d.r=f,d.G=c;5 b=a.C;5 e=b.s;3(!a.z){a.z={};y(5 i=0;i<e;i++){a.z[b[i].r]=i}}3(9 a.z[f]=="T")a.z[f]=e;a.C[a.z[f]]=d;3(g){d.u=8}};5 k=U;3(k.s==0)7 4;5 l=8;5 m=A;5 n,o,p;3(9(k[0])=="D"){m=8;n=k[0]}3(k.s>=2){3(9(k[1])=="M")l=k[1];q 3(9(k[2])=="M")l=k[2];3(!m){o=k[0];p=k[1]}}4.x(6(){3(4.E.B()!="F")7;3(m){y(5 a in n){j(4,a,n[a],l)}}q{j(4,o,p,l)}});7 4};h.w.ajaxAddOption=6(c,g,d,b,e){3(9(c)!="I")7 4;3(9(g)!="D")g={};3(9(d)!="M")d=8;4.x(6(){5 f=4;h.getJSON(c,g,6(a){h(f).L(a,d);3(9 b=="6"){3(9 e=="D"){b.apply(f,e)}q{b.N(f)}}})});7 4};h.w.V=6(){5 d=U;3(d.s==0)7 4;5 b=9(d[0]);5 e,i;3(b=="I"||b=="D"||b=="6"){e=d[0];3(e.H==W){5 j=e.s;y(5 k=0;k<j;k++){4.V(e[k],d[1])}7 4}}q 3(b=="number")i=d[0];q 7 4;4.x(6(){3(4.E.B()!="F")7;3(4.z)4.z=X;5 a=A;5 f=4.C;3(!!e){5 c=f.s;y(5 g=c-1;g>=0;g--){3(e.H==O){3(f[g].r.P(e)){a=8}}q 3(f[g].r==e){a=8}3(a&&d[1]===8)a=f[g].u;3(a){f[g]=X}a=A}}q{3(d[1]===8){a=f[i].u}q{a=8}3(a){4.remove(i)}}});7 4};h.w.sortOptions=6(e){5 i=h(4).Y();5 j=9(e)=="T"?8:!!e;4.x(6(){3(4.E.B()!="F")7;5 c=4.C;5 g=c.s;5 d=[];y(5 b=0;b<g;b++){d[b]={v:c[b].r,t:c[b].G}}d.sort(6(a,f){J=a.t.B(),K=f.t.B();3(J==K)7 0;3(j){7 J<K?-1:1}q{7 J>K?-1:1}});y(5 b=0;b<g;b++){c[b].G=d[b].t;c[b].r=d[b].v}}).Q(i,8);7 4};h.w.Q=6(g,d){5 b=g;5 e=9(g);3(e=="D"&&b.H==W){5 i=4;h.x(b,6(){i.Q(4,d)})};5 j=d||A;3(e!="I"&&e!="6"&&e!="D")7 4;4.x(6(){3(4.E.B()!="F")7 4;5 a=4.C;5 f=a.s;y(5 c=0;c<f;c++){3(b.H==O){3(a[c].r.P(b)){a[c].u=8}q 3(j){a[c].u=A}}q{3(a[c].r==b){a[c].u=8}q 3(j){a[c].u=A}}}});7 4};h.w.copyOptions=6(g,d){5 b=d||"u";3(h(g).size()==0)7 4;4.x(6(){3(4.E.B()!="F")7 4;5 a=4.C;5 f=a.s;y(5 c=0;c<f;c++){3(b=="all"||(b=="u"&&a[c].u)){h(g).L(a[c].r,a[c].G)}}});7 4};h.w.containsOption=6(g,d){5 b=A;5 e=g;5 i=9(e);5 j=9(d);3(i!="I"&&i!="6"&&i!="D")7 j=="6"?4:b;4.x(6(){3(4.E.B()!="F")7 4;3(b&&j!="6")7 A;5 a=4.C;5 f=a.s;y(5 c=0;c<f;c++){3(e.H==O){3(a[c].r.P(e)){b=8;3(j=="6")d.N(a[c],c)}}q{3(a[c].r==e){b=8;3(j=="6")d.N(a[c],c)}}}});7 j=="6"?4:b};h.w.Y=6(){5 a=[];4.R().x(6(){a[a.s]=4.r});7 a};h.w.selectedTexts=6(){5 a=[];4.R().x(6(){a[a.s]=4.G});7 a};h.w.R=6(){7 4.find("S:u")}})(jQuery);',[],61,'|||if|this|var|function|return|true|typeof|||||||||||||||||else|value|length||selected||fn|each|for|cache|false|toLowerCase|options|object|nodeName|select|text|constructor|string|o1t|o2t|addOption|boolean|call|RegExp|match|selectOptions|selectedOptions|option|undefined|arguments|removeOption|Array|null|selectedValues'.split('|'),0,{}))

/**
 *
 */

if(!room) {var room='Room';}
if(!adults) {var adults='Adult(s)';}
if(!children) {var children='Children';}


var HotelSearchFormMaker = function (oUserSetting) {

	this.oDefaultSetting = {
	
		//select box option list
		'aNightList' : [1,2,3,4],
		'iNightDefault' : 1,
		'aRoomList' : [1,2,3,4],
		'iRoomDefault' : 1,
		'aAdultList' : [1,2,3,4],
		'iAdultDefault' : 1,
		'aChildList' : [1,2,3,4],
		'iChildDefault' : 0,
		'aInfantList' : [1,2,3,4],
		'iInfantDefault' : 0,
		'bRefineGUI' : 0
	}
	this.oParam = jQuery.extend({},this.oDefaultSetting, oUserSetting);
	this.sParentElement = this.oParam.sElementId;

	this.okSubmit = false;
	this.SubmitAction = '';

	this.InArray = function(sNeedle, aHaystack){
		for (var sCurNeedle in aHaystack){
			if(sNeedle+''==aHaystack[sCurNeedle]+''){
				return true;
			}
		}
		return false;
	}

	//insert 2 date range, output total night
	this.Date2NightCorrection = function (oStartDate,oEndDate){
		var _self = this;
		if(_self.oParam.DateFormat != undefined){ Date.format = _self.oParam.DateFormat; }
		var iStartDate = Date.fromString(oStartDate.val()).getTime();
		var iEndDate = Date.fromString(oEndDate.val()).getTime();
		var itotalNight = parseInt((iEndDate-iStartDate)/1000/60/60/24); //Unix Time
		//select the valid night, need checking if not in list? 
		if(itotalNight>0){
			//$("#"+this.sParentElement+" #iNight").selectOptions(itotalNight+'');
		}
		return itotalNight;
	}

	this.Night2DateCorrection = function (oStartDate,iNight) {
		var _self = this;
		iNight = Math.abs(iNight);

		//_self.InArray(iNight,_self.oParam.aNightList);

		if(_self.oParam.DateFormat != undefined){ Date.format = _self.oParam.DateFormat; }
		var iStartDate = Date.fromString(oStartDate.val()).getTime();
		var oJsEndDate = new Date();
		oJsEndDate.setTime(iStartDate+(iNight*1000*60*60*24));
		return oJsEndDate.asString();
	}

	this.drawPaxfield = function() {
		var _self = this;
		//create the selectable list
		for (i=0;i<_self.oParam.aAdultList.length;i++){
			$("#"+this.sParentElement+" .iAdult").addOption( _self.oParam.aAdultList[i]+'', _self.oParam.aAdultList[i]+'');
		}

		for (i=0;i<_self.oParam.aChildList.length;i++){
			$("#"+this.sParentElement+" .iChild").addOption( _self.oParam.aChildList[i]+'', _self.oParam.aChildList[i]+'');
		}
		//auto select the value
		$("#"+this.sParentElement+" .iAdult").each(function () {
			try{
				if( $(this).attr('defaultvalue')  == undefined ){
					$(this).selectOptions(_self.oParam.iAdultDefault+'');					
				}else{
					$(this).selectOptions( $(this).attr('defaultvalue')+'' );
				}
			}catch(e){}
		});

		$("#"+this.sParentElement+" .iChild").each(function () {
			try{
				if( $(this).attr('defaultvalue')  == undefined ){
					$(this).selectOptions(_self.oParam.iChildDefault+'');					
				}else{
					$(this).selectOptions( $(this).attr('defaultvalue')+'' );
				}
			}catch(e){}
		});

	}

	this.draw = function () {
		var _self = this;

		if(_self.oParam.DateFormat != undefined){ Date.format = _self.oParam.DateFormat; }
		//Fill the select box with list and select the default value
		for (i=0;i<_self.oParam.aNightList.length;i++){
			$("#"+_self.sParentElement+" #iNight").addOption( _self.oParam.aNightList[i]+'', _self.oParam.aNightList[i]+'');
		}

		try{
			if( $("#"+_self.sParentElement+" #iNight").attr('defaultvalue')==undefined ){
				$("#"+_self.sParentElement+" #iNight").selectOptions(_self.oParam.iNightDefault+'');
			}else{
				$("#"+_self.sParentElement+" #iNight").selectOptions($("#"+_self.sParentElement+" #iNight").attr('defaultvalue')+'');
			}
		}catch(e){}

		for (i=0;i<_self.oParam.aRoomList.length;i++){
			$("#"+_self.sParentElement+" .iQty").addOption( _self.oParam.aRoomList[i]+'', _self.oParam.aRoomList[i]+'');
		}

		try{
			if( $("#"+_self.sParentElement+" .iQty").attr('defaultvalue')==undefined ){
				$("#"+_self.sParentElement+" .iQty").selectOptions(_self.oParam.iRoomDefault+'');
			}else{
				$("#"+_self.sParentElement+" .iQty").selectOptions($("#"+_self.sParentElement+" .iQty").attr('defaultvalue')+'');
			}
		}catch(e){}

		_self.drawPaxfield();

		$("#"+_self.sParentElement+" .iQty").change(function() {


			var iShowRoom = parseInt($(this).val());

			//copy the original value, Temp
			var aTempAdult= new Array();
			var aTempChild= new Array();
			$("#"+_self.sParentElement+" .iAdult").each(function () {
						aTempAdult.push($(this).val());					
			});
			$("#"+_self.sParentElement+" .iChild").each(function () {
						aTempChild.push($(this).val());					
			});

			//recreate the form
			$("#"+_self.sParentElement+" .extraroom").html('');
			if(_self.oParam.bRefineGUI==0){
				//Draw for homepage
				$("#"+_self.sParentElement+" .extraroom").append('<div class="noroom"><label>'+roomCounter[1]+'</label></div><div class="adult"><label>'+adults+':</label><br /><select class="iAdult"  defaultvalue="1"  id="iAdult[]" name="iAdult[]"></select></div><div class="child"><label>'+children+':</label><br /><select class="iChild" id="iChild[]" name="iChild[]"></select><br /></div><div class="clear"></div>'); 
				for (var i=1;i<iShowRoom;i++){
					$("#"+_self.sParentElement+" .extraroom").append('<div class="noroom"><label>'+roomCounter[i+1]+' '+'</label></div><div class="adult"><label>&nbsp;</label><br /><select class="iAdult"  defaultvalue="1"  id="iAdult[]" name="iAdult[]"></select></div><div class="child"><label>&nbsp;</label><br /><select class="iChild" id="iChild[]" name="iChild[]"></select></div><div class="clear"></div>'); 
				}
			}else if(_self.oParam.bRefineGUI==3){
				//Draw for changebox
				var extraRoom = new Array();
				extraRoom.push('<table><tr><td><div class="adult"><label>'+adults+':</label><select id="iAdult[]" class="iAdult" defaultvalue="1" name="iAdult[]"></select></div></td><td><div class="child"><label>'+children+':</label><select id="iChild[]" class="iChild" defaultvalue="0" name="iChild[]"></select></div></td></tr>');
				for (var i=1;i<iShowRoom;i++){
					extraRoom.push('<tr><td><div class="adult"><select id="iAdult[]" class="iAdult" defaultvalue="1" name="iAdult[]"></select></div></td><td><div class="child"><select id="iChild[]" class="iChild" defaultvalue="0" name="iChild[]"></select></div></td></tr>');
				}
				extraRoom.push('</table>');
				$("#"+_self.sParentElement+" .extraroom").append(extraRoom.join(''));
			}else{
				//Draw for refine search
				$("#"+_self.sParentElement+" .extraroom").append('<div class="adult"><label>'+adults+':</label><select id="iAdult[]" class="iAdult" defaultvalue="1" name="iAdult[]"></select></div><div class="child"><label>'+children+':</label><select id="iChild[]" class="iChild" defaultvalue="0" name="iChild[]"></select></div><br/><div class="clear"/>');
				for (var i=1;i<iShowRoom;i++){
					$("#"+_self.sParentElement+" .extraroom").append('<div class="adult"><label>'+adults+':</label><select id="iAdult[]" class="iAdult" defaultvalue="1" name="iAdult[]"></select></div><div class="child"><label>'+children+':</label><select id="iChild[]" class="iChild" defaultvalue="0" name="iChild[]"></select></div><br/><div class="clear"/>');
				}
			}

			//restore the previous value 
			var i = 0;
			$("#"+_self.sParentElement+" .iAdult").each(function () {
					$(this).attr('defaultvalue',aTempAdult[i++]);
			});
			var i = 0;
			$("#"+_self.sParentElement+" .iChild").each(function () {
					$(this).attr('defaultvalue',aTempChild[i++]);				
			});

			_self.drawPaxfield();
		});

		//Initialize date function
		_self.oParam.DateHandler( $('#'+this.sParentElement+' #sStartDate'), $('#'+_self.sParentElement+' #sEndDate'), $("#"+_self.sParentElement+" #iNight"));  
  
		//trigger date field onchange event
		$('#'+_self.sParentElement+' #sStartDate').change( function() {
			_self.oParam.DateValidator(
				1, 
				$('#'+_self.sParentElement+' #sStartDate'), 
				$('#'+_self.sParentElement+' #sEndDate'),
				$("#"+_self.sParentElement+" #iNight"),
				_self.Date2NightCorrection($('#'+_self.sParentElement+' #sStartDate'),$('#'+_self.sParentElement+' #sEndDate')),
				_self.Night2DateCorrection($('#'+_self.sParentElement+' #sStartDate'),parseInt($("#"+_self.sParentElement+" #iNight").val()))
			);
		});

		$('#'+_self.sParentElement+' #sEndDate').change( function() {
			_self.oParam.DateValidator(
				2, 
				$('#'+_self.sParentElement+' #sStartDate'), 
				$('#'+_self.sParentElement+' #sEndDate'),
				$("#"+_self.sParentElement+" #iNight"),
				_self.Date2NightCorrection($('#'+_self.sParentElement+' #sStartDate'),$('#'+_self.sParentElement+' #sEndDate')),
				_self.Night2DateCorrection($('#'+_self.sParentElement+' #sStartDate'),parseInt($("#"+_self.sParentElement+" #iNight").val()))
			);
		});

		$("#"+_self.sParentElement+" #iNight").change( function (){
			_self.oParam.DateValidator(
				3, 
				$('#'+_self.sParentElement+' #sStartDate'), 
				$('#'+_self.sParentElement+' #sEndDate'),
				$("#"+_self.sParentElement+" #iNight"),
				_self.Date2NightCorrection($('#'+_self.sParentElement+' #sStartDate'),$('#'+_self.sParentElement+' #sEndDate')),
				_self.Night2DateCorrection($('#'+_self.sParentElement+' #sStartDate'),parseInt($("#"+_self.sParentElement+" #iNight").val()))
			);
		});

		//Initialize location function
		try{
			_self.oParam.LoactionHandler($('#'+_self.sParentElement+' .sCountryCode'),$('#'+_self.sParentElement+' .sRegion'),$('#'+_self.sParentElement+' .sLocationList'));
		}catch(e){}

		$("#"+_self.sParentElement+" .submit_button").click( function (){
			if(_self.SubmitAction !=''){
				$("#"+_self.sParentElement+"").attr('action',_self.SubmitAction);
			}
			_self.okSubmit = _self.oParam.SubmitValidator($('#'+_self.sParentElement+' .sCountryCode'),$('#'+_self.sParentElement+' .sRegion'),$('#'+_self.sParentElement+' .sLocationList'));
			
		});

		$("#"+_self.sParentElement).unbind('submit').submit(function(a){
			var bCheckState = _self.okSubmit;
			_self.okSubmit = false;
			return bCheckState;
		});

		$('#'+_self.sParentElement+'').unbind('keypress').bind('keypress', function (e) {
			if(e.which==13){
				return false;
			}
		});

	}

};
























var HolidaySearchFormMaker = function (oUserSetting) {
	this.oDefaultSetting = {

	}
	this.oParam = jQuery.extend({},this.oDefaultSetting, oUserSetting);
	this.sParentElement = this.oParam.sElementId;

	//insert 2 date range, output total night
	this.Date2NightCorrection = function (oStartDate,oEndDate){
		var _self = this;
		if(_self.oParam.DateFormat != undefined){ Date.format = _self.oParam.DateFormat; }
		var iStartDate = Date.fromString(oStartDate.val()).getTime();
		var iEndDate = Date.fromString(oEndDate.val()).getTime();
		var itotalNight = parseInt((iEndDate-iStartDate)/1000/60/60/24); //Unix Time
		//select the valid night, need checking if not in list? 
		if(itotalNight>0){
			//$("#"+this.sParentElement+" #iNight").selectOptions(itotalNight+'');
		}
		return itotalNight;
	}

	this.Night2DateCorrection = function (oStartDate,iNight){
		var _self = this;
		iNight++;	//The Night select box value is always greater then its value by 1
		iNight = Math.abs(iNight);

		if(_self.oParam.DateFormat != undefined){ Date.format = _self.oParam.DateFormat; }
		var iStartDate = Date.fromString(oStartDate.val()).getTime();
		var oJsEndDate = new Date();
		oJsEndDate.setTime(iStartDate+(iNight*1000*60*60*24));
		return oJsEndDate.asString();
	}
	this.drawPaxfield = function(){
		var _self = this;

		//create the selectable list
		for (i=0;i<_self.oParam.aAdultList.length;i++){
			$("#"+this.sParentElement+" .iAdult").addOption( _self.oParam.aAdultList[i]+'', _self.oParam.aAdultList[i]+'');
		}
		for (i=0;i<_self.oParam.aChildList.length;i++){
			$("#"+this.sParentElement+" .iChild").addOption( _self.oParam.aChildList[i]+'', _self.oParam.aChildList[i]+'');
		}
		//auto select the value
		$("#"+this.sParentElement+" .iAdult").each(function () {
			try{
				if( $(this).attr('defaultvalue')  == undefined ){
					$(this).selectOptions(_self.oParam.iAdultDefault+'');					
				}else{
					$(this).selectOptions( $(this).attr('defaultvalue')+'' );
				}
			}catch(e){}
		});
		$("#"+this.sParentElement+" .iChild").each(function () {
			try{
				if( $(this).attr('defaultvalue')  == undefined ){
					$(this).selectOptions(_self.oParam.iChildDefault+'');					
				}else{
					$(this).selectOptions( $(this).attr('defaultvalue')+'' );
				}
			}catch(e){}
		});
	}

	this.draw = function () {
		var _self = this;
		if(_self.oParam.DateFormat != undefined){ Date.format = _self.oParam.DateFormat; }

		$.getJSON(_self.oParam.sHolidayTypesSource,
		function(data){
			var sOption = new Array();
			for ( var i in data ){
					sOption.push('<option class="content" '+((_self.oParam.sHolidayTypesDefault==i) ? 'selected="selected"' : '' )+' value="'+i+'">'+i+'</option>');
			}
 			$("#"+_self.sParentElement+" #sHolidayTypes").html('').append(sOption.join(''));
		});


		$.getJSON(_self.oParam.sHolidayDestinationSource,
		function(data){
			var sOption = new Array();
			sOption.push('<option class="content" '+((_self.oParam.sDestinationsDefault=='') ? 'selected="selected"' : '' )+' value=""></option>');
			for ( var i in data ){
				sOption.push('<option class="title" value="'+i+'" disabled="disabled" >'+i+'</option>');
				for ( var k in data[i] ){
					sOption.push('<option class="content" '+((_self.oParam.sDestinationsDefault==k) ? 'selected="selected"' : '' )+' value="'+i+'_'+k+'"> - '+k+'</option>');
				}
			}
			$("#"+_self.sParentElement+" #sDestination").html('').append(sOption.join(''));

			//handling the default
			try{
				if( $("#"+_self.sParentElement+" #sDestination").attr('defaultvalue')  != undefined ){
					$("#"+_self.sParentElement+" #sDestination").selectOptions($("#"+_self.sParentElement+" #sDestination").attr('defaultvalue'));
				}
			}catch(e){}


		});



		$.getJSON(_self.oParam.sHolidayAirportSource,
		function(data) {
			var sOption = new Array();
			for ( var i in data ) {
				for ( var k in data[i] ) {
					sOption.push('<option class="content" '+((_self.oParam.sDepartureAirPortDefault==k) ? 'selected="selected"' : '' )+' value="'+i+(i?'_':'')+k+'">'+k+(k==''? '': ', ')+i+'</option>');
				}
			}
 			$("#"+_self.sParentElement+" #sDepartureAirPort").html('').append(sOption.join(''));

			//handling the default
			try {
				if( $("#"+_self.sParentElement+" #sDepartureAirPort").attr('defaultvalue')  != undefined ){
					$("#"+_self.sParentElement+" #sDepartureAirPort").selectOptions($("#"+_self.sParentElement+" #sDepartureAirPort").attr('defaultvalue'));
				}
			} catch(e){}

		});

		var iNightIdx=_self.oParam.sNumberNightDefault-1;
		$("#"+_self.sParentElement+" #sNumNight").addOption( _self.oParam.oNumberNight ,true);
		$("#"+_self.sParentElement+" #sNumNight").selectOptions(iNightIdx+'');

		for (i=0;i<_self.oParam.aRoomList.length;i++){
			$("#"+_self.sParentElement+" .iQty").addOption( _self.oParam.aRoomList[i]+'', _self.oParam.aRoomList[i]+'');
		}

		try{
			if( $("#"+_self.sParentElement+" .iQty").attr('defaultvalue')==undefined ){
				$("#"+_self.sParentElement+" .iQty").selectOptions(_self.oParam.iRoomDefault+'');
			}else{
				$("#"+_self.sParentElement+" .iQty").selectOptions($("#"+_self.sParentElement+" .iQty").attr('defaultvalue')+'');
			}
		}catch(e){}

		_self.drawPaxfield();
		//alert($("#"+_self.sParentElement+" .extraroom").html());
		$("#"+_self.sParentElement+" .iQty").change(function() {
			$("#"+_self.sParentElement+" .extraroom").html('');
			var iShowRoom = parseInt($(this).val());

			//copy the original value, Temp
			var aTempAdult= new Array();
			var aTempChild= new Array();

			$("#"+_self.sParentElement+" .iAdult").each(function () {
						aTempAdult.push($(this).val());	
			});
			$("#"+_self.sParentElement+" .iChild").each(function () {
						aTempChild.push($(this).val());					
			});

			//render the dropdown
			$("#"+_self.sParentElement+" .extraroom").html('');
			if(_self.oParam.bRefineGUI==0){
				//refine page


				$("#"+_self.sParentElement+" .extraroom").append('<div class="adult"><label>'+adults+':</label><select defaultvalue="2" name="iAdult[]" id="iAdult[]" class="iAdult"></select></div><div class="child"><label>'+children+':</label><select defaultvalue="0" name="iChild[]" id="iChild[]" class="iChild"></select></div><br/><div class="clear"/>'); 
				for (var i=1;i<iShowRoom;i++){
					$("#"+_self.sParentElement+" .extraroom").append('<div class="adult"><label>'+adults+':</label><select defaultvalue="2" name="iAdult[]" id="iAdult[]" class="iAdult"></select></div><div class="child"><label>'+children+':</label><select defaultvalue="0" name="iChild[]" id="iChild[]" class="iChild"></select></div><br/><div class="clear"/>'); 
				}
			}else if(_self.oParam.bRefineGUI==3){
				//reserve for change box page
			}else{
				//the main page design
				$("#"+_self.sParentElement+" .extraroom").append('<div class="noroom"><label>'+room+' 1</label></div><div class="adult"><label>'+adults+':</label><br /><select class="iAdult"  defaultvalue="2"  id="iAdult[]" name="iAdult[]"></select></div><div class="child"><label>'+children+':</label><br /><select class="iChild" id="iChild[]" name="iChild[]"></select><br /></div><div class="clear"></div>'); 
				for (var i=1;i<iShowRoom;i++){
					$("#"+_self.sParentElement+" .extraroom").append('<div class="noroom"><label>'+room+' '+(i+1)+'</label></div><div class="adult"><label>&nbsp;</label><br /><select class="iAdult"  defaultvalue="2"  id="iAdult[]" name="iAdult[]"></select></div><div class="child"><label>&nbsp;</label><br /><select class="iChild" id="iChild[]" name="iChild[]"></select></div><div class="clear"></div>'); 
				}
			}


			//restore the previous value 
			var i = 0;
			$("#"+_self.sParentElement+" .iAdult").each(function () {
					$(this).attr('defaultvalue',aTempAdult[i++]);
			});
			var i = 0;
			$("#"+_self.sParentElement+" .iChild").each(function () {
					$(this).attr('defaultvalue',aTempChild[i++]);				
			});

			_self.drawPaxfield();
		});
		

		//Initialize date function
		_self.oParam.DateHandler( $('#'+this.sParentElement+' #sDepartDate'), $('#'+_self.sParentElement+' #sReturnDate'), $("#"+_self.sParentElement+" #sNumNight"));  
  
		/*
			fix for the Result page Search panel to render the correnct Night field
		*/
		var oStartD = Date.fromString($('#'+this.sParentElement+' #sDepartDate').val());
		var oEndD = Date.fromString($('#'+this.sParentElement+' #sReturnDate').val());
		var dayDiff=oEndD-oStartD;
		var numOfDays=(dayDiff/(60*60*24*1000))-1;
		var toNights=parseInt($("#"+_self.sParentElement+" #sNumNight").val());
		if(numOfDays!=toNights)
		{
			$("#"+_self.sParentElement+" #sNumNight").selectOptions(numOfDays+'');
		}


		//trigger date field onchange event
		$('#'+_self.sParentElement+' #sDepartDate').change( function() {
			_self.oParam.DateValidator(
				1, 
				$('#'+_self.sParentElement+' #sDepartDate'), 
				$('#'+_self.sParentElement+' #sReturnDate'),
				$("#"+_self.sParentElement+" #sNumNight"),
				_self.Date2NightCorrection($('#'+_self.sParentElement+' #sDepartDate'),$('#'+_self.sParentElement+' #sReturnDate')),
				_self.Night2DateCorrection($('#'+_self.sParentElement+' #sDepartDate'),parseInt($("#"+_self.sParentElement+" #sNumNight").val()))
			);
		});

		$('#'+_self.sParentElement+' #sReturnDate').change( function() {
			_self.oParam.DateValidator(
				2, 
				$('#'+_self.sParentElement+' #sDepartDate'), 
				$('#'+_self.sParentElement+' #sReturnDate'),
				$("#"+_self.sParentElement+" #sNumNight"),
				_self.Date2NightCorrection($('#'+_self.sParentElement+' #sDepartDate'),$('#'+_self.sParentElement+' #sReturnDate')),
				_self.Night2DateCorrection($('#'+_self.sParentElement+' #sDepartDate'),parseInt($("#"+_self.sParentElement+" #sNumNight").val()))
			);
		});

		$("#"+_self.sParentElement+" #sNumNight").change( function (){
			_self.oParam.DateValidator(
				3, 
				$('#'+_self.sParentElement+' #sDepartDate'), 
				$('#'+_self.sParentElement+' #sReturnDate'),
				$("#"+_self.sParentElement+" #sNumNight"),
				_self.Date2NightCorrection($('#'+_self.sParentElement+' #sDepartDate'),$('#'+_self.sParentElement+' #sReturnDate')),
				_self.Night2DateCorrection($('#'+_self.sParentElement+' #sDepartDate'),parseInt($("#"+_self.sParentElement+" #sNumNight").val()))
			);
		});

		$("#"+_self.sParentElement+" .submit_button").click( function (){
			return _self.oParam.SubmitValidator( $("#"+_self.sParentElement+" #sHolidayType"), $("#"+_self.sParentElement+" #sDestination"), $("#"+_self.sParentElement+" #sDepartureAirPort") );
		});

		$('#'+_self.sParentElement+'').unbind('keypress').bind('keypress', function (e) {
			if(e.which==13){
				return false;
			}
		});

	}

};





var FlightSearchFormMaker = function (oUserSetting) {
	this.oDefaultSetting = {

	}
	this.oParam = jQuery.extend({},this.oDefaultSetting, oUserSetting);
	this.sParentElement = this.oParam.sElementId;

	//insert 2 date range, output total night
	this.Date2NightCorrection = function (oStartDate,oEndDate) {
		var _self = this;
		if(_self.oParam.DateFormat != undefined){ Date.format = _self.oParam.DateFormat; }
		var iStartDate = Date.fromString(oStartDate.val()).getTime();
		var iEndDate = Date.fromString(oEndDate.val()).getTime();
		var itotalNight = parseInt((iEndDate-iStartDate)/1000/60/60/24); //Unix Time
		//select the valid night, need checking if not in list? 
		if(itotalNight>0){
			//$("#"+this.sParentElement+" #iNight").selectOptions(itotalNight+'');
		}
		return itotalNight;
	}

	this.Night2DateCorrection = function (oStartDate,iNight) {
		var _self = this;
		iNight++;	//The Night select box value is always greater then its value by 1
		iNight = Math.abs(iNight);

		if(_self.oParam.DateFormat != undefined){ Date.format = _self.oParam.DateFormat; }
		var iStartDate = Date.fromString(oStartDate.val()).getTime();
		var oJsEndDate = new Date();
		oJsEndDate.setTime(iStartDate+(iNight*1000*60*60*24));
		return oJsEndDate.asString();
	}
	this.drawPaxfield = function() {
		var _self = this;

		//create the selectable list
		for (i=0;i<_self.oParam.aAdultList.length;i++) {
			$("#"+this.sParentElement+" .fAdult").addOption( _self.oParam.aAdultList[i]+'', _self.oParam.aAdultList[i]+'');
		}
		for (i=0;i<_self.oParam.aChildList.length;i++){
			$("#"+this.sParentElement+" .fChild").addOption( _self.oParam.aChildList[i]+'', _self.oParam.aChildList[i]+'');
		}
		//auto select the value
		$("#"+this.sParentElement+" .fAdult").each(function () {
			try{
				if( $(this).attr('defaultvalue')  == undefined ){
					$(this).selectOptions(_self.oParam.iAdultDefault+'');					
				}else{
					$(this).selectOptions( $(this).attr('defaultvalue')+'' );
				}
			}catch(e){}
		});
		$("#"+this.sParentElement+" .fChild").each(function () {
			try{
				if( $(this).attr('defaultvalue')  == undefined ){
					$(this).selectOptions(_self.oParam.iChildDefault+'');					
				}else{
					$(this).selectOptions( $(this).attr('defaultvalue')+'' );
				}
			}catch(e){}
		});
	}

	this.draw = function () {
		var _self = this;
		if(_self.oParam.DateFormat != undefined){ Date.format = _self.oParam.DateFormat; }


		_self.drawPaxfield();

		//Initialize date function
		try{
			$("#"+_self.sParentElement+" #fNight").val(10);
		}catch(e){}

/*
		_self.oParam.DateHandler( $('#'+this.sParentElement+' #fDepartDate'), $('#'+_self.sParentElement+' #fReturnDate'),null);  
*/
  
/**/
		//Initialize date function
		_self.oParam.DateHandler( $('#'+this.sParentElement+' #fDepartDate'), $('#'+_self.sParentElement+' #fReturnDate'), $("#"+_self.sParentElement+" #fNight"));  
  
		//trigger date field onchange event
		$('#'+_self.sParentElement+' #fDepartDate').change( function() {
			_self.oParam.DateValidator(
				1, 
				$('#'+_self.sParentElement+' #fDepartDate'), 
				$('#'+_self.sParentElement+' #fReturnDate'),
				$("#"+_self.sParentElement+" #fNight"),
				_self.Date2NightCorrection($('#'+_self.sParentElement+' #fDepartDate'),$('#'+_self.sParentElement+' #fDepartDate')),
				_self.Night2DateCorrection($('#'+_self.sParentElement+' #fReturnDate'),parseInt($("#"+_self.sParentElement+" #fNight").val()))
			);
		});

		$('#'+_self.sParentElement+' #fReturnDate').change( function() {
			_self.oParam.DateValidator(
				2, 
				$('#'+_self.sParentElement+' #fDepartDate'), 
				$('#'+_self.sParentElement+' #fReturnDate'),
				$("#"+_self.sParentElement+" #fNight"),
				_self.Date2NightCorrection($('#'+_self.sParentElement+' #fDepartDate'),$('#'+_self.sParentElement+' #fReturnDate')),
				_self.Night2DateCorrection($('#'+_self.sParentElement+' #fDepartDate'),parseInt($("#"+_self.sParentElement+" #fNight").val()))
			);
		});
/**/

		//Initialize location function
		try{
			_self.oParam.LoactionHandler($('#'+_self.sParentElement+' .sDepartureCountryCode'),$('#'+_self.sParentElement+' .sDepartureRegion'),$('#'+_self.sParentElement+' .sDepartureLocationList'), 'departure_location_search');
		}catch(e){}

		//Initialize location function
		try{
			_self.oParam.LoactionHandler($('#'+_self.sParentElement+' .sDepartureCountryCode'),$('#'+_self.sParentElement+' .sDepartureRegion'),$('#'+_self.sParentElement+' .sDepartureLocationList'), 'destination_location_search');
		}catch(e){}



		$('#'+_self.sParentElement+'').unbind('keypress').bind('keypress', function (e) {
			if(e.which==13){
				return false;
			}
		});

	}

};






var FlightHotelSearchFormMaker = function (oUserSetting) {
	this.oDefaultSetting = {

	}
	this.oParam = jQuery.extend({},this.oDefaultSetting, oUserSetting);
	this.sParentElement = this.oParam.sElementId;

	//insert 2 date range, output total night
	this.Date2NightCorrection = function (oStartDate,oEndDate){
		var _self = this;
		if(_self.oParam.DateFormat != undefined){ Date.format = _self.oParam.DateFormat; }
		var iStartDate = Date.fromString(oStartDate.val()).getTime();
		var iEndDate = Date.fromString(oEndDate.val()).getTime();
		var itotalNight = parseInt((iEndDate-iStartDate)/1000/60/60/24); //Unix Time
		//select the valid night, need checking if not in list? 
		if(itotalNight>0){
			//$("#"+this.sParentElement+" #iNight").selectOptions(itotalNight+'');
		}
		return itotalNight;
	}

	this.Night2DateCorrection = function (oStartDate,iNight){
		var _self = this;
		iNight++;	//The Night select box value is always greater then its value by 1
		iNight = Math.abs(iNight);

		if(_self.oParam.DateFormat != undefined){ Date.format = _self.oParam.DateFormat; }
		var iStartDate = Date.fromString(oStartDate.val()).getTime();
		var oJsEndDate = new Date();
		oJsEndDate.setTime(iStartDate+(iNight*1000*60*60*24));
		return oJsEndDate.asString();
	}
	this.drawPaxfield = function(){
		var _self = this;

		//create the selectable list
		for (i=0;i<_self.oParam.aAdultList.length;i++){
			$("#"+this.sParentElement+" .iAdult").addOption( _self.oParam.aAdultList[i]+'', _self.oParam.aAdultList[i]+'');
		}
		for (i=0;i<_self.oParam.aChildList.length;i++){
			$("#"+this.sParentElement+" .iChild").addOption( _self.oParam.aChildList[i]+'', _self.oParam.aChildList[i]+'');
		}
		//auto select the value
		$("#"+this.sParentElement+" .iAdult").each(function () {
			try{
				if( $(this).attr('defaultvalue')  == undefined ){
					$(this).selectOptions(_self.oParam.iAdultDefault+'');					
				}else{
					$(this).selectOptions( $(this).attr('defaultvalue')+'' );
				}
			}catch(e){}
		});
		$("#"+this.sParentElement+" .iChild").each(function () {
			try{
				if( $(this).attr('defaultvalue')  == undefined ){
					$(this).selectOptions(_self.oParam.iChildDefault+'');					
				}else{
					$(this).selectOptions( $(this).attr('defaultvalue')+'' );
				}
			}catch(e){}
		});
	}

	this.draw = function () {
		var _self = this;
		if(_self.oParam.DateFormat != undefined){ Date.format = _self.oParam.DateFormat; }

		$.getJSON(_self.oParam.sHolidayTypesSource,
		function(data){
			var sOption = new Array();
			for ( var i in data ){
					sOption.push('<option class="content" '+((_self.oParam.sHolidayTypesDefault==i) ? 'selected="selected"' : '' )+' value="'+i+'">'+i+'</option>');
			}
 			$("#"+_self.sParentElement+" #sHolidayTypes").html('').append(sOption.join(''));
		});


		$.getJSON(_self.oParam.sHolidayDestinationSource,
		function(data){
			var sOption = new Array();
			sOption.push('<option class="content" '+((_self.oParam.sDestinationsDefault=='') ? 'selected="selected"' : '' )+' value=""></option>');
			for ( var i in data ){
				sOption.push('<option class="title" value="'+i+'" disabled="disabled" >'+i+'</option>');
				for ( var k in data[i] ){
					sOption.push('<option class="content" '+((_self.oParam.sDestinationsDefault==k) ? 'selected="selected"' : '' )+' value="'+i+'_'+k+'"> - '+k+'</option>');
				}
			}
			$("#"+_self.sParentElement+" #sDestination").html('').append(sOption.join(''));

			//handling the default
			try{
				if( $("#"+_self.sParentElement+" #sDestination").attr('defaultvalue')  != undefined ){
					$("#"+_self.sParentElement+" #sDestination").selectOptions($("#"+_self.sParentElement+" #sDestination").attr('defaultvalue'));
				}
			}catch(e){}


		});



		$.getJSON(_self.oParam.sHolidayAirportSource,
		function(data) {
			var sOption = new Array();
			for ( var i in data ) {
				for ( var k in data[i] ) {
					sOption.push('<option class="content" '+((_self.oParam.sDepartureAirPortDefault==k) ? 'selected="selected"' : '' )+' value="'+i+(i?'_':'')+k+'">'+k+(k==''? '': ', ')+i+'</option>');
				}
			}
 			$("#"+_self.sParentElement+" #sDepartureAirPort").html('').append(sOption.join(''));

			//handling the default
			try {
				if( $("#"+_self.sParentElement+" #sDepartureAirPort").attr('defaultvalue')  != undefined ){
					$("#"+_self.sParentElement+" #sDepartureAirPort").selectOptions($("#"+_self.sParentElement+" #sDepartureAirPort").attr('defaultvalue'));
				}
			} catch(e){}

		});

		var iNightIdx=_self.oParam.sNumberNightDefault-1;
		$("#"+_self.sParentElement+" #sNumNight").addOption( _self.oParam.oNumberNight ,true);
		$("#"+_self.sParentElement+" #sNumNight").selectOptions(iNightIdx+'');

		for (i=0;i<_self.oParam.aRoomList.length;i++){
			$("#"+_self.sParentElement+" .iQty").addOption( _self.oParam.aRoomList[i]+'', _self.oParam.aRoomList[i]+'');
		}

		try{
			if( $("#"+_self.sParentElement+" .iQty").attr('defaultvalue')==undefined ){
				$("#"+_self.sParentElement+" .iQty").selectOptions(_self.oParam.iRoomDefault+'');
			}else{
				$("#"+_self.sParentElement+" .iQty").selectOptions($("#"+_self.sParentElement+" .iQty").attr('defaultvalue')+'');
			}
		}catch(e){}

		_self.drawPaxfield();
		//alert($("#"+_self.sParentElement+" .extraroom").html());
		$("#"+_self.sParentElement+" .iQty").change(function() {
			$("#"+_self.sParentElement+" .extraroom").html('');
			var iShowRoom = parseInt($(this).val());

			//copy the original value, Temp
			var aTempAdult= new Array();
			var aTempChild= new Array();

			$("#"+_self.sParentElement+" .iAdult").each(function () {
						aTempAdult.push($(this).val());	
			});
			$("#"+_self.sParentElement+" .iChild").each(function () {
						aTempChild.push($(this).val());					
			});

			//render the dropdown
			$("#"+_self.sParentElement+" .extraroom").html('');
			if(_self.oParam.bRefineGUI==0){
				//refine page


				$("#"+_self.sParentElement+" .extraroom").append('<div class="adult"><label>'+adults+':</label><select defaultvalue="2" name="iAdult[]" id="iAdult[]" class="iAdult"></select></div><div class="child"><label>'+children+':</label><select defaultvalue="0" name="iChild[]" id="iChild[]" class="iChild"></select></div><br/><div class="clear"/>'); 
				for (var i=1;i<iShowRoom;i++){
					$("#"+_self.sParentElement+" .extraroom").append('<div class="adult"><label>'+adults+':</label><select defaultvalue="2" name="iAdult[]" id="iAdult[]" class="iAdult"></select></div><div class="child"><label>'+children+':</label><select defaultvalue="0" name="iChild[]" id="iChild[]" class="iChild"></select></div><br/><div class="clear"/>'); 
				}
			}else if(_self.oParam.bRefineGUI==3){
				//reserve for change box page
			}else{
				//the main page design
				$("#"+_self.sParentElement+" .extraroom").append('<div class="noroom"><label>'+room+' 1</label></div><div class="adult"><label>'+adults+':</label><br /><select class="iAdult"  defaultvalue="2"  id="iAdult[]" name="iAdult[]"></select></div><div class="child"><label>'+children+':</label><br /><select class="iChild" id="iChild[]" name="iChild[]"></select><br /></div><div class="clear"></div>'); 
				for (var i=1;i<iShowRoom;i++){
					$("#"+_self.sParentElement+" .extraroom").append('<div class="noroom"><label>'+room+' '+(i+1)+'</label></div><div class="adult"><label>&nbsp;</label><br /><select class="iAdult"  defaultvalue="2"  id="iAdult[]" name="iAdult[]"></select></div><div class="child"><label>&nbsp;</label><br /><select class="iChild" id="iChild[]" name="iChild[]"></select></div><div class="clear"></div>'); 
				}
			}


			//restore the previous value 
			var i = 0;
			$("#"+_self.sParentElement+" .iAdult").each(function () {
					$(this).attr('defaultvalue',aTempAdult[i++]);
			});
			var i = 0;
			$("#"+_self.sParentElement+" .iChild").each(function () {
					$(this).attr('defaultvalue',aTempChild[i++]);				
			});

			_self.drawPaxfield();
		});
		

		//Initialize date function
		_self.oParam.DateHandler( $('#'+this.sParentElement+' #sDepartDate'), $('#'+_self.sParentElement+' #sReturnDate'), $("#"+_self.sParentElement+" #sNumNight"));  
  
		/*
			fix for the Result page Search panel to render the correnct Night field
		*/
		var oStartD = Date.fromString($('#'+this.sParentElement+' #sDepartDate').val());
		var oEndD = Date.fromString($('#'+this.sParentElement+' #sReturnDate').val());
		var dayDiff=oEndD-oStartD;
		var numOfDays=(dayDiff/(60*60*24*1000))-1;
		var toNights=parseInt($("#"+_self.sParentElement+" #sNumNight").val());
		if(numOfDays!=toNights)
		{
			$("#"+_self.sParentElement+" #sNumNight").selectOptions(numOfDays+'');
		}


		//trigger date field onchange event
		$('#'+_self.sParentElement+' #sDepartDate').change( function() {
			_self.oParam.DateValidator(
				1, 
				$('#'+_self.sParentElement+' #sDepartDate'), 
				$('#'+_self.sParentElement+' #sReturnDate'),
				$("#"+_self.sParentElement+" #sNumNight"),
				_self.Date2NightCorrection($('#'+_self.sParentElement+' #sDepartDate'),$('#'+_self.sParentElement+' #sReturnDate')),
				_self.Night2DateCorrection($('#'+_self.sParentElement+' #sDepartDate'),parseInt($("#"+_self.sParentElement+" #sNumNight").val()))
			);
		});

		$('#'+_self.sParentElement+' #sReturnDate').change( function() {
			_self.oParam.DateValidator(
				2, 
				$('#'+_self.sParentElement+' #sDepartDate'), 
				$('#'+_self.sParentElement+' #sReturnDate'),
				$("#"+_self.sParentElement+" #sNumNight"),
				_self.Date2NightCorrection($('#'+_self.sParentElement+' #sDepartDate'),$('#'+_self.sParentElement+' #sReturnDate')),
				_self.Night2DateCorrection($('#'+_self.sParentElement+' #sDepartDate'),parseInt($("#"+_self.sParentElement+" #sNumNight").val()))
			);
		});

		$("#"+_self.sParentElement+" #sNumNight").change( function (){
			_self.oParam.DateValidator(
				3, 
				$('#'+_self.sParentElement+' #sDepartDate'), 
				$('#'+_self.sParentElement+' #sReturnDate'),
				$("#"+_self.sParentElement+" #sNumNight"),
				_self.Date2NightCorrection($('#'+_self.sParentElement+' #sDepartDate'),$('#'+_self.sParentElement+' #sReturnDate')),
				_self.Night2DateCorrection($('#'+_self.sParentElement+' #sDepartDate'),parseInt($("#"+_self.sParentElement+" #sNumNight").val()))
			);
		});

		$("#"+_self.sParentElement+" .submit_button").click( function (){
			return _self.oParam.SubmitValidator( $("#"+_self.sParentElement+" #sHolidayType"), $("#"+_self.sParentElement+" #sDestination"), $("#"+_self.sParentElement+" #sDepartureAirPort") );
		});

		$('#'+_self.sParentElement+'').unbind('keypress').bind('keypress', function (e) {
			if(e.which==13){
				return false;
			}
		});

	}

};


var HotelClassicSearchFormMaker = function (oUserSetting) {
	this.oDefaultSetting = {

	}
	this.oParam = jQuery.extend({},this.oDefaultSetting, oUserSetting);
	this.sParentElement = this.oParam.sElementId;

	this.draw = function () {
		var _self = this;

		var sCountry;			// selected country.
		var sCountryCityOptions;	// datastore for the country/city options.


		$.getJSON(_self.oParam.sHotelLocationSource,
		function(data) {
			var sOption = new Array();

			_self.sCountryCityOptions=data;

			sOption.push('<option class="content" '+((_self.oParam.sHotelDefault=='') ? 'selected="selected"' : '' )+' value=""></option>');

			for(var i in _self.sCountryCityOptions) {
				sOption.push('<option class="content" value="'+i+'" >'+i+'</option>');
			}
			$("#"+_self.sParentElement+" #sHotelCountry").html('').append(sOption.join(''));

			//handling the default
			try{
				if( $("#"+_self.sParentElement+" #sHotelCountry").attr('defaultvalue')  != undefined ){
					$("#"+_self.sParentElement+" #sHotelCountry").selectOptions($("#"+_self.sParentElement+" #sHotelCountry").attr('defaultvalue'));
				}
			}catch(e){ alert('error');}

		});


		$('#'+_self.sParentElement+' #sHotelCountry').change( function() {
			var sCityOption = new Array();
			_self.sCountry = $(this).val();

			sCityOption.push('<option class="content" value="" ></option>');
			for(var i in _self.sCountryCityOptions[_self.sCountry]) {
				sCityOption.push('<option class="content" value="'+i+'" >'+i+'</option>');
			}
			$("#"+_self.sParentElement+" #sHotelCity").html('').append(sCityOption.join(''));
		});

		$('#'+_self.sParentElement+' #sHotelCity').change( function() {
			var iHotelCity = $(this).val();
			//alert('Change: '+iHotelCity);
			$("#"+_self.sParentElement+" .search_input").val(iHotelCity+', '+_self.sCountry);
		});
	}
};

