jQuery.fn.VSlide = function(options){
	
	settings = jQuery.extend({
     delay: 5000, //interval between change
		 speed: 'slow', //speed of animation
		 show: 1 //number of visible slides
  }, options);

	var container = jQuery(this);
	var slides = container.children();
	
	if (slides.length < 3) {
		$j('#pageGutterTop').css('display', 'none');
		$j('#pageGutterBot').css('display', 'none')
		return this;	
	}
	
	//settings.show = (settings.show >= Math.floor(slides.length / 2))? Math.floor(slides.length / 2) : settings.show;
	settings.show = (settings.show == 0)? 1 : settings.show;
	
	var h = 0;
	var w = container.innerWidth();
	var borderLeft = parseInt(slides.css('borderLeftWidth').split('px')[0]) || 0;
	var borderRight = parseInt(slides.css('borderRightWidth').split('px')[0]) || 0;
	var paddingLeft = parseInt(slides.css('paddingLeft').split('px')[0]) || 0;
	var paddingRight = parseInt(slides.css('paddingRight').split('px')[0]) || 0;
	
	w -= (borderLeft + borderRight + paddingLeft + paddingRight);
	
	for (var i = 0; i<slides.length; i++){
		h = (jQuery(slides[i]).outerHeight(true) > h) ? jQuery(slides[i]).outerHeight(true) : h;
		jQuery(slides[i]).css('display', 'none');
		jQuery(slides[i]).css('position', 'absolute');
		jQuery(slides[i]).css('top', 0);
	}

	h *= settings.show;
	
	container.height(h);
	container.css('overflow', 'hidden');
	container.css('position', 'relative');
	
	slides.width(w);
	
	container.data('slides', slides);
	container.data('currentSlide', (settings.show *2) -1);
	container.data('delay', settings.delay);
	container.data('animating', 0);
	
	jQuery(window).bind('load', function(container, show){
		return function(){
			var slides = container.data('slides');
			var h = 0;
			
			for (var i = 0; i<slides.length; i++){
				h = (jQuery(slides[i]).outerHeight(true) > h) ? jQuery(slides[i]).outerHeight(true) : h;
			}

			h *= show;
	
			container.height(h);
			container.trigger('resize');
			
			var currentSlide = container.data('currentSlide');
			
			for (var i=0; i<show; i++){
				var currentSlideI = (currentSlide - i < 0)? slides.length - i : currentSlide - i;
				var hI = 0 + ((h/show) * i);
				jQuery(slides[currentSlideI]).css('top', hI);
			}
			
		}
	}(container, settings.show));
	
	function goNext(o, speed, show){
		
		var countDown = function(o){
			return function(){
				o.data('animating', o.data('animating') - 1 );
			}
		}(o);
		
		return function(){
			if(o.data('animating') > 0) return;
			
			
			var h = o.height();
			var slides = o.data('slides');
			var currentSlide = o.data('currentSlide');
			
			//calculate the next slide index
			if (currentSlide + 1 >= slides.length) return;
			var nextSlide = (currentSlide + 1 >= slides.length)? 0 : currentSlide + 1;
			
			o.data('animating', o.data('animating') + 1 );
			
			for (var i=0; i<show; i++){
				//calculate the next slide of the number to shop
				if (nextSlide + i >= slides.length) {
					var nextSlideI = nextSlide + i;
					var currentSlideI = (currentSlide - i < 0)? slides.length - i : currentSlide - i;
					//calculate the position of the incoming slide
					var hI = 0 + ((h/show) * i);
					if (currentSlideI < slides.length && currentSlideI > -1) jQuery(slides[currentSlideI]).animate({top:-(h + hI)}, speed);
				}
				else {
					var nextSlideI = (nextSlide + i >= slides.length)? i : nextSlide + i;
					//calculate the current slide to move out of the way
					var currentSlideI = (currentSlide - i < 0)? slides.length - i : currentSlide - i;
					//calculate the position of the incoming slide
					var hI = 0 + ((h/show) * i);
					
					//acimate the slides
					if (currentSlideI < slides.length && currentSlideI > -1) jQuery(slides[currentSlideI]).animate({top:-(h + hI)}, speed);
					if (nextSlideI < slides.length && nextSlideI > -1) jQuery(slides[nextSlideI]).css('top', h + hI);
					if (nextSlideI < slides.length && nextSlideI > -1) jQuery(slides[nextSlideI]).css('display', 'block');
					
					o.data('animating', o.data('animating') + 1 );
					
					if (nextSlideI < slides.length && nextSlideI > -1) jQuery(slides[nextSlideI]).animate({top:hI}, speed, null, countDown);
				}
			}
			
			o.data('animating', o.data('animating') - 1 );
			o.data('currentSlide', nextSlideI);
			
		}
	}
	
	function goPrevious(o, speed, show){
		
		var countDown = function(o){
			return function(){
				o.data('animating', o.data('animating') - 1 );
			}
		}(o);
		
		return function(){
			
			if(o.data('animating') > 0) return;
			
			var h = o.height();
			var slides = o.data('slides');
			var currentSlide = o.data('currentSlide');
			
			
			//get the slide before the current set.
			if (currentSlide - show < 0) return;
			var nextSlide = currentSlide - show;
			//if it is negative wrap it from the array length.
			nextSlide = (nextSlide < 0)? slides.length + nextSlide : nextSlide;
			
			o.data('animating', o.data('animating') + 1 );
			
			for (var i=0; i<show; i++){
				if (nextSlide - i < 0){
					var nextSlideI = nextSlide - i;
					var currentSlideI = (currentSlide - i < 0)? slides.length - i : currentSlide - i;
					var hI = 0 + ((h/show) * i);
					var hI2 = 0 + ((h/show) * ((show -1)- i));
					if (currentSlideI < slides.length && currentSlideI > -1) var hI3 = h + jQuery(slides[currentSlideI]).position().top;
					if (currentSlideI < slides.length && currentSlideI > -1) jQuery(slides[currentSlideI]).animate({top:hI3}, speed);
				}
				else {
					var nextSlideI = (nextSlide - i < 0)? slides.length - i : nextSlide - i;
					var currentSlideI = (currentSlide - i < 0)? slides.length - i : currentSlide - i;
					var hI = 0 + ((h/show) * i);
					var hI2 = 0 + ((h/show) * ((show -1)- i));
					if (currentSlideI < slides.length && currentSlideI > -1) var hI3 = h + jQuery(slides[currentSlideI]).position().top;
					
					if (currentSlideI < slides.length && currentSlideI > -1) jQuery(slides[currentSlideI]).animate({top:hI3}, speed);
						
					if (nextSlideI < slides.length && nextSlideI > -1) jQuery(slides[nextSlideI]).css('top', -(h + hI));
					if (nextSlideI < slides.length && nextSlideI > -1) jQuery(slides[nextSlideI]).css('display', 'block');
					
					o.data('animating', o.data('animating') + 1 );
					
					if (nextSlideI < slides.length && nextSlideI > -1) jQuery(slides[nextSlideI]).animate({top:hI2}, speed, null, countDown);
				}
			}
			
			o.data('animating', o.data('animating') - 1 );
			o.data('currentSlide', nextSlide);
			
		}
	}
	
	container.data('next', goNext(container, settings.speed, settings.show));
	container.data('previous', goPrevious(container, settings.speed, settings.show));
	
	if (settings.delay > 0){
		container.data('timer', setInterval(container.data('next'), settings.delay));
		
		container.bind('mouseenter', function(event){
			var container = jQuery(event.currentTarget);	
			clearInterval(container.data('timer'));
			container.removeData('timer');
		});
		container.bind('mouseleave', function(event){
			var container = jQuery(event.currentTarget);					
			container.data('timer', setInterval(container.data('next'), container.data('delay')));
		});
	}
	
	container.data('previous')();
	
	return this;
}