You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@corinthia.apache.org by ja...@apache.org on 2015/08/14 15:23:05 UTC

[44/84] [partial] incubator-corinthia git commit: Moved experimentel code to /experiments

http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/8eda56a5/Editor/src/Selection.js
----------------------------------------------------------------------
diff --git a/Editor/src/Selection.js b/Editor/src/Selection.js
deleted file mode 100644
index c4f8efb..0000000
--- a/Editor/src/Selection.js
+++ /dev/null
@@ -1,1430 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-// FIXME: cursor does not display correctly if it is after a space at the end of the line
-
-var Selection_isMarked;
-var Selection_get;
-var Selection_set;
-var Selection_clear;
-
-var Selection_update;
-var Selection_selectAll;
-var Selection_selectParagraph;
-var Selection_selectWordAtCursor;
-var Selection_dragSelectionBegin;
-var Selection_dragSelectionUpdate;
-var Selection_moveStartLeft;
-var Selection_moveStartRight;
-var Selection_moveEndLeft;
-var Selection_moveEndRight;
-var Selection_setSelectionStartAtCoords;
-var Selection_setSelectionEndAtCoords;
-var Selection_setTableSelectionEdgeAtCoords;
-var Selection_setEmptySelectionAt;
-var Selection_deleteRangeContents;
-var Selection_deleteContents;
-var Selection_clearSelection;
-var Selection_preserveWhileExecuting;
-var Selection_posAtStartOfWord;
-var Selection_posAtEndOfWord;
-var Selection_preferElementPositions;
-var Selection_print;
-
-(function() {
-
-    var HANDLE_NONE = 0;
-    var HANDLE_START = 1;
-    var HANDLE_END = 2;
-
-    var activeHandle = HANDLE_NONE;
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////
-    //                                                                                            //
-    //                                 Selection getter and setter                                //
-    //                                                                                            //
-    ////////////////////////////////////////////////////////////////////////////////////////////////
-
-    var Selection_setInternal;
-
-    (function() {
-
-        var selection = new Object();
-
-        Selection_isMarked = function()
-        {
-            if (selection.value == null)
-                return null;
-            else
-                return selection.value.isMarked;
-        }
-
-        // public
-        Selection_get = function()
-        {
-            if (selection.value == null)
-                return null;
-            else
-                return new Range(selection.value.startNode,selection.value.startOffset,
-                                 selection.value.endNode,selection.value.endOffset);
-        }
-
-        // public
-        Selection_setInternal =
-            function(newStartNode,newStartOffset,newEndNode,newEndOffset,isMarked)
-        {
-            var range = new Range(newStartNode,newStartOffset,newEndNode,newEndOffset);
-            if (!Range_isForwards(range))
-                range = new Range(newEndNode,newEndOffset,newStartNode,newStartOffset);
-            range = boundaryCompliantRange(range);
-
-            UndoManager_setProperty(selection,"value",
-                                    { startNode: range.start.node,
-                                      startOffset: range.start.offset,
-                                      endNode: range.end.node,
-                                      endOffset: range.end.offset,
-                                      isMarked: isMarked });
-        }
-
-        Selection_set = function(newStartNode,newStartOffset,newEndNode,newEndOffset,
-                                 keepActiveHandle,isMarked)
-        {
-            Selection_setInternal(newStartNode,newStartOffset,newEndNode,newEndOffset,isMarked);
-            Selection_update();
-            if (!keepActiveHandle)
-                activeHandle = HANDLE_NONE;
-        }
-
-        // public
-        Selection_clear = function()
-        {
-            UndoManager_setProperty(selection,"value",null);
-            Selection_update();
-        }
-    })();
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////
-    //                                                                                            //
-    //                                  Other selection functions                                 //
-    //                                                                                            //
-    ////////////////////////////////////////////////////////////////////////////////////////////////
-
-    var selectionDivs = new Array();
-    var selectionHighlights = new Array();
-    var tableSelection = null;
-
-    // private
-    updateTableSelection = function(selRange)
-    {
-        tableSelection = Tables_regionFromRange(selRange);
-        if (tableSelection == null)
-            return false;
-
-        Range_trackWhileExecuting(selRange,function() {
-
-            removeSelectionHighlights(getRangeData(null));
-
-            var sel = tableSelection;
-
-            var topLeftTD = Table_get(sel.structure,sel.top,sel.left);
-            var bottomRightTD = Table_get(sel.structure,sel.bottom,sel.right);
-
-            var topLeftRect = topLeftTD.element.getBoundingClientRect();
-            var bottomRightRect = bottomRightTD.element.getBoundingClientRect();
-
-            var left = topLeftRect.left;
-            var top = topLeftRect.top;
-
-            var bottom = bottomRightRect.bottom;
-            var right = bottomRightRect.right;
-
-            var x = left;
-            var y = top;
-            var width = right - left;
-            var height = bottom - top;
-
-            x += window.scrollX;
-            y += window.scrollY;
-
-            var div = makeSelectionDiv();
-            DOM_setAttribute(div,"class",Keys.SELECTION_HIGHLIGHT);
-            DOM_setStyleProperties(div,{ "position": "absolute",
-                                         "left": x+"px",
-                                         "top": y+"px",
-                                         "width": width+"px",
-                                         "height": height+"px",
-                                         "background-color": "rgb(201,221,238)",
-                                         "z-index": -1 });
-
-            setTableEdges(x,y,width,height);
-            setEditorHandles({ type: "table", x: x, y: y, width: width, height: height });
-        });
-
-        Selection_setInternal(selRange.start.node,selRange.start.offset,
-                              selRange.end.node,selRange.end.offset);
-
-        return true;
-    }
-
-    function makeSelectionDiv()
-    {
-        var div = DOM_createElement(document,"DIV");
-        DOM_appendChild(document.body,div);
-        selectionDivs.push(div);
-        return div;
-    }
-
-    function setTableEdges(x,y,width,height)
-    {
-        var left = makeSelectionDiv();
-        var right = makeSelectionDiv();
-        var top = makeSelectionDiv();
-        var bottom = makeSelectionDiv();
-
-        var thick = 2;
-        width++;
-        height++;
-        setBoxCoords(left,x-thick,y-thick,thick,height+2*thick);
-        setBoxCoords(right,x+width,y-thick,thick,height+2*thick);
-        setBoxCoords(top,x-thick,y-thick,width+2*thick,thick);
-        setBoxCoords(bottom,x-thick,y+height,width+2*thick,thick);
-
-        function setBoxCoords(box,x,y,width,height)
-        {
-            DOM_setStyleProperties(box,{ "position": "absolute",
-                                         "left": x+"px",
-                                         "top": y+"px",
-                                         "width": width+"px",
-                                         "height": height+"px",
-                                         "background-color": "blue",
-                                         "z-index": 1 });
-        }
-    }
-
-    var editorHandles = { type: "none" };
-    function setEditorHandles(info)
-    {
-        var oldEditorHandles = editorHandles;
-        editorHandles = info;
-        UndoManager_addAction(function() {
-            setEditorHandles(oldEditorHandles);
-        });
-        if (info.type == "cursor") {
-            Editor_setCursor(info.left,info.top,info.width,info.height);
-        }
-        else if (info.type == "selection") {
-            if (!Selection_isMarked()) {
-                Editor_setSelectionHandles(info.x1,info.y1,
-                                           info.height1,info.x2,info.y2,info.height2);
-            }
-            Editor_setSelectionBounds(info.boundsLeft,info.boundsTop,
-                                      info.boundsRight,info.boundsBottom);
-        }
-        else if (info.type == "none") {
-            Editor_clearSelectionHandlesAndCursor();
-        }
-        else if (info.type == "table") {
-            Editor_setTableSelection(info.x,info.y,info.width,info.height);
-        }
-        else {
-            throw new Error("setEditorHandles: unknown type "+type);
-        }
-    }
-
-    function getPrevHighlightText(node)
-    {
-        if ((node.previousSibling != null) &&
-            isSelectionHighlight(node.previousSibling) &&
-            (node.previousSibling.lastChild != null) &&
-            (node.previousSibling.lastChild.nodeType == Node.TEXT_NODE))
-            return node.previousSibling.lastChild;
-        else
-            return null;
-    }
-
-    function getNextHighlightText(node)
-    {
-        if ((node.nextSibling != null) &&
-            isSelectionHighlight(node.nextSibling) &&
-            (node.nextSibling.firstChild != null) &&
-            (node.nextSibling.firstChild.nodeType == Node.TEXT_NODE))
-            return node.nextSibling.firstChild;
-        else
-            return null;
-    }
-
-    function getTextNodeBefore(node)
-    {
-        var prev = node.previousSibling;
-        if ((prev != null) && (prev.nodeType == Node.TEXT_NODE)) {
-            return prev;
-        }
-        else {
-            var text = DOM_createTextNode(document,"");
-            DOM_insertBefore(node.parentNode,text,node);
-            return text;
-        }
-    }
-
-    function getTextNodeAfter(node)
-    {
-        var next = node.nextSibling;
-        if ((next != null) && (next.nodeType == Node.TEXT_NODE)) {
-            return next;
-        }
-        else {
-            var text = DOM_createTextNode(document,"");
-            DOM_insertBefore(node.parentNode,text,node.nextSibling);
-            return text;
-        }
-    }
-
-    function setSelectionHighlights(highlights)
-    {
-        UndoManager_addAction(setSelectionHighlights,selectionHighlights);
-        selectionHighlights = highlights;
-    }
-
-    function createSelectionHighlights(data)
-    {
-        var newHighlights = arrayCopy(selectionHighlights);
-
-        var outermost = data.outermost;
-        for (var i = 0; i < outermost.length; i++) {
-            recurse(outermost[i]);
-        }
-
-        setSelectionHighlights(newHighlights);
-
-        function recurse(node)
-        {
-            if (isSpecialBlockNode(node)) {
-                if (!isSelectionHighlight(node.parentNode)) {
-                    var wrapped = DOM_wrapNode(node,"DIV");
-                    DOM_setAttribute(wrapped,"class",Keys.SELECTION_CLASS);
-                    newHighlights.push(wrapped);
-                }
-            }
-            else if (isNoteNode(node)) {
-                if (!isSelectionHighlight(node.parentNode)) {
-                    var wrapped = DOM_wrapNode(node,"SPAN");
-                    DOM_setAttribute(wrapped,"class",Keys.SELECTION_CLASS);
-                    newHighlights.push(wrapped);
-                }
-            }
-            else if (node.nodeType == Node.TEXT_NODE) {
-                createTextHighlight(node,data,newHighlights);
-            }
-            else {
-                var next;
-                for (var child = node.firstChild; child != null; child = next) {
-                    next = child.nextSibling;
-                    recurse(child);
-                }
-            }
-        }
-    }
-
-    function createTextHighlight(node,data,newHighlights)
-    {
-        var selRange = data.range;
-        if (isSelectionHighlight(node.parentNode)) {
-
-            if ((node == selRange.end.node) && (node.nodeValue.length > selRange.end.offset)) {
-                var destTextNode = getTextNodeAfter(node.parentNode);
-                DOM_moveCharacters(node,
-                                   selRange.end.offset,
-                                   node.nodeValue.length,
-                                   destTextNode,0,
-                                   true,false);
-            }
-            if ((node == selRange.start.node) && (selRange.start.offset > 0)) {
-                var destTextNode = getTextNodeBefore(node.parentNode);
-                DOM_moveCharacters(node,
-                                   0,
-                                   selRange.start.offset,
-                                   destTextNode,destTextNode.nodeValue.length,
-                                   false,true);
-            }
-
-            return;
-        }
-
-        var anext;
-        for (var a = node; a != null; a = anext) {
-            anext = a.parentNode;
-            if (isSelectionHighlight(a))
-                DOM_removeNodeButKeepChildren(a);
-        }
-
-        if (node == selRange.end.node) {
-            if (isWhitespaceString(node.nodeValue.substring(0,selRange.end.offset)))
-                return;
-            Formatting_splitTextAfter(selRange.end,
-                                      function() { return true; });a
-        }
-
-
-        if (node == selRange.start.node) {
-            if (isWhitespaceString(node.nodeValue.substring(selRange.start.offset)))
-                return;
-            Formatting_splitTextBefore(selRange.start,
-                                       function() { return true; });
-        }
-
-        var prevText = getPrevHighlightText(node);
-        var nextText = getNextHighlightText(node);
-
-        if ((prevText != null) && containsSelection(data.nodeSet,prevText)) {
-            DOM_moveCharacters(node,0,node.nodeValue.length,
-                               prevText,prevText.nodeValue.length,true,false);
-            DOM_deleteNode(node);
-        }
-        else if ((nextText != null) && containsSelection(data.nodeSet,nextText)) {
-            DOM_moveCharacters(node,0,node.nodeValue.length,
-                               nextText,0,false,true);
-            DOM_deleteNode(node);
-        }
-        else if (!isWhitespaceTextNode(node)) {
-            // Call moveCharacters() with an empty range, to force any tracked positions
-            // that are at the end of prevText or the start of nextText to move into this
-            // node
-            if (prevText != null) {
-                DOM_moveCharacters(prevText,
-                                   prevText.nodeValue.length,prevText.nodeValue.length,
-                                   node,0);
-            }
-            if (nextText != null) {
-                DOM_moveCharacters(nextText,0,0,node,node.nodeValue.length);
-            }
-
-            var wrapped = DOM_wrapNode(node,"SPAN");
-            DOM_setAttribute(wrapped,"class",Keys.SELECTION_CLASS);
-            newHighlights.push(wrapped);
-        }
-    }
-
-    function getRangeData(selRange)
-    {
-        var nodeSet = new NodeSet();
-        var nodes;
-        var outermost;
-        if (selRange != null) {
-            outermost = Range_getOutermostNodes(selRange);
-            nodes = Range_getAllNodes(selRange);
-            for (var i = 0; i < nodes.length; i++)
-                nodeSet.add(nodes[i]);
-        }
-        else {
-            nodes = new Array();
-            outermost = new Array();
-        }
-        return { range: selRange, nodeSet: nodeSet, nodes: nodes, outermost: outermost };
-    }
-
-    function removeSelectionHighlights(data,force)
-    {
-        var selectedSet = data.nodeSet;
-
-        var remainingHighlights = new Array();
-        var checkMerge = new Array();
-        for (var i = 0; i < selectionHighlights.length; i++) {
-            var span = selectionHighlights[i];
-            if ((span.parentNode != null) && (force || !containsSelection(selectedSet,span))) {
-                if (span.firstChild != null)
-                    checkMerge.push(span.firstChild);
-                if (span.lastChild != null)
-                    checkMerge.push(span.lastChild);
-
-                DOM_removeNodeButKeepChildren(span);
-            }
-            else if (span.parentNode != null) {
-                remainingHighlights.push(span);
-            }
-        }
-        setSelectionHighlights(remainingHighlights);
-
-        for (var i = 0; i < checkMerge.length; i++) {
-            // if not already merged
-            if ((checkMerge[i] != null) && (checkMerge[i].parentNode != null)) {
-                Formatting_mergeWithNeighbours(checkMerge[i],{});
-            }
-        }
-    }
-
-    function containsSelection(selectedSet,node)
-    {
-        if (selectedSet.contains(node))
-            return true;
-        for (var child = node.firstChild; child != null; child = child.nextSibling) {
-            if (containsSelection(selectedSet,child))
-                return true;
-        }
-        return false;
-    }
-
-    Selection_update = function()
-    {
-        var selRange = Selection_get();
-        var selMarked = Selection_isMarked();
-
-        Range_trackWhileExecuting(selRange,function() {
-            // Remove table selection DIVs
-            for (var i = 0; i < selectionDivs.length; i++)
-                DOM_deleteNode(selectionDivs[i]);
-            selectionDivs = new Array();
-        });
-
-        if (selRange == null) {
-            DOM_ignoreMutationsWhileExecuting(function() {
-                removeSelectionHighlights(getRangeData(null));
-            });
-            return;
-        }
-
-        Range_assertValid(selRange,"Selection");
-
-        if (Range_isEmpty(selRange)) {
-            // We just have a cursor
-
-            Range_trackWhileExecuting(selRange,function() {
-                DOM_ignoreMutationsWhileExecuting(function() {
-                    removeSelectionHighlights(getRangeData(selRange));
-                });
-            });
-            // Selection may have changed as a result of removeSelectionHighlights()
-            Selection_setInternal(selRange.start.node,selRange.start.offset,
-                                  selRange.end.node,selRange.end.offset,
-                                  selMarked);
-            selRange = Selection_get(); // since setInternal can theoretically change it
-
-            // If we can't find the cursor rect for some reason, just don't update the position.
-            // This is better than using an incorrect position or throwing an exception.
-            var rect = Position_displayRectAtPos(selRange.end);
-            if (rect != null) {
-                var left = rect.left + window.scrollX;
-                var top = rect.top + window.scrollY;
-                var height = rect.height;
-                var width = rect.width ? rect.width : 2;
-                setEditorHandles({ type: "cursor",
-                                   left: left,
-                                   top: top,
-                                   width: width,
-                                   height: height});
-            }
-            return;
-        }
-
-        if (updateTableSelection(selRange))
-            return;
-
-        var rects = Range_getClientRects(selRange);
-
-        if ((rects != null) && (rects.length > 0)) {
-            var boundsLeft = null;
-            var boundsRight = null;
-            var boundsTop = null;
-            var boundsBottom = null
-
-            for (var i = 0; i < rects.length; i++) {
-                var left = rects[i].left + window.scrollX;
-                var top = rects[i].top + window.scrollY;
-                var width = rects[i].width;
-                var height = rects[i].height;
-                var right = left + width;
-                var bottom = top + height;
-
-                if (boundsLeft == null) {
-                    boundsLeft = left;
-                    boundsTop = top;
-                    boundsRight = right;
-                    boundsBottom = bottom;
-                }
-                else {
-                    if (boundsLeft > left)
-                        boundsLeft = left;
-                    if (boundsRight < right)
-                        boundsRight = right;
-                    if (boundsTop > top)
-                        boundsTop = top;
-                    if (boundsBottom < bottom)
-                        boundsBottom = bottom;
-                }
-            }
-
-            Range_trackWhileExecuting(selRange,function() {
-                DOM_ignoreMutationsWhileExecuting(function() {
-                    var data = getRangeData(selRange);
-                    createSelectionHighlights(data);
-                    removeSelectionHighlights(data);
-                });
-            });
-
-            // Selection may have changed as a result of create/removeSelectionHighlights()
-            Selection_setInternal(selRange.start.node,selRange.start.offset,
-                                  selRange.end.node,selRange.end.offset,
-                                  selMarked);
-
-            var firstRect = rects[0];
-            var lastRect = rects[rects.length-1];
-
-            var x1 = firstRect.left + window.scrollX;
-            var y1 = firstRect.top + window.scrollY;
-            var height1 = firstRect.height;
-            var x2 = lastRect.right + window.scrollX;
-            var y2 = lastRect.top + window.scrollY;
-            var height2 = lastRect.height;
-
-            setEditorHandles({ type: "selection",
-                               x1: x1,
-                               y1: y1,
-                               height1: height1,
-                               x2: x2,
-                               y2: y2,
-                               height2: height2,
-                               boundsLeft: boundsLeft,
-                               boundsTop: boundsTop,
-                               boundsRight: boundsRight,
-                               boundsBottom: boundsBottom });;
-
-        }
-        else {
-            setEditorHandles({ type: "none" });
-        }
-        return;
-
-        function getAbsoluteOffset(node)
-        {
-            var offsetLeft = 0;
-            var offsetTop = 0;
-            for (; node != null; node = node.parentNode) {
-                if (node.offsetLeft != null)
-                    offsetLeft += node.offsetLeft;
-                if (node.offsetTop != null)
-                    offsetTop += node.offsetTop;
-            }
-            return { offsetLeft: offsetLeft, offsetTop: offsetTop };
-        }
-    }
-
-    // public
-    Selection_selectAll = function()
-    {
-        Selection_set(document.body,0,document.body,document.body.childNodes.length);
-    }
-
-    // public
-    Selection_selectParagraph = function()
-    {
-        var selRange = Selection_get();
-        if (selRange == null)
-            return;
-        var startNode = Position_closestActualNode(selRange.start);
-        while (!isParagraphNode(startNode) && !isContainerNode(startNode))
-            startNode = startNode.parentNode;
-
-        var endNode = Position_closestActualNode(selRange.end);
-        while (!isParagraphNode(endNode) && !isContainerNode(endNode))
-            endNode = endNode.parentNode;
-
-        var startPos = new Position(startNode,0);
-        var endPos = new Position(endNode,DOM_maxChildOffset(endNode));
-        startPos = Position_closestMatchForwards(startPos,Position_okForMovement);
-        endPos = Position_closestMatchBackwards(endPos,Position_okForMovement);
-
-        Selection_set(startPos.node,startPos.offset,endPos.node,endPos.offset);
-    }
-
-    // private
-    function getPunctuationCharsForRegex()
-    {
-        var escaped = "^$\\.*+?()[]{}|"; // From ECMAScript regexp spec (PatternCharacter)
-        var unescaped = "";
-        for (var i = 32; i <= 127; i++) {
-            var c = String.fromCharCode(i);
-            if ((escaped.indexOf(c) < 0) && !c.match(/[\w\d]/))
-                unescaped += c;
-        }
-        return unescaped + escaped.replace(/(.)/g,"\\$1");
-    }
-
-    // The following regular expressions are used by selectWordAtCursor(). We initialise them at
-    // startup to avoid repeatedly initialising them.
-    var punctuation = getPunctuationCharsForRegex();
-    var wsPunctuation = "\\s"+punctuation;
-
-    // Note: We use a blacklist of punctuation characters here instead of a whitelist of "word"
-    // characters, as the \w character class in javascript regular expressions only matches
-    // characters in english words. By using a blacklist, and assuming every other character is
-    // part of a word, we can select words containing non-english characters. This isn't a perfect
-    // solution, because there are many unicode characters that represent punctuation as well, but
-    // at least we handle the common ones here.
-
-    var reOtherEnd = new RegExp("["+wsPunctuation+"]*$");
-    var reOtherStart = new RegExp("^["+wsPunctuation+"]*");
-    var reWordOtherEnd = new RegExp("[^"+wsPunctuation+"]*["+wsPunctuation+"]*$");
-    var reWordOtherStart = new RegExp("^["+wsPunctuation+"]*[^"+wsPunctuation+"]*");
-
-    var reWordStart = new RegExp("^[^"+wsPunctuation+"]+");
-    var reWordEnd = new RegExp("[^"+wsPunctuation+"]+$");
-
-    Selection_posAtStartOfWord = function(pos)
-    {
-        var node = pos.node;
-        var offset = pos.offset;
-
-        if (node.nodeType == Node.TEXT_NODE) {
-            var before = node.nodeValue.substring(0,offset);
-            var matches = before.match(reWordEnd);
-            if (matches) {
-                var wordStart = offset - matches[0].length;
-                return new Position(node,wordStart);
-            }
-        }
-
-        return pos;
-    }
-
-    Selection_posAtEndOfWord = function(pos)
-    {
-        var node = pos.node;
-        var offset = pos.offset;
-
-        if (node.nodeType == Node.TEXT_NODE) {
-            var after = node.nodeValue.substring(offset);
-            var matches = after.match(reWordStart);
-            if (matches) {
-                var wordEnd = offset + matches[0].length;
-                return new Position(node,wordEnd);
-            }
-        }
-
-        return pos;
-    }
-
-    function rangeOfWordAtPos(pos)
-    {
-        var node = pos.node;
-        var offset = pos.offset;
-
-        if (node.nodeType == Node.TEXT_NODE) {
-            var before = node.nodeValue.substring(0,offset);
-            var after = node.nodeValue.substring(offset);
-
-            var otherBefore = before.match(reOtherEnd)[0];
-            var otherAfter = after.match(reOtherStart)[0];
-
-            var wordOtherBefore = before.match(reWordOtherEnd)[0];
-            var wordOtherAfter = after.match(reWordOtherStart)[0];
-
-            var startOffset = offset;
-            var endOffset = offset;
-
-            var haveWordBefore = (wordOtherBefore.length != otherBefore.length);
-            var haveWordAfter = (wordOtherAfter.length != otherAfter.length);
-
-            if ((otherBefore.length == 0) && (otherAfter.length == 0)) {
-                startOffset = offset - wordOtherBefore.length;
-                endOffset = offset + wordOtherAfter.length;
-            }
-            else if (haveWordBefore && !haveWordAfter) {
-                startOffset = offset - wordOtherBefore.length;
-            }
-            else if (haveWordAfter && !haveWordBefore) {
-                endOffset = offset + wordOtherAfter.length;
-            }
-            else if (otherBefore.length <= otherAfter.length) {
-                startOffset = offset - wordOtherBefore.length;
-            }
-            else {
-                endOffset = offset + wordOtherAfter.length;
-            }
-
-            return new Range(node,startOffset,node,endOffset);
-        }
-        else if (node.nodeType == Node.ELEMENT_NODE) {
-            var nodeBefore = node.childNodes[offset-1];
-            var nodeAfter = node.childNodes[offset];
-
-            if ((nodeBefore != null) && !isWhitespaceTextNode(nodeBefore))
-                return new Range(node,offset-1,node,offset);
-            else if ((nodeAfter != null) && !isWhitespaceTextNode(nodeAfter))
-                return new Range(node,offset,node,offset+1);
-        }
-
-        return null;
-    }
-
-    // public
-    Selection_selectWordAtCursor = function()
-    {
-        var selRange = Selection_get();
-        if (selRange == null)
-            return;
-
-        var pos = Position_closestMatchBackwards(selRange.end,Position_okForMovement);
-        var range = rangeOfWordAtPos(pos);
-        if (range != null) {
-            Selection_set(range.start.node,range.start.offset,range.end.node,range.end.offset);
-        }
-    }
-
-    // public
-    Selection_dragSelectionBegin = function(x,y,selectWord)
-    {
-        var pos = Position_closestMatchForwards(Position_atPoint(x,y),Position_okForMovement);
-
-        if (pos == null) {
-            Selection_clear();
-            return "error";
-        }
-
-        Selection_set(pos.node,pos.offset,pos.node,pos.offset);
-
-        if (selectWord)
-            Selection_selectWordAtCursor();
-
-        return "end";
-    }
-
-    var selectionHandleEnd = true;
-
-    function toStartOfWord(pos)
-    {
-        if (Input_isAtWordBoundary(pos,"backward"))
-            return pos;
-        var boundary = Input_toWordBoundary(pos,"backward");
-        return (boundary != null) ? boundary : pos;
-    }
-
-    function toEndOfWord(pos)
-    {
-        if (Input_isAtWordBoundary(pos,"forward"))
-            return pos;
-        var boundary = Input_toWordBoundary(pos,"forward");
-        return (boundary != null) ? boundary : pos;
-    }
-
-    // public
-    Selection_dragSelectionUpdate = function(x,y,selectWord)
-    {
-        y = Cursor_scrollDocumentForY(y);
-
-        var pos = Position_closestMatchForwards(Position_atPoint(x,y),Position_okForMovement);
-        var selRange = Selection_get();
-        if ((pos == null) || (selRange == null))
-            return "none";
-
-        var start = selRange.start;
-        var end = selRange.end;
-
-        if (selectionHandleEnd) {
-            if (Position_compare(pos,start) < 0) {
-                if (selectWord)
-                    pos = toStartOfWord(pos);
-                selectionHandleEnd = false;
-            }
-            else {
-                if (selectWord)
-                    pos = toEndOfWord(pos);
-            }
-            Selection_set(start.node,start.offset,pos.node,pos.offset);
-        }
-        else {
-            if (Position_compare(pos,end) > 0) {
-                if (selectWord)
-                    pos = toEndOfWord(pos);
-                selectionHandleEnd = true;
-            }
-            else {
-                if (selectWord)
-                    pos = toStartOfWord(pos);
-            }
-            Selection_set(pos.node,pos.offset,end.node,end.offset);
-        }
-
-        return selectionHandleEnd ? "end" : "start";
-    }
-
-    function moveBoundary(command)
-    {
-        var range = Selection_get();
-        if (range == null)
-            return;
-
-        var pos = null;
-        if (command == "start-left")
-            range.start = pos = Position_prevMatch(range.start,Position_okForMovement);
-        else if (command == "start-right")
-            range.start = pos = Position_nextMatch(range.start,Position_okForMovement);
-        else if (command == "end-left")
-            range.end = pos = Position_prevMatch(range.end,Position_okForMovement);
-        else if (command == "end-right")
-            range.end = pos = Position_nextMatch(range.end,Position_okForMovement);
-
-        if ((range.start != null) && (range.end != null)) {
-            var result;
-            range = Range_forwards(range);
-            Selection_set(range.start.node,range.start.offset,range.end.node,range.end.offset);
-            if (range.end == pos)
-                return "end";
-            else if (range.end == pos)
-                return "start";
-        }
-        return null;
-    }
-
-    // public
-    Selection_moveStartLeft = function()
-    {
-        return moveBoundary("start-left");
-    }
-
-    // public
-    Selection_moveStartRight = function()
-    {
-        return moveBoundary("start-right");
-    }
-
-    // public
-    Selection_moveEndLeft = function()
-    {
-        return moveBoundary("end-left");
-    }
-
-    // public
-    Selection_moveEndRight = function()
-    {
-        return moveBoundary("end-right");
-    }
-
-    // public
-    Selection_setSelectionStartAtCoords = function(x,y)
-    {
-        var position = Position_closestMatchForwards(Position_atPoint(x,y),Position_okForMovement);
-        if (position != null) {
-            position = Position_closestMatchBackwards(position,Position_okForMovement);
-            var selRange = Selection_get();
-            var newRange = new Range(position.node,position.offset,
-                                     selRange.end.node,selRange.end.offset);
-            if (Range_isForwards(newRange)) {
-                Selection_set(newRange.start.node,newRange.start.offset,
-                              newRange.end.node,newRange.end.offset);
-            }
-        }
-    }
-
-    // public
-    Selection_setSelectionEndAtCoords = function(x,y)
-    {
-        var position = Position_closestMatchForwards(Position_atPoint(x,y),Position_okForMovement);
-        if (position != null) {
-            position = Position_closestMatchBackwards(position,Position_okForMovement);
-            var selRange = Selection_get();
-            var newRange = new Range(selRange.start.node,selRange.start.offset,
-                                     position.node,position.offset);
-            if (Range_isForwards(newRange)) {
-                Selection_set(newRange.start.node,newRange.start.offset,
-                              newRange.end.node,newRange.end.offset);
-            }
-        }
-    }
-
-    // public
-    Selection_setTableSelectionEdgeAtCoords = function(edge,x,y)
-    {
-        if (tableSelection == null)
-            return;
-
-        var structure = tableSelection.structure;
-        var pointInfo = findCellInTable(structure,x,y);
-        if (pointInfo == null)
-            return;
-
-        if (edge == "topLeft") {
-            if (pointInfo.row <= tableSelection.bottom)
-                tableSelection.top = pointInfo.row;
-            if (pointInfo.col <= tableSelection.right)
-                tableSelection.left = pointInfo.col;
-        }
-        else if (edge == "bottomRight") {
-            if (pointInfo.row >= tableSelection.top)
-                tableSelection.bottom = pointInfo.row;
-            if (pointInfo.col >= tableSelection.left)
-                tableSelection.right = pointInfo.col;
-        }
-
-        // FIXME: handle the case where there is no cell at the specified row and column
-        var topLeftCell = Table_get(structure,tableSelection.top,tableSelection.left);
-        var bottomRightCell = Table_get(structure,tableSelection.bottom,tableSelection.right);
-
-        var topLeftNode = topLeftCell.element.parentNode;
-        var topLeftOffset = DOM_nodeOffset(topLeftCell.element);
-        var bottomRightNode = bottomRightCell.element.parentNode;
-        var bottomRightOffset = DOM_nodeOffset(bottomRightCell.element)+1;
-
-        Selection_set(topLeftNode,topLeftOffset,bottomRightNode,bottomRightOffset);
-
-        // FIXME: this could possibly be optimised
-        function findCellInTable(structure,x,y)
-        {
-            for (var r = 0; r < structure.numRows; r++) {
-                for (var c = 0; c < structure.numCols; c++) {
-                    var cell = Table_get(structure,r,c);
-                    if (cell != null) {
-                        var rect = cell.element.getBoundingClientRect();
-                        if ((x >= rect.left) && (x <= rect.right) &&
-                            (y >= rect.top) && (y <= rect.bottom))
-                            return cell;
-                    }
-                }
-            }
-            return null;
-        }
-    }
-
-    // public
-    Selection_setEmptySelectionAt = function(node,offset)
-    {
-        Selection_set(node,offset,node,offset);
-    }
-
-    // private
-    function deleteTextSelection(selRange,keepEmpty)
-    {
-        var nodes = Range_getOutermostNodes(selRange);
-        for (var i = 0; i < nodes.length; i++) {
-            var node = nodes[i];
-
-            var removeWholeNode = false;
-
-            if ((node == selRange.start.node) &&
-                (node == selRange.end.node)) {
-                var startOffset = selRange.start.offset;
-                var endOffset = selRange.end.offset;
-                if ((node.nodeType == Node.TEXT_NODE) &&
-                    ((startOffset > 0) || (endOffset < node.nodeValue.length))) {
-                    DOM_deleteCharacters(node,startOffset,endOffset);
-                }
-                else {
-                    removeWholeNode = true;
-                }
-            }
-            else if (node == selRange.start.node) {
-                var offset = selRange.start.offset;
-                if ((node.nodeType == Node.TEXT_NODE) && (offset > 0)) {
-                    DOM_deleteCharacters(node,offset);
-                }
-                else {
-                    removeWholeNode = true;
-                }
-            }
-            else if (node == selRange.end.node) {
-                var offset = selRange.end.offset;
-                if ((node.nodeType == Node.TEXT_NODE) && (offset < node.nodeValue.length)) {
-                    DOM_deleteCharacters(node,0,offset);
-                }
-                else {
-                    removeWholeNode = true;
-                }
-            }
-            else {
-                removeWholeNode = true;
-            }
-
-            if (removeWholeNode) {
-                switch (node._type) {
-                case HTML_TD:
-                case HTML_TH:
-                    DOM_deleteAllChildren(node);
-                    break;
-                default:
-                    DOM_deleteNode(node);
-                    break;
-                }
-            }
-        }
-
-        var detail = Range_detail(selRange);
-
-        var sameTextNode = (selRange.start.node == selRange.end.node) &&
-                           (selRange.start.node.nodeType == Node.TEXT_NODE);
-
-        if ((detail.startAncestor != null) && (detail.endAncestor != null) &&
-            (detail.startAncestor.nextSibling == detail.endAncestor) &&
-            !sameTextNode) {
-            prepareForMerge(detail);
-            DOM_mergeWithNextSibling(detail.startAncestor,
-                                          Formatting_MERGEABLE_BLOCK_AND_INLINE);
-            if (isParagraphNode(detail.startAncestor) &&
-                (detail.startAncestor._type != HTML_DIV))
-                removeParagraphDescendants(detail.startAncestor);
-        }
-
-        if (!keepEmpty) {
-            var startNode = selRange.start.node;
-            var endNode = selRange.end.node;
-            if (startNode.parentNode != null)
-                delEmpty(selRange,startNode);
-            if (endNode.parentNode != null)
-                delEmpty(selRange,endNode);
-        }
-
-        Cursor_updateBRAtEndOfParagraph(Range_singleNode(selRange));
-    }
-
-    function delEmpty(selRange,node)
-    {
-        while ((node != document.body) &&
-               (node.nodeType == Node.ELEMENT_NODE) &&
-               (node.firstChild == null)) {
-
-            if (isTableCell(node) || isTableCell(node.parentNode))
-                return;
-
-            if (!fixPositionOutside(selRange.start,node))
-                break;
-            if (!fixPositionOutside(selRange.end,node))
-                break;
-
-            var parent = node.parentNode;
-            Range_trackWhileExecuting(selRange,function() {
-                DOM_deleteNode(node);
-            });
-            node = parent;
-        }
-    }
-
-    function fixPositionOutside(pos,node)
-    {
-        if (pos.node == node) {
-            var before = new Position(node.parentNode,DOM_nodeOffset(node));
-            var after = new Position(node.parentNode,DOM_nodeOffset(node)+1);
-            before = Position_prevMatch(before,Position_okForMovement);
-            after = Position_nextMatch(after,Position_okForMovement);
-
-            if (before != null) {
-                pos.node = before.node;
-                pos.offset = before.offset;
-            }
-            else if (after != null) {
-                pos.node = after.node;
-                pos.offset = after.offset;
-            }
-            else {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    Selection_deleteRangeContents = function(range,keepEmpty)
-    {
-        Range_trackWhileExecuting(range,function() {
-            DOM_ignoreMutationsWhileExecuting(function() {
-                removeSelectionHighlights(getRangeData(range),true);
-            });
-
-            var region = Tables_regionFromRange(range);
-            if (region != null)
-                Tables_deleteRegion(region);
-            else
-                deleteTextSelection(range,keepEmpty);
-        });
-
-        Selection_set(range.start.node,range.start.offset,range.start.node,range.start.offset);
-    }
-
-    Selection_deleteContents = function(keepEmpty)
-    {
-        var range = Selection_get();
-        if (range == null)
-            return;
-        Selection_deleteRangeContents(range,keepEmpty);
-    }
-
-    // private
-    function removeParagraphDescendants(parent)
-    {
-        var next;
-        for (var child = parent.firstChild; child != null; child = next) {
-            next = child.nextSibling;
-            removeParagraphDescendants(child);
-            if (isParagraphNode(child))
-                DOM_removeNodeButKeepChildren(child);
-        }
-    }
-
-    // private
-    function findFirstParagraph(node)
-    {
-        if (isParagraphNode(node))
-            return node;
-        if (node._type == HTML_LI) {
-            var nonWhitespaceInline = false;
-
-            for (var child = node.firstChild; child != null; child = child.nextSibling) {
-                if (isInlineNode(child) && !isWhitespaceTextNode(child))
-                    nonWhitespaceInline = true;
-
-                if (isParagraphNode(child)) {
-                    if (nonWhitespaceInline)
-                        return putPrecedingSiblingsInParagraph(node,child);
-                    return child;
-                }
-                else if (isListNode(child)) {
-                    if (nonWhitespaceInline)
-                        return putPrecedingSiblingsInParagraph(node,child);
-                    return findFirstParagraph(child);
-                }
-            }
-            if (nonWhitespaceInline)
-                return putPrecedingSiblingsInParagraph(node,null);
-        }
-        return null;
-
-        function putPrecedingSiblingsInParagraph(parent,node)
-        {
-            var p = DOM_createElement(document,"P");
-            while (parent.firstChild != node)
-                DOM_appendChild(p,parent.firstChild);
-            return p;
-        }
-    }
-
-    // private
-    function prepareForMerge(detail)
-    {
-        if (isParagraphNode(detail.startAncestor) && isInlineNode(detail.endAncestor)) {
-            var name = detail.startAncestor.nodeName; // check-ok
-            var newParagraph = DOM_createElement(document,name);
-            DOM_insertBefore(detail.endAncestor.parentNode,newParagraph,detail.endAncestor);
-            DOM_appendChild(newParagraph,detail.endAncestor);
-            detail.endAncestor = newParagraph;
-        }
-        else if (isInlineNode(detail.startAncestor) && isParagraphNode(detail.endAncestor)) {
-            var name = detail.endAncestor.nodeName; // check-ok
-            var newParagraph = DOM_createElement(document,name);
-            DOM_insertBefore(detail.startAncestor.parentNode,newParagraph,
-                             detail.startAncestor.nextSibling);
-            DOM_appendChild(newParagraph,detail.startAncestor);
-            detail.startAncestor = newParagraph;
-        }
-        else if (isParagraphNode(detail.startAncestor) &&
-                 isListNode(detail.endAncestor) &&
-                 (detail.endAncestor.firstChild._type == HTML_LI)) {
-            var list = detail.endAncestor;
-            var li = detail.endAncestor.firstChild;
-
-            var paragraph = findFirstParagraph(li);
-            if (paragraph != null) {
-                DOM_insertBefore(list.parentNode,paragraph,list);
-                var name = detail.startAncestor.nodeName; // check-ok
-                DOM_replaceElement(paragraph,name);
-            }
-            if (!nodeHasContent(li))
-                DOM_deleteNode(li);
-            if (firstChildElement(list) == null)
-                DOM_deleteNode(list);
-        }
-        else if (isParagraphNode(detail.endAncestor) &&
-                 isListNode(detail.startAncestor) &&
-                 (detail.startAncestor.lastChild._type == HTML_LI)) {
-            var list = detail.startAncestor;
-            var li = detail.startAncestor.lastChild;
-            var p = detail.endAncestor;
-            var oldLastChild = li.lastChild;
-            while (p.firstChild != null)
-                DOM_insertBefore(li,p.firstChild,null);
-            DOM_deleteNode(p);
-            if (oldLastChild != null) {
-                DOM_mergeWithNextSibling(oldLastChild,
-                                              Formatting_MERGEABLE_BLOCK_AND_INLINE);
-            }
-        }
-
-        if ((detail.startAncestor.lastChild != null) && (detail.endAncestor.firstChild != null)) {
-            var childDetail = new Object();
-            childDetail.startAncestor = detail.startAncestor.lastChild;
-            childDetail.endAncestor = detail.endAncestor.firstChild;
-            prepareForMerge(childDetail);
-        }
-    }
-
-    // public
-    Selection_clearSelection = function()
-    {
-        Selection_clear();
-    }
-
-    // public
-    Selection_preserveWhileExecuting = function(fun)
-    {
-        var range = Selection_get();
-
-        // Since the selection may have changed as a result of changes to the document, we
-        // have to call clear() or set() so that undo history is saved
-        if (range == null) {
-            result = fun();
-            Selection_clear();
-        }
-        else {
-            result = Range_trackWhileExecuting(range,fun);
-            Selection_set(range.start.node,range.start.offset,range.end.node,range.end.offset);
-        }
-        return result;
-    }
-
-    Selection_preferElementPositions = function()
-    {
-        var range = Selection_get();
-        if (range == null)
-            return;
-        range.start = Position_preferElementPosition(range.start);
-        range.end = Position_preferElementPosition(range.end);
-        Selection_set(range.start.node,range.start.offset,
-                      range.end.node,range.end.offset);
-    }
-
-    function getBoundaryContainer(node,topAncestor)
-    {
-        var container = document.body;
-        for (; node != topAncestor.parentNode; node = node.parentNode) {
-            switch (node._type) {
-            case HTML_FIGURE:
-            case HTML_TABLE:
-                container = node;
-                break;
-            }
-        }
-        return container;
-    }
-
-    function boundaryCompliantRange(range)
-    {
-        if (range == null)
-            return null;
-
-        var detail = Range_detail(range);
-        var start = range.start;
-        var end = range.end;
-        var startNode = Position_closestActualNode(start);
-        var endNode = Position_closestActualNode(end);
-        var startContainer = getBoundaryContainer(startNode.parentNode,detail.commonAncestor);
-        var endContainer = getBoundaryContainer(endNode.parentNode,detail.commonAncestor);
-
-        if (startContainer != endContainer) {
-
-            var doStart = false;
-            var doEnd = false;
-
-            if (nodeHasAncestor(startContainer,endContainer)) {
-                doStart = true;
-            }
-            else if (nodeHasAncestor(endContainer,startContainer)) {
-                doEnd = true;
-            }
-            else {
-                doStart = true;
-                doEnd = true;
-            }
-
-            if (doStart && (startContainer != document.body))
-                start = new Position(startContainer.parentNode,DOM_nodeOffset(startContainer));
-            if (doEnd && (endContainer != document.body))
-                end = new Position(endContainer.parentNode,DOM_nodeOffset(endContainer)+1);
-        }
-        return new Range(start.node,start.offset,end.node,end.offset);
-
-        function nodeHasAncestor(node,ancestor)
-        {
-            for (; node != null; node = node.parentNode) {
-                if (node == ancestor)
-                    return true;
-            }
-            return false;
-        }
-    }
-
-    Selection_print = function()
-    {
-        debug("");
-        debug("");
-        debug("");
-        debug("================================================================================");
-
-        var sel = Selection_get();
-        if (sel == null) {
-            debug("No selection");
-            return;
-        }
-
-        printSelectionElement(document.body,"");
-
-        function printSelectionElement(node,indent)
-        {
-            var className = DOM_getAttribute(node,"class");
-            if (className != null)
-                debug(indent+node.nodeName+" ("+className+")");
-            else
-                debug(indent+node.nodeName);
-
-            var child = node.firstChild;
-            var offset = 0;
-            while (true) {
-
-                var isStart = ((sel.start.node == node) && (sel.start.offset == offset));
-                var isEnd = ((sel.end.node == node) && (sel.end.offset == offset));
-                if (isStart && isEnd)
-                    debug(indent+"    []");
-                else if (isStart)
-                    debug(indent+"    [");
-                else if (isEnd)
-                    debug(indent+"    ]");
-
-                if (child == null)
-                    break;
-
-                if (child.nodeType == Node.ELEMENT_NODE)
-                    printSelectionElement(child,indent+"    ");
-                else
-                    printSelectionText(child,indent+"    ");
-
-                child = child.nextSibling;
-                offset++;
-            }
-        }
-
-        function printSelectionText(node,indent)
-        {
-            var value = node.nodeValue;
-
-            if (sel.end.node == node) {
-                var afterSelection = value.substring(sel.end.offset);
-                value = value.substring(0,sel.end.offset) + "]" + afterSelection;
-            }
-
-            if (sel.start.node == node) {
-                var beforeSelection = value.substring(0,sel.start.offset);
-                value = beforeSelection + "[" + value.substring(sel.start.offset);
-            }
-
-            debug(indent+JSON.stringify(value));
-        }
-    }
-
-})();

http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/8eda56a5/Editor/src/StringBuilder.js
----------------------------------------------------------------------
diff --git a/Editor/src/StringBuilder.js b/Editor/src/StringBuilder.js
deleted file mode 100644
index 9332b79..0000000
--- a/Editor/src/StringBuilder.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-function StringBuilder()
-{
-    this.str = "";
-}

http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/8eda56a5/Editor/src/Styles.js
----------------------------------------------------------------------
diff --git a/Editor/src/Styles.js b/Editor/src/Styles.js
deleted file mode 100644
index c09f41d..0000000
--- a/Editor/src/Styles.js
+++ /dev/null
@@ -1,179 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-var Styles_getRule;
-var Styles_nextSelectorAfter;
-var Styles_getParagraphClass;
-var Styles_setParagraphClass;
-var Styles_headingNumbering;
-var Styles_getCSSText;
-var Styles_setCSSText;
-var Styles_getBuiltinCSSURL;
-var Styles_init;
-
-(function() {
-
-    var rules = new Object();
-    var paragraphClass = null;
-
-    Styles_getRule = function(selector)
-    {
-        return rules[selector];
-    }
-
-    Styles_nextSelectorAfter = function(element)
-    {
-        var selector = element.nodeName.toLowerCase();
-        var className = DOM_getAttribute(element,"class");
-        if (className != null)
-            selector = selector+"."+className;
-
-        var nextElementName = null;
-        var nextClassName = null;
-
-        var rule = Styles_getRule(selector);
-        if (rule != null) {
-            var nextSelector = rule["-uxwrite-next"];
-            if (nextSelector != null) {
-                try {
-                    nextSelector = JSON.parse(nextSelector);
-                    if (typeof(nextSelector) != "string")
-                        nextSelector = null;
-                }
-                catch (e) {
-                    nextSelector = null;
-                }
-            }
-            if (nextSelector != null) {
-                var dotIndex = nextSelector.indexOf(".");
-                if (dotIndex >= 0) {
-                    nextElementName = nextSelector.substring(0,dotIndex);
-                    nextClassName = nextSelector.substring(dotIndex+1);
-                }
-                else {
-                    nextElementName = nextSelector;
-                }
-            }
-        }
-
-        if ((nextElementName == null) ||
-            (ElementTypes[nextElementName] == null) ||
-            (!PARAGRAPH_ELEMENTS[ElementTypes[nextElementName]])) {
-            nextElementName = null;
-            nextClassName = null;
-        }
-
-        if (isHeadingNode(element)) {
-            nextElementName = "p";
-            nextClassName = Styles_getParagraphClass();
-        }
-
-        if (nextElementName == null)
-            return null;
-        else if (nextClassName == null)
-            return nextElementName;
-        else
-            return nextElementName+"."+nextClassName;
-    }
-
-    Styles_getParagraphClass = function()
-    {
-        return paragraphClass;
-    }
-
-    Styles_setParagraphClass = function(cls)
-    {
-        paragraphClass = cls;
-    }
-
-    Styles_headingNumbering = function()
-    {
-        return ((rules["h1::before"] != null) &&
-                (rules["h1::before"]["content"] != null));
-    }
-
-    Styles_getCSSText = function()
-    {
-        var head = DOM_documentHead(document);
-        var cssText = "";
-        for (var child = head.firstChild; child != null; child = child.nextSibling) {
-            if (child._type == HTML_STYLE) {
-                for (var t = child.firstChild; t != null; t = t.nextSibling) {
-                    if (t._type == HTML_TEXT)
-                        cssText += t.nodeValue;
-                }
-            }
-        }
-        return cssText;
-    }
-
-    Styles_setCSSText = function(cssText,cssRules)
-    {
-        UndoManager_newGroup("Update styles");
-        var head = DOM_documentHead(document);
-        var next;
-        for (var child = head.firstChild; child != null; child = next) {
-            next = child.nextSibling;
-            if (child._type == HTML_STYLE)
-                DOM_deleteNode(child);
-        }
-        var style = DOM_createElement(document,"STYLE");
-        DOM_appendChild(style,DOM_createTextNode(document,cssText));
-        DOM_appendChild(head,style);
-        rules = cssRules; // FIXME: undo support? (must coordinate with ObjC code)
-        Outline_scheduleUpdateStructure();
-        return {}; // Objective C caller expects JSON result
-    }
-
-    function addBuiltinStylesheet(cssURL)
-    {
-        var head = DOM_documentHead(document);
-        for (var child = head.firstChild; child != null; child = child.nextSibling) {
-            if ((child._type == HTML_LINK) &&
-                (child.getAttribute("rel") == "stylesheet") &&
-                (child.getAttribute("href") == cssURL)) {
-                // Link element was already added by HTMLInjectionProtocol
-                return;
-            }
-        }
-
-        // HTMLInjectionProtocol was unable to find <head> element and insert the stylesheet link,
-        // so add it ourselves
-        var link = DOM_createElement(document,"LINK");
-        DOM_setAttribute(link,"rel","stylesheet");
-        DOM_setAttribute(link,"href",cssURL);
-        DOM_insertBefore(head,link,head.firstChild);
-    }
-
-    var builtinCSSURL = null;
-
-    Styles_getBuiltinCSSURL = function()
-    {
-        return builtinCSSURL;
-    }
-
-    // public
-    Styles_init = function(cssURL)
-    {
-        if (cssURL != null)
-            builtinCSSURL = cssURL;
-
-        if (builtinCSSURL != null)
-            addBuiltinStylesheet(builtinCSSURL);
-    }
-
-})();