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.