// IT Avenue

function Ajax(){
  // объект запроса
	this.request=null;
  // параметры запроса
	this.form=null;
	this.iframe=false;
	this.data=null;
	this.url=location.href;
	this.method='POST';
	this.async=true;
	this.frame=null;
	// параметры результата
	this.resultSuccessful=false;
	this.resultIframe=false;
	this.resultAction='eval';
	this.resultElementId='';
	this.resultElementObj='';
	// ошибки
	this.errors=new Array(
		'Ошибка: ',
		'Ошибка: AJAX не поддерживается браузером.',
		'Ошибка: Не удается создать объект XMLHttpRequest. Возможно Ваш браузер не поддерживает или в нем запрещен запуск ActiveX расширений. В последнем случае - измените настройки безопасности.',
		'Ошибка: Не найден запрошеный URL: ',
		'Ошибка: AJAX запрос завершился неудачей. URL: '
	);

	// функция установки параметров результата
	this.setResultParams=function(action,elementId){
		this.resultAction=action;
		this.resultElementId=elementId;
	}
	// функция установки объекта результата
	this.setResultElementObj=function(element){
		this.resultAction='setInnerObj';
		this.resultElementObj=element;
	}
	// обработчики событий
	this.onUninitialized=function(ajaxObject){};
	this.onOpen=function(ajaxObject){};
	this.onSent=function(ajaxObject){};
	this.onReceiving=function(ajaxObject){};
	this.onLoaded=function(ajaxObject){
		var result='';
		if(ajaxObject.resultIframe){
			result=ajaxObject.frame.contentWindow.document.body.innerHTML;
		}else{
			result=ajaxObject.request.responseText;
		}
		if(ajaxObject.resultAction=='eval')
			eval(result);
		if(ajaxObject.resultAction=='setValue')
			document.getElementById(ajaxObject.resultElementId).Value=result;
		if(ajaxObject.resultAction=='setInner')
			document.getElementById(ajaxObject.resultElementId).innerHTML=result;
		if(ajaxObject.resultAction=='setInnerObj')
			ajaxObject.resultElementObj.innerHTML=result;

	};
	this.onError=function(ajaxObject){};
	// основной обработчик (при изменении состояния)
	this.onStatusChange=function(ajaxObject){
	  try{
			switch(ajaxObject.request.readyState){
				case 0:
					ajaxObject.onUninitialized(ajaxObject);
					break;
				case 1:
					ajaxObject.onOpen(ajaxObject);
					break;
				case 2:
					ajaxObject.onSent(ajaxObject);
					break;
				case 3:
					ajaxObject.onReceiving(ajaxObject);
					break;
				case 4:
					if(!ajaxObject.request.status||ajaxObject.request.status>=200&&ajaxObject.request.status<=300||request.status==304){
						ajaxObject.successful=true;
						ajaxObject.onLoaded(ajaxObject);
						break;
	 				}else if(ajaxObject.request.status==404){
						ajaxObject.riseError(3,ajaxObject.url);
						ajaxObject.onError(ajaxObject);
						break;
	 				}else{
						ajaxObject.riseError(3,ajaxObject.url);
						ajaxObject.onError(ajaxObject);
						break;
	 				}
			}
		}catch(e){
      // В Firefox приходится отлавливать ошибку
      // https://bugzilla.mozilla.org/show_bug.cgi?id=238559
		}
	}
	// инициализация запроса
	this.init=function(){
		if(window.XMLHttpRequest){
			try{ this.request=new XMLHttpRequest(); }
			catch(e){ this.riseError(2); }
		}else if(window.ActiveXObject){
			try{ this.request=new ActiveXObject('Msxml2.XMLHTTP'); }
			catch(e){ try{ this.request=new ActiveXObject('Microsoft.XMLHTTP'); }
			catch(e){ this.riseError(2); } }
		}else{
			this.riseError(1);
		}
		if(this.request){
			var ajaxObject=this;
			this.request.onreadystatechange=function(){ajaxObject.onStatusChange(ajaxObject);};
		}
	}
	// отправка запроса
	this.send=function(data,url,method,async){
		url=(url!=null?url:this.url);
		method=(method!=null?method:this.method);
		async=(async!=null?async:this.async);

		if(method=='GET'&&data){
			url=url+'?'+data;
			data=null;
		}
		this.request.open(method,url,async);
		this.request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");	
		this.request.send(data);
	}
	// отправка данных
	this.sendData=function(fields,url,method,async){
		url=(url!=null?url:this.url);
		method=(method!=null?method:this.method);
		async=(async!=null?async:this.async);

		var data='ajax_query=1';
		for(i in fields){
			data+='&'+i+'='+encodeURIComponent(fields[i]);
		}
		this.send(data,url,method,async);
	}
	// отправка формы
	this.sendForm=function(form,iframe,url,method,async){
		if(typeof(form)=='string') // если тип строка значит это id или name формы
			form=(document.getElementById(form)?document.getElementById(form):document.forms[form]);
		iframe=(iframe!=null?iframe:this.iframe);
		url=(url!=null?url:(form.action?form.action:this.url));
		method=(method!=null?method:(form.method?form.method:this.method));
		async=(async!=null?async:this.async);
		this.resultIframe=iframe;

		if(!iframe){
			var data='ajax_query=1';
			for(i=0; i<form.elements.length; i++){
				if(form.elements[i].name){
					if(form.elements[i].name&&(form.elements[i].type!='checkbox'&&form.elements[i].type!='radio'||form.elements[i].checked))
						data+='&'+form.elements[i].name+'='+encodeURIComponent(form.elements[i].value);
				}
			}
			this.send(data,url,method,async);
		}else{
			// создаем скрытый фрэйм ajax_form, если еще нет
			if(!this.frame){
				this.frame=document.getElementById('ajax_frame');
				if(!this.frame){
					var node=document.createElement('DIV');
					node.style.position='absolute';
					node.style.display='none';
					node.style.visibility='hidden';
					node.innerHTML='<iframe'+(window.opera?' src="opera:blank"':'')+' name="ajax_frame" id="ajax_frame" style="width:0px;height:0px;overflow:hidden;border:none;"></iframe>';
					var b=(document.body?document.body:document.documentElement.body);
					b.appendChild(node);
					this.frame=document.getElementById('ajax_frame');
					var ajaxObject=this;
					// устанавливаем функцию при загрузке
					if(this.frame.addEventListener){
						this.frame.addEventListener('load',function(){ajaxObject.onLoaded(ajaxObject);},false);
					}else if(this.frame.attachEvent){
						this.frame.attachEvent('onload',function(){ajaxObject.onLoaded(ajaxObject);});
					}else{
						this.frame.onload=function(){ajaxObject.onLoaded(ajaxObject);};
					}
				}
			}
			// добавляем поле ajax_frame, если еще нет и если надо
			if(iframe&&!form.elements['ajax_frame']){
				var input=document.createElement('INPUT');
				input.type='hidden';
				input.name='ajax_frame';
				input.value='1';
				form.appendChild(input);
			}
			// добавляем поле ajax_query, если еще нет
			//if(form.lastChild.name!='ajax_query'){
			if(!form.elements['ajax_query']){
				var input=document.createElement('INPUT');
				input.type='hidden';
				input.name='ajax_query';
				input.value='1';
				form.appendChild(input);
			}
			form.action=url;
			//form.method='POST';
			form.method=method;
			form.target='ajax_frame';
			form.enctype='multipart/form-data';
			form.submit();
		}
	}
	// обработка ошибок
	this.riseError=function(i,param){
		alert(this.errors[i]+param);
	}

	// инициализация запроса
	this.init();
}
