﻿var UIManager = new Class(
{
	initialize : function()
	{
		this._commandHandlerList = [];
		this._commandHandlers = { };

		this._viewStateHandlerList = [];
		this._viewStateHandlers = { };

		this._initCommands = [];
	},

	registerCommandHandler : function(action, handler)
	{
		this._commandHandlerList.push(action);
		this._commandHandlers[action] = handler;
	},

	registerViewStateHandler : function(typeID, handler)
	{
		this._viewStateHandlerList.push(typeID);
		this._viewStateHandlers[typeID] = handler;
	},

	collectViewState : function(dialog, collectSubStates)
	{
		var controlStates = { };

		controlStates["__type"] = "cs";

		if (dialog == null)
		{
			return controlStates;
		}

		var metaControls = $(dialog.id + "_controls");

		if (metaControls.value != "")
		{
			var controls = metaControls.value.split(",");

			for (var i = 0; i < controls.length; i++)
			{
				var metaControl = controls[i].split(":");

				var metaControlID = metaControl[0];
				var metaControlTypeID = metaControl[1];

				if (!this._viewStateHandlerList.contains(metaControlTypeID))
				{
					continue;
				}

				var control = this.getNestedControl(dialog, metaControlID);

				if (control != null)
				{
					controlStates[metaControlID] = this._viewStateHandlers[metaControlTypeID](control);
				}
			}
		}

		if (collectSubStates == true)
		{
			var metaDialogs = $(dialog.id + "_dialogs");

			if (metaDialogs.value != "")
			{
				var dialogs = metaDialogs.value.split(",");

				for (var i = 0; i < dialogs.length; i++)
				{
					var dialogState = ui.collectViewState($(dialogs[i]), true);

					var temp = {};

					temp["__type"] = "vs";
					temp["State"] = dialogState;
					temp["Parameters"] = base64Json.decode($(dialogs[i] + "_parameters").value);

					controlStates[dialogs[i]] = temp;
				}
			}
		}

		return controlStates;
	},

	handleEvent : function(dialogID, sender, eventName)
	{
		var dialog = $(dialogID);

		if (dialog == null)
		{
			alert("Could not find dialog '" + dialogID + "'");
			return;
		}

		var viewState = base64Json.encode(this.collectViewState(dialog, false));
		var parameters = $(dialogID + "_parameters").value;

		UIService.HandleEvent(dialogID, parameters, viewState, sender.id, eventName, this.processCommands);
	},

	load : function()
	{
		this.processCommands(this._initCommands);
	},

	processCommands : function(commands)
	{
		for (var i = 0; i < commands.length; i++)
		{
			var command = commands[i];
			var data = command.Data;

			if (ui._commandHandlerList.contains(command.Action))
			{
				ui._commandHandlers[command.Action](command);
			}
			else
			{
				switch (command.Action)
				{
					case "update":
						var ajaxPanel = $(data.AjaxPanel);

						if (ajaxPanel == null)
						{
							alert("Could not find ajax panel to update");
							return;
						}

						ajaxPanel.innerHTML = data.Content;

						break;
					case "redirect":
						document.location.href = data.Url;

						break;
					case "eval":
						eval(data.Script);

						break;
				}
			}
		}
	}
});

var uiManager = new UIManager();
var ui = uiManager;

function HandleEvent(dialogID, sender, eventName)
{
	uiManager.handleEvent(dialogID, sender, eventName);
}
