/**
  * Valida um e-mail fornecido pelo usuário.
  *
  * Funcionamento:
  *
  *   As características de um e-mail válido são:
  *     - o simbolo arroba ( @ )
  *     - ausência de espaços
  *     - um ou mais caracteres válidos antes e depois da arroba ( @ )
  *     - uma identificação do país do tipo .xx ou a terminação .com, .net,
  *       .edu, .mil, .gov ou .org no final
  *
  * @access public
  * @since 1.0
  * @param string str_id Id do campo que recebe o e-mail
  * @return boolean Se estiver tudo ok -> true, caso contrário -> false
  */
function VerificaEmail( obj_campo )
{
    //Isso deve ficar em apenas uma linha!
    var boo_OK = obj_campo.value.match(/\b(^(\S+@).+((\.com)|(\.net)|(\.edu)|(\.mil)|(\.gov)|(\.org)|(\..{2,2}))$)\b/gi);

    if ( boo_OK )
    {
        return( true );
    }
    else
    {
        return( false );
    }
}


/**
  * Valida um formulário.
  *
  * A função recebe como parâmetro um array tridimensional contendo na primeira
  * posição o nome do campo, na segunda, uma mensagem de errro, caso o campo
  * não seja preenchido corretamente, e na terceira posição (opcional) uma
  * identificação informando se uma verificação adicional deve ser feita e o
  * nome do formulário onde estão os campos da lista. Todos os campos
  * independente do tipo são verificados.
  *
  * Ex. Array:
  *
  * arr_validar[0][0] = "EMAIL";
  * arr_validar[0][1] = "O Campo \"Email\" DEVE ser preenchido";
  * arr_validar[0][2] = "email";
  *
  * @access public
  * @since 1.0
  * @param string str_form Nome do formulário onde estão os campos
  * @param array Array tridimensional contendo campo, msg. erro e tipo (opc)
  * @return boolean Se estiver tudo ok -> true, caso contrário -> false
  */
function VerificaForm( str_form, arr_validar )
{
    var obj_form   = window.document.forms[str_form];
    var boo_return = true;

    for ( var num_i = 0; num_i < arr_validar.length; num_i++ )
    {
        var obj_campo = obj_form.elements[(arr_validar[num_i][0])];

        if ( arr_validar[num_i].length == 3 )
        {
            switch ( arr_validar[num_i][2] )
            {
                case "email":
                    if ( !VerificaEmail( obj_campo ) )
                    {
                        alert( "O e-mail fornecido NÃO é valido!" );
                        obj_campo.focus();
                        obj_campo.select();
                        boo_return = false;
                    }
                break;
            }
        }

        //NodeList é a classe que representa um radiobox
        //NodeList
        if ( obj_campo instanceof Array )
        //if ( obj_campo[0] != undefined )
        {
            str_tipo = obj_campo[0].type;
        }
        else
        {
            str_tipo = obj_campo.type;
        }

        switch ( str_tipo )
        {
            case "hidden":
                if ( obj_campo.value.length == 0 )
                {
                    alert( arr_validar[num_i][1] );
                    return( false );
                }
            break;

            case "textarea":
            case "password":
            case "text":
                if ( obj_campo.value.length == 0 )
                {
                    alert( arr_validar[num_i][1] );
                    obj_campo.focus();
                    obj_campo.select();
                    return( false );
                }
            break;

            case "select-one":
            case "select-multiple":
                if (   ( obj_campo.selectedIndex == -1 )
                    || ( obj_campo.value.length == 0 ) )
                {
                    alert( arr_validar[num_i][1] );
                    obj_campo.focus();
                    return( false );
                }
            break;

            case "radiobox":
            case "checkbox":
            case "radio":
            case "check":
                var num_marcados = 0;

                for ( num_j = 0; num_j < obj_campo.length; num_j++)
                {
                    if ( obj_campo[num_j].checked )
                    {
                        ++num_marcados;
                    }
                }

                if ( num_marcados == 0 )
                {
                    alert( arr_validar[num_i][1] );
                    return( false );
                }
        }
    }
    return ( boo_return );
}


/**
  * Monta e valida uma data no formato aceito pelo mySQL.
  *
  * @access public
  * @since 1.0
  * @param object obj_form Formulário onde estão os campos
  * @param string str_dia Nome do campo contendo o dia
  * @param string str_mes Nome do campo contendo o mes
  * @param string str_ano Nome do campo contendo o ano
  * @param string str_hidden Nome do campo oculto onde ficará a data formatada
  */
function MontaDataBD( obj_form, str_dia, str_mes, str_ano, str_hidden )
{
    var str_dia          = obj_form.elements[str_dia].value;
    var str_mes          = obj_form.elements[str_mes].value;
    var str_ano          = obj_form.elements[str_ano].value;
    var obj_campo_oculto = obj_form.elements[str_hidden];
    var obj_data         = new Date();

    obj_data.setFullYear( str_ano, ( str_mes - 1 ), str_dia );

    obj_campo_oculto.value = str_ano + "-" + str_mes + "-" + str_dia;

    if ( str_dia.charAt( 0 ) == '0' )
    {
        str_dia = str_dia.charAt( 1 );
    }

    if ( str_mes.charAt( 0 ) == '0' )
    {
        str_mes = str_mes.charAt( 1 );
    }

    if (   ( obj_data.getMonth() != parseInt( str_mes ) - 1 )
        || ( obj_campo_oculto.value.length < 10 ) )
    {
        obj_campo_oculto.value = '';
    }
}


/**
  * Monta e valida uma data/hora no formato aceito pelo mySQL.
  *
  * @access public
  * @since 1.0
  * @param object obj_form Formulário onde estão os campos
  * @param string str_dia Nome do campo contendo o dia
  * @param string str_mes Nome do campo contendo o mes
  * @param string str_ano Nome do campo contendo o ano
  * @param string str_hora Nome do campo contendo a hora
  * @param string str_minuto Nome do campo contendo o minuto
  * @param string str_segundo Nome do campo contendo o segundo
  * @param string str_hidden Nome do campo oculto onde ficará a data formatada
  */
function MontaDataHoraBD(  obj_form, str_dia, str_mes, str_ano
                         , str_hora, str_minuto, str_segundo, str_hidden )
{
    var str_dia          = obj_form.elements[str_dia].value;
    var str_mes          = obj_form.elements[str_mes].value;
    var str_ano          = obj_form.elements[str_ano].value;
    var str_hora         = obj_form.elements[str_hora].value;
    var str_minuto       = obj_form.elements[str_minuto].value;
    var str_segundo      = obj_form.elements[str_segundo].value;
    var obj_campo_oculto = obj_form.elements[str_hidden];
    var obj_data         = new Date();

    obj_data.setFullYear( str_ano, ( str_mes - 1 ), str_dia );
    obj_data.setHours( str_hora, str_minuto, str_segundo );

    obj_campo_oculto.value = str_ano + "-" + str_mes + "-" + str_dia;
    obj_campo_oculto.value += " " + str_hora + ":" + str_minuto + ":" + str_segundo;

    if ( str_dia.charAt( 0 ) == '0' )
    {
        str_dia = str_dia.charAt( 1 );
    }

    if ( str_mes.charAt( 0 ) == '0' )
    {
        str_mes = str_mes.charAt( 1 );
    }

    if ( str_hora.charAt( 0 ) == '0' )
    {
        str_hora = str_hora.charAt( 1 );
    }

    if (   ( obj_data.getHours() != parseInt( str_hora ) )
        || ( obj_data.getMonth() != parseInt( str_mes ) - 1 )
        || ( obj_campo_oculto.value.length < 10 ) )
    {
        obj_campo_oculto.value = '';
    }
}


/**
  * Monta um número de telefone a partir de partes do mesmo, como DDI, DD
  * e número.
  *
  * @access public
  * @since 1.0
  * @param object obj_form Formulário onde estão os campos
  * @param string str_ddi Nome do campo contendo o DDI
  * @param string str_dd Nome do campo contendo o DD
  * @param string str_numero Nome do campo contendo o número do telefone
  * @param string str_hidden Nome do campo oculto onde ficará o telefone
  */
function MontaTelefoneBD( obj_form, str_ddi, str_dd, str_numero, str_hidden )
{
    var str_ddi          = obj_form.elements[str_ddi].value;
    var str_dd           = obj_form.elements[str_dd].value;
    var str_numero       = obj_form.elements[str_numero].value;
    var obj_campo_oculto = obj_form.elements[str_hidden];

    obj_campo_oculto.value = "+" + str_ddi + " (" + str_dd + ") " + str_numero;

    if ( obj_campo_oculto.value.length < 15 )
    {
        obj_campo_oculto.value = '';
    }
}


/**
  * Remove os acentos e muda para uppercase
  * o conteúdo de um campo de formulário.
  *
  * @access public
  * @since 1.0
  * @param object obj_campo Referência ao objeto do campo
  */
function RetiraAcentos( obj_campo )
{
    var str_acentos   = "áàãââÁÀÃÂéêÉÊíÍóõôÓÔÕúüÚÜçÇabcdefghijklmnopqrstuvxwyz";
    var str_traducao  = "AAAAAAAAAEEEEIIOOOOOOUUUUCCABCDEFGHIJKLMNOPQRSTUVXWYZ";
    var num_posicao   = -1;
    var str_caractere = "";
    var str_temp      = "";

    for ( var num_i = 0; num_i < obj_campo.value.length; num_i++)
    {
        str_caractere = obj_campo.value.charAt( num_i );
        num_posicao   = str_acentos.indexOf( str_caractere );

        if ( num_posicao > -1 )
        {
            str_temp += str_traducao.charAt( num_posicao );
        }
        else
        {
            str_temp += obj_campo.value.charAt( num_i );
        }
    }

    obj_campo.value = str_temp;
}


/**
  * Transforma uma seleção de checkbox em uma string, onde os valores são
  * separados por pip ( | ).
  *
  * A função retorna a string num campo qualquer, em geral oculto. Há também
  * a opção, no último parâmetro, de definir uma opção padrão, ou seja, uma
  * opção que resume todas as outras. Exemplo de opções num grupo de checkbox:
  * Período:
  * [] Todos
  * [] Manhã
  * [] Tarde
  * [] Noite
  *
  * No caso acima, a primeira opção resume todas as outras, portanto, quando
  * marcada os outros campos devem ser desmarcados para não haver incoerência.
  *
  * @access public
  * @since 1.0
  * @param object obj_campo Campo a ser processado
  * @param string str_nom_oculto Nome do campo onde as inforações serão gravadas
  * @param integer num_padrao (opcional) Índice no grupo checkbox do campo padrão
  */
function CtrlChbox( obj_campo, str_nom_oculto, num_padrao )
{
    var obj_form   = obj_campo.form;
    var obj_chkgrp = obj_form.elements[( obj_campo.name )];
    var obj_oculto = obj_form.elements[( str_nom_oculto )];
    var num_sel  = 0;

    if ( ( num_padrao != null ) && ( num_padrao != undefined ) )
    {
        obj_chkgrp[num_padrao].checked = false;
    }

    //Limpa o campo antes de continuar
    obj_oculto.value = '';

    for ( var num_i = 0; num_i < obj_chkgrp.length; num_i++ )
    {
        if ( obj_chkgrp[num_i].checked )
        {
            ++num_sel;
            obj_oculto.value += obj_chkgrp[num_i].value + "|";
        }
    }

    if ( num_sel == 0 )
    {
        obj_oculto.value = '';
    }

    if ( obj_oculto.value.length > 0 )
    {
        obj_oculto.value = obj_oculto.value.substr( 0, obj_oculto.value.length - 1 );
    }
}


/**
  * Desmarca todos os checkbox do mesmo grupo, exceto o próprio campo.
  *
  * @access public
  * @since 1.0
  * @param object obj_campo Referência ao objeto do campo
  */
function DesSelChbox( obj_campo )
{
    var obj_form   = obj_campo.form;
    var obj_chkgrp = obj_form.elements[( obj_campo.name )];

    for ( var num_i = 0; num_i < obj_chkgrp.length; num_i++)
    {
        if ( obj_campo != obj_chkgrp[num_i] )
        {
            obj_chkgrp[num_i].checked = false;
        }
    }
}


function ApenasNumeros( obj_evento )
{
    //var str_tecla;
    //Bom, as coisas mudam um pouco com o IE,
    //então prevemos esse problema aqui...
    if ( window.event )
    {
        str_tecla = obj_evento.keyCode;
    }
    else if( obj_evento.which )
    {
        str_tecla = obj_evento.which;
    }

    if ( ( str_tecla != 8 ) || ( str_tecla < 48 || str_tecla > 57 ) )
    {
        return (   ( ( str_tecla > 47 ) && ( str_tecla < 58 ) )
                || ( str_tecla == 8 ) );
    }

    return ( true );
}


function NumeroReal( obj_evento, str_separador )
{
    //var str_tecla;
    //Bom, as coisas mudam um pouco com o IE,
    //então prevemos esse problema aqui...
    if ( window.event )
    {
        str_tecla = obj_evento.keyCode;
    }
    else if( obj_evento.which )
    {
        str_tecla = obj_evento.which;
    }

    if (   ( str_tecla == str_separador.charCodeAt( 0 ) )
        || ( str_tecla != 8 ) || ( str_tecla < 48 || str_tecla > 57 ) )
    {
        return (   ( ( str_tecla > 47 ) && ( str_tecla < 58 ) )
                || ( str_tecla == 8 )
                || ( str_tecla == str_separador.charCodeAt( 0 ) ) );
    }

    return ( true );
}


/**
  * A partir de um registro no banco de dados, monta uma data composta por
  * vários campos em HTML. As informações relativas à data são desmembradas
  * e cada qual é colocada no seu respectivo campo.
  *
  * OBS: Válida para o formato MySQL.
  *
  * @access public
  * @since 1.0
  * @param object obj_form Formulário onde estão os campos
  * @param string str_dia Nome do campo contendo o dia
  * @param string str_mes Nome do campo contendo o mes
  * @param string str_ano Nome do campo contendo o ano
  * @param string str_hidden Nome do campo oculto onde ficará a data formatada
  */
function MontaDataUser( obj_form, str_dia, str_mes, str_ano, str_hidden )
{
    var obj_campo_oculto = obj_form.elements[str_hidden];
    var arr_data;

    if ( obj_campo_oculto.value.indexOf( ' ' ) != -1 )
    {
        arr_data = obj_campo_oculto.value.split( ' ' );
        arr_data = arr_data[0].split( '-' );
    }
    else
    {
        arr_data = obj_campo_oculto.value.split( '-' );
    }

    if ( arr_data.length == 3 )
    {
        obj_form.elements[str_dia].value = arr_data[2];
        obj_form.elements[str_mes].value = arr_data[1];
        obj_form.elements[str_ano].value = arr_data[0];
    }
}


/**
  * A partir de um registro no banco de dados, monta uma data/hora composta por
  * vários campos em HTML. As informações relativas à data são desmembradas
  * e cada qual é colocada no seu respectivo campo.
  *
  * OBS: Válida para o formato MySQL.
  *
  * @access public
  * @since 1.0
  * @param object obj_form Formulário onde estão os campos
  * @param string str_dia Nome do campo contendo o dia
  * @param string str_mes Nome do campo contendo o mes
  * @param string str_ano Nome do campo contendo o ano
  * @param string str_hora Nome do campo contendo a hora
  * @param string str_minuto Nome do campo contendo o minuto
  * @param string str_segundo Nome do campo contendo o segundo
  * @param string str_hidden Nome do campo oculto onde ficará a data formatada
  */
function MontaDataHoraUser(  obj_form, str_dia, str_mes, str_ano
                           , str_hora, str_minuto, str_segundo, str_hidden )
{
    var obj_campo_oculto = obj_form.elements[str_hidden];
    var arr_data_hora;
    var arr_data;
    var arr_hora;

    arr_data_hora = obj_campo_oculto.value.split( ' ' );
    arr_data      = arr_data_hora[0].split( '-' );
    arr_hora      = arr_data_hora[1].split( ':' );

    if ( arr_data.length == 3 )
    {
        obj_form.elements[str_dia].value = arr_data[2];
        obj_form.elements[str_mes].value = arr_data[1];
        obj_form.elements[str_ano].value = arr_data[0];
    }

    if ( arr_hora.length == 3 )
    {
        obj_form.elements[str_hora].value    = arr_data[0];
        obj_form.elements[str_minuto].value  = arr_data[1];
        obj_form.elements[str_segundo].value = arr_data[2];
    }
}


/**
  * A partir de um registro no banco de dados, monta um número de telefone
  * composto por vários campos em HTML. As informações do número são
  * desmembradas e cada qual é colocada no seu respectivo campo.
  *
  * @access public
  * @since 1.0
  * @param object obj_form Formulário onde estão os campos
  * @param string str_ddi Nome do campo contendo o DDI
  * @param string str_dd Nome do campo contendo o DD
  * @param string str_numero Nome do campo contendo o número do telefone
  * @param string str_hidden Nome do campo oculto onde fica o telefone
  */
function MontaTelefoneUser( obj_form, str_ddi, str_dd, str_numero, str_hidden )
{
    var obj_campo_oculto = obj_form.elements[str_hidden];
    var arr_dados        = obj_campo_oculto.value.split( ' ' );

    if ( arr_dados.length == 3 )
    {
        obj_form.elements[str_ddi].value    = arr_dados[0].substring( 1, arr_dados[0].length );
        obj_form.elements[str_dd].value     = arr_dados[1].substring( 1, arr_dados[1].length - 1 );
        obj_form.elements[str_numero].value = arr_dados[2];
    }
}


/**
  * A partir das informações no banco, separadas por um delimitador, esta
  * função preenche um checkbox qualquer.
  *
  * @access public
  * @since 1.0
  * @param object obj_chkgrp Checkbox a se processado
  * @param string str_nom_oculto Nome do campo onde as inforações serão gravadas
  * @param integer str_delimitador Caractere que separa os dados
  */
function MontaChbox( obj_chkgrp, obj_oculto, str_delimitador )
{
    var arr_dados  = obj_oculto.value.split( str_delimitador );

    for ( var num_i = 0; num_i < arr_dados.length; num_i++ )
    {
        for ( var num_j = 0; num_j < obj_chkgrp.length; num_j++ )
        {
            if ( obj_chkgrp[num_j].value == arr_dados[num_i] )
            {
                obj_chkgrp[num_j].checked = true;
            }
        }
    }
}