PageSourceSearch

https://shop.electrodevasa.com/modules/ambjolisearch/views/js/ambjolisearch.js

js electrodevasa.com collected 2026-10-04 20:15:37 UTC 21,375 bytes, 434 lines download raw bytes

1/**
2 *  @module     Advanced search (AmbJoliSearch)
3 *  @file       ambjolisearch.php
4 *  @subject    script principal pour gestion du module (install/config/hook)
5 *  @copyright  Copyright (c) 2013-2022 Ambris Informatique SARL
6 *  @license    Commercial license
7 *  Support by mail: [email protected]
8 **/
9
10var _gaq = _gaq || [];
11
12if (!window.console) {
13    window.console = {
14        log: function() {}
15    };
16}
17
18(function($){
19    var compat_jQ = (function(){ try { return amb_jQ; } catch(err){ return $; } })();
20    (function($) {
21        var joli_settings = {
22            display_manufacturer: true,
23            display_category: true,
24            display_supplier: true
25        };
26
27        var customizeRender = function() {
28            var __superRenderItem = $.ui.autocomplete.prototype._renderItem;
29            var __superRenderMenu = $.ui.autocomplete.prototype._renderMenu;
30
31
32            $.widget('ambjolisearch.ambSearchAutocomplete', $.ui.autocomplete, {
33                _renderItem: function(ul, item) {
34                    if (item.data) {
35                        if (this.options.customRender) {
36                            return $("<li></li>")
37                            .data("item.autocomplete", item)
38                            .addClass((item.title ? 'jolisearch-container' : ''))
39                            .addClass(item.data && item.data.type ? item.data.type : '')
40                            .append(item.title ? $("<span>").addClass("jolisearch-title").html(item.title) : '')
41                            .append($("<a></a>").attr('href', (item.data && item.data.link ? item.data.link : ""))[this.options.html ? "html" : "text"](item.label).addClass(item.data ? item.data.type : ""))
42                            .appendTo(ul);
43                        } else {
44                            return __superRenderItem.call(this, ul, item);
45                        }
46                    } else {
47                        return $("<li></li>")
48                                .data("item.autocomplete", item)
49                                .html(item.value)
50                                .appendTo(ul);
51                    }
52                },
53                _renderMenu: function(ul, items) {
54                    $(ul).addClass('ui-jolisearch');
55                    $(ul).addClass(jolisearch['classes']);
56                    $(ul).removeAttr('style');
57                    return __superRenderMenu.call(this, ul, items);
58                }
59            });
60        };
61
62
63        var matchAccents = function(s) {
64                // http://jsfiddle.net/uJ99L/4/
65                var accents = {
66                    a: new Array('à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'Â', 'Ã', 'Ä', 'À', 'Á', 'Å', 'Æ'),
67                    e: new Array('é', 'è', 'ê', 'ë', 'É', 'È', 'Ë', 'Ê'),
68                    i: new Array('ì', 'í', 'î', 'ï', 'Ì', 'Í', 'Î','Ï'),
69                    o: new Array('ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø'),
70                    u: new Array('ù', 'ú', 'û', 'ü', 'Ù', 'Ú', 'Û', 'Ü'),
71                    n: new Array('ñ', 'Ñ'),
72                    c: new Array('ç', 'Ç')
73                };
74                for (var key in accents) {
75                    var reg = "[" + key;
76                    var search_term = "(" + key;
77
78                    for (var letterindex = 0; letterindex < accents[key].length; letterindex++) {
79                        reg += accents[key][letterindex];
80                        search_term += '|' + accents[key][letterindex];
81                    }
82
83                    reg += "]";
84                    search_term += ")";
85                    var regexp = new RegExp(search_term, "g");
86                    $('#term').append("--> " + reg + " - " + search_term + " --> ");
87                    s = s.replace(regexp, reg);
88                    $('#term').append(s + "\n");
89                }
90                return s;
91            },
92
93            builder = {
94                'product': function(item, filter, firstOfItsKind) {
95                    var img = $('<img src="' + item.img + '">')
96                        .addClass("jolisearch-image"),
97                    prod = $('<span>').addClass('jolisearch-name').html(filter(item.pname)),
98                    supplier = item.suname && joli_settings.display_supplier ? $('<span>').addClass('jolisearch-pre').html(filter(item.suname)) : undefined,
99                    manuf = item.mname && joli_settings.display_manufacturer ? $('<span>').addClass('jolisearch-pre').html(filter(item.mname)) : undefined,
100                    cat = item.cname && joli_settings.display_category ? $('<span>').addClass('jolisearch-post').html(filter(item.cname)) : undefined,
101                    features = item.feats ? $('<span>
101').addClass('jolisearch-features').html(filter(item.feats)) : undefined,
102                    prc = item.price ? $('<div>').addClass('jolisearch-post-right').html(item.price) : undefined,
103                    dummy = $('<div>').addClass('jolisearch-item product')
104                        .append(img)
105                        .append(
106                            $('<div>').addClass("jolisearch-description " + item.type)
107                                .append(supplier)
108                                .append(manuf)
109                                .append(prod)
110                                .append(features)
111                                .append(cat)
112                        )
113                        .append(prc);
114
115                    return {
116                        data: item,
117                        value: item.pname,
118                        label: dummy.html(),
119                        title: firstOfItsKind
120                    };
121                },
122
123                'manufacturer': function(item, filter, firstOfItsKind) {
124                    var img = $('<img src="' + item.img + '">')
125                        .addClass("jolisearch-image"),
126                    prod = $('<span>').addClass('jolisearch-name').html(filter(item.man_name)),
127                    results = $('<span>').addClass('jolisearch-results').html(filter(item.man_results))
128                    dummy = $('<div>').addClass('jolisearch-item manufacturer')
129                        .append(img)
130                        .append(
131                            $('<div>').addClass("jolisearch-description " + item.type)
132                                .append(prod)
133                                .append(results)
134                                );
135
136                    return {
137                        data: item,
138                        value: item.man_name,
139                        label: dummy.html(),
140                        title: firstOfItsKind
141                    };
142
143                },
144
145                'supplier': function(item, filter, firstOfItsKind) {
146                    var img = $('<img src="' + item.img + '">')
147                        .addClass("jolisearch-image"),
148                    prod = $('<span>').addClass('jolisearch-name').html(filter(item.sup_name)),
149                    results = $('<span>').addClass('jolisearch-results').html(filter(item.sup_results))
150                    dummy = $('<div>').addClass('jolisearch-item supplier')
151                        .append(img)
152                        .append(
153                            $('<div>').addClass("jolisearch-description " + item.type)
154                                .append(prod)
155                                .append(results)
156                                );
157                    return {
158                        data: item,
159                        value: item.sup_name,
160                        label: dummy.html(),
161                        title: firstOfItsKind
162                    };
163
164                },
165
166                'category': function(item, filter, firstOfItsKind) {
167                    var img = $('<img src="' + item.img + '">')
168                        .addClass("jolisearch-image"),
169                    prod = $('<span>').addClass('jolisearch-name').html(filter(item.cat_name)),
170                    results = $('<span>').addClass('jolisearch-results').html(filter(item.cat_results))
171                    dummy = $('<div>').addClass('jolisearch-item category')
172                        .append(img)
173                        .append(
174                            $('<div>').addClass("jolisearch-description " + item.type)
175                                .append(prod)
176                                .append(results));
177
178                    return {
179                        data: item,
180                        value: item.cat_name,
181                        label: dummy.html(),
182                        title: firstOfItsKind
183                    };
184                },
185
186                'no-results-found': function(item, filter, firstOfItsKind) {
187                    var message = $('<span>').addClass('jolisearch-post').html(firstOfItsKind),
188                        dummy = $('<div>').addClass('jolisearch-item no-results-found')
189                            .append(
190                                $('<div>').addClass("jolisearch-description " + item.type)
191                                    .append(message));
192                    return {
193                        value: '',
194                        data: item,
195                        label: dummy.html()
196                    };
197                },
198
199                'more-results': function(item, filter, firstOfItsKind) {
200                    var message = $('<span>').addClass('jolisearch-post').html(firstOfItsKind),
201                        dummy = $('<div>').addClass('jolisearch-item no-results-found')
202                            .append(
203                                $('<div>').addClass("jolisearch-additionnal " + item.type)
204                                    .append(message));
205                    return {
206                        value: '',
207                        data: item,
208                        label: dummy.html()
209                    };
210                }
211            },
212
213            filterClosure = function(term) {
214                var matcher = new RegExp("(" + matchAccents($.ui.autocomplete.escapeRegex(term.trim())) + ")", "gi");
215                return function(data) {
216                    if (data)
217                        return data.replace(matcher, '<strong>$1</strong>');
218                    return '';
219                }
220            },
221
222            filterHtmlClosure = function(term) {
223                var matcher = new RegExp("(" + matchAccents($.ui.autocomplete.escapeRegex(term.trim())) + ")", "gi");
224                return function(data) {
225                    if (data) {
226                        var $data = $(data);
227                        $data.find('.product-name, .product-category, .product-manufacturer, .product-supplier, .category-name, .manufacturer-name, .
227supplier-name').each(function(idx, elt) {
228                            $(elt).html($(elt).text().replace(matcher, '<strong>$1</strong>'));
229                        });
230                        return $('<div/>').append($data).html();
231                    }
232                    return '';
233                }
234            },
235
236            sourceClosure = function(that) {
237                return function(request, response) {
238                    var filter = filterClosure(request.term),
239                        filterHtml = filterHtmlClosure(request.term);
240                    $.ajax({
241                        url: that.attr('data-autocomplete'),
242                        dataType: "json",
243                        data: {
244                            s: request.term,
245                            //ajaxSearch: 1,
246                            ajax: true,
247                            id_lang: that.attr('data-lang'),
248                            maxRows: that.attr('data-autocomplete-max') || 10
249                        },
250                        success: function(data) {
251                            var lastType = undefined;
252                            if (data && data.use_rendered_products) {
253                                response([filterHtml(data.rendered_products)]);
254                            } else {
255                                response($.map(data.products, function(item) {
256                                    item.type = item.type.replace(/\_/gi, '-');
257                                    var firstOfItsKind = (lastType !== item.type);
258                                    lastType = item.type;
259                                    if (item.type == "no-results-found") {
260                                        if (that.attr('data-ga-acc') != 0) {
261                                            _gaq.push(["_setAccount", that.attr('data-ga-acc')]);
262                                            _gaq.push(['_trackPageview', '/notfound?search_query=' + request.term + '&fast_search=fs']);
263                                        }
264                                    }
265
266                                    return builder[item.type](item, filter, (firstOfItsKind ? that.attr('data-' + item.type) : false));
267                                }));
268                            }
269                        },
270
271                        error: function(xhr, textStatus, errorThrown) {
272                            console.log("error: " + errorThrown);
273                        }
274                    });
275                }
276            };
277
278        $('document').ready(function() {
279
280            if (typeof(jolisearch) != 'undefined') {
281                joli_settings.display_manufacturer = jolisearch.display_manufacturer;
282                joli_settings.display_category = jolisearch.display_category;
283                joli_settings.display_supplier = jolisearch.display_supplier;
284
285                input = $('.jolisearch').find('input')
286                if(input.length == 0){
287                    input = $('input[name=s]');
288                }
289                if(input.length == 0){
290                    input = $('input[name=search_query]');
291                }
292
293                input
294                    .attr('data-autocomplete-mode', jolisearch['use_autocomplete'])
295                    .attr('data-autocomplete', jolisearch['amb_joli_search_action'])
296                    .attr('data-lang', jolisearch['id_lang'])
297                    .attr('data-manufacturer', jolisearch['l_manufacturers'])
298                    .attr('data-supplier', jolisearch['l_suppliers'])
299                    .attr('data-product', jolisearch['l_products'])
300                    .attr('data-category', jolisearch['l_categories'])
301                    .attr('data-minwordlen', jolisearch['minwordlen'])
302                    .attr('data-no-results-found', jolisearch['l_no_results_found'])
303                    .attr('data-more-results', jolisearch['l_more_results'])
304                    .attr('autocomplete', 'off');
305
306                input
307                    .closest('form').attr('action', jolisearch['amb_joli_search_action']);
308
309                $form = input.closest('form');
310                $controller = input.closest('form').find('input[name=controller]');
311                if ($controller.val() != 'jolisearch') {
312                    // remove previous search bar configuration
313                    $controller.remove();
314                    $form.find('input[name=fc]').remove();
315                    $form.closest('form').find('input[name=module]').remove();
316                }
317
318                if (jolisearch['amb_joli_search_action'].indexOf('fc=') >= 0) {
319                    // friendly url Off...
320                    request = jolisearch['amb_joli_search_action'].split('?');
321                    parameters = $.each(request[1].split('&'), function(i, value) {
322                        param = value.split('=');
323                        $form.append($('<input>').attr('type', 'hidden').attr('name', param[0]).val(param[1]));
324                        $form.attr('method', 'post');
325                    });
326                    $form.attr('action', request[0]);
327                }
328
329                $('#search_widget').attr('data-search-controller-url', '');
330
331                if (jolisearch.theme) {
332                    $('body').addClass('jolisearch-theme-' + jolisearch.theme);
333                }
334/*
335                if (typeof $.fn.psBlockSearchAutocomplete !== 'undefined'){
336                    $('#search_widget').find('input[type=text]').psBlockSearchAutocomplete('destroy');
337                }
338                if (typeof prestashop.psBlockSearchAutocomplete !== 'undefined'){
339                    $('#search_widget').find('input[type=text]').psBlockSearchAutocomplete('destroy');
340                }
341*/
342                if ($.fn.version >= '2') {
343                    var searchbarAutocomplete = $('*:data(prestashop-psBlockSearchAutocomplete)');
344                    if (searchbarAutocomplete.length) {
345                        searchbarAutocomplete.off('.psBlockSearchAutocomplete0');
346                        searchbarAutocomplete.off('.psBlockSearchAutocomplete2');
347                        searchbarAutocomplete.psBlockSearchAutocomplete('destroy');
348                    }
349                    // add support for warehouse theme and its child themes
350                    var scAutocomplete = $('input[name=s]:data(sc)');
351                    if (scAutocomplete.length && typeof $.fn.autoComplete !== 'undefined') {
352                        scAutocomplete.autoComplete('destroy');
353                    }
354                } else {
355                    var searchbarAutocomplete = $('input[name=s]');
356                    searchbarAutocomplete.each(function(i, elt) {
357                        var e = $(elt);
358                        if (e.data('prestashop-psBlockSearchAutocomplete') || e.data('prestashopPsBlockSearchAutocomplete')) {
359                            e.off('.psBlockSearchAutocomplete0');
360                            e.off('.psBlockSearchAutocomplete2');
361                            e.psBlockSearchAutocomplete('destroy');
362                        }
363                        // add support for warehouse theme and its child themes
364                        if (e.data('sc') && typeof $.fn.autoComplete !== 'undefined') {
365                            e.autoComplete('destroy');
366                        }
367                    });
368                }
369            }
370
371            var responders = $('*:input[type=text][data-autocomplete], *:input[type=search][data-autocomplete]');
372            customizeRender();
373            responders.each(function() {
374                var that = $(this);
375                var mode = that.data('autocomplete-mode');
376                    if (mode == 2 || (mode == 1 && window.matchMedia("(min-width: 767px)").matches)) {
377
378                    var default_options = {
379                            source: sourceClosure(that),
380                            minLength: that.data('minwordlen'),
381                            max: 10,
382                            width: 500,
383                            delay: 500,
384                            selectFirst: false,
385                            scroll: false,
386                            html: true,
387                            customRender: true,
388                            classes: { 'ui-autocomplete' : ('ui-jolisearch' + ' ' + jolisearch['classes']) },
389                            position: (that.data('position') !== undefined ? that.data('position') : jolisearch['position']),
390                            select: function(e, ui) {
391                                if (ui.item.data)
392                                    document.location.href = ui.item.data.link;
393                                else
394                                    return false;
395                            },
396                            search: function(event, ui) {
397                                $('.ui-autocomplete.ui-jolisearch').css('width', 'auto');
398                                var position = (that.data('position') !== undefined ? that.data('position') : jolisearch['position']);
399                                if (window.matchMedia("(max-width: 576px)").matches)
400                                    that.ambSearchAutocomplete("option", "position", {my: 'center top', at: 'center bottom'});
401                                else
402                                    that.ambSearchAutocomplete("option", "position", position);
403
404                                return true;
405                            },
406                            focus: function(event, ui) {
407                                return false;
408                            },
409                            open: function(event, ui) {
410                                $('body').addClass('jolisearch-on');
411                            },
412                            close: function(event, ui) {
413                                $('body').removeClass('jolisearch-on');
414                            }
415                    };
416
417                    var autocomplete_options = default_options;
418                    if (jolisearch && jolisearch.autocomplete_target) {
419                        autocomplete_options = $.extend(autocomplete_options, {
420                            appendTo: jolisearch.autocomplete_target
421                        })
422                    }
423
424                    that.ambSearchAutocomplete(autocomplete_options);
425
426                    that.on('focus', function() {
427                        that.ambSearchAutocomplete('search', that.val())
428                    });
429
430                }
431            });
432        })
433    })(compat_jQ);
434})(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.