/* 
	XmlHttpRequest Wrapper
	Version 1.2.2
	29 Jul 2005 
	adamv.com/dev/
	
	Updated by Alex for multiThread And Queue
	
*/


var MAX_HTTP_THREAD = 5;

function StackRequest( p_params, p_callback )
{
	this.params	= p_params;
	this.callback_args = p_callback;
}


var Http = {
	ReadyState: {
		Uninitialized: 0,
		Loading: 1,
		Loaded:2,
		Interactive:3,
		Complete: 4
	},
		
	Status: {
		OK: 200,
		
		Created: 201,
		Accepted: 202,
		NoContent: 204,
		
		BadRequest: 400,
		Forbidden: 403,
		NotFound: 404,
		Gone: 410,
		
		ServerError: 500
	},
		
	Method: {Get: "GET", Post: "POST", Put: "PUT", Delete: "DELETE"},
	
	enabled: false,
	_get: Array( ),	// References des XmlHttpRequest ( 1 PAR THREAD, voir MAX_HTTP_THREAD )
	_stack: Array( ),	// Liste des Http.get(...) à executer ( une fois executés, ils sont .remove() )
	
	Init: function(){
//		Http._get = Http._getXmlHttp()
		for ( var i = 0 ; i < MAX_HTTP_THREAD ; i++ )
			Http._get[i] = Http._getXmlHttp( );

		Http.enabled = (Http._get[0] != null)
	},

	getFreeThread: function(){
		/* --- On recherche un thread de libre --- */
		for ( var i = 0 ; i < MAX_HTTP_THREAD ; i++ )
		{
			if ((Http._get[i].readyState == Http.ReadyState.Uninitialized) || 
				(Http._get[i].readyState == Http.ReadyState.Complete))		
				return Http._get[i];
		}
		return null;
	},

	
	_getXmlHttp: function(){
	/*@cc_on @*//*@if (@_jscript_version >= 5)
		try { return new ActiveXObject("Msxml2.XMLHTTP"); } 
		catch (e) {} 
		try { return new ActiveXObject("Microsoft.XMLHTTP"); } 
		catch (e) {} 
	@end @*/
		try { return new XMLHttpRequest();}
		catch (e) {}

		return null;
	},


	processStack: function(params, callback_args){	
		
	},

/*
	Params:
		url: The URL to request. Required.
		cache: Cache control. Defaults to Cache.Get.
		callback: onreadystatechange function, called when request is completed. Optional.
		method: HTTP method. Defaults to Method.Get.
*/


	get: function(params, callback_args){	
		if (!Http.enabled) throw "Http: XmlHttpRequest not available.";
		
		var url = params.url;
		if (!url) throw "Http: A URL must be specified";
				
		var method = params.method || Http.Method.Get;
		var callback = params.callback;

		var sep = (-1 < url.indexOf("?")) ? "&" : "?"	
		url = url + sep + "__=" + encodeURIComponent((new Date()).getTime());
	
		var oGet = this.getFreeThread( );

		// Si jamais aucun Thread de dispo, on ajoute à la Pile
		if( !oGet )
		{
			this._stack[ this._stack.length ] = new StackRequest( params, callback_args );
			setTimeout( "Http.processStack( )", 100 );
			return;
		}

		oGet.open( method, url, true );
		
		var _oGet = oGet;
		oGet.onreadystatechange = function( ) 
		{
			if ( _oGet.readyState != Http.ReadyState.Complete )	{
//				alert( "Erreur lors de l'envoie de la demande ( readyState != Complete )" )
				return;
			}
			
			if ( callback_args == null )						callback_args = new Array();
			var cb_params = new Array();
			cb_params.push( _oGet );
			for( var i = 0 ; i < callback_args.length ; i++ )
				cb_params.push( callback_args[ i ] );
			callback.apply( null, cb_params );
		}

		oGet.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
		/*
		if ( params.url ) 
		{
			oGet.setRequestHeader("Content-length", params.url.length);
			alert( params.url.length );
		}
//		oGet.setRequestHeader("Connection", "close");
		*/
		oGet.send( params.body || 1 );			// 1 pour que FireFox foire pas...
	},
	
	CachedResponse: function(response) {
		this.readyState = Http.ReadyState.Complete
		this.status = Http.Status.OK
		this.responseText = response
	}
		
}

Http.Init()






function json_response(response){
	var js = response.responseText;
	try{
		return eval(js); 
	} catch(e){
		if (Http.logging){
			Logging.logError(["json_response: " + e]);
		}
		else{
			alert("Error: " + e + "\n" + js);
		}
		return null;
	}
}

function getResponseProps(response, header){
	try {
		var s = response.getResponseHeader(header || 'X-Ajax-Props');
		if (s==null || s=="")
			return new Object()
		else
			return eval("o="+s)
	} catch (e) { return new Object() }
}

