//-------------------------------
// * Xythe Studios *
// * Coded by Rob Kleffner (Cyborg) *
// * Started: 3/18/2010 *
// * Last updated: 4/21/2010 *
//-------------------------------
// This file contains a class that
// helps manage event listeners.
// Makes creating events cross-browser
// compatible and simple!
//-------------------------------

//-------------------------------
// * EventMan *
//-------------------------------
// This class provides many methods
// that make managing event listeners
// easier.
//-------------------------------
var EventMan = new Object()

//non-IE compatible
if (document.addEventListener)
{
	//-------------------------------
	// * AddEventListener(target, type, listener) *
	//-------------------------------
	// Adds an event listener to a specific element.
	//-------------------------------
	EventMan.AddEventListener = function(target, type, listener)
	{
		target.addEventListener(type, listener, false);	
	}
	
	//-------------------------------
	// * RemoveEventListener(target, type, listener) *
	//-------------------------------
	// Removes an event listener from the specified element.
	//-------------------------------
	EventMan.RemoveEventListener = function(target, type, listener)
	{
		target.addEventListener(type, listener, false);	
	}
	
	//-------------------------------
	// * PreventDefault(e) *
	//-------------------------------
	// Stops the default event from occuring.
	//-------------------------------
	EventMan.PreventDefault = function(e)
	{
		e.preventDefault();	
	}
	
	//-------------------------------
	// * StopPropogation(e) *
	//-------------------------------
	// Stops the default event from occuring.
	//-------------------------------
	EventMan.StopPropogation = function(e)
	{
		e.stopPropogation();	
	}
}
else if (document.attachEvent)
{
	//ie compatible
	
	//-------------------------------
	// * AddEventListener(target, type, listener) *
	//-------------------------------
	// Adds an event listener to a specific element.
	//-------------------------------
	EventMan.AddEventListener = function(target, type, listener)
	{
		//don't add the same listener twice
		if (EventMan.FindListener(target, type, listener) != -1)
			return;
		/*	
		var listener2 = function()
		{
			var event = window.event;
			
			if (Function.prototype.call)
			{
				listener.call(target, event);
			}
			else
			{
				target._currentListener = listener;
				target._currentListener(event);
				target._currentListener = null;
			}
		};
		
		//attach the listener2 event
		target.attachEvent("on" + type, listener2);
		
		//store the listener record for later
		var listenerRecord = new Object();
		listenerRecord.target = target;
		listenerRecord.type = type;
		listenerRecord.listener = listener;
		listenerRecord.listener2 = listener2;
		
		//get a reference to the window
		var targetDocument = target.document || target;
		var targetWindow = targetDocument.parentWindow;
		
		//create a unique id for the listener
		var listenerID = "l" + EventMan.ListenerCount++;
		
		//store a record of the listener
		if (!targetWindow._allListeners) target._allListeners = {};
		targetWindow._allListeners[listenerID] = listenerRecord;
		
		//store the listener's ID
		if (!target._listeners) target._listeners = [];
		target._listeners[target._listeners.length] = listenerID;
		
		//make sure all the listeners are deleted on unload call
		if (!targetWindow._unloadListenerAdded)
		{
			targetWindow._unloadListenerAdded = true;
			targetWindow.attachEvent("onunload", EventMan.RemoveAllListeners);
		}
		*/
		
		target.attachEvent("on" + type, listener);
	}
	
	//-------------------------------
	// * RemoveEventListener(target, type, listener) *
	//-------------------------------
	// Removes an event listener to a specific element.
	//-------------------------------
	EventMan.RemoveEventListener = function(target, type, listener)
	{
		var listenerIndex = EventMan.FindListener(target, type, listener);
		if (listenerIndex == -1)
			return;
			
		//get a reference to the window object
		var targetDocument = target.document || target;
		var targetWindow = targetDocument.parentWindow;
		
		//retrieve the listener record
		var listenerID = target._listeners[listenerIndex];
		var listenerRecord = targetWindow._allListeners[listenerID];
		
		//remove the listener and the id from the target
		target.detachEvent("on" + type, listenerRecord.listener2);
		target._listeners.splice(listenerIndex, 1);
		
		//remove the record of the listener, then we're done!
		delete targetWindow._allListeners[listenerID];
	}
	
	//-------------------------------
	// * FindEventListener(target, type, listener) *
	//-------------------------------
	// Checks to see if a certain listener is assigned to the target.
	//-------------------------------
	EventMan.FindListener = function(target, type, listener)
	{
		//the array of already existing listener functions on the target
		var listeners = target._listeners;
		if (!listeners) return -1;
		
		//reference to the window object
		var targetDocument = target.document || target;
		var targetWindow = targetDocument.parentWindow;
		
		for (var i = 0; i < listeners.length - 1; i++)
		{
			var listenerID = listeners[i];
			
			var listenerRecord = targetWindow._allListeners[listenerID];
			
			if (listenerRecord.type == type && listenerRecord.listener == listener)
			{
				return i;
			}
		}
		return -1;
	}
	
	//-------------------------------
	// * RemoveAllListeners() *
	//-------------------------------
	// Removes all event listeners on
	// the current page, from every
	// element.
	//-------------------------------
	EventMan.RemoveAllListeners = function()
	{
		var targetWindow = this;
		
		for (id in targetWindow)
		{
			var listenerRecord = targetWindow._allListeners[id];
			listenerRecord.target.detachEvent(
				"on" + listenerRecord.type, listenerRecord.listener2);
			delete targetWindow._allListeners[id];
		}
	}
	
	//-------------------------------
	// * PreventDefault(event) *
	//-------------------------------
	// Prevents the default processing
	// from happening when the event
	// is called.
	//-------------------------------
	EventMan.PreventDefault = function(event)
	{
		event.returnValue = false;
	}
	
	//-------------------------------
	// * StopPropogation(event) *
	//-------------------------------
	// Stops the event from being called
	// again.
	//-------------------------------
	EventMan.StopPropogation = function(event)
	{
		event.cancelBubble = true;
	}
	
	EventMan.ListenerCount = 0;
}
