
// provides basic AJAX functionality
//
// TAKES:
//  URL
//  success_fn
//  failure_fn
//
// success_fn is evaluated when readyState == 4 and status == 200. failure_fn
// is evaluated otherwise when readyState == 4, or the request cannot be instantiated.
//
function ajax( args, url, parameters, success_fn, failure_fn, request_type, response_type )
{
	this.failure_fn    = failure_fn;
	this.parameters    = parameters ? parameters : null;
	this.request_type  = request_type  == 'POST' ? 'POST' : 'GET';
	this.response_type = response_type == 'JSON' ? 'JSON' : 'XML';
	this.success_fn    = success_fn;
	this.url           = url;

	for ( var k in args )
	{
		this[k] = args[k];
	}
	


	ajax.prototype.connect = function()
	{
		var f_this = this;
		var ajax_request;
		
		if ( window.XMLHttpRequest )
		{
			ajax_request = new XMLHttpRequest();
		}
		else if ( window.ActiveXObject )
		{
			ajax_request = new ActiveXObject('Microsoft.XMLHTTP');
		}

		// we couldn't instantiate a request
		if ( !ajax_request )
		{
			if ( this.failure_fn )
			{
				this.failure_fn();
			}

			return;
		}

		ajax_request.onreadystatechange = function ()
		{
			f_this.onrsc(this);
		};

		var post_data = '';
		if ( this.request_type == 'GET' && this.parameters )
		{
			if ( this.url.indexOf('?') < 0 )
			{
				this.url += '?';
			}
			else
			{
				this.url += '&';
			}

			for ( var k in this.parameters )
			{
				this.url += escape(k) + '=' + escape(this.parameters[k]) + '&';
			}
		}
		else if ( this.request_type == 'POST' && this.parameters )
		{
			for ( var k in this.parameters )
			{
				if ( post_data.length > 0 )
				{
					post_data += '&';
				}

				post_data += encodeURIComponent(k) + '=' + encodeURIComponent(this.parameters[k]);
			}
		}

		ajax_request.open(this.request_type,this.url,true);
		if ( this.request_type == 'POST' )
		{
			ajax_request.setRequestHeader('Content-type','application/x-www-form-urlencoded');
			ajax_request.setRequestHeader('Content-length',post_data.length);
			ajax_request.setRequestHeader('Connection','close');
			ajax_request.send(post_data);
		}
		else
		{
			ajax_request.send(null);
		}
	};



	ajax.prototype.onrsc = function ( r )
	{
		var clean = false;

		if ( r.readyState == 4 && r.status == 200 )
		{
			if ( this.response_type == 'XML' )
			{
				this.success_fn(r.responseXML,r.responseText);
			}
			else if ( this.response_type == 'JSON' )
			{
				this.success_fn(eval(r.responseText));
			}

			clean = true;
		}
		else if ( r.readyState == 4 )
		{
			if ( this.failure_fn )
			{
				this.failure_fn();
			}

			clean = true;
		}

		if ( clean )
		{
			delete r;
		}
	}
}


