(function($){
	
	$.fn.jslide = function(options){
		
		var args = arguments;
		
		if(args.length===1 && typeof args[0]==="object"){
			options = $.extend({
				direction: "vertical",
				speed: 600,
				easing: "swing",
				pos: 0,
				loop: false
			}, options || {});
		}else{
			var result;
			this.each(function(){
				result = $(this).data('jslide_api')[args[0]](args[1]);
			});
			return result;
		};
		
		return this.each(function(){
			var $that = $(this);
			var $slider = $that.children('ul');
			
		//	setup
			var blocks = Math.ceil($slider.children('li').length / options.items) -1;
			
			if(options.pos > blocks){
				options.pos = blocks;
			};
			
			$that.css({
				position: "relative",
				overflow: "hidden",
				width: options.width,
				height: options.height
			});
			
			var swidth = (options.direction==="vertical") ? options.width : options.width*(blocks+1) ;
			var sheight = (options.direction==="vertical") ? options.height*(blocks+1) : options.height ;
			
			$slider.css({
				position: "absolute",
				top: (options.direction==="vertical")?-(options.pos * options.height):0,
				left: (options.direction==="vertical")?0:-(options.pos * options.width),
				listStyle: "none",
				margin: 0,
				padding: 0,
				outline: "none",
				width: swidth,
				height: sheight
			});
			
			$slider.children('li').css({float:"left"});
			
			if(options.loop===false){
				if(options.pos===0){
					$(options.back).css({visibility:"hidden",opacity:0});
				}else if(options.pos===blocks){
					$(options.next).css({visibility:"hidden",opacity:0});
				};
			};
			
			$that.data('jslide_options', options);
			
		//	interactivity
			var anim = function(){
				if($(options.slidebar).length !== 0){
					$(options.slidebar).slider('value', options.pos);
				};
				
				if(options.direction==="vertical"){
					$slider.stop(true).animate({
						top: -(options.pos * options.height)
					}, options.speed, options.easing);
				}else{
					$slider.stop(true).animate({
						left: -(options.pos * options.width)
					}, options.speed, options.easing);
				};
			};
			
			var nextfn = function(source){
				if(source !== true){
					ss.stop();
				};
				
				$(options.back).css({visibility:"visible"}).animate({opacity:1});
				if(options.pos < blocks){
					options.pos++;
					if(options.pos===blocks && options.loop===false){
						$(options.next).animate({opacity:0}, function(){
							$(this).css({visibilty:"hidden"});
						});
					};
				}else{
					options.pos = (options.loop===true)?0:blocks;
				};
				anim();
				return false;
			};
			
			var prevfn = function(source){
				if(source !== true){
					ss.stop();
				};
				
				$(options.next).css({visibility:"visible"}).animate({opacity:1});
				if(options.pos > 0){
					options.pos--;
					if(options.pos===0 && options.loop===false){
						$(options.back).animate({opacity:0}, function(){
							$(this).css({visibilty:"hidden"});
						});
					};
				}else{
					options.pos = (options.loop===true)?blocks:0;
				};
				anim();
				return false;
			};
			
			$(options.next).bind('click', nextfn);
			$(options.back).bind('click', prevfn);
			
			
		//	slideshow mode
			var ss={};
			
			ss.start = function(opts){
				ss.options = $.extend(options.slideshow, opts || {});
				
				ss.c =0;
				
				ss.interval = setInterval(function(){
					ss.c+=ss.options.delay + options.speed;
					if(ss.options.direction==='back'){
						prevfn(true);
					}else{
						nextfn(true);
					};
					if(ss.options.duration!==0 && ss.c>ss.options.duration){
						clearInterval(ss.interval);
					};
					
				}, ss.options.delay + options.speed);
			};
			
			ss.stop = function(){
				clearInterval(ss.interval);
				ss.c = 0;
			};
			
			if(typeof options.slideshow !== 'undefined'){
				ss.start(options.slideshow);
			};
			
		//	public api
			var api = {};
			
			api.next = nextfn;
			api.back = prevfn;
			api.slideshow_start = ss.start;
			api.slideshow_stop = ss.stop;
			
			api.go = function(i){
				if(options.pos>i){
					options.pos = i+1;
					prevfn();
				}else if(options.pos<i){
					options.pos = i-1;
					nextfn();
				};
			};
			
			api.get = function(){
				return {
					max: blocks,
					page: options.pos,
					height: sheight,
					width: swidth
				};
			};
			
			$that.data('jslide_api', api);
			
		});
	};
	
})(jQuery);
