/* *******************************************
 * This file is created by Quan Duc Binh
 * Email: Hastilydoll219@yahoo.com
 * Mobile: +84 905 089661
 * Date Created: {1}
 * Date Modified: {2}
 * ******************************************/

//Implement XPath for both IE & NN
if( document.implementation.hasFeature("XPath", "3.0") ){
	XMLDocument.prototype.selectNodes = function(cXPathString, xNode){
		if( !xNode ) 
		{
			xNode = this;
		}
		var defaultNS = this.defaultNS;

		var aItems = this.evaluate(cXPathString, xNode,{
			normalResolver:
			this.createNSResolver(this.documentElement),
			lookupNamespaceURI : function (prefix) {
				switch (prefix) {
					case "dflt":
						return defaultNS;
					default:
						return this.normalResolver.lookupNamespaceURI(prefix);
				}
			}
		},XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);

		var aResult = [];
		for( var i = 0; i < aItems.snapshotLength; i++){
			aResult[i] =  aItems.snapshotItem(i);
		}
		return aResult;
	}

	Element.prototype.selectNodes = function(cXPathString){
		if(this.ownerDocument.selectNodes){
			return this.ownerDocument.selectNodes(cXPathString, this);
		}
		else{
			throw "For XML Elements Only";
		}
	}

	/* set the SelectionNamespaces property the same for NN or IE: */
	XMLDocument.prototype.setProperty = function(p,v){
		if(p=="SelectionNamespaces" && v.indexOf("xmlns:dflt")==0){
			this.defaultNS = v.replace(/^.*=\'(.+)\'/,"$1");
		}
	}
	XMLDocument.prototype.defaultNS;
}
// create object to handle ajax request
function AJAXObject()
{
	this.request = null;
	this.queryString = "";
	this.DisplayWaitMessage = false;
	this.WaitingBox = null;
	this.WaitTimerId = 0;
	this.WaitingMsg = "";
	this.WaitingImg = new Image();
	this.WaitingImg.src = "/images/loading.gif";
	this.WaitingImg.id = "BinhBK_WaitingImg";
}
var BinhBK_Ajax_WaitingBox = null;
AJAXObject.prototype.setQueryString=function(theForm){
	if (this.queryString == "")
	{
		var frm = document.forms[theForm];
		var numberElements =  frm.elements.length;
		for(var i = 0; i <numberElements; i++) {
			this.addParam(frm.elements[i].name,frm.elements[i].value);
		}
		returnVal = this.queryString;
		this.queryString = "";
		return returnVal;
	}
	else
		return this.queryString;
}
AJAXObject.prototype.addParam = function(paramName,value)
{
	if (this.queryString == "")
		this.queryString += paramName+"="+encodeURIComponent(value);
	else
		this.queryString += "&"+paramName+"="+encodeURIComponent(value);
}
AJAXObject.prototype.SetWaitMessage=function(msg)
{
	this.DisplayWaitMessage = true;
	this.WaitingMsg = msg;
	if (!BinhBK_Ajax_WaitingBox)
	{
		//alert("Create");
		BinhBK_Ajax_WaitingBox = document.createElement("div");
		BinhBK_Ajax_WaitingBox.setAttribute("id","BinhBK_Ajax_WaitingBox");
		//this.WaitingBox.setAttribute("style","");
		if (document.body)
			document.body.appendChild(BinhBK_Ajax_WaitingBox);
		
	}
	else
		BinhBK_Ajax_WaitingBox.innerHTML = "";
	if (BinhBK_Ajax_WaitingTimerMsg.length == 0)
	{
		//alert(this.WaitingImg.src);
		BinhBK_Ajax_WaitingBox.appendChild(this.WaitingImg);
		textNode = document.createTextNode(msg);
		BinhBK_Ajax_WaitingBox.appendChild(textNode);
	}
}
var BinhBK_Ajax_WaitingTimer = new Array();
var BinhBK_Ajax_WaitingTimerMsg = new Array();
var BinhBK_Ajax_ModelDiv = null;
function BinhBK_Ajax_ShowWaitingBox()
{
	var div = document.getElementById("BinhBK_Ajax_WaitingBox");
	div.style.display = "block";
	div.style.left = (document.body.clientWidth/2-div.scrollWidth/2)+"px";
	if (Container.DOM.IsIE())
	{
		var thisHeight = (document.documentElement.clientHeight == 0) ? document.body.clientHeight : document.documentElement.clientHeight;
		div.style.top = ((document.documentElement.scrollTop+document.body.scrollTop)+thisHeight/2-div.scrollHeight)+"px";
	}
	else
		div.style.top = (scrollY+innerHeight/2-div.scrollHeight)+"px";
	/*div.style.left = 100+"px";
	div.style.top = 200+"px";*/
}
function AJAXObject_ClearTimer()
{
	for (var localTimer in BinhBK_Ajax_WaitingTimer)
		clearInterval(BinhBK_Ajax_WaitingTimer[localTimer]);
	// ---- Remove Model Div if exists ---- //
	if (BinhBK_Ajax_ModelDiv)
		BinhBK_Ajax_ModelDiv.style.display = "none";
}
function RequestTimeout()
{
	//alert("Request timeout or network connection problem. Please try again or you will lost all unsaved data!");
	var div = document.getElementById("BinhBK_Ajax_WaitingBox");
	div.style.display = "none";
	AJAXObject_ClearTimer();
	BinhBK_Ajax_WaitingTimer = new Array();
	BinhBK_Ajax_WaitingTimerMsg = new Array();
}
var AJAXObject_timeoutTimer = null;
AJAXObject.prototype.MakeRequestAndHandle=function(handleFunction,reqType,url,isAsync,theForm,ResponseType)
{
	AJAXObject_timeoutTimer = setTimeout("RequestTimeout()",60000);
	try
	{
		var _request = this.NewHttpRequest();
		this.request = _request;
		if (this.DisplayWaitMessage)
		{
			this.WaitTimerId = BinhBK_Ajax_WaitingTimer.length;
			//alert(this.WaitTimerId);
			BinhBK_Ajax_WaitingTimerMsg[this.WaitTimerId] = this.WaitingMsg;
			BinhBK_Ajax_WaitingTimer[this.WaitTimerId] = setInterval(BinhBK_Ajax_ShowWaitingBox,10);
			
			BinhBK_Ajax_ModelDiv = document.getElementById("BinhBK_Ajax_ModelDivStyle");
			if (BinhBK_Ajax_ModelDiv == null)
			{
				BinhBK_Ajax_ModelDiv = document.createElement("div");
				document.body.appendChild(BinhBK_Ajax_ModelDiv);
				BinhBK_Ajax_ModelDiv.setAttribute("id","BinhBK_Ajax_ModelDivStyle");
			}
			else
				BinhBK_Ajax_ModelDiv.style.display = "block";
			
			if (document.documentElement.clientHeight)
			{
				BinhBK_Ajax_ModelDiv.style.width = document.documentElement.scrollWidth+"px";
				BinhBK_Ajax_ModelDiv.style.height = document.documentElement.scrollHeight+"px";
			}
			else
			{
				BinhBK_Ajax_ModelDiv.style.width = document.body.scrollWidth+"px";
				BinhBK_Ajax_ModelDiv.style.height = document.body.scrollHeight+"px";
			}
			Container.DOM.AddEventListener(document,"scroll",BinhBK_Ajax_ShowWaitingBox);
		}
		var localTimer = this.WaitTimerId;
		var localDisPlayWaitMessage = this.DisplayWaitMessage;
		//_request.setAttribute("id","asdfasdf");
		_request.onreadystatechange = function()
		{
			if(_request.readyState == 4)
			{
				if(_request.status == 200)
				{
					if (localDisPlayWaitMessage)
					{
						//alert(BinhBK_Ajax_WaitingTimerMsg[localTimer]);
						clearInterval(BinhBK_Ajax_WaitingTimer[localTimer]);
						Container.DOM.RemoveEventListener(document,"scroll",BinhBK_Ajax_ShowWaitingBox);
						// ---- Remove Model Div if exists ---- //
						if (BinhBK_Ajax_ModelDiv)
							BinhBK_Ajax_ModelDiv.style.display = "none";
						
						//BinhBK_Ajax_WaitingTimer[localTimer] = "";
						BinhBK_Ajax_WaitingTimerMsg[localTimer] = "";
						
						var finish = true;
						var nextMsg = "";
						var div = document.getElementById("BinhBK_Ajax_WaitingBox");
						//alert("BinhBK_Ajax_WaitingTimer.length: "+BinhBK_Ajax_WaitingTimer.length+", localTimer: "+localTimer);
						for (var i=0;i<BinhBK_Ajax_WaitingTimer.length;i++)
						{
							//alert(BinhBK_Ajax_WaitingTimerMsg[i]);
							if (BinhBK_Ajax_WaitingTimerMsg[i] != "")
							{
								div.innerHTML = BinhBK_Ajax_WaitingTimerMsg[i];
								finish = false;
								break;
							}
						}
						if (finish)
						{
							//var div = document.getElementById("BinhBK_Ajax_WaitingBox");
							div.style.display = "none";
							AJAXObject_ClearTimer();
							BinhBK_Ajax_WaitingTimer = new Array();
							BinhBK_Ajax_WaitingTimerMsg = new Array();
						}
					}
					
					if (ResponseType == "Text")
					{
						var newDoc = _request.responseText;
						handleFunction(newDoc);
					}
					else
					{
						var newDoc = _request.responseXML;
						handleFunction(newDoc);
					}
					clearTimeout(AJAXObject_timeoutTimer);
					
					// ---- Remove Model Div if exists ---- //
					if (BinhBK_Ajax_ModelDiv)
						BinhBK_Ajax_ModelDiv.style.display = "none";
				}
				else 
				{
					alert("A problem occurred with communicating between "+
						"the XMLHttpRequest object and the server program.");
					
					var div = document.getElementById("BinhBK_Ajax_WaitingBox");
					div.style.display = "none";
					Container.DOM.RemoveEventListener(document,"scroll",BinhBK_Ajax_ShowWaitingBox);
					AJAXObject_ClearTimer();
					BinhBK_Ajax_WaitingTimer = new Array();
					BinhBK_Ajax_WaitingTimerMsg = new Array();
				}
			}//end outer if
			else
			{
				
			}
		}
		if(reqType.toLowerCase() == "get")
		{
			if (this.queryString != "")
				_request.open(reqType,url+"&"+this.queryString,isAsync);
			else
				_request.open(reqType,url,isAsync);
			_request.send(null);
		}
		else
		{
			_request.open(reqType,url,isAsync);
			//_request.open('post','index.php',true);
			_request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
			//alert(this.setQueryString(theForm));
			_request.send(this.setQueryString(theForm));
		}
		
		this.queryString = "";
	} 
	catch (errv) {
		alert(
			"The application cannot contact "+
			"the server at the moment. "+
			"Please try again in a few seconds.\\n"+
			"Error detail: "+errv.message);
		
		var div = document.getElementById("BinhBK_Ajax_WaitingBox");
		div.style.display = "none";
		Container.DOM.RemoveEventListener(document,"scroll",BinhBK_Ajax_ShowWaitingBox);
		AJAXObject_ClearTimer();
		BinhBK_Ajax_WaitingTimer = new Array();
		BinhBK_Ajax_WaitingTimerMsg = new Array();
	}
}
AJAXObject.prototype.NewHttpRequest = function()
{
	var request = null;
	//Mozilla-based browsers
	if(window.XMLHttpRequest){
		request = new XMLHttpRequest();
	} 
	else if (window.ActiveXObject)
	{
		request=new ActiveXObject("Msxml2.XMLHTTP");
		if (! request){
			request=new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	//very unlikely, but we test for a null request
	//if neither ActiveXObject was initialized
	if(request) {
		return request;
	} else {
		alert("Your browser does not permit the use of all "+
			"of this application's features!");
	}
}
var myAjax = new AJAXObject();
var subName = "";
myAjax.homeURL = "http://" + window.location.hostname+subName;
