if (!SI) { var SI = new Object(); };
/******************************************************************************
 SI.Request module v1.5
 
 Asynchronous scripting, Inman-style baby! Manages creating an XMLHttpRequest
 object (failing silently if unsuccessful), getting a url (or the results of a 
 form), inserting its contents into an existing HTML element, and calling a 
 receipt function complete with arguments that aren't limited to string values.
 
 v1.1	: Now supports both GET and POST
 v1.2	: Added formToQuery() which takes a form and returns a complete url
 v1.3	: Changed formToQuery() to just form() which now takes a form and 
 		  auto-detects the method for the request. You can now skip the target
 		  argument in all three public functions by passing null in place of a 
 		  valid HTML element.
 v1.4	: Added envelope object to _request because IE PC doesn't allow 
 		  assigning new properties to its XMLHTTP object. Added support for 
 		  TEXTAREAs in form()
 v1.5	: Added branching for setting innerHTML of table and tbody elements 
 		  in IE PC, requires SI.IE

 ******************************************************************************/
SI.Request = 
{
	get		: function(url) // [target[,callback[,args]]]
	{
		this._request('GET',arguments);
	},
	
	post	: function(url)  //  [target[,callback[,args]]]
	{
		this._request('POST',arguments);
	},
	
	form	: function(form) //  [target[,callback[,args]]]
	{
		if (form.onsubmit)
		{
			if (!form.onsubmit())
			{
				return false;
			};
		};
		var method = (form.method && form.method.toUpperCase()=='POST')?'POST':'GET';
		var url = form.action;
		url += (url.indexOf('?')!=-1)?'&':'?';
		var query = [];
		
		for (var i=0; i<form.elements.length;i++)
		{
			var e = form.elements[i];
			if (e.name!='')
			{ 
				switch(e.nodeName)
				{
					case 'INPUT':
						if 
						(
							e.type.match(/(submit|image|cancel|reset)/) || 
							(e.type.match(/(checkbox|radio)/) && !e.checked)
						)
						{
							continue;
						};
						query[query.length] = escape(e.name) + '=' + escape(e.value);
					break;
					
					case 'TEXTAREA':
						query[query.length] = escape(e.name) + '=' + escape(e.value);
					break;
					
					case 'SELECT':
						query[query.length] = escape(e.name) + '=' + escape(e.options[e.selectedIndex].value);
					break;
				};
			};
		};
		arguments[0] = url + query.join('&');
		this._request(method,arguments);
	},
	
	_request	: function(type,args) // PRIVATE: Use get(), post() or form() instead
	{
		var envelope = 
		{
			request	: false,
			ram		: {}
		};
		
		/*@cc_on @*/
		/*@if (@_jscript_version >= 5)
		try { envelope.request = new ActiveXObject("Msxml2.XMLHTTP"); } 
		catch (e) {
			try { envelope.request = new ActiveXObject("Microsoft.XMLHTTP"); }
			catch (E) { envelope.request = false; };
			};
		@end @*/
		if (!envelope.request && typeof XMLHttpRequest!='undefined')
		{
			envelope.request = new XMLHttpRequest();
		};
		if (!envelope.request)
		{
			return;
		};
		
		var url = args[0] + ((args[0].indexOf('?')!=-1)?'&':'?')+(new Date()).getTime();
		var query = null;
		
		if (type=='POST')
		{
			var uri = url.split('?');
			url = uri[0];
			query = uri[1];
		}
		
		if (args[1] && args[1]!=null) { envelope.ram.target = args[1]; };
		if (args[2]) { envelope.ram.callback	= args[2]; };
		if (args[3]) { envelope.ram.args		= args[3]; };
		
		envelope.request.open(type,url,true);
		if (type=='POST')
		{
			envelope.request.setRequestHeader("Method","POST " + url + " HTTP/1.1");
			envelope.request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
		}
		envelope.request.send(query);
		
		if (envelope.ram.target || envelope.ram.callback)
		{
			envelope.request.onreadystatechange = function()
			{
				if (envelope.request.readyState==4 && envelope.request.status==200)
				{
					if (envelope.ram.target)
					{
						var target = envelope.ram.target;
						var content = envelope.request.responseText;
						if (SI.IE && (target.nodeName == 'TBODY' || target.nodeName == 'TABLE'))
						{
							SI.IE.fixInnerHTML(target, content);
						}
						else
						{
							target.innerHTML = content;
						}
					};
					if (envelope.ram.callback)
					{
						if (envelope.ram.args)
						{
							envelope.ram.callback(envelope.ram.args);
						}
						else
						{
							envelope.ram.callback();
						};
					};
				};
			};
		};
	}
};
