+/**
+ * rcmail objects event interface
+ */
+function rcube_event_engine()
+{
+ this._events = {};
+};
+
+rcube_event_engine.prototype = {
+
+/**
+ * Setter for object event handlers
+ *
+ * @param {String} Event name
+ * @param {Function} Handler function
+ * @return Listener ID (used to remove this handler later on)
+ */
+addEventListener: function(evt, func, obj)
+{
+ if (!this._events)
+ this._events = {};
+ if (!this._events[evt])
+ this._events[evt] = [];
+
+ var e = {func:func, obj:obj ? obj : window};
+ this._events[evt][this._events[evt].length] = e;
+},
+
+/**
+ * Removes a specific event listener
+ *
+ * @param {String} Event name
+ * @param {Int} Listener ID to remove
+ */
+removeEventListener: function(evt, func, obj)
+{
+ if (obj === undefined)
+ obj = window;
+
+ for (var h,i=0; this._events && this._events[evt] && i < this._events[evt].length; i++)
+ if ((h = this._events[evt][i]) && h.func == func && h.obj == obj)
+ this._events[evt][i] = null;
+},
+
+/**
+ * This will execute all registered event handlers
+ *
+ * @param {String} Event to trigger
+ * @param {Object} Event object/arguments
+ */
+triggerEvent: function(evt, e)
+{
+ var ret, h;
+ if (e === undefined)
+ e = this;
+ else if (typeof e === 'object')
+ e.event = evt;
+
+ if (this._events && this._events[evt] && !this._event_exec) {
+ this._event_exec = true;
+ for (var i=0; i < this._events[evt].length; i++) {
+ if ((h = this._events[evt][i])) {
+ if (typeof h.func === 'function')
+ ret = h.func.call ? h.func.call(h.obj, e) : h.func(e);
+ else if (typeof h.obj[h.func] === 'function')
+ ret = h.obj[h.func](e);
+
+ // cancel event execution
+ if (ret !== undefined && !ret)
+ break;
+ }
+ }
+ if (ret && ret.event) {
+ try {
+ delete ret.event;
+ } catch (err) {
+ // IE6-7 doesn't support deleting HTMLFormElement attributes (#1488017)
+ $(ret).removeAttr('event');
+ }
+ }
+ }
+
+ this._event_exec = false;
+ if (e.event) {
+ try {
+ delete e.event;
+ } catch (err) {
+ // IE6-7 doesn't support deleting HTMLFormElement attributes (#1488017)
+ $(e).removeAttr('event');
+ }
+ }
+
+ return ret;
+}
+
+}; // end rcube_event_engine.prototype
+