/******************************************************************************/
/*                                                                            */
/*        Desenvolvido pela 3Business - Soluções para Internet Ltda.          */
/*                        www.3business.com.br                                */
/*                     comercial@3business.com.br                             */
/*                                                                            */
/******************************************************************************/

// carregando imagem de "carregando" ;)
var c = []; c["carregando"] = "Imagens/img-carregando.gif";
var site_imagens = [];
site_imagens = preload_imagens(c);

function fmod(div,divndo){
  var res = Math.floor(div/divndo);
  var resto = div - (res*divndo);
  return resto;
  } // fmod

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(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(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.value.match(RegExPattern))
    return true;
  else
    return false;
  } // validateDate(fld)

function seleciona(formulario,nome,id){
  var elm = document.forms.namedItem(formulario).elements.namedItem(nome);

  for(var x = 0; x < elm.options.length; x++){
    if(elm.options[x].value == id){
      elm.selectedIndex = x;
      break;
      }
    }

  } // seleciona

/**
 * Função que controle o número de caracteres permitidos para um campo de texto,
 * inserindo o contador de caracteres restantes.
 *
 * Selector css para jQuery do elemento HTML que será controlado.
 * @param string textarea
 *
 * Número máximo de caracteres.
 * @param int maximo
 *
 * return void
 *
 */
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(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(div,msg,tempo){
  tempo = !tempo ? 1000 : tempo;
  $(div).fadeOut(tempo,function (){$(this).empty().append(msg).fadeIn(tempo);});
  } // 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

/**
 * fmt_bytes:
 *
 * Função que calcular aproximadamente um número de bytes em Kilo,Mega,Giga e Tera bytes.
 *
 * @param int     nro         Número a ser calculado
 * @param string  m           Indicador de estado de cálculo.
 * @param string  conver      Indicador de conversão (no momento não implementado).
 *
 * @return string Retorna o valor acompanhado da medida bytes.
 *
 *
 * @example fmt_bytes(12312);       Retorna ~13 MB
 * @example 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(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

/**
 * verifica_formulario:
 *
 * Função que verifica os dados obrigatórios do formulário. Apenas os campos requeridos
 * devem ser passados por parâmetro.
 *
 * @uses jquery-1.2
 *
 * jQuery Selector para formulário.
 * @param string formulario
 *
 * Array associativo. O índice é jQuery Selector e o conteúdo é a mensagem de erro.
 * @param array  requerido
 *
 * 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.
 * @param array  op
 *
 * Informa se deve submeter o formulário através de ajax. Default é false.
 * @param bool ajax
 *
 * Seletor do elemento HTML container da mensagem de erro e sucesso.
 * @param string elmaviso
 *
 * @return array      Retorna um array associativo com um índice 'retorno' com
 *                    valor boolean da validação dos dados e 'erro' com a mensagem
 *                    de erro.
 *
 *
 * Exemplo de uso (supondo-se que os parâmetros 'dados_requeridos' e 'opcoes' estejam
 * devidamente preenchidos):
 *
 * 1) caso parâmetro ajax seja 'true' OU
 *    ajax seja 'false' e elmaviso é um container (string não vazia):
 *
 *     $("selector para form").submit(function (){
 *       return verifica_formulario("selector para form",dados_requeridos,opcoes,true,"seletor para div de aviso");
 *     });
 *
 *
 * 2) caso parâmetro ajax seja 'false' e elmaviso é uma string vazia:
 *
 *     $("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;
 *         }
 *     });
 *
 */
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){
      erro++;
      msg_erro = msg_erro + requerido[nome_campo];
      }
    else
    // função para verificação
    if(op[nome_campo] && $.isFunction(op[nome_campo].funcao)){
      if(!op[nome_campo].funcao(valor)){
        erro++;
        msg_erro = msg_erro + op[nome_campo].msg;
        }
      }
    } // 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:"+ (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

/**
 * Função auxiliar para exibir mensagem de carregando dados.
 *
 * Este parâmetro é o seletor do elemento container para a mensagem.
 * @param string elm_aviso
 *
 * @return void
 *
 */
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(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(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(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 n = indice.replace(/\-(up|over)/,"");
      if(indice.indexOf("-up") > 0) { botoes.push(n); }

      for(ii in botoes){

        $("a[name="+botoes[ii]+"]").css({
            "backgroundImage": "url("+imagens[botoes[ii]+"-up"].src+")",
            width: imagens[botoes[ii]+"-up"].width,
            height: imagens[botoes[ii]+"-up"].height,
            display: "block",
            float:"left"
          }).attr({
            title: hints[botoes[ii]]
          });

        $("a[name="+botoes[ii]+"]").hover(function (){
            var n = $(this).attr("name");
            $(this).src = imagens[n+"-over"].src;
            $(this).css({
              "backgroundImage": "url("+imagens[n+"-over"].src+")",
              width:imagens[n+"-over"].width,
              height:imagens[n+"-over"].height
              });
          }, function (){
            var n = $(this).attr("name");
            $(this).css({
              "backgroundImage": "url("+imagens[n+"-up"].src+")",
              width:imagens[n+"-up"].width,
              height:imagens[n+"-up"].height
              });
          });

        } // for botoes

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

  } // criar_menu_js

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: carregaPagina
 *   Carrega o conteúdo de uma página dinamicamente, podendo personalizar funções
 *   de sucesso e ao enviar requisição ajax.
 *
 * Parâmetros:
 *   purl    - (string) Url para carregar a página dinamicamente. Pode ser enviados dados através deste endereço.
 *   confs   - (obj) Objeto de configuração javascript. As configurações aceitáveis são
 *
 *  - _divAviso_  - (string) selector jquery para a div para exibir mensagen de "carregando..."
 *  - _msg_       - (string) mensagem personalizada. Se não informada, será usada "Carregando...".
 *  - _sucesso_   - (função) função javascript quando o conteúdo da página for retornado. A função deve receber um parâmetro, que serão os dados html/javascritps retornados.
 *  - _aoEnviar_  - (função) função para ser ativada *antes* do envio de requisição ajax.
 *
 * Incompatibilidade de Argumentos:
 *   Quando a configuração _aoEnviar_ estiver sendo usada, as configurações _divAviso_
 *   e _msg_ não serão usados, pois servem para exibir mensagem padrão de "carregando".
 *   Tome cuidado nas configurações, pois se nem _divAviso_ nem _aoEnviar_ forem 
 *   passados, a função vai gerar um erro.
 *
 * Retorna:
 *   Não retorna valores.
 *
 * Exemplo de uso:
 *
 * (code)
     carregaPagina("index.php?pg=exemplo&txt=99",
                   { divAviso: "#aviso",
                     msg: "Carregando dados...",
                     sucesso: function (retorno){
                       alert('Dados recuperados!');
                     },
                     aoEnviar: function (){
                       $('#aviso').prepend( '<div><h1>Antes de enviar...</h1></div>' );
                     }
                   }
                  );
 * (end)
 *
 */
function carregaPagina(purl,confs){
 var elmaviso = typeof confs.divAviso != 'undefined' ? confs.divAviso : false;
 var msgCarregando = typeof confs.msg != 'undefined' ? confs.msg : "Carregando...";
 var fSucesso = typeof confs.sucesso != 'undefined' ? confs.sucesso : false;
 var fBefore = typeof confs.aoEnviar != 'undefined' ? confs.aoEnviar : false;
 
 if(!elmaviso && !$.isFunction(fBefore)){
   alert("Há um erro na configuração de carregamento dinâmico da página!\nVerifique as configurações de mensagens definidas para a função.");
   return;
 }
 
 $.ajax({
   url: purl,
   type: "get",
   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){
     if( $.isFunction(fSucesso) ){
       // retira mensagem de carregando
       if( !$.isFunction(fBefore) ) { $(elmaviso).html("");}
       fSucesso(retorno);
     } else {alert('sistema..');
       site_aviso($(elmaviso),retorno);
     }
   },
   //data: $(formulario+" :input").serialize(),
   async: true,
   beforeSend: function (){
     if( $.isFunction(fBefore) ){
       fBefore();
     } else {
       ativa_mensagem_carregando(elmaviso,msgCarregando); 
     }
   }
 }); // ajax  
} // carregaPagina
