if (!dojo._hasResource["dijit._editor.selection"]) { // _hasResource checks // added by build. Do // not use _hasResource // directly in your // code. dojo._hasResource["dijit._editor.selection"] = true; dojo.provide("dijit._editor.selection"); // FIXME: // all of these methods branch internally for IE. This is probably // sub-optimal in terms of runtime performance. We should investigate the // size difference for differentiating at definition time. dojo.mixin(dijit._editor.selection, { getType : function() { // summary: Get the selection type (like document.select.type in // IE). if (dojo.doc["selection"]) { // IE return dojo.doc.selection.type.toLowerCase(); } else { var stype = "text"; // Check if the actual selection is a CONTROL (IMG, TABLE, HR, // etc...). var oSel; try { oSel = dojo.global.getSelection(); } catch (e) { /* squelch */ } if (oSel && oSel.rangeCount == 1) { var oRange = oSel.getRangeAt(0); if ((oRange.startContainer == oRange.endContainer) && ((oRange.endOffset - oRange.startOffset) == 1) && (oRange.startContainer.nodeType != 3 /* text node */)) { stype = "control"; } } return stype; } }, getSelectedText : function() { // summary: // Return the text (no html tags) included in the current selection // or null if no text is selected if (dojo.doc["selection"]) { // IE if (dijit._editor.selection.getType() == 'control') { return null; } return dojo.doc.selection.createRange().text; } else { var selection = dojo.global.getSelection(); if (selection) { return selection.toString(); } } }, getSelectedHtml : function() { // summary: // Return the html of the current selection or null if unavailable if (dojo.doc["selection"]) { // IE if (dijit._editor.selection.getType() == '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; } }, getSelectedElement : function() { // summary: // Retrieves the selected element (if any), just in the case that // a single element (object like and image or a table) is // selected. if (this.getType() == "control") { if (dojo.doc["selection"]) { // IE 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() { // summary: // Get the parent element of the current selection if (this.getType() == "control") { var p = this.getSelectedElement(); if (p) { return p.parentNode; } } else { if (dojo.doc["selection"]) { // IE return dojo.doc.selection.createRange().parentElement(); } else { var selection = dojo.global.getSelection(); if (selection) { var node = selection.anchorNode; while (node && (node.nodeType != 1)) { // not an // element node = node.parentNode; } return node; } } } }, hasAncestorElement : function(/* String */tagName /* ... */) { // summary: // Check whether current selection has a parent element which is // of type tagName (or one of the other specified tagName) return (this.getAncestorElement.apply(this, arguments) != null); }, getAncestorElement : function(/* String */tagName /* ... */) { // summary: // Return the parent element of the current selection which is of // type tagName (or one of the other specified tagName) var node = this.getSelectedElement() || this.getParentElement(); return this.getParentOfType(node, arguments); }, isTag : function(/* DomNode */node, /* Array */tags) { if (node && node.tagName) { var _nlc = node.tagName.toLowerCase(); for (var i = 0; i < tags.length; i++) { var _tlc = String(tags[i]).toLowerCase(); if (_nlc == _tlc) { return _tlc; } } } return ""; }, getParentOfType : function(/* DomNode */node, /* Array */tags) { while (node) { if (this.isTag(node, tags).length) { return node; } node = node.parentNode; } return null; }, remove : function() { // summary: delete current selection var _s = dojo.doc.selection; if (_s) { // IE if (_s.type.toLowerCase() != "none") { _s.clear(); } return _s; } else { _s = dojo.global.getSelection(); _s.deleteFromDocument(); return _s; } }, selectElementChildren : function(/* DomNode */element,/* Boolean? */ nochangefocus) { // summary: // clear previous selection and select the content of the node // (excluding the node itself) var _window = dojo.global; var _document = dojo.doc; element = dojo.byId(element); if (_document.selection && dojo.body().createTextRange) { // IE var range = element.ownerDocument.body.createTextRange(); range.moveToElementText(element); if (!nochangefocus) { range.select(); } } else if (_window["getSelection"]) { var selection = _window.getSelection(); if (selection["setBaseAndExtent"]) { // Safari selection.setBaseAndExtent(element, 0, element, element.innerText.length - 1); } else if (selection["selectAllChildren"]) { // Mozilla selection.selectAllChildren(element); } } }, selectElement : function(/* DomNode */element,/* Boolean? */nochangefocus) { // summary: // clear previous selection and select element (including all its // children) var _document = dojo.doc; element = dojo.byId(element); if (_document.selection && dojo.body().createTextRange) { // IE try { var range = dojo.body().createControlRange(); range.addElement(element); if (!nochangefocus) { range.select(); } } catch (e) { this.selectElementChildren(element, nochangefocus); } } else if (dojo.global["getSelection"]) { var selection = dojo.global.getSelection(); // FIXME: does this work on Safari? if (selection["removeAllRanges"]) { // Mozilla var range = _document.createRange(); range.selectNode(element); selection.removeAllRanges(); selection.addRange(range); } } } }); }