PageSourceSearch

https://www.buythegoodway.com/myportal/collections

html buythegoodway.com collected 2026-09-29 00:22:52 UTC 167,033 bytes, 2,414 lines download raw bytes

1<!DOCTYPE html> <html lang="en"> <head><meta name="description" content=""> <meta charset="utf-8"> <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="msvalidate.01" content="52D8CD5F9EA2B1031F2D2472023A5D34"> <title>MyPortal | 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&nbsp;</span> </a> <a class="topLink flex aiCenter thin saveSearchTop" href="/myportal/searches"> <svg width="16" height="16" viewBox="0 4 20 17" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M19 21L12 16L5 21V5C5 4.46957 5.21071 3.96086 5.58579 3.58579C5.96086 3.21071 6.46957 3 7 3H17C17.5304 3 18.0391 3.21071 18.4142 3.58579C18.7893 3.96086 19 4.46957 19 5V21Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" /> </svg> <span class="ml6 topLabel">Saved Searches&nbsp;</span> </a> <a class="topLink flex aiCenter thin market-report-top" style="display:none" href="/myportal/reports"> <svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M7.70589 13.1667C10.6514 13.1667 13.0392 10.7789 13.0392 7.83333C13.0392 4.88781 10.6514 2.5 7.70589 2.5C4.76037 2.5 2.37256 4.88781 2.37256 7.83333C2.37256 10.7789 4.76037 13.1667 7.70589 13.1667Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M14.3725 14.5L11.4725 11.6" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> <span class="ml6 topLabel">My Reports&nbsp;</span> </a> <a class="aiCenter flex topBarProfile thin" href="/myportal/profile"> <span class="profileName"></span> </a> <a style="padding-right: 0px" class="aiCenter flex thin" id="topBarLogout" href="javascript:void()"> <svg width="23" height="23" viewBox="0 0 23 23" fill="none" xmlns="http://www.w3.org/2000/svg"> <g clip-path="url(#clip0_16761_179186)"> <path d="M16.4003 16.214C19.0038 13.6106 19.0038 9.38945 16.4003 6.78595C13.7968 4.18246 9.57572 4.18246 6.97222 6.78595C4.36873 9.38945 4.36873 13.6105 6.97222 16.214C9.57572 18.8175 13.7968 18.8175 16.4003 16.214Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M9.80066 9.61438L13.5719 13.3856" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M9.80066 13.3856L13.5719 9.61438" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </g> <defs> <clipPath id="clip0_16761_179186"> <rect width="16" height="16" fill="white" transform="translate(0.372559 11.5) rotate(-45)"/> </clipPath> </defs> </svg> <span class="ml6">Log Out</span> </a> </div> </div> </div> <div id="not-logged-in"> <topbar_agent_info_not_logged_in/> <ul class="list-unstyled list-inline no-margin"> <li class="topBarSignin"><a href="#" onclick="showGoogleOneTap(true);"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-plus-circle mr10"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="16"></line>
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&amp;price=1000000:&amp;propertyType=Residential%7CMulti-Family%7CCondo/Townhome%7CVacant+Land%7CFarm/Ranch&amp;status=1&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState&amp;propertyType=Residential%7CMulti-Family%7CCondo/Townhome&amp;status=1&amp;mlsId=17%7C33&amp;price=10000:&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState&amp;propertyType=Residential%7CMulti-Family%7CCondo/Townhome&amp;status=1&amp;mlsId=17%7C33&amp;price=10000:&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState&amp;propertyType=Residential%7CMulti-Family%7CCondo/Townhome&amp;status=1&amp;mlsId=17%7C33&amp;price=10000:&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState&amp;propertyType=Residential%7CMulti-Family%7CCondo/Townhome&amp;status=1&amp;mlsId=17%7C33&amp;price=10000:&amp;q_sort=createdAt-&amp;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&amp;price=10000:&amp;multi_search=The%20Colony,%20TX&amp;multi_cat=CityState&amp;propertyType=Residential%7CMulti-Family%7CCondo/Townhome&amp;status=1&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState&amp;propertyType=Residential%7CMulti-Family%7CCondo/Townhome&amp;status=1&amp;mlsId=17%7C33&amp;price=10000:&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState&amp;propertyType=Residential%7CMulti-Family%7CCondo/Townhome&amp;status=1&amp;mlsId=17%7C33&amp;price=10000:&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState&amp;propertyType=Residential%7CMulti-Family%7CCondo/Townhome&amp;status=1&amp;mlsId=17%7C33&amp;price=10000:&amp;q_sort=createdAt-&amp;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&amp;mlsId=17,33%7C95%7C630%7C380%7C161%7C646&amp;price=1000000:&amp;propertyType=Residential%7CMulti-Family%7CCondo/Townhome%7CVacant+Land%7CFarm/Ranch&amp;status=1&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState&amp;propertyType=Residential|Multi-Family|Condo/Townhome|Vacant+Land|Farm/Ranch&amp;status=1&amp;mlsId=17|33&amp;price=10000:&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState&amp;propertyType=Residential|Multi-Family|Condo/Townhome|Vacant+Land|Farm/Ranch&amp;status=1&amp;mlsId=17|33&amp;price=10000:&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState&amp;propertyType=Residential|Multi-Family|Condo/Townhome|Vacant+Land|Farm/Ranch&amp;status=1&amp;mlsId=17|33&amp;price=10000:&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState&amp;propertyType=Residential|Multi-Family|Condo/Townhome|Vacant+Land|Farm/Ranch&amp;status=1&amp;mlsId=17|33&amp;price=10000:&amp;q_sort=createdAt-&amp;q_offset=0">FRISCO</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search&amp;mlsId=17|33&amp;price=10000:&amp;multi_search=The%20Colony,%20TX&amp;multi_cat=CityState&amp;propertyType=Residential|Multi-Family|Condo/Townhome|Vacant+Land|Farm/Ranch&amp;status=1&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState&amp;propertyType=Residential|Multi-Family|Condo/Townhome|Vacant+Land|Farm/Ranch&amp;status=1&amp;mlsId=17|33&amp;price=10000:&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState&amp;propertyType=Residential|Multi-Family|Condo/Townhome|Vacant+Land|Farm/Ranch&amp;status=1&amp;mlsId=17|33&amp;price=10000:&amp;q_sort=createdAt-&amp;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&amp;multi_cat=CityState&amp;propertyType=Residential|Multi-Family|Condo/Townhome|Vacant+Land|Farm/Ranch&amp;status=1&amp;mlsId=17|33&amp;price=10000:&amp;q_sort=createdAt-&amp;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 &amp; Terms of Service</a></li> <li><a id='sitemapUrl' href='/sitemap' style='display: inline;'>Sitemap</a></li> </ul> </div> </section> <input type="hidden" id="hchatbot_settings" data-chatbot-version="1" value="{&quot;chat_position&quot;:&quot;right&quot;,&quot;call_to_action_text&quot;:&quot;Hi there! Please let us know if you have any questions and an agent will reach out to you as soon as possible.&quot;,&quot;initial_message&quot;:&quot;Enter your question below and an agent will be in touch with you.&quot;,&quot;tags&quot;:&quot;IDX Chat&quot;,&quot;version&quot;:&quot;1&quot;}">
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">&times;</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 &amp; 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">&times;</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.