function AJAX(){
	//PRIVATE PROPERTIES
	var self=this;
	var xmlHttp;


	//PRIVATE FUNCTIONS
	function dispatch(url) {
		self.xmlHttp.open("GET", url, true);
		self.xmlHttp.send(null);
	}
	
	function justTheBody(doc) {
		var body_start=doc.indexOf('<body');
		var body_end=doc.indexOf('</body');
		if (body_start>-1 && body_end>-1) {
			var body_start_close=doc.indexOf('>',body_start);
			return (doc.substring(body_start_close+1,body_end));
		} else {
			return doc;
		}
	}

	function createRequestObject()
	{
		if(window.XMLHttpRequest)
		{
			return new XMLHttpRequest();
		}
		else if (window.ActiveXObject)
		{
			var versions = ["Msxml2.XMLHTTP.7.0", "Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
			for(var idx=0; idx < versions.length; idx++)
			{
				try
				{
					return new ActiveXObject(versions[idx]);
				}
				catch(objException)
				{
					;
				}
			}
		}
	}

	function ready() {
		return ((self.xmlHttp.readyState == 4) && (self.xmlHttp.status == 200));
	}

	function dumpInto(targetElement)
	{
		var txt=justTheBody(self.xmlHttp.responseText);
		if(txt.indexOf("<nil/>") == -1)
		{
			if (targetElement) {targetElement.innerHTML = txt;}
		}
	}


	//PRIVILEGED METHODS
	this.loadIntoElement= function(url, targetElement,callbackFunction) {
		self.xmlHttp=createRequestObject();
		self.xmlHttp.onreadystatechange = function()
		{
			if (ready()) {
				dumpInto(targetElement);
				if (callbackFunction) {callbackFunction(justTheBody(self.xmlHttp.responseText));}
			}
		};

		dispatch(url);
	}

	this.loadIntoFunction=function(url,callbackFunction) {
		self.xmlHttp=createRequestObject();
		self.xmlHttp.onreadystatechange = function()
		{
			if (ready() && callbackFunction) {callbackFunction(self.xmlHttp.responseXML);}
		};
		dispatch(url);
	}

	this.load=function(url) {
		self.loadIntoFunction(url,null);
	}



}

function getTag(xmlObj,tagname) {
	var tagarray=(xmlObj.getElementsByTagName(tagname));
	if (tagarray && tagarray.length>0)
	{
		return tagarray[0].firstChild.nodeValue;
	}
	else
	{
		return null;
	}
}

/****************** querystring *****************/
/* Client-side access to querystring name=value pairs
	Version 1.2.3
	22 Jun 2005
	Adam Vandenberg
*/
function Querystring(qs) { // optionally pass a querystring to parse
	this.params = new Object()
	this.get=Querystring_get
	
	if (qs == null)
		qs=location.search.substring(1,location.search.length)

	if (qs.length == 0) return

// Turn <plus> back to <space>
// See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1
	qs = qs.replace(/\+/g, ' ')
	var args = qs.split('&') // parse out name/value pairs separated via &
	
// split out each name=value pair
	for (var i=0;i<args.length;i++) {
		var value;
		var pair = args[i].split('=')
		var name = unescape(pair[0])

		if (pair.length == 2)
			value = unescape(pair[1])
		else
			value = name
		
		this.params[name] = value
	}
}

function Querystring_get(key, default_) {
	if (default_ == null) default_ = null;
	
	var value=this.params[key]
	if (value==null) value=default_;
	
	return value
}



