| Server IP : 87.98.231.4 / Your IP : 216.73.217.178 [ Web Server : Apache System : Linux webm007.cluster103.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64 User : grupmartgn ( 667608) PHP Version : 8.5.7 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl Domains : 2 Domains MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/grupmartgn/elanartcrafts/lmn/jvo/valid/js/ |
Upload File : |
/*Обязательно!!!поля формы
Имя name="name"
Телефон name="phone_number"
при этом полный номер в обработчик будет приходить в ключе phone
<script>var lang = 'HU', country = "HU";</script> задаются язык валидации и страна по умолчанию для вывода кода, если ее убрать то определять будет по ip пользователя
*/
document.addEventListener('DOMContentLoaded', () => {
// Добавление классов
document.querySelectorAll('input[name="name"]').forEach(input => input.classList.add('names'));
document.querySelectorAll('input[name="phone_number"]').forEach(input => input.classList.add('phone'));
document.querySelectorAll('form').forEach(form => form.style.position = 'relative');
// Добавление скрытых инпутов
const hiddenInputs = [
{ class: 'phonecc', name: 'code', value: '' },
{ class: 'input-country', name: 'country', value: '' },
{ class: 'countryName', name: 'countryName', value: '' }
];
document.querySelectorAll('form').forEach(form => {
hiddenInputs.forEach(input => {
const el = document.createElement('input');
el.type = 'hidden';
el.className = input.class;
el.name = input.name;
el.value = input.value;
form.appendChild(el);
});
});
// Добавление error-box
document.querySelectorAll('input:not([type="hidden"], [type="number"], [type="checkbox"], [type="radio"], [type="range"])')
.forEach(input => {
const div = document.createElement('div');
div.className = 'error-box';
input.insertAdjacentElement('afterend', div);
});
// Удаление атрибута required
document.querySelectorAll('input').forEach(input => input.removeAttribute('required'));
// Добавление прелоадера
document.querySelectorAll('form[method="post"]').forEach(form => {
const div = document.createElement('div');
div.className = 'preloaders';
form.insertBefore(div, form.firstChild);
});
// Стили прелоадера
const styles = `.preloaders {display: none;background: white;position: absolute;top: 0%;bottom: 0;left: 0%;right: 0;z-index: 9995;background-image: url('data:image/gif;base64,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');background-repeat: no-repeat;background-position: 50% 50%;opacity: 0.5;border-radius: 2px;}`;
const styleSheet = document.createElement('style');
styleSheet.textContent = styles;
document.body.appendChild(styleSheet);
// Определение языка
console.log('GlobalLang ' + window.lang);
const lang = window.lang === undefined ? 'EN' : window.lang;
// Определение страны
console.log('GlobalCountry ' + window.country);
const country = window.country === undefined || window.country == '' ? 'auto' : window.country;
// Объект ошибок
const languageError = {
"RU": {
"error" : "Поле не может быть пустым",
"errorMap" : ["Неправильный номер", "Неверный код страны", "Слишком короткий", "Слишком длинный", "Неправильный номер", "Неправильный номер"]
},
"UA": {
"error" : "Поле не може бути порожнім",
"errorMap" : ["Неправильний номер", "Невірний код країни", "Занадто короткий", "Занадто довгий", "Неправильний номер", "Неправильний номер"]
},
"RO": {
"error" : "Câmpul nu poate fi gol",
"errorMap" : ["Număr greșit", "Cod de țară greșit", "Prea scurt", "Prea lung", "Număr greșit", "Număr greșit"]
},
"BG": {
"error" : "Полето не може да бъде празно",
"errorMap" : ["Грешен номер", "Грешен код на държавата", "Твърде кратък", "Твърде дълъг", "Грешен номер", "Грешен номер"]
},
"SK": {
"error" : "Pole nemôže byť prázdne",
"errorMap" : ["Chybné číslo", "Chybný kód krajiny", "Príliš krátky", "Príliš dlhý", "Chybné číslo", "Chybné číslo"]
},
"HU": {
"error" : "A mező nem lehet üres",
"errorMap" : ["Rossz szám", "Rossz országkód", "Túl rövid", "Túl hosszú", "Rossz szám", "Rossz szám"]
},
"GR": {
"error" : "Το πεδίο δεν μπορεί να είναι κενό",
"errorMap" : ["Μη έγκυρος αριθμός", "Μη έγκυρος κωδικός χώρας", "Πολύ σύντομος", "Πολύ μεγάλος", "Μη έγκυρος αριθμός", "Μη έγκυρος αριθμός"]
},
"FR": {
"error" : "Le champ ne peut pas être vide",
"errorMap" : ["Numéro invalide", "Code pays invalide", "Trop court", "Trop long", "Numéro invalide", "Numéro invalide"]
},
"MY": {
"error" : "Medan tidak boleh kosong",
"errorMap" : ["Nombor tidak sah", "Kod negara tidak sah", "Terlalu pendek", "Terlalu panjang", "Nombor tidak sah", "Nombor tidak sah"]
},
"CN": {
"error" : "該字段不能為空",
"errorMap" : ["無效號碼", "無效國家代碼", "太短", "太長", "無效號碼", "無效號碼"]
},
"CZ": {
"error" : "Pole nemůže být prázdné",
"errorMap" : ["Neplatné číslo", "Neplatný kód země", "Příliš krátké", "Příliš dlouhé", "Nesprávné číslo", "Příliš dlouhé"]
},
"PT": {
"error" : "O campo não pode ficar vazio",
"errorMap" : ["Número incorreto", "Código de país inválido", "Muito curto", "Muito longo", "Número incorreto", "Número incorreto"]
},
"ES": {
"error" : "El campo no puede estar vacío",
"errorMap" : ["Número incorrecto", "Código de país no válido", "Demasiado corto", "Demasiado largo", "Número incorrecto", "Número incorrecto"]
},
"IT": {
"error" : "Il campo non può essere vuoto",
"errorMap" : ["Numero errato", "Codice paese non valido", "Troppo breve", "Troppo lungo", "Numero errato", "Numero errato"]
},
"EN": {
"error" : "The field cannot be empty",
"errorMap" : ["Invalid number", "Invalid country code", "Too short", "Too long", "Invalid number", "Invalid number"]
},
"DE": {
"error" : "Das Feld darf nicht leer sein",
"errorMap" : ["Ungültige Nummer", "Ungültiger Ländercode", "Zu kurz", "Zu lang", "Ungültige Nummer", "Ungültige Nummer"]
},
"PL": {
"error" : "Pole nie może być puste",
"errorMap" : ["Nieprawidłowy numer", "Nieprawidłowy kod kraju", "Zbyt krótki", "Zbyt długi", "Nieprawidłowy numer", "Nieprawidłowy numer"]
},
"AR": {
"error" : "لا يمكن أن يكون الحقل فارغًا",
"errorMap" : ["رقم غير صحيح", "رمز الدولة غير صحيح", "قصير جدا", "طويل جدا", "رقم غير صحيح", "رقم غير صحيح"]
},
"SI": {
"error" : "Polje ne sme biti prazno",
"errorMap" : ["Napačna številka", "Napačna koda države", "Prekratka", "Predolga", "Napačna številka", "Napačna številka"]
},
"RS": {
"error" : "Поље не може бити празно",
"errorMap" : ["Погрешан број", "Погрешан позивни број", "Прекратко", "Предуго", "Погрешан број", "Погрешан број"]
},
"IN": {
"error" : "फ़ील्ड खाली नहीं हो सकती",
"errorMap" : ["गलत नंबर", "गलत देश कोड", "बहुत छोटा", "बहुत लंबा", "गलत नंबर", "गलत नंबर"]
},
"ID": {
"error" : "Bidang ini tidak boleh kosong",
"errorMap" : ["Nomor salah", "Kode negara salah", "Terlalu pendek", "Terlalu panjang", "Nomor salah", "Nomor salah"]
},
"VN": {
"error" : "Trường không thể trống",
"errorMap" : ["Sai số", "Sai mã quốc gia", "Quá ngắn", "Quá dài", "Sai số", "Sai số"]
},
"HR": {
"error" : "Polje ne može biti prazno",
"errorMap" : ["Pogrešan broj", "Pogrešan pozivni broj zemlje", "Prekratak", "Predug", "Pogrešan broj", "Pogrešan broj"]
},
"PH": {
"error" : "Hindi maaaring walang laman ang field",
"errorMap" : ["Maling numero", "Maling code ng bansa", "Masyadong maikli", "Masyadong mahaba", "Maling numero", "Maling numero"]
},
"TH": {
"error" : "ฟิลด์ต้องไม่ว่างเปล่า",
"errorMap" : ["หมายเลขผิด", "รหัสประเทศผิด", "สั้นเกินไป", "ยาวเกินไป", "หมายเลขผิด", "หมายเลขผิด"]
},
"AL": {
"error" : "Fusha nuk mund të jetë bosh",
"errorMap" : ["Numër i gabuar", "Kodi i gabuar i shtetit", "Shumë i shkurtër", "Shumë i gjatë", "Numër i gabuar", "Numër i gabuar"]
},
"SG": {//тамильский язык
"error" : "புலம் காலியாக இருக்கக்கூடாது",
"errorMap" : ["தவறான எண்", "தவறான நாட்டுக் குறியீடு", "மிகக் குறுகியது", "மிக நீளமானது", "தவறான எண்", "தவறான எண்"]
},
"MK": {
"error" : "Полето не може да биде празно",
"errorMap" : ["Погрешен број", "Погрешен код на земја", "Премногу краток", "Премногу долг", "Погрешен број", "Погрешен број"]
},
"LV": {
"error" : "Lauks nevar būt tukšs",
"errorMap" : ["Nepareizs numurs", "Nepareizs valsts kods", "Pārāk īss", "Pārāk garš", "Nepareizs numurs", "Nepareizs numurs"]
},
"LT": {
"error" : "Laukas negali būti tuščias",
"errorMap" : ["Neteisingas numeris", "Klaidingas šalies kodas", "Per trumpas", "Per ilgas", "Klaidingas numeris", "Neteisingas numeris"]
},
"BA": {
"error" : "Polje ne može biti prazno",
"errorMap" : ["Pogrešan broj", "Pogrešan pozivni broj", "Prekratko", "Predugo", "Pogrešan broj", "Pogrešan broj"]
},
"UZ": {
"error" : "Maydon bo'sh bo'lishi mumkin emas",
"errorMap" : ["Noto'g'ri raqam", "Noto'g'ri mamlakat kodi", "Juda qisqa", "Juda uzun", "Noto'g'ri raqam", "Noto'g'ri raqam"]
},
"UZC": {
"error" : "Майдон бўш бўлолмайди",
"errorMap" : ["Нотўғри рақам", "Нотўғри мамлакат коди", "Жуда қисқа", "Жуда узун", "Нотўғри рақам", "Нотўғри рақам"]
},
"KZ": {
"error" : "Өріс бос болуы мүмкін емес",
"errorMap" : ["Қате нөмір", "Ел коды дұрыс емес", "Тым қысқа", "Тым ұзын", "Қате нөмір", "Қате нөмір"]
},
"TR": {
"error" : "Alan boş olamaz",
"errorMap" : ["Yanlış numara", "Yanlış ülke kodu", "Çok kısa", "Çok uzun", "Yanlış numara", "Yanlış numara"]
},
};
// Функции
const searchArr = (obj, val) => Object.keys(obj).indexOf(val);
const reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
let errorEmpty, errorPhone;
const errorLanguage = (country) => {
country = searchArr(languageError, country) < 0 ? 'EN' : country;
console.log(country);
errorEmpty = languageError[country].error;
errorPhone = languageError[country].errorMap;
};
const showError = (element, text) => {
const errorBox = element.nextElementSibling;
errorBox.style.display = 'block';
element.classList.remove('valid');
element.classList.add('error');
errorBox.innerHTML = text;
};
const showErrorPhone = (element, text) => {
const errorBox = element.parentElement.nextElementSibling;
errorBox.style.display = 'block';
element.classList.remove('valid');
element.classList.add('error');
errorBox.innerHTML = text;
};
const notError = (element) => {
const errorBox = element.nextElementSibling;
errorBox.style.display = 'none';
element.classList.remove('error');
element.classList.add('valid');
};
errorLanguage(lang.toUpperCase());
// Ограничение ввода
const forbiddenChars = /[0-9+\-\/.,!@#$%^&*()_={}[\]\\;:'"?><]/g;
const restrictToNames = (input) => {
input.addEventListener('input', function() {
if (this.value.trim() === '') this.value = '';
this.value = this.value.replace(forbiddenChars, '');
});
};
document.querySelectorAll('.names').forEach(restrictToNames);
const restrictToNumbers = (input) => {
input.addEventListener('input', function() {
this.value = this.value.replace(/(?!^\+)[^\d]/g, '');
});
};
document.querySelectorAll('.phone').forEach(restrictToNumbers);
// Добавление языка пользователя
const userLanguage = navigator.language || navigator.userLanguage;
const isoLanguage = userLanguage.split('-')[0];
document.querySelectorAll('form').forEach(form => {
if (!form.querySelector('input[name="lang"]')) {
const langInput = document.createElement('input');
langInput.type = 'hidden';
langInput.name = 'lang';
langInput.value = isoLanguage;
form.appendChild(langInput);
}
});
// Определение страны
var countryCode;
function get_country_ipdata() {
// Set keys array
const arr_ip_services = [
'873ee2ede2a302df66231d62508b4eb4619ee9e8f2a5e64c4387072d',
'40fa0f3c8d2cdcb8add68c305feff11db708360780f0066387164f0b',
'2a677500e3477e6d0fea93fee0c6733539579a5de256cde17b8e1040',
'f46801585dd4b688b56b3e6caeca71244fdfc99153c8878bfa1f491f',
'f35ee19792282607ce7d3fb11bf3e9f97fb798758a39c5b01de49dac',
'55f898043244f01c09a478ed124bce64fe27474f05dbca7b4a85b0a5',
'b64db39a8154587bb440ae0a773c9df999d6ebb270a8a3c388165727',
'16a6528d481f7475d4affda52f72fe2e254e4f8f1e9c9ea74e49a6b0',
'77e082430a7324a84430020dd411f0c60396e452e8667f85002f9798',
'05fc683ddf3c114517db467e4e9e34c2de29e1b784de9dec27d5bf15',
'221539240a8dccf7c4b73cb3db26b7034bc822c05121337f671a0722'
];
// Get random key
const ip_rand = Math.floor(Math.random() * arr_ip_services.length);
const ip_key = arr_ip_services[ip_rand];
// Fetch IP data
fetch(`https://api.ipdata.co/?api-key=${ip_key}`)
.then(response => response.json())
.then(data => {
const country = data.country_code || "";
if (country.length === 2) {
countryCode = country;
}
console.log('ada', countryCode);
})
.catch(error => console.error('Error fetching ipdata:', error));
}
function get_country_cloudflare() {
fetch('https://www.cloudflare.com/cdn-cgi/trace')
.then(response => response.text())
.then(data => {
const match = data.match(/loc=(.+)/);
if (match && match[1].length === 2) {
countryCode = match[1];
}
console.log('clfl', countryCode);
})
.catch(error => console.error('Error fetching Cloudflare data:', error));
}
function get_country_ipinfo() {
fetch('https://ipinfo.io?token=a409273f3f6a36')
.then(response => response.json())
.then(data => {
const country = data.country || "";
if (country.length === 2) {
countryCode = country;
}
console.log('ipinfo', countryCode);
})
.catch(error => console.error('Error fetching ipinfo:', error));
}
function get_country_geoplugin() {
fetch('http://www.geoplugin.net/json.gp')
.then(response => response.json())
.then(data => {
const country = data.geoplugin_countryCode || "";
if (country.length === 2) {
countryCode = country;
}
console.log('gpl', countryCode);
})
.catch(error => console.error('Error fetching geoplugin:', error));
}
function get_country_amos() {
fetch('https://amos-mamaya.fun/geo')
.then(response => response.json())
.then(data => {
const country = data.country_code || "";
if (country.length === 2) {
countryCode = country;
}
console.log('amos', countryCode);
})
.catch(error => console.error('Error fetching amos:', error));
}
// Инициализация ITI
const inputs = document.querySelectorAll('.phone');
const iti = new Map();
// Функция для подстановки значений в инпуты
function setInputValues(instance) {
const countryData = instance.getSelectedCountryData();
if (countryData.dialCode) {
document.querySelectorAll('.phonecc').forEach(input => {
input.value = countryData.dialCode;
});
document.querySelectorAll('.countryName').forEach(input => {
input.value = countryData.name.split(' (')[0];
});
document.querySelectorAll('.input-country').forEach(input => {
input.value = countryData.iso2.toUpperCase();
});
}
}
inputs.forEach((input, index) => {
const instance = window.intlTelInput(input, {
allowDropdown: true,
autoHideDialCode: true,
formatOnDisplay: true,
geoIpLookup: function (callback) {
get_country_ipinfo();
setTimeout(() => {
if (!countryCode) {
get_country_ipdata();
setTimeout(() => {
if (!countryCode) {
get_country_amos();
setTimeout(() => {
callback(countryCode);
}, 1000);
} else if (!countryCode) {
get_country_geoplugin();
setTimeout(() => {
callback(countryCode);
}, 1000);
} else if (!countryCode) {
get_country_cloudflare();
setTimeout(() => {
callback(countryCode);
}, 1000);
} else {
callback(countryCode);
}
}, 1000);
} else {
callback(countryCode);
}
}, 1000);
},
initialCountry: country,
autoPlaceholder: 'aggressive',
onlyCountries: ["de"],
strictMode: true,
nationalMode: true,
placeholderNumberType: 'MOBILE',
validationNumberTypes: 'MOBILE',
separateDialCode: false,
hiddenInput: 'phone',
});
// Установка начальных значений для инпутов
setInputValues(instance);
iti.set(index, instance);
input.addEventListener('countrychange', () => {
const countryData = instance.getSelectedCountryData();
if (countryData.dialCode) {
document.querySelectorAll('.phonecc').forEach(input => {
input.value = countryData.dialCode;
});
document.querySelectorAll('.countryName').forEach(input => {
input.value = countryData.name.split(' (')[0];
});
document.querySelectorAll('.input-country').forEach(input => {
input.value = countryData.iso2.toUpperCase();
});
}
});
input.addEventListener('input', () => {
const instance = iti.get(index);
if (!instance) {
console.error('ITI instance not found for index:', index);
return;
}
const val = input.value;
const number = instance.getNumber();
const isValid = instance.isValidNumber();
const errorCode = instance.getValidationError();
const fullPhoneInput = document.querySelectorAll('input[name=phone]');
console.log('Phone input:', { val, number, isValid, errorCode });
if (fullPhoneInput)
fullPhoneInput.forEach(input => {
input.value = number;
});
if (val && isValid) {
showErrorPhone(input, '');
notError(input);
} else if (!val) {
showErrorPhone(input, errorEmpty);
} else {
showErrorPhone(input, errorPhone[errorCode] || 'Invalid number');
}
});
});
// Валидация при вводе для имени
document.querySelectorAll('input[name="name"]').forEach(input => {
input.addEventListener('input', function() {
const name = this.name;
const val = this.value;
switch (name) {
case 'name':
if (val) {
notError(this);
} else {
showError(this, errorEmpty);
}
break;
}
});
});
// Функция проверки формы
const checkForm = (element) => {
let flag = true;
let firstInvalidField = null;
const form = element.closest('form');
const inputs = form.querySelectorAll('input');
for (const input of inputs) {
const name = input.name;
if (name === 'name') {
if (input.value.length < 1) {
flag = false;
showError(input, errorEmpty);
if (!firstInvalidField) firstInvalidField = input;
}
} else if (name === 'phone_number') {
const index = parseInt(input.getAttribute('data-intl-tel-input-id') || '0');
const instance = iti.get(index);
if (!instance) {
console.error('ITI instance not found for index:', index);
flag = false;
continue;
}
const isValid = instance.isValidNumber();
const errorCode = instance.getValidationError();
const fullPhoneInput = document.querySelectorAll('input[name=phone]');
if (fullPhoneInput)
fullPhoneInput.forEach(input => {
input.value = instance.getNumber();
});
console.log('CheckForm phone:', { value: input.value, isValid, errorCode });
if (!input.value) {
flag = false;
showErrorPhone(input, errorEmpty);
if (!firstInvalidField) firstInvalidField = input;
} else if (!isValid) {
flag = false;
showErrorPhone(input, errorPhone[errorCode] || 'Invalid number');
if (!firstInvalidField) firstInvalidField = input;
}
}
// Если нашли первое невалидное поле, сразу ставим фокус и прерываем проверку
if (firstInvalidField) {
firstInvalidField.focus();
break;
}
}
return flag;
};
const submitForm = (element) => {
document.querySelector('.preloaders').style.display = 'block';
element.closest('form').requestSubmit();
};
document.querySelectorAll('[type=submit]').forEach(button => {
button.addEventListener('click', (e) => {
e.preventDefault();
if (checkForm(button)) submitForm(button);
});
});
// Наблюдатель за изменениями
const observer = new MutationObserver((mutations) => {
mutations.forEach(mutation => {
if (mutation.target.classList.contains('selected-dial-code')) {
const selectedDialCode = mutation.target.textContent;
if (selectedDialCode) {
document.querySelectorAll('.phonecc').forEach(input => {
input.value = selectedDialCode;
});
}
}
});
});
observer.observe(document.body, {
subtree: true,
childList: true,
characterData: true
});
});