
var defaultScrollDuration = 2000;
var scrollLeftFrom = 0;
var scrollLeftTo = 0;
var scrollTopFrom = 0;
var scrollTopTo = 0;
var scrollContainer = null;
var scrollStart = 0;
var scrollDuration = 0;
var scrollTimeoutHandle = 0;
var onScrollFinished = "";

function scrollPrepare(elemId)
{
  var elem = document.getElementById(elemId);
  if (elem)
  {
    if (elem.scrollHeight <= elem.offsetHeight)
      document.getElementById(elemId + "VertScrollbar").style.visibility = "hidden";
    else
    {
      var scrollbarElem = document.getElementById(elemId + "VertScrollbar");
      scrollbarElem.style.left = (elem.offsetLeft + elem.offsetWidth + 10) + "px";
      scrollbarElem.style.top = (elem.offsetTop + Math.round((elem.offsetHeight - scrollbarElem.offsetHeight) / 2)) + "px";
    }
  }
}

function scroll(elemId, direction, step, duration)
{
  scrollStart = new Date();
	scrollContainer = document.getElementById(elemId);
  scrollLeftFrom = scrollContainer.scrollLeft;
  scrollTopFrom = scrollContainer.scrollTop;
  var hStep = step;
  var vStep = step;
  if (!step)
  {
    if (scrollContainer.scrollWidth <= scrollContainer.offsetWidth * 2)
      hStep = scrollContainer.scrollWidth - scrollContainer.offsetWidth;
    else
      hStep = Math.ceil((scrollContainer.scrollWidth - scrollContainer.offsetWidth) / 
        Math.ceil(scrollContainer.scrollWidth / scrollContainer.offsetWidth));
    if (scrollContainer.scrollHeight <= scrollContainer.offsetHeight * 2)
      vStep = scrollContainer.scrollHeight - scrollContainer.offsetHeight;
    else
      vStep = Math.ceil((scrollContainer.scrollHeight - scrollContainer.offsetHeight) / 
        Math.ceil(scrollContainer.scrollHeight / scrollContainer.offsetHeight));
  }
  if (duration)
    scrollDuration = duration;
  else
    scrollDuration = defaultScrollDuration;
  switch(direction)
	{
    case "left":
  	  scrollLeftTo = scrollContainer.scrollLeft + hStep;
		  if (scrollLeftTo + scrollContainer.offsetWidth > scrollContainer.scrollWidth)
				scrollLeftTo = scrollContainer.scrollWidth - scrollContainer.offsetWidth
		  scrollTopTo = 0;
      doHorzScroll();
		  break;
    case "right":
  	  scrollLeftTo = scrollContainer.scrollLeft - hStep;
		  if (scrollLeftTo < 0)
			  scrollLeftTo = 0;
		  scrollTopTo = 0;
      doHorzScroll();
		  break;
    case "up":
		  scrollLeftTo = 0;
  	  scrollTopTo = scrollContainer.scrollTop + vStep
		  if (scrollTopTo + scrollContainer.offsetHeight > scrollContainer.scrollHeight)
				scrollTopTo = scrollContainer.scrollHeight - scrollContainer.offsetHeight
      doVertScroll();
		  break;
    case "down":
		  scrollLeftTo = 0;
  	  scrollTopTo = scrollContainer.scrollTop - vStep;
		  if (scrollTopTo < 0)
			  scrollTopTo = 0;
      doVertScroll();
		  break;
	}
}

function scrollCancel()
{
  if (scrollTimeoutHandle)
  {
    clearTimeout(scrollTimeoutHandle);
    scrollTimeoutHandle = 0;
  }
}

function doOnfinished()
{
  if (onScrollFinished)
  {
    scrollTimeoutHandle = 0;
    var s = onScrollFinished;
    onScrollFinished = "";
    eval(s);
  }
}

function doHorzScroll()
{
  if (scrollContainer.id)
  {
    var elapsed = new Date().getTime() - scrollStart.getTime();
    if (elapsed < scrollDuration)
  	{
      scrollContainer.scrollLeft = scrollLeftFrom +
        Math.round((scrollLeftTo - scrollLeftFrom) * (1 - Math.cos(3.14 * elapsed / scrollDuration)) / 2);
      scrollTimeoutHandle = setTimeout("doHorzScroll()", 10);
  	}
  	else
  	{
      scrollContainer.scrollLeft = scrollLeftTo;
      scrollContainer.scrollTop = scrollTopTo;
      var elem = document.getElementById(scrollContainer.id + "RightScrollArrow");
      if (elem)
        if (scrollContainer.scrollLeft == 0)
          elem.className = "disabledScrollArrow";
        else
          elem.className = "anchor";
    
      elem = document.getElementById(scrollContainer.id + "LeftScrollArrow");
      if (elem)
        if (scrollContainer.scrollLeft + scrollContainer.offsetWidth == scrollContainer.scrollWidth)
          elem.className = "disabledScrollArrow";
        else
          elem.className = "anchor";
      doOnFinished();
  	}
  }
}

function doVertScroll()
{
  if (scrollContainer.id)
  {
    var elapsed = new Date().getTime() - scrollStart.getTime();
    if (elapsed < scrollDuration)
  	{
      scrollContainer.scrollTop = scrollTopFrom +
        Math.round((scrollTopTo - scrollTopFrom) * (1 - Math.cos(3.14 * elapsed / scrollDuration)) / 2);
      scrollTimeoutHandle = setTimeout("doVertScroll()", 10);
  	}
  	else
  	{
      scrollContainer.scrollLeft = scrollLeftTo;
      scrollContainer.scrollTop = scrollTopTo;
      var elem = document.getElementById(scrollContainer.id + "DnScrollArrow");
      if (elem)
        if (scrollContainer.scrollTop == 0)
          elem.className = "disabledScrollArrow";
        else
          elem.className = "anchor";
    
      elem = document.getElementById(scrollContainer.id + "UpScrollArrow");
      if (elem)
        if (scrollContainer.scrollTop + scrollContainer.offsetHeight == scrollContainer.scrollHeight)
          elem.className = "disabledScrollArrow";
        else
          elem.className = "anchor";
      doOnfinished();
  	}
  }
}


