Subversion Repositories Applications.papyrus

Rev

Rev 1318 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1318 alexandre_ 1
/*
2
	Copyright (c) 2004-2006, The Dojo Foundation
3
	All Rights Reserved.
4
 
5
	Licensed under the Academic Free License version 2.1 or above OR the
6
	modified BSD license. For more information on Dojo licensing, see:
7
 
8
		http://dojotoolkit.org/community/licensing.shtml
9
*/
10
 
1422 alexandre_ 11
 
12
 
1318 alexandre_ 13
dojo.provide("dojo.html.util");
14
dojo.require("dojo.html.layout");
15
dojo.html.getElementWindow = function (element) {
16
	return dojo.html.getDocumentWindow(element.ownerDocument);
17
};
18
dojo.html.getDocumentWindow = function (doc) {
19
	if (dojo.render.html.safari && !doc._parentWindow) {
20
		var fix = function (win) {
21
			win.document._parentWindow = win;
22
			for (var i = 0; i < win.frames.length; i++) {
23
				fix(win.frames[i]);
24
			}
25
		};
26
		fix(window.top);
27
	}
28
	if (dojo.render.html.ie && window !== document.parentWindow && !doc._parentWindow) {
29
		doc.parentWindow.execScript("document._parentWindow = window;", "Javascript");
30
		var win = doc._parentWindow;
31
		doc._parentWindow = null;
32
		return win;
33
	}
34
	return doc._parentWindow || doc.parentWindow || doc.defaultView;
35
};
36
dojo.html.gravity = function (node, e) {
37
	node = dojo.byId(node);
38
	var mouse = dojo.html.getCursorPosition(e);
39
	with (dojo.html) {
40
		var absolute = getAbsolutePosition(node, true);
41
		var bb = getBorderBox(node);
42
		var nodecenterx = absolute.x + (bb.width / 2);
43
		var nodecentery = absolute.y + (bb.height / 2);
44
	}
45
	with (dojo.html.gravity) {
46
		return ((mouse.x < nodecenterx ? WEST : EAST) | (mouse.y < nodecentery ? NORTH : SOUTH));
47
	}
48
};
49
dojo.html.gravity.NORTH = 1;
50
dojo.html.gravity.SOUTH = 1 << 1;
51
dojo.html.gravity.EAST = 1 << 2;
52
dojo.html.gravity.WEST = 1 << 3;
53
dojo.html.overElement = function (element, e) {
54
	element = dojo.byId(element);
55
	var mouse = dojo.html.getCursorPosition(e);
56
	var bb = dojo.html.getBorderBox(element);
57
	var absolute = dojo.html.getAbsolutePosition(element, true, dojo.html.boxSizing.BORDER_BOX);
58
	var top = absolute.y;
59
	var bottom = top + bb.height;
60
	var left = absolute.x;
61
	var right = left + bb.width;
62
	return (mouse.x >= left && mouse.x <= right && mouse.y >= top && mouse.y <= bottom);
63
};
64
dojo.html.renderedTextContent = function (node) {
65
	node = dojo.byId(node);
66
	var result = "";
67
	if (node == null) {
68
		return result;
69
	}
70
	for (var i = 0; i < node.childNodes.length; i++) {
71
		switch (node.childNodes[i].nodeType) {
72
		  case 1:
73
		  case 5:
74
			var display = "unknown";
75
			try {
76
				display = dojo.html.getStyle(node.childNodes[i], "display");
77
			}
78
			catch (E) {
79
			}
80
			switch (display) {
81
			  case "block":
82
			  case "list-item":
83
			  case "run-in":
84
			  case "table":
85
			  case "table-row-group":
86
			  case "table-header-group":
87
			  case "table-footer-group":
88
			  case "table-row":
89
			  case "table-column-group":
90
			  case "table-column":
91
			  case "table-cell":
92
			  case "table-caption":
93
				result += "\n";
94
				result += dojo.html.renderedTextContent(node.childNodes[i]);
95
				result += "\n";
96
				break;
97
			  case "none":
98
				break;
99
			  default:
100
				if (node.childNodes[i].tagName && node.childNodes[i].tagName.toLowerCase() == "br") {
101
					result += "\n";
102
				} else {
103
					result += dojo.html.renderedTextContent(node.childNodes[i]);
104
				}
105
				break;
106
			}
107
			break;
108
		  case 3:
109
		  case 2:
110
		  case 4:
111
			var text = node.childNodes[i].nodeValue;
112
			var textTransform = "unknown";
113
			try {
114
				textTransform = dojo.html.getStyle(node, "text-transform");
115
			}
116
			catch (E) {
117
			}
118
			switch (textTransform) {
119
			  case "capitalize":
120
				var words = text.split(" ");
121
				for (var i = 0; i < words.length; i++) {
122
					words[i] = words[i].charAt(0).toUpperCase() + words[i].substring(1);
123
				}
124
				text = words.join(" ");
125
				break;
126
			  case "uppercase":
127
				text = text.toUpperCase();
128
				break;
129
			  case "lowercase":
130
				text = text.toLowerCase();
131
				break;
132
			  default:
133
				break;
134
			}
135
			switch (textTransform) {
136
			  case "nowrap":
137
				break;
138
			  case "pre-wrap":
139
				break;
140
			  case "pre-line":
141
				break;
142
			  case "pre":
143
				break;
144
			  default:
145
				text = text.replace(/\s+/, " ");
146
				if (/\s$/.test(result)) {
147
					text.replace(/^\s/, "");
148
				}
149
				break;
150
			}
151
			result += text;
152
			break;
153
		  default:
154
			break;
155
		}
156
	}
157
	return result;
158
};
159
dojo.html.createNodesFromText = function (txt, trim) {
160
	if (trim) {
161
		txt = txt.replace(/^\s+|\s+$/g, "");
162
	}
163
	var tn = dojo.doc().createElement("div");
164
	tn.style.visibility = "hidden";
165
	dojo.body().appendChild(tn);
166
	var tableType = "none";
167
	if ((/^<t[dh][\s\r\n>]/i).test(txt.replace(/^\s+/))) {
168
		txt = "<table><tbody><tr>" + txt + "</tr></tbody></table>";
169
		tableType = "cell";
170
	} else {
171
		if ((/^<tr[\s\r\n>]/i).test(txt.replace(/^\s+/))) {
172
			txt = "<table><tbody>" + txt + "</tbody></table>";
173
			tableType = "row";
174
		} else {
175
			if ((/^<(thead|tbody|tfoot)[\s\r\n>]/i).test(txt.replace(/^\s+/))) {
176
				txt = "<table>" + txt + "</table>";
177
				tableType = "section";
178
			}
179
		}
180
	}
181
	tn.innerHTML = txt;
182
	if (tn["normalize"]) {
183
		tn.normalize();
184
	}
185
	var parent = null;
186
	switch (tableType) {
187
	  case "cell":
188
		parent = tn.getElementsByTagName("tr")[0];
189
		break;
190
	  case "row":
191
		parent = tn.getElementsByTagName("tbody")[0];
192
		break;
193
	  case "section":
194
		parent = tn.getElementsByTagName("table")[0];
195
		break;
196
	  default:
197
		parent = tn;
198
		break;
199
	}
200
	var nodes = [];
201
	for (var x = 0; x < parent.childNodes.length; x++) {
202
		nodes.push(parent.childNodes[x].cloneNode(true));
203
	}
204
	tn.style.display = "none";
205
	dojo.html.destroyNode(tn);
206
	return nodes;
207
};
208
dojo.html.placeOnScreen = function (node, desiredX, desiredY, padding, hasScroll, corners, tryOnly) {
209
	if (desiredX instanceof Array || typeof desiredX == "array") {
210
		tryOnly = corners;
211
		corners = hasScroll;
212
		hasScroll = padding;
213
		padding = desiredY;
214
		desiredY = desiredX[1];
215
		desiredX = desiredX[0];
216
	}
217
	if (corners instanceof String || typeof corners == "string") {
218
		corners = corners.split(",");
219
	}
220
	if (!isNaN(padding)) {
221
		padding = [Number(padding), Number(padding)];
222
	} else {
223
		if (!(padding instanceof Array || typeof padding == "array")) {
224
			padding = [0, 0];
225
		}
226
	}
227
	var scroll = dojo.html.getScroll().offset;
228
	var view = dojo.html.getViewport();
229
	node = dojo.byId(node);
230
	var oldDisplay = node.style.display;
231
	node.style.display = "";
232
	var bb = dojo.html.getBorderBox(node);
233
	var w = bb.width;
234
	var h = bb.height;
235
	node.style.display = oldDisplay;
236
	if (!(corners instanceof Array || typeof corners == "array")) {
237
		corners = ["TL"];
238
	}
239
	var bestx, besty, bestDistance = Infinity, bestCorner;
240
	for (var cidex = 0; cidex < corners.length; ++cidex) {
241
		var corner = corners[cidex];
242
		var match = true;
243
		var tryX = desiredX - (corner.charAt(1) == "L" ? 0 : w) + padding[0] * (corner.charAt(1) == "L" ? 1 : -1);
244
		var tryY = desiredY - (corner.charAt(0) == "T" ? 0 : h) + padding[1] * (corner.charAt(0) == "T" ? 1 : -1);
245
		if (hasScroll) {
246
			tryX -= scroll.x;
247
			tryY -= scroll.y;
248
		}
249
		if (tryX < 0) {
250
			tryX = 0;
251
			match = false;
252
		}
253
		if (tryY < 0) {
254
			tryY = 0;
255
			match = false;
256
		}
257
		var x = tryX + w;
258
		if (x > view.width) {
259
			x = view.width - w;
260
			match = false;
261
		} else {
262
			x = tryX;
263
		}
264
		x = Math.max(padding[0], x) + scroll.x;
265
		var y = tryY + h;
266
		if (y > view.height) {
267
			y = view.height - h;
268
			match = false;
269
		} else {
270
			y = tryY;
271
		}
272
		y = Math.max(padding[1], y) + scroll.y;
273
		if (match) {
274
			bestx = x;
275
			besty = y;
276
			bestDistance = 0;
277
			bestCorner = corner;
278
			break;
279
		} else {
280
			var dist = Math.pow(x - tryX - scroll.x, 2) + Math.pow(y - tryY - scroll.y, 2);
281
			if (bestDistance > dist) {
282
				bestDistance = dist;
283
				bestx = x;
284
				besty = y;
285
				bestCorner = corner;
286
			}
287
		}
288
	}
289
	if (!tryOnly) {
290
		node.style.left = bestx + "px";
291
		node.style.top = besty + "px";
292
	}
293
	return {left:bestx, top:besty, x:bestx, y:besty, dist:bestDistance, corner:bestCorner};
294
};
295
dojo.html.placeOnScreenPoint = function (node, desiredX, desiredY, padding, hasScroll) {
296
	dojo.deprecated("dojo.html.placeOnScreenPoint", "use dojo.html.placeOnScreen() instead", "0.5");
297
	return dojo.html.placeOnScreen(node, desiredX, desiredY, padding, hasScroll, ["TL", "TR", "BL", "BR"]);
298
};
299
dojo.html.placeOnScreenAroundElement = function (node, aroundNode, padding, aroundType, aroundCorners, tryOnly) {
300
	var best, bestDistance = Infinity;
301
	aroundNode = dojo.byId(aroundNode);
302
	var oldDisplay = aroundNode.style.display;
303
	aroundNode.style.display = "";
304
	var mb = dojo.html.getElementBox(aroundNode, aroundType);
305
	var aroundNodeW = mb.width;
306
	var aroundNodeH = mb.height;
307
	var aroundNodePos = dojo.html.getAbsolutePosition(aroundNode, true, aroundType);
308
	aroundNode.style.display = oldDisplay;
309
	for (var nodeCorner in aroundCorners) {
310
		var pos, desiredX, desiredY;
311
		var corners = aroundCorners[nodeCorner];
312
		desiredX = aroundNodePos.x + (nodeCorner.charAt(1) == "L" ? 0 : aroundNodeW);
313
		desiredY = aroundNodePos.y + (nodeCorner.charAt(0) == "T" ? 0 : aroundNodeH);
314
		pos = dojo.html.placeOnScreen(node, desiredX, desiredY, padding, true, corners, true);
315
		if (pos.dist == 0) {
316
			best = pos;
317
			break;
318
		} else {
319
			if (bestDistance > pos.dist) {
320
				bestDistance = pos.dist;
321
				best = pos;
322
			}
323
		}
324
	}
325
	if (!tryOnly) {
326
		node.style.left = best.left + "px";
327
		node.style.top = best.top + "px";
328
	}
329
	return best;
330
};
331
dojo.html.scrollIntoView = function (node) {
332
	if (!node) {
333
		return;
334
	}
335
	if (dojo.render.html.ie) {
336
		if (dojo.html.getBorderBox(node.parentNode).height <= node.parentNode.scrollHeight) {
337
			node.scrollIntoView(false);
338
		}
339
	} else {
340
		if (dojo.render.html.mozilla) {
341
			node.scrollIntoView(false);
342
		} else {
343
			var parent = node.parentNode;
344
			var parentBottom = parent.scrollTop + dojo.html.getBorderBox(parent).height;
345
			var nodeBottom = node.offsetTop + dojo.html.getMarginBox(node).height;
346
			if (parentBottom < nodeBottom) {
347
				parent.scrollTop += (nodeBottom - parentBottom);
348
			} else {
349
				if (parent.scrollTop > node.offsetTop) {
350
					parent.scrollTop -= (parent.scrollTop - node.offsetTop);
351
				}
352
			}
353
		}
354
	}
355
};
356