'use strict'; var instances = require('./instances'); var lastTop; var lastLeft; var createDOMEvent = function (name) { var event = document.createEvent("Event"); event.initEvent(name, true, true); return event; }; module.exports = function (element, axis, value) { if (typeof element === 'undefined') { throw 'You must provide an element to the update-scroll function'; } if (typeof axis === 'undefined') { throw 'You must provide an axis to the update-scroll function'; } if (typeof value === 'undefined') { throw 'You must provide a value to the update-scroll function'; } if (axis === 'top' && value <= 0) { element.scrollTop = value = 0; // don't allow negative scroll element.dispatchEvent(createDOMEvent('ps-y-reach-start')); } if (axis === 'left' && value <= 0) { element.scrollLeft = value = 0; // don't allow negative scroll element.dispatchEvent(createDOMEvent('ps-x-reach-start')); } var i = instances.get(element); if (axis === 'top' && value >= i.contentHeight - i.containerHeight) { // don't allow scroll past container value = i.contentHeight - i.containerHeight; if (value - element.scrollTop <= 1) { // mitigates rounding errors on non-subpixel scroll values value = element.scrollTop; } else { element.scrollTop = value; } element.dispatchEvent(createDOMEvent('ps-y-reach-end')); } if (axis === 'left' && value >= i.contentWidth - i.containerWidth) { // don't allow scroll past container value = i.contentWidth - i.containerWidth; if (value - element.scrollLeft <= 1) { // mitigates rounding errors on non-subpixel scroll values value = element.scrollLeft; } else { element.scrollLeft = value; } element.dispatchEvent(createDOMEvent('ps-x-reach-end')); } if (!lastTop) { lastTop = element.scrollTop; } if (!lastLeft) { lastLeft = element.scrollLeft; } if (axis === 'top' && value < lastTop) { element.dispatchEvent(createDOMEvent('ps-scroll-up')); } if (axis === 'top' && value > lastTop) { element.dispatchEvent(createDOMEvent('ps-scroll-down')); } if (axis === 'left' && value < lastLeft) { element.dispatchEvent(createDOMEvent('ps-scroll-left')); } if (axis === 'left' && value > lastLeft) { element.dispatchEvent(createDOMEvent('ps-scroll-right')); } if (axis === 'top') { element.scrollTop = lastTop = value; element.dispatchEvent(createDOMEvent('ps-scroll-y')); } if (axis === 'left') { element.scrollLeft = lastLeft = value; element.dispatchEvent(createDOMEvent('ps-scroll-x')); } };