// Classe	: ajax.
// Objetivo	: Manipulação completa do objeto XMLHttpRequest usando apenas JavaScript.
// Criador	: João Cândido de Souza Neto
// Data		: 1/12/2006
function ajax() {
	// Cria objeto XMLHttpRequest

	if (window.XMLHttpRequest && !(window.ActiveXObject)) {
		try {
			this.objeto = new XMLHttpRequest;
		} catch(e) {
			return false;
		}
		// branch for IE/Windows ActiveX version
	} else if (window.ActiveXObject) {
		try {
			this.objeto = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
				this.objeto = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
				return false;
			}
		}
	}
	// Torna o objeto público
	try {
		var obj = this;
	} catch(e) {
		alert("Erro na publicação do objeto!\n"+e);
		return false;
	}
	
	// Função que efetua a requisição ao servidor
	// Parâmetros:
	// 		metodo	= "GET" ou "POST"
	//		url		= URL que será feita a requisição
	//		destino	= Objeto destino para o resultado da requisição
	//		dados	= Variáveis a serem enviadas ao servidor (Ex: nome=Joao&sobrenome=Souza
	//		show	= true apresenta mensagem "Carregando...", false omite mensagem
	function mostra( metodo, url, destino, dados, show, move ){
		if (metodo!="GET" && dados.length > 0) dados = dados + "&ajax=1";
		/*
			A adição de ajax=1 nos dados a serem enviados ao servidor por uma questão de unicode
			o objeto XMLHttpRequest quando envia dados por POST sempre os envia em utf-8
			e no meu caso precisei convertê-los para ISO-8859-1
		*/
		if (obj.objeto.readyState != 4 && obj.objeto.readyState != 0) return false;
		if (move != false) window.scrollTo(0,0);
		if (obj.destino == "undefined") {
			alert("O destino definido não existe!");
			return false;
		}
		obj.show_is	= show
		obj.onde	= destino;
		try {
			obj.objeto.open(metodo,url+(metodo=="GET"?(url.indexOf("?")>=0?"":"?")+dados:""),true);
		} catch(e) {
			alert("Erro ao definir requisição!\n"+e);
			return false;
		}

		if (metodo=="POST") {
			try {
				//x-www-form-urlencoded
				obj.objeto.setRequestHeader("Content-Type"	, "application/x-www-form-urlencoded;");
				obj.objeto.setRequestHeader("Content-length", dados.length);
				obj.objeto.setRequestHeader("Accept"		, "*/*");
			} catch(e) {
				alert("Erro ao enviar conteúdo de cabeçalho!\n"+e);
				return false;
			}
		}

		obj.objeto.onreadystatechange = obj.processReqChange;

		try {
			obj.objeto.send((metodo == "GET" ? "" : dados));
		} catch(e) {
			alert("Erro ao enviar requisição!\n"+e);
			return false;
		}
		return true;
	}
	this.mostra = mostra;
	
	// Função handler que controla o andamento da requisição e
	// apresenta o resultado no destino indicado
	function processReqChange() {
		// only if req shows "loaded"

		if (obj.objeto.readyState != 4 && obj.show_is) {
			if (obj.onde != null) {
				obj.onde.style.color="red";
				obj.onde.innerHTML="<br><br><br><br>Carregando...";
			}
		} else if (obj.objeto.readyState == 4) {
			try {
				if (obj.objeto.status == 200) {
					if (obj.onde != null) {
						obj.onde.style.color="black";
						obj.onde.innerHTML = obj.objeto.responseText;
						//extraiScript(obj.onde.innerHTML);
						extraiScript(obj.objeto.responseText);
					} else extraiScript(obj.objeto.responseText);
				} else {
					if (obj.onde != null) obj.onde.innerHTML="<br><br><br><br><strong>Erro ao carregar os dados!</strong><br>"+obj.objeto.status;
					else alert("erro ao carregar os dados!\n"+obj.objeto.status);//glt
				}
			} catch (err) {
			}
    		if (obj.executar_cod) eval(obj.executar_cod); 
		}
	}
	this.processReqChange = processReqChange;
	
	// Função Carregar+JS
	// Carrega os scripts JavaScript colocado através de arquivo JS contidos no retorno da requisição
	function Carregar_JS(arquivo) {
		ss = document.createElement("scr" + "ipt"); 
		ss.type = "text/javascript"; 
		ss.src = arquivo; 
		document.body.appendChild(ss);
	}
	
	// Função Pega_JS
	// Verifica no retorno da requisição os arquivos JS que precisam ser carregados.
	function Pega_JS(da_tag) {
		if (da_tag.length > 0) {
			var da_tag2 = new String(da_tag.toLowerCase()); 
			rr = da_tag2.indexOf("src=", 0);
			if (rr != -1) {
				rr += 3;
				if (da_tag2.charAt(rr+1)=="'") aspa = "'";
				else if (da_tag2.charAt(rr+1)=="\"") aspa = "\"";
				else aspa = "";
				if (aspa) {
					rr2 = da_tag2.indexOf(aspa, rr+2);
					soma = 2;
				} else {
					soma = 1;
					rr2 = da_tag2.indexOf(" ", rr+1);
					if (rr2 == -1) rr2 = da_tag2.length - rr + 1 + 3; //não tem aspas, só termina!
				}
				o_arq_js = new String(da_tag.substring(rr+soma,rr2));
				if (o_arq_js.length > 0) Carregar_JS(o_arq_js);
			}
		}
	}
	
	// Função extraiScript
	// Carrega os scripts javasacript que estão dentro do retorno da requisição.
	function extraiScript(texto) {
		var ini = 0;
		var texto2 = new String(texto.toLowerCase());
		while (ini!=-1) {
			var ini_ant=ini
			ini = texto2.indexOf("<script", ini);
			if (ini == -1) ini = texto2.indexOf("<script", ini_ant);
			if (ini >=0) {
				fecha = texto2.indexOf(">", ini);
				Pega_JS(texto.substring(ini+7,fecha));
				ini = fecha + 1;
				var fim = texto2.indexOf("/script>", ini);
				if (fim == -1) fim = texto2.indexOf("/script>", ini);
				codigo = texto.substring(ini,fim-1);
				var novo;
				try {
					novo = document.createElement("script");
				} catch(e) {
					alert("Erro ao criar elemento script!");
				}
				novo.text = codigo;
				try {
					document.body.appendChild(novo);
				} catch(e) {
					alert("Erro ao adicionar elemento script na página!");
				}
			}
		}
	}
	this.extraiScript = extraiScript;
	
	// Função para envio de formulários
	// Parâmetros:
	// 		form	= Objeto formulário
	// 		metodo	= "GET" ou "POST"
	//		url		= URL que será feita a requisição
	//		destino	= Objeto destino para o resultado da requisição
	//		show	= true exibe mensagem "Carregando...", false omite a mensagem.
	function enviar(form, metodo, url, destino, dados, show, move) {
		for (i=0; i<form.elements.length; i++) {
			try {
				if (form.elements[i].type == "button" || form.elements[i].type == "submit" || form.elements[i].type == "reset") continue;
				else if (form.elements[i].type == "checkbox" || form.elements[i].type == "radio") {
					if (form.elements[i].checked) dados+=(dados.length>0?"&":"")+form.elements[i].name+"="+form.elements[i].value;
				} else if (form.elements[i].type == "select-multiple") {
					campo = form.elements[i];
					if (campo.length > 0) {
						for (c=0; c < campo.length; c++) {
							if (campo.options[c].selected) dados+=(dados.length>0?"&":"")+campo.name+"[]="+campo.options[c].value;
						}
					}
				} else if (form.elements[i].type == "password") {
					dados+=(dados.length>0?"&":"")+form.elements[i].name+"="+form.elements[i].value;
				} else {
					dados+=(dados.length>0?"&":"")+form.elements[i].name+"="+encodeURIComponent(form.elements[i].value);
				}
			} catch(e) {
				alert("Erro na obtenção dos dados para envio do formulário!\n"+e);
				return;
			}
		}
		try {
			obj.mostra(metodo, url, destino, dados, show, move);
		} catch(e) {
			alert("Erro na solicitação do envio do formulário!");
			return
		}
	}
	this.enviar = enviar;
}
