testing/mochitest/tests/MochiKit-1.4.2/MochiKit/Position.js

branch
TOR_BUG_9701
changeset 15
b8a032363ba2
equal deleted inserted replaced
-1:000000000000 0:7c9e9278e9e4
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);

mercurial