function Ajax()
{
    this.createRequestObject = function()
    {
        try
        {
            // Firefox, Opera 8.0+, Safari
            return new XMLHttpRequest();
        }
        catch (e1)
        {
            // Internet Explorer
            try
            {
                return new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch (e2)
            {
                try
                {
                    return new ActiveXObject("Microsoft.XMLHTTP");
                }
                catch (e3)
                {
                    alert("Your browser does not support AJAX!");
                    return false;
                }
            }
        }
    };

    this.sendRequest = function(method, action, content, callback)
    {
        var requestObject = this.createRequestObject();
        var handleResponse = this.handleResponse;
        requestObject.open((method.toUpperCase() == 'POST' ? 'POST' : 'GET'), action);
        requestObject.onreadystatechange = function() { handleResponse(requestObject, callback); };
        if (method.toUpperCase() == 'POST')
        {
            requestObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            requestObject.send(content);
        }
        else
        {
            requestObject.send(null);
        }
    };

    this.handleResponse = function(requestObject, callback)
    {
        if (requestObject.readyState == 4)
        {
            if (requestObject.status == 200)
            {
                var response = requestObject.responseText;
                if (document.getElementById(callback))
                {
                    try
                    {
                        document.getElementById(callback).innerHTML = response;
                    }
                    catch (e)
                    {
                        document.getElementById(callback).value = response;
                    }
                }
                else
                {
                    eval(callback + "(response)");
                }
            }
            else
            {
                alert("Ajax error: status " + requestObject.status);
            }
        }
    };

    this.call = function(url, func, callback)
    {
        if (url === '' || url === null)
        {
            url = '/rpc';
        }
        var content = "_Ajax_function=" + encodeURIComponent(func);
        for (var i = 3; i < arguments.length; i++)
        {
            content += "&_Ajax_arguments[]=" + encodeURIComponent(arguments[i]);
        }
        this.sendRequest('POST', url, content, callback);
    };
}
