PageSourceSearch

https://www.tgtourism.tv/wp-content/themes/kami/js/jquery.flexslider.js?ver=cdf85212ff11b53c94b4b1052c376e6c

js tgtourism.tv collected 2026-10-02 04:44:39 UTC 52,891 bytes, 1,153 lines download raw bytes

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