/* prototype.js with mouse wheel event.
 * MIT license.
 *
 * gorou <hotchpotch(at)gmail.com>
 * http://rails2u.com/
 */
Event.__observe__ = Event.observe;
Event.__stopObserving__ = Event.stopObserving;

Object.extend(Event, {
  unloadCache: function() {
    if (!Event.observers) return;
    for (var i = 0; i < Event.observers.length; i++) {
      Event.__stopObserving__.apply(this, Event.observers[i]);
      Event.observers[i][0] = null;
    }
    Event.observers = false;
  },

  observe: function(element, name, observer, useCapture) {
    if (name == 'mousewheel') {
      var element = $(element);
      useCapture = useCapture || false;
    
      if (element.addEventListener)
        name = 'DOMMouseScroll';

      var _observer = observer;
      observer.__wheel_event__ = (function(event) {
        var wheel_count = event.wheelDelta?
          (event.wheelDelta > 0 ? 1 : -1) : // IE, safari
          (event.detail > 0 ? -1 : 1);    // Firefox
        _observer(element, wheel_count);
        event.preventDefault ? 
          event.preventDefault() : (event.returnValue = false);
      }).bindAsEventListener(this);
      observer = observer.__wheel_event__;
      observer.__wheel_event__ = observer;

      if (navigator.appVersion.match(/Konqueror|Safari|KHTML/)) {
        // safari
        element.onmousewheel = observer;
      }else{
        //this._observeAndCache(element, name, observer, useCapture);
        this.__observe__(element, name, observer, useCapture);
      }
    }else{
      this.__observe__(element, name, observer, useCapture);
    }
  },

  stopObserving: function(element, name, observer, useCapture) {
    if (name == 'mousewheel') {
      var element = $(element);
      if (navigator.appVersion.match(/Konqueror|Safari|KHTML/)) {
        // safari
        element.onmousewheel = null;
      }else{
        useCapture = useCapture || false;

        if (element.addEventListener)
          name = 'DOMMouseScroll';
        observer = observer.__wheel_event__;

        if (element.removeEventListener) {
          element.removeEventListener(name, observer, useCapture);
        } else if (element.detachEvent) {
          element.detachEvent('on' + name, observer);
        }
      }
    }else{
      this.__stopObserving__(element, name, observer, useCapture);
    }
  }
});
