/************************************************
	AJAX ENGINE үүсгэх, түүнийг удирдах
	хүсэлт илгээх, зэрэг бүх үйлдлийг 
	багтаасан класс
	
	EinsteinSoft LLC
	
	2008-08-19
************************************************/

//Ajax дээрх хэл
var AjaxLang = new Array();
AjaxLang['State0'] = '<img src="files/ajax-loader.gif" border="0">';
AjaxLang['State1'] = '<img src="files/ajax-loader.gif" border="0">';
AjaxLang['State2'] = '<img src="files/ajax-loader.gif" border="0">';
AjaxLang['State3'] = '<img src="files/ajax-loader.gif" border="0">';
AjaxLang['State4'] = '';
AjaxLang['Ajax_support_error'] = 'Таны браузер AJAX ENGINE-ыг дэмжихгүй байна!!!';

//Үр дүн өөрчлөлттэй эсэх
var AjaxEngine_changedResult = true;

function AjaxEngine()
{
	/*********  ГИШҮҮН ХУВЬСАГЧИД  *********/
	//Тухайн классын объект
	var AjaxEngine_CoreObj = this;
	
	//XMLHttpRequest объект
	this.XHRObj = '';
	
	//Хүсэлт илгээх төрөл
	this.method = 'POST'; //GET
	
	//Хариулт ачаалагдаж байгаа тухайн мэдээлэл
	this.stateMSG = '';
	
	//Уншиж байгааг харуулах элемент
	this.loader = 'loading';
	
	//Хариултыг хэвлэх элемент
	this.target = '';
	
	//Асинхрон эсэх
	this.async = true; //false
	
	//Хүсэлт илгээх хаяг
	this.url = '';
	
	//Хариултыг боловсруулах функц
	this.callbackFunc = '';
	
	//Форм дах элеметүүдийг нэгтгэх
	this.queryStr = '';
	
	//Алдааны мэдээлэл
	this.errorMSG = '';
	
	//Хариултын төрөл
	this.responseType = 'txt'; //xml
	
	//Хариултыг залгах эсэх
	this.responseJoin = false;
	
	//Javascript URL авах
	this.jsSource = '';
	
	//Javascript SCRIPT хавсаргах
	this.jsScript = '';
	
	//Javascript дуудах хугацаа
	this.jsTimeout = 200;
	
	//Хоосон утга зөвшөөрөхгүй эсэх
	this.notNull = true;
	
	
	
	/*********  ГИШҮҮН ФУНКЦҮҮД  *********/
	//Объект үүсгэх
	this.CreateObj = function()
	{
		var obj = false;
		if (window.XMLHttpRequest) 
		{
			obj = new XMLHttpRequest();
		}
		else if (window.ActiveXObject) 
		{
			try 
			{
				obj = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch(e) 
			{
				try 
				{
					obj = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch(e) 
				{
					this.errorMSG = 'AJAX OBJECT CANNOT CREATE';	
					alert(AjaxLang['Ajax_support_error']);
				}
			}
		}
		return obj;		
	}
	
	//Javascript хавсаргах функц
	this.IncludeJavascript = function()
	{
		if(this.jsSource != '')
		{
			var targetID = this.target;
			var scriptSource = this.jsSource;			
			
			setTimeout("var scriptObj = document.createElement('script'); scriptObj.type = 'text/javascript'; scriptObj.src = '"+scriptSource+"';  document.getElementById('"+targetID+"').appendChild(scriptObj);", this.jsTimeout);
		}
	}	
	
	//Хүсэлт илгээх ерөнхий функц
	this.Request = function()
	{
		var indicator = true;
		if(this.target != "")
		{
			if(document.getElementById(this.target) == null)
			{
				indicator = false;
			}
		}
		
		if(indicator)
		{
			this.SetQueryString();
			
			if(this.method == 'GET')
			{
				this.getRequest();
			}
			else if(this.method == 'POST')
			{
				this.postRequest();
			}
			else
			{
				this.errorMSG = 'METHOD UNKNOWN';
			}			
		}
	}
	
	//GET утгаар хүсэлт илгээх
	this.getRequest = function()
	{	
		this.XHRObj = this.CreateObj();
		if(this.target == '')
		{
			this.XHRObj.onreadystatechange = this.Response;
		}
		else
		{
			this.XHRObj.onreadystatechange = this.TargetResponse;
		}
		this.XHRObj.open(this.method, this.url, this.async);
		this.XHRObj.send(null);		
	}
	
	//POST утгаар хүсэлт илгээх
	this.postRequest = function()
	{
		this.XHRObj = this.CreateObj();
		if(this.target == '')
		{
			this.XHRObj.onreadystatechange = this.Response;
		}
		else
		{
			this.XHRObj.onreadystatechange = this.TargetResponse;
		}
		this.XHRObj.open(this.method, this.url, this.async);
		this.XHRObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		this.XHRObj.setRequestHeader("Content-length", this.queryStr.length);
		this.XHRObj.setRequestHeader("Connection", "close");
		this.XHRObj.send(this.queryStr);		
	}	
	
	//Форм дахь элементүүдийг POST хийнэ.
	this.SetQueryString = function()
	{
		var qs = '';
		if(document.forms[0] != null && document.forms[0].length != null)
		{
			for(var i = 0; i < document.forms[0].length; i++) 
			{
				if(i < document.forms[0].length-1) 
				{
					qs += document.forms[0].elements[i].name+"="+encodeURIComponent(document.forms[0].elements[i].value)+"&";
				} 
				else 
				{
					qs += document.forms[0].elements[i].name+"="+encodeURIComponent(document.forms[0].elements[i].value);
				}
			}
		}
		this.queryStr = qs;
	}
	
	//Хариултыг боловсруулагч функц
	this.Response = function()
	{
		if(AjaxEngine_CoreObj.CheckReadyState(AjaxEngine_CoreObj))
		{ 
			if(AjaxEngine_CoreObj.responseType == 'txt')
			{
				eval(AjaxEngine_CoreObj.callbackFunc)(AjaxEngine_CoreObj.XHRObj.responseText);				
			}
			else if(AjaxEngine_CoreObj.responseType == 'xml')
			{			
				eval(AjaxEngine_CoreObj.callbackFunc)(AjaxEngine_CoreObj.XHRObj.responseXML);			
			}
		}
	}
	
	//Хариултыг хэвлэгч функц
	this.TargetResponse = function()
	{
		if(AjaxEngine_CoreObj.CheckReadyState(AjaxEngine_CoreObj))
		{
			var AjaxObj_indicator = true;
			if(encodeURIComponent(AjaxEngine_CoreObj.XHRObj.responseText) == '%09' || encodeURIComponent(AjaxEngine_CoreObj.XHRObj.responseText) == "")
			{
				if(AjaxEngine_CoreObj.notNull)
				{
					AjaxObj_indicator = false;
				}
			}
			
			if(AjaxObj_indicator)
			{
				if(!AjaxEngine_CoreObj.responseJoin)
				{
					document.getElementById(AjaxEngine_CoreObj.target).innerHTML = AjaxEngine_CoreObj.XHRObj.responseText;
				}
				else
				{
					document.getElementById(AjaxEngine_CoreObj.target).innerHTML += AjaxEngine_CoreObj.XHRObj.responseText;
				}
			}
			else
			{
				AjaxEngine_changedResult = false;
			}
		}		
	}
	
	//Хариулт бэлэн болсон эсэхийг шалгах функц
	this.CheckReadyState = function()
	{
		var result = false;
		
		if(this.XHRObj.readyState == 0) { this.stateMSG = AjaxLang['State0'];  result = false; }
		if(this.XHRObj.readyState == 1) { this.stateMSG = AjaxLang['State1']; result = false; }
		if(this.XHRObj.readyState == 2) { this.stateMSG = AjaxLang['State2']; result = false; }
		if(this.XHRObj.readyState == 3) { this.stateMSG = AjaxLang['State3']; result = false; }
		if(this.XHRObj.readyState == 4)
		{
			if(this.XHRObj.status == 200)
			{
				this.stateMSG = AjaxLang['State4'];
				result = true;
			}
			else
			{
				this.stateMSG = "HTTP " + this.XHRObj.status;
				this.errorMSG = 'STATE CANNOT READY';
				result = false;
			}
		}
		
		document.getElementById(this.loader).innerHTML = this.stateMSG;
		
		return result;		
	}
}