PageSourceSearch

https://ugw.ru/wp-content/themes/clubber/js/cycle.js?ver=7.1.2

js ugw.ru collected 2026-10-02 17:40:57 UTC 39,548 bytes, 1,269 lines download raw bytes

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

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.