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