Subversion Repositories Applications.papyrus

Rev

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