(function( $ )
{
	$.easing.backout = function(x, t, b, c, d)
	{
		var s=1.70158;
		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
	};
	
	var defaults = {
		elements:'img',
		itemSize:{height:78, width:110},
		view:null,
		navigators:null,
		navigationMode:'s',
		speed:1000,
		wrappers:'simple',
		circular:false,
		easing:'linear',
		axis:'x',
		margin:true,
		start:null,
		setWidth:false,
		scrollByPage:false,
		itemsPerPage:1,
		showPaging:false,
		id:null,
		pagingHeader:'Page'
	};
	
	function wrap($els, type, size)
	{
		switch(type)
		{
			case 'crop': 
				$els = $els.wrap('<div class="crop-wrapper">').parent().css('overflow','hidden');					
			case 'resize': 
				return $els.css(size);
			case 'simple': 
				case 'simple': return $els.wrap('<div class="simple-wrapper">');
			case 'link': 
				if($els.is('img'))
					return $els.wrap('<a onclick="" class="link-wrapper">').parent().each(function(){
					//this.href = 'javascript:void(0)';// this.firstChild.src;
					});
			case 'none':
				return $els; 
			default: return $els;					
		}
	};
	
	$.fn.scrollShow = function(settings)
	{
		settings = $.extend({}, defaults, settings);
		
		return this.each(function()
		{
			var 
				widget	  = this,
				$view	  = settings.view ? $(settings.view, this) : this,
				$elements = $(settings.elements, $view),
				limit	  = $elements.length,
				active	  = 0;
			
			$.each(settings.wrappers.split(/\s*,\s*/), function(i, wrapper)
			{
				$elements = wrap($elements, wrapper, settings.itemSize);													 
			});			
			$elements.css(settings.itemSize);
			
			if(!settings.navigators)
			{
				settings.navigators = '';
				settings.navigationMode = 'r';
			}
			
			if(settings.navigators.constructor != Array)
				settings.navigators = [settings.navigators];
			
			$.each(settings.navigationMode.split(''), function(i, type)
			{
				switch(type.charAt(0))
				{
					case 's'://sequential navigation
						/*$(settings.navigators[i],widget)
							.eq(0).bind('click', { dir: (settings.scrollByPage ? -settings.itemsPerPage : -1)  }, sequential).end()
							.eq(1).bind('click', { dir: (settings.scrollByPage ? +settings.itemsPerPage : +1) }, sequential);*/
						//alert($("div#"+settings.id+">div.left_arrow>a.left").text("aaaaaaaaaaaaaaa"));
						$("div#"+settings.id+">div.left_arrow>a.left").bind('click', { dir: (settings.scrollByPage ? -settings.itemsPerPage : -1)  }, sequential);
						$("div#"+settings.id+">div.right_arrow>a.right").bind('click', { dir: (settings.scrollByPage ? +settings.itemsPerPage : +1) }, sequential);
						$("div#"+settings.id+">div.paging>span.start-over>a").bind("click", function(){random(0);});
					break;
					case 'r'://random navigation
						var $nav = $(settings.navigators[i] || $elements, widget),
							ratio = $elements.length / $nav.length;
						if( ratio === Infinity ) return;//no navigator found
						$nav.each(function( pos ){
							$(this).bind('click', { pos: Math.floor(ratio*pos) }, random);												  
						});
					break;
				}
			});				

			(function($e, w)
			{					  
				var imgw = ($e.width() + attrs('margin') + attrs('padding') + attr('border'));
				
				do w -= imgw;
				while( w > 0 && limit--);
				
				if(!settings.setWidth) return;
				
				do
				{
					$e = $e.parent();
					if($e[0] == $view[0])
						return;
				}while($e.length > 1);
				$e.width( imgw * $elements.length  );
			})($elements, $view.width());

			if(settings.start != null)
				random(settings.start);
			
			function attrs(name)
			{
				return attr(name+'Left') + attr(name+'Right');
			};
			function attr(name)
			{
				return parseInt($elements.css(name)) || 0;	
			};
			
			function sequential(event)
			{
				event.data.pos = active + event.data.dir;
				return random(event);
			};
			
			function random(event)
			{
				var pos = typeof event == 'number' ? event : event.data.pos;
				if(settings.scrollByPage)
				{					//alert(pos);
					if($elements.length % settings.itemsPerPage != 0)
						pages = Math.floor($elements.length / settings.itemsPerPage) + 1;
					else
						pages = $elements.length / settings.itemsPerPage;
					currentPage = (pos == 0 ? 1 : Math.floor(pos / settings.itemsPerPage + 1));
					if(currentPage == 0)
						currentPage = pages;
					else if(currentPage > pages)
						currentPage = 1;
					if(settings.showPaging)
					{
						$("div#"+settings.id+">div.paging>span.page").text(currentPage == 1 ? settings.pagingHeader + " " + currentPage + " of " + pages : settings.pagingHeader + " " + currentPage + " of " + pages);
						if(currentPage != 1)
						{
							$("div#"+settings.id+">div.paging>span.start-over").css("display", "inline");
							$("div#"+settings.id+">div.paging>span.start-over").css("visibility", "visible");
						}
						else
						{
							$("div#"+settings.id+">div.paging>span.start-over").css("display", "none");
							$("div#"+settings.id+">div.paging>span.start-over").css("visibility", "hidden");
						}
					}
					pos = currentPage * settings.itemsPerPage - settings.itemsPerPage;				}
				else
				{					if(pos < 0)
						pos = active == 0 && settings.circular ? limit : 0;
					else if(pos > limit)
						pos = active == limit && settings.circular ? 0 : limit;					}
				$($elements[active]).css("marginLeft", "0px");
				$view.stop().scrollTo($elements[pos], settings);
				active = pos;
				$($elements[active]).css("marginLeft", "4px");
				return false;
			};				
		});
	};
		  
})( jQuery );