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