1
2(function() {
3
4  Polymer('core-overlay-layer', {
5    publish: {
6      opened: false
7    },
8    openedChanged: function() {
9      this.classList.toggle('core-opened', this.opened);
10    },
11    /**
12     * Adds an element to the overlay layer
13     */
14    addElement: function(element) {
15      if (!this.parentNode) {
16        document.querySelector('body').appendChild(this);
17      }
18      if (element.parentNode !== this) {
19        element.__contents = [];
20        var ip$ = element.querySelectorAll('content');
21        for (var i=0, l=ip$.length, n; (i<l) && (n = ip$[i]); i++) {
22          this.moveInsertedElements(n);
23          this.cacheDomLocation(n);
24          n.parentNode.removeChild(n);
25          element.__contents.push(n);
26        }
27        this.cacheDomLocation(element);
28        this.updateEventController(element);
29        var h = this.makeHost();
30        h.shadowRoot.appendChild(element);
31        element.__host = h;
32      }
33    },
34    makeHost: function() {
35      var h = document.createElement('overlay-host');
36      h.createShadowRoot();
37      this.appendChild(h);
38      return h;
39    },
40    moveInsertedElements: function(insertionPoint) {
41      var n$ = insertionPoint.getDistributedNodes();
42      var parent = insertionPoint.parentNode;
43      insertionPoint.__contents = [];
44      for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
45        this.cacheDomLocation(n);
46        this.updateEventController(n);
47        insertionPoint.__contents.push(n);
48        parent.appendChild(n);
49      }
50    },
51    updateEventController: function(element) {
52      element.eventController = this.element.findController(element);
53    },
54    /**
55     * Removes an element from the overlay layer
56     */
57    removeElement: function(element) {
58      element.eventController = null;
59      this.replaceElement(element);
60      var h = element.__host;
61      if (h) {
62        h.parentNode.removeChild(h);
63      }
64    },
65    replaceElement: function(element) {
66      if (element.__contents) {
67        for (var i=0, c$=element.__contents, c; (c=c$[i]); i++) {
68          this.replaceElement(c);
69        }
70        element.__contents = null;
71      }
72      if (element.__parentNode) {
73        var n = element.__nextElementSibling && element.__nextElementSibling
74            === element.__parentNode ? element.__nextElementSibling : null;
75        element.__parentNode.insertBefore(element, n);
76      }
77    },
78    cacheDomLocation: function(element) {
79      element.__nextElementSibling = element.nextElementSibling;
80      element.__parentNode = element.parentNode;
81    }
82  });
83
84})();
85