﻿var History = (function()
{
	var listeners = new Object();
	
	var constructor = {
		// Return void
		addEventListener: function(type, listener)
		{
			// Remove same listener for same type
			this.removeEventListener(type, listener);
			
			// Add new event type if not exist
			if(!listeners[type])
				listeners[type] = new Array();
			// Add listener for type
			listeners[type].push(listener);
		},
		// Return void
		removeEventListener: function(type, listener)
		{
			if(listeners[type])
				for (var i = 0; i < listeners[type].length; i++)
				{
					if(listeners[type][i] === listener)
					{
						listeners[type].splice(i, 1);
						break;
					}
				}
		},
		// Return void
		dispatchEvent: function(event)
		{
			var type = event.getType();
			if(listeners[type])
				for (var i = 0; i < listeners[type].length; i++)
					listeners[type][i](event);
		},
		// Return Boolean
		hasEventListener: function(type)
		{
			if(listeners[type])
				if(listeners[type].length > 0)
					return true;
			// Else
			return false;
		},
		// Return Boolean
		willTrigger: function(type)
		{
			return this.hasEventListener(type);
		},
		// Return String
		getResourceIdentifier: function()
		{
			return SWFAddress.getValue();
		},
		// Return void
		setResourceIdentifier: function(newData)
		{
			SWFAddress.setValue(newData);
		},
		// Return void
		back: function()
		{
			SWFAddress.back();
		},
		// Return void
		forward: function()
		{
			SWFAddress.forward();
		},
		// Return void
		go: function(delta)
		{
			SWFAddress.go(delta);
		},
		// Return Number (uint)
		getLength: function()
		{
			return NaN;
		}
	}
	
	function dispatchChangeEvent(event)
	{
		constructor.dispatchEvent(new HistoryEvent(HistoryEvent.HISTORY_CHANGE, constructor, event.value));
	};
	
	SWFAddress.addEventListener(SWFAddressEvent.CHANGE, dispatchChangeEvent);
	
	// Public static
	return constructor;
})();