flexslider 2.0.2 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZDhiZTgxZGIzNDM0NGEzMGYxNmExY2MzZmU2OTFiODk1NzNhZmY0Mg==
5
+ data.tar.gz: !binary |-
6
+ M2MzYzZlODU2OGI0NTdkOTI0NjNlOGMxODhiNzI3Yjk2YzgxMDE5MQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZDc1OWUzOGVjYzBhMTAwNzVkNmY5NjI1YmY3MWE2OTU5MzUwOGYzMjUxZjZm
10
+ MTU0ODg5OTRhNTI5MjczZmNlMDBhZTZjMWU1MTAzYTMwZjZhMTExMDJmMjA1
11
+ YjcxNzMzYmE1ZWNjNTBjMTM1OTU5ZTA3Nzc2NTBkMjVkODM5MWQ=
12
+ data.tar.gz: !binary |-
13
+ ZTBlNmE4ZjBkZmM5MzUzYzk0OGYwMDE0ZGNlOTVkMDU0MzJjY2E0ZjZjMmNm
14
+ YjQyNjY5Njg2YjI0YjgwMDcwY2U4MTcyMGVmMWZlOGZiMTEwYzMyNmQ4NzQx
15
+ OTU1MzEwNmJjZDljYTA3Y2Y4OTFkMDc2NTE4MDA1NmEzZDBiNDI=
data/README.md CHANGED
@@ -24,7 +24,11 @@ Flexslider 2 is dependant on jQuery, so make sure you have it in your Gemfile.
24
24
 
25
25
  Add to your app/assets/javascripts/application.js
26
26
 
27
- //= require flexslider
27
+ //= require jquery.flexslider
28
+
29
+ Or for the minified version
30
+
31
+ //= require jquery.flexslider-min
28
32
 
29
33
  And to your app/assets/stylesheets/application.css
30
34
 
@@ -35,4 +39,4 @@ And to your app/assets/stylesheets/application.css
35
39
  Usage documentation as well as demos can be found at:
36
40
 
37
41
  https://github.com/woothemes/FlexSlider
38
- http://www.woothemes.com/flexslider/
42
+ http://www.woothemes.com/flexslider/
@@ -1,3 +1,3 @@
1
1
  module Flexslider
2
- VERSION = "2.0.2"
2
+ VERSION = "2.2.0"
3
3
  end
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+ <svg xmlns="http://www.w3.org/2000/svg">
4
+ <metadata>
5
+ This is a custom SVG font generated by IcoMoon.
6
+ <iconset grid="14"></iconset>
7
+ </metadata>
8
+ <defs>
9
+ <font id="flexslider-icon" horiz-adv-x="448" >
10
+ <font-face units-per-em="448" ascent="384" descent="-64" />
11
+ <missing-glyph horiz-adv-x="448" />
12
+ <glyph unicode="&#xf001;" d="M 185.50-9.25l-163.00,162.75q-9.25,9.25 -9.25,22.625t 9.25,22.625l 163.00,162.75q 9.25,9.25 22.625,9.25t 22.625-9.25l 18.75-18.75q 9.25-9.25 9.25-22.625t-9.25-22.625l-121.50-121.50l 121.50-121.25q 9.25-9.50 9.25-22.75t-9.25-22.50l-18.75-18.75q-9.25-9.25 -22.625-9.25t-22.625,9.25z" horiz-adv-x="288" />
13
+ <glyph unicode="&#xf002;" d="M 274.75,176.00q0.00-13.00 -9.25-22.75l-163.00-162.75q-9.25-9.25 -22.50-9.25t-22.50,9.25l-19.00,18.75q-9.25,9.75 -9.25,22.75q0.00,13.25 9.25,22.50l 121.50,121.50l-121.50,121.25q-9.25,9.75 -9.25,22.75q0.00,13.25 9.25,22.50l 19.00,18.75q 9.00,9.50 22.50,9.50t 22.50-9.50l 163.00-162.75q 9.25-9.25 9.25-22.50z" horiz-adv-x="288" />
14
+ <glyph unicode="&#xf003;" d="M 346.00,152.25l-332.00-184.50q-5.75-3.25 -9.875-0.75t-4.125,9.00l0.00,368.00 q0.00,6.50 4.125,9.00t 9.875-0.75l 332.00-184.50q 5.75-3.25 5.75-7.75t-5.75-7.75z" horiz-adv-x="352" />
15
+ <glyph unicode="&#xf004;" d="M 384.00,336.00l0.00-352.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-128.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,352.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 128.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 160.00,336.00l0.00-352.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-128.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,352.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 128.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25z" horiz-adv-x="384" />
16
+ <glyph unicode="&#xf005;" d="M 402.75,208.00q0.00-13.25 -9.25-22.50l-162.75-162.75q-9.50-9.50 -22.75-9.50q-13.50,0.00 -22.50,9.50l-162.75,162.75q-9.50,9.00 -9.50,22.50q0.00,13.25 9.50,22.75l 18.50,18.75q 9.75,9.25 22.75,9.25q 13.25,0.00 22.50-9.25l 121.50-121.50l 121.50,121.50q 9.25,9.25 22.50,9.25q 13.00,0.00 22.75-9.25l 18.75-18.75q 9.25-9.75 9.25-22.75z" horiz-adv-x="416" />
17
+ <glyph unicode="&#x20;" horiz-adv-x="224" />
18
+ <glyph class="hidden" unicode="&#xf000;" d="M0,384L 448 -64L0 -64 z" horiz-adv-x="0" />
19
+ </font></defs></svg>
@@ -0,0 +1,5 @@
1
+ /*
2
+ * jQuery FlexSlider v2.2.0
3
+ * Copyright 2012 WooThemes
4
+ * Contributing Author: Tyler Smith
5
+ */(function(e){e.flexslider=function(t,n){var r=e(t);r.vars=e.extend({},e.flexslider.defaults,n);var i=r.vars.namespace,s=window.navigator&&window.navigator.msPointerEnabled&&window.MSGesture,o=("ontouchstart"in window||s||window.DocumentTouch&&document instanceof DocumentTouch)&&r.vars.touch,u="click touchend MSPointerUp",a="",f,l=r.vars.direction==="vertical",c=r.vars.reverse,h=r.vars.itemWidth>0,p=r.vars.animation==="fade",d=r.vars.asNavFor!=="",v={},m=!0;e.data(t,"flexslider",r);v={init:function(){r.animating=!1;r.currentSlide=parseInt(r.vars.startAt?r.vars.startAt:0);isNaN(r.currentSlide)&&(r.currentSlide=0);r.animatingTo=r.currentSlide;r.atEnd=r.currentSlide===0||r.currentSlide===r.last;r.containerSelector=r.vars.selector.substr(0,r.vars.selector.search(" "));r.slides=e(r.vars.selector,r);r.container=e(r.containerSelector,r);r.count=r.slides.length;r.syncExists=e(r.vars.sync).length>0;r.vars.animation==="slide"&&(r.vars.animation="swing");r.prop=l?"top":"marginLeft";r.args={};r.manualPause=!1;r.stopped=!1;r.started=!1;r.startTimeout=null;r.transitions=!r.vars.video&&!p&&r.vars.useCSS&&function(){var e=document.createElement("div"),t=["perspectiveProperty","WebkitPerspective","MozPerspective","OPerspective","msPerspective"];for(var n in t)if(e.style[t[n]]!==undefined){r.pfx=t[n].replace("Perspective","").toLowerCase();r.prop="-"+r.pfx+"-transform";return!0}return!1}();r.vars.controlsContainer!==""&&(r.controlsContainer=e(r.vars.controlsContainer).length>0&&e(r.vars.controlsContainer));r.vars.manualControls!==""&&(r.manualControls=e(r.vars.manualControls).length>0&&e(r.vars.manualControls));if(r.vars.randomize){r.slides.sort(function(){return Math.round(Math.random())-.5});r.container.empty().append(r.slides)}r.doMath();r.setup("init");r.vars.controlNav&&v.controlNav.setup();r.vars.directionNav&&v.directionNav.setup();r.vars.keyboard&&(e(r.containerSelector).length===1||r.vars.multipleKeyboard)&&e(document).bind("keyup",function(e){var t=e.keyCode;if(!r.animating&&(t===39||t===37)){var n=t===39?r.getTarget("next"):t===37?r.getTarget("prev"):!1;r.flexAnimate(n,r.vars.pauseOnAction)}});r.vars.mousewheel&&r.bind("mousewheel",function(e,t,n,i){e.preventDefault();var s=t<0?r.getTarget("next"):r.getTarget("prev");r.flexAnimate(s,r.vars.pauseOnAction)});r.vars.pausePlay&&v.pausePlay.setup();r.vars.slideshow&&r.vars.pauseInvisible&&v.pauseInvisible.init();if(r.vars.slideshow){r.vars.pauseOnHover&&r.hover(function(){!r.manualPlay&&!r.manualPause&&r.pause()},function(){!r.manualPause&&!r.manualPlay&&!r.stopped&&r.play()});if(!r.vars.pauseInvisible||!v.pauseInvisible.isHidden())r.vars.initDelay>0?r.startTimeout=setTimeout(r.play,r.vars.initDelay):r.play()}d&&v.asNav.setup();o&&r.vars.touch&&v.touch();(!p||p&&r.vars.smoothHeight)&&e(window).bind("resize orientationchange focus",v.resize);r.find("img").attr("draggable","false");setTimeout(function(){r.vars.start(r)},200)},asNav:{setup:function(){r.asNav=!0;r.animatingTo=Math.floor(r.currentSlide/r.move);r.currentItem=r.currentSlide;r.slides.removeClass(i+"active-slide").eq(r.currentItem).addClass(i+"active-slide");if(!s)r.slides.click(function(t){t.preventDefault();var n=e(this),s=n.index(),o=n.offset().left-e(r).scrollLeft();if(o<=0&&n.hasClass(i+"active-slide"))r.flexAnimate(r.getTarget("prev"),!0);else if(!e(r.vars.asNavFor).data("flexslider").animating&&!n.hasClass(i+"active-slide")){r.direction=r.currentItem<s?"next":"prev";r.flexAnimate(s,r.vars.pauseOnAction,!1,!0,!0)}});else{t._slider=r;r.slides.each(function(){var t=this;t._gesture=new MSGesture;t._gesture.target=t;t.addEventListener("MSPointerDown",function(e){e.preventDefault();e.currentTarget._gesture&&e.currentTarget._gesture.addPointer(e.pointerId)},!1);t.addEventListener("MSGestureTap",function(t){t.preventDefault();var n=e(this),i=n.index();if(!e(r.vars.asNavFor).data("flexslider").animating&&!n.hasClass("active")){r.direction=r.currentItem<i?"next":"prev";r.flexAnimate(i,r.vars.pauseOnAction,!1,!0,!0)}})})}}},controlNav:{setup:function(){r.manualControls?v.controlNav.setupManual():v.controlNav.setupPaging()},setupPaging:function(){var t=r.vars.controlNav==="thumbnails"?"control-thumbs":"control-paging",n=1,s,o;r.controlNavScaffold=e('<ol class="'+i+"control-nav "+i+t+'"></ol>');if(r.pagingCount>1)for(var f=0;f<r.pagingCount;f++){o=r.slides.eq(f);s=r.vars.controlNav==="thumbnails"?'<img src="'+o.attr("data-thumb")+'"/>':"<a>"+n+"</a>";if("thumbnails"===r.vars.controlNav&&!0===r.vars.thumbCaptions){var l=o.attr("data-thumbcaption");""!=l&&undefined!=l&&(s+='<span class="'+i+'caption">'+l+"</span>")}r.controlNavScaffold.append("<li>"+s+"</li>");n++}r.controlsContainer?e(r.controlsContainer).append(r.controlNavScaffold):r.append(r.controlNavScaffold);v.controlNav.set();v.controlNav.active();r.controlNavScaffold.delegate("a, img",u,function(t){t.preventDefault();if(a===""||a===t.type){var n=e(this),s=r.controlNav.index(n);if(!n.hasClass(i+"active")){r.direction=s>r.currentSlide?"next":"prev";r.flexAnimate(s,r.vars.pauseOnAction)}}a===""&&(a=t.type);v.setToClearWatchedEvent()})},setupManual:function(){r.controlNav=r.manualControls;v.controlNav.active();r.controlNav.bind(u,function(t){t.preventDefault();if(a===""||a===t.type){var n=e(this),s=r.controlNav.index(n);if(!n.hasClass(i+"active")){s>r.currentSlide?r.direction="next":r.direction="prev";r.flexAnimate(s,r.vars.pauseOnAction)}}a===""&&(a=t.type);v.setToClearWatchedEvent()})},set:function(){var t=r.vars.controlNav==="thumbnails"?"img":"a";r.controlNav=e("."+i+"control-nav li "+t,r.controlsContainer?r.controlsContainer:r)},active:function(){r.controlNav.removeClass(i+"active").eq(r.animatingTo).addClass(i+"active")},update:function(t,n){r.pagingCount>1&&t==="add"?r.controlNavScaffold.append(e("<li><a>"+r.count+"</a></li>")):r.pagingCount===1?r.controlNavScaffold.find("li").remove():r.controlNav.eq(n).closest("li").remove();v.controlNav.set();r.pagingCount>1&&r.pagingCount!==r.controlNav.length?r.update(n,t):v.controlNav.active()}},directionNav:{setup:function(){var t=e('<ul class="'+i+'direction-nav"><li><a class="'+i+'prev" href="#">'+r.vars.prevText+'</a></li><li><a class="'+i+'next" href="#">'+r.vars.nextText+"</a></li></ul>");if(r.controlsContainer){e(r.controlsContainer).append(t);r.directionNav=e("."+i+"direction-nav li a",r.controlsContainer)}else{r.append(t);r.directionNav=e("."+i+"direction-nav li a",r)}v.directionNav.update();r.directionNav.bind(u,function(t){t.preventDefault();var n;if(a===""||a===t.type){n=e(this).hasClass(i+"next")?r.getTarget("next"):r.getTarget("prev");r.flexAnimate(n,r.vars.pauseOnAction)}a===""&&(a=t.type);v.setToClearWatchedEvent()})},update:function(){var e=i+"disabled";r.pagingCount===1?r.directionNav.addClass(e).attr("tabindex","-1"):r.vars.animationLoop?r.directionNav.removeClass(e).removeAttr("tabindex"):r.animatingTo===0?r.directionNav.removeClass(e).filter("."+i+"prev").addClass(e).attr("tabindex","-1"):r.animatingTo===r.last?r.directionNav.removeClass(e).filter("."+i+"next").addClass(e).attr("tabindex","-1"):r.directionNav.removeClass(e).removeAttr("tabindex")}},pausePlay:{setup:function(){var t=e('<div class="'+i+'pauseplay"><a></a></div>');if(r.controlsContainer){r.controlsContainer.append(t);r.pausePlay=e("."+i+"pauseplay a",r.controlsContainer)}else{r.append(t);r.pausePlay=e("."+i+"pauseplay a",r)}v.pausePlay.update(r.vars.slideshow?i+"pause":i+"play");r.pausePlay.bind(u,function(t){t.preventDefault();if(a===""||a===t.type)if(e(this).hasClass(i+"pause")){r.manualPause=!0;r.manualPlay=!1;r.pause()}else{r.manualPause=!1;r.manualPlay=!0;r.play()}a===""&&(a=t.type);v.setToClearWatchedEvent()})},update:function(e){e==="play"?r.pausePlay.removeClass(i+"pause").addClass(i+"play").html(r.vars.playText):r.pausePlay.removeClass(i+"play").addClass(i+"pause").html(r.vars.pauseText)}},touch:function(){var e,n,i,o,u,a,f=!1,d=0,v=0,m=0;if(!s){t.addEventListener("touchstart",g,!1);function g(s){if(r.animating)s.preventDefault();else if(window.navigator.msPointerEnabled||s.touches.length===1){r.pause();o=l?r.h:r.w;a=Number(new Date);d=s.touches[0].pageX;v=s.touches[0].pageY;i=h&&c&&r.animatingTo===r.last?0:h&&c?r.limit-(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo:h&&r.currentSlide===r.last?r.limit:h?(r.itemW+r.vars.itemMargin)*r.move*r.currentSlide:c?(r.last-r.currentSlide+r.cloneOffset)*o:(r.currentSlide+r.cloneOffset)*o;e=l?v:d;n=l?d:v;t.addEventListener("touchmove",y,!1);t.addEventListener("touchend",b,!1)}}function y(t){d=t.touches[0].pageX;v=t.touches[0].pageY;u=l?e-v:e-d;f=l?Math.abs(u)<Math.abs(d-n):Math.abs(u)<Math.abs(v-n);var s=500;if(!f||Number(new Date)-a>s){t.preventDefault();if(!p&&r.transitions){r.vars.animationLoop||(u/=r.currentSlide===0&&u<0||r.currentSlide===r.last&&u>0?Math.abs(u)/o+2:1);r.setProps(i+u,"setTouch")}}}function b(s){t.removeEventListener("touchmove",y,!1);if(r.animatingTo===r.currentSlide&&!f&&u!==null){var l=c?-u:u,h=l>0?r.getTarget("next"):r.getTarget("prev");r.canAdvance(h)&&(Number(new Date)-a<550&&Math.abs(l)>50||Math.abs(l)>o/2)?r.flexAnimate(h,r.vars.pauseOnAction):p||r.flexAnimate(r.currentSlide,r.vars.pauseOnAction,!0)}t.removeEventListener("touchend",b,!1);e=null;n=null;u=null;i=null}}else{t.style.msTouchAction="none";t._gesture=new MSGesture;t._gesture.target=t;t.addEventListener("MSPointerDown",w,!1);t._slider=r;t.addEventListener("MSGestureChange",E,!1);t.addEventListener("MSGestureEnd",S,!1);function w(e){e.stopPropagation();if(r.animating)e.preventDefault();else{r.pause();t._gesture.addPointer(e.pointerId);m=0;o=l?r.h:r.w;a=Number(new Date);i=h&&c&&r.animatingTo===r.last?0:h&&c?r.limit-(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo:h&&r.currentSlide===r.last?r.limit:h?(r.itemW+r.vars.itemMargin)*r.move*r.currentSlide:c?(r.last-r.currentSlide+r.cloneOffset)*o:(r.currentSlide+r.cloneOffset)*o}}function E(e){e.stopPropagation();var n=e.target._slider;if(!n)return;var r=-e.translationX,s=-e.translationY;m+=l?s:r;u=m;f=l?Math.abs(m)<Math.abs(-r):Math.abs(m)<Math.abs(-s);if(e.detail===e.MSGESTURE_FLAG_INERTIA){setImmediate(function(){t._gesture.stop()});return}if(!f||Number(new Date)-a>500){e.preventDefault();if(!p&&n.transitions){n.vars.animationLoop||(u=m/(n.currentSlide===0&&m<0||n.currentSlide===n.last&&m>0?Math.abs(m)/o+2:1));n.setProps(i+u,"setTouch")}}}function S(t){t.stopPropagation();var r=t.target._slider;if(!r)return;if(r.animatingTo===r.currentSlide&&!f&&u!==null){var s=c?-u:u,l=s>0?r.getTarget("next"):r.getTarget("prev");r.canAdvance(l)&&(Number(new Date)-a<550&&Math.abs(s)>50||Math.abs(s)>o/2)?r.flexAnimate(l,r.vars.pauseOnAction):p||r.flexAnimate(r.currentSlide,r.vars.pauseOnAction,!0)}e=null;n=null;u=null;i=null;m=0}}},resize:function(){if(!r.animating&&r.is(":visible")){h||r.doMath();if(p)v.smoothHeight();else if(h){r.slides.width(r.computedW);r.update(r.pagingCount);r.setProps()}else if(l){r.viewport.height(r.h);r.setProps(r.h,"setTotal")}else{r.vars.smoothHeight&&v.smoothHeight();r.newSlides.width(r.computedW);r.setProps(r.computedW,"setTotal")}}},smoothHeight:function(e){if(!l||p){var t=p?r:r.viewport;e?t.animate({height:r.slides.eq(r.animatingTo).height()},e):t.height(r.slides.eq(r.animatingTo).height())}},sync:function(t){var n=e(r.vars.sync).data("flexslider"),i=r.animatingTo;switch(t){case"animate":n.flexAnimate(i,r.vars.pauseOnAction,!1,!0);break;case"play":!n.playing&&!n.asNav&&n.play();break;case"pause":n.pause()}},pauseInvisible:{visProp:null,init:function(){var e=["webkit","moz","ms","o"];if("hidden"in document)return"hidden";for(var t=0;t<e.length;t++)e[t]+"Hidden"in document&&(v.pauseInvisible.visProp=e[t]+"Hidden");if(v.pauseInvisible.visProp){var n=v.pauseInvisible.visProp.replace(/[H|h]idden/,"")+"visibilitychange";document.addEventListener(n,function(){v.pauseInvisible.isHidden()?r.startTimeout?clearTimeout(r.startTimeout):r.pause():r.started?r.play():r.vars.initDelay>0?setTimeout(r.play,r.vars.initDelay):r.play()})}},isHidden:function(){return document[v.pauseInvisible.visProp]||!1}},setToClearWatchedEvent:function(){clearTimeout(f);f=setTimeout(function(){a=""},3e3)}};r.flexAnimate=function(t,n,s,u,a){!r.vars.animationLoop&&t!==r.currentSlide&&(r.direction=t>r.currentSlide?"next":"prev");d&&r.pagingCount===1&&(r.direction=r.currentItem<t?"next":"prev");if(!r.animating&&(r.canAdvance(t,a)||s)&&r.is(":visible")){if(d&&u){var f=e(r.vars.asNavFor).data("flexslider");r.atEnd=t===0||t===r.count-1;f.flexAnimate(t,!0,!1,!0,a);r.direction=r.currentItem<t?"next":"prev";f.direction=r.direction;if(Math.ceil((t+1)/r.visible)-1===r.currentSlide||t===0){r.currentItem=t;r.slides.removeClass(i+"active-slide").eq(t).addClass(i+"active-slide");return!1}r.currentItem=t;r.slides.removeClass(i+"active-slide").eq(t).addClass(i+"active-slide");t=Math.floor(t/r.visible)}r.animating=!0;r.animatingTo=t;n&&r.pause();r.vars.before(r);r.syncExists&&!a&&v.sync("animate");r.vars.controlNav&&v.controlNav.active();h||r.slides.removeClass(i+"active-slide").eq(t).addClass(i+"active-slide");r.atEnd=t===0||t===r.last;r.vars.directionNav&&v.directionNav.update();if(t===r.last){r.vars.end(r);r.vars.animationLoop||r.pause()}if(!p){var m=l?r.slides.filter(":first").height():r.computedW,g,y,b;if(h){g=r.vars.itemMargin;b=(r.itemW+g)*r.move*r.animatingTo;y=b>r.limit&&r.visible!==1?r.limit:b}else r.currentSlide===0&&t===r.count-1&&r.vars.animationLoop&&r.direction!=="next"?y=c?(r.count+r.cloneOffset)*m:0:r.currentSlide===r.last&&t===0&&r.vars.animationLoop&&r.direction!=="prev"?y=c?0:(r.count+1)*m:y=c?(r.count-1-t+r.cloneOffset)*m:(t+r.cloneOffset)*m;r.setProps(y,"",r.vars.animationSpeed);if(r.transitions){if(!r.vars.animationLoop||!r.atEnd){r.animating=!1;r.currentSlide=r.animatingTo}r.container.unbind("webkitTransitionEnd transitionend");r.container.bind("webkitTransitionEnd transitionend",function(){r.wrapup(m)})}else r.container.animate(r.args,r.vars.animationSpeed,r.vars.easing,function(){r.wrapup(m)})}else if(!o){r.slides.eq(r.currentSlide).css({zIndex:1}).animate({opacity:0},r.vars.animationSpeed,r.vars.easing);r.slides.eq(t).css({zIndex:2}).animate({opacity:1},r.vars.animationSpeed,r.vars.easing,r.wrapup)}else{r.slides.eq(r.currentSlide).css({opacity:0,zIndex:1});r.slides.eq(t).css({opacity:1,zIndex:2});r.wrapup(m)}r.vars.smoothHeight&&v.smoothHeight(r.vars.animationSpeed)}};r.wrapup=function(e){!p&&!h&&(r.currentSlide===0&&r.animatingTo===r.last&&r.vars.animationLoop?r.setProps(e,"jumpEnd"):r.currentSlide===r.last&&r.animatingTo===0&&r.vars.animationLoop&&r.setProps(e,"jumpStart"));r.animating=!1;r.currentSlide=r.animatingTo;r.vars.after(r)};r.animateSlides=function(){!r.animating&&m&&r.flexAnimate(r.getTarget("next"))};r.pause=function(){clearInterval(r.animatedSlides);r.animatedSlides=null;r.playing=!1;r.vars.pausePlay&&v.pausePlay.update("play");r.syncExists&&v.sync("pause")};r.play=function(){r.playing&&clearInterval(r.animatedSlides);r.animatedSlides=r.animatedSlides||setInterval(r.animateSlides,r.vars.slideshowSpeed);r.started=r.playing=!0;r.vars.pausePlay&&v.pausePlay.update("pause");r.syncExists&&v.sync("play")};r.stop=function(){r.pause();r.stopped=!0};r.canAdvance=function(e,t){var n=d?r.pagingCount-1:r.last;return t?!0:d&&r.currentItem===r.count-1&&e===0&&r.direction==="prev"?!0:d&&r.currentItem===0&&e===r.pagingCount-1&&r.direction!=="next"?!1:e===r.currentSlide&&!d?!1:r.vars.animationLoop?!0:r.atEnd&&r.currentSlide===0&&e===n&&r.direction!=="next"?!1:r.atEnd&&r.currentSlide===n&&e===0&&r.direction==="next"?!1:!0};r.getTarget=function(e){r.direction=e;return e==="next"?r.currentSlide===r.last?0:r.currentSlide+1:r.currentSlide===0?r.last:r.currentSlide-1};r.setProps=function(e,t,n){var i=function(){var n=e?e:(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo,i=function(){if(h)return t==="setTouch"?e:c&&r.animatingTo===r.last?0:c?r.limit-(r.itemW+r.vars.itemMargin)*r.move*r.animatingTo:r.animatingTo===r.last?r.limit:n;switch(t){case"setTotal":return c?(r.count-1-r.currentSlide+r.cloneOffset)*e:(r.currentSlide+r.cloneOffset)*e;case"setTouch":return c?e:e;case"jumpEnd":return c?e:r.count*e;case"jumpStart":return c?r.count*e:e;default:return e}}();return i*-1+"px"}();if(r.transitions){i=l?"translate3d(0,"+i+",0)":"translate3d("+i+",0,0)";n=n!==undefined?n/1e3+"s":"0s";r.container.css("-"+r.pfx+"-transition-duration",n)}r.args[r.prop]=i;(r.transitions||n===undefined)&&r.container.css(r.args)};r.setup=function(t){if(!p){var n,s;if(t==="init"){r.viewport=e('<div class="'+i+'viewport"></div>').css({overflow:"hidden",position:"relative"}).appendTo(r).append(r.container);r.cloneCount=0;r.cloneOffset=0;if(c){s=e.makeArray(r.slides).reverse();r.slides=e(s);r.container.empty().append(r.slides)}}if(r.vars.animationLoop&&!h){r.cloneCount=2;r.cloneOffset=1;t!=="init"&&r.container.find(".clone").remove();r.container.append(r.slides.first().clone().addClass("clone").attr("aria-hidden","true")).prepend(r.slides.last().clone().addClass("clone").attr("aria-hidden","true"))}r.newSlides=e(r.vars.selector,r);n=c?r.count-1-r.currentSlide+r.cloneOffset:r.currentSlide+r.cloneOffset;if(l&&!h){r.container.height((r.count+r.cloneCount)*200+"%").css("position","absolute").width("100%");setTimeout(function(){r.newSlides.css({display:"block"});r.doMath();r.viewport.height(r.h);r.setProps(n*r.h,"init")},t==="init"?100:0)}else{r.container.width((r.count+r.cloneCount)*200+"%");r.setProps(n*r.computedW,"init");setTimeout(function(){r.doMath();r.newSlides.css({width:r.computedW,"float":"left",display:"block"});r.vars.smoothHeight&&v.smoothHeight()},t==="init"?100:0)}}else{r.slides.css({width:"100%","float":"left",marginRight:"-100%",position:"relative"});t==="init"&&(o?r.slides.css({opacity:0,display:"block",webkitTransition:"opacity "+r.vars.animationSpeed/1e3+"s ease",zIndex:1}).eq(r.currentSlide).css({opacity:1,zIndex:2}):r.slides.css({opacity:0,display:"block",zIndex:1}).eq(r.currentSlide).css({zIndex:2}).animate({opacity:1},r.vars.animationSpeed,r.vars.easing));r.vars.smoothHeight&&v.smoothHeight()}h||r.slides.removeClass(i+"active-slide").eq(r.currentSlide).addClass(i+"active-slide")};r.doMath=function(){var e=r.slides.first(),t=r.vars.itemMargin,n=r.vars.minItems,i=r.vars.maxItems;r.w=r.viewport===undefined?r.width():r.viewport.width();r.h=e.height();r.boxPadding=e.outerWidth()-e.width();if(h){r.itemT=r.vars.itemWidth+t;r.minW=n?n*r.itemT:r.w;r.maxW=i?i*r.itemT-t:r.w;r.itemW=r.minW>r.w?(r.w-t*(n-1))/n:r.maxW<r.w?(r.w-t*(i-1))/i:r.vars.itemWidth>r.w?r.w:r.vars.itemWidth;r.visible=Math.floor(r.w/r.itemW);r.move=r.vars.move>0&&r.vars.move<r.visible?r.vars.move:r.visible;r.pagingCount=Math.ceil((r.count-r.visible)/r.move+1);r.last=r.pagingCount-1;r.limit=r.pagingCount===1?0:r.vars.itemWidth>r.w?r.itemW*(r.count-1)+t*(r.count-1):(r.itemW+t)*r.count-r.w-t}else{r.itemW=r.w;r.pagingCount=r.count;r.last=r.count-1}r.computedW=r.itemW-r.boxPadding};r.update=function(e,t){r.doMath();if(!h){e<r.currentSlide?r.currentSlide+=1:e<=r.currentSlide&&e!==0&&(r.currentSlide-=1);r.animatingTo=r.currentSlide}if(r.vars.controlNav&&!r.manualControls)if(t==="add"&&!h||r.pagingCount>r.controlNav.length)v.controlNav.update("add");else if(t==="remove"&&!h||r.pagingCount<r.controlNav.length){if(h&&r.currentSlide>r.last){r.currentSlide-=1;r.animatingTo-=1}v.controlNav.update("remove",r.last)}r.vars.directionNav&&v.directionNav.update()};r.addSlide=function(t,n){var i=e(t);r.count+=1;r.last=r.count-1;l&&c?n!==undefined?r.slides.eq(r.count-n).after(i):r.container.prepend(i):n!==undefined?r.slides.eq(n).before(i):r.container.append(i);r.update(n,"add");r.slides=e(r.vars.selector+":not(.clone)",r);r.setup();r.vars.added(r)};r.removeSlide=function(t){var n=isNaN(t)?r.slides.index(e(t)):t;r.count-=1;r.last=r.count-1;isNaN(t)?e(t,r.slides).remove():l&&c?r.slides.eq(r.last).remove():r.slides.eq(t).remove();r.doMath();r.update(n,"remove");r.slides=e(r.vars.selector+":not(.clone)",r);r.setup();r.vars.removed(r)};v.init()};e(window).blur(function(e){focused=!1}).focus(function(e){focused=!0});e.flexslider.defaults={namespace:"flex-",selector:".slides > li",animation:"fade",easing:"swing",direction:"horizontal",reverse:!1,animationLoop:!0,smoothHeight:!1,startAt:0,slideshow:!0,slideshowSpeed:7e3,animationSpeed:600,initDelay:0,randomize:!1,thumbCaptions:!1,pauseOnAction:!0,pauseOnHover:!1,pauseInvisible:!0,useCSS:!0,touch:!0,video:!1,controlNav:!0,directionNav:!0,prevText:"Previous",nextText:"Next",keyboard:!0,multipleKeyboard:!1,mousewheel:!1,pausePlay:!1,pauseText:"Pause",playText:"Play",controlsContainer:"",manualControls:"",sync:"",asNavFor:"",itemWidth:0,itemMargin:0,minItems:1,maxItems:0,move:0,allowOneSlide:!0,start:function(){},before:function(){},after:function(){},end:function(){},added:function(){},removed:function(){}};e.fn.flexslider=function(t){t===undefined&&(t={});if(typeof t=="object")return this.each(function(){var n=e(this),r=t.selector?t.selector:".slides > li",i=n.find(r);if(i.length===1&&t.allowOneSlide===!0||i.length===0){i.fadeIn(400);t.start&&t.start(n)}else n.data("flexslider")===undefined&&new e.flexslider(this,t)});var n=e(this).data("flexslider");switch(t){case"play":n.play();break;case"pause":n.pause();break;case"stop":n.stop();break;case"next":n.flexAnimate(n.getTarget("next"),!0);break;case"prev":case"previous":n.flexAnimate(n.getTarget("prev"),!0);break;default:typeof t=="number"&&n.flexAnimate(t,!0)}}})(jQuery);
@@ -1,54 +1,64 @@
1
1
  /*
2
- * jQuery FlexSlider v2.0
3
- * http://www.woothemes.com/flexslider/
4
- *
2
+ * jQuery FlexSlider v2.2.0
5
3
  * Copyright 2012 WooThemes
6
- * Free to use under the GPLv2 license.
7
- * http://www.gnu.org/licenses/gpl-2.0.html
8
- *
9
- * Contributing author: Tyler Smith (@mbmufffin)
4
+ * Contributing Author: Tyler Smith
10
5
  */
11
-
12
- ;(function ($) {
6
+ ;
7
+ (function ($) {
13
8
 
14
9
  //FlexSlider: Object Instance
15
10
  $.flexslider = function(el, options) {
16
- var slider = $(el),
17
- vars = $.extend({}, $.flexslider.defaults, options),
18
- namespace = vars.namespace,
19
- touch = ("ontouchstart" in window) || window.DocumentTouch && document instanceof DocumentTouch,
20
- eventType = (touch) ? "touchend" : "click",
21
- vertical = vars.direction === "vertical",
22
- reverse = vars.reverse,
23
- carousel = (vars.itemWidth > 0),
24
- fade = vars.animation === "fade",
25
- asNav = vars.asNavFor !== "",
26
- methods = {};
27
-
11
+ var slider = $(el);
12
+
13
+ // making variables public
14
+ slider.vars = $.extend({}, $.flexslider.defaults, options);
15
+
16
+ var namespace = slider.vars.namespace,
17
+ msGesture = window.navigator && window.navigator.msPointerEnabled && window.MSGesture,
18
+ touch = (( "ontouchstart" in window ) || msGesture || window.DocumentTouch && document instanceof DocumentTouch) && slider.vars.touch,
19
+ // depricating this idea, as devices are being released with both of these events
20
+ //eventType = (touch) ? "touchend" : "click",
21
+ eventType = "click touchend MSPointerUp",
22
+ watchedEvent = "",
23
+ watchedEventClearTimer,
24
+ vertical = slider.vars.direction === "vertical",
25
+ reverse = slider.vars.reverse,
26
+ carousel = (slider.vars.itemWidth > 0),
27
+ fade = slider.vars.animation === "fade",
28
+ asNav = slider.vars.asNavFor !== "",
29
+ methods = {},
30
+ focused = true;
31
+
28
32
  // Store a reference to the slider object
29
33
  $.data(el, "flexslider", slider);
30
-
31
- // Privat slider methods
34
+
35
+ // Private slider methods
32
36
  methods = {
33
37
  init: function() {
34
38
  slider.animating = false;
35
- slider.currentSlide = vars.startAt;
39
+ // Get current slide and make sure it is a number
40
+ slider.currentSlide = parseInt( ( slider.vars.startAt ? slider.vars.startAt : 0) );
41
+ if ( isNaN( slider.currentSlide ) ) slider.currentSlide = 0;
36
42
  slider.animatingTo = slider.currentSlide;
37
43
  slider.atEnd = (slider.currentSlide === 0 || slider.currentSlide === slider.last);
38
- slider.containerSelector = vars.selector.substr(0,vars.selector.search(' '));
39
- slider.slides = $(vars.selector, slider);
44
+ slider.containerSelector = slider.vars.selector.substr(0,slider.vars.selector.search(' '));
45
+ slider.slides = $(slider.vars.selector, slider);
40
46
  slider.container = $(slider.containerSelector, slider);
41
47
  slider.count = slider.slides.length;
42
48
  // SYNC:
43
- slider.syncExists = $(vars.sync).length > 0;
49
+ slider.syncExists = $(slider.vars.sync).length > 0;
44
50
  // SLIDE:
45
- if (vars.animation === "slide") vars.animation = "swing";
51
+ if (slider.vars.animation === "slide") slider.vars.animation = "swing";
46
52
  slider.prop = (vertical) ? "top" : "marginLeft";
47
53
  slider.args = {};
48
54
  // SLIDESHOW:
49
55
  slider.manualPause = false;
56
+ slider.stopped = false;
57
+ //PAUSE WHEN INVISIBLE
58
+ slider.started = false;
59
+ slider.startTimeout = null;
50
60
  // TOUCH/USECSS:
51
- slider.transitions = !vars.video && !fade && vars.useCSS && (function() {
61
+ slider.transitions = !slider.vars.video && !fade && slider.vars.useCSS && (function() {
52
62
  var obj = document.createElement('div'),
53
63
  props = ['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective'];
54
64
  for (var i in props) {
@@ -61,76 +71,83 @@
61
71
  return false;
62
72
  }());
63
73
  // CONTROLSCONTAINER:
64
- if (vars.controlsContainer !== "") slider.controlsContainer = $(vars.controlsContainer).length > 0 && $(vars.controlsContainer);
74
+ if (slider.vars.controlsContainer !== "") slider.controlsContainer = $(slider.vars.controlsContainer).length > 0 && $(slider.vars.controlsContainer);
65
75
  // MANUAL:
66
- if (vars.manualControls !== "") slider.manualControls = $(vars.manualControls).length > 0 && $(vars.manualControls);
67
-
76
+ if (slider.vars.manualControls !== "") slider.manualControls = $(slider.vars.manualControls).length > 0 && $(slider.vars.manualControls);
77
+
68
78
  // RANDOMIZE:
69
- if (vars.randomize) {
79
+ if (slider.vars.randomize) {
70
80
  slider.slides.sort(function() { return (Math.round(Math.random())-0.5); });
71
81
  slider.container.empty().append(slider.slides);
72
82
  }
73
-
83
+
74
84
  slider.doMath();
75
-
76
- // ASNAV:
77
- if (asNav) methods.asNav.setup();
78
-
85
+
79
86
  // INIT
80
87
  slider.setup("init");
81
-
88
+
82
89
  // CONTROLNAV:
83
- if (vars.controlNav) methods.controlNav.setup();
84
-
90
+ if (slider.vars.controlNav) methods.controlNav.setup();
91
+
85
92
  // DIRECTIONNAV:
86
- if (vars.directionNav) methods.directionNav.setup();
87
-
93
+ if (slider.vars.directionNav) methods.directionNav.setup();
94
+
88
95
  // KEYBOARD:
89
- if (vars.keyboard && ($(slider.containerSelector).length === 1 || vars.multipleKeyboard)) {
96
+ if (slider.vars.keyboard && ($(slider.containerSelector).length === 1 || slider.vars.multipleKeyboard)) {
90
97
  $(document).bind('keyup', function(event) {
91
98
  var keycode = event.keyCode;
92
99
  if (!slider.animating && (keycode === 39 || keycode === 37)) {
93
100
  var target = (keycode === 39) ? slider.getTarget('next') :
94
101
  (keycode === 37) ? slider.getTarget('prev') : false;
95
- slider.flexAnimate(target, vars.pauseOnAction);
102
+ slider.flexAnimate(target, slider.vars.pauseOnAction);
96
103
  }
97
104
  });
98
105
  }
99
106
  // MOUSEWHEEL:
100
- if (vars.mousewheel) {
107
+ if (slider.vars.mousewheel) {
101
108
  slider.bind('mousewheel', function(event, delta, deltaX, deltaY) {
102
109
  event.preventDefault();
103
110
  var target = (delta < 0) ? slider.getTarget('next') : slider.getTarget('prev');
104
- slider.flexAnimate(target, vars.pauseOnAction);
111
+ slider.flexAnimate(target, slider.vars.pauseOnAction);
105
112
  });
106
113
  }
107
-
114
+
108
115
  // PAUSEPLAY
109
- if (vars.pausePlay) methods.pausePlay.setup();
110
-
116
+ if (slider.vars.pausePlay) methods.pausePlay.setup();
117
+
118
+ //PAUSE WHEN INVISIBLE
119
+ if (slider.vars.slideshow && slider.vars.pauseInvisible) methods.pauseInvisible.init();
120
+
111
121
  // SLIDSESHOW
112
- if (vars.slideshow) {
113
- if (vars.pauseOnHover) {
122
+ if (slider.vars.slideshow) {
123
+ if (slider.vars.pauseOnHover) {
114
124
  slider.hover(function() {
115
- slider.pause();
125
+ if (!slider.manualPlay && !slider.manualPause) slider.pause();
116
126
  }, function() {
117
- if (!slider.manualPause) slider.play();
127
+ if (!slider.manualPause && !slider.manualPlay && !slider.stopped) slider.play();
118
128
  });
119
129
  }
120
130
  // initialize animation
121
- (vars.initDelay > 0) ? setTimeout(slider.play, vars.initDelay) : slider.play();
131
+ //If we're visible, or we don't use PageVisibility API
132
+ if(!slider.vars.pauseInvisible || !methods.pauseInvisible.isHidden()) {
133
+ (slider.vars.initDelay > 0) ? slider.startTimeout = setTimeout(slider.play, slider.vars.initDelay) : slider.play();
134
+ }
122
135
  }
123
-
136
+
137
+ // ASNAV:
138
+ if (asNav) methods.asNav.setup();
139
+
124
140
  // TOUCH
125
- if (touch && vars.touch) methods.touch();
126
-
141
+ if (touch && slider.vars.touch) methods.touch();
142
+
127
143
  // FADE&&SMOOTHHEIGHT || SLIDE:
128
- if (!fade || (fade && vars.smoothHeight)) $(window).bind("resize focus", methods.resize);
129
-
130
-
144
+ if (!fade || (fade && slider.vars.smoothHeight)) $(window).bind("resize orientationchange focus", methods.resize);
145
+
146
+ slider.find("img").attr("draggable", "false");
147
+
131
148
  // API: start() Callback
132
149
  setTimeout(function(){
133
- vars.start(slider);
150
+ slider.vars.start(slider);
134
151
  }, 200);
135
152
  },
136
153
  asNav: {
@@ -139,15 +156,41 @@
139
156
  slider.animatingTo = Math.floor(slider.currentSlide/slider.move);
140
157
  slider.currentItem = slider.currentSlide;
141
158
  slider.slides.removeClass(namespace + "active-slide").eq(slider.currentItem).addClass(namespace + "active-slide");
142
- slider.slides.click(function(e){
143
- e.preventDefault();
144
- var $slide = $(this),
145
- target = $slide.index();
146
- if (!$(vars.asNavFor).data('flexslider').animating && !$slide.hasClass('active')) {
147
- slider.direction = (slider.currentItem < target) ? "next" : "prev";
148
- slider.flexAnimate(target, vars.pauseOnAction, false, true, true);
149
- }
150
- });
159
+ if(!msGesture){
160
+ slider.slides.click(function(e){
161
+ e.preventDefault();
162
+ var $slide = $(this),
163
+ target = $slide.index();
164
+ var posFromLeft = $slide.offset().left - $(slider).scrollLeft(); // Find position of slide relative to left of slider container
165
+ if( posFromLeft <= 0 && $slide.hasClass( namespace + 'active-slide' ) ) {
166
+ slider.flexAnimate(slider.getTarget("prev"), true);
167
+ } else if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass(namespace + "active-slide")) {
168
+ slider.direction = (slider.currentItem < target) ? "next" : "prev";
169
+ slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true);
170
+ }
171
+ });
172
+ }else{
173
+ el._slider = slider;
174
+ slider.slides.each(function (){
175
+ var that = this;
176
+ that._gesture = new MSGesture();
177
+ that._gesture.target = that;
178
+ that.addEventListener("MSPointerDown", function (e){
179
+ e.preventDefault();
180
+ if(e.currentTarget._gesture)
181
+ e.currentTarget._gesture.addPointer(e.pointerId);
182
+ }, false);
183
+ that.addEventListener("MSGestureTap", function (e){
184
+ e.preventDefault();
185
+ var $slide = $(this),
186
+ target = $slide.index();
187
+ if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass('active')) {
188
+ slider.direction = (slider.currentItem < target) ? "next" : "prev";
189
+ slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true);
190
+ }
191
+ });
192
+ });
193
+ }
151
194
  }
152
195
  },
153
196
  controlNav: {
@@ -159,66 +202,79 @@
159
202
  }
160
203
  },
161
204
  setupPaging: function() {
162
- var type = (vars.controlNav === "thumbnails") ? 'control-thumbs' : 'control-paging',
205
+ var type = (slider.vars.controlNav === "thumbnails") ? 'control-thumbs' : 'control-paging',
163
206
  j = 1,
164
- item;
165
-
207
+ item,
208
+ slide;
209
+
166
210
  slider.controlNavScaffold = $('<ol class="'+ namespace + 'control-nav ' + namespace + type + '"></ol>');
167
-
211
+
168
212
  if (slider.pagingCount > 1) {
169
213
  for (var i = 0; i < slider.pagingCount; i++) {
170
- item = (vars.controlNav === "thumbnails") ? '<img src="' + slider.slides.eq(i).attr("data-thumb") + '"/>' : '<a>' + j + '</a>';
214
+ slide = slider.slides.eq(i);
215
+ item = (slider.vars.controlNav === "thumbnails") ? '<img src="' + slide.attr( 'data-thumb' ) + '"/>' : '<a>' + j + '</a>';
216
+ if ( 'thumbnails' === slider.vars.controlNav && true === slider.vars.thumbCaptions ) {
217
+ var captn = slide.attr( 'data-thumbcaption' );
218
+ if ( '' != captn && undefined != captn ) item += '<span class="' + namespace + 'caption">' + captn + '</span>';
219
+ }
171
220
  slider.controlNavScaffold.append('<li>' + item + '</li>');
172
221
  j++;
173
222
  }
174
223
  }
175
-
224
+
176
225
  // CONTROLSCONTAINER:
177
226
  (slider.controlsContainer) ? $(slider.controlsContainer).append(slider.controlNavScaffold) : slider.append(slider.controlNavScaffold);
178
227
  methods.controlNav.set();
179
-
228
+
180
229
  methods.controlNav.active();
181
-
230
+
182
231
  slider.controlNavScaffold.delegate('a, img', eventType, function(event) {
183
232
  event.preventDefault();
184
- var $this = $(this),
185
- target = slider.controlNav.index($this);
186
233
 
187
- if (!$this.hasClass(namespace + 'active')) {
188
- slider.direction = (target > slider.currentSlide) ? "next" : "prev";
189
- slider.flexAnimate(target, vars.pauseOnAction);
234
+ if (watchedEvent === "" || watchedEvent === event.type) {
235
+ var $this = $(this),
236
+ target = slider.controlNav.index($this);
237
+
238
+ if (!$this.hasClass(namespace + 'active')) {
239
+ slider.direction = (target > slider.currentSlide) ? "next" : "prev";
240
+ slider.flexAnimate(target, slider.vars.pauseOnAction);
241
+ }
242
+ }
243
+
244
+ // setup flags to prevent event duplication
245
+ if (watchedEvent === "") {
246
+ watchedEvent = event.type;
190
247
  }
248
+ methods.setToClearWatchedEvent();
249
+
191
250
  });
192
- // Prevent iOS click event bug
193
- if (touch) {
194
- slider.controlNavScaffold.delegate('a', "click touchstart", function(event) {
195
- event.preventDefault();
196
- });
197
- }
198
251
  },
199
252
  setupManual: function() {
200
253
  slider.controlNav = slider.manualControls;
201
254
  methods.controlNav.active();
202
-
203
- slider.controlNav.live(eventType, function(event) {
255
+
256
+ slider.controlNav.bind(eventType, function(event) {
204
257
  event.preventDefault();
205
- var $this = $(this),
206
- target = slider.controlNav.index($this);
207
-
208
- if (!$this.hasClass(namespace + 'active')) {
209
- (target > slider.currentSlide) ? slider.direction = "next" : slider.direction = "prev";
210
- slider.flexAnimate(target, vars.pauseOnAction);
258
+
259
+ if (watchedEvent === "" || watchedEvent === event.type) {
260
+ var $this = $(this),
261
+ target = slider.controlNav.index($this);
262
+
263
+ if (!$this.hasClass(namespace + 'active')) {
264
+ (target > slider.currentSlide) ? slider.direction = "next" : slider.direction = "prev";
265
+ slider.flexAnimate(target, slider.vars.pauseOnAction);
266
+ }
211
267
  }
268
+
269
+ // setup flags to prevent event duplication
270
+ if (watchedEvent === "") {
271
+ watchedEvent = event.type;
272
+ }
273
+ methods.setToClearWatchedEvent();
212
274
  });
213
- // Prevent iOS click event bug
214
- if (touch) {
215
- slider.controlNav.live("click touchstart", function(event) {
216
- event.preventDefault();
217
- });
218
- }
219
275
  },
220
276
  set: function() {
221
- var selector = (vars.controlNav === "thumbnails") ? 'img' : 'a';
277
+ var selector = (slider.vars.controlNav === "thumbnails") ? 'img' : 'a';
222
278
  slider.controlNav = $('.' + namespace + 'control-nav li ' + selector, (slider.controlsContainer) ? slider.controlsContainer : slider);
223
279
  },
224
280
  active: function() {
@@ -238,8 +294,8 @@
238
294
  },
239
295
  directionNav: {
240
296
  setup: function() {
241
- var directionNavScaffold = $('<ul class="' + namespace + 'direction-nav"><li><a class="' + namespace + 'prev" href="#">' + vars.prevText + '</a></li><li><a class="' + namespace + 'next" href="#">' + vars.nextText + '</a></li></ul>');
242
-
297
+ var directionNavScaffold = $('<ul class="' + namespace + 'direction-nav"><li><a class="' + namespace + 'prev" href="#">' + slider.vars.prevText + '</a></li><li><a class="' + namespace + 'next" href="#">' + slider.vars.nextText + '</a></li></ul>');
298
+
243
299
  // CONTROLSCONTAINER:
244
300
  if (slider.controlsContainer) {
245
301
  $(slider.controlsContainer).append(directionNavScaffold);
@@ -248,40 +304,46 @@
248
304
  slider.append(directionNavScaffold);
249
305
  slider.directionNav = $('.' + namespace + 'direction-nav li a', slider);
250
306
  }
251
-
307
+
252
308
  methods.directionNav.update();
253
-
309
+
254
310
  slider.directionNav.bind(eventType, function(event) {
255
311
  event.preventDefault();
256
- var target = ($(this).hasClass(namespace + 'next')) ? slider.getTarget('next') : slider.getTarget('prev');
257
- slider.flexAnimate(target, vars.pauseOnAction);
312
+ var target;
313
+
314
+ if (watchedEvent === "" || watchedEvent === event.type) {
315
+ target = ($(this).hasClass(namespace + 'next')) ? slider.getTarget('next') : slider.getTarget('prev');
316
+ slider.flexAnimate(target, slider.vars.pauseOnAction);
317
+ }
318
+
319
+ // setup flags to prevent event duplication
320
+ if (watchedEvent === "") {
321
+ watchedEvent = event.type;
322
+ }
323
+ methods.setToClearWatchedEvent();
258
324
  });
259
- // Prevent iOS click event bug
260
- if (touch) {
261
- slider.directionNav.bind("click touchstart", function(event) {
262
- event.preventDefault();
263
- });
264
- }
265
325
  },
266
326
  update: function() {
267
327
  var disabledClass = namespace + 'disabled';
268
- if (!vars.animationLoop) {
269
- if (slider.pagingCount === 1) {
270
- slider.directionNav.addClass(disabledClass);
271
- } else if (slider.animatingTo === 0) {
272
- slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "prev").addClass(disabledClass);
328
+ if (slider.pagingCount === 1) {
329
+ slider.directionNav.addClass(disabledClass).attr('tabindex', '-1');
330
+ } else if (!slider.vars.animationLoop) {
331
+ if (slider.animatingTo === 0) {
332
+ slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "prev").addClass(disabledClass).attr('tabindex', '-1');
273
333
  } else if (slider.animatingTo === slider.last) {
274
- slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "next").addClass(disabledClass);
334
+ slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "next").addClass(disabledClass).attr('tabindex', '-1');
275
335
  } else {
276
- slider.directionNav.removeClass(disabledClass);
336
+ slider.directionNav.removeClass(disabledClass).removeAttr('tabindex');
277
337
  }
338
+ } else {
339
+ slider.directionNav.removeClass(disabledClass).removeAttr('tabindex');
278
340
  }
279
341
  }
280
342
  },
281
343
  pausePlay: {
282
344
  setup: function() {
283
345
  var pausePlayScaffold = $('<div class="' + namespace + 'pauseplay"><a></a></div>');
284
-
346
+
285
347
  // CONTROLSCONTAINER:
286
348
  if (slider.controlsContainer) {
287
349
  slider.controlsContainer.append(pausePlayScaffold);
@@ -290,29 +352,33 @@
290
352
  slider.append(pausePlayScaffold);
291
353
  slider.pausePlay = $('.' + namespace + 'pauseplay a', slider);
292
354
  }
293
-
294
- // slider.pausePlay.addClass(pausePlayState).text((pausePlayState == 'pause') ? vars.pauseText : vars.playText);
295
- methods.pausePlay.update((vars.slideshow) ? namespace + 'pause' : namespace + 'play');
296
-
355
+
356
+ methods.pausePlay.update((slider.vars.slideshow) ? namespace + 'pause' : namespace + 'play');
357
+
297
358
  slider.pausePlay.bind(eventType, function(event) {
298
359
  event.preventDefault();
299
- if ($(this).hasClass(namespace + 'pause')) {
300
- slider.pause();
301
- slider.manualPause = true;
302
- } else {
303
- slider.play();
304
- slider.manualPause = false;
360
+
361
+ if (watchedEvent === "" || watchedEvent === event.type) {
362
+ if ($(this).hasClass(namespace + 'pause')) {
363
+ slider.manualPause = true;
364
+ slider.manualPlay = false;
365
+ slider.pause();
366
+ } else {
367
+ slider.manualPause = false;
368
+ slider.manualPlay = true;
369
+ slider.play();
370
+ }
305
371
  }
372
+
373
+ // setup flags to prevent event duplication
374
+ if (watchedEvent === "") {
375
+ watchedEvent = event.type;
376
+ }
377
+ methods.setToClearWatchedEvent();
306
378
  });
307
- // Prevent iOS click event bug
308
- if (touch) {
309
- slider.pausePlay.bind("click touchstart", function(event) {
310
- event.preventDefault();
311
- });
312
- }
313
379
  },
314
380
  update: function(state) {
315
- (state === "play") ? slider.pausePlay.removeClass(namespace + 'pause').addClass(namespace + 'play').text(vars.playText) : slider.pausePlay.removeClass(namespace + 'play').addClass(namespace + 'pause').text(vars.pauseText);
381
+ (state === "play") ? slider.pausePlay.removeClass(namespace + 'pause').addClass(namespace + 'play').html(slider.vars.playText) : slider.pausePlay.removeClass(namespace + 'play').addClass(namespace + 'pause').html(slider.vars.pauseText);
316
382
  }
317
383
  },
318
384
  touch: function() {
@@ -322,70 +388,175 @@
322
388
  cwidth,
323
389
  dx,
324
390
  startT,
325
- scrolling = false;
326
-
327
- el.addEventListener('touchstart', onTouchStart, false);
328
- function onTouchStart(e) {
329
- if (slider.animating) {
330
- e.preventDefault();
331
- } else if (e.touches.length === 1) {
332
- slider.pause();
333
- // CAROUSEL:
334
- cwidth = (vertical) ? slider.h : slider. w;
335
- startT = Number(new Date());
336
- // CAROUSEL:
337
- offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 :
338
- (carousel && reverse) ? slider.limit - (((slider.itemW + vars.itemMargin) * slider.move) * slider.animatingTo) :
339
- (carousel && slider.currentSlide === slider.last) ? slider.limit :
340
- (carousel) ? ((slider.itemW + vars.itemMargin) * slider.move) * slider.currentSlide :
341
- (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth;
342
- startX = (vertical) ? e.touches[0].pageY : e.touches[0].pageX;
343
- startY = (vertical) ? e.touches[0].pageX : e.touches[0].pageY;
344
-
345
- el.addEventListener('touchmove', onTouchMove, false);
346
- el.addEventListener('touchend', onTouchEnd, false);
347
- }
348
- }
391
+ scrolling = false,
392
+ localX = 0,
393
+ localY = 0,
394
+ accDx = 0;
349
395
 
350
- function onTouchMove(e) {
351
- dx = (vertical) ? startX - e.touches[0].pageY : startX - e.touches[0].pageX;
352
- scrolling = (vertical) ? (Math.abs(dx) < Math.abs(e.touches[0].pageX - startY)) : (Math.abs(dx) < Math.abs(e.touches[0].pageY - startY));
353
-
354
- if (!scrolling || Number(new Date()) - startT > 500) {
355
- e.preventDefault();
356
- if (!fade && slider.transitions) {
357
- if (!vars.animationLoop) {
358
- dx = dx/((slider.currentSlide === 0 && dx < 0 || slider.currentSlide === slider.last && dx > 0) ? (Math.abs(dx)/cwidth+2) : 1);
396
+ if(!msGesture){
397
+ el.addEventListener('touchstart', onTouchStart, false);
398
+
399
+ function onTouchStart(e) {
400
+ if (slider.animating) {
401
+ e.preventDefault();
402
+ } else if ( ( window.navigator.msPointerEnabled ) || e.touches.length === 1 ) {
403
+ slider.pause();
404
+ // CAROUSEL:
405
+ cwidth = (vertical) ? slider.h : slider. w;
406
+ startT = Number(new Date());
407
+ // CAROUSEL:
408
+
409
+ // Local vars for X and Y points.
410
+ localX = e.touches[0].pageX;
411
+ localY = e.touches[0].pageY;
412
+
413
+ offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 :
414
+ (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
415
+ (carousel && slider.currentSlide === slider.last) ? slider.limit :
416
+ (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide :
417
+ (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth;
418
+ startX = (vertical) ? localY : localX;
419
+ startY = (vertical) ? localX : localY;
420
+
421
+ el.addEventListener('touchmove', onTouchMove, false);
422
+ el.addEventListener('touchend', onTouchEnd, false);
359
423
  }
360
- slider.setProps(offset + dx, "setTouch");
361
424
  }
362
- }
363
- }
364
-
365
- function onTouchEnd(e) {
366
- if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) {
367
- var updateDx = (reverse) ? -dx : dx,
368
- target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev');
369
-
370
- if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 20 || Math.abs(updateDx) > cwidth/2)) {
371
- slider.flexAnimate(target, vars.pauseOnAction);
372
- } else {
373
- slider.flexAnimate(slider.currentSlide, vars.pauseOnAction, true);
425
+
426
+ function onTouchMove(e) {
427
+ // Local vars for X and Y points.
428
+
429
+ localX = e.touches[0].pageX;
430
+ localY = e.touches[0].pageY;
431
+
432
+ dx = (vertical) ? startX - localY : startX - localX;
433
+ scrolling = (vertical) ? (Math.abs(dx) < Math.abs(localX - startY)) : (Math.abs(dx) < Math.abs(localY - startY));
434
+
435
+ var fxms = 500;
436
+
437
+ if ( ! scrolling || Number( new Date() ) - startT > fxms ) {
438
+ e.preventDefault();
439
+ if (!fade && slider.transitions) {
440
+ if (!slider.vars.animationLoop) {
441
+ dx = dx/((slider.currentSlide === 0 && dx < 0 || slider.currentSlide === slider.last && dx > 0) ? (Math.abs(dx)/cwidth+2) : 1);
442
+ }
443
+ slider.setProps(offset + dx, "setTouch");
444
+ }
445
+ }
446
+ }
447
+
448
+ function onTouchEnd(e) {
449
+ // finish the touch by undoing the touch session
450
+ el.removeEventListener('touchmove', onTouchMove, false);
451
+
452
+ if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) {
453
+ var updateDx = (reverse) ? -dx : dx,
454
+ target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev');
455
+
456
+ if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) {
457
+ slider.flexAnimate(target, slider.vars.pauseOnAction);
458
+ } else {
459
+ if (!fade) slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true);
460
+ }
461
+ }
462
+ el.removeEventListener('touchend', onTouchEnd, false);
463
+
464
+ startX = null;
465
+ startY = null;
466
+ dx = null;
467
+ offset = null;
468
+ }
469
+ }else{
470
+ el.style.msTouchAction = "none";
471
+ el._gesture = new MSGesture();
472
+ el._gesture.target = el;
473
+ el.addEventListener("MSPointerDown", onMSPointerDown, false);
474
+ el._slider = slider;
475
+ el.addEventListener("MSGestureChange", onMSGestureChange, false);
476
+ el.addEventListener("MSGestureEnd", onMSGestureEnd, false);
477
+
478
+ function onMSPointerDown(e){
479
+ e.stopPropagation();
480
+ if (slider.animating) {
481
+ e.preventDefault();
482
+ }else{
483
+ slider.pause();
484
+ el._gesture.addPointer(e.pointerId);
485
+ accDx = 0;
486
+ cwidth = (vertical) ? slider.h : slider. w;
487
+ startT = Number(new Date());
488
+ // CAROUSEL:
489
+
490
+ offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 :
491
+ (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
492
+ (carousel && slider.currentSlide === slider.last) ? slider.limit :
493
+ (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide :
494
+ (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth;
495
+ }
496
+ }
497
+
498
+ function onMSGestureChange(e) {
499
+ e.stopPropagation();
500
+ var slider = e.target._slider;
501
+ if(!slider){
502
+ return;
503
+ }
504
+ var transX = -e.translationX,
505
+ transY = -e.translationY;
506
+
507
+ //Accumulate translations.
508
+ accDx = accDx + ((vertical) ? transY : transX);
509
+ dx = accDx;
510
+ scrolling = (vertical) ? (Math.abs(accDx) < Math.abs(-transX)) : (Math.abs(accDx) < Math.abs(-transY));
511
+
512
+ if(e.detail === e.MSGESTURE_FLAG_INERTIA){
513
+ setImmediate(function (){
514
+ el._gesture.stop();
515
+ });
516
+
517
+ return;
518
+ }
519
+
520
+ if (!scrolling || Number(new Date()) - startT > 500) {
521
+ e.preventDefault();
522
+ if (!fade && slider.transitions) {
523
+ if (!slider.vars.animationLoop) {
524
+ dx = accDx / ((slider.currentSlide === 0 && accDx < 0 || slider.currentSlide === slider.last && accDx > 0) ? (Math.abs(accDx) / cwidth + 2) : 1);
525
+ }
526
+ slider.setProps(offset + dx, "setTouch");
527
+ }
528
+ }
529
+ }
530
+
531
+ function onMSGestureEnd(e) {
532
+ e.stopPropagation();
533
+ var slider = e.target._slider;
534
+ if(!slider){
535
+ return;
536
+ }
537
+ if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) {
538
+ var updateDx = (reverse) ? -dx : dx,
539
+ target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev');
540
+
541
+ if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) {
542
+ slider.flexAnimate(target, slider.vars.pauseOnAction);
543
+ } else {
544
+ if (!fade) slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true);
545
+ }
546
+ }
547
+
548
+ startX = null;
549
+ startY = null;
550
+ dx = null;
551
+ offset = null;
552
+ accDx = 0;
374
553
  }
375
- }
376
- // finish the touch by undoing the touch session
377
- el.removeEventListener('touchmove', onTouchMove, false);
378
- el.removeEventListener('touchend', onTouchEnd, false);
379
- startX = null;
380
- startY = null;
381
- dx = null;
382
- offset = null;
383
554
  }
384
555
  },
385
556
  resize: function() {
386
557
  if (!slider.animating && slider.is(':visible')) {
387
558
  if (!carousel) slider.doMath();
388
-
559
+
389
560
  if (fade) {
390
561
  // SMOOTH HEIGHT:
391
562
  methods.smoothHeight();
@@ -399,7 +570,7 @@
399
570
  slider.setProps(slider.h, "setTotal");
400
571
  } else {
401
572
  // SMOOTH HEIGHT:
402
- if (vars.smoothHeight) methods.smoothHeight();
573
+ if (slider.vars.smoothHeight) methods.smoothHeight();
403
574
  slider.newSlides.width(slider.computedW);
404
575
  slider.setProps(slider.computedW, "setTotal");
405
576
  }
@@ -412,27 +583,67 @@
412
583
  }
413
584
  },
414
585
  sync: function(action) {
415
- var $obj = $(vars.sync).data("flexslider"),
586
+ var $obj = $(slider.vars.sync).data("flexslider"),
416
587
  target = slider.animatingTo;
417
-
588
+
418
589
  switch (action) {
419
- case "animate": $obj.flexAnimate(target, vars.pauseOnAction, false, true); break;
590
+ case "animate": $obj.flexAnimate(target, slider.vars.pauseOnAction, false, true); break;
420
591
  case "play": if (!$obj.playing && !$obj.asNav) { $obj.play(); } break;
421
592
  case "pause": $obj.pause(); break;
422
593
  }
594
+ },
595
+ pauseInvisible: {
596
+ visProp: null,
597
+ init: function() {
598
+ var prefixes = ['webkit','moz','ms','o'];
599
+
600
+ if ('hidden' in document) return 'hidden';
601
+ for (var i = 0; i < prefixes.length; i++) {
602
+ if ((prefixes[i] + 'Hidden') in document)
603
+ methods.pauseInvisible.visProp = prefixes[i] + 'Hidden';
604
+ }
605
+ if (methods.pauseInvisible.visProp) {
606
+ var evtname = methods.pauseInvisible.visProp.replace(/[H|h]idden/,'') + 'visibilitychange';
607
+ document.addEventListener(evtname, function() {
608
+ if (methods.pauseInvisible.isHidden()) {
609
+ if(slider.startTimeout) clearTimeout(slider.startTimeout); //If clock is ticking, stop timer and prevent from starting while invisible
610
+ else slider.pause(); //Or just pause
611
+ }
612
+ else {
613
+ if(slider.started) slider.play(); //Initiated before, just play
614
+ else (slider.vars.initDelay > 0) ? setTimeout(slider.play, slider.vars.initDelay) : slider.play(); //Didn't init before: simply init or wait for it
615
+ }
616
+ });
617
+ }
618
+ },
619
+ isHidden: function() {
620
+ return document[methods.pauseInvisible.visProp] || false;
621
+ }
622
+ },
623
+ setToClearWatchedEvent: function() {
624
+ clearTimeout(watchedEventClearTimer);
625
+ watchedEventClearTimer = setTimeout(function() {
626
+ watchedEvent = "";
627
+ }, 3000);
423
628
  }
424
629
  }
425
-
630
+
426
631
  // public methods
427
632
  slider.flexAnimate = function(target, pause, override, withSync, fromNav) {
428
- if (!slider.animating && (slider.canAdvance(target) || override) && slider.is(":visible")) {
633
+ if (!slider.vars.animationLoop && target !== slider.currentSlide) {
634
+ slider.direction = (target > slider.currentSlide) ? "next" : "prev";
635
+ }
636
+
637
+ if (asNav && slider.pagingCount === 1) slider.direction = (slider.currentItem < target) ? "next" : "prev";
638
+
639
+ if (!slider.animating && (slider.canAdvance(target, fromNav) || override) && slider.is(":visible")) {
429
640
  if (asNav && withSync) {
430
- var master = $(vars.asNavFor).data('flexslider');
641
+ var master = $(slider.vars.asNavFor).data('flexslider');
431
642
  slider.atEnd = target === 0 || target === slider.count - 1;
432
643
  master.flexAnimate(target, true, false, true, fromNav);
433
644
  slider.direction = (slider.currentItem < target) ? "next" : "prev";
434
645
  master.direction = slider.direction;
435
-
646
+
436
647
  if (Math.ceil((target + 1)/slider.visible) - 1 !== slider.currentSlide && target !== 0) {
437
648
  slider.currentItem = target;
438
649
  slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
@@ -443,59 +654,61 @@
443
654
  return false;
444
655
  }
445
656
  }
446
-
657
+
447
658
  slider.animating = true;
448
659
  slider.animatingTo = target;
449
- // API: before() animation Callback
450
- vars.before(slider);
451
-
660
+
452
661
  // SLIDESHOW:
453
662
  if (pause) slider.pause();
454
-
663
+
664
+ // API: before() animation Callback
665
+ slider.vars.before(slider);
666
+
455
667
  // SYNC:
456
668
  if (slider.syncExists && !fromNav) methods.sync("animate");
457
-
669
+
458
670
  // CONTROLNAV
459
- if (vars.controlNav) methods.controlNav.active();
460
-
671
+ if (slider.vars.controlNav) methods.controlNav.active();
672
+
461
673
  // !CAROUSEL:
462
674
  // CANDIDATE: slide active class (for add/remove slide)
463
675
  if (!carousel) slider.slides.removeClass(namespace + 'active-slide').eq(target).addClass(namespace + 'active-slide');
464
-
676
+
465
677
  // INFINITE LOOP:
466
678
  // CANDIDATE: atEnd
467
679
  slider.atEnd = target === 0 || target === slider.last;
468
-
680
+
469
681
  // DIRECTIONNAV:
470
- if (vars.directionNav) methods.directionNav.update();
471
-
682
+ if (slider.vars.directionNav) methods.directionNav.update();
683
+
472
684
  if (target === slider.last) {
473
685
  // API: end() of cycle Callback
474
- vars.end(slider);
686
+ slider.vars.end(slider);
475
687
  // SLIDESHOW && !INFINITE LOOP:
476
- if (!vars.animationLoop) slider.pause();
688
+ if (!slider.vars.animationLoop) slider.pause();
477
689
  }
478
-
690
+
479
691
  // SLIDE:
480
692
  if (!fade) {
481
693
  var dimension = (vertical) ? slider.slides.filter(':first').height() : slider.computedW,
482
694
  margin, slideString, calcNext;
483
-
695
+
484
696
  // INFINITE LOOP / REVERSE:
485
697
  if (carousel) {
486
- margin = (vars.itemWidth > slider.w) ? vars.itemMargin * 2 : vars.itemMargin;
698
+ //margin = (slider.vars.itemWidth > slider.w) ? slider.vars.itemMargin * 2 : slider.vars.itemMargin;
699
+ margin = slider.vars.itemMargin;
487
700
  calcNext = ((slider.itemW + margin) * slider.move) * slider.animatingTo;
488
701
  slideString = (calcNext > slider.limit && slider.visible !== 1) ? slider.limit : calcNext;
489
- } else if (slider.currentSlide === 0 && target === slider.count - 1 && vars.animationLoop && slider.direction !== "next") {
702
+ } else if (slider.currentSlide === 0 && target === slider.count - 1 && slider.vars.animationLoop && slider.direction !== "next") {
490
703
  slideString = (reverse) ? (slider.count + slider.cloneOffset) * dimension : 0;
491
- } else if (slider.currentSlide === slider.last && target === 0 && vars.animationLoop && slider.direction !== "prev") {
704
+ } else if (slider.currentSlide === slider.last && target === 0 && slider.vars.animationLoop && slider.direction !== "prev") {
492
705
  slideString = (reverse) ? 0 : (slider.count + 1) * dimension;
493
706
  } else {
494
707
  slideString = (reverse) ? ((slider.count - 1) - target + slider.cloneOffset) * dimension : (target + slider.cloneOffset) * dimension;
495
708
  }
496
- slider.setProps(slideString, "", vars.animationSpeed);
709
+ slider.setProps(slideString, "", slider.vars.animationSpeed);
497
710
  if (slider.transitions) {
498
- if (!vars.animationLoop || !slider.atEnd) {
711
+ if (!slider.vars.animationLoop || !slider.atEnd) {
499
712
  slider.animating = false;
500
713
  slider.currentSlide = slider.animatingTo;
501
714
  }
@@ -504,83 +717,102 @@
504
717
  slider.wrapup(dimension);
505
718
  });
506
719
  } else {
507
- slider.container.animate(slider.args, vars.animationSpeed, vars.easing, function(){
720
+ slider.container.animate(slider.args, slider.vars.animationSpeed, slider.vars.easing, function(){
508
721
  slider.wrapup(dimension);
509
722
  });
510
723
  }
511
724
  } else { // FADE:
512
- slider.slides.eq(slider.currentSlide).fadeOut(vars.animationSpeed, vars.easing);
513
- slider.slides.eq(target).fadeIn(vars.animationSpeed, vars.easing, slider.wrapup);
725
+ if (!touch) {
726
+ //slider.slides.eq(slider.currentSlide).fadeOut(slider.vars.animationSpeed, slider.vars.easing);
727
+ //slider.slides.eq(target).fadeIn(slider.vars.animationSpeed, slider.vars.easing, slider.wrapup);
728
+
729
+ slider.slides.eq(slider.currentSlide).css({"zIndex": 1}).animate({"opacity": 0}, slider.vars.animationSpeed, slider.vars.easing);
730
+ slider.slides.eq(target).css({"zIndex": 2}).animate({"opacity": 1}, slider.vars.animationSpeed, slider.vars.easing, slider.wrapup);
731
+
732
+ } else {
733
+ slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 });
734
+ slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 });
735
+ slider.wrapup(dimension);
736
+ }
514
737
  }
515
738
  // SMOOTH HEIGHT:
516
- if (vars.smoothHeight) methods.smoothHeight(vars.animationSpeed);
739
+ if (slider.vars.smoothHeight) methods.smoothHeight(slider.vars.animationSpeed);
517
740
  }
518
- }
741
+ }
519
742
  slider.wrapup = function(dimension) {
520
743
  // SLIDE:
521
744
  if (!fade && !carousel) {
522
- if (slider.currentSlide === 0 && slider.animatingTo === slider.last && vars.animationLoop) {
745
+ if (slider.currentSlide === 0 && slider.animatingTo === slider.last && slider.vars.animationLoop) {
523
746
  slider.setProps(dimension, "jumpEnd");
524
- } else if (slider.currentSlide === slider.last && slider.animatingTo === 0 && vars.animationLoop) {
747
+ } else if (slider.currentSlide === slider.last && slider.animatingTo === 0 && slider.vars.animationLoop) {
525
748
  slider.setProps(dimension, "jumpStart");
526
749
  }
527
750
  }
528
751
  slider.animating = false;
529
752
  slider.currentSlide = slider.animatingTo;
530
753
  // API: after() animation Callback
531
- vars.after(slider);
754
+ slider.vars.after(slider);
532
755
  }
533
-
756
+
534
757
  // SLIDESHOW:
535
758
  slider.animateSlides = function() {
536
- if (!slider.animating) slider.flexAnimate(slider.getTarget("next"));
759
+ if (!slider.animating && focused ) slider.flexAnimate(slider.getTarget("next"));
537
760
  }
538
761
  // SLIDESHOW:
539
762
  slider.pause = function() {
540
763
  clearInterval(slider.animatedSlides);
764
+ slider.animatedSlides = null;
541
765
  slider.playing = false;
542
766
  // PAUSEPLAY:
543
- if (vars.pausePlay) methods.pausePlay.update("play");
767
+ if (slider.vars.pausePlay) methods.pausePlay.update("play");
544
768
  // SYNC:
545
769
  if (slider.syncExists) methods.sync("pause");
546
770
  }
547
771
  // SLIDESHOW:
548
772
  slider.play = function() {
549
- slider.animatedSlides = setInterval(slider.animateSlides, vars.slideshowSpeed);
550
- slider.playing = true;
773
+ if (slider.playing) clearInterval(slider.animatedSlides);
774
+ slider.animatedSlides = slider.animatedSlides || setInterval(slider.animateSlides, slider.vars.slideshowSpeed);
775
+ slider.started = slider.playing = true;
551
776
  // PAUSEPLAY:
552
- if (vars.pausePlay) methods.pausePlay.update("pause");
777
+ if (slider.vars.pausePlay) methods.pausePlay.update("pause");
553
778
  // SYNC:
554
779
  if (slider.syncExists) methods.sync("play");
555
780
  }
556
- slider.canAdvance = function(target) {
781
+ // STOP:
782
+ slider.stop = function () {
783
+ slider.pause();
784
+ slider.stopped = true;
785
+ }
786
+ slider.canAdvance = function(target, fromNav) {
557
787
  // ASNAV:
558
788
  var last = (asNav) ? slider.pagingCount - 1 : slider.last;
559
- return (asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 && slider.direction !== "next") ? false :
789
+ return (fromNav) ? true :
790
+ (asNav && slider.currentItem === slider.count - 1 && target === 0 && slider.direction === "prev") ? true :
791
+ (asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 && slider.direction !== "next") ? false :
560
792
  (target === slider.currentSlide && !asNav) ? false :
561
- (vars.animationLoop) ? true :
793
+ (slider.vars.animationLoop) ? true :
562
794
  (slider.atEnd && slider.currentSlide === 0 && target === last && slider.direction !== "next") ? false :
563
795
  (slider.atEnd && slider.currentSlide === last && target === 0 && slider.direction === "next") ? false :
564
796
  true;
565
797
  }
566
798
  slider.getTarget = function(dir) {
567
- slider.direction = dir;
799
+ slider.direction = dir;
568
800
  if (dir === "next") {
569
801
  return (slider.currentSlide === slider.last) ? 0 : slider.currentSlide + 1;
570
802
  } else {
571
803
  return (slider.currentSlide === 0) ? slider.last : slider.currentSlide - 1;
572
804
  }
573
805
  }
574
-
806
+
575
807
  // SLIDE:
576
808
  slider.setProps = function(pos, special, dur) {
577
809
  var target = (function() {
578
- var posCheck = (pos) ? pos : ((slider.itemW + vars.itemMargin) * slider.move) * slider.animatingTo,
810
+ var posCheck = (pos) ? pos : ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo,
579
811
  posCalc = (function() {
580
812
  if (carousel) {
581
813
  return (special === "setTouch") ? pos :
582
814
  (reverse && slider.animatingTo === slider.last) ? 0 :
583
- (reverse) ? slider.limit - (((slider.itemW + vars.itemMargin) * slider.move) * slider.animatingTo) :
815
+ (reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
584
816
  (slider.animatingTo === slider.last) ? slider.limit : posCheck;
585
817
  } else {
586
818
  switch (special) {
@@ -592,6 +824,7 @@
592
824
  }
593
825
  }
594
826
  }());
827
+
595
828
  return (posCalc * -1) + "px";
596
829
  }());
597
830
 
@@ -600,18 +833,18 @@
600
833
  dur = (dur !== undefined) ? (dur/1000) + "s" : "0s";
601
834
  slider.container.css("-" + slider.pfx + "-transition-duration", dur);
602
835
  }
603
-
836
+
604
837
  slider.args[slider.prop] = target;
605
838
  if (slider.transitions || dur === undefined) slider.container.css(slider.args);
606
839
  }
607
-
840
+
608
841
  slider.setup = function(type) {
609
842
  // SLIDE:
610
843
  if (!fade) {
611
844
  var sliderOffset, arr;
612
-
845
+
613
846
  if (type === "init") {
614
- slider.viewport = $('<div class="flex-viewport"></div>').css({"overflow": "hidden", "position": "relative"}).appendTo(slider).append(slider.container);
847
+ slider.viewport = $('<div class="' + namespace + 'viewport"></div>').css({"overflow": "hidden", "position": "relative"}).appendTo(slider).append(slider.container);
615
848
  // INFINITE LOOP:
616
849
  slider.cloneCount = 0;
617
850
  slider.cloneOffset = 0;
@@ -623,15 +856,15 @@
623
856
  }
624
857
  }
625
858
  // INFINITE LOOP && !CAROUSEL:
626
- if (vars.animationLoop && !carousel) {
859
+ if (slider.vars.animationLoop && !carousel) {
627
860
  slider.cloneCount = 2;
628
861
  slider.cloneOffset = 1;
629
862
  // clear out old clones
630
863
  if (type !== "init") slider.container.find('.clone').remove();
631
- slider.container.append(slider.slides.first().clone().addClass('clone')).prepend(slider.slides.last().clone().addClass('clone'));
864
+ slider.container.append(slider.slides.first().clone().addClass('clone').attr('aria-hidden', 'true')).prepend(slider.slides.last().clone().addClass('clone').attr('aria-hidden', 'true'));
632
865
  }
633
- slider.newSlides = $(vars.selector, slider);
634
-
866
+ slider.newSlides = $(slider.vars.selector, slider);
867
+
635
868
  sliderOffset = (reverse) ? slider.count - 1 - slider.currentSlide + slider.cloneOffset : slider.currentSlide + slider.cloneOffset;
636
869
  // VERTICAL:
637
870
  if (vertical && !carousel) {
@@ -649,44 +882,53 @@
649
882
  slider.doMath();
650
883
  slider.newSlides.css({"width": slider.computedW, "float": "left", "display": "block"});
651
884
  // SMOOTH HEIGHT:
652
- if (vars.smoothHeight) methods.smoothHeight();
885
+ if (slider.vars.smoothHeight) methods.smoothHeight();
653
886
  }, (type === "init") ? 100 : 0);
654
887
  }
655
- } else { // FADE:
888
+ } else { // FADE:
656
889
  slider.slides.css({"width": "100%", "float": "left", "marginRight": "-100%", "position": "relative"});
657
- if (type === "init") slider.slides.eq(slider.currentSlide).fadeIn(vars.animationSpeed, vars.easing);
890
+ if (type === "init") {
891
+ if (!touch) {
892
+ //slider.slides.eq(slider.currentSlide).fadeIn(slider.vars.animationSpeed, slider.vars.easing);
893
+ slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).animate({"opacity": 1},slider.vars.animationSpeed,slider.vars.easing);
894
+ } else {
895
+ 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});
896
+ }
897
+ }
658
898
  // SMOOTH HEIGHT:
659
- if (vars.smoothHeight) methods.smoothHeight();
899
+ if (slider.vars.smoothHeight) methods.smoothHeight();
660
900
  }
661
901
  // !CAROUSEL:
662
902
  // CANDIDATE: active slide
663
903
  if (!carousel) slider.slides.removeClass(namespace + "active-slide").eq(slider.currentSlide).addClass(namespace + "active-slide");
664
904
  }
665
-
905
+
906
+
666
907
  slider.doMath = function() {
667
908
  var slide = slider.slides.first(),
668
- slideMargin = vars.itemMargin,
669
- minItems = vars.minItems,
670
- maxItems = vars.maxItems;
671
-
672
- slider.w = slider.width();
909
+ slideMargin = slider.vars.itemMargin,
910
+ minItems = slider.vars.minItems,
911
+ maxItems = slider.vars.maxItems;
912
+
913
+ slider.w = (slider.viewport===undefined) ? slider.width() : slider.viewport.width();
673
914
  slider.h = slide.height();
674
915
  slider.boxPadding = slide.outerWidth() - slide.width();
675
916
 
676
917
  // CAROUSEL:
677
918
  if (carousel) {
678
- slider.itemT = vars.itemWidth + slideMargin;
919
+ slider.itemT = slider.vars.itemWidth + slideMargin;
679
920
  slider.minW = (minItems) ? minItems * slider.itemT : slider.w;
680
- slider.maxW = (maxItems) ? maxItems * slider.itemT : slider.w;
681
- slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin * minItems))/minItems :
682
- (slider.maxW < slider.w) ? (slider.w - (slideMargin * maxItems))/maxItems :
683
- (vars.itemWidth > slider.w) ? slider.w : vars.itemWidth;
684
- slider.visible = Math.floor(slider.w/(slider.itemW + slideMargin));
685
- slider.move = (vars.move > 0 && vars.move < slider.visible ) ? vars.move : slider.visible;
921
+ slider.maxW = (maxItems) ? (maxItems * slider.itemT) - slideMargin : slider.w;
922
+ slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin * (minItems - 1)))/minItems :
923
+ (slider.maxW < slider.w) ? (slider.w - (slideMargin * (maxItems - 1)))/maxItems :
924
+ (slider.vars.itemWidth > slider.w) ? slider.w : slider.vars.itemWidth;
925
+
926
+ slider.visible = Math.floor(slider.w/(slider.itemW));
927
+ slider.move = (slider.vars.move > 0 && slider.vars.move < slider.visible ) ? slider.vars.move : slider.visible;
686
928
  slider.pagingCount = Math.ceil(((slider.count - slider.visible)/slider.move) + 1);
687
929
  slider.last = slider.pagingCount - 1;
688
930
  slider.limit = (slider.pagingCount === 1) ? 0 :
689
- (vars.itemWidth > slider.w) ? ((slider.itemW + (slideMargin * 2)) * slider.count) - slider.w - slideMargin : ((slider.itemW + slideMargin) * slider.count) - slider.w;
931
+ (slider.vars.itemWidth > slider.w) ? (slider.itemW * (slider.count - 1)) + (slideMargin * (slider.count - 1)) : ((slider.itemW + slideMargin) * slider.count) - slider.w - slideMargin;
690
932
  } else {
691
933
  slider.itemW = slider.w;
692
934
  slider.pagingCount = slider.count;
@@ -694,10 +936,11 @@
694
936
  }
695
937
  slider.computedW = slider.itemW - slider.boxPadding;
696
938
  }
697
-
939
+
940
+
698
941
  slider.update = function(pos, action) {
699
942
  slider.doMath();
700
-
943
+
701
944
  // update currentSlide and slider.animatingTo if necessary
702
945
  if (!carousel) {
703
946
  if (pos < slider.currentSlide) {
@@ -707,9 +950,9 @@
707
950
  }
708
951
  slider.animatingTo = slider.currentSlide;
709
952
  }
710
-
953
+
711
954
  // update controlNav
712
- if (vars.controlNav && !slider.manualControls) {
955
+ if (slider.vars.controlNav && !slider.manualControls) {
713
956
  if ((action === "add" && !carousel) || slider.pagingCount > slider.controlNav.length) {
714
957
  methods.controlNav.update("add");
715
958
  } else if ((action === "remove" && !carousel) || slider.pagingCount < slider.controlNav.length) {
@@ -721,95 +964,104 @@
721
964
  }
722
965
  }
723
966
  // update directionNav
724
- if (vars.directionNav) methods.directionNav.update();
725
-
967
+ if (slider.vars.directionNav) methods.directionNav.update();
968
+
726
969
  }
727
-
970
+
728
971
  slider.addSlide = function(obj, pos) {
729
972
  var $obj = $(obj);
730
-
973
+
731
974
  slider.count += 1;
732
975
  slider.last = slider.count - 1;
733
-
976
+
734
977
  // append new slide
735
978
  if (vertical && reverse) {
736
979
  (pos !== undefined) ? slider.slides.eq(slider.count - pos).after($obj) : slider.container.prepend($obj);
737
980
  } else {
738
981
  (pos !== undefined) ? slider.slides.eq(pos).before($obj) : slider.container.append($obj);
739
982
  }
740
-
983
+
741
984
  // update currentSlide, animatingTo, controlNav, and directionNav
742
985
  slider.update(pos, "add");
743
-
986
+
744
987
  // update slider.slides
745
- slider.slides = $(vars.selector + ':not(.clone)', slider);
988
+ slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
746
989
  // re-setup the slider to accomdate new slide
747
990
  slider.setup();
748
-
991
+
749
992
  //FlexSlider: added() Callback
750
- vars.added(slider);
993
+ slider.vars.added(slider);
751
994
  }
752
995
  slider.removeSlide = function(obj) {
753
996
  var pos = (isNaN(obj)) ? slider.slides.index($(obj)) : obj;
754
-
997
+
755
998
  // update count
756
999
  slider.count -= 1;
757
1000
  slider.last = slider.count - 1;
758
-
1001
+
759
1002
  // remove slide
760
1003
  if (isNaN(obj)) {
761
1004
  $(obj, slider.slides).remove();
762
1005
  } else {
763
1006
  (vertical && reverse) ? slider.slides.eq(slider.last).remove() : slider.slides.eq(obj).remove();
764
1007
  }
765
-
1008
+
766
1009
  // update currentSlide, animatingTo, controlNav, and directionNav
767
1010
  slider.doMath();
768
1011
  slider.update(pos, "remove");
769
-
1012
+
770
1013
  // update slider.slides
771
- slider.slides = $(vars.selector + ':not(.clone)', slider);
1014
+ slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
772
1015
  // re-setup the slider to accomdate new slide
773
1016
  slider.setup();
774
-
1017
+
775
1018
  // FlexSlider: removed() Callback
776
- vars.removed(slider);
1019
+ slider.vars.removed(slider);
777
1020
  }
778
-
1021
+
779
1022
  //FlexSlider: Initialize
780
1023
  methods.init();
781
1024
  }
782
-
1025
+
1026
+ // Ensure the slider isn't focussed if the window loses focus.
1027
+ $( window ).blur( function ( e ) {
1028
+ focused = false;
1029
+ }).focus( function ( e ) {
1030
+ focused = true;
1031
+ });
1032
+
783
1033
  //FlexSlider: Default Settings
784
1034
  $.flexslider.defaults = {
785
1035
  namespace: "flex-", //{NEW} String: Prefix string attached to the class of every element generated by the plugin
786
1036
  selector: ".slides > li", //{NEW} Selector: Must match a simple pattern. '{container} > {slide}' -- Ignore pattern at your own peril
787
1037
  animation: "fade", //String: Select your animation type, "fade" or "slide"
788
- easing: "swing", //{NEW} String: Determines the easing method used in jQuery transitions. jQuery easing plugin is supported!
1038
+ easing: "swing", //{NEW} String: Determines the easing method used in jQuery transitions. jQuery easing plugin is supported!
789
1039
  direction: "horizontal", //String: Select the sliding direction, "horizontal" or "vertical"
790
1040
  reverse: false, //{NEW} Boolean: Reverse the animation direction
791
- animationLoop: true, //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end
792
- smoothHeight: false, //{NEW} Boolean: Allow height of the slider to animate smoothly in horizontal mode
1041
+ animationLoop: true, //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end
1042
+ smoothHeight: false, //{NEW} Boolean: Allow height of the slider to animate smoothly in horizontal mode
793
1043
  startAt: 0, //Integer: The slide that the slider should start on. Array notation (0 = first slide)
794
1044
  slideshow: true, //Boolean: Animate slider automatically
795
1045
  slideshowSpeed: 7000, //Integer: Set the speed of the slideshow cycling, in milliseconds
796
1046
  animationSpeed: 600, //Integer: Set the speed of animations, in milliseconds
797
1047
  initDelay: 0, //{NEW} Integer: Set an initialization delay, in milliseconds
798
1048
  randomize: false, //Boolean: Randomize slide order
799
-
1049
+ thumbCaptions: false, //Boolean: Whether or not to put captions on thumbnails when using the "thumbnails" controlNav.
1050
+
800
1051
  // Usability features
801
1052
  pauseOnAction: true, //Boolean: Pause the slideshow when interacting with control elements, highly recommended.
802
1053
  pauseOnHover: false, //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering
1054
+ pauseInvisible: true, //{NEW} Boolean: Pause the slideshow when tab is invisible, resume when visible. Provides better UX, lower CPU usage.
803
1055
  useCSS: true, //{NEW} Boolean: Slider will use CSS3 transitions if available
804
1056
  touch: true, //{NEW} Boolean: Allow touch swipe navigation of the slider on touch-enabled devices
805
1057
  video: false, //{NEW} Boolean: If using video in the slider, will prevent CSS3 3D Transforms to avoid graphical glitches
806
-
1058
+
807
1059
  // Primary Controls
808
1060
  controlNav: true, //Boolean: Create navigation for paging control of each clide? Note: Leave true for manualControls usage
809
1061
  directionNav: true, //Boolean: Create navigation for previous/next navigation? (true/false)
810
1062
  prevText: "Previous", //String: Set the text for the "previous" directionNav item
811
1063
  nextText: "Next", //String: Set the text for the "next" directionNav item
812
-
1064
+
813
1065
  // Secondary Navigation
814
1066
  keyboard: true, //Boolean: Allow slider navigating via keyboard left/right keys
815
1067
  multipleKeyboard: false, //{NEW} Boolean: Allow keyboard navigation to affect multiple sliders. Default behavior cuts out keyboard navigation with more than one slider present.
@@ -817,20 +1069,21 @@
817
1069
  pausePlay: false, //Boolean: Create pause/play dynamic element
818
1070
  pauseText: "Pause", //String: Set the text for the "pause" pausePlay item
819
1071
  playText: "Play", //String: Set the text for the "play" pausePlay item
820
-
1072
+
821
1073
  // Special properties
822
1074
  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.
823
1075
  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.
824
1076
  sync: "", //{NEW} Selector: Mirror the actions performed on this slider with another slider. Use with care.
825
1077
  asNavFor: "", //{NEW} Selector: Internal property exposed for turning the slider into a thumbnail navigation for another slider
826
-
1078
+
827
1079
  // Carousel Options
828
1080
  itemWidth: 0, //{NEW} Integer: Box-model width of individual carousel items, including horizontal borders and padding.
829
1081
  itemMargin: 0, //{NEW} Integer: Margin between carousel items.
830
- minItems: 0, //{NEW} Integer: Minimum number of carousel items that should be visible. Items will resize fluidly when below this.
1082
+ minItems: 1, //{NEW} Integer: Minimum number of carousel items that should be visible. Items will resize fluidly when below this.
831
1083
  maxItems: 0, //{NEW} Integer: Maxmimum number of carousel items that should be visible. Items will resize fluidly when above this limit.
832
1084
  move: 0, //{NEW} Integer: Number of carousel items that should move on animation. If 0, slider will move all visible items.
833
-
1085
+ allowOneSlide: true, //{NEW} Boolean: Whether or not to allow a slider comprised of a single slide
1086
+
834
1087
  // Callback API
835
1088
  start: function(){}, //Callback: function(slider) - Fires when the slider loads the first slide
836
1089
  before: function(){}, //Callback: function(slider) - Fires asynchronously with each slider animation
@@ -843,14 +1096,15 @@
843
1096
 
844
1097
  //FlexSlider: Plugin Function
845
1098
  $.fn.flexslider = function(options) {
846
- options = options || {};
1099
+ if (options === undefined) options = {};
1100
+
847
1101
  if (typeof options === "object") {
848
1102
  return this.each(function() {
849
1103
  var $this = $(this),
850
1104
  selector = (options.selector) ? options.selector : ".slides > li",
851
1105
  $slides = $this.find(selector);
852
1106
 
853
- if ($slides.length === 1) {
1107
+ if ( ( $slides.length === 1 && options.allowOneSlide === true ) || $slides.length === 0 ) {
854
1108
  $slides.fadeIn(400);
855
1109
  if (options.start) options.start($this);
856
1110
  } else if ($this.data('flexslider') === undefined) {
@@ -863,12 +1117,12 @@
863
1117
  switch (options) {
864
1118
  case "play": $slider.play(); break;
865
1119
  case "pause": $slider.pause(); break;
1120
+ case "stop": $slider.stop(); break;
866
1121
  case "next": $slider.flexAnimate($slider.getTarget("next"), true); break;
867
1122
  case "prev":
868
1123
  case "previous": $slider.flexAnimate($slider.getTarget("prev"), true); break;
869
1124
  default: if (typeof options === "number") $slider.flexAnimate(options, true);
870
1125
  }
871
1126
  }
872
- }
873
-
874
- })(jQuery);
1127
+ }
1128
+ })(jQuery);