﻿var g_currentRequestCallback = null;
var g_currentWait = null;
var g_disabledControls = null;
var g_currentContext = null;
var g_blockingRequestInProgress = false;

function updateAllBindings(element, remove)
{
	if (element)
	{
		if (element.tagName)
			{
			if (remove) 
				Web.Bindings.removeBindings(element);
			else
				Web.Bindings.revalidateBinding(element);
			}
		updateAllBindingsRecursive(element.firstChild, remove);
	}
}		

function updateAllBindingsRecursive(element, remove)
{
	if (element)
	{
		if (element.tagName)
		{
			if (remove) 
				Web.Bindings.removeBindings(element);
			else
				Web.Bindings.revalidateBinding(element);
		}
		updateAllBindingsRecursive(element.firstChild, remove);
		updateAllBindingsRecursive(element.nextSibling, remove);
	}
}		

function enableControls(aControls)
{
	for(var i = 0; i < g_disabledControls.length; i++)
	{
		var control = document.getElementById(g_disabledControls[i]);
		if (control != null)
			control.disabled = false
	}
	g_disabledControls = null;
}

function disableControls(aControls)
{
	// If a previous call disabled any controls re-enable them
	if (g_disabledControls != null)
		enableControls(g_disabledControls);
		
	// Disable the controls		
	g_disabledControls = aControls;
	for(var i = 0; i < g_disabledControls.length; i++)
	{
		var control = document.getElementById(g_disabledControls[i]);
		if (control != null)
			control.disabled = true;
	}		
}

function doWait(elementId)
{
	// If there is currently a wait executing, stop it
	if (g_currentWait)
		stopWait(g_currentWait);

	// Start the new wait		
	g_currentWait = document.getElementById(elementId);
	if(g_currentWait)
		g_currentWait.style.display = "block";
}

function stopWait(elementId)
{
	g_currentWait.style.display = "none";
	g_currentWait = null;
}

function onAsyncRequestCallback(result, context)
{		
	if (context == "" || context == null || context == undefined || context == g_currentContext)
	{						
		// Hide the wait control
		if (g_currentWait)
		{
			stopWait(g_currentWait);
		}
		
		// Clear the global context
		g_currentContext = null;
		
		// Re-enable any disabled controls	
		if (g_disabledControls)
		{	
			enableControls(g_disabledControls);
		}

		// The result is in 2 parts, a success/error code plus a message or HTML to display
		var responseBits = result.split("|");
		var code = responseBits[0];
		var htmlData = "";
		switch(code)
		{
			case "Success":
			case "Error":
				htmlData = responseBits[1];
				if (responseBits.length > 2)
				{
					responseBits.shift();
					htmlData = responseBits.join("|");					
				}
				if (g_currentRequestCallback)
				{					
					g_currentRequestCallback(code, htmlData, context);
					g_currentRequestCallback = null;
				}
				break;
			case "Redirect":
				// window.location causes an immediate redirect to the specified URL
				window.location = responseBits[1];
				break;
			case "Popup":
				window.open(responseBits[1], responseBits[2], responseBits[3]);
				break;
			case "Refresh":
				window.history.go(0);
				break;
			case "Update":
			case "UpdateWithError":			
				
				var element = document.getElementById(responseBits[1]);
				updateAllBindings(element, true);
				
				element = document.getElementById(responseBits[1]);
				htmlData = responseBits[2];
				if (responseBits.length > 3)
				{
					responseBits.shift();
					responseBits.shift();
					htmlData = responseBits.join("|");
					
				}
				element.innerHTML = htmlData;
				element.style.display = "block";
				updateAllBindings(element, false);
				
				if (g_currentRequestCallback)
				{
					g_currentRequestCallback(code, responseBits[1], context);
					g_currentRequestCallback = null;
				}				
				break;
			case "NotAuthenticated":
				htmlData = responseBits[1];
				if (responseBits.length > 2)
				{
					responseBits.shift();
					htmlData = responseBits.join("|");
				}
				document.getElementById("NotAuthenticatedMsg").innerText = htmlData;
				showLivePopup("redirectDlg");
				break;			
			case "Script":
			    script = responseBits[1];
			    eval(script);
			    break;
			default:
				window.location = "/SiteError.aspx";
				break;										
		}				
	}					
	
	document.getElementById("requestInProgress").value = "false";
	g_blockingRequestInProgress = false;				
}
