|
1 /*** |
|
2 |
|
3 MochiKit.Position 1.4.2 |
|
4 |
|
5 See <http://mochikit.com/> for documentation, downloads, license, etc. |
|
6 |
|
7 (c) 2005-2006 Bob Ippolito and others. All rights Reserved. |
|
8 |
|
9 ***/ |
|
10 |
|
11 MochiKit.Base._deps('Position', ['Base', 'DOM', 'Style']); |
|
12 |
|
13 MochiKit.Position.NAME = 'MochiKit.Position'; |
|
14 MochiKit.Position.VERSION = '1.4.2'; |
|
15 MochiKit.Position.__repr__ = function () { |
|
16 return '[' + this.NAME + ' ' + this.VERSION + ']'; |
|
17 }; |
|
18 MochiKit.Position.toString = function () { |
|
19 return this.__repr__(); |
|
20 }; |
|
21 |
|
22 MochiKit.Position.EXPORT_OK = []; |
|
23 |
|
24 MochiKit.Position.EXPORT = [ |
|
25 ]; |
|
26 |
|
27 |
|
28 MochiKit.Base.update(MochiKit.Position, { |
|
29 // set to true if needed, warning: firefox performance problems |
|
30 // NOT neeeded for page scrolling, only if draggable contained in |
|
31 // scrollable elements |
|
32 includeScrollOffsets: false, |
|
33 |
|
34 /** @id MochiKit.Position.prepare */ |
|
35 prepare: function () { |
|
36 var deltaX = window.pageXOffset |
|
37 || document.documentElement.scrollLeft |
|
38 || document.body.scrollLeft |
|
39 || 0; |
|
40 var deltaY = window.pageYOffset |
|
41 || document.documentElement.scrollTop |
|
42 || document.body.scrollTop |
|
43 || 0; |
|
44 this.windowOffset = new MochiKit.Style.Coordinates(deltaX, deltaY); |
|
45 }, |
|
46 |
|
47 /** @id MochiKit.Position.cumulativeOffset */ |
|
48 cumulativeOffset: function (element) { |
|
49 var valueT = 0; |
|
50 var valueL = 0; |
|
51 do { |
|
52 valueT += element.offsetTop || 0; |
|
53 valueL += element.offsetLeft || 0; |
|
54 element = element.offsetParent; |
|
55 } while (element); |
|
56 return new MochiKit.Style.Coordinates(valueL, valueT); |
|
57 }, |
|
58 |
|
59 /** @id MochiKit.Position.realOffset */ |
|
60 realOffset: function (element) { |
|
61 var valueT = 0; |
|
62 var valueL = 0; |
|
63 do { |
|
64 valueT += element.scrollTop || 0; |
|
65 valueL += element.scrollLeft || 0; |
|
66 element = element.parentNode; |
|
67 } while (element); |
|
68 return new MochiKit.Style.Coordinates(valueL, valueT); |
|
69 }, |
|
70 |
|
71 /** @id MochiKit.Position.within */ |
|
72 within: function (element, x, y) { |
|
73 if (this.includeScrollOffsets) { |
|
74 return this.withinIncludingScrolloffsets(element, x, y); |
|
75 } |
|
76 this.xcomp = x; |
|
77 this.ycomp = y; |
|
78 this.offset = this.cumulativeOffset(element); |
|
79 if (element.style.position == "fixed") { |
|
80 this.offset.x += this.windowOffset.x; |
|
81 this.offset.y += this.windowOffset.y; |
|
82 } |
|
83 |
|
84 return (y >= this.offset.y && |
|
85 y < this.offset.y + element.offsetHeight && |
|
86 x >= this.offset.x && |
|
87 x < this.offset.x + element.offsetWidth); |
|
88 }, |
|
89 |
|
90 /** @id MochiKit.Position.withinIncludingScrolloffsets */ |
|
91 withinIncludingScrolloffsets: function (element, x, y) { |
|
92 var offsetcache = this.realOffset(element); |
|
93 |
|
94 this.xcomp = x + offsetcache.x - this.windowOffset.x; |
|
95 this.ycomp = y + offsetcache.y - this.windowOffset.y; |
|
96 this.offset = this.cumulativeOffset(element); |
|
97 |
|
98 return (this.ycomp >= this.offset.y && |
|
99 this.ycomp < this.offset.y + element.offsetHeight && |
|
100 this.xcomp >= this.offset.x && |
|
101 this.xcomp < this.offset.x + element.offsetWidth); |
|
102 }, |
|
103 |
|
104 // within must be called directly before |
|
105 /** @id MochiKit.Position.overlap */ |
|
106 overlap: function (mode, element) { |
|
107 if (!mode) { |
|
108 return 0; |
|
109 } |
|
110 if (mode == 'vertical') { |
|
111 return ((this.offset.y + element.offsetHeight) - this.ycomp) / |
|
112 element.offsetHeight; |
|
113 } |
|
114 if (mode == 'horizontal') { |
|
115 return ((this.offset.x + element.offsetWidth) - this.xcomp) / |
|
116 element.offsetWidth; |
|
117 } |
|
118 }, |
|
119 |
|
120 /** @id MochiKit.Position.absolutize */ |
|
121 absolutize: function (element) { |
|
122 element = MochiKit.DOM.getElement(element); |
|
123 if (element.style.position == 'absolute') { |
|
124 return; |
|
125 } |
|
126 MochiKit.Position.prepare(); |
|
127 |
|
128 var offsets = MochiKit.Position.positionedOffset(element); |
|
129 var width = element.clientWidth; |
|
130 var height = element.clientHeight; |
|
131 |
|
132 var oldStyle = { |
|
133 'position': element.style.position, |
|
134 'left': offsets.x - parseFloat(element.style.left || 0), |
|
135 'top': offsets.y - parseFloat(element.style.top || 0), |
|
136 'width': element.style.width, |
|
137 'height': element.style.height |
|
138 }; |
|
139 |
|
140 element.style.position = 'absolute'; |
|
141 element.style.top = offsets.y + 'px'; |
|
142 element.style.left = offsets.x + 'px'; |
|
143 element.style.width = width + 'px'; |
|
144 element.style.height = height + 'px'; |
|
145 |
|
146 return oldStyle; |
|
147 }, |
|
148 |
|
149 /** @id MochiKit.Position.positionedOffset */ |
|
150 positionedOffset: function (element) { |
|
151 var valueT = 0, valueL = 0; |
|
152 do { |
|
153 valueT += element.offsetTop || 0; |
|
154 valueL += element.offsetLeft || 0; |
|
155 element = element.offsetParent; |
|
156 if (element) { |
|
157 p = MochiKit.Style.getStyle(element, 'position'); |
|
158 if (p == 'relative' || p == 'absolute') { |
|
159 break; |
|
160 } |
|
161 } |
|
162 } while (element); |
|
163 return new MochiKit.Style.Coordinates(valueL, valueT); |
|
164 }, |
|
165 |
|
166 /** @id MochiKit.Position.relativize */ |
|
167 relativize: function (element, oldPos) { |
|
168 element = MochiKit.DOM.getElement(element); |
|
169 if (element.style.position == 'relative') { |
|
170 return; |
|
171 } |
|
172 MochiKit.Position.prepare(); |
|
173 |
|
174 var top = parseFloat(element.style.top || 0) - |
|
175 (oldPos['top'] || 0); |
|
176 var left = parseFloat(element.style.left || 0) - |
|
177 (oldPos['left'] || 0); |
|
178 |
|
179 element.style.position = oldPos['position']; |
|
180 element.style.top = top + 'px'; |
|
181 element.style.left = left + 'px'; |
|
182 element.style.width = oldPos['width']; |
|
183 element.style.height = oldPos['height']; |
|
184 }, |
|
185 |
|
186 /** @id MochiKit.Position.clone */ |
|
187 clone: function (source, target) { |
|
188 source = MochiKit.DOM.getElement(source); |
|
189 target = MochiKit.DOM.getElement(target); |
|
190 target.style.position = 'absolute'; |
|
191 var offsets = this.cumulativeOffset(source); |
|
192 target.style.top = offsets.y + 'px'; |
|
193 target.style.left = offsets.x + 'px'; |
|
194 target.style.width = source.offsetWidth + 'px'; |
|
195 target.style.height = source.offsetHeight + 'px'; |
|
196 }, |
|
197 |
|
198 /** @id MochiKit.Position.page */ |
|
199 page: function (forElement) { |
|
200 var valueT = 0; |
|
201 var valueL = 0; |
|
202 |
|
203 var element = forElement; |
|
204 do { |
|
205 valueT += element.offsetTop || 0; |
|
206 valueL += element.offsetLeft || 0; |
|
207 |
|
208 // Safari fix |
|
209 if (element.offsetParent == document.body && MochiKit.Style.getStyle(element, 'position') == 'absolute') { |
|
210 break; |
|
211 } |
|
212 } while (element = element.offsetParent); |
|
213 |
|
214 element = forElement; |
|
215 do { |
|
216 valueT -= element.scrollTop || 0; |
|
217 valueL -= element.scrollLeft || 0; |
|
218 } while (element = element.parentNode); |
|
219 |
|
220 return new MochiKit.Style.Coordinates(valueL, valueT); |
|
221 } |
|
222 }); |
|
223 |
|
224 MochiKit.Position.__new__ = function (win) { |
|
225 var m = MochiKit.Base; |
|
226 this.EXPORT_TAGS = { |
|
227 ':common': this.EXPORT, |
|
228 ':all': m.concat(this.EXPORT, this.EXPORT_OK) |
|
229 }; |
|
230 |
|
231 m.nameFunctions(this); |
|
232 }; |
|
233 |
|
234 MochiKit.Position.__new__(this); |
|
235 |
|
236 MochiKit.Base._exportSymbols(this, MochiKit.Position); |