// класс которым помечаем проверяемые поля
var check_class = "required";

// сюда пишуться max и min length поля
var temp_length = new Array();

// имя ошибки (имя функции, в которой произошла ошибка. необходимо для вывода ошибки пользователю)
var err_name;

// имя
var input_name;

// навешиваем событие проверки при субмите
$(document).ready(function() {
    $("form").submit(function() {
        var valid = true;
        $("input." + check_class + ", select." + check_class + ", textarea." + check_class, $(this)).each(function() {
            valid = validateStart(this);
            return valid;       // выход из цикла
        });
        return valid;       // запрет субмита
    });
    return false;
});


// занимается визуальным оформлением вывода ошибки
function vShowError(input)
{
    input.focus();
    input.colorFade({property: 'border-color', colorStart: '#C44C51', colorEnd: '#DEE2E8'}, 1500)
    alert(vGetErrMessage(input, err_name));
}


// возвращает объект со свойствами, указанными в альте
function vGetPropertis(input)
{
    var propertis = new Object;
    // array содержимое в квадратных скобках
    propertis.length = ((input.attr('alt').match(/\[.*?\]/i) + "").replace(/[\[\]]/g, "")).split(/\|/);
    // array содержимое в круглых скобках
    propertis.methods = ((input.attr('alt').match(/\(.*?\)/i) + "").replace(/[\(\)]/g, "")).split(/,/);

    return propertis;
}


// возвращает название нашего поля
function vGetName(input)
{
    return input.attr("title") || input.attr("name");
}


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


// вернет нужное сообщение об ошибке
function vGetErrMessage(input, name)
{
    var text = new Object;
    text['login']    = "Поле \"" + vGetName(input) + "\" может состоять только из латинских букв, цифр, знаков \"_\" и \"-\".";
    text['password'] = "Поле \"" + vGetName(input) + "\" должно содержать от 1 до 20 символов.";   // в нашем случае это никогда не выведется
    text['empty']    = "Поле \"" + vGetName(input) + "\" не может быть пустым.";
    text['email']    = "Поле \"" + vGetName(input) + "\" должно содержать правильный адрес E-mail.";
    text['phone']    = "Поле \"" + vGetName(input) + "\" может состоять только из цифр, знаков \")&\", \"(\", \"-\" и пробела.";
    text['length']   = "Поле \"" + vGetName(input) + "\" должно содержать " + ((temp_length[0]) ? " от " + temp_length[0] : "") + ((temp_length[1]) ? " до " + temp_length[1] : "") + " символов.";
    text['radio']    = "Необходимо отметить один или несколько пунктов поля \"" + vGetName(input) + "\".";
    text['select']   = "Необходимо выбрать какой либо пункт из списка \"" + vGetName(input) + "\".";
    text['confirm']  = "Пароли не совпадают.";
    text['login_exist']  = "Адресат не обнаружен!";
    text['private_blacklisted']  = "Вы не можете отправить сообщение пользователю " + input.attr("value") + ". Возможно, он внес Вас в свой черный список.";
    text['day'] = "Небходимо выбрать день рождения.";
    text['month'] = "Необходимо выбрать месяц рождения.";
    text['year'] = "Необходимо выбрать год рождения.";
    text['age'] = "Ваш возраст меньше 18 лет, Вы не можете принимать участие в аукционе.";
    text['no_birthday'] = "Необходимо указать дату рождения.";

    text['default']  = "Поле \"" + vGetName(input) + "\" заполнено не верно.";

    if (!text[name]) {
        return text['default'];
    } else {
        return text[name];
    }
}


// запускает валидатор
// принимает this, а не $(this)
function validateStart (_this)
{
    var valid  = true;

    if (_this.tagName == "SELECT") {
        valid = vCheckSelect($(_this));
    } else if (_this.tagName == "INPUT" && ($(_this).attr('type') == "checkbox" || $(_this).attr('type') == "radio")) {
        valid = vCheckRadio($(_this));
    } else {
        // проверяем на пустоту
        valid = vNotEmpty($(_this));
        var propertys = (valid) ? vGetPropertis($(_this)) : "null";

        // проверка длинны
        valid = (valid && propertys.length != "null") ? vCheckLength($(_this), propertys.length[0], propertys.length[1]) : valid;

        // проверка дополнительными функциями
        if (valid && propertys.methods != "null") {
            for (var i = 0; i < propertys.methods.length; i++){
                if (!valid) {break}
                valid = eval("vCheck"+propertys.methods[i]+"($(_this))");
            }
        }
    }

    if (!valid) {vShowError($(_this))}
    return valid;
}

// проверяет Логин на правильность
function vCheckLogin(input)
{
    err_name = "login";
    return (/^[A-z0-9_-]+$/.test(input.val())) ? vCheckLength(input, 3, 20) : false;
}

// проверяет Пароль на правильность
function vCheckPassword(input)
{
    err_name = "password";  // на тот случай, если будет проверка не только на длинну
    return vCheckLength(input, 1, 20)
}

// проверяет совпадение пароля и подтверждение
function vCheckConfirm(input)
{
    err_name = "confirm";
    var name = (input.attr('name').match(/.*?_confirm/g) + "").replace(/_confirm/g, "");
    var input2 = input.parents("form").find("input[name='"+name+"']");

    if(!input2.attr('name')) {
        alert('Не найдено поле для сравнения.');
        return false;
    } else {
        return input.val() == input2.val();
    }
}

// проверяет email на правильность
function vCheckEmail (input)
{
    err_name = "email";
    return /^[A-z0-9\._-]+\@[A-z0-9\.-]+\.([A-z]{2,4})$/.test(input.val());
}

// проверяет телефон на правильность
function vCheckPhone(input)
{
    err_name = "phone";
    return (/^[0-9()\s-]$/.test(input.val())) ? vCheckLength(input, 5, 20) : false;
}

// проверка возраста
function vCheckAge()
{
    err_name = "age";
    $('#n_day, #n_month, #n_year').each(function(){
        if (this.value == 0) {
            err_name = "no_birthday";
            $('#' + this.id + '').focus();
            return false;
        }
    });
    birthday = new Date($('#n_year').val(), $('#n_month').val()-1, $('#n_day').val());
    now = new Date();
    year = now.getFullYear() - birthday.getFullYear();
    
    if (now.getMonth() <= birthday.getMonth() && now.getDate() < birthday.getDate()) {
        year--;
    }
    return (year < 18) ? false: true;
}

// проверяет на минимальную и максимальную длинну
function vCheckLength(input, min_val, max_val)
{
    err_name = "length";
    temp_length = new Array(min_val, max_val);
    min_val =(min_val)?min_val:0;
    max_val =(max_val)?max_val:10000;

    var reg = new RegExp("^.{" + min_val + "," + max_val + "}$");
    return reg.test(input.val());
}

// проверяет radio и checkbox на отмеченность
function vCheckRadio(input)
{
    err_name = "radio";
    return input.parents("form").find("input[type='"+input.attr('type')+"'][name='"+input.attr('name')+"']:checked").length > 0;
}

// провереяет select на то что выбрано не нулевое значение
function vCheckSelect(_select)
{
    switch (_select.attr("name")) {
        case 'day':
        case 'month':
        case 'year':
            err_name = _select.attr("name");
            break;
        default:
            err_name = "select";
    }
    return _select.val() != "0";
}

// проверить логин на существование
function vCheckLoginExistence(input)
{
    err_name = "login_exist";
    var res = $.ajax({url: '/ajax/check_login/?login=' + input.val(), async: false}).responseText;
    return (res == 1) ? false : true;
}

function vCheckPrivateMessageBlacklisted(input)
{
	err_name = 'private_blacklisted';
	var res = $.ajax({url: '/ajax/check_private_blacklisted/?login=' + input.val(), async: false}).responseText;
    return (res == 1) ? true : false;
}