| /* |
| 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; |
| } |
| }}); |
| |