'use strict'; var domQuery = require('min-dom').query, domClasses = require('min-dom').classes, domify = require('min-dom').domify, bind = require('lodash/bind'); /** * @class * @constructor */ function Popup(options) { options = options || {}; this.template = options.template || this.template; var el = this.el = domify(this.template); this.header = domQuery('.popup-header', el); this.body = domQuery('.popup-body', el); this.footer = domQuery('.popup-footer', el); document.body.appendChild(el); this._attachEvents(); } Popup.prototype.template = '
' + '
' + '' + '
'; Popup.prototype._attachEvents = function() { var self = this; var events = this.events; var el = this.el; Object.keys(events).forEach(function(instruction) { var cb = bind(self[events[instruction]], self); var parts = instruction.split(' '); var evtName = parts.shift(); var target = parts.length ? parts.shift() : false; target = target ? domQuery(target, el) : el; if (!target) { return; } target.addEventListener(evtName, cb); }); }; Popup.prototype._detachEvents = function() { var self = this; var events = this.events; var el = this.el; Object.keys(events).forEach(function(instruction) { var cb = bind(self[events[instruction]], self); var parts = instruction.split(' '); var evtName = parts.shift(); var target = parts.length ? parts.shift() : false; target = target ? domQuery(target, el) : el; if (!target) { return; } target.removeEventListener(evtName, cb); }); }; Popup.prototype.events = { // 'keydown:esc': '_handleClose', 'click .underlay': '_handleClose', 'click .popup-close': '_handleClose' }; Popup.prototype._handleClose = function(evt) { this.close(); }; Popup.prototype.open = function(content) { domClasses(this.el).add('open'); }; Popup.prototype.close = function() { domClasses(this.el).remove('open'); }; Popup.prototype.remove = function() { this._detachEvents(); if (document.body.contains(this.el)) { document.body.removeChild(this.el); } }; var popup; module.exports = function() { if (!popup) { popup = new Popup(); } return popup; };