Subversion Repositories Applications.papyrus

Rev

Rev 1318 | Blame | Compare with Previous | Last modification | View Log | RSS feed

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