'use strict'; var EventElement = function (element) { this.element = element; this.events = {}; }; EventElement.prototype.bind = function (eventName, handler) { if (typeof this.events[eventName] === 'undefined') { this.events[eventName] = []; } this.events[eventName].push(handler); this.element.addEventListener(eventName, handler, false); }; EventElement.prototype.unbind = function (eventName, handler) { var isHandlerProvided = (typeof handler !== 'undefined'); this.events[eventName] = this.events[eventName].filter(function (hdlr) { if (isHandlerProvided && hdlr !== handler) { return true; } this.element.removeEventListener(eventName, hdlr, false); return false; }, this); }; EventElement.prototype.unbindAll = function () { for (var name in this.events) { this.unbind(name); } }; var EventManager = function () { this.eventElements = []; }; EventManager.prototype.eventElement = function (element) { var ee = this.eventElements.filter(function (eventElement) { return eventElement.element === element; })[0]; if (typeof ee === 'undefined') { ee = new EventElement(element); this.eventElements.push(ee); } return ee; }; EventManager.prototype.bind = function (element, eventName, handler) { this.eventElement(element).bind(eventName, handler); }; EventManager.prototype.unbind = function (element, eventName, handler) { this.eventElement(element).unbind(eventName, handler); }; EventManager.prototype.unbindAll = function () { for (var i = 0; i < this.eventElements.length; i++) { this.eventElements[i].unbindAll(); } }; EventManager.prototype.once = function (element, eventName, handler) { var ee = this.eventElement(element); var onceHandler = function (e) { ee.unbind(eventName, onceHandler); handler(e); }; ee.bind(eventName, onceHandler); }; module.exports = EventManager;