function isEmptyValue(val)
{
    return val === null || val === undefined || (typeof val === 'string' && !val.trim().length);
}

function validateFormData(datas, $form)
{
    var type = $("#distType").val();
    var hasError = false;

    /* validate required */
    datas.forEach(function(data)
    {
        var input    = $('input[name="' + data.name + '"]');
        if(!input.is(":visible")) return;

        input.parent().find('.help-text').remove();

        var required = formConfig[type][data.name].required;
        var isEmpty  = isEmptyValue(data.value);

        var name     = dists[type].form[data.name];
        var label    = $('#' + data.name + 'Label');

        if(label.length) label.remove();

        if(required && isEmpty)
        {
            hasError = true;
            label   = '<div id="' + data.name + 'Label" class="text-danger help-text">' + validMsg.required.replace('%s', name) + '</div>';
            input.parent().append(label);
            return false;
        }
    });

    if(hasError) return false;

    /* validate number */
    datas.forEach(function(data)
    {
        var input    = $('input[name="' + data.name + '"]');
        if(!input.is(":visible")) return;

        input.parent().find('.help-text').remove();

        var required = formConfig[type][data.name].required;
        var isEmpty  = isEmptyValue(data.value);

        var name     = dists[type].form[data.name];
        var label    = $('#' + data.name + 'Label');

        if(label.length) label.remove();

        var regex = /^[-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?%?$/;
        if(formConfig[type][data.name].type == 'number' && !isEmpty && !regex.test(data.value))
        {
            hasError = true;
            var error = validMsg.number.replace('%s', name);
            label = '<div id="' + data.name + 'Label" class="text-danger help-text">' + error + '</div>';
            input.parent().append(label);
            return false;
        }
    });

    if(hasError) return false;

    /* validate limit */
    datas.forEach(function(data)
    {
        var input    = $('input[name="' + data.name + '"]');
        if(!input.is(":visible")) return;

        input.parent().find('.help-text').remove();

        var required = formConfig[type][data.name].required;
        var isEmpty  = isEmptyValue(data.value);
        var name     = dists[type].form[data.name];
        var label    = $('#' + data.name + 'Label');

        if(label.length) label.remove();

        if(formConfig[type][data.name].type != 'number') return;

        if(!required && isEmpty) return;

        var min     = formConfig[type][data.name].min;
        var max     = formConfig[type][data.name].max;
        var noEqual = formConfig[type][data.name].noEqual;

        var minText = isNaN(min) ? dists[type].form[min] : min;
        var maxText = isNaN(max) ? dists[type].form[max] : max;

        var minValue = min;
        var maxValue = max;

        var error = false;
        if(isNaN(min))
        {
          minValue = datas.find(function(x){return x.name == min}).value;
          var minEmpty = isEmptyValue(minValue);
          minValue = minEmpty ? formConfig[type][min].min : minValue;
          minText  = minEmpty ? minValue : minText;
        }

        if(isNaN(max))
        {
          maxValue = datas.find(function(x){return x.name == max}).value;
          var maxEmpty = isEmptyValue(maxValue);
          maxValue = maxEmpty ? formConfig[type][max].max : maxValue;
          maxText  = maxEmpty ? maxValue : maxText;
        }

        var judge = Number(data.value) < Number(minValue) || Number(data.value) > Number(maxValue);
        var limitError = validMsg.limit;
        if(noEqual)
        {
            judge = Number(data.value) <= Number(minValue) || Number(data.value) >= Number(maxValue)
            limitError = limitError.replaceAll('≤', '<');
        }
        if(judge)
        {
            hasError = true;
            var error = limitError.replace('%s', minText).replace('%s', name).replace('%s', maxText);
            label = '<div id="' + data.name + 'Label" class="text-danger help-text">' + error + '</div>';
            input.parent().append(label);
            return false;
        }
    });

    if(hasError) return false;
}


$(function()
{
    $('.nav-tabs').on('shown.zui.tab', function(e) {
        var type = $(e.target).attr('name');
        $("#distType").val(type);
        $(".dist-describe").html(dists[type].describe);
    });
    var $form = $('#dataform');
    if(window.validMsg && $form.length)
    {
        $form.ajaxForm({beforeSubmit: validateFormData});
        $form.on('change', function(event)
        {
            $(event.target).parent().find('.help-text').remove();
        });
    }
});
