// Code from John Resig's wining submission to the QuirksMode.org addevent recoding contest// Links://     http://ejohn.org/projects/flexible-javascript-events///     http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.htmlfunction addEvent( obj, type, fn ){	if (obj.addEventListener)		obj.addEventListener( type, fn, false );	else if (obj.attachEvent) {		obj["e"+type+fn] = fn;		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }		obj.attachEvent( "on"+type, obj[type+fn] );	}}function removeEvent( obj, type, fn ){	if (obj.removeEventListener)		obj.removeEventListener( type, fn, false );	else if (obj.detachEvent) {		obj.detachEvent( "on"+type, obj[type+fn] );		obj[type+fn] = null;		obj["e"+type+fn] = null;	}}// Code from QuirksMode.org// http://www.quirksmode.org/js/events_properties.html// http://www.quirksmode.org/js/events_order.htmlfunction getEventSource(e,findNode){	var source;		// Resolve event object	if (!e) var e = window.event;	e.cancelBubble = true;	if (e.stopPropagation) e.stopPropagation();		// Resolve event source (target element)	if (e.target) source = e.target;	else if (e.srcElement) source = e.srcElement;	if (source.nodeType == 3) // defeat Safari bug		source = source.parentNode;		// Climb to desired node	while (findNode && source.nodeName != findNode)		source = source.parentNode;		// Return event source (target element)	return(source);}