var scroller = function() {
	var currentPosition = 0;
	var currentSlide=0;
	var slideCount=0;
	var lock;
	
	var sinoidal = function(val) {
	  return (-Math.cos(val * Math.PI) / 2) + 0.5;
	}
	var scroll_next = function() {
		scroll(currentSlide+1);
	}
	var scroll_prev = function() {
		scroll(currentSlide-1);
	};
	var updateNavigators = function() {
		var links = $$('a[rel=scroll]');
		links.each(function(elem, index) {
			if (index==currentSlide) 
				elem.addClassName("Selected")
			else
				elem.removeClassName("Selected")
			});
	};
	var scroll = function(index) {
		currentSlide = index
		if (currentSlide<0) currentSlide=0;
		if (currentSlide>=slideCount) { 
			currentSlide=slideCount-1;
		}
		lock = true;
		updateNavigators();
	
		var totalOffset = currentSlide * scroller.scrollPanelWidth;
		var desiredOffset = totalOffset - currentPosition;
		var scrollee = $(scroller.scrollPanel);
		var tick = scroller.scrollTime / scroller.ticks;
		var timeIndex = 0;
		var inter;
	
		function animate() {
			timeIndex += tick;
			var delta = sinoidal(timeIndex / scroller.scrollTime) * desiredOffset;
			if (timeIndex > scroller.scrollTime) {
				clearInterval(inter);
				currentPosition = scrollee.scrollLeft;
				lock = false;
				return;
			} 
			scrollee.scrollLeft = currentPosition + delta;
		}
		inter = setInterval(function() { animate(); }, tick);
	}

	var getScrollLinks = function() {
		var links = $$('a[rel=scroll]');
		slideCount=0;
		links.each(function(elem, index) {
			elem.observe('click', function(event) {
				event.stop();
				if (lock) { return false; }
				lock = true;
				scroll(index);
				return false;
			});
			slideCount++;
		});
		links = $$('a[rel=next]');
		links.each(function(elem, index) {
			elem.observe('click', function(event) {
				event.stop();
				if (lock) { return false; }
				lock = true;
				scroll_next();
			});
		});
		links = $$('a[rel=prev]');
		links.each(function(elem, index) {
			elem.observe('click', function(event) {
				event.stop();
				if (lock) { return false; }
				lock = true;
				scroll_prev();
			});
		});
	};

	return { 
		scrollTime: 0,
		ticks: 0,
		scrollPanel: '',
		scrollPanelWidth: 0,

		init: function(panel, duration, frames, panelWidth) {
			scroller.scrollPanel = panel;
			scroller.scrollTime = duration || 500;
			scroller.ticks = frames || 32;
			scroller.scrollPanelWidth = panelWidth || 600;
			getScrollLinks();
		}
	};
}();