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