PluginProbe ʕ •ᴥ•ʔ
WooCommerce / 11.1.0
WooCommerce v11.1.0
11.1.0 11.1.0-rc.2 11.1.0-rc.1 11.1.0-beta.2 11.1.0-beta.1 11.0.1 11.0.0 11.0.0-rc.3 11.0.0-rc.2 11.0.0-rc.1 11.0.0-beta.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 2 weeks ago jquery.flexslider.min.js 2 weeks ago
jquery.flexslider.js
1150 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 // Register before a gesture starts so embedded WebViews keep touchmove events cancelable.
533 el.addEventListener('touchmove', function() {
534 // Intentionally empty.
535 }, false);
536 el.addEventListener('touchstart', onTouchStart, false);
537 },
538 resize: function() {
539 if (!slider.animating && slider.is(':visible')) {
540 if (!carousel) { slider.doMath(); }
541
542 if (fade) {
543 // SMOOTH HEIGHT:
544 methods.smoothHeight();
545 } else if (carousel) { //CAROUSEL:
546 slider.slides.width(slider.computedW);
547 slider.update(slider.pagingCount);
548 slider.setProps();
549 }
550 else if (vertical) { //VERTICAL:
551 slider.viewport.height(slider.h);
552 slider.setProps(slider.h, "setTotal");
553 } else {
554 slider.setProps(slider.computedW, "setTotal");
555 slider.newSlides.width(slider.computedW);
556 // SMOOTH HEIGHT:
557 if (slider.vars.smoothHeight) { methods.smoothHeight(); }
558 }
559 }
560 },
561 smoothHeight: function(dur) {
562 if (!vertical || fade) {
563 var $obj = (fade) ? slider : slider.viewport;
564 $obj.css({"height": slider.slides.eq(slider.animatingTo).innerHeight(), "transition": dur ? ("height " + dur + "ms") : "none"});
565 }
566 },
567 sync: function(action) {
568 var $obj = $(slider.vars.sync).data("flexslider"),
569 target = slider.animatingTo;
570
571 switch (action) {
572 case "animate": $obj.flexAnimate(target, slider.vars.pauseOnAction, false, true); break;
573 case "play": if (!$obj.playing && !$obj.asNav) { $obj.play(); } break;
574 case "pause": $obj.pause(); break;
575 }
576 },
577 uniqueID: function($clone) {
578 // Append _clone to current level and children elements with id attributes
579 $clone.filter( '[id]' ).add($clone.find( '[id]' )).each(function() {
580 var $this = $(this);
581 $this.attr( 'id', $this.attr( 'id' ) + '_clone' );
582 });
583 return $clone;
584 },
585 pauseInvisible: function() {
586 document.addEventListener('visibilitychange', function() {
587 if (document.visibilityState === 'hidden') {
588 if(slider.startTimeout) {
589 clearTimeout(slider.startTimeout); //If clock is ticking, stop timer and prevent from starting while invisible
590 } else {
591 slider.pause(); //Or just pause
592 }
593 }
594 else {
595 if(slider.started) {
596 slider.play(); //Initiated before, just play
597 } else {
598 if (slider.vars.initDelay > 0) {
599 setTimeout(slider.play, slider.vars.initDelay);
600 } else {
601 slider.play(); //Didn't init before: simply init or wait for it
602 }
603 }
604 }
605 });
606 },
607 setToClearWatchedEvent: function() {
608 clearTimeout(watchedEventClearTimer);
609 watchedEventClearTimer = setTimeout(function() {
610 watchedEvent = "";
611 }, 3000);
612 }
613 };
614
615 // public methods
616 slider.flexAnimate = function(target, pause, override, withSync, fromNav) {
617 if (!slider.vars.animationLoop && target !== slider.currentSlide) {
618 slider.direction = (target > slider.currentSlide) ? "next" : "prev";
619 }
620
621 if (asNav && slider.pagingCount === 1) slider.direction = (slider.currentItem < target) ? "next" : "prev";
622
623 if (!slider.animating && (slider.canAdvance(target, fromNav) || override) && slider.is(":visible")) {
624 if (asNav && withSync) {
625 var master = $(slider.vars.asNavFor).data('flexslider');
626 slider.atEnd = target === 0 || target === slider.count - 1;
627 master.flexAnimate(target, true, false, true, fromNav);
628 slider.direction = (slider.currentItem < target) ? "next" : "prev";
629 master.direction = slider.direction;
630
631 if (Math.ceil((target + 1)/slider.visible) - 1 !== slider.currentSlide && target !== 0) {
632 slider.currentItem = target;
633 slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
634 target = Math.floor(target/slider.visible);
635 } else {
636 slider.currentItem = target;
637 slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
638 return false;
639 }
640 }
641
642 slider.animating = true;
643 slider.animatingTo = target;
644
645 // SLIDESHOW:
646 if (pause) { slider.pause(); }
647
648 // API: before() animation Callback
649 slider.vars.before(slider);
650
651 // SYNC:
652 if (slider.syncExists && !fromNav) { methods.sync("animate"); }
653
654 // CONTROLNAV
655 if (slider.vars.controlNav) { methods.controlNav.active(); }
656
657 // !CAROUSEL:
658 // CANDIDATE: slide active class (for add/remove slide)
659 if (!carousel) { slider.slides.removeClass(namespace + 'active-slide').eq(target).addClass(namespace + 'active-slide'); }
660
661 // INFINITE LOOP:
662 // CANDIDATE: atEnd
663 slider.atEnd = target === 0 || target === slider.last;
664
665 // DIRECTIONNAV:
666 if (slider.vars.directionNav) { methods.directionNav.update(); }
667
668 if (target === slider.last) {
669 // API: end() of cycle Callback
670 slider.vars.end(slider);
671 // SLIDESHOW && !INFINITE LOOP:
672 if (!slider.vars.animationLoop) { slider.pause(); }
673 }
674
675 // SLIDE:
676 if (!fade) {
677 var dimension = (vertical) ? slider.slides.filter(':first').height() : slider.computedW,
678 margin, slideString, calcNext;
679
680 // INFINITE LOOP / REVERSE:
681 if (carousel) {
682 margin = slider.vars.itemMargin;
683 calcNext = ((slider.itemW + margin) * slider.move) * slider.animatingTo;
684 slideString = (calcNext > slider.limit && slider.visible !== 1) ? slider.limit : calcNext;
685 } else if (slider.currentSlide === 0 && target === slider.count - 1 && slider.vars.animationLoop && slider.direction !== "next") {
686 slideString = (reverse) ? (slider.count + slider.cloneOffset) * dimension : 0;
687 } else if (slider.currentSlide === slider.last && target === 0 && slider.vars.animationLoop && slider.direction !== "prev") {
688 slideString = (reverse) ? 0 : (slider.count + 1) * dimension;
689 } else {
690 slideString = (reverse) ? ((slider.count - 1) - target + slider.cloneOffset) * dimension : (target + slider.cloneOffset) * dimension;
691 }
692 slider.setProps(slideString, "", slider.vars.animationSpeed);
693
694 if (!slider.vars.animationLoop || !slider.atEnd) {
695 slider.animating = false;
696 slider.currentSlide = slider.animatingTo;
697 }
698
699 // Unbind previous transitionEnd events and re-bind new transitionEnd event
700 slider.container.off("transitionend");
701 slider.container.on("transitionend", function() {
702 clearTimeout(slider.ensureAnimationEnd);
703 slider.wrapup(dimension);
704 });
705
706 // Insurance for the ever-so-fickle transitionEnd event
707 clearTimeout(slider.ensureAnimationEnd);
708 slider.ensureAnimationEnd = setTimeout(function() {
709 slider.wrapup(dimension);
710 }, slider.vars.animationSpeed + 100);
711
712 } else { // FADE:
713 // if (!touch) calls slider.wrapup() on fade animation end; if (touch) calls slider.wrapup() immediately
714 if (!touch) {
715 slider.slides.eq(slider.currentSlide).off("transitionend");
716 slider.slides.eq(target).off("transitionend").on("transitionend", slider.wrapup);
717 }
718
719 slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 });
720 slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 });
721
722 if (touch) {
723 slider.wrapup(dimension);
724 }
725 }
726 // SMOOTH HEIGHT:
727 if (slider.vars.smoothHeight) { methods.smoothHeight(slider.vars.animationSpeed); }
728 }
729 };
730 slider.wrapup = function(dimension) {
731 // SLIDE:
732 if (!fade && !carousel) {
733 if (slider.currentSlide === 0 && slider.animatingTo === slider.last && slider.vars.animationLoop) {
734 slider.setProps(dimension, "jumpEnd");
735 } else if (slider.currentSlide === slider.last && slider.animatingTo === 0 && slider.vars.animationLoop) {
736 slider.setProps(dimension, "jumpStart");
737 }
738 }
739 slider.animating = false;
740 slider.currentSlide = slider.animatingTo;
741 // API: after() animation Callback
742 slider.vars.after(slider);
743 };
744
745 // SLIDESHOW:
746 slider.animateSlides = function() {
747 if (!slider.animating && focused ) { slider.flexAnimate(slider.getTarget("next")); }
748 };
749 // SLIDESHOW:
750 slider.pause = function() {
751 clearInterval(slider.animatedSlides);
752 slider.animatedSlides = null;
753 slider.playing = false;
754 // PAUSEPLAY:
755 if (slider.vars.pausePlay) { methods.pausePlay.update("play"); }
756 // SYNC:
757 if (slider.syncExists) { methods.sync("pause"); }
758 };
759 // SLIDESHOW:
760 slider.play = function() {
761 if (slider.playing) { clearInterval(slider.animatedSlides); }
762 slider.animatedSlides = slider.animatedSlides || setInterval(slider.animateSlides, slider.vars.slideshowSpeed);
763 slider.started = slider.playing = true;
764 // PAUSEPLAY:
765 if (slider.vars.pausePlay) { methods.pausePlay.update("pause"); }
766 // SYNC:
767 if (slider.syncExists) { methods.sync("play"); }
768 };
769 // STOP:
770 slider.stop = function () {
771 slider.pause();
772 slider.stopped = true;
773 };
774 slider.canAdvance = function(target, fromNav) {
775 // ASNAV:
776 var last = (asNav) ? slider.pagingCount - 1 : slider.last;
777 return (fromNav) ? true :
778 (asNav && slider.currentItem === slider.count - 1 && target === 0 && slider.direction === "prev") ? true :
779 (asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 && slider.direction !== "next") ? false :
780 (target === slider.currentSlide && !asNav) ? false :
781 (slider.vars.animationLoop) ? true :
782 (slider.atEnd && slider.currentSlide === 0 && target === last && slider.direction !== "next") ? false :
783 (slider.atEnd && slider.currentSlide === last && target === 0 && slider.direction === "next") ? false :
784 true;
785 };
786 slider.getTarget = function(dir) {
787 slider.direction = dir;
788 if (dir === "next") {
789 return (slider.currentSlide === slider.last) ? 0 : slider.currentSlide + 1;
790 } else {
791 return (slider.currentSlide === 0) ? slider.last : slider.currentSlide - 1;
792 }
793 };
794
795 // SLIDE:
796 slider.setProps = function(pos, special, dur) {
797 var target = (function() {
798 var posCheck = (pos) ? pos : ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo,
799 posCalc = (function() {
800 if (carousel) {
801 return (special === "setTouch") ? pos :
802 (reverse && slider.animatingTo === slider.last) ? 0 :
803 (reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
804 (slider.animatingTo === slider.last) ? slider.limit : posCheck;
805 } else {
806 switch (special) {
807 case "setTotal": return (reverse) ? ((slider.count - 1) - slider.currentSlide + slider.cloneOffset) * pos : (slider.currentSlide + slider.cloneOffset) * pos;
808 case "setTouch": return (reverse) ? pos : pos;
809 case "jumpEnd": return (reverse) ? pos : slider.count * pos;
810 case "jumpStart": return (reverse) ? slider.count * pos : pos;
811 default: return pos;
812 }
813 }
814 }());
815
816 return (posCalc * ((slider.vars.rtl)?1:-1)) + "px";
817 }());
818
819 dur = (dur !== undefined) ? (dur/1000) + "s" : "0s";
820 slider.container.css("transition-duration", dur);
821
822 if (slider.transforms) {
823 target = (vertical) ? "translate3d(0," + target + ",0)" : "translate3d(" + target + ",0,0)";
824 } else {
825 slider.container.css("transition-timing-function", easing);
826 }
827
828 slider.args[slider.prop] = target;
829 slider.container.css(slider.args);
830 };
831
832 slider.setup = function(type) {
833 // SLIDE:
834 if (!fade) {
835 var sliderOffset, arr;
836
837 if (type === "init") {
838 slider.viewport = $('<div class="' + namespace + 'viewport"></div>').css({"overflow": "hidden", "position": "relative"}).appendTo(slider).append(slider.container);
839 // INFINITE LOOP:
840 slider.cloneCount = 0;
841 slider.cloneOffset = 0;
842 // REVERSE:
843 if (reverse) {
844 arr = $.makeArray(slider.slides).reverse();
845 slider.slides = $(arr);
846 slider.container.empty().append(slider.slides);
847 }
848 }
849 // INFINITE LOOP && !CAROUSEL:
850 if (slider.vars.animationLoop && !carousel) {
851 slider.cloneCount = 2;
852 slider.cloneOffset = 1;
853 // clear out old clones
854 if (type !== "init") { slider.container.find('.clone').remove(); }
855 slider.container.append(methods.uniqueID(slider.slides.first().clone().addClass('clone')).attr('aria-hidden', 'true'))
856 .prepend(methods.uniqueID(slider.slides.last().clone().addClass('clone')).attr('aria-hidden', 'true'));
857 }
858 slider.newSlides = $(slider.vars.selector, slider);
859
860 sliderOffset = (reverse) ? slider.count - 1 - slider.currentSlide + slider.cloneOffset : slider.currentSlide + slider.cloneOffset;
861 // VERTICAL:
862 if (vertical && !carousel) {
863 slider.container.height((slider.count + slider.cloneCount) * 200 + "%").css("position", "absolute").width("100%");
864 setTimeout(function(){
865 slider.newSlides.css({"display": "block"});
866 slider.doMath();
867 slider.viewport.height(slider.h);
868 slider.setProps(sliderOffset * slider.h, "init");
869 }, (type === "init") ? 100 : 0);
870 } else {
871 slider.container.width((slider.count + slider.cloneCount) * 200 + "%");
872 slider.setProps(sliderOffset * slider.computedW, "init");
873 setTimeout(function(){
874 slider.doMath();
875 if(slider.vars.rtl){
876 slider.newSlides.css({"width": slider.computedW, "marginRight" : slider.computedM, "float": "right", "display": "block"});
877 }
878 else{
879 slider.newSlides.css({"width": slider.computedW, "marginRight" : slider.computedM, "float": "left", "display": "block"});
880 }
881 // SMOOTH HEIGHT:
882 if (slider.vars.smoothHeight) { methods.smoothHeight(); }
883 }, (type === "init") ? 100 : 0);
884 }
885 } else { // FADE:
886 if(slider.vars.rtl){
887 slider.slides.css({"width": "100%", "float": 'right', "marginLeft": "-100%", "position": "relative"});
888 }
889 else{
890 slider.slides.css({"width": "100%", "float": 'left', "marginRight": "-100%", "position": "relative"});
891 }
892 if (type === "init") {
893 if (!touch) {
894 // Every "opacity" change before outerWidth() does NOT get animated; every "opacity" change after outerWidth() becomes a fadeIn animation
895 if (slider.vars.fadeFirstSlide == false) {
896 slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2 });
897 slider.slides.outerWidth();
898 } else {
899 slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).outerWidth();
900 slider.slides.eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2 });
901 }
902 slider.slides.css({ "transition": "opacity " + slider.vars.animationSpeed / 1000 + "s " + easing });
903 } else {
904 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 });
905 }
906 }
907 // SMOOTH HEIGHT:
908 if (slider.vars.smoothHeight) { methods.smoothHeight(); }
909 }
910 // !CAROUSEL:
911 // CANDIDATE: active slide
912 if (!carousel) { slider.slides.removeClass(namespace + "active-slide").eq(slider.currentSlide).addClass(namespace + "active-slide"); }
913
914 //FlexSlider: init() Callback
915 slider.vars.init(slider);
916 };
917
918 slider.doMath = function() {
919 var slide = slider.slides.first(),
920 slideMargin = slider.vars.itemMargin,
921 minItems = slider.vars.minItems,
922 maxItems = slider.vars.maxItems;
923
924 slider.w = (slider.viewport===undefined) ? slider.width() : slider.viewport.width();
925 if (slider.isFirefox) { slider.w = slider.width(); }
926 slider.h = slide.height();
927 slider.boxPadding = slide.outerWidth() - slide.width();
928
929 // CAROUSEL:
930 if (carousel) {
931 slider.itemT = slider.vars.itemWidth + slideMargin;
932 slider.itemM = slideMargin;
933 slider.minW = (minItems) ? minItems * slider.itemT : slider.w;
934 slider.maxW = (maxItems) ? (maxItems * slider.itemT) - slideMargin : slider.w;
935 slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin * (minItems - 1)))/minItems :
936 (slider.maxW < slider.w) ? (slider.w - (slideMargin * (maxItems - 1)))/maxItems :
937 (slider.vars.itemWidth > slider.w) ? slider.w : slider.vars.itemWidth;
938
939 slider.visible = Math.floor(slider.w/(slider.itemW));
940 slider.move = (slider.vars.move > 0 && slider.vars.move < slider.visible ) ? slider.vars.move : slider.visible;
941 slider.pagingCount = Math.ceil(((slider.count - slider.visible)/slider.move) + 1);
942 slider.last = slider.pagingCount - 1;
943 slider.limit = (slider.pagingCount === 1) ? 0 :
944 (slider.vars.itemWidth > slider.w) ? (slider.itemW * (slider.count - 1)) + (slideMargin * (slider.count - 1)) : ((slider.itemW + slideMargin) * slider.count) - slider.w - slideMargin;
945 } else {
946 slider.itemW = slider.w;
947 slider.itemM = slideMargin;
948 slider.pagingCount = slider.count;
949 slider.last = slider.count - 1;
950 }
951 slider.computedW = slider.itemW - slider.boxPadding;
952 slider.computedM = slider.itemM;
953 };
954
955 slider.update = function(pos, action) {
956 slider.doMath();
957
958 // update currentSlide and slider.animatingTo if necessary
959 if (!carousel) {
960 if (pos < slider.currentSlide) {
961 slider.currentSlide += 1;
962 } else if (pos <= slider.currentSlide && pos !== 0) {
963 slider.currentSlide -= 1;
964 }
965 slider.animatingTo = slider.currentSlide;
966 }
967
968 // update controlNav
969 if (slider.vars.controlNav && !slider.manualControls) {
970 if ((action === "add" && !carousel) || slider.pagingCount > slider.controlNav.length) {
971 methods.controlNav.update("add");
972 } else if ((action === "remove" && !carousel) || slider.pagingCount < slider.controlNav.length) {
973 if (carousel && slider.currentSlide > slider.last) {
974 slider.currentSlide -= 1;
975 slider.animatingTo -= 1;
976 }
977 methods.controlNav.update("remove", slider.last);
978 }
979 }
980 // update directionNav
981 if (slider.vars.directionNav) { methods.directionNav.update(); }
982
983 };
984
985 slider.addSlide = function(obj, pos) {
986 var $obj = $(obj);
987
988 slider.count += 1;
989 slider.last = slider.count - 1;
990
991 // append new slide
992 if (vertical && reverse) {
993 (pos !== undefined) ? slider.slides.eq(slider.count - pos).after($obj) : slider.container.prepend($obj);
994 } else {
995 (pos !== undefined) ? slider.slides.eq(pos).before($obj) : slider.container.append($obj);
996 }
997
998 // update currentSlide, animatingTo, controlNav, and directionNav
999 slider.update(pos, "add");
1000
1001 // update slider.slides
1002 slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
1003 // re-setup the slider to accommodate new slide
1004 slider.setup();
1005
1006 //FlexSlider: added() Callback
1007 slider.vars.added(slider);
1008 };
1009 slider.removeSlide = function(obj) {
1010 var pos = (isNaN(obj)) ? slider.slides.index($(obj)) : obj;
1011
1012 // update count
1013 slider.count -= 1;
1014 slider.last = slider.count - 1;
1015
1016 // remove slide
1017 if (isNaN(obj)) {
1018 $(obj, slider.slides).remove();
1019 } else {
1020 (vertical && reverse) ? slider.slides.eq(slider.last).remove() : slider.slides.eq(obj).remove();
1021 }
1022
1023 // update currentSlide, animatingTo, controlNav, and directionNav
1024 slider.doMath();
1025 slider.update(pos, "remove");
1026
1027 // update slider.slides
1028 slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
1029 // re-setup the slider to accommodate new slide
1030 slider.setup();
1031
1032 // FlexSlider: removed() Callback
1033 slider.vars.removed(slider);
1034 };
1035
1036 //FlexSlider: Initialize
1037 methods.init();
1038 };
1039
1040 // Ensure the slider isn't focussed if the window loses focus.
1041 $( window ).on( 'blur', function ( e ) {
1042 focused = false;
1043 }).on( 'focus', function ( e ) {
1044 focused = true;
1045 });
1046
1047 //FlexSlider: Default Settings
1048 $.flexslider.defaults = {
1049 namespace: "flex-", //{NEW} String: Prefix string attached to the class of every element generated by the plugin
1050 selector: ".slides > li", //{NEW} Selector: Must match a simple pattern. '{container} > {slide}' -- Ignore pattern at your own peril
1051 animation: "fade", //String: Select your animation type, "fade" or "slide"
1052 easing: "swing", //{NEW} String: Determines the easing method used in jQuery transitions. Most jQuery easing plugin methods are supported!
1053 direction: "horizontal", //String: Select the sliding direction, "horizontal" or "vertical"
1054 reverse: false, //{NEW} Boolean: Reverse the animation direction
1055 animationLoop: true, //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end
1056 smoothHeight: false, //{NEW} Boolean: Allow height of the slider to animate smoothly in horizontal mode
1057 startAt: 0, //Integer: The slide that the slider should start on. Array notation (0 = first slide)
1058 slideshow: true, //Boolean: Animate slider automatically
1059 slideshowSpeed: 7000, //Integer: Set the speed of the slideshow cycling, in milliseconds
1060 animationSpeed: 600, //Integer: Set the speed of animations, in milliseconds
1061 initDelay: 0, //{NEW} Integer: Set an initialization delay, in milliseconds
1062 randomize: false, //Boolean: Randomize slide order
1063 fadeFirstSlide: true, //Boolean: Fade in the first slide when animation type is "fade"
1064 thumbCaptions: false, //Boolean: Whether or not to put captions on thumbnails when using the "thumbnails" controlNav.
1065
1066 // Usability features
1067 pauseOnAction: true, //Boolean: Pause the slideshow when interacting with control elements, highly recommended.
1068 pauseOnHover: false, //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering
1069 pauseInvisible: true, //{NEW} Boolean: Pause the slideshow when tab is invisible, resume when visible. Provides better UX, lower CPU usage.
1070 useCSS: true, //{NEW} Boolean: Slider will use CSS3 3D Transforms
1071 touch: true, //{NEW} Boolean: Allow touch swipe navigation of the slider on touch-enabled devices
1072 video: false, //{NEW} Boolean: If using video in the slider, will prevent CSS3 3D Transforms to avoid graphical glitches
1073
1074 // Primary Controls
1075 controlNav: true, //Boolean: Create navigation for paging control of each slide? Note: Leave true for manualControls usage
1076 directionNav: true, //Boolean: Create navigation for previous/next navigation? (true/false)
1077 prevText: "Previous", //String: Set the text for the "previous" directionNav item
1078 nextText: "Next", //String: Set the text for the "next" directionNav item
1079
1080 // Secondary Navigation
1081 keyboard: true, //Boolean: Allow slider navigating via keyboard left/right keys
1082 multipleKeyboard: false, //{NEW} Boolean: Allow keyboard navigation to affect multiple sliders. Default behavior cuts out keyboard navigation with more than one slider present.
1083 mousewheel: false, //{UPDATED} Boolean: Requires jquery.mousewheel.js (https://github.com/brandonaaron/jquery-mousewheel) - Allows slider navigating via mousewheel
1084 pausePlay: false, //Boolean: Create pause/play dynamic element
1085 pauseText: "Pause", //String: Set the text for the "pause" pausePlay item
1086 playText: "Play", //String: Set the text for the "play" pausePlay item
1087
1088 // Special properties
1089 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.
1090 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.
1091 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)
1092 sync: "", //{NEW} Selector: Mirror the actions performed on this slider with another slider. Use with care.
1093 asNavFor: "", //{NEW} Selector: Internal property exposed for turning the slider into a thumbnail navigation for another slider
1094
1095 // Carousel Options
1096 itemWidth: 0, //{NEW} Integer: Box-model width of individual carousel items, including horizontal borders and padding.
1097 itemMargin: 0, //{NEW} Integer: Margin between carousel items.
1098 minItems: 1, //{NEW} Integer: Minimum number of carousel items that should be visible. Items will resize fluidly when below this.
1099 maxItems: 0, //{NEW} Integer: Maximum number of carousel items that should be visible. Items will resize fluidly when above this limit.
1100 move: 0, //{NEW} Integer: Number of carousel items that should move on animation. If 0, slider will move all visible items.
1101 allowOneSlide: true, //{NEW} Boolean: Whether or not to allow a slider comprised of a single slide
1102
1103 // Browser Specific
1104 isFirefox: false, // {NEW} Boolean: Set to true when Firefox is the browser used.
1105
1106 // Callback API
1107 start: function(){}, //Callback: function(slider) - Fires when the slider loads the first slide
1108 before: function(){}, //Callback: function(slider) - Fires asynchronously with each slider animation
1109 after: function(){}, //Callback: function(slider) - Fires after each slider animation completes
1110 end: function(){}, //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous)
1111 added: function(){}, //{NEW} Callback: function(slider) - Fires after a slide is added
1112 removed: function(){}, //{NEW} Callback: function(slider) - Fires after a slide is removed
1113 init: function() {}, //{NEW} Callback: function(slider) - Fires after the slider is initially setup
1114 rtl: false //{NEW} Boolean: Whether or not to enable RTL mode
1115 };
1116
1117 //FlexSlider: Plugin Function
1118 $.fn.flexslider = function(options) {
1119 if (options === undefined) { options = {}; }
1120
1121 if (typeof options === "object") {
1122 return this.each(function() {
1123 var $this = $(this),
1124 selector = (options.selector) ? options.selector : ".slides > li",
1125 $slides = $this.find(selector);
1126
1127 if ( ( $slides.length === 1 && options.allowOneSlide === false ) || $slides.length === 0 ) {
1128 var fadeIn = [{ opacity: 0 }, { opacity: 1 }];
1129 if ($slides.length) { $slides[0].animate(fadeIn, 400); }
1130 if (options.start) { options.start($this); }
1131 } else if ($this.data('flexslider') === undefined) {
1132 new $.flexslider(this, options);
1133 }
1134 });
1135 } else {
1136 // Helper strings to quickly perform functions on the slider
1137 var $slider = $(this).data('flexslider');
1138 switch (options) {
1139 case "play": $slider.play(); break;
1140 case "pause": $slider.pause(); break;
1141 case "stop": $slider.stop(); break;
1142 case "next": $slider.flexAnimate($slider.getTarget("next"), true); break;
1143 case "prev":
1144 case "previous": $slider.flexAnimate($slider.getTarget("prev"), true); break;
1145 default: if (typeof options === "number") { $slider.flexAnimate(options, true); }
1146 }
1147 }
1148 };
1149 })(jQuery);
1150