const SELFBOOK_BASE_URL="https://sdk.selfbook.com",SELFBOOK_BACKEND_URL="https://api.selfbook.com/api/v2",SELFBOOK_SCRIPT_ID="selfbook_jssdk",SELFBOOK_HOTEL_ID_PROP="hotelId",SELFBOOK_API_KEY_PROP="apiKey",SELFBOOK_WIDGET_ELEMENT_ID="selfbook_sdkwidget",SELFBOOK_WIDGET_WRAPPER_ELEMENT_ID="selfbook_sdkwidget_wrapper",SELFBOOK_WIDGET_LOADING_ELEMENT="selfbook-loading",SELFBOOK_WIDGET_RESUME="selfbook-sdkwidget-resume",SELFBOOK_WIDGET_RESUME_TEXT="selfbook-sdkwidget-resume-text",BOOTSTRAP_ACTION="WIDGET/BOOTSTRAP",SELFBOOK_HOTEL_GROUP_INFO="selfbook_hotel_group_info",BLACK_SQUARE_THEME_HOTELS=["6739"],THE_LINE_HOTELS=["68711","71661","2427"],COMPLETE_BOOKING_BTN_CLICK="Complete your reservation button click",ROUTE_PATHS={app:{confirmation:"/confirmation",wallet:"/wallet",account:"/account",settings:"/settings",reservations:"/reservations",reservationDetail:"/reservation-detail",editBooking:"/edit-booking",bookingConfirmed:"/booking-confirmed"}},INITIAL_PERSISTED_DATA={isExpired:!0,all:null,booking:null,core:null,router:null},GUEST_TYPE={ADULT:"adult",CHILD:"child",INFANT:"infants"};function checkStatus(t){if(t.status>=200&&t.status<300)return t;const e=new Error(t.statusText);throw e.response=t,e}async function parseJSON(t){try{const e=await t.text();if(!e)return;return JSON.parse(e)}catch(t){console.error("parseJSON: err: ",t)}}function intervalWrapper(t,e){const n=setInterval(t,e);return function(){clearInterval(n)}}function getHotelBasicData(t,e){try{const n=getFromLocalStorage(t,SELFBOOK_HOTEL_GROUP_INFO).hotels?.filter((t=>t.id==e));return n?.[0]||{}}catch(t){return console.error("getHotelBasicData: err: ",t),{}}}function getFromLocalStorage(t,e){try{return JSON.parse(t.getItem(e))}catch(t){return console.error("getFromLocalStorage: err: ",{e:t}),{}}}function getPersistedData(t){try{const e=JSON.parse(t.getItem("persist:root"));if(!e)return INITIAL_PERSISTED_DATA;const n=JSON.parse(e.booking||"{}"),o=JSON.parse(e.core||"{}"),r=JSON.parse(e?.router||"{}"),{expireTime:a}=o,i=(Date.now()-new Date(o.interactionTime))/1e3;return{isExpired:i>a,all:e,booking:n,core:o,router:r}}catch(t){return console.error("getPersistedData: err: ",t),INITIAL_PERSISTED_DATA}}function fillGuestsFields(t=[],e){const n=e.default_adult_occupancy?e.default_adult_occupancy:2;return t.map((t=>t.type===GUEST_TYPE.ADULT?{type:GUEST_TYPE.ADULT,count:parseInt(t.count)||n}:t.type===GUEST_TYPE.CHILD&&parseInt(t.count)>0?{type:GUEST_TYPE.CHILD,count:parseInt(t.count),age:parseInt(t.age)||1,special_request:t.special_request||""}:t.type===GUEST_TYPE.INFANT&&parseInt(t.count)>0?{type:GUEST_TYPE.INFANT,count:parseInt(t.count)||1,age:parseInt(t.age)||1,special_request:t.special_request||""}:void 0)).filter(Boolean)}function buildRedirectSynxisLink(t,e){let n=`https://be.synxis.com/?hotel=${e.id}&theme=${e.synxis_theme}&config=${e.synxis_config}`;try{if(t){const{startDate:e,endDate:o,promoCode:r,groupCode:a,guests:i,iataNumber:s,couponCode:l,destinationId:d,nights:c,rate:p,hotelId:u,roomCategory:m}=t;c&&(n+=`&nights=${c}`),e&&(n+=`&arrive=${e}`),o&&(n+=`&depart=${o}`),r&&(n+=`&promo=${r}`),a&&(n+=`&group=${a}`),s&&(n+=`&iataNumber=${s}`),l&&(n+=`&couponCode=${l}`),p&&(n+=`&rate=${p}`),d&&(n+=`&destinationId=${d}`),Array.isArray(m)?n+=`&roomCategory=${m.map((t=>t)).join(",")}`:m&&(n+=`&roomCategory=${m}`),i&&i.length>0?("adult"===i[0].type&&(n+=`&adult=${i[0].count}`),i[1]&&"child"===i[1].type&&(n+=`&child=${i[1].count}`)):n+="&adult=1"}}catch(t){console.error("buildRedirectSynxisLink: err: ",t)}return n}function selectShowWidgetButtonCopies(t){return t.core.showWidgetButtonCopies||{}}function selectRoute(t){return t?.router?.location?t.router.location.pathname:ROUTE_PATHS.app.editBooking}function isObjectEqual(t,e){return JSON.stringify(t)===JSON.stringify(e)}function isTemplateDomainMatch(t,e){return t?.booking_template_domain&&e?.target?.href?.includes(t.booking_template_domain)}function getElementById(t){return document?.getElementById(t)}function runDirectApplication(){console.info("(!) selfbook: widget initialization started");let t,e,n,o,r,a=!1,i=!1,s=!1,l=!1;async function d({url:t,method:e,data:n,headers:o}){try{const r=await fetch(t,{method:e,body:n,headers:o});checkStatus(r);return await parseJSON(r)}catch(t){console.debug("requestWrapper: Request failed",t)}}function c(){try{const t=n||{},e=o||ROUTE_PATHS.app.editBooking;n=selectShowWidgetButtonCopies(window.selfbookWidgetStore.getState()),o=selectRoute(window.selfbookWidgetStore.getState());const r=getElementById(SELFBOOK_WIDGET_RESUME_TEXT);let a=t.COMPLETE_BOOKING;isObjectEqual(t,n)&&o===e||(a=o===ROUTE_PATHS.app.reservations?n.VIEW_RESERVATIONS:o===ROUTE_PATHS.app.confirmation||o===ROUTE_PATHS.app.reservationDetail?n.VIEW_RESERVATION:o===ROUTE_PATHS.app.account?n.VIEW_ACCOUNT:o===ROUTE_PATHS.app.wallet?n.VIEW_WALLET:o===ROUTE_PATHS.app.bookingConfirmed?n.RETURN_BOOKING:n.COMPLETE_BOOKING,r&&(r.innerHTML=a))}catch(t){console.error("handleStoreChange: err: ",t)}}function p(){return THE_LINE_HOTELS.includes(t)?"Lydian BT":"Main"}function u(e){const n=e?.colors||{},o=`\n      position: fixed;\n      overflow: hidden;\n      cursor: pointer;\n      display: flex;\n      justify-content: space-evenly;\n      align-items: center;\n      width: 217px;\n      height: 46px;\n      box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.25), 0px 4px 4px rgba(0, 0, 0, 0.1);\n      right: 30px;\n      z-index: 100000000000;\n      bottom: 40px;\n      font-family: ${p()}!important;\n      font-size: 14px;\n      line-height: 142%;\n      letter-spacing: 0.02em;\n      text-transform: capitalize!important;\n      border: none;\n      transform: translateX(300px);\n    `,r="\n      background: #343A40;\n      color: #FFFFFF;\n    ",a=`\n      ${r}\n      border-radius: 23px;\n    `,i=`\n      background: ${n.primary_color||n.primary};\n      color: ${n.secondary_color||n.secondary}!important;\n    `;return s=e?.id||t,BLACK_SQUARE_THEME_HOTELS.includes(s)?`${o}${r}`:n.primary_color&&n.secondary_color||n.primary&&n.secondary?`${o}${i}`:`${o}${a}`;var s}function m(t){const e=document.createElement("style");e.textContent=t,document.head.append(e)}function y(n,o){if(!r)return;m(`#${SELFBOOK_WIDGET_RESUME} {\n      ${u(o)}\n    }`),document.body.style.overflow="hidden";const a=getElementById("selfbook_sdkwidget"),i=getElementById("selfbook_sdkwidget_wrapper"),l=getElementById(SELFBOOK_WIDGET_RESUME),d=l?l.getAttribute("class"):null;d&&d.includes("dismiss-btn")&&(l.removeAttribute("class"),l.setAttribute("class","dismiss-btn-slide-out")),window.selfbookWidgetStore||(i.appendChild(function(){const t=document.createElement("div");return t.id="selfbook-loading",t.style.color="white",t.style.marginRight="-50%",t.style.position="absolute",t.style.top="50%",t.style.left="50%",t.style.fontFamily="sans-serif",t.style.transform="translate(-50%, -50%)",t.innerHTML='<img src="https://sdk.selfbook.com/assets/selfbook_loading_logo.svg" height="20" width="100%">',t}()),i.style.zIndex=1e11,i.style.height="100%",i.style.background="rgba(0, 0, 0, .74)",document.body.style.overflow="hidden"),function(){if(!0===s)return;r&&r.length>0&&r.forEach((t=>{if(t.includes(".js")){const e=document.createElement("script");e.type="text/javascript",e.src=`${SELFBOOK_BASE_URL}/${t}`,document.body.appendChild(e)}}));(function(){try{const t=document.createElement("script");t.innerHTML='\n        !function(){var analytics=window.analytics=window.analytics||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{analytics.invoked=!0;analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","identify","reset","group","track","ready","alias","debug","once","off","on","addSourceMiddleware","addIntegrationMiddleware","setAnonymousId","addDestinationMiddleware"];analytics.factory=function(e){return function(){var t=Array.prototype.slice.call(arguments);t.unshift(e);analytics.push(t);return analytics}};for(var e=0;e<analytics.methods.length;e++){var key=analytics.methods[e];analytics[key]=analytics.factory(key)}analytics.load=function(key,e){var t=document.createElement("script");t.type="text/javascript";t.async=!0;t.src="https://cdn.segment.com/analytics.js/v1/" + key + "/analytics.min.js";var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(t,n);analytics._loadOptions=e};analytics._writeKey="c77UfR3BzZDUXmAth2DaHEA8kkKhDIU2";;analytics.SNIPPET_VERSION="4.15.3";\n        analytics.load("c77UfR3BzZDUXmAth2DaHEA8kkKhDIU2");\n        }}();\n      ',document.head.appendChild(t);const e=document.createElement("script");e.type="application/ld+json",e.innerHTML='{"@context": "http://schema.org/","@type": "SoftwareApplication","name": "SelfBook"}',document.head.appendChild(e);const n=document.createElement("script");n.src="https://onboard.triptease.io/bootstrap.js",n.async=!0,n.crossOrigin="anonymous",n.type="text/javascript",document.head.appendChild(n)}catch(t){console.error("inject3rdPartyScripts: err: ",t)}})(),s=!0}();const p=setInterval((()=>{if(window.selfbookWidgetStore){window.selfbookWidgetStore.subscribe(c);!function(){const t=document.getElementById("selfbook-loading");t&&getElementById("selfbook_sdkwidget_wrapper").removeChild(t)}(),clearInterval(p),window.selfbookWidgetStore.dispatch({type:BOOTSTRAP_ACTION,payload:{hotelInfo:{apiKey:n.apiKey||e,hotelId:n.hotelId||t,hotelIdAsArg:!!n.hotelId},bookingData:n,hotelGroupInfo:getFromLocalStorage(localStorage,SELFBOOK_HOTEL_GROUP_INFO)}}),"none"===a.style.display&&(i.style.zIndex=1e11,i.style.height="100%",i.style.background="rgba(0, 0, 0, .4)",document.body.style.overflow="hidden"),setTimeout((()=>{a.style.display="block",a.setAttribute("class","slide-in")}),20),setTimeout((()=>{const t=i.querySelector('[aria-modal="true"]');t&&t.focus()}),250),function(){const t=getElementById("selfbook_sdkwidget"),e=getElementById("selfbook_sdkwidget_wrapper"),n=getElementById(SELFBOOK_WIDGET_RESUME);n.addEventListener("click",(o=>{try{if(n){const o=n?n.getAttribute("class"):null;o&&o.includes("dismiss-btn")&&(n.removeAttribute("class"),n.setAttribute("class","dismiss-btn-slide-out")),document.body.style.overflow="hidden",e.style.zIndex=1e11,e.style.height="100%",e.style.background="rgba(0, 0, 0, .5)",t.style.display="block",t.setAttribute("class","slide-in"),window.selfbookWidgetStore.dispatch({type:"ANALYTICS/TRACK_EVENT",payload:{eventType:COMPLETE_BOOKING_BTN_CLICK,eventPayload:null}}),setTimeout((()=>{const t=e.querySelector('[aria-modal="true"]');t&&t.focus()}),500)}}catch(t){console.error("handleWidgetCloseListeneres: err: ",t)}}))}()}}),100)}function f(){try{const{isExpired:t,core:e,booking:n}=getPersistedData(localStorage);if(t||!e?.hotel?.data?.id)return void function(){try{localStorage.removeItem("persist:root")}catch(t){console.error("removePersistedData: err",t)}}();const o=e.bootstrapArgs;E({...o,startDate:n.bookingForm.start_date.slice(0,10),endDate:n.bookingForm.end_date?.slice(0,10)||null,guests:n.bookingForm.guests,propertyId:n.bookingForm.property_id,persistActive:!0,hotelId:e.hotel.data.id})}catch(t){console.error("openPersistWidget: err",t)}}const g=async()=>await fetch(`${SELFBOOK_BASE_URL}/asset-manifest.json`,{headers:{"content-type":"application/json"}}).then((t=>t.json())).then((t=>function(t){r=t.entrypoints}(t)));async function E(e={}){try{e.apiKey&&await k(e.apiKey,e.hotelId);const n=getHotelBasicData(localStorage,e.hotelId||t);if(e.guests?e.guests=fillGuestsFields(e.guests,n):e.guests=[{type:GUEST_TYPE.ADULT,count:n.default_adult_occupancy?n.default_adult_occupancy:2}],console.log(e),n.redirect_to_synxis){const t=buildRedirectSynxisLink(e,n);return void window.open(t,"_blank").focus()}y(e,n),document.getElementsByTagName("html")[0].setAttribute("translate","no")}catch(t){console.error("bookNow: err: ",t)}}function h(t){const e={startdate:"startDate",enddate:"endDate",rateplancode:"ratePlanCode",rate:"rate",roomid:"roomId",propertyid:"propertyId",destinationid:"destinationId",room:"room",adult:"adult",child:"child",infants:"infants",currency:"currency",group:"group",locale:"locale",hotel:"hotel",promo:"promo",promocode:"promocode",selfbook:"selfbook",iatanumber:"iataNumber",couponcode:"couponCode",nights:"nights",reservationid:"reservationId",lastname:"lastName",search:"search",sbsearch:"sbsearch",threeDsContinueId:"three_ds_continue_id",status:"status",roomcategory:"roomCategory",properties:"properties",source:"source"};return Array.from(t.entries()).reduce(((t,[n,o])=>({...t,[e[n.toLowerCase()]]:o})),{})}function _(){setTimeout((()=>{const e=setInterval((()=>{if(a)return;clearInterval(e);const n=h(new URLSearchParams(window.location.search));"true"===n.selfbook&&b(n,getHotelBasicData(localStorage,n.hotel||t))}),100)}),500)}function b(t,e={}){const n=parseInt(e?.default_adult_occupancy)||2,o=[{type:"adult",count:t.adult||n},{type:"child",count:t.child||0},{type:"infants",count:t.infants||0}];E({...t,guests:o,groupCode:t.group,promoCode:t.promo||t.promocode,hotelId:t.hotel||void 0,roomCategory:"string"==typeof t.roomCategory?t.roomCategory.split(",").map((t=>t.trim())):void 0})}async function w(){!function(){const t=document.createElement("div"),e=document.createElement("div"),n=document.createElement("button"),o=document.createElement("span"),r=document.createElement("img");n.id=SELFBOOK_WIDGET_RESUME,n.style.cursor="pointer",r.src="https://sdk.selfbook.com/assets/resume-icon-black.png",r.alt="Resume booking",r.width="16",r.height="16",o.innerHTML="Complete your booking",o.id=SELFBOOK_WIDGET_RESUME_TEXT,n.appendChild(o),n.appendChild(r),t.setAttribute("id","selfbook_sdkwidget"),t.style.display="none",e.setAttribute("id","selfbook_sdkwidget_wrapper"),e.style.background="rgba(0, 0, 0, 0)",e.style.position="fixed",e.style.top="0",e.style.right="0",e.style.width="100%",e.style.transition="background .5s ease-out",e.appendChild(t),document.body.appendChild(e),document.body.appendChild(n)}(),await g(),function(){if(!0!==l){if(r&&r.length>0){const t=document.getElementsByTagName("head")[0];r.forEach((e=>{if(e.includes(".css")){const n=document.createElement("link");n.rel="stylesheet",n.type="text/css",n.media="all",n.href=`${SELFBOOK_BASE_URL}/${e}`,t.appendChild(n)}}))}l=!0}}(),f(),document?.querySelectorAll("a").forEach((e=>{e.addEventListener("click",(e=>{try{"A"!==e.target.tagName&&"A"===e.target.parentNode?.tagName&&(e.target.href=e.target.parentNode.href);const n=e.target.href||"";if(-1===n.indexOf("?"))return;const o=h(new URLSearchParams(n.substring(n.indexOf("?")))),r=getHotelBasicData(localStorage,o.hotel||t);if(r?.mobile_display_only&&window.innerWidth>=768)return;(isTemplateDomainMatch(r,e)||"true"===o.selfbook)&&(e.preventDefault(),b(o,r))}catch(t){console.error("a-element: err: ",t)}}))})),"complete"===document?.readyState?_():window?.addEventListener("load",_)}async function k(t,e){a=!0;const n=e?`?id=${e}`:"",o=await d({url:`${SELFBOOK_BACKEND_URL}/hotels/info${n}`,headers:{"content-type":"application/json","API-Key":t}});localStorage.setItem(SELFBOOK_HOTEL_GROUP_INFO,JSON.stringify(o)),i||w(),i=!0,a=!1}const S=document?.getElementById("selfbook_jssdk");if(S){const n=new URL(S.getAttribute("src"));if(t=n.searchParams.get("hotelId"),e=n.searchParams.get("apiKey"),!e||!t)throw new Error("(!) selfbook: ApiKey and HotelId are required.");window.isSelfbookSDKActive=!0,k(e,t),intervalWrapper((()=>{k(e,t)}),3e5),function(){const t=`\n      #selfbook_sdkwidget {\n        position: absolute;\n        width: 100%;\n        height: 100%;\n        top: 0px;\n        right: 0px;\n      }\n\n      #${SELFBOOK_WIDGET_RESUME} {\n        ${u()}\n      }\n\n      #${SELFBOOK_WIDGET_RESUME_TEXT} {\n        display: block!important;\n        font-family: ${p()}!important;\n        font-size: 14px!important;\n        font-weight: 400!important;\n        color: #ffffff!important;\n      }\n\n      .dismiss-btn-slide-in {\n        -webkit-transition: 500ms;\n        -moz-transition: 500ms;\n        transition: 500ms;\n        transform: translateX(0)!important\n      }\n\n      .dismiss-btn-slide-out {\n        -webkit-transition: 500ms;\n        -moz-transition: 500ms;\n        transition: 500ms;\n        transform: translateX(300px)!important\n      }\n\n      .dismiss-btn-slide-out span {\n        display: none;\n      }\n\n      .payment-summary-wrapper {\n        overflow: scroll!important;\n        -ms-overflow-style: none!important;\n        scrollbar-width: none!important;\n      }\n      .payment-summary-wrapper::-webkit-scrollbar {\n        display: none!important;\n      }\n\n      .dismiss-btn-resize-in {\n        width: 46px!important;\n        height: 46px!important;\n        transition: 500ms;\n        right: 30px!important;\n      }\n\n      .dismiss-btn-resize-in span {\n        display: none;\n      }\n\n      .dismiss-btn-resize-in:hover {\n        width: 217px!important;\n        height: 46px!important;\n        transition: all 300ms linear;\n        cursor: pointer;\n      }\n\n      .dismiss-btn-resize-in:hover span {\n        display: inline;\n        height: 20px!important;\n        overflow: hidden;\n      }\n\n      .dismiss-btn-resize-out {\n        width: 46px!important;\n        height: 46px!important;\n        transition: 500ms;\n        right: -100px!important;\n      }\n\n      .slide-in {\n        transform: translateX(100%);\n        -webkit-transform: translateX(100%);\n        animation: slide-in 0.8s forwards !important;\n        -webkit-animation: slide-in 0.8s forwards !important;\n        z-index: 1000000000000;\n      }\n\n      .slide-out {\n        transform: translateX(100%);\n        -webkit-transform: translateX(100%);\n        animation: slide-out 1s forwards !important;\n        -webkit-animation: slide-out 1s forwards !important;\n        z-index: -1000000000000;\n      }\n\n      @media screen and (max-width:495px) {\n        .slide-in {\n          transform: translateY(100%);\n          -webkit-transform: translateY(100%);\n          animation: slide-up 0.8s forwards !important;\n          -webkit-animation: slide-up 0.8s forwards !important;\n          z-index: 1000000000000;\n        }\n        .slide-out {\n          transform: translateY(100%);\n          -webkit-transform: translateY(100%);\n          animation: slide-down 0.5s forwards !important;\n          -webkit-animation: slide-down 1s forwards !important;\n          z-index: -1000000000000;\n        }\n      }\n\n      @keyframes slide-in {\n        100% {\n          transform: translateX(0%);\n        }\n      }\n\n      @-webkit-keyframes slide-in {\n        100% {\n          -webkit-transform: translateX(0%);\n        }\n      }\n\n      @keyframes slide-up {\n        100% {\n          transform: translateY(0%);\n        }\n      }\n\n      @-webkit-keyframes slide-up {\n        100% {\n          -webkit-transform: translateY(0%);\n        }\n      }\n\n      @keyframes slide-out {\n        0% {\n          transform: translateX(0%);\n        }\n        100% {\n          transform: translateX(100%);\n        }\n      }\n\n      @-webkit-keyframes slide-out {\n        0% {\n          -webkit-transform: translateX(0%);\n        }\n        100% {\n          -webkit-transform: translateX(100%);\n        }\n      }\n\n      @keyframes slide-down {\n        0% {\n          transform: translateY(0%);\n        }\n        100% {\n          transform: translateY(100%);\n        }\n      }\n\n      @-webkit-keyframes slide-down {\n        0% {\n          -webkit-transform: translateY(0%);\n        }\n        100% {\n          -webkit-transform: translateY(100%);\n        }\n      }\n    `,e=document.createElement("style");e.textContent=t,document.head.append(e),m(t)}()}window&&(window.sbApiLogger=function(n){try{d({url:`${SELFBOOK_BACKEND_URL}/hotels/${t}/events`,method:"POST",headers:{"content-type":"application/json","API-Key":e},data:JSON.stringify({generated_at:(new Date).toISOString(),event_source:"SDK",body:n})})}catch(t){console.log(t)}},window.book=function(t,e,n,o,r,a,i,s,l,d,c="fr",p,u,m){E({startDate:t,endDate:e,guests:n,propertyId:o,currency:r,roomId:a,ratePlanCode:i,rate:s,promoCode:l,groupCode:d,locale:c,destinationId:u,hotelId:p,roomCategory:m})},window.bookNow=E,window.closeSelfbookWidget=function(){const t=getElementById("selfbook_sdkwidget"),e=getElementById("selfbook_sdkwidget_wrapper"),n=getElementById(SELFBOOK_WIDGET_RESUME);document.body.style.overflow="initial",t.setAttribute("class","slide-out"),e.style.background="rgba(0, 0, 0, 0)",window.selfbookWidgetStore.dispatch({type:"WIDGET/SELFBOOK_WIDGET_CLOSED"}),window.selfbookWidgetStore.dispatch({type:"ANALYTICS/TRACK_EVENT",payload:{eventType:"widget closed"}}),setTimeout((()=>{t.style.display="none",e.style.zIndex=-1e11;const o=getFromLocalStorage(localStorage,SELFBOOK_HOTEL_GROUP_INFO);o&&(o.maintenance_mode||(n.setAttribute("class","dismiss-btn-slide-in"),n.focus()))}),800)})}runDirectApplication();



/*
    https://stayinglevel.com
 
 
    Los Angeles
        Level Long Beach-East Village - 48179
        Level Los Angeles Downtown - South Olive - 67711
        Level Hollywood - 48180 - Los Angeles
    
    Chicago
        Level Chicago - Old Town - 10326
        Level Chicago - River North - 36991
        Level Chicago Fulton Market - 43084
    
    Vancouver
        Level Vancouver - Yaletown Seymour - 9641
 
    Seattle
        Level South Lake Union - 35622 - Seattle
 
*/



const originalBookNow = bookNow;
function sbBookNowTracker() {
    if (document.querySelector('.modal.book-box.in')) {
        document.querySelector('#book-box .close').click();
    }
}
function newCustomBookNow(args) {
    sbBookNowTracker(args);
    originalBookNow.apply(this, arguments);
}
bookNow = newCustomBookNow;


if (window.location.href.includes("selfbook-staging") ||
    localStorage.getItem("selfbook-staging") === "true"
) {
    localStorage.setItem("selfbook-staging", "true");




    console.log(
        '%cCustom script has been initialized',
        'background: green; color: white;',
    );

    function returnHotelId(name) {
        let hotels = {
            "Fulton Market": 43084, "fulton market": 43084,
            "Old Town": 10326, "old town": 10326,
            "River North": 36991, "river north": 36991,
            "Long Beach - East Village": 48179, "long beach - east village": 48179,
            "Downtown - South Olive": 67711, "downtown - south olive": 67711,
            "Hollywood": 48180, "hollywood": 48180,
            "South Lake Union": 35622, "south lake union": 35622,
            "Yaletown - Seymour": 9641, "yaletown - seymour": 9641
        }
        return hotels[name] || null;
    }
    function reformatDate(date) {
        if (date) {
            let [month, day, year] = date.split("/");
            return [year, month, day].join('-');
        }
        return ""
    }

    function HOTELS_ON_SELFBOOK(hotelId) {
        const hotelsOnSelfbook = [
        /* Level Long Beach-East Village */ 48179,
        /* Level Los Angeles Downtown - South Olive */ 67711,
        /* Level Hollywood */ 48180,
        /* Level Chicago - Old Town */ 10326,
        /* Level Chicago - River North */ 36991,
        /* Level Chicago Fulton Market */ 43084,
        /* Level Vancouver - Yaletown Seymour */ 9641,
        /* Level South Lake Union */ 35622
        ];
        return hotelsOnSelfbook.includes(hotelId);
    }


    // Bugsnag API
    // https://bugsnagerrorreportingapi.docs.apiary.io/#
    async function sendErrorToBugsnag(error, func, sb_int_queue) {
        const API_KEY_BUGSNAG = '6cb771be223c608f92775d1516dce6e2';
        const CLIENT_URL = window.location.href;
        const apiKey = API_KEY_BUGSNAG;
        const apiUrl = 'https://notify.bugsnag.com';

        const payload = {
            apiKey: apiKey,
            notifier: {
                name: 'Custom Notifier',
                version: '1.0',
                url: CLIENT_URL,
            },
            events: [{
                payloadVersion: '5',
                exceptions: [{
                    errorClass: 'SbIntegration',
                    message: `${error.name ? error.name : ""}. Message: ${error.message}.`,
                    stacktrace: [{
                        file: CLIENT_URL,
                        method: " (" + func + " Error) ",
                        code: {
                            1: `${error.name ? error.name : ""}. Message: ${error.message}.`,
                            2: "Browser: " + navigator.userAgent,
                            3: "Language: " + navigator.language
                        },
                    }],
                }],
                severity: 'error',
                context: CLIENT_URL,
                app: {
                    releaseStage: sb_int_queue ? sb_int_queue : ""
                }
            }]
        };

        const headers = new Headers({
            'Content-Type': 'application/json',
            'Bugsnag-Api-Key': apiKey,
            'Bugsnag-Payload-Version': '5',
            'Bugsnag-Sent-At': new Date().toISOString()
        });

        const requestOptions = {
            method: 'POST',
            headers: headers,
            body: JSON.stringify(payload)
        };

        try {
            const response = await fetch(apiUrl, requestOptions);
            if (response.ok) { console.log('Error report sent successfully'); }
            else { console.error('Failed to send error report'); }
        } catch (error) {
            console.error('Error sending error report:', error);
        }
    };

    function handleError(error, func, sb_int) {
        console.error(`${func} error occurred:`, error);
        sendErrorToBugsnag(error, func, sb_int); // Forward the error to Bugsnag reporting
    };


    function modifyExistingSbLinks() {
        const links = document.querySelectorAll(`a[href*='selfbook=true']`);
        for (const link of links) {
            const href = link.getAttribute('href');
            if (href) {
                const updatedHref = href.toString().toLowerCase();
                const linkObj = hrefToObj(updatedHref);
                const finalParams = assignObjectVals(linkObj)
                link.setAttribute('href', window.location.href);
                link.addEventListener("click", (e) => {
                    e.preventDefault();
                    bookNow(finalParams);
                    console.log('modifyExistingSbLinks()', finalParams)
                });
            }
        }
    }
    modifyExistingSbLinks();

    function setLocale(locale) {

        const localeList = {
            "fr-FR": "fr", "fr-fr": "fr", "fr": "fr", /* French */
            "de-DE": "de", "de-de": "de", "de": "de", /* German */
            "it-IT": "it", "it-it": "it", "it": "it", /* Italian */
            "es-ES": "es", "es-es": "es", "es": "es",  /* Spanish (Spain) */
            "es-MX": "es-MX", "es-mx": "es-MX",  /* Spanish (Mexico) */
            "pt-PT": "pt-PT", "pt-pt": "pt-PT", "pt": "pt-PT", /* Portuguese */
            "zh-CN": "zh-CN", "zh-cn": "zh-CN", /* Simplified Chinese */
            "zh-TW": "zh-TW", "zh-tw": "zh-TW", /* Traditional Chinese */
            "ja-JP": "ja", "ja-jp": "ja", /* Japan */
        }

        return localeList[locale] || localeList[document.documentElement.lang] || "en";
    };

    // Checks the format of the inputted date and puts it in the correct order format (YYYY-MM-DD)
    function convertDate(date) {
        try {
            const inputDate = new Date(date);
            const year = inputDate.getFullYear();
            const month = (inputDate.getMonth() + 1).toString().padStart(2, '0');
            const day = inputDate.getDate().toString().padStart(2, '0');
            return [year, month, day].join('-');
        } catch (error) {
            handleError(error, 'convertDate');
        }
    };

    // Validates date format is 'YYYY-MM-DD'
    function checkDateIsISOformat(inputString) {
        try {
            const regexPattern = /^\d{4}-\d{2}-\d{2}$/;
            return regexPattern.test(inputString);
        } catch (error) {
            handleError(error, 'checkDateIsISOformat');
        }
    }

    /* Verifies these date formats:  'DD MONTH YYYY',  'YYYY-MM-DD',  'YYYY/MM/DD',  'MM/DD/YYYY' */
    function verifyFutureDate(date) {
        try {
            if (date) {
                if (checkDateIsISOformat(date)) {
                    const inputDate = new Date(date);
                    const today = new Date();
                    today.setHours(0, 0, 0, 0);
                    if (inputDate >= today) {
                        const formattedDate = inputDate.toISOString().split('T')[0];
                        return formattedDate;
                    }
                } else {
                    const inputDate = new Date(date);
                    const today = new Date();
                    today.setHours(0, 0, 0, 0);
                    if (inputDate >= today) {
                        return convertDate(inputDate);
                    }
                }
            }
            return '';
        } catch (error) {
            handleError(error, 'verifyFutureDate');
        }
    }

    // arrival > departure, return new departure
    function compareDates(arrive, depart) {
        try {
            let arrivalDate = new Date(arrive);
            let departureDate = new Date(depart);
            arrivalDate.setHours(0, 0, 0, 0);
            departureDate.setHours(0, 0, 0, 0);
            if (arrivalDate > departureDate) {
                arrivalDate.setDate(arrivalDate.getDate() + 1);
                departureDate = arrivalDate;
            }
            return departureDate.toLocaleDateString('en-US', {
                year: 'numeric',
                month: '2-digit',
                day: '2-digit'
            });
        } catch (error) {
            handleError(error, 'compareDates');
        }
    }
    /* This function flattens the array / object within guests */
    function pruneGuests(object) {
        try {
            const pruneObject = object;

            if (pruneObject.guests && Array.isArray(pruneObject.guests)) {
                const guests = pruneObject.guests;

                for (const guest of guests) {
                    if (guest.type === 'adult' && guest.count > 0) {
                        pruneObject.adult = guest.count;
                    } else if (guest.type === 'child' && guest.count > 0) {
                        pruneObject.child = guest.count;
                    }
                    // else if (guest.type === 'infants' && guest.count > 0) {
                    //   pruneObject.infants = guest.count;
                    // }
                }
                delete pruneObject.guests;
            }
            // console.log('pruneObject', pruneObject);
            return pruneObject;
        } catch (error) {
            handleError(error, 'pruneGuests');
        }
    }

    /* Fix for Currency Case Bug */
    function upperCaseCurrency(currency) {
        try {
            if (!currency) {
                return null;
            }
            const currencyCode = currency.toUpperCase();
            return currencyCode;
        } catch (error) {
            handleError(error, 'upperCaseCurrency');
        }
    };
    /* This function defines the bookNow() Object and assigns the values  */
    function assignObjectVals(param) {
        try {
            const urlData = param;
            const updatedLocale = setLocale(urlData.locale);
            const updatedCurrency = upperCaseCurrency(urlData.currency);
            delete urlData.locale;
            delete urlData.currency;
            const arrive = urlData.arrive || urlData.startdate;
            const depart = urlData.depart || urlData.enddate;
            const bookNowParams = {
                startDate: verifyFutureDate(arrive),
                endDate: verifyFutureDate(depart),
                guests: [
                    {
                        type: 'adult',
                        count: (!urlData.adult ? null : parseInt(urlData.adult, 10)),
                    },
                    {
                        type: 'child',
                        count: (!urlData.child ? null : parseInt(urlData.child, 10)),
                    }
                ],
                propertyId: urlData.propertyId,
                currency: updatedCurrency,
                roomId: urlData.room || urlData.roomid,
                ratePlanCode: urlData.rate || urlData.rateplancode,
                promoCode: urlData.promo || urlData.promocode,
                groupCode: urlData.group,
                locale: updatedLocale,
                hotel: urlData.hotel || urlData.hotelid,
                hotelId: urlData.hotel || urlData.hotelid,
                iataNumber: urlData.agencyid,
                ...urlData
            };
            // Remove any properties with null or undefined values
            Object.keys(bookNowParams).forEach((key) => {
                if (bookNowParams[key] === null || bookNowParams[key] === undefined || bookNowParams[key] === "") {
                    delete bookNowParams[key];
                }
            });
            return bookNowParams;
        } catch (error) {
            handleError(error, 'assignObjectVals');
        }
    };
    // Create a function that parses the URL and returns an object with the params
    function hrefToObj(url) {
        try {
            let href = url.replace(/%20/g, '')
            const params = (href.indexOf('?') == -1)
                ? {}
                : Object.fromEntries(new URLSearchParams(
                    href.substring(href.indexOf('?')),
                ));
            return params;
        } catch (error) {
            handleError(error, 'hrefToObj');
        }
    }
    // Create a direct link
    function objToSBlinks(params) {
        try {
            let siteUrl = `${window.location.pathname}?selfbook=true`;
            let sbObj = assignObjectVals(params);
            let prunedSBobj = pruneGuests(sbObj);
            let urlParams = decodeURIComponent(
                new URLSearchParams(prunedSBobj),
            ).toString();

            return `${siteUrl}&${urlParams}`;
        } catch (error) {
            handleError(error, 'objToSBlinks');
        }
    }

    /* Find booking links with specific keywords, then point them to Selfbook */
    function linkReplacer() {
        const allSynxisLinks = document.querySelectorAll(`a[href*='chain='], a[href*='synxis']`);
        if (allSynxisLinks.length > 0) {
            for (let i = 0; i < allSynxisLinks.length; i++) {
                const link = allSynxisLinks[i].href.toString().toLowerCase();
                const linkObj = hrefToObj(link);
                // const sbLink = objToSBlinks(linkObj);
                if (link.indexOf("signin") === -1) {
                    if (HOTELS_ON_SELFBOOK(linkObj.hotel)) {
                        allSynxisLinks[i].removeAttribute('target');
                        let finalParams = assignObjectVals(linkObj);
                        // allSynxisLinks[i].href = sbLink;
                        allSynxisLinks[i].href = "?book-now";
                        allSynxisLinks[i].addEventListener('click', (e) => {
                            e.preventDefault();
                            e.stopImmediatePropagation();
                            bookNow(finalParams);
                        });
                    }
                }
            }
        }
    };

    linkReplacer();
    setInterval(linkReplacer, 1000);


    // Form on Desktop, property specific pages
    if (document.querySelector("body > section.themed.themed-.slide-big.propertypage > div.book-widget.desktop > div > form > div.fields-wrapper > div.form-group.form-group-submit.text-center > button")) {
        document.querySelector("body > section.themed.themed-.slide-big.propertypage > div.book-widget.desktop > div > form > div.fields-wrapper > div.form-group.form-group-submit.text-center > button")
            .addEventListener('click', (event) => {
                event.preventDefault();
                event.stopImmediatePropagation();
                console.log("Form submission prevented!");
                let hotelName = document.querySelector("#modal_hotel").innerText.toLowerCase().trim();
                let hotelId = returnHotelId(hotelName);

                if (hotelId !== null) {
                    event.preventDefault();
                    event.stopImmediatePropagation();

                    let [arrive, depart] = document.querySelector("#modal_dates").value.split(" - ");

                    let obj = {};
                    obj.hotelId = hotelId;
                    obj.startDate = reformatDate(arrive);
                    obj.endDate = reformatDate(depart);
                    if (document.querySelector("#modal_code_type").innerText.toLowerCase() === 'iata code') {
                        obj.iataNumber = document.querySelector("#book-box > div > div > form > div.fields-wrapper > div.form-group.form-group-code-type > div.dropdown.code-type-dropdown > input[type=text]").value;
                    }
                    else if (document.querySelector("#modal_code_type").innerText.toLowerCase() === 'promo code') {
                        obj.promoCode = document.querySelector("#book-box > div > div > form > div.fields-wrapper > div.form-group.form-group-code-type > div.dropdown.code-type-dropdown > input[type=text]").value;
                    }
                    else if (document.querySelector("#modal_code_type").innerText.toLowerCase() === 'group code') {
                        obj.groupCode = document.querySelector("#book-box > div > div > form > div.fields-wrapper > div.form-group.form-group-code-type > div.dropdown.code-type-dropdown > input[type=text]").value;
                    }
                    bookNow(obj);
                    console.log("Form submission prevented!", obj);
                }
            });
    }

    // Form on desktop, on homepage
    if (document.querySelector("body > section.themed.themed-.slide-big.homepageplaceholder.direct-video > div.book-widget.desktop > div > form > div.fields-wrapper > div.form-group.form-group-submit.text-center > button")) {
        document.querySelector("body > section.themed.themed-.slide-big.homepageplaceholder.direct-video > div.book-widget.desktop > div > form > div.fields-wrapper > div.form-group.form-group-submit.text-center > button")
            .addEventListener('click', (event) => {
                event.preventDefault();
                event.stopImmediatePropagation();
                console.log("Form submission prevented!");
                let hotelName = document.querySelector("#inline_hotel > span").innerText.toLowerCase().trim();
                let hotelId = returnHotelId(hotelName);

                if (hotelId !== null) {
                    event.preventDefault();
                    event.stopImmediatePropagation();

                    let [arrive, depart] = document.querySelector("#inline_dates").value.split(" - ");

                    let obj = {};
                    obj.hotelId = hotelId;
                    obj.startDate = reformatDate(arrive);
                    obj.endDate = reformatDate(depart);
                    if (document.querySelector("#inline_code_type").innerText.toLowerCase() === 'iata code') {
                        obj.iataNumber = document.querySelector("body > section.themed.themed-.slide-big.homepageplaceholder.direct-video > div.book-widget.desktop > div > form > div.fields-wrapper > div.form-group.form-group-code-type > div.dropdown.code-type-dropdown > input[type=text]").value;
                    }
                    else if (document.querySelector("#inline_code_type").innerText.toLowerCase() === 'promo code') {
                        obj.promoCode = document.querySelector("body > section.themed.themed-.slide-big.homepageplaceholder.direct-video > div.book-widget.desktop > div > form > div.fields-wrapper > div.form-group.form-group-code-type > div.dropdown.code-type-dropdown > input[type=text]").value;
                    }
                    else if (document.querySelector("#inline_code_type").innerText.toLowerCase() === 'group code') {
                        obj.groupCode = document.querySelector("body > section.themed.themed-.slide-big.homepageplaceholder.direct-video > div.book-widget.desktop > div > form > div.fields-wrapper > div.form-group.form-group-code-type > div.dropdown.code-type-dropdown > input[type=text]").value;
                    }
                    bookNow(obj);
                    console.log("Form submission prevented!", obj);
                }
            });
    }
    // Form on mobile_display_only
    if (document.querySelector("#book-box > div > div > form > div.fields-wrapper > div.form-group.form-group-submit.text-center > button")) {
        document.querySelector("#book-box > div > div > form > div.fields-wrapper > div.form-group.form-group-submit.text-center > button")
            .addEventListener('click', (event) => {
                // if(document.querySelector("#modal_property_type").textContent.toLowerCase().trim() === '1 - 29 nights'){

                // }
                let hotelName = document.querySelector("#modal_hotel").innerText.toLowerCase().trim();
                let hotelId = returnHotelId(hotelName);
                if (hotelId !== null) {
                    event.preventDefault();
                    event.stopImmediatePropagation();

                    let [arrive, depart] = document.querySelector("#modal_dates").value.split(" - ");

                    let obj = {};
                    obj.hotelId = hotelId;
                    obj.startDate = reformatDate(arrive);
                    obj.endDate = reformatDate(depart);
                    if (document.querySelector("#modal_code_type").innerText.toLowerCase() === 'iata code') {
                        obj.iataNumber = document.querySelector("#book-box > div > div > form > div.fields-wrapper > div.form-group.form-group-code-type > div.dropdown.code-type-dropdown > input[type=text]").value;
                    }
                    else if (document.querySelector("#modal_code_type").innerText.toLowerCase() === 'promo code') {
                        obj.promoCode = document.querySelector("#book-box > div > div > form > div.fields-wrapper > div.form-group.form-group-code-type > div.dropdown.code-type-dropdown > input[type=text]").value;
                    }
                    else if (document.querySelector("#modal_code_type").innerText.toLowerCase() === 'group code') {
                        obj.groupCode = document.querySelector("#book-box > div > div > form > div.fields-wrapper > div.form-group.form-group-code-type > div.dropdown.code-type-dropdown > input[type=text]").value;
                    }
                    bookNow(obj);
                    console.log("Form submission prevented!", obj);
                }
            });
    }



    // Global error capture
    window.onerror = (message, source, lineno, colno, error) => {
        // Returning true prevents the default browser error handling
        const source_error = source?.toString().toLowerCase();
        const message_error = message?.toString().toLowerCase();
        if (
            source_error
            && source_error.includes('selfbook')
            && !source_error.includes('selfbook=true')
            && !message_error?.includes('resizeobserver')
            && !message_error?.includes('intersectionobserver')
        ) {
            const customError = {
                name: message?.toString().split(' ')[0],
                message: ` message: ${message}. source: ${source}. lineno: ${lineno}. colno: ${colno}.  error: ${error}.`,
            };

            if (
                source_error.toString().includes('react') ||
                source_error.toString().includes('saga.js')
            ) {
                handleError(customError, 'selfbook-crash', 'sb_integrations');
                return true;
            }
            else {
                handleError(customError, 'window.onerror');
                return true;
            }
        }
    };

} else {
    console.log("SB Not Loaded");
}