﻿Array.prototype.remove = function(from, to)
{
	var rest = this.slice((to || from) + 1 || this.length);
	this.length = from < 0 ? this.length + from : from;
	return this.push.apply(this, rest);
};

var UIManager = new Class(
{
	initialize : function()
	{
		this._viewStateHandlerList = [];
		this._viewStateHandlers = { };

		this._initCommands = [];

		this._attachedDialogState = '';
		this._targetDialog = '';

		this.onUpdateDialog = function() { };
		this.onReceiveModalPopup = function() { };

		this.onBeforeRequest = function() { };
		this.onAfterRequest = function() { };
	},

	registerViewStateHandler : function(typeID, handler)
	{
		this._viewStateHandlerList.push(typeID);
		this._viewStateHandlers[typeID] = handler;
	},
	
	getNestedControl : function(control, controlID)
	{
		return $(control).getElement("[id='" + controlID + "']");
	},

	collectDialogState : function(dialog)
	{
		if (dialog == null)
		{
			return { };
		}

		return {
			"DialogID" : dialog.id,
			"DialogTypeID" : dialog.getProperty("typeid"),
			"DialogState" : ui.collectViewState(dialog, true),
			"DialogParameters" : base64Json.decode($(dialog.id + "_parameters").value)
		}
	},

	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;
	},

	attachDialogState : function(dialogID)
	{
		this._attachedDialogState = base64Json.encode(this.collectDialogState($(dialogID)));
	},

	overwriteDialogTarget : function(dialogID)
	{
		this._targetDialog = dialogID;
	},

	handleEvent : function(dialogID, sender, eventName)
	{
		//stateHistory.states[stateHistory.position] = buildLifeState();

		if (this._targetDialog != '')
		{
			dialogID = this._targetDialog;
			this._targetDialog = '';
		}
		
		var dialog = $(dialogID);

		if (dialog == null)
		{
			alert("Could not find dialog '" + dialogID + "'");
			return;
		}

		var dialogTypeID = dialog.getProperty("typeid");
		var viewState = base64Json.encode(this.collectViewState(dialog, false));
		var parameters = $(dialogID + "_parameters").value;

		if (this.onBeforeRequest != null)
		{
			this.onBeforeRequest();
		}

		UIService.HandleEvent(dialogID, dialogTypeID, parameters, viewState, sender.id, eventName, this._attachedDialogState, this.processCommands);
		this._attachedDialogState = '';
	},

	load : function()
	{
		this.processCommands(this._initCommands);
	},
	
	processCommands : function(commands, onFinish)
	{
		if (!commands)
		{
			return;
		}

		for (var i = 0; i < commands.length; i++)
		{
			var command = commands[i];
			var data = command.Data;

			switch (command.Action)
			{
				case "update":
					var isModalPopup = data.IsModalPopup;
					var ajaxPanel = null;

					if (isModalPopup == true)
					{
						ajaxPanel = $("mpDialogInner");
					}
					else
					{
						ajaxPanel = $(data.AjaxPanel);
					}

					if (ajaxPanel == null)
					{
						alert("Could not find ajax panel to update");
						return;
					}

					ajaxPanel.setHTML(data.Content);

					if (data.ResetScroll == true)
					{
						window.scrollTo(0,0);
					}
				
					if (ui.onUpdateDialog != null)
					{
						ui.onUpdateDialog();
					}

					if (isModalPopup == true)
					{
						if (ui.onReceiveModalPopup != null)
						{
							ui.onReceiveModalPopup();
						}
					}

					break;
				case "redirect":
					document.location.href = data.Url;
					break;
				case "eval":
					eval(data.Script);
					break;
				case "setDialog":
					var ajaxPanel = $(data.AjaxPanel);

					if (ajaxPanel == null)
					{
						break;
					}

					ajaxPanel.setHTML(data.Content);

					if (data.InitCommands && data.InitCommands.length > 0)
					{
						ui.processCommands(data.InitCommands);
					}

					window.scrollTo(0,0);

					break;
				case "deleteDialog":
					var ajaxPanel = $(data.AjaxPanel);

					if (ajaxPanel == null)
					{
						break;
					}

					ajaxPanel.empty();

					break;
			}
		}

		if (onFinish != null)
		{
			onFinish();
		}

		if (ui.onAfterRequest != null)
		{
			ui.onAfterRequest();
		}

		return true;
	}
});

var uiManager = new UIManager();
var ui = uiManager;