PageSourceSearch

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

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