// FUNÇÃO BASE DO AJAX:=======================================================

var classePreloader;
this.ajaxCancelado;

function requisicaoDados(url, parametros, funcao_resultado, funcao_cancelamento, nao_centralizar_preloader) {
	
	// ATRIBUTOS:
	this.url = url;
	var requisicao;

	// MÉTODOS: ===================================================
	this.processarResposta = processarResposta;
	this.abortarRequisicao = abortarRequisicao;

	// INICIALIZAÇÃO DO OBJETO: ===================================
	
	if(typeof(javascript_preloader_existente) == 'undefined') {
		alert('O javascript externo do preloader do ajax nao foi encontrado');
	}
	
	if(typeof(modo_debugger_ajax) == "undefined") {
		modo_debugger_ajax = false;
	}
	
	if(!modo_debugger_ajax) {
		
		parametros += '&ajax_aguardando_resposta=true';
		
		preloaderAjax = new classePreloader(funcao_cancelamento);
		var requisicao;	// « todos dados requisitados ficam dentro dele.
		
		// para objeto XMLHttpRequest nativo do browser (firefox, etc.):
		if (window.XMLHttpRequest) {
			requisicao = new XMLHttpRequest();
			requisicao.onreadystatechange = this.processarResposta;
			requisicao.open("POST", this.url, true);
			requisicao.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			requisicao.send(parametros);
		// para IE/Windows ActiveX version:
		} else if (window.ActiveXObject) {
			requisicao = new ActiveXObject("Microsoft.XMLHTTP");
			if (requisicao) {
				requisicao.onreadystatechange = this.processarResposta;
				requisicao.open("POST", this.url, true);
				requisicao.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
				requisicao.send(parametros);
			}
		} 
	
	} else {
		
		// CASO ESTEJA EM MODO DEBUGGER DO AJAX, FAZ A REQUISIÇÃO EM OUTRA JANELA
		window.open(url + "?" + parametros, "janela_debugger");

	}
	
	function abortarRequisicao() {
		requisicao.abort();
	}
	
	function processarResposta() {
		
		// enviar dados pro preloader: ==========================================
		preloaderAjax.atualizarPreloader(requisicao.readyState, nao_centralizar_preloader);
		
		// Depois que carregar os dados: 
		if (requisicao.readyState == 4) {
			// caso a página de requisiçao tenha sido encontrada com sucesso:
			if (requisicao.status == 200) {
				// ===========================================================================
				// MONTAGEM DO CÓDIGO DOS OBJETOS E VARIÁVEIS REQUISITADAS: ==================
				// ===========================================================================
				
				xml = requisicao.responseText;
				// retirar caracteres inválidos:
				xml = substituirCaractereString(xml, "\r\n", "");
				xml = substituirCaractereString(xml, "\r", "");
				xml = substituirCaractereString(xml, "	", "");
				xml = substituirCaractereString(xml, "> <", "><");
				// retirar informaçao inútil antes de um '<'
				xml = xml.substr(xml.indexOf("<"));
				
				str_resultado = "";
				debugge = "";
				
				// iniciar contador de tempo (pra evitar loop infinito)
				numero_maximo_loops = 50000;
				for(i=1; xml!=""; i++) {
					//	VERIFICAR SE NÃO ESTÁ EM LOOP INFINITO:
					if(i > numero_maximo_loops) {
						alert('Houve algum erro no processamento dos dados.' + xml);
						return;
					}
					if(xml.indexOf("</") == 0) {
						str_resultado += "}\n";
						xml = xml.substr(xml.indexOf(">") + 1);
					} else if(xml.indexOf("<") == 0) {
						elemento = xml.substr(1, (xml.indexOf(">")-1));
						xml = xml.substr(elemento.length + 2);
						if(xml.indexOf("<") == 0 && xml.indexOf("</") != 0 ) {
							elemento_tipo = "objeto";
							str_resultado += "document." + elemento + " = new funcao_" + elemento + "();\n";
							str_resultado += "function funcao_" + elemento + "() {\n";
						} else {
							elemento_tipo = "variavel";
							elemento_valor = xml.substr(0, xml.indexOf("<"));
							xml = xml.substr((xml.indexOf("</" + elemento + ">") + elemento.length + 3));
							str_resultado += elemento + "='" + elemento_valor + "';\n";
						}
					} 
				}
				this.ajaxCancelado = false;
				
				// document.write('&lt;script language="javascript"&gt;<br />' + str_resultado.replace(/\n/g, '<br />') + '&lt;/script&gt;');
				eval(str_resultado);

				// ============================================================================

				
				// acionar funçao de finalizaçao escolhida:
				funcao_resultado();
			} else {
				// erro:
				alert("Erro na busca de dados:\n" + requisicao.statusText);
			}
		}
	}

	function substituirCaractereString(string, caractere_original, caractere_substituicao) {
		string_array = string.split(caractere_original);
		resultado = "";
		for(i=0; i<string_array.length; i++) {
			resultado += string_array[i];
			resultado += (i+1<string_array.length ? caractere_substituicao : "");
		}
		return resultado;
	}


}


// OBJETO DO PRELOADER DO AJAX: ================================================
javascript_preloader_existente = true;
nao_exibir_preloader = false
function classePreloader(funcao_cancelamento) {
	
	// INICIALIZAÇÃO:
	// detectar o html de preloader na página:
	if(document.getElementById('preloader') == null) {
		alert('Erro interno: preloader nao encontrado.');
		return false;
	} 
	document.getElementById('preloader_botao_cancelar').onclick = funcao_cancelamento;
	
	// MÉTODOS: ===============================================================
	this.atualizarPreloader = atualizarPreloader;
	this.ocultarPreloader = ocultarPreloader;
	
	function atualizarPreloader(andamento_num, nao_centralizar) {
		if(!nao_exibir_preloader) {
			// posicionar o preloader no centro:
			if(!nao_centralizar) {
				// VERIFICAR A ALTURA INTERNA DO BROWSER: =============
				if (self.innerHeight) {	
					// todos browsers menos o IE:
					altura_interna_janela = self.innerHeight;
					largura_interna_janela = self.innerWidth;
				} else if (document.documentElement && document.documentElement.clientHeight) {
					// IE em strict mode:
					altura_interna_janela = document.documentElement.clientHeight;
					largura_interna_janela = document.documentElement.clientWidth;
				} else if (document.body) {
					// outros explorers:
					altura_interna_janela = document.body.clientHeight;
					largura_interna_janela = document.body.clientWidth;
				}
				// ver o scroll da página:
				if (document.documentElement && document.documentElement.scrollTop) {
					// Internet explorer:
					scroll_top = document.documentElement.scrollTop;
					scroll_left = document.documentElement.scrollLeft;
				} else if (document.body) {
					// firefox:
					scroll_top = document.body.scrollTop;
					scroll_left = document.body.scrollLeft;
				} else { 
					// fudeu..
				}
	
				document.getElementById('preloader').style.top = Math.floor((altura_interna_janela/2) - 20 + scroll_top) + 'px';
				document.getElementById('preloader').style.left = Math.floor((largura_interna_janela/2) - 20 + scroll_left) + 'px';
			}
			
			// exibir o preloader:
			if(document.getElementById('preloader').style.display != 'block') {
				document.getElementById('preloader').style.display = 'block';
			}
			andamento_porc = Number(andamento_num) * 25;
			document.getElementById('preloader_bar_' + andamento_porc).style.display = 'block';
			if(andamento_num == 4) {
				this.ocultarPreloader();
			}
		}
	}
	
	function ocultarPreloader() {
		document.getElementById('preloader').style.display = 'none';
	}
	
}

function cancelarAjax() {
	objetoRequisicaoDados.abortarRequisicao();
	preloaderAjax.ocultarPreloader();
	preloaderAjax.ajaxCancelado = true;
}