


/* ======================================================================================= */
/* Função que transforma um form em uma string que pode ser enviada por get                */
/* ======================================================================================= */
/** 
   idForm = id do form que será transformado
   
   --------------------------------------------------------------------------------------------------------
   p_apartir = Considerar a partir de qual posicao do "p_prefixo", pode ser util nos casos em que
               deve-se considerar tanto "_f_prefixo_campo1" como "nf_prefixo_campo2", sendo que neste caso
               se passar p_prefixo = 'f_prefixo' e p_apartir = '1' ele pegara tanto
               "_f_prefixo_campo1" quanto "nf_prefixo_campo2"
               ja se passar p_prefixo = 'f_prefixo' e p_apartir = '0' ele nao pegara nenhum dos dois
               e entao teria que passar ou p_prefixo = '_f_prefixo' ou p_prefixo = 'nf_prefixo'
   --------------------------------------------------------------------------------------------------------            
*/  
function jsger_BuscaElementosForm(idForm,p_prefixo,p_apartir,p_debug) 
{  
    var elementosFormulario = document.getElementById(idForm).elements;  
    var qtdElementos = elementosFormulario.length;  
    var queryString = "";  
    var elemento;  
  
    //Cria uma funcao interna para concatenar os elementos do form  
    this.ConcatenaElemento = function(nome,valor) {  
                                if (queryString.length>0) {  
                                    queryString += "&";  
                                }  
                                queryString += encodeURIComponent(nome) + "=" + encodeURIComponent(valor);  
                             };  
  
    //alert(p_prefixo);
    //alert(p_prefixo.length);
  
    //Loop para percorrer todos os elementos  
    for (var i=0; i<qtdElementos; i++) {  
        //Pega o elemento  
        elemento = elementosFormulario[i];
        
        if (!(elemento.name)) { continue; }

        if (p_debug) { alert(i + ' de ' + qtdElementos + ' eh -> ' + elemento.name); }
        
        vl_nome_ = elemento.name.substring(p_apartir,p_prefixo.length+p_apartir+1);
        vl_nome  = elemento.name.substring(p_apartir,p_prefixo.length+p_apartir);
        
        if (p_debug) { alert('[' + vl_nome_ + '] comparado com [' + p_prefixo+'_' + ']'); }
        
        if (!(vl_nome_ == p_prefixo+'_')) //Compara com sublinhado porque depois do prefixo sempre tem q ter um underline
           {                              // exemplo: prefixo "_pes"  a variavel deve ser "_fo_pes_nome",  "_fo_pes_id",  etc.. 
             continue;                    //          prefixo "_pesf" a variavel deve ser "_fo_pesf_nome", "_fo_pesf_id", etc..
           }  

        if (p_debug) { alert('ME SERVE => [' + elemento.name + '] >> ['+ vl_nome + ']'); }

        if (!elemento.disabled) {  
            //Trabalha com o elemento caso ele nao esteja desabilitado  
            switch(elemento.type) {  
                //Realiza a acao dependendo do tipo de elemento  
                case 'text': case 'password': case 'hidden': case 'textarea':  
                    this.ConcatenaElemento(elemento.name,elemento.value);
                    if (p_debug) { alert('CONTEUDO => [' + elemento.value + ']'); }
                    break;  
                case 'select-one':  
                    if (elemento.selectedIndex>=0) {  
                        this.ConcatenaElemento(elemento.name,elemento.options[elemento.selectedIndex].value);
                        if (p_debug) { alert('CONTEUDO => [' + elemento.options[elemento.selectedIndex].value + ']'); }
                    }  
                    break;  
                case 'select-multiple':  
                    for (var j=0; j<elemento.options.length; j++) {  
                        if (elemento.options[j].selected) {  
                            this.ConcatenaElemento(elemento.name,elemento.options[j].value);
                            if (p_debug) { alert('CONTEUDO => [' + elemento.options[j].value + ']'); }  
                        }  
                    }  
                    break;  
                case 'checkbox': case 'radio':  
                    if (elemento.checked) {  
                        this.ConcatenaElemento(elemento.name,elemento.value);  
                        if (p_debug) { alert('CONTEUDO => [' + elemento.name,elemento.value + ']'); }
                    }  
                    break;  
            }  
        }  
    }  
    
    return queryString;  
}



/* ======================================================================================= */
/* Função para checar os campos obrigatórios do formulario                                 */
/* ======================================================================================= */
/** 
   idForm    => id do form que será transformado
   p_preprefix_foco => A principio 'frm', que seria o campo equivalente ao elemento que esta sendo
                checado, que receberá o foco em caso de erro. Se o formulario que estiver sendo
                checado nao for virtual (*), este campo deverá vir vazio.
   p_prefixo => O prefixo a considerar, so pegara os campos do form, caso tenham este prefixo
   p_apartir => Para considerar o prefixo, ignora os X primeiros digitos 
                 ex: se passado 'p_prefixo' = 'pes' e 'p_apartir' = '3'
                     um campo '_fo_pes_xyz' seria considerado, pois discartando os 3 primeiros digitos
                     o prefixo é 'pes'  
   p_debug   => se for para debugar
   --------------------------------------------------------------------------------------------------------
               
   (*) campos virtuais sao implementados como hidden no form do script, porém os campos
       reais são definidos em um iframe, e apresentados no script utilizando-se o "innerHTML"
       porém, como até o momento o JS nao reconhece estes campos como campos de formulário, se fazem
       necessários estes campos virtuais.
       ...
   -------------------------------------------------------------------------------------------------------- 
*/            
function jsger_ChecaElementosForm(idForm,p_preprefix_foco,p_prefixo,p_apartir,p_debug) 
{  
    var elementosFormulario = document.getElementById(idForm).elements;  
    var qtdElementos  = elementosFormulario.length;  
    var queryString   = "";  
    var elemento;  
    var vl_requeridos = "";
    var vl_newline    = '\n'; 

    var vl_retorno    = new Array( );
    var vl_tabindex   = 9999999;
    var vl_campofoco  = "";
  
    //alert(p_prefixo);
    //alert(p_prefixo.length);
  
    //Loop para percorrer todos os elementos  
    for (var i=0; i<qtdElementos; i++) 
    {  
        //Pega o elemento  
        elemento = elementosFormulario[i];
        
        if (p_debug) { alert(i + ' de ' + qtdElementos + ' eh -> ' + elemento.name); }

        if (!(elemento.name)) { continue; }
        
        vl_nome_ = elemento.name.substring(p_apartir,p_prefixo.length+p_apartir+1);
        vl_nome  = elemento.name.substring(p_apartir,p_prefixo.length+p_apartir);

        vl_required = elemento.name.substring(2,3);        
        
        if (p_debug) { alert('[' + vl_nome_ + '] comparado com [' + p_prefixo+'_' + ']'); }
        
        if (!(vl_nome_ == p_prefixo+'_')) //Compara com sublinhado porque depois do prefixo sempre tem q ter um underline
           {                              // exemplo: prefixo "_pes"  a variavel deve ser "_fo_pes_nome",  "_fo_pes_id",  etc.. 
             continue;                    //          prefixo "_pesf" a variavel deve ser "_fo_pesf_nome", "_fo_pesf_id", etc..
           }  

        if (p_debug) { alert('ME SERVE => [' + elemento.name + '] >> ['+ vl_nome + '] obrig[' +  vl_required + ']\nConteudo[' + elemento.value + ']' ); }

        if (vl_required!='o')  // Se nao for obrigatorio, segue sem consistencia
           {
             continue;
           }

        if (!elemento.disabled) 
        {
        
        
            var vl_conteudo = '';
              
            //Trabalha com o elemento caso ele nao esteja desabilitado  
            switch(elemento.type) 
            {  
                //Realiza a acao dependendo do tipo de elemento  
                case 'text': case 'password': case 'hidden': case 'textarea':
                    var vl_conteudo = elemento.value; 
                    break;  
                case 'select-one':  
                    if (elemento.selectedIndex>=0) 
                    { 
                        var vl_conteudo = elemento.options[elemento.selectedIndex].value; 
                    }  
                    break;  
                case 'select-multiple':  
                    for (var j=0; j<elemento.options.length; j++) 
                    {  
                        if (elemento.options[j].selected) 
                        {
                            var vl_conteudo = elemento.options[j].value;  
                        }  
                    }  
                    break;  
                case 'checkbox': case 'radio':  
                    if (elemento.checked) 
                    {  
                        var vl_conteudo = elemento.value;  
                    }  
                    break;  
            } 
            
            
            if (vl_conteudo=="")
            {

              vl_retorno['erro'] = 'sim';

              //Checa qual é o numero do tabindex do campo em questao, e guarda o campo
              //com o tabindex menor, para assim que apresentar o erro, ja setar o foco no 
              //primeiro campo              
              if ( $(p_preprefix_foco + elemento.name).tabIndex ) 
                 { 
                   if ( $(p_preprefix_foco + elemento.name).tabIndex < vl_tabindex )
                      {
                        vl_tabindex  = $(p_preprefix_foco + elemento.name).tabIndex;
                        vl_campofoco = $(p_preprefix_foco + elemento.name).name;
                      } 
                 }


              //Se elemento tem o atributo "alt", guarda-o para apresentar a mensagem de
              //advertencia, apresentando o "alt" e nao o nome do campo
              //alert('O NOME É -> ' + elemento.id);
              //alert('O TITLE É -> ' + elemento.title);
              var vl_alt     = ( (elemento.alt != undefined) ? elemento.alt : elemento.title );
              vl_requeridos += ( (vl_alt!="") ? vl_newline + vl_alt : vl_newline + elemento.name );


              /*              
              substido pelas duas linhas acima 
              if (elemento.alt!="")
                 {
                   if (elemento.alt != undefined)
                      {
                        vl_requeridos += vl_newline + elemento.alt;
                      }
                  else     
                      {
                        vl_requeridos += vl_newline + elemento.title;
                      }  
                 }
               else              
                 {
                        vl_requeridos += vl_newline + elemento.name;
                 }
              */

              //alert('campo-> [' + elemento.name + '] alt[' + elemento.alt+ ']');

            }  

            var vl_newline = '\n';            
        }
          
    }

    // RETORNO
    // ----------------------------------------------------------------------------------------------
    // Retorna array com:
    //  -> requeridos => Campos requeridos que estao vazios
    //  -> tabindex   => Menor tabindex, para caso checagem for feita em outros forms tbem, ao obter  
    //                   este retorno sera possivel decidir em focar o menor tabindex retornado
    //  -> campofoco  => Campo de foco referente ao tabindex retornado
    vl_retorno['requeridos'] = vl_requeridos;
    vl_retorno['tabindex']   = vl_tabindex;
    vl_retorno['campofoco']  = vl_campofoco;
      
    return vl_retorno;
      
}



/* ======================================================================================= */
/* Função para checar as arrays retornadas de "jsger_ChecaElementosForm"                   */
/* ======================================================================================= */
/**
   p_req     => Arrays retornados de "jsger_ChecaElementosForm", onde os elementos do form foram
                checados e retornadas as descricoes dos que eram requeridos e que estavam vazios 
   p_diverro => Div que receberá a informação de que houve insucesso na efetivacao
   p_debug   => se for para debugar
   --------------------------------------------------------------------------------------------------------

   (*) Exemplo de checagem dos campos do form
       ...
       var vl_req = new Array( );
       vl_req[0]  = jsger_ChecaElementosForm('FPost', 'frm', '_pesfa', 3, false);
       vl_req[1]  = jsger_ChecaElementosForm('FPost', 'frm', '_pesf',  3, false); 
       vl_req[2]  = jsger_ChecaElementosForm('FPost', 'frm', '_pes',   3, false);
       
       if (jsger_ChecaErroMostraAdv(vl_req,'div_frm_mensagem',false)) { return false; } 
       ...
*/ 
function jsger_ChecaErroMostraAdv(p_req,p_diverro,p_debug) 
{ 
  var vl_requeridos  = "";
  var vl_tabindex    = 99999999;

  for (var vl_i1 = 0 ; vl_i1 <= (p_req.length-1) ; vl_i1++)    
      {  //se a sequencia de campos requeridos apresentou erro
         if (p_req[vl_i1].erro = 'sim')
         {  //checa se os campos requeridos foram informados
            if (p_req[vl_i1].requeridos)
            { //entao concatena o texto para que seja apresentado
              vl_requeridos += p_req[vl_i1].requeridos;
             
              //e checa se o tabindex da sequencia for o priomeiro campo
              if ( p_req[vl_i1].tabindex < vl_tabindex )
              { //entao prepara o foco para este campo 
                var vl_campofoco = p_req[vl_i1].campofoco; 
              } //tabindex
            } //requeridos
         } //erro
      } //for


  //Se há campos requeridos nao informados, entao apresenta a mensagem de erro
  //e retorna TRUE - houve erro, caso contrario retorna FALSE - nao houve erro
  if ( vl_requeridos.length>0 )
     {
       if (p_diverro) 
          { 
            $(p_diverro).innerHTML = '<span style="color:red;">Efetivação sem sucesso, informar campos requeridos.</span>';
          }  
       alert('Campos REQUERIDOS\n' +
             '------------------------------------------------------------------' + 
             vl_requeridos + 
             '\n------------------------------------------------------------------' +
             '\nPor favor, informe corretamente os campos acima.');
       if ($(vl_campofoco)) { $(vl_campofoco).focus(); }      
       return true;
     }
  else
     {
       return false;
     }  

}


/* ======================================================================================= */
/* Função que copia o conteudo dos campos do frm para o form principal                     */
/* ======================================================================================= */
/** 
   idForm    => id do form que será transformado
   p_preprefix_foco => A principio 'frm', que seria o campo equivalente ao elemento que esta sendo
                checado, que receberá o foco em caso de erro. Se o formulario que estiver sendo
                checado nao for virtual (*), este campo deverá vir vazio.
   p_prefixo => O prefixo a considerar, so pegara os campos do form, caso tenham este prefixo
   p_apartir => Para considerar o prefixo, ignora os X primeiros digitos 
                 ex: se passado 'p_prefixo' = 'pes' e 'p_apartir' = '3'
                     um campo '_fo_pes_xyz' seria considerado, pois discartando os 3 primeiros digitos
                     o prefixo é 'pes'  
   p_ignorar => array com campos a ignorar, pois serao tratados de forma personalizada na rotina chamadora (*)
   p_debug   => se for para debugar
   --------------------------------------------------------------------------------------------------------
               
   (*) exemplo, ignorando campos
       ...               
       vl_ignorar=new Array( );
       vl_ignorar[0] = '_fo_pesfa_fpg_id'; //sera movido de forma personalizada
       var vl_req_pesfa = jsger_CopyElementosForm('FPost', 'frm', '_pesfa', 3, vl_ignorar, false);
       ...
    se nao tivesse campo a ignorar seria false no parametro equivalente:
       var vl_req_pesfa = jsger_CopyElementosForm('FPost', 'frm', '_pesfa', 3, false, false); 
       ...
   -------------------------------------------------------------------------------------------------------- 
*/            
function jsger_CopyElementosForm(idForm,p_preprefix_foco,p_prefixo,p_apartir,p_ignorar,p_debug) 
{  
    var elementosFormulario = document.getElementById(idForm).elements;  
    var qtdElementos        = elementosFormulario.length;
    var elemento;  
  
    //alert(p_prefixo);
    //alert(p_prefixo.length);
  
    //Loop para percorrer todos os elementos do formulario em questao 
    for (var vl_i1=0; vl_i1<qtdElementos; vl_i1++) 
    {  
        //Pega o elemento  
        elemento = elementosFormulario[vl_i1];

        if (p_debug) { alert(vl_i1 + ' de ' + qtdElementos + ' eh -> ' + elemento.name); }

        //Se nao tiver nome, entao não considera
        if (!(elemento.name)) { continue; }
        
        vl_nome_ = elemento.name.substring(p_apartir,p_prefixo.length+p_apartir+1);
        vl_nome  = elemento.name.substring(p_apartir,p_prefixo.length+p_apartir);
        
        if (p_debug) { alert('[' + vl_nome_ + '] comparado com [' + p_prefixo+'_' + ']'); }
        
        //Caso o prefixo nao bater com o prefixo pretendido, ignora o elemento
        if (!(vl_nome_ == p_prefixo+'_')) //Compara com sublinhado porque depois do prefixo sempre tem q ter um underline
           {                              // exemplo: prefixo "_pes"  a variavel deve ser "_fo_pes_nome",  "_fo_pes_id",  etc.. 
             continue;                    //          prefixo "_pesf" a variavel deve ser "_fo_pesf_nome", "_fo_pesf_id", etc..
           }  

        if (p_debug) { alert('ME SERVE => [' + elemento.name + '] >> ['+ vl_nome + ']' + ' e conteudo sera -> ' + $(p_preprefix_foco + elemento.name).value ); }

        //Caso o elemento sirva, checa entao o equivalente do frame (q devera ter mesmo nome, porem com prefixo 'p_preprefix_foco' ("frm"),
        //     e entao obtem copia do seu conteudo
        if ( $(p_preprefix_foco + elemento.name) )
           {
             //A principio o elemento serve...
             vl_serve = true; 

             //mas checa se ele nao esta na lista dos elementos a ignorar (por ser tratado diretamente no chamador
             if ( p_ignorar )
                {
                   
                   for (var vl_i2 = 0 ; vl_i2 <= (p_ignorar.length-1) ; vl_i2++)    
                   { 
                      if (p_debug) { alert('ignorar [' + vl_i2 + ']-> ' + p_ignorar[vl_i2]); }
                      if (p_ignorar[vl_i2] == elemento.name) 
                         { 
                           vl_serve = false; 
                         }                      
                   }
                 }

             //Se serve, entao movimenta o 'value' e o 'alt' do 'frm_elemento' para o 'elemento'
             if ( vl_serve )
                {
                  elemento.value = $(p_preprefix_foco + elemento.name).value;
                  if ( $(p_preprefix_foco + elemento.name).alt ) { elemento.alt = $(p_preprefix_foco + elemento.name).alt; }
                  else
                   {
                    if ( $(p_preprefix_foco + elemento.name).title ) { elemento.alt = $(p_preprefix_foco + elemento.name).title; }
                   }
                }
           }
            
    }
      
    return true;
      
}





/* =========================================================================================== */
/* Função que cria campos e copia o conteudo dos campos do frm de grigs para o form principal  */
/*        Aplicado quando utilizado o form de input NAO for aberto dentro de um 'dv_pop'       */
/* =========================================================================================== */
/** 
   idForm           => id do form que será transformado
   p_preprefix_foco => A principio 'frm', que seria o campo equivalente ao elemento que esta sendo
                       checado, que receberá o foco em caso de erro. Se o formulario que estiver sendo
                       checado nao for virtual (*), este campo deverá vir vazio.
   p_grid_campo   s => Ma quande lingues coalesce, li grammatica del resultant lingue es plu simplic e regulari
                       quam ti del coalescent lingues. (*)
   p_grid           => 
                       ex: It solmen va esser necessi far uniform grammatica, pronunciation e plu sommun paroles.
                       Ma quande lingues coalesce, li grammatica del resultant lingue es plu simplic e regulari 
                       quam ti del coalescent lingues.
   p_campo_qtd      =>  
   p_ignorar => array com campos a ignorar, pois serao tratados de forma personalizada na rotina chamadora (*)
   p_debug   => se for para debugar
   --------------------------------------------------------------------------------------------------------  
   (*) exemplo, campos de equivalencia
       .  
       var vl_grid_campos = new Array( );
       vl_grid_campos[0]  = 'pesreg_reg_id';
       vl_grid_campos[0]  = 'pesreg_nome';
       jsger_CopyGridForm('FPost', 'frm', vl_grid_campos, 'frm_grid_pessoa_regiao[]', false);
       ...
 ---------------------------------------------------------------------------------------------------------- 
*/ 
function jsger_CopyGridForm(idForm,p_preprefix_foco,p_grid_campos,p_grid,p_campo_qtd,p_debug) 
{  
  //alert('estou aqui');

  var vl_chk = $(idForm).getElementsByTagName("input");
 
  /**
  * Apaga todos os campos de equivalencia que tenham sido previamente criados
  * -> Procura para todos os checkbox do form, por todos os campos "p_grid_campos", 
  *    caso exista algum previamente criado, entao devera se destruido. 
  **/
  var vl_i2=0;
  for(vl_i1=0; vl_i1<vl_chk.length; vl_i1++) {
     if ((vl_chk[vl_i1].type == "checkbox") && (vl_chk[vl_i1].name==p_grid)) {
        vl_i2 += 1;
        if ( p_grid_campos ) {
           for (var vl_i3 = 0 ; vl_i3 <= (p_grid_campos.length-1) ; vl_i3++) { 
              if ($(p_grid_campos[vl_i3] +'_' + vl_i2)) {
                  if (p_debug) { alert('campo [' + vl_i3 + ']-> ' + p_grid_campos[vl_i3]); }
                  $(idForm).removeChild($(p_grid_campos[vl_i3] +'_' + vl_i2)); 
              }
           }
        }
     }
  }

  //alert(vl_chk.length);
  //alert('p_grid [' + p_grid + ']');

  /**
  * Percorre todos os campos do form que sejam do tipo "checkbox" e que tenham o nome igual a "p_grid" 
  *                                      e que estejam marcados 
  */
  var vl_i2=0;
  for(vl_i1=0; vl_i1<vl_chk.length; vl_i1++) {
  
  
     //if (vl_chk[vl_i1]) {  if (vl_chk[vl_i1].type == "checkbox") { alert(vl_i1 + ' -> ' + vl_chk[vl_i1].name + ' vale =>' + vl_chk[vl_i1].value + ' esta =>' + vl_chk[vl_i1].checked);  }  }  
  
     if ((vl_chk[vl_i1].type == "checkbox") && (vl_chk[vl_i1].name==p_grid)) {
     
        if(vl_chk[vl_i1].checked  == true) {

           if (p_debug) { alert( 'Input de numero => [' + vl_i1 + '] é um => "' + vl_chk[vl_i1].name  + '"  é o checkbox numero => [' + vl_chk[vl_i1].value + ']'); }

           /**
           * Para cada checkbox marcado, cria os campos de equivalencia conforme nomes passados no array "p_grid_campos"
           * ex.: var vl_grid_campos = new Array( ); 
           *      vl_grid_campos[0]  = 'pesreg_codigo';
           *      vl_grid_campos[1]  = 'pesreg_nome';
           *      -> para esta simulacao, caso tenha 2 checkbox marcados, ele devera criar os campos
           *         pesreg_codigo_1, pesreg_nome_1 e pesreg_codigo_2, pesreg_nome_2 com o conteudo "value"
           *         dos campos "frm_pesreg_codigo_X" e "frm_pesreg_nome_X", onde "X" é o numero equivale
           *         ao checkbox respectivamente marcado.  
           */
           vl_i2 += 1;   
           if ( p_grid_campos ) {
              for (var vl_i3 = 0 ; vl_i3 <= (p_grid_campos.length-1) ; vl_i3++) {
                 if ($(p_preprefix_foco + '_' + p_grid_campos[vl_i3] +'_' + vl_i2)) {

                     if (p_debug) { alert('e o campo de equivalência -> [' + vl_i3 + '] é o -> [' + p_grid_campos[vl_i3] + '] e tem o CONTEUDO -> [' + $(p_preprefix_foco   + '_' + p_grid_campos[vl_i3] + '_' + vl_chk[vl_i1].value).value + ']'); }
                     vl_inp      = document.createElement('input');
                     var vl_form = $(idForm);
                     vl_form.appendChild(  vl_inp  );
                     vl_inp.setAttribute( 'name',  p_grid_campos[vl_i3] + '_' + vl_i2 );
                     vl_inp.setAttribute( 'id',    p_grid_campos[vl_i3] + '_' + vl_i2 );
                     vl_inp.setAttribute( 'value', $(p_preprefix_foco   + '_' + p_grid_campos[vl_i3] + '_' + vl_chk[vl_i1].value).value );
                     vl_inp.setAttribute( 'type',  'hidden' );
                     if (p_debug) { alert('criando [' + p_grid_campos[vl_i3] +'_' + vl_i2 + ']'); }
                 }
              }
              
              if (vl_i2>0) {
                     vl_inp2      = document.createElement('input');
                     vl_form.appendChild(  vl_inp2  );
                     vl_inp2.setAttribute( 'name',   p_campo_qtd );
                     vl_inp2.setAttribute( 'id',     p_campo_qtd );
                     vl_inp2.setAttribute( 'value',  vl_i2 );
                     vl_inp2.setAttribute( 'type',  'hidden' );
              }              
              
           }
        }
        }
  }
  
} //function



/* =========================================================================================== */
/* Função que cria campos e copia o conteudo dos campos do frm de grigs para o form principal  */
/*        Aplicado quando utilizado o form de input for aberto dentro de um 'dv_pop'           */
/* =========================================================================================== */
/** 
   idForm           => id do form que será transformado
   p_preprefix_foco => A principio 'frm', que seria o campo equivalente ao elemento que esta sendo
                       checado, que receberá o foco em caso de erro. Se o formulario que estiver sendo
                       checado nao for virtual (*), este campo deverá vir vazio.
   p_grid_campos    => Ma quande lingues coalesce, li grammatica del resultant lingue es plu simplic e regulari
                       quam ti del coalescent lingues. (*)
   p_grid           => 
                       ex: It solmen va esser necessi far uniform grammatica, pronunciation e plu sommun paroles.
                       Ma quande lingues coalesce, li grammatica del resultant lingue es plu simplic e regulari 
                       quam ti del coalescent lingues.
   p_campo_qtd      =>  
   p_campo_checked  => Campo que recebe true/false cfe frm_grid_pessoa_regiao[] estiver checkado
                       ex.: frm_ck_psrvset_checked_   p_ignorar => array com campos a ignorar, pois serao tratados de forma personalizada na rotina chamadora (*)
   p_debug   => se for para debugar
   --------------------------------------------------------------------------------------------------------  
   (*) exemplo, campos de equivalencia
       .  
       var vl_grid_campos = new Array( );
       vl_grid_campos[0]  = 'ck_psrvset_set_id';
       jsger_CopyGridForm_dvpop('FPost', 'frm', vl_grid_campos, 'frm_ck_grid_psrv_setor[]','ck_psrvset_qtd','ck_psrvset_checked', false);
       ...
 ---------------------------------------------------------------------------------------------------------- 
*/ 
function jsger_CopyGridForm_dvpop(idForm,p_preprefix_foco,p_grid_campos,p_grid,p_campo_qtd,p_campo_checked,p_debug) 
{  
  //alert('estou aqui no frm5');

  var vl_chk = $(idForm).getElementsByTagName("input");
 
 
  /**
  * Apaga todos os campos de equivalencia que tenham sido previamente criados
  * -> Procura para todos os campos de equivalencia ao checkbox criados no form, 
  *    identificados nos campos "p_grid_campos" (ex: 'ck_psrvset_set_id_1','ck_psrvset_set_id_2',etc...) 
  *    caso exista algum previamente criado, entao devera se destruido. 
  **/
  var vl_i4=0;
  var vl_i5=0;
  if ( p_grid_campos ) {

     for (var vl_i3 = 0 ; vl_i3 <= (p_grid_campos.length-1) ; vl_i3++) { 

        for (var vl_i4 = 1 ; vl_i4 <= 99999 ; vl_i4++) { 
 
           if (!$(p_grid_campos[vl_i3] +'_' + vl_i4)) { break; }
 
           if ($(p_grid_campos[vl_i3] +'_' + vl_i4)) {
              $(idForm).removeChild($(p_grid_campos[vl_i3] +'_' + vl_i4));
           }
        }
     }
  }


  /*
   alert('o frm_ck_psrvset_set_id_1 tem [' + $('frm_ck_psrvset_set_id_1').value + ']');
                                                    ck_psrvset_set_id
  */
  
  /**
  * 
  * -> Procura para todos os 'p_grid_campos' ... percorrendo os campos existentes no "dv_pop",
  *    identificados por 'p_grid_campos', porem com o prefixo 'p_preprefix_foco' (geralmente "frm_")
  * -> Para cada campo encontrado e checado, cria um elemento no form, sem o prefixo.
  *    Ex.: Encontrando o frm_ck_psrvset_set_id_1 cria o ck_psrvset_set_id_1 sem o prefixo
  *         O numero de sufixo nao mantera equivalencia, visto que os elementos criados
  *         terao uma seguencia a partir de 1 ("_1", "_2", etc...)
  *         ex.: frm_ck_psrvset_set_id_1 (checado) -> ck_psrvset_set_id_1 
  *              frm_ck_psrvset_set_id_2 (nao checado)
  *              frm_ck_psrvset_set_id_3 (checado) -> ck_psrvset_set_id_2 
  **/
  var vl_i4=0;
  var vl_i5=0;
  if ( p_grid_campos ) {
  
     for (var vl_i3 = 0 ; vl_i3 <= (p_grid_campos.length-1) ; vl_i3++) { 

        for (var vl_i4 = 1 ; vl_i4 <= 99999 ; vl_i4++) { 
 
           //alert('aqui4 [' + p_preprefix_foco + '_' + p_grid_campos[vl_i3] +'_' + vl_i4 + ']' );

           if (!$(p_preprefix_foco + '_' + p_grid_campos[vl_i3] +'_' + vl_i4)) { break; }
 
 
           //alert('aqui5 [' + p_preprefix_foco + '_' + p_campo_checked + '_' + vl_i4 + '][' + $(p_preprefix_foco + '_' + p_campo_checked + '_' + vl_i4).value + ']'); 
           if ($(p_preprefix_foco + '_' + p_campo_checked + '_' + vl_i4).value == true) {
   
   
              if ($(p_preprefix_foco + '_' + p_grid_campos[vl_i3] +'_' + vl_i4)) {
    
                  //alert('aqui7 ' + p_preprefix_foco + '_' + p_grid_campos[vl_i3] +'_' + vl_i4);
                  vl_i5++;

                  //if (p_debug) { alert('e o campo de equivalência -> [' + vl_i3 + '] é o -> [' + p_grid_campos[vl_i3] + '] e tem o CONTEUDO -> [' + $(p_preprefix_foco   + '_' + p_grid_campos[vl_i3] + '_' + vl_i3).value + ']'); }
                  vl_inp      = document.createElement('input');
                  var vl_form = $(idForm);
                  vl_form.appendChild(  vl_inp  );
                  vl_inp.setAttribute( 'name',  p_grid_campos[vl_i3] + '_' + vl_i5 );
                  vl_inp.setAttribute( 'id',    p_grid_campos[vl_i3] + '_' + vl_i5 );
                  vl_inp.setAttribute( 'value', $(p_preprefix_foco   + '_' + p_grid_campos[vl_i3] + '_' + vl_i4).value );
                  vl_inp.setAttribute( 'type',  'hidden' );
                  if (p_debug) { alert('criando [' + p_grid_campos[vl_i3] +'_' + vl_i5 + ']'); }
    
              }
           }
        }
     }
  }

  if (vl_i5>0) {
         //alert('aqui8 -> ['+vl_i5+']');
         vl_inp2      = document.createElement('input');
         vl_form.appendChild(  vl_inp2  );
         vl_inp2.setAttribute( 'name',   p_campo_qtd );
         vl_inp2.setAttribute( 'id',     p_campo_qtd );
         vl_inp2.setAttribute( 'value',  vl_i5 );
         vl_inp2.setAttribute( 'type',  'hidden' );
  }
  

} //function




/*                                                                                                */ 
/* marca/desmarca todos elementos encontrados que sejam checkbox e que tenham o prefixo informado */
/*                                                                                                */
/* 
 **/
function jsger_marcaGridCheckbox(idForm, on, p_name)
{

    var vl_elements = document.getElementById(idForm).elements;

    for( vl_i=1;vl_i < vl_elements.length; vl_i++ )
       {
          //alert('debug [' + vl_i + '] de [' + vl_elements.length + '][' + p_name + '][' + vl_elements[vl_i].name + ']');
          if (p_name != vl_elements[vl_i].name) { continue; }
          
          vl_elements[vl_i].checked = on;
       }   
}




/* ======================================================================================= */
/* Função para limpar os campos de um formulario, pelo prefixo                             */
/* ======================================================================================= */
/** 
   exemplo: jsger_limpaCampos('FPost','_f_ope_pes');
*/
function jsger_limpaCampos(p_form,p_prefixo) 
{
  vl_qtdCampos = (document.getElementById(p_form).elements.length-1);
  
  for (vl_x=0;vl_x<=vl_qtdCampos;vl_x++)
  {
     if (document.getElementById(p_form).elements[vl_x].name == undefined  ) { continue; }
     
     if (document.getElementById(p_form).elements[vl_x].name.substring(0,p_prefixo.length) == p_prefixo)
       {
         document.getElementById(p_form).elements[vl_x].value="";
       }
  }
}



/*                                    */
/* mascara generica em javascript     */
/*                                    */
/* 
/* exemplo: ... onKeyUp="mascaraCampos(event,'999.999.999-99')" 
 **/
function jsger_mascaraCampos(evento, mascara){  
      
    var campo, valor, i, tam, caracter;  
      
    if (document.all) // Internet Explorer  
       campo = evento.srcElement;  
    else // Nestcape, Mozzila  
        campo= evento.target;  
          
    valor = campo.value;  
    tam = valor.length;  
      
    for(i=0;i<mascara.length;i++){  
       caracter = mascara.charAt(i);  
       if(caracter!="9")   
          if(i<tam & caracter!=valor.charAt(i))  
             campo.value = valor.substring(0,i) + caracter + valor.substring(i,tam);  
                  
    }  
   
 } 



   

function jsger_hidden_cfe_select(obj_hidden,obj_testa,obj_focoS,obj_focoN)
{

   //alert($(obj_testa).value.substring(0,1));

   $(obj_hidden).style.display = (($(obj_testa).value.substring(0,1)=='N')?'none':'');
                              
   if ( $(obj_testa).value.substring(0,1)=='S' )
      {
        $(obj_focoS).focus();
      }
   else
      {
        $(obj_focoN).focus();
      }   

} 


/*                                                                                                */ 
/* Funcoes auxiliares para abrir janela modal com prototype.window                                */
/*                                                                                                */
/* 
 **/
var win = null;  //no modelo exemplo esta var estava sendo inicializada com null, ver se realmente é necessaria 
//var vg_proto_idx_win = 1;
function jsger_proto_openDialog(id,p_width,p_height) {
  
  try { if (vg_proto_idx_win=='undefined') { vg_proto_idx_win = 0; } } catch(ex) { vg_proto_idx_win = 0; }

  //alert(vg_proto_idx_win);
  
  //So abre se a janela esta fechada...
  if (vg_proto_idx_win==0) {
      vg_proto_idx_win++;
      Dialog.info($(id).innerHTML, {className: "alphacube",  width:p_width, height:p_height, id: "d" + vg_proto_idx_win})
  }
  
}


function jsger_proto_closeDialog(id) {

  try { if (vg_proto_idx_win=='undefined') { vg_proto_idx_win = 0; } else { vg_proto_idx_win--; } } catch(ex) { vg_proto_idx_win = 0; }
  
  Dialog.closeInfo();
}
  
function jsger_proto_lastDialog(id,p_width,p_height) {
  Dialog.info($(id).innerHTML, {className: "alphacube",  width:p_width, height:p_height, id: "d" + vg_proto_idx_win})
}

  
function jsger_proto_closeAllModalWindows() {
  Windows.closeAllModalWindows();
  return true;
}



/**
* retorna: 1 se hora inicial menor, 
*          2 se horas iguais e 
*          3 se segunda hora maior
*/
function jsger_comparaHoras(p_horaInicio, p_horaFim) {

  //DECLARAÇÃO DE VARIÁVEIS
  var vl_ip_horaInicio,    vl_ip_horaFim;
  var vl_iMinutoInicio,  vl_iMinutoFim;
  var vl_iSegundoInicio, vl_iSegundoFim;
  var vl_sLog;
  var vl_iReturn;
  var vl_bEncerrado;

  //SEPARA A HORA
  vl_ip_horaInicio = p_horaInicio.substring(0,2);
  vl_ip_horaFim = p_horaFim.substring(0,2);


  //SEPARA O MINUTO
  vl_iMinutoInicio = p_horaInicio.substring(3,5);
  vl_iMinutoFim = p_horaFim.substring(3,5);


  //SEPARA OS SEGUNDOS
  vl_iSegundoInicio = p_horaInicio.substring(6,8);
  vl_iSegundoFim = p_horaFim.substring(6,8);

  vl_bEncerrado = false;

  //COMPARA OS VALORES
  //HORA
  if (vl_ip_horaInicio != vl_ip_horaFim){
     if (vl_ip_horaInicio > vl_ip_horaFim){
        vl_sLog = "Hora inicial é maior 1";
        vl_iReturn = 1;
        vl_bEncerrado = true;  
     }
     else {
        vl_sLog = "Hora final é maior 2";
        vl_iReturn = 3;
        vl_bEncerrado = true;
     }
  }

  //SE NÃO RESOLVEU NA HORA, VERIFICA OS MINUTOS
  if (vl_bEncerrado == false && (vl_iMinutoInicio != vl_iMinutoFim)){
     if (vl_iMinutoInicio > vl_iMinutoFim){
        vl_sLog = "Hora inicial é maior 3";
        vl_iReturn = 1;
        vl_bEncerrado = true;
     }
     else {
        vl_sLog = "Hora final é maior 4";
        vl_iReturn = 3;
        vl_bEncerrado = true;
     }
  }

  //SE NÃO RESOLVEU NA HORA E NEM NOS MINUTOS, VERIFICA OS SEGUNDOS
  if (!vl_bEncerrado && (vl_iSegundoInicio != vl_iSegundoFim)){
     if (vl_iSegundoInicio > vl_iSegundoFim){
        vl_sLog = "Hora inicial é maior 5";
        vl_iReturn = 1;
        vl_bEncerrado = true;
     }
     else {
        vl_sLog = "Hora final é maior 6";
        vl_iReturn = 3;
        vl_bEncerrado = true;
     }
  }

  //SE vl_bEncerrado FOR FALSE, É PORQUE AS HORAS SÃO IGUAIS
  if (!vl_bEncerrado) {
     vl_sLog = "Horas iguais";
     vl_iReturn = 2;
  }

  //IMPRIME O LOG
  //alert(vl_sLog);
  return vl_iReturn;
  
}



