PageSourceSearch

https://snowpeakstore.co.kr/data/skin/front/pc_261008/wib/js/jquery.bxslider-rahisified.js?ts=1791332938

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