if (!Prototype.Browser.IE) {
  var MouseenterMouseleave = {
	cache: {enter: [], leave: []},
	attach: function(type, element, observer, useCapture) {
	  var wrapped = function(event) {
	  	if (!event.relatedTarget) {
	  		observer();
	  	} else {
			if (event.relatedTarget==event.currentTarget || event.relatedTarget.childOf(event.currentTarget)) return;
			observer();
		}
	  };
	  element.observe('mouse'+(type=='enter'?'over':'out'), wrapped, useCapture);
	  this.cache[type].push({e:element, o:observer, w:wrapped});
	},
	detach: function(type, element, observer, useCapture) {
	  var cached = this.cache[type].find(function(obj) {
		return obj.e==element && obj.o==observer;
	  });
	  if (cached) {
		element.stopObserving('mouse'+(type=='enter'?'over':'out'), cached.w, useCapture);
		this.cache[type] = this.cache[type].without(cached);
	  }
	}
  };
}
/* Sample unobtrusive custom event handler */
(function() {
	function wheel(event) {
		var realDelta;
		// normalize the delta
		if (event.wheelDelta) // IE & Opera
			realDelta = event.wheelDelta / 120;
		else if (event.detail) // W3C
			realDelta = -event.detail / 3;

		if (!realDelta) return;

		var customEvent = event.element().fire("mouse:wheel", {
			delta: realDelta });

		if (customEvent.stopped) event.stop();
	}
	document.observe("mousewheel",     wheel);
	document.observe("DOMMouseScroll", wheel);
})();
