function JSONRequest() {
	var connection;
	var queue = new Array();
	var self = this;
	
	function process( request ) {
		connection = new XMLHttpRequest();
		connection.onreadystatechange = function( event ) {
			if ( ( connection.readyState == 4 ) && ( connection.status == 200 ) ) {
				if ( connection.responseText != '' ) {
					var json = JSON.parse( connection.responseText );
					if ( json )
						request.callback( json );
					else
						alert( 'An error occured.' );
				}
				else
					request.callback( null );
				connection = null
				if ( queue.length > 0 )
					process( queue.shift() );
			}
		}
		connection.open( request.method, request.url );
		connection.send( request.data );
	}
	
	function request( method, url, data, callback ) {
		var request = new AJAXRequest( method, url, data, callback );
		if ( connection == null )
			process( request );
		else
			queue.push( request );
	}
	
	this.retrieve = function( url, callback ) {
		request( 'GET', url, null, callback );
	}
	
	this.create = function( url, data, callback ) {
		request( 'POST', url, data, callback );
	}
	
	this.update = function( url, data, callback ) {
		request( 'PUT', url, data, callback );
	}
	
	this.remove = function( url, callback ) {
		request( 'DELETE', url, null, callback );
	}
}

function AJAXRequest( method, url, data, callback ) {
	this.method = method;
	this.url = url;
	this.data = JSON.stringify( data );
	this.callback = callback;
}