/** 
 * ARQUIVO AJAX.JS
 * 
 * Conjunto de funções para trabalhar com ajax
 * 
 * 15/02/2007 --> Corrigida falha na definição da função processaForm
 *
 * Última atualização --> 30/07/2007
 *  
 */

var objRequisicao;
var action = "";
var method = "";
var contRequesicao = "";

//################ FUNÇÕES ESSENCIAIS PARA O FUNCIONAMENTO DO AJAX ################\\

//Função para instanciar o objeto HttpRequest.
function iniciaAjax() {
  try {
    objRequisicao = new ActiveXObject("Microsoft.XMLHTTP");
  }catch(e) {
    try {
      objRequisicao = new ActiveXObject("Msxml2.XMLHTTP");
    }catch(ex) {
      try {
        objRequisicao = new XMLHttpRequest();
      }catch(exc){
        alert("Browser não suporta ajax.");
        objRequisicao = false;
      }
    }
  }
}

//Verifica se o objeto HttpRequest contém um retorno válido.
function ajax() {
  if(objRequisicao.readyState == 4){
    if(objRequisicao.status == 200){
      return true;
    }else{
      alert("Problem: " + objRequisicao.statusText);
    }
  }
  return false;
}

//Obtém o conteúdo xml de um retorno
function getRespostaXML(){
  var xml = "";
  if(ajax()){
    var textoPlano = objRequisicao.responseText;
    //alert("TEXTO:\n" + textoPlano);
    if (textoPlano.indexOf("<") != -1){
      try{
        xml = objRequisicao.responseXML;
      }catch(e){
        try{
          xml = objRequisicao.responseXmL;
        }catch(e){
          alert("Browser não suporta ajax.");
        }
      }
      return xml;
    }else{
      return null;
    }
  }
}

//Pega os campos e seus valores do formulário para concatenar na variável(conteudoRequisicao) que ser enviada para o servidor.
function getDados(formAjax) {
  if(formAjax != "" && formAjax.action != undefined){
    action = formAjax.action;
    method = formAjax.method;
    var contRequisicao = "";
    for(i = 0; i < formAjax.elements.length; i++){
      formElements = formAjax.elements[i];
	  /**
	  	Atualização 30/07/2007
	  
	  	- Não enviar radiobutton não checado
		
	  	Atualização 05/07/2007
		
		- Não enviar elementos disabilitados (pensando...)
		- Não enviar com nome vazio (já tinha)
		- Não enviar checkbox não checado (OK)
		- Estruturado para novas restrições de acordo com o tipo
	  **/
      if(formElements.name != ""){
		var adiciona = true;
		alert(formElements.type);
		switch(formElements.type){		
		case "checkbox":
			if (formElements.checked != true) adiciona = false;
			break;
		case "radio":
			if (formElements.checked != true) adiciona = false;
			break;
		}
        if(adiciona == true){
			contRequisicao += formElements.name + "=" + escape(formElements.value) + "&";
		}
      }
    }
    contRequisicao = contRequisicao.substring(0, contRequisicao.length -1);
	return contRequisicao;
  }else{
    alert("Invalid Form");
	return false;
  }
}

/* -> OPÇÕES DE REQUISIÇÃO <- */

// Processa uma requisição pro Servidor através de um formulário com retorno de dados
function processaForm(formAjax, funcaoProcessada){
  // Inicia a função do objeto HttpRequest.
  iniciaAjax();
  var contRequisicao = '';
  if(objRequisicao){
    contRequisicao = getDados(formAjax);
	//alert(contRequisicao);
    //alert(formAjax);
    objRequisicao.open(method, action, true);
    objRequisicao.onreadystatechange = funcaoProcessada;
    if(method == "post"){
      objRequisicao.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    }
    contRequisicao = contRequisicao != "" ? contRequisicao : null;
	//alert(contRequesicao);
    objRequisicao.send(contRequisicao);
  }
}

// Processa uma requisição pro Servidor através de um formulário, mas sem retorno de resposta
function enviaForm(formAjax){
  // Inicia a função do objeto HttpRequest.
  iniciaAjax();
  var contRequisicao = "";
  if(objRequisicao){
    contRequisicao = getDados(formAjax);
    objRequisicao.open(method, action, true);
    if(method == "post"){
      objRequisicao.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    }
    contRequisicao = contRequisicao != "" ? contRequisicao : null;
    objRequisicao.send(contRequisicao);
  }
}

// Processa uma requisição pro Servidor através de uma url, sem formulários
function processaURL(url, funcaoProcessada){
  // Inicia a função do objeto HttpRequest.
  iniciaAjax();
  if(objRequisicao){
    method = "post";
    objRequisicao.open(method,url,true);
    if(method == "post"){
      objRequisicao.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    }
    objRequisicao.onreadystatechange = funcaoProcessada;
    objRequisicao.send(url);
  }
}

// Apenas executa um script assíncrono.
function enviaURL(url){
  // Inicia a função do objeto HttpRequest.
  iniciaAjax();
  if(objRequisicao){
    method = "post";
    objRequisicao.open(method,url,true);
    if(method == "post"){
      objRequisicao.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    }
    objRequisicao.send(url);
  }
}

// Inclui uma página dentro de uma tag (o parametro receptor recebe o id desta tag)
function incluiPagina(url,idReceptor,msgAguardando){
  // Inicia a função do objeto HttpRequest.
  iniciaAjax();
  objRequisicao.open("GET", url, true);
  objRequisicao.onreadystatechange = function(){		
    if (objRequisicao.readyState==4){
      document.getElementById(idReceptor).innerHTML = objRequisicao.responseText;
    }else{
	  	document.getElementById(idReceptor).innerHTML = msgAguardando;
		}
  }
  objRequisicao.send(null);
}

/* -> FIM DAS OPÇÕES DE REQUISIÇÃO <- */

//################ FIM DAS FUNÇÕES ESSENCIAIS PARA O FUNCIONAMENTO DO AJAX ################\\
//#																						  #\\	
//########################## FUNÇÕES PARA TRABALHAR COM TABELAS ###########################\\

function novaColuna(linha, dados){
  var coluna = document.createElement("td");	
  coluna.innerHTML = dados;
  linha.appendChild(coluna);
}

function novaLinha(tabela,vetorColunas,prefixoId,fundoPares,fundoImpares){
  var linha = document.createElement("tr");
  linha.id = prefixoId + (tabela.getElementsByTagName("tr").length);
  linha.align = 'center';  
  //--------------------------------------------------- HIGHLIGHT
  if(fundoPares == "" || fundoPares == null){
  	fundoPares = "#FFFFFF";
  }
  if(fundoImpares == "" || fundoImpares == null){
  	fundoImpares = "#FFFFFF";
  }
  if(tabela.getElementsByTagName("tr").length % 2 != 0){
    linha.bgColor = fundoImpares;
  }else{
    linha.bgColor = fundoPares;
  }
  //--------------------------------------------------- FIM DO HIGLIGHT
  for(x=0; x < vetorColunas.length; x++){
    novaColuna(linha, vetorColunas[x]);
  }
  tabela.appendChild(linha);
}

// Alterada para gerar mais de uma coluna
function inserirCelula(vetorColunas,idNovaTabela,idReceptor){
  var tbody;
  if(document.getElementById(idNovaTabela) == null){
    tbody = document.createElement("tbody");
    tbody.id= idNovaTabela;
    document.getElementById(idReceptor).appendChild(tbody);
  }else{
    tbody = document.getElementById(idNovaTabela);
  }
  prefixoId = "tr" + idNovaTabela;
  novaLinha(tbody,vetorColunas,prefixoId);
}

function remove(idTabela,pos){
  pre = "tr" + idTabela;
  tabela = document.getElementById(idTabela);
  tabela.removeChild(document.getElementById(pre + pos));
}

function removeTodos(idTabela){
  prefixoId = "tr" + idTabela;
  tabela = document.getElementById(idTabela);
  if(tabela != null){
    var size = tabela.rows.length;
    for (i = 0; i < size; i++){
      tabela.removeChild(document.getElementById(prefixoId + i));
    }
  }
}
/********************************************************/

//######### SELECTS ########\\

/**
	 # 17/05/2007
	 		- Modificações na função inserirOpção, removendo a área de grupos, 
			  pois o html gerado por ela não funcionava no IE, e, semanticamente, 
			  estava incorreto (e.g.1).
			- Criada a função obterOpção, parecida com a inserirOpção, mas que não 
			  insere em nenhum listBox, apenas cria o elemento.
			- Criada a função inserirEmGrupo, para fazer o trabalho de inserir uma
			  opção dentro de um grupo, com código semantico (e.g.2).
			  
			  e.g.1
			  
			      <optgroup label=grupo>			  	
				  </optgroup>
				  <option>Opção</option>
				  
			  e.g.2
			  
			      <optgroup label=grupo>
					  <option>Opção</option>
				  </optgroup>				  
				  
	 # 16/05/2007
	 		- Criada função inserirGrupo, para optGroups
			- Colocado parâmetro idGrupo na função inserirOpção.
			  Caso o valor passado for NULL, a opção não será inserida 
			  em nenhum grupo.

	 # 13/03/2007
	 		- Adicionado bloco try na função, devido à falta de compatibilidade entre IE e os padrões
*/

function inserirGrupo(listBox,labelGrupo,id){
	var grp = null;
	grp = document.createElement('optgroup');	
	try{
		listBox.appendChild(grp,null); // Modelo padrão
	}catch(e){
		listBox.appendChild(grp); // Padrão IE
	}	
	grp.label = labelGrupo;
	if(id && id != null){
		grp.id = id;
	}
}

function obterOpcao(valorOpcao,textoOpcao,selecionada, id){
	var opt = null;
	opt = document.createElement('option');
	if(navigator.appName == "Microsoft Internet Explorer"){
		opt.innerHTML = textoOpcao;	
	}else{
		opt.text = textoOpcao;
	}
	opt.value = valorOpcao;	
	opt.selected = selecionada;	
	if(id && id != null){
		opt.id = id;
	}		
	return opt;
}

function inserirEmGrupo(opcao,idGrupo){
/*	for(i = 0; i < arrOpcoes.length; i++){
		idGrupo.appendChild(arrOpcoes[0]);
	}
*/
	document.getElementById(idGrupo).appendChild(opcao);
}

function inserirOpcao(listBox,valorOpcao,textoOpcao,selecionada, id){
	var opt = null;
	opt = document.createElement('option');
	opt.text = textoOpcao;
	opt.value = valorOpcao;	
	opt.selected = selecionada;	
	if(id && id != null){
		opt.id = id;
	}		
	try{
		listBox.add(opt,null); // Modelo padrão
	}catch(e){
		listBox.add(opt); // Padrão IE
	}
}

function removerOpcao(listBox,indiceOpcao){
	if(listBox.selectedIndex == 0){
		listBox.selectedIndex = -1;
		listBox.remove(0);
	}else{
		listBox.remove(indiceOpcao);
	}
}

function limpaListBox(listBox){
	listBox.innerHTML = "";
}