Tim Van Wassenhove

Passionate geek, interested in Technology. Proud father of two

01 Sep 2005

Image scroller

// +—————————————————————————
// | // |
// | A javascript picture scroller
// +—————————————————————————

var i = 0;
var pics = new Array();

// define the pictures you want to show (html id, image url, link url)
pics[i++] = new picture(pic + i, /images/scroller/top03.jpg, http://www.microsoft.com’);
//pics[i++] = new picture(‘pic’ + i, ‘/images/scroller/top04.jpg’, ‘http://www.khleuven.be’);
pics[i++] = new picture(pic + i, /images/scroller/top05.jpg, /rss.php);
pics[i++] = new picture(pic + i, /images/scroller/top11.jpg, );

// define the sleep interval
var slow = 100;

/**
* global variables
*/
var lastindex = pics.length;
var pause;
var pictures;
var offset;
var left;

/**
* Scroll
*
* @param id the id in which the scroller should be drawn
*/
function scroller(id)
{
	// load pictures
	pictures = new Array(lastindex);
	for (i = 0; i < lastindex; ++i)
	{
		pictures[i] = new Image();
		pictures[i].src = pics[i].pictureurl;
	}

	offset = document.getElementById(id).offsetLeft + 161;

	// attach pictures to html, display:none
	for (i = 0; i < lastindex; ++i)
	{
		purl = pics[i].pictureurl;
		lurl = pics[i].linkurl;
		pid = pics[i].id;
		ileft = 0;
		document.getElementById(id).innerHTML += <a href="’ + lurl + ‘"><img src="’ + purl + ‘" id="’ + pid + ‘" style="display: none; position: absolute; left:’ + ileft + ‘px; top: 27px;"/></a>’;
	}

	// start
	pause = setInterval("start()", 500);
}

/**
* A container for a picture
*
* @param id the DOM id for this picture
* @param imageurl the URL where the picture can be found
* @param linkurl the URL where the user should be directed to if he clicks the picture
*/
function picture(id, pictureurl, linkurl)
{
	this.id = id;
	this.pictureurl = pictureurl;
	this.linkurl = linkurl;
}

/**
* Determine of the pictures are ready to be displayed
*/
function ready()
{
	// test if there is a picture that is not completely loaded
	for (i = 0; i < lastindex; ++i)
	{
		id = pics[i].id;
		if (!document.getElementById(id).complete)
		{
			return false;
		}
	}
	return true;
}

/**
* Do the actual scrolling
*/
function work()
{
	// move all the pictures to the left
	for (i = 0; i < lastindex; ++i)
	{
		left[i] -= 1;

		// if picture is out the container, position it at the right of the other pictures
		if (left[i] <= offset)
		{

			n = i  1;
			if (n < 0)
			{
				n = lastindex  1;
			}

			l = left[n];
			l += pictures[n].width + 10;
			left[i] = l;
		}

		id = pics[i].id;
		ileft = left[i];
		document.getElementById(id).style.left = ileft + px;
	}
}

/**
* Start the scroller
*/
function start()
{
	if (ready())
	{
		window.clearInterval(pause);

		// calculate positions and make visible
		left = new Array(lastindex);

		for (i = 0; i < lastindex; ++i)
		{
			l = offset;
			for (n = 0; n < i; ++n)
			{
				l += pictures[n].width + 10;
			}
			left[i] = l;

			id = pics[i].id;
			ileft = left[i];
			document.getElementById(id).style.display = inline;
			document.getElementById(id).style.left = ileft + px;
		}

		// work
		interval = setInterval(work();, slow);
	}
}