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