1var searchForm = new Object(); 2var maxItems = 5; 3var storeSlideValues; //Determines if Slide values are getting saved 4 5Number.prototype.extendedFormat = function(declen, partlen, secdelim, decdelim) { 6 var re = '\\d(?=(\\d{' + (partlen || 3) + '})+' + (declen > 0 ? '\\D' : '$') + ')', 7 num = this.toFixed(Math.max(0, ~~declen)); 8 9 return (decdelim ? num.replace('.', decdelim) : num).replace(new RegExp(re, 'g'), '$&' + (secdelim || ',')); 10}; 11 12Number.prototype.format_de = function(declen) { return this.extendedFormat(declen,3,".",","); } 13 14 15jQuery(document).ready(function ($) { 16 17 let config = { 18 "timings": { 19 "result": { 20 slideUp: 0, 21 slideDown: 300 22 }, 23 "searchBar": { 24 slideDown: 100 25 } 26 }, 27 showProductListBelowFilteredProducts: false 28 } 29 // start the search 30 /* 31 $(document).on('submit', '#matrix-search-form', function (ev) { 32 // {{{ 33 // stop form from submitting normally 34 ev.preventDefault(); 35 searchForm.search(); 36 searchForm.getCookie(); 37 // }}} 38 }); 39 */ 40 41 searchForm.setVisibility = function() { 42 // {{{ 43 var filterFields = $(".search-bar-container-inner").children().length; 44 var searchMatrixContainer = $(".-js-search-matrix-container"); 45 var isOnlyPriceFilter = $(".search-bar-container-inner").children(".-js-search-bar-price"); 46 //console.log(filterFields); 47 48 if(filterFields >= 1) { 49 searchMatrixContainer.removeClass("hidden"); 50 } 51 else { 52 /*if((filterFields == 1 && isOnlyPriceFilter) || filterFields == 0) { 53 searchMatrixContainer.addClass("hidden"); 54 }*/ 55 56 searchMatrixContainer.addClass("hidden"); 57 } 58 // }}} 59 } 60 61 searchForm.setPriceSelectorVisibility = function() { 62 // {{{ 63 let num = $("#-js-search-result .-js-price-basic[data-price]").length; 64 if (num > 0) { 65 $(".-js-search-bar-price").removeClass("hidden"); 66 } else { 67 $(".-js-search-bar-price").addClass("hidden"); 68 } 69 // }}} 70 } 71 72 // store states of toggleable elements 73 var states = new Object(); 74 75 // write cookie 76 searchForm.setCookie = function (toggledElem, clickedElem) { 77 // {{{ 78 if (!states[toggledElem.data("field")]) { 79 states[toggledElem.data("field")] = new Object(); 80 } 81 states[toggledElem.data("field")]["open"] = clickedElem.hasClass("open"); 82 $.cookie("dc-search-matrix-stat", JSON.stringify(states)); 83 // }}} 84 }; 85 86 //read cookie 87 searchForm.getCookie = function () { 88 // {{{ 89 //check if cookie exists before doing anything else to avoid undefined errors 90 if (!!$.cookie("dc-search-matrix-stat")) { 91 92 states = JSON.parse($.cookie("dc-search-matrix-stat")); 93 for (i in states) { 94 if (states[i]["open"]) { 95 // open 96 $(".-js-toggleable[data-field=" + i + "]").addClass("open"); 97 $(".-js-toggleable[data-field=" + i + "]").siblings('.-js-toggle-search-matrix').addClass("open"); 98 /* 99 $(".-js-toggleable[data-field=" + i + "]").siblings('.-js-toggle-search-matrix').children('.icon').addClass('-js-maximize'); 100 $(".-js-toggleable[data-field=" + i + "]").siblings('.-js-toggle-search-matrix').children('.icon').removeClass('-js-minimize'); 101 */ 102 103 } else { 104 // close 105 $(".-js-toggleable[data-field=" + i + "]").removeClass("open"); //hide(); 106 $(".-js-toggleable[data-field=" + i + "]").siblings('.-js-toggle-search-matrix').removeClass("open"); 107 /* 108 $(".-js-toggleable[data-field=" + i + "]").siblings('.-js-toggle-search-matrix').children('.icon').addClass('-js-minimize'); 109 $(".-js-toggleable[data-field=" + i + "]").siblings('.-js-toggle-search-matrix').children('.icon').removeClass('-js-maximize'); 110 */ 111 } 112 113 } 114 } 115 // }}} 116 }; 117 118 // update the selection bar 119 searchForm.updateSearchCriteria = function(reset) { 120 // {{{ 121 const action = '/ecommerce/search/matrix/dc_components/search-bar'; 122 let postData = undefined; 123 if (reset) { 124 storeSlideValues = false; 125 const form = $("#matrix-search-form"); 126 //$.each(form.find('input[type=checkbox]'), function (idx, elem) { elem.checked = false; }); 127 $.each(form.find('input[type=checkbox], input[type=radio]'), function (idx, elem) { elem.checked = false; }); 128 postData = form.serialize(); 129 } else { 130 const form = $("#-js-update-search-criteria"); 131 postData = form.serialize(); 132 //console.log(postData); 133 } 134 var posting = $.post(action, postData); 135 posting.done(function (data) { 136 $("#-js-search-bar").empty().append(data); 137 searchForm.show(); 138 //searchForm.prepareContent(); 139 searchForm.getCookie(); 140 searchForm.buildSlider(); 141 searchForm.setVisibility(); 142 }); 143 // }}} 144 } 145 146 searchForm.reset = function () { 147 // {{{ 148 searchForm.updateSearchCriteria(true); 149 searchForm.search("reset"); 150 searchForm.setPriceSelectorVisibility(); 151 152 if (!config.showProductListBelowFilteredProducts) { 153 $("div.product-list").show(); 154 } 155 //$( "#-js-search-result" ).empty(); 156 // }}} 157 }; 158 159 searchForm.search = function (type) { 160 // {{{ 161 162 if (typeof (type) === 'undefined') type = ""; 163 164 const form = $('#matrix-search-form'); 165 form.addClass("loading"); 166 var resultElem = $("#-js-search-result"); 167 //if (form.length == 0) return; 168 //if ($( "#-js-search-result" ).length==0) return; 169 170 //$(form).find('.-js-save-view').addClass('icon-spinner icon-pulse'); 171 172 // Send the data using post 173 let params = $(form).serialize(); 174 if (type == "init") params += "&init_p=t"; 175 if (type == "reset") params += "&reset_p=t"; 176 177 /* 178 resultElem.removeClass("searching-done"); 179 */ 180 /* 181 var animationEvent = "webkitAnimationEnd oanimationend msAnimationEnd animationend"; 182 resultElem.one(animationEvent, function(ev) { 183 d1.resolve("animation done"); 184 }) 185 */ 186 187 // use promises: we only show the search results, 188 // when the animation has finished and the search 189 // results have been aquired 190 var d1 = $.Deferred(); 191 var d2 = $.Deferred(); 192 193 if (resultElem.hasClass("search-done")) { 194 resultElem.slideUp(config.timings.result.slideUp, function() { 195 d1.resolve("animation done"); 196 }); 197 } else { 198 // first search 199 d1.resolve("animation done"); 200 } 201 202 resultElem.removeClass("search-done"); 203 resultElem.addClass("searching"); 204 $(document.body).removeClass("ec-matrix-search-done"); 205 206 // Put the results in a div 207 const posting = $.post("/ecommerce/search/matrix/search", params); 208 posting.done(function (data) { 209 // {{{ 210 $(form).find('.-js-save-view').removeClass('icon-spinner icon-pulse'); 211 if (data == "<!-- no vals -->") { 212 searchForm.setPriceSelectorVisibility(); 213 resultElem.addClass("no-vals"); 214 } 215 //var content = $( data ).find( "#content" ); 216 // wait for animation to end, before swapping the content 217 $.when(d1).done(function() { 218 resultElem.empty(); 219 resultElem.append(data); 220 if (data != "<!-- no vals -->") { 221 resultElem.removeClass("no-vals"); 222 searchForm.updateSearchCriteria(false); 223 } 224 resultElem.slideDown(config.timings.result.slideDown); 225 d2.resolve("searching done"); 226 //console.log("triggering event for", resultElem.get(0)); 227 resultElem.trigger("search-matrix-results-done.dc"); 228 229 if (!config.showProductListBelowFilteredProducts && type != "reset") { 230 $("div.product-list").hide(); 231 } 232 }); 233 234 // show filter vars in URL {{{ 235 //const selectedElems = $(form).find("input[type='checkbox'].hidden-checkbox:checked") 236 const selectableElems = $(form).find("input.hidden-checkbox") 237 238 let url = new URL(window.location); 239 let state = new Object(); 240 241 let selectedNames = new Array(); 242 243 selectableElems.each( (idx, elem) => { 244 //console.log(elem.name, elem.checked); 245 //console.log(idx, elem.name, elem.checked, elem.value); 246 if (elem.checked) { 247 url.searchParams.set(elem.name, elem.value); 248 state[elem.name] = elem.value; 249 selectedNames.push(elem.name); 250 } else { 251 //url.searchParams.delete(elem.name); 252 } 253 }); 254 255 selectableElems.each( (idx, elem) => { 256 if (selectedNames.indexOf(elem.name) < 0) { 257 url.searchParams.delete(elem.name); 258 } 259 }); 260 261 console.log(url.toString()); 262 window.history.pushState(state, "", url.toString()); 263 // }}} 264 265 //resultElem.removeClass("searching"); 266 267 // now we can update the selection bar, because 268 // we know, which products are left 269 // }}} 270 }); 271 272 posting.always(function() { 273 // {{{ 274 resultElem.addClass("search-done"); 275 $(document).trigger("search-done.dc"); 276 if (type != "reset") { 277 $(document.body).addClass("ec-matrix-search-done"); 278 } 279 searchForm.setPriceSelectorVisibility(); 280 if ( $(document).foundation ) $(document).foundation(); 281 //d2.resolve("searching done"); 282 // }}} 283 }); 284 285 $.when(d1,d2).done(function() { 286 resultElem.removeClass("searching"); 287 searchForm.setPriceSelectorVisibility(); 288 //resultElem.addClass("searching-done"); 289 }); 290 // }}} 291 }; 292 293 // init script 294 if (typeof (searchFormInit) !== "undefined") { 295 searchForm.search("init"); 296 } 297 298 $(document).on("click", "#matrix-search-form input[type=checkbox]", function (ev) { 299 searchForm.search(); 300 }); 301 302 $(document).on("click", "input.hidden-checkbox[type=checkbox]+div.hidden-checkbox, input.hidden-checkbox[type=radio]+div.hidden-checkbox", function (idx, elem) { 303 // {{{ 304 var checkbox = $(this).prev()[0]; 305 checkbox.checked = !checkbox.checked; 306 searchForm.search(); 307 // }}} 308 }); 309 310 searchForm.toggle = function () { 311 // {{{ 312 $('div.search-bar-container .selector').slideToggle(); 313 var toggler = $('.-js-toggle-search-matrix-view'); 314 toggler.toggleClass('open'); 315 //toggler.toggleClass('icon-angle-double-right'); 316 //toggler.toggleClass('icon-angle-double-down'); 317 // }}} 318 } 319 320 searchForm.show = function (duration) { 321 // {{{ 322 //$('div.search-bar-container .selector').slideDown({ 'duration': config.timings.searchBar.slideDown }); 323 // var toggler = $('.-js-toggle-search-matrix'); 324 //toggler.removeClass('icon-angle-double-right'); 325 //toggler.addClass('open'); 326 // }}} 327 } 328 329 $(document).on("click", ".-sm-button-show-more", function () { 330 // {{{ 331 332 $(this).parents("ul").toggleClass("children-hidden"); 333 /* 334 if ($(this).siblings("li:gt(" + (maxItems - 2) + ")").is(":visible")) { 335 // hide siblings 336 //$(this).siblings("li:gt(" + (maxItems - 2) + ")").hide(); 337 $(this).parents("ul").addClass("children-hidden"); 338 } else { 339 // show siblings 340 //$(this).siblings("li:gt(" + (maxItems - 2) + ")").show(); 341 $(this).parents("ul").removeClass("children-hidden"); 342 } 343 */ 344 // }}} 345 }); 346 347 // <translate string="684393">Weniger anzeigen</translate> 348 // <translate string="683424">Mehr anzeigen</translate> 349 350 351 $(document).on("click", ".-js-toggle-search-matrix", function (ev) { 352 // {{{
353 //searchForm.toggle(); 354 355 var toggledElem = $(this).siblings('.-js-toggleable'); // use .-js-toggleable 356 $(this).toggleClass('open'); 357 358 toggledElem.toggleClass("open"); 359 searchForm.setCookie(toggledElem, $(this)); 360 //searchForm.setCookie(toggledElem); 361 var icon = $(this).children('i'); 362 icon.toggleClass('-js-maximize'); 363 icon.toggleClass('-js-minimize'); 364 // }}} 365 }); 366 367 $(document).on("click", ".-js-set-price-min-max", function(ev) { 368 // {{{ 369 ev.preventDefault(); 370 var elem = $(this); 371 var p = elem.closest(".-js-search-bar-price"); 372 var s = p.find("#price-range-slider"); 373 var min = parseFloat(s.data("min")); 374 var max = parseFloat(s.data("max")); 375 376 s.slider("values", [min, max]); 377 s.get(0).updateSliderDisplay(min,max); 378 // }}} 379 }) 380 381 /* searchForm.sortByProductCount = function () { 382 var items = $('#cat-selector > li').get(); 383 items.sort(function(a,b){ 384 var keyA = $(a).text(); 385 var keyB = $(b).text(); 386 387 if (keyA < keyB) return -1; 388 if (keyA > keyB) return 1; 389 return 0; 390 }); 391 392 items.sort(function (a, b) { 393 var keyA = $(a).attr("data-num-of-products"); 394 var keyB = $(b).attr("data-num-of-products"); 395 396 if (keyA < keyB) return -1; 397 if (keyA > keyB) return 1; 398 return 0; 399 }); 400 var ul = $('#cat-selector'); 401 $.each(items, function (i, li) { 402 ul.append(li); 403 }); 404 var br = $('#cat-selector > br').get(); 405 ul.append(br); 406 }; 407 */ 408 409 //range slider 410 searchForm.buildSlider = function () { 411 var slider = $("#price-range-slider"); 412 if(slider.length > 0) { 413 // {{{ 414 var sliderMin = slider.data("min"); 415 var sliderMax = slider.data("max"); 416 417 //sliderMinVal = sliderMinVal==""?sliderMin:Math.max(sliderMin, sliderMinVal); 418 //sliderMaxVal = sliderMaxVal==""?sliderMax:Math.min(sliderMax, sliderMaxVal); 419 420 var sliderMinVal = slider.data("min-val"); 421 var sliderMaxVal = slider.data("max-val"); 422 423 // set max/min vals if empty 424 sliderMinVal = sliderMinVal==""?sliderMin:sliderMinVal; 425 sliderMaxVal = sliderMaxVal==""?sliderMax:sliderMaxVal; 426 427 // set max/min to the broadest values, so we don't lose this users settings 428 if(storeSlideValues) { 429 sliderMin = Math.min(sliderMin, sliderMinVal); 430 sliderMax = Math.max(sliderMax, sliderMaxVal); 431 } 432 433 //console.log(sliderMin, sliderMax, sliderMinVal, sliderMaxVal); 434 435 436 var currency = slider.data("currency"); 437 438 if (currency == "") currency = "€"; 439 440 var viewAmount = function(upper, lower) { 441 $("#price-range-display").html( currency + " " + upper.format_de(2) + " - " + currency + " " + lower.format_de(2) ); 442 $("#price-range-list").val(upper + " " + lower); 443 } 444 445 var updateProductVisibility = function(min, max) { 446 // filter products {{{ 447 448 var products; 449 products = $("#-js-search-result .-js-one-product"); 450 if (products.length <= 0) { 451 products = $("#all-products .-js-one-product"); 452 } else { 453 $("#all-products .-js-one-product").removeClass("hidden");; 454 } 455 456 var totalNum = products.length; 457 products.each(function(idx,elem) { 458 elem = $(elem); 459 var price = parseFloat($(elem).find(".-js-price-basic").data("price")); 460 461 if (price != undefined && !isNaN(price) && price != "" && max > 0) { 462 if (price >= min && price <= max) { 463 elem.removeClass("hidden"); 464 } else { 465 elem.addClass("hidden"); 466 totalNum--; 467 } 468 } 469 }); 470 471 $("#-js-search-result .products-number-span").html(totalNum); 472 // }}} 473 } 474 475 var updateSliderDisplay = function( min, max ) { 476 // {{{ 477 viewAmount(min, max); 478 updateProductVisibility(min, max); 479 // }}} 480 } 481 slider.get(0).updateSliderDisplay = updateSliderDisplay; 482 483 // check, if jquery-ui slider is present 484 if (slider.slider != undefined) { 485 // {{{ 486 slider.slider({ 487 range: true, 488 min: Math.max(sliderMin-20,0), 489 max: sliderMax, 490 values: [ storeSlideValues==true?sliderMinVal:Math.max(sliderMin-20,0), storeSlideValues==true?sliderMaxVal:sliderMax ], 491 slide: function( event, ui ) { 492 var min = ui.values[0]; 493 var max = ui.values[1]; 494 updateSliderDisplay(min,max); 495 }, 496 change: function(event, ui) { 497 //Determines whether or not the change event was triggered programmatically or by a user 498 if(event.originalEvent) { 499 //a user did it 500 storeSlideValues = true; 501 } 502 else { 503 //must be program 504 storeSlideValues = false;
505 } 506 } 507 }); 508 viewAmount( slider.slider("values",0), slider.slider("values",1) ); 509 updateProductVisibility( slider.slider("values",0), slider.slider("values",1) ); 510 // }}} 511 } 512 // }}} 513 } 514 } 515 516 //init function 517 searchForm.initMatrix = function () { 518 // {{{ 519 if(Foundation.MediaQuery.current == "small") { 520 //$(".accordion-title").show(); 521 $("#-js-accordion-content").addClass("accordion-content"); 522 $("#-js-accordion-content").attr("data-tab-content", true); 523 $("#-js-accordion-item").addClass("accordion-item"); 524 $("#-js-accordion-item").attr("data-accordion-item", true); 525 var options = {allowAllClosed: true}; 526 new Foundation.Accordion($("#-js-filter-nav"), options); 527 } 528 529 //$('.-js-toggleable').addClass('open'); 530 //$('.-js-toggle-search-matrix').addClass('open'); 531 // var icon = $('.icon'); 532 // icon.toggleClass('-js-maximize'); 533 // icon.toggleClass('-js-minimize'); 534 //searchForm.prepareContent(); 535 searchForm.getCookie(); 536 searchForm.buildSlider(); 537 $(".-js-search-matrix-container").addClass("initialized"); 538 $(".-js-search-matrix-container").removeClass("uninitialized"); 539 searchForm.setVisibility(); 540 searchForm.setPriceSelectorVisibility(); 541 // }}} 542 } 543 searchForm.initMatrix(); 544 545 const form = $("#matrix-search-form"); 546 if (form) { 547 const selectedElems = form.find("input[type='checkbox'].hidden-checkbox:checked") 548 if (selectedElems.length > 0) searchForm.search(); 549 } 550 551})
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.