1const locationsIcons={hotel:"hotel",airport:"plane",airbnb:"house",zone:"location-dot"};function initAutocomplete(t,n,i,s,l,r=null,c=null){let u;const m=n.closest(".autocomplete-dropdown");async function v(){const g=t.value;if(g.length<2){n.innerHTML="",m.classList.remove("is-open");return}const d=s.includes("?")?"&":"?",p=await(await fetch(`${s}${d}q=${encodeURIComponent(g)}`)).json();if(!p.success){console.error("Error fetching data:",p.msg);return}h(p.results)}function h(g){if(n.innerHTML="",g.length===0){const d=document.createElement("div");d.className="autocomplete-item",d.textContent="No results found",n.appendChild(d),m.classList.add("is-open");return}g.forEach(d=>{const y=document.createElement("div");y.className="autocomplete-item",y.innerHTML=l(d),y.addEventListener("click",()=>{r&&r.querySelector("use").setAttribute("xlink:href",`/build/sprites/solid.svg#${locationsIcons[d.type]||"map-pin"}`),t.value=d.name,i.value=d.id,c&&(c.value=d.type),m.classList.remove("is-open"),t.dispatchEvent(new Event("change",{bubbles:!0})),i.dispatchEvent(new Event("change",{bubbles:!0}))}),n.appendChild(y)}),m.classList.add("is-open")}t.addEventListener("input",()=>{i.value="",!t.value.trim()&&r&&r.querySelector("use").setAttribute("xlink:href","/build/sprites/solid.svg#map-pin"),clearTimeout(u),u=setTimeout(v,300)}),document.addEventListener("click",g=>{!g.target.closest(".autocomplete-item")&&!g.target.closest(".autocomplete-results")&&(n.innerHTML="")})}function initStepper(t,n,i,s,l,r){i.addEventListener("click",()=>{parseInt(t.value)<r&&(t.value=parseInt(t.value)+1,t.dispatchEvent(new Event("change",{bubbles:!0})),n.textContent=t.value)}),s.addEventListener("click",()=>{parseInt(t.value)>l&&(t.value=parseInt(t.value)-1,t.dispatchEvent(new Event("change",{bubbles:!0})),n.textContent=t.value)})}async function fetchVehicleOptions(t,n,i,s,l,r,c,u=null){s=parseInt(s.value),l=parseInt(l.value);const m=i.value;if(![1,2].includes(parseInt(c))||!Number.isInteger(s)||!Number.isInteger(l)||r<1||r>22){resetVehicleSelection(t,n,i);return}let v;try{v=await(await fetch(`/api/get-cost-options?from=${s}&to=${l}&pax=${r}&service=${c}`)).json()}catch(h){console.error("Error fetching vehicle options",h),resetVehicleSelection(t,n,i,u);return}if(!v.success){console.error("Error fetching vehicle options:",v.msg),resetVehicleSelection(t,n,i,u);return}resetVehicleSelection(t,n,i,u),renderVehicleCards(n,t,v.options,i,m,u)}function resetVehicleSelection(t,n,i,s=null){n.forEach(l=>{l.classList.remove("selected"),l.classList.add("disabled"),l.dataset.cost=""}),i.value="",i.dispatchEvent(new Event("change",{bubbles:!0})),s&&(s.value="0.00",s.dispatchEvent(new Event("change",{bubbles:!0})))}function renderVehicleCards(t,n,i,s,l,r){t.forEach(c=>{c.classList.add("disabled")}),i.forEach(c=>{const u=Array.from(t).find(v=>v.dataset.shuttle===String(c.shuttle_id));if(!u)return;u.setAttribute("data-cost",c.price);const m=u.querySelector(".price__value");m.textContent=`${c.price.toFixed(2)}`,u.classList.remove("disabled"),String(c.shuttle_id)===l&&(u.classList.add("selected"),s.value=l,s.dispatchEvent(new Event("change",{bubbles:!0})),r&&(r.value=c.price,r.dispatchEvent(new Event("change",{bubbles:!0}))))}),n.addEventListener("click",c=>{const u=c.target.closest("[data-shuttle]");!u||u.classList.contains("disabled")||(t.forEach(m=>m.classList.remove("selected")),u.classList.add("selected"),s.value=u.dataset.shuttle,s.dispatchEvent(new Event("change",{bubbles:!0})))})}function setMinDate(){const t=new Date;t.setDate(t.getDate());const n=t.toISOString().split("T")[0];document.querySelectorAll('input[type="date"]').forEach(i=>{i.min=n})}async function submitForm(t,n){showLoader(!0);try{const s=await(await fetch(t,{method:"POST",body:n})).json();if(!s.success){showAlert("Error creating booking",s.msg,!1);return}window.location.href=s.redirect_url}catch(i){showAlert("Error creating booking",i.message,!1)}finally{showLoader(!1)}}async function validateInput(t,n){if(t.hasAttribute("data-no-validate"))return;const i={field:{name:t.name,value:t.value},formData:n?Object.fromEntries(n.entries()):void 0},s=await fetch("/validate-input",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...i})});if(!s.ok)return;const l=await s.json(),r=document.querySelector(`[data-validator="${t.name}"]:not([disabled])`);if(!r)return;const c=r.parentElement.querySelector(".validation-message");if(c){if(l.success){c.textContent="",c.style.display="none",r.parentElement.classList.remove("input-error");return}c.textContent=l.msg,c.style.display="inline",r.parentElement.classList.add("input-error")}}async function validateForm(t){const n=await fetch("/validate-form",{method:"POST",body:t});if(!n.ok)return!1;const i=await n.json();if(i.success)return!0;let s=null;
1return Object.keys(i.errors).forEach(l=>{const r=document.querySelector(`[data-validator="${l}"]:not([disabled])`);if(!r)return;const c=r.parentElement.querySelector(".validation-message");c&&(r.parentElement.classList.add("input-error"),c.textContent=i.errors[l],c.style.display="inline",s||(s=r))}),s&&(s.scrollIntoView({behavior:"smooth",block:"center"}),s.focus({preventScroll:!0})),!1}async function validateBookingWidget(t){const n=await fetch("/validate-booking-widget",{method:"POST",body:t});if(!n.ok)return!1;const i=await n.json();if(i.success)return!0;let s=null;return Object.keys(i.errors).forEach(l=>{const r=document.querySelector(`[data-validator="${l}"]:not([disabled])`);r&&(r.parentElement.classList.add("input-error"),s||(s=r))}),s&&(s.scrollIntoView({behavior:"smooth",block:"center"}),s.focus({preventScroll:!0})),!1}function clearError(t){const n=t.parentElement.querySelector(".validation-message");n&&(n.style.display="none",n.textContent="",t.parentElement.classList.remove("input-error"))}const widget=document.getElementById("booking-form");let widgetRules=null;if(widgetConfig&&(widgetRules=widgetConfig),widget){let x=function(){const o=n.options[n.selectedIndex].dataset.icon||"route";n.previousElementSibling.querySelector("use").setAttribute("xlink:href",`build/sprites/solid.svg#${o}`)},A=function(e){return{wrapper:widget.querySelector(`#${e}-custom-wrapper`),toggle:widget.querySelector(`#${e}-custom-toggle`),confirmation:widget.querySelector(`#${e}-custom-confirmation`),confirmationName:widget.querySelector(`#${e}-custom-confirmation-name`),hotelInput:widget.querySelector(`#${e}_name`),inputIcon:widget.querySelector(`#${e}-icon`),idInput:widget.querySelector(`#${e}_id`),customFlag:widget.querySelector(`#${e}-custom-flag`),customNameVal:widget.querySelector(`#${e}-custom-name-val`),customAddressVal:widget.querySelector(`#${e}-custom-address-val`),customMapsVal:widget.querySelector(`#${e}-custom-maps-val`),customZoneVal:widget.querySelector(`#${e}-custom-zone-val`)}},M=function(e){const o=A(e);!o.toggle||!o.wrapper||o.wrapper.style.display==="none"||(I=e,O(),k.value=o.customNameVal.value||"",_.value=o.customAddressVal.value||"",Z.value=o.customMapsVal.value||"",V.value=o.customZoneVal.value||"",C("custom"))},z=function(){if(!I)return;const e=A(I),o=_.value.trim(),a=V.value,f=k.value.trim(),b=Z.value.trim(),S=f||o;O();let q=!0;o||(w.textContent=U,w.style.display="inline",_.classList.add("input-error"),q=!1),a||(L.textContent=J,L.style.display="inline",V.classList.add("input-error"),q=!1),q&&(e.customFlag.value="1",e.customNameVal.value=f,e.customAddressVal.value=o,e.customMapsVal.value=b,e.customZoneVal.value=a,e.idInput.value=a,e.hotelInput.value=S,e.inputIcon.className="fa-solid fa-house",e.idInput.dispatchEvent(new Event("change",{bubbles:!0})),e.hotelInput.dispatchEvent(new Event("change",{bubbles:!0})),e.confirmationName&&(e.confirmationName.textContent=S),e.confirmation&&(e.confirmation.hidden=!1),C("main"))},H=function(e,o=!1){const a=A(e),f=a.customFlag&&a.customFlag.value==="1";a.customFlag&&(a.customFlag.value="0"),a.customNameVal&&(a.customNameVal.value=""),a.customAddressVal&&(a.customAddressVal.value=""),a.customMapsVal&&(a.customMapsVal.value=""),a.customZoneVal&&(a.customZoneVal.value=""),a.confirmation&&(a.confirmation.hidden=!0),f&&a.idInput&&(a.idInput.value="",a.idInput.dispatchEvent(new Event("change",{bubbles:!0}))),!o&&a.hotelInput&&(a.hotelInput.value="")},O=function(){w.textContent="",w.style.display="none",L.textContent="",L.style.display="none",_.classList.remove("input-error"),V.classList.remove("input-error")},C=function(e){if(!P||!T||!$)return;P.dataset.activeView=e;const o=e==="main";if(T.classList.toggle("is-active",o),$.classList.toggle("is-active",!o),T.setAttribute("aria-hidden",o?"false":"true"),$.setAttribute("aria-hidden",o?"true":"false"),o){if(I){const a=widget.querySelector(`#${I}-custom-toggle`);a&&a.focus()}}else if(K)k.focus();else{let a=!1;const f=()=>{a||(a=!0,k.focus())};$.addEventListener("transitionend",f,{once:!0}),setTimeout(f,240)}},B=function(e,o){if(!e)return;const a=new Date(e);o.min=a.toISOString().split("T")[0]},D=function(){const e=n.value==="2";E.disabled=!e,E.closest(".input-group").style.display=e?"block":"none",E.closest(".input-group").classList.toggle("has-return",e),E.closest(".input-group").classList.toggle("disabled",!e),p.
1closest(".input-group").classList.toggle("has-return",e)},R=function(e,o,a,f){const b=widget.querySelector(`#${e}_name`),S=widget.querySelector(`#${e}_id`),q=widget.querySelector(`#${e}_type`);b&&S&&q&&(b.value=f,S.value=a,q.value=o)};var updateSelectIcon=x,getDirectionNodes=A,openCustomView=M,handleCustomSave=z,clearCustomState=H,clearCustomErrors=O,switchWidgetView=C,setReturnDateMin=B,toggleReturnDate=D,applyPlaceLock=R;const n=widget.querySelector("#service_type"),i=widget.querySelector("#origin_name"),s=widget.querySelector("#origin-results"),l=widget.querySelector("#origin_id"),r=widget.querySelector("#origin-icon"),c=widget.querySelector("#origin_type"),u=widget.querySelector("#destination_name"),m=widget.querySelector("#destination-results"),v=widget.querySelector("#destination_id"),h=widget.querySelector("#destination-icon"),g=widget.querySelector("#destination_type"),d=widget.querySelector("#date1-group"),y=widget.querySelector("#date2-group"),p=widget.querySelector("#date1"),E=widget.querySelector("#date2"),F=widget.querySelectorAll(".stepper-control"),j=widget.querySelector("#adults-input"),N=widget.querySelector("#children-input"),P=widget.querySelector("#booking-widget-views"),T=widget.querySelector("#booking-widget-main-view"),$=widget.querySelector("#booking-widget-custom-view"),W=widget.querySelector("#custom-address-cancel"),G=widget.querySelector("#custom-address-save"),k=widget.querySelector("#widget-custom-name"),_=widget.querySelector("#widget-custom-address"),Z=widget.querySelector("#widget-custom-maps"),V=widget.querySelector("#widget-custom-zone"),w=widget.querySelector("#widget-custom-address-error"),L=widget.querySelector("#widget-custom-zone-error"),U=w?.dataset.message||"Address is required.",J=L?.dataset.message||"Please select a zone.",K=window.matchMedia("(prefers-reduced-motion: reduce)").matches;let Q="/api/locations",X="/api/locations";widgetRules&&(widgetRules.origin.place_lock&&R("origin",widgetRules.origin.type,widgetRules.origin.place_lock,widgetRules.origin.name),widgetRules.destination.place_lock&&R("destination",widgetRules.destination.type,widgetRules.destination.place_lock,widgetRules.destination.name));let I=null;i&&s&&l&&initAutocomplete(i,s,l,Q,e=>` 2 <svg data-icon=${locationsIcons[e.type]} class="icon autocomplete-icon"><use xlink:href="build/sprites/solid.svg#${locationsIcons[e.type]}"></use></svg> 3 <span class="autocomplete-name">${e.name}</span> 4 ${e.direction?`<div class="autocomplete-meta">${e.direction}</div>`:""} 5 <div class="autocomplete-meta">${e.location}</div> 6 `,r,c),u&&m&&v&&initAutocomplete(u,m,v,X,e=>` 7 <svg data-icon=${locationsIcons[e.type]} class="icon autocomplete-icon"><use xlink:href="build/sprites/solid.svg#${locationsIcons[e.type]}"></use></svg> 8 <span class="autocomplete-name">${e.name}</span> 9 ${e.direction?`<div class="autocomplete-meta">${e.direction}</div>`:""} 10 <div class="autocomplete-meta">${e.location}</div> 11 `,h,g),F.forEach(e=>{const o=e.dataset.target,a=e.querySelector(`#${o}-input`),f=e.querySelector(`#${o}-value`),b=e.querySelector(".stepper-btn--plus"),S=e.querySelector(".stepper-btn--minus");initStepper(a,f,b,S,o==="adults"?1:0,20)}),n.addEventListener("change",()=>{D(),x()}),p.addEventListener("change",()=>{B(p.value,E)}),W.addEventListener("click",()=>C("main")),G.addEventListener("click",z),["origin","destination"].forEach(e=>{const o=widget.querySelector(`#${e}-custom-toggle`),a=widget.querySelector(`#${e}-custom-edit`),f=widget.querySelector(`#${e}_name`);o&&o.addEventListener("click",()=>{o.closest(".autocomplete-dropdown").classList.remove("is-open"),M(e)}),a&&a.addEventListener("click",()=>M(e)),f&&f.addEventListener("input",()=>H(e,!0))}),document.addEventListener("DOMContentLoaded",()=>{D(),x()}),widget.addEventListener("input",e=>{const o=e.target.closest("[data-validator]");o&&clearError(o)}),widget.addEventListener("submit",async e=>{e.preventDefault();const o=new FormData(widget);if(await validateBookingWidget(o)){const f=await fetch(widget.action,{method:widget.method,body:o});if(f.ok){const b=await f.json();b.success&&(window.location.href=b.redirectUrl)}else alert("Error processing booking. Please try again.")}})}
11const stickyCta=document.querySelector("#sticky-booking-cta"),ctaTrigger=document.querySelector(".cta-trigger"),observer=new IntersectionObserver(([t])=>{stickyCta.classList.toggle("visible",!t.isIntersecting)},{rootMargin:"-100px 0px 0px 0px",threshold:0});observer.observe(ctaTrigger),document.querySelector(".sticky-book-btn").addEventListener("click",()=>{widget.scrollIntoView({behavior:"smooth",block:"start"})}),document.addEventListener("DOMContentLoaded",()=>{const t=document.querySelectorAll(".destination-row"),n=document.querySelector("#search"),i=5,s=5;let l=i;const r=document.querySelector(".destinations-rows"),c=document.createElement("div");c.className="destinations-list__actions";const u=document.createElement("button");u.type="button",u.className="destinations-list__show-more",u.textContent="Show More Destinations",c.appendChild(u),r.parentNode.appendChild(c);function m(){const d=n?.value?.trim()?.toLowerCase()||"";let y=0;if(t.forEach((p,E)=>{const j=(p.querySelector(".destination-row__title")?.textContent?.trim()?.toLowerCase()||"").includes(d);if(d.length>0){p.style.display=j?"flex":"none";return}const N=y<l;p.style.display=N?"flex":"none",N&&y++}),d.length>0){u.style.display="none";return}u.style.display=l>=t.length?"none":"inline-flex"}u.addEventListener("click",()=>{l+=s,m()}),n&&n.addEventListener("input",()=>{m()}),m();const v=document.querySelectorAll(".fleet-grid__handler-item"),h=document.querySelectorAll(".fleet-grid__details-item");v.length&&h.length&&v.forEach((d,y)=>{d.addEventListener("click",()=>{v.forEach(p=>{p.classList.remove("is-active")}),h.forEach(p=>{p.classList.remove("is-active")}),d.classList.add("is-active"),h[y]&&h[y].classList.add("is-active")})});const g=document.querySelectorAll(".faq-item");g.length&&g.forEach(d=>{d.querySelector(".faq-question").addEventListener("click",()=>{const p=d.classList.contains("is-active");g.forEach(E=>{E.classList.remove("is-active")}),p||d.classList.add("is-active")})})});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.