PluginProbe ʕ •ᴥ•ʔ
WooCommerce / 10.9.2
WooCommerce v10.9.2
11.0.0-beta.1 10.9.4 10.9.3 10.9.2 10.9.1 10.9.0 10.9.0-rc.1 10.9.0-beta.2 10.9.0-beta.1 10.8.1 10.8.0 10.8.0-rc.1 10.8.0-beta.2 10.8.0-beta.1 7.8.0-beta.1 7.8.0-beta.2 7.8.0-rc.1 7.8.0-rc.2 7.8.1 7.8.2 7.8.3 7.8.4 7.9.0 7.9.0-beta.1 7.9.0-beta.2 7.9.0-rc.2 7.9.0-rc.3 7.9.1 7.9.2 8.0.0 8.0.0-beta.1 8.0.0-beta.2 8.0.0-rc.1 8.0.0-rc.2 8.0.1 8.0.2 8.0.3 8.0.4 8.0.5 8.1.0 8.1.0-beta.1 8.1.0-rc.1 8.1.0-rc.2 8.1.1 8.1.2 8.1.3 8.1.4 8.2.0 8.2.0-beta.1 8.2.0-rc.1 8.2.0-rc.2 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.3.0 8.3.0-beta.1 8.3.0-rc.1 8.3.0-rc.2 8.3.1 8.3.2 8.3.3 8.3.4 8.4.0 8.4.0-beta.1 8.4.0-rc.1 8.4.1 8.4.2 8.4.3 8.5.0 8.5.0-beta.1 8.5.0-rc.1 8.5.1 8.5.2 8.5.3 8.5.4 8.5.5 8.6.0 8.6.0-beta.1 8.6.0-rc.1 8.6.1 8.6.2 8.6.3 8.6.4 8.7.0 8.7.0-beta.1 8.7.0-beta.2 8.7.0-rc.1 8.7.1 8.7.2 8.7.3 8.8.0 8.8.0-beta.1 8.8.0-rc.1 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.8.6 8.8.7 8.9.0 8.9.0-beta.1 8.9.0-rc.1 8.9.1 8.9.2 8.9.3 8.9.4 8.9.5 9.0.0 9.0.0-beta.1 9.0.0-beta.2 9.0.0-rc.1 9.0.1 9.0.2 9.0.3 9.0.4 9.1.0 9.1.0-beta.1 9.1.0-rc.1 9.1.1 9.1.2 9.1.3 9.1.4 9.1.5 9.1.6 9.2.0 9.2.0-beta.1 9.2.0-rc.1 9.2.1 9.2.2 9.2.3 9.2.4 9.2.5 9.3.0 9.3.0-beta.1 9.3.0-rc.1 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.3.6 9.4.0 9.4.0-beta.1 9.4.0-beta.2 9.4.0-rc.1 9.4.0-rc.2 9.4.0-rc.3 9.4.0-rc.4 9.4.1 9.4.2 9.4.3 9.4.4 9.4.5 9.5.0 9.5.0-beta.1 9.5.0-beta.2 9.5.0-rc.1 9.5.1 9.5.2 9.5.3 9.5.4 9.6.0 9.6.0-beta.1 9.6.0-beta.2 9.6.0-rc.1 9.6.1 9.6.2 9.6.3 9.6.4 9.7.0 9.7.0-beta.1 9.7.0-rc.1 9.7.1 9.7.2 9.7.3 9.8.0 9.8.0-beta.1 9.8.0-rc.1 9.8.1 9.8.2 9.8.3 9.8.4 9.8.5 9.8.6 9.8.7 9.9.0 9.9.0-beta.1 9.9.0-rc.1 9.9.1 9.9.2 9.9.3 9.9.4 9.9.5 9.9.6 9.9.7 3.7.3 7.1.2 3.8.0 7.2.0 3.8.0-beta.1 7.2.0-beta.1 3.8.0-rc.1 7.2.0-beta.2 3.8.0-rc.2 7.2.0-rc.1 3.8.1 7.2.0-rc.2 3.8.2 7.2.1 3.8.3 7.2.2 3.9.0 7.2.3 3.9.0-beta.1 7.2.4 3.9.0-beta.2 7.3.0 3.9.0-rc.1 7.3.0-beta.1 3.9.0-rc.2 7.3.0-beta.2 3.9.0-rc.3 7.3.0-rc.1 3.9.0-rc.4 7.3.0-rc.2 3.9.1 7.3.1 3.9.2 7.4.0 3.9.3 7.4.0-beta.1 3.9.4 7.4.0-beta.2 3.9.5 7.4.0-rc.1 4.0.0 7.4.0-rc.2 4.0.0-beta.1 7.4.1 4.0.0-rc.1 7.4.2 4.0.0-rc.2 7.5.0 4.0.1 7.5.0-beta.1 4.0.2 7.5.0-beta.2 4.0.3 7.5.0-rc.1 4.0.4 7.5.1 4.1.0 7.5.2 4.1.0-beta.1 7.6.0 4.1.0-beta.2 7.6.0-beta.1 4.1.0-rc.1 7.6.0-beta.2 4.1.0-rc.2 7.6.0-rc.1 4.1.1 7.6.0-rc.2 4.1.2 7.6.0-rc.3 4.1.3 7.6.1 4.1.4 7.6.2 4.2.0 7.7.0 4.2.0-RC.1 7.7.0-beta.1 4.2.0-RC.2 7.7.0-beta.2 4.2.0-beta.1 7.7.0-rc.1 4.2.1 7.7.1 4.2.2 7.7.2 4.2.3 7.7.3 4.2.4 7.8.0 4.2.5 4.3.0 4.3.0-beta.1 4.3.0-rc.1 4.3.0-rc.2 4.3.0-rc.3 4.3.1 4.3.2 4.3.3 4.3.4 4.3.5 4.3.6 4.4.0 4.4.0-beta.1 4.4.0-rc.1 4.4.1 4.4.2 4.4.3 4.4.4 4.5.0 4.5.0-beta.1 4.5.0-rc.1 4.5.0-rc.3 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5 4.6.0 4.6.0-beta.1 4.6.0-rc.1 4.6.1 4.6.2 4.6.3 4.6.4 4.6.5 4.7.0 4.7.0-beta.1 4.7.0-beta.2 4.7.0-rc.1 4.7.1 4.7.1-beta.1 4.7.2 4.7.3 4.7.4 4.8.0 4.8.0-beta.1 4.8.0-rc.1 4.8.0-rc.2 4.8.1 4.8.2 4.8.3 4.9.0 4.9.0-beta.1 4.9.0-rc.1 4.9.0-rc.2 4.9.1 4.9.2 4.9.3 4.9.4 4.9.5 5.0.0 5.0.0-beta.1 5.0.0-beta.2 5.0.0-rc.1 5.0.0-rc.2 5.0.0-rc.3 5.0.1 5.0.2 5.0.3 5.1.0 5.1.0-beta.1 5.1.0-rc.1 trunk 5.1.1 10.0.0 5.1.2 10.0.0-rc.1 5.1.3 10.0.0-rc.2 5.2.0 10.0.1 5.2.0-beta.1 10.0.2 5.2.0-rc.1 10.0.3 5.2.0-rc.2 10.0.4 5.2.1 10.0.5 5.2.2 10.0.6 5.2.3 10.1.0 5.2.4 10.1.0-rc.1 5.2.5 10.1.0-rc.2 5.3.0 10.1.0-rc.3 5.3.0-beta.1 10.1.0-rc.4 5.3.0-rc.1 10.1.1 5.3.0-rc.2 10.1.2 5.3.1 10.1.3 5.3.2 10.1.4 5.3.3 10.2.0 5.4.0 10.2.0-beta.1 5.4.0-beta.1 10.2.0-beta.2 5.4.0-rc.1 10.2.0-rc.1 5.4.1 10.2.1 5.4.2 10.2.2 5.4.3 10.2.3 5.4.4 10.2.4 5.4.5 10.3.0 5.5.0 10.3.0-beta.1 5.5.0-beta.1 10.3.0-beta.2 5.5.0-rc.1 10.3.0-rc.1 5.5.0-rc.2 10.3.0-rc.2 5.5.1 10.3.1 5.5.2 10.3.2 5.5.3 10.3.3 5.5.4 10.3.4 5.5.5 10.3.5 5.6.0 10.3.6 5.6.0-beta.1 10.3.7 5.6.0-rc.1 10.3.8 5.6.0-rc.2 10.4.0 5.6.1 10.4.0-beta.1 5.6.2 10.4.0-beta.2 5.6.3 10.4.0-rc.1 5.7.0 10.4.1 5.7.0-beta.1 10.4.2 5.7.0-rc.1 10.4.3 5.7.1 10.4.4 5.7.2 10.5.0 5.7.3 10.5.0-beta.1 5.8.0 10.5.0-beta.2 5.8.0-beta.1 10.5.0-rc.1 5.8.0-beta.2 10.5.0-rc.2 5.8.0-rc.1 10.5.0-rc.3 5.8.1 10.5.1 5.8.2 10.5.2 5.9.0 10.5.3 5.9.0-beta.1 10.6.0 5.9.0-rc.1 10.6.0-beta.1 5.9.0-rc.2 10.6.0-beta.2 5.9.1 10.6.0-rc.1 5.9.2 10.6.1 6.0.0 10.6.2 6.0.0-beta.1 10.7.0 6.0.0-rc.1 10.7.0-beta.1 6.0.1 10.7.0-beta.2 6.0.2 10.7.0-rc.1 6.1.0 3.0.0 6.1.0-beta.1 3.0.1 6.1.0-rc.1 3.0.2 6.1.0-rc.2 3.0.3 6.1.1 3.0.4 6.1.2 3.0.5 6.1.3 3.0.6 6.2.0 3.0.7 6.2.0-beta.1 3.0.8 6.2.0-rc.1 3.0.9 6.2.0-rc.2 3.1.0 6.2.1 3.1.1 6.2.2 3.1.2 6.2.3 3.2.0 6.3.0 3.2.1 6.3.0-beta.1 3.2.2 6.3.0-rc.1 3.2.3 6.3.0-rc.2 3.2.4 6.3.1 3.2.5 6.3.2 3.2.6 6.4.0 3.3.0 6.4.0-beta.1 3.3.1 6.4.0-rc.1 3.3.2 6.4.1 3.3.2-rc.1 6.4.2 3.3.3 6.5.0 3.3.4 6.5.0-beta.1 3.3.5 6.5.0-rc.1 3.3.6 6.5.0-rc.2 3.4.0 6.5.1 3.4.0-beta.1 6.5.2 3.4.0-rc.2 6.6.0 3.4.1 6.6.0-beta.1 3.4.2 6.6.0-rc.1 3.4.3 6.6.0-rc.2 3.4.4 6.6.1 3.4.5 6.6.2 3.4.6 6.7.0 3.4.7 6.7.0-beta.1 3.4.8 6.7.0-beta.2 3.5.0 6.7.0-rc.1 3.5.0-beta.1 6.7.1 3.5.0-rc.1 6.8.0 3.5.0-rc.2 6.8.0-beta.1 3.5.1 6.8.0-beta.2 3.5.10 6.8.0-rc.1 3.5.2 6.8.1 3.5.3 6.8.2 3.5.4 6.8.3 3.5.5 6.9.0 3.5.6 6.9.0-beta.1 3.5.7 6.9.0-beta.2 3.5.8 6.9.0-rc.1 3.5.9 6.9.1 3.6.0 6.9.2 3.6.0-beta.1 6.9.3 3.6.0-rc.1 6.9.4 3.6.0-rc.2 6.9.5 3.6.0-rc.3 7.0.0 3.6.1 7.0.0-beta.1 3.6.2 7.0.0-beta.2 3.6.3 7.0.0-beta.3 3.6.4 7.0.0-rc.1 3.6.5 7.0.0-rc.2 3.6.6 7.0.1 3.6.7 7.0.2 3.7.0 7.1.0 3.7.0-beta.1 7.1.0-beta.1 3.7.0-rc.1 7.1.0-beta.2 3.7.0-rc.2 7.1.0-rc.1 3.7.1 7.1.0-rc.2 3.7.2 7.1.1
woocommerce / assets / js / flexslider / jquery.flexslider.js
woocommerce / assets / js / flexslider Last commit date
jquery.flexslider.js 1 year ago jquery.flexslider.min.js 1 year ago
jquery.flexslider.js
1146 lines
1 /*
2 * jQuery FlexSlider v2.7.2
3 * Copyright 2012 WooThemes
4 * Contributing Author: Tyler Smith
5 */
6 ;
7 (function ($) {
8
9 var focused = true;
10
11 // When wishing to use jQuery transitions, we replicate them with CSS3's transition-timing-function instead
12 // Default options provided by jQuery are "swing" and "linear"; jQuery easing plugin methods: https://easings.net/
13 // We do NOT support easeInElastic, easeOutElastic, easeInOutElastic, easeInBounce, easeOutBounce, and easeInOutBounce
14 var easings = {
15 swing: 'cubic-bezier(.02, .01, .47, 1)', // https://stackoverflow.com/a/9245729
16 linear: 'linear',
17
18 easeInQuad: 'cubic-bezier(0.11, 0, 0.5, 0)', // https://easings.net/#easeInQuad
19 easeOutQuad: 'cubic-bezier(0.5, 1, 0.89, 1)', // https://easings.net/#easeOutQuad
20 easeInOutQuad: 'cubic-bezier(0.45, 0, 0.55, 1)', // https://easings.net/#easeInOutQuad
21
22 easeInCubic: 'cubic-bezier(0.32, 0, 0.67, 0)', // https://easings.net/#easeInCubic
23 easeOutCubic: 'cubic-bezier(0.33, 1, 0.68, 1)', // https://easings.net/#easeOutCubic
24 easeInOutCubic: 'cubic-bezier(0.65, 0, 0.35, 1)', // https://easings.net/#easeInOutCubic
25
26 easeInQuart: 'cubic-bezier(0.5, 0, 0.75, 0)', // https://easings.net/#easeInQuart
27 easeOutQuart: 'cubic-bezier(0.25, 1, 0.5, 1)', // https://easings.net/#easeOutQuart
28 easeInOutQuart: 'cubic-bezier(0.76, 0, 0.24, 1)', // https://easings.net/#easeInOutQuart
29
30 easeInQuint: 'cubic-bezier(0.64, 0, 0.78, 0)', // https://easings.net/#easeInQuint
31 easeOutQuint: 'cubic-bezier(0.22, 1, 0.36, 1)', // https://easings.net/#easeOutQuint
32 easeInOutQuint: 'cubic-bezier(0.83, 0, 0.17, 1)', // https://easings.net/#easeInOutQuint
33
34 easeInSine: 'cubic-bezier(0.12, 0, 0.39, 0)', // https://easings.net/#easeInSine
35 easeOutSine: 'cubic-bezier(0.61, 1, 0.88, 1)', // https://easings.net/#easeOutSine
36 easeInOutSine: 'cubic-bezier(0.37, 0, 0.63, 1)', // https://easings.net/#easeInOutSine
37
38 easeInExpo: 'cubic-bezier(0.7, 0, 0.84, 0)', // https://easings.net/#easeInExpo
39 easeOutExpo: 'cubic-bezier(0.16, 1, 0.3, 1)', // https://easings.net/#easeOutExpo
40 easeInOutExpo: 'cubic-bezier(0.87, 0, 0.13, 1)', // https://easings.net/#easeInOutExpo
41
42 easeInCirc: 'cubic-bezier(0.55, 0, 1, 0.45)', // https://easings.net/#easeInCirc
43 easeOutCirc: 'cubic-bezier(0, 0.55, 0.45, 1)', // https://easings.net/#easeOutCirc
44 easeInOutCirc: 'cubic-bezier(0.85, 0, 0.15, 1)', // https://easings.net/#easeInOutCirc
45
46 easeInBack: 'cubic-bezier(0.36, 0, 0.66, -0.56)', // https://easings.net/#easeInBack
47 easeOutBack: 'cubic-bezier(0.34, 1.56, 0.64, 1)', // https://easings.net/#easeOutBack
48 easeInOutBack: 'cubic-bezier(0.68, -0.6, 0.32, 1.6)' // https://easings.net/#easeInOutBack
49 };
50
51 // Preserve the original jQuery "swing" easing as "jswing"
52 easings['jswing'] = easings['swing'];
53
54 //FlexSlider: Object Instance
55 $.flexslider = function(el, options) {
56 var slider = $(el);
57
58 // making variables public
59
60 //if rtl value was not passed and html is in rtl..enable it by default.
61 if(typeof options.rtl=='undefined' && $('html').attr('dir')=='rtl'){
62 options.rtl=true;
63 }
64 slider.vars = $.extend({}, $.flexslider.defaults, options);
65
66 var namespace = slider.vars.namespace,
67 touch = (( "ontouchstart" in window ) || window.DocumentTouch && document instanceof DocumentTouch) && slider.vars.touch,
68 // we add a custom event so we can differentiate manually triggering events when needed.
69 eventType = "click touchend keyup flexslider-click",
70 watchedEvent = "",
71 watchedEventClearTimer,
72 easing = easings[slider.vars.easing] || "ease",
73 vertical = slider.vars.direction === "vertical",
74 reverse = slider.vars.reverse,
75 carousel = (slider.vars.itemWidth > 0),
76 fade = slider.vars.animation === "fade",
77 asNav = slider.vars.asNavFor !== "",
78 methods = {};
79
80 // Store a reference to the slider object
81 $.data(el, "flexslider", slider);
82
83 // Private slider methods
84 methods = {
85 init: function() {
86 slider.animating = false;
87 // Get current slide and make sure it is a number
88 slider.currentSlide = parseInt( ( slider.vars.startAt ? slider.vars.startAt : 0), 10 );
89 if ( isNaN( slider.currentSlide ) ) { slider.currentSlide = 0; }
90 slider.animatingTo = slider.currentSlide;
91 slider.atEnd = (slider.currentSlide === 0 || slider.currentSlide === slider.last);
92 slider.containerSelector = slider.vars.selector.substr(0,slider.vars.selector.search(' '));
93 slider.slides = $(slider.vars.selector, slider);
94 slider.container = $(slider.containerSelector, slider);
95 slider.count = slider.slides.length;
96 // SYNC:
97 slider.syncExists = $(slider.vars.sync).length > 0;
98 // SLIDE:
99 if (slider.vars.animation === "slide") { slider.vars.animation = "swing"; }
100 slider.prop = (vertical) ? "top" : ( slider.vars.rtl ? "marginRight" : "marginLeft" );
101 slider.args = {};
102 // SLIDESHOW:
103 slider.manualPause = false;
104 slider.stopped = false;
105 //PAUSE WHEN INVISIBLE
106 slider.started = false;
107 slider.startTimeout = null;
108 // TOUCH/USECSS:
109 slider.transforms = slider.transitions = !slider.vars.video && !fade && slider.vars.useCSS;
110 if (slider.transforms) slider.prop = "transform";
111 slider.isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
112 slider.ensureAnimationEnd = '';
113 // CONTROLSCONTAINER:
114 if (slider.vars.controlsContainer !== "") slider.controlsContainer = $(slider.vars.controlsContainer).length > 0 && $(slider.vars.controlsContainer);
115 // MANUAL:
116 if (slider.vars.manualControls !== "") slider.manualControls = $(slider.vars.manualControls).length > 0 && $(slider.vars.manualControls);
117
118 // CUSTOM DIRECTION NAV:
119 if (slider.vars.customDirectionNav !== "") slider.customDirectionNav = $(slider.vars.customDirectionNav).length === 2 && $(slider.vars.customDirectionNav);
120
121 // RANDOMIZE:
122 if (slider.vars.randomize) {
123 slider.slides.sort(function() { return (Math.round(Math.random())-0.5); });
124 slider.container.empty().append(slider.slides);
125 }
126
127 slider.doMath();
128
129 // INIT
130 slider.setup("init");
131
132 // CONTROLNAV:
133 if (slider.vars.controlNav) { methods.controlNav.setup(); }
134
135 // DIRECTIONNAV:
136 if (slider.vars.directionNav) { methods.directionNav.setup(); }
137
138 // KEYBOARD:
139 if (slider.vars.keyboard && ($(slider.containerSelector).length === 1 || slider.vars.multipleKeyboard)) {
140 $(document).on('keyup', function(event) {
141 var keycode = event.keyCode;
142 if (!slider.animating && (keycode === 39 || keycode === 37)) {
143 var target = (slider.vars.rtl?
144 ((keycode === 37) ? slider.getTarget('next') :
145 (keycode === 39) ? slider.getTarget('prev') : false)
146 :
147 ((keycode === 39) ? slider.getTarget('next') :
148 (keycode === 37) ? slider.getTarget('prev') : false)
149 )
150 ;
151 slider.flexAnimate(target, slider.vars.pauseOnAction);
152 }
153 });
154 }
155 // MOUSEWHEEL:
156 if (slider.vars.mousewheel) {
157 slider.on('mousewheel', function(event, delta, deltaX, deltaY) {
158 event.preventDefault();
159 var target = (delta < 0) ? slider.getTarget('next') : slider.getTarget('prev');
160 slider.flexAnimate(target, slider.vars.pauseOnAction);
161 });
162 }
163
164 // PAUSEPLAY
165 if (slider.vars.pausePlay) { methods.pausePlay.setup(); }
166
167 //PAUSE WHEN INVISIBLE
168 if (slider.vars.slideshow && slider.vars.pauseInvisible) { methods.pauseInvisible(); }
169
170 // SLIDSESHOW
171 if (slider.vars.slideshow) {
172 if (slider.vars.pauseOnHover) {
173 slider.on( 'mouseenter', function() {
174 if (!slider.manualPlay && !slider.manualPause) { slider.pause(); }
175 } ).on( 'mouseleave', function() {
176 if (!slider.manualPause && !slider.manualPlay && !slider.stopped) { slider.play(); }
177 });
178 }
179 // initialize animation
180 //If we're visible, or we don't use PageVisibility API
181 if(!slider.vars.pauseInvisible || document.visibilityState === 'visible') {
182 (slider.vars.initDelay > 0) ? slider.startTimeout = setTimeout(slider.play, slider.vars.initDelay) : slider.play();
183 }
184 }
185
186 // ASNAV:
187 if (asNav) { methods.asNav.setup(); }
188
189 // TOUCH
190 if (touch && slider.vars.touch) { methods.touch(); }
191
192 // FADE&&SMOOTHHEIGHT || SLIDE:
193 if (!fade || (fade && slider.vars.smoothHeight)) { $(window).on("resize orientationchange focus", methods.resize); }
194
195 slider.find("img").attr("draggable", "false");
196
197 // API: start() Callback
198 setTimeout(function(){
199 slider.vars.start(slider);
200 }, 200);
201 },
202 asNav: {
203 setup: function() {
204 slider.asNav = true;
205 slider.animatingTo = Math.floor(slider.currentSlide/slider.move);
206 slider.currentItem = slider.currentSlide;
207 slider.slides.removeClass(namespace + "active-slide").eq(slider.currentItem).addClass(namespace + "active-slide");
208 slider.slides.on(eventType, function(e){
209 e.preventDefault();
210 var $slide = $(this),
211 target = $slide.index();
212 var posFromX;
213 if(slider.vars.rtl){
214 posFromX = -1*($slide.offset().right - $(slider).scrollLeft()); // Find position of slide relative to right of slider container
215 }
216 else
217 {
218 posFromX = $slide.offset().left - $(slider).scrollLeft(); // Find position of slide relative to left of slider container
219 }
220 if( posFromX <= 0 && $slide.hasClass( namespace + 'active-slide' ) ) {
221 slider.flexAnimate(slider.getTarget("prev"), true);
222 } else if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass(namespace + "active-slide")) {
223 slider.direction = (slider.currentItem < target) ? "next" : "prev";
224 slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true);
225 }
226 });
227 }
228 },
229 controlNav: {
230 setup: function() {
231 if (!slider.manualControls) {
232 methods.controlNav.setupPaging();
233 } else { // MANUALCONTROLS:
234 methods.controlNav.setupManual();
235 }
236 },
237 setupPaging: function() {
238 var type = (slider.vars.controlNav === "thumbnails") ? 'control-thumbs' : 'control-paging',
239 j = 1,
240 item,
241 slide;
242
243 slider.controlNavScaffold = $('<ol class="'+ namespace + 'control-nav ' + namespace + type + '"></ol>');
244
245 if (slider.pagingCount > 1) {
246 for (var i = 0; i < slider.pagingCount; i++) {
247 slide = slider.slides.eq(i);
248
249 if ( undefined === slide.attr( 'data-thumb-alt' ) ) {
250 slide.attr( 'data-thumb-alt', '' );
251 }
252
253 item = $( '<a></a>' ).attr( 'href', '#' ).text( j );
254 if (slider.vars.controlNav === "thumbnails") {
255 item = $('<img/>', {
256 onload: 'this.width = this.naturalWidth; this.height = this.naturalHeight',
257 src: slide.attr('data-thumb'),
258 srcset: slide.attr('data-thumb-srcset'),
259 sizes: slide.attr('data-thumb-sizes'),
260 alt: slide.attr('alt')
261 })
262 }
263
264 if ( '' !== slide.attr( 'data-thumb-alt' ) ) {
265 item.attr( 'alt', slide.attr( 'data-thumb-alt' ) );
266 }
267
268 if ( 'thumbnails' === slider.vars.controlNav && true === slider.vars.thumbCaptions ) {
269 var captn = slide.attr( 'data-thumbcaption' );
270 if ( '' !== captn && undefined !== captn ) {
271 var caption = $('<span></span>' ).addClass( namespace + 'caption' ).text( captn );
272 item.append( caption );
273 }
274 }
275
276 var liElement = $( '<li>' );
277 item.appendTo( liElement );
278 liElement.append( '</li>' );
279
280 slider.controlNavScaffold.append(liElement);
281 j++;
282
283 }
284 }
285
286 // CONTROLSCONTAINER:
287 (slider.controlsContainer) ? $(slider.controlsContainer).append(slider.controlNavScaffold) : slider.append(slider.controlNavScaffold);
288 methods.controlNav.set();
289
290 methods.controlNav.active();
291
292 slider.controlNavScaffold.on(eventType, 'a, img', function(event) {
293 event.preventDefault();
294
295 if (watchedEvent === "" || watchedEvent === event.type || event.type === "flexslider-click") {
296 var $this = $(this),
297 target = slider.controlNav.index($this);
298
299 if (!$this.hasClass(namespace + 'active')) {
300 slider.direction = (target > slider.currentSlide) ? "next" : "prev";
301 slider.flexAnimate(target, slider.vars.pauseOnAction);
302 }
303 }
304
305 // setup flags to prevent event duplication
306 if (watchedEvent === "" && event.type !== "flexslider-click") {
307 watchedEvent = event.type;
308 }
309 methods.setToClearWatchedEvent();
310
311 });
312 },
313 setupManual: function() {
314 slider.controlNav = slider.manualControls;
315 methods.controlNav.active();
316
317 slider.controlNav.on(eventType, function(event) {
318 event.preventDefault();
319
320 if (watchedEvent === "" || watchedEvent === event.type || event.type === "flexslider-click") {
321 var $this = $(this),
322 target = slider.controlNav.index($this);
323
324 if (!$this.hasClass(namespace + 'active')) {
325 (target > slider.currentSlide) ? slider.direction = "next" : slider.direction = "prev";
326 slider.flexAnimate(target, slider.vars.pauseOnAction);
327 }
328 }
329
330 // setup flags to prevent event duplication
331 if (watchedEvent === "" && event.type !== "flexslider-click") {
332 watchedEvent = event.type;
333 }
334 methods.setToClearWatchedEvent();
335 });
336 },
337 set: function() {
338 var selector = (slider.vars.controlNav === "thumbnails") ? 'img' : 'a';
339 slider.controlNav = $('.' + namespace + 'control-nav li ' + selector, (slider.controlsContainer) ? slider.controlsContainer : slider);
340 },
341 active: function() {
342 slider.controlNav.removeClass(namespace + "active").eq(slider.animatingTo).addClass(namespace + "active");
343 },
344 update: function(action, pos) {
345 if (slider.pagingCount > 1 && action === "add") {
346 slider.controlNavScaffold.append($('<li><a href="#">' + slider.count + '</a></li>'));
347 } else if (slider.pagingCount === 1) {
348 slider.controlNavScaffold.find('li').remove();
349 } else {
350 slider.controlNav.eq(pos).closest('li').remove();
351 }
352 methods.controlNav.set();
353 (slider.pagingCount > 1 && slider.pagingCount !== slider.controlNav.length) ? slider.update(pos, action) : methods.controlNav.active();
354 }
355 },
356 directionNav: {
357 setup: function() {
358 var directionNavScaffold = $('<ul class="' + namespace + 'direction-nav"><li class="' + namespace + 'nav-prev"><a class="' + namespace + 'prev" href="#">' + slider.vars.prevText + '</a></li><li class="' + namespace + 'nav-next"><a class="' + namespace + 'next" href="#">' + slider.vars.nextText + '</a></li></ul>');
359
360 // CUSTOM DIRECTION NAV:
361 if (slider.customDirectionNav) {
362 slider.directionNav = slider.customDirectionNav;
363 // CONTROLSCONTAINER:
364 } else if (slider.controlsContainer) {
365 $(slider.controlsContainer).append(directionNavScaffold);
366 slider.directionNav = $('.' + namespace + 'direction-nav li a', slider.controlsContainer);
367 } else {
368 slider.append(directionNavScaffold);
369 slider.directionNav = $('.' + namespace + 'direction-nav li a', slider);
370 }
371
372 methods.directionNav.update();
373
374 slider.directionNav.on(eventType, function(event) {
375 event.preventDefault();
376 var target;
377
378 if (watchedEvent === "" || watchedEvent === event.type || event.type === "flexslider-click") {
379 target = ($(this).hasClass(namespace + 'next')) ? slider.getTarget('next') : slider.getTarget('prev');
380 slider.flexAnimate(target, slider.vars.pauseOnAction);
381 }
382
383 // setup flags to prevent event duplication
384 if (watchedEvent === "" && event.type !== "flexslider-click") {
385 watchedEvent = event.type;
386 }
387 methods.setToClearWatchedEvent();
388 });
389 },
390 update: function() {
391 var disabledClass = namespace + 'disabled';
392 if (slider.pagingCount === 1) {
393 slider.directionNav.addClass(disabledClass).attr('tabindex', '-1');
394 } else if (!slider.vars.animationLoop) {
395 if (slider.animatingTo === 0) {
396 slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "prev").addClass(disabledClass).attr('tabindex', '-1');
397 } else if (slider.animatingTo === slider.last) {
398 slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "next").addClass(disabledClass).attr('tabindex', '-1');
399 } else {
400 slider.directionNav.removeClass(disabledClass).prop( 'tabindex', '-1' );
401 }
402 } else {
403 slider.directionNav.removeClass(disabledClass).prop( 'tabindex', '-1' );
404 }
405 }
406 },
407 pausePlay: {
408 setup: function() {
409 var pausePlayScaffold = $('<div class="' + namespace + 'pauseplay"><a href="#"></a></div>');
410
411 // CONTROLSCONTAINER:
412 if (slider.controlsContainer) {
413 slider.controlsContainer.append(pausePlayScaffold);
414 slider.pausePlay = $('.' + namespace + 'pauseplay a', slider.controlsContainer);
415 } else {
416 slider.append(pausePlayScaffold);
417 slider.pausePlay = $('.' + namespace + 'pauseplay a', slider);
418 }
419
420 methods.pausePlay.update((slider.vars.slideshow) ? namespace + 'pause' : namespace + 'play');
421
422 slider.pausePlay.on(eventType, function(event) {
423 event.preventDefault();
424
425 if (watchedEvent === "" || watchedEvent === event.type || event.type === "flexslider-click") {
426 if ($(this).hasClass(namespace + 'pause')) {
427 slider.manualPause = true;
428 slider.manualPlay = false;
429 slider.pause();
430 } else {
431 slider.manualPause = false;
432 slider.manualPlay = true;
433 slider.play();
434 }
435 }
436
437 // setup flags to prevent event duplication
438 if (watchedEvent === "" && event.type !== "flexslider-click") {
439 watchedEvent = event.type;
440 }
441 methods.setToClearWatchedEvent();
442 });
443 },
444 update: function(state) {
445 (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);
446 }
447 },
448 touch: function() {
449 var startX,
450 startY,
451 offset,
452 cwidth,
453 dx,
454 startT,
455 onTouchStart,
456 onTouchMove,
457 onTouchEnd,
458 scrolling = false,
459 localX = 0,
460 localY = 0,
461 accDx = 0;
462
463 onTouchStart = function(e) {
464 if (slider.animating) {
465 e.preventDefault();
466 } else if ( e.touches.length === 1 ) {
467 slider.pause();
468 // CAROUSEL:
469 cwidth = (vertical) ? slider.h : slider. w;
470 startT = Number(new Date());
471 // CAROUSEL:
472
473 // Local vars for X and Y points.
474 localX = e.touches[0].pageX;
475 localY = e.touches[0].pageY;
476
477 offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 :
478 (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
479 (carousel && slider.currentSlide === slider.last) ? slider.limit :
480 (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide :
481 (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth;
482 startX = (vertical) ? localY : localX;
483 startY = (vertical) ? localX : localY;
484 el.addEventListener('touchmove', onTouchMove, false);
485 el.addEventListener('touchend', onTouchEnd, false);
486 }
487 };
488
489 onTouchMove = function(e) {
490 // Local vars for X and Y points.
491
492 localX = e.touches[0].pageX;
493 localY = e.touches[0].pageY;
494
495 dx = (vertical) ? startX - localY : (slider.vars.rtl?-1:1)*(startX - localX);
496 scrolling = (vertical) ? (Math.abs(dx) < Math.abs(localX - startY)) : (Math.abs(dx) < Math.abs(localY - startY));
497 var fxms = 500;
498
499 if ( ! scrolling || Number( new Date() ) - startT > fxms ) {
500 e.preventDefault();
501 if (!fade) {
502 if (!slider.vars.animationLoop) {
503 dx = dx/((slider.currentSlide === 0 && dx < 0 || slider.currentSlide === slider.last && dx > 0) ? (Math.abs(dx)/cwidth+2) : 1);
504 }
505 slider.setProps(offset + dx, "setTouch");
506 }
507 }
508 };
509
510 onTouchEnd = function(e) {
511 // finish the touch by undoing the touch session
512 el.removeEventListener('touchmove', onTouchMove, false);
513
514 if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) {
515 var updateDx = (reverse) ? -dx : dx,
516 target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev');
517
518 if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) {
519 slider.flexAnimate(target, slider.vars.pauseOnAction);
520 } else {
521 if (!fade) { slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true); }
522 }
523 }
524 el.removeEventListener('touchend', onTouchEnd, false);
525
526 startX = null;
527 startY = null;
528 dx = null;
529 offset = null;
530 };
531
532 el.addEventListener('touchstart', onTouchStart, false);
533 },
534 resize: function() {
535 if (!slider.animating && slider.is(':visible')) {
536 if (!carousel) { slider.doMath(); }
537
538 if (fade) {
539 // SMOOTH HEIGHT:
540 methods.smoothHeight();
541 } else if (carousel) { //CAROUSEL:
542 slider.slides.width(slider.computedW);
543 slider.update(slider.pagingCount);
544 slider.setProps();
545 }
546 else if (vertical) { //VERTICAL:
547 slider.viewport.height(slider.h);
548 slider.setProps(slider.h, "setTotal");
549 } else {
550 slider.setProps(slider.computedW, "setTotal");
551 slider.newSlides.width(slider.computedW);
552 // SMOOTH HEIGHT:
553 if (slider.vars.smoothHeight) { methods.smoothHeight(); }
554 }
555 }
556 },
557 smoothHeight: function(dur) {
558 if (!vertical || fade) {
559 var $obj = (fade) ? slider : slider.viewport;
560 $obj.css({"height": slider.slides.eq(slider.animatingTo).innerHeight(), "transition": dur ? ("height " + dur + "ms") : "none"});
561 }
562 },
563 sync: function(action) {
564 var $obj = $(slider.vars.sync).data("flexslider"),
565 target = slider.animatingTo;
566
567 switch (action) {
568 case "animate": $obj.flexAnimate(target, slider.vars.pauseOnAction, false, true); break;
569 case "play": if (!$obj.playing && !$obj.asNav) { $obj.play(); } break;
570 case "pause": $obj.pause(); break;
571 }
572 },
573 uniqueID: function($clone) {
574 // Append _clone to current level and children elements with id attributes
575 $clone.filter( '[id]' ).add($clone.find( '[id]' )).each(function() {
576 var $this = $(this);
577 $this.attr( 'id', $this.attr( 'id' ) + '_clone' );
578 });
579 return $clone;
580 },
581 pauseInvisible: function() {
582 document.addEventListener('visibilitychange', function() {
583 if (document.visibilityState === 'hidden') {
584 if(slider.startTimeout) {
585 clearTimeout(slider.startTimeout); //If clock is ticking, stop timer and prevent from starting while invisible
586 } else {
587 slider.pause(); //Or just pause
588 }
589 }
590 else {
591 if(slider.started) {
592 slider.play(); //Initiated before, just play
593 } else {
594 if (slider.vars.initDelay > 0) {
595 setTimeout(slider.play, slider.vars.initDelay);
596 } else {
597 slider.play(); //Didn't init before: simply init or wait for it
598 }
599 }
600 }
601 });
602 },
603 setToClearWatchedEvent: function() {
604 clearTimeout(watchedEventClearTimer);
605 watchedEventClearTimer = setTimeout(function() {
606 watchedEvent = "";
607 }, 3000);
608 }
609 };
610
611 // public methods
612 slider.flexAnimate = function(target, pause, override, withSync, fromNav) {
613 if (!slider.vars.animationLoop && target !== slider.currentSlide) {
614 slider.direction = (target > slider.currentSlide) ? "next" : "prev";
615 }
616
617 if (asNav && slider.pagingCount === 1) slider.direction = (slider.currentItem < target) ? "next" : "prev";
618
619 if (!slider.animating && (slider.canAdvance(target, fromNav) || override) && slider.is(":visible")) {
620 if (asNav && withSync) {
621 var master = $(slider.vars.asNavFor).data('flexslider');
622 slider.atEnd = target === 0 || target === slider.count - 1;
623 master.flexAnimate(target, true, false, true, fromNav);
624 slider.direction = (slider.currentItem < target) ? "next" : "prev";
625 master.direction = slider.direction;
626
627 if (Math.ceil((target + 1)/slider.visible) - 1 !== slider.currentSlide && target !== 0) {
628 slider.currentItem = target;
629 slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
630 target = Math.floor(target/slider.visible);
631 } else {
632 slider.currentItem = target;
633 slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
634 return false;
635 }
636 }
637
638 slider.animating = true;
639 slider.animatingTo = target;
640
641 // SLIDESHOW:
642 if (pause) { slider.pause(); }
643
644 // API: before() animation Callback
645 slider.vars.before(slider);
646
647 // SYNC:
648 if (slider.syncExists && !fromNav) { methods.sync("animate"); }
649
650 // CONTROLNAV
651 if (slider.vars.controlNav) { methods.controlNav.active(); }
652
653 // !CAROUSEL:
654 // CANDIDATE: slide active class (for add/remove slide)
655 if (!carousel) { slider.slides.removeClass(namespace + 'active-slide').eq(target).addClass(namespace + 'active-slide'); }
656
657 // INFINITE LOOP:
658 // CANDIDATE: atEnd
659 slider.atEnd = target === 0 || target === slider.last;
660
661 // DIRECTIONNAV:
662 if (slider.vars.directionNav) { methods.directionNav.update(); }
663
664 if (target === slider.last) {
665 // API: end() of cycle Callback
666 slider.vars.end(slider);
667 // SLIDESHOW && !INFINITE LOOP:
668 if (!slider.vars.animationLoop) { slider.pause(); }
669 }
670
671 // SLIDE:
672 if (!fade) {
673 var dimension = (vertical) ? slider.slides.filter(':first').height() : slider.computedW,
674 margin, slideString, calcNext;
675
676 // INFINITE LOOP / REVERSE:
677 if (carousel) {
678 margin = slider.vars.itemMargin;
679 calcNext = ((slider.itemW + margin) * slider.move) * slider.animatingTo;
680 slideString = (calcNext > slider.limit && slider.visible !== 1) ? slider.limit : calcNext;
681 } else if (slider.currentSlide === 0 && target === slider.count - 1 && slider.vars.animationLoop && slider.direction !== "next") {
682 slideString = (reverse) ? (slider.count + slider.cloneOffset) * dimension : 0;
683 } else if (slider.currentSlide === slider.last && target === 0 && slider.vars.animationLoop && slider.direction !== "prev") {
684 slideString = (reverse) ? 0 : (slider.count + 1) * dimension;
685 } else {
686 slideString = (reverse) ? ((slider.count - 1) - target + slider.cloneOffset) * dimension : (target + slider.cloneOffset) * dimension;
687 }
688 slider.setProps(slideString, "", slider.vars.animationSpeed);
689
690 if (!slider.vars.animationLoop || !slider.atEnd) {
691 slider.animating = false;
692 slider.currentSlide = slider.animatingTo;
693 }
694
695 // Unbind previous transitionEnd events and re-bind new transitionEnd event
696 slider.container.off("transitionend");
697 slider.container.on("transitionend", function() {
698 clearTimeout(slider.ensureAnimationEnd);
699 slider.wrapup(dimension);
700 });
701
702 // Insurance for the ever-so-fickle transitionEnd event
703 clearTimeout(slider.ensureAnimationEnd);
704 slider.ensureAnimationEnd = setTimeout(function() {
705 slider.wrapup(dimension);
706 }, slider.vars.animationSpeed + 100);
707
708 } else { // FADE:
709 // if (!touch) calls slider.wrapup() on fade animation end; if (touch) calls slider.wrapup() immediately
710 if (!touch) {
711 slider.slides.eq(slider.currentSlide).off("transitionend");
712 slider.slides.eq(target).off("transitionend").on("transitionend", slider.wrapup);
713 }
714
715 slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 });
716 slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 });
717
718 if (touch) {
719 slider.wrapup(dimension);
720 }
721 }
722 // SMOOTH HEIGHT:
723 if (slider.vars.smoothHeight) { methods.smoothHeight(slider.vars.animationSpeed); }
724 }
725 };
726 slider.wrapup = function(dimension) {
727 // SLIDE:
728 if (!fade && !carousel) {
729 if (slider.currentSlide === 0 && slider.animatingTo === slider.last && slider.vars.animationLoop) {
730 slider.setProps(dimension, "jumpEnd");
731 } else if (slider.currentSlide === slider.last && slider.animatingTo === 0 && slider.vars.animationLoop) {
732 slider.setProps(dimension, "jumpStart");
733 }
734 }
735 slider.animating = false;
736 slider.currentSlide = slider.animatingTo;
737 // API: after() animation Callback
738 slider.vars.after(slider);
739 };
740
741 // SLIDESHOW:
742 slider.animateSlides = function() {
743 if (!slider.animating && focused ) { slider.flexAnimate(slider.getTarget("next")); }
744 };
745 // SLIDESHOW:
746 slider.pause = function() {
747 clearInterval(slider.animatedSlides);
748 slider.animatedSlides = null;
749 slider.playing = false;
750 // PAUSEPLAY:
751 if (slider.vars.pausePlay) { methods.pausePlay.update("play"); }
752 // SYNC:
753 if (slider.syncExists) { methods.sync("pause"); }
754 };
755 // SLIDESHOW:
756 slider.play = function() {
757 if (slider.playing) { clearInterval(slider.animatedSlides); }
758 slider.animatedSlides = slider.animatedSlides || setInterval(slider.animateSlides, slider.vars.slideshowSpeed);
759 slider.started = slider.playing = true;
760 // PAUSEPLAY:
761 if (slider.vars.pausePlay) { methods.pausePlay.update("pause"); }
762 // SYNC:
763 if (slider.syncExists) { methods.sync("play"); }
764 };
765 // STOP:
766 slider.stop = function () {
767 slider.pause();
768 slider.stopped = true;
769 };
770 slider.canAdvance = function(target, fromNav) {
771 // ASNAV:
772 var last = (asNav) ? slider.pagingCount - 1 : slider.last;
773 return (fromNav) ? true :
774 (asNav && slider.currentItem === slider.count - 1 && target === 0 && slider.direction === "prev") ? true :
775 (asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 && slider.direction !== "next") ? false :
776 (target === slider.currentSlide && !asNav) ? false :
777 (slider.vars.animationLoop) ? true :
778 (slider.atEnd && slider.currentSlide === 0 && target === last && slider.direction !== "next") ? false :
779 (slider.atEnd && slider.currentSlide === last && target === 0 && slider.direction === "next") ? false :
780 true;
781 };
782 slider.getTarget = function(dir) {
783 slider.direction = dir;
784 if (dir === "next") {
785 return (slider.currentSlide === slider.last) ? 0 : slider.currentSlide + 1;
786 } else {
787 return (slider.currentSlide === 0) ? slider.last : slider.currentSlide - 1;
788 }
789 };
790
791 // SLIDE:
792 slider.setProps = function(pos, special, dur) {
793 var target = (function() {
794 var posCheck = (pos) ? pos : ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo,
795 posCalc = (function() {
796 if (carousel) {
797 return (special === "setTouch") ? pos :
798 (reverse && slider.animatingTo === slider.last) ? 0 :
799 (reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
800 (slider.animatingTo === slider.last) ? slider.limit : posCheck;
801 } else {
802 switch (special) {
803 case "setTotal": return (reverse) ? ((slider.count - 1) - slider.currentSlide + slider.cloneOffset) * pos : (slider.currentSlide + slider.cloneOffset) * pos;
804 case "setTouch": return (reverse) ? pos : pos;
805 case "jumpEnd": return (reverse) ? pos : slider.count * pos;
806 case "jumpStart": return (reverse) ? slider.count * pos : pos;
807 default: return pos;
808 }
809 }
810 }());
811
812 return (posCalc * ((slider.vars.rtl)?1:-1)) + "px";
813 }());
814
815 dur = (dur !== undefined) ? (dur/1000) + "s" : "0s";
816 slider.container.css("transition-duration", dur);
817
818 if (slider.transforms) {
819 target = (vertical) ? "translate3d(0," + target + ",0)" : "translate3d(" + (parseInt(target)+'px') + ",0,0)";
820 } else {
821 slider.container.css("transition-timing-function", easing);
822 }
823
824 slider.args[slider.prop] = target;
825 slider.container.css(slider.args);
826 };
827
828 slider.setup = function(type) {
829 // SLIDE:
830 if (!fade) {
831 var sliderOffset, arr;
832
833 if (type === "init") {
834 slider.viewport = $('<div class="' + namespace + 'viewport"></div>').css({"overflow": "hidden", "position": "relative"}).appendTo(slider).append(slider.container);
835 // INFINITE LOOP:
836 slider.cloneCount = 0;
837 slider.cloneOffset = 0;
838 // REVERSE:
839 if (reverse) {
840 arr = $.makeArray(slider.slides).reverse();
841 slider.slides = $(arr);
842 slider.container.empty().append(slider.slides);
843 }
844 }
845 // INFINITE LOOP && !CAROUSEL:
846 if (slider.vars.animationLoop && !carousel) {
847 slider.cloneCount = 2;
848 slider.cloneOffset = 1;
849 // clear out old clones
850 if (type !== "init") { slider.container.find('.clone').remove(); }
851 slider.container.append(methods.uniqueID(slider.slides.first().clone().addClass('clone')).attr('aria-hidden', 'true'))
852 .prepend(methods.uniqueID(slider.slides.last().clone().addClass('clone')).attr('aria-hidden', 'true'));
853 }
854 slider.newSlides = $(slider.vars.selector, slider);
855
856 sliderOffset = (reverse) ? slider.count - 1 - slider.currentSlide + slider.cloneOffset : slider.currentSlide + slider.cloneOffset;
857 // VERTICAL:
858 if (vertical && !carousel) {
859 slider.container.height((slider.count + slider.cloneCount) * 200 + "%").css("position", "absolute").width("100%");
860 setTimeout(function(){
861 slider.newSlides.css({"display": "block"});
862 slider.doMath();
863 slider.viewport.height(slider.h);
864 slider.setProps(sliderOffset * slider.h, "init");
865 }, (type === "init") ? 100 : 0);
866 } else {
867 slider.container.width((slider.count + slider.cloneCount) * 200 + "%");
868 slider.setProps(sliderOffset * slider.computedW, "init");
869 setTimeout(function(){
870 slider.doMath();
871 if(slider.vars.rtl){
872 slider.newSlides.css({"width": slider.computedW, "marginRight" : slider.computedM, "float": "right", "display": "block"});
873 }
874 else{
875 slider.newSlides.css({"width": slider.computedW, "marginRight" : slider.computedM, "float": "left", "display": "block"});
876 }
877 // SMOOTH HEIGHT:
878 if (slider.vars.smoothHeight) { methods.smoothHeight(); }
879 }, (type === "init") ? 100 : 0);
880 }
881 } else { // FADE:
882 if(slider.vars.rtl){
883 slider.slides.css({"width": "100%", "float": 'right', "marginLeft": "-100%", "position": "relative"});
884 }
885 else{
886 slider.slides.css({"width": "100%", "float": 'left', "marginRight": "-100%", "position": "relative"});
887 }
888 if (type === "init") {
889 if (!touch) {
890 // Every "opacity" change before outerWidth() does NOT get animated; every "opacity" change after outerWidth() becomes a fadeIn animation
891 if (slider.vars.fadeFirstSlide == false) {
892 slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2 });
893 slider.slides.outerWidth();
894 } else {
895 slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).outerWidth();
896 slider.slides.eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2 });
897 }
898 slider.slides.css({ "transition": "opacity " + slider.vars.animationSpeed / 1000 + "s " + easing });
899 } else {
900 slider.slides.css({ "opacity": 0, "display": "block", "transition": "opacity " + slider.vars.animationSpeed / 1000 + "s ease", "zIndex": 1 }).eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2 });
901 }
902 }
903 // SMOOTH HEIGHT:
904 if (slider.vars.smoothHeight) { methods.smoothHeight(); }
905 }
906 // !CAROUSEL:
907 // CANDIDATE: active slide
908 if (!carousel) { slider.slides.removeClass(namespace + "active-slide").eq(slider.currentSlide).addClass(namespace + "active-slide"); }
909
910 //FlexSlider: init() Callback
911 slider.vars.init(slider);
912 };
913
914 slider.doMath = function() {
915 var slide = slider.slides.first(),
916 slideMargin = slider.vars.itemMargin,
917 minItems = slider.vars.minItems,
918 maxItems = slider.vars.maxItems;
919
920 slider.w = (slider.viewport===undefined) ? slider.width() : slider.viewport.width();
921 if (slider.isFirefox) { slider.w = slider.width(); }
922 slider.h = slide.height();
923 slider.boxPadding = slide.outerWidth() - slide.width();
924
925 // CAROUSEL:
926 if (carousel) {
927 slider.itemT = slider.vars.itemWidth + slideMargin;
928 slider.itemM = slideMargin;
929 slider.minW = (minItems) ? minItems * slider.itemT : slider.w;
930 slider.maxW = (maxItems) ? (maxItems * slider.itemT) - slideMargin : slider.w;
931 slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin * (minItems - 1)))/minItems :
932 (slider.maxW < slider.w) ? (slider.w - (slideMargin * (maxItems - 1)))/maxItems :
933 (slider.vars.itemWidth > slider.w) ? slider.w : slider.vars.itemWidth;
934
935 slider.visible = Math.floor(slider.w/(slider.itemW));
936 slider.move = (slider.vars.move > 0 && slider.vars.move < slider.visible ) ? slider.vars.move : slider.visible;
937 slider.pagingCount = Math.ceil(((slider.count - slider.visible)/slider.move) + 1);
938 slider.last = slider.pagingCount - 1;
939 slider.limit = (slider.pagingCount === 1) ? 0 :
940 (slider.vars.itemWidth > slider.w) ? (slider.itemW * (slider.count - 1)) + (slideMargin * (slider.count - 1)) : ((slider.itemW + slideMargin) * slider.count) - slider.w - slideMargin;
941 } else {
942 slider.itemW = slider.w;
943 slider.itemM = slideMargin;
944 slider.pagingCount = slider.count;
945 slider.last = slider.count - 1;
946 }
947 slider.computedW = slider.itemW - slider.boxPadding;
948 slider.computedM = slider.itemM;
949 };
950
951 slider.update = function(pos, action) {
952 slider.doMath();
953
954 // update currentSlide and slider.animatingTo if necessary
955 if (!carousel) {
956 if (pos < slider.currentSlide) {
957 slider.currentSlide += 1;
958 } else if (pos <= slider.currentSlide && pos !== 0) {
959 slider.currentSlide -= 1;
960 }
961 slider.animatingTo = slider.currentSlide;
962 }
963
964 // update controlNav
965 if (slider.vars.controlNav && !slider.manualControls) {
966 if ((action === "add" && !carousel) || slider.pagingCount > slider.controlNav.length) {
967 methods.controlNav.update("add");
968 } else if ((action === "remove" && !carousel) || slider.pagingCount < slider.controlNav.length) {
969 if (carousel && slider.currentSlide > slider.last) {
970 slider.currentSlide -= 1;
971 slider.animatingTo -= 1;
972 }
973 methods.controlNav.update("remove", slider.last);
974 }
975 }
976 // update directionNav
977 if (slider.vars.directionNav) { methods.directionNav.update(); }
978
979 };
980
981 slider.addSlide = function(obj, pos) {
982 var $obj = $(obj);
983
984 slider.count += 1;
985 slider.last = slider.count - 1;
986
987 // append new slide
988 if (vertical && reverse) {
989 (pos !== undefined) ? slider.slides.eq(slider.count - pos).after($obj) : slider.container.prepend($obj);
990 } else {
991 (pos !== undefined) ? slider.slides.eq(pos).before($obj) : slider.container.append($obj);
992 }
993
994 // update currentSlide, animatingTo, controlNav, and directionNav
995 slider.update(pos, "add");
996
997 // update slider.slides
998 slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
999 // re-setup the slider to accommodate new slide
1000 slider.setup();
1001
1002 //FlexSlider: added() Callback
1003 slider.vars.added(slider);
1004 };
1005 slider.removeSlide = function(obj) {
1006 var pos = (isNaN(obj)) ? slider.slides.index($(obj)) : obj;
1007
1008 // update count
1009 slider.count -= 1;
1010 slider.last = slider.count - 1;
1011
1012 // remove slide
1013 if (isNaN(obj)) {
1014 $(obj, slider.slides).remove();
1015 } else {
1016 (vertical && reverse) ? slider.slides.eq(slider.last).remove() : slider.slides.eq(obj).remove();
1017 }
1018
1019 // update currentSlide, animatingTo, controlNav, and directionNav
1020 slider.doMath();
1021 slider.update(pos, "remove");
1022
1023 // update slider.slides
1024 slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
1025 // re-setup the slider to accommodate new slide
1026 slider.setup();
1027
1028 // FlexSlider: removed() Callback
1029 slider.vars.removed(slider);
1030 };
1031
1032 //FlexSlider: Initialize
1033 methods.init();
1034 };
1035
1036 // Ensure the slider isn't focussed if the window loses focus.
1037 $( window ).on( 'blur', function ( e ) {
1038 focused = false;
1039 }).on( 'focus', function ( e ) {
1040 focused = true;
1041 });
1042
1043 //FlexSlider: Default Settings
1044 $.flexslider.defaults = {
1045 namespace: "flex-", //{NEW} String: Prefix string attached to the class of every element generated by the plugin
1046 selector: ".slides > li", //{NEW} Selector: Must match a simple pattern. '{container} > {slide}' -- Ignore pattern at your own peril
1047 animation: "fade", //String: Select your animation type, "fade" or "slide"
1048 easing: "swing", //{NEW} String: Determines the easing method used in jQuery transitions. Most jQuery easing plugin methods are supported!
1049 direction: "horizontal", //String: Select the sliding direction, "horizontal" or "vertical"
1050 reverse: false, //{NEW} Boolean: Reverse the animation direction
1051 animationLoop: true, //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end
1052 smoothHeight: false, //{NEW} Boolean: Allow height of the slider to animate smoothly in horizontal mode
1053 startAt: 0, //Integer: The slide that the slider should start on. Array notation (0 = first slide)
1054 slideshow: true, //Boolean: Animate slider automatically
1055 slideshowSpeed: 7000, //Integer: Set the speed of the slideshow cycling, in milliseconds
1056 animationSpeed: 600, //Integer: Set the speed of animations, in milliseconds
1057 initDelay: 0, //{NEW} Integer: Set an initialization delay, in milliseconds
1058 randomize: false, //Boolean: Randomize slide order
1059 fadeFirstSlide: true, //Boolean: Fade in the first slide when animation type is "fade"
1060 thumbCaptions: false, //Boolean: Whether or not to put captions on thumbnails when using the "thumbnails" controlNav.
1061
1062 // Usability features
1063 pauseOnAction: true, //Boolean: Pause the slideshow when interacting with control elements, highly recommended.
1064 pauseOnHover: false, //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering
1065 pauseInvisible: true, //{NEW} Boolean: Pause the slideshow when tab is invisible, resume when visible. Provides better UX, lower CPU usage.
1066 useCSS: true, //{NEW} Boolean: Slider will use CSS3 3D Transforms
1067 touch: true, //{NEW} Boolean: Allow touch swipe navigation of the slider on touch-enabled devices
1068 video: false, //{NEW} Boolean: If using video in the slider, will prevent CSS3 3D Transforms to avoid graphical glitches
1069
1070 // Primary Controls
1071 controlNav: true, //Boolean: Create navigation for paging control of each slide? Note: Leave true for manualControls usage
1072 directionNav: true, //Boolean: Create navigation for previous/next navigation? (true/false)
1073 prevText: "Previous", //String: Set the text for the "previous" directionNav item
1074 nextText: "Next", //String: Set the text for the "next" directionNav item
1075
1076 // Secondary Navigation
1077 keyboard: true, //Boolean: Allow slider navigating via keyboard left/right keys
1078 multipleKeyboard: false, //{NEW} Boolean: Allow keyboard navigation to affect multiple sliders. Default behavior cuts out keyboard navigation with more than one slider present.
1079 mousewheel: false, //{UPDATED} Boolean: Requires jquery.mousewheel.js (https://github.com/brandonaaron/jquery-mousewheel) - Allows slider navigating via mousewheel
1080 pausePlay: false, //Boolean: Create pause/play dynamic element
1081 pauseText: "Pause", //String: Set the text for the "pause" pausePlay item
1082 playText: "Play", //String: Set the text for the "play" pausePlay item
1083
1084 // Special properties
1085 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.
1086 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.
1087 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)
1088 sync: "", //{NEW} Selector: Mirror the actions performed on this slider with another slider. Use with care.
1089 asNavFor: "", //{NEW} Selector: Internal property exposed for turning the slider into a thumbnail navigation for another slider
1090
1091 // Carousel Options
1092 itemWidth: 0, //{NEW} Integer: Box-model width of individual carousel items, including horizontal borders and padding.
1093 itemMargin: 0, //{NEW} Integer: Margin between carousel items.
1094 minItems: 1, //{NEW} Integer: Minimum number of carousel items that should be visible. Items will resize fluidly when below this.
1095 maxItems: 0, //{NEW} Integer: Maximum number of carousel items that should be visible. Items will resize fluidly when above this limit.
1096 move: 0, //{NEW} Integer: Number of carousel items that should move on animation. If 0, slider will move all visible items.
1097 allowOneSlide: true, //{NEW} Boolean: Whether or not to allow a slider comprised of a single slide
1098
1099 // Browser Specific
1100 isFirefox: false, // {NEW} Boolean: Set to true when Firefox is the browser used.
1101
1102 // Callback API
1103 start: function(){}, //Callback: function(slider) - Fires when the slider loads the first slide
1104 before: function(){}, //Callback: function(slider) - Fires asynchronously with each slider animation
1105 after: function(){}, //Callback: function(slider) - Fires after each slider animation completes
1106 end: function(){}, //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous)
1107 added: function(){}, //{NEW} Callback: function(slider) - Fires after a slide is added
1108 removed: function(){}, //{NEW} Callback: function(slider) - Fires after a slide is removed
1109 init: function() {}, //{NEW} Callback: function(slider) - Fires after the slider is initially setup
1110 rtl: false //{NEW} Boolean: Whether or not to enable RTL mode
1111 };
1112
1113 //FlexSlider: Plugin Function
1114 $.fn.flexslider = function(options) {
1115 if (options === undefined) { options = {}; }
1116
1117 if (typeof options === "object") {
1118 return this.each(function() {
1119 var $this = $(this),
1120 selector = (options.selector) ? options.selector : ".slides > li",
1121 $slides = $this.find(selector);
1122
1123 if ( ( $slides.length === 1 && options.allowOneSlide === false ) || $slides.length === 0 ) {
1124 var fadeIn = [{ opacity: 0 }, { opacity: 1 }];
1125 if ($slides.length) { $slides[0].animate(fadeIn, 400); }
1126 if (options.start) { options.start($this); }
1127 } else if ($this.data('flexslider') === undefined) {
1128 new $.flexslider(this, options);
1129 }
1130 });
1131 } else {
1132 // Helper strings to quickly perform functions on the slider
1133 var $slider = $(this).data('flexslider');
1134 switch (options) {
1135 case "play": $slider.play(); break;
1136 case "pause": $slider.pause(); break;
1137 case "stop": $slider.stop(); break;
1138 case "next": $slider.flexAnimate($slider.getTarget("next"), true); break;
1139 case "prev":
1140 case "previous": $slider.flexAnimate($slider.getTarget("prev"), true); break;
1141 default: if (typeof options === "number") { $slider.flexAnimate(options, true); }
1142 }
1143 }
1144 };
1145 })(jQuery);
1146