/** * jQuery bxSlider v3.0 * http://bxslider.com * * Copyright 2010, Steven Wanderski * http://stevenwanderski.com * * Free to use and abuse under the MIT license. * http://www.opensource.org/licenses/mit-license.php *  */(function($){	$.fn.bxSlider = function(options){						var defaults = {			mode: 'horizontal',									// 'horizontal', 'vertical', 'fade'			infiniteLoop: true,									// true, false - display first slide after last			hideControlOnEnd: false,						// true, false - if true, will hide 'next' control on last slide and 'prev' control on first			controls: true,											// true, false - previous and next controls			speed: 500,													// integer - in ms, duration of time slide transitions will occupy			easing: 'swing',                    // used with jquery.easing.1.3.js - see http://gsgd.co.uk/sandbox/jquery/easing/ for available options			pager: false,												// true / false - display a pager			pagerSelector: null,								// jQuery selector - element to contain the pager. ex: '#pager'			pagerType: 'full',									// 'full', 'short' - if 'full' pager displays 1,2,3... if 'short' pager displays 1 / 4			pagerLocation: 'bottom',						// 'bottom', 'top' - location of pager			pagerShortSeparator: '/',						// string - ex: 'of' pager would display 1 of 4			pagerActiveClass: 'pager-active',		// string - classname attached to the active pager link			nextText: 'next',										// string - text displayed for 'next' control			nextImage: '',											// string - filepath of image used for 'next' control. ex: 'images/next.jpg'			nextSelector: null,									// jQuery selector - element to contain the next control. ex: '#next'			prevText: 'prev',										// string - text displayed for 'previous' control			prevImage: '',											// string - filepath of image used for 'previous' control. ex: 'images/prev.jpg'			prevSelector: null,									// jQuery selector - element to contain the previous control. ex: '#next'			captions: false,										// true, false - display image captions (reads the image 'title' tag)			captionsSelector: null,							// jQuery selector - element to contain the captions. ex: '#captions'			auto: false,												// true, false - make slideshow change automatically			autoDirection: 'next',							// 'next', 'prev' - direction in which auto show will traverse			autoControls: false,								// true, false - show 'start' and 'stop' controls for auto show			autoControlsSelector: null,					// jQuery selector - element to contain the auto controls. ex: '#auto-controls'			autoStart: true,										// true, false - if false show will wait for 'start' control to activate			autoHover: false,										// true, false - if true show will pause on mouseover			autoDelay: 0,                       // integer - in ms, the amount of time before starting the auto show			pause: 3000,												// integer - in ms, the duration between each slide transition			startText: 'start',									// string - text displayed for 'start' control			startImage: '',											// string - filepath of image used for 'start' control. ex: 'images/start.jpg'			stopText: 'stop',										// string - text displayed for 'stop' control			stopImage: '',											// string - filepath of image used for 'stop' control. ex: 'images/stop.jpg'			ticker: false,											// true, false - continuous motion ticker mode (think news ticker)																					// note: autoControls, autoControlsSelector, and autoHover apply to ticker!			tickerSpeed: 5000,								  // float - use value between 1 and 5000 to determine ticker speed - the smaller the value the faster the ticker speed			tickerDirection: 'next',						// 'next', 'prev' - direction in which ticker show will traverse			tickerHover: false,                 // true, false - if true ticker will pause on mouseover			wrapperClass: 'bx-wrapper',					// string - classname attached to the slider wraper			startingSlide: 0, 									// integer - show will start on specified slide. note: slides are zero based!			displaySlideQty: 1,									// integer - number of slides to display at once			moveSlideQty: 1,										// integer - number of slides to move at once			randomStart: false,									// true, false - if true show will start on a random slide			onBeforeSlide: function(){},				// function(currentSlideNumber, totalSlideQty, currentSlideHtmlObject) - advanced use only! see the tutorial here: http://bxslider.com/custom-pager			onAfterSlide: function(){},					// function(currentSlideNumber, totalSlideQty, currentSlideHtmlObject) - advanced use only! see the tutorial here: http://bxslider.com/custom-pager			onLastSlide: function(){},					// function(currentSlideNumber, totalSlideQty, currentSlideHtmlObject) - advanced use only! see the tutorial here: http://bxslider.com/custom-pager			onFirstSlide: function(){},					// function(currentSlideNumber, totalSlideQty, currentSlideHtmlObject) - advanced use only! see the tutorial here: http://bxslider.com/custom-pager			onNextSlide: function(){},					// function(currentSlideNumber, totalSlideQty, currentSlideHtmlObject) - advanced use only! see the tutorial here: http://bxslider.com/custom-pager			onPrevSlide: function(){},					// function(currentSlideNumber, totalSlideQty, currentSlideHtmlObject) - advanced use only! see the tutorial here: http://bxslider.com/custom-pager			buildPager: null										// function(slideIndex, slideHtmlObject){ return string; } - advanced use only! see the tutorial here: http://bxslider.com/custom-pager		}				var options = $.extend(defaults, options);				// cache the base element		var base = this;								// PUBLIC FUNCTIONS								/**		 * Go to specified slide		 */				this.goToSlide = function(number, stopAuto){			if(!isWorking){				isWorking = true;				// set current slide to argument				currentSlide = number;				options.onBeforeSlide(currentSlide, $children.length, $children.eq(currentSlide));				// check if stopAuto argument is supplied				if(typeof(stopAuto) == 'undefined'){					var stopAuto = true;				}				if(stopAuto){					// if show is auto playing, stop it					if(options.auto){						base.stopShow(true);					}				}							slide = number;				// check for first slide callback				if(slide == firstSlide){					options.onFirstSlide(currentSlide, $children.length, $children.eq(currentSlide));				}				// check for last slide callback				if(slide == lastSlide){					options.onLastSlide(currentSlide, $children.length, $children.eq(currentSlide));				}				// horizontal				if(options.mode == 'horizontal'){					$parent.animate({'left': '-'+getSlidePosition(slide, 'left')+'px'}, options.speed, options.easing, function(){						isWorking = false;						// perform the callback function						options.onAfterSlide(currentSlide, $children.length, $children.eq(currentSlide));					});				// vertical				}else if(options.mode == 'vertical'){					$parent.animate({'top': '-'+getSlidePosition(slide, 'top')+'px'}, options.speed, options.easing, function(){						isWorking = false;						// perform the callback function						options.onAfterSlide(currentSlide, $children.length, $children.eq(currentSlide));					});							// fade					}else if(options.mode == 'fade'){					setChildrenFade();				}				// check to remove controls on last/first slide				checkEndControls();				// accomodate multi slides				if(options.moveSlideQty > 1){					number = Math.floor(number / options.moveSlideQty);				}				// make the current slide active				makeSlideActive(number);				// display the caption				showCaptions();			}		}				/**		 * Go to next slide		 */				this.goToNextSlide = function(stopAuto){			// check if stopAuto argument is supplied			if(typeof(stopAuto) == 'undefined'){				var stopAuto = true;			}			if(stopAuto){				// if show is auto playing, stop it				if(options.auto){					base.stopShow(true);				}			}						// makes slideshow finite			if(!options.infiniteLoop){				if(!isWorking){					var slideLoop = false;					// make current slide the old value plus moveSlideQty					currentSlide = (currentSlide + (options.moveSlideQty));					// if current slide has looped on itself					if(currentSlide <= lastSlide){						checkEndControls();						// next slide callback						options.onNextSlide(currentSlide, $children.length, $children.eq(currentSlide));						// move to appropriate slide						base.goToSlide(currentSlide);											}else{						currentSlide -= options.moveSlideQty;					}				} // end if(!isWorking)					}else{ 				if(!isWorking){					isWorking = true;										var slideLoop = false;					// make current slide the old value plus moveSlideQty					currentSlide = (currentSlide + options.moveSlideQty);					// if current slide has looped on itself					if(currentSlide > lastSlide){						currentSlide = currentSlide % $children.length;						slideLoop = true;					}					// next slide callback					options.onNextSlide(currentSlide, $children.length, $children.eq(currentSlide));					// slide before callback					options.onBeforeSlide(currentSlide, $children.length, $children.eq(currentSlide));					if(options.mode == 'horizontal'){						// get the new 'left' property for $parent						var parentLeft = (options.moveSlideQty * childrenOuterWidth);						// animate to the new 'left'						$parent.animate({'left': '-='+parentLeft+'px'}, options.speed, options.easing, function(){							isWorking = false;							// if its time to loop, reset the $parent							if(slideLoop){								$parent.css('left', '-'+getSlidePosition(currentSlide, 'left')+'px');							}							// perform the callback function							options.onAfterSlide(currentSlide, $children.length, $children.eq(currentSlide));						});					}else if(options.mode == 'vertical'){						// get the new 'left' property for $parent						var parentTop = (options.moveSlideQty * childrenMaxHeight);						// animate to the new 'left'						$parent.animate({'top': '-='+parentTop+'px'}, options.speed, options.easing, function(){							isWorking = false;							// if its time to loop, reset the $parent							if(slideLoop){								$parent.css('top', '-'+getSlidePosition(currentSlide, 'top')+'px');							}							// perform the callback function							options.onAfterSlide(currentSlide, $children.length, $children.eq(currentSlide));						});					}else if(options.mode == 'fade'){						setChildrenFade();					}										// make the current slide active					if(options.moveSlideQty > 1){						makeSlideActive(Math.ceil(currentSlide / options.moveSlideQty));					}else{						makeSlideActive(currentSlide);					}					// display the caption					showCaptions();				} // end if(!isWorking)							}			} // end function				/**		 * Go to previous slide		 */				this.goToPreviousSlide = function(stopAuto){			// check if stopAuto argument is supplied			if(typeof(stopAuto) == 'undefined'){				var stopAuto = true;			}			if(stopAuto){				// if show is auto playing, stop it				if(options.auto){					base.stopShow(true);				}			}						// makes slideshow finite			if(!options.infiniteLoop){					if(!isWorking){					var slideLoop = false;					// make current slide the old value plus moveSlideQty					currentSlide = currentSlide - options.moveSlideQty;					// if current slide has looped on itself					if(currentSlide < 0){						currentSlide = 0;						// if specified, hide the control on the last slide						if(options.hideControlOnEnd){							$('.bx-prev', $outerWrapper).hide();						}					}					checkEndControls();					// next slide callback					options.onPrevSlide(currentSlide, $children.length, $children.eq(currentSlide));					// move to appropriate slide					base.goToSlide(currentSlide);				}										}else{				if(!isWorking){					isWorking = true;								var slideLoop = false;					// make current slide the old value plus moveSlideQty					currentSlide = (currentSlide - (options.moveSlideQty));					// if current slide has looped on itself					if(currentSlide < 0){						negativeOffset = (currentSlide % $children.length);						if(negativeOffset == 0){							currentSlide = 0;						}else{							currentSlide = ($children.length) + negativeOffset; 						}						slideLoop = true;					}					// next slide callback					options.onPrevSlide(currentSlide, $children.length, $children.eq(currentSlide));					// slide before callback					options.onBeforeSlide(currentSlide, $children.length, $children.eq(currentSlide));					if(options.mode == 'horizontal'){						// get the new 'left' property for $parent						var parentLeft = (options.moveSlideQty * childrenOuterWidth);						// animate to the new 'left'						$parent.animate({'left': '+='+parentLeft+'px'}, options.speed, options.easing, function(){							isWorking = false;							// if its time to loop, reset the $parent							if(slideLoop){								$parent.css('left', '-'+getSlidePosition(currentSlide, 'left')+'px');							}							// perform the callback function							options.onAfterSlide(currentSlide, $children.length, $children.eq(currentSlide));						});					}else if(options.mode == 'vertical'){						// get the new 'left' property for $parent						var parentTop = (options.moveSlideQty * childrenMaxHeight);						// animate to the new 'left'						$parent.animate({'top': '+='+parentTop+'px'}, options.speed, options.easing, function(){							isWorking = false;							// if its time to loop, reset the $parent							if(slideLoop){								$parent.css('top', '-'+getSlidePosition(currentSlide, 'top')+'px');							}							// perform the callback function							options.onAfterSlide(currentSlide, $children.length, $children.eq(currentSlide));						});					}else if(options.mode == 'fade'){						setChildrenFade();					}										// make the current slide active					if(options.moveSlideQty > 1){						makeSlideActive(Math.ceil(currentSlide / options.moveSlideQty));					}else{						makeSlideActive(currentSlide);					}					// display the caption					showCaptions();				} // end if(!isWorking)							}		} // end function				/**		 * Go to first slide		 */				this.goToFirstSlide = function(stopAuto){			// check if stopAuto argument is supplied			if(typeof(stopAuto) == 'undefined'){				var stopAuto = true;			}			base.goToSlide(firstSlide, stopAuto);		}				/**		 * Go to last slide		 */				this.goToLastSlide = function(){			// check if stopAuto argument is supplied			if(typeof(stopAuto) == 'undefined'){				var stopAuto = true;			}			base.goToSlide(lastSlide, stopAuto);		}				/**		 * Get the current slide		 */				this.getCurrentSlide = function(){			return currentSlide;		}				/**		 * Get the total slide count		 */				this.getSlideCount = function(){			return $children.length;		}				/**		 * Stop the slideshow		 */				this.stopShow = function(changeText){			clearInterval(interval);			// check if changeText argument is supplied			if(typeof(changeText) == 'undefined'){				var changeText = true;			}			if(changeText && options.autoControls){				$autoControls.html($startContent).removeClass('stop').addClass('start');				autoPlaying = false;			}		}				/**		 * Start the slideshow		 */				this.startShow = function(changeText){			// check if changeText argument is supplied			if(typeof(changeText) == 'undefined'){				var changeText = true;			}			setAutoInterval();			if(changeText && options.autoControls){				$autoControls.html($stopContent).removeClass('start').addClass('stop');				autoPlaying = true;			}		}				/**		 * Stops the ticker		 */				this.stopTicker = function(changeText){			$parent.stop();			// check if changeText argument is supplied			if(typeof(changeText) == 'undefined'){				var changeText = true;			}			if(changeText && options.ticker){				$autoControls.html($startContent).removeClass('stop').addClass('start');				autoPlaying = false;			}					}				/**		 * Starts the ticker		 */				this.startTicker = function(changeText){			if(options.mode == 'horizontal'){				if(options.tickerDirection == 'next'){					// get the 'left' property where the ticker stopped					var stoppedLeft = parseInt($parent.css('left'));					// calculate the remaining distance the show must travel until the loop					var remainingDistance = (origShowWidth + stoppedLeft) + $children.eq(0).width();							}else if(options.tickerDirection == 'prev'){					// get the 'left' property where the ticker stopped					var stoppedLeft = -parseInt($parent.css('left'));					// calculate the remaining distance the show must travel until the loop					var remainingDistance = (stoppedLeft) - $children.eq(0).width();				}				// calculate the speed ratio to seamlessly finish the loop				var finishingSpeed = (remainingDistance * options.tickerSpeed) / origShowWidth;				// call the show				moveTheShow(tickerLeft, remainingDistance, finishingSpeed);								}else if(options.mode == 'vertical'){				if(options.tickerDirection == 'next'){					// get the 'top' property where the ticker stopped					var stoppedTop = parseInt($parent.css('top'));					// calculate the remaining distance the show must travel until the loop					var remainingDistance = (origShowHeight + stoppedTop) + $children.eq(0).height();							}else if(options.tickerDirection == 'prev'){					// get the 'left' property where the ticker stopped					var stoppedTop = -parseInt($parent.css('top'));					// calculate the remaining distance the show must travel until the loop					var remainingDistance = (stoppedTop) - $children.eq(0).height();				}				// calculate the speed ratio to seamlessly finish the loop				var finishingSpeed = (remainingDistance * options.tickerSpeed) / origShowHeight;				// call the show				moveTheShow(tickerTop, remainingDistance, finishingSpeed);				// check if changeText argument is supplied				if(typeof(changeText) == 'undefined'){					var changeText = true;				}				if(changeText && options.ticker){					$autoControls.html($stopContent).removeClass('start').addClass('stop');					autoPlaying = true;				}									}		}						/**		 * Initialize a new slideshow		 */				this.initShow = function(){						// reinitialize all variables			base = this;			$parent = $(this);			$children = $parent.children();			$outerWrapper = '';			$firstChild = $parent.children(':first');			childrenWidth = $firstChild.width();			childrenMaxWidth = 0;			childrenOuterWidth = $firstChild.outerWidth();			childrenMaxHeight = 0;			wrapperWidth = getWrapperWidth();			wrapperHeight = getWrapperHeight();			isWorking = false;			$pager = '';				currentSlide = 0;				origLeft = 0;			origTop = 0;			interval = '';			$autoControls = '';			$stopHtml = '';			$startContent = '';			$stopContent = '';			autoPlaying = true;			loaded = false;			origShowWidth = 0;			origShowHeight = 0;			tickerLeft = 0;			tickerTop = 0;      			firstSlide = 0;			lastSlide = $children.length - 1;						// get the largest child's height and width			$children.each(function(index) {			  if($(this).outerHeight() > childrenMaxHeight){					childrenMaxHeight = $(this).outerHeight();				}				if($(this).outerWidth() > childrenMaxWidth){					childrenMaxWidth = $(this).outerWidth();				}			});			// get random slide number			if(options.randomStart){				var randomNumber = Math.floor(Math.random() * $children.length);				currentSlide = randomNumber;				origLeft = childrenOuterWidth * (options.moveSlideQty + randomNumber);				origTop = childrenMaxHeight * (options.moveSlideQty + randomNumber);			// start show at specific slide			}else{				currentSlide = options.startingSlide;				origLeft = childrenOuterWidth * (options.moveSlideQty + options.startingSlide);				origTop = childrenMaxHeight * (options.moveSlideQty + options.startingSlide);			}									// set initial css			initCss();						// check to show pager			if(options.pager && !options.ticker){				if(options.pagerType == 'full'){					showPager('full');				}else if(options.pagerType == 'short'){					showPager('short');				}			}									// check to show controls			if(options.controls && !options.ticker){				setControlsVars();			}									// check if auto			if(options.auto || options.ticker){				// check if auto controls are displayed				if(options.autoControls){					setAutoControlsVars();				}				// check if show should auto start				if(options.autoStart){					// check if autostart should delay					setTimeout(function(){						base.startShow(true);					}, options.autoDelay);				}else{					base.stopShow(true);				}				// check if show should pause on hover				if(options.autoHover){					setAutoHover();				}			}									// make the starting slide active			if(options.moveSlideQty > 1){				makeSlideActive(Math.ceil(currentSlide / options.moveSlideQty));			}else{							makeSlideActive(currentSlide);						}			// check for finite show and if controls should be hidden			checkEndControls();			// show captions			if(options.captions){				showCaptions();			}			// perform the callback function			options.onAfterSlide(currentSlide, $children.length, $children.eq(currentSlide));		}				/**		 * Destroy the current slideshow		 */				this.destroyShow = function(){			// stop the auto show			clearInterval(interval);			// remove any controls / pagers that have been appended			$('.bx-next, .bx-prev, .bx-pager, .bx-auto', $outerWrapper).remove();			// unwrap all bx-wrappers			$parent.unwrap().unwrap().removeAttr('style');			// remove any styles that were appended			$parent.children().removeAttr('style').not('.pager').remove();			// remove any childrent that were appended			$children.removeClass('pager');		}				/**		 * Reload the current slideshow		 */				this.reloadShow = function(){			base.destroyShow();			base.initShow();		}						// PRIVATE FUNCTIONS				/**		 * Creates all neccessary styling for the slideshow		 */				function initCss(){			// layout the children			setChildrenLayout(options.startingSlide);			// CSS for horizontal mode			if(options.mode == 'horizontal'){				// wrap the <ul> in div that acts as a window and make the <ul> uber wide				$parent				.wrap('<div class="'+options.wrapperClass+'" style="width:'+wrapperWidth+'px; position:relative;"></div>')				.wrap('<div class="bx-window" style="position:relative; overflow:hidden; width:'+wrapperWidth+'px;"></div>')				.css({				  width: '99999px',				  position: 'relative',					left: '-'+(origLeft)+'px'				});				$parent.children().css({					width: childrenWidth,				  float: 'left',				  listStyle: 'none'				});									$outerWrapper = $parent.parent().parent();				$children.addClass('pager');			// CSS for vertical mode			}else if(options.mode == 'vertical'){				// wrap the <ul> in div that acts as a window and make the <ul> uber tall				$parent				.wrap('<div class="'+options.wrapperClass+'" style="width:'+childrenMaxWidth+'px; position:relative;"></div>')				.wrap('<div class="bx-window" style="width:'+childrenMaxWidth+'px; height:'+wrapperHeight+'px; position:relative; overflow:hidden;"></div>')				.css({				  height: '99999px',				  position: 'relative',					top: '-'+(origTop)+'px'				});				$parent.children().css({				  listStyle: 'none',					height: childrenMaxHeight				});									$outerWrapper = $parent.parent().parent();				$children.addClass('pager');			// CSS for fade mode			}else if(options.mode == 'fade'){				// wrap the <ul> in div that acts as a window				$parent				.wrap('<div class="'+options.wrapperClass+'" style="width:'+childrenMaxWidth+'px; position:relative;"></div>')				.wrap('<div class="bx-window" style="height:'+childrenMaxHeight+'px; width:'+childrenMaxWidth+'px; position:relative; overflow:hidden;"></div>');				$parent.children().css({				  listStyle: 'none',				  position: 'absolute',					top: 0,					left: 0,					zIndex: 98				});									$outerWrapper = $parent.parent().parent();				$children.not(':eq('+currentSlide+')').fadeTo(0, 0);				$children.eq(currentSlide).css('zIndex', 99);			}			// if captions = true setup a div placeholder			if(options.captions && options.captionsSelector == null){				$outerWrapper.append('<div class="bx-captions"></div>');			}					}				/**		 * Depending on mode, lays out children in the proper setup		 */				function setChildrenLayout(){						// lays out children for horizontal or vertical modes			if(options.mode == 'horizontal' || options.mode == 'vertical'){												// get the children behind				var $prependedChildren = getArraySample($children, 0, options.moveSlideQty, 'backward');								// add each prepended child to the back of the original element				$.each($prependedChildren, function(index) {					$parent.prepend($(this));				});											// total number of slides to be hidden after the window				var totalNumberAfterWindow = ($children.length + options.moveSlideQty) - 1;				// number of original slides hidden after the window				var pagerExcess = $children.length - options.displaySlideQty;				// number of slides to append to the original hidden slides				var numberToAppend = totalNumberAfterWindow - pagerExcess;				// get the sample of extra slides to append				var $appendedChildren = getArraySample($children, 0, numberToAppend, 'forward');								if(options.infiniteLoop){					// add each appended child to the front of the original element					$.each($appendedChildren, function(index) {						$parent.append($(this));					});				}			}		}				/**		 * Sets all variables associated with the controls		 */				function setControlsVars(){			// check if text or images should be used for controls			// check "next"			if(options.nextImage != ''){				nextContent = options.nextImage;				nextType = 'image';			}else{				nextContent = options.nextText;				nextType = 'text';			}			// check "prev"			if(options.prevImage != ''){				prevContent = options.prevImage;				prevType = 'image';			}else{				prevContent = options.prevText;				prevType = 'text';			}			// show the controls			showControls(nextType, nextContent, prevType, prevContent);		}							/**		 * Puts slideshow into auto mode		 *		 * @param int pause number of ms the slideshow will wait between slides 		 * @param string direction 'forward', 'backward' sets the direction of the slideshow (forward/backward)		 * @param bool controls determines if start/stop controls will be displayed		 */				function setAutoInterval(){			if(options.auto){				// finite loop				if(!options.infiniteLoop){					if(options.autoDirection == 'next'){						interval = setInterval(function(){							currentSlide += options.moveSlideQty;							// if currentSlide has exceeded total number							if(currentSlide > lastSlide){								currentSlide = currentSlide % $children.length;							}							base.goToSlide(currentSlide, false);						}, options.pause);					}else if(options.autoDirection == 'prev'){						interval = setInterval(function(){							currentSlide -= options.moveSlideQty;							// if currentSlide is smaller than zero							if(currentSlide < 0){								negativeOffset = (currentSlide % $children.length);								if(negativeOffset == 0){									currentSlide = 0;								}else{									currentSlide = ($children.length) + negativeOffset; 								}							}							base.goToSlide(currentSlide, false);						}, options.pause);					}				// infinite loop				}else{					if(options.autoDirection == 'next'){						interval = setInterval(function(){							base.goToNextSlide(false);						}, options.pause);					}else if(options.autoDirection == 'prev'){						interval = setInterval(function(){							base.goToPreviousSlide(false);						}, options.pause);					}				}						}else if(options.ticker){								options.tickerSpeed *= 100;																// get the total width of the original show				$('.pager').each(function(index) {				  origShowWidth += $(this).width();					origShowHeight += $(this).height();				});								// if prev start the show from the last slide				if(options.tickerDirection == 'prev' && options.mode == 'horizontal'){					$parent.css('left', '-'+(origShowWidth+origLeft)+'px');				}else if(options.tickerDirection == 'prev' && options.mode == 'vertical'){					$parent.css('top', '-'+(origShowHeight+origTop)+'px');				}								if(options.mode == 'horizontal'){					// get the starting left position					tickerLeft = parseInt($parent.css('left'));					// start the ticker					moveTheShow(tickerLeft, origShowWidth, options.tickerSpeed);				}else if(options.mode == 'vertical'){					// get the starting top position					tickerTop = parseInt($parent.css('top'));					// start the ticker					moveTheShow(tickerTop, origShowHeight, options.tickerSpeed);				}																				// check it tickerHover applies				if(options.tickerHover){					setTickerHover();				}								}					}				function moveTheShow(leftCss, distance, speed){			// if horizontal			if(options.mode == 'horizontal'){				// if next				if(options.tickerDirection == 'next'){					$parent.animate({'left': '-='+distance+'px'}, speed, 'linear', function(){						$parent.css('left', leftCss);						moveTheShow(leftCss, origShowWidth, options.tickerSpeed);					});				// if prev				}else if(options.tickerDirection == 'prev'){					$parent.animate({'left': '+='+distance+'px'}, speed, 'linear', function(){						$parent.css('left', leftCss);						moveTheShow(leftCss, origShowWidth, options.tickerSpeed);					});				}			// if vertical					}else if(options.mode == 'vertical'){				// if next				if(options.tickerDirection == 'next'){					$parent.animate({'top': '-='+distance+'px'}, speed, 'linear', function(){						$parent.css('top', leftCss);						moveTheShow(leftCss, origShowHeight, options.tickerSpeed);					});				// if prev				}else if(options.tickerDirection == 'prev'){					$parent.animate({'top': '+='+distance+'px'}, speed, 'linear', function(){						$parent.css('top', leftCss);						moveTheShow(leftCss, origShowHeight, options.tickerSpeed);					});				}			}		}						/**		 * Sets all variables associated with the controls		 */				function setAutoControlsVars(){			// check if text or images should be used for controls			// check "start"			if(options.startImage != ''){				startContent = options.startImage;				startType = 'image';			}else{				startContent = options.startText;				startType = 'text';			}			// check "stop"			if(options.stopImage != ''){				stopContent = options.stopImage;				stopType = 'image';			}else{				stopContent = options.stopText;				stopType = 'text';			}			// show the controls			showAutoControls(startType, startContent, stopType, stopContent);		}				/**		 * Handles hover events for auto shows		 */				function setAutoHover(){			// hover over the slider window			$outerWrapper.find('.bx-window').hover(function() {				if(autoPlaying){					base.stopShow(false);				}			}, function() {				if(autoPlaying){					base.startShow(false);				}			});		}				/**		 * Handles hover events for ticker mode		 */				function setTickerHover(){			// on hover stop the animation			$parent.hover(function() {				if(autoPlaying){					base.stopTicker(false);				}			}, function() {				if(autoPlaying){					base.startTicker(false);				}			});		}						/**		 * Handles fade animation		 */				function setChildrenFade(){			// fade out any other child besides the current			$children.not(':eq('+currentSlide+')').fadeTo(options.speed, 0).css('zIndex', 98);			// fade in the current slide			$children.eq(currentSlide).css('zIndex', 99).fadeTo(options.speed, 1, function(){				isWorking = false;				// perform the callback function				options.onAfterSlide(currentSlide, $children.length, $children.eq(currentSlide));			});		};						/**		 * Makes slide active		 */				function makeSlideActive(number){			if(options.pagerType == 'full' && options.pager){				// remove all active classes				$('a', $pager).removeClass(options.pagerActiveClass);				// assign active class to appropriate slide				$('a', $pager).eq(number).addClass(options.pagerActiveClass);			}else if(options.pagerType == 'short' && options.pager){				$('.bx-pager-current', $pager).html(currentSlide+1);			}		}						/**		 * Displays next/prev controls		 *		 * @param string nextType 'image', 'text'		 * @param string nextContent if type='image', specify a filepath to the image. if type='text', specify text.		 * @param string prevType 'image', 'text'		 * @param string prevContent if type='image', specify a filepath to the image. if type='text', specify text.		 */				function showControls(nextType, nextContent, prevType, prevContent){			// create pager html elements			var $nextHtml = $('<a href="" class="bx-next"></a>');			var $prevHtml = $('<a href="" class="bx-prev"></a>');			// check if next is 'text' or 'image'			if(nextType == 'text'){				$nextHtml.html(nextContent);			}else{				$nextHtml.html('<img src="'+nextContent+'" />');			}			// check if prev is 'text' or 'image'			if(prevType == 'text'){				$prevHtml.html(prevContent);			}else{				$prevHtml.html('<img src="'+prevContent+'" />');			}			// check if user supplied a selector to populate next control			if(options.prevSelector){				$(options.prevSelector).append($prevHtml);			}else{				$outerWrapper.append($prevHtml);			}			// check if user supplied a selector to populate next control			if(options.nextSelector){				$(options.nextSelector).append($nextHtml);			}else{				$outerWrapper.append($nextHtml);			}			// click next control			$nextHtml.click(function() {				base.goToNextSlide();				return false;			});			// click prev control			$prevHtml.click(function() {				base.goToPreviousSlide();				return false;			});		}				/**		 * Displays the pager		 *		 * @param string type 'full', 'short'		 */				function showPager(type){			// sets up logic for finite multi slide shows			var pagerQty = $children.length;			// if we are moving more than one at a time and we have a finite loop			if(options.moveSlideQty > 1){				// if slides create an odd number of pages				if($children.length % options.moveSlideQty != 0){					// pagerQty = $children.length / options.moveSlideQty + 1;					pagerQty = Math.ceil($children.length / options.moveSlideQty);				// if slides create an even number of pages				}else{					pagerQty = $children.length / options.moveSlideQty;				}			}			var pagerString = '';			// check if custom build function was supplied			if(options.buildPager){				for(var i=0; i<pagerQty; i++){					pagerString += options.buildPager(i, $children.eq(i * options.moveSlideQty));				}							// if not, use default pager			}else if(type == 'full'){				// build the full pager				for(var i=1; i<=pagerQty; i++){					pagerString += '<a href="" class="pager-link pager-'+i+'">'+i+'</a>';				}			}else if(type == 'short') {				// build the short pager				pagerString = '<span class="bx-pager-current">'+(options.startingSlide+1)+'</span> '+options.pagerShortSeparator+' <span class="bx-pager-total">'+$children.length+'<span>';			}				// check if user supplied a pager selector			if(options.pagerSelector){				$(options.pagerSelector).append(pagerString);				$pager = $(options.pagerSelector);			}else{				var $pagerContainer = $('<div class="bx-pager"></div>');				$pagerContainer.append(pagerString);				// attach the pager to the DOM				if(options.pagerLocation == 'top'){					$outerWrapper.prepend($pagerContainer);				}else if(options.pagerLocation == 'bottom'){					$outerWrapper.append($pagerContainer);				}				// cache the pager element				$pager = $('.bx-pager', $outerWrapper);			}			// pager link click			$pager.children().click(function() {				// only if pager is full mode				if(options.pagerType == 'full'){					// get the index from the link					var slideIndex = $pager.children().index(this);					// accomodate moving more than one slide					if(options.moveSlideQty > 1){						slideIndex *= options.moveSlideQty;					}					base.goToSlide(slideIndex);				}				return false;			});		}				/**		 * Displays captions		 */				function showCaptions(){			// get the title from each image		  var caption = $('img', $children.eq(currentSlide)).attr('title');			// if the caption exists			if(caption != ''){				// if user supplied a selector				if(options.captionsSelector){					$(options.captionsSelector).html(caption);				}else{					$('.bx-captions', $outerWrapper).html(caption);				}			}else{				// if user supplied a selector				if(options.captionsSelector){					$(options.captionsSelector).html('&nbsp;');				}else{					$('.bx-captions', $outerWrapper).html('&nbsp;');				}							}		}				/**		 * Displays start/stop controls for auto and ticker mode		 *		 * @param string type 'image', 'text'		 * @param string next [optional] if type='image', specify a filepath to the image. if type='text', specify text.		 * @param string prev [optional] if type='image', specify a filepath to the image. if type='text', specify text.		 */		function showAutoControls(startType, startContent, stopType, stopContent){			// create pager html elements			$autoControls = $('<a href="" class="bx-start"></a>');			// check if start is 'text' or 'image'			if(startType == 'text'){				$startContent = startContent;			}else{				$startContent = '<img src="'+startContent+'" />';			}			// check if stop is 'text' or 'image'			if(stopType == 'text'){				$stopContent = stopContent;			}else{				$stopContent = '<img src="'+stopContent+'" />';			}			// check if user supplied a selector to populate next control			if(options.startSelector){				$(options.startSelector).append($autoControls);			}else{				$outerWrapper.append('<div class="bx-auto"></div>');				$('.bx-auto', $outerWrapper).html($autoControls);			}									// click start control			$autoControls.click(function() {				if(options.ticker){					if($(this).hasClass('stop')){						base.stopTicker();					}else if($(this).hasClass('start')){						base.startTicker();					}				}else{					if($(this).hasClass('stop')){						base.stopShow(true);					}else if($(this).hasClass('start')){						base.startShow(true);					}				}				return false;			});					}				/**		 * Checks if show is in finite mode, and if slide is either first or last, then hides the respective control		 */				function checkEndControls(){			if(!options.infiniteLoop && options.hideControlOnEnd){				// check previous				if(currentSlide == firstSlide){					$('.bx-prev', $outerWrapper).hide();								}else{					$('.bx-prev', $outerWrapper).show();				}				// check next				if(currentSlide == lastSlide){					$('.bx-next', $outerWrapper).hide();				}else{					$('.bx-next', $outerWrapper).show();				}			}		}				/**		 * Returns the left offset of the slide from the parent container		 */				function getSlidePosition(number, side){			if(side == 'left'){				var position = $('.pager', $outerWrapper).eq(number).position().left;			}else if(side == 'top'){				var position = $('.pager', $outerWrapper).eq(number).position().top;			}			return position;		}				/**		 * Returns the width of the wrapper		 */				function getWrapperWidth(){			var wrapperWidth = $firstChild.outerWidth() * options.displaySlideQty;			return wrapperWidth;		}				/**		 * Returns the height of the wrapper		 */				function getWrapperHeight(){			// if displaying multiple slides, multiple wrapper width by number of slides to display			var wrapperHeight = $firstChild.outerHeight() * options.displaySlideQty;			return wrapperHeight;		}				/**		 * Returns a sample of an arry and loops back on itself if the end of the array is reached		 *		 * @param array array original array the sample is derived from		 * @param int start array index sample will start		 * @param int length number of items in the sample		 * @param string direction 'forward', 'backward' direction the loop should travel in the array		 */				function getArraySample(array, start, length, direction){			// initialize empty array			var sample = [];			// clone the length argument			var loopLength = length;			// determines when the empty array should start being populated			var startPopulatingArray = false;			// reverse the array if direction = 'backward'			if(direction == 'backward'){				array = $.makeArray(array);				array.reverse();			}			// loop through original array until the length argument is met			while(loopLength > 0){								// loop through original array				$.each(array, function(index, val) {					// check if length has been met					if(loopLength > 0){						// don't do anything unless first index has been reached					  if(!startPopulatingArray){							// start populating empty array							if(index == start){								startPopulatingArray = true;								// add element to array								sample.push($(this).clone());								// decrease the length clone variable								loopLength--;							}						}else{							// add element to array							sample.push($(this).clone());							// decrease the length clone variable							loopLength--;						}					// if length has been met, break loose					}else{						return false;					}							});							}			return sample;		}														this.each(function(){						base.initShow();		});						return this;							}				})(jQuery);
