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.