function Ajax(){

    var createRequest = function(url,params,returnId,replace,async){

        var XMLObject;
        var onSent = [];
        var onProcess = [];
        var onReady = [];
        var asynchronous;
        var data;
        var address;
        var sent = false;
        var responseData = null;

        var request = {
            setReturnLocation : function(id,replace){
                var string = "";
                if(id !== undefined){
                    string += "returnId="+id;
                }
                if(replace !== undefined){
                    string += "&replace="+replace;
                }
                if(data === undefined){
                    data = string;
                }else{
                    data += (string != "") ? "&"+string : "";
                }
            },

            addCallback : function(readyState,func){
                switch(readyState){
                    case 2:
                        onSent.push(func);
                        break;
                    case 3:
                        onProcess.push(func);
                        break;
                    case 4:
                        onReady.push(func);
                        break;
                    default:
                        break;
                }
            },

            setHeader : function(property,value){
                XMLObject.setRequestHeader(property,value);
            },

            setResponseData : function(responseData){
                this.responseData = responseData;
            },

            addParams : function(params){
                data = params;
            },

            setPostHeaders : function(){
                this.setHeader("Content-type", "application/x-www-form-urlencoded");
            },

            isReady : function(){
                return (XMLObject.readyState === 4);
            },

            isSent : function(){
                return (XMLObject.readyState === 2);
            },

            isProcessing : function(){
                return (XMLObject.readyState === 3);
            },

            open : function(type,url,async){
                address = url;
                asynchronous = async;
                XMLObject.open(type,url,async);
            },

            send : function(){
                if (XMLObject !== undefined && !sent){
                    if(data === undefined){
                        data = "request=true";
                    }else{
                        data += "&request=true";
                    }
                    this.setPostHeaders();
                    XMLObject.send(data);
                    sent = true;
                    if(asynchronous === false && System.browser.isFF()){
                        for(var x = 0; x < onReady.length; x++){
                            onReady[x](XMLObject.responseXML);
                        }
                    }
                    return true;
                }
                return false;
            }
        };

        function constructor(url, params, returnId, replace, async){
            if(XMLObject === undefined){
                XMLObject = (System.browser.isIE()) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
            }
            async = (async === undefined) ? "true" : async;
            if (url !== undefined && url !== null){
                request.open("POST",url,false);
            }else{
                return false;
            }
            request.addCallback(4,System.xmlparser.parse);
            if(params !== undefined && params !== null){
                data = params;
            }
            if(returnId !== undefined && returnId !== null){
                replace = (replace !== undefined && replace !== null) ? replace : false;
                request.setReturnLocation(returnId,replace);
            }
            XMLObject.onreadystatechange = function(){
                var x;
                switch(XMLObject.readyState){
                    case 2:
                        for(x = 0; x < onSent.length; x++){
                            onSent[x]();
                        }
                        break;
                    case 3:
                        for(x = 0; x < onProcess.length; x++){
                            onProcess[x]();
                        }
                        break;
                    case 4:
                        request.setResponseData(XMLObject.responseXML);
                        for(x = 0; x < onReady.length; x++){
                            onReady[x](request.responseData);
                        }
                        break;
                }
            };
            return true;
        }

        constructor(url, params, returnId, replace, async);

        return request;
    };

    System.ajaxRequest = createRequest;

}
