function TCWslider( div_name )
{
//==========================================================================
// Start of the TCWslider functions
//==========================================================================

	function setupClassNames( )
	{
		var i;
		
		slider_root.className += (' ' + div_name + "-gallery");	
		ul_root.className += (' ' + div_name + "-slider " + div_name + "-horiz");

		for(i=0;i<li_nodes.length;i++)
		{
			if(li_nodes[i].parentNode == ul_root)
			{
				li_nodes[i].className += (' ' + div_name + "-slide");
			}
		}
	}
	
	function resetSlider( )
	{
		
		slider_width  = slider_root.offsetWidth;
		
    img_width = slider_width / images.length;

    var i, j;
		var frame_nodes;
    for(i=0;i<li_nodes.length;i++)
		{
			li_nodes[i].style.width = img_width + "px";
			li_nodes[i].style.left = i*img_width + "px";
			li_nodes[i].style.top = "0px";
			li_nodes[i].setAttribute("z_left",i*img_width);
			li_nodes[i].setAttribute("z_new_left",i*img_width);
			frame_nodes = li_nodes[i].getElementsByTagName('IFRAME');
			for(j=0;j<frame_nodes.length;j++)
			{
				frame_nodes[j].onmouseover = mouseover;
				setHidden(frame_nodes[j]);
			}
			frame_nodes = li_nodes[i].getElementsByTagName('P');
			for(j=0;j<frame_nodes.length;j++)
			{
				frame_nodes[j].onmouseover = mouseover;
				frame_nodes[j].onmouseout = mouseout;
			}
		}
		for(i=0;i<images.length;i++)
		{
			images[i].onmouseover = mouseover;
			images[i].onmouseout = mouseout;
			images[i].style.display = 'block';
			setOpaque(images[i]);
		}
	}
	
	function imageLoaded()
	{
	  image_load_count++;
		if(image_load_count == images.length)
		{
		  resetSlider();
		}
	}
	
	function waitForImages()
	{
		var i;
		for(i=0;i<images.length;i++)
		{
			images[i].onload = imageLoaded;
		}
	}
	
	function setOpaque( elem )
	{
	  clearOpaque( elem );
	  elem.className += (' ' + opaque_class );
	}
	
	function clearOpaque( elem )
	{
		var before;
		do
		{
			before = elem.className;
			elem.className = elem.className.replace(not_opaque_class,'');
		} while(elem.className != before);
	}
	
	// Hide frames when not in use.
	function setHidden( elem )
	{
		elem.style.display = 'none';
	}
	
	function clearHidden( elem )
	{
	  elem.style.display = 'block';
	}
	
	function imageIndex( elem )
	{
	  var i;
		for(i=0;i<images.length;i++)
		{
			if(images[i] == elem) { return i; }
		}
		for(i=0;i<images.length;i++)
		{
			if( images[i].parentNode == elem.parentNode || 
					images[i].parentNode.parentNode == elem.parentNode) { return i; }
		}
		return -1;
	}
	
	function isFrameNode( elem )
	{
		return elem.nodeType == 'IFRAME';
	}
	
	function Left( index )
	{
	  return parseFloat( li_nodes[index].getAttribute('z_left') );
	}
	
	function newLeft( index )
	{
	  return parseFloat( li_nodes[index].getAttribute('z_new_left') );
	}
	
//==========================================================================
// Start of the animation functions
//==========================================================================

  function alertLefts( xxx )
	{
	  var x = xxx + ' ';
		for(i=0;i<li_nodes.length;i++)
		{
		  x += li_nodes[i].getAttribute('z_left') + ' | ';
		}
		x += ' $$$$$$ ';
		for(i=0;i<li_nodes.length;i++)
		{
		  x += li_nodes[i].getAttribute('z_new_left') + ' | ';
		}	
		alert(x);
	}

	function mouseover()
	{
		var i;
		var index = imageIndex(this); // the index of the image the mouse is over
		if(index < 0)return;
		var image = images[index];
		var dx = (slider_width - image.clientWidth)/(li_nodes.length - 1);
	
	  clearOpaque(images[index]);
		
		for(i=index+1;i<li_nodes.length;i++)
		{
			li_nodes[i].setAttribute("z_new_left",image.clientWidth+(i-1)*dx);
		}
		for(i=0;i<index;i++)
		{
			li_nodes[i+1].setAttribute("z_new_left",(i+1)*dx);
		}
		var	frame_nodes = li_nodes[index].getElementsByTagName('IFRAME');
		for(j=0;j<frame_nodes.length;j++)
		{
			clearHidden(frame_nodes[j]);
		}
		
		startMove();
	}
	
/*	function hideAllFrames()
	{
		var i, j;
		
		for(i=0;i<li_nodes.length;i++)
		{
		  var frame_nodes = li_nodes[i].getElementsByTagName('IFRAME');
			for(j=0;j<frame_nodes.length;j++)
			{
//			  setHidden(frame_nodes[j]);
			}
		}
	}*/
	
	function mouseout()
	{
		var index = imageIndex(this);
		if(index <0 )return;
		setOpaque(images[index]);
		for(i=0;i<li_nodes.length;i++)
		{
			li_nodes[i].setAttribute("z_new_left",i*img_width);
		}
		var	frame_nodes = li_nodes[index].getElementsByTagName('IFRAME');
		for(j=0;j<frame_nodes.length;j++)
		{
			setHidden(frame_nodes[j]);
		}
		startMove();
	}
	
	function startMove()
	{
		if(timer < 0)
		{
			if(IE)
			{
				timer = setInterval(myself.doSlide,8);
			}
			else
			{
				timer = setInterval(myself.doSlide,16);
			}
		}
	}
	
	function doSlide()
	{
	  var move_count = 0;
    var i;
		var left, new_left, delta;
		var divisor = 10;
		for(i=0;i<li_nodes.length;i++)
		{
		  left = Left(i); 
			new_left = newLeft(i);
			if(IE)
			{
				divisor = 5; // slide faster 'cause IE is slow
			}
			
			delta = ((new_left - left)/divisor);

			if((Math.abs(delta*divisor)>1))//left != new_left)
			{
			  move_count++;
				left = left + delta; //Math.floor((new_left - left)/10);
				li_nodes[i].setAttribute("z_left",left);
			}
		}

		if(move_count)
		{
			for(i=0;i<li_nodes.length;i++)
			{
				li_nodes[i].style.left = Left(i) + 'px';
				if(i == 0)
				  li_nodes[i].style.width = Left(i+1) + "px";
				else if(i == li_nodes.length-1)
				  li_nodes[i].style.width = slider_width - Left(i) + "px";
				else
				  li_nodes[i].style.width = Left(i+1) - Left(i) + "px";

			}
		}
		else
		{
			clearInterval(timer);
			timer = -1;
		}
	}
	
//==========================================================================
// Start of the TCWSlider main code
//==========================================================================
	
  var slider_root = document.getElementById( div_name );
	var ul_root = slider_root.getElementsByTagName( 'UL' )[0];
	var li_nodes = ul_root.getElementsByTagName('LI'); // Note, may contain sub list elements.  check parentage;
	var images = ul_root.getElementsByTagName('IMG');

	var slider_width;
	var img_width; // visible part of images when un-slid
	var image_load_count = 0;

	var opaque_class = div_name + "-opaque";
	var not_opaque_class = new RegExp(opaque_class);
	
  var timer = -1;
  var myself = this;
	this.doSlide = doSlide;

	var IE = false;
	if(document.all){ IE=true;}  // For internet explorer hacks
	
	setupClassNames( );

	waitForImages();
	
//	onload = resetSlider; // This KILLS Point2 links (?????)
	onresize = resetSlider;
	
	if(navigator.userAgent.substring(0,5) == 'Opera')
	{
		resetSlider(); 	// For some reason waitForImages and onload 
										// fail when the browser is Opera
	}
}
