Team:Marburg/Template:Header
From 2013.igem.org
(Difference between revisions)
m |
|||
Line 287: | Line 287: | ||
</style> | </style> | ||
+ | <script> | ||
+ | /* | ||
+ | * jQuery Cycle2; build: v20130909 | ||
+ | * http://jquery.malsup.com/cycle2/ | ||
+ | * Copyright (c) 2013 M. Alsup; Dual licensed: MIT/GPL | ||
+ | */ | ||
+ | |||
+ | /*! core engine; version: 20130909 */ | ||
+ | ;(function($) { | ||
+ | "use strict"; | ||
+ | |||
+ | var version = '20130725'; | ||
+ | |||
+ | $.fn.cycle = function( options ) { | ||
+ | // fix mistakes with the ready state | ||
+ | var o; | ||
+ | if ( this.length === 0 && !$.isReady ) { | ||
+ | o = { s: this.selector, c: this.context }; | ||
+ | $.fn.cycle.log('requeuing slideshow (dom not ready)'); | ||
+ | $(function() { | ||
+ | $( o.s, o.c ).cycle(options); | ||
+ | }); | ||
+ | return this; | ||
+ | } | ||
+ | |||
+ | return this.each(function() { | ||
+ | var data, opts, shortName, val; | ||
+ | var container = $(this); | ||
+ | var log = $.fn.cycle.log; | ||
+ | |||
+ | if ( container.data('cycle.opts') ) | ||
+ | return; // already initialized | ||
+ | |||
+ | if ( container.data('cycle-log') === false || | ||
+ | ( options && options.log === false ) || | ||
+ | ( opts && opts.log === false) ) { | ||
+ | log = $.noop; | ||
+ | } | ||
+ | |||
+ | log('--c2 init--'); | ||
+ | data = container.data(); | ||
+ | for (var p in data) { | ||
+ | // allow props to be accessed sans 'cycle' prefix and log the overrides | ||
+ | if (data.hasOwnProperty(p) && /^cycle[A-Z]+/.test(p) ) { | ||
+ | val = data[p]; | ||
+ | shortName = p.match(/^cycle(.*)/)[1].replace(/^[A-Z]/, lowerCase); | ||
+ | log(shortName+':', val, '('+typeof val +')'); | ||
+ | data[shortName] = val; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | opts = $.extend( {}, $.fn.cycle.defaults, data, options || {}); | ||
+ | |||
+ | opts.timeoutId = 0; | ||
+ | opts.paused = opts.paused || false; // #57 | ||
+ | opts.container = container; | ||
+ | opts._maxZ = opts.maxZ; | ||
+ | |||
+ | opts.API = $.extend ( { _container: container }, $.fn.cycle.API ); | ||
+ | opts.API.log = log; | ||
+ | opts.API.trigger = function( eventName, args ) { | ||
+ | opts.container.trigger( eventName, args ); | ||
+ | return opts.API; | ||
+ | }; | ||
+ | |||
+ | container.data( 'cycle.opts', opts ); | ||
+ | container.data( 'cycle.API', opts.API ); | ||
+ | |||
+ | // opportunity for plugins to modify opts and API | ||
+ | opts.API.trigger('cycle-bootstrap', [ opts, opts.API ]); | ||
+ | |||
+ | opts.API.addInitialSlides(); | ||
+ | opts.API.preInitSlideshow(); | ||
+ | |||
+ | if ( opts.slides.length ) | ||
+ | opts.API.initSlideshow(); | ||
+ | }); | ||
+ | }; | ||
+ | |||
+ | $.fn.cycle.API = { | ||
+ | opts: function() { | ||
+ | return this._container.data( 'cycle.opts' ); | ||
+ | }, | ||
+ | addInitialSlides: function() { | ||
+ | var opts = this.opts(); | ||
+ | var slides = opts.slides; | ||
+ | opts.slideCount = 0; | ||
+ | opts.slides = $(); // empty set | ||
+ | |||
+ | // add slides that already exist | ||
+ | slides = slides.jquery ? slides : opts.container.find( slides ); | ||
+ | |||
+ | if ( opts.random ) { | ||
+ | slides.sort(function() {return Math.random() - 0.5;}); | ||
+ | } | ||
+ | |||
+ | opts.API.add( slides ); | ||
+ | }, | ||
+ | |||
+ | preInitSlideshow: function() { | ||
+ | var opts = this.opts(); | ||
+ | opts.API.trigger('cycle-pre-initialize', [ opts ]); | ||
+ | var tx = $.fn.cycle.transitions[opts.fx]; | ||
+ | if (tx && $.isFunction(tx.preInit)) | ||
+ | tx.preInit( opts ); | ||
+ | opts._preInitialized = true; | ||
+ | }, | ||
+ | |||
+ | postInitSlideshow: function() { | ||
+ | var opts = this.opts(); | ||
+ | opts.API.trigger('cycle-post-initialize', [ opts ]); | ||
+ | var tx = $.fn.cycle.transitions[opts.fx]; | ||
+ | if (tx && $.isFunction(tx.postInit)) | ||
+ | tx.postInit( opts ); | ||
+ | }, | ||
+ | |||
+ | initSlideshow: function() { | ||
+ | var opts = this.opts(); | ||
+ | var pauseObj = opts.container; | ||
+ | var slideOpts; | ||
+ | opts.API.calcFirstSlide(); | ||
+ | |||
+ | if ( opts.container.css('position') == 'static' ) | ||
+ | opts.container.css('position', 'relative'); | ||
+ | |||
+ | $(opts.slides[opts.currSlide]).css('opacity',1).show(); | ||
+ | opts.API.stackSlides( opts.slides[opts.currSlide], opts.slides[opts.nextSlide], !opts.reverse ); | ||
+ | |||
+ | if ( opts.pauseOnHover ) { | ||
+ | // allow pauseOnHover to specify an element | ||
+ | if ( opts.pauseOnHover !== true ) | ||
+ | pauseObj = $( opts.pauseOnHover ); | ||
+ | |||
+ | pauseObj.hover( | ||
+ | function(){ opts.API.pause( true ); }, | ||
+ | function(){ opts.API.resume( true ); } | ||
+ | ); | ||
+ | } | ||
+ | |||
+ | // stage initial transition | ||
+ | if ( opts.timeout ) { | ||
+ | slideOpts = opts.API.getSlideOpts( opts.nextSlide ); | ||
+ | opts.API.queueTransition( slideOpts, slideOpts.timeout + opts.delay ); | ||
+ | } | ||
+ | |||
+ | opts._initialized = true; | ||
+ | opts.API.updateView( true ); | ||
+ | opts.API.trigger('cycle-initialized', [ opts ]); | ||
+ | opts.API.postInitSlideshow(); | ||
+ | }, | ||
+ | |||
+ | pause: function( hover ) { | ||
+ | var opts = this.opts(), | ||
+ | slideOpts = opts.API.getSlideOpts(), | ||
+ | alreadyPaused = opts.hoverPaused || opts.paused; | ||
+ | |||
+ | if ( hover ) | ||
+ | opts.hoverPaused = true; | ||
+ | else | ||
+ | opts.paused = true; | ||
+ | |||
+ | if ( ! alreadyPaused ) { | ||
+ | opts.container.addClass('cycle-paused'); | ||
+ | opts.API.trigger('cycle-paused', [ opts ]).log('cycle-paused'); | ||
+ | |||
+ | if ( slideOpts.timeout ) { | ||
+ | clearTimeout( opts.timeoutId ); | ||
+ | opts.timeoutId = 0; | ||
+ | |||
+ | // determine how much time is left for the current slide | ||
+ | opts._remainingTimeout -= ( $.now() - opts._lastQueue ); | ||
+ | if ( opts._remainingTimeout < 0 || isNaN(opts._remainingTimeout) ) | ||
+ | opts._remainingTimeout = undefined; | ||
+ | } | ||
+ | } | ||
+ | }, | ||
+ | |||
+ | resume: function( hover ) { | ||
+ | var opts = this.opts(), | ||
+ | alreadyResumed = !opts.hoverPaused && !opts.paused, | ||
+ | remaining; | ||
+ | |||
+ | if ( hover ) | ||
+ | opts.hoverPaused = false; | ||
+ | else | ||
+ | opts.paused = false; | ||
+ | |||
+ | |||
+ | if ( ! alreadyResumed ) { | ||
+ | opts.container.removeClass('cycle-paused'); | ||
+ | // #gh-230; if an animation is in progress then don't queue a new transition; it will | ||
+ | // happen naturally | ||
+ | if ( opts.slides.filter(':animated').length === 0 ) | ||
+ | opts.API.queueTransition( opts.API.getSlideOpts(), opts._remainingTimeout ); | ||
+ | opts.API.trigger('cycle-resumed', [ opts, opts._remainingTimeout ] ).log('cycle-resumed'); | ||
+ | } | ||
+ | }, | ||
+ | |||
+ | add: function( slides, prepend ) { | ||
+ | var opts = this.opts(); | ||
+ | var oldSlideCount = opts.slideCount; | ||
+ | var startSlideshow = false; | ||
+ | var len; | ||
+ | |||
+ | if ( $.type(slides) == 'string') | ||
+ | slides = $.trim( slides ); | ||
+ | |||
+ | $( slides ).each(function(i) { | ||
+ | var slideOpts; | ||
+ | var slide = $(this); | ||
+ | |||
+ | if ( prepend ) | ||
+ | opts.container.prepend( slide ); | ||
+ | else | ||
+ | opts.container.append( slide ); | ||
+ | |||
+ | opts.slideCount++; | ||
+ | slideOpts = opts.API.buildSlideOpts( slide ); | ||
+ | |||
+ | if ( prepend ) | ||
+ | opts.slides = $( slide ).add( opts.slides ); | ||
+ | else | ||
+ | opts.slides = opts.slides.add( slide ); | ||
+ | |||
+ | opts.API.initSlide( slideOpts, slide, --opts._maxZ ); | ||
+ | |||
+ | slide.data('cycle.opts', slideOpts); | ||
+ | opts.API.trigger('cycle-slide-added', [ opts, slideOpts, slide ]); | ||
+ | }); | ||
+ | |||
+ | opts.API.updateView( true ); | ||
+ | |||
+ | startSlideshow = opts._preInitialized && (oldSlideCount < 2 && opts.slideCount >= 1); | ||
+ | if ( startSlideshow ) { | ||
+ | if ( !opts._initialized ) | ||
+ | opts.API.initSlideshow(); | ||
+ | else if ( opts.timeout ) { | ||
+ | len = opts.slides.length; | ||
+ | opts.nextSlide = opts.reverse ? len - 1 : 1; | ||
+ | if ( !opts.timeoutId ) { | ||
+ | opts.API.queueTransition( opts ); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | }, | ||
+ | |||
+ | calcFirstSlide: function() { | ||
+ | var opts = this.opts(); | ||
+ | var firstSlideIndex; | ||
+ | firstSlideIndex = parseInt( opts.startingSlide || 0, 10 ); | ||
+ | if (firstSlideIndex >= opts.slides.length || firstSlideIndex < 0) | ||
+ | firstSlideIndex = 0; | ||
+ | |||
+ | opts.currSlide = firstSlideIndex; | ||
+ | if ( opts.reverse ) { | ||
+ | opts.nextSlide = firstSlideIndex - 1; | ||
+ | if (opts.nextSlide < 0) | ||
+ | opts.nextSlide = opts.slides.length - 1; | ||
+ | } | ||
+ | else { | ||
+ | opts.nextSlide = firstSlideIndex + 1; | ||
+ | if (opts.nextSlide == opts.slides.length) | ||
+ | opts.nextSlide = 0; | ||
+ | } | ||
+ | }, | ||
+ | |||
+ | calcNextSlide: function() { | ||
+ | var opts = this.opts(); | ||
+ | var roll; | ||
+ | if ( opts.reverse ) { | ||
+ | roll = (opts.nextSlide - 1) < 0; | ||
+ | opts.nextSlide = roll ? opts.slideCount - 1 : opts.nextSlide-1; | ||
+ | opts.currSlide = roll ? 0 : opts.nextSlide+1; | ||
+ | } | ||
+ | else { | ||
+ | roll = (opts.nextSlide + 1) == opts.slides.length; | ||
+ | opts.nextSlide = roll ? 0 : opts.nextSlide+1; | ||
+ | opts.currSlide = roll ? opts.slides.length-1 : opts.nextSlide-1; | ||
+ | } | ||
+ | }, | ||
+ | |||
+ | calcTx: function( slideOpts, manual ) { | ||
+ | var opts = slideOpts; | ||
+ | var tx; | ||
+ | if ( manual && opts.manualFx ) | ||
+ | tx = $.fn.cycle.transitions[opts.manualFx]; | ||
+ | if ( !tx ) | ||
+ | tx = $.fn.cycle.transitions[opts.fx]; | ||
+ | |||
+ | if (!tx) { | ||
+ | tx = $.fn.cycle.transitions.fade; | ||
+ | opts.API.log('Transition "' + opts.fx + '" not found. Using fade.'); | ||
+ | } | ||
+ | return tx; | ||
+ | }, | ||
+ | |||
+ | prepareTx: function( manual, fwd ) { | ||
+ | var opts = this.opts(); | ||
+ | var after, curr, next, slideOpts, tx; | ||
+ | |||
+ | if ( opts.slideCount < 2 ) { | ||
+ | opts.timeoutId = 0; | ||
+ | return; | ||
+ | } | ||
+ | if ( manual && ( !opts.busy || opts.manualTrump ) ) { | ||
+ | opts.API.stopTransition(); | ||
+ | opts.busy = false; | ||
+ | clearTimeout(opts.timeoutId); | ||
+ | opts.timeoutId = 0; | ||
+ | } | ||
+ | if ( opts.busy ) | ||
+ | return; | ||
+ | if ( opts.timeoutId === 0 && !manual ) | ||
+ | return; | ||
+ | |||
+ | curr = opts.slides[opts.currSlide]; | ||
+ | next = opts.slides[opts.nextSlide]; | ||
+ | slideOpts = opts.API.getSlideOpts( opts.nextSlide ); | ||
+ | tx = opts.API.calcTx( slideOpts, manual ); | ||
+ | |||
+ | opts._tx = tx; | ||
+ | |||
+ | if ( manual && slideOpts.manualSpeed !== undefined ) | ||
+ | slideOpts.speed = slideOpts.manualSpeed; | ||
+ | |||
+ | // if ( opts.nextSlide === opts.currSlide ) | ||
+ | // opts.API.calcNextSlide(); | ||
+ | |||
+ | // ensure that: | ||
+ | // 1. advancing to a different slide | ||
+ | // 2. this is either a manual event (prev/next, pager, cmd) or | ||
+ | // a timer event and slideshow is not paused | ||
+ | if ( opts.nextSlide != opts.currSlide && | ||
+ | (manual || (!opts.paused && !opts.hoverPaused && opts.timeout) )) { // #62 | ||
+ | |||
+ | opts.API.trigger('cycle-before', [ slideOpts, curr, next, fwd ]); | ||
+ | if ( tx.before ) | ||
+ | tx.before( slideOpts, curr, next, fwd ); | ||
+ | |||
+ | after = function() { | ||
+ | opts.busy = false; | ||
+ | // #76; bail if slideshow has been destroyed | ||
+ | if (! opts.container.data( 'cycle.opts' ) ) | ||
+ | return; | ||
+ | |||
+ | if (tx.after) | ||
+ | tx.after( slideOpts, curr, next, fwd ); | ||
+ | opts.API.trigger('cycle-after', [ slideOpts, curr, next, fwd ]); | ||
+ | opts.API.queueTransition( slideOpts); | ||
+ | opts.API.updateView( true ); | ||
+ | }; | ||
+ | |||
+ | opts.busy = true; | ||
+ | if (tx.transition) | ||
+ | tx.transition(slideOpts, curr, next, fwd, after); | ||
+ | else | ||
+ | opts.API.doTransition( slideOpts, curr, next, fwd, after); | ||
+ | |||
+ | opts.API.calcNextSlide(); | ||
+ | opts.API.updateView(); | ||
+ | } else { | ||
+ | opts.API.queueTransition( slideOpts ); | ||
+ | } | ||
+ | }, | ||
+ | |||
+ | // perform the actual animation | ||
+ | doTransition: function( slideOpts, currEl, nextEl, fwd, callback) { | ||
+ | var opts = slideOpts; | ||
+ | var curr = $(currEl), next = $(nextEl); | ||
+ | var fn = function() { | ||
+ | // make sure animIn has something so that callback doesn't trigger immediately | ||
+ | next.animate(opts.animIn || { opacity: 1}, opts.speed, opts.easeIn || opts.easing, callback); | ||
+ | }; | ||
+ | |||
+ | next.css(opts.cssBefore || {}); | ||
+ | curr.animate(opts.animOut || {}, opts.speed, opts.easeOut || opts.easing, function() { | ||
+ | curr.css(opts.cssAfter || {}); | ||
+ | if (!opts.sync) { | ||
+ | fn(); | ||
+ | } | ||
+ | }); | ||
+ | if (opts.sync) { | ||
+ | fn(); | ||
+ | } | ||
+ | }, | ||
+ | |||
+ | queueTransition: function( slideOpts, specificTimeout ) { | ||
+ | var opts = this.opts(); | ||
+ | var timeout = specificTimeout !== undefined ? specificTimeout : slideOpts.timeout; | ||
+ | if (opts.nextSlide === 0 && --opts.loop === 0) { | ||
+ | opts.API.log('terminating; loop=0'); | ||
+ | opts.timeout = 0; | ||
+ | if ( timeout ) { | ||
+ | setTimeout(function() { | ||
+ | opts.API.trigger('cycle-finished', [ opts ]); | ||
+ | }, timeout); | ||
+ | } | ||
+ | else { | ||
+ | opts.API.trigger('cycle-finished', [ opts ]); | ||
+ | } | ||
+ | // reset nextSlide | ||
+ | opts.nextSlide = opts.currSlide; | ||
+ | return; | ||
+ | } | ||
+ | if ( timeout ) { | ||
+ | opts._lastQueue = $.now(); | ||
+ | if ( specificTimeout === undefined ) | ||
+ | opts._remainingTimeout = slideOpts.timeout; | ||
+ | |||
+ | if ( !opts.paused && ! opts.hoverPaused ) { | ||
+ | opts.timeoutId = setTimeout(function() { | ||
+ | opts.API.prepareTx( false, !opts.reverse ); | ||
+ | }, timeout ); | ||
+ | } | ||
+ | } | ||
+ | }, | ||
+ | |||
+ | stopTransition: function() { | ||
+ | var opts = this.opts(); | ||
+ | if ( opts.slides.filter(':animated').length ) { | ||
+ | opts.slides.stop(false, true); | ||
+ | opts.API.trigger('cycle-transition-stopped', [ opts ]); | ||
+ | } | ||
+ | |||
+ | if ( opts._tx && opts._tx.stopTransition ) | ||
+ | opts._tx.stopTransition( opts ); | ||
+ | }, | ||
+ | |||
+ | // advance slide forward or back | ||
+ | advanceSlide: function( val ) { | ||
+ | var opts = this.opts(); | ||
+ | clearTimeout(opts.timeoutId); | ||
+ | opts.timeoutId = 0; | ||
+ | opts.nextSlide = opts.currSlide + val; | ||
+ | |||
+ | if (opts.nextSlide < 0) | ||
+ | opts.nextSlide = opts.slides.length - 1; | ||
+ | else if (opts.nextSlide >= opts.slides.length) | ||
+ | opts.nextSlide = 0; | ||
+ | |||
+ | opts.API.prepareTx( true, val >= 0 ); | ||
+ | return false; | ||
+ | }, | ||
+ | |||
+ | buildSlideOpts: function( slide ) { | ||
+ | var opts = this.opts(); | ||
+ | var val, shortName; | ||
+ | var slideOpts = slide.data() || {}; | ||
+ | for (var p in slideOpts) { | ||
+ | // allow props to be accessed sans 'cycle' prefix and log the overrides | ||
+ | if (slideOpts.hasOwnProperty(p) && /^cycle[A-Z]+/.test(p) ) { | ||
+ | val = slideOpts[p]; | ||
+ | shortName = p.match(/^cycle(.*)/)[1].replace(/^[A-Z]/, lowerCase); | ||
+ | opts.API.log('['+(opts.slideCount-1)+']', shortName+':', val, '('+typeof val +')'); | ||
+ | slideOpts[shortName] = val; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | slideOpts = $.extend( {}, $.fn.cycle.defaults, opts, slideOpts ); | ||
+ | slideOpts.slideNum = opts.slideCount; | ||
+ | |||
+ | try { | ||
+ | // these props should always be read from the master state object | ||
+ | delete slideOpts.API; | ||
+ | delete slideOpts.slideCount; | ||
+ | delete slideOpts.currSlide; | ||
+ | delete slideOpts.nextSlide; | ||
+ | delete slideOpts.slides; | ||
+ | } catch(e) { | ||
+ | // no op | ||
+ | } | ||
+ | return slideOpts; | ||
+ | }, | ||
+ | |||
+ | getSlideOpts: function( index ) { | ||
+ | var opts = this.opts(); | ||
+ | if ( index === undefined ) | ||
+ | index = opts.currSlide; | ||
+ | |||
+ | var slide = opts.slides[index]; | ||
+ | var slideOpts = $(slide).data('cycle.opts'); | ||
+ | return $.extend( {}, opts, slideOpts ); | ||
+ | }, | ||
+ | |||
+ | initSlide: function( slideOpts, slide, suggestedZindex ) { | ||
+ | var opts = this.opts(); | ||
+ | slide.css( slideOpts.slideCss || {} ); | ||
+ | if ( suggestedZindex > 0 ) | ||
+ | slide.css( 'zIndex', suggestedZindex ); | ||
+ | |||
+ | // ensure that speed settings are sane | ||
+ | if ( isNaN( slideOpts.speed ) ) | ||
+ | slideOpts.speed = $.fx.speeds[slideOpts.speed] || $.fx.speeds._default; | ||
+ | if ( !slideOpts.sync ) | ||
+ | slideOpts.speed = slideOpts.speed / 2; | ||
+ | |||
+ | slide.addClass( opts.slideClass ); | ||
+ | }, | ||
+ | |||
+ | updateView: function( isAfter, isDuring ) { | ||
+ | var opts = this.opts(); | ||
+ | if ( !opts._initialized ) | ||
+ | return; | ||
+ | var slideOpts = opts.API.getSlideOpts(); | ||
+ | var currSlide = opts.slides[ opts.currSlide ]; | ||
+ | |||
+ | if ( ! isAfter && isDuring !== true ) { | ||
+ | opts.API.trigger('cycle-update-view-before', [ opts, slideOpts, currSlide ]); | ||
+ | if ( opts.updateView < 0 ) | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | if ( opts.slideActiveClass ) { | ||
+ | opts.slides.removeClass( opts.slideActiveClass ) | ||
+ | .eq( opts.currSlide ).addClass( opts.slideActiveClass ); | ||
+ | } | ||
+ | |||
+ | if ( isAfter && opts.hideNonActive ) | ||
+ | opts.slides.filter( ':not(.' + opts.slideActiveClass + ')' ).hide(); | ||
+ | |||
+ | opts.API.trigger('cycle-update-view', [ opts, slideOpts, currSlide, isAfter ]); | ||
+ | |||
+ | if ( isAfter ) | ||
+ | opts.API.trigger('cycle-update-view-after', [ opts, slideOpts, currSlide ]); | ||
+ | }, | ||
+ | |||
+ | getComponent: function( name ) { | ||
+ | var opts = this.opts(); | ||
+ | var selector = opts[name]; | ||
+ | if (typeof selector === 'string') { | ||
+ | // if selector is a child, sibling combinator, adjancent selector then use find, otherwise query full dom | ||
+ | return (/^\s*[\>|\+|~]/).test( selector ) ? opts.container.find( selector ) : $( selector ); | ||
+ | } | ||
+ | if (selector.jquery) | ||
+ | return selector; | ||
+ | |||
+ | return $(selector); | ||
+ | }, | ||
+ | |||
+ | stackSlides: function( curr, next, fwd ) { | ||
+ | var opts = this.opts(); | ||
+ | if ( !curr ) { | ||
+ | curr = opts.slides[opts.currSlide]; | ||
+ | next = opts.slides[opts.nextSlide]; | ||
+ | fwd = !opts.reverse; | ||
+ | } | ||
+ | |||
+ | // reset the zIndex for the common case: | ||
+ | // curr slide on top, next slide beneath, and the rest in order to be shown | ||
+ | $(curr).css('zIndex', opts.maxZ); | ||
+ | |||
+ | var i; | ||
+ | var z = opts.maxZ - 2; | ||
+ | var len = opts.slideCount; | ||
+ | if (fwd) { | ||
+ | for ( i = opts.currSlide + 1; i < len; i++ ) | ||
+ | $( opts.slides[i] ).css( 'zIndex', z-- ); | ||
+ | for ( i = 0; i < opts.currSlide; i++ ) | ||
+ | $( opts.slides[i] ).css( 'zIndex', z-- ); | ||
+ | } | ||
+ | else { | ||
+ | for ( i = opts.currSlide - 1; i >= 0; i-- ) | ||
+ | $( opts.slides[i] ).css( 'zIndex', z-- ); | ||
+ | for ( i = len - 1; i > opts.currSlide; i-- ) | ||
+ | $( opts.slides[i] ).css( 'zIndex', z-- ); | ||
+ | } | ||
+ | |||
+ | $(next).css('zIndex', opts.maxZ - 1); | ||
+ | }, | ||
+ | |||
+ | getSlideIndex: function( el ) { | ||
+ | return this.opts().slides.index( el ); | ||
+ | } | ||
+ | |||
+ | }; // API | ||
+ | |||
+ | // default logger | ||
+ | $.fn.cycle.log = function log() { | ||
+ | /*global console:true */ | ||
+ | if (window.console && console.log) | ||
+ | console.log('[cycle2] ' + Array.prototype.join.call(arguments, ' ') ); | ||
+ | }; | ||
+ | |||
+ | $.fn.cycle.version = function() { return 'Cycle2: ' + version; }; | ||
+ | |||
+ | // helper functions | ||
+ | |||
+ | function lowerCase(s) { | ||
+ | return (s || '').toLowerCase(); | ||
+ | } | ||
+ | |||
+ | // expose transition object | ||
+ | $.fn.cycle.transitions = { | ||
+ | custom: { | ||
+ | }, | ||
+ | none: { | ||
+ | before: function( opts, curr, next, fwd ) { | ||
+ | opts.API.stackSlides( next, curr, fwd ); | ||
+ | opts.cssBefore = { opacity: 1, display: 'block' }; | ||
+ | } | ||
+ | }, | ||
+ | fade: { | ||
+ | before: function( opts, curr, next, fwd ) { | ||
+ | var css = opts.API.getSlideOpts( opts.nextSlide ).slideCss || {}; | ||
+ | opts.API.stackSlides( curr, next, fwd ); | ||
+ | opts.cssBefore = $.extend(css, { opacity: 0, display: 'block' }); | ||
+ | opts.animIn = { opacity: 1 }; | ||
+ | opts.animOut = { opacity: 0 }; | ||
+ | } | ||
+ | }, | ||
+ | fadeout: { | ||
+ | before: function( opts , curr, next, fwd ) { | ||
+ | var css = opts.API.getSlideOpts( opts.nextSlide ).slideCss || {}; | ||
+ | opts.API.stackSlides( curr, next, fwd ); | ||
+ | opts.cssBefore = $.extend(css, { opacity: 1, display: 'block' }); | ||
+ | opts.animOut = { opacity: 0 }; | ||
+ | } | ||
+ | }, | ||
+ | scrollHorz: { | ||
+ | before: function( opts, curr, next, fwd ) { | ||
+ | opts.API.stackSlides( curr, next, fwd ); | ||
+ | var w = opts.container.css('overflow','hidden').width(); | ||
+ | opts.cssBefore = { left: fwd ? w : - w, top: 0, opacity: 1, display: 'block' }; | ||
+ | opts.cssAfter = { zIndex: opts._maxZ - 2, left: 0 }; | ||
+ | opts.animIn = { left: 0 }; | ||
+ | opts.animOut = { left: fwd ? -w : w }; | ||
+ | } | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | // @see: http://jquery.malsup.com/cycle2/api | ||
+ | $.fn.cycle.defaults = { | ||
+ | allowWrap: true, | ||
+ | autoSelector: '.cycle-slideshow[data-cycle-auto-init!=false]', | ||
+ | delay: 0, | ||
+ | easing: null, | ||
+ | fx: 'fade', | ||
+ | hideNonActive: true, | ||
+ | loop: 0, | ||
+ | manualFx: undefined, | ||
+ | manualSpeed: undefined, | ||
+ | manualTrump: true, | ||
+ | maxZ: 100, | ||
+ | pauseOnHover: false, | ||
+ | reverse: false, | ||
+ | slideActiveClass: 'cycle-slide-active', | ||
+ | slideClass: 'cycle-slide', | ||
+ | slideCss: { position: 'absolute', top: 0, left: 0 }, | ||
+ | slides: '> img', | ||
+ | speed: 500, | ||
+ | startingSlide: 0, | ||
+ | sync: true, | ||
+ | timeout: 4000, | ||
+ | updateView: -1 | ||
+ | }; | ||
+ | |||
+ | // automatically find and run slideshows | ||
+ | $(document).ready(function() { | ||
+ | $( $.fn.cycle.defaults.autoSelector ).cycle(); | ||
+ | }); | ||
+ | |||
+ | })(jQuery); | ||
+ | |||
+ | /*! Cycle2 autoheight plugin; Copyright (c) M.Alsup, 2012; version: 20130304 */ | ||
+ | (function($) { | ||
+ | "use strict"; | ||
+ | |||
+ | $.extend($.fn.cycle.defaults, { | ||
+ | autoHeight: 0 // setting this option to false disables autoHeight logic | ||
+ | }); | ||
+ | |||
+ | $(document).on( 'cycle-initialized', function( e, opts ) { | ||
+ | var autoHeight = opts.autoHeight; | ||
+ | var t = $.type( autoHeight ); | ||
+ | var resizeThrottle = null; | ||
+ | var ratio; | ||
+ | |||
+ | if ( t !== 'string' && t !== 'number' ) | ||
+ | return; | ||
+ | |||
+ | // bind events | ||
+ | opts.container.on( 'cycle-slide-added cycle-slide-removed', initAutoHeight ); | ||
+ | opts.container.on( 'cycle-destroyed', onDestroy ); | ||
+ | |||
+ | if ( autoHeight == 'container' ) { | ||
+ | opts.container.on( 'cycle-before', onBefore ); | ||
+ | } | ||
+ | else if ( t === 'string' && /\d+\:\d+/.test( autoHeight ) ) { | ||
+ | // use ratio | ||
+ | ratio = autoHeight.match(/(\d+)\:(\d+)/); | ||
+ | ratio = ratio[1] / ratio[2]; | ||
+ | opts._autoHeightRatio = ratio; | ||
+ | } | ||
+ | |||
+ | // if autoHeight is a number then we don't need to recalculate the sentinel | ||
+ | // index on resize | ||
+ | if ( t !== 'number' ) { | ||
+ | // bind unique resize handler per slideshow (so it can be 'off-ed' in onDestroy) | ||
+ | opts._autoHeightOnResize = function () { | ||
+ | clearTimeout( resizeThrottle ); | ||
+ | resizeThrottle = setTimeout( onResize, 50 ); | ||
+ | }; | ||
+ | |||
+ | $(window).on( 'resize orientationchange', opts._autoHeightOnResize ); | ||
+ | } | ||
+ | |||
+ | setTimeout( onResize, 30 ); | ||
+ | |||
+ | function onResize() { | ||
+ | initAutoHeight( e, opts ); | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | function initAutoHeight( e, opts ) { | ||
+ | var clone, height, sentinelIndex; | ||
+ | var autoHeight = opts.autoHeight; | ||
+ | |||
+ | if ( autoHeight == 'container' ) { | ||
+ | height = $( opts.slides[ opts.currSlide ] ).outerHeight(); | ||
+ | opts.container.height( height ); | ||
+ | } | ||
+ | else if ( opts._autoHeightRatio ) { | ||
+ | opts.container.height( opts.container.width() / opts._autoHeightRatio ); | ||
+ | } | ||
+ | else if ( autoHeight === 'calc' || ( $.type( autoHeight ) == 'number' && autoHeight >= 0 ) ) { | ||
+ | if ( autoHeight === 'calc' ) | ||
+ | sentinelIndex = calcSentinelIndex( e, opts ); | ||
+ | else if ( autoHeight >= opts.slides.length ) | ||
+ | sentinelIndex = 0; | ||
+ | else | ||
+ | sentinelIndex = autoHeight; | ||
+ | |||
+ | // only recreate sentinel if index is different | ||
+ | if ( sentinelIndex == opts._sentinelIndex ) | ||
+ | return; | ||
+ | |||
+ | opts._sentinelIndex = sentinelIndex; | ||
+ | if ( opts._sentinel ) | ||
+ | opts._sentinel.remove(); | ||
+ | |||
+ | // clone existing slide as sentinel | ||
+ | clone = $( opts.slides[ sentinelIndex ].cloneNode(true) ); | ||
+ | |||
+ | // #50; remove special attributes from cloned content | ||
+ | clone.removeAttr( 'id name rel' ).find( '[id],[name],[rel]' ).removeAttr( 'id name rel' ); | ||
+ | |||
+ | clone.css({ | ||
+ | position: 'static', | ||
+ | visibility: 'hidden', | ||
+ | display: 'block' | ||
+ | }).prependTo( opts.container ).addClass('cycle-sentinel cycle-slide').removeClass('cycle-slide-active'); | ||
+ | clone.find( '*' ).css( 'visibility', 'hidden' ); | ||
+ | |||
+ | opts._sentinel = clone; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function calcSentinelIndex( e, opts ) { | ||
+ | var index = 0, max = -1; | ||
+ | |||
+ | // calculate tallest slide index | ||
+ | opts.slides.each(function(i) { | ||
+ | var h = $(this).height(); | ||
+ | if ( h > max ) { | ||
+ | max = h; | ||
+ | index = i; | ||
+ | } | ||
+ | }); | ||
+ | return index; | ||
+ | } | ||
+ | |||
+ | function onBefore( e, opts, outgoing, incoming, forward ) { | ||
+ | var h = $(incoming).outerHeight(); | ||
+ | var duration = opts.sync ? opts.speed / 2 : opts.speed; | ||
+ | opts.container.animate( { height: h }, duration ); | ||
+ | } | ||
+ | |||
+ | function onDestroy( e, opts ) { | ||
+ | if ( opts._autoHeightOnResize ) { | ||
+ | $(window).off( 'resize orientationchange', opts._autoHeightOnResize ); | ||
+ | opts._autoHeightOnResize = null; | ||
+ | } | ||
+ | opts.container.off( 'cycle-slide-added cycle-slide-removed', initAutoHeight ); | ||
+ | opts.container.off( 'cycle-destroyed', onDestroy ); | ||
+ | opts.container.off( 'cycle-before', onBefore ); | ||
+ | |||
+ | if ( opts._sentinel ) { | ||
+ | opts._sentinel.remove(); | ||
+ | opts._sentinel = null; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | })(jQuery); | ||
+ | |||
+ | /*! caption plugin for Cycle2; version: 20130306 */ | ||
+ | (function($) { | ||
+ | "use strict"; | ||
+ | |||
+ | $.extend($.fn.cycle.defaults, { | ||
+ | caption: '> .cycle-caption', | ||
+ | captionTemplate: '{{slideNum}} / {{slideCount}}', | ||
+ | overlay: '> .cycle-overlay', | ||
+ | overlayTemplate: '<div>{{title}}</div><div>{{desc}}</div>', | ||
+ | captionModule: 'caption' | ||
+ | }); | ||
+ | |||
+ | $(document).on( 'cycle-update-view', function( e, opts, slideOpts, currSlide ) { | ||
+ | if ( opts.captionModule !== 'caption' ) | ||
+ | return; | ||
+ | var el; | ||
+ | $.each(['caption','overlay'], function() { | ||
+ | var name = this; | ||
+ | var template = slideOpts[name+'Template']; | ||
+ | var el = opts.API.getComponent( name ); | ||
+ | if( el.length && template ) { | ||
+ | el.html( opts.API.tmpl( template, slideOpts, opts, currSlide ) ); | ||
+ | el.show(); | ||
+ | } | ||
+ | else { | ||
+ | el.hide(); | ||
+ | } | ||
+ | }); | ||
+ | }); | ||
+ | |||
+ | $(document).on( 'cycle-destroyed', function( e, opts ) { | ||
+ | var el; | ||
+ | $.each(['caption','overlay'], function() { | ||
+ | var name = this, template = opts[name+'Template']; | ||
+ | if ( opts[name] && template ) { | ||
+ | el = opts.API.getComponent( 'caption' ); | ||
+ | el.empty(); | ||
+ | } | ||
+ | }); | ||
+ | }); | ||
+ | |||
+ | })(jQuery); | ||
+ | |||
+ | /*! command plugin for Cycle2; version: 20130707 */ | ||
+ | (function($) { | ||
+ | "use strict"; | ||
+ | |||
+ | var c2 = $.fn.cycle; | ||
+ | |||
+ | $.fn.cycle = function( options ) { | ||
+ | var cmd, cmdFn, opts; | ||
+ | var args = $.makeArray( arguments ); | ||
+ | |||
+ | if ( $.type( options ) == 'number' ) { | ||
+ | return this.cycle( 'goto', options ); | ||
+ | } | ||
+ | |||
+ | if ( $.type( options ) == 'string' ) { | ||
+ | return this.each(function() { | ||
+ | var cmdArgs; | ||
+ | cmd = options; | ||
+ | opts = $(this).data('cycle.opts'); | ||
+ | |||
+ | if ( opts === undefined ) { | ||
+ | c2.log('slideshow must be initialized before sending commands; "' + cmd + '" ignored'); | ||
+ | return; | ||
+ | } | ||
+ | else { | ||
+ | cmd = cmd == 'goto' ? 'jump' : cmd; // issue #3; change 'goto' to 'jump' internally | ||
+ | cmdFn = opts.API[ cmd ]; | ||
+ | if ( $.isFunction( cmdFn )) { | ||
+ | cmdArgs = $.makeArray( args ); | ||
+ | cmdArgs.shift(); | ||
+ | return cmdFn.apply( opts.API, cmdArgs ); | ||
+ | } | ||
+ | else { | ||
+ | c2.log( 'unknown command: ', cmd ); | ||
+ | } | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | else { | ||
+ | return c2.apply( this, arguments ); | ||
+ | } | ||
+ | }; | ||
+ | |||
+ | // copy props | ||
+ | $.extend( $.fn.cycle, c2 ); | ||
+ | |||
+ | $.extend( c2.API, { | ||
+ | next: function() { | ||
+ | var opts = this.opts(); | ||
+ | if ( opts.busy && ! opts.manualTrump ) | ||
+ | return; | ||
+ | |||
+ | var count = opts.reverse ? -1 : 1; | ||
+ | if ( opts.allowWrap === false && ( opts.currSlide + count ) >= opts.slideCount ) | ||
+ | return; | ||
+ | |||
+ | opts.API.advanceSlide( count ); | ||
+ | opts.API.trigger('cycle-next', [ opts ]).log('cycle-next'); | ||
+ | }, | ||
+ | |||
+ | prev: function() { | ||
+ | var opts = this.opts(); | ||
+ | if ( opts.busy && ! opts.manualTrump ) | ||
+ | return; | ||
+ | var count = opts.reverse ? 1 : -1; | ||
+ | if ( opts.allowWrap === false && ( opts.currSlide + count ) < 0 ) | ||
+ | return; | ||
+ | |||
+ | opts.API.advanceSlide( count ); | ||
+ | opts.API.trigger('cycle-prev', [ opts ]).log('cycle-prev'); | ||
+ | }, | ||
+ | |||
+ | destroy: function() { | ||
+ | this.stop(); //#204 | ||
+ | |||
+ | var opts = this.opts(); | ||
+ | var clean = $.isFunction( $._data ) ? $._data : $.noop; // hack for #184 and #201 | ||
+ | clearTimeout(opts.timeoutId); | ||
+ | opts.timeoutId = 0; | ||
+ | opts.API.stop(); | ||
+ | opts.API.trigger( 'cycle-destroyed', [ opts ] ).log('cycle-destroyed'); | ||
+ | opts.container.removeData(); | ||
+ | clean( opts.container[0], 'parsedAttrs', false ); | ||
+ | |||
+ | // #75; remove inline styles | ||
+ | if ( ! opts.retainStylesOnDestroy ) { | ||
+ | opts.container.removeAttr( 'style' ); | ||
+ | opts.slides.removeAttr( 'style' ); | ||
+ | opts.slides.removeClass( opts.slideActiveClass ); | ||
+ | } | ||
+ | opts.slides.each(function() { | ||
+ | $(this).removeData(); | ||
+ | clean( this, 'parsedAttrs', false ); | ||
+ | }); | ||
+ | }, | ||
+ | |||
+ | jump: function( index ) { | ||
+ | // go to the requested slide | ||
+ | var fwd; | ||
+ | var opts = this.opts(); | ||
+ | if ( opts.busy && ! opts.manualTrump ) | ||
+ | return; | ||
+ | var num = parseInt( index, 10 ); | ||
+ | if (isNaN(num) || num < 0 || num >= opts.slides.length) { | ||
+ | opts.API.log('goto: invalid slide index: ' + num); | ||
+ | return; | ||
+ | } | ||
+ | if (num == opts.currSlide) { | ||
+ | opts.API.log('goto: skipping, already on slide', num); | ||
+ | return; | ||
+ | } | ||
+ | opts.nextSlide = num; | ||
+ | clearTimeout(opts.timeoutId); | ||
+ | opts.timeoutId = 0; | ||
+ | opts.API.log('goto: ', num, ' (zero-index)'); | ||
+ | fwd = opts.currSlide < opts.nextSlide; | ||
+ | opts.API.prepareTx( true, fwd ); | ||
+ | }, | ||
+ | |||
+ | stop: function() { | ||
+ | var opts = this.opts(); | ||
+ | var pauseObj = opts.container; | ||
+ | clearTimeout(opts.timeoutId); | ||
+ | opts.timeoutId = 0; | ||
+ | opts.API.stopTransition(); | ||
+ | if ( opts.pauseOnHover ) { | ||
+ | if ( opts.pauseOnHover !== true ) | ||
+ | pauseObj = $( opts.pauseOnHover ); | ||
+ | pauseObj.off('mouseenter mouseleave'); | ||
+ | } | ||
+ | opts.API.trigger('cycle-stopped', [ opts ]).log('cycle-stopped'); | ||
+ | }, | ||
+ | |||
+ | reinit: function() { | ||
+ | var opts = this.opts(); | ||
+ | opts.API.destroy(); | ||
+ | opts.container.cycle(); | ||
+ | }, | ||
+ | |||
+ | remove: function( index ) { | ||
+ | var opts = this.opts(); | ||
+ | var slide, slideToRemove, slides = [], slideNum = 1; | ||
+ | for ( var i=0; i < opts.slides.length; i++ ) { | ||
+ | slide = opts.slides[i]; | ||
+ | if ( i == index ) { | ||
+ | slideToRemove = slide; | ||
+ | } | ||
+ | else { | ||
+ | slides.push( slide ); | ||
+ | $( slide ).data('cycle.opts').slideNum = slideNum; | ||
+ | slideNum++; | ||
+ | } | ||
+ | } | ||
+ | if ( slideToRemove ) { | ||
+ | opts.slides = $( slides ); | ||
+ | opts.slideCount--; | ||
+ | $( slideToRemove ).remove(); | ||
+ | if (index == opts.currSlide) | ||
+ | opts.API.advanceSlide( 1 ); | ||
+ | else if ( index < opts.currSlide ) | ||
+ | opts.currSlide--; | ||
+ | else | ||
+ | opts.currSlide++; | ||
+ | |||
+ | opts.API.trigger('cycle-slide-removed', [ opts, index, slideToRemove ]).log('cycle-slide-removed'); | ||
+ | opts.API.updateView(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | }); | ||
+ | |||
+ | // listen for clicks on elements with data-cycle-cmd attribute | ||
+ | $(document).on('click.cycle', '[data-cycle-cmd]', function(e) { | ||
+ | // issue cycle command | ||
+ | e.preventDefault(); | ||
+ | var el = $(this); | ||
+ | var command = el.data('cycle-cmd'); | ||
+ | var context = el.data('cycle-context') || '.cycle-slideshow'; | ||
+ | $(context).cycle(command, el.data('cycle-arg')); | ||
+ | }); | ||
+ | |||
+ | |||
+ | })(jQuery); | ||
+ | |||
+ | /*! hash plugin for Cycle2; version: 20130905 */ | ||
+ | (function($) { | ||
+ | "use strict"; | ||
+ | |||
+ | $(document).on( 'cycle-pre-initialize', function( e, opts ) { | ||
+ | onHashChange( opts, true ); | ||
+ | |||
+ | opts._onHashChange = function() { | ||
+ | onHashChange( opts, false ); | ||
+ | }; | ||
+ | |||
+ | $( window ).on( 'hashchange', opts._onHashChange); | ||
+ | }); | ||
+ | |||
+ | $(document).on( 'cycle-update-view', function( e, opts, slideOpts ) { | ||
+ | if ( slideOpts.hash && ( '#' + slideOpts.hash ) != window.location.hash ) { | ||
+ | opts._hashFence = true; | ||
+ | window.location.hash = slideOpts.hash; | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | $(document).on( 'cycle-destroyed', function( e, opts) { | ||
+ | if ( opts._onHashChange ) { | ||
+ | $( window ).off( 'hashchange', opts._onHashChange ); | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | function onHashChange( opts, setStartingSlide ) { | ||
+ | var hash; | ||
+ | if ( opts._hashFence ) { | ||
+ | opts._hashFence = false; | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | hash = window.location.hash.substring(1); | ||
+ | |||
+ | opts.slides.each(function(i) { | ||
+ | if ( $(this).data( 'cycle-hash' ) == hash ) { | ||
+ | if ( setStartingSlide === true ) { | ||
+ | opts.startingSlide = i; | ||
+ | } | ||
+ | else { | ||
+ | var fwd = opts.currSlide < i; | ||
+ | opts.nextSlide = i; | ||
+ | opts.API.prepareTx( true, fwd ); | ||
+ | } | ||
+ | return false; | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | })(jQuery); | ||
+ | |||
+ | /*! loader plugin for Cycle2; version: 20130307 */ | ||
+ | (function($) { | ||
+ | "use strict"; | ||
+ | |||
+ | $.extend($.fn.cycle.defaults, { | ||
+ | loader: false | ||
+ | }); | ||
+ | |||
+ | $(document).on( 'cycle-bootstrap', function( e, opts ) { | ||
+ | var addFn; | ||
+ | |||
+ | if ( !opts.loader ) | ||
+ | return; | ||
+ | |||
+ | // override API.add for this slideshow | ||
+ | addFn = opts.API.add; | ||
+ | opts.API.add = add; | ||
+ | |||
+ | function add( slides, prepend ) { | ||
+ | var slideArr = []; | ||
+ | if ( $.type( slides ) == 'string' ) | ||
+ | slides = $.trim( slides ); | ||
+ | else if ( $.type( slides) === 'array' ) { | ||
+ | for (var i=0; i < slides.length; i++ ) | ||
+ | slides[i] = $(slides[i])[0]; | ||
+ | } | ||
+ | |||
+ | slides = $( slides ); | ||
+ | var slideCount = slides.length; | ||
+ | |||
+ | if ( ! slideCount ) | ||
+ | return; | ||
+ | |||
+ | slides.hide().appendTo('body').each(function(i) { // appendTo fixes #56 | ||
+ | var count = 0; | ||
+ | var slide = $(this); | ||
+ | var images = slide.is('img') ? slide : slide.find('img'); | ||
+ | slide.data('index', i); | ||
+ | // allow some images to be marked as unimportant (and filter out images w/o src value) | ||
+ | images = images.filter(':not(.cycle-loader-ignore)').filter(':not([src=""])'); | ||
+ | if ( ! images.length ) { | ||
+ | --slideCount; | ||
+ | slideArr.push( slide ); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | count = images.length; | ||
+ | images.each(function() { | ||
+ | // add images that are already loaded | ||
+ | if ( this.complete ) { | ||
+ | imageLoaded(); | ||
+ | } | ||
+ | else { | ||
+ | $(this).load(function() { | ||
+ | imageLoaded(); | ||
+ | }).error(function() { | ||
+ | if ( --count === 0 ) { | ||
+ | // ignore this slide | ||
+ | opts.API.log('slide skipped; img not loaded:', this.src); | ||
+ | if ( --slideCount === 0 && opts.loader == 'wait') { | ||
+ | addFn.apply( opts.API, [ slideArr, prepend ] ); | ||
+ | } | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | function imageLoaded() { | ||
+ | if ( --count === 0 ) { | ||
+ | --slideCount; | ||
+ | addSlide( slide ); | ||
+ | } | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | if ( slideCount ) | ||
+ | opts.container.addClass('cycle-loading'); | ||
+ | |||
+ | |||
+ | function addSlide( slide ) { | ||
+ | var curr; | ||
+ | if ( opts.loader == 'wait' ) { | ||
+ | slideArr.push( slide ); | ||
+ | if ( slideCount === 0 ) { | ||
+ | // #59; sort slides into original markup order | ||
+ | slideArr.sort( sorter ); | ||
+ | addFn.apply( opts.API, [ slideArr, prepend ] ); | ||
+ | opts.container.removeClass('cycle-loading'); | ||
+ | } | ||
+ | } | ||
+ | else { | ||
+ | curr = $(opts.slides[opts.currSlide]); | ||
+ | addFn.apply( opts.API, [ slide, prepend ] ); | ||
+ | curr.show(); | ||
+ | opts.container.removeClass('cycle-loading'); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function sorter(a, b) { | ||
+ | return a.data('index') - b.data('index'); | ||
+ | } | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | })(jQuery); | ||
+ | |||
+ | /*! pager plugin for Cycle2; version: 20130525 */ | ||
+ | (function($) { | ||
+ | "use strict"; | ||
+ | |||
+ | $.extend($.fn.cycle.defaults, { | ||
+ | pager: '> .cycle-pager', | ||
+ | pagerActiveClass: 'cycle-pager-active', | ||
+ | pagerEvent: 'click.cycle', | ||
+ | pagerTemplate: '<span>•</span>' | ||
+ | }); | ||
+ | |||
+ | $(document).on( 'cycle-bootstrap', function( e, opts, API ) { | ||
+ | // add method to API | ||
+ | API.buildPagerLink = buildPagerLink; | ||
+ | }); | ||
+ | |||
+ | $(document).on( 'cycle-slide-added', function( e, opts, slideOpts, slideAdded ) { | ||
+ | if ( opts.pager ) { | ||
+ | opts.API.buildPagerLink ( opts, slideOpts, slideAdded ); | ||
+ | opts.API.page = page; | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | $(document).on( 'cycle-slide-removed', function( e, opts, index, slideRemoved ) { | ||
+ | if ( opts.pager ) { | ||
+ | var pagers = opts.API.getComponent( 'pager' ); | ||
+ | pagers.each(function() { | ||
+ | var pager = $(this); | ||
+ | $( pager.children()[index] ).remove(); | ||
+ | }); | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | $(document).on( 'cycle-update-view', function( e, opts, slideOpts ) { | ||
+ | var pagers; | ||
+ | |||
+ | if ( opts.pager ) { | ||
+ | pagers = opts.API.getComponent( 'pager' ); | ||
+ | pagers.each(function() { | ||
+ | $(this).children().removeClass( opts.pagerActiveClass ) | ||
+ | .eq( opts.currSlide ).addClass( opts.pagerActiveClass ); | ||
+ | }); | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | $(document).on( 'cycle-destroyed', function( e, opts ) { | ||
+ | var pager = opts.API.getComponent( 'pager' ); | ||
+ | |||
+ | if ( pager ) { | ||
+ | pager.children().off( opts.pagerEvent ); // #202 | ||
+ | if ( opts.pagerTemplate ) | ||
+ | pager.empty(); | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | function buildPagerLink( opts, slideOpts, slide ) { | ||
+ | var pagerLink; | ||
+ | var pagers = opts.API.getComponent( 'pager' ); | ||
+ | pagers.each(function() { | ||
+ | var pager = $(this); | ||
+ | if ( slideOpts.pagerTemplate ) { | ||
+ | var markup = opts.API.tmpl( slideOpts.pagerTemplate, slideOpts, opts, slide[0] ); | ||
+ | pagerLink = $( markup ).appendTo( pager ); | ||
+ | } | ||
+ | else { | ||
+ | pagerLink = pager.children().eq( opts.slideCount - 1 ); | ||
+ | } | ||
+ | pagerLink.on( opts.pagerEvent, function(e) { | ||
+ | e.preventDefault(); | ||
+ | opts.API.page( pager, e.currentTarget); | ||
+ | }); | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | function page( pager, target ) { | ||
+ | /*jshint validthis:true */ | ||
+ | var opts = this.opts(); | ||
+ | if ( opts.busy && ! opts.manualTrump ) | ||
+ | return; | ||
+ | |||
+ | var index = pager.children().index( target ); | ||
+ | var nextSlide = index; | ||
+ | var fwd = opts.currSlide < nextSlide; | ||
+ | if (opts.currSlide == nextSlide) { | ||
+ | return; // no op, clicked pager for the currently displayed slide | ||
+ | } | ||
+ | opts.nextSlide = nextSlide; | ||
+ | opts.API.prepareTx( true, fwd ); | ||
+ | opts.API.trigger('cycle-pager-activated', [opts, pager, target ]); | ||
+ | } | ||
+ | |||
+ | })(jQuery); | ||
+ | |||
+ | |||
+ | /*! prevnext plugin for Cycle2; version: 20130709 */ | ||
+ | (function($) { | ||
+ | "use strict"; | ||
+ | |||
+ | $.extend($.fn.cycle.defaults, { | ||
+ | next: '> .cycle-next', | ||
+ | nextEvent: 'click.cycle', | ||
+ | disabledClass: 'disabled', | ||
+ | prev: '> .cycle-prev', | ||
+ | prevEvent: 'click.cycle', | ||
+ | swipe: false | ||
+ | }); | ||
+ | |||
+ | $(document).on( 'cycle-initialized', function( e, opts ) { | ||
+ | opts.API.getComponent( 'next' ).on( opts.nextEvent, function(e) { | ||
+ | e.preventDefault(); | ||
+ | opts.API.next(); | ||
+ | }); | ||
+ | |||
+ | opts.API.getComponent( 'prev' ).on( opts.prevEvent, function(e) { | ||
+ | e.preventDefault(); | ||
+ | opts.API.prev(); | ||
+ | }); | ||
+ | |||
+ | if ( opts.swipe ) { | ||
+ | var nextEvent = opts.swipeVert ? 'swipeUp.cycle' : 'swipeLeft.cycle swipeleft.cycle'; | ||
+ | var prevEvent = opts.swipeVert ? 'swipeDown.cycle' : 'swipeRight.cycle swiperight.cycle'; | ||
+ | opts.container.on( nextEvent, function(e) { | ||
+ | opts.API.next(); | ||
+ | }); | ||
+ | opts.container.on( prevEvent, function() { | ||
+ | opts.API.prev(); | ||
+ | }); | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | $(document).on( 'cycle-update-view', function( e, opts, slideOpts, currSlide ) { | ||
+ | if ( opts.allowWrap ) | ||
+ | return; | ||
+ | |||
+ | var cls = opts.disabledClass; | ||
+ | var next = opts.API.getComponent( 'next' ); | ||
+ | var prev = opts.API.getComponent( 'prev' ); | ||
+ | var prevBoundry = opts._prevBoundry || 0; | ||
+ | var nextBoundry = (opts._nextBoundry !== undefined)?opts._nextBoundry:opts.slideCount - 1; | ||
+ | |||
+ | if ( opts.currSlide == nextBoundry ) | ||
+ | next.addClass( cls ).prop( 'disabled', true ); | ||
+ | else | ||
+ | next.removeClass( cls ).prop( 'disabled', false ); | ||
+ | |||
+ | if ( opts.currSlide === prevBoundry ) | ||
+ | prev.addClass( cls ).prop( 'disabled', true ); | ||
+ | else | ||
+ | prev.removeClass( cls ).prop( 'disabled', false ); | ||
+ | }); | ||
+ | |||
+ | |||
+ | $(document).on( 'cycle-destroyed', function( e, opts ) { | ||
+ | opts.API.getComponent( 'prev' ).off( opts.nextEvent ); | ||
+ | opts.API.getComponent( 'next' ).off( opts.prevEvent ); | ||
+ | opts.container.off( 'swipeleft.cycle swiperight.cycle swipeLeft.cycle swipeRight.cycle swipeUp.cycle swipeDown.cycle' ); | ||
+ | }); | ||
+ | |||
+ | })(jQuery); | ||
+ | |||
+ | /*! progressive loader plugin for Cycle2; version: 20130315 */ | ||
+ | (function($) { | ||
+ | "use strict"; | ||
+ | |||
+ | $.extend($.fn.cycle.defaults, { | ||
+ | progressive: false | ||
+ | }); | ||
+ | |||
+ | $(document).on( 'cycle-pre-initialize', function( e, opts ) { | ||
+ | if ( !opts.progressive ) | ||
+ | return; | ||
+ | |||
+ | var API = opts.API; | ||
+ | var nextFn = API.next; | ||
+ | var prevFn = API.prev; | ||
+ | var prepareTxFn = API.prepareTx; | ||
+ | var type = $.type( opts.progressive ); | ||
+ | var slides, scriptEl; | ||
+ | |||
+ | if ( type == 'array' ) { | ||
+ | slides = opts.progressive; | ||
+ | } | ||
+ | else if ($.isFunction( opts.progressive ) ) { | ||
+ | slides = opts.progressive( opts ); | ||
+ | } | ||
+ | else if ( type == 'string' ) { | ||
+ | scriptEl = $( opts.progressive ); | ||
+ | slides = $.trim( scriptEl.html() ); | ||
+ | if ( !slides ) | ||
+ | return; | ||
+ | // is it json array? | ||
+ | if ( /^(\[)/.test( slides ) ) { | ||
+ | try { | ||
+ | slides = $.parseJSON( slides ); | ||
+ | } | ||
+ | catch(err) { | ||
+ | API.log( 'error parsing progressive slides', err ); | ||
+ | return; | ||
+ | } | ||
+ | } | ||
+ | else { | ||
+ | // plain text, split on delimeter | ||
+ | slides = slides.split( new RegExp( scriptEl.data('cycle-split') || '\n') ); | ||
+ | |||
+ | // #95; look for empty slide | ||
+ | if ( ! slides[ slides.length - 1 ] ) | ||
+ | slides.pop(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | if ( prepareTxFn ) { | ||
+ | API.prepareTx = function( manual, fwd ) { | ||
+ | var index, slide; | ||
+ | |||
+ | if ( manual || slides.length === 0 ) { | ||
+ | prepareTxFn.apply( opts.API, [ manual, fwd ] ); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | if ( fwd && opts.currSlide == ( opts.slideCount-1) ) { | ||
+ | slide = slides[ 0 ]; | ||
+ | slides = slides.slice( 1 ); | ||
+ | opts.container.one('cycle-slide-added', function(e, opts ) { | ||
+ | setTimeout(function() { | ||
+ | opts.API.advanceSlide( 1 ); | ||
+ | },50); | ||
+ | }); | ||
+ | opts.API.add( slide ); | ||
+ | } | ||
+ | else if ( !fwd && opts.currSlide === 0 ) { | ||
+ | index = slides.length-1; | ||
+ | slide = slides[ index ]; | ||
+ | slides = slides.slice( 0, index ); | ||
+ | opts.container.one('cycle-slide-added', function(e, opts ) { | ||
+ | setTimeout(function() { | ||
+ | opts.currSlide = 1; | ||
+ | opts.API.advanceSlide( -1 ); | ||
+ | },50); | ||
+ | }); | ||
+ | opts.API.add( slide, true ); | ||
+ | } | ||
+ | else { | ||
+ | prepareTxFn.apply( opts.API, [ manual, fwd ] ); | ||
+ | } | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | if ( nextFn ) { | ||
+ | API.next = function() { | ||
+ | var opts = this.opts(); | ||
+ | if ( slides.length && opts.currSlide == ( opts.slideCount - 1 ) ) { | ||
+ | var slide = slides[ 0 ]; | ||
+ | slides = slides.slice( 1 ); | ||
+ | opts.container.one('cycle-slide-added', function(e, opts ) { | ||
+ | nextFn.apply( opts.API ); | ||
+ | opts.container.removeClass('cycle-loading'); | ||
+ | }); | ||
+ | opts.container.addClass('cycle-loading'); | ||
+ | opts.API.add( slide ); | ||
+ | } | ||
+ | else { | ||
+ | nextFn.apply( opts.API ); | ||
+ | } | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | if ( prevFn ) { | ||
+ | API.prev = function() { | ||
+ | var opts = this.opts(); | ||
+ | if ( slides.length && opts.currSlide === 0 ) { | ||
+ | var index = slides.length-1; | ||
+ | var slide = slides[ index ]; | ||
+ | slides = slides.slice( 0, index ); | ||
+ | opts.container.one('cycle-slide-added', function(e, opts ) { | ||
+ | opts.currSlide = 1; | ||
+ | opts.API.advanceSlide( -1 ); | ||
+ | opts.container.removeClass('cycle-loading'); | ||
+ | }); | ||
+ | opts.container.addClass('cycle-loading'); | ||
+ | opts.API.add( slide, true ); | ||
+ | } | ||
+ | else { | ||
+ | prevFn.apply( opts.API ); | ||
+ | } | ||
+ | }; | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | })(jQuery); | ||
+ | |||
+ | /*! tmpl plugin for Cycle2; version: 20121227 */ | ||
+ | (function($) { | ||
+ | "use strict"; | ||
+ | |||
+ | $.extend($.fn.cycle.defaults, { | ||
+ | tmplRegex: '{{((.)?.*?)}}' | ||
+ | }); | ||
+ | |||
+ | $.extend($.fn.cycle.API, { | ||
+ | tmpl: function( str, opts /*, ... */) { | ||
+ | var regex = new RegExp( opts.tmplRegex || $.fn.cycle.defaults.tmplRegex, 'g' ); | ||
+ | var args = $.makeArray( arguments ); | ||
+ | args.shift(); | ||
+ | return str.replace(regex, function(_, str) { | ||
+ | var i, j, obj, prop, names = str.split('.'); | ||
+ | for (i=0; i < args.length; i++) { | ||
+ | obj = args[i]; | ||
+ | if ( ! obj ) | ||
+ | continue; | ||
+ | if (names.length > 1) { | ||
+ | prop = obj; | ||
+ | for (j=0; j < names.length; j++) { | ||
+ | obj = prop; | ||
+ | prop = prop[ names[j] ] || str; | ||
+ | } | ||
+ | } else { | ||
+ | prop = obj[str]; | ||
+ | } | ||
+ | |||
+ | if ($.isFunction(prop)) | ||
+ | return prop.apply(obj, args); | ||
+ | if (prop !== undefined && prop !== null && prop != str) | ||
+ | return prop; | ||
+ | } | ||
+ | return str; | ||
+ | }); | ||
+ | } | ||
+ | }); | ||
+ | |||
+ | })(jQuery); | ||
+ | |||
+ | </script> | ||
<div id="header"> | <div id="header"> |
Revision as of 14:46, 20 September 2013