function Ajax(url, debug)
{
	var _url = url;
	var _debug = false;
	var _displayErrors = true;

	/* Wrapper function for constructing a request object.
	 Parameters:
	  reqType: The HTTP request type, such as GET or POST.
	  url: The URL of the server program.
	  asynch: Whether to send the request asynchronously or not. */
	function getXmlHttpRequest()
	{
	    if(window.XMLHttpRequest)
			request = new XMLHttpRequest();
		else if (window.ActiveXObject)
		{
	        request= new ActiveXObject("Msxml2.XMLHTTP");
	        if (!request)
	            request = new ActiveXObject("Microsoft.XMLHTTP");
	    }
	    
	    return request;
	} // function getXmlHttpRequest(reqType, url, asynch)

	/**
	* Do params include callback function?
	*
	* @param[in] params Parameters of function or method which has been called
	* @return Returns true if params contain callback function
	**/
	function paramsHaveCallbackFunction( params )
	{
		/*
		if ( typeof( params ) == "object" && params.length > 0 )
			return ( typeof( params[ params.length - 1 ] ) == "function" );
		else
			return false;
		*/

		if ( typeof( params ) == "object" && params.length > 0 )
			return ( typeof( params[0] ) == "function" );
		else
			return false;
	}

	/**
	* Return callback function from params
	*
	* @param[in] params Parameters of function or method which has been called
	* @return Callback function
	**/
	function getCallbackFunction( params )
	{
		/*
		if ( paramsHaveCallbackFunction( params ) )
			return params[ params.length - 1 ];
		else
			return null;
		*/
		if ( paramsHaveCallbackFunction( params ) )
			return params[0];
		else
			return null;
	}


	this.callMethod = function(className, methodName, arguments)
	{
		var callbackFunction = getCallbackFunction(arguments);
		var request = getXmlHttpRequest();
		
		request.onreadystatechange = function()
		{
			if ( request.readyState == 4 )
			{
				try
				{
					var response = request.responseText; //JSON.parse( request.responseText );
					if (callbackFunction != null)
						callbackFunction(response);
				}
				catch (e)
				{
					//alert( "AJAX error:\nUnknown response from server!\n\n" + request.responseText );
					return;
				}
			}
		}
		
		var args = "";
		for (var i = 1; i < arguments.length; i++)
			args += "a" + i + ":\"" + arguments[i] + "\",";
		if (args.length > 0)
			args = "[" + args.substring(0, args.length - 1) + "]";

		data = "className=" + className + "&methodName=" + methodName + "&arguments=" + args;
		
		//alert(data);
		//alert(_url);
		
	    request.open("POST", _url, true);
		request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
		request.setRequestHeader("Content-Length", data.length);
		request.send(data);
	}
}