PageSourceSearch

https://marigaz.ru/local/templates/mrg12/js/main.js

js marigaz.ru collected 2026-10-04 08:52:36 UTC 43,304 bytes, 1,139 lines download raw bytes

1if (AbcwwwMaskPhone === undefined) {
2    var AbcwwwMaskPhone = new function () {
3        this.isNum = function (value) {
4            return /\d/.test(value);
5        };
6        this.maskEditValue = function (input, pos) {
7            let posReturn = pos;
8            let posReturnChange = true;
9            if (pos > 0) {
10                pos--;
11            }
12
13            let valueNew = '';
14            for (let posValue = 0; posValue < pos; posValue++) {
15                valueNew += input.value.charAt(posValue);
16            }
17
18            let posMask = pos;
19            for (let posValue = pos; posValue < input.value.length; posValue++) {
20                if (posMask < input.mask.length) {
21                    let simbolValue = input.value.charAt(posValue);
22                    let simbolMask = input.mask.charAt(posMask);
23
24                    if (
25                        simbolMask == simbolValue
26                        || (simbolMask == '9' && AbcwwwMaskPhone.isNum(simbolValue))
27                    ) {
28                        posReturnChange = false;
29                        valueNew += simbolValue;
30                        posMask++;
31                    } else if (
32                        simbolMask == '9'
33                        && !AbcwwwMaskPhone.isNum(simbolValue)
34                    ) {
35                        posReturnChange = false;
36                    } else if (
37                        simbolMask != '9'
38                        && AbcwwwMaskPhone.isNum(simbolValue)
39                    ) {
40                        valueNew += simbolMask;
41                        posMask++;
42                        posValue--;
43                        if (posReturnChange) {
44                            posReturn++;
45                        }
46                        if (
47                            input.valueOld.length > posReturn
48                            && input.valueOld.charAt(posReturn - 1) == simbolMask
49                        ) {
50                            while (posReturn > 1 && !AbcwwwMaskPhone.isNum(input.valueOld.charAt(posReturn - 1))) {
51                                posReturn--;
52                            }
53                        }
54                    } else if (
55                        simbolMask != '9'
56                        && !AbcwwwMaskPhone.isNum(simbolValue)
57                    ) {
58                        valueNew += simbolMask;
59                        posMask++;
60                    }
61                }
62            }
63            input.value = valueNew;
64            input.valueOld = valueNew;
65
66            let valueNotFull = '';
67            for (let posMask = 0; posMask < input.mask.length; posMask++) {
68                let simbolMask = input.mask.charAt(posMask);
69                if (simbolMask == '9') {
70                    if (input.value.length <= posMask) {
71                        input.value = valueNotFull;
72                        input.valueOld = valueNotFull;
73                        posReturn = input.value.length;
74                    }
75                    break;
76                }
77                valueNotFull += simbolMask;
78            }
79
80            return posReturn;
81        };
82        this.cursorPosition = function (input) {
83            let posMinimum = 0;
84            for (let posMask = 0; posMask < input.mask.length; posMask++) {
85                let simbolMask = input.mask.charAt(posMask);
86                if (
87                    simbolMask == '9'
88                    || input.value.length <= posMask
89                ) {
90                    posMinimum = posMask;
91                    break;
92                }
93            }
94            if (
95                input.selectionStart < posMinimum
96                || input.selectionEnd < posMinimum
97            ) {
98                input.selectionStart = posMinimum;
99                input.selectionEnd = posMinimum;
100            }
101        }
102        this.maskDefault = '+7 (999) 999-99-99';
103
104        this.init = function (input, mask, placeholder) {
105            placeholder = placeholder === undefined || placeholder === true ? true : false;
106            if (!input) {
107                return false;
108            }
109            if (!input.classList.contains('is-masked')) {
110                input.mask = mask || AbcwwwMaskPhone.maskDefault;
111                input.valueOld = input.value;
112                AbcwwwMaskPhone.maskEditValue(input, 0);
113                if (input.value.length != input.mask.length) {
114                    input.value = '';
115                }
116                if (placeholder) {
117                    input.setAttribute('placeholder', input.mask);
118                }
119
120                input.classList.add('is-masked');
121
122                input.addEventListener('input', function () {
123                    let posReturn = AbcwwwMaskPhone.maskEditValue(this, this.selectionStart);
124                    this.selectionStart = posReturn;
125                    this.selectionEnd = posReturn;
126                });
127                input.addEventListener('focus', function () {
128                    if (this.value.length <= 0) {
129                        this.value = this.valueOld;
130                        this.selectionStart = this.value.length;
131                        this.selectionEnd = this.value.length;
132                    }
133                });
134                input.addEventListener('blur', function () {
135                    if (this.value.length != this.mask.length) {
136                        this.value = '';
137                    }
138                });
139                input.addEventListener('keydown', function () {
140                    let obInput = this;
141                    setTimeout(function () {
142                        AbcwwwMaskPhone.cursorPosition(obInput);
143                    }, 10);
144                });
145                input.addEventListener('keyup', function () {
146                    AbcwwwMaskPhone.cursorPosition(this);
147                });
148                input.addEventListener('click', function () {
149                    AbcwwwMaskPhone.cursorPosition(this);
150                });
151            }
152        };
153    };
154}
155
156$(document).ready(function () {
157    new isvek.Bvi({
158        fontSize: 24,
159        theme: 'black'
160    });
161
162    let jsTel = $('.jsTel');
163    jsTel.each(function () {
164        AbcwwwMaskPhone.init(this, '+7 (999) 999-99-99', false);
165    });
166
167
168    var thumbSlider = new Swiper(".small-slider", {
169        spaceBetween: 27,
170        slidesPerView: 4,
171        slidesPerGroup: 1,
172        speed: 900,
173        watchSlidesProgress: true,
174        navigation: {
175            nextEl: '.swiper-button-next',
176            prevEl: '.swiper-button-prev'
177        },
178        breakpoints: {
179
180            0: {
181                spaceBetween: 27,
182                slidesPerView: 3,
183            },
184            1281: {
185                spaceBetween: 27,
186                slidesPerView: 4,
187            },
188        }
189    });
190    var bigSlider = new Swiper(".big-slider", {
191        spaceBetween: 20,
192        slidesPerView: 1,
193        slidesPerGroup: 1,
194        speed: 900,
195        pagination: {
196            el: ".swiper-pagination",
197            clickable: true,
198        },
199        thumbs: {
200            swiper: thumbSlider,
201        },
202    });
203    new Swiper(".main-slider", {
204        spaceBetween: 0,
205        slidesPerView: 1,
206        slidesPerGroup: 1,
207        speed: 800,
208        effect: 'fade',
209        //autoplay: {
210        //    delay: 5000,
211        //    disableOnInteraction: false,
212        //},
213        pagination: {
214            el: ".swiper-pagination",
215            clickable: true,
216        },
217    });
218
219    new Swiper(".section-slider", {
220        spaceBetween: 25,
221        slidesPerView: 4,
222        slidesPerGroup: 1,
223        speed: 800,
224        navigation: {
225            nextEl: '.swiper-button-next',
226            prevEl: '.swiper-button-prev'
227        },
228        breakpoints: {
229            0: {
230                spaceBetween: 15,
231                slidesPerView: 1.3,
232            },
233            576: {
234                spaceBetween: 15,
235                slidesPerView: 2.3,
236            },
237            769: {
238                spaceBetween: 25,
239                slidesPerView: 2,
240            },
241            1281: {
242                spaceBetween: 25,
243                slidesPerView: 4,
244            },
245        },
246    });
247    new Swiper(".form-slider", {
248        spaceBetween: 24,
249        slidesPerView: 10,
250        slidesPerGroup: 1,
251        speed: 800,
252        navigation: {
253            nextEl: '.swiper-button-next',
254            prevEl: '.swiper-button-prev'
255        },
256        breakpoints: {
257            0: {
258                spaceBetween: 15,
259                slidesPerView: 2,
260            },
261            576: {
262                spaceBetween: 24,
263                slidesPerView: 3,
264            },
265            769: {
266                spaceBetween: 24,
267                slidesPerView: 6,
268            },
269            1025: {
270                spaceBetween: 24,
271                slidesPerView: 8,
272            },
273            1621: {
274                spaceBetween: 24,
275                slidesPerView: 10,
276            },
277        },
278    });
279    const singleSliders = [];
280    document.querySelectorAll('.single-slider').forEach((sliderEl, index) => {
281        singleSliders[index] = new Swiper(sliderEl, {
282            spaceBetween: 20,
283            slidesPerView: 1,
284            slidesPerGroup: 1,
285            speed: 800,
286            effect: 'fade',
287            observer: true,
288            pagination: {
289                el: sliderEl.querySelector('.swiper-pagination'),
290                clickable: true,
291            },
292            on: {
293                init: function () {
294                    updateNavButtons(this);
295                },
296                slideChange: function () {
297                    updateNavButtons(this);
298                }
299            }
300        });
301    });
302    function updateNavButtons(swiper) {
303        const prevBtn = swiper.el.querySelector('.jsSinglePrev');
304        const nextBtn = swiper.el.querySelector('.jsSingleNext');
305        if (prevBtn) {
306            swiper.isBeginning ? prevBtn.classList.add('swiper-button-disabled') : prevBtn.classList.remove('swiper-button-disabled');
307        }
308        if (nextBtn) {
309            swiper.isEnd ? nextBtn.classList.add('swiper-button-disabled') : nextBtn.classList.remove('swiper-button-disabled');
310        }
311    }
312    $(document).on('click', '.jsSinglePrev', function () {
313        const sliderEl = $(this).closest('.single-slider')[0];
314        const swiperInstance = singleSliders.find(swiper => swiper && swiper.el === sliderEl);
315        if (swiperInstance && !swiperInstance.isBeginning) {
316            swiperInstance.slidePrev();
317        }
318    });
319    $(document).on('click', '.jsSingleNext', function () {
320        const sliderEl = $(this).closest('.single-slider')[0];
321        const swiperInstance = singleSliders.find(swiper => swiper && swiper.el === sliderEl);
322        if (swiperInstance && !swiperInstance.isEnd) {
323            swiperInstance.slideNext();
324        }
325    });
326    $(document).on('click', '.jsOpenFrame', function (e) {
327        let objButton = $(this);
328        e.preventDefault();
329        $.fancybox.open({
330            src: objButton.data('url'),
331            type: 'iframe',
332            opts: {
333                touch: false,
334            }
335        });
336    });
337    $(document).on('click', '.jsOpenSearch', () => {
338        $('.jsOpenSearch, .jsHeaderSearch').toggleClass('active')
339        $('.jsOpenCatalog, .jsHeaderCatalog').removeClass('active')
340    })
341    $(document).on('click', '.jsTogglerHead', function () {
342        var togglerParent = $(this).closest('.jsTogglerParent')
343        $(this).toggleClass('active');
344        $(this).next('.jsTogglerBody').slideToggle();
345        if (togglerParent.length) {
346            togglerParent.toggleClass('active')
347        }
348    })
349    $(document).on('click', '.jsOpenCatalog', function () {
350        $('.jsOpenCatalog, .jsHeaderCatalog').toggleClass('active');
351        $('.jsOpenSearch, .jsHeaderSearch').removeClass('active')
352        if ($('.jsHeaderCatalog').hasClass('active') && window.innerWidth <= 1024) {
353            $('body').css('overflow', 'hidden');
354        } else {
355            $('body').css('overflow', '');
356        }
357    })
358    $(document).on('click', '.jsTabHead', function () {
359        $(this).addClass('active').siblings().removeClass('active');
360        let jqParent = $(this).closest('.jsTabParent');
361        jqParent.find('.jsTabBody').eq($(this).index()).addClass('active').siblings().removeClass('active');
362    })
363
364    $(document).on('click', '.jsProfileBtn', function (e) {
365        e.stopPropagation();
366        $('.jsProfileBtnParent, .jsProfileBody').toggleClass('active');
367        $('.jsOpenSearch, .jsHeaderSearch').removeClass('active')
368    })
369
370    $(document).on('click', function () {
371        $('.jsProfileBtnParent, .jsProfileBody').removeClass('active');
372    });
373
374    $(document).on('click', '.jsCounterBtn', function (e) {
375        e.stopPropagation();
376        $('.jsCounterBtnParent, .jsCounterBody').toggleClass('active');
377        $('.jsOpenSearch, .jsHeaderSearch').removeClass('active')
378    })
379
380    $(document).on('click', function () {
381        $('.jsCounterBtnParent, .jsCounterBody').removeClass('active');
382    });
383
384    $(document).on('click', '.jsPaymentBtn', function (e) {
385        e.stopPropagation();
386        $('.jsPaymentBtnParent, .jsPaymentBody').toggleClass('active');
387        $('.jsOpenSearch, .jsHeaderSearch').removeClass('active')
388    })
389
390    $(document).on('click', function () {
391        $('.jsPaymentBtnParent, .jsPaymentBody').removeClass('active');
392    });
393
394    $(document).on('click', '.jsRequestBtn', function (e) {
395        e.stopPropagation();
396        $('.jsRequestBtnParent, .jsPRequestBody').toggleClass('active');
397        $('.jsOpenSearch, .jsHeaderSearch').removeClass('active')
398    })
399
400    $(document).on('click', function () {
401        $('.jsRequestBtnParent, .jsRequestBody').removeClass('active');
402    });
403
404
405    $('table:not([class])').each(function () {
406        $(this).find('td').each(function () {
407            $(this).attr('data-cell', $(this).closest('table').find('th').eq($(this).index()).text())
408        })
409    })
410
411    function fixHeader() {
412        if (window.scrollY > $('.header').height()) {
413            $('.header').addClass('sticky')
414            $('main').addClass('offset')
415        } else {
416            $('.header').removeClass('sticky')
417            $('main').removeClass('offset')
418        }
419    }
420
421    $(window).on('scroll', function () {
422        fixHeader()
423        window.scrollY > 350 ? $('.jsScrollUp').addClass('active') : $('.jsScrollUp').removeClass('active')
424    })
425    fixHeader();
426
427    $(document).on('click', '.jsScrollUp', function () {
428        $('html, body').animate({
429            scrollTop: 0
430        }, 800);
431    })
432
433    $(document).on('input', '.jsRestrictInput', function () {
434        const maxLength = parseInt($(this).attr('data-max'));
435        if (this.value.length > maxLength) {
436            this.value = this.value.slice(0, maxLength);
437        }
438    })
439    $(document).on('click', '.jsAddFields', function (e) {
440        e.preventDefault();
441        var $fieldsParent = $(this).closest('.jsFieldsParent');
442        var maxSliderNum = 1;
443        var maxLayoutNum = 1;
444        var maxTestimonyNum = 1;
445        var maxJSObjectNum = 1;
446        var maxDocTehNum = 1;
447		
448
449        $('.jsFieldsParent').each(function () {
450            $(this).find('input[type="radio"][name^="form-slider-"]').each(function () {
451                var name = $(this).attr('name');
452                var num = parseInt(name.replace('form-slider-', ''));
453                if (num > maxSliderNum) maxSliderNum = num;
454            });
455            $(this).find('input[type="radio"][name^="choose-layout-"]').each(function () {
456                var name = $(this).attr('name');
457                var num = parseInt(name.replace('choose-layout-', ''));
458                if (num > maxLayoutNum) maxLayoutNum = num;
459            });
460            $(this).find('input[name^="user_testimony_object_number_"]').each(function () {
461                var name = $(this).attr('name');
462                var num = parseInt(name.replace('user_testimony_object_number_', ''));
463                if (num > maxTestimonyNum) maxTestimonyNum = num;
464            });
465            $(this).find('input[name*="user_account"]').each(function () {
466                maxJSObjectNum++;
467            });
468            $(this).find('input[name^="file_doc_teh_"]').each(function () {
469                var name = $(this).attr('name');
470                var num = parseInt(name.replace('file_doc_teh_', ''));
471                if (num > maxDocTehNum) maxDocTehNum = num;
472            });
473        });
474
475        var $clone = $fieldsParent.clone();
476		var $clone_id = $clone.attr('data-object-id');
477        $clone.attr('data-object-id',(Number($clone_id) + 1));
478		$fieldsParent.addClass('jsFieldsOlder');
479        $clone.find('input').each(function () {
480            if ($(this).attr('type') === 'radio' || $(this).attr('type') === 'checkbox') {
481                $(this).prop('checked', false);
482            } else {
483                $(this).val('');
484            }
485        });
486		
487        $clone.find('input[name^="user_testimony_object_number_"').attr('name', 'user_testimony_object_number_' + (maxTestimonyNum + 1));
488        $clone.find('input[name^="user_testimony_factory_number_"').attr('name', 'user_testimony_factory_number_' + (maxTestimonyNum + 1));
489        $clone.find('input[name^="user_testimony_counter_prev_"').attr('name', 'user_testimony_counter_prev_' + (maxTestimonyNum + 1));
490        $clone.find('input[name^="user_testimony_counter_current_"').attr('name', 'user_testimony_counter_current_' + (maxTestimonyNum + 1));
491		
492        $clone.find('input[name*="user_account"]').attr('name', 'user_object[' + (maxJSObjectNum) + '][user_account]');
493        $clone.find('input[name*="user_locality"]').attr('name', 'user_object[' + (maxJSObjectNum) + '][user_locality]');
494        $clone.find('input[name*="user_street"]').attr('name', 'user_object[' + (maxJSObjectNum) + '][user_street]');
495        $clone.find('input[name*="user_house_number"]').attr('name', 'user_object[' + (maxJSObjectNum) + '][user_house_number]');
496        $clone.find('input[name*="user_room_number"]').attr('name', 'user_object[' + (maxJSObjectNum) + '][user_room_number]');
497        $clone.find('input.js-object-day').attr('name', 'user_object[' + (maxJSObjectNum) + '][day]');
498        $clone.find('input.js-object-time').attr('name', 'user_object[' + (maxJSObjectNum) + '][time]');
499		
500        $clone.find('label[for^="file_doc_teh_"').attr('for', 'file_doc_teh_' + (maxDocTehNum + 1));
501        $clone.find('input[name^="file_doc_teh_"').attr('name', 'file_doc_teh_' + (maxDocTehNum + 1)).attr('id', 'file_doc_teh_' + (maxDocTehNum + 1));
502		
503        $clone.find('input[type="radio"][name^="form-slider-"]').attr('name', 'form-slider-' + (maxSliderNum + 1));
504        $clone.find('input[type="radio"][name^="choose-layout-"]').attr('name', 'choose-layout-' + (maxLayoutNum + 1));
505        $clone.find('.jsFileName').text('Файл не выбран');
506        $clone.find('.jsFileInput').val('');
507        $fieldsParent.after($clone);
508        $(this).closest('.jsAddFieldsParent').remove();
509
510        setTimeout(function () {
511            applyValidationToFields();
512            var newSlider = $clone.find('.form-slider.swiper')[0];
513            if (newSlider) {
514                new Swiper(newSlider, {
515                    spaceBetween: 24,
516                    slidesPerView: 10,
517                    slidesPerGroup: 1,
518                    speed: 800,
519                    navigation: {
520                        nextEl: $clone.find('.swiper-button-next')[0],
521                        prevEl: $clone.find('.swiper-button-prev')[0]
522                    },
523                    breakpoints: {
524                        0: {
525                            spaceBetween: 15,
526                            slidesPerView: 2,
527                        },
528                        576: {
529                            spaceBetween: 24,
530                            slidesPerView: 3,
531                        },
532                        769: {
533                            spaceBetween: 24,
534                            slidesPerView: 6,
535                        },
536                        1025: {
537                            spaceBetween: 24,
538                            slidesPerView: 8,
539                        },
540                        1621: {
541                            spaceBetween: 24,
542                            slidesPerView: 10,
543                        },
544                    },
545                });
546            }
547			if(typeof getDatesAndTimes === "function") {
548				getDatesAndTimes(maxJSObjectNum);
549			}
550        }, 50);
551    });
552
553    $(document).on('click', '.jsAddFields_v2', function (e) {
554        e.preventDefault();
555        var $fieldsParent = $(this).closest('.jsFieldsParent');
556        var maxJSObjectNum = 1;
557
558        var $clone = $fieldsParent.clone();
559		var $clone_id = $clone.attr('data-object-id');
560        $clone.attr('data-object-id',(Number($clone_id) + 1));
561		$fieldsParent.addClass('jsFieldsOlder');
562        $clone.find('input').each(function () {
563            if ($(this).attr('type') === 'radio' || $(this).attr('type') === 'checkbox') {
564                $(this).prop('checked', false);
565            } else {
566                $(this).val('');
567            }
568        });
569
570        $('.jsFieldsParent').each(function () {
571            $(this).find('input[name*="user_account"]').each(function () {
572                maxJSObjectNum++;
573            });
574        });
575		
576        $clone.find('input[name*="user_locality"]').attr('name', 'user_object[' + (Number($clone_id) + 1) + '][user_locality]');
577        $clone.find('input[name*="model_uirg"]').attr('name', 'user_object[' + (Number($clone_id) + 1) + '][model_uirg]');
578        $clone.find('input[name*="num_uirg"]').attr('name', 'user_object[' + (Number($clone_id) + 1) + '][num_uirg]');
579        $clone.find('input[name*="meter_uirg"]').attr('name', 'user_object[' + (Number($clone_id) + 1) + '][meter_uirg]');
580        $clone.find('input[name*="user_transfer"]').attr('name', 'user_object[' + (Number($clone_id) + 1) + '][user_transfer]').val('<br>');
581        $clone.find('input[name*="need_off_meter][1]"]').attr('name', 'user_object[' + (Number($clone_id) + 1) + '][need_off_meter][1]');
582        $clone.find('input[name*="need_off_meter][2]"]').attr('name', 'user_object[' + (Number($clone_id) + 1) + '][need_off_meter][2]');
583
584        $fieldsParent.after($clone);
585        $(this).closest('.jsAddFieldsParent').remove();
586    });
587
588    $(document).on('click', '.jsDropBox', function (e) {
589        e.stopPropagation();
590        $(this).toggleClass('active');
591    })
592
593    $(document).on('click', function (e) {
594        e.stopPropagation();
595        $('.jsDropBox').removeClass('active')
596    })
597
598    $(document).on('click', '.jsFormDrop', function (e) {
599        e.stopPropagation();
600        $(this).closest('.jsDropBox').find('input').val($(this).text())
601        $('.jsDropBox').removeClass('active')
602    })
603
604
605    $(document).on('change', '.jsFileInput', function () {
606        var $fileInput = $(this);
607        var $fileBlock = $fileInput.closest('.jsFormFile');
608        var $fileNameDisplay = $fileBlock.find('.jsFileName');
609        var fileName = $fileInput.val().split('\\').pop();
610        fileName ? $fileNameDisplay.text(fileName) : $fileNameDisplay.text('Файл не выбран');
611    });
612
613
614    $('.jsFormFile').each(function () {
615        var $fileInput = $(this).find('.jsFileInput');
616        var $fileNameDisplay = $(this).find('.jsFileName');
617        var fileName = $fileInput.val().split('\\').pop();
618        $fileNameDisplay.text(fileName ? fileName : 'Файл не выбран');
619    });
620
621
622
623    $.fancybox.defaults.backFocus = false;
624    $.fancybox.defaults.autoFocus = false;
625    new AirDatepicker('#dateInput', {
626        multipleDatesSeparator: ' - ',
627    });
628    $(document).on('click', '.jsOpenModal', function (e) {
629        let objButton = $(this);
630        e.preventDefault();
631        $.fancybox.open({
632            src: objButton.data('url'),
633            type: 'ajax',
634            opts: {
635                touch: false,
636                afterShow: function (instance, current) {
637                    let objSource = current.$content;
638                    let jsTel = objSource.find('.jsTel')
639                    let modalFile = objSource.find('.jsFormFile')
640                    jsTel.each(function () {
641                        AbcwwwMaskPhone.init(this, '+7 (999) 999-99-99');
642                    });
643                    modalFile.each(function () {
644                        var $fileInput = $(this).find('.jsFileInput');
645                        var $fileNameDisplay = $(this).find('.jsFileName');
646                        var fileName = $fileInput.val().split('\\').pop();
647                        $fileNameDisplay.text(fileName ? fileName : 'Файл не выбран');
648                    });
649                    new AirDatepicker('#modalCalendar', {
650                        multipleDatesSeparator: ' - ',
651                        container: objSource.closest('.fancybox__container')[0] || document.body,
652                        autoClose: true,
653                    });
654                }
655            }
656        });
657    });
658
659    // Модальное окно со слайдером
660    setTimeout(function () {
661        $.ajax({
662            url: '/ajax/links-modal.php',
663            type: 'POST',
664            dataType: 'json',
665            success: function(response) {
666                if (response.HTML && response.HTML.trim().length > 0 && response.SHOW_HTML) {
667                    console.log(response.COOKIES);
668
669                    for (const [key, value] of Object.entries(response.COOKIES)) {
670                        if (!getCookie(key)) {
671                            setCookie(key, Date.now(), {secure: true, 'max-age': 3600});
672                        }
673                    }
674
675                    $.fancybox.open({
676                        src: response.HTML,
677                        type: 'html',
678                        opts: {
679                            touch: false,
680                            afterShow: function (instance, current) {
681                                new Swiper(".modal-slider", {
682                                    spaceBetween: 24,
683                                    slidesPerView: 1,
684                                    slidesPerGroup: 1,
685                                    speed: 800,
686                                    effect: 'fade',
687                                    autoHeight: true,
688                                    autoplay: {
689                                        delay: 5000,
690                                        disableOnInteraction: false,
691                                    },
692                                    pagination: {
693                                        el: ".swiper-pagination",
694                                        clickable: true,
695                                    },
696                                });
697                            }
698                        }
699                    });
700                }
701            },
702            error: function(xhr, status, error) {
703                console.log('Ошибка при загрузке файла:', error);
704            }
705        });
706    }, 2000);
707
708    $(document).on('click', '.jsAnchorLink', function () {
709        let anchor = $(this).attr('href');
710        $('html, body').animate({
711            scrollTop: $(anchor).offset().top - 100
712        }, 600);
713        return false;
714    });
715
716    $(".section-togglers__body .more-btn button.btn").on("click", function() {
717        var docsItems = $(this).parents(".section-togglers__body").find(".docs__item_hidden");
718        docsItems.each(function(index, element) {
719            $(element).removeClass("docs__item_hidden");
720        });
721        $(this).hide();
722    });
723
724    $(document).on("click", ".more-btn-photogallery span.btn", function() {
725        const curCount = $(this).attr("data-cur-count");
726        const curIblockID = $(this).attr("data-cur-iblock");
727        const curYear = $(this).attr("data-cur-year");
728
729        $.ajax({
730            url: "/local/ajax/photoGalleryList.php",
731            method: "POST",
732            dataType: "JSON",
733            data: { curCount: (curCount * 2), iblockID: curIblockID, year: curYear },
734            success: function(data) {
735                if(data.html) {
736                    $(".gallery .container").html(data.html);
737                }
738
739                $(".more-btn-photogallery span.btn").attr("data-cur-count", data.cnt);
740                $(".more-btn-photogallery span.btn").attr("data-cur-year", data.curYear);
741            }
742        });
743    });
744
745    $(document).on("click", ".more-btn-photogallery-element span.btn", function() {
746        const curCount = $(this).attr("data-cur-count");
747        const curIblockID = $(this).attr("data-cur-iblock");
748        const curSectionID = $(this).attr("data-cur-section");
749
750        $.ajax({
751            url: "/local/ajax/photoGalleryElement.php",
752            method: "POST",
753            dataType: "JSON",
754            data: { curCount: (curCount * 2), iblockID: curIblockID, sectionID: curSectionID },
755            success: function(data) {
756                if(data.html) {
757                    $(".gallery .container").html(data.html);
758                }
759
760                $(".more-btn-photogallery span.btn").attr("data-cur-count", data.cnt);
761            }
762        });
763    });
764
765    $(document).on("click", ".more-btn-videogallery-element span.btn", function() {
766        const curCount = $(this).attr("data-cur-count");
767        const curIblockID = $(this).attr("data-cur-iblock");
768        const curYear = $(this).attr("data-cur-year");
769
770        $.ajax({
771            url: "/local/ajax/videoGalleryElement.php",
772            method: "POST",
773            dataType: "JSON",
774            data: { curCount: (curCount * 2), iblockID: curIblockID, year: curYear },
775            success: function(data) {
776                if(data.html) {
777                    $(".gallery .container").html(data.html);
778                }
779
780                $(".more-btn-videogallery span.btn").attr("data-cur-count", data.cnt);
781            }
782        });
783    });
784
785    $(document).on("click", "#more-btn-news", function() {
786        const curCount = $(this).attr("data-cur-count");
787        const curIblockID = $(this).attr("data-cur-iblock");
788        const curYear = $(this).attr("data-cur-year");
789
790        $.ajax({
791            url: "/local/ajax/newsList.php",
792            method: "POST",
793            dataType: "JSON",
794            data: { curCount: (curCount * 2), iblockID: curIblockID, year: curYear },
795            success: function(data) {
796                if(data.html) {
797                    $(".about-page .container").html(data.html);
798                }
799
800                $("#more-btn-news").attr("data-cur-count", data.cnt);
801            }
802        });
803    });
804	
805	var send = false;
806	$('#confirmForm a.update_code').on('click',function(e) {
807        if(!send) {
808            var fdata = $('#confirmForm').serialize();
809            $.ajax({
810                type: 'POST',
811                dataType: 'json',
812                url: '/ajax/sendForm.php?cmd=update_code',
813                data: fdata,
814                success: function(data) {
815                    if(data.status == 'code') {
816						$.fancybox.open(`
817							<div class="modal-success-block">
818								<p class="modal-success-text">Новый код отправлен Вам на электронную почту!</p>
819							</div>
820                        `);
821                        send = true;
822                        setTimeout(function() {send = false;}, 60000);
823                    } else {
824						$.fancybox.open(`
825							<div class="modal-success-block">
826								<p class="modal-success-text">Произошла ошибка!</p>
827							</div>
828						`);
829                    }
830                }
831            });
832        } else {
833			$.fancybox.open(`
834				<div class="modal-success-block">
835					<p class="modal-success-text">Пока Вы не можете сгенерировать новый код, подождите еще!</p>
836				</div>
837			`);
838        }
839    });
840
841    //$("form.form").on("submit", function(e) {
842    $(document).on("submit", "form.form", function(e) {
843        e.preventDefault();
844
845        var flag = true;
846        var curForm = $(this);
847
848        $(curForm).find("button.btn").prop("disabled", "disabled");
849
850        $(curForm).find("input").each(function(index, element) {
851            if ($(element).prop("required")) {
852                if ($(element).prop("type") == "text" && $(element).val() == "") {
853                    $(element).addClass("has-error");
854                    flag = false;
855                }
856            }
857        });
858
859        if (flag) {
860			var formData = new FormData(curForm[0]);
861            $.ajax({
862                url: '/ajax/sendForm.php',
863                method: 'post',
864                dataType: 'json',
865                data: formData,
866				processData: false,
867				contentType: false,
868                success: function(data) {
869					captchaReload(curForm);
870					
871                    if (data.status == "success") {
872                        $.fancybox.open(`
873                            <div class="modal-success-block">
874                                <p class="modal-success-text">` + data.text + `</p>
875                            </div>
876                        `);
877
878                        $(curForm).find("input").each(function(index, element) {
879                            if ($(element).prop("type") == "file" || $(element).prop("type") == "text" || $(element).prop("type") == "number" || $(element).prop("type") == "tel" || $(element).prop("type") == "email") {
880                                $(element).val("");
881                            }
882                            else if ($(element).prop("type") == "checkbox") {
883                                $(element).prop("checked", "");
884                            }
885                        });
886						
887						$(curForm).find("textarea").each(function(index, element) {
888							$(element).val("").html('');
889                        });
890						
891						$(curForm).find('.jsFieldsOlder').remove();
892						
893						$(curForm).find('.jsFileName').html('Файл не выбран');
894
895                        $(".form_layout_code").removeClass("active");
896                        $(".form_layout_code input").attr("required", false);
897						
898						$(document).find('input[name=user_title]').val($('h1').text());
899						$(document).find('input[name=user_service]').val($('h1').text());
900                    }
901                    else if (data.status == "code") {
902						
903						send = true;
904                        setTimeout(function() {send = false;}, 60000);
905						
906						$('#confirmForm input[name=user_element]').val(data.id);
907					
908                        $(".form_layout_code").addClass("active");
909                        $(".form_layout_code input").attr("required", "required");
910
911                        if (data.substatus !== undefined && data.substatus == "error") {
912                            $.fancybox.open(`
913                                <div class="modal-error-block">
914                                    <p class="modal-error-text">` + data.text + `</p>
915                                </div>
916                            `);
917                        }
918                        else {
919                            $.fancybox.open(`
920                                <div class="modal-success-block">
921                                    <p class="modal-success-text">На почту был отправлен код</p>
922                                </div>
923                            `);
924                        }
925                    }
926                    else {
927                        var errorText = ((data.text) ? data.text : "Что-то пошло Ð
927½Ðµ так");
928                        $.fancybox.open(`
929                            <div class="modal-error-block">
930                                <p class="modal-error-text">` + errorText + `</p>
931                            </div>
932                        `);
933                    }
934
935                    /*if (data.status == "success") {
936                        $.ajax({
937                            url: '/ajax/captchaUpdate.php',
938                            method: 'post',
939                            dataType: 'json',
940                            data: curForm.serialize(),
941                            success: function(data) {
942                                $(curForm).find(".captcha img").prop("src", "/bitrix/tools/captcha.php?captcha_sid=" + data);
943                                $(curForm).find(".captcha input[name='captcha_sid']").val(data);
944                            }
945                        });
946                    }*/
947                }
948            });
949        }
950
951        $(curForm).find("button.btn").prop("disabled", "");
952    });
953
954    function applyValidationToFields() {
955        var myInput = document.querySelectorAll('.jsForm input[data-error-message]');
956        myInput.forEach(function (item) {
957            item.removeEventListener("invalid", validate);
958            item.removeEventListener("keyup", validate);
959            item.addEventListener("invalid", validate);
960            item.addEventListener("keyup", validate);
961        });
962    }
963    applyValidationToFields();
964
965    function validate() {
966        var val = this.value.length;
967        var min = parseFloat(this.min);
968        var errorMessage = $(this).attr('data-error-message');
969
970        // Если есть атрибут data-middle, используем сложную валидацию
971        if (this.hasAttribute('data-middle')) {
972            var middleLength = this.dataset.middle ? parseFloat(this.dataset.middle) : null;
973            var maxLength = this.dataset.max ? parseFloat(this.dataset.max) : null;
974
975            var isValid = false;
976
977            // Проверяем все возможные допустимые длины
978            if (val === min) {
979                isValid = true;
980            }
981            else if (middleLength !== null && val === middleLength) {
982                isValid = true;
983            }
984            else if (maxLength !== null && val === maxLength) {
985                isValid = true;
986            }
987
988            if (!isValid && errorMessage) {
989                this.setCustomValidity(errorMessage);
990            } else {
991                this.setCustomValidity("");
992            }
993        }
994        // Если нет атрибута data-middle, используем простую валидацию
995        else {
996            if (val < min && errorMessage) {
997                this.setCustomValidity(errorMessage);
998            } else {
999                this.setCustomValidity("");
1000            }
1001        }
1002    }
1003
1004    $(document).on('click', '.jsAddFields', function (e) {
1005        e.preventDefault();
1006        var $fieldsParent = $(this).closest('.jsFieldsParent');
1007        var maxSliderNum = 1;
1008        var maxLayoutNum = 1;
1009
1010        $('.jsFieldsParent').each(function () {
1011            $(this).find('input[type="radio"][name^="form-slider-"]').each(function () {
1012                var name = $(this).attr('name');
1013                var num = parseInt(name.replace('form-slider-', ''));
1014                if (num > maxSliderNum) maxSliderNum = num;
1015            });
1016            $(this).find('input[type="radio"][name^="choose-layout-"]').each(function () {
1017                var name = $(this).attr('name');
1018                var num = parseInt(name.replace('choose-layout-', ''));
1019                if (num > maxLayoutNum) maxLayoutNum = num;
1020            });
1021        });
1022
1023        var $clone = $fieldsParent.clone();
1024        $clone.find('input').each(function () {
1025            if ($(this).attr('type') === 'radio' || $(this).attr('type') === 'checkbox') {
1026                $(this).prop('checked', false);
1027            } else {
1028                $(this).val('');
1029            }
1030        });
1031
1032        $clone.find('input[type="radio"][name^="form-slider-"]').attr('name', 'form-slider-' + (maxSliderNum + 1));
1033        $clone.find('input[type="radio"][name^="choose-layout-"]').attr('name', 'choose-layout-' + (maxLayoutNum + 1));
1034        $clone.find('.jsFileName').text('Файл не выбран');
1035        $clone.find('.jsFileInput').val('');
1036        $fieldsParent.after($clone);
1037        $(this).closest('.jsAddFieldsParent').remove();
1038
1039        setTimeout(function () {
1040            applyValidationToFields();
1041            var newSlider = $clone.find('.form-slider.swiper')[0];
1042            if (newSlider) {
1043                new Swiper(newSlider, {
1044                    spaceBetween: 24,
1045                    slidesPerView: 10,
1046                    slidesPerGroup: 1,
1047                    speed: 800,
1048                    navigation: {
1049                        nextEl: $clone.find('.swiper-button-next')[0],
1050                        prevEl: $clone.find('.swiper-button-prev')[0]
1051                    },
1052                    breakpoints: {
1053                        0: {
1054                            spaceBetween: 15,
1055                            slidesPerView: 2,
1056                        },
1057                        576: {
1058                            spaceBetween: 24,
1059                            slidesPerView: 3,
1060                        },
1061                        769: {
1062                            spaceBetween: 24,
1063                            slidesPerView: 6,
1064                        },
1065                        1025: {
1066                            spaceBetween: 24,
1067                            slidesPerView: 8,
1068                        },
1069                        1621: {
1070                            spaceBetween: 24,
1071                            slidesPerView: 10,
1072                        },
1073                    },
1074                });
1075            }
1076        }, 50);
1077    });
1078});
1079
1080function getCookie(name) {
1081    let matches = document.cookie.match(new RegExp(
1082        "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
1083    ));
1084
1085    return matches ? decodeURIComponent(matches[1]) : undefined;
1086}
1087
1088/* Лупа - увеличение изображения */
1089jQuery(function(){
1090
1091	// инициализация плагина
1092	$('.my-foto').imagezoomsl({
1093		 zoomrange: [1, 12],
1094		 zoomstart: 5,
1095		 innerzoom: true,
1096		 magnifierborder: "none"
1097	});
1098});
1099 
1100function setCookie(name, value, options = {}) {
1101    options = {
1102        path: '/',
1103    };
1104
1105    if (options.expires instanceof Date) {
1106        options.expires = options.expires.toUTCString();
1107    }
1108
1109    let updatedCookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);
1110
1111    for (let optionKey in options) {
1112        updatedCookie += "; " + optionKey;
1113        let optionValue = options[optionKey];
1114        if (optionValue !== true) {
1115            updatedCookie += "=" + optionValue;
1116        }
1117    }
1118
1119    document.cookie = updatedCookie;
1120}
1121
1122function setVacancy(name) {
1123	$('#vacancyApplication input[name=user_vacancy]').val(name);
1124}
1125
1126function captchaReload(curForm) {
1127	$.ajax({
1128		url: '/ajax/captchaReload.php',
1129		method: 'post',
1130		dataType: 'json',
1131		success: function(data) {
1132			if(!!data) {
1133				curForm.find('.captcha img').attr('src','/bitrix/tools/captcha.php?captcha_sid='+data);
1134				curForm.find('.captcha_sid').val(data);
1135				curForm.find('input[name=captcha_word]').val('');
1136			}
1137		}
1138	});
1139}

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.