function fade(id, min, max, step, hide)
{
  e=document.getElementById(id);
  if (e==null || step==0 || min>=max) return;
  e.fade_min=min;
  e.fade_max=max;
  e.fade_step=Math.ceil((max-min)*fader.delay/step);
  e.hide=hide;

  // Set initial fade value if not yet set
  if (e.fade_value==null)
    if (step>0) e.fade_value=min;
    else e.fade_value=max;
  if (e.fade_value<min) e.fade_value=min;
  if (e.fade_value>max) e.fade_value=max;

  // Add to Fader's element list
  if (!(id in fader.list))
  {
    fader.list[id]=e;
    fader.list.length++;
    if (fader.list.length==1) fader_step();
  }
}



function fader_step()
{
  for (i in fader.list)
  {
    e=document.getElementById(i);
    if (e!=null && e.fade_value!=null)
    {
      e.fade_value+=e.fade_step;
      if (e.fade_step>0)
      {
	// Fade in
	if (e.fade_value>e.fade_max)
	{
	  e.fade_value=e.fade_max;
	  delete fader.list[i];
	  fader.list.length--;
	}
      }
      else
      {
	// Fade out
	if (e.fade_value<e.fade_min)
	{
	  e.fade_value=e.fade_min;
	  delete fader.list[i];
	  fader.list.length--;
	}
      }
      if (e.style.opacity!=null) e.style.opacity=e.fade_value/1000;
      if (e.style.filter!=null)
	if (e.fade_value==1000) e.style.filter=null;
	else {
	  e.style.filter='alpha(opacity='+(e.fade_value/10)+')';
	  }
      if (e.hide) e.style.visibility=(e.fade_value>0)?'visible':'hidden';
      else if (e.fade_value>0) e.style.visibility='visible'; // Make sure it is visible, but do not hide

      // window.status=fader.list.length+' in list  :  id '+i+'  :  e is '+e+'  :  fade is '+e.fade_value+'  :  visibility is '+e.style.visibility;
    }
  }
  if (fader.list.length>0) self.setTimeout("fader_step()", fader.delay);
}



// Class
function Fader()
{
  this.list=new Object();
  this.list.length=0;
  this.delay=50;
}



// Fader instance
var fader=new Fader();

