function AjaxCall(servletURL, parameters, callback, userData)
{
    /********/
    /* Data */
    /********/
    var ajax;

    /***************/
    /* Constructor */
    /***************/
    ajax = ajaxNew();
    ajax.onreadystatechange = processRequest;

    /***********/
    /* Methods */
    /***********/
    function processRequest()
    {
        if(ajax.readyState == 4) {
            if((ajax.status == 200)||(ajax.status == 0)) {
                if(callback != null) callback(ajax.responseText, ajax.readyState, userData);
            }else {
                alert("Error de AJAX");
            }
        }else {
            // If readyState is not 4, responseText is not yet set and should not be used
            if(callback != null) callback("", ajax.readyState, userData);
        }
    }

    this.doGET = function()
    {
        ajax.open("GET", servletURL+"?"+encodeURI(parameters), true);
        ajax.send(null);
    }

    this.doPOST = function()
    {
        ajax.open("POST", servletURL, true);
        ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        ajax.setRequestHeader("Content-length", parameters.length);
        ajax.setRequestHeader("Connection", "close");
        ajax.send(parameters);
    }

    function ajaxNew()
    {
        var xmlHttp = false;

        if(window.XMLHttpRequest) {                     // Opera, Firefox, Safari
            xmlHttp = new XMLHttpRequest();
        }else if(window.ActiveXObject) {                // Internet Explorer Browsers (Yuck!)
            try{
                xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
            }catch(e) {
                try {
                    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                }catch(E) {
                    xmlHttp = false;
                }
            }
        }
        return xmlHttp;
    }
}
