first commit
[ratchet] / lib / js / popovers.js
1 /* ----------------------------------
2  * POPOVER v1.0.0
3  * Licensed under The MIT License
4  * http://opensource.org/licenses/MIT
5  * ---------------------------------- */
6
7 !function () {
8
9   var popover;
10
11   var findPopovers = function (target) {
12     var i, popovers = document.querySelectorAll('a');
13     for (; target && target !== document; target = target.parentNode) {
14       for (i = popovers.length; i--;) { if (popovers[i] === target) return target; }
15     }
16   };
17
18   var onPopoverHidden = function () {
19     document.body.removeChild(backdrop);
20     popover.style.display = 'none';
21     popover.removeEventListener('webkitTransitionEnd', onPopoverHidden);
22   }
23
24   var backdrop = function () {
25     var element = document.createElement('div');
26
27     element.classList.add('backdrop');
28
29     element.addEventListener('touchend', function () {
30       popover.addEventListener('webkitTransitionEnd', onPopoverHidden);
31       popover.classList.remove('visible');
32     });
33
34     return element;
35   }();
36
37   var getPopover = function (e) {
38     var anchor = findPopovers(e.target);
39
40     if (!anchor || !anchor.hash) return;
41
42     popover = document.querySelector(anchor.hash);
43
44     if (!popover || !popover.classList.contains('popover')) return;
45
46     return popover;
47   }
48
49   window.addEventListener('touchend', function (e) {
50     var popover = getPopover(e);
51
52     if (!popover) return;
53
54     popover.style.display = 'block';
55     popover.offsetHeight;
56     popover.classList.add('visible');
57
58     popover.parentNode.appendChild(backdrop);
59   });
60
61   window.addEventListener('click', function (e) { if (getPopover(e)) e.preventDefault(); });
62
63 }();