// FUNÇÃO BASE DO AJAX:=======================================================
// atualizado em 02/08/2007 por Kiyoshi

var classePreloader;
var ajaxCancelado = false;

function requisicaoDados(url, parametros, funcao_resultado, funcao_cancelamento, div_preloader, 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 não foi encontrado');
	}
	
	if(typeof(modo_debugger_ajax) == "undefined") {
		modo_debugger_ajax = false;
	}
	
	if(!modo_debugger_ajax) {
		
		parametros += '&ajax_aguardando_resposta=true';
		
		funcao_cancelamento_completa = function() { 
			ajaxCancelado = true;
			funcao_cancelamento();
		}
		if(typeof(preloaderAjax) != 'object') {
			if(div_preloader) {
				preloaderAjax = new classePreloaderLocalizado(div_preloader, funcao_cancelamento_completa);
			} else {
				preloaderAjax = new classePreloader(funcao_cancelamento_completa);
			}
		}
		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ção 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, "\n", "");
				xml = substituirCaractereString(xml, "	", "");
				xml = substituirCaractereString(xml, "> <", "><");
				// retirar informação inútil antes de um '<'
				xml = xml.substr(xml.indexOf("<"));
				
				str_resultado = "";
				
				// 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.');
						funcao_cancelamento_completa();
						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";
						}
					} 
				}
				
				// alert(str_resultado);
				eval(str_resultado);
				

				// ============================================================================

				
				// acionar função de finalização escolhida:
				funcao_resultado();
			} else if(!ajaxCancelado) {
				// erro:
				_numero_status = String(requisicao.status);
				if(_numero_status.indexOf('400') == 0) {
					_texto = 'Solicitação inválida.';
				} else if(_numero_status.indexOf('404') == 0) {
					_texto = 'Arquivo não encontrado.';
				} else if(_numero_status.indexOf('401') == 0) {
					_texto = 'Acesso negado.';
				} else if(_numero_status.indexOf('403') == 0) {
					_texto = 'Acesso proibido.';
				} else if(_numero_status.indexOf('405') == 0) {
					_texto = 'Verbo HTTP usado para acessar essa página não é permitido (método não permitido.).';
				} else if(_numero_status.indexOf('406') == 0) {
					_texto = 'O seu navegador não aceita o tipo de MIME da página solicitada.';
				} else if(_numero_status.indexOf('407') == 0) {
					_texto = 'Autenticação de proxy solicitada.';
				} else if(_numero_status.indexOf('412') == 0) {
					_texto = 'Erro na Precondition.';
				} else if(_numero_status.indexOf('413') == 0) {
					_texto = 'Entidade solicitada muito grande.';
				} else if(_numero_status.indexOf('414') == 0) {
					_texto = 'URI solicitada muito extensa.';
				} else if(_numero_status.indexOf('415') == 0) {
					_texto = 'Tipo de mídia sem suporte.';
				} else if(_numero_status.indexOf('416') == 0) {
					_texto = 'Intervalo solicitado não satisfatório.';
				} else if(_numero_status.indexOf('417') == 0) {
					_texto = 'Erro na execução.';
				} else if(_numero_status.indexOf('423') == 0) {
					_texto = 'Erro no bloqueio.';
				} else if(_numero_status.indexOf('500') == 0) {
					_texto = 'Erro no servidor.';
				} else {
					_texto = requisicao.statusText;
				}
				alert("Erro na busca de dados:\n" + _texto);
				funcao_cancelamento_completa();
			} 
		}
	}

	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;
	}


}


// PRELOAD DAS IMAGENS DE PRELOADER LOCALIZADO:
if(typeof(RAIZ_SITE) != 'string') {
	alert('Não foi definido a raiz do site para o javascript de preloader do ajax.');
}
img1 = new Image();
img1.src = RAIZ_SITE + 'biblioteca/ajax/preloader2/preloader2_a.giDf';
img2 = new Image();
img2.src = RAIZ_SITE + 'biblioteca/ajax/preloader2/preloader2_aa.gif';
img3 = new Image();
img3.src = RAIZ_SITE + 'biblioteca/ajax/preloader2/preloader2_b.gif';
img4 = new Image();
img4.src = RAIZ_SITE + 'biblioteca/ajax/preloader2/preloader2_bb.gif';
img5 = new Image();
img5.src = RAIZ_SITE + 'biblioteca/ajax/preloader2/preloader2_c.gif';
img6 = new Image();
img6.src = RAIZ_SITE + 'biblioteca/ajax/preloader2/preloader2_cc.gif';
img1 = new Image();
img1.src = RAIZ_SITE + 'biblioteca/ajax/preloader2/preloader2_ampulheta.gif';

var instanciaFlashPreloader = Array();

function classePreloaderLocalizado(id_elemento_html, funcao_cancelamento) {

	// INICIALIZAÇÃO: =========================================================
	// detectar o html de preloader na página:
	if(document.getElementById(id_elemento_html) == null) {
		alert('Erro interno: elemento HTML para inserir preloader não encontrado.');
		return false;
	}
	// STYLE POSITION PADRÃO (absolute ou relative): ==========================
	position_original = (document.getElementById(id_elemento_html).style.position == 'absolute' ? 'absolute' : 'relative');

	// criar elemento HTML do preloader dentro do elemento html:
	html = '<div id="' + id_elemento_html + '_25" class="preloader_bar_25 preloader_bar">&nbsp;</div>';
	html += '<div id="' + id_elemento_html + '_50" class="preloader_bar_50 preloader_bar">&nbsp;</div>';
	html += '<div id="' + id_elemento_html + '_75" class="preloader_bar_50 preloader_bar">&nbsp;</div>';
	html += '<div id="' + id_elemento_html + '_100" class="preloader_bar_100 preloader_bar">&nbsp;</div>';
	html += '<div class="preloader_ampulheta preloader_bar">&nbsp;</div>';
	html += '<input id="' + id_elemento_html + '_cancelar" type="button" value="cancelar" class="preloader_botao_cancelar" onclick="cancelarAjax(); " />';
	document.getElementById(id_elemento_html).innerHTML = html;
	
	// ATRIBUIR FUNÇÃO AO BOTÃO CANCELAR:
	document.getElementById(id_elemento_html + '_cancelar').onclick = funcao_cancelamento;
	
	// MÉTODOS: ===============================================================
	this.atualizarPreloader = atualizarPreloader;
	this.ocultarPreloader = ocultarPreloader;

	function atualizarPreloader(andamento_num) {
		// EXIBIR PRELOADER:
		if(position_original == 'relative') {
			document.getElementById(id_elemento_html).style.position = 'relative';
			document.getElementById(id_elemento_html).style.visibility = 'visible';
		} else {
			document.getElementById(id_elemento_html).style.display = 'block';
		}
		if(andamento_num == 1) {
			document.getElementById(id_elemento_html + '_cancelar').focus();
		}
		// CALCULAR PORCENTAGEM:
		andamento_porc = Number(andamento_num) * 25;
		// EXIBIR BARRA CHEIA:
		document.getElementById(id_elemento_html + '_' + andamento_porc).className = 'preloader_bar_' + andamento_porc + '_carregado';
		// MANDAR OCULTAR:
		if(andamento_num == 4) {
			this.ocultarPreloader();
		}
	}
	
	function ocultarPreloader() {
		if(position_original == 'relative') {
			document.getElementById(id_elemento_html).style.position = 'absolute';
			document.getElementById(id_elemento_html).style.visibility = 'hidden';
		} else {
			document.getElementById(id_elemento_html).style.display = 'none';
		}
	}
}

// OBJETO DO PRELOADER DO AJAX: ================================================
var javascript_preloader_existente = true;

function classePreloader(funcao_cancelamento) {
	
	// INICIALIZAÇÃO:
	// detectar o html de preloader na página:
	if(document.getElementById('preloader') == null) {
		alert('Erro interno: preloader não 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) {
		
		// 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) - 200 + scroll_left) + 'px';
		}
		
		// exibir o preloader:
		if(document.getElementById('preloader').style.display != 'block') {
			document.getElementById('preloader').style.display = 'block';
		}
		
		// exibir a tampa usuando o preloader de página:
		if(!document.getElementById('div_tampa_preloader_ajax')) {
			div_tampa = document.createElement('div');
			div_tampa.setAttribute('id', 'div_tampa_preloader_ajax');
			document.body.appendChild(div_tampa);
		} else {
			document.getElementById('div_tampa_preloader_ajax').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('div_tampa_preloader_ajax').style.display = 'none';
		document.getElementById('preloader').style.display = 'none';
	}
	
}

function cancelarAjax() {
	objetoRequisicaoDados.abortarRequisicao();
	if(typeof(preloaderAjax) == 'object') {
		preloaderAjax.ocultarPreloader();
		preloaderAjax.ajaxCancelado = true;
	}
	ajaxCancelado = false;
}