PageSourceSearch

https://tutay.pl/blog/wp-content/plugins/wp-private-message/assets…/perfect-scrollbar.jquery.min.js?ver=0.6.10

js tutay.pl collected 2026-10-08 19:04:51 UTC 48,633 bytes, 1,569 lines download raw bytes

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