var scrollSteps = 40; // <-- # of incremental steps
var scrollDelay = 10; // <-- delay between steps

var _scrollObject = {
	'init': 0,
	'elem': null,
	'content': null,
	'list': new Array(),
	'width': 0,
	'inc': 0,
	'diff': 0,
	'lastinc': 0,
	'current': 0
};

function init_scroll_object(id) {
	var elem = document.getElementById(id);
	if(elem == null) {
		return false;
	}
	var width = parseInt(elem.offsetWidth);

	if(!elem.style.position) { // set relative only if no position has been set
		elem.style.position = 'relative';
	}
	if(!elem.style.height) { // set relative only if no position has been set
		elem.style.height = parseInt(elem.offsetHeight)+'px';
	}
	elem.style.overflow	= 'hidden';

	var list = elem.getElementsByTagName('DIV');
	var id_index = {};
	for(var i = 0; i < list.length; i++) {
		if(list[i].id != null) {
			list[i].style.position	= 'absolute';
			list[i].style.display	= 'block';
			list[i].style.width		= width+'px';
			list[i].style.top		= '0px';
			list[i].style.left		= width*i + i + 'px';
			id_index[list[i].id] = i;
		}
	}
	var inc		= Math.max(Math.round(width/scrollSteps),1); // <-- ensure the increment is not less than 1
	var diff	= Math.ceil((width - (inc*scrollSteps)) / inc); // <-- correct for rounding differences
	var lastinc	= (width - (inc*scrollSteps));

	_scrollObject.init		= 1;
	_scrollObject.inc		= inc;
	_scrollObject.diff		= diff;
	_scrollObject.lastinc	= lastinc;

	_scrollObject.width		= width;
	_scrollObject.elem		= elem;
	_scrollObject.list		= list;
	_scrollObject.id_index	= id_index;
	_scrollObject.current	= 0;
}

function scroll(id,dir,toid) {
	if(!_scrollObject.init) {
		init_scroll_object(id);
	}
	if(_scrollObject.elem == null || _scrollObject.list.length == 0) {
		return false;
	}
	if(dir == null) {
		dir = 0;
	}
	var mult = dir > 0 ? -1 : 1; // <-- mult == -1 -> scroll left; mult == 1 -> scroll right

	var to_index = 0;
	to_index = toid == null ? _scrollObject.current + dir : _scrollObject.id_index[toid];

	if(to_index < 0 || to_index >= _scrollObject.list.length || to_index == _scrollObject.current) {
		return false;
	}
	var iterations = 1;
	if(to_index < _scrollObject.current) {
		mult = 1;
		iterations = _scrollObject.current - to_index;
	}
	else {
		mult = -1;
		iterations = to_index - _scrollObject.current;
	}

	var val = _scrollObject.inc*mult;
	for(var iter = 1; iter <= iterations; iter++) {
		for(var i = 0; i < scrollSteps+_scrollObject.diff; i++) { // <-- an extra step to ensure completion
//			if(i == scrollSteps+_scrollObject.diff) {
// 				val = lastinc + i;
//			}
			setTimeout('_doscroll('+val+')', scrollDelay*i);
		}
	}
	_scrollObject.current = to_index;
	if(scrollCallback != null && typeof(scrollCallback) == 'function') {
		scrollCallback(_scrollObject);
	}
}

function _doscroll(value) {
	for(var i = _scrollObject.list.length-1; i >= 0; i--) {
		_scrollObject.list[i].style.left = (parseInt(_scrollObject.list[i].style.left) + value) + 'px';
	}
}

