/* perfect-scrollbar v0.6.10 */ (function e(t, n, r) { function s(o, u) { if (!n[o]) { if (!t[o]) { var a = typeof require == "function" && require; if (!u && a) return a(o, !0); if (i) return i(o, !0); var f = new Error("Cannot find module '" + o + "'"); throw ((f.code = "MODULE_NOT_FOUND"), f); } var l = (n[o] = { exports: {} }); t[o][0].call( l.exports, function (e) { var n = t[o][1][e]; return s(n ? n : e); }, l, l.exports, e, t, n, r ); } return n[o].exports; } var i = typeof require == "function" && require; for (var o = 0; o < r.length; o++) s(r[o]); return s; })( { 1: [ function (require, module, exports) { "use strict"; var ps = require("../main"), psInstances = require("../plugin/instances"); function mountJQuery(jQuery) { jQuery.fn.perfectScrollbar = function (settingOrCommand) { return this.each(function () { if ( typeof settingOrCommand === "object" || typeof settingOrCommand === "undefined" ) { // If it's an object or none, initialize. var settings = settingOrCommand; if (!psInstances.get(this)) { ps.initialize(this, settings); } } else { // Unless, it may be a command. var command = settingOrCommand; if (command === "update") { ps.update(this); } else if (command === "destroy") { ps.destroy(this); } } return jQuery(this); }); }; } if (typeof define === "function" && define.amd) { // AMD. Register as an anonymous module. define(["jquery"], mountJQuery); } else { var jq = window.jQuery ? window.jQuery : window.$; if (typeof jq !== "undefined") { mountJQuery(jq); } } module.exports = mountJQuery; }, { "../main": 7, "../plugin/instances": 18 }, ], 2: [ function (require, module, exports) { "use strict"; function oldAdd(element, className) { var classes = element.className.split(" "); if (classes.indexOf(className) < 0) { classes.push(className); } element.className = classes.join(" "); } function oldRemove(element, className) { var classes = element.className.split(" "); var idx = classes.indexOf(className); if (idx >= 0) { classes.splice(idx, 1); } element.className = classes.join(" "); } exports.add = function (element, className) { if (element.classList) { element.classList.add(className); } else { oldAdd(element, className); } }; exports.remove = function (element, className) { if (element.classList) { element.classList.remove(className); } else { oldRemove(element, className); } }; exports.list = function (element) { if (element.classList) { return Array.prototype.slice.apply(element.classList); } else { return element.className.split(" "); } }; }, {}, ], 3: [ function (require, module, exports) { "use strict"; var DOM = {}; DOM.e = function (tagName, className) { var element = document.createElement(tagName); element.className = className; return element; }; DOM.appendTo = function (child, parent) { parent.appendChild(child); return child; }; function cssGet(element, styleName) { return window.getComputedStyle(element)[styleName]; } function cssSet(element, styleName, styleValue) { if (typeof styleValue === "number") { styleValue = styleValue.toString() + "px"; } element.style[styleName] = styleValue; return element; } function cssMultiSet(element, obj) { for (var key in obj) { var val = obj[key]; if (typeof val === "number") { val = val.toString() + "px"; } element.style[key] = val; } return element; } DOM.css = function (element, styleNameOrObject, styleValue) { if (typeof styleNameOrObject === "object") { // multiple set with object return cssMultiSet(element, styleNameOrObject); } else { if (typeof styleValue === "undefined") { return cssGet(element, styleNameOrObject); } else { return cssSet(element, styleNameOrObject, styleValue); } } }; DOM.matches = function (element, query) { if (typeof element.matches !== "undefined") { return element.matches(query); } else { if (typeof element.matchesSelector !== "undefined") { return element.matchesSelector(query); } else if (typeof element.webkitMatchesSelector !== "undefined") { return element.webkitMatchesSelector(query); } else if (typeof element.mozMatchesSelector !== "undefined") { return element.mozMatchesSelector(query); } else if (typeof element.msMatchesSelector !== "undefined") { return element.msMatchesSelector(query); } } }; DOM.remove = function (element) { if (typeof element.remove !== "undefined") { element.remove(); } else { if (element.parentNode) { element.parentNode.removeChild(element); } } }; DOM.queryChildren = function (element, selector) { return Array.prototype.filter.call( element.childNodes, function (child) { return DOM.matches(child, selector); } ); }; module.exports = DOM; }, {}, ], 4: [ function (require, module, exports) { "use strict"; var EventElement = function (element) { this.element = element; this.events = {}; }; EventElement.prototype.bind = function (eventName, handler) { if (typeof this.events[eventName] === "undefined") { this.events[eventName] = []; } this.events[eventName].push(handler); this.element.addEventListener(eventName, handler, false); }; EventElement.prototype.unbind = function (eventName, handler) { var isHandlerProvided = typeof handler !== "undefined"; this.events[eventName] = this.events[eventName].filter(function ( hdlr ) { if (isHandlerProvided && hdlr !== handler) { return true; } this.element.removeEventListener(eventName, hdlr, false); return false; }, this); }; EventElement.prototype.unbindAll = function () { for (var name in this.events) { this.unbind(name); } }; var EventManager = function () { this.eventElements = []; }; EventManager.prototype.eventElement = function (element) { var ee = this.eventElements.filter(function (eventElement) { return eventElement.element === element; })[0]; if (typeof ee === "undefined") { ee = new EventElement(element); this.eventElements.push(ee); } return ee; }; EventManager.prototype.bind = function (element, eventName, handler) { this.eventElement(element).bind(eventName, handler); }; EventManager.prototype.unbind = function (element, eventName, handler) { this.eventElement(element).unbind(eventName, handler); }; EventManager.prototype.unbindAll = function () { for (var i = 0; i < this.eventElements.length; i++) { this.eventElements[i].unbindAll(); } }; EventManager.prototype.once = function (element, eventName, handler) { var ee = this.eventElement(element); var onceHandler = function (e) { ee.unbind(eventName, onceHandler); handler(e); }; ee.bind(eventName, onceHandler); }; module.exports = EventManager; }, {}, ], 5: [ function (require, module, exports) { "use strict"; module.exports = (function () { function s4() { return Math.floor((1 + Math.random()) * 0x10000) .toString(16) .substring(1); } return function () { return ( s4() + s4() + "-" + s4() + "-" + s4() + "-" + s4() + "-" + s4() + s4() + s4() ); }; })(); }, {}, ], 6: [ function (require, module, exports) { "use strict"; var cls = require("./class"), d = require("./dom"); exports.toInt = function (x) { return parseInt(x, 10) || 0; }; exports.clone = function (obj) { if (obj === null) { return null; } else if (typeof obj === "object") { var result = {}; for (var key in obj) { result[key] = this.clone(obj[key]); } return result; } else { return obj; } }; exports.extend = function (original, source) { var result = this.clone(original); for (var key in source) { result[key] = this.clone(source[key]); } return result; }; exports.isEditable = function (el) { return ( d.matches(el, "input,[contenteditable]") || d.matches(el, "select,[contenteditable]") || d.matches(el, "textarea,[contenteditable]") || d.matches(el, "button,[contenteditable]") ); }; exports.removePsClasses = function (element) { var clsList = cls.list(element); for (var i = 0; i < clsList.length; i++) { var className = clsList[i]; if (className.indexOf("ps-") === 0) { cls.remove(element, className); } } }; exports.outerWidth = function (element) { return ( this.toInt(d.css(element, "width")) + this.toInt(d.css(element, "paddingLeft")) + this.toInt(d.css(element, "paddingRight")) + this.toInt(d.css(element, "borderLeftWidth")) + this.toInt(d.css(element, "borderRightWidth")) ); }; exports.startScrolling = function (element, axis) { cls.add(element, "ps-in-scrolling"); if (typeof axis !== "undefined") { cls.add(element, "ps-" + axis); } else { cls.add(element, "ps-x"); cls.add(element, "ps-y"); } }; exports.stopScrolling = function (element, axis) { cls.remove(element, "ps-in-scrolling"); if (typeof axis !== "undefined") { cls.remove(element, "ps-" + axis); } else { cls.remove(element, "ps-x"); cls.remove(element, "ps-y"); } }; exports.env = { isWebKit: "WebkitAppearance" in document.documentElement.style, supportsTouch: "ontouchstart" in window || (window.DocumentTouch && document instanceof window.DocumentTouch), supportsIePointer: window.navigator.msMaxTouchPoints !== null, }; }, { "./class": 2, "./dom": 3 }, ], 7: [ function (require, module, exports) { "use strict"; var destroy = require("./plugin/destroy"), initialize = require("./plugin/initialize"), update = require("./plugin/update"); module.exports = { initialize: initialize, update: update, destroy: destroy, }; }, { "./plugin/destroy": 9, "./plugin/initialize": 17, "./plugin/update": 21, }, ], 8: [ function (require, module, exports) { "use strict"; module.exports = { maxScrollbarLength: null, minScrollbarLength: null, scrollXMarginOffset: 0, scrollYMarginOffset: 0, stopPropagationOnClick: true, suppressScrollX: false, suppressScrollY: false, swipePropagation: true, useBothWheelAxes: false, useKeyboard: true, useSelectionScroll: false, wheelPropagation: false, wheelSpeed: 1, theme: "default", }; }, {}, ], 9: [ function (require, module, exports) { "use strict"; var d = require("../lib/dom"), h = require("../lib/helper"), instances = require("./instances"); module.exports = function (element) { var i = instances.get(element); if (!i) { return; } i.event.unbindAll(); d.remove(i.scrollbarX); d.remove(i.scrollbarY); d.remove(i.scrollbarXRail); d.remove(i.scrollbarYRail); h.removePsClasses(element); instances.remove(element); }; }, { "../lib/dom": 3, "../lib/helper": 6, "./instances": 18 }, ], 10: [ function (require, module, exports) { "use strict"; var h = require("../../lib/helper"), instances = require("../instances"), updateGeometry = require("../update-geometry"), updateScroll = require("../update-scroll"); function bindClickRailHandler(element, i) { function pageOffset(el) { return el.getBoundingClientRect(); } var stopPropagation = window.Event.prototype.stopPropagation.bind; if (i.settings.stopPropagationOnClick) { i.event.bind(i.scrollbarY, "click", stopPropagation); } i.event.bind(i.scrollbarYRail, "click", function (e) { var halfOfScrollbarLength = h.toInt(i.scrollbarYHeight / 2); var positionTop = i.railYRatio * (e.pageY - window.pageYOffset - pageOffset(i.scrollbarYRail).top - halfOfScrollbarLength); var maxPositionTop = i.railYRatio * (i.railYHeight - i.scrollbarYHeight); var positionRatio = positionTop / maxPositionTop; if (positionRatio < 0) { positionRatio = 0; } else if (positionRatio > 1) { positionRatio = 1; } updateScroll( element, "top", (i.contentHeight - i.containerHeight) * positionRatio ); updateGeometry(element); e.stopPropagation(); }); if (i.settings.stopPropagationOnClick) { i.event.bind(i.scrollbarX, "click", stopPropagation); } i.event.bind(i.scrollbarXRail, "click", function (e) { var halfOfScrollbarLength = h.toInt(i.scrollbarXWidth / 2); var positionLeft = i.railXRatio * (e.pageX - window.pageXOffset - pageOffset(i.scrollbarXRail).left - halfOfScrollbarLength); var maxPositionLeft = i.railXRatio * (i.railXWidth - i.scrollbarXWidth); var positionRatio = positionLeft / maxPositionLeft; if (positionRatio < 0) { positionRatio = 0; } else if (positionRatio > 1) { positionRatio = 1; } updateScroll( element, "left", (i.contentWidth - i.containerWidth) * positionRatio - i.negativeScrollAdjustment ); updateGeometry(element); e.stopPropagation(); }); } module.exports = function (element) { var i = instances.get(element); bindClickRailHandler(element, i); }; }, { "../../lib/helper": 6, "../instances": 18, "../update-geometry": 19, "../update-scroll": 20, }, ], 11: [ function (require, module, exports) { "use strict"; var d = require("../../lib/dom"), h = require("../../lib/helper"), instances = require("../instances"), updateGeometry = require("../update-geometry"), updateScroll = require("../update-scroll"); function bindMouseScrollXHandler(element, i) { var currentLeft = null; var currentPageX = null; function updateScrollLeft(deltaX) { var newLeft = currentLeft + deltaX * i.railXRatio; var maxLeft = Math.max(0, i.scrollbarXRail.getBoundingClientRect().left) + i.railXRatio * (i.railXWidth - i.scrollbarXWidth); if (newLeft < 0) { i.scrollbarXLeft = 0; } else if (newLeft > maxLeft) { i.scrollbarXLeft = maxLeft; } else { i.scrollbarXLeft = newLeft; } var scrollLeft = h.toInt( (i.scrollbarXLeft * (i.contentWidth - i.containerWidth)) / (i.containerWidth - i.railXRatio * i.scrollbarXWidth) ) - i.negativeScrollAdjustment; updateScroll(element, "left", scrollLeft); } var mouseMoveHandler = function (e) { updateScrollLeft(e.pageX - currentPageX); updateGeometry(element); e.stopPropagation(); e.preventDefault(); }; var mouseUpHandler = function () { h.stopScrolling(element, "x"); i.event.unbind(i.ownerDocument, "mousemove", mouseMoveHandler); }; i.event.bind(i.scrollbarX, "mousedown", function (e) { currentPageX = e.pageX; currentLeft = h.toInt(d.css(i.scrollbarX, "left")) * i.railXRatio; h.startScrolling(element, "x"); i.event.bind(i.ownerDocument, "mousemove", mouseMoveHandler); i.event.once(i.ownerDocument, "mouseup", mouseUpHandler); e.stopPropagation(); e.preventDefault(); }); } function bindMouseScrollYHandler(element, i) { var currentTop = null; var currentPageY = null; function updateScrollTop(deltaY) { var newTop = currentTop + deltaY * i.railYRatio; var maxTop = Math.max(0, i.scrollbarYRail.getBoundingClientRect().top) + i.railYRatio * (i.railYHeight - i.scrollbarYHeight); if (newTop < 0) { i.scrollbarYTop = 0; } else if (newTop > maxTop) { i.scrollbarYTop = maxTop; } else { i.scrollbarYTop = newTop; } var scrollTop = h.toInt( (i.scrollbarYTop * (i.contentHeight - i.containerHeight)) / (i.containerHeight - i.railYRatio * i.scrollbarYHeight) ); updateScroll(element, "top", scrollTop); } var mouseMoveHandler = function (e) { updateScrollTop(e.pageY - currentPageY); updateGeometry(element); e.stopPropagation(); e.preventDefault(); }; var mouseUpHandler = function () { h.stopScrolling(element, "y"); i.event.unbind(i.ownerDocument, "mousemove", mouseMoveHandler); }; i.event.bind(i.scrollbarY, "mousedown", function (e) { currentPageY = e.pageY; currentTop = h.toInt(d.css(i.scrollbarY, "top")) * i.railYRatio; h.startScrolling(element, "y"); i.event.bind(i.ownerDocument, "mousemove", mouseMoveHandler); i.event.once(i.ownerDocument, "mouseup", mouseUpHandler); e.stopPropagation(); e.preventDefault(); }); } module.exports = function (element) { var i = instances.get(element); bindMouseScrollXHandler(element, i); bindMouseScrollYHandler(element, i); }; }, { "../../lib/dom": 3, "../../lib/helper": 6, "../instances": 18, "../update-geometry": 19, "../update-scroll": 20, }, ], 12: [ function (require, module, exports) { "use strict"; var h = require("../../lib/helper"), d = require("../../lib/dom"), instances = require("../instances"), updateGeometry = require("../update-geometry"), updateScroll = require("../update-scroll"); function bindKeyboardHandler(element, i) { var hovered = false; i.event.bind(element, "mouseenter", function () { hovered = true; }); i.event.bind(element, "mouseleave", function () { hovered = false; }); var shouldPrevent = false; function shouldPreventDefault(deltaX, deltaY) { var scrollTop = element.scrollTop; if (deltaX === 0) { if (!i.scrollbarYActive) { return false; } if ( (scrollTop === 0 && deltaY > 0) || (scrollTop >= i.contentHeight - i.containerHeight && deltaY < 0) ) { return !i.settings.wheelPropagation; } } var scrollLeft = element.scrollLeft; if (deltaY === 0) { if (!i.scrollbarXActive) { return false; } if ( (scrollLeft === 0 && deltaX < 0) || (scrollLeft >= i.contentWidth - i.containerWidth && deltaX > 0) ) { return !i.settings.wheelPropagation; } } return true; } i.event.bind(i.ownerDocument, "keydown", function (e) { if (e.isDefaultPrevented && e.isDefaultPrevented()) { return; } var focused = d.matches(i.scrollbarX, ":focus") || d.matches(i.scrollbarY, ":focus"); if (!hovered && !focused) { return; } var activeElement = document.activeElement ? document.activeElement : i.ownerDocument.activeElement; if (activeElement) { // go deeper if element is a webcomponent while (activeElement.shadowRoot) { activeElement = activeElement.shadowRoot.activeElement; } if (h.isEditable(activeElement)) { return; } } var deltaX = 0; var deltaY = 0; switch (e.which) { case 37: // left deltaX = -30; break; case 38: // up deltaY = 30; break; case 39: // right deltaX = 30; break; case 40: // down deltaY = -30; break; case 33: // page up deltaY = 90; break; case 32: // space bar if (e.shiftKey) { deltaY = 90; } else { deltaY = -90; } break; case 34: // page down deltaY = -90; break; case 35: // end if (e.ctrlKey) { deltaY = -i.contentHeight; } else { deltaY = -i.containerHeight; } break; case 36: // home if (e.ctrlKey) { deltaY = element.scrollTop; } else { deltaY = i.containerHeight; } break; default: return; } updateScroll(element, "top", element.scrollTop - deltaY); updateScroll(element, "left", element.scrollLeft + deltaX); updateGeometry(element); shouldPrevent = shouldPreventDefault(deltaX, deltaY); if (shouldPrevent) { e.preventDefault(); } }); } module.exports = function (element) { var i = instances.get(element); bindKeyboardHandler(element, i); }; }, { "../../lib/dom": 3, "../../lib/helper": 6, "../instances": 18, "../update-geometry": 19, "../update-scroll": 20, }, ], 13: [ function (require, module, exports) { "use strict"; var instances = require("../instances"), updateGeometry = require("../update-geometry"), updateScroll = require("../update-scroll"); function bindMouseWheelHandler(element, i) { var shouldPrevent = false; function shouldPreventDefault(deltaX, deltaY) { var scrollTop = element.scrollTop; if (deltaX === 0) { if (!i.scrollbarYActive) { return false; } if ( (scrollTop === 0 && deltaY > 0) || (scrollTop >= i.contentHeight - i.containerHeight && deltaY < 0) ) { return !i.settings.wheelPropagation; } } var scrollLeft = element.scrollLeft; if (deltaY === 0) { if (!i.scrollbarXActive) { return false; } if ( (scrollLeft === 0 && deltaX < 0) || (scrollLeft >= i.contentWidth - i.containerWidth && deltaX > 0) ) { return !i.settings.wheelPropagation; } } return true; } function getDeltaFromEvent(e) { var deltaX = e.deltaX; var deltaY = -1 * e.deltaY; if ( typeof deltaX === "undefined" || typeof deltaY === "undefined" ) { // OS X Safari deltaX = (-1 * e.wheelDeltaX) / 6; deltaY = e.wheelDeltaY / 6; } if (e.deltaMode && e.deltaMode === 1) { // Firefox in deltaMode 1: Line scrolling deltaX *= 10; deltaY *= 10; } if (deltaX !== deltaX && deltaY !== deltaY /* NaN checks */) { // IE in some mouse drivers deltaX = 0; deltaY = e.wheelDelta; } return [deltaX, deltaY]; } function shouldBeConsumedByTextarea(deltaX, deltaY) { var hoveredTextarea = element.querySelector("textarea:hover"); if (hoveredTextarea) { var maxScrollTop = hoveredTextarea.scrollHeight - hoveredTextarea.clientHeight; if (maxScrollTop > 0) { if ( !(hoveredTextarea.scrollTop === 0 && deltaY > 0) && !(hoveredTextarea.scrollTop === maxScrollTop && deltaY < 0) ) { return true; } } var maxScrollLeft = hoveredTextarea.scrollLeft - hoveredTextarea.clientWidth; if (maxScrollLeft > 0) { if ( !(hoveredTextarea.scrollLeft === 0 && deltaX < 0) && !(hoveredTextarea.scrollLeft === maxScrollLeft && deltaX > 0) ) { return true; } } } return false; } function mousewheelHandler(e) { var delta = getDeltaFromEvent(e); var deltaX = delta[0]; var deltaY = delta[1]; if (shouldBeConsumedByTextarea(deltaX, deltaY)) { return; } shouldPrevent = false; if (!i.settings.useBothWheelAxes) { // deltaX will only be used for horizontal scrolling and deltaY will // only be used for vertical scrolling - this is the default updateScroll( element, "top", element.scrollTop - deltaY * i.settings.wheelSpeed ); updateScroll( element, "left", element.scrollLeft + deltaX * i.settings.wheelSpeed ); } else if (i.scrollbarYActive && !i.scrollbarXActive) { // only vertical scrollbar is active and useBothWheelAxes option is // active, so let's scroll vertical bar using both mouse wheel axes if (deltaY) { updateScroll( element, "top", element.scrollTop - deltaY * i.settings.wheelSpeed ); } else { updateScroll( element, "top", element.scrollTop + deltaX * i.settings.wheelSpeed ); } shouldPrevent = true; } else if (i.scrollbarXActive && !i.scrollbarYActive) { // useBothWheelAxes and only horizontal bar is active, so use both // wheel axes for horizontal bar if (deltaX) { updateScroll( element, "left", element.scrollLeft + deltaX * i.settings.wheelSpeed ); } else { updateScroll( element, "left", element.scrollLeft - deltaY * i.settings.wheelSpeed ); } shouldPrevent = true; } updateGeometry(element); shouldPrevent = shouldPrevent || shouldPreventDefault(deltaX, deltaY); if (shouldPrevent) { e.stopPropagation(); e.preventDefault(); } } if (typeof window.onwheel !== "undefined") { i.event.bind(element, "wheel", mousewheelHandler); } else if (typeof window.onmousewheel !== "undefined") { i.event.bind(element, "mousewheel", mousewheelHandler); } } module.exports = function (element) { var i = instances.get(element); bindMouseWheelHandler(element, i); }; }, { "../instances": 18, "../update-geometry": 19, "../update-scroll": 20 }, ], 14: [ function (require, module, exports) { "use strict"; var instances = require("../instances"), updateGeometry = require("../update-geometry"); function bindNativeScrollHandler(element, i) { i.event.bind(element, "scroll", function () { updateGeometry(element); }); } module.exports = function (element) { var i = instances.get(element); bindNativeScrollHandler(element, i); }; }, { "../instances": 18, "../update-geometry": 19 }, ], 15: [ function (require, module, exports) { "use strict"; var h = require("../../lib/helper"), instances = require("../instances"), updateGeometry = require("../update-geometry"), 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; } h.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, "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; h.startScrolling(element, "x"); } else if (mousePosition.x > containerGeometry.right - 3) { scrollDiff.left = 5; h.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; } h.startScrolling(element, "y"); } else if (mousePosition.y > containerGeometry.bottom - 3) { if (mousePosition.y - containerGeometry.bottom + 3 < 5) { scrollDiff.top = 5; } else { scrollDiff.top = 20; } h.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); }; }, { "../../lib/helper": 6, "../instances": 18, "../update-geometry": 19, "../update-scroll": 20, }, ], 16: [ function (require, module, exports) { "use strict"; var instances = require("../instances"), updateGeometry = require("../update-geometry"), updateScroll = require("../update-scroll"); function bindTouchHandler( element, i, supportsTouch, supportsIePointer ) { function shouldPreventDefault(deltaX, deltaY) { var scrollTop = element.scrollTop; var scrollLeft = element.scrollLeft; var magnitudeX = Math.abs(deltaX); var magnitudeY = Math.abs(deltaY); if (magnitudeY > magnitudeX) { // user is perhaps trying to swipe up/down the page if ( (deltaY < 0 && scrollTop === i.contentHeight - i.containerHeight) || (deltaY > 0 && scrollTop === 0) ) { return !i.settings.swipePropagation; } } else if (magnitudeX > magnitudeY) { // user is perhaps trying to swipe left/right across the page if ( (deltaX < 0 && scrollLeft === i.contentWidth - i.containerWidth) || (deltaX > 0 && scrollLeft === 0) ) { return !i.settings.swipePropagation; } } return true; } function applyTouchMove(differenceX, differenceY) { updateScroll(element, "top", element.scrollTop - differenceY); updateScroll(element, "left", element.scrollLeft - differenceX); updateGeometry(element); } var startOffset = {}; var startTime = 0; var speed = {}; var easingLoop = null; var inGlobalTouch = false; var inLocalTouch = false; function globalTouchStart() { inGlobalTouch = true; } function globalTouchEnd() { inGlobalTouch = false; } function getTouch(e) { if (e.targetTouches) { return e.targetTouches[0]; } else { // Maybe IE pointer return e; } } function shouldHandle(e) { if (e.targetTouches && e.targetTouches.length === 1) { return true; } if ( e.pointerType && e.pointerType !== "mouse" && e.pointerType !== e.MSPOINTER_TYPE_MOUSE ) { return true; } return false; } function touchStart(e) { if (shouldHandle(e)) { inLocalTouch = true; var touch = getTouch(e); startOffset.pageX = touch.pageX; startOffset.pageY = touch.pageY; startTime = new Date().getTime(); if (easingLoop !== null) { clearInterval(easingLoop); } e.stopPropagation(); } } function touchMove(e) { if (!inGlobalTouch && inLocalTouch && shouldHandle(e)) { var touch = getTouch(e); var currentOffset = { pageX: touch.pageX, pageY: touch.pageY }; var differenceX = currentOffset.pageX - startOffset.pageX; var differenceY = currentOffset.pageY - startOffset.pageY; applyTouchMove(differenceX, differenceY); startOffset = currentOffset; var currentTime = new Date().getTime(); var timeGap = currentTime - startTime; if (timeGap > 0) { speed.x = differenceX / timeGap; speed.y = differenceY / timeGap; startTime = currentTime; } if (shouldPreventDefault(differenceX, differenceY)) { e.stopPropagation(); e.preventDefault(); } } } function touchEnd() { if (!inGlobalTouch && inLocalTouch) { inLocalTouch = false; clearInterval(easingLoop); easingLoop = setInterval(function () { if (!instances.get(element)) { clearInterval(easingLoop); return; } if (Math.abs(speed.x) < 0.01 && Math.abs(speed.y) < 0.01) { clearInterval(easingLoop); return; } applyTouchMove(speed.x * 30, speed.y * 30); speed.x *= 0.8; speed.y *= 0.8; }, 10); } } if (supportsTouch) { i.event.bind(window, "touchstart", globalTouchStart); i.event.bind(window, "touchend", globalTouchEnd); i.event.bind(element, "touchstart", touchStart); i.event.bind(element, "touchmove", touchMove); i.event.bind(element, "touchend", touchEnd); } if (supportsIePointer) { if (window.PointerEvent) { i.event.bind(window, "pointerdown", globalTouchStart); i.event.bind(window, "pointerup", globalTouchEnd); i.event.bind(element, "pointerdown", touchStart); i.event.bind(element, "pointermove", touchMove); i.event.bind(element, "pointerup", touchEnd); } else if (window.MSPointerEvent) { i.event.bind(window, "MSPointerDown", globalTouchStart); i.event.bind(window, "MSPointerUp", globalTouchEnd); i.event.bind(element, "MSPointerDown", touchStart); i.event.bind(element, "MSPointerMove", touchMove); i.event.bind(element, "MSPointerUp", touchEnd); } } } module.exports = function (element, supportsTouch, supportsIePointer) { var i = instances.get(element); bindTouchHandler(element, i, supportsTouch, supportsIePointer); }; }, { "../instances": 18, "../update-geometry": 19, "../update-scroll": 20 }, ], 17: [ function (require, module, exports) { "use strict"; var cls = require("../lib/class"), h = require("../lib/helper"), instances = require("./instances"), updateGeometry = require("./update-geometry"); // Handlers var clickRailHandler = require("./handler/click-rail"), dragScrollbarHandler = require("./handler/drag-scrollbar"), keyboardHandler = require("./handler/keyboard"), mouseWheelHandler = require("./handler/mouse-wheel"), nativeScrollHandler = require("./handler/native-scroll"), selectionHandler = require("./handler/selection"), touchHandler = require("./handler/touch"); module.exports = function (element, userSettings) { userSettings = typeof userSettings === "object" ? userSettings : {}; cls.add(element, "ps-container"); // Create a plugin instance. var i = instances.add(element); i.settings = h.extend(i.settings, userSettings); cls.add(element, "ps-theme-" + i.settings.theme); clickRailHandler(element); dragScrollbarHandler(element); mouseWheelHandler(element); nativeScrollHandler(element); if (i.settings.useSelectionScroll) { selectionHandler(element); } if (h.env.supportsTouch || h.env.supportsIePointer) { touchHandler(element, h.env.supportsTouch, h.env.supportsIePointer); } if (i.settings.useKeyboard) { keyboardHandler(element); } updateGeometry(element); }; }, { "../lib/class": 2, "../lib/helper": 6, "./handler/click-rail": 10, "./handler/drag-scrollbar": 11, "./handler/keyboard": 12, "./handler/mouse-wheel": 13, "./handler/native-scroll": 14, "./handler/selection": 15, "./handler/touch": 16, "./instances": 18, "./update-geometry": 19, }, ], 18: [ function (require, module, exports) { "use strict"; var cls = require("../lib/class"), d = require("../lib/dom"), defaultSettings = require("./default-setting"), EventManager = require("../lib/event-manager"), guid = require("../lib/guid"), h = require("../lib/helper"); var instances = {}; function Instance(element) { var i = this; i.settings = h.clone(defaultSettings); i.containerWidth = null; i.containerHeight = null; i.contentWidth = null; i.contentHeight = null; i.isRtl = d.css(element, "direction") === "rtl"; i.isNegativeScroll = (function () { var originalScrollLeft = element.scrollLeft; var result = null; element.scrollLeft = -1; result = element.scrollLeft < 0; element.scrollLeft = originalScrollLeft; return result; })(); i.negativeScrollAdjustment = i.isNegativeScroll ? element.scrollWidth - element.clientWidth : 0; i.event = new EventManager(); i.ownerDocument = element.ownerDocument || document; function focus() { cls.add(element, "ps-focus"); } function blur() { cls.remove(element, "ps-focus"); } i.scrollbarXRail = d.appendTo( d.e("div", "ps-scrollbar-x-rail"), element ); i.scrollbarX = d.appendTo( d.e("div", "ps-scrollbar-x"), i.scrollbarXRail ); i.scrollbarX.setAttribute("tabindex", 0); i.event.bind(i.scrollbarX, "focus", focus); i.event.bind(i.scrollbarX, "blur", blur); i.scrollbarXActive = null; i.scrollbarXWidth = null; i.scrollbarXLeft = null; i.scrollbarXBottom = h.toInt(d.css(i.scrollbarXRail, "bottom")); i.isScrollbarXUsingBottom = i.scrollbarXBottom === i.scrollbarXBottom; // !isNaN i.scrollbarXTop = i.isScrollbarXUsingBottom ? null : h.toInt(d.css(i.scrollbarXRail, "top")); i.railBorderXWidth = h.toInt(d.css(i.scrollbarXRail, "borderLeftWidth")) + h.toInt(d.css(i.scrollbarXRail, "borderRightWidth")); // Set rail to display:block to calculate margins d.css(i.scrollbarXRail, "display", "block"); i.railXMarginWidth = h.toInt(d.css(i.scrollbarXRail, "marginLeft")) + h.toInt(d.css(i.scrollbarXRail, "marginRight")); d.css(i.scrollbarXRail, "display", ""); i.railXWidth = null; i.railXRatio = null; i.scrollbarYRail = d.appendTo( d.e("div", "ps-scrollbar-y-rail"), element ); i.scrollbarY = d.appendTo( d.e("div", "ps-scrollbar-y"), i.scrollbarYRail ); i.scrollbarY.setAttribute("tabindex", 0); i.event.bind(i.scrollbarY, "focus", focus); i.event.bind(i.scrollbarY, "blur", blur); i.scrollbarYActive = null; i.scrollbarYHeight = null; i.scrollbarYTop = null; i.scrollbarYRight = h.toInt(d.css(i.scrollbarYRail, "right")); i.isScrollbarYUsingRight = i.scrollbarYRight === i.scrollbarYRight; // !isNaN i.scrollbarYLeft = i.isScrollbarYUsingRight ? null : h.toInt(d.css(i.scrollbarYRail, "left")); i.scrollbarYOuterWidth = i.isRtl ? h.outerWidth(i.scrollbarY) : null; i.railBorderYWidth = h.toInt(d.css(i.scrollbarYRail, "borderTopWidth")) + h.toInt(d.css(i.scrollbarYRail, "borderBottomWidth")); d.css(i.scrollbarYRail, "display", "block"); i.railYMarginHeight = h.toInt(d.css(i.scrollbarYRail, "marginTop")) + h.toInt(d.css(i.scrollbarYRail, "marginBottom")); d.css(i.scrollbarYRail, "display", ""); i.railYHeight = null; i.railYRatio = null; } function getId(element) { if (typeof element.dataset === "undefined") { return element.getAttribute("data-ps-id"); } else { return element.dataset.psId; } } function setId(element, id) { if (typeof element.dataset === "undefined") { element.setAttribute("data-ps-id", id); } else { element.dataset.psId = id; } } function removeId(element) { if (typeof element.dataset === "undefined") { element.removeAttribute("data-ps-id"); } else { delete element.dataset.psId; } } exports.add = function (element) { var newId = guid(); setId(element, newId); instances[newId] = new Instance(element); return instances[newId]; }; exports.remove = function (element) { delete instances[getId(element)]; removeId(element); }; exports.get = function (element) { return instances[getId(element)]; }; }, { "../lib/class": 2, "../lib/dom": 3, "../lib/event-manager": 4, "../lib/guid": 5, "../lib/helper": 6, "./default-setting": 8, }, ], 19: [ function (require, module, exports) { "use strict"; var cls = require("../lib/class"), d = require("../lib/dom"), h = require("../lib/helper"), instances = require("./instances"), updateScroll = require("./update-scroll"); function getThumbSize(i, thumbSize) { if (i.settings.minScrollbarLength) { thumbSize = Math.max(thumbSize, i.settings.minScrollbarLength); } if (i.settings.maxScrollbarLength) { thumbSize = Math.min(thumbSize, i.settings.maxScrollbarLength); } return thumbSize; } function updateCss(element, i) { var xRailOffset = { width: i.railXWidth }; if (i.isRtl) { xRailOffset.left = i.negativeScrollAdjustment + element.scrollLeft + i.containerWidth - i.contentWidth; } else { xRailOffset.left = element.scrollLeft; } if (i.isScrollbarXUsingBottom) { xRailOffset.bottom = i.scrollbarXBottom - element.scrollTop; } else { xRailOffset.top = i.scrollbarXTop + element.scrollTop; } d.css(i.scrollbarXRail, xRailOffset); var yRailOffset = { top: element.scrollTop, height: i.railYHeight }; if (i.isScrollbarYUsingRight) { if (i.isRtl) { yRailOffset.right = i.contentWidth - (i.negativeScrollAdjustment + element.scrollLeft) - i.scrollbarYRight - i.scrollbarYOuterWidth; } else { yRailOffset.right = i.scrollbarYRight - element.scrollLeft; } } else { if (i.isRtl) { yRailOffset.left = i.negativeScrollAdjustment + element.scrollLeft + i.containerWidth * 2 - i.contentWidth - i.scrollbarYLeft - i.scrollbarYOuterWidth; } else { yRailOffset.left = i.scrollbarYLeft + element.scrollLeft; } } d.css(i.scrollbarYRail, yRailOffset); d.css(i.scrollbarX, { left: i.scrollbarXLeft, width: i.scrollbarXWidth - i.railBorderXWidth, }); d.css(i.scrollbarY, { top: i.scrollbarYTop, height: i.scrollbarYHeight - i.railBorderYWidth, }); } module.exports = function (element) { var i = instances.get(element); i.containerWidth = element.clientWidth; i.containerHeight = element.clientHeight; i.contentWidth = element.scrollWidth; i.contentHeight = element.scrollHeight; var existingRails; if (!element.contains(i.scrollbarXRail)) { existingRails = d.queryChildren(element, ".ps-scrollbar-x-rail"); if (existingRails.length > 0) { existingRails.forEach(function (rail) { d.remove(rail); }); } d.appendTo(i.scrollbarXRail, element); } if (!element.contains(i.scrollbarYRail)) { existingRails = d.queryChildren(element, ".ps-scrollbar-y-rail"); if (existingRails.length > 0) { existingRails.forEach(function (rail) { d.remove(rail); }); } d.appendTo(i.scrollbarYRail, element); } if ( !i.settings.suppressScrollX && i.containerWidth + i.settings.scrollXMarginOffset < i.contentWidth ) { i.scrollbarXActive = true; i.railXWidth = i.containerWidth - i.railXMarginWidth; i.railXRatio = i.containerWidth / i.railXWidth; i.scrollbarXWidth = getThumbSize( i, h.toInt((i.railXWidth * i.containerWidth) / i.contentWidth) ); i.scrollbarXLeft = h.toInt( ((i.negativeScrollAdjustment + element.scrollLeft) * (i.railXWidth - i.scrollbarXWidth)) / (i.contentWidth - i.containerWidth) ); } else { i.scrollbarXActive = false; } if ( !i.settings.suppressScrollY && i.containerHeight + i.settings.scrollYMarginOffset < i.contentHeight ) { i.scrollbarYActive = true; i.railYHeight = i.containerHeight - i.railYMarginHeight; i.railYRatio = i.containerHeight / i.railYHeight; i.scrollbarYHeight = getThumbSize( i, h.toInt((i.railYHeight * i.containerHeight) / i.contentHeight) ); i.scrollbarYTop = h.toInt( (element.scrollTop * (i.railYHeight - i.scrollbarYHeight)) / (i.contentHeight - i.containerHeight) ); } else { i.scrollbarYActive = false; } if (i.scrollbarXLeft >= i.railXWidth - i.scrollbarXWidth) { i.scrollbarXLeft = i.railXWidth - i.scrollbarXWidth; } if (i.scrollbarYTop >= i.railYHeight - i.scrollbarYHeight) { i.scrollbarYTop = i.railYHeight - i.scrollbarYHeight; } updateCss(element, i); if (i.scrollbarXActive) { cls.add(element, "ps-active-x"); } else { cls.remove(element, "ps-active-x"); i.scrollbarXWidth = 0; i.scrollbarXLeft = 0; updateScroll(element, "left", 0); } if (i.scrollbarYActive) { cls.add(element, "ps-active-y"); } else { cls.remove(element, "ps-active-y"); i.scrollbarYHeight = 0; i.scrollbarYTop = 0; updateScroll(element, "top", 0); } }; }, { "../lib/class": 2, "../lib/dom": 3, "../lib/helper": 6, "./instances": 18, "./update-scroll": 20, }, ], 20: [ function (require, module, exports) { "use strict"; var instances = require("./instances"); var upEvent = document.createEvent("Event"), downEvent = document.createEvent("Event"), leftEvent = document.createEvent("Event"), rightEvent = document.createEvent("Event"), yEvent = document.createEvent("Event"), xEvent = document.createEvent("Event"), xStartEvent = document.createEvent("Event"), xEndEvent = document.createEvent("Event"), yStartEvent = document.createEvent("Event"), yEndEvent = document.createEvent("Event"), lastTop, lastLeft; upEvent.initEvent("ps-scroll-up", true, true); downEvent.initEvent("ps-scroll-down", true, true); leftEvent.initEvent("ps-scroll-left", true, true); rightEvent.initEvent("ps-scroll-right", true, true); yEvent.initEvent("ps-scroll-y", true, true); xEvent.initEvent("ps-scroll-x", true, true); xStartEvent.initEvent("ps-x-reach-start", true, true); xEndEvent.initEvent("ps-x-reach-end", true, true); yStartEvent.initEvent("ps-y-reach-start", true, true); yEndEvent.initEvent("ps-y-reach-end", true, true); 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(yStartEvent); } if (axis === "left" && value <= 0) { element.scrollLeft = value = 0; // don't allow negative scroll element.dispatchEvent(xStartEvent); } var i = instances.get(element); if (axis === "top" && value >= i.contentHeight - i.containerHeight) { element.scrollTop = value = i.contentHeight - i.containerHeight; // don't allow scroll past container element.dispatchEvent(yEndEvent); } if (axis === "left" && value >= i.contentWidth - i.containerWidth) { element.scrollLeft = value = i.contentWidth - i.containerWidth; // don't allow scroll past container element.dispatchEvent(xEndEvent); } if (!lastTop) { lastTop = element.scrollTop; } if (!lastLeft) { lastLeft = element.scrollLeft; } if (axis === "top" && value < lastTop) { element.dispatchEvent(upEvent); } if (axis === "top" && value > lastTop) { element.dispatchEvent(downEvent); } if (axis === "left" && value < lastLeft) { element.dispatchEvent(leftEvent); } if (axis === "left" && value > lastLeft) { element.dispatchEvent(rightEvent); } if (axis === "top") { element.scrollTop = lastTop = value; element.dispatchEvent(yEvent); } if (axis === "left") { element.scrollLeft = lastLeft = value; element.dispatchEvent(xEvent); } }; }, { "./instances": 18 }, ], 21: [ function (require, module, exports) { "use strict"; var d = require("../lib/dom"), h = require("../lib/helper"), instances = require("./instances"), updateGeometry = require("./update-geometry"), updateScroll = require("./update-scroll"); module.exports = function (element) { var i = instances.get(element); if (!i) { return; } // Recalcuate negative scrollLeft adjustment i.negativeScrollAdjustment = i.isNegativeScroll ? element.scrollWidth - element.clientWidth : 0; // Recalculate rail margins d.css(i.scrollbarXRail, "display", "block"); d.css(i.scrollbarYRail, "display", "block"); i.railXMarginWidth = h.toInt(d.css(i.scrollbarXRail, "marginLeft")) + h.toInt(d.css(i.scrollbarXRail, "marginRight")); i.railYMarginHeight = h.toInt(d.css(i.scrollbarYRail, "marginTop")) + h.toInt(d.css(i.scrollbarYRail, "marginBottom")); // Hide scrollbars not to affect scrollWidth and scrollHeight d.css(i.scrollbarXRail, "display", "none"); d.css(i.scrollbarYRail, "display", "none"); updateGeometry(element); // Update top/left scroll to trigger events updateScroll(element, "top", element.scrollTop); updateScroll(element, "left", element.scrollLeft); d.css(i.scrollbarXRail, "display", ""); d.css(i.scrollbarYRail, "display", ""); }; }, { "../lib/dom": 3, "../lib/helper": 6, "./instances": 18, "./update-geometry": 19, "./update-scroll": 20, }, ], }, {}, [1] );