PageSourceSearch

https://www.dagensvastervik.se/Script/jquery.cycle2.all.min.js?ver=1

js dagensvastervik.se collected 2026-10-02 12:59:36 UTC 54,518 bytes, 1,547 lines download raw bytes

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

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.