Вход Регистрация
Файл: contao-3.5.8/assets/swipe/2.0/js/swipe.js
Строк: 898
<?php
/**
 * Swipe 2.0
 *
 * Brad Birdsall
 * Copyright 2013, MIT License
 *
 * Dot menu enhancements
 * Copyright (c) 2013-2014 Leo Feyer
 */

function Swipe(containeroptions) {

  
"use strict";

  
// utilities
  
var noop = function() {}; // simple no operation function
  
var offloadFn = function(fn) { setTimeout(fn || noop0) }; // offload a functions execution

  // check browser capabilities
  
var browser = {
    
addEventListener: !!window.addEventListener,
    
touch: ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch,
    
transitions: (function(temp) {
      var 
props = ['transitionProperty''WebkitTransition''MozTransition''OTransition''msTransition'];
      for ( var 
i in props ) if (temp.styleprops[i] ] !== undefined) return true;
      return 
false;
    })(
document.createElement('swipe'))
  };

  
// quit if no root element
  
if (!container) return;
  var 
element container.children[0];
  var 
slidesslidePoswidthlength;
  
options options || {};
  var 
index parseInt(options.startSlide10) || 0;
  var 
position index;
  var 
clonedSlides false;
  var 
speed options.speed || 300;
  
options.continuous options.continuous !== undefined options.continuous true;
  var 
nodes = {}, listeners = {};

  function 
setup() {

    
// cache slides
    
slides element.children;

    
// filter comments (IE8)
    
for (var i=0i<slides.lengthi++) {
      if (
slides[i].nodeType == 8) {
        
element.removeChild(slides[i]);
        --
i;
      }
    }

    
length slides.length;

    
// set continuous to false if only one slide
    
if (slides.length 2options.continuous false;

    
// special case if two slides
    
if (browser.transitions && options.continuous && slides.length 3) {
      
element.appendChild(slides[0].cloneNode(true));
      
element.appendChild(element.children[1].cloneNode(true));
      
slides element.children;
      
clonedSlides true;
    }

    
// create an array to store current positions of each slide
    
slidePos = new Array(slides.length);

    
// determine width of each slide
    
width container.getBoundingClientRect().width || container.offsetWidth;

    
element.style.width = (slides.length width) + 'px';

    
// stack elements
    
var pos slides.length;
    while (
pos--) {

      var 
slide slides[pos];

      
slide.style.width width 'px';
      
slide.setAttribute('data-index'pos.toString());

      if (
browser.transitions) {
        
slide.style.left = (pos * -width) + 'px';
        
move(posindex pos ? -width : (index pos width 0), 0);
      }

    }

    
// reposition elements before and after index
    
if (options.continuous && browser.transitions) {
      
move(circle(index-1), -width0);
      
move(circle(index+1), width0);
    }

    if (!
browser.transitionselement.style.left = (index * -width) + 'px';

    
container.style.visibility 'visible';

  }

  function 
addEvent(eltypefn) {

    if (
browser.addEventListenerel.addEventListener(typefnfalse);
    else if (
window.attachEventel.attachEvent('on' typefn);

  }

  function 
stopEvent(e) {

    
e.returnValue false// IE < 9
    
e.preventDefault && e.preventDefault();

  }

  function 
removeEvent(eltypefn) {

    if (
browser.addEventListenerel.removeEventListener(typefnfalse);
    else if (
window.detachEventel.detachEvent('on' typefn);

  }

  function 
menu() {

    var 
childs options.menu.childNodes;

    for (var 
h=0h<childs.lengthh++) {

      
// previous button
      
if (childs[h].className && childs[h].className.indexOf('slider-prev') != -1) {

        
listeners.prev = function(e) {
          
stopEvent(e);
          
stop();
          
prev();
        };

        
nodes.prev childs[h];
        
addEvent(nodes.prev'click'listeners.prev);

      }

      
// next button
      
else if (childs[h].className && childs[h].className.indexOf('slider-next') != -1) {

        
listeners.next = function(e) {
          
stopEvent(e);
          
stop();
          
next();
        };

        
nodes.next childs[h];
        
addEvent(nodes.next'click'listeners.next);

      }

      
// dot navigation
      
else if (childs[h].className && childs[h].className.indexOf('slider-menu') != -1) {

        for (var 
i=0i<lengthi++) {

          var 
document.createElement('b');
          
b.innerHTML '•';
          
b.setAttribute('data-index'i.toString());

          if (
== positionb.className 'active';

          
addEvent(b'click', (function(b) {
            return (function(
e) {
              
stopEvent(e);
              
stop();
              
slide(parseInt((this.getAttribute this.getAttribute('data-index') : b.attributes['data-index'].nodeValue)));
            });
          })(
b));

          
childs[h].appendChild(b);

        }

        
nodes.dots childs[h];

      }

    }

  }

  function 
updateMenu() {

    for (var 
i=0i<lengthi++) {

      var 
child nodes.dots.children[i];
      
child.className = (parseInt(child.getAttribute child.getAttribute('data-index') : child.attributes['data-index'].nodeValue) == position) ? 'active' '';

    }

  }

  function 
killMenu() {

    var 
childs nodes.dots.childNodes;

    while (
childs.length 0) {
        
nodes.dots.removeChild(childs[0]);
    }

    
removeEvent(nodes.prev'click'listeners.prev);
    
removeEvent(nodes.next'click'listeners.next);

  }

  function 
prev() {

    if (
options.continuousslide(index-1);
    else if (
indexslide(index-1);

  }

  function 
next() {

    if (
options.continuousslide(index+1);
    else if (
index slides.length 1slide(index+1);

  }

  function 
circle(index) {

    
// a simple positive modulo using slides.length
    
return (slides.length + (index slides.length)) % slides.length;

  }

  function 
slide(toslideSpeed) {

    
// do nothing if already on requested slide
    
if (index == to) return;

    if (
browser.transitions) {

      var 
direction Math.abs(index-to) / (index-to); // 1: backward, -1: forward

      // get the actual position of the slide
      
if (options.continuous) {
        var 
natural_direction direction;
        
direction = -slidePos[circle(to)] / width;

        
// if going forward but to < index, use to = slides.length + to
        // if going backward but to > index, use to = -slides.length + to
        
if (direction !== natural_directionto =  -direction slides.length to;

      }

      var 
diff Math.abs(index-to) - 1;

      
// move all the slides between index and to in the right direction
      
while (diff--) movecircle((to index to index) - diff 1), width direction0);

      
to circle(to);

      
move(indexwidth directionslideSpeed || speed);
      
move(to0slideSpeed || speed);

      if (
options.continuousmove(circle(to direction), -(width direction), 0); // we need to get the next in place

    
} else {

      
to circle(to);
      
animate(index * -widthto * -widthslideSpeed || speed);
      
//no fallback for a circular continuous if the browser does not accept transitions
    
}

    
index to;
    
position clonedSlides ? (index 2) : index;

    
// update the menu
    
if (options.menuupdateMenu();

    
offloadFn(options.callback && options.callback(positionslides[index]));

  }

  function 
move(indexdistspeed) {

    
translate(indexdistspeed);
    
slidePos[index] = dist;

  }

  function 
translate(indexdistspeed) {

    var 
slide slides[index];
    var 
style slide && slide.style;

    if (!
style) return;

    
style.webkitTransitionDuration =
    
style.MozTransitionDuration =
    
style.msTransitionDuration =
    
style.OTransitionDuration =
    
style.transitionDuration speed 'ms';

    
style.webkitTransform 'translate(' dist 'px,0)' 'translateZ(0)';
    
style.msTransform =
    
style.MozTransform =
    
style.OTransform 'translateX(' dist 'px)';

  }

  function 
animate(fromtospeed) {

    
// if not an animation, just reposition
    
if (!speed) {

      
element.style.left to 'px';
      return;

    }

    var 
start = +new Date;

    var 
timer setInterval(function() {

      var 
timeElap = +new Date start;

      if (
timeElap speed) {

        
element.style.left to 'px';

        if (
delaybegin();

        
options.transitionEnd && options.transitionEnd.call(eventpositionslides[index]);

        
clearInterval(timer);
        return;

      }

      
element.style.left = (( (to from) * (Math.floor((timeElap speed) * 100) / 100) ) + from) + 'px';

    }, 
4);

  }

  
// setup auto slideshow
  
var delay options.auto || 0;
  var 
interval;

  function 
begin() {

    
interval setTimeout(nextdelay);

  }

  function 
stop() {

    
delay 0;
    
clearTimeout(interval);

  }

  
// setup initial vars
  
var start = {};
  var 
delta = {};
  var 
isScrolling;

  
// setup event capturing
  
var events = {

    
handleEvent: function(event) {

      switch (
event.type) {
        case 
'touchstart'this.start(event); break;
        case 
'touchmove'this.move(event); break;
        case 
'touchend'offloadFn(this.end(event)); break;
        case 
'webkitTransitionEnd':
        case 
'msTransitionEnd':
        case 
'oTransitionEnd':
        case 
'otransitionend':
        case 
'transitionend'offloadFn(this.transitionEnd(event)); break;
        case 
'resize'offloadFn(setup); break;
      }

      if (
options.stopPropagationevent.stopPropagation();

    },
    
start: function(event) {

      var 
touches event.touches[0];

      
// measure start values
      
start = {

        
// get initial touch coords
        
xtouches.pageX,
        
ytouches.pageY,

        
// store time to determine touch duration
        
time: +new Date

      
};

      
// used for testing first move event
      
isScrolling undefined;

      
// reset delta and end measurements
      
delta = {};

      
// attach touchmove and touchend listeners
      
element.addEventListener('touchmove'thisfalse);
      
element.addEventListener('touchend'thisfalse);

    },
    
move: function(event) {

      
// ensure swiping with one touch and not pinching
      
if (event.touches.length || event.scale && event.scale !== 1) return;

      if (
options.disableScrollevent.preventDefault();

      var 
touches event.touches[0];

      
// measure change in x and y
      
delta = {
        
xtouches.pageX start.x,
        
ytouches.pageY start.y
      
};

      
// determine if scrolling test has run - one time test
      
if (typeof isScrolling == 'undefined') {
        
isScrolling = !!( isScrolling || Math.abs(delta.x) < Math.abs(delta.y) );
      }

      
// if user is not trying to scroll vertically
      
if (!isScrolling) {

        
// prevent native scrolling
        
event.preventDefault();

        
// stop slideshow
        
stop();

        
// increase resistance if first or last slide
        
if (options.continuous) { // we don't add resistance at the end

          
translate(circle(index-1), delta.slidePos[circle(index-1)], 0);
          
translate(indexdelta.slidePos[index], 0);
          
translate(circle(index+1), delta.slidePos[circle(index+1)], 0);

        } else {

          
delta.=
            
delta./
              ( (!
index && delta.0               // if first slide and sliding left
                
|| index == slides.length 1        // or if last slide and sliding right
                
&& delta.0                       // and if sliding at all
              
) ?
              ( 
Math.abs(delta.x) / width )      // determine resistance level
              
);                                 // no resistance if false

          // translate 1:1
          
translate(index-1delta.slidePos[index-1], 0);
          
translate(indexdelta.slidePos[index], 0);
          
translate(index+1delta.slidePos[index+1], 0);
        }

      }

    },
    
end: function() {

      
// measure duration
      
var duration = +new Date start.time;

      
// determine if slide attempt triggers next/prev slide
      
var isValidSlide =
            
Number(duration) < 250               // if slide duration is less than 250ms
            
&& Math.abs(delta.x) > 20            // and if slide amt is greater than 20px
            
|| Math.abs(delta.x) > width/2;      // or if slide amt is greater than half the width

      // determine if slide attempt is past start and end
      
var isPastBounds =
            !
index && delta.0                            // if first slide and slide amt is greater than 0
            
|| index == slides.length && delta.0;    // or if last slide and slide amt is less than 0

      
if (options.continuousisPastBounds false;

      
// determine direction of swipe (true:right, false:left)
      
var direction delta.0;

      
// if not scrolling vertically
      
if (!isScrolling) {

        if (
isValidSlide && !isPastBounds) {

          if (
direction) {

            if (
options.continuous) { // we need to get the next in this direction in place

              
move(circle(index-1), -width0);
              
move(circle(index+2), width0);

            } else {
              
move(index-1, -width0);
            }

            
move(indexslidePos[index]-widthspeed);
            
move(circle(index+1), slidePos[circle(index+1)]-widthspeed);
            
index circle(index+1);

          } else {
            if (
options.continuous) { // we need to get the next in this direction in place

              
move(circle(index+1), width0);
              
move(circle(index-2), -width0);

            } else {
              
move(index+1width0);
            }

            
move(indexslidePos[index]+widthspeed);
            
move(circle(index-1), slidePos[circle(index-1)]+widthspeed);
            
index circle(index-1);

          }

          
position clonedSlides ? (index 2) : index;

          
// update the menu
          
if (options.menuupdateMenu();

          
options.callback && options.callback(positionslides[index]);

        } else {

          if (
options.continuous) {

            
move(circle(index-1), -widthspeed);
            
move(index0speed);
            
move(circle(index+1), widthspeed);

          } else {

            
move(index-1, -widthspeed);
            
move(index0speed);
            
move(index+1widthspeed);
          }

        }

      }

      
// kill touchmove and touchend event listeners until touchstart called again
      
element.removeEventListener('touchmove'eventsfalse);
      
element.removeEventListener('touchend'eventsfalse);

    },
    
transitionEnd: function(event) {

      if (
parseInt(event.target.getAttribute('data-index'), 10) == index) {

        if (
delaybegin();

        
options.transitionEnd && options.transitionEnd.call(eventpositionslides[index]);

      }

    }

  };

  
// trigger setup
  
setup();

  
// set up the menu
  
if (options.menumenu();

  
// start auto slideshow if applicable
  
if (delaybegin();

  
// add event listeners
  
if (browser.addEventListener) {

    
// set touchstart event on element
    
if (browser.touchelement.addEventListener('touchstart'eventsfalse);

    if (
browser.transitions) {
      
element.addEventListener('webkitTransitionEnd'eventsfalse);
      
element.addEventListener('msTransitionEnd'eventsfalse);
      
element.addEventListener('oTransitionEnd'eventsfalse);
      
element.addEventListener('otransitionend'eventsfalse);
      
element.addEventListener('transitionend'eventsfalse);
    }

    
// set resize event on window
    
window.addEventListener('resize'eventsfalse);

  } else {

    
window.onresize = function () { setup() }; // to play nice with old IE

  
}

  
// expose the Swipe API
  
return {
    
setup: function() {

      
setup();

    },
    
slide: function(tospeed) {

      
// cancel slideshow
      
stop();

      
slide(tospeed);

    },
    
prev: function() {

      
// cancel slideshow
      
stop();

      
prev();

    },
    
next: function() {

      
// cancel slideshow
      
stop();

      
next();

    },
    
stop: function() {

      
// cancel slideshow
      
stop();

    },
    
getPos: function() {

      
// return current index position
      
return position;

    },
    
getNumSlides: function() {

      
// return total number of slides
      
return length;

    },
    
kill: function() {

      
// cancel slideshow
      
stop();

      
// reset element
      
element.style.width '';
      
element.style.left '';

      
// reset slides
      
var pos slides.length;
      while(
pos--) {

        var 
slide slides[pos];
        
slide.style.width '';
        
slide.style.left '';

        if (
browser.transitionstranslate(pos00);

      }

      
// removed event listeners
      
if (browser.addEventListener) {

        
// remove current event listeners
        
element.removeEventListener('touchstart'eventsfalse);
        
element.removeEventListener('webkitTransitionEnd'eventsfalse);
        
element.removeEventListener('msTransitionEnd'eventsfalse);
        
element.removeEventListener('oTransitionEnd'eventsfalse);
        
element.removeEventListener('otransitionend'eventsfalse);
        
element.removeEventListener('transitionend'eventsfalse);
        
window.removeEventListener('resize'eventsfalse);

      } else {

        
window.onresize null;

      }

      
// kill the menu
      
killMenu();

    }
  }

}
?>
Онлайн: 1
Реклама