﻿
if(Monarch==null||typeof(Monarch)!="object")
var Monarch={};if(Monarch.Global==null||typeof(Monarch.Global)!="object")
Monarch.Global={};if(Monarch.Global.Search==null||typeof(Monarch.Global.Search)!="object")
Monarch.Global.Search={};Monarch.Global.Search.Flights={RegExs:{AnyStationCode:"^C?\\w{3}$",ValidStationCode:"^\\w{3}$"}}
Monarch.Global.Search.Flights.Fastbook=function(stationWrapper,elementIds,settings,callbacks,validationOptions,datepickerOptions,localisation){this.AddDestinations=function(markets,selectedValue,sel){if(!sel)sel=this.Controls.Destination;if(this.CheckControl(sel)&&markets.length>0){for(var i=0,iL=markets.length;i<iL;i++){var market=markets[i];var isCharterOnly=market.bookingPaths.avro&&!market.bookingPaths.skysales;if(this.Settings.includeAvro||!isCharterOnly){var dStation=this.StationsWrapper.Stations[market.code];if(dStation&&dStation.validDestination){var test=sel.addOption(dStation.code,dStation.name,false);}}}
if(typeof selectedValue==="string"){if(sel.find("option[value="+selectedValue+"]").length){sel.val(selectedValue);}
else{selectedValue=0;}}
if(typeof selectedValue==="number"){sel.find("option:eq("+selectedValue+")").attr("selected","selected");}}};this.ApplyObject=function(context,object){if((object!=null&&typeof object==="object")&&(context!=null&&typeof context==="object")){var key;for(key in object){if(context.hasOwnProperty(key)){context[key]=object[key];}}}};this.AvailabilityCache={BuildKey:function(date,originCode,destinationCode){return date.toString("yyyyMM")+originCode+destinationCode;},Cache:{}};this.AvailabilityUrlFormat="",this.AvailabilityRequest=function(start,inst){var isOb=inst.id==this.Controls.OutboundDate.attr("id");if(isOb){var origin=this.Controls.Origin;var destination=this.Controls.Destination;}else{var origin=this.Controls.Destination;var destination=this.Controls.Origin;}
if(origin[0].selectedIndex>0&&destination[0].selectedIndex>0){var dateStart=start.clone();var dateEnd=start.clone().addMonths(1).moveToLastDayOfMonth();var originCode=origin.val().toLowerCase();var destinationCode=destination.val().toLowerCase()
var cacheKey_1=this.AvailabilityCache.BuildKey(dateStart,originCode,destinationCode);var cacheKey_2=this.AvailabilityCache.BuildKey(dateEnd,originCode,destinationCode)
var cacheResource_1=this.AvailabilityCache.Cache[cacheKey_1];var cacheResource_2=this.AvailabilityCache.Cache[cacheKey_2];var ajaxRequired=false;var returnResource=[];if(cacheResource_1&&cacheResource_1.length>0){returnResource=returnResource.concat(cacheResource_1);dateStart=dateEnd.clone().moveToFirstDayOfMonth();}else{ajaxRequired=true;}
if(cacheResource_2&&cacheResource_2.length>0){returnResource=returnResource.concat(cacheResource_2);dateEnd=dateStart.clone().moveToLastDayOfMonth();}else{ajaxRequired=true;}
if(ajaxRequired){var url=this.QueryAvailabilityUrlFormat;url=url.replace("{0}",dateStart.toString("dd"));url=url.replace("{1}",dateStart.toString("MM"));url=url.replace("{2}",dateStart.toString("yyyy"));url=url.replace("{3}",dateEnd.toString("dd"));url=url.replace("{4}",dateEnd.toString("MM"))
url=url.replace("{5}",dateEnd.toString("yyyy"));url=url.replace("{6}",originCode);url=url.replace("{7}",destinationCode);var context=this;$.ajax({url:url,dataType:"json",async:false,success:function(data){availDates=[];$.each(data,function(i,item){if(item.date!=""){var date=item.date;var oDate=$.datepicker.parseDate("dd/mm/yy",date);var cacheKey=context.AvailabilityCache.BuildKey(oDate,originCode,destinationCode);var resource=context.AvailabilityCache.Cache[cacheKey];if(!resource){resource=context.AvailabilityCache.Cache[cacheKey]=[];}
resource.push(date);returnResource.push(date);}});}});}
return returnResource;}
return[];};this.BuildOrigins=function(){var key;var origins=this.Controls.Origin;origins.removeOption(/.*/);origins.addOption("-F-",this.Localisation.From,true);for(var key in this.StationsWrapper.DefaultOrigins){var oOrigins=this.StationsWrapper.DefaultOrigins[key];var iL=oOrigins.length;for(var i=0;i<iL;i++){var origin=oOrigins[i];var station=this.StationsWrapper.Stations[origin.code];if(this.Settings.includeAvro||!this.IsCharterStation(station.markets)){origins.addOption(origin.code,origin.name,false);if(this.Settings.useOptionGroups)origins.find("option[value="+origin.code+"]").attr("class",key);}}}
if(this.Settings.useOptionGroups){for(var key in this.StationsWrapper.DefaultOrigins){origins.find("option."+key).wrapAll($("<optgroup label=\""+this.Localisation[key]+"\" />"));}}};this.Callbacks={onDateChange:function(sDate,inst,marketIndex){return;},onDestinationChange:function(elm){return;},onInit:function(){return;},onOriginChange:function(elm){return;},onRouteChange:function(eOrigin,eDestination){return;},onSubmitClick:function(valid){return true;}};this.Controls={Destination:null,InboundDate:null,Origin:null,OutboundDate:null,Adults:null,Children:null,Infants:null,OneWay:null,Submit:null,Form:null,GetAllDateControls:function(){return $(this.OutboundDate).add(this.InboundDate.selector);},GetAllRouteControls:function(){return $(this.Origin).add(this.Destination.selector);}};this.CheckControl=function(control){return(control&&control.jquery&&control.length>0);};this.CheckControls=function(){for(var i=0;i<arguments.length;i++){var argument=arguments[i];if(typeof argument==="object"){if(!this.IsControl(argument)){var key;for(key in argument){if(typeof argument[key]==="object"&&!this.IsControl(argument[key])){this.CheckControls(argument)}else if(!this.CheckControl(argument[key])){return false;}}}else if(!this.CheckControl(argument)){return false;}}}
return true;};this.HasDatePicker=false;this.Init=function(stationWrapper,elementIds,settings,callbacks,validationOptions,datepickerOptions,localisation){var context=this;this.ApplyObject(this.Settings,settings);this.ApplyObject(this.Localisation,localisation);this.StationsWrapper=stationWrapper;this.SetControls(elementIds);this.SetControlValue("OutboundDate");this.SetControlValue("InboundDate");this.SetControlValue("Adults");this.SetControlValue("Children");this.SetControlValue("Infants");if(this.CheckControl(this.Controls.Origin)&&this.Controls.Origin[0].options.length<=1){this.BuildOrigins();this.SetControlValue("Origin");}
if(datepickerOptions){this.HasDatePicker=true;var availDates=[];this.QueryAvailabilityUrlFormat=datepickerOptions.urlFormat||"";var checkAvailability=datepickerOptions.checkAvailability||true;var datepickerDefaults={changeYear:true,changeMonth:true,clearText:'',closeText:'',currentText:'',prevText:'&laquo;',nextText:'&raquo;',dateFormat:'dd/mm/yy',firstDay:1,numberOfMonths:2,minDate:0,maxDate:'+2y',mandatory:true,showOn:'both',buttonImageOnly:true,buttonText:'view calendar',changeFirstDay:false,beforeShow:function(sDate,inst){if(checkAvailability){var date=new Date();if(sDate.value!="")date=$.datepicker.parseDate('dd/mm/yy',sDate.value);date.moveToFirstDayOfMonth();availDates=context.AvailabilityRequest(date,inst);}
if(inst&&inst.settings){var settings=FlightsStationsWrapper.Settings.Scheduled.MaxDate;if(settings){var maxDate=new Date(settings.Year,(settings.Month-1),settings.Day);if(maxDate){var currentMaxDate=inst.settings.maxDate;if(typeof(currentMaxDate)!=="object"||!currentMaxDate.getFullYear||!currentMaxDate.equals(maxDate)){inst.settings.maxDate=maxDate;}}}}
return true;},beforeShowDay:function(date){if(checkAvailability){if(availDates.length==0)return[true,""];for(i=0,iL=availDates.length;i<iL;i++){if(availDates[i]!=""){var currentDate=$.datepicker.parseDate("dd/mm/yy",availDates[i]);if(date.compareTo(currentDate)==0){return[true,"date-available"];}}}
return[false,''];}},onChangeMonthYear:function(year,month,inst){if(checkAvailability){if(typeof inst.settings.maxDate==="object"&&month==(inst.settings.maxDate.getMonth()+1)&&year==inst.settings.maxDate.getFullYear()){month--;}
var startDate=$.datepicker.parseDate("yy-m-d",year+"-"+month+"-"+1);availDates=context.AvailabilityRequest(startDate,inst);}}}
this.Controls.GetAllDateControls().each(function(index){$.extend(datepickerDefaults,{onSelect:function(sDate,inst){var jOb=context.Controls.OutboundDate;var isOb=inst.id==jOb.attr("id");var jIb=context.Controls.InboundDate;if(isOb){var outDate=$.datepicker.parseDate("dd/mm/yy",sDate);var inDate=new Date(outDate.getTime()+648000000);jIb.val($.datepicker.formatDate("dd/mm/yy",inDate));}
if(context.Validation.Validator){$(this).valid();if(isOb){jIb.valid();}}
context.Callbacks.onDateChange(sDate,inst,(index+1));}});$(this).datepicker($.extend(datepickerDefaults,datepickerOptions.control||{}));});}
this.ApplyObject(this.Callbacks,callbacks);this.Validation=new Monarch.Global.Search.Flights.Fastbook.Validation(this,validationOptions);var jsonContext=this;if(this.CheckControl(this.Controls.Submit)){this.Controls.Submit.click(function(){return jsonContext.PerformSubmitClick(this);});}
var jOrig=this.Controls.Origin;var oOrig=jOrig[0];var jDest=this.Controls.Destination;var oDest=jDest[0];var destCode=jDest.val();if(this.CheckControl(jOrig)){if(oOrig.selectedIndex>0){this.PerformChangeOrigin(settings.selectedDestination||destCode,true);}
jOrig.change(function(){jsonContext.PerformChangeOrigin(destCode,true);var oDest=jsonContext.Controls.Destination[0];if(oDest.selectedIndex>0&&oOrig.selectedIndex>0){jsonContext.PerformChangeRoute(this,oDest);}});}
this.SetControlValue("Destination");if(this.CheckControl(jDest)){if(oDest.selectedIndex>0){this.PerformChangeDestination(oDest);}
jDest.change(function(){jsonContext.PerformChangeDestination(this);var oOrigin=jsonContext.Controls.Origin[0];if(oOrigin.selectedIndex>0&&oDest.selectedIndex>0){jsonContext.PerformChangeRoute(oOrigin,this);}});}
if(oOrig&&oDest){this.ManipulateControlsFromRoute(oOrig,oDest);}
this.Callbacks.onInit();this.Initialised=true;};this.Initialised=false;this.IsControl=function(control){return(control&&control.jquery!=null);};this.IsCharterStation=function(marketArray){var i=0,iL=marketArray.length;var charterOnly=true;for(;i<iL;i++){var market=marketArray[i];if(market.bookingPaths.skysales)charterOnly=false;break;}
return charterOnly;};this.Localisation={CharterFlights:"Charter Flights",CharterFlightsOnly:"Charter Flights Only",From:"From",ScheduledFlights:"Scheduled Flights",To:"To",popularStations:"our most popular",otherStations:"all other airports"};this.ManipulateControlsFromRoute=function(eOrigin,eDestination){if(eOrigin.selectedIndex>0&&eDestination.selectedIndex>0&&this.HasDatePicker){var settings=FlightsStationsWrapper.Settings.Scheduled.MaxDate;var station=this.StationsWrapper.Stations[eDestination.value];if(station&&this.IsCharterStation(station.markets)){settings=FlightsStationsWrapper.Settings.Charter.MaxDate;}}};this.PerformChangeDestination=function(elm){this.Callbacks.onDestinationChange(elm);};this.PerformChangeOrigin=function(selectedDestination,performCallback,elm){if(elm==null){if(this.CheckControl(this.Controls.Origin)){elm=this.Controls.Origin[0];}else{return;}}
if(this.CheckControl(this.Controls.Destination)){var oStation=this.StationsWrapper.Stations[elm.value];this.Controls.Destination.removeOption(/.*/);this.Controls.Destination.addOption("-T-",this.Localisation.To,true);if(oStation){if(!selectedDestination){selectedDestination=0;}
this.AddDestinations(oStation.markets,selectedDestination);}
if(performCallback){this.Callbacks.onOriginChange(elm);}}};this.PerformChangeRoute=function(eOrigin,eDestination){this.ManipulateControlsFromRoute(eOrigin,eDestination);this.Callbacks.onRouteChange(eOrigin,eDestination);};this.PerformSubmitClick=function(elm){try{var valid=true;if(!(valid=this.Validation.Validate())){return false;}
if(this.Settings.storeSelectedValues){var key;for(key in this.Controls){if(this.Controls.hasOwnProperty(key)){var control=this.Controls[key];if(typeof(control)!=="function"){Monarch.Common.setCookie("SearchFlights"+key,control.val(),1);}}}}
return this.Callbacks.onSubmitClick(valid);}
catch(ex){var error="error";}
return false;};this.PassengerCount=null;this.SetControls=function(elementIds,oControls){if(oControls==null){oControls=this.Controls;}
if(typeof elementIds==="object"){var key;for(key in elementIds){if(oControls.hasOwnProperty(key)&&typeof elementIds[key]==="object"){this.SetControls(elementIds[key],oControls[key]);}else if(oControls.hasOwnProperty(key)){oControls[key]=$("#"+elementIds[key]);}}}};this.SetControlValue=function(controlKey,value){if(this.Controls[controlKey]){if(this.Controls[controlKey].length){if(value){this.Controls[controlKey].val(value);}else if(this.Settings.storeSelectedValues){var cookie=Monarch.Common.getCookie("SearchFlights"+controlKey);if(cookie){this.Controls[controlKey].val(cookie);}}}}};this.Settings={dateFormat:"dd/mm/yy",includeAvro:true,useOptionGroups:false,storeSelectedValues:false};this.StationsWrapper={};this.Validation=null;this.Init(stationWrapper,elementIds,settings,callbacks,validationOptions,datepickerOptions,localisation);};Monarch.Global.Search.Flights.Fastbook.prototype=Monarch.Global.Search.Flights;Monarch.Global.Search.Flights.Fastbook.Validation=function(mainContext,validation){var mainContext=mainContext;var allowDefaultRules=true;var validator=null;var initialised=false;this.validationOptions={allowDefaultRules:true,callbacks:{},persist:true,validatorOptions:{errorLabelContainer:"#search_form_errors ul",onsubmit:false,wrapper:"li"}};this.Init=function(validation){var allowValidation=true;if(typeof validation==="boolean"){allowValidation=validation;validation=null;}
$.extend(true,this.validationOptions,(validation||{}));mainContext.ApplyObject(this,this.validationOptions.callbacks);initialised=true;};this.ApplyDefaultRules=function(){var baseRules={required:true};var origin=mainContext.Controls.Origin
var destination=mainContext.Controls.Destination
var outboundDate=mainContext.Controls.OutboundDate;var inboundDate=mainContext.Controls.InboundDate;var oneWay=mainContext.Controls.OneWay;var adultCount=mainContext.Controls.Adults;var infantCount=mainContext.Controls.Infants;var checkControl=mainContext.CheckControl;this.ApplyRules(origin,$.extend({checkAnyStationOrigin:true},baseRules));this.ApplyRules(destination,$.extend({checkAnyStationDestination:true},baseRules));this.ApplyRules(outboundDate,{requiredOutboundDate:true});if(checkControl(oneWay)&&oneWay[0].checked){this.ApplyRules(inboundDate,true);}
else if(checkControl(outboundDate)){var dateRules=$.extend({requiredInboundDate:true},{inboundDateGreaterThanOutbound:{Date:outboundDate,Format:mainContext.Settings.dateFormat}});this.ApplyRules(inboundDate,dateRules);}
if(checkControl(adultCount)){this.ApplyRules(infantCount,{checkInfantCount:adultCount.val()});}};this.ApplyRules=function(control,rules){if(mainContext.CheckControl(control)){this.onApplyValidationRules(control,rules);if(typeof rules==="object"){control.rules("add",rules);}else if(typeof rules==="boolean"&&rules){control.rules("remove");}}};this.onApplyValidationRules=function(control,rules){return;};this.onValidate=function(validator,controls){return validator.form();};this.Validate=function(){if(!this.validationOptions.persist){$.data(mainContext.Controls.Form[0],'validator',null);}
validator=$(mainContext.Controls.Form[0]).validate(this.validationOptions.validatorOptions);if(typeof this.validationOptions.allowDefaultRules==="boolean"){allowDefaultRules=this.validationOptions.allowDefaultRules;}
if(allowDefaultRules){this.ApplyDefaultRules();}
return this.onValidate(validator,mainContext.Controls);};this.Init(validation);};$.validator.addMethod("dateGreaterThan",function(value,element,params){if(params!=null&&typeof params==="object"){var paramFormat=params.Format;var paramDate=(params.Date.jquery?params.Date.val():params.Date);if(paramFormat.indexOf("d")==-1){paramFormat+="dd";paramDate+="01";value+="01";}
try{var date=$.datepicker.parseDate(paramFormat,value);var dateCompare=$.datepicker.parseDate(paramFormat,paramDate);return(date&&dateCompare&&date>=dateCompare);}catch(ex){}}
return false;},$.format("The current date {0} is greater than the compared date {1}"));$.validator.addMethod("inboundDateGreaterThanOutbound",$.validator.methods.dateGreaterThan,"Your return date is before your departure");$.validator.addMethod("dateLessThan",function(value,element,params){if(params!=null&&typeof params==="object"){var paramFormat=params.Format;var paramDate=(params.Date.jquery?params.Date.val():params.Date);if(paramFormat.indexOf("d")==-1){paramFormat+="dd";paramDate+="01";value+="01";}
try{var date=$.datepicker.parseDate(paramFormat,value);var dateCompare=$.datepicker.parseDate(paramFormat,paramDate);return(date&&dateCompare&&date<=dateCompare);}catch(ex){}}
return false;},$.format("The current date {0} is less than the compared date {1}"));$.validator.addMethod("outboundDateLessThanInbound",$.validator.methods.dateLessThan,"Your departure date is after your return");$.validator.addMethod("checkInfantCount",function(value,element,params){value=value*1;params=params*1;return(value!=null&&params!=null&&value<=params);},"There must be one adult for every infant");$.validator.addMethod("checkAnyStation",function(value,element,params){return(value!=null&&new RegExp(Monarch.Global.Search.Flights.RegExs.AnyStationCode).test(value));},"Please select a valid origin/destination");$.validator.addMethod("checkAnyStationOrigin",$.validator.methods.checkAnyStation,"Please select an origin");$.validator.addMethod("checkAnyStationDestination",$.validator.methods.checkAnyStation,"Please select a destination");$.validator.addMethod("requiredOutboundDate",$.validator.methods.required,"Please enter the date you wish to depart");$.validator.addMethod("requiredInboundDate",$.validator.methods.required,"Please enter the date you wish to return");
