PageSourceSearch

https://www.housingalerts.com/ha_widgets/partners/embed.js

js housingalerts.com collected 2026-10-06 07:57:10 UTC 36,577 bytes, 884 lines download raw bytes

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.