// Emirates Hotels & Resorts Internet Booking Engine
//
// $Id$

function stripPrePostSpaces(str){return str.replace(/(^\s+|\s+$)/g,'');}
function stripSymbols(str,symbols){var i,j,c;for(i=symbols.length-1;i>=0;i--){c=symbols.charAt(i);while((j=str.indexOf(c))>-1){str=str.substring(0,j)+str.substring(j+1);}}
return str;}
function getFieldValue(el){switch(el.nodeName){case'INPUT':case'TEXTAREA':return el.value;case'SELECT':return(el.selectedIndex>=1)?el.options[el.selectedIndex].value:'';default:return(typeof el=='string')?el:'';}}
function dateExtractor(obj,prefix){var result=new Object();if(typeof prefix!='string'){prefix='';}
result.day=(obj[prefix+'day'])?parseInt(getFieldValue(obj[prefix+'day']),10):-1;result.month=(obj[prefix+'month'])?parseInt(getFieldValue(obj[prefix+'month']),10):-1;result.year=(obj[prefix+'year'])?parseInt(getFieldValue(obj[prefix+'year']),10):-1;return result;}
var characterRanges={upper:['0041','005A'],lower:['0061','007A'],digit:['0030','0039'],cjkUnifiedIdeographs:['4E00','9FBF'],cjkUnifiedIdeographsExtensionA:['3400','4DBF'],cjkUnifiedIdeographsExtensionB:['20000','2A6DF'],cjkCompabilityIdeographs:['F900','FAFF'],cjkCompabilityIdeographsSupplement:['2F800','2FA1F'],kanbun:['3190','319F'],cjkRadicalsSupplement:['2E80','2EFF'],kangxiRadicals:['2F00','2FDF'],cjkStrokes:['31C0','31EF'],bopomofo:['3100','312F'],bopomofoExtended:['31A0','31BF'],cjkSymbolsAndPunctuation:['3000','303F'],halfwidthAndFullwidthForms:['FF00','FFEF'],verticalForms:['FE10','FE1F']};for(var i in characterRanges){characterRanges[i][0]=parseInt(characterRanges[i][0],16);characterRanges[i][1]=parseInt(characterRanges[i][1],16);}
function optionSelectedValidator(el){return(el.selectedIndex>0);}
function checkboxCheckedValidator(el){return el.checked;}
function notBlankValidator(el){return(stripPrePostSpaces(getFieldValue(el)).length>0);}
function characterRangeValidator(el){var value=stripPrePostSpaces(getFieldValue(el));var ranges=this.ranges;var min=new Array();var max=new Array();var isValid,i,j,c;if(typeof this.symbols=='string'){value=stripSymbols(value,this.symbols);}
for(i=ranges.length-1;i>=0;i--){j=ranges[i];if(typeof j=='string'){min[i]=characterRanges[j][0];max[i]=characterRanges[j][1];}
else if(j instanceof Array){min[i]=j[0];max[i]=j[1];}}
for(i=value.length-1;i>=0;i--){c=value.charCodeAt(i);isValid=false;for(j=min.length-1;j>=0;j--){if(c>=min[j]&&c<=max[j]){isValid=true;break;}}
if(!isValid){return false;}}
return true;}
function atLeastOneCharInRangeValidator(el){var value=stripPrePostSpaces(getFieldValue(el));var excludeRanges=this.excludeRanges;var excludeSymbols=this.excludeSymbols;var min=new Array();var max=new Array();var isValid,i,j,c;if(typeof this.excludeSymbols=='string'){value=stripSymbols(value,this.excludeSymbols);}
for(i=excludeRanges.length-1;i>=0;i--){j=excludeRanges[i];if(typeof j=='string'){min[i]=characterRanges[j][0];max[i]=characterRanges[j][1];}
else if(j instanceof Array){min[i]=j[0];max[i]=j[1];}}
for(i=value.length-1;i>=0;i--){c=value.charCodeAt(i);isValid=false;for(j=min.length-1;j>=0;j--){if(c<min[j]||c>max[j]){isValid=true;break;}}
if(isValid){return true;}}
return false;}
function lengthValidator(el){var len=stripPrePostSpaces(getFieldValue(el)).length;var ranges=this.ranges;var min,max,i;for(i=ranges.length-1;i>=0;i--){min=ranges[i][0];max=ranges[i][1];if(len>=min&&len<=max){return true;}}
return false;}
function confirmValidator(el){return(stripPrePostSpaces(getFieldValue(el))==stripPrePostSpaces(getFieldValue(this.field)));}
function dateValidator(el){var d,given;d=dateExtractor(this);d.month-=1;given=new Date(d.year,d.month,d.day);return(given.getDate()==d.day&&given.getMonth()==d.month&&given.getFullYear()==d.year);}
function dateInPastValidator(el){var givenDay,givenMonth,givenYear;var currentDay,currentMonth,currentYear;var deltaDay,deltaMonth,deltaYear;var given,current,d;d=dateExtractor(this);givenDay=d.day;givenMonth=d.month-1;givenYear=d.year;if(d.day==-1){givenDay=1;}
d=dateExtractor(this,'current');currentDay=d.day;currentMonth=d.month;currentYear=d.year;if(d.day==-1){currentMonth++;currentDay=0;}
deltaDay=(this.deltaDay)?this.deltaDay:0;deltaMonth=(this.deltaMonth)?this.deltaMonth:0;deltaYear=(this.deltaYear)?this.deltaYear:0;given=new Date(givenYear+deltaYear,givenMonth+deltaMonth,givenDay+deltaDay);current=new Date(currentYear,currentMonth,currentDay);return(given<current);}
function emailLocalValidator(el){return(stripPrePostSpaces(getFieldValue(el)).search(/[^\w+.-]/)==-1);}
function domainValidator(el){var labels=stripPrePostSpaces(getFieldValue(el)).replace(/\.$/,'').split('.');var i;if(labels.length<2){return false;}
for(i=labels.length-1;i>=0;i--){if(labels[i].search(/^[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?$/)==-1){return false;}}
return true;}
function emailValidator(el){var email=stripPrePostSpaces(getFieldValue(el));var atpos=email.indexOf('@');var local,domain;if(atpos>-1){local=email.substring(0,atpos);domain=email.substring(atpos+1);return(emailLocalValidator(local)&&domainValidator(domain));}
return false;}
function zeroOrOneGroupNotBlankValidator(el){var groups=this.groups;var foundGroupNotBlank=false;var group,i,j;for(i=groups.length-1;i>=0;i--){group=groups[i];for(j=group.length-1;j>=0;j--){if(stripPrePostSpaces(getFieldValue(group[j])).length>0){if(!foundGroupNotBlank){foundGroupNotBlank=true;break;}
else{return false;}}}}
return true;}
function firstNotBlankGroupActivator(el){var groups=this.groups;var activated=-1;var group,i,j;for(i=0;i<groups.length;i++){group=groups[i];for(j=group.length-1;j>=0;j--){if(stripPrePostSpaces(getFieldValue(group[j])).length>0){activated=i;break;}}
if(activated!=-1){break;}}
for(i=groups.length-1;i>=0;i--){group=groups[i];for(j=group.length-1;j>=0;j--){group[j].performValidation=(i==activated);}}
return(activated!=-1);}
function allNotBlankGroupsActivator(el){var groups=this.groups;var atLeastOneGroupActivated=false;var group,activated,i,j;for(i=groups.length-1;i>=0;i--){group=groups[i];activated=false;for(j=group.length-1;j>=0;j--){if(stripPrePostSpaces(getFieldValue(group[j])).length>0){atLeastOneGroupActivated=true;activated=true;break;}}
if(!activated){for(j=group.length-1;j>=0;j--){group[j].performValidation=false;}}}
return atLeastOneGroupActivated;}
function allOrNoneActivator(el){var fields=this.fields;var activated=false;var i;for(i=fields.length-1;i>=0;i--){if(stripPrePostSpaces(getFieldValue(fields[i])).length>0){activated=true;break;}}
for(i=fields.length-1;i>=0;i--){fields[i].performValidation=activated;}
return true;}
function firstNNotBlankOnlyActivator(el){var fields=this.fields;var numSelected=this.mapper(el);var field,value,i;for(i=0;i<fields.length;i++){field=fields[i];value=stripPrePostSpaces(getFieldValue(field));if((i<numSelected&&value.length==0)||(i>=numSelected&&value.length>0)){return false;}
field.performValidation=(i<numSelected);}
return true;}
var displayedAlert;function resetHighlights(el){var id,highlightIds,label,i;var labels=(this.labels)?this.labels:[];if(this.resetHighlightId){id=this.resetHighlightId;}
else if(this.highlightId){id=this.highlightId;}
else{id=el.id;}
switch(typeof id){case'function':highlightIds=id();break;case'string':highlightIds=[id];break;default:highlightIds=id;break;}
if(!highlightIds){return;}
for(i=highlightIds.length-1;i>=0;i--){label=labels[highlightIds[i]];if(label){label.style.color='';}}
displayedAlert=false;}
function displayAlertAndHightlightError(el){var id=(this.highlightId)?this.highlightId:el.id;var focusField=(this.focusField)?this.focusField:el;var highlightIds,label,i;var labels=(this.labels)?this.labels:[];var errorMessage=(this.errorMessage)?this.errorMessage:'';switch(typeof id){case'function':highlightIds=id();break;case'string':highlightIds=[id];break;default:highlightIds=id;break;}
if(!highlightIds){return;}
for(i=0;i<highlightIds.length;i++){label=labels[highlightIds[i]];if(label){label.style.color='red';}}
if(!displayedAlert){if(focusField.focus){focusField.focus();}
displayedAlert=true;}}
if(!window.ibe){window.ibe={};}
ibe.Booking={moduleInfo:{stepNav:{constructor:'StepNavModule'},bookingAssistant:{constructor:'BookingAssistantModule'},tabNav:{constructor:'TabNavModule',arg:'whitebox'},userCode:{constructor:'UserCodeModule'},calendar:{constructor:'CalendarModule',isPageModule:true,addUserCodeModule:true},roomType:{constructor:'RoomTypeModule',flashArg:true,isPageModule:true,addUserCodeModule:true},ratesPackages:{constructor:'RatesPackagesModule',flashArg:true,isPageModule:true,addUserCodeModule:true},guestInfo:{constructor:'GuestInformationModule',isPageModule:true},userInfo:{constructor:'UserInformationModule',isPageModule:true},reviewInfo:{constructor:'ReviewInformationModule',arg:'reviewInfoHelper',isPageModule:true},currencyConvert:{constructor:'CurrencyConvertModule'},paymentInfo:{constructor:'PaymentInformationModule',isPageModule:true},confirmationMsg:{constructor:'ConfirmationMsgModule',isPageModule:true},emailItinerary:{constructor:'EmailItineraryModule',isPageModule:true},footNote:{constructor:'FootNoteModule'}},flashDetails:{containerPrefix:'swfIBEGalleryContainer',flashPrefix:'soIBEGalleryContainer',swf:'',width:250,height:262,version:8,bgColor:'#ffffff'},mediator:null,storage:null,stateInfo:null,messenger:null,modules:null,init:function(){var me=ibe.Booking;var constants=ibe.constants;var moduleSourcePrefix=constants.moduleSourcePrefix;var moduleInfo=me.moduleInfo;var flashDetails=me.flashDetails;var omnitureEnter=ibe.Omniture.enter;var omnitureLeave=ibe.Omniture.leave;var omnitureError=ibe.Omniture.error;var scrollToBox=ibe.Misc.scrollToBox;var persistCalendar=ibe.Misc.persistCalendar;var unpersistCalendar=ibe.Misc.unpersistCalendar;var persistRatesPackages=ibe.Misc.persistRatesPackages;var unpersistRatesPackages=ibe.Misc.unpersistRatesPackages;var reqs,mediator,storage,stateInfo,messenger,modules,constructor,stem,i,m;reqs={wbe:jlib.RemoteXHR.Receiver.getRequestConstructor(constants.wbeRequester),util:jlib.RemoteXHR.Receiver.getRequestConstructor(constants.utilRequester)};ibe.WBE.init(constants.wbeWS,constants.wbeNS,function(){return new reqs.wbe();});ibe.Util.init(constants.utilWS,constants.utilNS,function(){return new reqs.util();});mediator=new jlib.hessian.Mediator(constants.lwmIframe);storage=new jlib.hessian.TextAreaSessionHashtable(constants.storageContainerId);stateInfo=new jlib.hessian.StateInformationManager();messenger=new ibe.Messenger(constants.messengerContainerId);modules={};for(i in moduleInfo){m=moduleInfo[i];constructor=m.constructor;stem=constructor.replace(/Module$/,'').toLowerCase();ibe[constructor].prototype.sourceURL=moduleSourcePrefix+stem+'.js';if(m.flashArg){m.arg=flashDetails;}
modules[i]=new ibe[constructor](i,m.arg);}
mediator.setStorage(storage);mediator.setStateInfo(stateInfo);mediator.setMessenger(messenger);mediator.setController(ibe.BookingController);for(i in modules){mediator.addModule(modules[i]);}
m=modules.userCode;for(i in moduleInfo){if(moduleInfo[i].addUserCodeModule){modules[i].setUserCodeModule(m);}}
modules.confirmationMsg.setConfirmationModule(modules.reviewInfo);i=document.getElementById(modules.calendar.containerId);if(i){ibe.Misc.scrollToBoxInit(i.parentNode.parentNode,512,207,20);ibe.Misc.calendarContainer=i;}
i=document.getElementById(modules.ratesPackages.containerId);if(i){ibe.Misc.ratesPackagesContainer=i;}
for(i in moduleInfo){if(moduleInfo[i].isPageModule){m=modules[i];jlib.contrib.Events.add(m,'enter',omnitureEnter);jlib.contrib.Events.add(m,'enter',unpersistCalendar);jlib.contrib.Events.add(m,'enter',unpersistRatesPackages);jlib.contrib.Events.add(m,'leave',omnitureLeave);jlib.contrib.Events.add(m,'leave',scrollToBox);}}
jlib.contrib.Events.add(modules.calendar,'leave',persistCalendar);jlib.contrib.Events.add(modules.ratesPackages,'leave',persistRatesPackages);jlib.contrib.Events.add(modules.ratesPackages,'rateview',ibe.Omniture.rateview);jlib.contrib.Events.add(modules.currencyConvert,'leave',ibe.Omniture.currencyConvertLeave);jlib.contrib.Events.add(ibe.WBE,'error',omnitureError);jlib.contrib.Events.add(ibe.Util,'error',omnitureError);jlib.contrib.Events.add(modules.paymentInfo,'error',omnitureError);mediator.init();me.mediator=mediator;me.storage=storage;me.stateInfo=stateInfo;me.messenger=messenger;me.modules=modules;if(window.sidebarInit){sidebarInit();}},uninit:function(){var me=ibe.Booking;var mediator=me.mediator;var modules=me.modules;var moduleInfo=me.moduleInfo;var omnitureEnter=ibe.Omniture.enter;var omnitureLeave=ibe.Omniture.leave;var omnitureError=ibe.Omniture.error;var scrollToBox=ibe.Misc.scrollToBox;var persistCalendar=ibe.Misc.persistCalendar;var unpersistCalendar=ibe.Misc.unpersistCalendar;var persistRatesPackages=ibe.Misc.persistRatesPackages;var unpersistRatesPackages=ibe.Misc.unpersistRatesPackages;var i,m;if(!mediator){return;}
mediator.uninit();for(i in moduleInfo){if(moduleInfo[i].isPageModule){m=modules[i];jlib.contrib.Events.remove(m,'enter',omnitureEnter);jlib.contrib.Events.remove(m,'enter',unpersistCalendar);jlib.contrib.Events.remove(m,'enter',unpersistRatesPackages);jlib.contrib.Events.remove(m,'leave',omnitureLeave);jlib.contrib.Events.remove(m,'leave',scrollToBox);}}
jlib.contrib.Events.remove(modules.calendar,'leave',persistCalendar);jlib.contrib.Events.remove(modules.ratesPackages,'leave',persistRatesPackages);jlib.contrib.Events.remove(modules.ratesPackages,'rateview',ibe.Omniture.rateview);jlib.contrib.Events.remove(modules.currencyConvert,'leave',ibe.Omniture.currencyConvertLeave);jlib.contrib.Events.remove(ibe.WBE,'error',omnitureError);jlib.contrib.Events.remove(ibe.Util,'error',omnitureError);jlib.contrib.Events.remove(modules.paymentInfo,'error',omnitureError);ibe.Misc.scrollToBoxUninit();ibe.Misc.calendarContainer=null;for(i in moduleInfo){if(moduleInfo[i].addUserCodeModule){modules[i].setUserCodeModule(null);}}
for(i in modules){mediator.removeModule(modules[i]);}
mediator.setController(null);mediator.setMessenger(null);mediator.setStateInfo(null);mediator.setStorage(null);ibe.WBE.uninit();ibe.Util.uninit();me.mediator=null;me.storage=null;me.stateInfo=null;me.messenger=null;me.modules=null;}};if(!window.ibe){window.ibe={};}
ibe.BookingController={STEP_UNINITIALIZED:1,STEP_CHECK_IN:2,STEP_CHECK_OUT:3,STEP_DATE_CONFIRM:4,STEP_ROOM_TYPE:5,STEP_RATE_CODE:6,STEP_RATE_START:7,STEP_GUEST_INFO:8,STEP_USER_INFO:9,STEP_REVIEW_INFO:10,STEP_PAYMENT_INFO:11,STEP_CONFIRMATION:12,STEP_EMAIL_ITINERARY:13,STEP_EMAIL_ITINERARY_CONFIRM:14,MAX_NUM_ROOMS:5,MAX_LENGTH_OF_STAY:29,MIN_NUM_DAYS_FROM_TODAY:0,MAX_NUM_EMAIL_ITINERARY:5,HOTEL:'',INITIAL_PREFERRED_CURRENCY:'AED',preferredCurrency:'',mediator:null,stateInfo:null,jobId:1,pendingJob:null,currentJob:null,cachedData:null,pendingReservationVersion:null,pendingReservationNumber:null,pendingReservationEmail:null,initListener:function(e){var me=ibe.BookingController;var stateInfo;me.preferredCurrency=me.INITIAL_PREFERRED_CURRENCY;if(me.mediator){stateInfo=me.mediator.getStateInfo();}
if(!stateInfo){}
me.stateInfo=stateInfo;me.doChange(e);},uninitListener:function(e){var me=ibe.BookingController;var resVer=me.pendingReservationVersion;var resNum=me.pendingReservationNumber;var resEmail=me.pendingReservationEmail;if(resVer!=null&&resNum&&resEmail){ibe.WBE.cancelReservation(resVer,resNum,ibe.WBE.TEMPORARY_RESERVATION_CANCELLATION_REASON,resEmail,function(){});me.pendingReservationVersion=null;me.pendingReservationNumber=null;me.pendingReservationEmail=null;}
me.preferredCurrency='';me.stateInfo=null;},changeListener:function(e){var me=ibe.BookingController;me.doChange(e);},doChange:function(e){var currentJob=this.currentJob;var state=e.state.toString();var prevState=e.prevState;var info=e.info;var cachedData;var job={id:'j'+ibe.BookingController.jobId++,incomingState:state,prevState:prevState,changeInfo:info,newCurrentRoom:null,newErrorMessage:null};if(e.isExpected){this.cachedData={incomingState:state,prevState:prevState,changeInfo:info};job.clearCachedData=true;}else{cachedData=this.cachedData;if(cachedData&&state==cachedData.incomingState&&!prevState&&!info){job.prevState=cachedData.prevState;job.changeInfo=cachedData.changeInfo;job.clearCachedData=true;}}
this.pendingJob=job;if(!currentJob){this.startProcessing();}else{currentJob.isCancelled=true;}},startProcessing:function(){var me=this;var job=this.pendingJob;if(!job){return;}
this.currentJob=job;this.pendingJob=null;this.mediator.alert(this,jlib.hessian.Mediator.MESSAGE_LOADING);setTimeout(function(){me.checkForExistingState(job);},0);},checkForExistingState:function(job){var stateInfo=this.stateInfo;var incomingState=job.incomingState;var prevState=job.prevState;var state=stateInfo.findState(incomingState);var dupInfo=this.dupInfo;var info,rooms,curRoom,stateLen,roomsLen,len,i;if(job.isCancelled){this.startProcessing();return;}
if(!state){state=ibe.BookingState.parse(incomingState);info={currentRoom:0};if(prevState){prevState=ibe.BookingState.parse(prevState);dupInfo(stateInfo.exportPersistent(prevState),info);}
dupInfo(job.changeInfo,info);if(!info.version){info.version=ibe.WBE.getNewVersion();}
rooms=info.rooms;curRoom=info.currentRoom;stateLen=state.getNumRooms();roomsLen=rooms.length;len=Math.max(Math.max(stateLen,roomsLen),1);for(i=0;i<len;i++){if(!rooms[i]){rooms[i]={};}}
if(!info.user){info.user={};}
rooms[curRoom].errorMessage=null;rooms[curRoom].isErrorHighlighted=null;rooms[curRoom].copyRoom=null;rooms[curRoom].copyState=null;if(info.doRemoveAllRooms){job.doRemoveAllRooms=true;rooms.length=1;rooms[0]={};info.currentRoom=0;}else if(info.doRemoveRoom){job.doRemoveRoom=true;if(curRoom>=stateLen&&job.newCurrentRoom==null){job.newCurrentRoom=stateLen-1;}}else if(info.doAddRoom){job.doAddRoom=true;job.addedRoom=len-1;if(job.newCurrentRoom==null){job.newCurrentRoom=job.addedRoom;}}
info.doAddRoom=false;info.doRemoveRoom=false;info.doRemoveAllRooms=false;job.state=state;job.info=info;job.isNewState=true;this.validateState(job);}else{job.state=ibe.BookingState.parse(state);job.info=stateInfo.exportPersistent(state);job.isNewState=false;this.checkPendingReservationExisting(job);}},validateState:function(job){var index=Function.getHiddenArgument(arguments,0);var result=Function.getHiddenArgument(arguments,1);var state=job.state;var info=job.info;var rooms=info.rooms;var len=state.getNumRooms();var USER_CODE=ibe.BookingState.USER_CODE;var USER_CODE_TYPE=ibe.BookingState.USER_CODE_TYPE;var HOTEL_ID=ibe.BookingState.HOTEL_ID;var ARRIVAL_DATE=ibe.BookingState.ARRIVAL_DATE;var DEPARTURE_DATE=ibe.BookingState.DEPARTURE_DATE;var ROOM_TYPE=ibe.BookingState.ROOM_TYPE;var RATE_OCCUPANCY=ibe.BookingState.RATE_OCCUPANCY;var RATE_CODE=ibe.BookingState.RATE_CODE;var RATE_START_DATE=ibe.BookingState.RATE_START_DATE;var MAX_NUM_ROOMS=ibe.BookingController.MAX_NUM_ROOMS;var HOTEL=ibe.BookingController.HOTEL;var INDEPENDENT_RATE_OCCUPANCY=ibe.WBE.INDEPENDENT_RATE_OCCUPANCY;var BAR_RATE_CODE=ibe.WBE.BAR_RATE_CODE;var userCode,userCodeType,hotel,arr,dep,room,rateOcc,rateCode,rateStart;var a,msg,url,roomi,ratesOccDependent,minOcc,maxOcc,i;if(job.isCancelled){this.startProcessing();return;}
userCode=state.get(null,USER_CODE);userCodeType=state.get(null,USER_CODE_TYPE);if(index==null){if(len==0){state.set(0,HOTEL_ID,HOTEL);len=1;if(!rooms[0]){rooms[0]={};}}else if(len>MAX_NUM_ROOMS){for(i=len-1;i>=MAX_NUM_ROOMS;i--){state.remove(i);}
len=MAX_NUM_ROOMS;}
if((userCode&&!userCodeType)||(!userCode&&userCodeType)){state.set(null,USER_CODE,null);state.set(null,USER_CODE_TYPE,null);userCode=null;userCodeType=null;}
if(userCode&&userCodeType){this.checkUserCode(job);return;}
index=0;result={};}
if(index==-1){if(!result){if(job.newErrorMessage==null){job.newErrorMessage=ibe.Error.getErrorMessage(ibe.Error.CODE_WBE_INVALID_USER_CODE);}
state.set(null,USER_CODE,null);state.set(null,USER_CODE_TYPE,null);userCode=null;userCodeType=null;}
index=0;result={};}
for(i=index;i<len;i++){hotel=state.get(i,HOTEL_ID);arr=state.get(i,ARRIVAL_DATE);dep=state.get(i,DEPARTURE_DATE);room=state.get(i,ROOM_TYPE);rateOcc=state.get(i,RATE_OCCUPANCY);rateCode=state.get(i,RATE_CODE);rateStart=state.get(i,RATE_START_DATE);roomi='room'+i;ratesOccDependent=job[roomi+'ratesOccupancyDependent'];minOcc=job[roomi+'minOccupancy'];maxOcc=job[roomi+'maxOccupancy'];if(hotel!=HOTEL){state.set(i,HOTEL_ID,HOTEL);hotel=HOTEL;}
if(job.longTermUrl==null){this.getLongTermUrl(job,i,result);return;}
if(arr){if(typeof result.arrival=='undefined'){this.checkDate(job,i,result,'arrival');return;}else if(!result.arrival){state.set(i,ARRIVAL_DATE,null);arr=null;}}
if(job.currentDate==null){this.getCurrentDate(job,i,result);return;}
if(arr&&ibe.BookingController.MIN_NUM_DAYS_FROM_TODAY>0){a=new Date(job.currentDate);a.addDate(ibe.BookingController.MIN_NUM_DAYS_FROM_TODAY);if(arr<a){if(job.newCurrentRoom==null){job.newCurrentRoom=i;}
if(rooms[i].errorMessage==null){rooms[i].errorMessage=ibe.Error.getErrorMessage(ibe.Error.CODE_WBE_ARRIVAL_TOO_CLOSE);}
state.set(i,ARRIVAL_DATE,null);arr=null;}}
if(dep){if(typeof result.departure=='undefined'){if(arr){this.checkDateRange(job,i,result);}else{this.checkDate(job,i,result,'departure');}
return;}else if(!result.departure){state.set(i,DEPARTURE_DATE,null);dep=null;}}
if(arr&&dep&&ibe.BookingController.MAX_LENGTH_OF_STAY>0){a=new Date(arr);a.addDate(ibe.BookingController.MAX_LENGTH_OF_STAY);if(dep>a){msg=ibe.Error.getErrorMessage(ibe.Error.CODE_WBE_DATE_RANGE_TOO_LONG);if(job.longTermUrl){url=job.longTermUrl;url+=((url.indexOf('?')==-1)?'?':'&')+'in='+arr.toISODateString()+'&out='+
dep.toISODateString();msg=msg.replace(/%s/g,url);}
if(job.newCurrentRoom==null){job.newCurrentRoom=i;}
if(rooms[i].errorMessage==null){rooms[i].errorMessage=msg;}
state.set(i,DEPARTURE_DATE,null);dep=null;}}
if(room!=null){if(typeof result.room=='undefined'){this.checkRoomType(job,i,result);return;}else if(!result.room){state.set(i,ROOM_TYPE,null);room=null;}}
if(rateOcc!=null&&rateOcc<INDEPENDENT_RATE_OCCUPANCY){state.set(i,RATE_OCCUPANCY,null);rateOcc=null;}
if(rateCode!=null){if(typeof result.rateCode=='undefined'){this.checkRateCode(job,i,result);return;}else if(!result.rateCode){state.set(i,RATE_CODE,null);rateCode=null;}}
if(rateStart){if(typeof result.rateStart=='undefined'){this.checkDate(job,i,result,'rateStart');return;}else if(!result.rateStart){state.set(i,RATE_START_DATE,null);rateStart=null;}}
if(arr&&rateStart&&rateStart<arr){state.set(i,RATE_START_DATE,null);rateStart=null;}
if(dep&&rateStart&&rateStart>=dep){state.set(i,RATE_START_DATE,null);rateStart=null;}
if(arr){if(typeof result.checkIn=='undefined'){this.checkCheckInDate(job,i,result);return;}else if(!result.checkIn){if(rateCode!=null){state.set(i,RATE_CODE,null);rateCode=null;delete result.checkIn;this.checkCheckInDate(job,i,result);return;}else if(room!=null){state.set(i,ROOM_TYPE,null);room=null;delete result.checkIn;this.checkCheckInDate(job,i,result);return;}else{state.set(i,ARRIVAL_DATE,null);arr=null;}}}
if(arr&&dep){if(typeof result.checkOut=='undefined'){this.checkCheckOutDate(job,i,result);return;}else if(!result.checkOut){if(rateCode!=null){state.set(i,RATE_CODE,null);rateCode=null;delete result.checkOut;this.checkCheckOutDate(job,i,result);return;}else if(room!=null){state.set(i,ROOM_TYPE,null);room=null;delete result.checkOut;this.checkCheckOutDate(job,i,result);return;}else{if(job.newCurrentRoom==null){job.newCurrentRoom=i;}
if(rooms[i].errorMessage==null){rooms[i].errorMessage=ibe.Error.getErrorMessage(ibe.Error.CODE_IBE_DATE_RANGE_NOT_AVAILABLE);}
state.set(i,DEPARTURE_DATE,null);dep=null;}}}
if(arr&&dep&&room!=null){if(typeof result.roomAvailable=='undefined'){this.checkRoomAvailable(job,i,result);return;}else if(!result.roomAvailable){if(rateCode!=null){state.set(i,RATE_CODE,null);rateCode=null;delete result.roomAvailable;this.checkRoomAvailable(job,i,result);return;}else{state.set(i,ROOM_TYPE,null);room=null;}}}
if(room!=null&&ratesOccDependent==null){this.getRoomOccupancy(job,i,result);return;}
if(room!=null&&rateOcc!=null){if(!ratesOccDependent){if(rateOcc!=INDEPENDENT_RATE_OCCUPANCY){state.set(i,RATE_OCCUPANCY,null);rateOcc=null;}}else{if(rateOcc==ibe.WBE.INDEPENDENT_RATE_OCCUPANCY&&rooms[i].isGuestComplete){a=parseInt(rooms[i].numGuests,10);if(a>=minOcc&&a<=maxOcc){state.set(i,RATE_OCCUPANCY,a);rateOcc=a;}}
if(rateOcc<minOcc||rateOcc>maxOcc){if(job.newCurrentRoom==null){job.newCurrentRoom=i;}
if(rooms[i].errorMessage==null){rooms[i].errorMessage=ibe.Error.getErrorMessage(ibe.Error.CODE_IBE_ROOM_RATE_OCCUPANCY_MISMATCH);}
state.set(i,RATE_OCCUPANCY,null);rateOcc=null;state.set(i,RATE_START_DATE,null);rateStart=null;}}}
if(arr&&dep&&room!=null&&rateOcc==null){if(!ratesOccDependent){a=INDEPENDENT_RATE_OCCUPANCY;}else if(rooms[i].isGuestComplete){a=parseInt(rooms[i].numGuests,10);if(a<minOcc||a>maxOcc){a=maxOcc;}}else{a=maxOcc;}
state.set(i,RATE_OCCUPANCY,a);rateOcc=a;}
if(arr&&dep&&room!=null&&rateOcc!=null&&rateCode!=null){if(typeof result.rateAvailable=='undefined'){this.checkRateAvailable(job,i,result);return;}else if(!result.rateAvailable){state.set(i,RATE_CODE,null);rateCode=null;}}
if(arr&&dep&&room!=null&&rateCode==null){state.set(i,RATE_CODE,BAR_RATE_CODE);rateCode=BAR_RATE_CODE;}
if(arr&&dep&&room!=null&&rateOcc!=null&&rateCode!=null&&rateStart){if(typeof result.rateStartValid=='undefined'){this.checkRateStartValid(job,i,result);return;}else if(!result.rateStartValid){state.set(i,RATE_START_DATE,null);rateStart=null;}}
result={};}
if(this.stateInfo.hasState(state)){state=this.generateNewState(state);job.state=state;}
this.validateInfo(job);},validateInfo:function(job){var me=this;var roomInfo=Function.getHiddenArgument(arguments,0);var state=job.state;var info=job.info;var rooms=info.rooms;var len=state.getNumRooms();var HOTEL_ID=ibe.BookingState.HOTEL_ID;var ROOM_TYPE=ibe.BookingState.ROOM_TYPE;var RATE_OCCUPANCY=ibe.BookingState.RATE_OCCUPANCY;var RATE_START_DATE=ibe.BookingState.RATE_START_DATE;var version,reqs,hotel,room,rateOcc,rateStart,numGuests,numChildren,num,min,max,numGuestsAdjusted,code,clearNum,ri,r,i;if(job.isCancelled){this.startProcessing();return;}
if(!roomInfo){version=info.version;reqs=new jlib.OrderedObject();for(i=0;i<len;i++){hotel=state.get(i,HOTEL_ID);if(reqs.getValue('roomTypes'+hotel)||state.get(i,ROOM_TYPE)==null||!rooms[i].isGuestComplete){continue;}
reqs.push('roomTypes'+hotel,{method:'getRoomTypes',arguments:[version,hotel,null,null,true],callbackPos:2});}
return ibe.Error.askOnError(this,ibe.WBE,'doMultiple',function(responses){return(job.isCancelled)?null:responses;},reqs,null,function(responses){me.validateInfo(job,responses);});}
for(i=0;i<len;i++){hotel=state.get(i,HOTEL_ID);room=state.get(i,ROOM_TYPE);rateOcc=state.get(i,RATE_OCCUPANCY);rateStart=state.get(i,RATE_START_DATE);r=rooms[i];if(!room||!rateStart||!r.isGuestComplete){continue;}
numGuests=parseInt(r.numGuests,10);numChildren=parseInt(r.numChildren,10);ri=roomInfo.getValue('roomTypes'+hotel).getValue(room);min=ri.minOccupancy;max=ri.maxOccupancy;numGuestsAdjusted=false;code=null;clearNum=false;if(rateOcc!=null&&job['room'+i+'ratesOccupancyDependent']&&rateOcc!=numGuests){r.numGuests=rateOcc.toString();numGuests=rateOcc;numGuestsAdjusted=true;code=ibe.Error.CODE_IBE_NUMBER_OF_GUESTS_ADJUSTED_AFTER_RATE_OCCUPANCY_CHANGE;}
num=numGuests+numChildren;if(num<min){code=(!numGuestsAdjusted)?ibe.Error.CODE_IBE_NUMBER_OF_GUESTS_TOO_SMALL:ibe.Error.CODE_IBE_NUMBER_OF_GUESTS_INVALID_AFTER_RATE_OCCUPANCY_CHANGE;clearNum=true;}else if(num>max){code=(!numGuestsAdjusted)?ibe.Error.CODE_IBE_NUMBER_OF_GUESTS_TOO_LARGE:ibe.Error.CODE_IBE_NUMBER_OF_GUESTS_INVALID_AFTER_RATE_OCCUPANCY_CHANGE;clearNum=true;}
if(code){if(job.newCurrentRoom==null){job.newCurrentRoom=i;}
if(r.errorMessage==null){r.errorMessage=ibe.Error.getErrorMessage(code);}}
if(clearNum){if(!numGuestsAdjusted){r.numGuests=null;}
r.numChildren=null;r.isGuestComplete=false;}}
if(job.doRemoveAllRooms){info.userRoom=null;info.isUserComplete=false;info.isPaymentComplete=false;}else if(job.doRemoveRoom){if(info.isUserComplete&&info.userRoom==info.currentRoom){info.userRoom=null;info.isUserComplete=null;if(job.newErrorMessage==null){job.newErrorMessage=ibe.Error.getErrorMessage(ibe.Error.CODE_IBE_REMOVED_USER_ROOM);}}}
if(info.doErrorMessage&&job.newErrorMessage==null){job.newErrorMessage=info.doErrorMessage;}
info.doErrorMessage=null;if(info.isPendingRes&&this.pendingReservationVersion==null&&!this.pendingReservationNumber&&!this.pendingReservationEmail&&info.resVer!=null&&info.resNum&&info.resEmail){this.pendingReservationVersion=info.resVer;this.pendingReservationNumber=info.resNum;this.pendingReservationEmail=info.resEmail;info.isPendingRes=false;}
this.calculateNextStep(job);},calculateNextStep:function(job){var state=job.state;var info=job.info;var rooms=info.rooms;var curRoom=info.currentRoom;var len=state.getNumRooms();var actualSteps=[];var steps=[];var isChosenSteps=[];var ARRIVAL_DATE=ibe.BookingState.ARRIVAL_DATE;var DEPARTURE_DATE=ibe.BookingState.DEPARTURE_DATE;var DATE_CONFIRM=ibe.BookingState.DATE_CONFIRM;var ROOM_TYPE=ibe.BookingState.ROOM_TYPE;var RATE_CODE=ibe.BookingState.RATE_CODE;var RATE_START_DATE=ibe.BookingState.RATE_START_DATE;var STEP_CHECK_IN=ibe.BookingController.STEP_CHECK_IN;var STEP_CHECK_OUT=ibe.BookingController.STEP_CHECK_OUT;var STEP_DATE_CONFIRM=ibe.BookingController.STEP_DATE_CONFIRM;var STEP_ROOM_TYPE=ibe.BookingController.STEP_ROOM_TYPE;var STEP_RATE_CODE=ibe.BookingController.STEP_RATE_CODE;var STEP_RATE_START=ibe.BookingController.STEP_RATE_START;var STEP_GUEST_INFO=ibe.BookingController.STEP_GUEST_INFO;var STEP_USER_INFO=ibe.BookingController.STEP_USER_INFO;var STEP_REVIEW_INFO=ibe.BookingController.STEP_REVIEW_INFO;var STEP_PAYMENT_INFO=ibe.BookingController.STEP_PAYMENT_INFO;var STEP_CONFIRMATION=ibe.BookingController.STEP_CONFIRMATION;var STEP_EMAIL_ITINERARY=ibe.BookingController.STEP_EMAIL_ITINERARY;var STEP_EMAIL_ITINERARY_CONFIRM=ibe.BookingController.STEP_EMAIL_ITINERARY_CONFIRM;var BAR_RATE_CODE=ibe.WBE.BAR_RATE_CODE;var oneUserInfo,onePaymentInfo,allUserInfo,allPaymentInfo,noChosenSteps;var needToSwitchRoom,newCurRoom,newCurRoomStep,r,s,i;for(i=0;i<len;i++){r=rooms[i];if(!state.get(i,ARRIVAL_DATE)){s=STEP_CHECK_IN;}else if(!state.get(i,DEPARTURE_DATE)){s=STEP_CHECK_OUT;}else if(!state.get(i,DATE_CONFIRM)){s=STEP_DATE_CONFIRM;}else if(state.get(i,ROOM_TYPE)==null){s=STEP_ROOM_TYPE;}else if(!state.get(i,RATE_START_DATE)){s=(state.get(i,RATE_CODE)==BAR_RATE_CODE)?STEP_RATE_CODE:STEP_RATE_START;}else if(!r.isGuestComplete){s=STEP_GUEST_INFO;}else if(!info.isUserComplete){s=STEP_USER_INFO;}else if(!r.isReviewComplete){s=STEP_REVIEW_INFO;}else if(!info.isPaymentComplete){s=STEP_PAYMENT_INFO;}else if(!info.doEmailItinerary){s=STEP_CONFIRMATION;}else if(!info.isEmailItineraryComplete){s=STEP_EMAIL_ITINERARY;}else{s=STEP_EMAIL_ITINERARY_CONFIRM;}
actualSteps.push(s);steps.push(s);isChosenSteps.push(!!r.isChosenStep);}
for(i=0;i<len;i++){s=rooms[i].step;if(i==curRoom){continue;}
if(isChosenSteps[i]&&s<=actualSteps[i]){steps[i]=s;}else{isChosenSteps[i]=false;}}
if(!job.doAddRoom&&!job.doRemoveRoom){s=info.doStep;if(s&&s<=actualSteps[curRoom]){steps[curRoom]=s;isChosenSteps[curRoom]=true;}else{isChosenSteps[curRoom]=false;}}else{steps[curRoom]=rooms[curRoom].step;}
oneUserInfo=false;onePaymentInfo=false;allUserInfo=true;allPaymentInfo=true;for(i=0;i<len;i++){s=actualSteps[i];if(s==STEP_USER_INFO){oneUserInfo=true;}else{allUserInfo=false;}
if(s==STEP_PAYMENT_INFO){onePaymentInfo=true;}else{allPaymentInfo=false;}
if(oneUserInfo&&onePaymentInfo&&!allUserInfo&&!allPaymentInfo){break;}}
noChosenSteps=(isChosenSteps.indexOf(true)==-1);if(!((allUserInfo||allPaymentInfo)&&noChosenSteps)&&(oneUserInfo||onePaymentInfo)){s=steps[curRoom];needToSwitchRoom=(s==STEP_USER_INFO||s==STEP_PAYMENT_INFO);for(i=0;i<len;i++){s=steps[i];if(s==STEP_USER_INFO){steps[i]=STEP_GUEST_INFO;isChosenSteps[i]=false;}else if(s==STEP_PAYMENT_INFO){steps[i]=STEP_REVIEW_INFO;isChosenSteps[i]=false;}else if(needToSwitchRoom&&newCurRoom==null){newCurRoom=i;newCurRoomStep=s;}}}
if(newCurRoom!=null){if(job.newCurrentRoom==null){job.newCurrentRoom=newCurRoom;}
if(job.newErrorMessage==null){job.newErrorMessage=ibe.Error.getErrorMessage((newCurRoomStep==STEP_GUEST_INFO)?ibe.Error.CODE_IBE_INCOMPLETE_ROOM_GUEST_INFO:ibe.Error.CODE_IBE_INCOMPLETE_ROOM);}}
for(i=0;i<len;i++){r=rooms[i];s=steps[i];r.step=s;r.actualStep=actualSteps[i];r.isChosenStep=isChosenSteps[i];r['seenStep'+s]=true;}
info.doStep=null;this.checkPendingReservationNew(job);},checkPendingReservationNew:function(job){var me=this;var info=job.info;var resVer=this.pendingReservationVersion;var resNum=this.pendingReservationNumber;var resEmail=this.pendingReservationEmail;if(resVer==null||!resNum||!resEmail){this.cacheInformation(job);return;}
if(info.rooms[0].step==ibe.BookingController.STEP_CONFIRMATION&&info.resVer==resVer&&info.resNum==resNum&&info.resEmail==resEmail){ibe.Error.askOnError(this,ibe.WBE,'confirmReservation',function(confirmres){if(!(confirmres instanceof ibe.Error)&&!confirmres.isConfirmed){confirmres=new ibe.Error(ibe.Error.CODE_WBE_UNKNOWN);}
return confirmres;},resVer,resNum,info.secureCode,function(confirmres){me.pendingReservationVersion=null;me.pendingReservationNumber=null;me.pendingReservationEmail=null;me.sendConfirmationEmail(job);});}else{ibe.Error.askOnError(this,ibe.WBE,'cancelReservation',function(cancelres){if(cancelres instanceof ibe.Error&&(cancelres.code==ibe.Error.CODE_WBE_RESERVATION_ALREADY_CANCELLED||cancelres.code==ibe.Error.CODE_WBE_CANNOT_CANCEL)){cancelres=true;}
return cancelres;},resVer,resNum,ibe.WBE.TEMPORARY_RESERVATION_CANCELLATION_REASON,resEmail,function(cancelres){me.pendingReservationVersion=null;me.pendingReservationNumber=null;me.pendingReservationEmail=null;me.cacheInformation(job);});}},sendConfirmationEmail:function(job){var me=this;var data=Function.getHiddenArgument(arguments,0);var stateInfo=this.stateInfo;var prevState=job.prevState;var state=job.state;var info=job.info;var rooms=info.rooms;var version=info.version;var len=state.getNumRooms();var roomDetails=[];var hasAnyAirportTransfer=false;var hasAnyLandTransfer=false;var hasAllPickUp=true;var HOTEL_ID=ibe.BookingState.HOTEL_ID;var ARRIVAL_DATE=ibe.BookingState.ARRIVAL_DATE;var DEPARTURE_DATE=ibe.BookingState.DEPARTURE_DATE;var ROOM_TYPE=ibe.BookingState.ROOM_TYPE;var BABY_COT_CRIB_ID=ibe.WBE.BABY_COT_CRIB_ID;var details,numExtraBeds,hotelInfo,roomInfo,rateData,suiteNumber,airports,preferences,prefs;var reqs,hotel,r,p,i;if(!data){reqs=new jlib.OrderedObject();for(i=0;i<len;i++){r=rooms[i];hotel=state.get(i,HOTEL_ID);if(r.airportTransfer&&(r.airportPickUp||r.airportDropOff)&&!reqs.getValue('airports'+hotel)){reqs.push('airports'+hotel,{method:'getAirports',arguments:[version,hotel]});}
if(r.preferences&&!reqs.getValue('preferences'+hotel)){reqs.push('preferences'+hotel,{method:'getPreferences',arguments:[version,hotel]});}}
if(reqs.length>0){return ibe.Error.askOnError(this,ibe.WBE,'doMultiple',null,reqs,null,function(responses){me.sendConfirmationEmail(job,responses);});}else{data=new jlib.OrderedObject();}}
for(i=0;i<len;i++){r=rooms[i];hotel=state.get(i,HOTEL_ID);numExtraBeds=r.numExtraBeds;hotelInfo=stateInfo.getSession(prevState,r.hotelCacheKey);roomInfo=stateInfo.getSession(prevState,r.roomCacheKey);rateData=stateInfo.getSession(prevState,r.rateKey);suiteNumber=this.getSuiteName(i);airports=data.getValue('airports'+hotel);preferences=data.getValue('preferences'+hotel);prefs=(r.preferences||'').split(',');p=[];if(preferences){preferences.filter(function(a){return(a[0]!=BABY_COT_CRIB_ID);}).forEach(function(a){if(prefs.indexOf(a[0])>-1){p.push(a[1].text);}});}
if(r.airportTransfer&&(r.airportPickUp||r.airportDropOff)){hasAnyAirportTransfer=true;}
if(r.landTransfer&&(r.landPickUp||r.landDropOff)){hasAnyLandTransfer=true;}
if(!(r.airportTransfer&&r.airportPickUp)&&!(r.landTransfer&&r.landPickUp)){hasAllPickUp=false;}
details={email:r.email,suiteNumber:suiteNumber,salutation:r.titleValue,lastName:r.lastName,firstName:r.firstName,skywardsNum:(r.skywardsNum!='')?r.skywardsNum:_('None'),checkIn:jlib.Locale.getLocaleDate(state.get(i,ARRIVAL_DATE)),checkOut:jlib.Locale.getLocaleDate(state.get(i,DEPARTURE_DATE)),roomType:roomInfo.name,rateCode:((rateData.isWithBAR)?rateData.barName+'<br />':'')+
rateData.name,numGuests:r.numGuests,showNumGuestsOnly:hotelInfo.showNumGuestsOnly,numChildren:r.numChildren,numInfants:r.numInfants,numExtraBeds:numExtraBeds,extraBedMessage:(numExtraBeds==roomInfo.maxExtraBeds)?roomInfo.maxExtraBedsMessage:'',airportPickUpDate:'',airportPickUpAirport:'',airportPickUpFlightNo:'',airportPickUpLocation:'',airportDropOffDate:'',airportDropOffAirport:'',airportDropOffFlightNo:'',airportDropOffLocation:'',landPickUpDate:'',landPickUpLocation:'',landDropOffDate:'',landDropOffLocation:'',hotelArrivalDate:'',showAirportTransferLocation:hotelInfo.showAirportTransferLocation,showLandTransfer:hotelInfo.showLandTransfer,showHotelArrival:hotelInfo.showHotelArrival,dietaryRequirements:(r.dietaryRequirements!='')?r.dietaryRequirements:_('None'),showDietaryRequirements:hotelInfo.showDietaryRequirements,preferences:(p.length>0)?p.join('<br />'):_('None'),requests:(r.requests!='')?r.requests:_('None'),subtotal:jlib.Locale.getAmount(rateData.currency,rateData.total),paymentPolicy:rateData.paymentPolicy,cancellationPolicy:rateData.cancellationPolicy};if(r.airportTransfer){if(r.airportPickUp){details.airportPickUpDate=jlib.Locale.getLocaleDate(new Date(r.airportPickUpYear,r.airportPickUpMonth-1,r.airportPickUpDay))+' '+r.airportPickUpHour+':'+
r.airportPickUpMinute;details.airportPickUpAirport=airports.getValue(r.airportPickUpAirport).name;details.airportPickUpFlightNo=r.airportPickUpFlightNo;details.airportPickUpLocation=r.airportPickUpLocation;}
if(r.airportDropOff){details.airportDropOffDate=jlib.Locale.getLocaleDate(new Date(r.airportDropOffYear,r.airportDropOffMonth-1,r.airportDropOffDay))+' '+r.airportDropOffHour+':'+
r.airportDropOffMinute;details.airportDropOffAirport=airports.getValue(r.airportDropOffAirport).name;details.airportDropOffFlightNo=r.airportDropOffFlightNo;details.airportDropOffLocation=r.airportDropOffLocation;}}
if(r.landTransfer){if(r.landPickUp){details.landPickUpDate=jlib.Locale.getLocaleDate(new Date(r.landPickUpYear,r.landPickUpMonth-1,r.landPickUpDay))+' '+r.landPickUpHour+':'+r.landPickUpMinute;details.landPickUpLocation=r.landPickUpLocation;}
if(r.landDropOff){details.landDropOffDate=jlib.Locale.getLocaleDate(new Date(r.landDropOffYear,r.landDropOffMonth-1,r.landDropOffDay))+' '+r.landDropOffHour+':'+r.landDropOffMinute;details.landDropOffLocation=r.landDropOffLocation;}}
if(!(r.airportTransfer&&r.airportPickUp)&&!(r.landTransfer&&r.landPickUp)){details.hotelArrivalDate=r.hotelArrivalHour+':'+r.hotelArrivalMinute;}
roomDetails.push(details);}
r=(info.isUserGuest)?rooms[info.userRoom]:info.user;details={rooms:roomDetails,hotelId:state.get(0,ibe.BookingState.HOTEL_ID),resNum:info.resNum,numSuites:len,total:jlib.Locale.getAmount(info.currency,info.total),deposit:jlib.Locale.getAmount(info.currency,info.deposit),showFullPaymentMessage:hotelInfo.showFullPaymentMessage,airportTransfer:hasAnyAirportTransfer,landTransfer:hasAnyLandTransfer,hotelArrival:!hasAllPickUp,bookerSalutation:r.titleValue,bookerFirstName:r.firstName,bookerLastName:r.lastName,bookerEmail:r.email,bookerPhone:jlib.Locale.getPhone(r.phoneCountry,r.phoneArea,r.phoneLocal)};ibe.Error.askOnError(this,ibe.Util,'sendConfirmationEmail',function(sent){if(!(sent instanceof ibe.Error)&&!sent){sent=new ibe.Error(ibe.Error.CODE_EMAIL_UNKNOWN);}
if(sent instanceof ibe.Error){sent.addAction(ibe.Error.ACTIONS.skip);}
return sent;},details,function(sent){me.sendUpdate(job);});},cacheInformation:function(job){var me=this;var data=Function.getHiddenArgument(arguments,0);var stateInfo=this.stateInfo;var buildCache=this.buildCache;var prevState=job.prevState;var state=job.state;var info=job.info;var rooms=info.rooms;var version=info.version;var hotelProps=['name','contactUrl','travelTradeUrl','checkInTime','checkOutTime','showAirportTransferLocation','showLandTransfer','showHotelArrival','showDietaryRequirements','showFullPaymentMessage','showNumGuestsOnly'];var hotelTimeProps=['today','ayear'];var roomProps=['name','minOccupancy','maxOccupancy','maxExtraBeds','maxExtraBedsMessage','ratesOccupancyDependent'];var HOTEL_ID=ibe.BookingState.HOTEL_ID;var ARRIVAL_DATE=ibe.BookingState.ARRIVAL_DATE;var DEPARTURE_DATE=ibe.BookingState.DEPARTURE_DATE;var ROOM_TYPE=ibe.BookingState.ROOM_TYPE;var reqs,hotels,hotelTimes,roomTypes;var cacheKey,newCache,allCache,hotelStore,hotelTimeStore,roomStore;var hotel,arr,dep,room;var len,r,i,j;if(job.isCancelled){this.startProcessing();return;}
len=state.getNumRooms();if(!data){reqs=new jlib.OrderedObject();for(i=0;i<len;i++){hotel=state.get(i,HOTEL_ID);arr=state.get(i,ARRIVAL_DATE);dep=state.get(i,DEPARTURE_DATE);room=state.get(i,ROOM_TYPE);r=rooms[i];if(hotel==null){continue;}
if(!reqs.getValue('hotels')){reqs.push('hotels',{method:'getHotels',arguments:[version]});}
if(!reqs.getValue('hotelTime'+hotel)){reqs.push('hotelTime'+hotel,{method:'getHotelTime',arguments:[version,hotel,null,null,true],callbackPos:2});}
if(room!=null&&!reqs.getValue('roomTypes'+hotel)){reqs.push('roomTypes'+hotel,{method:'getRoomTypes',arguments:[version,hotel,null,null,true],callbackPos:2});}}
if(reqs.length>0){return ibe.Error.askOnError(this,ibe.WBE,'doMultiple',function(responses){return(job.isCancelled)?null:responses;},reqs,null,function(responses){me.cacheInformation(job,responses);});}else{data=new jlib.OrderedObject();}}
hotels=data.getValue('hotels');cacheKey=(new Date()).getTime();newCache={};allCache={};hotelTimes=new jlib.OrderedObject();hotelStore={};hotelTimeStore={};roomStore={};for(i=0;i<len;i++){hotel=state.get(i,HOTEL_ID);room=state.get(i,ROOM_TYPE);r=rooms[i];if(hotel!=null){buildCache('hotel',hotel,hotels,cacheKey,hotelProps,stateInfo,prevState,hotelStore,newCache,allCache,r);if(!hotelTimes.getValue(hotel)){hotelTimes.push(hotel,data.getValue('hotelTime'+hotel));}
buildCache('hotelTime',hotel,hotelTimes,cacheKey,hotelTimeProps,stateInfo,prevState,hotelTimeStore,newCache,allCache,r);}else{r.hotelCacheKey=null;r.hotelTimeCacheKey=null;}
if(hotel!=null&&room!=null){roomTypes=data.getValue('roomTypes'+hotel);if(!roomStore[hotel]){roomStore[hotel]={};}
buildCache('room',room,roomTypes,cacheKey,roomProps,stateInfo,prevState,roomStore[hotel],newCache,allCache,r);}else{r.roomCacheKey=null;}
cacheKey++;}
job.newCache=newCache;job.allCache=allCache;this.getRateData(job);},buildCache:function(prefix,id,list,key,props,stateInfo,prevState,store,newCache,allCache,room){var cacheId='cache_'+prefix+id;var keyId='key_'+prefix+id;var roomProp=prefix+'CacheKey';var newData,oldData,hasChanged,info,i;if(!store[cacheId]){info=list.getValue(id);i={};props.forEach(function(prop){var o=info[prop];i[prop]=(o instanceof Date)?o.toISODateString():o;});store[cacheId]=i;store[keyId]=key;}
newData=store[cacheId];oldData=stateInfo.getSession(prevState,room[roomProp]);hasChanged=true;if(oldData){hasChanged=false;for(i in newData){if(newData[i]!=oldData[i]){hasChanged=true;break;}}}
if(hasChanged){i=prefix+store[keyId];newCache[i]=newData;room[roomProp]=i;allCache[i]=newData;}else{allCache[room[roomProp]]=oldData;}},getRateData:function(job){var me=this;var data=Function.getHiddenArgument(arguments,0);var stateInfo=this.stateInfo;var prevState=job.prevState;var state=job.state;var info=job.info;var rooms=info.rooms;var version=info.version;var allCache=job.allCache;var HOTEL_ID=ibe.BookingState.HOTEL_ID;var ARRIVAL_DATE=ibe.BookingState.ARRIVAL_DATE;var DEPARTURE_DATE=ibe.BookingState.DEPARTURE_DATE;var ROOM_TYPE=ibe.BookingState.ROOM_TYPE;var RATE_OCCUPANCY=ibe.BookingState.RATE_OCCUPANCY;var RATE_CODE=ibe.BookingState.RATE_CODE;var RATE_START_DATE=ibe.BookingState.RATE_START_DATE;var BAR_RATE_CODE=ibe.WBE.BAR_RATE_CODE;var reqs,hotel,arr,dep,room,rateOcc,rateCode,rateStart;var rateCodes,rates,barBreakdown,rateBreakdown,roomInfo,rateCodeInfo,rateInfo,barInfo;var newRateData,allRateData,currency,total,deposit;var rateKey,newRate,oldRate,hasChanged;var len,r,i,j;if(job.isCancelled){this.startProcessing();return;}
len=state.getNumRooms();if(!data){reqs=new jlib.OrderedObject();for(i=0;i<len;i++){hotel=state.get(i,HOTEL_ID);arr=state.get(i,ARRIVAL_DATE);dep=state.get(i,DEPARTURE_DATE);room=state.get(i,ROOM_TYPE);rateOcc=state.get(i,RATE_OCCUPANCY);rateCode=state.get(i,RATE_CODE);rateStart=state.get(i,RATE_START_DATE);r=rooms[i];if(hotel==null||rateCode==null){continue;}
if(!reqs.getValue('rateCodes'+hotel)){reqs.push('rateCodes'+hotel,{method:'getRateCodes',arguments:[version,hotel,null,null,true],callbackPos:2});}
if(!arr||!dep||room==null||rateOcc==null){continue;}
reqs.push('rates'+i,{method:'getRates',arguments:[version,state,i,rateOcc,null,null,true],callbackPos:4});if(!rateStart){continue;}
reqs.push('barBreakdown'+i,{method:'getRateBreakdown',arguments:[version,state,i,rateOcc,BAR_RATE_CODE,null,null,true],callbackPos:5});if(rateCode==BAR_RATE_CODE){continue;}
reqs.push('rateBreakdown'+i,{method:'getRateBreakdown',arguments:[version,state,i,rateOcc,rateCode,null,null,true],callbackPos:5});}
if(reqs.length>0){return ibe.Error.askOnError(this,ibe.WBE,'doMultiple',function(responses){return(job.isCancelled)?null:responses;},reqs,null,function(responses){me.getRateData(job,responses);});}else{data=new jlib.OrderedObject();}}
rateKey=(new Date()).getTime();newRateData={};allRateData={};total=0;deposit=0;for(i=0;i<len;i++){hotel=state.get(i,HOTEL_ID);rateOcc=state.get(i,RATE_OCCUPANCY);rateCode=state.get(i,RATE_CODE);r=rooms[i];if(hotel==null||rateCode==null){r.rateKey=null;continue;}
rateCodes=data.getValue('rateCodes'+hotel);rates=data.getValue('rates'+i);barBreakdown=data.getValue('barBreakdown'+i);rateBreakdown=data.getValue('rateBreakdown'+i);roomInfo=allCache[r.roomCacheKey];newRate={};if(rates){arr=state.get(i,ARRIVAL_DATE);dep=state.get(i,DEPARTURE_DATE);rateInfo=rates.getValue(rateCode);barInfo=rates.getValue(BAR_RATE_CODE);rateCodeInfo=(rateCodes)?rateCodes.getValue(rateCode):{};r.rateCodeDetail=rateInfo.rateCodeDetail;r.stayLength=Math.round((dep-arr)/86400000);if(barBreakdown){newRate=this.calculateRateData(state,i,rateInfo,barBreakdown,rateBreakdown,rateCodeInfo.length);if(!newRate){r.rateKey=null;continue;}
newRate.currency=rateInfo.currency;j=(newRate.isWithBAR)?'WithBAR':'WithoutBAR';newRate.paymentPolicy=rateInfo['paymentPolicy'+j];newRate.cancellationPolicy=rateInfo['cancellationPolicy'+j];newRate.details=rateInfo['details'+j];currency=rateInfo.currency;total+=newRate.total;deposit+=newRate.deposit;}else if(rateCode!=BAR_RATE_CODE&&rateCodeInfo.length!=-1&&r.stayLength>rateCodeInfo.length){newRate.isWithBAR=true;}}else{rateInfo=rateCodes.getValue(rateCode);barInfo=rateCodes.getValue(BAR_RATE_CODE);}
newRate.name=rateInfo.name;newRate.nameWithoutOccupancy=rateInfo.name;newRate.includes=rateInfo.includes;if(rateCode!=BAR_RATE_CODE){newRate.barName=barInfo.name;newRate.barNameWithoutOccupancy=barInfo.name;newRate.barIncludes=barInfo.includes;}
if(roomInfo&&roomInfo.ratesOccupancyDependent){j=' '+_('(('+rateOcc+') Occupancy)');newRate.name+=j;if(rateCode!=BAR_RATE_CODE){newRate.barName+=j;}}
oldRate=stateInfo.getSession(prevState,r.rateKey);hasChanged=true;if(oldRate){hasChanged=false;for(j in newRate){if(newRate[j]!=oldRate[j]){hasChanged=true;break;}}}
if(hasChanged){j='rate'+rateKey;newRateData[j]=newRate;r.rateKey=j;allRateData[j]=newRate;}else{allRateData[r.rateKey]=oldRate;}
rateKey++;}
info.currency=currency;info.total=total;info.deposit=deposit;job.newRateData=newRateData;job.allRateData=allRateData;this.doStepAction(job);},calculateRateData:function(state,index,rateInfo,barBreakdown,rateBreakdown,rateLength){var BAR_RATE_CODE=ibe.WBE.BAR_RATE_CODE;var rcBuf=[];var rcdBuf=[];var total=0;var deposit=0;var day=0;var hasBAR=false;var hotel,arr,dep,room,rateCode,rateStart;var breakdown,rateEnd,b,d,s;if(!state||index==null||!rateInfo){return null;}
hotel=state.get(index,ibe.BookingState.HOTEL_ID);arr=state.get(index,ibe.BookingState.ARRIVAL_DATE);dep=state.get(index,ibe.BookingState.DEPARTURE_DATE);room=state.get(index,ibe.BookingState.ROOM_TYPE);rateCode=state.get(index,ibe.BookingState.RATE_CODE);rateStart=state.get(index,ibe.BookingState.RATE_START_DATE);if(hotel==null||!arr||!dep||room==null||rateCode==null||!rateStart){return null;}
if(rateCode==BAR_RATE_CODE){return{compositeRateCode:rateInfo.compositeRateCode,compositeRateCodeDetail:rateInfo.compositeRateCodeDetail,total:rateInfo.total,deposit:rateInfo.deposit,isWithBAR:false};}
if(!barBreakdown||!rateBreakdown||rateLength==null){return null;}
rateStart=new Date(rateStart);rateEnd=ibe.WBE.findRateEndDate(rateBreakdown,rateStart,rateLength,dep);if(!rateEnd){return null;}
breakdown=Object.dup(barBreakdown);for(d=new Date(rateStart);d<rateEnd;d.addDate(1)){s=d.toISODateString();breakdown[s]=Object.dup(rateBreakdown[s],{isRate:true});}
for(d=new Date(arr);d<dep;d.addDate(1)){b=breakdown[d.toISODateString()];rcBuf.push('&','rc',((day<10)?'0':''),day,'=',b.rateCode);rcdBuf.push('&','rcd',((day<10)?'0':''),day,'=',b.rateCodeDetail);total+=b.rate;deposit+=b.deposit;if(!b.isRate){hasBAR=true;}
day++;}
rcBuf[0]='';rcdBuf[0]='';return{compositeRateCode:rcBuf.join(''),compositeRateCodeDetail:rcdBuf.join(''),total:total,deposit:deposit,isWithBAR:hasBAR};},doStepAction:function(job){var info=job.info;if(job.isCancelled){this.startProcessing();return;}
switch(info.rooms[0].step){case ibe.BookingController.STEP_PAYMENT_INFO:this.createNewReservation(job);break;case ibe.BookingController.STEP_EMAIL_ITINERARY_CONFIRM:this.sendItineraryEmail(job);break;default:this.sendUpdate(job);break;}},createNewReservation:function(job){var me=this;var state=job.state;var info=job.info;var rooms=info.rooms;var version=info.version;var user=info.user;var isUserGuest=info.isUserGuest;var userRoom=info.userRoom;var allRateData=job.allRateData;var len=state.getNumRooms();var details=[];var resEmail,rs;if(job.isCancelled){this.startProcessing();return;}
resEmail=(isUserGuest)?rooms[userRoom].email:user.email;rs=rooms.map(function(r){var rateData=allRateData[r.rateKey];return Object.dup(r,{compositeRateCode:rateData.compositeRateCode,compositeRateCodeDetail:rateData.compositeRateCodeDetail,isWithBAR:rateData.isWithBAR});});ibe.Error.askOnError(this,ibe.WBE,'createReservation',function(res){var CODE_WBE_CREATE_NOT_AVAILABLE=ibe.Error.CODE_WBE_CREATE_NOT_AVAILABLE;var STEP_REVIEW_INFO=ibe.BookingController.STEP_REVIEW_INFO;var notAvailableMessage=ibe.Error.getErrorMessage(CODE_WBE_CREATE_NOT_AVAILABLE);var errorCode,room,r,i;if(job.isCancelled){return false;}
if(res&&!(res instanceof ibe.Error)&&!res.isReserved){if(res.globalErrorCode==ibe.Error.CODE_WBE_UNKNOWN){for(i=0;i<len;i++){room=rooms[i];r=res[i];room.isReviewComplete=false;room.step=STEP_REVIEW_INFO;room.actualStep=STEP_REVIEW_INFO;if(r.isReserved){continue;}
if(r.errorCode==CODE_WBE_CREATE_NOT_AVAILABLE){if(job.newCurrentRoom==null){job.newCurrentRoom=i;}
if(room.errorMessage==null){room.errorMessage=notAvailableMessage;room.isErrorHighlighted=true;}}else{errorCode=r.errorCode;}}}else{errorCode=res.globalErrorCode;}
res=(errorCode)?new ibe.Error(errorCode):false;}
return res;},version,state,rs,user,(isUserGuest)?userRoom:-1,function(res){var i;if(res){if(res.isReserved){for(i=0;i<len;i++){rooms[i].confirmationNumber=res[i].confirmationNumber;}
info.resVer=version;info.resNum=res.reservationNumber;info.resEmail=resEmail;info.cpgUrl=res.cpgUrl;me.pendingReservationVersion=version;me.pendingReservationNumber=res.reservationNumber;me.pendingReservationEmail=resEmail;}else{}}
me.sendUpdate(job);});},sendItineraryEmail:function(job){var me=this;var data=Function.getHiddenArgument(arguments,0);var state=job.state;var info=job.info;var rooms=info.rooms;var emailItinerary=info.emailItinerary;var version=info.version;var allCache=job.allCache;var allRateData=job.allRateData;var len=state.getNumRooms();var recipients=[];var details=[];var MAX_NUM_ROOMS=ibe.BookingController.MAX_NUM_ROOMS;var MAX_NUM_EMAIL_ITINERARY=ibe.BookingController.MAX_NUM_EMAIL_ITINERARY;var HOTEL_ID=ibe.BookingState.HOTEL_ID;var ARRIVAL_DATE=ibe.BookingState.ARRIVAL_DATE;var DEPARTURE_DATE=ibe.BookingState.DEPARTURE_DATE;var ROOM_TYPE=ibe.BookingState.ROOM_TYPE;var BABY_COT_CRIB_ID=ibe.WBE.BABY_COT_CRIB_ID;var rlen,recipient,start,end,booker;var roomDetails,numExtraBeds,hotelInfo,roomInfo,rateData,suiteNumber,airports,preferences,prefs,hasAnyAirportTransfer,hasAnyLandTransfer,hasAllPickUp;var reqs,hotel,e,n,r,d,p,i,j;if(job.isCancelled){this.startProcessing();return;}
if(emailItinerary){for(i=0;i<MAX_NUM_EMAIL_ITINERARY;i++){var o=emailItinerary[i];if(!o){continue;}
e=o.email;n=o.name;r=o.room;if(!e||!n||!Number.isInt(r)||r<-1||r>=MAX_NUM_ROOMS){continue;}
recipients.push({email:e,name:n,room:r});}}
rlen=recipients.length;if(rlen==0){this.sendUpdate(job);return;}
if(!data){reqs=new jlib.OrderedObject();for(i=0;i<len;i++){r=rooms[i];hotel=state.get(i,HOTEL_ID);if(r.airportTransfer&&(r.airportPickUp||r.airportDropOff)&&!reqs.getValue('airports'+hotel)){reqs.push('airports'+hotel,{method:'getAirports',arguments:[version,hotel]});}
if(r.preferences&&!reqs.getValue('preferences'+hotel)){reqs.push('preferences'+hotel,{method:'getPreferences',arguments:[version,hotel]});}}
if(reqs.length>0){return ibe.Error.askOnError(this,ibe.WBE,'doMultiple',null,reqs,null,function(responses){me.sendItineraryEmail(job,responses);});}else{data=new jlib.OrderedObject();}}
r=(info.isUserGuest)?rooms[info.userRoom]:info.user;booker={firstName:r.firstName,lastName:r.lastName,email:r.email,phone:jlib.Locale.getPhone(r.phoneCountry,r.phoneArea,r.phoneLocal)};for(i=0;i<rlen;i++){recipient=recipients[i];roomDetails=[];hasAnyAirportTransfer=false;hasAnyLandTransfer=false;hasAllPickUp=true;if(recipient.room==-1){start=0;end=len;}else{start=recipient.room;end=start+1;}
for(j=start;j<end;j++){r=rooms[j];hotel=state.get(j,HOTEL_ID);numExtraBeds=r.numExtraBeds;hotelInfo=allCache[r.hotelCacheKey];roomInfo=allCache[r.roomCacheKey];rateData=allRateData[r.rateKey];suiteNumber=this.getSuiteName(j);airports=data.getValue('airports'+hotel);preferences=data.getValue('preferences'+hotel);prefs=(r.preferences||'').split(',');p=[];if(preferences){preferences.filter(function(a){return(a[0]!=BABY_COT_CRIB_ID);}).forEach(function(a){if(prefs.indexOf(a[0])>-1){p.push(a[1].text);}});}
if(r.airportTransfer&&(r.airportPickUp||r.airportDropOff)){hasAnyAirportTransfer=true;}
if(r.landTransfer&&(r.landPickUp||r.landDropOff)){hasAnyLandTransfer=true;}
if(!(r.airportTransfer&&r.airportPickUp)&&!(r.landTransfer&&r.landPickUp)){hasAllPickUp=false;}
d={email:r.email,suiteNumber:suiteNumber,salutation:r.titleValue,lastName:r.lastName,firstName:r.firstName,skywardsNum:(r.skywardsNum!='')?r.skywardsNum:_('None'),checkIn:jlib.Locale.getLocaleDate(state.get(j,ARRIVAL_DATE)),checkOut:jlib.Locale.getLocaleDate(state.get(j,DEPARTURE_DATE)),roomType:roomInfo.name,rateCode:((rateData.isWithBAR)?rateData.barName+'<br />':'')+
rateData.name,numGuests:r.numGuests,showNumGuestsOnly:hotelInfo.showNumGuestsOnly,numChildren:r.numChildren,numInfants:r.numInfants,numExtraBeds:numExtraBeds,extraBedMessage:(numExtraBeds==roomInfo.maxExtraBeds)?roomInfo.maxExtraBedsMessage:'',airportPickUpDate:'',airportPickUpAirport:'',airportPickUpFlightNo:'',airportPickUpLocation:'',airportDropOffDate:'',airportDropOffAirport:'',airportDropOffFlightNo:'',airportDropOffLocation:'',landPickUpDate:'',landPickUpLocation:'',landDropOffDate:'',landDropOffLocation:'',hotelArrivalDate:'',showAirportTransferLocation:hotelInfo.showAirportTransferLocation,showLandTransfer:hotelInfo.showLandTransfer,showHotelArrival:hotelInfo.showHotelArrival,dietaryRequirements:(r.dietaryRequirements!='')?r.dietaryRequirements:_('None'),showDietaryRequirements:hotelInfo.showDietaryRequirements,preferences:(p.length>0)?p.join('<br />'):_('None'),requests:(r.requests!='')?r.requests:_('None'),subtotal:jlib.Locale.getAmount(rateData.currency,rateData.total),paymentPolicy:rateData.paymentPolicy,cancellationPolicy:rateData.cancellationPolicy};if(r.airportTransfer){if(r.airportPickUp){d.airportPickUpDate=jlib.Locale.getLocaleDate(new Date(r.airportPickUpYear,r.airportPickUpMonth-1,r.airportPickUpDay))+' '+r.airportPickUpHour+':'+
r.airportPickUpMinute;d.airportPickUpAirport=airports.getValue(r.airportPickUpAirport).name;d.airportPickUpFlightNo=r.airportPickUpFlightNo;d.airportPickUpLocation=r.airportPickUpLocation;}
if(r.airportDropOff){d.airportDropOffDate=jlib.Locale.getLocaleDate(new Date(r.airportDropOffYear,r.airportDropOffMonth-1,r.airportDropOffDay))+' '+r.airportDropOffHour+':'+
r.airportDropOffMinute;d.airportDropOffAirport=airports.getValue(r.airportDropOffAirport).name;d.airportDropOffFlightNo=r.airportDropOffFlightNo;d.airportDropOffLocation=r.airportDropOffLocation;}}
if(r.landTransfer){if(r.landPickUp){d.landPickUpDate=jlib.Locale.getLocaleDate(new Date(r.landPickUpYear,r.landPickUpMonth-1,r.landPickUpDay))+' '+r.landPickUpHour+':'+
r.landPickUpMinute;d.landPickUpLocation=r.landPickUpLocation;}
if(r.landDropOff){d.landDropOffDate=jlib.Locale.getLocaleDate(new Date(r.landDropOffYear,r.landDropOffMonth-1,r.landDropOffDay))+' '+r.landDropOffHour+':'+
r.landDropOffMinute;d.landDropOffLocation=r.landDropOffLocation;}}
if(!(r.airportTransfer&&r.airportPickUp)&&!(r.landTransfer&&r.landPickUp)){d.hotelArrivalDate=r.hotelArrivalHour+':'+r.hotelArrivalMinute;}
roomDetails.push(d);}
details.push({rooms:roomDetails,email:recipient.email,name:recipient.name,hotelId:state.get(start,ibe.BookingState.HOTEL_ID),resNum:info.resNum,total:jlib.Locale.getAmount(info.currency,info.total),deposit:jlib.Locale.getAmount(info.currency,info.deposit),showFullPaymentMessage:hotelInfo.showFullPaymentMessage,airportTransfer:hasAnyAirportTransfer,landTransfer:hasAnyLandTransfer,hotelArrival:!hasAllPickUp,bookerFirstName:booker.firstName,bookerLastName:booker.lastName,bookerEmail:booker.email,bookerPhone:booker.phone});}
ibe.Error.askOnError(this,ibe.Util,'sendItineraryEmail',function(sent){if(job.isCancelled){return false;}
if(!(sent instanceof ibe.Error)&&!sent){sent=new ibe.Error(ibe.Error.CODE_EMAIL_UNKNOWN);}
if(sent instanceof ibe.Error){sent.addAction(ibe.Error.ACTIONS.skip);}
return sent;},details,function(sent){me.sendUpdate(job);});},checkPendingReservationExisting:function(job){var me=this;var resVer=this.pendingReservationVersion;var resNum=this.pendingReservationNumber;var resEmail=this.pendingReservationEmail;if(resVer==null||!resNum||!resEmail){this.sendUpdate(job);return;}
ibe.Error.askOnError(this,ibe.WBE,'cancelReservation',function(cancelres){if(cancelres instanceof ibe.Error&&(cancelres.code==ibe.Error.CODE_WBE_RESERVATION_ALREADY_CANCELLED||cancelres.code==ibe.Error.CODE_WBE_CANNOT_CANCEL)){cancelres=true;}
return cancelres;},resVer,resNum,ibe.WBE.TEMPORARY_RESERVATION_CANCELLATION_REASON,resEmail,function(cancelres){me.pendingReservationVersion=null;me.pendingReservationNumber=null;me.pendingReservationEmail=null;me.sendUpdate(job);});},sendUpdate:function(job){var stateInfo=this.stateInfo;var prevState=job.prevState;var state=job.state;var info=job.info;var rooms=info.rooms;var curRoom=info.currentRoom;var doRemoveRoom=job.doRemoveRoom;var re=new RegExp('^('+
jlib.hessian.FormFieldWrapper.STORAGE_PREFIX+'_\\d+_)?(\\d+)_(.+)');var prevSpecific,specific,key,room,a,k;var nextState;if(job.isCancelled){this.startProcessing();return;}
if(job.isNewState){if(doRemoveRoom){if(curRoom<rooms.length){rooms.splice(curRoom,1);}}else if(job.doAddRoom){a=rooms[job.addedRoom];a.copyRoom=curRoom;a.copyState=state.toString();}
if(!job.doRemoveAllRooms){prevSpecific=stateInfo.exportSpecific(prevState);specific={};for(key in prevSpecific){a=key.match(re);if(!a||a.length!=4){continue;}
room=parseInt(a[2],10);if(room==curRoom){continue;}else if(!doRemoveRoom||room<curRoom){k=key;}else{k=((a[1]!=null)?a[1]:'')+(room-1)+'_'+a[3];}
specific[k]=prevSpecific[key];}}
if(job.newCurrentRoom!=null){info.currentRoom=job.newCurrentRoom;}
curRoom=info.currentRoom;if(job.newErrorMessage!=null&&rooms[curRoom].errorMessage==null){rooms[curRoom].errorMessage=job.newErrorMessage;}
stateInfo.addState(state,prevState,job.incomingState);stateInfo.importPersistent(state,info);[job.newCache,job.newRateData].forEach(function(obj){var i;if(!obj){return;}
for(i in obj){stateInfo.setSession(state,i,obj[i]);}});if(!job.doRemoveAllRooms){stateInfo.importSpecific(state,specific);}}
this.currentJob=null;if(job.clearCachedData){this.cachedData=null;}
nextState=this.generateNewState(state);this.mediator.unalert(this,jlib.hessian.Mediator.MESSAGE_LOADING);jlib.contrib.Events.dispatch(this,'update',{state:state,nextState:nextState,info:info});},checkUserCode:function(job){var me=this;var state=job.state;var version=job.info.version;var hotel=ibe.BookingController.HOTEL;var userCode=state.get(null,ibe.BookingState.USER_CODE);var userCodeType=state.get(null,ibe.BookingState.USER_CODE_TYPE);return ibe.Error.askOnError(this,ibe.WBE,'isUserCode',function(isUserCode){return(job.isCancelled)?false:isUserCode;},version,hotel,userCode,userCodeType,function(isUserCode){me.validateState(job,-1,isUserCode);});},getLongTermUrl:function(job,i,result){var me=this;var state=job.state;var version=job.info.version;var hotel=state.get(i,ibe.BookingState.HOTEL_ID);return ibe.Error.askOnError(this,ibe.WBE,'getHotels',function(hotels){return(job.isCancelled)?null:hotels;},version,function(hotels){var hotelInfo;if(hotels&&!(hotels instanceof ibe.Error)){hotelInfo=hotels.getValue(hotel);}
job.longTermUrl=(hotelInfo)?hotelInfo.longTermUrl:'';me.validateState(job,i,result);});},checkDate:function(job,i,result,type){var me=this;var state=job.state;var version=job.info.version;var hotel=state.get(i,ibe.BookingState.HOTEL_ID);var date;switch(type){case'arrival':date=state.get(i,ibe.BookingState.ARRIVAL_DATE);break;case'departure':date=new Date(state.get(i,ibe.BookingState.DEPARTURE_DATE));date.addDate(-1);break;case'rateStart':date=state.get(i,ibe.BookingState.RATE_START_DATE);}
return ibe.Error.askOnError(this,ibe.WBE,'isDate',function(isDate){return(job.isCancelled)?false:isDate;},version,hotel,date,function(isDate){result[type]=isDate;me.validateState(job,i,result);},null,true);},getCurrentDate:function(job,i,result){var me=this;var state=job.state;var version=job.info.version;var hotel=state.get(i,ibe.BookingState.HOTEL_ID);return ibe.Error.askOnError(this,ibe.WBE,'getHotelTime',function(hotelTime){return(job.isCancelled)?null:hotelTime;},version,hotel,function(hotelTime){job.currentDate=(hotelTime&&!(hotelTime instanceof ibe.Error))?hotelTime.today:new Date();me.validateState(job,i,result);});},checkDateRange:function(job,i,result){var me=this;var state=job.state;var version=job.info.version;var hotel=state.get(i,ibe.BookingState.HOTEL_ID);var arr=state.get(i,ibe.BookingState.ARRIVAL_DATE);var dep=state.get(i,ibe.BookingState.DEPARTURE_DATE);return ibe.Error.askOnError(this,ibe.WBE,'isDateRange',function(isDateRange){return(job.isCancelled)?false:isDateRange;},version,hotel,arr,dep,function(isDateRange){result.departure=isDateRange;me.validateState(job,i,result);},null,true);},checkRoomType:function(job,i,result){var me=this;var state=job.state;var version=job.info.version;var hotel=state.get(i,ibe.BookingState.HOTEL_ID);var room=state.get(i,ibe.BookingState.ROOM_TYPE);return ibe.Error.askOnError(this,ibe.WBE,'isRoomType',function(isRoomType){return(job.isCancelled)?false:isRoomType;},version,hotel,room,function(isRoomType){result.room=isRoomType;me.validateState(job,i,result);},null,true);},checkRateCode:function(job,i,result){var me=this;var state=job.state;var version=job.info.version;var hotel=state.get(i,ibe.BookingState.HOTEL_ID);var rateCode=state.get(i,ibe.BookingState.RATE_CODE);return ibe.Error.askOnError(this,ibe.WBE,'isRateCode',function(isRateCode){return(job.isCancelled)?false:isRateCode;},version,hotel,rateCode,function(isRateCode){result.rateCode=isRateCode;me.validateState(job,i,result);},null);},checkCheckInDate:function(job,i,result){var me=this;var state=job.state;var version=job.info.version;var arr=state.get(i,ibe.BookingState.ARRIVAL_DATE);return ibe.Error.askOnError(this,ibe.WBE,'isCheckInDate',function(isCheckInDate){return(job.isCancelled)?false:isCheckInDate;},version,state,i,arr,function(isCheckInDate){result.checkIn=isCheckInDate;me.validateState(job,i,result);},null,true);},checkCheckOutDate:function(job,i,result){var me=this;var state=job.state;var version=job.info.version;var dep=state.get(i,ibe.BookingState.DEPARTURE_DATE);return ibe.Error.askOnError(this,ibe.WBE,'isCheckOutDate',function(isCheckOutDate){return(job.isCancelled)?false:isCheckOutDate;},version,state,i,dep,function(isCheckOutDate){result.checkOut=isCheckOutDate;me.validateState(job,i,result);},null,true);},checkRoomAvailable:function(job,i,result){var me=this;var state=job.state;var version=job.info.version;var room=state.get(i,ibe.BookingState.ROOM_TYPE);return ibe.Error.askOnError(this,ibe.WBE,'isRoomAvailable',function(isRoomAvailable){return(job.isCancelled)?false:isRoomAvailable;},version,state,i,room,function(isRoomAvailable){result.roomAvailable=isRoomAvailable;me.validateState(job,i,result);},null,true);},checkRateAvailable:function(job,i,result){var me=this;var state=job.state;var version=job.info.version;var rateOcc=state.get(i,ibe.BookingState.RATE_OCCUPANCY);var rateCode=state.get(i,ibe.BookingState.RATE_CODE);return ibe.Error.askOnError(this,ibe.WBE,'isRateAvailable',function(isRateAvailable){return(job.isCancelled)?false:isRateAvailable;},version,state,i,rateOcc,rateCode,function(isRateAvailable){result.rateAvailable=isRateAvailable;me.validateState(job,i,result);},null,true);},getRoomOccupancy:function(job,i,result){var me=this;var state=job.state;var version=job.info.version;var hotel=state.get(i,ibe.BookingState.HOTEL_ID);var room=state.get(i,ibe.BookingState.ROOM_TYPE);return ibe.Error.askOnError(this,ibe.WBE,'getRoomTypes',function(roomTypes){return(job.isCancelled)?null:roomTypes;},version,hotel,function(roomTypes){var ri=(roomTypes)?roomTypes.getValue(room):null;var r='room'+i;if(ri){job[r+'minOccupancy']=ri.minOccupancy;job[r+'maxOccupancy']=ri.maxOccupancy;job[r+'ratesOccupancyDependent']=ri.ratesOccupancyDependent;}else{job[r+'minOccupancy']=1;job[r+'maxOccupancy']=1;job[r+'ratesOccupancyDependent']=false;}
me.validateState(job,i,result);},null,true);},checkRateStartValid:function(job,i,result){var me=this;var state=job.state;var version=job.info.version;var rateOcc=state.get(i,ibe.BookingState.RATE_OCCUPANCY);var rateCode=state.get(i,ibe.BookingState.RATE_CODE);var rateStart=state.get(i,ibe.BookingState.RATE_START_DATE);return ibe.Error.askOnError(this,ibe.WBE,'isRateStartDate',function(isRateStartDate){return(job.isCancelled)?false:isRateStartDate;},version,state,i,rateOcc,rateCode,rateStart,function(isRateStartDate){result.rateStartValid=isRateStartDate;me.validateState(job,i,result);},null,true);},generateNewState:function(state){var stateInfo=this.stateInfo;var newState=new ibe.BookingState(state);var key=(new Date()).getTime();newState.set(null,ibe.BookingState.INFO_KEY,key.toString());while(stateInfo.hasState(newState)){key++;newState.set(null,ibe.BookingState.INFO_KEY,key.toString());}
return newState;},dupInfo:function(src,dest){var props=['rooms','user','emailItinerary'];var s={};var d={};if(!dest){dest={};}
if(!dest.rooms){dest.rooms=[];}
if(!src){return dest;}
props.forEach(function(prop){s[prop]=src[prop];d[prop]=dest[prop];});Object.dup(src,dest);props.forEach(function(prop){var ss=s[prop];var dd=d[prop];var i;if(!ss){return;}
if(ss instanceof Array){if(!dd){dd=[];d[prop]=dd;}
for(i=ss.length-1;i>=0;i--){dd[i]=Object.dup(ss[i],dd[i]);}}else if(typeof ss=='object'){dd=Object.dup(ss,dd);}
dest[prop]=dd;});return dest;},getSuiteName:function(index){var name;switch(index){case-1:name=_('All Suites');break;case 0:name=_('Suite One');break;case 1:name=_('Suite Two');break;case 2:name=_('Suite Three');break;case 3:name=_('Suite Four');break;default:name=_('Suite Five');break;}
return name;},toString:function(){return'[object ibe.BookingController]';}};if(!window.ibe){window.ibe={};}
ibe.SelectorWidget=function(id){if(!id){}
this.containerId=id;this.container=null;this.elements=null;this.options=null;this.selectedIndex=-1;this.speed=0;this.delay=0;this.timer=null;this.hasInit=false;};ibe.SelectorWidget.TEMPLATE=['<div id="currentcontainer" class="currentcontainer"><span id="current" class="current"></span></div>','<div id="selector" class="selector">','<div id="menucontainer" class="menucontainer">','<ul id="menu" class="menu"></ul>','</div>','<div id="upNav" class="upNav"><img src="',_('/images/the-harbour/dropmenu_up.gif'),'" /></div>','<div id="downNav" class="downNav"><img src="',_('/images/the-harbour/dropmenu_down.gif'),'" /></div>','</div>',(jlib.contrib.BrowserDetect.browser.indexOf('Explorer')!=-1&&jlib.contrib.BrowserDetect.version<=6)?'<iframe class="mask" style="filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0);" id="iMask" title="iMask" marginWidth="0" src="'+location.protocol+'//'+location.host+'/b.html" frameBorder="0"></iframe>':''];ibe.SelectorWidget.prototype={init:function(options,initialText,speed,delay){var me=this;var containerId=this.containerId;var selectors={currentcontainer:'#currentcontainer',current:'#current',selector:'#selector',menucontainer:'#menucontainer',menu:'#menu',upNav:'#upNav',downNav:'#downNav'};var container,elements,eventInfo;var currentcontainer,current,selector,menucontainer,menu,upNav,downNav;var reattach,option,label,value,li,props,len,i;if(this.hasInit){return;}
if(!options){return;}
container=(typeof containerId=='string')?document.getElementById(containerId):containerId;if(!container){return;}
jlib.ClassName.add(container,'selectorwidget');elements=jlib.Template.instantiate(ibe.SelectorWidget.TEMPLATE,container,selectors);currentcontainer=elements.currentcontainer;current=elements.current;selector=elements.selector;menucontainer=elements.menucontainer;menu=elements.menu;upNav=elements.upNav;downNav=elements.downNav;i=options.selectedIndex;options=Array.toArray(options);options.selectedIndex=i;len=options.length;reattach=jlib.Template.detach(menu);for(i=0;i<len;i++){label='';value='';option=options[i];if(option){label=option.label;value=option.value;}
if(value==null){value=label;}
li=document.createElement('li');li.innerHTML='<span>'+label+'</span>';li.widgetOption={index:i,label:label,value:value,option:option};menu.appendChild(li);}
jlib.ClassName.add(menu.firstChild,'first');reattach();speed=parseInt(speed,10);delay=parseInt(delay,10);this.speed=(Number.isReal(speed)&&speed>0)?speed:5;this.delay=(Number.isReal(delay)&&delay>0)?delay:24;eventInfo=[];props={widget:this};jlib.contrib.Events.addListener(currentcontainer,'click',this.toggleMenu,{selector:selector},eventInfo);jlib.contrib.Events.addListener(currentcontainer,'mouseup',this.hideMenu,null,eventInfo);jlib.contrib.Events.addListener(document,'mouseup',function(e){me.hideMenu(e,true);},null,eventInfo);jlib.contrib.Events.addListener(upNav,'mouseover',this.menuScrollUp,props,eventInfo);jlib.contrib.Events.addListener(upNav,'mouseout',this.stopScroll,null,eventInfo);jlib.contrib.Events.addListener(downNav,'mouseover',this.menuScrollDown,props,eventInfo);jlib.contrib.Events.addListener(downNav,'mouseout',this.stopScroll,null,eventInfo);jlib.contrib.Events.addListener(menu,'mouseover',this.menuItemOver,null,eventInfo);jlib.contrib.Events.addListener(menu,'mouseout',this.menuItemOut,null,eventInfo);jlib.contrib.Events.addListener(menu,'click',this.menuItemClick,props,eventInfo);elements.eventInfo=eventInfo;this.container=container;this.elements=elements;this.options=options;this.hasInit=true;this.select(options.selectedIndex);if(initialText!=null){current.innerHTML=initialText;}},uninit:function(){var container=this.container;var elements=this.elements;var menu;if(!this.hasInit){return;}
jlib.contrib.Events.removeListeners(elements.eventInfo);menu=elements.menu;Array.forEach(menu.childNodes,function(li){li.widgetOption=null;});menu.selected=null;container.innerHTML='';jlib.ClassName.remove(container,'selectorwidget');this.container=null;this.elements=null;this.options=null;this.selectedIndex=-1;this.speed=0;this.delay=0;this.timer=null;this.hasInit=false;},select:function(index){var elements=this.elements;var menu=elements.menu;var ind,prev,li;if(index==null){return;}
ind=parseInt(index,10);if(!Number.isReal(ind)||ind<0||ind>=this.options.length){return;}
prev=menu.selected;if(prev){jlib.ClassName.remove(prev,'selected');}
li=menu.childNodes[ind];jlib.ClassName.add(li,'selected');elements.current.innerHTML=li.widgetOption.label;menu.selected=li;this.selectedIndex=ind;},menuItemOver:function(e){var target=(e.target)?e.target:e.srcElement;var li;if(target.nodeType==3){target=target.parentNode;}
li=(target.nodeName=='SPAN')?target.parentNode:target;if(li.nodeName!='LI'){return;}
jlib.ClassName.add(li,'over');},menuItemOut:function(e){var target=(e.target)?e.target:e.srcElement;var li;if(target.nodeType==3){target=target.parentNode;}
li=(target.nodeName=='SPAN')?target.parentNode:target;if(li.nodeName!='LI'){return;}
jlib.ClassName.remove(li,'over');},menuItemClick:function(e){var widget=this.widget;var target=(e.target)?e.target:e.srcElement;var li;if(target.nodeType==3){target=target.parentNode;}
li=(target.nodeName=='SPAN')?target.parentNode:target;if(li.nodeName!='LI'){return;}
widget.select(li.widgetOption.index);jlib.contrib.Events.dispatch(widget,'change',Object.dup(li.widgetOption));},toggleMenu:function(){var selector=this.selector;selector.style.visibility=(selector.style.visibility!='visible')?'visible':'hidden';},hideMenu:function(e,isDoc){if(isDoc){this.elements.selector.style.visibility='hidden';}else{e.stopPropagation();}},menuScrollUp:function(){var widget=(this.widget)?this.widget:this;var elements=widget.elements;var menucontainer=elements.menucontainer;var top=menucontainer.offsetTop;var speed=widget.speed;var maxTop=elements.upNav.offsetHeight;widget.timer=null;if(top+speed<maxTop){menucontainer.style.top=(top+speed)+'px';widget.timer=setTimeout(function(){widget.menuScrollUp();},widget.delay);}else if(top<maxTop){menucontainer.style.top=maxTop+'px';}},menuScrollDown:function(){var widget=(this.widget)?this.widget:this;var elements=widget.elements;var menucontainer=elements.menucontainer;var top=menucontainer.offsetTop;var speed=widget.speed;var minTop=elements.selector.offsetHeight-
elements.downNav.offsetHeight-elements.menu.offsetHeight;widget.timer=null;if(top-speed>minTop){menucontainer.style.top=(top-speed)+'px';widget.timer=setTimeout(function(){widget.menuScrollDown();},widget.delay);}else if(top>minTop){menucontainer.style.top=minTop+'px';}},stopScroll:function(){var widget=(this.widget)?this.widget:this;if(widget.timer){clearTimeout(widget.timer);widget.timer=null;}},toString:function(){return'[object ibe.SelectorWidget]';}};if(!window.ibe){window.ibe={};}
ibe.StepNavModule=function(id){if(!id){}
this.containerId=id;this.nextState=null;this.info=null;this.createEventListeners();};ibe.StepNavModule.prototype=new jlib.hessian.Module('nextState','info');ibe.StepNavModule.prototype.constructor=ibe.StepNavModule;ibe.StepNavModule.prototype.isShowTime=function(){return true;};ibe.StepNavModule.prototype.toString=function(){return'[object ibe.StepNavModule]';};ibe.StepNavModule.TEMPLATE=['<img class="booking" src="',_('/images/the-harbour/en/ibe/titles/to_book_a_suite.gif'),'" alt="',_('To book a suite, select your:'),'" />','<div class="off">','<span class="link">','<img class="indicator" src="',_('/images/the-harbour/en/ibe/nav/check_in_off.gif'),'" alt="',_('Check In/Out Date'),'" />','<span class="detail"></span>','</span>','</div>','<div class="off">','<span class="link">','<img class="indicator" src="',_('/images/the-harbour/en/ibe/nav/suites_off.gif'),'" alt="',_('Suites'),'" />','<span class="detail"></span>','</span>','</div>','<div class="off">','<span class="link">','<img class="indicator" src="',_('/images/the-harbour/en/ibe/nav/rates_off.gif'),'" alt="',_('Rates and Packages'),'" />','<span class="detail"></span>','</span>','</div>','<div class="off">','<span class="link">','<img class="indicator" src="',_('/images/the-harbour/en/ibe/nav/guest_off.gif'),'" alt="',_('Guest Details'),'" />','<span class="detail"></span>','</span>','</div>','<div class="off">','<span class="link">','<img class="indicator" src="',_('/images/the-harbour/en/ibe/nav/payment_off.gif'),'" alt="',_('Payment Details'),'" />','</span>','</div>'];ibe._proto=ibe.StepNavModule.prototype;ibe.StepNavModule.prototype={init:function(){var container=this.container;var selectors={divs:'div',links:'span.link',indicators:'img.indicator',details:'span.detail'};var click=this.click;var elements,divs,spans,indicators,details,links,props;if(this.hasModuleInit){return;}
if(!container){return;}
elements=jlib.Template.instantiate(ibe.StepNavModule.TEMPLATE,container,selectors);divs=elements.divs;spans=elements.links;indicators=elements.indicators;details=elements.details;links=[];props={owner:this};[{name:'dates',steps:[ibe.BookingController.STEP_CHECK_IN,ibe.BookingController.STEP_CHECK_OUT,ibe.BookingController.STEP_DATE_CONFIRM]},{name:'roomType',steps:[ibe.BookingController.STEP_ROOM_TYPE]},{name:'rateCode',steps:[ibe.BookingController.STEP_RATE_CODE,ibe.BookingController.STEP_RATE_START]},{name:'guestInfo',steps:[ibe.BookingController.STEP_GUEST_INFO,ibe.BookingController.STEP_USER_INFO,ibe.BookingController.STEP_REVIEW_INFO]},{name:'paymentInfo',steps:[ibe.BookingController.STEP_PAYMENT_INFO]}].forEach(function(o,i){var div=divs[i];var span,link,src;span=spans[i];link=jlib.Template.createLink(click,props,span.childNodes);span.parentNode.replaceChild(link,span);link.disable();links[i]=link;div.link=link;div.indicator=indicators[i];div.detail=details[i];src=div.indicator.src;div.status={off:src,off_clickable:src.replace('_off','_off_click'),on:src.replace('_off','_on'),on_clickable:src.replace('_off','_on'),current:src.replace('_off','_current')};div.steps=o.steps;elements[o.name]=div;});elements.links=links;this.elements=elements;this.hasModuleInit=true;},uninit:function(){if(!this.hasModuleInit){return;}
this.elements.links.forEach(function(link){link.uninit();});this.elements=null;this.hasModuleInit=false;},redraw:function(doShow){var me=this;var stateInfo=this.stateInfo;var elements=this.elements;var state=this.state;var info=this.info;var href='#'+this.nextState;var rooms,version,curRoom,cur,step,actualStep;var hotel,arr,dep,dateConfirm,room,rateCode,rateStart,firstName,lastName,name;var rateInfo,isDetailsShown,isClickable;reposAfterEvent();if(!doShow){jlib.ClassName.add(this.container,'hidden');return;}
rooms=info.rooms;version=info.version;curRoom=info.currentRoom;cur=rooms[curRoom];step=cur.step;actualStep=(cur.actualStep)?cur.actualStep:step;hotel=state.get(curRoom,ibe.BookingState.HOTEL_ID);arr=state.get(curRoom,ibe.BookingState.ARRIVAL_DATE);dep=state.get(curRoom,ibe.BookingState.DEPARTURE_DATE);dateConfirm=state.get(curRoom,ibe.BookingState.DATE_CONFIRM);room=state.get(curRoom,ibe.BookingState.ROOM_TYPE);rateCode=state.get(curRoom,ibe.BookingState.RATE_CODE);rateStart=state.get(curRoom,ibe.BookingState.RATE_START_DATE);firstName=cur.firstName;lastName=cur.lastName;if(rateCode!=null){rateInfo=stateInfo.getSession(state,cur.rateKey);}
isDetailsShown=(step<ibe.BookingController.STEP_USER_INFO||step==ibe.BookingController.STEP_REVIEW_INFO);isClickable=(step<ibe.BookingController.STEP_USER_INFO);if(isDetailsShown){elements.dates.detail.innerHTML=jlib.Locale.getShortDateRange(arr,dep);elements.roomType.detail.innerHTML=(room!=null)?stateInfo.getSession(state,cur.roomCacheKey).name:'';elements.rateCode.detail.innerHTML=(rateCode!=null)?rateInfo.nameWithoutOccupancy:'';if(cur['seenStep'+ibe.BookingController.STEP_GUEST_INFO]){if(firstName&&lastName){name=jlib.Locale.getName(lastName,firstName);if(name.length>15){name=name.substring(0,15)+'...';}}else{name=_('Incomplete');}}else{name='';}
elements.guestInfo.detail.innerHTML=name;}else{elements.dates.detail.innerHTML='';elements.roomType.detail.innerHTML='';elements.rateCode.detail.innerHTML='';elements.guestInfo.detail.innerHTML='';}
[{element:elements.dates,isComplete:(arr&&dep&&dateConfirm)},{element:elements.roomType,isComplete:(room!=null)},{element:elements.rateCode,isComplete:(rateCode!=null&&rateStart),isRateCode:true},{element:elements.guestInfo,isComplete:cur.isReviewComplete},{element:elements.paymentInfo,isComplete:info.isPaymentComplete,isNotClickable:true}].forEach(function(o){var el=o.element;var status=el.status;var link=el.link;var steps=el.steps;var isCurrent=(steps.indexOf(step)>-1);var isComplete=o.isComplete;var linkStep=null;var len,s,i;if(o.isRateCode&&rateCode==ibe.WBE.BAR_RATE_CODE){steps=[ibe.BookingController.STEP_RATE_CODE];}
if(isClickable&&!isCurrent&&!o.isNotClickable){len=steps.length;for(i=0;i<len;i++){s=steps[i];if(s<=actualStep){linkStep=s;}else{break;}}}
jlib.ClassName.toggle(el,'current',isCurrent);jlib.ClassName.toggle(el,'off',(!isCurrent&&!isComplete));jlib.ClassName.toggle(el,'on',(!isCurrent&&isComplete));jlib.ClassName.toggle(el,'clickable',!!linkStep);if(isCurrent){s='current';}else{s=(!isComplete)?'off':'on';if(linkStep){s+='_clickable';}}
el.indicator.src=status[s];link.href=href;link.step=linkStep;link.toggle(!!linkStep);});jlib.ClassName.remove(this.container,'hidden');},click:function(e){var stepNav=this.owner;var curRoom=stepNav.info.currentRoom;var href=this.href;jlib.contrib.Events.dispatch(stepNav,'beforechange',{state:href.substring(href.indexOf('#')+1),prevState:stepNav.state,info:{doStep:this.step}});}};ibe.StepNavModule.prototype=Object.dup(ibe.StepNavModule.prototype,ibe._proto);delete ibe._proto;ibe.StepNavModule.prototype.doneLoading();if(!window.ibe){window.ibe={};}
ibe.BookingAssistantModule=function(id){if(!id){}
this.containerId=id;this.nextState=null;this.info=null;this.ticket=null;this.createEventListeners();};ibe.BookingAssistantModule.prototype=new jlib.hessian.Module('nextState','info');ibe.BookingAssistantModule.prototype.constructor=ibe.BookingAssistantModule;ibe.BookingAssistantModule.prototype.isShowTime=function(){return true;};ibe.BookingAssistantModule.prototype.toString=function(){return'[object ibe.BookingAssistantModule]';};ibe.BookingAssistantModule.TEMPLATE=['<div class="sideBar">','<div class="title">',_('My Booking'),'</div>','<div id="panels"></div>','<div id="totalCost" class="sidebarTotalCost hidden">','<p class="first">','<strong>',_('Total Cost:'),'</strong><br />','<span id="total"></span>','<span id="currencyMessage" class="msg hidden"><br />',_('(exchange rate for reference only)'),'</span>','</p>','<p>',_('Inclusive of tax and service charge'),'</p>','<p id="fullPaymentMessage" class="msg hidden">',_('Full advance payment required to confirm reservation'),'</p>','</div>','</div>','<div id="multiBooking" class="multiBooking sideBar hidden">','<div class="title">',_('Multi Suite Booking Available'),'</div>','<p class="first">',_('Book up to five suites online with Emirates Hotels &amp; Resorts'),'</p>','<p>',_('If you wish to book more than five suites, please visit'),' <a href="',_('/the-harbour/en/reservations/group-reservations/'),'">',_('Group Reservations'),'</a></p>','</div>'];ibe.BookingAssistantModule.PANEL_TEMPLATE=['<div id="panel" class="panel hidden">','<div class="widget ibewidget">','<div class="twistyDiv"><img src="/images/greyminus.gif" alt="" /></div>','<span id="name" class="on"></span>','</div>','<div class="panelcontent">','<p id="checkInContainer">','<strong>',_('Check In:'),'</strong><br />','<span id="checkIn"></span>','</p>','<p id="checkOutContainer">','<strong>',_('Check Out:'),'</strong><br />','<span id="checkOut"></span>','</p>','<p id="numNightsContainer">','<strong>',_('Number of Nights:'),'</strong><br />','<span id="numNights"></span>','</p>','<p id="roomTypeContainer">','<strong>',_('Suite Type:'),'</strong><br />','<span id="roomType"></span>','</p>','<p id="rateHeading">','<strong>',_('Your Rate / Package:'),'</strong>','</p>','<div id="rateIncludes"></div>','<a id="rateDetailsLink" href="#sideRateDetails">',_('Rate Details'),'</a>','<div class="wrapper" style="position:relative">','<div id="sideRateDetails" class="ipSideRateDetails">','<div class="wrapper">','<div class="popcont">','<div>','<div id="rateDetails" class="rateDetailsContent"></div>','</div>','</div>','</div>','</div>','</div>','<p id="subtotalContainer">','<strong>',_('Subtotal:'),'</strong><br />','<span id="subtotal"></span>','</p>','</div>','</div>'];ibe._proto=ibe.BookingAssistantModule.prototype;ibe.BookingAssistantModule.prototype={init:function(){var container=this.container;var selectors={panelsDiv:'#panels',totalCost:'#totalCost',total:'#total',currencyMessage:'#currencyMessage',fullPaymentMessage:'#fullPaymentMessage',multiBooking:'#multiBooking'};var panelSelectors={panelDiv:'#panel',name:'#name',checkIn:{container:'#checkInContainer',detail:'#checkIn'},checkOut:{container:'#checkOutContainer',detail:'#checkOut'},numNights:{container:'#numNightsContainer',detail:'#numNights'},roomType:{container:'#roomTypeContainer',detail:'#roomType'},rate:{heading:'#rateHeading',includes:'#rateIncludes',detailsLink:'#rateDetailsLink',details:'#rateDetails'},subtotal:{container:'#subtotalContainer',detail:'#subtotal'}};var rateOver=this.rateOver;var rateOut=this.rateOut;var rateClick=this.rateClick;var MAX_NUM_ROOMS=ibe.BookingController.MAX_NUM_ROOMS;var PANEL_TEMPLATE=ibe.BookingAssistantModule.PANEL_TEMPLATE;var elements,sidebar,panels,panelsDiv,eventInfo;var els,detailsLink,panel,i;if(this.hasModuleInit){return;}
if(!container){return;}
elements=jlib.Template.instantiate(ibe.BookingAssistantModule.TEMPLATE,container,selectors);sidebar=new SideBar();panels=[];panelsDiv=elements.panelsDiv;for(i=0;i<MAX_NUM_ROOMS;i++){els=jlib.Template.instantiate(PANEL_TEMPLATE,panelsDiv,panelSelectors,false,false,true);els.name.innerHTML=ibe.BookingController.getSuiteName(i);detailsLink=els.rate.detailsLink;ibe.Misc.workAroundInlinePopups(detailsLink);jlib.contrib.Events.addListener(detailsLink,'mouseover',rateOver,null,eventInfo);jlib.contrib.Events.addListener(detailsLink,'mouseout',rateOut,null,eventInfo);jlib.contrib.Events.addListener(detailsLink,'click',rateClick,null,eventInfo);panel=new Panel(els.panelDiv,false);sidebar.addPanel(panel);panel.setParent(sidebar);els.panel=panel;panels.push(els);}
elements.sidebar=sidebar;elements.panels=panels;elements.eventInfo=eventInfo;this.elements=elements;this.hasModuleInit=true;},uninit:function(){var elements=this.elements;if(!this.hasModuleInit){return;}
jlib.contrib.Events.removeListeners(elements.eventInfo);if(this.ticket){this.ticket.cancel();}
this.elements=null;this.hasModuleInit=false;this.ticket=null;},redraw:function(doShow){var me=this;var curRates=Function.getHiddenArgument(arguments,0);var stateInfo=this.stateInfo;var elements=this.elements;var state=this.state;var info=this.info;var preferredCurrency=ibe.BookingController.preferredCurrency;var MAX_NUM_ROOMS=ibe.BookingController.MAX_NUM_ROOMS;var rooms,version,curRoom,step,len;var reqs,panels,els,has,first,hasTotal;var hotel,arr,dep,room,rateCode,rateStart,currency,curRate,hotelInfo,roomInfo,rateInfo;var isExpandCurrentPanel,panel,el,r,n,s,i;var sidebar,wrapper;reposAfterEvent();if(jlib.ekhr_version<2&&jlib.contrib.BrowserDetect.browser.indexOf('Firefox')!=-1){sidebar=document.getElementById('sidebar');if(sidebar){wrapper=sidebar.getElementsByTagName('div')[0];if(wrapper){sidebar.style.height=wrapper.offsetHeight+'px';}}}
if(!doShow){jlib.ClassName.add(this.container,'hidden');return;}
if(this.ticket){this.ticket.cancel();this.ticket=null;}
this.mediator.alert(this,jlib.hessian.Mediator.MESSAGE_LOADING);rooms=info.rooms;version=info.version;curRoom=info.currentRoom;step=rooms[curRoom].step;len=state.getNumRooms();if(!curRates){reqs=new jlib.OrderedObject();hasTotal=false;for(i=0;i<len;i++){arr=state.get(i,ibe.BookingState.ARRIVAL_DATE);dep=state.get(i,ibe.BookingState.DEPARTURE_DATE);room=state.get(i,ibe.BookingState.ROOM_TYPE);rateCode=state.get(i,ibe.BookingState.RATE_CODE);rateStart=state.get(i,ibe.BookingState.RATE_START_DATE);rateInfo=stateInfo.getSession(state,rooms[i].rateKey);currency=(rateInfo)?rateInfo.currency:null;if(!arr||!dep||room==null||rateCode==null||!rateStart||!currency){continue;}
hasTotal=true;if(currency==preferredCurrency||reqs.getValue(currency)){continue;}
reqs.push(currency,{method:'getExchangeRate',arguments:[version,currency,preferredCurrency],preprocessor:ibe.WBE.zeroPreprocessor});}
if(hasTotal){currency=info.currency;if(currency&&currency!=preferredCurrency&&!reqs.getValue(currency)){reqs.push(currency,{method:'getExchangeRate',arguments:[version,currency,preferredCurrency],preprocessor:ibe.WBE.zeroPreprocessor});}}
if(reqs.length>0){this.ticket=ibe.WBE.doMultiple(reqs,null,function(responses){me.ticket=null;me.redraw(true,responses);});return;}else{curRates=new jlib.OrderedObject();}}
curRates.push(preferredCurrency,1);panels=elements.panels;hasTotal=false;for(i=0;i<MAX_NUM_ROOMS;i++){els=panels[i];if(i>=len){jlib.ClassName.add(els.panelDiv,'hidden');continue;}
hotel=state.get(i,ibe.BookingState.HOTEL_ID);arr=state.get(i,ibe.BookingState.ARRIVAL_DATE);dep=state.get(i,ibe.BookingState.DEPARTURE_DATE);room=state.get(i,ibe.BookingState.ROOM_TYPE);rateCode=state.get(i,ibe.BookingState.RATE_CODE);rateStart=state.get(i,ibe.BookingState.RATE_START_DATE);r=rooms[i];has={checkIn:!!arr,checkOut:!!dep,numNights:(arr&&dep),roomType:(room!=null),rate:(rateCode!=null),subtotal:(arr&&dep&&room!=null&&rateCode!=null&&rateStart)};first=null;if(has.checkIn){els.checkIn.detail.innerHTML=jlib.Locale.getLocaleDate(arr);if(!first){first=els.checkIn.container;}}
if(has.checkOut){els.checkOut.detail.innerHTML=jlib.Locale.getLocaleDate(dep);if(!first){first=els.checkOut.container;}}
if(has.numNights){n=Math.round((dep-arr)/86400000);els.numNights.detail.innerHTML=n+' '+((n!=1)?_('Nights'):_('Night'));if(!first){first=els.numNights.container;}}
if(has.roomType){roomInfo=stateInfo.getSession(state,r.roomCacheKey);els.roomType.detail.innerHTML=roomInfo.name;if(!first){first=els.roomType.container;}}
if(has.rate){rateInfo=stateInfo.getSession(state,r.rateKey);s=[];if(rateInfo.isWithBAR){s.push('<strong>',rateInfo.barNameWithoutOccupancy,'</strong>','<div>',rateInfo.barIncludes,'</div>');}
s.push('<strong>',rateInfo.nameWithoutOccupancy,'</strong>','<div>',rateInfo.includes,'</div>');els.rate.includes.innerHTML=s.join('');if(!first){first=els.rate.heading;}}
if(has.subtotal){els.rate.details.innerHTML=rateInfo.paymentPolicy+
rateInfo.cancellationPolicy;currency=rateInfo.currency;curRate=curRates.getValue(currency);els.subtotal.detail.innerHTML=jlib.Locale.getConvertedAmount(currency,rateInfo.total,preferredCurrency,curRate);if(!first){first=els.subtotal.container;}
hotelInfo=stateInfo.getSession(state,r.hotelCacheKey);hasTotal=true;}
for(n in has){el=els[n].container;if(!el){continue;}
jlib.ClassName.toggle(el,'hidden',!has[n]);jlib.ClassName.toggle(el,'first',(el==first));}
el=els.rate.heading;jlib.ClassName.toggle(el,'hidden',!has.rate);jlib.ClassName.toggle(el,'first',(el==first));jlib.ClassName.toggle(els.rate.includes,'hidden',!has.rate);jlib.ClassName.toggle(els.rate.detailsLink,'hidden',!has.subtotal);jlib.ClassName.toggle(els.panelDiv,'empty',!first);jlib.ClassName.remove(els.panelDiv,'hidden');}
if(hasTotal){currency=info.currency;curRate=curRates.getValue(currency);elements.total.innerHTML=jlib.Locale.getConvertedAmount(currency,info.total,preferredCurrency,curRate);jlib.ClassName.toggle(elements.currencyMessage,'hidden',!(preferredCurrency!=currency&&Number.isReal(curRate)&&curRate>0));jlib.ClassName.toggle(elements.fullPaymentMessage,'hidden',!hotelInfo.showFullPaymentMessage);}
isExpandCurrentPanel=(step<ibe.BookingController.STEP_USER_INFO||step==ibe.BookingController.STEP_REVIEW_INFO||step==ibe.BookingController.STEP_CONFIRMATION);els=elements.panels;for(i=0;i<len;i++){els[i].panel.collapse();}
if(isExpandCurrentPanel){panel=elements.panels[curRoom].panel;elements.sidebar.setCurrentPanel(panel);panel.expand();}
jlib.ClassName.toggle(elements.totalCost,'hidden',!hasTotal);jlib.ClassName.toggle(elements.multiBooking,'hidden',(len>1));jlib.ClassName.remove(this.container,'hidden');this.mediator.unalert(this,jlib.hessian.Mediator.MESSAGE_LOADING);},rateOver:function(){ipsbOpen(this);},rateOut:function(){ipsbClose(this);},rateClick:function(e){if(e&&e.preventDefault){e.preventDefault();}}};ibe.BookingAssistantModule.prototype=Object.dup(ibe.BookingAssistantModule.prototype,ibe._proto);delete ibe._proto;ibe.BookingAssistantModule.prototype.doneLoading();if(!window.ibe){window.ibe={};}
ibe.TabNavModule=function(id,whiteboxId){if(!id){}
this.containerId=id;this.nextState=null;this.info=null;this.whiteboxId=whiteboxId;this.whitebox=null;this.createEventListeners();};ibe.TabNavModule.prototype=new jlib.hessian.Module('nextState','info');ibe.TabNavModule.prototype.constructor=ibe.TabNavModule;ibe.TabNavModule.prototype.isShowTime=function(){var info=this.info;var step=info.rooms[info.currentRoom].step;return(step<ibe.BookingController.STEP_USER_INFO||step==ibe.BookingController.STEP_REVIEW_INFO||step==ibe.BookingController.STEP_CONFIRMATION);};ibe.TabNavModule.prototype.toString=function(){return'[object ibe.TabNavModule]';};ibe.TabNavModule.TEMPLATE=['<ul>','<li class="tab1">','<span><img src="',_('/images/the-harbour/en/ibe/tabs/suite_one_off.gif'),'" alt="',_('Suite One'),'" class="tab" /></span>','<a href="#" class="closetab"><img src="',_('/images/the-harbour/en/ibe/tabs/close.gif'),'" alt="',_('Delete this Suite'),'" /></a>','</li>','<li class="tab2">','<span><img src="',_('/images/the-harbour/en/ibe/tabs/suite_two_off.gif'),'" alt="',_('Suite Two'),'" class="tab" /></span>','<a href="#" class="closetab"><img src="',_('/images/the-harbour/en/ibe/tabs/close.gif'),'" alt="',_('Delete this Suite'),'" /></a>','</li>','<li class="tab3">','<span><img src="',_('/images/the-harbour/en/ibe/tabs/suite_three_off.gif'),'" alt="',_('Suite Three'),'" class="tab" /></span>','<a href="#" class="closetab"><img src="',_('/images/the-harbour/en/ibe/tabs/close.gif'),'" alt="',_('Delete this Suite'),'" /></a>','</li>','<li class="tab4">','<span><img src="',_('/images/the-harbour/en/ibe/tabs/suite_four_off.gif'),'" alt="',_('Suite Four'),'" class="tab" /></span>','<a href="#" class="closetab"><img src="',_('/images/the-harbour/en/ibe/tabs/close.gif'),'" alt="',_('Delete this Suite'),'" /></a>','</li>','<li class="tab5">','<span><img src="',_('/images/the-harbour/en/ibe/tabs/suite_five_off.gif'),'" alt="',_('Suite Five'),'" class="tab" /></span>','<a href="#" class="closetab"><img src="',_('/images/the-harbour/en/ibe/tabs/close.gif'),'" alt="',_('Delete this Suite'),'" /></a>','</li>','</ul>'];ibe._proto=ibe.TabNavModule.prototype;ibe.TabNavModule.prototype={init:function(){var container=this.container;var selectors={tabs:'li',spans:'span',imgs:'img.tab',closeLinks:'a'};var click=this.click;var close=this.close;var elements,tabs,spans,imgs,closeLinks,closeProps,eventInfo;if(this.hasModuleInit){return;}
if(!container){return;}
elements=jlib.Template.instantiate(ibe.TabNavModule.TEMPLATE,container,selectors);tabs=elements.tabs;spans=elements.spans;imgs=elements.imgs;closeLinks=elements.closeLinks;closeProps={owner:this};eventInfo=[];elements.tabs.forEach(function(tab,i){var span=spans[i];var img=imgs[i];var closeLink=closeLinks[i];var link,src;link=jlib.Template.createLink(click,{owner:this,index:i},span.childNodes);tab.replaceChild(link,span);src=img.src;img.offSrc=src;img.currentSrc=src.replace('_off','_current');img.errorSrc=src.replace('_off','_error');img.inactiveSrc=src;jlib.contrib.Events.addListener(closeLink,'click',close,closeProps,eventInfo);tab.link=link;tab.img=img;tab.closeLink=closeLink;},this);if(this.whiteboxId){this.whitebox=document.getElementById(this.whiteboxId);}
elements.eventInfo=eventInfo;this.elements=elements;this.hasModuleInit=true;},uninit:function(){var elements=this.elements;if(!this.hasModuleInit){return;}
jlib.contrib.Events.removeListeners(elements.eventInfo);elements.tabs.forEach(function(tab){tab.link.uninit();tab.closeLink.state=null;tab.link=null;tab.img=null;tab.closeLink=null;});this.elements=null;this.whitebox=null;this.hasModuleInit=false;},redraw:function(doShow){var me=this;var stateInfo=this.stateInfo;var elements=this.elements;var state=this.state;var info=this.info;var whitebox=this.whitebox;var rooms,curRoom,step,len;var tabs,tabLen,href,canClose;var isCurrent,isError,hasClose,closeState;var tab,link,img,closeLink,i;if(whitebox){jlib.ClassName.toggle(whitebox,'withTabs',doShow);jlib.ClassName.toggle(whitebox,'withSteps',!doShow);}
if(!doShow){jlib.ClassName.add(this.container,'hidden');return;}
rooms=info.rooms;curRoom=info.currentRoom;step=rooms[curRoom].step;len=state.getNumRooms();tabs=elements.tabs;tabLen=tabs.length;href='#'+state;canClose=(step<ibe.BookingController.STEP_CONFIRMATION);for(i=0;i<tabLen;i++){tab=tabs[i];if(i<len){link=tab.link;img=tab.img;closeLink=tab.closeLink;isCurrent=(i==curRoom);isError=(rooms[i].errorMessage&&!stateInfo.getSpecific(state,'tabNav_seenErrorMessage'+i));hasClose=(canClose&&isCurrent&&len>1);link.toggle(!isCurrent);link.href=href;jlib.ClassName.toggle(link.span,'current',isCurrent);jlib.ClassName.toggle(link,'error',(!isCurrent&&isError));jlib.ClassName.toggle(link,'off',(!isCurrent&&!isError));if(isCurrent){img.src=img.currentSrc;}else if(isError){img.src=img.errorSrc;}else{img.src=img.offSrc;}
if(hasClose){closeState=new ibe.BookingState(state);closeState.remove(i);closeLink.state=closeState;closeLink.href='#'+closeState;}
jlib.ClassName.toggle(closeLink,'hidden',!hasClose);if(isCurrent&&isError){stateInfo.setSpecific(state,'tabNav_seenErrorMessage'+i,true);}}
jlib.ClassName.toggle(tab,'hidden',(i>=len));}
jlib.ClassName.remove(this.container,'hidden');},click:function(e){var tabNav=this.owner;var index=this.index;tabNav.stateInfo.setPersistent(tabNav.state,'currentRoom',index);tabNav.info.currentRoom=index;jlib.contrib.Events.dispatch(tabNav,'redraw',{});if(e&&e.preventDefault){e.preventDefault();}},close:function(){var tabNav=this.owner;jlib.contrib.Events.dispatch(tabNav,'beforechange',{state:this.state,prevState:tabNav.state,info:{doRemoveRoom:true}});}};ibe.TabNavModule.prototype=Object.dup(ibe.TabNavModule.prototype,ibe._proto);delete ibe._proto;ibe.TabNavModule.prototype.doneLoading();if(!window.ibe){window.ibe={};}
ibe.UserCodeModule=function(){this.nextState=null;this.info=null;this.doShow=false;this.isEnter=true;this.focusId=null;this.createEventListeners();};ibe.UserCodeModule.prototype=new jlib.hessian.Module('nextState','info');ibe.UserCodeModule.prototype.constructor=ibe.UserCodeModule;ibe.UserCodeModule.prototype.isShowTime=function(){var info=this.info;var step=info.rooms[info.currentRoom].step;return(step<ibe.BookingController.STEP_GUEST_INFO);};ibe.UserCodeModule.prototype.toString=function(){return'[object ibe.UserCodeModule]';};ibe.UserCodeModule.TEMPLATE=['<div class="close"><a id="close" href="#"><img src="',_('/images/the-harbour/dropbox_close.gif'),'" alt="',_('Close'),'" /></a></div>','<div class="title">','<img id="enterTitle" src="',_('/images/the-harbour/en/ibe/titles/enter_rate_code.gif'),'" alt="',_('Enter Rate Code'),'" />','<img id="clearTitle" class="hidden" src="',_('/images/the-harbour/en/ibe/titles/clear_rate_code.gif'),'" alt="',_('Clear Rate Code'),'" />','</div>','<div id="errorMessage" class="error hidden">',_('Please enter a rate code.'),'</div>','<div id="enterContent" class="enterContent">','<div>',_('Your code will apply to all suites.'),'</div>','<div class="input"><input type="text" value="" maxlength="255" id="enterCode" class="text" /></div>','<div>','<input id="corporate" class="radio" type="radio" name="codeType" value="c" checked="checked" />','<label for="corporate">',_('Corporate Code'),'</label>','</div>','<div>','<input id="promotion" class="radio" type="radio" name="codeType" value="p" />','<label for="promotion">',_('Promotional Code'),'</label>','</div>','<div class="remark">',_('Clicking the "Enter" button would reset the booking process'),'</div>','</div>','<div id="clearContent" class="clearRemark">',_('Clicking the "Continue" button would reset the booking process for all previously selected suites.'),'<br />',_('Are you sure you want to clear the '),'<span id="clearType"></span> <span id="clearCode"></span> ?','</div>','<div class="actions">','<a id="cancel" href="#"><img src="',_('/images/the-harbour/en/ibe/form/cancel.gif'),'" alt="',_('Cancel'),'" /></a> ','<a id="enter" href="#" class="continue"><img src="',_('/images/the-harbour/en/ibe/form/enter.gif'),'" alt="',_('Enter'),'" /></a>','<a id="clear" href="#" class="continue hidden"><img src="',_('/images/the-harbour/en/ibe/form/continue.gif'),'" alt="',_('Continue'),'" /></a>','</div>'];ibe._proto=ibe.UserCodeModule.prototype;ibe.UserCodeModule.prototype={init:function(){var selectors={enter:{title:'#enterTitle',content:'#enterContent',code:'#enterCode',corporate:'#corporate',promotion:'#promotion',button:'#enter'},clear:{title:'#clearTitle',content:'#clearContent',type:'#clearType',code:'#clearCode',button:'#clear'},errorMessage:'#errorMessage',close:'#close',cancel:'#cancel'};var update=this.update;var click=this.click;var container,elements,enter,code,wrappers,eventInfo,wrapper,props,i;if(this.hasModuleInit){return;}
container=document.createElement('div');jlib.ClassName.add(container,'pucontainer');elements=jlib.Template.instantiate(ibe.UserCodeModule.TEMPLATE,container,selectors);enter=elements.enter;code=enter.code;wrappers={code:new jlib.hessian.FormFieldWrapper(this,code,'code'),type:new jlib.hessian.FormFieldWrapper(this,{corporate:enter.corporate,promotion:enter.promotion},'type',true)};for(i in wrappers){wrapper=wrappers[i];wrapper.init();wrapper.bind();}
enter.wrappers=wrappers;eventInfo=[];props={owner:this};jlib.contrib.Events.addListener(wrappers.code,'change',update,null,eventInfo);jlib.contrib.Events.addListener(wrappers.type,'change',update,null,eventInfo);[enter.button,elements.clear.button,elements.close,elements.cancel].forEach(function(link){jlib.contrib.Events.addListener(link,'click',click,props,eventInfo);});elements.eventInfo=eventInfo;this.elements=elements;this.hasModuleInit=true;this.container=container;},uninit:function(){var elements=this.elements;var wrappers=elements.enter.wrappers;var focusId=this.focusId;var wrapper,i;if(!this.hasModuleInit){return;}
if(focusId){this.mediator.blur(focusId);}
jlib.contrib.Events.removeListeners(elements.eventInfo);for(i in wrappers){wrapper=wrappers[i];wrapper.unbind();wrapper.uninit();}
this.elements=null;this.hasModuleInit=false;this.doShow=false;this.isEnter=true;this.focusId=null;this.container=null;},redraw:function(doShow){var focusId=this.focusId;var enter,el,i;if(!this.hasModuleInit){return;}
enter=this.elements.enter;for(i in enter){el=enter[i];if(el.blur){el.blur();}}
if(focusId){this.mediator.blur(focusId);this.focusId=null;}
this.doShow=doShow;},getText:function(state){var userCode,userCodeType;var label='';var link=_('Enter Rate Code');state=new ibe.BookingState(state);userCode=state.get(null,ibe.BookingState.USER_CODE);userCodeType=state.get(null,ibe.BookingState.USER_CODE_TYPE);if(userCode&&userCodeType){label=this.getLabel(userCodeType)+' '+userCode;link=_('Clear');}
return{label:label,link:link};},show:function(){var stateInfo=this.stateInfo;var container=this.container;var elements=this.elements;var state=this.state;var info=this.info;var curRoom=info.currentRoom;var newState=new ibe.BookingState(this.nextState);var enter=elements.enter;var clear=elements.clear;var wrappers=enter.wrappers;var HOTEL_ID=ibe.BookingState.HOTEL_ID;var USER_CODE=ibe.BookingState.USER_CODE;var USER_CODE_TYPE=ibe.BookingState.USER_CODE_TYPE;var userCode,userCodeType,isEnter,hotel,hotelInfo,len,i;if(!this.doShow){return;}
userCode=state.get(null,USER_CODE);userCodeType=state.get(null,USER_CODE_TYPE);isEnter=(!userCode||!userCodeType);hotel=state.get(curRoom,HOTEL_ID);len=newState.getNumRooms();for(i=len-1;i>=0;i--){newState.remove(i);}
newState.set(null,USER_CODE,null);newState.set(null,USER_CODE_TYPE,null);newState.set(0,HOTEL_ID,hotel);if(isEnter){wrappers.code.setDefault();wrappers.type.setDefault();hotelInfo=stateInfo.getSession(state,info.rooms[curRoom].hotelCacheKey);enter.button.newState=newState;this.update({owner:this});}else{clear.code.innerHTML=userCode;clear.type.innerHTML=this.getLabel(userCodeType);clear.button.href='#'+newState;}
this.isEnter=isEnter;['title','content','button'].forEach(function(name){jlib.ClassName.toggle(enter[name],'hidden',!isEnter);jlib.ClassName.toggle(clear[name],'hidden',isEnter);});jlib.ClassName.add(elements.errorMessage,'hidden');this.focusId=this.mediator.focus(container);if(isEnter&&enter.code.focus){enter.code.focus();}
ibe.Misc.scrollTo(container);jlib.contrib.Events.dispatch(this,'enter',{});},update:function(e){var owner=e.owner;var enter=owner.elements.enter;var wrappers=enter.wrappers;var button=enter.button;var newState=new ibe.BookingState(button.newState);var userCode=wrappers.code.getValue();var userCodeType=wrappers.type.getValue();newState.set(null,ibe.BookingState.USER_CODE,((userCode)?userCode:null));newState.set(null,ibe.BookingState.USER_CODE_TYPE,userCodeType);button.href='#'+newState;},click:function(e){var userCode=this.owner;var elements=userCode.elements;var enter=elements.enter;var clear=elements.clear;var wrappers=enter.wrappers;var code=enter.code;var isEnter=userCode.isEnter;var isContinue=(this==enter.button||this==clear.button);var newInfo={doRemoveAllRooms:true};var hasError=false;var href=this.href;var el,i;if(isEnter&&isContinue){hasError=!code.value;jlib.ClassName.toggle(elements.errorMessage,'hidden',!hasError);}
if(hasError){if(code.focus){code.focus();}
if(e&&e.preventDefault){e.preventDefault();}
return;}
if(isEnter){for(i in enter){el=enter[i];if(el.blur){el.blur();}}}
userCode.mediator.blur(userCode.focusId);userCode.focusId=null;jlib.contrib.Events.dispatch(userCode,'leave',{isCompleted:isContinue});if(isContinue){jlib.contrib.Events.dispatch(userCode,'beforechange',{state:href.substring(href.indexOf('#')+1),prevState:userCode.state,info:newInfo});}else{if(e&&e.preventDefault){e.preventDefault();}}},getLabel:function(type){var label='';switch(type){case ibe.BookingState.USER_CODE_TYPE_CORPORATE:label=_('Corporate Code:');break;case ibe.BookingState.USER_CODE_TYPE_IATA:label=_('IATA Code:');break;case ibe.BookingState.USER_CODE_TYPE_PROMOTION:label=_('Promotional Code:');break;}
return label;}};ibe.UserCodeModule.prototype=Object.dup(ibe.UserCodeModule.prototype,ibe._proto);delete ibe._proto;ibe.UserCodeModule.prototype.doneLoading();if(!window.ibe){window.ibe={};}
ibe.CalendarModule=function(id){if(!id){}
this.containerId=id;this.nextState=null;this.info=null;this.userCodeModule=null;this.ticket=null;this.createEventListeners();};ibe.CalendarModule.prototype=new jlib.hessian.Module('nextState','info');ibe.CalendarModule.prototype.constructor=ibe.CalendarModule;ibe.CalendarModule.prototype.isShowTime=function(){var info=this.info;var step=info.rooms[info.currentRoom].step;return(step==ibe.BookingController.STEP_CHECK_IN||step==ibe.BookingController.STEP_CHECK_OUT||step==ibe.BookingController.STEP_DATE_CONFIRM);};ibe.CalendarModule.prototype.setUserCodeModule=function(module){this.userCodeModule=module;};ibe.CalendarModule.prototype.toString=function(){return'[object ibe.CalendarModule]';};if(!window.ibe){window.ibe={};}
ibe.RoomTypeModule=function(id,flashDetails){if(!id){}
if(!flashDetails){}
this.containerId=id;this.nextState=null;this.info=null;this.flashDetails=flashDetails;this.openContainer=null;this.userCodeModule=null;this.ticket=null;this.createEventListeners();};ibe.RoomTypeModule.prototype=new jlib.hessian.Module('nextState','info');ibe.RoomTypeModule.prototype.constructor=ibe.RoomTypeModule;ibe.RoomTypeModule.prototype.isShowTime=function(){var info=this.info;var step=info.rooms[info.currentRoom].step;return(step==ibe.BookingController.STEP_ROOM_TYPE);};ibe.RoomTypeModule.prototype.setUserCodeModule=function(module){this.userCodeModule=module;};ibe.RoomTypeModule.prototype.toString=function(){return'[object ibe.RoomTypeModule]';};if(!window.ibe){window.ibe={};}
ibe.RatesPackagesModule=function(id,flashDetails){if(!id){}
if(!flashDetails){}
this.containerId=id;this.nextState=null;this.info=null;this.flashDetails=flashDetails;this.openContainer=null;this.findContainer=null;this.findState=null;this.userCodeModule=null;this.focusId=null;this.ticket=null;this.createEventListeners();};ibe.RatesPackagesModule.prototype=new jlib.hessian.Module('nextState','info');ibe.RatesPackagesModule.prototype.constructor=ibe.RatesPackagesModule;ibe.RatesPackagesModule.prototype.isShowTime=function(){var info=this.info;var step=info.rooms[info.currentRoom].step;return(step==ibe.BookingController.STEP_RATE_CODE||step==ibe.BookingController.STEP_RATE_START);};ibe.RatesPackagesModule.prototype.setUserCodeModule=function(module){this.userCodeModule=module;};ibe.RatesPackagesModule.prototype.toString=function(){return'[object ibe.RatesPackagesModule]';};if(!window.ibe){window.ibe={};}
ibe.GuestInformationModule=function(id){if(!id){}
this.containerId=id;this.nextState=null;this.info=null;this.ticket=null;this.createEventListeners();};ibe.GuestInformationModule.prototype=new jlib.hessian.Module('nextState','info');ibe.GuestInformationModule.prototype.constructor=ibe.GuestInformationModule;ibe.GuestInformationModule.prototype.isShowTime=function(){var info=this.info;var step=info.rooms[info.currentRoom].step;return(step==ibe.BookingController.STEP_GUEST_INFO);};ibe.GuestInformationModule.prototype.toString=function(){return'[object ibe.GuestInformationModule]';};if(!window.ibe){window.ibe={};}
ibe.UserInformationModule=function(id){if(!id){}
this.containerId=id;this.nextState=null;this.info=null;this.ticket=null;this.createEventListeners();};ibe.UserInformationModule.prototype=new jlib.hessian.Module('nextState','info');ibe.UserInformationModule.prototype.constructor=ibe.UserInformationModule;ibe.UserInformationModule.prototype.isShowTime=function(){var info=this.info;var step=info.rooms[info.currentRoom].step;return(step==ibe.BookingController.STEP_USER_INFO);};ibe.UserInformationModule.prototype.toString=function(){return'[object ibe.UserInformationModule]';};if(!window.ibe){window.ibe={};}
ibe.ReviewInformationModule=function(id,helperId){if(!id||!helperId){}
this.containerId=id;this.nextState=null;this.info=null;this.helperContainerId=helperId;this.helperContainer=null;this.focusId=null;this.ticket=null;this.createEventListeners();};ibe.ReviewInformationModule.prototype=new jlib.hessian.Module('nextState','info');ibe.ReviewInformationModule.prototype.constructor=ibe.ReviewInformationModule;ibe.ReviewInformationModule.prototype.isShowTime=function(){var info=this.info;var step=info.rooms[info.currentRoom].step;return(step==ibe.BookingController.STEP_REVIEW_INFO||step==ibe.BookingController.STEP_CONFIRMATION);};ibe.ReviewInformationModule.prototype.toString=function(){return'[object ibe.ReviewInformationModule]';};if(!window.ibe){window.ibe={};}
ibe.CurrencyConvertModule=function(id){if(!id){}
this.containerId=id;this.nextState=null;this.info=null;this.optMessage=null;this.optArray=null;this.optRestore=null;this.ticket=null;this.createEventListeners();};ibe.CurrencyConvertModule.prototype=new jlib.hessian.Module('nextState','info');ibe.CurrencyConvertModule.prototype.constructor=ibe.CurrencyConvertModule;ibe.CurrencyConvertModule.prototype.isShowTime=function(){var info=this.info;var step=info.rooms[info.currentRoom].step;return(step<=ibe.BookingController.STEP_REVIEW_INFO);};ibe.CurrencyConvertModule.prototype.toString=function(){return'[object ibe.CurrencyConvertModule]';};if(!window.ibe){window.ibe={};}
ibe.PaymentInformationModule=function(id){if(!id){}
this.containerId=id;this.nextState=null;this.info=null;this.reservationNumber=null;this.createEventListeners();};ibe.PaymentInformationModule.prototype=new jlib.hessian.Module('nextState','info');ibe.PaymentInformationModule.prototype.constructor=ibe.PaymentInformationModule;ibe.PaymentInformationModule.prototype.isShowTime=function(){var info=this.info;var step=info.rooms[info.currentRoom].step;return(step==ibe.BookingController.STEP_PAYMENT_INFO);};ibe.PaymentInformationModule.prototype.toString=function(){return'[object ibe.PaymentInformationModule]';};if(!window.ibe){window.ibe={};}
ibe.ConfirmationMsgModule=function(id){if(!id){}
this.containerId=id;this.nextState=null;this.info=null;this.confirmationModule=null;this.createEventListeners();};ibe.ConfirmationMsgModule.prototype=new jlib.hessian.Module('nextState','info');ibe.ConfirmationMsgModule.prototype.constructor=ibe.ConfirmationMsgModule;ibe.ConfirmationMsgModule.prototype.isShowTime=function(){var info=this.info;var step=info.rooms[info.currentRoom].step;return(step==ibe.BookingController.STEP_CONFIRMATION||step==ibe.BookingController.STEP_EMAIL_ITINERARY||step==ibe.BookingController.STEP_EMAIL_ITINERARY_CONFIRM);};ibe.ConfirmationMsgModule.prototype.setConfirmationModule=function(module){this.confirmationModule=module;};ibe.ConfirmationMsgModule.prototype.toString=function(){return'[object ibe.ConfirmationMsgModule]';};if(!window.ibe){window.ibe={};}
ibe.EmailItineraryModule=function(id){if(!id){}
this.containerId=id;this.nextState=null;this.info=null;this.createEventListeners();};ibe.EmailItineraryModule.prototype=new jlib.hessian.Module('nextState','info');ibe.EmailItineraryModule.prototype.constructor=ibe.EmailItineraryModule;ibe.EmailItineraryModule.prototype.isShowTime=function(){var info=this.info;var step=info.rooms[info.currentRoom].step;return(step==ibe.BookingController.STEP_EMAIL_ITINERARY||step==ibe.BookingController.STEP_EMAIL_ITINERARY_CONFIRM);};ibe.EmailItineraryModule.prototype.toString=function(){return'[object ibe.EmailItineraryModule]';};if(!window.ibe){window.ibe={};}
ibe.FootNoteModule=function(id){if(!id){}
this.containerId=id;this.nextState=null;this.info=null;this.createEventListeners();};ibe.FootNoteModule.prototype=new jlib.hessian.Module('nextState','info');ibe.FootNoteModule.prototype.constructor=ibe.FootNoteModule;ibe.FootNoteModule.prototype.isShowTime=function(){var info=this.info;var step=info.rooms[info.currentRoom].step;return(step==ibe.BookingController.STEP_PAYMENT_INFO);};ibe.FootNoteModule.prototype.toString=function(){return'[object ibe.FootNoteModule]';};