PageSourceSearch

https://www.obecbonkov.cz/wrs_frontend/js/jquery.flexslider2.js

js obecbonkov.cz collected 2026-10-02 22:52:14 UTC 57,939 bytes, 1,271 lines download raw bytes

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