f2a9b28ac2
MLS Query Changes: - Use exact city/postal_code matching instead of radius search - Fixes city filter returning 1700+ results instead of 97 for Ramsey Cluster Endpoint: - Parse "City, SS" format to extract city name before querying - Fixes pins not showing when city filter applied Property Filters JS: - Always fit map bounds when filter changes (not just on no intersection) - Fit bounds on initial page load when URL has filters - Show temporary hover pin when marker is clustered or outside viewport - Uses markerCluster.getVisibleParent() to detect clustered markers Property Results: - Add zip code parameter handling for URL filters 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2 lines
54 KiB
JavaScript
2 lines
54 KiB
JavaScript
(function(r){var x=r(".menu-toggle"),n=r(".mobile-navigation");x.length&&(x.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")&&(x.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&&(x.attr("aria-expanded","false"),n.removeClass("is-open"),r("body").removeClass("mobile-menu-open"))}))})(jQuery);(function(r){var x=6e3,n=1450,s=1e3,l=[],h=0,b=null,y=!1,c=!1,f=null;function m(){if(r(".Home_Page").length&&(f=r(".hero-split-image"),!!f.length)){var p=f.data("gallery-images");!p||!p.length||(l=p,t(),r(window).on("resize",u(t,150)))}}function t(){var p=r(window).width();p>=n?y||e():y&&i()}function e(){y=!0,c||(a(),c=!0),b=setInterval(o,x)}function i(){y=!1,b&&(clearInterval(b),b=null)}function a(){r.each(l,function(p,d){var g=new Image;g.src=d})}function o(){h=(h+1)%l.length;var p=l[h],d=r('<div class="hero-split-image-overlay"></div>');d.css({position:"absolute",top:0,left:0,right:0,bottom:0,"background-image":"url("+p+")","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}),f.css("position","relative"),f.append(d),d[0].offsetHeight,d.css({opacity:1,transform:"scale(1)"}),setTimeout(function(){f.css("background-image","url("+p+")"),d.remove()},s)}function u(p,d){var g;return function(){var P=this,v=arguments;clearTimeout(g),g=setTimeout(function(){p.apply(P,v)},d)}}r(document).ready(m)})(jQuery);(function(r){var x=2,n=null,s=!1;function l(){var f=r(".hero-location-search");f.length&&(y(),f.each(function(){h(r(this))}))}function h(f){var m=f.find(".hero-location-input"),t=f.find('input[name="city"]'),e=f.find('input[name="zip"]'),i=f.find(".hero-geolocation-btn"),a=r('<span class="hero-location-ghost"></span>');m.after(a),b(m,a);var o=null;function u(v){if(!n||v.length<x)return null;var I=v.toLowerCase(),w=/^\d/.test(v);if(w)for(var C=0;C<n.zipcodes.length;C++){var _=n.zipcodes[C];if(_.label.indexOf(v)===0)return _}else for(var k=0;k<n.cities.length;k++){var T=n.cities[k];if(T.label.toLowerCase().indexOf(I)===0)return T}return null}function p(){var v=m.val();if(o=u(v),o&&v.length>=x){var I=v,w=o.label.substring(I.length),C='<span class="ghost-typed">'+c(I)+'</span><span class="ghost-completion">'+c(w)+"</span>";a.html(C).show()}else a.empty().hide(),o=null}function d(){return o?(m.val(o.label),o.type==="city"?(t.val(o.label),e.val("")):(e.val(o.value),t.val("")),a.empty().hide(),o=null,!0):!1}function g(){var v=m.val().trim();if(t.val()||e.val())return!0;var I=P(v);if(I)return m.val(I.label),I.type==="city"?(t.val(I.label),e.val("")):(e.val(I.value),t.val("")),!0;if(o)return m.val(o.label),o.type==="city"?(t.val(o.label),e.val("")):(e.val(o.value),t.val("")),!0;var w=u(v);return w?(m.val(w.label),w.type==="city"?(t.val(w.label),e.val("")):(e.val(w.value),t.val("")),!0):!1}function P(v){if(!n||!v)return null;for(var I=v.toLowerCase(),w=0;w<n.zipcodes.length;w++)if(n.zipcodes[w].label===v)return n.zipcodes[w];for(var C=0;C<n.cities.length;C++)if(n.cities[C].label.toLowerCase()===I)return n.cities[C];return null}m.on("input",function(){t.val(""),e.val(""),p()}),m.on("keydown",function(v){v.keyCode===9&&o&&(v.preventDefault(),d(),m.blur().focus())}),m.on("keydown",function(v){v.keyCode===13&&g()}),m.on("blur",function(){o&&d(),a.hide()}),m.on("focus",function(){b(m,a),p()}),f.on("submit",function(v){var I=g(),w=m.val().trim();if(!I&&w==="")return t.prop("disabled",!0),e.prop("disabled",!0),!0;if(!I&&w!=="")return v.preventDefault(),m.addClass("has-error"),setTimeout(function(){m.removeClass("has-error")},1e3),!1;t.val()?e.prop("disabled",!0):e.val()&&t.prop("disabled",!0)}),i.hide(),r(window).on("resize",function(){b(m,a)})}function b(f,m){var t=window.getComputedStyle(f.get(0));m.css({position:"absolute",top:f.position().top+"px",left:f.position().left+"px",width:f.outerWidth()+"px",height:f.outerHeight()+"px",padding:t.padding,font:t.font,"line-height":t.lineHeight,"pointer-events":"none",overflow:"hidden","white-space":"nowrap",display:"flex","align-items":"center","box-sizing":"border-box"})}function y(f){if(!n){if(s){var m=setInterval(function(){n&&clearInterval(m)},100);return}s=!0,r.ajax({url:homeprozLocations.ajaxUrl,type:"GET",data:{action:"homeproz_get_locations"},dataType:"json",success:function(t){t.success&&t.data&&(n=t.data)},complete:function(){s=!1}})}}function c(f){var m=document.createElement("div");return m.textContent=f,m.innerHTML}r(document).ready(l)})(jQuery);(function(r){if(r("body").hasClass("Home_Page")){var x={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(),l=s.length-1;l>0;l--){var h=Math.floor(Math.random()*(l+1)),b=s[l];s[l]=s[h],s[h]=b}return s},renderListings:function(){if(!this.listings||this.listings.length===0){this.grid.hide(),this.emptyMessage.show();return}for(var n=[],s=[],l=0;l<this.listings.length;l++)this.listings[l].is_homeproz?n.push(this.listings[l]):s.push(this.listings[l]);n=this.shuffleArray(n),s=this.shuffleArray(s);var h=n.slice(0,3);if(h.length<3){var b=3-h.length;h=h.concat(s.slice(0,b))}for(var y="",l=0;l<h.length;l++)y+=this.buildPropertyCard(h[l]);this.grid.html(y),this.grid.show(),this.emptyMessage.hide()},buildPropertyCard:function(n){var s=n.bedrooms===1?"Bed":"Beds",l=n.bathrooms===1?"Bath":"Baths",h="";return(n.bedrooms||n.bathrooms||n.sqft)&&(h='<ul class="property-card-specs">',n.bedrooms&&(h+='<li class="spec-item"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M3 7v11h18V7M3 7V4a1 1 0 0 1 1-1h16a1 1 0 0 1 1 1v3M3 7h18M7 11h4v4H7zM14 11h3"/></svg><span>'+n.bedrooms+" "+s+"</span></li>"),n.bathrooms&&(h+='<li class="spec-item"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M4 12h16M4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7M4 12V6a2 2 0 0 1 2-2h3v2a1 1 0 0 0 1 1h1a1 1 0 0 0 1-1V4"/></svg><span>'+n.bathrooms+" "+l+"</span></li>"),n.sqft&&(h+='<li class="spec-item"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M3 9h18M9 3v18"/></svg><span>'+n.sqft.toLocaleString()+" sqft</span></li>"),h+="</ul>"),'<article class="property-card card mls-property" data-listing-key="'+this.escapeHtml(n.listing_key)+'"><a href="'+this.escapeHtml(n.url)+'" class="property-card-link-overlay" aria-hidden="true" tabindex="-1"></a><div class="property-card-image has-image" style="background-image: url('+this.escapeHtml(n.image_url)+')"><span class="property-card-badge badge badge-active">Active</span></div><div class="property-card-content"><div class="property-card-price">'+this.escapeHtml(n.price_formatted)+'</div><h3 class="property-card-title">'+this.escapeHtml(n.address)+"</h3>"+h+'<span class="property-card-link">View Details<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M5 12h14M12 5l7 7-7 7"/></svg></span></div></article>'},escapeHtml:function(n){if(!n)return"";var s=document.createElement("div");return s.textContent=n,s.innerHTML}};r(document).ready(function(){x.init()})}})(jQuery);(function(r){var x={PREFIX:"HOMEPROZ_AJAX_",EXPIRY_MS:3e5,init:function(){this.cleanExpired()},cleanExpired:function(){try{for(var t=Date.now(),e=[],i=0;i<sessionStorage.length;i++){var a=sessionStorage.key(i);if(a&&a.indexOf(this.PREFIX)===0)try{var o=JSON.parse(sessionStorage.getItem(a));t-o.time>this.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;o<i.length;o++){var u=i.charCodeAt(o);a=(a<<5)-a+u,a=a&a}return this.PREFIX+Math.abs(a).toString(36)},get:function(t){try{var e=this.getKey(t),i=sessionStorage.getItem(e);if(!i)return null;var a=JSON.parse(i),o=Date.now();return o-a.time>this.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{}}};x.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 p=this.requestIds[t];this.timeouts[t]=setTimeout(function(){u.timeouts[t]=null;var d=e(p);d&&d.then&&(u.pending[t]=d,d.done(function(g){p===u.requestIds[t]&&i(g,p)}),d.fail(function(g,P,v){o&&p===u.requestIds[t]&&P!=="abort"&&o(g,P,v)}),d.always(function(){u.pending[t]===d&&(u.pending[t]=null),a&&p===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,initialCenter:[45,-93.5],initialZoom:7,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:'© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>'}).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:"<div><span>"+o+"</span></div>",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],p={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 d=x.get(p);if(d&&d.success){var g=d.data;switch(this.currentMode=g.type,g.type){case"density":this.renderDensity(g.dots);break;case"clusters":this.renderClusters(g.clusters);break;case"markers":this.renderMarkers(g.markers);break}return}n.queue("clusters",function(P){return r.ajax({url:homeprozMapData.clusterEndpoint,type:"GET",data:p})},function(P,v){if(P.success){x.set(p,P);var I=P.data;switch(t.currentMode=I.type,I.type){case"density":t.renderDensity(I.dots);break;case"clusters":t.renderClusters(I.clusters);break;case"markers":t.renderMarkers(I.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),p=L.divIcon({html:'<div class="density-dot" style="background-color: '+o+"; width: "+u+"px; height: "+u+'px;"></div>',className:"density-dot-container",iconSize:[u,u],iconAnchor:[u/2,u/2]}),d=L.marker([a.lat,a.lng],{icon:p});d.on("click",function(){e.map.setView([a.lat,a.lng],e.map.getZoom()+2)}),d.bindTooltip(a.count+" properties",{className:"density-tooltip"}),e.densityLayer.addLayer(d)})},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:"<div><span>"+i.count+"</span></div>",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 p="$"+e.formatNumber(i.min_price);i.max_price!==i.min_price&&(p+=" - $"+e.formatNumber(i.max_price)),u.bindTooltip(i.count+" properties<br>"+p,{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 p=o.id===e,d=p?"amber":"red",g=L.marker([o.lat,o.lng],{icon:i.createIcon(d),zIndexOffset:p?1e4:i.baseZIndex+u});g.propertyId=o.id,g.defaultZIndex=i.baseZIndex+u,i.markerData[o.id]={lat:o.lat,lng:o.lng,price:o.price,address:o.address},g.bindPopup('<div class="map-popup"><strong>'+o.price+"</strong><br><span>"+o.address+'</span><br><a href="'+o.url+'">View Details</a></div>'),g.on("click",function(P){i.onMarkerClick(o.id)}),a.push(g),i.markers[o.id]=g}}),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()},resetToInitialPosition:function(){this.map&&this.map.setView(this.initialCenter,this.initialZoom)},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:'<div class="marker-pin"></div>',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){t.hoveredPropertyId=i;var a=t.markers[i],o=!1;if(a){var u=a.getLatLng(),p=t.map.getBounds().contains(u),d=!1;if(t.markerCluster&&t.markerCluster.hasLayer(a)){var g=t.markerCluster.getVisibleParent(a);d=g&&g!==a}!d&&p?(t.setMarkerColor(i,"blue"),t.setMarkerZIndex(i,9e3)):o=!0}else o=!0;if(o){var P=e.data("lat"),v=e.data("lng");P&&v&&t.map&&(t.temporaryHoverMarker&&t.map.removeLayer(t.temporaryHoverMarker),t.temporaryHoverMarker=L.marker([P,v],{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)))})}},l={$mainFilter:null,$stickyFilter:null,$mainForm:null,$stickyForm:null,$resetButton:null,$masthead:null,scrollTimeout: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.$resetButton=this.$mainFilter.find(".filter-item-button .btn"),this.$masthead=r("#masthead"),!(!this.$mainFilter.length||!this.$stickyFilter.length||!this.$resetButton.length)&&(this.setupScrollHandler(),this.bindEvents(),this.checkVisibility()))},setupScrollHandler:function(){var t=this;r(window).on("scroll.stickyFilters",function(){clearTimeout(t.scrollTimeout),t.scrollTimeout=setTimeout(function(){t.checkVisibility()},50)})},checkVisibility:function(){var t=this.$masthead.length?this.$masthead.outerHeight():0,e=t+10,i=this.$resetButton[0].getBoundingClientRect();i.bottom<e?this.showStickyFilter():this.hideStickyFilter()},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[name="city"]').on("change",function(){r(this).val()&&(t.$stickyForm.find('input[name="zip"]').val(""),t.$mainForm.find('input[name="zip"]').val(""))}),this.$stickyForm.find('input[name="zip"]').on("input",function(){r(this).val()&&(t.$stickyForm.find('select[name="city"]').val(""),t.$mainForm.find('select[name="city"]').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,isResetTriggered:!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[name="city"]').on("change",function(){r(this).val()&&(t.$form.find('input[name="zip"]').val(""),l&&l.$stickyForm&&l.$stickyForm.find('input[name="zip"]').val(""))}),this.$form.find('input[name="zip"]').on("input",function(){r(this).val()&&(t.$form.find('select[name="city"]').val(""),l&&l.$stickyForm&&l.$stickyForm.find('select[name="city"]').val(""))}),this.$form.find('input[name="zip"]').on("change",function(){t.clearPinSelection(),t.onFilterChange()}),this.$form.find("select").on("change",function(){t.clearPinSelection(),t.onFilterChange()}),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=this.getStateFromHash();t&&(this.$form.find("select").each(function(){var e=r(this).attr("name");t[e]&&r(this).val(t[e])}),this.$form.find('input[type="text"]').each(function(){var e=r(this).attr("name");t[e]&&r(this).val(t[e])}),(t.lat!==null||t.page>1)&&(this.pendingRestoreState=t))},restoreState:function(){var t=this.pendingRestoreState;if(t){this.pendingRestoreState=null;var e=this.getFormData();if(s.currentFilters={status:"Active",property_type:e.property_type||"",city:e.city||"",min_price:e.min_price||"",max_price:e.max_price||"",min_beds:e.beds||""},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 i=s.map.getBounds(),a=s.map.getCenter();this.mapBounds=[i.getSouthWest().lat,i.getSouthWest().lng,i.getNorthEast().lat,i.getNorthEast().lng],this.mapCenter=[a.lat,a.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();c.isRestoring=!0;for(var o=[],u=1;u<=t+1;u++)o.push(u);var p={action:"homeproz_filter_properties",nonce:homeprozAjax.nonce,property_type:a.property_type,city:a.city,zip:a.zip,min_price:a.min_price,max_price:a.max_price,beds:a.beds,cards_only:"true"};this.mapBounds&&(p.bounds=this.mapBounds),this.mapCenter&&(p.center=this.mapCenter);var d=[],g=[];if(o.forEach(function(v){var I=r.extend({},p,{paged:v}),w=x.get(I);w&&w.success&&w.data&&w.data.html?d.push({page:v,html:w.data.html,max_pages:w.data.max_pages||1}):g.push(v)}),g.length===0){this.renderBulkResults(d,t,e);return}this.$results.html('<div class="property-results-loading"><div class="spinner"></div></div>');var P=g.map(function(v){var I=r.extend({},p,{paged:v});return r.ajax({url:homeprozAjax.ajaxUrl,type:"POST",data:I}).then(function(w){var C={page:v,html:w.success?w.data.html:"",max_pages:w.success?w.data.max_pages:0};return w.success&&x.set(I,w),C})});r.when.apply(r,P).done(function(){var v=P.length===1?[arguments[0]]:Array.prototype.slice.call(arguments),I=d.concat(v);i.renderBulkResults(I,t,e)}).fail(function(){c.isRestoring=!1,i.filterProperties(1,!1)})},renderBulkResults:function(t,e,i){t.sort(function(u,p){return u.page-p.page});var a=t[0]?t[0].max_pages:1,o='<div class="properties-meta"><p class="properties-count">Loading...</p></div>';o+='<div id="property-results-grid" class="properties-grid">',t.forEach(function(u){u.html&&u.page<=a&&(o+='<div class="infinite-scroll-page" data-page="'+u.page+'" data-state="populated">',o+=u.html,o+="</div>")}),o+="</div>",this.$results.html(o),c.currentPage=Math.min(e+1,a),c.maxPages=a,c.pages={},t.forEach(function(u){u.page<=a&&(c.pages[u.page]={state:"populated"})}),i>0&&window.scrollTo({top:i,behavior:"instant"}),c.isRestoring=!1,r(window).trigger("scroll"),typeof m<"u"&&m.process()},updateFromMap:function(t,e){s.isCardScroll||(this.mapBounds=t,this.mapCenter=e,this.isMapUpdate=!0,s.isPinClickPan||this.clearPinSelection(),this.$results.html('<div class="property-results-loading"><div class="spinner"></div></div>'),c.isEnabled&&f.reset(s.isPinClickPan),c.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('<div class="property-results-loading"><div class="spinner"></div></div>');var o={action:"homeproz_filter_properties",nonce:homeprozAjax.nonce,property_type:a.property_type,city:a.city,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;var p=this.isResetTriggered;this.isResetTriggered=!1,n.queue("properties",function(d){return r.ajax({url:homeprozAjax.ajaxUrl,type:"POST",data:o})},function(d,g){d.success&&(i.$results.html(d.data.html),i.isFirstLoad=!1,p&&d.data.found_posts===0&&s.map&&s.resetToInitialPosition(),d.data.filters&&!u&&s.updateFilters(d.data.filters),typeof y<"u"&&y.calculate(),f.destroy(),setTimeout(function(){f.init()},100),e&&i.updateUrl(a,t),s.selectedPropertyId?setTimeout(function(){var P=r("#property-"+s.selectedPropertyId);P.length&&(window.scrollTo({top:P.offset().top-120,behavior:"instant"}),P.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('<div class="no-properties"><h3>Error</h3><p>Something went wrong. Please try again.</p></div>')})},getFormData:function(){return{property_type:this.$form.find('[name="property_type"]').val()||"",city:this.$form.find('[name="city"]').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=[];for(var a in t)t[a]&&i.push(a+"="+encodeURIComponent(t[a]));if(e>1&&i.push("page="+e),!this._scrollBlocked){var o=window.pageYOffset||document.documentElement.scrollTop;o>0&&i.push("scroll="+Math.round(o))}if(s.map){var u=s.map.getCenter(),p=s.map.getZoom();i.push("lat="+u.lat.toFixed(6)),i.push("lng="+u.lng.toFixed(6)),i.push("zoom="+p)}var d=homeprozAjax.archiveUrl+(i.length?"#"+i.join("&"):"");history.replaceState(null,"",d)},updateUrlState:function(){var t=this;clearTimeout(this._urlUpdateTimeout),this._urlUpdateTimeout=setTimeout(function(){var e=c.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]]=decodeURIComponent(a[1]))}),{property_type:e.property_type||"",city:e.city||"",zip:e.zip||"",min_price:e.min_price||"",max_price:e.max_price||"",beds:e.beds||"",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.$form.find('input[name="zip"]').val(""),l&&l.$stickyForm&&(l.$stickyForm.find("select").val(""),l.$stickyForm.find('input[name="zip"]').val("")),this.isResetTriggered=!0,this.onFilterChange()},onFilterChange:function(){var t=this.getFormData();if(s.map&&(s.currentFilters={status:"Active",property_type:t.property_type||"",city:t.city||"",min_price:t.min_price||"",max_price:t.max_price||"",min_beds:t.beds||""}),!s.map){this.filterProperties(1);return}r.ajax({url:homeprozAjax.ajaxUrl,type:"GET",data:{action:"homeproz_get_filter_bounds",property_type:t.property_type,city:t.city,min_price:t.min_price,max_price:t.max_price,min_beds:t.beds},success:function(e){if(e.success&&e.data){var i=e.data,a=(i.ne_lat-i.sw_lat)*.1,o=(i.ne_lng-i.sw_lng)*.1,u=L.latLngBounds([i.sw_lat-a,i.sw_lng-o],[i.ne_lat+a,i.ne_lng+o]);s.map.fitBounds(u)}else s.loadClusters()},error:function(){s.loadClusters()}})}},b={breakpoint:1024,isMapView:!0,isAboveBreakpoint:!0,mapInitialized:!1,init:function(){var t=this;if(typeof homeprozMapData<"u"&&(this.isMapView=homeprozMapData.isMapView!==!1),this.isAboveBreakpoint=window.innerWidth>=this.breakpoint,this.isAboveBreakpoint&&this.isMapView&&typeof homeprozMapData<"u"){var e=h.getFormData(),i={status:"Active",property_type:e.property_type||"",city:e.city||"",min_price:e.min_price||"",max_price:e.max_price||"",min_beds:e.beds||""};s.init(i),this.mapInitialized=!0,h.pendingRestoreState?h.restoreState():(e.city||e.zip||e.property_type||e.min_price||e.max_price||e.beds)&&h.onFilterChange()}var a;r(window).on("resize",function(){clearTimeout(a),a=setTimeout(function(){t.handleResize()},150)})},handleResize:function(){var t=this.isAboveBreakpoint;this.isAboveBreakpoint=window.innerWidth>=this.breakpoint;var e=r(".property-archive-main");if(t&&!this.isAboveBreakpoint&&c.isEnabled&&f.destroy(),!t&&this.isAboveBreakpoint){if(this.isMapView){if(e.removeClass("is-grid-view").addClass("is-map-view"),!this.mapInitialized&&typeof homeprozMapData<"u"){var i=h.getFormData(),a={status:"Active",property_type:i.property_type||"",city:i.city||"",min_price:i.min_price||"",max_price:i.max_price||"",min_beds:i.beds||""};s.init(a),this.mapInitialized=!0,h.pendingRestoreState&&h.restoreState()}else s.map&&setTimeout(function(){s.map.invalidateSize()},100);setTimeout(function(){f.init()},200)}else e.removeClass("is-map-view").addClass("is-grid-view");typeof y<"u"&&setTimeout(function(){y.calculate()},150)}},setMapView:function(t){this.isMapView=t}},y={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<this.breakpoint){this.clearProperties();return}var t=r(".property-archive-main"),e=t.find("> .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":""})}},c={pages:{},totalPages:0,totalPosts:0,currentPage:1,pendingPage:null,isEnabled:!1,isRestoring:!1,cardsPerPage:12},f={$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,"");c.totalPosts=parseInt(e)||0,c.totalPages=Math.ceil(c.totalPosts/c.cardsPerPage),!(c.totalPages<=1)&&(c.pages={},c.pendingPage=null,this.wrapInitialCards(),this.bindScrollHandler(),c.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('<div class="infinite-scroll-page" data-page="1" data-state="populated"></div>');t.wrapAll(e),c.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||!c.isEnabled)&&!c.isRestoring){var t=c.totalPages,e=this.calculateCurrentPage();e>t-2&&(e=t-2),e<1&&(e=1),c.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),p=parseInt(u.data("page")),d=u.find(".property-card").first();if(d.length){var g=d[0].getBoundingClientRect(),P=g.top+t;if(P<=e){var v=e-P;v<o&&(o=v,a=p)}}}),a},getReferenceCardDimensions:function(){var t=this.$grid.find(".property-card:not(.is-placeholder)").first();if(t.length){var e=t[0].getBoundingClientRect();return{width:e.width,height:e.height}}return{width:400,height:500}},ensurePagesExist:function(t){var e=this;t.forEach(function(i){var a=e.$grid.find('.infinite-scroll-page[data-page="'+i+'"]');if(!a.length){var o=r('<div class="infinite-scroll-page" data-page="'+i+'" data-state="empty"></div>');e.insertPageInOrder(o,i),c.pages[i]||(c.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(e<o)return r(this).before(t),a=!0,!1}),a||this.$grid.append(t)},loadFirstUnloaded:function(t){if(c.pendingPage===null)for(var e=this,i=0;i<t.length;i++){var a=t[i],o=c.pages[a];if(!o||o.state==="empty"){e.loadPage(a);return}}},syncPageStates:function(t,e){var i={};t.forEach(function(a){i[a]=!0}),this.$grid.find(".infinite-scroll-page").each(function(){var a=r(this),o=parseInt(a.data("page")),u=c.pages[o],p=a.attr("data-state");i[o]?p==="placeholder"&&(a.find(".property-card.is-placeholder").each(function(){var d=r(this),g=d.data("stored-html");g&&(d.html(g),d.css({width:"",height:""}),d.removeClass("is-placeholder"),d.removeData("stored-html"))}),a.attr("data-state","populated"),u&&(u.state="populated"),typeof m<"u"&&m.process()):p==="populated"&&u&&(a.find(".property-card:not(.is-placeholder)").each(function(){var d=r(this);d.data("stored-html",d.html()),d.css({width:e.width+"px",height:e.height+"px"}),d.html(""),d.addClass("is-placeholder")}),a.attr("data-state","placeholder"),u.state="placeholder")})},loadPage:function(t){var e=this,i=h.getFormData(),a={action:"homeproz_filter_properties",nonce:homeprozAjax.nonce,property_type:i.property_type,city:i.city,zip:i.zip,min_price:i.min_price,max_price:i.max_price,beds:i.beds,paged:t,cards_only:"true"};h.mapBounds&&(a.bounds=h.mapBounds),h.mapCenter&&(a.center=h.mapCenter);var o=x.get(a);if(o&&o.success&&o.data&&o.data.html){c.pages[t]||(c.pages[t]={}),c.pages[t].state="populated";var u=e.$grid.find('.infinite-scroll-page[data-page="'+t+'"]');u.length&&(u.html(o.data.html),u.attr("data-state","populated"),typeof m<"u"&&m.process()),e.syncPages();return}c.pendingPage=t,r.ajax({url:homeprozAjax.ajaxUrl,type:"POST",data:a,success:function(p){if(p.success&&p.data.html){x.set(a,p),c.pages[t]||(c.pages[t]={}),c.pages[t].state="populated";var d=e.$grid.find('.infinite-scroll-page[data-page="'+t+'"]');d.length&&(d.html(p.data.html),d.attr("data-state","populated"),typeof m<"u"&&m.process())}},complete:function(){c.pendingPage=null,e.syncPages()}})},reset:function(t){if(c.pages={},c.pendingPage=null,!t){var e=r(".property-filters").first(),i=r("#masthead");if(e.length){var a=i.length?i.outerHeight():0,o=e.offset().top+e.outerHeight()-a,u=window.scrollY||window.pageYOffset;u>o&&window.scrollTo({top:o,behavior:"instant"})}}},destroy:function(){c.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()),c.pages={},c.pendingPage=null,c.isEnabled=!1)}},m={_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=[],p=[];return t.each(function(){var d=this.getBoundingClientRect(),g=d.top+e,P=g+d.height;if(P>=i&&g<=a)u.push({el:this,position:g});else{var v;g>a?v=g-a:v=i-P,v<=o&&p.push({el:this,distance:v})}}),u.sort(function(d,g){return d.position-g.position}),p.sort(function(d,g){return d.distance-g.distance}),u.length?u[0].el:p.length?p[0].el:null},_processNext:function(){for(var t=this;this._activeLoads<this.MAX_PARALLEL;){var e=this._getNextElement();if(!e){this._activeLoads===0&&(this._isRunning=!1);return}var i=r(e),a=i.data("bg");i.removeAttr("data-bg").removeClass("is-loading"),this._activeLoads++,function(o,u){var p=new Image;p.onload=function(){r.contains(document,o[0])&&(o.css("background-image",'url("'+u+'")'),o.addClass("is-loaded")),t._activeLoads--,t._processNext()},p.onerror=function(){r.contains(document,o[0])&&o.addClass("is-loaded").removeClass("has-image"),t._activeLoads--,t._processNext()},p.src=u}(i,a)}}};r(function(){h.init(),b.init(),y.init(),m.init(),l.init(),setTimeout(function(){f.init()},300)})})(jQuery);(function(r){var x={$gallery:null,$lightbox:null,$mainImage:null,$mainImageContainer:null,$thumbnails:null,$thumbnailsContainer:null,$thumbnailsViewport:null,$playbackBtn:null,$prevBtn:null,$nextBtn:null,$lightboxImage:null,$lightboxImageContainer:null,$lightboxCounter:null,images:[],currentIndex:0,isPlaying:!0,isTransitioning:!1,autoplayInterval:null,autoplayDelay:5e3,fadeDuration:1e3,slideDuration:300,thumbnailsPerPage:5,thumbnailPage:0,swipeStartX:0,swipeStartY:0,swipeThreshold:50,isSwiping:!1,init:function(){if(this.$gallery=r(".property-gallery"),this.$lightbox=r("#property-lightbox"),!!this.$gallery.length){this.$mainImageContainer=this.$gallery.find(".gallery-main-image"),this.$mainImage=this.$mainImageContainer.find("img"),this.$thumbnailsContainer=this.$gallery.find(".gallery-thumbnails-container"),this.$thumbnailsViewport=this.$gallery.find(".gallery-thumbnails-viewport"),this.$thumbnails=this.$gallery.find(".gallery-thumbnail"),this.$playbackBtn=this.$gallery.find(".gallery-playback-btn"),this.$prevBtn=this.$gallery.find(".gallery-thumbnails-prev"),this.$nextBtn=this.$gallery.find(".gallery-thumbnails-next"),this.$lightboxImage=this.$lightbox.find(".lightbox-image"),this.$lightboxImageContainer=this.$lightbox.find(".lightbox-image-container"),this.$lightboxCounter=this.$lightbox.find(".lightbox-current");var n=r("#gallery-images-data");n.length&&(this.images=JSON.parse(n.text())),this.images.length!==0&&(this.calculateThumbnailsPerPage(),this.bindEvents(),this.bindSwipeEvents(),this.updateThumbnailNavigation(),this.setupThumbnailLoading(),this.preloadThumbnailPages(0,2),this.images.length>1&&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 l=parseInt(r(this).data("index"));n.stopAutoplay(),n.setMainImage(l,!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,l=n.changedTouches[0].clientY-this.swipeStartY;Math.abs(s)>Math.abs(l)&&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,l=n.changedTouches[0].clientY-this.swipeStartY;Math.abs(s)>Math.abs(l)&&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 l;n==="prev"?(l=this.currentIndex-1,l<0&&(l=this.images.length-1)):(l=this.currentIndex+1,l>=this.images.length&&(l=0)),this.isTransitioning=!0;var h=this.images[l],b=n==="next"?"100%":"-100%",y=n==="next"?"-100%":"100%",c=r('<img class="gallery-slide-image" />');c.attr("src",h.url),c.attr("alt",h.alt||"Property photo"),c.css({position:"absolute",top:0,left:0,width:"100%",height:"100%","object-fit":"cover",transform:"translateX("+b+")","z-index":2,"border-radius":"0.5rem"}),this.$mainImageContainer.css({position:"relative",overflow:"hidden"}),this.$mainImageContainer.append(c),this.$mainImage.css({transition:"transform "+this.slideDuration+"ms ease-out"}),c.css({transition:"transform "+this.slideDuration+"ms ease-out"}),c[0].offsetHeight,this.$mainImage.css("transform","translateX("+y+")"),c.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:""}),c.remove(),s.isTransitioning=!1},this.slideDuration),this.currentIndex=l,this.$thumbnails.removeClass("is-active"),this.$thumbnails.filter('[data-index="'+l+'"]').addClass("is-active"),this.scrollToThumbnail(l)}},setMainImage:function(n,s){var l=this;if(!(n<0||n>=this.images.length)&&!this.isTransitioning){var h=this.images[n];if(s){this.isTransitioning=!0;var b=r('<img class="gallery-fade-overlay" />');b.attr("src",h.url),b.attr("alt",h.alt||"Property photo"),b.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(b),b[0].offsetHeight,b.css({opacity:1,transform:"scale(1)"}),setTimeout(function(){l.$mainImage.attr("src",h.url),l.$mainImage.attr("alt",h.alt||"Property photo"),b.remove(),l.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),l=this.thumbnailPage*this.thumbnailsPerPage*s;n.css("transform","translateX(-"+l+"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<n-1&&(this.thumbnailPage++,this.scrollThumbnails(),this.preloadNextThumbnailPage())},openLightbox:function(n){this.currentIndex=n,this.updateLightboxImage(),this.$lightbox.attr("aria-hidden","false"),r("body").addClass("lightbox-open")},closeLightbox:function(){this.$lightbox.attr("aria-hidden","true"),r("body").removeClass("lightbox-open")},slideLightboxImage:function(n){var s=this;if(!(this.isTransitioning||this.images.length<=1)){var l;n==="prev"?(l=this.currentIndex-1,l<0&&(l=this.images.length-1)):(l=this.currentIndex+1,l>=this.images.length&&(l=0)),this.isTransitioning=!0;var h=this.images[l],b=n==="next"?"100%":"-100%",y=n==="next"?"-100%":"100%",c=r('<img class="lightbox-slide-image" />');c.attr("src",h.url),c.attr("alt",h.alt||"Property photo"),c.css({position:"absolute","max-width":"100%","max-height":"calc(100vh - 8rem)","object-fit":"contain",transform:"translateX("+b+")",left:"50%",top:"50%","margin-left":"-45vw","margin-top":"calc(-50vh + 4rem)"}),this.$lightboxImageContainer.css({position:"relative",overflow:"hidden"}),this.$lightboxImageContainer.append(c),this.$lightboxImage.css({transition:"transform "+this.slideDuration+"ms ease-out"}),c.css({transition:"transform "+this.slideDuration+"ms ease-out"}),c[0].offsetHeight,this.$lightboxImage.css("transform","translateX("+y+")"),c.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:""}),c.remove(),s.isTransitioning=!1,s.$lightboxCounter.text(l+1)},this.slideDuration),this.currentIndex=l}},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('<div class="thumbnail-spinner"><div class="spinner"></div></div>'),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 l=this,h=n*this.thumbnailsPerPage,b=Math.min((n+s)*this.thumbnailsPerPage,this.images.length),y=h;y<b;y++)(function(c){var f=l.$thumbnails.filter('[data-index="'+c+'"]'),m=f.find("img");if(m.removeAttr("loading"),!m[0].complete){var t=new Image;t.src=m.attr("src")}})(y)},preloadNextThumbnailPage:function(){var n=Math.ceil(this.images.length/this.thumbnailsPerPage),s=this.thumbnailPage+1;s<n&&this.preloadThumbnailPages(s,1)},preloadPrevThumbnailPage:function(){var n=this.thumbnailPage-1;n>=0&&this.preloadThumbnailPages(n,1)}};r(function(){x.init()})})(jQuery);(function(r){if(!r(".mortgage-calculator-main").length)return;let x=!1;r.fn.currencyInput=function(s=!0){return this.data("ci_show_symbol",s),x||(x=!0,r.fn._CIOriginalVal=r.fn.val,r.fn.val=function(h){if(r(this).data("_currencyInput"))if(arguments.length===0){var b=r(this)._CIOriginalVal();if(b=="")return"";var y=parseInt(b.replace(/[^0-9]/g,""));return y}else{if(h=String(h).replace(/[^0-9]/g,""),h!=""){var c=parseInt(h).toLocaleString("en-US",{style:"currency",currency:"USD",minimumFractionDigits:0,maximumFractionDigits:0});return r(this).data("ci_show_symbol")||(c=c.replace("$","")),r(this)._CIOriginalVal(c)}return r(this)._CIOriginalVal(h)}else if(r(this).data("_percentInput"))if(arguments.length===0){var b=r(this)._CIOriginalVal();if(b=="")return"";var y=parseFloat(b.replace(/[^0-9.]/g,""));return isNaN(y)?"":y}else{h=String(h).replace(/[^0-9.]/g,"");var f=h.split(".");return f.length>2&&(h=f[0]+"."+f.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 b=this.selectionStart,y=r(this)._CIOriginalVal(),c=y.length;r(this).val(y);var f=r(this)._CIOriginalVal().length;f>c?b+=f-c:f<c&&(b-=c-f),this.setSelectionRange(b,b),this.value.replace(/[^0-9]/g,"").length===1&&h.originalEvent&&h.originalEvent.inputType==="deleteContentBackward"&&r(this)._CIOriginalVal("")}),r(this).val(r(this)._CIOriginalVal()),this)},r.fn.percentInput=function(){return this.data("_percentInput")?this:(this.data("_percentInput",!0),this.on("focus",function(){r(this).select()}),this.on("input",function(s){var l=this.selectionStart,h=r(this)._CIOriginalVal(),b=h.length,y=h.replace(/[^0-9.]/g,""),c=y.split(".");c.length>2&&(y=c[0]+"."+c.slice(1).join("")),r(this)._CIOriginalVal(y);var f=y.length;f<b&&(l-=b-f),l<0&&(l=0),this.setSelectionRange(l,l)}),this)};var n={init:function(){this.$form=r("#mortgage-calculator-form"),this.$homePrice=r("#home-price"),this.$downPayment=r("#down-payment"),this.$downPaymentPercent=r("#down-payment-percent"),this.$loanTerm=r("#loan-term"),this.$interestRate=r("#interest-rate"),this.$monthlyPayment=r("#monthly-payment"),this.$principalInterest=r("#principal-interest"),this.$loanAmount=r("#loan-amount"),this.$totalInterest=r("#total-interest"),this.$homePrice.currencyInput(!1),this.$downPayment.currencyInput(!1),this.$downPaymentPercent.percentInput(),this.$interestRate.percentInput(),this.bindEvents(),this.calculate()},bindEvents:function(){var s=this;this.$homePrice.on("input",function(){s.syncDownPaymentFromPercent(),s.calculate()}),this.$downPayment.on("input",function(){s.syncDownPaymentPercent(),s.calculate()}),this.$downPaymentPercent.on("input",function(){s.syncDownPaymentFromPercent(),s.calculate()}),this.$interestRate.on("input",function(){s.calculate()}),this.$loanTerm.on("change",function(){s.calculate()}),this.$form.on("submit",function(l){l.preventDefault()})},formatCurrencyDisplay:function(s){return"$"+Math.round(s).toLocaleString("en-US")},syncDownPaymentPercent:function(){var s=this.$homePrice.val(),l=this.$downPayment.val();if(s&&s>0){var h=l/s*100;this.$downPaymentPercent._CIOriginalVal(h.toFixed(1))}},syncDownPaymentFromPercent:function(){var s=this.$homePrice.val(),l=this.$downPaymentPercent.val();if(s&&s>0&&l!==""&&l>=0){var h=Math.round(s*l/100);this.$downPayment.val(h)}},calculate:function(){var s=this.$homePrice.val()||0,l=this.$downPayment.val()||0,h=parseInt(this.$loanTerm.val(),10),b=this.$interestRate.val()||0,y=s-l;y<0&&(y=0);var c=b/100/12,f=h*12,m=0,t=0;if(y>0&&c>0&&f>0){var e=Math.pow(1+c,f);m=y*(c*e)/(e-1),t=m*f-y}else y>0&&c===0&&(m=y/f,t=0);this.$monthlyPayment.text(this.formatCurrencyDisplay(m)),this.$principalInterest.text(this.formatCurrencyDisplay(m)),this.$loanAmount.text(this.formatCurrencyDisplay(y)),this.$totalInterest.text(this.formatCurrencyDisplay(t))}};r(document).ready(function(){n.init()})})(jQuery);(function(r){r(function(){})})(jQuery);
|