blob: 3a6b063f90fb596bc0882057075a41a62fc14170 [file] [log] [blame]
/*
Copyright (c) 2004-2006, The Dojo Foundation
All Rights Reserved.
Licensed under the Academic Free License version 2.1 or above OR the
modified BSD license. For more information on Dojo licensing, see:
http://dojotoolkit.org/community/licensing.shtml
*/
dojo.require("dojo.html.common");
dojo.provide("dojo.html.selection");
dojo.require("dojo.dom");
dojo.require("dojo.lang.common");
dojo.html.selectionType = {NONE:0, TEXT:1, CONTROL:2};
dojo.html.clearSelection = function () {
var _window = dojo.global();
var _document = dojo.doc();
try {
if (_window["getSelection"]) {
if (dojo.render.html.safari) {
_window.getSelection().collapse();
} else {
_window.getSelection().removeAllRanges();
}
} else {
if (_document.selection) {
if (_document.selection.empty) {
_document.selection.empty();
} else {
if (_document.selection.clear) {
_document.selection.clear();
}
}
}
}
return true;
}
catch (e) {
dojo.debug(e);
return false;
}
};
dojo.html.disableSelection = function (element) {
element = dojo.byId(element) || dojo.body();
var h = dojo.render.html;
if (h.mozilla) {
element.style.MozUserSelect = "none";
} else {
if (h.safari) {
element.style.KhtmlUserSelect = "none";
} else {
if (h.ie) {
element.unselectable = "on";
} else {
return false;
}
}
}
return true;
};
dojo.html.enableSelection = function (element) {
element = dojo.byId(element) || dojo.body();
var h = dojo.render.html;
if (h.mozilla) {
element.style.MozUserSelect = "";
} else {
if (h.safari) {
element.style.KhtmlUserSelect = "";
} else {
if (h.ie) {
element.unselectable = "off";
} else {
return false;
}
}
}
return true;
};
dojo.html.selectElement = function (element) {
dojo.deprecated("dojo.html.selectElement", "replaced by dojo.html.selection.selectElementChildren", 0.5);
};
dojo.html.selectInputText = function (element) {
var _window = dojo.global();
var _document = dojo.doc();
element = dojo.byId(element);
if (_document["selection"] && dojo.body()["createTextRange"]) {
var range = element.createTextRange();
range.moveStart("character", 0);
range.moveEnd("character", element.value.length);
range.select();
} else {
if (_window["getSelection"]) {
var selection = _window.getSelection();
element.setSelectionRange(0, element.value.length);
}
}
element.focus();
};
dojo.html.isSelectionCollapsed = function () {
dojo.deprecated("dojo.html.isSelectionCollapsed", "replaced by dojo.html.selection.isCollapsed", 0.5);
return dojo.html.selection.isCollapsed();
};
dojo.lang.mixin(dojo.html.selection, {getType:function () {
if (dojo.doc()["selection"]) {
return dojo.html.selectionType[dojo.doc().selection.type.toUpperCase()];
} else {
var stype = dojo.html.selectionType.TEXT;
var oSel;
try {
oSel = dojo.global().getSelection();
}
catch (e) {
}
if (oSel && oSel.rangeCount == 1) {
var oRange = oSel.getRangeAt(0);
if (oRange.startContainer == oRange.endContainer && (oRange.endOffset - oRange.startOffset) == 1 && oRange.startContainer.nodeType != dojo.dom.TEXT_NODE) {
stype = dojo.html.selectionType.CONTROL;
}
}
return stype;
}
}, isCollapsed:function () {
var _window = dojo.global();
var _document = dojo.doc();
if (_document["selection"]) {
return _document.selection.createRange().text == "";
} else {
if (_window["getSelection"]) {
var selection = _window.getSelection();
if (dojo.lang.isString(selection)) {
return selection == "";
} else {
return selection.isCollapsed || selection.toString() == "";
}
}
}
}, getSelectedElement:function () {
if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) {
if (dojo.doc()["selection"]) {
var range = dojo.doc().selection.createRange();
if (range && range.item) {
return dojo.doc().selection.createRange().item(0);
}
} else {
var selection = dojo.global().getSelection();
return selection.anchorNode.childNodes[selection.anchorOffset];
}
}
}, getParentElement:function () {
if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) {
var p = dojo.html.selection.getSelectedElement();
if (p) {
return p.parentNode;
}
} else {
if (dojo.doc()["selection"]) {
return dojo.doc().selection.createRange().parentElement();
} else {
var selection = dojo.global().getSelection();
if (selection) {
var node = selection.anchorNode;
while (node && node.nodeType != dojo.dom.ELEMENT_NODE) {
node = node.parentNode;
}
return node;
}
}
}
}, getSelectedText:function () {
if (dojo.doc()["selection"]) {
if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) {
return null;
}
return dojo.doc().selection.createRange().text;
} else {
var selection = dojo.global().getSelection();
if (selection) {
return selection.toString();
}
}
}, getSelectedHtml:function () {
if (dojo.doc()["selection"]) {
if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) {
return null;
}
return dojo.doc().selection.createRange().htmlText;
} else {
var selection = dojo.global().getSelection();
if (selection && selection.rangeCount) {
var frag = selection.getRangeAt(0).cloneContents();
var div = document.createElement("div");
div.appendChild(frag);
return div.innerHTML;
}
return null;
}
}, hasAncestorElement:function (tagName) {
return (dojo.html.selection.getAncestorElement.apply(this, arguments) != null);
}, getAncestorElement:function (tagName) {
var node = dojo.html.selection.getSelectedElement() || dojo.html.selection.getParentElement();
while (node) {
if (dojo.html.selection.isTag(node, arguments).length > 0) {
return node;
}
node = node.parentNode;
}
return null;
}, isTag:function (node, tags) {
if (node && node.tagName) {
for (var i = 0; i < tags.length; i++) {
if (node.tagName.toLowerCase() == String(tags[i]).toLowerCase()) {
return String(tags[i]).toLowerCase();
}
}
}
return "";
}, selectElement:function (element) {
var _window = dojo.global();
var _document = dojo.doc();
element = dojo.byId(element);
if (_document.selection && dojo.body().createTextRange) {
try {
var range = dojo.body().createControlRange();
range.addElement(element);
range.select();
}
catch (e) {
dojo.html.selection.selectElementChildren(element);
}
} else {
if (_window["getSelection"]) {
var selection = _window.getSelection();
if (selection["removeAllRanges"]) {
var range = _document.createRange();
range.selectNode(element);
selection.removeAllRanges();
selection.addRange(range);
}
}
}
}, selectElementChildren:function (element) {
var _window = dojo.global();
var _document = dojo.doc();
element = dojo.byId(element);
if (_document.selection && dojo.body().createTextRange) {
var range = dojo.body().createTextRange();
range.moveToElementText(element);
range.select();
} else {
if (_window["getSelection"]) {
var selection = _window.getSelection();
if (selection["setBaseAndExtent"]) {
selection.setBaseAndExtent(element, 0, element, element.innerText.length - 1);
} else {
if (selection["selectAllChildren"]) {
selection.selectAllChildren(element);
}
}
}
}
}, getBookmark:function () {
var bookmark;
var _document = dojo.doc();
if (_document["selection"]) {
var range = _document.selection.createRange();
bookmark = range.getBookmark();
} else {
var selection;
try {
selection = dojo.global().getSelection();
}
catch (e) {
}
if (selection) {
var range = selection.getRangeAt(0);
bookmark = range.cloneRange();
} else {
dojo.debug("No idea how to store the current selection for this browser!");
}
}
return bookmark;
}, moveToBookmark:function (bookmark) {
var _document = dojo.doc();
if (_document["selection"]) {
var range = _document.selection.createRange();
range.moveToBookmark(bookmark);
range.select();
} else {
var selection;
try {
selection = dojo.global().getSelection();
}
catch (e) {
}
if (selection && selection["removeAllRanges"]) {
selection.removeAllRanges();
selection.addRange(bookmark);
} else {
dojo.debug("No idea how to restore selection for this browser!");
}
}
}, collapse:function (beginning) {
if (dojo.global()["getSelection"]) {
var selection = dojo.global().getSelection();
if (selection.removeAllRanges) {
if (beginning) {
selection.collapseToStart();
} else {
selection.collapseToEnd();
}
} else {
dojo.global().getSelection().collapse(beginning);
}
} else {
if (dojo.doc().selection) {
var range = dojo.doc().selection.createRange();
range.collapse(beginning);
range.select();
}
}
}, remove:function () {
if (dojo.doc().selection) {
var selection = dojo.doc().selection;
if (selection.type.toUpperCase() != "NONE") {
selection.clear();
}
return selection;
} else {
var selection = dojo.global().getSelection();
for (var i = 0; i < selection.rangeCount; i++) {
selection.getRangeAt(i).deleteContents();
}
return selection;
}
}});