From 5522d18ada580b3a6214bc435dcc7d24c1872a24 Mon Sep 17 00:00:00 2001 From: "Hanson.xyz Dev" Date: Wed, 17 Dec 2025 03:53:52 -0600 Subject: [PATCH] Improve pin click behavior: scroll to card if exists, pan map if not - When clicking a pin, check if property card exists in loaded results - If card exists: scroll to it smoothly and highlight (no map pan) - If card doesn't exist: pan map to center on pin, reload results - Add isCardScroll flag to ignore stray map events during card scroll - Skip scroll reset in InfiniteScroll when pin-triggered pan --- .../themes/homeproz/dist/assets/main.js | 2 +- .../property/property-filters.js | 46 +++++++++++++++---- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/wp-content/themes/homeproz/dist/assets/main.js b/wp-content/themes/homeproz/dist/assets/main.js index 06519644..0d138e65 100644 --- a/wp-content/themes/homeproz/dist/assets/main.js +++ b/wp-content/themes/homeproz/dist/assets/main.js @@ -1 +1 @@ -(function(r){var y=r(".menu-toggle"),n=r(".mobile-navigation");y.length&&(y.on("click",function(){var s=r(this).attr("aria-expanded")==="true";r(this).attr("aria-expanded",!s),n.toggleClass("is-open"),s?r("body").removeClass("mobile-menu-open"):r("body").addClass("mobile-menu-open")}),r(document).on("keydown",function(s){s.key==="Escape"&&n.hasClass("is-open")&&(y.attr("aria-expanded","false"),n.removeClass("is-open"),r("body").removeClass("mobile-menu-open"))}),r(document).on("click",function(s){n.hasClass("is-open")&&!r(s.target).closest(".mobile-navigation").length&&!r(s.target).closest(".menu-toggle").length&&(y.attr("aria-expanded","false"),n.removeClass("is-open"),r("body").removeClass("mobile-menu-open"))}))})(jQuery);(function(r){var y=6e3,n=1450,s=1e3,c=[],h=0,g=null,m=!1,l=!1,v=null;function b(){if(r(".Home_Page").length&&(v=r(".hero-split-image"),!!v.length)){var d=v.data("gallery-images");!d||!d.length||(c=d,t(),r(window).on("resize",u(t,150)))}}function t(){var d=r(window).width();d>=n?m||e():m&&i()}function e(){m=!0,l||(a(),l=!0),g=setInterval(o,y)}function i(){m=!1,g&&(clearInterval(g),g=null)}function a(){r.each(c,function(d,p){var f=new Image;f.src=p})}function o(){h=(h+1)%c.length;var d=c[h],p=r('
');p.css({position:"absolute",top:0,left:0,right:0,bottom:0,"background-image":"url("+d+")","background-size":"cover","background-position":"center center","background-repeat":"no-repeat",opacity:0,transform:"scale(1.02)",transition:"opacity "+s+"ms ease-in-out, transform "+s+"ms ease-in-out","z-index":1}),v.css("position","relative"),v.append(p),p[0].offsetHeight,p.css({opacity:1,transform:"scale(1)"}),setTimeout(function(){v.css("background-image","url("+d+")"),p.remove()},s)}function u(d,p){var f;return function(){var I=this,P=arguments;clearTimeout(f),f=setTimeout(function(){d.apply(I,P)},p)}}r(document).ready(b)})(jQuery);(function(r){if(r("body").hasClass("Home_Page")){var y={grid:null,emptyMessage:null,listings:[],init:function(){this.grid=r("#featured-listings-grid"),this.emptyMessage=r("#featured-listings-empty"),this.grid.length&&(this.loadListingsData(),this.renderListings())},loadListingsData:function(){var n=document.getElementById("featured-mls-data");if(!n){this.listings=[];return}try{this.listings=JSON.parse(n.textContent)}catch(s){console.error("Failed to parse featured listings data:",s),this.listings=[]}},shuffleArray:function(n){for(var s=n.slice(),c=s.length-1;c>0;c--){var h=Math.floor(Math.random()*(c+1)),g=s[c];s[c]=s[h],s[h]=g}return s},renderListings:function(){if(!this.listings||this.listings.length===0){this.grid.hide(),this.emptyMessage.show();return}for(var n=[],s=[],c=0;c',n.bedrooms&&(h+='
  • '+n.bedrooms+" "+s+"
  • "),n.bathrooms&&(h+='
  • '+n.bathrooms+" "+c+"
  • "),n.sqft&&(h+='
  • '+n.sqft.toLocaleString()+" sqft
  • "),h+=""),'
    Active
    '+this.escapeHtml(n.price_formatted)+'

    '+this.escapeHtml(n.address)+"

    "+h+'View Details
    '},escapeHtml:function(n){if(!n)return"";var s=document.createElement("div");return s.textContent=n,s.innerHTML}};r(document).ready(function(){y.init()})}})(jQuery);(function(r){var y={PREFIX:"HOMEPROZ_AJAX_",EXPIRY_MS:3e5,init:function(){this.cleanExpired()},cleanExpired:function(){try{for(var t=Date.now(),e=[],i=0;ithis.EXPIRY_MS&&e.push(a)}catch{e.push(a)}}e.forEach(function(u){sessionStorage.removeItem(u)})}catch{}},normalizeData:function(t){var e={};for(var i in t)if(i!=="nonce"){var a=t[i];Array.isArray(a)?e[i]=a.map(function(o){return typeof o=="number"?Math.round(o*1e4)/1e4:o}):e[i]=a}return e},getKey:function(t){for(var e=this.normalizeData(t),i=JSON.stringify(e),a=0,o=0;othis.EXPIRY_MS?(sessionStorage.removeItem(e),null):a.data}catch{return null}},set:function(t,e){try{var i=this.getKey(t),a={time:Date.now(),data:e};sessionStorage.setItem(i,JSON.stringify(a))}catch{}}};y.init();var n={pending:{clusters:null,properties:null},timeouts:{clusters:null,properties:null},requestIds:{clusters:0,properties:0},debounceDelay:200,queue:function(t,e,i,a,o){var u=this;this.timeouts[t]&&(clearTimeout(this.timeouts[t]),this.timeouts[t]=null),this.pending[t]&&(this.pending[t].abort(),this.pending[t]=null),this.requestIds[t]++;var d=this.requestIds[t];this.timeouts[t]=setTimeout(function(){u.timeouts[t]=null;var p=e(d);p&&p.then&&(u.pending[t]=p,p.done(function(f){d===u.requestIds[t]&&i(f,d)}),p.fail(function(f,I,P){o&&d===u.requestIds[t]&&I!=="abort"&&o(f,I,P)}),p.always(function(){u.pending[t]===p&&(u.pending[t]=null),a&&d===u.requestIds[t]&&a()}))},this.debounceDelay)},cancel:function(t){var e=t?[t]:["clusters","properties"],i=this;e.forEach(function(a){i.timeouts[a]&&(clearTimeout(i.timeouts[a]),i.timeouts[a]=null),i.pending[a]&&(i.pending[a].abort(),i.pending[a]=null)})},isLoading:function(t){return!!(this.pending[t]||this.timeouts[t])}},s={map:null,markers:{},markerData:{},densityLayer:null,clusterLayer:null,markerCluster:null,markerLayer:null,selectedPropertyId:null,isPinClickPan:!1,hoveredPropertyId:null,temporaryHoverMarker:null,baseZIndex:400,currentFilters:{},currentMode:null,init:function(t){var e=r("#property-map");if(!(!e.length||typeof L>"u")){this.currentFilters=t||{},this.map=L.map("property-map").setView([45,-93.5],7),L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{attribution:'© OpenStreetMap'}).addTo(this.map),this.densityLayer=L.layerGroup().addTo(this.map),this.clusterLayer=L.layerGroup().addTo(this.map),this.markerLayer=L.layerGroup().addTo(this.map),this.markerCluster=L.markerClusterGroup({maxClusterRadius:50,spiderfyOnMaxZoom:!0,showCoverageOnHover:!1,zoomToBoundsOnClick:!0,disableClusteringAtZoom:18,chunkedLoading:!0,chunkInterval:200,chunkDelay:50,iconCreateFunction:function(a){var o=a.getChildCount(),u="small";return o>=100?u="large":o>=10&&(u="medium"),L.divIcon({html:"
    "+o+"
    ",className:"marker-cluster marker-cluster-"+u,iconSize:L.point(40,40)})}}),this.map.addLayer(this.markerCluster);var i=this;this.map.on("moveend zoomend",function(){i.loadClusters(),setTimeout(function(){h.updateUrlState()},400)}),this.bindCardHoverEvents(),this.loadClusters()}},loadClusters:function(){if(this.map){var t=this,e=this.map.getBounds(),i=this.map.getCenter(),a=this.map.getZoom(),o=[e.getSouthWest().lat,e.getSouthWest().lng,e.getNorthEast().lat,e.getNorthEast().lng],u=[i.lat,i.lng],d={action:"mls_get_clusters",zoom:a,bounds:o,status:this.currentFilters.status||"Active",property_type:this.currentFilters.property_type||"",city:this.currentFilters.city||"",min_price:this.currentFilters.min_price||"",max_price:this.currentFilters.max_price||"",min_beds:this.currentFilters.min_beds||""};h.updateFromMap(o,u);var p=y.get(d);if(p&&p.success){var f=p.data;switch(this.currentMode=f.type,f.type){case"density":this.renderDensity(f.dots);break;case"clusters":this.renderClusters(f.clusters);break;case"markers":this.renderMarkers(f.markers);break}return}n.queue("clusters",function(I){return r.ajax({url:homeprozMapData.clusterEndpoint,type:"GET",data:d})},function(I,P){if(I.success){y.set(d,I);var x=I.data;switch(t.currentMode=x.type,x.type){case"density":t.renderDensity(x.dots);break;case"clusters":t.renderClusters(x.clusters);break;case"markers":t.renderMarkers(x.markers);break}}})}},clearAllLayers:function(){this.densityLayer.clearLayers(),this.clusterLayer.clearLayers(),this.markerCluster.clearLayers(),this.markerLayer.clearLayers(),this.markers={},this.temporaryHoverMarker&&(this.map.removeLayer(this.temporaryHoverMarker),this.temporaryHoverMarker=null)},renderDensity:function(t){this.clearAllLayers(),this.selectedPropertyId=null,this.isPinClickPan=!1,r(".property-card").removeClass("property-card-highlighted");var e=this,i=this.map.getZoom();t.forEach(function(a){var o=e.getDensityColor(a.count,i),u=e.getDensitySize(a.count,i),d=L.divIcon({html:'
    ',className:"density-dot-container",iconSize:[u,u],iconAnchor:[u/2,u/2]}),p=L.marker([a.lat,a.lng],{icon:d});p.on("click",function(){e.map.setView([a.lat,a.lng],e.map.getZoom()+2)}),p.bindTooltip(a.count+" properties",{className:"density-tooltip"}),e.densityLayer.addLayer(p)})},getDensityThreshold:function(t){return Math.max(40,Math.round(600/Math.pow(1.4,t-3)))},getDensityColor:function(t,e){var i=this.getDensityThreshold(e),a=t/i;return a>=1.5?"rgba(180, 83, 9, 0.8)":a>=1?"rgba(217, 119, 6, 0.8)":a>=.6?"rgba(245, 158, 11, 0.8)":a>=.3?"rgba(234, 179, 8, 0.8)":a>=.15?"rgba(132, 204, 22, 0.8)":"rgba(34, 197, 94, 0.8)"},getDensitySize:function(t,e){var i=this.getDensityThreshold(e),a=t/i;return a>=1.5?11:a>=1?10:a>=.6?8:a>=.3?7:6},renderClusters:function(t){this.clearAllLayers(),this.selectedPropertyId=null,this.isPinClickPan=!1,r(".property-card").removeClass("property-card-highlighted");var e=this;t.forEach(function(i){var a="small";i.count>=100?a="large":i.count>=10&&(a="medium");var o=L.divIcon({html:"
    "+i.count+"
    ",className:"marker-cluster marker-cluster-"+a+" server-cluster",iconSize:L.point(40,40)}),u=L.marker([i.lat,i.lng],{icon:o});u.on("click",function(){e.map.setView([i.lat,i.lng],e.map.getZoom()+2)});var d="$"+e.formatNumber(i.min_price);i.max_price!==i.min_price&&(d+=" - $"+e.formatNumber(i.max_price)),u.bindTooltip(i.count+" properties
    "+d,{className:"cluster-tooltip"}),e.clusterLayer.addLayer(u)})},renderMarkers:function(t){var e=this.selectedPropertyId;this.clearAllLayers(),this.hoveredPropertyId=null;var i=this,a=[];t.forEach(function(o,u){if(o.lat&&o.lng){var d=o.id===e,p=d?"amber":"red",f=L.marker([o.lat,o.lng],{icon:i.createIcon(p),zIndexOffset:d?1e4:i.baseZIndex+u});f.propertyId=o.id,f.defaultZIndex=i.baseZIndex+u,i.markerData[o.id]={lat:o.lat,lng:o.lng,price:o.price,address:o.address},f.bindPopup('
    '+o.price+"
    "+o.address+'
    View Details
    '),f.on("click",function(I){i.onMarkerClick(o.id)}),a.push(f),i.markers[o.id]=f}}),a.length<=30?a.forEach(function(o){i.markerLayer.addLayer(o)}):this.markerCluster.addLayers(a),this.isPinClickPan=!1,e&&this.markers[e]?this.selectedPropertyId=e:(this.selectedPropertyId=null,r(".property-card").removeClass("property-card-highlighted"))},updateFilters:function(t){this.currentFilters=t||{},this.loadClusters()},formatNumber:function(t){return t.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")},createIcon:function(t){return t=t||"red",L.divIcon({className:"property-marker property-marker-"+t,html:'
    ',iconSize:[17,22],iconAnchor:[8,22],popupAnchor:[0,-22]})},onMarkerClick:function(t){if(this.selectedPropertyId!==t){this.selectedPropertyId&&(this.setMarkerColor(this.selectedPropertyId,"red"),this.resetMarkerZIndex(this.selectedPropertyId),r("#property-"+this.selectedPropertyId).removeClass("property-card-highlighted"));var e=this.markerData[t];if(e){this.selectedPropertyId=t,this.setMarkerColor(t,"amber"),this.setMarkerZIndex(t,1e4);var i=r("#property-"+t);i.length&&i.addClass("property-card-highlighted"),this.isPinClickPan=!0,this.map.panTo([e.lat,e.lng])}}},flashCard:function(t){t.removeClass("property-card-highlighted"),setTimeout(function(){t.addClass("property-card-highlighted"),setTimeout(function(){t.removeClass("property-card-highlighted"),setTimeout(function(){t.addClass("property-card-highlighted")},150)},150)},50)},setMarkerColor:function(t,e){var i=this.markers[t];i&&i.setIcon(this.createIcon(e))},setMarkerZIndex:function(t,e){var i=this.markers[t];i&&i.setZIndexOffset(e)},resetMarkerZIndex:function(t){var e=this.markers[t];e&&e.setZIndexOffset(e.defaultZIndex)},bindCardHoverEvents:function(){var t=this;r(document).on("mouseenter",".property-card[data-property-id]",function(){var e=r(this),i=e.data("property-id");if(i!==t.selectedPropertyId)if(t.hoveredPropertyId=i,t.markers[i])t.setMarkerColor(i,"blue"),t.setMarkerZIndex(i,9e3);else{var a=e.data("lat"),o=e.data("lng");a&&o&&t.map&&(t.temporaryHoverMarker&&t.map.removeLayer(t.temporaryHoverMarker),t.temporaryHoverMarker=L.marker([a,o],{icon:t.createIcon("blue"),zIndexOffset:15e3}),t.temporaryHoverMarker.addTo(t.map))}}),r(document).on("mouseleave",".property-card[data-property-id]",function(){var e=r(this).data("property-id");e!==t.selectedPropertyId&&(t.hoveredPropertyId===e&&(t.hoveredPropertyId=null),t.temporaryHoverMarker&&(t.map.removeLayer(t.temporaryHoverMarker),t.temporaryHoverMarker=null),t.markers[e]&&(t.setMarkerColor(e,"red"),t.resetMarkerZIndex(e)))})}},c={$mainFilter:null,$stickyFilter:null,$mainForm:null,$stickyForm:null,observer:null,isVisible:!1,init:function(){window.innerWidth<1024||!r(".is-map-view").length||(this.$mainFilter=r("#property-filters"),this.$stickyFilter=r("#property-filters-sticky"),this.$mainForm=this.$mainFilter.find(".filters-form"),this.$stickyForm=this.$stickyFilter.find(".filters-form-sticky"),!(!this.$mainFilter.length||!this.$stickyFilter.length)&&(this.setupObserver(),this.bindEvents()))},setupObserver:function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(i){i.isIntersecting?t.hideStickyFilter():t.showStickyFilter()})},{root:null,rootMargin:"0px",threshold:0}),this.observer.observe(this.$mainFilter[0])},bindEvents:function(){var t=this;this.$mainForm.find("select, input").on("change input",function(){t.syncToSticky(this.name,r(this).val())}),this.$stickyForm.find("select").on("change",function(){t.syncToMain(this.name,r(this).val()),h.filterProperties(1)}),this.$stickyForm.find("input").on("change",function(){t.syncToMain(this.name,r(this).val()),h.filterProperties(1)}),this.$stickyForm.on("submit",function(e){e.preventDefault(),h.filterProperties(1)})},syncToSticky:function(t,e){var i=this.$stickyForm.find('[name="'+t+'"]');i.length&&i.val()!==e&&i.val(e)},syncToMain:function(t,e){var i=this.$mainForm.find('[name="'+t+'"]');i.length&&i.val()!==e&&i.val(e)},showStickyFilter:function(){this.isVisible||(this.isVisible=!0,this.$stickyFilter.removeClass("is-hiding").addClass("is-visible"))},hideStickyFilter:function(){if(this.isVisible){this.isVisible=!1,this.$stickyFilter.removeClass("is-visible").addClass("is-hiding");var t=this;setTimeout(function(){t.$stickyFilter.removeClass("is-hiding")},10)}},syncAllToSticky:function(){var t=this;this.$mainForm.find("select, input").each(function(){t.syncToSticky(this.name,r(this).val())})}},h={$form:null,$results:null,$filters:null,isFirstLoad:!0,mapBounds:null,mapCenter:null,isMapUpdate:!1,init:function(){this.$form=r(".filters-form"),this.$results=r("#property-results"),this.$filters=r("#property-filters"),!(!this.$form.length||!this.$results.length)&&(this.bindEvents(),this.initFromUrl())},bindEvents:function(){var t=this;this.$form.on("submit",function(e){e.preventDefault(),t.filterProperties(1)}),this.$form.find("select").on("change",function(){t.clearPinSelection(),t.filterProperties(1)}),r(".filters-reset").on("click",function(e){e.preventDefault(),t.resetFilters()}),this.$results.on("click",".pagination a",function(e){e.preventDefault();var i=t.getPageFromUrl(r(this).attr("href"));t.filterProperties(i)}),r(window).on("hashchange",function(){var e=t.getPageFromHash();t.filterProperties(e,!1)})},initFromUrl:function(){var t=new URLSearchParams(window.location.search);this.$form.find("select").each(function(){var i=r(this).attr("name");t.has(i)&&r(this).val(t.get(i))}),this.$form.find('input[type="text"]').each(function(){var i=r(this).attr("name");t.has(i)&&r(this).val(t.get(i))});var e=this.getStateFromHash();e&&(e.lat!==null||e.page>1)&&(this.pendingRestoreState=e)},restoreState:function(){var t=this.pendingRestoreState;if(t){if(this.pendingRestoreState=null,t.lat!==null&&t.lng!==null&&t.zoom!==null&&s.map){s.map.off("moveend zoomend"),s.map.setView([t.lat,t.lng],t.zoom);var e=s.map.getBounds(),i=s.map.getCenter();this.mapBounds=[e.getSouthWest().lat,e.getSouthWest().lng,e.getNorthEast().lat,e.getNorthEast().lng],this.mapCenter=[i.lat,i.lng],s.loadClusters(),setTimeout(function(){s.map.on("moveend zoomend",function(){s.loadClusters(),setTimeout(function(){h.updateUrlState()},400)})},100)}t.page>1?this.bulkLoadPages(t.page,t.scroll):t.scroll>0&&(window.scrollTo({top:t.scroll,behavior:"instant"}),r(window).trigger("scroll"))}},bulkLoadPages:function(t,e){var i=this,a=this.getFormData();l.isRestoring=!0;for(var o=[],u=1;u<=t+1;u++)o.push(u);var d={action:"homeproz_filter_properties",nonce:homeprozAjax.nonce,property_type:a.property_type,property_location:a.property_location,zip:a.zip,min_price:a.min_price,max_price:a.max_price,beds:a.beds,cards_only:"true"};this.mapBounds&&(d.bounds=this.mapBounds),this.mapCenter&&(d.center=this.mapCenter);var p=[],f=[];if(o.forEach(function(P){var x=r.extend({},d,{paged:P}),w=y.get(x);w&&w.success&&w.data&&w.data.html?p.push({page:P,html:w.data.html,max_pages:w.data.max_pages||1}):f.push(P)}),f.length===0){this.renderBulkResults(p,t,e);return}this.$results.html('
    ');var I=f.map(function(P){var x=r.extend({},d,{paged:P});return r.ajax({url:homeprozAjax.ajaxUrl,type:"POST",data:x}).then(function(w){var C={page:P,html:w.success?w.data.html:"",max_pages:w.success?w.data.max_pages:0};return w.success&&y.set(x,w),C})});r.when.apply(r,I).done(function(){var P=I.length===1?[arguments[0]]:Array.prototype.slice.call(arguments),x=p.concat(P);i.renderBulkResults(x,t,e)}).fail(function(){l.isRestoring=!1,i.filterProperties(1,!1)})},renderBulkResults:function(t,e,i){t.sort(function(u,d){return u.page-d.page});var a=t[0]?t[0].max_pages:1,o='

    Loading...

    ';o+='
    ',t.forEach(function(u){u.html&&u.page<=a&&(o+='
    ',o+=u.html,o+="
    ")}),o+="
    ",this.$results.html(o),l.currentPage=Math.min(e+1,a),l.maxPages=a,l.pages={},t.forEach(function(u){u.page<=a&&(l.pages[u.page]={state:"populated"})}),i>0&&window.scrollTo({top:i,behavior:"instant"}),l.isRestoring=!1,r(window).trigger("scroll"),typeof b<"u"&&b.process()},updateFromMap:function(t,e){this.mapBounds=t,this.mapCenter=e,this.isMapUpdate=!0,s.isPinClickPan||this.clearPinSelection(),this.$results.html('
    '),l.isEnabled&&v.reset(),l.currentPage=1,this._scrollBlocked=!0,this.clearScrollFromUrl(),this.filterProperties(1,!1)},clearScrollFromUrl:function(){var t=window.location.hash.replace("#","");if(t){var e=t.split("&").filter(function(a){return!a.startsWith("scroll=")}),i=e.length?"#"+e.join("&"):"";history.replaceState(null,"",window.location.pathname+window.location.search+i)}},clearPinSelection:function(){s.selectedPropertyId&&(s.setMarkerColor(s.selectedPropertyId,"red"),s.resetMarkerZIndex(s.selectedPropertyId),r("#property-"+s.selectedPropertyId).removeClass("property-card-highlighted"),s.selectedPropertyId=null)},getPageFromHash:function(){var t=this.getStateFromHash();return t?t.page:1},filterProperties:function(t,e){e=e!==!1,t=t||1;var i=this,a=this.getFormData();this.$filters.addClass("is-loading"),this.isFirstLoad&&this.$results.html('
    ');var o={action:"homeproz_filter_properties",nonce:homeprozAjax.nonce,property_type:a.property_type,property_location:a.property_location,zip:a.zip,min_price:a.min_price,max_price:a.max_price,beds:a.beds,paged:t};this.mapBounds&&(o.bounds=this.mapBounds),this.mapCenter&&(o.center=this.mapCenter);var u=this.isMapUpdate;this.isMapUpdate=!1,n.queue("properties",function(d){return r.ajax({url:homeprozAjax.ajaxUrl,type:"POST",data:o})},function(d,p){d.success&&(i.$results.html(d.data.html),i.isFirstLoad=!1,d.data.filters&&!u&&s.updateFilters(d.data.filters),typeof m<"u"&&m.calculate(),v.destroy(),setTimeout(function(){v.init()},100),e&&i.updateUrl(a,t),s.selectedPropertyId?setTimeout(function(){var f=r("#property-"+s.selectedPropertyId);f.length&&(window.scrollTo({top:f.offset().top-120,behavior:"instant"}),f.addClass("property-card-highlighted"))},150):t>1&&window.scrollTo({top:i.$filters.offset().top-100,behavior:"instant"}))},function(){i.$filters.removeClass("is-loading")},function(){i.$results.html('

    Error

    Something went wrong. Please try again.

    ')})},getFormData:function(){return{property_type:this.$form.find('[name="property_type"]').val()||"",property_location:this.$form.find('[name="property_location"]').val()||"",zip:this.$form.find('[name="zip"]').val()||"",min_price:this.$form.find('[name="min_price"]').val()||"",max_price:this.$form.find('[name="max_price"]').val()||"",beds:this.$form.find('[name="beds"]').val()||""}},getFormState:function(){return this.getFormData()},setFormFromState:function(t){for(var e in t)this.$form.find('[name="'+e+'"]').val(t[e])},updateUrl:function(t,e){var i=new URL(homeprozAjax.archiveUrl);for(var a in t)t[a]&&i.searchParams.set(a,t[a]);var o=[];if(e>1&&o.push("page="+e),!this._scrollBlocked){var u=window.pageYOffset||document.documentElement.scrollTop;u>0&&o.push("scroll="+Math.round(u))}if(s.map){var d=s.map.getCenter(),p=s.map.getZoom();o.push("lat="+d.lat.toFixed(6)),o.push("lng="+d.lng.toFixed(6)),o.push("zoom="+p)}i.hash=o.length?o.join("&"):"",history.replaceState(null,"",i.toString())},updateUrlState:function(){var t=this;clearTimeout(this._urlUpdateTimeout),this._urlUpdateTimeout=setTimeout(function(){var e=l.currentPage||1,i=t.getFormData();t.updateUrl(i,e)},300)},getStateFromHash:function(){var t=window.location.hash.replace("#","");if(!t)return null;var e={};return t.split("&").forEach(function(i){var a=i.split("=");a.length===2&&(e[a[0]]=a[1])}),{page:e.page?parseInt(e.page):1,scroll:e.scroll?parseInt(e.scroll):0,lat:e.lat?parseFloat(e.lat):null,lng:e.lng?parseFloat(e.lng):null,zoom:e.zoom?parseInt(e.zoom):null}},getPageFromUrl:function(t){var e=t.match(/#page=(\d+)/);if(e)return parseInt(e[1]);var i=t.match(/[?&]paged=(\d+)/);return i?parseInt(i[1]):1},resetFilters:function(){this.$form.find("select").val(""),this.filterProperties(1)}},g={breakpoint:1024,isMapView:!0,isAboveBreakpoint:!0,mapInitialized:!1,init:function(){var t=this;typeof homeprozMapData<"u"&&(this.isMapView=homeprozMapData.isMapView!==!1),this.isAboveBreakpoint=window.innerWidth>=this.breakpoint,this.isAboveBreakpoint&&this.isMapView&&typeof homeprozMapData<"u"&&(s.init(homeprozMapData.initialFilters||{}),this.mapInitialized=!0,h.pendingRestoreState&&h.restoreState());var e;r(window).on("resize",function(){clearTimeout(e),e=setTimeout(function(){t.handleResize()},150)})},handleResize:function(){var t=this.isAboveBreakpoint;this.isAboveBreakpoint=window.innerWidth>=this.breakpoint;var e=r(".property-archive-main");t&&!this.isAboveBreakpoint&&l.isEnabled&&v.destroy(),!t&&this.isAboveBreakpoint&&(this.isMapView?(e.removeClass("is-grid-view").addClass("is-map-view"),!this.mapInitialized&&typeof homeprozMapData<"u"?(s.init(homeprozMapData.initialFilters||{}),this.mapInitialized=!0,h.pendingRestoreState&&h.restoreState()):s.map&&setTimeout(function(){s.map.invalidateSize()},100),setTimeout(function(){v.init()},200)):e.removeClass("is-map-view").addClass("is-grid-view"),typeof m<"u"&&setTimeout(function(){m.calculate()},150))},setMapView:function(t){this.isMapView=t}},m={cardWidth:400,cardGap:24,mapGap:32,mapRatio:.33,breakpoint:1024,containerPadding:24,init:function(){this.calculate();var t=this,e;r(window).on("resize",function(){clearTimeout(e),e=setTimeout(function(){t.calculate()},100)})},calculate:function(){if(window.innerWidth .container"),i=t.hasClass("is-map-view"),a=e.width();i?this.calculateMapLayout(a):this.calculateGridLayout(a)},calculateMapLayout:function(t){for(var e=5;e>=1;e--){var i=e*this.cardWidth+(e-1)*this.cardGap,a=(this.mapGap+i)/(1-this.mapRatio);if(a<=t){this.setProperties(a,e,".property-map-layout"),this.setProperties(a,e,".property-list-container");return}}var i=this.cardWidth,a=(this.mapGap+i)/(1-this.mapRatio);this.setProperties(Math.min(a,t),1,".property-map-layout"),this.setProperties(Math.min(a,t),1,".property-list-container")},calculateGridLayout:function(t){for(var e=6;e>=1;e--){var i=e*this.cardWidth+(e-1)*this.cardGap;if(i<=t){this.setProperties(i,e,".grid-view-container");return}}this.setProperties(this.cardWidth,1,".grid-view-container")},setProperties:function(t,e,i){var a=r(i);a.length&&(a.css("--layout-width",t+"px"),a.css("--card-columns",e))},clearProperties:function(){r(".property-map-layout, .grid-view-container, .property-list-container").css({"--layout-width":"","--card-columns":""})}},l={pages:{},totalPages:0,totalPosts:0,currentPage:1,pendingPage:null,isEnabled:!1,isRestoring:!1,cardsPerPage:12},v={$container:null,$grid:null,scrollTimeout:null,init:function(){if(window.innerWidth>=1024&&r(".is-map-view").length?this.$container=r(".property-list-container"):this.$container=r("#property-results"),this.$grid=this.$container.find(".properties-grid"),!(!this.$container.length||!this.$grid.length)){var t=this.$container.find(".properties-meta"),e=t.find(".properties-count strong").text().replace(/,/g,"");l.totalPosts=parseInt(e)||0,l.totalPages=Math.ceil(l.totalPosts/l.cardsPerPage),!(l.totalPages<=1)&&(l.pages={},l.pendingPage=null,this.wrapInitialCards(),this.bindScrollHandler(),l.isEnabled=!0,this.$container.addClass("infinite-scroll-enabled"),this.syncPages())}},wrapInitialCards:function(){var t=this.$grid.find(".property-card");if(t.length){var e=r('
    ');t.wrapAll(e),l.pages[1]={state:"populated"}}},bindScrollHandler:function(){var t=this;r(window).on("scroll.infiniteScroll",function(){clearTimeout(t.scrollTimeout),t.scrollTimeout=setTimeout(function(){t.syncPages(),h.updateUrlState()},100)}),r(window).on("wheel.infiniteScroll",function(){h._scrollBlocked=!1})},syncPages:function(){if(!(!this.$grid||!l.isEnabled)&&!l.isRestoring){var t=l.totalPages,e=this.calculateCurrentPage();e>t-2&&(e=t-2),e<1&&(e=1),l.currentPage=e;var i=[e-2,e-1,e,e+1,e+2];i=i.filter(function(o){return o>=1&&o<=t});var a=this.getReferenceCardDimensions();this.ensurePagesExist(i),this.loadFirstUnloaded(i),this.syncPageStates(i,a)}},calculateCurrentPage:function(){var t=window.scrollY||window.pageYOffset,e=t+window.innerHeight,i=this.$grid.find(".infinite-scroll-page");if(!i.length)return 1;var a=1,o=1/0;return i.each(function(){var u=r(this),d=parseInt(u.data("page")),p=u.find(".property-card").first();if(p.length){var f=p[0].getBoundingClientRect(),I=f.top+t;if(I<=e){var P=e-I;P');e.insertPageInOrder(o,i),l.pages[i]||(l.pages[i]={state:"empty"})}})},insertPageInOrder:function(t,e){var i=this.$grid.find(".infinite-scroll-page"),a=!1;i.each(function(){var o=parseInt(r(this).data("page"));if(ea&&window.scrollTo({top:a,behavior:"instant"})}},destroy:function(){l.isEnabled&&(r(window).off("scroll.infiniteScroll"),clearTimeout(this.scrollTimeout),this.$container&&this.$container.removeClass("infinite-scroll-enabled"),this.$grid&&(this.$grid.find('.infinite-scroll-page[data-state="populated"]').children().unwrap(),this.$grid.find('.infinite-scroll-page[data-state="placeholder"]').remove()),l.pages={},l.pendingPage=null,l.isEnabled=!1)}},b={_isRunning:!1,_activeLoads:0,MAX_PARALLEL:2,LOAD_DISTANCE:1e3,init:function(){this.process(),this.bindScrollEvent()},bindScrollEvent:function(){var t=this,e;r(window).on("scroll",function(){clearTimeout(e),e=setTimeout(function(){t.process()},50)})},process:function(){this._isRunning||(this._isRunning=!0,this._activeLoads=0,this._processNext())},_getNextElement:function(){var t=r(".property-card-image[data-bg]");if(!t.length)return null;var e=window.pageYOffset||document.documentElement.scrollTop,i=e,a=e+window.innerHeight,o=this.LOAD_DISTANCE,u=[],d=[];return t.each(function(){var p=this.getBoundingClientRect(),f=p.top+e,I=f+p.height;if(I>=i&&f<=a)u.push({el:this,position:f});else{var P;f>a?P=f-a:P=i-I,P<=o&&d.push({el:this,distance:P})}}),u.sort(function(p,f){return p.position-f.position}),d.sort(function(p,f){return p.distance-f.distance}),u.length?u[0].el:d.length?d[0].el:null},_processNext:function(){for(var t=this;this._activeLoads1&&this.startAutoplay())}},calculateThumbnailsPerPage:function(){r(window).width()<=640?this.thumbnailsPerPage=4:this.thumbnailsPerPage=5},bindEvents:function(){var n=this;this.$thumbnails.on("click",function(s){s.stopPropagation();var c=parseInt(r(this).data("index"));n.stopAutoplay(),n.setMainImage(c,!1)}),this.$playbackBtn.on("click",function(s){s.stopPropagation(),s.preventDefault(),n.isPlaying?n.stopAutoplay():n.startAutoplay()}),this.$prevBtn.on("click",function(){n.stopAutoplay(),n.prevThumbnailPage()}),this.$nextBtn.on("click",function(){n.stopAutoplay(),n.nextThumbnailPage()}),this.$gallery.find("[data-lightbox-trigger]").on("click",function(s){if(n.isSwiping){n.isSwiping=!1;return}n.stopAutoplay(),n.openLightbox(n.currentIndex)}),this.$lightbox.find(".lightbox-close, .lightbox-overlay").on("click",function(){n.closeLightbox()}),this.$lightbox.find(".lightbox-prev").on("click",function(){n.slideLightboxImage("prev")}),this.$lightbox.find(".lightbox-next").on("click",function(){n.slideLightboxImage("next")}),r(document).on("keydown",function(s){if(n.$lightbox.is('[aria-hidden="false"]'))switch(s.key){case"Escape":n.closeLightbox();break;case"ArrowLeft":n.slideLightboxImage("prev");break;case"ArrowRight":n.slideLightboxImage("next");break}}),r(window).on("resize",function(){n.calculateThumbnailsPerPage(),n.updateThumbnailNavigation()})},bindSwipeEvents:function(){var n=this;this.$mainImageContainer[0].addEventListener("touchstart",function(s){n.handleSwipeStart(s)},{passive:!0}),this.$mainImageContainer[0].addEventListener("touchend",function(s){n.handleMainGallerySwipeEnd(s)},{passive:!0}),this.$lightboxImageContainer[0].addEventListener("touchstart",function(s){n.handleSwipeStart(s)},{passive:!0}),this.$lightboxImageContainer[0].addEventListener("touchend",function(s){n.handleLightboxSwipeEnd(s)},{passive:!0})},handleSwipeStart:function(n){n.touches.length===1&&(this.swipeStartX=n.touches[0].clientX,this.swipeStartY=n.touches[0].clientY)},handleMainGallerySwipeEnd:function(n){if(n.changedTouches.length===1){var s=n.changedTouches[0].clientX-this.swipeStartX,c=n.changedTouches[0].clientY-this.swipeStartY;Math.abs(s)>Math.abs(c)&&Math.abs(s)>this.swipeThreshold&&(this.isSwiping=!0,this.stopAutoplay(),s>0?this.slideMainImage("prev"):this.slideMainImage("next"))}},handleLightboxSwipeEnd:function(n){if(n.changedTouches.length===1){var s=n.changedTouches[0].clientX-this.swipeStartX,c=n.changedTouches[0].clientY-this.swipeStartY;Math.abs(s)>Math.abs(c)&&Math.abs(s)>this.swipeThreshold&&(s>0?this.slideLightboxImage("prev"):this.slideLightboxImage("next"))}},startAutoplay:function(){var n=this;this.images.length<=1||(this.isPlaying=!0,this.$playbackBtn.addClass("is-playing"),this.$playbackBtn.attr("aria-label","Pause slideshow"),this.autoplayInterval=setInterval(function(){n.advanceImage()},this.autoplayDelay))},stopAutoplay:function(){this.isPlaying=!1,this.$playbackBtn.removeClass("is-playing"),this.$playbackBtn.attr("aria-label","Play slideshow"),this.autoplayInterval&&(clearInterval(this.autoplayInterval),this.autoplayInterval=null)},advanceImage:function(){if(!this.isTransitioning){var n=this.currentIndex+1;n>=this.images.length&&(n=0),this.setMainImage(n,!0)}},slideMainImage:function(n){var s=this;if(!(this.isTransitioning||this.images.length<=1)){var c;n==="prev"?(c=this.currentIndex-1,c<0&&(c=this.images.length-1)):(c=this.currentIndex+1,c>=this.images.length&&(c=0)),this.isTransitioning=!0;var h=this.images[c],g=n==="next"?"100%":"-100%",m=n==="next"?"-100%":"100%",l=r('');l.attr("src",h.url),l.attr("alt",h.alt||"Property photo"),l.css({position:"absolute",top:0,left:0,width:"100%",height:"100%","object-fit":"cover",transform:"translateX("+g+")","z-index":2,"border-radius":"0.5rem"}),this.$mainImageContainer.css({position:"relative",overflow:"hidden"}),this.$mainImageContainer.append(l),this.$mainImage.css({transition:"transform "+this.slideDuration+"ms ease-out"}),l.css({transition:"transform "+this.slideDuration+"ms ease-out"}),l[0].offsetHeight,this.$mainImage.css("transform","translateX("+m+")"),l.css("transform","translateX(0)"),setTimeout(function(){s.$mainImage.attr("src",h.url),s.$mainImage.attr("alt",h.alt||"Property photo"),s.$mainImage.css({transition:"",transform:""}),l.remove(),s.isTransitioning=!1},this.slideDuration),this.currentIndex=c,this.$thumbnails.removeClass("is-active"),this.$thumbnails.filter('[data-index="'+c+'"]').addClass("is-active"),this.scrollToThumbnail(c)}},setMainImage:function(n,s){var c=this;if(!(n<0||n>=this.images.length)&&!this.isTransitioning){var h=this.images[n];if(s){this.isTransitioning=!0;var g=r('');g.attr("src",h.url),g.attr("alt",h.alt||"Property photo"),g.css({position:"absolute",top:0,left:0,width:"100%",height:"100%","object-fit":"cover",opacity:0,transform:"scale(1.02)",transition:"opacity "+this.fadeDuration+"ms ease-in-out, transform "+this.fadeDuration+"ms ease-in-out","z-index":2,"border-radius":"0.5rem"}),this.$mainImageContainer.css("position","relative"),this.$mainImageContainer.append(g),g[0].offsetHeight,g.css({opacity:1,transform:"scale(1)"}),setTimeout(function(){c.$mainImage.attr("src",h.url),c.$mainImage.attr("alt",h.alt||"Property photo"),g.remove(),c.isTransitioning=!1},this.fadeDuration)}else this.$mainImage.attr("src",h.url),this.$mainImage.attr("alt",h.alt||"Property photo");this.currentIndex=n,this.$thumbnails.removeClass("is-active"),this.$thumbnails.filter('[data-index="'+n+'"]').addClass("is-active"),this.scrollToThumbnail(n)}},scrollToThumbnail:function(n){var s=Math.floor(n/this.thumbnailsPerPage);s!==this.thumbnailPage&&(this.thumbnailPage=s,this.scrollThumbnails())},scrollThumbnails:function(){var n=this.$gallery.find(".gallery-thumbnails"),s=this.$thumbnails.first().outerWidth(!0),c=this.thumbnailPage*this.thumbnailsPerPage*s;n.css("transform","translateX(-"+c+"px)"),this.updateThumbnailNavigation()},updateThumbnailNavigation:function(){var n=Math.ceil(this.images.length/this.thumbnailsPerPage);this.$prevBtn.prop("disabled",this.thumbnailPage===0),this.$nextBtn.prop("disabled",this.thumbnailPage>=n-1),n<=1?(this.$prevBtn.hide(),this.$nextBtn.hide()):(this.$prevBtn.show(),this.$nextBtn.show())},prevThumbnailPage:function(){this.thumbnailPage>0&&(this.thumbnailPage--,this.scrollThumbnails(),this.preloadPrevThumbnailPage())},nextThumbnailPage:function(){var n=Math.ceil(this.images.length/this.thumbnailsPerPage);this.thumbnailPage=this.images.length&&(c=0)),this.isTransitioning=!0;var h=this.images[c],g=n==="next"?"100%":"-100%",m=n==="next"?"-100%":"100%",l=r('');l.attr("src",h.url),l.attr("alt",h.alt||"Property photo"),l.css({position:"absolute","max-width":"100%","max-height":"calc(100vh - 8rem)","object-fit":"contain",transform:"translateX("+g+")",left:"50%",top:"50%","margin-left":"-45vw","margin-top":"calc(-50vh + 4rem)"}),this.$lightboxImageContainer.css({position:"relative",overflow:"hidden"}),this.$lightboxImageContainer.append(l),this.$lightboxImage.css({transition:"transform "+this.slideDuration+"ms ease-out"}),l.css({transition:"transform "+this.slideDuration+"ms ease-out"}),l[0].offsetHeight,this.$lightboxImage.css("transform","translateX("+m+")"),l.css("transform","translateX(0)"),setTimeout(function(){s.$lightboxImage.attr("src",h.url),s.$lightboxImage.attr("alt",h.alt||"Property photo"),s.$lightboxImage.css({transition:"",transform:""}),l.remove(),s.isTransitioning=!1,s.$lightboxCounter.text(c+1)},this.slideDuration),this.currentIndex=c}},prevImage:function(){this.slideLightboxImage("prev")},nextImage:function(){this.slideLightboxImage("next")},updateLightboxImage:function(){var n=this.images[this.currentIndex];this.$lightboxImage.attr("src",n.url),this.$lightboxImage.attr("alt",n.alt||"Property photo"),this.$lightboxCounter.text(this.currentIndex+1)},setupThumbnailLoading:function(){this.$thumbnails.each(function(){var n=r(this),s=n.find("img");n.addClass("is-loading"),n.find(".thumbnail-spinner").length||n.append('
    '),s[0].complete?n.removeClass("is-loading"):(s.on("load",function(){n.removeClass("is-loading")}),s.on("error",function(){n.removeClass("is-loading")}))})},preloadThumbnailPages:function(n,s){for(var c=this,h=n*this.thumbnailsPerPage,g=Math.min((n+s)*this.thumbnailsPerPage,this.images.length),m=h;m=0&&this.preloadThumbnailPages(n,1)}};r(function(){y.init()})})(jQuery);(function(r){if(!r(".mortgage-calculator-main").length)return;let y=!1;r.fn.currencyInput=function(s=!0){return this.data("ci_show_symbol",s),y||(y=!0,r.fn._CIOriginalVal=r.fn.val,r.fn.val=function(h){if(r(this).data("_currencyInput"))if(arguments.length===0){var g=r(this)._CIOriginalVal();if(g=="")return"";var m=parseInt(g.replace(/[^0-9]/g,""));return m}else{if(h=String(h).replace(/[^0-9]/g,""),h!=""){var l=parseInt(h).toLocaleString("en-US",{style:"currency",currency:"USD",minimumFractionDigits:0,maximumFractionDigits:0});return r(this).data("ci_show_symbol")||(l=l.replace("$","")),r(this)._CIOriginalVal(l)}return r(this)._CIOriginalVal(h)}else if(r(this).data("_percentInput"))if(arguments.length===0){var g=r(this)._CIOriginalVal();if(g=="")return"";var m=parseFloat(g.replace(/[^0-9.]/g,""));return isNaN(m)?"":m}else{h=String(h).replace(/[^0-9.]/g,"");var v=h.split(".");return v.length>2&&(h=v[0]+"."+v.slice(1).join("")),r(this)._CIOriginalVal(h)}else return arguments.length===0?r(this)._CIOriginalVal():r(this)._CIOriginalVal(h)}),this.data("_currencyInput")?this:(this.data("_currencyInput",!0),this.on("focus",function(){r(this).select()}),this.on("input",function(h){var g=this.selectionStart,m=r(this)._CIOriginalVal(),l=m.length;r(this).val(m);var v=r(this)._CIOriginalVal().length;v>l?g+=v-l:v2&&(m=l[0]+"."+l.slice(1).join("")),r(this)._CIOriginalVal(m);var v=m.length;v0){var h=c/s*100;this.$downPaymentPercent._CIOriginalVal(h.toFixed(1))}},syncDownPaymentFromPercent:function(){var s=this.$homePrice.val(),c=this.$downPaymentPercent.val();if(s&&s>0&&c!==""&&c>=0){var h=Math.round(s*c/100);this.$downPayment.val(h)}},calculate:function(){var s=this.$homePrice.val()||0,c=this.$downPayment.val()||0,h=parseInt(this.$loanTerm.val(),10),g=this.$interestRate.val()||0,m=s-c;m<0&&(m=0);var l=g/100/12,v=h*12,b=0,t=0;if(m>0&&l>0&&v>0){var e=Math.pow(1+l,v);b=m*(l*e)/(e-1),t=b*v-m}else m>0&&l===0&&(b=m/v,t=0);this.$monthlyPayment.text(this.formatCurrencyDisplay(b)),this.$principalInterest.text(this.formatCurrencyDisplay(b)),this.$loanAmount.text(this.formatCurrencyDisplay(m)),this.$totalInterest.text(this.formatCurrencyDisplay(t))}};r(document).ready(function(){n.init()})})(jQuery);(function(r){r(function(){})})(jQuery); +(function(r){var y=r(".menu-toggle"),n=r(".mobile-navigation");y.length&&(y.on("click",function(){var s=r(this).attr("aria-expanded")==="true";r(this).attr("aria-expanded",!s),n.toggleClass("is-open"),s?r("body").removeClass("mobile-menu-open"):r("body").addClass("mobile-menu-open")}),r(document).on("keydown",function(s){s.key==="Escape"&&n.hasClass("is-open")&&(y.attr("aria-expanded","false"),n.removeClass("is-open"),r("body").removeClass("mobile-menu-open"))}),r(document).on("click",function(s){n.hasClass("is-open")&&!r(s.target).closest(".mobile-navigation").length&&!r(s.target).closest(".menu-toggle").length&&(y.attr("aria-expanded","false"),n.removeClass("is-open"),r("body").removeClass("mobile-menu-open"))}))})(jQuery);(function(r){var y=6e3,n=1450,s=1e3,u=[],h=0,g=null,m=!1,l=!1,v=null;function b(){if(r(".Home_Page").length&&(v=r(".hero-split-image"),!!v.length)){var d=v.data("gallery-images");!d||!d.length||(u=d,t(),r(window).on("resize",c(t,150)))}}function t(){var d=r(window).width();d>=n?m||e():m&&i()}function e(){m=!0,l||(a(),l=!0),g=setInterval(o,y)}function i(){m=!1,g&&(clearInterval(g),g=null)}function a(){r.each(u,function(d,p){var f=new Image;f.src=p})}function o(){h=(h+1)%u.length;var d=u[h],p=r('
    ');p.css({position:"absolute",top:0,left:0,right:0,bottom:0,"background-image":"url("+d+")","background-size":"cover","background-position":"center center","background-repeat":"no-repeat",opacity:0,transform:"scale(1.02)",transition:"opacity "+s+"ms ease-in-out, transform "+s+"ms ease-in-out","z-index":1}),v.css("position","relative"),v.append(p),p[0].offsetHeight,p.css({opacity:1,transform:"scale(1)"}),setTimeout(function(){v.css("background-image","url("+d+")"),p.remove()},s)}function c(d,p){var f;return function(){var I=this,P=arguments;clearTimeout(f),f=setTimeout(function(){d.apply(I,P)},p)}}r(document).ready(b)})(jQuery);(function(r){if(r("body").hasClass("Home_Page")){var y={grid:null,emptyMessage:null,listings:[],init:function(){this.grid=r("#featured-listings-grid"),this.emptyMessage=r("#featured-listings-empty"),this.grid.length&&(this.loadListingsData(),this.renderListings())},loadListingsData:function(){var n=document.getElementById("featured-mls-data");if(!n){this.listings=[];return}try{this.listings=JSON.parse(n.textContent)}catch(s){console.error("Failed to parse featured listings data:",s),this.listings=[]}},shuffleArray:function(n){for(var s=n.slice(),u=s.length-1;u>0;u--){var h=Math.floor(Math.random()*(u+1)),g=s[u];s[u]=s[h],s[h]=g}return s},renderListings:function(){if(!this.listings||this.listings.length===0){this.grid.hide(),this.emptyMessage.show();return}for(var n=[],s=[],u=0;u',n.bedrooms&&(h+='
  • '+n.bedrooms+" "+s+"
  • "),n.bathrooms&&(h+='
  • '+n.bathrooms+" "+u+"
  • "),n.sqft&&(h+='
  • '+n.sqft.toLocaleString()+" sqft
  • "),h+=""),'
    Active
    '+this.escapeHtml(n.price_formatted)+'

    '+this.escapeHtml(n.address)+"

    "+h+'View Details
    '},escapeHtml:function(n){if(!n)return"";var s=document.createElement("div");return s.textContent=n,s.innerHTML}};r(document).ready(function(){y.init()})}})(jQuery);(function(r){var y={PREFIX:"HOMEPROZ_AJAX_",EXPIRY_MS:3e5,init:function(){this.cleanExpired()},cleanExpired:function(){try{for(var t=Date.now(),e=[],i=0;ithis.EXPIRY_MS&&e.push(a)}catch{e.push(a)}}e.forEach(function(c){sessionStorage.removeItem(c)})}catch{}},normalizeData:function(t){var e={};for(var i in t)if(i!=="nonce"){var a=t[i];Array.isArray(a)?e[i]=a.map(function(o){return typeof o=="number"?Math.round(o*1e4)/1e4:o}):e[i]=a}return e},getKey:function(t){for(var e=this.normalizeData(t),i=JSON.stringify(e),a=0,o=0;othis.EXPIRY_MS?(sessionStorage.removeItem(e),null):a.data}catch{return null}},set:function(t,e){try{var i=this.getKey(t),a={time:Date.now(),data:e};sessionStorage.setItem(i,JSON.stringify(a))}catch{}}};y.init();var n={pending:{clusters:null,properties:null},timeouts:{clusters:null,properties:null},requestIds:{clusters:0,properties:0},debounceDelay:200,queue:function(t,e,i,a,o){var c=this;this.timeouts[t]&&(clearTimeout(this.timeouts[t]),this.timeouts[t]=null),this.pending[t]&&(this.pending[t].abort(),this.pending[t]=null),this.requestIds[t]++;var d=this.requestIds[t];this.timeouts[t]=setTimeout(function(){c.timeouts[t]=null;var p=e(d);p&&p.then&&(c.pending[t]=p,p.done(function(f){d===c.requestIds[t]&&i(f,d)}),p.fail(function(f,I,P){o&&d===c.requestIds[t]&&I!=="abort"&&o(f,I,P)}),p.always(function(){c.pending[t]===p&&(c.pending[t]=null),a&&d===c.requestIds[t]&&a()}))},this.debounceDelay)},cancel:function(t){var e=t?[t]:["clusters","properties"],i=this;e.forEach(function(a){i.timeouts[a]&&(clearTimeout(i.timeouts[a]),i.timeouts[a]=null),i.pending[a]&&(i.pending[a].abort(),i.pending[a]=null)})},isLoading:function(t){return!!(this.pending[t]||this.timeouts[t])}},s={map:null,markers:{},markerData:{},densityLayer:null,clusterLayer:null,markerCluster:null,markerLayer:null,selectedPropertyId:null,isPinClickPan:!1,hoveredPropertyId:null,temporaryHoverMarker:null,baseZIndex:400,currentFilters:{},currentMode:null,init:function(t){var e=r("#property-map");if(!(!e.length||typeof L>"u")){this.currentFilters=t||{},this.map=L.map("property-map").setView([45,-93.5],7),L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{attribution:'© OpenStreetMap'}).addTo(this.map),this.densityLayer=L.layerGroup().addTo(this.map),this.clusterLayer=L.layerGroup().addTo(this.map),this.markerLayer=L.layerGroup().addTo(this.map),this.markerCluster=L.markerClusterGroup({maxClusterRadius:50,spiderfyOnMaxZoom:!0,showCoverageOnHover:!1,zoomToBoundsOnClick:!0,disableClusteringAtZoom:18,chunkedLoading:!0,chunkInterval:200,chunkDelay:50,iconCreateFunction:function(a){var o=a.getChildCount(),c="small";return o>=100?c="large":o>=10&&(c="medium"),L.divIcon({html:"
    "+o+"
    ",className:"marker-cluster marker-cluster-"+c,iconSize:L.point(40,40)})}}),this.map.addLayer(this.markerCluster);var i=this;this.map.on("moveend zoomend",function(){i.loadClusters(),setTimeout(function(){h.updateUrlState()},400)}),this.bindCardHoverEvents(),this.loadClusters()}},loadClusters:function(){if(this.map){var t=this,e=this.map.getBounds(),i=this.map.getCenter(),a=this.map.getZoom(),o=[e.getSouthWest().lat,e.getSouthWest().lng,e.getNorthEast().lat,e.getNorthEast().lng],c=[i.lat,i.lng],d={action:"mls_get_clusters",zoom:a,bounds:o,status:this.currentFilters.status||"Active",property_type:this.currentFilters.property_type||"",city:this.currentFilters.city||"",min_price:this.currentFilters.min_price||"",max_price:this.currentFilters.max_price||"",min_beds:this.currentFilters.min_beds||""};h.updateFromMap(o,c);var p=y.get(d);if(p&&p.success){var f=p.data;switch(this.currentMode=f.type,f.type){case"density":this.renderDensity(f.dots);break;case"clusters":this.renderClusters(f.clusters);break;case"markers":this.renderMarkers(f.markers);break}return}n.queue("clusters",function(I){return r.ajax({url:homeprozMapData.clusterEndpoint,type:"GET",data:d})},function(I,P){if(I.success){y.set(d,I);var x=I.data;switch(t.currentMode=x.type,x.type){case"density":t.renderDensity(x.dots);break;case"clusters":t.renderClusters(x.clusters);break;case"markers":t.renderMarkers(x.markers);break}}})}},clearAllLayers:function(){this.densityLayer.clearLayers(),this.clusterLayer.clearLayers(),this.markerCluster.clearLayers(),this.markerLayer.clearLayers(),this.markers={},this.temporaryHoverMarker&&(this.map.removeLayer(this.temporaryHoverMarker),this.temporaryHoverMarker=null)},renderDensity:function(t){this.clearAllLayers(),this.selectedPropertyId=null,this.isPinClickPan=!1,r(".property-card").removeClass("property-card-highlighted");var e=this,i=this.map.getZoom();t.forEach(function(a){var o=e.getDensityColor(a.count,i),c=e.getDensitySize(a.count,i),d=L.divIcon({html:'
    ',className:"density-dot-container",iconSize:[c,c],iconAnchor:[c/2,c/2]}),p=L.marker([a.lat,a.lng],{icon:d});p.on("click",function(){e.map.setView([a.lat,a.lng],e.map.getZoom()+2)}),p.bindTooltip(a.count+" properties",{className:"density-tooltip"}),e.densityLayer.addLayer(p)})},getDensityThreshold:function(t){return Math.max(40,Math.round(600/Math.pow(1.4,t-3)))},getDensityColor:function(t,e){var i=this.getDensityThreshold(e),a=t/i;return a>=1.5?"rgba(180, 83, 9, 0.8)":a>=1?"rgba(217, 119, 6, 0.8)":a>=.6?"rgba(245, 158, 11, 0.8)":a>=.3?"rgba(234, 179, 8, 0.8)":a>=.15?"rgba(132, 204, 22, 0.8)":"rgba(34, 197, 94, 0.8)"},getDensitySize:function(t,e){var i=this.getDensityThreshold(e),a=t/i;return a>=1.5?11:a>=1?10:a>=.6?8:a>=.3?7:6},renderClusters:function(t){this.clearAllLayers(),this.selectedPropertyId=null,this.isPinClickPan=!1,r(".property-card").removeClass("property-card-highlighted");var e=this;t.forEach(function(i){var a="small";i.count>=100?a="large":i.count>=10&&(a="medium");var o=L.divIcon({html:"
    "+i.count+"
    ",className:"marker-cluster marker-cluster-"+a+" server-cluster",iconSize:L.point(40,40)}),c=L.marker([i.lat,i.lng],{icon:o});c.on("click",function(){e.map.setView([i.lat,i.lng],e.map.getZoom()+2)});var d="$"+e.formatNumber(i.min_price);i.max_price!==i.min_price&&(d+=" - $"+e.formatNumber(i.max_price)),c.bindTooltip(i.count+" properties
    "+d,{className:"cluster-tooltip"}),e.clusterLayer.addLayer(c)})},renderMarkers:function(t){var e=this.selectedPropertyId;this.clearAllLayers(),this.hoveredPropertyId=null;var i=this,a=[];t.forEach(function(o,c){if(o.lat&&o.lng){var d=o.id===e,p=d?"amber":"red",f=L.marker([o.lat,o.lng],{icon:i.createIcon(p),zIndexOffset:d?1e4:i.baseZIndex+c});f.propertyId=o.id,f.defaultZIndex=i.baseZIndex+c,i.markerData[o.id]={lat:o.lat,lng:o.lng,price:o.price,address:o.address},f.bindPopup('
    '+o.price+"
    "+o.address+'
    View Details
    '),f.on("click",function(I){i.onMarkerClick(o.id)}),a.push(f),i.markers[o.id]=f}}),a.length<=30?a.forEach(function(o){i.markerLayer.addLayer(o)}):this.markerCluster.addLayers(a),this.isPinClickPan=!1,e&&this.markers[e]?this.selectedPropertyId=e:(this.selectedPropertyId=null,r(".property-card").removeClass("property-card-highlighted"))},updateFilters:function(t){this.currentFilters=t||{},this.loadClusters()},formatNumber:function(t){return t.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")},createIcon:function(t){return t=t||"red",L.divIcon({className:"property-marker property-marker-"+t,html:'
    ',iconSize:[17,22],iconAnchor:[8,22],popupAnchor:[0,-22]})},onMarkerClick:function(t){var e=this;if(this.selectedPropertyId!==t){this.selectedPropertyId&&(this.setMarkerColor(this.selectedPropertyId,"red"),this.resetMarkerZIndex(this.selectedPropertyId),r("#property-"+this.selectedPropertyId).removeClass("property-card-highlighted"));var i=this.markerData[t];if(i){this.selectedPropertyId=t,this.setMarkerColor(t,"amber"),this.setMarkerZIndex(t,1e4);var a=r("#property-"+t);a.length?(a.addClass("property-card-highlighted"),this.isCardScroll=!0,r("html, body").animate({scrollTop:a.offset().top-120},300,function(){setTimeout(function(){e.isCardScroll=!1},100)})):(this.isPinClickPan=!0,this.map.panTo([i.lat,i.lng]))}}},flashCard:function(t){t.removeClass("property-card-highlighted"),setTimeout(function(){t.addClass("property-card-highlighted"),setTimeout(function(){t.removeClass("property-card-highlighted"),setTimeout(function(){t.addClass("property-card-highlighted")},150)},150)},50)},setMarkerColor:function(t,e){var i=this.markers[t];i&&i.setIcon(this.createIcon(e))},setMarkerZIndex:function(t,e){var i=this.markers[t];i&&i.setZIndexOffset(e)},resetMarkerZIndex:function(t){var e=this.markers[t];e&&e.setZIndexOffset(e.defaultZIndex)},bindCardHoverEvents:function(){var t=this;r(document).on("mouseenter",".property-card[data-property-id]",function(){var e=r(this),i=e.data("property-id");if(i!==t.selectedPropertyId)if(t.hoveredPropertyId=i,t.markers[i])t.setMarkerColor(i,"blue"),t.setMarkerZIndex(i,9e3);else{var a=e.data("lat"),o=e.data("lng");a&&o&&t.map&&(t.temporaryHoverMarker&&t.map.removeLayer(t.temporaryHoverMarker),t.temporaryHoverMarker=L.marker([a,o],{icon:t.createIcon("blue"),zIndexOffset:15e3}),t.temporaryHoverMarker.addTo(t.map))}}),r(document).on("mouseleave",".property-card[data-property-id]",function(){var e=r(this).data("property-id");e!==t.selectedPropertyId&&(t.hoveredPropertyId===e&&(t.hoveredPropertyId=null),t.temporaryHoverMarker&&(t.map.removeLayer(t.temporaryHoverMarker),t.temporaryHoverMarker=null),t.markers[e]&&(t.setMarkerColor(e,"red"),t.resetMarkerZIndex(e)))})}},u={$mainFilter:null,$stickyFilter:null,$mainForm:null,$stickyForm:null,observer:null,isVisible:!1,init:function(){window.innerWidth<1024||!r(".is-map-view").length||(this.$mainFilter=r("#property-filters"),this.$stickyFilter=r("#property-filters-sticky"),this.$mainForm=this.$mainFilter.find(".filters-form"),this.$stickyForm=this.$stickyFilter.find(".filters-form-sticky"),!(!this.$mainFilter.length||!this.$stickyFilter.length)&&(this.setupObserver(),this.bindEvents()))},setupObserver:function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(i){i.isIntersecting?t.hideStickyFilter():t.showStickyFilter()})},{root:null,rootMargin:"0px",threshold:0}),this.observer.observe(this.$mainFilter[0])},bindEvents:function(){var t=this;this.$mainForm.find("select, input").on("change input",function(){t.syncToSticky(this.name,r(this).val())}),this.$stickyForm.find("select").on("change",function(){t.syncToMain(this.name,r(this).val()),h.filterProperties(1)}),this.$stickyForm.find("input").on("change",function(){t.syncToMain(this.name,r(this).val()),h.filterProperties(1)}),this.$stickyForm.on("submit",function(e){e.preventDefault(),h.filterProperties(1)})},syncToSticky:function(t,e){var i=this.$stickyForm.find('[name="'+t+'"]');i.length&&i.val()!==e&&i.val(e)},syncToMain:function(t,e){var i=this.$mainForm.find('[name="'+t+'"]');i.length&&i.val()!==e&&i.val(e)},showStickyFilter:function(){this.isVisible||(this.isVisible=!0,this.$stickyFilter.removeClass("is-hiding").addClass("is-visible"))},hideStickyFilter:function(){if(this.isVisible){this.isVisible=!1,this.$stickyFilter.removeClass("is-visible").addClass("is-hiding");var t=this;setTimeout(function(){t.$stickyFilter.removeClass("is-hiding")},10)}},syncAllToSticky:function(){var t=this;this.$mainForm.find("select, input").each(function(){t.syncToSticky(this.name,r(this).val())})}},h={$form:null,$results:null,$filters:null,isFirstLoad:!0,mapBounds:null,mapCenter:null,isMapUpdate:!1,init:function(){this.$form=r(".filters-form"),this.$results=r("#property-results"),this.$filters=r("#property-filters"),!(!this.$form.length||!this.$results.length)&&(this.bindEvents(),this.initFromUrl())},bindEvents:function(){var t=this;this.$form.on("submit",function(e){e.preventDefault(),t.filterProperties(1)}),this.$form.find("select").on("change",function(){t.clearPinSelection(),t.filterProperties(1)}),r(".filters-reset").on("click",function(e){e.preventDefault(),t.resetFilters()}),this.$results.on("click",".pagination a",function(e){e.preventDefault();var i=t.getPageFromUrl(r(this).attr("href"));t.filterProperties(i)}),r(window).on("hashchange",function(){var e=t.getPageFromHash();t.filterProperties(e,!1)})},initFromUrl:function(){var t=new URLSearchParams(window.location.search);this.$form.find("select").each(function(){var i=r(this).attr("name");t.has(i)&&r(this).val(t.get(i))}),this.$form.find('input[type="text"]').each(function(){var i=r(this).attr("name");t.has(i)&&r(this).val(t.get(i))});var e=this.getStateFromHash();e&&(e.lat!==null||e.page>1)&&(this.pendingRestoreState=e)},restoreState:function(){var t=this.pendingRestoreState;if(t){if(this.pendingRestoreState=null,t.lat!==null&&t.lng!==null&&t.zoom!==null&&s.map){s.map.off("moveend zoomend"),s.map.setView([t.lat,t.lng],t.zoom);var e=s.map.getBounds(),i=s.map.getCenter();this.mapBounds=[e.getSouthWest().lat,e.getSouthWest().lng,e.getNorthEast().lat,e.getNorthEast().lng],this.mapCenter=[i.lat,i.lng],s.loadClusters(),setTimeout(function(){s.map.on("moveend zoomend",function(){s.loadClusters(),setTimeout(function(){h.updateUrlState()},400)})},100)}t.page>1?this.bulkLoadPages(t.page,t.scroll):t.scroll>0&&(window.scrollTo({top:t.scroll,behavior:"instant"}),r(window).trigger("scroll"))}},bulkLoadPages:function(t,e){var i=this,a=this.getFormData();l.isRestoring=!0;for(var o=[],c=1;c<=t+1;c++)o.push(c);var d={action:"homeproz_filter_properties",nonce:homeprozAjax.nonce,property_type:a.property_type,property_location:a.property_location,zip:a.zip,min_price:a.min_price,max_price:a.max_price,beds:a.beds,cards_only:"true"};this.mapBounds&&(d.bounds=this.mapBounds),this.mapCenter&&(d.center=this.mapCenter);var p=[],f=[];if(o.forEach(function(P){var x=r.extend({},d,{paged:P}),w=y.get(x);w&&w.success&&w.data&&w.data.html?p.push({page:P,html:w.data.html,max_pages:w.data.max_pages||1}):f.push(P)}),f.length===0){this.renderBulkResults(p,t,e);return}this.$results.html('
    ');var I=f.map(function(P){var x=r.extend({},d,{paged:P});return r.ajax({url:homeprozAjax.ajaxUrl,type:"POST",data:x}).then(function(w){var C={page:P,html:w.success?w.data.html:"",max_pages:w.success?w.data.max_pages:0};return w.success&&y.set(x,w),C})});r.when.apply(r,I).done(function(){var P=I.length===1?[arguments[0]]:Array.prototype.slice.call(arguments),x=p.concat(P);i.renderBulkResults(x,t,e)}).fail(function(){l.isRestoring=!1,i.filterProperties(1,!1)})},renderBulkResults:function(t,e,i){t.sort(function(c,d){return c.page-d.page});var a=t[0]?t[0].max_pages:1,o='

    Loading...

    ';o+='
    ',t.forEach(function(c){c.html&&c.page<=a&&(o+='
    ',o+=c.html,o+="
    ")}),o+="
    ",this.$results.html(o),l.currentPage=Math.min(e+1,a),l.maxPages=a,l.pages={},t.forEach(function(c){c.page<=a&&(l.pages[c.page]={state:"populated"})}),i>0&&window.scrollTo({top:i,behavior:"instant"}),l.isRestoring=!1,r(window).trigger("scroll"),typeof b<"u"&&b.process()},updateFromMap:function(t,e){s.isCardScroll||(this.mapBounds=t,this.mapCenter=e,this.isMapUpdate=!0,s.isPinClickPan||this.clearPinSelection(),this.$results.html('
    '),l.isEnabled&&v.reset(s.isPinClickPan),l.currentPage=1,this._scrollBlocked=!0,this.clearScrollFromUrl(),this.filterProperties(1,!1))},clearScrollFromUrl:function(){var t=window.location.hash.replace("#","");if(t){var e=t.split("&").filter(function(a){return!a.startsWith("scroll=")}),i=e.length?"#"+e.join("&"):"";history.replaceState(null,"",window.location.pathname+window.location.search+i)}},clearPinSelection:function(){s.selectedPropertyId&&(s.setMarkerColor(s.selectedPropertyId,"red"),s.resetMarkerZIndex(s.selectedPropertyId),r("#property-"+s.selectedPropertyId).removeClass("property-card-highlighted"),s.selectedPropertyId=null)},getPageFromHash:function(){var t=this.getStateFromHash();return t?t.page:1},filterProperties:function(t,e){e=e!==!1,t=t||1;var i=this,a=this.getFormData();this.$filters.addClass("is-loading"),this.isFirstLoad&&this.$results.html('
    ');var o={action:"homeproz_filter_properties",nonce:homeprozAjax.nonce,property_type:a.property_type,property_location:a.property_location,zip:a.zip,min_price:a.min_price,max_price:a.max_price,beds:a.beds,paged:t};this.mapBounds&&(o.bounds=this.mapBounds),this.mapCenter&&(o.center=this.mapCenter);var c=this.isMapUpdate;this.isMapUpdate=!1,n.queue("properties",function(d){return r.ajax({url:homeprozAjax.ajaxUrl,type:"POST",data:o})},function(d,p){d.success&&(i.$results.html(d.data.html),i.isFirstLoad=!1,d.data.filters&&!c&&s.updateFilters(d.data.filters),typeof m<"u"&&m.calculate(),v.destroy(),setTimeout(function(){v.init()},100),e&&i.updateUrl(a,t),s.selectedPropertyId?setTimeout(function(){var f=r("#property-"+s.selectedPropertyId);f.length&&(window.scrollTo({top:f.offset().top-120,behavior:"instant"}),f.addClass("property-card-highlighted"))},150):t>1&&window.scrollTo({top:i.$filters.offset().top-100,behavior:"instant"}))},function(){i.$filters.removeClass("is-loading")},function(){i.$results.html('

    Error

    Something went wrong. Please try again.

    ')})},getFormData:function(){return{property_type:this.$form.find('[name="property_type"]').val()||"",property_location:this.$form.find('[name="property_location"]').val()||"",zip:this.$form.find('[name="zip"]').val()||"",min_price:this.$form.find('[name="min_price"]').val()||"",max_price:this.$form.find('[name="max_price"]').val()||"",beds:this.$form.find('[name="beds"]').val()||""}},getFormState:function(){return this.getFormData()},setFormFromState:function(t){for(var e in t)this.$form.find('[name="'+e+'"]').val(t[e])},updateUrl:function(t,e){var i=new URL(homeprozAjax.archiveUrl);for(var a in t)t[a]&&i.searchParams.set(a,t[a]);var o=[];if(e>1&&o.push("page="+e),!this._scrollBlocked){var c=window.pageYOffset||document.documentElement.scrollTop;c>0&&o.push("scroll="+Math.round(c))}if(s.map){var d=s.map.getCenter(),p=s.map.getZoom();o.push("lat="+d.lat.toFixed(6)),o.push("lng="+d.lng.toFixed(6)),o.push("zoom="+p)}i.hash=o.length?o.join("&"):"",history.replaceState(null,"",i.toString())},updateUrlState:function(){var t=this;clearTimeout(this._urlUpdateTimeout),this._urlUpdateTimeout=setTimeout(function(){var e=l.currentPage||1,i=t.getFormData();t.updateUrl(i,e)},300)},getStateFromHash:function(){var t=window.location.hash.replace("#","");if(!t)return null;var e={};return t.split("&").forEach(function(i){var a=i.split("=");a.length===2&&(e[a[0]]=a[1])}),{page:e.page?parseInt(e.page):1,scroll:e.scroll?parseInt(e.scroll):0,lat:e.lat?parseFloat(e.lat):null,lng:e.lng?parseFloat(e.lng):null,zoom:e.zoom?parseInt(e.zoom):null}},getPageFromUrl:function(t){var e=t.match(/#page=(\d+)/);if(e)return parseInt(e[1]);var i=t.match(/[?&]paged=(\d+)/);return i?parseInt(i[1]):1},resetFilters:function(){this.$form.find("select").val(""),this.filterProperties(1)}},g={breakpoint:1024,isMapView:!0,isAboveBreakpoint:!0,mapInitialized:!1,init:function(){var t=this;typeof homeprozMapData<"u"&&(this.isMapView=homeprozMapData.isMapView!==!1),this.isAboveBreakpoint=window.innerWidth>=this.breakpoint,this.isAboveBreakpoint&&this.isMapView&&typeof homeprozMapData<"u"&&(s.init(homeprozMapData.initialFilters||{}),this.mapInitialized=!0,h.pendingRestoreState&&h.restoreState());var e;r(window).on("resize",function(){clearTimeout(e),e=setTimeout(function(){t.handleResize()},150)})},handleResize:function(){var t=this.isAboveBreakpoint;this.isAboveBreakpoint=window.innerWidth>=this.breakpoint;var e=r(".property-archive-main");t&&!this.isAboveBreakpoint&&l.isEnabled&&v.destroy(),!t&&this.isAboveBreakpoint&&(this.isMapView?(e.removeClass("is-grid-view").addClass("is-map-view"),!this.mapInitialized&&typeof homeprozMapData<"u"?(s.init(homeprozMapData.initialFilters||{}),this.mapInitialized=!0,h.pendingRestoreState&&h.restoreState()):s.map&&setTimeout(function(){s.map.invalidateSize()},100),setTimeout(function(){v.init()},200)):e.removeClass("is-map-view").addClass("is-grid-view"),typeof m<"u"&&setTimeout(function(){m.calculate()},150))},setMapView:function(t){this.isMapView=t}},m={cardWidth:400,cardGap:24,mapGap:32,mapRatio:.33,breakpoint:1024,containerPadding:24,init:function(){this.calculate();var t=this,e;r(window).on("resize",function(){clearTimeout(e),e=setTimeout(function(){t.calculate()},100)})},calculate:function(){if(window.innerWidth .container"),i=t.hasClass("is-map-view"),a=e.width();i?this.calculateMapLayout(a):this.calculateGridLayout(a)},calculateMapLayout:function(t){for(var e=5;e>=1;e--){var i=e*this.cardWidth+(e-1)*this.cardGap,a=(this.mapGap+i)/(1-this.mapRatio);if(a<=t){this.setProperties(a,e,".property-map-layout"),this.setProperties(a,e,".property-list-container");return}}var i=this.cardWidth,a=(this.mapGap+i)/(1-this.mapRatio);this.setProperties(Math.min(a,t),1,".property-map-layout"),this.setProperties(Math.min(a,t),1,".property-list-container")},calculateGridLayout:function(t){for(var e=6;e>=1;e--){var i=e*this.cardWidth+(e-1)*this.cardGap;if(i<=t){this.setProperties(i,e,".grid-view-container");return}}this.setProperties(this.cardWidth,1,".grid-view-container")},setProperties:function(t,e,i){var a=r(i);a.length&&(a.css("--layout-width",t+"px"),a.css("--card-columns",e))},clearProperties:function(){r(".property-map-layout, .grid-view-container, .property-list-container").css({"--layout-width":"","--card-columns":""})}},l={pages:{},totalPages:0,totalPosts:0,currentPage:1,pendingPage:null,isEnabled:!1,isRestoring:!1,cardsPerPage:12},v={$container:null,$grid:null,scrollTimeout:null,init:function(){if(window.innerWidth>=1024&&r(".is-map-view").length?this.$container=r(".property-list-container"):this.$container=r("#property-results"),this.$grid=this.$container.find(".properties-grid"),!(!this.$container.length||!this.$grid.length)){var t=this.$container.find(".properties-meta"),e=t.find(".properties-count strong").text().replace(/,/g,"");l.totalPosts=parseInt(e)||0,l.totalPages=Math.ceil(l.totalPosts/l.cardsPerPage),!(l.totalPages<=1)&&(l.pages={},l.pendingPage=null,this.wrapInitialCards(),this.bindScrollHandler(),l.isEnabled=!0,this.$container.addClass("infinite-scroll-enabled"),this.syncPages())}},wrapInitialCards:function(){var t=this.$grid.find(".property-card");if(t.length){var e=r('
    ');t.wrapAll(e),l.pages[1]={state:"populated"}}},bindScrollHandler:function(){var t=this;r(window).on("scroll.infiniteScroll",function(){clearTimeout(t.scrollTimeout),t.scrollTimeout=setTimeout(function(){t.syncPages(),h.updateUrlState()},100)}),r(window).on("wheel.infiniteScroll",function(){h._scrollBlocked=!1})},syncPages:function(){if(!(!this.$grid||!l.isEnabled)&&!l.isRestoring){var t=l.totalPages,e=this.calculateCurrentPage();e>t-2&&(e=t-2),e<1&&(e=1),l.currentPage=e;var i=[e-2,e-1,e,e+1,e+2];i=i.filter(function(o){return o>=1&&o<=t});var a=this.getReferenceCardDimensions();this.ensurePagesExist(i),this.loadFirstUnloaded(i),this.syncPageStates(i,a)}},calculateCurrentPage:function(){var t=window.scrollY||window.pageYOffset,e=t+window.innerHeight,i=this.$grid.find(".infinite-scroll-page");if(!i.length)return 1;var a=1,o=1/0;return i.each(function(){var c=r(this),d=parseInt(c.data("page")),p=c.find(".property-card").first();if(p.length){var f=p[0].getBoundingClientRect(),I=f.top+t;if(I<=e){var P=e-I;P');e.insertPageInOrder(o,i),l.pages[i]||(l.pages[i]={state:"empty"})}})},insertPageInOrder:function(t,e){var i=this.$grid.find(".infinite-scroll-page"),a=!1;i.each(function(){var o=parseInt(r(this).data("page"));if(eo&&window.scrollTo({top:o,behavior:"instant"})}}},destroy:function(){l.isEnabled&&(r(window).off("scroll.infiniteScroll"),clearTimeout(this.scrollTimeout),this.$container&&this.$container.removeClass("infinite-scroll-enabled"),this.$grid&&(this.$grid.find('.infinite-scroll-page[data-state="populated"]').children().unwrap(),this.$grid.find('.infinite-scroll-page[data-state="placeholder"]').remove()),l.pages={},l.pendingPage=null,l.isEnabled=!1)}},b={_isRunning:!1,_activeLoads:0,MAX_PARALLEL:2,LOAD_DISTANCE:1e3,init:function(){this.process(),this.bindScrollEvent()},bindScrollEvent:function(){var t=this,e;r(window).on("scroll",function(){clearTimeout(e),e=setTimeout(function(){t.process()},50)})},process:function(){this._isRunning||(this._isRunning=!0,this._activeLoads=0,this._processNext())},_getNextElement:function(){var t=r(".property-card-image[data-bg]");if(!t.length)return null;var e=window.pageYOffset||document.documentElement.scrollTop,i=e,a=e+window.innerHeight,o=this.LOAD_DISTANCE,c=[],d=[];return t.each(function(){var p=this.getBoundingClientRect(),f=p.top+e,I=f+p.height;if(I>=i&&f<=a)c.push({el:this,position:f});else{var P;f>a?P=f-a:P=i-I,P<=o&&d.push({el:this,distance:P})}}),c.sort(function(p,f){return p.position-f.position}),d.sort(function(p,f){return p.distance-f.distance}),c.length?c[0].el:d.length?d[0].el:null},_processNext:function(){for(var t=this;this._activeLoads1&&this.startAutoplay())}},calculateThumbnailsPerPage:function(){r(window).width()<=640?this.thumbnailsPerPage=4:this.thumbnailsPerPage=5},bindEvents:function(){var n=this;this.$thumbnails.on("click",function(s){s.stopPropagation();var u=parseInt(r(this).data("index"));n.stopAutoplay(),n.setMainImage(u,!1)}),this.$playbackBtn.on("click",function(s){s.stopPropagation(),s.preventDefault(),n.isPlaying?n.stopAutoplay():n.startAutoplay()}),this.$prevBtn.on("click",function(){n.stopAutoplay(),n.prevThumbnailPage()}),this.$nextBtn.on("click",function(){n.stopAutoplay(),n.nextThumbnailPage()}),this.$gallery.find("[data-lightbox-trigger]").on("click",function(s){if(n.isSwiping){n.isSwiping=!1;return}n.stopAutoplay(),n.openLightbox(n.currentIndex)}),this.$lightbox.find(".lightbox-close, .lightbox-overlay").on("click",function(){n.closeLightbox()}),this.$lightbox.find(".lightbox-prev").on("click",function(){n.slideLightboxImage("prev")}),this.$lightbox.find(".lightbox-next").on("click",function(){n.slideLightboxImage("next")}),r(document).on("keydown",function(s){if(n.$lightbox.is('[aria-hidden="false"]'))switch(s.key){case"Escape":n.closeLightbox();break;case"ArrowLeft":n.slideLightboxImage("prev");break;case"ArrowRight":n.slideLightboxImage("next");break}}),r(window).on("resize",function(){n.calculateThumbnailsPerPage(),n.updateThumbnailNavigation()})},bindSwipeEvents:function(){var n=this;this.$mainImageContainer[0].addEventListener("touchstart",function(s){n.handleSwipeStart(s)},{passive:!0}),this.$mainImageContainer[0].addEventListener("touchend",function(s){n.handleMainGallerySwipeEnd(s)},{passive:!0}),this.$lightboxImageContainer[0].addEventListener("touchstart",function(s){n.handleSwipeStart(s)},{passive:!0}),this.$lightboxImageContainer[0].addEventListener("touchend",function(s){n.handleLightboxSwipeEnd(s)},{passive:!0})},handleSwipeStart:function(n){n.touches.length===1&&(this.swipeStartX=n.touches[0].clientX,this.swipeStartY=n.touches[0].clientY)},handleMainGallerySwipeEnd:function(n){if(n.changedTouches.length===1){var s=n.changedTouches[0].clientX-this.swipeStartX,u=n.changedTouches[0].clientY-this.swipeStartY;Math.abs(s)>Math.abs(u)&&Math.abs(s)>this.swipeThreshold&&(this.isSwiping=!0,this.stopAutoplay(),s>0?this.slideMainImage("prev"):this.slideMainImage("next"))}},handleLightboxSwipeEnd:function(n){if(n.changedTouches.length===1){var s=n.changedTouches[0].clientX-this.swipeStartX,u=n.changedTouches[0].clientY-this.swipeStartY;Math.abs(s)>Math.abs(u)&&Math.abs(s)>this.swipeThreshold&&(s>0?this.slideLightboxImage("prev"):this.slideLightboxImage("next"))}},startAutoplay:function(){var n=this;this.images.length<=1||(this.isPlaying=!0,this.$playbackBtn.addClass("is-playing"),this.$playbackBtn.attr("aria-label","Pause slideshow"),this.autoplayInterval=setInterval(function(){n.advanceImage()},this.autoplayDelay))},stopAutoplay:function(){this.isPlaying=!1,this.$playbackBtn.removeClass("is-playing"),this.$playbackBtn.attr("aria-label","Play slideshow"),this.autoplayInterval&&(clearInterval(this.autoplayInterval),this.autoplayInterval=null)},advanceImage:function(){if(!this.isTransitioning){var n=this.currentIndex+1;n>=this.images.length&&(n=0),this.setMainImage(n,!0)}},slideMainImage:function(n){var s=this;if(!(this.isTransitioning||this.images.length<=1)){var u;n==="prev"?(u=this.currentIndex-1,u<0&&(u=this.images.length-1)):(u=this.currentIndex+1,u>=this.images.length&&(u=0)),this.isTransitioning=!0;var h=this.images[u],g=n==="next"?"100%":"-100%",m=n==="next"?"-100%":"100%",l=r('');l.attr("src",h.url),l.attr("alt",h.alt||"Property photo"),l.css({position:"absolute",top:0,left:0,width:"100%",height:"100%","object-fit":"cover",transform:"translateX("+g+")","z-index":2,"border-radius":"0.5rem"}),this.$mainImageContainer.css({position:"relative",overflow:"hidden"}),this.$mainImageContainer.append(l),this.$mainImage.css({transition:"transform "+this.slideDuration+"ms ease-out"}),l.css({transition:"transform "+this.slideDuration+"ms ease-out"}),l[0].offsetHeight,this.$mainImage.css("transform","translateX("+m+")"),l.css("transform","translateX(0)"),setTimeout(function(){s.$mainImage.attr("src",h.url),s.$mainImage.attr("alt",h.alt||"Property photo"),s.$mainImage.css({transition:"",transform:""}),l.remove(),s.isTransitioning=!1},this.slideDuration),this.currentIndex=u,this.$thumbnails.removeClass("is-active"),this.$thumbnails.filter('[data-index="'+u+'"]').addClass("is-active"),this.scrollToThumbnail(u)}},setMainImage:function(n,s){var u=this;if(!(n<0||n>=this.images.length)&&!this.isTransitioning){var h=this.images[n];if(s){this.isTransitioning=!0;var g=r('');g.attr("src",h.url),g.attr("alt",h.alt||"Property photo"),g.css({position:"absolute",top:0,left:0,width:"100%",height:"100%","object-fit":"cover",opacity:0,transform:"scale(1.02)",transition:"opacity "+this.fadeDuration+"ms ease-in-out, transform "+this.fadeDuration+"ms ease-in-out","z-index":2,"border-radius":"0.5rem"}),this.$mainImageContainer.css("position","relative"),this.$mainImageContainer.append(g),g[0].offsetHeight,g.css({opacity:1,transform:"scale(1)"}),setTimeout(function(){u.$mainImage.attr("src",h.url),u.$mainImage.attr("alt",h.alt||"Property photo"),g.remove(),u.isTransitioning=!1},this.fadeDuration)}else this.$mainImage.attr("src",h.url),this.$mainImage.attr("alt",h.alt||"Property photo");this.currentIndex=n,this.$thumbnails.removeClass("is-active"),this.$thumbnails.filter('[data-index="'+n+'"]').addClass("is-active"),this.scrollToThumbnail(n)}},scrollToThumbnail:function(n){var s=Math.floor(n/this.thumbnailsPerPage);s!==this.thumbnailPage&&(this.thumbnailPage=s,this.scrollThumbnails())},scrollThumbnails:function(){var n=this.$gallery.find(".gallery-thumbnails"),s=this.$thumbnails.first().outerWidth(!0),u=this.thumbnailPage*this.thumbnailsPerPage*s;n.css("transform","translateX(-"+u+"px)"),this.updateThumbnailNavigation()},updateThumbnailNavigation:function(){var n=Math.ceil(this.images.length/this.thumbnailsPerPage);this.$prevBtn.prop("disabled",this.thumbnailPage===0),this.$nextBtn.prop("disabled",this.thumbnailPage>=n-1),n<=1?(this.$prevBtn.hide(),this.$nextBtn.hide()):(this.$prevBtn.show(),this.$nextBtn.show())},prevThumbnailPage:function(){this.thumbnailPage>0&&(this.thumbnailPage--,this.scrollThumbnails(),this.preloadPrevThumbnailPage())},nextThumbnailPage:function(){var n=Math.ceil(this.images.length/this.thumbnailsPerPage);this.thumbnailPage=this.images.length&&(u=0)),this.isTransitioning=!0;var h=this.images[u],g=n==="next"?"100%":"-100%",m=n==="next"?"-100%":"100%",l=r('');l.attr("src",h.url),l.attr("alt",h.alt||"Property photo"),l.css({position:"absolute","max-width":"100%","max-height":"calc(100vh - 8rem)","object-fit":"contain",transform:"translateX("+g+")",left:"50%",top:"50%","margin-left":"-45vw","margin-top":"calc(-50vh + 4rem)"}),this.$lightboxImageContainer.css({position:"relative",overflow:"hidden"}),this.$lightboxImageContainer.append(l),this.$lightboxImage.css({transition:"transform "+this.slideDuration+"ms ease-out"}),l.css({transition:"transform "+this.slideDuration+"ms ease-out"}),l[0].offsetHeight,this.$lightboxImage.css("transform","translateX("+m+")"),l.css("transform","translateX(0)"),setTimeout(function(){s.$lightboxImage.attr("src",h.url),s.$lightboxImage.attr("alt",h.alt||"Property photo"),s.$lightboxImage.css({transition:"",transform:""}),l.remove(),s.isTransitioning=!1,s.$lightboxCounter.text(u+1)},this.slideDuration),this.currentIndex=u}},prevImage:function(){this.slideLightboxImage("prev")},nextImage:function(){this.slideLightboxImage("next")},updateLightboxImage:function(){var n=this.images[this.currentIndex];this.$lightboxImage.attr("src",n.url),this.$lightboxImage.attr("alt",n.alt||"Property photo"),this.$lightboxCounter.text(this.currentIndex+1)},setupThumbnailLoading:function(){this.$thumbnails.each(function(){var n=r(this),s=n.find("img");n.addClass("is-loading"),n.find(".thumbnail-spinner").length||n.append('
    '),s[0].complete?n.removeClass("is-loading"):(s.on("load",function(){n.removeClass("is-loading")}),s.on("error",function(){n.removeClass("is-loading")}))})},preloadThumbnailPages:function(n,s){for(var u=this,h=n*this.thumbnailsPerPage,g=Math.min((n+s)*this.thumbnailsPerPage,this.images.length),m=h;m=0&&this.preloadThumbnailPages(n,1)}};r(function(){y.init()})})(jQuery);(function(r){if(!r(".mortgage-calculator-main").length)return;let y=!1;r.fn.currencyInput=function(s=!0){return this.data("ci_show_symbol",s),y||(y=!0,r.fn._CIOriginalVal=r.fn.val,r.fn.val=function(h){if(r(this).data("_currencyInput"))if(arguments.length===0){var g=r(this)._CIOriginalVal();if(g=="")return"";var m=parseInt(g.replace(/[^0-9]/g,""));return m}else{if(h=String(h).replace(/[^0-9]/g,""),h!=""){var l=parseInt(h).toLocaleString("en-US",{style:"currency",currency:"USD",minimumFractionDigits:0,maximumFractionDigits:0});return r(this).data("ci_show_symbol")||(l=l.replace("$","")),r(this)._CIOriginalVal(l)}return r(this)._CIOriginalVal(h)}else if(r(this).data("_percentInput"))if(arguments.length===0){var g=r(this)._CIOriginalVal();if(g=="")return"";var m=parseFloat(g.replace(/[^0-9.]/g,""));return isNaN(m)?"":m}else{h=String(h).replace(/[^0-9.]/g,"");var v=h.split(".");return v.length>2&&(h=v[0]+"."+v.slice(1).join("")),r(this)._CIOriginalVal(h)}else return arguments.length===0?r(this)._CIOriginalVal():r(this)._CIOriginalVal(h)}),this.data("_currencyInput")?this:(this.data("_currencyInput",!0),this.on("focus",function(){r(this).select()}),this.on("input",function(h){var g=this.selectionStart,m=r(this)._CIOriginalVal(),l=m.length;r(this).val(m);var v=r(this)._CIOriginalVal().length;v>l?g+=v-l:v2&&(m=l[0]+"."+l.slice(1).join("")),r(this)._CIOriginalVal(m);var v=m.length;v0){var h=u/s*100;this.$downPaymentPercent._CIOriginalVal(h.toFixed(1))}},syncDownPaymentFromPercent:function(){var s=this.$homePrice.val(),u=this.$downPaymentPercent.val();if(s&&s>0&&u!==""&&u>=0){var h=Math.round(s*u/100);this.$downPayment.val(h)}},calculate:function(){var s=this.$homePrice.val()||0,u=this.$downPayment.val()||0,h=parseInt(this.$loanTerm.val(),10),g=this.$interestRate.val()||0,m=s-u;m<0&&(m=0);var l=g/100/12,v=h*12,b=0,t=0;if(m>0&&l>0&&v>0){var e=Math.pow(1+l,v);b=m*(l*e)/(e-1),t=b*v-m}else m>0&&l===0&&(b=m/v,t=0);this.$monthlyPayment.text(this.formatCurrencyDisplay(b)),this.$principalInterest.text(this.formatCurrencyDisplay(b)),this.$loanAmount.text(this.formatCurrencyDisplay(m)),this.$totalInterest.text(this.formatCurrencyDisplay(t))}};r(document).ready(function(){n.init()})})(jQuery);(function(r){r(function(){})})(jQuery); diff --git a/wp-content/themes/homeproz/template-parts/property/property-filters.js b/wp-content/themes/homeproz/template-parts/property/property-filters.js index eaa46cc5..2cdcead0 100755 --- a/wp-content/themes/homeproz/template-parts/property/property-filters.js +++ b/wp-content/themes/homeproz/template-parts/property/property-filters.js @@ -706,7 +706,7 @@ }, /** - * Handle marker click - center map on pin, highlight card + * Handle marker click - scroll to card if exists, otherwise pan map */ onMarkerClick: function(propertyId) { var self = this; @@ -734,17 +734,32 @@ this.setMarkerColor(propertyId, 'amber'); this.setMarkerZIndex(propertyId, 10000); // Amber on top - // Immediately highlight card if visible (no scroll) + // Check if card exists in the infinite scroll area var $card = $('#property-' + propertyId); if ($card.length) { + // Card exists - scroll to it and highlight, don't pan map $card.addClass('property-card-highlighted'); + + // Set flag to ignore any pending map events + this.isCardScroll = true; + + // Smooth scroll to card + $('html, body').animate({ + scrollTop: $card.offset().top - 120 + }, 300, function() { + // Clear flag after scroll animation completes + setTimeout(function() { + self.isCardScroll = false; + }, 100); + }); + } else { + // Card not in view - pan map to load new results + // Set flag so updateFromMap knows not to clear selection + this.isPinClickPan = true; + + // Pan map to center on clicked pin (this triggers updateFromMap) + this.map.panTo([markerInfo.lat, markerInfo.lng]); } - - // Set flag so updateFromMap knows not to clear selection - this.isPinClickPan = true; - - // Pan map to center on clicked pin (this triggers updateFromMap) - this.map.panTo([markerInfo.lat, markerInfo.lng]); }, /** @@ -1341,6 +1356,11 @@ * Called by PropertyMap when map moves/zooms */ updateFromMap: function(bounds, center) { + // If we're in the middle of scrolling to a card, ignore this map event + if (PropertyMap.isCardScroll) { + return; + } + this.mapBounds = bounds; this.mapCenter = center; this.isMapUpdate = true; @@ -1355,8 +1375,9 @@ this.$results.html('
    '); // Reset infinite scroll state before loading new content + // Skip scroll adjustment if this is a pin-triggered pan (we'll scroll to card later) if (InfiniteScrollState.isEnabled) { - InfiniteScroll.reset(); + InfiniteScroll.reset(PropertyMap.isPinClickPan); } // Block scroll state until user actually scrolls @@ -2327,11 +2348,16 @@ /** * Reset (called on filter change) + * @param {boolean} skipScroll - If true, don't adjust scroll position */ - reset: function() { + reset: function(skipScroll) { InfiniteScrollState.pages = {}; InfiniteScrollState.pendingPage = null; + if (skipScroll) { + return; + } + // Scroll to bottom edge of .property-filters - bottom margin + masthead height var $filters = $('.property-filters').first(); var $masthead = $('#masthead');