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