function scroller()
{
	var items;	// divs we move
	var contentmap;	// content insert into divs
	var cpos;	// current position in map
	var timer;
	var maxl;	// leftmost div

	var ammoving;
	var dclick;

	var sparediv;

	var callback;
	var prefix = "item";
	var click = null;
	var instantmove;

	var callme;

	var delta = 10;
	
	this.setdelta = function(c)
	{
		delta = c;
	}
	this.noscroll = function(c)
	{
		instantmove = c;
	}
	this.setname = function(c)
	{
		prefix = c;
	}
	this.setclick = function(c)
	{
		click = c;
	}
	this.addcontent = function(content)
	{
		if (!contentmap) contentmap = new Array;
		contentmap[contentmap.length] = content;
	}
	this.setcallback = function(c)
	{
		callback = c;
	}
	this.shuffleleft = function()
	{
		var d;
		var i;

		cpos++;
		if (cpos >= contentmap.length) cpos = 0;
		d = items[0];
		for(i=1;i<items.length;i++) {
			items[i-1] = items[i];
		}
		sparediv = items.length - 1;
		items[sparediv] = d;
		d.style.left = maxl + "px";
		d.innerHTML = contentmap[(cpos + (items.length-1))%contentmap.length];
		return;
	}
	this.shuffleright = function()
	{
		var d;
		var i;

		cpos--;
		if (cpos < 0) cpos = contentmap.length - 1;
		d = items[items.length-1];
		for(i=items.length-1;i;i--) {
			items[i] = items[i-1];
		}
		sparediv = 0;
		items[0] = d;
		d.style.left = "0px";
		d.innerHTML = contentmap[cpos];
	}
	this.stop = function()
	{
		if (!ammoving) return;
		dclick = true;
		clearTimeout(timer);
		if (ammoving == -1) while(!this.movediv());
		else while(!this.movediv());
		dclick = false;
	}
	this.move = function(dir)
	{
		var d;
/*
 * move depending on direction.
 * we have a spare div. its either the leftmost one or
 * the rightmost
 */
/* this controls the direction. Taking this out reverses the button direction */
		dir = -dir;
		if (callme && !callme()) return;
 		if (ammoving) {
			if (dclick) return;// catch multiple clicks
			dclick = true;
			clearTimeout(timer);
			if (ammoving == -1) while(!this.movediv());
			else while(!this.movediv());
			dclick = false;
		}
		ammoving = dir;
		if (dir == -1 && sparediv == 0) {
			this.shuffleleft();
		} else if (dir == 1 && sparediv != 0) {
			this.shuffleright();
		}
		if (instantmove) {
			if (ammoving == -1) while(!this.movediv());
			else while(!this.movediv());
			return;
		}
		var me = this;
		timer = setInterval(function(){me.movediv()},100);
	}
	this.movediv = function()
	{
		var c;
		var i;
		var t;
		var inc;
		var mx;
	
		if (ammoving == 1) {
			t = items.length - 1;
			mx = maxl;
			inc = delta;
		} else {
			t = 0;
			inc = -delta;
			mx = 0;
		}
		if (parseInt(items[t].style.left) == mx) {
			clearTimeout(timer);
			if (ammoving == 1) this.shuffleright();
			else this.shuffleleft();
			ammoving = 0;
			return true;
		}
		for(i=0;i<items.length;i++) {
			c = parseInt(items[i].style.left);
			c += inc;
			if (c > maxl) c = maxl;
			else if (c < 0) c = 0;
			items[i].style.left = c + "px";
		}
		return false;
	}
	this.load = function()
	{
		var d;
		var i;
		var c;
	
		i = 1;
		items = new Array;
		while(d = document.getElementById(prefix + i)) {
			items[i-1] = d;
			if (click) d.onclick = click;
			i++;
		}
		// get rightmost item
		maxl = parseInt(items[items.length-1].style.left);
		sparediv = items.length-1;
		for(i=0;i<items.length && i < contentmap.length;i++) {
			items[i].innerHTML = contentmap[i];
		}
		ammoving = 0;
		cpos = 0;
		if (callback) callback();
	}
	this.gettarget = function(d)
	{
		var dp;
		var i;

		for(i=0;i<items.length;i++) {
			dp = d;
			while(dp) {
				if (items[i] == dp) return [ dp, (i+cpos) % contentmap.length ];
				dp = dp.offsetParent;
			}
		}
		return null;
	}
	this.getpos = function(d)
	{
		var dp;

		dp = gettarget(d);
		if (!dp) return -1;
		return dp[1];
	}
	this.getcontentpos = function(d)
	{
		var c;

		c = this.getpos(d);
		if (c < 0) return c;
		return ((c + cpos) % contentmap.length);
	}
	this.callonmove = function(c)
	{
		callme = c;
	}
}

