/* 
 * system.events.js 
 * version 1.0.5
 * Copyright (C) 2006-2007 Jason Mingl (Ratheous)
 
 Dependencies:
 	system.tools.js

 *	05/20/2007 : 1.0.5 - Added check for evt variable validity in stop()
 *	04/15/2007 : 1.0.4 - Modified system.events.add, system.events.cache.add, system.events.invoke et. al.
 						 Added system.events.remove
 *	04/08/2007 : 1.0.3 - Added system.events.invoke
 *	03/04/2007 : 1.0.2 - Added add_by_type function
 *	03/03/2007 : 1.0.1 - Added event translate function
 *	??/??/2006 : 1.0.0 - Initial release
 */

if(typeof system != "object")
	var system = new Object;
if(typeof system.events != "object")
	system.events = new Object;

system.events.cache = new Object;
system.events.cache.event_list = [];

system.events.cache.add = function(element, type, handler)
{
	system.events.cache.event_list.push(arguments);
	return arguments;
};

system.events.cache.flush = function()
{
	var itm;

	for(var i = system.events.cache.event_list.length - 1; i >= 0; i--)
	{
		itm = system.events.cache.event_list[i];
		if(itm[0].removeEventListener) itm[0].removeEventListener(itm[1], itm[2], itm[3]);
		if(itm[1].substring(0, 2) != "on") itm[1] = "on" + itm[1];
		if(itm[0].detachEvent) itm[0].detachEvent(itm[1], itm[2]);
		itm[0][itm[1]] = null;
	}
};

system.events.add = function(element, type, handler)
{
	try
	{
		if(element.addEventListener)
		{
			element.addEventListener(type, handler, false);
			return system.events.cache.add(element, type, handler);
		}
		else if(element.attachEvent)
		{
			element["e" + type + handler] = handler;
			element[type + handler] = function() { element["e" + type + handler](window.event); };
			element.attachEvent("on" + type, element[type + handler]);
			return system.events.cache.add(element, type, handler);
		}
	}
	catch(e)
	{
		//alert(e + " " + typeof element);
	}
};

system.events.add_by_type = function(root, element, evttype, handler)
{
	var itms = root.getElementsByTagName(element);
	var e = [];
	for(var i = 0; i < itms.length; i++)
		e.push(system.events.add(itms[i], evttype, handler));
	return e;
};

system.events.remove = function(evt)
{
	if(evt[0].removeEventListener) evt[0].removeEventListener(evt[1], evt[2], evt[3]);
	if(evt[1].substring(0, 2) != "on") evt[1] = "on" + evt[1];
	if(evt[0].detachEvent) evt[0].detachEvent(evt[1], evt[2]);
};

system.events.prevent_default = function(evt)
{
	if(evt.preventDefault) evt.preventDefault()
	else event.returnValue = false;
};

system.events.halt = function(evt)
{
	if(!evt) return;
	if(evt.stopPropagation) evt.stopPropagation()
	else event.cancelBubble = true;
	if(evt.preventDefault) evt.preventDefault()
	else event.returnValue = false;
};

system.events.translate = function(e)
{
	var evt = new Object;
	try
	{
		var crap = system.tools.is_ie();
		evt.target = crap ? window.event.srcElement : e.target;
		evt.event = crap ? window.event : e;
		evt.type = crap ? window.event.type : e.type;
		evt.layer_x = crap ? window.event.offsetX : e.layerX;
		evt.layer_y = crap ? window.event.offsetY : e.layerY;
		evt.page_x = crap ? window.event.x : e.pageX;
		evt.page_y = crap ? window.event.y : e.pageY;
		evt.screen_x = crap ? window.event.screenX : e.screenX;
		evt.screen_y = crap ? window.event.screenY : e.screenY;
		evt.key = crap ? window.event.keyCode : e.which;
		evt.button = crap ? window.event.button : e.which;
		evt.shift_key = crap ? window.event.shiftKey : e.modifiers | Event.SHIFT_MASK;
		evt.ctrl_key = crap ? window.event.ctrlKey : e.modifiers | Event.ALT_MASK;
		evt.alt_key = crap ? window.event.altKey : e.modifiers | Event.ALT_MASK;
		evt.translated = true;
	}
	catch(e){}
	return evt;
};

system.events.invoke = function(obj, observer, args) { return function() {  observer.apply(obj, args); }; };

system.events.add(window, "unload", system.events.cache.flush);
