mindplot.Events = new Class({ $events: {}, _removeOn: function(string){ return string.replace(/^on([A-Z])/, function(full, first){ return first.toLowerCase(); }); }, addEvent: function(type, fn, internal){ type = this._removeOn(type); this.$events[type] = (this.$events[type] || []).include(fn); if (internal) fn.internal = true; return this; }, fireEvent: function(type, args, delay){ type = this._removeOn(type); var events = this.$events[type]; if (!events) return this; args = Array.from(args); _.each(events, function(fn){ if (delay) fn.delay(delay, this, args); else fn.apply(this, args); }, this); return this; }, removeEvent: function(type, fn){ type = this._removeOn(type); var events = this.$events[type]; if (events && !fn.internal){ var index = events.indexOf(fn); if (index != -1) events.splice(index, 1); } return this; } });