//-( Litebox Module )-----------------------------------------------------------

/**
 *	Litebridge is a lightweight JSON interchange framework.
 *
 *	@copyright	Portland Webworks 2006-2007
 */

/* class */ function LiteBridge( ) {

	}


extend( LiteBridge, { 
	span					:	function( uri, callback, delay ) {
		var handle = new LiteBridge( );
		
		fn = bind(
			 handle
			,function( ) {
				this.setTarget( uri )
					.setResultCallback( callback )
					.pull( )
					;
			}
		);

		if( parseInt( delay ) > 0 ) {
			setTimeout( fn, delay );
		}
		else {
			fn( );
		}
		
		return handle;
	}
} );

extend( LiteBridge.prototype, {
	
	_onresult				:	function( ) {
		return null;
		}

,	pull					: 	function( ) {

		request = this.newRequest( );
		request.onreadystatechange = bind( this, 'onStateChange', request );
		request.open( 'POST', this.getTarget( ), true );
		request.send( null );
		
		this.request = request;

		}

,	setTarget				:	function( uri ) {
		this._target = uri;
		return this;
		}

,	getTarget				:	function( ) {
		return this._target;
		}
		
,	setResultCallback		: 	function( callback ) {
		this._onresult = callback;
		return this;
		}

,	getResultCallback		:	function( ) {
		return this._onresult;
		}
		
,	newRequest				:	function( ) {

		if( window.XMLHttpRequest ) {
			return new XMLHttpRequest( );
			}
		else {
			return new ActiveXObject( 'Microsoft.XMLHTTP' );
			}
			
		return r;
		}

,	abort					:	function( ) {
		this.request.onreadystatechange = function( ) { }
		this.request.abort( );
	}

,	onStateChange			:	function( request ) {
		if( request.readyState == 4 ) {
			if( isUndefined( request.status )
			||	request.status == 0 ) {
				/**
				 *	@browser Safari
				 *	If we've already exited a page -- for example, by 
				 *	submitting a form or reloading, we may get called with a
				 *	useless response that has null/undefined fields. We can't
				 *	do anything helpful, so just ignore it. Since we don't call
				 *	the result callback, we'll stop anything like a progress
				 *	bar, which chains pulses. This isn't great, but this only
				 *	seems to happen when we're already leaving the page.
				 */
				return;
				}
			switch( request.status ) {
				case 200:
					result = this.parseResult( request );
					this.getResultCallback( )( result );
					break;
				case 404:
					error( 'The requested resource was not found (404).' );
					break;
				default:
					error(
						 'An error occurred when attempting to retrieve '
						+'remote data: ' + request.status
						+"\n\nFull request follows."
						);
					alert_obj( request );
					break;
				}
			}
		}

,	parseResult				:	function( request ) {
		var __t;

		try {
			eval( '__t = ' + request.responseText );
			return __t;
			}
		catch( e ) {
			error( 'Evaluation failed; response was: ' + request.responseText );
			}

		}

	} );
