PageSourceSearch

https://www.haifeng-xu.com/sigma/js/jquery.nivo.slider.js

js haifeng-xu.com collected 2026-09-24 10:26:10 UTC 24,994 bytes, 694 lines download raw bytes

1/*
2 * jQuery Nivo Slider v2.7.1
3 * http://nivo.dev7studios.com
4 *
5 * Copyright 2011, Gilbert Pellegrom
6 * Free to use and abuse under the MIT license.
7 * http://www.opensource.org/licenses/mit-license.php
8 * 
9 * March 2010
10 */
11
12(function($) {
13
14    var NivoSlider = function(element, options){
15		//Defaults are below
16		var settings = $.extend({}, $.fn.nivoSlider.defaults, options);
17
18        //Useful variables. Play carefully.
19        var vars = {
20            currentSlide: 0,
21            currentImage: '',
22            totalSlides: 0,
23            running: false,
24            paused: false,
25            stop: false
26        };
27    
28        //Get this slider
29        var slider = $(element);
30        slider.data('nivo:vars', vars);
31        slider.css('position','relative');
32        slider.addClass('nivoSlider');
33        
34        //Find our slider children
35        var kids = slider.children();
36        kids.each(function() {
37            var child = $(this);
38            var link = '';
39            if(!child.is('img')){
40                if(child.is('a')){
41                    child.addClass('nivo-imageLink');
42                    link = child;
43                }
44                child = child.find('img:first');
45            }
46            //Get img width & height
47            var childWidth = child.width();
48            if(childWidth == 0) childWidth = child.attr('width');
49            var childHeight = child.height();
50            if(childHeight == 0) childHeight = child.attr('height');
51            //Resize the slider
52            if(childWidth > slider.width()){
53                slider.width(childWidth);
54            }
55            if(childHeight > slider.height()){
56                slider.height(childHeight);
57            }
58            if(link != ''){
59                link.css('display','none');
60            }
61            child.css('display','none');
62            vars.totalSlides++;
63        });
64        
65        //If randomStart
66        if(settings.randomStart){
67        	settings.startSlide = Math.floor(Math.random() * vars.totalSlides);
68        }
69        
70        //Set startSlide
71        if(settings.startSlide > 0){
72            if(settings.startSlide >= vars.totalSlides) settings.startSlide = vars.totalSlides - 1;
73            vars.currentSlide = settings.startSlide;
74        }
75        
76        //Get initial image
77        if($(kids[vars.currentSlide]).is('img')){
78            vars.currentImage = $(kids[vars.currentSlide]);
79        } else {
80            vars.currentImage = $(kids[vars.currentSlide]).find('img:first');
81        }
82        
83        //Show initial link
84        if($(kids[vars.currentSlide]).is('a')){
85            $(kids[vars.currentSlide]).css('display','block');
86        }
87        
88        //Set first background
89        slider.css('background','url("'+ vars.currentImage.attr('src') +'") no-repeat');
90
91        //Create caption
92        slider.append(
93            $('<div class="nivo-caption"><p></p></div>').css({ display:'none', opacity:settings.captionOpacity })
94        );		
95        
96        // Cross browser default caption opacity
97        $('.nivo-caption', slider).css('opacity', 0);
98		
99		// Process caption function
100		var processCaption = function(settings){
101			var nivoCaption = $('.nivo-caption', slider);
102			if(vars.currentImage.attr('title') != '' && vars.currentImage.attr('title') != undefined){
103				var title = vars.currentImage.attr('title');
104				if(title.substr(0,1) == '#') title = $(title).html();	
105
106				if(nivoCaption.css('opacity') != 0){
107					nivoCaption.find('p').stop().fadeTo(settings.animSpeed, 0, function(){
108						$(this).html(title);
109						$(this).stop().fadeTo(settings.animSpeed, 1);
110					});
111				} else {
112					nivoCaption.find('p').html(title);
113				}					
114				nivoCaption.stop().fadeTo(settings.animSpeed, settings.captionOpacity);
115			} else {
116				nivoCaption.stop().fadeTo(settings.animSpeed, 0);
117			}
118		}
119		
120        //Process initial  caption
121        processCaption(settings);
122        
123        //In the words of Super Mario "let's a go!"
124        var timer = 0;
125        if(!settings.manualAdvance && kids.length > 1){
126            timer = setInterval(function(){ nivoRun(slider, kids, settings, false); }, settings.pauseTime);
127        }
128
129        //Add Direction nav
130        if(settings.directionNav){
131            slider.append('<div class="nivo-directionNav"><a class="nivo-prevNav">'+ settings.prevText +'</a><a class="nivo-nextNav">'+ settings.nextText +'</a></div>');
132            
133            //Hide Direction nav
134            if(settings.directionNavHide){
135                $('.nivo-directionNav', slider).hide();
136                slider.hover(function(){
137                    $('.nivo-directionNav', slider).show();
138                }, function(){
139                    $('.nivo-directionNav', slider).hide();
140                });
141            }
142            
143            $('a.nivo-prevNav', slider).live('click', function(){
144                if(vars.running) return false;
145                clearInterval(timer);
146                timer = '';
147                vars.currentSlide -= 2;
148                nivoRun(slider, kids, settings, 'prev');
149            });
150            
151            $('a.nivo-nextNav', slider).live('click', function(){
152                if(vars.running) return false;
153                clearInterval(timer);
154                timer = '';
155                nivoRun(slider, kids, settings, 'next');
156            });
157        }
158        
159        //Add Control nav
160        if(settings.controlNav){
161            var nivoControl = $('<div class="nivo-controlNav"></div>');
162            slider.append(nivoControl);
163            for(var i = 0; i < kids.length; i++){
164                if(settings.controlNavThumbs){
165                    var child = kids.eq(i);
166                    if(!child.is('img')){
167                        child = child.find('img:first');
168                    }
169                    if (settings.controlNavThumbsFromRel) {
170                        nivoControl.append('<a class="nivo-control" rel="'+ i +'"><img src="'+ child.attr('rel') + '" alt="" /></a>');
171                    } else {
172                        nivoControl.append('<a class="nivo-control" rel="'+ i +'"><img src="'+ child.attr('src').replace(settings.controlNavThumbsSearch, settings.controlNavThumbsReplace) +'" alt="" /></a>');
173                    }
174                } else {
175                    nivoControl.append('<a class="nivo-control" rel="'+ i +'">'+ (i + 1) +'</a>');
176                }
177                
178            }
179            //Set initial active link
180            $('.nivo-controlNav a:eq('+ vars.currentSlide +')', slider).addClass('active');
181            
182            $('.nivo-controlNav a', slider).live('click', function(){
183                if(vars.running) return false;
184                if($(this).hasClass('active')) return false;
185                clearInterval(timer);
186                timer = '';
187                slider.css('background','url("'+ vars.currentImage.attr('src') +'") no-repeat');
188                vars.currentSlide = $(this).attr('rel') - 1;
189                nivoRun(slider, kids, settings, 'control');
190            });
191        }
192        
193        //Keyboard Navigation
194        if(settings.keyboardNav){
195            $(window).keypress(function(event){
196                //Left
197                if(event.keyCode == '37'){
198                    if(vars.running) return false;
199                    clearInterval(timer);
200                    timer = '';
201                    vars.currentSlide-=2;
202                    nivoRun(slider, kids, settings, 'prev');
203                }
204                //Right
205                if(event.keyCode == '39'){
206                    if(vars.running) return false;
207                    clearInterval(timer);
208                    timer = '';
209                    nivoRun(slider, kids, settings, 'next');
210                }
211            });
212        }
213        
214        //For pauseOnHover setting
215        if(settings.pauseOnHover){
216            slider.hover(function(){
217                vars.paused = true;
218                clearInterval(timer);
219                timer = '';
220            }, function(){
221                vars.paused = false;
222                //Restart the timer
223                if(timer == '' && !settings.manualAdvance){
224                    timer = setInterval(function(){ nivoRun(slider, kids, settings, false); }, settings.pauseTime);
225                }
226            });
227        }
228        
229        //Event when Animation finishes
230        slider.bind('nivo:animFinished', function(){ 
231            vars.running = false; 
232            //Hide child links
233            $(kids).each(function(){
234                if($(this).is('a')){
235                    $(this).css('display','none');
236                }
237            });
238            //Show current link
239            if($(kids[vars.currentSlide]).is('a')){
240                $(kids[vars.currentSlide]).css('display','block');
241            }
242            //Restart the timer
243            if(timer == '' && !vars.paused && !settings.manualAdvance){
244                timer = setInterval(function(){ nivoRun(slider, kids, settings, false); }, settings.pauseTime);
245            }
246            //Trigger the afterChange callback
247            settings.afterChange.call(this);
248        });
249        
250        // Add slices for slice animations
251        var createSlices = function(slider, settings, vars){
252            for(var i = 0; i < settings.slices; i++){
253				var sliceWidth = Math.round(slider.width()/settings.slices);
254				if(i == settings.slices-1){
255					slider.append(
256						$('<div class="nivo-slice"></div>').css({ 
257							left:(sliceWidth*i)+'px', width:(slider.width()-(sliceWidth*i))+'px',
258							height:'0px', 
259							opacity:'0', 
260							background: 'url("'+ vars.currentImage.attr('src') +'") no-repeat -'+ ((sliceWidth + (i * sliceWi
260dth)) - sliceWidth) +'px 0%'
261						})
262					);
263				} else {
264					slider.append(
265						$('<div class="nivo-slice"></div>').css({ 
266							left:(sliceWidth*i)+'px', width:sliceWidth+'px',
267							height:'0px', 
268							opacity:'0', 
269							background: 'url("'+ vars.currentImage.attr('src') +'") no-repeat -'+ ((sliceWidth + (i * sliceWidth)) - sliceWidth) +'px 0%'
270						})
271					);
272				}
273			}
274        }
275		
276		// Add boxes for box animations
277		var createBoxes = function(slider, settings, vars){
278			var boxWidth = Math.round(slider.width()/settings.boxCols);
279			var boxHeight = Math.round(slider.height()/settings.boxRows);
280			
281			for(var rows = 0; rows < settings.boxRows; rows++){
282				for(var cols = 0; cols < settings.boxCols; cols++){
283					if(cols == settings.boxCols-1){
284						slider.append(
285							$('<div class="nivo-box"></div>').css({ 
286								opacity:0,
287								left:(boxWidth*cols)+'px', 
288								top:(boxHeight*rows)+'px',
289								width:(slider.width()-(boxWidth*cols))+'px',
290								height:boxHeight+'px',
291								background: 'url("'+ vars.currentImage.attr('src') +'") no-repeat -'+ ((boxWidth + (cols * boxWidth)) - boxWidth) +'px -'+ ((boxHeight + (rows * boxHeight)) - boxHeight) +'px'
292							})
293						);
294					} else {
295						slider.append(
296							$('<div class="nivo-box"></div>').css({ 
297								opacity:0,
298								left:(boxWidth*cols)+'px', 
299								top:(boxHeight*rows)+'px',
300								width:boxWidth+'px',
301								height:boxHeight+'px',
302								background: 'url("'+ vars.currentImage.attr('src') +'") no-repeat -'+ ((boxWidth + (cols * boxWidth)) - boxWidth) +'px -'+ ((boxHeight + (rows * boxHeight)) - boxHeight) +'px'
303							})
304						);
305					}
306				}
307			}
308		}
309
310        // Private run method
311		var nivoRun = function(slider, kids, settings, nudge){
312			//Get our vars
313			var vars = slider.data('nivo:vars');
314            
315            //Trigger the lastSlide callback
316            if(vars && (vars.currentSlide == vars.totalSlides - 1)){ 
317				settings.lastSlide.call(this);
318			}
319            
320            // Stop
321			if((!vars || vars.stop) && !nudge) return false;
322			
323			//Trigger the beforeChange callback
324			settings.beforeChange.call(this);
325					
326			//Set current background before change
327			if(!nudge){
328				slider.css('background','url("'+ vars.currentImage.attr('src') +'") no-repeat');
329			} else {
330				if(nudge == 'prev'){
331					slider.css('background','url("'+ vars.currentImage.attr('src') +'") no-repeat');
332				}
333				if(nudge == 'next'){
334					slider.css('background','url("'+ vars.currentImage.attr('src') +'") no-repeat');
335				}
336			}
337			vars.currentSlide++;
338            //Trigger the slideshowEnd callback
339			if(vars.currentSlide == vars.totalSlides){ 
340				vars.currentSlide = 0;
341				settings.slideshowEnd.call(this);
342			}
343			if(vars.currentSlide < 0) vars.currentSlide = (vars.totalSlides - 1);
344			//Set vars.currentImage
345			if($(kids[vars.currentSlide]).is('img')){
346				vars.currentImage = $(kids[vars.currentSlide]);
347			} else {
348				vars.currentImage = $(kids[vars.currentSlide]).find('img:first');
349			}
350			
351			//Set active links
352			if(settings.controlNav){
353				$('.nivo-controlNav a', slider).removeClass('active');
354				$('.nivo-controlNav a:eq('+ vars.currentSlide +')', slider).addClass('active');
355			}
356			
357			//Process caption
358			processCaption(settings);
359			
360			// Remove any slices from last transition
361			$('.nivo-slice', slider).remove();
362			
363			// Remove any boxes from last transition
364			$('.nivo-box', slider).remove();
365			
366			var currentEffect = settings.effect;
367			//Generate random effect
368			if(settings.effect == 'random'){
369				var anims = new Array('sliceDownRight','sliceDownLeft','sliceUpRight','sliceUpLeft','sliceUpDown','sliceUpDownLeft','fold','fade',
370                'boxRandom','boxRain','boxRainReverse','boxRainGrow','boxRainGrowReverse');
371				currentEffect = anims[Math.floor(Math.random()*(anims.length + 1))];
372				if(currentEffect == undefined) currentEffect = 'fade';
373			}
374            
375            //Run random effect from specified set (eg: effect:'fold,fade')
376            if(settings.effect.indexOf(',') != -1){
377                var anims = settings.effect.split(',');
378                currentEffect = anims[Math.floor(Math.random()*(anims.length))];
379				if(currentEffect == undefined) currentEffect = 'fade';
380            }
381            
382            //Custom transition as defined by "data-transition" attribute
383            if(vars.currentImage.attr('data-transition')){
384            	currentEffect = vars.currentImage.attr('data-transition');
385            }
386		
387			//Run effects
388			vars.running = true;
389			if(currentEffect == 'sliceDown' || currentEffect == 'sliceDownRight' || currentEffect == 'sliceDownLeft'){
390				createSlices(slider, settings, vars);
391				var timeBuff = 0;
392				var i = 0;
393				var slices = $('.nivo-slice', slider);
394				if(currentEffect == 'sliceDownLeft') slices = $('.nivo-slice', slider)._reverse();
395				
396				slices.each(function(){
397					var slice = $(this);
398					slice.css({ 'top': '0px' });
399					if(i == settings.slices-1){
400						setTimeout(function(){
401							slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); });
402						}, (100 + timeBuff));
403					} else {
404						setTimeout(function(){
405							slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed);
406						}, (100 + timeBuff));
407					}
408					timeBuff += 50;
409					i++;
410				});
411			} 
412			else if(currentEffect == 'sliceUp' || currentEffect == 'sliceUpRight' || currentEffect == 'sliceUpLeft'){
413				createSlices(slider, settings, vars);
414				var timeBuff = 0;
415				var i = 0;
416				var slices = $('.nivo-slice', slider);
417				if(currentEffect == 'sliceUpLeft') slices = $('.nivo-slice', slider)._reverse();
418				
419				slices.each(function(){
420					var slice = $(this);
421					slice.css({ 'bottom': '0px' });
422					if(i == settings.slices-1){
423						setTimeout(function(){
424							slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); });
425						}, (100 + timeBuff));
426					} else {
427						setTimeout(function(){
428							slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed);
429						}, (100 + timeBuff));
430					}
431					timeBuff += 50;
432					i++;
433				});
434			} 
435			else if(currentEffect == 'sliceUpDown' || currentEffect == 'sliceUpDownRight' || currentEffect == 'sliceUpDownLeft'){
436				createSlices(slider, settings, vars);
437				var timeBuff = 0;
438				var i = 0;
439				var v = 0;
440				var slices = $('.nivo-slice', slider);
441				if(currentEffect == 'sliceUpDownLeft') slices = $('.nivo-slice', slider)._reverse();
442				
443				slices.each(function(){
444					var slice = $(this);
445					if(i == 0){
446						slice.css('top','0px');
447						i++;
448					} else {
449						slice.css('bottom','0px');
450						i = 0;
451					}
452					
453					if(v == settings.slices-1){
454						setTimeout(function(){
455							slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); });
456						}, (100 + timeBuff));
457					} else {
458						setTimeout(function(){
459							slice.animate({ height:'100%', opacity:'1.0' }, settings.animSpeed);
460						}, (100 + timeBuff));
461					}
462					timeBuff += 50;
463					v++;
464				});
465			} 
466			else if(currentEffect == 'fold'){
467				createSlices(slider, settings, vars);
468				var timeBuff = 0;
469				var i = 0;
470				
471				$('.nivo-slice', slider).each(function(){
472					var slice = $(this);
473					var origWidth = slice.width();
474					slice.css({ top:'0px', height:'100%', width:'0px' });
475					if(i == settings.slices-1){
476						setTimeout(function(){
477							slice.animate({ width:origWidth, opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); });
478						}, (100 + timeBuff));
479					} else {
480						setTimeout(function(){
481							slice.animate({ width:origWidth, opacity:'1.0' }, settings.animSpeed);
482						}, (100 + timeBuff));
483					}
484					timeBuff += 50;
485					i++;
486				});
487			}  
488			else if(currentEffect == 'fade'){
489				createSlices(slider, settings, vars);
490				
491				var firstSlice = $('.nivo-slice:first', slider);
492                firstSlice.css({
493                    'height': '100%',
494                    'width': slider.width() + 'px'
495                });
496    
497				firstSlice.animate({ opacity:'1.0' }, (settings.animSpeed*2), '', function(){ slider.trigger('nivo:animFinished'); });
498			}          
499            else if(currentEffect == 'slideInRight'){
500				createSlices(slider, settings, vars);
501				
502                var firstSlice = $('.nivo-slice:first', slider);
503                firstSlice.css({
504                    'height': '100%',
505                    'width': '0px',
506                    'opacity': '1'
507                });
508
509                firstSlice.animate({ width: slider.width() + 'px' }, (settings.animSpeed*2), '', function(){ slider.trigger('nivo:animFinished'); });
510            }
511            else if(currentEffect == 'slideInLeft'){
512				createSlices(slider, settings, vars);
513				
514                var firstSlice = $('.nivo-slice:first', slider);
515                firstSlice.css({
516                    'height': '100%',
517                    'width': '0px',
518                    'opacity': '1',
519                    'left': '',
520                    'right': '0px'
521                });
522
523                firstSlice.animate({ width: slider.width() + 'px' }, (settings.animSpeed*2), '', function(){ 
524                    // Reset positioning
525                    firstSlice.css({
526                        'left': '0px',
527                        'right': ''
528                    });
529                    slider.trigger('nivo:animFinished'); 
530                });
531            }
532			else if(currentEffect == 'boxRandom'){
533				createBoxes(slider, settings, vars);
534				
535				var totalBoxes = settings.boxCols * settings.boxRows;
536				var i = 0;
537				var timeBuff = 0;
538				
539				var boxes = shuffle($('.nivo-box', slider));
540				boxes.each(function(){
541					var box = $(this);
542					if(i == totalBoxes-1){
543						setTimeout(function(){
544							box.animate({ opacity:'1' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); });
545						}, (100 + timeBuff));
546					} else {
547						setTimeout(function(){
548							box.animate({ opacity:'1' }, settings.animSpeed);
549						}, (100 + timeBuff));
550					}
551					timeBuff += 20;
552					i++;
553				});
554			}
555			else if(currentEffect == 'boxRain' || currentEffect == 'boxRainReverse' || currentEffect == 'boxRainGrow' || currentEffect == 'boxRainGrowReverse'){
556				createBoxes(slider, settings, vars);
557				
558				var totalBoxes = settings.boxCols * settings.boxRows;
559				var i = 0;
560				var timeBuff = 0;
561				
562				// Split boxes into 2D array
563				var rowIndex = 0;
564				var colIndex = 0;
565				var box2Darr = new Array();
566				box2Darr[rowIndex] = new Array();
567				var boxes = $('.nivo-box', slider);
568				if(currentEffect == 'boxRainReverse' || currentEffect == 'boxRainGrowReverse'){
569					boxes = $('.nivo-box', slider)._reverse();
570				}
571				boxes.each(function(){
572					box2Darr[rowIndex][colIndex] = $(this);
573					colIndex++;
574					if(colIndex == settings.boxCols){
575						rowIndex++;
576						colIndex = 0;
577						box2Darr[rowIndex] = new Array();
578					}
579				});
580				
581				// Run animation
582				for(var cols = 0; cols < (settings.boxCols * 2); cols++){
583					var prevCol = cols;
584					for(var rows = 0; rows < settings.boxRows; rows++){
585						if(prevCol >= 0 && prevCol < settings.boxCols){
586							/* Due to some weird JS bug with loop vars 
587							being used in setTimeout, this is wrapped
588							with an anonymous function call */
589							(function(row, col, time, i, totalBoxes) {
590								var box = $(box2Darr[row][col]);
591                                var w = box.width();
592                                var h = box.height();
593                                if(currentEffect == 'boxRainGrow' || currentEffect == 'boxRainGrowReverse'){
594                                    box.width(0).height(0);
595                                }
596								if(i == totalBoxes-1){
597									setTimeout(function(){
598										box.animate({ opacity:'1', width:w, height:h }, settings.animSpeed/1.3, '', function(){ slider.trigger('nivo:animFinished'); });
599									}, (100 + time));
600								} else {
601									setTimeout(function(){
602										box.animate({ opacity:'1', width:w, height:h }, settings.animSpeed/1.3);
603									}, (100 + time));
604								}
605							})(rows, prevCol, timeBuff, i, totalBoxes);
606							i++;
607						}
608						prevCol--;
609					}
610					timeBuff += 100;
611				}
612			}
613		}
614		
615		// Shuffle an array
616		var shuffle = function(arr){
617			for(var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x);
618			return arr;
619		}
620        
621        // For debugging
622        var trace = function(msg){
623            if (this.console && typeof console.log != "undefined")
624                console.log(msg);
625        }
626        
627        // Start / Stop
628        this.stop = function(){
629            if(!$(element).data('nivo:vars').stop){
630                $(element).data('nivo:vars').stop = true;
631                trace('Stop Slider');
632            }
633        }
634        
635        this.start = function(){
636            if($(element).data('nivo:vars').stop){
637                $(element).data('nivo:vars').stop = false;
638                trace('Start Slider');
639            }
640        }
641        
642        //Trigger the afterLoad callback
643        settings.afterLoad.call(this);
644		
645		return this;
646    };
647        
648    $.fn.nivoSlider = function(options) {
649    
650        return this.each(function(key, value){
651            var element = $(this);
652            // Return early if this element already has a plugin instance
653            if (element.data('nivoslider')) return element.data('nivoslider');
654            // Pass options to plugin constructor
655            var nivoslider = new NivoSlider(this, options);
656            // Store plugin object in this element's data
657            element.data('nivoslider', nivoslider);
658        });
659
660	};
661	
662	//Default settings
663	$.fn.nivoSlider.defaults = {
664		effect: 'fade',
665		slices: 15,
666		boxCols: 8,
667		boxRows: 4,
668		animSpeed: 500,
669		pauseTime: 7000,
670		startSlide: 0,
671		directionNav: true,
672		directionNavHide: true,
673		controlNav: true,
674		controlNavThumbs: false,
675        controlNavThumbsFromRel: false,
676		controlNavThumbsSearch: '.jpg',
677		controlNavThumbsReplace: '_thumb.jpg',
678		keyboardNav: true,
679		pauseOnHover: true,
680		manualAdvance: false,
681		captionOpacity: 0.8,
682		prevText: 'Prev',
683		nextText: 'Next',
684		randomStart: false,
685		beforeChange: function(){},
686		afterChange: function(){},
687		slideshowEnd: function(){},
688        lastSlide: function(){},
689        afterLoad: function(){}
690	};
691	
692	$.fn._reverse = [].reverse;
693	
694})(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.