/*
require: agility.js
*/

/*{{{ Definição do objeto XMLHTTPRequest/
this.XMLHTTPObject = Try.these(
	  function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}      
    ) || false;
/*}}}*/


Ajax = Class.create();

/*{{{ Definição da classe Ajax */
Ajax.prototype = {

    initialize: function(){
        this.XMLHTTPObject = Try.these(
            function() {return new XMLHttpRequest()},
            function() {return new ActiveXObject('Msxml2.XMLHTTP')},
            function() {return new ActiveXObject('Microsoft.XMLHTTP')}
        ) || false;
    },
	
    fila: [],
	
    indice: 0,

    XMLHTTPObject: false,
    
    insert: function(url, idElement) {/*{{{*/
        var element = $(idElement) || false;

        if(this.XMLHTTPObject) {
            if(!element) {
                alert("Elemento de ID " + idElement + " não encontrado!");
                return false;
            }
            element.innerHTML = "<span class='loading'>Carregando...</span>";
            this.XMLHTTPObject.open("GET", url, true);
            this.XMLHTTPObject.onreadystatechange = function() {
                if(this.XMLHTTPObject.readyState == 4)
                    if(this.XMLHTTPObject.status == 200)
                        element.innerHTML = this.XMLHTTPObject.responseText;
            }
            this.XMLHTTPObject.send(null);
        } else {
            alert("XMLHTTPObject não criado");
            return false;
        }
    },/*}}}*/ 

    run: function (url, returnFunction, idElement, formObj){/*{{{*/
        if(this.XMLHTTPObject) {
            var dataSend = null;
            var method = "GET";
            if(typeof formObj != "undefined") {
                method = "POST";
                dataSend = $h(formObj) || null;
            }

            if(idElement) $(idElement).innerHTML = "<span class='loading'>Carregando...</span>";

            this.XMLHTTPObject.open(method, url, true); 
            this.XMLHTTPObject.onreadystatechange = function() {
                if(ajaxObj.XMLHTTPObject.readyState == 4)
                    if(ajaxObj.XMLHTTPObject.status == 200)
                    	returnFunction(ajaxObj.XMLHTTPObject.responseText);
            }
            /* preciso dar uma olhada no trecho POST depois, pra saber quando é form
               e quando não é. */
            if(method == "POST")
                this.XMLHTTPObject.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        
            this.XMLHTTPObject.send(dataSend);
        } else { 
            alert("XMLHTTPObject não criado");
            return false;
        }
    },/*} }}*/

    runPost: function (url, returnFunction, idElement, params) {
        if(this.XMLHTTPObject) {
        	//alert($(idElement).innerHTML)
            if(idElement) $(idElement).innerHTML = "<span class='loading'>Carregando...</span>";
            this.XMLHTTPObject.open('POST', url, true);
            this.XMLHTTPObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            this.XMLHTTPObject.setRequestHeader("Connection", "close");
            this.XMLHTTPObject.onreadystatechange = function() {
                if(ajaxObj.XMLHTTPObject.readyState == 4)
                    if(ajaxObj.XMLHTTPObject.status == 200)
                        returnFunction(ajaxObj.XMLHTTPObject.responseText);
            }
            this.XMLHTTPObject.send(params);
        } else {
            alert("XMLHTTPObject não criado");
            return false;
        }
    },
    
    add: function(url, returnFunction, idElement, formObj){/*{{{*/
        if(this.XMLHTTPObject){
            if(typeof returnFunction == "string") returnFunction = eval(returnFunction);
            this.fila.push([url, returnFunction, idElement, formObj]);
            if(this.fila.length-1 == this.indice) {
    		       this.run(url, this.retorno, idElement, formObj);
    		   }
        } else {
            alert("XMLHTTPObject não criado");
            return false;
        }
    },/*}}}*/

    addPost: function(url, returnFunction, idElement, formObj){
        if(this.XMLHTTPObject){
            if(typeof returnFunction == "string") returnFunction = eval(returnFunction);
            this.fila.push([url, returnFunction, idElement, formObj]);
            if(this.fila.length-1 == this.indice) {
                       this.runPost(url, this.retorno, idElement, formObj);
            }
        } else {
            alert("XMLHTTPObject não criado");
            return false;
        }
    },

    /*{{{NÃO ALTERAR */
    //Executa o retorno de uma requisição e, se houver,
    //executa a próxima requisição
    retorno: function(dados) {
        ajaxObj.fila[eval(ajaxObj.indice)][1](dados);

        if(ajaxObj.fila.length > ++ajaxObj.indice){
            req = ajaxObj.fila[ajaxObj.indice];
            ajaxObj.run(req[0], ajaxObj.retorno, req[2], req[3]);
        }
    }
    /*}}}*/


//<!-- Fim dos métodos e propriedades do objeto Ajax -->
}/*}}}*/

ajaxObj = new Ajax();

