if (!Element.addMethods) Element.addMethods = function(o) { Object.extend(Element.Methods, o) }; // Extend Element with observe and stopObserving. Element.addMethods({ observe : function(el, event, callback) { Event.observe(el, event, callback); }, stopObserving : function(el, event, callback) { Event.stopObserving(el, event, callback); } }); // Replace out existing event observe code with Dean Edwards' addEvent // http://dean.edwards.name/weblog/2005/10/add-event/ Object.extend(Event, { observe : function(el, type, func) { el = $(el); if (!func.$$guid) func.$$guid = Event._guid++; if (!el.events) el.events = {}; var handlers = el.events[type]; if (!handlers) { handlers = el.events[type] = {}; if (el["on" + type]) { handlers[0] = el["on" + type]; } } handlers[func.$$guid] = func; el["on" + type] = Event._handleEvent; if (!Event.observers) Event.observers = []; Event.observers.push([el, name, func, false]); }, stopObserving : function(el, type, func) { if (el.events && el.events[type]) delete el.events[type][func.$$guid]; }, _handleEvent : function(e) { var returnValue = true; e = e || Event._fixEvent(window.event); var handlers = this.events[e.type], el = $(this); for (var i in handlers) { el.$$handleEvent = handlers[i]; if (el.$$handleEvent(e) === false) returnValue = false; } return returnValue; }, _fixEvent : function(e) { e.preventDefault = Event._preventDefault; e.stopPropagation = Event._stopPropagation; return e; }, _preventDefault : function() { this.returnValue = false }, _stopPropagation : function() { this.cancelBubble = true }, _guid : 1 }); // Allows you to trigger an event element. Object.extend(Event, { trigger : function(element, event, fakeEvent) { element = $(element); fakeEvent = fakeEvent || { type : event }; this.observers.each(function(cache) { if (cache[0] == element && cache[1] == event) cache[2].call(element, fakeEvent); }); } });