comparison geotemco/lib/simile/ajax/scripts/dom.js @ 0:b12c99b7c3f0

commit for previous development
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Mon, 19 Jan 2015 17:13:49 +0100
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:b12c99b7c3f0
1 /*==================================================
2 * DOM Utility Functions
3 *==================================================
4 */
5
6 SimileAjax.DOM = new Object();
7
8 SimileAjax.DOM.registerEventWithObject = function(elmt, eventName, obj, handlerName) {
9 SimileAjax.DOM.registerEvent(elmt, eventName, function(elmt2, evt, target) {
10 return obj[handlerName].call(obj, elmt2, evt, target);
11 });
12 };
13
14 SimileAjax.DOM.registerEvent = function(elmt, eventName, handler) {
15 var handler2 = function(evt) {
16 evt = (evt) ? evt : ((event) ? event : null);
17 if (evt) {
18 var target = (evt.target) ?
19 evt.target : ((evt.srcElement) ? evt.srcElement : null);
20 if (target) {
21 target = (target.nodeType == 1 || target.nodeType == 9) ?
22 target : target.parentNode;
23 }
24
25 return handler(elmt, evt, target);
26 }
27 return true;
28 }
29
30 if (SimileAjax.Platform.browser.isIE) {
31 elmt.attachEvent("on" + eventName, handler2);
32 } else {
33 elmt.addEventListener(eventName, handler2, false);
34 }
35 };
36
37 SimileAjax.DOM.getPageCoordinates = function(elmt) {
38 var left = 0;
39 var top = 0;
40
41 if (elmt.nodeType != 1) {
42 elmt = elmt.parentNode;
43 }
44
45 var elmt2 = elmt;
46 while (elmt2 != null) {
47 left += elmt2.offsetLeft;
48 top += elmt2.offsetTop;
49 elmt2 = elmt2.offsetParent;
50 }
51
52 var body = document.body;
53 while (elmt != null && elmt != body) {
54 if ("scrollLeft" in elmt) {
55 left -= elmt.scrollLeft;
56 top -= elmt.scrollTop;
57 }
58 elmt = elmt.parentNode;
59 }
60
61 return { left: left, top: top };
62 };
63
64 SimileAjax.DOM.getSize = function(elmt) {
65 var w = this.getStyle(elmt,"width");
66 var h = this.getStyle(elmt,"height");
67 if (w.indexOf("px") > -1) w = w.replace("px","");
68 if (h.indexOf("px") > -1) h = h.replace("px","");
69 return {
70 w: w,
71 h: h
72 }
73 }
74
75 SimileAjax.DOM.getStyle = function(elmt, styleProp) {
76 if (elmt.currentStyle) { // IE
77 var style = elmt.currentStyle[styleProp];
78 } else if (window.getComputedStyle) { // standard DOM
79 var style = document.defaultView.getComputedStyle(elmt, null).getPropertyValue(styleProp);
80 } else {
81 var style = "";
82 }
83 return style;
84 }
85
86 SimileAjax.DOM.getEventRelativeCoordinates = function(evt, elmt) {
87 if (SimileAjax.Platform.browser.isIE) {
88 if (evt.type == "mousewheel") {
89 var coords = SimileAjax.DOM.getPageCoordinates(elmt);
90 return {
91 x: evt.clientX - coords.left,
92 y: evt.clientY - coords.top
93 };
94 } else {
95 return {
96 x: evt.offsetX,
97 y: evt.offsetY
98 };
99 }
100 } else {
101 var coords = SimileAjax.DOM.getPageCoordinates(elmt);
102
103 if ((evt.type == "DOMMouseScroll") &&
104 SimileAjax.Platform.browser.isFirefox &&
105 (SimileAjax.Platform.browser.majorVersion == 2)) {
106 // Due to: https://bugzilla.mozilla.org/show_bug.cgi?id=352179
107
108 return {
109 x: evt.screenX - coords.left,
110 y: evt.screenY - coords.top
111 };
112 } else {
113 return {
114 x: evt.pageX - coords.left,
115 y: evt.pageY - coords.top
116 };
117 }
118 }
119 };
120
121 SimileAjax.DOM.getEventPageCoordinates = function(evt) {
122 if (SimileAjax.Platform.browser.isIE) {
123
124 var scrOfY = 0;
125 var scrOfX = 0;
126
127 if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
128 //DOM compliant
129 scrOfY = document.body.scrollTop;
130 scrOfX = document.body.scrollLeft;
131 } else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
132 //IE6 standards compliant mode
133 scrOfY = document.documentElement.scrollTop;
134 scrOfX = document.documentElement.scrollLeft;
135 }
136
137 return { x: evt.clientX + scrOfX, y: evt.clientY + scrOfY };
138 } else {
139 return {
140 x: evt.pageX,
141 y: evt.pageY
142 };
143 }
144 };
145
146 SimileAjax.DOM.hittest = function(x, y, except) {
147 return SimileAjax.DOM._hittest(document.body, x, y, except);
148 };
149
150 SimileAjax.DOM._hittest = function(elmt, x, y, except) {
151 var childNodes = elmt.childNodes;
152 outer: for (var i = 0; i < childNodes.length; i++) {
153 var childNode = childNodes[i];
154 for (var j = 0; j < except.length; j++) {
155 if (childNode == except[j]) {
156 continue outer;
157 }
158 }
159
160 if (childNode.offsetWidth == 0 && childNode.offsetHeight == 0) {
161 /*
162 * Sometimes SPAN elements have zero width and height but
163 * they have children like DIVs that cover non-zero areas.
164 */
165 var hitNode = SimileAjax.DOM._hittest(childNode, x, y, except);
166 if (hitNode != childNode) {
167 return hitNode;
168 }
169 } else {
170 var top = 0;
171 var left = 0;
172
173 var node = childNode;
174 while (node) {
175 top += node.offsetTop;
176 left += node.offsetLeft;
177 node = node.offsetParent;
178 }
179
180 if (left <= x && top <= y && (x - left) < childNode.offsetWidth && (y - top) < childNode.offsetHeight) {
181 return SimileAjax.DOM._hittest(childNode, x, y, except);
182 } else if (childNode.nodeType == 1 && childNode.tagName == "TR") {
183 /*
184 * Table row might have cells that span several rows.
185 */
186 var childNode2 = SimileAjax.DOM._hittest(childNode, x, y, except);
187 if (childNode2 != childNode) {
188 return childNode2;
189 }
190 }
191 }
192 }
193 return elmt;
194 };
195
196 SimileAjax.DOM.cancelEvent = function(evt) {
197 evt.returnValue = false;
198 evt.cancelBubble = true;
199 if ("preventDefault" in evt) {
200 evt.preventDefault();
201 }
202 };
203
204 SimileAjax.DOM.appendClassName = function(elmt, className) {
205 var classes = elmt.className.split(" ");
206 for (var i = 0; i < classes.length; i++) {
207 if (classes[i] == className) {
208 return;
209 }
210 }
211 classes.push(className);
212 elmt.className = classes.join(" ");
213 };
214
215 SimileAjax.DOM.createInputElement = function(type) {
216 var div = document.createElement("div");
217 div.innerHTML = "<input type='" + type + "' />";
218
219 return div.firstChild;
220 };
221
222 SimileAjax.DOM.createDOMFromTemplate = function(template) {
223 var result = {};
224 result.elmt = SimileAjax.DOM._createDOMFromTemplate(template, result, null);
225
226 return result;
227 };
228
229 SimileAjax.DOM._createDOMFromTemplate = function(templateNode, result, parentElmt) {
230 if (templateNode == null) {
231 /*
232 var node = doc.createTextNode("--null--");
233 if (parentElmt != null) {
234 parentElmt.appendChild(node);
235 }
236 return node;
237 */
238 return null;
239 } else if (typeof templateNode != "object") {
240 var node = document.createTextNode(templateNode);
241 if (parentElmt != null) {
242 parentElmt.appendChild(node);
243 }
244 return node;
245 } else {
246 var elmt = null;
247 if ("tag" in templateNode) {
248 var tag = templateNode.tag;
249 if (parentElmt != null) {
250 if (tag == "tr") {
251 elmt = parentElmt.insertRow(parentElmt.rows.length);
252 } else if (tag == "td") {
253 elmt = parentElmt.insertCell(parentElmt.cells.length);
254 }
255 }
256 if (elmt == null) {
257 elmt = tag == "input" ?
258 SimileAjax.DOM.createInputElement(templateNode.type) :
259 document.createElement(tag);
260
261 if (parentElmt != null) {
262 parentElmt.appendChild(elmt);
263 }
264 }
265 } else {
266 elmt = templateNode.elmt;
267 if (parentElmt != null) {
268 parentElmt.appendChild(elmt);
269 }
270 }
271
272 for (var attribute in templateNode) {
273 var value = templateNode[attribute];
274
275 if (attribute == "field") {
276 result[value] = elmt;
277
278 } else if (attribute == "className") {
279 elmt.className = value;
280 } else if (attribute == "id") {
281 elmt.id = value;
282 } else if (attribute == "title") {
283 elmt.title = value;
284 } else if (attribute == "type" && elmt.tagName == "input") {
285 // do nothing
286 } else if (attribute == "style") {
287 for (n in value) {
288 var v = value[n];
289 if (n == "float") {
290 n = SimileAjax.Platform.browser.isIE ? "styleFloat" : "cssFloat";
291 }
292 elmt.style[n] = v;
293 }
294 } else if (attribute == "children") {
295 for (var i = 0; i < value.length; i++) {
296 SimileAjax.DOM._createDOMFromTemplate(value[i], result, elmt);
297 }
298 } else if (attribute != "tag" && attribute != "elmt") {
299 elmt.setAttribute(attribute, value);
300 }
301 }
302 return elmt;
303 }
304 }
305
306 SimileAjax.DOM._cachedParent = null;
307 SimileAjax.DOM.createElementFromString = function(s) {
308 if (SimileAjax.DOM._cachedParent == null) {
309 SimileAjax.DOM._cachedParent = document.createElement("div");
310 }
311 SimileAjax.DOM._cachedParent.innerHTML = s;
312 return SimileAjax.DOM._cachedParent.firstChild;
313 };
314
315 SimileAjax.DOM.createDOMFromString = function(root, s, fieldElmts) {
316 var elmt = typeof root == "string" ? document.createElement(root) : root;
317 elmt.innerHTML = s;
318
319 var dom = { elmt: elmt };
320 SimileAjax.DOM._processDOMChildrenConstructedFromString(dom, elmt, fieldElmts != null ? fieldElmts : {} );
321
322 return dom;
323 };
324
325 SimileAjax.DOM._processDOMConstructedFromString = function(dom, elmt, fieldElmts) {
326 var id = elmt.id;
327 if (id != null && id.length > 0) {
328 elmt.removeAttribute("id");
329 if (id in fieldElmts) {
330 var parentElmt = elmt.parentNode;
331 parentElmt.insertBefore(fieldElmts[id], elmt);
332 parentElmt.removeChild(elmt);
333
334 dom[id] = fieldElmts[id];
335 return;
336 } else {
337 dom[id] = elmt;
338 }
339 }
340
341 if (elmt.hasChildNodes()) {
342 SimileAjax.DOM._processDOMChildrenConstructedFromString(dom, elmt, fieldElmts);
343 }
344 };
345
346 SimileAjax.DOM._processDOMChildrenConstructedFromString = function(dom, elmt, fieldElmts) {
347 var node = elmt.firstChild;
348 while (node != null) {
349 var node2 = node.nextSibling;
350 if (node.nodeType == 1) {
351 SimileAjax.DOM._processDOMConstructedFromString(dom, node, fieldElmts);
352 }
353 node = node2;
354 }
355 };