function AbraJanelaPopup(url, modoExibicao, largura, altura, x, y, atributos)
{
  // Navegadores: (navigator.userAgent.indexOf("Opera") != -1 && navigator.userAgent.indexOf("5.") > 0) ? "Opera" : (document.all) ? "Internet Explorer" : (document.layers) ? "Netscape 4.7x" : (!document.all && document.getElementById) ? "Mozilla - Netscape 6/7" : "Outros";

  var pixelsNaoDisponiveisHorizontal = (navigator.userAgent.indexOf("Opera") != -1 && navigator.userAgent.indexOf("5.") > 0) ? 12 : (document.all) ? 12 : (document.layers) ? 12 : (!document.all && document.getElementById) ? 8  : 12;
  var pixelsNaoDisponiveisVertical   = (navigator.userAgent.indexOf("Opera") != -1 && navigator.userAgent.indexOf("5.") > 0) ? 29 : (document.all) ? 29 : (document.layers) ? 29 : (!document.all && document.getElementById) ? 29 : 29;

  // Caso não tenham sido especificados, assumir os valores default dos atributos do pop-up.
  if ((atributos == null) || (atributos == '')) atributos = 'status=0,scrollbars=yes,toolbar=no,menubar=no,resizable=yes';

  // Calcular a largura e altura disponíveis na tela.
  var larguraTelaDisponivel = (screen) ? screen.availWidth  : 800;
  var alturaTelaDisponivel  = (screen) ? screen.availHeight : 600;

  if (largura == null) largura = (larguraTelaDisponivel > 800) ? 800 : larguraTelaDisponivel - pixelsNaoDisponiveisHorizontal;
  if (altura  == null) altura  = (alturaTelaDisponivel  > 600) ? 600 : alturaTelaDisponivel  - pixelsNaoDisponiveisVertical;

  if (modoExibicao == 1)
	  {
		// Em modo normal (não-cascata), os valores dos parâmetros x e y são absolutos. Caso não tenham sido especificados, centralizar a janela
		// horizontalmente (na falta de x) e/ou verticalmente (na falta de y).
		if (x == null) x = (larguraTelaDisponivel >= largura + pixelsNaoDisponiveisHorizontal) ? (larguraTelaDisponivel - (largura + pixelsNaoDisponiveisHorizontal)) / 2 : 0;
		if (y == null) y = (alturaTelaDisponivel  >= altura  + pixelsNaoDisponiveisVertical)   ? (alturaTelaDisponivel  - (altura  + pixelsNaoDisponiveisVertical))   / 2 : 0;
		}
	else    // modoExibicao = 2
	  {
		// Em modo cascata, os valores dos parâmetros x e y são relativos à posição da janela corrente.
    x = ((navigator.userAgent.indexOf("Opera") != -1) && (navigator.userAgent.indexOf("5.") > 0)) ? 0 : (((document.all) ? window.screenLeft : (document.layers) ? window.screenX : (!document.all && document.getElementById) ? window.screenX : 0)) + x;
    y = ((navigator.userAgent.indexOf("Opera") != -1) && (navigator.userAgent.indexOf("5.") > 0)) ? 0 : (((document.all) ? window.screenTop  : (document.layers) ? window.screenY : (!document.all && document.getElementById) ? window.screenY : 0)) + y;
		}

  // Caso a janela pop-up esteja ultrapassando as dimensões da tela, reduzí-la horizontalmente e/ou verticamente até que caiba por inteiro na tela.
  if (x + largura > larguraTelaDisponivel - pixelsNaoDisponiveisHorizontal) largura = larguraTelaDisponivel - pixelsNaoDisponiveisHorizontal - x;
	if (y + altura  > alturaTelaDisponivel  - pixelsNaoDisponiveisVertical)   altura  = alturaTelaDisponivel  - pixelsNaoDisponiveisVertical   - y;

  newWindow = window.open(url,
                          "popup" + String(Math.random()).substr(2),
                          'width=' + largura + ',height=' + altura + ',' + atributos + ',' + 'top=' + y + ',' + 'left=' + x);
}

// --------------------------------------------------------------------------------------------------------------------------------------------------

function ExibaElementosFormulario(formulario)
{
  var i, len = formulario.elements.length;
  var elementosFormulario = '';

  // Percorrer todos os elementos do formulário.
  for (i = 0; i < len; i++)
    elementosFormulario+= ((elementosFormulario == '') ? '' : ', ') + 'elements[' + i + ']: ' + formulario.elements[i].name + ' (' + formulario.elements[i].type + ')';

  alert(elementosFormulario);
}

// --------------------------------------------------------------------------------------------------------------------------------------------------

function ExibaElementosCampoSelect(campoSelect)
{
  var i, len = campoSelect.options.length;
  var opcoesSelect = '';

  // Percorrer todos as opções do campo "select".
  for (i = 0; i < len; i++)
    opcoesSelect += 'options[' + i + ']: (\'' + campoSelect.options[i].text + '\', \'' + campoSelect.options[i].value + '\')\n';

  opcoesSelect += '\n\n(total de opções: ' + campoSelect.options.length + ')';

  alert(opcoesSelect);
}

// --------------------------------------------------------------------------------------------------------------------------------------------------

function IncluaSelecioneOpcaoCampoSelect(objCampoSelect, textoOpcao, valorOpcao)
{
  // Criar o objeto "Option" com os valores 'textoOpcao' e 'valorOpcao', inserí-lo no campo HTML 'objCampoSelect' e selecioná-lo por default.
  objCampoSelect.options[objCampoSelect.options.length] = new Option(textoOpcao, valorOpcao, false, true);
}

// --------------------------------------------------------------------------------------------------------------------------------------------------

function LimpeConteudoCamposTextDisabledHidden(objCampoTextDisabled, objCampoHidden)
{
  objCampoTextDisabled.value = '';
	objCampoHidden.value       = '';
}

// --------------------------------------------------------------------------------------------------------------------------------------------------

function AltereConteudoCamposTextDisabledHidden(strCampoTexto, strTexto, strCampoValor, strValor)
{
  var objCampoValor;
	
	eval('objCampoValor = self.opener.document.' + strCampoValor);

  if (objCampoValor.type == 'hidden')
    {
    // Alterar o valor do campo "hidden".
    objCampoValor.value = strValor;

    // Alterar o valor do campo "text" associado (normalmente desabilitado). Obs: aqui usamos a função eval() para evitarmos um erro de sintaxe
    // quando o tipo de campo contendo o valor é um "select", não havendo assim um campo de texto associado ({t_CampoTexto}).
    eval('self.opener.document.' + strCampoTexto + '.value = "' + strTexto + '"');
    }
  else if ((objCampoValor.type == 'select-one') || (objCampoValor.type == 'select-multiple'))
    {
    // Chamar uma função, propositalmente contida dentro da página responsável pela abertura do pop-up, para a inserção e seleção automática da nova
    // opção no respectivo campo "select". A razão da localização da função citada anteriormente é uma limitação (bug?) do Internet Explorer, o qual 
    // não permite a inclusão/alteração de opções de um campo "select" contido uma página que não a atual (o que é o caso aqui). É interessanre notar 
    // que remoções de opções funcionam sem problemas no IE, assim como no NS 7.
    self.opener.IncluaSelecioneOpcaoCampoSelect(objCampoValor, strTexto, strValor);
    }

  window.close();
}

// --------------------------------------------------------------------------------------------------------------------------------------------------

function JanelaPopupCentralizada(url)
{
  var larguraTelaDisponivel = (screen) ? screen.availWidth  : 800;
  var alturaTelaDisponivel  = (screen) ? screen.availHeight : 600;

  var larguraPopup = (larguraTelaDisponivel > 800) ? 800 : larguraTelaDisponivel - 12;
  var alturaPopup  = (alturaTelaDisponivel  > 600) ? 600 : alturaTelaDisponivel  - 29;

  var x = (larguraTelaDisponivel >= larguraPopup + 12) ? (larguraTelaDisponivel - (larguraPopup + 12)) / 2 : 0;
  var y = (alturaTelaDisponivel  >= alturaPopup  + 29) ? (alturaTelaDisponivel  - (alturaPopup  + 29)) / 2 : 0;
  
  newWindow = window.open(url,
                          String(Math.random()).substr(2),
                          'width=' + larguraPopup + ',height=' + alturaPopup +
                          ',status=1,scrollbars=yes,toolbar=no,menubar=no,resizable=yes,' +
                          'top=' + y + ',' +
                          'left=' + x);
}

// --------------------------------------------------------------------------------------------------------------------------------------------------

function JanelaPopupCentralizada2(url, larguraPopup, alturaPopup)
{
  var larguraTelaDisponivel = (screen) ? screen.availWidth  : 800;
  var alturaTelaDisponivel  = (screen) ? screen.availHeight : 600;

  var x = (larguraTelaDisponivel >= larguraPopup + 12) ? (larguraTelaDisponivel - (larguraPopup + 12)) / 2 : 0;
  var y = (alturaTelaDisponivel  >= alturaPopup  + 29) ? (alturaTelaDisponivel  - (alturaPopup  + 29)) / 2 : 0;
  
  newWindow = window.open(url,
                          String(Math.random()).substr(2),
                          'width=' + larguraPopup + ',height=' + alturaPopup +
                          ',status=1,scrollbars=yes,toolbar=no,menubar=no,resizable=yes,' +
                          'top=' + y + ',' +
                          'left=' + x);
}

// --------------------------------------------------------------------------------------------------------------------------------------------------

function PopupJanelaMargemDireita(url, larguraPopup, totalJanelasEmpilhadasVerticalmente, indiceVerticalJanela)
{
  var larguraTelaDisponivel = (screen) ? screen.availWidth  : 800;
  var alturaTelaDisponivel  = (screen) ? screen.availHeight : 600;

  var alturaPopup = (alturaTelaDisponivel - 29 * totalJanelasEmpilhadasVerticalmente) / totalJanelasEmpilhadasVerticalmente;

  var x = larguraTelaDisponivel - larguraPopup - 12;
  var y = 0 + (alturaPopup + 29) * (indiceVerticalJanela - 1);

  newWindow = window.open(url,
                          String(Math.random()).substr(2),
                          'width=' + larguraPopup + ',height=' + alturaPopup +
                          ',status=0,scrollbars=yes,toolbar=no,menubar=no,resizable=yes,' +
                          'top=' + y + ',' +
                          'left=' + x);
}

// --------------------------------------------------------------------------------------------------------------------------------------------------

function FormularioAlterado(formulario)
{
  var i, len, alterado = false;

  // Percorrer todos os elementos do formulário até que seja encontrado algum campo que tenha tido seu valor alterado.
  for (i = 0, len = formulario.elements.length; (i < len && !alterado); i++)
    if (formulario.elements[i].type == 'checkbox')
      alterado = (formulario.elements[i].checked != formulario.elements[i].defaultChecked);
    else
      alterado = (formulario.elements[i].value != formulario.elements[i].defaultValue);

  return alterado;
}

// --------------------------------------------------------------------------------------------------------------------------------------------------

function IndiceElementoVetor(elemento, vetor)
{
  var i = 0, len = vetor.length;
  var encontrou = false;
  
  while (i < len && !encontrou) 
    if (elemento == vetor[i])
      encontrou = true;
    else
      i++;
      
  return (encontrou ? i : -1);
}

// --------------------------------------------------------------------------------------------------------------------------------------------------

function ProximoIndiceElementoFormulario(elemento, formulario, indiceInicial)
{
  var i = indiceInicial, len = formulario.elements.length;
  var encontrou = false;
  
  while (i < len && !encontrou) 
    if (elemento == formulario.elements[i].name)
      encontrou = true;
    else
      i++;
      
  return (encontrou ? i : -1);
}

// --------------------------------------------------------------------------------------------------------------------------------------------------

function MarqueCamposAlterados(formulario)
{
  var i, j, len = formulario.elements.length;
  var inputsFormulario = new Array('ATSV014_TEXTO_RESPOSTA', 'ATSV014_ANEXO_RESPOSTA_file', 'excluirAnexo');

  // Percorrer todos os elementos do formulário, localizando os elementos "ATSV014_TEXTO_RESPOSTA" e verificando se estes tiveram seus valores
  // alterados. Para os elementos inalterados inserir caracteres especiais "[" e "]" ao redor do texto, a fim de indicar que tais linhas não
  // devem ter suas respectivas colunas modificadas na base de dados quando da submissão do formulário HTML para a própria página.
  for (i = 0; i < len; i++)
    {
    // O elemento sendo atualmente percorrido é um dos campos pertencentes ao vetor "inputsFormulario"?
    if (IndiceElementoVetor(formulario.elements[i].name, inputsFormulario) != -1)
      {
      // Sim! Verificar se o valor do elemento foi alterado desde a carga da página.
      var registroAlterado;
      if (formulario.elements[i].type == 'checkbox')
        registroAlterado = (formulario.elements[i].checked != formulario.elements[i].defaultChecked);
      else
        registroAlterado = (formulario.elements[i].value != formulario.elements[i].defaultValue);

      if (registroAlterado)
        {
        // Localizar o próximo elemento com nome "registroAlterado" na sequência dos elementos do formulário e alterar o seu valor para "true".
        if ((j = ProximoIndiceElementoFormulario('registroAlterado', formulario, i + 1)) != -1) formulario.elements[j].value = 'true';
        }
      }
    }

  return true;
}

// --------------------------------------------------------------------------------------------------------------------------------------------------

function ExibaElementosFormulario(formulario)
{
  var i, len = formulario.elements.length;
  var elementosFormulario = '';

  // Percorrer todos os elementos do formulário.
  for (i = 0; i < len; i++)
    elementosFormulario+= 'elements[' + i + ']: ' + formulario.elements[i].name + ' (Tipo: "' + formulario.elements[i].type + '")' + ' (Valor: "' + formulario.elements[i].value + '")\n\n';

  alert(elementosFormulario);
}

// --------------------------------------------------------------------------------------------------------------------------------------------------

function CopieDadosRadio(formulario, nomeCampo, destino)
{
  var i, len = formulario.elements.length;
  var elementosFormulario = '';
	var encontrado = false;
  var resultado = '';

  // Percorrer todos os elementos do formulário.
  for (i = 0; i < len && !encontrado; i++)
	  if ((formulario.elements[i].type == 'radio') && (formulario.elements[i].name == nomeCampo) && (formulario.elements[i].checked))
		  {
      resultado  = formulario.elements[i].value;
			encontrado = true;
			}

  destino.value = resultado;
}

// --------------------------------------------------------------------------------------------------------------------------------------------------

function CopieDadosCheckbox(formulario, nomeCampo, destino, substiuirDados)
{
  var i, len = formulario.elements.length;
  var elementosFormulario = '';

  var resultado = '';

  // Percorrer todos os elementos do formulário.
  for (i = 0; i < len; i++)
	  if ((formulario.elements[i].type == 'checkbox') && (formulario.elements[i].name == nomeCampo) && (formulario.elements[i].checked))
      resultado += ((resultado == "") ? "" : "\n\n") + "» " + formulario.elements[i].value;
			
  if (substiuirDados)
    destino.value = resultado;
	else if (resultado != "")
    destino.value += ((destino.value == "") ? "" : "\n\n") + resultado;
}

