PageSourceSearch

https://mache.tv/js/perfect-scrollbar.jquery.js

js mache.tv collected 2026-09-24 10:04:51 UTC 48,563 bytes, 1,617 lines download raw bytes

1/* perfect-scrollbar v0.6.8 */
2(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){
3/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
4 * Licensed under the MIT License
5 */
6'use strict';
7
8var ps = require('../main')
9  , psInstances = require('../plugin/instances');
10
11function mountJQuery(jQuery) {
12  jQuery.fn.perfectScrollbar = function (settingOrCommand) {
13    return this.each(function () {
14      if (typeof settingOrCommand === 'object' ||
15          typeof settingOrCommand === 'undefined') {
16        // If it's an object or none, initialize.
17        var settings = settingOrCommand;
18
19        if (!psInstances.get(this)) {
20          ps.initialize(this, settings);
21        }
22      } else {
23        // Unless, it may be a command.
24        var command = settingOrCommand;
25
26        if (command === 'update') {
27          ps.update(this);
28        } else if (command === 'destroy') {
29          ps.destroy(this);
30        }
31      }
32
33      return jQuery(this);
34    });
35  };
36}
37
38if (typeof define === 'function' && define.amd) {
39  // AMD. Register as an anonymous module.
40  define(['jquery'], mountJQuery);
41} else {
42  var jq = window.jQuery ? window.jQuery : window.$;
43  if (typeof jq !== 'undefined') {
44    mountJQuery(jq);
45  }
46}
47
48module.exports = mountJQuery;
49
50},{"../main":7,"../plugin/instances":18}],2:[function(require,module,exports){
51/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
52 * Licensed under the MIT License
53 */
54'use strict';
55
56function oldAdd(element, className) {
57  var classes = element.className.split(' ');
58  if (classes.indexOf(className) < 0) {
59    classes.push(className);
60  }
61  element.className = classes.join(' ');
62}
63
64function oldRemove(element, className) {
65  var classes = element.className.split(' ');
66  var idx = classes.indexOf(className);
67  if (idx >= 0) {
68    classes.splice(idx, 1);
69  }
70  element.className = classes.join(' ');
71}
72
73exports.add = function (element, className) {
74  if (element.classList) {
75    element.classList.add(className);
76  } else {
77    oldAdd(element, className);
78  }
79};
80
81exports.remove = function (element, className) {
82  if (element.classList) {
83    element.classList.remove(className);
84  } else {
85    oldRemove(element, className);
86  }
87};
88
89exports.list = function (element) {
90  if (element.classList) {
91    return Array.prototype.slice.apply(element.classList);
92  } else {
93    return element.className.split(' ');
94  }
95};
96
97},{}],3:[function(require,module,exports){
98/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
99 * Licensed under the MIT License
100 */
101'use strict';
102
103var DOM = {};
104
105DOM.e = function (tagName, className) {
106  var element = document.createElement(tagName);
107  element.className = className;
108  return element;
109};
110
111DOM.appendTo = function (child, parent) {
112  parent.appendChild(child);
113  return child;
114};
115
116function cssGet(element, styleName) {
117  return window.getComputedStyle(element)[styleName];
118}
119
120function cssSet(element, styleName, styleValue) {
121  if (typeof styleValue === 'number') {
122    styleValue = styleValue.toString() + 'px';
123  }
124  element.style[styleName] = styleValue;
125  return element;
126}
127
128function cssMultiSet(element, obj) {
129  for (var key in obj) {
130    var val = obj[key];
131    if (typeof val === 'number') {
132      val = val.toString() + 'px';
133    }
134    element.style[key] = val;
135  }
136  return element;
137}
138
139DOM.css = function (element, styleNameOrObject, styleValue) {
140  if (typeof styleNameOrObject === 'object') {
141    // multiple set with object
142    return cssMultiSet(element, styleNameOrObject);
143  } else {
144    if (typeof styleValue === 'undefined') {
145      return cssGet(element, styleNameOrObject);
146    } else {
147      return cssSet(element, styleNameOrObject, styleValue);
148    }
149  }
150};
151
152DOM.matches = function (element, query) {
153  if (typeof element.matches !== 'undefined') {
154    return element.matches(query);
155  } else {
156    if (typeof element.matchesSelector !== 'undefined') {
157      return element.matchesSelector(query);
158    } else if (typeof element.webkitMatchesSelector !== 'undefined') {
159      return element.webkitMatchesSelector(query);
160    } else if (typeof element.mozMatchesSelector !== 'undefined') {
161      return element.mozMatchesSelector(query);
162    }
162 else if (typeof element.msMatchesSelector !== 'undefined') {
163      return element.msMatchesSelector(query);
164    }
165  }
166};
167
168DOM.remove = function (element) {
169  if (typeof element.remove !== 'undefined') {
170    element.remove();
171  } else {
172    if (element.parentNode) {
173      element.parentNode.removeChild(element);
174    }
175  }
176};
177
178DOM.queryChildren = function (element, selector) {
179  return Array.prototype.filter.call(element.childNodes, function (child) {
180    return DOM.matches(child, selector);
181  });
182};
183
184module.exports = DOM;
185
186},{}],4:[function(require,module,exports){
187/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
188 * Licensed under the MIT License
189 */
190'use strict';
191
192var EventElement = function (element) {
193  this.element = element;
194  this.events = {};
195};
196
197EventElement.prototype.bind = function (eventName, handler) {
198  if (typeof this.events[eventName] === 'undefined') {
199    this.events[eventName] = [];
200  }
201  this.events[eventName].push(handler);
202  this.element.addEventListener(eventName, handler, false);
203};
204
205EventElement.prototype.unbind = function (eventName, handler) {
206  var isHandlerProvided = (typeof handler !== 'undefined');
207  this.events[eventName] = this.events[eventName].filter(function (hdlr) {
208    if (isHandlerProvided && hdlr !== handler) {
209      return true;
210    }
211    this.element.removeEventListener(eventName, hdlr, false);
212    return false;
213  }, this);
214};
215
216EventElement.prototype.unbindAll = function () {
217  for (var name in this.events) {
218    this.unbind(name);
219  }
220};
221
222var EventManager = function () {
223  this.eventElements = [];
224};
225
226EventManager.prototype.eventElement = function (element) {
227  var ee = this.eventElements.filter(function (eventElement) {
228    return eventElement.element === element;
229  })[0];
230  if (typeof ee === 'undefined') {
231    ee = new EventElement(element);
232    this.eventElements.push(ee);
233  }
234  return ee;
235};
236
237EventManager.prototype.bind = function (element, eventName, handler) {
238  this.eventElement(element).bind(eventName, handler);
239};
240
241EventManager.prototype.unbind = function (element, eventName, handler) {
242  this.eventElement(element).unbind(eventName, handler);
243};
244
245EventManager.prototype.unbindAll = function () {
246  for (var i = 0; i < this.eventElements.length; i++) {
247    this.eventElements[i].unbindAll();
248  }
249};
250
251EventManager.prototype.once = function (element, eventName, handler) {
252  var ee = this.eventElement(element);
253  var onceHandler = function (e) {
254    ee.unbind(eventName, onceHandler);
255    handler(e);
256  };
257  ee.bind(eventName, onceHandler);
258};
259
260module.exports = EventManager;
261
262},{}],5:[function(require,module,exports){
263/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
264 * Licensed under the MIT License
265 */
266'use strict';
267
268module.exports = (function () {
269  function s4() {
270    return Math.floor((1 + Math.random()) * 0x10000)
271               .toString(16)
272               .substring(1);
273  }
274  return function () {
275    return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
276           s4() + '-' + s4() + s4() + s4();
277  };
278})();
279
280},{}],6:[function(require,module,exports){
281/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
282 * Licensed under the MIT License
283 */
284'use strict';
285
286var cls = require('./class')
287  , d = require('./dom');
288
289exports.toInt = function (x) {
290  return parseInt(x, 10) || 0;
291};
292
293exports.clone = function (obj) {
294  if (obj === null) {
295    return null;
296  } else if (typeof obj === 'object') {
297    var result = {};
298    for (var key in obj) {
299      result[key] = this.clone(obj[key]);
300    }
301    return result;
302  } else {
303    return obj;
304  }
305};
306
307exports.extend = function (original, source) {
308  var result = this.clone(original);
309  for (var key in source) {
310    result[key] = this.clone(source[key]);
311  }
312  return result;
313};
314
315exports.isEditable = function (el) {
316  return d.matches(el, "input,[contenteditable]") ||
317         d.matches(el, "select,[contenteditable]") ||
318         d.matches(el, "textarea,[contenteditable]") ||
319         d.matches(el, "button,[contenteditable]");
320};
321
322exports.removePsClasses = function (element) {
323  var clsList = cls.list(element);
324  for (var i = 0; i < clsList.length; i++) {
325    var className = clsList[i];
326    if (className.indexOf('ps-') === 0) {
327      cls.remove(element, className);
328    }
329  }
330};
331
332exports.outerWidth = function (element) {
333  return this.toInt(d.css(element, 'width')) +
334         this.toInt(d.css(element, 'paddingLeft')) +
335         this.toInt(d.css(element, 'paddingRight')) +
336         this.toInt(d.css(element, 'borderLeftWidth')) +
337         this.toInt(d.css(element, 'borderRightWidth'));
338};
339
340exports.startScrolling = function (element, axis) {
341  cls.add(element, 'ps-in-scrolling');
342  if (typeof axis !== 'undefined') {
343    cls.add(element, 'ps-' + axis);
344  } else {
345    cls.add(element, 'ps-x');
346    cls.add(element, 'ps-y');
347  }
348};
349
350exports.stopScrolling = function (element, axis) {
351  cls.remove(element, 'ps-in-scrolling');
352  if (typeof axis !== 'undefined') {
353    cls.remove(element, 'ps-' + axis);
354  } else {
355    cls.remove(element, 'ps-x');
356    cls.remove(element, 'ps-y');
357  }
358};
359
360exports.env = {
361  isWebKit: 'WebkitAppearance' in document.documentElement.style,
362  supportsTouch: (('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch),
363  supportsIePointer: window.navigator.msMaxTouchPoints !== null
364};
365
366},{"./class":2,"./dom":3}],7:[function(require,module,exports){
367/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
368 * Licensed under the MIT License
369 */
370'use strict';
371
372var destroy = require('./plugin/destroy')
373  , initialize = require('./plugin/initialize')
374  , update = require('./plugin/update');
375
376module.exports = {
377  initialize: initialize,
378  update: update,
379  destroy: destroy
380};
381
382},{"./plugin/destroy":9,"./plugin/initialize":17,"./plugin/update":2
3821}],8:[function(require,module,exports){
383/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
384 * Licensed under the MIT License
385 */
386'use strict';
387
388module.exports = {
389  maxScrollbarLength: null,
390  minScrollbarLength: null,
391  scrollXMarginOffset: 0,
392  scrollYMarginOffset: 0,
393  stopPropagationOnClick: true,
394  suppressScrollX: false,
395  suppressScrollY: false,
396  swipePropagation: true,
397  useBothWheelAxes: false,
398  useKeyboard: true,
399  useSelectionScroll: false,
400  wheelPropagation: false,
401  wheelSpeed: 1
402};
403
404},{}],9:[function(require,module,exports){
405/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
406 * Licensed under the MIT License
407 */
408'use strict';
409
410var d = require('../lib/dom')
411  , h = require('../lib/helper')
412  , instances = require('./instances');
413
414module.exports = function (element) {
415  var i = instances.get(element);
416
417  if (!i) {
418    return;
419  }
420
421  i.event.unbindAll();
422  d.remove(i.scrollbarX);
423  d.remove(i.scrollbarY);
424  d.remove(i.scrollbarXRail);
425  d.remove(i.scrollbarYRail);
426  h.removePsClasses(element);
427
428  instances.remove(element);
429};
430
431},{"../lib/dom":3,"../lib/helper":6,"./instances":18}],10:[function(require,module,exports){
432/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
433 * Licensed under the MIT License
434 */
435'use strict';
436
437var h = require('../../lib/helper')
438  , instances = require('../instances')
439  , updateGeometry = require('../update-geometry')
440  , updateScroll = require('../update-scroll');
441
442function bindClickRailHandler(element, i) {
443  function pageOffset(el) {
444    return el.getBoundingClientRect();
445  }
446  var stopPropagation = window.Event.prototype.stopPropagation.bind;
447
448  if (i.settings.stopPropagationOnClick) {
449    i.event.bind(i.scrollbarY, 'click', stopPropagation);
450  }
451  i.event.bind(i.scrollbarYRail, 'click', function (e) {
452    var halfOfScrollbarLength = h.toInt(i.scrollbarYHeight / 2);
453    var positionTop = i.railYRatio * (e.pageY - window.pageYOffset - pageOffset(i.scrollbarYRail).top - halfOfScrollbarLength);
454    var maxPositionTop = i.railYRatio * (i.railYHeight - i.scrollbarYHeight);
455    var positionRatio = positionTop / maxPositionTop;
456
457    if (positionRatio < 0) {
458      positionRatio = 0;
459    } else if (positionRatio > 1) {
460      positionRatio = 1;
461    }
462
463    updateScroll(element, 'top', (i.contentHeight - i.containerHeight) * positionRatio);
464    updateGeometry(element);
465
466    e.stopPropagation();
467  });
468
469  if (i.settings.stopPropagationOnClick) {
470    i.event.bind(i.scrollbarX, 'click', stopPropagation);
471  }
472  i.event.bind(i.scrollbarXRail, 'click', function (e) {
473    var halfOfScrollbarLength = h.toInt(i.scrollbarXWidth / 2);
474    var positionLeft = i.railXRatio * (e.pageX - window.pageXOffset - pageOffset(i.scrollbarXRail).left - halfOfScrollbarLength);
475    var maxPositionLeft = i.railXRatio * (i.railXWidth - i.scrollbarXWidth);
476    var positionRatio = positionLeft / maxPositionLeft;
477
478    if (positionRatio < 0) {
479      positionRatio = 0;
480    } else if (positionRatio > 1) {
481      positionRatio = 1;
482    }
483
484    updateScroll(element, 'left', ((i.contentWidth - i.containerWidth) * positionRatio) - i.negativeScrollAdjustment);
485    updateGeometry(element);
486
487    e.stopPropagation();
488  });
489}
490
491module.exports = function (element) {
492  var i = instances.get(element);
493  bindClickRailHandler(element, i);
494};
495
496},{"../../lib/helper":6,"../instances":18,"../update-geometry":19,"../update-scroll":20}],11:[function(require,module,exports){
497/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
498 * Licensed under the MIT License
499 */
500'use strict';
501
502var d = require('../../lib/dom')
503  , h = require('../../lib/helper')
504  , instances = require('../instances')
505  , updateGeometry = require('../update-geometry')
506  , updateScroll = require('../update-scroll');
507
508function bindMouseScrollXHandler(element, i) {
509  var currentLeft = null;
510  var currentPageX = null;
511
512  function updateScrollLeft(deltaX) {
513    var newLeft = currentLeft + (deltaX * i.railXRatio);
514    var maxLeft = Math.max(0, i.scrollbarXRail.getBoundingClientRect().left) + (i.railXRatio * (i.railXWidth - i.scrollbarXWidth));
515
516    if (newLeft < 0) {
517      i.scrollbarXLeft = 0;
518    } else if (newLeft > maxLeft) {
519      i.scrollbarXLeft = maxLeft;
520    } else {
521      i.scrollbarXLeft = newLeft;
522    }
523
524    var scrollLeft = h.toInt(i.scrollbarXLeft * (i.contentWidth - i.containerWidth) / (i.containerWidth - (i.railXRatio * i.scrollbarXWidth))) - i.negativeScrollAdjustment;
525    updateScroll(element, 'left', scrollLeft);
526  }
527
528  var mouseMoveHandler = function (e) {
529    updateScrollLeft(e.pageX - currentPageX);
530    updateGeometry(element);
531    e.stopPropagation();
532    e.preventDefault();
533  };
534
535  var mouseUpHandler = function () {
536    h.stopScrolling(element, 'x');
537    i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler);
538  };
539
540  i.event.bind(i.scrollbarX, 'mousedown', function (e) {
541    currentPageX = e.pageX;
542    currentLeft = h.toInt(d.css(i.scrollbarX, 'left')) * i.railXRatio;
543    h.startScrolling(element, 'x');
544
545    i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler);
546    i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler);
547
548    e.stopPropagation();
549    e.preventDefault();
550  });
551}
552
553function bindMouseScrollYHandler(element, i) {
554  var currentTop = null;
555  var currentPageY = null;
556
557  function updateScrollTop(deltaY) {
558    var newTop = currentTop + (deltaY * i.railYRatio);
559    var maxTop = Math.max(0, i.scrollbarYRail.getBoundingClientRect().top) + (i.railYRatio * (i.railYHeight - i.scrollbarYHeight));
560
561    if (newTop < 0) {
562      i.scrollbarYTop = 0;
563    } else if (newTop > maxTop) {
564      i.scrollbarYTop = maxTop;
565    } else {
566      i.scrollbarYTop = newTop;
567    }
568
569    var scrollTop = h.toInt(i.scrollbarYTop * (i.contentHeight - i.containerHeight) / (i.containerHeight - (i.railYRatio * i.scrollbarYHeight)));
570    updateScroll(element, 'top', scrollTop);
571  }
572
573  var mouseMoveHandler = function (e) {
574    updateScrollTop(e.pageY - currentPageY);
575    updateGeometry(element);
576    e.stopPropagation();
577    e.preventDefault();
578  };
579
580  var mouseUpHandler = function () {
581    h.stopScrolling(element, 'y');
582    i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler);
583  };
584
585  i.event.bind(i.scrollbarY, 'mousedown', function (e) {
586    currentPageY = e.pageY;
587    currentTop = h.toInt(d.css(i.scrollbarY, 'top')) * i.railYRatio;
588    h.startScrolling(element, 'y');
589
590    i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler);
591    i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler);
592
593    e.stopPropagation();
594    e.preventDefault();
595  });
596}
597
598module.exports = function (element) {
599  var i = instances.get(element);
600  bindMouseScrollXHandler(element, i);
601  bindMouseScrollYHandler(element, i);
602};
603
604},{"../../lib/dom":3,"../../lib/helper":6,"../instances":18,"../update-geometry":19,"../update-scroll":20}],12:[function(require,module,exports){
605/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
606 * Licensed under the MIT License
607 */
608'use strict';
609
610var h = require('../../lib/helper')
611  , instances = require('../instances')
612  , updateGeometry = require('../update-geometry')
613  , updateScroll = require('../update-scroll');
614
615function bindKeyboardHandler(element, i) {
616  var hovered = false;
617  i.event.bind(element, 'mouseenter', function () {
618    hovered = true;
619  });
620  i.event.bind(element, 'mouseleave', function () {
621    hovered = false;
622  });
623
624  var shouldPrevent = false;
625  function shouldPreventDefault(deltaX, deltaY) {
626    var scrollTop = element.scrollTop;
627    if (deltaX === 0) {
628      if (!i.scrollbarYActive) {
629        return false;
630      }
631      if ((scrollTop === 0 && deltaY > 0) || (scrollTop >= i.contentHeight - i.containerHeight && deltaY < 0)) {
632        return !i.settings.wheelPropagation;
633      }
634    }
635
636    var scrollLeft = element.scrollLeft;
637    if (deltaY === 0) {
638      if (!i.scrollbarXActive) {
639        return false;
640      }
641      if ((scrollLeft === 0 && deltaX < 0) || (scrollLeft >= i.contentWidth - i.containerWidth && deltaX > 0)) {
642        return !i.settings.wheelPropagation;
643      }
644    }
645    return true;
646  }
647
648  i.event.bind(i.ownerDocument, 'keydown', function (e) {
649    if (e.isDefaultPrevented && e.isDefaultPrevented()) {
650      return;
651    }
652
653    if (!hovered) {
654      return;
655    }
656
657    var activeElement = document.activeElement ? document.activeElement : i.ownerDocument.activeElement;
658    if (activeElement) {
659      // go deeper if element is a webcomponent
660      while (activeElement.shadowRoot) {
661        activeElement = activeElement.shadowRoot.activeElement;
662      }
663      if (h.isEditable(activeElement)) {
664        return;
665      }
666    }
667
668    var deltaX = 0;
669    var deltaY = 0;
670
671    switch (e.which) {
672    case 37: // left
673      deltaX = -30;
674      break;
675    case 38: // up
676      deltaY = 30;
677      break;
678    case 39: // right
679      deltaX = 30;
680      break;
681    case 40: // down
682      deltaY = -30;
683      break;
684    case 33: // page up
685      deltaY = 90;
686      break;
687    case 32: // space bar
688      if (e.shiftKey) {
689        deltaY = 90;
690      } else {
691        deltaY = -90;
692      }
693      break;
694    case 34: // page down
695      deltaY = -90;
696      break;
697    case 35: // end
698      if (e.ctrlKey) {
699        deltaY = -i.contentHeight;
700      } else {
701        deltaY = -i.containerHeight;
702      }
703      break;
704    case 36: // home
705      if (e.ctrlKey) {
706        deltaY = element.scrollTop;
707      } else {
708        deltaY = i.containerHeight;
709      }
710      break;
711    default:
712      return;
713    }
714
715    updateScroll(element, 'top', element.scrollTop - deltaY);
716    updateScroll(element, 'left', element.scrollLeft + deltaX);
717    updateGeometry(element);
718
719    shouldPrevent = shouldPreventDefault(deltaX, deltaY);
720    if (shouldPrevent) {
721      e.preventDefault();
722    }
723  });
724}
725
726module.exports = function (element) {
727  var i = instances.get(element);
728  bindKeyboardHandler(element, i);
729};
730
731},{"../../lib/helper":6,"../instances":18,"../update-geometry":19,"../update-scroll":20}],13:[function(require,module,exports){
732/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
733 * Licensed under the MIT License
734 */
735'use strict';
736
737var instances = require('../instances')
738  , updateGeometry = require('../update-geometry')
739  , updateScroll = require('../update-scroll');
740
741function bindMouseWheelHandler(element, i) {
742  var shouldPrevent = false;
743
744  function shouldPreventDefault(deltaX, deltaY) {
745    var scrollTop = element.scrollTop;
746    if (deltaX === 0) {
747      if (!i.scrollbarYActive) {
748        return false;
749      }
750      if ((scrollTop === 0 && deltaY > 0) || (scrollTop >= i.contentHeight - i.containerHeight && deltaY < 0)) {
751        return !i.settings.wheelPropagation;
752      }
753    }
754
755    var scrollLeft = element.scrollLeft;
756    if (deltaY === 0) {
757      if (!i.scrollbarXActive) {
758        return false;
759      }
760      if ((scrollLeft === 0 && deltaX < 0) || (scrollLeft >= i.contentWidth - i.containerWidth && deltaX > 0)) {
761        return !i.settings.wheelPropagation;
762      }
763    }
764    return true;
765  }
766
767  function getDeltaFromEvent(e) {
768    var deltaX = e.deltaX;
769    var deltaY = -1 * e.deltaY;
770
771    if (typeof deltaX === "undefined" || typeof deltaY === "undefined") {
772      // OS X Safari
773      deltaX = -1 * e.wheelDeltaX / 6;
774      deltaY = e.wheelDeltaY / 6;
775    }
776
777    if (e.deltaMode && e.deltaMode === 1) {
778      // Firefox in deltaMode 1: Line scrolling
779      deltaX *= 10;
780      deltaY *= 10;
781    }
782
783    if (deltaX !== deltaX && deltaY !== deltaY/* NaN checks */) {
784      // IE in some mouse drivers
785      deltaX = 0;
786      deltaY = e.wheelDelta;
787    }
788
789    return [deltaX, deltaY];
790  }
791
792  function shouldBeConsumedByTextarea(deltaX, deltaY) {
793    var hoveredTextarea = element.querySelector('textarea:hover');
794    if (hoveredTextarea) {
795      var maxScrollTop = hoveredTextarea.scrollHeight - hoveredTextarea.clientHeight;
796      if (maxScrollTop > 0) {
797        if (!(hoveredTextarea.scrollTop === 0 && deltaY > 0) &&
798            !(hoveredTextarea.scrollTop === maxScrollTop && deltaY < 0)) {
799          return true;
800        }
801      }
802      var maxScrollLeft = hoveredTextarea.scrollLeft - hoveredTextarea.clientWidth;
803      if (maxScrollLeft > 0) {
804        if (!(hoveredTextarea.scrollLeft === 0 && deltaX < 0) &&
805            !(hoveredTextarea.scrollLeft === maxScrollLeft && deltaX > 0)) {
806          return true;
807        }
808      }
809    }
810    return false;
811  }
812
813  function mousewheelHandler(e) {
814    var delta = getDeltaFromEvent(e);
815
816    var deltaX = delta[0];
817    var deltaY = delta[1];
818
819    if (shouldBeConsumedByTextarea(deltaX, deltaY)) {
820      return;
821    }
822
823    shouldPrevent = false;
824    if (!i.settings.useBothWheelAxes) {
825      // deltaX will only be used for horizontal scrolling and deltaY will
826      // only be used for vertical scrolling - this is the default
827      updateScroll(element, 'top', element.scrollTop - (deltaY * i.settings.wheelSpeed));
828      updateScroll(element, 'left', element.scrollLeft + (deltaX * i.settings.wheelSpeed));
829    } else if (i.scrollbarYActive && !i.scrollbarXActive) {
830      // only vertical scrollbar is active and useBothWheelAxes option is
831      // active, so let's scroll vertical bar using both mouse wheel axes
832      if (deltaY) {
833        updateScroll(element, 'top', element.scrollTop - (deltaY * i.settings.wheelSpeed));
834      } else {
835        updateScroll(element, 'top', element.scrollTop + (deltaX * i.settings.wheelSpeed));
836      }
837      shouldPrevent = true;
838    } else if (i.scrollbarXActive && !i.scrollbarYActive) {
839      // useBothWheelAxes and only horizontal bar is active, so use both
840      // wheel axes for horizontal bar
841      if (deltaX) {
842        updateScroll(element, 'left', element.scrollLeft + (deltaX * i.settings.wheelSpeed));
843      } else {
844        updateScroll(element, 'left', element.scrollLeft - (deltaY * i.settings.wheelSpeed));
845      }
846      shouldPrevent = true;
847    }
848
849    updateGeometry(element);
850
851    shouldPrevent = (shouldPrevent || shouldPreventDefault(deltaX, deltaY));
852    if (shouldPrevent) {
853      e.stopPropagation();
854      e.preventDefault();
855    }
856  }
857
858  if (typeof window.onwheel !== "undefined") {
859    i.event.bind(element, 'wheel', mousewheelHandler);
860  } else if (typeof window.onmousewheel !== "undefined") {
861    i.event.bind(element, 'mousewheel', mousewheelHandler);
862  }
863}
864
865module.exports = function (element) {
866  var i = instances.get(element);
867  bindMouseWheelHandler(element, i);
868};
869
870},{"../instances":18,"../update-geometry":19,"../update-scroll":20}],14:[function(require,module,exports){
871/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
872 * Licensed under the MIT License
873 */
874'use strict';
875
876var instances = require('../instances')
877  , updateGeometry = require('../update-geometry');
878
879function bindNativeScrollHandler(element, i) {
880  i.event.bind(element, 'scroll', function () {
881    updateGeometry(element);
882  });
883}
884
885module.exports = function (element) {
886  var i = instances.get(element);
887  bindNativeScrollHandler(element, i);
888};
889
890},{"../instances":18,"../update-geometry":19}],15:[function(require,module,exports){
891/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
892 * Licensed under the MIT License
893 */
894'use strict';
895
896var h = require('../../lib/helper')
897  , instances = require('../instances')
898  , updateGeometry = require('../update-geometry')
899  , updateScroll = require('../update-scroll');
900
901function bindSelectionHandler(element, i) {
902  function getRangeNode() {
903    var selection = window.getSelection ? window.getSelection() :
904                    document.getSelection ? document.getSelection() : '';
905    if (selection.toString().length === 0) {
906      return null;
907    } else {
908      return selection.getRangeAt(0).commonAncestorContainer;
909    }
910  }
911
912  var scrollingLoop = null;
913  var scrollDiff = {top: 0, left: 0};
914  function startScrolling() {
915    if (!scrollingLoop) {
916      scrollingLoop = setInterval(function () {
917        if (!instances.get(element)) {
918          clearInterval(scrollingLoop);
919          return;
920        }
921
922        updateScroll(element, 'top', element.scrollTop + scrollDiff.top);
923        updateScroll(element, 'left', element.scrollLeft + scrollDiff.left);
924        updateGeometry(element);
925      }, 50); // every .1 sec
926    }
927  }
928  function stopScrolling() {
929    if (scrollingLoop) {
930      clearInterval(scrollingLoop);
931      scrollingLoop = null;
932    }
933    h.stopScrolling(element);
934  }
935
936  var isSelected = false;
937  i.event.bind(i.ownerDocument, 'selectionchange', function () {
938    if (element.contains(getRangeNode())) {
939      isSelected = true;
940    } else {
941      isSelected = false;
942      stopScrolling();
943    }
944  });
945  i.event.bind(window, 'mouseup', function () {
946    if (isSelected) {
947      isSelected = false;
948      stopScrolling();
949    }
950  });
951
952  i.event.bind(window, 'mousemove', function (e) {
953    if (isSelected) {
954      var mousePosition = {x: e.pageX, y: e.pageY};
955      var containerGeometry = {
956        left: element.offsetLeft,
957        right: element.offsetLeft + element.offsetWidth,
958        top: element.offsetTop,
959        bottom: element.offsetTop + element.offsetHeight
960      };
961
962      if (mousePosition.x < containerGeometry.left + 3) {
963        scrollDiff.left = -5;
964        h.startScrolling(element, 'x');
965      } else if (mousePosition.x > containerGeometry.right - 3) {
966        scrollDiff.left = 5;
967        h.startScrolling(element, 'x');
968      } else {
969        scrollDiff.left = 0;
970      }
971
972      if (mousePosition.y < containerGeometry.top + 3) {
973        if (containerGeometry.top + 3 - mousePosition.y < 5) {
974          scrollDiff.top = -5;
975        } else {
976          scrollDiff.top = -20;
977        }
978        h.startScrolling(element, 'y');
979      } else if (mousePosition.y > containerGeometry.bottom - 3) {
980        if (mousePosition.y - containerGeometry.bottom + 3 < 5) {
981          scrollDiff.top = 5;
982        } else {
983          scrollDiff.top = 20;
984        }
985        h.startScrolling(element, 'y');
986      } else {
987        scrollDiff.top = 0;
988      }
989
990      if (scrollDiff.top === 0 && scrollDiff.left === 0) {
991        stopScrolling();
992      } else {
993        startScrolling();
994      }
995    }
996  });
997}
998
999module.exports = function (element) {
1000  var i = instances.get(element);
1001  bindSelectionHandler(element, i);
1002};
1003
1004},{"../../lib/helper":6,"../instances":18,"../update-geometry":19,"../update-scroll":20}],16:[function(require,module,exports){
1005/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
1006 * Licensed under the MIT License
1007 */
1008'use strict';
1009
1010var instances = require('../instances')
1011  , updateGeometry = require('../update-geometry')
1012  , updateScroll = require('../update-scroll');
1013
1014function bindTouchHandler(element, i, supportsTouch, supportsIePointer) {
1015  function shouldPreventDefault(deltaX, deltaY) {
1016    var scrollTop = element.scrollTop;
1017    var scrollLeft = element.scrollLeft;
1018    var magnitudeX = Math.abs(deltaX);
1019    var magnitudeY = Math.abs(deltaY);
1020
1021    if (magnitudeY > magnitudeX) {
1022      // user is perhaps trying to swipe up/down the page
1023
1024      if (((deltaY < 0) && (scrollTop === i.contentHeight - i.containerHeight)) ||
1025          ((deltaY > 0) && (scrollTop === 0))) {
1026        return !i.settings.swipePropagation;
1027      }
1028    } else if (magnitudeX > magnitudeY) {
1029      // user is perhaps trying to swipe left/right across the page
1030
1031      if (((deltaX < 0) && (scrollLeft === i.contentWidth - i.containerWidth)) ||
1032          ((deltaX > 0) && (scrollLeft === 0))) {
1033        return !i.settings.swipePropagation;
1034      }
1035    }
1036
1037    return true;
1038  }
1039
1040  function applyTouchMove(differenceX, differenceY) {
1041    updateScroll(element, 'top', element.scrollTop - differenceY);
1042    updateScroll(element, 'left', element.scrollLeft - differenceX);
1043
1044    updateGeometry(element);
1045  }
1046
1047  var startOffset = {};
1048  var startTime = 0;
1049  var speed = {};
1050  var easingLoop = null;
1051  var inGlobalTouch = false;
1052  var inLocalTouch = false;
1053
1054  function globalTouchStart() {
1055    inGlobalTouch = true;
1056  }
1057  function globalTouchEnd() {
1058    inGlobalTouch = false;
1059  }
1060
1061  function getTouch(e) {
1062    if (e.targetTouches) {
1063      return e.targetTouches[0];
1064    } else {
1065      // Maybe IE pointer
1066      return e;
1067    }
1068  }
1069  function shouldHandle(e) {
1070    if (e.targetTouches && e.targetTouches.length === 1) {
1071      return true;
1072    }
1073    if (e.pointerType && e.pointerType !== 'mouse' && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) {
1074      return true;
1075    }
1076    return false;
1077  }
1078  function touchStart(e) {
1079    if (shouldHandle(e)) {
1080      inLocalTouch = true;
1081
1082      var touch = getTouch(e);
1083
1084      startOffset.pageX = touch.pageX;
1085      startOffset.pageY = touch.pageY;
1086
1087      startTime = (new Date()).getTime();
1088
1089      if (easingLoop !== null) {
1090        clearInterval(easingLoop);
1091      }
1092
1093      e.stopPropagation();
1094    }
1095  }
1096  function touchMove(e) {
1097    if (!inGlobalTouch && inLocalTouch && shouldHandle(e)) {
1098      var touch = getTouch(e);
1099
1100      var currentOffset = {pageX: touch.pageX, pageY: touch.pageY};
1101
1102      var differenceX = currentOffset.pageX - startOffset.pageX;
1103      var differenceY = currentOffset.pageY - startOffset.pageY;
1104
1105      applyTouchMove(differenceX, differenceY);
1106      startOffset = currentOffset;
1107
1108      var currentTime = (new Date()).getTime();
1109
1110      var timeGap = currentTime - startTime;
1111      if (timeGap > 0) {
1112        speed.x = differenceX / timeGap;
1113        speed.y = differenceY / timeGap;
1114        startTime = currentTime;
1115      }
1116
1117      if (shouldPreventDefault(differenceX, differenceY)) {
1118        e.stopPropagation();
1119        e.preventDefault();
1120      }
1121    }
1122  }
1123  function touchEnd() {
1124    if (!inGlobalTouch && inLocalTouch) {
1125      inLocalTouch = false;
1126
1127      clearInterval(easingLoop);
1128      easingLoop = setInterval(function () {
1129        if (!instances.get(element)) {
1130          clearInterval(easingLoop);
1131          return;
1132        }
1133
1134        if (Math.abs(speed.x) < 0.01 && Math.abs(speed.y) < 0.01) {
1135          clearInterval(easingLoop);
1136          return;
1137        }
1138
1139        applyTouchMove(speed.x * 30, speed.y * 30);
1140
1141        speed.x *= 0.8;
1142        speed.y *= 0.8;
1143      }, 10);
1144    }
1145  }
1146
1147  if (supportsTouch) {
1148    i.event.bind(window, 'touchstart', globalTouchStart);
1149    i.event.bind(window, 'touchend', globalTouchEnd);
1150    i.event.bind(element, 'touchstart', touchStart);
1151    i.event.bind(element, 'touchmove', touchMove);
1152    i.event.bind(element, 'touchend', touchEnd);
1153  }
1154
1155  if (supportsIePointer) {
1156    if (window.PointerEvent) {
1157      i.event.bind(window, 'pointerdown', globalTouchStart);
1158      i.event.bind(window, 'pointerup', globalTouchEnd);
1159      i.event.bind(element, 'pointerdown', touchStart);
1160      i.event.bind(element, 'pointermove', touchMove);
1161      i.event.bind(element, 'pointerup', touchEnd);
1162    } else if (window.MSPointerEvent) {
1163      i.event.bind(window, 'MSPointerDown', globalTouchStart);
1164      i.event.bind(window, 'MSPointerUp', globalTouchEnd);
1165      i.event.bind(element, 'MSPointerDown', touchStart);
1166      i.event.bind(element, 'MSPointerMove', touchMove);
1167      i.event.bind(element, 'MSPointerUp', touchEnd);
1168    }
1169  }
1170}
1171
1172module.exports = function (element, supportsTouch, supportsIePointer) {
1173  var i = instances.get(element);
1174  bindTouchHandler(element, i, supportsTouch, supportsIePointer);
1175};
1176
1177},{"../instances":18,"../update-geometry":19,"../update-scroll":20}],17:[function(require,module,exports){
1178/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
1179 * Licensed under the MIT License
1180 */
1181'use strict';
1182
1183var cls = require('../lib/class')
1184  , h = require('../lib/helper')
1185  , instances = require('./instances')
1186  , updateGeometry = require('./update-geometry');
1187
1188// Handlers
1189var clickRailHandler = require('./handler/click-rail')
1190  , dragScrollbarHandler = require('./handler/drag-scrollbar')
1191  , keyboardHandler = require('./handler/keyboard')
1192  , mouseWheelHandler = require('./handler/mouse-wheel')
1193  , nativeScrollHandler = require('./handler/native-scroll')
1194  , selectionHandler = require('./handler/selection')
1195  , touchHandler = require('./handler/touch');
1196
1197module.exports = function (element, userSettings) {
1198  userSettings = typeof userSettings === 'object' ? userSettings : {};
1199
1200  cls.add(element, 'ps-container');
1201
1202  // Create a plugin instance.
1203  var i = instances.add(element);
1204
1205  i.settings = h.extend(i.settings, userSettings);
1206
1207  clickRailHandler(element);
1208  dragScrollbarHandler(element);
1209  mouseWheelHandler(element);
1210  nativeScrollHandler(element);
1211
1212  if (i.settings.useSelectionScroll) {
1213    selectionHandler(element);
1214  }
1215
1216  if (h.env.supportsTouch || h.env.supportsIePointer) {
1217    touchHandler(element, h.env.supportsTouch, h.env.supportsIePointer);
1218  }
1219  if (i.settings.useKeyboard) {
1220    keyboardHandler(element);
1221  }
1222
1223  updateGeometry(element);
1224};
1225
1226},{"../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){
1227/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
1228 * Licensed under the MIT License
1229 */
1230'use strict';
1231
1232var d = require('../lib/dom')
1233  , defaultSettings = require('./default-setting')
1234  , EventManager = require('../lib/event-manager')
1235  , guid = require('../lib/guid')
1236  , h = require('../lib/helper');
1237
1238var instances = {};
1239
1240function Instance(element) {
1241  var i = this;
1242
1243  i.settings = h.clone(defaultSettings);
1244  i.containerWidth = null;
1245  i.containerHeight = null;
1246  i.contentWidth = null;
1247  i.contentHeight = null;
1248
1249  i.isRtl = d.css(element, 'direction') === "rtl";
1250  i.isNegativeScroll = (function () {
1251    var originalScrollLeft = element.scrollLeft;
1252    var result = null;
1253    element.scrollLeft = -1;
1254    result = element.scrollLeft < 0;
1255    element.scrollLeft = originalScrollLeft;
1256    return result;
1257  })();
1258  i.negativeScrollAdjustment = i.isNegativeScroll ? element.scrollWidth - element.clientWidth : 0;
1259  i.event = new EventManager();
1260  i.ownerDocument = element.ownerDocument || document;
1261
1262  i.scrollbarXRail = d.appendTo(d.e('div', 'ps-scrollbar-x-rail'), element);
1263  i.scrollbarX = d.appendTo(d.e('div', 'ps-scrollbar-x'), i.scrollbarXRail);
1264  i.scrollbarX.setAttribute('tabindex', 0);
1265  i.scrollbarXActive = null;
1266  i.scrollbarXWidth = null;
1267  i.scrollbarXLeft = null;
1268  i.scrollbarXBottom = h.toInt(d.css(i.scrollbarXRail, 'bottom'));
1269  i.isScrollbarXUsingBottom = i.scrollbarXBottom === i.scrollbarXBottom; // !isNaN
1270  i.scrollbarXTop = i.isScrollbarXUsingBottom ? null : h.toInt(d.css(i.scrollbarXRail, 'top'));
1271  i.railBorderXWidth = h.toInt(d.css(i.scrollbarXRail, 'borderLeftWidth')) + h.toInt(d.css(i.scrollbarXRail, 'borderRightWidth'));
1272  // Set rail to display:block to calculate margins
1273  d.css(i.scrollbarXRail, 'display', 'block');
1274  i.railXMarginWidth = h.toInt(d.css(i.scrollbarXRail, 'marginLeft')) + h.toInt(d.css(i.scrollbarXRail, 'marginRight'));
1275  d.css(i.scrollbarXRail, 'display', '');
1276  i.railXWidth = null;
1277  i.railXRatio = null;
1278
1279  i.scrollbarYRail = d.appendTo(d.e('div', 'ps-scrollbar-y-rail'), element);
1280  i.scrollbarY = d.appendTo(d.e('div', 'ps-scrollbar-y'), i.scrollbarYRail);
1281  i.scrollbarY.setAttribute('tabindex', 0);
1282  i.scrollbarYActive = null;
1283  i.scrollbarYHeight = null;
1284  i.scrollbarYTop = null;
1285  i.scrollbarYRight = h.toInt(d.css(i.scrollbarYRail, 'right'));
1286  i.isScrollbarYUsingRight = i.scrollbarYRight === i.scrollbarYRight; // !isNaN
1287  i.scrollbarYLeft = i.isScrollbarYUsingRight ? null : h.toInt(d.css(i.scrollbarYRail, 'left'));
1288  i.scrollbarYOuterWidth = i.isRtl ? h.outerWidth(i.scrollbarY) : null;
1289  i.railBorderYWidth = h.toInt(d.css(i.scrollbarYRail, 'borderTopWidth')) + h.toInt(d.css(i.scrollbarYRail, 'borderBottomWidth'));
1290  d.css(i.scrollbarYRail, 'display', 'block');
1291  i.railYMarginHeight = h.toInt(d.css(i.scrollbarYRail, 'marginTop')) + h.toInt(d.css(i.scrollbarYRail, 'marginBottom'));
1292  d.css(i.scrollbarYRail, 'display', '');
1293  i.railYHeight = null;
1294  i.railYRatio = null;
1295}
1296
1297function getId(element) {
1298  if (typeof element.dataset === 'undefined') {
1299    return element.getAttribute('data-ps-id');
1300  } else {
1301    return element.dataset.psId;
1302  }
1303}
1304
1305function setId(element, id) {
1306  if (typeof element.dataset === 'undefined') {
1307    element.setAttribute('data-ps-id', id);
1308  } else {
1309    element.dataset.psId = id;
1310  }
1311}
1312
1313function removeId(element) {
1314  if (typeof element.dataset === 'undefined') {
1315    element.removeAttribute('data-ps-id');
1316  } else {
1317    delete element.dataset.psId;
1318  }
1319}
1320
1321exports.add = function (element) {
1322  var newId = guid();
1323  setId(element, newId);
1324  instances[newId] = new Instance(element);
1325  return instances[newId];
1326};
1327
1328exports.remove = function (element) {
1329  delete instances[getId(element)];
1330  removeId(element);
1331};
1332
1333exports.get = function (element) {
1334  return instances[getId(element)];
1335};
1336
1337}
1337,{"../lib/dom":3,"../lib/event-manager":4,"../lib/guid":5,"../lib/helper":6,"./default-setting":8}],19:[function(require,module,exports){
1338/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
1339 * Licensed under the MIT License
1340 */
1341'use strict';
1342
1343var cls = require('../lib/class')
1344  , d = require('../lib/dom')
1345  , h = require('../lib/helper')
1346  , instances = require('./instances')
1347  , updateScroll = require('./update-scroll');
1348
1349function getThumbSize(i, thumbSize) {
1350  if (i.settings.minScrollbarLength) {
1351    thumbSize = Math.max(thumbSize, i.settings.minScrollbarLength);
1352  }
1353  if (i.settings.maxScrollbarLength) {
1354    thumbSize = Math.min(thumbSize, i.settings.maxScrollbarLength);
1355  }
1356  return thumbSize;
1357}
1358
1359function updateCss(element, i) {
1360  var xRailOffset = {width: i.railXWidth};
1361  if (i.isRtl) {
1362    xRailOffset.left = i.negativeScrollAdjustment + element.scrollLeft + i.containerWidth - i.contentWidth;
1363  } else {
1364    xRailOffset.left = element.scrollLeft;
1365  }
1366  if (i.isScrollbarXUsingBottom) {
1367    xRailOffset.bottom = i.scrollbarXBottom - element.scrollTop;
1368  } else {
1369    xRailOffset.top = i.scrollbarXTop + element.scrollTop;
1370  }
1371  d.css(i.scrollbarXRail, xRailOffset);
1372
1373  var yRailOffset = {top: element.scrollTop, height: i.railYHeight};
1374  if (i.isScrollbarYUsingRight) {
1375    if (i.isRtl) {
1376      yRailOffset.right = i.contentWidth - (i.negativeScrollAdjustment + element.scrollLeft) - i.scrollbarYRight - i.scrollbarYOuterWidth;
1377    } else {
1378      yRailOffset.right = i.scrollbarYRight - element.scrollLeft;
1379    }
1380  } else {
1381    if (i.isRtl) {
1382      yRailOffset.left = i.negativeScrollAdjustment + element.scrollLeft + i.containerWidth * 2 - i.contentWidth - i.scrollbarYLeft - i.scrollbarYOuterWidth;
1383    } else {
1384      yRailOffset.left = i.scrollbarYLeft + element.scrollLeft;
1385    }
1386  }
1387  d.css(i.scrollbarYRail, yRailOffset);
1388
1389  d.css(i.scrollbarX, {left: i.scrollbarXLeft, width: i.scrollbarXWidth - i.railBorderXWidth});
1390  d.css(i.scrollbarY, {top: i.scrollbarYTop, height: i.scrollbarYHeight - i.railBorderYWidth});
1391}
1392
1393module.exports = function (element) {
1394  var i = instances.get(element);
1395
1396  i.containerWidth = element.clientWidth;
1397  i.containerHeight = element.clientHeight;
1398  i.contentWidth = element.scrollWidth;
1399  i.contentHeight = element.scrollHeight;
1400
1401  var existingRails;
1402  if (!element.contains(i.scrollbarXRail)) {
1403    existingRails = d.queryChildren(element, '.ps-scrollbar-x-rail');
1404    if (existingRails.length > 0) {
1405      existingRails.forEach(function (rail) {
1406        d.remove(rail);
1407      });
1408    }
1409    d.appendTo(i.scrollbarXRail, element);
1410  }
1411  if (!element.contains(i.scrollbarYRail)) {
1412    existingRails = d.queryChildren(element, '.ps-scrollbar-y-rail');
1413    if (existingRails.length > 0) {
1414      existingRails.forEach(function (rail) {
1415        d.remove(rail);
1416      });
1417    }
1418    d.appendTo(i.scrollbarYRail, element);
1419  }
1420
1421  if (!i.settings.suppressScrollX && i.containerWidth + i.settings.scrollXMarginOffset < i.contentWidth) {
1422    i.scrollbarXActive = true;
1423    i.railXWidth = i.containerWidth - i.railXMarginWidth;
1424    i.railXRatio = i.containerWidth / i.railXWidth;
1425    i.scrollbarXWidth = getThumbSize(i, h.toInt(i.railXWidth * i.containerWidth / i.contentWidth));
1426    i.scrollbarXLeft = h.toInt((i.negativeScrollAdjustment + element.scrollLeft) * (i.railXWidth - i.scrollbarXWidth) / (i.contentWidth - i.containerWidth));
1427  } else {
1428    i.scrollbarXActive = false;
1429  }
1430
1431  if (!i.settings.suppressScrollY && i.containerHeight + i.settings.scrollYMarginOffset < i.contentHeight) {
1432    i.scrollbarYActive = true;
1433    i.railYHeight = i.containerHeight - i.railYMarginHeight;
1434    i.railYRatio = i.containerHeight / i.railYHeight;
1435    i.scrollbarYHeight = getThumbSize(i, h.toInt(i.railYHeight * i.containerHeight / i.contentHeight));
1436    i.scrollbarYTop = h.toInt(element.scrollTop * (i.railYHeight - i.scrollbarYHeight) / (i.contentHeight - i.containerHeight));
1437  } else {
1438    i.scrollbarYActive = false;
1439  }
1440
1441  if (i.scrollbarXLeft >= i.railXWidth - i.scrollbarXWidth) {
1442    i.scrollbarXLeft = i.railXWidth - i.scrollbarXWidth;
1443  }
1444  if (i.scrollbarYTop >= i.railYHeight - i.scrollbarYHeight) {
1445    i.scrollbarYTop = i.railYHeight - i.scrollbarYHeight;
1446  }
1447
1448  updateCss(element, i);
1449
1450  if (i.scrollbarXActive) {
1451    cls.add(element, 'ps-active-x');
1452  } else {
1453    cls.remove(element, 'ps-active-x');
1454    i.scrollbarXWidth = 0;
1455    i.scrollbarXLeft = 0;
1456    updateScroll(element, 'left', 0);
1457  }
1458  if (i.scrollbarYActive) {
1459    cls.add(element, 'ps-active-y');
1460  } else {
1461    cls.remove(element, 'ps-active-y');
1462    i.scrollbarYHeight = 0;
1463    i.scrollbarYTop = 0;
1464    updateScroll(element, 'top', 0);
1465  }
1466};
1467
1468},{"../lib/class":2,"../lib/dom":3,"../lib/helper":6,"./instances":18,"./update-scroll":20}],20:[function(require,module,exports){
1469/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
1470 * Licensed under the MIT License
1471 */
1472'use strict';
1473
1474var instances = require('./instances');
1475
1476var upEvent = document.createEvent('Event')
1477  , downEvent = document.createEvent('Event')
1478  , leftEvent = document.createEvent('Event')
1479  , rightEvent = document.createEvent('Event')
1480  , yEvent = document.createEvent('Event')
1481  , xEvent = document.createEvent('Event')
1482  , xStartEvent = document.createEvent('Event')
1483  , xEndEvent = document.createEvent('Event')
1484  , yStartEvent = document.createEvent('Event')
1485  , yEndEvent = document.createEvent('Event')
1486  , lastTop
1487  , lastLeft;
1488
1489upEvent.initEvent('ps-scroll-up', true, true);
1490downEvent.initEvent('ps-scroll-down', true, true);
1491leftEvent.initEvent('ps-scroll-left', true, true);
1492rightEvent.initEvent('ps-scroll-right', true, true);
1493yEvent.initEvent('ps-scroll-y', true, true);
1494xEvent.initEvent('ps-scroll-x', true, true);
1495xStartEvent.initEvent('ps-x-reach-start', true, true);
1496xEndEvent.initEvent('ps-x-reach-end', true, true);
1497yStartEvent.initEvent('ps-y-reach-start', true, true);
1498yEndEvent.initEvent('ps-y-reach-end', true, true);
1499
1500module.exports = function (element, axis, value) {
1501  if (typeof element === 'undefined') {
1502    throw 'You must provide an element to the update-scroll function';
1503  }
1504
1505  if (typeof axis === 'undefined') {
1506    throw 'You must provide an axis to the update-scroll function';
1507  }
1508
1509  if (typeof value === 'undefined') {
1510    throw 'You must provide a value to the update-scroll function';
1511  }
1512
1513  if (axis === 'top' && value <= 0) {
1514    element.scrollTop = 0;
1515    element.dispatchEvent(yStartEvent);
1516    return; // don't allow negative scroll
1517  }
1518
1519  if (axis === 'left' && value <= 0) {
1520    element.scrollLeft = 0;
1521    element.dispatchEvent(xStartEvent);
1522    return; // don't allow negative scroll
1523  }
1524
1525  var i = instances.get(element);
1526
1527  if (axis === 'top' && value >= i.contentHeight - i.containerHeight) {
1528    element.scrollTop = i.contentHeight - i.containerHeight;
1529    element.dispatchEvent(yEndEvent);
1530    return; // don't allow scroll past container
1531  }
1532
1533  if (axis === 'left' && value >= i.contentWidth - i.containerWidth) {
1534    element.scrollLeft = i.contentWidth - i.containerWidth;
1535    element.dispatchEvent(xEndEvent);
1536    return; // don't allow scroll past container
1537  }
1538
1539  if (!lastTop) {
1540    lastTop = element.scrollTop;
1541  }
1542
1543  if (!lastLeft) {
1544    lastLeft = element.scrollLeft;
1545  }
1546
1547  if (axis === 'top' && value < lastTop) {
1548    element.dispatchEvent(upEvent);
1549  }
1550
1551  if (axis === 'top' && value > lastTop) {
1552    element.dispatchEvent(downEvent);
1553  }
1554
1555  if (axis === 'left' && value < lastLeft) {
1556    element.dispatchEvent(leftEvent);
1557  }
1558
1559  if (axis === 'left' && value > lastLeft) {
1560    element.dispatchEvent(rightEvent);
1561  }
1562
1563  if (axis === 'top') {
1564    element.scrollTop = lastTop = value;
1565    element.dispatchEvent(yEvent);
1566  }
1567
1568  if (axis === 'left') {
1569    element.scrollLeft = lastLeft = value;
1570    element.dispatchEvent(xEvent);
1571  }
1572
1573};
1574
1575},{"./instances":18}],21:[function(require,module,exports){
1576/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
1577 * Licensed under the MIT License
1578 */
1579'use strict';
1580
1581var d = require('../lib/dom')
1582  , h = require('../lib/helper')
1583  , instances = require('./instances')
1584  , updateGeometry = require('./update-geometry')
1585  , updateScroll = require('./update-scroll');
1586
1587module.exports = function (element) {
1588  var i = instances.get(element);
1589
1590  if (!i) {
1591    return;
1592  }
1593
1594  // Recalcuate negative scrollLeft adjustment
1595  i.negativeScrollAdjustment = i.isNegativeScroll ? element.scrollWidth - element.clientWidth : 0;
1596
1597  // Recalculate rail margins
1598  d.css(i.scrollbarXRail, 'display', 'block');
1599  d.css(i.scrollbarYRail, 'display', 'block');
1600  i.railXMarginWidth = h.toInt(d.css(i.scrollbarXRail, 'marginLeft')) + h.toInt(d.css(i.scrollbarXRail, 'marginRight'));
1601  i.railYMarginHeight = h.toInt(d.css(i.scrollbarYRail, 'marginTop')) + h.toInt(d.css(i.scrollbarYRail, 'marginBottom'));
1602
1603  // Hide scrollbars not to affect scrollWidth and scrollHeight
1604  d.css(i.scrollbarXRail, 'display', 'none');
1605  d.css(i.scrollbarYRail, 'display', 'none');
1606
1607  updateGeometry(element);
1608
1609  // Update top/left scroll to trigger events
1610  updateScroll(element, 'top', element.scrollTop);
1611  updateScroll(element, 'left', element.scrollLeft);
1612
1613  d.css(i.scrollbarXRail, 'display', '');
1614  d.css(i.scrollbarYRail, 'display', '');
1615};
1616
1617},{"../lib/dom":3,"../lib/helper":6,"./instances":18,"./update-geometry":19,"./update-scroll":20}]},{},[1]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.