1<!DOCTYPE html> <html lang="en"> <head><meta name="description" content=""> <meta charset="utf-8"> <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="msvalidate.01" content="52D8CD5F9EA2B1031F2D2472023A5D34"> <title>MyPortal | Collections</title>
1<script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"LocalBusiness","name":"The Good Home Team l eXp Realty l PLACE","url":"https:\/\/www.buythegoodway.com","image":"https:\/\/cdn1.brivityidx.com\/assets\/images\/uploads\/102811\/TheGoodHomeTeam-Logo-PLACE-EXP-White-web.png","telephone":"+19722157653","address":{"@type":"PostalAddress","streetAddress":"7965 Custer Rd. Suite #125 ","addressLocality":"Plano","addressRegion":"TX","postalCode":"75025","addressCountry":"US"}}</script>
1 <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/102811/place_favicon_icon(1).ico" 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.buythegoodway.com/myportal/collections">
20<script> 21 function deferScriptOnLoad(url, sleep = 0) { 22 window.addEventListener('load', function () { 23 deferScript(url, sleep); 24 }); 25 } 26 function deferScript(url, sleep = 0) { 27 if (sleep > 0) { 28 setTimeout(() => { 29 deferScript(url); 30 }, sleep); 31 return; 32 } 33 let s = document.createElement('script'); 34 s.type = 'text/javascript'; 35 s.async = true; 36 s.src = url; 37 let x = document.getElementsByTagName('head')[0]; 38 x.appendChild(s); 39 } 40 41 /* PLACE_COMPONENTS_LOADER_START */ 42 window.sitebuilderPlaceComponents = (function () { 43 var DEFAULT_URL = 'https://mobile-component-services-library-dev.brivity.com/web-components.min.js?ck=1'; 44 var BUNDLE_URLS = { default: DEFAULT_URL }; 45 var loadPromises = {}; 46 var LOAD_TIMEOUT_MS = 10000; 47 48 function urlForTag(tagName) { 49 return BUNDLE_URLS[tagName] || BUNDLE_URLS.default; 50 } 51 52 function ensureLoaded(tagName) { 53 var url = urlForTag(tagName); 54 if (loadPromises[url]) { 55 return loadPromises[url]; 56 } 57 loadPromises[url] = new Promise(function (resolve, reject) { 58 var settled = false; 59 var timer = setTimeout(function () { 60 if (settled) return; 61 settled = true; 62 reject(new Error('web-components load timeout')); 63 }, LOAD_TIMEOUT_MS); 64 var s = document.createElement('script'); 65 s.type = 'text/javascript'; 66 s.async = true; 67 s.src = url; 68 s.onerror = function () { 69 if (settled) return; 70 settled = true; 71 clearTimeout(timer); 72 reject(new Error('web-components script onerror')); 73 }; 74 document.getElementsByTagName('head')[0].appendChild(s); 75 if (window.customElements && customElements.whenDefined) { 76 customElements.whenDefined(tagName).then(function () { 77 if (settled) return; 78 settled = true; 79 clearTimeout(timer); 80 resolve(); 81 }); 82 } 83 }); 84 return loadPromises[url]; 85 } 86 87 var EAGER_SELECTOR = 'place-propertycard, place-searchpagefilter, place-bedbathfiltermodal, ' + 88 'place-listingstatusmodal, place-propertytypemodal, place-savesearchmodal, ' + 89 'place-basicmodal, place-details, place-agentbio, place-agentmessaging, ' + 90 'place-contactyouragent, place-menu, place-collectionpopup, ' + 91 'place-copycollectionmodal, place-removecollectionpopup, place-vs-accumulate'; 92 93 function warmIfEagerTagsPresent() { 94 if (document.querySelector(EAGER_SELECTOR)) { 95 ensureLoaded('place-propertycard').catch(function () {}); 96 } 97 } 98 if (document.readyState === 'loading') { 99 document.addEventListener('DOMContentLoaded', warmIfEagerTagsPresent); 100 } else { 101 warmIfEagerTagsPresent(); 102 } 103 104 var INTERACTION_SELECTOR = 'place-getyourhomecta, place-generictoast, ' + EAGER_SELECTOR + 105 ', [data-needs-place-components]'; 106 function onInteract(e) { 107 var t = e.target; 108 if (t && t.closest && t.closest(INTERACTION_SELECTOR)) { 109 ensureLoaded('place-generictoast').catch(function () {}); 110 } 111 } 112 document.addEventListener('pointerdown', onInteract, true); 113 document.addEventListener('focusin', onInteract, true); 114 115 function idleWarm() { 116 ensureLoaded('place-generictoast').catch(function () {}); 117 } 118 if ('requestIdleCallback' in window) { 119 requestIdleCallback(idleWarm, { timeout: 5000 }); 120 } else { 121 setTimeout(idleWarm, 3000); 122 } 123 124 return { ensureLoaded: ensureLoaded }; 125 })(); 126 /* PLACE_COMPONENTS_LOADER_END */ 127 128 const googleApiKey = 'AIzaSyAjpuNg6WGCMV5rzoJcIP2QmMTVto6hYmc' 129 130 /* Lazy loader for Google Maps API + turf.js. 131 * The TURF_INLINE / MAPS_API_INLINE placeholders below are emitted by 132 * Sitemodel.php only on pages whose blocks actually consume Maps/turf. 133 * On other pages those tags are stripped, and consumers call 134 * sitebuilderMapsApi.ensureLoaded() to inject them on demand. 135 * 136 * Safari fix vs. the prior reverted attempt (commit 0cef3135e): uses 137 * Google's official &callback= parameter, not setTimeout, to detect 138 * Maps readiness. 139 */ 140 window.sitebuilderMapsApi = (function () { 141 var TURF_URL = 'https://cdn.jsdelivr.net/npm/@turf/[email protected]/turf.min.js';
142 var MAPS_URL = 'https://maps.googleapis.com/maps/api/js?libraries=geocoding,places,marker,drawing&key=' + 143 googleApiKey + '&map_ids=85c127b7bf0255d9&callback=__sitebuilderMapsReady'; 144 var LOAD_TIMEOUT_MS = 15000; 145 var loadPromise = null; 146 147 function injectScript(url) { 148 var s = document.createElement('script'); 149 s.type = 'text/javascript'; 150 s.async = true; 151 s.src = url; 152 document.getElementsByTagName('head')[0].appendChild(s); 153 return s; 154 } 155 156 function loadTurf() { 157 return new Promise(function (resolve, reject) { 158 if (window.turf) { resolve(); return; } 159 var s = injectScript(TURF_URL); 160 s.onload = function () { resolve(); }; 161 s.onerror = function () { reject(new Error('turf load failed')); }; 162 }); 163 } 164 165 function loadMaps() { 166 return new Promise(function (resolve, reject) { 167 if (window.google && window.google.maps) { resolve(); return; } 168 window.__sitebuilderMapsReady = function () { resolve(); }; 169 var s = injectScript(MAPS_URL); 170 s.onerror = function () { reject(new Error('maps load failed')); }; 171 }); 172 } 173 174 function ensureLoaded() { 175 if (loadPromise) return loadPromise; 176 if (window.google && window.google.maps && window.turf) { 177 loadPromise = Promise.resolve(); 178 return loadPromise; 179 } 180 loadPromise = new Promise(function (resolve, reject) { 181 var settled = false; 182 var timer = setTimeout(function () { 183 if (settled) return; 184 settled = true; 185 reject(new Error('maps/turf load timeout')); 186 }, LOAD_TIMEOUT_MS); 187 Promise.all([loadTurf(), loadMaps()]).then(function () { 188 if (settled) return; 189 settled = true; 190 clearTimeout(timer); 191 resolve(); 192 }, function (err) { 193 if (settled) return; 194 settled = true; 195 clearTimeout(timer); 196 reject(err); 197 }); 198 }); 199 return loadPromise; 200 } 201 202 return { ensureLoaded: ensureLoaded }; 203 })(); 204 </script>
204 <link href="https://cdn1.brivityidx.com/assets/css/style-headers.css" rel="stylesheet"><link href="https://cdn1.brivityidx.com/assets/css/style-premium.css" rel="stylesheet"><link href="https://cdn1.brivityidx.com/assets/css/style-footers.min.css" rel="stylesheet"><link href="https://cdn1.brivityidx.com/idx-sites/1/7/7/17763/site_custom.css?v=1789575730" rel="stylesheet">
204<script type="text/javascript" src="https://cdn1.brivityidx.com/idx-sites/1/7/7/17763/global_js_variables.js?v=1789575730"></script>
204<link rel="stylesheet" href="https://use.typekit.net/mao5ffc.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=0"/> <meta name="facebook-domain-verification" content="tbuvzrwar2oyflyxyg0nd6g7hvwgdn" /> <div class="gtranslate_wrapper"></div>
204<script>window.gtranslateSettings={"default_language":"en","languages":["en","es"],"wrapper_selector":".gtranslate_wrapper","alt_flags":{"en":"usa"}}</script>
204
204<script src="https://cdn.gtranslate.net/widgets/latest/float.js" defer></script>
204
204<script> 205var propDetailsPixelOnReady = function(){ 206 let propDetFpst = new FbRealEstatePixelTracker({"eventType": "ViewContent", "content_ids": [""]}); 207 propDetFpst.fireEvent(); 208}; 209if (document.readyState === "complete" || (document.readyState !== "loading" && !document.documentElement.doScroll)) { 210 propDetailsPixelOnReady(); 211} else { 212 document.addEventListener("DOMContentLoaded", propDetailsPixelOnReady); 213} 214 215</script>
215
215<script>
vendor: 327 bytes, lines 215-219
215(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 216new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 217j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 218'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 219})(window,document,'script','dataLayer','
219GTM-PWC2DGQ
vendor: 3 bytes, line 219
219');
219</script>
219 <meta property="og:url" content="https://www.buythegoodway.com/myportal/collections"> <meta property="og:image" content="http://images.brivityidx.com/assets/images/uploads/102811/og-place.png"> <meta property="og:image:secure_url" content="https://images.brivityidx.com/assets/images/uploads/102811/og-place.png"> <meta property="og:description" content=""> <meta property="og:title" content="MyPortal | Collections"> </head> <body>
vendor: 68 bytes, line 219
219 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
219GTM-PWC2DGQ
vendor: 83 bytes, line 219
219" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
219<script> 220 window.fbAsyncInit = function() { 221 FB.init({ 222 appId : '1', 223 cookie : true, 224 xfbml : true, 225 version : 'v17.0' 226 }); 227 FB.AppEvents.logPageView(); 228 }; 229 230 setTimeout(() => {(function(d, s, id){ 231 var js, fjs = d.getElementsByTagName(s)[0]; 232 if (d.getElementById(id)) {return;} 233 js = d.createElement(s); js.id = id; 234 js.defer = true; 235 js.xfbml = false; 236 js.src = "//connect.facebook.net/en_US/sdk.js"; 237 fjs.parentNode.insertBefore(js, fjs); 238 }(document, 'script', 'facebook-jssdk'))}, 5000); 239 </script>
239<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>
239<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"> <div class="place-hiring-modal modal fade magic-modal" id="sell-modal" tabindex="-1" role="dialog" aria-labelledby="sell-modal" style="display: none;"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-body" style="text-align: center;"> <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;">We're Hiring!</h4> <p class="" data-selector="p" style="outline: none; cursor: inherit;">Join one of the fastest growing real estate teams in the US and Canada. Fill out the form below and we will contact you with more info.</p> <form class="form-contact" id="form-contact4" _lpchecked="1"> <input type="hidden" name="lead_type" value="recruit"><input type="hidden" name="tags" value="Hiring Submission"><div class="row"> <div class="col-sm-6"> <div class="form-group"> <input name="contact4_fullname" id="contact4_fullname" placeholder="Full Name" class="form-control" required="" type="text" autocomplete="off" style='background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAkCAYAAADo6zjiAAAAAXNSR0IArs4c6QAAAbNJREFUWAntV8FqwkAQnaymUkpChB7tKSfxWCie/Yb+gbdeCqGf0YsQ+hU95QNyDoWCF/HkqdeiIaEUqyZ1ArvodrOHxanQOiCzO28y781skKwFW3scPV1/febP69XqarNeNTB2KGs07U3Ttt/Ozp3bh/u7V7muheQf6ftLUWyYDB5yz1ijuPAub2QRDDunJsdGkAO55KYYjl0OUu1VXOzQZ64Tr+IiPXedGI79bQHdbheCIAD0dUY6gV6vB67rAvo6IxVgWVbFy71KBKkAFaEc2xPQarXA931ot9tyHphiPwpJgSbfe54Hw+EQHMfZ/msVEEURjMfjCjbFeG2dFxPo9/sVOSYzxmAwGIjnTDFRQLMQAjQ5pJAQkCQJ5HlekeERxHEsiE0xUUCzEO9AmqYQhiF0Oh2Yz+ewWCzEY6aYKKBZCAGYs1wuYTabKdNNMWWxnaA4gp3Yry5JBZRlWTXDvaozUgGTyQSyLAP0dbb3DtQlmcan0yngT2ekE9ARc+z4AvC7nauh9iouhpcGamJeX8XF8MaClwaeROWRA7nk+tUnyzGvZrKg0/40gdME/t8EvgG0/NOS6v9NHQAAAABJRU5ErkJggg=="); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%;'></div> <div id="honeypot-div"> <input name="age_required" id="age_required" value="" type="text" style="display: none;"></div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact4_email" id="contact4_email" placeholder="Email Address" class="form-control" required="" type="email"></div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact4_phone" id="contact4_phone" placeholder="Phone Number" class="form-control phone_mask" type="tel"></div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact4_position" id="contact4_position" placeholder="Job Position" class="form-control contact_position" required="" type="text"></div> </div> <div class="col-sm-6"> <div class="form-group dropdown-wrapper"> <select id="contact4_license" name="contact4_license" required="" class="form-control dropdown" type="text"><option value="I donât have a real estate license">I donât have a real estate license</option><option value="I have started real estate license coursework">I have started real estate license coursework</option><option value="I am currently licensed to practice real estate">I am currently licensed to practice real estate</option></select></div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact4_availability_date" id="contact4_availability_date" placeholder="Availability Date" class="form-control contact_date" type="text"></div> </div> <div class="col-sm-6"> <div class="form-group"> <textarea name="contact4_resume" id="contact4_resume" class="form-control" rows="3" placeholder="Resumé Link (Dropbox/Google Drive)"></textarea></div> </div> <div class="col-sm-6"> <div class="form-group"> <textarea name="contact4_message" id="contact4_message" class="form-control" rows="3" placeholder="Your Message" required=""></textarea></div> </div> </div> <button class="btn btn-primary" type="submit" id="cf-submit" name="submit" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;">Send</button> </form> </div> </div> </div> </div> <div class="modal fade magic-modal" id="getmarketingplan" tabindex="-1" role="dialog" aria-labelledby="getmarketingplan" style="display: none;"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-body"> <button type="button" class="close" data-dismiss="modal" aria-label="Close" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;"><span aria-hidden="true">Ã</span></button> <h4 class="prmry-color" data-selector="h1, h2, h3, h4, h5, h6" style="outline: none; cursor: inherit;">Request property marketing plan</h4> <p data-selector="p" style="outline: none; cursor: inherit;">You're one step away from getting a free marketing plan that shows how we'll sell your home for the most amount of money in the least amount of time - hassle free.</p> <form class="form-contact" id="form-contact6"> <input type="hidden" name="lead_type" value="seller"><input type="hidden" name="tags" value="Marketing_Plan_Requested"><div class="row"> <div class="col-sm-6"> <div class="form-group"> <input name="contact6_fname" id="contact6_fname" placeholder="First Name" class="form-control" required="" type="text"></div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact6_lname" id="contact6_lname" placeholder="Last Name" class="form-control" required="" type="text"></div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact6_email" id="contact6_email" placeholder="Email Address" class="form-control" required="" type="email"></div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact6_phone" id="contact6_phone" placeholder="Phone Number" class="form-control" required="" type="tel"></div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact6_address" id="contact6_address" placeholder="Address" class="form-control" required="" type="text"></div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact6_city" id="contact6_city" placeholder="City" class="form-control" required="" type="text"></div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact6_state" id="contact6_state" placeholder="State" class="form-control" required="" type="text"></div> </div> <div class="col-sm-6"> <div class="form-group"> <input name="contact6_zip" id="contact6_zip" placeholder="ZIP"
239class="form-control" required="" type="text"></div> </div> <div class="col-sm-12"> <div class="form-group"> <select name="contact6_whenareyouselling" id="contact6_whenareyouselling" class="form-control" placeholder="When are you planning to sell?"><option value="" disabled selected>When are you planning to sell?</option><option value="1">Now</option><option value="2">0-6 months</option><option value="3">6+ months</option></select></div> </div> </div> <button class="btn btn-primary" type="submit" id="cf-submit" name="submit" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;">Send</button> </form> </div> </div> </div> </div> <header id="premium-navigation" data-selector="#premium-navigation" style="outline: none; cursor: inherit;"><div class="main-nav"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse" style="outline: none; cursor: inherit;" data-selector="a.btn, button.btn, button"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="/" style="outline: none; cursor: inherit;"> <img class="img-responsive site_custom_logo" src="https://cdn1.brivityidx.com/assets/images/uploads/102811/TheGoodHomeTeam-Logo-PLACE-EXP-White-web.png" alt="Realvolution" style="outline: none; cursor: inherit;" data-selector="img"></a> </div> <div class="collapse navbar-collapse"> <ul class="nav navbar-nav navbar-right" style="outline: none; cursor: inherit;"> <li class="nav-item dropdown"> <a class="dropdown-toggle sec-nav-link-color" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false" href="/search">SEARCH LISTINGS<i class="fa fa-angle-down"></i></a> <ul class="dropdown-menu"> <li class="sec-nav-drop-color"> <a class="sec-nav-drop-link-color" href="/search">SEARCH ALL LISTINGS</a> </li> <li class="sec-nav-drop-color"> <a class="sec-nav-drop-link-color" href="/search?#?mlsId=17,33%7C95%7C630%7C380%7C161%7C646&price=1000000:&propertyType=Residential%7CMulti-Family%7CCondo/Townhome%7CVacant+Land%7CFarm/Ranch&status=1&q_sort=createdAt-&q_offset=0">SEARCH LUXURY LISTINGS</a> </li> </ul> </li> <li class="nav-item" data-selector="li" style="outline: none; cursor: inherit;"> <a class="nav-link-color" href="/buying" style="outline: none; cursor: inherit;">BUYING</a> </li> <li class="nav-item" data-selector="li" style="outline: none; cursor: inherit;"> <a class="nav-link-color" href="/selling" style="outline: none; cursor: inherit;">SELLING</a> </li> <li class="nav-item dropdown"> <a class="dropdown-toggle sec-nav-link-color" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false" href="/top_areas">Top Areas<i class="fa fa-angle-down"></i></a> <ul class="dropdown-menu"> <li class="sec-nav-drop-color"> <a class="sec-nav-drop-link-color" href="/search?multi_search=Plano,%20TX&multi_cat=CityState&propertyType=Residential%7CMulti-Family%7CCondo/Townhome&status=1&mlsId=17%7C33&price=10000:&q_sort=createdAt-&q_offset=0">PLANO</a> </li> <li class="sec-nav-drop-color"> <a class="sec-nav-drop-link-color" href="/search?multi_search=McKinney,%20TX&multi_cat=CityState&propertyType=Residential%7CMulti-Family%7CCondo/Townhome&status=1&mlsId=17%7C33&price=10000:&q_sort=createdAt-&q_offset=0">MCKINNEY</a> </li> <li class="sec-nav-drop-color"> <a class="sec-nav-drop-link-color" href="/search?multi_search=Allen,%20TX&multi_cat=CityState&propertyType=Residential%7CMulti-Family%7CCondo/Townhome&status=1&mlsId=17%7C33&price=10000:&q_sort=createdAt-&q_offset=0">ALLEN</a> </li> <li class="sec-nav-drop-color"> <a class="sec-nav-drop-link-color" href="/search?multi_search=Frisco,%20TX&multi_cat=CityState&propertyType=Residential%7CMulti-Family%7CCondo/Townhome&status=1&mlsId=17%7C33&price=10000:&q_sort=createdAt-&q_offset=0">FRISCO</a> </li> <li class="sec-nav-drop-color">
239 <a class="sec-nav-drop-link-color" href="https://nickgood.realvolution.com/search#mlsId=17%7C33&price=10000:&multi_search=The%20Colony,%20TX&multi_cat=CityState&propertyType=Residential%7CMulti-Family%7CCondo/Townhome&status=1&q_sort=createdAt-&q_offset=0">THE COLONY</a> </li> <li class="sec-nav-drop-color"> <a class="sec-nav-drop-link-color" href="/search?multi_search=Richardson,%20TX&multi_cat=CityState&propertyType=Residential%7CMulti-Family%7CCondo/Townhome&status=1&mlsId=17%7C33&price=10000:&q_sort=createdAt-&q_offset=0">RICHARDSON</a> </li> <li class="sec-nav-drop-color"> <a class="sec-nav-drop-link-color" href="/search?multi_search=Carrollton,%20TX&multi_cat=CityState&propertyType=Residential%7CMulti-Family%7CCondo/Townhome&status=1&mlsId=17%7C33&price=10000:&q_sort=createdAt-&q_offset=0">CARROLLTON</a> </li> <li class="sec-nav-drop-color"> <a class="sec-nav-drop-link-color" href="/search?multi_search=Rowlett,%20TX&multi_cat=CityState&propertyType=Residential%7CMulti-Family%7CCondo/Townhome&status=1&mlsId=17%7C33&price=10000:&q_sort=createdAt-&q_offset=0">ROWLETT</a> </li> </ul> </li> <li class="nav-item" data-selector="li" style="outline: none; cursor: inherit;"> <a class="nav-link-color" href="/financing" style="outline: none; cursor: inherit;">FINANCING</a> </li> <li data-selector="li" style="outline: none; cursor: inherit;"> <a class="menu-toggle nav-link-color" style="outline: none; cursor: inherit;"> <span>MENU</span> <svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-menu"><line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="18" x2="21" y2="18"></line></svg></a> </li> <li class="nav-item" data-selector="li" style="outline: none; cursor: inherit;"> <a id="top-nav-marketing-plan" data-toggle="modal" data-target="#sell-modal" class="nav-link-color" style="outline: none; cursor: inherit;">WE'RE HIRING</a> </li> </ul></div> </div> </div> </header><div id="slide-out-nav" class=""> <div class="close-nav"> <svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-x-circle"><circle cx="12" cy="12" r="10"></circle><line x1="15" y1="9" x2="9" y2="15"></line><line x1="9" y1="9" x2="15" y2="15"></line></svg></div> <div class="render-menu"><ul class="nav navbar-nav navbar-right"><li class="nav-item dropdown"><a class="dropdown-toggle sec-nav-link-color" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false">SEARCH LISTINGS<i class="fa fa-angle-down"></i></a><ul class="dropdown-menu"><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search">SEARCH ALL LISTINGS</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search&mlsId=17,33%7C95%7C630%7C380%7C161%7C646&price=1000000:&propertyType=Residential%7CMulti-Family%7CCondo/Townhome%7CVacant+Land%7CFarm/Ranch&status=1&q_sort=createdAt-&q_offset=0">SEARCH LUXURY LISTINGS</a></li></ul><li class="nav-item"><a class="sec-nav-link-color" href="/buying">BUYING</a></li><li class="nav-item"><a class="sec-nav-link-color" href="/search?multi_search=Plano,%20TX&multi_cat=CityState&propertyType=Residential|Multi-Family|Condo/Townhome|Vacant+Land|Farm/Ranch&status=1&mlsId=17|33&price=10000:&q_sort=createdAt-&q_offset=0">PLANO</a></li><li class="nav-item dropdown"><a class="dropdown-toggle sec-nav-link-color" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false">Mckinney <i class="fa fa-angle-down"></i></a><ul class="dropdown-menu"><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/about-mckinney">About Mckinney</a></li><li class="sec-nav-drop-color">
239<a class="sec-nav-drop-link-color" href="/search?multi_search=McKinney,%20TX&multi_cat=CityState&propertyType=Residential|Multi-Family|Condo/Townhome|Vacant+Land|Farm/Ranch&status=1&mlsId=17|33&price=10000:&q_sort=createdAt-&q_offset=0">MCKINNEY HOME SEARCH</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/mckinney-homes-for-sale">Mckinney Homes For Sale</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/mckinney-zip-codes">Mckinney Zip Codes</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/mckinney-cash-offer">Mckinney Cash Offer</a></li></ul><li class="nav-item"><a class="sec-nav-link-color" href="/cash-offer">Cash Offer</a></li><li class="nav-item"><a class="sec-nav-link-color" href="/selling">SELLING</a></li><li class="nav-item dropdown"><a class="dropdown-toggle sec-nav-link-color" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false">Top Areas<i class="fa fa-angle-down"></i></a><ul class="dropdown-menu"><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search?multi_search=Allen,%20TX&multi_cat=CityState&propertyType=Residential|Multi-Family|Condo/Townhome|Vacant+Land|Farm/Ranch&status=1&mlsId=17|33&price=10000:&q_sort=createdAt-&q_offset=0">ALLEN</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search?multi_search=Frisco,%20TX&multi_cat=CityState&propertyType=Residential|Multi-Family|Condo/Townhome|Vacant+Land|Farm/Ranch&status=1&mlsId=17|33&price=10000:&q_sort=createdAt-&q_offset=0">FRISCO</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search&mlsId=17|33&price=10000:&multi_search=The%20Colony,%20TX&multi_cat=CityState&propertyType=Residential|Multi-Family|Condo/Townhome|Vacant+Land|Farm/Ranch&status=1&q_sort=createdAt-&q_offset=0">THE COLONY</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search?multi_search=Richardson,%20TX&multi_cat=CityState&propertyType=Residential|Multi-Family|Condo/Townhome|Vacant+Land|Farm/Ranch&status=1&mlsId=17|33&price=10000:&q_sort=createdAt-&q_offset=0">RICHARDSON</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search?multi_search=Carrollton,%20TX&multi_cat=CityState&propertyType=Residential|Multi-Family|Condo/Townhome|Vacant+Land|Farm/Ranch&status=1&mlsId=17|33&price=10000:&q_sort=createdAt-&q_offset=0">CARROLLTON</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search?multi_search=Rowlett,%20TX&multi_cat=CityState&propertyType=Residential|Multi-Family|Condo/Townhome|Vacant+Land|Farm/Ranch&status=1&mlsId=17|33&price=10000:&q_sort=createdAt-&q_offset=0">ROWLETT</a></li></ul><li class="nav-item"><a class="sec-nav-link-color" href="/financing">FINANCING</a></li><li class="nav-item"><a class="sec-nav-link-color" href="/homevalue">Home Value</a></li><li class="nav-item"><a class="sec-nav-link-color" href="/meet-the-team">MEET THE TEAM</a></li><li class="nav-item"><a class="sec-nav-link-color" href="/reviews">REVIEWS</a></li><li class="nav-item"><a class="sec-nav-link-color" href="/agent_offer">AGENT OFFER</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="/blog">blog</a></li><li class="nav-item"><a class="sec-nav-link-color" href="https://www.place.com/">ABOUT PLACE</a></li><li class="nav-item"><a class="sec-nav-link-color" href="/connect">CONNECT</a></li></ul></div> <ul class="social" style="outline: none; cursor: inherit;"><li data-selector="li" style="outline: none; cursor: inherit;"><a class="btn btn-block agent_facebook_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="" target="blank" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;padding: 12px 10px;"><i class="fa fa-2x fa-facebook fa-adjust" data-selector=".fa" style="outline: none; cursor: inherit;"></i></a></li> <li data-selector="li" style="outline: none; cursor: inherit;"><a class="btn btn-block agent_twitter_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://twitter.com/akhomefinder" target="blank" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;padding: 12px 10px;"><i class="fa fa-2x fa-twitter fa-adjust" data-selector=".fa" style="outline: none; cursor: inherit;"></i></a></li> <li data-selector="li" style="outline: none; cursor: inherit;"><a class="btn btn-block agent_instagram_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="instagram.com/youralaskarealestate" target="blank" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;padding: 12px 10px;"><i class="fa fa-2x fa-instagram fa-adjust" data-selector=".fa" style="outline: none; cursor: inherit;"></i></a></li> <li data-selector="li" style="outline: none; cursor: inherit;"><a class="btn btn-block agent_pinterest_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://www.pinterest.com/youralaskarealestate/" target="blank" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;padding: 12px 10px;"><i class="fa fa-2x fa-pinterest fa-adjust" data-selector=".fa" style="outline: none; cursor: inherit;"></i></a></li> <li data-selector="li" style="outline: none; cursor: inherit;"><a class="btn btn-block agent_youtube_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="" target="blank" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;padding: 12px 10px;"><i class="fa fa-2x fa-youtube fa-adjust" data-selector=".fa" style="outline: none; cursor: inherit;"></i></a></li> <li data-selector="li" style="outline: none; cursor: inherit;"><a class="btn btn-block agent_linkedin_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="" target="blank" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;padding: 12px 10px;"><i class="fa fa-2x fa-linkedin fa-adjust" data-selector=".fa" style="outline: none; cursor: inherit;"></i></a></li> </ul></div> <div id="slide-out"> <div class="container-fluid"> <div class="row"> <div class="col-md-12"> <div class="header-flex"> <a class="navbar-brand" href="/" style="outline: none; cursor: inherit;"> <img class="img-responsive site_custom_logo" alt="Logo" src="https://cdn1.brivityidx.com/assets/images/uploads/102811/TheGoodHomeTeam-Logo-PLACE-EXP-White-web.png" data-selector="img" style="outline: none; cursor: inherit;"></a> <div class="menu-toggle"> <svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewbox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-menu"><line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="18" x2="21" y2="18"></line></svg></div> </div> </div> </div> </div> </div> <style> 240 241 .center-modal { 242 display:flex; 243 justify-content: center; 244 align-items:center; 245 position:fixed; 246 background-color:rgba(0,0,0,0.4); 247 left:0; 248 top:0; 249 right:0; 250 bottom:0; 251 z-index: 300; 252 } 253 254 .page-width-parent{ 255 max-width: 1280px; 256 margin: 0 auto; 257 } 258 259 260 .property-list-map-view { 261 display:flex; 262 flex-wrap:wrap; 263 gap:16px; 264 } 265 .property-list-map-view-parent { 266 background-color: #F9F9F9; 267 padding:16px; 268 height:710px; 269 overflow:scroll; 270 } 271 272 .property-list-list-view { 273 display:flex; 274 flex-wrap:wrap; 275 gap:24px 276 } 277 278 .property-container { 279 280 gap:24px; 281 } 282 283 .property-map-container { 284 flex:1; 285 height:710px; 286 } 287 288 .property-pagination { 289 margin-top: 26px; 290 } 291 292 .collection-saved-listings { 293 margin-bottom: 26px; 294 font-size:16px; 295 color:black; 296 } 297 298 .collection-description { 299 padding: 20px 0 18px 8px; 300 } 301 302 .my-feed-parent { 303 margin-top:32px; 304 padding-top:32px; 305 border-top: solid 1px #C4C4C4; 306 } 307 308 .collection-description-text { 309 font-size:16px; 310 margin:0; 311 color:black; 312 } 313 314 #collections { 315 display:flex; 316 flex-wrap:wrap; 317 gap:40px 24px; 318 } 319
320 #collection-pagination{ 321 margin-top: 55px 322 } 323 324 #add-listing-btn{ 325 margin-bottom: 20px 326 } 327 328 @media only screen and (min-width: 1280px) { 329 .collection-page { 330 padding:48px 48px 48px 120px; 331 } 332 .my-feed-parent { 333 width:90vw; 334 max-width: 100%; 335 overflow: hidden; 336 } 337 .property-list-map-view-parent { 338 width:500px; 339 } 340 .property-container { 341 display:flex; 342 } 343 } 344 345 @media only screen and (max-width:1280px) { 346 .collection-page { 347 padding:60px 16px 16px 16px; 348 } 349 .my-feed-parent { 350 width: unset; 351 } 352 .property-container { 353 display:flex; 354 flex-direction: column-reverse; 355 } 356 .property-list-map-view { 357 flex-wrap:nowrap; 358 overflow:scroll; 359 height:280px; 360 } 361 .property-list-map-view-parent { 362 height:unset; 363 padding:0px; 364 background-color: #FFFFFF 365 } 366 .property-map-container { 367 flex:none; 368 height:446px; 369 } 370 } 371 372 @media only screen and (max-width:768px) { 373 #collections { 374 justify-content: center; 375 } 376 .property-map-container { 377 width: calc(100% + 32px); 378 margin-left: -16px; 379 } 380 .property-list-map-view { 381 height:250px; 382 } 383 } 384 385</style>
385<script> 386 window.addEventListener("load", () => { 387 const key = localStorage.getItem('authorization'); 388 389 if( !key) { 390 $("#sign-up-modal").modal('show'); 391 392 $("#sign-up-modal").on("hidden.bs.modal", function () { 393 location.reload(); 394 }); 395 } 396 else{ 397 398 let myPortalPage = document.getElementById('myportal-page'); 399 myPortalPage.style.display = "block"; 400 401 window.location.hash = "" 402 403 function isGuid(value) { 404 var regex = /[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}/i; 405 var match = regex.exec(value); 406 return match != null; 407 } 408 409 let lastUrlItem = window.location.href.substring(window.location.href.lastIndexOf('/') + 1) 410 let showCollectionByUUID = false 411 412 if (isGuid(lastUrlItem)) { 413 showCollectionByUUID = true 414 } 415 416 417 class logger extends Collections.BaseLogger { 418 log(e) { 419 console.log(e); 420 } 421 } 422 423 424 class Pubsub { 425 static events = {}; 426 constructor() { 427 //this.events = {}; 428 } 429 430 static subscription (eventName, func) { 431 return { 432 subscribe: () => { 433 if (this.events[eventName]) { 434 this.events[eventName].push(func); 435 } else { 436 this.events[eventName] = [func]; 437 } 438 }, 439 unsubscribe: () => { 440 if(this.events[eventName]){ 441 this.events[eventName] = this.events[eventName].filter((subscriber) => subscriber !== func); 442 } 443 } 444 } 445 } 446 447 static publish(eventName, ...args) { 448 const funcs = this.events[eventName]; 449 if (Array.isArray(funcs)) { 450 funcs.forEach((func) => { 451 func.apply(null, args); 452 }); 453 } 454 } 455 } 456 457 class CollectionCard { 458 constructor(collection, count){ 459 460 this.element = document.createElement(`place-collectioncard`); 461 this.collection = collection 462 let _this = this; 463 let menuOpen = false; 464 var images = []; 465 466 for (let i = 0; i < collection?.propertiesImages?.length; i++) { 467 images.push(collection.propertiesImages[i].mainPhoto); 468 } 469 470 this.element.setAttribute("appearance", "regular"); 471 this.element.setAttribute("image", images); 472 this.element.setAttribute("num_properties", collection?.totalListings ?? 0) 473 this.element.setAttribute("title", collection.collectionName); 474 this.element.setAttribute("description", collection.collectionDescription ? collection.collectionDescription : collection.description ? collection.description : ""); 475 this.element.setAttribute("creator", ""); 476 this.element.setAttribute("disable_dropdown", "false"); 477 this.element.setAttribute("style", "height: 254px"); 478 this.element.setAttribute('z_index', count); 479 this.element.setAttribute("show_menu", "false"); 480 this.element.setAttribute("id", collection.collectionUUID); 481 this.element.setAttribute("container_styles", "w-[300px]"); 482 483 const collectionUUID = collection.collectionUUID; 484 485 this.element.addEventListener(`on_menu_item_pressed`, (e) => { 486 let menuItem = e.detail 487 Pubsub.publish('collection_card_menu_item_pressed', {collection,menuItem}); 488 }); 489 490 this.element.addEventListener('on_search_pressed', (e) => { 491 if (e.target.tagName != "svg" && e.target.tagName != "path") { 492 window.open('../../search.php', '_blank'); 493 e.stopPropagation(); 494 } 495 }); 496 497 this.element.addEventListener(`click`, (e) => { 498 if (e.target.tagName != "svg" && e.target.tagName != "path" && !menuOpen) { 499 Pubsub.publish('collection_card_pressed', {collection:_this.collection,e}); 500 e.stopPropagation(); 501 } 502 }); 503 504 this.element.addEventListener(`on_menu_open`, (e) => { 505 if (this.element.getAttribute("title") === "Favorites") { 506 this.element.setAttribute("disable_menu", "true"); 507 } 508 509 menuOpen = e.detail; 510 this.element.setAttribute("show_menu", menuOpen); 511 }); 512 } 513 } 514 515 class CollectionSection { 516 517 518 collectionSection = document.getElementById('collection-section') 519 collections = document.getElementById('collections') 520 521 addCollectionCard = (collection, count) => { 522 const collectionCard = new CollectionCard(collection, count); 523 524 525 526 527 this.collections.append(collectionCard.element); 528 529 } 530 531 show = () => { 532 this.collectionSection.style.display = 'block' 533 } 534 535 hide = () => { 536 this.collectionSection.style.display = 'none' 537 } 538 } 539 540 class PropertyCard { 541 constructor(collectionUUID,property){ 542 543 let _this = this; 544 this.element = document.createElement(`place-propertycard`); 545 let menuOpen = false;
546 this.property = property; 547 548 this.element.setAttribute("id", property.blossorId) 549 this.element.setAttribute("display_menu", "true"); 550 this.element.setAttribute("show_menu", "false"); 551 this.element.setAttribute("items", '[{"icon":"share-2","text":"Share Property"},{"icon":"layers","text":"Copy to Collection"},{"icon":"trash","text":"Remove from Collection"}]'); 552 553 this.element.setAttribute('appearance','small') 554 this.element.setAttribute('layout_width', '300') 555 this.element.setAttribute('display_tag', 'true') 556 this.element.setAttribute('display_favorite', 'true') 557 this.element.setAttribute('mls',`{ 558 "status":"${property.statusText}", 559 "favorite":"true", 560 "image":[{"uri":"${property?.photos[0]?.url}"}], 561 "price":"${property?.price}", 562 "address":"${property?.address?.street}", 563 "state":"${property?.address?.state}", 564 "city":"${property?.address?.city}", 565 "postalCode":"${property?.address?.zip}", 566 "beds":"${property?.bedrooms}", 567 "baths":"${property?.totalBaths}", 568 "sqft":"${property?.sqFeet}" 569 }`) 570 this.element.setAttribute('on_hover', 'true') 571 572 this.element.addEventListener('mouseenter', (e) => { 573 Pubsub.publish('property_card_mouseenter', property); 574 }) 575 576 this.element.addEventListener('mouseleave', (e) => { 577 Pubsub.publish('property_card_mouseleave', property); 578 }) 579 580 this.element.addEventListener(`on_menu_item_pressed`, (e) => { 581 let menuItem = e.detail 582 let propertyCollectionUUID = property.propertyCollectionUUID 583 let url = this.getPropertyUrl(this.property); 584 property.searchUrl = url; 585 Pubsub.publish('property_card_menu_item_pressed', {property,collectionUUID,propertyCollectionUUID,menuItem, url}); 586 }); 587 588 this.element.addEventListener(`on_menu_open`, (e) => { 589 menuOpen = e.detail; 590 this.element.setAttribute("show_menu", menuOpen); 591 }); 592 593 this.element.addEventListener('click', (e) => { 594 if (e.target.tagName != "svg" && e.target.tagName != "path" && !menuOpen) { 595 let state = _this.property.address.state; 596 let city = _this.slugify(_this.property.address.city); 597 let zip = _this.property.address.zip 598 let address = _this.slugify(_this.property.address.street); 599 let blossorId = _this.property.blossorId; 600 let url = this.getPropertyUrl(property); 601 window.open(`../../${url}`, '_blank'); 602 } 603 }); 604 605 this.element.addEventListener('on_favorite_press', (e) => { 606 let propertyCollectionUUID = property.propertyCollectionUUID; 607 Pubsub.publish('delete_property_modal_pressed', {collectionUUID, propertyCollectionUUID}); 608 }); 609 610 } 611 612 getPropertyUrl = (property) => { 613 let state = property.address.state; 614 let city = this.slugify(property.address.city); 615 let zip = property.address.zip 616 let address = this.slugify(property.address.street); 617 let blossorId = property.blossorId; 618 return `homes-for-sale/${state}/${city}/${zip}/${address}/bid-${blossorId}`; 619 } 620 621 slugify(text) { 622 // replace non letter or digits by - 623 text = text.replace(/[^\pL\d]+~u/g, '_'); 624 // transliterate 625 text = text.normalize('NFKD').replace(/[\u0300-\u036F]/g,'') 626 // remove unwanted characters 627 text = text.replace(/[^_\w]+/g, '_'); 628 // trim 629 text = text.trim(); 630 // remove duplicate - 631 text = text.replace(/_+/g, '-'); 632 // lowercase 633 text = text.toLowerCase(); 634 if (!text) { 635 return 'n-a'; 636 } 637 return text 638 } 639 } 640 641 let dateNow = new Date(); 642 dateNow.setDate(dateNow.getDate()-7); 643 dateNow.setHours(dateNow.getHours()); 644 dateNow.setMinutes(dateNow.getMinutes()); 645 dateNow.setSeconds(dateNow.getSeconds()); 646 const sevenDaysAgo = dateNow.getTime(); 647 648 class PropertySection { 649 propertySection = document.getElementById('property-section') 650 listIcon = document.getElementById('property-list-icon') 651 mapIcon = document.getElementById('property-map-icon') 652 propertyHeader = document.getElementById('property-header') 653 propertyList = document.getElementById("property-list") 654 propertyListParent = document.getElementById("property-list-parent") 655 propertyMap = document.getElementById('property-map') 656 selectedView = 'map' 657 658 collectionProperties = [] 659 660 properties = [] 661 662 663 constructor() { 664 this.listIcon.addEventListener('click', () => { 665 this.setView('list') 666 }) 667 668 this.mapIcon.addEventListener('click', () => { 669 this.setView('map') 670 }) 671 } 672 673 show = (collectionUUID, collectionProperties) => { 674 this.propertySection.style.display = 'block' 675 this.collectionProperties = collectionProperties 676 this.collectionUUID = collectionUUID 677 678 this.propertyList.innerHTML = '' 679 count = 100; 680 681 this.collectionProperties?.data?.properties?.forEach((property) => { 682 count-- 683 this.addPropertyCard(property,collectionUUID, count) 684 }); 685 } 686 687 hide = () => { 688 this.propertySection.style.display = 'none' 689 } 690 691 setPropertyCardWidth = () => { 692 let width; 693 let imageHeight; 694 let windowWidth = window.innerWidth 695 if(this.selectedView == 'map') { 696 if(windowWidth > 1279) { 697 width = `220`; 698 imageHeight = `154`; 699 } else if(windowWidth > 768) { 700 width = `325`; 701 imageHeight = `184`; 702 } else{ 703 width = `244`; 704 imageHeight = `154`; 705 } 706 } 707 else { 708 if(windowWidth > 1440 ){ 709 width = `300`; 710 imageHeight = `184`; 711 } 712 else if(windowWidth > 1279) { 713 width = `260`; 714 imageHeight = `152`; 715 } else if(windowWidth > 768) { 716 width = `218`; 717 imageHeight = `152`; 718 } else{ 719 width = `288`; 720 imageHeight = `184`; 721 } 722 } 723 724 let propertyCards = document.querySelectorAll('place-propertycard') 725 propertyCards.forEach((propertyCard) => { 726 propertyCard.setAttribute('layout_width', width) 727 propertyCard.setAttribute('image_height', imageHeight) 728 }) 729 } 730
731 setView = (view) => { 732 this.selectedView = view 733 if (view == 'list') { 734 this.listIcon.setAttribute('stroke', 'black') 735 this.mapIcon.setAttribute('stroke', 'gray') 736 737 this.propertyMap.style.display = 'none' 738 this.propertyList.classList.add('property-list-list-view') 739 this.propertyList.classList.remove('property-list-map-view') 740 this.propertyListParent.classList.remove('property-list-map-view-parent') 741 742 Pubsub.publish('property_section_show_list_view', this.collectionProperties?.data?.properties); 743 } else { 744 this.listIcon.setAttribute('stroke', 'gray') 745 this.mapIcon.setAttribute('stroke', 'black') 746 747 this.propertyMap.style.display = 'block' 748 this.propertyList.classList.remove('property-list-list-view') 749 this.propertyList.classList.add('property-list-map-view') 750 this.propertyListParent.classList.add('property-list-map-view-parent') 751 752 Pubsub.publish('property_section_show_map_view', this.collectionProperties?.data?.properties); 753 } 754 755 this.setPropertyCardWidth(); 756 } 757 758 scrollIntoView = (id) => { 759 let propertyCard = document.getElementById(id); 760 propertyCard.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'start' }) 761 } 762 763 addPropertyCard = (property, collectionUUID, count) => { 764 765 var propertyCardWrapperElement = document.createElement(`div`) 766 propertyCardWrapperElement.setAttribute('style', `z-index:${count}`) 767 propertyCardWrapperElement.setAttribute('class', 'property-card-wrapper') 768 propertyCardWrapperElement.setAttribute("id", property.propertyCollectionUUID); 769 770 const propertyCard = new PropertyCard(collectionUUID,property); 771 var propertyCardElement = propertyCard.element; 772 773 propertyCardWrapperElement.append(propertyCardElement) 774 775 this.propertyList.append(propertyCardWrapperElement) 776 777 } 778 779 } 780 781 782 class PageSubHeader{ 783 constructor() { 784 785 this.element = document.querySelector('place-pagesubheader') 786 787 this.element.addEventListener('button_on_press', (e) => { 788 Pubsub.publish('create_new_collection_pressed', e) 789 }) 790 791 this.element.addEventListener('top_header_on_press', (e) => { 792 Pubsub.publish('top_header_back_pressed', e) 793 }) 794 795 this.element.addEventListener('on_menu_item_pressed', (e) => { 796 Pubsub.publish('top_header_menu_item_pressed', e.detail) 797 }) 798 799 this.element.addEventListener('secondary_button_on_press', (e) => { 800 window.open('../../search.php', '_blank') 801 }) 802 } 803 804 setTitle(title) { 805 this.element.setAttribute('title', title) 806 } 807 808 setTopHeaderTitle(title){ 809 this.element.setAttribute('top_header_title', title) 810 } 811 812 showTopHeader(){ 813 this.element.setAttribute('show_top_header', true) 814 } 815 816 hideTopHeader(){ 817 this.element.setAttribute('show_top_header', false) 818 } 819 820 showPrimaryButton() { 821 this.element.setAttribute('show_button', true) 822 } 823 824 hidePrimaryButton() { 825 this.element.setAttribute('show_button', false) 826 } 827 828 showSecondaryButton(){ 829 this.element.setAttribute('show_secondary_button', true) 830 } 831 832 hideSecondaryButton(){ 833 this.element.setAttribute('show_secondary_button', false) 834 } 835 836 showMenuButton() { 837 this.element.setAttribute('show_menu_button', true) 838 } 839 840 hideMenuButton() { 841 this.element.setAttribute('show_menu_button', false) 842 } 843 } 844 845 class CollectionModal { 846 847 constructor() { 848 849 let _this = this; 850 this.element = document.querySelector('place-collectionpopup'); 851 this.collectionUUID = 0; 852 853 this.element.addEventListener("on_close_press", (e) => { 854 _this.hide(); 855 }); 856 857 this.element.addEventListener("on_save_press", (e) => { 858 this.showError(false); 859 e.detail.collectionUUID = this.collectionUUID 860 e.detail.type = this.isEditingCollection ? 'edit' : 'save' 861 Pubsub.publish('on_new_collection_saved', e.detail); 862 }); 863 864 } 865 866 setName(name) { 867 this.element.setAttribute('name_value', name) 868 } 869 870 setDescription(description) { 871 this.element.setAttribute('description_value', description ? description : "") 872 } 873 874 showError(error) { 875 this.element.setAttribute('show_error', error) 876 } 877 878 show(collectionUUID, isEditingCollection) { 879 this.isEditingCollection = isEditingCollection; 880 if(collectionUUID){ 881 this.collectionUUID = collectionUUID; 882 } 883 this.element.setAttribute('style', 'display:flex') 884 } 885 886 hide() { 887 this.element.setAttribute('style', 'display:none'); 888 889 this.showError(false) 890 891 // terrible hack.. only way i could get it to respond to prop changes 892 // to clear the input fields after closing the modal 893 this.setName('none') 894 this.setDescription('none') 895 setTimeout(() => { 896 this.setName('') 897 this.setDescription('') 898 }, 100); 899 } 900 } 901 902 class CollectionCreatedModal { 903 constructor() { 904 905 906 this.collection = "" 907 this.element = document.getElementById('collection-created-modal'); 908 let _this = this; 909 910 this.element.addEventListener("on_primary_press", (e) => { 911 this.hide(); 912 window.location.href = '../../search.php' 913 }); 914 915 this.element.addEventListener("on_tertiary_press", (e) => { 916 _this.hide(); 917 Pubsub.publish('collection_created_modal_view_collection_pressed', _this.collection); 918 }); 919 920 this.element.addEventListener("on_close_press", (e) => { 921 _this.hide(); 922 }); 923 924 this.element.setAttribute("stacked_buttons", true) 925 this.element.setAttribute("primary_button_text", "Search Listings") 926 this.element.setAttribute("tertiary_button_text", "View Collection") 927 } 928 929 show(collection) { 930 if(collection){ 931 this.collection = collection; 932 } 933 this.element.setAttribute('style', 'display:flex') 934 } 935 936 hide() { 937 this.element.setAttribute('style', 'display:none'); 938 } 939 } 940 941 class EditCollectionModal { 942 constructor() { 943 944 945 this.collection = "" 946 this.element = document.getElementById('edit-collection-modal'); 947 let _this = this; 948 949 this.element.addEventListener("on_primary_press", (e) => { 950 _this.hide(); 951 952 }); 953 954 955 956 this.element.addEventListener("on_close_press", (e) => { 957 _this.hide(); 958 }); 959 } 960 961 show() { 962 963 this.element.setAttribute('style', 'display:flex') 964 } 965 966 hide() { 967 this.element.setAttribute('style', 'display:none'); 968 } 969 } 970 971 class DeleteCollectionModal { 972 constructor() { 973 974 975 this.collection = "" 976 this.element = document.getElementById('delete-collection-modal'); 977 let _this = this; 978 979 this.element.addEventListener("on_primary_press", (e) => { 980 _this.hide(); 981 Pubsub.publish('delete_collection_modal_delete_pressed', _this.collection); 982 }); 983 984 this.element.addEventListener("on_tertiary_press", (e) => { 985 this.hide(); 986 }); 987 988 this.element.addEventListener("on_close_press", (e) => { 989 _this.hide(); 990 }); 991 } 992 993 show(collection) { 994 if(collection){ 995 this.collection = collection; 996 } 997 this.element.setAttribute('style', 'display:flex') 998 } 999 1000 hide() { 1001 this.element.setAttribute('style', 'display:none'); 1002 } 1003 } 1004 1005 class ShareSavedPropertyModal { 1006 constructor() { 1007 let _this = this; 1008 this.savedProperty = {} 1009 this.element = document.getElementById('share-saved-property-modal'); 1010 1011 this.element.addEventListener("on_primary_press", (e) => { 1012 1013 1014 1015 navigator.clipboard.writeText(this.link) 1016 _this.hide(); 1017 Pubsub.publish('share_saved_property_modal_share_pressed'); 1018 1019 }); 1020 1021 this.element.addEventListener("on_close_press", (e) => { 1022 _this.hide(); 1023 }); 1024 } 1025 1026 show = (savedProperty) => { 1027 1028 1029 this.savedProperty = savedProperty; 1030 1031 this.link = document.location.origin + "/" + this.savedProperty.searchUrl 1032 this.element.setAttribute('share_link_text', this.link) 1033 this.element.setAttribute('style', 'display:flex') 1034 } 1035 1036 hide = () => { 1037 this.element.setAttribute('style', 'display:none'); 1038 } 1039 } 1040 1041 class DeletePropertyModal { 1042 constructor() { 1043 1044 1045 this.collectionUUID = "" 1046 this.propertyCollectionUUID = "" 1047 this.element = document.getElementById('delete-property-modal'); 1048 let _this = this; 1049 1050 this.element.addEventListener("on_primary_press", (e) => { 1051 _this.hide(); 1052 Pubsub.publish('delete_property_modal_delete_pressed', {"collectionUUID":_this.collectionUUID, "propertyCollectionUUID":_this.propertyCollectionUUID}); 1053 }); 1054 1055 this.element.addEventListener("on_tertiary_press", (e) => { 1056 this.hide(); 1057 }); 1058 1059 this.element.addEventListener("on_close_press", (e) => { 1060 _this.hide(); 1061 }); 1062 } 1063 1064 show(collectionUUID, propertyCollectionUUID) { 1065 if(collectionUUID){ 1066 this.collectionUUID = collectionUUID; 1067 } 1068 if(propertyCollectionUUID){ 1069 this.propertyCollectionUUID = propertyCollectionUUID; 1070 } 1071 this.element.setAttribute('style', 'display:flex') 1072 } 1073 1074 hide() { 1075 this.element.setAttribute('style', 'display:none'); 1076 } 1077 } 1078 1079 class CopyPropertyToCollectionModal { 1080 constructor(){ 1081 1082 this.element = document.querySelector('place-copycollectionmodal'); 1083 this.collections = []; 1084 this.property = {} 1085 this.isVisible = false;
1086 1087 1088 1089 this.element.addEventListener('close_button', (e) => { 1090 this.hide(); 1091 }); 1092 1093 this.element.addEventListener('cancel_button', (e) => { 1094 this.hide(); 1095 }); 1096 1097 this.element.addEventListener('on_save', (e) => { 1098 Pubsub.publish('copy_property_to_collection_modal_save_pressed', {'collectionUUID':e.detail, 'property':this.property}); 1099 }); 1100 1101 this.element.addEventListener('set_selected_collection', (e) => { 1102 console.log('set_selected_collection', e) 1103 }); 1104 1105 this.element.addEventListener('on_link_press', (e) => { 1106 Pubsub.publish('show_new_collection_modal'); 1107 }); 1108 1109 } 1110 1111 getCollectionData(){ 1112 return JSON.parse(this.element.getAttribute("collections")); 1113 } 1114 1115 setCollectionData(collections){ 1116 this.element.setAttribute('collections', JSON.stringify(collections)) 1117 } 1118 1119 getCollectionList(collections, currentCollectionName) { 1120 let collectionList = []; 1121 collections.forEach(collection => { 1122 if (currentCollectionName && (collection.collectionName == currentCollectionName)) return; 1123 collectionList.push({ 1124 collection_title: collection.collectionName, 1125 id: collection.collectionUUID, 1126 propertiesImages: collection?.propertiesImages?.length > 0 ? collection?.propertiesImages : [], 1127 }) 1128 }); 1129 this.setCollectionData(collectionList); 1130 1131 } 1132 1133 setIsAddingToCollection(isAddingToCollection){ 1134 this.element.setAttribute('is_add_to_collection', isAddingToCollection); 1135 } 1136 1137 show(property) { 1138 1139 if(property){ 1140 this.property = property; 1141 } 1142 1143 this.isVisible = true; 1144 1145 let mls = { 1146 status: property?.status || property?.standardStatus || "", 1147 image: this.getPropertyImageUrl(property), 1148 price: property?.price || "0", 1149 address: ( typeof property?.address === "string") ? property?.address : (property?.address?.street || property?.streetAddress || ""), 1150 state: property?.state || property?.address?.state || "", 1151 city: property?.city || property?.address?.city || "", 1152 postal_code: property?.postal_code || property?.address?.zip || "", 1153 beds: property?.beds || property?.bedrooms || 0, 1154 baths: property?.baths || property?.fullBaths || property?.bathsTotalDecimal || 0, 1155 sqft: property?.sqft || property?.squareFeet || property?.sqFeet || 0, 1156 creator: property?.creator || "", 1157 } 1158 1159 this.element.setAttribute('mls', JSON.stringify(mls)) 1160 this.element.setAttribute('image_url',mls?.image || "") 1161 this.element.setAttribute('style', 'display:flex') 1162 } 1163 1164 getPropertyImageUrl(property){ 1165 // property?.image[0]?.uri || property?.photos[0]?.url || "", 1166 1167 if(property.image && property.image.length > 0){ 1168 return property.image[0].uri 1169 } else if (property.photos && property.photos.length > 0){ 1170 return property.photos[0].url 1171 } else { 1172 return "" 1173 } 1174 } 1175 1176 hide() { 1177 this.isVisible = false;
1178 this.element.setAttribute('style', 'display:none'); 1179 } 1180 } 1181 1182 class CollectionPaging { 1183 constructor(collectionsPerPage){ 1184 1185 1186 this.element = document.getElementById('collection-pagination'); 1187 this.collectionsPerPage = collectionsPerPage; 1188 1189 this.element.addEventListener('page_changed', (e) => { 1190 Pubsub.publish('collection_page_changed', e.detail); 1191 }); 1192 } 1193 1194 setPageCount(pageCount){ 1195 this.element.setAttribute('page_count', pageCount); 1196 } 1197 1198 show() { 1199 this.element.setAttribute('style', 'display:flex') 1200 } 1201 1202 hide() { 1203 this.element.setAttribute('style', 'display:none') 1204 } 1205 } 1206 1207 class PropertyPaging { 1208 constructor(propertiesPerPage){ 1209 1210 1211 this.element = document.getElementById('property-pagination'); 1212 this.propertiesPerPage = propertiesPerPage; 1213 1214 this.element.addEventListener('page_changed', (e) => { 1215 Pubsub.publish('property_page_changed', e.detail); 1216 }); 1217 } 1218 1219 setPageCount(pageCount){ 1220 this.element.setAttribute('page_count', pageCount); 1221 } 1222 1223 setCurrentPage(currentPage){ 1224 this.element.setAttribute('current_page', currentPage); 1225 } 1226 1227 show() { 1228 this.element.setAttribute('style', 'display:flex') 1229 } 1230 1231 hide() { 1232 this.element.setAttribute('style', 'display:none') 1233 } 1234 } 1235 1236 class NewCollectionBlock { 1237 constructor(){ 1238 1239 this.element = document.getElementById('new-collection-block'); 1240 1241 this.element.addEventListener('on_main_press', (e) => { 1242 Pubsub.publish('new_collection_block_create_collection_pressed', e.detail); 1243 }); 1244 } 1245 show(collectionUUID, propertyCollectionUUID) { 1246 this.element.setAttribute('style', 'display:flex') 1247 } 1248 1249 hide() { 1250 this.element.setAttribute('style', 'display:none'); 1251 } 1252 } 1253 1254 class AddListingsBlock { 1255 constructor() { 1256 1257 this.element = document.getElementById('add-listings-block'); 1258 1259 this.element.addEventListener('on_main_press', (e) => { 1260 window.open('../../search.php', '_blank') 1261 }); 1262 1263 this.element.addEventListener("on_tertiary_press", (e) => { 1264 1265 }); 1266 } 1267 1268 show() { 1269 this.element.setAttribute('style', 'display:flex') 1270 } 1271 1272 hide() { 1273 this.element.setAttribute('style', 'display:none'); 1274 } 1275 } 1276 1277 class MyFeed { 1278 constructor(blueroofMiddlewareApi, collectionsService) { 1279 this.blueroofMiddlewareApi = blueroofMiddlewareApi; 1280 this.collectionsService = collectionsService; 1281 this.element = document.querySelector('place-myfeedblock'); 1282 1283 this.element.addEventListener('on_menu_open', (e) => { 1284 this.element.setAttribute('show_menu', e.detail.e); 1285 this.element.setAttribute('show_menu_index', e.detail.index); 1286 }); 1287 1288 this.element.addEventListener('on_view_all_pressed', (e) => { 1289 window.open('../../search.php', '_blank'); 1290 }); 1291 1292 this.element.addEventListener('on_add_collection', (e) => { 1293 1294 let property = e.detail; 1295 Pubsub.publish('my_feed_add_collection_pressed', {property}); 1296 1297 }); 1298 1299 this.element.addEventListener('on_share_pressed', (e) => { 1300 1301 let property = e.detail 1302 1303 let url = this.getPropertyUrl(property); 1304 property.searchUrl = url; 1305 1306 Pubsub.publish('my_feed_share_pressed', {property}); 1307 }); 1308 1309 this.element.addEventListener('on_favorite_pressed', (e) => { 1310 let property = e.detail.property; 1311 let isAddingFavorite = e.detail.isAddingFavorite; 1312 1313 if(isAddingFavorite){ 1314 Pubsub.publish('my_feed_on_favorite_pressed', {property}); 1315 } 1316 else{ 1317 Pubsub.publish('my_feed_on_unfavorite_pressed', {property}); 1318 } 1319 }); 1320 1321 this.element.addEventListener('on_property_pressed', (e) => { 1322 let property = e.detail 1323 1324 let url = this.getPropertyUrl(property); 1325 property.searchUrl = url; 1326 window.open('../../' + url, '_blank'); 1327 }); 1328 1329 1330 this.blueroofMiddlewareApi.getMyFeed().then((data) => { 1331 1332 let myFeedBlossorIds = data.map(property => property.blossorId); 1333 1334 1335 this.collectionsService.checkIfInCollection(myFeedBlossorIds).then((propertiesInCollections) => { 1336 1337 let feed = [] 1338 data.forEach((item) => { 1339 feed.push({ 1340 image: [ 1341 { 1342 title: "", 1343 id: 0, 1344 uri: item?.photos[0].url, 1345 }, 1346 ], 1347 price: item?.price, 1348 favorite: propertiesInCollections?.data[item?.blossorId] != null || false, 1349 address: item?.streetAddress, 1350 city: item?.city, 1351 state: item?.state, 1352 postal_code: item?.postalCode, 1353 beds: item?.bedrooms, 1354 status: item?.standardStatus, 1355 baths: item?.bathsTotalDecimal, 1356 sqft: item?.squareFeet, 1357 creator: "", 1358 mls_price_history: item?.history[item.history.length-1]?.price, 1359 blossorId: item?.blossorId, 1360 open_house : item?.openhouses?.length > 0 ? true : false, 1361 open_house_date : item?.openhouses[0]?.startDate, 1362 open_house_end_time : item?.openhouses[0]?.endDate, 1363 property_created_at : item?.listDate, 1364 lastStatusChangeDate : item?.lastStatusChangeDate, 1365 }) 1366 }) 1367 1368 if(feed && feed?.length > 0){ 1369 this.show(); 1370 this.element.setAttribute('mls_data', JSON.stringify(feed)); 1371 } 1372 }); 1373 }); 1374 1375 } 1376 1377 getPropertyUrl = (property) => { 1378 let state = property.state; 1379 let city = this.slugify(property.city); 1380 let zip = property.postal_code 1381 let address = this.slugify(property.address); 1382 let blossorId = property.blossorId; 1383 return `homes-for-sale/${state}/${city}/${zip}/${address}/bid-${blossorId}`; 1384 } 1385 1386 slugify(text) { 1387 // replace non letter or digits by - 1388 text = text.replace(/[^\pL\d]+~u/g, '_'); 1389 // transliterate 1390 text = text.normalize('NFKD').replace(/[\u0300-\u036F]/g,'') 1391 // remove unwanted characters 1392 text = text.replace(/[^_\w]+/g, '_'); 1393 // trim 1394 text = text.trim(); 1395 // remove duplicate - 1396 text = text.replace(/_+/g, '-'); 1397 // lowercase 1398 text = text.toLowerCase(); 1399 if (!text) { 1400 return 'n-a'; 1401 } 1402 return text 1403 } 1404 1405 getMlsData = () => { 1406 return JSON.parse(this.element.getAttribute('mls_data')); 1407 } 1408 1409 setMlsData = (data) => { 1410 this.element.setAttribute('mls_data', JSON.stringify(data)); 1411 } 1412 1413 show() { 1414 this.element.setAttribute('style', 'display:flex') 1415 } 1416 1417 hide() { 1418 this.element.setAttribute('style', 'display:none') 1419 } 1420 } 1421 1422 class BlueroofMiddlewareApi { 1423 constructor() { 1424 this.baseUrl = "https://brivity-home-middleware.production.brivity.com"; 1425 this.apiKey = localStorage.getItem('authorization'); 1426 } 1427 1428 getMyFeed = async () => { 1429 const response = await fetch(`${this.baseUrl}/listings/voltron`, { 1430 method: 'POST', 1431 headers: { 1432 'Content-Type': 'application/json', 1433 'Authorization': `${this.apiKey}` 1434 }, 1435 body: JSON.stringify([]) 1436 }); 1437 1438 const data = await response.json(); 1439 return data; 1440 } 1441 1442 getLeadBasicInfo = async () => { 1443 const response = await fetch(`${this.baseUrl}/blueroofleads/basicinfo`, { 1444 method: 'GET', 1445 headers: { 1446 'Content-Type': 'application/json', 1447 'Authorization': `${this.apiKey}` 1448 }, 1449 1450 }); 1451 1452 const data = await response.json(); 1453 return data; 1454 } 1455 1456 getAgentProfile = async (brivityUserId) => { 1457 const response = await fetch(`${this.baseUrl}/blueroofagents/profile`, { 1458 method: 'POST', 1459 headers: { 1460 'Content-Type': 'application/json', 1461 'Authorization': `${this.apiKey}` 1462 }, 1463 body: `{"brivityUserId": ${brivityUserId}}` 1464 1465 }); 1466 1467 const data = await response.json(); 1468 return data; 1469 } 1470 1471 } 1472 1473 class Map { 1474 constructor(){ 1475 this.element = document.querySelector('place-map'); 1476 this.properties = []; 1477 1478 this.element.addEventListener('on_marker_clicked', (e) => { 1479 Pubsub.publish('map_marker_clicked', e.detail.id) 1480 }); 1481 } 1482 1483 setMarkers = (properties) => { 1484 let markers = []; 1485 let color = 'black' 1486 1487 let dateNow = new Date(); 1488 dateNow.setDate(dateNow.getDate()-7); 1489 dateNow.setHours(dateNow.getHours()); 1490 dateNow.setMinutes(dateNow.getMinutes()); 1491 dateNow.setSeconds(dateNow.getSeconds()); 1492 const sevenDaysAgo = dateNow.getTime(); 1493 1494 this.properties = properties; 1495 properties?.forEach(property => { 1496 1497 if(property.statusText == 'Active'){ 1498 color = '#1FA6E8' 1499 }else if(property.statusText == 'Pending'){ 1500 color = '#FFC82C' 1501 }else if(property.statusText == 'Sold'){ 1502 color = '#FF7343' 1503 } 1504 1505 let listDate = new Date(property.listDate); 1506 1507 1508 if(listDate.getTime() > sevenDaysAgo){ 1509 color = '#24D0BC' 1510 } 1511 1512 markers.push({ 1513 id: `${property.blossorId}`, 1514 location: property.location, 1515 price: property.price, 1516 color : color 1517 }) 1518 }); 1519 1520 this.element.setAttribute('markers', JSON.stringify(markers)); 1521 } 1522 1523 setSelectedMarker = (property) => { 1524 let markerIndex = this.properties.findIndex((p) => p.blossorId == property.blossorId) 1525 if(markerIndex > -1){ 1526 this.element.setAttribute('selected_property_index', markerIndex); 1527 } 1528 } 1529 1530 clearSelectedMarker = () => { 1531 this.element.setAttribute('selected_property_index', -1); 1532 } 1533 1534 } 1535 1536 class SavedListings { 1537 constructor(){ 1538 this.element = document.getElementById('collection-saved-listings'); 1539 } 1540 1541 setCount(count) { 1542 this.element.innerText = `Saved Listings (${count})`; 1543 } 1544 1545 hide() { 1546 this.element.style.display = `none`; 1547 } 1548 show() { 1549 this.element.style.display = `block`; 1550 } 1551 } 1552 1553 class AddListingBtn { 1554 constructor(){ 1555 this.element = document.getElementById('add-listing-btn'); 1556 this.element.setAttribute('button_style', JSON.stringify({paddingLeft: '0px'})); 1557 this.element.addEventListener('on_press', (e) => { 1558 window.open('../../search.php', '_blank') 1559 }) 1560 } 1561 1562 hide() { 1563 this.element.style.display = `none`; 1564 } 1565 show() { 1566 this.element.style.display = `block`; 1567 } 1568 } 1569 1570 class Page { 1571 constructor(blueroofMiddlewareApi) { 1572 this.selectedCollection = {}; 1573 this.inPropertyView = false;
1574 this.lead = {} 1575 this.agent = {} 1576 this.isInMapView = false; 1577 this.isInListView = true; 1578 1579 this.authorizationData = JSON.parse(atob(blueroofMiddlewareApi.apiKey.split('.')[1])); 1580 this.is_blueroof_person = this.authorizationData?.is_blueroof_person; 1581 1582 1583 } 1584 1585 setSelectedCollection(collection) { 1586 this.selectedCollection = collection; 1587 } 1588 1589 setInPropertyView(inPropertyView) { 1590 this.inPropertyView = inPropertyView; 1591 } 1592 } 1593 1594 1595 class messagingEmitter extends Messaging.BaseEmitter { 1596 1597 newMessage(message) { 1598 Pubsub.publish('messaging_emitter_new_message', message); 1599 } 1600 } 1601 1602 1603 1604 (async () => { 1605 1606 const blueroofMiddlewareApi = new BlueroofMiddlewareApi(); 1607 const page = new Page(blueroofMiddlewareApi); 1608 1609 let url = 'https://messaging.brivity.com' 1610 const messaging = new Messaging.Service(url, blueroofMiddlewareApi.apiKey, new messagingEmitter()); 1611 1612 let lead = await blueroofMiddlewareApi.getLeadBasicInfo(); 1613 let agent = await blueroofMiddlewareApi.getAgentProfile(lead.data?.brivity_agent_id); 1614 1615 page.lead = lead.data; 1616 page.agent = agent.data; 1617 1618 const collectionsService = new Collections.Service(window?.globalSiteVariables?.options?.apis?.collections?.url ?? '',blueroofMiddlewareApi.apiKey, "sitebuilder", new logger()); 1619 1620 1621 const menu = new Menu(page?.is_blueroof_person || false, page?.agent, blueroofMiddlewareApi.baseUrl, blueroofMiddlewareApi.apiKey); 1622 const collectionSection = new CollectionSection() 1623 const propertySection = new PropertySection() 1624 const collectionModal = new CollectionModal(); 1625 const collectionCreatedModal = new CollectionCreatedModal(); 1626 const deleteCollectionModal = new DeleteCollectionModal();
1627 const editCollectionModal = new EditCollectionModal(); 1628 const shareSavedPropertyModal = new ShareSavedPropertyModal(); 1629 const deletePropertyModal = new DeletePropertyModal(); 1630 const copyPropertyToCollectionModal = new CopyPropertyToCollectionModal(); 1631 const pageSubHeader = new PageSubHeader(); 1632 const collectionPaging = new CollectionPaging(8) 1633 const propertyPaging = new PropertyPaging(8) 1634 const newCollectionBlock = new NewCollectionBlock(); 1635 const addListingsBlock = new AddListingsBlock(); 1636 const myFeed = new MyFeed(blueroofMiddlewareApi, collectionsService); 1637 const map = new Map(); 1638 const savedListings = new SavedListings(); 1639 const addListingBtn = new AddListingBtn(); 1640 1641 collectionPaging.hide(); 1642 propertySection.hide(); 1643 1644 let collections = []; 1645 let extraCollections = 0; 1646 let createCopyCollection = false; 1647 1648 if(!showCollectionByUUID){ 1649 const collectionDescription = document.getElementById("collectionDescription"); 1650 1651 collectionsService.getCollections(0, collectionPaging.collectionsPerPage).then((e) => { 1652 1653 extraCollections = e?.data?.totalCollections 1654 1655 if(e.data.TotalPages > 1) { 1656 collectionPaging.show() 1657 collectionPaging.setPageCount(e.data.TotalPages); 1658 } else { 1659 collectionPaging.setPageCount(1); 1660 } 1661 1662 1663 if(e?.data?.Items){ 1664 collections = e.data.Items; 1665 count = 100; 1666 e.data.Items.forEach((collection) => { 1667 count-- 1668 1669 collectionSection.addCollectionCard(collection, count) 1670 }); 1671 } 1672 1673 copyPropertyToCollectionModal.getCollectionList(collections) 1674 1675 if(collections.length == 0){ 1676 newCollectionBlock.show(); 1677 } 1678 1679 }).catch((e) => { 1680 if(collections.length == 0){ 1681 newCollectionBlock.show(); 1682 } 1683 }); 1684 } 1685 else{ 1686 collectionsService.getCollections(0, collectionPaging.collectionsPerPage).then((e) => { 1687 1688 if(e?.data?.Items){ 1689 collections = e.data.Items; 1690 } 1691 1692 }); 1693 } 1694 1695 Pubsub.subscription('property_card_mouseenter', (property) => { 1696 1697 document.querySelectorAll('place-propertycard').forEach((propertyCard) => { 1698 propertyCard.setAttribute('show_border', false); 1699 }) 1700 1701 if(page.isInMapView){ 1702 map.setSelectedMarker(property) 1703 } 1704 }).subscribe(); 1705 1706 Pubsub.subscription('property_card_mouseleave', () => { 1707 if(page.isInMapView){ 1708 map.clearSelectedMarker() 1709 } 1710 }).subscribe(); 1711 1712 Pubsub.subscription('messaging_emitter_new_message', (message) => { 1713 toast.show('New message from ' + message.createdByAlias) 1714 }).subscribe(); 1715 1716 Pubsub.subscription('property_section_show_map_view', (properties) => { 1717 map.setMarkers(properties); 1718 page.isInMapView = true; 1719 page.isInListView = false; 1720 1721 document.querySelectorAll('place-propertycard').forEach((propertyCard) => { 1722 propertyCard.setAttribute('show_border_on_hover', true); 1723 }) 1724 }).subscribe(); 1725 1726 Pubsub.subscription('property_section_show_list_view', (properties) => { 1727 page.isInMapView = false;
1728 page.isInListView = true; 1729 1730 document.querySelectorAll('place-propertycard').forEach((propertyCard) => { 1731 propertyCard.setAttribute('show_border_on_hover', false); 1732 }) 1733 1734 }).subscribe(); 1735 1736 Pubsub.subscription('property_page_changed', (page) => { 1737 collectionsService.getCollectionProperties(propertySection.collectionUUID, page, propertyPaging.propertiesPerPage).then((collectionProperties) => { 1738 map.setMarkers(collectionProperties?.data?.properties); 1739 savedListings.setCount(collectionProperties?.data?.totalListings || 0); 1740 propertySection.show(propertySection.collectionUUID,collectionProperties) 1741 propertySection.setPropertyCardWidth(); 1742 propertyPaging.setCurrentPage(page); 1743 }); 1744 }).subscribe(); 1745 1746 Pubsub.subscription("top_header_menu_item_pressed", (menuItemPressed) => { 1747 1748 if(menuItemPressed == 'Edit Collection'){ 1749 collectionModal.setName(page.selectedCollection.collectionName); 1750 collectionModal.setDescription(page.selectedCollection.collectionDescription); 1751 collectionModal.show(page.selectedCollection.collectionUUID, true); 1752 } 1753 else if(menuItemPressed == 'Delete Collection'){ 1754 deleteCollectionModal.show(page.selectedCollection); 1755 } 1756 }).subscribe(); 1757 1758 Pubsub.subscription('new_collection_block_create_collection_pressed', (e) => { 1759 collectionModal.show(0, false); 1760 }).subscribe(); 1761 1762 Pubsub.subscription('collection_card_pressed', (e) => { 1763 1764 window.location.hash = e.collection.collectionUUID; 1765 1766 page.setSelectedCollection(e.collection); 1767 1768 collectionsService.getCollectionProperties(e.collection.collectionUUID,1, propertyPaging.propertiesPerPage).then((collectionProperties) => { 1769 1770 1771 savedListings.setCount(collectionProperties?.data?.totalListings || 0); 1772 propertyPaging.setPageCount(collectionProperties.data.totalPages); 1773 1774 1775 if(collectionProperties?.data?.properties == null){ 1776 addListingsBlock.show(); 1777 } 1778 propertySection.show(e.collection.collectionUUID,collectionProperties) 1779 propertySection.setPropertyCardWidth(); 1780 1781 if(collectionProperties.data.totalPages > 1){ 1782 propertyPaging.show(); 1783 } 1784 1785 }); 1786 1787 1788 collectionSection.hide(); 1789 1790 let collectionList = []; 1791 1792 collections.forEach(collection => { 1793 if (collection.collectionName == e.collection.collectionName) return; 1794 1795 collectionList.push({ 1796 collection_title: collection.collectionName, 1797 id: collection.collectionUUID, 1798 propertiesImages: collection?.propertiesImages?.length > 0 ? collection?.propertiesImages : [], 1799 }) 1800 }); 1801 1802 copyPropertyToCollectionModal.getCollectionList(collections, e.collection.collectionName); 1803 1804 pageSubHeader.showTopHeader(); 1805 pageSubHeader.setTopHeaderTitle("Collections"); 1806 pageSubHeader.setTitle(e.collection.collectionName); 1807 pageSubHeader.hidePrimaryButton(); 1808 pageSubHeader.showMenuButton(); 1809 1810 if(window.innerWidth > 768 ){ 1811 pageSubHeader.showSecondaryButton(); 1812 } 1813 1814 page.setInPropertyView(true) 1815 1816 propertyPaging.setCurrentPage(1); 1817 propertySection.setView('list') 1818 1819 1820 const collectionDescription = document.getElementById('collection-description') 1821 collectionDescription.style.display="flex" 1822 collectionDescription.children[0].innerText = e?.collection.collectionDescription || "" 1823 }).subscribe(); 1824 1825 Pubsub.subscription('collection_card_menu_item_pressed', (e) => { 1826 if (e.menuItem == "Delete Collection") { 1827 1828 deleteCollectionModal.show(e.collection); 1829 1830 } else { 1831 1832 1833 collectionModal.setName(e.collection.collectionName); 1834 collectionModal.setDescription(e.collection.collectionDescription); 1835 collectionModal.show(e.collection.collectionUUID, true); 1836 } 1837 }).subscribe(); 1838 1839 Pubsub.subscription('property_card_menu_item_pressed', (e) => { 1840 if(e.menuItem == 'Remove from Collection') { 1841 deletePropertyModal.show(e.collectionUUID, e.propertyCollectionUUID); 1842 } 1843 else if(e.menuItem == 'Copy to Collection') { 1844 copyPropertyToCollectionModal.show(e.property); 1845 } 1846 else if(e.menuItem == 'Share Property') { 1847 1848 shareSavedPropertyModal.show(e.property); 1849 } 1850 }).subscribe(); 1851 1852 Pubsub.subscription('delete_property_modal_pressed', (e) => { 1853 deletePropertyModal.show(e.collectionUUID, e.propertyCollectionUUID); 1854 }).subscribe(); 1855 1856 Pubsub.subscription('show_new_collection_modal', (e) => { 1857 collectionModal.show(); 1858 copyPropertyToCollectionModal.hide(); 1859 createCopyCollection = true; 1860 }).subscribe(); 1861 1862 Pubsub.subscription('top_header_back_pressed', () => { 1863 window.location.hash = ''; 1864 pageSubHeader.hideTopHeader(); 1865 page.selectedCollection = {}; 1866 pageSubHeader.setTitle("COLLECTIONS"); 1867 pageSubHeader.showPrimaryButton(); 1868 pageSubHeader.hideSecondaryButton(); 1869 pageSubHeader.hideMenuButton(); 1870 1871 page.setInPropertyView(false) 1872 1873 collectionSection.show(); 1874 propertySection.hide() 1875 1876 propertyPaging.setCurrentPage(1); 1877 1878 copyPropertyToCollectionModal.getCollectionList(collections) 1879 1880 const collectionDescription = document.getElementById('collection-description') 1881 collectionDescription.style.display="none" 1882 collectionDescription.children[0].innerText = ""; 1883 addListingsBlock.hide(); 1884 }).subscribe() 1885 1886 Pubsub.subscription('create_new_collection_pressed', (e) => { 1887 collectionModal.show(0, false); 1888 }).subscribe(); 1889 1890 Pubsub.subscription('on_new_collection_saved', (e) => { 1891 if(e.type == 'save'){ 1892 1893 let people = [{ personUUID: page.lead.brivity_uuid, role: "lead" }]; 1894 let properties = [""]; 1895 collectionsService.createCollection(e.name, e.description, page.lead.brivity_uuid, people, properties).then((e) => { 1896 1897 collections.unshift(e.data); 1898 1899 extraCollections++ 1900 if(collections.length > 8) { 1901 collections.pop(); 1902 collectionPaging.show() 1903 collectionPaging.setPageCount(Math.ceil(extraCollections / 8)); 1904 } 1905 1906 count = 100; 1907 collectionSection.collections.innerHTML = ""; 1908 collections.forEach((collection) => { 1909 count-- 1910 collectionSection.addCollectionCard(collection, count) 1911 }); 1912 1913 let collectionsList = copyPropertyToCollectionModal.getCollectionData(); 1914 let newCollection = { 1915 collection_title: e.data.collectionName, 1916 id: e.data.collectionUUID, 1917 propertiesImages: [], 1918 } 1919 collectionsList.unshift(newCollection); 1920 copyPropertyToCollectionModal.setCollectionData(collectionsList); 1921 1922 if(!copyPropertyToCollectionModal.isVisible){ 1923 if (createCopyCollection) { 1924 copyPropertyToCollectionModal.isVisible = true; 1925 copyPropertyToCollectionModal.element.setAttribute('style', 'display:flex'); 1926 createCopyCollection = false;
1927 } else { 1928 collectionCreatedModal.show(e.data); 1929 } 1930 } 1931 1932 collectionModal.hide(); 1933 1934 newCollectionBlock.hide(); 1935 }).catch((e) => { 1936 collectionModal.showError(true) 1937 }); 1938 } 1939 else{ 1940 collectionsService.updateCollection(e.collectionUUID, e.name, e.description).then((collection) => { 1941 let element = document.getElementById(e.collectionUUID); 1942 element.setAttribute('title', e.name); 1943 element.setAttribute('description', e.description); 1944 if(Object.keys(page.selectedCollection).length !== 0){ 1945 pageSubHeader.setTitle(e.name); 1946 } 1947 const collectionDescription = document.getElementById('collection-description') 1948 collectionDescription.children[0].innerText = e.description; 1949 let updatedCollection = collections.findIndex((c) => c.collectionUUID == e.collectionUUID) 1950 if(updatedCollection != -1){ 1951 collections[updatedCollection].collectionName = e.name; 1952 collections[updatedCollection].collectionDescription = e.description; 1953 } 1954 collectionModal.hide(); 1955 editCollectionModal.show(); 1956 }); 1957 } 1958 }).subscribe(); 1959 1960 Pubsub.subscription('collection_created_modal_view_collection_pressed', (collection) => { 1961 Pubsub.publish('collection_card_pressed', {"collection": collection}) 1962 }).subscribe(); 1963 1964 Pubsub.subscription('delete_collection_modal_delete_pressed', (collection) => { 1965 collectionsService.deleteCollection(collection.collectionUUID).then((e) => { 1966 document.getElementById(collection.collectionUUID).remove(); 1967 toast.show('Collection was Deleted') 1968 1969 extraCollections-- 1970 1971 if(extraCollections.length < 9) { 1972 collectionPaging.hide() 1973 }else{ 1974 collectionPaging.setPageCount(Math.ceil(extraCollections / 8)); 1975 } 1976 1977 if(page.inPropertyView){ 1978 Pubsub.publish('top_header_back_pressed'); 1979 } 1980 }); 1981 }).subscribe(); 1982 1983 Pubsub.subscription('delete_property_modal_delete_pressed', (e) => { 1984 const currentPage = $("#property-pagination").find("#info-parent").filter( 1985 function() { 1986 return $(this).css("color") === "rgb(196, 196, 196)" 1987 } 1988 ).text(); 1989 1990 const propertiesPerPage = 8; 1991 const numOfProperties = $("#property-list .property-card-wrapper").length; 1992 const setPage = numOfProperties === 1 ? currentPage - 1 : currentPage; 1993 1994 collectionsService.removePropertyFromCollection(e.collectionUUID, e.propertyCollectionUUID) 1995 .then(() => { 1996 toast.show('Property removed from collection'); 1997 1998 return collectionsService.getCollectionProperties(e.collectionUUID, setPage, propertiesPerPage); 1999 }) 2000 .then((collectionProperties) => { 2001 const totalListingsCount = collectionProperties?.data?.totalListings; 2002 const properties = collectionProperties?.data?.properties; 2003 const totalPages = collectionProperties?.data?.totalPages; 2004 const currentCollection = $(`#${e.collectionUUID}`); 2005 2006 currentCollection.attr("num_properties", totalListingsCount); 2007 2008 map.setMarkers(properties); 2009 savedListings.setCount(totalListingsCount || 0); 2010 propertySection.show(propertySection.collectionUUID, collectionProperties); 2011 propertySection.setPropertyCardWidth(); 2012 2013 propertyPaging.setCurrentPage(setPage); 2014 propertyPaging.setPageCount(totalPages); 2015 2016 if (totalListingsCount <= 8) { 2017 propertyPaging.hide(); 2018 } 2019 }) 2020 .catch(error => { 2021 console.error("Error in collection operations:", error); 2022 }); 2023 }).subscribe(); 2024 2025 Pubsub.subscription('copy_property_to_collection_modal_save_pressed', (e) => { 2026 2027 let collectionUUID = e.collectionUUID; 2028 let blossorId = e.property.blossorId; 2029 collectionsService.addPropertyToCollection(collectionUUID, [blossorId]).then(() => { 2030 2031 2032 let data = copyPropertyToCollectionModal.getCollectionData(); 2033 let myFeedData = myFeed.getMlsData(); 2034 2035 collectionsService.getCollectionProperties(collectionUUID,1,1).then((e) => { 2036 2037 // update photos in add property to collection modal 2038 let collectionIndex = data.findIndex((x) => x.id == collectionUUID); 2039 let collection = data[collectionIndex]; 2040 let photo = e?.data?.properties[0]?.photos[0]?.url; 2041 2042 collection.propertiesImages = []; 2043 if(e?.data?.properties?.length > 0){ 2044 collection.propertiesImages.push({mainPhoto: photo}); 2045 } 2046 2047 data[collectionIndex] = collection; 2048 2049 copyPropertyToCollectionModal.setCollectionData(data); 2050 2051 2052 // update collection card if in collection view 2053 pageCollectionIndex = collections.findIndex((x) => x.collectionUUID == collectionUUID) 2054 2055 if(pageCollectionIndex > -1){ 2056 2057 let collectionCard = document.getElementById(collectionUUID); 2058 let numProperties = parseInt(collectionCard.getAttribute('num_properties')); 2059 numProperties++; 2060 collectionCard.setAttribute('num_properties', numProperties); 2061 2062 let images = collectionCard.getAttribute('image'); 2063 if(images){ 2064 images += "," + photo; 2065 } 2066 else{ 2067 images = photo; 2068 } 2069 2070 collectionCard.setAttribute('image', images); 2071 } 2072 2073 //update my feed to set property heart as favorited 2074 let myFeedPropertyIndex = myFeedData.findIndex((x) => x.blossorId == blossorId); 2075 if(myFeedPropertyIndex > -1){ 2076 myFeedData[myFeedPropertyIndex].favorite = true; 2077 myFeed.setMlsData(myFeedData); 2078 } 2079 2080 }) 2081 2082 copyPropertyToCollectionModal.hide(); 2083 toast.show('Property added to collection') 2084 2085 }).catch((e) => { 2086 toast.show('Error adding property to collection', true) 2087 }); 2088 }).subscribe(); 2089 2090 Pubsub.subscription('collection_page_changed', (e) => { 2091 collectionsService.getCollections(e, collectionPaging.collectionsPerPage).then((e) => { 2092 if(e?.data?.Items){ 2093 collections = e.data.Items; 2094 2095 collectionSection.collections.innerHTML = ""; 2096 count = 100;
2097 e.data.Items.forEach((collection) => { 2098 count-- 2099 2100 collectionSection.addCollectionCard(collection, count) 2101 }); 2102 } 2103 }); 2104 }).subscribe(); 2105 2106 Pubsub.subscription('share_saved_property_modal_share_pressed', (e) => { 2107 toast.show('Link Copied!') 2108 }).subscribe(); 2109 2110 Pubsub.subscription('my_feed_share_pressed', (e) => { 2111 shareSavedPropertyModal.show(e.property); 2112 }).subscribe(); 2113 2114 Pubsub.subscription('my_feed_add_collection_pressed', (e) => { 2115 copyPropertyToCollectionModal.setIsAddingToCollection(true); 2116 copyPropertyToCollectionModal.show(e.property); 2117 }).subscribe(); 2118 2119 Pubsub.subscription('map_marker_clicked', (id) => { 2120 propertySection.scrollIntoView(id); 2121 2122 document.querySelectorAll('place-propertycard').forEach((propertyCard) => { 2123 if(propertyCard.id == id) { 2124 propertyCard.setAttribute('show_border', true) 2125 } 2126 else { 2127 propertyCard.setAttribute('show_border', false) 2128 } 2129 }) 2130 }).subscribe(); 2131 2132 Pubsub.subscription('my_feed_on_favorite_pressed', (e) => { 2133 copyPropertyToCollectionModal.setIsAddingToCollection(true); 2134 copyPropertyToCollectionModal.show(e.property); 2135 }).subscribe(); 2136 2137 Pubsub.subscription('my_feed_on_unfavorite_pressed', (e) => { 2138 let blossorId = e.property.blossorId; 2139 let myFeedData = myFeed.getMlsData(); 2140 collectionsService.checkIfInCollection([blossorId]).then((propertiesInCollections) => { 2141 if(propertiesInCollections.data[blossorId]){ 2142 propertiesInCollections.data[blossorId].forEac
2142h((collection) => { 2143 collectionsService.removePropertyFromCollection(collection.collectionUUID, collection.propertyUUID).then(() => { 2144 2145 let data = copyPropertyToCollectionModal.getCollectionData(); 2146 let collectionUUID = collection.collectionUUID; 2147 collectionsService.getCollectionProperties(collectionUUID,1,1).then((e) => { 2148 2149 // update photos in add property to collection modal 2150 let collectionIndex = data.findIndex((x) => x.id == collectionUUID); 2151 let collection = data[collectionIndex]; 2152 let photo = e?.data?.properties?.length > 0 ? e?.data?.properties[0]?.photos[0]?.url : ''; 2153 2154 collection.propertiesImages = []; 2155 if(e?.data?.properties?.length > 0){ 2156 collection.propertiesImages.push({mainPhoto: photo}); 2157 } 2158 2159 data[collectionIndex] = collection; 2160 2161 copyPropertyToCollectionModal.setCollectionData(data); 2162 2163 2164 // update collection card if in collection view 2165 pageCollectionIndex = collections.findIndex((x) => x.collectionUUID == collectionUUID) 2166 2167 if(pageCollectionIndex > -1){ 2168 2169 let collectionCard = document.getElementById(collectionUUID); 2170 let numProperties = parseInt(collectionCard.getAttribute('num_properties')); 2171 numProperties--; 2172 collectionCard.setAttribute('num_properties', numProperties); 2173 2174 let images = collectionCard.getAttribute('image'); 2175 let newImages = images.split(',').filter((x) => x == photo).join(','); 2176 collectionCard.setAttribute('image', newImages); 2177 } 2178 2179 //update my feed to set property heart as not favorited 2180 let myFeedPropertyIndex = myFeedData.findIndex((x) => x.blossorId == blossorId); 2181 if(myFeedPropertyIndex > -1){ 2182 myFeedData[myFeedPropertyIndex].favorite = false; 2183 myFeed.setMlsData(myFeedData); 2184 } 2185 }) 2186 toast.show('Property removed from collection'); 2187 }).catch((e) => { 2188 toast.show('Error removing from collection', true); 2189 }); 2190 }); 2191 } 2192 }); 2193 }).subscribe(); 2194 2195 let modalBackdrop = document.getElementsByClassName('center-modal'); 2196 for(let i = 0; i < modalBackdrop.length; i++){ 2197 modalBackdrop[i].addEventListener('click', (e) => { 2198 if(e.target == modalBackdrop[i]){ 2199 modalBackdrop[i].style.display = 'none'; 2200 } 2201 }); 2202 } 2203 2204 window.addEventListener( "hashchange", function( event ) { 2205 if(window.location.hash == ''){ 2206 Pubsub.publish("top_header_back_pressed"); 2207 } 2208 }); 2209 2210 2211 document.addEventListener("click", (e) => { 2212 2213 const elements = document.querySelectorAll("[show_menu]");
2214 elements.forEach((el) => { 2215 el.setAttribute("show_menu", "false"); 2216 }); 2217 2218 document.getElementById("c2dfac72-6233-4e8d-b0d2-f44e4240ebb4")?.setAttribute("show_menu", "false"); 2219 }); 2220 if(window.innerWidth < 768 ){ 2221 savedListings.hide(); 2222 pageSubHeader.hideSecondaryButton(); 2223 } else{ 2224 addListingBtn.hide(); 2225 } 2226 })(); 2227 } 2228 }) 2229 2230</script>
2230 <div id="myportal-page" style="display:none"> <div style="position:relative; width:100%;"> <div style="position:absolute;z-index:110; top:0; bottom:0; "> <place-menu></place-menu> </div> <div class="collection-page" style="flex:1;"> <div class="page-width-parent"> <place-pagesubheader title="COLLECTIONS" show_top_header="false" button_title="Create New" button_icon="plus" secondary_button_icon="plus" secondary_button_title="Add Listings" show_secondary_button="false" show_menu="false" menu_items='[{ "icon": "edit-2", "text": "Edit Collection" },{ "icon": "trash", "text": "Delete Collection" }]' ></place-pagesubheader> <div id="collection-description" class="collection-description" style="display:none;"> <p class="collection-description-text" style="" ></p> </div> <div id="collection-section" style="margin-top:24px;"> <div id="collections" style="display:flex; flex-wrap:wrap"> <place-actioncard id="new-collection-block" style="display:none;" title="Create A Collection" sub_title="You can create a collection to save and keep track of your favorite properties." button_text="Create New" button_icon="plus" button_icon_fill="white" card_width="300" /> </div> <place-pagination id="collection-pagination" style="display:none"></place-pagination> <div class="my-feed-parent"> <place-myfeedblock style="display:none" display_menu="false"></place-myfeedblock> </div> </div> <div id="property-section"> <div id="property-header" style="display:flex; justify-content: space-between"> <p id="collection-saved-listings" class="collection-saved-listings"></p> <place-button icon="plus" ghost="true" btn_text_styles="text-[#5386E4]" icon_stroke="#5386E4" id="add-listing-btn" title="Add Listing"></place-button> <div style="padding: 0 5px; display:flex"> <place-icon id="property-list-icon" style="margin-right:10px" name="list" size="24" fill="none" stroke="black"></place-icon> <place-icon id="property-map-icon" name="map" size="24" fill="none" stroke="gray"></place-icon> </div> </div> <div class="property-container" style=""> <div id="property-list-parent"> <div id="property-list" class="property-list-list-view"> </div> <div> <place-actioncard id="add-listings-block" style="display:none;" title="Add Listings" sub_title="You can search and add properties to a collection to keep track of your favorite homes using the heart icon." button_text="Search Listings" button_icon="search" button_icon_fill="white" card_width="300" /> </div> </div> <div id="property-map" class="property-map-container" style="display:none" > <place-map map_type_control="true" zoom_control="true"> </place-map> </div> </div> <place-pagination id="property-pagination" class="property-pagination" style="display:none"></place-pagination> </div> </div> </div> </div> <place-basicmodal id="collection-created-modal" class="center-modal" style="display:none" title="Collection Created" sub_title="Would you like to add listings to your new collection? You can search for new listings or copy them from an existing collection." title_icon="heart" primary_button_text="View Collection" tertiary_button_text="Search" stacked_buttons="true" ></place-basicmodal> <place-basicmodal id="delete-collection-modal" class="center-modal" style="display:none" title="Delete Collection" sub_title="Deleting a collection will permanently remove it from your account. Your saved properties will only be visible in your Favorites collection." description="Are you sure you would like to delete this collection?" title_icon="trash" primary_button_text="Delete" tertiary_button_text="Cancel" no_stack_buttons="true" ></place-basicmodal> <place-basicmodal id="edit-collection-modal" class="center-modal" style="display:none" title="Changes Saved" sub_title="The changes to your collection have been saved." title_icon="check" primary_button_text="Close" ></place-basicmodal> <place-basicmodal id="delete-property-modal" class="center-modal" style="display:none" title="Remove Property" sub_title="Deleting this property will remove it from the current collection. Are you sure you would like to delete this property from your collection?" title_icon="trash" primary_button_text="Delete" tertiary_button_text="Cancel" no_stack_buttons="true" ></place-basicmodal> <place-basicmodal id="share-saved-property-modal" class="center-modal" style="display:none" title="Share Property" sub_title="Copy link to share property." title_icon="share" primary_button_text="Copy Link" ></place-basicmodal> <place-copycollectionmodal class="center-modal" style="display:none" collections='[]' ></place-copycollectionmodal> <place-collectionpopup class="center-modal" style="display:none"></place-collectionpopup> </div> <footer id="footer-9n" data-selector="footer" style="outline: none; cursor: inherit; outline-offset: -3px;"><div class="container"> <div class="row"> <div class="col-md-2"> <div class="render-menu hot-nav"> <ul class="" style="outline: none; cursor: inherit;"><li class="nav-item" data-selector="li" style="outline: none; cursor: inherit;"> <a href="/index" style="outline: none; cursor: inherit;">Home</a> </li> <li class="nav-item" data-selector="li" style="outline: none; cursor: inherit;"> <a href="/search" style="outline: none; cursor: inherit;">Listings</a> </li> <li class="nav-item" data-selector="li" style="outline: none; cursor: inherit;"> <a href="/buying" style="outline: none; cursor: inherit;">Buying</a> </li> <li class="nav-item" data-selector="li" style="outline: none; cursor: inherit;"> <a class="white" href="/selling" style="outline: none; cursor: inherit;">Selling</a> </li> <li class="nav-item" data-selector="li" style="outline: none; cursor: inherit;"> <a href="/financing" style="outline: none; cursor: inherit;">Financing</a> </li> <li class="nav-item" data-selector="li" style="outline: none; cursor: inherit;"> <a href="/homevalue" style="outline: none; cursor: inherit;">Home Value</a> </li> <li class="nav-item" data-selector="li" style="outline: none; cursor: inherit;"> <a href="/realestateagent/search" style="outline: none; cursor: inherit;">Who We Are</a> </li> <li class="nav-item" data-selector="li" style="outline: none; cursor: inherit;"> <a href="/connect" style="outline: none; cursor: inherit;">Connect</a> </li> </ul></div> </div>
2230 <div class="col-md-7 col-md-offset-1"> <form id="form-contact1" action="" class="form-contact"> <div class="row margin-bottom-0"> <div class="col-sm-6" style="margin-bottom: 20px;"> <div class="form-group"> <input name="contact1_fname" id="contact1_fname" placeholder="First Name" class="form-control contact_fname" type="text" required="" style='background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVQ4EaVTO26DQBD1ohQWaS2lg9JybZ+AK7hNwx2oIoVf4UPQ0Lj1FdKktevIpel8AKNUkDcWMxpgSaIEaTVv3sx7uztiTdu2s/98DywOw3Dued4Who/M2aIx5lZV1aEsy0+qiwHELyi+Ytl0PQ69SxAxkWIA4RMRTdNsKE59juMcuZd6xIAFeZ6fGCdJ8kY4y7KAuTRNGd7jyEBXsdOPE3a0QGPsniOnnYMO67LgSQN9T41F2QGrQRRFCwyzoIF2qyBuKKbcOgPXdVeY9rMWgNsjf9ccYesJhk3f5dYT1HX9gR0LLQR30TnjkUEcx2uIuS4RnI+aj6sJR0AM8AaumPaM/rRehyWhXqbFAA9kh3/8/NvHxAYGAsZ/il8IalkCLBfNVAAAAABJRU5ErkJggg=="); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%; cursor: auto;'></div> </div> <div class="col-sm-6" style="margin-bottom: 20px;"> <div class="form-group"> <input name="contact1_lname" id="contact1_lname" placeholder="Last Name" class="form-control contact_lname" type="text" required=""></div> </div> </div> <div class="row margin-bottom-0"> <div class="col-sm-6" style="margin-bottom: 20px;"> <div class="form-group"> <input name="contact1_email" id="contact1_email" placeholder="Email Address" class="form-control contact_email" type="email" required=""></div> </div> <div class="col-sm-6" style="margin-bottom: 20px;"> <div class="form-group"> <input name="contact1_phone" id="contact1_phone" placeholder="Phone Number" class="form-control contact_phone" type="tel" required=""></div> </div> </div> <div class="row margin-bottom-0"> <div class="col-sm-12" style="margin-bottom: 20px;"> <i class="fa fa-caret-down" style="position: absolute; top: 13px; right: 30px; font-size: 14px; outline: none; cursor: inherit;" data-selector=".fa"></i> <select name="lead_type" style="width: 100%; height: 40px; padding-left: 12px; font-size: 14px; border-radius: 0; -webkit-appearance: none; -webkit-border-radius: 0px;"><option value="buyer">I'm interested in buying a home</option><option value="seller">I'm interested in selling a home</option><option value="seller/buyer">I'm interested in buying and selling</option><option value="tenant">I'm interested in finding a home to rent</option><option value="recruit">I'm interested in a real estate career</option><option value="n/a">Other reason to contact an agent</option></select></div> </div> <div class="row margin-bottom-0"> <div class="col-sm-12" style="margin-bottom: 20px;"> <textarea name="contact1_message" id="contact1_message" class="form-control contact_message" rows="3" placeholder="Your Message"></textarea></div> </div> <div class="text-right"> <input type="text" id="contact1_robot_field" name="contact1_robot_field" style="display: none;"><button type="submit" class="btn btn-footer" data-selector="a.btn, button.btn, button" style="outline: none; cursor: inherit;">Send Us A Message</button> </div> <div id="honeypot-div"> <input name="age_required" id="age_required" value="" type="text" style="display: none;"></div></form> </div> <div class="col-md-2 col-md-offset-1"> <img class="ftr-logo" src="https://images.brivityidx.com/assets/images/uploads/102811/footer-stacked-logos.png" alt="eXp" data-selector="img" style="border-radius: 0px !important; border-color: rgb(128, 128, 128) !important; border-style: none !important; border-width: 0px !important; outline: none; cursor: inherit;"> <div class="text-left" style="outline: medium none; cursor: inherit;"> <ul style="list-style-type: none; outline: none; cursor: inherit;"><b><span style="font-size: 18px;"><br>The Good Home Team<br><br></span> </b><li data-selector="li" style="outline: none; cursor: inherit;"> <span class="agent_address_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading"></span> <br><span class="agent_city_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading"></span>, <span class="agent_state_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading"></span> <span class="agent_zip_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading"></span> </li> <li data-selector="li" style="outline: none; cursor: inherit;">972-215-SOLD(7653)</li> </ul></div> </div> </div> <div class="row ftr-anchor"> <div class="col-sm-6 anchor-col no-padding editContent" style="outline: none; cursor: inherit;" data-selector=".editContent"> <p class="no-margin" style="outline: none; cursor: inherit;" data-selector="p"><span class="get_this_year">2018</span> © <strong>The Good Home Team l eXp Realty l PLACE</strong></p> <p style="margin: 10px 0px; outline: none; cursor: inherit;" data-selector="p"> <img src="https://images.brivityidx.com/assets/images/uploads/1428/Equal-Housing-Realtor_gray50.png" alt="Equal Housing | Realtor" style="width: 50px; outline: none; cursor: inherit;" data-selector="img">  Each office is independently owned and operated. </p> </div> <div class="col-sm-6 anchor-col no-padding"> <ul class="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/TheGoodHomeTeam" target="_blank" style="outline: none; cursor: inherit;"> <svg viewbox="0 0 24 24" width="24" height="24" stroke="currentColor" stroke-width="0" fill="currentColor" 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="" target="_blank" style="outline: none; cursor: inherit;"> <svg viewbox="0 0 24 24" width="24" height="24" stroke="currentColor" stroke-width="0" fill="currentColor" 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_linkedin_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://linkedin.com/in/thegoodhometeam/" target="_blank" style="outline: none; cursor: inherit;"> <svg viewbox="0 0 24 24" width="24" height="24" stroke="currentColor" stroke-width="0" fill="currentColor" stroke-linecap="round" stroke-linejoin="round" class="css-i6dzq1"><path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"></path><rect x="2" y="9" width="4" height="12"></rect><circle cx="4" cy="4" r="2"></circle></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="http://instagram.com/thegoodhometeam" 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> <li data-selector="li" style="outline: none; cursor: inherit;"> <a class="agent_youtube_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://www.youtube.com/nickgood" 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="M22.54 6.42a2.78 2.78 0 0 0-1.94-2C18.88 4 12 4 12 4s-6.88 0-8.6.46a2.78 2.78 0 0 0-1.94 2A29 29 0 0 0 1 11.75a29 29 0 0 0 .46 5.33A2.78 2.78 0 0 0 3.4 19c1.72.46 8.6.46 8.6.46s6.88 0 8.6-.46a2.78 2.78 0 0 0 1.94-2 29 29 0 0 0 .46-5.25 29 29 0 0 0-.46-5.33z"></path><polygon points="9.75 15.02 15.5 11.75 9.75 8.48 9.75 15.02"></polygon></svg></a> </li> <li data-selector="li" style="outline: none; cursor: inherit;"> <a class="agent_pinterest_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="" target="_blank" style="outline: none; cursor: inherit;"> <svg width="24" height="24" viewbox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12ZM12 1C5.92487 1 1 5.92487 1 12C1 18.0751 5.92487 23 12 23C18.0751 23 23 18.0751 23 12C23 5.92487 18.0751 1 12 1ZM12.5494 5.07703C15.8009 5.07703 17.941 7.39568 17.941 9.88451C17.941 13.1764 16.0835 15.6358 13.3465 15.6369C12.4262 15.6369 11.5613 15.147 11.2652 14.5905C11.2652 14.5905 10.7711 16.524 10.666 16.8971C10.4896 17.5278 10.1493 18.1574 9.83274 18.656C9.38281 19.2234 8.86387 18.8023 8.80169 18.2851C8.78133 17.7089 8.80393 17.027 8.95206 16.4061C9.11487 15.7253 10.0476 11.8332 10.0476 11.8332C10.0476 11.8332 9.77511 11.2975 9.77511 10.5054C9.77511 9.26149 10.5066 8.33296 11.4178 8.33296C12.1922 8.33296 12.5664 8.90687 12.5664 9.5932C12.5664 10.0824 12.3646 10.7265 12.1521 11.4045C12.0313 11.7897 11.9072 12.1859 11.8146 12.5709C11.6009 13.4612 12.2668 14.1868 13.1588 14.1868C14.7733 14.1868 15.8597 12.1453 15.8597 9.72519C15.8597 7.88663 14.6025 6.50966 12.3154 6.50966C9.73212 6.50966 8.12222 8.40819 8.12222 10.5282C8.12222 11.2593 8.34042 11.7743 8.68412 12.1748C8.84124 12.3592 8.86387 12.4323 8.8062 12.6429C8.78317 12.7299 8.74315 12.8868 8.70577 13.0333C8.67708 13.1457 8.64994 13.2521 8.63324 13.3161C8.57671 13.5278 8.40146 13.6042 8.207 13.5256C7.01656 13.0477 6.46259 11.7634 6.46259 10.3199C6.46259 7.93578 8.50209 5.07703 12.5494 5.07703Z" fill="currentColor"></path></svg></a> </li> </ul></div> </div> <div class="row"> <div class="col-md-12 anchor-col no-padding"> <p class="no-margin" style="outline: none; cursor: inherit;" data-selector="p"> <a href="https://cdn1.brivityidx.com/assets/images/uploads/102811/texas_consumer_protection_notice.pdf" target="_blank" style="margin-right: 0px; outline: none; cursor: inherit;"><strong>TREC Consumer Protection Notice</strong></a> </p> <p class="no-margin" style="outline: none; cursor: inherit;" data-selector="p"> <a href="https://cdn1.brivityidx.com/assets/images/uploads/102811/IABS_2025.pdf" target="_blank" style="outline: none; cursor: inherit;"><strong>TREC Information About Brokerage Services</strong></a> </p> <p style="outline: none; cursor: inherit;" data-selector="p"><br><br>IDX information is provided exclusively for consumersâ personal, non-commercial use, that it may not be used for any purpose other than to identify prospective properties consumers may be interested in purchasing, and that the data is deemed reliable but is not guaranteed accurate by the MLS. The MLS may, at its discretion, require use of other disclaimers as necessary to protect participants and/or the MLS from liability.</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"}"> 2231<!-- chatbot v1 --> 2232<!-- Chatbot drawer container --> 2233<div class="chatbot-drawer-container loading"> 2234 <div class="chatbot-content-wrapper"> 2235 <div class="chatbot-outside-content"> 2236 <div class="chatbot-bubble-message-container cb-hide"> 2237 <img src="https://cdn.brivity.com/images/people/38260562/e8ebeefb28
22371bbb908863b3ec2c96174af1231da8-original.png?1674169863" class="chatbot-agent-img" alt="Agent profile image in chat bubble"/> 2238 <div id="call-to-action" class="bubble-message"></div> 2239 <button type="button" class="chatbox-bubble-close" data-dismiss="modal" aria-label="Close"> 2240 <span aria-hidden="true">×</span> 2241 </button> 2242 </div> 2243 <button id="chatbot-open-btn" class="chatbot-open-btn bg-prmry" aria-label="Chatbot Open Button"> 2244 <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> 2245 <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"/> 2246 </svg> 2247 </button> 2248 </div> 2249 <div class="chatbot-drawer"> 2250 <div class="chatbot-header bg-prmry"> 2251 <div class="chatbot-agent-info"> 2252 <img src="https://cdn.brivity.com/images/people/38260562/e8ebeefb281bbb908863b3ec2c96174af1231da8-original.png?1674169863" class="chatbot-agent-img" alt="Agent profile image in chat header"/> 2253 <div class="chatbot-agent"> 2254 <h3 class="chatbot-agent-name">Nick Good</h3> 2255 <h4><span class="chatbot-agent-title">Owner & Broker Associate</span> | <span class="chatbot-agent-company">The Good Home Team l eXp Realty l PLACE</span></h4> 2256 </div> 2257 <a id="chatbot-agent-phone" style="display: none;">(972) 215-7653</a> 2258 </div> 2259 <button id="close-chatbot-drawer" type="button" class="chatbox-modal-close" data-dismiss="modal" aria-label="Close"> 2260 <span aria-hidden="true">×</span> 2261 </button> 2262 </div> 2263 <div class="chatbot-body"> 2264 <div class="chatbot-message-container"> 2265 <img src="https://cdn.brivity.com/images/people/38260562/e8ebeefb281bbb908863b3ec2c96174af1231da8-original.png?1674169863" class="chatbot-agent-img" alt="Agent profile image in message"/> 2266 <h4 id="initial_message" class="chatbot-chat-messages not-loaded"></h4> 2267 <div class="chatbot-chat-messages loading"> 2268 <span class="typing-indicator"> 2269 <span></span> 2270 <span></span> 2271 <span></span> 2272 </span> 2273 </div> 2274 </div> 2275 <form id="chatbotForm" class="chatbot-form"> 2276 <input type="name" id="chatbot_fullname" class="chatbox-form-control no-native-focus" placeholder="Full Name" 2277 pattern="^[A-Za-z'\- ]+ [A-Za-z'\- ]+$" 2278 required /> 2279 <input type="tel" id="chatbot_phone" class="chatbox-form-control no-native-focus" placeholder="Phone" required /> 2280 <input type="email" id="chatbot_email" class="chatbox-form-control no-native-focus" placeholder="Email" 2281 pattern="^[^@\s]+@[^@\s]+\.[^@\s]+$" 2282 required /> 2283 <textarea id="chatbot_message" class="chatbox-form-control chatbot-message" rows="5" name="notes" placeholder="Any Comments or Questions"></textarea> 2284 <div class="chatbot-consent-container"> 2285 <div class="chatbot-toggle"> 2286 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
2286communications 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>. 2287 </div> 2288 </div> 2289 <input type="hidden" id="chatbot_tags"> 2290 </form> 2291 </div> 2292 <div class="chatbot-footer"> 2293 <button type="submit" form="chatbotForm" class="chatbot-send bg-prmry chatbot-btn-disabled" data-dismiss="modal" aria-label="Close" disabled> 2294 Send 2295 <span aria-hidden="true"> 2296 <svg class="chatbot-btn-icon" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> 2297 <g clip-path="url(#clip0_2435_997)"> 2298 <path d="M14.6667 1.33331L7.33337 8.66665" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 2299 <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"/> 2300 </g> 2301 <defs> 2302 <clipPath id="clip0_2435_997"> 2303 <rect width="16" height="16" fill="white"/> 2304 </clipPath> 2305 </defs> 2306 </svg> 2307 </span> 2308 </button> 2309 </div> 2310 </div> 2311 </div> 2312</div> <style> 2313 .signup-consent-checkbox-section { 2314 display: none; 2315 flex-direction:column; 2316 align-items:flex-start; 2317 padding: 6px 0; 2318 } 2319 2320 .signup-consent-checkbox-section .checkbox { 2321 display:flex; 2322 align-items:flex-start; 2323 justify-content:center; 2324 gap:8px; 2325 padding:0 !important; 2326 } 2327 2328 .signup-consent-checkbox-section .checkbox input { 2329 position:unset; 2330 margin:2px 0 0 0 !important; 2331 } 2332 2333 .signup-consent-checkbox-section .checkbox span { 2334 color: #666666; 2335 font-size: 14px; 2336 font-weight: 400; 2337 line-height:16px; 2338 } 2339 2340 .signup-verbage { 2341 text-align:center; 2342 font-size:10px; 2343 line-height:16px; 2344 } 2345 2346 .signup-verbage span { 2347 color: #8C8C8C; 2348 font-weight:600; 2349 } 2350 2351 .signup-verbage a { 2352 color:#5386E4 !important; 2353 font-weight:400; 2354 } 2355 2356 .signup-verbage .twilio-enabled-verbage { 2357 display:none; 2358 } 2359 2360 2361 2362 </style> <div id="modal-mount" data-modal-bundle="https://cdn1.brivityidx.com/assets/modals/v1/all.html?ck=1789512948"></div>
2362 <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>
2362<script> 2363 document.addEventListener("DOMContentLoaded", () => { 2364 class Toast { 2365 constructor() { 2366 this.element = document.querySelector('place-generictoast'); 2367 } 2368 2369 show(message, error = false, link) { 2370 var dispatch = function () { 2371 window.dispatchEvent( 2372 new CustomEvent("ShowToast", { 2373 detail: { 2374 text: message, 2375 error: error, 2376 link: link, 2377 }, 2378 }) 2379 ); 2380 }; 2381 if (window.sitebuilderPlaceComponents && window.sitebuilderPlaceComponents.ensureLoaded) { 2382 window.sitebuilderPlaceComponents 2383 .ensureLoaded('place-generictoast') 2384 .then(dispatch) 2385 .catch(function (err) { 2386 console.warn('toast.show fallback (web-components unavailable):', message, err); 2387 }); 2388 } else { 2389 dispatch(); 2390 } 2391 } 2392 } 2393 2394 window.toast = new Toast(); 2395 }); 2396 </script>
2396
2396<script src="https://cdn.jsdelivr.net/npm/@turf/[email protected]/turf.min.js"></script>
2396
2396<script src="https://maps.googleapis.com/maps/api/js?libraries=geocoding,places,marker,drawing&key=AIzaSyAjpuNg6WGCMV5rzoJcIP2QmMTVto6hYmc&map_ids=85c127b7bf0255d9"></script>
2396
2396<script src="https://cdn1.brivityidx.com/assets/js/build.min.js?ck="></script>
2396
2396<script src="https://cdn1.brivityidx.com/assets/js/top_bar_v2.min.js?ck="></script>
2396
2396<script src="https://cdn1.brivityidx.com/assets/js/global_js.min.js?ck=1789512947"></script>
2396
2396<script>deferScript("https://cdn1.brivityidx.com/assets/js/global_js_defer.min.js?ck=1789512947", 5000);</script>
2396
2396<script> 2397 function shouldLoadChatbotImmediately() { 2398 const settingsEl = document.getElementById('hchatbot_settings'); 2399 if (!settingsEl) return false; 2400 2401 const version = Number(settingsEl.dataset.chatbotVersion); 2402 let isInitialized = false; 2403 2404 try { 2405 const session = JSON.parse(sessionStorage.getItem('cbSession') || '{}'); 2406 isInitialized = session.chatbotInitialized === true; 2407 } catch (e) {} 2408 2409 return version > 1 && isInitialized; 2410 } 2411 </script>
2411
2411<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>
2411
2411<script>document.getElementById('hchatbot_settings') && deferScript(Number(document.getElementById('hchatbot_settings').dataset.chatbotVersion) > 1 ? "https://cdn1.brivityidx.com/assets/js/chatbot_v2.min.js?ck=1789512945" : "https://cdn1.brivityidx.com/assets/js/chatbot.min.js?ck=1789512945", shouldLoadChatbotImmediately() ? 50 : 5000);</script>
2411
2411<script type="text/javascript" src="https://cdn1.brivityidx.com/assets/js/jquery.geocomplete.min.js"></script>
2411<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.bootstrapvalidator/0.5.3/js/bootstrapValidator.min.js"></script>
2411<script type="text/javascript" src="https://cdn1.brivityidx.com/assets/js/menu2.js"></script>
2411<script type="text/javascript" src="https://cdn1.brivityidx.com/assets/js/member_area_components.js"></script>
2411<script type="text/javascript" src="https://cdn1.brivityidx.com/assets/js/update_agent_info.min.js"></script>
2411
2411<script src="https://mobile-component-services-library.s3.amazonaws.com/collections_service.min.js?ck=1"></script>
2411
2411<script src="https://mobile-component-services-library.s3.amazonaws.com/messaging_service.min.js?ck=1"></script>
2411
2411<script>$(document).ready(function(){$("ul.seo-anchor-links li:nth-of-type(4) a").attr("href","/search")})</script>
2411
2411<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>
2411
2411<script>$('.menu-toggle').click(function(){$('#slide-out-nav, .slide-out-nav-overlay').addClass('open')});$('.close-nav, .slide-out-nav-overlay').click(function(){$('#slide-out-nav, .slide-out-nav-overlay').removeClass('open')})</script>
2411
2411<script>$("#slide-out-nav > div.render-menu > ul").append('<li class="nav-item"><a style="color:#fff!important; border-radius:5px; max-width:250px; margin:0 auto;" id="top-nav-marketing-plan" class="nav-link-color" data-toggle="modal" data-target="#getmarketingplan">Get Marketing Plan</a></li>')</script>
2411
2411<script>$("#contact1_availability_date").click(function(){$(this).prop('type','date')})</script>
2411
2411<script>$(document).ready(function(){if($('#slide-out-nav .render-menu ul li a:contains("ABOUT PLACE")')){$('#slide-out-nav .render-menu ul li a:contains("ABOUT PLACE")').attr('target','_blank')}})</script>
2411
2411<script>$("a.pb-vendor").attr({"target":"_blank"})</script>
2411
2411<script>$('#seo-anchor a.pb-vendor').html('<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 822.81 228.05"><defs><style>.cls-1{fill:#5f605f;}.cls-2{fill:#f3714f;}.cls-3{fill:#5bc5c4;}.cls-4{fill:#fdfeff;}.cls-5{fill:#376e7b;}</style></defs><path class="cls-1" d="M373.61,341.21A61.3,61.3,0,0,1,386,342.42a30,30,0,0,1,10.42,4.14,22,22,0,0,1,7.21,7.71,23.86,23.86,0,0,1,2.71,11.92A24.26,24.26,0,0,1,405,374a23.82,23.82,0,0,1-3.64,6.85,23.38,23.38,0,0,1-5.57,5.21,20.81,20.81,0,0,1-7.21,3v.29q9.86,1.29,15.7,8.07t5.85,16.77a40.79,40.79,0,0,1-.42,5.49,27,27,0,0,1-1.72,6.28,26.28,26.28,0,0,1-3.71,6.36,22,22,0,0,1-6.49,5.49,39.23,39.23,0,0,1-10,3.86,58.63,58.63,0,0,1-14.21,1.49H330.5V341.21Zm0,44.67a33.93,33.93,0,0,0,10.14-1.35,21.17,21.17,0,0,0,7.13-3.71,15.28,15.28,0,0,0,4.29-5.5,16,16,0,0,0,1.42-6.71q0-19.12-23-19.13h-33.4v36.4Zm0,49a54.59,54.59,0,0,0,10.28-.93,23.53,23.53,0,0,0,8.56-3.36,17.09,17.09,0,0,0,5.86-6.49,21.75,21.75,0,0,0,2.14-10.21q0-9.84-6.92-14.77t-19.92-4.93h-33.4v40.69Z" transform="translate(-9.57 -307.21)"/><path class="cls-1" d="M466.68,341.21a44.11,44.11,0,0,1,11.92,1.57,28.7,28.7,0,0,1,9.85,4.78,23,23,0,0,1,6.71,8.28,26.74,26.74,0,0,1,2.5,11.92,28.63,28.63,0,0,1-5,16.84q-5,7.14-14.85,9.13V394a22.8,22.8,0,0,1,8.28,2.64,16.71,16.71,0,0,1,5.36,4.93,20.35,20.35,0,0,1,3,6.92,50.57,50.57,0,0,1,1.22,8.49c.09,1.72.19,3.81.28,6.28s.29,5,.57,7.5a46.45,46.45,0,0,0,1.36,7.13,13.54,13.54,0,0,0,2.5,5.21H489.66a12.34,12.34,0,0,1-1.35-3.49,31,31,0,0,1-.72-4.29c-.14-1.47-.26-2.92-.35-4.35s-.2-2.66-.29-3.71q-.29-5.43-.93-10.78a29.53,29.53,0,0,0-2.71-9.56,16.84,16.84,0,0,0-6-6.78q-3.93-2.57-10.78-2.29H429.71v45.25H420V341.21ZM466,389.6a26.16,26.16,0,0,0,8.42-1.36,20.84,20.84,0,0,0,7-3.93,19.3,19.3,0,0,0,4.79-6.21,18.85,18.85,0,0,0,1.78-8.35q0-9.42-5.43-14.84T466,349.48H429.71V389.6Z" transform="translate(-9.57 -307.21)"/><path class="cls-1" d="M522.78,341.21V443.12h-9.71V341.21Z" transform="translate(-9.57 -307.21)"/><path class="cls-1" d="M546,341.21l33.12,91.21h.29l32.83-91.21h10.27L584.73,443.12H573.45L535.77,341.21Z" transform="translate(-9.57 -307.21)"/><path class="cls-1" d="M642,341.21V443.12h-9.71V341.21Z" transform="translate(-9.57 -307.21)"/><path class="cls-1" d="M735.89,341.21v8.27H700.35v93.64h-9.71V349.48h-35.4v-8.27Z" transform="translate(-9.57 -307.21)"/><path class="cls-1" d="M742.45,341.21h11.42l33.55,51.67,33.4-51.67h11.56l-40.25,60v42h-9.71v-42Z" transform="translate(-9.57 -307.21)"/><path class="cls-2" d="M350.67,470q7,0,10.54,3.57t3.57,10q0,6.45-3.57,10.06t-10.54,3.54H336.62V516H330.5V470Zm-2.06,22q5.22.07,7.64-2.12a8.1,8.1,0,0,0,2.41-6.32,8,8,0,0,0-2.41-6.28q-2.42-2.16-7.64-2.16h-12V492Z" transform="translate(-9.57 -307.21)"/><path class="cls-2" d="M380,470v40.85h24.35V516H373.87V470Z" transform="translate(-9.57 -307.21)"/><path class="cls-2" d="M430.57,470l18,46h-6.76l-5-13.85H417.3L412.14,516h-6.25l17.91-46Zm4.25,27-7.67-21.46H427L419.23,497Z" transform="translate(-9.57 -307.21)"/><path class="cls-2" d="M443.84,475.16V470h36.79v5.15H465.3V516h-6.12V475.16Z" transform="translate(-9.57 -307.21)"/><path class="cls-2" d="M517.55,470v5.15h-24.1v14.63h21.14v5.15H493.45V516h-6.12V470Z" transform="translate(-9.57 -307.21)"/><path class="cls-2" d="M524.73,484a22.84,22.84,0,0,1,4.16-7.7,20.2,20.2,0,0,1,6.89-5.35,24,24,0,0,1,19.2,0,20.23,20.23,0,0,1,6.9,5.35A22.84,22.84,0,0,1,566,484a30.36,30.36,0,0,1,0,18.1,22.84,22.84,0,0,1-4.16,7.7,19.91,19.91,0,0,1-6.9,5.32,24.49,24.49,0,0,1-19.2,0,19.88,19.88,0,0,1-6.89-5.32,22.84,22.84,0,0,1-4.16-7.7,30.36,30.36,0,0,1,0-18.1Zm5.64,15.91a18.51,18.51,0,0,0,2.84,6.09,14.38,14.38,0,0,0,5,4.35,16.69,16.69,0,0,0,14.43,0,14.38,14.38,0,0,0,5-4.35,18.51,18.51,0,0,0,2.84-6.09,26.59,26.59,0,0,0,0-13.72,18.51,18.51,0,0,0-2.84-6.09,14.59,14.59,0,0,0-5-4.35,16.69,16.69,0,0,0-14.43,0,14.59,14.59,0,0,0-5,4.35,18.51,18.51,0,0,0-2.84,6.09,26.59,26.59,0,0,0,0,13.72Z" transform="translate(-9.57 -307.21)"/><path class="cls-2" d="M598.16,470q6.57,0,10.27,3.22a11.1,11.1,0,0,1,3.71,8.83,14,14,0,0,1-1.9,7.34,9.77,9.77,0,0,1-6.09,4.32v.13a8.26,8.26,0,0,1,3.25,1.29,7.08,7.08,0,0,1,2,2.16,9.92,9.92,0,0,1,1.1,2.8,31.32,31.32,0,0,1,.54,3.22c.09,1.12.15,2.26.19,3.41a31.69,31.69,0,0,0,.33,3.42,20.93,20.93,0,0,0,.74,3.19,7.68,7.68,0,0,0,1.45,2.67h-6.83a3.8,3.8,0,0,1-.87-1.93,19.54,19.54,0,0,1-.29-2.74c0-1-.09-2.09-.13-3.25a21.57,21.57,0,0,0-.39-3.42c-.17-1.11-.38-2.18-.64-3.19a7.56,7.56,0,0,0-1.23-2.64,5.9,5.9,0,0,0-2.19-1.8,8.12,8.12,0,0,0-3.61-.68H582.63V516h-6.12V470Zm1.28,20.88a9,9,0,0,0,3.39-1.26,7,7,0,0,0,2.32-2.51A8.48,8.48,0,0,0,606,483a8.27,8.27,0,0,0-1.94-5.67q-1.94-2.19-6.25-2.19h-15.2v16h12.76A25.08,25.08,0,0,0,599.44,490.89Z" transform="translate(-9.57 -307.21)"/><path class="cls-2" d="M630.76,470l14.5,38.66L659.82,470h8.37v46H662.4V477.74h-.13L647.9,516h-5.22l-14.37-38.27h-.13V516h-5.8V470Z" transform="translate(-9.57 -307.21)"/><polygon class="cls-3" points="185.03 208.82 83.95 193.78 52.82 228.05 53.17 188.88 0 179.09 0 40.92 185.38 31.83 185.03 208.82"/><polygon class="cls-2" points="77.3 0 87.09 99.69 142.71 34.28 198.67 99.69 184.33 100.04 184.68 165.44 215.81 159.15 241.69 195.53 242.74 153.2 267.93 146.91 277.02 28.33 77.3 0"/><polygon class="cls-4" points="198.67 99.69 142.71 34.28 87.09 99.69 86.74 100.04 87.09 100.04 101.78 100.04 101.78 181.88 101.78 182.58 184.68 165.79 184.68 165.44 184.33 100.04 198.67 99.69"/><polygon class="cls-5" points="81.15 37.08 142.71 34.28 86.74 99.69 81.15 37.08"/></svg>')</script>
2411
2411<script>$("a.pb-vendor").attr("href","https://brivity.com/")</script>
2411
2411<script>$(document).ready(function(){if(window.location.href.indexOf('offers.buythegoodway.com/agent_offer')>-1){$('#premium-navigation .nav.navbar-nav.navbar-right').css('display','none');$('#slide-out .menu-toggle').css('display','none')} 2412if((window.location.href.indexOf('offers.buythegoodway.com')>-1)&&(window.location.href.indexOf('/agent_offer')===-1)){window.location.replace("https://offers.buythegoodway.com/agent_offer")}})</script>
2412
2412<script>document.querySelectorAll('.accordion-header').forEach(button=>{button.addEventListener('click',()=>{const accordionContent=button.nextElementSibling;button.classList.toggle('active');if(button.classList.contains('active')){accordionContent.style.maxHeight=accordionContent.scrollHeight+'px'}else{accordionContent.style.maxHeight=0} 2413document.querySelectorAll('.accordion-header').forEach(otherButton=>{if(otherButton!==button){otherButton.classList.remove('active');otherButton.nextElementSibling.style.maxHeight=0}})})});$(window).resize(function(){$.doTimeout('resize',250,function(){document.querySelectorAll('.accordion-header').forEach(button=>{button.addEventListener('click',()=>{const accordionContent=button.nextElementSibling;button.classList.toggle('active');if(button.classList.contains('active')){accordionContent.style.maxHeight=accordionContent.scrollHeight+'px'}else{accordionContent.style.maxHeight=0} 2414document.querySelectorAll('.accordion-header').forEach(otherButton=>{if(otherButton!==button){otherButton.classList.remove('active');otherButton.nextElementSibling.style.maxHeight=0}})})})})})</script>
2414</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.