/******************************************************************************/
/*                                                                            */
/*        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 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

function controle_caracteres(elmt_id,cont_id,maximo){
  maximo = parseInt(maximo) <= 0 ? 1024 : maximo;
  texto_html = document.getElementById(elmt_id);
  contador = document.getElementById(cont_id);
  if(texto_html.value.length >= maximo) texto_html.value = texto_html.value.substring(0, maximo);
  contador.innerHTML = maximo - texto_html.value.length;
  } // 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(){
      $(elm_aviso).html("<div class='site_avisos'>Carregando... <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);
      }
    }
  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

/**
 * 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 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 ativa_mensagem_carregando(elm_aviso) {
  $(elm_aviso).html("<div class='site_avisos'>Carregando... <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
