/*****************************************************************************/
/*                                                                            */
/*        Desenvolvido pela 3Business - Soluções para Internet Ltda.          */
/*                        www.3business.com.br                                */
/*                     comercial@3business.com.br                             */
/*                                                                            */
/******************************************************************************/
/* Title: Biblioteca JS
 * Arquivo que contém as principais funções do sistema.
 */

/**
 * Topic: Como usar
 *
 * Saiba como usar as funções contidas no arquivo _biblio.js_.
 *
 * Para usar as funções desse arquivo, é necessário carregar a biblioteca jQuery,
 * <http://www.jquery.com/>, e o próprio arquivo biblio.js, usando o código:
 *
 * (start code)
 *
 * <script type='text/javascript' src='[raiz_sistema/]Inc/jquery-1.2.js'></script>
 * <script type='text/javascript' src='[raiz_sistema/]Inc/biblio.js'></script>
 *
 * (end)
 *
 */

/**
 * Topic: Carregando imagens
 *
 * Comandos para carregar imagens essenciais do sistema. Usa a função <preload_imagens>
 *
 * (start code)
 *
 *   var c = []; c["carregando"] = "Imagens/img-carregando.gif";
 *   var site_imagens = [];
 *   site_imagens = preload_imagens(c);
 *
 * (end)
 *
 * Esses comandos já estão incluídos no arquivo _biblio.js_ e assim que for carregado
 * no sistema, serão executados. Se deseja incluir outras imagens, edite este arquivo.
 *
 */
// carregando imagem de "carregando" ;)
var c = []; c["carregando"] = "Imagens/img-carregando.gif";
var site_imagens = [];
site_imagens = preload_imagens(c);

/**
 * Function: fmod
 *
 * Função usada para calcular o resto de uma divisão não exata. Usada nas funções
 * <valida_cnpj> e <valida_cpf>.
 *
 * Parâmetros:
 *
 *   div    - (int) número divisor
 *   divndo - (int) número dividendo
 *
 * Retorno:
 *
 *   (int) Retorna o resto da divisão.
 *
 */
function fmod(div,divndo){
  var res = Math.floor(div/divndo);
  var resto = div - (res*divndo);
  return resto;
  } // fmod

/**
 * Function: valida_cnpj
 *
 * Função para validação de cnpj.
 *
 * Parâmetros:
 *
 *   cnpj - (int) número do cnpj.
 *
 * Retorno:
 *
 *   (bool) Verdadeiro ou Falso conforme validação.
 *
 */
function valida_cnpj(cnpj){
  if (cnpj.length==14){
    var n_cnpj = cnpj.substr(0,12);
    /*a multiplicação deve ser feita duas vezes*/
    var x,y,k;
    var soma;
    var digit = new Array(3);
    digit[0] ='';
    var sbt;
    for(x=1; x<=2; x++){
      if(soma){
        soma= 0;
        n_cnpj = n_cnpj+digit[1];
        k = n_cnpj.length+1;//multiplicador
        sbt = 12;
        }
      else{
        soma = 0;
        k = n_cnpj.length+1;//multiplicador
        sbt = 11;
        }
      var fator = 2;
        /*algoritmo de soma*/
      for(y=k; y>=2; y--){
        soma = soma + n_cnpj.substr(sbt,1)*fator;
        sbt--;
        fator++;
        //----------
        if(fator > 9){
          fator = 2;
          }
        //-----------
        }
      var mod;
      /**/
      mod = fmod(soma,11);
      /**/
      digit[x] = 11 - mod;
      if(digit[x] >= 10){
        digit[x] = 0;
        }
      }
    var cnpj_gerado;
    cnpj_gerado = cnpj.substr(0,12)+digit[1]+digit[2];
    /*echo $cnpj_gerado*/
    if(cnpj == cnpj_gerado){
      return true;
      }
    else{
      return false;
      }
    }
  else{
    return false;
    }
  } // valida_cnpj

/**
 * Function: valida_cpf
 *
 * Função para validação de cpf.
 *
 * Parâmetros:
 *
 *   cpf - (int) número de cpf.
 *
 * Retorno:
 *
 *   (bool) Verdadeiro ou Falso conforme validação.
 *
 */
function valida_cpf(cpf){
    var x,y,k;
    var soma;
    var fim;
    var digit = new Array(3);
    var sbt;
    var mod;
    var cpf_gerado;
    digit[0] ='';
  if (cpf.length==11){
    var n_cpf = cpf.substr(0,9);
    /*a multiplicação deve ser feita duas vezes*/
    for(x=1; x<=2; x++){
      if(soma){
        soma = 0;
        fim = 1;
        k = n_cpf.length+2;
        n_cpf = n_cpf+digit[1];
        }
      else{
        soma = 0;
        fim = 2;
        k = n_cpf.length+1;
        }
      sbt = 0;
        /*algoritmo de soma*/
      for(y=k; y>=fim; y--){
        soma = soma + (n_cpf.substr(sbt,1)*y);
        sbt++;
        }
      mod = fmod(soma,11);
      digit[x] = 11 - mod;
      if(digit[x] >= 10){
        digit[x] = 0;
        }
      }
    cpf_gerado = cpf.substr(0,9)+digit[1]+digit[2];
    if(cpf == cpf_gerado){
      return true;
      }
    else{
      return false;
      }
    }
  else{
    return false;
    }
  } // valida_cpf


/**
 * Function: valida_data
 *
 * Função para validação de datas em javascript.
 * A validação é feita apenas por Expressão Regular.
 * Valida corretamente os dias dos meses.
 * NÃO há suporte a anos bissextos.
 *
 * *Nota:* implementar validação também data existente (Objeto Date).
 *
 * Parâmetros:
 *
 *   data - (string) valida string de input do formulário para datas no tipo dd/mm/aaaa.
 *
 * Retorno:
 *
 *   (bool) Verdadeiro ou Falso conforme validação.
 */
function valida_data(data) {
  var RegExPattern = /^((0[1-9]|[12]\d)\/(0[1-9]|1[0-2])|30\/(0[13-9]|1[0-2])|31\/(0[13578]|1[02]))\/\d{4}$/;

  if (data.match(RegExPattern))
    return true;
  else
    return false;
  } // valida_data


/**
 * Function: controle_caracteres
 *
 * Função que controla o número de caracteres permitidos para um campo de texto.
 * O contador de caracteres restantes é inserindo dinamicamente.
 *
 * Parâmetros:
 *
 * textarea  - (string) selector css para jQuery do elemento HTML que será controlado.
 * maximo    - [int] número máximo de caracteres. Default 1024.
 *
 * Retorno:
 *
 * (void) Esta função não retorna valores.
 *
 */
function controle_caracteres(textarea,maximo){
  maximo = parseInt(maximo) <= 0 ? 1024 : maximo;
  controle = "#controle";

  $(textarea).after("<span id='controle' style='font-weight:bold'>"+(maximo - $(textarea).val().length)+"</span>");/*<span id='controle'></span> caracteres restantes*/
  $(controle).wrap("<div></div>");
  $(textarea+" ~ div").append(" caracteres restantes");

  $(textarea).keyup(function (){
    var texto_html = $(this).val();

    if(texto_html.length > maximo) $(this).val( texto_html.substring(0, maximo) );

    var restantes = (maximo - texto_html.length);
    $(controle).text( (restantes < 0 ? 0 : restantes) );
  });
  } // controle_caracteres

/**
 * Function: redimenciona_janela
 *
 * Função para redimencionar uma janela aberta pelo sistema.
 *
 * Parâmetros:
 *
 *   w - (int) largura da janela
 *   h - (int) altura da janela
 *
 * Retortno:
 *
 * (void) Esta função não retorna valores.
 *
 */
function redimenciona_janela(W,H){
  window.resizeTo(W,H);
  var top = (screen.height-H)/2;
  var left = (screen.width-W)/2;
  window.moveTo(left,top);
  } // redimenciona_janela

/**
 * Function: atualiza_div
 *
 * Função para exibir mensagem com _fadeIn_ e _fadeOut_ em uma div.
 *
 * Parâmetros:
 *
 *   div   - (string) selector Css para a div. Veja <http://docs.jquery.com/Selectors>.
 *   msg   - (string) mensagem a ser exibida.
 *   tempo - [int] tempo em, milisegundos, para o _fadeIn_ e _fadeOut_. Default 1000.
 *
 * Retorno:
 *
 *   (void) Esta função não retorna valores.
 *
 */
function atualiza_div(div,msg,tempo){
  tempo = !tempo ? 1000 : tempo;
  $(div).fadeOut(tempo,function (){$(this).empty().append(msg).fadeIn(tempo);});
  } // atualiza_div

/**
 * Function: site_aviso
 *
 * *Deprecated* use <atualiza_div>. Função para exibir mensagem com _fadeIn_ e _fadeOut_ em uma div.
 *
 * Parâmetros:
 *
 * Veja <atualiza_div>.
 *
 */
function site_aviso(div,msg,tempo){
  atualiza_div(div,msg,tempo);
  } // site_aviso

function submit_padrao(form_id,elm_aviso,usa_aviso_carregando,funcao){
  usa_aviso_carregando = usa_aviso_carregando ? usa_aviso_carregando : false;
  funcao = funcao ? funcao : function(){ var retorno=[];retorno['retorno']=true;return retorno; };

  if(usa_aviso_carregando === true){
    if(site_imagens["carregando"].width == 0){
      $(form_id+" input").attr("disabled","disabled");
      $(site_imagens["carregando"]).load(function (){
        $(form_id+" input").attr("disabled","").filter(":first").focus();
      });
      } // if
    else{
      $(form_id+" input").attr("disabled","").filter(":first").focus();
      }

    function aviso_carregando(){
      ativa_mensagem_carregando(elm_aviso);
      }
    }
  else{
    function aviso_carregando(){ return true; }
    }

  $(form_id).submit(function (){

    var retorno = funcao();

    $(":input[name^=f_]:not([value=])",$(this)).removeClass("erro");

    if($(":input[name^=f_][value=]",$(this)).filter(":not([class=nao-requerido])").length > 0){
      site_aviso($(elm_aviso),"<div class='site_aviso_erro'><strong>Erro:</strong> você deve preencher todos os dados do formulário!</div>");
      $(":input[name^=f_][value=]",$(this)).filter(":not([class=nao-requerido])").addClass("erro")
                                           .filter(":first").focus();
      }
    else if( retorno['retorno'] ){
      $.ajax({
        url: $(this).attr("action"),
        type: $(this).attr("method"),
        dataType: "html",
        error: function (req,tipo,obj){
          site_aviso($(elm_aviso),"<div class='site_aviso_erro'><strong>Erro:</strong> Ocorreu erro em sua requisição.\nOperação cancelada.</div>");
          },
        success: function (retorno){
          site_aviso($(elm_aviso),retorno);
          },
        data: $(this.elements).serialize(),
        async: true,
        beforeSend: aviso_carregando
        }); // ajax
      }
    else { // função personalizada retornou false
      site_aviso($(elm_aviso),"<div class='site_aviso_erro'><strong>Erro:</strong> "+retorno['erro']+"</div>");
      }

    return false;
    });
  } // submit_padrao

/**
 * Function: fmt_bytes
 *
 * Função que calcular aproximadamente um número de bytes em Kilo,Mega,Giga e Tera bytes.
 *
 * Parâmetros:
 *   nro     - (int) número a ser calculado.
 *   m       - [string] indicador de estado de cálculo. Default vazio ('').
 *   convert - [string] indicador de conversão (no momento não implementado).
 *
 * Retorno:
 *
 * (string) Retorna o valor acompanhado da medida bytes.
 *
 * Exemplos:
 *
 * fmt_bytes(12312);      - Retorna ~13 MB
 * fmt_bytes(1231212423); - Retorna ~2 TB
 *
 */
function fmt_bytes(nro,m,convert){
  nro = nro ? nro : 0;
  m = m ? m.toLowerCase() : "";
  convert = convert? convert : 0; // default deve ser false; não implementado!
  var medidas = new Array("","K","M","G","T");
  var c;

  for(c in medidas){
    if(medidas[c] == m) break;
    } // for

  novo_c = parseInt(c)+1;
  novo_m = medidas[novo_c];

//   $("div").append("nro:"+nro+", m:'"+m+"' ");

  if(!medidas[novo_c] || nro.length <= 3){
    return "~"+nro+" "+m.toUpperCase()+"B";
    }
  else{
    return fmt_bytes( Math.ceil(parseInt(nro)/1024).toString() , novo_m );
    }
  } // fmt_bytes

/**
 * Function: exibir_propriedades_obj
 *
 * Exibe propriedades, eventos e função de um objeto. Função especialmente usada
 * para debug.
 *
 * Parâmetros:
 *
 *   anyobj  - (object) objeto javascript que se quer examinar.
 *   elm     - (string) Selector do container onde serão impressos as características do
 *             objeto. Normalmente uma div.
 *
 * Retorno:
 *
 * (void) Esta função não retorna valores.
 *
 */
function exibir_propriedades_obj(anyobj,elm) {        // display properties of an instance   or object
  for( var iter in anyobj ){     // iterate over all properties
    try{
      $(elm).append("<BR>Property " + iter + " is " +  anyobj[iter]);
      }
    catch(e){
      alert("Não funciona com "+iter);
      }
    }
  $(elm).append("<BR>");
  } // exibir_propriedades_obj

/**
 * Function: verifica_formulario
 *
 * Função que verifica os dados obrigatórios do formulário. Apenas os campos requeridos
 * devem ser passados por parâmetro.
 *
 * *Nota Importante:* esta função será reescrita e sofrerá modifciações.
 *
 * Parâmetros:
 *
 *   formulario  - (string) Seletor jQuery para formulário. Veja <http://docs.jquery.com/Selectors>.
 *   requerido   - (array) array associativo. O índice é jQuery Selector e o conteúdo
 *                 é a mensagem de erro.
 *   op          - (array) array com opções e funções de validação específico para
 *                 cada campo. O índice é o mesmo selector do registro em 'requerido'.
 *                 O atributo 'funcao' é a função para validação, aceitando apenas
 *                 um parâmetro que é o valor do campo vindo do formulário. O segundo
 *                 parametro é 'msg' com a mensagem de erro.
 *   ajax        - [bool] informa se deve submeter o formulário através de ajax.
 *                 Default é false.
 *   elmaviso    - [string] seletor do elemento HTML container da mensagem de erro e sucesso.
 *
 * Retorno:
 *
 * Retorna um array associativo com a seguinte estrutura
 *
 *   retorno - (bool) com valor validação dos dados.
 *   erro    - [string] com a mensagem de erro, se _retorno_ for *false*.
 *
 * Exemplos:
 *
 * Exemplo de uso (supondo-se que os parâmetros _dados_requeridos_ e _opcoes_ estejam
 * devidamente preenchidos):
 *
 * *1) Usando ajax:*
 * Caso parâmetro ajax seja *true* OU ajax seja *false* e elmaviso é um container
 * (string não vazia):
 *
 * (start code)
 *     $("selector para form").submit(function (){
 *       return verifica_formulario("selector para form",dados_requeridos,opcoes,true,"seletor para div de aviso");
 *     });
 * (end)
 *
 *
 * *2) Usando alert:*
 * Caso parâmetro ajax seja *false* e elmaviso é uma string vazia:
 *
 * (start code)
 *     $("selector para form").submit(function (){
 *       var retorno = verifica_formulario("selector para form",requisitos,opcoes);
 *       if(!retorno['retorno']) {
 *         site_aviso("seletor para div de aviso","<div class='site_aviso_erro'>"+retorno['erro']+"</div>");
 *         return false;
 *         }
 *       else {
 *         return true;
 *         }
 *     });
 * (end)
 *
 */
function verifica_formulario(formulario,requerido,op,ajax,elmaviso){
  ajax = (ajax ? true : false);
  elmaviso = (elmaviso ? elmaviso : false);

  if(!op) op = [[]];
  var erro = 0;
  var msg_erro = '';
  var valor;
  var retorno = [];

  for(var nome_campo in requerido){
    var valor = $(formulario+" "+nome_campo).val();
    if(!valor){
      if(erro < 10) msg_erro = msg_erro + requerido[nome_campo];
      erro++;
      }
    else
    // função para verificação
    if(op[nome_campo] && $.isFunction(op[nome_campo].funcao)){
      if(!op[nome_campo].funcao(valor)){
        if(erro < 10) msg_erro = msg_erro + op[nome_campo].msg;
        erro++;
        }
      }
    } // for

  if(erro > 0){
    msg_erro = (ajax ? "<strong>Erro:</strong> ":"") +
      "Não é possível enviar dados do formulário pois ocorreu um ou mais "+
      "erros no preenchimento" + (erro > 10 ? "\n(lista dos primeiros 10 erros de um total de "+erro+")":"") +
      ":"+ (elmaviso?'<br /><br />':'\n\n') + msg_erro;
    retorno["erro"] = msg_erro;
    retorno["retorno"] = false;
    }
  else{
    retorno["erro"] = "";
    retorno["retorno"] = true;
    }

  if(ajax){
    if(retorno["retorno"]){
      $.ajax({
        url: $(formulario).attr("action"),
        type: $(formulario).attr("method"),
        dataType: "html",
        error: function (req,tipo,obj){
          site_aviso($(elmaviso),"<div class='site_aviso_erro'><strong>Erro:</strong> Ocorreu erro em sua requisição.\nOperação cancelada.</div>");
          },
        success: function (retorno){
          site_aviso($(elmaviso),retorno);
          },
        data: $(formulario+" :input").serialize(),
        async: true,
        beforeSend: function (){ ativa_mensagem_carregando(elmaviso); }
      }); // ajax
      }
    else{
      site_aviso($(elmaviso),"<div class='site_aviso_erro'>"+retorno["erro"]+"</div>");
      }
    return false;
    }
  else {

    if(elmaviso && retorno['retorno'] === false){
      site_aviso($(elmaviso),"<div class='site_aviso_erro'>"+retorno["erro"]+"</div>");
      }
    else if(elmaviso && retorno['retorno'] === true){
      ativa_mensagem_carregando(elmaviso);
      }

    if(elmaviso)
      return retorno['retorno'];
    else
      return retorno;
    }
  } // verifica_formulario

/**
 * Function: ativa_mensagem_carregando
 *
 * Função auxiliar para exibir mensagem de carregando dados. Usado por funções que
 * ativam ajax.
 *
 * Parâmetros:
 *
 *   elm_aviso   - (string) este parâmetro é o seletor do elemento container para a mensagem.
 *   msg         - (string) mensagem alternativa. Default é "Carregando...".
 *   class       - (string) classe css para a div.
 *
 * Retorno:
 *
 * (void) Esta função não retorna valores.
 *
 */
function ativa_mensagem_carregando(elm_aviso,msg,classe) {
  msg = typeof msg != 'undefined' ? msg : "Carregando...";
  classe = typeof classe != 'undefined' ? classe : "site_avisos";
  $(elm_aviso).html("<div class='"+classe+"'>"+msg+" <img></div>");
  $(elm_aviso+" img").attr({
    src: site_imagens["carregando"].src,
    width: site_imagens["carregando"].width,
    height: site_imagens["carregando"].height
    });
  $(elm_aviso).show(1);
  } // ativa_mensagem_carregando

/**
 * Function: preload_imagens
 *
 * Função para carregar imagens dinamicamente.
 *
 * Parâmetros:
 *
 *   lista - (array) array simples com o endereço das imagens.
 *
 * Retorno:
 *
 * (array) o índice é o caminho da imagem de entrada e o valor o objeto HTML img.
 *
 */
function preload_imagens(lista){
  var img = []
  for(i in lista){
    img[i] = new Image;
    img[i].src = lista[i]
    img[i].alt = i
    }
  return img;
  } // preload_imagens

/**
 * Function: preload_imagens_menu
 *
 * Carrega imagens _up_ e _over_ de botões de menu.
 *
 * Parâmetros:
 *
 *   lista - (array) igual a <preload_imagens>.
 *
 * Para cada elemento no array, é criado 2 elementos, incluindo um sufixo _-up_ e _-over_
 * antes da extensão da imagem.
 *
 * Retorno:
 *
 *   (array) retorna um array idêntico a <preload_imagens>, mas sendo as imagens
 *   carregadas as imagens _up_ e _over_. No exemplo abaixo, a variável _i_ possui
 *   quatro elementos,
 *
 * Exemplo:
 *
 * (start code)
 *   var ii = [];
 *   ii["primeira"] = "Imagens/menu/pag-primeira.png";
 *   ii["seguinte"] = "Imagens/menu/pag-seguinte.png";
 *   var i = preload_imagens_menu(ii);
 *
 *   for(j in i){
 *     alert("Índice '"+j+"' e valor '"+i[j].src+"'");
 *     }
 * (end)
 *
 * Retornará os seguintes valores
 *
 * "Índice 'primeira-up' e valor 'Imagens/menu/pag-primeira-up.png'".
 *
 * "Índice 'primeira-over' e valor 'Imagens/menu/pag-primeira-over.png'".
 *
 * "Índice 'seguinte-up' e valor 'Imagens/menu/pag-seguinte-up.png'".
 *
 * "Índice 'seguinte-over' e valor 'Imagens/menu/pag-seguinte-over.png'".
 *
 */
function preload_imagens_menu(lista){
  var nlista = []
  var path,antes,depois;
  for(i in lista){
    path = lista[i].split("\.");
    antes = path.slice(0,-1).join(".");
    depois = path.slice(-1).join(".");
    nlista[i+"-up"] = lista[i].replace(antes+".",antes+"-up.");
    nlista[i+"-over"] = lista[i].replace(antes+".",antes+"-over.");
    }
  return preload_imagens(nlista);
  } // preload_imagens_menu

/**
 * Function: criar_menu_js
 *
 * Cria menu em js, usando imagens para mouseover e mouseout.
 *
 * Parâmetros:
 *
 *   container     - (string) selector CSS para o contâiner de links de menu.
 *   imagens_lista - (array) array associativo, cujos índices são os atributos _name_
 *                   de cada link contido no parâmetro _container_, e os valores
 *                   são arrays numéricos cujo primeiro índice é o caminho da imagem,
 *                   desde a raiz do site e sem o sufixo _-up_ ou _-over_ mas com
 *                   a extensão da imagem, e o segundo índice é a mensagem de _hint_.
 *                   do menu, em texto.
 *
 * Retorno:
 *
 * (void) Esta função não retorna valores. Os links do _container_ são modificados
 * para exibirem as imagens de _up_ e _over_ automaticamente.
 *
 */
function criar_menu_js(container,imagens_lista){
  var nome,id,link_href;
  var botoes = [];

  var hints = [];
  var nlista = [];

  for(i in imagens_lista){
    if(imagens_lista[i][0]){
      nlista[i] = imagens_lista[i][0];
      hints[i] = imagens_lista[i][1];
      }
    else{
      break;
      }
    }

  var imagens = preload_imagens_menu(nlista[i] ? nlista : imagens_lista);

  // carrega nomes de botões carregados
  for(i in imagens){
    $(imagens[i]).load(function (){
      var indice = $(this).attr("alt");
      var nome = indice.replace(/\-(up|over)/,"");
      if(indice.indexOf("-up") > 0) {

        // adiciona imagem dentro do link;
        var selector = container+" a[name="+nome+"]";
        $(container+" a[name="+nome+"]").css({display: "block",float:"left"}).append("<img>");
        $(selector+" img").attr({
          src:imagens[nome+"-up"].src,
          width: imagens[nome+"-up"].width,
          height: imagens[nome+"-up"].height,
          title: hints[nome]
          });

        // hovers
        $(container+" a[name="+nome+"]").hover(
          function (){
            var n = $(this).attr("name");
            $(container+" a[name="+n+"]"+" img").attr({
              src: imagens[n+"-over"].src,
              width: imagens[n+"-over"].width,
              height: imagens[n+"-over"].height
              });
            },
          function (){
            var n = $(this).attr("name");
            $(container+" a[name="+n+"]"+" img").attr({
              src: imagens[n+"-up"].src,
              width: imagens[n+"-up"].width,
              height: imagens[n+"-up"].height
              });
            });
        } // if botão é 'up'

    }); // imagens load
    } // for imagens

  } // criar_menu_js2

/**
 * Function: dados_transporte
 *
 * Transforma o nome das variáveis do formulário. Usado por funções ajax, de modo
 * que veriáveis GET e POST possam ser enviados conjuntamente. É necessário códigos
 * em PHP para funcionar completamente.
 *
 * Esta função foi criada para contornar um problema incomum: algumas vezes,
 * no escritório ou na 3Business, requisições ajax não funcionam perfeitamente
 * fazendo com que apenas GET ou apenas POST funcionem.
 *
 * *Não é aconselhável utilização.*
 *
 */
function dados_transporte(formulario,metodo){
  var url = $(formulario).attr("action");
  var query_string = url.substr(url.indexOf("?")+1);
  var params = query_string.split("&");
  var nparams,nurl;
  nparams = [];
  for(var i in params){
    nparams.push(metodo.toUpperCase()+"__"+params[i].replace(metodo.toUpperCase()+"__",""));
    }
  nurl = url.substr(0,url.indexOf("?")+1)+nparams.join("&");
  $(formulario).attr("action",nurl);
  } // dados_transporte

/**
 * Function: forcarCasasDecimais
 *
 *   Força número de casas decimais de um número, indicando número de casas.
 *
 * Parâmetros:
 *
 *   n - (int || float) Número a ser formatado. Deve estar em notação americana (ponto em separador decimal, se houver).
 *   c - [int] Número de casas decimais que se quer formatar.
 *
 * Retorno:
 *
 *   (string) Retorna o número em notação americana, com _c_ casas decimais.
 *
 */
function forcarCasasDecimais(n,c){
  c = c ? c : 2; // valor defautl;
  var casas='';
  var decimais= /\.[0-9]{1,2}/;
  var digitos = /\.\d*[0-9]/;
  var rg = decimais.exec(n);
  // forçar zeros à direita
  var teste = (rg ? String(rg).substr(1).length : 0);
  if(teste < c){
    for(x=teste; x<c; x++){
      casas = casas+'0';
      }
    }
  var valor = n.replace(digitos,"") + (rg ? rg : ".") + casas;
  return valor;
  } // forcarCasasDecimais

/**
 * Function: fmt_moeda()
 *
 *   Formata um número para formato desejado (_br_ ou _us_).
 *
 * Parâmetros:
 *
 *   n - (int || float) Número a ser formatado
 *   m - [string] Nome do formato. Atualmente é suportado _br_ e _us_.
 *
 * Retorno:
 *
 *   (string) Número no formato desejado, com 2 casas decimais.
 *
 */
function fmt_moeda(n,m){
  m = m ? m : 'br'; // formato default
  if(String(n).match(/\,/)) n = String(n).replace(/\,/,'.');
  else n = n ? String(n) : '0';
  var pesq,subst='';
  switch(m){
  default:
  case 'br':
    pesq = /\./;
    subst = ',';
    break;
  case 'us':
    pesq = /\,/;
    subst = '.';
    break;
    }
  return forcarCasasDecimais(n,2).replace(pesq,subst);
  } // fmt_moeda
