https://www.doellken-profiles.com/_assets/38c6014cba00ed6ba2a4b724…/jquery.decorfinder.js?1784812926
1(function ($) { 2 var decorfinder = { 3 settings: { 4 filterContainer: '.decorfinder-filter', 5 filterFormIdentifier: 'form.decorfinder', 6 listContainer: '.decorfinder-list', 7 searchUrl: '/?id=10047&type=5000', 8 manufacturer: '[name="manufacturer"]', 9 collection: '[name="collection"]', 10 resetBtn: '[data-resetbutton]', 11 language: 0 12 }, 13 init: function (options) { 14 this.settings = $.extend(this.settings, options); 15 this.events.register.init(); 16 if (decorfinder.status.available.list) { 17 this.list.initView(); 18 } 19 }, 20 events: { 21 register: { 22 init: function () { 23 if (decorfinder.status.available.filter) { 24 this._filter(); 25 } 26 if (decorfinder.status.available.list) { 27 this._list(); 28 } 29 }, 30 _filter: function () { 31 decorfinder.settings.language = $(decorfinder.settings.filterContainer).data('language'); 32 33 decorfinder.filter.container = $(decorfinder.settings.filterContainer); 34 35 // register search submit 36 decorfinder.filter.container.find(decorfinder.settings.filterFormIdentifier + ' input, ' + decorfinder.settings.filterFormIdentifier + ' select:not(' + decorfinder.settings.manufacturer + ')').on('change', function (e) { 37 let $field = $(this); 38 39 if ($field.data('suppressNextChange')) { 40 $field.removeData('suppressNextChange'); 41 return; 42 } 43 44 decorfinder.filter.search.call(this, e); 45 }); 46 47 // register autocompletion for each registered field 48 let autocompleteField = decorfinder.filter.container.find(decorfinder.settings.filterFormIdentifier + ' [data-autocomplete]'); 49 autocompleteField.on('keyup', decorfinder.filter.autoComplete.complete); 50 autocompleteField.focusout(function () { 51 decorfinder.filter.autoComplete.hide($(this)); 52 }); 53 54 // register update handler for manufacturer/collection 55 $(decorfinder.settings.manufacturer).on('change', decorfinder.filter.manufacturer.updateCollection); 56 57 // reset filter on click 58 $(decorfinder.settings.filterContainer + ' ' + decorfinder.settings.resetBtn).on('click', function () { 59 decorfinder.filter.reset(); 60 document.getElementById('decorfinder_filter').scrollIntoView({behavior: "smooth", block: "start", inline: "nearest"}); 61 }); 62 }, 63 _list: function () { 64 } 65 }, 66 handler: {} 67 }, 68 ajax: { 69 call: function (action, data, callback, method, error) { 70 method = method || 'GET'; 71 error = error || function (response) { 72 if (response.statusText === 'abort') { 73 return; 74 } 75 if (!!console) { 76 console.error('Error during ajax request for action ' + action + '. Error message:'); 77 console.error(response); 78 } 79 }; 80 return $.ajax({ 81 url: $('form.decorfinder.finder').attr('data-ajaxurl-' + action), 82 dataType: 'json', 83 method: method, 84 data: { 85 params: data 86 }, 87 success: callback, 88 error: error 89 }); 90 }, 91 search: function (callback) { 92 let loader = $('<div class="loader"></div>'); 93 $(decorfinder.settings.filterContainer).append(loader); 94 $.ajax({ 95 url: decorfinder.settings.searchUrl, 96 method: 'GET', 97 data: { 98 tx_wmdbdoellkenproducts_decorfinderlist: decorfinder.filter.getFilter(), 99 L: decorfinder.settings.language 100 }, 101 dataType: 'html', 102 success: callback 103 }); 104 } 105 }, 106 filter: { 107 reset: function () { 108 decorfinder.filter.container.find(decorfinder.settings.filterFormIdentifier + ' input, ' + 109 decorfinder.settings.filterFormIdentifier + ' select').each(function () { 110 $(this).val('').removeAttr('checked').removeAttr('selected'); 111 }); 112 $(decorfinder.settings.fillBind).removeClass('active'); 113 decorfinder.filter.manufacturer.clearCollection(); 114 decorfinder.filter.manufacturer.hideCollection(); 115 decorfinder.filter.search(); 116 }, 117 container: {}, 118 search: function () { 119 // We need the timeout for the autocompletion need some time 120 decorfinder.ajax.search(function (response) { 121 decorfinder.list.drawNewList(response); 122 }); 123 }, 124 getFilter: function () { 125 let result = {}; 126 $(decorfinder.settings.filterContainer).find('input
126:not([type="checkbox"]), select').each(function () { 127 if ($.trim(this.value) !== '') { 128 result[this.name] = $.trim(this.value); 129 } 130 }); 131 $(decorfinder.settings.filterContainer).find('input[type="checkbox"]').each(function () { 132 if (this.checked) { 133 if (this.name.endsWith('[]')) { 134 let name = this.name.substring(0, this.name.length - 2); 135 if (Object.keys(result).indexOf(name) === -1) { 136 result[name] = []; 137 } 138 result[name].push($.trim(this.value)); 139 } else { 140 result[this.name] = $.trim(this.value); 141 } 142 } 143 }); 144 return result; 145 }, 146 autoComplete: { 147 availableItems: {}, 148 debounceDelay: 300, 149 request: null, 150 timer: null, 151 complete: function (e) { 152 if (e.keyCode === 40) { // down 153 decorfinder.filter.autoComplete.suggestions.next($(this).parents('.accordion-content')); 154 } else if (e.keyCode === 38) { // up 155 decorfinder.filter.autoComplete.suggestions.prev($(this).parents('.accordion-content')); 156 } else if (e.keyCode === 13) { // enter 157 decorfinder.filter.autoComplete.suggestions.current($(this).parents('.accordion-content')).mousedown(); 158 decorfinder.filter.autoComplete.hide($(this)); 159 } else { 160 let fieldName = this.name, 161 me = decorfinder.filter.autoComplete, 162 $this = $(this), 163 value = $this.val(); 164 165 clearTimeout(me.timer); 166 167 if (me.request !== null) { 168 me.request.abort(); 169 me.request = null; 170 } 171 172 if ($.trim(value) !== '') { 173 me.timer = setTimeout(function () { 174 $this.addClass('loading'); 175 me.request = decorfinder.ajax.call('autocomplete', { 176 field: fieldName, 177 value: value 178 }, function (response) { 179 $this.removeClass('loading'); 180 me.request = null; 181 me.clear(fieldName); 182 $.each(response, function (i, v) { 183 me.add(fieldName, v); 184 }); 185 if (!$.isEmptyObject(me.availableItems[fieldName])) { 186 me.show($this, me.availableItems[fieldName], value); 187 } else { 188 me.hide($this); 189 } 190 }); 191 }, me.debounceDelay); 192 } else { 193 me.hide($this); 194 } 195 } 196 }, 197 suggestions: { 198 next: function (parent) { 199 let active = parent.find('.suggestion.active'); 200 if (active.length > 0) { 201 parent.find('.suggestion.active').removeClass('active'); 202 active.next().addClass('active').focus(); 203 } else { 204 parent.find('.suggestion:first').addClass('active').focus(); 205 } 206 decorfinder.filter.autoComplete.suggestions.fixPosition(parent.find('.active')); 207 }, 208 prev: function (parent) { 209 let active = parent.find('.suggestion.active'); 210 if (active.length > 0) { 211 parent.find('.suggestion.active').removeClass('active'); 212 active.prev().addClass('active').focus(); 213 } else { 214 parent.find('.suggestion:last').addClass('active').focus(); 215 } 216 decorfinder.filter.autoComplete.suggestions.fixPosition(parent.find('.active')); 217 }, 218 current: function (parent) { 219 return parent.find('.suggestion.active'); 220 }, 221 fixPosition: function (item) { 222 let itemHeight = item.height(), 223 top = (item.index() * itemHeight) - (item.parent().height() - itemHeight); 224 if (top !== itemHeight && (item.index() * itemHeight) > item.parent().height()) { 225 item.parent().animate({ 226 scrollTop: top + 'px' 227 }, 1); 228 } else if (item.parent().scrollTop() > 0 && (item.index() * itemHeight) < item.parent().height()) { 229 item.parent().animate({ 230 scrollTop: '0px' 231 }, 1); 232 } 233 } 234 }, 235 clear: function (key) { 236 this.availableItems[key] = {}; 237 }, 238 add: function (key, item) { 239 // whitespace needed for sorting 240 this.availableItems[key][item.value] = item.label; 241 }, 242 show: function ($item, items, searchPhrase) { 243 let itemHtmlSource = ''; 244 $.each(items, function (i, v) { 245 let replacement; 246 let start = v.toLowerCase().indexOf(searchPhrase.toLowerCase()), 247 end = start + searchPhrase.length, 248 sub = v.substring(start, end); 249 replacement = v.replace(sub, '<b>' + sub + '</b>'); 250 itemHtmlSource += '<div class="suggestion" data-value="' + i + '">' + replacement + '</div>'; 251 }); 252 253 // if a suggestion wrapper exists, use it, otherwise create one 254 if ($item.parent().find('.suggestion-wrapper').length > 0) { 255 $item.parent().find('.suggestion-wrapper').html(itemHtmlSource).show(); 256 } else { 257 let html = $('<div class="suggestion-wrapper">' + itemHtmlSource + '</div>'); 258 $item.parent().append(html); 259 } 260 $item.parent().find('.suggestion').on('mousedown', decorfinder.filter.autoComplete.handleSuggestionClick); 261 $item.parent().find('.suggestion').focus(decorfinder.filter.autoComplete.suggestions.fixPosition); 262 $item.parent().find('.suggestion').hover(function () { 263 $(this).addClass('active'); 264 }, function () { 265 $(this).removeClass('active'); 266 }); 267 }, 268 hide: function ($item) { 269 $item.parent().find('.suggestion-wrapper').hide(); 270 }, 271 handleSuggestionClick: function (e) { 272 e.preventDefault(); 273
274 let $this = $(this), 275 value = $this.data('value'), 276 $input = $this.parents('.accordion-content').find('[data-autocomplete]'); 277 278 $input.val(value); 279 decorfinder.filter.autoComplete.hide($input); 280 $input.trigger('change'); 281 $input.data('suppressNextChange', true); 282 $input.blur(); 283 } 284 }, 285 manufacturer: { 286 updateCollection: function (e) { 287 decorfinder.filter.manufacturer.clearCollection(); 288 decorfinder.filter.search.call(this, e); 289 if (this.value !== '') { 290 decorfinder.ajax.call('collections', {manufacturer: this.value}, function (response) { 291 $.each(response, function (i, v) { 292 let option = $('<option value="' + v.uid + '">' + v.title + '</option>'); 293 $(decorfinder.settings.collection).append(option); 294 }); 295 decorfinder.filter.manufacturer.showCollection(); 296 }); 297 } else { 298 decorfinder.filter.manufacturer.hideCollection(); 299 } 300 301 }, 302 hideCollection: function () { 303 $(decorfinder.settings.collection).val(''); 304 $(decorfinder.settings.collection).hide(); 305 }, 306 showCollection: function () { 307 $(decorfinder.settings.collection).show(); 308 }, 309 clearCollection: function () { 310 let first = $(decorfinder.settings.collection + ' option:first'); 311 $(decorfinder.settings.collection).html('').append(first); 312 } 313 }, 314 fillBind: { 315 fillOnClick: function (e) { 316 e.preventDefault(); 317 let target = $('[name="' + $(this).data('fill-bind') + '"]'); 318 if (!$(this).hasClass('active')) { 319 $(this).parent().find('.active').removeClass('active'); 320 321 $(this).addClass('active'); 322 if (target.length > 0) { 323 target.val($(this).data('value-to-fill')); 324 target.change(); 325 } 326 } else { 327 $(this).removeClass('active'); 328 target.val(''); 329 target.change(); 330 } 331 } 332 } 333 }, 334 list: { 335 initView: function () { 336 }, 337 drawNewList: function (html) { 338 let listContainer = $(decorfinder.settings.listContainer); 339 listContainer.css('opacity', '0').html($(html).html()); 340 setTimeout(function () { 341 decorfinder.list.equalHeight(); 342 listContainer.animate({ 343 opacity: 1 344 }, 50); 345 }, 200); 346 $('a[data-lightbox]').magnificPopup({ 347 type: "image", 348 closeOnContentClick: !0, 349 image: { 350 verticalFit: !0 351 } 352 }); 353 $(decorfinder.settings.filterContainer + ' .loader').remove(); 354 }, 355 equalHeight: function (withTimeout) { 356 let max = 0; 357 withTimeout = withTimeout || true; 358 $(decorfinder.settings.listContainer).find('[data-equalizer] [data-equalizer-watch]').each(function (i) { 359 if ($(this).height() > max) { 360 max = $(this).height(); 361 } 362 if (i === ($(decorfinder.settings.listContainer).find('[data-equalizer] [data-equalizer-watch]').length - 1)) { 363 if (withTimeout) { 364 setTimeout(function () { 365 $(decorfinder.settings.listContainer).find('[data-equalizer] [data-equalizer-watch]').css('height', max + 'px'); 366 }, 300); 367 } else { 368 $(decorfinder.settings.listContainer).find('[data-equalizer] [data-equalizer-watch]').css('height', max + 'px'); 369 } 370 } 371 }); 372 373 } 374 }, 375 available: function () { 376 let result = false;
377 if ($(this.settings.filterContainer).length > 0) { 378 this.status.available.filter = true; 379 result = true; 380 } 381 if ($(this.settings.listContainer).length > 0) { 382 this.status.available.list = true; 383 result = true; 384 } 385 return result; 386 }, 387 status: { 388 available: { 389 filter: false, 390 list: false 391 } 392 } 393 394 }; 395 396 $(document).ready(function () { 397 if (decorfinder.available()) { 398 let pid = $('[data-pid]').data('pid'); 399 decorfinder.init({ 400 searchUrl: '/?id=' + pid + '&type=5000&tx_wmdbdoellkenproducts_decorfinderlist[action]=list' 401 }); 402 decorfinder.list.equalHeight(); 403 } 404 }); 405 $(window).on('resize', function () { 406 decorfinder.list.equalHeight(false); 407 }); 408})(jQuery);
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.