﻿// (c) visarc 2007

// scrollbar handler

var clickY = -1;
var scrollY = -1;
var scrollRatio = 0;
var scrollWindowHeight = 290;
var scrollBarHeight = 290;

var scrollBar = null;
var scrollBarKnob = null;
var contentWindow = null

function scrollInit()
{
  // get dom elements
  if(document.getElementById)
  {
    scrollBar = document.getElementById("scrollbar");
    scrollBarKnob = document.getElementById("scrollbarKnob");
    contentWindow = document.getElementById("contentWindow");
  }
  else
  {
    scrollBar = all["scrollbar"];
    scrollBarKnob = all["scrollbarKnob"];
    contentWindow = all["contentWindow"];
  }
  if(scrollBar && scrollBarKnob && contentWindow)
  {
    // get content height + scroll window height
    scrollWindowHeight = parseInt(contentWindow.offsetHeight, 10) - 10;
    var contentHeight = getHeight("contentFrame");
    if(contentHeight > scrollWindowHeight)
    {
      // display scrollbar
      scrollBar.style.display = "block";
      scrollBarHeight = parseInt(scrollBar.offsetHeight, 10);
      // attach events
      if(document.addEventListener)
      {
        scrollBarKnob.addEventListener("mousedown", scrollStart, false);
        document.addEventListener("DOMMouseScroll", wheelScroll, false);
      }
      else
      {
        if(document.attachEvent)
        {
          scrollBarKnob.attachEvent("onmousedown", scrollStart);
          document.attachEvent("onmousewheel", wheelScroll);
        }
        else
        {
          scrollBarKnob.onmousedown = scrollStart;
          document.onmousewheel = wheelScroll;
        }
      }
      // reset scroll position
      contentWindow.scrollTop = 0;
      scrollBarKnob.style.top = "0px";
      // work out scroll ratio
      scrollRatio = (contentHeight - scrollWindowHeight) / scrollBarHeight;
    }
    else
    {
      scrollBar.style.display = "true";
    }
  }
}

function scrollStart(e)
{
  scrollY = parseInt(scrollBarKnob.style.top, 10);
  if(isNaN(scrollY)) scrollY = 0;
  if(window.event)
  {
    clickY = window.event.clientY;
  }
  else
  {
    clickY = e.clientY;
  }
  if(document.addEventListener)
  {
    document.addEventListener("mousemove", scrollMove, 0);
    document.addEventListener("mouseup", scrollEnd, 0);
  }
  else
  {
    if(document.attachEvent)
    {
      document.attachEvent("onmousemove", scrollMove);
      document.attachEvent("onmouseup", scrollEnd);
    }
    else
    {
      document.onmousemove = scrollMove;
      document.onmouseup = scrollEnd;
    }
  }
  cancelEvent(e);
}

function scrollMove(e)
{
  var y;
  var knobY;
  if(window.event)
  {
    y = window.event.clientY;
  }
  else
  {
    y = e.clientY;
  }
  // work out new knob position
  knobY = scrollY + y - clickY; 
  if(knobY < 0) knobY = 0;
  if(knobY > scrollBarHeight) knobY = scrollBarHeight;
  // apply knob position
  scrollBarKnob.style.top = knobY + "px";
  // scroll content pane
  contentWindow.scrollTop = Math.ceil(knobY * scrollRatio);
  // stop event bubbling
  cancelEvent(e);
}

function scrollEnd(e)
{
  sliderActive = false;
  if(document.removeEventListener)
  {
    document.removeEventListener("mousemove", scrollMove, 0);
    document.removeEventListener("mouseup", scrollEnd, 0);  
  }
  else
  {
    if(document.detachEvent)
    {
      document.detachEvent("onmousemove", scrollMove);
      document.detachEvent("onmouseup", scrollEnd);
    }
    else
    {
      document.onmousemove = null;
      document.onmouseup = null;  
    }
  }
  cancelEvent(e);
}

function wheelScroll(e)
{
  var delta = 0;
  if(window.event)
  {
    if(window.event.wheelDelta) delta = window.event.wheelDelta / 40;
  }
  else
  {
    if(e.detail) delta = -e.detail;
  }
  knobY = parseInt(scrollBarKnob.style.top, 10);
  knobY -= (delta * 5) / scrollRatio;
  if(knobY < 0) knobY = 0;
  if(knobY > scrollBarHeight) knobY = scrollBarHeight;
  scrollBarKnob.style.top = knobY + "px";
  contentWindow.scrollTop -= (delta * 5);
  cancelEvent(e);
}