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