function getReader()
{
	try {
		xmlhttp = new XMLHttpRequest();
		return xmlhttp;
	} catch(ee) {
		try {
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
			return xmlhttp;
		} catch(e) {
			try {
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
				return xmlhttp;
			} catch(E) {
				xmlhttp = false;
			}
		}
	}
}

ajax_lista	= new Array(0);
isBusy = false;
//Adiciona uma tarefa à lista - se tem segundo argumento, executa na hora
function newTask(task)
{
	ajax_lista.push(task);
	if ( newTask.arguments[1] )	getContent();
}

//Executa toda a lista
function getContent()
{	
	if ( ajax_lista.length && !isBusy ) {
		isBusy = true;
		funcao = ajax_lista[0];
		
		xmlhttp = getReader();	//Pega o leitor
		
		eval("method = "+funcao+"('getMethod');");	//Pega o method
		eval("url = "+funcao+"('getUrl');");			//Pega a URL
		eval("dados = "+funcao+"('getData');");		//Pega dados para envio (post)
		
		if ( document.getElementById('loading') )	document.getElementById('loading').innerHTML = 'Carregando...';//msg de carregando!!!!!!!!
		
		xmlhttp.open(method, url, true);
		xmlhttp.setRequestHeader("charset", "ISO-8859-1");
		xmlhttp.onreadystatechange = function() {
			if ( xmlhttp.readyState == 4 ) {
				var c1 = xmlhttp.responseText;
				//Desfaz o urlencode
				c1	= c1.replace(/\+/g, " ");
				c1	= unescape(c1);
				eval(funcao+"(c1);");
				
				if ( document.getElementById('loading') )	document.getElementById('loading').innerHTML = '';//esconde carregando
				//Tira da fila
				tmp = new Array(0);
				for ( i=1; i<ajax_lista.length; i++ )	tmp.push(ajax_lista[i]);
				ajax_lista = tmp;
				isBusy = false;
				if ( ajax_lista.length )	getContent();
			}
		}
		if ( dados ) {
			xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		}
		xmlhttp.send(dados);
	}
}