						var iRow = 0
var rRow = new Array();
try{
	xmlhttp = new XMLHttpRequest();
	try{
		if(xmlhttp.overrideMimeType){
			xmlhttp.overrideMimeType('text/xml');
			}
		}
	catch (e1) { }
	}

catch(e2) {
	try{
		// Internet Explorer
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		}
	catch(e3){
		// Internet Explorer
		try{
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			}
		catch(e4){
			// tratamento para alguma outra forma de implementar XMLHTTP
			xmlhttp = false;
			}
		}
	}
	
if (!xmlhttp){
	// Nao conseguiu instanciar o objeto xmlhttp para fazer as solicitacoes
	alert("Seu navegador não é compatível com o WebManager.\nPor favor, atualize seu browser.");
	}


// ==============================================================================
// GUARDA NA rRow O ID DO OBJETO E A URL QUE SERAO CARREGADOS PELO LINK CLICADO
// ==============================================================================

function aLink(id_target,url){
	// Exibe mensagem de que esta carregando a pagina no objeto de ID informado
	ajxMssg(id_target);
	// Adiciona a solicitacao na rRow
    rRow[rRow.length]=[id_target,url,"GET",null];
	// Se nao tem conexoes na rRow, inicia a execucao
	if(rRow.length==1){
		ajxRun();
		}
	return;
	}
	

// ==============================================================================
// GUARDA NA rRow O ID DO OBJETO E O FORM QUE SERAO CARREGADOS PELO LINK CLICADO
// ==============================================================================

function sendData(id_target,id_form){
	
	// Pega a pagina que sera chamada pelo form
	var url = document.getElementById(id_form).action;
	
	// Busca metodo de envio definido no form
	var sendMethod = document.getElementById(id_form).method.toUpperCase();
	
	// Busca os elementos do form que serao enviados para a pagina solicitada
	var form_data = getData(id_form);
	
	// Exibe mensagem de que esta carregando a pagina no objeto de ID informado
	ajxMssg(id_target);
	
	//Adiciona a solicitacao na rRow
	rRow[rRow.length]=[id_target,url,sendMethod,form_data];
	
	// Se nao tem conexoes na rRow, inicia a execucao
	if(rRow.length==1){
		ajxRun();
		}
	return;
	}

// ============================================	
// EXECUTA A PROXIMA SOLICITACAO DA rRow
// ============================================	

function ajxRun(){
	var url = rRow[iRow][1];
	
	// Define o metodo de envio (GET ou POST)
	var sendMethod;
	if (rRow[iRow][3]==null){
		
		// Se for Link, utiliza GET
		sendMethod = "GET";
		}
	
	else{
		
		// Se for Form, define o metodo de envio e prepara a url
		sendMethod = rRow[iRow][2];
		if (sendMethod=="" || sendMethod==null){
			
			// Se nao tiver definido nada, usa POST
			sendMethod = "POST";
			}
		
		if (sendMethod=="GET"){
			
			// Metodo GET passa as informacoes na linha da url
			url = url + "?" + rRow[iRow][3];
			}
		}
	
	// Abre a conexao
    xmlhttp.open(sendMethod,url,true);
	
	// Seta as funcoes que irao tratar a mudanca de estado do objeto XMLHTTP
	xmlhttp.onreadystatechange=ajxStatus;
	
	// Executa a solicitacao
	if (sendMethod=="POST"){
		
		// Metodo POST precisa definir este RequestHeader
		xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		
		// Metodo POST passa as variaveis pelo metodo Send
		xmlhttp.send(rRow[iRow][3]);
		}
	else{
		xmlhttp.send(null);
		}
	return;
	}
	
// ================================================================
// FUNCAO EXECUTADA QUANDO ALTERAR O STATUS DA SOLICITACAO (readyState)
// ================================================================

function ajxStatus(){
	
	// 0-Nao inicializado, 1-Carregando, 2-Carregado, 3-Interativo, 4-Completo
	if(xmlhttp.readyState==1){
		
		// Quando iniciar a solicitacao
		ajxStatus_loading(rRow[iRow][0]);
		}
	
	else{
		if (xmlhttp.readyState==4){
			
			// Quando estiver completa a solicitacao
			ajxStatus_complete(xmlhttp, rRow[iRow][0]);
			}
		}
	}

// ===========================================================
// FUNCAO EXECUTADA QUANDO INICIAR A SOLICITACAO (readyState=1)
// ===========================================================

function ajxStatus_loading(id){
	
	// Exibe mensagem de que está carregando a página no objeto de ID que solicitacao esta sendo feita
	ajxMssg(id);
	
	return;
	}
	
	
// ================================================================	
// FUNCAO EXECUTADA QUANDO A SOLICITACAO ESTIVER COMPLETA (readyState=4)
// ================================================================	

function ajxStatus_complete(xmlhttp, id){
	var serverResponse;
	
	// Verifica o status da pagina de retorno
	if (xmlhttp.status == 200 || xmlhttp.status==0){
		
		// Caso o status seja 200 (Sucesso) ou nao utilize servidor(chamada local [C:\...]), trata o valor retornado
		serverResponse=unescape(xmlhttp.responseText.replace(/\+/g," "));
		}
	else{
		
		// Caso o status ainda nao foi tratado, chama a funcao de tratamento de pagina de erro
		serverResponse=ajxErrorPg(xmlhttp);
		}
	
	// Exibe o valor retornado no objeto de ID informado
	document.getElementById(id).innerHTML=serverResponse;
	
	// executa scripts
	scriptFilter(serverResponse); 
	
	// passa para a proxima posicao da rRow
	iRow++;
	
	if(iRow<rRow.length){
		
		// Caso tenha mais solicitacoes na rRow, executa a proxima
		setTimeout("ajxRun()",20);
		}
	
	else{
		
		// Caso nao tenha mais solicitacoes na rRow, reinicia a rRow
		rRow = null;
		rRow = new Array();
		iRow = 0;
		}
	return;
	}

	
// ================================================================================
// FUNCAO PARA RETORNAR A MENSAGEM DE ERRO QUANDO O SERVIDOR RETORNAR UMA PAGINA DE ERRO
// ================================================================================
function ajxErrorPg(xmlhttp){
	var serverResponse;
	switch (xmlhttp.status){
		case 404:
			return "Página não encontrada (erro 404)";
			break;
		case 500:
			return "Erro interno do servidor (erro 500)";
			break;
		default:
			return "Erro desconhecido !!!<br/>" + xmlhttp.status + " - " + xmlhttp.statusText.replace(/\+/g," ");
			break;
		}
	}

	
// ===============================================================	
// FUNCAO PARA RETORNAR A MENSAGEM DE QUE ESTA CARREGANDO A PAGINA
// ===============================================================	

function ajxMssg(id){
	document.getElementById(id).innerHTML = "<div class="+"load"+">carregando...</div>";
	}
	

// ======================================
// FUNCAO PARA PEGAR OS CODIGOS SCRIPT
// ======================================

function scriptFilter(strBase){
	var posIni, posSrc, posEnd, strCode, strSearch;
	var objScript = null;
	
	// Joga na variavel de pesquisa o texto todo em minusculo para na hora da pesquisa nao ter problema com case-sensitive
	strSearch = strBase.toLowerCase()
	
	// Busca a primeira tag <script
	posIni = strSearch.indexOf('<script', 0)
	
	// Executa o loop enquanto achar um <script
	while (posIni!=-1){
		
		// Inicia o objeto script
		var objScript = document.createElement("script");
		
		// Busca se tem algum src a partir do inicio do script
		posSrc = strSearch.indexOf(' src', posIni)
		
		// Define o inicio para depois do fechamento dessa tag
		posIni = strSearch.indexOf('>', posIni) + 1;
		
		// Verifica se este e um bloco de script ou include para um arquivo de scripts
		// Se encontrou um "src" dentro da tag script, esta e um include de um arquivo script
		if(posSrc < posIni && posSrc >=0){
			
			// Marca como sendo o inicio do nome do arquivo para depois do src
			posIni = posSrc + 4;
			
			// Procura pelo ponto do nome da extencao do arquivo e marca para depois dele
			posEnd = strSearch.indexOf('.', posIni)+4;
			
			// Pega o nome do arquivo
			strCode = strBase.substring(posIni,posEnd);
			
			// Elimina do nome do arquivo os caracteres que possam ter sido pegos por engano
			strCode = strCode.replace("=","").replace(" ","").replace("\"","").replace("\"","").replace("\'","").replace("\'","").replace(">","");
			
			// Adiciona o arquivo de script ao objeto que sera adicionado ao documento
			objScript.src = strCode;
			}
		
		// Se nao encontrou um "src" dentro da tag script, esta e um bloco de codigo script
		else{
			
			// Procura o final do script
			posEnd = strSearch.indexOf('</script>', posIni);
			
			// Extrai apenas o script
			strCode = strBase.substring(posIni,posEnd);
			
			// Adiciona o bloco de script ao objeto que sera adicionado ao documento
			objScript.text = strCode;
			}
		
		// Adiciona o script ao documento
		document.body.appendChild(objScript);
		
		// Procura a proxima tag de <script
		posIni = strBase.indexOf('<script', posEnd);
		
		// Limpa o objeto de script
		objScript = null;
		}
	}


// ==========================================================
// FUNCAO PARA DECODIFICAR OS DADOS RECUPERADOS DE UM CAMPO
// ==========================================================

function strDecode(str){
	
	var hex_chars="0123456789ABCDEF";
	var noEncode = /^([a-zA-Z0-9\_\-\.])$/;
	var n, strCode, hex1, hex2, strEncode = "";
	
	for(n = 0;n<str.length;n++){
		
		if (noEncode.test(str.charAt(n))){strEncode += str.charAt(n);}
		else{
			strCode = str.charCodeAt(n);
			hex1 = hex_chars.charAt(Math.floor(strCode / 16));
			hex2 = hex_chars.charAt(strCode % 16);
			strEncode += "%" + (hex1 + hex2);
			}
		}
	
	return strEncode;
	}  	
	
	
// =============================================
// FUNCAO PARA PEGAR OS ELEMENTOS DO FORM
// =============================================

function getData(idForm) {
	var formFields = document.getElementById(idForm).elements;
	var numFields = formFields.length;
	var queryString = "";
	var formElement;
	
	// Cria uma funcao interna para concatenar os elementos do form
	this.addElement = function(fieldName,fieldValue){ 
		if (queryString.length>0) { 
			queryString += "&";
			}
		//queryString += encodeURIComponent(fieldName) + "=" + encodeURIComponent(fieldValue);
		queryString += encodeURIComponent(fieldName) + "=" + strDecode(fieldValue);
		};
	
	// Loop para percorrer todos os elementos
	for (var i=0; i<numFields; i++) {
		
		// Pega o elemento
		formElement = formFields[i];
		if (!formElement.disabled) {
			
			// Trabalha com o elemento caso ele nao esteja desabilitado
			switch(formElement.type) {
				
				// Realiza a acao dependendo do tipo de elemento
				case 'text': case 'password': case 'hidden': case 'textarea': 
					this.addElement(formElement.name,formElement.value);
					break;
				case 'select-one':
					if (formElement.selectedIndex>=0) {
						this.addElement(formElement.name,formElement.options[formElement.selectedIndex].value);
						}
					break;
				case 'select-multiple':
					for (var j=0; j<formElement.options.length; j++) {
						if (formElement.options[j].selected) {
							this.addElement(formElement.name,formElement.options[j].value);
							}
						}
					break;
				case 'checkbox': case 'radio':
					if (formElement.checked) {
						this.addElement(formElement.name,formElement.value);
						}
					break;
				}
			}
		}
		return queryString;
	}
	
function appear(n) {
	if (document.getElementById('sub'+n+'').style.display=='none'){
		document.getElementById('sub'+n+'').style.display='block';
		}else{
		document.getElementById('sub'+n+'').style.display='none';
		}
	}
function toggleDiv(targetId){
		if(document.getElementById){
			target = document.getElementById(targetId);
			if(target.style.display == "none"){target.style.display = "";}
			else{target.style.display = "none";}
			}
		} 
