PageSourceSearch

https://www.kp-plattner.at/ecommerce/search/matrix/js/search-matrix.one-column.js

js kp-plattner.at collected 2026-10-06 05:46:55 UTC 17,217 bytes, 551 lines download raw bytes

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 = "&euro;";
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.