PageSourceSearch

http://justthinkingoutloud.tv/wp-content/plugins/woocommerce/asset…/jquery.flexslider.js?ver=2.7.2-wc.8.0.3

js justthinkingoutloud.tv collected 2026-10-04 01:12:49 UTC 53,510 bytes, 1,150 lines download raw bytes

vendor: 45,428 bytes, lines 1-1044
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        // deprecating this idea, as devices are being released with both of these events
69        eventType = "click touchend keyup",
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.transitions = !slider.vars.video && !fade && slider.vars.useCSS;
110        if (slider.transitions) 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                  alt: slide.attr('alt')
259                })
260              }
261
262              if ( '' !== slide.attr( 'data-thumb-alt' ) ) {
263                item.attr( 'alt', slide.attr( 'data-thumb-alt' ) );
264              }
265
266              if ( 'thumbnails' === slider.vars.controlNav && true === slider.vars.thumbCaptions ) {
267                var captn = slide.attr( 'data-thumbcaption' );
268                if ( '' !== captn && undefined !== captn ) {
269                  var caption = $('<span></span>' ).addClass( namespace + 'caption' ).text( captn );
270                  item.append( caption );
271                }
272              }
273
274              var liElement = $( '<li>' );
275              item.appendTo( liElement );
276              liElement.append( '</li>' );
277
278              slider.controlNavScaffold.append(liElement);
279              j++;
280
281            }
282          }
283
284          // CONTROLSCONTAINER:
285          (slider.controlsContainer) ? $(slider.controlsContainer).append(slider.controlNavScaffold) : slider.append(slider.controlNavScaffold);
286          methods.controlNav.set();
287
288          methods.controlNav.active();
289
290          slider.controlNavScaffold.on(eventType, 'a, img', function(event) {
291            event.preventDefault();
292
293            if (watchedEvent === "" || watchedEvent === event.type) {
294              var $this = $(this),
295                  target = slider.controlNav.index($this);
296
297              if (!$this.hasClass(namespace + 'active')) {
298                slider.direction = (target > slider.currentSlide) ? "next" : "prev";
299                slider.flexAnimate(target, slider.vars.pauseOnAction);
300              }
301            }
302
303            // setup flags to prevent event duplication
304            if (watchedEvent === "") {
305              watchedEvent = event.type;
306            }
307            methods.setToClearWatchedEvent();
308
309          });
310        },
311        setupManual: function() {
312          slider.controlNav = slider.manualControls;
313          methods.controlNav.active();
314
315          slider.controlNav.on(eventType, function(event) {
316            event.preventDefault();
317
318            if (watchedEvent === "" || watchedEvent === event.type) {
319              var $this = $(this),
320                  target = slider.controlNav.index($this);
321
322              if (!$this.hasClass(namespace + 'active')) {
323                (target > slider.currentSlide) ? slider.direction = "next" : slider.direction = "prev";
324                slider.flexAnimate(target, slider.vars.pauseOnAction);
325              }
326            }
327
328            // setup flags to prevent event duplication
329            if (watchedEvent === "") {
330              watchedEvent = event.type;
331            }
332            methods.setToClearWatchedEvent();
333          });
334        },
335        set: function() {
336          var selector = (slider.vars.controlNav === "thumbnails") ? 'img' : 'a';
337          slider.controlNav = $('.' + namespace + 'control-nav li ' + selector, (slider.controlsContainer) ? slider.controlsContainer : slider);
338        },
339        active: function() {
340          slider.controlNav.removeClass(namespace + "active").eq(slider.animatingTo).addClass(namespace + "active");
341        },
342        update: function(action, pos) {
343          if (slider.pagingCount > 1 && action === "add") {
344            slider.controlNavScaffold.append($('<li><a href="#">' + slider.count + '</a></li>'));
345          } else if (slider.pagingCount === 1) {
346            slider.controlNavScaffold.find('li').remove();
347          } else {
348            slider.controlNav.eq(pos).closest('li').remove();
349          }
350          methods.controlNav.set();
351          (slider.pagingCount > 1 && slider.pagingCount !== slider.controlNav.length) ? slider.update(pos, action) : methods.controlNav.active();
352        }
353      },
354      directionNav: {
355        setup: function() {
356          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>');
357
358          // CUSTOM DIRECTION NAV:
359          if (slider.customDirectionNav) {
360            slider.directionNav = slider.customDirectionNav;
361          // CONTROLSCONTAINER:
362          } else if (slider.controlsContainer) {
363            $(slider.controlsContainer).append(directionNavScaffold);
364            slider.directionNav = $('.' + namespace + 'direction-nav li a', slider.controlsContainer);
365          } else {
366            slider.append(directionNavScaffold);
367            slider.directionNav = $('.' + namespace + 'direction-nav li a', slider);
368          }
369
370          methods.directionNav.update();
371
372          slider.directionNav.on(eventType, function(event) {
373            event.preventDefault();
374            var target;
375
376            if (watchedEvent === "" || watchedEvent === event.type) {
377              target = ($(this).hasClass(namespace + 'next')) ? slider.getTarget('next') : slider.getTarget('prev');
378              slider.flexAnimate(target, slider.vars.pauseOnAction);
379            }
380
381            // setup flags to prevent event duplication
382            if (watchedEvent === "") {
383              watchedEvent = event.type;
384            }
385            methods.setToClearWatchedEvent();
386          });
387        },
388        update: function() {
389          var disabledClass = namespace + 'disabled';
390          if (slider.pagingCount === 1) {
391            slider.directionNav.addClass(disabledClass).attr('tabindex', '-1');
392          } else if (!slider.vars.animationLoop) {
393            if (slider.animatingTo === 0) {
394              slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "prev").addClass(disabledClass).attr('tabindex', '-1');
395            } else if (slider.animatingTo === slider.last) {
396              slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "next").addClass(disabledClass).attr('tabindex', '-1');
397            } else {
398              slider.directionNav.removeClass(disabledClass).prop( 'tabindex', '-1' );
399            }
400          } else {
401            slider.directionNav.removeClass(disabledClass).prop( 'tabindex', '-1' );
402          }
403        }
404      },
405      pausePlay: {
406        setup: function() {
407          var pausePlayScaffold = $('<div class="' + namespace + 'pauseplay"><a href="#"></a></div>');
408
409          // CONTROLSCONTAINER:
410          if (slider.controlsContainer) {
411            slider.controlsContainer.append(pausePlayScaffold);
412            slider.pausePlay = $('.' + namespace + 'pauseplay a', slider.controlsContainer);
413          } else {
414            slider.append(pausePlayScaffold);
415            slider.pausePlay = $('.' + namespace + 'pauseplay a', slider);
416          }
417
418          methods.pausePlay.update((slider.vars.slideshow) ? namespace + 'pause' : namespace + 'play');
419
420          slider.pausePlay.on(eventType, function(event) {
421            event.preventDefault();
422
423            if (watchedEvent === "" || watchedEvent === event.type) {
424              if ($(this).hasClass(namespace + 'pause')) {
425                slider.manualPause = true;
426                slider.manualPlay = false;
427                slider.pause();
428              } else {
429                slider.manualPause = false;
430                slider.manualPlay = true;
431                slider.play();
432              }
433            }
434
435            // setup flags to prevent event duplication
436            if (watchedEvent === "") {
437              watchedEvent = event.type;
438            }
439            methods.setToClearWatchedEvent();
440          });
441        },
442        update: function(state) {
443          (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);
444        }
445      },
446      touch: function() {
447        var startX,
448          startY,
449          offset,
450          cwidth,
451          dx,
452          startT,
453          onTouchStart,
454          onTouchMove,
455          onTouchEnd,
456          scrolling = false,
457          localX = 0,
458          localY = 0,
459          accDx = 0;
460
461            onTouchStart = function(e) {
462              if (slider.animating) {
463                e.preventDefault();
464              } else if ( e.touches.length === 1 ) {
465                slider.pause();
466                // CAROUSEL:
467                cwidth = (vertical) ? slider.h : slider. w;
468                startT = Number(new Date());
469                // CAROUSEL:
470
471                // Local vars for X and Y points.
472                localX = e.touches[0].pageX;
473                localY = e.touches[0].pageY;
474
475                offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 :
476                         (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
477                         (carousel && slider.currentSlide === slider.last) ? slider.limit :
478                         (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide :
479                         (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth;
480                startX = (vertical) ? localY : localX;
481                startY = (vertical) ? localX : localY;
482                el.addEventListener('touchmove', onTouchMove, false);
483                el.addEventListener('touchend', onTouchEnd, false);
484              }
485            };
486
487            onTouchMove = function(e) {
488              // Local vars for X and Y points.
489
490              localX = e.touches[0].pageX;
491              localY = e.touches[0].pageY;
492
493              dx = (vertical) ? startX - localY : (slider.vars.rtl?-1:1)*(startX - localX);
494              scrolling = (vertical) ? (Math.abs(dx) < Math.abs(localX - startY)) : (Math.abs(dx) < Math.abs(localY - startY));
495              var fxms = 500;
496
497              if ( ! scrolling || Number( new Date() ) - startT > fxms ) {
498                e.preventDefault();
499                if (!fade && slider.transitions) {
500                  if (!slider.vars.animationLoop) {
501                    dx = dx/((slider.currentSlide === 0 && dx < 0 || slider.currentSlide === slider.last && dx > 0) ? (Math.abs(dx)/cwidth+2) : 1);
502                  }
503                  slider.setProps(offset + dx, "setTouch");
504                }
505              }
506            };
507
508            onTouchEnd = function(e) {
509              // finish the touch by undoing the touch session
510              el.removeEventListener('touchmove', onTouchMove, false);
511
512              if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) {
513                var updateDx = (reverse) ? -dx : dx,
514                    target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev');
515
516                if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) {
517                  slider.flexAnimate(target, slider.vars.pauseOnAction);
518                } else {
519                  if (!fade) { slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true); }
520                }
521              }
522              el.removeEventListener('touchend', onTouchEnd, false);
523
524              startX = null;
525              startY = null;
526              dx = null;
527              offset = null;
528            };
529
530            el.addEventListener('touchstart', onTouchStart, false);
531      },
532      resize: function() {
533        if (!slider.animating && slider.is(':visible')) {
534          if (!carousel) { slider.doMath(); }
535
536          if (fade) {
537            // SMOOTH HEIGHT:
538            methods.smoothHeight();
539          } else if (carousel) { //CAROUSEL:
540            slider.slides.width(slider.computedW);
541            slider.update(slider.pagingCount);
542            slider.setProps();
543          }
544          else if (vertical) { //VERTICAL:
545            slider.viewport.height(slider.h);
546            slider.setProps(slider.h, "setTotal");
547          } else {
548			  slider.setProps(slider.computedW, "setTotal");
549			  slider.newSlides.width(slider.computedW);
550            // SMOOTH HEIGHT:
551            if (slider.vars.smoothHeight) { methods.smoothHeight(); }
552          }
553        }
554      },
555      smoothHeight: function(dur) {
556        if (!vertical || fade) {
557          var $obj = (fade) ? slider : slider.viewport;
558          (dur) ? $obj.animate({"height": slider.slides.eq(slider.animatingTo).innerHeight()}, dur) : $obj.innerHeight(slider.slides.eq(slider.animatingTo).innerHeight());
559        }
560      },
561      sync: function(action) {
562        var $obj = $(slider.vars.sync).data("flexslider"),
563            target = slider.animatingTo;
564
565        switch (action) {
566          case "animate": $obj.flexAnimate(target, slider.vars.pauseOnAction, false, true); break;
567          case "play": if (!$obj.playing && !$obj.asNav) { $obj.play(); } break;
568          case "pause": $obj.pause(); break;
569        }
570      },
571      uniqueID: function($clone) {
572        // Append _clone to current level and children elements with id attributes
573        $clone.filter( '[id]' ).add($clone.find( '[id]' )).each(function() {
574          var $this = $(this);
575          $this.attr( 'id', $this.attr( 'id' ) + '_clone' );
576        });
577        return $clone;
578      },
579      pauseInvisible: function() {
580            document.addEventListener('visibilitychange', function() {
581              if (document.visibilityState === 'hidden') {
582                if(slider.startTimeout) {
583                  clearTimeout(slider.startTimeout); //If clock is ticking, stop timer and prevent from starting while invisible
584                } else {
585                  slider.pause(); //Or just pause
586                }
587              }
588              else {
589                if(slider.started) {
590                  slider.play(); //Initiated before, just play
591                } else {
592                  if (slider.vars.initDelay > 0) {
593                    setTimeout(slider.play, slider.vars.initDelay);
594                  } else {
595                    slider.play(); //Didn't init before: simply init or wait for it
596                  }
597                }
598              }
599            });
600      },
601      setToClearWatchedEvent: function() {
602        clearTimeout(watchedEventClearTimer);
603        watchedEventClearTimer = setTimeout(function() {
604          watchedEvent = "";
605        }, 3000);
606      }
607    };
608
609    // public methods
610    slider.flexAnimate = function(target, pause, override, withSync, fromNav) {
611      if (!slider.vars.animationLoop && target !== slider.currentSlide) {
612        slider.direction = (target > slider.currentSlide) ? "next" : "prev";
613      }
614
615      if (asNav && slider.pagingCount === 1) slider.direction = (slider.currentItem < target) ? "next" : "prev";
616
617      if (!slider.animating && (slider.canAdvance(target, fromNav) || override) && slider.is(":visible")) {
618        if (asNav && withSync) {
619          var master = $(slider.vars.asNavFor).data('flexslider');
620          slider.atEnd = target === 0 || target === slider.count - 1;
621          master.flexAnimate(target, true, false, true, fromNav);
622          slider.direction = (slider.currentItem < target) ? "next" : "prev";
623          master.direction = slider.direction;
624
625          if (Math.ceil((target + 1)/slider.visible) - 1 !== slider.currentSlide && target !== 0) {
626            slider.currentItem = target;
627            slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
628            target = Math.floor(target/slider.visible);
629          } else {
630            slider.currentItem = target;
631            slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");
632            return false;
633          }
634        }
635
636        slider.animating = true;
637        slider.animatingTo = target;
638
639        // SLIDESHOW:
640        if (pause) { slider.pause(); }
641
642        // API: before() animation Callback
643        slider.vars.before(slider);
644
645        // SYNC:
646        if (slider.syncExists && !fromNav) { methods.sync("animate"); }
647
648        // CONTROLNAV
649        if (slider.vars.controlNav) { methods.controlNav.active(); }
650
651        // !CAROUSEL:
652        // CANDIDATE: slide active class (for add/remove slide)
653        if (!carousel) { slider.slides.removeClass(namespace + 'active-slide').eq(target).addClass(namespace + 'active-slide'); }
654
655        // INFINITE LOOP:
656        // CANDIDATE: atEnd
657        slider.atEnd = target === 0 || target === slider.last;
658
659        // DIRECTIONNAV:
660        if (slider.vars.directionNav) { methods.directionNav.update(); }
661
662        if (target === slider.last) {
663          // API: end() of cycle Callback
664          slider.vars.end(slider);
665          // SLIDESHOW && !INFINITE LOOP:
666          if (!slider.vars.animationLoop) { slider.pause(); }
667        }
668
669        // SLIDE:
670        if (!fade) {
671          var dimension = (vertical) ? slider.slides.filter(':first').height() : slider.computedW,
672              margin, slideString, calcNext;
673
674          // INFINITE LOOP / REVERSE:
675          if (carousel) {
676            margin = slider.vars.itemMargin;
677            calcNext = ((slider.itemW + margin) * slider.move) * slider.animatingTo;
678            slideString = (calcNext > slider.limit && slider.visible !== 1) ? slider.limit : calcNext;
679          } else if (slider.currentSlide === 0 && target === slider.count - 1 && slider.vars.animationLoop && slider.direction !== "next") {
680            slideString = (reverse) ? (slider.count + slider.cloneOffset) * dimension : 0;
681          } else if (slider.currentSlide === slider.last && target === 0 && slider.vars.animationLoop && slider.direction !== "prev") {
682            slideString = (reverse) ? 0 : (slider.count + 1) * dimension;
683          } else {
684            slideString = (reverse) ? ((slider.count - 1) - target + slider.cloneOffset) * dimension : (target + slider.cloneOffset) * dimension;
685          }
686          slider.setProps(slideString, "", slider.vars.animationSpeed);
687          if (slider.transitions) {
688            if (!slider.vars.animationLoop || !slider.atEnd) {
689              slider.animating = false;
690              slider.currentSlide = slider.animatingTo;
691            }
692
693            // Unbind previous transitionEnd events and re-bind new transitionEnd event
694            slider.container.off("transitionend");
695            slider.container.on("transitionend", function() {
696              clearTimeout(slider.ensureAnimationEnd);
697              slider.wrapup(dimension);
698            });
699
700            // Insurance for the ever-so-fickle transitionEnd event
701            clearTimeout(slider.ensureAnimationEnd);
702            slider.ensureAnimationEnd = setTimeout(function() {
703              slider.wrapup(dimension);
704            }, slider.vars.animationSpeed + 100);
705
706          } else {
707            var prop = slider.prop;
708            slider.container.each(function() {
709              var container = this;
710              var keyframes = {};
711              keyframes[prop] = [
712                window.getComputedStyle(container)[prop],
713                slider.args[prop]
714              ];
715
716              container.animate(keyframes, { duration: slider.vars.animationSpeed, easing: easing }).onfinish = function() {
717                container.style[prop] = slider.args[prop];
718                slider.wrapup(dimension);
719              };
720            });
721          }
722        } else { // FADE:
723          if (!touch) {
724            slider.slides.eq(slider.currentSlide).css({"zIndex": 1}).animate({"opacity": 0}, slider.vars.animationSpeed, slider.vars.easing);
725            slider.slides.eq(target).css({"zIndex": 2}).animate({"opacity": 1}, slider.vars.animationSpeed, slider.vars.easing, slider.wrapup);
726          } else {
727            slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 });
728            slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 });
729            slider.wrapup(dimension);
730          }
731        }
732        // SMOOTH HEIGHT:
733        if (slider.vars.smoothHeight) { methods.smoothHeight(slider.vars.animationSpeed); }
734      }
735    };
736    slider.wrapup = function(dimension) {
737      // SLIDE:
738      if (!fade && !carousel) {
739        if (slider.currentSlide === 0 && slider.animatingTo === slider.last && slider.vars.animationLoop) {
740          slider.setProps(dimension, "jumpEnd");
741        } else if (slider.currentSlide === slider.last && slider.animatingTo === 0 && slider.vars.animationLoop) {
742          slider.setProps(dimension, "jumpStart");
743        }
744      }
745      slider.animating = false;
746      slider.currentSlide = slider.animatingTo;
747      // API: after() animation Callback
748      slider.vars.after(slider);
749    };
750
751    // SLIDESHOW:
752    slider.animateSlides = function() {
753      if (!slider.animating && focused ) { slider.flexAnimate(slider.getTarget("next")); }
754    };
755    // SLIDESHOW:
756    slider.pause = function() {
757      clearInterval(slider.animatedSlides);
758      slider.animatedSlides = null;
759      slider.playing = false;
760      // PAUSEPLAY:
761      if (slider.vars.pausePlay) { methods.pausePlay.update("play"); }
762      // SYNC:
763      if (slider.syncExists) { methods.sync("pause"); }
764    };
765    // SLIDESHOW:
766    slider.play = function() {
767      if (slider.playing) { clearInterval(slider.animatedSlides); }
768      slider.animatedSlides = slider.animatedSlides || setInterval(slider.animateSlides, slider.vars.slideshowSpeed);
769      slider.started = slider.playing = true;
770      // PAUSEPLAY:
771      if (slider.vars.pausePlay) { methods.pausePlay.update("pause"); }
772      // SYNC:
773      if (slider.syncExists) { methods.sync("play"); }
774    };
775    // STOP:
776    slider.stop = function () {
777      slider.pause();
778      slider.stopped = true;
779    };
780    slider.canAdvance = function(target, fromNav) {
781      // ASNAV:
782      var last = (asNav) ? slider.pagingCount - 1 : slider.last;
783      return (fromNav) ? true :
784             (asNav && slider.currentItem === slider.count - 1 && target === 0 && slider.direction === "prev") ? true :
785             (asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 && slider.direction !== "next") ? false :
786             (target === slider.currentSlide && !asNav) ? false :
787             (slider.vars.animationLoop) ? true :
788             (slider.atEnd && slider.currentSlide === 0 && target === last && slider.direction !== "next") ? false :
789             (slider.atEnd && slider.currentSlide === last && target === 0 && slider.direction === "next") ? false :
790             true;
791    };
792    slider.getTarget = function(dir) {
793      slider.direction = dir;
794      if (dir === "next") {
795        return (slider.currentSlide === slider.last) ? 0 : slider.currentSlide + 1;
796      } else {
797        return (slider.currentSlide === 0) ? slider.last : slider.currentSlide - 1;
798      }
799    };
800
801    // SLIDE:
802    slider.setProps = function(pos, special, dur) {
803      var target = (function() {
804        var posCheck = (pos) ? pos : ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo,
805            posCalc = (function() {
806              if (carousel) {
807                return (special === "setTouch") ? pos :
808                       (reverse && slider.animatingTo === slider.last) ? 0 :
809                       (reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :
810                       (slider.animatingTo === slider.last) ? slider.limit : posCheck;
811              } else {
812                switch (special) {
813                  case "setTotal": return (reverse) ? ((slider.count - 1) - slider.currentSlide + slider.cloneOffset) * pos : (slider.currentSlide + slider.cloneOffset) * pos;
814                  case "setTouch": return (reverse) ? pos : pos;
815                  case "jumpEnd": return (reverse) ? pos : slider.count * pos;
816                  case "jumpStart": return (reverse) ? slider.count * pos : pos;
817                  default: return pos;
818                }
819              }
820            }());
821
822            return (posCalc * ((slider.vars.rtl)?1:-1)) + "px";
823          }());
824
825      if (slider.transitions) {
826        target = (vertical) ? "translate3d(0," + target + ",0)" : "translate3d(" + (parseInt(target)+'px') + ",0,0)";
827        dur = (dur !== undefined) ? (dur/1000) + "s" : "0s";
828         slider.container.css("transition-duration", dur);
829      }
830
831      slider.args[slider.prop] = target;
832      if (slider.transitions || dur === undefined) { slider.container.css(slider.args); }
833
834      slider.container.css('transform',target);
835    };
836
837    slider.setup = function(type) {
838      // SLIDE:
839      if (!fade) {
840        var sliderOffset, arr;
841
842        if (type === "init") {
843          slider.viewport = $('<div class="' + namespace + 'viewport"></div>').css({"overflow": "hidden", "position": "relative"}).appendTo(slider).append(slider.container);
844          // INFINITE LOOP:
845          slider.cloneCount = 0;
846          slider.cloneOffset = 0;
847          // REVERSE:
848          if (reverse) {
849            arr = $.makeArray(slider.slides).reverse();
850            slider.slides = $(arr);
851            slider.container.empty().append(slider.slides);
852          }
853        }
854        // INFINITE LOOP && !CAROUSEL:
855        if (slider.vars.animationLoop && !carousel) {
856          slider.cloneCount = 2;
857          slider.cloneOffset = 1;
858          // clear out old clones
859          if (type !== "init") { slider.container.find('.clone').remove(); }
860          slider.container.append(methods.uniqueID(slider.slides.first().clone().addClass('clone')).attr('aria-hidden', 'true'))
861                          .prepend(methods.uniqueID(slider.slides.last().clone().addClass('clone')).attr('aria-hidden', 'true'));
862        }
863        slider.newSlides = $(slider.vars.selector, slider);
864
865        sliderOffset = (reverse) ? slider.count - 1 - slider.currentSlide + slider.cloneOffset : slider.currentSlide + slider.cloneOffset;
866        // VERTICAL:
867        if (vertical && !carousel) {
868          slider.container.height((slider.count + slider.cloneCount) * 200 + "%").css("position", "absolute").width("100%");
869          setTimeout(function(){
870            slider.newSlides.css({"display": "block"});
871            slider.doMath();
872            slider.viewport.height(slider.h);
873            slider.setProps(sliderOffset * slider.h, "init");
874          }, (type === "init") ? 100 : 0);
875        } else {
876          slider.container.width((slider.count + slider.cloneCount) * 200 + "%");
877          slider.setProps(sliderOffset * slider.computedW, "init");
878          setTimeout(function(){
879            slider.doMath();
880          if(slider.vars.rtl){
881              slider.newSlides.css({"width": slider.computedW, "marginRight" : slider.computedM, "float": "right", "display": "block"});
882           }
883            else{
884              slider.newSlides.css({"width": slider.computedW, "marginRight" : slider.computedM, "float": "left", "display": "block"});
885            }
886            // SMOOTH HEIGHT:
887            if (slider.vars.smoothHeight) { methods.smoothHeight(); }
888          }, (type === "init") ? 100 : 0);
889        }
890      } else { // FADE:
891        if(slider.vars.rtl){
892          slider.slides.css({"width": "100%", "float": 'right', "marginLeft": "-100%", "position": "relative"});
893        }
894        else{
895          slider.slides.css({"width": "100%", "float": 'left', "marginRight": "-100%", "position": "relative"});
896        }
897        if (type === "init") {
898          if (!touch) {
899            //slider.slides.eq(slider.currentSlide).fadeIn(slider.vars.animationSpeed, slider.vars.easing);
900            if (slider.vars.fadeFirstSlide == false) {
901              slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).css({"opacity": 1});
902            } else {
903              slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).animate({"opacity": 1},slider.vars.animationSpeed,slider.vars.easing);
904            }
905          } else {
906            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});
907          }
908        }
909        // SMOOTH HEIGHT:
910        if (slider.vars.smoothHeight) { methods.smoothHeight(); }
911      }
912      // !CAROUSEL:
913      // CANDIDATE: active slide
914      if (!carousel) { slider.slides.removeClass(namespace + "active-slide").eq(slider.currentSlide).addClass(namespace + "active-slide"); }
915
916      //FlexSlider: init() Callback
917      slider.vars.init(slider);
918    };
919
920    slider.doMath = function() {
921      var slide = slider.slides.first(),
922          slideMargin = slider.vars.itemMargin,
923          minItems = slider.vars.minItems,
924          maxItems = slider.vars.maxItems;
925
926      slider.w = (slider.viewport===undefined) ? slider.width() : slider.viewport.width();
927      if (slider.isFirefox) { slider.w = slider.width(); }
928      slider.h = slide.height();
929      slider.boxPadding = slide.outerWidth() - slide.width();
930
931      // CAROUSEL:
932      if (carousel) {
933        slider.itemT = slider.vars.itemWidth + slideMargin;
934        slider.itemM = slideMargin;
935        slider.minW = (minItems) ? minItems * slider.itemT : slider.w;
936        slider.maxW = (maxItems) ? (maxItems * slider.itemT) - slideMargin : slider.w;
937        slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin * (minItems - 1)))/minItems :
938                       (slider.maxW < slider.w) ? (slider.w - (slideMargin * (maxItems - 1)))/maxItems :
939                       (slider.vars.itemWidth > slider.w) ? slider.w : slider.vars.itemWidth;
940
941        slider.visible = Math.floor(slider.w/(slider.itemW));
942        slider.move = (slider.vars.move > 0 && slider.vars.move < slider.visible ) ? slider.vars.move : slider.visible;
943        slider.pagingCount = Math.ceil(((slider.count - slider.visible)/slider.move) + 1);
944        slider.last =  slider.pagingCount - 1;
945        slider.limit = (slider.pagingCount === 1) ? 0 :
946                       (slider.vars.itemWidth > slider.w) ? (slider.itemW * (slider.count - 1)) + (slideMargin * (slider.count - 1)) : ((slider.itemW + slideMargin) * slider.count) - slider.w - slideMargin;
947      } else {
948        slider.itemW = slider.w;
949        slider.itemM = slideMargin;
950        slider.pagingCount = slider.count;
951        slider.last = slider.count - 1;
952      }
953      slider.computedW = slider.itemW - slider.boxPadding;
954      slider.computedM = slider.itemM;
955    };
956
957    slider.update = function(pos, action) {
958      slider.doMath();
959
960      // update currentSlide and slider.animatingTo if necessary
961      if (!carousel) {
962        if (pos < slider.currentSlide) {
963          slider.currentSlide += 1;
964        } else if (pos <= slider.currentSlide && pos !== 0) {
965          slider.currentSlide -= 1;
966        }
967        slider.animatingTo = slider.currentSlide;
968      }
969
970      // update controlNav
971      if (slider.vars.controlNav && !slider.manualControls) {
972        if ((action === "add" && !carousel) || slider.pagingCount > slider.controlNav.length) {
973          methods.controlNav.update("add");
974        } else if ((action === "remove" && !carousel) || slider.pagingCount < slider.controlNav.length) {
975          if (carousel && slider.currentSlide > slider.last) {
976            slider.currentSlide -= 1;
977            slider.animatingTo -= 1;
978          }
979          methods.controlNav.update("remove", slider.last);
980        }
981      }
982      // update directionNav
983      if (slider.vars.directionNav) { methods.directionNav.update(); }
984
985    };
986
987    slider.addSlide = function(obj, pos) {
988      var $obj = $(obj);
989
990      slider.count += 1;
991      slider.last = slider.count - 1;
992
993      // append new slide
994      if (vertical && reverse) {
995        (pos !== undefined) ? slider.slides.eq(slider.count - pos).after($obj) : slider.container.prepend($obj);
996      } else {
997        (pos !== undefined) ? slider.slides.eq(pos).before($obj) : slider.container.append($obj);
998      }
999
1000      // update currentSlide, animatingTo, controlNav, and directionNav
1001      slider.update(pos, "add");
1002
1003      // update slider.slides
1004      slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
1005      // re-setup the slider to accomdate new slide
1006      slider.setup();
1007
1008      //FlexSlider: added() Callback
1009      slider.vars.added(slider);
1010    };
1011    slider.removeSlide = function(obj) {
1012      var pos = (isNaN(obj)) ? slider.slides.index($(obj)) : obj;
1013
1014      // update count
1015      slider.count -= 1;
1016      slider.last = slider.count - 1;
1017
1018      // remove slide
1019      if (isNaN(obj)) {
1020        $(obj, slider.slides).remove();
1021      } else {
1022        (vertical && reverse) ? slider.slides.eq(slider.last).remove() : slider.slides.eq(obj).remove();
1023      }
1024
1025      // update currentSlide, animatingTo, controlNav, and directionNav
1026      slider.doMath();
1027      slider.update(pos, "remove");
1028
1029      // update slider.slides
1030      slider.slides = $(slider.vars.selector + ':not(.clone)', slider);
1031      // re-setup the slider to accomdate new slide
1032      slider.setup();
1033
1034      // FlexSlider: removed() Callback
1035      slider.vars.removed(slider);
1036    };
1037
1038    //FlexSlider: Initialize
1039    methods.init();
1040  };
1041
1042  // Ensure the slider isn't focussed if the window loses focus.
1043  $( window ).on( 'blur', function ( e ) {
1044    focused = false;
1045  }).on( 'focus', function ( e ) {
1046    focused = true;
1047  });
1048
1049  //FlexSlider: Default Settings
1050  $.flexslider.defaults = {
1051    namespace: "flex-",             //{NEW} String: Prefix string attached to the class of every element generated by the plugin
1052    selector: ".slides > li",       //{NEW} Selector: Must match a simple pattern. '{container} > {slide}' -- Ignore pattern at your own peril
1053    animation: "fade",              //String: Select your animation type, "fade" or "slide"
1054    easing: "swing",                //{NEW} String: Determines the easing method used in jQuery transitions. Most jQuery easing plugin methods are supported!
1055    direction: "horizontal",        //String: Select the sliding direction, "horizontal" or "vertical"
1056    reverse: false,                 //{NEW} Boolean: Reverse the animation direction
1057    animationLoop: true,            //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end
1058    smoothHeight: false,            //{NEW} Boolean: Allow height of the slider to animate smoothly in horizontal mode
1059    startAt: 0,                     //Integer: The slide that the slider should start on. Array notation (0 = first slide)
1060    slideshow: true,                //Boolean: Animate slider automatically
1061    slideshowSpeed: 7000,           //Integer: Set the speed of the slideshow cycling, in milliseconds
1062    animationSpeed: 600,            //Integer: Set the speed of animations, in milliseconds
1063    initDelay: 0,                   //{NEW} Integer: Set an initialization delay, in milliseconds
1064    randomize: false,               //Boolean: Randomize slide order
1065    fadeFirstSlide: true,           //Boolean: Fade in the first slide when animation type is "fade"
1066    thumbCaptions: false,           //Boolean: Whether or not to put captions on thumbnails when using the "thumbnails" controlNav.
1067
1068    // Usability features
1069    pauseOnAction: true,            //Boolean: Pause the slideshow when interacting with control elements, highly recommended.
1070    pauseOnHover: false,            //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering
1071    pauseInvisible: true,   		//{NEW} Boolean: Pause the slideshow when tab is invisible, resume when visible. Provides better UX, lower CPU usage.
1072    useCSS: true,                   //{NEW} Boolean: Slider will use CSS3 transitions if available
1073    touch: true,                    //{NEW} Boolean: Allow touch swipe navigation of the slider on touch-enabled devices
1074    video: false,                   //{NEW} Boolean: If using video in the slider, will prevent CSS3 3D Transforms to avoid graphical glitches
1075
1076    // Primary Controls
1077    controlNav: true,               //Boolean: Create navigation for paging control of each slide? Note: Leave true for manualControls usage
1078    directionNav: true,             //Boolean: Create navigation for previous/next navigation? (true/false)
1079    prevText: "Previous",           //String: Set the text for the "previous" directionNav item
1080    nextText: "Next",               //String: Set the text for the "next" directionNav item
1081
1082    // Secondary Navigation
1083    keyboard: true,                 //Boolean: Allow slider navigating via keyboard left/right keys
1084    multipleKeyboard: false,        //{NEW} Boolean: Allow keyboard navigation to affect multiple sliders. Default behavior cuts out keyboard navigation with more than one slider present.
1085    mousewheel: false,              //{UPDATED} Boolean: Requires jquery.mousewheel.js (https://github.com/brandonaaron/jquery-mousewheel) - Allows slider navigating via mousewheel
1086    pausePlay: false,               //Boolean: Create pause/play dynamic element
1087    pauseText: "Pause",             //String: Set the text for the "pause" pausePlay item
1088    playText: "Play",               //String: Set the text for the "play" pausePlay item
1089
1090    // Special properties
1091    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.
1092    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.
1093    customDirectionNav: "",         //{NEW}
vendor: 3,558 bytes, lines 1093-1150
1093 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)
1094    sync: "",                       //{NEW} Selector: Mirror the actions performed on this slider with another slider. Use with care.
1095    asNavFor: "",                   //{NEW} Selector: Internal property exposed for turning the slider into a thumbnail navigation for another slider
1096
1097    // Carousel Options
1098    itemWidth: 0,                   //{NEW} Integer: Box-model width of individual carousel items, including horizontal borders and padding.
1099    itemMargin: 0,                  //{NEW} Integer: Margin between carousel items.
1100    minItems: 1,                    //{NEW} Integer: Minimum number of carousel items that should be visible. Items will resize fluidly when below this.
1101    maxItems: 0,                    //{NEW} Integer: Maxmimum number of carousel items that should be visible. Items will resize fluidly when above this limit.
1102    move: 0,                        //{NEW} Integer: Number of carousel items that should move on animation. If 0, slider will move all visible items.
1103    allowOneSlide: true,           //{NEW} Boolean: Whether or not to allow a slider comprised of a single slide
1104
1105    // Browser Specific
1106    isFirefox: false,             // {NEW} Boolean: Set to true when Firefox is the browser used.
1107
1108    // Callback API
1109    start: function(){},            //Callback: function(slider) - Fires when the slider loads the first slide
1110    before: function(){},           //Callback: function(slider) - Fires asynchronously with each slider animation
1111    after: function(){},            //Callback: function(slider) - Fires after each slider animation completes
1112    end: function(){},              //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous)
1113    added: function(){},            //{NEW} Callback: function(slider) - Fires after a slide is added
1114    removed: function(){},           //{NEW} Callback: function(slider) - Fires after a slide is removed
1115    init: function() {},             //{NEW} Callback: function(slider) - Fires after the slider is initially setup
1116	rtl: false             //{NEW} Boolean: Whether or not to enable RTL mode
1117  };
1118
1119  //FlexSlider: Plugin Function
1120  $.fn.flexslider = function(options) {
1121    if (options === undefined) { options = {}; }
1122
1123    if (typeof options === "object") {
1124      return this.each(function() {
1125        var $this = $(this),
1126            selector = (options.selector) ? options.selector : ".slides > li",
1127            $slides = $this.find(selector);
1128
1129      if ( ( $slides.length === 1 && options.allowOneSlide === false ) || $slides.length === 0 ) {
1130          $slides.fadeIn(400);
1131          if (options.start) { options.start($this); }
1132        } else if ($this.data('flexslider') === undefined) {
1133          new $.flexslider(this, options);
1134        }
1135      });
1136    } else {
1137      // Helper strings to quickly perform functions on the slider
1138      var $slider = $(this).data('flexslider');
1139      switch (options) {
1140        case "play": $slider.play(); break;
1141        case "pause": $slider.pause(); break;
1142        case "stop": $slider.stop(); break;
1143        case "next": $slider.flexAnimate($slider.getTarget("next"), true); break;
1144        case "prev":
1145        case "previous": $slider.flexAnimate($slider.getTarget("prev"), true); break;
1146        default: if (typeof options === "number") { $slider.flexAnimate(options, true); }
1147      }
1148    }
1149  };
1150})(jQuery);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.