/* 

	XmlHttpRequest Wrapper

	Version 1.2.2

	29 Jul 2005 

	adamv.com/dev/

*/



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

	},

		

	Cache: {

		Get: 1,

		GetCache: 2,

		GetNoCache: 3,

		FromCache: 4

	},

	

	Method: {Get: "GET", Post: "POST", Put: "PUT", Delete: "DELETE"},

	

	enabled: false,

	logging: false,

	_get: null,	// Reference to the XmlHttpRequest object

	_cache: new Object(),

	

	Init: function(){

		Http._get = Http._getXmlHttp()

		Http.enabled = (Http._get != null)

		Http.logging = (window.Logging != 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;

	},



/*

	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 cache = params.cache || Http.Cache.Get;

		var method = params.method || Http.Method.Get;

		var callback = params.callback;

		

		if ((cache == Http.Cache.FromCache) || (cache == Http.Cache.GetCache))

		{

			var in_cache = Http.from_cache(url, callback, callback_args)



			if (Http.logging){

				Logging.log(["Http: URL in cache: " + in_cache]);

			}



			if (in_cache || (cache == Http.Cache.FromCache)) return in_cache;

		}

		

		if (cache == Http.Cache.GetNoCache)

		{

			var sep = (-1 < url.indexOf("?")) ? "&" : "?"	

			url = url + sep + "__=" + encodeURIComponent((new Date()).getTime());

		}

	

		// Only one request at a time, please

		if ((Http._get.readyState != Http.ReadyState.Uninitialized) && 

			(Http._get.readyState != Http.ReadyState.Complete)){

			this._get.abort();

			

			if (Http.logging){

				Logging.log(["Http: Aborted request in progress."]);

			}

		}

		

		Http._get.open(method, url, true);



		Http._get.onreadystatechange =  function() {

			if (Http._get.readyState != Http.ReadyState.Complete) return;

			

			if (Http.logging){

				Logging.log(["Http: Returned, status: " + Http._get.status]);

			}



			if ((cache == Http.Cache.GetCache) && (Http._get.status == Http.Status.OK)){

				Http._cache[url] = Http._get.responseText;

			}

			

			if (callback_args == null) callback_args = new Array();



			var cb_params = new Array();

			cb_params.push(Http._get);

			for(var i=0;i<callback_args.length;i++)

				cb_params.push(callback_args[i]);

				

			callback.apply(null, cb_params);

		}

		

		if(Http.logging){

			Logging.log(["Http: Started\n\tURL: " + url + "\n\tMethod: " + method + "; Cache: " + Hash.keyName(Http.Cache,cache)])

		}

		

		Http._get.send(params.body || null);

	},

	

	from_cache: function(url, callback, callback_args){

		var result = Http._cache[url];

		

		if (result != null) {

			var response = new Http.CachedResponse(result)

			

			var cb_params = new Array();

			cb_params.push(response);

			for(var i=0;i<callback_args.length;i++)

				cb_params.push(callback_args[i]);

							

			callback.apply(null, cb_params);

				

			return true

		}

		else

			return false

	},

	

	clear_cache: function(){

		Http._cache = new Object();

	},

	

	is_cached: function(url){

		return Http._cache[url]!=null;

	},

	

	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() }

}