var AJAX = {
	reqid: 1,
	
	marshall_object: 
		function marshall_object(obj)
		{
			//now = new Date();
			//uniqueid = now.getUTCMilliseconds();
			obj._unique_id_ = AJAX.reqid;
			++AJAX.reqid;
			return obj;
		},

	request:
		function request(url, obj, callback)
		{
//			alert("Preparing AJAX request...");
			if(obj) {
				post_data = JSON.stringify(AJAX.marshall_object(obj));
			}
			if(window.XMLHttpRequest) {
				req = new XMLHttpRequest();
			} else if(window.ActiveXObject) {
				req = new ActiveXObject("Microsoft.XMLHTTP");
			}
			
			if(req) {
				req.onreadystatechange = AJAX.create_callback(callback, req);
				if(obj) {
					req.open("POST", url, true);
					req.send(post_data);
				} else {
					req.open("GET", url, true);
					req.send(null);
				}
				return true;
			} else {
				return false;
			}
		},

	create_standard_handler:
		function create_standard_handler(data_handler)
		{
			function closure(req)
			{
				if(req.readyState==4) {
					var data = eval('(' + req.responseText + ')');
					// check for errors here?
					data_handler(data);
				}
			}
			
			return closure;
		},

	create_callback:
		function create_callback(closure, req)
		{
			function req_callback()
			{
				closure(req);
			}
			
			return req_callback;
		}
};

