var timerlen = 5;
var slideAniLen = 250;

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(targetDiv) {
  if(moving[targetDiv]) {
    return;
  }
  if(document.getElementById(targetDiv).style.display != "none") {
    return; // cannot slide down something that is already visible
  }
  moving[targetDiv] = true;
  dir[targetDiv] = "down";
  startSlide(targetDiv);
}

function slideUp(targetDiv) {
  if(moving[targetDiv]) {
    return;
  }
  if(document.getElementById(targetDiv).style.display == "none") {
    return; // cannot slide up something that is already hidden
  }
  moving[targetDiv] = true;
  dir[targetDiv] = "up";
  startSlide(targetDiv);
}

function toggleSlide(targetDiv) {
  if(document.getElementById(targetDiv).style.display == "none") {
    slideDown(targetDiv); // div is hidden, so slide down
  } else {
     slideUp(targetDiv); // div is not hidden, so slide up
  }
}

function startSlide(targetDiv) {
  obj[targetDiv] = document.getElementById(targetDiv);
  endHeight[targetDiv] = parseInt(obj[targetDiv].style.height);
  startTime[targetDiv] = (new Date()).getTime();
  if(dir[targetDiv] == "down") {
    obj[targetDiv].style.height = "1px";
  }
  obj[targetDiv].style.display = "block";
  timerID[targetDiv] = setInterval('slideTick(\'' + targetDiv + '\');',timerlen);
}

function slideTick(targetDiv) {
  var elapsed = (new Date()).getTime() - startTime[targetDiv];
  if (elapsed > slideAniLen) {
    endSlide(targetDiv)
  } else {
    var d =Math.round(elapsed / slideAniLen * endHeight[targetDiv]);
    if(dir[targetDiv] == "up") {
      d = endHeight[targetDiv] - d;
    }
    obj[targetDiv].style.height = d + "px";
  }
  return;
}

function endSlide(targetDiv) {
  clearInterval(timerID[targetDiv]);
  if(dir[targetDiv] == "up") {
    obj[targetDiv].style.display = "none";
  }
  obj[targetDiv].style.height = endHeight[targetDiv] + "px";
  delete(moving[targetDiv]);
  delete(timerID[targetDiv]);
  delete(startTime[targetDiv]);
  delete(endHeight[targetDiv]);
  delete(obj[targetDiv]);
  delete(dir[targetDiv]);
  return;
}

function toggleDiv(whichDiv,method) {
  obj = document.getElementById(whichDiv);
  objStatus = obj.style.visibility;
	if (method == 'show') {
		obj.style.visibility = "visible";
		obj.style.display = "";
	} else if(method == 'hide') {
		obj.style.visibility = "hidden";
		obj.style.display = "none";
	}
}

function autoToggleDiv(caller,callerLabel,targetDiv) {
	obj = document.getElementById(targetDiv);
	if(obj.style.visibility == "hidden") {
		toggleDiv(targetDiv,'show');
		caller.value = 'Hide '+callerLabel;
	} else if(obj.style.visibility == "visible") {
		toggleDiv(targetDiv,'hide');
		caller.value = 'Show '+callerLabel;
	}
}

