PageSourceSearch

https://podemniki-ekb.ru/wp-content/themes/gpo/assets/js/app-dist.js?ver=0.3.268

js podemniki-ekb.ru collected 2026-10-06 14:12:46 UTC 79,012 bytes, 2,073 lines download raw bytes

1/* global appopt, jQuery, wpcf7, FWP */
2jQuery(document).ready(function ($) {
3    //https://stackoverflow.com/questions/47599704/cf7-refill-issue
4    wpcf7.cached = 0;
5
6    $('[data-fancybox]').fancybox({
7        toolbar : true,
8        parentEl : '.header__navbar',
9    });
10
11    $('body').on('keypress', 'input[name="yourname"],input[name="billing_first_name"],input[name="billing_last_name"],input[name="billing_city"],input[name="billing_address_1"],[name="author"]', function () {
12        var that = this;
13
14        setTimeout(function () {
15            var res = /[^a-zA-Zа-яёА-ЯЁ ]/g.exec(that.value);
16            that.value = that.value.replace(res, '');
17        }, 0);
18    });
19
20    $('body').on('keypress', '#user-name,#billing_first_name,#billing_last_name,input[name="yourname"],[name="author"]', function () {
21        var that = this;
22
23        setTimeout(function () {
24            var res = /[^a-zA-Zа-яёА-ЯЁ ]/g.exec(that.value);
25            that.value = that.value.replace(res, '');
26        }, 0);
27    });
28
29    if (appopt.app_table_prod) {
30        setInterval(function () {
31            var cont = jQuery(document).find('.cat_loop ul.products');
32            if (cont.length) {
33                if (!cont.hasClass('complete')) {
34                    jQuery('.cat_loop ul.products .seria').sort(function (a, b) {
35                        var el1 = $(a).attr('attr_sort');
36                        var el2 = $(b).attr('attr_sort');
37                        return el1 - el2;
38                    }).appendTo('.cat_loop ul.products');
39                    cont.addClass('complete');
40                }
41            }
42        });
43    }
44
45    /**
46	 * hide '<li>Страница 1</li>' in breadcrumbs on filters page
47	 */
48    if ($('.breadcrums li:last-child').text() == 'Страница 1') {
49        $('.breadcrums li:last-child').html('');
50    }
51
52
53    if (appopt.app_dist_spmm2) {
54        /**
55		 * spamm filter #2:
56		 */
57        $(document).on('focus', 'input[name="yourname"]', function () {
58
59            if (!$(this).hasClass('spmm-added')) {
60                $(this).parents('form').find('input.spmm').val(666);
61            }
62        });
63    }
64
65    /**
66	 * Change category menu:
67	 */
68    $('#category_catalog > .menu-item-has-children > a').each(function (indx, element) {
69        $(element).addClass('dropdown');
70        $(element).html($(element).html() + '<span class="toggle"></span>');
71        $(element).siblings('.sub-menu').addClass('widget_catalog__sublist');
72    });
73    $('.menu-item-has-children .menu-item-has-children .sub-menu').each(function (indx, element) {
74        $(element).addClass('widget_catalog__sub_sublist');
75    });
76    $('.current-product_cat-ancestor > a').addClass('active');
77
78
79    /**
80	 * Change seria title:
81	 */
82    function changeSeriaTitle() {
83
84        if (window.innerWidth <= 767) {
85
86            $('.seria').each(function (indx, element) {
87                $(element).find('.seria__header-left').prepend($(element).find('.seria__title'));
88            });
89        } else {
90
91            $('.seria').each(function (indx, element) {
92                $(element).find('.seria__header-right').prepend($(element).find('.seria__title'));
93            });
94        }
95    }
96
97
98    /**
99	 * Change mobile cart table:
100	 */
101    function changeCartTable() {
102
103        if (window.innerWidth <= 767) {
104
105            $('.cart_table:not(.mobile) .cart_table__row').each(function (indx, element) {
106
107                $(element).find('.product-thumbnail').append($(element).find('.product-name'));
108            });
109
110            $('.cart_table').addClass('mobile');
111
112        } else {
113
114            $('.cart_table.mobile .cart_table__row').each(function (indx, element) {
115
116                $(element).find('.product-thumbnail').after($(element).find('.product-thumbnail .product-name'));
117            });
118
119            $('.cart_table').removeClass('mobile');
120        }
121    }
122
123
124    /**
125	 * Change product page features block:
126	 */
127    function changeFeaturesProductPage() {
128
129        if (window.innerWidth <= 1400) {
130
131            $('.product_features_block').append($('.product_features'));
132
133        } else {
134
135            $('.section__product_summary .product_summary_wrp').append($('.product_features'));
136
137        }
138    }
139
140
141    /**
142	 * Change product page Titles:
143	 */
144    function changeTitlesProductPage() {
145
146        if (window.innerWidth <= 991) {
147
148            $('.section__product_summary .product_summary_wrp').prepend($('.sku_wrapper'));
149            $('.section__product_summary .product_summary_wrp').prepend($('.product_title'));
150
151        } else {
152
153            $('.section__product_summary .entry-summary').prepend($('.product_title'));
154            $('.section__product_summary .product_meta').prepend($('.sku_wrapper'));
155
156        }
157    }
158
159    /**
160	 * Change product page Titles:
161	 */
162    function changeTabsProductPage() {
163
164        if (window.innerWidth <= 768) {
165
166            $('.wc-tabs > li').each((index, element) => {
167
168                $(element).after($('#' + $(element).attr('aria-controls')));
169            });
170
171        } else {
172
173            $('.wc-tabs .woocommerce-Tabs-panel').each((index, element) => {
174
175                $('.section_tabs_panel .container').append($(element));
176            });
177
178        }
179    }
180
181    if ($('.wc-tabs').length) {
182        $('.wc-tabs li a').each(function () {
183            const target = $($(this).attr('href'));
184            const content = $.trim(target.text());
185
186            if (content.length === 0) {
187                $(this).parent().remove();
188                target.remove();
189            }
190        });
191    }
192
193    /**
194	 * Hide dots contain 1 dot in the scopes slider:
195	 */
196    function toggleDotsScopesSlider() {
197        if ($('#slider_scopes .slick-dots li').length <= 1) {
198            $('#slider_scopes .slick-dots').css('opacity', '0').css('height', '0');
199        } else {
200            $('#slider_scopes .slick-dots').css('opacity', '1').css('height', 'auto');
201        }
202    }
203
204
205    function initCompare() {
206        $('.berocket_compare_widget_start a.berocket_show_compare_toolbar').append('<span></span>');
207
208        updateAllCompare();
209
210        $(document).off('click', '.br_compare_button').on('click', '.br_compare_button', function (e) {
211            const $parent = $(this).closest('.product-card__add-compare');
212            const $tooltip = $parent.find('.tooltip');
213            const isMobile = $(window).width() <= 768;
214
215            if (!$(this).hasClass('br_compare_added')) {
216                addItemCompare($(this).data('id'));
217                $(this).addClass('br_compare_added');
218                $parent.addClass('added');
219                $tooltip.text(isMobile ? $parent.attr('data-tooltip-added_mob') : $parent.attr('data-tooltip-added'));
220            } else {
221                removeItemCompare($(this).data('id'));
222                $(this).removeClass('br_compare_added');
223                $parent.removeClass('added');
224                $tooltip.text(isMobile ? $parent.attr('data-tooltip_mob') : $parent.attr('data-tooltip'));
225            }
226
227            if (isMobile) {
228                $tooltip.css('display', 'block');
229                $(document).on('touchstart', function (event) {
230                    if (!$(event.target).closest('.product-card__add-compare').length) {
231                        $tooltip.css('display', 'none');
232                        $(document).off('touchstart');
233                    }
234                });
235                setTimeout(()=> {
236                    $tooltip.css('display', 'none');
237                }, 3000);
238            }
239
240            e.preventDefault();
241            return false;
242        }).addClass('br_compare_button_inited');
243
244        $(document).on('click', '.berocket_show_compare_toolbar', e => {
245            location.href = $('.compare-link').attr('href');
246        });
247    }
248
249    function getCompareCookieProducts() {
250        let products = $.cookie('br_products_compare');
251        if (!products) {
252            // fallback если cookie писался без domain
253            products = document.cookie.replace(/(?:(?:^|.*;\s*)br_products_compare\s*\=\s*([^;]*).*$)|^.*$/, '$1');
254            products = products ? decodeURIComponent(products) : '';
255        }
256        if (!products) return [];
257        return products.split(',').map(function (id) {
258            return String(id).trim();
259        }).filter(Boolean);
260    }
261
262    function setCompareCookie(products) {
263        $.cookie('br_products_compare', products, { path: '/', expires: 7 });
264    }
265
266    function updateAllCompare() {
267        const a_products = getCompareCookieProducts();
268        let $br_compare_button = $('.br_compare_button');
269        let not_added = $br_compare_button.find('span.br_compare_button_text').data('not_added');
270        let added = $br_compare_button.find('span.br_compare_button_text').data('added');
271
272        $br_compare_button.removeClass('br_compare_added');
273        $br_compare_button.closest('.product-card__add-compare').removeClass('added');
274        if (not_added) {
275            $br_compare_button.find('span.br_compare_button_text').text(not_added);
276        }
277
278        a_products.forEach(function (el) {
279            let $el = $('.br_product_' + el);
280            if (!$el.length) return;
281
282            $el.addClass('br_compare_added');
283            if (added) {
284                $el.find('span.br_compare_button_text').text(added);
285            }
286            const $parent = $el.closest('.product-card__add-compare');
287            $parent.addClass('added');
288            const isMobile = $(window).width() <= 768;
289            $parent.find('.tooltip').text(isMobile ? $parent.attr('data-tooltip-added_mob') : $parent.attr('data-tooltip-added'));
290        });
291
292        if (a_products.length) {
293            $('.header__compare').addClass('active');
294        } else {
295            $('.header__compare').removeClass('active');
296        }
297    }
298
299    function addItemCompare(product) {
300        product = String(product);
301        let $product = $('.br_product_' + product);
302        $product.addClass('br_compare_added');
303        $product.closest('.product-card__add-compare').addClass('added');
304        $product.find('span.br_compare_button_text').text($product.find('span.br_compare_button_text').data('added'));
305
306        let products = getCompareCookieProducts();
307        if (products.indexOf(product) === -1) {
308            products.push(product);
309            setCompareCookie(products.join(','));
310        }
311        $('.header__compare').addClass('active');
312    }
313
314    function removeItemCompare(product) {
315        product = String(product);
316        let products = getCompareCookieProducts().filter(function (id) {
317            return id !== product;
318        });
319
320        let $product = $('.br_product_' + product);
321        $product.removeClass('br_compare_added');
322        $product.find('span.br_compare_button_text').text($product.find('span.br_compare_button_text').data('not_added'));
323        $product.closest('.product-card__add-item').removeClass('added');
324        setCompareCookie(products.join(','));
325
326        if (!products.length) {
327            $('.header__compare').removeClass('active');
328        }
329    }
330
331    function toggleWishlistText($button) {
332        const $tooltip = $button.find('.wish-tooltip');
333        if (!$tooltip.length) return; // Ensure tooltip exists
334
335        if ($button.hasClass('added')) {
336            $tooltip.text($button.data('tooltip'));
337        } else {
338            $tooltip.text($button.data('tooltip-added'));
339        }
340    }
341
342    function setupWishlistButton() {
343        const $wishlistButton = $('.product-card__add-item.product-card__liked');
344        if (!$wishlistButton.length) return; // Ensure button exists
345
346        const toggleText = () => toggleWishlistText($wishlistButton);
347
348        $wishlistButton.on('click touchend', toggleText);
349    }
350
351    // Initialize the wishlist button setup
352    $(document).ready(function() {
353        updateHeaderCompare();
354        setupWishlistButton();
355    });
356    function updateHeaderCompare() {
357        $('.br_compare_button').on('click', function () {
358            const compareCookie = $.cookie('br_products_compare');
359            if (compareCookie === '' ) {
360                $('.header__compare').removeClass('active');
361            }
362            else {
363                $('.header__compare').addClass('active');
364            }
365        });
366    }
367
368
369    initCompare();
370    updateHeaderCompare();
371    changeSeriaTitle();
372    changeCartTable();
373    changeFeaturesProductPage();
374    changeTitlesProductPage();
375    changeTabsProductPage();
376    toggleDotsScopesSlider();
377
378    $(window).on('resize', function () {
379
380        changeSeriaTitle();
381        changeCartTable();
382        changeFeaturesProductPage();
383        changeTitlesProductPage();
384        changeTabsProductPage();
385        toggleDotsScopesSlider();
386    });
387
388
389    /**
390	 * Facetwp product filters => hide empty filters
391	 */
392    let shouldScrollToHeader = false;
393
394    $(document).on('click', '.aside_widget .facetwp-facet', function () {
395        shouldScrollToHeader = true;
396    });
397
398    document.addEventListener('facetwp-loaded', function () {
399        $.each(FWP.settings.num_choices, function (key, val) {
400            var $facet = $('.facetwp-facet-' + key);
401            var $parent = $facet.closest('.widget_filter');
402            if ($parent.length && val === 0) {
403                $parent.remove();
404            }
405        });
406
407        // Initialize compare and update header
408        initCompare();
409        updateHeaderCompare();
410        restoreProductCardStates();
411
412        // Scroll to the .woocommerce-products-header block if the filter was clicked in aside_widget
413        if (shouldScrollToHeader) {
414            $('html, body').animate({
415                scrollTop: $('.woocommerce-products-header').offset().top
416            }, 500); // Adjust the duration as needed
417
418            // Reset the flag
419            shouldScrollToHeader = false;
420        }
421    });
422
423    /**
424	 * Sticky widget_filters
425	 */
426    function toggleFilterSticky() {
427
428        if ($(window).width() < 992) {
429
430            $('.widget_filters.filters_sticky').removeAttr('style');
431            $('.widget_filters.filters_sticky').removeClass('filters_sticky');
432
433            if ($('.widget_filters__overlay').css('display') == 'block') {
434                $('.widget_filters').css({'left': '10px'});
435            }
436
437            return;
438        }
439
440        let widget_filters = $('.widget_filters'),
441            headerHeight = $('#header_navbar').outerHeight();
442
443        widget_filters.addClass('filters_sticky');
444
445        if (($('#header').css('top') == '0px') && ($('#header').css('position') == 'sticky')) {
446            headerHeight += $('#header').outerHeight();
447        }
448
449        headerHeight += 10;
450        widget_filters.css({
451            'top': headerHeight + 'px'
452        });
453
454        let filtersWrpHeight = $(window).height() - headerHeight - 10;
455        let filtersOriginHeight = $('.widget_filters__title').outerHeight() + $('.widget_filters__wrp').outerHeight() + $('.widget_filters__bottom').outerHeight();
456
457        if( filtersOriginHeight > 0 ) {
458            if ((filtersOriginHeight > filtersWrpHeight) || (filtersOriginHeight != widget_filters.outerHeight())) {
459
460                widget_filters.css({
461                    'height': filtersWrpHeight + 'px',
462                    'overflow-y': 'auto'
463                });
464
465            }
466        }
467    }
468
469    toggleFilterSticky();
470    $(window).on('scroll', { passive: true }, function (n) {
471        toggleFilterSticky();
472    });
473    $(window).on('resize', function () {
474        toggleFilterSticky();
475    });
476
477
478    /**
479	 * Sticky headers:
480	 */
481    let docCurrentTop = $(document).scrollTop();
482    $(document).on('scroll', { passive: true }, function (e) {
483
484        let docEventTop = $(document).scrollTop(),
485            headerHeight = $('#header').outerHeight(),
486            headerNavbarHeight = $('#header_navbar').outerHeight(),
487            styleTransition = '0.25s';
488
489        if (docCurrentTop > docEventTop) {
490
491            // if scroll to Top:
492            $('#header').css({'position': 'sticky', 'top': '0', 'transition': styleTransition});
493            $('#header_navbar').css({'top': headerHeight + 'px', 'transition': styleTransition});
494
495            setTimeout(() => toggleFilterSticky(), 100);
496
497            $('body').data('sticky-header', (headerHeight + headerNavbarHeight));
498
499        } else if (docCurrentTop < docEventTop) {
500
501            // if scroll to Down:
502            $('#header').css({'top': '-' + headerHeight + 'px', 'transition': styleTransition});
503            $('#header_navbar').css({'top': '0', 'transition': styleTransition});
504
505            $('body').data('sticky-header', headerNavbarHeight);
506        }
507
508        docCurrentTop = docEventTop;
509    });
510
511
512    /**
513	 * Open/Close product filters on mobile:
514	 */
515    // Close:
516    $(document).on('click', '.widget_filters__overlay, .widget_filters__close', function () {
517        $('.widget_filters__overlay').fadeOut(200);
518        $('.widget_filters').animate({left: '-412px'}, 300);
519        $('.widget_filters__open').fadeIn(200);
520    });
521    // Open:
522    $(document).on('click', '.widget_filters__open', function () {
523        $('.widget_filters__open').fadeOut(200);
524        $('.widget_filters__overlay').fadeIn(200);
525        $('.widget_filters').animate({left: '10px'}, 300);
526    });
527
528
529    /**
530	 * Open more content on the home page:
531	 */
532    $(document).on('click', '[data-more]', function () {
533        let moreContent = $('[data-more]').data('more');
534        $(this).hide();
535        $('#' + moreContent).show();
536    });
537
538
539    /**
540	 * Open more serija content:
541	 */
542    $(document).on('click', '.seria__more', function () {
543        let moreContent = $(this).parent().siblings('.seria__desc');
544        if ($(this).hasClass('open')) {
545            $(this).removeClass('open');
546            $(this).text('Полное описание');
547            moreContent.hide();
548        } else {
549            $(this).addClass('open');
550            $(this).text('Скрыть описание');
551            moreContent.show();
552        }
553    });
554
555
556    /**
557	 * Phone input validation:
558	 */
559    $('input[type=tel]').on('keypress', function (e) {
560        let keys;
561        return (keys = ['+', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ', '-', '(', ')']), keys.indexOf(e.key) > -1;
562    });
563
564
565    /**
566	 * Sliders implements:
567	 */
568
569    $('#slider_sale, #slider_viewed, #slider_similar, #slider_soput, #slider_hits_category').slick({
570        infinite: true,
571        arrows: false,
572        slidesToShow: 4,
573        slidesToScroll: 1,
574        dots: true,
575        prevArrow:
576			'<button class="slider-arrow prev"><svg width="48" height="16" viewBox="0 0 48 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M0.292893 8.70711C-0.0976295 8.31659 -0.0976296 7.68342 0.292892 7.2929L6.65685 0.928936C7.04738 0.538411 7.68054 0.538411 8.07107 0.928936C8.46159 1.31946 8.46159 1.95262 8.07107 2.34315L2.41422 8L8.07107 13.6569C8.46159 14.0474 8.46159 14.6805 8.07107 15.0711C7.68054 15.4616 7.04738 15.4616 6.65685 15.0711L0.292893 8.70711ZM48 9L1 9L1 7L48 7L48 9Z" fill="#434343"/></svg></button>',
577        nextArrow:
578			'<button class="slider-arrow next"><svg width="48" height="16" viewBox="0 0 48 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M47.7071 8.70711C48.0976 8.31659 48.0976 7.68342 47.7071 7.2929L41.3431 0.928936C40.9526 0.538411 40.3195 0.538411 39.9289 0.928936C39.5384 1.31946 39.5384 1.95262 39.9289 2.34315L45.5858 8L39.9289 13.6569C39.5384 14.0474 39.5384 14.6805 39.9289 15.0711C40.3195 15.4616 40.9526 15.4616 41.3431 15.0711L47.7071 8.70711ZM-8.74228e-08 9L47 9L47 7L8.74228e-08 7L-8.74228e-08 9Z" fill="#434343"/></svg></button>',
579        responsive: [
580            {breakpoint: 1440, settings: {slidesToShow: 3}},
581            {breakpoint: 1100, settings: {slidesToShow: 2}},
582            {breakpoint: 768, settings: {slidesToShow: 1}},
583        ],
584    });
585
586    $('#slider_blog').slick({
587        infinite: true,
588        arrows: false,
589        slidesToShow: 1,
590        slidesToScroll: 1,
591        dots: true,
592        responsive: [
593            {breakpoint: 1e4, settings: 'unslick'},
594            {breakpoint: 1440, settings: {slidesToShow: 3}},
595            {breakpoint: 1100, settings: {slidesToShow: 2}},
596            {breakpoint: 768, settings: {slidesToShow: 1}},
597        ],
598    });
599
600
601    if ((window.location.href.indexOf('#tab-reviews') > -1) || ($('#slider_questions').closest('.woocommerce-Tabs-panel').length == 0)) {
602
603        $('#slider_questions').slick({
604            infinite: true,
605            slidesToShow: 3,
606            slidesToScroll: 1,
607            dots: true,
608            prevArrow:
609                '<button class="slider-arrow prev"><svg width="48" height="16" viewBox="0 0 48 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M0.292893 8.70711C-0.0976295 8.31659 -0.0976296 7.68342 0.292892 7.2929L6.65685 0.928936C7.04738 0.538411 7.68054 0.538411 8.07107 0.928936C8.46159 1.31946 8.46159 1.95262 8.07107 2.34315L2.41422 8L8.07107 13.6569C8.46159 14.0474 8.46159 14.6805 8.07107 15.0711C7.68054 15.4616 7.04738 15.4616 6.65685 15.0711L0.292893 8.70711ZM48 9L1 9L1 7L48 7L48 9Z" fill="#434343"/></svg></button>',
610            nextArrow:
611                '<button class="slider-arrow next"><svg width="48" height="16" viewBox="0 0 48 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M47.7071 8.70711C48.0976 8.31659 48.0976 7.68342 47.7071 7.2929L41.3431 0.928936C40.9526 0.538411 40.3195 0.538411 39.9289 0.928936C39.5384 1.31946 39.5384 1.95262 39.9289 2.34315L45.5858 8L39.9289 13.6569C39.5384 14.0474 39.5384 14.6805 39.9289 15.0711C40.3195 15.4616 40.9526 15.4616 41.3431 15.0711L47.7071 8.70711ZM-8.74228e-08 9L47 9L47 7L8.74228e-08 7L-8.74228e-08 9Z" fill="#434343"/></svg></button>',
612            responsive: [{breakpoint: 768, settings: {slidesToShow: 1, slidesToScroll: 1}}],
613        });
614    }
615
616    $('#tab-title-questions').click(function () {
617
618        if ($(window).width() < 766) {
619            setTimeout(() => {
620                $('html, body').animate({
621                    scrollTop: jQuery('#tab-questions').offset().top - 200
622                }, 2000);
623            }, '1000');
624        }
625
626        $('#slider_questions:not(.slick-initialized)').slick({
627            infinite: true,
628            slidesToShow: 3,
629            slidesToScroll: 1,
630            dots: true,
631            prevArrow:
632                '<button class="slider-arrow prev"><svg width="48" height="16" viewBox="0 0 48 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M0.292893 8.70711C-0.0976295 8.31659 -0.0976296 7.68342 0.292892 7.2929L6.65685 0.928936C7.04738 0.538411 7.68054 0.538411 8.07107 0.928936C8.46159 1.31946 8.46159 1.95262 8.07107 2.34315L2.41422 8L8.07107 13.6569C8.46159 14.0474 8.46159 14.6805 8.07107 15.0711C7.68054 15.4616 7.04738 15.4616 6.65685 15.0711L0.292893 8.70711ZM48 9L1 9L1 7L48 7L48 9Z" fill="#434343"/></svg></button>',
633            nextArrow:
634                '<button class="slider-arrow next">
634<svg width="48" height="16" viewBox="0 0 48 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M47.7071 8.70711C48.0976 8.31659 48.0976 7.68342 47.7071 7.2929L41.3431 0.928936C40.9526 0.538411 40.3195 0.538411 39.9289 0.928936C39.5384 1.31946 39.5384 1.95262 39.9289 2.34315L45.5858 8L39.9289 13.6569C39.5384 14.0474 39.5384 14.6805 39.9289 15.0711C40.3195 15.4616 40.9526 15.4616 41.3431 15.0711L47.7071 8.70711ZM-8.74228e-08 9L47 9L47 7L8.74228e-08 7L-8.74228e-08 9Z" fill="#434343"/></svg></button>',
635            responsive: [{breakpoint: 768, settings: {slidesToShow: 1, slidesToScroll: 1}}],
636        });
637    });
638
639    if ((window.location.href.indexOf('#tab-reviews') > -1) || ($('#slider_reviews').closest('.woocommerce-Tabs-panel').length == 0)) {
640
641        $('#slider_reviews').slick({
642            infinite: true,
643            slidesToShow: 2,
644            slidesToScroll: 1,
645            dots: true,
646            prevArrow:
647				'<button class="slider-arrow prev"><svg width="48" height="16" viewBox="0 0 48 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M0.292893 8.70711C-0.0976295 8.31659 -0.0976296 7.68342 0.292892 7.2929L6.65685 0.928936C7.04738 0.538411 7.68054 0.538411 8.07107 0.928936C8.46159 1.31946 8.46159 1.95262 8.07107 2.34315L2.41422 8L8.07107 13.6569C8.46159 14.0474 8.46159 14.6805 8.07107 15.0711C7.68054 15.4616 7.04738 15.4616 6.65685 15.0711L0.292893 8.70711ZM48 9L1 9L1 7L48 7L48 9Z" fill="#434343"/></svg></button>',
648            nextArrow:
649				'<button class="slider-arrow next"><svg width="48" height="16" viewBox="0 0 48 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M47.7071 8.70711C48.0976 8.31659 48.0976 7.68342 47.7071 7.2929L41.3431 0.928936C40.9526 0.538411 40.3195 0.538411 39.9289 0.928936C39.5384 1.31946 39.5384 1.95262 39.9289 2.34315L45.5858 8L39.9289 13.6569C39.5384 14.0474 39.5384 14.6805 39.9289 15.0711C40.3195 15.4616 40.9526 15.4616 41.3431 15.0711L47.7071 8.70711ZM-8.74228e-08 9L47 9L47 7L8.74228e-08 7L-8.74228e-08 9Z" fill="#434343"/></svg></button>',
650            responsive: [{breakpoint: 768, settings: {slidesToShow: 1, slidesToScroll: 1}}],
651        });
652    }
653
654    $('#tab-title-reviews').click(function () {
655
656        if ($(window).width() < 766) {
657            setTimeout(() => {
658                $('html, body').animate({
659                    scrollTop: jQuery('#tab-reviews').offset().top - 200
660                }, 2000);
661            }, '1000');
662        }
663
664        $('#slider_reviews:not(.slick-initialized)').slick({
665            infinite: true,
666            slidesToShow: 2,
667            slidesToScroll: 1,
668            dots: true,
669            prevArrow:
670				'<button class="slider-arrow prev"><svg width="48" height="16" viewBox="0 0 48 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M0.292893 8.70711C-0.0976295 8.31659 -0.0976296 7.68342 0.292892 7.2929L6.65685 0.928936C7.04738 0.538411 7.68054 0.538411 8.07107 0.928936C8.46159 1.31946 8.46159 1.95262 8.07107 2.34315L2.41422 8L8.07107 13.6569C8.46159 14.0474 8.46159 14.6805 8.07107 15.0711C7.68054 15.4616 7.04738 15.4616 6.65685 15.0711L0.292893 8.70711ZM48 9L1 9L1 7L48 7L48 9Z" fill="#434343"/></svg></button>',
671            nextArrow:
672				'<button class="slider-arrow next"><svg width="48" height="16" viewBox="0 0 48 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M47.7071 8.70711C48.0976 8.31659 48.0976 7.68342 47.7071 7.2929L41.3431 0.928936C40.9526 0.538411 40.3195 0.538411 39.9289 0.928936C39.5384 1.31946 39.5384 1.95262 39.9289 2.34315L45.5858 8L39.9289 13.6569C39.5384 14.0474 39.5384 14.6805 39.9289 15.0711C40.3195 15.4616 40.9526 15.4616 41.3431 15.0711L47.7071 8.70711ZM-8.74228e-08 9L47 9L47 7L8.74228e-08 7L-8.74228e-08 9Z" fill="#434343"/></svg></button>',
673            responsive: [{breakpoint: 768, settings: {slidesToShow: 1, slidesToScroll: 1}}],
674        });
675    });
676
677    $('.category_content #slider_scopes').slick({
678        infinite: false,
679        slidesToShow: 1,
680        slidesToScroll: 1,
681        dots: true,
682        arrows: false,
683        responsive: [
684            {breakpoint: 1e4, settings: {slidesToShow: 4}},
685            {breakpoint: 1440, settings: {slidesToShow: 3}},
686            {breakpoint: 1100, settings: {slidesToShow: 2}},
687            {breakpoint: 768, settings: {slidesToShow: 1}},
688        ],
689    });
690
691    $('#tab-title-areas').click(function () {
692
693        $('.scopes #slider_scopes:not(.slick-initialized)').slick({
694            infinite: false,
695            slidesToShow: 1,
696            slidesToScroll: 1,
697            dots: true,
698            arrows: false,
699            responsive: [
700                {breakpoint: 1e4, settings: {slidesToShow: 4}},
701                {breakpoint: 1440, settings: {slidesToShow: 3}},
702                {breakpoint: 1100, settings: {slidesToShow: 2}},
703                {breakpoint: 768, settings: {slidesToShow: 1}},
704            ],
705        });
706    });
707
708
709    /**
710	 * About section title replaced:
711	 */
712    window.screen.width >= 1300 && $('.section__about-text').prepend($('.section__about .title_1'));
713
714
715    /**
716	 * Modals functionality:
717	 */
718    function modalOpen(modal, overlay = true) {
719
720        let scrollWidth = window.innerWidth - $(document).width();
721        if (overlay) {
722            $('.overlay').addClass('active');
723        }
724        $('body').addClass('overlay-body').css('margin-right', scrollWidth + 'px');
725        $('[data-modal="' + modal + '"]').addClass('active');
726    }
727
728    function modalClose(overlay = true) {
729
730        if (overlay) {
731            $('.overlay').removeClass('active');
732        }
733        $('.active[data-modal]').removeClass('active');
734        setTimeout(function () {
735            $('body').removeClass('overlay-body').css('margin-right', '0');
736        }, 200);
737    }
738
739    $(document).on('click', '[data-modal-open]', function (e) {
740        e.preventDefault();
741        let modalName = $(this).data('modal-open');
742
743        // if OneClick:
744        if ((modalName == 'modal_oneclick') || (modalName == 'modal_order') || (modalName == 'modal_lizing' ) ) {
745            let $quantityInput = $('[name="quantity"]')[0];
746            if ($quantityInput) {
747                $(this).data('quantity', $('[name="quantity"]')[0].value);
748            }
749            let prodName = $(this).data('name'),
750                prodPrice = $(this).data('price'),
751                prodQuantity = $(this).data('quantity'),
752                prodPriceText = '',
753                prodModel = '';
754
755            if (prodQuantity > 1000) {
756                prodQuantity = 1000;
757            }
758
759            // if product Price exist:
760            if (prodPrice) {
761                prodPriceText = prodPrice.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ' ') + ' \u20bd х ' + prodQuantity + 'шт.';
762            } else {
763                prodPriceText = 'Цена по запросу';
764            }
765            prodModel = prodName + ' : ' + prodPriceText;
766
767            $('[data-modal=' + modalName + '] .form-model__title').text(prodName);  // change product name
768            $('[data-modal=' + modalName + '] .form-model__value').text(prodPriceText); // change product price
769            $('[data-modal=' + modalName + '] input[name=model]').val(prodModel);
770
771            let priceInput = $('[data-modal=' + modalName + '] input[name=model]');
772
773            if (priceInput.length > -1) {
774                prodPriceText = prodPrice.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ' ') + ' \u20bd';
775                $('[data-modal=' + modalName + '] input[name=model]').val(prodName);
776                $('[data-modal=' + modalName + '] input[name=price]').val(prodPriceText);
777                $('[data-modal=' + modalName + '] input[name=count]').val(prodQuantity);
778            }
779        }
780        if ((modalName === 'modal_chipper') ) {
781            let prodName = $(this).data('name');
782            $('[data-modal=' + modalName + '] input[name=yourmodel]').val(prodName);
783        }
784        modalOpen(modalName);
785    });
786
787    $('.overlay, [data-modal-close]').click(function (e) {
788        e.preventDefault();
789        modalClose();
790    });
791
792
793    /**
794	 * Mobile menu open/close menu items:
795	 */
796    $('#header_mobmenu .menu-item-has-children > a').append('<span class="toggle"></span>');
797    $('#header_mobmenu .toggle').click(function (e) {
798        e.preventDefault();
799        let t = $(this).parent();
800        t.toggleClass('open'), t.siblings('ul').slideToggle(300);
801    });
802    $('#category_catalog .toggle').click(function (e) {
803        e.preventDefault();
804        let t = $(this).parent();
805        t.hasClass('open') ? t.siblings('ul').slideUp(300) : $(this).hasClass('first') ? (t.siblings('ul').slideDown(0), $(this).removeClass('first')) : t.siblings('ul').slideDown(300), t.toggleClass('open');
806    });
807    $('#category_catalog .active .toggle').addClass('first').click();
808
809
810    $('#header_mobmenu .menu-item-has-children > a::after').click(function (e) {
811        e.preventDefault();
812        let t = $(this).parent();
813        t.toggleClass('open');
814        t.siblings('ul').slideToggle(300);
815    });
816    $('#category_catalog .menu-item-has-children > a::after').click(function (e) {
817        e.preventDefault();
818        let t = $(this).parent();
819        t.hasClass('open') ? t.siblings('ul').slideUp(300) : $(this).hasClass('first') ? (t.siblings('ul').slideDown(0), $(this).removeClass('first')) : t.siblings('ul').slideDown(300), t.toggleClass('open');
820    });
821    $('#category_catalog .menu-item-has-children > a.active').addClass('first').click();
822
823
824    /**
825	 * Search open/close:
826	 */
827    $('#header_search_btn, #header_search_close').click(function (e) {
828        e.preventDefault();
829        $('#header_search').toggleClass('open');
830    });
831
832
833    /**
834	 * Hide slick-dots if too low elements:
835	 */
836    $('.slick-slider').each((index, element) => {
837
838        if (!$(element).find('.slick-dots li:not(.slick-active)').length) {
839            $(element).find('.slick-dots').hide();
840        }
841    });
842
843    /**
844	 * Remove areas tab remove if empty:
845	 */
846    if (!$('#tab-areas #slider_scopes').length) {
847
848        $('#tab-areas').remove();
849        $('#tab-title-areas').remove();
850    }
851
852
853    document.addEventListener('wpcf7beforesubmit', function (event) {
854        const form = event.target;
855        const tokenInput = form.querySelector('input[name="smart-token"]');
856        let captchaField = form.querySelector('input[name="form-captcha"]');
857
858        if (!captchaField) {
859            captchaField = document.createElement('input');
860            captchaField.type = 'hidden';
861            captchaField.name = 'form-captcha';
862            captchaField.className = 'form-captcha-input';
863            form.appendChild(captchaField);
864        }
865
866        if (tokenInput && tokenInput.value) {
867            captchaField.value = tokenInput.value;
868        }
869    }, false);
870
871    /**
872	 * Forms event success submit:
873	 */
874    document.addEventListener('wpcf7submit', function (event) {
875        if (event.detail.status === 'mail_sent') {
876            if ($('#' + event.detail.unitTag).parents('[data-modal]').length) {
877                modalClose();
878            }
879            let $target = $(event.target);
880
881            setTimeout(() => {
882                if ($target.hasClass('wpcf7-podpiska-na-rassylku')) {
883                    modalOpen('modal_thanks_podpiska');
884                } else {
885                    modalOpen('modal_thanks');
886                }
887
888                setTimeout(() => {
889                    modalClose();
890                }, 4000);
891
892            }, 500);
893        }
894    }, false);
895
896
897    /**
898	 * Tooltips:
899	 */
900    $(document).on({
901        mouseenter: function () {
902            let text = '';
903
904            if ($(this).find('.br_compare_added').length > 0) {
905                text = $(this).data('tooltip-added');
906            } else {
907                text = $(this).data('tooltip');
908            }
909
910            $(this).find('.tooltip').text(text);
911
912            $(this).find('.tooltip').fadeIn(150);
913        },
914
915        mouseleave: function () {
916            $(this).find('.tooltip').fadeOut(150);
917        }
918    }, '[data-tooltip]');
919
920
921    /**
922	 * Wishlist:
923	 */
924    // возвращает cookie если есть или undefined
925    function getCookie(name) {
926
927        var matches = document.cookie.match(new RegExp(
928            '(?:^|; )' + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + '=([^;]*)'
929        ));
930        return matches ? decodeURIComponent(matches[1]) : undefined;
931    }
932
933    function getWishlistIds() {
934        var ids = getCookie('wishlist_ids');
935        if (!ids) return [];
936        return ids.split(',').map(function (id) {
937            return String(id).trim();
938        }).filter(Boolean);
939    }
940
941    function setWishlistCookie(ids) {
942        document.cookie = 'wishlist_ids=' + ids.join(',') + '; path=/; max-age=2592000; SameSite=Lax';
943    }
944
945    function getCartIds() {
946        // Реальная корзина из PHP — источник правды (в т.ч. пустая после удаления)
947        if (typeof appopt !== 'undefined' && Array.isArray(appopt.cart_product_ids)) {
948            return appopt.cart_product_ids.map(function (id) {
949                return String(id).trim();
950            }).filter(Boolean);
951        }
952
953        // fallback только если appopt недоступен (жёсткий HTML-кэш)
954        var ids = [];
955        var cookieIds = getCookie('gpo_cart_ids');
956        if (cookieIds) {
957            cookieIds.split(',').forEach(function (id) {
958                id = String(id).trim();
959                if (id && ids.indexOf(id) === -1) ids.push(id);
960            });
961        }
962        return ids;
963    }
964
965    function getCartUrl() {
966        if (typeof appopt !== 'undefined' && appopt.cart_url) {
967            return appopt.cart_url;
968        }
969        if (typeof wc_add_to_cart_params !== 'undefined' && wc_add_to_cart_params.cart_url) {
970            return wc_add_to_cart_params.cart_url;
971        }
972        var $headerCart = $('.header__cart a, a.header__cart').first();
973        return $headerCart.length ? $headerCart.attr('href') : '/cart/';
974    }
975
976    function setCartIds(ids) {
977        var unique = [];
978        ids.forEach(function (id) {
979            id = String(id).trim();
980            if (id && unique.indexOf(id) === -1) unique.push(id);
981        });
982        document.cookie = 'gpo_cart_ids=' + unique.join(',') + '; path=/; max-age=2592000; SameSite=Lax';
983    }
984
985    function addCartId(productId) {
986        productId = String(productId);
987        var ids = [];
988        var cookieIds = getCookie('gpo_cart_ids');
989        if (cookieIds) {
990            cookieIds.split(',').forEach(function (id) {
991                id = String(id).trim();
992                if (id && ids.indexOf(id) === -1) ids.push(id);
993            });
994        }
995        if (typeof appopt !== 'undefined' && Array.isArray(appopt.cart_product_ids)) {
996            appopt.cart_product_ids.forEach(function (id) {
997                id = String(id).trim();
998                if (id && ids.indexOf(id) === -1) ids.push(id);
999            });
1000        }
1001        if (ids.indexOf(productId) === -1) {
1002            ids.push(productId);
1003        }
1004        if (typeof appopt !== 'undefined') {
1005            appopt.cart_product_ids = ids.map(Number);
1006        }
1007        setCartIds(ids);
1008    }
1009
1010    function removeCartId(productId) {
1011        productId = String(productId);
1012        var ids = getCartIds().filter(function (id) {
1013            return id !== productId;
1014        });
1015        if (typeof appopt !== 'undefined') {
1016            appopt.cart_product_ids = ids.map(Number);
1017        }
1018        setCartIds(ids);
1019    }
1020
1021    function resetCartButton($btn) {
1022        $btn = $($btn);
1023        if (!$btn.length) return;
1024
1025        // PHP-only «Добавлено» без ajax-кнопки — не трогаем (после F5 отрисует сервер)
1026        if ($btn.hasClass('custom_added_to_cart') && !$btn.hasClass('ajax_add_to_cart') && !$btn.hasClass('product-card__add-cart')) {
1027            return;
1028        }
1029
1030        $btn.removeClass('added custom_added_to_cart');
1031        $btn.addClass('ajax_add_to_cart add_to_cart_button');
1032
1033        var origHref = $btn.attr('data-gpo_orig_href');
1034        if (origHref) {
1035            $btn.attr('href', origHref);
1036        }
1037
1038        var $span = $btn.children('span').first();
1039        if ($span.length) {
1040            $span.text('В корзину');
1041        }
1042
1043        var $wrap = $btn.closest('.product-card__btns, .seria__add, .product-card__bottom, .product-card');
1044        // убираем только View cart / дубликаты, не саму кнопку
1045        $wrap.find('a.added_to_cart.wc-forward, a.custom_added_to_cart').not($btn).remove();
1046    }
1047
1048    function restoreWishlistStates() {
1049        var ids = getWishlistIds();
1050        $('.product-card__liked').removeClass('added');
1051        ids.forEach(function (id) {
1052            $('.product-card__liked[data-product="' + id + '"]').addClass('added');
1053        });
1054        if (ids.length) {
1055            $('.header__liked').addClass('active');
1056        } else {
1057            $('.header__liked').removeClass('active');
1058        }
1059    }
1060
1061    function ensureAddedCartButton($button) {
1062        $button = $($button);
1063        if (!$button.length) return;
1064
1065        var cartUrl = getCartUrl();
1066        var $wrap = $button.closest('.product-card__btns, .seria__add, .product-card__bottom, .product-card');
1067
1068        // Уже ссылка «Добавлено» из PHP — только подчистим View cart
1069        if ($button.hasClass('custom_added_to_cart') && !$button.hasClass('ajax_add_to_cart')) {
1070            $wrap.find('a.added_to_cart.wc-forward').not($button).remove();
1071            return;
1072        }
1073
1074        if (!$button.attr('data-gpo_orig_href')) {
1075            $button.attr('data-gpo_orig_href', $button.attr('href') || '');
1076        }
1077
1078        $button
1079            .removeClass('loading add_to_cart_button')
1080            .addClass('added ajax_add_to_cart custom_added_to_cart')
1081            .attr('href', cartUrl);
1082
1083        var $span = $button.children('span').first();
1084        if ($span.length) {
1085            $span.text('Добавлено');
1086        } else {
1087            $button.append('<span>Добавлено</span>');
1088        }
1089
1090        // Убираем стандартный View cart — текст уже на самой кнопке
1091        $wrap.find('a.added_to_cart.wc-forward, a.added_to_cart:not(.custom_added_to_cart)').not($button).remove();
1092        $button.siblings('a.custom_added_to_cart').remove();
1093    }
1094
1095    function restoreCartStates() {
1096        var ids = getCartIds();
1097        setCartIds(ids); // синхронизируем cookie с реальной корзиной
1098
1099        // Сбрасываем «Добавлено» у товаров, которых уже нет в корзине
1100        $('.ajax_add_to_cart.added, .product-card__add-cart.added').each(function () {
1101            var $btn = $(this);
1102            var id = String($btn.data('product_id') || $btn.attr('data-product_id') || '');
1103            if (!id || ids.indexOf(id) === -1) {
1104                resetCartButton($btn);
1105            }
1106        });
1107
1108        // Лишние соседние «Добавлено» / View cart
1109        $('.product-card__btns a.custom_added_to_cart, .product-card__bottom a.custom_added_to_cart').each(function () {
1110            var $added = $(this);
1111            // PHP-вариант: только ссылка без ajax — оставляем, если товар в корзине неизвестен по data-id
1112            var $btn = $added.siblings('.ajax_add_to_cart, .product-card__add-cart').first();
1113            if ($btn.length) {
1114                var id = String($btn.data('product_id') || $btn.attr('data-product_id') || '');
1115                if (!id || ids.indexOf(id) === -1) {
1116                    $added.remove();
1117                    resetCartButton($btn);
1118                }
1119            }
1120        });
1121
1122        ids.forEach(function (id) {
1123            var $btns = $('.ajax_add_to_cart[data-product_id="' + id + '"], .product-card__add-cart[data-product_id="' + id + '"]');
1124            $btns.each(function () {
1125                ensureAddedCartButton($(this));
1126            });
1127        });
1128    }
1129
1130    function restoreProductCardStates() {
1131        updateAllCompare();
1132        restoreWishlistStates();
1133        restoreCartStates();
1134    }
1135
1136    function addWishlistId(productId) {
1137
1138        productId = String(productId);
1139        let ids = getWishlistIds();
1140
1141        if (ids.indexOf(productId) !== -1) {
1142            return;
1143        }
1144
1145        ids.push(productId);
1146        setWishlistCookie(ids);
1147    }
1148
1149    function removeWishlistId(productId) {
1150
1151        productId = String(productId);
1152        let ids = getWishlistIds().filter(function (id) {
1153            return id !== productId;
1154        });
1155        setWishlistCookie(ids);
1156    }
1157
1158    $('.woocommerce-store-notice__dismiss-link').on('click', function(){
1159        $('.woocommerce-store-notice.demo_store').remove();
1160    });
1161
1162    $(document).on('click touchend', '.product-card__liked', function (e) {
1163        e.preventDefault(); // Prevent default behavior
1164
1165        let productId = $(this).data('product');
1166        const isMobile = $(window).width() <= 768;
1167        const $tooltip = $(this).find('.tooltip');
1168
1169        if ($(this).hasClass('added')) {
1170            // Remove product ID from wishlist
1171            removeWishlistId(productId);
1172            $(this).removeClass('added');
1173            $tooltip.text(isMobile ? $(this).data('tooltip_mob') : $(this).data('tooltip'));
1174        } else {
1175            // Add product ID to wishlist
1176            addWishlistId(productId);
1177            $(this).addClass('added');
1178            $tooltip.text(isMobile ? $(this).data('tooltip-added_mob') : $(this).data('tooltip-added'));
1179        }
1180
1181        if (isMobile) {
1182            $tooltip.css('display', 'block');
1183            $(document).on('touchstart', function (event) {
1184                if (!$(event.target).closest('.product-card__liked').length) {
1185                    $tooltip.css('display', 'none');
1186                    $(document).off('touchstart');
1187                }
1188            });
1189            setTimeout(()=> {
1190                $tooltip.css('display', 'none');
1191            }, 3000);
1192        }
1193
1194        if (!getWishlistIds().length && $('.header__liked').hasClass('active')) {
1195            $('.header__liked').removeClass('active');
1196        } else if (getWishlistIds().length && !$('.header__liked').hasClass('active')) {
1197            $('.header__liked').addClass('active');
1198        }
1199
1200        if ($(this).parents('.wishlist_page').length) {
1201            document.location.reload();
1202        }
1203    });
1204
1205    // Ensure tooltip text remains consistent on hover
1206    $(document).on('mouseenter', '.product-card__liked', function () {
1207        const $tooltip = $(this).find('.tooltip');
1208        const isMobile = $(window).width() <= 768;
1209
1210        if ($(this).hasClass('added')) {
1211            $tooltip.text(isMobile ? $(this).data('tooltip-added_mob') : $(this).data('tooltip-added'));
1212        } else {
1213            $tooltip.text(isMobile ? $(this).data('tooltip_mob') : $(this).data('tooltip'));
1214        }
1215    });
1216
1217    restoreProductCardStates();
1218
1219    function markButtonAdded($button) {
1220        $button = $($button);
1221        if (!$button.length) return;
1222
1223        var productId = $button.data('product_id') || $button.attr('data-product_id');
1224        if (productId) {
1225            addCartId(productId);
1226        }
1227        ensureAddedCartButton($button);
1228    }
1229
1230    $(document.body).on('added_to_cart', function (e, fragments, cart_hash, $button) {
1231        markButtonAdded($button);
1232        setTimeout(function () { markButtonAdded($button); }, 50);
1233        setTimeout(function () { markButtonAdded($button); }, 200);
1234    });
1235
1236    $(document.body).on('wc_cart_button_updated', function (e, $button) {
1237        markButtonAdded($button);
1238    });
1239
1240    $(document.body).on('removed_from_cart', function (e, fragments, cart_hash, $button) {
1241        $button = $($button);
1242        var productId = null;
1243        if ($button.length) {
1244            productId = $button.data('product_id') || $button.attr('data-product_id');
1245        }
1246        if (productId) {
1247            removeCartId(productId);
1248        }
1249        restoreCartStates();
1250    });
1251
1252    $(document.body).on('updated_cart_totals', function () {
1253        if (typeof appopt !== 'undefined' && Array.isArray(appopt.cart_product_ids)) {
1254            var ids = [];
1255            $('.woocommerce-cart-form .cart_item a.remove').each(function () {
1256                var id = String($(this).data('product_id') || '');
1257                if (id && ids.indexOf(id) === -1) ids.push(id);
1258            });
1259            appopt.cart_product_ids = ids.map(Number);
1260            setCartIds(ids);
1261        }
1262    });
1263
1264    // if has liked products:
1265    if (getWishlistIds().length && !$('.header__liked').hasClass('active')) {
1266        $('.header__liked').addClass('active');
1267    }
1268
1269
1270    /**
1271	 * Compare products — класс .added на родителе обновляется в .br_compare_button
1272	 */
1273
1274
1275
1276
1277    /**
1278	 * Sales modal
1279	 */
1280    if ($('[data-modal=modal_sales]').length != 0) {
1281
1282        if ((getCookie('sales_hide') == null) || ($('#block_sales_img').attr('src') != getCookie('sales_hide'))) {
1283            setTimeout(function () {
1284                modalOpen('modal_sales');
1285                // add cookie
1286                document.cookie = 'sales_hide=' + $('#block_sales_img').attr('src') + '; path=/; max-age=2592000';
1287            }, 2000);
1288        }
1289    }
1290
1291
1292    /**
1293	 * Comments / Reviews config:
1294	 */
1295    // Check the accept checkbox:
1296    $('#review-accept,#question-accept,#accept-person-data').change(function () {
1297
1298        if (this.checked != true) {
1299            $(this).closest('.comment-form').find('#submit').attr('disabled', 'disabled');
1300        } else {
1301            $(this).closest('.comment-form').find('#submit').removeAttr('disabled');
1302        }
1303    });
1304
1305    $('#commentform, #questionform').submit(function (e) {
1306        e.preventDefault();
1307
1308        const form = $(this);
1309        let noValid = false;
1310
1311        const fields = {
1312            name: form.find('input[name=author]'),
1313            email: form.find('input[name=email]'),
1314            rating: form.find('.comment-form-rating'),
1315            ratingSelect: form.find('select[name=rating]'),
1316            text: form.find('textarea[name=comment]'),
1317            captchaWrap: form.find('.form-captcha-position'),
1318            captchaToken: form.find('input[name=smart-token]'),
1319            captchaCF7: form.find('.form-captcha-input'),
1320            accept: form.find('input[name=accept-person-data]')
1321        };
1322
1323        const emailFilter = /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z]{2,8})+$/;
1324        const nameFilter = /(?!.*\s{2})[a-zA-Zа-яА-Я0-9]{2,30}$/;
1325
1326        const showError = (el, msg) => {
1327            el.find('.input_error').remove();
1328            el.append(`<p class="input_error">${msg}</p>`);
1329        };
1330
1331        const clearError = el => {
1332            el.find('.input_error').remove();
1333        };
1334
1335        const tokenValue = $('input[name=smart-token]').first().val();
1336
1337        if (!tokenValue) {
1338            showError(fields.captchaWrap, 'Подтвердите, что вы не робот.');
1339            noValid = true;
1340        } else {
1341            clearError(fields.captchaWrap);
1342            fields.captchaCF7.val(tokenValue);
1343        }
1344
1345        if (appopt.app_dist_comment_validation_name) {
1346            if (!fields.name.val()) {
1347                showError(fields.name.closest('.form-input'), 'Поле обязательно для заполнения.');
1348                noValid = true;
1349            } else if (!nameFilter.test(fields.name.val())) {
1350                showError(fields.name.closest('.form-input'), 'Поле заполнено некорректно.');
1351                noValid = true;
1352            } else {
1353                clearError(fields.name.closest('.form-input'));
1354            }
1355        }
1356
1357        if (appopt.app_dist_comment_validation_email) {
1358            if (!fields.email.val()) {
1359                showError(fields.email.closest('.form-input'), 'Поле обязательно для заполнения.');
1360                noValid = true;
1361            } else if (!emailFilter.test(fields.email.val())) {
1362                showError(fields.email.closest('.form-input'), 'Поле заполнено некорректно.');
1363                noValid = true;
1364            } else {
1365                clearError(fields.email.closest('.form-input'));
1366            }
1367        }
1368
1369        if (appopt.app_dist_comment_validation_rating) {
1370            if (!fields.ratingSelect.val()) {
1371                showError(fields.rating, 'Укажите рейтинг.');
1372                noValid = true;
1373            } else {
1374                clearError(fields.rating);
1375            }
1376        }
1377
1378        if (appopt.app_dist_comment_validation_text || form.attr('id') === 'questionform') {
1379            if (!fields.text.val()) {
1380                showError(fields.text.closest('.form-input'), 'Поле обязательно для заполнения.');
1381                noValid = true;
1382            } else {
1383                clearError(fields.text.closest('.form-input'));
1384            }
1385        }
1386
1387        if (fields.accept.length) {
1388            const label = fields.accept.closest('.comment-form-accept');
1389
1390            if (!fields.accept.is(':checked')) {
1391                showError(label, 'Необходимо согласие на обработку данных.');
1392                noValid = true;
1393            } else {
1394                clearError(label);
1395            }
1396        }
1397
1398        if (noValid) return false;
1399
1400        $.ajax({
1401            type: 'POST',
1402            url: form.attr('action'),
1403            data: form.serialize() + '&action=customaddcomment',
1404
1405            beforeSend: () => form.addClass('submitting'),
1406
1407            error: function (request, status) {
1408                form.removeClass('submitting');
1409
1410                if (status === 500) alert('Ошибка при добавлении комментария');
1411                else if (status === 'timeout') alert('Ошибка: Сервер не отвечает, попробуй ещё.');
1412                else {
1413                    let msg = request.responseText.split('<p>')[1].split('</p>')[0] || 'Неизвестная ошибка';
1414                    alert(msg);
1415                }
1416            },
1417
1418            success: function (result) {
1419                form.removeClass('submitting');
1420
1421                if (result.success === false) {
1422                    showError(fields.captchaWrap, result.data.message);
1423                    return;
1424                }
1425
1426                $('.modal__review .modal__close').click();
1427
1428                form[0].reset();
1429                $('.stars.selected').removeClass('selected').find('a.active').removeClass('active');
1430
1431                if (window.smartCaptcha && typeof window.smartCaptcha.reset === 'function') {
1432                    window.smartCaptcha.reset();
1433                }
1434
1435                setTimeout(() => {
1436                    modalOpen(form.attr('id') === 'questionform'
1437                        ? 'modal_thanks_vopros'
1438                        : 'modal_thanks_comment');
1439                }, 300);
1440            }
1441        });
1442
1443        return false;
1444    });
1445
1446});
1447
1448
1449/**
1450 * JS functions:
1451 */
1452function dropdownToggle(e, t) {
1453    (e.onmouseenter = function (e) {
1454        e.target.classList.toggle('active', true), t.classList.toggle('active', true);
1455    }),
1456    (t.onmouseenter = function (t) {
1457        t.target.classList.toggle('active', true), e.classList.toggle('active', true);
1458    }),
1459    (e.onmouseleave = function (e) {
1460        e.target.classList.toggle('active', false), t.classList.toggle('active', false);
1461    }),
1462    (t.onmouseleave = function (t) {
1463        t.target.classList.toggle('active', false), e.classList.toggle('active', false);
1464    });
1465}
1466
1467/**
1468 * Main menu open/close:
1469 */
1470dropdownToggle(header_catalog_btn, header_catalog);
1471
1472header_mobmenu_btn.onclick = function () {
1473    header_layout.classList.toggle('active', true);
1474    header_mobmenu.classList.toggle('active', true);
1475};
1476header_layout.onclick = function (e) {
1477    e.target.classList.toggle('active', false), header_mobmenu.classList.toggle('active', false);
1478};
1479
1480jQuery(function ($) {
1481    let mask;
1482    if (appopt.exchange_rate_url === 'by') {
1483        mask = '+375(99) 999-99-99';
1484    } else {
1485        mask = '+7(999) 999-99-99';
1486    }
1487    $('input[type=\'tel\']').mask(mask);
1488    $('input[name=\'phone\']').mask(mask);
1489    $('#billing_phone').mask(mask);
1490    $('.qty').mask('99');
1491});
1492
1493jQuery(function ($) {
1494    $('input[name="quantity"]').on('input', function () {
1495        var max = parseInt($(this).attr('max'));
1496        var val = parseInt($(this).val());
1497        if (val > max) {
1498            $('.qty').mask('99');
1499        }
1500    });
1501});
1502
1503jQuery(function ($) {
1504    $('.nojq').on('click', '.start__reindex-product', function () {
1505        let $btn = $(this).children('div'),
1506            url = '/wp-admin/admin-ajax.php?action=',
1507            nameBtn = $btn.text();
1508
1509        $.ajax({
1510            method: 'POST',
1511            async: false,
1512            cache: false,
1513            processData: false,
1514            url: url + 'get__ProductsIds',
1515            success: function (data) {
1516                data = JSON.parse(data);
1517                let startIndexProducts = prompt('Введите стартовый индекс товара', '1');
1518
1519                if (startIndexProducts == null) {
1520                    startIndexProducts = 1;
1521                }
1522
1523                console.log('Индексация начинается с ' + startIndexProducts);
1524
1525                data.PRODUCTS_ID.forEach((productID, index, productList) => {
1526                    if ((index + 1) >= startIndexProducts) {
1527                        upload__IndexProducts(productID, index, productList, $btn, url);
1528                    }
1529                });
1530            }
1531        }).done(function (data) {
1532            data = JSON.parse(data);
1533            $btn.text(nameBtn);
1534            alert('Индексация завершена. ' + data.COUNT + ' / ' + data.COUNT);
1535        });
1536    });
1537
1538    function upload__IndexProducts(productID, index, productList, $btn, url) {
1539        try {
1540            $.ajax({
1541                method: 'POST',
1542                async: false,
1543                cache: false,
1544                processData: false,
1545                url: url + 'takeIndexProducts&post_id=' + productID,
1546            }).done(function (result) {
1547                console.log(result);
1548                $btn.text('Завершено: ' + (index + 1) + ' / ' + productList.length);
1549            });
1550        } catch (e) {
1551            console.log('Bad request. Trying again.');
1552            upload__IndexProducts(productID, index, productList, $btn, url);
1553        }
1554    }
1555
1556    jQuery(document).ready(function($) {
1557        if ($('li.facet-wrapper-slider').length > 0) {
1558            $('li.facet-wrapper-slider').each(function() {
1559                var labelText = $(this).find('.facetwp-slider-label').text().trim();
1560
1561                if (labelText === '0 р.') {
1562                    $(this).hide();
1563                }
1564            });
1565        }
1566    });
1567
1568    jQuery(document).ready(function($) {
1569        // Replace all occurrences of "Reset" with "Сброс"
1570        $('input[type="button"][value="Reset"]').val('Сброс');
1571
1572        // Если есть динамически загружаемые элементы, можно использовать MutationObserver
1573        const observer = new MutationObserver(function(mutations) {
1574            mutations.forEach(function(mutation) {
1575                if (mutation.addedNodes.length) {
1576                    $('input[type="button"][value="Reset"]').val('Сброс');
1577                }
1578            });
1579        });
1580
1581        observer.observe(document.body, {
1582            childList: true,
1583            subtree: true
1584        });
1585    });
1586
1587    $(document).on('facetwp-loaded', function() {
1588        $('.qty').mask('99');
1589    });
1590
1591    $(document).on('click', '.woocommerce-cart-form .remove', function(e) {
1592        const $row = $(this).closest('.cart_table__row');
1593
1594        const qtyInput = $row.find('.qty').first();
1595        const qtyValue = parseInt(qtyInput.val() || qtyInput.attr('value'), 10);
1596
1597        const removeCount = isNaN(qtyValue) ? 1 : qtyValue;
1598
1599        $(document.body).one('updated_cart_totals', function() {
1600            const $countEl = $('.header__cart-count.count');
1601            const currentCount = parseInt($countEl.text(), 10);
1602
1603            if (!isNaN(currentCount) && currentCount >= removeCount) {
1604                $countEl.text(currentCount - removeCount);
1605            } else if (!isNaN(currentCount)) {
1606                $countEl.text(0);
1607            }
1608        });
1609    });
1610
1611    /**
1612     * Скрипт выравнивает высоты карточек товаров по максимальной в каждом блоке
1613     * @param blockSelector
1614     * @param elementSelector
1615     */
1616    function setEqualHeightsInBlock(blockSelector, elementSelector) {
1617        let maxHeight = 0;
1618
1619        $(blockSelector + ' ' + elementSelector).css('height', 'auto');
1620
1621        $(blockSelector + ' ' + elementSelector).each(function() {
1622            const height = $(this).outerHeight();
1623            if (height > maxHeight) {
1624                maxHeight = height;
1625            }
1626        });
1627
1628        $(blockSelector + ' ' + elementSelector).height(maxHeight);
1629    }
1630
1631    function updateHeights() {
1632        setEqualHeightsInBlock('.related.products', '.product-card');
1633        setEqualHeightsInBlock('#slider_viewed', '.product-card');
1634        setEqualHeightsInBlock('.soput.products', '.product-card');
1635        setEqualHeightsInBlock('#slider_similar', '.product-card');
1636    }
1637
1638    $(document).ready(function() {
1639        updateHeights();
1640    });
1641
1642    $(window).on('resize', function() {
1643        updateHeights();
1644    });
1645
1646    /**
1647     * Разблокировать кнопку "Обновить корзину" при изменении количества товара
1648     *
1649     * При изменении значения в инпуте количества товара (.quantity .qty),
1650     * кнопка обновления корзины (button[name="update_cart"]) становится активной:
1651     * - удаляется атрибут disabled,
1652     * - обновляется aria-disabled для доступности.
1653     */
1654    $(document).ready(function() {
1655        const $updateButton = $('button[name="update_cart"]');
1656
1657        let debounceTimer;
1658        $('.quantity .qty').on('input change', function() {
1659            clearTimeout(debounceTimer);
1660            debounceTimer = setTimeout(() => {
1661                $updateButton.prop('disabled', false).attr('aria-disabled', 'false');
1662            }, 200);
1663        });
1664    });
1665
1666    /**
1667     * После обновления корзины (событие 'updated_cart_totals'),
1668     * отправляется AJAX запрос для получения обновленного количества товаров в корзине.
1669     * Затем обновляется счетчик в шапке сайта:
1670     * - если количество > 99, показываем "99+" с мелким плюсом,
1671     * - иначе показываем точное число.
1672     * В случае ошибки выводим ошибку в консоль.
1673     */
1674    jQuery(function($) {
1675        const $cartCount = $('span.header__cart-count.count');
1676        const $body = $(document.body);
1677
1678        $body.on('updated_cart_totals', function() {
1679            setTimeout(() => {
1680                $.ajax({
1681                    url: '/wp-admin/admin-ajax.php',
1682                    method: 'POST',
1683                    data: { action: 'update_cart_count' },
1684                    success: function(response) {
1685                        if (response.success) {
1686                            const cartCount = response.data;
1687                            const displayCount = cartCount > 99 ? '99<small>+</small>' : cartCount;
1688                            $cartCount.html(displayCount);
1689                        } else {
1690                            console.warn('Ошибка в ответе сервера:', response);
1691                        }
1692                    },
1693                    error: function(jqXHR, textStatus, errorThrown) {
1694                        console.error('AJAX Error:', textStatus, errorThrown);
1695                    }
1696                });
1697            }, 300);
1698        });
1699
1700        // Tooltip
1701
1702        const $tooltip = $('<div class="tooltip-text"></div>').appendTo('body');
1703        let isVisible = false;
1704
1705        function hideTooltip() {
1706            $tooltip.hide();
1707            isVisible = false;
1708        }
1709
1710        $('.table-head-tooltip').on('click', function(e) {
1711            e.stopPropagation();
1712            if ($(window).width() >= 700) return;
1713
1714            const $el = $(this);
1715            const tooltipText = $el.data('tooltip');
1716
1717            if (!tooltipText) return;
1718
1719            if (isVisible) {
1720                hideTooltip();
1721            } else {
1722                const offset = $el.offset();
1723                $tooltip
1724                    .text(tooltipText)
1725                    .css({
1726                        top: offset.top - $tooltip.outerHeight() - 8,
1727                        left: offset.left + $el.outerWidth() / 2 - $tooltip.outerWidth() / 2
1728                    })
1729                    .show();
1730                isVisible = true;
1731
1732                setTimeout(hideTooltip, 3000);
1733            }
1734        });
1735
1736        $(document).on('click', function() {
1737            if (isVisible) hideTooltip();
1738        });
1739
1740    });
1741
1742    /**
1743     * Инициализация галереи продукта с использованием Slick Slider и Fancybox.
1744     *
1745     * Скрипт синхронизирует основной слайдер изображений WooCommerce-продукта
1746     * с миниатюрами (thumbnails) и Fancybox.
1747     *
1748     * Функциональность:
1749     * - Основной слайдер показывает одно изображение продукта.
1750     * - Миниатюрный слайдер синхронизируется с основным.
1751     * - Fancybox открывает изображения в модальном окне с поддержкой:
1752     *   увеличения (zoom), предпросмотра (thumbs), и управления клавишами.
1753     * - При закрытии Fancybox слайдер возвращается к текущему изображению.
1754     *
1755     * Зависимости:
1756     * - jQuery
1757     * - Slick Slider
1758     * - Fancybox v3.5.7
1759     *
1760     * @example
1761     * HTML-структура:
1762     * <div class="product-gallery" id="product-gallery-123">
1763     *   <div class="product-gallery__slider">...</div>
1764     *   <button class="product-gallery__prev"></button>
1765     *   <button class="product-gallery__next"></button>
1766     *   <div class="product-gallery__nav">...</div>
1767     * </div>
1768     */
1769    $(document).ready(function() {
1770        const $galleries = $('.product-gallery');
1771        if (!$galleries.length) return;
1772
1773        $galleries.each(function() {
1774            const $gallery = $(this);
1775            const $slider = $gallery.find('.product-gallery__slider');
1776            const $thumbs = $gallery.find('.product-gallery__nav');
1777            const slidesCount = $slider.children().length;
1778            const galleryId = $gallery.attr('id') || '';
1779
1780            // Инициализация Slick, если изображений больше одного
1781            if (slidesCount > 1) {
1782                const totalThumbs = $thumbs.children('div').length;
1783                const slidesToShow = Math.min(totalThumbs, 6);
1784
1785                // Основной слайдер
1786                $slider.slick({
1787                    slidesToShow: 1,
1788                    slidesToScroll: 1,
1789                    arrows: true,
1790                    asNavFor: '#' + galleryId + ' .product-gallery__nav',
1791                    adaptiveHeight: false,
1792                    infinite: false,
1793                    prevArrow: $gallery.find('.product-gallery__prev'),
1794                    nextArrow: $gallery.find('.product-gallery__next')
1795                });
1796
1797                // Слайдер миниатюр
1798                if (totalThumbs > 0) {
1799                    const slidesToScroll = totalThumbs === 1 ? 1 : totalThumbs === 2 ? 2 : totalThumbs > 6 ? 1 : slidesToShow;
1800
1801                    $thumbs.slick({
1802                        slidesToShow: slidesToShow,
1803                        slidesToScroll: slidesToScroll,
1804                        asNavFor: '#' + galleryId + ' .product-gallery__slider',
1805                        focusOnSelect: true,
1806                        arrows: false,
1807                        infinite: false,
1808                        variableWidth: false,
1809                        adaptiveHeight: true,
1810                        responsive: [
1811                            { breakpoint: 768, settings: { slidesToShow: Math.min(slidesToShow, 3), slidesToScroll: 1 } },
1812                            { breakpoint: 480, settings: { slidesToShow: Math.min(slidesToShow, 2), slidesToScroll: 1 } }
1813                        ]
1814                    });
1815                }
1816            } else {
1817                // Если только одно изображение — скрываем стрелки
1818                $gallery.find('.product-gallery__prev, .product-gallery__next').hide();
1819            }
1820
1821            // Fancybox: открытие изображений в модальном окне
1822            const $links = $slider.find('a[data-fancybox-trigger]');
1823            if (typeof $.fancybox === 'undefined' || !$links.length) return;
1824
1825            $links.on('click', function(e) {
1826                e.preventDefault();
1827
1828                const $clicked = $(this).closest('.slick-slide');
1829                const startIndex = $clicked.data('slick-index') || 0;
1830
1831                // Подготавливаем массив изображений для Fancybox
1832                const items = $links.map(function() {
1833                    const $link = $(this);
1834                    const src = $link.attr('href');
1835                    const caption = $link.find('img').attr('alt') || '';
1836                    return {
1837                        src: src,
1838                        opts: {
1839                            caption: caption,
1840                            thumb: $link.find('img').attr('src')
1841                        }
1842                    };
1843                }).get();
1844
1845                // Инициализация Fancybox с синхронизацией со слайдером
1846                $.fancybox.open(items, {
1847                    loop: false,
1848                    animationEffect: 'fade',
1849                    transitionEffect: 'slide',
1850                    buttons: ['zoom', 'slideShow', 'thumbs', 'close'],
1851                    clickContent: function(current, event) {
1852                        return current.type === 'image' ? 'zoom' : false;
1853                    },
1854                    wheel: false,
1855                    animationDuration: 300,
1856                    transitionDuration: 300,
1857                    afterShow: function(instance, current) {
1858                        const currentIndex = current.index;
1859                        if ($slider.hasClass('slick-initialized')) {
1860                            $slider.slick('slickGoTo', currentIndex, false);
1861                        }
1862                    },
1863                    afterClose: function(instance, current) {
1864                        if (current && $slider.hasClass('slick-initialized')) {
1865                            $slider.slick('slickGoTo', current.index, false);
1866                        }
1867                    }
1868                }, startIndex);
1869            });
1870        });
1871    });
1872
1873    /**
1874     * Изменяет id, name и атрибут for у чекбокса согласия
1875     * внутри формы #question_form_wrapper.
1876     *
1877     * Меняет:
1878     *  - accept-person-data -> question-accept-person-data
1879     */
1880    $(document).ready(function() {
1881        $('#question_form_wrapper input#accept-person-data')
1882            .attr('id', 'question-accept-person-data')
1883            .attr('name', 'question-accept-person-data');
1884
1885        $('#question_form_wrapper label[for="accept-person-data"]')
1886            .attr('for', 'question-accept-person-data');
1887    });
1888
1889    /**
1890     * Выравнивание высоты карточек товаров внутри #slider_hits_category.
1891     *
1892     * Скрипт проходит по всем элементам .product-card, определяет максимальную
1893     * высоту и устанавливает её всем карточкам для единообразного отображения.
1894     *
1895     * @selector #slider_hits_category .product-card  Целевые карточки товаров
1896     * @event document.ready  Выполняется после полной загрузки DOM
1897     */
1898    $(document).ready(function() {
1899
1900        /** @var {number} maxCardHeight Максимальная обнаруженная высота карточки */
1901        let maxCardHeight = 0;
1902
1903        /** @var {jQuery} $cards Коллекция карточек товаров */
1904        const $cards = $('#slider_hits_category .product-card');
1905
1906        /**
1907         * Проход по каждой карточке для определения максимальной высоты.
1908         *
1909         * @callback checkCardHeight
1910         * @param {HTMLElement} this Текущий элемент карточки
1911         */
1912        $cards.each(function() {
1913            /** @var {number} currentCardHeight Высота текущей карточки */
1914            const currentCardHeight = $(this).outerHeight();
1915
1916            if (currentCardHeight > maxCardHeight) {
1917                maxCardHeight = currentCardHeight;
1918            }
1919        });
1920
1921        /**
1922         * Применение максимальной высоты ко всем карточкам.
1923         *
1924         * @action applyMaxHeight
1925         */
1926        $cards.css('height', maxCardHeight);
1927
1928    });
1929});
1930
1931
1932if (jQuery('.compare-page').length) {
1933    window.jQuery = window.$ = jQuery;
1934    (function ($) {
1935        var App = {
1936            apphlp: 0,
1937            page: '',
1938            search_suggest_method:'', search_request_method:'',
1939
1940            setSession: (key, value) => {
1941                sessionStorage.setItem(key, value);
1942            },
1943
1944            getSession: (key) => {
1945                return sessionStorage.getItem(key);
1946            },
1947
1948            clearCompareProducts: () => {
1949                var $length = $('.compras_blok_parem .compras_char').length,
1950                    $length_prod = $('.compras_blok_poduct').length,
1951                    $count = 3;
1952
1953                while ($length) {
1954                    var $compare_products = $('.compras_blok_poduct .compras_char:nth-child(' + $count + ')');
1955                    var $compare_params = $('.compras_blok_parem .compras_char:nth-child(' + $count + ')');
1956
1957                    var $key = 0;
1958                    $compare_products.each(function () {
1959                        var $name = $(this).text(),
1960                            $name_trim = $name.replace(/\s+/g, ' ').trim();
1961                        if ($name_trim == '-') {
1962                            $key++;
1963                        }
1964                    });
1965
1966                    if ($key == $length_prod) {
1967                        $compare_products.css('display', 'none');
1968                        $compare_params.css('display', 'none');
1969                    }
1970                    $count++;
1971                    $length--;
1972                }
1973            },
1974
1975            initGpoCompare: () => {
1976                App.apphlp.initCompare( {
1977                    page: App.page,
1978                    cookie: 'br_products_compare',
1979                    target: '.i-product, .adv-product',
1980                    target_btn: '.product-card__block_nav_comparison',
1981                    target_lnk: '.compare-link',
1982                    clrear_all: '.compare-products__clear',
1983                    target_qty: '.count',
1984                    target_sticky: '.block_button_srav',
1985                } );
1986            },
1987
1988            initCookie: () => {
1989                jQuery(document).ready(function($) {
1990                    if (!getCookie('cookies_accepted')) {
1991                        setTimeout(function() {
1992                            $('.cookies-modal:not(.cookies-modal--options)').fadeIn();
1993                        }, 2000);
1994                    }
1995
1996                    $('.cookies-button__accept').on('click', function() {
1997                        setCookie('cookies_accepted', 'true', 365);
1998                        $('.cookies-modal').fadeOut();
1999                    });
2000
2001                    $('.cookies-button__cancel').on('click', function() {
2002                        setCookie('cookies_accepted', 'false', 365);
2003                        $('.cookies-modal:not(.cookies-modal--options)').fadeOut();
2004                    });
2005
2006                    $('.cookies-button__options').on('click', function() {
2007                        $('.cookies-modal:not(.cookies-modal--options)').fadeOut();
2008                        $('.cookies-modal--options').fadeIn();
2009                    });
2010
2011                    $('.cookies-button__back').on('click', function() {
2012                        $('.cookies-modal:not(.cookies-modal--options)').fadeIn();
2013                        $('.cookies-modal--options').fadeOut();
2014                    });
2015
2016                    function setCookie(name, value, days) {
2017                        let expires = '';
2018                        if (days) {
2019                            const date = new Date();
2020                            date.setTime(date.getTime() + (days*24*60*60*1000));
2021                            expires = '; expires=' + date.toUTCString();
2022                        }
2023                        document.cookie = name + '=' + (value || '') + expires + '; path=/';
2024                    }
2025                    function getCookie(name) {
2026                        const nameEQ = name + '=';
2027                        const ca = document.cookie.split(';');
2028                        for(let i=0; i < ca.length; i++) {
2029                            let c = ca[i];
2030                            while (c.charAt(0)===' ') c = c.substring(1,c.length);
2031                            if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length,c.length);
2032                        }
2033                        return null;
2034                    }
2035                });
2036            },
2037
2038            init: () => {
2039                App.page = new (eval(pageopt.page))(App);
2040                App.page.Init($);
2041
2042                App.apphlp = AppHlp.init();
2043
2044                App.apphlp.initCompare({
2045                    page: App.page,
2046                    cookie: 'br_products_compare',
2047                    target: '.i-product',
2048                    target_btn: '.main_page_slid_block_nav_comparison',
2049                    target_lnk: '.target_sravnenie',
2050                    target_qty: '.block_button_srav_count',
2051                    clrear_all: '.compare-products__clear',
2052                    target_sticky: '.block_button_srav',
2053                    tooltipTouch: { toggle: 'on' , off: 'Из сравнения', on: 'В сравнение' },
2054                    tooltipMouse: { toggle: 'on' , off: 'В сравнение' , on: 'В сравнении' }
2055                });
2056
2057                App.apphlp.updatePage();
2058
2059                App.clearCompareProducts();
2060                App.initGpoCompare();
2061                App.initCookie();
2062            },
2063        };
2064
2065        window.App = App;
2066
2067        $(document).ready(() => {
2068            App.init();
2069        });
2070
2071    })(jQuery);
2072}
2073

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.