1<!DOCTYPE html> <html lang="en"> <head><meta name="description" content=""> <meta charset="utf-8"> <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="msvalidate.01" content="52D8CD5F9EA2B1031F2D2472023A5D34"> <title>MyPortal | Collections</title> <link rel="preconnect" href="https://www.google.com"> <link rel="preconnect" href="https://www.gstatic.com" crossorigin> <link rel="dns-prefetch" href="https://cdn1.brivityidx.com">
1<script> 2 var head = document.getElementsByTagName('head')[0] 3 var insertBefore = head.insertBefore; 4 head.insertBefore = function (newElement, referenceElement) { 5 // intercept style elements for IEs 6 if (newElement.tagName.toLowerCase() === 'style' 7 && newElement.styleSheet 8 && newElement.styleSheet.cssText 9 && newElement.styleSheet.cssText.replace('\r\n', '').indexOf('.gm-style') === 0) { 10 return; 11 } 12 // intercept style elements for other browsers 13 if (newElement.tagName.toLowerCase() === 'style' 14 && newElement.innerHTML 15 && newElement.innerHTML.replace('\r\n', '').indexOf('.gm-style') === 0) { 16 return; 17 } 18 insertBefore.call(head, newElement, referenceElement); 19 }; 20 </script>
20 <link rel="shortcut icon" href="https://cdn1.brivityidx.com/assets/images/uploads/107878/Darin7278_fav28.png" type="image/x-icon"> <link href="https://cdn1.brivityidx.com/assets/css/build-site.min.css?ck=" rel="stylesheet"> <link href="https://cdn1.brivityidx.com/assets/css/build-chatbot-v1.min.css?ck=" rel="stylesheet" media="print" onload="this.media='all'"><noscript><link href="https://cdn1.brivityidx.com/assets/css/build-chatbot-v1.min.css?ck=" rel="stylesheet"></noscript> <link rel="canonical" href="https://www.stoneandstory.com/myportal/collections">
20<script> 21 function deferScriptOnLoad(url, sleep = 0) { 22 window.addEventListener('load', function () { 23 deferScript(url, sleep); 24 }); 25 } 26 function deferScript(url, sleep = 0) { 27 if (sleep > 0) { 28 setTimeout(() => { 29 deferScript(url); 30 }, sleep); 31 return; 32 } 33 let s = document.createElement('script'); 34 s.type = 'text/javascript'; 35 s.async = true; 36 s.src = url; 37 let x = document.getElementsByTagName('head')[0]; 38 x.appendChild(s); 39 } 40 41 /* PLACE_COMPONENTS_LOADER_START */ 42 window.sitebuilderPlaceComponents = (function () { 43 var DEFAULT_URL = 'https://mobile-component-services-library-dev.brivity.com/web-components.min.js?ck=1'; 44 var BUNDLE_URLS = { default: DEFAULT_URL }; 45 var loadPromises = {}; 46 var LOAD_TIMEOUT_MS = 10000; 47 48 function urlForTag(tagName) { 49 return BUNDLE_URLS[tagName] || BUNDLE_URLS.default; 50 } 51 52 function ensureLoaded(tagName) { 53 var url = urlForTag(tagName); 54 if (loadPromises[url]) { 55 return loadPromises[url]; 56 } 57 loadPromises[url] = new Promise(function (resolve, reject) { 58 var settled = false; 59 var timer = setTimeout(function () { 60 if (settled) return; 61 settled = true; 62 reject(new Error('web-components load timeout')); 63 }, LOAD_TIMEOUT_MS); 64 var s = document.createElement('script'); 65 s.type = 'text/javascript'; 66 s.async = true; 67 s.src = url; 68 s.onerror = function () { 69 if (settled) return; 70 settled = true; 71 clearTimeout(timer); 72 reject(new Error('web-components script onerror')); 73 }; 74 document.getElementsByTagName('head')[0].appendChild(s); 75 if (window.customElements && customElements.whenDefined) { 76 customElements.whenDefined(tagName).then(function () { 77 if (settled) return; 78 settled = true; 79 clearTimeout(timer); 80 resolve(); 81 }); 82 } 83 }); 84 return loadPromises[url]; 85 } 86 87 var EAGER_SELECTOR = 'place-propertycard, place-searchpagefilter, place-bedbathfiltermodal, ' + 88 'place-listingstatusmodal, place-propertytypemodal, place-savesearchmodal, ' + 89 'place-basicmodal, place-details, place-agentbio, place-agentmessaging, ' + 90 'place-contactyouragent, place-menu, place-collectionpopup, ' + 91 'place-copycollectionmodal, place-removecollectionpopup, place-vs-accumulate'; 92 93 function warmIfEagerTagsPresent() { 94 if (document.querySelector(EAGER_SELECTOR)) { 95 ensureLoaded('place-propertycard').catch(function () {}); 96 } 97 } 98 if (document.readyState === 'loading') { 99 document.addEventListener('DOMContentLoaded', warmIfEagerTagsPresent); 100 } else { 101 warmIfEagerTagsPresent(); 102 } 103 104 var INTERACTION_SELECTOR = 'place-getyourhomecta, place-generictoast, ' + EAGER_SELECTOR + 105 ', [data-needs-place-components]'; 106 function onInteract(e) { 107 var t = e.target; 108 if (t && t.closest && t.closest(INTERACTION_SELECTOR)) { 109 ensureLoaded('place-generictoast').catch(function () {}); 110 } 111 } 112 document.addEventListener('pointerdown', onInteract, true); 113 document.addEventListener('focusin', onInteract, true); 114 115 function idleWarm() { 116 ensureLoaded('place-generictoast').catch(function () {}); 117 } 118 if ('requestIdleCallback' in window) { 119 requestIdleCallback(idleWarm, { timeout: 5000 }); 120 } else { 121 setTimeout(idleWarm, 3000); 122 } 123 124 return { ensureLoaded: ensureLoaded }; 125 })(); 126 /* PLACE_COMPONENTS_LOADER_END */ 127 128 const googleApiKey = 'AIzaSyAjpuNg6WGCMV5rzoJcIP2QmMTVto6hYmc' 129 130 /* Lazy loader for Google Maps API + turf.js. 131 * The TURF_INLINE / MAPS_API_INLINE placeholders below are emitted by 132 * Sitemodel.php only on pages whose blocks actually consume Maps/turf. 133 * On other pages those tags are stripped, and consumers call 134 * sitebuilderMapsApi.ensureLoaded() to inject them on demand. 135 * 136 * Safari fix vs. the prior reverted attempt (commit 0cef3135e): uses 137 * Google's official &callback= parameter, not setTimeout, to detect 138 * Maps readiness. 139 */ 140 window.sitebuilderMapsApi = (function () { 141 var TURF_URL = 'https://cdn.jsdelivr.net/npm/@turf/[email protected]/turf.min.js';
142 var MAPS_URL = 'https://maps.googleapis.com/maps/api/js?libraries=geocoding,places,marker,drawing&key=' + 143 googleApiKey + '&map_ids=85c127b7bf0255d9&callback=__sitebuilderMapsReady'; 144 var LOAD_TIMEOUT_MS = 15000; 145 var loadPromise = null; 146 147 function injectScript(url) { 148 var s = document.createElement('script'); 149 s.type = 'text/javascript'; 150 s.async = true; 151 s.src = url; 152 document.getElementsByTagName('head')[0].appendChild(s); 153 return s; 154 } 155 156 function loadTurf() { 157 return new Promise(function (resolve, reject) { 158 if (window.turf) { resolve(); return; } 159 var s = injectScript(TURF_URL); 160 s.onload = function () { resolve(); }; 161 s.onerror = function () { reject(new Error('turf load failed')); }; 162 }); 163 } 164 165 function loadMaps() { 166 return new Promise(function (resolve, reject) { 167 if (window.google && window.google.maps) { resolve(); return; } 168 window.__sitebuilderMapsReady = function () { resolve(); }; 169 var s = injectScript(MAPS_URL); 170 s.onerror = function () { reject(new Error('maps load failed')); }; 171 }); 172 } 173 174 function ensureLoaded() { 175 if (loadPromise) return loadPromise; 176 if (window.google && window.google.maps && window.turf) { 177 loadPromise = Promise.resolve(); 178 return loadPromise; 179 } 180 loadPromise = new Promise(function (resolve, reject) { 181 var settled = false; 182 var timer = setTimeout(function () { 183 if (settled) return; 184 settled = true; 185 reject(new Error('maps/turf load timeout')); 186 }, LOAD_TIMEOUT_MS); 187 Promise.all([loadTurf(), loadMaps()]).then(function () { 188 if (settled) return; 189 settled = true; 190 clearTimeout(timer); 191 resolve(); 192 }, function (err) { 193 if (settled) return; 194 settled = true; 195 clearTimeout(timer); 196 reject(err); 197 }); 198 }); 199 return loadPromise; 200 } 201 202 return { ensureLoaded: ensureLoaded }; 203 })(); 204 </script>
204 <link href="https://cdn1.brivityidx.com/assets/css/style-headers.min.css" rel="stylesheet"><link href="https://cdn1.brivityidx.com/assets/css/style-premium.min.css" rel="stylesheet"><link href="https://cdn1.brivityidx.com/assets/css/style-footers.css" rel="stylesheet"><link href="https://cdn1.brivityidx.com/idx-sites/2/4/1/24129/site_custom.css?v=1789577780" rel="stylesheet">
204<script type="text/javascript" src="https://cdn1.brivityidx.com/idx-sites/2/4/1/24129/global_js_variables.js?v=1789577780"></script>
204<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital@0;1&display=swap" rel="stylesheet"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/assets/owl.carousel.min.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/assets/owl.theme.default.min.css">
204<script type="application/ld+json">{"@context":"https://schema.org","@type":"RealEstateAgent","name":"Stone & Story Real Estate Group","url":"https://www.stoneandstory.com","telephone":"+17852510717","address":{"@type":"PostalAddress","streetAddress":"1220 SW Executive Dr","addressLocality":"Topeka","addressRegion":"KS","postalCode":"66615","addressCountry":"US"},"geo":{"@type":"GeoCoordinates","latitude":39.044031,"longitude":-95.7678524},"openingHoursSpecification":{"@type":"OpeningHoursSpecification","dayOfWeek":["Monday","Tuesday","Wednesday","Thursday","Friday"],"opens":"08:00","closes":"17:00"},"aggregateRating":{"@type":"AggregateRating","ratingValue":"4.9","reviewCount":"124"},"priceRange":"$200,000 - $800,000","sameAs":["https://www.facebook.com/stoneandstoryrealestategroup","https://www.instagram.com/stoneandstoryre/","https://www.linkedin.com/company/stoneandstoryrealestategroup","https://www.youtube.com/channel/UCJnouH_Nk44HhbxGx9FCEag"]}</script>
204
204<script> 205var propDetailsPixelOnReady = function(){ 206 let propDetFpst = new FbRealEstatePixelTracker({"eventType": "ViewContent", "content_ids": [""]}); 207 propDetFpst.fireEvent(); 208}; 209if (document.readyState === "complete" || (document.readyState !== "loading" && !document.documentElement.doScroll)) { 210 propDetailsPixelOnReady(); 211} else { 212 document.addEventListener("DOMContentLoaded", propDetailsPixelOnReady); 213} 214 215</script>
215
215<script>
vendor: 327 bytes, lines 215-219
215(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 216new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 217j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 218'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 219})(window,document,'script','dataLayer','
219GTM-MKJHW6BC
vendor: 3 bytes, line 219
219');
219</script>
219 <meta property="og:url" content="https://www.stoneandstory.com/myportal/collections"> <meta property="og:image" content="http://images.brivityidx.com/assets/images/uploads/107878/Darin7278_Thumb28.png"> <meta property="og:image:secure_url" content="https://images.brivityidx.com/assets/images/uploads/107878/Darin7278_Thumb28.png"> <meta property="og:description" content=""> <meta property="og:title" content="MyPortal | Collections"> </head> <body>
vendor: 68 bytes, line 219
219 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
219GTM-MKJHW6BC
vendor: 83 bytes, line 219
219" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
219<meta name="google-signin-client_id" content="1"><meta name="apple-signin-flag" content="1"><meta name="main_sitebuilder_domain" content="https://sitebuilder.brivity.com"> <div id="site-registration-bar" class="collapse"> <input type="hidden" id="huser_id" value=""> <div class="row" style="width: 100%; margin: 0;"> <div class="col-md-12" style="display: none;" id="logged-in"> <div class="topBar flex aiCenter jcBetween"> <div class="topBarLeft flex aiCenter"> <span><topbar_show_agent_name/></span> </div> <div class="topBarRight flex aiCenter"> <a class="topLink flex aiCenter thin favoritesTop" href="/myportal/collections"> <svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg"> <g clip-path="url(#clip0_16761_179132)"> <path d="M14.2659 3.57333C13.9254 3.23267 13.5211 2.96243 13.0761 2.77806C12.6312 2.59368 12.1542 2.49878 11.6726 2.49878C11.1909 2.49878 10.714 2.59368 10.269 2.77806C9.82401 2.96243 9.41973 3.23267 9.07922 3.57333L8.37256 4.28L7.66589 3.57333C6.97809 2.88554 6.04524 2.49914 5.07256 2.49914C4.09987 2.49914 3.16702 2.88554 2.47922 3.57333C1.79143 4.26113 1.40503 5.19398 1.40503 6.16667C1.40503 7.13936 1.79143 8.07221 2.47922 8.76L3.18589 9.46667L8.37256 14.6533L13.5592 9.46667L14.2659 8.76C14.6066 8.4195 14.8768 8.01521 15.0612 7.57024C15.2455 7.12526 15.3404 6.64832 15.3404 6.16667C15.3404 5.68501 15.2455 5.20807 15.0612 4.7631C14.8768 4.31812 14.6066 3.91384 14.2659 3.57333V3.57333Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </g> <defs> <clipPath id="clip0_16761_179132"> <rect width="16" height="16" fill="white" transform="translate(0.372559 0.5)"/> </clipPath> </defs> </svg> <span class="ml6 topLabel">Collections </span> </a> <a class="topLink flex aiCenter thin saveSearchTop" href="/myportal/searches"> <svg width="16" height="16" viewBox="0 4 20 17" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M19 21L12 16L5 21V5C5 4.46957 5.21071 3.96086 5.58579 3.58579C5.96086 3.21071 6.46957 3 7 3H17C17.5304 3 18.0391 3.21071 18.4142 3.58579C18.7893 3.96086 19 4.46957 19 5V21Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" /> </svg> <span class="ml6 topLabel">Saved Searches </span> </a> <a class="topLink flex aiCenter thin market-report-top" style="display:none" href="/myportal/reports"> <svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M7.70589 13.1667C10.6514 13.1667 13.0392 10.7789 13.0392 7.83333C13.0392 4.88781 10.6514 2.5 7.70589 2.5C4.76037 2.5 2.37256 4.88781 2.37256 7.83333C2.37256 10.7789 4.76037 13.1667 7.70589 13.1667Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M14.3725 14.5L11.4725 11.6" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> <span class="ml6 topLabel">My Reports </span> </a> <a class="aiCenter flex topBarProfile thin" href="/myportal/profile"> <span class="profileName"></span> </a> <a style="padding-right: 0px" class="aiCenter flex thin" id="topBarLogout" href="javascript:void()"> <svg width="23" height="23" viewBox="0 0 23 23" fill="none" xmlns="http://www.w3.org/2000/svg"> <g clip-path="url(#clip0_16761_179186)"> <path d="M16.4003 16.214C19.0038 13.6106 19.0038 9.38945 16.4003 6.78595C13.7968 4.18246 9.57572 4.18246 6.97222 6.78595C4.36873 9.38945 4.36873 13.6105 6.97222 16.214C9.57572 18.8175 13.7968 18.8175 16.4003 16.214Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M9.80066 9.61438L13.5719 13.3856" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M9.80066 13.3856L13.5719 9.61438" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </g> <defs> <clipPath id="clip0_16761_179186"> <rect width="16" height="16" fill="white" transform="translate(0.372559 11.5) rotate(-45)"/> </clipPath> </defs> </svg> <span class="ml6">Log Out</span> </a> </div> </div> </div> <div id="not-logged-in"> <topbar_agent_info_not_logged_in/> <ul class="list-unstyled list-inline no-margin"> <li class="topBarSignin"><a href="#" onclick="showGoogleOneTap(true);"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-plus-circle mr10"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="16"></line>
219<line x1="8" y1="12" x2="16" y2="12"></line></svg> Sign In</a></li> </ul> </div> </div> </div> <input type="hidden" id="huser_email" value=""> <input type="hidden" id="huser_first_name" value=""> <input type="hidden" id="huser_last_name" value=""> <input type="hidden" id="huser_phone" value=""> <input type="hidden" id="huser_uuid" value=""> <div id="page" class="page"><header id="premium-navigation" style="outline: currentcolor none medium; cursor: inherit;" data-selector="#premium-navigation"> <div class="main-nav"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse" style="outline: currentcolor none medium; cursor: inherit;" data-selector="a.btn, button.btn, button"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="/" style="outline: currentcolor none medium; cursor: inherit;"> <img class="img-responsive site_custom_logo_dynamic" src="https://cdn1.brivityidx.com/assets/images/agent-photos/1/3/8/13838992/24129_88f2b13dedbcb0ca.png" alt="" style="outline: currentcolor none medium; cursor: inherit;" data-selector="img"></a> </div> <div class="collapse navbar-collapse render-menu"><ul class="nav navbar-nav navbar-right"><li class="nav-item"><a class="sec-nav-link-color" href="/search">Listings</a></li><li class="nav-item dropdown"><a class="dropdown-toggle sec-nav-link-color" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false">Buying<i class="fa fa-angle-down"></i></a><ul class="dropdown-menu"><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/buying">Buying a Home</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/financing">Financing</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/build">Building</a></li></ul><li class="nav-item dropdown"><a class="dropdown-toggle sec-nav-link-color" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false">Selling<i class="fa fa-angle-down"></i></a><ul class="dropdown-menu"><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/selling">Selling Your Home</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/home_value">Home Value</a></li></ul><li class="nav-item dropdown"><a class="dropdown-toggle sec-nav-link-color" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false">Rentals<i class="fa fa-angle-down"></i></a><ul class="dropdown-menu"><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/property-management">Property Management</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="https://www.stoneandstorypm.com/availability">Available Rentals</a></li></ul><li class="nav-item dropdown"><a class="dropdown-toggle sec-nav-link-color" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false">Top Areas<i class="fa fa-angle-down"></i></a><ul class="dropdown-menu"><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search/kansas/topeka">Topeka</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search?multi_search=Jackson%20County,%20KS&multi_cat=CountyState&status=1&mlsId=434,319%7C321%7C145%7C452&q_sort=createdAt-&q_offset=0">Jackson County, KS</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search?multi_search=Lawrence,%20KS&multi_cat=CityState&status=1&mlsId=434,319%7C321%7C145%7C452&q_sort=createdAt-&q_offset=0">Lawrence</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search?multi_search=Junction City, KS|Manhattan, KS&multi_cat=CityState|CityState&status=1&view=no_view&mlsId=434|319|321|145|452&q_sort=createdAt-&q_offset=0">Manhattan/Junction City</a></li><li class="sec-nav-drop-color">
219<a class="sec-nav-drop-link-color" href="/search?multi_search=Kansas City, MO|Johnson County, KS|Wyandotte, KS|Jackson, MO|Cass, MO|Platte, MO|Clay, MO|Kansas City, KS&multi_cat=CityState|CountyState|CountyState|CountyState|CountyState|CountyState|CountyState|CityState&status=1&view=no_view&mlsId=434|319|321|145|452&q_sort=createdAt-&q_offset=0">Kansas City Metro</a></li></ul><li class="nav-item dropdown"><a class="dropdown-toggle sec-nav-link-color" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false">About Us<i class="fa fa-angle-down"></i></a><ul class="dropdown-menu"><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/realestateagent/search">Who We Are</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/reviews">Reviews</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/blog">Insights</a></li></ul><li class="nav-item"><a class="sec-nav-link-color" href="/connect">Connect</a></li></ul></div> </div> </div> </header> <div id="slide-out-nav" class=""> <div class="close-nav"> <svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-x-circle"> <circle cx="12" cy="12" r="10"></circle> <line x1="15" y1="9" x2="9" y2="15"></line> <line x1="9" y1="9" x2="15" y2="15"></line> </svg> </div> <div class="render-menu"><ul class="nav navbar-nav navbar-right"><li class="nav-item"><a class="sec-nav-link-color" href="/search">Listings</a></li><li class="nav-item dropdown"><a class="dropdown-toggle sec-nav-link-color" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false">Buying<i class="fa fa-angle-down"></i></a><ul class="dropdown-menu"><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/buying">Buying a Home</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/financing">Financing</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/build">Building</a></li></ul><li class="nav-item dropdown"><a class="dropdown-toggle sec-nav-link-color" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false">Selling<i class="fa fa-angle-down"></i></a><ul class="dropdown-menu"><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/selling">Selling Your Home</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/home_value">Home Value</a></li></ul><li class="nav-item dropdown"><a class="dropdown-toggle sec-nav-link-color" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false">Rentals<i class="fa fa-angle-down"></i></a><ul class="dropdown-menu"><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/property-management">Property Management</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="https://www.stoneandstorypm.com/availability">Available Rentals</a></li></ul><li class="nav-item dropdown"><a class="dropdown-toggle sec-nav-link-color" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false">Top Areas<i class="fa fa-angle-down"></i></a><ul class="dropdown-menu"><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search/kansas/topeka">Topeka</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search?multi_search=Jackson%20County,%20KS&multi_cat=CountyState&status=1&mlsId=434,319%7C321%7C145%7C452&q_sort=createdAt-&q_offset=0">Jackson County, KS</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search?multi_search=Lawrence,%20KS&multi_cat=CityState&status=1&mlsId=434,319%7C321%7C145%7C452&q_sort=createdAt-&q_offset=0">Lawrence</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search?multi_search=Junction City, KS|Manhattan, KS&multi_cat=CityState|CityState&status=1&view=no_view&
219mlsId=434|319|321|145|452&q_sort=createdAt-&q_offset=0">Manhattan/Junction City</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search?multi_search=Kansas City, MO|Johnson County, KS|Wyandotte, KS|Jackson, MO|Cass, MO|Platte, MO|Clay, MO|Kansas City, KS&multi_cat=CityState|CountyState|CountyState|CountyState|CountyState|CountyState|CountyState|CityState&status=1&view=no_view&mlsId=434|319|321|145|452&q_sort=createdAt-&q_offset=0">Kansas City Metro</a></li></ul><li class="nav-item dropdown"><a class="dropdown-toggle sec-nav-link-color" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false">About Us<i class="fa fa-angle-down"></i></a><ul class="dropdown-menu"><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/realestateagent/search">Who We Are</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/reviews">Reviews</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/blog">Insights</a></li></ul><li class="nav-item"><a class="sec-nav-link-color" href="/connect">Connect</a></li></ul></div> <ul class="social" style="outline: none; cursor: inherit;"> <li data-selector="li" style="outline: none; cursor: inherit;"><a class="btn btn-block agent_facebook_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="" target="blank" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;padding: 12px 10px;"><i class="fa fa-2x fa-facebook fa-adjust" data-selector=".fa" style="outline: none; cursor: inherit;"></i></a></li> <li data-selector="li" style="outline: none; cursor: inherit;"><a class="btn btn-block agent_twitter_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="" target="blank" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;padding: 12px 10px;"><i class="fa fa-2x fa-twitter fa-adjust" data-selector=".fa" style="outline: none; cursor: inherit;"></i></a></li> <li data-selector="li" style="outline: none; cursor: inherit;"><a class="btn btn-block agent_instagram_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="" target="blank" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;padding: 12px 10px;"><i class="fa fa-2x fa-instagram fa-adjust" data-selector=".fa" style="outline: none; cursor: inherit;"></i></a></li> <li data-selector="li" style="outline: none; cursor: inherit;"><a class="btn btn-block agent_pinterest_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="" target="blank" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;padding: 12px 10px;"><i class="fa fa-2x fa-pinterest fa-adjust" data-selector=".fa" style="outline: none; cursor: inherit;"></i></a></li> <li data-selector="li" style="outline: none; cursor: inherit;"><a class="btn btn-block agent_youtube_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="" target="blank" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;padding: 12px 10px;"><i class="fa fa-2x fa-youtube fa-adjust" data-selector=".fa" style="outline: none; cursor: inherit;"></i></a></li> <li data-selector="li" style="outline: none; cursor: inherit;"><a class="btn btn-block agent_linkedin_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="" target="blank" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;padding: 12px 10px;"><i class="fa fa-2x fa-linkedin fa-adjust" data-selector=".fa" style="outline: none; cursor: inherit;"></i></a></li> </ul> </div> <div id="slide-out"> <div class="container-fluid"> <div class="row"> <div class="col-md-12"> <div class="header-flex"> <a class="navbar-brand" href="/" style="outline: none; cursor: inherit;"> <img class="img-responsive site_custom_logo" alt="Logo" src="https://cdn1.brivityidx.com/assets/images/agent-photos/1/3/8/13838992/24129_88f2b13dedbcb0ca.png" data-selector="img" style="outline: none; cursor: inherit;"></a> <div class="menu-toggle"> <svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-menu"> <line x1="3" y1="12" x2="21" y2="12"></line> <line x1="3" y1="6" x2="21" y2="6"></line> <line x1="3" y1="18" x2="21" y2="18"></line> </svg> </div> </div> </div> </div> </div> </div> <style> 220 221 .center-modal { 222 display:flex; 223 justify-content: center; 224 align-items:center; 225 position:fixed; 226 background-color:rgba(0,0,0,0.4); 227 left:0; 228 top:0; 229 right:0; 230 bottom:0; 231 z-index: 300; 232 } 233 234 .page-width-parent{ 235 max-width: 1280px; 236 margin: 0 auto; 237 } 238 239 240 .property-list-map-view { 241 display:flex; 242 flex-wrap:wrap; 243 gap:16px; 244 } 245 .property-list-map-view-parent { 246 background-color: #F9F9F9; 247 padding:16px; 248 height:710px; 249 overflow:scroll; 250 } 251 252 .property-list-list-view { 253 display:flex; 254 flex-wrap:wrap; 255 gap:24px 256 } 257 258 .property-container { 259 260 gap:24px; 261 } 262 263 .property-map-container { 264 flex:1; 265 height:710px; 266 } 267 268 .property-pagination { 269 margin-top: 26px; 270 } 271 272 .collection-saved-listings { 273 margin-bottom: 26px; 274 font-size:16px; 275 color:black; 276 } 277 278 .collection-description { 279 padding: 20px 0 18px 8px; 280 } 281 282 .my-feed-parent { 283 margin-top:32px; 284 padding-top:32px; 285 border-top: solid 1px #C4C4C4; 286 } 287 288 .collection-description-text { 289 font-size:16px; 290 margin:0; 291 color:black; 292 } 293 294 #collections { 295 display:flex; 296 flex-wrap:wrap; 297 gap:40px 24px; 298 } 299
300 #collection-pagination{ 301 margin-top: 55px 302 } 303 304 #add-listing-btn{ 305 margin-bottom: 20px 306 } 307 308 @media only screen and (min-width: 1280px) { 309 .collection-page { 310 padding:48px 48px 48px 120px; 311 } 312 .my-feed-parent { 313 width:90vw; 314 max-width: 100%; 315 overflow: hidden; 316 } 317 .property-list-map-view-parent { 318 width:500px; 319 } 320 .property-container { 321 display:flex; 322 } 323 } 324 325 @media only screen and (max-width:1280px) { 326 .collection-page { 327 padding:60px 16px 16px 16px; 328 } 329 .my-feed-parent { 330 width: unset; 331 } 332 .property-container { 333 display:flex; 334 flex-direction: column-reverse; 335 } 336 .property-list-map-view { 337 flex-wrap:nowrap; 338 overflow:scroll; 339 height:280px; 340 } 341 .property-list-map-view-parent { 342 height:unset; 343 padding:0px; 344 background-color: #FFFFFF 345 } 346 .property-map-container { 347 flex:none; 348 height:446px; 349 } 350 } 351 352 @media only screen and (max-width:768px) { 353 #collections { 354 justify-content: center; 355 } 356 .property-map-container { 357 width: calc(100% + 32px); 358 margin-left: -16px; 359 } 360 .property-list-map-view { 361 height:250px; 362 } 363 } 364 365</style>
365<script> 366 window.addEventListener("load", () => { 367 const key = localStorage.getItem('authorization'); 368 369 if( !key) { 370 $("#sign-up-modal").modal('show'); 371 372 $("#sign-up-modal").on("hidden.bs.modal", function () { 373 location.reload(); 374 }); 375 } 376 else{ 377 378 let myPortalPage = document.getElementById('myportal-page'); 379 myPortalPage.style.display = "block"; 380 381 window.location.hash = "" 382 383 function isGuid(value) { 384 var regex = /[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}/i; 385 var match = regex.exec(value); 386 return match != null; 387 } 388 389 let lastUrlItem = window.location.href.substring(window.location.href.lastIndexOf('/') + 1) 390 let showCollectionByUUID = false 391 392 if (isGuid(lastUrlItem)) { 393 showCollectionByUUID = true 394 } 395 396 397 class logger extends Collections.BaseLogger { 398 log(e) { 399 console.log(e); 400 } 401 } 402 403 404 class Pubsub { 405 static events = {}; 406 constructor() { 407 //this.events = {}; 408 } 409 410 static subscription (eventName, func) { 411 return { 412 subscribe: () => { 413 if (this.events[eventName]) { 414 this.events[eventName].push(func); 415 } else { 416 this.events[eventName] = [func]; 417 } 418 }, 419 unsubscribe: () => { 420 if(this.events[eventName]){ 421 this.events[eventName] = this.events[eventName].filter((subscriber) => subscriber !== func); 422 } 423 } 424 } 425 } 426 427 static publish(eventName, ...args) { 428 const funcs = this.events[eventName]; 429 if (Array.isArray(funcs)) { 430 funcs.forEach((func) => { 431 func.apply(null, args); 432 }); 433 } 434 } 435 } 436 437 class CollectionCard { 438 constructor(collection, count){ 439 440 this.element = document.createElement(`place-collectioncard`); 441 this.collection = collection 442 let _this = this; 443 let menuOpen = false; 444 var images = []; 445 446 for (let i = 0; i < collection?.propertiesImages?.length; i++) { 447 images.push(collection.propertiesImages[i].mainPhoto); 448 } 449 450 this.element.setAttribute("appearance", "regular"); 451 this.element.setAttribute("image", images); 452 this.element.setAttribute("num_properties", collection?.totalListings ?? 0) 453 this.element.setAttribute("title", collection.collectionName); 454 this.element.setAttribute("description", collection.collectionDescription ? collection.collectionDescription : collection.description ? collection.description : ""); 455 this.element.setAttribute("creator", ""); 456 this.element.setAttribute("disable_dropdown", "false"); 457 this.element.setAttribute("style", "height: 254px"); 458 this.element.setAttribute('z_index', count); 459 this.element.setAttribute("show_menu", "false"); 460 this.element.setAttribute("id", collection.collectionUUID); 461 this.element.setAttribute("container_styles", "w-[300px]"); 462 463 const collectionUUID = collection.collectionUUID; 464 465 this.element.addEventListener(`on_menu_item_pressed`, (e) => { 466 let menuItem = e.detail 467 Pubsub.publish('collection_card_menu_item_pressed', {collection,menuItem}); 468 }); 469 470 this.element.addEventListener('on_search_pressed', (e) => { 471 if (e.target.tagName != "svg" && e.target.tagName != "path") { 472 window.open('../../search.php', '_blank'); 473 e.stopPropagation(); 474 } 475 }); 476 477 this.element.addEventListener(`click`, (e) => { 478 if (e.target.tagName != "svg" && e.target.tagName != "path" && !menuOpen) { 479 Pubsub.publish('collection_card_pressed', {collection:_this.collection,e}); 480 e.stopPropagation(); 481 } 482 }); 483 484 this.element.addEventListener(`on_menu_open`, (e) => { 485 if (this.element.getAttribute("title") === "Favorites") { 486 this.element.setAttribute("disable_menu", "true"); 487 } 488 489 menuOpen = e.detail; 490 this.element.setAttribute("show_menu", menuOpen); 491 }); 492 } 493 } 494 495 class CollectionSection { 496 497 498 collectionSection = document.getElementById('collection-section') 499 collections = document.getElementById('collections') 500 501 addCollectionCard = (collection, count) => { 502 const collectionCard = new CollectionCard(collection, count); 503 504 505 506 507 this.collections.append(collectionCard.element); 508 509 } 510 511 show = () => { 512 this.collectionSection.style.display = 'block' 513 } 514 515 hide = () => { 516 this.collectionSection.style.display = 'none' 517 } 518 } 519 520 class PropertyCard { 521 constructor(collectionUUID,property){ 522 523 let _this = this; 524 this.element = document.createElement(`place-propertycard`); 525 let menuOpen = false;
526 this.property = property; 527 528 this.element.setAttribute("id", property.blossorId) 529 this.element.setAttribute("display_menu", "true"); 530 this.element.setAttribute("show_menu", "false"); 531 this.element.setAttribute("items", '[{"icon":"share-2","text":"Share Property"},{"icon":"layers","text":"Copy to Collection"},{"icon":"trash","text":"Remove from Collection"}]'); 532 533 this.element.setAttribute('appearance','small') 534 this.element.setAttribute('layout_width', '300') 535 this.element.setAttribute('display_tag', 'true') 536 this.element.setAttribute('display_favorite', 'true') 537 this.element.setAttribute('mls',`{ 538 "status":"${property.statusText}", 539 "favorite":"true", 540 "image":[{"uri":"${property?.photos[0]?.url}"}], 541 "price":"${property?.price}", 542 "address":"${property?.address?.street}", 543 "state":"${property?.address?.state}", 544 "city":"${property?.address?.city}", 545 "postalCode":"${property?.address?.zip}", 546 "beds":"${property?.bedrooms}", 547 "baths":"${property?.totalBaths}", 548 "sqft":"${property?.sqFeet}" 549 }`) 550 this.element.setAttribute('on_hover', 'true') 551 552 this.element.addEventListener('mouseenter', (e) => { 553 Pubsub.publish('property_card_mouseenter', property); 554 }) 555 556 this.element.addEventListener('mouseleave', (e) => { 557 Pubsub.publish('property_card_mouseleave', property); 558 }) 559 560 this.element.addEventListener(`on_menu_item_pressed`, (e) => { 561 let menuItem = e.detail 562 let propertyCollectionUUID = property.propertyCollectionUUID 563 let url = this.getPropertyUrl(this.property); 564 property.searchUrl = url; 565 Pubsub.publish('property_card_menu_item_pressed', {property,collectionUUID,propertyCollectionUUID,menuItem, url}); 566 }); 567 568 this.element.addEventListener(`on_menu_open`, (e) => { 569 menuOpen = e.detail; 570 this.element.setAttribute("show_menu", menuOpen); 571 }); 572 573 this.element.addEventListener('click', (e) => { 574 if (e.target.tagName != "svg" && e.target.tagName != "path" && !menuOpen) { 575 let state = _this.property.address.state; 576 let city = _this.slugify(_this.property.address.city); 577 let zip = _this.property.address.zip 578 let address = _this.slugify(_this.property.address.street); 579 let blossorId = _this.property.blossorId; 580 let url = this.getPropertyUrl(property); 581 window.open(`../../${url}`, '_blank'); 582 } 583 }); 584 585 this.element.addEventListener('on_favorite_press', (e) => { 586 let propertyCollectionUUID = property.propertyCollectionUUID; 587 Pubsub.publish('delete_property_modal_pressed', {collectionUUID, propertyCollectionUUID}); 588 }); 589 590 } 591 592 getPropertyUrl = (property) => { 593 let state = property.address.state; 594 let city = this.slugify(property.address.city); 595 let zip = property.address.zip 596 let address = this.slugify(property.address.street); 597 let blossorId = property.blossorId; 598 return `homes-for-sale/${state}/${city}/${zip}/${address}/bid-${blossorId}`; 599 } 600 601 slugify(text) { 602 // replace non letter or digits by - 603 text = text.replace(/[^\pL\d]+~u/g, '_'); 604 // transliterate 605 text = text.normalize('NFKD').replace(/[\u0300-\u036F]/g,'') 606 // remove unwanted characters 607 text = text.replace(/[^_\w]+/g, '_'); 608 // trim 609 text = text.trim(); 610 // remove duplicate - 611 text = text.replace(/_+/g, '-'); 612 // lowercase 613 text = text.toLowerCase(); 614 if (!text) { 615 return 'n-a'; 616 } 617 return text 618 } 619 } 620 621 let dateNow = new Date(); 622 dateNow.setDate(dateNow.getDate()-7); 623 dateNow.setHours(dateNow.getHours()); 624 dateNow.setMinutes(dateNow.getMinutes()); 625 dateNow.setSeconds(dateNow.getSeconds()); 626 const sevenDaysAgo = dateNow.getTime(); 627 628 class PropertySection { 629 propertySection = document.getElementById('property-section') 630 listIcon = document.getElementById('property-list-icon') 631 mapIcon = document.getElementById('property-map-icon') 632 propertyHeader = document.getElementById('property-header') 633 propertyList = document.getElementById("property-list") 634 propertyListParent = document.getElementById("property-list-parent") 635 propertyMap = document.getElementById('property-map') 636 selectedView = 'map' 637 638 collectionProperties = [] 639 640 properties = [] 641 642 643 constructor() { 644 this.listIcon.addEventListener('click', () => { 645 this.setView('list') 646 }) 647 648 this.mapIcon.addEventListener('click', () => { 649 this.setView('map') 650 }) 651 } 652 653 show = (collectionUUID, collectionProperties) => { 654 this.propertySection.style.display = 'block' 655 this.collectionProperties = collectionProperties 656 this.collectionUUID = collectionUUID 657 658 this.propertyList.innerHTML = '' 659 count = 100; 660 661 this.collectionProperties?.data?.properties?.forEach((property) => { 662 count-- 663 this.addPropertyCard(property,collectionUUID, count) 664 }); 665 } 666 667 hide = () => { 668 this.propertySection.style.display = 'none' 669 } 670 671 setPropertyCardWidth = () => { 672 let width; 673 let imageHeight; 674 let windowWidth = window.innerWidth 675 if(this.selectedView == 'map') { 676 if(windowWidth > 1279) { 677 width = `220`; 678 imageHeight = `154`; 679 } else if(windowWidth > 768) { 680 width = `325`; 681 imageHeight = `184`; 682 } else{ 683 width = `244`; 684 imageHeight = `154`; 685 } 686 } 687 else { 688 if(windowWidth > 1440 ){ 689 width = `300`; 690 imageHeight = `184`; 691 } 692 else if(windowWidth > 1279) { 693 width = `260`; 694 imageHeight = `152`; 695 } else if(windowWidth > 768) { 696 width = `218`; 697 imageHeight = `152`; 698 } else{ 699 width = `288`; 700 imageHeight = `184`; 701 } 702 } 703 704 let propertyCards = document.querySelectorAll('place-propertycard') 705 propertyCards.forEach((propertyCard) => { 706 propertyCard.setAttribute('layout_width', width) 707 propertyCard.setAttribute('image_height', imageHeight) 708 }) 709 } 710
711 setView = (view) => { 712 this.selectedView = view 713 if (view == 'list') { 714 this.listIcon.setAttribute('stroke', 'black') 715 this.mapIcon.setAttribute('stroke', 'gray') 716 717 this.propertyMap.style.display = 'none' 718 this.propertyList.classList.add('property-list-list-view') 719 this.propertyList.classList.remove('property-list-map-view') 720 this.propertyListParent.classList.remove('property-list-map-view-parent') 721 722 Pubsub.publish('property_section_show_list_view', this.collectionProperties?.data?.properties); 723 } else { 724 this.listIcon.setAttribute('stroke', 'gray') 725 this.mapIcon.setAttribute('stroke', 'black') 726 727 this.propertyMap.style.display = 'block' 728 this.propertyList.classList.remove('property-list-list-view') 729 this.propertyList.classList.add('property-list-map-view') 730 this.propertyListParent.classList.add('property-list-map-view-parent') 731 732 Pubsub.publish('property_section_show_map_view', this.collectionProperties?.data?.properties); 733 } 734 735 this.setPropertyCardWidth(); 736 } 737 738 scrollIntoView = (id) => { 739 let propertyCard = document.getElementById(id); 740 propertyCard.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'start' }) 741 } 742 743 addPropertyCard = (property, collectionUUID, count) => { 744 745 var propertyCardWrapperElement = document.createElement(`div`) 746 propertyCardWrapperElement.setAttribute('style', `z-index:${count}`) 747 propertyCardWrapperElement.setAttribute('class', 'property-card-wrapper') 748 propertyCardWrapperElement.setAttribute("id", property.propertyCollectionUUID); 749 750 const propertyCard = new PropertyCard(collectionUUID,property); 751 var propertyCardElement = propertyCard.element; 752 753 propertyCardWrapperElement.append(propertyCardElement) 754 755 this.propertyList.append(propertyCardWrapperElement) 756 757 } 758 759 } 760 761 762 class PageSubHeader{ 763 constructor() { 764 765 this.element = document.querySelector('place-pagesubheader') 766 767 this.element.addEventListener('button_on_press', (e) => { 768 Pubsub.publish('create_new_collection_pressed', e) 769 }) 770 771 this.element.addEventListener('top_header_on_press', (e) => { 772 Pubsub.publish('top_header_back_pressed', e) 773 }) 774 775 this.element.addEventListener('on_menu_item_pressed', (e) => { 776 Pubsub.publish('top_header_menu_item_pressed', e.detail) 777 }) 778 779 this.element.addEventListener('secondary_button_on_press', (e) => { 780 window.open('../../search.php', '_blank') 781 }) 782 } 783 784 setTitle(title) { 785 this.element.setAttribute('title', title) 786 } 787 788 setTopHeaderTitle(title){ 789 this.element.setAttribute('top_header_title', title) 790 } 791 792 showTopHeader(){ 793 this.element.setAttribute('show_top_header', true) 794 } 795 796 hideTopHeader(){ 797 this.element.setAttribute('show_top_header', false) 798 } 799 800 showPrimaryButton() { 801 this.element.setAttribute('show_button', true) 802 } 803 804 hidePrimaryButton() { 805 this.element.setAttribute('show_button', false) 806 } 807 808 showSecondaryButton(){ 809 this.element.setAttribute('show_secondary_button', true) 810 } 811 812 hideSecondaryButton(){ 813 this.element.setAttribute('show_secondary_button', false) 814 } 815 816 showMenuButton() { 817 this.element.setAttribute('show_menu_button', true) 818 } 819 820 hideMenuButton() { 821 this.element.setAttribute('show_menu_button', false) 822 } 823 } 824 825 class CollectionModal { 826 827 constructor() { 828 829 let _this = this; 830 this.element = document.querySelector('place-collectionpopup'); 831 this.collectionUUID = 0; 832 833 this.element.addEventListener("on_close_press", (e) => { 834 _this.hide(); 835 }); 836 837 this.element.addEventListener("on_save_press", (e) => { 838 this.showError(false); 839 e.detail.collectionUUID = this.collectionUUID 840 e.detail.type = this.isEditingCollection ? 'edit' : 'save' 841 Pubsub.publish('on_new_collection_saved', e.detail); 842 }); 843 844 } 845 846 setName(name) { 847 this.element.setAttribute('name_value', name) 848 } 849 850 setDescription(description) { 851 this.element.setAttribute('description_value', description ? description : "") 852 } 853 854 showError(error) { 855 this.element.setAttribute('show_error', error) 856 } 857 858 show(collectionUUID, isEditingCollection) { 859 this.isEditingCollection = isEditingCollection; 860 if(collectionUUID){ 861 this.collectionUUID = collectionUUID; 862 } 863 this.element.setAttribute('style', 'display:flex') 864 } 865 866 hide() { 867 this.element.setAttribute('style', 'display:none'); 868 869 this.showError(false) 870 871 // terrible hack.. only way i could get it to respond to prop changes 872 // to clear the input fields after closing the modal 873 this.setName('none') 874 this.setDescription('none') 875 setTimeout(() => { 876 this.setName('') 877 this.setDescription('') 878 }, 100); 879 } 880 } 881 882 class CollectionCreatedModal { 883 constructor() { 884 885 886 this.collection = "" 887 this.element = document.getElementById('collection-created-modal'); 888 let _this = this; 889 890 this.element.addEventListener("on_primary_press", (e) => { 891 this.hide(); 892 window.location.href = '../../search.php' 893 }); 894 895 this.element.addEventListener("on_tertiary_press", (e) => { 896 _this.hide(); 897 Pubsub.publish('collection_created_modal_view_collection_pressed', _this.collection); 898 }); 899 900 this.element.addEventListener("on_close_press", (e) => { 901 _this.hide(); 902 }); 903 904 this.element.setAttribute("stacked_buttons", true) 905 this.element.setAttribute("primary_button_text", "Search Listings") 906 this.element.setAttribute("tertiary_button_text", "View Collection") 907 } 908 909 show(collection) { 910 if(collection){ 911 this.collection = collection; 912 } 913 this.element.setAttribute('style', 'display:flex') 914 } 915 916 hide() { 917 this.element.setAttribute('style', 'display:none'); 918 } 919 } 920 921 class EditCollectionModal { 922 constructor() { 923 924 925 this.collection = "" 926 this.element = document.getElementById('edit-collection-modal'); 927 let _this = this; 928 929 this.element.addEventListener("on_primary_press", (e) => { 930 _this.hide(); 931 932 }); 933 934 935 936 this.element.addEventListener("on_close_press", (e) => { 937 _this.hide(); 938 }); 939 } 940 941 show() { 942 943 this.element.setAttribute('style', 'display:flex') 944 } 945 946 hide() { 947 this.element.setAttribute('style', 'display:none'); 948 } 949 } 950 951 class DeleteCollectionModal { 952 constructor() { 953 954 955 this.collection = "" 956 this.element = document.getElementById('delete-collection-modal'); 957 let _this = this; 958 959 this.element.addEventListener("on_primary_press", (e) => { 960 _this.hide(); 961 Pubsub.publish('delete_collection_modal_delete_pressed', _this.collection); 962 }); 963 964 this.element.addEventListener("on_tertiary_press", (e) => { 965 this.hide(); 966 }); 967 968 this.element.addEventListener("on_close_press", (e) => { 969 _this.hide(); 970 }); 971 } 972 973 show(collection) { 974 if(collection){ 975 this.collection = collection; 976 } 977 this.element.setAttribute('style', 'display:flex') 978 } 979 980 hide() { 981 this.element.setAttribute('style', 'display:none'); 982 } 983 } 984 985 class ShareSavedPropertyModal { 986 constructor() { 987 let _this = this; 988 this.savedProperty = {} 989 this.element = document.getElementById('share-saved-property-modal'); 990 991 this.element.addEventListener("on_primary_press", (e) => { 992 993 994 995 navigator.clipboard.writeText(this.link) 996 _this.hide(); 997 Pubsub.publish('share_saved_property_modal_share_pressed'); 998 999 }); 1000 1001 this.element.addEventListener("on_close_press", (e) => { 1002 _this.hide(); 1003 }); 1004 } 1005 1006 show = (savedProperty) => { 1007 1008 1009 this.savedProperty = savedProperty; 1010 1011 this.link = document.location.origin + "/" + this.savedProperty.searchUrl 1012 this.element.setAttribute('share_link_text', this.link) 1013 this.element.setAttribute('style', 'display:flex') 1014 } 1015 1016 hide = () => { 1017 this.element.setAttribute('style', 'display:none'); 1018 } 1019 } 1020 1021 class DeletePropertyModal { 1022 constructor() { 1023 1024 1025 this.collectionUUID = "" 1026 this.propertyCollectionUUID = "" 1027 this.element = document.getElementById('delete-property-modal'); 1028 let _this = this; 1029 1030 this.element.addEventListener("on_primary_press", (e) => { 1031 _this.hide(); 1032 Pubsub.publish('delete_property_modal_delete_pressed', {"collectionUUID":_this.collectionUUID, "propertyCollectionUUID":_this.propertyCollectionUUID}); 1033 }); 1034 1035 this.element.addEventListener("on_tertiary_press", (e) => { 1036 this.hide(); 1037 }); 1038 1039 this.element.addEventListener("on_close_press", (e) => { 1040 _this.hide(); 1041 }); 1042 } 1043 1044 show(collectionUUID, propertyCollectionUUID) { 1045 if(collectionUUID){ 1046 this.collectionUUID = collectionUUID; 1047 } 1048 if(propertyCollectionUUID){ 1049 this.propertyCollectionUUID = propertyCollectionUUID; 1050 } 1051 this.element.setAttribute('style', 'display:flex') 1052 } 1053 1054 hide() { 1055 this.element.setAttribute('style', 'display:none'); 1056 } 1057 } 1058 1059 class CopyPropertyToCollectionModal { 1060 constructor(){ 1061 1062 this.element = document.querySelector('place-copycollectionmodal'); 1063 this.collections = []; 1064 this.property = {} 1065 this.isVisible = false;
1066 1067 1068 1069 this.element.addEventListener('close_button', (e) => { 1070 this.hide(); 1071 }); 1072 1073 this.element.addEventListener('cancel_button', (e) => { 1074 this.hide(); 1075 }); 1076 1077 this.element.addEventListener('on_save', (e) => { 1078 Pubsub.publish('copy_property_to_collection_modal_save_pressed', {'collectionUUID':e.detail, 'property':this.property}); 1079 }); 1080 1081 this.element.addEventListener('set_selected_collection', (e) => { 1082 console.log('set_selected_collection', e) 1083 }); 1084 1085 this.element.addEventListener('on_link_press', (e) => { 1086 Pubsub.publish('show_new_collection_modal'); 1087 }); 1088 1089 } 1090 1091 getCollectionData(){ 1092 return JSON.parse(this.element.getAttribute("collections")); 1093 } 1094 1095 setCollectionData(collections){ 1096 this.element.setAttribute('collections', JSON.stringify(collections)) 1097 } 1098 1099 getCollectionList(collections, currentCollectionName) { 1100 let collectionList = []; 1101 collections.forEach(collection => { 1102 if (currentCollectionName && (collection.collectionName == currentCollectionName)) return; 1103 collectionList.push({ 1104 collection_title: collection.collectionName, 1105 id: collection.collectionUUID, 1106 propertiesImages: collection?.propertiesImages?.length > 0 ? collection?.propertiesImages : [], 1107 }) 1108 }); 1109 this.setCollectionData(collectionList); 1110 1111 } 1112 1113 setIsAddingToCollection(isAddingToCollection){ 1114 this.element.setAttribute('is_add_to_collection', isAddingToCollection); 1115 } 1116 1117 show(property) { 1118 1119 if(property){ 1120 this.property = property; 1121 } 1122 1123 this.isVisible = true; 1124 1125 let mls = { 1126 status: property?.status || property?.standardStatus || "", 1127 image: this.getPropertyImageUrl(property), 1128 price: property?.price || "0", 1129 address: ( typeof property?.address === "string") ? property?.address : (property?.address?.street || property?.streetAddress || ""), 1130 state: property?.state || property?.address?.state || "", 1131 city: property?.city || property?.address?.city || "", 1132 postal_code: property?.postal_code || property?.address?.zip || "", 1133 beds: property?.beds || property?.bedrooms || 0, 1134 baths: property?.baths || property?.fullBaths || property?.bathsTotalDecimal || 0, 1135 sqft: property?.sqft || property?.squareFeet || property?.sqFeet || 0, 1136 creator: property?.creator || "", 1137 } 1138 1139 this.element.setAttribute('mls', JSON.stringify(mls)) 1140 this.element.setAttribute('image_url',mls?.image || "") 1141 this.element.setAttribute('style', 'display:flex') 1142 } 1143 1144 getPropertyImageUrl(property){ 1145 // property?.image[0]?.uri || property?.photos[0]?.url || "", 1146 1147 if(property.image && property.image.length > 0){ 1148 return property.image[0].uri 1149 } else if (property.photos && property.photos.length > 0){ 1150 return property.photos[0].url 1151 } else { 1152 return "" 1153 } 1154 } 1155 1156 hide() { 1157 this.isVisible = false;
1158 this.element.setAttribute('style', 'display:none'); 1159 } 1160 } 1161 1162 class CollectionPaging { 1163 constructor(collectionsPerPage){ 1164 1165 1166 this.element = document.getElementById('collection-pagination'); 1167 this.collectionsPerPage = collectionsPerPage; 1168 1169 this.element.addEventListener('page_changed', (e) => { 1170 Pubsub.publish('collection_page_changed', e.detail); 1171 }); 1172 } 1173 1174 setPageCount(pageCount){ 1175 this.element.setAttribute('page_count', pageCount); 1176 } 1177 1178 show() { 1179 this.element.setAttribute('style', 'display:flex') 1180 } 1181 1182 hide() { 1183 this.element.setAttribute('style', 'display:none') 1184 } 1185 } 1186 1187 class PropertyPaging { 1188 constructor(propertiesPerPage){ 1189 1190 1191 this.element = document.getElementById('property-pagination'); 1192 this.propertiesPerPage = propertiesPerPage; 1193 1194 this.element.addEventListener('page_changed', (e) => { 1195 Pubsub.publish('property_page_changed', e.detail); 1196 }); 1197 } 1198 1199 setPageCount(pageCount){ 1200 this.element.setAttribute('page_count', pageCount); 1201 } 1202 1203 setCurrentPage(currentPage){ 1204 this.element.setAttribute('current_page', currentPage); 1205 } 1206 1207 show() { 1208 this.element.setAttribute('style', 'display:flex') 1209 } 1210 1211 hide() { 1212 this.element.setAttribute('style', 'display:none') 1213 } 1214 } 1215 1216 class NewCollectionBlock { 1217 constructor(){ 1218 1219 this.element = document.getElementById('new-collection-block'); 1220 1221 this.element.addEventListener('on_main_press', (e) => { 1222 Pubsub.publish('new_collection_block_create_collection_pressed', e.detail); 1223 }); 1224 } 1225 show(collectionUUID, propertyCollectionUUID) { 1226 this.element.setAttribute('style', 'display:flex') 1227 } 1228 1229 hide() { 1230 this.element.setAttribute('style', 'display:none'); 1231 } 1232 } 1233 1234 class AddListingsBlock { 1235 constructor() { 1236 1237 this.element = document.getElementById('add-listings-block'); 1238 1239 this.element.addEventListener('on_main_press', (e) => { 1240 window.open('../../search.php', '_blank') 1241 }); 1242 1243 this.element.addEventListener("on_tertiary_press", (e) => { 1244 1245 }); 1246 } 1247 1248 show() { 1249 this.element.setAttribute('style', 'display:flex') 1250 } 1251 1252 hide() { 1253 this.element.setAttribute('style', 'display:none'); 1254 } 1255 } 1256 1257 class MyFeed { 1258 constructor(blueroofMiddlewareApi, collectionsService) { 1259 this.blueroofMiddlewareApi = blueroofMiddlewareApi; 1260 this.collectionsService = collectionsService; 1261 this.element = document.querySelector('place-myfeedblock'); 1262 1263 this.element.addEventListener('on_menu_open', (e) => { 1264 this.element.setAttribute('show_menu', e.detail.e); 1265 this.element.setAttribute('show_menu_index', e.detail.index); 1266 }); 1267 1268 this.element.addEventListener('on_view_all_pressed', (e) => { 1269 window.open('../../search.php', '_blank'); 1270 }); 1271 1272 this.element.addEventListener('on_add_collection', (e) => { 1273 1274 let property = e.detail; 1275 Pubsub.publish('my_feed_add_collection_pressed', {property}); 1276 1277 }); 1278 1279 this.element.addEventListener('on_share_pressed', (e) => { 1280 1281 let property = e.detail 1282 1283 let url = this.getPropertyUrl(property); 1284 property.searchUrl = url; 1285 1286 Pubsub.publish('my_feed_share_pressed', {property}); 1287 }); 1288 1289 this.element.addEventListener('on_favorite_pressed', (e) => { 1290 let property = e.detail.property; 1291 let isAddingFavorite = e.detail.isAddingFavorite; 1292 1293 if(isAddingFavorite){ 1294 Pubsub.publish('my_feed_on_favorite_pressed', {property}); 1295 } 1296 else{ 1297 Pubsub.publish('my_feed_on_unfavorite_pressed', {property}); 1298 } 1299 }); 1300 1301 this.element.addEventListener('on_property_pressed', (e) => { 1302 let property = e.detail 1303 1304 let url = this.getPropertyUrl(property); 1305 property.searchUrl = url; 1306 window.open('../../' + url, '_blank'); 1307 }); 1308 1309 1310 this.blueroofMiddlewareApi.getMyFeed().then((data) => { 1311 1312 let myFeedBlossorIds = data.map(property => property.blossorId); 1313 1314 1315 this.collectionsService.checkIfInCollection(myFeedBlossorIds).then((propertiesInCollections) => { 1316 1317 let feed = [] 1318 data.forEach((item) => { 1319 feed.push({ 1320 image: [ 1321 { 1322 title: "", 1323 id: 0, 1324 uri: item?.photos[0].url, 1325 }, 1326 ], 1327 price: item?.price, 1328 favorite: propertiesInCollections?.data[item?.blossorId] != null || false, 1329 address: item?.streetAddress, 1330 city: item?.city, 1331 state: item?.state, 1332 postal_code: item?.postalCode, 1333 beds: item?.bedrooms, 1334 status: item?.standardStatus, 1335 baths: item?.bathsTotalDecimal, 1336 sqft: item?.squareFeet, 1337 creator: "", 1338 mls_price_history: item?.history[item.history.length-1]?.price, 1339 blossorId: item?.blossorId, 1340 open_house : item?.openhouses?.length > 0 ? true : false, 1341 open_house_date : item?.openhouses[0]?.startDate, 1342 open_house_end_time : item?.openhouses[0]?.endDate, 1343 property_created_at : item?.listDate, 1344 lastStatusChangeDate : item?.lastStatusChangeDate, 1345 }) 1346 }) 1347 1348 if(feed && feed?.length > 0){ 1349 this.show(); 1350 this.element.setAttribute('mls_data', JSON.stringify(feed)); 1351 } 1352 }); 1353 }); 1354 1355 } 1356 1357 getPropertyUrl = (property) => { 1358 let state = property.state; 1359 let city = this.slugify(property.city); 1360 let zip = property.postal_code 1361 let address = this.slugify(property.address); 1362 let blossorId = property.blossorId; 1363 return `homes-for-sale/${state}/${city}/${zip}/${address}/bid-${blossorId}`; 1364 } 1365 1366 slugify(text) { 1367 // replace non letter or digits by - 1368 text = text.replace(/[^\pL\d]+~u/g, '_'); 1369 // transliterate 1370 text = text.normalize('NFKD').replace(/[\u0300-\u036F]/g,'') 1371 // remove unwanted characters 1372 text = text.replace(/[^_\w]+/g, '_'); 1373 // trim 1374 text = text.trim(); 1375 // remove duplicate - 1376 text = text.replace(/_+/g, '-'); 1377 // lowercase 1378 text = text.toLowerCase(); 1379 if (!text) { 1380 return 'n-a'; 1381 } 1382 return text 1383 } 1384 1385 getMlsData = () => { 1386 return JSON.parse(this.element.getAttribute('mls_data')); 1387 } 1388 1389 setMlsData = (data) => { 1390 this.element.setAttribute('mls_data', JSON.stringify(data)); 1391 } 1392 1393 show() { 1394 this.element.setAttribute('style', 'display:flex') 1395 } 1396 1397 hide() { 1398 this.element.setAttribute('style', 'display:none') 1399 } 1400 } 1401 1402 class BlueroofMiddlewareApi { 1403 constructor() { 1404 this.baseUrl = "https://brivity-home-middleware.production.brivity.com"; 1405 this.apiKey = localStorage.getItem('authorization'); 1406 } 1407 1408 getMyFeed = async () => { 1409 const response = await fetch(`${this.baseUrl}/listings/voltron`, { 1410 method: 'POST', 1411 headers: { 1412 'Content-Type': 'application/json', 1413 'Authorization': `${this.apiKey}` 1414 }, 1415 body: JSON.stringify([]) 1416 }); 1417 1418 const data = await response.json(); 1419 return data; 1420 } 1421 1422 getLeadBasicInfo = async () => { 1423 const response = await fetch(`${this.baseUrl}/blueroofleads/basicinfo`, { 1424 method: 'GET', 1425 headers: { 1426 'Content-Type': 'application/json', 1427 'Authorization': `${this.apiKey}` 1428 }, 1429 1430 }); 1431 1432 const data = await response.json(); 1433 return data; 1434 } 1435 1436 getAgentProfile = async (brivityUserId) => { 1437 const response = await fetch(`${this.baseUrl}/blueroofagents/profile`, { 1438 method: 'POST', 1439 headers: { 1440 'Content-Type': 'application/json', 1441 'Authorization': `${this.apiKey}` 1442 }, 1443 body: `{"brivityUserId": ${brivityUserId}}` 1444 1445 }); 1446 1447 const data = await response.json(); 1448 return data; 1449 } 1450 1451 } 1452 1453 class Map { 1454 constructor(){ 1455 this.element = document.querySelector('place-map'); 1456 this.properties = []; 1457 1458 this.element.addEventListener('on_marker_clicked', (e) => { 1459 Pubsub.publish('map_marker_clicked', e.detail.id) 1460 }); 1461 } 1462 1463 setMarkers = (properties) => { 1464 let markers = []; 1465 let color = 'black' 1466 1467 let dateNow = new Date(); 1468 dateNow.setDate(dateNow.getDate()-7); 1469 dateNow.setHours(dateNow.getHours()); 1470 dateNow.setMinutes(dateNow.getMinutes()); 1471 dateNow.setSeconds(dateNow.getSeconds()); 1472 const sevenDaysAgo = dateNow.getTime(); 1473 1474 this.properties = properties; 1475 properties?.forEach(property => { 1476 1477 if(property.statusText == 'Active'){ 1478 color = '#1FA6E8' 1479 }else if(property.statusText == 'Pending'){ 1480 color = '#FFC82C' 1481 }else if(property.statusText == 'Sold'){ 1482 color = '#FF7343' 1483 } 1484 1485 let listDate = new Date(property.listDate); 1486 1487 1488 if(listDate.getTime() > sevenDaysAgo){ 1489 color = '#24D0BC' 1490 } 1491 1492 markers.push({ 1493 id: `${property.blossorId}`, 1494 location: property.location, 1495 price: property.price, 1496 color : color 1497 }) 1498 }); 1499 1500 this.element.setAttribute('markers', JSON.stringify(markers)); 1501 } 1502 1503 setSelectedMarker = (property) => { 1504 let markerIndex = this.properties.findIndex((p) => p.blossorId == property.blossorId) 1505 if(markerIndex > -1){ 1506 this.element.setAttribute('selected_property_index', markerIndex); 1507 } 1508 } 1509 1510 clearSelectedMarker = () => { 1511 this.element.setAttribute('selected_property_index', -1); 1512 } 1513 1514 } 1515 1516 class SavedListings { 1517 constructor(){ 1518 this.element = document.getElementById('collection-saved-listings'); 1519 } 1520 1521 setCount(count) { 1522 this.element.innerText = `Saved Listings (${count})`; 1523 } 1524 1525 hide() { 1526 this.element.style.display = `none`; 1527 } 1528 show() { 1529 this.element.style.display = `block`; 1530 } 1531 } 1532 1533 class AddListingBtn { 1534 constructor(){ 1535 this.element = document.getElementById('add-listing-btn'); 1536 this.element.setAttribute('button_style', JSON.stringify({paddingLeft: '0px'})); 1537 this.element.addEventListener('on_press', (e) => { 1538 window.open('../../search.php', '_blank') 1539 }) 1540 } 1541 1542 hide() { 1543 this.element.style.display = `none`; 1544 } 1545 show() { 1546 this.element.style.display = `block`; 1547 } 1548 } 1549 1550 class Page { 1551 constructor(blueroofMiddlewareApi) { 1552 this.selectedCollection = {}; 1553 this.inPropertyView = false;
1554 this.lead = {} 1555 this.agent = {} 1556 this.isInMapView = false; 1557 this.isInListView = true; 1558 1559 this.authorizationData = JSON.parse(atob(blueroofMiddlewareApi.apiKey.split('.')[1])); 1560 this.is_blueroof_person = this.authorizationData?.is_blueroof_person; 1561 1562 1563 } 1564 1565 setSelectedCollection(collection) { 1566 this.selectedCollection = collection; 1567 } 1568 1569 setInPropertyView(inPropertyView) { 1570 this.inPropertyView = inPropertyView; 1571 } 1572 } 1573 1574 1575 class messagingEmitter extends Messaging.BaseEmitter { 1576 1577 newMessage(message) { 1578 Pubsub.publish('messaging_emitter_new_message', message); 1579 } 1580 } 1581 1582 1583 1584 (async () => { 1585 1586 const blueroofMiddlewareApi = new BlueroofMiddlewareApi(); 1587 const page = new Page(blueroofMiddlewareApi); 1588 1589 let url = 'https://messaging.brivity.com' 1590 const messaging = new Messaging.Service(url, blueroofMiddlewareApi.apiKey, new messagingEmitter()); 1591 1592 let lead = await blueroofMiddlewareApi.getLeadBasicInfo(); 1593 let agent = await blueroofMiddlewareApi.getAgentProfile(lead.data?.brivity_agent_id); 1594 1595 page.lead = lead.data; 1596 page.agent = agent.data; 1597 1598 const collectionsService = new Collections.Service(window?.globalSiteVariables?.options?.apis?.collections?.url ?? '',blueroofMiddlewareApi.apiKey, "sitebuilder", new logger()); 1599 1600 1601 const menu = new Menu(page?.is_blueroof_person || false, page?.agent, blueroofMiddlewareApi.baseUrl, blueroofMiddlewareApi.apiKey); 1602 const collectionSection = new CollectionSection() 1603 const propertySection = new PropertySection() 1604 const collectionModal = new CollectionModal(); 1605 const collectionCreatedModal = new CollectionCreatedModal(); 1606 const deleteCollectionModal = new DeleteCollectionModal();
1607 const editCollectionModal = new EditCollectionModal(); 1608 const shareSavedPropertyModal = new ShareSavedPropertyModal(); 1609 const deletePropertyModal = new DeletePropertyModal(); 1610 const copyPropertyToCollectionModal = new CopyPropertyToCollectionModal(); 1611 const pageSubHeader = new PageSubHeader(); 1612 const collectionPaging = new CollectionPaging(8) 1613 const propertyPaging = new PropertyPaging(8) 1614 const newCollectionBlock = new NewCollectionBlock(); 1615 const addListingsBlock = new AddListingsBlock(); 1616 const myFeed = new MyFeed(blueroofMiddlewareApi, collectionsService); 1617 const map = new Map(); 1618 const savedListings = new SavedListings(); 1619 const addListingBtn = new AddListingBtn(); 1620 1621 collectionPaging.hide(); 1622 propertySection.hide(); 1623 1624 let collections = []; 1625 let extraCollections = 0; 1626 let createCopyCollection = false; 1627 1628 if(!showCollectionByUUID){ 1629 const collectionDescription = document.getElementById("collectionDescription"); 1630 1631 collectionsService.getCollections(0, collectionPaging.collectionsPerPage).then((e) => { 1632 1633 extraCollections = e?.data?.totalCollections 1634 1635 if(e.data.TotalPages > 1) { 1636 collectionPaging.show() 1637 collectionPaging.setPageCount(e.data.TotalPages); 1638 } else { 1639 collectionPaging.setPageCount(1); 1640 } 1641 1642 1643 if(e?.data?.Items){ 1644 collections = e.data.Items; 1645 count = 100; 1646 e.data.Items.forEach((collection) => { 1647 count-- 1648 1649 collectionSection.addCollectionCard(collection, count) 1650 }); 1651 } 1652 1653 copyPropertyToCollectionModal.getCollectionList(collections) 1654 1655 if(collections.length == 0){ 1656 newCollectionBlock.show(); 1657 } 1658 1659 }).catch((e) => { 1660 if(collections.length == 0){ 1661 newCollectionBlock.show(); 1662 } 1663 }); 1664 } 1665 else{ 1666 collectionsService.getCollections(0, collectionPaging.collectionsPerPage).then((e) => { 1667 1668 if(e?.data?.Items){ 1669 collections = e.data.Items; 1670 } 1671 1672 }); 1673 } 1674 1675 Pubsub.subscription('property_card_mouseenter', (property) => { 1676 1677 document.querySelectorAll('place-propertycard').forEach((propertyCard) => { 1678 propertyCard.setAttribute('show_border', false); 1679 }) 1680 1681 if(page.isInMapView){ 1682 map.setSelectedMarker(property) 1683 } 1684 }).subscribe(); 1685 1686 Pubsub.subscription('property_card_mouseleave', () => { 1687 if(page.isInMapView){ 1688 map.clearSelectedMarker() 1689 } 1690 }).subscribe(); 1691 1692 Pubsub.subscription('messaging_emitter_new_message', (message) => { 1693 toast.show('New message from ' + message.createdByAlias) 1694 }).subscribe(); 1695 1696 Pubsub.subscription('property_section_show_map_view', (properties) => { 1697 map.setMarkers(properties); 1698 page.isInMapView = true; 1699 page.isInListView = false; 1700 1701 document.querySelectorAll('place-propertycard').forEach((propertyCard) => { 1702 propertyCard.setAttribute('show_border_on_hover', true); 1703 }) 1704 }).subscribe(); 1705 1706 Pubsub.subscription('property_section_show_list_view', (properties) => { 1707 page.isInMapView = false;
1708 page.isInListView = true; 1709 1710 document.querySelectorAll('place-propertycard').forEach((propertyCard) => { 1711 propertyCard.setAttribute('show_border_on_hover', false); 1712 }) 1713 1714 }).subscribe(); 1715 1716 Pubsub.subscription('property_page_changed', (page) => { 1717 collectionsService.getCollectionProperties(propertySection.collectionUUID, page, propertyPaging.propertiesPerPage).then((collectionProperties) => { 1718 map.setMarkers(collectionProperties?.data?.properties); 1719 savedListings.setCount(collectionProperties?.data?.totalListings || 0); 1720 propertySection.show(propertySection.collectionUUID,collectionProperties) 1721 propertySection.setPropertyCardWidth(); 1722 propertyPaging.setCurrentPage(page); 1723 }); 1724 }).subscribe(); 1725 1726 Pubsub.subscription("top_header_menu_item_pressed", (menuItemPressed) => { 1727 1728 if(menuItemPressed == 'Edit Collection'){ 1729 collectionModal.setName(page.selectedCollection.collectionName); 1730 collectionModal.setDescription(page.selectedCollection.collectionDescription); 1731 collectionModal.show(page.selectedCollection.collectionUUID, true); 1732 } 1733 else if(menuItemPressed == 'Delete Collection'){ 1734 deleteCollectionModal.show(page.selectedCollection); 1735 } 1736 }).subscribe(); 1737 1738 Pubsub.subscription('new_collection_block_create_collection_pressed', (e) => { 1739 collectionModal.show(0, false); 1740 }).subscribe(); 1741 1742 Pubsub.subscription('collection_card_pressed', (e) => { 1743 1744 window.location.hash = e.collection.collectionUUID; 1745 1746 page.setSelectedCollection(e.collection); 1747 1748 collectionsService.getCollectionProperties(e.collection.collectionUUID,1, propertyPaging.propertiesPerPage).then((collectionProperties) => { 1749 1750 1751 savedListings.setCount(collectionProperties?.data?.totalListings || 0); 1752 propertyPaging.setPageCount(collectionProperties.data.totalPages); 1753 1754 1755 if(collectionProperties?.data?.properties == null){ 1756 addListingsBlock.show(); 1757 } 1758 propertySection.show(e.collection.collectionUUID,collectionProperties) 1759 propertySection.setPropertyCardWidth(); 1760 1761 if(collectionProperties.data.totalPages > 1){ 1762 propertyPaging.show(); 1763 } 1764 1765 }); 1766 1767 1768 collectionSection.hide(); 1769 1770 let collectionList = []; 1771 1772 collections.forEach(collection => { 1773 if (collection.collectionName == e.collection.collectionName) return; 1774 1775 collectionList.push({ 1776 collection_title: collection.collectionName, 1777 id: collection.collectionUUID, 1778 propertiesImages: collection?.propertiesImages?.length > 0 ? collection?.propertiesImages : [], 1779 }) 1780 }); 1781 1782 copyPropertyToCollectionModal.getCollectionList(collections, e.collection.collectionName); 1783 1784 pageSubHeader.showTopHeader(); 1785 pageSubHeader.setTopHeaderTitle("Collections"); 1786 pageSubHeader.setTitle(e.collection.collectionName); 1787 pageSubHeader.hidePrimaryButton(); 1788 pageSubHeader.showMenuButton(); 1789 1790 if(window.innerWidth > 768 ){ 1791 pageSubHeader.showSecondaryButton(); 1792 } 1793 1794 page.setInPropertyView(true) 1795 1796 propertyPaging.setCurrentPage(1); 1797 propertySection.setView('list') 1798 1799 1800 const collectionDescription = document.getElementById('collection-description') 1801 collectionDescription.style.display="flex" 1802 collectionDescription.children[0].innerText = e?.collection.collectionDescription || "" 1803 }).subscribe(); 1804 1805 Pubsub.subscription('collection_card_menu_item_pressed', (e) => { 1806 if (e.menuItem == "Delete Collection") { 1807 1808 deleteCollectionModal.show(e.collection); 1809 1810 } else { 1811 1812 1813 collectionModal.setName(e.collection.collectionName); 1814 collectionModal.setDescription(e.collection.collectionDescription); 1815 collectionModal.show(e.collection.collectionUUID, true); 1816 } 1817 }).subscribe(); 1818 1819 Pubsub.subscription('property_card_menu_item_pressed', (e) => { 1820 if(e.menuItem == 'Remove from Collection') { 1821 deletePropertyModal.show(e.collectionUUID, e.propertyCollectionUUID); 1822 } 1823 else if(e.menuItem == 'Copy to Collection') { 1824 copyPropertyToCollectionModal.show(e.property); 1825 } 1826 else if(e.menuItem == 'Share Property') { 1827 1828 shareSavedPropertyModal.show(e.property); 1829 } 1830 }).subscribe(); 1831 1832 Pubsub.subscription('delete_property_modal_pressed', (e) => { 1833 deletePropertyModal.show(e.collectionUUID, e.propertyCollectionUUID); 1834 }).subscribe(); 1835 1836 Pubsub.subscription('show_new_collection_modal', (e) => { 1837 collectionModal.show(); 1838 copyPropertyToCollectionModal.hide(); 1839 createCopyCollection = true; 1840 }).subscribe(); 1841 1842 Pubsub.subscription('top_header_back_pressed', () => { 1843 window.location.hash = ''; 1844 pageSubHeader.hideTopHeader(); 1845 page.selectedCollection = {}; 1846 pageSubHeader.setTitle("COLLECTIONS"); 1847 pageSubHeader.showPrimaryButton(); 1848 pageSubHeader.hideSecondaryButton(); 1849 pageSubHeader.hideMenuButton(); 1850 1851 page.setInPropertyView(false) 1852 1853 collectionSection.show(); 1854 propertySection.hide() 1855 1856 propertyPaging.setCurrentPage(1); 1857 1858 copyPropertyToCollectionModal.getCollectionList(collections) 1859 1860 const collectionDescription = document.getElementById('collection-description') 1861 collectionDescription.style.display="none" 1862 collectionDescription.children[0].innerText = ""; 1863 addListingsBlock.hide(); 1864 }).subscribe() 1865 1866 Pubsub.subscription('create_new_collection_pressed', (e) => { 1867 collectionModal.show(0, false); 1868 }).subscribe(); 1869 1870 Pubsub.subscription('on_new_collection_saved', (e) => { 1871 if(e.type == 'save'){ 1872 1873 let people = [{ personUUID: page.lead.brivity_uuid, role: "lead" }]; 1874 let properties = [""]; 1875 collectionsService.createCollection(e.name, e.description, page.lead.brivity_uuid, people, properties).then((e) => { 1876 1877 collections.unshift(e.data); 1878 1879 extraCollections++ 1880 if(collections.length > 8) { 1881 collections.pop(); 1882 collectionPaging.show() 1883 collectionPaging.setPageCount(Math.ceil(extraCollections / 8)); 1884 } 1885 1886 count = 100; 1887 collectionSection.collections.innerHTML = ""; 1888 collections.forEach((collection) => { 1889 count-- 1890 collectionSection.addCollectionCard(collection, count) 1891 }); 1892 1893 let collectionsList = copyPropertyToCollectionModal.getCollectionData(); 1894 let newCollection = { 1895 collection_title: e.data.collectionName, 1896 id: e.data.collectionUUID, 1897 propertiesImages: [], 1898 } 1899 collectionsList.unshift(newCollection); 1900 copyPropertyToCollectionModal.setCollectionData(collectionsList); 1901 1902 if(!copyPropertyToCollectionModal.isVisible){ 1903 if (createCopyCollection) { 1904 copyPropertyToCollectionModal.isVisible = true; 1905 copyPropertyToCollectionModal.element.setAttribute('style', 'display:flex'); 1906 createCopyCollection = false;
1907 } else { 1908 collectionCreatedModal.show(e.data); 1909 } 1910 } 1911 1912 collectionModal.hide(); 1913 1914 newCollectionBlock.hide(); 1915 }).catch((e) => { 1916 collectionModal.showError(true) 1917 }); 1918 } 1919 else{ 1920 collectionsService.updateCollection(e.collectionUUID, e.name, e.description).then((collection) => { 1921 let element = document.getElementById(e.collectionUUID); 1922 element.setAttribute('title', e.name); 1923 element.setAttribute('description', e.description); 1924 if(Object.keys(page.selectedCollection).length !== 0){ 1925 pageSubHeader.setTitle(e.name); 1926 } 1927 const collectionDescription = document.getElementById('collection-description') 1928 collectionDescription.children[0].innerText = e.description; 1929 let updatedCollection = collections.findIndex((c) => c.collectionUUID == e.collectionUUID) 1930 if(updatedCollection != -1){ 1931 collections[updatedCollection].collectionName = e.name; 1932 collections[updatedCollection].collectionDescription = e.description; 1933 } 1934 collectionModal.hide(); 1935 editCollectionModal.show(); 1936 }); 1937 } 1938 }).subscribe(); 1939 1940 Pubsub.subscription('collection_created_modal_view_collection_pressed', (collection) => { 1941 Pubsub.publish('collection_card_pressed', {"collection": collection}) 1942 }).subscribe(); 1943 1944 Pubsub.subscription('delete_collection_modal_delete_pressed', (collection) => { 1945 collectionsService.deleteCollection(collection.collectionUUID).then((e) => { 1946 document.getElementById(collection.collectionUUID).remove(); 1947 toast.show('Collection was Deleted') 1948 1949 extraCollections-- 1950 1951 if(extraCollections.length < 9) { 1952 collectionPaging.hide() 1953 }else{ 1954 collectionPaging.setPageCount(Math.ceil(extraCollections / 8)); 1955 } 1956 1957 if(page.inPropertyView){ 1958 Pubsub.publish('top_header_back_pressed'); 1959 } 1960 }); 1961 }).subscribe(); 1962 1963 Pubsub.subscription('delete_property_modal_delete_pressed', (e) => { 1964 const currentPage = $("#property-pagination").find("#info-parent").filter( 1965 function() { 1966 return $(this).css("color") === "rgb(196, 196, 196)" 1967 } 1968 ).text(); 1969 1970 const propertiesPerPage = 8; 1971 const numOfProperties = $("#property-list .property-card-wrapper").length; 1972 const setPage = numOfProperties === 1 ? currentPage - 1 : currentPage; 1973 1974 collectionsService.removePropertyFromCollection(e.collectionUUID, e.propertyCollectionUUID) 1975 .then(() => { 1976 toast.show('Property removed from collection'); 1977 1978 return collectionsService.getCollectionProperties(e.collectionUUID, setPage, propertiesPerPage); 1979 }) 1980 .then((collectionProperties) => { 1981 const totalListingsCount = collectionProperties?.data?.totalListings; 1982 const properties = collectionProperties?.data?.properties; 1983 const totalPages = collectionProperties?.data?.totalPages; 1984 const currentCollection = $(`#${e.collectionUUID}`); 1985 1986 currentCollection.attr("num_properties", totalListingsCount); 1987 1988 map.setMarkers(properties); 1989 savedListings.setCount(totalListingsCount || 0); 1990 propertySection.show(propertySection.collectionUUID, collectionProperties); 1991 propertySection.setPropertyCardWidth(); 1992 1993 propertyPaging.setCurrentPage(setPage); 1994 propertyPaging.setPageCount(totalPages); 1995 1996 if (totalListingsCount <= 8) { 1997 propertyPaging.hide(); 1998 } 1999 }) 2000 .catch(error => { 2001 console.error("Error in collection operations:", error); 2002 }); 2003 }).subscribe(); 2004 2005 Pubsub.subscription('copy_property_to_collection_modal_save_pressed', (e) => { 2006 2007 let collectionUUID = e.collectionUUID; 2008 let blossorId = e.property.blossorId; 2009 collectionsService.addPropertyToCollection(collectionUUID, [blossorId]).then(() => { 2010 2011 2012 let data = copyPropertyToCollectionModal.getCollectionData(); 2013 let myFeedData = myFeed.getMlsData(); 2014 2015 collectionsService.getCollectionProperties(collectionUUID,1,1).then((e) => { 2016 2017 // update photos in add property to collection modal 2018 let collectionIndex = data.findIndex((x) => x.id == collectionUUID); 2019 let collection = data[collectionIndex]; 2020 let photo = e?.data?.properties[0]?.photos[0]?.url; 2021 2022 collection.propertiesImages = []; 2023 if(e?.data?.properties?.length > 0){ 2024 collection.propertiesImages.push({mainPhoto: photo}); 2025 } 2026 2027 data[collectionIndex] = collection; 2028 2029 copyPropertyToCollectionModal.setCollectionData(data); 2030 2031 2032 // update collection card if in collection view 2033 pageCollectionIndex = collections.findIndex((x) => x.collectionUUID == collectionUUID) 2034 2035 if(pageCollectionIndex > -1){ 2036 2037 let collectionCard = document.getElementById(collectionUUID); 2038 let numProperties = parseInt(collectionCard.getAttribute('num_properties')); 2039 numProperties++; 2040 collectionCard.setAttribute('num_properties', numProperties); 2041 2042 let images = collectionCard.getAttribute('image'); 2043 if(images){ 2044 images += "," + photo; 2045 } 2046 else{ 2047 images = photo; 2048 } 2049 2050 collectionCard.setAttribute('image', images); 2051 } 2052 2053 //update my feed to set property heart as favorited 2054 let myFeedPropertyIndex = myFeedData.findIndex((x) => x.blossorId == blossorId); 2055 if(myFeedPropertyIndex > -1){ 2056 myFeedData[myFeedPropertyIndex].favorite = true; 2057 myFeed.setMlsData(myFeedData); 2058 } 2059 2060 }) 2061 2062 copyPropertyToCollectionModal.hide(); 2063 toast.show('Property added to collection') 2064 2065 }).catch((e) => { 2066 toast.show('Error adding property to collection', true) 2067 }); 2068 }).subscribe(); 2069 2070 Pubsub.subscription('collection_page_changed', (e) => { 2071 collectionsService.getCollections(e, collectionPaging.collectionsPerPage).then((e) => { 2072 if(e?.data?.Items){ 2073 collections = e.data.Items; 2074 2075 collectionSection.collections.innerHTML = ""; 2076 count = 100;
2077 e.data.Items.forEach((collection) => { 2078 count-- 2079 2080 collectionSection.addCollectionCard(collection, count) 2081 }); 2082 } 2083 }); 2084 }).subscribe(); 2085 2086 Pubsub.subscription('share_saved_property_modal_share_pressed', (e) => { 2087 toast.show('Link Copied!') 2088 }).subscribe(); 2089 2090 Pubsub.subscription('my_feed_share_pressed', (e) => { 2091 shareSavedPropertyModal.show(e.property); 2092 }).subscribe(); 2093 2094 Pubsub.subscription('my_feed_add_collection_pressed', (e) => { 2095 copyPropertyToCollectionModal.setIsAddingToCollection(true); 2096 copyPropertyToCollectionModal.show(e.property); 2097 }).subscribe(); 2098 2099 Pubsub.subscription('map_marker_clicked', (id) => { 2100 propertySection.scrollIntoView(id); 2101 2102 document.querySelectorAll('place-propertycard').forEach((propertyCard) => { 2103 if(propertyCard.id == id) { 2104 propertyCard.setAttribute('show_border', true) 2105 } 2106 else { 2107 propertyCard.setAttribute('show_border', false) 2108 } 2109 }) 2110 }).subscribe(); 2111 2112 Pubsub.subscription('my_feed_on_favorite_pressed', (e) => { 2113 copyPropertyToCollectionModal.setIsAddingToCollection(true); 2114 copyPropertyToCollectionModal.show(e.property); 2115 }).subscribe(); 2116 2117 Pubsub.subscription('my_feed_on_unfavorite_pressed', (e) => { 2118 let blossorId = e.property.blossorId; 2119 let myFeedData = myFeed.getMlsData(); 2120 collectionsService.checkIfInCollection([blossorId]).then((propertiesInCollections) => { 2121 if(propertiesInCollections.data[blossorId]){ 2122 propertiesInCollections.data[blossorId].forEac
2122h((collection) => { 2123 collectionsService.removePropertyFromCollection(collection.collectionUUID, collection.propertyUUID).then(() => { 2124 2125 let data = copyPropertyToCollectionModal.getCollectionData(); 2126 let collectionUUID = collection.collectionUUID; 2127 collectionsService.getCollectionProperties(collectionUUID,1,1).then((e) => { 2128 2129 // update photos in add property to collection modal 2130 let collectionIndex = data.findIndex((x) => x.id == collectionUUID); 2131 let collection = data[collectionIndex]; 2132 let photo = e?.data?.properties?.length > 0 ? e?.data?.properties[0]?.photos[0]?.url : ''; 2133 2134 collection.propertiesImages = []; 2135 if(e?.data?.properties?.length > 0){ 2136 collection.propertiesImages.push({mainPhoto: photo}); 2137 } 2138 2139 data[collectionIndex] = collection; 2140 2141 copyPropertyToCollectionModal.setCollectionData(data); 2142 2143 2144 // update collection card if in collection view 2145 pageCollectionIndex = collections.findIndex((x) => x.collectionUUID == collectionUUID) 2146 2147 if(pageCollectionIndex > -1){ 2148 2149 let collectionCard = document.getElementById(collectionUUID); 2150 let numProperties = parseInt(collectionCard.getAttribute('num_properties')); 2151 numProperties--; 2152 collectionCard.setAttribute('num_properties', numProperties); 2153 2154 let images = collectionCard.getAttribute('image'); 2155 let newImages = images.split(',').filter((x) => x == photo).join(','); 2156 collectionCard.setAttribute('image', newImages); 2157 } 2158 2159 //update my feed to set property heart as not favorited 2160 let myFeedPropertyIndex = myFeedData.findIndex((x) => x.blossorId == blossorId); 2161 if(myFeedPropertyIndex > -1){ 2162 myFeedData[myFeedPropertyIndex].favorite = false; 2163 myFeed.setMlsData(myFeedData); 2164 } 2165 }) 2166 toast.show('Property removed from collection'); 2167 }).catch((e) => { 2168 toast.show('Error removing from collection', true); 2169 }); 2170 }); 2171 } 2172 }); 2173 }).subscribe(); 2174 2175 let modalBackdrop = document.getElementsByClassName('center-modal'); 2176 for(let i = 0; i < modalBackdrop.length; i++){ 2177 modalBackdrop[i].addEventListener('click', (e) => { 2178 if(e.target == modalBackdrop[i]){ 2179 modalBackdrop[i].style.display = 'none'; 2180 } 2181 }); 2182 } 2183 2184 window.addEventListener( "hashchange", function( event ) { 2185 if(window.location.hash == ''){ 2186 Pubsub.publish("top_header_back_pressed"); 2187 } 2188 }); 2189 2190 2191 document.addEventListener("click", (e) => { 2192 2193 const elements = document.querySelectorAll("[show_menu]");
2194 elements.forEach((el) => { 2195 el.setAttribute("show_menu", "false"); 2196 }); 2197 2198 document.getElementById("c2dfac72-6233-4e8d-b0d2-f44e4240ebb4")?.setAttribute("show_menu", "false"); 2199 }); 2200 if(window.innerWidth < 768 ){ 2201 savedListings.hide(); 2202 pageSubHeader.hideSecondaryButton(); 2203 } else{ 2204 addListingBtn.hide(); 2205 } 2206 })(); 2207 } 2208 }) 2209 2210</script>
2210 <div id="myportal-page" style="display:none"> <div style="position:relative; width:100%;"> <div style="position:absolute;z-index:110; top:0; bottom:0; "> <place-menu></place-menu> </div> <div class="collection-page" style="flex:1;"> <div class="page-width-parent"> <place-pagesubheader title="COLLECTIONS" show_top_header="false" button_title="Create New" button_icon="plus" secondary_button_icon="plus" secondary_button_title="Add Listings" show_secondary_button="false" show_menu="false" menu_items='[{ "icon": "edit-2", "text": "Edit Collection" },{ "icon": "trash", "text": "Delete Collection" }]' ></place-pagesubheader> <div id="collection-description" class="collection-description" style="display:none;"> <p class="collection-description-text" style="" ></p> </div> <div id="collection-section" style="margin-top:24px;"> <div id="collections" style="display:flex; flex-wrap:wrap"> <place-actioncard id="new-collection-block" style="display:none;" title="Create A Collection" sub_title="You can create a collection to save and keep track of your favorite properties." button_text="Create New" button_icon="plus" button_icon_fill="white" card_width="300" /> </div> <place-pagination id="collection-pagination" style="display:none"></place-pagination> <div class="my-feed-parent"> <place-myfeedblock style="display:none" display_menu="false"></place-myfeedblock> </div> </div> <div id="property-section"> <div id="property-header" style="display:flex; justify-content: space-between"> <p id="collection-saved-listings" class="collection-saved-listings"></p> <place-button icon="plus" ghost="true" btn_text_styles="text-[#5386E4]" icon_stroke="#5386E4" id="add-listing-btn" title="Add Listing"></place-button> <div style="padding: 0 5px; display:flex"> <place-icon id="property-list-icon" style="margin-right:10px" name="list" size="24" fill="none" stroke="black"></place-icon> <place-icon id="property-map-icon" name="map" size="24" fill="none" stroke="gray"></place-icon> </div> </div> <div class="property-container" style=""> <div id="property-list-parent"> <div id="property-list" class="property-list-list-view"> </div> <div> <place-actioncard id="add-listings-block" style="display:none;" title="Add Listings" sub_title="You can search and add properties to a collection to keep track of your favorite homes using the heart icon." button_text="Search Listings" button_icon="search" button_icon_fill="white" card_width="300" /> </div> </div> <div id="property-map" class="property-map-container" style="display:none" > <place-map map_type_control="true" zoom_control="true"> </place-map> </div> </div> <place-pagination id="property-pagination" class="property-pagination" style="display:none"></place-pagination> </div> </div> </div> </div> <place-basicmodal id="collection-created-modal" class="center-modal" style="display:none" title="Collection Created" sub_title="Would you like to add listings to your new collection? You can search for new listings or copy them from an existing collection." title_icon="heart" primary_button_text="View Collection" tertiary_button_text="Search" stacked_buttons="true" ></place-basicmodal> <place-basicmodal id="delete-collection-modal" class="center-modal" style="display:none" title="Delete Collection" sub_title="Deleting a collection will permanently remove it from your account. Your saved properties will only be visible in your Favorites collection." description="Are you sure you would like to delete this collection?" title_icon="trash" primary_button_text="Delete" tertiary_button_text="Cancel" no_stack_buttons="true" ></place-basicmodal> <place-basicmodal id="edit-collection-modal" class="center-modal" style="display:none" title="Changes Saved" sub_title="The changes to your collection have been saved." title_icon="check" primary_button_text="Close" ></place-basicmodal> <place-basicmodal id="delete-property-modal" class="center-modal" style="display:none" title="Remove Property" sub_title="Deleting this property will remove it from the current collection. Are you sure you would like to delete this property from your collection?" title_icon="trash" primary_button_text="Delete" tertiary_button_text="Cancel" no_stack_buttons="true" ></place-basicmodal> <place-basicmodal id="share-saved-property-modal" class="center-modal" style="display:none" title="Share Property" sub_title="Copy link to share property." title_icon="share" primary_button_text="Copy Link" ></place-basicmodal> <place-copycollectionmodal class="center-modal" style="display:none" collections='[]' ></place-copycollectionmodal> <place-collectionpopup class="center-modal" style="display:none"></place-collectionpopup> </div> <footer data-selector="footer" class="" id="footer-9n" style="outline-offset: -3px;"> <div class="container"> <div class="row"> <div class="col-md-2"> <div class="render-menu hot-nav"> <ul class="" style="outline: none; cursor: inherit;"> <li class="nav-item" data-selector="li"> <a href="/index" style="outline: none; cursor: inherit;">Home</a> </li> <li class="nav-item" data-selector="li"> <a href="/search" style="outline: none; cursor: inherit;">Listings</a> </li> <li class="nav-item" data-selector="li"> <a href="/buying" style="outline: none; cursor: inherit;">Buying</a> </li> <li class="nav-item" data-selector="li"> <a class="white" href="/selling" style="outline: none; cursor: inherit;">Selling</a> </li> <li class="nav-item" data-selector="li"> <a href="/financing" style="outline: none; cursor: inherit;">Financing</a> </li> <li class="nav-item" data-selector="li"> <a href="/home_value" style="outline: none; cursor: inherit;">Home Value</a> </li> <li class="nav-item" data-selector="li"> <a href="/realestateagent/search" style="outline: none; cursor: inherit;">Who We Are</a> </li> <li class="nav-item" data-selector="li"> <a href="/connect" style="outline: none; cursor: inherit;">Connect</a> </li> </ul> </div> </div>
2210 <div class="col-md-7 col-md-offset-1"> <form id="form-contact1" action="" class="form-contact"> <div class="row margin-bottom-0"> <div class="col-sm-6" style="margin-bottom: 20px;"> <div class="form-group"> <input name="contact1_fname" id="contact1_fname" placeholder="First Name" class="form-control contact_fname" type="text" required="" style='background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVQ4EaVTO26DQBD1ohQWaS2lg9JybZ+AK7hNwx2oIoVf4UPQ0Lj1FdKktevIpel8AKNUkDcWMxpgSaIEaTVv3sx7uztiTdu2s/98DywOw3Dued4Who/M2aIx5lZV1aEsy0+qiwHELyi+Ytl0PQ69SxAxkWIA4RMRTdNsKE59juMcuZd6xIAFeZ6fGCdJ8kY4y7KAuTRNGd7jyEBXsdOPE3a0QGPsniOnnYMO67LgSQN9T41F2QGrQRRFCwyzoIF2qyBuKKbcOgPXdVeY9rMWgNsjf9ccYesJhk3f5dYT1HX9gR0LLQR30TnjkUEcx2uIuS4RnI+aj6sJR0AM8AaumPaM/rRehyWhXqbFAA9kh3/8/NvHxAYGAsZ/il8IalkCLBfNVAAAAABJRU5ErkJggg=="); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%; cursor: auto;'> </div> </div> <div class="col-sm-6" style="margin-bottom: 20px;"> <div class="form-group"> <input name="contact1_lname" id="contact1_lname" placeholder="Last Name" class="form-control contact_lname" type="text" required=""> </div> </div> </div> <div class="row margin-bottom-0"> <div class="col-sm-6" style="margin-bottom: 20px;"> <div class="form-group"> <input name="contact1_email" id="contact1_email" placeholder="Email Address" class="form-control contact_email" type="email" required=""> </div> </div> <div class="col-sm-6" style="margin-bottom: 20px;"> <div class="form-group"> <input name="contact1_phone" id="contact1_phone" placeholder="Phone Number" class="form-control contact_phone" type="tel" required=""> </div> </div> </div> <div class="row margin-bottom-0"> <div class="col-sm-12" style="margin-bottom: 20px;"> <i class="fa fa-caret-down" style="position: absolute; top: 13px; right: 30px; font-size: 14px;" data-selector=".fa"></i> <select name="lead_type" style="width: 100%; height: 40px; padding-left: 12px; font-size: 14px; border-radius: 0; -webkit-appearance: none; -webkit-border-radius: 0px;"> <option value="buyer">I'm interested in buying a home</option> <option value="seller">I'm interested in selling a home</option> <option value="seller/buyer">I'm interested in buying and selling</option> <option value="tenant">I'm interested in finding a home to rent</option> <option value="recruit">I'm interested in a real estate career</option> <option value="n/a">Other reason to contact an agent</option> </select> </div> </div> <div class="row margin-bottom-0"> <div class="col-sm-12" style="margin-bottom: 20px;"> <textarea name="contact1_message" id="contact1_message" class="form-control contact_message" rows="3" placeholder="Your Message"></textarea> </div> </div> <div class="text-right"> <input type="text" id="contact1_robot_field" name="contact1_robot_field" style="display: none;"><button type="submit" class="btn btn-primary squared" data-selector="a.btn, button.btn, button">Send Us A Message</button> </div> <div id="honeypot-div"> <input name="age_required" id="age_required" value="" type="text" style="display: none;"> </div> </form> </div> <div class="col-md-2 col-md-offset-1"> <img class="ftr-logo" src="https://images.brivityidx.com/assets/images/uploads/107878/Darin7278_solo_logo.png" alt="Buy and Sell Homes Real Estate" data-selector="img" style="border-style: none;"> <h3 class="text-left margin-top-40" data-selector="h1, h2, h3, h4, h5, h6">Reach Out</h3> <div class="text-left" style="outline: medium none; cursor: inherit;"> <ul style="list-style-type: none; outline: none; cursor: inherit;"> <li data-selector="li"> <span class="agent_address_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading"></span> <br><span class="agent_city_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading"></span>, <span class="agent_state_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading"></span> <span class="agent_zip_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading"></span> </li> <li data-selector="li"> Real Estate: <a class="agent_phone_dynami" href="tel:(785)%20251-0717" src="tel:" style="outline: none; cursor: inherit;">(785) 251-0717</a><br> Property Management: <a class="agent_phone_dynami" href="tel:(785)%20325-9337" src="tel:" style="outline: none; cursor: inherit;">(785) 325-9337</a> </li> </ul> </div> </div> </div> <div class="row ftr-anchor"> <div class="col-sm-6 anchor-col no-padding editContent" data-selector=".editContent"> <p class="no-margin" data-selector="p"><span class="get_this_year">2021</span> © <strong>Stone & Story Real Estate Group</strong></p> <p style="margin: 10px 0px; outline: none; cursor: inherit;" data-selector="p"> <img src="https://images.brivityidx.com/assets/images/uploads/1428/Equal-Housing-Realtor_gray50.png" alt="Equal Housing | Realtor" style="width: 50px; outline: none; cursor: inherit;" data-selector="img">  Each office is independently owned and operated. </p> </div> <div class="col-sm-6 anchor-col no-padding"> <ul class="social" style="outline: none; cursor: inherit;"> <li data-selector="li" class="agent_facebook_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://www.facebook.com/Brivity"><a class="btn btn-block agent_facebook_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://www.facebook.com/Brivity" target="blank" data-selector="a.btn, button.btn, button"><i class="fa fa-2x fa-facebook fa-adjust prmry-color" data-selector=".fa"></i></a></li> <li data-selector="li" class="agent_twitter_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://twitter.com/Brivity"><a class="btn btn-block agent_twitter_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://twitter.com/Brivity" target="blank" data-selector="a.btn, button.btn, button"><i class="fa fa-2x fa-twitter fa-adjust prmry-color" data-selector=".fa"></i></a></li> <li data-selector="li" class="agent_instagram_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://www.instagram.com/Brivityplatform/"><a class="btn btn-block agent_instagram_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://www.instagram.com/Brivityplatform/" target="blank" data-selector="a.btn, button.btn, button"><i class="fa fa-2x fa-instagram fa-adjust prmry-color" data-selector=".fa"></i></a></li> <li data-selector="li" class="agent_pinterest_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://www.pinterest.com/"><a class="btn btn-block agent_pinterest_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://www.pinterest.com/" target="blank" data-selector="a.btn, button.btn, button"><i class="fa fa-2x fa-pinterest fa-adjust prmry-color" data-selector=".fa"></i></a></li> <li data-selector="li" class="agent_youtube_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://www.youtube.com/channel/UCWdVYI1u9hnol74ibn62qFw"><a class="btn btn-block agent_youtube_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://www.youtube.com/channel/UCWdVYI1u9hnol74ibn62qFw" target="blank" data-selector="a.btn, button.btn, button"><i class="fa fa-2x fa-youtube fa-adjust prmry-color" data-selector=".fa"></i></a></li> <li data-selector="li" class="agent_linkedin_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://www.linkedin.com/company/brivity"><a class="btn btn-block agent_linkedin_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://www.linkedin.com/company/brivity" target="blank" data-selector="a.btn, button.btn, button"><i class="fa fa-2x fa-linkedin fa-adjust prmry-color" data-selector=".fa"></i></a></li> </ul> </div> </div> </div> </footer> </div> <section id="seo-anchor"> <div class="container"> <ul class="powered-by"> <li>Powered by <a class="pb-vendor" href="https://www.brivity.com/"> Brivity</a></li> <li class="pb-admin-login"><a href="https://login.brivityidx.com/login"><span class='pb-admin-login-text'>Admin Log In</span></a></li> </ul> <ul class="seo-anchor-links"> <li><a href="/privacy_policy">Privacy Policy</a></li> <li><a href="/tos">DMCA & Terms of Service</a></li> <li><a id='sitemapUrl' href='/sitemap' style='display: inline;'>Sitemap</a></li> </ul> </div> </section> <input type="hidden" id="hchatbot_settings" data-chatbot-version="1" value="{"chat_position":"right","call_to_action_text":"Hi there! Please let us know if you have any questions and an agent will reach out to you as soon as possible.","initial_message":"Enter your question below and an agent will be in touch with you.","tags":"IDX Chat","version":"1"}"> 2211<!-- chatbot v1 --> 2212<!-- Chatbot drawer container --> 2213<div class="chatbot-drawer-container loading"> 2214 <div class="chatbot-content-wrapper"> 2215 <div class="chatbot-outside-content"> 2216 <div class="chatbot-bubble-message-container cb-hide"> 2217 <img src="https://cdn.brivity.com/images/people/83546158/3c20754ab60865aca449acdc68f153799d24525b-original.jpg?1767133867" class="chatbot-agent-img" alt="Agent profile image in chat bubble"/> 2218 <div id="call-to-action" class="bubble-message"></div> 2219 <button type="button" class="chatbox-bubble-close" data-dismiss="modal" aria-label="Close">
2220 <span aria-hidden="true">×</span> 2221 </button> 2222 </div> 2223 <button id="chatbot-open-btn" class="chatbot-open-btn bg-prmry" aria-label="Chatbot Open Button"> 2224 <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> 2225 <path d="M20.8 6.35501V16C20.8 17.765 19.365 19.195 17.6 19.195L11.2 19.2L5.755 22.28C5.645 22.365 5.52 22.4 5.4 22.4C5.09 22.4 4.8 22.155 4.8 21.8V19.2H3.2C1.4375 19.2 0 17.765 0 16V6.35501C0 4.63751 1.4375 3.20001 3.2 3.20001H17.6C19.365 3.20001 20.8 4.63751 20.8 6.35501ZM7.2 18.705L10.57 16.8H17.6C18.035 16.8 18.4 16.44 18.4 16V6.40001C18.4 5.96251 18.035 5.60001 17.6 5.60001H3.2C2.7625 5.60001 2.4 5.96251 2.4 6.40001V16C2.4 16.44 2.7625 16.8 3.2 16.8H7.2V18.705ZM12.8 22.4V20.8H15.2V22.4C15.2 22.835 15.56 23.2 16 23.2H21.43L24.8 25.105V23.2H28.8C29.235 23.2 29.6 22.835 29.6 22.4V12.8C29.6 12.365 29.235 12 28.8 12H22.4V9.60001H28.8C30.565 9.60001 32 11.035 32 12.755V22.4C32 24.165 30.565 25.6 28.8 25.6H27.2V28.2C27.2 28.555 26.91 28.8 26.6 28.8C26.48 28.8 26.355 28.765 26.245 28.68L20.8 25.6L16 25.595C14.24 25.595 12.8 24.165 12.8 22.4Z" fill="white"/> 2226 </svg> 2227 </button> 2228 </div> 2229 <div class="chatbot-drawer"> 2230 <div class="chatbot-header bg-prmry"> 2231 <div class="chatbot-agent-info"> 2232 <img src="https://cdn.brivity.com/images/people/83546158/3c20754ab60865aca449acdc68f153799d24525b-original.jpg?1767133867" class="chatbot-agent-img" alt="Agent profile image in chat header"/> 2233 <div class="chatbot-agent"> 2234 <h3 class="chatbot-agent-name">Darin Stephens, PhD</h3> 2235 <h4><span class="chatbot-agent-title">Founder & CEO & Broker</span> | <span class="chatbot-agent-company">Stone & Story Real Estate Group</span></h4> 2236 </div> 2237 <a id="chatbot-agent-phone" style="display: none;">(785) 250-7278</a> 2238 </div> 2239 <button id="close-chatbot-drawer" type="button" class="chatbox-modal-close" data-dismiss="modal" aria-label="Close"> 2240 <span aria-hidden="true">×</span> 2241 </button> 2242 </div> 2243 <div class="chatbot-body"> 2244 <div class="chatbot-message-container"> 2245 <img src="https://cdn.brivity.com/images/people/83546158/3c20754ab60865aca449acdc68f153799d24525b-original.jpg?1767133867" class="chatbot-agent-img" alt="Agent profile image in message"/> 2246 <h4 id="initial_message" class="chatbot-chat-messages not-loaded"></h4> 2247 <div class="chatbot-chat-messages loading"> 2248 <span class="typing-indicator"> 2249 <span></span> 2250 <span></span> 2251 <span></span> 2252 </span> 2253 </div> 2254 </div> 2255 <form id="chatbotForm" class="chatbot-form"> 2256 <input type="name" id="chatbot_fullname" class="chatbox-form-control no-native-focus" placeholder="Full Name" 2257 pattern="^[A-Za-z'\- ]+ [A-Za-z'\- ]+$" 2258 required /> 2259 <input type="tel" id="chatbot_phone" class="chatbox-form-control no-native-focus" placeholder="Phone" required /> 2260 <input type="email" id="chatbot_email" class="chatbox-form-control no-native-focus" placeholder="Email" 2261 pattern="^[^@\s]+@[^@\s]+\.[^@\s]+$" 2262 required /> 2263 <textarea id="chatbot_message" class="chatbox-form-control chatbot-message" rows="5" name="notes" placeholder="Any Comments or Questions"></textarea> 2264 <div class="chatbot-consent-container"> 2265 <div class="chatbot-toggle"> 2266 By proceeding and clicking the sign up button, you consent to receive calls and texts (SMS/MMS) including marketing and promotional communications, from <span class="agent_name_dynamic"></span>, its affiliates, and agents or vendors acting on their behalf. These
2266communications may be delivered using an automatic telephone dialing system or by using an artificial or prerecorded voice. Message and data rates may apply. To opt out of text messages, reply STOP. Your consent is not required as a condition of any purchase. By continuing, you also agree to our <a class="opt-out-href" href="/tos">Terms of Use</a> and <a class="opt-out-href" href="/privacy_policy">Privacy Policy</a>. 2267 </div> 2268 </div> 2269 <input type="hidden" id="chatbot_tags"> 2270 </form> 2271 </div> 2272 <div class="chatbot-footer"> 2273 <button type="submit" form="chatbotForm" class="chatbot-send bg-prmry chatbot-btn-disabled" data-dismiss="modal" aria-label="Close" disabled> 2274 Send 2275 <span aria-hidden="true"> 2276 <svg class="chatbot-btn-icon" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> 2277 <g clip-path="url(#clip0_2435_997)"> 2278 <path d="M14.6667 1.33331L7.33337 8.66665" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 2279 <path d="M14.6667 1.33331L10 14.6666L7.33337 8.66665L1.33337 5.99998L14.6667 1.33331Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 2280 </g> 2281 <defs> 2282 <clipPath id="clip0_2435_997"> 2283 <rect width="16" height="16" fill="white"/> 2284 </clipPath> 2285 </defs> 2286 </svg> 2287 </span> 2288 </button> 2289 </div> 2290 </div> 2291 </div> 2292</div> <style> 2293 .signup-consent-checkbox-section { 2294 display: none; 2295 flex-direction:column; 2296 align-items:flex-start; 2297 padding: 6px 0; 2298 } 2299 2300 .signup-consent-checkbox-section .checkbox { 2301 display:flex; 2302 align-items:flex-start; 2303 justify-content:center; 2304 gap:8px; 2305 padding:0 !important; 2306 } 2307 2308 .signup-consent-checkbox-section .checkbox input { 2309 position:unset; 2310 margin:2px 0 0 0 !important; 2311 } 2312 2313 .signup-consent-checkbox-section .checkbox span { 2314 color: #666666; 2315 font-size: 14px; 2316 font-weight: 400; 2317 line-height:16px; 2318 } 2319 2320 .signup-verbage { 2321 text-align:center; 2322 font-size:10px; 2323 line-height:16px; 2324 } 2325 2326 .signup-verbage span { 2327 color: #8C8C8C; 2328 font-weight:600; 2329 } 2330 2331 .signup-verbage a { 2332 color:#5386E4 !important; 2333 font-weight:400; 2334 } 2335 2336 .signup-verbage .twilio-enabled-verbage { 2337 display:none; 2338 } 2339 2340 2341 2342 </style> <div id="modal-mount" data-modal-bundle="https://cdn1.brivityidx.com/assets/modals/v1/all.html?ck=1789512948"></div>
2342 <div id="credential_picker_container_centered"> <div id="credential_picker_header_bar"> <p><button class="signOrLogBtn" onclick="showSignupModal();">Sign up</button> or <button class="signOrLogBtn" onclick="showLoginModal();">Login</button> another way</p> </div> <div id="credential_picker_header_bar_separator"></div> </div> <place-getyourhomecta id="contact_modal" style="display:none; justify-content: center; align-items: center; position:fixed; background-color:rgba(0,0,0,0.4); left:0; top:0; right:0; bottom:0; z-index: 100;" interest_items='[{"text":"Looking to sell ASAP"},{"text":"Looking to sell (1-3 months)"},{"text":"Looking to sell (3-6 months)"}, {"text":"Looking to sell (6-12 months)"},{"text":"Looking to sell (12+ months)"}, {"text":"Just curious"}]' > </place-getyourhomecta> <place-generictoast appear_from_both="true" container_style="right-1/2 z-200"></place-generictoast>
2342<script> 2343 document.addEventListener("DOMContentLoaded", () => { 2344 class Toast { 2345 constructor() { 2346 this.element = document.querySelector('place-generictoast'); 2347 } 2348 2349 show(message, error = false, link) { 2350 var dispatch = function () { 2351 window.dispatchEvent( 2352 new CustomEvent("ShowToast", { 2353 detail: { 2354 text: message, 2355 error: error, 2356 link: link, 2357 }, 2358 }) 2359 ); 2360 }; 2361 if (window.sitebuilderPlaceComponents && window.sitebuilderPlaceComponents.ensureLoaded) { 2362 window.sitebuilderPlaceComponents 2363 .ensureLoaded('place-generictoast') 2364 .then(dispatch) 2365 .catch(function (err) { 2366 console.warn('toast.show fallback (web-components unavailable):', message, err); 2367 }); 2368 } else { 2369 dispatch(); 2370 } 2371 } 2372 } 2373 2374 window.toast = new Toast(); 2375 }); 2376 </script>
2376
2376<script src="https://cdn.jsdelivr.net/npm/@turf/[email protected]/turf.min.js"></script>
2376
2376<script src="https://maps.googleapis.com/maps/api/js?libraries=geocoding,places,marker,drawing&key=AIzaSyAjpuNg6WGCMV5rzoJcIP2QmMTVto6hYmc&map_ids=85c127b7bf0255d9"></script>
2376
2376<script src="https://cdn1.brivityidx.com/assets/js/build.min.js?ck="></script>
2376
2376<script src="https://cdn1.brivityidx.com/assets/js/top_bar_v2.min.js?ck="></script>
2376
2376<script src="https://cdn1.brivityidx.com/assets/js/global_js.min.js?ck=1789512947"></script>
2376
2376<script>deferScript("https://cdn1.brivityidx.com/assets/js/global_js_defer.min.js?ck=1789512947", 5000);</script>
2376
2376<script> 2377 function shouldLoadChatbotImmediately() { 2378 const settingsEl = document.getElementById('hchatbot_settings'); 2379 if (!settingsEl) return false; 2380 2381 const version = Number(settingsEl.dataset.chatbotVersion); 2382 let isInitialized = false; 2383 2384 try { 2385 const session = JSON.parse(sessionStorage.getItem('cbSession') || '{}'); 2386 isInitialized = session.chatbotInitialized === true; 2387 } catch (e) {} 2388 2389 return version > 1 && isInitialized; 2390 } 2391 </script>
2391
2391<script>document.getElementById('hchatbot_settings') && Number(document.getElementById('hchatbot_settings').dataset.chatbotVersion) > 1 && deferScript("https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/9.0.6/signalr.min.js", 0);</script>
2391
2391<script>document.getElementById('hchatbot_settings') && deferScript(Number(document.getElementById('hchatbot_settings').dataset.chatbotVersion) > 1 ? "https://cdn1.brivityidx.com/assets/js/chatbot_v2.min.js?ck=1789512945" : "https://cdn1.brivityidx.com/assets/js/chatbot.min.js?ck=1789512945", shouldLoadChatbotImmediately() ? 50 : 5000);</script>
2391
2391<script type="text/javascript" src="https://cdn1.brivityidx.com/assets/js/jquery.geocomplete.min.js"></script>
2391<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.bootstrapvalidator/0.5.3/js/bootstrapValidator.min.js"></script>
2391<script type="text/javascript" src="https://cdn1.brivityidx.com/assets/js/member_area_components.js"></script>
2391<script type="text/javascript" src="https://cdn1.brivityidx.com/assets/js/update_agent_info.js"></script>
2391
2391<script src="https://mobile-component-services-library.s3.amazonaws.com/collections_service.min.js?ck=1"></script>
2391
2391<script src="https://mobile-component-services-library.s3.amazonaws.com/messaging_service.min.js?ck=1"></script>
2391
2391<script>$(document).ready(function(){function changePlaceholder(){if($(window).width()<=556){$("#home_value_my_portal_search_address").attr("placeholder","Address")}else if($(window).width()>556){$("#home_value_my_portal_search_address").attr("placeholder","Enter Property Address")}} 2392$(window).resize(changePlaceholder).trigger('resize')})</script>
2392
2392<script>$(document).ready(function(){$("#sitemap-listings > div.container > div > div.col-xs-12.col-md-12.col-lg-4.col-lg-push-8.seo-intro > a").attr("href","/search")})</script>
2392
2392<script>$(document).ready(function(){$("ul.seo-anchor-links li:nth-of-type(4) a").attr("href","/search")})</script>
2392
2392<script>(function($){$.fn.countTo=function(options){options=options||{};return $(this).each(function(){var settings=$.extend({},$.fn.countTo.defaults,{from:$(this).data('from'),to:$(this).data('to'),speed:$(this).data('speed'),refreshInterval:$(this).data('refresh-interval'),decimals:$(this).data('decimals')},options);var loops=Math.ceil(settings.speed/settings.refreshInterval),increment=(settings.to-settings.from)/loops;var self=this,$self=$(this),loopCount=0,value=settings.from,data=$self.data('countTo')||{};$self.data('countTo',data);if(data.interval){clearInterval(data.interval)} 2393data.interval=setInterval(updateTimer,settings.refreshInterval);render(value);function updateTimer(){value+=increment;loopCount++;render(value);if(typeof(settings.onUpdate)=='function'){settings.onUpdate.call(self,value)} 2394if(loopCount>=loops){$self.removeData('countTo');clearInterval(data.interval);value=settings.to;if(typeof(settings.onComplete)=='function'){settings.onComplete.call(self,value)}}} 2395function render(value){var formattedValue=settings.formatter.call(self,value,settings);$self.html(formattedValue)}})};$.fn.countTo.defaults={from:0,to:0,speed:1000,refreshInterval:100,decimals:0,formatter:formatter,onUpdate:null,onComplete:null};function formatter(value,settings){return value.toFixed(settings.decimals)}}(jQuery));jQuery(function($){$('.count-number').data('countToOptions',{formatter:function(value,options){return value.toFixed(options.decimals).replace(/\B(?=(?:\d{3})+(?!\d))/g,',')}});$('.timer').each(count);function count(options){var $this=$(this);options=$.extend({},options||{},$this.data('countToOptions')||{});$this.countTo(options)}})</script>
2395
2395<script>$(document).ready(function(){$('#sign-up-modal.modal #signupForm').append('<input type="hidden" name="tags" value="registration_signup">')})</script>
2395
2395<script>$('.menu-toggle').click(function(){$('#slide-out-nav, .slide-out-nav-overlay').addClass('open')});$('.close-nav, .slide-out-nav-overlay').click(function(){$('#slide-out-nav, .slide-out-nav-overlay').removeClass('open')})</script>
2395
2395<script>$("#slide-out-nav > div.render-menu > ul").append('<li class="nav-item"><a style="color:#fff!important; max-width:250px; margin:0 auto;" id="top-nav-marketing-plan" class="nav-link-color btn-primary" data-toggle="modal" data-target="#getmarketingplan">Get Marketing Plan</a></li>')</script>
2395
2395<script>$(document).ready(function(){$(".seo-anchor-links li:contains('Sitemap')").css("display","none");$(".seo-anchor-links li:contains('DMCA')").css("border-right","unset");$(".seo-anchor-links li:contains('DMCA')").css("padding-right","unset");$(".seo-anchor-links li:contains('DMCA')").css("margin-right","0px")})</script>
2395
2395<script src="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/owl.carousel.min.js"></script>
2395 <div class="modal fade magic-modal" id="getmarketingplan" tabindex="-1" role="dialog" aria-labelledby="getmarketingplan" style="display: none;" aria-hidden="true"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-body"> <button type="button" class="close" data-dismiss="modal" aria-label="Close" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;"><span aria-hidden="true">Ã</span></button> <h4 class="prmry-color" data-selector="h1, h2, h3, h4, h5, h6" style="outline: none; cursor: inherit;">Request property marketing plan</h4> <p data-selector="p" style="outline: none; cursor: inherit;">You're one step away from getting a free marketing plan that shows how we'll sell your home for the most amount of money in the least amount of time - hassle free.</p> <form class="form-contact" id="form-contact6"> <input type="hidden" name="lead_type" value="seller"><input type="hidden" name="tags" value="Marketing_Plan_Requested"> <div class="row"> <div class="col-sm-6"> <div class="form-group"> <input name="contact6_fname" id="contact6_fname" placeholder="First Name" class="form-control" required="" type="text"> </div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact6_lname" id="contact6_lname" placeholder="Last Name" class="form-control" required="" type="text"> </div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact6_email" id="contact6_email" placeholder="Email Address" class="form-control" required="" type="email"> </div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact6_phone" id="contact6_phone" placeholder="Phone Number" class="form-control" required="" type="tel"> </div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact6_address" id="contact6_address" placeholder="Address" class="form-control" required="" type="text"> </div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact6_city" id="contact6_city" placeholder="City" class="form-control" required="" type="text"> </div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact6_state" id="contact6_state" placeholder="State" class="form-control" required="" type="text"> </div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact6_zip" id="contact6_zip" placeholder="ZIP" class="form-control" required="" type="text"> </div> </div> <div class="col-sm-12"> <div class="form-group"> <select name="When are you selling" id="contact6_whenareyouselling" class="form-control" placeholder="When are you planning to sell?"> <option value="" disabled="" selected="">When are you planning to sell?</option> <option value="now">Now</option> <option value="0-6 months">0-6 months</option> <option value="6+ months">6+ months</option> </select> </div> </div> </div> <button class="btn btn-primary" type="submit" id="cf-submit" name="submit" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;">Send</button> </form> </div> </div> </div> </div></body> </html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.