Ui Flexslider
Ui Flexslider
var UI = require('./core');
// MODIFIED:
// - LINE 252: add `<i></i>`
// - namespace
// - Init code
// TODO: start after x ms when pause on actions
/*
* jQuery FlexSlider v2.6.1
* Copyright 2012 WooThemes
* Contributing Author: Tyler Smith
*/
// RANDOMIZE:
if (slider.vars.randomize) {
slider.slides.sort(function() {
return (Math.round(Math.random()) - 0.5);
});
slider.container.empty().append(slider.slides);
}
slider.doMath();
// INIT
slider.setup("init");
// CONTROLNAV:
if (slider.vars.controlNav) {
methods.controlNav.setup();
}
// DIRECTIONNAV:
if (slider.vars.directionNav) {
methods.directionNav.setup();
}
// KEYBOARD:
if (slider.vars.keyboard && ($(slider.containerSelector).length === 1 ||
slider.vars.multipleKeyboard)) {
$(document).bind('keyup', function(event) {
var keycode = event.keyCode;
if (!slider.animating && (keycode === 39 || keycode === 37)) {
var target = (keycode === 39) ? slider.getTarget('next') :
(keycode === 37) ? slider.getTarget('prev') : false;
slider.flexAnimate(target, slider.vars.pauseOnAction);
}
});
}
// MOUSEWHEEL:
if (slider.vars.mousewheel) {
slider.bind('mousewheel', function(event, delta, deltaX, deltaY) {
event.preventDefault();
var target = (delta < 0) ? slider.getTarget('next') :
slider.getTarget('prev');
slider.flexAnimate(target, slider.vars.pauseOnAction);
});
}
// PAUSEPLAY
if (slider.vars.pausePlay) {
methods.pausePlay.setup();
}
// SLIDSESHOW
if (slider.vars.slideshow) {
if (slider.vars.pauseOnHover) {
slider.hover(function() {
if (!slider.manualPlay && !slider.manualPause) {slider.pause();}
}, function() {
if (!slider.manualPause && !slider.manualPlay && !slider.stopped)
{slider.play();}
});
}
// initialize animation
// If we're visible, or we don't use PageVisibility API
if (!slider.vars.pauseInvisible || !methods.pauseInvisible.isHidden()) {
(slider.vars.initDelay > 0) ? slider.startTimeout =
setTimeout(slider.play, slider.vars.initDelay) : slider.play();
}
}
// ASNAV:
if (asNav) {methods.asNav.setup();}
// TOUCH
if (touch && slider.vars.touch) {methods.touch();}
// FADE&&SMOOTHHEIGHT || SLIDE:
if (!fade || (fade && slider.vars.smoothHeight)) {$(window).bind("resize
orientationchange focus", methods.resize);}
slider.find("img").attr("draggable", "false");
if (slider.pagingCount > 1) {
for (var i = 0; i < slider.pagingCount; i++) {
slide = slider.slides.eq(i);
if (undefined === slide.attr('data-thumb-alt')) {
slide.attr('data-thumb-alt', '');
}
var altText = ('' !== slide.attr('data-thumb-alt')) ? altText = '
alt="' + slide.attr('data-thumb-alt') + '"' : '';
item = (slider.vars.controlNav === "thumbnails") ? '<img src="' +
slide.attr( 'data-thumb' ) + '"' + altText + '/>' : '<a href="#">' + j + '</a>';
if ('thumbnails' === slider.vars.controlNav && true ===
slider.vars.thumbCaptions) {
var captn = slide.attr('data-thumbcaption');
if ('' !== captn && undefined !== captn) {item += '<span class="' +
namespace + 'caption">' + captn + '</span>';}
}
// slider.controlNavScaffold.append('<li>' + item + '</li>');
slider.controlNavScaffold.append('<li>' + item + '<i></i></li>');
j++;
}
}
// CONTROLSCONTAINER:
(slider.controlsContainer) ? $
(slider.controlsContainer).append(slider.controlNavScaffold) :
slider.append(slider.controlNavScaffold);
methods.controlNav.set();
methods.controlNav.active();
if (!$this.hasClass(namespace + 'active')) {
slider.direction = (target > slider.currentSlide) ? "next" : "prev";
slider.flexAnimate(target, slider.vars.pauseOnAction);
}
}
});
},
setupManual: function() {
slider.controlNav = slider.manualControls;
methods.controlNav.active();
slider.controlNav.bind(eventType, function(event) {
event.preventDefault();
if (!$this.hasClass(namespace + 'active')) {
(target > slider.currentSlide) ? slider.direction = "next" :
slider.direction = "prev";
slider.flexAnimate(target, slider.vars.pauseOnAction);
}
}
methods.directionNav.update();
slider.directionNav.bind(eventType, function(event) {
event.preventDefault();
var target;
// CONTROLSCONTAINER:
if (slider.controlsContainer) {
slider.controlsContainer.append(pausePlayScaffold);
slider.pausePlay = $('.' + namespace + 'pauseplay a',
slider.controlsContainer);
} else {
slider.append(pausePlayScaffold);
slider.pausePlay = $('.' + namespace + 'pauseplay a', slider);
}
slider.pausePlay.bind(eventType, function(event) {
event.preventDefault();
if (!msGesture) {
onTouchStart = function(e) {
if (slider.animating) {
e.preventDefault();
} else if (( window.navigator.msPointerEnabled ) || e.touches.length ===
1) {
slider.pause();
// CAROUSEL:
cwidth = (vertical) ? slider.h : slider.w;
startT = Number(new Date());
// CAROUSEL:
onTouchMove = function(e) {
// Local vars for X and Y points.
localX = e.touches[0].pageX;
localY = e.touches[0].pageY;
onTouchEnd = function(e) {
// finish the touch by undoing the touch session
el.removeEventListener('touchmove', onTouchMove, false);
startX = null;
startY = null;
dx = null;
offset = null;
};
function onMSPointerDown(e) {
e.stopPropagation();
if (slider.animating) {
e.preventDefault();
} else {
slider.pause();
el._gesture.addPointer(e.pointerId);
accDx = 0;
cwidth = (vertical) ? slider.h : slider.w;
startT = Number(new Date());
// CAROUSEL:
function onMSGestureChange(e) {
e.stopPropagation();
var slider = e.target._slider;
if (!slider) {
return;
}
var transX = -e.translationX,
transY = -e.translationY;
//Accumulate translations.
accDx = accDx + ((vertical) ? transY : transX);
dx = accDx;
scrolling = (vertical) ? (Math.abs(accDx) < Math.abs(-transX)) :
(Math.abs(accDx) < Math.abs(-transY));
return;
}
function onMSGestureEnd(e) {
e.stopPropagation();
var slider = e.target._slider;
if (!slider) {
return;
}
if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx ===
null)) {
var updateDx = (reverse) ? -dx : dx,
target = (updateDx > 0) ? slider.getTarget('next') :
slider.getTarget('prev');
startX = null;
startY = null;
dx = null;
offset = null;
accDx = 0;
}
}
},
resize: function() {
if (!slider.animating && slider.is(':visible')) {
if (!carousel) {slider.doMath()};
if (fade) {
// SMOOTH HEIGHT:
methods.smoothHeight();
} else if (carousel) { //CAROUSEL:
slider.slides.width(slider.computedW);
slider.update(slider.pagingCount);
slider.setProps();
}
else if (vertical) { //VERTICAL:
slider.viewport.height(slider.h);
slider.setProps(slider.h, "setTotal");
} else {
// SMOOTH HEIGHT:
if (slider.vars.smoothHeight) {methods.smoothHeight();}
slider.newSlides.width(slider.computedW);
slider.setProps(slider.computedW, "setTotal");
}
}
},
smoothHeight: function(dur) {
if (!vertical || fade) {
var $obj = (fade) ? slider : slider.viewport;
(dur) ? $obj.animate({"height":
slider.slides.eq(slider.animatingTo).innerHeight()}, dur) :
$obj.innerHeight(slider.slides.eq(slider.animatingTo).innerHeight());
}
},
sync: function(action) {
var $obj = $(slider.vars.sync).data("flexslider"),
target = slider.animatingTo;
switch (action) {
case "animate":
$obj.flexAnimate(target, slider.vars.pauseOnAction, false, true);
break;
case "play":
if (!$obj.playing && !$obj.asNav) {
$obj.play();
}
break;
case "pause":
$obj.pause();
break;
}
},
uniqueID: function($clone) {
// Append _clone to current level and children elements with id attributes
$clone.filter('[id]').add($clone.find('[id]')).each(function() {
var $this = $(this);
$this.attr('id', $this.attr('id') + '_clone');
});
return $clone;
},
pauseInvisible: {
visProp: null,
init: function() {
var visProp = methods.pauseInvisible.getHiddenProp();
if (visProp) {
var evtname = visProp.replace(/[H|h]idden/,'') + 'visibilitychange';
document.addEventListener(evtname, function() {
if (methods.pauseInvisible.isHidden()) {
if(slider.startTimeout) {
clearTimeout(slider.startTimeout); //If clock is ticking, stop
timer and prevent from starting while invisible
} else {
slider.pause(); //Or just pause
}
}
else {
if(slider.started) {
slider.play(); //Initiated before, just play
} else {
if (slider.vars.initDelay > 0) {
setTimeout(slider.play, slider.vars.initDelay);
} else {
slider.play(); //Didn't init before: simply init or wait for it
}
}
}
});
}
},
isHidden: function() {
var prop = methods.pauseInvisible.getHiddenProp();
if (!prop) {
return false;
}
return document[prop];
},
getHiddenProp: function() {
var prefixes = ['webkit','moz','ms','o'];
// if 'hidden' is natively supported just return it
if ('hidden' in document) {
return 'hidden';
}
// otherwise loop over all the known prefixes until we find one
for (var i = 0; i < prefixes.length; i++ ) {
if ((prefixes[i] + 'Hidden') in document) {
return prefixes[i] + 'Hidden';
}
}
// otherwise it's not supported
return null;
}
},
setToClearWatchedEvent: function() {
clearTimeout(watchedEventClearTimer);
watchedEventClearTimer = setTimeout(function() {
watchedEvent = "";
}, 3000);
}
};
// public methods
slider.flexAnimate = function(target, pause, override, withSync, fromNav) {
if (!slider.vars.animationLoop && target !== slider.currentSlide) {
slider.direction = (target > slider.currentSlide) ? "next" : "prev";
}
slider.animating = true;
slider.animatingTo = target;
// SLIDESHOW:
if (pause) {slider.pause();}
// SYNC:
if (slider.syncExists && !fromNav) {methods.sync("animate");}
// CONTROLNAV
if (slider.vars.controlNav) {methods.controlNav.active();}
// !CAROUSEL:
// CANDIDATE: slide active class (for add/remove slide)
if (!carousel) {slider.slides.removeClass(namespace + 'active-
slide').eq(target).addClass(namespace + 'active-slide');}
// INFINITE LOOP:
// CANDIDATE: atEnd
slider.atEnd = target === 0 || target === slider.last;
// DIRECTIONNAV:
if (slider.vars.directionNav) {methods.directionNav.update();}
// SLIDE:
if (!fade) {
var dimension = (vertical) ? slider.slides.filter(':first').height() :
slider.computedW,
margin, slideString, calcNext;
} else {
slider.container.animate(slider.args, slider.vars.animationSpeed,
slider.vars.easing, function(){
slider.wrapup(dimension);
});
}
} else { // FADE:
if (!touch) {
//slider.slides.eq(slider.currentSlide).fadeOut(slider.vars.animationSpeed,
slider.vars.easing);
//slider.slides.eq(target).fadeIn(slider.vars.animationSpeed,
slider.vars.easing, slider.wrapup);
slider.slides.eq(slider.currentSlide).css({"zIndex":
1}).animate({"opacity": 0}, slider.vars.animationSpeed, slider.vars.easing);
slider.slides.eq(target).css({"zIndex": 2}).animate({"opacity": 1},
slider.vars.animationSpeed, slider.vars.easing, slider.wrapup);
} else {
slider.slides.eq(slider.currentSlide).css({
"opacity": 0,
"zIndex": 1
});
slider.slides.eq(target).css({"opacity": 1, "zIndex": 2});
slider.wrapup(dimension);
}
}
// SMOOTH HEIGHT:
if (slider.vars.smoothHeight)
{methods.smoothHeight(slider.vars.animationSpeed)};
}
};
slider.wrapup = function(dimension) {
// SLIDE:
if (!fade && !carousel) {
if (slider.currentSlide === 0 && slider.animatingTo === slider.last &&
slider.vars.animationLoop) {
slider.setProps(dimension, "jumpEnd");
} else if (slider.currentSlide === slider.last && slider.animatingTo === 0 &&
slider.vars.animationLoop) {
slider.setProps(dimension, "jumpStart");
}
}
slider.animating = false;
slider.currentSlide = slider.animatingTo;
// API: after() animation Callback
slider.vars.after(slider);
};
// SLIDESHOW:
slider.animateSlides = function() {
if (!slider.animating && focused)
{slider.flexAnimate(slider.getTarget("next"));}
};
// SLIDESHOW:
slider.pause = function() {
clearInterval(slider.animatedSlides);
slider.animatedSlides = null;
slider.playing = false;
// PAUSEPLAY:
if (slider.vars.pausePlay) {methods.pausePlay.update("play");}
// SYNC:
if (slider.syncExists) {methods.sync("pause");}
};
// SLIDESHOW:
slider.play = function() {
if (slider.playing) {clearInterval(slider.animatedSlides);}
slider.animatedSlides = slider.animatedSlides ||
setInterval(slider.animateSlides, slider.vars.slideshowSpeed);
slider.started = slider.playing = true;
// PAUSEPLAY:
if (slider.vars.pausePlay) {methods.pausePlay.update("pause");}
// SYNC:
if (slider.syncExists) {methods.sync("play");}
};
// STOP:
slider.stop = function() {
slider.pause();
slider.stopped = true;
};
slider.canAdvance = function(target, fromNav) {
// ASNAV:
var last = (asNav) ? slider.pagingCount - 1 : slider.last;
return (fromNav) ? true :
(asNav && slider.currentItem === slider.count - 1 && target === 0 &&
slider.direction === "prev") ? true :
(asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 &&
slider.direction !== "next") ? false :
(target === slider.currentSlide && !asNav) ? false :
(slider.vars.animationLoop) ? true :
(slider.atEnd && slider.currentSlide === 0 && target === last &&
slider.direction !== "next") ? false :
(slider.atEnd && slider.currentSlide === last && target === 0 &&
slider.direction === "next") ? false :
true;
};
slider.getTarget = function(dir) {
slider.direction = dir;
if (dir === "next") {
return (slider.currentSlide === slider.last) ? 0 : slider.currentSlide + 1;
} else {
return (slider.currentSlide === 0) ? slider.last : slider.currentSlide - 1;
}
};
// SLIDE:
slider.setProps = function(pos, special, dur) {
var target = (function() {
var posCheck = (pos) ? pos : ((slider.itemW + slider.vars.itemMargin) *
slider.move) * slider.animatingTo,
posCalc = (function() {
if (carousel) {
return (special === "setTouch") ? pos :
(reverse && slider.animatingTo === slider.last) ? 0 :
(reverse) ? slider.limit - (((slider.itemW +
slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
(slider.animatingTo === slider.last) ? slider.limit : posCheck;
} else {
switch (special) {
case "setTotal":
return (reverse) ? ((slider.count - 1) - slider.currentSlide +
slider.cloneOffset) * pos : (slider.currentSlide + slider.cloneOffset) * pos;
case "setTouch":
return (reverse) ? pos : pos;
case "jumpEnd":
return (reverse) ? pos : slider.count * pos;
case "jumpStart":
return (reverse) ? slider.count * pos : pos;
default:
return pos;
}
}
}());
if (slider.transitions) {
target = (vertical) ? "translate3d(0," + target + ",0)" : "translate3d(" +
target + ",0,0)";
dur = (dur !== undefined) ? (dur / 1000) + "s" : "0s";
slider.container.css("-" + slider.pfx + "-transition-duration", dur);
slider.container.css("transition-duration", dur);
}
slider.args[slider.prop] = target;
if (slider.transitions || dur === undefined)
{slider.container.css(slider.args);}
slider.container.css('transform', target);
};
slider.setup = function(type) {
// SLIDE:
if (!fade) {
var sliderOffset, arr;
slider.container.append(methods.uniqueID(slider.slides.first().clone().addClass('cl
one')).attr('aria-hidden', 'true'))
.prepend(methods.uniqueID(slider.slides.last().clone().addClass('clone'))
.attr('aria-hidden', 'true'));
}
slider.newSlides = $(slider.vars.selector, slider);
// SMOOTH HEIGHT:
if (slider.vars.smoothHeight) {methods.smoothHeight();}
}, (type === "init") ? 100 : 0);
}
} else { // FADE:
slider.slides.css({
"width": "100%",
"float": "left",
"marginRight": "-100%",
"position": "relative"
});
if (type === "init") {
if (!touch) {
//slider.slides.eq(slider.currentSlide).fadeIn(slider.vars.animationSpeed,
slider.vars.easing);
if (slider.vars.fadeFirstSlide == false) {
slider.slides.css({ "opacity": 0, "display": "block", "zIndex":
1 }).eq(slider.currentSlide).css({"zIndex": 2}).css({"opacity": 1});
} else {
slider.slides.css({ "opacity": 0, "display": "block", "zIndex":
1 }).eq(slider.currentSlide).css({"zIndex": 2}).animate({"opacity":
1},slider.vars.animationSpeed,slider.vars.easing);
}
} else {
slider.slides.css({ "opacity": 0, "display": "block", "webkitTransition":
"opacity " + slider.vars.animationSpeed / 1000 + "s ease", "zIndex":
1 }).eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2});
}
}
// SMOOTH HEIGHT:
if (slider.vars.smoothHeight) {methods.smoothHeight();}
}
// !CAROUSEL:
// CANDIDATE: active slide
if (!carousel) {slider.slides.removeClass(namespace + "active-
slide").eq(slider.currentSlide).addClass(namespace + "active-slide");}
slider.doMath = function() {
var slide = slider.slides.first(),
slideMargin = slider.vars.itemMargin,
minItems = slider.vars.minItems,
maxItems = slider.vars.maxItems;
// CAROUSEL:
if (carousel) {
slider.itemT = slider.vars.itemWidth + slideMargin;
slider.itemM = slideMargin;
slider.minW = (minItems) ? minItems * slider.itemT : slider.w;
slider.maxW = (maxItems) ? (maxItems * slider.itemT) - slideMargin :
slider.w;
slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin *
(minItems - 1))) / minItems :
(slider.maxW < slider.w) ? (slider.w - (slideMargin * (maxItems - 1))) /
maxItems :
(slider.vars.itemWidth > slider.w) ? slider.w : slider.vars.itemWidth;
// update controlNav
if (slider.vars.controlNav && !slider.manualControls) {
if ((action === "add" && !carousel) || slider.pagingCount >
slider.controlNav.length) {
methods.controlNav.update("add");
} else if ((action === "remove" && !carousel) || slider.pagingCount <
slider.controlNav.length) {
if (carousel && slider.currentSlide > slider.last) {
slider.currentSlide -= 1;
slider.animatingTo -= 1;
}
methods.controlNav.update("remove", slider.last);
}
}
// update directionNav
if (slider.vars.directionNav) {methods.directionNav.update();}
};
slider.count += 1;
slider.last = slider.count - 1;
// update slider.slides
slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
// re-setup the slider to accomdate new slide
slider.setup();
// update count
slider.count -= 1;
slider.last = slider.count - 1;
// remove slide
if (isNaN(obj)) {
$(obj, slider.slides).remove();
} else {
(vertical && reverse) ? slider.slides.eq(slider.last).remove() :
slider.slides.eq(obj).remove();
}
// update slider.slides
slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
// re-setup the slider to accomdate new slide
slider.setup();
//FlexSlider: Initialize
methods.init();
};
// Usability features
pauseOnAction: true, // Boolean: Pause the slideshow when interacting
with control elements, highly recommended.
pauseOnHover: false, // Boolean: Pause the slideshow when hovering
over slider, then resume when no longer hovering
pauseInvisible: true, // {NEW} Boolean: Pause the slideshow when tab
is invisible, resume when visible. Provides better UX, lower CPU usage.
useCSS: true, // {NEW} Boolean: Slider will use CSS3
transitions if available
touch: true, // {NEW} Boolean: Allow touch swipe navigation of
the slider on touch-enabled devices
video: false, // {NEW} Boolean: If using video in the slider,
will prevent CSS3 3D Transforms to avoid graphical glitches
// Primary Controls
controlNav: true, // Boolean: Create navigation for paging control
of each slide? Note: Leave true for manualControls usage
directionNav: true, // Boolean: Create navigation for previous/next
navigation? (true/false)
prevText: ' ', // String: Set the text for the "previous" directionNav
item
nextText: ' ', // String: Set the text for the "next" directionNav
item
// Secondary Navigation
keyboard: true, // Boolean: Allow slider navigating via keyboard
left/right keys
multipleKeyboard: false, // {NEW} Boolean: Allow keyboard navigation to
affect multiple sliders. Default behavior cuts out keyboard navigation with more
than one slider present.
mousewheel: false, // {UPDATED} Boolean: Requires
jquery.mousewheel.js (https://github.com/brandonaaron/jquery-mousewheel) - Allows
slider navigating via mousewheel
pausePlay: false, // Boolean: Create pause/play dynamic element
pauseText: 'Pause', // String: Set the text for the 'pause' pausePlay
item
playText: 'Play', // String: Set the text for the 'play' pausePlay
item
// Special properties
controlsContainer: '', // {UPDATED} jQuery Object/Selector: Declare
which container the navigation elements should be appended too. Default container
is the FlexSlider element. Example use would be $('.flexslider-container').
Property is ignored if given element is not found.
manualControls: '', // {UPDATED} jQuery Object/Selector: Declare
custom control navigation. Examples would be $(".flex-control-nav li") or "#tabs-
nav li img", etc. The number of elements in your controlNav should match the number
of slides/tabs.
customDirectionNav: '', // {NEW} jQuery Object/Selector: Custom prev /
next button. Must be two jQuery elements. In order to make the events work they
have to have the classes "prev" and "next" (plus namespace)
sync: '', // {NEW} Selector: Mirror the actions performed
on this slider with another slider. Use with care.
asNavFor: '', // {NEW} Selector: Internal property exposed for
turning the slider into a thumbnail navigation for another slider
// Carousel Options
itemWidth: 0, // {NEW} Integer: Box-model width of individual
carousel items, including horizontal borders and padding.
itemMargin: 0, // {NEW} Integer: Margin between carousel items.
minItems: 1, // {NEW} Integer: Minimum number of carousel
items that should be visible. Items will resize fluidly when below this.
maxItems: 0, // {NEW} Integer: Maxmimum number of carousel
items that should be visible. Items will resize fluidly when above this limit.
move: 0, // {NEW} Integer: Number of carousel items that
should move on animation. If 0, slider will move all visible items.
allowOneSlide: true, // {NEW} Boolean: Whether or not to allow a slider
comprised of a single slide
// Callback API
start: function() {
}, // Callback: function(slider) - Fires when the slider loads the
first slide
before: function() {
}, // Callback: function(slider) - Fires asynchronously with each
slider animation
after: function() {
}, // Callback: function(slider) - Fires after each slider animation
completes
end: function() {
}, // Callback: function(slider) - Fires when the slider reaches the
last slide (asynchronous)
added: function() {
}, // {NEW} Callback: function(slider) - Fires after a slide is added
removed: function() {
}, // {NEW} Callback: function(slider) - Fires after a slide is removed
init: function() {
} // {NEW} Callback: function(slider) - Fires after the slider is
initially setup
};
// Init code
UI.ready(function(context) {
$('[data-am-flexslider]', context).each(function(i, item) {
var $slider = $(item);
var options = UI.utils.parseOptions($slider.data('amFlexslider'));
options.before = function(slider) {
if (slider._pausedTimer) {
window.clearTimeout(slider._pausedTimer);
slider._pausedTimer = null;
}
};
options.after = function(slider) {
var pauseTime = slider.vars.playAfterPaused;
if (pauseTime && !isNaN(pauseTime) && !slider.playing) {
if (!slider.manualPause && !slider.manualPlay && !slider.stopped) {
slider._pausedTimer = window.setTimeout(function() {
slider.play();
}, pauseTime);
}
}
};
$slider.flexslider(options);
});
});
module.exports = $.flexslider;