cycle2-rails 1.0.0 → 1.1.0

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