PageSourceSearch

https://www.sirgroutnorthnj.com/js/slidesra.js

js sirgroutnorthnj.com collected 2026-10-04 21:03:04 UTC 50,518 bytes, 1,553 lines download raw bytes

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.