	// Function used for attach event handler if it is a class method ('this' in this case points to class object, not event object)
	function makeDelegate( oObject, oMethod ) 
	{
		var 
			f = function( )
			{
				f.Method.call( f.Object );
			};

		f.Object = oObject;
		f.Method = oMethod;

		return f;
	}

	// function find parent node with corresponding tag
	function findParent( oNode, sTag )
	{
		if( !oNode || !oNode.tagName )
			return null;

		if( oNode.tagName.toLowerCase( ) == sTag.toLowerCase( ) )
			return oNode;
		else
		{
			return ( oNode.parentNode ? findParent( oNode.parentNode, sTag ) : null );
		}
	}

	function inArray( oArray, oElement )
	{
		for( var key in oArray )
		{
			if( oArray[ key ] == oElement )
			{
				return true;
			}
		}
		return false;
	}
	

	// Global Event Handling functions
	isIE = ( /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent) );
	
	// global function to be used instead of element.attachEvent function
	function addEvent(el, evname, func) 
	 {
		if (el.attachEvent) { // IE
			el.attachEvent("on" + evname, func);
		} else if (el.addEventListener) { // Gecko / W3C
			el.addEventListener(evname, func, true);
		} else {
			el["on" + evname] = func;
		}
	}
	
	function getEventElement(ev) 
	{
		return isIE ? window.event.srcElement : ev.currentTarget;
	} 

	function cancelEvent(ev) {
		ev || (ev = window.event);
		if (isIE) {
			ev.cancelBubble = true;
		} else {
			ev.stopPropagation();
		}
	}
	
	function stopEvent(ev) {
		ev || (ev = window.event);
		if (isIE) {
			ev.cancelBubble = true;
			ev.returnValue = false;
		} else {
			ev.preventDefault();
			ev.stopPropagation();
		}
		return false;
	}
