PageSourceSearch

https://www.marshallgoldmanoh.com/wp-content/themes/aanWordpress/scripts/search_filter.js?20260921191037

js marshallgoldmanoh.com collected 2026-09-30 06:24:54 UTC 9,370 bytes, 248 lines download raw bytes

1$(document).ready(() => {
2    $('#searchfields_holder [id^="multi"]').on('click', function (e) {
3        e.preventDefault();
4
5        const $this = $(this);
6        const target = $this.data('query');
7        const $targetHolder = $('#' + target + '_holder');
8
9        // If this holder is currently visible, just close all
10        if ($targetHolder.is(':visible')) {
11            $('#searchfields_holder [id^="multi"]').removeClass('active');
12            $('.searchContainer').slideUp().removeClass('closed');
13            return;
14        }
15
16        // Close all dropdowns first
17        $('#searchfields_holder [id^="multi"]').removeClass('active');
18        $('.searchContainer').slideUp().removeClass('closed');
19
20        // Open only the clicked one
21        $this.addClass('active');
22        $targetHolder.slideDown().addClass('closed');
23
24        // Always show options inside the dropdown
25        $('#' + target + '_holder .searchfields-options-holder').show();
26    });
27});
28
29// ✅ Close dropdown and remove active class
30let dropClose = () => {
31
32    $('.searchContainer').removeClass('closed').slideUp();
33    $(".makemodal li").removeClass("active");
34};
35
36// ✅ Update selected <li> value and conditionally hide options
37function getLiValue(element, field) {
38    var selVal = $('#multi' + field + '_select > span').html();
39    var dataQuuery = $('#multi' + field + '_select').attr("data-query");
40    var fullText = $(element).find('span:first').clone().children().remove().end().text().trim();
41    var $optionsHolder = $('#' + dataQuuery + '_holder .searchfields-options-holder');
42
43    if ($("body").hasClass("home")) {
44        $('#multi' + field + '_select > span').html(fullText);
45        // Update header search filters display
46        if (typeof adjustHeaderSearchFields === 'function') {
47            adjustHeaderSearchFields();
48        }
49    } else {
50        let makeModelList = [];
51
52        $('#inactive_holder li').each(function () {
53            const text = $(this).find('.result').clone().children().remove().end().text().trim();
54            if (text && text !== 'Clear All') {
55                makeModelList.push(text);
56            }
57        });
58
59        let dataQuuery_text = "";
60
61        if (dataQuuery == "make") {
62            dataQuuery_text = "Select Make";
63        } else if (dataQuuery == "model") {
64            dataQuuery_text = "Select Models";
65        } else if (dataQuuery == "year") {
66            dataQuuery_text = "Select Years";
67        } else if (dataQuuery == "location") {
68            dataQuuery_text = "Select Locations";
69        } else if (dataQuuery == "body") {
70            dataQuuery_text = "Body Type";
71        }
72
73        if (makeModelList.includes(fullText)) {
74            if (selVal == fullText) {
75                fullText = dataQuuery_text;
76
77                // ✅ Hide options in current dropdown
78                $optionsHolder.hide();
79            } else {
80                $optionsHolder.show();
81            }
82
83            $('#multi' + field + '_select > span').html(fullText);
84        } else {
85            $('#multi' + dataQuuery + '_select > span').html(dataQuuery_text);
86            $optionsHolder.show(); // fallback
87        }
88    }
89}
90
91// ✅ Fill dynamic dropdown
92function fillSearchFields(cur_field) {
93    let div1 = '<div class="col-12"><ul>',
94        div2 = '<div class="col-12"><ul>',
95        div3 = '<div class="col-12"><ul>',
96        div4 = '<div class="col-12"><ul>',
97        total = next_search[cur_field].length,
98        number_in_column = parseInt(total / 4) + 1,
99        i = 1,
100        data3 = '',
101        onlyOne = next_search[cur_field] && next_search[cur_field].length === 1,
102        display = next_search[cur_field] && next_search[cur_field].length > 0,
103        $selectLi = $("#multi" + cur_field + "_select"),
104        $labelSpan = $selectLi.children("span").first();
105
106    if ($labelSpan.length && !$selectLi.data("defaultLabel")) {
107        $selectLi.data("defaultLabel", $labelSpan.text().trim());
108    }
109
110    for (var fld in next_search[cur_field]) {
111        var checked = '';
112        var isActiveOption = jQuery.inArray(next_search[cur_field][fld], searchFilter[cur_field]) > -1;
113        if (isActiveOption)
114            checked = ' active';
115
116        var display_total = next_search_totals[cur_field][next_search[cur_field][fld]];
117        var report = next_search[cur_field][fld];
118        let $nameText;
119
120        if (slider_fields.includes(cur_field)) {
121            $nameText = rangesFormat(report);
122        } else if (cur_field == "year") {
123            var start = next_search[cur_field][0];
124            var end = next_search[cur_field][next_search[cur_field].length - 1];
125            if (start == end) {
126                max = Number(start) + 1;
127                min = Number(start) - 1;
128            } else {
129                max = end;
130                min = start;
131            }
132            $nameText = report;
133        } else {
134            $nameText = report;
135        }
136
137        // A single leftover value is shown for context, not as a new filter
138        var leftoverOnly = onlyOne && !isActiveOption;
139        var item = leftoverOnly
140            ? `<li class="clearfix remaining-only">\
141                        <span>${$nameText} <span class="count">/${display_total}</span></span>\
142                    </li>`
143            : `<li class="clearfix${checked}"
144                        onclick="setSearchBy('${cur_field}', '${next_search[cur_field][fld]}', this); getLiValue(this, '${cur_field}'); dropClose()">\
145                        <span>${$nameText} <span class="count">/${display_total}</span></span>\
146                    </li>`;
147
148        if (i <= number_in_column) div1 += item;
149        else if (i <= number_in_column * 2) div2 += item;
150        else if (i <= number_in_column * 3) div3 += item;
151        else div4 += item;
152
153        i++;
154    }
155
156    div1 += '</ul></div>';
157    div2 += '</ul></div>';
158    div3 += '</ul></div>';
159    div4 += '</ul></div>';
160    data3 += div1 + div2 + div3 + div4;
161    data3 += '<br style="clear: both;"><br />';
162
163    if (display) {
164        $("#" + cur_field + "_holder").html(data3);
165        $("#multi" + cur_field + "_select").addClass('open');
166    }
167
168    if ($labelSpan.length) {
169        var fieldIsSelected = typeof searchFilter[cur_field] !== typeof undefined
170            && searchFilter[cur_field] != ""
171            && (typeof searchFilter[cur_field] !== "object" || typeof searchFilter[cur_field][0] !== typeof undefined);
172
173        if (!fieldIsSelected) {
174            if (onlyOne) {
175                $labelSpan.text(next_search[cur_field][0]);
176            } else {
177                var fallback = $selectLi.data("defaultLabel");
178                if (fallback) $labelSpan.text(fallback);
179            }
180        }
181    }
182
183    total_cars_js++;
184}
185
186// Function to display selected filters in header search
187function adjustHeaderSearchFields() {
188    let activated_searches = 0,
189        selected_content = '';
190
191    // Check for keyword search
192    if (typeof searchFilter['stockno'] !== typeof undefined && searchFilter['stockno'] != "") {
193        selected_content += '<li onclick="removeSearchBy(\'stockno\');resetTextFilter()">\
194                                Keyword: \
195                                <span class="result">\
196                                    ' + searchFilter['stockno'] + '\
197                                    <span class="remove">&nbsp;X</span>\
198                                </span>\
199                            </li>';
200        activated_searches++;
201    }
202
203    // Loop through all fields and check for selected values
204    for (var f = 0; f < fields.length; f++) {
205        var cur_field = fields[f];
206
207        if (typeof searchFilter[cur_field] !== typeof undefined
208            && typeof searchFilter[cur_field][0] !== typeof undefined
209            && searchFilter[cur_field] != "") {
210
211            let values_array = slider_fields.includes(cur_field)
212                || from_to_fields.includes(cur_field)
213                || ranges_fields.includes(cur_field)
214                ? [searchFilter[cur_field]]
215                : searchFilter[cur_field];
216
217            values_array.map((report) => {
218                let $nameText;
219                if (cur_field == "price")
220                    $nameText = rangesFormat(report);
221                else if (cur_field == "mileage")
222                    $nameText = rangesFormat(report);
223                else
224                    $nameText = report;
225
226                selected_content += '<li onclick="removeSearchBy(\'' + cur_field + '\', \'' + report + '\');getLiValue(this, \'' + cur_field + '\');adjustHeaderSearchFields()">\
227                                        <span class="result">\
228                                            ' + $nameText + ' \
229                                            <span class="remove">&nbsp;X</span>\
230                                        </span>\
231                                        <ins></ins>\
232                                    </li>';
233            });
234
235            activated_searches++;
236        }
237    }
238
239    // Add "Clear All" button if there are active searches
240    if (activated_searches > 0)
241        selected_content +=
242            `<li onclick="clearAllFilters();resetAllFilters();adjustHeaderSearchFields()">
243                <span class="remove">Clear All</span>
244            </li>`;
245
246    // Update the header inactive holder
247    $("#header_inactive_holder").html(selected_content);
248}

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.