/*	JavaScript функции для асинхронной загрузки данных с web сервера
*	работоспособность проверена 
*	IE 5.0 и выше
*	mozila разные версий 
*	firefox 1.0 и выше
*	opera 8.0 и выше
*	v1.1
*
*	function GetFormData(FormObj) извлекает данные из формы в строку
*	function makeXMLHttpObject(otype) создает объект XMLHttpRequest или Msxml2.DOMDocument или Microsoft.XMLDOM или Microsoft.XMLHTTP или Msxml2.XMLHTTP
*	function makeRequest(url, oType, rqType, PostData, ReqType, ReqParams) выполняет асинхронный запрос к серверу
*/

var Btype; // тип броузера IE
var HtmlPrm;

//извлекает данные из формы в строку
function GetFormData(FormObj)
{
var i, elmName, elmValue, elmType, element, tmpstr=null;
	
if(FormObj)
{	
	tmpstr='';
	for (i=0; i<FormObj.elements.length; i++)
	{
		element = FormObj.elements[i];
		if (typeof(element)=='object')
		{
			elmValue = element.value;
			elmName	= element.name;
			elmType = element.type.toLowerCase()
			
			switch(elmType)	
			{
				case 'checkbox':
				case 'radio':
					if (element.checked) 
						tmpstr = tmpstr + ((i>0)?'&':'') + UrlEncode(elmName) +  '=' + UrlEncode(elmValue);
					break;
			
				default:
					tmpstr = tmpstr + ((i>0)?'&':'') + UrlEncode(elmName) +  '=' + UrlEncode(elmValue);
					break;
}	}	}	}
return tmpstr;
}


/*
создает объект XMLHttpRequest или Msxml2.DOMDocument или Microsoft.XMLDOM или Microsoft.XMLHTTP или Msxml2.XMLHTTP
если объект не создан возвращает null
otype = 'xml' или 'http'
*/
function makeXMLHttpObject(otype) 
{
	var xml;
	xml=null;
	Btype=null;
	if (window.ActiveXObject)
	{
		var re = /MSIE\s*(\d+\.\d+)/gi;
		var res = re.exec(navigator.userAgent);

		if (res!=null){
			var iever = RegExp.$1;
			if (iever!=null){
				iever = parseFloat(iever);
				if (iever<=5.0){return null;}
			}
		}

		Btype = 'IE';
		if (otype=='xml'){
			try{xml = new ActiveXObject("Msxml2.DOMDocument");}
			catch(e){
				try{xml = new ActiveXObject("Microsoft.XMLDOM");}
				catch(e){return null;}
			}
		}
		else{
			try{xml = new ActiveXObject("Msxml2.XMLHTTP");}
			catch(e){
				try{xml = new ActiveXObject("Microsoft.XMLHTTP");}
				catch(e){return null;}
			}
		}
	}
	else{
		Btype = 'notIE';
		try{xml = new XMLHttpRequest();}
		catch(e){return null;}
	}
	
	return xml;
}

/*
выполняет асинхронный запрос к серверу в случае успеха возвращает true, в противном случае false
oType - тип данных и соответственно объекта (xml или http)
rqType - тип запроса get или post
PostData - отправляемые дынные если post
ReqType - идентификатор запроса (для обработчика события onreadystatechange)
ReqParams - дополнительные параметры запроса (для обработчика события onreadystatechange)

прототип функции обработчика события имеет следующий вид processReqChange(xml, oType, rqType, ReqType, ReqParams)
xml - созданный внутри функции makeRequest объект
например так
function processReqChange(xml, oType, rqType, ReqType, ReqParams) //обработчик события onreadystatechange
{
	if (xml.readyState == 4) // только если запрос обработан до конца
	{
		if (Btype == 'IE')
		{
			if (rqType=='POST' || (rqType=='GET' && oType!='xml')){if (xml.status != 200) xml=null;}
			if (xml!=null && oType=='xml' && rqType=='POST') xml = xml.responseXML;
		}
		if (Btype == 'notIE')
		{
			if (xml.status == 200){if (oType=='xml') xml = xml.responseXML;}
			else xml=null;
		}
		
		if (ReqType=='id')
			foo(xml, ReqParams); //эта функция знает, что делать с данными
	}	
}

пример вызова 
makeRequest('script.asp', 'http', 'post', 'param=123', 'id1', null)
makeRequest('xml.xml', 'xml', 'get', null, 'id2', null)
makeRequest('script.asp', 'xml', 'post', 'param=321', 'id3', null)
*/
function makeRequest(url, oType, rqType, PostData, ReqType, ReqParams) 
{
	var xml;

	if (url.indexOf('?')>0)
	{
		HtmlPrm = url.substr(url.indexOf('?'))
	}
	if (oType) oType = oType.toLowerCase();
	if (rqType) rqType = rqType.toUpperCase();
	
	if (rqType=='GET')
		xml = makeXMLHttpObject(oType);
	else{
		rqType='POST'
		xml = makeXMLHttpObject('http');
	}
	
	if (xml){
		if (Btype == 'IE'){
			xml.onreadystatechange = function() { processReqChange(xml, oType, rqType, ReqType, ReqParams); };

			try{
				if(rqType=='GET'){
					if (oType=='xml'){if (xml.async) xml.async = true; xml.load(url);}
					else{xml.open('GET', url, true);xml.send(null);}
				}
				else{
					xml.open('POST', url, true);
					xml.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=windows-1251');
					xml.send(PostData);
				}
			}
			catch(e)
			{
				xml=null
			}
		}
		
		if (Btype == 'notIE'){
			xml.onreadystatechange = function() { processReqChange(xml, oType, rqType, ReqType, ReqParams); };
			if(rqType=='GET'){xml.open('GET', url, true); xml.send(null);}
			else{
		        xml.open('POST', url, true);
				xml.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=windows-1251');
    		    xml.send(PostData);
			}
		}
	}
	else
		return false;

	return true;
}