├── page-swipe-iscroll ├── index.html ├── iscroll.js ├── jquery-1.7.2.min.js ├── logo.png ├── picture.jpg ├── scroll.js └── styles.css └── page-swipe ├── index.html ├── iscroll.js ├── left.png ├── logo.png ├── picture.jpg ├── right.png ├── styles.css ├── swipe.js └── zepto.min.js /page-swipe-iscroll/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 |
11 |
12 |
13 |

Page 1

14 |
15 |
16 |
17 |
18 |

Subtitle

19 |
20 |
21 |
22 |
23 |
24 |

Subtitle

25 |
26 |
27 | 28 |
29 |

Page 2

30 |
31 | 32 |
33 |
34 |
35 |
36 |

Page 3

37 |
38 |

Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo.

39 |

Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit amet, consectetur, adipisci[ng] velit, sed quia non numquam [do] eius modi tempora inci[di]dunt, ut labore et dolore magnam aliquam quaerat voluptatem.

40 |

Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?

41 |

Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur?

42 |

At vero eos et accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati cupiditate non provident, similique sunt in culpa, qui officia deserunt mollitia animi, id est laborum et dolorum fuga.

43 |

Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio, cumque nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas assumenda est, omnis dolor repellendus.

44 |

Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat...

45 |
46 |

More Lorem Ipsum

47 |
48 |

Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo.

49 |

Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit amet, consectetur, adipisci[ng] velit, sed quia non numquam [do] eius modi tempora inci[di]dunt, ut labore et dolore magnam aliquam quaerat voluptatem.

50 |

Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?

51 |

Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur?

52 |

At vero eos et accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati cupiditate non provident, similique sunt in culpa, qui officia deserunt mollitia animi, id est laborum et dolorum fuga.

53 |

Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio, cumque nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas assumenda est, omnis dolor repellendus.

54 |

Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat...

55 |
56 |

Even More Lorem Ipsum

57 |
58 |

Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo.

59 |

Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit amet, consectetur, adipisci[ng] velit, sed quia non numquam [do] eius modi tempora inci[di]dunt, ut labore et dolore magnam aliquam quaerat voluptatem.

60 |

Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?

61 |

Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur?

62 |

At vero eos et accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati cupiditate non provident, similique sunt in culpa, qui officia deserunt mollitia animi, id est laborum et dolorum fuga.

63 |

Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio, cumque nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas assumenda est, omnis dolor repellendus.

64 |

Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat...

65 |
66 |
67 |
68 |
69 |

Page 4

70 |
71 |
72 | 73 |
74 |
75 |
76 |
77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /page-swipe-iscroll/iscroll.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * iScroll v4.1.9 ~ Copyright (c) 2011 Matteo Spinelli, http://cubiq.org 3 | * Released under MIT license, http://cubiq.org/license 4 | */ 5 | (function(){ 6 | var m = Math, 7 | mround = function (r) { return r >> 0; }, 8 | vendor = (/webkit/i).test(navigator.appVersion) ? 'webkit' : 9 | (/firefox/i).test(navigator.userAgent) ? 'Moz' : 10 | (/trident/i).test(navigator.userAgent) ? 'ms' : 11 | 'opera' in window ? 'O' : '', 12 | 13 | // Browser capabilities 14 | isAndroid = (/android/gi).test(navigator.appVersion), 15 | isIDevice = (/iphone|ipad/gi).test(navigator.appVersion), 16 | isPlaybook = (/playbook/gi).test(navigator.appVersion), 17 | isTouchPad = (/hp-tablet/gi).test(navigator.appVersion), 18 | 19 | has3d = 'WebKitCSSMatrix' in window && 'm11' in new WebKitCSSMatrix(), 20 | hasTouch = 'ontouchstart' in window && !isTouchPad, 21 | hasTransform = vendor + 'Transform' in document.documentElement.style, 22 | hasTransitionEnd = isIDevice || isPlaybook, 23 | 24 | nextFrame = (function() { 25 | return window.requestAnimationFrame 26 | || window.webkitRequestAnimationFrame 27 | || window.mozRequestAnimationFrame 28 | || window.oRequestAnimationFrame 29 | || window.msRequestAnimationFrame 30 | || function(callback) { return setTimeout(callback, 1); }; 31 | })(), 32 | cancelFrame = (function () { 33 | return window.cancelRequestAnimationFrame 34 | || window.webkitCancelAnimationFrame 35 | || window.webkitCancelRequestAnimationFrame 36 | || window.mozCancelRequestAnimationFrame 37 | || window.oCancelRequestAnimationFrame 38 | || window.msCancelRequestAnimationFrame 39 | || clearTimeout; 40 | })(), 41 | 42 | // Events 43 | RESIZE_EV = 'onorientationchange' in window ? 'orientationchange' : 'resize', 44 | START_EV = hasTouch ? 'touchstart' : 'mousedown', 45 | MOVE_EV = hasTouch ? 'touchmove' : 'mousemove', 46 | END_EV = hasTouch ? 'touchend' : 'mouseup', 47 | CANCEL_EV = hasTouch ? 'touchcancel' : 'mouseup', 48 | WHEEL_EV = vendor == 'Moz' ? 'DOMMouseScroll' : 'mousewheel', 49 | 50 | // Helpers 51 | trnOpen = 'translate' + (has3d ? '3d(' : '('), 52 | trnClose = has3d ? ',0)' : ')', 53 | 54 | // Constructor 55 | iScroll = function (el, options) { 56 | var that = this, 57 | doc = document, 58 | i; 59 | 60 | that.wrapper = typeof el == 'object' ? el : doc.getElementById(el); 61 | that.wrapper.style.overflow = 'hidden'; 62 | that.scroller = that.wrapper.children[0]; 63 | 64 | // Default options 65 | that.options = { 66 | hScroll: true, 67 | vScroll: true, 68 | x: 0, 69 | y: 0, 70 | bounce: true, 71 | bounceLock: false, 72 | momentum: true, 73 | lockDirection: true, 74 | useTransform: true, 75 | useTransition: false, 76 | topOffset: 0, 77 | checkDOMChanges: false, // Experimental 78 | 79 | // Scrollbar 80 | hScrollbar: true, 81 | vScrollbar: true, 82 | fixedScrollbar: isAndroid, 83 | hideScrollbar: isIDevice, 84 | fadeScrollbar: isIDevice && has3d, 85 | scrollbarClass: '', 86 | 87 | // Zoom 88 | zoom: false, 89 | zoomMin: 1, 90 | zoomMax: 4, 91 | doubleTapZoom: 2, 92 | wheelAction: 'scroll', 93 | 94 | // Snap 95 | snap: false, 96 | snapThreshold: 1, 97 | 98 | // Events 99 | onRefresh: null, 100 | onBeforeScrollStart: function (e) { e.preventDefault(); }, 101 | onScrollStart: null, 102 | onBeforeScrollMove: null, 103 | onScrollMove: null, 104 | onBeforeScrollEnd: null, 105 | onScrollEnd: null, 106 | onTouchEnd: null, 107 | onDestroy: null, 108 | onZoomStart: null, 109 | onZoom: null, 110 | onZoomEnd: null 111 | }; 112 | 113 | // User defined options 114 | for (i in options) that.options[i] = options[i]; 115 | 116 | // Set starting position 117 | that.x = that.options.x; 118 | that.y = that.options.y; 119 | 120 | // Normalize options 121 | that.options.useTransform = hasTransform ? that.options.useTransform : false; 122 | that.options.hScrollbar = that.options.hScroll && that.options.hScrollbar; 123 | that.options.vScrollbar = that.options.vScroll && that.options.vScrollbar; 124 | that.options.zoom = that.options.useTransform && that.options.zoom; 125 | that.options.useTransition = hasTransitionEnd && that.options.useTransition; 126 | 127 | // Helpers FIX ANDROID BUG! 128 | // translate3d and scale doesn't work together! 129 | // Ignoring 3d ONLY WHEN YOU SET that.options.zoom 130 | if ( that.options.zoom && isAndroid ){ 131 | trnOpen = 'translate('; 132 | trnClose = ')'; 133 | } 134 | 135 | // Set some default styles 136 | that.scroller.style[vendor + 'TransitionProperty'] = that.options.useTransform ? '-' + vendor.toLowerCase() + '-transform' : 'top left'; 137 | that.scroller.style[vendor + 'TransitionDuration'] = '0'; 138 | that.scroller.style[vendor + 'TransformOrigin'] = '0 0'; 139 | if (that.options.useTransition) that.scroller.style[vendor + 'TransitionTimingFunction'] = 'cubic-bezier(0.33,0.66,0.66,1)'; 140 | 141 | if (that.options.useTransform) that.scroller.style[vendor + 'Transform'] = trnOpen + that.x + 'px,' + that.y + 'px' + trnClose; 142 | else that.scroller.style.cssText += ';position:absolute;top:' + that.y + 'px;left:' + that.x + 'px'; 143 | 144 | if (that.options.useTransition) that.options.fixedScrollbar = true; 145 | 146 | that.refresh(); 147 | 148 | that._bind(RESIZE_EV, window); 149 | that._bind(START_EV); 150 | if (!hasTouch) { 151 | that._bind('mouseout', that.wrapper); 152 | if (that.options.wheelAction != 'none') 153 | that._bind(WHEEL_EV); 154 | } 155 | 156 | if (that.options.checkDOMChanges) that.checkDOMTime = setInterval(function () { 157 | that._checkDOMChanges(); 158 | }, 500); 159 | }; 160 | 161 | // Prototype 162 | iScroll.prototype = { 163 | enabled: true, 164 | x: 0, 165 | y: 0, 166 | steps: [], 167 | scale: 1, 168 | currPageX: 0, currPageY: 0, 169 | pagesX: [], pagesY: [], 170 | aniTime: null, 171 | wheelZoomCount: 0, 172 | 173 | handleEvent: function (e) { 174 | var that = this; 175 | switch(e.type) { 176 | case START_EV: 177 | if (!hasTouch && e.button !== 0) return; 178 | that._start(e); 179 | break; 180 | case MOVE_EV: that._move(e); break; 181 | case END_EV: 182 | case CANCEL_EV: that._end(e); break; 183 | case RESIZE_EV: that._resize(); break; 184 | case WHEEL_EV: that._wheel(e); break; 185 | case 'mouseout': that._mouseout(e); break; 186 | case 'webkitTransitionEnd': that._transitionEnd(e); break; 187 | } 188 | }, 189 | 190 | _checkDOMChanges: function () { 191 | if (this.moved || this.zoomed || this.animating || 192 | (this.scrollerW == this.scroller.offsetWidth * this.scale && this.scrollerH == this.scroller.offsetHeight * this.scale)) return; 193 | 194 | this.refresh(); 195 | }, 196 | 197 | _scrollbar: function (dir) { 198 | var that = this, 199 | doc = document, 200 | bar; 201 | 202 | if (!that[dir + 'Scrollbar']) { 203 | if (that[dir + 'ScrollbarWrapper']) { 204 | if (hasTransform) that[dir + 'ScrollbarIndicator'].style[vendor + 'Transform'] = ''; 205 | that[dir + 'ScrollbarWrapper'].parentNode.removeChild(that[dir + 'ScrollbarWrapper']); 206 | that[dir + 'ScrollbarWrapper'] = null; 207 | that[dir + 'ScrollbarIndicator'] = null; 208 | } 209 | 210 | return; 211 | } 212 | 213 | if (!that[dir + 'ScrollbarWrapper']) { 214 | // Create the scrollbar wrapper 215 | bar = doc.createElement('div'); 216 | 217 | if (that.options.scrollbarClass) bar.className = that.options.scrollbarClass + dir.toUpperCase(); 218 | else bar.style.cssText = 'position:absolute;z-index:100;' + (dir == 'h' ? 'height:7px;bottom:1px;left:2px;right:' + (that.vScrollbar ? '7' : '2') + 'px' : 'width:7px;bottom:' + (that.hScrollbar ? '7' : '2') + 'px;top:2px;right:1px'); 219 | 220 | bar.style.cssText += ';pointer-events:none;-' + vendor + '-transition-property:opacity;-' + vendor + '-transition-duration:' + (that.options.fadeScrollbar ? '350ms' : '0') + ';overflow:hidden;opacity:' + (that.options.hideScrollbar ? '0' : '1'); 221 | 222 | that.wrapper.appendChild(bar); 223 | that[dir + 'ScrollbarWrapper'] = bar; 224 | 225 | // Create the scrollbar indicator 226 | bar = doc.createElement('div'); 227 | if (!that.options.scrollbarClass) { 228 | bar.style.cssText = 'position:absolute;z-index:100;background:rgba(0,0,0,0.5);border:1px solid rgba(255,255,255,0.9);-' + vendor + '-background-clip:padding-box;-' + vendor + '-box-sizing:border-box;' + (dir == 'h' ? 'height:100%' : 'width:100%') + ';-' + vendor + '-border-radius:3px;border-radius:3px'; 229 | } 230 | bar.style.cssText += ';pointer-events:none;-' + vendor + '-transition-property:-' + vendor + '-transform;-' + vendor + '-transition-timing-function:cubic-bezier(0.33,0.66,0.66,1);-' + vendor + '-transition-duration:0;-' + vendor + '-transform:' + trnOpen + '0,0' + trnClose; 231 | if (that.options.useTransition) bar.style.cssText += ';-' + vendor + '-transition-timing-function:cubic-bezier(0.33,0.66,0.66,1)'; 232 | 233 | that[dir + 'ScrollbarWrapper'].appendChild(bar); 234 | that[dir + 'ScrollbarIndicator'] = bar; 235 | } 236 | 237 | if (dir == 'h') { 238 | that.hScrollbarSize = that.hScrollbarWrapper.clientWidth; 239 | that.hScrollbarIndicatorSize = m.max(mround(that.hScrollbarSize * that.hScrollbarSize / that.scrollerW), 8); 240 | that.hScrollbarIndicator.style.width = that.hScrollbarIndicatorSize + 'px'; 241 | that.hScrollbarMaxScroll = that.hScrollbarSize - that.hScrollbarIndicatorSize; 242 | that.hScrollbarProp = that.hScrollbarMaxScroll / that.maxScrollX; 243 | } else { 244 | that.vScrollbarSize = that.vScrollbarWrapper.clientHeight; 245 | that.vScrollbarIndicatorSize = m.max(mround(that.vScrollbarSize * that.vScrollbarSize / that.scrollerH), 8); 246 | that.vScrollbarIndicator.style.height = that.vScrollbarIndicatorSize + 'px'; 247 | that.vScrollbarMaxScroll = that.vScrollbarSize - that.vScrollbarIndicatorSize; 248 | that.vScrollbarProp = that.vScrollbarMaxScroll / that.maxScrollY; 249 | } 250 | 251 | // Reset position 252 | that._scrollbarPos(dir, true); 253 | }, 254 | 255 | _resize: function () { 256 | var that = this; 257 | setTimeout(function () { that.refresh(); }, isAndroid ? 200 : 0); 258 | }, 259 | 260 | _pos: function (x, y) { 261 | if (this.zoomed) return; 262 | 263 | x = this.hScroll ? x : 0; 264 | y = this.vScroll ? y : 0; 265 | 266 | if (this.options.useTransform) { 267 | this.scroller.style[vendor + 'Transform'] = trnOpen + x + 'px,' + y + 'px' + trnClose + ' scale(' + this.scale + ')'; 268 | } else { 269 | x = mround(x); 270 | y = mround(y); 271 | this.scroller.style.left = x + 'px'; 272 | this.scroller.style.top = y + 'px'; 273 | } 274 | 275 | this.x = x; 276 | this.y = y; 277 | 278 | this._scrollbarPos('h'); 279 | this._scrollbarPos('v'); 280 | }, 281 | 282 | _scrollbarPos: function (dir, hidden) { 283 | var that = this, 284 | pos = dir == 'h' ? that.x : that.y, 285 | size; 286 | 287 | if (!that[dir + 'Scrollbar']) return; 288 | 289 | pos = that[dir + 'ScrollbarProp'] * pos; 290 | 291 | if (pos < 0) { 292 | if (!that.options.fixedScrollbar) { 293 | size = that[dir + 'ScrollbarIndicatorSize'] + mround(pos * 3); 294 | if (size < 8) size = 8; 295 | that[dir + 'ScrollbarIndicator'].style[dir == 'h' ? 'width' : 'height'] = size + 'px'; 296 | } 297 | pos = 0; 298 | } else if (pos > that[dir + 'ScrollbarMaxScroll']) { 299 | if (!that.options.fixedScrollbar) { 300 | size = that[dir + 'ScrollbarIndicatorSize'] - mround((pos - that[dir + 'ScrollbarMaxScroll']) * 3); 301 | if (size < 8) size = 8; 302 | that[dir + 'ScrollbarIndicator'].style[dir == 'h' ? 'width' : 'height'] = size + 'px'; 303 | pos = that[dir + 'ScrollbarMaxScroll'] + (that[dir + 'ScrollbarIndicatorSize'] - size); 304 | } else { 305 | pos = that[dir + 'ScrollbarMaxScroll']; 306 | } 307 | } 308 | 309 | that[dir + 'ScrollbarWrapper'].style[vendor + 'TransitionDelay'] = '0'; 310 | that[dir + 'ScrollbarWrapper'].style.opacity = hidden && that.options.hideScrollbar ? '0' : '1'; 311 | that[dir + 'ScrollbarIndicator'].style[vendor + 'Transform'] = trnOpen + (dir == 'h' ? pos + 'px,0' : '0,' + pos + 'px') + trnClose; 312 | }, 313 | 314 | _start: function (e) { 315 | var that = this, 316 | point = hasTouch ? e.touches[0] : e, 317 | matrix, x, y, 318 | c1, c2; 319 | 320 | if (!that.enabled) return; 321 | 322 | if (that.options.onBeforeScrollStart) that.options.onBeforeScrollStart.call(that, e); 323 | 324 | if (that.options.useTransition || that.options.zoom) that._transitionTime(0); 325 | 326 | that.moved = false; 327 | that.animating = false; 328 | that.zoomed = false; 329 | that.distX = 0; 330 | that.distY = 0; 331 | that.absDistX = 0; 332 | that.absDistY = 0; 333 | that.dirX = 0; 334 | that.dirY = 0; 335 | 336 | // Gesture start 337 | if (that.options.zoom && hasTouch && e.touches.length > 1) { 338 | c1 = m.abs(e.touches[0].pageX-e.touches[1].pageX); 339 | c2 = m.abs(e.touches[0].pageY-e.touches[1].pageY); 340 | that.touchesDistStart = m.sqrt(c1 * c1 + c2 * c2); 341 | 342 | that.originX = m.abs(e.touches[0].pageX + e.touches[1].pageX - that.wrapperOffsetLeft * 2) / 2 - that.x; 343 | that.originY = m.abs(e.touches[0].pageY + e.touches[1].pageY - that.wrapperOffsetTop * 2) / 2 - that.y; 344 | 345 | if (that.options.onZoomStart) that.options.onZoomStart.call(that, e); 346 | } 347 | 348 | if (that.options.momentum) { 349 | if (that.options.useTransform) { 350 | // Very lame general purpose alternative to CSSMatrix 351 | matrix = getComputedStyle(that.scroller, null)[vendor + 'Transform'].replace(/[^0-9-.,]/g, '').split(','); 352 | x = matrix[4] * 1; 353 | y = matrix[5] * 1; 354 | } else { 355 | x = getComputedStyle(that.scroller, null).left.replace(/[^0-9-]/g, '') * 1; 356 | y = getComputedStyle(that.scroller, null).top.replace(/[^0-9-]/g, '') * 1; 357 | } 358 | 359 | if (x != that.x || y != that.y) { 360 | if (that.options.useTransition) that._unbind('webkitTransitionEnd'); 361 | else cancelFrame(that.aniTime); 362 | that.steps = []; 363 | that._pos(x, y); 364 | } 365 | } 366 | 367 | that.absStartX = that.x; // Needed by snap threshold 368 | that.absStartY = that.y; 369 | 370 | that.startX = that.x; 371 | that.startY = that.y; 372 | that.pointX = point.pageX; 373 | that.pointY = point.pageY; 374 | 375 | that.startTime = e.timeStamp || Date.now(); 376 | 377 | if (that.options.onScrollStart) that.options.onScrollStart.call(that, e); 378 | 379 | that._bind(MOVE_EV); 380 | that._bind(END_EV); 381 | that._bind(CANCEL_EV); 382 | }, 383 | 384 | _move: function (e) { 385 | var that = this, 386 | point = hasTouch ? e.touches[0] : e, 387 | deltaX = point.pageX - that.pointX, 388 | deltaY = point.pageY - that.pointY, 389 | newX = that.x + deltaX, 390 | newY = that.y + deltaY, 391 | c1, c2, scale, 392 | timestamp = e.timeStamp || Date.now(); 393 | 394 | if (that.options.onBeforeScrollMove) that.options.onBeforeScrollMove.call(that, e); 395 | 396 | // Zoom 397 | if (that.options.zoom && hasTouch && e.touches.length > 1) { 398 | c1 = m.abs(e.touches[0].pageX - e.touches[1].pageX); 399 | c2 = m.abs(e.touches[0].pageY - e.touches[1].pageY); 400 | that.touchesDist = m.sqrt(c1*c1+c2*c2); 401 | 402 | that.zoomed = true; 403 | 404 | scale = 1 / that.touchesDistStart * that.touchesDist * this.scale; 405 | 406 | if (scale < that.options.zoomMin) scale = 0.5 * that.options.zoomMin * Math.pow(2.0, scale / that.options.zoomMin); 407 | else if (scale > that.options.zoomMax) scale = 2.0 * that.options.zoomMax * Math.pow(0.5, that.options.zoomMax / scale); 408 | 409 | that.lastScale = scale / this.scale; 410 | 411 | newX = this.originX - this.originX * that.lastScale + this.x, 412 | newY = this.originY - this.originY * that.lastScale + this.y; 413 | 414 | this.scroller.style[vendor + 'Transform'] = trnOpen + newX + 'px,' + newY + 'px' + trnClose + ' scale(' + scale + ')'; 415 | 416 | if (that.options.onZoom) that.options.onZoom.call(that, e); 417 | return; 418 | } 419 | 420 | that.pointX = point.pageX; 421 | that.pointY = point.pageY; 422 | 423 | // Slow down if outside of the boundaries 424 | if (newX > 0 || newX < that.maxScrollX) { 425 | newX = that.options.bounce ? that.x + (deltaX / 2) : newX >= 0 || that.maxScrollX >= 0 ? 0 : that.maxScrollX; 426 | } 427 | if (newY > that.minScrollY || newY < that.maxScrollY) { 428 | newY = that.options.bounce ? that.y + (deltaY / 2) : newY >= that.minScrollY || that.maxScrollY >= 0 ? that.minScrollY : that.maxScrollY; 429 | } 430 | 431 | that.distX += deltaX; 432 | that.distY += deltaY; 433 | that.absDistX = m.abs(that.distX); 434 | that.absDistY = m.abs(that.distY); 435 | 436 | if (that.absDistX < 6 && that.absDistY < 6) { 437 | return; 438 | } 439 | 440 | // Lock direction 441 | if (that.options.lockDirection) { 442 | if (that.absDistX > that.absDistY + 5) { 443 | newY = that.y; 444 | deltaY = 0; 445 | } else if (that.absDistY > that.absDistX + 5) { 446 | newX = that.x; 447 | deltaX = 0; 448 | } 449 | } 450 | 451 | that.moved = true; 452 | that._pos(newX, newY); 453 | that.dirX = deltaX > 0 ? -1 : deltaX < 0 ? 1 : 0; 454 | that.dirY = deltaY > 0 ? -1 : deltaY < 0 ? 1 : 0; 455 | 456 | if (timestamp - that.startTime > 300) { 457 | that.startTime = timestamp; 458 | that.startX = that.x; 459 | that.startY = that.y; 460 | } 461 | 462 | if (that.options.onScrollMove) that.options.onScrollMove.call(that, e); 463 | }, 464 | 465 | _end: function (e) { 466 | if (hasTouch && e.touches.length != 0) return; 467 | 468 | var that = this, 469 | point = hasTouch ? e.changedTouches[0] : e, 470 | target, ev, 471 | momentumX = { dist:0, time:0 }, 472 | momentumY = { dist:0, time:0 }, 473 | duration = (e.timeStamp || Date.now()) - that.startTime, 474 | newPosX = that.x, 475 | newPosY = that.y, 476 | distX, distY, 477 | newDuration, 478 | snap, 479 | scale; 480 | 481 | that._unbind(MOVE_EV); 482 | that._unbind(END_EV); 483 | that._unbind(CANCEL_EV); 484 | 485 | if (that.options.onBeforeScrollEnd) that.options.onBeforeScrollEnd.call(that, e); 486 | 487 | if (that.zoomed) { 488 | scale = that.scale * that.lastScale; 489 | scale = Math.max(that.options.zoomMin, scale); 490 | scale = Math.min(that.options.zoomMax, scale); 491 | that.lastScale = scale / that.scale; 492 | that.scale = scale; 493 | 494 | that.x = that.originX - that.originX * that.lastScale + that.x; 495 | that.y = that.originY - that.originY * that.lastScale + that.y; 496 | 497 | that.scroller.style[vendor + 'TransitionDuration'] = '200ms'; 498 | that.scroller.style[vendor + 'Transform'] = trnOpen + that.x + 'px,' + that.y + 'px' + trnClose + ' scale(' + that.scale + ')'; 499 | 500 | that.zoomed = false; 501 | that.refresh(); 502 | 503 | if (that.options.onZoomEnd) that.options.onZoomEnd.call(that, e); 504 | return; 505 | } 506 | 507 | if (!that.moved) { 508 | if (hasTouch) { 509 | if (that.doubleTapTimer && that.options.zoom) { 510 | // Double tapped 511 | clearTimeout(that.doubleTapTimer); 512 | that.doubleTapTimer = null; 513 | if (that.options.onZoomStart) that.options.onZoomStart.call(that, e); 514 | that.zoom(that.pointX, that.pointY, that.scale == 1 ? that.options.doubleTapZoom : 1); 515 | if (that.options.onZoomEnd) { 516 | setTimeout(function() { 517 | that.options.onZoomEnd.call(that, e); 518 | }, 200); // 200 is default zoom duration 519 | } 520 | } else { 521 | that.doubleTapTimer = setTimeout(function () { 522 | that.doubleTapTimer = null; 523 | 524 | // Find the last touched element 525 | target = point.target; 526 | while (target.nodeType != 1) target = target.parentNode; 527 | 528 | if (target.tagName != 'SELECT' && target.tagName != 'INPUT' && target.tagName != 'TEXTAREA') { 529 | ev = document.createEvent('MouseEvents'); 530 | ev.initMouseEvent('click', true, true, e.view, 1, 531 | point.screenX, point.screenY, point.clientX, point.clientY, 532 | e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, 533 | 0, null); 534 | ev._fake = true; 535 | target.dispatchEvent(ev); 536 | } 537 | }, that.options.zoom ? 250 : 0); 538 | } 539 | } 540 | 541 | that._resetPos(200); 542 | 543 | if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e); 544 | return; 545 | } 546 | 547 | if (duration < 300 && that.options.momentum) { 548 | momentumX = newPosX ? that._momentum(newPosX - that.startX, duration, -that.x, that.scrollerW - that.wrapperW + that.x, that.options.bounce ? that.wrapperW : 0) : momentumX; 549 | momentumY = newPosY ? that._momentum(newPosY - that.startY, duration, -that.y, (that.maxScrollY < 0 ? that.scrollerH - that.wrapperH + that.y - that.minScrollY : 0), that.options.bounce ? that.wrapperH : 0) : momentumY; 550 | 551 | newPosX = that.x + momentumX.dist; 552 | newPosY = that.y + momentumY.dist; 553 | 554 | if ((that.x > 0 && newPosX > 0) || (that.x < that.maxScrollX && newPosX < that.maxScrollX)) momentumX = { dist:0, time:0 }; 555 | if ((that.y > that.minScrollY && newPosY > that.minScrollY) || (that.y < that.maxScrollY && newPosY < that.maxScrollY)) momentumY = { dist:0, time:0 }; 556 | } 557 | 558 | if (momentumX.dist || momentumY.dist) { 559 | newDuration = m.max(m.max(momentumX.time, momentumY.time), 10); 560 | 561 | // Do we need to snap? 562 | if (that.options.snap) { 563 | distX = newPosX - that.absStartX; 564 | distY = newPosY - that.absStartY; 565 | if (m.abs(distX) < that.options.snapThreshold && m.abs(distY) < that.options.snapThreshold) { that.scrollTo(that.absStartX, that.absStartY, 200); } 566 | else { 567 | snap = that._snap(newPosX, newPosY); 568 | newPosX = snap.x; 569 | newPosY = snap.y; 570 | newDuration = m.max(snap.time, newDuration); 571 | } 572 | } 573 | 574 | that.scrollTo(mround(newPosX), mround(newPosY), newDuration); 575 | 576 | if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e); 577 | return; 578 | } 579 | 580 | // Do we need to snap? 581 | if (that.options.snap) { 582 | distX = newPosX - that.absStartX; 583 | distY = newPosY - that.absStartY; 584 | if (m.abs(distX) < that.options.snapThreshold && m.abs(distY) < that.options.snapThreshold) that.scrollTo(that.absStartX, that.absStartY, 200); 585 | else { 586 | snap = that._snap(that.x, that.y); 587 | if (snap.x != that.x || snap.y != that.y) that.scrollTo(snap.x, snap.y, snap.time); 588 | } 589 | 590 | if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e); 591 | return; 592 | } 593 | 594 | that._resetPos(200); 595 | if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e); 596 | }, 597 | 598 | _resetPos: function (time) { 599 | var that = this, 600 | resetX = that.x >= 0 ? 0 : that.x < that.maxScrollX ? that.maxScrollX : that.x, 601 | resetY = that.y >= that.minScrollY || that.maxScrollY > 0 ? that.minScrollY : that.y < that.maxScrollY ? that.maxScrollY : that.y; 602 | 603 | if (resetX == that.x && resetY == that.y) { 604 | if (that.moved) { 605 | that.moved = false; 606 | if (that.options.onScrollEnd) that.options.onScrollEnd.call(that); // Execute custom code on scroll end 607 | } 608 | 609 | if (that.hScrollbar && that.options.hideScrollbar) { 610 | if (vendor == 'webkit') that.hScrollbarWrapper.style[vendor + 'TransitionDelay'] = '300ms'; 611 | that.hScrollbarWrapper.style.opacity = '0'; 612 | } 613 | if (that.vScrollbar && that.options.hideScrollbar) { 614 | if (vendor == 'webkit') that.vScrollbarWrapper.style[vendor + 'TransitionDelay'] = '300ms'; 615 | that.vScrollbarWrapper.style.opacity = '0'; 616 | } 617 | 618 | return; 619 | } 620 | 621 | that.scrollTo(resetX, resetY, time || 0); 622 | }, 623 | 624 | _wheel: function (e) { 625 | var that = this, 626 | wheelDeltaX, wheelDeltaY, 627 | deltaX, deltaY, 628 | deltaScale; 629 | 630 | if ('wheelDeltaX' in e) { 631 | wheelDeltaX = e.wheelDeltaX / 12; 632 | wheelDeltaY = e.wheelDeltaY / 12; 633 | } else if('wheelDelta' in e) { 634 | wheelDeltaX = wheelDeltaY = e.wheelDelta / 12; 635 | } else if ('detail' in e) { 636 | wheelDeltaX = wheelDeltaY = -e.detail * 3; 637 | } else { 638 | return; 639 | } 640 | 641 | if (that.options.wheelAction == 'zoom') { 642 | deltaScale = that.scale * Math.pow(2, 1/3 * (wheelDeltaY ? wheelDeltaY / Math.abs(wheelDeltaY) : 0)); 643 | if (deltaScale < that.options.zoomMin) deltaScale = that.options.zoomMin; 644 | if (deltaScale > that.options.zoomMax) deltaScale = that.options.zoomMax; 645 | 646 | if (deltaScale != that.scale) { 647 | if (!that.wheelZoomCount && that.options.onZoomStart) that.options.onZoomStart.call(that, e); 648 | that.wheelZoomCount++; 649 | 650 | that.zoom(e.pageX, e.pageY, deltaScale, 400); 651 | 652 | setTimeout(function() { 653 | that.wheelZoomCount--; 654 | if (!that.wheelZoomCount && that.options.onZoomEnd) that.options.onZoomEnd.call(that, e); 655 | }, 400); 656 | } 657 | 658 | return; 659 | } 660 | 661 | deltaX = that.x + wheelDeltaX; 662 | deltaY = that.y + wheelDeltaY; 663 | 664 | if (deltaX > 0) deltaX = 0; 665 | else if (deltaX < that.maxScrollX) deltaX = that.maxScrollX; 666 | 667 | if (deltaY > that.minScrollY) deltaY = that.minScrollY; 668 | else if (deltaY < that.maxScrollY) deltaY = that.maxScrollY; 669 | 670 | if(that.maxScrollY < 0){ 671 | that.scrollTo(deltaX, deltaY, 0); 672 | } 673 | }, 674 | 675 | _mouseout: function (e) { 676 | var t = e.relatedTarget; 677 | 678 | if (!t) { 679 | this._end(e); 680 | return; 681 | } 682 | 683 | while (t = t.parentNode) if (t == this.wrapper) return; 684 | 685 | this._end(e); 686 | }, 687 | 688 | _transitionEnd: function (e) { 689 | var that = this; 690 | 691 | if (e.target != that.scroller) return; 692 | 693 | that._unbind('webkitTransitionEnd'); 694 | 695 | that._startAni(); 696 | }, 697 | 698 | 699 | /** 700 | * 701 | * Utilities 702 | * 703 | */ 704 | _startAni: function () { 705 | var that = this, 706 | startX = that.x, startY = that.y, 707 | startTime = Date.now(), 708 | step, easeOut, 709 | animate; 710 | 711 | if (that.animating) return; 712 | 713 | if (!that.steps.length) { 714 | that._resetPos(400); 715 | return; 716 | } 717 | 718 | step = that.steps.shift(); 719 | 720 | if (step.x == startX && step.y == startY) step.time = 0; 721 | 722 | that.animating = true; 723 | that.moved = true; 724 | 725 | if (that.options.useTransition) { 726 | that._transitionTime(step.time); 727 | that._pos(step.x, step.y); 728 | that.animating = false; 729 | if (step.time) that._bind('webkitTransitionEnd'); 730 | else that._resetPos(0); 731 | return; 732 | } 733 | 734 | animate = function () { 735 | var now = Date.now(), 736 | newX, newY; 737 | 738 | if (now >= startTime + step.time) { 739 | that._pos(step.x, step.y); 740 | that.animating = false; 741 | if (that.options.onAnimationEnd) that.options.onAnimationEnd.call(that); // Execute custom code on animation end 742 | that._startAni(); 743 | return; 744 | } 745 | 746 | now = (now - startTime) / step.time - 1; 747 | easeOut = m.sqrt(1 - now * now); 748 | newX = (step.x - startX) * easeOut + startX; 749 | newY = (step.y - startY) * easeOut + startY; 750 | that._pos(newX, newY); 751 | if (that.animating) that.aniTime = nextFrame(animate); 752 | }; 753 | 754 | animate(); 755 | }, 756 | 757 | _transitionTime: function (time) { 758 | time += 'ms'; 759 | this.scroller.style[vendor + 'TransitionDuration'] = time; 760 | if (this.hScrollbar) this.hScrollbarIndicator.style[vendor + 'TransitionDuration'] = time; 761 | if (this.vScrollbar) this.vScrollbarIndicator.style[vendor + 'TransitionDuration'] = time; 762 | }, 763 | 764 | _momentum: function (dist, time, maxDistUpper, maxDistLower, size) { 765 | var deceleration = 0.0006, 766 | speed = m.abs(dist) / time, 767 | newDist = (speed * speed) / (2 * deceleration), 768 | newTime = 0, outsideDist = 0; 769 | 770 | // Proportinally reduce speed if we are outside of the boundaries 771 | if (dist > 0 && newDist > maxDistUpper) { 772 | outsideDist = size / (6 / (newDist / speed * deceleration)); 773 | maxDistUpper = maxDistUpper + outsideDist; 774 | speed = speed * maxDistUpper / newDist; 775 | newDist = maxDistUpper; 776 | } else if (dist < 0 && newDist > maxDistLower) { 777 | outsideDist = size / (6 / (newDist / speed * deceleration)); 778 | maxDistLower = maxDistLower + outsideDist; 779 | speed = speed * maxDistLower / newDist; 780 | newDist = maxDistLower; 781 | } 782 | 783 | newDist = newDist * (dist < 0 ? -1 : 1); 784 | newTime = speed / deceleration; 785 | 786 | return { dist: newDist, time: mround(newTime) }; 787 | }, 788 | 789 | _offset: function (el) { 790 | var left = -el.offsetLeft, 791 | top = -el.offsetTop; 792 | 793 | while (el = el.offsetParent) { 794 | left -= el.offsetLeft; 795 | top -= el.offsetTop; 796 | } 797 | 798 | if (el != this.wrapper) { 799 | left *= this.scale; 800 | top *= this.scale; 801 | } 802 | 803 | return { left: left, top: top }; 804 | }, 805 | 806 | _snap: function (x, y) { 807 | var that = this, 808 | i, l, 809 | page, time, 810 | sizeX, sizeY; 811 | 812 | // Check page X 813 | page = that.pagesX.length - 1; 814 | for (i=0, l=that.pagesX.length; i= that.pagesX[i]) { 816 | page = i; 817 | break; 818 | } 819 | } 820 | if (page == that.currPageX && page > 0 && that.dirX < 0) page--; 821 | x = that.pagesX[page]; 822 | sizeX = m.abs(x - that.pagesX[that.currPageX]); 823 | sizeX = sizeX ? m.abs(that.x - x) / sizeX * 500 : 0; 824 | that.currPageX = page; 825 | 826 | // Check page Y 827 | page = that.pagesY.length-1; 828 | for (i=0; i= that.pagesY[i]) { 830 | page = i; 831 | break; 832 | } 833 | } 834 | if (page == that.currPageY && page > 0 && that.dirY < 0) page--; 835 | y = that.pagesY[page]; 836 | sizeY = m.abs(y - that.pagesY[that.currPageY]); 837 | sizeY = sizeY ? m.abs(that.y - y) / sizeY * 500 : 0; 838 | that.currPageY = page; 839 | 840 | // Snap with constant speed (proportional duration) 841 | time = mround(m.max(sizeX, sizeY)) || 200; 842 | 843 | return { x: x, y: y, time: time }; 844 | }, 845 | 846 | _bind: function (type, el, bubble) { 847 | (el || this.scroller).addEventListener(type, this, !!bubble); 848 | }, 849 | 850 | _unbind: function (type, el, bubble) { 851 | (el || this.scroller).removeEventListener(type, this, !!bubble); 852 | }, 853 | 854 | 855 | /** 856 | * 857 | * Public methods 858 | * 859 | */ 860 | destroy: function () { 861 | var that = this; 862 | 863 | that.scroller.style[vendor + 'Transform'] = ''; 864 | 865 | // Remove the scrollbars 866 | that.hScrollbar = false; 867 | that.vScrollbar = false; 868 | that._scrollbar('h'); 869 | that._scrollbar('v'); 870 | 871 | // Remove the event listeners 872 | that._unbind(RESIZE_EV, window); 873 | that._unbind(START_EV); 874 | that._unbind(MOVE_EV); 875 | that._unbind(END_EV); 876 | that._unbind(CANCEL_EV); 877 | 878 | if (!that.options.hasTouch) { 879 | that._unbind('mouseout', that.wrapper); 880 | that._unbind(WHEEL_EV); 881 | } 882 | 883 | if (that.options.useTransition) that._unbind('webkitTransitionEnd'); 884 | 885 | if (that.options.checkDOMChanges) clearInterval(that.checkDOMTime); 886 | 887 | if (that.options.onDestroy) that.options.onDestroy.call(that); 888 | }, 889 | 890 | refresh: function () { 891 | var that = this, 892 | offset, 893 | i, l, 894 | els, 895 | pos = 0, 896 | page = 0; 897 | 898 | if (that.scale < that.options.zoomMin) that.scale = that.options.zoomMin; 899 | that.wrapperW = that.wrapper.clientWidth || 1; 900 | that.wrapperH = that.wrapper.clientHeight || 1; 901 | 902 | that.minScrollY = -that.options.topOffset || 0; 903 | that.scrollerW = mround(that.scroller.offsetWidth * that.scale); 904 | that.scrollerH = mround((that.scroller.offsetHeight + that.minScrollY) * that.scale); 905 | that.maxScrollX = that.wrapperW - that.scrollerW; 906 | that.maxScrollY = that.wrapperH - that.scrollerH + that.minScrollY; 907 | that.dirX = 0; 908 | that.dirY = 0; 909 | 910 | if (that.options.onRefresh) that.options.onRefresh.call(that); 911 | 912 | that.hScroll = that.options.hScroll && that.maxScrollX < 0; 913 | that.vScroll = that.options.vScroll && (!that.options.bounceLock && !that.hScroll || that.scrollerH > that.wrapperH); 914 | 915 | that.hScrollbar = that.hScroll && that.options.hScrollbar; 916 | that.vScrollbar = that.vScroll && that.options.vScrollbar && that.scrollerH > that.wrapperH; 917 | 918 | offset = that._offset(that.wrapper); 919 | that.wrapperOffsetLeft = -offset.left; 920 | that.wrapperOffsetTop = -offset.top; 921 | 922 | // Prepare snap 923 | if (typeof that.options.snap == 'string') { 924 | that.pagesX = []; 925 | that.pagesY = []; 926 | els = that.scroller.querySelectorAll(that.options.snap); 927 | for (i=0, l=els.length; i= that.maxScrollX) { 937 | that.pagesX[page] = pos; 938 | pos = pos - that.wrapperW; 939 | page++; 940 | } 941 | if (that.maxScrollX%that.wrapperW) that.pagesX[that.pagesX.length] = that.maxScrollX - that.pagesX[that.pagesX.length-1] + that.pagesX[that.pagesX.length-1]; 942 | 943 | pos = 0; 944 | page = 0; 945 | that.pagesY = []; 946 | while (pos >= that.maxScrollY) { 947 | that.pagesY[page] = pos; 948 | pos = pos - that.wrapperH; 949 | page++; 950 | } 951 | if (that.maxScrollY%that.wrapperH) that.pagesY[that.pagesY.length] = that.maxScrollY - that.pagesY[that.pagesY.length-1] + that.pagesY[that.pagesY.length-1]; 952 | } 953 | 954 | // Prepare the scrollbars 955 | that._scrollbar('h'); 956 | that._scrollbar('v'); 957 | 958 | if (!that.zoomed) { 959 | that.scroller.style[vendor + 'TransitionDuration'] = '0'; 960 | that._resetPos(200); 961 | } 962 | }, 963 | 964 | scrollTo: function (x, y, time, relative) { 965 | var that = this, 966 | step = x, 967 | i, l; 968 | 969 | that.stop(); 970 | 971 | if (!step.length) step = [{ x: x, y: y, time: time, relative: relative }]; 972 | 973 | for (i=0, l=step.length; i 0 ? 0 : pos.left < that.maxScrollX ? that.maxScrollX : pos.left; 991 | pos.top = pos.top > that.minScrollY ? that.minScrollY : pos.top < that.maxScrollY ? that.maxScrollY : pos.top; 992 | time = time === undefined ? m.max(m.abs(pos.left)*2, m.abs(pos.top)*2) : time; 993 | 994 | that.scrollTo(pos.left, pos.top, time); 995 | }, 996 | 997 | scrollToPage: function (pageX, pageY, time) { 998 | var that = this, x, y; 999 | 1000 | time = time === undefined ? 400 : time; 1001 | 1002 | if (that.options.onScrollStart) that.options.onScrollStart.call(that); 1003 | 1004 | if (that.options.snap) { 1005 | pageX = pageX == 'next' ? that.currPageX+1 : pageX == 'prev' ? that.currPageX-1 : pageX; 1006 | pageY = pageY == 'next' ? that.currPageY+1 : pageY == 'prev' ? that.currPageY-1 : pageY; 1007 | 1008 | pageX = pageX < 0 ? 0 : pageX > that.pagesX.length-1 ? that.pagesX.length-1 : pageX; 1009 | pageY = pageY < 0 ? 0 : pageY > that.pagesY.length-1 ? that.pagesY.length-1 : pageY; 1010 | 1011 | that.currPageX = pageX; 1012 | that.currPageY = pageY; 1013 | x = that.pagesX[pageX]; 1014 | y = that.pagesY[pageY]; 1015 | } else { 1016 | x = -that.wrapperW * pageX; 1017 | y = -that.wrapperH * pageY; 1018 | if (x < that.maxScrollX) x = that.maxScrollX; 1019 | if (y < that.maxScrollY) y = that.maxScrollY; 1020 | } 1021 | 1022 | that.scrollTo(x, y, time); 1023 | }, 1024 | 1025 | disable: function () { 1026 | this.stop(); 1027 | this._resetPos(0); 1028 | this.enabled = false; 1029 | 1030 | // If disabled after touchstart we make sure that there are no left over events 1031 | this._unbind(MOVE_EV); 1032 | this._unbind(END_EV); 1033 | this._unbind(CANCEL_EV); 1034 | }, 1035 | 1036 | enable: function () { 1037 | this.enabled = true; 1038 | }, 1039 | 1040 | stop: function () { 1041 | if (this.options.useTransition) this._unbind('webkitTransitionEnd'); 1042 | else cancelFrame(this.aniTime); 1043 | this.steps = []; 1044 | this.moved = false; 1045 | this.animating = false; 1046 | }, 1047 | 1048 | zoom: function (x, y, scale, time) { 1049 | var that = this, 1050 | relScale = scale / that.scale; 1051 | 1052 | if (!that.options.useTransform) return; 1053 | 1054 | that.zoomed = true; 1055 | time = time === undefined ? 200 : time; 1056 | x = x - that.wrapperOffsetLeft - that.x; 1057 | y = y - that.wrapperOffsetTop - that.y; 1058 | that.x = x - x * relScale + that.x; 1059 | that.y = y - y * relScale + that.y; 1060 | 1061 | that.scale = scale; 1062 | that.refresh(); 1063 | 1064 | that.x = that.x > 0 ? 0 : that.x < that.maxScrollX ? that.maxScrollX : that.x; 1065 | that.y = that.y > that.minScrollY ? that.minScrollY : that.y < that.maxScrollY ? that.maxScrollY : that.y; 1066 | 1067 | that.scroller.style[vendor + 'TransitionDuration'] = time + 'ms'; 1068 | that.scroller.style[vendor + 'Transform'] = trnOpen + that.x + 'px,' + that.y + 'px' + trnClose + ' scale(' + scale + ')'; 1069 | that.zoomed = false; 1070 | }, 1071 | 1072 | isReady: function () { 1073 | return !this.moved && !this.zoomed && !this.animating; 1074 | } 1075 | }; 1076 | 1077 | if (typeof exports !== 'undefined') exports.iScroll = iScroll; 1078 | else window.iScroll = iScroll; 1079 | 1080 | })(); 1081 | -------------------------------------------------------------------------------- /page-swipe-iscroll/jquery-1.7.2.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v1.7.2 jquery.com | jquery.org/license */ 2 | (function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( 3 | a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f 4 | .clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); -------------------------------------------------------------------------------- /page-swipe-iscroll/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/mobile-ui-patterns/d25a8efd013927983bc20acce735f3cc26a74925/page-swipe-iscroll/logo.png -------------------------------------------------------------------------------- /page-swipe-iscroll/picture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/mobile-ui-patterns/d25a8efd013927983bc20acce735f3cc26a74925/page-swipe-iscroll/picture.jpg -------------------------------------------------------------------------------- /page-swipe-iscroll/scroll.js: -------------------------------------------------------------------------------- 1 | document.addEventListener("orientationchange", updateLayout); 2 | 3 | // The wrapperWidth before orientationChange. Used to identify the current page number in updateLayout(); 4 | wrapperWidth = 0; 5 | 6 | var myScroll = new iScroll('pageWrapper', { 7 | snap: true, 8 | momentum: false, 9 | hScrollbar: false, 10 | vScrollbar: false, 11 | lockDirection: true}); 12 | 13 | updateLayout(); 14 | 15 | function updateLayout() { 16 | 17 | var currentPage = 0; 18 | 19 | if (wrapperWidth > 0) { 20 | currentPage = - Math.ceil( $('#pageScroller').position().left / wrapperWidth); 21 | } 22 | 23 | wrapperWidth = $('#pageWrapper').width(); 24 | 25 | $('#pageScroller').css('width', wrapperWidth * 4); 26 | $('.page').css('width', wrapperWidth - 40); 27 | myScroll.refresh(); 28 | myScroll.scrollToPage(currentPage, 0, 0); 29 | } 30 | 31 | page3Scroll = new iScroll('wrapper', {hScrollbar: false, vScrollbar: false, lockDirection: true }); -------------------------------------------------------------------------------- /page-swipe-iscroll/styles.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: helvetica neue; 3 | background-color: #E7EAEC; 4 | } 5 | 6 | .page h1, 7 | .page h2 8 | { 9 | color: #BCBEC0; 10 | font-weight: normal; 11 | margin-top: 0px; 12 | } 13 | 14 | .page hr { 15 | height: 2px; 16 | background-color: #E6E7E8; 17 | border: none; 18 | border-bottom: solid 1px #FFFFFF; 19 | } 20 | 21 | .frame { 22 | position:absolute; 23 | top:30px; 24 | right:50px; 25 | bottom:20px; 26 | left:50px; 27 | background-color: #F1F2F2; 28 | border: 1px solid #BCBEC0; 29 | border-radius: 4px; 30 | } 31 | 32 | .page { 33 | float: left; 34 | -webkit-transform:translate3d(0,0,0); 35 | height: 100%; 36 | padding: 20px; 37 | } 38 | 39 | #pageWrapper { 40 | position:absolute; 41 | z-index:1; 42 | overflow:hidden; 43 | top:20px; 44 | right:20px; 45 | bottom:20px; 46 | left:20px; 47 | } 48 | 49 | #wrapper { 50 | position:absolute; 51 | z-index:1; 52 | top:0px; 53 | bottom:0px; 54 | left:0px; 55 | right:0px; 56 | overflow:auto; 57 | } 58 | 59 | .scroller { 60 | position:absolute; z-index:1; 61 | -webkit-tap-highlight-color:rgba(0,0,0,0); 62 | width:100%; 63 | padding:0; 64 | } -------------------------------------------------------------------------------- /page-swipe/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 | 14 |
15 |

Page 1

16 |
17 |
18 |
19 |
20 |

Subtitle

21 |
22 |
23 |
24 |
25 |
26 |

Subtitle

27 |
28 |
29 | 30 |
31 |

Page 2

32 |
33 | 34 |
35 | 36 |
37 |
38 |
39 |

Page 3

40 |
41 |

Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo.

42 |

Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit amet, consectetur, adipisci[ng] velit, sed quia non numquam [do] eius modi tempora inci[di]dunt, ut labore et dolore magnam aliquam quaerat voluptatem.

43 |

Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?

44 |

Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur?

45 |

At vero eos et accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati cupiditate non provident, similique sunt in culpa, qui officia deserunt mollitia animi, id est laborum et dolorum fuga.

46 |

Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio, cumque nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas assumenda est, omnis dolor repellendus.

47 |

Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat...

48 |
49 |

More Lorem Ipsum

50 |
51 |

Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo.

52 |

Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit amet, consectetur, adipisci[ng] velit, sed quia non numquam [do] eius modi tempora inci[di]dunt, ut labore et dolore magnam aliquam quaerat voluptatem.

53 |

Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?

54 |

Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur?

55 |

At vero eos et accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati cupiditate non provident, similique sunt in culpa, qui officia deserunt mollitia animi, id est laborum et dolorum fuga.

56 |

Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio, cumque nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas assumenda est, omnis dolor repellendus.

57 |

Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat...

58 |
59 |

Even More Lorem Ipsum

60 |
61 |

Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo.

62 |

Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit amet, consectetur, adipisci[ng] velit, sed quia non numquam [do] eius modi tempora inci[di]dunt, ut labore et dolore magnam aliquam quaerat voluptatem.

63 |

Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?

64 |

Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur?

65 |

At vero eos et accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati cupiditate non provident, similique sunt in culpa, qui officia deserunt mollitia animi, id est laborum et dolorum fuga.

66 |

Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio, cumque nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas assumenda est, omnis dolor repellendus.

67 |

Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet, ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat...

68 |
69 |
70 |
71 | 72 |
73 |

Page 4

74 |
75 |
76 | 77 |
78 |
79 | 80 |
81 |
82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /page-swipe/iscroll.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * iScroll v4.1.9 ~ Copyright (c) 2011 Matteo Spinelli, http://cubiq.org 3 | * Released under MIT license, http://cubiq.org/license 4 | */ 5 | (function(){ 6 | var m = Math, 7 | mround = function (r) { return r >> 0; }, 8 | vendor = (/webkit/i).test(navigator.appVersion) ? 'webkit' : 9 | (/firefox/i).test(navigator.userAgent) ? 'Moz' : 10 | (/trident/i).test(navigator.userAgent) ? 'ms' : 11 | 'opera' in window ? 'O' : '', 12 | 13 | // Browser capabilities 14 | isAndroid = (/android/gi).test(navigator.appVersion), 15 | isIDevice = (/iphone|ipad/gi).test(navigator.appVersion), 16 | isPlaybook = (/playbook/gi).test(navigator.appVersion), 17 | isTouchPad = (/hp-tablet/gi).test(navigator.appVersion), 18 | 19 | has3d = 'WebKitCSSMatrix' in window && 'm11' in new WebKitCSSMatrix(), 20 | hasTouch = 'ontouchstart' in window && !isTouchPad, 21 | hasTransform = vendor + 'Transform' in document.documentElement.style, 22 | hasTransitionEnd = isIDevice || isPlaybook, 23 | 24 | nextFrame = (function() { 25 | return window.requestAnimationFrame 26 | || window.webkitRequestAnimationFrame 27 | || window.mozRequestAnimationFrame 28 | || window.oRequestAnimationFrame 29 | || window.msRequestAnimationFrame 30 | || function(callback) { return setTimeout(callback, 1); }; 31 | })(), 32 | cancelFrame = (function () { 33 | return window.cancelRequestAnimationFrame 34 | || window.webkitCancelAnimationFrame 35 | || window.webkitCancelRequestAnimationFrame 36 | || window.mozCancelRequestAnimationFrame 37 | || window.oCancelRequestAnimationFrame 38 | || window.msCancelRequestAnimationFrame 39 | || clearTimeout; 40 | })(), 41 | 42 | // Events 43 | RESIZE_EV = 'onorientationchange' in window ? 'orientationchange' : 'resize', 44 | START_EV = hasTouch ? 'touchstart' : 'mousedown', 45 | MOVE_EV = hasTouch ? 'touchmove' : 'mousemove', 46 | END_EV = hasTouch ? 'touchend' : 'mouseup', 47 | CANCEL_EV = hasTouch ? 'touchcancel' : 'mouseup', 48 | WHEEL_EV = vendor == 'Moz' ? 'DOMMouseScroll' : 'mousewheel', 49 | 50 | // Helpers 51 | trnOpen = 'translate' + (has3d ? '3d(' : '('), 52 | trnClose = has3d ? ',0)' : ')', 53 | 54 | // Constructor 55 | iScroll = function (el, options) { 56 | var that = this, 57 | doc = document, 58 | i; 59 | 60 | that.wrapper = typeof el == 'object' ? el : doc.getElementById(el); 61 | that.wrapper.style.overflow = 'hidden'; 62 | that.scroller = that.wrapper.children[0]; 63 | 64 | // Default options 65 | that.options = { 66 | hScroll: true, 67 | vScroll: true, 68 | x: 0, 69 | y: 0, 70 | bounce: true, 71 | bounceLock: false, 72 | momentum: true, 73 | lockDirection: true, 74 | useTransform: true, 75 | useTransition: false, 76 | topOffset: 0, 77 | checkDOMChanges: false, // Experimental 78 | 79 | // Scrollbar 80 | hScrollbar: true, 81 | vScrollbar: true, 82 | fixedScrollbar: isAndroid, 83 | hideScrollbar: isIDevice, 84 | fadeScrollbar: isIDevice && has3d, 85 | scrollbarClass: '', 86 | 87 | // Zoom 88 | zoom: false, 89 | zoomMin: 1, 90 | zoomMax: 4, 91 | doubleTapZoom: 2, 92 | wheelAction: 'scroll', 93 | 94 | // Snap 95 | snap: false, 96 | snapThreshold: 1, 97 | 98 | // Events 99 | onRefresh: null, 100 | onBeforeScrollStart: function (e) { e.preventDefault(); }, 101 | onScrollStart: null, 102 | onBeforeScrollMove: null, 103 | onScrollMove: null, 104 | onBeforeScrollEnd: null, 105 | onScrollEnd: null, 106 | onTouchEnd: null, 107 | onDestroy: null, 108 | onZoomStart: null, 109 | onZoom: null, 110 | onZoomEnd: null 111 | }; 112 | 113 | // User defined options 114 | for (i in options) that.options[i] = options[i]; 115 | 116 | // Set starting position 117 | that.x = that.options.x; 118 | that.y = that.options.y; 119 | 120 | // Normalize options 121 | that.options.useTransform = hasTransform ? that.options.useTransform : false; 122 | that.options.hScrollbar = that.options.hScroll && that.options.hScrollbar; 123 | that.options.vScrollbar = that.options.vScroll && that.options.vScrollbar; 124 | that.options.zoom = that.options.useTransform && that.options.zoom; 125 | that.options.useTransition = hasTransitionEnd && that.options.useTransition; 126 | 127 | // Helpers FIX ANDROID BUG! 128 | // translate3d and scale doesn't work together! 129 | // Ignoring 3d ONLY WHEN YOU SET that.options.zoom 130 | if ( that.options.zoom && isAndroid ){ 131 | trnOpen = 'translate('; 132 | trnClose = ')'; 133 | } 134 | 135 | // Set some default styles 136 | that.scroller.style[vendor + 'TransitionProperty'] = that.options.useTransform ? '-' + vendor.toLowerCase() + '-transform' : 'top left'; 137 | that.scroller.style[vendor + 'TransitionDuration'] = '0'; 138 | that.scroller.style[vendor + 'TransformOrigin'] = '0 0'; 139 | if (that.options.useTransition) that.scroller.style[vendor + 'TransitionTimingFunction'] = 'cubic-bezier(0.33,0.66,0.66,1)'; 140 | 141 | if (that.options.useTransform) that.scroller.style[vendor + 'Transform'] = trnOpen + that.x + 'px,' + that.y + 'px' + trnClose; 142 | else that.scroller.style.cssText += ';position:absolute;top:' + that.y + 'px;left:' + that.x + 'px'; 143 | 144 | if (that.options.useTransition) that.options.fixedScrollbar = true; 145 | 146 | that.refresh(); 147 | 148 | that._bind(RESIZE_EV, window); 149 | that._bind(START_EV); 150 | if (!hasTouch) { 151 | that._bind('mouseout', that.wrapper); 152 | if (that.options.wheelAction != 'none') 153 | that._bind(WHEEL_EV); 154 | } 155 | 156 | if (that.options.checkDOMChanges) that.checkDOMTime = setInterval(function () { 157 | that._checkDOMChanges(); 158 | }, 500); 159 | }; 160 | 161 | // Prototype 162 | iScroll.prototype = { 163 | enabled: true, 164 | x: 0, 165 | y: 0, 166 | steps: [], 167 | scale: 1, 168 | currPageX: 0, currPageY: 0, 169 | pagesX: [], pagesY: [], 170 | aniTime: null, 171 | wheelZoomCount: 0, 172 | 173 | handleEvent: function (e) { 174 | var that = this; 175 | switch(e.type) { 176 | case START_EV: 177 | if (!hasTouch && e.button !== 0) return; 178 | that._start(e); 179 | break; 180 | case MOVE_EV: that._move(e); break; 181 | case END_EV: 182 | case CANCEL_EV: that._end(e); break; 183 | case RESIZE_EV: that._resize(); break; 184 | case WHEEL_EV: that._wheel(e); break; 185 | case 'mouseout': that._mouseout(e); break; 186 | case 'webkitTransitionEnd': that._transitionEnd(e); break; 187 | } 188 | }, 189 | 190 | _checkDOMChanges: function () { 191 | if (this.moved || this.zoomed || this.animating || 192 | (this.scrollerW == this.scroller.offsetWidth * this.scale && this.scrollerH == this.scroller.offsetHeight * this.scale)) return; 193 | 194 | this.refresh(); 195 | }, 196 | 197 | _scrollbar: function (dir) { 198 | var that = this, 199 | doc = document, 200 | bar; 201 | 202 | if (!that[dir + 'Scrollbar']) { 203 | if (that[dir + 'ScrollbarWrapper']) { 204 | if (hasTransform) that[dir + 'ScrollbarIndicator'].style[vendor + 'Transform'] = ''; 205 | that[dir + 'ScrollbarWrapper'].parentNode.removeChild(that[dir + 'ScrollbarWrapper']); 206 | that[dir + 'ScrollbarWrapper'] = null; 207 | that[dir + 'ScrollbarIndicator'] = null; 208 | } 209 | 210 | return; 211 | } 212 | 213 | if (!that[dir + 'ScrollbarWrapper']) { 214 | // Create the scrollbar wrapper 215 | bar = doc.createElement('div'); 216 | 217 | if (that.options.scrollbarClass) bar.className = that.options.scrollbarClass + dir.toUpperCase(); 218 | else bar.style.cssText = 'position:absolute;z-index:100;' + (dir == 'h' ? 'height:7px;bottom:1px;left:2px;right:' + (that.vScrollbar ? '7' : '2') + 'px' : 'width:7px;bottom:' + (that.hScrollbar ? '7' : '2') + 'px;top:2px;right:1px'); 219 | 220 | bar.style.cssText += ';pointer-events:none;-' + vendor + '-transition-property:opacity;-' + vendor + '-transition-duration:' + (that.options.fadeScrollbar ? '350ms' : '0') + ';overflow:hidden;opacity:' + (that.options.hideScrollbar ? '0' : '1'); 221 | 222 | that.wrapper.appendChild(bar); 223 | that[dir + 'ScrollbarWrapper'] = bar; 224 | 225 | // Create the scrollbar indicator 226 | bar = doc.createElement('div'); 227 | if (!that.options.scrollbarClass) { 228 | bar.style.cssText = 'position:absolute;z-index:100;background:rgba(0,0,0,0.5);border:1px solid rgba(255,255,255,0.9);-' + vendor + '-background-clip:padding-box;-' + vendor + '-box-sizing:border-box;' + (dir == 'h' ? 'height:100%' : 'width:100%') + ';-' + vendor + '-border-radius:3px;border-radius:3px'; 229 | } 230 | bar.style.cssText += ';pointer-events:none;-' + vendor + '-transition-property:-' + vendor + '-transform;-' + vendor + '-transition-timing-function:cubic-bezier(0.33,0.66,0.66,1);-' + vendor + '-transition-duration:0;-' + vendor + '-transform:' + trnOpen + '0,0' + trnClose; 231 | if (that.options.useTransition) bar.style.cssText += ';-' + vendor + '-transition-timing-function:cubic-bezier(0.33,0.66,0.66,1)'; 232 | 233 | that[dir + 'ScrollbarWrapper'].appendChild(bar); 234 | that[dir + 'ScrollbarIndicator'] = bar; 235 | } 236 | 237 | if (dir == 'h') { 238 | that.hScrollbarSize = that.hScrollbarWrapper.clientWidth; 239 | that.hScrollbarIndicatorSize = m.max(mround(that.hScrollbarSize * that.hScrollbarSize / that.scrollerW), 8); 240 | that.hScrollbarIndicator.style.width = that.hScrollbarIndicatorSize + 'px'; 241 | that.hScrollbarMaxScroll = that.hScrollbarSize - that.hScrollbarIndicatorSize; 242 | that.hScrollbarProp = that.hScrollbarMaxScroll / that.maxScrollX; 243 | } else { 244 | that.vScrollbarSize = that.vScrollbarWrapper.clientHeight; 245 | that.vScrollbarIndicatorSize = m.max(mround(that.vScrollbarSize * that.vScrollbarSize / that.scrollerH), 8); 246 | that.vScrollbarIndicator.style.height = that.vScrollbarIndicatorSize + 'px'; 247 | that.vScrollbarMaxScroll = that.vScrollbarSize - that.vScrollbarIndicatorSize; 248 | that.vScrollbarProp = that.vScrollbarMaxScroll / that.maxScrollY; 249 | } 250 | 251 | // Reset position 252 | that._scrollbarPos(dir, true); 253 | }, 254 | 255 | _resize: function () { 256 | var that = this; 257 | setTimeout(function () { that.refresh(); }, isAndroid ? 200 : 0); 258 | }, 259 | 260 | _pos: function (x, y) { 261 | if (this.zoomed) return; 262 | 263 | x = this.hScroll ? x : 0; 264 | y = this.vScroll ? y : 0; 265 | 266 | if (this.options.useTransform) { 267 | this.scroller.style[vendor + 'Transform'] = trnOpen + x + 'px,' + y + 'px' + trnClose + ' scale(' + this.scale + ')'; 268 | } else { 269 | x = mround(x); 270 | y = mround(y); 271 | this.scroller.style.left = x + 'px'; 272 | this.scroller.style.top = y + 'px'; 273 | } 274 | 275 | this.x = x; 276 | this.y = y; 277 | 278 | this._scrollbarPos('h'); 279 | this._scrollbarPos('v'); 280 | }, 281 | 282 | _scrollbarPos: function (dir, hidden) { 283 | var that = this, 284 | pos = dir == 'h' ? that.x : that.y, 285 | size; 286 | 287 | if (!that[dir + 'Scrollbar']) return; 288 | 289 | pos = that[dir + 'ScrollbarProp'] * pos; 290 | 291 | if (pos < 0) { 292 | if (!that.options.fixedScrollbar) { 293 | size = that[dir + 'ScrollbarIndicatorSize'] + mround(pos * 3); 294 | if (size < 8) size = 8; 295 | that[dir + 'ScrollbarIndicator'].style[dir == 'h' ? 'width' : 'height'] = size + 'px'; 296 | } 297 | pos = 0; 298 | } else if (pos > that[dir + 'ScrollbarMaxScroll']) { 299 | if (!that.options.fixedScrollbar) { 300 | size = that[dir + 'ScrollbarIndicatorSize'] - mround((pos - that[dir + 'ScrollbarMaxScroll']) * 3); 301 | if (size < 8) size = 8; 302 | that[dir + 'ScrollbarIndicator'].style[dir == 'h' ? 'width' : 'height'] = size + 'px'; 303 | pos = that[dir + 'ScrollbarMaxScroll'] + (that[dir + 'ScrollbarIndicatorSize'] - size); 304 | } else { 305 | pos = that[dir + 'ScrollbarMaxScroll']; 306 | } 307 | } 308 | 309 | that[dir + 'ScrollbarWrapper'].style[vendor + 'TransitionDelay'] = '0'; 310 | that[dir + 'ScrollbarWrapper'].style.opacity = hidden && that.options.hideScrollbar ? '0' : '1'; 311 | that[dir + 'ScrollbarIndicator'].style[vendor + 'Transform'] = trnOpen + (dir == 'h' ? pos + 'px,0' : '0,' + pos + 'px') + trnClose; 312 | }, 313 | 314 | _start: function (e) { 315 | var that = this, 316 | point = hasTouch ? e.touches[0] : e, 317 | matrix, x, y, 318 | c1, c2; 319 | 320 | if (!that.enabled) return; 321 | 322 | if (that.options.onBeforeScrollStart) that.options.onBeforeScrollStart.call(that, e); 323 | 324 | if (that.options.useTransition || that.options.zoom) that._transitionTime(0); 325 | 326 | that.moved = false; 327 | that.animating = false; 328 | that.zoomed = false; 329 | that.distX = 0; 330 | that.distY = 0; 331 | that.absDistX = 0; 332 | that.absDistY = 0; 333 | that.dirX = 0; 334 | that.dirY = 0; 335 | 336 | // Gesture start 337 | if (that.options.zoom && hasTouch && e.touches.length > 1) { 338 | c1 = m.abs(e.touches[0].pageX-e.touches[1].pageX); 339 | c2 = m.abs(e.touches[0].pageY-e.touches[1].pageY); 340 | that.touchesDistStart = m.sqrt(c1 * c1 + c2 * c2); 341 | 342 | that.originX = m.abs(e.touches[0].pageX + e.touches[1].pageX - that.wrapperOffsetLeft * 2) / 2 - that.x; 343 | that.originY = m.abs(e.touches[0].pageY + e.touches[1].pageY - that.wrapperOffsetTop * 2) / 2 - that.y; 344 | 345 | if (that.options.onZoomStart) that.options.onZoomStart.call(that, e); 346 | } 347 | 348 | if (that.options.momentum) { 349 | if (that.options.useTransform) { 350 | // Very lame general purpose alternative to CSSMatrix 351 | matrix = getComputedStyle(that.scroller, null)[vendor + 'Transform'].replace(/[^0-9-.,]/g, '').split(','); 352 | x = matrix[4] * 1; 353 | y = matrix[5] * 1; 354 | } else { 355 | x = getComputedStyle(that.scroller, null).left.replace(/[^0-9-]/g, '') * 1; 356 | y = getComputedStyle(that.scroller, null).top.replace(/[^0-9-]/g, '') * 1; 357 | } 358 | 359 | if (x != that.x || y != that.y) { 360 | if (that.options.useTransition) that._unbind('webkitTransitionEnd'); 361 | else cancelFrame(that.aniTime); 362 | that.steps = []; 363 | that._pos(x, y); 364 | } 365 | } 366 | 367 | that.absStartX = that.x; // Needed by snap threshold 368 | that.absStartY = that.y; 369 | 370 | that.startX = that.x; 371 | that.startY = that.y; 372 | that.pointX = point.pageX; 373 | that.pointY = point.pageY; 374 | 375 | that.startTime = e.timeStamp || Date.now(); 376 | 377 | if (that.options.onScrollStart) that.options.onScrollStart.call(that, e); 378 | 379 | that._bind(MOVE_EV); 380 | that._bind(END_EV); 381 | that._bind(CANCEL_EV); 382 | }, 383 | 384 | _move: function (e) { 385 | var that = this, 386 | point = hasTouch ? e.touches[0] : e, 387 | deltaX = point.pageX - that.pointX, 388 | deltaY = point.pageY - that.pointY, 389 | newX = that.x + deltaX, 390 | newY = that.y + deltaY, 391 | c1, c2, scale, 392 | timestamp = e.timeStamp || Date.now(); 393 | 394 | if (that.options.onBeforeScrollMove) that.options.onBeforeScrollMove.call(that, e); 395 | 396 | // Zoom 397 | if (that.options.zoom && hasTouch && e.touches.length > 1) { 398 | c1 = m.abs(e.touches[0].pageX - e.touches[1].pageX); 399 | c2 = m.abs(e.touches[0].pageY - e.touches[1].pageY); 400 | that.touchesDist = m.sqrt(c1*c1+c2*c2); 401 | 402 | that.zoomed = true; 403 | 404 | scale = 1 / that.touchesDistStart * that.touchesDist * this.scale; 405 | 406 | if (scale < that.options.zoomMin) scale = 0.5 * that.options.zoomMin * Math.pow(2.0, scale / that.options.zoomMin); 407 | else if (scale > that.options.zoomMax) scale = 2.0 * that.options.zoomMax * Math.pow(0.5, that.options.zoomMax / scale); 408 | 409 | that.lastScale = scale / this.scale; 410 | 411 | newX = this.originX - this.originX * that.lastScale + this.x, 412 | newY = this.originY - this.originY * that.lastScale + this.y; 413 | 414 | this.scroller.style[vendor + 'Transform'] = trnOpen + newX + 'px,' + newY + 'px' + trnClose + ' scale(' + scale + ')'; 415 | 416 | if (that.options.onZoom) that.options.onZoom.call(that, e); 417 | return; 418 | } 419 | 420 | that.pointX = point.pageX; 421 | that.pointY = point.pageY; 422 | 423 | // Slow down if outside of the boundaries 424 | if (newX > 0 || newX < that.maxScrollX) { 425 | newX = that.options.bounce ? that.x + (deltaX / 2) : newX >= 0 || that.maxScrollX >= 0 ? 0 : that.maxScrollX; 426 | } 427 | if (newY > that.minScrollY || newY < that.maxScrollY) { 428 | newY = that.options.bounce ? that.y + (deltaY / 2) : newY >= that.minScrollY || that.maxScrollY >= 0 ? that.minScrollY : that.maxScrollY; 429 | } 430 | 431 | that.distX += deltaX; 432 | that.distY += deltaY; 433 | that.absDistX = m.abs(that.distX); 434 | that.absDistY = m.abs(that.distY); 435 | 436 | if (that.absDistX < 6 && that.absDistY < 6) { 437 | return; 438 | } 439 | 440 | // Lock direction 441 | if (that.options.lockDirection) { 442 | if (that.absDistX > that.absDistY + 5) { 443 | newY = that.y; 444 | deltaY = 0; 445 | } else if (that.absDistY > that.absDistX + 5) { 446 | newX = that.x; 447 | deltaX = 0; 448 | } 449 | } 450 | 451 | that.moved = true; 452 | that._pos(newX, newY); 453 | that.dirX = deltaX > 0 ? -1 : deltaX < 0 ? 1 : 0; 454 | that.dirY = deltaY > 0 ? -1 : deltaY < 0 ? 1 : 0; 455 | 456 | if (timestamp - that.startTime > 300) { 457 | that.startTime = timestamp; 458 | that.startX = that.x; 459 | that.startY = that.y; 460 | } 461 | 462 | if (that.options.onScrollMove) that.options.onScrollMove.call(that, e); 463 | }, 464 | 465 | _end: function (e) { 466 | if (hasTouch && e.touches.length != 0) return; 467 | 468 | var that = this, 469 | point = hasTouch ? e.changedTouches[0] : e, 470 | target, ev, 471 | momentumX = { dist:0, time:0 }, 472 | momentumY = { dist:0, time:0 }, 473 | duration = (e.timeStamp || Date.now()) - that.startTime, 474 | newPosX = that.x, 475 | newPosY = that.y, 476 | distX, distY, 477 | newDuration, 478 | snap, 479 | scale; 480 | 481 | that._unbind(MOVE_EV); 482 | that._unbind(END_EV); 483 | that._unbind(CANCEL_EV); 484 | 485 | if (that.options.onBeforeScrollEnd) that.options.onBeforeScrollEnd.call(that, e); 486 | 487 | if (that.zoomed) { 488 | scale = that.scale * that.lastScale; 489 | scale = Math.max(that.options.zoomMin, scale); 490 | scale = Math.min(that.options.zoomMax, scale); 491 | that.lastScale = scale / that.scale; 492 | that.scale = scale; 493 | 494 | that.x = that.originX - that.originX * that.lastScale + that.x; 495 | that.y = that.originY - that.originY * that.lastScale + that.y; 496 | 497 | that.scroller.style[vendor + 'TransitionDuration'] = '200ms'; 498 | that.scroller.style[vendor + 'Transform'] = trnOpen + that.x + 'px,' + that.y + 'px' + trnClose + ' scale(' + that.scale + ')'; 499 | 500 | that.zoomed = false; 501 | that.refresh(); 502 | 503 | if (that.options.onZoomEnd) that.options.onZoomEnd.call(that, e); 504 | return; 505 | } 506 | 507 | if (!that.moved) { 508 | if (hasTouch) { 509 | if (that.doubleTapTimer && that.options.zoom) { 510 | // Double tapped 511 | clearTimeout(that.doubleTapTimer); 512 | that.doubleTapTimer = null; 513 | if (that.options.onZoomStart) that.options.onZoomStart.call(that, e); 514 | that.zoom(that.pointX, that.pointY, that.scale == 1 ? that.options.doubleTapZoom : 1); 515 | if (that.options.onZoomEnd) { 516 | setTimeout(function() { 517 | that.options.onZoomEnd.call(that, e); 518 | }, 200); // 200 is default zoom duration 519 | } 520 | } else { 521 | that.doubleTapTimer = setTimeout(function () { 522 | that.doubleTapTimer = null; 523 | 524 | // Find the last touched element 525 | target = point.target; 526 | while (target.nodeType != 1) target = target.parentNode; 527 | 528 | if (target.tagName != 'SELECT' && target.tagName != 'INPUT' && target.tagName != 'TEXTAREA') { 529 | ev = document.createEvent('MouseEvents'); 530 | ev.initMouseEvent('click', true, true, e.view, 1, 531 | point.screenX, point.screenY, point.clientX, point.clientY, 532 | e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, 533 | 0, null); 534 | ev._fake = true; 535 | target.dispatchEvent(ev); 536 | } 537 | }, that.options.zoom ? 250 : 0); 538 | } 539 | } 540 | 541 | that._resetPos(200); 542 | 543 | if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e); 544 | return; 545 | } 546 | 547 | if (duration < 300 && that.options.momentum) { 548 | momentumX = newPosX ? that._momentum(newPosX - that.startX, duration, -that.x, that.scrollerW - that.wrapperW + that.x, that.options.bounce ? that.wrapperW : 0) : momentumX; 549 | momentumY = newPosY ? that._momentum(newPosY - that.startY, duration, -that.y, (that.maxScrollY < 0 ? that.scrollerH - that.wrapperH + that.y - that.minScrollY : 0), that.options.bounce ? that.wrapperH : 0) : momentumY; 550 | 551 | newPosX = that.x + momentumX.dist; 552 | newPosY = that.y + momentumY.dist; 553 | 554 | if ((that.x > 0 && newPosX > 0) || (that.x < that.maxScrollX && newPosX < that.maxScrollX)) momentumX = { dist:0, time:0 }; 555 | if ((that.y > that.minScrollY && newPosY > that.minScrollY) || (that.y < that.maxScrollY && newPosY < that.maxScrollY)) momentumY = { dist:0, time:0 }; 556 | } 557 | 558 | if (momentumX.dist || momentumY.dist) { 559 | newDuration = m.max(m.max(momentumX.time, momentumY.time), 10); 560 | 561 | // Do we need to snap? 562 | if (that.options.snap) { 563 | distX = newPosX - that.absStartX; 564 | distY = newPosY - that.absStartY; 565 | if (m.abs(distX) < that.options.snapThreshold && m.abs(distY) < that.options.snapThreshold) { that.scrollTo(that.absStartX, that.absStartY, 200); } 566 | else { 567 | snap = that._snap(newPosX, newPosY); 568 | newPosX = snap.x; 569 | newPosY = snap.y; 570 | newDuration = m.max(snap.time, newDuration); 571 | } 572 | } 573 | 574 | that.scrollTo(mround(newPosX), mround(newPosY), newDuration); 575 | 576 | if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e); 577 | return; 578 | } 579 | 580 | // Do we need to snap? 581 | if (that.options.snap) { 582 | distX = newPosX - that.absStartX; 583 | distY = newPosY - that.absStartY; 584 | if (m.abs(distX) < that.options.snapThreshold && m.abs(distY) < that.options.snapThreshold) that.scrollTo(that.absStartX, that.absStartY, 200); 585 | else { 586 | snap = that._snap(that.x, that.y); 587 | if (snap.x != that.x || snap.y != that.y) that.scrollTo(snap.x, snap.y, snap.time); 588 | } 589 | 590 | if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e); 591 | return; 592 | } 593 | 594 | that._resetPos(200); 595 | if (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e); 596 | }, 597 | 598 | _resetPos: function (time) { 599 | var that = this, 600 | resetX = that.x >= 0 ? 0 : that.x < that.maxScrollX ? that.maxScrollX : that.x, 601 | resetY = that.y >= that.minScrollY || that.maxScrollY > 0 ? that.minScrollY : that.y < that.maxScrollY ? that.maxScrollY : that.y; 602 | 603 | if (resetX == that.x && resetY == that.y) { 604 | if (that.moved) { 605 | that.moved = false; 606 | if (that.options.onScrollEnd) that.options.onScrollEnd.call(that); // Execute custom code on scroll end 607 | } 608 | 609 | if (that.hScrollbar && that.options.hideScrollbar) { 610 | if (vendor == 'webkit') that.hScrollbarWrapper.style[vendor + 'TransitionDelay'] = '300ms'; 611 | that.hScrollbarWrapper.style.opacity = '0'; 612 | } 613 | if (that.vScrollbar && that.options.hideScrollbar) { 614 | if (vendor == 'webkit') that.vScrollbarWrapper.style[vendor + 'TransitionDelay'] = '300ms'; 615 | that.vScrollbarWrapper.style.opacity = '0'; 616 | } 617 | 618 | return; 619 | } 620 | 621 | that.scrollTo(resetX, resetY, time || 0); 622 | }, 623 | 624 | _wheel: function (e) { 625 | var that = this, 626 | wheelDeltaX, wheelDeltaY, 627 | deltaX, deltaY, 628 | deltaScale; 629 | 630 | if ('wheelDeltaX' in e) { 631 | wheelDeltaX = e.wheelDeltaX / 12; 632 | wheelDeltaY = e.wheelDeltaY / 12; 633 | } else if('wheelDelta' in e) { 634 | wheelDeltaX = wheelDeltaY = e.wheelDelta / 12; 635 | } else if ('detail' in e) { 636 | wheelDeltaX = wheelDeltaY = -e.detail * 3; 637 | } else { 638 | return; 639 | } 640 | 641 | if (that.options.wheelAction == 'zoom') { 642 | deltaScale = that.scale * Math.pow(2, 1/3 * (wheelDeltaY ? wheelDeltaY / Math.abs(wheelDeltaY) : 0)); 643 | if (deltaScale < that.options.zoomMin) deltaScale = that.options.zoomMin; 644 | if (deltaScale > that.options.zoomMax) deltaScale = that.options.zoomMax; 645 | 646 | if (deltaScale != that.scale) { 647 | if (!that.wheelZoomCount && that.options.onZoomStart) that.options.onZoomStart.call(that, e); 648 | that.wheelZoomCount++; 649 | 650 | that.zoom(e.pageX, e.pageY, deltaScale, 400); 651 | 652 | setTimeout(function() { 653 | that.wheelZoomCount--; 654 | if (!that.wheelZoomCount && that.options.onZoomEnd) that.options.onZoomEnd.call(that, e); 655 | }, 400); 656 | } 657 | 658 | return; 659 | } 660 | 661 | deltaX = that.x + wheelDeltaX; 662 | deltaY = that.y + wheelDeltaY; 663 | 664 | if (deltaX > 0) deltaX = 0; 665 | else if (deltaX < that.maxScrollX) deltaX = that.maxScrollX; 666 | 667 | if (deltaY > that.minScrollY) deltaY = that.minScrollY; 668 | else if (deltaY < that.maxScrollY) deltaY = that.maxScrollY; 669 | 670 | if(that.maxScrollY < 0){ 671 | that.scrollTo(deltaX, deltaY, 0); 672 | } 673 | }, 674 | 675 | _mouseout: function (e) { 676 | var t = e.relatedTarget; 677 | 678 | if (!t) { 679 | this._end(e); 680 | return; 681 | } 682 | 683 | while (t = t.parentNode) if (t == this.wrapper) return; 684 | 685 | this._end(e); 686 | }, 687 | 688 | _transitionEnd: function (e) { 689 | var that = this; 690 | 691 | if (e.target != that.scroller) return; 692 | 693 | that._unbind('webkitTransitionEnd'); 694 | 695 | that._startAni(); 696 | }, 697 | 698 | 699 | /** 700 | * 701 | * Utilities 702 | * 703 | */ 704 | _startAni: function () { 705 | var that = this, 706 | startX = that.x, startY = that.y, 707 | startTime = Date.now(), 708 | step, easeOut, 709 | animate; 710 | 711 | if (that.animating) return; 712 | 713 | if (!that.steps.length) { 714 | that._resetPos(400); 715 | return; 716 | } 717 | 718 | step = that.steps.shift(); 719 | 720 | if (step.x == startX && step.y == startY) step.time = 0; 721 | 722 | that.animating = true; 723 | that.moved = true; 724 | 725 | if (that.options.useTransition) { 726 | that._transitionTime(step.time); 727 | that._pos(step.x, step.y); 728 | that.animating = false; 729 | if (step.time) that._bind('webkitTransitionEnd'); 730 | else that._resetPos(0); 731 | return; 732 | } 733 | 734 | animate = function () { 735 | var now = Date.now(), 736 | newX, newY; 737 | 738 | if (now >= startTime + step.time) { 739 | that._pos(step.x, step.y); 740 | that.animating = false; 741 | if (that.options.onAnimationEnd) that.options.onAnimationEnd.call(that); // Execute custom code on animation end 742 | that._startAni(); 743 | return; 744 | } 745 | 746 | now = (now - startTime) / step.time - 1; 747 | easeOut = m.sqrt(1 - now * now); 748 | newX = (step.x - startX) * easeOut + startX; 749 | newY = (step.y - startY) * easeOut + startY; 750 | that._pos(newX, newY); 751 | if (that.animating) that.aniTime = nextFrame(animate); 752 | }; 753 | 754 | animate(); 755 | }, 756 | 757 | _transitionTime: function (time) { 758 | time += 'ms'; 759 | this.scroller.style[vendor + 'TransitionDuration'] = time; 760 | if (this.hScrollbar) this.hScrollbarIndicator.style[vendor + 'TransitionDuration'] = time; 761 | if (this.vScrollbar) this.vScrollbarIndicator.style[vendor + 'TransitionDuration'] = time; 762 | }, 763 | 764 | _momentum: function (dist, time, maxDistUpper, maxDistLower, size) { 765 | var deceleration = 0.0006, 766 | speed = m.abs(dist) / time, 767 | newDist = (speed * speed) / (2 * deceleration), 768 | newTime = 0, outsideDist = 0; 769 | 770 | // Proportinally reduce speed if we are outside of the boundaries 771 | if (dist > 0 && newDist > maxDistUpper) { 772 | outsideDist = size / (6 / (newDist / speed * deceleration)); 773 | maxDistUpper = maxDistUpper + outsideDist; 774 | speed = speed * maxDistUpper / newDist; 775 | newDist = maxDistUpper; 776 | } else if (dist < 0 && newDist > maxDistLower) { 777 | outsideDist = size / (6 / (newDist / speed * deceleration)); 778 | maxDistLower = maxDistLower + outsideDist; 779 | speed = speed * maxDistLower / newDist; 780 | newDist = maxDistLower; 781 | } 782 | 783 | newDist = newDist * (dist < 0 ? -1 : 1); 784 | newTime = speed / deceleration; 785 | 786 | return { dist: newDist, time: mround(newTime) }; 787 | }, 788 | 789 | _offset: function (el) { 790 | var left = -el.offsetLeft, 791 | top = -el.offsetTop; 792 | 793 | while (el = el.offsetParent) { 794 | left -= el.offsetLeft; 795 | top -= el.offsetTop; 796 | } 797 | 798 | if (el != this.wrapper) { 799 | left *= this.scale; 800 | top *= this.scale; 801 | } 802 | 803 | return { left: left, top: top }; 804 | }, 805 | 806 | _snap: function (x, y) { 807 | var that = this, 808 | i, l, 809 | page, time, 810 | sizeX, sizeY; 811 | 812 | // Check page X 813 | page = that.pagesX.length - 1; 814 | for (i=0, l=that.pagesX.length; i= that.pagesX[i]) { 816 | page = i; 817 | break; 818 | } 819 | } 820 | if (page == that.currPageX && page > 0 && that.dirX < 0) page--; 821 | x = that.pagesX[page]; 822 | sizeX = m.abs(x - that.pagesX[that.currPageX]); 823 | sizeX = sizeX ? m.abs(that.x - x) / sizeX * 500 : 0; 824 | that.currPageX = page; 825 | 826 | // Check page Y 827 | page = that.pagesY.length-1; 828 | for (i=0; i= that.pagesY[i]) { 830 | page = i; 831 | break; 832 | } 833 | } 834 | if (page == that.currPageY && page > 0 && that.dirY < 0) page--; 835 | y = that.pagesY[page]; 836 | sizeY = m.abs(y - that.pagesY[that.currPageY]); 837 | sizeY = sizeY ? m.abs(that.y - y) / sizeY * 500 : 0; 838 | that.currPageY = page; 839 | 840 | // Snap with constant speed (proportional duration) 841 | time = mround(m.max(sizeX, sizeY)) || 200; 842 | 843 | return { x: x, y: y, time: time }; 844 | }, 845 | 846 | _bind: function (type, el, bubble) { 847 | (el || this.scroller).addEventListener(type, this, !!bubble); 848 | }, 849 | 850 | _unbind: function (type, el, bubble) { 851 | (el || this.scroller).removeEventListener(type, this, !!bubble); 852 | }, 853 | 854 | 855 | /** 856 | * 857 | * Public methods 858 | * 859 | */ 860 | destroy: function () { 861 | var that = this; 862 | 863 | that.scroller.style[vendor + 'Transform'] = ''; 864 | 865 | // Remove the scrollbars 866 | that.hScrollbar = false; 867 | that.vScrollbar = false; 868 | that._scrollbar('h'); 869 | that._scrollbar('v'); 870 | 871 | // Remove the event listeners 872 | that._unbind(RESIZE_EV, window); 873 | that._unbind(START_EV); 874 | that._unbind(MOVE_EV); 875 | that._unbind(END_EV); 876 | that._unbind(CANCEL_EV); 877 | 878 | if (!that.options.hasTouch) { 879 | that._unbind('mouseout', that.wrapper); 880 | that._unbind(WHEEL_EV); 881 | } 882 | 883 | if (that.options.useTransition) that._unbind('webkitTransitionEnd'); 884 | 885 | if (that.options.checkDOMChanges) clearInterval(that.checkDOMTime); 886 | 887 | if (that.options.onDestroy) that.options.onDestroy.call(that); 888 | }, 889 | 890 | refresh: function () { 891 | var that = this, 892 | offset, 893 | i, l, 894 | els, 895 | pos = 0, 896 | page = 0; 897 | 898 | if (that.scale < that.options.zoomMin) that.scale = that.options.zoomMin; 899 | that.wrapperW = that.wrapper.clientWidth || 1; 900 | that.wrapperH = that.wrapper.clientHeight || 1; 901 | 902 | that.minScrollY = -that.options.topOffset || 0; 903 | that.scrollerW = mround(that.scroller.offsetWidth * that.scale); 904 | that.scrollerH = mround((that.scroller.offsetHeight + that.minScrollY) * that.scale); 905 | that.maxScrollX = that.wrapperW - that.scrollerW; 906 | that.maxScrollY = that.wrapperH - that.scrollerH + that.minScrollY; 907 | that.dirX = 0; 908 | that.dirY = 0; 909 | 910 | if (that.options.onRefresh) that.options.onRefresh.call(that); 911 | 912 | that.hScroll = that.options.hScroll && that.maxScrollX < 0; 913 | that.vScroll = that.options.vScroll && (!that.options.bounceLock && !that.hScroll || that.scrollerH > that.wrapperH); 914 | 915 | that.hScrollbar = that.hScroll && that.options.hScrollbar; 916 | that.vScrollbar = that.vScroll && that.options.vScrollbar && that.scrollerH > that.wrapperH; 917 | 918 | offset = that._offset(that.wrapper); 919 | that.wrapperOffsetLeft = -offset.left; 920 | that.wrapperOffsetTop = -offset.top; 921 | 922 | // Prepare snap 923 | if (typeof that.options.snap == 'string') { 924 | that.pagesX = []; 925 | that.pagesY = []; 926 | els = that.scroller.querySelectorAll(that.options.snap); 927 | for (i=0, l=els.length; i= that.maxScrollX) { 937 | that.pagesX[page] = pos; 938 | pos = pos - that.wrapperW; 939 | page++; 940 | } 941 | if (that.maxScrollX%that.wrapperW) that.pagesX[that.pagesX.length] = that.maxScrollX - that.pagesX[that.pagesX.length-1] + that.pagesX[that.pagesX.length-1]; 942 | 943 | pos = 0; 944 | page = 0; 945 | that.pagesY = []; 946 | while (pos >= that.maxScrollY) { 947 | that.pagesY[page] = pos; 948 | pos = pos - that.wrapperH; 949 | page++; 950 | } 951 | if (that.maxScrollY%that.wrapperH) that.pagesY[that.pagesY.length] = that.maxScrollY - that.pagesY[that.pagesY.length-1] + that.pagesY[that.pagesY.length-1]; 952 | } 953 | 954 | // Prepare the scrollbars 955 | that._scrollbar('h'); 956 | that._scrollbar('v'); 957 | 958 | if (!that.zoomed) { 959 | that.scroller.style[vendor + 'TransitionDuration'] = '0'; 960 | that._resetPos(200); 961 | } 962 | }, 963 | 964 | scrollTo: function (x, y, time, relative) { 965 | var that = this, 966 | step = x, 967 | i, l; 968 | 969 | that.stop(); 970 | 971 | if (!step.length) step = [{ x: x, y: y, time: time, relative: relative }]; 972 | 973 | for (i=0, l=step.length; i 0 ? 0 : pos.left < that.maxScrollX ? that.maxScrollX : pos.left; 991 | pos.top = pos.top > that.minScrollY ? that.minScrollY : pos.top < that.maxScrollY ? that.maxScrollY : pos.top; 992 | time = time === undefined ? m.max(m.abs(pos.left)*2, m.abs(pos.top)*2) : time; 993 | 994 | that.scrollTo(pos.left, pos.top, time); 995 | }, 996 | 997 | scrollToPage: function (pageX, pageY, time) { 998 | var that = this, x, y; 999 | 1000 | time = time === undefined ? 400 : time; 1001 | 1002 | if (that.options.onScrollStart) that.options.onScrollStart.call(that); 1003 | 1004 | if (that.options.snap) { 1005 | pageX = pageX == 'next' ? that.currPageX+1 : pageX == 'prev' ? that.currPageX-1 : pageX; 1006 | pageY = pageY == 'next' ? that.currPageY+1 : pageY == 'prev' ? that.currPageY-1 : pageY; 1007 | 1008 | pageX = pageX < 0 ? 0 : pageX > that.pagesX.length-1 ? that.pagesX.length-1 : pageX; 1009 | pageY = pageY < 0 ? 0 : pageY > that.pagesY.length-1 ? that.pagesY.length-1 : pageY; 1010 | 1011 | that.currPageX = pageX; 1012 | that.currPageY = pageY; 1013 | x = that.pagesX[pageX]; 1014 | y = that.pagesY[pageY]; 1015 | } else { 1016 | x = -that.wrapperW * pageX; 1017 | y = -that.wrapperH * pageY; 1018 | if (x < that.maxScrollX) x = that.maxScrollX; 1019 | if (y < that.maxScrollY) y = that.maxScrollY; 1020 | } 1021 | 1022 | that.scrollTo(x, y, time); 1023 | }, 1024 | 1025 | disable: function () { 1026 | this.stop(); 1027 | this._resetPos(0); 1028 | this.enabled = false; 1029 | 1030 | // If disabled after touchstart we make sure that there are no left over events 1031 | this._unbind(MOVE_EV); 1032 | this._unbind(END_EV); 1033 | this._unbind(CANCEL_EV); 1034 | }, 1035 | 1036 | enable: function () { 1037 | this.enabled = true; 1038 | }, 1039 | 1040 | stop: function () { 1041 | if (this.options.useTransition) this._unbind('webkitTransitionEnd'); 1042 | else cancelFrame(this.aniTime); 1043 | this.steps = []; 1044 | this.moved = false; 1045 | this.animating = false; 1046 | }, 1047 | 1048 | zoom: function (x, y, scale, time) { 1049 | var that = this, 1050 | relScale = scale / that.scale; 1051 | 1052 | if (!that.options.useTransform) return; 1053 | 1054 | that.zoomed = true; 1055 | time = time === undefined ? 200 : time; 1056 | x = x - that.wrapperOffsetLeft - that.x; 1057 | y = y - that.wrapperOffsetTop - that.y; 1058 | that.x = x - x * relScale + that.x; 1059 | that.y = y - y * relScale + that.y; 1060 | 1061 | that.scale = scale; 1062 | that.refresh(); 1063 | 1064 | that.x = that.x > 0 ? 0 : that.x < that.maxScrollX ? that.maxScrollX : that.x; 1065 | that.y = that.y > that.minScrollY ? that.minScrollY : that.y < that.maxScrollY ? that.maxScrollY : that.y; 1066 | 1067 | that.scroller.style[vendor + 'TransitionDuration'] = time + 'ms'; 1068 | that.scroller.style[vendor + 'Transform'] = trnOpen + that.x + 'px,' + that.y + 'px' + trnClose + ' scale(' + scale + ')'; 1069 | that.zoomed = false; 1070 | }, 1071 | 1072 | isReady: function () { 1073 | return !this.moved && !this.zoomed && !this.animating; 1074 | } 1075 | }; 1076 | 1077 | if (typeof exports !== 'undefined') exports.iScroll = iScroll; 1078 | else window.iScroll = iScroll; 1079 | 1080 | })(); 1081 | -------------------------------------------------------------------------------- /page-swipe/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/mobile-ui-patterns/d25a8efd013927983bc20acce735f3cc26a74925/page-swipe/left.png -------------------------------------------------------------------------------- /page-swipe/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/mobile-ui-patterns/d25a8efd013927983bc20acce735f3cc26a74925/page-swipe/logo.png -------------------------------------------------------------------------------- /page-swipe/picture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/mobile-ui-patterns/d25a8efd013927983bc20acce735f3cc26a74925/page-swipe/picture.jpg -------------------------------------------------------------------------------- /page-swipe/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccoenraets/mobile-ui-patterns/d25a8efd013927983bc20acce735f3cc26a74925/page-swipe/right.png -------------------------------------------------------------------------------- /page-swipe/styles.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: helvetica neue; 3 | background-color: #E7EAEC; 4 | } 5 | 6 | .page h1, 7 | .page h2 8 | { 9 | color: #BCBEC0; 10 | font-weight: normal; 11 | margin-top: 0px; 12 | } 13 | 14 | .page hr { 15 | height: 2px; 16 | background-color: #E6E7E8; 17 | border: none; 18 | border-bottom: solid 1px #FFFFFF; 19 | } 20 | 21 | .frame { 22 | position:absolute; 23 | top:30px; 24 | right:50px; 25 | bottom:20px; 26 | left:50px; 27 | background-color: #F1F2F2; 28 | border: 1px solid #BCBEC0; 29 | border-radius: 4px; 30 | } 31 | 32 | .page-container { 33 | position:absolute; 34 | top:20px; 35 | right:20px; 36 | bottom:20px; 37 | left:20px; 38 | overflow: hidden; 39 | -webkit-transform:translate3d(0,0,0); 40 | } 41 | 42 | .page { 43 | position: absolute; 44 | width: 100%; 45 | height: 100%; 46 | } 47 | 48 | .stage-center { 49 | top: 0; 50 | left: 0; 51 | z-index: 1; 52 | } 53 | 54 | .stage-left { 55 | left: -100%; 56 | z-index: 0; 57 | } 58 | 59 | .stage-right { 60 | left: 100%; 61 | z-index: 0; 62 | } 63 | 64 | .transition { 65 | -moz-transition-duration: .250s; 66 | -webkit-transition-duration: .250s; 67 | -o-transition-duration: .250s; 68 | } 69 | 70 | #wrapper { 71 | position:absolute; 72 | z-index:1; 73 | top:0px; 74 | bottom:0px; 75 | left:0px; 76 | right:0px; 77 | overflow:auto; 78 | } 79 | 80 | .scroller { 81 | position:absolute; z-index:1; 82 | -webkit-tap-highlight-color:rgba(0,0,0,0); 83 | width:100%; 84 | padding:0; 85 | } -------------------------------------------------------------------------------- /page-swipe/swipe.js: -------------------------------------------------------------------------------- 1 | currentIndex = 0; 2 | pages = [$('#page1'), $('#page2'), $('#page3'), $('#page4')]; 3 | 4 | function scrollRight() { 5 | 6 | if (currentIndex === 0) return; 7 | pages[currentIndex].removeClass('stage-center'); 8 | pages[currentIndex].addClass('stage-right'); 9 | 10 | pages[currentIndex - 1].removeClass('stage-left'); 11 | pages[currentIndex - 1].addClass('stage-center'); 12 | 13 | currentIndex = currentIndex - 1; 14 | 15 | } 16 | 17 | function scrollLeft() { 18 | 19 | if (currentIndex === pages.length - 1) return; 20 | 21 | pages[currentIndex].removeClass('stage-center'); 22 | pages[currentIndex].addClass('stage-left'); 23 | 24 | pages[currentIndex + 1].removeClass('stage-right'); 25 | pages[currentIndex + 1].addClass('stage-center'); 26 | 27 | currentIndex = currentIndex + 1; 28 | 29 | } 30 | 31 | $('#container').swipeLeft(scrollLeft); 32 | $('#container').swipeRight(scrollRight); 33 | 34 | iscroll = new iScroll('wrapper', {hScrollbar: false, vScrollbar: false }); -------------------------------------------------------------------------------- /page-swipe/zepto.min.js: -------------------------------------------------------------------------------- 1 | /* Zepto v1.0rc1 - polyfill zepto event detect fx ajax form touch - zeptojs.com/license */ 2 | (function(a){String.prototype.trim===a&&(String.prototype.trim=function(){return this.replace(/^\s+/,"").replace(/\s+$/,"")}),Array.prototype.reduce===a&&(Array.prototype.reduce=function(b){if(this===void 0||this===null)throw new TypeError;var c=Object(this),d=c.length>>>0,e=0,f;if(typeof b!="function")throw new TypeError;if(d==0&&arguments.length==1)throw new TypeError;if(arguments.length>=2)f=arguments[1];else do{if(e in c){f=c[e++];break}if(++e>=d)throw new TypeError}while(!0);while(e0?[].concat.apply([],a):a}function H(a){return a.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function I(a){return a in i?i[a]:i[a]=new RegExp("(^|\\s)"+a+"(\\s|$)")}function J(a,b){return typeof b=="number"&&!k[H(a)]?b+"px":b}function K(a){var b,c;return h[a]||(b=g.createElement(a),g.body.appendChild(b),c=j(b,"").getPropertyValue("display"),b.parentNode.removeChild(b),c=="none"&&(c="block"),h[a]=c),h[a]}function L(b,d){return d===a?c(b):c(b).filter(d)}function M(a,b,c,d){return A(b)?b.call(a,c,d):b}function N(a,b,d){var e=a%2?b:b.parentNode;e?e.insertBefore(d,a?a==1?e.firstChild:a==2?b:null:b.nextSibling):c(d).remove()}function O(a,b){b(a);for(var c in a.childNodes)O(a.childNodes[c],b)}var a,b,c,d,e=[],f=e.slice,g=window.document,h={},i={},j=g.defaultView.getComputedStyle,k={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},l=/^\s*<(\w+|!)[^>]*>/,m=[1,3,8,9,11],n=["after","prepend","before","append"],o=g.createElement("table"),p=g.createElement("tr"),q={tr:g.createElement("tbody"),tbody:o,thead:o,tfoot:o,td:p,th:p,"*":g.createElement("div")},r=/complete|loaded|interactive/,s=/^\.([\w-]+)$/,t=/^#([\w-]+)$/,u=/^[\w-]+$/,v={}.toString,w={},x,y,z=g.createElement("div");return w.matches=function(a,b){if(!a||a.nodeType!==1)return!1;var c=a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.matchesSelector;if(c)return c.call(a,b);var d,e=a.parentNode,f=!e;return f&&(e=z).appendChild(a),d=~w.qsa(e,b).indexOf(a),f&&z.removeChild(a),d},x=function(a){return a.replace(/-+(.)?/g,function(a,b){return b?b.toUpperCase():""})},y=function(a){return a.filter(function(b,c){return a.indexOf(b)==c})},w.fragment=function(b,d){d===a&&(d=l.test(b)&&RegExp.$1),d in q||(d="*");var e=q[d];return e.innerHTML=""+b,c.each(f.call(e.childNodes),function(){e.removeChild(this)})},w.Z=function(a,b){return a=a||[],a.__proto__=arguments.callee.prototype,a.selector=b||"",a},w.isZ=function(a){return a instanceof w.Z},w.init=function(b,d){if(!b)return w.Z();if(A(b))return c(g).ready(b);if(w.isZ(b))return b;var e;if(D(b))e=F(b);else if(C(b))e=[c.extend({},b)],b=null;else if(m.indexOf(b.nodeType)>=0||b===window)e=[b],b=null;else if(l.test(b))e=w.fragment(b.trim(),RegExp.$1),b=null;else{if(d!==a)return c(d).find(b);e=w.qsa(g,b)}return w.Z(e,b)},c=function(a,b){return w.init(a,b)},c.extend=function(c){return f.call(arguments,1).forEach(function(d){for(b in d)d[b]!==a&&(c[b]=d[b])}),c},w.qsa=function(a,b){var c;return a===g&&t.test(b)?(c=a.getElementById(RegExp.$1))?[c]:e:a.nodeType!==1&&a.nodeType!==9?e:f.call(s.test(b)?a.getElementsByClassName(RegExp.$1):u.test(b)?a.getElementsByTagName(b):a.querySelectorAll(b))},c.isFunction=A,c.isObject=B,c.isArray=D,c.isPlainObject=C,c.inArray=function(a,b,c){return e.indexOf.call(b,a,c)},c.trim=function(a){return a.trim()},c.uuid=0,c.map=function(a,b){var c,d=[],e,f;if(E(a))for(e=0;e0&&w.matches(this[0],a)},not:function(b){var d=[];if(A(b)&&b.call!==a)this.each(function(a){b.call(this,a)||d.push(this)});else{var e=typeof b=="string"?this.filter(b):E(b)&&A(b.item)?f.call(b):c(b);this.forEach(function(a){e.indexOf(a)<0&&d.push(a)})}return c(d)},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){var a=this[0];return a&&!B(a)?a:c(a)},last:function(){var a=this[this.length-1];return a&&!B(a)?a:c(a)},find:function(a){var b;return this.length==1?b=w.qsa(this[0],a):b=this.map(function(){return w.qsa(this,a)}),c(b)},closest:function(a,b){var d=this[0];while(d&&!w.matches(d,a))d=d!==b&&d!==g&&d.parentNode;return c(d)},parents:function(a){var b=[],d=this;while(d.length>0)d=c.map(d,function(a){if((a=a.parentNode)&&a!==g&&b.indexOf(a)<0)return b.push(a),a});return L(b,a)},parent:function(a){return L(y(this.pluck("parentNode")),a)},children:function(a){return L(this.map(function(){return f.call(this.children)}),a)},siblings:function(a){return L(this.map(function(a,b){return f.call(b.parentNode.children).filter(function(a){return a!==b})}),a)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(a){return this.map(function(){return this[a]})},show:function(){return this.each(function(){this.style.display=="none"&&(this.style.display=null),j(this,"").getPropertyValue("display")=="none"&&(this.style.display=K(this.nodeName))})},replaceWith:function(a){return this.before(a).remove()},wrap:function(a){return this.each(function(){c(this).wrapAll(c(a)[0].cloneNode(!1))})},wrapAll:function(a){return this[0]&&(c(this[0]).before(a=c(a)),a.append(this)),this},unwrap:function(){return this.parent().each(function(){c(this).replaceWith(c(this).children())}),this},clone:function(){return c(this.map(function(){return this.cloneNode(!0)}))},hide:function(){return this.css("display","none")},toggle:function(b){return(b===a?this.css("display")=="none":b)?this.show():this.hide()},prev:function(){return c(this.pluck("previousElementSibling"))},next:function(){return c(this.pluck("nextElementSibling"))},html:function(b){return b===a?this.length>0?this[0].innerHTML:null:this.each(function(a){var d=this.innerHTML;c(this).empty().append(M(this,b,a,d))})},text:function(b){return b===a?this.length>0?this[0].textContent:null:this.each(function(){this.textContent=b})},attr:function(c,d){var e;return typeof c=="string"&&d===a?this.length==0||this[0].nodeType!==1?a:c=="value"&&this[0].nodeName=="INPUT"?this.val():!(e=this[0].getAttribute(c))&&c in this[0]?this[0][c]:e:this.each(function(a){if(this.nodeType!==1)return;if(B(c))for(b in c)this.setAttribute(b,c[b]);else this.setAttribute(c,M(this,d,a,this.getAttribute(c)))})},removeAttr:function(a){return this.each(function(){this.nodeType===1&&this.removeAttribute(a)})},prop:function(b,c){return c===a?this[0]?this[0][b]:a:this.each(function(a){this[b]=M(this,c,a,this[b])})},data:function(b,c){var d=this.attr("data-"+H(b),c);return d!==null?d:a},val:function(b){return b===a?this.length>0?this[0].value:a:this.each(function(a){this.value=M(this,b,a,this.value)})},offset:function(){if(this.length==0)return null;var a=this[0].getBoundingClientRect();return{left:a.left+window.pageXOffset,top:a.top+window.pageYOffset,width:a.width,height:a.height}},css:function(c,d){if(d===a&&typeof c=="string")return this.length==0?a:this[0].style[x(c)]||j(this[0],"").getPropertyValue(c);var e="";for(b in c)typeof c[b]=="string"&&c[b]==""?this.each(function(){this.style.removeProperty(H(b))}):e+=H(b)+":"+J(b,c[b])+";";return typeof c=="string"&&(d==""?this.each(function(){this.style.removeProperty(H(c))}):e=H(c)+":"+J(c,d)),this.each(function(){this.style.cssText+=";"+e})},index:function(a){return a?this.indexOf(c(a)[0]):this.parent().children().indexOf(this[0])},hasClass:function(a){return this.length<1?!1:I(a).test(this[0].className)},addClass:function(a){return this.each(function(b){d=[];var e=this.className,f=M(this,a,b,e);f.split(/\s+/g).forEach(function(a){c(this).hasClass(a)||d.push(a)},this),d.length&&(this.className+=(e?" ":"")+d.join(" "))})},removeClass:function(b){return this.each(function(c){if(b===a)return this.className="";d=this.className,M(this,b,c,d).split(/\s+/g).forEach(function(a){d=d.replace(I(a)," ")}),this.className=d.trim()})},toggleClass:function(b,d){return this.each(function(e){var f=M(this,b,e,this.className);(d===a?!c(this).hasClass(f):d)?c(this).addClass(f):c(this).removeClass(f)})}},["width","height"].forEach(function(b){c.fn[b]=function(d){var e,f=b.replace(/./,function(a){return a[0].toUpperCase()});return d===a?this[0]==window?window["inner"+f]:this[0]==g?g.documentElement["offset"+f]:(e=this.offset())&&e[b]:this.each(function(a){var e=c(this);e.css(b,M(this,d,a,e[b]()))})}}),n.forEach(function(a,b){c.fn[a]=function(){var a=c.map(arguments,function(a){return B(a)?a:w.fragment(a)});if(a.length<1)return this;var d=this.length,e=d>1,f=b<2;return this.each(function(c,g){for(var h=0;h0&&this.bind(o,n),setTimeout(function(){m.css(i),e<=0&&setTimeout(function(){m.each(function(){n.call(this)})},0)},0),this},i=null}(Zepto),function($){function triggerAndReturn(a,b,c){var d=$.Event(b);return $(a).trigger(d,c),!d.defaultPrevented}function triggerGlobal(a,b,c,d){if(a.global)return triggerAndReturn(b||document,c,d)}function ajaxStart(a){a.global&&$.active++===0&&triggerGlobal(a,null,"ajaxStart")}function ajaxStop(a){a.global&&!--$.active&&triggerGlobal(a,null,"ajaxStop")}function ajaxBeforeSend(a,b){var c=b.context;if(b.beforeSend.call(c,a,b)===!1||triggerGlobal(b,c,"ajaxBeforeSend",[a,b])===!1)return!1;triggerGlobal(b,c,"ajaxSend",[a,b])}function ajaxSuccess(a,b,c){var d=c.context,e="success";c.success.call(d,a,e,b),triggerGlobal(c,d,"ajaxSuccess",[b,c,a]),ajaxComplete(e,b,c)}function ajaxError(a,b,c,d){var e=d.context;d.error.call(e,c,b,a),triggerGlobal(d,e,"ajaxError",[c,d,a]),ajaxComplete(b,c,d)}function ajaxComplete(a,b,c){var d=c.context;c.complete.call(d,b,a),triggerGlobal(c,d,"ajaxComplete",[b,c]),ajaxStop(c)}function empty(){}function mimeToDataType(a){return a&&(a==htmlType?"html":a==jsonType?"json":scriptTypeRE.test(a)?"script":xmlTypeRE.test(a)&&"xml")||"text"}function appendQuery(a,b){return(a+"&"+b).replace(/[&?]{1,2}/,"?")}function serializeData(a){isObject(a.data)&&(a.data=$.param(a.data)),a.data&&(!a.type||a.type.toUpperCase()=="GET")&&(a.url=appendQuery(a.url,a.data))}function serialize(a,b,c,d){var e=$.isArray(b);$.each(b,function(b,f){d&&(b=c?d:d+"["+(e?"":b)+"]"),!d&&e?a.add(f.name,f.value):(c?$.isArray(f):isObject(f))?serialize(a,f,c,b):a.add(b,f)})}var jsonpID=0,isObject=$.isObject,document=window.document,key,name,rscript=/)<[^<]*)*<\/script>/gi,scriptTypeRE=/^(?:text|application)\/javascript/i,xmlTypeRE=/^(?:text|application)\/xml/i,jsonType="application/json",htmlType="text/html",blankRE=/^\s*$/;$.active=0,$.ajaxJSONP=function(a){var b="jsonp"+ ++jsonpID,c=document.createElement("script"),d=function(){$(c).remove(),b in window&&(window[b]=empty),ajaxComplete("abort",e,a)},e={abort:d},f;return a.error&&(c.onerror=function(){e.abort(),a.error()}),window[b]=function(d){clearTimeout(f),$(c).remove(),delete window[b],ajaxSuccess(d,e,a)},serializeData(a),c.src=a.url.replace(/=\?/,"="+b),$("head").append(c),a.timeout>0&&(f=setTimeout(function(){e.abort(),ajaxComplete("timeout",e,a)},a.timeout)),e},$.ajaxSettings={type:"GET",beforeSend:empty,success:empty,error:empty,complete:empty,context:null,global:!0,xhr:function(){return new window.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript",json:jsonType,xml:"application/xml, text/xml",html:htmlType,text:"text/plain"},crossDomain:!1,timeout:0},$.ajax=function(options){var settings=$.extend({},options||{});for(key in $.ajaxSettings)settings[key]===undefined&&(settings[key]=$.ajaxSettings[key]);ajaxStart(settings),settings.crossDomain||(settings.crossDomain=/^([\w-]+:)?\/\/([^\/]+)/.test(settings.url)&&RegExp.$2!=window.location.host);var dataType=settings.dataType,hasPlaceholder=/=\?/.test(settings.url);if(dataType=="jsonp"||hasPlaceholder)return hasPlaceholder||(settings.url=appendQuery(settings.url,"callback=?")),$.ajaxJSONP(settings);settings.url||(settings.url=window.location.toString()),serializeData(settings);var mime=settings.accepts[dataType],baseHeaders={},protocol=/^([\w-]+:)\/\//.test(settings.url)?RegExp.$1:window.location.protocol,xhr=$.ajaxSettings.xhr(),abortTimeout;settings.crossDomain||(baseHeaders["X-Requested-With"]="XMLHttpRequest"),mime&&(baseHeaders.Accept=mime,mime.indexOf(",")>-1&&(mime=mime.split(",",2)[0]),xhr.overrideMimeType&&xhr.overrideMimeType(mime));if(settings.contentType||settings.data&&settings.type.toUpperCase()!="GET")baseHeaders["Content-Type"]=settings.contentType||"application/x-www-form-urlencoded";settings.headers=$.extend(baseHeaders,settings.headers||{}),xhr.onreadystatechange=function(){if(xhr.readyState==4){clearTimeout(abortTimeout);var result,error=!1;if(xhr.status>=200&&xhr.status<300||xhr.status==304||xhr.status==0&&protocol=="file:"){dataType=dataType||mimeToDataType(xhr.getResponseHeader("content-type")),result=xhr.responseText;try{dataType=="script"?(1,eval)(result):dataType=="xml"?result=xhr.responseXML:dataType=="json"&&(result=blankRE.test(result)?null:JSON.parse(result))}catch(e){error=e}error?ajaxError(error,"parsererror",xhr,settings):ajaxSuccess(result,xhr,settings)}else ajaxError(null,"error",xhr,settings)}};var async="async"in settings?settings.async:!0;xhr.open(settings.type,settings.url,async);for(name in settings.headers)xhr.setRequestHeader(name,settings.headers[name]);return ajaxBeforeSend(xhr,settings)===!1?(xhr.abort(),!1):(settings.timeout>0&&(abortTimeout=setTimeout(function(){xhr.onreadystatechange=empty,xhr.abort(),ajaxError(null,"timeout",xhr,settings)},settings.timeout)),xhr.send(settings.data?settings.data:null),xhr)},$.get=function(a,b){return $.ajax({url:a,success:b})},$.post=function(a,b,c,d){return $.isFunction(b)&&(d=d||c,c=b,b=null),$.ajax({type:"POST",url:a,data:b,success:c,dataType:d})},$.getJSON=function(a,b){return $.ajax({url:a,success:b,dataType:"json"})},$.fn.load=function(a,b){if(!this.length)return this;var c=this,d=a.split(/\s/),e;return d.length>1&&(a=d[0],e=d[1]),$.get(a,function(a){c.html(e?$(document.createElement("div")).html(a.replace(rscript,"")).find(e).html():a),b&&b.call(c)}),this};var escape=encodeURIComponent;$.param=function(a,b){var c=[];return c.add=function(a,b){this.push(escape(a)+"="+escape(b))},serialize(c,a,b),c.join("&").replace("%20","+")}}(Zepto),function(a){a.fn.serializeArray=function(){var b=[],c;return a(Array.prototype.slice.call(this.get(0).elements)).each(function(){c=a(this);var d=c.attr("type");this.nodeName.toLowerCase()!="fieldset"&&!this.disabled&&d!="submit"&&d!="reset"&&d!="button"&&(d!="radio"&&d!="checkbox"||this.checked)&&b.push({name:c.attr("name"),value:c.val()})}),b},a.fn.serialize=function(){var a=[];return this.serializeArray().forEach(function(b){a.push(encodeURIComponent(b.name)+"="+encodeURIComponent(b.value))}),a.join("&")},a.fn.submit=function(b){if(b)this.bind("submit",b);else if(this.length){var c=a.Event("submit");this.eq(0).trigger(c),c.defaultPrevented||this.get(0).submit()}return this}}(Zepto),function(a){function d(a){return"tagName"in a?a:a.parentNode}function e(a,b,c,d){var e=Math.abs(a-b),f=Math.abs(c-d);return e>=f?a-b>0?"Left":"Right":c-d>0?"Up":"Down"}function h(){g=null,b.last&&(b.el.trigger("longTap"),b={})}function i(){g&&clearTimeout(g),g=null}var b={},c,f=750,g;a(document).ready(function(){var j,k;a(document.body).bind("touchstart",function(e){j=Date.now(),k=j-(b.last||j),b.el=a(d(e.touches[0].target)),c&&clearTimeout(c),b.x1=e.touches[0].pageX,b.y1=e.touches[0].pageY,k>0&&k<=250&&(b.isDoubleTap=!0),b.last=j,g=setTimeout(h,f)}).bind("touchmove",function(a){i(),b.x2=a.touches[0].pageX,b.y2=a.touches[0].pageY}).bind("touchend",function(a){i(),b.isDoubleTap?(b.el.trigger("doubleTap"),b={}):b.x2&&Math.abs(b.x1-b.x2)>30||b.y2&&Math.abs(b.y1-b.y2)>30?(b.el.trigger("swipe")&&b.el.trigger("swipe"+e(b.x1,b.x2,b.y1,b.y2)),b={}):"last"in b&&(b.el.trigger("tap"),c=setTimeout(function(){c=null,b.el.trigger("singleTap"),b={}},250))}).bind("touchcancel",function(){c&&clearTimeout(c),g&&clearTimeout(g),g=c=null,b={}})}),["swipe","swipeLeft","swipeRight","swipeUp","swipeDown","doubleTap","tap","singleTap","longTap"].forEach(function(b){a.fn[b]=function(a){return this.bind(b,a)}})}(Zepto); --------------------------------------------------------------------------------