
function Request()
{
	this.request = null;
	this.stateChangeFunction = null;
	this.data = new HashMap();
	this.target = '';
}

Request.prototype.getRequest = function() { return this.request; }
Request.prototype.getResponseText = function() { return this.getRequest().responseText; }
Request.prototype.isReady = function() { return this.request.readyState == 4; }

Request.prototype.setTarget = function(target) { this.target = target; }
Request.prototype.getTarget = function() { return this.target; }

Request.prototype.add = function(name, value) { this.data.add(name, value); }
Request.prototype.clearData = function() { this.data.empty(); }

Request.prototype.getStateChangeFunction = function() { return this.stateChangeFunction; }
Request.prototype.setStateChangeFunction = function(func) { this.stateChangeFunction = func; }

Request.prototype.getResponseXML = function() { return this.request.responseXML; }
Request.prototype.hasResponseXML = function() { return true; }

Request.prototype.getRootElement = function()
{
	if ( NAVIGATOR_IS_IE )
	{
		var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async = false;
		xmlDoc.loadXML(this.getResponseText());
		return xmlDoc.documentElement;
	}
	else
	{
		var responseXML = this.getResponseXML();
		if ( responseXML == null ) return null;
		else return this.getResponseXML().documentElement;
	}
}

Request.prototype.setReadyStateFunction = function(func)
{
	__request = this;
	__readyStateFunction = func;
	this.stateChangeFunction = function()
	{
		if ( __request.isReady() )
		{
			__readyStateFunction();
		}
	}
}

Request.prototype.initializeForNewRequest = function()
{
	this.clearData();
	this.target = '';
	if ( window.XMLHttpRequest )
	{
		this.request = new XMLHttpRequest();
	}
	else if ( window.ActiveXObject )
	{
		this.request = new ActiveXObject("Microsoft.XMLHTTP");
	}
}

Request.prototype.getData = function()
{
	var data = '';
	var first = true;
	var hashes = this.data.getHashes();
	for ( var i = 0; i < hashes.length; i++ )
	{
		var varName = hashes[i];
		data += ( first ? '' : '&' ) + varName + '=' + escape(this.data.get(varName));
		first = false;
	}
	return data;
}


function GETRequest()
{
	this.initializeForNewRequest();
}

GETRequest.prototype = new Request();

GETRequest.prototype.send = function()
{
	var request = this.getRequest();
	request.onreadystatechange = this.stateChangeFunction;
	request.open("GET", this.getURL(), true);
	request.send(null);
}

GETRequest.prototype.getURL = function()
{
	var data = this.getData();
	return this.getTarget() + ( data == '' ? '' : '?' + data);
}


function POSTRequest()
{
	this.initializeForNewRequest();
}

POSTRequest.prototype = new Request();

POSTRequest.prototype.send = function()
{
	var request = this.getRequest();
	request.onreadystatechange = this.stateChangeFunction;
	request.open("POST", this.getTarget(), true);
	request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	request.send(this.getData());
}
