betajs/betajs-browser

View on GitHub
src/dom/selection.js

Summary

Maintainability
D
1 day
Test Coverage
Scoped.define("module:Selection", [
    "module:Dom"
], function(Dom) {
    return {

        /** @suppress {checkTypes} */
        selectNode: function(node, offset) {
            var selection = null;
            var range = null;
            if (window.getSelection) {
                selection = window.getSelection();
                selection.removeAllRanges();
                range = document.createRange();
            } else if (document.selection) {
                selection = document.selection;
                range = selection.createRange();
            }
            if (offset) {
                range.setStart(node, offset);
                range.setEnd(node, offset);
                selection.addRange(range);
            } else {
                range.selectNode(node);
                selection.addRange(range);
            }
        },

        /** @suppress {checkTypes} */
        selectedHtml: function() {
            if (window.getSelection)
                return window.getSelection().toString();
            else if (document.selection)
                return document.selection.createRange().htmlText;
            return "";
        },

        /** @suppress {checkTypes} */
        selectionStartOffset: function() {
            if (window.getSelection)
                return window.getSelection().getRangeAt(0).startOffset;
            else if (document.selection)
                return document.selection.createRange().startOffset;
            return null;
        },

        /** @suppress {checkTypes} */
        selectionEndOffset: function() {
            if (window.getSelection)
                return window.getSelection().getRangeAt(0).endOffset;
            else if (document.selection)
                return document.selection.createRange().endOffset;
            return null;
        },

        /** @suppress {checkTypes} */
        selectionNonEmpty: function() {
            var start = this.selectionStart();
            var end = this.selectionEnd();
            return start && end && start && end && (start != end || this.selectionStartOffset() != this.selectionEndOffset());
        },

        /** @suppress {checkTypes} */
        selectionContained: function(node) {
            return node.contains(this.selectionStart()) && node.contains(this.selectionEnd());
        },

        /** @suppress {checkTypes} */
        selectionNodes: function() {
            var result = [];
            var start = this.selectionStart();
            var end = this.selectionEnd();
            result.push(start);
            var current = start;
            while (current != end) {
                current = Dom.traverseNext(current);
                result.push(current);
            }
            return result;
        },

        /** @suppress {checkTypes} */
        selectionLeaves: function() {
            return this.selectionNodes().filter(function(node) {
                return !node.hasChildNodes();
            });
        },

        /** @suppress {checkTypes} */
        selectionStartNode: function() {
            if (window.getSelection)
                return window.getSelection().getRangeAt(0).startContainer;
            else if (document.selection)
                return document.selection.createRange().startContainer;
            return null;
        },

        /** @suppress {checkTypes} */
        selectionAncestor: function() {
            if (window.getSelection)
                return window.getSelection().getRangeAt(0).commonAncestorContainer;
            else if (document.selection)
                return document.selection.createRange().parentElement();
            return null;
        },

        /** @suppress {checkTypes} */
        selectionStart: function() {
            if (window.getSelection)
                return window.getSelection().getRangeAt(0).startContainer;
            else if (document.selection)
                return document.selection.createRange().startContainer;
            return null;
        },

        /** @suppress {checkTypes} */
        selectionEnd: function() {
            if (window.getSelection)
                return window.getSelection().getRangeAt(0).endContainer;
            else if (document.selection)
                return document.selection.createRange().endContainer;
            return null;
        },

        /** @suppress {checkTypes} */
        selectionSplitOffsets: function() {
            var startOffset = this.selectionStartOffset();
            var endOffset = this.selectionEndOffset();
            var start = this.selectionStart();
            var end = this.selectionEnd();
            var single = start == end;
            if (endOffset < end.wholeText.length) {
                end.splitText(endOffset);
                if (single)
                    start = end;
            }
            if (startOffset > 0) {
                start = start.splitText(startOffset);
                if (single)
                    end = start;
            }
            this.selectRange(start, end);
        },

        /** @suppress {checkTypes} */
        selectRange: function(start_node, end_node, start_offset, end_offset) {
            var selection = null;
            var range = null;
            if (window.getSelection) {
                selection = window.getSelection();
                selection.removeAllRanges();
                range = document.createRange();
            } else if (document.selection) {
                selection = document.selection;
                range = selection.createRange();
            }
            range.setStart(start_node, start_offset || 0);
            range.setEnd(end_node, end_offset || end_node.data.length);
            selection.addRange(range);
        }

    };
});