PluginProbe ʕ •ᴥ•ʔ
WooCommerce / 6.9.2
WooCommerce v6.9.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 3 years ago jquery.flexslider.min.js 3 years ago
jquery.flexslider.js
1248 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 //FlexSlider: Object Instance
12 $.flexslider = function(el, options) {
13 var slider = $(el);
14
15 // making variables public
16
17 //if rtl value was not passed and html is in rtl..enable it by default.
18 if(typeof options.rtl=='undefined' && $('html').attr('dir')=='rtl'){
19 options.rtl=true;
20 }
21 slider.vars = $.extend({}, $.flexslider.defaults, options);
22
23 var namespace = slider.vars.namespace,
24 msGesture = window.navigator && window.navigator.msPointerEnabled && window.MSGesture,
25 touch = (( "ontouchstart" in window ) || msGesture || window.DocumentTouch && document instanceof DocumentTouch) && slider.vars.touch,
26 // deprecating this idea, as devices are being released with both of these events
27 eventType = "click touchend MSPointerUp keyup",
28 watchedEvent = "",
29 watchedEventClearTimer,
30 vertical = slider.vars.direction === "vertical",
31 reverse = slider.vars.reverse,
32 carousel = (slider.vars.itemWidth > 0),
33 fade = slider.vars.animation === "fade",
34 asNav = slider.vars.asNavFor !== "",
35 methods = {};
36
37 // Store a reference to the slider object
38 $.data(el, "flexslider", slider);
39
40 // Private slider methods
41 methods = {
42 init: function() {
43 slider.animating = false;
44 // Get current slide and make sure it is a number
45 slider.currentSlide = parseInt( ( slider.vars.startAt ? slider.vars.startAt : 0), 10 );
46 if ( isNaN( slider.currentSlide ) ) { slider.currentSlide = 0; }
47 slider.animatingTo = slider.currentSlide;
48 slider.atEnd = (slider.currentSlide === 0 || slider.currentSlide === slider.last);
49 slider.containerSelector = slider.vars.selector.substr(0,slider.vars.selector.search(' '));
50 slider.slides = $(slider.vars.selector, slider);
51 slider.container = $(slider.containerSelector, slider);
52 slider.count = slider.slides.length;
53 // SYNC:
54 slider.syncExists = $(slider.vars.sync).length > 0;
55 // SLIDE:
56 if (slider.vars.animation === "slide") { slider.vars.animation = "swing"; }
57 slider.prop = (vertical) ? "top" : ( slider.vars.rtl ? "marginRight" : "marginLeft" );
58 slider.args = {};
59 // SLIDESHOW:
60 slider.manualPause = false;
61 slider.stopped = false;
62 //PAUSE WHEN INVISIBLE
63 slider.started = false;
64 slider.startTimeout = null;
65 // TOUCH/USECSS:
66 slider.transitions = !slider.vars.video && !fade && slider.vars.useCSS && (function() {
67 var obj = document.createElement('div'),
68 props = ['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective'];
69 for (var i in props) {
70 if ( obj.style[ props[i] ] !== undefined ) {
71 slider.pfx = props[i].replace('Perspective','').toLowerCase();
72 slider.prop = "-" + slider.pfx + "-transform";
73 return true;
74 }
75 }
76 return false;
77 }());
78 slider.isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
79 slider.ensureAnimationEnd = '';
80 // CONTROLSCONTAINER:
81 if (slider.vars.controlsContainer !== "") slider.controlsContainer = $(slider.vars.controlsContainer).length > 0 && $(slider.vars.controlsContainer);
82 // MANUAL:
83 if (slider.vars.manualControls !== "") slider.manualControls = $(slider.vars.manualControls).length > 0 && $(slider.vars.manualControls);
84
85 // CUSTOM DIRECTION NAV:
86 if (slider.vars.customDirectionNav !== "") slider.customDirectionNav = $(slider.vars.customDirectionNav).length === 2 && $(slider.vars.customDirectionNav);
87
88 // RANDOMIZE:
89 if (slider.vars.randomize) {
90 slider.slides.sort(function() { return (Math.round(Math.random())-0.5); });
91 slider.container.empty().append(slider.slides);
92 }
93
94 slider.doMath();
95
96 // INIT
97 slider.setup("init");
98
99 // CONTROLNAV:
100 if (slider.vars.controlNav) { methods.controlNav.setup(); }
101
102 // DIRECTIONNAV:
103 if (slider.vars.directionNav) { methods.directionNav.setup(); }
104
105 // KEYBOARD:
106 if (slider.vars.keyboard && ($(slider.containerSelector).length === 1 || slider.vars.multipleKeyboard)) {
107 $(document).on('keyup', function(event) {
108 var keycode = event.keyCode;
109 if (!slider.animating && (keycode === 39 || keycode === 37)) {
110 var target = (slider.vars.rtl?
111 ((keycode === 37) ? slider.getTarget('next') :
112 (keycode === 39) ? slider.getTarget('prev') : false)
113 :
114 ((keycode === 39) ? slider.getTarget('next') :
115 (keycode === 37) ? slider.getTarget('prev') : false)
116 )
117 ;
118 slider.flexAnimate(target, slider.vars.pauseOnAction);
119 }
120 });
121 }
122 // MOUSEWHEEL:
123 if (slider.vars.mousewheel) {
124 slider.on('mousewheel', function(event, delta, deltaX, deltaY) {
125 event.preventDefault();
126 var target = (delta < 0) ? slider.getTarget('next') : slider.getTarget('prev');
127 slider.flexAnimate(target, slider.vars.pauseOnAction);
128 });
129 }
130
131 // PAUSEPLAY
132 if (slider.vars.pausePlay) { methods.pausePlay.setup(); }
133
134 //PAUSE WHEN INVISIBLE
135 if (slider.vars.slideshow && slider.vars.pauseInvisible) { methods.pauseInvisible.init(); }
136
137 // SLIDSESHOW
138 if (slider.vars.slideshow) {
139 if (slider.vars.pauseOnHover) {
140 slider.on( 'mouseenter', function() {
141 if (!slider.manualPlay && !slider.manualPause) { slider.pause(); }
142 } ).on( 'mouseleave', function() {
143 if (!slider.manualPause && !slider.manualPlay && !slider.stopped) { slider.play(); }
144 });
145 }
146 // initialize animation
147 //If we're visible, or we don't use PageVisibility API
148 if(!slider.vars.pauseInvisible || !methods.pauseInvisible.isHidden()) {
149 (slider.vars.initDelay > 0) ? slider.startTimeout = setTimeout(slider.play, slider.vars.initDelay) : slider.play();
150 }
151 }
152
153 // ASNAV:
154 if (asNav) { methods.asNav.setup(); }
155
156 // TOUCH
157 if (touch && slider.vars.touch) { methods.touch(); }
158
159 // FADE&&SMOOTHHEIGHT || SLIDE:
160 if (!fade || (fade && slider.vars.smoothHeight)) { $(window).on("resize orientationchange focus", methods.resize); }
161
162 slider.find("img").attr("draggable", "false");
163
164 // API: start() Callback
165 setTimeout(function(){
166 slider.vars.start(slider);
167 }, 200);
168 },
169 asNav: {
170 setup: function() {
171 slider.asNav = true;
172 slider.animatingTo = Math.floor(slider.currentSlide/slider.move);
173 slider.currentItem = slider.currentSlide;
174 slider.slides.removeClass(namespace + "active-slide").eq(slider.currentItem).addClass(namespace + "active-slide");
175 if(!msGesture){
176 slider.slides.on(eventType, function(e){
177 e.preventDefault();
178 var $slide = $(this),
179 target = $slide.index();
180 var posFromX;
181 if(slider.vars.rtl){
182 posFromX = -1*($slide.offset().right - $(slider).scrollLeft()); // Find position of slide relative to right of slider container
183 }
184 else
185 {
186 posFromX = $slide.offset().left - $(slider).scrollLeft(); // Find position of slide relative to left of slider container
187 }
188 if( posFromX <= 0 && $slide.hasClass( namespace + 'active-slide' ) ) {
189 slider.flexAnimate(slider.getTarget("prev"), true);
190 } else if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass(namespace + "active-slide")) {
191 slider.direction = (slider.currentItem < target) ? "next" : "prev";
192 slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true);
193 }
194 });
195 }else{
196 el._slider = slider;
197 slider.slides.each(function (){
198 var that = this;
199 that._gesture = new MSGesture();
200 that._gesture.target = that;
201 that.addEventListener("MSPointerDown", function (e){
202 e.preventDefault();
203 if(e.currentTarget._gesture) {
204 e.currentTarget._gesture.addPointer(e.pointerId);
205 }
206 }, false);
207 that.addEventListener("MSGestureTap", function (e){
208 e.preventDefault();
209 var $slide = $(this),
210 target = $slide.index();
211 if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass('active')) {
212 slider.direction = (slider.currentItem < target) ? "next" : "prev";
213 slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true);
214 }
215 });
216 });
217 }
218 }
219 },
220 controlNav: {
221 setup: function() {
222 if (!slider.manualControls) {
223 methods.controlNav.setupPaging();
224 } else { // MANUALCONTROLS:
225 methods.controlNav.setupManual();
226 }
227 },
228 setupPaging: function() {
229 var type = (slider.vars.controlNav === "thumbnails") ? 'control-thumbs' : 'control-paging',
230 j = 1,
231 item,
232 slide;
233
234 slider.controlNavScaffold = $('<ol class="'+ namespace + 'control-nav ' + namespace + type + '"></ol>');
235
236 if (slider.pagingCount > 1) {
237 for (var i = 0; i < slider.pagingCount; i++) {
238 slide = slider.slides.eq(i);
239
240 if ( undefined === slide.attr( 'data-thumb-alt' ) ) {
241 slide.attr( 'data-thumb-alt', '' );
242 }
243
244 item = $( '<a></a>' ).attr( 'href', '#' ).text( j );
245 if (slider.vars.controlNav === "thumbnails") {
246 item = $('<img/>', {
247 onload: 'this.width = this.naturalWidth; this.height = this.naturalHeight',
248 src: slide.attr('data-thumb'),
249 alt: slide.attr('alt')
250 })
251 }
252
253 if ( '' !== slide.attr( 'data-thumb-alt' ) ) {
254 item.attr( 'alt', slide.attr( 'data-thumb-alt' ) );
255 }
256
257 if ( 'thumbnails' === slider.vars.controlNav && true === slider.vars.thumbCaptions ) {
258 var captn = slide.attr( 'data-thumbcaption' );
259 if ( '' !== captn && undefined !== captn ) {
260 var caption = $('<span></span>' ).addClass( namespace + 'caption' ).text( captn );
261 item.append( caption );
262 }
263 }
264
265 var liElement = $( '<li>' );
266 item.appendTo( liElement );
267 liElement.append( '</li>' );
268
269 slider.controlNavScaffold.append(liElement);
270 j++;
271
272 }
273 }
274
275 // CONTROLSCONTAINER:
276 (slider.controlsContainer) ? $(slider.controlsContainer).append(slider.controlNavScaffold) : slider.append(slider.controlNavScaffold);
277 methods.controlNav.set();
278
279 methods.controlNav.active();
280
281 slider.controlNavScaffold.on(eventType, 'a, img', function(event) {
282 event.preventDefault();
283
284 if (watchedEvent === "" || watchedEvent === event.type) {
285 var $this = $(this),
286 target = slider.controlNav.index($this);
287
288 if (!$this.hasClass(namespace + 'active')) {
289 slider.direction = (target > slider.currentSlide) ? "next" : "prev";
290 slider.flexAnimate(target, slider.vars.pauseOnAction);
291 }
292 }
293
294 // setup flags to prevent event duplication
295 if (watchedEvent === "") {
296 watchedEvent = event.type;
297 }
298 methods.setToClearWatchedEvent();
299
300 });
301 },
302 setupManual: function() {
303 slider.controlNav = slider.manualControls;
304 methods.controlNav.active();
305
306 slider.controlNav.on(eventType, function(event) {
307 event.preventDefault();
308
309 if (watchedEvent === "" || watchedEvent === event.type) {
310 var $this = $(this),
311 target = slider.controlNav.index($this);
312
313 if (!$this.hasClass(namespace + 'active')) {
314 (target > slider.currentSlide) ? slider.direction = "next" : slider.direction = "prev";
315 slider.flexAnimate(target, slider.vars.pauseOnAction);
316 }
317 }
318
319 // setup flags to prevent event duplication
320 if (watchedEvent === "") {
321 watchedEvent = event.type;
322 }
323 methods.setToClearWatchedEvent();
324 });
325 },
326 set: function() {
327 var selector = (slider.vars.controlNav === "thumbnails") ? 'img' : 'a';
328 slider.controlNav = $('.' + namespace + 'control-nav li ' + selector, (slider.controlsContainer) ? slider.controlsContainer : slider);
329 },
330 active: function() {
331 slider.controlNav.removeClass(namespace + "active").eq(slider.animatingTo).addClass(namespace + "active");
332 },
333 update: function(action, pos) {
334 if (slider.pagingCount > 1 && action === "add") {
335 slider.controlNavScaffold.append($('<li><a href="#">' + slider.count + '</a></li>'));
336 } else if (slider.pagingCount === 1) {
337 slider.controlNavScaffold.find('li').remove();
338 } else {
339 slider.controlNav.eq(pos).closest('li').remove();
340 }
341 methods.controlNav.set();
342 (slider.pagingCount > 1 && slider.pagingCount !== slider.controlNav.length) ? slider.update(pos, action) : methods.controlNav.active();
343 }
344 },
345 directionNav: {
346 setup: function() {
347 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>');
348
349 // CUSTOM DIRECTION NAV:
350 if (slider.customDirectionNav) {
351 slider.directionNav = slider.customDirectionNav;
352 // CONTROLSCONTAINER:
353 } else if (slider.controlsContainer) {
354 $(slider.controlsContainer).append(directionNavScaffold);
355 slider.directionNav = $('.' + namespace + 'direction-nav li a', slider.controlsContainer);
356 } else {
357 slider.append(directionNavScaffold);
358 slider.directionNav = $('.' + namespace + 'direction-nav li a', slider);
359 }
360
361 methods.directionNav.update();
362
363 slider.directionNav.on(eventType, function(event) {
364 event.preventDefault();
365 var target;
366
367 if (watchedEvent === "" || watchedEvent === event.type) {
368 target = ($(this).hasClass(namespace + 'next')) ? slider.getTarget('next') : slider.getTarget('prev');
369 slider.flexAnimate(target, slider.vars.pauseOnAction);
370 }
371
372 // setup flags to prevent event duplication
373 if (watchedEvent === "") {
374 watchedEvent = event.type;
375 }
376 methods.setToClearWatchedEvent();
377 });
378 },
379 update: function() {
380 var disabledClass = namespace + 'disabled';
381 if (slider.pagingCount === 1) {
382 slider.directionNav.addClass(disabledClass).attr('tabindex', '-1');
383 } else if (!slider.vars.animationLoop) {
384 if (slider.animatingTo === 0) {
385 slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "prev").addClass(disabledClass).attr('tabindex', '-1');
386 } else if (slider.animatingTo === slider.last) {
387 slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "next").addClass(disabledClass).attr('tabindex', '-1');
388 } else {
389 slider.directionNav.removeClass(disabledClass).prop( 'tabindex', '-1' );
390 }
391 } else {
392 slider.directionNav.removeClass(disabledClass).prop( 'tabindex', '-1' );
393 }
394 }
395 },
396 pausePlay: {
397 setup: function() {
398 var pausePlayScaffold = $('<div class="' + namespace + 'pauseplay"><a href="#"></a></div>');
399
400 // CONTROLSCONTAINER:
401 if (slider.controlsContainer) {
402 slider.controlsContainer.append(pausePlayScaffold);
403 slider.pausePlay = $('.' + namespace + 'pauseplay a', slider.controlsContainer);
404 } else {
405 slider.append(pausePlayScaffold);
406 slider.pausePlay = $('.' + namespace + 'pauseplay a', slider);
407 }
408
409 methods.pausePlay.update((slider.vars.slideshow) ? namespace + 'pause' : namespace + 'play');
410
411 slider.pausePlay.on(eventType, function(event) {
412 event.preventDefault();
413
414 if (watchedEvent === "" || watchedEvent === event.type) {
415 if ($(this).hasClass(namespace + 'pause')) {
416 slider.manualPause = true;
417 slider.manualPlay = false;
418 slider.pause();
419 } else {
420 slider.manualPause = false;
421 slider.manualPlay = true;
422 slider.play();
423 }
424 }
425
426 // setup flags to prevent event duplication
427 if (watchedEvent === "") {
428 watchedEvent = event.type;
429 }
430 methods.setToClearWatchedEvent();
431 });
432 },
433 update: function(state) {
434 (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);
435 }
436 },
437 touch: function() {
438 var startX,
439 startY,
440 offset,
441 cwidth,
442 dx,
443 startT,
444 onTouchStart,
445 onTouchMove,
446 onTouchEnd,
447 scrolling = false,
448 localX = 0,
449 localY = 0,
450 accDx = 0;
451
452 if(!msGesture){
453 onTouchStart = function(e) {
454 if (slider.animating) {
455 e.preventDefault();
456 } else if ( ( window.navigator.msPointerEnabled ) || e.touches.length === 1 ) {
457 slider.pause();
458 // CAROUSEL:
459 cwidth = (vertical) ? slider.h : slider. w;
460 startT = Number(new Date());
461 // CAROUSEL:
462
463 // Local vars for X and Y points.
464 localX = e.touches[0].pageX;
465 localY = e.touches[0].pageY;
466
467 offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 :
468 (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
469 (carousel && slider.currentSlide === slider.last) ? slider.limit :
470 (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide :
471 (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth;
472 startX = (vertical) ? localY : localX;
473 startY = (vertical) ? localX : localY;
474 el.addEventListener('touchmove', onTouchMove, false);
475 el.addEventListener('touchend', onTouchEnd, false);
476 }
477 };
478
479 onTouchMove = function(e) {
480 // Local vars for X and Y points.
481
482 localX = e.touches[0].pageX;
483 localY = e.touches[0].pageY;
484
485 dx = (vertical) ? startX - localY : (slider.vars.rtl?-1:1)*(startX - localX);
486 scrolling = (vertical) ? (Math.abs(dx) < Math.abs(localX - startY)) : (Math.abs(dx) < Math.abs(localY - startY));
487 var fxms = 500;
488
489 if ( ! scrolling || Number( new Date() ) - startT > fxms ) {
490 e.preventDefault();
491 if (!fade && slider.transitions) {
492 if (!slider.vars.animationLoop) {
493 dx = dx/((slider.currentSlide === 0 && dx < 0 || slider.currentSlide === slider.last && dx > 0) ? (Math.abs(dx)/cwidth+2) : 1);
494 }
495 slider.setProps(offset + dx, "setTouch");
496 }
497 }
498 };
499
500 onTouchEnd = function(e) {
501 // finish the touch by undoing the touch session
502 el.removeEventListener('touchmove', onTouchMove, false);
503
504 if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) {
505 var updateDx = (reverse) ? -dx : dx,
506 target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev');
507
508 if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) {
509 slider.flexAnimate(target, slider.vars.pauseOnAction);
510 } else {
511 if (!fade) { slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true); }
512 }
513 }
514 el.removeEventListener('touchend', onTouchEnd, false);
515
516 startX = null;
517 startY = null;
518 dx = null;
519 offset = null;
520 };
521
522 el.addEventListener('touchstart', onTouchStart, false);
523 }else{
524 el.style.msTouchAction = "none";
525 el._gesture = new MSGesture();
526 el._gesture.target = el;
527 el.addEventListener("MSPointerDown", onMSPointerDown, false);
528 el._slider = slider;
529 el.addEventListener("MSGestureChange", onMSGestureChange, false);
530 el.addEventListener("MSGestureEnd", onMSGestureEnd, false);
531
532 function onMSPointerDown(e){
533 e.stopPropagation();
534 if (slider.animating) {
535 e.preventDefault();
536 }else{
537 slider.pause();
538 el._gesture.addPointer(e.pointerId);
539 accDx = 0;
540 cwidth = (vertical) ? slider.h : slider. w;
541 startT = Number(new Date());
542 // CAROUSEL:
543
544 offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 :
545 (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
546 (carousel && slider.currentSlide === slider.last) ? slider.limit :
547 (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide :
548 (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth;
549 }
550 }
551
552 function onMSGestureChange(e) {
553 e.stopPropagation();
554 var slider = e.target._slider;
555 if(!slider){
556 return;
557 }
558 var transX = -e.translationX,
559 transY = -e.translationY;
560
561 //Accumulate translations.
562 accDx = accDx + ((vertical) ? transY : transX);
563 dx = (slider.vars.rtl?-1:1)*accDx;
564 scrolling = (vertical) ? (Math.abs(accDx) < Math.abs(-transX)) : (Math.abs(accDx) < Math.abs(-transY));
565
566 if(e.detail === e.MSGESTURE_FLAG_INERTIA){
567 setImmediate(function (){
568 el._gesture.stop();
569 });
570
571 return;
572 }
573
574 if (!scrolling || Number(new Date()) - startT > 500) {
575 e.preventDefault();
576 if (!fade && slider.transitions) {
577 if (!slider.vars.animationLoop) {
578 dx = accDx / ((slider.currentSlide === 0 && accDx < 0 || slider.currentSlide === slider.last && accDx > 0) ? (Math.abs(accDx) / cwidth + 2) : 1);
579 }
580 slider.setProps(offset + dx, "setTouch");
581 }
582 }
583 }
584
585 function onMSGestureEnd(e) {
586 e.stopPropagation();
587 var slider = e.target._slider;
588 if(!slider){
589 return;
590 }
591 if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) {
592 var updateDx = (reverse) ? -dx : dx,
593 target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev');
594
595 if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) {
596 slider.flexAnimate(target, slider.vars.pauseOnAction);
597 } else {
598 if (!fade) { slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true); }
599 }
600 }
601
602 startX = null;
603 startY = null;
604 dx = null;
605 offset = null;
606 accDx = 0;
607 }
608 }
609 },
610 resize: function() {
611 if (!slider.animating && slider.is(':visible')) {
612 if (!carousel) { slider.doMath(); }
613
614 if (fade) {
615 // SMOOTH HEIGHT:
616 methods.smoothHeight();
617 } else if (carousel) { //CAROUSEL:
618 slider.slides.width(slider.computedW);
619 slider.update(slider.pagingCount);
620 slider.setProps();
621 }
622 else if (vertical) { //VERTICAL:
623 slider.viewport.height(slider.h);
624 slider.setProps(slider.h, "setTotal");
625 } else {
626 slider.setProps(slider.computedW, "setTotal");
627 slider.newSlides.width(slider.computedW);
628 // SMOOTH HEIGHT:
629 if (slider.vars.smoothHeight) { methods.smoothHeight(); }
630 }
631 }
632 },
633 smoothHeight: function(dur) {
634 if (!vertical || fade) {
635 var $obj = (fade) ? slider : slider.viewport;
636 (dur) ? $obj.animate({"height": slider.slides.eq(slider.animatingTo).innerHeight()}, dur) : $obj.innerHeight(slider.slides.eq(slider.animatingTo).innerHeight());
637 }
638 },
639 sync: function(action) {
640 var $obj = $(slider.vars.sync).data("flexslider"),
641 target = slider.animatingTo;
642
643 switch (action) {
644 case "animate": $obj.flexAnimate(target, slider.vars.pauseOnAction, false, true); break;
645 case "play": if (!$obj.playing && !$obj.asNav) { $obj.play(); } break;
646 case "pause": $obj.pause(); break;
647 }
648 },
649 uniqueID: function($clone) {
650 // Append _clone to current level and children elements with id attributes
651 $clone.filter( '[id]' ).add($clone.find( '[id]' )).each(function() {
652 var $this = $(this);
653 $this.attr( 'id', $this.attr( 'id' ) + '_clone' );
654 });
655 return $clone;
656 },
657 pauseInvisible: {
658 visProp: null,
659 init: function() {
660 var visProp = methods.pauseInvisible.getHiddenProp();
661 if (visProp) {
662 var evtname = visProp.replace(/[H|h]idden/,'') + 'visibilitychange';
663 document.addEventListener(evtname, function() {
664 if (methods.pauseInvisible.isHidden()) {
665 if(slider.startTimeout) {
666 clearTimeout(slider.startTimeout); //If clock is ticking, stop timer and prevent from starting while invisible
667 } else {
668 slider.pause(); //Or just pause
669 }
670 }
671 else {
672 if(slider.started) {
673 slider.play(); //Initiated before, just play
674 } else {
675 if (slider.vars.initDelay > 0) {
676 setTimeout(slider.play, slider.vars.initDelay);
677 } else {
678 slider.play(); //Didn't init before: simply init or wait for it
679 }
680 }
681 }
682 });
683 }
684 },
685 isHidden: function() {
686 var prop = methods.pauseInvisible.getHiddenProp();
687 if (!prop) {
688 return false;
689 }
690 return document[prop];
691 },
692 getHiddenProp: function() {
693 var prefixes = ['webkit','moz','ms','o'];
694 // if 'hidden' is natively supported just return it
695 if ('hidden' in document) {
696 return 'hidden';
697 }
698 // otherwise loop over all the known prefixes until we find one
699 for ( var i = 0; i < prefixes.length; i++ ) {
700 if ((prefixes[i] + 'Hidden') in document) {
701 return prefixes[i] + 'Hidden';
702 }
703 }
704 // otherwise it's not supported
705 return null;
706 }
707 },
708 setToClearWatchedEvent: function() {
709 clearTimeout(watchedEventClearTimer);
710 watchedEventClearTimer = setTimeout(function() {
711 watchedEvent = "";
712 }, 3000);
713 }
714 };
715
716 // public methods
717 slider.flexAnimate = function(target, pause, override, withSync, fromNav) {
718 if (!slider.vars.animationLoop && target !== slider.currentSlide) {
719 slider.direction = (target > slider.currentSlide) ? "next" : "prev";
720 }
721
722 if (asNav && slider.pagingCount === 1) slider.direction = (slider.currentItem < target) ? "next" : "prev";
723
724 if (!slider.animating && (slider.canAdvance(target, fromNav) || override) && slider.is(":visible")) {
725 if (asNav && withSync) {
726 var master = $(slider.vars.asNavFor).data('flexslider');
727 slider.atEnd = target === 0 || target === slider.count - 1;
728 master.flexAnimate(target, true, false, true, fromNav);
729 slider.direction = (slider.currentItem < target) ? "next" : "prev";
730 master.direction = slider.direction;
731
732 if (Math.ceil((target + 1)/slider.visible) - 1 !== slider.currentSlide && target !== 0) {
733 slider.currentItem = target;
734 slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
735 target = Math.floor(target/slider.visible);
736 } else {
737 slider.currentItem = target;
738 slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
739 return false;
740 }
741 }
742
743 slider.animating = true;
744 slider.animatingTo = target;
745
746 // SLIDESHOW:
747 if (pause) { slider.pause(); }
748
749 // API: before() animation Callback
750 slider.vars.before(slider);
751
752 // SYNC:
753 if (slider.syncExists && !fromNav) { methods.sync("animate"); }
754
755 // CONTROLNAV
756 if (slider.vars.controlNav) { methods.controlNav.active(); }
757
758 // !CAROUSEL:
759 // CANDIDATE: slide active class (for add/remove slide)
760 if (!carousel) { slider.slides.removeClass(namespace + 'active-slide').eq(target).addClass(namespace + 'active-slide'); }
761
762 // INFINITE LOOP:
763 // CANDIDATE: atEnd
764 slider.atEnd = target === 0 || target === slider.last;
765
766 // DIRECTIONNAV:
767 if (slider.vars.directionNav) { methods.directionNav.update(); }
768
769 if (target === slider.last) {
770 // API: end() of cycle Callback
771 slider.vars.end(slider);
772 // SLIDESHOW && !INFINITE LOOP:
773 if (!slider.vars.animationLoop) { slider.pause(); }
774 }
775
776 // SLIDE:
777 if (!fade) {
778 var dimension = (vertical) ? slider.slides.filter(':first').height() : slider.computedW,
779 margin, slideString, calcNext;
780
781 // INFINITE LOOP / REVERSE:
782 if (carousel) {
783 margin = slider.vars.itemMargin;
784 calcNext = ((slider.itemW + margin) * slider.move) * slider.animatingTo;
785 slideString = (calcNext > slider.limit && slider.visible !== 1) ? slider.limit : calcNext;
786 } else if (slider.currentSlide === 0 && target === slider.count - 1 && slider.vars.animationLoop && slider.direction !== "next") {
787 slideString = (reverse) ? (slider.count + slider.cloneOffset) * dimension : 0;
788 } else if (slider.currentSlide === slider.last && target === 0 && slider.vars.animationLoop && slider.direction !== "prev") {
789 slideString = (reverse) ? 0 : (slider.count + 1) * dimension;
790 } else {
791 slideString = (reverse) ? ((slider.count - 1) - target + slider.cloneOffset) * dimension : (target + slider.cloneOffset) * dimension;
792 }
793 slider.setProps(slideString, "", slider.vars.animationSpeed);
794 if (slider.transitions) {
795 if (!slider.vars.animationLoop || !slider.atEnd) {
796 slider.animating = false;
797 slider.currentSlide = slider.animatingTo;
798 }
799
800 // Unbind previous transitionEnd events and re-bind new transitionEnd event
801 slider.container.off("webkitTransitionEnd transitionend");
802 slider.container.on("webkitTransitionEnd transitionend", function() {
803 clearTimeout(slider.ensureAnimationEnd);
804 slider.wrapup(dimension);
805 });
806
807 // Insurance for the ever-so-fickle transitionEnd event
808 clearTimeout(slider.ensureAnimationEnd);
809 slider.ensureAnimationEnd = setTimeout(function() {
810 slider.wrapup(dimension);
811 }, slider.vars.animationSpeed + 100);
812
813 } else {
814 slider.container.animate(slider.args, slider.vars.animationSpeed, slider.vars.easing, function(){
815 slider.wrapup(dimension);
816 });
817 }
818 } else { // FADE:
819 if (!touch) {
820 slider.slides.eq(slider.currentSlide).css({"zIndex": 1}).animate({"opacity": 0}, slider.vars.animationSpeed, slider.vars.easing);
821 slider.slides.eq(target).css({"zIndex": 2}).animate({"opacity": 1}, slider.vars.animationSpeed, slider.vars.easing, slider.wrapup);
822 } else {
823 slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 });
824 slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 });
825 slider.wrapup(dimension);
826 }
827 }
828 // SMOOTH HEIGHT:
829 if (slider.vars.smoothHeight) { methods.smoothHeight(slider.vars.animationSpeed); }
830 }
831 };
832 slider.wrapup = function(dimension) {
833 // SLIDE:
834 if (!fade && !carousel) {
835 if (slider.currentSlide === 0 && slider.animatingTo === slider.last && slider.vars.animationLoop) {
836 slider.setProps(dimension, "jumpEnd");
837 } else if (slider.currentSlide === slider.last && slider.animatingTo === 0 && slider.vars.animationLoop) {
838 slider.setProps(dimension, "jumpStart");
839 }
840 }
841 slider.animating = false;
842 slider.currentSlide = slider.animatingTo;
843 // API: after() animation Callback
844 slider.vars.after(slider);
845 };
846
847 // SLIDESHOW:
848 slider.animateSlides = function() {
849 if (!slider.animating && focused ) { slider.flexAnimate(slider.getTarget("next")); }
850 };
851 // SLIDESHOW:
852 slider.pause = function() {
853 clearInterval(slider.animatedSlides);
854 slider.animatedSlides = null;
855 slider.playing = false;
856 // PAUSEPLAY:
857 if (slider.vars.pausePlay) { methods.pausePlay.update("play"); }
858 // SYNC:
859 if (slider.syncExists) { methods.sync("pause"); }
860 };
861 // SLIDESHOW:
862 slider.play = function() {
863 if (slider.playing) { clearInterval(slider.animatedSlides); }
864 slider.animatedSlides = slider.animatedSlides || setInterval(slider.animateSlides, slider.vars.slideshowSpeed);
865 slider.started = slider.playing = true;
866 // PAUSEPLAY:
867 if (slider.vars.pausePlay) { methods.pausePlay.update("pause"); }
868 // SYNC:
869 if (slider.syncExists) { methods.sync("play"); }
870 };
871 // STOP:
872 slider.stop = function () {
873 slider.pause();
874 slider.stopped = true;
875 };
876 slider.canAdvance = function(target, fromNav) {
877 // ASNAV:
878 var last = (asNav) ? slider.pagingCount - 1 : slider.last;
879 return (fromNav) ? true :
880 (asNav && slider.currentItem === slider.count - 1 && target === 0 && slider.direction === "prev") ? true :
881 (asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 && slider.direction !== "next") ? false :
882 (target === slider.currentSlide && !asNav) ? false :
883 (slider.vars.animationLoop) ? true :
884 (slider.atEnd && slider.currentSlide === 0 && target === last && slider.direction !== "next") ? false :
885 (slider.atEnd && slider.currentSlide === last && target === 0 && slider.direction === "next") ? false :
886 true;
887 };
888 slider.getTarget = function(dir) {
889 slider.direction = dir;
890 if (dir === "next") {
891 return (slider.currentSlide === slider.last) ? 0 : slider.currentSlide + 1;
892 } else {
893 return (slider.currentSlide === 0) ? slider.last : slider.currentSlide - 1;
894 }
895 };
896
897 // SLIDE:
898 slider.setProps = function(pos, special, dur) {
899 var target = (function() {
900 var posCheck = (pos) ? pos : ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo,
901 posCalc = (function() {
902 if (carousel) {
903 return (special === "setTouch") ? pos :
904 (reverse && slider.animatingTo === slider.last) ? 0 :
905 (reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
906 (slider.animatingTo === slider.last) ? slider.limit : posCheck;
907 } else {
908 switch (special) {
909 case "setTotal": return (reverse) ? ((slider.count - 1) - slider.currentSlide + slider.cloneOffset) * pos : (slider.currentSlide + slider.cloneOffset) * pos;
910 case "setTouch": return (reverse) ? pos : pos;
911 case "jumpEnd": return (reverse) ? pos : slider.count * pos;
912 case "jumpStart": return (reverse) ? slider.count * pos : pos;
913 default: return pos;
914 }
915 }
916 }());
917
918 return (posCalc * ((slider.vars.rtl)?1:-1)) + "px";
919 }());
920
921 if (slider.transitions) {
922 target = (vertical) ? "translate3d(0," + target + ",0)" : "translate3d(" + (parseInt(target)+'px') + ",0,0)";
923 dur = (dur !== undefined) ? (dur/1000) + "s" : "0s";
924 slider.container.css("-" + slider.pfx + "-transition-duration", dur);
925 slider.container.css("transition-duration", dur);
926 }
927
928 slider.args[slider.prop] = target;
929 if (slider.transitions || dur === undefined) { slider.container.css(slider.args); }
930
931 slider.container.css('transform',target);
932 };
933
934 slider.setup = function(type) {
935 // SLIDE:
936 if (!fade) {
937 var sliderOffset, arr;
938
939 if (type === "init") {
940 slider.viewport = $('<div class="' + namespace + 'viewport"></div>').css({"overflow": "hidden", "position": "relative"}).appendTo(slider).append(slider.container);
941 // INFINITE LOOP:
942 slider.cloneCount = 0;
943 slider.cloneOffset = 0;
944 // REVERSE:
945 if (reverse) {
946 arr = $.makeArray(slider.slides).reverse();
947 slider.slides = $(arr);
948 slider.container.empty().append(slider.slides);
949 }
950 }
951 // INFINITE LOOP && !CAROUSEL:
952 if (slider.vars.animationLoop && !carousel) {
953 slider.cloneCount = 2;
954 slider.cloneOffset = 1;
955 // clear out old clones
956 if (type !== "init") { slider.container.find('.clone').remove(); }
957 slider.container.append(methods.uniqueID(slider.slides.first().clone().addClass('clone')).attr('aria-hidden', 'true'))
958 .prepend(methods.uniqueID(slider.slides.last().clone().addClass('clone')).attr('aria-hidden', 'true'));
959 }
960 slider.newSlides = $(slider.vars.selector, slider);
961
962 sliderOffset = (reverse) ? slider.count - 1 - slider.currentSlide + slider.cloneOffset : slider.currentSlide + slider.cloneOffset;
963 // VERTICAL:
964 if (vertical && !carousel) {
965 slider.container.height((slider.count + slider.cloneCount) * 200 + "%").css("position", "absolute").width("100%");
966 setTimeout(function(){
967 slider.newSlides.css({"display": "block"});
968 slider.doMath();
969 slider.viewport.height(slider.h);
970 slider.setProps(sliderOffset * slider.h, "init");
971 }, (type === "init") ? 100 : 0);
972 } else {
973 slider.container.width((slider.count + slider.cloneCount) * 200 + "%");
974 slider.setProps(sliderOffset * slider.computedW, "init");
975 setTimeout(function(){
976 slider.doMath();
977 if(slider.vars.rtl){
978 slider.newSlides.css({"width": slider.computedW, "marginRight" : slider.computedM, "float": "right", "display": "block"});
979 }
980 else{
981 slider.newSlides.css({"width": slider.computedW, "marginRight" : slider.computedM, "float": "left", "display": "block"});
982 }
983 // SMOOTH HEIGHT:
984 if (slider.vars.smoothHeight) { methods.smoothHeight(); }
985 }, (type === "init") ? 100 : 0);
986 }
987 } else { // FADE:
988 if(slider.vars.rtl){
989 slider.slides.css({"width": "100%", "float": 'right', "marginLeft": "-100%", "position": "relative"});
990 }
991 else{
992 slider.slides.css({"width": "100%", "float": 'left', "marginRight": "-100%", "position": "relative"});
993 }
994 if (type === "init") {
995 if (!touch) {
996 //slider.slides.eq(slider.currentSlide).fadeIn(slider.vars.animationSpeed, slider.vars.easing);
997 if (slider.vars.fadeFirstSlide == false) {
998 slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).css({"opacity": 1});
999 } else {
1000 slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).animate({"opacity": 1},slider.vars.animationSpeed,slider.vars.easing);
1001 }
1002 } else {
1003 slider.slides.css({ "opacity": 0, "display": "block", "webkitTransition": "opacity " + slider.vars.animationSpeed / 1000 + "s ease", "zIndex": 1 }).eq(slider.currentSlide).css({ "opacity": 1, "zIndex": 2});
1004 }
1005 }
1006 // SMOOTH HEIGHT:
1007 if (slider.vars.smoothHeight) { methods.smoothHeight(); }
1008 }
1009 // !CAROUSEL:
1010 // CANDIDATE: active slide
1011 if (!carousel) { slider.slides.removeClass(namespace + "active-slide").eq(slider.currentSlide).addClass(namespace + "active-slide"); }
1012
1013 //FlexSlider: init() Callback
1014 slider.vars.init(slider);
1015 };
1016
1017 slider.doMath = function() {
1018 var slide = slider.slides.first(),
1019 slideMargin = slider.vars.itemMargin,
1020 minItems = slider.vars.minItems,
1021 maxItems = slider.vars.maxItems;
1022
1023 slider.w = (slider.viewport===undefined) ? slider.width() : slider.viewport.width();
1024 if (slider.isFirefox) { slider.w = slider.width(); }
1025 slider.h = slide.height();
1026 slider.boxPadding = slide.outerWidth() - slide.width();
1027
1028 // CAROUSEL:
1029 if (carousel) {
1030 slider.itemT = slider.vars.itemWidth + slideMargin;
1031 slider.itemM = slideMargin;
1032 slider.minW = (minItems) ? minItems * slider.itemT : slider.w;
1033 slider.maxW = (maxItems) ? (maxItems * slider.itemT) - slideMargin : slider.w;
1034 slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin * (minItems - 1)))/minItems :
1035 (slider.maxW < slider.w) ? (slider.w - (slideMargin * (maxItems - 1)))/maxItems :
1036 (slider.vars.itemWidth > slider.w) ? slider.w : slider.vars.itemWidth;
1037
1038 slider.visible = Math.floor(slider.w/(slider.itemW));
1039 slider.move = (slider.vars.move > 0 && slider.vars.move < slider.visible ) ? slider.vars.move : slider.visible;
1040 slider.pagingCount = Math.ceil(((slider.count - slider.visible)/slider.move) + 1);
1041 slider.last = slider.pagingCount - 1;
1042 slider.limit = (slider.pagingCount === 1) ? 0 :
1043 (slider.vars.itemWidth > slider.w) ? (slider.itemW * (slider.count - 1)) + (slideMargin * (slider.count - 1)) : ((slider.itemW + slideMargin) * slider.count) - slider.w - slideMargin;
1044 } else {
1045 slider.itemW = slider.w;
1046 slider.itemM = slideMargin;
1047 slider.pagingCount = slider.count;
1048 slider.last = slider.count - 1;
1049 }
1050 slider.computedW = slider.itemW - slider.boxPadding;
1051 slider.computedM = slider.itemM;
1052 };
1053
1054 slider.update = function(pos, action) {
1055 slider.doMath();
1056
1057 // update currentSlide and slider.animatingTo if necessary
1058 if (!carousel) {
1059 if (pos < slider.currentSlide) {
1060 slider.currentSlide += 1;
1061 } else if (pos <= slider.currentSlide && pos !== 0) {
1062 slider.currentSlide -= 1;
1063 }
1064 slider.animatingTo = slider.currentSlide;
1065 }
1066
1067 // update controlNav
1068 if (slider.vars.controlNav && !slider.manualControls) {
1069 if ((action === "add" && !carousel) || slider.pagingCount > slider.controlNav.length) {
1070 methods.controlNav.update("add");
1071 } else if ((action === "remove" && !carousel) || slider.pagingCount < slider.controlNav.length) {
1072 if (carousel && slider.currentSlide > slider.last) {
1073 slider.currentSlide -= 1;
1074 slider.animatingTo -= 1;
1075 }
1076 methods.controlNav.update("remove", slider.last);
1077 }
1078 }
1079 // update directionNav
1080 if (slider.vars.directionNav) { methods.directionNav.update(); }
1081
1082 };
1083
1084 slider.addSlide = function(obj, pos) {
1085 var $obj = $(obj);
1086
1087 slider.count += 1;
1088 slider.last = slider.count - 1;
1089
1090 // append new slide
1091 if (vertical && reverse) {
1092 (pos !== undefined) ? slider.slides.eq(slider.count - pos).after($obj) : slider.container.prepend($obj);
1093 } else {
1094 (pos !== undefined) ? slider.slides.eq(pos).before($obj) : slider.container.append($obj);
1095 }
1096
1097 // update currentSlide, animatingTo, controlNav, and directionNav
1098 slider.update(pos, "add");
1099
1100 // update slider.slides
1101 slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
1102 // re-setup the slider to accomdate new slide
1103 slider.setup();
1104
1105 //FlexSlider: added() Callback
1106 slider.vars.added(slider);
1107 };
1108 slider.removeSlide = function(obj) {
1109 var pos = (isNaN(obj)) ? slider.slides.index($(obj)) : obj;
1110
1111 // update count
1112 slider.count -= 1;
1113 slider.last = slider.count - 1;
1114
1115 // remove slide
1116 if (isNaN(obj)) {
1117 $(obj, slider.slides).remove();
1118 } else {
1119 (vertical && reverse) ? slider.slides.eq(slider.last).remove() : slider.slides.eq(obj).remove();
1120 }
1121
1122 // update currentSlide, animatingTo, controlNav, and directionNav
1123 slider.doMath();
1124 slider.update(pos, "remove");
1125
1126 // update slider.slides
1127 slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
1128 // re-setup the slider to accomdate new slide
1129 slider.setup();
1130
1131 // FlexSlider: removed() Callback
1132 slider.vars.removed(slider);
1133 };
1134
1135 //FlexSlider: Initialize
1136 methods.init();
1137 };
1138
1139 // Ensure the slider isn't focussed if the window loses focus.
1140 $( window ).on( 'blur', function ( e ) {
1141 focused = false;
1142 }).on( 'focus', function ( e ) {
1143 focused = true;
1144 });
1145
1146 //FlexSlider: Default Settings
1147 $.flexslider.defaults = {
1148 namespace: "flex-", //{NEW} String: Prefix string attached to the class of every element generated by the plugin
1149 selector: ".slides > li", //{NEW} Selector: Must match a simple pattern. '{container} > {slide}' -- Ignore pattern at your own peril
1150 animation: "fade", //String: Select your animation type, "fade" or "slide"
1151 easing: "swing", //{NEW} String: Determines the easing method used in jQuery transitions. jQuery easing plugin is supported!
1152 direction: "horizontal", //String: Select the sliding direction, "horizontal" or "vertical"
1153 reverse: false, //{NEW} Boolean: Reverse the animation direction
1154 animationLoop: true, //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end
1155 smoothHeight: false, //{NEW} Boolean: Allow height of the slider to animate smoothly in horizontal mode
1156 startAt: 0, //Integer: The slide that the slider should start on. Array notation (0 = first slide)
1157 slideshow: true, //Boolean: Animate slider automatically
1158 slideshowSpeed: 7000, //Integer: Set the speed of the slideshow cycling, in milliseconds
1159 animationSpeed: 600, //Integer: Set the speed of animations, in milliseconds
1160 initDelay: 0, //{NEW} Integer: Set an initialization delay, in milliseconds
1161 randomize: false, //Boolean: Randomize slide order
1162 fadeFirstSlide: true, //Boolean: Fade in the first slide when animation type is "fade"
1163 thumbCaptions: false, //Boolean: Whether or not to put captions on thumbnails when using the "thumbnails" controlNav.
1164
1165 // Usability features
1166 pauseOnAction: true, //Boolean: Pause the slideshow when interacting with control elements, highly recommended.
1167 pauseOnHover: false, //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering
1168 pauseInvisible: true, //{NEW} Boolean: Pause the slideshow when tab is invisible, resume when visible. Provides better UX, lower CPU usage.
1169 useCSS: true, //{NEW} Boolean: Slider will use CSS3 transitions if available
1170 touch: true, //{NEW} Boolean: Allow touch swipe navigation of the slider on touch-enabled devices
1171 video: false, //{NEW} Boolean: If using video in the slider, will prevent CSS3 3D Transforms to avoid graphical glitches
1172
1173 // Primary Controls
1174 controlNav: true, //Boolean: Create navigation for paging control of each slide? Note: Leave true for manualControls usage
1175 directionNav: true, //Boolean: Create navigation for previous/next navigation? (true/false)
1176 prevText: "Previous", //String: Set the text for the "previous" directionNav item
1177 nextText: "Next", //String: Set the text for the "next" directionNav item
1178
1179 // Secondary Navigation
1180 keyboard: true, //Boolean: Allow slider navigating via keyboard left/right keys
1181 multipleKeyboard: false, //{NEW} Boolean: Allow keyboard navigation to affect multiple sliders. Default behavior cuts out keyboard navigation with more than one slider present.
1182 mousewheel: false, //{UPDATED} Boolean: Requires jquery.mousewheel.js (https://github.com/brandonaaron/jquery-mousewheel) - Allows slider navigating via mousewheel
1183 pausePlay: false, //Boolean: Create pause/play dynamic element
1184 pauseText: "Pause", //String: Set the text for the "pause" pausePlay item
1185 playText: "Play", //String: Set the text for the "play" pausePlay item
1186
1187 // Special properties
1188 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.
1189 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.
1190 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)
1191 sync: "", //{NEW} Selector: Mirror the actions performed on this slider with another slider. Use with care.
1192 asNavFor: "", //{NEW} Selector: Internal property exposed for turning the slider into a thumbnail navigation for another slider
1193
1194 // Carousel Options
1195 itemWidth: 0, //{NEW} Integer: Box-model width of individual carousel items, including horizontal borders and padding.
1196 itemMargin: 0, //{NEW} Integer: Margin between carousel items.
1197 minItems: 1, //{NEW} Integer: Minimum number of carousel items that should be visible. Items will resize fluidly when below this.
1198 maxItems: 0, //{NEW} Integer: Maxmimum number of carousel items that should be visible. Items will resize fluidly when above this limit.
1199 move: 0, //{NEW} Integer: Number of carousel items that should move on animation. If 0, slider will move all visible items.
1200 allowOneSlide: true, //{NEW} Boolean: Whether or not to allow a slider comprised of a single slide
1201
1202 // Browser Specific
1203 isFirefox: false, // {NEW} Boolean: Set to true when Firefox is the browser used.
1204
1205 // Callback API
1206 start: function(){}, //Callback: function(slider) - Fires when the slider loads the first slide
1207 before: function(){}, //Callback: function(slider) - Fires asynchronously with each slider animation
1208 after: function(){}, //Callback: function(slider) - Fires after each slider animation completes
1209 end: function(){}, //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous)
1210 added: function(){}, //{NEW} Callback: function(slider) - Fires after a slide is added
1211 removed: function(){}, //{NEW} Callback: function(slider) - Fires after a slide is removed
1212 init: function() {}, //{NEW} Callback: function(slider) - Fires after the slider is initially setup
1213 rtl: false //{NEW} Boolean: Whether or not to enable RTL mode
1214 };
1215
1216 //FlexSlider: Plugin Function
1217 $.fn.flexslider = function(options) {
1218 if (options === undefined) { options = {}; }
1219
1220 if (typeof options === "object") {
1221 return this.each(function() {
1222 var $this = $(this),
1223 selector = (options.selector) ? options.selector : ".slides > li",
1224 $slides = $this.find(selector);
1225
1226 if ( ( $slides.length === 1 && options.allowOneSlide === false ) || $slides.length === 0 ) {
1227 $slides.fadeIn(400);
1228 if (options.start) { options.start($this); }
1229 } else if ($this.data('flexslider') === undefined) {
1230 new $.flexslider(this, options);
1231 }
1232 });
1233 } else {
1234 // Helper strings to quickly perform functions on the slider
1235 var $slider = $(this).data('flexslider');
1236 switch (options) {
1237 case "play": $slider.play(); break;
1238 case "pause": $slider.pause(); break;
1239 case "stop": $slider.stop(); break;
1240 case "next": $slider.flexAnimate($slider.getTarget("next"), true); break;
1241 case "prev":
1242 case "previous": $slider.flexAnimate($slider.getTarget("prev"), true); break;
1243 default: if (typeof options === "number") { $slider.flexAnimate(options, true); }
1244 }
1245 }
1246 };
1247 })(jQuery);
1248