PageSourceSearch

https://www.mirkrasok.ru/local/templates/mirkrasok_2026v2/componen…/detail_claude/script.js?178885918842146

js mirkrasok.ru collected 2026-10-03 20:59:27 UTC 42,146 bytes, 1,173 lines download raw bytes

1var obBonus = {};
2
3var obDetailFilter = {
4
5    ajaxInstance: false,
6    data: false,
7    allProperties: false,
8    productID: false,
9    ym: false,
10
11    processFilter: function (bUpdateSKU) {
12        //console.log(bUpdateSKU);
13        if (this.data) {
14            var $parent = $("[data-filter-properties]");
15            var $rows = $parent.find("[data-code]");
16            var selected = {};
17            $parent.find("[data-value].active").each(function () {
18                var $this = $(this);
19                selected[$this.data("item-code")] = $this.data("value");
20            });
21
22            var index = 0;
23            $rows.each(function () {
24                var $row = $(this);
25                if (!index) {
26                    index++;
27                    return;
28                }
29                var $items = $row.find("[data-value]");
30
31                $items.removeClass("disabled");
32
33                var code = $row.data("code");
34                var available = [];
35                for (key in obDetailFilter.allProperties[code]["ITEMS"]) {
36                    available.push(key);
37                }
38
39                var newAvailable = [];
40                for (var selectedCode in selected) {
41                    if (selectedCode == code) continue;
42                    var value = selected[selectedCode].toString();
43                    //newAvailable = [];
44                    if (typeof obDetailFilter.data[selectedCode][value] != "undefined") {
45                        var tempAvailable = array_values(obDetailFilter.data[selectedCode][value][code]);
46
47                        for (var key in available) {
48                            if (tempAvailable.indexOf(available[key]) >= 0) {
49                                //available.splice(key, 1);
50                                newAvailable.push(available[key]);
51                            }
52                        }
53                    } else {
54                        newAvailable = [];
55                    }
56                    available = newAvailable;
57                }
58                //			console.log(code,available);
59
60                $items.each(function () {
61                    var $item = $(this);
62                    var value = $item.data("value").toString();
63                    if (available.indexOf(value) < 0) {
64                        $item.addClass("disabled");
65                    }
66                });
67            });
68            $parent.find("[data-value].active.disabled").removeClass("active");
69            if (bUpdateSKU) {
70                this.ajax();
71            }
72        }
73    },
74
75    ajax: function () {
76        var $parent = $("[data-filter-properties]");
77        var $rows = $parent.find("[data-code]");
78        var selected = {};
79        var bCanAjax = true;
80        $rows.each(function () {
81            var $this = $(this);
82            var $active = $this.find(".active");
83            if ($active.length) {
84                selected["FILTER[PROPERTY_" + $active.data("item-code") + "]"] = $active.data("value");
85            } else {
86                if ($this.find("[data-value]:not(.disabled)").length) bCanAjax = false;
87            }
88
89        });
90        if (!bCanAjax) return true;
91
92        if (this.ajaxInstance) {
93            this.ajaxInstance.abort();
94        }
95
96        selected["FILTER[PROPERTY_CML2_LINK]"] = this.productID;
97        selected.property_sku = this.property_sku;
98        selected.ym = this.ym;
99        selected["ECOMMERS"] = this.gtm
100
101//			console.log(selected)
102        if (temlatedetail == "oboi") {
103            url = "/local/components/art-fresh/catalog.detail.sku/ajax.php?BRAND_ID=" + brandID + "&template=" + ".default_oboi";
104        } else {
105            url = "/local/components/art-fresh/catalog.detail.sku/ajax.php?BRAND_ID=" + brandID;
106        }
107
108
109        $.ajax({
110            type: "get",
111            url: url,
112            data: selected,
113            beforeSend: function () {
114                $parent.addClass("ajaxing");
115            },
116            success: function (data) {
117                var selector = "[data-sku-info]";
118                $parent.removeClass("ajaxing");
119                $parent.find(selector).replaceWith($(data).find(selector));
120
121                $.ajax({
122                    type: "post",
123                    url: "/local/php_interface/ajax/sku-associated.php",
124                    data: {"SKU_ID": $(data).find(".sku-info [data-product-id]").data("product-id")},
125                    beforeSend: function () {
126                        //$parent.addClass("ajaxing");
127                    },
128                    success: function (data_sku_associated) {
129                        var selector = "#sku-associated";
130
131                        $(selector).replaceWith($(data_sku_associated));
132                        var count = $(selector).children().data("items-count");
133                        var $arrowsParent = $(selector).find("[data-arrows-parent]");
134                        var $slider = $(selector).find("[data-sli
134der]");
135                        $slider.slick({
136                            /*dots: true,*/
137                            arrows: true,
138                            autoplay: true,
139                            infinite: true,
140                            slidesToShow: count,
141                            slidesToScroll: count,
142                            appendArrows: $arrowsParent,
143                            responsive: [
144                                {
145                                    breakpoint: 5000,
146                                    settings: {
147                                        slidesToShow: count || 5,
148                                        slidesToScroll: count || 5
149                                    }
150
151                                },
152                                {
153                                    breakpoint: 1200,
154                                    settings: {
155                                        slidesToShow: 3,
156                                        slidesToScroll: 3
157                                    }
158
159                                },
160                                {
161                                    breakpoint: 769,
162                                    settings: {
163                                        slidesToShow: 1,
164                                        slidesToScroll: 1,
165                                        dots: true
166                                    }
167
168                                }
169                            ]
170                        });
171                    },
172                    error: function () {
173
174                    }
175                })
176            },
177            error: function () {
178                $parent.removeClass("ajaxing");
179            }
180        });
181    },
182
183    select: function (self) {
184        //  console.log(self);
185        var $self = $(self);
186        if ($self.hasClass("active")) return;
187        if ($self.hasClass("disabled")) return;
188
189        $self.siblings().removeClass("active");
190        $self.addClass("active");
191        this.processFilter(true);
192        this.selectFirst();
193    },
194
195    selectFirst: function () {
196
197        if (this.data) {
198
199            var $parent = $("[data-filter-properties]");
200            $parent.find("[data-code]").each(function () {
201                if ($(this).find("[data-value].active").length) return;
202                $(this).find("[data-value]:not(.disabled):first").addClass("active");
203                obDetailFilter.processFilter();
204            });
205            this.ajax();
206
207        }
208
209    },
210    selectFirstMount: function () {
211
212        if (this.data) {
213            if (this.firstSkuFilter && this.firstSkuFilter.PROPERTY_UPAKOVKA) {
214                if ($(this).find("[data-value].active").length) return;
215                $(`[data-value="` + this.firstSkuFilter.PROPERTY_UPAKOVKA + `"]`).addClass("active");
216                obDetailFilter.processFilter();
217                this.ajax();
218            } else {
219                var $parent = $("[data-filter-properties]");
220                $parent.find("[data-code]").each(function () {
221                    if ($(this).find("[data-value].active").length) return;
222                    $(this).find("[data-value]:not(.disabled):first").addClass("active");
223                    obDetailFilter.processFilter();
224                });
225                this.ajax();
226            }
227
228        }
229
230    },
231    bind: function () {
232        var ym = $("#ym").val();
233        //this.data = obDetailFilterdata;
234        //this.allProperties = obDetailFilterallProperties;
235        if (ym) {
236
237        } else {
238            this.selectFirstMount();
239        }
240    },
241
242    init: (function () {
243        $(function () {
244            obDetailFilter.bind();
245        });
246    })()
247};
248
249const obLazyDivsVue = {
250    loadBufferFrame: function (id, extData = false) {
251        let data = {
252            [id]: '',
253            filterCrossex: extData?.filterProduct,
254            vue: 'Y',
255            isShowOnly: typeof isShowOnly !== 'undefined' ? isShowOnly : false,
256        };
257        // if (extData) {
258        //     data = {
259        //         [id]: '',
260        //         filterCrossex: extData.filterProduct,
261        //     }
262        // }
263
264//        console.log(data, 'test')
265        $.ajax({
266            url: "/local/php_interface/ajax/ajax.handler.php",
267            type: "POST",
268            dataType: "html",
269            data: data,
270            success: function (data) {
271                let $list = $('#' + id);
272
273                $list.html(data);
274                if (id == "formsCapcha") {
275                    obLogin.bind()
276                    obCallback.bind();
277                }
278
279
280
281                $list.each(function () {
282                    var $parent = $(this);
283                    var count = $parent.children().data("items-count");
284                    var $arrowsParent = $parent.find("[data-arrows-parent]");
285                    var $slider = $parent.find("[data-slider=1]");
286                    $slider.slick({
287                        /*dots: true,*/
288                        arrows: true,
289                        autoplay: false,
290                        infinite: true,
291                        slidesToShow: count,
292                        slidesToScroll: count,
293                        appendArrows: $arrowsParent,
294                        responsive: [
295                            {
296                                breakpoint: 5000,
297                                settings: {
298                                    slidesToShow: count || 5,
299                                    slidesToScroll: count || 5
300                                }
301
302                            },
303                            {
304                                breakpoint: 1200,
305                                settings: {
306                                    slidesToShow: 3,
307                                    slidesToScroll: 3
308                                }
309
310                            },
311                            {
312                                breakpoint: 769,
313                                settings: {
314                                    slidesToShow: 2,
315                                    slidesToScroll: 2,
316                                }
317                            }
318                        ]
319                    });
320
321                    initSliders();
322                });
323            }
324        });
325
326    },
327
328    elInit: function (el) {
329        const result = {};
330        result.winH = $(window).height();
331        result.elH = el.height();
332        result.elOffset = el.offset();
333        result.elViewFrom = result.elOffset.top - result.winH;
334        result.elViewTo = result.elOffset.top + result.winH - result.elH;
335        return result;
336    },
337
338    elStatus: function (el, elPos) {
339        // проверяем элемент виден на экране
340        if ($(window).scrollTop() > elPos.elViewFrom && $(window).scrollTop() < elPos.elViewTo) {
341            if ($(el).attr("view") != "open") {
342                $(el).attr("view", "open");
343                //    console.log($(el).attr("id"));
344                obLazyDivsVue.loadBufferFrame($(el).attr("id"));
345            }
346        }
347    },
348    bindFormLogin: function () {
349        var $elements = $('.content').find('[data-js-lazy-div]');
350        $elements.each(function () {
351            var id = $(this).attr('id');
352            if (id == 'formsCapcha') {
353                //    console.log("formsCapcha")
354                obLazyDivsVue.loadBufferFrame(id);
355            }
356        });
357    },
358    bind: function () {
359        var $elements = $('.content').find('[data-js-lazy-div]');
360        $elements.each(function () {
361            var id = $(this).attr('id');
362
363            if (id == 'watchedProducts') {
364                $('#' + id).attr('view', 'open');
365                obLazyDivsVue.loadBufferFrame(id);
366            } else if (id === 'crossProducts') {
367                obLazyDivsVue.loadBufferFrame(id, {
368                    filterProduct: JSON.parse($(this).attr('data-filter'))
369                });
370            } else if (id == 'formsCapcha') {
371                //   console.log("formsCapcha")
372                obLazyDivsVue.loadBufferFrame(id);
373            } else {
374                var element = $("#" + id);
375                var elPos = obLazyDivsVue.elInit(element);
376                $(window).scroll(function () {
377                    obLazyDivsVue.elStatus(element, elPos);
378                });
379            }
380        });
381    }
382}
383
384$(document).ready(function () {
385    obLazyDivsVue.bind();
386// Фото интерьеров
387
388
389    $(".interior-slider-wrapper").slick({
390        infinite: true,
391        slidesToShow: 3,
392        slidesToScroll: 1,
393        arrows: true,
394        prevArrow: '<span class="prev-arrow"></span>',
395        nextArrow: '<span class="next-arrow"></span>',
396        responsive: [
397
398            {
399                breakpoint: 1024,
400                settings: {
401                    slidesToShow: 2,
402                }
403            },
404            {
405                breakpoint: 768,
406                settings: {
407                    slidesToShow: 1,
408                }
409            },
410            {
411                breakpoint: 480,
412                settings: {
413                    slidesToShow: 1,
414                }
415            }
416        ]
417    });
418
419
420    $(".interior-slide a[data-fancybox=interiors]").fancybox();
421
422    $('.colorate-button').bind('onPropertyChange', function () {
423        //         console.log('FOO!');
424    });
425//cскроллим и подсвечиваем SKU из поиска
426    // var element_id = $('#scroll_to_sku').val();
427
428    // if (element_id !== undefined) {
429    //     obDetailProduct.toggleItems();
430    //     var search_el = $('.sub_item[data-sku-id=' + element_id + ']');
431    //     $(search_el).css({'background-color' : 'rgba(0,0,0,0.05)', 'border' : '2px solid #303ba5'});
432
433    // $([document.documentElement, document.body]).animate({
434    //     scrollTop: $(search_el).offset().top-400
435    // }, 1000);
436
437});
438
439
440const calcVueItem = {
441    inputTimer: null,
442    paintRate: 0,
443    items: [],
444    basketID: 0,
445    langs: {},
446    oboi: false,
447
448    init: function (block) {
449        //    console.log('block',block)
450        this.oboi = block.data('js-oboi') === "Y";
451        this.typeRashet = '';
452
453        this.langFiles();
454        this.setProps(block);
455        this.render(block);
456    },
457
458    langFiles: function () {
459        this.langs.title = "Высота и ширина поверхности ";
460        this.langs.helperText = "Добавьте каждую окрашиваемую поверхность, например стену или потолок.";
461        this.langs.length = 'Длина';
462        this.langs.width = 'Ширина';
463        this.langs.height = 'Высота';
464        this.langs.addNew = 'Добавить поверхность';
465        this.langs.recommender = 'Рекомендуемое количество краски ';
466        this.langs.helper_calc = 'Калькулятор подскажет, сколько краски вам понадобится, чтобы отделка выглядела максимально профессионально. Предназначено только для оценки! Реальный расход может варьироваться в зависимости от таких факторов, как текстура стены, выбор цвета или состояние поверхности.';
467        this.langs.placeholder = "0 м";
468        this.langs.layerFirst = "1 слой ";
469        this.langs.layerSecond = "2 слоя ";
470        this.langs.layerMetric = " л";
471        this.langs.tinsOptimal = "Оптимальное количество банок:";
472        this.langs.oboiOptimal = "Оптимальное количество Рулонов:";
473        this.langs.tinsSum = "Сумма";
474        this.langs.tinsPrice = "0 ₽";
475        this.langs.tinsAdd = "В корзину";
476        this.langs.oboiTitle = "Рассчитать количество";
477        this.langs.oboiFirst = "Комната";
478        this.langs.oboiSecond = "Стена";
479        this.langs.oboiRoomTitle = "Длинна, высота, ширина комнаты ";
480        this.langs.oboiWallTitle = "Высота и ширина стены ";
481        this.langs.oboiDescription = "Посчитайте площадь оклееваемой поверхности";
482        this.langs.oboiAddWall = "Добавить стену";
483    },
484
485    createContentBlock: function () {
486        let cb;
487
488        cb = $(`<div class="calc-comp__content"></div>`);
489
490        if (this.oboi) {
491            cb.append(this.createTitleBlock(this.langs.oboiTitle));
492            cb.append(this.createResultColor());
493
494            cb.append(this.createOboiBlock('calc-comp__square-wall active', true, 2, 'wall'));
495            cb.append(this.createOboiBlock('calc-comp__square-room', false, 3, 'room'));
496        } else {
497            cb.append(this.createSubTitleBlock(this.langs.title, this.langs.helperText));
498            cb.append(this.createSquareBlock());
499            cb.append(this.createAddSquareBlock(this.langs.addNew));
500        }
501
502        return cb;
503    },
504
505    createTitleBlock: function (title) {
506        return $(`<h3 class="calc-comp__title">${title}</h3>`);
507    },
508
509    createSubTitleBlock: function (title, description) {
510        cbTitle = $(`<div class="calc-comp__sub-title" data-js="show_help">${title}</div>`);
511        cbTitleButtons = $(`<button type="button" class="calc-comp__helper"></button>`);
512
513        cbTitleButtonsSpan = $(`<span class="calc-comp__help-popover">${description}</span>`);
514        cbTitleButtons.append(cbTitleButtonsSpan);
515        cbTitle.append(cbTitleButtons);
516
517        return cbTitle;
518    },
519
520    createAddSquareBlock: function (textButton) {
521        cbSquareAdd = $(`<button class="calc-comp__add-square" data-js="add_square" type="button">${textButton}</button>`);
522
523        return cbSquareAdd;
524    },
525
526    createSquareBlock: function (ar = 2) {
527        let type = [
528            'width',
529            'length',
530            'height'
531        ];
532
533        cbSquare = $(`<div class="calc-comp__square"></div>`);
534        cbSquareRow = $(`<div class="calc-comp__square-row"></div>`)
535
536        for (let i = 0; i < ar; i++) {
537            let name,
538                className;
539
540            switch (type[i]) {
541                case "width":
542                    name = this.langs.width;
543                    className = 'calc-comp__square-input_width';
544                    break;
545                case "length":
546                    name = this.langs.length;
547                    className = 'calc-comp__square-input_length';
548                    break;
549                case "height":
550                    name = this.langs.height;
551                    className = 'calc-comp__square-input_height';
552                    break;
553            }
554
555            cbSquareRowLabel = $(`<label class="calc-comp__square-control"></label>`);
556            cbSquareRowLabelInput = $(`<input name="calc-width-metric" class="not-pl calc-comp__square-input ${className}" placeholder="${this.langs.placeholder}">`);
557            cbSquareRowLabelSpan = $(`<span class="calc-comp__square-metric">${name}</span>`);
558
559            cbSquareRowLabel.append(cbSquareRowLabelInput);
560            cbSquareRowLabel.append(cbSquareRowLabelSpan);
561
562            cbSquareRow.append(cbSquareRowLabel);
563        }
564
565        cbSquare.append(cbSquareRow);
566
567        return cbSquare;
568    },
569
570    createOboiBlock: function (className, add, ar, type) {
571        let title = this.langs.oboiWallTitle,
572            description = this.langs.oboiDescription,
573            textButton = this.langs.oboiAddWall;
574
575        if (type === "room") {
576            title = this.langs.oboiRoomTitle;
577        }
578
579        block = $(`<div class="${className}" data-block-square="${type}"></div>`);
580        block.append(this.createSubTitleBlock(title, description));
581        block.append(this.createSquareBlock(ar));
582
583        if (add) {
584            block.append(this.createAddSquareBlock(textButton));
585        }
586
587
588        return block;
589    },
590
591    createResultColor: function () {
592        let type = [
593                'first',
594                'second'
595            ],
596            fbResultColor,
597            fbResultColorButtons,
598            fbResultColorButtonsSpans;
599
600        fbResultColor = $(`<div class="calc-comp__result-color"></div>`);
601
602        for (j in type) {
603            let name,
604                className;
605            switch (type[j]) {
606                case "first":
607                    name = this.oboi ? this.langs.oboiFirst : this.langs.layerFirst;
608                    className = 'calc-comp__layer-btn_one';
609                    classNameSpan = 'calc-comp__layer-value_one';
610                    val = 1;
611                    break;
612                case "second":
613                    name = this.oboi ? this.langs.oboiSecond : this.langs.layerSecond;
614                    className = 'calc-comp__layer-btn_two active';
615                    classNameSpan = 'calc-comp__layer-value_two';
616                    val = 2;
617                    break;
618            }
619
620            fbResultColorButtons = $(`<button data-js="calc_layer" data-val="${val}" class="calc-comp__layer-btn ${className}" type="button">${name}</button>`);
621
622            if (!this.oboi) {
623                fbResultColorButtonsSpans = $(`<span class="calc-comp__layer-value ${classNameSpan}">0</span><span class="calc-comp__layer-metric">${this.langs.layerMetric}</span>`);
624                fbResultColorButtons.append(fbResultColorButtonsSpans);
625            }
626
627            fbResultColor.append(fbResultColorButtons);
628        }
629
630        return fbResultColor;
631    },
632
633    createFooterBlock: function () {
634        let fb /*footerBlock*/,
635            fbTitle,
636            fbTitleButtons,
637            fbTitleSpan,
638            fbResultColor;
639
640        fb = $(`<div class="calc-comp__footer"></div>`);
641
642        if (!this.oboi) {
643            fbTitle = $(`<div class="calc-comp__sub-title" data-js="show_help">${this.langs.recommender}</div>`);
644            fbTitleButtons = $(`<button type="button" class="calc-comp__helper calc-comp__helper_top"></button>`);
645            fbTitleSpan = $(`<span class="calc-comp__help-popover calc-comp__help-popover_top">${this.langs.helper_calc}</span>`);
646
647            fbTitleButtons.append(fbTitleSpan);
648            fbTitle.append(fbTitleButtons);
649        }
650
651
652        let text = this.langs.tinsOptimal;
653        if (this.oboi) {
654            text = this.langs.oboiOptimal;
655        }
656
657        fbResultTins = $(`<div class="calc-comp__result-tins active">${text}</div>`);
658        fbResultTinsUl = $(`<ul class="calc-comp__tins-list"></ul>`);
659        fbResultTinsText = $(`<p class="calc-comp__tins-sum"><span class="calc-comp__tins-sum-title">${this.langs.tinsSum}</span><span class="calc-comp__tins-sum-value">${this.langs.tinsPrice}</span></p>`);
660        fbButtonsAccept = $(`<button  class="calc-comp__accept" data-js="calc_add_to_basket" type="button">${this.langs.tinsAdd}</button>`);
661
662        fbResultTins.append(fbResultTinsUl);
663        fbResultTins.append(fbResultTinsText);
664
665        fb.append(fbTitle);
666
667        if (!this.oboi) {
668            fbResultColor = this.createResultColor();
669            fb.append(fbResultColor);
670        }
671
672
673        fb.append(fbResultTins);
674        fb.append(fbButtonsAccept);
675
676        return fb;
677    },
678
679    render: function (block) {
680        let mainBlock, closeBlock, cb, fb;
681
682        mainBlock = $(`<div class="calc-comp"></div>`);
683        closeBlock = $(`<div class="calc-comp-close" data-js="calc_close"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
683<path d="M13 12l5-5-1-1-5 5-5-5-1 1 5 5-5 5 1 1 5-5 5 5 1-1z"></path></svg></div>`);
684
685        cb = this.createContentBlock();
686        fb = this.createFooterBlock();
687
688        mainBlock.append(closeBlock);
689        mainBlock.append(cb);
690        mainBlock.append(fb);
691
692
693        block.append(mainBlock);
694    },
695
696    createSquareRow: function (_this) {
697        let block,
698            firstRow;
699        if (this.oboi) {
700            block = _this.closest('[data-block="calc_volume"]').find(".calc-comp__square-wall .calc-comp__square");
701
702            firstRow = block.find('.calc-comp__square-row:first');
703            //    console.log(firstRow)
704        } else {
705            block = _this.closest('[data-block="calc_volume"]').find(".calc-comp__square");
706            firstRow = block.find('.calc-comp__square-row:first');
707        }
708        //   console.log(block)
709        let cloneRow = firstRow.clone(),
710            btnRemoveRow = $('<a href="javascript:void(0)" data-js="remove_row"></a>');
711
712
713        btnRemoveRow.addClass('calc-comp__square-remove');
714        cloneRow.find('input').val('');
715        cloneRow.append(btnRemoveRow);
716        block.append(cloneRow)
717    },
718
719    removeSquareRow: function (_this) {
720        let block = _this.closest(".calc-comp__square-row");
721
722        block.remove();
723    },
724
725    getCalculatedItems: function (volume) {
726        recommendedProducts = this.items;
727        // сортируем по убыванию объема
728        recommendedProducts.sort((a, b) => (parseFloat(a.VOLUME) < parseFloat(b.VOLUME)) ? 1 : ((parseFloat(b.VOLUME) < parseFloat(a.VOLUME)) ? -1 : 0));
729        var currentVolume = Math.round(volume * 10) / 10;
730        // распределяем объем по фасовкам
731        for (var i = 0; i < recommendedProducts.length; i++) {
732
733            productVOLUME = parseFloat(recommendedProducts[i].VOLUME);
734            recommendedProducts[i].itemsUsed = 0;
735
736            if (currentVolume >= productVOLUME) {
737                recommendedProducts[i].itemsUsed = Math.floor(currentVolume / productVOLUME);
738                currentVolume = Math.round((currentVolume - (recommendedProducts[i].itemsUsed * productVOLUME)) * 10) / 10;
739            }
740
741            if (currentVolume <= 0) {
742                break;
743            }
744
745            if (i === (recommendedProducts.length - 1) && currentVolume > 0) {
746                recommendedProducts[i].itemsUsed += Math.ceil(currentVolume / productVOLUME);
747            }
748        }
749
750        return recommendedProducts;
751    },
752
753    showResultTins: function (_this) {
754        if (this.oboi) {
755            this.getResultOboi(_this);
756        } else {
757            this.getResult(_this);
758        }
759
760    },
761
762    getResultOboi: function (_this) {
763
764
765        let $this = $(_this),
766            $wall = $(`.calc-comp__square-wall`),
767            $room = $(`.calc-comp__square-room`);
768
769        $(`.calc-comp__result-tins`).innerHTML = '';
770        $this.closest('.calc-comp__result-color').find('button').removeClass('active');
771        $this.addClass('active');
772
773        let square;
774        switch ($(_this).data('val')) {
775            case  1:
776                this.typeRashet = "room";
777                $wall.removeClass('active');
778                $room.addClass('active');
779                square = this.calcSquareRoom();
780                countRulon = Math.ceil(square / this.items[0].SQURE_RULON);
781                this.itemsResult = this.items;
782                this.itemsResult[0].itemsUsed = countRulon;
783
784                //    console.log(square)
785                this.showResultOboi(_this);
786
787                break;
788            case  2:
789                this.typeRashet = "wall";
790                $room.removeClass('active');
791                $wall.addClass('active');
792
793
794                square = this.calcSquare();
795                countRulon = Math.ceil(square / this.items[0].SQURE_RULON);
796                this.itemsResult = this.items;
797                this.itemsResult[0].itemsUsed = countRulon;
798                this.showResultOboi(_this);
799                break;
800        }
801
802    },
803
804    getResult: function (_this) {
805        let $this = $(_this),
806            elValue = $this.find('.calc-comp__layer-value ');
807
808        $this.closest('.calc-comp__result-color').find('button').removeClass('active');
809        $this.addClass('active');
810
811        if (elValue) {
812            let value = Math.round(elValue.text() * 10) / 10;
813            if (value) {
814                let priceTotal = 0,
815                    items = this.getCalculatedItems(value),
816                    tinsRowValue = _this.closest('.calc-comp').querySelector('.calc-comp__tins-sum-value'),
817                    tinsRowList = _this.closest('.calc-comp').querySelector('.calc-comp__tins-list');
818
819                tinsRowList.innerHTML = '';
820
821                items.forEach(item => {
822
823                    if (item.itemsUsed) {
824                        // Добавляем элемент в разметку
825                        let listItem = document.createElement('li');
826
827                        listItem.classList.add('calc-comp__tins-list-item');
828                        listItem.innerHTML = `${item.itemsUsed} х ${item.VOLUME} <span class="calc-comp__primer-metric">л</span>`;
829                        tinsRowList.appendChild(listItem);
830
831                        priceTotal += item.PRICE.VALUE * item.itemsUsed;
832                    }
833                    obChangeNumberAnimation.outNum(priceTotal, tinsRowValue)
834                });
835            }
836        }
837    },
838
839    initValidateSquareInputs: function (_this) {
840        if (this.inputTimer) {
841            clearTimeout(this.inputTimer);
842        }
843
844        this.inputTimer = setTimeout( () => {
845            let currentValue = Math.abs(parseFloat(_this.val().replace(/,/, '.')));
846
847            if (typeof currentValue === 'number' && isFinite(currentValue)) {
848                if (currentValue <= 0) {
849                    _this.val('');
850                }
851                if (currentValue > 0) {
852                    _this.val(currentValue + ' м');
853                }
854                if (currentValue > 999) {
855                    _this.val(999 + ' м');
856                }
857            } else {
858                _this.val('');
859            }
860
861            this.showCalcResult();
862            $('[data-js="calc_layer"].active').trigger('click')
863
864        }, 1000);
865    },
866
867    calcSquare: function () {
868
869        let calcModal = $('.calc-comp'),
870            squareTotal = 0,
871            squaresRows = calcModal.find('.calc-comp__square-row');
872
873        if (this.oboi) {
874            squaresRows = calcModal.find(`[data-block-square=${this.typeRashet}] .calc-comp__square-row`)
875        }
876
877
878        squaresRows.each(function (i, el) {
879            let inputLengthValue = $(el).find('.calc-comp__square-input_length').val(),
880                inputWidthValue = $(el).find('.calc-comp__square-input_width').val(),
881                length = parseFloat(inputLengthValue ? inputLengthValue : 0),
882                width = parseFloat(inputWidthValue ? inputWidthValue : 0);
883
884            squareTotal += length * width;
885        });
886
887        return squareTotal;
888    },
889
890    showCalcResult: function () {
891
892        if (!this.oboi) {
893            let square = this.calcSquare(),
894                paintNeed = parseInt(square / this.paintRate * 100) / 100;
895
896            $('[data-js="calc_layer"]').each(function (i, e) {
897                let val = $(e).data('val');
898                $(e).find('.calc-comp__layer-value').text(paintNeed * val)
899            });
900        }
901    },
902
903
904    calcSquareRoom: function () {
905        let calcModal = $('.calc-comp'),
906            squareTotal = 0,
907            squaresRows = calcModal.find(`[data-block-square=${this.typeRashet}] .calc-comp__square-row`)
908
909        //    console.log(squaresRows)
910        squaresRows.each(function (i, el) {
911            let inputLengthValue = $(el).find('.calc-comp__square-input_length').val(),
912                inputWidthValue = $(el).find('.calc-comp__square-input_width').val(),
913                inputHeightValue = $(el).find('.calc-comp__square-input_height').val(),
914                length = parseFloat(inputLengthValue ? inputLengthValue : 0),
915                width = parseFloat(inputWidthValue ? inputWidthValue : 0),
916                height = parseFloat(inputHeightValue ? inputHeightValue : 0);
917
918            squareTotal += 2 * (length * height) + 2 * (height * width);
919        });
920
921        return squareTotal;
922    },
923
924    showResultOboi: function (_this) {
925        let priceTotal = 0,
926            tinsRowValue = _this.closest('.calc-comp').querySelector('.calc-comp__tins-sum-value'),
927            tinsRowList = _this.closest('.calc-comp').querySelector('.calc-comp__tins-list');
928
929        tinsRowList.innerHTML = '';
930
931        this.itemsResult.forEach(item => {
932
933            if (item.itemsUsed) {
934                // Добавляем элемент в разметку
935                let listItem = document.createElement('li');
936                listItem.classList.add('calc-comp__tins-list-item');
937                listItem.innerHTML = `${item.itemsUsed}`;
938                tinsRowList.appendChild(listItem);
939
940                priceTotal += item.PRICE.VALUE * item.itemsUsed;
941            }
942            obChangeNumberAnimation.outNum(priceTotal, tinsRowValue)
943        });
944    },
945
946    setProps: function (block) {
947        this.items = block.data('js-items');
948        this.paintRate = block.data('js-max-volume');
949        this.basketID = block.closest('[data-basket-item]').data('basket-item');
950        this.colorateParams = block.closest('[data-basket-item]').find('[data-params-calc-colorate]');
951    },
952
953    addToBasketByCalc: function (_this) {
954        if (typeof (this.items) != "undefined") {
955            let newBasketItems = this.items.filter(function (e) {
956                return e.itemsUsed > 0;
957            });
958            let $this = $(_this),
959                mainBlock = $this.closest('.calc-comp'),
960                skuID = this.items.map(item => item.PRODUCT_ID);
961
962
963            let colorate = (this.colorateParams.length > 0) ? this.colorateParams.data('params-calc-colorate') : '';
964
965            $.ajax({
966                type: "POST",
967                url: "/local/components/art-fresh/sale.basket/ajax.php",
968                data: {
969                    items: newBasketItems,
970                    colorate: colorate,
971                    oldBasketID: this.basketID,
972                    action: 'calc_basket_add',
973                    BIG_BASKET: 1,
974                    basket_new: 'Y',
975                    sku: skuID,
976                },
977                timeout: 15000,
978                beforeSend: function () {
979                    mainBlock.remove();
980                },
981                success: function (data) {
982                    obBasket.changeBasket(data);
983                },
984            });
985            return false;
986        }
987    },
988
989    bind: function () {
990        $(document).on('click', '[data-js="calc_close"]', function () {
991            let _this = $(this);
992
993            _this.closest('.calc-comp').remove();
994        });
995
996        $(document).on('click', '[data-js="add_square"]', function () {
997            calcVueItem.createSquareRow($(this));
998        });
999
1000        $(document).on('click', '[data-js="remove_row"]', function () {
1001            calcVueItem.removeSquareRow($(this));
1002        });
1003
1004        $(document).on('click', '[data-js="calc_layer"]', function () {
1005            calcVueItem.showResultTins(this);
1006        });
1007
1008        $(document).on('click', '[data-js="show_calc"]', function () {
1009            $(document).find('.calc-comp').remove();
1010
1011            let _this = $(this),
1012                block = _this.closest('[data-block="calc"]').find('[data-block="calc_volume"]');
1013
1014            calcVueItem.init(block);
1015        });
1016
1017        $(document).on('input', '[data-block="calc_volume"] input', function () {
1018            calcVueItem.initValidateSquareInputs($(this));
1019        });
1020
1021        $(document).on('click', '[data-js="calc_add_to_basket"]', function () {
1022            calcVueItem.addToBasketByCalc(this);
1023        });
1024
1025    },
1026};
1027
1028
1029$(() => {
1030    // $(document).on('click', '.lhDiscountSubscribeButton', function () {
1031    //     var ee = setInterval(function () {
1032    //         if (typeof window.ym != 'undefined') {
1033    //             ym(7500958, 'reachGoal', 'click_price_drop_subscription');
1034    //             clearInterval(ee);
1035    //         } else {
1036    //             console.log('Метрика не инициализирована');
1037    //         }
1038    //     }, 500);
1039    // });
1040    $(document).on('click', '.dolymi-btn', function () {
1041        var ee = setInterval(function () {
1042            if (typeof window.ym != 'undefined') {
1043                ym(7500958, 'reachGoal', 'click_payment_method_instalment');
1044                console.log('click_payment_method_instalment');
1045                clearInterval(ee);
1046            } else {
1047                console.log('Метрика не инициализирована');
1048            }
1049        }, 500);
1050    });
1051
1052    $(document).on('submit', '.subscribe__form', function (e) {
1053        e.preventDefault(); // Останавливаем стандартную отправку формы
1054
1055        // Проверяем валидность email (базовая проверка)
1056        var email = $(this).find('.subscribe__email').val();
1057        var emailPattern = /^[^\s@]+@([^\s@.,]+\.)+[^\s@.,]{2,}$/;
1058
1059        if (!emailPattern.test(email)) {
1060            return false;
1061        }
1062
1063        // var ee = setInterval(function () {
1064        //     if (typeof window.ym != 'undefined') {
1065        //         ym(7500958, 'reachGoal', 'price_drop_subscription_sendform');
1066        //         console.log('price_drop_subscription_sendform');
1067        //         clearInterval(ee);
1068        //     } else {
1069        //         console.log('Метрика не инициализирована');
1070        //     }
1071        // }, 500);
1072
1073    });
1074    /*calcVueItem.bind();*/
1075
1076});
1077
1078
1079
1080$(document).ready(function() {
1081    // Кнопка «Написать отзыв» живёт внутри таба отзывов, который рендерится
1082    // через v-if и появляется в DOM только при открытии таба — то есть уже
1083    // после ready. Поэтому вешаем обработчик делегированием на document.
1084    $(document).on('click', '.flex .btn_blue.no_select', function() {
1085        $('.add-rev').slideToggle();
1086        $('.rev-form').show();
1087        $(this).hide();
1088    });
1089
1090});
1091$('[data-fancybox="gallery"]').fancybox({
1092    // Options will go here
1093});
1094
1095$(document).ready(function () {
1096    const $mount = $('[data-admin-roller-kit-mount]').first();
1097    if (!$mount.length) return;
1098    let loadedSkuId = 0;
1099
1100    const updatePackagingTitle = function () {
1101        const $title = $('.property-filter-title.UPAKOVKA').first();
1102        if (!$title.length) return;
1103
1104        const hasDimension = $title.closest('.property-filter-box')
1105            .find('.property-filter-values.UPAKOVKA .property-filter-value')
1106            .toArray()
1107            .some(function (item) {
1108                return /(?:мм|см)/iu.test($(item).text());
1109            });
1110        const label = hasDimension ? 'Размер:' : 'Упаковка:';
1111        const textNode = $title.contents().filter(function () {
1112            return this.nodeType === 3;
1113        }).first()[0];
1114
1115        if (textNode && textNode.nodeValue.trim() !== label) {
1116            textNode.nodeValue = label + ' ';
1117        }
1118    };
1119
1120    const placeMount = function () {
1121        updatePackagingTitle();
1122        const $target = $('.property-filter-title.UPAKOVKA').first().closest('.property-filter-box');
1123        if ($target.length) {
1124            $mount.insertAfter($target);
1125        } else {
1126            $('.product-filter-box').first().prepend($mount);
1127        }
1128    };
1129
1130    const loadKit = function (skuId) {
1131        skuId = Number(skuId);
1132        updatePackagingTitle();
1133        if (!skuId || skuId === loadedSkuId) return;
1134
1135        loadedSkuId = skuId;
1136        placeMount();
1137        $mount.attr('data-sku-id', skuId).data('sku-id', skuId);
1138
1139        $.get('/local/ajax/admin_roller_kit.php', {sku_id: skuId}).done(function (html) {
1140            if (Number($mount.data('sku-id')) !== skuId) return;
1141            if (!String(html).trim()) {
1142                $mount.empty().prop('hidden', true);
1143                return;
1144            }
1145            if (!$('link[href*="admin-roller-kit.css"]').length) {
1146                $('<link>', {rel: 'stylesheet', href: '/local/css/admin-roller-kit.css?v=202609071701'}).appendTo('head');
1147            }
1148            placeMount();
1149            $mount.html(html).prop('hidden', false);
1150            if (!$('script[src*="admin-roller-kit.js"]').length) {
1151                $.getScript('/local/js/admin-roller-kit.js?v=202609071628');
1152            }
1153        });
1154    };
1155
1156    loadKit($mount.data('sku-id'));
1157
1158    $(document).on('click', '.property-filter-value', function () {
1159        const match = String($(this).attr('href') || '').match(/\/sku_(\d+)\//);
1160        if (match) window.setTimeout(function () { loadKit(match[1]); }, 80);
1161    });
1162
1163    $(window).on('popstate.adminRollerKit', function () {
1164        const match = window.location.pathname.match(/\/sku_(\d+)\//);
1165        if (match) loadKit(match[1]);
1166    });
1167
1168    window.setInterval(function () {
1169        updatePackagingTitle();
1170        const match = window.location.pathname.match(/\/sku_(\d+)\//);
1171        if (match) loadKit(match[1]);
1172    }, 300);
1173});

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.