Files
erv-ticket-dev/js/common.js

1721 lines
65 KiB
JavaScript
Raw Normal View History

// Функция инициализации автодополнения адресов через DaData
function initAddressSuggestions() {
if (typeof $.fn.suggestions !== 'undefined') {
// Инициализируем автодополнение адресов для поля с классом .js-adres
$('.js-adres').each(function() {
// Проверяем, не инициализировано ли уже
if (!$(this).data('suggestions-initialized')) {
$(this).suggestions({
token: "d2fa8613e186d54c6c62fc321414552353ffdfa8",
type: "ADDRESS",
onSelect: function(suggestion) {
// При выборе адреса заполняем поле
$(this).val(suggestion.value);
}
});
$(this).data('suggestions-initialized', true);
}
});
}
}
$(function() {
$(document).ready(function(){
// Блокируем кнопку "Отправить смс" по умолчанию, пока полис не проверен
$('.js-send-sms').addClass('disabled');
$('.js-send-sms').prop('disabled', true);
// Поля телефона и банка скрыты по умолчанию (через класс d-none в HTML)
// Блокируем поле "ФИО Получателя" по умолчанию (доступно только для несовершеннолетних)
$("input[data-enableby=birthday]").addClass('disabled');
$("input[data-enableby=birthday]").prop('disabled', true);
$("input[data-enableby=birthday]").prop('readonly', true);
$(".js-progress-mask").inputmask("99");
$(".js-inn-mask").inputmask("999999999999");
$(".js-inn-mask2").inputmask("9{10,12}");
$(".js-bank-mask").inputmask({ mask: ["9999 9999 9999 9999", "9999 9999 9999 9999", "9999 9999 9999 9999", "9999 999999 99999"], greedy: false, "placeholder": "*", "clearIncomplete": true });
$(".js-code-mask").inputmask("999999");
$(".js-date-mask").inputmask("99-99-9999",{ "placeholder": "дд-мм-гггг" });
$(".js-doccode-mask").inputmask("99");
$(".js-countrycode-mask").inputmask("999");
// $("#country").countrySelect();
Inputmask.extendDefinitions({
'*': { //masksymbol
"validator": "[0-9\(\)\.\+/ ]"
},
});
$(".js-inndb-mask").inputmask("A9{3,5}-*{6,10}");
$(".js-inndb-mask").keyup(function(){
//if($this)
});
document.querySelector('input').addEventListener('keydown', function (e) {
if (e.which == 9) {
e.preventDefault();
}
});
let month =['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'];
let days = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'];
if($('input[name="birthday"]').length) {
var birthday = datepicker('input[name="birthday"]',
{
customOverlayMonths: month,
customMonths: month,
customDays: days,
maxDate: new Date(),
formatter: (input, date, instance) => {
const value = date.toLocaleDateString()
input.value = value // => '1/1/2099'
},
onSelect: function(dateText, inst) {
let birthday=$('input[name="birthday"]').val();
if(getAge(birthday)<18) {
// Если возраст меньше 18 - разблокируем поле
$("input[data-enableby=birthday]").removeClass('disabled');
$("input[data-disabledby=birthday]").removeClass('disabled');
$("input[data-enableby=birthday]").prop('disabled', false);
$("input[data-enableby=birthday]").prop('readonly', false);
} else {
// Если возраст 18 и больше - блокируем поле
$("input[data-enableby=birthday]").addClass('disabled');
$("input[data-disabledby=birthday]").addClass('disabled');
$("input[data-enableby=birthday]").prop('disabled', true);
$("input[data-enableby=birthday]").prop('readonly', true);
$("input[data-enableby=birthday]").val(''); // Очищаем значение при блокировке
}
}
});
}
// Инициализация datepicker для поля даты рейса отправления
if($('input[name="departure_date"]').length) {
var departure_date = datepicker('input[name="departure_date"]',{
customOverlayMonths: month,
customMonths: month,
customDays: days,
maxDate: new Date(),
formatter: (input, date, instance) => {
const value = date.toLocaleDateString()
input.value = value // => '1/1/2099'
}
});
}
// Инициализация datepicker для поля даты наступления страхового случая
if($('input[name="insurence_date"]').length) {
var insurence_date = datepicker('input[name="insurence_date"]',{
customOverlayMonths: month,
customMonths: month,
customDays: days,
maxDate: new Date(),
formatter: (input, date, instance) => {
const value = date.toLocaleDateString()
input.value = value // => '1/1/2099'
}
});
}
var phone = document.querySelectorAll('.js-phone-mask');
$('.js-phone-mask').inputmask('999 999-99-99');
phone.forEach(el => {
const iti = window.intlTelInput(el, {
initialCountry: 'ru',
onlyCountries : ['ru'],
separateDialCode: true,
customContainer: ".form-item",
autoPlaceholder: 'off', // Отключаем автоматический placeholder
allowDropdown: false, // Убираем выпадающий список
utilsScript: "libs/intl-tel-input-master/build/js/utils.js",
});
// Устанавливаем кастомный placeholder без "8", соответствует маске 999 999-99-99
el.setAttribute('placeholder', '912 345-67-89');
});
// Защита от изменения подтвержденного номера телефона (в т.ч. через автозаполнение)
$('.js-phone-mask').on('input change', function() {
var $this = $(this);
var confirmedPhone = $this.attr('data-confirmed-phone');
if (confirmedPhone && $this.prop('readonly')) {
var currentValue = $this.val();
if (currentValue !== confirmedPhone) {
$this.val(confirmedPhone);
}
}
});
// Обработчик смены страны отключен, так как выпадающий список убран
// $('.js-phone-mask').on('countrychange', e => {
// let $this = $(e.currentTarget),
// placeholder = $this.attr('placeholder'),
// mask = placeholder.replace(/[0-9]/g, 9);
// $this.val('').inputmask(mask);
// let inputCode = $(".code"),
// flag = document.querySelector(".iti__selected-flag"),
// codeTitle = flag.getAttribute("title");
// inputCode.val(codeTitle);
// });
let index=1;
$('.js-btn-next').on("click",function(e){
e.preventDefault();
// Проверяем, не заблокирована ли кнопка из-за невалидного полиса
if($(this).hasClass('disabled') || $(this).prop('disabled')) {
return false;
}
let isvalid=validate_step(index);
if(isvalid) {
index++;
$('.span-progress .current').text(index);
if(index==3) {
$(this).hide();
$('.btn--submit').show();
} else {
$(this).show();
$('.js-btn-prev').show();
}
$('.form-step').removeClass('active');
$('.form-step[data-step='+index+']').addClass('active');
}
});
$('.js-btn-prev').on("click",function(e){
e.preventDefault();
index--;
if(index==1) {$(this).hide();} else $(this).show();
if(index<1) index=1;
if(index<4) {
$('.btn--submit').hide();
$('.js-btn-next').show();
}
$('.span-progress .current').text(index);
$('.form-step').removeClass('active');
$('.form-step[data-step='+index+']').addClass('active');
});
$('select[name=claim]').on("change",function(e){
if($(this).val()==0) {
$(this).closest('.form-step').find('input[type=text]').addClass('disabled');
$(this).closest('.form-step').find('input[type=file]').addClass('disabled');
$(this).closest('.form-step').find('input[type=file]').parent().addClass('disabled');
} else {
$(this).closest('.form-step').find('input[type=text]').removeClass('disabled');
$(this).closest('.form-step').find('input[type=file]').removeClass('disabled');
$(this).closest('.form-step').find('input[type=file]').parent().removeClass('disabled');
}
});
$('select[name=countryevent]').on("change",function(e){
$('.countryevent').val($(this).find(":selected").text());
});
// Обработка изменения типа события
$('select[name="event_type"]').on('change', function() {
const selectedValue = $(this).val();
// Скрываем все дополнительные поля
$('.connection-fields, .connection-date-fields, .cancel-flight-docs').hide();
// Меняем лейблы в зависимости от выбора
if (selectedValue === 'miss_connection') {
$('#transport_number_label').text('Укажите номер рейса прибытия');
$('#insurence_date_label').text('Дата рейса прибытия');
$('.connection-fields, .connection-date-fields').show();
} else if (selectedValue === 'cancel_flight') {
$('#transport_number_label').text('Номер рейса/поезда/парома');
$('#insurence_date_label').text('Дата наступления страхового случая');
$('.cancel-flight-docs').show();
} else {
$('#transport_number_label').text('Номер рейса/поезда/парома');
$('#insurence_date_label').text('Дата наступления страхового случая');
}
});
function validate_step(step_index){
let inputs=$('.form-step.active').find('input[type="text"], input[type="file"],input[type="email"], textarea.form-input, input[type="checkbox"]');
let all_filled=false;
let res_array=[];
inputs.each(function(e){
let field_fill=false;
let $this = $(this);
// Пропускаем поля, которые помечены как не требующие валидации
if($this.hasClass('notvalidate')) {
field_fill=true; // Считаем невалидируемые поля валидными
res_array.push(field_fill);
return;
}
// Пропускаем поля, которые заблокированы (disabled или readonly)
if($this.prop('disabled') || $this.prop('readonly') || $this.hasClass('disabled')) {
field_fill=true; // Считаем заблокированные поля валидными
res_array.push(field_fill); // Добавляем в массив результатов
return; // Пропускаем дальнейшую проверку
}
// Пропускаем поля, которые находятся в скрытых блоках (d-none или display: none)
if($this.closest('.d-none').length > 0) {
field_fill=true; // Считаем скрытые поля валидными
res_array.push(field_fill);
return;
}
// Проверяем, скрыт ли родительский блок через inline стиль display: none
let $parentContainer = $this.closest('.form-item');
if($parentContainer.length > 0 && $parentContainer.is(':hidden')) {
field_fill=true; // Считаем скрытые поля валидными
res_array.push(field_fill);
return;
}
if(($this.val()=='' && !$this.hasClass('disabled') && !$this.hasClass('notvalidate') && !$this.hasClass('error') )) {
$this.closest('.form-item').find('.form-item__warning').text('Пожалуйста, заполните все обязательные поля');
field_fill=false;
} else {
$this.closest('.form-item').find('.form-item__warning').text('');
if($this.attr('type')=='email'){
if(validateEmail($this.val())) {
field_fill=true;
} else {
field_fill=false;
$this.closest('.form-item').find('.form-item__warning').text($this.data('warmes'));
}
} else if($this.attr('type')=='file') {
// Специальная валидация для файлов
var fileInput = this;
var filesCount = fileInput.files ? fileInput.files.length : 0;
// Проверяем также через fileList, если файлы уже обработаны
var fileListItems = $this.closest('.form-item').find('.fileList li').length;
// Если поле находится в скрытом блоке, но есть другое видимое поле с таким же name - пропускаем
var fieldName = $this.attr('name');
var isHidden = $this.closest('.d-none').length > 0;
if(isHidden && fieldName) {
// Проверяем, есть ли видимое поле с таким же name
var visibleField = $('.form-step.active').find('input[name="' + fieldName + '"]').not($this).filter(function() {
return $(this).closest('.d-none').length === 0;
});
if(visibleField.length > 0) {
// Есть видимое поле с таким же name - пропускаем скрытое
field_fill=true;
res_array.push(field_fill);
return;
}
}
// Для видимых полей проверяем наличие файлов
if(!isHidden) {
if(filesCount > 0 || fileListItems > 0) {
field_fill=true;
} else {
field_fill=false;
$this.closest('.form-item').find('.form-item__warning').text('Пожалуйста, загрузите файлы');
}
} else {
// Скрытое поле без видимого дубликата - считаем валидным
field_fill=true;
}
} else {
// Специальная валидация для поля банка
if($this.hasClass('js-bank-autocomplete')) {
var bankId = $this.closest('.form-item').find('input[name="bank_id"]').val();
if(bankId && bankId !== '') {
field_fill=true;
} else {
field_fill=false;
$this.closest('.form-item').find('.form-item__warning').text('Пожалуйста, выберите банк из списка');
}
} else {
field_fill=true;
}
}
if($this.attr('type')=='checkbox'){
if($this.is(':checked')){
field_fill=true;
$this.parent().parent().find('.form-item__warning').text();
} else {
field_fill=false;
$this.parent().parent().find('.form-item__warning').text('Пожалуйста, заполните все обязательные поля');
}
if(($this.parent().hasClass('js-enable-inputs'))){
field_fill=true;
}
}
}
res_array.push(field_fill);
// Отладочный вывод для незаполненных полей отключен
});
// Проверка валидности полиса теперь выполняется перед отправкой SMS, а не здесь
if((step_index==3) && $('.form-step[data-step='+step_index+']').find('input[type="checkbox"]:checked').length<1) {
$('.form__warning').show();
$('.form__warning').text('Необходимо согласие с политикой обработки персональных данных');
return false;
} else {
$('.form__warning').text('Пожалуйста, заполните все обязательные поля');
}
if(!res_array.includes(false)){
$('.form__warning').hide();
return true;
} else {
$('.form__warning').show();
return false;
}
}
const validateEmail = (email) => {
return email.match(
/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
);
};
$('.js-enable-inputs input[type=checkbox]').on("change",function(e){
e.preventDefault();
$(this).closest('.form-item').find('input[type=file]').toggleClass('disabled');
$(this).closest('.form-item').find('input[type=file]+label').toggleClass('disabled');
});
// start sms
// Глобальная переменная для хранения токена верификации
var sms_verify_token = null;
function send_sms(){
var $phoneInput = $('input[name="phonenumber"]');
var phone = $phoneInput.val();
// Получаем номер через intlTelInput API (если доступен)
if ($phoneInput.length > 0 && window.intlTelInput) {
var iti = window.intlTelInputGlobals.getInstance($phoneInput[0]);
if (iti) {
// Получаем полный номер с кодом страны (например, +79991234567)
var fullNumber = iti.getNumber();
if (fullNumber) {
phone = fullNumber;
} else {
// Если getNumber не работает, очищаем от маски вручную
phone = phone.replace(/[() -]/g, '');
// Добавляем +7 если номер начинается с 8 или 9
if (phone.match(/^[89]/)) {
phone = '+7' + phone.replace(/^[89]/, '');
} else if (!phone.match(/^\+/)) {
phone = '+7' + phone;
}
}
} else {
// Если intlTelInput не инициализирован, очищаем от маски
phone = phone.replace(/[() -]/g, '');
if (phone.match(/^[89]/)) {
phone = '+7' + phone.replace(/^[89]/, '');
} else if (!phone.match(/^\+/)) {
phone = '+7' + phone;
}
}
}
console.log('Отправка SMS на номер:', phone);
if (!phone) {
$('.form-item__warning').text('Пожалуйста, укажите номер телефона');
return false;
}
// Показываем загрузку
$('.js-send-sms').prop('disabled', true).text('Отправка...');
$.ajax({
url: 'sms-verify.php?action=send',
method: 'post',
data: {
phonenumber: phone
},
dataType: 'json',
success: function(data) {
if (data.success) {
$('.js-code-warning').text('Код отправлен на ваш номер телефона');
$('.js-send-sms').prop('disabled', false).text('Отправить смс');
$.fancybox.open({
src: '#confirm_sms',
type: 'inline'
});
} else {
$('.form-item__warning').text(data.message || 'Ошибка отправки SMS');
$('.js-send-sms').prop('disabled', false).text('Отправить смс');
}
},
error: function (jqXHR, exception) {
var errorMsg = 'Ошибка отправки SMS';
if (jqXHR.responseJSON && jqXHR.responseJSON.message) {
errorMsg = jqXHR.responseJSON.message;
}
$('.form-item__warning').text(errorMsg);
$('.js-send-sms').prop('disabled', false).text('Отправить смс');
}
});
return null; // Код больше не генерируется на клиенте
}
function countDown(elm, duration, fn){
var countDownDate = new Date().getTime() + (1000 * duration);
var x = setInterval(function() {
var now = new Date().getTime();
var distance = countDownDate - now;
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
elm.innerHTML = minutes + "м " + seconds + "с ";
if (distance < 0) {
clearInterval(x);
fn();
elm.innerHTML = "";
$('.sms-countdown').hide();
}
}, 1000);
}
$('.js-send-sms').on('click', function(e) {
e.preventDefault();
// Проверка валидности полиса перед отправкой SMS
var indatabase = $('.js-indatabase').val();
// Проверяем, был ли полис загружен вручную (через policy-upload-section)
var polisInput = $('#polis_upload')[0];
var polisUploaded = polisInput && polisInput.files && polisInput.files.length > 0;
// Если полис невалидный И не загружен вручную - блокируем отправку
if((indatabase == '0' || indatabase == '' || indatabase == undefined) && !polisUploaded) {
$('.form__warning').show();
$('.form__warning').text('Пожалуйста, проверьте полис. Ваш полис не покрывает данный вид обращения.');
return false;
}
// Валидация поля банка перед отправкой SMS
var bankInput = $('.js-bank-autocomplete');
var bankId = $('input[name="bank_id"]').val();
if (!bankInput.val() || !bankId || bankId === '') {
bankInput.closest('.form-item').find('.form-item__warning').text('Пожалуйста, выберите банк из списка');
bankInput.focus();
return false;
} else {
bankInput.closest('.form-item').find('.form-item__warning').text('');
}
// Отправляем SMS через новый безопасный API
send_sms();
$('.sms-countdown').show();
$('.modal .js-accept-sms').show();
$('.modal .js-send-sms').hide();
$('.modal .form-item__warning').text("");
countDown(document.querySelector('.sms-countdown .time'), 30, function(){
$('.modal .js-send-sms').show();
$('.sms-checking button.js-accept-sms').hide();
$('.js-code-warning').hide();
})
});
// Обработчик для повторной отправки SMS из модального окна
$(document).on('click', '.modal .js-send-sms', function(e) {
e.preventDefault();
var $phoneInput = $('input[name="phonenumber"]');
var phone = $phoneInput.val();
// Получаем номер через intlTelInput API (если доступен) - ТОЧНО ТАК ЖЕ как при первой отправке
if ($phoneInput.length > 0 && window.intlTelInput) {
var iti = window.intlTelInputGlobals.getInstance($phoneInput[0]);
if (iti) {
var fullNumber = iti.getNumber();
if (fullNumber) {
phone = fullNumber;
} else {
phone = phone.replace(/[() -]/g, '');
if (phone.match(/^[89]/)) {
phone = '+7' + phone.replace(/^[89]/, '');
} else if (!phone.match(/^\+/)) {
phone = '+7' + phone;
}
}
} else {
phone = phone.replace(/[() -]/g, '');
if (phone.match(/^[89]/)) {
phone = '+7' + phone.replace(/^[89]/, '');
} else if (!phone.match(/^\+/)) {
phone = '+7' + phone;
}
}
}
console.log('Повторная отправка SMS на номер:', phone);
if (!phone) {
$('.modal .form-item__warning').text('Номер телефона не указан');
return false;
}
// Отправляем SMS
$('.modal .js-send-sms').prop('disabled', true).text('Отправка...');
$('.modal .form-item__warning').text('');
$.ajax({
url: 'sms-verify.php?action=send',
method: 'post',
data: {
phonenumber: phone
},
dataType: 'json',
success: function(data) {
if (data.success) {
$('.modal .form-item__warning').text('').removeClass('form-item__warning--error');
$('.js-code-warning').text('Код отправлен на ваш номер телефона').show();
$('.modal .js-send-sms').hide();
$('.modal .js-accept-sms').show();
$('.sms-countdown').show();
// Запускаем таймер снова
countDown(document.querySelector('.sms-countdown .time'), 30, function(){
$('.modal .js-send-sms').show();
$('.sms-checking button.js-accept-sms').hide();
$('.js-code-warning').hide();
});
} else {
$('.modal .form-item__warning').text(data.message || 'Ошибка отправки SMS');
$('.modal .js-send-sms').prop('disabled', false).text('Отправить повторно');
}
},
error: function (jqXHR, exception) {
var errorMsg = 'Ошибка отправки SMS';
if (jqXHR.responseJSON && jqXHR.responseJSON.message) {
errorMsg = jqXHR.responseJSON.message;
}
$('.modal .form-item__warning').text(errorMsg);
$('.modal .js-send-sms').prop('disabled', false).text('Отправить повторно');
}
});
});
$('.sms-checking .js-accept-sms').on('click', function(e) {
e.preventDefault();
var code = $('.sms-checking input[type="text"]').val();
var $phoneInput = $('input[name="phonenumber"]');
var phone = $phoneInput.val();
// Получаем номер через intlTelInput API (если доступен) - ТОЧНО ТАК ЖЕ как при отправке
if ($phoneInput.length > 0 && window.intlTelInput) {
var iti = window.intlTelInputGlobals.getInstance($phoneInput[0]);
if (iti) {
var fullNumber = iti.getNumber();
if (fullNumber) {
phone = fullNumber;
} else {
phone = phone.replace(/[() -]/g, '');
if (phone.match(/^[89]/)) {
phone = '+7' + phone.replace(/^[89]/, '');
} else if (!phone.match(/^\+/)) {
phone = '+7' + phone;
}
}
} else {
phone = phone.replace(/[() -]/g, '');
if (phone.match(/^[89]/)) {
phone = '+7' + phone.replace(/^[89]/, '');
} else if (!phone.match(/^\+/)) {
phone = '+7' + phone;
}
}
}
console.log('Проверка кода для номера:', phone);
if (!code || !phone) {
$('.modal .form-item__warning').text("Введите код подтверждения");
return false;
}
// Показываем загрузку
$('.js-accept-sms').prop('disabled', true).text('Проверка...');
$('.modal .form-item__warning').text('');
// Проверяем код на сервере
$.ajax({
url: 'sms-verify.php?action=verify',
method: 'post',
data: {
phonenumber: phone,
code: code
},
dataType: 'json',
success: function(data) {
if (data.success) {
// Сохраняем токен верификации
sms_verify_token = data.token;
$('.sms-success').removeClass('d-none');
// Проверяем, был ли полис уже проверен
var indatabase = $('.js-indatabase').val();
if(indatabase == '1') {
// Если полис валидный, сразу показываем форму для заполнения
$('.db-success').removeClass('d-none');
$('.form-step[data-step=1]').removeClass('disabled');
// Инициализируем автодополнение адресов после показа формы
setTimeout(function() {
initAddressSuggestions();
}, 500);
} else {
// Если полис невалидный, но был загружен через policy-upload-section, показываем форму
var polisInput = $('#polis_upload')[0];
var polisUploaded = polisInput && polisInput.files && polisInput.files.length > 0;
if(polisUploaded) {
$('.db-success').removeClass('d-none');
$('.form-step[data-step=1]').removeClass('disabled');
// Инициализируем автодополнение адресов
setTimeout(function() {
initAddressSuggestions();
}, 500);
}
}
$('.modal .js-send-sms').show();
$('.sms-check .form-item > .js-send-sms').hide();
$.fancybox.close();
$.fancybox.close();
$('.sms-check').addClass("disabled");
$('.sms-check .form-item__warning')
.addClass('form-item__warning--success')
.text("Вы успешно подтвердили номер");
// Блокируем поле телефона после подтверждения
var $phoneField = $('.js-phone-mask');
var confirmedPhone = $phoneField.val();
$phoneField.attr('data-confirmed-phone', confirmedPhone)
.attr('data-verify-token', sms_verify_token)
.prop('readonly', true)
.attr('autocomplete', 'off');
$('.js-accept-sms').prop('disabled', false).text('Подтвердить');
} else {
$('.modal .form-item__warning').text(data.message || "Неверный код");
$('.sms-success').addClass('d-none');
$('.js-accept-sms').prop('disabled', false).text('Подтвердить');
}
},
error: function (jqXHR, exception) {
var errorMsg = "Ошибка проверки кода";
if (jqXHR.responseJSON && jqXHR.responseJSON.message) {
errorMsg = jqXHR.responseJSON.message;
}
$('.modal .form-item__warning').text(errorMsg);
$('.sms-success').addClass('d-none');
$('.js-accept-sms').prop('disabled', false).text('Подтвердить');
}
});
});
$('.form.active form').submit(function(e){
if(!validate_step(index)){ e.preventDefault(); } else {
e.preventDefault();
$('button[type="submit"]').attr("disabled", true);
if(1) {
$('.js-code-warning').text('');
$('.js-code-warning').hide();
$('.js-send-sms').hide();
$.fancybox.open({
src: '#confirm_sms',
type: 'inline'
});
$('.loader-wrap').removeClass('d-none');
$('button[type="submit"]').attr("disabled", false);
$('button[type="submit"]').text("Данные отправляются...");
var formData = new FormData();
let fileIndex = 0; // Счетчик для правильной индексации файлов
// Отправляем файлы напрямую как бинарные данные (без предварительной загрузки через fileupload_v2.php)
jQuery.each(jQuery('input[type=file].js-attach').not('.disabled'), function(i, file) {
if(!$(this).hasClass('disabled')) {
// Используем field-type или name для группировки файлов
let field_name=jQuery(this).data('field-type') || jQuery(this).attr('name');
let docname=jQuery(this).data('docname');
// Отправляем файлы напрямую как бинарные данные в submit.php
jQuery.each(jQuery(this)[0].files, function(i, file) {
formData.append(field_name+'-'+i, file);
});
// УБРАНО: старая система загрузки через fileupload_v2.php
// Теперь файлы отправляются напрямую в submit.php как бинарные данные
// n8n будет обрабатывать файлы сам
}
});
jQuery.each(jQuery('.js-append'), function(i, file) {
let ws_name=jQuery(this).data('ws_name');
let ws_type=jQuery(this).data('ws_type');
let val="";
if(jQuery(this).attr('type') == 'checkbox'){
if(jQuery(this).is(':checked')){
val=jQuery(this).val();
}
} else {
val=jQuery(this).val();
}
let array={
ws_name : ws_name,
ws_type: ws_type,
field_val : val
};
formData.append('appends[]',JSON.stringify(array));
});
formData.append('lastname',jQuery('[name="lastname"]').val());
formData.append('getservice',jQuery('[name="getservice"]').val()); //Если есть агент посредник
let sub_dir=jQuery('input[name=sub_dir]').val();
formData.append('sub_dir',sub_dir);
// Отладочный вывод отключен
// for (var pair of formData.entries()) {
// console.log(pair[0]+ ', ' + pair[1]);
// }
$.ajax({
url: 'submit.php',
method: 'post',
cache: false,
contentType: false,
processData: false,
data: formData,
dataType: 'json',
success: function(data) {
// Отладочный вывод отключен
// console.log(data);
$('.loader-wrap').addClass('d-none');
$.fancybox.close();
$.fancybox.open({
src: '#success_modal',
type: 'inline'
});
setTimeout(function(){
$.fancybox.close();
},30)
setTimeout(function(){
window.location.href = "https://lexpriority.ru/ok";
},30)
$('button[type="submit"]').text("Отправить");
},
error: function (jqXHR, exception) {
// Отладочный вывод отключен
// console.log(jqXHR);
if (jqXHR.status === 0) {
alert('Not connect. Verify Network.');
} else if (jqXHR.status == 404) {
alert('Requested page not found (404).');
} else if (jqXHR.status == 500) {
alert('Internal Server Error (500).');
} else if (exception === 'parsererror') {
} else if (exception === 'timeout') {
alert('Time out error.');
} else if (exception === 'abort') {
alert('Ajax request aborted.');
} else {
alert('Uncaught Error. ' + jqXHR.responseText);
}
}
});
return false;
} else {
$('.js-code-warning').text('Неверный код');
return false;
}
}
});
});
$('input[name=place],input[name=place_adres],input[name=place_inn]').keyup(function(e){
var sourceInput = $(this);
var query = $(this).val();
var settings = {
"url": "https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/party",
"method": "POST",
"timeout": 0,
"headers": {
"Authorization": "Token d2fa8613e186d54c6c62fc321414552353ffdfa8",
"Content-Type": "application/json",
"Cookie": "__ddg1_=BoLd7l5yOCjL9tr6qUth"
},
"data": JSON.stringify({
"query": query
}),
};
$('.autocomplete__item').remove();
var address_array = [];
$.ajax(settings).done(function (response) {
for(let i=0; i<response.suggestions.length; i++) {
$('<div class="autocomplete__item" data-address="'+response.suggestions[i].data.address.value+'" data-inn="'+response.suggestions[i].data.inn+'">'+response.suggestions[i].value+'</div>').appendTo(sourceInput.closest('.form-item').find('.form-item__dropdown'));
}
});
});
$(document).on('click', '.autocomplete__item', function() {
let currentAutocompleteItem=$(this);
let prefix = $(this).closest('.autocomplete').data('groupename');
$('.'+prefix+'_name').val(currentAutocompleteItem.text());
$('.'+prefix+'_adres').val(currentAutocompleteItem.attr('data-address'));
$('.'+prefix+'_inn').val(currentAutocompleteItem.attr('data-inn'));
currentAutocompleteItem.closest('.form-item').find('.form-item__dropdown').empty();
});
// Автоподстановка банков из API
let banksList = []; // Кэш списка банков
let banksLoading = false; // Флаг загрузки
// Загрузка списка банков через прокси на сервере (обход CORS)
function loadBanksList() {
if (banksLoading) return; // Предотвращаем множественные запросы
banksLoading = true;
$.ajax({
url: 'load_banks.php', // PHP скрипт на сервере для обхода CORS
method: 'GET',
dataType: 'json',
timeout: 15000, // 15 секунд таймаут
success: function(data) {
banksLoading = false;
if (Array.isArray(data)) {
banksList = data;
// Отладочный вывод отключен
// console.log('Загружено банков:', banksList.length);
// Убираем предупреждение об ошибке, если оно было
$('.js-bank-autocomplete').closest('.form-item').find('.form-item__warning').text('');
} else if (data && data.error) {
// Отладочный вывод отключен
// console.error('Ошибка от сервера:', data.error);
showBanksLoadError('Ошибка сервера: ' + data.error);
} else {
// Отладочный вывод отключен
// console.error('Неверный формат данных:', data);
showBanksLoadError('Неверный формат данных от сервера');
}
},
error: function(jqXHR, exception) {
banksLoading = false;
// Отладочный вывод отключен
// console.error('Ошибка загрузки списка банков:', exception, jqXHR);
var errorMsg = 'Не удалось загрузить список банков';
if (jqXHR.status === 0) {
errorMsg += ' (нет соединения)';
} else if (jqXHR.status === 404) {
errorMsg += ' (файл прокси не найден)';
} else if (jqXHR.status === 500) {
errorMsg += ' (ошибка сервера)';
} else if (exception === 'timeout') {
errorMsg += ' (превышено время ожидания)';
}
showBanksLoadError(errorMsg);
}
});
}
// Показать ошибку загрузки банков
function showBanksLoadError(message) {
var bankInput = $('.js-bank-autocomplete');
if (bankInput.length) {
var warningText = message || 'Не удалось загрузить список банков. Пожалуйста, обновите страницу или введите название банка вручную.';
bankInput.closest('.form-item').find('.form-item__warning')
.text(warningText)
.css('color', '#dc3545');
}
}
// Загружаем банки при загрузке страницы
$(document).ready(function() {
// Небольшая задержка, чтобы убедиться, что DOM готов
setTimeout(function() {
loadBanksList();
}, 100);
});
// Популярные банки (показываются первыми)
var popularBanks = ['Сбербанк', 'ВТБ', 'Альфа-Банк', 'Тинькофф', 'Райффайзен Банк', 'Газпромбанк', 'Россельхозбанк', 'ПСБ', 'МКБ', 'ЮМани'];
// Функция для сортировки банков (популярные вверху)
function sortBanks(banks) {
return banks.sort(function(a, b) {
var aIndex = popularBanks.findIndex(function(name) {
return a.bankName.indexOf(name) !== -1;
});
var bIndex = popularBanks.findIndex(function(name) {
return b.bankName.indexOf(name) !== -1;
});
if (aIndex === -1 && bIndex === -1) return 0;
if (aIndex === -1) return 1;
if (bIndex === -1) return -1;
return aIndex - bIndex;
});
}
// Автоподстановка банков
$('.js-bank-autocomplete').on('input keyup', function(e) {
var sourceInput = $(this);
var query = $(this).val().toLowerCase().trim();
var dropdown = sourceInput.closest('.form-item').find('.form-item__dropdown');
// Очищаем предыдущие результаты
dropdown.empty();
// Если запрос пустой, показываем больше банков (30) с популярными вверху
if (query.length === 0) {
var sortedBanks = sortBanks(banksList.slice());
showBanksDropdown(sortedBanks.slice(0, 30), dropdown, sourceInput, banksList.length, true);
return;
}
// Фильтруем банки по запросу
var filteredBanks = banksList.filter(function(bank) {
return bank.bankName.toLowerCase().indexOf(query) !== -1;
});
// Показываем результаты (максимум 50 при поиске)
showBanksDropdown(filteredBanks.slice(0, 50), dropdown, sourceInput, filteredBanks.length, false);
});
// Функция для отображения выпадающего списка банков
function showBanksDropdown(banks, dropdown, sourceInput, totalCount, showHint) {
dropdown.empty();
if (banks.length === 0) {
dropdown.append('<div class="autocomplete__item" style="padding: 10px; color: #999;">Банки не найдены</div>');
return;
}
banks.forEach(function(bank) {
var item = $('<div class="autocomplete__item" data-bank-id="' + bank.bankId + '" data-bank-name="' + bank.bankName + '" style="cursor: pointer;">' + bank.bankName + '</div>');
dropdown.append(item);
});
// Добавляем подсказку внизу списка
if (showHint && totalCount > banks.length) {
var hint = $('<div class="autocomplete__hint" style="padding: 12px 15px; background: #f8f9fa; border-top: 1px solid #e9ecef; font-size: 12px; color: #6c757d; text-align: center; border-radius: 0 0 4px 4px;">' +
'<strong>Показано ' + banks.length + ' из ' + totalCount + ' банков</strong><br>' +
'Начните вводить название банка для поиска по всем ' + totalCount + ' банкам'
+ '</div>');
dropdown.append(hint);
} else if (!showHint && totalCount > banks.length) {
var hint = $('<div class="autocomplete__hint" style="padding: 10px 15px; background: #f8f9fa; border-top: 1px solid #e9ecef; font-size: 12px; color: #6c757d; text-align: center;">' +
'Найдено: ' + totalCount + ' банков. Показано ' + banks.length + '. Уточните запрос для более точного поиска.'
+ '</div>');
dropdown.append(hint);
}
}
// Обработчик выбора банка - используем mousedown для надежности
$(document).on('mousedown', '.form-item__dropdown .autocomplete__item', function(e) {
e.preventDefault();
e.stopPropagation();
var selectedItem = $(this);
var bankId = selectedItem.attr('data-bank-id');
var bankName = selectedItem.attr('data-bank-name');
var formItem = selectedItem.closest('.form-item');
// Проверяем, что это не подсказка
if (selectedItem.hasClass('autocomplete__hint')) {
return false;
}
// Заполняем поля
var bankInput = formItem.find('.js-bank-autocomplete');
var bankIdInput = formItem.find('input[name="bank_id"]');
bankInput.val(bankName);
bankIdInput.val(bankId);
// Очищаем выпадающий список
formItem.find('.form-item__dropdown').empty();
// Убираем предупреждение
formItem.find('.form-item__warning').text('');
// Убираем фокус с input
bankInput.blur();
// Отладочный вывод отключен
// console.log('Банк выбран:', bankName, 'ID:', bankId);
return false;
});
// Дублируем обработчик на click для совместимости
$(document).on('click', '.form-item__dropdown .autocomplete__item', function(e) {
e.preventDefault();
e.stopPropagation();
var selectedItem = $(this);
// Проверяем, что это не подсказка
if (selectedItem.hasClass('autocomplete__hint')) {
return false;
}
// Если mousedown не сработал, обрабатываем здесь
var bankId = selectedItem.attr('data-bank-id');
var bankName = selectedItem.attr('data-bank-name');
var formItem = selectedItem.closest('.form-item');
if (bankId && bankName) {
formItem.find('.js-bank-autocomplete').val(bankName);
formItem.find('input[name="bank_id"]').val(bankId);
formItem.find('.form-item__dropdown').empty();
formItem.find('.form-item__warning').text('');
}
return false;
});
// При фокусе показываем список банков
$('.js-bank-autocomplete').on('focus', function() {
var sourceInput = $(this);
var dropdown = sourceInput.closest('.form-item').find('.form-item__dropdown');
var query = $(this).val().toLowerCase().trim();
if (banksList.length === 0) {
// Если банки еще не загружены, пробуем загрузить
loadBanksList();
return;
}
if (query.length === 0) {
var sortedBanks = sortBanks(banksList.slice());
showBanksDropdown(sortedBanks.slice(0, 30), dropdown, sourceInput, banksList.length, true);
} else {
// Триггерим событие input для фильтрации
$(this).trigger('input');
}
});
// Скрываем выпадающий список при потере фокуса (с задержкой для клика)
$('.js-bank-autocomplete').on('blur', function(e) {
var sourceInput = $(this);
var dropdown = sourceInput.closest('.form-item').find('.form-item__dropdown');
// Увеличиваем задержку, чтобы клик успел обработаться
setTimeout(function() {
// Проверяем, не кликнули ли мы на элемент списка или внутри dropdown
var activeElement = document.activeElement;
var relatedTarget = e.relatedTarget;
// Если фокус перешел на элемент из dropdown, не скрываем
if (relatedTarget && $(relatedTarget).closest('.form-item__dropdown').length) {
return;
}
if (!$(activeElement).hasClass('autocomplete__item') &&
!$(activeElement).closest('.form-item__dropdown').length) {
dropdown.empty();
}
}, 200);
});
// Предотвращаем blur при клике на dropdown
$(document).on('mousedown', '.form-item__dropdown', function(e) {
// Останавливаем всплытие, чтобы blur не сработал на input
e.stopPropagation();
});
// Инициализация автодополнения адресов при загрузке страницы
setTimeout(function() {
initAddressSuggestions();
}, 1000);
// $('input[name=db_birthday],input[name=db_inn]').keyup(function(e){
$(document).on('click', '.js-check-in', function(e) {
e.preventDefault();
let birthday=$('input[name=birthday]').val();
let police_number=$('input[name=police_number]').val();
if(police_number.slice(0,1)=="Е"){
police_number=police_number.replace(/Е/g, 'E');
}
if(police_number.slice(0,1)=="А"){
police_number=police_number.replace(/А/g, 'A');
}
let dbdata={
"action" : "user_verify",
'birthday' : birthday.replace(/-/g, '.'),
'inn' : police_number
}
// Показываем загрузку
$('.js-check-in').prop('disabled', true).text('Проверка...');
$('.js-result').html('').removeClass('danger form-item__warning--success');
$.ajax({
url: 'database.php',
method: 'post',
data: dbdata,
dataType: 'json',
success: function(data) {
$('.js-check-in').prop('disabled', false).text('Проверить наличие полиса');
// Если data уже объект, не парсим
let res = typeof data === 'string' ? JSON.parse(data) : data;
if(res.success=="true"){
// Полис валидный - показываем успешное сообщение
$('.js-result').html(res.message);
$('.js-result').removeClass("danger");
$('.js-result').addClass("form-item__warning--success");
$('input[name=insured_from]').val(res.result.insured_from.replace(/\./g, '-'));
$('input[name=insured_to]').val(res.result.insured_to.replace(/\./g, '-'));
$('.js-indatabase').val('1');
$('.policy-upload-section').addClass('d-none');
// Показываем поля телефона и банка после успешной проверки полиса
$('.policy-validated-fields').removeClass('d-none');
// Разблокируем кнопку "Отправить смс" если полис валидный
$('.js-send-sms').removeClass('disabled');
$('.js-send-sms').prop('disabled', false);
$('.form__warning').hide();
// Если SMS уже подтверждено, сразу показываем форму для заполнения
if($('.sms-success').is(':visible') || !$('.sms-success').hasClass('d-none')) {
$('.db-success').removeClass('d-none');
$('.form-step[data-step=1]').removeClass('disabled');
}
// Инициализируем автодополнение адресов после проверки полиса
setTimeout(function() {
initAddressSuggestions();
}, 500);
} else {
// Полис не найден - показываем ТОЛЬКО поле для загрузки скана полиса
$('.js-indatabase').val('0');
// Убираем сообщение об ошибке из .js-result
$('.js-result').html('');
$('.js-result').removeClass("danger form-item__warning--success");
// НЕ показываем форму (.sms-success), только блок загрузки полиса
$('.sms-success').addClass('d-none');
$('.db-success').addClass('d-none');
// Показываем ТОЛЬКО блок для загрузки полиса
$('.policy-upload-section').removeClass('d-none');
$('.policy-upload-section').find('input[type=file]').removeClass("notvalidate");
$('.policy-upload-section').find('input[type=file]').removeClass("disabled");
// Показываем уведомление о необходимости загрузить полис
$('.policy-upload-section').find('.form-item__warning')
.text('Загрузите скан полиса для продолжения')
.css('color', '#856404')
.show();
// Скрываем поля телефона и банка
$('.policy-validated-fields').addClass('d-none');
// Блокируем кнопку "Отправить смс"
$('.js-send-sms').addClass('disabled');
$('.js-send-sms').prop('disabled', true);
$('.form__warning').hide();
}
return false;
},
error: function (jqXHR, exception) {
$('.js-check-in').prop('disabled', false).text('Проверить наличие полиса');
var errorMsg = 'Ошибка при проверке полиса';
if (jqXHR.responseText) {
try {
var errorData = JSON.parse(jqXHR.responseText);
if (errorData.message) {
errorMsg = errorData.message;
}
} catch(e) {
errorMsg = jqXHR.responseText.substring(0, 100);
}
}
$('.js-result').html(errorMsg)
.removeClass('form-item__warning--success')
.addClass('danger');
console.error('Ошибка проверки полиса:', jqXHR, exception);
return false;
}
});
});
$('input[name=birthday]').on("change input", function (e) {
// Отладочный вывод отключен
// console.log("Date changed: ", e.target.value);
let birthday=$(this).val();
if(getAge(birthday)<18) {
// Если возраст меньше 18 - разблокируем поле
$("input[data-enableby=birthday]").removeClass('disabled');
$("input[data-disabledby=birthday]").removeClass('disabled');
$("input[data-enableby=birthday]").prop('disabled', false);
$("input[data-enableby=birthday]").prop('readonly', false);
} else {
// Если возраст 18 и больше - блокируем поле
$("input[data-enableby=birthday]").addClass('disabled');
$("input[data-disabledby=birthday]").addClass('disabled');
$("input[data-enableby=birthday]").prop('disabled', true);
$("input[data-enableby=birthday]").prop('readonly', true);
$("input[data-enableby=birthday]").val(''); // Очищаем значение при блокировке
}
});
$('input[name=lastname],input[name=firstname],input[name=patronymic]').keyup(function(e){
let full_name=$('input[name=lastname]').val()+" "+$('input[name=firstname]').val()+" "+$('input[name=patronymic]').val();
$("input[data-enableby=birthday]").val(full_name);
});
function getAge(dateString) {
var today = new Date();
var birthDate = new Date(dateString.replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3"));
var age = today.getFullYear() - birthDate.getFullYear();
var m = today.getMonth() - birthDate.getMonth();
if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
age--;
}
return age;
}
// Загрузка файлов
function declOfNum(number, words) {
return words[(number % 100 > 4 && number % 100 < 20) ? 2 : [2, 0, 1, 1, 1, 2][(number % 10 < 5) ? Math.abs(number) % 10 : 5]];
}
function updateSize(elem) {
var filesQty = elem[0].files.length;
if(filesQty>10) {
elem.closest('.form-item').find('.form-item__warning').text("Разрешено не более 10 файлов");
return;
}
elem.closest('.form-item').find('.form-item__warning').text('');
let file_status=[];
var formats = ['pdf','jpg','png','gif','jpeg'];
for(var i=0; i<filesQty; i++) {
var file = elem[0].files[i],
ext = "не определилось",
parts = file.name.split('.');
if (parts.length > 1) ext = parts.pop();
if(!formats.includes(ext)) {
elem.closest('.form-item').find('.form-item__warning').append('<div> Файл '+file.name+' не подходит по формату. Доступные форматы: .pdf, .jpg, .png, .gif </div>');
elem.addClass('error');
file_status.push(false);
} else {
// elem.closest('.form-item').find('.form-item__warning').text();
if((file.size/1024/1024) > 5){
file_status.push(false);
elem.closest('.form-item').find('.form-item__warning').append('<div>Размер файла '+file.name+' превышает 5 Мб. </div>');
} else {
elem.removeClass('error');
file_status.push(true);
}
}
}
// ОТКЛЮЧЕНО: старая система загрузки файлов через fileupload_v2.php
// Файлы теперь отправляются напрямую в submit.php как бинарные данные
if(file_status.every(val => val === true))
{
// upload_file(elem); // ОТКЛЮЧЕНО - файлы отправляются напрямую при submit формы
$('.form__action').find('.js-btn-next').removeClass('disabled');
} else {
$('.form__action').find('.js-btn-next').addClass('disabled');
}
}
function upload_file(thisfile) {
let formData = new FormData();
let field_name=thisfile.data('crmname') || thisfile.data('field-type');
let docname=thisfile.data('docname');
// Отладочный вывод отключен
// console.log('=== UPLOAD_FILE FUNCTION ===');
// console.log('Uploading for field:', field_name, 'docname:', docname);
// console.log('File input element:', thisfile[0]);
// console.log('Files in input:', thisfile[0].files);
// console.log('Field type:', thisfile.data('field-type'));
// console.log('Form item:', thisfile.closest('.form-item')[0]);
let sub_dir=jQuery('input[name=sub_dir]').val();
jQuery.each(thisfile[0].files, function(i, file) {
formData.append(field_name+'-'+i, file);
});
thisfile.closest('.form-item').find('.suсcess-upload').remove();
formData.append('lastname',jQuery('input[name=lastname]').val());
formData.append('files_names[]',field_name);
formData.append('docs_names[]',docname);
formData.append('sub_dir',sub_dir);
thisfile.closest('.form-item').append("<p class='info-upload'></p>");
// for (var pair of formData.entries()) {
// console.log(pair[0]+ ', ' + pair[1]);
// }
$.ajax({
xhr: function() {
var xhr = new window.XMLHttpRequest();
// Upload progress
xhr.upload.addEventListener("progress", function(evt){
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
//Do something with upload progress
let complete=Math.round(percentComplete * 100);
// Отладочный вывод отключен
// console.log(complete);
thisfile.closest('.form-item').find(".info-upload").text("Загружено "+complete+" %");
}
}, false);
// Download progress
xhr.addEventListener("progress", function(evt){
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
// Do something with download progress
// Отладочный вывод отключен
// console.log(percentComplete);
}
}, false);
return xhr;
},
url: 'https://form.clientright.ru/fileupload_v2.php',
method: 'post',
cache: false,
contentType: false,
processData: false,
data: formData,
// dataType : 'json',
beforeSend : function (){
$('.form__action').find('.js-btn-next').addClass('disabled');
$('.form__action').find('.btn--submit').addClass('disabled');
},
success: function(data) {
let res=JSON.parse(data);
if(res.success=="true"){
// Отладочный вывод отключен
// console.log(res);
// thisfile.closest('.form-item').append("<p class='suсcess-upload'>Файл успешно загружен на сервер.</p>");
thisfile.attr('data-uploadurl',res.empty_file);
thisfile.attr('data-uploadurl_real',res.real_file);
// thisfile.closest('.form-item').append("<p class='suсcess-upload'>"+res.message+"</p>");
thisfile.closest('.form-item').find('.info-upload').remove();
$('.form__action').find('.js-btn-next').removeClass('disabled');
$('.form__action').find('.btn--submit').removeClass('disabled');
} else {
}
return false;
},
error: function (jqXHR, exception) {
return false;
}
});
}
function formatBytes(bytes, decimals = 2) {
if (!+bytes) return '0 Bytes'
const k = 1024
const dm = decimals < 0 ? 0 : decimals
const sizes = ['Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']
const i = Math.floor(Math.log(bytes) / Math.log(k))
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`
}
var fileIdCounter = 0;
jQuery('.js-attach').each(function() {
var fieldType = $(this).data('field-type'); // Получаем тип поля
let filethis = $(this);
// Создаем изолированное хранилище файлов для каждого поля
var fieldFiles = {
filesToUpload: [],
fieldType: fieldType
};
filethis.change(function (evt) {
var output = [];
let elem= $(this);
let currentFieldFiles = fieldFiles; // Используем изолированное хранилище
let currentFormItem = elem.closest('.form-item');
// Очищаем предупреждения только для текущего поля
currentFormItem.find('.form-item__warning').text('');
let file_status=[];
var formats = ['pdf','jpg','png','gif','jpeg'];
// Отладочный вывод отключен
// console.log('=== FILE UPLOAD START ===');
// console.log('Processing files for field type:', currentFieldFiles.fieldType);
// console.log('Field element:', elem[0]);
// console.log('Form item:', currentFormItem[0]);
// console.log('Files to process:', evt.target.files);
// console.log('Current fieldFiles state:', currentFieldFiles);
if(evt.target.files.length>10) {
elem.closest('.form-item').find('.form-item__warning').text("Разрешено не более 10 файлов");
return;
}
// Очищаем предыдущий список файлов для этого поля
currentFormItem.find('.fileList').empty();
currentFieldFiles.filesToUpload = [];
for (var i = 0; i < evt.target.files.length; i++) {
fileIdCounter++;
var file = evt.target.files[i];
var fileId = "fileid_" + fileIdCounter;
// Отладочный вывод отключен
// console.log(file);
let ext = "не определилось";
let parts = file.name.split('.');
if (parts.length > 1) ext = parts.pop();
if(!formats.includes(ext)) {
elem.closest('.form-item').find('.form-item__warning').append('<div> Файл '+file.name+' не подходит по формату. Доступные форматы: .pdf, .jpg, .png, .gif </div>');
elem.addClass('error');
file_status.push(false);
} else {
// elem.closest('.form-item').find('.form-item__warning').text();
if((file.size/1024/1024) > 5){
file_status.push(false);
elem.closest('.form-item').find('.form-item__warning').append('<div>Размер файла '+file.name+' превышает 5 Мб. </div>');
} else {
elem.removeClass('error');
file_status.push(true);
var removeLink = "<a class=\"removefile\" href=\"#\" data-fileid=\"" + fileId + "\"></a>";
output.push("<li><strong>", file.name, "</strong> <span class='size'> ", formatBytes(file.size) , " </span> ", removeLink, "</li> ");
currentFieldFiles.filesToUpload.push({
id: fileId,
file: file
});
}
}
//evt.target.value = null;
// elem.closest('.form-item').find('.upload-action').removeClass('d-none');
};
currentFormItem.find(".fileList").append(output.join(""));
let container = new DataTransfer();
for (var i = 0, len = currentFieldFiles.filesToUpload.length; i < len; i++) {
container.items.add(currentFieldFiles.filesToUpload[i].file);
}
elem[0].files = container.files;
if(file_status.every(val => val === true))
{
// Отладочный вывод отключен
// console.log('=== FILE UPLOAD SUCCESS ===');
// console.log('Uploading files for field type:', currentFieldFiles.fieldType);
// console.log('Final fieldFiles state:', currentFieldFiles);
// console.log('Files in DataTransfer:', elem[0].files);
// upload_file(elem); // ОТКЛЮЧЕНО - файлы отправляются напрямую при submit формы
$('.form__action').find('.js-btn-next').removeClass('disabled');
// Если загружен полис из блока policy-upload-section, показываем телефон и банк
if(currentFieldFiles.fieldType === 'polis' && elem.closest('.policy-upload-section').length > 0) {
// Скрываем блок загрузки полиса
$('.policy-upload-section').addClass('d-none');
// Показываем поля телефона и банка
$('.policy-validated-fields').removeClass('d-none');
// Разблокируем кнопку "Отправить смс"
$('.js-send-sms').removeClass('disabled');
$('.js-send-sms').prop('disabled', false);
// Убираем уведомление
$('.policy-upload-section').find('.form-item__warning').text('').hide();
}
} else {
// Отладочный вывод отключен
// console.log('=== FILE UPLOAD FAILED ===');
// console.log('File status:', file_status);
$('.form__action').find('.js-btn-next').addClass('disabled');
}
});
// Обработчик удаления файлов с доступом к fieldFiles через замыкание
$(this).closest('.form-item').on("click", ".removefile", function (e) {
let elem = $(this);
e.preventDefault();
var fileId = elem.data("fileid");
// Находим соответствующий input файла для этого .form-item
let fileInput = elem.closest('.form-item').find('input[type="file"].js-attach');
let fieldType = fileInput.data('field-type');
// Отладочный вывод отключен
// console.log('=== REMOVE FILE ===');
// console.log('Removing file with ID:', fileId);
// console.log('From field type:', fieldType);
// console.log('Current fieldFiles:', fieldFiles);
// Используем fieldFiles из замыкания
for (var i = 0; i < fieldFiles.filesToUpload.length; ++i) {
if (fieldFiles.filesToUpload[i].id === fileId) {
fieldFiles.filesToUpload.splice(i, 1);
// Отладочный вывод отключен
// console.log('File removed from fieldFiles');
break;
}
}
elem.parent().remove();
if(fieldFiles.filesToUpload.length == 0) {
elem.closest('.form-item').find('.upload-action').addClass('d-none');
elem.closest('.form-item').find('.suсcess-upload').text('');
} else {
let container = new DataTransfer();
for (var i = 0, len = fieldFiles.filesToUpload.length; i < len; i++) {
container.items.add(fieldFiles.filesToUpload[i].file);
}
fileInput[0].files = container.files;
updateSize(fileInput);
}
});
});
// End Загрузка файлов
});