PageSourceSearch

https://izgt.ru/local/templates/izgt/components/bitrix/form.result.new/izgt_tour_form_modal/script.js

js izgt.ru collected 2026-10-06 17:29:11 UTC 7,870 bytes, 200 lines download raw bytes

1function ajaxTourModal(obForm, link) {
2    obForm.setAttribute('novalidate', true);
3
4    function CustomValidation() { }
5
6    CustomValidation.prototype = {
7        // Установим пустой массив сообщений об ошибках
8        invalidities: [],
9
10        // Метод, проверяющий валидность
11        checkValidity: function (input) {
12            let validity = input.validity;
13
14            if (validity.valueMissing) {
15                this.addInvalidity('Необходимо заполнить поле');
16            }
17
18            if (validity.rangeOverflow) {
19                let max = getAttributeValue(input, 'max');
20                this.addInvalidity('Максимальное значение ' + max);
21            }
22
23            if (validity.rangeUnderflow) {
24                let min = getAttributeValue(input, 'min');
25                this.addInvalidity('Минимальное значение ' + min);
26            }
27
28            if (validity.patternMismatch) {
29                this.addInvalidity('Поле заполнено некорректно');
30            }
31
32            if (validity.typeMismatch) {
33                this.addInvalidity('Поле заполнено некорректно');
34            }
35
36            if (validity.tooShort) {
37                this.addInvalidity('Поле заполнено некорректно');
38            }
39        },
40
41        // Добавляем сообщение об ошибке в массив ошибок
42        addInvalidity: function (message) {
43            this.invalidities.push(message);
44        },
45
46        // Получаем общий текст сообщений об ошибках
47        getInvalidities: function () {
48            return this.invalidities.join('. <br>');
49        }
50    };
51
52    BX.bind(obForm, "submit", function (e) {
53        e.preventDefault(e);
54        let stopSubmit = false;
55
56        let inputs = obForm.querySelectorAll('input');
57        let errors = obForm.querySelectorAll('.form__error');
58
59        errors.forEach(error => {
60            error.remove();
61        });
62
63        for (let i = 0; i < inputs.length; i++) {
64            let input = inputs[i];
65            if (input.classList.contains('is-error')) {
66                input.classList.remove('is-error')
67            }
68
69            // Проверим валидность поля
70            if (input.checkValidity() == false) {
71                let inputCustomValidation = new CustomValidation();
72                inputCustomValidation.invalidities = [];
73
74                inputCustomValidation.checkValidity(input);
75                let customValidityMessage = inputCustomValidation.getInvalidities();
76                input.setCustomValidity(customValidityMessage);
77
78                if (customValidityMessage && customValidityMessage != '') {
79                    input.insertAdjacentHTML('afterend', '<p class="form__error">' + customValidityMessage + '</p>')
80                    stopSubmit = true;
81                    if (!input.classList.contains('is-error')) {
82                        input.classList.add('is-error')
83                    }
84                }
85            } else {
86                if (input.classList.contains('is-error')) {
87                    input.classList.remove('is-error')
88                }
89            }
90        }
91
92        if (stopSubmit) {
93            e.preventDefault(e);
94        } else {
95            // Если нет ошибок валидации, получаем токен SmartCaptcha
96            obForm.getElementsByClassName("error-msg")[0].innerHTML = "";
97
98            // Показываем индикатор загрузки
99            const submitButton = obForm.querySelector('button[type="submit"]');
100            const originalButtonText = submitButton ? submitButton.textContent : '';
101            if (submitButton) {
102                submitButton.disabled = true;
103                submitButton.textContent = 'Отправка...';
104            }
105
106            // Получаем токен SmartCaptcha
107            if (typeof obForm.getSmartCaptchaToken === 'function') {
108                obForm.getSmartCaptchaToken()
109                    .then((token) => {
110                        // Токен получен, отправляем форму
111                        sendTourForm(obForm, link, submitButton, originalButtonText);
112                    })
113                    .catch((error) => {
114                        console.error('Ошибка получения токена SmartCaptcha:', error);
115                        obForm.getElementsByClassName("error-msg")[0].innerHTML =
116                            'Ошибка проверки безопасности. Пожалуйста, попробуйте еще раз.';
117
118                        if (submitButton) {
119                            submitButton.disabled = false;
120                            submitButton.textContent = originalButtonText;
121                        }
122                    });
123            } else {
124                // Если SmartCaptcha не инициализирована, отправляем без нее
125                console.warn('SmartCaptcha не инициализирована для формы');
126                sendTourForm(obForm, link, submitButton, originalButtonText);
127            }
128        }
129    });
130}
131
132// Функция отправки формы
133function sendTourForm(obForm, link, submitButton, originalButtonText) {
134    let xhr = new XMLHttpRequest();
135    xhr.open("POST", link);
136
137    xhr.onload = function () {
138        if (xhr.status != 200) {
139            alert("Ошибка " + xhr.status + ": " + xhr.statusText);
140
141            if (submitButton) {
142                submitButton.disabled = false;
143                submitButton.textContent = originalButtonText;
144            }
145        } else {
146            var json = JSON.parse(xhr.responseText);
147
148            if (!json.success) {
149                let errorStr = "";
150                for (let fieldKey in json.errors) {
151                    errorStr += json.errors[fieldKey] + "<br>";
152                }
153
154                obForm.getElementsByClassName("error-msg")[0].innerHTML = errorStr;
155
156                if (submitButton) {
157                    submitButton.disabled = false;
158                    submitButton.textContent = originalButtonText;
159                }
160            } else {
161                BX(obForm).reset();
162
163                // Установка счётчика ЯМ
164                ym(42191254, 'reachGoal', 'send_form');
165
166                let modal = document.querySelector('.modal--active');
167                if (modal) {
168                    modal.classList.add('is-success');
169
170                    let formContainer = modal.querySelector('.modal__wrapper');
171                    if (formContainer) {
172                        formContainer.remove();
173                    }
174
175                    let successWrapper = modal.querySelector('.modal__success');
176                    if (successWrapper) {
177                        successWrapper.classList.add('modal__success--active');
178                    }
179                }
180
181                if (submitButton) {
182                    submitButton.disabled = false;
183                    submitButton.textContent = originalButtonText;
184                }
185            }
186        }
187    };
188
189    xhr.onerror = function () {
190        alert("Запрос не удался");
191
192        if (submitButton) {
193            submitButton.disabled = false;
194            submitButton.textContent = originalButtonText;
195        }
196    };
197
198    // Передаем все данные из формы
199    xhr.send(new FormData(obForm));
200}

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.