//извлекает данные из формы в строку
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;
}

//===== объект для запросов к серверу =====
// константы :)
(function(){
	$QueryType = {POST: 0x10, GET: 0x20};
	$ObjectType = {TEXT: 0x30, XML: 0x40, JSON: 0x50};
})();	
/*	
	qType		- тип запроса $QueryType.POST или $QueryType.GET
	Otype		- Какой тип данных мы получаем от сервера $ObjectType.TEXT или $ObjectType.XML или $ObjectType.JSON
*/
function httpQuery(_qType, _Otype)
{
	var qType, Otype; //, qURL, PostData, QParams;
	var XMLHttp = null;
	this.Status = false;

	// определяем наш браузер
	var ua = navigator.userAgent;
	var Agent={};
	Agent.Opera = !!(window.opera && opera.buildNumber);
	Agent.Chrome = false;
	switch (true){
		case (typeof(window.chrome)!='undefined'):
		case (typeof(window.chromium)!='undefined'):
			$Agent.Chrome = true;
		break;
	}
	Agent.Safari = (/apple computer/gi).test(window.navigator.vendor)	
	Agent.IE = !Agent.Chrome && !Agent.Safari && !Agent.Opera && typeof(window.ActiveXObject)!='undefined' && (/MSIE/gi).test(ua) && (/Explorer/gi).test(navigator.appName);
	
	Agent.Gecko = !Agent.Safari && !Agent.Chrome && !Agent.Opera && !Agent.IE && typeof(document.contentType)!='undefined'; //	 /Gecko/.test(ua);
	if(Agent.Gecko){
		Agent.Firefox = (/Firefox/gi).test(ua);
		Agent.Thunderbird = (/Thunderbird/gi).test(ua);
		Agent.SeaMonkey = (/SeaMonkey/gi).test(ua);
	}else{Agent.Firefox = Agent.Thunderbird = Agent.SeaMonkey = false;}
	
	if (Agent.IE){
		(/MSIE\s*(\d+\.\d+)/gi).exec(navigator.userAgent)
		var iever = RegExp.$1;
		if (iever!=null){
			iever = parseFloat(iever);
			if (iever>5.0){this.Status = true;}
		}
	}else{this.Status = (typeof(XMLHttpRequest)!='undefined')?true:false;}
	
	// создаём экземпляр обекта
	var CreateObject = function(_qtype, _otype){
		if(!this.Status) return null;
		switch(true){
			case (Agent.IE):
				var arr = [];
				switch(true){
					case (_qtype==$QueryType.GET && _otype==$ObjectType.XML):
						arr = ["Msxml2.DOMDocument.6.0", "Msxml2.DOMDocument.5.0", "Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "Msxml2.DOMDocument.2.6", "Msxml2.DOMDocument", "Microsoft.XMLDOM"];
					break;
			
					case (_qtype==$QueryType.POST):
					case (_qtype==$QueryType.GET && _otype!=$ObjectType.XML):
						arr = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP.2.6", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
					break;
				}
				for(var i in arr){
				    if (!arr.hasOwnProperty(i)) continue;
					try{var xml = new ActiveXObject(arr[i]); return xml;}
					catch(e){xml=null;}
				}
				this.Status=false; return null;
				
			case (!Agent.IE):
				try{return new XMLHttpRequest();}
				catch(e){this.Status=false; return null;}

			break;
			default: this.Status=false; return null;
		}
	}
	
	/*создаем(пересоздаём) объект XMLHttp
	qType		- тип запроса $QueryType.POST или $QueryType.GET
	Otype		- Какой тип данных мы получаем от сервера $ObjectType.TEXT или $ObjectType.XML или $ObjectType.JSON
	*/
	this.ResetHttpQuery = function(_qtype, _otype, _abort){
		qType=_qtype; Otype=_otype;
		
		if(_abort && XMLHttp!=null){try{XMLHttp.abort();}catch(e){}}
		XMLHttp = null;
		
		XMLHttp = CreateObject.call(this, _qtype, _otype)
	}

	if(this.Status) this.ResetHttpQuery(_qType, _Otype, false)
	this.Status = (typeof(XMLHttp)!='object')?false:true;
	
	/* синхронный запрос
	qURL		- собственно url
	PostDate	- Данные которые будут отправлены если запрос POST
	*/
	this.SynchronousRequest	= function(qURL, PostData){
		if(!this.Status) return null;
	
		switch(true){
			case (Agent.IE):
				switch(true){
					case (qType==$QueryType.GET && Otype==$ObjectType.XML):
						try{
							XMLHttp.async = false;
							XMLHttp.load(qURL);
	
							switch(true){
							case (XMLHttp.status == 0):
							case (XMLHttp.status == 200):
								return XMLHttp;
								break
							default: return null;}
							
						}catch(e){return null}
					break;
			
					case (qType==$QueryType.POST):
						try{
							XMLHttp.open('POST', qURL, false);
							XMLHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=windows-1251'); // вопрос с кодировкой
							XMLHttp.send(PostData);
						}catch(e){return null;}
						
						switch(true){
						case (XMLHttp.status == 0):
						case (XMLHttp.status == 200):
							// только если запрос выполнился успешно
							try{
								switch(true){
								case (Otype==$ObjectType.TEXT):	return XMLHttp.responseText; break;
								case (Otype==$ObjectType.XML):	return XMLHttp.responseXML; break;
								case (Otype==$ObjectType.JSON):
									var data = XMLHttp.responseText;
									if( !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(data.replace(/"(\\.|[^"\\])*"/g, ''))) ) /* " */
										return eval('(' + data + ')');
									else
										return null;
								break;}
							}catch(e){return null;}
							break;
						default: return null;}
						
					break;
					case (qType==$QueryType.GET && Otype!=$ObjectType.XML):
						try{
							XMLHttp.open('GET', qURL, false);
							XMLHttp.send(null);
						}catch(e){return null;}

						switch(true){
						case (XMLHttp.status == 0):
						case (XMLHttp.status == 200):
							// только если запрос выполнился успешно
							try{
								switch(true){
								case (Otype==$ObjectType.TEXT):	return XMLHttp.responseText; break;
								case (Otype==$ObjectType.JSON):
									var data = XMLHttp.responseText;
									if( !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(data.replace(/"(\\.|[^"\\])*"/g, ''))) ) /* " */
										return eval('(' + data + ')');
									else
										return null;
								break;
	
								}
							}catch(e){return null;}
							break;
						default: return null;}
						
					break;
				}
			break;
			case (!Agent.IE):
				try{
				switch(true){
				case (qType==$QueryType.POST):
					XMLHttp.open('POST', qURL, false);
					XMLHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=windows-1251'); // вопрос с кодировкой
					XMLHttp.send(PostData);
					break;
				case  (qType==$QueryType.GET):
					XMLHttp.open('GET', qURL, false);
					XMLHttp.send(null);
					break;
				}
				}catch(e){return null;}
				
				switch(true){
				case (XMLHttp.status == 0):
				case (XMLHttp.status == 200):
					// только если запрос выполнился успешно
					try{
						switch(true){
						case (Otype==$ObjectType.TEXT):	return XMLHttp.responseText; break;
						case (Otype==$ObjectType.XML):	return XMLHttp.responseXML; break;
						case (Otype==$ObjectType.JSON):
							var data = XMLHttp.responseText;
							if( !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(data.replace(/"(\\.|[^"\\])*"/g, ''))) ) /* " */
								return eval('(' + data + ')');
							else
								return null;
						break;
						}
					}catch(e){return null;}
					break;
				default: return null;}
				
			break;
			default: return null;
		}
	}
	
	// обработчик события onreadystatechange
	var ReadyStateChange = function(_xml, _qType, _Otype, _Params, _Handel, _timeout){
		if (_xml.readyState != 4){// запрос не выполнился
			// если задан таймаут
			if(_timeout) _timeout = setTimeout(function(){ReadyStateChange(_xml, _qType, _Otype, _Params, _Handel, _timeout)}, 20)
			return;
		}
		
		if(_timeout) clearTimeout(_timeout);
		if(typeof(_Handel)=='function'){
			// и если статус 0 или 200
			var data=null
			switch(true){
			case (_xml.status == 0):
			case (_xml.status == 200):
				switch(true){
					case (Agent.IE):
						switch(true){
							case (_qType==$QueryType.GET && _Otype==$ObjectType.XML):
								data=null;
								arr = ["Msxml2.DOMDocument.6.0", "Msxml2.DOMDocument.5.0", "Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "Msxml2.DOMDocument.2.6", "Msxml2.DOMDocument", "Microsoft.XMLDOM"];
								for(var i in arr){
								    if (!arr.hasOwnProperty(i)) continue;
									try{var data = new ActiveXObject(arr[i]); break;}
									catch(e){data=null;}
								}
								if(data!=null) try{_xml.save(data);}catch(e){data=null;}
							break;
	
							case (_qType==$QueryType.POST):
								try{
									switch(true){
									case (_Otype==$ObjectType.TEXT): data=_xml.responseText; break;
									case (_Otype==$ObjectType.XML): data=_xml.responseXML; break;
									case (_Otype==$ObjectType.JSON):
										var dt = _xml.responseText;
										if( !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(dt.replace(/"(\\.|[^"\\])*"/g, ''))) ) /* " */
											data = eval('(' + dt + ')');
										else
											data = null;
									break;}
								}catch(e){return null;}
								break;
							
							case (_qType==$QueryType.GET && _Otype!=$ObjectType.XML):
								try{
									switch(true){
									case (_Otype==$ObjectType.TEXT): data=_xml.responseText; break;
									case (_Otype==$ObjectType.JSON):
										var dt = _xml.responseText;
										if( !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(dt.replace(/"(\\.|[^"\\])*"/g, ''))) ) /* " */
											data = eval('(' + dt + ')');
										else
											data = null;
										break;
									}
								}catch(e){return null;}
								break;
						}
						break;
						
					case (!Agent.IE):
						try{
							switch(true){
							case (_Otype==$ObjectType.TEXT): data=_xml.responseText; break;
							case (_Otype==$ObjectType.XML): data=_xml.responseXML; break;
							case (_Otype==$ObjectType.JSON):
								var dt = _xml.responseText;
								if( !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(dt.replace(/"(\\.|[^"\\])*"/g, ''))) ) /* " */
									data = eval('(' + dt + ')');
								else
									data = null;
								break;
							}
						}catch(e){return null;}
						break;
				}
				
			break;}
			var Status=_xml.status, statusText = _xml.statusText;
			_xml.abort();
			_Handel(data, _Params, Status, statusText);
		}
	}
	
	/* Асинхронный запрос
	qURL		- собственно url
	PostDate	- Данные которые будут отправлены если запрос POST
	QParams		- Какие-то дополнительные параметры, будут переданы в функцию обработчик нашего запроса
	Handel		- Функция обработчик полученных данных
	*/
	this.AsyncRequest	= function(qURL, PostData, QParams, Handel){
		if(!this.Status) return false;
		var _timeout;
		
		var _xml = (XMLHttp.readyState!=0) ? CreateObject.call(this, qType, Otype) : XMLHttp;
		
		switch(true){
			case (Agent.IE):
				switch(true){
					case (qType==$QueryType.GET && Otype==$ObjectType.XML):
						try{
							_xml.async = true;
							// вешать обработчик так потому, что иначе могут быть утечки памяти
							_timeout = setTimeout(function(){ReadyStateChange(_xml, qType, Otype, QParams, Handel, _timeout)}, 20)
							_xml.load(qURL);
						}catch(e){return false}
					break;
			
					case (qType==$QueryType.POST):
						try{
							_xml.open('POST', qURL, true);
							_xml.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=windows-1251'); // вопрос с кодировкой
							// вешать обработчик так потому, что иначе могут быть утечки памяти
							_timeout = setTimeout(function(){ReadyStateChange(_xml, qType, Otype, QParams, Handel, _timeout)}, 20)
							_xml.send(PostData);
						}catch(e){return false;}
					break;
					case (qType==$QueryType.GET && Otype!=$ObjectType.XML):
						try{
							_xml.open('GET', qURL, true);
							// вешать обработчик так потому, что иначе могут быть утечки памяти
							_timeout = setTimeout(function(){ReadyStateChange(_xml, qType, Otype, QParams, Handel, _timeout)}, 20)
							_xml.send(null);
						}catch(e){return false;}
						
					break;
				}
			break;
			case (!Agent.IE):
				try{
				switch(true){
				case (qType==$QueryType.POST):
					_xml.open('POST', qURL, true);
					_xml.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=windows-1251'); // вопрос с кодировкой
					_xml.onreadystatechange = function(){ReadyStateChange(_xml, qType, Otype, QParams, Handel, null)}
					_xml.send(PostData);
					break;
				case  (qType==$QueryType.GET):
					_xml.open('GET', qURL, true);
					_xml.onreadystatechange = function(){ReadyStateChange(_xml, qType, Otype, QParams, Handel, null)}
					_xml.send(null);
					break;
				}
				}catch(e){return false;}
				
			break;
			default: return false;
		}
		
		return true;
	}	
}
