1/*! 2* jQuery Cycle2; version: 2.1.5 build: 20140415 3* http://jquery.malsup.com/cycle2/ 4* Copyright (c) 2014 M. Alsup; Dual licensed: MIT/GPL 5*/ 6 7/* Cycle2 core engine */ 8;(function($) { 9"use strict"; 10 11var version = '2.1.5'; 12 13$.fn.cycle = function( options ) { 14 // fix mistakes with the ready state 15 var o; 16 if ( this.length === 0 && !$.isReady ) { 17 o = { s: this.selector, c: this.context }; 18 $.fn.cycle.log('requeuing slideshow (dom not ready)'); 19 $(function() { 20 $( o.s, o.c ).cycle(options); 21 }); 22 return this; 23 } 24 25 return this.each(function() { 26 var data, opts, shortName, val; 27 var container = $(this); 28 var log = $.fn.cycle.log; 29 30 if ( container.data('cycle.opts') ) 31 return; // already initialized 32 33 if ( container.data('cycle-log') === false || 34 ( options && options.log === false ) || 35 ( opts && opts.log === false) ) { 36 log = $.noop; 37 } 38 39 log('--c2 init--'); 40 data = container.data(); 41 for (var p in data) { 42 // allow props to be accessed sans 'cycle' prefix and log the overrides 43 if (data.hasOwnProperty(p) && /^cycle[A-Z]+/.test(p) ) { 44 val = data[p]; 45 shortName = p.match(/^cycle(.*)/)[1].replace(/^[A-Z]/, lowerCase); 46 log(shortName+':', val, '('+typeof val +')'); 47 data[shortName] = val; 48 } 49 } 50 51 opts = $.extend( {}, $.fn.cycle.defaults, data, options || {}); 52 53 opts.timeoutId = 0; 54 opts.paused = opts.paused || false; // #57 55 opts.container = container; 56 opts._maxZ = opts.maxZ; 57 58 opts.API = $.extend ( { _container: container }, $.fn.cycle.API ); 59 opts.API.log = log; 60 opts.API.trigger = function( eventName, args ) { 61 opts.container.trigger( eventName, args ); 62 return opts.API; 63 }; 64 65 container.data( 'cycle.opts', opts ); 66 container.data( 'cycle.API', opts.API ); 67 68 // opportunity for plugins to modify opts and API 69 opts.API.trigger('cycle-bootstrap', [ opts, opts.API ]); 70 71 opts.API.addInitialSlides(); 72 opts.API.preInitSlideshow(); 73 74 if ( opts.slides.length ) 75 opts.API.initSlideshow(); 76 }); 77}; 78 79$.fn.cycle.API = { 80 opts: function() { 81 return this._container.data( 'cycle.opts' ); 82 }, 83 addInitialSlides: function() { 84 var opts = this.opts(); 85 var slides = opts.slides; 86 opts.slideCount = 0; 87 opts.slides = $(); // empty set 88 89 // add slides that already exist 90 slides = slides.jquery ? slides : opts.container.find( slides ); 91 92 if ( opts.random ) { 93 slides.sort(function() {return Math.random() - 0.5;}); 94 } 95 96 opts.API.add( slides ); 97 }, 98 99 preInitSlideshow: function() { 100 var opts = this.opts(); 101 opts.API.trigger('cycle-pre-initialize', [ opts ]); 102 var tx = $.fn.cycle.transitions[opts.fx]; 103 if (tx && $.isFunction(tx.preInit)) 104 tx.preInit( opts ); 105 opts._preInitialized = true; 106 }, 107 108 postInitSlideshow: function() { 109 var opts = this.opts(); 110 opts.API.trigger('cycle-post-initialize', [ opts ]); 111 var tx = $.fn.cycle.transitions[opts.fx]; 112 if (tx && $.isFunction(tx.postInit)) 113 tx.postInit( opts ); 114 }, 115 116 initSlideshow: function() { 117 var opts = this.opts(); 118 var pauseObj = opts.container; 119 var slideOpts; 120 opts.API.calcFirstSlide(); 121 122 if ( opts.container.css('position') == 'static' ) 123 opts.container.css('position', 'relative'); 124 125 $(opts.slides[opts.currSlide]).css({ 126 opacity: 1, 127 display: 'block', 128 visibility: 'visible' 129 }); 130 opts.API.stackSlides( opts.slides[opts.currSlide], opts.slides[opts.nextSlide], !opts.reverse ); 131 132 if ( opts.pauseOnHover ) { 133 // allow pauseOnHover to specify an element 134 if ( opts.pauseOnHover !== true ) 135 pauseObj = $( opts.pauseOnHover ); 136 137 pauseObj.hover( 138 function(){ opts.API.pause( true ); }, 139 function(){ opts.API.resume( true ); } 140 ); 141 } 142 143 // stage initial transition 144 if ( opts.timeout ) {
145 slideOpts = opts.API.getSlideOpts( opts.currSlide ); 146 opts.API.queueTransition( slideOpts, slideOpts.timeout + opts.delay ); 147 } 148 149 opts._initialized = true; 150 opts.API.updateView( true ); 151 opts.API.trigger('cycle-initialized', [ opts ]); 152 opts.API.postInitSlideshow(); 153 }, 154 155 pause: function( hover ) { 156 var opts = this.opts(), 157 slideOpts = opts.API.getSlideOpts(), 158 alreadyPaused = opts.hoverPaused || opts.paused; 159 160 if ( hover ) 161 opts.hoverPaused = true; 162 else 163 opts.paused = true; 164 165 if ( ! alreadyPaused ) { 166 opts.container.addClass('cycle-paused'); 167 opts.API.trigger('cycle-paused', [ opts ]).log('cycle-paused'); 168 169 if ( slideOpts.timeout ) { 170 clearTimeout( opts.timeoutId ); 171 opts.timeoutId = 0; 172 173 // determine how much time is left for the current slide 174 opts._remainingTimeout -= ( $.now() - opts._lastQueue ); 175 if ( opts._remainingTimeout < 0 || isNaN(opts._remainingTimeout) ) 176 opts._remainingTimeout = undefined; 177 } 178 } 179 }, 180 181 resume: function( hover ) { 182 var opts = this.opts(), 183 alreadyResumed = !opts.hoverPaused && !opts.paused, 184 remaining; 185 186 if ( hover ) 187 opts.hoverPaused = false; 188 else 189 opts.paused = false; 190 191 192 if ( ! alreadyResumed ) { 193 opts.container.removeClass('cycle-paused'); 194 // #gh-230; if an animation is in progress then don't queue a new transition; it will 195 // happen naturally 196 if ( opts.slides.filter(':animated').length === 0 ) 197 opts.API.queueTransition( opts.API.getSlideOpts(), opts._remainingTimeout ); 198 opts.API.trigger('cycle-resumed', [ opts, opts._remainingTimeout ] ).log('cycle-resumed'); 199 } 200 }, 201 202 add: function( slides, prepend ) { 203 var opts = this.opts(); 204 var oldSlideCount = opts.slideCount; 205 var startSlideshow = false; 206 var len; 207 208 if ( $.type(slides) == 'string') 209 slides = $.trim( slides ); 210 211 $( slides ).each(function(i) { 212 var slideOpts; 213 var slide = $(this); 214 215 if ( prepend ) 216 opts.container.prepend( slide ); 217 else 218 opts.container.append( slide ); 219 220 opts.slideCount++; 221 slideOpts = opts.API.buildSlideOpts( slide ); 222 223 if ( prepend ) 224 opts.slides = $( slide ).add( opts.slides ); 225 else 226 opts.slides = opts.slides.add( slide ); 227 228 opts.API.initSlide( slideOpts, slide, --opts._maxZ ); 229 230 slide.data('cycle.opts', slideOpts); 231 opts.API.trigger('cycle-slide-added', [ opts, slideOpts, slide ]); 232 }); 233 234 opts.API.updateView( true ); 235 236 startSlideshow = opts._preInitialized && (oldSlideCount < 2 && opts.slideCount >= 1); 237 if ( startSlideshow ) { 238 if ( !opts._initialized ) 239 opts.API.initSlideshow(); 240 else if ( opts.timeout ) { 241 len = opts.slides.length; 242 opts.nextSlide = opts.reverse ? len - 1 : 1; 243 if ( !opts.timeoutId ) { 244 opts.API.queueTransition( opts ); 245 } 246 } 247 } 248 }, 249 250 calcFirstSlide: function() { 251 var opts = this.opts(); 252 var firstSlideIndex; 253 firstSlideIndex = parseInt( opts.startingSlide || 0, 10 ); 254 if (firstSlideIndex >= opts.slides.length || firstSlideIndex < 0) 255 firstSlideIndex = 0; 256 257 opts.currSlide = firstSlideIndex; 258 if ( opts.reverse ) { 259 opts.nextSlide = firstSlideIndex - 1; 260 if (opts.nextSlide < 0) 261 opts.nextSlide = opts.slides.length - 1; 262 } 263 else { 264 opts.nextSlide = firstSlideIndex + 1; 265 if (opts.nextSlide == opts.slides.length) 266 opts.nextSlide = 0; 267 } 268 }, 269 270 calcNextSlide: function() { 271 var opts = this.opts(); 272 var roll; 273 if ( opts.reverse ) { 274 roll = (opts.nextSlide - 1) < 0; 275 opts.nextSlide = roll ? opts.slideCount - 1 : opts.nextSlide-1; 276 opts.currSlide = roll ? 0 : opts.nextSlide+1; 277 } 278 else { 279 roll = (opts.nextSlide + 1) == opts.slides.length; 280 opts.nextSlide = roll ? 0 : opts.nextSlide+1; 281 opts.currSlide = roll ? opts.slides.length-1 : opts.nextSlide-1; 282 } 283 }, 284 285 calcTx: function( slideOpts, manual ) { 286 var opts = slideOpts; 287 var tx; 288 289 if ( opts._tempFx ) 290 tx = $.fn.cycle.transitions[opts._tempFx]; 291 else if ( manual && opts.manualFx ) 292 tx = $.fn.cycle.transitions[opts.manualFx]; 293 294 if ( !tx ) 295 tx = $.fn.cycle.transitions[opts.fx]; 296 297 opts._tempFx = null; 298 this.opts()._tempFx = null; 299 300 if (!tx) { 301 tx = $.fn.cycle.transitions.fade; 302 opts.API.log('Transition "' + opts.fx + '" not found. Using fade.'); 303 } 304 return tx; 305 }, 306 307 prepareTx: function( manual, fwd ) { 308 var opts = this.opts(); 309 var after, curr, next, slideOpts, tx; 310 311 if ( opts.slideCount < 2 ) { 312 opts.timeoutId = 0; 313 return; 314 } 315 if ( manual && ( !opts.busy || opts.manualTrump ) ) { 316 opts.API.stopTransition(); 317 opts.busy = false;
318 clearTimeout(opts.timeoutId); 319 opts.timeoutId = 0; 320 } 321 if ( opts.busy ) 322 return; 323 if ( opts.timeoutId === 0 && !manual ) 324 return; 325 326 curr = opts.slides[opts.currSlide]; 327 next = opts.slides[opts.nextSlide]; 328 slideOpts = opts.API.getSlideOpts( opts.nextSlide ); 329 tx = opts.API.calcTx( slideOpts, manual ); 330 331 opts._tx = tx; 332 333 if ( manual && slideOpts.manualSpeed !== undefined ) 334 slideOpts.speed = slideOpts.manualSpeed; 335 336 // if ( opts.nextSlide === opts.currSlide ) 337 // opts.API.calcNextSlide(); 338 339 // ensure that: 340 // 1. advancing to a different slide 341 // 2. this is either a manual event (prev/next, pager, cmd) or 342 // a timer event and slideshow is not paused 343 if ( opts.nextSlide != opts.currSlide && 344 (manual || (!opts.paused && !opts.hoverPaused && opts.timeout) )) { // #62 345 346 opts.API.trigger('cycle-before', [ slideOpts, curr, next, fwd ]); 347 if ( tx.before ) 348 tx.before( slideOpts, curr, next, fwd ); 349 350 after = function() { 351 opts.busy = false; 352 // #76; bail if slideshow has been destroyed 353 if (! opts.container.data( 'cycle.opts' ) ) 354 return; 355 356 if (tx.after) 357 tx.after( slideOpts, curr, next, fwd ); 358 opts.API.trigger('cycle-after', [ slideOpts, curr, next, fwd ]); 359 opts.API.queueTransition( slideOpts); 360 opts.API.updateView( true ); 361 }; 362 363 opts.busy = true; 364 if (tx.transition) 365 tx.transition(slideOpts, curr, next, fwd, after); 366 else 367 opts.API.doTransition( slideOpts, curr, next, fwd, after); 368 369 opts.API.calcNextSlide(); 370 opts.API.updateView(); 371 } else { 372 opts.API.queueTransition( slideOpts ); 373 } 374 }, 375 376 // perform the actual animation 377 doTransition: function( slideOpts, currEl, nextEl, fwd, callback) { 378 var opts = slideOpts; 379 var curr = $(currEl), next = $(nextEl); 380 var fn = function() { 381 // make sure animIn has something so that callback doesn't trigger immediately 382 next.animate(opts.animIn || { opacity: 1}, opts.speed, opts.easeIn || opts.easing, callback); 383 }; 384 385 next.css(opts.cssBefore || {}); 386 curr.animate(opts.animOut || {}, opts.speed, opts.easeOut || opts.easing, function() { 387 curr.css(opts.cssAfter || {}); 388 if (!opts.sync) { 389 fn(); 390 } 391 }); 392 if (opts.sync) { 393 fn(); 394 } 395 }, 396 397 queueTransition: function( slideOpts, specificTimeout ) { 398 var opts = this.opts(); 399 var timeout = specificTimeout !== undefined ? specificTimeout : slideOpts.timeout; 400 if (opts.nextSlide === 0 && --opts.loop === 0) { 401 opts.API.log('terminating; loop=0'); 402 opts.timeout = 0; 403 if ( timeout ) { 404 setTimeout(function() { 405 opts.API.trigger('cycle-finished', [ opts ]); 406 }, timeout); 407 } 408 else { 409 opts.API.trigger('cycle-finished', [ opts ]); 410 } 411 // reset nextSlide 412 opts.nextSlide = opts.currSlide; 413 return; 414 } 415 if ( opts.continueAuto !== undefined ) { 416 if ( opts.continueAuto === false || 417 ($.isFunction(opts.continueAuto) && opts.continueAuto() === false )) { 418 opts.API.log('terminating automatic transitions'); 419 opts.timeout = 0; 420 if ( opts.timeoutId ) 421 clearTimeout(opts.timeoutId); 422 return; 423 } 424 } 425 if ( timeout ) { 426 opts._lastQueue = $.now(); 427 if ( specificTimeout === undefined ) 428 opts._remainingTimeout = slideOpts.timeout; 429 430 if ( !opts.paused && ! opts.hoverPaused ) { 431 opts.timeoutId = setTimeout(function() { 432 opts.API.prepareTx( false, !opts.reverse ); 433 }, timeout ); 434 } 435 } 436 }, 437 438 stopTransition: function() { 439 var opts = this.opts(); 440 if ( opts.slides.filter(':animated').length ) { 441 opts.slides.stop(false, true); 442 opts.API.trigger('cycle-transition-stopped', [ opts ]); 443 } 444 445 if ( opts._tx && opts._tx.stopTransition ) 446 opts._tx.stopTransition( opts ); 447 }, 448 449 // advance slide forward or back 450 advanceSlide: function( val ) { 451 var opts = this.opts(); 452 clearTimeout(opts.timeoutId); 453 opts.timeoutId = 0; 454 opts.nextSlide = opts.currSlide + val; 455 456 if (opts.nextSlide < 0) 457 opts.nextSlide = opts.slides.length - 1; 458 else if (opts.nextSlide >= opts.slides.length) 459 opts.nextSlide = 0; 460 461 opts.API.prepareTx( true, val >= 0 ); 462 return false;
463 }, 464 465 buildSlideOpts: function( slide ) { 466 var opts = this.opts(); 467 var val, shortName; 468 var slideOpts = slide.data() || {}; 469 for (var p in slideOpts) { 470 // allow props to be accessed sans 'cycle' prefix and log the overrides 471 if (slideOpts.hasOwnProperty(p) && /^cycle[A-Z]+/.test(p) ) { 472 val = slideOpts[p]; 473 shortName = p.match(/^cycle(.*)/)[1].replace(/^[A-Z]/, lowerCase); 474 opts.API.log('['+(opts.slideCount-1)+']', shortName+':', val, '('+typeof val +')'); 475 slideOpts[shortName] = val; 476 } 477 } 478 479 slideOpts = $.extend( {}, $.fn.cycle.defaults, opts, slideOpts ); 480 slideOpts.slideNum = opts.slideCount; 481 482 try { 483 // these props should always be read from the master state object 484 delete slideOpts.API; 485 delete slideOpts.slideCount; 486 delete slideOpts.currSlide; 487 delete slideOpts.nextSlide; 488 delete slideOpts.slides; 489 } catch(e) { 490 // no op 491 } 492 return slideOpts; 493 }, 494 495 getSlideOpts: function( index ) { 496 var opts = this.opts(); 497 if ( index === undefined ) 498 index = opts.currSlide; 499 500 var slide = opts.slides[index]; 501 var slideOpts = $(slide).data('cycle.opts'); 502 return $.extend( {}, opts, slideOpts ); 503 }, 504 505 initSlide: function( slideOpts, slide, suggestedZindex ) { 506 var opts = this.opts(); 507 slide.css( slideOpts.slideCss || {} ); 508 if ( suggestedZindex > 0 ) 509 slide.css( 'zIndex', suggestedZindex ); 510 511 // ensure that speed settings are sane 512 if ( isNaN( slideOpts.speed ) ) 513 slideOpts.speed = $.fx.speeds[slideOpts.speed] || $.fx.speeds._default; 514 if ( !slideOpts.sync ) 515 slideOpts.speed = slideOpts.speed / 2; 516 517 slide.addClass( opts.slideClass ); 518 }, 519 520 updateView: function( isAfter, isDuring, forceEvent ) { 521 var opts = this.opts(); 522 if ( !opts._initialized ) 523 return; 524 var slideOpts = opts.API.getSlideOpts(); 525 var currSlide = opts.slides[ opts.currSlide ]; 526 527 if ( ! isAfter && isDuring !== true ) { 528 opts.API.trigger('cycle-update-view-before', [ opts, slideOpts, currSlide ]); 529 if ( opts.updateView < 0 ) 530 return; 531 } 532 533 if ( opts.slideActiveClass ) { 534 opts.slides.removeClass( opts.slideActiveClass ) 535 .eq( opts.currSlide ).addClass( opts.slideActiveClass ); 536 } 537 538 if ( isAfter && opts.hideNonActive ) 539 opts.slides.filter( ':not(.' + opts.slideActiveClass + ')' ).css('visibility', 'hidden'); 540 541 if ( opts.updateView === 0 ) { 542 setTimeout(function() { 543 opts.API.trigger('cycle-update-view', [ opts, slideOpts, currSlide, isAfter ]); 544 }, slideOpts.speed / (opts.sync ? 2 : 1) ); 545 } 546 547 if ( opts.updateView !== 0 ) 548 opts.API.trigger('cycle-update-view', [ opts, slideOpts, currSlide, isAfter ]); 549 550 if ( isAfter ) 551 opts.API.trigger('cycle-update-view-after', [ opts, slideOpts, currSlide ]); 552 }, 553 554 getComponent: function( name ) { 555 var opts = this.opts(); 556 var selector = opts[name]; 557 if (typeof selector === 'string') { 558 // if selector is a child, sibling combinator, adjancent selector then use find, otherwise query full dom 559 return (/^\s*[\>|\+|~]/).test( selector ) ? opts.container.find( selector ) : $( selector ); 560 } 561 if (selector.jquery) 562 return selector; 563 564 return $(selector); 565 }, 566 567 stackSlides: function( curr, next, fwd ) { 568 var opts = this.opts(); 569 if ( !curr ) { 570 curr = opts.slides[opts.currSlide]; 571 next = opts.slides[opts.nextSlide]; 572 fwd = !opts.reverse; 573 } 574 575 // reset the zIndex for the common case: 576 // curr slide on top, next slide beneath, and the rest in order to be shown 577 $(curr).css('zIndex', opts.maxZ); 578 579 var i; 580 var z = opts.maxZ - 2; 581 var len = opts.slideCount; 582 if (fwd) { 583 for ( i = opts.currSlide + 1; i < len; i++ ) 584 $( opts.slides[i] ).css( 'zIndex', z-- ); 585 for ( i = 0; i < opts.currSlide; i++ ) 586 $( opts.slides[i] ).css( 'zIndex', z-- ); 587 } 588 else { 589 for ( i = opts.currSlide - 1; i >= 0; i-- ) 590 $( opts.slides[i] ).css( 'zIndex', z-- ); 591 for ( i = len - 1; i > opts.currSlide; i-- ) 592 $( opts.slides[i] ).css( 'zIndex', z-- ); 593 } 594 595 $(next).css('zIndex', opts.maxZ - 1); 596 }, 597 598 getSlideIndex: function( el ) { 599 return this.opts().slides.index( el ); 600 } 601 602}; // API 603 604// default logger 605$.fn.cycle.log = function log() { 606 /*global console:true */ 607 if (window.console && console.log) 608 console.log('[cycle2] ' + Array.prototype.join.call(arguments, ' ') ); 609}; 610 611$.fn.cycle.version = function() { return 'Cycle2: ' + version; }; 612 613// helper functions 614 615function lowerCase(s) { 616 return (s || '').toLowerCase(); 617} 618 619// expose transition object 620$.fn.cycle.transitions = { 621 custom: { 622 }, 623 none: { 624 before: function( opts, curr, next, fwd ) { 625 opts.API.stackSlides( next, curr, fwd ); 626 opts.cssBefore = { opacity: 1, visibility: 'visible', display: 'block' }; 627 } 628 }, 629 fade: { 630 before: function( opts, curr, next, fwd ) {
631 var css = opts.API.getSlideOpts( opts.nextSlide ).slideCss || {}; 632 opts.API.stackSlides( curr, next, fwd ); 633 opts.cssBefore = $.extend(css, { opacity: 0, visibility: 'visible', display: 'block' }); 634 opts.animIn = { opacity: 1 }; 635 opts.animOut = { opacity: 0 }; 636 } 637 }, 638 fadeout: { 639 before: function( opts , curr, next, fwd ) { 640 var css = opts.API.getSlideOpts( opts.nextSlide ).slideCss || {}; 641 opts.API.stackSlides( curr, next, fwd ); 642 opts.cssBefore = $.extend(css, { opacity: 1, visibility: 'visible', display: 'block' }); 643 opts.animOut = { opacity: 0 }; 644 } 645 }, 646 scrollHorz: { 647 before: function( opts, curr, next, fwd ) { 648 opts.API.stackSlides( curr, next, fwd ); 649 var w = opts.container.css('overflow','hidden').width(); 650 opts.cssBefore = { left: fwd ? w : - w, top: 0, opacity: 1, visibility: 'visible', display: 'block' }; 651 opts.cssAfter = { zIndex: opts._maxZ - 2, left: 0 }; 652 opts.animIn = { left: 0 }; 653 opts.animOut = { left: fwd ? -w : w }; 654 } 655 } 656}; 657 658// @see: http://jquery.malsup.com/cycle2/api 659$.fn.cycle.defaults = { 660 allowWrap: true, 661 autoSelector: '.cycle-slideshow[data-cycle-auto-init!=false]', 662 delay: 0, 663 easing: null, 664 fx: 'fade', 665 hideNonActive: true, 666 loop: 0, 667 manualFx: undefined, 668 manualSpeed: undefined, 669 manualTrump: true, 670 maxZ: 100, 671 pauseOnHover: false, 672 reverse: false, 673 slideActiveClass: 'cycle-slide-active', 674 slideClass: 'cycle-slide', 675 slideCss: { position: 'absolute', top: 0, left: 0 }, 676 slides: '> img', 677 speed: 500, 678 startingSlide: 0, 679 sync: true, 680 timeout: 4000, 681 updateView: 0 682}; 683 684// automatically find and run slideshows 685$(document).ready(function() { 686 $( $.fn.cycle.defaults.autoSelector ).cycle(); 687}); 688 689})(jQuery); 690 691/*! Cycle2 autoheight plugin; Copyright (c) M.Alsup, 2012; version: 20130913 */ 692(function($) { 693"use strict"; 694 695$.extend($.fn.cycle.defaults, { 696 autoHeight: 0, // setting this option to false disables autoHeight logic 697 autoHeightSpeed: 250, 698 autoHeightEasing: null 699}); 700 701$(document).on( 'cycle-initialized', function( e, opts ) { 702 var autoHeight = opts.autoHeight; 703 var t = $.type( autoHeight ); 704 var resizeThrottle = null; 705 var ratio; 706 707 if ( t !== 'string' && t !== 'number' ) 708 return; 709 710 // bind events 711 opts.container.on( 'cycle-slide-added cycle-slide-removed', initAutoHeight ); 712 opts.container.on( 'cycle-destroyed', onDestroy ); 713 714 if ( autoHeight == 'container' ) { 715 opts.container.on( 'cycle-before', onBefore ); 716 } 717 else if ( t === 'string' && /\d+\:\d+/.test( autoHeight ) ) { 718 // use ratio 719 ratio = autoHeight.match(/(\d+)\:(\d+)/); 720 ratio = ratio[1] / ratio[2]; 721 opts._autoHeightRatio = ratio; 722 } 723 724 // if autoHeight is a number then we don't need to recalculate the sentinel 725 // index on resize 726 if ( t !== 'number' ) { 727 // bind unique resize handler per slideshow (so it can be 'off-ed' in onDestroy) 728 opts._autoHeightOnResize = function () { 729 clearTimeout( resizeThrottle ); 730 resizeThrottle = setTimeout( onResize, 50 ); 731 }; 732 733 $(window).on( 'resize orientationchange', opts._autoHeightOnResize ); 734 } 735 736 setTimeout( onResize, 30 ); 737 738 function onResize() { 739 initAutoHeight( e, opts ); 740 } 741}); 742 743function initAutoHeight( e, opts ) { 744 var clone, height, sentinelIndex; 745 var autoHeight = opts.autoHeight; 746 747 if ( autoHeight == 'container' ) { 748 height = $( opts.slides[ opts.currSlide ] ).outerHeight(); 749 opts.container.height( height ); 750 } 751 else if ( opts._autoHeightRatio ) { 752 opts.container.height( opts.container.width() / opts._autoHeightRatio ); 753 } 754 else if ( autoHeight === 'calc' || ( $.type( autoHeight ) == 'number' && autoHeight >= 0 ) ) { 755 if ( autoHeight === 'calc' ) 756 sentinelIndex = calcSentinelIndex( e, opts ); 757 else if ( autoHeight >= opts.slides.length ) 758 sentinelIndex = 0; 759 else 760 sentinelIndex = autoHeight; 761 762 // only recreate sentinel if index is different 763 if ( sentinelIndex == opts._sentinelIndex ) 764 return; 765 766 opts._sentinelIndex = sentinelIndex; 767 if ( opts._sentinel ) 768 opts._sentinel.remove(); 769 770 // clone existing slide as sentinel 771 clone = $( opts.slides[ sentinelIndex ].cloneNode(true) ); 772 773 // #50; remove special attributes from cloned content
774 clone.removeAttr( 'id name rel' ).find( '[id],[name],[rel]' ).removeAttr( 'id name rel' ); 775 776 clone.css({ 777 position: 'static', 778 visibility: 'hidden', 779 display: 'block' 780 }).prependTo( opts.container ).addClass('cycle-sentinel cycle-slide').removeClass('cycle-slide-active'); 781 clone.find( '*' ).css( 'visibility', 'hidden' ); 782 783 opts._sentinel = clone; 784 } 785} 786 787function calcSentinelIndex( e, opts ) { 788 var index = 0, max = -1; 789 790 // calculate tallest slide index 791 opts.slides.each(function(i) { 792 var h = $(this).height(); 793 if ( h > max ) { 794 max = h; 795 index = i; 796 } 797 }); 798 return index; 799} 800 801function onBefore( e, opts, outgoing, incoming, forward ) { 802 var h = $(incoming).outerHeight(); 803 opts.container.animate( { height: h }, opts.autoHeightSpeed, opts.autoHeightEasing ); 804} 805 806function onDestroy( e, opts ) { 807 if ( opts._autoHeightOnResize ) { 808 $(window).off( 'resize orientationchange', opts._autoHeightOnResize ); 809 opts._autoHeightOnResize = null; 810 } 811 opts.container.off( 'cycle-slide-added cycle-slide-removed', initAutoHeight ); 812 opts.container.off( 'cycle-destroyed', onDestroy ); 813 opts.container.off( 'cycle-before', onBefore ); 814 815 if ( opts._sentinel ) { 816 opts._sentinel.remove(); 817 opts._sentinel = null; 818 } 819} 820 821})(jQuery); 822 823/*! caption plugin for Cycle2; version: 20130306 */ 824(function($) { 825"use strict"; 826 827$.extend($.fn.cycle.defaults, { 828 caption: '> .cycle-caption', 829 captionTemplate: '{{slideNum}} / {{slideCount}}', 830 overlay: '> .cycle-overlay', 831 overlayTemplate: '<div>{{title}}</div><div>{{desc}}</div>', 832 captionModule: 'caption' 833}); 834 835$(document).on( 'cycle-update-view', function( e, opts, slideOpts, currSlide ) { 836 if ( opts.captionModule !== 'caption' ) 837 return; 838 var el; 839 $.each(['caption','overlay'], function() { 840 var name = this; 841 var template = slideOpts[name+'Template']; 842 var el = opts.API.getComponent( name ); 843 if( el.length && template ) { 844 el.html( opts.API.tmpl( template, slideOpts, opts, currSlide ) ); 845 el.show(); 846 } 847 else { 848 el.hide(); 849 } 850 }); 851}); 852 853$(document).on( 'cycle-destroyed', function( e, opts ) { 854 var el; 855 $.each(['caption','overlay'], function() { 856 var name = this, template = opts[name+'Template']; 857 if ( opts[name] && template ) { 858 el = opts.API.getComponent( 'caption' ); 859 el.empty(); 860 } 861 }); 862}); 863 864})(jQuery); 865 866/*! command plugin for Cycle2; version: 20140415 */ 867(function($) { 868"use strict"; 869 870var c2 = $.fn.cycle; 871 872$.fn.cycle = function( options ) { 873 var cmd, cmdFn, opts; 874 var args = $.makeArray( arguments ); 875 876 if ( $.type( options ) == 'number' ) { 877 return this.cycle( 'goto', options ); 878 } 879 880 if ( $.type( options ) == 'string' ) { 881 return this.each(function() { 882 var cmdArgs; 883 cmd = options; 884 opts = $(this).data('cycle.opts'); 885 886 if ( opts === undefined ) { 887 c2.log('slideshow must be initialized before sending commands; "' + cmd + '" ignored'); 888 return; 889 } 890 else { 891 cmd = cmd == 'goto' ? 'jump' : cmd; // issue #3; change 'goto' to 'jump' internally 892 cmdFn = opts.API[ cmd ]; 893 if ( $.isFunction( cmdFn )) { 894 cmdArgs = $.makeArray( args ); 895 cmdArgs.shift(); 896 return cmdFn.apply( opts.API, cmdArgs ); 897 } 898 else { 899 c2.log( 'unknown command: ', cmd ); 900 } 901 } 902 }); 903 } 904 else { 905 return c2.apply( this, arguments ); 906 } 907}; 908 909// copy props 910$.extend( $.fn.cycle, c2 ); 911 912$.extend( c2.API, { 913 next: function() { 914 var opts = this.opts(); 915 if ( opts.busy && ! opts.manualTrump ) 916 return; 917 918 var count = opts.reverse ? -1 : 1; 919 if ( opts.allowWrap === false && ( opts.currSlide + count ) >= opts.slideCount ) 920 return; 921 922 opts.API.advanceSlide( count );
923 opts.API.trigger('cycle-next', [ opts ]).log('cycle-next'); 924 }, 925 926 prev: function() { 927 var opts = this.opts(); 928 if ( opts.busy && ! opts.manualTrump ) 929 return; 930 var count = opts.reverse ? 1 : -1; 931 if ( opts.allowWrap === false && ( opts.currSlide + count ) < 0 ) 932 return; 933 934 opts.API.advanceSlide( count ); 935 opts.API.trigger('cycle-prev', [ opts ]).log('cycle-prev'); 936 }, 937 938 destroy: function() { 939 this.stop(); //#204 940 941 var opts = this.opts(); 942 var clean = $.isFunction( $._data ) ? $._data : $.noop; // hack for #184 and #201 943 clearTimeout(opts.timeoutId); 944 opts.timeoutId = 0; 945 opts.API.stop(); 946 opts.API.trigger( 'cycle-destroyed', [ opts ] ).log('cycle-destroyed'); 947 opts.container.removeData(); 948 clean( opts.container[0], 'parsedAttrs', false ); 949 950 // #75; remove inline styles 951 if ( ! opts.retainStylesOnDestroy ) { 952 opts.container.removeAttr( 'style' ); 953 opts.slides.removeAttr( 'style' ); 954 opts.slides.removeClass( opts.slideActiveClass ); 955 } 956 opts.slides.each(function() { 957 $(this).removeData(); 958 clean( this, 'parsedAttrs', false ); 959 }); 960 }, 961 962 jump: function( index, fx ) { 963 // go to the requested slide 964 var fwd; 965 var opts = this.opts(); 966 if ( opts.busy && ! opts.manualTrump ) 967 return; 968 var num = parseInt( index, 10 ); 969 if (isNaN(num) || num < 0 || num >= opts.slides.length) { 970 opts.API.log('goto: invalid slide index: ' + num); 971 return; 972 } 973 if (num == opts.currSlide) { 974 opts.API.log('goto: skipping, already on slide', num); 975 return; 976 } 977 opts.nextSlide = num; 978 clearTimeout(opts.timeoutId); 979 opts.timeoutId = 0; 980 opts.API.log('goto: ', num, ' (zero-index)'); 981 fwd = opts.currSlide < opts.nextSlide; 982 opts._tempFx = fx; 983 opts.API.prepareTx( true, fwd ); 984 }, 985 986 stop: function() { 987 var opts = this.opts(); 988 var pauseObj = opts.container; 989 clearTimeout(opts.timeoutId); 990 opts.timeoutId = 0; 991 opts.API.stopTransition(); 992 if ( opts.pauseOnHover ) { 993 if ( opts.pauseOnHover !== true ) 994 pauseObj = $( opts.pauseOnHover ); 995 pauseObj.off('mouseenter mouseleave'); 996 } 997 opts.API.trigger('cycle-stopped', [ opts ]).log('cycle-stopped'); 998 }, 999 1000 reinit: function() { 1001 var opts = this.opts(); 1002 opts.API.destroy(); 1003 opts.container.cycle(); 1004 }, 1005 1006 remove: function( index ) { 1007 var opts = this.opts(); 1008 var slide, slideToRemove, slides = [], slideNum = 1; 1009 for ( var i=0; i < opts.slides.length; i++ ) { 1010 slide = opts.slides[i]; 1011 if ( i == index ) { 1012 slideToRemove = slide; 1013 } 1014 else { 1015 slides.push( slide ); 1016 $( slide ).data('cycle.opts').slideNum = slideNum; 1017 slideNum++; 1018 } 1019 } 1020 if ( slideToRemove ) { 1021 opts.slides = $( slides ); 1022 opts.slideCount--; 1023 $( slideToRemove ).remove(); 1024 if (index == opts.currSlide) 1025 opts.API.advanceSlide( 1 ); 1026 else if ( index < opts.currSlide ) 1027 opts.currSlide--; 1028 else 1029 opts.currSlide++; 1030 1031 opts.API.trigger('cycle-slide-removed', [ opts, index, slideToRemove ]).log('cycle-slide-removed'); 1032 opts.API.updateView(); 1033 } 1034 } 1035 1036}); 1037 1038// listen for clicks on elements with data-cycle-cmd attribute 1039$(document).on('click.cycle', '[data-cycle-cmd]', function(e) { 1040 // issue cycle command 1041 e.preventDefault(); 1042 var el = $(this); 1043 var command = el.data('cycle-cmd'); 1044 var context = el.data('cycle-context') || '.cycle-slideshow'; 1045 $(context).cycle(command, el.data('cycle-arg')); 1046}); 1047 1048 1049})(jQuery); 1050 1051/*! hash plugin for Cycle2; version: 20130905 */ 1052(function($) { 1053"use strict"; 1054 1055$(document).on( 'cycle-pre-initialize', function( e, opts ) { 1056 onHashChange( opts, true ); 1057 1058 opts._onHashChange = function() { 1059 onHashChange( opts, false ); 1060 }; 1061
1062 $( window ).on( 'hashchange', opts._onHashChange); 1063}); 1064 1065$(document).on( 'cycle-update-view', function( e, opts, slideOpts ) { 1066 if ( slideOpts.hash && ( '#' + slideOpts.hash ) != window.location.hash ) { 1067 opts._hashFence = true; 1068 window.location.hash = slideOpts.hash; 1069 } 1070}); 1071 1072$(document).on( 'cycle-destroyed', function( e, opts) { 1073 if ( opts._onHashChange ) { 1074 $( window ).off( 'hashchange', opts._onHashChange ); 1075 } 1076}); 1077 1078function onHashChange( opts, setStartingSlide ) { 1079 var hash; 1080 if ( opts._hashFence ) { 1081 opts._hashFence = false; 1082 return; 1083 } 1084 1085 hash = window.location.hash.substring(1); 1086 1087 opts.slides.each(function(i) { 1088 if ( $(this).data( 'cycle-hash' ) == hash ) { 1089 if ( setStartingSlide === true ) { 1090 opts.startingSlide = i; 1091 } 1092 else { 1093 var fwd = opts.currSlide < i; 1094 opts.nextSlide = i; 1095 opts.API.prepareTx( true, fwd ); 1096 } 1097 return false; 1098 } 1099 }); 1100} 1101 1102})(jQuery); 1103 1104/*! loader plugin for Cycle2; version: 20131121 */ 1105(function($) { 1106"use strict"; 1107 1108$.extend($.fn.cycle.defaults, { 1109 loader: false 1110}); 1111 1112$(document).on( 'cycle-bootstrap', function( e, opts ) { 1113 var addFn; 1114 1115 if ( !opts.loader ) 1116 return; 1117 1118 // override API.add for this slideshow 1119 addFn = opts.API.add; 1120 opts.API.add = add; 1121 1122 function add( slides, prepend ) { 1123 var slideArr = []; 1124 if ( $.type( slides ) == 'string' ) 1125 slides = $.trim( slides ); 1126 else if ( $.type( slides) === 'array' ) { 1127 for (var i=0; i < slides.length; i++ ) 1128 slides[i] = $(slides[i])[0]; 1129 } 1130 1131 slides = $( slides ); 1132 var slideCount = slides.length; 1133 1134 if ( ! slideCount ) 1135 return; 1136 1137 slides.css('visibility','hidden').appendTo('body').each(function(i) { // appendTo fixes #56 1138 var count = 0; 1139 var slide = $(this); 1140 var images = slide.is('img') ? slide : slide.find('img'); 1141 slide.data('index', i); 1142 // allow some images to be marked as unimportant (and filter out images w/o src value) 1143 images = images.filter(':not(.cycle-loader-ignore)').filter(':not([src=""])'); 1144 if ( ! images.length ) { 1145 --slideCount; 1146 slideArr.push( slide ); 1147 return; 1148 } 1149 1150 count = images.length; 1151 images.each(function() { 1152 // add images that are already loaded 1153 if ( this.complete ) { 1154 imageLoaded(); 1155 } 1156 else { 1157 $(this).load(function() { 1158 imageLoaded(); 1159 }).on("error", function() { 1160 if ( --count === 0 ) { 1161 // ignore this slide 1162 opts.API.log('slide skipped; img not loaded:', this.src); 1163 if ( --slideCount === 0 && opts.loader == 'wait') { 1164 addFn.apply( opts.API, [ slideArr, prepend ] ); 1165 } 1166 } 1167 }); 1168 } 1169 }); 1170 1171 function imageLoaded() { 1172 if ( --count === 0 ) { 1173 --slideCount; 1174 addSlide( slide ); 1175 } 1176 } 1177 }); 1178 1179 if ( slideCount ) 1180 opts.container.addClass('cycle-loading'); 1181 1182 1183 function addSlide( slide ) { 1184 var curr; 1185 if ( opts.loader == 'wait' ) { 1186 slideArr.push( slide ); 1187 if ( slideCount === 0 ) { 1188 // #59; sort slides into original markup order 1189 slideArr.sort( sorter ); 1190 addFn.apply( opts.API, [ slideArr, prepend ] ); 1191 opts.container.removeClass('cycle-loading'); 1192 } 1193 } 1194 else { 1195 curr = $(opts.slides[opts.currSlide]); 1196 addFn.apply( opts.API, [ slide, prepend ] ); 1197 curr.show(); 1198 opts.container.removeClass('cycle-loading'); 1199 } 1200 } 1201 1202 function sorter(a, b) { 1203 return a.data('index') - b.data('index'); 1204 } 1205 } 1206}); 1207 1208})(jQuery); 1209 1210/*! pager plugin for Cycle2; version: 20140415 */ 1211(function($) { 1212"use strict"; 1213 1214$.extend($.fn.cycle.defaults, { 1215 pager: '> .cycle-pager', 1216 pagerActiveClass: 'cycle-pager-active', 1217 pagerEvent: 'click.cycle', 1218 pagerEventBubble: undefined, 1219 pagerTemplate: '<span>•</span>' 1220}); 1221 1222$(document).on( 'cycle-bootstrap', function( e, opts, API ) { 1223 // add method to API 1224 API.buildPagerLink = buildPagerLink; 1225}); 1226 1227$(document).on( 'cycle-slide-added', function( e, opts, slideOpts, slideAdded ) { 1228 if ( opts.pager ) { 1229 opts.API.buildPagerLink ( opts, slideOpts, slideAdded ); 1230 opts.API.page = page; 1231 } 1232}); 1233 1234$(document).on( 'cycle-slide-removed', function( e, opts, index, slideRemoved ) { 1235 if ( opts.pager ) { 1236 var pagers = opts.API.getComponent( 'pager' ); 1237 pagers.each(function() { 1238 var pager = $(this); 1239 $( pager.children()[index] ).remove(); 1240 }); 1241 } 1242}); 1243 1244$(document).on( 'cycle-update-view', function( e, opts, slideOpts ) { 1245 var pagers; 1246 1247 if ( opts.pager ) { 1248 pagers = opts.API.getComponent( 'pager' ); 1249 pagers.each(function() { 1250 $(this).children().removeClass( opts.pagerActiveClass )
1251 .eq( opts.currSlide ).addClass( opts.pagerActiveClass ); 1252 }); 1253 } 1254}); 1255 1256$(document).on( 'cycle-destroyed', function( e, opts ) { 1257 var pager = opts.API.getComponent( 'pager' ); 1258 1259 if ( pager ) { 1260 pager.children().off( opts.pagerEvent ); // #202 1261 if ( opts.pagerTemplate ) 1262 pager.empty(); 1263 } 1264}); 1265 1266function buildPagerLink( opts, slideOpts, slide ) { 1267 var pagerLink; 1268 var pagers = opts.API.getComponent( 'pager' ); 1269 pagers.each(function() { 1270 var pager = $(this); 1271 if ( slideOpts.pagerTemplate ) { 1272 var markup = opts.API.tmpl( slideOpts.pagerTemplate, slideOpts, opts, slide[0] ); 1273 pagerLink = $( markup ).appendTo( pager ); 1274 } 1275 else { 1276 pagerLink = pager.children().eq( opts.slideCount - 1 ); 1277 } 1278 pagerLink.on( opts.pagerEvent, function(e) { 1279 if ( ! opts.pagerEventBubble ) 1280 e.preventDefault(); 1281 opts.API.page( pager, e.currentTarget); 1282 }); 1283 }); 1284} 1285 1286function page( pager, target ) { 1287 /*jshint validthis:true */ 1288 var opts = this.opts(); 1289 if ( opts.busy && ! opts.manualTrump ) 1290 return; 1291 1292 var index = pager.children().index( target ); 1293 var nextSlide = index; 1294 var fwd = opts.currSlide < nextSlide; 1295 if (opts.currSlide == nextSlide) { 1296 return; // no op, clicked pager for the currently displayed slide 1297 } 1298 opts.nextSlide = nextSlide; 1299 opts._tempFx = opts.pagerFx; 1300 opts.API.prepareTx( true, fwd ); 1301 opts.API.trigger('cycle-pager-activated', [opts, pager, target ]); 1302} 1303 1304})(jQuery); 1305 1306/*! prevnext plugin for Cycle2; version: 20140408 */ 1307(function($) { 1308"use strict"; 1309 1310$.extend($.fn.cycle.defaults, { 1311 next: '> .cycle-next', 1312 nextEvent: 'click.cycle', 1313 disabledClass: 'disabled', 1314 prev: '> .cycle-prev', 1315 prevEvent: 'click.cycle', 1316 swipe: false 1317}); 1318 1319$(document).on( 'cycle-initialized', function( e, opts ) { 1320 opts.API.getComponent( 'next' ).on( opts.nextEvent, function(e) { 1321 e.preventDefault(); 1322 opts.API.next(); 1323 }); 1324 1325 opts.API.getComponent( 'prev' ).on( opts.prevEvent, function(e) { 1326 e.preventDefault(); 1327 opts.API.prev(); 1328 }); 1329 1330 if ( opts.swipe ) { 1331 var nextEvent = opts.swipeVert ? 'swipeUp.cycle' : 'swipeLeft.cycle swipeleft.cycle'; 1332 var prevEvent = opts.swipeVert ? 'swipeDown.cycle' : 'swipeRight.cycle swiperight.cycle'; 1333 opts.container.on( nextEvent, function(e) { 1334 opts._tempFx = opts.swipeFx; 1335 opts.API.next(); 1336 }); 1337 opts.container.on( prevEvent, function() { 1338 opts._tempFx = opts.swipeFx; 1339 opts.API.prev(); 1340 }); 1341 } 1342}); 1343 1344$(document).on( 'cycle-update-view', function( e, opts, slideOpts, currSlide ) { 1345 if ( opts.allowWrap ) 1346 return; 1347 1348 var cls = opts.disabledClass; 1349 var next = opts.API.getComponent( 'next' ); 1350 var prev = opts.API.getComponent( 'prev' ); 1351 var prevBoundry = opts._prevBoundry || 0; 1352 var nextBoundry = (opts._nextBoundry !== undefined)?opts._nextBoundry:opts.slideCount - 1; 1353 1354 if ( opts.currSlide == nextBoundry ) 1355 next.addClass( cls ).prop( 'disabled', true ); 1356 else 1357 next.removeClass( cls ).prop( 'disabled', false ); 1358 1359 if ( opts.currSlide === prevBoundry ) 1360 prev.addClass( cls ).prop( 'disabled', true ); 1361 else 1362 prev.removeClass( cls ).prop( 'disabled', false ); 1363}); 1364 1365 1366$(document).on( 'cycle-destroyed', function( e, opts ) { 1367 opts.API.getComponent( 'prev' ).off( opts.nextEvent ); 1368 opts.API.getComponent( 'next' ).off( opts.prevEvent ); 1369 opts.container.off( 'swipeleft.cycle swiperight.cycle swipeLeft.cycle swipeRight.cycle swipeUp.cycle swipeDown.cycle' ); 1370}); 1371 1372})(jQuery); 1373 1374/*! progressive loader plugin for Cycle2; version: 20130315 */ 1375(function($) { 1376"use strict"; 1377 1378$.extend($.fn.cycle.defaults, { 1379 progressive: false 1380}); 1381 1382$(document).on( 'cycle-pre-initialize', function( e, opts ) { 1383 if ( !opts.progressive ) 1384 return; 1385 1386 var API = opts.API; 1387 var nextFn = API.next; 1388 var prevFn = API.prev; 1389 var prepareTxFn = API.prepareTx; 1390 var type = $.type( opts.progressive ); 1391 var slides, scriptEl; 1392 1393 if ( type == 'array' ) { 1394 slides = opts.progressive; 1395 } 1396 else if ($.isFunction( opts.progressive ) ) { 1397 slides = opts.progressive( opts ); 1398 } 1399 else if ( type == 'string' ) { 1400 scriptEl = $( opts.progressive ); 1401 slides = $.trim( scriptEl.html() ); 1402 if ( !slides ) 1403 return; 1404 // is it json array? 1405 if ( /^(\[)/.test( slides ) ) { 1406 try { 1407 slides = $.parseJSON( slides ); 1408 } 1409 catch(err) { 1410 API.log( 'error parsing progressive slides', err ); 1411 return; 1412 } 1413 } 1414 else { 1415 // plain text, split on delimeter 1416 slides = slides.split( new RegExp( scriptEl.data('cycle-split') || '\n') ); 1417 1418 // #95; look for empty slide 1419 if ( ! slides[ slides.length - 1 ] ) 1420 slides.pop(); 1421 } 1422 } 1423 1424 1425 1426 if ( prepareTxFn ) { 1427 API.prepareTx = function( manual, fwd ) { 1428 var index, slide; 1429 1430 if ( manual || slides.length === 0 ) { 1431 prepareTxFn.apply( opts.API, [ manual, fwd ] ); 1432 return; 1433 } 1434 1435 if ( fwd && opts.currSlide == ( opts.slideCount-1) ) { 1436 slide = slides[ 0 ]; 1437 slides = slides.slice( 1 ); 1438 opts.container.one('cycle-slide-added', function(e, opts ) { 1439 setTimeout(function() { 1440 opts.API.advanceSlide( 1 ); 1441 },50); 1442 }); 1443 opts.API.add( slide ); 1444 } 1445 else if ( !fwd && opts.currSlide === 0 ) { 1446 index = slides.length-1; 1447 slide = slides[ index ]; 1448 slides = slides.slice( 0, index ); 1449 opts.container.one('cycle-slide-added', function(e, opts ) { 1450 setTimeout(function() { 1451 opts.currSlide = 1; 1452 opts.API.advanceSlide( -1 ); 1453 },50); 1454 }); 1455 opts.API.add( slide, true ); 1456 } 1457 else { 1458 prepareTxFn.apply( opts.API, [ manual, fwd ] ); 1459 } 1460 }; 1461 } 1462 1463 if ( nextFn ) { 1464 API.next = function() { 1465 var opts = this.opts(); 1466 if ( slides.length && opts.currSlide == ( opts.slideCount - 1 ) ) { 1467 var slide = slides[ 0 ]; 1468 slides = slides.slice( 1 ); 1469 opts.container.one('cycle-slide-added', function(e, opts ) { 1470 nextFn.apply( opts.API ); 1471 opts.container.removeClass('cycle-loading'); 1472 }); 1473 opts.container.addClass('cycle-loading'); 1474 opts.API.add( slide ); 1475 } 1476 else { 1477 nextFn.apply( opts.API ); 1478 } 1479 }; 1480 } 1481 1482 if ( prevFn ) { 1483 API.prev = function() { 1484 var opts = this.opts(); 1485 if ( slides.length && opts.currSlide === 0 ) { 1486 var index = slides.length-1; 1487 var slide = slides[ index ]; 1488 slides = slides.slice( 0, index ); 1489 opts.container.one('cycle-slide-added', function(e, opts ) { 1490 opts.currSlide = 1; 1491 opts.API.advanceSlide( -1 ); 1492 opts.container.removeClass('cycle-loading'); 1493 }); 1494 opts.container.addClass('cycle-loading'); 1495 opts.API.add( slide, true ); 1496 } 1497 else { 1498 prevFn.apply( opts.API ); 1499 } 1500 }; 1501 } 1502}); 1503 1504})(jQuery); 1505 1506/*! tmpl plugin for Cycle2; version: 20121227 */ 1507(function($) { 1508"use strict"; 1509 1510$.extend($.fn.cycle.defaults, { 1511 tmplRegex: '{{((.)?.*?)}}' 1512}); 1513 1514$.extend($.fn.cycle.API, { 1515 tmpl: function( str, opts /*, ... */) { 1516 var regex = new RegExp( opts.tmplRegex || $.fn.cycle.defaults.tmplRegex, 'g' ); 1517 var args = $.makeArray( arguments ); 1518 args.shift(); 1519 return str.replace(regex, function(_, str) { 1520 var i, j, obj, prop, names = str.split('.'); 1521 for (i=0; i < args.length; i++) { 1522 obj = args[i]; 1523 if ( ! obj ) 1524 continue; 1525 if (names.length > 1) { 1526 prop = obj; 1527 for (j=0; j < names.length; j++) { 1528 obj = prop; 1529 prop = prop[ names[j] ] || str; 1530 } 1531 } else { 1532 prop = obj[str]; 1533 } 1534 1535 if ($.isFunction(prop)) 1536 return prop.apply(obj, args); 1537 if (prop !== undefined && prop !== null && prop != str) 1538 return prop; 1539 } 1540 return str; 1541 }); 1542 } 1543}); 1544 1545})(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.