(function($){
		  
	$.fn.jSlide = function(options){
	
		options = $.extend({
						   
			speed: 600,
			easing: "swing",
			direction: "horizontal",
			loop: "false",
			single: "false"
		
		}, options || {})
		
		
		//--------------------------- Initialization
		
		var $that = this.eq(0);
		var $slider = $that.children("ul");
		var $original = this;
		
		var blocks = Math.ceil( $slider.children("li").length/options.items)-1;
		var curPos = 0;
		
		var sWidth = (options.direction == "horizontal")?options.width*(blocks+1):options.width;
		var sHeight = (options.direction == "horizontal")?options.height:options.height*(blocks+1);
		
		$that.css({
		
			position: "relative",
			overflow: "hidden",
			width: options.width,
			height: options.height
		
		})
		
		$slider.css({
		
			position: "relative",
			top: 0,
			left: 0,
			listStyle: "none",
			margin: 0,
			padding: 0,
			outline: "none",
			width: sWidth,
			height: sHeight
		
		})
		
		$slider.children("li").css({float:"left"});
		
		if(options.single===true){
			var ln = $slider.children('li').length;
			var divideH = options.width / $slider.children('li:first').outerWidth(true);
			var divideV = options.height / $slider.children('li:first').outerHeight(true);
			blocks = (options.direction=="horizontal")?Math.floor(ln/options.items)*divideH:Math.floor(ln/options.items)*divideV;
			blocks -= options.items - (ln%options.items);
		}else{
			var divideH = 1;
			var divideV = 1;
		};
		
		
		
		//--------------------------- Interactivity
		
		var anim = function(){
			
			if(options.direction == "horizontal"){
				
				$slider.stop(true).animate({left: -(curPos*options.width / divideH)}, options.speed, options.easing)
				
			}else{
				
				$slider.stop(true).animate({top: -(curPos*options.height / divideV)}, options.speed, options.easing)
			
			};
		
		};
		
		var nextfn = function(){
			
			// Change Current Display
			
			if(curPos < blocks){
			
				curPos++;
				
				$(options.previous).css({visibility: "visible"}).animate({opacity:1}, 300)
				
				if(options.loop === false && curPos >= blocks){
					
					$(options.next).animate({opacity: 0}, 300, function(){
					
						$(this).css({visibility: "hidden"});
					
					})
					
				};
			
			}else{
				
				if(options.loop === true){
					
					curPos = 0;
					
				};
			};
			
			// Change Animation
			
			anim();
			
			
			return false
		
		};
		
		var previousfn = function(){
			
			// Change Current Display
			
			if(curPos > 0){
			
				curPos--;
				
				$(options.next).css({visibility: "visible"}).animate({opacity:1}, 300)
				
				if(options.loop === false && curPos <= 0){
					
					$(options.previous).animate({opacity: 0}, 300, function(){
																			
						$(this).css({visibility: "hidden"});
					
					});
					
				};
			
			}else{
				
				if(options.loop === true){
					
					curPos = blocks;
					
				};
				
			};
			
			
			// Change Animation
			
			anim();
			
			
			return false
		
		};
		
		
		$(options.next).bind("click", nextfn);
		$(options.previous).bind("click", previousfn);
		
		
		
		
		//--------------------------- Public API
		
		this.jSlide.goto = function(page){
		
			curPos = page;
			anim();
		
		};
		
		this.jSlide.next = nextfn;
		this.jSlide.previous = previousfn;
		
		this.jSlide.get = function(){
			
			return {
			
				max: blocks,
				page: curPos
			
			};
		
		};
		
		return this;
		
	
	};
		  
})(jQuery);
