function imgCycle(dir) { with (this)
{
 // Stop any exiting play function if this is called manually.
 stop();

 // Increment and mod by the image array length.
 currImg += dir;
 currImg = currImg % data.length;
 if (currImg < 0) currImg += data.length;

 // The image in question -- perhaps nested within its parent layer for NS4.
 var imgRef = parLyr.document.images[myName + 'Img'];

 // IE filters active?
 var f = imgRef.filters;
 if (f&&f.length&&f[0]) f[0].Apply();
 // Swap the image, and play the filter if applicable.
 imgRef.src = data[currImg].src;
 if (f&&f.length&&f[0]) f[0].Play();
}}

function imgPlay() { with (this)
{
 // Cycle one image forwards -- cycle() will stop an existing timeout if applied.
 cycle(1);
 timer = setTimeout(myName + '.play()', delay);
}}

function imgStop()
{
 // Clear the play timer to stop autocycling.
 clearTimeout(this.timer);
 this.timer = null;
}

function ImageCycle(myName, delay, parLyr)
{
 this.myName = myName;
 this.delay = delay;
 this.timer = 0;
 this.parLyr = (document.layers && parLyr ? eval(parLyr) : window);
 this.currImg = 0;

 this.data = new Array();
 for (var i = 3; i < arguments.length; i++)
 {
  // Preload images into an array before swapping.
  this.data[i - 3] = new Image();
  this.data[i - 3].src = arguments[i];
 }
 
 this.cycle = imgCycle;
 this.play = imgPlay;
 this.stop = imgStop;
}
