00001
00009 (function (factory) {
00010 if ( typeof define === 'function' && define.amd ) {
00011
00012 define(['jquery'], factory);
00013 } else if (typeof exports === 'object') {
00014
00015 module.exports = factory;
00016 } else {
00017
00018 factory(jQuery);
00019 }
00020 }(function ($) {
00021
00022 var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],
00023 toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?
00024 ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],
00025 slice = Array.prototype.slice,
00026 nullLowestDeltaTimeout, lowestDelta;
00027
00028 if ( $.event.fixHooks ) {
00029 for ( var i = toFix.length; i; ) {
00030 $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;
00031 }
00032 }
00033
00034 var special = $.event.special.mousewheel = {
00035 version: '3.1.12',
00036
00037 setup: function() {
00038 if ( this.addEventListener ) {
00039 for ( var i = toBind.length; i; ) {
00040 this.addEventListener( toBind[--i], handler, false );
00041 }
00042 } else {
00043 this.onmousewheel = handler;
00044 }
00045
00046 $.data(this, 'mousewheel-line-height', special.getLineHeight(this));
00047 $.data(this, 'mousewheel-page-height', special.getPageHeight(this));
00048 },
00049
00050 teardown: function() {
00051 if ( this.removeEventListener ) {
00052 for ( var i = toBind.length; i; ) {
00053 this.removeEventListener( toBind[--i], handler, false );
00054 }
00055 } else {
00056 this.onmousewheel = null;
00057 }
00058
00059 $.removeData(this, 'mousewheel-line-height');
00060 $.removeData(this, 'mousewheel-page-height');
00061 },
00062
00063 getLineHeight: function(elem) {
00064 var $elem = $(elem),
00065 $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent']();
00066 if (!$parent.length) {
00067 $parent = $('body');
00068 }
00069 return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16;
00070 },
00071
00072 getPageHeight: function(elem) {
00073 return $(elem).height();
00074 },
00075
00076 settings: {
00077 adjustOldDeltas: true,
00078 normalizeOffset: true
00079 }
00080 };
00081
00082 $.fn.extend({
00083 mousewheel: function(fn) {
00084 return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');
00085 },
00086
00087 unmousewheel: function(fn) {
00088 return this.unbind('mousewheel', fn);
00089 }
00090 });
00091
00092
00093 function handler(event) {
00094 var orgEvent = event || window.event,
00095 args = slice.call(arguments, 1),
00096 delta = 0,
00097 deltaX = 0,
00098 deltaY = 0,
00099 absDelta = 0,
00100 offsetX = 0,
00101 offsetY = 0;
00102 event = $.event.fix(orgEvent);
00103 event.type = 'mousewheel';
00104
00105
00106 if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; }
00107 if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; }
00108 if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; }
00109 if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }
00110
00111
00112 if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
00113 deltaX = deltaY * -1;
00114 deltaY = 0;
00115 }
00116
00117
00118 delta = deltaY === 0 ? deltaX : deltaY;
00119
00120
00121 if ( 'deltaY' in orgEvent ) {
00122 deltaY = orgEvent.deltaY * -1;
00123 delta = deltaY;
00124 }
00125 if ( 'deltaX' in orgEvent ) {
00126 deltaX = orgEvent.deltaX;
00127 if ( deltaY === 0 ) { delta = deltaX * -1; }
00128 }
00129
00130
00131 if ( deltaY === 0 && deltaX === 0 ) { return; }
00132
00133
00134
00135
00136
00137
00138 if ( orgEvent.deltaMode === 1 ) {
00139 var lineHeight = $.data(this, 'mousewheel-line-height');
00140 delta *= lineHeight;
00141 deltaY *= lineHeight;
00142 deltaX *= lineHeight;
00143 } else if ( orgEvent.deltaMode === 2 ) {
00144 var pageHeight = $.data(this, 'mousewheel-page-height');
00145 delta *= pageHeight;
00146 deltaY *= pageHeight;
00147 deltaX *= pageHeight;
00148 }
00149
00150
00151 absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );
00152
00153 if ( !lowestDelta || absDelta < lowestDelta ) {
00154 lowestDelta = absDelta;
00155
00156
00157 if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
00158 lowestDelta /= 40;
00159 }
00160 }
00161
00162
00163 if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
00164
00165 delta /= 40;
00166 deltaX /= 40;
00167 deltaY /= 40;
00168 }
00169
00170
00171 delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta);
00172 deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);
00173 deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);
00174
00175
00176 if ( special.settings.normalizeOffset && this.getBoundingClientRect ) {
00177 var boundingRect = this.getBoundingClientRect();
00178 offsetX = event.clientX - boundingRect.left;
00179 offsetY = event.clientY - boundingRect.top;
00180 }
00181
00182
00183 event.deltaX = deltaX;
00184 event.deltaY = deltaY;
00185 event.deltaFactor = lowestDelta;
00186 event.offsetX = offsetX;
00187 event.offsetY = offsetY;
00188
00189
00190
00191 event.deltaMode = 0;
00192
00193
00194 args.unshift(event, delta, deltaX, deltaY);
00195
00196
00197
00198
00199
00200 if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }
00201 nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);
00202
00203 return ($.event.dispatch || $.event.handle).apply(this, args);
00204 }
00205
00206 function nullLowestDelta() {
00207 lowestDelta = null;
00208 }
00209
00210 function shouldAdjustOldDeltas(orgEvent, absDelta) {
00211
00212
00213
00214
00215
00216
00217
00218 return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;
00219 }
00220
00221 }));