function AvailabilityModel(){const e=this,t="undefined"!=typeof window&&window.ROOM_INITIAL_PRICING?window.ROOM_INITIAL_PRICING:null;e.checkInDate=ko.observable(new Date),e.checkOutDate=ko.observable(new Date),e.guests=ko.observable(1),e.bedType=ko.observable("");const a=e=>{const t=Number(e);return Number.isFinite(t)?Math.round(100*t)/100:null},i=a(t?.nightlyPrice),n=a(t?.nightlyOriginalPrice),r=e=>Array.isArray(e)?e.filter(e=>e&&!1!==e.isActive).map(e=>{const t=Math.round(100*(Number(e.priceDelta)||0))/100,a=t>0?` (+£${t.toFixed(2)})`:"";return{id:e.id||e.value,label:e.label||"",priceDelta:t,displayLabel:`${e.label||""}${a}`}}).filter(e=>e.id&&e.label):[];e.bedOptions=ko.observableArray("undefined"!=typeof window&&Array.isArray(window.ROOM_BED_OPTIONS)?r(window.ROOM_BED_OPTIONS):r([])),e.setBedOptions=t=>{e.bedOptions(r(t))},e.price=ko.observable(i),e.originalPrice=ko.observable(n),e.discountPercent=ko.observable(Number(t?.discountPercent)||0),e.isUnavailable=ko.observable(!1),e.unavailabilityReason=ko.observable(null),e.unavailabilityMessage=ko.pureComputed(()=>{if(!e.isUnavailable())return"";switch(e.unavailabilityReason()){case"blocked":return"The selected room is unavailable on these dates. Please choose an alternative date or explore our other suites.";case"unavailable":return"Those dates are already booked. Please try a different range.";case"locked-range":return"Your selection includes blocked days. Adjust the dates to continue.";default:return"The selected dates are currently unavailable. Please pick another set of dates."}}),e.unavailableDates=ko.observableArray([]),e.resetPricing=()=>{e.price(null),e.originalPrice(null),e.discountPercent(0)};const o=e=>`${String.fromCharCode(163)}${(Number(e)||0).toFixed(2)}`,c=e=>String(e).padStart(2,"0"),l=e=>{if(!e)return null;if(e instanceof Date)return Number.isNaN(e.getTime())?null:e;const t=new Date(e);return Number.isNaN(t.getTime())?null:t},s=e=>{const t=l(e);return t?`${t.getFullYear()}-${c(t.getMonth()+1)}-${c(t.getDate())}`:null},u=(e,t)=>!e&&!t||!(!e||!t)&&(e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate());e.stayNights=ko.pureComputed(()=>{const t=l(e.checkInDate()),a=l(e.checkOutDate());if(!t||!a)return 1;const i=(a.getTime()-t.getTime())/864e5;return!Number.isFinite(i)||i<=0?1:Math.max(1,Math.round(i))}),e.selectedBedOption=ko.pureComputed(()=>{const t=e.bedType();if(!t)return null;return e.bedOptions().find(e=>e&&e.id===t)||null}),e.bedOptions.subscribe(t=>{const a=e.bedType();if(!a)return;Array.isArray(t)&&t.some(e=>e.id===a)||e.bedType("")}),e.bedSurchargePerNight=ko.pureComputed(()=>{const t=e.selectedBedOption();if(!t)return 0;const a=Number(t.priceDelta);return Number.isFinite(a)?Math.max(0,a):0}),e.formattedBedSurchargePerNight=ko.pureComputed(()=>o(e.bedSurchargePerNight())),e.bedSurcharge=ko.pureComputed(()=>{const t=e.bedSurchargePerNight();return Math.round(t*e.stayNights()*100)/100}),e.formattedBedSurcharge=ko.pureComputed(()=>o(e.bedSurcharge()));const d=(e,t)=>{const a=Number(e),i=Number(t);if(!Number.isFinite(a))return null;const n=Number.isFinite(i)?i:0;return Math.round(100*(a+n))/100};e.displayPrice=ko.pureComputed(()=>d(e.price(),e.bedSurcharge())),e.displayOriginalPrice=ko.pureComputed(()=>d(e.originalPrice(),e.bedSurcharge())),e.formattedPrice=ko.pureComputed(()=>o(e.displayPrice())),e.formattedOriginalPrice=ko.pureComputed(()=>o(e.displayOriginalPrice())),e.baselineOriginalTotal=ko.pureComputed(()=>null===n?null:Math.round(n*e.stayNights()*100)/100),e.hasDiscount=ko.pureComputed(()=>{const t=Number(e.displayOriginalPrice()),a=Number(e.displayPrice());return!(!Number.isFinite(t)||!Number.isFinite(a))&&t-a>.009}),e.effectiveDiscountPercent=ko.pureComputed(()=>{const t=Number(e.displayOriginalPrice()),a=Number(e.displayPrice());return!Number.isFinite(t)||!Number.isFinite(a)||t<=a?0:Math.max(0,Math.round((t-a)/t*100))});const b=(e=[])=>e.map(e=>e?"string"==typeof e?e:e.start&&e.end?{from:e.start,to:e.end}:null:null).filter(Boolean);e.getUnavailableDates=async()=>{const t=new Date,a=new Date;a.setFullYear(t.getFullYear()+2);const i={checkin:t.toISOString().split("T")[0],checkout:a.toISOString().split("T")[0]};try{const t=await fetch(`/rooms/${ROOM_ID}/unavailability`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!t.ok)throw new Error("Failed to check availability");const a=await t.json();e.unavailableDates(a)}catch(t){console.error("Error checking availability:",t),e.isUnavailable(!0),e.unavailabilityReason(null)}},e.checkAvailability=async()=>{const i={checkin:ko.unwrap(e.checkInDate),checkout:ko.unwrap(e.checkOutDate),guests:ko.unwrap(e.guests)};try{const n=await fetch(`/rooms/${SLUG}/availability`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!n.ok)throw new Error("Failed to check availability");const r=await n.json();if(r&&r.rental){const i=r.rental;e.isUnavailable(!!i.isUnavailable),e.unavailabilityReason(i.unavailabilityReason||null);const n=a(i.price);e.price(n);let o=a(i.originalPrice);null===o&&(o=n);const c=e.baselineOriginalTotal();Number.isFinite(c)&&(null===o||!Number.isFinite(o)||o<=n)&&Number.isFinite(n)&&(o=c),e.originalPrice(o);const l=Number(i.discountPercent)||0;e.discountPercent(l>0?l:Number(t?.discountPercent)||0)}else e.isUnavailable(!0),e.unavailabilityReason(null),e.resetPricing()}catch(t){console.error("Error checking availability:",t),e.isUnavailable(!0),e.unavailabilityReason(null),e.resetPricing()}},e.checkinPickers=[],e.checkoutPickers=[];const h=e=>{Array.isArray(e)&&e.forEach(e=>{e&&"function"==typeof e.destroy&&e.destroy()})},k=()=>{const t=b(e.unavailableDates());e.checkinPickers.forEach(e=>e.set("disable",t)),e.checkoutPickers.forEach(e=>e.set("disable",t))};e.unavailableDates.subscribe(()=>{k()}),e.initLitepickers=()=>{if("undefined"==typeof flatpickr)return;const t=Array.from(document.querySelectorAll('[data-availability-input="checkin"]')),a=Array.from(document.querySelectorAll('[data-availability-input="checkout"]')),i=document.getElementById("availability-date-error");if(!t.length||!a.length)return;h(e.checkinPickers),h(e.checkoutPickers),e.checkinPickers=[],e.checkoutPickers=[];const n=new Date;n.setHours(0,0,0,0);const r=(()=>{try{return new Intl.DateTimeFormat(navigator.language||void 0,{month:"short",day:"numeric",year:"numeric"})}catch(e){return{format:e=>e.toLocaleDateString()}}})(),o=e=>{if(!e||!e.altInput)return;const t=e._input,a=t&&t.getAttribute("placeholder")||"";t&&(e.altInput.className=t.className),e.altInput.placeholder=a;const i=e.selectedDates&&e.selectedDates[0];i instanceof Date&&!Number.isNaN(i.getTime())?e.altInput.value=r.format(i):e.altInput.value=""},c=()=>{i&&(i.textContent="",i.classList.add("hidden"))},u=e=>{const t=l(e)||n,a=new Date(t.getTime());return a.setDate(a.getDate()+1),a},d=()=>{const t=u(e.checkInDate());return e.checkoutPickers.forEach(e=>e.set("minDate",t)),t},p=()=>{e.checkInDate()&&e.checkOutDate()&&e.checkAvailability()},m=()=>{var e;e="Your departure must be at least one day after your arrival.",i&&(i.textContent=e,i.classList.remove("hidden"))},y=b(e.unavailableDates());e.checkoutPickers=a.map(t=>(t=>flatpickr(t,{dateFormat:"Y-m-d",minDate:u(e.checkInDate()),defaultDate:e.checkOutDate()||null,altInput:!0,altFormat:"Y-m-d",disable:y,onReady:(e,t,a)=>{o(a)},onChange:(t,a,i)=>{const n=t[0]||null;if(c(),o(i),!n)return e.checkOutDate(null),void e.syncDatePickers();const r=s(n);if(!r)return;const u=l(e.checkInDate()),b=l(r);if(u&&b&&b<=u){m();const t=d();return e.checkOutDate(s(t)),void e.syncDatePickers()}e.checkOutDate(r),p(),e.syncDatePickers()},onValueUpdate:(e,t,a)=>{o(a)}}))(t)),e.checkinPickers=t.map(t=>(t=>flatpickr(t,{dateFormat:"Y-m-d",minDate:n,defaultDate:e.checkInDate()||null,altInput:!0,altFormat:"Y-m-d",disable:y,onReady:(e,t,a)=>{o(a)},onChange:(t,a,i)=>{const n=t[0]||null;if(c(),o(i),!n)return e.checkInDate(null),void e.syncDatePickers();const r=s(n);if(!r)return;e.checkInDate(r);const u=d(),b=l(e.checkOutDate());(!b||b<=l(r))&&e.checkOutDate(s(u)),p(),e.syncDatePickers()},onValueUpdate:(e,t,a)=>{o(a)}}))(t)),k(),d(),e.syncDatePickers()},e.syncDatePickers=function(){const t=l(e.checkInDate()),a=l(e.checkOutDate());e.checkinPickers.forEach(e=>{const a=e.selectedDates&&e.selectedDates[0];u(a,t)||e.setDate(t||null,!1,"Y-m-d")}),e.checkoutPickers.forEach(e=>{const t=e.selectedDates&&e.selectedDates[0];u(t,a)||e.setDate(a||null,!1,"Y-m-d")})},e.guests.subscribe(t=>{e.checkAvailability()}),e.updatePickerLayout=()=>{},e.checkAvailability()}function BookingModel(){this.availabilityModel=new AvailabilityModel}const SLUG=window.location.pathname.split("/").filter(Boolean).pop(),bookingsView=new BookingModel;document.addEventListener("DOMContentLoaded",()=>{ko.applyBindings(bookingsView,document.getElementById("root"))});