﻿/************* Проверка заполнения полей формы ***************/

// Поведение полей определяется классами, например num - только цифры, req - обязательное поле, mail - поле для email
// если нужно задать ограничения для числа, то использовать атрибуты minval, maxval (по одному или оба сразу)

jQuery(document).ready(function () {
    // в num нельзя писать ничего, кроме цифр
    $("input.num").keypress(function (event) { return (((event.which >= 48) && (event.which <= 57)) || event.which == 46 || event.which == 8 || event.which == 0); });

    // onFocus убираются ошибки в полях
    $("input, textarea").focus(function () {
        if ($(this).hasClass('err')) {
            $(this).removeClass("err");
            if (this.userVal && this.userVal != $(this).attr("errmsg_req")) $(this).val(this.userVal);
            else $(this).val("");
        }
    });
    // onBlur числа автоматически разделяются запятыми на порядки
    $("input.num").blur(function () {
        var val = fNumRemovePunctuation($(this).attr("value"));
        var pos = 3
        while (val.length > pos) {
            val = val.substr(0, val.length - pos) + "," + val.substr(val.length - pos);
            pos = pos + 4;
        }
        $(this).attr("value", val);
    });

    //    $("#phone_number").mask("+7 (999) 999-99-99", { placeholder: "_" });

    $(".line.check input").change(function () {
        if ($(this).is(":checked")) {
            $(".line.btn input").removeAttr('disabled').addClass("act");
            $(this).parents(".check").removeClass("err");
        } else {
            $(".line.btn input").attr('disabled', 'disabled').removeClass("act");
        }
    });

});

// эта функция вызывается перед отправкой формы
var validate = function (form) {
    $("#validationSummary").hide();
    var isError = false;

    $("input, textarea", $(form)).each(function () {
        //fHideLocalError( $(this) );
        var isFldErr = false;
        var val = jQuery.trim($(this).attr("value"));

        // Обязательное поле
        if ($(this).hasClass("req")) {
            if (!val.length || val == $(this).attr("errmsg_req")) {
                isError = true; isFldErr = true;
                fShowLocalError($(this), 2);
            }
        }
        // Подготовка числа к валидации - удаление запятых, точек и пробелов
        if (!isFldErr && $(this).hasClass("num")) val = fNumRemovePunctuation(val);
        // Поле, содержащее только цифры
        // Для обязательного поля 0 не пропускаем, для не обязательного пропускаем
        if (!isFldErr && $(this).hasClass("num") && val.length && val != '0') {
            if (!parseInt(val)) {
                isError = true; isFldErr = true;
                fShowLocalError($(this), 3);
            }
        }
        // Поле, содержащее только цифры, с ограничениями значений
        if (!isFldErr && $(this).hasClass("num") && ($(this).attr("minval") || $(this).attr("maxval"))) {
            var min = $(this).attr("minval"); if (min) min = parseInt(fNumRemovePunctuation(min));
            var max = $(this).attr("maxval"); if (max) max = parseInt(fNumRemovePunctuation(max));
            if ((min && min > parseInt(val)) || (max && max < parseInt(val))) {
                isError = true; isFldErr = true;
                if (min && min > parseInt(val)) fShowLocalError($(this), 4, $(this).attr("minval"), $(this).attr("cur"));
                else fShowLocalError($(this), 5, $(this).attr("maxval"), $(this).attr("cur"));
            }
        }
        // Email
        if (!isFldErr && $(this).hasClass("mail") && $(this).val().length > 0) {
            if (!fEmailCheck(val)) {
                isError = true; isFldErr = true;
                fShowLocalError($(this), 6);
            }
        }

        // Phone
        if (!isFldErr && $(this).hasClass("phone") && $(this).val().length > 0) {
            if (!fPhoneCheck(val)) {
                isError = true; isFldErr = true;
                fShowLocalError($(this), 7);
            }
        }


    });

    $(".check input", $(form)).each(function () {
        if (!$(this).is(":checked")) {
            isError = true; isFldErr = true;
            $(this).parents(".check").addClass("err");
        }
    });

    if (isError) {
        fShowGlobalError($(form));
        return false;
    }
    return true;
}

//Проверка валиности Email, ввиду сложности вынес в отдельную функцию
var fEmailCheck = function (str) {
    return (/^([a-z0-9_\-]+\.)*[a-z0-9_\-]+@([a-z0-9][a-z0-9\-]*[a-z0-9]\.)+[a-z]{2,4}$/i).test(str);
}

//Проверка валидности телефонного номера. Разрешенные символы: цифры, скобки, дефис, пробел, плюс
var fPhoneCheck = function (str) {
    return (/^[\d\(\)\s-\+]*$/).test(str);
}

//очистка числа от пунктуации: удаление запятых, точек и пробелов
var fNumRemovePunctuation = function (str) {
    var pos = 0;
    while ((pos = str.indexOf(',')) >= 0) str = str.substr(0, pos) + str.substr(pos + 1);
    while ((pos = str.indexOf('.')) >= 0) str = str.substr(0, pos) + str.substr(pos + 1);
    while ((pos = str.indexOf(' ')) >= 0) str = str.substr(0, pos) + str.substr(pos + 1);
    return str;
}

/*********************************/

// массив с текстами ошибок
var arrErrMsgs = Array('', '', 'Поле обязательно для заполнения', 'Неверный формат числа', 'не менее %s', 'не более %s', 'Неверный формат E-mail', 'Неверный формат номера');

// показываем сообщение об ошибке для конкретного поля
var fShowLocalError = function (field, errCode, p_s, p_c) {
    var errStr = arrErrMsgs[errCode];
    if (p_s) errStr = errStr.replace('%s', p_s);
    if (p_c) errStr = errStr.replace('%c', p_c);
    switch (errCode) {
        case 0: break;
        case 1: break;
        case 2:
            if (field.attr("errmsg_req")) errStr = field.attr("errmsg_req");
            break;
        case 3:
            if (field.attr("errmsg_num")) errStr = field.attr("errmsg_num");
            break;
        case 4:
            if (field.attr("errmsg_minval")) errStr = field.attr("errmsg_minval");
            break;
        case 5:
            if (field.attr("errmsg_maxval")) errStr = field.attr("errmsg_maxval");
            break;
        case 6:
            if (field.attr("errmsg_mail")) errStr = field.attr("errmsg_mail");
            break;
    }
    if (!field.hasClass("err")) {
        field.get(0).userVal = field.val();
        field.addClass("err").val(errStr);
    }
}
//Скрываем сообщение об ошибке для конкретного поля
var fHideLocalError = function (field) {
    var v = field.get(0).userVal ? field.get(0).userVal : "";
    field.removeClass("err").val(v);
}

// Показываем глобальное сообщение об ошибке, обычно перед или после формы
var fShowGlobalError = function (form) {
    $("#validationSummary").show();
}


