/* XMLHTTP */

function sendRequest( url, callback, postData ) 
{
	var req = createXMLHTTPObject();
	if( !req ) return false;	

	var method = ( postData ) ? 'POST' : 'GET';
	req.open( method, url, true );

	if( postData ) req.setRequestHeader( 'Content-type','application/x-www-form-urlencoded');

	req.onreadystatechange = function() 
	{
		if( req.readyState != 4 ) return;
		if( req.status != 200 && req.status != 304 ) 
		{
			alert('HTTP error: ' + req.status);
			return;
		}
		if( callback ) callback( req );
	}
	if( req.readyState == 4 ) return true;
	req.send( postData );
	return true;
}

var XMLHttpFactories = [
	function () { return new XMLHttpRequest() },
	function () { return new ActiveXObject( 'Msxml2.XMLHTTP' ) },
	function () { return new ActiveXObject( 'Msxml3.XMLHTTP' ) },
	function () { return new ActiveXObject( 'Microsoft.XMLHTTP' ) }
];

function createXMLHTTPObject() 
{
	var xmlhttp = false;
	for( var i = 0; i < XMLHttpFactories.length; i++ ) 
	{
		try 
		{
			xmlhttp = XMLHttpFactories[i]();
		}
		catch( e ) 
		{
			continue;
		}
		break;
	}
	return xmlhttp;
}

function getPostStringFromForm( formId )
{
	var postData = '';
	var form = document.getElementById( formId );
	var formElements = getElementsByTagNames( 'input,textarea,select', form );

	for( var i = 0; i < formElements.length; i++ )
	{
		var name = formElements[i].name || formElements[i].id;

		postData = postData + name + '=' + formElements[i].value + '&';
	}

	return postData.replace(/&$/,'');
}

function getElementsByTagNames( list, obj ) 
{
	if (!obj) var obj = document;
	var tagNames = list.split(',');
	var resultArray = new Array();
	for (var i=0;i<tagNames.length;i++) {
		var tags = obj.getElementsByTagName(tagNames[i]);
		for (var j=0;j<tags.length;j++) {
			resultArray.push(tags[j]);
		}
	}
	var testNode = resultArray[0];
	if (!testNode) return [];
	if (testNode.sourceIndex) {
		resultArray.sort(function (a,b) {
				return a.sourceIndex - b.sourceIndex;
		});
	}
	else if (testNode.compareDocumentPosition) {
		resultArray.sort(function (a,b) {
				return 3 - (a.compareDocumentPosition(b) & 6);
		});
	}
	return resultArray;
}
