PageSourceSearch

https://dominiren.gr.jp/js/jquery.bxslider/jquery.bxslider.js?1611541998

js dominiren.gr.jp collected 2026-10-06 17:51:33 UTC 51,758 bytes, 1,379 lines download raw bytes

1/**
2 * BxSlider v4.1.2 - Fully loaded, responsive content slider
3 * http://bxslider.com
4 *
5 * Copyright 2014, Steven Wanderski - http://stevenwanderski.com - http://bxcreative.com
6 * Written while drinking Belgian ales and listening to jazz
7 *
8 * Released under the MIT license - http://opensource.org/licenses/MIT
9 */
10
11;(function($){
12
13	var plugin = {};
14
15	var defaults = {
16
17		// GENERAL
18		mode: 'horizontal',
19		slideSelector: '',
20		infiniteLoop: true,
21		hideControlOnEnd: false,
22		speed: 500,
23		easing: null,
24		slideMargin: 0,
25		startSlide: 0,
26		randomStart: false,
27		captions: false,
28		ticker: false,
29		tickerHover: false,
30		adaptiveHeight: false,
31		adaptiveHeightSpeed: 500,
32		video: false,
33		useCSS: true,
34		preloadImages: 'visible',
35		responsive: true,
36		slideZIndex: 50,
37		wrapperClass: 'bx-wrapper',
38
39		// TOUCH
40		touchEnabled: true,
41		swipeThreshold: 50,
42		oneToOneTouch: true,
43		preventDefaultSwipeX: true,
44		preventDefaultSwipeY: false,
45
46		// PAGER
47		pager: true,
48		pagerType: 'full',
49		pagerShortSeparator: ' / ',
50		pagerSelector: null,
51		buildPager: null,
52		pagerCustom: null,
53
54		// CONTROLS
55		controls: true,
56		nextText: 'Next',
57		prevText: 'Prev',
58		nextSelector: null,
59		prevSelector: null,
60		autoControls: false,
61		startText: 'Start',
62		stopText: 'Stop',
63		autoControlsCombine: false,
64		autoControlsSelector: null,
65
66		// AUTO
67		auto: false,
68		pause: 4000,
69		autoStart: true,
70		autoDirection: 'next',
71		autoHover: false,
72		autoDelay: 0,
73		autoSlideForOnePage: false,
74
75		// CAROUSEL
76		minSlides: 1,
77		maxSlides: 1,
78		moveSlides: 0,
79		slideWidth: 0,
80
81		// CALLBACKS
82		onSliderLoad: function() {},
83		onSlideBefore: function() {},
84		onSlideAfter: function() {},
85		onSlideNext: function() {},
86		onSlidePrev: function() {},
87		onSliderResize: function() {}
88	}
89
90	$.fn.bxSlider = function(options){
91
92		if(this.length == 0) return this;
93
94		// support mutltiple elements
95		if(this.length > 1){
96			this.each(function(){$(this).bxSlider(options)});
97			return this;
98		}
99
100		// create a namespace to be used throughout the plugin
101		var slider = {};
102		// set a reference to our slider element
103		var el = this;
104		plugin.el = this;
105
106		/**
107		 * Makes slideshow responsive
108		 */
109		// first get the original window dimens (thanks alot IE)
110		var windowWidth = $(window).width();
111		var windowHeight = $(window).height();
112
113
114
115		/**
116		 * ===================================================================================
117		 * = PRIVATE FUNCTIONS
118		 * ===================================================================================
119		 */
120
121		/**
122		 * Initializes namespace settings to be used throughout plugin
123		 */
124		var init = function(){
125			// merge user-supplied options with the defaults
126			slider.settings = $.extend({}, defaults, options);
127
128			// Fixed the slider number for resopinsive.
129			if(slider.settings.fixedSlides){
130				var fixedSlides = getFixedSlides();
131				slider.settings.minSlides = fixedSlides;
132				slider.settings.maxSlides = fixedSlides;
133			}
134
135			// parse slideWidth setting
136			slider.settings.slideWidth = parseInt(slider.settings.slideWidth);
137			// store the original children
138			slider.children = el.children(slider.settings.slideSelector);
139			// check if actual number of slides is less than minSlides / maxSlides
140			if(slider.children.length < slider.settings.minSlides) slider.settings.minSlides = slider.children.length;
141			if(slider.children.length < slider.settings.maxSlides) slider.settings.maxSlides = slider.children.length;
142			// if random start, set the startSlide setting to random number
143			if(slider.settings.randomStart) slider.settings.startSlide = Math.floor(Math.random() * slider.children.length);
144			// store active slide information
145			slider.active = { index: slider.settings.startSlide }
146			// store if the slider is in carousel mode (displaying / moving multiple slides)
147			slider.carousel = slider.settings.minSlides > 1 || slider.settings.maxSlides > 1;
148			// if carousel, force preloadImages = 'all'
149			if(slider.carousel) slider.settings.preloadImages = 'all';
150			// calculate the min / max width thresholds based on min / max number of slides
151			// used to setup and update carousel slides dimensions
152			slider.minThreshold = (slider.settings.minSlides * slider.settings.slideWidth) + ((slider.settings.minSlides - 1) * slider.settings.slideMargin);
153			slider.maxThreshold = (slider.settings.maxSlides * slider.settings.slideWidth) + ((slider.settings.maxSlides - 1) * slider.settings.slideMargin);
154			// store the current state of the slider (if currently animating, working is true)
155			slider.working = false;
156			// initialize the controls object
157			slider.controls = {};
158			// initialize an auto interval
159			slider.interval = null;
160			// determine which property to use for transitions
161			slider.animProp = slider.settings.mode == 'vertical' ? 'top' : 'left';
162			// determine if hardware acceleration can be used
163			slider.usingCSS = slider.settings.useCSS && slider.settings.mode != 'fade' && (function(){
164				// create our test div element
165				var div = document.createElement('div');
166				// css transition properties
167				var props = ['WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective'];
168				// test for each property
169				for(var i in props){
170					if(div.style[props[i]] !== undefined){
171						slider.cssPrefix = props[i].replace('Perspective', '').toLowerCase();
172						slider.animProp = '-' + slider.cssPrefix + '-transform';
173						return true;
174					}
175				}
176				return false;
177			}());
178			// if vertical mode always make maxSlides and minSlides equal
179			if(slider.settings.mode == 'vertical') slider.settings.maxSlides = slider.settings.minSlides;
180			// save original style data
181			el.data("origStyle", el.attr("style"));
182			el.children(slider.settings.slideSelector).each(function() {
183			  $(this).data("origStyle", $(this).attr("style"));
184			});
185
186			// perform all DOM / CSS modifications
187			setup();
188		}
189
190		var getFixedSlides = function(){
191			var fixedSlides = 0;
192			for(var i = 0; i < slider.settings.breakPoints.length; i++){
193				var bp = slider.settings.breakPoints[i];
194				if($(window).width() > bp){
195					return slider.settings.fixedSlides[i];
196				}
197			}
198			return slider.settings.fixedSlides[slider.settings.fixedSlides.length - 1];
199		}
200
201		/**
202		 * Performs all DOM and CSS modifications
203		 */
204		var setup = function(){
205			// wrap el in a wrapper
206			el.wrap('<div class="' + slider.settings.wrapperClass + '"><div class="bx-viewport"></div></div>');
207			// store a namspace reference to .bx-viewport
208			slider.viewport = el.parent();
209			// add a loading div to display while images are loading
210			slider.loader = $('<div class="bx-loading" />');
211			slider.viewport.prepend(slider.loader);
212			// set el to a massive width, to hold any needed slides
213			// also strip any margin and padding from el
214			el.css({
215				width: slider.settings.mode == 'horizontal' ? (slider.children.length * 100 + 215) + '%' : 'auto',
216				position: 'relative'
217			});
218			// if using CSS, add the easing property
219			if(slider.usingCSS && slider.settings.easing){
220				el.css('-' + slider.cssPrefix + '-transition-timing-function', slider.settings.easing);
221			// if not using CSS and no easing value was supplied, use the default JS animation easing (swing)
222			}else if(!slider.settings.easing){
223				slider.settings.easing = 'swing';
224			}
225			var slidesShowing = getNumberSlidesShowing();
226			// make modifications to the viewport (.bx-viewport)
227			slider.viewport.css({
228				width: '100%',
229				overflow: 'hidden',
230				position: 'relative'
231			});
232			slider.viewport.parent().css({
233				maxWidth: getViewportMaxWidth()
234			});
235			// make modification to the wrapper (.bx-wrapper)
236			if(!slider.settings.pager) {
237				slider.viewport.parent().css({
238				margin: '0 auto 0px'
239				});
240			}
241			// apply css to all slider children
242			slider.children.css({
243				'float': slider.settings.mode == 'horizontal' ? 'left' : 'none',
244				listStyle: 'none',
245				position: 'relative'
246			});
247			// apply the calculated width after the float is applied to prevent scrollbar interference
248			slider.children.css('width', getSlideWidth());
249			// if slideMargin is supplied, add the css
250			if(slider.settings.mode == 'horizontal' && slider.settings.slideMargin > 0){
251
252				//if(slider.settings.minSlides == 1 && slider.settings.maxSlides == 1){// layout center
253				if(slider.settings.slideWidth > 0 &&  slider.settings.minSlides == slider.settings.maxSlides ){// calc margin.
254					var margin =
255						(
256							slider.viewport.width() - (slider.settings.slideWidth * slider.settings.minSlides)
257						) / (slider.settings.minSlides * 2);
258					if(margin > 0){
259						slider.settings.slideMargin = margin;
260						slider.children.css('marginLeft', slider.settings.slideMargin);
261					}
262				}
263				slider.children.css('marginRight', slider.settings.slideMargin);
264
265			}
266			if(slider.settings.mode == 'vertical' && slider.settings.slideMargin > 0) slider.children.css('marginBottom', slider.settings.slideMargin);
267			// if "fade" mode, add positioning and z-index CSS
268			if(slider.settings.mode == 'fade'){
269				slider.children.css({
270					position: 'absolute',
271					zIndex: 0,
272					display: 'none'
273				});
274				// prepare the z-index on the showing element
275				slider.children.eq(slider.settings.startSlide).css({zIndex: slider.settings.slideZIndex, display: 'block'});
276			}
277			// create an element to contain all slider controls (pager, start / stop, etc)
278			slider.controls.el = $('<div class="bx-controls" />');
279			// if captions are requested, add them
280			if(slider.settings.captions) appendCaptions();
281			// check if startSlide is last slide
282			slider.active.last = slider.settings.startSlide == getPagerQty() - 1;
283			// if video is true, set up the fitVids plugin
284			if(slider.settings.video) el.fitVids();
285			// set the default preload selector (visible)
286			var preloadSelector = slider.children.eq(slider.settings.startSlide);
287			if (slider.settings.preloadImages == "all") preloadSelector = slider.children;
288			// only check for control addition if not in "ticker" mode
289			if(!slider.settings.ticker){
290				// if pager is requested, add it
291				if(slider.settings.pager) appendPager();
292				// if controls are requested, add them
293				if(slider.settings.controls) appendControls();
294				// if auto is true, and auto controls are requested, add them
295				if(slider.settings.auto && slider.settings.autoControls) appendControlsAuto();
296				// if any control option is requested, add the controls wrapper
297				if(slider.settings.controls || slider.settings.autoControls || slider.settings.pager) slider.viewport.after(slider.controls.el);
298			// if ticker mode, do not allow a pager
299			}else{
300				slider.settings.pager = false;
301			}
302			// preload all images, then perform final DOM / CSS modifications that depend on images being loaded
303			loadElements(preloadSelector, start);
304		}
305
306		var loadElements = function(selector, callback){
307			var total = selector.find('img, iframe').length;
308			if (total == 0){
309				callback();
310				return;
311			}
312			var count = 0;
313			selector.find('img, iframe').each(function(){
314				$(this).one('load', function() {
315				  if(++count == total) callback();
316				}).each(function() {
317				  if(this.complete) $(this).load();
318				});
319			});
320		}
321
322		/**
323		 * Start the slider
324		 */
325		var start = function(){
326			// if infinite loop, prepare additional slides
327			if(slider.settings.infiniteLoop && slider.settings.mode != 'fade' && !slider.settings.ticker){
328				var slice = slider.settings.mode == 'vertical' ? slider.settings.minSlides : slider.settings.maxSlides;
329				var sliceAppend = slider.children.slice(0, slice).clone().addClass('bx-clone');
330				var slicePrepend = slider.children.slice(-slice).clone().addClass('bx-clone');
331				el.append(sliceAppend).prepend(slicePrepend);
332			}
333			// remove the loading DOM element
334			//slider.loader.remove();
335      slider.viewport.find('.bx-loading').remove();// たまに消えないことがあるので
336			// set the left / top position of "el"
337			setSlidePosition();
338			// if "vertical" mode, always use adaptiveHeight to prevent odd behavior
339			if (slider.settings.mode == 'vertical') slider.settings.adaptiveHeight = true;
340			// set the viewport height
341			slider.viewport.height(getViewportHeight());
342			// make sure everything is positioned just right (same as a window resize)
343			el.redrawSlider();
344			// onSliderLoad callback
345			slider.settings.onSliderLoad(slider.active.index);
346			// slider has been fully initialized
347			slider.initialized = true;
348			// bind the resize call to the window
349			if (slider.settings.responsive) $(window).bind('resize', resizeWindow);
350			// if auto is true and has more than 1 page, start the show
351			if (slider.settings.auto && slider.settings.autoStart && (getPagerQty() > 1 || slider.settings.autoSlideForOnePage)) initAuto();
352			// if ticker is true, start the ticker
353			if (slider.settings.ticker) initTicker();
354			// if pager is requested, make the appropriate pager link active
355			if (slider.settings.pager) updatePagerActive(slider.settings.startSlide);
356			// check for any updates to the controls (like hideControlOnEnd updates)
357			if (slider.settings.controls) updateDirectionControls();
358			// if touchEnabled is true, setup the touch events
359			if (slider.settings.touchEnabled && !slider.settings.ticker) initTouch();
360		}
361
362		/**
363		 * Returns the calculated height of the viewport, used to determine either adaptiveHeight or the maxHeight value
364		 */
365		var getViewportHeight = function(){
366			var height = 0;
367			// first determine which children (slides) should be used in our height calculation
368			var children = $();
369			// if mode is not "vertical" and adaptiveHeight is false, include all children
370			if(slider.settings.mode != 'vertical' && !slider.settings.adaptiveHeight){
371				children = slider.children;
372			}else{
373				// if not carousel, return the single active child
374				if(!slider.carousel){
375					children = slider.children.eq(slider.active.index);
376				// if carousel, return a slice of children
377				}else{
378					// get the individual slide index
379					var currentIndex = slider.settings.moveSlides == 1 ? slider.active.index : slider.active.index * getMoveBy();
380					// add the current slide to the children
381					children = slider.children.eq(currentIndex);
382					// cycle through the remaining "showing" slides
383					for (i = 1; i <= slider.settings.maxSlides - 1; i++){
384						// if looped back to the start
385						if(currentIndex + i >= slider.children.length){
386							children = children.add(slider.children.eq(i - 1));
387						}else{
388							children = children.add(slider.children.eq(currentIndex + i));
389						}
390					}
391				}
392			}
393			// if "vertical" mode, calculate the sum of the heights of the children
394			if(slider.settings.mode == 'vertical'){
395				children.each(function(index) {
396				  height += $(this).outerHeight();
397				});
398				// add user-supplied margins
399				if(slider.settings.slideMargin > 0){
400					height += slider.settings.slideMargin * (slider.settings.minSlides - 1);
401				}
402			// if not "vertical" mode, calculate the max height of the children
403			}else{
404				height = Math.max.apply(Math, children.map(function(){
405					return $(this).outerHeight(false);
406				}).get());
407			}
408
409			if(slider.viewport.css('box-sizing') == 'border-box'){
410				height +=	parseFloat(slider.viewport.css('padding-top')) + parseFloat(slider.viewport.css('padding-bottom')) +
411							parseFloat(slider.viewport.css('border-top-width')) + parseFloat(slider.viewport.css('border-bottom-width'));
412			}else if(slider.viewport.css('box-sizing') == 'padding-box'){
413				height +=	parseFloat(slider.viewport.css('padding-top')) + parseFloat(slider.viewport.css('padding-bottom'));
414			}
415
416			return height;
417		}
418
419		/**
420		 * Returns the calculated width to be used for the outer wrapper / viewport
421		 */
422		var getViewportMaxWidth = function(){
423			var width = '100%';
424			if(slider.settings.slideWidth > 0){
425				if(slider.settings.mode == 'horizontal'){
426					width = (slider.settings.maxSlides * slider.settings.slideWidth) + ((slider.settings.maxSlides - 1) * slider.settings.slideMargin);
427				}else{
428					width = slider.settings.slideWidth;
429				}
430			}
431			return width;
432		}
433
434		/**
435		 * Returns the calculated width to be applied to each slide
436		 */
437		var getSlideWidth = function(){
438			// start with any user-supplied slide width
439			var newElWidth = slider.settings.slideWidth;
440			// get the current viewport width
441			var wrapWidth = slider.viewport.width();
442			// if slide width was not supplied, or is larger than the viewport use the viewport width
443			if(slider.settings.slideWidth == 0 ||
444				(slider.settings.slideWidth > wrapWidth && !slider.carousel) ||
445				slider.settings.mode == 'vertical'){
446				newElWidth = wrapWidth;
447			// if carousel, use the thresholds to determine the width
448			}else if(slider.settings.maxSlides > 1 && slider.settings.mode == 'horizontal'){
449				if(wrapWidth > slider.maxThreshold){
450					// newElWidth = (wrapWidth - (slider.settings.slideMargin * (slider.settings.maxSlides - 1))) / slider.settings.maxSlides;
451				}else if(wrapWidth < slider.minThreshold){
452					newElWidth = (wrapWidth - (slider.settings.slideMargin * (slider.settings.minSlides - 1))) / slider.settings.minSlides;
453				}
454			}
455			return newElWidth;
456		}
457
458		/**
459		 * Returns the number of slides currently visible in the viewport (includes partially visible slides)
460		 */
461		var getNumberSlidesShowing = function(){
462			var slidesShowing = 1;
463			if(slider.settings.mode == 'horizontal' && slider.settings.slideWidth > 0){
464				// if viewport is smaller than minThreshold, return minSlides
465				if(slider.viewport.width() < slider.minThreshold){
466					slidesShowing = slider.settings.minSlides;
467				// if viewport is larger than minThreshold, return maxSlides
468				}else if(slider.viewport.width() > slider.maxThreshold){
469					slidesShowing = slider.settings.maxSlides;
470				// if viewport is between min / max thresholds, divide viewport width by first child width
471				}else{
472					var childWidth = slider.children.first().width() + slider.settings.slideMargin;
473					slidesShowing = Math.floor((slider.viewport.width() +
474						slider.settings.slideMargin) / childWidth);
475				}
476			// if "vertical" mode, slides showing will always be minSlides
477			}else if(slider.settings.mode == 'vertical'){
478				slidesShowing = slider.settings.minSlides;
479			}
480			return slidesShowing;
481		}
482
483		/**
484		 * Returns the number of pages (one full viewport of slides is one "page")
485		 */
486		var getPagerQty = function(){
487			var pagerQty = 0;
488			// if moveSlides is specified by the user
489			if(slider.settings.moveSlides > 0){
490				if(slider.settings.infiniteLoop){
491					pagerQty = Math.ceil(slider.children.length / getMoveBy());
492				}else{
493					// use a while loop to determine pages
494					var breakPoint = 0;
495					var counter = 0
496					// when breakpoint goes above children length, counter is the number of pages
497					while (breakPoint < slider.children.length){
498						++pagerQty;
499						breakPoint = counter + getNumberSlidesShowing();
500						counter += slider.settings.moveSlides <= getNumberSlidesShowing() ? slider.settings.moveSlides : getNumberSlidesShowing();
501					}
502				}
503			// if moveSlides is 0 (auto) divide children length by sides showing, then round up
504			}else{
505				pagerQty = Math.ceil(slider.children.length / getNumberSlidesShowing());
506			}
507			return pagerQty;
508		}
509
510		/**
511		 * Returns the number of indivual slides by which to shift the slider
512		 */
513		var getMoveBy = function(){
514			// if moveSlides was set by the user and moveSlides is less than number of slides showing
515			if(slider.settings.moveSlides > 0 && slider.settings.moveSlides <= getNumberSlidesShowing()){
516				return slider.settings.moveSlides;
517			}
518			// if moveSlides is 0 (auto)
519			return getNumberSlidesShowing();
520		}
521
522		/**
523		 * Sets the slider's (el) left or top position
524		 */
525		var setSlidePosition = function(){
526			// if last slide, not infinite loop, and number of children is larger than specified maxSlides
527			if(slider.children.length > slider.settings.maxSlides && slider.active.last && !slider.settings.infiniteLoop){
528				if (slider.settings.mode == 'horizontal'){
529					// get the last child's position
530					var lastChild = slider.children.last();
531					var position = lastChild.position();
532					// set the left position
533					setPositionProperty(-(position.left - (slider.viewport.width() - lastChild.outerWidth())), 'reset', 0);
534				}else if(slider.settings.mode == 'vertical'){
535					// get the last showing index's position
536					var lastShowingIndex = slider.children.length - slider.settings.minSlides;
537					var position = slider.children.eq(lastShowingIndex).position();
538					// set the top position
539					setPositionProperty(-position.top, 'reset', 0);
540				}
541			// if not last slide
542			}else{
543				// get the position of the first showing slide
544				var position = slider.children.eq(slider.active.index * getMoveBy()).position();
545				// check for last slide
546				if (slider.active.index == getPagerQty() - 1) slider.active.last = true;
547				// set the repective position
548				if (position != undefined){
549					if (slider.settings.mode == 'horizontal') setPositionProperty(-position.left, 'reset', 0);
550					else if (slider.settings.mode == 'vertical') setPositionProperty(-position.top, 'reset', 0);
551				}
552			}
553		}
554
555		/**
556		 * Sets the el's animating property position (which in turn will sometimes animate el).
557		 * If using CSS, sets the transform property. If not using CSS, sets the top / left property.
558		 *
559		 * @param value (int)
560		 *  - the animating property's value
561		 *
562		 * @param type (string) 'slider', 'reset', 'ticker'
563		 *  - the type of instance for which the function is being
564		 *
565		 * @param duration (int)
566		 *  - the amount of time (in ms) the transition should occupy
567		 *
568		 * @param params (array) optional
569		 *  - an optional parameter containing any variables that need to be passed in
570		 */
571		var setPositionProperty = function(value, type, duration, params){
572			// use CSS transform
573			if(slider.usingCSS){
574				// determine the translate3d value
575				var propValue = slider.settings.mode == 'vertical' ? 'translate3d(0, ' + value + 'px, 0)' : 'translate3d(' + value + 'px, 0, 0)';
576				// add the CSS transition-duration
577				el.css('-' + slider.cssPrefix + '-transition-duration', duration / 1000 + 's');
578				if(type == 'slide'){
579					// set the property value
580					el.css(slider.animProp, propValue);
581					// bind a callback method - executes when CSS transition completes
582					el.bind('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd', function(){
583						// unbind the callback
584						el.unbind('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd');
585						updateAfterSlideTransition();
586					});
587				}else if(type == 'reset'){
588					el.css(slider.animProp, propValue);
589				}else if(type == 'ticker'){
590					// make the transition use 'linear'
591					el.css('-' + slider.cssPrefix + '-transition-timing-function', 'linear');
592					el.css(slider.animProp, propValue);
593					// bind a callback method - executes when CSS transition completes
594					el.bind('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd', function(){
595						// unbind the callback
596						el.unbind('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd');
597						// reset the position
598						setPositionProperty(params['resetValue'], 'reset', 0);
599						// start the loop again
600						tickerLoop();
601					});
602				}
603			// use JS animate
604			}else{
605				var animateObj = {};
606				animateObj[slider.animProp] = value;
607				if(type == 'slide'){
608					el.animate(animateObj, duration, slider.settings.easing, function(){
609						updateAfterSlideTransition();
610					});
611				}else if(type == 'reset'){
612					el.css(slider.animProp, value)
613				}else if(type == 'ticker'){
614					el.animate(animateObj, speed, 'linear', function(){
615						setPositionProperty(params['resetValue'], 'reset', 0);
616						// run the recursive loop after animation
617						tickerLoop();
618					});
619				}
620			}
621		}
622
623		/**
624		 * Populates the pager with proper amount of pages
625		 */
626		var populatePager = function(){
627			var pagerHtml = '';
628			var pagerQty = getPagerQty();
629			// loop through each pager item
630			for(var i=0; i < pagerQty; i++){
631				var linkContent = '';
632				// if a buildPager function is supplied, use it to get pager link value, else use index + 1
633				if(slider.settings.buildPager && $.isFunction(slider.settings.buildPager)){
634					linkContent = slider.settings.buildPager(i);
635					slider.pagerEl.addClass('bx-custom-pager');
636				}else{
637					linkContent = i + 1;
638					slider.pagerEl.addClass('bx-default-pager');
639				}
640				// var linkContent = slider.settings.buildPager && $.isFunction(slider.settings.buildPager) ? slider.settings.buildPager(i) : i + 1;
641				// add the markup to the string
642				pagerHtml += '<div class="bx-pager-item">
vendor: 3,630 bytes, lines 642-724
642<a href="" data-slide-index="' + i + '" class="bx-pager-link">' + linkContent + '</a></div>';
643			};
644			// populate the pager element with pager links
645			slider.pagerEl.html(pagerHtml);
646		}
647
648		/**
649		 * Appends the pager to the controls element
650		 */
651		var appendPager = function(){
652			if(!slider.settings.pagerCustom){
653				// create the pager DOM element
654				slider.pagerEl = $('<div class="bx-pager" />');
655				// if a pager selector was supplied, populate it with the pager
656				if(slider.settings.pagerSelector){
657					$(slider.settings.pagerSelector).html(slider.pagerEl);
658				// if no pager selector was supplied, add it after the wrapper
659				}else{
660					slider.controls.el.addClass('bx-has-pager').append(slider.pagerEl);
661				}
662				// populate the pager
663				populatePager();
664			}else{
665				slider.pagerEl = $(slider.settings.pagerCustom);
666			}
667			// assign the pager click binding
668			slider.pagerEl.on('click', 'a', clickPagerBind);
669		}
670
671		/**
672		 * Appends prev / next controls to the controls element
673		 */
674		var appendControls = function(){
675			slider.controls.next = $('<a class="bx-next" href="">' + slider.settings.nextText + '</a>');
676			slider.controls.prev = $('<a class="bx-prev" href="">' + slider.settings.prevText + '</a>');
677			// bind click actions to the controls
678			slider.controls.next.bind('click', clickNextBind);
679			slider.controls.prev.bind('click', clickPrevBind);
680			// if nextSlector was supplied, populate it
681			if(slider.settings.nextSelector){
682				$(slider.settings.nextSelector).append(slider.controls.next);
683			}
684			// if prevSlector was supplied, populate it
685			if(slider.settings.prevSelector){
686				$(slider.settings.prevSelector).append(slider.controls.prev);
687			}
688			// if no custom selectors were supplied
689			if(!slider.settings.nextSelector && !slider.settings.prevSelector){
690				// add the controls to the DOM
691				slider.controls.directionEl = $('<div class="bx-controls-direction" />');
692				// add the control elements to the directionEl
693				slider.controls.directionEl.append(slider.controls.prev).append(slider.controls.next);
694				// slider.viewport.append(slider.controls.directionEl);
695				slider.controls.el.addClass('bx-has-controls-direction').append(slider.controls.directionEl);
696			}
697		}
698
699		/**
700		 * Appends start / stop auto controls to the controls element
701		 */
702		var appendControlsAuto = function(){
703			slider.controls.start = $('<div class="bx-controls-auto-item"><a class="bx-start" href="">' + slider.settings.startText + '</a></div>');
704			slider.controls.stop = $('<div class="bx-controls-auto-item"><a class="bx-stop" href="">' + slider.settings.stopText + '</a></div>');
705			// add the controls to the DOM
706			slider.controls.autoEl = $('<div class="bx-controls-auto" />');
707			// bind click actions to the controls
708			slider.controls.autoEl.on('click', '.bx-start', clickStartBind);
709			slider.controls.autoEl.on('click', '.bx-stop', clickStopBind);
710			// if autoControlsCombine, insert only the "start" control
711			if(slider.settings.autoControlsCombine){
712				slider.controls.autoEl.append(slider.controls.start);
713			// if autoControlsCombine is false, insert both controls
714			}else{
715				slider.controls.autoEl.append(slider.controls.start).append(slider.controls.stop);
716			}
717			// if auto controls selector was supplied, populate it with the controls
718			if(slider.settings.autoControlsSelector){
719				$(slider.settings.autoControlsSelector).html(slider.controls.autoEl);
720			// if auto controls selector was not supplied, add it after the wrapper
721			}else{
722				slider.controls.el.addClass('bx-has-controls-auto').append(slider.controls.autoEl);
723			}
724			// update the auto controls
725			updateAutoControls(slider.settings.autoStart ? 'stop' : 'start');
726		}
727
728		/**
729		 * Appends image captions to the DOM
730		 */
731		var appendCaptions = function(){
732			// cycle through each child
733			slider.children.each(function(index){
734				// get the image title attribute
735				var title = $(this).find('img:first').attr('title');
736				// append the caption
737				if (title != undefined && ('' + title).length) {
738                    $(this).append('<div class="bx-caption"><span>' + title + '</span></div>');
739                }
740			});
741		}
742
743		/**
744		 * Click next binding
745		 *
746		 * @param e (event)
747		 *  - DOM event object
748		 */
749		var clickNextBind = function(e){
750			// if auto show is running, stop it
751			if (slider.settings.auto) el.stopAuto();
752			el.goToNextSlide();
753			e.preventDefault();
754		}
755
756		/**
757		 * Click prev binding
758		 *
759		 * @param e (event)
760		 *  - DOM event object
761		 */
762		var clickPrevBind = function(e){
763			// if auto show is running, stop it
764			if (slider.settings.auto) el.stopAuto();
765			el.goToPrevSlide();
766			e.preventDefault();
767		}
768
769		/**
770		 * Click start binding
771		 *
772		 * @param e (event)
773		 *  - DOM event object
774		 */
775		var clickStartBind = function(e){
776			el.startAuto();
777			e.preventDefault();
778		}
779
780		/**
781		 * Click stop binding
782		 *
783		 * @param e (event)
784		 *  - DOM event object
785		 */
786		var clickStopBind = function(e){
787			el.stopAuto();
788			e.preventDefault();
789		}
790
791		/**
792		 * Click pager binding
793		 *
794		 * @param e (event)
795		 *  - DOM event object
796		 */
797		var clickPagerBind = function(e){
798			// if auto show is running, stop it
799			if (slider.settings.auto) el.stopAuto();
800			var pagerLink = $(e.currentTarget);
801			if(pagerLink.attr('data-slide-index') !== undefined){
802				var pagerIndex = parseInt(pagerLink.attr('data-slide-index'));
803				// if clicked pager link is not active, continue with the goToSlide call
804				if(pagerIndex != slider.active.index) el.goToSlide(pagerIndex);
805				e.preventDefault();
806			}
807		}
808
809		/**
810		 * Updates the pager links with an active class
811		 *
812		 * @param slideIndex (int)
813		 *  - index of slide to make active
814		 */
815		var updatePagerActive = function(slideIndex){
816			// if "short" pager type
817			var len = slider.children.length; // nb of children
818			if(slider.settings.pagerType == 'short'){
819				if(slider.settings.maxSlides > 1) {
820					len = Math.ceil(slider.children.length/slider.settings.maxSlides);
821				}
822				slider.pagerEl.html( (slideIndex + 1) + slider.settings.pagerShortSeparator + len);
823				return;
824			}
825			// remove all pager active classes
826			slider.pagerEl.find('a').removeClass('active');
827			// apply the active class for all pagers
828			slider.pagerEl.each(function(i, el) { $(el).find('a').eq(slideIndex).addClass('active'); });
829		}
830
831		/**
832		 * Performs needed actions after a slide transition
833		 */
834		var updateAfterSlideTransition = function(){
835			// if infinte loop is true
836			if(slider.settings.infiniteLoop){
837				var position = '';
838				// first slide
839				if(slider.active.index == 0){
840					// set the new position
841					position = slider.children.eq(0).position();
842				// carousel, last slide
843				}else if(slider.active.index == getPagerQty() - 1 && slider.carousel){
844					position = slider.children.eq((getPagerQty() - 1) * getMoveBy()).position();
845				// last slide
846				}else if(slider.active.index == slider.children.length - 1){
847					position = slider.children.eq(slider.children.length - 1).position();
848				}
849				if(position){
850					if (slider.settings.mode == 'horizontal') { setPositionProperty(-position.left, 'reset', 0); }
851					else if (slider.settings.mode == 'vertical') { setPositionProperty(-position.top, 'reset', 0); }
852				}
853			}
854			// declare that the transition is complete
855			slider.working = false;
856			// onSlideAfter callback
857			slider.settings.onSlideAfter(slider.children.eq(slider.active.index), slider.oldIndex, slider.active.index);
858		}
859
860		/**
861		 * Updates the auto controls state (either active, or combined switch)
862		 *
863		 * @param state (string) "start", "stop"
864		 *  - the new state of the auto show
865		 */
866		var updateAutoControls = function(state){
867			// if autoControlsCombine is true, replace the current control with the new state
868			if(slider.settings.autoControlsCombine){
869				slider.controls.autoEl.html(slider.controls[state]);
870			// if autoControlsCombine is false, apply the "active" class to the appropriate control
871			}else{
872				slider.controls.autoEl.find('a').removeClass('active');
873				slider.controls.autoEl.find('a:not(.bx-' + state + ')').addClass('active');
874			}
875		}
876
877		/**
878		 * Updates the direction controls (checks if either should be hidden)
879		 */
880		var updateDirectionControls = function(){
881			if(getPagerQty() == 1){
882				slider.controls.prev.addClass('disabled');
883				slider.controls.next.addClass('disabled');
884			}else if(!slider.settings.infiniteLoop && slider.settings.hideControlOnEnd){
885				// if first slide
886				if (slider.active.index == 0){
887					slider.controls.prev.addClass('disabled');
888					slider.controls.next.removeClass('disabled');
889				// if last slide
890				}else if(slider.active.index == getPagerQty() - 1){
891					slider.controls.next.addClass('disabled');
892					slider.controls.prev.removeClass('disabled');
893				// if any slide in the middle
894				}else{
895					slider.controls.prev.removeClass('disabled');
896					slider.controls.next.removeClass('disabled');
897				}
898			}
899		}
900
901		/**
902		 * Initialzes the auto process
903		 */
904		var initAuto = function(){
905			// if autoDelay was supplied, launch the auto show using a setTimeout() call
906			if(slider.settings.autoDelay > 0){
907				var timeout = setTimeout(el.startAuto, slider.settings.autoDelay);
908			// if autoDelay was not supplied, start the auto show normally
909			}else{
910				el.startAuto();
911			}
912			// if autoHover is requested
913			if(slider.settings.autoHover){
914				// on el hover
915				el.hover(function(){
916					// if the auto show is currently playing (has an active interval)
917					if(slider.interval){
918						// stop the auto show and pass true agument which will prevent control update
919						el.stopAuto(true);
920						// create a new autoPaused value which will be used by the relative "mouseout" event
921						slider.autoPaused = true;
922					}
923				}, function(){
924					// if the autoPaused value was created be the prior "mouseover" event
925					if(slider.autoPaused){
926						// start the auto show and pass true agument which will prevent control update
927						el.startAuto(true);
928						// reset the autoPaused value
929						slider.autoPaused = null;
930					}
931				});
932			}
933		}
934
935		/**
936		 * Initialzes the ticker process
937		 */
938		var initTicker = function(){
939			var startPosition = 0;
940			// if autoDirection is "next", append a clone of the entire slider
941			if(slider.settings.autoDirection == 'next'){
942				el.append(slider.children.clone().addClass('bx-clone'));
943			// if autoDirection is "prev", prepend a clone of the entire slider, and set the left position
944			}else{
945				el.prepend(slider.children.clone().addClass('bx-clone'));
946				var position = slider.children.first().position();
947				startPosition = slider.settings.mode == 'horizontal' ? -position.left : -position.top;
948			}
949			setPositionProperty(startPosition, 'reset', 0);
950			// do not allow controls in ticker mode
951			slider.settings.pager = false;
952			slider.settings.controls = false;
953			slider.settings.autoControls = false;
954			// if autoHover is requested
955			if(slider.settings.tickerHover && !slider.usingCSS){
956				// on el hover
957				slider.viewport.hover(function(){
958					el.stop();
959				}, function(){
960					// calculate the total width of children (used to calculate the speed ratio)
961					var totalDimens = 0;
962					slider.children.each(function(index){
963					  totalDimens += slider.settings.mode == 'horizontal' ? $(this).outerWidth(true) : $(this).outerHeight(true);
964					});
965					// calculate the speed ratio (used to determine the new speed to finish the paused animation)
966					var ratio = slider.settings.speed / totalDimens;
967					// determine which property to use
968					var property = slider.settings.mode == 'horizontal' ? 'left' : 'top';
969					// calculate the new speed
970					var newSpeed = ratio * (totalDimens - (Math.abs(parseInt(el.css(property)))));
971					tickerLoop(newSpeed);
972				});
973			}
974			// start the ticker loop
975			tickerLoop();
976		}
977
978		/**
979		 * Runs a continuous loop, news ticker-style
980		 */
981		var tickerLoop = function(resumeSpeed){
982			speed = resumeSpeed ? resumeSpeed : slider.settings.speed;
983			var position = {left: 0, top: 0};
984			var reset = {left: 0, top: 0};
985			// if "next" animate left position to last child, then reset left to 0
986			if(slider.settings.autoDirection == 'next'){
987				position = el.find('.bx-clone').first().position();
988			// if "prev" animate left position to 0, then reset left to first non-clone child
989			}else{
990				reset = slider.children.first().position();
991			}
992			var animateProperty = slider.settings.mode == 'horizontal' ? -position.left : -position.top;
993			var resetValue = slider.settings.mode == 'horizontal' ? -reset.left : -reset.top;
994			var params = {resetValue: resetValue};
995			setPositionProperty(animateProperty, 'ticker', speed, params);
996		}
997
998		/**
999		 * Initializes touch events
1000		 */
1001		var initTouch = function(){
1002			// initialize object to contain all touch values
1003			slider.touch = {
1004				start: {x: 0, y: 0},
1005				end: {x: 0, y: 0}
1006			}
1007			slider.viewport.bind('touchstart', onTouchStart);
1008		}
1009
1010		/**
1011		 * Event handler for "touchstart"
1012		 *
1013		 * @param e (event)
1014		 *  - DOM event object
1015		 */
1016		var onTouchStart = function(e){
1017			if(slider.working){
1018				e.preventDefault();
1019			}else{
1020				// record the original position when touch starts
1021				slider.touch.originalPos = el.position();
1022				var orig = e.originalEvent;
1023				// record the starting touch x, y coordinates
1024				slider.touch.start.x = orig.changedTouches[0].pageX;
1025				slider.touch.start.y = orig.changedTouches[0].pageY;
1026				// bind a "touchmove" event to the viewport
1027				slider.viewport.bind('touchmove', onTouchMove);
1028				// bind a "touchend" event to the viewport
1029				slider.viewport.bind('touchend', onTouchEnd);
1030			}
1031		}
1032
1033		/**
1034		 * Event handler for "touchmove"
1035		 *
1036		 * @param e (event)
1037		 *  - DOM event object
1038		 */
1039		var onTouchMove = function(e){
1040			var orig = e.originalEvent;
1041			// if scrolling on y axis, do not prevent default
1042			var xMovement = Math.abs(orig.changedTouches[0].pageX - slider.touch.start.x);
1043			var yMovement = Math.abs(orig.changedTouches[0].pageY - slider.touch.start.y);
1044			// x axis swipe
1045			if((xMovement * 3) > yMovement && slider.settings.preventDefaultSwipeX){
1046				e.preventDefault();
1047			// y axis swipe
1048			}else if((yMovement * 3) > xMovement && slider.settings.preventDefaultSwipeY){
1049				e.preventDefault();
1050			}
1051			if(slider.settings.mode != 'fade' && slider.settings.oneToOneTouch){
1052				var value = 0;
1053				// if horizontal, drag along x axis
1054				if(slider.settings.mode == 'horizontal'){
1055					var change = orig.changedTouches[0].pageX - slider.touch.start.x;
1056					value = slider.touch.originalPos.left + change;
1057				// if vertical, drag along y axis
1058				}else{
1059					var change = orig.changedTouches[0].pageY - slider.touch.start.y;
1060					value = slider.touch.originalPos.top + change;
1061				}
1062				setPositionProperty(value, 'reset', 0);
1063			}
1064		}
1065
1066		/**
1067		 * Event handler for "touchend"
1068		 *
1069		 * @param e (event)
1070		 *  - DOM event object
1071		 */
1072		var onTouchEnd = function(e){
1073			slider.viewport.unbind('touchmove', onTouchMove);
1074			var orig = e.originalEvent;
1075			var value = 0;
1076			// record end x, y positions
1077			slider.touch.end.x = orig.changedTouches[0].pageX;
1078			slider.touch.end.y = orig.changedTouches[0].pageY;
1079			// if fade mode, check if absolute x distance clears the threshold
1080			if(slider.settings.mode == 'fade'){
1081				var distance = Math.abs(slider.touch.start.x - slider.touch.end.x);
1082				if(distance >= slider.settings.swipeThreshold){
1083					slider.touch.start.x > slider.touch.end.x ? el.goToNextSlide() : el.goToPrevSlide();
1084					el.stopAuto();
1085				}
1086			// not fade mode
1087			}else{
1088				var distance = 0;
1089				// calculate distance and el's animate property
1090				if(slider.settings.mode == 'horizontal'){
1091					distance = slider.touch.end.x - slider.touch.start.x;
1092					value = slider.touch.originalPos.left;
1093				}else{
1094					distance = slider.touch.end.y - slider.touch.start.y;
1095					value = slider.touch.originalPos.top;
1096				}
1097				// if not infinite loop and first / last slide, do not attempt a slide transition
1098				if(!slider.settings.infiniteLoop && ((slider.active.index == 0 && distance > 0) || (slider.active.last && distance < 0))){
1099					setPositionProperty(value, 'reset', 200);
1100				}else{
1101					// check if distance clears threshold
1102					if(Math.abs(distance) >= slider.settings.swipeThreshold){
1103						distance < 0 ? el.goToNextSlide() : el.goToPrevSlide();
1104						el.stopAuto();
1105					}else{
1106						// el.animate(property, 200);
1107						setPositionProperty(value, 'reset', 200);
1108					}
1109				}
1110			}
1111			slider.viewport.unbind('touchend', onTouchEnd);
1112		}
1113
1114		/**
1115		 * Window resize event callback
1116		 */
1117		var resizeWindow = function(e){
1118			// don't do anything if slider isn't initialized.
1119			if(!slider.initialized) return;
1120			// get the new window dimens (again, thank you IE)
1121			var windowWidthNew = $(window).width();
1122			var windowHeightNew = $(window).height();
1123			// make sure that it is a true window resize
1124			// *we must check this because our dinosaur friend IE fires a window resize event when certain DOM elements
1125			// are resized. Can you just die already?*
1126			if(windowWidth != windowWidthNew || windowHeight != windowHeightNew){
1127				// set the new window dimens
1128				windowWidth = windowWidthNew;
1129				windowHeight = windowHeightNew;
1130				// update all dynamic elements
1131				el.redrawSlider();
1132				// Call user resize handler
1133				slider.settings.onSliderResize.call(el, slider.active.index);
1134			}
1135		}
1136
1137		/**
1138		 * ===================================================================================
1139		 * = PUBLIC FUNCTIONS
1140		 * ===================================================================================
1141		 */
1142
1143		/**
1144		 * Performs slide transition to the specified slide
1145		 *
1146		 * @param slideIndex (int)
1147		 *  - the destination slide's index (zero-based)
1148		 *
1149		 * @param direction (string)
1150		 *  - INTERNAL USE ONLY - the direction of travel ("prev" / "next")
1151		 */
1152		el.goToSlide = function(slideIndex, direction){
1153			// if plugin is currently in motion, ignore request
1154			if(slider.working || slider.active.index == slideIndex) return;
1155			// declare that plugin is in motion
1156			slider.working = true;
1157			// store the old index
1158			slider.oldIndex = slider.active.index;
1159			// if slideIndex is less than zero, set active index to last child (this happens during infinite loop)
1160			if(slideIndex < 0){
1161				slider.active.index = getPagerQty() - 1;
1162			// if slideIndex is greater than children length, set active index to 0 (this happens during infinite loop)
1163			}else if(slideIndex >= getPagerQty()){
1164				slider.active.index = 0;
1165			// set active index to requested slide
1166			}else{
1167				slider.active.index = slideIndex;
1168			}
1169			// onSlideBefore, onSlideNext, onSlidePrev callbacks
1170			slider.settings.onSlideBefore(slider.children.eq(slider.active.index), slider.oldIndex, slider.active.index);
1171			if(direction == 'next'){
1172				slider.settings.onSlideNext(slider.children.eq(slider.active.index), slider.oldIndex, slider.active.index);
1173			}else if(direction == 'prev'){
1174				slider.settings.onSlidePrev(slider.children.eq(slider.active.index), slider.oldIndex, slider.active.index);
1175			}
1176			// check if last slide
1177			slider.active.last = slider.active.index >= getPagerQty() - 1;
1178			// update the pager with active class
1179			if(slider.settings.pager) updatePagerActive(slider.active.index);
1180			// // check for direction control update
1181			if(slider.settings.controls) updateDirectionControls();
1182			// if slider is set to mode: "fade"
1183			if(slider.settings.mode == 'fade'){
1184				// if adaptiveHeight is true and next height is different from current height, animate to the new height
1185				if(slider.settings.adaptiveHeight && slider.viewport.height() != getViewportHe
1185ight()){
1186					slider.viewport.animate({height: getViewportHeight()}, slider.settings.adaptiveHeightSpeed);
1187				}
1188				// fade out the visible child and reset its z-index value
1189				slider.children.filter(':visible').fadeOut(slider.settings.speed).css({zIndex: 0});
1190				// fade in the newly requested slide
1191				slider.children.eq(slider.active.index).css('zIndex', slider.settings.slideZIndex+1).fadeIn(slider.settings.speed, function(){
1192					$(this).css('zIndex', slider.settings.slideZIndex);
1193					updateAfterSlideTransition();
1194				});
1195			// slider mode is not "fade"
1196			}else{
1197				// if adaptiveHeight is true and next height is different from current height, animate to the new height
1198				if(slider.settings.adaptiveHeight && slider.viewport.height() != getViewportHeight()){
1199					slider.viewport.animate({height: getViewportHeight()}, slider.settings.adaptiveHeightSpeed);
1200				}
1201				var moveBy = 0;
1202				var position = {left: 0, top: 0};
1203				// if carousel and not infinite loop
1204				if(!slider.settings.infiniteLoop && slider.carousel && slider.active.last){
1205					if(slider.settings.mode == 'horizontal'){
1206						// get the last child position
1207						var lastChild = slider.children.eq(slider.children.length - 1);
1208						position = lastChild.position();
1209						// calculate the position of the last slide
1210						moveBy = slider.viewport.width() - lastChild.outerWidth();
1211					}else{
1212						// get last showing index position
1213						var lastShowingIndex = slider.children.length - slider.settings.minSlides;
1214						position = slider.children.eq(lastShowingIndex).position();
1215					}
1216					// horizontal carousel, going previous while on first slide (infiniteLoop mode)
1217				}else if(slider.carousel && slider.active.last && direction == 'prev'){
1218					// get the last child position
1219					var eq = slider.settings.moveSlides == 1 ? slider.settings.maxSlides - getMoveBy() : ((getPagerQty() - 1) * getMoveBy()) - (slider.children.length - slider.settings.maxSlides);
1220					var lastChild = el.children('.bx-clone').eq(eq);
1221					position = lastChild.position();
1222				// if infinite loop and "Next" is clicked on the last slide
1223				}else if(direction == 'next' && slider.active.index == 0){
1224					// get the last clone position
1225					position = el.find('> .bx-clone').eq(slider.settings.maxSlides).position();
1226					slider.active.last = false;
1227				// normal non-zero requests
1228				}else if(slideIndex >= 0){
1229					var requestEl = slideIndex * getMoveBy();
1230					position = slider.children.eq(requestEl).position();
1231				}
1232
1233				/* If the position doesn't exist
1234				 * (e.g. if you destroy the slider on a next click),
1235				 * it doesn't throw an error.
1236				 */
1237				if ("undefined" !== typeof(position)) {
1238					var value = slider.settings.mode == 'horizontal' ? -(position.left - moveBy) : -position.top;
1239					// plugin values to be animated
1240					setPositionProperty(value, 'slide', slider.settings.speed);
1241				}
1242			}
1243		}
1244
1245		/**
1246		 * Transitions to the next slide in the show
1247		 */
1248		el.goToNextSlide = function(){
1249			// if infiniteLoop is false and last page is showing, disregard call
1250			if (!slider.settings.infiniteLoop && slider.active.last) return;
1251			var pagerIndex = parseInt(slider.active.index) + 1;
1252			el.goToSlide(pagerIndex, 'next');
1253		}
1254
1255		/**
1256		 * Transitions to the prev slide in the show
1257		 */
1258		el.goToPrevSlide = function(){
1259			// if infiniteLoop is false and last page is showing, disregard call
1260			if (!slider.settings.infiniteLoop && slider.active.index == 0) return;
1261			var pagerIndex = parseInt(slider.active.index) - 1;
1262			el.goToSlide(pagerIndex, 'prev');
1263		}
1264
1265		/**
1266		 * Starts the auto show
1267		 *
1268		 * @param preventControlUpdate (boolean)
1269		 *  - if true, auto controls state will not be updated
1270		 */
1271		el.startAuto = function(preventControlUpdate){
1272			// if an interval already exists, disregard call
1273			if(slider.interval) return;
1274			// create an interval
1275			slider.interval = setInterval(function(){
1276				slider.settings.autoDirection == 'next' ? el.goToNextSlide() : el.goToPrevSlide();
1277			}, slider.settings.pause);
1278			// if auto controls are displayed and preventControlUpdate is not true
1279			if (slider.settings.autoControls && preventControlUpdate != true) updateAutoControls('stop');
1280		}
1281
1282		/**
1283		 * Stops the auto show
1284		 *
1285		 * @param preventControlUpdate (boolean)
1286		 *  - if true, auto controls state will not be updated
1287		 */
1288		el.stopAuto = function(preventControlUpdate){
1289			// if no interval exists, disregard call
1290			if(!slider.interval) return;
1291			// clear the interval
1292			clearInterval(slider.interval);
1293			slider.interval = null;
1294			// if auto controls are displayed and preventControlUpdate is not true
1295			if (slider.settings.autoControls && preventControlUpdate != true) updateAutoControls('start');
1296		}
1297
1298		/**
1299		 * Returns current slide index (zero-based)
1300		 */
1301		el.getCurrentSlide = function(){
1302			return slider.active.index;
1303		}
1304
1305		/**
1306		 * Returns current slide element
1307		 */
1308		el.getCurrentSlideElement = function(){
1309			return slider.children.eq(slider.active.index);
1310		}
1311
1312		/**
1313		 * Returns number of slides in show
1314		 */
1315		el.getSlideCount = function(){
1316			return slider.children.length;
1317		}
1318
1319		/**
1320		 * Update all dynamic slider elements
1321		 */
1322		el.redrawSlider = function(){
1323			// resize all children in ratio to new screen size
1324			slider.children.add(el.find('.bx-clone')).width(getSlideWidth());
1325			// adjust the height
1326			slider.viewport.css('height', getViewportHeight());
1327			// update the slide position
1328			if(!slider.settings.ticker) setSlidePosition();
1329			// if active.last was true before the screen resize, we want
1330			// to keep it last no matter what screen size we end on
1331			if (slider.active.last) slider.active.index = getPagerQty() - 1;
1332			// if the active index (page) no longer exists due to the resize, simply set the index as last
1333			if (slider.active.index >= getPagerQty()) slider.active.last = true;
1334			// if a pager is being displayed and a custom pager is not being used, update it
1335			if(slider.settings.pager && !slider.settings.pagerCustom){
1336				populatePager();
1337				updatePagerActive(slider.active.index);
1338			}
1339		}
1340
1341		/**
1342		 * Destroy the current instance of the slider (revert everything back to original state)
1343		 */
1344		el.destroySlider = function(){
1345			// don't do anything if slider has already been destroyed
1346			if(!slider.initialized) return;
1347			slider.initialized = false;
1348			$('.bx-clone', this).remove();
1349			slider.children.each(function() {
1350				$(this).data("origStyle") != undefined ? $(this).attr("style", $(this).data("origStyle")) : $(this).removeAttr('style');
1351			});
1352			$(this).data("origStyle") != undefined ? this.attr("style", $(this).data("origStyle")) : $(this).removeAttr('style');
1353			$(this).unwrap().unwrap();
1354			if(slider.controls.el) slider.controls.el.remove();
1355			if(slider.controls.next) slider.controls.next.remove();
1356			if(slider.controls.prev) slider.controls.prev.remove();
1357			if(slider.pagerEl && slider.settings.controls) slider.pagerEl.remove();
1358			$('.bx-caption', this).remove();
1359			if(slider.controls.autoEl) slider.controls.autoEl.remove();
1360			clearInterval(slider.interval);
1361			if(slider.settings.responsive) $(window).unbind('resize', resizeWindow);
1362		}
1363
1364		/**
1365		 * Reload the slider (revert all DOM changes, and re-initialize)
1366		 */
1367		el.reloadSlider = function(settings){
1368			if (settings != undefined) options = settings;
1369			el.destroySlider();
1370			init();
1371		}
1372
1373		init();
1374
1375		// returns the current jQuery object
1376		return this;
1377	}
1378
1379})(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.