$(document).ready( function () {
    validateForm();
});

// проверяет имя поля на приндлежность к массиву
function checkArrayNames(text) {
    return /^.+\[\]$/.test(text);
}

// ПРОВЕРКА ОБЯЗАТЕЛЬНЫХ ПОЛЕЙ
function validateForm () {
    $("form").submit(function() {
        var error = 0;
        var arrayNames = new Array();
        var arrayNamesIndex = 0;

        $("input.required:enabled, textarea.required:enabled", $(this)).each(function() {
            if(!checkArrayNames($(this).attr('name'))) {
                var valid = new ValidateAllForm($(this));
                if (valid.errors() == 1) {
                    error = 1;
                    return false;
                }
            } else {
                arrayNames[arrayNamesIndex] = $(this).val();
                arrayNamesIndex++;
            }
        });

        var hasVal = 0;
        for (var i = 0; i < arrayNames.length; i++) {
            if (arrayNames[i] != "") {
                hasVal++
            }
        }
        if(arrayNames.length > 0 && hasVal == 0) {
            alert('Заполните хотя бы одно поле.');
            return false;
        }

        return error == 0;
    });
}


// класс проверки форм
function ValidateAllForm(input) {
    this.error = 0; // флаг ошибки
    var inputName = input.attr("title") || input.attr("name"); // выводимое имя поля

    // проверяет пустое поле или нет
    this.notEmpty = function() {
        return jQuery.trim(input.val()).length > 0;
    }

    // проверяет Логин на правильность
    this.checkLogin = function() {
        var reg = input.attr('id') == /^[A-z0-9][A-z0-9_@\.-]{2,60}$/;
        return reg.test(input.val()) && !/--/.test(input.val());
    }

    // проверяет строку поиска
    this.checkSearch = function() {
        return /^[A-zА-яёЁ0-9 _-]{3,50}$/.test(input.val());
    }


    // проверяет Пароль на правильность
    this.checkPassword = function() {
    	var reg = input.attr('id') == 'ff_auth_pass' ? /^.{1,50}$/ : /^.{1,20}$/;
        return reg.test(input.val());
    }

    // проверяет совпадение пароля и подтверждение
    this.checkConfirm = function() {
        return input.val() == input.parents("form").find("input[name='password']").val();
    }

    // проверяет email на правильность
    this.checkEmail = function() {
        return /^[A-z0-9\._-]+\@[A-z0-9\.-]+\.([A-z]{2,4})$/.test($.trim(input.val()));
    }
    
    // проверяет emails на правильность
    this.checkEmails = function() {
        return /^([A-z0-9\._-]+\@[A-z0-9\.-]+\.([A-z]{2,4});?)+$/.test(input.val());
    }
    
    // проверяет телефон на правильность
    this.checkPhone = function() {
        return /^[0-9()\s-]{5,20}$/.test(input.val());
    }

    // проверяет код города
    this.checkCityCode = function() {
        return /^[0-9]{3,5}$/.test(input.val());
    }

    // проверяет индекс
    this.checkPostalCode = function() {
        return /^[0-9]{6}$/.test(input.val());
    }

    // возвращает флаг присутствия ошибки
    this.errors = function() {
        return this.error;
    }

    if (this.notEmpty()) {
        switch(input.attr("name"))
        {
            case ("login"):
               if (!this.checkLogin()) {
                    this.error = 1; // переключаем флаг ошибки
                    alert("Поле \"" + inputName + "\" заполнено не верно!\nЛогин должен содержать от 3 до 20 знаков.\nДопускаются латинские буквы, цифры, знак «-»");
                    input.focus();
                }
            break;

            case ("password"):
                if(!this.checkPassword()) {
                    this.error = 1;
                    alert("Поле \"" + inputName + "\" заполнено не верно!\nПароль должен содержать от 3 до 20 знаков.");
                    input.val("").focus();
                }
            break;

            case ("password_confirm"):
                if (!this.checkConfirm()) {
                    this.error = 1;
                    alert("Пароли не совпадают");
                    input.val("").focus();
                }
            break;

            case ("email"):
                if (!this.checkEmail()) {
                    this.error = 1;
                    alert("Поле \"" + inputName + "\" заполнено не верно! Введите корректный почтовый адрес.");
                    input.focus();
                }
            break;
            
            case ("emails"):
                if (!this.checkEmails()) {
                    this.error = 1;
                    alert("Поле \"" + inputName + "\" заполнено не верно! Введите корректный почтовый адрес.");
                    input.focus();
                }
            break;

            case ("phone"):
                if (!this.checkPhone()) {
                    this.error = 1;
                    alert("Поле \"" + inputName + "\" заполнено не верно!");
                    input.focus();
                }
            break;

            case ("search"):
                if (!this.checkSearch()) {
                    this.error = 1;
                    alert("Поле \"" + inputName + "\" заполнено не верно!\nДолжно быть не менее 3 символов.\nДопускаются латинские и русские буквы, цифры, знаки «-» и «_»");
                    input.focus();
                }
            break;

            case ("phone_city_code"):
                if (!this.checkCityCode()) {
                    this.error = 1; // переключаем флаг ошибки
                    alert("Поле \"" + inputName + "\" заполнено не правильно!");
                    input.focus();
                }
            break;

            case ("post[postal_code]"):
                if(!this.checkPostalCode()) {
                    this.error = 1;
                    alert("Поле \"" + inputName + "\" заполнено не верно!\n Введите корректный \"" + inputName + "\"");
                    input.focus();
                }
            break;
        }

        if (input.attr("type") == "checkbox" && !input.attr("checked")) {
            this.error = 1;
            alert("Поле \"" + inputName + "\" должно быть отмечено!");
        }

    } else {
        this.error = 1;
        alert("Необходимо заполнить поле \"" + inputName + "\"");
        input.focus();
    }
}
