rem: if (event.eventName && event.eventName != eventName) return false; 
add: if (!Event || !Event.extend || (event.eventName && event.eventName != eventName)) return false; 
context: Object.extend(Event, (function() {  var cache = Event.cache;    function getEventID(element) {    if (element._eventID) return element._eventID;    arguments.callee.id = arguments.callee.id || 1;    return element._eventID = ++arguments.callee.id;  }    function getDOMEventName(eventName) {    if (eventName && eventName.match(/:/)) return "dataavailable";    return eventName;  }    function getCacheForID(id) {    return cache[id] = cache[id] || { };  }    function getWrappersForEventName(id, eventName) {    var c = getCacheForID(id);    return c[eventName] = c[eventName] || [];  }    function createWrapper(element, eventName, handler) {    var id = getEventID(element);    var c = getWrappersForEventName(id, eventName);    if (c.pluck("handler").include(handler)) return false;        var wrapper = function(event) {      if (event.eventName && event.eventName != eventName)        return false;            Event.extend(event);      handler.call(element, event)    };        wrapper.handler = handler;    c.push(wrapper);    return wrapper;  }    function findWrapper(id, eventName, handler) {    var c = getWrappersForEventName(id, eventName);    return c.find(function(wrapper) { return wrapper.handler == handler });  }    function destroyWrapper(id, eventName, handler) {    var c = getCacheForID(id);    if (!c[eventName]) return false;    c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));  }    function destroyCache() {    for (var id in cache)      for (var eventName in cache[id])        cache[id][eventName] = null;  }    if (window.attachEvent) {    window.attachEvent("onunload", destroyCache);  }    return {    observe: function(element, eventName, handler) {      element = $(element);      var name = getDOMEventName(eventName);            var wrapper = createWrapper(element, eventName, handler);      if (!wrapper) return element;            if (element.addEventListener) {        element.addEventListener(name, wrapper, false);      } else {        element.attachEvent("on" + name, wrapper);      }            return element;    },      stopObserving: function(element, eventName, handler) {      element = $(element);      var id = getEventID(element), name = getDOMEventName(eventName);            if (!handler && eventName) {        getWrappersForEventName(id, eventName).each(function(wrapper) {          element.stopObserving(eventName, wrapper.handler);        });        return element;              } else if (!eventName) {        Object.keys(getCacheForID(id)).each(function(eventName) {          element.stopObserving(eventName);        });        return element;      }            var wrapper = findWrapper(id, eventName, handler);      if (!wrapper) return element;            if (element.removeEventListener) {        element.removeEventListener(name, wrapper, false);      } else {        element.detachEvent("on" + name, wrapper);      }            destroyWrapper(id, eventName, handler);            return element;    },      fire: function(element, eventName, memo) {      element = $(element);      if (element == document && document.createEvent && !element.dispatchEvent)        element = document.documentElement;              if (document.createEvent) {        var event = document.createEvent("HTMLEvents");        event.initEvent("dataavailable", true, true);      } else {        var event = document.createEventObject();        event.eventType = "ondataavailable";      }      event.eventName = eventName;      event.memo = memo || { };      if (document.createEvent) {        element.dispatchEvent(event);      } else {        element.fireEvent(event.eventType, event);      }      return event;    }  };})());
meta: 3332	/local1/tlutelli/issta_data/temp/all_js/javascript/2007_temp/2007/3332/827c8c6b488630d937bfe575db6ff571260fd1c2/event.js/buggy/src/event.js