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