jQuery.fn.scroller = function( options )
{
	var opts = {
		reverse: options.reverse===true,
		pause: options.pause || 1500,
		speed: options.speed || 300,
		endless: options.endless===true,
		autoPlay: options.autoPlay!==false,
		pageNumbers: options.pageNumbers && /^[TMB][LMR]$/i.test(options.pageNumbers) ? options.pageNumbers.toUpperCase() : null,
		pageControls: options.pageControls && /^[TMB][LMR]$/i.test(options.pageControls) ? options.pageControls.toUpperCase() : null
	}
	
	
	return this.each( function( index, domElm )
	{
		function addButton( control, text, className )
		{
			return $("<a " + (className!==undefined ? "class='" + className + "' " : "") + "href='javascript:return false;'>" + text + "</a>").appendTo( control ).css("float","left")

		}
		
		function addControl( anchor )
		{
			return $("<div/>").attr( "class", "control" ).appendTo( anchor ).css("float","left")
		}
		
		function getAnchor( name )
		{
			if (!anchors[name])
			{
				var anchor = $("<div/>").css( "position", "absolute" ).addClass("control-box");
				
				switch (name.charAt(0))
				{
					case "T":
						anchor.css( "top", 20 );
						break;
					case "M":
						anchor.css( "top", "50%" )
						break;
					case "B":
						anchor.css( "bottom", 20 );
						break;
				}
				switch (name.charAt(1))
				{
					case "L":
						anchor.css( "left", 20 );
						break;
					case "M":
						anchor.css( "left", "50%" );
						break;
					case "R":
						anchor.css( "right", 20 );
						break;
				}
				anchors[name] = anchor.appendTo( jElm )
			}
			return anchors[name];
		}
		
		
		var jElm = $(domElm).addClass("scroller")
		var innerWidth = jElm.innerWidth()
		var inTransition = false
		var timer, pageNumbers, pageControls
		var anchors = {}
		var index, lastIndex
		
		if (opts.endless)
		{
			jElm.children(":first").clone().appendTo( jElm )
		}
		jElm.css( { position: "relative", overflow: "hidden", width: innerWidth } )
		var items = jElm.children().css( { width: innerWidth, float: "left" } )
		var container = $("<div/>").css( { width: innerWidth * items.length, position: "relative" } ).appendTo( jElm ).append( items )


		if (items.length>1)
		{
			if (opts.pageNumbers)
			{
				pageNumbers = addControl(getAnchor(opts.pageNumbers));
				items.each(
					function( i )
					{
						if (!(i==items.length-1 && opts.endless))
						{
							addButton( pageNumbers, i+1 ).bind("click", function(e) { if (!inTransition && index!=i) { index=i; update()}; e.preventDefault(); return false })
						}
					}
				)
			}

			if (opts.pageControls)
			{
				pageControls = addControl(getAnchor(opts.pageControls));
				addButton( pageControls, "&lt;" ).bind("click", function(e) { if (!inTransition) { index--; update()}; e.preventDefault(); return false })
				addButton( pageControls, "&gt;" ).bind("click", function(e) { if (!inTransition) {index++; update()}; return false })
			}
		}

		lastIndex = index = opts.reverse ? items.length-1 : 0;
		container.css("left", -(index)*innerWidth);
		update()
		
		if (opts.autoPlay)
		{		
			play()
		}		
		

		
		function play()
		{
			pause()
			timer = setInterval( function() { index += (opts.reverse) ? -1 : 1; update()}, opts.pause )
		}
		
		function pause()
		{
			clearInterval(timer)
		}
		



		function update()
		{
			container.stop()
			if (opts.autoPlay)
			{		
				pause()
			}
			
			if (index < 0)
			{				
				/*lastIndex = */index = items.length - 1
				if (opts.endless)
				{
					container.css("left", -(index--)*innerWidth);
				}
			}
			
			if (index > items.length - 1)
			{
				/*lastIndex = */index = 0
				if (opts.endless)
				{
					container.css("left", index++);
				}
			}			
			
			var eventArgs = { from: lastIndex, to: index}
			
			if (pageNumbers)
			{
				pageNumbers.children("a:eq(" + lastIndex + ")").removeClass("active")
				pageNumbers.children("a:eq(" + index + ")").addClass("active")
			}
			
			inTransition = true;
			jElm.trigger("transitionstart", eventArgs )
			
			container.animate({left: -index*innerWidth }, opts.speed, function() 
			{ 
				jElm.trigger("transitionstop", eventArgs)
				if (opts.autoPlay) 
				{
					play()
				}
				lastIndex = index
				inTransition = false; 

			} );
	
		}
		
		
		
		
	})
	
	
}
