

$.fn.edSlider = function(options) {  

	var defaults = {  
		visibleSlides:1,  
		slideBy:1,
		vertical:false,  
		numericControls:true,
		nextPrevControls:true,
		auto:true,
		pause:1000
	};  
 
	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(slideNo > "1"){
				
				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.append("<div class='sliderNumericControls'></div>");
					slide.each(function(i){
						i++;
						slider.find(".sliderNumericControls").append("<div class='goto"+ i +"'>"+ i +"</div>");
						var numericControlsCss = {
							"position":"absolute",
							"bottom":"0",
							"cursor":"pointer",
							"z-index":"100"
						};
						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.find(".sliderNumericControls div").click(function(){
					goToSlide($(this));
				});
				
				//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 == 1){					
							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("class").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);
				}
			
			//}
			
		}); 
	
	}

}	
