PageSourceSearch

https://rondell.ru/js/scripts.js?445020

js rondell.ru collected 2026-10-04 20:19:26 UTC 32,553 bytes, 866 lines download raw bytes

1/*
2код для блока с поиском
3 */
4
5let searchRequests = [];
6let catalog = [];
7let recipes = [];
8let news = [];
9
10const showHideSearchSection = () => {
11    let searchToggleButton = document.querySelector('button.search-toggler');
12    let searchSection = document.querySelector('.search-section');
13
14    searchToggleButton.addEventListener('click', (e) => {
15        e.preventDefault();
16        searchToggleButton.classList.toggle('active');
17
18        if(searchToggleButton.classList.contains('active')) {
19            searchSection.classList.add('active');
20            document.body.classList.add('with-search');
21            document.getElementById('searchInput').focus({ focusVisible: true })
22        } else {
23            searchSection.classList.remove('active');
24            document.body.classList.remove('with-search');
25            loadInitialSearchBlock();
26        }
27    })
28}
29
30/*
31    Отправка запрса на сервери получение данных после введение запрса в поле поиска
32 */
33const submitSearchForm = () => {
34    let form = document.getElementById('searchForm');
35    let input = form.querySelector('input#searchInput');
36
37    if(input.value !== '') {
38        if(localStorage.getItem('requests')) {
39            searchRequests = JSON.parse(localStorage.getItem('requests'));
40            searchRequests.forEach((el) => {
41                if(searchRequests.includes(input.value)) {
42                    return false;
43                } else {
44                    searchRequests.unshift(input.value);
45                }
46            })
47        } else {
48            searchRequests.unshift(input.value)
49        }
50
51        localStorage.setItem('requests', JSON.stringify(searchRequests));
52
53        let searchRequest = '';
54        const regex = /[a-zA-Zа-яА-Я]/g;
55        if(input.value.toLowerCase().includes('коллекц') && input.value.trim().length > 9) {
56            let collectionName = input.value.trim().split(" ");
57            collectionName.forEach((el) => {
58                if(!el.includes('коллекц')) {
59                    searchRequest = el.toString().toLowerCase();
60                }
61            })
62        } else if(/\S+и$/.test(input.value.trim()) || /\S+ы$/.test(input.value.trim())) {
63            searchRequest = input.value.slice(0, input.value.length-1).trim().toLowerCase()
64        } else if(input.value.trim().includes('-')) {
65            searchRequest = input.value.trim().replace('-', '-')
66        } else {
67            searchRequest = input.value.trim();
68        }
69
70        let formData = new FormData;
71        formData.append('search', searchRequest);
72
73        try {
74            fetch('/main/getsearchresults', {
75                method: "POST",
76                body: formData,
77            })
78                .then((response) => response.json())
79                .then((json) => {
80                        catalog = [];
81                        recipes = [];
82                        news = [];
83                        let notEmptyElems = [];
84                        let emptyElems = [];
85                        let itemsOffset = 16;
86                        let newsOffset = 14;
87                        let recipesOffset = 4;
88
89                        for(let key in json) {
90                            if(json[key].length === 0) {
91                                emptyElems.push(json[key]);
92                            } else {
93                                notEmptyElems.push(key);
94
95                                if(key ==='catalog') {
96                                    catalog.push(json[key]);
97                                }
98
99                                if(key ==='recipes') {
100                                    recipes.push(json[key]);
101                                }
102
103                                if(key ==='news') {
104                                    news.push(json[key]);
105                                }
106                            }
107                        }
108
109                        if(emptyElems.length === Object.keys(json).length) {
110                            renderNothingFoundBlock(input.value);
111                        } else {
112                            renderSearchResultsBlock(input.value);
113                            renderSearchTabs(notEmptyElems);
114                            document.querySelector('.search-tabs li').classList.add('active');
115                            document.querySelectorAll('.search-tabs li').forEach((li) => li.addEventListener('click', (e) => clickOnSearchTabs(e.target,itemsOffset, newsOffset, recipesOffset)));
116                            let activeTabType = document.querySelector('.search-tabs li.active').getAttribute('data-content');
117                            renderSearchTabContent(activeTabType, itemsOffset, newsOffset, recipesOffset);
118                            /*loadItemsOnScroll(itemsOffset, newsOffset, recipesOffset);*/
119                        }
120
121                    })
122            } catch (e) {
123                console.log(e.message)
124            }
125        } else {
126            input.setAttribute('placeholder', 'Введите запрос')
127        }
128}
129
130/*
131    Бесконечный скролл
132 */
133const loadItemsOnScroll = (itemsOffset, newsOffset, recipesOffset) => {
134    let tabContentData = document.querySelector('.search-tab-content').getAttribute('data-content');
135    let searchSection = document.querySelector('.search-section');
136    let scrollableBlock = searchSection.querySelector('.search-results')
137    let catalogArray = [];
138    let newsArray = [];
139    let recipesArray = [];
140
141    switch (tabContentData) {
142            case 'catalog':
143                let itemsOnPage = document.querySelectorAll('.items-row .item-block');
144                let itemsCounter = itemsOnPage.length
145
146                searchSection.addEventListener('scroll', () => {
147                    catalogArray = catalog[0];
148                    itemsOnPage = document.querySelectorAll('.items-row .item-block');
149                    if(scrollableBlock.getBoundingClientRect().bottom - document.querySelector('header').offsetHeight - screen.height*13/100 < screen.height) {
150                        if(itemsCounter < catalogArray.length) {
151                            catalogArray.forEach((item, index) => {
152                                    if (index >= itemsOnPage.length && index < itemsOnPage.length+itemsOffset) {
153                                        renderCatalogItem(item, document.querySelector('.tab-content .items-row'));
154                                    }
155                                })
156                            itemsCounter += itemsOffset;
157                        } else {
158                            itemsCounter =  catalogArray.length-1;
159
160                            catalogArray.forEach((item, index) => {
161                                if (index >= itemsOnPage.length && index <= itemsCounter) {
162                                    renderCatalogItem(item, document.querySelector('.tab-content .items-row'));
163                                }
164                            })
165
166                        }
167                    }
168                    return itemsCounter;
169                })
170                break;
171            case 'news':
172                let newsOnPage = document.querySelectorAll('.news-row .news-block');
173                let newsCounter = newsOnPage.length
174                newsArray = news[0];
175
176                searchSection.addEventListener('scroll', () => {
177                    newsOnPage = document.querySelectorAll('.news-row .news-block');
178
179                    if(scrollableBlock.getBoundingClientRect().bottom - document.querySelector('header').offsetHeight - screen.height*13/100 < screen.height) {
180                        if(newsCounter < newsArray.length) {
181                            if (newsOnPage.length <= newsArray.length) {
182                                newsArray.forEach((item, index) => {
183                                        if (index >= newsOnPage.length && index < newsOnPage.length+newsOffset) {
184                                            renderNewsItem(item, index);
185                                        }
186                                    })
187
188                                newsCounter += newsOffset;
189                            } else {
190                                newsCounter = newsArray.length-1;
191                                newsArray.forEach((item, index) => {
192                                    if (index >= newsOnPage.length && index <= newsCounter) {
193                                        renderNewsItem(item, index);
194                                    }
195                                })
196                            }
197                        }
198                    }
199
200                })
201                break;
202            case 'recipes':
203                let recipesOnPage = document.querySelectorAll('.recipes-row .recipe');
204                let recipesCounter = recipesOnPage;
205                recipesArray = recipes[0];
206
207                searchSection.addEventListener('scroll', () => {
208                    recipesOnPage = document.querySelectorAll('.recipes-row .recipe');
209
210                    if(scrollableBlock.getBoundingClientRect().bottom - document.querySelector('header').offsetHeight - screen.height*13/100 < screen.height) {
211                        if(recipesCounter < recipesArray.length) {
212                            if (recipesOnPage.length <= recipesArray.length) {
213                                recipesArray.forEach((item, index) => {
214                                        if (index >= recipesOnPage.length && index < recipesOnPage.length+recipesOffset) {
215                                            renderRecipesItem(item);
216                                        }
217                                    })
218
219                                recipesCounter += recipesOffset;
220                            }
221                        } else {
222                            recipesCounter = recipesArray.length-1;
223                            recipesArray.forEach((item, index) => {
224                                if (index >= recipesOnPage.length && index <= recipesCounter) {
225                                    renderRecipesItem(item);
226                                }
227                            })
228                        }
229                    }
230
231                })
232                break;
233        }
234}
235
236
237const renderCatalogItem = (elem, parentBlock) => {
238    const item = {
239        item_id: elem.item_id,
240        category_alias: elem.level1_alias,
241        prodgroup_alias: elem.leve2_alias,
242        product_alias: elem.product_alias,
243        short_name: elem.short_name,
244    }
245    const renderSwiperSlide = (el, slider, itemName) => {
246        let slide = document.createElement('div');
247        slide.classList.add('swiper-slide');
248        slide.innerHTML=`<img src="//static.rondell.ru/catalog-photos/${el["cat"]}/${el["item_id"]}/${el["file_name"]}" alt="${itemName}">`;
249        slider.append(slide);
250    }
251
252    let block = document.createElement('a');
253    block.setAttribute('href', `/catalog/${item.category_alias}/${item.prodgroup_alias}
253/${item.item_id}/${item.product_alias}/`)
254    block.classList.add('item-block', 'with-info');
255
256    let swiper = document.createElement('div');
257    swiper.classList.add('swiper', 'preview-swiper');
258    let swiperWrapper = document.createElement('div');
259    swiperWrapper.classList.add('swiper-wrapper');
260    let swiperPagination = document.createElement('div');
261    swiperPagination.classList.add('swiper-pagination');
262
263    if(elem["photos"]) {
264        elem["photos"].forEach((el) => {
265            renderSwiperSlide(el, swiperWrapper, elem['short_name'])
266        })
267    } else {
268        let slide = document.createElement('div');
269        slide.classList.add('swiper-slide');
270        slide.innerHTML='Нет фото';
271        swiperWrapper.append(slide);
272    }
273
274
275    swiper.append(swiperWrapper);
276    swiper.append(swiperPagination);
277    block.append(swiper);
278
279    let infoBlock = document.createElement('div');
280    infoBlock.classList.add('info');
281    infoBlock.innerHTML = `<div class="item-name">${item['short_name']}</div>
282                                <div>ID ${item['item_id']}</div>`;
283    block.append(infoBlock);
284    parentBlock.append(block)
285
286    let photosSlider = block.querySelector('.preview-swiper');
287
288    const blockSwiper = new Swiper(photosSlider, {
289        slidesPerView: 1,
290        spaceBetween: 30,
291        loop: true,
292        pagination: {
293            el: '.swiper-pagination',
294            clickable: false,
295            dynamicBullets: true,
296        },
297        speed: 1500,
298        autoplay: {
299            delay: 500,
300            disableOnInteraction: true,
301        },
302    });
303            blockSwiper.autoplay.stop();
304    photosSlider.addEventListener('mouseenter', () => {blockSwiper.autoplay.start()});
305    photosSlider.addEventListener('mouseleave', () => {blockSwiper.autoplay.stop()});
306    photosSlider.addEventListener('click', () => {blockSwiper.autoplay.stop()});
307
308}
309
310const renderNewsItem = (elem, index) => {
311    const item = {
312        id: elem.id,
313        alias: elem.alias,
314        title: elem.title,
315        date: elem.newsdate,
316        day: elem.day,
317        month: elem.month,
318        year: elem.year,
319        preview: elem.preview_img,
320    }
321
322    let block = document.createElement('a');
323    block.classList.add('news-block');
324    block.setAttribute('href', `/news/${item.alias}/`);
325    if(index !== 0 && (index+1)%7 === 0) {
326        block.classList.add('large');
327    }
328    if(index !== 0 && (index+1)%14 === 0) {
329        block.classList.add('left-text');
330    }
331
332    block.innerHTML = `<div class="preview">
333                                <img src="${item.preview}" alt="${item.title}">
334                            </div>
335                            <div class="info">
336                                <div class="title">${item.title}</div>
337                                <time datetime="${item.date}" class="date">${item.day} ${item.month} ${item.year}</time>
338                            </div>`;
339
340    document.querySelector('.tab-content .news-row').append(block);
341}
342
343const renderRecipesItem = (elem) => {
344    const item = {
345        id: elem.id,
346        title: elem.title,
347        anons: elem.anons,
348        alias: elem.alias,
349    }
350
351    let block = document.createElement('a');
352    block.setAttribute('href', `/retsepty/${item.alias}/`)
353    block.classList.add('recipe');
354    block.innerHTML = `<div class="brief">
355                                <div class="title">${item.title}</div>
356                                <div class="anons">${item.anons}</div>
357                            </div>
358                            <div class="preview">
359                                <img src="//static.rondell.ru/data/recipes/previews/${item.id}.jpg" alt="${item.title}">
360                            </div>`;
361
362    document.querySelector('.tab-content .recipes-row').append(block);
363}
364
365
366
367/*
368    Получение данных с сервера для блока с новинками товаров, слева в блоке без поисковой выдачи
369 */
370const getNewItems = async () => {
371    const response = await fetch('/main/getnewitemsforsearch');
372    if (!response.ok) {
373        const message = `An error has occured: ${response.status}`;
374        throw new Error(message);
375    }
376    const data = await response.json();
377    return data;
378}
379
380
381/*
382    Рендер блока с поиском без резульатов поиска
383 */
384const renderInitialSearchBlock = (newItems, searchTags) => {
385    let section = document.querySelector('.search-section');
386    section.innerHTML = '';
387
388    let parentBlock = document.createElement('div');
389    parentBlock.classList.add('wrapper');
390    parentBlock.innerHTML = `<div class="search-block"></div>`;
391
392    section.append(parentBlock);
393
394
395    /*рендер левого блока с новинками*/
396    let newItemsBlock = document.createElement('div');
397    newItemsBlock.classList.add('new-items');
398    parentBlock.querySelector('.search-block').append(newItemsBlock);
399    newItems.forEach((item) => {
400        renderCatalogItem(item, parentBlock.querySelector('.new-items'));
401    })
402
403
404    /*рендер правого блока с формой поиска*/
405    let formBlock = document.createElement('div');
406    formBlock.classList.add('search-form-block');
407    formBlock.innerHTML = `<form class="search-form" id="searchForm">
408                                <label for="searchInput">
409                                    <input type="text" id="searchInput" placeholder="Хочу найти" autocomplete="off">
410                                </label>
411                                <button type="submit"></button>
412                            </form>
413                            <ul class="hints"></ul>
414                            <ul class="recent-requests"></ul>
415                            <ul class="tags"></ul>`;
416
417    parentBlock.querySelector('.search-block').append(newItemsBlock);
418    parentBlock.querySelector('.search-block').append(formBlock);
419
420
421    searchTags.forEach((tag) => {
422        let li = document.createElement('li');
423        li.innerText = tag;
424        formBlock.querySelector('.tags').append(li);
425        li.addEventListener('click', () => clickOnSearchingTags(li));
426    })
427
428    if(localStorage.getItem('requests')) {
429        let recentRequests = JSON.parse(localStorage.getItem('requests'));
430
431        if(recentRequests.length > 0) {
432            recentRequests.forEach((el, index) => {
433                if(index < 6) {
434                    let li = document.createElement('li');
435                    li.innerText = el;
436                    formBlock.querySelector('.recent-requests').append(li);
437                    li.addEventListener('click', () => clickOnSearchingTags(li));
438                }
439            })
440        }
441    }
442
443    document.querySelector('input#searchInput').addEventListener('change', filledInputAnimation);
444}
445
446
447/*
448    Рендер и обработка событий в блоке с поиском без результатов поиска
449 */
450const loadInitialSearchBlock = async () => {
451    let items = [];
452    let tags = [];
453
454
455    await getNewItems().then(data => {
456        items=data;
457        return items;
458    });
459
460    await getSearchTags().then(data => {
461        tags=data;
462        return tags;
463    });
464
465    renderInitialSearchBlock(items, tags);
466
467    if(document.querySelector('.preview-swiper')) {
468        document.querySelectorAll('.preview-swiper').forEach((block) => {
469            let blockSwiper = new Swiper(block, {
470                slidesPerView: 1,
471                spaceBetween: 30,
472                loop: true,
473                pagination: {
474                    el: block.querySelector('.swiper-pagination'),
475                    clickable: false,
476                    dynamicBullets: true,
477                },
478                speed: 1500,
479                autoplay: {
480                    delay: 500,
481                    disableOnInteraction: true,
482                },
483            });
484            blockSwiper.autoplay.stop();
485            block.addEventListener('mouseenter', () => {blockSwiper.autoplay.start()});
486            block.addEventListener('mouseleave', () => {blockSwiper.autoplay.stop()});
487            block.addEventListener('click', () => {blockSwiper.autoplay.stop()});
488        })
489    }
490
491    /*document.getElementById('searchInput').focus({ focusVisible: true })*/
492    showSearchHints();
493    document.querySelector('#searchForm button[type=submit]').addEventListener('click', (e) => {
494        e.preventDefault();
495
496        catalog = [];
497        recipes = [];
498        news = [];
499        submitSearchForm();
500    });
501}
502
503
504/*
505    Рендер блока с поиском с результатами поиска
506 */
507const renderSearchResultsBlock = (request) => {
508    let section = document.querySelector('.search-section');
509    section.innerHTML = '';
510
511    let parentBlock = document.createElement('div');
512    parentBlock.classList.add('search-results');
513
514    let upperBlock = document.createElement('div');
515    upperBlock.classList.add('wrapper');
516    upperBlock.innerHTML = `<!--<button type="button" class="go-back">Назад</button>-->
517                            <div class="search-request">
518                                <form class="search-form" id="searchForm">
519                                    <label for="searchInput">
520                                        <input type="text" id="searchInput" placeholder="${request}" autocomplete="off" class="filled">
521                                    </label>
522                                    <button type="submit"></button>
523                                </form>
524                                <div>результаты по запросу</div>
525                                <div class="hints"></div>
526                            </div>`;
527
528    let tabsBlock = document.createElement('div');
529    tabsBlock.classList.add('tabs', 'search-tabs');
530    tabsBlock.innerHTML = `<div class="wrapper">
531                                <ul></ul>
532                            </div>`;
533
534    let tabContentBlock = document.createElement('div');
535    tabContentBlock.classList.add('tab-content', 'search-tab-content', 'active');
536
537    parentBlock.append(upperBlock);
538    parentBlock.append(tabsBlock);
539    parentBlock.append(tabContentBlock);
540    section.append(parentBlock);
541
542    showSearchHints();
543    document.getElementById('searchInput').addEventListener('focus', (e) => {
544        e.target.setAttribute('placeholder', '')
545    })
546    document.querySelector('#searchForm button[type=submit]').addEventListener('click', (e) => {
547        e.preventDefault();
548
549        catalog = [];
550        recipes = [];
551        news = [];
552        submitSearchForm();
553    })
554}
555
556
557/*
558    Рендер табов, если  что-то найдено
559 */
560const renderSearchTabs = (json) => {
561    let tabsNames = {
562        'catalog': 'Каталог',
563        'recipes': 'Рецепты',
564        'news': 'Новости'
565    }
566
567    json.forEach((el) => {
568        for(let key in tabsNames) {
569            if(el === key) {
570                let li = document.createElement('li');
571                li.innerText = tabsNames[key];
572                li.setAttribute('data-content', key);
573                document.querySelector('.search-tabs ul').append(li);
574            }
575        }
576    })
577}
578
579
580/*
581    Клик по табам в блоке с результатами поиска, если что-то найдено
582 */
583const clickOnSearchTabs = (el, itemsOffset, newsOffset, recipesOffset) => {
584    document.querySelectorAll('.search-tabs li').forEach((li) => li.classList.remove('active'));
585    el.classList.add('active');
586    let activeTabType= document.querySelector('.search-tabs li.active').getAttribute('data-content');
587    renderSearchTabContent(activeTabType, itemsOffset, newsOffset, recipesOffset);
588}
589
590
591/*
592    Рендер контента в зависимости от выбранной вкладки, в блоке с результатми поиска
593 */
594const renderSearchTabContent = (dataType, itemsOffset, newsOffset, recipesOffset) => {
595    let tabContentBlock = document.querySelector('.search-tab-content');
596    tabContentBlock.setAttribute('data-content', dataType);
597    tabContentBlock.innerHTML = '';
598
599    switch (dataType) {
600        case 'catalog':
601            let itemsBlock = document.createElement('div');
602            itemsBlock.classList.add('wrapper');
603            itemsBlock.innerHTML=`<div class="items-row"></div>`;
604
605            let briefBlock = document.createElement('div');
606            briefBlock.classList.add('items-info');
607            briefBlock.innerHTML = `<div class="wrapper">
608                                        <div class="items-info-inner">
609                                            <div class="quantity">Всего товаров ${catalog[0].length}</div>
610                                            <!--<div class="sorting-items select-block">
611                                                <button type="button" data-sorting="new">Новинки</button>
612                                                <ul>
613                                                    <li data-sorting="popular">Популярные</li>
614                                                    <li data-sorting="new" class="active">Новинки</li>
615                                                </ul>
616                                            </div>-->
617                                        </div>
618                                    </div>`;
619
620            tabContentBlock.append(briefBlock);
621            tabContentBlock.append(itemsBlock);
622
623            catalog[0].forEach((item, index) => {
624                if(index <= itemsOffset-1) {
625                    renderCatalogItem(item, document.querySelector('.tab-content .items-row'));
626                }
627            });
628
629            break;
630        case 'news':
631            let newsBlock = document.createElement('div');
632            newsBlock.classList.add('wrapper');
633            newsBlock.innerHTML=`<div class="news-row"></div>`;
634            tabContentBlock.append(newsBlock);
635
636            news[0].forEach((item, index) => {
637                if(index <= newsOffset-1) {
638                    renderNewsItem(item, index);
639                }
640            });
641            break;
642        case 'recipes':
643            let recipesBlock = document.createElement('div');
644            recipesBlock.classList.add('wrapper');
645            recipesBlock.innerHTML=`<div class="recipes-row"></div>`;
646            tabContentBlock.append(recipesBlock);
647
648            recipes[0].forEach((item, index) => {
649                if(index <= recipesOffset-1) {
650                    renderRecipesItem(item);
651                }
652            });
653            break;
654    }
655
656    loadItemsOnScroll(itemsOffset, newsOffset, recipesOffset);
657
658}
659
660
661/*
662    Рендер блока если ничего не найдено
663 */
664const renderNothingFoundBlock = (request) => {
665    let section = document.querySelector('.search-section');
666    section.innerHTML = '';
667
668    let parentBlock = document.createElement('div');
669    parentBlock.classList.add('search-results');
670
671    let upperBlock = document.createElement('div');
672    upperBlock.classList.add('wrapper');
673    upperBlock.innerHTML = `<button type="button" class="go-back">Назад</button>
674                            <div class="search-request">
675                                <div class="text-center">результаты по запросу</div>
676                                <div class="h2">${request}</div>
677                                <div class="text-center">Ничего не найдено. <br>Попробуйте изменить запрос и мы поищем ещё раз.</div>
678                            </div>
679`;
680
681    parentBlock.append(upperBlock);
682    section.append(parentBlock);
683
684    document.querySelector('.search-results button').addEventListener('click', (e) => {
685        e.preventDefault();
686        loadInitialSearchBlock();
687    });
688}
689
690/*
691    выделение цветом поля ввода запроса если заполнен или фокус
692 */
693const filledInputAnimation = () => {
694    let input = document.querySelector('input#searchInput');
695    if(input.value.length > 0) {
696        input.classList.add('filled');
697    } else {
698        input.classList.remove('filled');
699    }
700}
701
702/*
703    Показывает подсказки из катлога при вводе запроса в поле поиска
704 */
705const showSearchHints = () => {
706    let input = document.getElementById('searchInput');
707    let hintsBlock = document.querySelector('.hints');
708    try {
709        fetch('/main/getsearchhints',)
710            .then((response) => response.json())
711            .then((json) => {
712                input.addEventListener('input', () => {
713                    if(input.value.length >= 2) {
714                        hintsBlock.innerHTML = '';
715                        [...json].filter((el) => {
716                            if(el !== null && el.toLowerCase().includes(input.value.toLowerCase().trim())) {
717                                let li = document.createElement('li');
718                                li.innerText = el;
719                                hintsBlock.append(li);
720                                li.addEventListener('click', () => {
721                                    clickOnSearchingTags(li)
722                                });
723                            }
724                            });
725                    } else {
726                        hintsBlock.innerHTML = '';
727                    }
728                })
729            })
730    } catch (e) {
731        console.log(e.message)
732    }
733}
734
735
736/*
737    Получение с сервера блока со статичными запросами для поиска
738 */
739const getSearchTags = async () => {
740    const response = await fetch('/main/getsearchtags');
741    if (!response.ok) {
742        const message = `An error has occured: ${response.status}`;
743        throw new Error(message);
744    }
745    const data = await response.json();
746    return data;
747}
748
749
750/*
751    Заполнение поля ввода и отправка запроса на сервер по клику на блок со статичными запросами
752 */
753const clickOnSearchingTags = (el) => {
754    let input = document.querySelector('input#searchInput');
755    input.value = el.innerText;
756    filledInputAnimation();
757    catalog = [];
758    recipes = [];
759    news = [];
760    submitSearchForm()
761}
762
763
764//////////////////////////////////////////////////////////////////////
765
766/*
767код для кнопки наверх
768 */
769
770const goUpButtonAction = () => {
771    let btn = document.querySelector('.go-up');
772    let searchSection = document.querySelector('.search-section');
773
774    window.addEventListener('scroll', () => {
775        if(document.documentElement.scrollTop > screen.height/1.7 || searchSection.scrollTop > screen.height/1.7) {
776            btn.classList.add('active');
777
778        } else {
779            btn.classList.remove('active');
780        }
781    })
782
783        searchSection.addEventListener('scroll', () => {
784            if(searchSection.scrollTop > screen.height/1.7) {
785                btn.classList.add('active');
786
787            } else {
788                btn.classList.remove('active');
789            }
790        })
791
792    btn.addEventListener('click', () => {
793        if(searchSection.classList.contains('active')) {
794            searchSection.scrollTo({
795                top: 0,
796                behavior: 'smooth'
797            });
798        } else {
799            window.scrollTo({
800                top: 0,
801                behavior: 'smooth'
802            });
803        }
804
805    })
806
807}
808
809
810/*
811поменять тире на неразрывное тире в артикулах в названиях товаров, чтобы артикул переносился полностью
812 */
813const setMdashToItemsTitles = (el) => {
814    if(el.innerText.includes('-')) {
815        el.innerHTML = el.innerText.replace('-', '&#8209;')
816    }
817}
818
819
820document.addEventListener("DOMContentLoaded", () => {
821    if(document.querySelector('.preview-swiper')) {
822        document.querySelectorAll('.preview-swiper').forEach((block) => {
823            let blockSwiper = new Swiper(block, {
824                slidesPerView: 1,
825                spaceBetween: 30,
826                loop: true,
827                pagination: {
828                    el: block.querySelector('.swiper-pagination'),
829                    clickable: false,
830                    dynamicBullets: true,
831                },
832                speed: 1500,
833                autoplay: {
834                    delay: 500,
835                    disableOnInteraction: true,
836                },
837            });
838            blockSwiper.autoplay.stop();
839            block.addEventListener('mouseenter', () => {blockSwiper.autoplay.start()});
840            block.addEventListener('mouseleave', () => {blockSwiper.autoplay.stop()});
841            block.addEventListener('click', () => {blockSwiper.autoplay.stop()});
842        })
843    }
844
845    if(document.querySelector('.item-block')) {
846        document.querySelectorAll('.item-block .item-name').forEach(el => setMdashToItemsTitles(el))
847    }
848
849
850    showHideSearchSection();
851    loadInitialSearchBlock();
852
853    goUpButtonAction();
854})
855
856/*document.addEventListener('readystatechange', () => {
857
858    if (document.readyState === "complete") {
859        setTimeout(() => {
860            document.querySelector('.preloader').remove();
861        }, 1000)
862
863    }
864});*/
865
866

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.