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"> 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"> 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.