﻿function Event(objParent, strName)
{
	var THIS = this;
	this.Parent = objParent;
	this.Name = strName;
	var arrSubscribers = new Object();
	var intNextId = 0;

	//=====================================================================
	// Subscribe to this event
	//=====================================================================
	this.Subscribe = function Subscribe(objEventHandler)
	{
		if (objEventHandler == null)
			throw new Error("You must supply either a function or an EventHandler object to use.");

		if (typeof (objEventHandler) == "function")
			objEventHandler = new EventHandler(objEventHandler);
		else if (typeof (objEventHandler) == "object")
		{
			if (!IsEventHandler(objEventHandler))
				throw new Error("argument must be an EventHandler object");
		}
		else
			throw new Error("You must supply either a function or an EventHandler object to this method.");

		intNextId++;

		objEventHandler.Id = intNextId;
		arrSubscribers[intNextId] = objEventHandler;
		objEventHandler.Event = this;
		return objEventHandler;
	}

	//=====================================================================
	// Unsubscribe from this event
	//=====================================================================
	this.Unsubscribe = function Unsubscribe(objEventHandler)
	{
		if (objEventHandler == null)
			throw new Error("You must supply an EventHandler object to remove");

		if (typeof (objEventHandler) == "object")
		{
			if (!IsEventHandler(objEventHandler))
				throw new Error("argument must be an EventHandler object");
		}
		else
			throw new Error("You must supply either an EventHandler object to this method.");

		arrSubscribers[objEventHandler.Id] = null;
		objEventHandler.Id = null;
		objEventHandler.Event = null;
		return objEventHandler;
	}

	//=====================================================================
	// Is the passed argument an event handler object
	//=====================================================================
	function IsEventHandler(objEventHandler)
	{
		if (objEventHandler == null)
			throw new Error("Object reference not set to a reference on an object");

		if (objEventHandler.GetType() == "EventHandler")
			return true;

		return false;
	}

	//=====================================================================
	// Invoke this event
	//=====================================================================
	this.Invoke = function Invoke()
	{
		var strArguments = "";

		for (var intIndex = 0; intIndex < arguments.length; intIndex++)
		{
			if (strArguments != "")
				strArguments += ", ";

			strArguments += "arguments[" + intIndex + "]";
		}

		for (var intId in arrSubscribers)
		{
			var objEventHandler = arrSubscribers[intId];
			var fncCallback = objEventHandler.Callback;

			try
			{
				eval("fncCallback(" + strArguments + ")");
			}
			catch (exc)
			{
				HtmlPopup.Error(exc);
			}
		}
	}
}

function EventHandler(fncCallback)
{
	this.Callback = fncCallback;
	this.Id = null;
	this.Event = null;

	//=====================================================================
	// Return a string representing the type of this object
	//=====================================================================
	this.GetType = function GetType()
	{
		return "EventHandler";
	}
}
