var scrollObj = new Object();
scrollObj.zIndex = 10;
var incr = 14;
var minTop = 24;
var maxTop = 40;
    
function scrollStart(event, id, scroll_window_id) {
	var el;
	var x, y;

    // If an element id was given, find it. Otherwise use the element being
    // clicked on.

	if (id) scrollObj.elNode = document.getElementById(id);
    else {
        if (browser.isIE) scrollObj.elNode = window.event.srcElement;
        if (browser.isNS) scrollObj.elNode = event.target;

        // If this is a text node, use its parent element.

        if (scrollObj.elNode.nodeType == 3) scrollObj.elNode = scrollObj.elNode.parentNode;
    }

    // Get cursor position with respect to the page.

    if (browser.isIE) {
        y = window.event.clientY + document.documentElement.scrollTop  + document.body.scrollTop;
    }
    if (browser.isNS) {
        y = event.clientY + window.scrollY;
    }

    // Save starting positions of cursor and element.

    scrollObj.cursorStartY = y;
    scrollObj.elStartLeft  = parseInt(scrollObj.elNode.style.left, 10);
    scrollObj.elStartTop   = parseInt(scrollObj.elNode.style.top,  10);

    if (isNaN(scrollObj.elStartLeft)) scrollObj.elStartLeft = 0;
    if (isNaN(scrollObj.elStartTop))  scrollObj.elStartTop  = 0;

    scrollObj.scroll_window = document.getElementById(scroll_window_id);
    
    // Capture mousemove and mouseup events on the page.

    if (browser.isIE) {
        document.attachEvent("onmousemove", scrollGo);
        document.attachEvent("onmouseup",   scrollStop);
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    }
    if (browser.isNS) {
        document.addEventListener("mousemove", scrollGo,   true);
        document.addEventListener("mouseup",   scrollStop, true);
        event.preventDefault();
    }
}
    
function setScroll(scroll_mid, scroll_window) {

	// sets pos of scrollbar based on position of scrolling window
	var numSteps = Math.ceil((scroll_window.offsetHeight - scroll_window.parentNode.offsetHeight) / incr);
	var move = ((Math.ceil(Math.abs(scroll_window.offsetTop) / incr)) / numSteps) * (maxTop - minTop);
	var newTop = Math.round(minTop + move);
	scroll_mid.style.top = newTop + "px";
}
 
function setScrollWindow() {

	// sets pos of scrolling window based on position of scrollbar
	var scroll_mid = scrollObj.elNode;
	var scroll_window = scrollObj.scroll_window;
	
	var pos = parseInt(scroll_mid.style.top);
	var percent = (pos - minTop) / (maxTop - minTop);
	var window_range = scroll_window.offsetHeight - scroll_window.parentNode.offsetHeight;
	var window_pos = percent * window_range * -1;

	scroll_window.style.top = window_pos + "px";
}
 
function scrollGo(event) {
    // Get cursor position with respect to the page.

    if (browser.isIE) {
        y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
    }
    if (browser.isNS) {
        y = event.clientY + window.scrollY;
    }

	var scroll_mid = scrollObj.elNode;
	var curTop = scroll_mid.offsetTop;

	var relPos = y - scrollObj.cursorStartY;
	
	var pos = curTop + relPos;

	if ( pos < minTop ) { pos = minTop; }
	if ( pos > maxTop ) { pos = maxTop; }

	scrollObj.cursorStartY = y;
	
	scroll_mid.style.top = pos + "px";

	setScrollWindow();

    if (browser.isIE) {
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    }
    if (browser.isNS) event.preventDefault();
}

function scrollStop(event) {
  // Stop capturing mousemove and mouseup events.
	
  if (browser.isIE) {
    document.detachEvent("onmousemove", scrollGo);
    document.detachEvent("onmouseup",   scrollStop);
  }
  if (browser.isNS) {
    document.removeEventListener("mousemove", scrollGo,   true);
    document.removeEventListener("mouseup",   scrollStop, true);
  }
}

function scroll_move( dir, scroll_mid_id, scroll_window_id ) {
    var scroll_mid_id = scroll_mid_id || "scroll_mid";
    var scroll_window_id = scroll_window_id || "scroll_window";
        var scroll_mid = document.getElementById(scroll_mid_id);
    var scroll_window = document.getElementById(scroll_window_id);
    	var newTop = scroll_window.offsetTop;
	if ( dir >= 0 ) {
		 // click down, move it up
		if ( Math.abs(scroll_window.offsetTop) < scroll_window.offsetHeight - scroll_window.parentNode.offsetHeight ) {
			newTop = Math.max(scroll_window.offsetTop - incr, ((scroll_window.offsetHeight - scroll_window.parentNode.offsetHeight) * -1) );
			scroll_window.style.top = newTop + "px";
			setScroll(scroll_mid, scroll_window);
		}
	} else {
		 // click up, move it down
		if ( scroll_window.offsetTop < 0) {
			newTop = Math.min(scroll_window.offsetTop + incr, 0);
			scroll_window.style.top = newTop + "px";
			setScroll(scroll_mid, scroll_window);
		}
	}
}

function scrollbarVisibilty ( scrollbar, innerDiv, outerDiv ) {

	// hides the scrollbar if the inner div isn't tall enough to warrant a scrollbar.
	// pass the IDs of the scrollbar, and inner and outer divs of the content.
	
	bar = document.getElementById(scrollbar);
	inner = document.getElementById(innerDiv);
	outer = document.getElementById(outerDiv);
		
	if ( bar && inner && outer ) {
		if ( outer.offsetHeight > inner.offsetHeight )
			bar.style.display = 'none';
		else
			bar.style.display = 'block';
	}
	else {
		alert("scrollbarVisibilty: at least one ID not found in page.")
	}
}