}


// 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.call()); break;
}

if (options.stopPropagation) event.stopPropagation();

},
start: function(event) {

var touches = event.touches[0];

// measure start values
start = {

// get initial touch coords
x: touches.pageX,
y: touches.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', this, false);
element.addEventListener('touchend', this, false);

},
move: function(event) {

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

if (options.disableScroll) event.preventDefault();

var touches = event.touches[0];

// measure change in x and y
delta = {
x: touches.pageX - start.x,
y: touches.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.x + slidePos[circle(index-1)], 0);
translate(index, delta.x + slidePos[index], 0);
translate(circle(index+1), delta.x + slidePos[circle(index+1)], 0);

} else {

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

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

}

},
end: function(event) {

// 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.x > 0 // if first slide and slide amt is greater than 0
|| index == slides.length - 1 && delta.x < 0; // or if last slide and slide amt is less than 0

if (options.continuous) isPastBounds = false;

// determine direction of swipe (true:right, false:left)
var direction = delta.x < 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), -width, 0);
move(circle(index+2), width, 0);

} else {
move(index-1, -width, 0);
}

move(index, slidePos[index]-width, speed);
move(circle(index+1), slidePos[circle(index+1)]-width, speed);
index = circle(index+1);

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

move(circle(index+1), width, 0);
move(circle(index-2), -width, 0);

} else {
move(index+1, width, 0);
}

move(index, slidePos[index]+width, speed);
move(circle(index-1), slidePos[circle(index-1)]+width, speed);
index = circle(index-1);

}

options.callback && options.callback(index, slides[index]);

} else {

if (options.continuous) {

move(circle(index-1), -width, speed);
move(index, 0, speed);
move(circle(index+1), width, speed);

} else {

move(index-1, -width, speed);
move(index, 0, speed);
move(index+1, width, speed);
}

}

}

// kill touchmove and touchend event listeners until touchstart called again
element.removeEventListener('touchmove', events, false)
element.removeEventListener('touchend', events, false)

},
transitionEnd: function(event) {

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

Prev | Next
Pg.: 1 2 3


Back to home | File page

Subscribe | Register | Login | N