/////////////////////////////////////////////////////
//	NEvent object
//
function NEvent()
{
	//	Runtime type information
	this.InitializeRuntimeTypeInfo(NEvent.prototype);
	//	Call the base type constructor
	this.NObject();

	//	Operarations
	NEvent.prototype.Subscribe = function(subscriber)
	{
		for(var i = 0; i < this.subscribers.length; i++)
			if(String(this.subscribers[i]) == String(subscriber))
				return;

		this.subscribers.push(subscriber);
	}

	NEvent.prototype.Unsubscribe = function(subscriber)
	{
		var subscribersCopy = new Array();
		for(var i = 0; i < this.subscribers.length; i++)
		{
			if(String(this.subscribers[i]) == String(subscriber))
				continue;
			subscribersCopy.push(this.subscribers[i]);
		}
		this.subscribers = subscribersCopy;
	}

	NEvent.prototype.Fire = function()
	{
		var cancelBubbling = false;
		var subscribersCopy = new Array();
		for(var j = 0; j < this.subscribers.length; j++)
		{
			if(!NReflection.IsInstance(this.subscribers[j]))
				continue;
			subscribersCopy.push(this.subscribers[j]);
		}
			
		for(var i = 0; i < subscribersCopy.length; i++)
		{
			var result = subscribersCopy[i](arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9]);
			if(!NReflection.IsOfType(result, Type_Bool))
				continue;
			if(result)
				cancelBubbling = true;
		}
		return cancelBubbling;
	}

	//	Fields
	this.length += 1;
	this.subscribers = new Array;
}
//	Inheritance
NEvent.DeriveFrom(NObject);
