/**
 * fila de Ajax
 */
var queueFila = new Array();
var queueExec = true;

/**
 * inicia o XmlHttpRequest
 */
function queueRequest() {
    var request;
    try {
        request = new ActiveXObject("Microsoft.XMLHTTP");
    }catch(e) {
        try {
            request = new ActiveXObject("Msxml2.XMLHTTP");
        }catch(ex) {
            try {
                request = new XMLHttpRequest();
            }catch(exc) {
                alert("Esse browser não tem recursos para uso do Ajax");
                request = null;
            }
        }
    }
    return request;
}

/**
 * funcao que adiciona o Ajax a fila
 */
var queueAjax = function(json) {
    /*if((typeof json.element)=="string"){
        document.getElementById(json.element).innerHTML = "Aguarde...";
    }else{
        try{
            json.element.innerHTML = "Aguarde...";
        }catch(e){}
    }*/
    queueFila.push(json);
    executeQueue(queueExec);
}

var queueAjaxInterpreter = function(current){
    Ajax = queueRequest();
    Ajax.onreadystatechange = function() {
        /*
        if(Ajax.readyState == 1){
            if((typeof current.element)=="string"){
                document.getElementById(current.element).innerHTML = "Carregando...";
            }else{
                try{
                        current.element.innerHTML = "Carregando...";
                }catch(e){}
            }
	}
        */
        if(Ajax.readyState == 4){
            if(Ajax.status == 200){
                try{
                    current.sucess(Ajax);
                }catch(err){}
                if(queueFila.length > 0){
                    executeQueue(true);
                }else{
                    queueExec = true;
                }
            }else if(Ajax.status == 404){
                try{
                    current.error(Ajax);
                }catch(e){}
                queueExec = true;
            }
        }
    }
    if(current.method=="GET"){
        Ajax.open("GET", current.url, true);
        Ajax.send(null);
    }else if(current.method=="POST"){
        Ajax.open("POST", current.url, true);
        Ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        Ajax.setRequestHeader("Content-length", current.parameter.length);
        Ajax.setRequestHeader("Connection", "close");
        Ajax.send(current.parameter);
    }
}

/**
 * funcao que executa a fila de Ajax
 */
var executeQueue = function(_queueExec) {
    if(_queueExec){
        queueExec = false;
        var current = queueFila.shift();
        queueAjaxInterpreter(current);
    }
}

/**
 * funcao ajaxHTML 3.1
 *
 * _element = elemento que vai receber a resposta do ajax tipo string ou element
 * _url = url do ajax tipo string
 * _options = {
 *	'focus' : 'elemento que recebera focus apos carregar o _element pode ser tipo string ou element'
 *      , 'script' : 'executa este script'
 *	}
 */
var jfAjaxHTML = function(_element, _url, _options){
    queueAjax({
        element : _element
        ,url : _url
        ,method : "GET"
        ,sucess : function(_Ajax){
            try{
                document.getElementById(_element).innerHTML = _Ajax.responseText;
                //trata _options
                if((typeof _options)=='object'){
                    //trata _focus
                    if((typeof _options.focus)=='string'){
                        document.getElementById(_options.focus).focus();
                    }else if((typeof _options.focus)=='element'){
                        _options.focus.focus();
                    }
                    //trata script
                    if((typeof _options.script)=='string'){
                        eval(_options.script);
                    }
                }
            }catch(err){
                alert(err);
            }
        }
        ,error : function(_Ajax){
            document.getElementById(_element).innerHTML = "Erro...";
        }
    });
}

var ajaxHTML = jfAjaxHTML;

var jfAjaxEval = function(_url){
    queueAjax({
        url : _url
        ,method : "GET"
        ,sucess : function(_Ajax){
            try{
                eval(_Ajax.responseText);
            }catch(err){
                alert(err);
            }
        }
    });
}

/**
 * funcao que faz que permite o acesso do servidor a funcoes no cliente
 * @example doRMI('rmi.php', [open,...], 3000);
 */
function doRMI(_url, _methods, _timeout){
    try{
        queueAjax({
            url : _url
            ,method : "GET"
            ,sucess : function(_Ajax){
                try{
                    var i = parseInt(_Ajax.responseText);
                    if(i >= 0 && i < _methods.length){
                        _methods[i]();
                    }
                }catch(e){}
            }
        });
        setTimeout(doRMI, _timeout, _url, _methods, _timeout);
    }catch(e){}
}