// 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.resultSuccessful=false;
	this.resultIframe=false;
	this.resultAction='eval';
	this.resultElementId='';
	// ошибки
	this.errors=new Array(
		'Ошибка: ',
		'Ошибка: AJAX не поддерживается браузером.',
		'Ошибка: Не удается создать объект XMLHttpRequest. Возможно Ваш браузер не поддерживает или в нем запрещен запуск ActiveX расширений. В последнем случае - измените настройки безопасности.',
		'Ошибка: Не найден запрошеный URL: '
	);

	// функция установки параметров результата
	this.setResultParams=function(action,elementId){
		this.resultAction=action;
		this.resultElementId=elementId;
	}
	// обработчики событий
	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){
			return;
			/*var frame=document.getElementById('ajax_frame').contentWindow;
			var b=(frame.document.body?frame.document.body:frame.document.documentElement.body);
			result=b.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;
	};
	// основной обработчик (при изменении состояния)
	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==200){
						ajaxObject.successful=true;
						ajaxObject.onLoaded(ajaxObject);
						break;
	 				}else if(ajaxObject.request.status==404){
						ajaxObject.riseError(3,ajaxObject.url);
						break;
	 				}else{
						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)
					data+='&'+form.elements[i].name+'='+encodeURIComponent(form.elements[i].value);
			}
			this.send(data,url,method,async);
		}else{
			var frame=document.getElementById('ajax_frame');
			// создаем скрытый фрэйм ajax_form, если еще нет
			if(!frame){
				var node=document.createElement('DIV');
        node.style.position='absolute';
        node.style.display='none';
        node.style.visibility='hidden';
        node.innerHTML='<iframe 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);
        frame=document.getElementById('ajax_frame');
				var ajaxObject=this;
        frame.onload=function(){ajaxObject.onLoaded(ajaxObject);};
			}
			// добавляем поле ajax_query, если еще нет
			if(form.lastChild.name!='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();
}