perfect-scrollbar.jquery.js 46 KB

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