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 </span> </a> <a class="topLink flex aiCenter thin saveSearchTop" href="/myportal/searches"> <svg width="16" height="16" viewBox="0 4 20 17" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M19 21L12 16L5 21V5C5 4.46957 5.21071 3.96086 5.58579 3.58579C5.96086 3.21071 6.46957 3 7 3H17C17.5304 3 18.0391 3.21071 18.4142 3.58579C18.7893 3.96086 19 4.46957 19 5V21Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" /> </svg> <span class="ml6 topLabel">Saved Searches </span> </a> <a class="topLink flex aiCenter thin market-report-top" style="display:none" href="/myportal/reports"> <svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M7.70589 13.1667C10.6514 13.1667 13.0392 10.7789 13.0392 7.83333C13.0392 4.88781 10.6514 2.5 7.70589 2.5C4.76037 2.5 2.37256 4.88781 2.37256 7.83333C2.37256 10.7789 4.76037 13.1667 7.70589 13.1667Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M14.3725 14.5L11.4725 11.6" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> <span class="ml6 topLabel">My Reports </span> </a> <a class="aiCenter flex topBarProfile thin" href="/myportal/profile"> <span class="profileName"></span> </a> <a style="padding-right: 0px" class="aiCenter flex thin" id="topBarLogout" href="javascript:void()"> <svg width="23" height="23" viewBox="0 0 23 23" fill="none" xmlns="http://www.w3.org/2000/svg"> <g clip-path="url(#clip0_16761_179186)"> <path d="M16.4003 16.214C19.0038 13.6106 19.0038 9.38945 16.4003 6.78595C13.7968 4.18246 9.57572 4.18246 6.97222 6.78595C4.36873 9.38945 4.36873 13.6105 6.97222 16.214C9.57572 18.8175 13.7968 18.8175 16.4003 16.214Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M9.80066 9.61438L13.5719 13.3856" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M9.80066 13.3856L13.5719 9.61438" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </g> <defs> <clipPath id="clip0_16761_179186"> <rect width="16" height="16" fill="white" transform="translate(0.372559 11.5) rotate(-45)"/> </clipPath> </defs> </svg> <span class="ml6">Log Out</span> </a> </div> </div> </div> <div id="not-logged-in"> <topbar_agent_info_not_logged_in/> <ul class="list-unstyled list-inline no-margin"> <li class="topBarSignin"><a href="#" onclick="showGoogleOneTap(true);"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-plus-circle mr10"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="16"></line>
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 & Terms of Service</a></li> <li><a id='sitemapUrl' href='/sitemap' style='display: inline;'>Sitemap</a></li> </ul> </div> </section> <input type="hidden" id="hchatbot_settings" data-chatbot-version="1" value="{"chat_position":"right","call_to_action_text":"Hi there! Please let us know if you have any questions and an agent will reach out to you as soon as possible.","initial_message":"Enter your question below and an agent will be in touch with you.","tags":"IDX Chat","version":"1"}"> 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">×</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">×</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.