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.require("dojo.html.common");
14
dojo.provide("dojo.html.selection");
15
dojo.require("dojo.dom");
16
dojo.require("dojo.lang.common");
17
dojo.html.selectionType = {NONE:0, TEXT:1, CONTROL:2};
18
dojo.html.clearSelection = function () {
19
	var _window = dojo.global();
20
	var _document = dojo.doc();
21
	try {
22
		if (_window["getSelection"]) {
23
			if (dojo.render.html.safari) {
24
				_window.getSelection().collapse();
25
			} else {
26
				_window.getSelection().removeAllRanges();
27
			}
28
		} else {
29
			if (_document.selection) {
30
				if (_document.selection.empty) {
31
					_document.selection.empty();
32
				} else {
33
					if (_document.selection.clear) {
34
						_document.selection.clear();
35
					}
36
				}
37
			}
38
		}
39
		return true;
40
	}
41
	catch (e) {
42
		dojo.debug(e);
43
		return false;
44
	}
45
};
46
dojo.html.disableSelection = function (element) {
47
	element = dojo.byId(element) || dojo.body();
48
	var h = dojo.render.html;
49
	if (h.mozilla) {
50
		element.style.MozUserSelect = "none";
51
	} else {
52
		if (h.safari) {
53
			element.style.KhtmlUserSelect = "none";
54
		} else {
55
			if (h.ie) {
56
				element.unselectable = "on";
57
			} else {
58
				return false;
59
			}
60
		}
61
	}
62
	return true;
63
};
64
dojo.html.enableSelection = function (element) {
65
	element = dojo.byId(element) || dojo.body();
66
	var h = dojo.render.html;
67
	if (h.mozilla) {
68
		element.style.MozUserSelect = "";
69
	} else {
70
		if (h.safari) {
71
			element.style.KhtmlUserSelect = "";
72
		} else {
73
			if (h.ie) {
74
				element.unselectable = "off";
75
			} else {
76
				return false;
77
			}
78
		}
79
	}
80
	return true;
81
};
82
dojo.html.selectElement = function (element) {
83
	dojo.deprecated("dojo.html.selectElement", "replaced by dojo.html.selection.selectElementChildren", 0.5);
84
};
85
dojo.html.selectInputText = function (element) {
86
	var _window = dojo.global();
87
	var _document = dojo.doc();
88
	element = dojo.byId(element);
89
	if (_document["selection"] && dojo.body()["createTextRange"]) {
90
		var range = element.createTextRange();
91
		range.moveStart("character", 0);
92
		range.moveEnd("character", element.value.length);
93
		range.select();
94
	} else {
95
		if (_window["getSelection"]) {
96
			var selection = _window.getSelection();
97
			element.setSelectionRange(0, element.value.length);
98
		}
99
	}
100
	element.focus();
101
};
102
dojo.html.isSelectionCollapsed = function () {
103
	dojo.deprecated("dojo.html.isSelectionCollapsed", "replaced by dojo.html.selection.isCollapsed", 0.5);
104
	return dojo.html.selection.isCollapsed();
105
};
106
dojo.lang.mixin(dojo.html.selection, {getType:function () {
107
	if (dojo.doc()["selection"]) {
108
		return dojo.html.selectionType[dojo.doc().selection.type.toUpperCase()];
109
	} else {
110
		var stype = dojo.html.selectionType.TEXT;
111
		var oSel;
112
		try {
113
			oSel = dojo.global().getSelection();
114
		}
115
		catch (e) {
116
		}
117
		if (oSel && oSel.rangeCount == 1) {
118
			var oRange = oSel.getRangeAt(0);
119
			if (oRange.startContainer == oRange.endContainer && (oRange.endOffset - oRange.startOffset) == 1 && oRange.startContainer.nodeType != dojo.dom.TEXT_NODE) {
120
				stype = dojo.html.selectionType.CONTROL;
121
			}
122
		}
123
		return stype;
124
	}
125
}, isCollapsed:function () {
126
	var _window = dojo.global();
127
	var _document = dojo.doc();
128
	if (_document["selection"]) {
129
		return _document.selection.createRange().text == "";
130
	} else {
131
		if (_window["getSelection"]) {
132
			var selection = _window.getSelection();
133
			if (dojo.lang.isString(selection)) {
134
				return selection == "";
135
			} else {
136
				return selection.isCollapsed || selection.toString() == "";
137
			}
138
		}
139
	}
140
}, getSelectedElement:function () {
141
	if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) {
142
		if (dojo.doc()["selection"]) {
143
			var range = dojo.doc().selection.createRange();
144
			if (range && range.item) {
145
				return dojo.doc().selection.createRange().item(0);
146
			}
147
		} else {
148
			var selection = dojo.global().getSelection();
149
			return selection.anchorNode.childNodes[selection.anchorOffset];
150
		}
151
	}
152
}, getParentElement:function () {
153
	if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) {
154
		var p = dojo.html.selection.getSelectedElement();
155
		if (p) {
156
			return p.parentNode;
157
		}
158
	} else {
159
		if (dojo.doc()["selection"]) {
160
			return dojo.doc().selection.createRange().parentElement();
161
		} else {
162
			var selection = dojo.global().getSelection();
163
			if (selection) {
164
				var node = selection.anchorNode;
165
				while (node && node.nodeType != dojo.dom.ELEMENT_NODE) {
166
					node = node.parentNode;
167
				}
168
				return node;
169
			}
170
		}
171
	}
172
}, getSelectedText:function () {
173
	if (dojo.doc()["selection"]) {
174
		if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) {
175
			return null;
176
		}
177
		return dojo.doc().selection.createRange().text;
178
	} else {
179
		var selection = dojo.global().getSelection();
180
		if (selection) {
181
			return selection.toString();
182
		}
183
	}
184
}, getSelectedHtml:function () {
185
	if (dojo.doc()["selection"]) {
186
		if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) {
187
			return null;
188
		}
189
		return dojo.doc().selection.createRange().htmlText;
190
	} else {
191
		var selection = dojo.global().getSelection();
192
		if (selection && selection.rangeCount) {
193
			var frag = selection.getRangeAt(0).cloneContents();
194
			var div = document.createElement("div");
195
			div.appendChild(frag);
196
			return div.innerHTML;
197
		}
198
		return null;
199
	}
200
}, hasAncestorElement:function (tagName) {
201
	return (dojo.html.selection.getAncestorElement.apply(this, arguments) != null);
202
}, getAncestorElement:function (tagName) {
203
	var node = dojo.html.selection.getSelectedElement() || dojo.html.selection.getParentElement();
204
	while (node) {
205
		if (dojo.html.selection.isTag(node, arguments).length > 0) {
206
			return node;
207
		}
208
		node = node.parentNode;
209
	}
210
	return null;
211
}, isTag:function (node, tags) {
212
	if (node && node.tagName) {
213
		for (var i = 0; i < tags.length; i++) {
214
			if (node.tagName.toLowerCase() == String(tags[i]).toLowerCase()) {
215
				return String(tags[i]).toLowerCase();
216
			}
217
		}
218
	}
219
	return "";
220
}, selectElement:function (element) {
221
	var _window = dojo.global();
222
	var _document = dojo.doc();
223
	element = dojo.byId(element);
224
	if (_document.selection && dojo.body().createTextRange) {
225
		try {
226
			var range = dojo.body().createControlRange();
227
			range.addElement(element);
228
			range.select();
229
		}
230
		catch (e) {
231
			dojo.html.selection.selectElementChildren(element);
232
		}
233
	} else {
234
		if (_window["getSelection"]) {
235
			var selection = _window.getSelection();
236
			if (selection["removeAllRanges"]) {
237
				var range = _document.createRange();
238
				range.selectNode(element);
239
				selection.removeAllRanges();
240
				selection.addRange(range);
241
			}
242
		}
243
	}
244
}, selectElementChildren:function (element) {
245
	var _window = dojo.global();
246
	var _document = dojo.doc();
247
	element = dojo.byId(element);
248
	if (_document.selection && dojo.body().createTextRange) {
249
		var range = dojo.body().createTextRange();
250
		range.moveToElementText(element);
251
		range.select();
252
	} else {
253
		if (_window["getSelection"]) {
254
			var selection = _window.getSelection();
255
			if (selection["setBaseAndExtent"]) {
256
				selection.setBaseAndExtent(element, 0, element, element.innerText.length - 1);
257
			} else {
258
				if (selection["selectAllChildren"]) {
259
					selection.selectAllChildren(element);
260
				}
261
			}
262
		}
263
	}
264
}, getBookmark:function () {
265
	var bookmark;
266
	var _document = dojo.doc();
267
	if (_document["selection"]) {
268
		var range = _document.selection.createRange();
269
		bookmark = range.getBookmark();
270
	} else {
271
		var selection;
272
		try {
273
			selection = dojo.global().getSelection();
274
		}
275
		catch (e) {
276
		}
277
		if (selection) {
278
			var range = selection.getRangeAt(0);
279
			bookmark = range.cloneRange();
280
		} else {
281
			dojo.debug("No idea how to store the current selection for this browser!");
282
		}
283
	}
284
	return bookmark;
285
}, moveToBookmark:function (bookmark) {
286
	var _document = dojo.doc();
287
	if (_document["selection"]) {
288
		var range = _document.selection.createRange();
289
		range.moveToBookmark(bookmark);
290
		range.select();
291
	} else {
292
		var selection;
293
		try {
294
			selection = dojo.global().getSelection();
295
		}
296
		catch (e) {
297
		}
298
		if (selection && selection["removeAllRanges"]) {
299
			selection.removeAllRanges();
300
			selection.addRange(bookmark);
301
		} else {
302
			dojo.debug("No idea how to restore selection for this browser!");
303
		}
304
	}
305
}, collapse:function (beginning) {
306
	if (dojo.global()["getSelection"]) {
307
		var selection = dojo.global().getSelection();
308
		if (selection.removeAllRanges) {
309
			if (beginning) {
310
				selection.collapseToStart();
311
			} else {
312
				selection.collapseToEnd();
313
			}
314
		} else {
315
			dojo.global().getSelection().collapse(beginning);
316
		}
317
	} else {
318
		if (dojo.doc().selection) {
319
			var range = dojo.doc().selection.createRange();
320
			range.collapse(beginning);
321
			range.select();
322
		}
323
	}
324
}, remove:function () {
325
	if (dojo.doc().selection) {
326
		var selection = dojo.doc().selection;
327
		if (selection.type.toUpperCase() != "NONE") {
328
			selection.clear();
329
		}
330
		return selection;
331
	} else {
332
		var selection = dojo.global().getSelection();
333
		for (var i = 0; i < selection.rangeCount; i++) {
334
			selection.getRangeAt(i).deleteContents();
335
		}
336
		return selection;
337
	}
338
}});
339