PageSourceSearch

https://felisatti.ru/local/components/tichiy/uni.forms/templates/.default/script.js

js felisatti.ru collected 2026-10-07 16:56:06 UTC 33,752 bytes, 840 lines download raw bytes

1var changeCity = function (text){
2    aHelper().setCookie('GEO_CITY', text, 365, 'naparnik.expert')
3
4    const jsCities = [...document.querySelectorAll('.header--loc span')];
5    for (const jsCitY of jsCities) {
6        jsCitY.innerHTML = text
7    }
8
9    AT.POPUP.tools.fadeOut()
10    AT.POPUP.tools.reloadPage(0)
11}
12
13var sendAuth = function (data){
14    AT.POPUP.ajax.send(data)
15        // выполнится, когда промис завершится, независимо от того, успешно или нет
16        //.finally(() => console.log("Промис завершён"))
17        // таким образом, индикатор загрузки всегда останавливается, прежде чем мы продолжим
18        .then(
19            result => {
20                BX.closeWait()
21
22                console.log(result)
23
24                if(result.NUMBER === 1){
25                    let parent = data.form.closest('.d--form')
26
27                    parent.querySelector('.d--title').innerHTML = 'Введите код из смс'
28
29                    data.form.querySelector('.d--auth-phone').innerHTML = data.data.phone
30                    data.form.classList.add('--sended')
31
32                    initCaptcha(data.form, 'sendSMS')
33
34                    //Запуск таймера
35                    let authTimer = data.form.querySelector('.d--auth-timer span')
36                    let seconds = BX.message('SMS_WAIT_TIME')
37
38                    let atimer = setInterval(() => {
39                        if(seconds < 1) {
40                            data.form.querySelector('.d--auth-timer').innerHTML = '<div class="d--auth-phone-new">Отправить новый код</div>'
41                            clearInterval(atimer);
42                        }
43
44                        if(!!authTimer)
45                            authTimer.textContent = seconds;
46
47                        seconds -= 1;
48                    }, 999);
49
50                    //AT.POPUP.tools.load('user-delete-thanks')
51                }else if(result.NUMBER === 3){
52                    AT.POPUP.tools.load('reg')
53                }else if(result.NUMBER === 5){
54                    AT.POPUP.tools.load('auth')
55                }else{
56                    //AT.POPUP.tools.load('user-delete-error')
57                }
58            },
59            err => {
60                BX.closeWait()
61
62                console.log(err)
63
64                AT.POPUP.tools.load('user-delete-error')
65            }
66        )
67        //Ловим ошибки
68        .catch(err => console.log(err));
69}
70
71var Authorize = function (data){
72    AT.POPUP.ajax.send(data)
73        // выполнится, когда промис завершится, независимо от того, успешно или нет
74        //.finally(() => console.log("Промис завершён"))
75        // таким образом, индикатор загрузки всегда останавливается, прежде чем мы продолжим
76        .then(
77            result => {
78                BX.closeWait()
79
80                console.log(result)
81
82                if(result.NUMBER === 1){
83                    AT.POPUP.tools.load('auth-thanks')
84                }else if(result.NUMBER === 3){
85                    AT.POPUP.tools.load('reg')
86                }else if(result.NUMBER === 2){
87                    AT.POPUP.tools.load('auth-error-code')
88                }else if(result.NUMBER === 4){
89                    AT.POPUP.tools.load('auth-error-attamps')
90                }else{
91                    AT.POPUP.tools.load('auth-error')
92                }
93            },
94            err => {
95                BX.closeWait()
96
97                console.log(err)
98
99                AT.POPUP.tools.load('user-delete-error')
100            }
101        )
102        //Ловим ошибки
103        .catch(err => console.log(err));
104}
105
106var sendRegister = function (data){
107    AT.POPUP.ajax.send(data)
108        // выполнится, когда промис завершится, независимо от того, успешно или нет
109        //.finally(() => console.log("Промис завершён"))
110        // таким образом, индикатор загрузки всегда останавливается, прежде чем мы продолжим
111        .then(
112            result => {
113                BX.closeWait()
114
115                console.log(result)
116
117                if(result.NUMBER === 1){
118                    AT.POPUP.tools.load('reg-thanks')
119                }else if(result.NUMBER === 3){
120                    AT.POPUP.tools.load('reg')
121                }else if(result.NUMBER === 2){
122                    AT.POPUP.tools.load('auth-error-code')
123                }else if(result.NUMBER === 4){
124                    AT.POPUP.tools.load('auth-error-attamps')
125                }else{
126                    AT.POPUP.tools.load('reg-error')
127                }
128            },
129            err => {
130                BX.closeWait()
131
132                console.log(err)
133
134                AT.POPUP.tools.load('user-delete-error')
135            }
136        )
137        //Ловим ошибки
138        .catch(err => console.log(err));
139}
140
141document.addEventListener("DOMContentLoaded", function () {
142    const cities = [...document.querySelectorAll('.location--city')];
143    for (const city of cities) {
144        city.addEventListener('click', function (e) {
145            changeCity(city.textContent)
146        })
147    }
148
149    document.addEventListener('input', function (e) {
150        if(e.target.classList.contains('d--SMS')){
151            let parent = e.target.closest('form'),
152                but = parent.querySelector('.d--but')
153
154            if(e.target.value.length === 4){
155                but.removeAttribute('disabled')
156            }else{
157                but.setAttribute('disabled','disabled')
158            }
159        }
160    })
161
162    document.addEventListener('change', function (e) {
163        //Отмечаем соглашение в политикой конфиденциальности
164        if(e.target.classList.contains('d--policy')){
165            let parent = e.target.closest('form'),
166                but = parent.querySelector('.d--but')
167
168            if(e.target.checked && AT.POPUP.check.validate(parent)){
169                but.removeAttribute('disabled')
170            }else{
171                but.setAttribute('disabled','disabled')
172            }
173        }
174
175        let el = e.target.closest('#image-upload-rev');
176        if(!!el) {
177            let parent = el.closest('form')
178
179            if(!!parent){
180                /*
181                //Ставим ограничение на кол-во файлов
182                let inputError = parent.querySelector('.input__file-error')
183                if (el.files.length > 3) {
184                    el.value = '';
185                    inputError.innerHTML = 'Вы превысыли лимит фотографий. Пожалуйста, добавьте не более 3'
186                    inputError.classList.add('--show')
187                    return
188                }else{
189                    inputError.innerHTML = ''
190                    inputError.classList.remove('--show')
191                }
192
193                //Делаем галерею из добавленных фото
194                const curFiles = parent.querySelector('#image-upload-rev').files;
195                const gallery = parent.querySelector('#gallery');
196                gallery.innerHTML = ''; // очищаем галерею от прежних миниатюр
197
198                for(const file of curFiles) {
199                    const imageObjectUrl = URL.createObjectURL(file);
200
201                    const divElement = document.createElement('div');
202                    divElement.classList.add('review--popup-img')
203
204                    const imgElement = document.createElement('img');
205                    imgElement.src = imageObjectUrl; // каждому изображению свойственно иметь свой URL
206
207                    divElement.appendChild(imgElement);
208
209                    gallery.appendChild(divElement); // галерея пополняется с каждой новой загрузкой 🖼️
210                }
211
212                let label = el.nextElementSibling,
213                    labelVal = label.querySelector('.field__file-fake').innerText;
214
215                let countFiles = '';
216                if (this.files && this.files.length >= 1)
217                    countFiles = this.files.length;
218
219                if (countFiles)
220                    label.querySelector('.field__file-fake').innerText = 'Выбрано файлов: ' + countFiles;
221                else
222                    label.querySelector('.field__file-fake').innerText = labelVal;
223                */
224
225                let label = el.nextElementSibling,
226                    labelVal = 'Загрузить резюме';
227
228                const curFiles = parent.querySelector('#image-upload-rev').files;
229
230                let countFiles = '';
231                if (curFiles && curFiles.length >= 1)
232                    countFiles = curFiles.length;
233
234                if (countFiles)
235                    parent.querySelector('.input__file-button-text').innerText = 'Выбрано файлов: ' + countFiles;
236                else
237                    parent.querySelector('.input__file-button-text').innerText = labelVal;
238            }
239        }
240    })
241
242    document.addEventListener('click', function (e) {
243        var target = e.target
244
245        //Обратный звонок
246        var el = target.closest('.do--locations .bx-ui-sls-variant')
247        if(!!el){
248            changeCity(el.querySelector('.newFilLCode').getAttribute('data-name'))
249        }
250
251        // region Оставить обращение
252        el = target.closest('.js--leave-request:not([disabled])')
253        if(!!el){
254            e.stopPropagation()
255            e.preventDefault()
256
257            let parent  = el.closest('form'),
258                phone   = parent.querySelector('input.d--PHONE'),
259                mail    = parent.querySelector('input.d--MAIL'),
260                email   = parent.querySelector('input.d--EMAIL'),
261                name    = parent.querySelector('input.d--FIO'),
262                message = parent.querySelector('textarea.d--MESSAGE')
263
264            if(aHelper().formSubmit(parent)){
265                el.setAttribute('disabled', 'disabled')
266
267                let data = {
268                    data: {
269                        sessid:     BX.bitrix_sessid(),
270                        name:       name.value,
271                        phone:      phone.value,
272                        mail:       mail.value,
273                        email:      email.value,
274                        message:    message.value,
275                    },
276                    el: el
277                }
278
279                data.url = '/api/form/leave/'
280
281                BX.showWait();
282
283                //new Promise(resolve => aHelper().sendRequest(data));
284
285                AT.POPUP.ajax.send(data)
286                    // выполнится, когда промис завершится, независимо от того, успешно или нет
287                    //.finally(() => console.log("Промис завершён"))
288                    // таким образом, индикатор загрузки всегда останавливается, прежде чем мы продолжим
289                    .then(
290                        result => {
291                            BX.closeWait()
292                            ym(54907387,'reachGoal','obr_send')
293                            if (!!data.el)
294                                data.el.removeAttribute('disabled')
295
296                            AT.POPUP.tools.load('thanks')
297                        },
298                        err => {
299                            BX.closeWait()
300                            console.log(err)
301
302                            if(!!data.el)
303                                data.el.removeAttribute('disabled')
304
305                            AT.POPUP.tools.load('error')
306                        }
307                    )
308                    //Ловим ошибки
309                    .catch(err => console.log(err));
310            }
311        }
312        // endregion
313
314        // region Обратный звонок
315        el = target.closest('.js--recall:not([disabled])')
316        if(!!el){
317            e.stopPropagation()
318            e.preventDefault()
319
320            let parent = el.closest('form'),
321                phone = parent.querySelector('input.d--PHONE'),
322                mail = parent.querySelector('input.d--MAIL'),
323                name = parent.querySelector('input.d--NAME')
324
325            if(aHelper().formSubmit(parent)){
326                el.setAttribute('disabled', 'disabled')
327
328                let data = {
329                    data: {
330                        sessid: BX.bitrix_sessid(),
331                        name: name.value,
332                        phone: phone.value,
333                        mail: mail.value,
334                    },
335                }
336
337                data.url = '/api/form/recall/'
338
339                BX.showWait();
340
341                //new Promise(resolve => aHelper().sendRequest(data));
342
343                AT.POPUP.ajax.send(data)
344                    // выполнится, когда промис завершится, независимо от того, успешно или нет
345                    //.finally(() => console.log("Промис завершён"))
346                    // таким образом, индикатор загрузки всегда останавливается, прежде чем мы продолжим
347                    .then(
348                        result => {
349                            BX.closeWait()
350
351                            ym(54907387,'reachGoal','obrs')
352
353                            AT.POPUP.tools.load('thanks')
354                        },
355                        err => {
356                            BX.closeWait()
357                            console.log(err)
358
359                            AT.POPUP.tools.load('error')
360                        }
361                    )
362                    //Ловим ошибки
363                    .catch(err => console.log(err));
364            }
365        }
366        // endregion
367
368        // region Отправить запрос на товар под заказ
369        el = target.closest('.js--pod-zakaz:not([disabled])')
370        if(!!el){
371            e.stopPropagation()
372            e.preventDefault()
373
374            let parent      = el.closest('form'),
375                phone       = parent.querySelector('input.d--PHONE'),
376                mail        = parent.querySelector('input.d--MAIL'),
377                name        = parent.querySelector('input.d--NAME'),
378                id          = parent.querySelector('[name="PRODUCT_ID"]').value,
379                item_name   = parent.querySelector('[name="PRODUCT_NAME"]').value
380
381            if(aHelper().formSubmit(parent)){
382                el.setAttribute('disabled', 'disabled')
383
384                let data = {
385                    data: {
386                        sessid:     BX.bitrix_sessid(),
387                        name:       name.value,
388                        phone:      phone.value,
389                        mail:       mail.value,
390                        id:         id,
391                        item_name:  item_name,
392                    },
393                }
394
395                data.url = '/api/form/podzakaz/'
396
397                BX.showWait();
398
399                AT.POPUP.ajax.send(data)
400                    // выполнится, когда промис завершится, независимо от того, успешно или нет
401                    //.finally(() => console.log("Промис завершён"))
402                    // таким образом, индикатор загрузки всегда останавÐ
402»Ð¸Ð²Ð°ÐµÑ‚ся, прежде чем мы продолжим
403                    .then(
404                        result => {
405                            BX.closeWait()
406
407                            AT.POPUP.tools.load('thanks')
408                        },
409                        err => {
410                            BX.closeWait()
411                            console.log(err)
412
413                            AT.POPUP.tools.load('error')
414                        }
415                    )
416                    //Ловим ошибки
417                    .catch(err => console.log(err));
418            }
419        }
420        // endregion
421
422        // region Нашли дешевле
423        el = target.closest('.js--cheaper:not([disabled])')
424        if(!!el){
425            e.stopPropagation()
426            e.preventDefault()
427
428            let parent          = el.closest('form'),
429                element = document.querySelector('.js--product'),
430                phone           = parent.querySelector('input.d--PHONE'),
431                mail            = parent.querySelector('input.d--MAIL'),
432                price           = parent.querySelector('input.d--PRICE'),
433                link            = parent.querySelector('input.d--LINK'),
434                prouct_name     = element.getAttribute('data-name'),
435                prouct_link= element.getAttribute('data-link'),
436                prouct_id       = element.getAttribute('data-id')
437
438            if(aHelper().formSubmit(parent)){
439                el.setAttribute('disabled', 'disabled')
440
441                let data = {
442                    data: {
443                        sessid:         BX.bitrix_sessid(),
444                        price:          price.value,
445                        phone:          phone.value,
446                        mail:           mail.value,
447                        link:           link.value,
448                        PRODUCT_NAME:   prouct_name,
449                        PRODUCT_LINK:   prouct_link,
450                        PRODUCT_ID:     prouct_id,
451                    },
452                }
453
454                data.url = '/api/form/cheaper/'
455
456                BX.showWait();
457
458                AT.POPUP.ajax.send(data)
459                    // выполнится, когда промис завершится, независимо от того, успешно или нет
460                    //.finally(() => console.log("Промис завершён"))
461                    // таким образом, индикатор загрузки всегда останавливается, прежде чем мы продолжим
462                    .then(
463                        result => {
464                            BX.closeWait()
465
466                            AT.POPUP.tools.load('thanks')
467                        },
468                        err => {
469                            BX.closeWait()
470                            console.log(err)
471
472                            AT.POPUP.tools.load('error')
473                        }
474                    )
475                    //Ловим ошибки
476                    .catch(err => console.log(err));
477            }
478        }
479        // endregion
480
481        // region Подобрать аналог
482        el = target.closest('.js--analog:not([disabled])')
483        if(!!el){
484            e.stopPropagation()
485            e.preventDefault()
486
487            let parent          = el.closest('form')
488
489            if(aHelper().formSubmit(parent)){
490                el.setAttribute('disabled', 'disabled')
491
492                let data = {
493                    data: {
494                        PRODUCT_NAME:   parent.querySelector('[name="PRODUCT_NAME"]').value,
495                        PRODUCT_LINK:   parent.querySelector('[name="PRODUCT_LINK"]').value,
496                        PRODUCT_ID:     parent.querySelector('[name="PRODUCT_ID"]').value,
497                    },
498                }
499
500                let formData = new FormData(parent);
501                formData.append('sessid', BX.bitrix_sessid());
502
503                var dop = aHelper().serialize(formData);
504                data.data = Object.assign(data.data, dop);
505
506                data.url = '/api/form/analog/'
507
508                BX.showWait();
509
510                AT.POPUP.ajax.send(data)
511                    // выполнится, когда промис завершится, независимо от того, успешно или нет
512                    //.finally(() => console.log("Промис завершён"))
513                    // таким образом, индикатор загрузки всегда останавливается, прежде чем мы продолжим
514                    .then(
515                        result => {
516                            BX.closeWait()
517
518                            AT.POPUP.tools.load('thanks')
519                        },
520                        err => {
521                            BX.closeWait()
522                            console.log(err)
523
524                            AT.POPUP.tools.load('error')
525                        }
526                    )
527                    //Ловим ошибки
528                    .catch(err => console.log(err));
529            }
530        }
531        // endregion
532
533        // region Купить в 1 клик
534        el = target.closest('.js--one-click:not([disabled])')
535        if(!!el){
536            e.stopPropagation()
537            e.preventDefault()
538
539            let parent          = el.closest('form'),
540                element = document.querySelector('.js--product'),
541                phone           = parent.querySelector('input.d--PHONE'),
542                name            = parent.querySelector('input.d--NAME'),
543                mail            = parent.querySelector('input.d--MAIL'),
544                prouct_name     = element.getAttribute('data-name'),
545                prouct_link     = element.getAttribute('data-link'),
546                prouct_id       = element.getAttribute('data-id')
547
548            if(aHelper().formSubmit(parent)){
549                el.setAttribute('disabled', 'disabled')
550
551                let data = {
552                    data: {
553                        sessid:         BX.bitrix_sessid(),
554                        phone:          phone.value,
555                        mail:           mail.value,
556                        name:           name.value,
557                        PRODUCT_NAME:   prouct_name,
558                        PRODUCT_LINK:   prouct_link,
559                        PRODUCT_ID:     prouct_id,
560                    },
561                }
562
563                data.url = '/api/form/oneclick/'
564
565                BX.showWait();
566
567                AT.POPUP.ajax.send(data)
568                    // выполнится, когда промис завершится, независимо от того, успешно или нет
569                    //.finally(() => console.log("Промис завершён"))
570                    // таким образом, индикатор загрузки всегда останавливается, прежде чем мы продолжим
571                    .then(
572                        result => {
573                            BX.closeWait()
574
575                            ym(54907387,'reachGoal','b1c')
576
577                            AT.POPUP.tools.load('thanks')
578                        },
579                        err => {
580                            BX.closeWait()
581                            console.log(err)
582
583                            AT.POPUP.tools.load('error')
584                        }
585                    )
586                    //Ловим ошибки
587                    .catch(err => console.log(err));
588            }
589        }
590        // endregion
591
592        // region Подтверждение почты
593        el = target.closest('.js--confirm-email')
594        if(!!el){
595            e.stopPropagation()
596            e.preventDefault()
597
598            let parent     = el.closest('form'),
599                code       = parent.querySelector('[name="CODE"]').value
600
601            if(code.length > 3){
602                el.setAttribute('disabled', 'disabled')
603
604                let data = {
605                    data: {
606                        sessid:         BX.bitrix_sessid(),
607                        code:           code,
608                    },
609                }
610
611                data.url = '/api/user/emailconfirm/'
612
613                BX.showWait();
614
615                AT.POPUP.ajax.send(data)
616                    // выполнится, когда промис завершится, независимо от того, успешно или нет
617                    //.finally(() => console.log("Промис завершён"))
618                    // таким образом, индикатор загрузки всегда останавливается, прежде чем мы продолжим
619                    .then(
620                        result => {
621                            BX.closeWait()
622
623                            if(result.NUMBER === 1)
624                                AT.POPUP.tools.load('email-confirm-thanks')
625                            else
626                                AT.POPUP.tools.load('email-confirm-error')
627                        },
628                        err => {
629                            BX.closeWait()
630                            console.log(err)
631
632                            AT.POPUP.tools.load('email-confirm-error')
633                        }
634                    )
635                    //Ловим ошибки
636                    .catch(err => console.log(err));
637            }
638        }
639        // endregion
640
641        // region Удаление профиля пользователя
642        el = target.closest('.js--confirm-delete')
643        if(!!el){
644            e.stopPropagation()
645            e.preventDefault()
646
647            let data = {
648                data: {
649                    sessid:         BX.bitrix_sessid(),
650                },
651            }
652
653            data.url = '/api/user/delete/'
654
655            BX.showWait();
656
657            AT.POPUP.ajax.send(data)
658                // выполнится, когда промис завершится, независимо от того, успешно или нет
659                //.finally(() => console.log("Промис завершён"))
660                // таким образом, индикатор загрузки всегда останавливается, прежде чем мы продолжим
661                .then(
662                    result => {
663                        BX.closeWait()
664
665                        if(result.NUMBER === '1'){
666                            AT.POPUP.tools.load('user-delete-thanks')
667                        }else{
668                            AT.POPUP.tools.load('user-delete-error')
669                        }
670                    },
671                    err => {
672                        BX.closeWait()
673                        console.log(err)
674
675                        AT.POPUP.tools.load('user-delete-error')
676                    }
677                )
678                //Ловим ошибки
679                .catch(err => console.log(err));
680
681            AT.POPUP.tools.fadeOut()
682            location.reload()
683        }
684        // endregion
685
686        // region Авторизация
687        el = target.closest('.js--auth:not([disabled])')
688        if(!!el){
689            e.stopPropagation()
690            e.preventDefault()
691
692            let form = el.closest('form'),
693                data = {
694                data: {
695                    sessid:         BX.bitrix_sessid(),
696                    code:           form.querySelector('[name="SMS"]').value,
697                    phone:          form.querySelector('[name="PHONE"]').value,
698                    mail:           form.querySelector('[name="MAIL"]').value,
699                    type:           'auth',
700                    ip:             form.querySelector('[name="ip"]').value,
701                    captcha:        form.querySelector('#recaptchaResponse').value,
702                },
703            }
704
705            data.form = form
706
707            BX.showWait();
708
709            el.setAttribute('disabled', 'disabled')
710
711            if(form.classList.contains('--sended')){
712                data.url = '/api/user/doauth/'
713                Authorize(data)
714            }else{
715                data.url = '/api/user/check/'
716                sendAuth(data)
717            }
718        }
719        // endregion
720
721        //Клик по кнопке изменить телефон в форме авторизации
722        el = target.classList.contains('js--auth-phone')
723        if(!!el){
724            e.stopPropagation()
725            e.preventDefault()
726
727            let parent = e.target.closest('.d--form'),
728                form = parent.querySelector('form'),
729                but = parent.querySelector('.d--but'),
730                title = parent.querySelector('.d--title')
731
732            switch (form.getAttribute('data-type')){
733                case 'auth':
734                    title.innerHTML = 'Войти'
735                    break;
736                case 'reg':
737                    title.innerHTML = 'Регистрация'
738                    break;
739            }
740
741            form.classList.remove('--sended')
742
743            form.querySelector('input.d--PHONE').value = ''
744
745            form.querySelector('.d--auth-timer').innerHTML = '<div class="d--auth-timer">Запросить код в SMS через <span>' + BX.message('SMS_WAIT_TIME') + '</span> с.</div>'
746        }
747
748        //Импорт корзины
749        el = target.closest('.js--basket-import')
750        if(!!el){
751            e.stopPropagation()
752            e.preventDefault()
753
754            let form = el.closest('form')
755
756            if(aHelper().formSubmit(form)) {
757
758                let formData = new FormData(form);
759                formData.append('sessid', BX.bitrix_sessid());
760
761                let fileInput = form.querySelector('#image-upload-rev');
762                for (let i = 0; i < fileInput.files.length; i++) {
763                    formData.append('files[]', fileInput.files[i]);
764                    //console.log(fileInput.files[i])
765                    // 'files[]' – это массив файлов, а не единичный элемент.
766                }
767
768                BX.showWait();
769
770                el.setAttribute('disabled', 'disabled')
771
772                //new Promise(resolve => helper().sendRequest(data));
773                new Promise(resolve => fetch('/api/basket/import/', { method: 'POST', body: formData })
774                    /*.then(response => response.text())
775                    .then((response) => {
776                        console.log(response)
777                    })*/
778                    .then(response => response.json())
779                    .then(data => {
780                        if(data.NUMBER === 1){
781                            //AT.POPUP.tools.load('vakancy-thanks')
782                        }else{
783                            //AT.POPUP.tools.load('vakancy-error')
784                        }
785
786                        location.reload()
787                    })
788                    .catch((e) => {
789                        console.log(e)
790                    })
791                );
792            }
793        }
794
795        //Добавление отзыва
796        el = target.closest('.js--review-add:not([disabled])')
797        if(!!el){
798            e.stopPropagation()
799            e.preventDefault()
800
801            let form = el.closest('form')
802
803            if(aHelper().formSubmit(form)) {
804
805                let formData = new FormData(form);
806                formData.append('sessid', BX.bitrix_sessid());
807
808                let fileInput = form.querySelector('#image-upload-rev');
809                for (let i = 0; i < fileInput.files.length; i++) {
810                    formData.append('files[]', fileInput.files[i]);
811                    //console.log(fileInput.files[i])
812                    // 'files[]' – это массив файлов, а не единичный элемент.
813                }
814
815                BX.showWait();
816
817                el.setAttribute('disabled', 'disabled')
818
819                //new Promise(resolve => helper().sendRequest(data));
820                new Promise(resolve => fetch('/api/review/add/', { method: 'POST', body: formData })
821                    /*.then(response => response.text())
822                    .then((response) => {
823                        console.log(response)
824                    })*/
825                    .then(response => response.json())
826                    .then(data => {
827                        if(data.NUMBER === 1){
828                            AT.POPUP.tools.load('review-thanks')
829                        }else{
830                            AT.POPUP.tools.load('review-error')
831                        }
832                    })
833                    .catch((e) => {
834                        console.log(e)
835                    })
836                );
837            }
838        }
839    })
840})

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.