| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128 | /* * jQuery FlexSlider v2.2.0 * Copyright 2012 WooThemes * Contributing Author: Tyler Smith */;(function ($) {  //FlexSlider: Object Instance  $.flexslider = function(el, options) {    var slider = $(el);    // making variables public    slider.vars = $.extend({}, $.flexslider.defaults, options);    var namespace = slider.vars.namespace,        msGesture = window.navigator && window.navigator.msPointerEnabled && window.MSGesture,        touch = (( "ontouchstart" in window ) || msGesture || window.DocumentTouch && document instanceof DocumentTouch) && slider.vars.touch,        // depricating this idea, as devices are being released with both of these events        //eventType = (touch) ? "touchend" : "click",        eventType = "click touchend MSPointerUp",        watchedEvent = "",        watchedEventClearTimer,        vertical = slider.vars.direction === "vertical",        reverse = slider.vars.reverse,        carousel = (slider.vars.itemWidth > 0),        fade = slider.vars.animation === "fade",        asNav = slider.vars.asNavFor !== "",        methods = {},        focused = true;    // Store a reference to the slider object    $.data(el, "flexslider", slider);    // Private slider methods    methods = {      init: function() {        slider.animating = false;        // Get current slide and make sure it is a number        slider.currentSlide = parseInt( ( slider.vars.startAt ? slider.vars.startAt : 0) );        if ( isNaN( slider.currentSlide ) ) slider.currentSlide = 0;        slider.animatingTo = slider.currentSlide;        slider.atEnd = (slider.currentSlide === 0 || slider.currentSlide === slider.last);        slider.containerSelector = slider.vars.selector.substr(0,slider.vars.selector.search(' '));        slider.slides = $(slider.vars.selector, slider);        slider.container = $(slider.containerSelector, slider);        slider.count = slider.slides.length;        // SYNC:        slider.syncExists = $(slider.vars.sync).length > 0;        // SLIDE:        if (slider.vars.animation === "slide") slider.vars.animation = "swing";        slider.prop = (vertical) ? "top" : "marginLeft";        slider.args = {};        // SLIDESHOW:        slider.manualPause = false;        slider.stopped = false;        //PAUSE WHEN INVISIBLE        slider.started = false;        slider.startTimeout = null;        // TOUCH/USECSS:        slider.transitions = !slider.vars.video && !fade && slider.vars.useCSS && (function() {          var obj = document.createElement('div'),              props = ['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective'];          for (var i in props) {            if ( obj.style[ props[i] ] !== undefined ) {              slider.pfx = props[i].replace('Perspective','').toLowerCase();              slider.prop = "-" + slider.pfx + "-transform";              return true;            }          }          return false;        }());        // CONTROLSCONTAINER:        if (slider.vars.controlsContainer !== "") slider.controlsContainer = $(slider.vars.controlsContainer).length > 0 && $(slider.vars.controlsContainer);        // MANUAL:        if (slider.vars.manualControls !== "") slider.manualControls = $(slider.vars.manualControls).length > 0 && $(slider.vars.manualControls);        // RANDOMIZE:        if (slider.vars.randomize) {          slider.slides.sort(function() { return (Math.round(Math.random())-0.5); });          slider.container.empty().append(slider.slides);        }        slider.doMath();        // INIT        slider.setup("init");        // CONTROLNAV:        if (slider.vars.controlNav) methods.controlNav.setup();        // DIRECTIONNAV:        if (slider.vars.directionNav) methods.directionNav.setup();        // KEYBOARD:        if (slider.vars.keyboard && ($(slider.containerSelector).length === 1 || slider.vars.multipleKeyboard)) {          $(document).bind('keyup', function(event) {            var keycode = event.keyCode;            if (!slider.animating && (keycode === 39 || keycode === 37)) {              var target = (keycode === 39) ? slider.getTarget('next') :                           (keycode === 37) ? slider.getTarget('prev') : false;              slider.flexAnimate(target, slider.vars.pauseOnAction);            }          });        }        // MOUSEWHEEL:        if (slider.vars.mousewheel) {          slider.bind('mousewheel', function(event, delta, deltaX, deltaY) {            event.preventDefault();            var target = (delta < 0) ? slider.getTarget('next') : slider.getTarget('prev');            slider.flexAnimate(target, slider.vars.pauseOnAction);          });        }        // PAUSEPLAY        if (slider.vars.pausePlay) methods.pausePlay.setup();        //PAUSE WHEN INVISIBLE        if (slider.vars.slideshow && slider.vars.pauseInvisible) methods.pauseInvisible.init();        // SLIDSESHOW        if (slider.vars.slideshow) {          if (slider.vars.pauseOnHover) {            slider.hover(function() {              if (!slider.manualPlay && !slider.manualPause) slider.pause();            }, function() {              if (!slider.manualPause && !slider.manualPlay && !slider.stopped) slider.play();            });          }          // initialize animation          //If we're visible, or we don't use PageVisibility API          if(!slider.vars.pauseInvisible || !methods.pauseInvisible.isHidden()) {            (slider.vars.initDelay > 0) ? slider.startTimeout = setTimeout(slider.play, slider.vars.initDelay) : slider.play();          }        }        // ASNAV:        if (asNav) methods.asNav.setup();        // TOUCH        if (touch && slider.vars.touch) methods.touch();        // FADE&&SMOOTHHEIGHT || SLIDE:        if (!fade || (fade && slider.vars.smoothHeight)) $(window).bind("resize orientationchange focus", methods.resize);        slider.find("img").attr("draggable", "false");        // API: start() Callback        setTimeout(function(){          slider.vars.start(slider);        }, 200);      },      asNav: {        setup: function() {          slider.asNav = true;          slider.animatingTo = Math.floor(slider.currentSlide/slider.move);          slider.currentItem = slider.currentSlide;          slider.slides.removeClass(namespace + "active-slide").eq(slider.currentItem).addClass(namespace + "active-slide");          if(!msGesture){              slider.slides.click(function(e){                e.preventDefault();                var $slide = $(this),                    target = $slide.index();                var posFromLeft = $slide.offset().left - $(slider).scrollLeft(); // Find position of slide relative to left of slider container                if( posFromLeft <= 0 && $slide.hasClass( namespace + 'active-slide' ) ) {                  slider.flexAnimate(slider.getTarget("prev"), true);                } else if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass(namespace + "active-slide")) {                  slider.direction = (slider.currentItem < target) ? "next" : "prev";                  slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true);                }              });          }else{              el._slider = slider;              slider.slides.each(function (){                  var that = this;                  that._gesture = new MSGesture();                  that._gesture.target = that;                  that.addEventListener("MSPointerDown", function (e){                      e.preventDefault();                      if(e.currentTarget._gesture)                          e.currentTarget._gesture.addPointer(e.pointerId);                  }, false);                  that.addEventListener("MSGestureTap", function (e){                      e.preventDefault();                      var $slide = $(this),                          target = $slide.index();                      if (!$(slider.vars.asNavFor).data('flexslider').animating && !$slide.hasClass('active')) {                          slider.direction = (slider.currentItem < target) ? "next" : "prev";                          slider.flexAnimate(target, slider.vars.pauseOnAction, false, true, true);                      }                  });              });          }        }      },      controlNav: {        setup: function() {          if (!slider.manualControls) {            methods.controlNav.setupPaging();          } else { // MANUALCONTROLS:            methods.controlNav.setupManual();          }        },        setupPaging: function() {          var type = (slider.vars.controlNav === "thumbnails") ? 'control-thumbs' : 'control-paging',              j = 1,              item,              slide;          slider.controlNavScaffold = $('<ol class="'+ namespace + 'control-nav ' + namespace + type + '"></ol>');          if (slider.pagingCount > 1) {            for (var i = 0; i < slider.pagingCount; i++) {              slide = slider.slides.eq(i);              item = (slider.vars.controlNav === "thumbnails") ? '<img src="' + slide.attr( 'data-thumb' ) + '"/>' : '<a>' + j + '</a>';              if ( 'thumbnails' === slider.vars.controlNav && true === slider.vars.thumbCaptions ) {                var captn = slide.attr( 'data-thumbcaption' );                if ( '' != captn && undefined != captn ) item += '<span class="' + namespace + 'caption">' + captn + '</span>';              }              slider.controlNavScaffold.append('<li>' + item + '</li>');              j++;            }          }          // CONTROLSCONTAINER:          (slider.controlsContainer) ? $(slider.controlsContainer).append(slider.controlNavScaffold) : slider.append(slider.controlNavScaffold);          methods.controlNav.set();          methods.controlNav.active();          slider.controlNavScaffold.delegate('a, img', eventType, function(event) {            event.preventDefault();            if (watchedEvent === "" || watchedEvent === event.type) {              var $this = $(this),                  target = slider.controlNav.index($this);              if (!$this.hasClass(namespace + 'active')) {                slider.direction = (target > slider.currentSlide) ? "next" : "prev";                slider.flexAnimate(target, slider.vars.pauseOnAction);              }            }            // setup flags to prevent event duplication            if (watchedEvent === "") {              watchedEvent = event.type;            }            methods.setToClearWatchedEvent();          });        },        setupManual: function() {          slider.controlNav = slider.manualControls;          methods.controlNav.active();          slider.controlNav.bind(eventType, function(event) {            event.preventDefault();            if (watchedEvent === "" || watchedEvent === event.type) {              var $this = $(this),                  target = slider.controlNav.index($this);              if (!$this.hasClass(namespace + 'active')) {                (target > slider.currentSlide) ? slider.direction = "next" : slider.direction = "prev";                slider.flexAnimate(target, slider.vars.pauseOnAction);              }            }            // setup flags to prevent event duplication            if (watchedEvent === "") {              watchedEvent = event.type;            }            methods.setToClearWatchedEvent();          });        },        set: function() {          var selector = (slider.vars.controlNav === "thumbnails") ? 'img' : 'a';          slider.controlNav = $('.' + namespace + 'control-nav li ' + selector, (slider.controlsContainer) ? slider.controlsContainer : slider);        },        active: function() {          slider.controlNav.removeClass(namespace + "active").eq(slider.animatingTo).addClass(namespace + "active");        },        update: function(action, pos) {          if (slider.pagingCount > 1 && action === "add") {            slider.controlNavScaffold.append($('<li><a>' + slider.count + '</a></li>'));          } else if (slider.pagingCount === 1) {            slider.controlNavScaffold.find('li').remove();          } else {            slider.controlNav.eq(pos).closest('li').remove();          }          methods.controlNav.set();          (slider.pagingCount > 1 && slider.pagingCount !== slider.controlNav.length) ? slider.update(pos, action) : methods.controlNav.active();        }      },      directionNav: {        setup: function() {          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>');          // CONTROLSCONTAINER:          if (slider.controlsContainer) {            $(slider.controlsContainer).append(directionNavScaffold);            slider.directionNav = $('.' + namespace + 'direction-nav li a', slider.controlsContainer);          } else {            slider.append(directionNavScaffold);            slider.directionNav = $('.' + namespace + 'direction-nav li a', slider);          }          methods.directionNav.update();          slider.directionNav.bind(eventType, function(event) {            event.preventDefault();            var target;            if (watchedEvent === "" || watchedEvent === event.type) {              target = ($(this).hasClass(namespace + 'next')) ? slider.getTarget('next') : slider.getTarget('prev');              slider.flexAnimate(target, slider.vars.pauseOnAction);            }            // setup flags to prevent event duplication            if (watchedEvent === "") {              watchedEvent = event.type;            }            methods.setToClearWatchedEvent();          });        },        update: function() {          var disabledClass = namespace + 'disabled';          if (slider.pagingCount === 1) {            slider.directionNav.addClass(disabledClass).attr('tabindex', '-1');          } else if (!slider.vars.animationLoop) {            if (slider.animatingTo === 0) {              slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "prev").addClass(disabledClass).attr('tabindex', '-1');            } else if (slider.animatingTo === slider.last) {              slider.directionNav.removeClass(disabledClass).filter('.' + namespace + "next").addClass(disabledClass).attr('tabindex', '-1');            } else {              slider.directionNav.removeClass(disabledClass).removeAttr('tabindex');            }          } else {            slider.directionNav.removeClass(disabledClass).removeAttr('tabindex');          }        }      },      pausePlay: {        setup: function() {          var pausePlayScaffold = $('<div class="' + namespace + 'pauseplay"><a></a></div>');          // CONTROLSCONTAINER:          if (slider.controlsContainer) {            slider.controlsContainer.append(pausePlayScaffold);            slider.pausePlay = $('.' + namespace + 'pauseplay a', slider.controlsContainer);          } else {            slider.append(pausePlayScaffold);            slider.pausePlay = $('.' + namespace + 'pauseplay a', slider);          }          methods.pausePlay.update((slider.vars.slideshow) ? namespace + 'pause' : namespace + 'play');          slider.pausePlay.bind(eventType, function(event) {            event.preventDefault();            if (watchedEvent === "" || watchedEvent === event.type) {              if ($(this).hasClass(namespace + 'pause')) {                slider.manualPause = true;                slider.manualPlay = false;                slider.pause();              } else {                slider.manualPause = false;                slider.manualPlay = true;                slider.play();              }            }            // setup flags to prevent event duplication            if (watchedEvent === "") {              watchedEvent = event.type;            }            methods.setToClearWatchedEvent();          });        },        update: function(state) {          (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);        }      },      touch: function() {        var startX,          startY,          offset,          cwidth,          dx,          startT,          scrolling = false,          localX = 0,          localY = 0,          accDx = 0;        if(!msGesture){            el.addEventListener('touchstart', onTouchStart, false);            function onTouchStart(e) {              if (slider.animating) {                e.preventDefault();              } else if ( ( window.navigator.msPointerEnabled ) || e.touches.length === 1 ) {                slider.pause();                // CAROUSEL:                cwidth = (vertical) ? slider.h : slider. w;                startT = Number(new Date());                // CAROUSEL:                // Local vars for X and Y points.                localX = e.touches[0].pageX;                localY = e.touches[0].pageY;                offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 :                         (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :                         (carousel && slider.currentSlide === slider.last) ? slider.limit :                         (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide :                         (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth;                startX = (vertical) ? localY : localX;                startY = (vertical) ? localX : localY;                el.addEventListener('touchmove', onTouchMove, false);                el.addEventListener('touchend', onTouchEnd, false);              }            }            function onTouchMove(e) {              // Local vars for X and Y points.              localX = e.touches[0].pageX;              localY = e.touches[0].pageY;              dx = (vertical) ? startX - localY : startX - localX;              scrolling = (vertical) ? (Math.abs(dx) < Math.abs(localX - startY)) : (Math.abs(dx) < Math.abs(localY - startY));              var fxms = 500;              if ( ! scrolling || Number( new Date() ) - startT > fxms ) {                e.preventDefault();                if (!fade && slider.transitions) {                  if (!slider.vars.animationLoop) {                    dx = dx/((slider.currentSlide === 0 && dx < 0 || slider.currentSlide === slider.last && dx > 0) ? (Math.abs(dx)/cwidth+2) : 1);                  }                  slider.setProps(offset + dx, "setTouch");                }              }            }            function onTouchEnd(e) {              // finish the touch by undoing the touch session              el.removeEventListener('touchmove', onTouchMove, false);              if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) {                var updateDx = (reverse) ? -dx : dx,                    target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev');                if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) {                  slider.flexAnimate(target, slider.vars.pauseOnAction);                } else {                  if (!fade) slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true);                }              }              el.removeEventListener('touchend', onTouchEnd, false);              startX = null;              startY = null;              dx = null;              offset = null;            }        }else{            el.style.msTouchAction = "none";            el._gesture = new MSGesture();            el._gesture.target = el;            el.addEventListener("MSPointerDown", onMSPointerDown, false);            el._slider = slider;            el.addEventListener("MSGestureChange", onMSGestureChange, false);            el.addEventListener("MSGestureEnd", onMSGestureEnd, false);            function onMSPointerDown(e){                e.stopPropagation();                if (slider.animating) {                    e.preventDefault();                }else{                    slider.pause();                    el._gesture.addPointer(e.pointerId);                    accDx = 0;                    cwidth = (vertical) ? slider.h : slider. w;                    startT = Number(new Date());                    // CAROUSEL:                    offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 :                        (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :                            (carousel && slider.currentSlide === slider.last) ? slider.limit :                                (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide :                                    (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth;                }            }            function onMSGestureChange(e) {                e.stopPropagation();                var slider = e.target._slider;                if(!slider){                    return;                }                var transX = -e.translationX,                    transY = -e.translationY;                //Accumulate translations.                accDx = accDx + ((vertical) ? transY : transX);                dx = accDx;                scrolling = (vertical) ? (Math.abs(accDx) < Math.abs(-transX)) : (Math.abs(accDx) < Math.abs(-transY));                if(e.detail === e.MSGESTURE_FLAG_INERTIA){                    setImmediate(function (){                        el._gesture.stop();                    });                    return;                }                if (!scrolling || Number(new Date()) - startT > 500) {                    e.preventDefault();                    if (!fade && slider.transitions) {                        if (!slider.vars.animationLoop) {                            dx = accDx / ((slider.currentSlide === 0 && accDx < 0 || slider.currentSlide === slider.last && accDx > 0) ? (Math.abs(accDx) / cwidth + 2) : 1);                        }                        slider.setProps(offset + dx, "setTouch");                    }                }            }            function onMSGestureEnd(e) {                e.stopPropagation();                var slider = e.target._slider;                if(!slider){                    return;                }                if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) {                    var updateDx = (reverse) ? -dx : dx,                        target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev');                    if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) {                        slider.flexAnimate(target, slider.vars.pauseOnAction);                    } else {                        if (!fade) slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true);                    }                }                startX = null;                startY = null;                dx = null;                offset = null;                accDx = 0;            }        }      },      resize: function() {        if (!slider.animating && slider.is(':visible')) {          if (!carousel) slider.doMath();          if (fade) {            // SMOOTH HEIGHT:            methods.smoothHeight();          } else if (carousel) { //CAROUSEL:            slider.slides.width(slider.computedW);            slider.update(slider.pagingCount);            slider.setProps();          }          else if (vertical) { //VERTICAL:            slider.viewport.height(slider.h);            slider.setProps(slider.h, "setTotal");          } else {            // SMOOTH HEIGHT:            if (slider.vars.smoothHeight) methods.smoothHeight();            slider.newSlides.width(slider.computedW);            slider.setProps(slider.computedW, "setTotal");          }        }      },      smoothHeight: function(dur) {        if (!vertical || fade) {          var $obj = (fade) ? slider : slider.viewport;          (dur) ? $obj.animate({"height": slider.slides.eq(slider.animatingTo).height()}, dur) : $obj.height(slider.slides.eq(slider.animatingTo).height());        }      },      sync: function(action) {        var $obj = $(slider.vars.sync).data("flexslider"),            target = slider.animatingTo;        switch (action) {          case "animate": $obj.flexAnimate(target, slider.vars.pauseOnAction, false, true); break;          case "play": if (!$obj.playing && !$obj.asNav) { $obj.play(); } break;          case "pause": $obj.pause(); break;        }      },      pauseInvisible: {        visProp: null,        init: function() {          var prefixes = ['webkit','moz','ms','o'];          if ('hidden' in document) return 'hidden';          for (var i = 0; i < prefixes.length; i++) {            if ((prefixes[i] + 'Hidden') in document)             methods.pauseInvisible.visProp = prefixes[i] + 'Hidden';          }          if (methods.pauseInvisible.visProp) {            var evtname = methods.pauseInvisible.visProp.replace(/[H|h]idden/,'') + 'visibilitychange';            document.addEventListener(evtname, function() {              if (methods.pauseInvisible.isHidden()) {                if(slider.startTimeout) clearTimeout(slider.startTimeout); //If clock is ticking, stop timer and prevent from starting while invisible                else slider.pause(); //Or just pause              }              else {                if(slider.started) slider.play(); //Initiated before, just play                else (slider.vars.initDelay > 0) ? setTimeout(slider.play, slider.vars.initDelay) : slider.play(); //Didn't init before: simply init or wait for it              }            });          }               },        isHidden: function() {          return document[methods.pauseInvisible.visProp] || false;        }      },      setToClearWatchedEvent: function() {        clearTimeout(watchedEventClearTimer);        watchedEventClearTimer = setTimeout(function() {          watchedEvent = "";        }, 3000);      }    }    // public methods    slider.flexAnimate = function(target, pause, override, withSync, fromNav) {      if (!slider.vars.animationLoop && target !== slider.currentSlide) {        slider.direction = (target > slider.currentSlide) ? "next" : "prev";      }      if (asNav && slider.pagingCount === 1) slider.direction = (slider.currentItem < target) ? "next" : "prev";      if (!slider.animating && (slider.canAdvance(target, fromNav) || override) && slider.is(":visible")) {        if (asNav && withSync) {          var master = $(slider.vars.asNavFor).data('flexslider');          slider.atEnd = target === 0 || target === slider.count - 1;          master.flexAnimate(target, true, false, true, fromNav);          slider.direction = (slider.currentItem < target) ? "next" : "prev";          master.direction = slider.direction;          if (Math.ceil((target + 1)/slider.visible) - 1 !== slider.currentSlide && target !== 0) {            slider.currentItem = target;            slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");            target = Math.floor(target/slider.visible);          } else {            slider.currentItem = target;            slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide");            return false;          }        }        slider.animating = true;        slider.animatingTo = target;        // SLIDESHOW:        if (pause) slider.pause();        // API: before() animation Callback        slider.vars.before(slider);        // SYNC:        if (slider.syncExists && !fromNav) methods.sync("animate");        // CONTROLNAV        if (slider.vars.controlNav) methods.controlNav.active();        // !CAROUSEL:        // CANDIDATE: slide active class (for add/remove slide)        if (!carousel) slider.slides.removeClass(namespace + 'active-slide').eq(target).addClass(namespace + 'active-slide');        // INFINITE LOOP:        // CANDIDATE: atEnd        slider.atEnd = target === 0 || target === slider.last;        // DIRECTIONNAV:        if (slider.vars.directionNav) methods.directionNav.update();        if (target === slider.last) {          // API: end() of cycle Callback          slider.vars.end(slider);          // SLIDESHOW && !INFINITE LOOP:          if (!slider.vars.animationLoop) slider.pause();        }        // SLIDE:        if (!fade) {          var dimension = (vertical) ? slider.slides.filter(':first').height() : slider.computedW,              margin, slideString, calcNext;          // INFINITE LOOP / REVERSE:          if (carousel) {            //margin = (slider.vars.itemWidth > slider.w) ? slider.vars.itemMargin * 2 : slider.vars.itemMargin;            margin = slider.vars.itemMargin;            calcNext = ((slider.itemW + margin) * slider.move) * slider.animatingTo;            slideString = (calcNext > slider.limit && slider.visible !== 1) ? slider.limit : calcNext;          } else if (slider.currentSlide === 0 && target === slider.count - 1 && slider.vars.animationLoop && slider.direction !== "next") {            slideString = (reverse) ? (slider.count + slider.cloneOffset) * dimension : 0;          } else if (slider.currentSlide === slider.last && target === 0 && slider.vars.animationLoop && slider.direction !== "prev") {            slideString = (reverse) ? 0 : (slider.count + 1) * dimension;          } else {            slideString = (reverse) ? ((slider.count - 1) - target + slider.cloneOffset) * dimension : (target + slider.cloneOffset) * dimension;          }          slider.setProps(slideString, "", slider.vars.animationSpeed);          if (slider.transitions) {            if (!slider.vars.animationLoop || !slider.atEnd) {              slider.animating = false;              slider.currentSlide = slider.animatingTo;            }            slider.container.unbind("webkitTransitionEnd transitionend");            slider.container.bind("webkitTransitionEnd transitionend", function() {              slider.wrapup(dimension);            });          } else {            slider.container.animate(slider.args, slider.vars.animationSpeed, slider.vars.easing, function(){              slider.wrapup(dimension);            });          }        } else { // FADE:          if (!touch) {            //slider.slides.eq(slider.currentSlide).fadeOut(slider.vars.animationSpeed, slider.vars.easing);            //slider.slides.eq(target).fadeIn(slider.vars.animationSpeed, slider.vars.easing, slider.wrapup);            slider.slides.eq(slider.currentSlide).css({"zIndex": 1}).animate({"opacity": 0}, slider.vars.animationSpeed, slider.vars.easing);            slider.slides.eq(target).css({"zIndex": 2}).animate({"opacity": 1}, slider.vars.animationSpeed, slider.vars.easing, slider.wrapup);          } else {            slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 });            slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 });            slider.wrapup(dimension);          }        }        // SMOOTH HEIGHT:        if (slider.vars.smoothHeight) methods.smoothHeight(slider.vars.animationSpeed);      }    }    slider.wrapup = function(dimension) {      // SLIDE:      if (!fade && !carousel) {        if (slider.currentSlide === 0 && slider.animatingTo === slider.last && slider.vars.animationLoop) {          slider.setProps(dimension, "jumpEnd");        } else if (slider.currentSlide === slider.last && slider.animatingTo === 0 && slider.vars.animationLoop) {          slider.setProps(dimension, "jumpStart");        }      }      slider.animating = false;      slider.currentSlide = slider.animatingTo;      // API: after() animation Callback      slider.vars.after(slider);    }    // SLIDESHOW:    slider.animateSlides = function() {      if (!slider.animating && focused ) slider.flexAnimate(slider.getTarget("next"));    }    // SLIDESHOW:    slider.pause = function() {      clearInterval(slider.animatedSlides);      slider.animatedSlides = null;      slider.playing = false;      // PAUSEPLAY:      if (slider.vars.pausePlay) methods.pausePlay.update("play");      // SYNC:      if (slider.syncExists) methods.sync("pause");    }    // SLIDESHOW:    slider.play = function() {      if (slider.playing) clearInterval(slider.animatedSlides);      slider.animatedSlides = slider.animatedSlides || setInterval(slider.animateSlides, slider.vars.slideshowSpeed);      slider.started = slider.playing = true;      // PAUSEPLAY:      if (slider.vars.pausePlay) methods.pausePlay.update("pause");      // SYNC:      if (slider.syncExists) methods.sync("play");    }    // STOP:    slider.stop = function () {      slider.pause();      slider.stopped = true;    }    slider.canAdvance = function(target, fromNav) {      // ASNAV:      var last = (asNav) ? slider.pagingCount - 1 : slider.last;      return (fromNav) ? true :             (asNav && slider.currentItem === slider.count - 1 && target === 0 && slider.direction === "prev") ? true :             (asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 && slider.direction !== "next") ? false :             (target === slider.currentSlide && !asNav) ? false :             (slider.vars.animationLoop) ? true :             (slider.atEnd && slider.currentSlide === 0 && target === last && slider.direction !== "next") ? false :             (slider.atEnd && slider.currentSlide === last && target === 0 && slider.direction === "next") ? false :             true;    }    slider.getTarget = function(dir) {      slider.direction = dir;      if (dir === "next") {        return (slider.currentSlide === slider.last) ? 0 : slider.currentSlide + 1;      } else {        return (slider.currentSlide === 0) ? slider.last : slider.currentSlide - 1;      }    }    // SLIDE:    slider.setProps = function(pos, special, dur) {      var target = (function() {        var posCheck = (pos) ? pos : ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo,            posCalc = (function() {              if (carousel) {                return (special === "setTouch") ? pos :                       (reverse && slider.animatingTo === slider.last) ? 0 :                       (reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) :                       (slider.animatingTo === slider.last) ? slider.limit : posCheck;              } else {                switch (special) {                  case "setTotal": return (reverse) ? ((slider.count - 1) - slider.currentSlide + slider.cloneOffset) * pos : (slider.currentSlide + slider.cloneOffset) * pos;                  case "setTouch": return (reverse) ? pos : pos;                  case "jumpEnd": return (reverse) ? pos : slider.count * pos;                  case "jumpStart": return (reverse) ? slider.count * pos : pos;                  default: return pos;                }              }            }());            return (posCalc * -1) + "px";          }());      if (slider.transitions) {        target = (vertical) ? "translate3d(0," + target + ",0)" : "translate3d(" + target + ",0,0)";        dur = (dur !== undefined) ? (dur/1000) + "s" : "0s";        slider.container.css("-" + slider.pfx + "-transition-duration", dur);      }      slider.args[slider.prop] = target;      if (slider.transitions || dur === undefined) slider.container.css(slider.args);    }    slider.setup = function(type) {      // SLIDE:      if (!fade) {        var sliderOffset, arr;        if (type === "init") {          slider.viewport = $('<div class="' + namespace + 'viewport"></div>').css({"overflow": "hidden", "position": "relative"}).appendTo(slider).append(slider.container);          // INFINITE LOOP:          slider.cloneCount = 0;          slider.cloneOffset = 0;          // REVERSE:          if (reverse) {            arr = $.makeArray(slider.slides).reverse();            slider.slides = $(arr);            slider.container.empty().append(slider.slides);          }        }        // INFINITE LOOP && !CAROUSEL:        if (slider.vars.animationLoop && !carousel) {          slider.cloneCount = 2;          slider.cloneOffset = 1;          // clear out old clones          if (type !== "init") slider.container.find('.clone').remove();          slider.container.append(slider.slides.first().clone().addClass('clone').attr('aria-hidden', 'true')).prepend(slider.slides.last().clone().addClass('clone').attr('aria-hidden', 'true'));        }        slider.newSlides = $(slider.vars.selector, slider);        sliderOffset = (reverse) ? slider.count - 1 - slider.currentSlide + slider.cloneOffset : slider.currentSlide + slider.cloneOffset;        // VERTICAL:        if (vertical && !carousel) {          slider.container.height((slider.count + slider.cloneCount) * 200 + "%").css("position", "absolute").width("100%");          setTimeout(function(){            slider.newSlides.css({"display": "block"});            slider.doMath();            slider.viewport.height(slider.h);            slider.setProps(sliderOffset * slider.h, "init");          }, (type === "init") ? 100 : 0);        } else {          slider.container.width((slider.count + slider.cloneCount) * 200 + "%");          slider.setProps(sliderOffset * slider.computedW, "init");          setTimeout(function(){            slider.doMath();            slider.newSlides.css({"width": slider.computedW, "float": "left", "display": "block"});            // SMOOTH HEIGHT:            if (slider.vars.smoothHeight) methods.smoothHeight();          }, (type === "init") ? 100 : 0);        }      } else { // FADE:        slider.slides.css({"width": "100%", "float": "left", "marginRight": "-100%", "position": "relative"});        if (type === "init") {          if (!touch) {            //slider.slides.eq(slider.currentSlide).fadeIn(slider.vars.animationSpeed, slider.vars.easing);            slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).animate({"opacity": 1},slider.vars.animationSpeed,slider.vars.easing);          } else {            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});          }        }        // SMOOTH HEIGHT:        if (slider.vars.smoothHeight) methods.smoothHeight();      }      // !CAROUSEL:      // CANDIDATE: active slide      if (!carousel) slider.slides.removeClass(namespace + "active-slide").eq(slider.currentSlide).addClass(namespace + "active-slide");    }    slider.doMath = function() {      var slide = slider.slides.first(),          slideMargin = slider.vars.itemMargin,          minItems = slider.vars.minItems,          maxItems = slider.vars.maxItems;      slider.w = (slider.viewport===undefined) ? slider.width() : slider.viewport.width();      slider.h = slide.height();      slider.boxPadding = slide.outerWidth() - slide.width();      // CAROUSEL:      if (carousel) {        slider.itemT = slider.vars.itemWidth + slideMargin;        slider.minW = (minItems) ? minItems * slider.itemT : slider.w;        slider.maxW = (maxItems) ? (maxItems * slider.itemT) - slideMargin : slider.w;        slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin * (minItems - 1)))/minItems :                       (slider.maxW < slider.w) ? (slider.w - (slideMargin * (maxItems - 1)))/maxItems :                       (slider.vars.itemWidth > slider.w) ? slider.w : slider.vars.itemWidth;        slider.visible = Math.floor(slider.w/(slider.itemW));        slider.move = (slider.vars.move > 0 && slider.vars.move < slider.visible ) ? slider.vars.move : slider.visible;        slider.pagingCount = Math.ceil(((slider.count - slider.visible)/slider.move) + 1);        slider.last =  slider.pagingCount - 1;        slider.limit = (slider.pagingCount === 1) ? 0 :                       (slider.vars.itemWidth > slider.w) ? (slider.itemW * (slider.count - 1)) + (slideMargin * (slider.count - 1)) : ((slider.itemW + slideMargin) * slider.count) - slider.w - slideMargin;      } else {        slider.itemW = slider.w;        slider.pagingCount = slider.count;        slider.last = slider.count - 1;      }      slider.computedW = slider.itemW - slider.boxPadding;    }    slider.update = function(pos, action) {      slider.doMath();      // update currentSlide and slider.animatingTo if necessary      if (!carousel) {        if (pos < slider.currentSlide) {          slider.currentSlide += 1;        } else if (pos <= slider.currentSlide && pos !== 0) {          slider.currentSlide -= 1;        }        slider.animatingTo = slider.currentSlide;      }      // update controlNav      if (slider.vars.controlNav && !slider.manualControls) {        if ((action === "add" && !carousel) || slider.pagingCount > slider.controlNav.length) {          methods.controlNav.update("add");        } else if ((action === "remove" && !carousel) || slider.pagingCount < slider.controlNav.length) {          if (carousel && slider.currentSlide > slider.last) {            slider.currentSlide -= 1;            slider.animatingTo -= 1;          }          methods.controlNav.update("remove", slider.last);        }      }      // update directionNav      if (slider.vars.directionNav) methods.directionNav.update();    }    slider.addSlide = function(obj, pos) {      var $obj = $(obj);      slider.count += 1;      slider.last = slider.count - 1;      // append new slide      if (vertical && reverse) {        (pos !== undefined) ? slider.slides.eq(slider.count - pos).after($obj) : slider.container.prepend($obj);      } else {        (pos !== undefined) ? slider.slides.eq(pos).before($obj) : slider.container.append($obj);      }      // update currentSlide, animatingTo, controlNav, and directionNav      slider.update(pos, "add");      // update slider.slides      slider.slides = $(slider.vars.selector + ':not(.clone)', slider);      // re-setup the slider to accomdate new slide      slider.setup();      //FlexSlider: added() Callback      slider.vars.added(slider);    }    slider.removeSlide = function(obj) {      var pos = (isNaN(obj)) ? slider.slides.index($(obj)) : obj;      // update count      slider.count -= 1;      slider.last = slider.count - 1;      // remove slide      if (isNaN(obj)) {        $(obj, slider.slides).remove();      } else {        (vertical && reverse) ? slider.slides.eq(slider.last).remove() : slider.slides.eq(obj).remove();      }      // update currentSlide, animatingTo, controlNav, and directionNav      slider.doMath();      slider.update(pos, "remove");      // update slider.slides      slider.slides = $(slider.vars.selector + ':not(.clone)', slider);      // re-setup the slider to accomdate new slide      slider.setup();      // FlexSlider: removed() Callback      slider.vars.removed(slider);    }    //FlexSlider: Initialize    methods.init();  }  // Ensure the slider isn't focussed if the window loses focus.  $( window ).blur( function ( e ) {    focused = false;  }).focus( function ( e ) {    focused = true;  });  //FlexSlider: Default Settings  $.flexslider.defaults = {    namespace: "flex-",             //{NEW} String: Prefix string attached to the class of every element generated by the plugin    selector: ".slides > li",       //{NEW} Selector: Must match a simple pattern. '{container} > {slide}' -- Ignore pattern at your own peril    animation: "fade",              //String: Select your animation type, "fade" or "slide"    easing: "swing",                //{NEW} String: Determines the easing method used in jQuery transitions. jQuery easing plugin is supported!    direction: "horizontal",        //String: Select the sliding direction, "horizontal" or "vertical"    reverse: false,                 //{NEW} Boolean: Reverse the animation direction    animationLoop: true,            //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end    smoothHeight: false,            //{NEW} Boolean: Allow height of the slider to animate smoothly in horizontal mode    startAt: 0,                     //Integer: The slide that the slider should start on. Array notation (0 = first slide)    slideshow: true,                //Boolean: Animate slider automatically    slideshowSpeed: 7000,           //Integer: Set the speed of the slideshow cycling, in milliseconds    animationSpeed: 600,            //Integer: Set the speed of animations, in milliseconds    initDelay: 0,                   //{NEW} Integer: Set an initialization delay, in milliseconds    randomize: false,               //Boolean: Randomize slide order    thumbCaptions: false,           //Boolean: Whether or not to put captions on thumbnails when using the "thumbnails" controlNav.    // Usability features    pauseOnAction: true,            //Boolean: Pause the slideshow when interacting with control elements, highly recommended.    pauseOnHover: false,            //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering    pauseInvisible: true,   		//{NEW} Boolean: Pause the slideshow when tab is invisible, resume when visible. Provides better UX, lower CPU usage.    useCSS: true,                   //{NEW} Boolean: Slider will use CSS3 transitions if available    touch: true,                    //{NEW} Boolean: Allow touch swipe navigation of the slider on touch-enabled devices    video: false,                   //{NEW} Boolean: If using video in the slider, will prevent CSS3 3D Transforms to avoid graphical glitches    // Primary Controls    controlNav: true,               //Boolean: Create navigation for paging control of each clide? Note: Leave true for manualControls usage    directionNav: true,             //Boolean: Create navigation for previous/next navigation? (true/false)    prevText: "Previous",           //String: Set the text for the "previous" directionNav item    nextText: "Next",               //String: Set the text for the "next" directionNav item    // Secondary Navigation    keyboard: true,                 //Boolean: Allow slider navigating via keyboard left/right keys    multipleKeyboard: false,        //{NEW} Boolean: Allow keyboard navigation to affect multiple sliders. Default behavior cuts out keyboard navigation with more than one slider present.    mousewheel: false,              //{UPDATED} Boolean: Requires jquery.mousewheel.js (https://github.com/brandonaaron/jquery-mousewheel) - Allows slider navigating via mousewheel    pausePlay: false,               //Boolean: Create pause/play dynamic element    pauseText: "Pause",             //String: Set the text for the "pause" pausePlay item    playText: "Play",               //String: Set the text for the "play" pausePlay item    // Special properties    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.    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.    sync: "",                       //{NEW} Selector: Mirror the actions performed on this slider with another slider. Use with care.    asNavFor: "",                   //{NEW} Selector: Internal property exposed for turning the slider into a thumbnail navigation for another slider    // Carousel Options    itemWidth: 0,                   //{NEW} Integer: Box-model width of individual carousel items, including horizontal borders and padding.    itemMargin: 0,                  //{NEW} Integer: Margin between carousel items.    minItems: 1,                    //{NEW} Integer: Minimum number of carousel items that should be visible. Items will resize fluidly when below this.    maxItems: 0,                    //{NEW} Integer: Maxmimum number of carousel items that should be visible. Items will resize fluidly when above this limit.    move: 0,                        //{NEW} Integer: Number of carousel items that should move on animation. If 0, slider will move all visible items.    allowOneSlide: true,           //{NEW} Boolean: Whether or not to allow a slider comprised of a single slide    // Callback API    start: function(){},            //Callback: function(slider) - Fires when the slider loads the first slide    before: function(){},           //Callback: function(slider) - Fires asynchronously with each slider animation    after: function(){},            //Callback: function(slider) - Fires after each slider animation completes    end: function(){},              //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous)    added: function(){},            //{NEW} Callback: function(slider) - Fires after a slide is added    removed: function(){}           //{NEW} Callback: function(slider) - Fires after a slide is removed  }  //FlexSlider: Plugin Function  $.fn.flexslider = function(options) {    if (options === undefined) options = {};    if (typeof options === "object") {      return this.each(function() {        var $this = $(this),            selector = (options.selector) ? options.selector : ".slides > li",            $slides = $this.find(selector);      if ( ( $slides.length === 1 && options.allowOneSlide === true ) || $slides.length === 0 ) {          $slides.fadeIn(400);          if (options.start) options.start($this);        } else if ($this.data('flexslider') === undefined) {          new $.flexslider(this, options);        }      });    } else {      // Helper strings to quickly perform functions on the slider      var $slider = $(this).data('flexslider');      switch (options) {        case "play": $slider.play(); break;        case "pause": $slider.pause(); break;        case "stop": $slider.stop(); break;        case "next": $slider.flexAnimate($slider.getTarget("next"), true); break;        case "prev":        case "previous": $slider.flexAnimate($slider.getTarget("prev"), true); break;        default: if (typeof options === "number") $slider.flexAnimate(options, true);      }    }  }})(jQuery);
 |