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 | Saved Searches</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/searches">
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/searches"> <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 | Saved Searches"> </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 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 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 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 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 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 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 .css-1dbjc4n { 221 z-index: unset; 222 } 223 224 .center-modal { 225 display:flex; 226 justify-content: center; 227 align-items:center; 228 position:fixed; 229 background-color:rgba(0,0,0,0.4); 230 left:0; 231 top:0; 232 right:0; 233 bottom:0; 234 z-index: 100; 235 } 236 237 #saved-searches{ 238 gap: 24px 239 } 240 241 .my-feed-parent{ 242 width: 90vw; 243 margin-top: 20px 244 } 245 .page-width-parent{ 246 max-width: 1280px; 247 margin: 0 auto; 248 } 249 @media only screen and (min-width: 1280px) {
250 .collection-page { 251 padding:48px 48px 48px 120px; 252 } 253 254 .my-feed-parent{ 255 max-width: 100%; 256 overflow: hidden; 257 } 258 259 .saved-search-cards{ 260 width:calc(50% - 12px); 261 } 262 } 263 264 @media only screen and (min-width:768px) and (max-width:1279px) { 265 .collection-page { 266 padding:60px 16px 16px 16px; 267 } 268 269 .saved-search-cards{ 270 width:calc(50% - 12px); 271 } 272 } 273 274 @media only screen and (max-width:767px) { 275 .collection-page { 276 padding:60px 16px 16px 16px; 277 } 278 279 .saved-search-cards{ 280 width:100%; 281 } 282 } 283 284 </style>
284<script> 285 window.addEventListener("load", () => { 286 const key = localStorage.getItem('authorization'); 287 288 if( !key) { 289 $("#sign-up-modal").modal('show'); 290 291 $("#sign-up-modal").on("hidden.bs.modal", function () { 292 location.reload(); 293 }); 294 } 295 else{ 296 297 let myPortalPage = document.getElementById('myportal-page'); 298 myPortalPage.style.display = "block"; 299 300 window.location.hash = "" 301 302 class logger extends Collections.BaseLogger { 303 log(e) { 304 console.log(e); 305 } 306 } 307 308 class Pubsub { 309 static events = {}; 310 constructor() { 311 //this.events = {}; 312 } 313 314 static subscription (eventName, func) { 315 return { 316 subscribe: () => { 317 if (this.events[eventName]) { 318 this.events[eventName].push(func); 319 } else { 320 this.events[eventName] = [func]; 321 } 322 }, 323 324 unsubscribe: () => { 325 if(this.events[eventName]){ 326 this.events[eventName] = this.events[eventName].filter((subscriber) => subscriber !== func); 327 } 328 } 329 } 330 } 331 332 333 static publish(eventName, ...args) { 334 const funcs = this.events[eventName]; 335 if (Array.isArray(funcs)) { 336 funcs.forEach((func) => { 337 func.apply(null, args); 338 }); 339 } 340 } 341 } 342 343 class SubHeader { 344 constructor() { 345 this.element = document.querySelector('place-pagesubheader'); 346 347 this.element.addEventListener('button_on_press', (e) => { 348 window.open('../../search.php', '_blank'); 349 }) 350 351 this.element.addEventListener('top_header_on_press', (e) => { 352 Pubsub.publish('top_header_back_pressed', e) 353 }) 354 355 this.element.addEventListener('on_menu_item_pressed', (e) => { 356 Pubsub.publish('top_header_menu_item_pressed', e.detail) 357 }) 358 } 359 360 setTitle(title) { 361 this.element.setAttribute('title', title) 362 } 363 364 setTopHeaderTitle(title){ 365 this.element.setAttribute('top_header_title', title) 366 } 367 368 showTopHeader(){ 369 this.element.setAttribute('show_top_header', true) 370 } 371 372 hideTopHeader(){ 373 this.element.setAttribute('show_top_header', false) 374 } 375 376 showMenuButton() { 377 this.element.setAttribute('show_menu_button', true) 378 } 379 380 hideMenuButton() { 381 this.element.setAttribute('show_menu_button', false) 382 } 383 384 showPrimaryButton() { 385 this.element.setAttribute('show_button', true) 386 } 387 388 hidePrimaryButton() { 389 this.element.setAttribute('show_button', false) 390 } 391 392 hideMenu() { 393 this.element.setAttribute('show_menu', false) 394 } 395 } 396 397 class SaveSearchBlock { 398 constructor() { 399 this.element = document.getElementById('save-search-block'); 400 401 this.element.addEventListener('on_main_press', (e) => { 402 window.open('../../search.php', '_blank'); 403 }) 404 } 405 406 show(collectionUUID, propertyCollectionUUID) { 407 this.element.setAttribute('style', 'display:flex') 408 } 409 410 hide() { 411 this.element.setAttribute('style', 'display:none'); 412 } 413 } 414 415 class BrivityHomeApp { 416 constructor(blueroofMiddlewareApi) { 417 this.element = document.querySelector('place-gethomeapp'); 418 this.blueroofMiddlewareApi = blueroofMiddlewareApi; 419 420 this.element.addEventListener('on_button_pressed', (e) => { 421 this.blueroofMiddlewareApi.getBrivityHomeAppInvite(e.detail).then((data) => { 422 toast.show('Invite has been sent!') 423 }).catch((error) => { 424 toast.show('Error sending invite') 425 }) 426 }) 427 } 428 hide(){ 429 this.element.setAttribute('style', 'display:none') 430 } 431 } 432 433 class SavedSearchCard { 434 constructor(savedSearch) { 435 436 437 this.element = document.createElement('place-savedsearchcard'); 438 439 this.savedSearch = savedSearch; 440 441 this.element.addEventListener(`on_menu_open`, (e) => { 442 this.element.setAttribute("show_menu", e.detail); 443 }); 444 445 this.element.addEventListener('on_search_pressed', (e) => { 446 window.open(`../../${this.savedSearch.searchUrl}`, '_blank'); 447 }) 448 449 this.element.addEventListener('on_updates_pressed', (e) => { 450 window.location.hash = savedSearch.alertId; 451 Pubsub.publish('save_search_block_updates_pressed', savedSearch); 452 }) 453 454 this.element.addEventListener('on_icon_pressed', (e) => { 455 Pubsub.publish('saved_search_block_icon_pressed', {icon:e.detail, savedSearch}); 456 }) 457 458 this.element.addEventListener('on_menu_item_pressed', (e) => { 459 if(e.detail == 'Delete Saved Search'){ 460 461 Pubsub.publish('delete_saved_search_pressed', this?.savedSearch?.alertId); 462 } 463 else if(e.detail == 'Share Saved Search'){ 464 Pubsub.publish('share_saved_search_pressed', this?.savedSearch); 465 } 466 else if(e.detail == 'Manage Alerts'){ 467 Pubsub.publish('manage_alerts_pressed', this?.savedSearch); 468 } 469 470 471 }) 472 473 let data = { 474 city: savedSearch?.cityStates?.length > 0 ? savedSearch?.cityStates[0]?.city : "", 475 state: savedSearch?.cityStates?.length > 0 ? savedSearch?.cityStates[0]?.state : "", 476 bathrooms: savedSearch?.bathsMin || 0, 477 bathrooms_max: savedSearch?.bathsMax || 0, 478 bedrooms: savedSearch?.bedsMin || 0, 479 bedrooms_max: savedSearch?.bedsMax || 0, 480 max_price: savedSearch?.priceMax || 0, 481 min_price: savedSearch?.priceMin || 0, 482 search_name: savedSearch?.searchName, 483 statistics: { 484 total : savedSearch?.statistics?.total || 0, 485 new : savedSearch?.statistics?.new || 0, 486 openHouse : savedSearch?.statistics?.openHouse || 0, 487 sold: savedSearch?.statistics?.statusChange || 0, 488 priceChange:savedSearch?.statistics?.priceChange || 0 489 } 490 } 491 492 this.element.setAttribute('id', savedSearch?.alertId); 493 this.element.setAttribute('saved_search', JSON.stringify(data)); 494 495 496 } 497 498 499 500 show = () => { 501 this.collectionSection.style.display = 'flex' 502 } 503 504 hide = () => { 505 this.collectionSection.style.display = 'none' 506 } 507 } 508 509 class PropertyCard { 510 constructor(property){ 511 this.element = document.createElement('place-propertycard'); 512 513 this.element.addEventListener('on_press_carousel', (e) => { 514 window.open(`/homes-for-sale/${property.state}/${slugify(property.city)}/${slugify(property.postalCode)}/${slugify(property.streetAddress)}/bid-${property.blossorId}`,`_blank`); 515 }); 516 517 this.element.addEventListener('on_menu_item_pressed', (e) => { 518 if(e.detail == 'Share Property'){ 519 let url = this.getPropertyUrl(property); 520 521 property.searchUrl = url; 522 Pubsub.publish('share_property', {property}); 523 } 524 else if(e.detail == 'Add to Collection'){ 525 526 527 528 Pubsub.publish('add_property_to_collection', {property}); 529 530 } 531 532 }) 533 534 this.element.addEventListener('on_favorite_press', (e) => { 535 536 let isAddingFavorite = e.detail 537 538 if(isAddingFavorite){ 539 540 541 Pubsub.publish('add_property_to_collection', {property}); 542 } 543 else{ 544 Pubsub.publish('remove_property_from_collections', {property}); 545 } 546 }); 547 548 this.element.setAttribute('id', property.blossorId); 549 this.element.setAttribute("display_menu", "true"); 550 this.element.setAttribute("show_menu", "false"); 551 this.element.setAttribute("items", '[{"icon":"share-2","text":"Share Property"},{"icon":"layers","text":"Add to Collection"}]'); 552 this.element.setAttribute("property_created_at", property?.listDate); 553 this.element.setAttribute("active_status", "true"); 554 if(property?.priceLastReduced?.length > 0){ 555 const priceLastReduced = new Date(property?.priceLastReduced)?.getTime(); 556 if(priceLastReduced > sevenDaysAgo) this.element.setAttribute('mls_price_history', property?.history[property.history.length-1]?.price); 557 } 558 if(property.openhouses.length > 0){ 559 this.element.setAttribute('open_house','true') 560 this.element.setAttribute('open_house_date', property.openhouses[0].startDate) 561 this.element.setAttribute('open_house_end_time',property.openhouses[0].endDate) 562 }else{ 563 this.element.setAttribute('open_house','false') 564 } 565 this.element.setAttribute('appearance','small') 566 this.element.setAttribute('layout_width', '300') 567 this.element.setAttribute('display_tag', 'true') 568 this.element.setAttribute('display_favorite', 'true') 569 this.element.setAttribute('image_height', '184') 570 this.element.setAttribute('mls',`{ 571 "status":"${property.standardStatus}", 572 "favorite":${property?.favorite}, 573 "image":[{"uri":"${property?.photos[0].url}"}], 574 "price":"${property?.price}", 575 "address":"${property?.streetAddress}", 576 "state":"${property?.state}", 577 "city":"${property?.city}", 578 "postalCode":"${property?.postalCode}", 579 "beds":"${property?.bedrooms}", 580 "baths":"${property?.fullBaths}", 581 "sqft":"${property?.squareFeet}" 582 }`) 583 584 } 585 getPropertyUrl = (property) => { 586 let state = property.state; 587 let city = this.slugify(property.city); 588 let zip = property.postal_code 589 let address = this.slugify(property.streetAddress); 590 let blossorId = property.blossorId; 591 return `homes-for-sale/${state}/${city}/${zip}/${address}/bid-${blossorId}`; 592 } 593 594 slugify(text) { 595 // replace non letter or digits by - 596 text = text.replace(/[^\pL\d]+~u/g, '_'); 597 // transliterate 598 text = text.normalize('NFKD').replace(/[\u0300-\u036F]/g,'') 599 // remove unwanted characters 600 text = text.replace(/[^_\w]+/g, '_'); 601 // trim 602 text = text.trim(); 603 // remove duplicate - 604 text = text.replace(/_+/g, '-'); 605 // lowercase 606 text = text.toLowerCase(); 607 if (!text) { 608 return 'n-a'; 609 } 610 return text 611 } 612 } 613 614 let dateNow = new Date(); 615 dateNow.setDate(dateNow.getDate()-7); 616 dateNow.setHours(0); 617 dateNow.setMinutes(0); 618 dateNow.setSeconds(0); 619 dateNow.setMilliseconds(0); 620 const sevenDaysAgo = dateNow.getTime(); 621 622 class UpdatedListingsSection { 623 constructor(collectionsService) { 624 this.collectionsService = collectionsService; 625 this.element = document.getElementById('updated-listings-section'); 626 this.listingElement = document.getElementById('updated-listings'); 627 } 628 629 async show(properties) { 630 if(properties){ 631 this.properties = properties 632 } 633 this.element.style.display = 'flex' 634 await this.addPropertyCards(); 635 } 636 637 hide() { 638 this.element.style.display = 'none' 639 } 640 641 async addPropertyCards(){ 642 643 this.listingElement.innerHTML = ""; 644 645 let updatedPropertiesBlossorIds = this.properties.map(property => property.blossorId); 646 647 648 let propertiesInCollections = await this.collectionsService.checkIfInCollection(updatedPropertiesBlossorIds) 649
650 this.properties.forEach((property) => { 651 let propertyCardWrapper = document.createElement('div'); 652 property.favorite = propertiesInCollections?.data[property?.blossorId] != null || false 653 let propertyCard = new PropertyCard(property); 654 propertyCardWrapper.appendChild(propertyCard.element); 655 this.listingElement.appendChild(propertyCardWrapper); 656 }) 657 658 659 } 660 661 filterProperties(filter) { 662 663 let filteredProperties; 664 665 666 667 668 if(filter == 'open_house'){ 669 filteredProperties = this.properties.filter((property) => { 670 return property.openhouses.length > 0; 671 }) 672 } 673 else if(filter == 'price_change'){ 674 filteredProperties = this.properties.filter((property) => { 675 if(property?.priceLastReduced?.length > 0){ 676 const priceLastReduced = new Date(property?.priceLastReduced)?.getTime(); 677 return priceLastReduced >= sevenDaysAgo; 678 } 679 else { 680 return false; 681 } 682 }) 683 } 684 else if(filter == 'status_change') { 685 filteredProperties = this.properties.filter((property) => { 686 const listDate = new Date(property?.listDate).getTime(); 687 688 if(property?.lastStatusChangeDate?.length > 0 ){ 689 const lastStatusChangeDate = new Date(property?.lastStatusChangeDate)?.getTime(); 690 return lastStatusChangeDate >= sevenDaysAgo; 691 } 692 else { 693 return false; 694 } 695 }) 696 } 697 else if(filter == 'new'){ 698 filteredProperties = this.properties.filter((property) => { 699 const listDate = new Date(property?.listDate).getTime(); 700 return listDate >= sevenDaysAgo; 701 }) 702 } 703 else { 704 filteredProperties = this.properties; 705 } 706 707 this.listingElement.innerHTML = ""; 708 709 if(filteredProperties.length > 0 ){ 710 filteredProperties.forEach((property) => { 711 let propertyCardWrapper = document.createElement('div'); 712 713 let propertyCard = new PropertyCard(property); 714 propertyCardWrapper.appendChild(propertyCard.element); 715 this.listingElement.appendChild(propertyCardWrapper); 716 }) 717 } 718 } 719 } 720 721 class SavedSearchesSection { 722 constructor() { 723 this.element = document.getElementById('saved-searches'); 724 } 725 726 727 addSavedSearchCards(savedSearches){ 728 this.savedSearches = savedSearches; 729 savedSearches.forEach((savedSearch) => { 730 const savedSearchCard = new SavedSearchCard(savedSearch); 731 const savedSearchCardWrapper = document.createElement('div'); 732 savedSearchCardWrapper.setAttribute('class', 'saved-search-cards'); 733 734 savedSearchCardWrapper.append(savedSearchCard.element); 735 this.element.append(savedSearchCardWrapper); 736 }) 737 } 738 739 removeSavedSearchCard(alertId){ 740 741 const savedSearchCard = document.getElementById(alertId).parentElement; 742 if(savedSearchCard){ 743 savedSearchCard.remove(); 744 } 745 746 747 } 748 749 show() { 750 this.element.style.display = 'flex' 751 } 752 753 hide() { 754 this.element.style.display = 'none' 755 } 756 } 757 758 class ShareSavedSearchModal { 759 constructor() { 760 let _this = this; 761 this.savedSearch = {} 762 this.element = document.getElementById('share-saved-search-modal'); 763 764 this.element.addEventListener("on_primary_press", (e) => { 765 766 navigator.clipboard.writeText(this.link) 767 _this.hide(); 768 toast.show('Link Copied!') 769 770 }); 771 772 this.element.addEventListener("on_close_press", (e) => { 773 _this.hide(); 774 }); 775 } 776 777 show = (savedSearch) => { 778 779 if(savedSearch){ 780 this.savedSearch = savedSearch; 781 } 782 this.link = document.location.origin + "/" + this.savedSearch.searchUrl 783 this.element.setAttribute('share_link_text', this.link) 784 this.element.setAttribute('style', 'display:flex') 785 } 786 787 hide = () => { 788 this.element.setAttribute('style', 'display:none'); 789 } 790 } 791 792 class DeleteSavedSearchModal { 793 constructor(blueroofMiddlewareApi) { 794 795 this.blueroofMiddlewareApi = blueroofMiddlewareApi; 796 this.savedSearch = {} 797 this.element = document.getElementById('delete-saved-search-modal'); 798 799 this.element.addEventListener("on_primary_press", (e) => { 800 this.hide(); 801 this.blueroofMiddlewareApi.deleteSavedListing(this.savedSearch).then((response) => { 802 toast.show('Saved search has been deleted'); 803 }) 804 }); 805 806 this.element.addEventListener("on_tertiary_press", (e) => { 807 this.hide(); 808 }); 809 810 this.element.addEventListener("on_close_press", (e) => { 811 this.hide(); 812 }); 813 } 814 815 show = (savedSearch) => { 816 817 if(savedSearch){ 818 this.savedSearch = savedSearch; 819 } 820 this.element.setAttribute('style', 'display:flex') 821 } 822 823 hide = () => { 824 this.element.setAttribute('style', 'display:none'); 825 } 826 } 827 828 class FrequencyModal { 829 constructor() { 830 this.element = document.querySelector('place-frequencymodal'); 831 832 this.element.addEventListener('on_close_press', (e) => { 833 this.hide() 834 }) 835 836 this.element.addEventListener('on_save_press', (e) => { 837 Pubsub.publish('frequency_modal_save_clicked', e.detail) 838 }) 839 } 840 841 show(reportData) { 842 843 let frequency = reportData.frequency; 844 845 //daily, twice_daily, weekly, bi_weekly, monthly 846 847 switch(reportData.frequency){ 848 849 case 'daily': 850 frequency = 'Daily'; 851 break; 852 case 'bi_weekly': 853 frequency = 'Every 2 Weeks'; 854 break; 855 case 'twice_daily': 856 frequency = 'Twice Daily'; 857 break; 858 case 'four_times_daily': 859 frequency = 'Multiple Times Per Day'; 860 break; 861 case 'weekly': 862 frequency = 'Weekly'; 863 break; 864 case 'monthly': 865 frequency = 'Monthly'; 866 break; 867 } 868 869 let description = `Listing alerts keep you up to date on the latest market activity so you can stay one step ahead of the game.\n\nHow often would you like email updates?`; 870 this.element.setAttribute('description', description); 871 this.element.setAttribute('selected_menu_item', frequency); 872 this.element.setAttribute('style', 'display:flex') 873 } 874 875 hide() { 876 this.element.setAttribute('style', 'display:none'); 877 } 878 } 879 880 class PillSelector { 881 constructor() { 882 this.element = document.createElement('div'); 883 this.element.setAttribute('style', 'display:flex;flex-direction:column;width:100%;margin-bottom:24px;') 884 885 886 887 this.savedSearchFilter = document.createElement('place-text') 888 889 this.weeksUpdates = document.createElement('place-text') 890 this.weeksUpdates.setAttribute('style', 'margin-bottom:8px; margin-top: 40px;') 891 892 893 894 this.pillSelector = document.createElement('place-pillselector') 895 896 897 this.pillSelector.addEventListener('on_press', (e) => { 898 Pubsub.publish('pill_selector_item_selected', e.detail); 899 }) 900 901 this.element.append(this.savedSearchFilter) 902 this.element.append(this.weeksUpdates) 903 this.element.append(this.pillSelector) 904 } 905 906 setCurrentSavedSearch(savedSearch){ 907 908 this.savedSearch = savedSearch
909 this.stats = savedSearch.statistics 910 911 const items = [ 912 { 913 "text": `All (${this.stats.total})`, 914 "value": "all" 915 }, 916 { 917 "text": `New (${this.stats.new})`, 918 "value": "new" 919 }, 920 { 921 "text": `Price Change (${this.stats.priceChange})`, 922 "value": "price_change" 923 }, 924 { 925 "text": `Open House (${this.stats.openHouse})`, 926 "value": "open_house" 927 }, 928 { 929 "text": `Status Change (${this.stats.statusChange})`, 930 "value": "status_change" 931 } 932 ] 933 934 this.pillSelector.setAttribute('items', JSON.stringify(items)) 935 this.pillSelector.setAttribute('active_pill', 'all') 936 937 let city = this.savedSearch?.cityStates?.length > 0 && this.savedSearch?.cityStates[0].city || ""; 938 let baths = this.savedSearch?.bathsMin || 0; 939 let beds = this.savedSearch?.bedsMin || 0; 940 let minPrice = this.savedSearch?.priceMin || 0; 941 let maxPrice = this.savedSearch?.priceMax || 0; 942 943 let searchFilter = `${city} ${baths}+ baths ${beds}+ beds` 944 945 if(minPrice > 0 || maxPrice > 0){ 946 searchFilter += ` $${this.formatNumberToSymbol(minPrice)} - $${this.formatNumberToSymbol(maxPrice)}` 947 } 948 949 950 this.savedSearchFilter.innerText = searchFilter 951 952 this.weeksUpdates.innerText = "This Week's Updates"; 953 } 954 955 formatNumberToSymbol = (num) => { 956 if (num > 999 && num < 1000000) { 957 return (num / 1000).toFixed() + "K"; // convert to K for number from > 1000 < 1 million 958 } else if (num >= 1000000) { 959 return (num / 1000000).toFixed() + "M"; // convert to M for number from > 1 million 960 } else if (num < 900) { 961 return num; // if value < 1000, nothing to do 962 } 963 }; 964 965 966 } 967 968 class BlueroofMiddlewareApi { 969 constructor() { 970 this.baseUrl = "https://brivity-home-middleware.production.brivity.com"; 971 this.apiKey = localStorage.getItem('authorization'); 972 } 973 974 getStats = async () => { 975 const response = await fetch(`${this.baseUrl}/listingAlerts/all/forPerson/withStatistics`, { 976 method: 'GET', 977 headers: { 978 'Content-Type': 'application/json', 979 'Authorization': `${this.apiKey}` 980 } 981 }); 982 983 const data = await response.json(); 984 return data; 985 } 986 987 getSavedListings = async () => { 988 const response = await fetch(`${this.baseUrl}/listingalerts/all/forperson/withStatistics`, { 989 method: 'GET', 990 headers: { 991 'Content-Type': 'application/json', 992 'Authorization': `${this.apiKey}` 993 } 994 }); 995 996 const data = await response.json(); 997 return data; 998 } 999 1000 getUpdatedListings = async (id) => { 1001 const response = await fetch(`${this.baseUrl}/listingalerts//recentlyUpdatedListings/${id}`, { 1002 method: 'GET', 1003 headers: { 1004 'Content-Type': 'application/json', 1005 'Authorization': `${this.apiKey}` 1006 } 1007 }); 1008 1009 const data = await response.json(); 1010 return data; 1011 } 1012 1013 deleteSavedListing = async (alertId) => { 1014 const response = await fetch(`${this.baseUrl}/listingalerts/${alertId}`, { 1015 method: 'DELETE', 1016 headers: { 1017 'Content-Type': 'application/json', 1018 'Authorization': `${this.apiKey}` 1019 } 1020 }); 1021 1022 if(!response.ok){ 1023 throw new Error(); 1024 } 1025 1026 const data = await response; 1027 if(response.status == 200){ 1028 Pubsub.publish('saved_search_deleted', alertId); 1029 } 1030 return data; 1031 } 1032 1033 updateSavedListings = async (updatedListingData) => { 1034 const response = await fetch(`${this.baseUrl}/listingalerts/${updatedListingData.alertId}`, { 1035 method: 'PUT', 1036 headers: { 1037 'Content-Type': 'application/json', 1038 'Authorization': `${this.apiKey}` 1039 }, 1040 body: JSON.stringify(updatedListingData) 1041 }); 1042 1043 if(!response.ok){ 1044 throw new Error(); 1045 } 1046 1047 const data = await response 1048 return data; 1049 } 1050 1051 getBrivityHomeAppInvite = async (number) => { 1052 const response = await fetch(`${this.baseUrl}/brivityLeads/sendHomeAppInvite`, { 1053 method: 'POST', 1054 headers: { 1055 'Content-Type': 'application/json', 1056 'Authorization': `${this.apiKey}` 1057 }, 1058 body: JSON.stringify({ 1059 "phoneNumber": number 1060 }) 1061 }); 1062 1063 const data = await response.json(); 1064 return data; 1065 } 1066 1067 getMyFeed = async () => { 1068 const response = await fetch(`${this.baseUrl}/listings/voltron`, { 1069 method: 'POST', 1070 headers: { 1071 'Content-Type': 'application/json', 1072 'Authorization': `${this.apiKey}` 1073 }, 1074 body: JSON.stringify([]) 1075 1076 }); 1077 1078 const data = await response.json(); 1079 return data; 1080 } 1081 1082 getLeadBasicInfo = async () => { 1083 const response = await fetch(`${this.baseUrl}/blueroofleads/basicinfo`, { 1084 method: 'GET', 1085 headers: { 1086 'Content-Type': 'application/json', 1087 'Authorization': `${this.apiKey}` 1088 }, 1089 1090 }); 1091 1092 const data = await response.json(); 1093 return data; 1094 } 1095 1096 getAgentProfile = async (brivityUserId) => { 1097 const response = await fetch(`${this.baseUrl}/blueroofagents/profile`, { 1098 method: 'POST', 1099 headers: { 1100 'Content-Type': 'application/json', 1101 'Authorization': `${this.apiKey}` 1102 }, 1103 body: `{"brivityUserId": ${brivityUserId}}` 1104 1105 }); 1106 1107 const data = await response.json(); 1108 return data; 1109 } 1110 } 1111 1112 class ShareSavedPropertyModal { 1113 constructor() { 1114 let _this = this; 1115 this.savedProperty = {} 1116 this.element = document.getElementById('share-saved-property-modal'); 1117 1118 this.element.addEventListener("on_primary_press", (e) => { 1119 1120 navigator.clipboard.writeText(this.link) 1121 _this.hide(); 1122 toast.show('Link Copied!') 1123 1124 }); 1125 1126 this.element.addEventListener("on_close_press", (e) => { 1127 _this.hide(); 1128 }); 1129 } 1130 1131 show = (savedProperty) => { 1132 1133 1134 this.savedProperty = savedProperty; 1135 1136 this.link = document.location.origin + "/" + savedProperty.searchUrl 1137 this.element.setAttribute('share_link_text', this.link) 1138 this.element.setAttribute('style', 'display:flex') 1139 } 1140 1141 hide = () => { 1142 this.element.setAttribute('style', 'display:none'); 1143 } 1144 } 1145 1146 class CollectionModal { 1147 1148 constructor() { 1149 1150 let _this = this; 1151 this.element = document.querySelector('place-collectionpopup'); 1152 this.collectionUUID = 0; 1153 1154 this.element.addEventListener("on_close_press", (e) => { 1155 _this.hide(); 1156 }); 1157 1158 this.element.addEventListener("on_save_press", (e) => { 1159 this.showError(false); 1160 e.detail.collectionUUID = this.collectionUUID 1161 e.detail.type = this.isEditingCollection ? 'edit' : 'save' 1162 Pubsub.publish('on_new_collection_saved', e.detail); 1163 }); 1164 1165 } 1166 1167 setName(name) { 1168 this.element.setAttribute('name_value', name) 1169 } 1170 1171 setDescription(description) { 1172 this.element.setAttribute('description_value', description) 1173 } 1174 1175 showError(error) { 1176 this.element.setAttribute('show_error', error) 1177 } 1178 1179 show(collectionUUID, isEditingCollection) { 1180 this.isEditingCollection = isEditingCollection; 1181 if(collectionUUID){ 1182 this.collectionUUID = collectionUUID; 1183 } 1184 this.element.setAttribute('style', 'display:flex') 1185 } 1186 1187 hide() { 1188 this.element.setAttribute('style', 'display:none'); 1189 1190 this.showError(false) 1191 1192 // terrible hack.. only way i could get it to respond to prop changes 1193 // to clear the input fields after closing the modal 1194 this.setName('none') 1195 this.setDescription('none') 1196 setTimeout(() => { 1197 this.setName('') 1198 this.setDescription('') 1199 }, 100); 1200 } 1201 } 1202 1203 class CopyPropertyToCollectionModal { 1204 constructor(){ 1205 1206 this.element = document.querySelector('place-copycollectionmodal'); 1207 this.property = {} 1208 1209 this.element.addEventListener('close_button', (e) => { 1210 this.hide(); 1211 }); 1212 1213 this.element.addEventListener('cancel_button', (e) => { 1214 this.hide(); 1215 }); 1216 1217 this.element.addEventListener('on_save', (e) => { 1218 Pubsub.publish('copy_property_to_collection_modal_save_pressed', {'collectionUUID':e.detail, 'property':this.property}); 1219 }); 1220 1221 this.element.addEventListener('set_selected_collection', (e) => { 1222 console.log('set_selected_collection', e) 1223 }); 1224 1225 this.element.addEventListener('on_link_press', (e) => { 1226 Pubsub.publish('show_new_collection_modal'); 1227 }); 1228 1229 } 1230 getCollectionData(){ 1231 return JSON.parse(this.element.getAttribute("collections")); 1232 } 1233 1234 setCollectionData(collections){ 1235 this.element.setAttribute('collections', JSON.stringify(collections)) 1236 } 1237 1238 setIsAddingToCollection(isAddingToCollection){ 1239 this.element.setAttribute('is_add_to_collection', isAddingToCollection); 1240 } 1241 1242 show(property) { 1243 1244 if(property){ 1245 this.property = property; 1246 } 1247 1248 1249 1250 let mls = { 1251 status: property?.status || property?.standardStatus || "", 1252 image: this.getPropertyImageUrl(property), 1253 price: property?.price || "0", 1254 address: property?.address || property?.streetAddress || "", 1255 state: property?.state || "", 1256 city: property?.city || "", 1257 postal_code: property?.postal_code || "", 1258 beds: property?.beds || property?.bedrooms || 0, 1259 baths: property?.baths || property?.bathsTotalDecimal || 0, 1260 sqft: property?.sqft || property?.squareFeet || 0, 1261 creator: property?.creator || "", 1262 } 1263 1264 this.element.setAttribute('mls', JSON.stringify(mls)) 1265 this.element.setAttribute('image_url',mls?.image || "") 1266 this.element.setAttribute('style', 'display:flex') 1267 } 1268 1269 getPropertyImageUrl(property){ 1270 // property?.image[0]?.uri || property?.photos[0]?.url || "", 1271 1272 if(property.image && property.image.length > 0){ 1273 return property.image[0].uri 1274 }
1274 else if (property.photos && property.photos.length > 0){ 1275 return property.photos[0].url 1276 } else { 1277 return "" 1278 } 1279 } 1280 1281 hide() { 1282 this.element.setAttribute('style', 'display:none'); 1283 } 1284 } 1285 1286 class MyFeed { 1287 constructor(blueroofMiddlewareApi, collectionsService) { 1288 this.blueroofMiddlewareApi = blueroofMiddlewareApi; 1289 this.collectionsService = collectionsService; 1290 this.element = document.querySelector('place-myfeedblock'); 1291 1292 this.element.addEventListener('on_menu_open', (e) => { 1293 this.element.setAttribute('show_menu', e.detail.e); 1294 this.element.setAttribute('show_menu_index', e.detail.index); 1295 }); 1296 1297 this.element.addEventListener('on_view_all_pressed', (e) => { 1298 window.open('../../search.php', '_blank'); 1299 }); 1300 1301 this.element.addEventListener('on_add_collection', (e) => { 1302 1303 let property = e.detail; 1304 Pubsub.publish('add_property_to_collection', {property}); 1305 1306 }); 1307 1308 this.element.addEventListener('on_share_pressed', (e) => { 1309 1310 let property = e.detail 1311 1312 let url = this.getPropertyUrl(property); 1313 property.searchUrl = url; 1314 1315 Pubsub.publish('share_property', {property}); 1316 }); 1317 1318 this.element.addEventListener('on_favorite_pressed', (e) => { 1319 1320 let property = e.detail.property; 1321 let isAddingFavorite = e.detail.isAddingFavorite; 1322 1323 if(isAddingFavorite){ 1324 1325 1326 Pubsub.publish('add_property_to_collection', {property}); 1327 } 1328 else{ 1329 Pubsub.publish('remove_property_from_collections', {property}); 1330 } 1331 1332 1333 1334 }); 1335 1336 this.element.addEventListener('on_property_pressed', (e) => { 1337 let property = e.detail 1338 1339 let url = this.getPropertyUrl(property); 1340 property.searchUrl = url; 1341 window.open('../../' + url, '_blank'); 1342 }); 1343 1344 1345 this.blueroofMiddlewareApi.getMyFeed().then((data) => { 1346 1347 let myFeedBlossorIds = data.map(property => property.blossorId); 1348 1349 1350 this.collectionsService.checkIfInCollection(myFeedBlossorIds).then((propertiesInCollections) => { 1351 1352 let feed = [] 1353 data.forEach((item) => { 1354 feed.push({ 1355 image: [ 1356 { 1357 title: "", 1358 id: 0, 1359 uri: item?.photos[0].url, 1360 }, 1361 ], 1362 price: item?.price, 1363 favorite: propertiesInCollections?.data[item?.blossorId] != null || false, 1364 address: item?.streetAddress, 1365 city: item?.city, 1366 state: item?.state, 1367 postal_code: item?.postalCode, 1368 beds: item?.bedrooms, 1369 status: item?.standardStatus, 1370 baths: item?.bathsTotalDecimal, 1371 sqft: item?.squareFeet, 1372 creator: "", 1373 mls_price_history: item?.history[item.history.length-1]?.price, 1374 blossorId: item?.blossorId, 1375 open_house : item?.openhouses.length > 0 ? true : false, 1376 open_house_date : item?.openhouses[0]?.startDate, 1377 open_house_end_time : item?.openhouses[0]?.endDate, 1378 property_created_at : item?.listDate, 1379 lastStatusChangeDate : item?.lastStatusChangeDate, 1380 }) 1381 }) 1382 1383 if(feed && feed?.length > 0){ 1384 this.show(); 1385 this.element.setAttribute('mls_data', JSON.stringify(feed)); 1386 } 1387 }); 1388 }); 1389 1390 } 1391 1392 getPropertyUrl = (property) => { 1393 let state = property.state; 1394 let city = this.slugify(property.city); 1395 let zip = property.postal_code 1396 let address = this.slugify(property.address); 1397 let blossorId = property.blossorId; 1398 return `homes-for-sale/${state}/${city}/${zip}/${address}/bid-${blossorId}`; 1399 } 1400 1401 slugify(text) { 1402 // replace non letter or digits by - 1403 text = text.replace(/[^\pL\d]+~u/g, '_'); 1404 // transliterate 1405 text = text.normalize('NFKD').replace(/[\u0300-\u036F]/g,'') 1406 // remove unwanted characters 1407 text = text.replace(/[^_\w]+/g, '_'); 1408 // trim 1409 text = text.trim(); 1410 // remove duplicate - 1411 text = text.replace(/_+/g, '-'); 1412 // lowercase 1413 text = text.toLowerCase(); 1414 if (!text) { 1415 return 'n-a'; 1416 } 1417 return text 1418 } 1419 1420 getMlsData = () => { 1421 return JSON.parse(this.element.getAttribute('mls_data')); 1422 } 1423 1424 setMlsData = (data) => { 1425 this.element.setAttribute('mls_data', JSON.stringify(data)); 1426 } 1427 1428 1429 show() { 1430 this.element.setAttribute('style', 'display:flex') 1431 } 1432 1433 hide() { 1434 this.element.setAttribute('style', 'display:none') 1435 } 1436 } 1437 1438 class Page { 1439 constructor() { 1440 this.selectedSearch = null; 1441 this.lead = {} 1442 this.agent = {} 1443 1444 this.authorizationData = JSON.parse(atob(blueroofMiddlewareApi.apiKey.split('.')[1])); 1445 this.is_blueroof_person = this.authorizationData?.is_blueroof_person; 1446 this.viewingUpdatedListings = false;
1447 1448 } 1449 1450 setSelectedSearch(search){ 1451 this.selectedSearch = search; 1452 } 1453 1454 scrollToTop(){ 1455 document.getElementById('site-registration-bar').scrollIntoView({ behavior: 'smooth', block: 'start'}); 1456 } 1457 } 1458 1459 class messagingEmitter extends Messaging.BaseEmitter { 1460 1461 newMessage(message) { 1462 Pubsub.publish('messaging_emitter_new_message', message); 1463 } 1464 } 1465 1466 const blueroofMiddlewareApi = new BlueroofMiddlewareApi(); 1467 const page = new Page(blueroofMiddlewareApi); 1468 1469 let url = 'https://messaging.brivity.com' 1470 const messaging = new Messaging.Service(url, blueroofMiddlewareApi.apiKey, new messagingEmitter()); 1471 1472 1473 (async () => { 1474 let lead = await blueroofMiddlewareApi.getLeadBasicInfo(); 1475 let agent = await blueroofMiddlewareApi.getAgentProfile(lead.data?.brivity_agent_id); 1476 1477 page.lead = lead.data; 1478 page.agent = agent.data; 1479 1480 const menu = new Menu(page?.is_blueroof_person || false, page?.agent, blueroofMiddlewareApi.baseUrl, blueroofMiddlewareApi.apiKey); 1481 1482 1483 const collectionsService = new Collections.Service(window?.globalSiteVariables?.options?.apis?.collections?.url ?? '',blueroofMiddlewareApi.apiKey, "sitebuilder", new logger()); 1484 collectionsService.getCollections(0, 30).then((e) => { 1485 collections = e.data.Items; 1486 1487 let collectionList = []; 1488 1489 collections.forEach(collection => { 1490 collectionList.push({ 1491 collection_title: collection.collectionName, 1492 id: collection.collectionUUID, 1493 propertiesImages: collection?.propertiesImages?.length > 0 ? collection?.propertiesImages : [], 1494 1495 }) 1496 }); 1497 1498 copyPropertyToCollectionModal.setCollectionData(collectionList); 1499 1500 1501 1502 }); 1503 1504 const saveSearchBlock = new SaveSearchBlock(); 1505 const subHeader = new SubHeader(); 1506 const brivityHomeApp = new BrivityHomeApp(blueroofMiddlewareApi); 1507 const savedSearchSection = new SavedSearchesSection(); 1508 const deleteSavedSearchModal = new DeleteSavedSearchModal(blueroofMiddlewareApi); 1509 const shareSavedSearchModal = new ShareSavedSearchModal(); 1510 const updatedListingsSection = new UpdatedListingsSection(collectionsService); 1511 const pillSelector = new PillSelector(); 1512 const myFeed = new MyFeed(blueroofMiddlewareApi, collectionsService); 1513 const shareSavedPropertyModal = new ShareSavedPropertyModal(); 1514 const copyPropertyToCollectionModal = new CopyPropertyToCollectionModal(); 1515 const collectionModal = new CollectionModal(); 1516 const frequencyModal = new FrequencyModal(); 1517 1518 if(page?.is_blueroof_person) brivityHomeApp.hide(); 1519 1520 blueroofMiddlewareApi.getSavedListings().then((savedSearches) => { 1521 if(savedSearches.length > 0 ){ 1522 savedSearchSection.addSavedSearchCards(savedSearches); 1523 } 1524 else { 1525 saveSearchBlock.show(); 1526 } 1527 }) 1528 1529 document.addEventListener("click", (e) => { 1530 1531 const elements = document.querySelectorAll("[show_menu]"); 1532 elements.forEach((el) => { 1533 el.setAttribute("show_menu", "false"); 1534 }); 1535 1536 document.getElementById("c2dfac72-6233-4e8d-b0d2-f44e4240ebb4")?.setAttribute("show_menu", "false"); 1537 }); 1538 1539 1540 async function showUpdatedListings(savedSearch) { 1541 let updatedListings = await blueroofMiddlewareApi.getUpdatedListings(savedSearch.alertId) 1542 page.setSelectedSearch(savedSearch); 1543 1544 savedSearchSection.hide() 1545 1546 await updatedListingsSection.show(updatedListings); 1547 subHeader.showTopHeader(); 1548 subHeader.setTopHeaderTitle("Saved Searches"); 1549 subHeader.setTitle(savedSearch.searchName); 1550 1551 subHeader.hidePrimaryButton(); 1552 subHeader.showMenuButton(); 1553 1554 let currentSearch = savedSearchSection.savedSearches.find((search) => search.alertId == savedSearch.alertId) 1555 1556 1557 pillSelector.setCurrentSavedSearch(currentSearch);
1558 updatedListingsSection.element.prepend(pillSelector.element) 1559 1560 page.viewingUpdatedListings = true; 1561 page.scrollToTop() 1562 1563 } 1564 1565 Pubsub.subscription('messaging_emitter_new_message', (message) => { 1566 toast.show('New message from ' + message.createdByAlias) 1567 }).subscribe(); 1568 1569 Pubsub.subscription("delete_saved_search_pressed",deleteSavedSearchModal.show).subscribe() 1570 Pubsub.subscription("share_saved_search_pressed", shareSavedSearchModal.show).subscribe() 1571 1572 Pubsub.subscription('manage_alerts_pressed', ( savedSearch) => { 1573 page.selectedSearch = savedSearch; 1574 frequencyModal.show(savedSearch); 1575 }).subscribe(); 1576 1577 Pubsub.subscription('frequency_modal_save_clicked', (reportFrequency) => { 1578 1579 let frequency = ''; 1580 switch(reportFrequency){ 1581 1582 case 'Daily': 1583 frequency = 'daily'; 1584 break; 1585 case 'Twice Daily': 1586 frequency = 'twice_daily'; 1587 break; 1588 case 'Multiple Times Per Day': 1589 frequency = 'four_times_daily'; 1590 break; 1591 case 'Weekly': 1592 frequency = 'weekly'; 1593 break; 1594 case 'Every 2 Weeks': 1595 frequency = 'bi_weekly'; 1596 break; 1597 case 'Monthly': 1598 frequency = 'monthly'; 1599 break; 1600 } 1601 1602 let updateListingAlert = { 1603 alertId: page?.selectedSearch?.alertId, 1604 frequency: frequency, 1605 mlsIds: page?.selectedSearch?.mlsIds, 1606 source: page?.selectedSearch?.source, 1607 activeForEmails: page?.selectedSearch?.activeForEmails, 1608 activeForAppNotifications: page?.selectedSearch?.activeForAppNotifications, 1609 searchName: page?.selectedSearch?.searchName, 1610 neighborhoodCityStates: page?.selectedSearch?.neighborhoodCityStates, 1611 cityStates: page?.selectedSearch?.cityStates, 1612 streetAddress: page?.selectedSearch?.streetAddress, 1613 countyStates: page?.selectedSearch?.countyStates, 1614 postalCodes: page?.selectedSearch?.postalCodes, 1615 mlsAreas: page?.selectedSearch?.mlsAreas, 1616 polygon: page?.selectedSearch?.polygon, 1617 mlsNums: page?.selectedSearch?.mlsNums, 1618 blossorIds: page?.selectedSearch?.blossorIds 1619 1620 } 1621 1622 blueroofMiddlewareApi.updateSavedListings(updateListingAlert).then((updatedSearch) => { 1623 1624 frequencyModal.hide(); 1625 toast.show('Frequency updated'); 1626 }).catch((e) => { 1627 toast.show('Error updating frequency', true); 1628 }) 1629 1630 1631 1632 }).subscribe(); 1633 1634 Pubsub.subscription("saved_search_deleted", (alertId) => { 1635 savedSearchSection.removeSavedSearchCard(alertId) 1636 if(page.viewingUpdatedListings) { 1637 Pubsub.publish("top_header_back_pressed"); 1638 } 1639 1640 }).subscribe() 1641 Pubsub.subscription("save_search_block_updates_pressed", showUpdatedListings).subscribe() 1642 1643 Pubsub.subscription("saved_search_block_icon_pressed", (e) => { 1644 let icon = e.icon 1645 let savedSearch = e.savedSearch; 1646 let filter; 1647 1648 1649 switch(icon){ 1650 case 'new': 1651 filter = 'new'; 1652 break;
1653 case 'openHouse': 1654 filter = 'open_house'; 1655 break; 1656 case 'sold': 1657 filter = 'status_change'; 1658 break; 1659 case 'priceChange': 1660 filter = 'price_change'; 1661 break; 1662 } 1663 1664 showUpdatedListings(savedSearch).then(() => { 1665 pillSelector.pillSelector.setAttribute('active_pill', filter) 1666 updatedListingsSection.filterProperties(filter) 1667 }) 1668 1669 }).subscribe(); 1670 1671 1672 Pubsub.subscription("top_header_back_pressed", () => { 1673 window.location.hash = ''; 1674 subHeader.hideTopHeader(); 1675 subHeader.showPrimaryButton(); 1676 subHeader.hideMenuButton(); 1677 subHeader.setTitle("Saved Searches"); 1678 updatedListingsSection.hide(); 1679 savedSearchSection.show(); 1680 page.setSelectedSearch(''); 1681 page.scrollToTop(); 1682 page.viewingUpdatedListings = false; 1683 }).subscribe() 1684 Pubsub.subscription("pill_selector_item_selected",(e) => {updatedListingsSection.filterProperties(e)}).subscribe(); 1685 1686 Pubsub.subscription("top_header_menu_item_pressed", (menuItemPressed) => { 1687 1688 if(menuItemPressed == 'Delete Saved Search'){ 1689 Pubsub.publish('delete_saved_search_pressed', page.selectedSearch.alertId); 1690 } 1691 else if(menuItemPressed == 'Share Saved Search'){ 1692 Pubsub.publish('share_saved_search_pressed', page.selectedSearch); 1693 } 1694 else if(menuItemPressed == 'Manage Alerts'){ 1695 Pubsub.publish('manage_alerts_pressed', page.selectedSearch); 1696 } 1697 }).subscribe(); 1698 1699 Pubsub.subscription('share_property', (e) => { 1700 shareSavedPropertyModal.show(e.property); 1701 }).subscribe(); 1702 1703 Pubsub.subscription('add_property_to_collection', (e) => { 1704 copyPropertyToCollectionModal.setIsAddingToCollection(true); 1705 copyPropertyToCollectionModal.show(e.property); 1706 }).subscribe(); 1707 1708 Pubsub.subscription('remove_property_from_collections', (e) => { 1709 let blossorId = e.property.blossorId; 1710 let myFeedData = myFeed.getMlsData(); 1711 collectionsService.checkIfInCollection([blossorId]).then((propertiesInCollections) => { 1712 if(propertiesInCollections.data[blossorId]){ 1713 propertiesInCollections.data[blossorId].forEac
1713h((collection) => { 1714 collectionsService.removePropertyFromCollection(collection.collectionUUID, collection.propertyUUID).then(() => { 1715 1716 let data = copyPropertyToCollectionModal.getCollectionData(); 1717 let collectionUUID = collection.collectionUUID; 1718 collectionsService.getCollectionProperties(collectionUUID,1,1).then((e) => { 1719 1720 let collectionIndex = data.findIndex((x) => x.id == collectionUUID); 1721 let collection = data[collectionIndex]; 1722 1723 collection.propertiesImages = []; 1724 if(e?.data?.properties?.length > 0){ 1725 collection.propertiesImages.push({mainPhoto: e?.data?.properties[0]?.photos[0]?.url}); 1726 } 1727 1728 data[collectionIndex] = collection; 1729 1730 copyPropertyToCollectionModal.setCollectionData(data); 1731 }) 1732 1733 //update my feed to set property heart as not favorited 1734 let myFeedPropertyIndex = myFeedData.findIndex((x) => x.blossorId == blossorId); 1735 if(myFeedPropertyIndex > -1){ 1736 myFeedData[myFeedPropertyIndex].favorite = false; 1737 myFeed.setMlsData(myFeedData); 1738 } 1739 1740 //update property in update search 1741 let propertyCard = document.getElementById(blossorId); 1742 let propertyCardMLS = JSON.parse(propertyCard.getAttribute('mls')); 1743 propertyCardMLS.favorite = false; 1744 propertyCard.setAttribute('mls', JSON.stringify(propertyCardMLS)); 1745 1746 1747 }).catch((e) => { 1748 toast.show('Error removing from collection'); 1749 }); 1750 }); 1751 } 1752 }); 1753 }).subscribe(); 1754 1755 Pubsub.subscription('copy_property_to_collection_modal_save_pressed', (e) => { 1756 let collectionUUID = e.collectionUUID; 1757 let blossorId = e.property.blossorId; 1758 collectionsService.addPropertyToCollection(collectionUUID, [blossorId]).then(() => { 1759 1760 1761 let data = copyPropertyToCollectionModal.getCollectionData(); 1762 let myFeedData = myFeed.getMlsData(); 1763 1764 collectionsService.getCollectionProperties(collectionUUID,1,1).then((e) => { 1765 1766 let collectionIndex = data.findIndex((x) => x.id == collectionUUID); 1767 let collection = data[collectionIndex]; 1768 1769 collection.propertiesImages = []; 1770 if(e?.data?.properties?.length > 0){ 1771 collection.propertiesImages.push({mainPhoto: e?.data?.properties[0]?.photos[0]?.url}); 1772 } 1773 1774 data[collectionIndex] = collection; 1775 1776 copyPropertyToCollectionModal.setCollectionData(data); 1777 1778 //update my feed to set property heart as favorited 1779 let myFeedPropertyIndex = myFeedData.findIndex((x) => x.blossorId == blossorId); 1780 if(myFeedPropertyIndex > -1){ 1781 myFeedData[myFeedPropertyIndex].favorite = true; 1782 myFeed.setMlsData(myFeedData); 1783 } 1784 1785 //update property in update search 1786 let propertyCard = document.getElementById(blossorId); 1787 let propertyCardMLS = JSON.parse(propertyCard.getAttribute('mls')); 1788 propertyCardMLS.favorite = true; 1789 propertyCard.setAttribute('mls', JSON.stringify(propertyCardMLS)); 1790 }) 1791 1792 copyPropertyToCollectionModal.hide(); 1793 }); 1794 }).subscribe(); 1795 1796 Pubsub.subscription('on_new_collection_saved', (e) => { 1797 if(e.type == 'save'){ 1798 1799 let people = [{ personUUID: page.lead.brivity_uuid, role: "lead" }]; 1800 let properties = [""]; 1801 collectionsService.createCollection(e.name, e.description, page.lead.brivity_uuid, people, properties).then((e) => { 1802 1803 let collections = copyPropertyToCollectionModal.getCollectionData(); 1804 let newCollection = { 1805 collection_title: e.data.collectionName, 1806 id: e.data.collectionUUID, 1807 propertiesImages: [], 1808 } 1809 collections.unshift(newCollection); 1810 copyPropertyToCollectionModal.setCollectionData(collections); 1811 1812 collectionModal.hide(); 1813 1814 }).catch((e) => { 1815 collectionModal.showError(true) 1816 }); 1817 } 1818 1819 }).subscribe(); 1820 1821 Pubsub.subscription('show_new_collection_modal', (e) => { 1822 collectionModal.show(); 1823 }).subscribe(); 1824
1825 window.addEventListener( "hashchange", function( event ) { 1826 if(window.location.hash == ''){ 1827 Pubsub.publish("top_header_back_pressed"); 1828 } 1829 }); 1830 1831 let modalBackdrop = document.getElementsByClassName('center-modal'); 1832 for(let i = 0; i < modalBackdrop.length; i++){ 1833 modalBackdrop[i].addEventListener('click', (e) => { 1834 if(e.target == modalBackdrop[i]){ 1835 modalBackdrop[i].style.display = 'none'; 1836 } 1837 }); 1838 } 1839 1840 document.addEventListener("click", (e) => { 1841 1842 const elements = document.querySelectorAll("[show_menu]"); 1843 elements.forEach((el) => { 1844 el.setAttribute("show_menu", "false"); 1845 }); 1846 1847 // document.getElementById("c2dfac72-6233-4e8d-b0d2-f44e4240ebb4")?.setAttribute("show_menu", "false"); 1848 }); 1849 })(); 1850 } 1851 }) 1852 1853</script>
1853 <div id="myportal-page" style="display:none"> <div style="position:relative; width:100%;"> <div style="position:absolute;z-index:10; top:0; bottom:0; "> <place-menu></place-menu> </div> <div class="collection-page" style="flex:1;"> <div class="page-width-parent"> <place-pagesubheader title="SAVED SEARCHES" show_top_header="false" button_title="Create New" button_icon="plus" show_menu="false" menu_items='[{"icon":"bell", "text": "Manage Alerts"},{ "icon": "share-2", "text": "Share Saved Search" },{ "icon": "trash", "text": "Delete Saved Search" }]' ></place-pagesubheader> <div style="margin: 24px 0"> <place-actioncard style="display:none;" id="save-search-block" title="Save Search" sub_title="Save your customized searches and be the first to know about new properties" button_text="Search" button_icon="search" button_icon_fill="#fff" card_width="315" > </place-actioncard> </div> <div id="saved-searches" style="display:flex; flex-wrap:wrap; margin: 24px 0;"> </div> <div id="updated-listings-section" style="display:none; flex-wrap:wrap;"> <div id="updated-listings" style="display:flex;flex-wrap:wrap;gap:24px;margin-bottom:24px;"> </div> </div> <div style="margin-bottom:32px"> <place-gethomeapp></place-gethomeapp> </div> <div class="my-feed-parent"> <place-myfeedblock style="display:none" display_menu="false"></place-myfeedblock> </div> </div> </div> </div> <place-basicmodal id="delete-saved-search-modal" class="center-modal" style="display:none" title="Delete Saved Search" sub_title="Deleting a saved search will permanently remove it from your account and you will be unsubscribed to any connected listing alerts. Are you sure you would like to delete this search?" title_icon="trash" primary_button_text="Delete" tertiary_button_text="Cancel" ></place-basicmodal> <place-basicmodal id="share-saved-search-modal" class="center-modal" style="display:none" title="Share Saved Search" sub_title="Copy link to share search." title_icon="share-2" primary_button_text="Copy Link" ></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> <place-frequencymodal class="center-modal" style="display:none" title="Manage Listing Alerts" title_icon="bell" menu_items='[{ "text": "Daily" },{ "text": "Twice Daily" }, { "text": "Multiple Times Per Day" },{ "text": "Weekly" },{ "text": "Every 2 Weeks" },{ "text": "Monthly" }]' selected_menu_item="Never" > </place-frequencymodal> </div> </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> <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 dynamic_loading"></span> <br><span class="agent_city_dynamic dynamic_loading 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 dynamic_loading"></span> <span class="agent_zip_dynamic dynamic_loading 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 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 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 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 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 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 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 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 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 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 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 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 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"}"> 1854<!-- chatbot v1 --> 1855<!-- Chatbot drawer container --> 1856<div class="chatbot-drawer-container loading"> 1857 <div class="chatbot-content-wrapper"> 1858 <div class="chatbot-outside-content"> 1859 <div class="chatbot-bubble-message-container cb-hide"> 1860 <img src="https://cdn.brivity.com/images/people/83546158/3c20754ab60865aca449acdc68f153799d24525b-original.jpg?1767133867" class="chatbot-agent-img" alt="Agent profile image in chat bubble"/> 1861 <div id="call-to-action" class="bubble-message"></div> 1862 <button type="button" class="chatbox-bubble-close" data-dismiss="modal" aria-label="Close">
1863 <span aria-hidden="true">×</span> 1864 </button> 1865 </div> 1866 <button id="chatbot-open-btn" class="chatbot-open-btn bg-prmry" aria-label="Chatbot Open Button"> 1867 <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> 1868 <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"/> 1869 </svg> 1870 </button> 1871 </div> 1872 <div class="chatbot-drawer"> 1873 <div class="chatbot-header bg-prmry"> 1874 <div class="chatbot-agent-info"> 1875 <img src="https://cdn.brivity.com/images/people/83546158/3c20754ab60865aca449acdc68f153799d24525b-original.jpg?1767133867" class="chatbot-agent-img" alt="Agent profile image in chat header"/> 1876 <div class="chatbot-agent"> 1877 <h3 class="chatbot-agent-name">Darin Stephens, PhD</h3> 1878 <h4><span class="chatbot-agent-title">Founder & CEO & Broker</span> | <span class="chatbot-agent-company">Stone & Story Real Estate Group</span></h4> 1879 </div> 1880 <a id="chatbot-agent-phone" style="display: none;">(785) 250-7278</a> 1881 </div> 1882 <button id="close-chatbot-drawer" type="button" class="chatbox-modal-close" data-dismiss="modal" aria-label="Close"> 1883 <span aria-hidden="true">×</span> 1884 </button> 1885 </div> 1886 <div class="chatbot-body"> 1887 <div class="chatbot-message-container"> 1888 <img src="https://cdn.brivity.com/images/people/83546158/3c20754ab60865aca449acdc68f153799d24525b-original.jpg?1767133867" class="chatbot-agent-img" alt="Agent profile image in message"/> 1889 <h4 id="initial_message" class="chatbot-chat-messages not-loaded"></h4> 1890 <div class="chatbot-chat-messages loading"> 1891 <span class="typing-indicator"> 1892 <span></span> 1893 <span></span> 1894 <span></span> 1895 </span> 1896 </div> 1897 </div> 1898 <form id="chatbotForm" class="chatbot-form"> 1899 <input type="name" id="chatbot_fullname" class="chatbox-form-control no-native-focus" placeholder="Full Name" 1900 pattern="^[A-Za-z'\- ]+ [A-Za-z'\- ]+$" 1901 required /> 1902 <input type="tel" id="chatbot_phone" class="chatbox-form-control no-native-focus" placeholder="Phone" required /> 1903 <input type="email" id="chatbot_email" class="chatbox-form-control no-native-focus" placeholder="Email" 1904 pattern="^[^@\s]+@[^@\s]+\.[^@\s]+$" 1905 required /> 1906 <textarea id="chatbot_message" class="chatbox-form-control chatbot-message" rows="5" name="notes" placeholder="Any Comments or Questions"></textarea> 1907 <div class="chatbot-consent-container"> 1908 <div class="chatbot-toggle"> 1909 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
1909communications 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>. 1910 </div> 1911 </div> 1912 <input type="hidden" id="chatbot_tags"> 1913 </form> 1914 </div> 1915 <div class="chatbot-footer"> 1916 <button type="submit" form="chatbotForm" class="chatbot-send bg-prmry chatbot-btn-disabled" data-dismiss="modal" aria-label="Close" disabled> 1917 Send 1918 <span aria-hidden="true"> 1919 <svg class="chatbot-btn-icon" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> 1920 <g clip-path="url(#clip0_2435_997)"> 1921 <path d="M14.6667 1.33331L7.33337 8.66665" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 1922 <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"/> 1923 </g> 1924 <defs> 1925 <clipPath id="clip0_2435_997"> 1926 <rect width="16" height="16" fill="white"/> 1927 </clipPath> 1928 </defs> 1929 </svg> 1930 </span> 1931 </button> 1932 </div> 1933 </div> 1934 </div> 1935</div> <style> 1936 .signup-consent-checkbox-section { 1937 display: none; 1938 flex-direction:column; 1939 align-items:flex-start; 1940 padding: 6px 0; 1941 } 1942 1943 .signup-consent-checkbox-section .checkbox { 1944 display:flex; 1945 align-items:flex-start; 1946 justify-content:center; 1947 gap:8px; 1948 padding:0 !important; 1949 } 1950 1951 .signup-consent-checkbox-section .checkbox input { 1952 position:unset; 1953 margin:2px 0 0 0 !important; 1954 } 1955 1956 .signup-consent-checkbox-section .checkbox span { 1957 color: #666666; 1958 font-size: 14px; 1959 font-weight: 400; 1960 line-height:16px; 1961 } 1962 1963 .signup-verbage { 1964 text-align:center; 1965 font-size:10px; 1966 line-height:16px; 1967 } 1968 1969 .signup-verbage span { 1970 color: #8C8C8C; 1971 font-weight:600; 1972 } 1973 1974 .signup-verbage a { 1975 color:#5386E4 !important; 1976 font-weight:400; 1977 } 1978 1979 .signup-verbage .twilio-enabled-verbage { 1980 display:none; 1981 } 1982 1983 1984 1985 </style> <div id="modal-mount" data-modal-bundle="https://cdn1.brivityidx.com/assets/modals/v1/all.html?ck=1789512948"></div>
1985 <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>
1985<script> 1986 document.addEventListener("DOMContentLoaded", () => { 1987 class Toast { 1988 constructor() { 1989 this.element = document.querySelector('place-generictoast'); 1990 } 1991 1992 show(message, error = false, link) { 1993 var dispatch = function () { 1994 window.dispatchEvent( 1995 new CustomEvent("ShowToast", { 1996 detail: { 1997 text: message, 1998 error: error, 1999 link: link, 2000 }, 2001 }) 2002 ); 2003 }; 2004 if (window.sitebuilderPlaceComponents && window.sitebuilderPlaceComponents.ensureLoaded) { 2005 window.sitebuilderPlaceComponents 2006 .ensureLoaded('place-generictoast') 2007 .then(dispatch) 2008 .catch(function (err) { 2009 console.warn('toast.show fallback (web-components unavailable):', message, err); 2010 }); 2011 } else { 2012 dispatch(); 2013 } 2014 } 2015 } 2016 2017 window.toast = new Toast(); 2018 }); 2019 </script>
2019
2019<script src="https://cdn.jsdelivr.net/npm/@turf/[email protected]/turf.min.js"></script>
2019
2019<script src="https://maps.googleapis.com/maps/api/js?libraries=geocoding,places,marker,drawing&key=AIzaSyAjpuNg6WGCMV5rzoJcIP2QmMTVto6hYmc&map_ids=85c127b7bf0255d9"></script>
2019
2019<script src="https://cdn1.brivityidx.com/assets/js/build.min.js?ck="></script>
2019
2019<script src="https://cdn1.brivityidx.com/assets/js/top_bar_v2.min.js?ck="></script>
2019
2019<script src="https://cdn1.brivityidx.com/assets/js/global_js.min.js?ck=1789512947"></script>
2019
2019<script>deferScript("https://cdn1.brivityidx.com/assets/js/global_js_defer.min.js?ck=1789512947", 5000);</script>
2019
2019<script> 2020 function shouldLoadChatbotImmediately() { 2021 const settingsEl = document.getElementById('hchatbot_settings'); 2022 if (!settingsEl) return false; 2023 2024 const version = Number(settingsEl.dataset.chatbotVersion); 2025 let isInitialized = false; 2026 2027 try { 2028 const session = JSON.parse(sessionStorage.getItem('cbSession') || '{}'); 2029 isInitialized = session.chatbotInitialized === true; 2030 } catch (e) {} 2031 2032 return version > 1 && isInitialized; 2033 } 2034 </script>
2034
2034<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>
2034
2034<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>
2034
2034<script type="text/javascript" src="https://cdn1.brivityidx.com/assets/js/jquery.geocomplete.min.js"></script>
2034<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.bootstrapvalidator/0.5.3/js/bootstrapValidator.min.js"></script>
2034<script type="text/javascript" src="https://cdn1.brivityidx.com/assets/js/member_area_components.js"></script>
2034<script type="text/javascript" src="https://cdn1.brivityidx.com/assets/js/update_agent_info.js"></script>
2034
2034<script src="https://mobile-component-services-library.s3.amazonaws.com/collections_service.min.js?ck=1"></script>
2034
2034<script src="https://mobile-component-services-library.s3.amazonaws.com/messaging_service.min.js?ck=1"></script>
2034
2034<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")}} 2035$(window).resize(changePlaceholder).trigger('resize')})</script>
2035
2035<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>
2035
2035<script>$(document).ready(function(){$("ul.seo-anchor-links li:nth-of-type(4) a").attr("href","/search")})</script>
2035
2035<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)} 2036data.interval=setInterval(updateTimer,settings.refreshInterval);render(value);function updateTimer(){value+=increment;loopCount++;render(value);if(typeof(settings.onUpdate)=='function'){settings.onUpdate.call(self,value)} 2037if(loopCount>=loops){$self.removeData('countTo');clearInterval(data.interval);value=settings.to;if(typeof(settings.onComplete)=='function'){settings.onComplete.call(self,value)}}} 2038function 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>
2038
2038<script>$(document).ready(function(){$('#sign-up-modal.modal #signupForm').append('<input type="hidden" name="tags" value="registration_signup">')})</script>
2038
2038<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>
2038
2038<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>
2038
2038<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>
2038
2038<script src="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/owl.carousel.min.js"></script>
2038 <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.