//язык страницы - необходим для определения языка сообщений var validateFormLang = 1; //массив для результатов валидации var validate_errors = new Array(); //Преобразует в верхний регистр первую букву из строки function ucwords(string) { return string.charAt(0).toUpperCase() + string.substr(1).toLowerCase(); } // Метод определяет форму через свойство form одного из элемента с id из check_list_fields function getForm() { for (i = 0; i < check_list_fields.length; i++) { if (check_list_fields[i]['id'] != '' && check_list_fields[i]['id'] != 'true') { // Пытаемся обратиться к элементу по id if ($('#' + check_list_fields[i]['id']).get(0) != null) { return $('#' + check_list_fields[i]['id']).get(0).form; } //если не существует элемента с таким id, то пытаемся обратиться по имени else if(document.getElementsByName(check_list_fields[i]['id']).length > 0) { return document.getElementsByName(check_list_fields[i]['id'])[0].form; } } } } //Определяем есть ли среди валидируемых полей Captcha function hasCaptcha() { for (i = 0; i < check_list_fields.length; i++) { if (check_list_fields[i]['type'] == 'captcha') { return true; } } return false; } //Метод инициализации элемента для валидации function init_validate_field(id, label, type) { this.id = id; this.label = label; this.type = type; } //Метод инициализации вообщения о ошибке валидации для валидации function init_validate_error(name, message, label) { this.name = name; this.message = message; this.label = label; } //Метод производит валидацию полей на клиентской стороне function validate_form(check_list_fields) { //Очищаем массив для сообщений об ошибках валидации validate_errors = new Array(); //Скрываем старые сообщения hideErrors(); for (i = 0; i < check_list_fields.length; i++) { var element_opt = check_list_fields[i]; if ($('#' + element_opt['id'])) { var element = $('#' + element_opt['id'])[0]; } //если не существует элемента с таким id, то пытаемся обратиться по имени if(element == null) { if(document.getElementsByName(element_opt['id']).length > 0) { element = document.getElementsByName(element_opt['id'])[0]; } } //Имя метода делающего проверку, формируется на основе имени типа проверки с префиксом _is method_name = '_is' + ucwords(element_opt['type'].toLowerCase()); //Имя метода делающего проверку, формируется на основе имени типа проверки с префиксом _is if (!window[method_name](element, element_opt)) { //Обработчик каптчи сам выводит текст ошибки if (element_opt['type'] != 'captcha') { addError([{"name":element_opt['id'],"type":element_opt['type'],"title":element_opt['label']}][0]); } } } return true; } //Метод производит валидацию полей на серверной стороне function validate_form_on_server() { //Очищаем массив для сообщений об ошибках валидации validate_errors = new Array(); //Скрываем старые сообщения hideErrors(); data = ''; // На сервер надо передавать все данные формы, так как некотроые поля могут управлять логикой валидации form_el = getForm().elements; for (i = 0; i < form_el.length; i++) { // Поле action фильтруем if (form_el[i].name.toLowerCase() != 'action') { tagname = form_el[i].tagName.toLowerCase(); type = form_el[i].type.toLowerCase(); checked = form_el[i].checked; // Для полей типа radio и checkbox - проверяем выделено ли оно if (tagname == 'input' && (type == 'checkbox' || type == 'radio')) { if (checked) { data += '&' + form_el[i].name + '=' + form_el[i].value; } } else { data += '&' + form_el[i].name + '=' + form_el[i].value; } } } // Один модуль может использовать несколько типов валидации - указываем текущий тип data += '&validateType=' + validateType; // столкнулся со следующей проблемой - если валидация проходит не на главной странице модуля // а на одной из внутренних - action может быть переопределен в htaccess. // поэтому парсим текущий путь и определяем путь к главной странице модуля - // обычно action у них не указывается, а в коде берется по-умолчанию первый - // считаем что это имя первой директории после имени сайта //var dirs = document.location.pathname.split('/'); //var module_main_page = '/' + dirs[1] + '/'; //var queryUrl = module_main_page + '?action=998'; //var queryUrl = module_main_page; var queryUrl = page_path; // Указываем action в POST data += '&action=998'; $.ajax({ type: "POST", url: queryUrl, dataType: "json", data: data, success: function(data) { //валидация не пройдена if (data.length) { fillErrorsFromJSON(data); viewErrors(); } //валидация пройдена - сабмитим форму else { getForm().submit(); } } }); return false; } //Метод заполняет результатами валидации на сервере массив validate_errors function fillErrorsFromJSON(data) { for (i = 0; i < data.length; i++) { addError(data[i]); } } //Отображает результат валидации function viewErrors() { for (i = 0; i < validate_errors.length; i++) { // Результат выводим посредством alert'a if (view_errors_style == 1) { alert(validate_errors[i]['message']); return true; } //Результат показываем в одном месте документа if (view_errors_style == 2) { if ($('#errors').length == 0) { alert('Не создан контейнер для ошибок с идентификатором "errors"'); return; } $('#errors').html($('#errors').html() + '
' + validate_errors[i]['message']); } //Каждый результат показываем на своем месте документа if (view_errors_style == 3) { curr_fieldname = 'error_' + validate_errors[i]['name']; if ($('#' + curr_fieldname).length == 0) { alert('Не создан контейнер для ошибок с идентификатором "' + curr_fieldname + '"'); } $('#' + curr_fieldname).html(validate_errors[i]['message']); $('#' + curr_fieldname).show(); } } // Для второго стиля вывода ошибок - добавляем в конце перевод строки if (view_errors_style == 2 && $('#errors').length != 0 && validate_errors.length > 0) { $('#errors').html($('#errors').html() + '

'); } if ((view_errors_style == 2) && (validate_errors.length > 0)) { $('#errors').show(); } } // Для стилей вывода ошибок view_errors_style 2 или 3 - скрываем блоки где отображаются ошибки function hideErrors() { //скрываем общий блок для вывода ошибок if ($('#errors')) { $('#errors').hide(); $('#errors').html(''); } //скрываем индивидуальные блоки for (i = 0; i < check_list_fields.length; i++) { element_opt = check_list_fields[i]; if ($('#error_' + element_opt['id'])) { $('#error_' + element_opt['id']).hide(); $('#error_' + element_opt['id']).html(''); } } } //Добавляет сообщение об ошибке function addError(rule) { if (! messages[rule.type]) { alert('В справочнике не обнаружен текст ошибки для типа валидации"' + rule.type + '"'); return; } error = formatErrorMessage(rule, messages[rule.type]); validate_errors[validate_errors.length] = new init_validate_error(rule['name'], error, rule['label']); } // Делает замены параметров JSON в тексте function formatErrorMessage(data, text) { for (var i in data) { text = text.replace(new RegExp('#' + i + '#', 'i'), data[i]); } return text; } //Функция делает проверку проверочного кода function _isCaptcha(element, options) { var params = { GCODE: element.value }; path = document.location.pathname; var queryUrl = path + '?action=999'; $.get(queryUrl, params, function(data) { //если проверочный код неверен if (data != 1) { addError([{"name":element_opt['id'],"type":element_opt['type'],"title":element_opt['label']}][0]); viewErrors(); } //если валидация остальных полей не пройдена else if (validate_errors.length > 0) { viewErrors(); } //если проверочный код верен и остальные поля валидированы успешно - сабмитим форму else { element.form.submit(); } }); return false; } // Провека на заполненность function _isRequired(element, options) { if (element.value == '') { return false; } return true; } //Функция проверяет, является ли переданное значение числом function _isNumber(element, options) { var re =/[^0-9.]/g; if (!re.test(element.value)) { return false; } return true; } //Проверка E-Mail на корректность function _isEmail(element, options) { //if (!(/^.+@.+\..+$/.test(element.value))) if (!(/^[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z0-9]{2,4}$/.test(element.value))) { return false; } return true; } //Проверка на совпадение введенных паролей function _isPasswordsMatch(element, options) { for (j = 0; j < check_list_fields.length; j++) { var element_opt_curr = check_list_fields[j]; var element_curr = $('#' + element_opt['id'])[0]; var password = element.value; //ищем остальные элементы с типом password if (element_opt_curr['type'] == 'password' && element_opt_curr['id'] != options['id']) { //пароли не сходятся if(password != element_curr.value) { return false; } } return true; } }