/* Params Format Schema

{
	numElements: [Number] Number of elements to be indexed through
	sliders: [Array] of objects containing both elements to scroll, and the distance each item in the list must move, and whether 
			or not it is clickable 
			ex: {element: $("listMover"), stride:100, click:false, autoSlide:false}
	direction: [String] "horizontal" || "vertical", indicating direction of movement
	previousElement: [Object] DOM element (or jQuery Object) used as next button
	nextElement: [Object] element (or jQuery Object) used as next button
	slideTime: [Number] Length of time per transition (in seconds)
	wrap: [Boolean] Wrap index (though not items)
	callBack: [Function] Called when rotator changes
	autoChangeIndex: [Boolean] indicates whether changing direction changes the selection index
}


*/


function sb_initRotator(params)
{
	var currentIndex = 0,
		movementSelector = (params.direction == "horizontal") ? "left" : "top",
		nextButton = $(params.nextElement),
		prevButton = $(params.previousElement),
		wrap = params.wrap ? params.wrap : false,
		time = params.slideTime ? params.slideTime * 500 : 1000,
		numElements = params.numElements ? params.numElements : -1,
		animCallback = params.callBack,
		autoChangeIndex = params.hasOwnProperty("autoChangeIndex") ? params.autoChangeIndex : false;
		selectedIndex = 0;
	
	var addSlidingItemHandler = function(index, doSlide)
	{
		$(this).click(
			function ()
				{
					scrollToIndex(index, true);
				});
	}
	
	var addItemHandler = function(index, doSlide)
	{
		
		$(this).click(
			function ()
				{
					scrollToIndex(index, false);
				});
	}
	
	//Preset offsets
	for (var i in params.sliders)
	{
		var slider = params.sliders[i];
		var element = $(slider.element);
		var offset = slider.offset;
		
		//element.css("position", "absolute");
		
		if(slider.click)
		{
			if(slider.autoSlide)
				element.find("li").each(addSlidingItemHandler);
			else
				element.find("li").each(addItemHandler);
		
		
		}
		var len = element.find("li").length;
		if(numElements < len)
			numElements = len;
		
		
		
		for(var i = 0; i < offset; ++i)
		{
			var pop = element.find("li:first");
			pop.detach().appendTo(element.find("ul:first"));
		}
	}
		
	var scrollToIndex = function(index, doSlide) 
	{
		if(index < currentIndex)
			index += numElements;
		
		for (var i in params.sliders)
		{
			slider = params.sliders[i];
			if(slider.autoSlide)
				scrollForward(slider, index - currentIndex);
		}
		
		currentIndex = wrap ? (currentIndex + (index - currentIndex)) % numElements : Math.min(currentIndex + (index - currentIndex), numElements - 1);
		
		selectedIndex = currentIndex;
		
		if(animCallback)
			animCallback(selectedIndex);
	}
	
	var scrollForward = function(slider, count)
	{
		count = count ? count : 1;
		
		var element = $(slider.element);
		var p = {};
		var ri = slider.offset == null ? 0 : slider.offset;
		
		var scrollComplete = function(event)
		{
			var pop = element.find("li:lt("+ count +")");
			pop.detach().appendTo(element.find("ul:first"));
			p[movementSelector] = "0px";
			element.css(p);
		}
		
		p[movementSelector] = "-" + (slider.stride * count) + "px";
		element.animate(p, time, "easeInOutQuad", scrollComplete);
	
	}
	
	var scrollBackward = function(slider, count)
	{
		count = count ? count : 1;
			
		var element = $(slider.element);
		var p = {};
		var ri = slider.offset == null ? 0 : slider.offset;
		
		var i = element.find("li").length;
		
		var pop = element.find("li:gt("+ (i - count -1) +")");
		pop.detach().prependTo(element.find("ul:first"));
		
		p[movementSelector] = "-" + (slider.stride * count) + "px";
		element.css(p);
		
		p[movementSelector] = "0px";
		element.animate(p, time, "easeOutQuad");
	
	}
	
	nextButton.click( function() {
		currentIndex = wrap ? (currentIndex + 1) % numElements : Math.min(currentIndex + 1, numElements - 1);
		//scrollToIndex( currentIndex );
		for (var i in params.sliders)
		{
			scrollForward(params.sliders[i]);
		}
		
		if(animCallback && autoChangeIndex)
			animCallback(currentIndex);
	});
	
	prevButton.click( function() {
		currentIndex = wrap ? (currentIndex - 1 + numElements) % numElements : Math.max(currentIndex - 1, 0);
		//scrollToIndex( currentIndex );
		for (var i in params.sliders)
		{
			scrollBackward(params.sliders[i]);
		}
		
		if(animCallback && autoChangeIndex)
			animCallback(currentIndex);
	});
	
}
