//js = .utf8_decode()
//php = rawurlencode rawurldecode
/*
// url_encode version 1.0  
// url_decode version 1.0  
function url_decode(str) {  
    var n, strCode, strDecode = "";  

    for (n = 0; n < str.length; n++) {  
        if (str.charAt(n) == "%") {  
            strCode = str.charAt(n + 1) + str.charAt(n + 2);  
            strDecode += String.fromCharCode(parseInt(strCode, 16));  
            n += 2;  
        } else {  
            strDecode += str.charAt(n);  
        }  
    }  
    return strDecode;  
}  
*/

function url_encode(str) {  
    var hex_chars = "0123456789ABCDEF";  
    var noEncode = /^([a-zA-Z0-9\_\-\.])$/;  
    var n, strCode, hex1, hex2, strEncode = "";  

    for(n = 0; n < str.length; n++) {  
        if (noEncode.test(str.charAt(n))) {  
            strEncode += str.charAt(n);  
        } else {  
            strCode = str.charCodeAt(n);  
            hex1 = hex_chars.charAt(Math.floor(strCode / 16));  
            hex2 = hex_chars.charAt(strCode % 16);  
            strEncode += "%" + (hex1 + hex2);  
        }  
    }  
    return strEncode;  
}

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)
		
		document.getElementById('loading').style.display = '';//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);");
				
				document.getElementById('loading').style.display = 'none';//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);
	}
}