1if (typeof(haWidgetsOnLoadEventAttached) == 'undefined') { 2 var haWidgetsOnLoadEventAttached = false; 3} 4 5if (!haWidgetsOnLoadEventAttached) { 6 7 document.addEventListener('click', e => { 8 // Load widgets - assuming accordion or other show/hide buttons are clicked 9 injectWidgets(); 10 }); 11 12 if (window.attachEvent) { 13 window.attachEvent('onload', injectWidgets); 14 } else { 15 if (window.onload) { 16 var curronload = window.onload; 17 var newonload = function(evt) { 18 curronload(evt); 19 injectWidgets(evt); 20 }; 21 window.onload = newonload; 22 } else { 23 window.onload = injectWidgets; 24 } 25 } 26 haWidgetsOnLoadEventAttached = true; 27} 28 29/* ------------------------------------------------------------------------------------------------------- */ 30function getWidgetDivByUid(divUid) { 31 var widgetDivs = document.getElementsByClassName("ha-widget-embed-f1-v1"); 32 33 var widgetIndex = -1; 34 35 for (var index = 0; index < widgetDivs.length; index++) { 36 if (widgetDivs[index].dataset.divUid == divUid) widgetIndex = index; 37 } 38 39 if (widgetIndex < 0 ) { 40 console.log("ERR_DBG134IO"); 41 return 0; 42 } 43 44 widgetDiv = widgetDivs[widgetIndex]; 45 46 return widgetDiv; 47} 48 49/* ------------------------------------------------------------------------------------------------------- */ 50 51function updateZipCode(newZipCode) { 52 injectWidgets({'newZipCode': newZipCode}); 53} 54 55/* ------------------------------------------------------------------------------------------------------- */ 56 57function updateCounty(newCounty) { 58 injectWidgets({'newCounty': newCounty}); 59} 60 61/* ------------------------------------------------------------------------------------------------------- */ 62 63function getZipFromURL() { 64 const paramNames = ['zip', 'zip-code', 'zipcode', 'postal-code', 'postalcode']; 65 var aParamValue = null; 66 for (aParamNameIndex = 0; aParamNameIndex < paramNames.length; aParamNameIndex++) { 67 aParamValue = getParameterByName(paramNames[aParamNameIndex]); 68 if (aParamValue !== null) return aParamValue; 69 } 70 return null; 71} 72 73/* ------------------------------------------------------------------------------------------------------- */ 74function injectWidgets(params) { 75 var callerPageURL = window.location.href; 76 77 var arei_query_str = ''; 78 // if (typeof(ha_offsite_mode) !== 'undefined' && ha_offsite_mode) { 79 // arei_query_str = "&arei_year=" + ha_member.data_year + "&arei_quarter=" + ha_member.data_quarter; 80 // } 81 82 var zipSearchQueryStr = ''; 83 if ((typeof(params) !== 'undefined') && typeof(params.zipSearchTerm) !== 'undefined') { 84 zipSearchQueryStr = "&zip_search_term=" + params.zipSearchTerm; 85 } 86 87 var widgetDivs = document.getElementsByClassName("ha-widget-embed-f1-v1"); 88 89 for (var index = 0; index < widgetDivs.length; index++) { 90 if (typeof(widgetDivs[index].dataset.haWidgetLoaded) != 'undefined' && widgetDivs[index].dataset.haWidgetLoaded == 'true') { 91 if (typeof(params) == 'undefined') continue; 92 if ((typeof(params.divUid) != 'undefined') || typeof params.extCall != 'undefined') { 93 // Updating Individual Widget - proceed even if it was loaded before 94 } else { 95 // Skip a widget - it it already loaded. 96 continue; 97 } 98 } 99 100 if (widgetDivs[index].dataset.haEmbedIds == "ha83291_sblvl3-ctcmrkmx") { 101 console.log("DBG:" + isWidgetVisible(widgetDivs[index])); 102 } 103 104 var mc = widgetDivs[index].dataset.haEmbedMc; 105 106 if (typeof params != 'undefined' && typeof(params.extCallZipCode) == 'string') mc = params.extCallZipCode; 107 108 if (parseInt(mc) > 10000000 && getZipFromURL() !== null) { // Original ID is a ZIP id && a new value is in the URL 109 mc = "" + parseInt(10000000 + parseInt(getZipFromURL())); 110 } 111 112 if (mc.length == 8 && typeof(params) != 'undefined' && typeof(params.newZipCode) != 'undefined') { 113 // ZIP CODE WIDGET 114 mc = "" + parseInt(10000000 + parseInt(params.newZipCode)); 115 } 116 117 118 if (typeof(params) != 'undefined' && typeof(params.newCounty) != 'undefined') { 119 // ZIP CODE WIDGET 120 mc = "" + (parseInt(params.newCounty) - 4921); 121 } 122 123 var ids = widgetDivs[index].dataset.haEmbedIds; 124 125 var embedModeFromDiv = 'dynamic'; 126 if (typeof widgetDivs[index].dataset.haEmbedMode !== 'undefined') { 127 embedModeFromDiv = widgetDivs[index].dataset.haEmbedMode; 128 } 129 var p = {}; 130 if (typeof widgetDivs[index].dataset.divUid !== 'undefined') { 131 p.divUid = widgetDivs[index].dataset.divUid; 132 } else { 133 p.divUid = 'laskdjfh4' + index; 134 } 135 136 widgetDivs[index].dataset.divUid = p.divUid; 137 138 var stateQueryStr = ""; 139 if (widgetDivs[index].getElementsByClassName("ha-widget-fixed-state").length > 0) { 140 stateQueryStr = "&state=" + widgetDivs[index].getElementsByClassName("ha-widget-fixed-state")[0].value; 141 } 142 143 if (typeof(params) != 'undefined' && typeof(params.divUid) != 'undefined') { 144 // Update Individual Widget 145 if (widgetDivs[index].dataset.divUid == params.divUid) { 146 p.mc = params.mc; 147 148 p.sortType = params.sortType; 149 p.sortTypeToplist = params.sortTypeToplist; 150 151 if (typeof(params.initiator) != 'undefined' && params.initiator == 'sort') { 152 var sortTypeInput = widgetDiv.getElementsByClassName("ha-widget-best-state-" + params.sortType)[0]; 153 p.mc = sortTypeInput.value; 154 155 if (widgetDiv.getElementsByClassName("ha-widget-fixed-state").length > 0) { 156 p.mc = widgetDiv.getElementsByClassName("ha-widget-fixed-state")[0].value; 157 } 158 } 159 160 p.url = "https://www.housingalerts.com/ha_widgets/partners/getwidget/?ids=" + ids + "&mc=" + p.mc + "&m
160kt_select_sort=" + params.sortType + "&toplist_sort=" + params.sortTypeToplist + "&divUid=" + p.divUid + "&variation=" + "" + "&caller=" + encodeURI( callerPageURL.replace("#","") ) + arei_query_str + zipSearchQueryStr + stateQueryStr; 161 162 if (typeof(params.initiator) != 'undefined') { 163 p.url += "&initiator=" + params.initiator; 164 } 165 166 167 p.embedMode = 'dynamic'; // Always! 168 loadWidgetContent(p); 169 widgetDivs[index].dataset.haWidgetLoaded = 'true'; 170 } 171 } else { 172 // Update Every Widget 173 174 // Put the "Loading" message to the placeholder: 175 if (widgetDivs[index].dataset.haEmbedMode != 'inline') { 176 if (isWidgetVisible(widgetDivs[index])) { 177 widgetDivs[index].innerHTML = pleaseWaitHTML; 178 } else { 179 widgetDivs[index].innerHTML = 'IVSBL'; 180 } 181 } 182 183 if (isWidgetVisible(widgetDivs[index])) { 184 p.url = "https://www.housingalerts.com/ha_widgets/partners/getwidget/?ids=" + ids + "&mc=" + mc + "&divUid=" + p.divUid + "&caller=" + encodeURI( callerPageURL ) + "&variation=" + "" + arei_query_str + stateQueryStr; 185 p.mc = mc; 186 p.sortType = 'alpha'; 187 p.embedMode = embedModeFromDiv; 188 loadWidgetContent(p); 189 widgetDivs[index].dataset.haWidgetLoaded = 'true'; 190 } 191 } 192 } 193} 194/* ------------------------------------------------------------------------------------------------------- */ 195function isWidgetVisible(el) { 196 197 if (el.classList.contains("arei-list01") || el.classList.contains("arei-list02")) return true; // AREI 198 199 if (el.offsetParent === null) return false; // One of the parents is explicitly hidden 200 201 currEl = el; 202 while (currEl.parentNode) { 203 currEl = currEl.parentNode; 204 if (currEl.offsetHeight == 0 && !currEl.classList.contains("Screen-Inner")) return false; // Accordeon div collapsed? 205 } 206 207 return true; 208} 209/* ------------------------------------------------------------------------------------------------------- */ 210function enableOneToolInfotab(widgetDiv, widgetGUID, toolCode) { 211 var infotabClickableTitleClassName = "ha-title-infotab-click-" + toolCode + "-" + widgetGUID; 212 var infotabCloseClickClassName = "ha-infotab-close-click-" + toolCode + "-" + widgetGUID; 213 var infotabDivClassName = "ha-infotab-tools-" + toolCode; 214 215 if ( widgetDiv.getElementsByClassName(infotabClickableTitleClassName).length > 0 ) { 216 var infotabClickableTitle = widgetDiv.getElementsByClassName(infotabClickableTitleClassName)[0]; 217 infotabClickableTitle.onclick = function() { 218 this.classList.toggle('ha-close'); 219 if ( widgetDiv.getElementsByClassName(infotabDivClassName).length > 0 ) { 220 infotabDiv = widgetDiv.getElementsByClassName(infotabDivClassName)[0]; 221 infotabDiv.classList.toggle('ha-revealed'); 222 } 223 } 224 } 225 226 if ( widgetDiv.getElementsByClassName(infotabCloseClickClassName).length > 0 ) { 227 var infotabCloseClickElement = widgetDiv.getElementsByClassName(infotabCloseClickClassName)[0]; 228 infotabCloseClickElement.onclick = function() { 229 if ( widgetDiv.getElementsByClassName(infotabDivClassName).length > 0 ) { 230 infotabDiv = widgetDiv.getElementsByClassName(infotabDivClassName)[0]; 231 infotabDiv.classList.remove('ha-revealed'); 232 } 233 if ( widgetDiv.getElementsByClassName(infotabClickableTitleClassName).length > 0 ) { 234 var infotabClickableTitle = widgetDiv.getElementsByClassName(infotabClickableTitleClassName)[0]; 235 infotabClickableTitle.classList.remove('ha-close'); 236 } 237 } 238 } 239} 240/* ------------------------------------------------------------------------------------------------------- */ 241function enableAllToolInfotabs(widgetDiv, widgetGUID) { 242 enableOneToolInfotab(widgetDiv, widgetGUID, 'star'); 243 enableOneToolInfotab(widgetDiv, widgetGUID, 'tapsslider'); 244 enableOneToolInfotab(widgetDiv, widgetGUID, 'chart'); 245 enableOneToolInfotab(widgetDiv, widgetGUID, 'msgauge'); 246 enableOneToolInfotab(widgetDiv, widgetGUID, 'msslider'); 247 enableOneToolInfotab(widgetDiv, widgetGUID, 'gauges'); 248 enableOneToolInfotab(widgetDiv, widgetGUID, 'wealthphase'); 249 enableOneToolInfotab(widgetDiv, widgetGUID, 'toplist'); 250 enableOneToolInfotab(widgetDiv, widgetGUID, 'cfrslider'); 251} 252/* ------------------------------------------------------------------------------------------------------- */ 253function watchCOntainerSize(widgetDiv) { 254 // const containerWidth = widgetDiv.clientWidth; 255 const containerWidth = widgetDiv.parentElement.clientWidth; 256 setTimeout(function() {watchCOntainerSize(widgetDiv); },1000); 257 if (containerWidth < 10) return 0; // Probably a div, that's not visible 258 const largestSizeClass = 'ha-widget-1024';
259 const sizesToClasses = { 260 '399' : 'ha-widget-mobile', 261 '400' : 'ha-widget-400', 262 '500' : 'ha-widget-500', 263 '600' : 'ha-widget-600', 264 '768' : 'ha-widget-768', 265 '700' : 'ha-widget-700', 266 '800' : 'ha-widget-800', 267 '900' : 'ha-widget-900', 268 '992' : 'ha-widget-992', 269 '1024' : largestSizeClass 270 } 271 var classToAdd = null; 272 for (var index in sizesToClasses) { 273 if (classToAdd == null && (parseInt(index) > containerWidth)) { // Assign 1st larger classs 274 classToAdd = sizesToClasses[index]; 275 } 276 } 277 278 if (classToAdd == null) classToAdd = largestSizeClass; 279 280 for (var index in sizesToClasses) { 281 if (sizesToClasses[index] != classToAdd) { 282 widgetDiv.classList.remove(sizesToClasses[index]); // remove any other class - in case size has changed and it was applied before 283 } 284 } 285 // console.log("Adding container size class:" + classToAdd + "size detected:" + containerWidth); 286 widgetDiv.classList.add(classToAdd); 287} 288/* ------------------------------------------------------------------------------------------------------- */ 289// The debounce function receives our function as a parameter 290function debounce(fn) { 291 // This holds the requestAnimationFrame reference, so we can cancel it if we wish 292 let frame; 293 // The debounce function returns a new function that can receive a variable number of arguments 294 return (...params) => { 295 // If the frame variable has been defined, clear it now, and queue for next frame 296 if (frame) { 297 cancelAnimationFrame(frame); 298 } 299 // Queue our function call for the next frame 300 frame = requestAnimationFrame(() => { 301 // Call our function and pass any params we received 302 fn(...params); 303 }); 304 } 305}; 306 307/* ------------------------------------------------------------------------------------------------------- */ 308 309function initToplistScroll(scrollingElement, widgetDiv) { 310 // Reads out the scroll position and stores it in the data attribute 311 // so we can use it in our stylesheets 312 const storeScroll = () => { 313 // document.documentElement.dataset.scroll = window.scrollY; 314 // console.log("SCROLL"); 315 316 var indicatorUp = widgetDiv.getElementsByClassName('ha-top-list-scroll-indicator-up')[0]; 317 var indicatorDown = widgetDiv.getElementsByClassName('ha-top-list-scroll-indicator-down')[0]; 318 var indicatorContainer = widgetDiv.getElementsByClassName('ha-top-list-indicator')[0]; 319 320 321 if (scrollingElement.clientHeight >= scrollingElement.scrollHeight ) { 322 // No scrollbar is available at all 323 indicatorContainer.classList.remove('ha-scroll-active'); 324 } else { 325 indicatorContainer.classList.add('ha-scroll-active'); 326 } 327 328 if (scrollingElement.scrollTop > 0) { 329 // Show top div 330 // console.log("show top"); 331 // indicatorUp.style.display = "block"; 332 indicatorUp.classList.add('ha-scroll-available'); 333 } else { 334 // Hide top div 335 // console.log("hide top"); 336 // indicatorUp.style.display = "none"; 337 indicatorUp.classList.remove('ha-scroll-available'); 338 } 339 340 if ((scrollingElement.clientHeight + scrollingElement.scrollTop) < scrollingElement.scrollHeight) { 341 // Show bottom div 342 // console.log("show bottom"); 343 // indicatorDown.style.display = "block"; 344 indicatorDown.classList.add('ha-scroll-available'); 345 } else { 346 // Hide bottom div 347 // console.log("hide bottom"); 348 // indicatorDown.style.display = "none"; 349 indicatorDown.classList.remove('ha-scroll-available'); 350 } 351 } 352 353 // Listen for new scroll events, here we debounce our `storeScroll` function 354 scrollingElement.addEventListener('scroll', debounce(storeScroll), { passive: true }); 355 356 // Update scroll position for first time 357 storeScroll(); 358} 359/* ------------------------------------------------------------------------------------------------------- */ 360function initWidgetAfterLoading(params) { 361 widgetDiv = getWidgetDivByUid(params.divUid); 362 363 var msaMode = false;
364 var countyMode = false; 365 var zip5Mode = false; 366 367 if (widgetLayoutClass = widgetDiv.getElementsByClassName("ha-widget-layout-class").length > 0) { 368 var widgetLayoutClass = widgetDiv.getElementsByClassName("ha-widget-layout-class")[0].value; 369 widgetDiv.classList.add(widgetLayoutClass); 370 } 371 372 if (widgetLayoutClass = widgetDiv.getElementsByClassName("ha-widget-block-classes").length > 0) { 373 var widgetLayoutClass = widgetDiv.getElementsByClassName("ha-widget-block-classes")[0].value; 374 const widgetLayoutClasses = widgetLayoutClass.split(" "); 375 for (var i in widgetLayoutClasses) { 376 if (typeof(widgetLayoutClasses[i]) == 'string' && widgetLayoutClasses[i] != '') widgetDiv.classList.add(widgetLayoutClasses[i]); 377 } 378 } 379 380 var widgeAccessType = "unknown_access_type"; 381 if (widgetDiv.getElementsByClassName("ha-widget-access-type").length > 0) { 382 var widgeAccessType = widgetDiv.getElementsByClassName("ha-widget-access-type")[0].value; 383 } 384 385 if (typeof(widgetDiv.getElementsByClassName("ha-widget-guid")[0]) == 'undefined') return 0; 386 var widgetGUID = widgetDiv.getElementsByClassName("ha-widget-guid")[0].value; 387 // console.log("wguid_mkt:" + widgetGUID); 388 389 enableAllToolInfotabs(widgetDiv, widgetGUID); 390 391 392 var statesSelects = {}; 393 if (widgetDiv.getElementsByClassName("ha-states-select").length > 0) { 394 statesSelects = widgetDiv.getElementsByClassName("ha-states-select"); 395 } 396 397 398 if ( widgetDiv.getElementsByClassName("ha-msas-select").length > 0 ) { 399 msaMode = true; 400 msasSelects = widgetDiv.getElementsByClassName("ha-msas-select"); 401 } 402 403 if ( widgetDiv.getElementsByClassName("ha-counties-select").length > 0 ) { 404 countyMode = true; 405 countiesSelects = widgetDiv.getElementsByClassName("ha-counties-select"); 406 } 407 408 if ( widgetDiv.getElementsByClassName("ha-zip5s-select").length > 0 ) { 409 zip5Mode = true; 410 zip5sSelects = widgetDiv.getElementsByClassName("ha-zip5s-select"); 411 } 412 413 var sortRadios = widgetDiv.getElementsByClassName('ha-widget-sort-radio'); 414 415 416 var marketSortType = '---'; 417 var toplistSortType = '---'; 418 419 if (widgetDiv.getElementsByClassName("ha-widget-market-sort-type").length > 0) { 420 var marketSortType = widgetDiv.getElementsByClassName("ha-widget-market-sort-type")[0].value; 421 } 422 if (widgetDiv.getElementsByClassName("ha-js-widget-toplist-sort-type").length > 0) { 423 var toplistSortType = widgetDiv.getElementsByClassName("ha-js-widget-toplist-sort-type")[0].value; 424 } 425 426 for (var i = 0, length = sortRadios.length; i < length; i++) { 427 if (sortRadios[i].value == marketSortType /*params.sortType*/) { 428 //if (sortRadios[i].checked != 'checked') { 429 sortRadios[i].checked = true;//'checked'; 430 // } 431 } 432 sortRadios[i].onchange = function() { 433 var sortType = 'alpha'; // default 434 435 for (var i = 0, length = sortRadios.length; i < length; i++) { 436 if (sortRadios[i].checked) { 437 sortType = sortRadios[i].value; 438 } 439 } 440 var p = {}; 441 p.divUid = params.divUid; 442 p.mc = params.mc; 443 p.sortType = sortType; 444 p.initiator = 'sort'; 445 446 stateSelectWait(p.divUid); 447 injectWidgets(p); 448 } 449 } 450 451 452 var sortSelects = widgetDiv.getElementsByClassName('ha-widget-sort-select'); 453 if (sortSelects.length == 1) { 454 sortSelects[0].value = marketSortType; 455 sortSelects[0].onchange = function() { 456 var p = {}; 457 p.divUid = params.divUid; 458 p.mc = params.mc; 459 p.sortTypeToplist = toplistSortType; 460 p.sortType = this.value; 461 p.initiator = 'sort'; 462 stateSelectWait(p.divUid); 463 injectWidgets(p); 464 } 465 } 466 467 468 469 function markToplistSortButtonSelected(buttons, value) { 470 for (var i = 0, length = buttons.length; i < length; i++) { 471 var toplistSortButtonSelectedCSSClass = "ha-list-selected"; 472 if ( buttons[i].dataset.value == value ) { 473 buttons[i].classList.add(toplistSortButtonSelectedCSSClass); 474 } else { 475 buttons[i].classList.remove(toplistSortButtonSelectedCSSClass); 476 } 477 } 478 } 479 480 var toplistSortButtons = widgetDiv.getElementsByClassName('ha-js-widget-toplist-sort-button'); 481 if (toplistSortButtons.length > 0) markToplistSortButtonSelected(toplistSortButtons, toplistSortType); 482 for (var i = 0, length = toplistSortButtons.length; i < length; i++) { 483 // Add click listener: 484 toplistSortButtons[i].onclick = function() { 485 markToplistSortButtonSelected(toplistSortButtons, this.dataset.value); 486 487 var p = {}; 488 p.divUid = params.divUid; 489 p.mc = params.mc; 490 p.sortType = this.dataset.value; //marketSortType; 491 p.sortTypeToplist = this.dataset.value; 492 p.initiator = 'sort_toplist'; 493 494 stateSelectWait(p.divUid); 495 injectWidgets(p); 496 } 497 } 498 499 500 var toplistSortSelects = widgetDiv.getElementsByClassName('ha-js-widget-toplist-sort-select'); 501 if (toplistSortSelects.length == 1) { 502 toplistSortSelects[0].value = toplistSortType; 503 toplistSortSelects[0].onchange = function() { 504 var p = {}; 505 p.divUid = params.divUid; 506 p.mc = params.mc; 507 p.sortType = this.value; //marketSortType; 508 p.sortTypeToplist = this.value; 509 p.initiator = 'sort_toplist'; 510 511 stateSelectWait(p.divUid); 512 injectWidgets(p); 513 } 514 } 515 516 517 var zipSearchButtons = widgetDiv.getElementsByClassName('ha-js-widget-zip-search-button'); 518 for (var i = 0, length = zipSearchButtons.length; i < length; i++) { 519 // Add click listener: 520 zipSearchButtons[i].onclick = function() { 521 522 widgetDiv = getWidgetDivByUid(params.divUid); 523 524 var zipSearchInputs = widgetDiv.getElementsByClassName('ha-js-widget-zip-search-input'); 525 if (zipSearchInputs.length > 0) { 526 if (zipSearchInputs[0].value.length != 5) { 527 alert('Please Enter 5-digit Zip code'); 528 return 0; 529 } 530 var p = {}; 531 p.zipSearchTerm = parseInt(zipSearchInputs[0].value) + 10000000; 532 p.divUid = params.divUid; 533 p.mc = params.mc; 534 p.sortType = this.dataset.value; //marketSortType; 535 p.sortTypeToplist = this.dataset.value; 536 p.initiator = 'sort_toplist'; 537 538 stateSelectWait(p.divUid); 539 injectWidgets(p); 540 } else { 541 console.log("ERR_EEWIE153"); 542 } 543 } 544 } 545 546 547 var stateIdSelected = 0; 548 if ( widgetDiv.getElementsByClassName("ha-widget-state-selected").length > 0) { 549 stateIdSelected = widgetDiv.getElementsByClassName("ha-widget-state-selected")[0].value; 550 } 551 552 if (typeof(statesSelects) != 'undefined' && statesSelects.length > 0) { 553 for (stateSelectIndex = 0; stateSelectIndex < statesSelects.length; stateSelectIndex++ ) { 554 statesSelects[stateSelectIndex].value = stateIdSelected; 555 } 556 } 557 558 if ( msaMode ) { 559 var msaIdSelected = widgetDiv.getElementsByClassName("ha-widget-msa-selected")[0].value; 560 if (typeof(msasSelects) != 'undefined' && msasSelects.length > 0) { 561 562 for (msaSelectIndex = 0; msaSelectIndex < msasSelects.length; msaSelectIndex++ ) { 563 msasSelects[msaSelectIndex].onchange = function() { 564 var mc = this.options[this.selectedIndex].value; 565 var p = {}; 566 p.divUid = params.divUid; 567 p.mc = mc; 568 p.sortType = marketSortType; 569 p.sortTypeToplist = toplistSortType; 570 571 stateSelectWait(p.divUid); 572 injectWidgets(p); 573 }; 574 } 575 576 for (msaSelectIndex = 0; msaSelectIndex < msasSelects.length; msaSelectIndex++ ) { 577 msasSelects[msaSelectIndex].value = msaIdSelected; 578 } 579 } 580 } 581 582 if ( countyMode ) { 583 var countyIdSelected = widgetDiv.getElementsByClassName("ha-widget-county-selected")[0].value; 584 if (typeof(countiesSelects) != 'undefined' && countiesSelects.length > 0) { 585 586 for (countySelectIndex = 0; countySelectIndex < countiesSelects.length; countySelectIndex++ ) { 587 countiesSelects[countySelectIndex].onchange = function() { 588 var mc = this.options[this.selectedIndex].value; 589 var p = {}; 590 p.divUid = params.divUid; 591 p.mc = mc; 592 p.sortType = marketSortType; 593 p.sortTypeToplist = toplistSortType; 594 595 stateSelectWait(p.divUid); 596 injectWidgets(p); 597 }; 598 } 599 600 for (countySelectIndex = 0; countySelectIndex < countiesSelects.length; countySelectIndex++ ) { 601 countiesSelects[countySelectIndex].value = countyIdSelected; 602 } 603 } 604 } 605 606 if ( zip5Mode ) { 607 var zip5IdSelected = widgetDiv.getElementsByClassName("ha-widget-zip5-selected")[0].value; 608 if (typeof(zip5sSelects) != 'undefined' && zip5sSelects.length > 0) { 609 610 for (zip5SelectIndex = 0; zip5SelectIndex < zip5sSelects.length; zip5SelectIndex++ ) { 611 zip5sSelects[zip5SelectIndex].onchange = function() { 612 var mc = this.options[this.selectedIndex].value; 613 var p = {}; 614 p.divUid = params.divUid; 615 p.mc = mc; 616 p.sortType = marketSortType; 617 p.sortTypeToplist = toplistSortType; 618 619 stateSelectWait(p.divUid); 620 injectWidgets(p); 621 }; 622 } 623 624 for (zip5SelectIndex = 0; zip5SelectIndex < zip5sSelects.length; zip5SelectIndex++ ) { 625 zip5sSelects[zip5SelectIndex].value = zip5IdSelected; 626 } 627 } 628 } 629 630 if (typeof(statesSelects) != 'undefined' && statesSelects.length > 0) { 631 for (stateSelectIndex = 0; stateSelectIndex < statesSelects.length; stateSelectIndex++ ) { 632 statesSelects[stateSelectIndex].onchange = function() { 633 var sortType = 'alpha'; // default 634 var mc = this.options[this.selectedIndex].value; 635 636 if (widgetDiv.getElementsByClassName("ha-widget-market-sort-type").length > 0) { 637 sortType = widgetDiv.getElementsByClassName("ha-widget-market-sort-type")[0].value; 638 } 639 640 641 for (var i = 0, length = sortRadios.length; i < length; i++) { 642 if (sortRadios[i].checked) { 643 sortType = sortRadios[i].value; 644 } 645 } 646 647 var p = {}; 648 p.divUid = params.divUid; 649 p.mc = mc; 650 p.sortType = sortType; 651 p.sortTypeToplist = toplistSortType; 652 653 stateSelectWait(p.divUid); 654 injectWidgets(p); 655 }; 656 } 657 } 658 659 if ((typeof(ha_widgets_mode_paid) == 'undefined' && widgeAccessType != 'free') || (typeof(ha_widgets_mode_paid) != 'undefined' && ha_widgets_mode_paid)) { // ha_widgets_mode_paid is only present on HA pages for Paid HA users 660 widgetDiv = getWidgetDivByUid(params.divUid); 661 var grayGauges = widgetDiv.getElementsByClassName("ha-gauge-master-gray"); 662 for (var i = 0; i < grayGauges.length; i++) { 663 grayGauges[i].classList.add('hidden'); 664 grayGauges[i].classList.remove('show'); 665 } 666 var colorGauges = widgetDiv.getElementsByClassName("ha-gauge-master-active"); 667 for (var i = 0; i < colorGauges.length; i++) { 668 colorGauges[i].classList.add('show'); 669 colorGauges[i].classList.remove('hidden'); 670 } 671 } 672 673 674 // ------------- Show/Hide scroll availability indicators------------------ 675 var toplistScrollingDivs = widgetDiv.getElementsByClassName('ha-top-list-scrolling'); 676 if (toplistScrollingDivs.length > 0) { 677 initToplistScroll(toplistScrollingDivs[0], widgetDiv); 678 } 679 // ------------------------------------------------------------------------ 680 681 //------Add conditional styles based on container size:---- 682 watchCOntainerSize(widgetDiv); 683 //--------------------------------------------------------- 684 doChart(params.mc); 685 //--------------------------------------------------------- 686 loadMarketSummary(params.mc); 687 688 689 jQuery('[data-js="loading-box"]').fadeOut(300); 690} 691/* ------------------------------------------------------------------------------------------------------- */ 692function loadWidgetContent(params) { 693 if (params.embedMode == 'inline') { 694 initWidgetAfterLoading(params); 695 } else { 696 697 if (window.XMLHttpRequest) 698 {// code for IE7+, Firefox, Chrome, Opera, Safari 699 var xmlhttp=new XMLHttpRequest(); 700 } 701 else 702 {// code for IE6, IE5 703 var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 704 } 705 xmlhttp.onreadystatechange=function() 706 { 707 if (xmlhttp.readyState==4 && xmlhttp.status==200) 708 { 709 widgetDiv = getWidgetDivByUid(params.divUid); 710 widgetDiv.innerHTML = xmlhttp.responseText; 711 initWidgetAfterLoading(params); 712 } 713 } 714 xmlhttp.open("GET", params.url, true); 715 xmlhttp.send(); 716 } 717 // console.log("loadWidgetContent Exitting..."); 718} 719/* ------------------------------------------------------------------------------------------------------- */ 720function stateSelectWait(divUid) { 721 widgetDiv = getWidgetDivByUid(divUid); 722 723 if (widgetDiv.getElementsByClassName("ha-market-select-wait-js").length > 0) { 724 var x = widgetDiv.getElementsByClassName("ha-market-select-wait-js"); 725 for (var i = 0; i < x.length; i++) { 726 // console.log("Showing Wait for :" + divUid ) 727 x[i].classList.add('ha-select-active'); 728 } 729 } 730} 731/* ------------------------------------------------------------------------------------------------------- */ 732function getParameterByName(name, url = window.location.href) { 733 name = name.replace(/[\[\]]/g, '\\$&'); 734 var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'), 735 results = regex.exec(url); 736 if (!results) return null; 737 if (!results[2]) return ''; 738 return decodeURIComponent(results[2].replace(/\+/g, ' ')); 739} 740/* ------------------------------------------------------------------------------------------------------- */ 741function doChart(mc) { 742 if (!document.getElementById('minichatCanvas')) return 0; 743 if (typeof document.getElementById('minichatCanvas') != 'object') return 0; 744 if (typeof haMinichart != 'object') return 0; 745 var minichartParams = {}; 746 minichartParams.marketID = mc; 747 748 minichartParams.csr = 50; 749 minichartParams.noResponsive = true; 750 minichartParams.noTitle = true; 751
752 if (typeof widget_minichart_csr != 'undefined') { 753 minichartParams.csr = widget_minichart_csr; 754 if (parseInt(widget_minichart_csr) == 1) minichartParams.marketID = parseInt(mc) + 4921; 755 if (parseInt(widget_minichart_csr) == 2) { 756 // minichartParams.marketID = parseInt(mc) + 4921; 757 minichartParams.marketID = parseInt(widget_minichart_market_id) + 4921; 758 } 759 } 760 761 haMinichart.showChart(minichartParams); 762} 763/* ------------------------------------------------------------------------------------------------------- */ 764function loadMarketSummary(mc) { 765 if (mc == undefined) return 0; 766 console.log("Loading Market Summary for:" + mc); 767 768 // const url = "https://appds.housingalerts.com/api/market_summary_report?marketId=" + mc + "&marketIdType=plain_zip5d"; 769 const url = "https://smfctnr.housingalerts.com/api/market_summary_report?marketId=" + mc + "&marketIdType=plain_zip5d"; 770 const containerId = "ai_summary_div_dynamic"; 771 772 // Get the container element 773 const containerDiv = document.getElementById(containerId); 774 if (!containerDiv) { 775 console.log("Container element not found: " + containerId); 776 return 0; 777 } 778 779 // Show loading indicator 780 containerDiv.innerHTML = "<div class='ha-loading-indicator'>Loading market summary...</div>"; 781 782 // Create and send the request 783 if (window.XMLHttpRequest) { 784 // code for IE7+, Firefox, Chrome, Opera, Safari 785 var xmlhttp = new XMLHttpRequest(); 786 } else { 787 // code for IE6, IE5 788 var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 789 } 790 791 xmlhttp.onreadystatechange = function() { 792 if (xmlhttp.readyState == 4) { 793 if (xmlhttp.status == 200) { 794 try { 795 // Parse the JSON response 796 const response = JSON.parse(xmlhttp.responseText); 797 798 // Check if the request was successful 799 if (response.success === true && response.report) { 800 // Update the container with the HTML report from the JSON 801 containerDiv.innerHTML = response.report; 802 } else { 803 // Handle API error 804 console.log("API returned error or invalid data"); 805 containerDiv.innerHTML = "Unable to load market summary. Please try again later."; 806 } 807 } catch (e) { 808 // Handle JSON parsing error 809 console.log("Error parsing JSON response: " + e.message); 810 containerDiv.innerHTML = "Error processing market summary data."; 811 } 812 } else { 813 // Handle HTTP error 814 console.log("Error loading market summary: " + xmlhttp.status); 815 containerDiv.innerHTML = "Error loading market summary. Please try again later.<br>"; 816 } 817 } 818 } 819 820 // Send the request 821 xmlhttp.open("GET", url, true); 822 823 // Add CORS headers to the request 824 xmlhttp.withCredentials = false; // Set to true if you need to send cookies with the request 825 826 xmlhttp.send(); 827} 828/* ------------------------------------------------------------------------------------------------------- */ 829 830/* Show/hide "Loading" overlay during load time */ 831 832setTimeout(function() { 833 var widgetblocks = document.getElementsByClassName("ha-widget-embed-f1-v1"), 834 len = widgetblocks != null ? widgetblocks.length : 0, 835 i = 0; 836 for(i; i < len; i++){ 837 widgetblocks[i].classList.add("ha-loaded"); 838 } 839}, 4*1000); // Time in seconds 840 841/* ------------------------------------------------------------------------------------------------------- */ 842 843 844/* Enable "Compact Layout" Setup */ 845 846function trigger_compact_layout(name) { 847 var compactblock = document.getElementById(name); 848 compactblock.classList.toggle('ha-revealed'); 849} 850 851/* ------------------------------------------------------------------------------------------------------- */ 852 853var pleaseWaitHTML = `<div class="ha-loading-notice"> 854 <div class="ha-widget-content-wrapper"> 855 <div class="ha-widget-content-col-1 ha-widget-header"> 856 <div class="ha-powered-logo-block">
857 <span class="ha-widget-title">Powered by:</span> 858 <span class="ha-widget-logo"> 859 <img class="ha-widget-images" src="https://www.housingalerts.com/ha_widgets/images/HousingAlerts.png"> 860 </span><!-- /.ha-widget-logo --> 861 </div><!-- /.ha-powered-logo-block --> 862 </div><!-- /.ha-widget-header --> 863 864 <div class="ha-widget-content-col-2"> 865 866 <div class="ha-widgets-wrapper"> 867 868 <div class="ha-loading-message"> 869 <span class="ha-loading-text">Loading... Please Wait</span> 870 <div class="ha-loader"></div> 871 </div> 872 873 <p class="Loading-Notice" align="center"> For Assistance Please Contact: <br class="ha-break-only"><a href="mailto:[email protected]">[email protected]</a> </p> 874 875 </div><!-- /.ha-widget-wrapper --> 876 877 </div><!-- /.ha-widget-content --> 878 879 </div><!-- /.ha-widget-content-wrapper --> 880</div>`; 881 882/* ------------------------------------------------------------------------------------------------------- */ 883 884
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.