├── src
├── css
│ └── anim.css
├── manifest.json
├── sass
│ └── anim.scss
├── options
│ ├── options.html
│ └── options.js
├── swipe.js
├── mousewheel.js
└── jquery.min.js
├── .gitignore
├── package.json
├── LICENSE
├── README.md
└── Gruntfile.js
/src/css/anim.css:
--------------------------------------------------------------------------------
1 | body.touchpadSwipeAnimateTransitionBrowserPagingOutgoingBack {
2 | transform: translate(1000px, 0) !important;
3 | opacity: 0;
4 | transition: 1s ease-out; }
5 |
6 | body.touchpadSwipeAnimateTransitionBrowserPagingOutgoingForward {
7 | transform: translate(-1000px, 0) !important;
8 | opacity: 0;
9 | transition: 1s ease-out; }
10 |
11 | body.touchpadSwipeAnimationCore {
12 | transition: all 100ms ease-out; }
13 |
14 | .touchpadSwipeAnimateLeft50px {
15 | transform: translate(100px, 0);
16 | opacity: 0.5; }
17 |
18 | .touchpadSwipeAnimateRight50px {
19 | transform: translate(-100px, 0);
20 | opacity: 0.5; }
21 |
--------------------------------------------------------------------------------
/src/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "content_scripts": [
3 | {
4 | "css": [
5 | "css/anim.css"
6 | ],
7 | "js": [
8 | "jquery.min.js",
9 | "mousewheel.js",
10 | "swipe.js"
11 | ],
12 | "matches": [
13 | "*://*/*"
14 | ]
15 | }
16 | ],
17 | "description": "Enables multitouch swipe (backwards/forwards) in chrome as in OSX for windows notebooks with touchpads.",
18 | "name": "TouchpadSwipe",
19 | "options_ui": {
20 | "page": "options/options.html",
21 | "chrome_style": true
22 | },
23 | "permissions": [
24 | "storage"
25 | ],
26 | "version": "1.2.7",
27 | "manifest_version": 2
28 | }
29 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by .ignore support plugin (hsz.mobi)
2 | ### JetBrains template
3 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
4 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
5 |
6 | # User-specific stuff:
7 | .idea
8 |
9 | ## File-based project format:
10 | *.iws
11 |
12 | ## Plugin-specific files:
13 |
14 | # IntelliJ
15 | /out/
16 |
17 | # mpeltonen/sbt-idea plugin
18 | .idea_modules/
19 |
20 | # JIRA plugin
21 | atlassian-ide-plugin.xml
22 |
23 | # Crashlytics plugin (for Android Studio and IntelliJ)
24 | com_crashlytics_export_strings.xml
25 | crashlytics.properties
26 | crashlytics-build.properties
27 | fabric.properties
28 |
29 | *.zip
30 | node_modules
31 | dist
32 | package-lock.json
33 |
--------------------------------------------------------------------------------
/src/sass/anim.scss:
--------------------------------------------------------------------------------
1 | $switchPageAnimationTranslate: 1000px;
2 | $switchPageAnimationDuration: 1s;
3 |
4 | $swipeAnimationWidth: 100px;
5 | $swipeAnimationDuration: 100ms;
6 |
7 | body.touchpadSwipeAnimateTransitionBrowserPagingOutgoingBack {
8 | transform: translate($switchPageAnimationTranslate, 0) !important;
9 | opacity: 0;
10 | transition: $switchPageAnimationDuration ease-out;
11 | }
12 |
13 | body.touchpadSwipeAnimateTransitionBrowserPagingOutgoingForward {
14 | transform: translate(-$switchPageAnimationTranslate, 0) !important;
15 | opacity: 0;
16 | transition: $switchPageAnimationDuration ease-out;
17 | }
18 |
19 | body.touchpadSwipeAnimationCore {
20 | transition: all $swipeAnimationDuration ease-out;
21 | }
22 |
23 | .touchpadSwipeAnimateLeft50px {
24 | transform: translate($swipeAnimationWidth, 0);
25 | opacity: 0.5;
26 | }
27 |
28 | .touchpadSwipeAnimateRight50px {
29 | transform: translate(-$swipeAnimationWidth, 0);
30 | opacity: 0.5;
31 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "TouchpadSwipe",
3 | "version": "1.2.7",
4 | "description": "Enables multitouch swipe (backwards/forwards) in chrome as in OSX on Microsoft Precision track-/touchpads.",
5 | "devDependencies": {
6 | "grunt": "^1.0.1",
7 | "grunt-contrib-compress": "^1.3.0",
8 | "grunt-contrib-copy": "^1.0.0",
9 | "grunt-contrib-cssmin": "^1.0.2",
10 | "grunt-contrib-jshint": "~0.10.0",
11 | "grunt-contrib-nodeunit": "~0.4.1",
12 | "grunt-contrib-uglify": "~0.5.0",
13 | "grunt-contrib-watch": "^1.0.0",
14 | "grunt-sass": "^1.2.1",
15 | "load-grunt-tasks": "^3.5.2"
16 | },
17 | "scripts": {
18 | "test": "echo \"Error: no test specified\" && exit 1"
19 | },
20 | "repository": {
21 | "type": "git",
22 | "url": "git+https://github.com/mfuesslin/touchpadswipe.git"
23 | },
24 | "author": "Maximilian Fuesslin",
25 | "license": "MIT",
26 | "bugs": {
27 | "url": "https://github.com/mfuesslin/touchpadswipe/issues"
28 | },
29 | "homepage": "https://github.com/mfuesslin/touchpadswipe#readme"
30 | }
31 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2016 mfuesslin
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/src/options/options.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
TouchpadSwipe - Options
4 |
16 |
17 |
18 | If you like my plugin you can buy me a beer / coffee: https://www.paypal.me/koseduhemak
19 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/src/options/options.js:
--------------------------------------------------------------------------------
1 | // Saves options to chrome.storage.sync.
2 | function save_options() {
3 | var animationsEnabled = document.getElementById('animations').checked;
4 | var reverseEnabled = document.getElementById('reverse').checked;
5 | var sensitivity = document.getElementById('sensitivity').value;
6 | chrome.storage.sync.set({
7 | animationsEnabled: animationsEnabled,
8 | reverseEnabled: reverseEnabled,
9 | sensitivity: isNormalInteger(sensitivity) ? sensitivity : 25
10 | }, function () {
11 | // Update status to let user know options were saved.
12 | var status = document.getElementById('status');
13 | status.innerHTML = 'Options saved.';
14 | setTimeout(function () {
15 | status.textContent = '';
16 | }, 2000);
17 | });
18 | }
19 |
20 | function restore_options() {
21 | chrome.storage.sync.get({
22 | animationsEnabled: true,
23 | reverseEnabled: false,
24 | sensitivity: 25
25 | }, function (items) {
26 | document.getElementById('animations').checked = items.animationsEnabled;
27 | document.getElementById('reverse').checked = items.reverseEnabled;
28 | document.getElementById('sensitivity').value = items.sensitivity;
29 | });
30 | }
31 | document.addEventListener('DOMContentLoaded', restore_options);
32 | document.getElementById('save').addEventListener('click', save_options);
33 |
34 | function isNormalInteger(str) {
35 | var n = Math.floor(Number(str));
36 | return String(n) === str && n >= 0;
37 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | This extension is no longer available in the Chrome Extension Store... This is due the fact the Google wants videos / screenshots and stuff which I do not have time for. Therefore you have to use Firefox or create the chrome extension by yourself using the source of this repository (google how to load local extensions in chrome).
2 |
3 | **Instruction how to enable extenstion anyway (credits to fannyfan414)**
4 |
5 | Copy and open link [chrome://extensions](url) in your chrome browser. In the upper right corner, turn on developer mode. Unzip this archive to your PC. Drag (Important!) src file with crx extension in chrome extensions page. Find touchpadswipe extension that appears in the list and turn it on if it is turned off.
6 | Download pre-packed extension: [src.zip](https://github.com/koseduhemak/touchpadswipe/files/2875483/src.zip)
7 |
8 | Source: https://github.com/koseduhemak/touchpadswipe/issues/20#issuecomment-464709461
9 |
10 | Video - How to install manually (thanks fannyfan414):
11 | https://youtu.be/Ik3M9snynZw
12 |
13 | # TouchpadSwipe
14 | Enables multitouch swipe (backwards/forwards) in chrome as in OSX. If your notebooks touchpad is configured to do horizontal scroll with two fingers f.e. you can use that gesture to go back and forward in chrome browser.
15 |
16 | At the moment the extension is in *ALPHA* state. So let me know if you have any issues. Tested on DELL XPS 13 (9360) with Windows Precision drivers.
17 |
18 | If you like my plugin you can buy me a beer / coffee: https://www.paypal.me/koseduhemak
19 |
20 | ## How to use
21 |
22 | ### Chrome
23 | Just install extension from chrome webstore: .
24 |
25 | ### FireFox
26 | Just install extension from mozilla webstore: .
27 |
28 | ## Contribute
29 | Feel free to contribute :)
30 |
31 | ## Buy me a beer / coffee
32 | If you like my plugin you can buy me a beer / coffee: https://www.paypal.me/koseduhemak
33 |
--------------------------------------------------------------------------------
/Gruntfile.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by mfuesslin on 28.11.2016.
3 | */
4 | module.exports = function (grunt) {
5 | require('load-grunt-tasks')(grunt);
6 |
7 | // Project configuration.
8 | grunt.initConfig({
9 | pkg: grunt.file.readJSON('package.json'),
10 | copy: {
11 | main: {
12 | files: [
13 | {
14 | expand: true,
15 | cwd: 'src',
16 | src: ['options/*.html'],
17 | dest: 'dist/'
18 | }
19 | ]
20 | }
21 | },
22 | uglify: {
23 | build: {
24 | files: [
25 | {
26 | src: ['src/*.js'],
27 | dest: 'dist/<%= pkg.name %>.min.js'
28 | },
29 | {
30 | src: ['src/options/*.js'],
31 | dest: 'dist/options/options.js'
32 | }
33 | ]
34 | }
35 | },
36 | sass: {
37 | dist: {
38 | options: {
39 | sourcemap: 'none'
40 | },
41 | files: [{
42 | expand: true,
43 | cwd: 'src/sass',
44 | src: ['**/*.scss'],
45 | dest: 'src/css',
46 | ext: '.css'
47 | }]
48 | }
49 | },
50 | cssmin: { // Begin CSS Minify Plugin
51 | target: {
52 | files: [{
53 | expand: true,
54 | cwd: 'src/css',
55 | src: ['*.css', '!*.min.css'],
56 | dest: 'dist',
57 | ext: '.min.css'
58 | }]
59 | }
60 | },
61 | compress: {
62 | main: {
63 | options: {
64 | archive: '<%= pkg.name %>.<%= pkg.version %>.zip'
65 | },
66 | files: [
67 | {expand: true, cwd: "dist/", src: ['**'], dest: '/'}
68 | ]
69 | }
70 | },
71 |
72 | watch: { // Compile everything into one task with Watch Plugin
73 | css: {
74 | files: 'src/sass/*.scss',
75 | tasks: ['sass', 'cssmin']
76 | },
77 | js: {
78 | files: 'src/*.js',
79 | tasks: ['uglify']
80 | }
81 | }
82 | });
83 |
84 | // Load the plugin that provides the "uglify" task.
85 | /*grunt.loadNpmTasks('grunt-contrib-uglify');
86 |
87 | grunt.loadNpmTasks('grunt-sass');
88 |
89 | grunt.loadNpmTasks('grunt-contrib-cssmin');
90 |
91 | grunt.loadNpmTasks('grunt-update_json');
92 |
93 | grunt.loadNpmTasks('grunt-contrib-watch');*/
94 |
95 | // Default task(s).
96 | grunt.registerTask('default', ['watch']);
97 |
98 | grunt.registerTask('updatejson', function (key, value) {
99 | var pkg = grunt.file.readJSON('package.json');
100 | var projectFile = "src/manifest.json";
101 |
102 |
103 | if (!grunt.file.exists(projectFile)) {
104 | grunt.log.error("file " + projectFile + " not found");
105 | return true;//return false to abort the execution
106 | }
107 | var manifest = grunt.file.readJSON(projectFile);//get file as json object
108 | manifest.version = pkg.version;
109 | manifest.description = pkg.description;
110 | manifest.name = pkg.name;
111 | manifest["content_scripts"][0]["css"] = ["anim.min.css"];
112 | manifest["content_scripts"][0]["js"] = [pkg.name + ".min.js"];
113 |
114 | grunt.file.write("dist/manifest.json", JSON.stringify(manifest, null, 2));//serialize it back to file
115 |
116 | });
117 |
118 | grunt.registerTask('dist', ['copy', 'sass', 'cssmin', 'uglify', 'updatejson', 'compress']);
119 |
120 | };
--------------------------------------------------------------------------------
/src/swipe.js:
--------------------------------------------------------------------------------
1 | // scrollRight
2 | $.fn.extend({
3 | scrollRight: function (val) {
4 | if (val === undefined) {
5 | return this[0].scrollWidth - (this[0].scrollLeft + this[0].clientWidth) + 1;
6 | }
7 | return this.scrollLeft(this[0].scrollWidth - this[0].clientWidth - val);
8 | }
9 | });
10 |
11 | var counterLeft = 0;
12 | var counterRight = 0;
13 | var forwardsDirection = 1;
14 | var backDirection = -1;
15 | var isLeft = false;
16 | var isRight = false;
17 | // how long user have to scroll left/right before history back / forward
18 | var sensitivity = 25;
19 | // when to clear counters (in ms)
20 | var resetCounterThreshold = 800;
21 | // animations disabled?
22 | var enableAnimation = true;
23 |
24 | // sloth to dont shake browsers content if user accidently scrolls horizontal
25 | var sloth = 5;
26 |
27 | var isDebug = false;
28 |
29 | var currentDirection = false;
30 | var htmlBody = $("body");
31 | var unload = false;
32 |
33 | // timeOutFuction
34 | var timeOut = false;
35 |
36 |
37 | var options;
38 |
39 | // apply options
40 | function applyOptions() {
41 | chrome.storage.sync.get({
42 | animationsEnabled: true,
43 | reverseEnabled: false,
44 | sensitivity: 25
45 | }, function(items) {
46 | debug("options: ");
47 | debug(items);
48 |
49 | enableAnimation = items.animationsEnabled;
50 | enableReverse = items.reverseEnabled;
51 | sensitivity = items.sensitivity;
52 |
53 | if (enableAnimation) {
54 | $(window).on("beforeunload", animateBrowserPaging);
55 | }
56 | if (enableReverse) {
57 | forwardsDirection = -1;
58 | backDirection = 1;
59 | }
60 | });
61 | }
62 |
63 | // listen for changes in options
64 | chrome.storage.onChanged.addListener(function(changes, namespace) {
65 | applyOptions();
66 | });
67 |
68 |
69 | $(document).scroll(function() {
70 | var body = $("body");
71 | var left = body.scrollLeft();
72 | var right = body.scrollRight();
73 |
74 | debug("scrollLeft: "+left);
75 | debug("scrollRight: "+right);
76 | if (left == 0) {
77 | debug("i am left!");
78 | isLeft = true;
79 | } else {
80 | isLeft = false;
81 | counterLeft = 0;
82 | }
83 |
84 | if (right == 0) {
85 | counterRight = true;
86 | } else {
87 | isRight = true;
88 | counterRight = 0;
89 | }
90 | });
91 |
92 |
93 | var timeOutFunc = function() {
94 | debug("timeout called");
95 | if (counterLeft > sloth || counterRight > sloth) {
96 | reset();
97 | return;
98 | }
99 |
100 | timeOut = setTimeout(timeOutFunc, resetCounterThreshold);
101 | };
102 |
103 | $(document).on('mousewheel', swipe);
104 |
105 | function swipe(event) {
106 | if ((isLeft || isRight) && Math.abs(event.deltaX) > 0) {
107 |
108 | // back
109 | if (event.deltaX < 0 && isLeft) {
110 | debug("left "+counterLeft);
111 | debug("sensitivity: "+sensitivity)
112 | if (counterLeft > sensitivity) {
113 | $(document).off("mousewheel");
114 | debug("going back");
115 | counterLeft = 0;
116 |
117 | currentDirection = backDirection;
118 |
119 | history.go(backDirection);
120 | setTimeout(function() {reattachEvent(backDirection);}, 500);
121 | }
122 |
123 | if (counterLeft >= sloth) {
124 | animateBody(-1);
125 | }
126 |
127 | counterLeft++;
128 | }
129 |
130 | if (event.deltaX > 0 && isRight) {
131 | debug("right "+counterRight);
132 | if (counterRight > sensitivity) {
133 | debug("going forward");
134 | $(document).off("mousewheel");
135 | counterRight = 0;
136 |
137 | currentDirection = forwardsDirection;
138 |
139 | history.go(forwardsDirection);
140 | setTimeout(function() {reattachEvent(forwardsDirection);}, 500);
141 | }
142 |
143 | if (counterRight >= sloth) {
144 | animateBody(1);
145 | }
146 |
147 | counterRight++
148 | }
149 |
150 | if (timeOut == false) {
151 | timeOutFunc(true);
152 | }
153 | } else {
154 | clearTimeoutAdvanced();
155 | }
156 | }
157 |
158 | $(document).ready(function() {
159 | applyOptions();
160 | $(document).scroll();
161 | htmlBody.addClass("touchpadSwipeAnimationCore");
162 | });
163 |
164 | function animateBrowserPaging() {
165 | if (currentDirection != false) {
166 | if (currentDirection > 0) {
167 | var animClass = "touchpadSwipeAnimateTransitionBrowserPagingOutgoingForward";
168 | } else {
169 | var animClass = "touchpadSwipeAnimateTransitionBrowserPagingOutgoingBack";
170 | }
171 | htmlBody.addClass(animClass);
172 | }
173 | }
174 |
175 | function reattachEvent(direction) {
176 | // reattach if not refreshing page
177 | if (!unload) {
178 | $(document).on("mousewheel", swipe);
179 | reset();
180 | }
181 | }
182 |
183 | function reset() {
184 | counterLeft = 0;
185 | counterRight = 0;
186 | debug("timeout: resetting...");
187 | animateBody(0, true);
188 | timeOut = false;
189 | }
190 |
191 | function animateBody(leftOrRight, force) {
192 | if ((enableAnimation && !$(htmlBody).is(':animated')) || force) {
193 |
194 | if (leftOrRight > 0) {
195 | // forwards
196 | if (htmlBody.hasClass("touchpadSwipeAnimateLeft50px")) {
197 | htmlBody.removeClass("touchpadSwipeAnimateLeft50px");
198 | }
199 | if (!htmlBody.hasClass("touchpadSwipeAnimateRight50px")) {
200 | htmlBody.addClass("touchpadSwipeAnimateRight50px");
201 | }
202 | } else if (leftOrRight < 0) {
203 | // backwards
204 | if (htmlBody.hasClass("touchpadSwipeAnimateRight50px")) {
205 | htmlBody.removeClass("touchpadSwipeAnimateRight50px");
206 | }
207 | if (!htmlBody.hasClass("touchpadSwipeAnimateLeft50px")) {
208 | htmlBody.addClass("touchpadSwipeAnimateLeft50px");
209 | }
210 | } else {
211 | // reset
212 | if (htmlBody.hasClass("touchpadSwipeAnimateLeft50px")) {
213 | htmlBody.removeClass("touchpadSwipeAnimateLeft50px");
214 | }
215 | if (htmlBody.hasClass("touchpadSwipeAnimateRight50px")) {
216 | htmlBody.removeClass("touchpadSwipeAnimateRight50px");
217 | }
218 | }
219 | }
220 | }
221 |
222 | function clearTimeoutAdvanced() {
223 | clearTimeout(timeOut);
224 | timeOut = false;
225 |
226 | }
227 |
228 | function debug(str) {
229 | if (isDebug) {
230 | console.log(str);
231 | }
232 | }
--------------------------------------------------------------------------------
/src/mousewheel.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * jQuery Mousewheel 3.1.13
3 | *
4 | * Copyright jQuery Foundation and other contributors
5 | * Released under the MIT license
6 | * http://jquery.org/license
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.12',
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 | // Clean up the data we added to the element
59 | $.removeData(this, 'mousewheel-line-height');
60 | $.removeData(this, 'mousewheel-page-height');
61 | },
62 |
63 | getLineHeight: function(elem) {
64 | var $elem = $(elem),
65 | $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent']();
66 | if (!$parent.length) {
67 | $parent = $('body');
68 | }
69 | return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16;
70 | },
71 |
72 | getPageHeight: function(elem) {
73 | return $(elem).height();
74 | },
75 |
76 | settings: {
77 | adjustOldDeltas: true, // see shouldAdjustOldDeltas() below
78 | normalizeOffset: true // calls getBoundingClientRect for each event
79 | }
80 | };
81 |
82 | $.fn.extend({
83 | mousewheel: function(fn) {
84 | return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');
85 | },
86 |
87 | unmousewheel: function(fn) {
88 | return this.unbind('mousewheel', fn);
89 | }
90 | });
91 |
92 |
93 | function handler(event) {
94 | var orgEvent = event || window.event,
95 | args = slice.call(arguments, 1),
96 | delta = 0,
97 | deltaX = 0,
98 | deltaY = 0,
99 | absDelta = 0,
100 | offsetX = 0,
101 | offsetY = 0;
102 | event = $.event.fix(orgEvent);
103 | event.type = 'mousewheel';
104 |
105 | // Old school scrollwheel delta
106 | if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; }
107 | if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; }
108 | if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; }
109 | if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }
110 |
111 | // Firefox < 17 horizontal scrolling related to DOMMouseScroll event
112 | if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
113 | deltaX = deltaY * -1;
114 | deltaY = 0;
115 | }
116 |
117 | // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy
118 | delta = deltaY === 0 ? deltaX : deltaY;
119 |
120 | // New school wheel delta (wheel event)
121 | if ( 'deltaY' in orgEvent ) {
122 | deltaY = orgEvent.deltaY * -1;
123 | delta = deltaY;
124 | }
125 | if ( 'deltaX' in orgEvent ) {
126 | deltaX = orgEvent.deltaX;
127 | if ( deltaY === 0 ) { delta = deltaX * -1; }
128 | }
129 |
130 | // No change actually happened, no reason to go any further
131 | if ( deltaY === 0 && deltaX === 0 ) { return; }
132 |
133 | // Need to convert lines and pages to pixels if we aren't already in pixels
134 | // There are three delta modes:
135 | // * deltaMode 0 is by pixels, nothing to do
136 | // * deltaMode 1 is by lines
137 | // * deltaMode 2 is by pages
138 | if ( orgEvent.deltaMode === 1 ) {
139 | var lineHeight = $.data(this, 'mousewheel-line-height');
140 | delta *= lineHeight;
141 | deltaY *= lineHeight;
142 | deltaX *= lineHeight;
143 | } else if ( orgEvent.deltaMode === 2 ) {
144 | var pageHeight = $.data(this, 'mousewheel-page-height');
145 | delta *= pageHeight;
146 | deltaY *= pageHeight;
147 | deltaX *= pageHeight;
148 | }
149 |
150 | // Store lowest absolute delta to normalize the delta values
151 | absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );
152 |
153 | if ( !lowestDelta || absDelta < lowestDelta ) {
154 | lowestDelta = absDelta;
155 |
156 | // Adjust older deltas if necessary
157 | if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
158 | lowestDelta /= 40;
159 | }
160 | }
161 |
162 | // Adjust older deltas if necessary
163 | if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
164 | // Divide all the things by 40!
165 | delta /= 40;
166 | deltaX /= 40;
167 | deltaY /= 40;
168 | }
169 |
170 | // Get a whole, normalized value for the deltas
171 | delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta);
172 | deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);
173 | deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);
174 |
175 | // Normalise offsetX and offsetY properties
176 | if ( special.settings.normalizeOffset && this.getBoundingClientRect ) {
177 | var boundingRect = this.getBoundingClientRect();
178 | offsetX = event.clientX - boundingRect.left;
179 | offsetY = event.clientY - boundingRect.top;
180 | }
181 |
182 | // Add information to the event object
183 | event.deltaX = deltaX;
184 | event.deltaY = deltaY;
185 | event.deltaFactor = lowestDelta;
186 | event.offsetX = offsetX;
187 | event.offsetY = offsetY;
188 | // Go ahead and set deltaMode to 0 since we converted to pixels
189 | // Although this is a little odd since we overwrite the deltaX/Y
190 | // properties with normalized deltas.
191 | event.deltaMode = 0;
192 |
193 | // Add event and delta to the front of the arguments
194 | args.unshift(event, delta, deltaX, deltaY);
195 |
196 | // Clearout lowestDelta after sometime to better
197 | // handle multiple device types that give different
198 | // a different lowestDelta
199 | // Ex: trackpad = 3 and mouse wheel = 120
200 | if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }
201 | nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);
202 |
203 | return ($.event.dispatch || $.event.handle).apply(this, args);
204 | }
205 |
206 | function nullLowestDelta() {
207 | lowestDelta = null;
208 | }
209 |
210 | function shouldAdjustOldDeltas(orgEvent, absDelta) {
211 | // If this is an older event and the delta is divisable by 120,
212 | // then we are assuming that the browser is treating this as an
213 | // older mouse wheel event and that we should divide the deltas
214 | // by 40 to try and get a more usable deltaFactor.
215 | // Side note, this actually impacts the reported scroll distance
216 | // in older browsers and can cause scrolling to be slower than native.
217 | // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.
218 | return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;
219 | }
220 |
221 | }));
--------------------------------------------------------------------------------
/src/jquery.min.js:
--------------------------------------------------------------------------------
1 | /*! jQuery v3.1.1 | (c) jQuery Foundation | jquery.org/license */
2 | !function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):C.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/[^\x20\t\r\n\f]+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),
3 | a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,ka=/^$|\/(?:java|ecma)script/i,la={option:[1,""],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};la.optgroup=la.option,la.tbody=la.tfoot=la.colgroup=la.caption=la.thead,la.th=la.td;function ma(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function na(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ma(l.appendChild(f),"script"),j&&na(g),c){k=0;while(f=g[k++])ka.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var qa=d.documentElement,ra=/^key/,sa=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ta=/^([^.]*)(?:\.(.+)|)/;function ua(){return!0}function va(){return!1}function wa(){try{return d.activeElement}catch(a){}}function xa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)xa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=va;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(qa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,za=/