8 var nearestInDocumentOrder = function(selector, direction, element) {
9 var parents = $(element).parents(),
10 parent = parents.length ? $(parents[parents.length-1]) : element;
12 var adj = parent.find(selector).filter(function() {
13 /*jshint bitwise: false*/
14 return this.compareDocumentPosition(element) & (direction === 'above' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING);
18 return adj[direction === 'above' ? adj.length-1 : 0];
23 var getElementForElementRootNode = function(node, mirrors, canvasContainer) {
25 var candidates = [node.getData('canvasElement')].concat(node.getData('mirrorElements')),
27 candidates.some(function(c) {
29 if(c.dom.parents().index(canvasContainer.dom) !== -1) {
36 return node.getData(mirrors ? 'mirrorElements' : 'canvasElement');
39 var getElementForNode = function(node, mirrors) {
40 while(!node.getData('canvasElement')) {
43 return node.getData(mirrors ? 'mirrorElements' : 'canvasElement');
46 var getElementForDetachedNode = function(node, originalParent, mirrors) {
47 var ptr = originalParent;
49 return node.getData(mirrors ? 'mirrorElements' : 'canvasElement');
51 while(!ptr.getData('canvasElement')) {
54 return ptr.getData(mirrors ? 'mirrorElements' : 'canvasElement');
57 var caretPositionFromPoint = function(x, y) {
58 /* globals document */
59 var range, textNode, offset;
60 if(document.caretPositionFromPoint) {
61 range = document.caretPositionFromPoint(x, y);
62 textNode = range.offsetNode;
63 offset = range.offset;
64 } else if(document.caretRangeFromPoint) {
65 range = document.caretRangeFromPoint(x, y);
66 textNode = range.startContainer;
67 offset = range.startOffset;
77 nearestInDocumentOrder: nearestInDocumentOrder,
81 getElementForNode: getElementForNode,
82 getElementForDetachedNode: getElementForDetachedNode,
83 getElementForElementRootNode: getElementForElementRootNode,
84 caretPositionFromPoint: caretPositionFromPoint