var Cathmhaol = window.Cathmhaol || {};

/**
* Creates an event handler mechanism
*
* @author	Robert King (hrobertking@cathmhaol.com)
*
* @example	var oBehaviorHandler = new Cathmhaol.EventHandler(); oBehaviorHandler.add(document.getElementById("clicker"), "click", clicker_onClick);
*/
Cathmhaol.EventHandler = function() {
	/**
	* @method	Adds an event handler to an object
	* @returns	{void}
	* @argument	{node} obj
	* @argument	{string} evt
	* @argument	{string|function} handler
	*/
	this.add = function(obj, evt, handler) {
		me.handler = handler;
		var objCurrentHandler = eval("obj.on"+evt.toLowerCase());
		if (objCurrentHandler) {
			_c(objCurrentHandler, handler);
		}
		if (typeof me.handler == "string") { me.handler = new Function(me.handler); }
		if (obj.addEventListener) {
			obj.addEventListener(evt.toLowerCase(), me.handler, false);
		} else if (obj.attachEvent) {
			eval("obj.on"+evt.toLowerCase()+"="+me.handler);
		}
	};

	/**
	* @private
	* @method	This translates the anonymous function declared by a string back to a string
	* @returns	{string}
	* @argument	{string} f
	*/
	function _a(f) {
		var r = f.replace(/function\sanonymous\(\)\s\{\n?/, "");
		r = r.substr(0, r.length);
		return r;
	}

	/**
	* @private
	* @method	Adds the new event handler to existing handlers
	* @returns	{void}
	* @argument	{function} existingFunction
	* @argument	{function} newFunction
	*/
	function _c(e, f) {
		var objf;
		switch(typeof e) {
			case "string":
				switch (typeof f) {
					case "string":
						me.handler = new Function(e + "; "+f);
						break;
					case "function":
						me.handler = new Function(e + "; " + _n(f.toString()) + "();");
						break;
				}
				break;
			case "function":
				switch (typeof f) {
					case "string":
						me.handler = new Function(_a(e.toString()) + f);
						break;
					case "function":
						me.handler = new Function(_a(e.toString()) + _n(f.toString()) + "();");
						break;
				}
				break;
			default:
				switch (typeof f) {
					case "string":
						me.handler = new Function(f);
						break;
					case "function":
						me.handler = f;
						break;
				}
				break;
		}
	}

	/**
	* @private
	* @method	This translates the named function into a string
	* @returns	{string}
	* @argument	{string} f
	*/
	function _n(f) {
		var r = f.replace(/function\s/, "");
		r = r.substring(0, r.indexOf("("));
		return r;
	}

	var me = this;
};

