Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / polymer / components-chromium / core-layout-trbl / core-slide-extracted.js
1
2
3     Polymer('core-slide', {
4
5       closed: false,
6       open: true,
7       vertical: false,
8       targetId: '',
9       target: null,
10
11       ready: function() {
12         this.setAttribute('nolayout', '');
13       },
14
15       attached: function() {
16         this.target = this.parentNode;
17       },
18
19       targetIdChanged: function() {
20         var p = this.parentNode;
21         while (p.parentNode) {p = p.parentNode;};
22         this.target = p.querySelector('#' + this.targetId);
23       },
24
25       targetChanged: function() {
26         if (this.closed) {
27           this.asyncMethod(this.update);
28         }
29       },
30
31       toggle: function() {
32         this.open = !this.open;
33       },
34
35       closedChanged: function() {
36         this.open = !this.closed;
37       },
38
39       openChanged: function() {
40         this.asyncMethod(this.update);
41       },
42
43       update: function() {
44         this.closed = !this.open;
45         if (this.target) {
46           if (this.vertical) {
47             if (this.target.style.top !== '') {
48               this.updateTop();
49             } else {
50               this.updateBottom();
51             }
52           } else {
53             if (this.target.style.left !== '') {
54               this.updateLeft();
55             } else {
56               this.updateRight();
57             }
58           }
59         }
60       },
61
62       updateLeft: function() {
63         var w = this.target.offsetWidth;
64         var l = this.open ? 0 : -w;
65         this.target.style.left = l + 'px';
66         var s = this.target.nextElementSibling;
67         while (s) {
68           if (!s.hasAttribute('nolayout')) {
69             if (s.style.left === '' && s.style.right !== '') {
70               break;
71             }
72             l += w;
73             s.style.left = l + 'px';
74             w = s.offsetWidth;
75           }
76           s = s.nextElementSibling;
77         }
78       },
79
80       updateRight: function() {
81         var w = this.target.offsetWidth;
82         var r = this.open ? 0 : -w;
83         this.target.style.right = r + 'px';
84         //var s = this.target.previousElementSibling;
85         var s = previousElementSibling(this.target);
86         while (s) {
87           if (!s.hasAttribute('nolayout')) {
88             if (s.style.right === '' && s.style.left !== '') {
89               break;
90             }
91             r += w;
92             s.style.right = r + 'px';  
93             w = s.offsetWidth;
94           }
95           //if (s == s.previousElementSibling) {
96           //  console.error(s.localName + ' is its own sibling', s);
97           //  break;
98           //}
99           //s = s.previousElementSibling;
100           s = previousElementSibling(s);
101         }
102       },
103
104       updateTop: function() {
105         var h = this.target.offsetHeight;
106         var t = this.open ? 0 : -h;
107         this.target.style.top = t + 'px';
108         var s = this.target.nextElementSibling;
109         while (s) {
110           if (!s.hasAttribute('nolayout')) {
111             if (s.style.top === '' && s.style.bottom !== '') {
112               break;
113             }
114             t += h;
115             s.style.top = t + 'px';
116             h = s.offsetHeight;
117           }
118           s = s.nextElementSibling;
119         }
120       },
121
122       updateBottom: function() {
123         var h = this.target.offsetHeight;
124         var b = this.open ? 0 : -h;
125         this.target.style.bottom = b + 'px';
126         //var s = this.target.previousElementSibling;
127         var s = previousElementSibling(this.target);
128         while (s) {
129           if (!s.hasAttribute('nolayout')) {
130             if (s.style.bottom === '' && s.style.top !== '') {
131               break;
132             }
133             b = b + h;
134             s.style.bottom = b + 'px';  
135             h = s.offsetHeight;
136           }
137           //if (s == s.previousElementSibling) {
138           //  console.error(s.localName + ' is its own sibling', s);
139           //  break;
140           //}
141           //s = s.previousElementSibling;
142           s = previousElementSibling(s);
143         }
144       }
145
146     });
147     
148     // TODO(sjmiles): temporary workaround for b0rked property in ShadowDOMPolyfill
149     function previousElementSibling(e) {
150       do {
151         e = e.previousSibling;
152       } while (e && e.nodeType !== Node.ELEMENT_NODE);
153       return e;
154     };
155
156