/*
 * Script com funcoes utilitarias, de uso geral.
 *
 *
 * Copyright (c) 2006-2009 Bruno Guerchon Nunes
 *    Rio de Janeiro, RJ - Brasil.
 *    Todos os direitos reservados.
 *
 * Autor:
 *    Bruno Guerchon Nunes (bg_nunes@yahoo.com.br)
 *
 * Datas:
 *    08/03/2009 Implementacao inicial.
 *
 * Desde  1.00 08 Mar 2009
 * Versao 1.00 08 Mar 2009
 */

/* Mensagem de alerta exibida se o usuario estiver usando Internet Explorer. */
var MSG_ALERTA = "Você está usando o Internet Explorer?\n\nNão faça isso! " +
      "Realmente não vale a pena utilizar este navegador.\n\nFaça o " +
      "seguinte: acesse o site da Mozilla (www.mozilla.com), baixe\n e " +
      "instale o Firefox no seu computador. Acredite, ESTE SIM é um\n" +
      "navegador decente.\n\nInclusive, este site é melhor visualizado " +
      "com o Firefox.";

/* Mensagem de alerta exibida caso o objeto HTTP nao consiga ser recuperado. */
var MSG_HTTP_OBJ = "Seu navegador não suporta AJAX.";

/* Flag que indica a pagina onde a mensagem de alerta deve ser exibida. */
var DETECTAR_BROWSER = "detectar_browser";

/* Elemento que devera receber a data e a hora atuais. */
var ELEM_DATA_HORA = "cntDataHora";


/* Tamanho de fonte padrao na pagina exibida. */
var tamanhoFonte = 11;


// FUNCOES AUXILIARES

/**
 * Recupera um elemento HTML atraves do seu ID.
 *
 * Funcao facilitadora para recupera o elemento HTML cujo ID eh recebida como
 * parametro para a funcao.
 *
 * @param id - o ID do elemento HTML que deve ser recuperado
 *
 * @return O elemento HTML cujo ID foi recebido como parametro.
 */
function I(id) {
   return (document.getElementById(id));
}

/**
 * Exibe um elemento HTML na pagina.
 *
 * Recupera o elemento HTML a partir do ID recebido por parametro e modifica o
 * estilo de visibilidade deste, exibindo-o na pagina.
 *
 * @param id - o ID do elemento a ser exibido
 */
function exibir(id) {
   var obj = I(id);
   obj.style.visibility = "visible";
   obj.style.display = "block";
}

/**
 * Esconde um elemento HTML na pagina.
 *
 * Recupera o elemento HTML a partir do ID recebido por parametro e modifica o
 * estilo de visibilidade deste, escondendo-o na pagina.
 *
 * @param id - o ID do elemento a ser escondido
 */
function esconder(id) {
   var obj = I(id);
   obj.style.visibility = "hidden";
   obj.style.display = "none";
}

/**
 * Verifica se um elemento esta visivel ou nao.
 *
 * Recupera o elemento HTML a partir do ID recebido por parametro e verifica sua
 * visibilidade.
 *
 * @param id - o ID do elemento cuja visibilidade deve ser verificada
 *
 * @return True, se o elemento verificado esta visivel. False, se o elemento
 *          verificado nao esta visivel.
 */
function estaVisivel(id) {
   var obj = I(id);
   if ((obj.style.visibility == "visible") && (obj.style.display == "block")) {
      return (true);
   } else {
      return (false);
   }
}

/**
 * Habilita um elemento.
 *
 * Recupera o elemento HTML a partir do ID recebido por parametro e altera seu
 * atributo "disabled" para falso, habilitando-o.
 *
 * @param id - o ID do elemento que deve ser habilitado
 */
function habilitar(id) {
   $(id).disabled = false;
}

/**
 * Desabilita um elemento.
 *
 * Recupera o elemento HTML a partir do ID recebido por parametro e altera seu
 * atributo "disabled" para verdadeiro, desabilitando-o.
 *
 * @param id - o ID do elemento que deve ser habilitado
 */
function desabilitar(id) {
   $(id).disabled = true;
}

/**
 * Verifica se um elemento esta habilitado ou nao.
 *
 * Recupera o elemento HTML a partir do ID recebido por parametro e verifica se
 * esta habilitado ou desabilitado, atraves de seu atributo "disabled".
 *
 * @param id - o ID do elemento cuja habilitacao deve ser verificada
 *
 * @return False, se o elemento verificado esta habilitado. True, se o elemento
 *          verificado esta desabilitado.
 */
function estaDesabilitado(id) {
   return ($(id).disabled);
}


// FUNCOES UTILITARIAS

/**
 * Detecta navegador utilizado.
 *
 * Detecta o navegador utilizado pelo usuario que acessa o site e, se o usuario
 * estiver usando o Internet Explorer, eh exibida uma mensagem de alerta.
 */
function detectarBrowser() {
   var browser = navigator.appName;
   // a mensagem de alerta so eh exibida no carregamento da pagina que contiver
   // um elemento com a ID verificada aqui. Normalmente, a pagina inicial.
   if ((I(DETECTAR_BROWSER)) && (browser == "Microsoft Internet Explorer")) {
      alert(MSG_ALERTA);
   }
}

/**
 * Altera o tamanho da fonte do texto em uma pagina.
 *
 * Recebe, como parametro, a acao que define se o usuario esta tentando
 * aumentar ou diminuir o tamanho da fonte da pagina; e o ID do elemento que
 * contem o texto cujo tamanho devera ser modificado.
 *
 * @param acao - acao que define se o tamanho da fonte deve aumentar ou diminuir
 * @param id - a ID do elemento com o texto cujo tamanho se quer modificar
 */
function setTamanhoFonte(acao, id) {
   // define o valor do novo tamanho da fonte
   if (acao == "aumentar" && tamanhoFonte < 20) {
      tamanhoFonte += 1;
   } else if (acao == "diminuir" && tamanhoFonte > 11) {
      tamanhoFonte -= 1;
   }
   // define o novo tamanho da fonte da pagina
   I(id).style.fontSize = tamanhoFonte + "px";
}

/**
 * Exibe a data e a hora.
 *
 * Recupera a data e a hora do sistema do usuario e exibe dentro de um elemento
 * HTML especifico da pagina, no formato:
 *
 *    <dia-da-semana>, <dia-do-mes> de <nome-do-mes> de <ano>
 *    hh:mm:ss
 */
function exibeDataHora() {
   var data = new Date();
   // recupera o dia da semana
   var diaSemana = data.getDay();
   var s_diaSemana;
   if (diaSemana == 0) {
      s_diaSemana = "Domingo";
   } else if (diaSemana == 1) {
      s_diaSemana = "Segunda-feira";
   } else if (diaSemana == 2) {
      s_diaSemana = "Terça-feira";
   } else if (diaSemana == 3) {
      s_diaSemana = "Quarta-feira";
   } else if (diaSemana == 4) {
      s_diaSemana = "Quinta-feira";
   } else if (diaSemana == 5) {
      s_diaSemana = "Sexta-feira";
   } else if (diaSemana == 6) {
      s_diaSemana = "Sábado";
   }
   // recupera o dia do mes
   var diaMes = data.getDate();
   // recupera o mes
   var mes = data.getMonth();
   var s_mes;
   if (mes == 0) {
      s_mes = "janeiro";
   } else if (mes == 1) {
      s_mes = "fevereiro";
   } else if (mes == 2) {
      s_mes = "março";
   } else if (mes == 3) {
      s_mes = "abril";
   } else if (mes == 4) {
      s_mes = "maio";
   } else if (mes == 5) {
      s_mes = "junho";
   } else if (mes == 6) {
      s_mes = "julho";
   } else if (mes == 7) {
      s_mes = "agosto";
   } else if (mes == 8) {
      s_mes = "setembro";
   } else if (mes == 9) {
      s_mes = "outubro";
   } else if (mes == 10) {
      s_mes = "novembro";
   } else if (mes == 11) {
      s_mes = "dezembro";
   }
   // recupera o ano
   var ano = data.getFullYear();
   // recupera a hora
   var hh = data.getHours();
   var mm = data.getMinutes();
   var ss = data.getSeconds();
   var hora;
   // coloca um 0 a esquerda dos numeros menores que 10
   if (hh < 10) { hora = "0" + hh; } else { hora = hh; }
   if (mm < 10) { hora = hora + ":0" + mm; } else { hora = hora + ":" + mm; }
   if (ss < 10) { hora = hora + ":0" + ss; } else { hora = hora + ":" + ss; }
   // monta o string da data e da hora
   var dataHora = s_diaSemana+", "+diaMes+" de "+s_mes+" de "+ano+"<br />"+hora;
   // exibe a data e a hora dentro do elemento com a ID informada
   I(ELEM_DATA_HORA).innerHTML = dataHora;
   // exibe a hora decorrendo em tempo real
   setTimeout("exibeDataHora()", 1000);
}

/**
 * Recupera o objeto HTTP para realizar requisicoes AJAX.
 * 
 * @return O objeto HTTP. Null se operacoes AJAX nao forem suportadas pelo
 *          navegador do usuario.
 */
function getHTTPObject() {
   if (window.ActiveXObject) {
      return (new ActiveXObject("Microsoft.XMLHTTP"));
   } else if (window.XMLHttpRequest) {
      return (new XMLHttpRequest());
   } else {
      alert(MSG_HTTP_OBJ);
      return (null);
   }
}

/**
 * Modifica o estilo do link que esta ativo nos menus.
 *
 * Recebe, como parametro, o ID do link que foi clicado e, atraves dele,
 * recupera o link cujo estilo sera diferente dos demais enquanto ele estiver 
 * ativo, isto eh, enquanto a pagina chamada por ele estiver sendo exibida.
 *
 * @param id - o ID do link cuja cor devera ser modificada
 */
function modificarLinkAtivo(id) {
   I(id).style.color = "#F3A854";
}

/**
 * Modifica o estilo do link que esta ativo num menu de abas.
 *
 * Recebe, como parametro, o ID do link que foi clicado e, atraves dele,
 * recupera o link cujo estilo sera diferente dos demais enquanto ele estiver
 * ativo, isto eh, enquanto a pagina chamada por ele estiver sendo exibida.
 *
 * @param id - o ID do link cuja aparencia devera ser modificada
 */
function modificarAbaAtiva(id) {
   var obj = I(id);
   obj.style.backgroundColor = "#FFFFFF";
   obj.style.borderBottomWidth = "1px";
   obj.style.borderBottomStyle = "solid";
   obj.style.borderBottomColor = "#FFFFFF";
}

/**
 * Alterna entre exibicao e nao exibicao de elementos HTML.
 *
 * Recebe como parametro o ID do elemento que deve ser exibido/escondido.
 * Verifica se este elemento esta visivel; se estiver, ele eh escondido. Caso
 * contrario, eh exibido.
 *
 * @param id - o ID do elemento a ser exibido/escondido
 */
function exibirEsconder(id) {
   if (estaVisivel(id)) {
      esconder(id);
   } else {
      exibir(id);
   }
}

/**
 * Alterna entre exibicao e nao exibicao de varios elementos HTML.
 *
 * Esta funcao eh chamada quando se eh clicado num link para exibir/esconder
 * varios elementos de uma pagina. Ela recebe, como parametro, uma lista de IDs
 * dos elementos a serem exibidos/escondidos. Alem do ID do link que ativou esta
 * funcao.
 *
 * @param id - a lista de IDs dos elementos a serem exibidos/escondidos
 * @param fonteId - o ID do elemento que aciona a funcao
 */
function exibirEsconderTodos(id, fonteId) {
   // link que aciona a funcao de exibir/esconder todos os blocos
   var fonte = I(fonteId);
   // armazena quantidade de elementos visiveis
   var count = 0;
   // conta quantos elementos estao visiveis
   for (var i=0; i<id.length; i++) { if (estaVisivel(id[i])) { count++; } }
   // os elementos que ainda nao estiverem visiveis sao exibidos. Caso todos os
   // elementos ja estejam visiveis, entao todos sao escondidos.
   if (count < id.length) {
      for (var i=0; i<id.length; i++) { exibir(id[i]); }
      fonte.style.backgroundPosition = "bottom right";
   } else if (count == id.length) {
      for (var i=0; i<id.length; i++) { esconder(id[i]); }
      fonte.style.backgroundPosition = "top right";
   }
}

/**
 * Expande ou colapsa um no de uma arvore.
 *
 * Recebe, como parametro, o ID do elemento que deve ser expandido/colapsado.
 * Verifica se este elemento esta visivel; se estiver, ele eh colapsado. Caso
 * contrario, eh expandido.
 *
 * Recebe como parametro, tambem, uma referencia para o elemento que chama esta
 * funcao: o link de expandir/colapsar um item da arvore, para modificar seu
 * estilo, exibindo um sinal de "+" ou "-", relativo a acao que sera executada,
 * caso seja clicado. 
 *
 * @param bullet - o link de expandir/colapsar
 * @param id - o ID do elemento a ser expandido/colapsado
 */
function expandirColapsar(bullet, id) {
   if (estaVisivel(id)) {
      esconder(id);
      bullet.style.backgroundPosition = "top left";
   } else {
      exibir(id);
      bullet.style.backgroundPosition = "bottom left";
   }
}


// FUNCOES PARA FORMULARIOS

/**
 * Valida o preenchimento de um campo de texto de um formulario.
 *
 * Verifica se um campo de texto de um formulario foi preenchido. Se nao foi
 * preenchido, o campo eh marcado, indicando ao usuario que seu preenchimento
 * eh obrigatorio.
 *
 * @param campo - a referencia para o campo do formulario
 *
 * @return False, se o valor do campo for invalido.
 */
function campoTextoValido(campo) {
   if (campo.value != "") {
      marcarCampoInvalido(campo, false);
      rc = true;
   } else {
      marcarCampoInvalido(campo, true);
      rc = false;
   }
   return (rc);
}

/**
 * Valida o preenchimento de uma lista de selecao (combobox) de um formulario.
 *
 * Verifica se um lista de selecao de um formulario foi preenchida. Se nao foi
 * preenchida, ela eh marcada, indicando ao usuario que seu preenchimento eh
 * obrigatorio.
 *
 * @param lista - a referencia para a lista de selecao do formulario
 *
 * @return False, se o valor da lista de selecao for invalido.
 */
function listaValida(lista) {
   if (lista.selectedIndex > 0) {
      marcarCampoInvalido(campo, false);
      rc = true;
   } else {
      marcarCampoInvalido(campo, true);
      rc = false;
   }
   return (rc);
}

/**
 * Marca/desmarca o campo de formulario que possue valor invalido.
 * 
 * Marca/desmarca, no formulario, o campo com valor invalido, ou que nao tenha
 * sido devidamente preenchido, realcando-o com bordas na cor laranja. Quando
 * o usuario digita um valor valido, o campo eh desmarcado, restaurando a cor
 * normal de suas bordas.
 * 
 * @param campo - o campo que deve ser marcado ou desmarcado
 * @param marcar - flag que indica se o campo deve ser marcado ou desmarcado
 */
function marcarCampoInvalido(campo, marcar) {
   if (!marcar) {
      campo.style.borderColor = "#999999";
   } else {
      campo.style.borderColor = "#EDAB00";
      campo.focus();
   }
}

/**
 * Limpa campo de texto (textfield) de um formulario.
 *
 * Recebe, por parametro, uma referencia para um campo de texto de um forumlario
 * que deve ser limpo, atribuindo um string vazio ao seu valor.
 *
 * @param campo - o campo de texto que deve ter seu valor limpo
 */
function limparCampoTexto(campo) {
   campo.value = "";
}

/**
 * Limpa lista de selecao (combobox) de um formulario.
 *
 * Recebe, por parametro, uma referencia para uma lista de selecao de um
 * forumlario que deve ser limpa, atribuindo um string vazio a cada um de seus
 * valores.
 *
 * @param lista - a lista de selecao que deve ter seu valor limpo
 */
function limparLista(lista) {
   for (var i=0; i<lista.options.length; i++) { lista.options[i].text = ""; }
   lista.options.length = 0;
}

/**
 * Habilita um grupo de radio buttons.
 *
 * Habilita os radio buttons de um grupo de radio buttons, cuja referencia eh
 * recebida por parametro.
 *
 * @param grupo - o grupo de radio buttons a ser habilitado
 */
function habilitarRadio(grupo) {
   for (i=0; i<grupo.length; i++) { grupo[i].disabled = false; }
}

/**
 * Desabilita um grupo de radio buttons.
 *
 * Desabilita os radio buttons de um grupo de radio buttons, cuja referencia eh
 * recebida por parametro.
 *
 * @param grupo - o grupo de radio buttons a ser desabilitado
 */
function desabilitarRadio(grupo) {
   for (i=0; i<grupo.length; i++) { grupo[i].disabled = true; }
}

/**
 * Recupera o valor selecionado de uma lista de selecao (combobox).
 *
 * Recupera o valor selecionado da lista de selecao (combobox) cuja referencia
 * eh recebida por parametro.
 *
 * @param lista - referencia para a lista de selecao (combobox)
 *
 * @return O valor selecionado na lista.
 */
function getValorSelec(lista) {
   return (lista.options[lista.selectedIndex].value);
}

/**
 * Recupera o valor do radio button selecionado.
 *
 * Recupera o valor do radio button selecionado, de um grupo de radio buttons,
 * cuja referencia eh recebida por parametro.
 *
 * @param grupo - a referencia para o grupo de radio buttons
 *
 * @return O valor do radio button selecionado.
 */
function getRadioSelec(grupo) {
   for (i=0; i<grupo.length; i++) {
      if (grupo[i].checked) { radioSelec = grupo[i].value; }
   }
   return (radioSelec);
}


//FUNCAO DE TRATAMENTO DE ERRO NO INTERNET EXPLORER

/* A mensagem de erro. */
var errMsg = "";

/* Em um evento de erro, chama a funcao de tratamento de erro. */
onerror = handleErr;

/* Trata erros ocorridos no Internet Explorer. */
function handleErr(msg, url, l) {
   errMsg = "Um erro ocorreu nesta pagina. Contate o suporte do sistema\n";
   errMsg += "para resolver este problema.\n\n";
   errMsg += "     Erro: " + msg + "\n";
   errMsg += "     URL: " + url + "\n";
   errMsg += "     Linha: " + l + "\n\n";
   errMsg += "Clique OK para continuar.";
   alert(errMsg);
}
