var Server=function(requestURL) { this.requestURL=requestURL; }
Server.prototype=new Server;
Server.prototype.constructor=Server;

Server.prototype.onLoadedStack=[];
Server.prototype.requestURL=null;
Server.prototype.request=function(data) {
    var _this = this;
//document.enableDebug(true);
    data.request = this.requestURL+"?"+escape(js_toJSON(data.object));
    if (data.onLoaded) this.onLoadedStack.push(data.onLoaded); else this.onLoadedStack.push(null);
    if (data.onLoading) data.onLoading();
//alert(data.request);
	var FAILURE = function(response) {
		if (document.debugEnabled) {		
			document.debug("<h1>AJAX (Failure)</h1>");		
			document.debug(data.request,"Request: ");
			document.debug(response.responseText,"Response: ");
		}	
		
		var onLoaded = _this.onLoadedStack.pop();
		if (onLoaded) onLoaded();

		var error={success:false,message:response.statusText};
		if (data.onFailure) data.onFailure(error);
		else alert(error.message); // Fallback
	}
	
	try {
		return new Ajax.Request(data.request, { //Documentation: http://www.prototypejs.org/api/ajax/options
			//method: 'get',
			onSuccess: function(response) {		
				try {
					var result = eval("_="+unescape(response.responseText));
					
					if (document.debugEnabled) {		
						document.debug("<h1>AJAX (Success)</h1>");		
						document.debug(data.request,"Request: ");
						document.debug(response.responseText,"Response: ");
					}
					
					var onLoaded = _this.onLoadedStack.pop();
					if (onLoaded) onLoaded();
					
					if (result.success) { if (data.onSuccess) data.onSuccess(result); } 
					else if (data.onFailure) data.onFailure(result);
					else alert(result.message); // Fallback
				} catch (x) {
					document.debug(x,"Exception: ");
					result.message = x.message+"\n"+x.description;
					result.success = false;
					FAILURE(result);
				}
			},
			onFailure: function(response) { FAILURE(response); }
		});
	} catch (x) {
		FAILURE({success:false,message:x.message+"\n"+x.description});
	}
}
Server.prototype.get=function(object,success,failure,loading,loaded) {
    return this.request({ object:{query:"get",object:object}, onSuccess:success, onFailure:failure, onLoaded:loaded, onLoading:loading });
}
Server.prototype.put=function(object,success,failure,loading,loaded) {
    return this.request({ object:{query:"put",object:object}, onSuccess:success, onFailure:failure, onLoaded:loaded, onLoading:loading });
}
Server.prototype.remove=function(object,success,failure,loading,loaded) {
    return this.request({ object:{query:"remove",object:object}, onSuccess:success, onFailure:failure, onLoaded:loaded, onLoading:loading });
}
Server.prototype.update=function(object,success,failure,loading,loaded) {
    return this.request({ object:{query:"update",object:object}, onSuccess:success, onFailure:failure, onLoaded:loaded, onLoading:loading });
}
