/****************************************************************
	Project:     ForgeSuite
	Copyright:   2008 Eidix Labs (http://eidix.com/)
	Author:      James Linden (jl@eidix.com)
	Filename:    core/inc/lib_http.js
	Created:     2008-09-27 11:00 EST
****************************************************************/

var timer;

var HTTP = new Object( {
	version: '0.4.0',
	_request: null,
	_factories: [
		function() { return( new XMLHttpRequest() ); },
		function() { return( new ActiveXObject( 'Msxml2.XMLHTTP' ) ); },
		function() { return( new ActiveXObject( 'Microsoft.XMLHTTP' ) ); }
	],
	_factory: null,
	_get_response: function( p_request ) {
		var r = ( typeof( p_request ) == 'object' ) ? p_request : HTTP._request;
		switch( r.getResponseHeader( 'Content-Type' ) ) {
			case 'text/xml':
				return( r.responseXML );
			break;
			case 'text/json':
			case 'text/javascript':
			case 'application/javascript':
			case 'application/x-javascript':
				return( eval( r.responseText ) );
			break;
			default:
				return( r.responseText );
			break;
		}
	},
	new_request: function() {
		if( HTTP._factory != null ) {
			return( HTTP._factory() );
		}
		else {
			HTTP._request = null;
			for( var i = 0; i < HTTP._factories.length; i ++ ) {
				try {
					var f = HTTP._factories[ i ];
					HTTP._request = f();
					if( HTTP._request != null ) {
						HTTP._factory = f;
					}
				}
				catch( e ) {
					continue;
				}
			}
			HTTP.factory = function() {
				throw new Error( 'XMLHTTPRequest unsupported' );
			}
		}
		return( HTTP._request );
	},
	parse_headers: function( p_request ) {
		var r = ( typeof( p_request ) == 'object' ) ? p_request : HTTP._request;
		var h = new Array();
		var l = r.getAllResponseHeaders().split( '\n' );
		for( var i = 0; i <= l.length; i ++ ) {
			if( l[ i ].length > 0 ) {
				var c = l[ i ].indexOf( ':' );
				h[ l[ i ].substring( 0, c ).trim() ] = l[ i ].substring( c + 1 ).trim();
			}
		}
		return( h );
	},
	encode_data: function( p_data ) {
		var p = new Array();
		for( var x in p_data ) {
			p.push( x.toString().urlencode() + '=' + p_data[ x ].toString().urlencode() );
		}
		return( p );
	},
	get_text: function( p_url, p_callback ) {
		if( HTTP.new_request() ) {
			HTTP._request.onreadystatechange = function() {
					if( HTTP._request.readyState == 4 && HTTP._request.status == 200 ) {
						p_callback( HTTP._request.responseText );
					}
				}
				HTTP._request.open( 'GET', p_url );
				HTTP._request.setRequestHeader( 'User-agent', APP_AGNT );
				HTTP._request.send( null );
		}
		else {
		}
	},
	get_xml: function( p_url, p_callback ) {
		if( HTTP.new_request() ) {
			HTTP._request.onreadystatechange = function() {
				if( HTTP._request.readyState == 4 && HTTP._request.status == 200 ) {
					p_callback( HTTP._request.responseXML );
				}
			}
			HTTP._request.open( 'GET', p_url );
			HTTP._request.setRequestHeader( 'User-agent', APP_AGNT );
			HTTP._request.send( null );
		}
		else {
			throw new Error( 'HTTP.get_xml failed' );
		}
	},
	get_headers: function( p_url, p_callback, p_error ) {
		if( HTTP.new_request() ) {
			HTTP._request.onreadystatechange = function() {
				if( HTTP._request.readyState == 4 && HTTP._request.status == 200 ) {
					p_callback( HTTP.parse_headers( HTTP._request ) );
				}
				else if( p_error ) {
					p_error( HTTP._request.status, HTTP._request.statusText );
				}
				else {
					p_callback( null );
				}
			}
			HTTP._request.open( 'HEAD', p_url );
			HTTP._request.setRequestHeader( 'User-agent', APP_AGNT );
			HTTP._request.send( null );
		}
		else {
			throw new Error( 'HTTP.get_headers failed' );
		}
	},
	post: function( p_url, p_data, p_callback, p_error ) {
		if( HTTP.new_request() ) {
			HTTP._request.onreadystatechange = function() {
				if( HTTP._request.readyState == 4 && HTTP._request.status == 200 ) {
					p_callback( HTTP._get_response() );
				}
				else if( HTTP._request.readyState == 4 && p_error ) {
					p_error( HTTP._request.status, HTTP._request.statusText );
				}
				else if( HTTP._request.readyState == 4 && HTTP._request.status != 200 ) {
					p_callback( HTTP._request, true );
				}
				else {
					p_callback( null );
				}
			}
			HTTP._request.open( 'POST', p_url, true );
			HTTP._request.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' );
			HTTP._request.setRequestHeader( 'User-agent', APP_AGNT );
			HTTP._request.send( p_data );
		}
		else {
			throw new Error( 'HTTP.post failed' );
		}
	},
	get: function( p_url, p_callback, p_options ) {
		var r = HTTP.new_request();
		if( r != null ) {
			var n = 0;
			if( p_options != null && p_options.timeout ) {
				timer = setTimeout(
					function() {
						r.abort();
						if( p_options.timeout_handler ) {
							options.timeout_handler( p_url );
						}
					},
					options.timeout
				);
			}
			r.onreadystatechange = function() {
				if( r.readyState == 4 ) {
					if( timer ) {
						clearTimeout( timer );
					}
					if(r.status == 200 ) {
						p_callback( r.responseText );
					}
					else {
						if( p_options != null && p_options.error_handler ) {
							p_options.error_handler( r.status, r.statusText );
						}
						else {
							p_callback( null );
						}
					}
				}
				else if( p_options != null && p_options.progress_handler ) {
					p_options.progress_handler( ++ n );
				}
			}
			r.open( 'GET', p_url + ( ( p_options != null && p_options.parameters ) ? '?' + HTTP.encode_data( p_options.parameters ) : '' ) );
			r.setRequestHeader( 'User-agent', APP_AGNT );
			r.send( null );
		}
		else {
			throw new Error( 'HTTP.get failed' );
		}
	}
} );
