doevisualizations
Version:
Data Visualization Library based on RequireJS and D3.js (v4+)
163 lines (162 loc) • 6.08 kB
JavaScript
/*!
* jQuery++ - 2.0.2
* http://jquerypp.com
* Copyright (c) 2016 Bitovi
* Wed, 06 Apr 2016 00:03:57 GMT
* Licensed MIT
*/
/*jquerypp@2.0.2#dom/selection/selection*/
var $ = require('jquery');
require('../range/range.js');
var getWindow = function (element) {
return element ? element.ownerDocument.defaultView || element.ownerDocument.parentWindow : window;
}, getElementsSelection = function (el, win) {
var current = $.Range.current(el).clone(), entireElement = $.Range(el).select(el);
if (!current.overlaps(entireElement)) {
return null;
}
if (current.compare('START_TO_START', entireElement) < 1) {
startPos = 0;
current.move('START_TO_START', entireElement);
} else {
fromElementToCurrent = entireElement.clone();
fromElementToCurrent.move('END_TO_START', current);
startPos = fromElementToCurrent.toString().length;
}
if (current.compare('END_TO_END', entireElement) >= 0) {
endPos = entireElement.toString().length;
} else {
endPos = startPos + current.toString().length;
}
return {
start: startPos,
end: endPos,
width: endPos - startPos
};
}, getSelection = function (el) {
var win = getWindow(el);
if (el.selectionStart !== undefined) {
if (document.activeElement && document.activeElement != el && el.selectionStart == el.selectionEnd && el.selectionStart == 0) {
return {
start: el.value.length,
end: el.value.length,
width: 0
};
}
return {
start: el.selectionStart,
end: el.selectionEnd,
width: el.selectionEnd - el.selectionStart
};
} else if (win.getSelection) {
return getElementsSelection(el, win);
} else {
try {
if (el.nodeName.toLowerCase() == 'input') {
var real = getWindow(el).document.selection.createRange(), r = el.createTextRange();
r.setEndPoint('EndToStart', real);
var start = r.text.length;
return {
start: start,
end: start + real.text.length,
width: real.text.length
};
} else {
var res = getElementsSelection(el, win);
if (!res) {
return res;
}
var current = $.Range.current().clone(), r2 = current.clone().collapse().range, r3 = current.clone().collapse(false).range;
r2.moveStart('character', -1);
r3.moveStart('character', -1);
if (res.startPos != 0 && r2.text == '') {
res.startPos += 2;
}
if (res.endPos != 0 && r3.text == '') {
res.endPos += 2;
}
return res;
}
} catch (e) {
return {
start: el.value.length,
end: el.value.length,
width: 0
};
}
}
}, select = function (el, start, end) {
var win = getWindow(el);
if (el.setSelectionRange) {
if (end === undefined) {
el.focus();
el.setSelectionRange(start, start);
} else {
el.select();
el.selectionStart = start;
el.selectionEnd = end;
}
} else if (el.createTextRange) {
var r = el.createTextRange();
r.moveStart('character', start);
end = end || start;
r.moveEnd('character', end - el.value.length);
r.select();
} else if (win.getSelection) {
var doc = win.document, sel = win.getSelection(), range = doc.createRange(), ranges = [
start,
end !== undefined ? end : start
];
getCharElement([el], ranges);
range.setStart(ranges[0].el, ranges[0].count);
range.setEnd(ranges[1].el, ranges[1].count);
sel.removeAllRanges();
sel.addRange(range);
} else if (win.document.body.createTextRange) {
var range = document.body.createTextRange();
range.moveToElementText(el);
range.collapse();
range.moveStart('character', start);
range.moveEnd('character', end !== undefined ? end : start);
range.select();
}
}, replaceWithLess = function (start, len, range, el) {
if (typeof range[0] === 'number' && range[0] < len) {
range[0] = {
el: el,
count: range[0] - start
};
}
if (typeof range[1] === 'number' && range[1] <= len) {
range[1] = {
el: el,
count: range[1] - start
};
;
}
}, getCharElement = function (elems, range, len) {
var elem, start;
len = len || 0;
for (var i = 0; elems[i]; i++) {
elem = elems[i];
if (elem.nodeType === 3 || elem.nodeType === 4) {
start = len;
len += elem.nodeValue.length;
replaceWithLess(start, len, range, elem);
} else if (elem.nodeType !== 8) {
len = getCharElement(elem.childNodes, range, len);
}
}
return len;
};
$.fn.selection = function (start, end) {
if (start !== undefined) {
return this.each(function () {
select(this, start, end);
});
} else {
return getSelection(this[0]);
}
};
$.fn.selection.getCharElement = getCharElement;
module.exports = $;