/**
** PS v.1.0.2
**/

var EventHandler = (function () {
	
	var __$eventHandler = function ($event) {
		
		// declare variables
		var $currentReturnValue, $handlers, $returnValue = true;
		// get the event object
		if ((!$event)) $event = __$$fixEvent (window.event);
		// fetch the lookup table of the event handlers
		$handlers = this.__$$events [$event.type];
		// execute each event handler
		for (var $i = 0; $i < $handlers.length; ++$i) {
			this.__$$eventHandler = $handlers [$i];
			// if event handler exists
			if ((this.__$$eventHandler)) {
				$currentReturnValue = this.__$$eventHandler ($event);
				// if event canceled
				if ((typeof $currentReturnValue == 'boolean') && (!$currentReturnValue)) {
					$returnValue = false;
				}
			}
		}
		
		return $returnValue;
	};
	
	var __$$fixEvent = function ($event) {
		
		// add W3C standard event attributes
		if ((!$event.pageX)) $event.pageX = $event.clientX + (document.documentElement || document.body).scrollLeft;
		if ((!$event.pageY)) $event.pageY = $event.clientY + (document.documentElement || document.body).scrollTop;
		if ((!$event.target)) $event.target = $event.srcElement;
		
		// add W3C standard event methods
		if ((!$event.preventDefault)) $event.preventDefault = __$$preventDefault;
		if ((!$event.stopPropagation)) $event.stopPropagation = __$$stopPropagation;
		
		return $event;
	};
	
	var __$$preventDefault = function () {
		this.returnValue = false;
	};
	
	var __$$stopPropagation = function () {
		this.cancelBubble = true;
	};
	
	var __$$object = {
		addEvent	: function ($element, $type, $handler) {
			
			// create a lookup table of the event types for the element
			if ((!$element.__$$events)) $element.__$$events = {};
			// create a lookup table of the event handlers for each event type for the element
			if ((!$element.__$$events [$type])) $element.__$$events [$type] = [];
			// assign a generic event handler to do the work
			if ((!$element ['on' + $type])) $element ['on' + $type] = __$eventHandler;
			// assign each event handler a unique id number based on event type
			if ((typeof $handler.__$$guid != 'number')) $handler.__$$guid = $element.__$$events [$type].length;
			// store event handler in the lookup table
			$element.__$$events [$type][$handler.__$$guid] = $handler;
		},
		removeEvent	: function ($element, $type, $handler) {
			
			// delete the event handler from the lookup table
			if (($element.__$$events) && ($element.__$$events [$type])) {
				$element.__$$events [$type][$handler.__$$guid] = null;
			}
		}
	};
	
	// return object
	return __$$object;
}) ();
