(function($)
{
	$.scrolly = {version: '0.2',instances:0};
	
    $.fn.scrolly = function(settings)
    {
		return this.each(function()
        {
			var scrollLeft;
			var scrollTop;
			var width;
			var height;
			var xdirection;
			var ydirection;
			var queue=new Array();
			var queue_amount=0;
			var busy = false;
			$.scrolly.instances+=1;
			scroll_container = $(this).find(".scrolly_content");	
			left_handler = $(this).find(".scrolly_left");
			right_handler = $(this).find(".scrolly_right");
			up_handler = $(this).find(".scrolly_up");
			down_handler = $(this).find(".scrolly_down");
			width = scroll_container.width();
			height = scroll_container.height();
			settings=$.extend({xdirection:1,ydirection:1,width:width,height: height,speed: 500,queue_amount:queue_amount,left_handler: left_handler,right_handler: right_handler, up_handler:up_handler, down_handler:down_handler,scroll_container:scroll_container},settings);

			settings.scroll_container.css({width:settings.width,height:settings.height,overflow:"hidden"});
			
			function queued(direction) {
				if(settings.queue_amount>0) {
					if(queue.length>=settings.queue_amount) {
						queue.pop();
					}
					queue.unshift(direction);
				}
			}
			function checkqueue() {
				if(queue.length!=0) {
					switch (queue[queue.length-1]) {
						case "left":
						settings.left_handler.click();
						break;
						case "right":
						settings.right_handler.click();
						break;
						case "up":
						settings.up_handler.click();
						break;
						case "down":
						settings.down_handler.click();
						break;
					}
					queue.pop();
				}
			}
			
			settings.left_handler.click(function(e) {
				e.preventDefault();
				var goTo = $(this).attr("value");
				var slideSize = (!isNaN(goTo)) ? (settings.width*settings.xdirection)*(goTo-1) : settings.width*settings.xdirection*-1;
				scroll_container = settings.scroll_container;
				scrollLeft = (!isNaN(goTo)) ? 0 : scroll_container.scrollLeft();
				if (scrollLeft==0) {
					scrollLeft = scroll_container.children().width();
				}
				if (busy == false) {
					busy = true;
					scroll_container.animate({scrollLeft:scrollLeft+(slideSize)},settings.speed,function() {busy =false;checkqueue();});									
				} else {
					queued("left");
				}
			});
			settings.right_handler.click(function(e) {
					e.preventDefault();
					var goTo = $(this).attr("value");
					var slideSize = (!isNaN(goTo)) ? (settings.width*settings.xdirection)*(goTo-1) : settings.width*settings.xdirection;
					scroll_container = settings.scroll_container;
					scrollLeft = (!isNaN(goTo)) ? 0 : scroll_container.scrollLeft();
					if (scrollLeft+settings.width == scroll_container.children().width()) {
							scrollLeft=0;
							slideSize=0;
					}
				if (busy == false) {
					busy = true;
					scroll_container.animate({scrollLeft:scrollLeft+(slideSize)},settings.speed,function() {busy =false;checkqueue();});	
				} else {
					queued("right");
				}
			});
			settings.up_handler.click(function(e) {	
				e.preventDefault();
				var goTo = $(this).attr("value");
				var slideSize = (!isNaN(goTo)) ? (settings.height*settings.ydirection)*(goTo-1) : settings.height*settings.ydirection*-1;
				scroll_container = settings.scroll_container;
				scrollTop = (!isNaN(goTo)) ? 0 : scroll_container.scrollTop() ;
				if (scrollTop==0) {
					scrollTop = scroll_container.children().height();
				}
				if (busy == false) {
					busy = true;
					scroll_container.animate({scrollTop:scrollTop+(slideSize)},settings.speed,function() {busy =false;checkqueue();});									
				} else {
					queued("up");
				}
			});
			settings.down_handler.click(function(e) {
				e.preventDefault();
				var goTo = $(this).attr("value");
				var slideSize = (!isNaN(goTo)) ? (settings.height*settings.ydirection)*(goTo-1) : settings.height*settings.ydirection;
				scroll_container = settings.scroll_container;
				scrollTop = (!isNaN(goTo)) ? 0 : scroll_container.scrollTop() ;
				if (scrollTop+settings.height == scroll_container.children().height()) {
					scrollTop=0;
					slideSize=0;
				}
				if (busy == false) {
					busy = true;
					scroll_container.animate({scrollTop:scrollTop+(slideSize)},settings.speed,function() {busy =false;checkqueue();});									
				} else {
					queued("down");
				}
			});
		
        });
    };
	})(jQuery);
