'use strict'; var _ = require('../../lib/helper'); var instances = require('../instances'); var updateGeometry = require('../update-geometry'); var updateScroll = require('../update-scroll'); function bindSelectionHandler(element, i) { function getRangeNode() { var selection = window.getSelection ? window.getSelection() : document.getSelection ? document.getSelection() : ''; if (selection.toString().length === 0) { return null; } else { return selection.getRangeAt(0).commonAncestorContainer; } } var scrollingLoop = null; var scrollDiff = {top: 0, left: 0}; function startScrolling() { if (!scrollingLoop) { scrollingLoop = setInterval(function () { if (!instances.get(element)) { clearInterval(scrollingLoop); return; } updateScroll(element, 'top', element.scrollTop + scrollDiff.top); updateScroll(element, 'left', element.scrollLeft + scrollDiff.left); updateGeometry(element); }, 50); // every .1 sec } } function stopScrolling() { if (scrollingLoop) { clearInterval(scrollingLoop); scrollingLoop = null; } _.stopScrolling(element); } var isSelected = false; i.event.bind(i.ownerDocument, 'selectionchange', function () { if (element.contains(getRangeNode())) { isSelected = true; } else { isSelected = false; stopScrolling(); } }); i.event.bind(window, 'mouseup', function () { if (isSelected) { isSelected = false; stopScrolling(); } }); i.event.bind(window, 'keyup', function () { if (isSelected) { isSelected = false; stopScrolling(); } }); i.event.bind(window, 'mousemove', function (e) { if (isSelected) { var mousePosition = {x: e.pageX, y: e.pageY}; var containerGeometry = { left: element.offsetLeft, right: element.offsetLeft + element.offsetWidth, top: element.offsetTop, bottom: element.offsetTop + element.offsetHeight }; if (mousePosition.x < containerGeometry.left + 3) { scrollDiff.left = -5; _.startScrolling(element, 'x'); } else if (mousePosition.x > containerGeometry.right - 3) { scrollDiff.left = 5; _.startScrolling(element, 'x'); } else { scrollDiff.left = 0; } if (mousePosition.y < containerGeometry.top + 3) { if (containerGeometry.top + 3 - mousePosition.y < 5) { scrollDiff.top = -5; } else { scrollDiff.top = -20; } _.startScrolling(element, 'y'); } else if (mousePosition.y > containerGeometry.bottom - 3) { if (mousePosition.y - containerGeometry.bottom + 3 < 5) { scrollDiff.top = 5; } else { scrollDiff.top = 20; } _.startScrolling(element, 'y'); } else { scrollDiff.top = 0; } if (scrollDiff.top === 0 && scrollDiff.left === 0) { stopScrolling(); } else { startScrolling(); } } }); } module.exports = function (element) { var i = instances.get(element); bindSelectionHandler(element, i); };