var ODScroll_animStates = new Object();
var ODScroll_config = new Object();

var ODScroll_scrollers = [];
var ODScroll_autoScrollTimer = -1;

function ODScroll_InitItem(config, obj,disp)
{
	obj.style.display = disp ? '' : 'none';
	obj.style[config.marginProperty] = (disp) ? '-'+obj[config.sizeProperty]+'px' : '0px';

//alert(obj[config.sizeProperty]);
//obj.style[config.marginProperty] = (disp) ? '-'+'0px' : '0px';
}

function ODScroll_BeginMove(id, dir)
{
	if (typeof(ODScroll_animStates[id]) == 'undefined' || dir!=ODScroll_animStates[id].direction)
	{
		var holder = document.getElementById(id);
		var moveEls = holder.getElementsByTagName('div');
		var created = false;
		
		var config = ODScroll_config[id];
		
		if (moveEls.length<=config.numVisible) return;
		
		if (typeof(ODScroll_animStates[id]) == 'undefined')
		{
			if (typeof(holder["onscroll"])!='undefined') holder.onscroll = function() { this[config.scrollProperty] = 0; };
		
			created = true;
			ODScroll_animStates[id] = {direction:dir,offset:0,offsetLimit:0,intervalId:-1,itemSize:0,animIndex:0};
			
			// Move the last element to the front and set its negative margin
			if (dir==1)
				ODScroll_InitItem(config, holder.insertBefore(holder.removeChild(moveEls[moveEls.length-1]),moveEls[0]), true);
			else
			{
				for (var i=1; i<=config.numVisible; i++)
					moveEls[i].style.display = '';
			}

			ODScroll_animStates[id].offset = (dir==1) ? -moveEls[0][config.sizeProperty] : 0;
		}
		else
			ODScroll_animStates[id].animIndex = 10 - ODScroll_animStates[id].animIndex;

		ODScroll_animStates[id].offsetStart = (dir==1) ? -moveEls[0][config.sizeProperty] : 0;
		ODScroll_animStates[id].direction = dir;
		ODScroll_animStates[id].offsetLimit = (dir==1) ? 0 : -moveEls[0][config.sizeProperty];
		ODScroll_animStates[id].itemSize = moveEls[0][config.sizeProperty];

		if (created) ODScroll_animStates[id].intervalId = window.setInterval( function() { ODScroll_DoMove(id); }, 30 );
	}
}

var execCount = 0;

function ODScroll_UpdateOffset(state)
{
	var diff = Math.round( Math.sin(state.animIndex/10) * (state.offsetLimit-state.offsetStart) ); // * state.direction;

	if (state.direction==1) diff += state.offsetStart;
	
	state.offset = diff;
	
	state.animIndex++;
}

function ODScroll_DoMove(id)
{
	if (typeof(ODScroll_animStates[id]) != 'undefined')
	{
		// Restart the timeout
		ODScroll_BeginScrollTimeout();
	
		var state = ODScroll_animStates[id];
		var config = ODScroll_config[id];

		var divs = document.getElementById(id).getElementsByTagName('div');
		var div = divs[0];
		
		ODScroll_UpdateOffset(state);
		
		div.style[config.marginProperty] = state.offset.toString() + "px";

		if (state.offset==state.offsetLimit)
		{
			// Move the first node to the end and reset its margin
			if (state.direction==-1)
				ODScroll_InitItem(config, div.parentNode.appendChild(div.parentNode.removeChild(div)), false);
			else
				ODScroll_InitItem(config, divs[config.numVisible], false);

			ODScroll_EndMove(id);
			return;
		}
	}
}

function ODScroll_EndMove(id)
{
	if (ODScroll_animStates[id])
	{
		window.clearInterval(ODScroll_animStates[id].intervalId);
		ODScroll_animStates[id] = null;
		delete ODScroll_animStates[id];
	}
}

function ODScroll_AutoScroll()
{
	var animating = false;
	
	for (var id in ODScroll_animStates) { animating = true; break; }
	
	if (!animating)
	{
		var id = ODScroll_scrollers.shift();
		ODScroll_scrollers.push(id);
		ODScroll_BeginMove(id, -1);
	}
	else
	{
		ODScroll_BeginScrollTimeout();
	}
}

function ODScroll_InitAutoScroll(id)
{
	ODScroll_scrollers.push(id);
	
	if (ODScroll_autoScrollTimer==-1)
		ODScroll_BeginScrollTimeout();
}

function ODScroll_BeginScrollTimeout()
{
	//var timeOut = Math.round( Math.random() * 15 ) - 5;
	var timeOut = 5;

	window.clearTimeout(ODScroll_autoScrollTimer);
	ODScroll_autoScrollTimer = window.setTimeout( ODScroll_AutoScroll, timeOut*1000 );
}

function ODScroll_Init(id,direction,numVisible,auto)
{

	//if (typeof(ODScroll_config[id])=='undefined')
	{
		var divs = document.getElementById(id).getElementsByTagName('div');
		
		if (typeof(auto)=='undefined') auto = true;
		if (typeof(numVisible)=='undefined') numVisible = 1;
		if (typeof(direction)=='undefined') direction = 'vertical';
		
		ODScroll_config[id] = new Object();
		ODScroll_config[id]['numVisible'] = numVisible;
		ODScroll_config[id]['direction'] = direction;
		
		if (direction=='vertical')
		{
			ODScroll_config[id]['sizeProperty'] = 'clientHeight';
			ODScroll_config[id]['marginProperty'] = 'marginTop';
			ODScroll_config[id]['scrollProperty'] = 'scrollTop';
			
		}
		else
		{
			ODScroll_config[id]['sizeProperty'] = 'clientWidth';
			ODScroll_config[id]['marginProperty'] = 'marginLeft';
			ODScroll_config[id]['scrollProperty'] = 'scrollLeft';
			
		}
		
		for (var i=numVisible; i<divs.length; i++)
			divs[i].style.display = 'none';
		
		if (auto) ODScroll_InitAutoScroll(id);
	}
}