// mostra mensagens na barra de status como se estivessem sendo digitadas
function Msg( cTexto ) {
    window.status = cTexto;
}

// validação de tipos comuns de campos
// sintaxe: na tag <input> incluir: onblur='Valida( this, nTipo, lRetVal );'
// nTipo: 0-texto  1-e-mail  2-numérico  3-data  4-placa  5-chassi (0-9 A-Z)
//        6-cpf/cgc  7-dígitos (0 a 9)  8-sem acentos
// lRetVal: true-retorna valor formatado  false:retorna true ou false para válido ou inválido
function Valida( oControle, nTipo, nRetVal ) {
    var valor = oControle.value, cMsg = "", lValido = false;
    Msg ( "" );
  
  
    if ( typeof( nRetVal ) == "undefined" ) { var nRet = 1; } else { var nRet = nRetVal; }
    if ( typeof( nTipo ) == "undefined" ) { nTipo = 0; }
    if ( valor != "" ) {
        switch ( nTipo ) {
            case 0:
                valor = ValidaTexto( valor );
                if ( valor == "" ) { cMsg = "texto inválido !"; } else { lValido = true; }
                break;
            case 1:
                valor = ValidaEmail( valor );
                if ( valor == "" ) { cMsg = "e-mail inválido !"; } else { lValido = true; }
                break;
            case 2:
                valor = ValidaNumerico( valor );
                if ( valor == "" ) { cMsg = "número inválido !"; } else { lValido = true; }
                break;
            case 3:
                valor = ValidaData( valor );
                if ( valor == "" ) { cMsg = "data inválida !"; } else { lValido = true; }
                break;
            case 4:
                valor = ValidaPlaca( valor );
                if ( valor == "" ) { cMsg = "placa inválida !"; } else { lValido = true; }
                break;
            case 5:
                valor = ValidaChassi( valor );
                if ( valor == "" ) { cMsg = "chassi inválido !"; } else { lValido = true; }
                break;
            case 6:
                valor = ValidaCPFCGC( valor );
                if ( valor == "" ) { cMsg = "CPF / CNPJ inválido !"; } else { lValido = true; }
                break;
            case 7:
                valor = ValidaDigitos( valor );
                if ( valor == "" ) { cMsg = "número inválido.\ndigite somente dígitos de 0 a 9 sem espaços!"; } else { lValido = true; }
                break;
            case 8:
                valor = ValidaAcento( valor );
                lValido = true;
                break;
            case 9:
				// Funcao que aceita virgula  ou ponto
                valor = ValidaNumericoN( valor );
                if ( valor == "" ) { cMsg = "número inválido !"; } else { lValido = true; }
                break;
            case 10:
				// Funcao que pega a quantidade de numero 
                valor = ValidaDigitos( valor );
                if ( oControle.value.length < 9) { cMsg = "número inválido!" } else { lValido = true; }
                break;
        }
        if ( lValido ) {
            if ( nRet == 1 ) { oControle.value = valor; } else { return true; }
        }
        else {
            if ( nRet == 1 ) {
                alert( cMsg );
                oControle.select();
                oControle.focus();
            }
            else {
                return false;
            }
        }
    }
}

// função complementar à Valida() para validar e-mail's
function ValidaTexto( cTexto ) {
    return JavaTrimUC( cTexto );
}

// função complementar à Valida() para validar e-mail's
function ValidaEmail( cEmail ) {
    var nArr = 0, cRet = "";
    cEmail = JavaTrimUC( cEmail );
    cEmail = cEmail.toLowerCase();
    if ( cEmail.indexOf( "@" ) > 0 && cEmail.indexOf( "@" ) < cEmail.length - 1 ) {
        if ( cEmail.length > 4 ) {
            if( cEmail.indexOf( "www." ) == -1 ) {
                cRet = cEmail;
            }
        }
    }
    return cRet;
}

// função complementar à Valida() para validar campos numéricos
function ValidaNumerico( cNumero ) {
    var lNum = true, nErr = 0;
    cNumero = JavaTrimUC( cNumero );
    // verifica se todos os dígitos são válidos
    for ( i = 0; i < cNumero.length; i++ ) {
        if ( "0123456789.-".indexOf( cNumero.substring( i, i + 1 ) ) < 0 ) {
            lNum = false;
        }
    }
    // verifica se só foi digitado um sinal ou um ponto
    if ( cNumero == "-" || cNumero == "." || cNumero == "-." || cNumero == ".-" ) { lNum = false; }
    if ( lNum == true ) {
        // verifica a posição e quantidade do sinal de negativo (-) caso haja
        for ( i = 0; i < cNumero.length; i++ ) {
            if ( "-".indexOf( cNumero.substring( i, i + 1 ) ) > -1 ) {
                nErr = i;
            }
        }
        if ( nErr <= 0 ) {
            // verifica a posição e quantidade de pontos (.)
            nErr = 0;
            for ( i = 0; i < cNumero.length; i++ ) {
                if ( ".".indexOf( cNumero.substring( i, i + 1 ) ) > -1 ) {
                    nErr++;
                }
            }
            if ( nErr > 1 ) { lNum = false; }
        }
        else {
            lNum = false;
        }
    }
    if ( !lNum ) { return ""; } else { return cNumero; }
}


// função complementar à Valida() para validar campos numéricos que aceitam ponto e virgula
function ValidaNumericoN( cNumero ) {
    var lNum = true, nErr = 0;
    cNumero = JavaTrimUC( cNumero );
    // verifica se todos os dígitos são válidos
    for ( i = 0; i < cNumero.length; i++ ) {
        if ( "0123456789.-,".indexOf( cNumero.substring( i, i + 1 ) ) < 0 ) {
            lNum = false;
        }
    }
    // verifica se só foi digitado um sinal ou um ponto ou virgula
    if ( cNumero == "-" || cNumero == "." || cNumero == "," || cNumero == "-." || cNumero == ".-" ) { lNum = false; }
    if ( lNum == true ) {
        // verifica a posição e quantidade do sinal de negativo (-) caso haja
        for ( i = 0; i < cNumero.length; i++ ) {
            if ( "-".indexOf( cNumero.substring( i, i + 1 ) ) > -1 ) {
                nErr = i;
            }
        }
        if ( nErr <= 0 ) {
            // verifica a posição e quantidade de pontos (.)
            nErr = 0;
            for ( i = 0; i < cNumero.length; i++ ) {
                if ( ".".indexOf( cNumero.substring( i, i + 1 ) ) > -1 ) {
                    nErr++;
                }
            }
            if ( nErr > 1 ) { lNum = false; }
        }
        else {
            lNum = false;
        }
    }
    if ( !lNum ) { return ""; } else { return cNumero; }
}


// função complementar à Valida() para validar chassi
// 0-9 e A-Z sem pontos, traços, etc e tamanho = 17 ou 14 ou <=12
function ValidaChassi( cChassi ) {
    var lChas = true;
    var nNum = 0;
    cChassi = JavaTrimUC( cChassi )
    // verifica se todos os dígitos são válidos
    for ( i = 0; i < cChassi.length; i++ ) {
        if ( "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf( cChassi.substring( i, i + 1 ) ) < 0 ) {
            lChas = false;
        }
    }
    // verifica se, ao menos tres digitos são numéricos (0 a 9)
    for ( i = 0; i < cChassi.length; i++ ) {
        if ( "0123456789".indexOf( cChassi.substring( i, i + 1 ) ) >= 0 ) {
            nNum = nNum + 1;
        }
    }
    if( nNum < 3 ) { lChas = false; }
    // verifica o tamanho da string
    if( lChas ) {
        if( cChassi.length != 17 && ( cChassi.length > 14 || cChassi.length < 3 ) ) {
            lChas = false;
        }
    }
    if ( !lChas ) {
        // alert( "Chassi inválido\nPor favor digite somente números de 0 a 9 ou\nletras de A a Z sem pontos, traços ou separadores !" );
        return "";
    }
    else {
        return cChassi;
    }
}

// função complementar à Valida() para validar campos somente numéricos (sem pontos, traços, etc)
function ValidaDigitos( cNumero ) {
    var lNum = true;
    cNumero = JavaTrimUC( cNumero )
    // verifica se todos os dígitos são válidos
    for ( i = 0; i < cNumero.length; i++ ) {
        if ( "0123456789".indexOf( cNumero.substring( i, i + 1 ) ) < 0 ) {
            lNum = false;
        }
    }
    if ( !lNum ) {
        // alert( "por favor digite somente números de 0 a 9 sem pontos, traços ou separadores !" );
        return "";
    }
    else {
        return cNumero;
    }
}

// função complementar à Valida() para validar e formatar datas (dd/mm/aaaa)
function ValidaData( cData ) {
    var nD1, nD2, nDia, nMes, nAno, cAno, lData = false; lMes = true;
    cData = JavaTrim( cData );
    nD1 = cData.indexOf( "/" );
    if ( nD1 > 0 && nD1 + 1 < cData.length ) {
        nD2 = cData.indexOf( "/", nD1 + 1 );
    }
    if ( nD1 > 0 && nD2 > 0 && nD2 + 1 <= cData.length ) {
        nDia = parseInt( parseFloat( cData.substring( 0, nD1 ) ) );
        nMes = parseInt( parseFloat( cData.substring( nD1 + 1, nD2 ) ) );
        cAno = cData.substring( nD2 + 1, cData.length );
        nAno = parseInt( parseFloat( cAno ) );
        if ( nDia > 0 && nDia < 32 && nMes > 0 && nMes < 13 && nAno < 2100 && ( nAno > 0 || cAno == "0" || cAno == "00" || cAno == "000" ) ) {
            if ( nAno < 100 ) {
                if ( nAno > 30 ) { nAno = parseInt( nAno ) + 1900; } else { nAno = parseInt( nAno ) + 2000; }
            }
            if ( nAno >= 1900 ) {
                if ( ( nMes == 2 || nMes == 4 || nMes == 6 || nMes == 9 || nMes == 11 ) ) {
                    if ( nMes == 2 ) {
                        if ( nAno % 4 != 0 ) { if ( nDia > 28 ) { lMes = false; } }
                        else { if ( nDia > 29 ) { lMes = false; } }
                    }
                    else { if ( nDia > 30 ) { lMes = false; } }
                }
                if ( lMes ) {
                    lData = true;
                    if ( nDia < 10 ) { nDia = "0" + nDia; }
                    if ( nMes < 10 ) { nMes = "0" + nMes; }
                    return ( nDia + "/" + nMes + "/" + nAno );
                }
            }
        }
    }
    if ( !lData ) {
        return "";
    }
}

// função complementar à Valida() para validar placas de veículos
function ValidaPlaca( cPlaca ) {
    var lPlaca = false;
    cPlaca = JavaTrimUC( cPlaca );
    if ( cPlaca.length == 6 || cPlaca.length == 7 ) {
        if ( cPlaca.length == 6 ) {
            var cLetras = cPlaca.substring( 0, 2 );
            var cNumeros = cPlaca.substring( 2, 6 );
        }
        else {
            var cLetras = cPlaca.substring( 0, 3 );
            var cNumeros = cPlaca.substring( 3, 7 );
        }
        lPlaca = true;
        for ( i = 0; i < cLetras.length; i++ ) {
            if ( "ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf( cLetras.substring( i, i + 1 ) ) < 0 ) {
                lPlaca = false;
            }
        }
        for ( i = 0; i < cNumeros.length; i++ ) {
            if ( "0123456789".indexOf( cNumeros.substring( i, i + 1 ) ) < 0 ) {
                lPlaca = false;
            }
        }
    }
    if ( !lPlaca ) { return ""; } else { return cPlaca; }
}

// função complementar à Valida() para validar CPF's e CGC's
function ValidaCPFCGC( cCPFCGC ) {
    cCPFCGC = JavaTrimUC( cCPFCGC );
    // verifica se é CPF valido ( 11 dígitos )
    if ( cCPFCGC.length == 11 ) {
        var nDig1 = 0, nDig2 = 0, lVal = false;
        // verifica se não é repetição de números ( 11111111111, 22222222222, etc )
        for ( i = 0; i < 11; i++ ) {
            if ( cCPFCGC.substring( i, i + 1 ) != cCPFCGC.substring( 0, 1 ) ) { lVal = true; }
        }
        for ( i = 10; i > 1; i-- ) {
            nDig1 += parseInt( cCPFCGC.substring( 10 - i, 11 - i ) ) * i;
        }
        for ( i = 11; i > 1; i-- ) {
            nDig2 += parseInt( cCPFCGC.substring( 11 - i, 12 - i ) ) * i;
        }
        nDig1 = ( nDig1 * 10 ) % 11;
        nDig2 = ( nDig2 * 10 ) % 11;
        if ( nDig1 == 10 ) { nDig1 = 0; }
        if ( nDig2 == 10 ) { nDig2 = 0; }
        if ( nDig1 != cCPFCGC.substring( 9, 10 ) || nDig2 != cCPFCGC.substring( 10, 11 ) || !lVal ) {
            // alert( "CPF inválido" );
            return "";
        }
        else {
            return cCPFCGC;
        }
    }
    else {
        // verifica se é CGC valido ( 14 dígitos )
        if ( cCPFCGC.length == 14 ) {
            var nMult1 = "543298765432", nMult2 = "6543298765432", nDig1 = 0, nDig2 = 0, lVal = false;
            for ( i = 0; i < 12; i++ ) {
                nDig1 += parseInt( cCPFCGC.substring( i, i + 1 ) ) * parseInt( nMult1.substring( i, i + 1 ) );
            }
            for ( i = 0; i < 13; i++ ) {
                nDig2 += parseInt( cCPFCGC.substring( i, i + 1 ) ) * parseInt( nMult2.substring( i, i + 1 ) );
            }
            nDig1 = ( nDig1 * 10 ) % 11;
            nDig2 = ( nDig2 * 10 ) % 11;
            if ( nDig1 == 10 ) { nDig1 = 0; }
            if ( nDig2 == 10 ) { nDig2 = 0; }
            if ( nDig1 != cCPFCGC.substring( 12, 13 ) || nDig2 != cCPFCGC.substring( 13, 14 ) ) {
                return "";
            }
            else {
                return cCPFCGC;
            }
        }
        else {
            return "";
        }
    }
}


// função complementar a Valida() para remover acentos e caracteres especiais
function ValidaAcento( cTexto ) {
    var cNew = "", nAux = 0;
    cTexto = cTexto.toLowerCase();
    for ( i = 0; i < cTexto.length; i++ ) {
        nAux = "áàãäâéèëêíìïîóòõöôúùüûýñç".indexOf( cTexto.substring( i, i + 1 ) );
        if ( nAux < 0 ) {
            cNew += cTexto.substring( i, i + 1 );
        }
        else {
            cNew += "aaaaaeeeeiiiiooooouuuuync".substring( nAux, nAux + 1 );
        }
    }
    return( cNew.toUpperCase() );
}

// Remove espaços em branco à direita e à esquerda de cExpr
function JavaTrim( cExpr ) {
    cExpr = JavaLTrim( cExpr );
    cExpr = JavaRTrim( cExpr );
    return cExpr;
}

// Remove espaços em branco à esquerda de cExpr
function JavaLTrim( cExpr ) {
    var nSpc;
    cExpr = cExpr.toString();
    nSpc = cExpr.length;
    for ( i = 0; i < cExpr.length; i++ ) {
        if ( cExpr.substr( i, 1 ) != " " ) { nSpc = i; i = cExpr.length; }
    }
    cExpr = cExpr.substring( nSpc, cExpr.length );
    return cExpr;
}

// Remove espaços em branco à direita de cExpr
function JavaRTrim( cExpr ) {
    var nSpc;
    cExpr = cExpr.toString();
    nSpc = 0;
    for ( i = cExpr.length - 1; i >= 0; i-- ) {
        if ( cExpr.substr( i, 1 ) != " " ) { nSpc = i; i = 0; }
    }
    cExpr = cExpr.substring( 0, nSpc + 1 );
    return cExpr;
}

// Remove espaços e converte para maiúsculas
function JavaTrimUC( cExpr ) {
    return JavaTrim( cExpr.toUpperCase() );
}

// converte yyyymmdd em dd/mm/yyyy
function CData1( cTexto ) {
    return cTexto.substring( 6, 8 ) + "/" + cTexto.substring( 4, 6 ) + "/" + cTexto.substring( 0, 4 );
}

// converte dd/mm/yyyy em yyyymmdd
function CData2( cTexto ) {
    return cTexto.substring( 6, 10 ) + cTexto.substring( 3, 5 ) + cTexto.substring( 0, 2 );
}
