// http://www.harrymaugans.com/2007/03/06/how-to-create-an-animated-sliding-collapsible-div-with-javascript-and-css/

var timerlen = 5;
var slideAniLen = 1000;
var timerID = [];
var startTime = [];
var obj = [];
var endHeight = [];
var moving = [];
var dir = [];

function getHeight(element) {
  if (document.defaultView && document.defaultView.getComputedStyle) {
    return document.defaultView.getComputedStyle(element, '').getPropertyValue("height");
  }
  if (element.currentStyle) {
    return element.currentStyle.height;
  }
  return element.style.height;
}

function startslide(objname){
  obj[objname] = document.getElementById(objname);

  endHeight[objname] = parseInt(getHeight(obj[objname]), 10);
  startTime[objname] = (new Date()).getTime();

  if (dir[objname] == "down") {
    obj[objname].style.height = "1px";
  }

  obj[objname].className = "slidedown";

  timerID[objname] = window.setInterval('slidetick(\'' + objname + '\');',timerlen);
}

function slidedown(objname){
  if (moving[objname]) {
    return;
  }

  if (document.getElementById(objname).className == "slidedown") {
    return; // cannot slide down something that is already visible
  }

  moving[objname] = true;
  dir[objname] = "down";
  startslide(objname);
}

function slideup(objname){
  if (moving[objname]) {
    return;
  }

  if (document.getElementById(objname).className == "slideup") {
    return; // cannot slide up something that is already hidden
  }

  moving[objname] = true;
  dir[objname] = "up";
  startslide(objname);
}

function endSlide(objname){
  window.clearInterval(timerID[objname]);

  if (dir[objname] == "up") {
    obj[objname].className = "slideup";
  }

  obj[objname].style.height = "";

  delete(moving[objname]);
  delete(timerID[objname]);
  delete(startTime[objname]);
  delete(endHeight[objname]);
  delete(obj[objname]);
  delete(dir[objname]);

  return;
}

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;
}

