client/lib/jquery.mousewheel.min.js
changeset 344 e616c4fff297
parent 343 e2a56a651526
child 345 cb5c0007c9f9
equal deleted inserted replaced
343:e2a56a651526 344:e616c4fff297
     1 /*! Copyright (c) 2013 Brandon Aaron (http://brandon.aaron.sh)
       
     2  * Licensed under the MIT License (LICENSE.txt).
       
     3  *
       
     4  * Version: 3.1.9
       
     5  *
       
     6  * Requires: jQuery 1.2.2+
       
     7  */
       
     8 
       
     9 (function (factory) {
       
    10     if ( typeof define === 'function' && define.amd ) {
       
    11         // AMD. Register as an anonymous module.
       
    12         define(['jquery'], factory);
       
    13     } else if (typeof exports === 'object') {
       
    14         // Node/CommonJS style for Browserify
       
    15         module.exports = factory;
       
    16     } else {
       
    17         // Browser globals
       
    18         factory(jQuery);
       
    19     }
       
    20 }(function ($) {
       
    21 
       
    22     var toFix  = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],
       
    23         toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?
       
    24                     ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],
       
    25         slice  = Array.prototype.slice,
       
    26         nullLowestDeltaTimeout, lowestDelta;
       
    27 
       
    28     if ( $.event.fixHooks ) {
       
    29         for ( var i = toFix.length; i; ) {
       
    30             $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;
       
    31         }
       
    32     }
       
    33 
       
    34     var special = $.event.special.mousewheel = {
       
    35         version: '3.1.9',
       
    36 
       
    37         setup: function() {
       
    38             if ( this.addEventListener ) {
       
    39                 for ( var i = toBind.length; i; ) {
       
    40                     this.addEventListener( toBind[--i], handler, false );
       
    41                 }
       
    42             } else {
       
    43                 this.onmousewheel = handler;
       
    44             }
       
    45             // Store the line height and page height for this particular element
       
    46             $.data(this, 'mousewheel-line-height', special.getLineHeight(this));
       
    47             $.data(this, 'mousewheel-page-height', special.getPageHeight(this));
       
    48         },
       
    49 
       
    50         teardown: function() {
       
    51             if ( this.removeEventListener ) {
       
    52                 for ( var i = toBind.length; i; ) {
       
    53                     this.removeEventListener( toBind[--i], handler, false );
       
    54                 }
       
    55             } else {
       
    56                 this.onmousewheel = null;
       
    57             }
       
    58         },
       
    59 
       
    60         getLineHeight: function(elem) {
       
    61             return parseInt($(elem)['offsetParent' in $.fn ? 'offsetParent' : 'parent']().css('fontSize'), 10);
       
    62         },
       
    63 
       
    64         getPageHeight: function(elem) {
       
    65             return $(elem).height();
       
    66         },
       
    67 
       
    68         settings: {
       
    69             adjustOldDeltas: true
       
    70         }
       
    71     };
       
    72 
       
    73     $.fn.extend({
       
    74         mousewheel: function(fn) {
       
    75             return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');
       
    76         },
       
    77 
       
    78         unmousewheel: function(fn) {
       
    79             return this.unbind('mousewheel', fn);
       
    80         }
       
    81     });
       
    82 
       
    83 
       
    84     function handler(event) {
       
    85         var orgEvent   = event || window.event,
       
    86             args       = slice.call(arguments, 1),
       
    87             delta      = 0,
       
    88             deltaX     = 0,
       
    89             deltaY     = 0,
       
    90             absDelta   = 0;
       
    91         event = $.event.fix(orgEvent);
       
    92         event.type = 'mousewheel';
       
    93 
       
    94         // Old school scrollwheel delta
       
    95         if ( 'detail'      in orgEvent ) { deltaY = orgEvent.detail * -1;      }
       
    96         if ( 'wheelDelta'  in orgEvent ) { deltaY = orgEvent.wheelDelta;       }
       
    97         if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY;      }
       
    98         if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }
       
    99 
       
   100         // Firefox < 17 horizontal scrolling related to DOMMouseScroll event
       
   101         if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
       
   102             deltaX = deltaY * -1;
       
   103             deltaY = 0;
       
   104         }
       
   105 
       
   106         // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy
       
   107         delta = deltaY === 0 ? deltaX : deltaY;
       
   108 
       
   109         // New school wheel delta (wheel event)
       
   110         if ( 'deltaY' in orgEvent ) {
       
   111             deltaY = orgEvent.deltaY * -1;
       
   112             delta  = deltaY;
       
   113         }
       
   114         if ( 'deltaX' in orgEvent ) {
       
   115             deltaX = orgEvent.deltaX;
       
   116             if ( deltaY === 0 ) { delta  = deltaX * -1; }
       
   117         }
       
   118 
       
   119         // No change actually happened, no reason to go any further
       
   120         if ( deltaY === 0 && deltaX === 0 ) { return; }
       
   121 
       
   122         // Need to convert lines and pages to pixels if we aren't already in pixels
       
   123         // There are three delta modes:
       
   124         //   * deltaMode 0 is by pixels, nothing to do
       
   125         //   * deltaMode 1 is by lines
       
   126         //   * deltaMode 2 is by pages
       
   127         if ( orgEvent.deltaMode === 1 ) {
       
   128             var lineHeight = $.data(this, 'mousewheel-line-height');
       
   129             delta  *= lineHeight;
       
   130             deltaY *= lineHeight;
       
   131             deltaX *= lineHeight;
       
   132         } else if ( orgEvent.deltaMode === 2 ) {
       
   133             var pageHeight = $.data(this, 'mousewheel-page-height');
       
   134             delta  *= pageHeight;
       
   135             deltaY *= pageHeight;
       
   136             deltaX *= pageHeight;
       
   137         }
       
   138 
       
   139         // Store lowest absolute delta to normalize the delta values
       
   140         absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );
       
   141 
       
   142         if ( !lowestDelta || absDelta < lowestDelta ) {
       
   143             lowestDelta = absDelta;
       
   144 
       
   145             // Adjust older deltas if necessary
       
   146             if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
       
   147                 lowestDelta /= 40;
       
   148             }
       
   149         }
       
   150 
       
   151         // Adjust older deltas if necessary
       
   152         if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
       
   153             // Divide all the things by 40!
       
   154             delta  /= 40;
       
   155             deltaX /= 40;
       
   156             deltaY /= 40;
       
   157         }
       
   158 
       
   159         // Get a whole, normalized value for the deltas
       
   160         delta  = Math[ delta  >= 1 ? 'floor' : 'ceil' ](delta  / lowestDelta);
       
   161         deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);
       
   162         deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);
       
   163 
       
   164         // Add information to the event object
       
   165         event.deltaX = deltaX;
       
   166         event.deltaY = deltaY;
       
   167         event.deltaFactor = lowestDelta;
       
   168         // Go ahead and set deltaMode to 0 since we converted to pixels
       
   169         // Although this is a little odd since we overwrite the deltaX/Y
       
   170         // properties with normalized deltas.
       
   171         event.deltaMode = 0;
       
   172 
       
   173         // Add event and delta to the front of the arguments
       
   174         args.unshift(event, delta, deltaX, deltaY);
       
   175 
       
   176         // Clearout lowestDelta after sometime to better
       
   177         // handle multiple device types that give different
       
   178         // a different lowestDelta
       
   179         // Ex: trackpad = 3 and mouse wheel = 120
       
   180         if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }
       
   181         nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);
       
   182 
       
   183         return ($.event.dispatch || $.event.handle).apply(this, args);
       
   184     }
       
   185 
       
   186     function nullLowestDelta() {
       
   187         lowestDelta = null;
       
   188     }
       
   189 
       
   190     function shouldAdjustOldDeltas(orgEvent, absDelta) {
       
   191         // If this is an older event and the delta is divisable by 120,
       
   192         // then we are assuming that the browser is treating this as an
       
   193         // older mouse wheel event and that we should divide the deltas
       
   194         // by 40 to try and get a more usable deltaFactor.
       
   195         // Side note, this actually impacts the reported scroll distance
       
   196         // in older browsers and can cause scrolling to be slower than native.
       
   197         // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.
       
   198         return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;
       
   199     }
       
   200 
       
   201 }));