
$.fn.feature = function(options) {  

	var defaults = {  
		visibleSlides:1,  
		slideBy:1,
		vertical:false,  
		numericControls:true,
		nextPrevControls:true,
		auto:true,
		pause:6000
	};  
 
	var options = $.extend(defaults, options);  
  
	//errors
	if(options.slideBy > options.visibleSlides){
			alert("error:  Please set 'visibleSlides' to a value less than 'slideBy'.");
	}else{
	
		return this.each(function() {  
					
			//get vars
			var element = $(this);
			var slide = element.find("li");
			var slideNo = slide.length;
			var slideWidth = slide.width();
			var slideHeight = slide.height();
			var visibleWidth = slide.width() * options.visibleSlides;
			var visibleHeight = slide.height() * options.visibleSlides;
			var ulWidth = slideWidth * slideNo;
			var ulHeight = slideHeight * slideNo;
			var holderCss = {
				"overflow":"hidden",
				"position":"relative",
				"float":"left"
			};
			var elementCss = {
				"position":"absolute",
				"top":"0px",
				"left":"0px"
			};
			
			//setup slider
			slide.css("float","left");
			element.css(elementCss);
			element.wrap("<div class='slideHolder'></div>");
			var holder = element.parents(".slideHolder");
			holder.css(holderCss);
			holder.wrap("<div class='slider'></div>");
			var slider = element.parents(".slider");
			if(options.vertical == true){
				element.height(ulHeight).width(slideWidth);
				holder.height(visibleHeight).width(slideWidth);
			}else{
				element.height(slideHeight).width(ulWidth);
				holder.height(slideHeight).width(visibleWidth);
			}
			element.after("<input type='hidden' class='activeSlide' value='1'/>");
			slide.each(function(i){
				i++;
				$(this).attr("id","slide"+i);
			});
			
			if(options.nextPrevControls == true){
				if(options.vertical == true){
					holder.before("<div class='sliderPrev slideControl'></div><br class='clearBoth'/>");
					holder.after("<br class='clearBoth'/><div class='sliderNext slideControl'></div>");
				}else{
					holder.before("<div class='sliderPrev slideControl'></div>");
					holder.after("<div class='sliderNext slideControl'></div>");
				}
				slider.find(".sliderPrev").addClass("disabled");
				var slideControlCss = {
					"cursor":"pointer",
					"float":"left"
				};
				slider.find(".slideControl").css(slideControlCss);
			}
			
			if(options.numericControls == true){
				holder.after("<div class='sliderNumericControls'></div>");
				slide.each(function(i){
					i++;
					var slideClass = $(this).attr("class");
					var slideLink = $(this).find("a").attr("href");
					slider.find(".sliderNumericControls").append("<div id='goto"+ i +"' class='"+slideClass+"' rel='"+slideLink+"'><span></span></div>");
					var numericControlsCss = {
						"position":"absolute",
						"bottom":"0",
						"cursor":"pointer",
						"z-index":"5"
					};
					slider.find(".sliderNumericControls").css(numericControlsCss).find("div").css("float","left");			
				});			
			}
			
			
			//call functions
			activeSlide();
			

			slider.find(".sliderNext").click(function(){
				if(options.vertical == true){
					slideUp();
				}else{
					slideLeft();
				}
			});
			
			slider.find(".sliderPrev").click(function(){
				if(options.vertical == true){
					slideDown();
				}else{	
					slideRight();
				}
			});
			
			if(options.auto == true){
				element.attr("pause","false");
				slider.mouseenter(function(){
					element.attr("pause","true");
				});
				slider.mouseleave(function(){
					element.attr("pause","false");
				});
				auto();
			}
			
			slider.parents(".feature").find(".sliderNumericControls div").click(function(){
				//goToSlide($(this));
				var link = $(this).attr("rel");
				window.location = link;
			});
			
			//sliding functions
			function slideLeft (){
				var position = element.css("left");
				var ulWidth = "-" + (element.width() - slideWidth) + "px"; 			
				if(ulWidth == position){		
					slideReset();					
				}else{
					element.animate({left:"-="+ slideWidth * options.slideBy +""},"slow");
				}	
				activeSlide("forward");
			}
			
			function slideUp (){
				var position = element.css("top");
				var ulHeight = "-" + (element.height() - slideHeight) + "px"; 			
				if(ulHeight == position){
					slideReset();
				}else{
					element.animate({top:"-="+ slideHeight * options.slideBy +""},"slow");
				}	
				activeSlide("forward");
			}
			
			function slideRight (){
				var position = element.css("left");
				if(position == "0px"){
					slideReset();				
				}else{
					element.animate({left:"+="+ slideWidth * options.slideBy +""},"slow");
				}
				activeSlide("backward");
			}
			
			function slideDown (){
				var position = element.css("top");
				if(position == "0px"){
					slideReset();				
				}else{
					element.animate({top:"+="+ slideHeight * options.slideBy +""},"slow");
				}
				activeSlide("backward");
			}
			
			function slideReset (){					
				if(options.auto == true){
					if(options.vertical == true){
						continuous("top");	
					}else{
						continuous("left");
					}
					activeSlide("reset");	
				}
			}
			
			function continuous (direction){
				var paused = element.attr("pause");
				if(direction == "left"){
					if(options.visibleSlides == 2){					
						element.find("li:first").clone().addClass("lastItem").appendTo(holder);
						var lastItemCss = {
							"position":"absolute",					
							"left":slideWidth,
							"list-style-type":"none"
						};
						holder.children(".lastItem").css(lastItemCss);					
						holder.children(".lastItem").animate({left:"0"},"slow");					
						element.animate({left:"-="+ slideWidth * options.slideBy +""},"slow",function(){
							element.stop().css("left","0px");
						});
						setTimeout(function(){
							holder.children(".lastItem").animate({left:-slideWidth},"slow",function(){
								holder.children(".lastItem").remove();
							});
						},options.pause);					
					}else{
						element.animate({left:"0"},"fast");
					}
				}else{
					if(options.visibleSlides == 1){					
						element.find("li:first").clone().addClass("lastItem").appendTo(holder);
						var lastItemCss = {
							"position":"absolute",					
							"top":slideHeight,
							"list-style-type":"none"
						};
						holder.children(".lastItem").css(lastItemCss);
						holder.children(".lastItem").animate({top:"0"},"slow");
						element.animate({top:"-="+ slideHeight * options.slideBy +""},"slow",function(){
							element.stop().css("top","0px");
						});
						setTimeout(function(){
							holder.children(".lastItem").animate({top:-slideWidth},"slow",function(){
								holder.children(".lastItem").remove();
							});
						},options.pause);
					}else{
						element.animate({top:"0"},"fast");
					}
				}
			}
			
			function auto (){							
				slide.each(function(i){
					i++;
					setTimeout(function(){
						var paused = element.attr("pause");
						if(paused == "false"){
							if(options.vertical == true){
								slideUp();
							}else{
								slideLeft();
							}
						}
						if(i == slideNo){
							auto();
						}
					},options.pause * i);
				});
			}
			
			function goToSlide (control){
				var slideId = control.attr("id").replace("goto","");
				if(options.vertical == true){		
					var slideTo = slideHeight * slideId - slideHeight;
					element.animate({top:-slideTo},"slow");
				}else{
					var slideTo = slideWidth * slideId - slideWidth;
					element.animate({left:-slideTo},"slow");
				}
				activeSlide("skip",slideId);
			}
			
			function activeSlide (status,active){
				var activeSlide = holder.find(".activeSlide").val();
				var activeSlide = parseInt(activeSlide);		
				if(status == "forward"){
					var activeSlide = activeSlide + options.slideBy;	
				}else if (status == "backward"){
					var activeSlide = activeSlide - options.slideBy; 
				}else if(status == "skip"){
					var activeSlide = active;
				} 		
				if (activeSlide <= 1){				
					var activeSlide = 1;	
					if(options.auto != true){
						slider.find(".sliderPrev").addClass("disabled");
					}					
				}else{
					slider.find(".sliderPrev").removeClass("disabled");
				}
				if (activeSlide >= slideNo){
					var activeSlide = slideNo;					
					if(options.auto != true){
						slider.find(".sliderNext").addClass("disabled");
					}					
				}else{
					slider.find(".sliderNext").removeClass("disabled");
				}			
				if (status == "reset"){
					var activeSlide = 0;
				}
				var activeNumeric = "#goto" + activeSlide;
				var activeNumeric = activeNumeric.replace("active","");
				slider.find(".sliderNumericControls div").removeClass("active");
				slider.find(activeNumeric).addClass("active");
				holder.find(".activeSlide").val(activeSlide);
			}
			
		}); 
	
	}

}	
