function handleMobileChange(e){isMobile=e.matches,triggerUrlChange&&triggerUrlChange()}function isValidCoords(e){if(!e||"string"!=typeof e)return!1;const t=e.split(",").map((e=>e.trim()));if(2!==t.length)return!1;const n=parseFloat(t[0]),i=parseFloat(t[1]);return!isNaN(n)&&!isNaN(i)&&n>=-90&&n<=90&&i>=-180&&i<=180}function startLoadingDots(){const e=document.querySelector(".map-loader span");if(!e)return;e.textContent="...",e.style.display="inline-block",e.style.width="18px";let t=0;dotsTimer&&clearInterval(dotsTimer),dotsTimer=setInterval((()=>{t=(t+1)%4,e.style.opacity=0===t?"0":"1",e.style.clipPath=1===t?"inset(0 66% 0 0)":2===t?"inset(0 40% 0 0)":"inset(0 0 0 0)"}),350)}function stopLoadingDots(){const e=document.querySelector(".map-loader span");e&&(e.textContent=""),dotsTimer&&(clearInterval(dotsTimer),dotsTimer=null)}function showLoader(){const e=document.querySelector(".map-loader");e&&(e.style.opacity="1",e.style.visibility="visible",e.style.pointerEvents="auto",startLoadingDots())}function hideLoader(){const e=document.querySelector(".map-loader");e&&(e.style.opacity="0",e.style.visibility="hidden",e.style.pointerEvents="none",stopLoadingDots())}function createMarkerPopup(e){const t=document.createElement("div");return t.className="map-popup",t.innerHTML=`\n
\n \n \n \n `,t.dataset.markerId=e.id,t}function createPropertyModal(e){const t='',n=e.fieldData.preview&&e.fieldData.preview.url,i=e.fieldData.address||e.fieldData.name||"",a=n?`
`:t,o=e.fieldData["bedroomns-min"],l=e.fieldData["bedroomns-max"],s=o&&l&&o!==l?`${o}-${l}`:o||l||"0",r=e.fieldData["bathroomns-max"]||e.fieldData["bathroomns-min"]||"0",d=e.fieldData["car-parks-max"]||e.fieldData["car-parks-min"]||"0",p=e.fieldData["available-units"]||"",c=1==+p?"Townhouse":"Townhouses",m=e.fieldData["estimated-completion"]||"",f=e.fieldData["price-min-2"]||"",g=e.fieldData["price-max-2"]||"",u=e.fieldData.slug||"#",y=`$ ${f} ${g?"- $ "+g:""}`,h=`${i}
`,b=document.createElement("div");return b.className="map-popup property-modal",b.innerHTML=`\n \n `,b}function waitForMapRenderBalanced(e,t=800){return new Promise((n=>{let i=!1;const a=()=>{i||(i=!0,n())};google.maps.event.addListenerOnce(e,"idle",(()=>{requestAnimationFrame(a)})),setTimeout(a,t)}))}function debounce(e,t){let n;return function(...i){clearTimeout(n),n=setTimeout((()=>e.apply(this,i)),t)}}function cleanupPopups(){document.querySelectorAll(".map-popup").forEach((e=>e.remove()))}function panWithVerticalOffset(e,t,n=.6){const i=e.getProjection();if(!i)return void e.panTo(t);const a=e.getDiv().getBoundingClientRect(),o=i.fromLatLngToPoint(t),l=a.height*n,s=(a.height/2-l)/Math.pow(2,e.getZoom()),r=new google.maps.Point(o.x,o.y+s),d=i.fromPointToLatLng(r);e.panTo(d)}const DEFAULT_NZ_CENTER={lat:-41.28664,lng:174.77557},DEFAULT_NZ_ZOOM=5.5,LAMBDA_FUNCTION_LINK="https://y7lafgvhqa.execute-api.eu-central-1.amazonaws.com/Prod/property",mobileQuery=window.matchMedia("(max-width: 700px)");let isMobile=mobileQuery.matches;mobileQuery.addEventListener("change",handleMobileChange);let dotsTimer=null;window.initMap=async function(){function e(){const e=document.createElement("div");return e.className="map-marker",e}function t(e,t){const n=e.content;n&&n.classList.toggle("is-active",t)}function n(e,t){const n=t.getBoundingClientRect(),i=a.getBoundingClientRect(),o=i.left+i.width/2+window.pageXOffset,l=i.top+i.height/2+window.pageYOffset,s=40,r=isMobile?35:100,d=o-n.width/2,p=l-n.height/2-s-r;t.style.left=d+"px",t.style.top=p+"px"}function i(){m&&t(m,!1),m=null,f&&(f.remove(),f=null),g.forEach((e=>window.removeEventListener(e.name,e.handler))),g=[]}cleanupPopups();const a=document.querySelector("[data-map-position-center]");if(!a)return;const o=a.getAttribute("data-map-position-center");if(!isValidCoords(o))return;const l=o.split(",").map(Number),s={lat:l[0],lng:l[1]},r=parseInt(document.querySelector("[data-map-zoom]")?.dataset.mapZoom)||16,d=new google.maps.Map(a,{center:DEFAULT_NZ_CENTER||s,zoom:DEFAULT_NZ_ZOOM||r,mapId:"108c67d0a07f090199e913e3",mapTypeControl:!1,fullscreenControl:!0,fullscreenControlOptions:{position:google.maps.ControlPosition.TOP_RIGHT},zoomControl:!0,zoomControlOptions:{position:google.maps.ControlPosition.RIGHT_BOTTOM},streetViewControl:!1});showLoader(a);const p=await fetch(`${LAMBDA_FUNCTION_LINK}?type=current-properties`,{method:"GET",headers:{"Content-Type":"application/json"}}),c=((await p.json()).data||[]).map((e=>{const t=e.fieldData["map-position"];if(!isValidCoords(t))return null;const[n,i]=t.split(",").map(parseFloat);return{lat:n,lng:i,modal:createPropertyModal(e),data:e}})).filter(Boolean);let m=null,f=null,g=[];const u=[];c.forEach((({lat:i,lng:a,modal:o,data:l})=>{const s={lat:i,lng:a},r=new google.maps.marker.AdvancedMarkerElement({position:s,map:d,content:e(),gmpClickable:!0});r.addListener("click",(()=>{panWithVerticalOffset(d,new google.maps.LatLng(i,a),isMobile?.8:.6),m&&m!==r&&t(m,!1),t(r,!0),m=r,f&&(f.remove(),f=null),g.forEach((e=>window.removeEventListener(e.name,e.handler))),g=[],f=o.cloneNode(!0),f.style.position="absolute",f.style.zIndex="9",f.style.pointerEvents="auto",document.body.appendChild(f),n(r,f)})),u.push(r)})),u.length&&window.markerClusterer&&window.markerClusterer.MarkerClusterer&&new markerClusterer.MarkerClusterer({map:d,markers:u,renderer:{render:({count:e,position:t})=>{const n=document.createElement("div"),i=48;return n.style.width=i+"px",n.style.height=i+"px",n.style.borderRadius="50%",n.style.backgroundColor="#0F234D",n.style.display="flex",n.style.alignItems="center",n.style.justifyContent="center",n.style.color="#ffffff",n.style.fontSize="16px",n.style.fontWeight="700",n.style.fontFamily="Arial, sans-serif",n.textContent=String(e),new google.maps.marker.AdvancedMarkerElement({position:t,content:n,zIndex:Number(e)})}}}),await waitForMapRenderBalanced(d,2500),hideLoader(a),d.addListener("dragstart",i),d.addListener("zoom_changed",i)};const triggerUrlChange=debounce(window.initMap,100);handleMobileChange(mobileQuery),function(){const e=history.pushState,t=history.replaceState;history.pushState=function(...t){e.apply(history,t),triggerUrlChange()},history.replaceState=function(...e){t.apply(history,e),triggerUrlChange()},window.addEventListener("popstate",triggerUrlChange)}();