// Emirates Hotels & Resorts Internet Booking Engine
//
// $Id$

if(!window.ibe){window.ibe={};}
if(!ibe.WBE){ibe.WBE={};}
ibe.WBE.COOKIE_NAME='wbe';ibe.WBE.COOKIE_CHAR_ALL_AVAILABLE='X';ibe.WBE.COOKIE_CHAR_ALL_NOT_AVAILABLE='Y';ibe.WBE.COOKIE_CHAR_UNKNOWN='_';ibe.WBE.doCaching=false;ibe.WBE.setObjCookie=function(name,obj){var cookie;if(!name||!obj){return false;}
cookie=jlib.JSON.serializeToString(obj);if(!cookie||cookie.length>3750){return false;}
jlib.Cookie.set(name,cookie,null,null,'/');return true;};ibe.WBE.getObjCookie=function(name){var cookie,obj;if(!name){return null;}
cookie=jlib.Cookie.get(name);if(cookie==null){return null;}
obj=jlib.JSON.parseFromString(cookie);if(!obj){jlib.Cookie.set(name,null,null,null,'/');return null;}
return obj;};ibe.WBE.removeObjCookie=function(name){if(!name){return false;}
jlib.Cookie.set(name,null,null,null,'/');};ibe.WBE.cacheHotelInformation=function(){var hotels,roomTypes,hotelTimes,list,version;if(!this.doCaching){return;}
hotels=this.hotels;roomTypes=this.roomTypes;hotelTimes=this.hotelTimes;list=[];for(version in hotels){hotels[version].forEach(function(a){var hotel=a[0];var info={v:version,h:hotel,hn:a[1].name};var key=version+'_'+hotel;var rooms=roomTypes[key];var time=hotelTimes[key];var ro,rn;if(rooms){ro=[];rn={};rooms.forEach(function(b){var id=b[0];ro.push(id);rn[id]=b[1].name;});info.ro=ro;info.rn=rn;}
if(time){info.d=time.delta;}
list.push(info);});}
this.setObjCookie(ibe.WBE.COOKIE_NAME,list);};ibe.WBE.restoreHotelInformation=function(){var HOTEL_TEMPLATE=ibe.WBE.HOTEL_TEMPLATE;var HOTEL_VALUES=ibe.WBE.HOTEL_VALUES;var cookieName,list,hotels,roomTypes,hotelTimes,key;var info,v,h,hn,ro,rn,d,rooms,missingId,now,len,i;if(!this.doCaching){return;}
cookieName=ibe.WBE.COOKIE_NAME;list=this.getObjCookie(cookieName);if(!list){return;}
if(!(list instanceof Array)){this.removeObjCookie(cookieName);return;}
hotels={};roomTypes={};hotelTimes={};len=list.length;for(i=0;i<len;i++){info=list[i];if(typeof info!='object'){this.removeObjCookie(cookieName);return;}
v=info.v;h=info.h;hn=info.hn;ro=info.ro;rn=info.rn;d=info.d;if(!v||h==null){this.removeObjCookie(cookieName);return;}
if((ro&&!rn)||(!ro&&rn)){this.removeObjCookie(cookieName);return;}
if(!hotels[v]){hotels[v]=new jlib.OrderedObject();}
hotels[v].push(h,Object.dup(HOTEL_VALUES[h],{name:hn},HOTEL_TEMPLATE,{}));key=v+'_'+h;if(ro&&rn){if(!(ro instanceof Array)||typeof rn!='object'){this.removeObjCookie(cookieName);return;}
rooms=new jlib.OrderedObject();ro.forEach(function(id){var name=rn[id];if(!name){missingId=id;}
rooms.push(id,{name:name,fullName:'',minOccupancy:1,maxOccupancy:1,maxExtraBeds:0,maxExtraBedsMessage:'',currency:'',currencyId:'',ratesFrom:0,descriptionShort:'',maxOccupancyText:'',teaserPath:'',teaserAlt:'',overview:'',description:'',assetPath:'',assetId1:'',assetId2:'',assetId3:'',assetId4:'',assetId5:'',url:'',onRequest:false});delete rn[id];});if(missingId){this.removeObjCookie(cookieName);return;}
for(missingId in rn){this.removeObjCookie(cookieName);return;}
roomTypes[key]=rooms;}
if(d!=null){if(typeof d!='number'){this.removeObjCookie(cookieName);return;}
now=new Date();now.setTime(now.getTime()+d);hotelTimes[key]=this.hotelTimeProcess(now);}}
Object.dup(hotels,this.hotels);Object.dup(roomTypes,this.roomTypes);Object.dup(hotelTimes,this.hotelTimes);};ibe.WBE.encodeDates=function(dates){var buf=[];var COOKIE_CHAR_ALL_AVAILABLE=ibe.WBE.COOKIE_CHAR_ALL_AVAILABLE;var COOKIE_CHAR_ALL_NOT_AVAILABLE=ibe.WBE.COOKIE_CHAR_ALL_NOT_AVAILABLE;var COOKIE_CHAR_UNKNOWN=ibe.WBE.COOKIE_CHAR_UNKNOWN;var from,to,nextMonth,isAllAvailable,isAllNotAvailable,isDone;var m,n,d,i,j;if(!dates){return null;}
from='99999999';to='00000000';for(i in dates){if(i<from){from=i;}
if(i>to){to=i;}}
if(from=='99999999'||to=='00000000'){return null;}
from=Date.parseISODate(from);to=Date.parseISODate(to);to.addDate(1);nextMonth=new Date(from);nextMonth.addMonth(1);for(m=new Date(from);m<to;m.addMonth(1)){if(typeof dates[m.toISODateString()]!='undefined'){isAllAvailable=true;isAllNotAvailable=true;for(d=new Date(m);d<nextMonth;d.addDate(1)){if(!dates[d.toISODateString()]){isAllAvailable=false;}else{isAllNotAvailable=false;}
if(!isAllAvailable&&!isAllNotAvailable){break;}}
if(isAllAvailable){buf.push(COOKIE_CHAR_ALL_AVAILABLE);}else if(isAllNotAvailable){buf.push(COOKIE_CHAR_ALL_NOT_AVAILABLE);}else{isDone=false;d=new Date(m);for(i=0;i<8;i++){n=0;for(j=3;j>=0;j--){if(dates[d.toISODateString()]){n=n|(1<<j);}
d.addDate(1);if(d>=nextMonth){isDone=true;break;}}
buf.push(n.toString(16));if(isDone){break;}}}}else{buf.push(COOKIE_CHAR_UNKNOWN);}
nextMonth.addMonth(1);}
return{str:buf.join(''),from:from};};ibe.WBE.decodeDates=function(from,str){var allAvailableRE=new RegExp(ibe.WBE.COOKIE_CHAR_ALL_AVAILABLE,'g');var allNotAvailableRE=new RegExp(ibe.WBE.COOKIE_CHAR_ALL_NOT_AVAILABLE,'g');var unknownRE=new RegExp(ibe.WBE.COOKIE_CHAR_UNKNOWN,'g');var dates,fragments,nextMonth,isDone,len,s,d,m,n,i,j,k;if(!from||!str){return null;}
s=str.toString().replace(allAvailableRE,'ffffffff').replace(allNotAvailableRE,'00000000').replace(unknownRE,'________').toLowerCase();if(s.length%8!=0){return null;}
if(s.search(/[^0-9a-f_]/)>-1){return null;}
fragments=s.match(/(.{8})/g);len=fragments.length;dates={};m=new Date(from);nextMonth=new Date(m);nextMonth.addMonth(1);for(k=0;k<len;k++){s=fragments[k];if(s!='________'){if(s.indexOf('_')>-1){return null;}
isDone=false;d=new Date(m);for(i=0;i<8;i++){n=parseInt(s.charAt(i),16);for(j=3;j>=0;j--){dates[d.toISODateString()]=!!(n&(1<<j));d.addDate(1);if(d>=nextMonth){isDone=true;break;}}
if(isDone){break;}}}
m.addMonth(1);nextMonth.addMonth(1);}
return dates;};ibe.WBE.cacheCheckInDates=function(){var dates,list,key,info,s;var info,hotelTime,from,to,avail,roomAvail;var s,r,i;if(!this.doCaching){return;}
dates=this.checkInDates;list=[];for(key in dates){s=this.encodeDates(dates[key]);if(!s){return;}
list.push({k:key,f:s.from.toISODateString(),s:s.str});}
this.setObjCookie(ibe.WBE.COOKIE_NAME+'_',list);};ibe.WBE.restoreCheckInDates=function(){var cookieName,list,checkInDates;var info,k,f,s,from,dates,len,i;if(!this.doCaching){return;}
cookieName=ibe.WBE.COOKIE_NAME+'_';list=this.getObjCookie(cookieName);if(!list){return;}
if(!(list instanceof Array)){this.removeObjCookie(cookieName);return;}
checkInDates={};len=list.length;for(i=0;i<len;i++){info=list[i];if(typeof info!='object'){this.removeObjCookie(cookieName);return;}
k=info.k;f=info.f;s=info.s;if(!k||!f||!s){this.removeObjCookie(cookieName);return;}
from=Date.parseISODate(f);if(!from){this.removeObjCookie(cookieName);return;}
dates=this.decodeDates(from,s);if(!dates){this.removeObjCookie(cookieName);return;}
checkInDates[k]=dates;}
Object.dup(checkInDates,this.checkInDates);};if(!window.ibe){window.ibe={};}
ibe.Standalone={calendarContainerId:'calendar',mediator:null,messenger:null,calendar:null,init:function(){var me=ibe.Standalone;var constants=ibe.constants;var wbeReq,mediator,messenger,calendar;if(window.initFormValidate){initFormValidate('calendar');}
wbeReq=jlib.RemoteXHR.Receiver.getRequestConstructor(constants.wbeRequester);ibe.WBE.init(constants.wbeWS,constants.wbeNS,function(){return new wbeReq();},true);mediator=new jlib.hessian.Mediator();messenger=new ibe.Messenger(constants.messengerContainerId);calendar=new ibe.StandaloneCalendarModule(me.calendarContainerId);mediator.setMessenger(messenger);mediator.setController(ibe.StandaloneController);mediator.addModule(calendar);mediator.messageDelay=50;mediator.init();me.mediator=mediator;me.messenger=messenger;me.calendar=calendar;},uninit:function(){var me=ibe.Standalone;var mediator=me.mediator;mediator.uninit();mediator.removeModule(me.calendar);mediator.setController(null);mediator.setMessenger(null);ibe.WBE.uninit();me.mediator=null;me.messenger=null;me.calendar=null;}};if(!window.ibe){window.ibe={};}
ibe.StandaloneController={HOTEL:null,ROOM_TYPE:null,HOTEL_ORDER:null,DEFAULT_TIME_HOTEL:null,mediator:null,initListener:function(){var me=ibe.StandaloneController;var state=new ibe.BookingState();var e;if(me.HOTEL!=null){state.set(0,ibe.BookingState.HOTEL_ID,me.HOTEL.toString());}
if(me.ROOM_TYPE!=null){state.set(0,ibe.BookingState.ROOM_TYPE,me.ROOM_TYPE.toString());}
e={state:state,info:{version:ibe.WBE.getNewVersion(),isHotel:(me.HOTEL!=null),hotelOrder:me.HOTEL_ORDER,defaultTimeHotel:me.DEFAULT_TIME_HOTEL}};setTimeout(function(){jlib.contrib.Events.dispatch(me,'update',e);},0);},toString:function(){return'[object ibe.StandaloneController]';}};window.po['/images/the-harbour/dropmenu_up.gif']='/images/booking/dropmenu_up.gif';window.po['/images/the-harbour/dropmenu_down.gif']='/images/booking/dropmenu_dwn.gif';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.StandaloneCalendarModule=function(id){if(!id){}
this.containerId=id;this.info=null;this.selected=null;this.dates={};this.ticket=null;this.createEventListeners();};ibe.StandaloneCalendarModule.prototype=new jlib.hessian.Module('info');ibe.StandaloneCalendarModule.prototype.constructor=ibe.StandaloneCalendarModule;ibe.StandaloneCalendarModule.prototype.isShowTime=function(){return true;};ibe.StandaloneCalendarModule.prototype.toString=function(){return'[object ibe.StandaloneCalendarModule]';};ibe.StandaloneCalendarModule.TEMPLATE=['<div class="calendarContainer">','<div id="selector"></div>','<div class="first">','<table id="firstMonth" cellspacing="0" cellpadding="0" class="first">','<thead>','<tr>','<td><a id="prevMonthLink" href="#" class="hidden"><img class="prevMonthNav" src="',_('/images/the-harbour/arrow_previous.gif'),'" alt="',_('Previous Month'),'" /></a></td>','<th id="firstMonthName" class="currentMonth" colspan="5"></th>','<td><a id="nextMonthLink" href="#" class="hidden"><img class="nextMonthNav" src="',_('/images/the-harbour/arrow_next.gif'),'" alt="',_('Next Month'),'" /></a></td>','</tr>','</thead>','<tbody>','<tr>','<th>',jlib.Locale.CALENDAR_DAYS[0],'</th>','<th>',jlib.Locale.CALENDAR_DAYS[1],'</th>','<th>',jlib.Locale.CALENDAR_DAYS[2],'</th>','<th>',jlib.Locale.CALENDAR_DAYS[3],'</th>','<th>',jlib.Locale.CALENDAR_DAYS[4],'</th>','<th>',jlib.Locale.CALENDAR_DAYS[5],'</th>','<th>',jlib.Locale.CALENDAR_DAYS[6],'</th>','</tr>','<tr><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td></tr>','<tr><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td></tr>','<tr><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td></tr>','<tr><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td></tr>','<tr><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td></tr>','<tr><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td></tr>','</tbody>','</table>','</div>','<div class="second">','<table id="secondMonth" cellspacing="0" cellpadding="0" class="second">','<thead>','<tr>','<td></td>','<th id="secondMonthName" class="currentMonth" colspan="5"></th>','<td></td>','</tr>','</thead>','<tbody>','<tr>','<th>',jlib.Locale.CALENDAR_DAYS[0],'</th>','<th>',jlib.Locale.CALENDAR_DAYS[1],'</th>','<th>',jlib.Locale.CALENDAR_DAYS[2],'</th>','<th>',jlib.Locale.CALENDAR_DAYS[3],'</th>','<th>',jlib.Locale.CALENDAR_DAYS[4],'</th>','<th>',jlib.Locale.CALENDAR_DAYS[5],'</th>','<th>',jlib.Locale.CALENDAR_DAYS[6],'</th>','</tr>','<tr><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td></tr>','<tr><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td></tr>','<tr><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td></tr>','<tr><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td></tr>','<tr><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td></tr>','<tr><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td><td><a></a><span></span></td></tr>','</tbody>','</table>','</div>','<div class="calendarUtil">','<table class="legend">','<tbody>','<tr>','<td class="available"><div class="colorkey"><!-- --></div></td>','<td>',_('Suite available'),'</td>','</tr>','</tbody>','</table>','</div>','</div>','<div class="instructions">',_('Click a check-in date above to start your reservation'),'</div>'];ibe._proto=ibe.StandaloneCalendarModule.prototype;ibe.StandaloneCalendarModule.prototype={init:function(){var container=this.container;var selectors={selector:'#selector',firstMonth:{table:'#firstMonth',name:'#firstMonthName'},secondMonth:{table:'#secondMonth',name:'#secondMonthName'},nav:{prevMonth:'#prevMonthLink',nextMonth:'#nextMonthLink'}};var calendarClick=this.calendarClick;var showMonth=this.showMonth;var elements,widget,eventInfo,props;if(this.hasModuleInit){return;}
if(!container){return;}
elements=jlib.Template.instantiate(ibe.StandaloneCalendarModule.TEMPLATE,container,selectors);eventInfo=[];props={owner:this};[elements.firstMonth.table,elements.secondMonth.table].forEach(function(table){var rows,reattach;rows=Array.toArray(table.tBodies[0].rows);rows.shift();reattach=jlib.Template.detach(table);rows.forEach(function(row){Array.forEach(row.cells,function(cell){cell.link=cell.firstChild;cell.span=cell.lastChild;cell.removeChild(cell.link);cell.removeChild(cell.span);});});reattach();});[{element:elements.firstMonth.table,click:calendarClick},{element:elements.secondMonth.table,click:calendarClick},{element:elements.nav.prevMonth,click:showMonth},{element:elements.nav.nextMonth,click:showMonth}].forEach(function(o){jlib.contrib.Events.addListener(o.element,'click',o.click,props,eventInfo);});widget=new ibe.SelectorWidget(elements.selector);jlib.contrib.Events.addListener(widget,'change',this.widgetChange,props,eventInfo);elements.widget=widget;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.widget.uninit();if(this.ticket){this.ticket.cancel();}
this.elements=null;this.hasModuleInit=false;this.selected=null;this.dates={};this.ticket=null;},redraw:function(doShow){var me=this;var data=Function.getHiddenArgument(arguments,0);var elements=this.elements;var state=this.state;var info=this.info;var dates=this.dates;var version,isHotel,hotels,hotelOrder;var hotel,room,widget,reqs,options,si;jlib.ClassName.add(this.container,'hidden');reposAfterEvent();if(!doShow){return;}
if(this.ticket){this.ticket.cancel();this.ticket=null;}
this.mediator.alert(this,jlib.hessian.Mediator.MESSAGE_LOADING);version=info.version;isHotel=info.isHotel;widget=elements.widget;if(isHotel){hotel=state.get(0,ibe.BookingState.HOTEL_ID);room=state.get(0,ibe.BookingState.ROOM_TYPE);}
if(!data){reqs=new jlib.OrderedObject('hotels',{method:'getHotels',arguments:[version]});if(isHotel){reqs.push('roomTypes',{method:'getRoomTypes',arguments:[version,hotel]});}
this.ticket=ibe.Error.askOnError(this,ibe.WBE,'doMultiple',null,reqs,null,function(responses){me.ticket=null;me.redraw(true,responses);});return;}
info.hotels=data.getValue('hotels');if(isHotel){si=0;options=data.getValue('roomTypes').map(function(a,i){var id=a[0];if(id==room){si=i+1;}
return{label:a[1].name,value:id};});options.selectedIndex=si;options.unshift({label:_('All rooms'),value:''});widget.init(options);this.selected=room;}else{hotels=info.hotels;hotelOrder=info.hotelOrder;hotel='';hotels.forEach(function(a){hotel+=a[0];});options=hotelOrder.map(function(id){return{label:hotels.getValue(id).name,value:id};});widget.init(options,_('Please Select'));this.selected=hotel;jlib.ClassName.add(this.container,'externalHotel');}
this.drawCalendars();},drawCalendars:function(month){var me=this;var data=Function.getHiddenArgument(arguments,0);var state=this.state;var info=this.info;var version=info.version;var isHotel=info.isHotel;var hotels=info.hotels;var hotel,dates,hotelInfo,hotelTimeInfo;var today,ayear,firstMonth,lastMonth;var first,second,from,to,reqs,s;this.mediator.alert(this,jlib.hessian.Mediator.MESSAGE_LOADING);hotel=(isHotel)?state.get(0,ibe.BookingState.HOTEL_ID):this.selected;dates=this.dates[hotel];if(!dates){if(!data){if(!isHotel){hotelInfo=hotels.getValue(hotel);if(!hotelInfo){hotel=info.defaultTimeHotel;}else if(hotelInfo.isExternal){hotel=hotelInfo.hotelWithSameTime;}}
this.ticket=ibe.Error.askOnError(this,ibe.WBE,'doMultiple',null,new jlib.OrderedObject('hotelTime',{method:'getHotelTime',arguments:[version,hotel]}),null,function(responses){me.ticket=null;me.drawCalendars(month,responses);});return;}
hotelTimeInfo=data.getValue('hotelTime');today=new Date(hotelTimeInfo.today);ayear=new Date(hotelTimeInfo.ayear);firstMonth=new Date(today);firstMonth.clear(Date.CLEAR_DATE);lastMonth=new Date(ayear);lastMonth.addDate(-1);lastMonth.clear(Date.CLEAR_DATE);dates={today:today,ayear:ayear,firstMonth:firstMonth,lastMonth:lastMonth};this.dates[hotel]=dates;}
if(month){first=month;}else{first=dates.today;}
first=new Date(first);first.clear(Date.CLEAR_TIME|Date.CLEAR_DATE);if(first<dates.firstMonth){first=new Date(dates.firstMonth);}else if(first>dates.lastMonth){first=new Date(dates.lastMonth);}
if(first.getTime()==dates.lastMonth.getTime()){first.addMonth(-1);}
second=new Date(first);second.addMonth(1);from=new Date(first);to=new Date(second);to.addMonth(1);if(this.ticket){this.ticket.cancel();}
if(isHotel){s=new ibe.BookingState(state);s.set(0,ibe.BookingState.ROOM_TYPE,this.selected);reqs=new jlib.OrderedObject('checkInDates',{method:'getCheckInDates',arguments:[version,s,0,from,to]});}else{hotelInfo=hotels.getValue(hotel);if(hotelInfo&&!hotelInfo.isExternal){s=new ibe.BookingState(state);s.set(0,ibe.BookingState.HOTEL_ID,hotel);reqs=new jlib.OrderedObject('checkInDates',{method:'getCheckInDates',arguments:[version,s,0,from,to]});}}
if(reqs){this.ticket=ibe.Error.askOnError(this,ibe.WBE,'doMultiple',function(responses){return(responses instanceof ibe.Error)?false:responses;},reqs,null,function(responses){me.ticket=null;if(responses){me.drawElements(first,second,responses);}else{me.mediator.unalert(me,jlib.hessian.Mediator.MESSAGE_LOADING);}});}else{setTimeout(function(){me.drawElements(first,second,new jlib.OrderedObject('checkInDates',{}));},0);}},drawElements:function(first,second,data){var elements=this.elements;var firstMonth=elements.firstMonth;var secondMonth=elements.secondMonth;var nav=elements.nav;var prevMonth=nav.prevMonth;var nextMonth=nav.nextMonth;var info=this.info;var isHotel=info.isHotel;var state=this.state;var hotel=(isHotel)?state.get(0,ibe.BookingState.HOTEL_ID):this.selected;var dates=this.dates[hotel];var hotelInfo;if(first>dates.firstMonth){prevMonth.month=new Date(first);prevMonth.month.addMonth(-1);}
if(second<dates.lastMonth){nextMonth.month=new Date(second);}
jlib.ClassName.toggle(prevMonth,'hidden',(first<=dates.firstMonth));jlib.ClassName.toggle(nextMonth,'hidden',(second>=dates.lastMonth));if(!isHotel){hotelInfo=info.hotels.getValue(hotel);jlib.ClassName.toggle(this.container,'externalHotel',(!hotelInfo||hotelInfo.isExternal));}
this.drawCalendarMonth(firstMonth,first,data);this.drawCalendarMonth(secondMonth,second,data);this.mediator.unalert(this,jlib.hessian.Mediator.MESSAGE_LOADING);jlib.ClassName.remove(this.container,'hidden');if(this.isUpdateEvent&&this.isEvent){jlib.contrib.Events.dispatch(this,'enter',{});this.isEvent=false;}},drawCalendarMonth:function(cal,month,data){var info=this.info;var isHotel=info.isHotel;var state=this.state;var newState=new ibe.BookingState(state);var ARRIVAL_DATE=ibe.BookingState.ARRIVAL_DATE;var hotel=(isHotel)?state.get(0,ibe.BookingState.HOTEL_ID):this.selected;var hotelInfo=info.hotels.getValue(hotel);var prefix=(hotelInfo)?hotelInfo.bookingUrl+'#':'';var dates=this.dates[hotel];var today=dates.today;var ayear=dates.ayear;var startDOW=month.getDay();var day=0;var calendar=cal.table;var checkInDates=data.getValue('checkInDates');var isCheckInDate;var reattach,endDay,rows,cells,cell,date,dateStr,link,span,i,j;if(!isHotel){newState.set(0,ibe.BookingState.HOTEL_ID,hotel);}
calendar.month=month;date=new Date(month);date.clear(Date.CLEAR_TIME);i=new Date(month);i.clear(Date.CLEAR_TIME|Date.CLEAR_DATE);i.addMonth(1);i.addDate(-1);endDay=i.getDate();if(isHotel){newState.set(0,ibe.BookingState.ROOM_TYPE,this.selected);}
reattach=jlib.Template.detach(calendar);cal.name.innerHTML=jlib.Locale.MONTHS[month.getMonth()]+' '+
month.getFullYear();rows=calendar.tBodies[0].rows;for(i=1;i<rows.length;i++){cells=rows[i].cells;for(j=0;j<cells.length;j++){cell=cells[j];link=cell.link;span=cell.span;while(cell.firstChild){cell.removeChild(cell.firstChild);}
jlib.ClassName.remove(cell,'available');if(day==0&&j==startDOW){day=1;}
if(day>=1&&day<=endDay){date.setDate(day);dateStr=date.toISODateString();span.innerHTML=day;isCheckInDate=!!checkInDates[dateStr];if(date<today||date>=ayear){isCheckInDate=false;}
if(isCheckInDate){newState.set(0,ARRIVAL_DATE,date);link.href=prefix+newState.toString();link.appendChild(span);cell.appendChild(link);}else{cell.appendChild(span);}
jlib.ClassName.toggle(cell,'available',isCheckInDate);day++;}}}
reattach();},showMonth:function(e){var calendar=this.owner;var month=this.month;var info=calendar.info;var isExternal=false;var hotelInfo;if(!info.isHotel){hotelInfo=info.hotels.getValue(calendar.selected);isExternal=(!hotelInfo||hotelInfo.isExternal);}
if(calendar&&month&&!isExternal){calendar.drawCalendars(month);}
if(e&&e.preventDefault){e.preventDefault();}
return false;},calendarClick:function(e){var calendar=this.owner;var target=(e.target)?e.target:e.srcElement;var href;if(target.nodeType==3){target=target.parentNode;}
if(target.nodeType==1&&target.nodeName=='SPAN'){target=target.parentNode;}
if(target.nodeType!=1||target.nodeName!='A'||target.month){return;}
jlib.contrib.Events.dispatch(calendar,'leave',{isCompleted:true});},widgetChange:function(e){var calendar=this.owner;var info=calendar.info;var val=e.value;var hotelInfo;if(!info.isHotel){hotelInfo=info.hotels.getValue(val);if(hotelInfo&&hotelInfo.isExternal&&hotelInfo.ibeFunc){hotelInfo.ibeFunc();}}
calendar.selected=val;calendar.drawCalendars(calendar.elements.firstMonth.table.month);}};ibe.StandaloneCalendarModule.prototype=Object.dup(ibe.StandaloneCalendarModule.prototype,ibe._proto);delete ibe._proto;ibe.StandaloneCalendarModule.prototype.doneLoading();