/*
 * Event class
 * ===========
 * Author: Barak Ulmann, dreamer_yet@hotmail.com
 * Description: global add event handler function
 * based on the DynLayer technology. learn more about the DynDuo and cross-browser dhtml in:
 * http://www.dansteinman.com/dynduo/
 * Last Updated: June 20th 2004
 *
 * IMPORTANT! the addEventHandler function overwrites the event handler. if it was already
 * set then the it 'older' event handler is appended. however if event handler was defined
 * as in the following example (IE allowable syntax):
 *		function document.onclick()
 *		{
 *			// do something
 *		}
 * a runtime error 'stack overflow' or worse an ilegal recursive call will be generated.
 * this could be avoided by using one of the following common event handler definitions:
 *		document.onclick = new Function(...) or
 *		document.onclick = func
 */

function Event() {}

function EventAddEventHandler(
	eventRef	// reference to event handler
	,handler	// a function or string to be added to event handler
	,pos		// an ineger indicating the order of evaluation.
				//	 -1: call new handler before evaluating current handler
				//	  0: new handler replaces current handler
				//    1: call new handler after current handler evaluated
	)
{
	if (typeof(handler) != 'string' && typeof(handler) != 'function') return
	if (arguments.length == 3 && isNaN(pos)) return
	
	var param = '', eventStr, parsedEventObj, parsedHandlerObj
	
	if (typeof(handler) == 'function') // parse function
		parsedHandlerObj = new Event.parseFunction(handler)
	
	if (eventRef && (typeof(eventRef) == 'object' || typeof(eventRef) == 'function') && pos) {
		// parse event handler
		parsedEventObj = new Event.parseFunction(eventRef)
		param = parsedEventObj.arguments
		if (parsedEventObj.name != 'anonymous')
			eventStr = parsedEventObj.name + '(' + param + ')'
		else
			eventStr = parsedEventObj.body
		if (typeof(handler) == 'function') {
			if (param.length == 0) param = parsedHandlerObj.arguments
			if (parsedHandlerObj.name != 'anonymous')
				handler = parsedHandlerObj.name + '(' + param + ')'
			else
				handler = parsedHandlerObj.body
		}
		
		handler = pos > 0? eventStr + '\n' + handler: handler + '\n' + eventStr
	}
	else if (typeof(handler) == 'function') {
		param = parsedHandlerObj.arguments
		if (parsedHandlerObj.name != 'anonymous')
			handler = parsedHandlerObj.name + '(' + param + ')'
		else
			handler = parsedHandlerObj.body
	}
	
	return new Function(param,handler)
}
Event.addEventHandler = EventAddEventHandler

function EventParseFunction(funcRef)
{
	var funcStr = funcRef.toString()
	this.name = funcStr.replace(/^(\s*function\s+)(\w+)([\s\S]+)$/,'$2')
	this.arguments = funcStr.replace(/^(\s*function\s+\w+\s*\()(\w*)([\s\S]+)$/,'$2')
	this.body = funcStr.substring(funcStr.indexOf('{') + 1, funcStr.lastIndexOf('}')).replace(/^\s+/,'').replace(/\s+$/,'')
}
Event.parseFunction = EventParseFunction

function addEvent(elm, evType, fn, useCapture)
// addEvent and removeEvent
// cross-browser event handling for IE5+,  NS6 and Mozilla
// By Scott Andrew
{
  if (elm.addEventListener){
    elm.addEventListener(evType, fn, useCapture);
    return true;
  } else if (elm.attachEvent){
    var r = elm.attachEvent("on"+evType, fn);
    return r;
  } else {
    alert("Handler could not be removed");
  }
}
