code: function (/*HTMLElement*/ obj, /*String*/ type, /*Function*/ fn, /*Object*/ context) {
  		var id = TL.Util.stamp(fn),
  			key = '_tl_' + type + id;
  
  		if (obj[key]) {
  			return;
  		}
  
  		var handler = function (e) {
  			return fn.call(context || obj, e || TL.DomEvent._getEvent());
  		};
  
  		if (TL.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) {
  			this.addDoubleTapListener(obj, handler, id);
  		} else if ('addEventListener' in obj) {
  			if (type === 'mousewheel') {
  				obj.addEventListener('DOMMouseScroll', handler, false);
  				obj.addEventListener(type, handler, false);
  			} else if ((type === 'mouseenter') || (type === 'mouseleave')) {
  				var originalHandler = handler,
  					newType = (type === 'mouseenter' ? 'mouseover' : 'mouseout');
  				handler = function (e) {
  					if (!TL.DomEvent._checkMouse(obj, e)) {
  						return;
  					}
  					return originalHandler(e);
  				};
  				obj.addEventListener(newType, handler, false);
  			} else {
  				obj.addEventListener(type, handler, false);
  			}
  		} else if ('attachEvent' in obj) {
  			obj.attachEvent("on" + type, handler);
  		}
  
  		obj[key] = handler;
  	}
docs: /* inpired by John Resig, Dean Edwards and YUI addEvent implementations