PageSourceSearch

https://www.stoneandstory.com/myportal/searches

html stoneandstory.com collected 2026-09-26 15:07:33 UTC 135,673 bytes, 2,038 lines download raw bytes

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&nbsp;</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&nbsp;</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&nbsp;</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&amp;multi_cat=CountyState&amp;status=1&amp;mlsId=434,319%7C321%7C145%7C452&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState&amp;status=1&amp;mlsId=434,319%7C321%7C145%7C452&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState|CityState&amp;status=1&amp;view=no_view&amp;mlsId=434|319|321|145|452&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState|CountyState|CountyState|CountyState|CountyState|CountyState|CountyState|CityState&amp;status=1&amp;view=no_view&amp;mlsId=434|319|321|145|452&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CountyState&amp;status=1&amp;mlsId=434,319%7C321%7C145%7C452&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState&amp;status=1&amp;mlsId=434,319%7C321%7C145%7C452&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState|CityState&amp;status=1&amp;view=no_view&amp;
219mlsId=434|319|321|145|452&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState|CountyState|CountyState|CountyState|CountyState|CountyState|CountyState|CityState&amp;status=1&amp;view=no_view&amp;mlsId=434|319|321|145|452&amp;q_sort=createdAt-&amp;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 &amp; 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 &amp; 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="{&quot;chat_position&quot;:&quot;right&quot;,&quot;call_to_action_text&quot;:&quot;Hi there! Please let us know if you have any questions and an agent will reach out to you as soon as possible.&quot;,&quot;initial_message&quot;:&quot;Enter your question below and an agent will be in touch with you.&quot;,&quot;tags&quot;:&quot;IDX Chat&quot;,&quot;version&quot;:&quot;1&quot;}">
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">&times;</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 &amp; CEO &amp; Broker</span> | <span class="chatbot-agent-company">Stone &amp; 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">&times;</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.