function trim(str) {
    return str.replace(/^\s+|\s+$/, '');
}

function chk_date(str) { // Para verificar datas. Formato aceito: dd/mm/yyyy
    var msg = "";
    var err = 0;
    var arr = str.split('/');

    if (!(
           (!isNaN(arr[0]) && (arr[0] > 0) && (arr[0] < 32))
        && (!isNaN(arr[1]) && (arr[1] > 0) && (arr[1] < 13))
        && (!isNaN(arr[2]) && (arr[2] > 1900) && (arr[2] < 2099))
    )) err = 1;

    if (err>0) msg = "A data informada é inválida.";
    return msg;
}

function chk_date_fut(str) { // Para verificar datas no futuro. Formatos aceitos: dd/mm/yyyy; mm/yy.
    var msg = "";
    var err = 0;
    var arr = str.split('/');

    var day; var mon; var year;

    if (arr.length==2) {
        day  = 31;
        mon  = arr[0];
        year = arr[1];
    } else {
        day  = arr[0];
        mon  = arr[1];
        year = arr[2];
    }

    var theDate = day + '/' + mon + '/' + year;
    msg = chk_date(theDate);
    if (msg != '') return msg;

    var today = new Date();
    theDate   = new Date();
    theDate.setFullYear(year, (parseInt(mon,10)-1), day);
    if (theDate < today) err = 1;

    if (err>0) msg = "A data informada é passada. Data não aceita.";
    return msg;
}

function chk_ccard(str) {
    var msg = "";
    var err = 0;

    str = str.replace(/\D/g, '');
    if (str.length < 15) {
        err = 1;
    }

    if (err>0) msg = "O número de cartão de crédito informado é inválido.";
    return msg;
}

function chk_cep(str) {
    var msg = "";
    var err = 0;

    str = str.replace(/\D/g, '');
    if (str<1000000) {
        err = 1;
    }

    if (err>0) msg = "O CEP informado é inválido.";
    return msg;
}

function chk_cel(str) {
    var msg = "";
    var err = 0;

    str = str.replace(/\D/g, '');
    if (str.length==10) {
        var cod = str.substr(0,2);
        var num = str.substr(2,8);

        if (cod<11) err = 2;
        if (num<70000000) err = 3;

        if (num==77777777) err = 5;
        if (num==88888888) err = 5;
        if (num==99999999) err = 5;
    } else {
        err = 1;
    }

    if (err>0) msg = "O telefone móvel informado é inválido.";
    return msg;
}

function chk_tel(str) {
    var msg = "";
    var err = 0;

    str = str.replace(/\D/g, '');
    if (str.length==10) {
        var cod = str.substr(0,2);
        var num = str.substr(2,8);

        if (cod<11) err = 2;
        if (num<10000000) err = 3;
        if (num>69999999) err = 4;

        if (num==11111111) err = 5;
        if (num==22222222) err = 5;
        if (num==33333333) err = 5;
        if (num==44444444) err = 5;
        if (num==55555555) err = 5;
        if (num==66666666) err = 5;
    } else {
        err = 1;
    }

    if (err>0) msg = "O telefone fixo informado é inválido.";
    return msg;
}

function chk_select(sel) {
    var msg = "";

    var ind = sel.selectedIndex;
    if ((!sel.options[ind].value)||(sel.options[ind].value<1)) msg = "Seleção de lista não definida.";

    return msg;
}

function chk_radio(radio) {
    var msg = "";
    var ch  = "none";

    for (i=0; i<radio.length; i++) {
        //radio[i].className = "opcao";
        if (radio[i].checked) ch = i;
    }

    if (ch=="none") {
        msg = "Campo de seleção não escolhido.";
        //for (i=0; i<radio.length; i++) {
        //  radio[i].className = "err";
        //}
    }

    return msg;
}

function chk_int(str) {
    var msg = (isNaN(str)) ? str + " não é um número inteiro." : "";
    return msg;
}

function chk_fullname(str) {
    var msg = "";
    var err = 0;

    var name = str.split(" ");
    if (!name[1]) err++;

    if (err>0) msg = "Digite o nome completo.";

    return msg;
}

function chk_address(str) {
    var msg = "";
    var err = 0;

    var name = str.split(" ");
    if (!name[1]) err++;

    if (err>0) msg = "O endereço deve ter um Tipo de Logradouro e o próprio Logradouro.";

    return msg;
}

function chk_login(str) {
    var msg = "";
    var err = 0;

    var valid   = new RegExp(/^[A-Za-z0-9_\-\.]+$/);
    var invalid = new RegExp(/__|\-\-|\.\./);

    if (valid.test(str)) {
        if (invalid.test(str)) err = 2;
        if (str.length<4) err = 1;
    } else {
        err = 1;
    }

    if (err>0) msg = "O login digitado é inválido. Um login válido deve ter no mínimo 4 caracteres, entre letras, números, traços e pontos. Não repita traços ou pontos em seqüência.";

    return msg;
}

function chk_email(str) {
    var msg = "";
    var err = 0;
    var atind  = str.indexOf("@");
    var dotind = str.indexOf(".",(atind+1));

    //new RegExp(/^[A-Za-z0-9_\-\.]+@[A-Za-z0-9_\-\.]{2,}\.[A-Za-z0-9]{2,}(\.[A-Za-z0-9])?/);
    if ((str.indexOf(",")>0)||(str.indexOf("..")>0)) err += 1;
    if (
        (atind<1)
        || (str.indexOf("@",(atind+1))>0)
        || (str.indexOf(".",(atind+1))==(atind+1))
        || (str.indexOf(".",(atind-1))==(atind-1))
    ) err += 1;
    if (
        (dotind<1)
    ) err += 1;

    if (err>0) msg = str + " não é e-mail válido.";

    return msg;
}

function chk_cpf(str) {
    var msg = "";
    var err = 0;

    var ini = str;
    str = str.replace(/\D/g, "");

    var tipo;
    if (str.length == 11) {
        tipo = "CPF";
    } else if (str.length == 14) {
        tipo = "CNPJ";
    } else {
        tipo = "Documento";
        err  = 1;
    }

    if ((err == 0) && (tipo == "CNPJ")) {
        var a = [];
        var b = new Number;
        var c = [6,5,4,3,2,9,8,7,6,5,4,3,2];

        for (i=0; i<12; i++){
            a[i] = str.charAt(i);
            b += a[i] * c[i+1];
        } if ((x = b % 11) < 2) { a[12] = 0; } else { a[12] = 11-x; }

        b = 0;
        for (y=0; y<13; y++) {
            b += (a[y] * c[y]);
        }

        if ((x = b % 11) < 2) { a[13] = 0; } else { a[13] = 11-x; }
        if ((str.charAt(12) != a[12]) || (str.charAt(13) != a[13])) err += 1;
    } else if (err == 0) {
        var c  = str.substr(0,9);
        var dv = str.substr(9,2);
        var d1 = 0;

        for (i=0; i<9; i++) {
            d1 += c.charAt(i)*(10-i);
        } if (d1==0) err += 1;

        d1 = 11 - (d1 % 11);
        if (d1>9) d1 = 0;
        if (dv.charAt(0) != d1) err += 1;

        d1 *= 2;
        for (i=0; i<9; i++) {
            d1 += c.charAt(i)*(11-i);
        } d1 = 11 - (d1 % 11);

        if (d1>9) d1 = 0;
        if (dv.charAt(1) != d1) err += 1;
    }

    if (err > 0) msg = ini + " não é " + tipo + " válido.";
    return msg;
}

function validar_form(frm,pairs) {
    if (frm["submit"]) frm["submit"].disabled = true;

    var msg   = "";
    var first = "";
    var empty = 0;
    var chars = 0;

    var pair = pairs.split(",");
    for (var i in pair) if (i<pair.length) {
        var rel = pair[i].split("=");
        var fn  = rel[0];
        var f   = frm[fn];
        var t   = rel[1];
        var min = rel[2]; if (isNaN(min)) min = 0;

        var err  = 0;
        var tmsg = '';
        var cls  = new Array();
        if (f.className) {
            cls = f.className.split(" ");
            f.className = '';
            for (i in cls) if (i<cls.length) {
                if ((cls[i]!="")&&(cls[i]!="err")) f.className += " "+cls[i];
            }
        }

        if ((t=="radio")||(t=="select")) {
            tmsg = eval("chk_"+t+"(f)");
            if (tmsg!="") {
                empty++;
                err++;
            }

            if (t=="radio") {
                var div = document.getElementById(fn+"_div");
                if (div) {
                    cls = div.className.split(" ");
                    div.className = '';

                    for (i in cls) if (i<cls.length) {
                        if ((cls[i]!="")&&(cls[i]!="err_rotulo")) div.className += " "+cls[i];
                    }

                    if (tmsg!="") div.className += " err_rotulo";
                }
            }

            tmsg = "";
        } else {
            var val = trim(f.value);
            f.value = val;

            if (val!="") {
                if ((t=="int") && (min != "")) {
                    var ival = parseInt(val,10);
                    if (ival < min) {
                        chars++;
                        err++;
                    } else {
                        tmsg = chk_int(val);
                    }
                } else if ((min>0) && (val.length<min)) {
                    chars++;
                    err++;
                } else if (t) {
                    tmsg = eval("chk_"+t+"(val)");
                }
            } else {
                empty++;
                err++;
            }
        }

        if ((tmsg != "") || (err > 0) || (chars > 0)) {
            if (tmsg) msg += (msg) ? "<br>" + tmsg : tmsg;
            if (t!='radio') {
                f.className += " err";
                if (first=='') first = f;
            }
        }
    }

    if ((msg != "")||(empty > 0)||(chars > 0)) {
        if (empty>0) {
            if (msg) msg += "<br>";
            msg = msg + empty + " campo(s) obrigatório(s) não preenchido(s).";
        }
        if (chars>0) {
            if (msg) msg += "<br>";
            msg = msg + chars + " campo(s) com menos caracteres que o necessário.";
        }
        msg += "<br><b>Verifique os campos sombreados</b>";
        msg += " e, quando houver, a ajuda, parando o ponteiro nos ícones ao lado dos campos.";

        avisar(msg);
        if (frm["submit"]) frm["submit"].disabled = false;
        if (first!='') first.focus();
        return false;
    } else {
        if (frm["submit"]) frm["submit"].disabled = false;
        ocultar("aviso");
        return true;
    }
}
