diff --git a/js/popovers.js b/js/popovers.js index fe72ac788..852149b8c 100644 --- a/js/popovers.js +++ b/js/popovers.js @@ -10,6 +10,7 @@ 'use strict'; var popover; + var listener; var findPopovers = function (target) { var i; @@ -24,34 +25,36 @@ } }; + var hidePopover = function () { + popover.addEventListener('webkitTransitionEnd', (listener = onPopoverHidden)); + popover.classList.remove('visible'); + popover.parentNode.removeChild(backdrop); + }; + var onPopoverHidden = function () { popover.style.display = 'none'; - popover.removeEventListener('webkitTransitionEnd', onPopoverHidden); + listener = popover.removeEventListener('webkitTransitionEnd', onPopoverHidden); }; var backdrop = (function () { var element = document.createElement('div'); element.classList.add('backdrop'); - - element.addEventListener('touchend', function () { - popover.addEventListener('webkitTransitionEnd', onPopoverHidden); - popover.classList.remove('visible'); - popover.parentNode.removeChild(backdrop); - }); + element.addEventListener('touchend', hidePopover); + element.addEventListener('click', hidePopover); return element; }()); - var getPopover = function (e) { - var anchor = findPopovers(e.target); + var getPopover = function (e, id) { + var anchor = e && findPopovers(e.target); - if (!anchor || !anchor.hash || (anchor.hash.indexOf('/') > 0)) { + if ((!anchor || !anchor.hash || (anchor.hash.indexOf('/') > 0)) && !id) { return; } try { - popover = document.querySelector(anchor.hash); + popover = document.querySelector(id || anchor.hash); } catch (error) { popover = null; @@ -68,13 +71,17 @@ return popover; }; - var showHidePopover = function (e) { - var popover = getPopover(e); + var showHidePopover = function (e, id) { + var popover = getPopover(e, id); - if (!popover) { + if (!popover || !!listener) { return; } + if (popover.classList.contains('visible')) { + return hidePopover(); + } + popover.style.display = 'block'; popover.offsetHeight; popover.classList.add('visible'); @@ -83,5 +90,13 @@ }; window.addEventListener('touchend', showHidePopover); - + window.addEventListener('click', showHidePopover); + window.POPOVER = { + show: function (id) { + showHidePopover(null, id); + }, + hide: function () { + popover && hidePopover(); + } + }; }());