var timerlen = 5;
var slideAniLen = 500;

var timerID = new Array();
var startTime = new Array();
var obj = new Array();
var endHeight = new Array();
var moving = new Array();
var dir = new Array();

// function slidedown()
// passed: the name of the object to slide open.
// return: depends on the situation. 

function slidedown(objname){

  // If moving do nothing.
  if(moving[objname])
    return;
 
  // If the element is already visible, return a call to slideup()
  // to conceal it.
  if(document.getElementById(objname).style.display != "none")
    return slideup(objname);
 
  // Start the slide. 
  moving[objname] = true;
  dir[objname] = "down";
  startslide(objname);
}

// function slideup()
// passed: the name of the object to slide closed.
// return: depends on the situation. 

function slideup(objname){

  // If moving do nothing.
  if(moving[objname])
    return;
 
  // If the element is already hidden, presume we want to open
  // it, and return a call to slidedown.
  if(document.getElementById(objname).style.display == "none")
    return slidedown(objname);
 
  // Slide the element up.
  moving[objname] = true;
  dir[objname] = "up";
  startslide(objname);
}

// function startslide()
// Do the dirty work of sliding the element.

function startslide(objname){
  // Get the element that we're sliding.
  obj[objname] = document.getElementById(objname);

  // Set the display style.
  obj[objname].style.display = "block";

  // Compute the target height of the object when we're finished.
  endHeight[objname] = parseInt(obj[objname].offsetHeight);
  obj[objname].style.display = "none";
  startTime[objname] = (new Date()).getTime();

  if(dir[objname] == "down"){
   obj[objname].style.height = "1px";
  }

  obj[objname].style.display = "block";
  
  timerID[objname] = setInterval('slidetick(\'' + objname + '\');',timerlen);
}

// function() slidetick
// Determine how quickly to slide open an object.
function slidetick(objname){
  var elapsed = (new Date()).getTime() - startTime[objname];
 
  if (elapsed > slideAniLen)
    endSlide(objname)
  else {
    var d =Math.round(elapsed / slideAniLen * endHeight[objname]);
    if(dir[objname] == "up")
      d = endHeight[objname] - d;
 
    obj[objname].style.height = d + "px";
  }
 
  return;
}

// function endslide()
// Clean up element data after the slide operation is complete.
function endSlide(objname){
  clearInterval(timerID[objname]);
 
  if(dir[objname] == "up")
    obj[objname].style.display = "none";
 
  obj[objname].style.height = endHeight[objname] + "px";
 
  delete(moving[objname]);
  delete(timerID[objname]);
  delete(startTime[objname]);
  delete(endHeight[objname]);
  delete(obj[objname]);
  delete(dir[objname]);
 
  return;
}

