Вход Регистрация
Файл: public/js/3rd_party/iscroll/iscroll.js
Строк: 1109
<?php
/*!
 * iScroll v4.1.9 ~ Copyright (c) 2011 Matteo Spinelli, http://cubiq.org
 * Released under MIT license, http://cubiq.org/license
 */

(function(){
var 
Math,
    
vendor = (/webkit/i).test(navigator.appVersion) ? 'webkit' :
        (/
firefox/i).test(navigator.userAgent) ? 'Moz' :
        
'opera' in window 'O' '',

    
// Browser capabilities
    
has3d 'WebKitCSSMatrix' in window && 'm11' in new WebKitCSSMatrix(),
    
hasTouch 'ontouchstart' in window,
    
hasTransform vendor 'Transform' in document.documentElement.style,
    
isAndroid = (/android/gi).test(navigator.appVersion),
    
isIDevice = (/iphone|ipad/gi).test(navigator.appVersion),
    
isPlaybook = (/playbook/gi).test(navigator.appVersion),
    
hasTransitionEnd isIDevice || isPlaybook,
    
nextFrame = (function() {
        return 
window.requestAnimationFrame
            
|| window.webkitRequestAnimationFrame
            
|| window.mozRequestAnimationFrame
            
|| window.oRequestAnimationFrame
            
|| window.msRequestAnimationFrame
            
|| function(callback) { return setTimeout(callback1); }
    })(),
    
cancelFrame = (function () {
        return 
window.cancelRequestAnimationFrame
            
|| window.webkitCancelRequestAnimationFrame
            
|| window.mozCancelRequestAnimationFrame
            
|| window.oCancelRequestAnimationFrame
            
|| window.msCancelRequestAnimationFrame
            
|| clearTimeout
    
})(),

    
// Events
    
RESIZE_EV 'onorientationchange' in window 'orientationchange' 'resize',
    
START_EV hasTouch 'touchstart' 'mousedown',
    
MOVE_EV hasTouch 'touchmove' 'mousemove',
    
END_EV hasTouch 'touchend' 'mouseup',
    
CANCEL_EV hasTouch 'touchcancel' 'mouseup',
    
WHEEL_EV vendor == 'Moz' 'DOMMouseScroll' 'mousewheel',

    
// Helpers
    
trnOpen 'translate' + (has3d '3d(' '('),
    
trnClose has3d ',0)' ')',

    
// Constructor
    
iScroll = function (eloptions) {
        var 
that this,
            
doc document,
            
i;

        
that.wrapper typeof el == 'object' el doc.getElementById(el);
        
that.wrapper.style.overflow 'hidden';
        
that.scroller that.wrapper.children[0];

        
// Default options
        
that.options = {
            
hScrolltrue,
            
vScrolltrue,
            
x0,
            
y0,
            
bouncetrue,
            
bounceLockfalse,
            
momentumtrue,
            
lockDirectiontrue,
            
useTransformtrue,
            
useTransitionfalse,
            
topOffset0,
            
checkDOMChangesfalse,        // Experimental

            // Scrollbar
            
hScrollbartrue,
            
vScrollbartrue,
            
fixedScrollbarisAndroid,
            
hideScrollbarisIDevice,
            
fadeScrollbarisIDevice && has3d,
            
scrollbarClass'',

            
// Zoom
            
zoomfalse,
            
zoomMin1,
            
zoomMax4,
            
doubleTapZoom2,
            
wheelAction'scroll',

            
// Snap
            
snapfalse,
            
snapThreshold1,

            
// Events
            
onRefreshnull,
            
onBeforeScrollStart: function (e) { e.preventDefault(); },
            
onScrollStartnull,
            
onBeforeScrollMovenull,
            
onScrollMovenull,
            
onBeforeScrollEndnull,
            
onScrollEndnull,
            
onTouchEndnull,
            
onDestroynull,
            
onZoomStartnull,
            
onZoomnull,
            
onZoomEndnull
        
};

        
// User defined options
        
for (i in optionsthat.options[i] = options[i];
        
        
// Set starting position
        
that.that.options.x;
        
that.that.options.y;

        
// Normalize options
        
that.options.useTransform hasTransform that.options.useTransform false;
        
that.options.hScrollbar that.options.hScroll && that.options.hScrollbar;
        
that.options.vScrollbar that.options.vScroll && that.options.vScrollbar;
        
that.options.zoom that.options.useTransform && that.options.zoom;
        
that.options.useTransition hasTransitionEnd && that.options.useTransition;
        
        
// Set some default styles
        
that.scroller.style[vendor 'TransitionProperty'] = that.options.useTransform '-' vendor.toLowerCase() + '-transform' 'top left';
        
that.scroller.style[vendor 'TransitionDuration'] = '0';
        
that.scroller.style[vendor 'TransformOrigin'] = '0 0';
        if (
that.options.useTransitionthat.scroller.style[vendor 'TransitionTimingFunction'] = 'cubic-bezier(0.33,0.66,0.66,1)';
        
        if (
that.options.useTransformthat.scroller.style[vendor 'Transform'] = trnOpen that.'px,' that.'px' trnClose;
        else 
that.scroller.style.cssText += ';position:absolute;top:' that.'px;left:' that.'px';

        if (
that.options.useTransitionthat.options.fixedScrollbar true;

        
that.refresh();

        
that._bind(RESIZE_EVwindow);
        
that._bind(START_EV);
        if (!
hasTouch) {
            
that._bind('mouseout'that.wrapper);
            
that._bind(WHEEL_EV);
        }

        if (
that.options.checkDOMChangesthat.checkDOMTime setInterval(function () {
            
that._checkDOMChanges();
        }, 
500);
    };

// Prototype
iScroll.prototype = {
    
enabledtrue,
    
x0,
    
y0,
    
steps: [],
    
scale1,
    
currPageX0currPageY0,
    
pagesX: [], pagesY: [],
    
aniTimenull,
    
wheelZoomCount0,
    
    
handleEvent: function (e) {
        var 
that this;
        switch(
e.type) {
            case 
START_EV:
                if (!
hasTouch && e.button !== 0) return;
                
that._start(e);
                break;
            case 
MOVE_EVthat._move(e); break;
            case 
END_EV:
            case 
CANCEL_EVthat._end(e); break;
            case 
RESIZE_EVthat._resize(); break;
            case 
WHEEL_EVthat._wheel(e); break;
            case 
'mouseout'that._mouseout(e); break;
            case 
'webkitTransitionEnd'that._transitionEnd(e); break;
        }
    },
    
    
_checkDOMChanges: function () {
        if (
this.moved || this.zoomed || this.animating ||
            (
this.scrollerW == this.scroller.offsetWidth this.scale && this.scrollerH == this.scroller.offsetHeight this.scale)) return;

        
this.refresh();
    },
    
    
_scrollbar: function (dir) {
        var 
that this,
            
doc document,
            
bar;

        if (!
that[dir 'Scrollbar']) {
            if (
that[dir 'ScrollbarWrapper']) {
                if (
hasTransformthat[dir 'ScrollbarIndicator'].style[vendor 'Transform'] = '';
                
that[dir 'ScrollbarWrapper'].parentNode.removeChild(that[dir 'ScrollbarWrapper']);
                
that[dir 'ScrollbarWrapper'] = null;
                
that[dir 'ScrollbarIndicator'] = null;
            }

            return;
        }

        if (!
that[dir 'ScrollbarWrapper']) {
            
// Create the scrollbar wrapper
            
bar doc.createElement('div');

            if (
that.options.scrollbarClassbar.className that.options.scrollbarClass dir.toUpperCase();
            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');

            
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');

            
that.wrapper.appendChild(bar);
            
that[dir 'ScrollbarWrapper'] = bar;

            
// Create the scrollbar indicator
            
bar doc.createElement('div');
            if (!
that.options.scrollbarClass) {
                
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';
            }
            
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;
            if (
that.options.useTransitionbar.style.cssText += ';-' vendor '-transition-timing-function:cubic-bezier(0.33,0.66,0.66,1)';

            
that[dir 'ScrollbarWrapper'].appendChild(bar);
            
that[dir 'ScrollbarIndicator'] = bar;
        }

        if (
dir == 'h') {
            
that.hScrollbarSize that.hScrollbarWrapper.clientWidth;
            
that.hScrollbarIndicatorSize m.max(m.round(that.hScrollbarSize that.hScrollbarSize that.scrollerW), 8);
            
that.hScrollbarIndicator.style.width that.hScrollbarIndicatorSize 'px';
            
that.hScrollbarMaxScroll that.hScrollbarSize that.hScrollbarIndicatorSize;
            
that.hScrollbarProp that.hScrollbarMaxScroll that.maxScrollX;
        } else {
            
that.vScrollbarSize that.vScrollbarWrapper.clientHeight;
            
that.vScrollbarIndicatorSize m.max(m.round(that.vScrollbarSize that.vScrollbarSize that.scrollerH), 8);
            
that.vScrollbarIndicator.style.height that.vScrollbarIndicatorSize 'px';
            
that.vScrollbarMaxScroll that.vScrollbarSize that.vScrollbarIndicatorSize;
            
that.vScrollbarProp that.vScrollbarMaxScroll that.maxScrollY;
        }

        
// Reset position
        
that._scrollbarPos(dirtrue);
    },
    
    
_resize: function () {
        var 
that this;
        
setTimeout(function () { that.refresh(); }, isAndroid 200 0);
    },
    
    
_pos: function (xy) {
        
this.hScroll 0;
        
this.vScroll 0;

        if (
this.options.useTransform) {
            
this.scroller.style[vendor 'Transform'] = trnOpen 'px,' 'px' trnClose ' scale(' this.scale ')';
        } else {
            
m.round(x);
            
m.round(y);
            
this.scroller.style.left 'px';
            
this.scroller.style.top 'px';
        }

        
this.x;
        
this.y;

        
this._scrollbarPos('h');
        
this._scrollbarPos('v');
    },

    
_scrollbarPos: function (dirhidden) {
        var 
that this,
            
pos dir == 'h' that.that.y,
            
size;

        if (!
that[dir 'Scrollbar']) return;

        
pos that[dir 'ScrollbarProp'] * pos;

        if (
pos 0) {
            if (!
that.options.fixedScrollbar) {
                
size that[dir 'ScrollbarIndicatorSize'] + m.round(pos 3);
                if (
size 8size 8;
                
that[dir 'ScrollbarIndicator'].style[dir == 'h' 'width' 'height'] = size 'px';
            }
            
pos 0;
        } else if (
pos that[dir 'ScrollbarMaxScroll']) {
            if (!
that.options.fixedScrollbar) {
                
size that[dir 'ScrollbarIndicatorSize'] - m.round((pos that[dir 'ScrollbarMaxScroll']) * 3);
                if (
size 8size 8;
                
that[dir 'ScrollbarIndicator'].style[dir == 'h' 'width' 'height'] = size 'px';
                
pos that[dir 'ScrollbarMaxScroll'] + (that[dir 'ScrollbarIndicatorSize'] - size);
            } else {
                
pos that[dir 'ScrollbarMaxScroll'];
            }
        }

        
that[dir 'ScrollbarWrapper'].style[vendor 'TransitionDelay'] = '0';
        
that[dir 'ScrollbarWrapper'].style.opacity hidden && that.options.hideScrollbar '0' '1';
        
that[dir 'ScrollbarIndicator'].style[vendor 'Transform'] = trnOpen + (dir == 'h' pos 'px,0' '0,' pos 'px') + trnClose;
    },
    
    
_start: function (e) {
        var 
that this,
            
point hasTouch e.touches[0] : e,
            
matrixxy,
            
c1c2;

        if (!
that.enabled) return;

        if (
that.options.onBeforeScrollStartthat.options.onBeforeScrollStart.call(thate);

        if (
that.options.useTransition || that.options.zoomthat._transitionTime(0);

        
that.moved false;
        
that.animating false;
        
that.zoomed false;
        
that.distX 0;
        
that.distY 0;
        
that.absDistX 0;
        
that.absDistY 0;
        
that.dirX 0;
        
that.dirY 0;

        
// Gesture start
        
if (that.options.zoom && hasTouch && e.touches.length 1) {
            
c1 m.abs(e.touches[0].pageX-e.touches[1].pageX);
            
c2 m.abs(e.touches[0].pageY-e.touches[1].pageY);
            
that.touchesDistStart m.sqrt(c1 c1 c2 c2);

            
that.originX m.abs(e.touches[0].pageX e.touches[1].pageX that.wrapperOffsetLeft 2) / that.x;
            
that.originY m.abs(e.touches[0].pageY e.touches[1].pageY that.wrapperOffsetTop 2) / that.y;

            if (
that.options.onZoomStartthat.options.onZoomStart.call(thate);
        }

        if (
that.options.momentum) {
            if (
that.options.useTransform) {
                
// Very lame general purpose alternative to CSSMatrix
                
matrix getComputedStyle(that.scrollernull)[vendor 'Transform'].replace(/[^0-9-.,]/g'').split(',');
                
matrix[4] * 1;
                
matrix[5] * 1;
            } else {
                
getComputedStyle(that.scrollernull).left.replace(/[^0-9-]/g'') * 1;
                
getComputedStyle(that.scrollernull).top.replace(/[^0-9-]/g'') * 1;
            }
            
            if (
!= that.|| != that.y) {
                if (
that.options.useTransitionthat._unbind('webkitTransitionEnd');
                else 
cancelFrame(that.aniTime);
                
that.steps = [];
                
that._pos(xy);
            }
        }

        
that.absStartX that.x;    // Needed by snap threshold
        
that.absStartY that.y;

        
that.startX that.x;
        
that.startY that.y;
        
that.pointX point.pageX;
        
that.pointY point.pageY;

        
that.startTime e.timeStamp || Date.now();

        if (
that.options.onScrollStartthat.options.onScrollStart.call(thate);

        
that._bind(MOVE_EV);
        
that._bind(END_EV);
        
that._bind(CANCEL_EV);
    },
    
    
_move: function (e) {
        var 
that this,
            
point hasTouch e.touches[0] : e,
            
deltaX point.pageX that.pointX,
            
deltaY point.pageY that.pointY,
            
newX that.deltaX,
            
newY that.deltaY,
            
c1c2scale,
            
timestamp e.timeStamp || Date.now();

        if (
that.options.onBeforeScrollMovethat.options.onBeforeScrollMove.call(thate);

        
// Zoom
        
if (that.options.zoom && hasTouch && e.touches.length 1) {
            
c1 m.abs(e.touches[0].pageX e.touches[1].pageX);
            
c2 m.abs(e.touches[0].pageY e.touches[1].pageY);
            
that.touchesDist m.sqrt(c1*c1+c2*c2);

            
that.zoomed true;

            
scale that.touchesDistStart that.touchesDist this.scale;

            if (
scale that.options.zoomMinscale 0.5 that.options.zoomMin Math.pow(2.0scale that.options.zoomMin);
            else if (
scale that.options.zoomMaxscale 2.0 that.options.zoomMax Math.pow(0.5that.options.zoomMax scale);

            
that.lastScale scale this.scale;

            
newX this.originX this.originX that.lastScale this.x,
            
newY this.originY this.originY that.lastScale this.y;

            
this.scroller.style[vendor 'Transform'] = trnOpen newX 'px,' newY 'px' trnClose ' scale(' scale ')';

            if (
that.options.onZoomthat.options.onZoom.call(thate);
            return;
        }

        
that.pointX point.pageX;
        
that.pointY point.pageY;

        
// Slow down if outside of the boundaries
        
if (newX || newX that.maxScrollX) {
            
newX that.options.bounce that.+ (deltaX 2) : newX >= || that.maxScrollX >= that.maxScrollX;
        }
        if (
newY that.minScrollY || newY that.maxScrollY) { 
            
newY that.options.bounce that.+ (deltaY 2) : newY >= that.minScrollY || that.maxScrollY >= that.minScrollY that.maxScrollY;
        }

        if (
that.absDistX && that.absDistY 6) {
            
that.distX += deltaX;
            
that.distY += deltaY;
            
that.absDistX m.abs(that.distX);
            
that.absDistY m.abs(that.distY);

            return;
        }

        
// Lock direction
        
if (that.options.lockDirection) {
            if (
that.absDistX that.absDistY 5) {
                
newY that.y;
                
deltaY 0;
            } else if (
that.absDistY that.absDistX 5) {
                
newX that.x;
                
deltaX 0;
            }
        }

        
that.moved true;
        
that._pos(newXnewY);
        
that.dirX deltaX ? -deltaX 0;
        
that.dirY deltaY ? -deltaY 0;

        if (
timestamp that.startTime 300) {
            
that.startTime timestamp;
            
that.startX that.x;
            
that.startY that.y;
        }
        
        if (
that.options.onScrollMovethat.options.onScrollMove.call(thate);
    },
    
    
_end: function (e) {
        if (
hasTouch && e.touches.length != 0) return;

        var 
that this,
            
point hasTouch e.changedTouches[0] : e,
            
targetev,
            
momentumX = { dist:0time:},
            
momentumY = { dist:0time:},
            
duration = (e.timeStamp || Date.now()) - that.startTime,
            
newPosX that.x,
            
newPosY that.y,
            
distXdistY,
            
newDuration,
            
snap,
            
scale;

        
that._unbind(MOVE_EV);
        
that._unbind(END_EV);
        
that._unbind(CANCEL_EV);

        if (
that.options.onBeforeScrollEndthat.options.onBeforeScrollEnd.call(thate);

        if (
that.zoomed) {
            
scale that.scale that.lastScale;
            
scale Math.max(that.options.zoomMinscale);
            
scale Math.min(that.options.zoomMaxscale);
            
that.lastScale scale that.scale;
            
that.scale scale;

            
that.that.originX that.originX that.lastScale that.x;
            
that.that.originY that.originY that.lastScale that.y;
            
            
that.scroller.style[vendor 'TransitionDuration'] = '200ms';
            
that.scroller.style[vendor 'Transform'] = trnOpen that.'px,' that.'px' trnClose ' scale(' that.scale ')';
            
            
that.zoomed false;
            
that.refresh();

            if (
that.options.onZoomEndthat.options.onZoomEnd.call(thate);
            return;
        }

        if (!
that.moved) {
            if (
hasTouch) {
                if (
that.doubleTapTimer && that.options.zoom) {
                    
// Double tapped
                    
clearTimeout(that.doubleTapTimer);
                    
that.doubleTapTimer null;
                    if (
that.options.onZoomStartthat.options.onZoomStart.call(thate);
                    
that.zoom(that.pointXthat.pointYthat.scale == that.options.doubleTapZoom 1);
                    if (
that.options.onZoomEnd) {
                        
setTimeout(function() {
                            
that.options.onZoomEnd.call(thate);
                        }, 
200); // 200 is default zoom duration
                    
}
                } else {
                    
that.doubleTapTimer setTimeout(function () {
                        
that.doubleTapTimer null;

                        
// Find the last touched element
                        
target point.target;
                        while (
target.nodeType != 1target target.parentNode;

                        if (
target.tagName != 'SELECT' && target.tagName != 'INPUT' && target.tagName != 'TEXTAREA') {
                            
ev document.createEvent('MouseEvents');
                            
ev.initMouseEvent('click'truetruee.view1,
                                
point.screenXpoint.screenYpoint.clientXpoint.clientY,
                                
e.ctrlKeye.altKeye.shiftKeye.metaKey,
                                
0null);
                            
ev._fake true;
                            
target.dispatchEvent(ev);
                        }
                    }, 
that.options.zoom 250 0);
                }
            }

            
that._resetPos(200);

            if (
that.options.onTouchEndthat.options.onTouchEnd.call(thate);
            return;
        }

        if (
duration 300 && that.options.momentum) {
            
momentumX newPosX that._momentum(newPosX that.startXduration, -that.xthat.scrollerW that.wrapperW that.xthat.options.bounce that.wrapperW 0) : momentumX;
            
momentumY newPosY that._momentum(newPosY that.startYduration, -that.y, (that.maxScrollY that.scrollerH that.wrapperH that.that.minScrollY 0), that.options.bounce that.wrapperH 0) : momentumY;

            
newPosX that.momentumX.dist;
            
newPosY that.momentumY.dist;

             if ((
that.&& newPosX 0) || (that.that.maxScrollX && newPosX that.maxScrollX)) momentumX = { dist:0time:};
             if ((
that.that.minScrollY && newPosY that.minScrollY) || (that.that.maxScrollY && newPosY that.maxScrollY)) momentumY = { dist:0time:};
        }

        if (
momentumX.dist || momentumY.dist) {
            
newDuration m.max(m.max(momentumX.timemomentumY.time), 10);

            
// Do we need to snap?
            
if (that.options.snap) {
                
distX newPosX that.absStartX;
                
distY newPosY that.absStartY;
                if (
m.abs(distX) < that.options.snapThreshold && m.abs(distY) < that.options.snapThreshold) { that.scrollTo(that.absStartXthat.absStartY200); }
                else {
                    
snap that._snap(newPosXnewPosY);
                    
newPosX snap.x;
                    
newPosY snap.y;
                    
newDuration m.max(snap.timenewDuration);
                }
            }

            
that.scrollTo(m.round(newPosX), m.round(newPosY), newDuration);

            if (
that.options.onTouchEndthat.options.onTouchEnd.call(thate);
            return;
        }

        
// Do we need to snap?
        
if (that.options.snap) {
            
distX newPosX that.absStartX;
            
distY newPosY that.absStartY;
            if (
m.abs(distX) < that.options.snapThreshold && m.abs(distY) < that.options.snapThresholdthat.scrollTo(that.absStartXthat.absStartY200);
            else {
                
snap that._snap(that.xthat.y);
                if (
snap.!= that.|| snap.!= that.ythat.scrollTo(snap.xsnap.ysnap.time);
            }

            if (
that.options.onTouchEndthat.options.onTouchEnd.call(thate);
            return;
        }

        
that._resetPos(200);
        if (
that.options.onTouchEndthat.options.onTouchEnd.call(thate);
    },
    
    
_resetPos: function (time) {
        var 
that this,
            
resetX that.>= that.that.maxScrollX that.maxScrollX that.x,
            
resetY that.>= that.minScrollY || that.maxScrollY that.minScrollY that.that.maxScrollY that.maxScrollY that.y;

        if (
resetX == that.&& resetY == that.y) {
            if (
that.moved) {
                
that.moved false;
                if (
that.options.onScrollEndthat.options.onScrollEnd.call(that);        // Execute custom code on scroll end
            
}

            if (
that.hScrollbar && that.options.hideScrollbar) {
                if (
vendor == 'webkit'that.hScrollbarWrapper.style[vendor 'TransitionDelay'] = '300ms';
                
that.hScrollbarWrapper.style.opacity '0';
            }
            if (
that.vScrollbar && that.options.hideScrollbar) {
                if (
vendor == 'webkit'that.vScrollbarWrapper.style[vendor 'TransitionDelay'] = '300ms';
                
that.vScrollbarWrapper.style.opacity '0';
            }

            return;
        }

        
that.scrollTo(resetXresetYtime || 0);
    },

    
_wheel: function (e) {
        var 
that this,
            
wheelDeltaXwheelDeltaY,
            
deltaXdeltaY,
            
deltaScale;

        if (
'wheelDeltaX' in e) {
            
wheelDeltaX e.wheelDeltaX 12;
            
wheelDeltaY e.wheelDeltaY 12;
        } else if (
'detail' in e) {
            
wheelDeltaX wheelDeltaY = -e.detail 3;
        } else {
            
wheelDeltaX wheelDeltaY = -e.wheelDelta;
        }
        
        if (
that.options.wheelAction == 'zoom') {
            
deltaScale that.scale Math.pow(21/* (wheelDeltaY wheelDeltaY Math.abs(wheelDeltaY) : 0));
            if (
deltaScale that.options.zoomMindeltaScale that.options.zoomMin;
            if (
deltaScale that.options.zoomMaxdeltaScale that.options.zoomMax;
            
            if (
deltaScale != that.scale) {
                if (!
that.wheelZoomCount && that.options.onZoomStartthat.options.onZoomStart.call(thate);
                
that.wheelZoomCount++;
                
                
that.zoom(e.pageXe.pageYdeltaScale400);
                
                
setTimeout(function() {
                    
that.wheelZoomCount--;
                    if (!
that.wheelZoomCount && that.options.onZoomEndthat.options.onZoomEnd.call(thate);
                }, 
400);
            }
            
            return;
        }
        
        
deltaX that.wheelDeltaX;
        
deltaY that.wheelDeltaY;

        if (
deltaX 0deltaX 0;
        else if (
deltaX that.maxScrollXdeltaX that.maxScrollX;

        if (
deltaY that.minScrollYdeltaY that.minScrollY;
        else if (
deltaY that.maxScrollYdeltaY that.maxScrollY;

        
that.scrollTo(deltaXdeltaY0);
    },
    
    
_mouseout: function (e) {
        var 
e.relatedTarget;

        if (!
t) {
            
this._end(e);
            return;
        }

        while (
t.parentNode) if (== this.wrapper) return;
        
        
this._end(e);
    },

    
_transitionEnd: function (e) {
        var 
that this;

        if (
e.target != that.scroller) return;

        
that._unbind('webkitTransitionEnd');
        
        
that._startAni();
    },


    
/**
     *
     * Utilities
     *
     */
    
_startAni: function () {
        var 
that this,
            
startX that.xstartY that.y,
            
startTime Date.now(),
            
stepeaseOut,
            
animate;

        if (
that.animating) return;
        
        if (!
that.steps.length) {
            
that._resetPos(400);
            return;
        }
        
        
step that.steps.shift();
        
        if (
step.== startX && step.== startYstep.time 0;

        
that.animating true;
        
that.moved true;
        
        if (
that.options.useTransition) {
            
that._transitionTime(step.time);
            
that._pos(step.xstep.y);
            
that.animating false;
            if (
step.timethat._bind('webkitTransitionEnd');
            else 
that._resetPos(0);
            return;
        }

        
animate = function () {
            var 
now Date.now(),
                
newXnewY;

            if (
now >= startTime step.time) {
                
that._pos(step.xstep.y);
                
that.animating false;
                if (
that.options.onAnimationEndthat.options.onAnimationEnd.call(that);            // Execute custom code on animation end
                
that._startAni();
                return;
            }

            
now = (now startTime) / step.time 1;
            
easeOut m.sqrt(now now);
            
newX = (step.startX) * easeOut startX;
            
newY = (step.startY) * easeOut startY;
            
that._pos(newXnewY);
            if (
that.animatingthat.aniTime nextFrame(animate);
        };

        
animate();
    },

    
_transitionTime: function (time) {
        
time += 'ms';
        
this.scroller.style[vendor 'TransitionDuration'] = time;
        if (
this.hScrollbarthis.hScrollbarIndicator.style[vendor 'TransitionDuration'] = time;
        if (
this.vScrollbarthis.vScrollbarIndicator.style[vendor 'TransitionDuration'] = time;
    },

    
_momentum: function (disttimemaxDistUppermaxDistLowersize) {
        var 
deceleration 0.0006,
            
speed m.abs(dist) / time,
            
newDist = (speed speed) / (deceleration),
            
newTime 0outsideDist 0;

        
// Proportinally reduce speed if we are outside of the boundaries 
        
if (dist && newDist maxDistUpper) {
            
outsideDist size / (/ (newDist speed deceleration));
            
maxDistUpper maxDistUpper outsideDist;
            
speed speed maxDistUpper newDist;
            
newDist maxDistUpper;
        } else if (
dist && newDist maxDistLower) {
            
outsideDist size / (/ (newDist speed deceleration));
            
maxDistLower maxDistLower outsideDist;
            
speed speed maxDistLower newDist;
            
newDist maxDistLower;
        }

        
newDist newDist * (dist ? -1);
        
newTime speed deceleration;

        return { 
distnewDisttimem.round(newTime) };
    },

    
_offset: function (el) {
        var 
left = -el.offsetLeft,
            
top = -el.offsetTop;
            
        while (
el el.offsetParent) {
            
left -= el.offsetLeft;
            
top -= el.offsetTop;
        }
        
        if (
el != this.wrapper) {
            
left *= this.scale;
            
top *= this.scale;
        }

        return { 
leftlefttoptop };
    },

    
_snap: function (xy) {
        var 
that this,
            
il,
            
pagetime,
            
sizeXsizeY;

        
// Check page X
        
page that.pagesX.length 1;
        for (
i=0l=that.pagesX.lengthi<li++) {
            if (
>= that.pagesX[i]) {
                
page i;
                break;
            }
        }
        if (
page == that.currPageX && page && that.dirX 0page--;
        
that.pagesX[page];
        
sizeX m.abs(that.pagesX[that.currPageX]);
        
sizeX sizeX m.abs(that.x) / sizeX 500 0;
        
that.currPageX page;

        
// Check page Y
        
page that.pagesY.length-1;
        for (
i=0i<pagei++) {
            if (
>= that.pagesY[i]) {
                
page i;
                break;
            }
        }
        if (
page == that.currPageY && page && that.dirY 0page--;
        
that.pagesY[page];
        
sizeY m.abs(that.pagesY[that.currPageY]);
        
sizeY sizeY m.abs(that.y) / sizeY 500 0;
        
that.currPageY page;

        
// Snap with constant speed (proportional duration)
        
time m.round(m.max(sizeXsizeY)) || 200;

        return { 
xxyytimetime };
    },

    
_bind: function (typeelbubble) {
        (
el || this.scroller).addEventListener(typethis, !!bubble);
    },

    
_unbind: function (typeelbubble) {
        (
el || this.scroller).removeEventListener(typethis, !!bubble);
    },


    
/**
     *
     * Public methods
     *
     */
    
destroy: function () {
        var 
that this;

        
that.scroller.style[vendor 'Transform'] = '';

        
// Remove the scrollbars
        
that.hScrollbar false;
        
that.vScrollbar false;
        
that._scrollbar('h');
        
that._scrollbar('v');

        
// Remove the event listeners
        
that._unbind(RESIZE_EVwindow);
        
that._unbind(START_EV);
        
that._unbind(MOVE_EV);
        
that._unbind(END_EV);
        
that._unbind(CANCEL_EV);
        
        if (
that.options.hasTouch) {
            
that._unbind('mouseout'that.wrapper);
            
that._unbind(WHEEL_EV);
        }
        
        if (
that.options.useTransitionthat._unbind('webkitTransitionEnd');
        
        if (
that.options.checkDOMChangesclearInterval(that.checkDOMTime);
        
        if (
that.options.onDestroythat.options.onDestroy.call(that);
    },

    
refresh: function () {
        var 
that this,
            
offset,
            
il,
            
els,
            
pos 0,
            
page 0;

        if (
that.scale that.options.zoomMinthat.scale that.options.zoomMin;
        
that.wrapperW that.wrapper.clientWidth || 1;
        
that.wrapperH that.wrapper.clientHeight || 1;

        
that.minScrollY = -that.options.topOffset || 0;
        
that.scrollerW m.round(that.scroller.offsetWidth that.scale);
        
that.scrollerH m.round((that.scroller.offsetHeight that.minScrollY) * that.scale);
        
that.maxScrollX that.wrapperW that.scrollerW;
        
that.maxScrollY that.wrapperH that.scrollerH that.minScrollY;
        
that.dirX 0;
        
that.dirY 0;

        if (
that.options.onRefreshthat.options.onRefresh.call(that);

        
that.hScroll that.options.hScroll && that.maxScrollX 0;
        
that.vScroll that.options.vScroll && (!that.options.bounceLock && !that.hScroll || that.scrollerH that.wrapperH);

        
that.hScrollbar that.hScroll && that.options.hScrollbar;
        
that.vScrollbar that.vScroll && that.options.vScrollbar && that.scrollerH that.wrapperH;

        
offset that._offset(that.wrapper);
        
that.wrapperOffsetLeft = -offset.left;
        
that.wrapperOffsetTop = -offset.top;

        
// Prepare snap
        
if (typeof that.options.snap == 'string') {
            
that.pagesX = [];
            
that.pagesY = [];
            
els that.scroller.querySelectorAll(that.options.snap);
            for (
i=0l=els.lengthi<li++) {
                
pos that._offset(els[i]);
                
pos.left += that.wrapperOffsetLeft;
                
pos.top += that.wrapperOffsetTop;
                
that.pagesX[i] = pos.left that.maxScrollX that.maxScrollX pos.left that.scale;
                
that.pagesY[i] = pos.top that.maxScrollY that.maxScrollY pos.top that.scale;
            }
        } else if (
that.options.snap) {
            
that.pagesX = [];
            while (
pos >= that.maxScrollX) {
                
that.pagesX[page] = pos;
                
pos pos that.wrapperW;
                
page++;
            }
            if (
that.maxScrollX%that.wrapperWthat.pagesX[that.pagesX.length] = that.maxScrollX that.pagesX[that.pagesX.length-1] + that.pagesX[that.pagesX.length-1];

            
pos 0;
            
page 0;
            
that.pagesY = [];
            while (
pos >= that.maxScrollY) {
                
that.pagesY[page] = pos;
                
pos pos that.wrapperH;
                
page++;
            }
            if (
that.maxScrollY%that.wrapperHthat.pagesY[that.pagesY.length] = that.maxScrollY that.pagesY[that.pagesY.length-1] + that.pagesY[that.pagesY.length-1];
        }

        
// Prepare the scrollbars
        
that._scrollbar('h');
        
that._scrollbar('v');

        if (!
that.zoomed) {
            
that.scroller.style[vendor 'TransitionDuration'] = '0';
            
that._resetPos(200);
        }
    },

    
scrollTo: function (xytimerelative) {
        var 
that this,
            
step x,
            
il;

        
that.stop();

        if (!
step.lengthstep = [{ xxyytimetimerelativerelative }];
        
        for (
i=0l=step.lengthi<li++) {
            if (
step[i].relative) { step[i].that.step[i].xstep[i].that.step[i].y; }
            
that.steps.push({ xstep[i].xystep[i].ytimestep[i].time || });
        }

        
that._startAni();
    },

    
scrollToElement: function (eltime) {
        var 
that thispos;
        
el el.nodeType el that.scroller.querySelector(el);
        if (!
el) return;

        
pos that._offset(el);
        
pos.left += that.wrapperOffsetLeft;
        
pos.top += that.wrapperOffsetTop;

        
pos.left pos.left pos.left that.maxScrollX that.maxScrollX pos.left;
        
pos.top pos.top that.minScrollY that.minScrollY pos.top that.maxScrollY that.maxScrollY pos.top;
        
time time === undefined m.max(m.abs(pos.left)*2m.abs(pos.top)*2) : time;

        
that.scrollTo(pos.leftpos.toptime);
    },

    
scrollToPage: function (pageXpageYtime) {
        var 
that thisxy;

        if (
that.options.onScrollStartthat.options.onScrollStart.call(that);

        if (
that.options.snap) {
            
pageX pageX == 'next' that.currPageX+pageX == 'prev' that.currPageX-pageX;
            
pageY pageY == 'next' that.currPageY+pageY == 'prev' that.currPageY-pageY;

            
pageX pageX pageX that.pagesX.length-that.pagesX.length-pageX;
            
pageY pageY pageY that.pagesY.length-that.pagesY.length-pageY;

            
that.currPageX pageX;
            
that.currPageY pageY;
            
that.pagesX[pageX];
            
that.pagesY[pageY];
        } else {
            
= -that.wrapperW pageX;
            
= -that.wrapperH pageY;
            if (
that.maxScrollXthat.maxScrollX;
            if (
that.maxScrollYthat.maxScrollY;
        }

        
that.scrollTo(xytime || 400);
    },

    
disable: function () {
        
this.stop();
        
this._resetPos(0);
        
this.enabled false;

        
// If disabled after touchstart we make sure that there are no left over events
        
this._unbind(MOVE_EV);
        
this._unbind(END_EV);
        
this._unbind(CANCEL_EV);
    },
    
    
enable: function () {
        
this.enabled true;
    },
    
    
stop: function () {
        if (
this.options.useTransitionthis._unbind('webkitTransitionEnd');
        else 
cancelFrame(this.aniTime);
        
this.steps = [];
        
this.moved false;
        
this.animating false;
    },
    
    
zoom: function (xyscaletime) {
        var 
that this,
            
relScale scale that.scale;

        if (!
that.options.useTransform) return;

        
that.zoomed true;
        
time time === undefined 200 time;
        
that.wrapperOffsetLeft that.x;
        
that.wrapperOffsetTop that.y;
        
that.relScale that.x;
        
that.relScale that.y;

        
that.scale scale;
        
that.refresh();

        
that.that.that.that.maxScrollX that.maxScrollX that.x;
        
that.that.that.minScrollY that.minScrollY that.that.maxScrollY that.maxScrollY that.y;

        
that.scroller.style[vendor 'TransitionDuration'] = time 'ms';
        
that.scroller.style[vendor 'Transform'] = trnOpen that.'px,' that.'px' trnClose ' scale(' scale ')';
        
that.zoomed false;
    },
    
    
isReady: function () {
        return !
this.moved && !this.zoomed && !this.animating;
    }
};

if (
typeof exports !== 'undefined'exports.iScroll iScroll;
else 
window.iScroll iScroll;

})();
?>
Онлайн: 2
Реклама