//Mensagem de carregando (DESIGNER, MEXA SÓ AQUI!)
ajax_Carregando='<span class="carregando" style="font-family:Arial; width:80px;height:15px; color:#3399cc; margin-left:670px; ">   Carregando...</span>';

//Nossa fila de conexões
ajax_Fila=[];
//Variável que vai guardar a função de retorno
ajax_retF=false;
//Nossas filas "auxiliares" de retornos (HTML e JSON)
filaHTML=[];
filaJSON=[];


//O velho código pra criar o objeto...
try{
	//Tenta do jeito certo
	xmlhttp=new XMLHttpRequest();
}catch(e){
	try{
		//Tenta do jeito "IE6"
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	}catch(E){
		try{
			//Tenta do jeito "IE5"
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		}catch(ee){
			//Desiste
			xmlhttp = false;
		}
	}
}


/*
Função "principal": põe as coisas na fila e,
se a fila não estiver sendo executada, chama
a doRealRequest().
*/
function doRequest(url,funcao_retorno,dados){
	//Põe na fila (por último)
	ajax_Fila.push([url,funcao_retorno,dados])
	//Se só existir essa requisição na fila, chama o doRealRequest
	if(ajax_Fila.length==1) doRealRequest();
}

/*
Pega a primeira requisição da fila e executa,
dizendo pra chamar a ret_doRequest() quando
terminar.
*/
function doRealRequest(){
	//Pega as informações da primeira requisição da fila
	requisicao=ajax_Fila[0]
		url=requisicao[0]
		funcao_retorno=requisicao[1]
		dados=requisicao[2]

	//Se não tem "dados", é GET; se tem, é POST.
	metodo="GET"
	if(dados) metodo="POST";

	//"Prepara" a requisição
	xmlhttp.open(metodo,url,true)
	//Diz pra chamar a ret_doRequest() quando terminar
	xmlhttp.onreadystatechange=ret_doRequest
	//Se tem "dados", passa o cabeçalho (pra envio via POST)
	if(dados) xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	//Faz a requisição
	xmlhttp.send(dados)

}

/*
É chamada quando a requisição termina. Executa a
função de retorno relativa a essa requisição, e
remove a requisição da fila. Depois, vê se ainda
há requisições na fila e, se houver, chama a
doRealRequest().
*/
function ret_doRequest(){
	//Se a requisição terminou
	if(xmlhttp.readyState==4){

		//Pega as informações da primeira requisição da fila
		requisicao=ajax_Fila[0]
			url=requisicao[0]
			funcao_retorno=requisicao[1]
			dados=requisicao[2]
		//Chama a função de retorno relativa a essa requisição,
		//  passando como parâmetro o texto que veio do servidor
		funcao_retorno(xmlhttp.responseText)
		//Remove a primeira requisição da fila
		ajax_Fila.shift()
		//Se ainda tem alguma coisa na fila, chama a 
		//  doRealRequest() (com o truquezinho dos 20 milisegundos)
		if(ajax_Fila.length>0) setTimeout("doRealRequest()",20);
	}
}

/////////////////////////

/*
Põe o id de um elemento HTML na filaHTML e cria
uma requisição à url dizendo pra, quando a
requisição terminar, chamar a função
ret_doHTML().
*/
function doHTML(url,idelemento,dados){
	//Põe o id no final da fila
	filaHTML.push(idelemento)
	//Escreve a mensagem de "carregando" no elemento
	document.getElementById(idelemento).innerHTML=ajax_Carregando
	//Cria a requisição
	doRequest(url,ret_doHTML,dados)
}

/*
Recebe o texto que a doHTML() mandou buscar
no servidor. Joga esse texto no conteúdo do
primeiro elemento da filaHTML, e remove esse
elemento da fila.
*/
function ret_doHTML(responseText){
	//Pega o primeiro elemento da fila
	idelemento=filaHTML[0]
	//Escreve o texto (desencodado) nele
	document.getElementById(idelemento).innerHTML=unescape(responseText.replace(/\+/g," "))
	//Arranca o elemento da filaHTML
	filaHTML.shift()
}

/////////////////////////

/*
Põe uma função de retorno na filaJSON e cria
uma requisição à url dizendo pra, quando a
requisição terminar, chamar a função
ret_doJSON().
*/
function doJSON(url,funcao_retorno,dados){
	//Põe a função de retorno no final da fila
	filaJSON.push(funcao_retorno)
	//Cria a requisição
	doRequest(url,ret_doJSON,dados)
}

/*
Recebe o javascript que a doJSON() mandou buscar
no servidor. "Evalua" esse texto e passa pra
função de retorno, que era o primeiro elemento
da nossa filaJSON. E enfim, remove esse elemento
da fila.
*/
function ret_doJSON(responseText){
	//Pega a função de retorno (primeiro elemento da nossa filaJSON)
	funcao_retorno=filaJSON[0]
	//"Evalua" o texto (javascript) que veio do servidor
	funcao_retorno(eval("["+responseText+"]")[0])
	//Arranca o elemento da filaJSON
	filaJSON.shift()
}







////////////////////////////////////
//                                //
//   Presentinhos do Elcio: ;-)   //
//                                //
////////////////////////////////////

/*
doURLEncode
	Recebe um formulário ou um dicionário (Array nomeado, objeto,
	ou como você preferir chamar) e monta uma querystring
*/
function doURLEncode(d){
	var t="";
	if(d.innerHTML){
		var d2={};
		for(var i=0;i<d.elements.length;i++){
			var o=d.elements[i];
			if(o.name) d2[o.name]=o.value;
		}
		d=d2;
	}
	for(var i in d)
		t+=encodeURIComponent(i)+"="+encodeURIComponent(d[i])+"&";
	return t;
}
//Vamos precisar disso
Array.prototype.last=function(){
	return this[this.length-1];
}

