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