vendor: 4,433 bytes, lines 1-107
1/* 2 * jQuery FlexSlider v2.2.2 3 * http://www.woothemes.com/flexslider/ 4 * 5 * Copyright 2012 WooThemes 6 * Free to use under the GPLv2 license. 7 * http://www.gnu.org/licenses/gpl-2.0.html 8 * 9 * Contributing author: Tyler Smith (@mbmufffin) 10 */ 11 12; 13(function ($) { 14 15 //FlexSlider: Object Instance 16 $.flexslider = function(el, options) { 17 var slider = $(el); 18 19 // making variables public 20 slider.vars = $.extend({}, $.flexslider.defaults, options); 21 22 var namespace = slider.vars.namespace, 23 msGesture = window.navigator && window.navigator.msPointerEnabled && window.MSGesture, 24 touch = (( "ontouchstart" in window ) || msGesture || window.DocumentTouch && document instanceof DocumentTouch) && slider.vars.touch, 25 // depricating this idea, as devices are being released with both of these events 26 //eventType = (touch) ? "touchend" : "click", 27 eventType = "click touchend MSPointerUp", 28 watchedEvent = "", 29 watchedEventClearTimer, 30 vertical = slider.vars.direction === "vertical", 31 reverse = slider.vars.reverse, 32 carousel = (slider.vars.itemWidth > 0), 33 fade = slider.vars.animation === "fade", 34 asNav = slider.vars.asNavFor !== "", 35 methods = {}, 36 focused = true; 37 38 // Store a reference to the slider object 39 $.data(el, "flexslider", slider); 40 41 // Private slider methods 42 methods = { 43 init: function() { 44 slider.animating = false; 45 // Get current slide and make sure it is a number 46 slider.currentSlide = parseInt( ( slider.vars.startAt ? slider.vars.startAt : 0), 10 ); 47 if ( isNaN( slider.currentSlide ) ) slider.currentSlide = 0; 48 slider.animatingTo = slider.currentSlide; 49 slider.atEnd = (slider.currentSlide === 0 || slider.currentSlide === slider.last); 50 slider.containerSelector = slider.vars.selector.substr(0,slider.vars.selector.search(' ')); 51 slider.slides = $(slider.vars.selector, slider); 52 slider.container = $(slider.containerSelector, slider); 53 slider.count = slider.slides.length; 54 // SYNC: 55 slider.syncExists = $(slider.vars.sync).length > 0; 56 // SLIDE: 57 if (slider.vars.animation === "slide") slider.vars.animation = "swing"; 58 slider.prop = (vertical) ? "top" : "marginLeft"; 59 slider.args = {}; 60 // SLIDESHOW: 61 slider.manualPause = false; 62 slider.stopped = false; 63 //PAUSE WHEN INVISIBLE 64 slider.started = false; 65 slider.startTimeout = null; 66 // TOUCH/USECSS: 67 slider.transitions = !slider.vars.video && !fade && slider.vars.useCSS && (function() { 68 var obj = document.createElement('div'), 69 props = ['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective']; 70 for (var i in props) { 71 if ( obj.style[ props[i] ] !== undefined ) { 72 slider.pfx = props[i].replace('Perspective','').toLowerCase(); 73 slider.prop = "-" + slider.pfx + "-transform"; 74 return true; 75 } 76 } 77 return false; 78 }()); 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) {
vendor: 38,525 bytes, lines 205-1071
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 el.addEventListener('touchstart', onTouchStart, false); 404 405 function onTouchStart(e) { 406 if (slider.animating) { 407 e.preventDefault(); 408 } else if ( ( window.navigator.msPointerEnabled ) || e.touches.length === 1 ) { 409 slider.pause(); 410 // CAROUSEL: 411 cwidth = (vertical) ? slider.h : slider. w; 412 startT = Number(new Date()); 413 // CAROUSEL: 414 415 // Local vars for X and Y points. 416 localX = e.touches[0].pageX; 417 localY = e.touches[0].pageY; 418 419 offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 : 420 (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) : 421 (carousel && slider.currentSlide === slider.last) ? slider.limit : 422 (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide : 423 (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth; 424 startX = (vertical) ? localY : localX; 425 startY = (vertical) ? localX : localY; 426 427 el.addEventListener('touchmove', onTouchMove, false); 428 el.addEventListener('touchend', onTouchEnd, false); 429 } 430 } 431 432 function onTouchMove(e) { 433 // Local vars for X and Y points. 434 435 localX = e.touches[0].pageX; 436 localY = e.touches[0].pageY; 437 438 dx = (vertical) ? startX - localY : startX - localX; 439 scrolling = (vertical) ? (Math.abs(dx) < Math.abs(localX - startY)) : (Math.abs(dx) < Math.abs(localY - startY)); 440 441 var fxms = 500; 442 443 if ( ! scrolling || Number( new Date() ) - startT > fxms ) { 444 e.preventDefault(); 445 if (!fade && slider.transitions) { 446 if (!slider.vars.animationLoop) { 447 dx = dx/((slider.currentSlide === 0 && dx < 0 || slider.currentSlide === slider.last && dx > 0) ? (Math.abs(dx)/cwidth+2) : 1); 448 } 449 slider.setProps(offset + dx, "setTouch"); 450 } 451 } 452 } 453 454 function onTouchEnd(e) { 455 // finish the touch by undoing the touch session 456 el.removeEventListener('touchmove', onTouchMove, false); 457 458 if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) { 459 var updateDx = (reverse) ? -dx : dx, 460 target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev'); 461 462 if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) { 463 slider.flexAnimate(target, slider.vars.pauseOnAction); 464 } else { 465 if (!fade) slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true); 466 } 467 } 468 el.removeEventListener('touchend', onTouchEnd, false); 469 470 startX = null; 471 startY = null; 472 dx = null; 473 offset = null; 474 } 475 }else{ 476 el.style.msTouchAction = "none"; 477 el._gesture = new MSGesture(); 478 el._gesture.target = el; 479 el.addEventListener("MSPointerDown", onMSPointerDown, false); 480 el._slider = slider; 481 el.addEventListener("MSGestureChange", onMSGestureChange, false); 482 el.addEventListener("MSGestureEnd", onMSGestureEnd, false); 483 484 function onMSPointerDown(e){ 485 e.stopPropagation(); 486 if (slider.animating) { 487 e.preventDefault(); 488 }else{ 489 slider.pause(); 490 el._gesture.addPointer(e.pointerId); 491 accDx = 0; 492 cwidth = (vertical) ? slider.h : slider. w; 493 startT = Number(new Date()); 494 // CAROUSEL: 495 496 offset = (carousel && reverse && slider.animatingTo === slider.last) ? 0 : 497 (carousel && reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) : 498 (carousel && slider.currentSlide === slider.last) ? slider.limit : 499 (carousel) ? ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.currentSlide : 500 (reverse) ? (slider.last - slider.currentSlide + slider.cloneOffset) * cwidth : (slider.currentSlide + slider.cloneOffset) * cwidth; 501 } 502 } 503 504 function onMSGestureChange(e) { 505 e.stopPropagation(); 506 var slider = e.target._slider; 507 if(!slider){ 508 return; 509 } 510 var transX = -e.translationX, 511 transY = -e.translationY; 512 513 //Accumulate translations. 514 accDx = accDx + ((vertical) ? transY : transX); 515 dx = accDx; 516 scrolling = (vertical) ? (Math.abs(accDx) < Math.abs(-transX)) : (Math.abs(accDx) < Math.abs(-transY)); 517 518 if(e.detail === e.MSGESTURE_FLAG_INERTIA){ 519 setImmediate(function (){ 520 el._gesture.stop(); 521 }); 522 523 return; 524 } 525 526 if (!scrolling || Number(new Date()) - startT > 500) { 527 e.preventDefault(); 528 if (!fade && slider.transitions) { 529 if (!slider.vars.animationLoop) { 530 dx = accDx / ((slider.currentSlide === 0 && accDx < 0 || slider.currentSlide === slider.last && accDx > 0) ? (Math.abs(accDx) / cwidth + 2) : 1); 531 } 532 slider.setProps(offset + dx, "setTouch"); 533 } 534 } 535 } 536 537 function onMSGestureEnd(e) { 538 e.stopPropagation(); 539 var slider = e.target._slider; 540 if(!slider){ 541 return; 542 } 543 if (slider.animatingTo === slider.currentSlide && !scrolling && !(dx === null)) { 544 var updateDx = (reverse) ? -dx : dx, 545 target = (updateDx > 0) ? slider.getTarget('next') : slider.getTarget('prev'); 546 547 if (slider.canAdvance(target) && (Number(new Date()) - startT < 550 && Math.abs(updateDx) > 50 || Math.abs(updateDx) > cwidth/2)) { 548 slider.flexAnimate(target, slider.vars.pauseOnAction); 549 } else { 550 if (!fade) slider.flexAnimate(slider.currentSlide, slider.vars.pauseOnAction, true); 551 } 552 } 553 554 startX = null; 555 startY = null; 556 dx = null; 557 offset = null; 558 accDx = 0; 559 } 560 } 561 }, 562 resize: function() { 563 if (!slider.animating && slider.is(':visible')) { 564 if (!carousel) slider.doMath(); 565 566 if (fade) { 567 // SMOOTH HEIGHT: 568 methods.smoothHeight(); 569 } else if (carousel) { //CAROUSEL: 570 slider.slides.width(slider.computedW); 571 slider.update(slider.pagingCount); 572 slider.setProps(); 573 } 574 else if (vertical) { //VERTICAL: 575 slider.viewport.height(slider.h); 576 slider.setProps(slider.h, "setTotal"); 577 } else { 578 // SMOOTH HEIGHT: 579 if (slider.vars.smoothHeight) methods.smoothHeight(); 580 slider.newSlides.width(slider.computedW); 581 slider.setProps(slider.computedW, "setTotal"); 582 } 583 } 584 }, 585 smoothHeight: function(dur) { 586 if (!vertical || fade) { 587 var $obj = (fade) ? slider : slider.viewport; 588 (dur) ? $obj.animate({"height": slider.slides.eq(slider.animatingTo).height()}, dur) : $obj.height(slider.slides.eq(slider.animatingTo).height()); 589 } 590 }, 591 sync: function(action) { 592 var $obj = $(slider.vars.sync).data("flexslider"), 593 target = slider.animatingTo; 594 595 switch (action) { 596 case "animate": $obj.flexAnimate(target, slider.vars.pauseOnAction, false, true); break; 597 case "play": if (!$obj.playing && !$obj.asNav) { $obj.play(); } break; 598 case "pause": $obj.pause(); break; 599 } 600 }, 601 uniqueID: function($clone) { 602 $clone.find( '[id]' ).each(function() { 603 var $this = $(this); 604 $this.attr( 'id', $this.attr( 'id' ) + '_clone' ); 605 }); 606 return $clone; 607 }, 608 pauseInvisible: { 609 visProp: null, 610 init: function() { 611 var prefixes = ['webkit','moz','ms','o']; 612 613 if ('hidden' in document) return 'hidden'; 614 for (var i = 0; i < prefixes.length; i++) { 615 if ((prefixes[i] + 'Hidden') in document) 616 methods.pauseInvisible.visProp = prefixes[i] + 'Hidden'; 617 } 618 if (methods.pauseInvisible.visProp) { 619 var evtname = methods.pauseInvisible.visProp.replace(/[H|h]idden/,'') + 'visibilitychange'; 620 document.addEventListener(evtname, function() { 621 if (methods.pauseInvisible.isHidden()) { 622 if(slider.startTimeout) clearTimeout(slider.startTimeout); //If clock is ticking, stop timer and prevent from starting while invisible 623 else slider.pause(); //Or just pause 624 } 625 else { 626 if(slider.started) slider.play(); //Initiated before, just play 627 else (slider.vars.initDelay > 0) ? setTimeout(slider.play, slider.vars.initDelay) : slider.play(); //Didn't init before: simply init or wait for it 628 } 629 }); 630 } 631 }, 632 isHidden: function() { 633 return document[methods.pauseInvisible.visProp] || false; 634 } 635 }, 636 setToClearWatchedEvent: function() { 637 clearTimeout(watchedEventClearTimer); 638 watchedEventClearTimer = setTimeout(function() { 639 watchedEvent = ""; 640 }, 3000); 641 } 642 }; 643 644 // public methods 645 slider.flexAnimate = function(target, pause, override, withSync, fromNav) { 646 if (!slider.vars.animationLoop && target !== slider.currentSlide) { 647 slider.direction = (target > slider.currentSlide) ? "next" : "prev"; 648 } 649 650 if (asNav && slider.pagingCount === 1) slider.direction = (slider.currentItem < target) ? "next" : "prev"; 651 652 if (!slider.animating && (slider.canAdvance(target, fromNav) || override) && slider.is(":visible")) { 653 if (asNav && withSync) { 654 var master = $(slider.vars.asNavFor).data('flexslider'); 655 slider.atEnd = target === 0 || target === slider.count - 1; 656 master.flexAnimate(target, true, false, true, fromNav); 657 slider.direction = (slider.currentItem < target) ? "next" : "prev"; 658 master.direction = slider.direction; 659 660 if (Math.ceil((target + 1)/slider.visible) - 1 !== slider.currentSlide && target !== 0) { 661 slider.currentItem = target; 662 slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide"); 663 target = Math.floor(target/slider.visible); 664 } else { 665 slider.currentItem = target; 666 slider.slides.removeClass(namespace + "active-slide").eq(target).addClass(namespace + "active-slide"); 667 return false; 668 } 669 } 670 671 slider.animating = true; 672 slider.animatingTo = target; 673 674 // SLIDESHOW: 675 if (pause) slider.pause(); 676 677 // API: before() animation Callback 678 slider.vars.before(slider); 679 680 // SYNC: 681 if (slider.syncExists && !fromNav) methods.sync("animate"); 682 683 // CONTROLNAV 684 if (slider.vars.controlNav) methods.controlNav.active(); 685 686 // !CAROUSEL: 687 // CANDIDATE: slide active class (for add/remove slide) 688 if (!carousel) slider.slides.removeClass(namespace + 'active-slide').eq(target).addClass(namespace + 'active-slide'); 689 690 // INFINITE LOOP: 691 // CANDIDATE: atEnd 692 slider.atEnd = target === 0 || target === slider.last; 693 694 // DIRECTIONNAV: 695 if (slider.vars.directionNav) methods.directionNav.update(); 696 697 if (target === slider.last) { 698 // API: end() of cycle Callback 699 slider.vars.end(slider); 700 // SLIDESHOW && !INFINITE LOOP: 701 if (!slider.vars.animationLoop) slider.pause(); 702 } 703 704 // SLIDE: 705 if (!fade) { 706 var dimension = (vertical) ? slider.slides.filter(':first').height() : slider.computedW, 707 margin, slideString, calcNext; 708 709 // INFINITE LOOP / REVERSE: 710 if (carousel) { 711 //margin = (slider.vars.itemWidth > slider.w) ? slider.vars.itemMargin * 2 : slider.vars.itemMargin; 712 margin = slider.vars.itemMargin; 713 calcNext = ((slider.itemW + margin) * slider.move) * slider.animatingTo; 714 slideString = (calcNext > slider.limit && slider.visible !== 1) ? slider.limit : calcNext; 715 } else if (slider.currentSlide === 0 && target === slider.count - 1 && slider.vars.animationLoop && slider.direction !== "next") { 716 slideString = (reverse) ? (slider.count + slider.cloneOffset) * dimension : 0; 717 } else if (slider.currentSlide === slider.last && target === 0 && slider.vars.animationLoop && slider.direction !== "prev") { 718 slideString = (reverse) ? 0 : (slider.count + 1) * dimension; 719 } else { 720 slideString = (reverse) ? ((slider.count - 1) - target + slider.cloneOffset) * dimension : (target + slider.cloneOffset) * dimension; 721 } 722 slider.setProps(slideString, "", slider.vars.animationSpeed); 723 if (slider.transitions) { 724 if (!slider.vars.animationLoop || !slider.atEnd) { 725 slider.animating = false; 726 slider.currentSlide = slider.animatingTo; 727 } 728 slider.container.unbind("webkitTransitionEnd transitionend"); 729 slider.container.bind("webkitTransitionEnd transitionend", function() { 730 slider.wrapup(dimension); 731 }); 732 } else { 733 slider.container.animate(slider.args, slider.vars.animationSpeed, slider.vars.easing, function(){ 734 slider.wrapup(dimension); 735 }); 736 } 737 } else { // FADE: 738 if (!touch) { 739 //slider.slides.eq(slider.currentSlide).fadeOut(slider.vars.animationSpeed, slider.vars.easing); 740 //slider.slides.eq(target).fadeIn(slider.vars.animationSpeed, slider.vars.easing, slider.wrapup); 741 742 slider.slides.eq(slider.currentSlide).css({"zIndex": 1}).animate({"opacity": 0}, slider.vars.animationSpeed, slider.vars.easing); 743 slider.slides.eq(target).css({"zIndex": 2}).animate({"opacity": 1}, slider.vars.animationSpeed, slider.vars.easing, slider.wrapup); 744 745 } else { 746 slider.slides.eq(slider.currentSlide).css({ "opacity": 0, "zIndex": 1 }); 747 slider.slides.eq(target).css({ "opacity": 1, "zIndex": 2 }); 748 slider.wrapup(dimension); 749 } 750 } 751 // SMOOTH HEIGHT: 752 if (slider.vars.smoothHeight) methods.smoothHeight(slider.vars.animationSpeed); 753 } 754 }; 755 slider.wrapup = function(dimension) { 756 // SLIDE: 757 if (!fade && !carousel) { 758 if (slider.currentSlide === 0 && slider.animatingTo === slider.last && slider.vars.animationLoop) { 759 slider.setProps(dimension, "jumpEnd"); 760 } else if (slider.currentSlide === slider.last && slider.animatingTo === 0 && slider.vars.animationLoop) { 761 slider.setProps(dimension, "jumpStart"); 762 } 763 } 764 slider.animating = false; 765 slider.currentSlide = slider.animatingTo; 766 // API: after() animation Callback 767 slider.vars.after(slider); 768 }; 769 770 // SLIDESHOW: 771 slider.animateSlides = function() { 772 if (!slider.animating && focused ) slider.flexAnimate(slider.getTarget("next")); 773 }; 774 // SLIDESHOW: 775 slider.pause = function() { 776 clearInterval(slider.animatedSlides); 777 slider.animatedSlides = null; 778 slider.playing = false; 779 // PAUSEPLAY: 780 if (slider.vars.pausePlay) methods.pausePlay.update("play"); 781 // SYNC: 782 if (slider.syncExists) methods.sync("pause"); 783 }; 784 // SLIDESHOW: 785 slider.play = function() { 786 if (slider.playing) clearInterval(slider.animatedSlides); 787 slider.animatedSlides = slider.animatedSlides || setInterval(slider.animateSlides, slider.vars.slideshowSpeed); 788 slider.started = slider.playing = true; 789 // PAUSEPLAY: 790 if (slider.vars.pausePlay) methods.pausePlay.update("pause"); 791 // SYNC: 792 if (slider.syncExists) methods.sync("play"); 793 }; 794 // STOP: 795 slider.stop = function () { 796 slider.pause(); 797 slider.stopped = true; 798 }; 799 slider.canAdvance = function(target, fromNav) { 800 // ASNAV: 801 var last = (asNav) ? slider.pagingCount - 1 : slider.last; 802 return (fromNav) ? true : 803 (asNav && slider.currentItem === slider.count - 1 && target === 0 && slider.direction === "prev") ? true : 804 (asNav && slider.currentItem === 0 && target === slider.pagingCount - 1 && slider.direction !== "next") ? false : 805 (target === slider.currentSlide && !asNav) ? false : 806 (slider.vars.animationLoop) ? true : 807 (slider.atEnd && slider.currentSlide === 0 && target === last && slider.direction !== "next") ? false : 808 (slider.atEnd && slider.currentSlide === last && target === 0 && slider.direction === "next") ? false : 809 true; 810 }; 811 slider.getTarget = function(dir) { 812 slider.direction = dir; 813 if (dir === "next") { 814 return (slider.currentSlide === slider.last) ? 0 : slider.currentSlide + 1; 815 } else { 816 return (slider.currentSlide === 0) ? slider.last : slider.currentSlide - 1; 817 } 818 }; 819 820 // SLIDE: 821 slider.setProps = function(pos, special, dur) { 822 var target = (function() { 823 var posCheck = (pos) ? pos : ((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo, 824 posCalc = (function() { 825 if (carousel) { 826 return (special === "setTouch") ? pos : 827 (reverse && slider.animatingTo === slider.last) ? 0 : 828 (reverse) ? slider.limit - (((slider.itemW + slider.vars.itemMargin) * slider.move) * slider.animatingTo) : 829 (slider.animatingTo === slider.last) ? slider.limit : posCheck; 830 } else { 831 switch (special) { 832 case "setTotal": return (reverse) ? ((slider.count - 1) - slider.currentSlide + slider.cloneOffset) * pos : (slider.currentSlide + slider.cloneOffset) * pos; 833 case "setTouch": return (reverse) ? pos : pos; 834 case "jumpEnd": return (reverse) ? pos : slider.count * pos; 835 case "jumpStart": return (reverse) ? slider.count * pos : pos; 836 default: return pos; 837 } 838 } 839 }()); 840 841 return (posCalc * -1) + "px"; 842 }()); 843 844 if (slider.transitions) { 845 target = (vertical) ? "translate3d(0," + target + ",0)" : "translate3d(" + target + ",0,0)"; 846 dur = (dur !== undefined) ? (dur/1000) + "s" : "0s"; 847 slider.container.css("-" + slider.pfx + "-transition-duration", dur); 848 slider.container.css("transition-duration", dur); 849 } 850 851 slider.args[slider.prop] = target; 852 if (slider.transitions || dur === undefined) slider.container.css(slider.args); 853 854 slider.container.css('transform',target); 855 }; 856 857 slider.setup = function(type) { 858 // SLIDE: 859 if (!fade) { 860 var sliderOffset, arr; 861 862 if (type === "init") { 863 slider.viewport = $('<div class="' + namespace + 'viewport"></div>').css({"overflow": "hidden", "position": "relative"}).appendTo(slider).append(slider.container); 864 // INFINITE LOOP: 865 slider.cloneCount = 0; 866 slider.cloneOffset = 0; 867 // REVERSE: 868 if (reverse) { 869 arr = $.makeArray(slider.slides).reverse(); 870 slider.slides = $(arr); 871 slider.container.empty().append(slider.slides); 872 } 873 } 874 // INFINITE LOOP && !CAROUSEL: 875 if (slider.vars.animationLoop && !carousel) { 876 slider.cloneCount = 2; 877 slider.cloneOffset = 1; 878 // clear out old clones 879 if (type !== "init") slider.container.find('.clone').remove(); 880 slider.container.append(slider.slides.first().clone().addClass('clone').attr('aria-hidden', 'true')).prepend(slider.slides.last().clone().addClass('clone').attr('aria-hidden', 'true')); 881 methods.uniqueID( slider.slides.first().clone().addClass('clone') ).appendTo( slider.container ); 882 methods.uniqueID( slider.slides.last().clone().addClass('clone') ).prependTo( slider.container ); 883 } 884 slider.newSlides = $(slider.vars.selector, slider); 885 886 sliderOffset = (reverse) ? slider.count - 1 - slider.currentSlide + slider.cloneOffset : slider.currentSlide + slider.cloneOffset; 887 // VERTICAL: 888 if (vertical && !carousel) { 889 slider.container.height((slider.count + slider.cloneCount) * 200 + "%").css("position", "absolute").width("100%"); 890 setTimeout(function(){ 891 slider.newSlides.css({"display": "block"}); 892 slider.doMath(); 893 slider.viewport.height(slider.h); 894 slider.setProps(sliderOffset * slider.h, "init"); 895 }, (type === "init") ? 100 : 0); 896 } else { 897 slider.container.width((slider.count + slider.cloneCount) * 200 + "%"); 898 slider.setProps(sliderOffset * slider.computedW, "init"); 899 setTimeout(function(){ 900 slider.doMath(); 901 slider.newSlides.css({"width": slider.computedW, "float": "left", "display": "block"}); 902 // SMOOTH HEIGHT: 903 if (slider.vars.smoothHeight) methods.smoothHeight(); 904 }, (type === "init") ? 100 : 0); 905 } 906 } else { // FADE: 907 slider.slides.css({"width": "100%", "float": "left", "marginRight": "-100%", "position": "relative"}); 908 if (type === "init") { 909 if (!touch) { 910 //slider.slides.eq(slider.currentSlide).fadeIn(slider.vars.animationSpeed, slider.vars.easing); 911 slider.slides.css({ "opacity": 0, "display": "block", "zIndex": 1 }).eq(slider.currentSlide).css({"zIndex": 2}).animate({"opacity": 1},slider.vars.animationSpeed,slider.vars.easing); 912 } else { 913 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}); 914 } 915 } 916 // SMOOTH HEIGHT: 917 if (slider.vars.smoothHeight) methods.smoothHeight(); 918 } 919 // !CAROUSEL: 920 // CANDIDATE: active slide 921 if (!carousel) slider.slides.removeClass(namespace + "active-slide").eq(slider.currentSlide).addClass(namespace + "active-slide"); 922 923 //FlexSlider: init() Callback 924 slider.vars.init(slider); 925 }; 926 927 slider.doMath = function() { 928 var slide = slider.slides.first(), 929 slideMargin = slider.vars.itemMargin, 930 minItems = slider.vars.minItems, 931 maxItems = slider.vars.maxItems; 932 933 slider.w = (slider.viewport===undefined) ? slider.width() : slider.viewport.width(); 934 slider.h = slide.height(); 935 slider.boxPadding = slide.outerWidth() - slide.width(); 936 937 // CAROUSEL: 938 if (carousel) { 939 slider.itemT = slider.vars.itemWidth + slideMargin; 940 slider.minW = (minItems) ? minItems * slider.itemT : slider.w; 941 slider.maxW = (maxItems) ? (maxItems * slider.itemT) - slideMargin : slider.w; 942 slider.itemW = (slider.minW > slider.w) ? (slider.w - (slideMargin * (minItems - 1)))/minItems : 943 (slider.maxW < slider.w) ? (slider.w - (slideMargin * (maxItems - 1)))/maxItems : 944 (slider.vars.itemWidth > slider.w) ? slider.w : slider.vars.itemWidth; 945 946 slider.visible = Math.floor(slider.w/(slider.itemW)); 947 slider.move = (slider.vars.move > 0 && slider.vars.move < slider.visible ) ? slider.vars.move : slider.visible; 948 slider.pagingCount = Math.ceil(((slider.count - slider.visible)/slider.move) + 1); 949 slider.last = slider.pagingCount - 1; 950 slider.limit = (slider.pagingCount === 1) ? 0 : 951 (slider.vars.itemWidth > slider.w) ? (slider.itemW * (slider.count - 1)) + (slideMargin * (slider.count - 1)) : ((slider.itemW + slideMargin) * slider.count) - slider.w - slideMargin; 952 } else { 953 slider.itemW = slider.w; 954 slider.pagingCount = slider.count; 955 slider.last = slider.count - 1; 956 } 957 slider.computedW = slider.itemW - slider.boxPadding; 958 }; 959 960 slider.update = function(pos, action) { 961 slider.doMath(); 962 963 // update currentSlide and slider.animatingTo if necessary 964 if (!carousel) { 965 if (pos < slider.currentSlide) { 966 slider.currentSlide += 1; 967 } else if (pos <= slider.currentSlide && pos !== 0) { 968 slider.currentSlide -= 1; 969 } 970 slider.animatingTo = slider.currentSlide; 971 } 972 973 // update controlNav 974 if (slider.vars.controlNav && !slider.manualControls) { 975 if ((action === "add" && !carousel) || slider.pagingCount > slider.controlNav.length) { 976 methods.controlNav.update("add"); 977 } else if ((action === "remove" && !carousel) || slider.pagingCount < slider.controlNav.length) { 978 if (carousel && slider.currentSlide > slider.last) { 979 slider.currentSlide -= 1; 980 slider.animatingTo -= 1; 981 } 982 methods.controlNav.update("remove", slider.last); 983 } 984 } 985 // update directionNav 986 if (slider.vars.directionNav) methods.directionNav.update(); 987 988 }; 989 990 slider.addSlide = function(obj, pos) { 991 var $obj = $(obj); 992 993 slider.count += 1; 994 slider.last = slider.count - 1; 995 996 // append new slide 997 if (vertical && reverse) { 998 (pos !== undefined) ? slider.slides.eq(slider.count - pos).after($obj) : slider.container.prepend($obj); 999 } else { 1000 (pos !== undefined) ? slider.slides.eq(pos).before($obj) : slider.container.append($obj); 1001 } 1002 1003 // update currentSlide, animatingTo, controlNav, and directionNav 1004 slider.update(pos, "add"); 1005 1006 // update slider.slides 1007 slider.slides = $(slider.vars.selector + ':not(.clone)', slider); 1008 // re-setup the slider to accomdate new slide 1009 slider.setup(); 1010 1011 //FlexSlider: added() Callback 1012 slider.vars.added(slider); 1013 }; 1014 slider.removeSlide = function(obj) { 1015 var pos = (isNaN(obj)) ? slider.slides.index($(obj)) : obj; 1016 1017 // update count 1018 slider.count -= 1; 1019 slider.last = slider.count - 1; 1020 1021 // remove slide 1022 if (isNaN(obj)) { 1023 $(obj, slider.slides).remove(); 1024 } else { 1025 (vertical && reverse) ? slider.slides.eq(slider.last).remove() : slider.slides.eq(obj).remove(); 1026 } 1027 1028 // update currentSlide, animatingTo, controlNav, and directionNav 1029 slider.doMath(); 1030 slider.update(pos, "remove"); 1031 1032 // update slider.slides 1033 slider.slides = $(slider.vars.selector + ':not(.clone)', slider); 1034 // re-setup the slider to accomdate new slide 1035 slider.setup(); 1036 1037 // FlexSlider: removed() Callback 1038 slider.vars.removed(slider); 1039 }; 1040 1041 //FlexSlider: Initialize 1042 methods.init(); 1043 }; 1044 1045 // Ensure the slider isn't focussed if the window loses focus. 1046 $( window ).blur( function ( e ) { 1047 focused = false; 1048 }).focus( function ( e ) { 1049 focused = true; 1050 }); 1051 1052 //FlexSlider: Default Settings 1053 $.flexslider.defaults = { 1054 namespace: "flex-", //{NEW} String: Prefix string attached to the class of every element generated by the plugin 1055 selector: ".slides > li", //{NEW} Selector: Must match a simple pattern. '{container} > {slide}' -- Ignore pattern at your own peril 1056 animation: "fade", //String: Select your animation type, "fade" or "slide" 1057 easing: "swing", //{NEW} String: Determines the easing method used in jQuery transitions. jQuery easing plugin is supported! 1058 direction: "horizontal", //String: Select the sliding direction, "horizontal" or "vertical" 1059 reverse: false, //{NEW} Boolean: Reverse the animation direction 1060 animationLoop: true, //Boolean: Should the animation loop? If false, directionNav will received "disable" classes at either end 1061 smoothHeight: false, //{NEW} Boolean: Allow height of the slider to animate smoothly in horizontal mode 1062 startAt: 0, //Integer: The slide that the slider should start on. Array notation (0 = first slide) 1063 slideshow: true, //Boolean: Animate slider automatically 1064 slideshowSpeed: 7000, //Integer: Set the speed of the slideshow cycling, in milliseconds 1065 animationSpeed: 600, //Integer: Set the speed of animations, in milliseconds 1066 initDelay: 0, //{NEW} Integer: Set an initialization delay, in milliseconds 1067 randomize: false, //Boolean: Randomize slide order 1068 thumbCaptions: false, //Boolean: Whether or not to put captions on thumbnails when using the "thumbnails" controlNav. 1069 1070 // Usability features 1071 pauseOnAction: true, //Boolean: Pause the slideshow when interacting with control elements, highly recommended.
1072 pauseOnHover: false, //Boolean: Pause the slideshow when hovering over slider, then resume when no longer hovering 1073 pauseInvisible: true, //{NEW} Boolean: Pause the slideshow when tab is invisible, resume when visible. Provides better UX, lower CPU usage. 1074 useCSS: true, //{NEW} Boolean: Slider will use CSS3 transitions if available 1075 touch: true, //{NEW} Boolean: Allow touch swipe navigation of the slider on touch-enabled devices 1076 video: false, //{NEW} Boolean: If using video in the slider, will prevent CSS3 3D Transforms to avoid graphical glitches 1077 1078 // Primary Controls 1079 controlNav: true, //Boolean: Create navigation for paging control of each clide? Note: Leave true for manualControls usage 1080 directionNav: true, //Boolean: Create navigation for previous/next navigation? (true/false) 1081 prevText: "Previous", //String: Set the text for the "previous" directionNav item 1082 nextText: "Next", //String: Set the text for the "next" directionNav item 1083 1084 // Secondary Navigation 1085 keyboard: true, //Boolean: Allow slider navigating via keyboard left/right keys 1086 multipleKeyboard: false, //{NEW} Boolean: Allow keyboard navigation to affect multiple sliders. Default behavior cuts out keyboard navigation with more than one slider present. 1087 mousewheel: false, //{UPDATED} Boolean: Requires jquery.mousewheel.js (https://github.com/brandonaaron/jquery-mousewheel) - Allows slider navigating via mousewheel 1088 pausePlay: false, //Boolean: Create pause/play dynamic element 1089 pauseText: "Pause", //String: Set the text for the "pause" pausePlay item 1090 playText: "Play", //String: Set the text for the "play" pausePlay item 1091 1092 // Special properties 1093 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. 1094 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. 1095 sync: "", //{NEW} Selector: Mirror the actions performed on this slider with another slider. Use with care. 1096 asNavFor: "", //{NEW} Selector: Internal property exposed for turning the slider into a thumbnail navigation for another slider 1097 1098 // Carousel Options 1099 itemWidth: 0, //{NEW} Integer: Box-model width of individual carousel items, including horizontal borders and padding. 1100 itemMargin: 0, //{NEW} Integer: Margin between carousel items. 1101 minItems: 1, //{NEW} Integer: Minimum number of carousel items that should be visible. Items will resize fluidly when below this. 1102 maxItems: 0, //{NEW} Integer: Maxmimum number of carousel items that should be visible. Items will resize fluidly when above this limit. 1103 move: 0, //{NEW} Integer: Number of carousel items that should move on animation. If 0, slider will move all visible items. 1104 allowOneSlide: true, //{NEW} Boolean: Whether or not to allow a slider comprised of a single slide 1105 1106 // Callback API 1107 start: function(){}, //Callback: function(slider) - Fires when the slider loads the first slide 1108 before: function(){}, //Callback: function(slider) - Fires asynchronously with each slider animation 1109 after: function(){}, //Callback: function(slider) - Fires after each slider animation completes 1110 end: function(){}, //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous) 1111 added: function(){}, //{NEW} Callback: function(slider) - Fires after a slide is added 1112 removed: function(){}, //{NEW} Callback: function(slider) - Fires after a slide is removed 1113 init: function() {} //{NEW}
1113 Callback: function(slider) - Fires after the slider is initially setup 1114 }; 1115 1116 //FlexSlider: Plugin Function 1117 $.fn.flexslider = function(options) { 1118 if (options === undefined) options = {}; 1119 1120 if (typeof options === "object") { 1121 return this.each(function() { 1122 var $this = $(this), 1123 selector = (options.selector) ? options.selector : ".slides > li", 1124 $slides = $this.find(selector); 1125 1126 if ( ( $slides.length === 1 && options.allowOneSlide === true ) || $slides.length === 0 ) { 1127 $slides.fadeIn(400); 1128 if (options.start) options.start($this); 1129 } else if ($this.data('flexslider') === undefined) { 1130 new $.flexslider(this, options); 1131 } 1132 }); 1133 } else { 1134 // Helper strings to quickly perform functions on the slider 1135 var $slider = $(this).data('flexslider'); 1136 switch (options) { 1137 case "play": $slider.play(); break; 1138 case "pause": $slider.pause(); break; 1139 case "stop": $slider.stop(); break; 1140 case "next": $slider.flexAnimate($slider.getTarget("next"), true); break; 1141 case "prev": 1142 case "previous": $slider.flexAnimate($slider.getTarget("prev"), true); break; 1143 default: if (typeof options === "number") $slider.flexAnimate(options, true); 1144 } 1145 } 1146 }; 1147})(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.