PageSourceSearch

https://www.doellken-profiles.com/_assets/38c6014cba00ed6ba2a4b724…/jquery.decorfinder.js?1784812926

js doellken-profiles.com collected 2026-10-07 15:45:21 UTC 19,076 bytes, 408 lines download raw bytes

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.