PageSourceSearch

https://gaudidecor.eu/smart_search/search.js?v=1167399627

js gaudidecor.eu collected 2026-10-08 21:16:30 UTC 26,539 bytes, 644 lines download raw bytes

1$('.smart-search-wrap').show();
2
3var smartSearchObj = {},
4    smartSearchProdList = {},
5    smartSearchObjErr = false,
6    smartSearchTimer,
7    searchWord = '';
8
9// Глобальный счетчик для предотвращения Race Condition (состояния гонки)
10var smartSearchRequestId = 0;
11
12window.addEventListener('load', function() {
13    setTimeout(function() {
14        const xhr = new XMLHttpRequest();
15        xhr.open('GET', '/smart_search/ajax.php?type=get_list');
16        xhr.onload = function() {
17            if (xhr.readyState !== 4 || xhr.status !== 200) {
18                console.log(`Smart Search: Ошибка: код - ${xhr.readyState}, status - ${xhr.status}`);
19                smartSearchObjErr = true;
20                return;
21            }
22            smartSearchObj = $.parseJSON(xhr.response);
23            console.log(smartSearchObj);
24            for (let key in smartSearchObj) {
25                smartSearchProdList[key] = smartSearchObj[key].name.toLowerCase();
26            }
27            if($('[data-type="smart-search-input"]').length > 0) { }
28            return;
29        }
30        xhr.onprogress = function(e) {
31            if (e.lengthComputable) {
32                console.log(`Smart Search: Получено ${e.loaded} из ${e.total} байт`);
33            } else {
34                console.log(`Smart Search: Получено ${e.loaded} байт`);
35            }
36            return;
37        };
38        xhr.onerror = function() {
39            console.log("Smart Search: Произошла непредвиденная ошибка.");
40            return;
41        };
42        xhr.send();
43    }, 1000);
44});
45
46$(document).ready(function() {
47    $(window).bind('resize', function() {
48        if(typeof searchScroll !== 'undefined') { searchScroll.reinitialise(); }
49        if(typeof orderSS !== 'undefined') { orderSS.reinitialise(); }
50    });
51
52    // Обертки Debounce для полей ввода (задержка 350мс перед реальным стартом поиска)
53    var debouncedSmartSearch = debounce(function() {
54        smartSearchResClear();
55        smartSearchShortRes("smart-search-input");
56        setStatistics($('[data-type="smart-search-input"]'));
57    }, 350);
58
59    var debouncedHeaderSearch = debounce(function() {
60        $('[data-type="header-ss-icon"]').hide();
61        $('[data-type="header-ss-wait"]').show();
62        smartSearchResClear();
63        smartSearchShortRes("header-ss-input");
64        setStatistics($('[data-type="header-ss-input"]'));
65    }, 350);
66
67    var debouncedFullSearch = debounce(function() {
68        smartSearchFullResClear();
69        smartSearchFullRes();
70        setStatistics($('[data-type="searchSP"]'));
71    }, 350);
72
73    var debouncedOrderSearch = debounce(function() {
74        $('[data-type="order-ss-icon"]').hide();
75        $('[data-type="order-ss-wait"]').show();
76        smartSearchShortResOrder("order-ss-input");
77    }, 350);
78
79    // 1. Поиск в контенте (Всплывающий)
80    $('[data-type="smart-search-input"]').keydown(function(event) {
81        if(event.keyCode == 13) {
82            event.preventDefault();
83            smartSearchResClear();
84            smartSearchShortRes("smart-search-input");
85            return false;
86        }
87    });
88    $('[data-type="smart-search-input"]').on('input', function() {
89        debouncedSmartSearch();
90    });
91
92    // 2. Поиск в шапке сайта
93    $('[data-type="header-ss-input"]').keydown(function(event) {
94        if(event.keyCode == 13) {
95            event.preventDefault();
96            $('[data-type="header-ss-icon"]').hide();
97            $('[data-type="header-ss-wait"]').show();
98            smartSearchResClear();
99            smartSearchShortRes("header-ss-input");
100            return false;
101        }
102    });
103    $('[data-type="header-ss-input"]').on('input', function() {
104        debouncedHeaderSearch();
105    });
106
107    // 3. Поиск на отдельной странице поиска (SP)
108    if($('[data-type="searchSP"]').length > 0) {
109        let url = window.location.href;
110        url = url.split('?');
111        if(url.length > 1) {
112            q = url[1].split('=')[1];
113            if(q != '') {
114                smartSearchFullResClear();
115                smartSearchFullRes();
116            }
117        }
118    }
119    $('[data-type="searchSP"]').keydown(function(event) {
120        if(event.keyCode == 13) {
121            event.preventDefault();
122            smartSearchFullResClear();
123            smartSearchFullRes();
124            return false;
125        }
126    });
127    $('[data-type="searchSP"]').on('input', function() {
128        debouncedFullSearch();
129    });
130
131    // 4. Поиск в форме добавления товара к заказу (Order)
132    $('[data-type="order-ss-input"]').keydown(function(event) {
133        if(event.keyCode == 13) {
134            event.preventDefault();
135            $('[data-type="order-ss-icon"]').hide();
136            $('[data-type="order-ss-wait"]').show();
137            smartSearchShortResOrder("order-ss-input");
138            return false;
139        }
140    });
141    $('[data-type="order-ss-input"]').on('input', function() {
142        debouncedOrderSearch();
143    });
144
145    // Остальные клики по кнопкам интерфейса и сбросы окон
146    $('[data-type="header-ss-clear"]').on('click', function() { closeSSwindow(); });
147    $('[data-type="search-open"]').on('click',function() {
148        if($(this).hasClass('close')) {
149            closeSSwindow();
150            smartSearchResClearTotal();
151        } else {
152            showSSwindow();
153        }
154        return false;
155    });
156    $('[data-type="smart-search-close"]').on('click',function() {
157        closeSSwindow();
158        smartSearchResClearTotal();
159    });
160
161    $(document).mouseup(function (e) {
162        if(window.innerWidth > 900) {
163            let container = $('[data-type="smart-search-wrap"]');
164            let target = e.target;
165            if (container.css('display')!='none' && container.hasClass('active') && container.has(e.target).length === 0 && !$(target).is('[data-type="smart-search-wrap"]') && $('[data-type="header-ss-input"]').has(e.target).length === 0 && !$(target).is('[data-type="header-ss-input"]') && $('[data-type="search-open"]').has(e.target).length === 0 && !$(target).is('[data-type="search-open"]') ) {
166                closeSSwindow();
167                smartSearchResClearTotal();
168            }
169        }
170    });
171
172    /*if($('[data-type="searchSP"]').length > 0) {
173        let url = window.location.href;
174        url = url.split('?');
175        if(url.length > 1) {
176            let q = url.split('=');
177            if(q.endsWith('/')) q = q.slice(0, -1);
178            console.log(q);
179            if(q != '') {
180                smartSearchFullResClear();
181                smartSearchFullRes();
182            }
183        }
184    }*/
185
186    $('[data-type="search-resetSP"]').on('click', function () {
187        $('[data-type="search-messSP"]').hide();
188        $('[data-type="search-resSP-qty"]').hide();
189        $('[data-type="search-resSP"]').hide();
190        $('[data-type="search-resSP-prod"]').html('');
191        $('[data-type="search-page"]').find('.icon-search').show();
192        $('[data-type="search-page"]').find('.search-wait').hide();
193
194        // 1. Сначала сбрасываем форму (она вернет значение из PHP)
195        let $form = $('[data-type="search-formSP"]');
196        if ($form.length > 0) {
197            $form[0].reset();
198        }
199
200        // 2. Теперь жестко стираем текущее значение И значение по умолчанию (defaultValue)
201        let $input = $('[data-type="searchSP"]');
202        if ($input.length > 0) {
203            $input.val(''); // Стираем видимое значение
204            $input.attr('value', ''); // Очищаем атрибут в DOM
205            $input[0].defaultValue = ''; // Стираем память браузера о PHP-вставке
206        }
207
208        // 3. Исправляем адресную строку (без дублирования знаков '?')
209        let url = window.location.href.split('?')[0];
210        url = url + '?q=';
211        window.history.replaceState("", "", url);
212    });
213
214
215    $('[data-type="order-ss-close"]').on('click', function() {
216        $('[data-type="order-ss-icon"]').show();
217        $('[data-type="order-ss-wait"]').hide();
218        $(this).hide();
219        $('[data-type="order-ss-input"]').val('');
220        $('[data-type="order-ss-list-wrap"]').html('');
221        orderScroll();
222    });
223
224    $(document).mouseup(function (e) {
225        let cont = $('[data-type="order-add-prod-form"]');
226        if(cont.is(":visible") && cont.has(e.target).length === 0 && !$(e.target).is('[data-type="order-add-prod-form"]')) {
227            hideOrderSearch();
228        }
229    });
230});
231
232function showSSwindow() {
233    $('[data-type="search-open"]').addClass('close');
234    $('[data-type="header-ss-wait"]').hide();
235    $('[data-type="header-ss-clear"]').show();
236    $('[data-type="smart-search-wrap"]').addClass('active');
237    disableBodyScroll();
238    $('[data-type="overlay"]').addClass('ss-overlay').show();
239}
240
241function closeSSwindow() {
242    $('[data-type="search-open"]').removeClass('close');
243    $('[data-type="header-ss-clear"]').hide();
244    $('[data-type="header-ss-wait"]').hide();
245    $('[data-type="header-ss-icon"]').show();
246    $('[data-type="header-ss-input"]').val('');
247    $('[data-type="smart-search-wrap"]').removeClass('active');
248    enableBodyScroll();
249    $('[data-type="overlay"]').removeClass('ss-overlay').hide();
250}
251
252$('[data-type="smart-search-btn"]').on('click',function() {
253    smartSearchResClear();
254    smartSearchShortRes("smart-search-input");
255});
256
257$('[data-type="smart-search-clear"]').on('click', function () {
258    $('[data-type="smart-search-input"]').val('');
259    $('.smart-search-short-res').hide();
260    $('.smart-search-result-short-link').hide();
261    $('.smart-search-result-short').hide();
262    $('.smart-search-no-results').hide();
263    $('.smart-search-bottom-panel').hide();
264    $('.smart-search-wait').hide();
265});
266
267function debounce(func, ms) {
268    let timer = null;
269    return function(...args) {
270        const onComplete = function() {
271            func.apply(this, args);
272            timer = null;
273        }
274        if (timer) { clearTimeout(timer); }
275        timer = setTimeout(onComplete, ms);
276    };
277}
278
279function findPartial(a, s) {
280    let res = [];
281    let numRes = [];
282    for (key in a) {
283        if(a[key].indexOf(s) >= 0) {
284            let article = smartSearchObj[key]['article'].trim();
285            let col = smartSearchObj[key]['col'];
286            if(article == 6 && s != '6.' && s != article && s != a[key].trim() && col != 'na
286d' && col != 'lines') {
287                continue;
288            }
289            if(a[key].trim() == article.trim()) {
290                numRes.push(key);
291            } else {
292                res.push(key);
293            }
294        }
295    }
296    return res.concat(numRes);
297}
298
299function smartSearchProducts(q, input, requestId) {
300    return new Promise(function(resolve) {
301        let smartSearchRes = [];
302        q = q.toLowerCase();
303        q = q.replace(/,/g, ".");
304        input.attr('data-search', q);
305        smartSearchRes = findPartial(smartSearchProdList, q);
306
307        if (smartSearchRes.length == 0) {
308            let qArr = q.split(' ');
309            let runSpeller = [];
310            for (let i = 0; i < qArr.length; i++) {
311                runSpeller[i] = new Promise(function (resSpeller) {
312                    let url = "https://speller.yandex.net/services/spellservice.json/checkText?text=" + encodeURIComponent(qArr[i]);
313                    $.ajax(url)
314                        .done(function (data) {
315                            if (data.length > 0 && data.s && data.s.length > 0) {
316                                resSpeller(data.s);
317                            } else {
318                                resSpeller(qArr[i]);
319                            }
320                        })
321                        .fail(function () {
322                            resSpeller(qArr[i]);
323                        });
324                });
325            }
326            Promise.all(runSpeller).then(function (values) {
327                // Защита: Если пока ждали Яндекс, пользователь ввел что-то новое — выходим
328                if (requestId !== smartSearchRequestId) return;
329
330                let qStrNew = values.join(' ');
331                if (q != qStrNew) {
332                    smartSearchRes = findPartial(smartSearchProdList, qStrNew);
333                    if (smartSearchRes.length == 0) {
334                        for (var i = 0; i < values.length; ++i) {
335                            if(values[i].length < 2) continue;
336                            let smartSearchWordRes = findPartial(smartSearchProdList, values[i]);
337                            if (smartSearchWordRes.length > 0) {
338                                input.attr('data-search', values[i]);
339                                smartSearchRes = smartSearchRes.concat(smartSearchWordRes);
340                            }
341                        }
342                        smartSearchRes = [...new Set(smartSearchRes)]; // Удаление дублей ID
343                    } else {
344                        input.attr('data-search', qStrNew);
345                    }
346                }
347                resolve(smartSearchRes);
348            }).catch(function(err) {
349                console.log(err);
350                resolve([]);
351            });
352        } else {
353            resolve(smartSearchRes);
354        }
355    });
356}
357
358function checkObjLoading() {
359    return new Promise(function(resolve, reject) {
360        const checker = setInterval(function(){
361            if(Object.keys(smartSearchObj).length > 0 || smartSearchObjErr) {
362                if(smartSearchObjErr) {
363                    reject();
364                } else {
365                    resolve();
366                }
367                clearInterval(checker);
368            }
369        }, 100);
370    });
371}
372
373function setStatistics(input) {
374    return false;
375}
376
377
378function smartSearchResClear() {
379    $('.smart-search-result-short').hide();
380    $('.smart-search-short-res').hide();
381    $('.smart-search-no-results').hide();
382    $('.smart-search-bottom-panel').show();
383    $('.smart-search-wait').show();
384}
385
386function smartSearchResClearTotal() {
387    $('.smart-search-result-short').hide();
388    $('.smart-search-short-res').hide();
389    $('.smart-search-no-results').hide();
390    $('.smart-search-bottom-panel').hide();
391    $('.smart-search-wait').hide();
392    $('[data-type="smart-search-input"]').val('');
393}
394
395function smartSearchShortRes(type = "smart-search-input") {
396    let q = $('[data-type="'+type+'"]').val().trim();
397    if(q != ''){
398        smartSearchRequestId++;
399        let currentId = smartSearchRequestId;
400
401        checkObjLoading(q).then(function(){
402            smartSearchProducts(q, $('[data-type="'+type+'"]'), currentId)
403                .then(function(result){
404                    // Если прилетел ответ от старого затормозившего запроса — блокируем вывод
405                    if (currentId !== smartSearchRequestId) return;
406
407                    $('.smart-search-wait').hide();
408                    if(window.innerWidth > 900 && type === "header-ss-input") {
409                        showSSwindow();
410                    }
411                    if(result.length > 0) {
412                        let smartSearchHtml = getSmartSearchShortPreview(result);
413                        $('[data-type="smart-search-items-wrap"]').html(smartSearchHtml);
414                        $('.smart-search-short-res').show(400, function(){
415                            if(typeof searchScroll === 'undefined') {
416                                var searchScroll = $('[data-type="search-scroll"]').jScrollPane({ showArrows: fal
416se, maintainPosition: false }).data('jsp');
417                            } else {
418                                searchScroll.reinitialise();
419                            }
420                        });
421                        $('.smart-search-result-short-link').show();
422                        $('.smart-search-result-qty span').html(result.length);
423                        $('.smart-search-result-short').css('display', 'flex');
424                        $('.smart-search-no-results').hide();
425                        $('[data-type="smart-search-show-all"]').each(function() {
426                            $(this).attr('href', '/search/?q='+q).show();
427                        });
428                    } else {
429                        $('[data-type="smart-search-items-wrap"]').html('');
430                        $('.smart-search-short-res').hide();
431                        $('[data-type="smart-search-show-all"]').hide();
432                        $('.smart-search-result-short-link').hide();
433                        $('.smart-search-result-qty span').html('0');
434                        $('.smart-search-result-short').css('display', 'flex');
435                        $('.smart-search-no-results').html(notFoundLang()).show();
436                    }
437                }) .catch(function(err) { console.log(err) });
438        }, function() {
439            if (currentId !== smartSearchRequestId) return;
440            $('.smart-search-wait').hide();
441            $('.smart-search-no-results').html(errorLang()).show();
442        }).catch(function(err) { console.log(err) });
443    } else {
444        $('[data-type="'+type+'"]').val('');
445        $('[data-type="smart-search-items-wrap"]').html('');
446        $('[data-type="smart-search-show-all"]').hide();
447        $('.smart-search-short-res').hide();
448        $('.smart-search-result-short-link').hide();
449        $('.smart-search-result-short').hide();
450        $('.smart-search-no-results').hide();
451        $('.smart-search-bottom-panel').hide();
452        $('.smart-search-wait').hide();
453        if(window.innerWidth > 900 && type === "header-ss-input") {
454            closeSSwindow();
455        }
456        return false;
457    }
458    return false;
459}
460
461function getSmartSearchShortPreview(arr) {
462    let stop = 11;
463    let res = '';
464    for(let i = 0; i < arr.length && i <= stop; i++) {
465        let item = smartSearchObj[arr[i]];
466        if(item) res += item.shortPreview;
467    }
468    return res;
469}
470
471function smartSearchFullResClear() {
472    $('[data-type="search-messSP"]').hide();
473    $('[data-type="search-resSP-qty"]').hide();
474    $('[data-type="search-resSP"]').hide();
475    $('[data-type="search-resSP-prod"]').html('');
476    $('[data-type="search-page"]').find('.icon-search').hide();
477    $('[data-type="search-page"]').find('.search-wait').show();
478}
479
480function smartSearchFullRes() {
481    let q = $('[data-type="searchSP"]').val().trim();
482    let url = window.location.href;
483    url = url.split('?');
484    url = url[0] + '?q=' + q;
485    window.history.replaceState("", "", url);
486    if(q != ''){
487        smartSearchRequestId++;
488        let currentId = smartSearchRequestId;
489
490        checkObjLoading(q).then(function(){
491            smartSearchProducts(q, $('[data-type="searchSP"]'), currentId).then(function(result){
492                if (currentId !== smartSearchRequestId) return;
493
494                $('[data-type="search-page"]').find('.search-wait').hide();
495                $('[data-type="search-page"]').find('.icon-search').show();
496                if(result.length > 0) {
497                    let smartSearchHtml = getSmartSearchFullPreview(result);
498                    $('[data-type="search-resSP-prod"]').html(smartSearchHtml);
499                    $('[data-type="search-resSP"]').show();
500                    $('[data-type="search-resSP-qty"] span').html(result.length);
501                    $('[data-type="search-resSP-qty"]').show();
502                    $('[data-type="search-messSP"]').hide();
503                } else {
504                    $('[data-type="search-resSP-prod"]').html('');
505                    $('[data-type="search-resSP"]').hide();
506                    $('[data-type="search-resSP-qty"] span').html('0');
507                    $('[data-type="search-resSP-qty"]').show();
508                    $('[data-type="search-messSP"]').html(notFoundLang()).show();
509                }
510            }).catch(function(err) { console.log(err) });
511        }, function() {
512            if (currentId !== smartSearchRequestId) return;
513            $('.search-wait').hide();
514            $('[data-type="search-page"]').find('.icon-search').show();
515            $('[data-type="search-messSP"]').html(errorLang()).show();
516        }).catch(function(err) { console.log(err) });
517    } else {
518        $('[data-type="search-page"]').find('.search-wait').hide();
519        $('[data-type="search-page"]').find('.icon-search').show();
520        $('[data-type="search-messSP"]').hide();
521        $('[data-type="search-resSP-qty"]').hide();
522        $('[data-type="search-resSP"]').hide();
523        $('[data-type="search-resSP-prod"]').html('');
524        return false;
525    }
526    return false;
527}
528
529function getSmartSearchFullPreview(arr) {
530    let res = '';
531    for(let i = 0; i < arr.length; i++) {
532        let item = smartSearchObj[arr[i]];
533        if(item) res += item.preview;
534    }
535    return res;
536}
537
538function notFoundLang() {
539    let lang = $.cookie('id_lang');
540    switch (lang) {
541        case 'en': return "Sorry, we couldn't find any results";
542        case 'de': return 'Keine Ergebnisse gefunden';
543        case 'fr': return "Désolé, aucun résultat ne correspond à votre recherche.";
544        case 'nl': return 'Sorry, we konden geen resultaten vinden';
545        case 'ro': return "Ne pare rău, nu am găsit niciun rezultat";
546        case 'it': return "Siamo spiacenti, non è stato possibile trovare risultati";
547        case 'ru': return 'Поиск не дал результатов';
548        case 'es': return 'Lo sentimos, no se pudieron encontrar resultados';
549        case 'pt': return 'Desculpe, nenhum resultado foi encontrado';
550        default: return "Sorry, we couldn't find any results";
551    }
552}
553
554function errorLang() {
555    let lang = $.cookie('id_lang');
556    switch (lang) {
557        case 'en': return "An error has occurred. Please reload the page and search again";
558        case 'de': return "Es ist ein Fehler aufgetreten. Bitte laden Sie die Seite neu und suchen Sie erneut";
559        case 'fr': return "Une erreur s'est produite. Veuillez recharger la page et effectuer une nouvelle recherche";
560        case 'nl': return "Er is een fout opgetreden. Laad de pagina opnieuw и zoek opnieuw";
561        case 'ro': return "A apărut o eroare. Vă rugăm să reîncărcați pagina și să căutați din nou";
562        case 'it': return "Si è verificato un errore. Ricarica la pagina e cerca di nuovo";
563        case 'ru': return "Произошла ошибка. Пожалуйста, перезагрузите страницу и повторите поиск ещё раз";
564        case 'es': return "Ha ocurrido un error. Por favor recarga la página y busca nuevamente";
565        case 'pt': return "Ocorreu um erro. Atualize a página e pesquise novamente";
566        default: return "An error has occurred. Please reload the page and search again";
567    }
568}
569
570function smartSearchShortResOrder(type = "smart-search-input") {
571    let q = $('[data-type="'+type+'"]').val().trim();
572    if(q != '') {
573        $('[data-type="order-ss-close"]').show();
574
575        // Увеличиваем глобальный счетчик и запоминаем ID этого запроса
576        smartSearchRequestId++;
577        let currentId = smartSearchRequestId;
578
579        checkObjLoading(q).then(function(){
580            smartSearchProducts(q, $('[data-type="'+type+'"]'), currentId)
581                .then(function(result){
582                    // Защита: если за время поиска пользователь ввел новые символы — игнорируем старый ответ
583                    if (currentId !== smartSearchRequestId) return;
584
585                    $('[data-type="order-ss-wait"]').hide();
586                    if(result.length > 0) {
587                        let smartSearchHtml = getSmartSearchShortPreviewOrder(result);
588                        $('[data-type="order-ss-list-wrap"]').html(smartSearchHtml);
589                        orderScroll();
590                    } else {
591                        $('[data-type="order-ss-list-wrap"]').html('<div class="order-ss-err">' + notFoundLang() + '</div>');
592                        orderScroll();
593                    }
594                }).catch(function(err) { console.log(err) });
595        }, function() {
596            if (currentId !== smartSearchRequestId) return;
597            $('[data-type="order-ss-wait"]').hide();
598            $('[data-type="order-ss-list-wrap"]').html('<div class="order-ss-err">' + errorLang() + '</div>');
599            orderScroll();
600        }).catch(function(err) { console.log(err) });
601    } else {
602        $('[data-type="order-ss-close"]').hide();
603        $('[data-type="order-ss-wait"]').hide();
604        $('[data-type="order-ss-list-wrap"]').html('');
605        orderScroll();
606        return false;
607    }
608    return false;
609}
610
611function getSmartSearchShortPreviewOrder(arr) {
612    let res = '';
613    for(let i = 0; i < arr.length; i++) {
614        let item = smartSearchObj[arr[i]];
615        if(!item) continue; // Защита от неопределенных элементов в массиве базы
616        res += '<div class="order-add-prod-item" data-id="' + item.id + '" data-type="order-add-prod-item">';
617        res += '<div class="order-add-prod-item-art">';
618        res += '<a href="' + item.url + '" target="_blank">';
619        res += item.name;
620        res += '</a>';
621        res += '</div>';
622        res += '<div class="order-add-prod-item-btn" data-type="add-order-prod"><i class="new-icon-plus-symbol"></i></div>';
623        res += '</div>';
624    }
625    return res;
626}
627
628function orderScroll() {
629    if(typeof orderSS === 'undefined') {
630        var orderSS = $('[data-type="order-ss-list"]').jScrollPane({ showArrows: false, maintainPosition: false }).data('jsp');
631    } else {
632        orderSS.reinitialise();
633    }
634}
635
636function hideOrderSearch() {
637    $('[data-type="order-ss-icon"]').show();
638    $('[data-type="order-ss-wait"]').hide();
639    $('[data-type="order-ss-close"]').hide();
640    $('[data-type="order-ss-input"]').val('');
641    $('[data-type="order-ss-list-wrap"]').html('');
642    orderScroll();
643    $('[data-type="order-add-prod-form"]').hide();
644}

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.