﻿// Handling communication between server and client
var g_arrAjaxList = new Array(); // ronda global, hogy a readystatechange események globalok legyenek.


function CommandHandler (strServerUrl, strSessionID, strAppID, strLangID)
{
	var me = this;
//
	this.bUseAjax = true;
	this.strServerUrl = ((strServerUrl != undefined) &&(strServerUrl != null) && (strServerUrl != "") ? strServerUrl : location.protocol + "//" + location.host + location.pathname);
	this.strSessionID = (strSessionID != undefined ? strSessionID : "");
	this.strAppID = (strAppID != undefined ? strAppID : null);
	this.strLangID = (strLangID != undefined ? strLangID : null);
//
//	this.arrAjaxList = new Array();
// events
	this.OnCommandReady = null;
	this.OnCommandError = null;
	this.OnReadyStateChange = null;

// functions

	this.AddAjax = function(ajax, iTag)
	{
		ajax.iTag = (iTag != undefined ? iTag: null);
		var iNew = -1;
		for(var i=0; i<g_arrAjaxList.length; i++)
		{
			if(g_arrAjaxList[i] == null || g_arrAjaxList[i].readyState == 4)
			{
				iNew = i;
				break;
			}
		}
		if(iNew < 0) {
			iNew = g_arrAjaxList.length;
		}
		g_arrAjaxList[iNew] = ajax;
	}
	
	this.GetState = function(iTag)
	{
		if(iTag == undefined)
			iTag = null;
		var iState = 0;
		
		for(var i=0; i<g_arrAjaxList.length; i++)
		{
			if(g_arrAjaxList[i] != null)
			{
				if(iTag != null && g_arrAjaxList[i].iTag != iTag)
				{
					continue;
				}
				if(iState == 0 || g_arrAjaxList[i].readyState < iState)
					iState = g_arrAjaxList[i].readyState;
			}
		}
		return iState;
	}

	this.CreateCommandID = function()
	{
		return Math.round(Math.random() * 10000);
	}
	this.GetCommandUrl = function(strFunction, iCommandID)
	{
		var url = me.strServerUrl;
		if(iCommandID == null)
			iCommandID = me.CreateCommandID();
		url += '?Command=' + strFunction + '&sessionID=' + me.strSessionID + '&iCommandID=' + iCommandID;
		if(me.strAppID != null)
			url += '&appID=' + me.strAppID;
		if(me.strLangID != null)
			url += '&lang=' + me.strLangID;
		return url;
	}
	this.CallJs = function (strUrl)
	{
		var iStartPos = strUrl.indexOf("iImageID=") + 9;
		var iEndPos = strUrl.indexOf("&", iStartPos);
		var iImageID = 0;
		if(iEndPos>0)
			iImageID +=  parseInt(strUrl.substring(iStartPos, iEndPos));
		if(isNaN(iImageID))
			iImageID = 0;
		//if(WaitMe != undefined && WaitMe)
		//	WaitMe(iImageID);
		var script = document.createElement('script');
		script.type = 'text/javascript'; 
		script.src = strUrl;
		document.getElementsByTagName('head')[0].appendChild(script);
	}
	
	this.CallAjax = function(strFunction, strParams, iTag, handler, handlerParam, bAsync)
	{
		var iCommandID = me.CreateCommandID();
		if(handler==undefined)
			handler = null;
		var hand = function(strResult) { 
			//try
			{
				if(strResult != null && strResult.length > 0)
				{
					if (strResult.charAt(0) == "<")
					{
						location.href = "Handler.ashx";
					}
					if(handler)
						handler(eval(strResult), handlerParam, iCommandID);
					else
						eval(strResult);
					if(me.OnCommandReady)
					{
						try {
							me.OnCommandReady(iCommandID);
						}
						catch(exp) {
							if(me.OnCommandError)
								me.OnCommandError(exp, iCommandID);
						}
					}
				}
				else
				{
					if(me.OnCommandError)
					{
						try {
							me.OnCommandError("");
						}
						catch(exp) {
							//alert("Exception in CommandHandler.OnCommandError");
						}
					}
				}
			}
			/*catch(exp)
			{
				if(me.OnCommandError)
				{
					try {
						me.OnCommandError(exp);
					}
					catch(e) {
						//alert("Exception in CommandHandler.OnCommandError");
					}
				}
			}*/
		}
		if(iTag == undefined)
			iTag = null;
			
		var ajax = new Ajax();
		if(bAsync != null && !bAsync)
			ajax.async = false;
		me.AddAjax(ajax, iTag);
		if(me.OnCommandError != null)
			ajax.setHandlerErr(me.OnCommandError);
		ajax.handleReadyStateChange =  function()
		{
			if(me.OnReadyStateChange)
			{
				try {
					me.OnReadyStateChange(me.GetState(iTag), iTag);
				}
				catch(e) {
					alert("Exception in CommandHandler.OnReadyStateChange");
				}
			}
		}
		ajax.doPost(me.GetCommandUrl(strFunction, iCommandID), strParams, hand, "text");
		return iCommandID;
	}

	this.CallFunction = function(strFunction, strParams, iTag, handler, handlerParam)
	{
		if(me.bUseAjax)
			return me.CallAjax(strFunction, strParams, iTag, handler, handlerParam, true);
		else
			me.CallJs(me.GetUrl(strFunction, strParams));
	}

	this.CallSyncFunction = function(strFunction, strParams, iTag, handler, handlerParam)
	{
		var iCommandID = me.CallAjax(strFunction, strParams, iTag, handler, handlerParam, false);
		return iCommandID;
	}

	this.GetUrl = function(strFunction, strParams)
	{
		var strUrl = me.GetCommandUrl(strFunction);
		if(strParams != null && strParams != undefined)
		{
/*
			var arrParams = strParams.split("&");
			for(var i=0; i<arrParams.length; i++)
			{
				var arrItem = arrParams[i].split("=");
				arrParams[i] =  arrItem[0] + "=" + (arrItem.length > 1 ? encodeURI(arrItem[1]): "");
			}
			strParams = arrParams.join("&");
*/
			
			strUrl += "&" + strParams;
		}
		return strUrl;
	}
}
