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 Bergamini Group | Keller Williams Arizona Realty | PLACE","url":"https:\/\/www.thebergaminigroup.com","image":"https:\/\/cdn1.brivityidx.com\/assets\/images\/agent-photos\/1\/3\/8\/13838992\/Bergamini_New_Combo.png","telephone":"+19282274899","address":{"@type":"PostalAddress","streetAddress":"3767 Karicio Lane","addressLocality":"Prescott","addressRegion":"AZ","postalCode":"86303","addressCountry":"US"},"sameAs":["https:\/\/www.facebook.com\/prescottazrealty","https:\/\/www.instagram.com\/thebergaminigroup\/"]}</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/106226/favicon.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.thebergaminigroup.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/2/2/0/22064/site_custom.css?v=1789579267" rel="stylesheet">
204<script type="text/javascript" src="https://cdn1.brivityidx.com/idx-sites/2/2/0/22064/global_js_variables.js?v=1789579267"></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="p:domain_verify" content="b4e6cdeec8de4432dab132326e345827"/>
204<script>
vendor: 395 bytes, lines 204-210
204 205!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod? 206n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n; 207n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0; 208t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window, 209document,'script','https://connect.facebook.net/en_US/fbevents.js'); 210fbq('init', "
210985247084993829
vendor: 30 bytes, lines 210-211
210"); 211fbq('track', 'PageView');
212var propDetailsPixelOnReady = function(){ 213 let propDetFpst = new FbRealEstatePixelTracker({"eventType": "ViewContent", "content_ids": [""]}); 214 propDetFpst.fireEvent(); 215}; 216if (document.readyState === "complete" || (document.readyState !== "loading" && !document.documentElement.doScroll)) { 217 propDetailsPixelOnReady(); 218} else { 219 document.addEventListener("DOMContentLoaded", propDetailsPixelOnReady); 220} 221 222console.log('facebook pixel PageView tracking...'); 223</script>
223 <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=985247084993829&ev=PageView&noscript=1"></noscript>
223<script>
vendor: 327 bytes, lines 223-227
223(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 224new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 225j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 226'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 227})(window,document,'script','dataLayer','
227GTM-5PHKR95S
vendor: 3 bytes, line 227
227');
227</script>
vendor: 64 bytes, line 227
227 <script async src="https://www.googletagmanager.com/gtag/js?id=
227AW-1005314267
vendor: 13 bytes, lines 227-228
227"> 228</script>
228<script> 229
vendor: 134 bytes, lines 229-233
229window.dataLayer = window.dataLayer || []; 230 function gtag(){dataLayer.push(arguments);} 231 gtag('js', new Date()); 232 233 gtag('config', '
233AW-1005314267
vendor: 4 bytes, line 233
233');
234</script>
234<meta property="og:url" content="https://www.thebergaminigroup.com/myportal/collections"> <meta property="og:image" content="http://images.brivityidx.com/assets/images/uploads/106226/Bergamini_New_Thumbnail.jpg"> <meta property="og:image:secure_url" content="https://images.brivityidx.com/assets/images/uploads/106226/Bergamini_New_Thumbnail.jpg"> <meta property="og:description" content=""> <meta property="og:title" content="MyPortal | Collections"> </head> <body>
vendor: 68 bytes, line 234
234 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
234GTM-5PHKR95S
vendor: 83 bytes, line 234
234" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
234<script> 235 window.fbAsyncInit = function() { 236 FB.init({ 237 appId : '1', 238 cookie : true, 239 xfbml : true, 240 version : 'v17.0' 241 }); 242 FB.AppEvents.logPageView(); 243 }; 244 245 setTimeout(() => {(function(d, s, id){ 246 var js, fjs = d.getElementsByTagName(s)[0]; 247 if (d.getElementById(id)) {return;} 248 js = d.createElement(s); js.id = id; 249 js.defer = true; 250 js.xfbml = false; 251 js.src = "//connect.facebook.net/en_US/sdk.js"; 252 fjs.parentNode.insertBefore(js, fjs); 253 }(document, 'script', 'facebook-jssdk'))}, 5000); 254 </script>
254<meta property="fb:app_id" content="1"><meta name="google-signin-client_id" content="1"><meta name="apple-signin-flag" content="1"><meta name="main_sitebuilder_domain" content="https://sitebuilder.brivity.com"> <div id="site-registration-bar" class="collapse"> <input type="hidden" id="huser_id" value=""> <div class="row" style="width: 100%; margin: 0;"> <div class="col-md-12" style="display: none;" id="logged-in"> <div class="topBar flex aiCenter jcBetween"> <div class="topBarLeft flex aiCenter"> <span><topbar_show_agent_name/></span> </div> <div class="topBarRight flex aiCenter"> <a class="topLink flex aiCenter thin favoritesTop" href="/myportal/collections"> <svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg"> <g clip-path="url(#clip0_16761_179132)"> <path d="M14.2659 3.57333C13.9254 3.23267 13.5211 2.96243 13.0761 2.77806C12.6312 2.59368 12.1542 2.49878 11.6726 2.49878C11.1909 2.49878 10.714 2.59368 10.269 2.77806C9.82401 2.96243 9.41973 3.23267 9.07922 3.57333L8.37256 4.28L7.66589 3.57333C6.97809 2.88554 6.04524 2.49914 5.07256 2.49914C4.09987 2.49914 3.16702 2.88554 2.47922 3.57333C1.79143 4.26113 1.40503 5.19398 1.40503 6.16667C1.40503 7.13936 1.79143 8.07221 2.47922 8.76L3.18589 9.46667L8.37256 14.6533L13.5592 9.46667L14.2659 8.76C14.6066 8.4195 14.8768 8.01521 15.0612 7.57024C15.2455 7.12526 15.3404 6.64832 15.3404 6.16667C15.3404 5.68501 15.2455 5.20807 15.0612 4.7631C14.8768 4.31812 14.6066 3.91384 14.2659 3.57333V3.57333Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </g> <defs> <clipPath id="clip0_16761_179132"> <rect width="16" height="16" fill="white" transform="translate(0.372559 0.5)"/> </clipPath> </defs> </svg> <span class="ml6 topLabel">Collections </span> </a> <a class="topLink flex aiCenter thin saveSearchTop" href="/myportal/searches"> <svg width="16" height="16" viewBox="0 4 20 17" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M19 21L12 16L5 21V5C5 4.46957 5.21071 3.96086 5.58579 3.58579C5.96086 3.21071 6.46957 3 7 3H17C17.5304 3 18.0391 3.21071 18.4142 3.58579C18.7893 3.96086 19 4.46957 19 5V21Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" /> </svg> <span class="ml6 topLabel">Saved Searches </span> </a> <a class="topLink flex aiCenter thin market-report-top" style="display:none" href="/myportal/reports"> <svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M7.70589 13.1667C10.6514 13.1667 13.0392 10.7789 13.0392 7.83333C13.0392 4.88781 10.6514 2.5 7.70589 2.5C4.76037 2.5 2.37256 4.88781 2.37256 7.83333C2.37256 10.7789 4.76037 13.1667 7.70589 13.1667Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M14.3725 14.5L11.4725 11.6" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </svg> <span class="ml6 topLabel">My Reports </span> </a> <a class="aiCenter flex topBarProfile thin" href="/myportal/profile"> <span class="profileName"></span> </a> <a style="padding-right: 0px" class="aiCenter flex thin" id="topBarLogout" href="javascript:void()"> <svg width="23" height="23" viewBox="0 0 23 23" fill="none" xmlns="http://www.w3.org/2000/svg"> <g clip-path="url(#clip0_16761_179186)"> <path d="M16.4003 16.214C19.0038 13.6106 19.0038 9.38945 16.4003 6.78595C13.7968 4.18246 9.57572 4.18246 6.97222 6.78595C4.36873 9.38945 4.36873 13.6105 6.97222 16.214C9.57572 18.8175 13.7968 18.8175 16.4003 16.214Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M9.80066 9.61438L13.5719 13.3856" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> <path d="M9.80066 13.3856L13.5719 9.61438" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> </g> <defs> <clipPath id="clip0_16761_179186"> <rect width="16" height="16" fill="white" transform="translate(0.372559 11.5) rotate(-45)"/> </clipPath> </defs> </svg> <span class="ml6">Log Out</span> </a> </div> </div> </div> <div id="not-logged-in"> <topbar_agent_info_not_logged_in/> <ul class="list-unstyled list-inline no-margin"> <li class="topBarSignin"><a href="#" onclick="showGoogleOneTap(true);"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-plus-circle mr10"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="16"></line>
254<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"
254class="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/agent-photos/1/3/8/13838992/Bergamini_New_Combo.png" alt="Logo" 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" data-selector="li" style="outline: none; cursor: inherit;"> <a class="nav-link-color" href="/search" style="outline: none; cursor: inherit;">SEARCH LISTINGS</a> </li> <li class="nav-item" data-selector="li" style="outline: none; cursor: inherit;"> <a class="nav-link-color" href="/homevalue" style="outline: none; cursor: inherit;">Home Value</a> </li> <li class="nav-item dropdown" data-selector="li" style="outline: none; cursor: inherit;"> <a class="dropdown-toggle sec-nav-link-color" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false" href="/top_areas" aria-expanded="false">Areas We Serve<i class="fa fa-angle-down" data-selector=".fa" style="outline: none; cursor: inherit;"></i></a> <ul class="dropdown-menu"> <li class="sec-nav-drop-color" data-selector="li" style="outline: none; cursor: inherit;"> <a class="sec-nav-drop-link-color" href="/search?multi_search=Prescott,%20AZ&multi_cat=CityState&propertyType=Condo/Townhome%7CMulti-Family%7CResidential&status=1#?q_limit=200&mlsId=21%7C250%7C248%7C245&price=10000:&multi_search=Prescott,%20AZ&multi_cat=CityState&propertyType=Condo/Townhome%7CMulti-Family%7CResidential&status=1&q_sort=createdAt-&q_offset=0"> PRESCOTT AREA</a> </li> <li class="sec-nav-drop-color" data-selector="li" style="outline: none; cursor: inherit;"> <a class="sec-nav-drop-link-color" href="/search?multi_search=Sedona,%20AZ&multi_cat=CityState&propertyType=Condo/Townhome%7CMulti-Family%7CResidential&status=1#?q_limit=200&mlsId=21%7C250%7C248%7C245&price=10000:&multi_search=Sedona,%20AZ&multi_cat=CityState&propertyType=Condo/Townhome%7CMulti-Family%7CResidential&status=1&q_sort=createdAt-&q_offset=0"> SEDONA/VERDE VALLEY</a> </li> <li class="sec-nav-drop-color" data-selector="li" style="outline: none; cursor: inherit;"> <a class="sec-nav-drop-link-color" href="/search?multi_search=Flagstaff,%20AZ&multi_cat=CityState&propertyType=Condo/Townhome%7CMulti-Family%7CResidential&status=1#?q_limit=200&mlsId=21%7C250%7C248%7C245&price=10000:&multi_search=Flagstaff,%20AZ&multi_cat=CityState&propertyType=Condo/Townhome%7CMulti-Family%7CResidential&status=1&q_sort=createdAt-&q_offset=0"> FLAGSTAFF AREA</a> </li> <li class="sec-nav-drop-color" data-selector="li" style="outline: none; cursor: inherit;"> <a class="sec-nav-drop-link-color" href="/search?multi_search=Phoenix,%20AZ&multi_cat=CityState&propertyType=Condo/Townhome%7CMulti-Family%7CResidential&status=1#?q_limit=200&
254mlsId=21%7C250%7C248%7C245&price=10000:&multi_search=Phoenix,%20AZ&multi_cat=CityState&propertyType=Condo/Townhome%7CMulti-Family%7CResidential&status=1&q_sort=createdAt-&q_offset=0"> PHOENIX METRO</a> </li> <li class="sec-nav-drop-color" data-selector="li" style="outline: none; cursor: inherit;"> <a class="sec-nav-drop-link-color" href="/search?multi_search=Yuma,%20AZ&multi_cat=CountyState&propertyType=Condo/Townhome%7CMulti-Family%7CResidential%7CVacant%20Land&status=1#?q_limit=200&mlsId=21%7C250%7C248%7C245%7C647&price=10000:&multi_search=Yuma,%20AZ&multi_cat=CountyState&propertyType=Condo/Townhome%7CMulti-Family%7CResidential%7CVacant%20Land&status=1&q_sort=createdAt-&q_offset=0"> YUMA COUNTY</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;">BUY</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="/selling">SELLING<i class="fa fa-angle-down"></i></a><ul class="dropdown-menu"><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/sell">SELL</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/cashoffer">CASH OFFER</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;">FINANCE</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"><a class="sec-nav-link-color" href="/search">SEARCH LISTINGS</a></li><li class="nav-item"><a class="sec-nav-link-color" href="/buying">BUYING</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">SELLING<i class="fa fa-angle-down"></i></a><ul class="dropdown-menu"><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/sell">SELL</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/cashoffer">CASH OFFER</a></li></ul><li class="nav-item dropdown"><a class="dropdown-toggle sec-nav-link-color" data-toggle="dropdown" data-hover="dropdown" data-delay="0" data-close-others="false">Areas We Serve<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=Prescott,%20AZ&multi_cat=CityState&propertyType=Condo/Townhome|Multi-Family|Residential&status=1&mlsId=21|250|248|245&price=10000:&q_sort=createdAt-&q_offset=0">PRESCOTT AREA</a></li><li class="sec-nav-drop-color">
254<a class="sec-nav-drop-link-color" href="/search?multi_search=Sedona,%20AZ&multi_cat=CityState&propertyType=Condo/Townhome|Multi-Family|Residential&status=1&mlsId=21|250|248|245&price=10000:&q_sort=createdAt-&q_offset=0">SEDONA/VERDE VALLEY</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search?multi_search=Flagstaff,%20AZ&multi_cat=CityState&propertyType=Condo/Townhome|Multi-Family|Residential&status=1&mlsId=21|250|248|245&price=10000:&q_sort=createdAt-&q_offset=0">FLAGSTAFF AREA</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search?multi_search=Phoenix,%20AZ&multi_cat=CityState&propertyType=Condo/Townhome|Multi-Family|Residential&status=1&mlsId=21|250|248|245&price=10000:&q_sort=createdAt-&q_offset=0">PHOENIX METRO</a></li><li class="sec-nav-drop-color"><a class="sec-nav-drop-link-color" href="/search?multi_search=Yuma,%20AZ&multi_cat=CityState&propertyType=Condo/Townhome|Multi-Family|Residential&status=1&mlsId=21|250|248|245&price=10000:&q_sort=createdAt-&q_offset=0">YUMA COUNTY</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="/realestateagent/search">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="/careers">CAREERS</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><li class="nav-item"><a class="sec-nav-link-color" href="/featured-properties">Featured Properties</a></li><li class="nav-item"><a class="sec-nav-link-color" href="/developer-homes">Developer Homes</a></li><li class="nav-item"><a class="sec-nav-link-color" href="/blog">blog</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="" 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="" 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="" 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/agent-photos/1/3/8/13838992/Bergamini_New_Combo.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> 255 256 .center-modal { 257 display:flex; 258 justify-content: center; 259 align-items:center; 260 position:fixed; 261 background-color:rgba(0,0,0,0.4); 262 left:0; 263 top:0; 264 right:0; 265 bottom:0; 266 z-index: 300; 267 } 268 269 .page-width-parent{ 270 max-width: 1280px; 271 margin: 0 auto; 272 } 273 274 275 .property-list-map-view { 276 display:flex; 277 flex-wrap:wrap; 278 gap:16px; 279 } 280 .property-list-map-view-parent { 281 background-color: #F9F9F9; 282 padding:16px; 283 height:710px; 284 overflow:scroll; 285 } 286 287 .property-list-list-view { 288 display:flex; 289 flex-wrap:wrap; 290 gap:24px 291 } 292 293 .property-container { 294 295 gap:24px; 296 } 297 298 .property-map-container { 299 flex:1; 300 height:710px; 301 } 302 303 .property-pagination { 304 margin-top: 26px; 305 } 306 307 .collection-saved-listings { 308 margin-bottom: 26px; 309 font-size:16px; 310 color:black; 311 } 312 313 .collection-description { 314 padding: 20px 0 18px 8px; 315 } 316 317 .my-feed-parent { 318 margin-top:32px; 319 padding-top:32px; 320 border-top: solid 1px #C4C4C4; 321 } 322 323 .collection-description-text { 324 font-size:16px; 325 margin:0; 326 color:black; 327 } 328 329 #collections { 330 display:flex; 331 flex-wrap:wrap; 332 gap:40px 24px; 333 } 334
335 #collection-pagination{ 336 margin-top: 55px 337 } 338 339 #add-listing-btn{ 340 margin-bottom: 20px 341 } 342 343 @media only screen and (min-width: 1280px) { 344 .collection-page { 345 padding:48px 48px 48px 120px; 346 } 347 .my-feed-parent { 348 width:90vw; 349 max-width: 100%; 350 overflow: hidden; 351 } 352 .property-list-map-view-parent { 353 width:500px; 354 } 355 .property-container { 356 display:flex; 357 } 358 } 359 360 @media only screen and (max-width:1280px) { 361 .collection-page { 362 padding:60px 16px 16px 16px; 363 } 364 .my-feed-parent { 365 width: unset; 366 } 367 .property-container { 368 display:flex; 369 flex-direction: column-reverse; 370 } 371 .property-list-map-view { 372 flex-wrap:nowrap; 373 overflow:scroll; 374 height:280px; 375 } 376 .property-list-map-view-parent { 377 height:unset; 378 padding:0px; 379 background-color: #FFFFFF 380 } 381 .property-map-container { 382 flex:none; 383 height:446px; 384 } 385 } 386 387 @media only screen and (max-width:768px) { 388 #collections { 389 justify-content: center; 390 } 391 .property-map-container { 392 width: calc(100% + 32px); 393 margin-left: -16px; 394 } 395 .property-list-map-view { 396 height:250px; 397 } 398 } 399 400</style>
400<script> 401 window.addEventListener("load", () => { 402 const key = localStorage.getItem('authorization'); 403 404 if( !key) { 405 $("#sign-up-modal").modal('show'); 406 407 $("#sign-up-modal").on("hidden.bs.modal", function () { 408 location.reload(); 409 }); 410 } 411 else{ 412 413 let myPortalPage = document.getElementById('myportal-page'); 414 myPortalPage.style.display = "block"; 415 416 window.location.hash = "" 417 418 function isGuid(value) { 419 var regex = /[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}/i; 420 var match = regex.exec(value); 421 return match != null; 422 } 423 424 let lastUrlItem = window.location.href.substring(window.location.href.lastIndexOf('/') + 1) 425 let showCollectionByUUID = false 426 427 if (isGuid(lastUrlItem)) { 428 showCollectionByUUID = true 429 } 430 431 432 class logger extends Collections.BaseLogger { 433 log(e) { 434 console.log(e); 435 } 436 } 437 438 439 class Pubsub { 440 static events = {}; 441 constructor() { 442 //this.events = {}; 443 } 444 445 static subscription (eventName, func) { 446 return { 447 subscribe: () => { 448 if (this.events[eventName]) { 449 this.events[eventName].push(func); 450 } else { 451 this.events[eventName] = [func]; 452 } 453 }, 454 unsubscribe: () => { 455 if(this.events[eventName]){ 456 this.events[eventName] = this.events[eventName].filter((subscriber) => subscriber !== func); 457 } 458 } 459 } 460 } 461 462 static publish(eventName, ...args) { 463 const funcs = this.events[eventName]; 464 if (Array.isArray(funcs)) { 465 funcs.forEach((func) => { 466 func.apply(null, args); 467 }); 468 } 469 } 470 } 471 472 class CollectionCard { 473 constructor(collection, count){ 474 475 this.element = document.createElement(`place-collectioncard`); 476 this.collection = collection 477 let _this = this; 478 let menuOpen = false; 479 var images = []; 480 481 for (let i = 0; i < collection?.propertiesImages?.length; i++) { 482 images.push(collection.propertiesImages[i].mainPhoto); 483 } 484 485 this.element.setAttribute("appearance", "regular"); 486 this.element.setAttribute("image", images); 487 this.element.setAttribute("num_properties", collection?.totalListings ?? 0) 488 this.element.setAttribute("title", collection.collectionName); 489 this.element.setAttribute("description", collection.collectionDescription ? collection.collectionDescription : collection.description ? collection.description : ""); 490 this.element.setAttribute("creator", ""); 491 this.element.setAttribute("disable_dropdown", "false"); 492 this.element.setAttribute("style", "height: 254px"); 493 this.element.setAttribute('z_index', count); 494 this.element.setAttribute("show_menu", "false"); 495 this.element.setAttribute("id", collection.collectionUUID); 496 this.element.setAttribute("container_styles", "w-[300px]"); 497 498 const collectionUUID = collection.collectionUUID; 499 500 this.element.addEventListener(`on_menu_item_pressed`, (e) => { 501 let menuItem = e.detail 502 Pubsub.publish('collection_card_menu_item_pressed', {collection,menuItem}); 503 }); 504 505 this.element.addEventListener('on_search_pressed', (e) => { 506 if (e.target.tagName != "svg" && e.target.tagName != "path") { 507 window.open('../../search.php', '_blank'); 508 e.stopPropagation(); 509 } 510 }); 511 512 this.element.addEventListener(`click`, (e) => { 513 if (e.target.tagName != "svg" && e.target.tagName != "path" && !menuOpen) { 514 Pubsub.publish('collection_card_pressed', {collection:_this.collection,e}); 515 e.stopPropagation(); 516 } 517 }); 518 519 this.element.addEventListener(`on_menu_open`, (e) => { 520 if (this.element.getAttribute("title") === "Favorites") { 521 this.element.setAttribute("disable_menu", "true"); 522 } 523 524 menuOpen = e.detail; 525 this.element.setAttribute("show_menu", menuOpen); 526 }); 527 } 528 } 529 530 class CollectionSection { 531 532 533 collectionSection = document.getElementById('collection-section') 534 collections = document.getElementById('collections') 535 536 addCollectionCard = (collection, count) => { 537 const collectionCard = new CollectionCard(collection, count); 538 539 540 541 542 this.collections.append(collectionCard.element); 543 544 } 545 546 show = () => { 547 this.collectionSection.style.display = 'block' 548 } 549 550 hide = () => { 551 this.collectionSection.style.display = 'none' 552 } 553 } 554 555 class PropertyCard { 556 constructor(collectionUUID,property){ 557 558 let _this = this; 559 this.element = document.createElement(`place-propertycard`); 560 let menuOpen = false;
561 this.property = property; 562 563 this.element.setAttribute("id", property.blossorId) 564 this.element.setAttribute("display_menu", "true"); 565 this.element.setAttribute("show_menu", "false"); 566 this.element.setAttribute("items", '[{"icon":"share-2","text":"Share Property"},{"icon":"layers","text":"Copy to Collection"},{"icon":"trash","text":"Remove from Collection"}]'); 567 568 this.element.setAttribute('appearance','small') 569 this.element.setAttribute('layout_width', '300') 570 this.element.setAttribute('display_tag', 'true') 571 this.element.setAttribute('display_favorite', 'true') 572 this.element.setAttribute('mls',`{ 573 "status":"${property.statusText}", 574 "favorite":"true", 575 "image":[{"uri":"${property?.photos[0]?.url}"}], 576 "price":"${property?.price}", 577 "address":"${property?.address?.street}", 578 "state":"${property?.address?.state}", 579 "city":"${property?.address?.city}", 580 "postalCode":"${property?.address?.zip}", 581 "beds":"${property?.bedrooms}", 582 "baths":"${property?.totalBaths}", 583 "sqft":"${property?.sqFeet}" 584 }`) 585 this.element.setAttribute('on_hover', 'true') 586 587 this.element.addEventListener('mouseenter', (e) => { 588 Pubsub.publish('property_card_mouseenter', property); 589 }) 590 591 this.element.addEventListener('mouseleave', (e) => { 592 Pubsub.publish('property_card_mouseleave', property); 593 }) 594 595 this.element.addEventListener(`on_menu_item_pressed`, (e) => { 596 let menuItem = e.detail 597 let propertyCollectionUUID = property.propertyCollectionUUID 598 let url = this.getPropertyUrl(this.property); 599 property.searchUrl = url; 600 Pubsub.publish('property_card_menu_item_pressed', {property,collectionUUID,propertyCollectionUUID,menuItem, url}); 601 }); 602 603 this.element.addEventListener(`on_menu_open`, (e) => { 604 menuOpen = e.detail; 605 this.element.setAttribute("show_menu", menuOpen); 606 }); 607 608 this.element.addEventListener('click', (e) => { 609 if (e.target.tagName != "svg" && e.target.tagName != "path" && !menuOpen) { 610 let state = _this.property.address.state; 611 let city = _this.slugify(_this.property.address.city); 612 let zip = _this.property.address.zip 613 let address = _this.slugify(_this.property.address.street); 614 let blossorId = _this.property.blossorId; 615 let url = this.getPropertyUrl(property); 616 window.open(`../../${url}`, '_blank'); 617 } 618 }); 619 620 this.element.addEventListener('on_favorite_press', (e) => { 621 let propertyCollectionUUID = property.propertyCollectionUUID; 622 Pubsub.publish('delete_property_modal_pressed', {collectionUUID, propertyCollectionUUID}); 623 }); 624 625 } 626 627 getPropertyUrl = (property) => { 628 let state = property.address.state; 629 let city = this.slugify(property.address.city); 630 let zip = property.address.zip 631 let address = this.slugify(property.address.street); 632 let blossorId = property.blossorId; 633 return `homes-for-sale/${state}/${city}/${zip}/${address}/bid-${blossorId}`; 634 } 635 636 slugify(text) { 637 // replace non letter or digits by - 638 text = text.replace(/[^\pL\d]+~u/g, '_'); 639 // transliterate 640 text = text.normalize('NFKD').replace(/[\u0300-\u036F]/g,'') 641 // remove unwanted characters 642 text = text.replace(/[^_\w]+/g, '_'); 643 // trim 644 text = text.trim(); 645 // remove duplicate - 646 text = text.replace(/_+/g, '-'); 647 // lowercase 648 text = text.toLowerCase(); 649 if (!text) { 650 return 'n-a'; 651 } 652 return text 653 } 654 } 655 656 let dateNow = new Date(); 657 dateNow.setDate(dateNow.getDate()-7); 658 dateNow.setHours(dateNow.getHours()); 659 dateNow.setMinutes(dateNow.getMinutes()); 660 dateNow.setSeconds(dateNow.getSeconds()); 661 const sevenDaysAgo = dateNow.getTime(); 662 663 class PropertySection { 664 propertySection = document.getElementById('property-section') 665 listIcon = document.getElementById('property-list-icon') 666 mapIcon = document.getElementById('property-map-icon') 667 propertyHeader = document.getElementById('property-header') 668 propertyList = document.getElementById("property-list") 669 propertyListParent = document.getElementById("property-list-parent") 670 propertyMap = document.getElementById('property-map') 671 selectedView = 'map' 672 673 collectionProperties = [] 674 675 properties = [] 676 677 678 constructor() { 679 this.listIcon.addEventListener('click', () => { 680 this.setView('list') 681 }) 682 683 this.mapIcon.addEventListener('click', () => { 684 this.setView('map') 685 }) 686 } 687 688 show = (collectionUUID, collectionProperties) => { 689 this.propertySection.style.display = 'block' 690 this.collectionProperties = collectionProperties 691 this.collectionUUID = collectionUUID 692 693 this.propertyList.innerHTML = '' 694 count = 100; 695 696 this.collectionProperties?.data?.properties?.forEach((property) => { 697 count-- 698 this.addPropertyCard(property,collectionUUID, count) 699 }); 700 } 701 702 hide = () => { 703 this.propertySection.style.display = 'none' 704 } 705 706 setPropertyCardWidth = () => { 707 let width; 708 let imageHeight; 709 let windowWidth = window.innerWidth 710 if(this.selectedView == 'map') { 711 if(windowWidth > 1279) { 712 width = `220`; 713 imageHeight = `154`; 714 } else if(windowWidth > 768) { 715 width = `325`; 716 imageHeight = `184`; 717 } else{ 718 width = `244`; 719 imageHeight = `154`; 720 } 721 } 722 else { 723 if(windowWidth > 1440 ){ 724 width = `300`; 725 imageHeight = `184`; 726 } 727 else if(windowWidth > 1279) { 728 width = `260`; 729 imageHeight = `152`; 730 } else if(windowWidth > 768) { 731 width = `218`; 732 imageHeight = `152`; 733 } else{ 734 width = `288`; 735 imageHeight = `184`; 736 } 737 } 738 739 let propertyCards = document.querySelectorAll('place-propertycard') 740 propertyCards.forEach((propertyCard) => { 741 propertyCard.setAttribute('layout_width', width) 742 propertyCard.setAttribute('image_height', imageHeight) 743 }) 744 } 745
746 setView = (view) => { 747 this.selectedView = view 748 if (view == 'list') { 749 this.listIcon.setAttribute('stroke', 'black') 750 this.mapIcon.setAttribute('stroke', 'gray') 751 752 this.propertyMap.style.display = 'none' 753 this.propertyList.classList.add('property-list-list-view') 754 this.propertyList.classList.remove('property-list-map-view') 755 this.propertyListParent.classList.remove('property-list-map-view-parent') 756 757 Pubsub.publish('property_section_show_list_view', this.collectionProperties?.data?.properties); 758 } else { 759 this.listIcon.setAttribute('stroke', 'gray') 760 this.mapIcon.setAttribute('stroke', 'black') 761 762 this.propertyMap.style.display = 'block' 763 this.propertyList.classList.remove('property-list-list-view') 764 this.propertyList.classList.add('property-list-map-view') 765 this.propertyListParent.classList.add('property-list-map-view-parent') 766 767 Pubsub.publish('property_section_show_map_view', this.collectionProperties?.data?.properties); 768 } 769 770 this.setPropertyCardWidth(); 771 } 772 773 scrollIntoView = (id) => { 774 let propertyCard = document.getElementById(id); 775 propertyCard.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'start' }) 776 } 777 778 addPropertyCard = (property, collectionUUID, count) => { 779 780 var propertyCardWrapperElement = document.createElement(`div`) 781 propertyCardWrapperElement.setAttribute('style', `z-index:${count}`) 782 propertyCardWrapperElement.setAttribute('class', 'property-card-wrapper') 783 propertyCardWrapperElement.setAttribute("id", property.propertyCollectionUUID); 784 785 const propertyCard = new PropertyCard(collectionUUID,property); 786 var propertyCardElement = propertyCard.element; 787 788 propertyCardWrapperElement.append(propertyCardElement) 789 790 this.propertyList.append(propertyCardWrapperElement) 791 792 } 793 794 } 795 796 797 class PageSubHeader{ 798 constructor() { 799 800 this.element = document.querySelector('place-pagesubheader') 801 802 this.element.addEventListener('button_on_press', (e) => { 803 Pubsub.publish('create_new_collection_pressed', e) 804 }) 805 806 this.element.addEventListener('top_header_on_press', (e) => { 807 Pubsub.publish('top_header_back_pressed', e) 808 }) 809 810 this.element.addEventListener('on_menu_item_pressed', (e) => { 811 Pubsub.publish('top_header_menu_item_pressed', e.detail) 812 }) 813 814 this.element.addEventListener('secondary_button_on_press', (e) => { 815 window.open('../../search.php', '_blank') 816 }) 817 } 818 819 setTitle(title) { 820 this.element.setAttribute('title', title) 821 } 822 823 setTopHeaderTitle(title){ 824 this.element.setAttribute('top_header_title', title) 825 } 826 827 showTopHeader(){ 828 this.element.setAttribute('show_top_header', true) 829 } 830 831 hideTopHeader(){ 832 this.element.setAttribute('show_top_header', false) 833 } 834 835 showPrimaryButton() { 836 this.element.setAttribute('show_button', true) 837 } 838 839 hidePrimaryButton() { 840 this.element.setAttribute('show_button', false) 841 } 842 843 showSecondaryButton(){ 844 this.element.setAttribute('show_secondary_button', true) 845 } 846 847 hideSecondaryButton(){ 848 this.element.setAttribute('show_secondary_button', false) 849 } 850 851 showMenuButton() { 852 this.element.setAttribute('show_menu_button', true) 853 } 854 855 hideMenuButton() { 856 this.element.setAttribute('show_menu_button', false) 857 } 858 } 859 860 class CollectionModal { 861 862 constructor() { 863 864 let _this = this; 865 this.element = document.querySelector('place-collectionpopup'); 866 this.collectionUUID = 0; 867 868 this.element.addEventListener("on_close_press", (e) => { 869 _this.hide(); 870 }); 871 872 this.element.addEventListener("on_save_press", (e) => { 873 this.showError(false); 874 e.detail.collectionUUID = this.collectionUUID 875 e.detail.type = this.isEditingCollection ? 'edit' : 'save' 876 Pubsub.publish('on_new_collection_saved', e.detail); 877 }); 878 879 } 880 881 setName(name) { 882 this.element.setAttribute('name_value', name) 883 } 884 885 setDescription(description) { 886 this.element.setAttribute('description_value', description ? description : "") 887 } 888 889 showError(error) { 890 this.element.setAttribute('show_error', error) 891 } 892 893 show(collectionUUID, isEditingCollection) { 894 this.isEditingCollection = isEditingCollection; 895 if(collectionUUID){ 896 this.collectionUUID = collectionUUID; 897 } 898 this.element.setAttribute('style', 'display:flex') 899 } 900 901 hide() { 902 this.element.setAttribute('style', 'display:none'); 903 904 this.showError(false) 905 906 // terrible hack.. only way i could get it to respond to prop changes 907 // to clear the input fields after closing the modal 908 this.setName('none') 909 this.setDescription('none') 910 setTimeout(() => { 911 this.setName('') 912 this.setDescription('') 913 }, 100); 914 } 915 } 916 917 class CollectionCreatedModal { 918 constructor() { 919 920 921 this.collection = "" 922 this.element = document.getElementById('collection-created-modal'); 923 let _this = this; 924 925 this.element.addEventListener("on_primary_press", (e) => { 926 this.hide(); 927 window.location.href = '../../search.php' 928 }); 929 930 this.element.addEventListener("on_tertiary_press", (e) => { 931 _this.hide(); 932 Pubsub.publish('collection_created_modal_view_collection_pressed', _this.collection); 933 }); 934 935 this.element.addEventListener("on_close_press", (e) => { 936 _this.hide(); 937 }); 938 939 this.element.setAttribute("stacked_buttons", true) 940 this.element.setAttribute("primary_button_text", "Search Listings") 941 this.element.setAttribute("tertiary_button_text", "View Collection") 942 } 943 944 show(collection) { 945 if(collection){ 946 this.collection = collection; 947 } 948 this.element.setAttribute('style', 'display:flex') 949 } 950 951 hide() { 952 this.element.setAttribute('style', 'display:none'); 953 } 954 } 955 956 class EditCollectionModal { 957 constructor() { 958 959 960 this.collection = "" 961 this.element = document.getElementById('edit-collection-modal'); 962 let _this = this; 963 964 this.element.addEventListener("on_primary_press", (e) => { 965 _this.hide(); 966 967 }); 968 969 970 971 this.element.addEventListener("on_close_press", (e) => { 972 _this.hide(); 973 }); 974 } 975 976 show() { 977 978 this.element.setAttribute('style', 'display:flex') 979 } 980 981 hide() { 982 this.element.setAttribute('style', 'display:none'); 983 } 984 } 985 986 class DeleteCollectionModal { 987 constructor() { 988 989 990 this.collection = "" 991 this.element = document.getElementById('delete-collection-modal'); 992 let _this = this; 993 994 this.element.addEventListener("on_primary_press", (e) => { 995 _this.hide(); 996 Pubsub.publish('delete_collection_modal_delete_pressed', _this.collection); 997 }); 998 999 this.element.addEventListener("on_tertiary_press", (e) => { 1000 this.hide(); 1001 }); 1002 1003 this.element.addEventListener("on_close_press", (e) => { 1004 _this.hide(); 1005 }); 1006 } 1007 1008 show(collection) { 1009 if(collection){ 1010 this.collection = collection; 1011 } 1012 this.element.setAttribute('style', 'display:flex') 1013 } 1014 1015 hide() { 1016 this.element.setAttribute('style', 'display:none'); 1017 } 1018 } 1019 1020 class ShareSavedPropertyModal { 1021 constructor() { 1022 let _this = this; 1023 this.savedProperty = {} 1024 this.element = document.getElementById('share-saved-property-modal'); 1025 1026 this.element.addEventListener("on_primary_press", (e) => { 1027 1028 1029 1030 navigator.clipboard.writeText(this.link) 1031 _this.hide(); 1032 Pubsub.publish('share_saved_property_modal_share_pressed'); 1033 1034 }); 1035 1036 this.element.addEventListener("on_close_press", (e) => { 1037 _this.hide(); 1038 }); 1039 } 1040 1041 show = (savedProperty) => { 1042 1043 1044 this.savedProperty = savedProperty; 1045 1046 this.link = document.location.origin + "/" + this.savedProperty.searchUrl 1047 this.element.setAttribute('share_link_text', this.link) 1048 this.element.setAttribute('style', 'display:flex') 1049 } 1050 1051 hide = () => { 1052 this.element.setAttribute('style', 'display:none'); 1053 } 1054 } 1055 1056 class DeletePropertyModal { 1057 constructor() { 1058 1059 1060 this.collectionUUID = "" 1061 this.propertyCollectionUUID = "" 1062 this.element = document.getElementById('delete-property-modal'); 1063 let _this = this; 1064 1065 this.element.addEventListener("on_primary_press", (e) => { 1066 _this.hide(); 1067 Pubsub.publish('delete_property_modal_delete_pressed', {"collectionUUID":_this.collectionUUID, "propertyCollectionUUID":_this.propertyCollectionUUID}); 1068 }); 1069 1070 this.element.addEventListener("on_tertiary_press", (e) => { 1071 this.hide(); 1072 }); 1073 1074 this.element.addEventListener("on_close_press", (e) => { 1075 _this.hide(); 1076 }); 1077 } 1078 1079 show(collectionUUID, propertyCollectionUUID) { 1080 if(collectionUUID){ 1081 this.collectionUUID = collectionUUID; 1082 } 1083 if(propertyCollectionUUID){ 1084 this.propertyCollectionUUID = propertyCollectionUUID; 1085 } 1086 this.element.setAttribute('style', 'display:flex') 1087 } 1088 1089 hide() { 1090 this.element.setAttribute('style', 'display:none'); 1091 } 1092 } 1093 1094 class CopyPropertyToCollectionModal { 1095 constructor(){ 1096 1097 this.element = document.querySelector('place-copycollectionmodal'); 1098 this.collections = []; 1099 this.property = {} 1100 this.isVisible = false;
1101 1102 1103 1104 this.element.addEventListener('close_button', (e) => { 1105 this.hide(); 1106 }); 1107 1108 this.element.addEventListener('cancel_button', (e) => { 1109 this.hide(); 1110 }); 1111 1112 this.element.addEventListener('on_save', (e) => { 1113 Pubsub.publish('copy_property_to_collection_modal_save_pressed', {'collectionUUID':e.detail, 'property':this.property}); 1114 }); 1115 1116 this.element.addEventListener('set_selected_collection', (e) => { 1117 console.log('set_selected_collection', e) 1118 }); 1119 1120 this.element.addEventListener('on_link_press', (e) => { 1121 Pubsub.publish('show_new_collection_modal'); 1122 }); 1123 1124 } 1125 1126 getCollectionData(){ 1127 return JSON.parse(this.element.getAttribute("collections")); 1128 } 1129 1130 setCollectionData(collections){ 1131 this.element.setAttribute('collections', JSON.stringify(collections)) 1132 } 1133 1134 getCollectionList(collections, currentCollectionName) { 1135 let collectionList = []; 1136 collections.forEach(collection => { 1137 if (currentCollectionName && (collection.collectionName == currentCollectionName)) return; 1138 collectionList.push({ 1139 collection_title: collection.collectionName, 1140 id: collection.collectionUUID, 1141 propertiesImages: collection?.propertiesImages?.length > 0 ? collection?.propertiesImages : [], 1142 }) 1143 }); 1144 this.setCollectionData(collectionList); 1145 1146 } 1147 1148 setIsAddingToCollection(isAddingToCollection){ 1149 this.element.setAttribute('is_add_to_collection', isAddingToCollection); 1150 } 1151 1152 show(property) { 1153 1154 if(property){ 1155 this.property = property; 1156 } 1157 1158 this.isVisible = true; 1159 1160 let mls = { 1161 status: property?.status || property?.standardStatus || "", 1162 image: this.getPropertyImageUrl(property), 1163 price: property?.price || "0", 1164 address: ( typeof property?.address === "string") ? property?.address : (property?.address?.street || property?.streetAddress || ""), 1165 state: property?.state || property?.address?.state || "", 1166 city: property?.city || property?.address?.city || "", 1167 postal_code: property?.postal_code || property?.address?.zip || "", 1168 beds: property?.beds || property?.bedrooms || 0, 1169 baths: property?.baths || property?.fullBaths || property?.bathsTotalDecimal || 0, 1170 sqft: property?.sqft || property?.squareFeet || property?.sqFeet || 0, 1171 creator: property?.creator || "", 1172 } 1173 1174 this.element.setAttribute('mls', JSON.stringify(mls)) 1175 this.element.setAttribute('image_url',mls?.image || "") 1176 this.element.setAttribute('style', 'display:flex') 1177 } 1178 1179 getPropertyImageUrl(property){ 1180 // property?.image[0]?.uri || property?.photos[0]?.url || "", 1181 1182 if(property.image && property.image.length > 0){ 1183 return property.image[0].uri 1184 } else if (property.photos && property.photos.length > 0){ 1185 return property.photos[0].url 1186 } else { 1187 return "" 1188 } 1189 } 1190 1191 hide() { 1192 this.isVisible = false;
1193 this.element.setAttribute('style', 'display:none'); 1194 } 1195 } 1196 1197 class CollectionPaging { 1198 constructor(collectionsPerPage){ 1199 1200 1201 this.element = document.getElementById('collection-pagination'); 1202 this.collectionsPerPage = collectionsPerPage; 1203 1204 this.element.addEventListener('page_changed', (e) => { 1205 Pubsub.publish('collection_page_changed', e.detail); 1206 }); 1207 } 1208 1209 setPageCount(pageCount){ 1210 this.element.setAttribute('page_count', pageCount); 1211 } 1212 1213 show() { 1214 this.element.setAttribute('style', 'display:flex') 1215 } 1216 1217 hide() { 1218 this.element.setAttribute('style', 'display:none') 1219 } 1220 } 1221 1222 class PropertyPaging { 1223 constructor(propertiesPerPage){ 1224 1225 1226 this.element = document.getElementById('property-pagination'); 1227 this.propertiesPerPage = propertiesPerPage; 1228 1229 this.element.addEventListener('page_changed', (e) => { 1230 Pubsub.publish('property_page_changed', e.detail); 1231 }); 1232 } 1233 1234 setPageCount(pageCount){ 1235 this.element.setAttribute('page_count', pageCount); 1236 } 1237 1238 setCurrentPage(currentPage){ 1239 this.element.setAttribute('current_page', currentPage); 1240 } 1241 1242 show() { 1243 this.element.setAttribute('style', 'display:flex') 1244 } 1245 1246 hide() { 1247 this.element.setAttribute('style', 'display:none') 1248 } 1249 } 1250 1251 class NewCollectionBlock { 1252 constructor(){ 1253 1254 this.element = document.getElementById('new-collection-block'); 1255 1256 this.element.addEventListener('on_main_press', (e) => { 1257 Pubsub.publish('new_collection_block_create_collection_pressed', e.detail); 1258 }); 1259 } 1260 show(collectionUUID, propertyCollectionUUID) { 1261 this.element.setAttribute('style', 'display:flex') 1262 } 1263 1264 hide() { 1265 this.element.setAttribute('style', 'display:none'); 1266 } 1267 } 1268 1269 class AddListingsBlock { 1270 constructor() { 1271 1272 this.element = document.getElementById('add-listings-block'); 1273 1274 this.element.addEventListener('on_main_press', (e) => { 1275 window.open('../../search.php', '_blank') 1276 }); 1277 1278 this.element.addEventListener("on_tertiary_press", (e) => { 1279 1280 }); 1281 } 1282 1283 show() { 1284 this.element.setAttribute('style', 'display:flex') 1285 } 1286 1287 hide() { 1288 this.element.setAttribute('style', 'display:none'); 1289 } 1290 } 1291 1292 class MyFeed { 1293 constructor(blueroofMiddlewareApi, collectionsService) { 1294 this.blueroofMiddlewareApi = blueroofMiddlewareApi; 1295 this.collectionsService = collectionsService; 1296 this.element = document.querySelector('place-myfeedblock'); 1297 1298 this.element.addEventListener('on_menu_open', (e) => { 1299 this.element.setAttribute('show_menu', e.detail.e); 1300 this.element.setAttribute('show_menu_index', e.detail.index); 1301 }); 1302 1303 this.element.addEventListener('on_view_all_pressed', (e) => { 1304 window.open('../../search.php', '_blank'); 1305 }); 1306 1307 this.element.addEventListener('on_add_collection', (e) => { 1308 1309 let property = e.detail; 1310 Pubsub.publish('my_feed_add_collection_pressed', {property}); 1311 1312 }); 1313 1314 this.element.addEventListener('on_share_pressed', (e) => { 1315 1316 let property = e.detail 1317 1318 let url = this.getPropertyUrl(property); 1319 property.searchUrl = url; 1320 1321 Pubsub.publish('my_feed_share_pressed', {property}); 1322 }); 1323 1324 this.element.addEventListener('on_favorite_pressed', (e) => { 1325 let property = e.detail.property; 1326 let isAddingFavorite = e.detail.isAddingFavorite; 1327 1328 if(isAddingFavorite){ 1329 Pubsub.publish('my_feed_on_favorite_pressed', {property}); 1330 } 1331 else{ 1332 Pubsub.publish('my_feed_on_unfavorite_pressed', {property}); 1333 } 1334 }); 1335 1336 this.element.addEventListener('on_property_pressed', (e) => { 1337 let property = e.detail 1338 1339 let url = this.getPropertyUrl(property); 1340 property.searchUrl = url; 1341 window.open('../../' + url, '_blank'); 1342 }); 1343 1344 1345 this.blueroofMiddlewareApi.getMyFeed().then((data) => { 1346 1347 let myFeedBlossorIds = data.map(property => property.blossorId); 1348 1349 1350 this.collectionsService.checkIfInCollection(myFeedBlossorIds).then((propertiesInCollections) => { 1351 1352 let feed = [] 1353 data.forEach((item) => { 1354 feed.push({ 1355 image: [ 1356 { 1357 title: "", 1358 id: 0, 1359 uri: item?.photos[0].url, 1360 }, 1361 ], 1362 price: item?.price, 1363 favorite: propertiesInCollections?.data[item?.blossorId] != null || false, 1364 address: item?.streetAddress, 1365 city: item?.city, 1366 state: item?.state, 1367 postal_code: item?.postalCode, 1368 beds: item?.bedrooms, 1369 status: item?.standardStatus, 1370 baths: item?.bathsTotalDecimal, 1371 sqft: item?.squareFeet, 1372 creator: "", 1373 mls_price_history: item?.history[item.history.length-1]?.price, 1374 blossorId: item?.blossorId, 1375 open_house : item?.openhouses?.length > 0 ? true : false, 1376 open_house_date : item?.openhouses[0]?.startDate, 1377 open_house_end_time : item?.openhouses[0]?.endDate, 1378 property_created_at : item?.listDate, 1379 lastStatusChangeDate : item?.lastStatusChangeDate, 1380 }) 1381 }) 1382 1383 if(feed && feed?.length > 0){ 1384 this.show(); 1385 this.element.setAttribute('mls_data', JSON.stringify(feed)); 1386 } 1387 }); 1388 }); 1389 1390 } 1391 1392 getPropertyUrl = (property) => { 1393 let state = property.state; 1394 let city = this.slugify(property.city); 1395 let zip = property.postal_code 1396 let address = this.slugify(property.address); 1397 let blossorId = property.blossorId; 1398 return `homes-for-sale/${state}/${city}/${zip}/${address}/bid-${blossorId}`; 1399 } 1400 1401 slugify(text) { 1402 // replace non letter or digits by - 1403 text = text.replace(/[^\pL\d]+~u/g, '_'); 1404 // transliterate 1405 text = text.normalize('NFKD').replace(/[\u0300-\u036F]/g,'') 1406 // remove unwanted characters 1407 text = text.replace(/[^_\w]+/g, '_'); 1408 // trim 1409 text = text.trim(); 1410 // remove duplicate - 1411 text = text.replace(/_+/g, '-'); 1412 // lowercase 1413 text = text.toLowerCase(); 1414 if (!text) { 1415 return 'n-a'; 1416 } 1417 return text 1418 } 1419 1420 getMlsData = () => { 1421 return JSON.parse(this.element.getAttribute('mls_data')); 1422 } 1423 1424 setMlsData = (data) => { 1425 this.element.setAttribute('mls_data', JSON.stringify(data)); 1426 } 1427 1428 show() { 1429 this.element.setAttribute('style', 'display:flex') 1430 } 1431 1432 hide() { 1433 this.element.setAttribute('style', 'display:none') 1434 } 1435 } 1436 1437 class BlueroofMiddlewareApi { 1438 constructor() { 1439 this.baseUrl = "https://brivity-home-middleware.production.brivity.com"; 1440 this.apiKey = localStorage.getItem('authorization'); 1441 } 1442 1443 getMyFeed = async () => { 1444 const response = await fetch(`${this.baseUrl}/listings/voltron`, { 1445 method: 'POST', 1446 headers: { 1447 'Content-Type': 'application/json', 1448 'Authorization': `${this.apiKey}` 1449 }, 1450 body: JSON.stringify([]) 1451 }); 1452 1453 const data = await response.json(); 1454 return data; 1455 } 1456 1457 getLeadBasicInfo = async () => { 1458 const response = await fetch(`${this.baseUrl}/blueroofleads/basicinfo`, { 1459 method: 'GET', 1460 headers: { 1461 'Content-Type': 'application/json', 1462 'Authorization': `${this.apiKey}` 1463 }, 1464 1465 }); 1466 1467 const data = await response.json(); 1468 return data; 1469 } 1470 1471 getAgentProfile = async (brivityUserId) => { 1472 const response = await fetch(`${this.baseUrl}/blueroofagents/profile`, { 1473 method: 'POST', 1474 headers: { 1475 'Content-Type': 'application/json', 1476 'Authorization': `${this.apiKey}` 1477 }, 1478 body: `{"brivityUserId": ${brivityUserId}}` 1479 1480 }); 1481 1482 const data = await response.json(); 1483 return data; 1484 } 1485 1486 } 1487 1488 class Map { 1489 constructor(){ 1490 this.element = document.querySelector('place-map'); 1491 this.properties = []; 1492 1493 this.element.addEventListener('on_marker_clicked', (e) => { 1494 Pubsub.publish('map_marker_clicked', e.detail.id) 1495 }); 1496 } 1497 1498 setMarkers = (properties) => { 1499 let markers = []; 1500 let color = 'black' 1501 1502 let dateNow = new Date(); 1503 dateNow.setDate(dateNow.getDate()-7); 1504 dateNow.setHours(dateNow.getHours()); 1505 dateNow.setMinutes(dateNow.getMinutes()); 1506 dateNow.setSeconds(dateNow.getSeconds()); 1507 const sevenDaysAgo = dateNow.getTime(); 1508 1509 this.properties = properties; 1510 properties?.forEach(property => { 1511 1512 if(property.statusText == 'Active'){ 1513 color = '#1FA6E8' 1514 }else if(property.statusText == 'Pending'){ 1515 color = '#FFC82C' 1516 }else if(property.statusText == 'Sold'){ 1517 color = '#FF7343' 1518 } 1519 1520 let listDate = new Date(property.listDate); 1521 1522 1523 if(listDate.getTime() > sevenDaysAgo){ 1524 color = '#24D0BC' 1525 } 1526 1527 markers.push({ 1528 id: `${property.blossorId}`, 1529 location: property.location, 1530 price: property.price, 1531 color : color 1532 }) 1533 }); 1534 1535 this.element.setAttribute('markers', JSON.stringify(markers)); 1536 } 1537 1538 setSelectedMarker = (property) => { 1539 let markerIndex = this.properties.findIndex((p) => p.blossorId == property.blossorId) 1540 if(markerIndex > -1){ 1541 this.element.setAttribute('selected_property_index', markerIndex); 1542 } 1543 } 1544 1545 clearSelectedMarker = () => { 1546 this.element.setAttribute('selected_property_index', -1); 1547 } 1548 1549 } 1550 1551 class SavedListings { 1552 constructor(){ 1553 this.element = document.getElementById('collection-saved-listings'); 1554 } 1555 1556 setCount(count) { 1557 this.element.innerText = `Saved Listings (${count})`; 1558 } 1559 1560 hide() { 1561 this.element.style.display = `none`; 1562 } 1563 show() { 1564 this.element.style.display = `block`; 1565 } 1566 } 1567 1568 class AddListingBtn { 1569 constructor(){ 1570 this.element = document.getElementById('add-listing-btn'); 1571 this.element.setAttribute('button_style', JSON.stringify({paddingLeft: '0px'})); 1572 this.element.addEventListener('on_press', (e) => { 1573 window.open('../../search.php', '_blank') 1574 }) 1575 } 1576 1577 hide() { 1578 this.element.style.display = `none`; 1579 } 1580 show() { 1581 this.element.style.display = `block`; 1582 } 1583 } 1584 1585 class Page { 1586 constructor(blueroofMiddlewareApi) { 1587 this.selectedCollection = {}; 1588 this.inPropertyView = false;
1589 this.lead = {} 1590 this.agent = {} 1591 this.isInMapView = false; 1592 this.isInListView = true; 1593 1594 this.authorizationData = JSON.parse(atob(blueroofMiddlewareApi.apiKey.split('.')[1])); 1595 this.is_blueroof_person = this.authorizationData?.is_blueroof_person; 1596 1597 1598 } 1599 1600 setSelectedCollection(collection) { 1601 this.selectedCollection = collection; 1602 } 1603 1604 setInPropertyView(inPropertyView) { 1605 this.inPropertyView = inPropertyView; 1606 } 1607 } 1608 1609 1610 class messagingEmitter extends Messaging.BaseEmitter { 1611 1612 newMessage(message) { 1613 Pubsub.publish('messaging_emitter_new_message', message); 1614 } 1615 } 1616 1617 1618 1619 (async () => { 1620 1621 const blueroofMiddlewareApi = new BlueroofMiddlewareApi(); 1622 const page = new Page(blueroofMiddlewareApi); 1623 1624 let url = 'https://messaging.brivity.com' 1625 const messaging = new Messaging.Service(url, blueroofMiddlewareApi.apiKey, new messagingEmitter()); 1626 1627 let lead = await blueroofMiddlewareApi.getLeadBasicInfo(); 1628 let agent = await blueroofMiddlewareApi.getAgentProfile(lead.data?.brivity_agent_id); 1629 1630 page.lead = lead.data; 1631 page.agent = agent.data; 1632 1633 const collectionsService = new Collections.Service(window?.globalSiteVariables?.options?.apis?.collections?.url ?? '',blueroofMiddlewareApi.apiKey, "sitebuilder", new logger()); 1634 1635 1636 const menu = new Menu(page?.is_blueroof_person || false, page?.agent, blueroofMiddlewareApi.baseUrl, blueroofMiddlewareApi.apiKey); 1637 const collectionSection = new CollectionSection() 1638 const propertySection = new PropertySection() 1639 const collectionModal = new CollectionModal(); 1640 const collectionCreatedModal = new CollectionCreatedModal(); 1641 const deleteCollectionModal = new DeleteCollectionModal();
1642 const editCollectionModal = new EditCollectionModal(); 1643 const shareSavedPropertyModal = new ShareSavedPropertyModal(); 1644 const deletePropertyModal = new DeletePropertyModal(); 1645 const copyPropertyToCollectionModal = new CopyPropertyToCollectionModal(); 1646 const pageSubHeader = new PageSubHeader(); 1647 const collectionPaging = new CollectionPaging(8) 1648 const propertyPaging = new PropertyPaging(8) 1649 const newCollectionBlock = new NewCollectionBlock(); 1650 const addListingsBlock = new AddListingsBlock(); 1651 const myFeed = new MyFeed(blueroofMiddlewareApi, collectionsService); 1652 const map = new Map(); 1653 const savedListings = new SavedListings(); 1654 const addListingBtn = new AddListingBtn(); 1655 1656 collectionPaging.hide(); 1657 propertySection.hide(); 1658 1659 let collections = []; 1660 let extraCollections = 0; 1661 let createCopyCollection = false; 1662 1663 if(!showCollectionByUUID){ 1664 const collectionDescription = document.getElementById("collectionDescription"); 1665 1666 collectionsService.getCollections(0, collectionPaging.collectionsPerPage).then((e) => { 1667 1668 extraCollections = e?.data?.totalCollections 1669 1670 if(e.data.TotalPages > 1) { 1671 collectionPaging.show() 1672 collectionPaging.setPageCount(e.data.TotalPages); 1673 } else { 1674 collectionPaging.setPageCount(1); 1675 } 1676 1677 1678 if(e?.data?.Items){ 1679 collections = e.data.Items; 1680 count = 100; 1681 e.data.Items.forEach((collection) => { 1682 count-- 1683 1684 collectionSection.addCollectionCard(collection, count) 1685 }); 1686 } 1687 1688 copyPropertyToCollectionModal.getCollectionList(collections) 1689 1690 if(collections.length == 0){ 1691 newCollectionBlock.show(); 1692 } 1693 1694 }).catch((e) => { 1695 if(collections.length == 0){ 1696 newCollectionBlock.show(); 1697 } 1698 }); 1699 } 1700 else{ 1701 collectionsService.getCollections(0, collectionPaging.collectionsPerPage).then((e) => { 1702 1703 if(e?.data?.Items){ 1704 collections = e.data.Items; 1705 } 1706 1707 }); 1708 } 1709 1710 Pubsub.subscription('property_card_mouseenter', (property) => { 1711 1712 document.querySelectorAll('place-propertycard').forEach((propertyCard) => { 1713 propertyCard.setAttribute('show_border', false); 1714 }) 1715 1716 if(page.isInMapView){ 1717 map.setSelectedMarker(property) 1718 } 1719 }).subscribe(); 1720 1721 Pubsub.subscription('property_card_mouseleave', () => { 1722 if(page.isInMapView){ 1723 map.clearSelectedMarker() 1724 } 1725 }).subscribe(); 1726 1727 Pubsub.subscription('messaging_emitter_new_message', (message) => { 1728 toast.show('New message from ' + message.createdByAlias) 1729 }).subscribe(); 1730 1731 Pubsub.subscription('property_section_show_map_view', (properties) => { 1732 map.setMarkers(properties); 1733 page.isInMapView = true; 1734 page.isInListView = false; 1735 1736 document.querySelectorAll('place-propertycard').forEach((propertyCard) => { 1737 propertyCard.setAttribute('show_border_on_hover', true); 1738 }) 1739 }).subscribe(); 1740 1741 Pubsub.subscription('property_section_show_list_view', (properties) => { 1742 page.isInMapView = false;
1743 page.isInListView = true; 1744 1745 document.querySelectorAll('place-propertycard').forEach((propertyCard) => { 1746 propertyCard.setAttribute('show_border_on_hover', false); 1747 }) 1748 1749 }).subscribe(); 1750 1751 Pubsub.subscription('property_page_changed', (page) => { 1752 collectionsService.getCollectionProperties(propertySection.collectionUUID, page, propertyPaging.propertiesPerPage).then((collectionProperties) => { 1753 map.setMarkers(collectionProperties?.data?.properties); 1754 savedListings.setCount(collectionProperties?.data?.totalListings || 0); 1755 propertySection.show(propertySection.collectionUUID,collectionProperties) 1756 propertySection.setPropertyCardWidth(); 1757 propertyPaging.setCurrentPage(page); 1758 }); 1759 }).subscribe(); 1760 1761 Pubsub.subscription("top_header_menu_item_pressed", (menuItemPressed) => { 1762 1763 if(menuItemPressed == 'Edit Collection'){ 1764 collectionModal.setName(page.selectedCollection.collectionName); 1765 collectionModal.setDescription(page.selectedCollection.collectionDescription); 1766 collectionModal.show(page.selectedCollection.collectionUUID, true); 1767 } 1768 else if(menuItemPressed == 'Delete Collection'){ 1769 deleteCollectionModal.show(page.selectedCollection); 1770 } 1771 }).subscribe(); 1772 1773 Pubsub.subscription('new_collection_block_create_collection_pressed', (e) => { 1774 collectionModal.show(0, false); 1775 }).subscribe(); 1776 1777 Pubsub.subscription('collection_card_pressed', (e) => { 1778 1779 window.location.hash = e.collection.collectionUUID; 1780 1781 page.setSelectedCollection(e.collection); 1782 1783 collectionsService.getCollectionProperties(e.collection.collectionUUID,1, propertyPaging.propertiesPerPage).then((collectionProperties) => { 1784 1785 1786 savedListings.setCount(collectionProperties?.data?.totalListings || 0); 1787 propertyPaging.setPageCount(collectionProperties.data.totalPages); 1788 1789 1790 if(collectionProperties?.data?.properties == null){ 1791 addListingsBlock.show(); 1792 } 1793 propertySection.show(e.collection.collectionUUID,collectionProperties) 1794 propertySection.setPropertyCardWidth(); 1795 1796 if(collectionProperties.data.totalPages > 1){ 1797 propertyPaging.show(); 1798 } 1799 1800 }); 1801 1802 1803 collectionSection.hide(); 1804 1805 let collectionList = []; 1806 1807 collections.forEach(collection => { 1808 if (collection.collectionName == e.collection.collectionName) return; 1809 1810 collectionList.push({ 1811 collection_title: collection.collectionName, 1812 id: collection.collectionUUID, 1813 propertiesImages: collection?.propertiesImages?.length > 0 ? collection?.propertiesImages : [], 1814 }) 1815 }); 1816 1817 copyPropertyToCollectionModal.getCollectionList(collections, e.collection.collectionName); 1818 1819 pageSubHeader.showTopHeader(); 1820 pageSubHeader.setTopHeaderTitle("Collections"); 1821 pageSubHeader.setTitle(e.collection.collectionName); 1822 pageSubHeader.hidePrimaryButton(); 1823 pageSubHeader.showMenuButton(); 1824 1825 if(window.innerWidth > 768 ){ 1826 pageSubHeader.showSecondaryButton(); 1827 } 1828 1829 page.setInPropertyView(true) 1830 1831 propertyPaging.setCurrentPage(1); 1832 propertySection.setView('list') 1833 1834 1835 const collectionDescription = document.getElementById('collection-description') 1836 collectionDescription.style.display="flex" 1837 collectionDescription.children[0].innerText = e?.collection.collectionDescription || "" 1838 }).subscribe(); 1839 1840 Pubsub.subscription('collection_card_menu_item_pressed', (e) => { 1841 if (e.menuItem == "Delete Collection") { 1842 1843 deleteCollectionModal.show(e.collection); 1844 1845 } else { 1846 1847 1848 collectionModal.setName(e.collection.collectionName); 1849 collectionModal.setDescription(e.collection.collectionDescription); 1850 collectionModal.show(e.collection.collectionUUID, true); 1851 } 1852 }).subscribe(); 1853 1854 Pubsub.subscription('property_card_menu_item_pressed', (e) => { 1855 if(e.menuItem == 'Remove from Collection') { 1856 deletePropertyModal.show(e.collectionUUID, e.propertyCollectionUUID); 1857 } 1858 else if(e.menuItem == 'Copy to Collection') { 1859 copyPropertyToCollectionModal.show(e.property); 1860 } 1861 else if(e.menuItem == 'Share Property') { 1862 1863 shareSavedPropertyModal.show(e.property); 1864 } 1865 }).subscribe(); 1866 1867 Pubsub.subscription('delete_property_modal_pressed', (e) => { 1868 deletePropertyModal.show(e.collectionUUID, e.propertyCollectionUUID); 1869 }).subscribe(); 1870 1871 Pubsub.subscription('show_new_collection_modal', (e) => { 1872 collectionModal.show(); 1873 copyPropertyToCollectionModal.hide(); 1874 createCopyCollection = true; 1875 }).subscribe(); 1876 1877 Pubsub.subscription('top_header_back_pressed', () => { 1878 window.location.hash = ''; 1879 pageSubHeader.hideTopHeader(); 1880 page.selectedCollection = {}; 1881 pageSubHeader.setTitle("COLLECTIONS"); 1882 pageSubHeader.showPrimaryButton(); 1883 pageSubHeader.hideSecondaryButton(); 1884 pageSubHeader.hideMenuButton(); 1885 1886 page.setInPropertyView(false) 1887 1888 collectionSection.show(); 1889 propertySection.hide() 1890 1891 propertyPaging.setCurrentPage(1); 1892 1893 copyPropertyToCollectionModal.getCollectionList(collections) 1894 1895 const collectionDescription = document.getElementById('collection-description') 1896 collectionDescription.style.display="none" 1897 collectionDescription.children[0].innerText = ""; 1898 addListingsBlock.hide(); 1899 }).subscribe() 1900 1901 Pubsub.subscription('create_new_collection_pressed', (e) => { 1902 collectionModal.show(0, false); 1903 }).subscribe(); 1904 1905 Pubsub.subscription('on_new_collection_saved', (e) => { 1906 if(e.type == 'save'){ 1907 1908 let people = [{ personUUID: page.lead.brivity_uuid, role: "lead" }]; 1909 let properties = [""]; 1910 collectionsService.createCollection(e.name, e.description, page.lead.brivity_uuid, people, properties).then((e) => { 1911 1912 collections.unshift(e.data); 1913 1914 extraCollections++ 1915 if(collections.length > 8) { 1916 collections.pop(); 1917 collectionPaging.show() 1918 collectionPaging.setPageCount(Math.ceil(extraCollections / 8)); 1919 } 1920 1921 count = 100; 1922 collectionSection.collections.innerHTML = ""; 1923 collections.forEach((collection) => { 1924 count-- 1925 collectionSection.addCollectionCard(collection, count) 1926 }); 1927 1928 let collectionsList = copyPropertyToCollectionModal.getCollectionData(); 1929 let newCollection = { 1930 collection_title: e.data.collectionName, 1931 id: e.data.collectionUUID, 1932 propertiesImages: [], 1933 } 1934 collectionsList.unshift(newCollection); 1935 copyPropertyToCollectionModal.setCollectionData(collectionsList); 1936 1937 if(!copyPropertyToCollectionModal.isVisible){ 1938 if (createCopyCollection) { 1939 copyPropertyToCollectionModal.isVisible = true; 1940 copyPropertyToCollectionModal.element.setAttribute('style', 'display:flex'); 1941 createCopyCollection = false;
1942 } else { 1943 collectionCreatedModal.show(e.data); 1944 } 1945 } 1946 1947 collectionModal.hide(); 1948 1949 newCollectionBlock.hide(); 1950 }).catch((e) => { 1951 collectionModal.showError(true) 1952 }); 1953 } 1954 else{ 1955 collectionsService.updateCollection(e.collectionUUID, e.name, e.description).then((collection) => { 1956 let element = document.getElementById(e.collectionUUID); 1957 element.setAttribute('title', e.name); 1958 element.setAttribute('description', e.description); 1959 if(Object.keys(page.selectedCollection).length !== 0){ 1960 pageSubHeader.setTitle(e.name); 1961 } 1962 const collectionDescription = document.getElementById('collection-description') 1963 collectionDescription.children[0].innerText = e.description; 1964 let updatedCollection = collections.findIndex((c) => c.collectionUUID == e.collectionUUID) 1965 if(updatedCollection != -1){ 1966 collections[updatedCollection].collectionName = e.name; 1967 collections[updatedCollection].collectionDescription = e.description; 1968 } 1969 collectionModal.hide(); 1970 editCollectionModal.show(); 1971 }); 1972 } 1973 }).subscribe(); 1974 1975 Pubsub.subscription('collection_created_modal_view_collection_pressed', (collection) => { 1976 Pubsub.publish('collection_card_pressed', {"collection": collection}) 1977 }).subscribe(); 1978 1979 Pubsub.subscription('delete_collection_modal_delete_pressed', (collection) => { 1980 collectionsService.deleteCollection(collection.collectionUUID).then((e) => { 1981 document.getElementById(collection.collectionUUID).remove(); 1982 toast.show('Collection was Deleted') 1983 1984 extraCollections-- 1985 1986 if(extraCollections.length < 9) { 1987 collectionPaging.hide() 1988 }else{ 1989 collectionPaging.setPageCount(Math.ceil(extraCollections / 8)); 1990 } 1991 1992 if(page.inPropertyView){ 1993 Pubsub.publish('top_header_back_pressed'); 1994 } 1995 }); 1996 }).subscribe(); 1997 1998 Pubsub.subscription('delete_property_modal_delete_pressed', (e) => { 1999 const currentPage = $("#property-pagination").find("#info-parent").filter( 2000 function() { 2001 return $(this).css("color") === "rgb(196, 196, 196)" 2002 } 2003 ).text(); 2004 2005 const propertiesPerPage = 8; 2006 const numOfProperties = $("#property-list .property-card-wrapper").length; 2007 const setPage = numOfProperties === 1 ? currentPage - 1 : currentPage; 2008 2009 collectionsService.removePropertyFromCollection(e.collectionUUID, e.propertyCollectionUUID) 2010 .then(() => { 2011 toast.show('Property removed from collection'); 2012 2013 return collectionsService.getCollectionProperties(e.collectionUUID, setPage, propertiesPerPage); 2014 }) 2015 .then((collectionProperties) => { 2016 const totalListingsCount = collectionProperties?.data?.totalListings; 2017 const properties = collectionProperties?.data?.properties; 2018 const totalPages = collectionProperties?.data?.totalPages; 2019 const currentCollection = $(`#${e.collectionUUID}`); 2020 2021 currentCollection.attr("num_properties", totalListingsCount); 2022 2023 map.setMarkers(properties); 2024 savedListings.setCount(totalListingsCount || 0); 2025 propertySection.show(propertySection.collectionUUID, collectionProperties); 2026 propertySection.setPropertyCardWidth(); 2027 2028 propertyPaging.setCurrentPage(setPage); 2029 propertyPaging.setPageCount(totalPages); 2030 2031 if (totalListingsCount <= 8) { 2032 propertyPaging.hide(); 2033 } 2034 }) 2035 .catch(error => { 2036 console.error("Error in collection operations:", error); 2037 }); 2038 }).subscribe(); 2039 2040 Pubsub.subscription('copy_property_to_collection_modal_save_pressed', (e) => { 2041 2042 let collectionUUID = e.collectionUUID; 2043 let blossorId = e.property.blossorId; 2044 collectionsService.addPropertyToCollection(collectionUUID, [blossorId]).then(() => { 2045 2046 2047 let data = copyPropertyToCollectionModal.getCollectionData(); 2048 let myFeedData = myFeed.getMlsData(); 2049 2050 collectionsService.getCollectionProperties(collectionUUID,1,1).then((e) => { 2051 2052 // update photos in add property to collection modal 2053 let collectionIndex = data.findIndex((x) => x.id == collectionUUID); 2054 let collection = data[collectionIndex]; 2055 let photo = e?.data?.properties[0]?.photos[0]?.url; 2056 2057 collection.propertiesImages = []; 2058 if(e?.data?.properties?.length > 0){ 2059 collection.propertiesImages.push({mainPhoto: photo}); 2060 } 2061 2062 data[collectionIndex] = collection; 2063 2064 copyPropertyToCollectionModal.setCollectionData(data); 2065 2066 2067 // update collection card if in collection view 2068 pageCollectionIndex = collections.findIndex((x) => x.collectionUUID == collectionUUID) 2069 2070 if(pageCollectionIndex > -1){ 2071 2072 let collectionCard = document.getElementById(collectionUUID); 2073 let numProperties = parseInt(collectionCard.getAttribute('num_properties')); 2074 numProperties++; 2075 collectionCard.setAttribute('num_properties', numProperties); 2076 2077 let images = collectionCard.getAttribute('image'); 2078 if(images){ 2079 images += "," + photo; 2080 } 2081 else{ 2082 images = photo; 2083 } 2084 2085 collectionCard.setAttribute('image', images); 2086 } 2087 2088 //update my feed to set property heart as favorited 2089 let myFeedPropertyIndex = myFeedData.findIndex((x) => x.blossorId == blossorId); 2090 if(myFeedPropertyIndex > -1){ 2091 myFeedData[myFeedPropertyIndex].favorite = true; 2092 myFeed.setMlsData(myFeedData); 2093 } 2094 2095 }) 2096 2097 copyPropertyToCollectionModal.hide(); 2098 toast.show('Property added to collection') 2099 2100 }).catch((e) => { 2101 toast.show('Error adding property to collection', true) 2102 }); 2103 }).subscribe(); 2104 2105 Pubsub.subscription('collection_page_changed', (e) => { 2106 collectionsService.getCollections(e, collectionPaging.collectionsPerPage).then((e) => { 2107 if(e?.data?.Items){ 2108 collections = e.data.Items; 2109 2110 collectionSection.collections.innerHTML = ""; 2111 count = 100;
2112 e.data.Items.forEach((collection) => { 2113 count-- 2114 2115 collectionSection.addCollectionCard(collection, count) 2116 }); 2117 } 2118 }); 2119 }).subscribe(); 2120 2121 Pubsub.subscription('share_saved_property_modal_share_pressed', (e) => { 2122 toast.show('Link Copied!') 2123 }).subscribe(); 2124 2125 Pubsub.subscription('my_feed_share_pressed', (e) => { 2126 shareSavedPropertyModal.show(e.property); 2127 }).subscribe(); 2128 2129 Pubsub.subscription('my_feed_add_collection_pressed', (e) => { 2130 copyPropertyToCollectionModal.setIsAddingToCollection(true); 2131 copyPropertyToCollectionModal.show(e.property); 2132 }).subscribe(); 2133 2134 Pubsub.subscription('map_marker_clicked', (id) => { 2135 propertySection.scrollIntoView(id); 2136 2137 document.querySelectorAll('place-propertycard').forEach((propertyCard) => { 2138 if(propertyCard.id == id) { 2139 propertyCard.setAttribute('show_border', true) 2140 } 2141 else { 2142 propertyCard.setAttribute('show_border', false) 2143 } 2144 }) 2145 }).subscribe(); 2146 2147 Pubsub.subscription('my_feed_on_favorite_pressed', (e) => { 2148 copyPropertyToCollectionModal.setIsAddingToCollection(true); 2149 copyPropertyToCollectionModal.show(e.property); 2150 }).subscribe(); 2151 2152 Pubsub.subscription('my_feed_on_unfavorite_pressed', (e) => { 2153 let blossorId = e.property.blossorId; 2154 let myFeedData = myFeed.getMlsData(); 2155 collectionsService.checkIfInCollection([blossorId]).then((propertiesInCollections) => { 2156 if(propertiesInCollections.data[blossorId]){ 2157 propertiesInCollections.data[blossorId].forEac
2157h((collection) => { 2158 collectionsService.removePropertyFromCollection(collection.collectionUUID, collection.propertyUUID).then(() => { 2159 2160 let data = copyPropertyToCollectionModal.getCollectionData(); 2161 let collectionUUID = collection.collectionUUID; 2162 collectionsService.getCollectionProperties(collectionUUID,1,1).then((e) => { 2163 2164 // update photos in add property to collection modal 2165 let collectionIndex = data.findIndex((x) => x.id == collectionUUID); 2166 let collection = data[collectionIndex]; 2167 let photo = e?.data?.properties?.length > 0 ? e?.data?.properties[0]?.photos[0]?.url : ''; 2168 2169 collection.propertiesImages = []; 2170 if(e?.data?.properties?.length > 0){ 2171 collection.propertiesImages.push({mainPhoto: photo}); 2172 } 2173 2174 data[collectionIndex] = collection; 2175 2176 copyPropertyToCollectionModal.setCollectionData(data); 2177 2178 2179 // update collection card if in collection view 2180 pageCollectionIndex = collections.findIndex((x) => x.collectionUUID == collectionUUID) 2181 2182 if(pageCollectionIndex > -1){ 2183 2184 let collectionCard = document.getElementById(collectionUUID); 2185 let numProperties = parseInt(collectionCard.getAttribute('num_properties')); 2186 numProperties--; 2187 collectionCard.setAttribute('num_properties', numProperties); 2188 2189 let images = collectionCard.getAttribute('image'); 2190 let newImages = images.split(',').filter((x) => x == photo).join(','); 2191 collectionCard.setAttribute('image', newImages); 2192 } 2193 2194 //update my feed to set property heart as not favorited 2195 let myFeedPropertyIndex = myFeedData.findIndex((x) => x.blossorId == blossorId); 2196 if(myFeedPropertyIndex > -1){ 2197 myFeedData[myFeedPropertyIndex].favorite = false; 2198 myFeed.setMlsData(myFeedData); 2199 } 2200 }) 2201 toast.show('Property removed from collection'); 2202 }).catch((e) => { 2203 toast.show('Error removing from collection', true); 2204 }); 2205 }); 2206 } 2207 }); 2208 }).subscribe(); 2209 2210 let modalBackdrop = document.getElementsByClassName('center-modal'); 2211 for(let i = 0; i < modalBackdrop.length; i++){ 2212 modalBackdrop[i].addEventListener('click', (e) => { 2213 if(e.target == modalBackdrop[i]){ 2214 modalBackdrop[i].style.display = 'none'; 2215 } 2216 }); 2217 } 2218 2219 window.addEventListener( "hashchange", function( event ) { 2220 if(window.location.hash == ''){ 2221 Pubsub.publish("top_header_back_pressed"); 2222 } 2223 }); 2224 2225 2226 document.addEventListener("click", (e) => { 2227 2228 const elements = document.querySelectorAll("[show_menu]");
2229 elements.forEach((el) => { 2230 el.setAttribute("show_menu", "false"); 2231 }); 2232 2233 document.getElementById("c2dfac72-6233-4e8d-b0d2-f44e4240ebb4")?.setAttribute("show_menu", "false"); 2234 }); 2235 if(window.innerWidth < 768 ){ 2236 savedListings.hide(); 2237 pageSubHeader.hideSecondaryButton(); 2238 } else{ 2239 addListingBtn.hide(); 2240 } 2241 })(); 2242 } 2243 }) 2244 2245</script>
2245 <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"> <div class="container"> <div class="row"> <div class="col-md-2"> <div class="render-menu hot-nav animated fadeInUp wow animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated" style="visibility: visible; animation-name: fadeInUp;"> <ul class=""> <li class="nav-item" data-selector="li"> <a href="/index">Home</a> </li> <li class="nav-item" data-selector="li"> <a href="/search">Listings</a> </li> <li class="nav-item" data-selector="li"> <a href="/buying">Buying</a> </li> <li class="nav-item" data-selector="li"> <a class="white" href="/selling">Selling</a> </li> <li class="nav-item" data-selector="li"> <a href="/financing">Financing</a> </li> <li class="nav-item" data-selector="li"> <a href="/homevalue">Home Value</a> </li> <li class="nav-item" data-selector="li"> <a href="/realestateagent/search">Who We Are</a> </li> <li class="nav-item" data-selector="li"> <a href="/connect">Connect</a> </li> </ul> </div> </div>
2245 <div class="col-md-7 col-md-offset-1 animated fadeInUp wow animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated" animation-delay="0.1s" style="visibility: visible; animation-name: fadeInUp;"> <h3 class="white" id="text-3" style="font-size: 23pt; color: rgb(255, 255, 255) !important;" data-selector="h1, h2, h3, h4, h5, h6">Let's talk real estate.</h3> <form id="form-contact1" action="" class="form-contact"> <input type="hidden" name="tags" value="footer_signup"> <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,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAfBJREFUWAntVk1OwkAUZkoDKza4Utm61iP0AqyIDXahN2BjwiHYGU+gizap4QDuegWN7lyCbMSlCQjU7yO0TOlAi6GwgJc0fT/fzPfmzet0crmD7HsFBAvQbrcrw+Gw5fu+AfOYvgylJ4TwCoVCs1ardYTruqfj8fgV5OUMSVVT93VdP9dAzpVvm5wJHZFbg2LQ2pEYOlZ/oiDvwNcsFoseY4PBwMCrhaeCJyKWZU37KOJcYdi27QdhcuuBIb073BvTNL8ln4NeeR6NRi/wxZKQcGurQs5oNhqLshzVTMBewW/LMU3TTNlO0ieTiStjYhUIyi6DAp0xbEdgTt+LE0aCKQw24U4llsCs4ZRJrYopB6RwqnpA1YQ5NGFZ1YQ41Z5S8IQQdP5laEBRJcD4Vj5DEsW2gE6s6g3d/YP/g+BDnT7GNi2qCjTwGd6riBzHaaCEd3Js01vwCPIbmWBRx1nwAN/1ov+/drgFWIlfKpVukyYihtgkXNp4mABK+1GtVr+SBhJDbBIubVw+Cd/TDgKO2DPiN3YUo6y/nDCNEIsqTKH1en2tcwA9FKEItyDi3aIh8Gl1sRrVnSDzNFDJT1bAy5xpOYGn5fP5JuL95ZjMIn1ya7j5dPGfv0A5eAnpZUY3n5jXcoec5J67D9q+VuAPM47D3XaSeL4AAAAASUVORK5CYII="); background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%; cursor: auto;' fdprocessedid="fgi4eb"> </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="" fdprocessedid="p33zer"> </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="" fdprocessedid="co9vlp"> </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="" fdprocessedid="h70r34"> </div> </div> </div> <div class="row margin-bottom-0"> <div class="col-sm-12" style="margin-bottom: 20px;"> <i class="fa fa-caret-down" style="position: absolute; top: 13px; right: 30px; font-size: 14px;" data-selector=".fa"></i> <select name="lead_type" style="width: 100%; height: 40px; padding-left: 12px; font-size: 14px; border-radius: 5px !important; -webkit-appearance: none; -webkit-border-radius: 0px;" fdprocessedid="7urkj"> <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="form-consent"> <label for="contact_consent" style="font-size: 1.5rem;"> <input type="checkbox" id="contact_consent" name="contact_consent"> I agree to be contacted by <strong>Brad Bergamini PLLC</strong> via call, email, and text for real estate services. To opt out, you can reply <strong>"STOP"</strong> at any time or reply <strong>"HELP"</strong> for assistance. You can also click the unsubscribe link in the emails. Message and data rates may apply. Message frequency may vary. <a href="https://www.thebergaminigroup.com/privacy_policy" target="_blank" rel="noopener noreferrer"> Privacy Policy </a>(Optional) </label> </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" fdprocessedid="w8wsmt">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 animated fadeInUp wow animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated" id="logo-group" animation-delay="0.2s" style="visibility: visible; animation-name: fadeInUp;"> <img data-selector="img" style="border-style: none; margin-bottom: 10px; display: block; margin-left: auto; margin-right: auto;" class="ftr-logo margin-bottom-40" src="https://images.brivityidx.com/assets/images/uploads/106226/Bergamini_New_Logo.png" alt="Keller Williams Logo"> <img class="ftr-logo" src="https://images.brivityidx.com/assets/images/uploads/4595/powered-by-place-logo-white.png" alt="Powered by PLACE Logo" data-selector="img" style="border-style: none; margin-bottom: 10px; display: block; margin-left: auto; margin-right: auto;"> <div class="text-left" id="text-1" style="outline: medium none; cursor: inherit;"> <ul style="list-style-type: none;"> <br> <li data-selector="li"> <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"> <a class="agent_phone_" href="tel:9282374400" src="tel:">(928) 237-4400</a> </li> </ul> </div> </div> </div> <div class="row ftr-anchor animated fadeInUp wow animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated animated" style="visibility: visible; animation-name: fadeInUp;"> <div class="col-sm-6 anchor-col no-padding editContent" data-selector=".editContent"> <p class="no-margin" data-selector="p"><span class="get_this_year">2021</span> © <strong>The Bergamini Group | Keller Williams Arizona Realty | <a href="https://www.place.com/" target="_blank">PLACE</a></strong></p> <p style="margin: 10px 0px;" 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;" 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"> <li data-selector="li"> <a class="agent_facebook_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://www.facebook.com/prescottazrealty" target="_blank"> <svg alt="Facebook Icon" 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"> <a class="agent_twitter_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://twitter.com/" target="_blank"> <svg alt="Twitter Icon" 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"> <a class="agent_linkedin_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://www.linkedin.com/" target="_blank"> <svg alt="LinkedIn Icon" 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"> <a class="agent_instagram_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://www.instagram.com/thebergaminigroup/" target="_blank"> <svg alt="Instagram Icon" 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"> <a class="agent_youtube_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://www.youtube.com/c/TheBergaminiGroupPrescott" target="_blank"> <svg alt="YouTube Icon" 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"> <a class="agent_pinterest_dynamic dynamic_loading dynamic_loading dynamic_loading dynamic_loading" href="https://www.pinterest.com/" target="_blank"> <svg alt="Pinterest Icon" 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> </footer> </div> <section id="seo-anchor"> <div class="container"> <ul class="powered-by"> <li>Powered by <a class="pb-vendor" href="https://www.brivity.com/"> Brivity</a></li> <li class="pb-admin-login"><a href="https://login.brivityidx.com/login"><span class='pb-admin-login-text'>Admin Log In</span></a></li> </ul> <ul class="seo-anchor-links"> <li><a href="/privacy_policy">Privacy Policy</a></li> <li><a href="/tos">DMCA & Terms of Service</a></li> <li><a id='sitemapUrl' href='/sitemap' style='display: inline;'>Sitemap</a></li> </ul> </div> </section> <input type="hidden" id="hchatbot_settings" data-chatbot-version="1" value="{"chat_position":"right","call_to_action_text":"Hi there! Please let us know if you have any questions and an agent will reach out to you as soon as possible.","initial_message":"Enter your question below and an agent will be in touch with you.","tags":"IDX Chat","version":"1"}"> 2246<!-- chatbot v1 --> 2247<!-- Chatbot drawer container --> 2248<div class="chatbot-drawer-container loading"> 2249 <div class="chatbot-content-wrapper"> 2250 <div class="chatbot-outside-content"> 2251 <div class="chatbot-bubble-message-container cb-hide"> 2252 <img src="https://cdn.brivity.com/images/people/59833329/1366199b834fc395da0fc2942e902c4c3182f1e5-original.jpg?1728929253" class="chatbot-agent-img" alt="Agent profile image in chat bubble"/> 2253 <div id="call-to-action" class="bubble-message"></div> 2254 <button type="button" class="chatbox-bubble-close" data-dismiss="modal" aria-label="Close">
2255 <span aria-hidden="true">×</span> 2256 </button> 2257 </div> 2258 <button id="chatbot-open-btn" class="chatbot-open-btn bg-prmry" aria-label="Chatbot Open Button"> 2259 <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> 2260 <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"/> 2261 </svg> 2262 </button> 2263 </div> 2264 <div class="chatbot-drawer"> 2265 <div class="chatbot-header bg-prmry"> 2266 <div class="chatbot-agent-info"> 2267 <img src="https://cdn.brivity.com/images/people/59833329/1366199b834fc395da0fc2942e902c4c3182f1e5-original.jpg?1728929253" class="chatbot-agent-img" alt="Agent profile image in chat header"/> 2268 <div class="chatbot-agent"> 2269 <h3 class="chatbot-agent-name">Jen Bergamini</h3> 2270 <h4><span class="chatbot-agent-title">Director of Ops</span> | <span class="chatbot-agent-company">The Bergamini Group | Keller Williams Arizona Realty | PLACE</span></h4> 2271 </div> 2272 <a id="chatbot-agent-phone" style="display: none;">(928) 227-4899</a> 2273 </div> 2274 <button id="close-chatbot-drawer" type="button" class="chatbox-modal-close" data-dismiss="modal" aria-label="Close"> 2275 <span aria-hidden="true">×</span> 2276 </button> 2277 </div> 2278 <div class="chatbot-body"> 2279 <div class="chatbot-message-container"> 2280 <img src="https://cdn.brivity.com/images/people/59833329/1366199b834fc395da0fc2942e902c4c3182f1e5-original.jpg?1728929253" class="chatbot-agent-img" alt="Agent profile image in message"/> 2281 <h4 id="initial_message" class="chatbot-chat-messages not-loaded"></h4> 2282 <div class="chatbot-chat-messages loading"> 2283 <span class="typing-indicator"> 2284 <span></span> 2285 <span></span> 2286 <span></span> 2287 </span> 2288 </div> 2289 </div> 2290 <form id="chatbotForm" class="chatbot-form"> 2291 <input type="name" id="chatbot_fullname" class="chatbox-form-control no-native-focus" placeholder="Full Name" 2292 pattern="^[A-Za-z'\- ]+ [A-Za-z'\- ]+$" 2293 required /> 2294 <input type="tel" id="chatbot_phone" class="chatbox-form-control no-native-focus" placeholder="Phone" required /> 2295 <input type="email" id="chatbot_email" class="chatbox-form-control no-native-focus" placeholder="Email" 2296 pattern="^[^@\s]+@[^@\s]+\.[^@\s]+$" 2297 required /> 2298 <textarea id="chatbot_message" class="chatbox-form-control chatbot-message" rows="5" name="notes" placeholder="Any Comments or Questions"></textarea> 2299 <div class="chatbot-consent-container"> 2300 <div class="chatbot-toggle"> 2301 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
2301communications 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>. 2302 </div> 2303 </div> 2304 <input type="hidden" id="chatbot_tags"> 2305 </form> 2306 </div> 2307 <div class="chatbot-footer"> 2308 <button type="submit" form="chatbotForm" class="chatbot-send bg-prmry chatbot-btn-disabled" data-dismiss="modal" aria-label="Close" disabled> 2309 Send 2310 <span aria-hidden="true"> 2311 <svg class="chatbot-btn-icon" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> 2312 <g clip-path="url(#clip0_2435_997)"> 2313 <path d="M14.6667 1.33331L7.33337 8.66665" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 2314 <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"/> 2315 </g> 2316 <defs> 2317 <clipPath id="clip0_2435_997"> 2318 <rect width="16" height="16" fill="white"/> 2319 </clipPath> 2320 </defs> 2321 </svg> 2322 </span> 2323 </button> 2324 </div> 2325 </div> 2326 </div> 2327</div> <style> 2328 .signup-consent-checkbox-section { 2329 display: none; 2330 flex-direction:column; 2331 align-items:flex-start; 2332 padding: 6px 0; 2333 } 2334 2335 .signup-consent-checkbox-section .checkbox { 2336 display:flex; 2337 align-items:flex-start; 2338 justify-content:center; 2339 gap:8px; 2340 padding:0 !important; 2341 } 2342 2343 .signup-consent-checkbox-section .checkbox input { 2344 position:unset; 2345 margin:2px 0 0 0 !important; 2346 } 2347 2348 .signup-consent-checkbox-section .checkbox span { 2349 color: #666666; 2350 font-size: 14px; 2351 font-weight: 400; 2352 line-height:16px; 2353 } 2354 2355 .signup-verbage { 2356 text-align:center; 2357 font-size:10px; 2358 line-height:16px; 2359 } 2360 2361 .signup-verbage span { 2362 color: #8C8C8C; 2363 font-weight:600; 2364 } 2365 2366 .signup-verbage a { 2367 color:#5386E4 !important; 2368 font-weight:400; 2369 } 2370 2371 .signup-verbage .twilio-enabled-verbage { 2372 display:none; 2373 } 2374 2375 2376 2377 </style> <div id="modal-mount" data-modal-bundle="https://cdn1.brivityidx.com/assets/modals/v1/all.html?ck=1789512948"></div>
2377 <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>
2377<script> 2378 document.addEventListener("DOMContentLoaded", () => { 2379 class Toast { 2380 constructor() { 2381 this.element = document.querySelector('place-generictoast'); 2382 } 2383 2384 show(message, error = false, link) { 2385 var dispatch = function () { 2386 window.dispatchEvent( 2387 new CustomEvent("ShowToast", { 2388 detail: { 2389 text: message, 2390 error: error, 2391 link: link, 2392 }, 2393 }) 2394 ); 2395 }; 2396 if (window.sitebuilderPlaceComponents && window.sitebuilderPlaceComponents.ensureLoaded) { 2397 window.sitebuilderPlaceComponents 2398 .ensureLoaded('place-generictoast') 2399 .then(dispatch) 2400 .catch(function (err) { 2401 console.warn('toast.show fallback (web-components unavailable):', message, err); 2402 }); 2403 } else { 2404 dispatch(); 2405 } 2406 } 2407 } 2408 2409 window.toast = new Toast(); 2410 }); 2411 </script>
2411
2411<script src="https://cdn.jsdelivr.net/npm/@turf/[email protected]/turf.min.js"></script>
2411
2411<script src="https://maps.googleapis.com/maps/api/js?libraries=geocoding,places,marker,drawing&key=AIzaSyAjpuNg6WGCMV5rzoJcIP2QmMTVto6hYmc&map_ids=85c127b7bf0255d9"></script>
2411
2411<script src="https://cdn1.brivityidx.com/assets/js/build.min.js?ck="></script>
2411
2411<script src="https://cdn1.brivityidx.com/assets/js/top_bar_v2.min.js?ck="></script>
2411
2411<script src="https://cdn1.brivityidx.com/assets/js/global_js.min.js?ck=1789512947"></script>
2411
2411<script>deferScript("https://cdn1.brivityidx.com/assets/js/global_js_defer.min.js?ck=1789512947", 5000);</script>
2411
2411<script> 2412 function shouldLoadChatbotImmediately() { 2413 const settingsEl = document.getElementById('hchatbot_settings'); 2414 if (!settingsEl) return false; 2415 2416 const version = Number(settingsEl.dataset.chatbotVersion); 2417 let isInitialized = false; 2418 2419 try { 2420 const session = JSON.parse(sessionStorage.getItem('cbSession') || '{}'); 2421 isInitialized = session.chatbotInitialized === true; 2422 } catch (e) {} 2423 2424 return version > 1 && isInitialized; 2425 } 2426 </script>
2426
2426<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>
2426
2426<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>
2426
2426<script type="text/javascript" src="https://cdn1.brivityidx.com/assets/js/jquery.geocomplete.min.js"></script>
2426<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.bootstrapvalidator/0.5.3/js/bootstrapValidator.min.js"></script>
2426<script type="text/javascript" src="https://cdn1.brivityidx.com/assets/js/menu2.js"></script>
2426<script type="text/javascript" src="https://cdn1.brivityidx.com/assets/js/member_area_components.js"></script>
2426<script type="text/javascript" src="https://cdn1.brivityidx.com/assets/js/update_agent_info.min.js"></script>
2426
2426<script src="https://mobile-component-services-library.s3.amazonaws.com/collections_service.min.js?ck=1"></script>
2426
2426<script src="https://mobile-component-services-library.s3.amazonaws.com/messaging_service.min.js?ck=1"></script>
2426
2426<script>$(document).ready(function(){function changePlaceholder(){if($(window).width()<=556){$("#home_value_my_portal_search_address").attr("placeholder","Address")}else if($(window).width()>556){$("#home_value_my_portal_search_address").attr("placeholder","Enter Property Address")}} 2427$(window).resize(changePlaceholder).trigger('resize')})</script>
2427
2427<script>$(document).ready(function(){$("ul.seo-anchor-links li:nth-of-type(4) a").attr("href","/search")})</script>
2427
2427<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>
2427
2427<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>
2427
2427<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>
2427
2427<script>$("#contact1_availability_date").click(function(){$(this).prop('type','date')})</script>
2427
2427<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>
2427
2427<script>$("a.pb-vendor").attr({"target":"_blank"})</script>
2427
2427<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>
2427
2427<script>$("a.pb-vendor").attr("href","https://brivity.com/")</script>
2427
2427<script>$(document).ready(function(){$('#sign-up-modal.modal #signupForm').append('<input type="hidden" name="tags" value="registration_signup">')})</script>
2427
2427<script>(function(w,i,d,g,e,t){w.WidgetTrackerObject=g;(w[g]=w[g]||function(){(w[g].q=w[g].q||[]).push(arguments)}),(w[g].ds=1*new Date());(e="script"),(t=d.createElement(e)),(e=d.getElementsByTagName(e)[0]);t.async=1;t.src=i;e.parentNode.insertBefore(t,e)})(window,"https://widgetbe.com/agent",document,"widgetTracker");window.widgetTracker("create","WT-XTNLZHLW");window.widgetTracker("send","pageview")</script>
2427
2427<script type="text/javascript"> 2428 /* <![CDATA[ */ 2429 goog_snippet_vars = function() { 2430 var w = window; 2431 w.google_conversion_id = G-KGN2P8TW5Y; 2432 w.google_conversion_label = "5078166533"; 2433 w.google_remarketing_only = false; 2434 } 2435 // DO NOT CHANGE THE CODE BELOW. 2436 goog_report_conversion = function(url) { 2437 goog_snippet_vars(); 2438 window.google_conversion_format = "3"; 2439 var opt = new Object(); 2440 opt.onload_callback = function() { 2441 if (typeof(url) != 'undefined') { 2442 window.location = url; 2443 } 2444 } 2445 var conv_handler = window['google_trackConversion']; 2446 if (typeof(conv_handler) == 'function') { 2447 conv_handler(opt); 2448 } 2449 } 2450 /* ]]> */ 2451 </script>
2451
2451<script type="text/javascript" src="//www.googleadservices.com/pagead/conversion_async.js"> 2452 </script>
2452
2452<script type="text/javascript"> 2453 /* <![CDATA[ */ 2454 var google_conversion_id = G-KGN2P8TW5Y; 2455 var google_custom_params = window.google_tag_params; 2456 var google_remarketing_only = true; 2457 /* ]]> */ 2458 </script>
2458
2458<script type="text/javascript" src="//www.googleadservices.com/pagead/conversion.js"> 2459 </script>
2459 <noscript> <div style="display:inline;"> <img height="1" width="1" style="border-style:none;" alt="" src="//googleads.g.doubleclick.net/pagead/viewthroughconversion/G-KGN2P8TW5Y/?guid=ON&script=0"> </div> </noscript></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.