11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci(function() {
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Polymer('core-overlay-layer', {
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    publish: {
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      opened: false
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    openedChanged: function() {
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      this.classList.toggle('core-opened', this.opened);
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * Adds an element to the overlay layer
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    addElement: function(element) {
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!this.parentNode) {
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        document.querySelector('body').appendChild(this);
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (element.parentNode !== this) {
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        element.__contents = [];
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        var ip$ = element.querySelectorAll('content');
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        for (var i=0, l=ip$.length, n; (i<l) && (n = ip$[i]); i++) {
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          this.moveInsertedElements(n);
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          this.cacheDomLocation(n);
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          n.parentNode.removeChild(n);
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          element.__contents.push(n);
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        this.cacheDomLocation(element);
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        this.updateEventController(element);
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        var h = this.makeHost();
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        h.shadowRoot.appendChild(element);
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        element.__host = h;
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    makeHost: function() {
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      var h = document.createElement('overlay-host');
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      h.createShadowRoot();
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      this.appendChild(h);
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return h;
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    moveInsertedElements: function(insertionPoint) {
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      var n$ = insertionPoint.getDistributedNodes();
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      var parent = insertionPoint.parentNode;
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      insertionPoint.__contents = [];
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        this.cacheDomLocation(n);
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        this.updateEventController(n);
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        insertionPoint.__contents.push(n);
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        parent.appendChild(n);
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    updateEventController: function(element) {
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      element.eventController = this.element.findController(element);
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * Removes an element from the overlay layer
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    removeElement: function(element) {
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      element.eventController = null;
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      this.replaceElement(element);
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      var h = element.__host;
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (h) {
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        h.parentNode.removeChild(h);
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    replaceElement: function(element) {
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (element.__contents) {
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        for (var i=0, c$=element.__contents, c; (c=c$[i]); i++) {
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          this.replaceElement(c);
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        element.__contents = null;
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (element.__parentNode) {
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        var n = element.__nextElementSibling && element.__nextElementSibling
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            === element.__parentNode ? element.__nextElementSibling : null;
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        element.__parentNode.insertBefore(element, n);
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cacheDomLocation: function(element) {
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      element.__nextElementSibling = element.nextElementSibling;
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      element.__parentNode = element.parentNode;
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  });
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci})();
85