var y = 0;
var dragging = false;
var scrolling = false;
var semidragging = false;
var max = 1000;
var sa = 10;
var height = 0;
var previous = 0;
var last = 'undo';

function scroll(pn)
{
	scrolling = true;
	doScroll(pn);
}

function doScroll(pn)
{
	var scrollAmount = sa * pn;
	var bar = parseInt(document.getElementById('drag-bar').style.top);
	var ypos = bar / height * max;
	var newY = ypos + parseInt(scrollAmount);
	
	if (newY < 0)
	{
		newY = 0;
	}
	else
	{
		if (newY > max)
		{
			newY = max;
		}
		else
		{
			document.getElementById('text').style.top = parseInt(document.getElementById('text').style.top) - scrollAmount + 'px';
		}
	}
	
	var newBar = newY / max * height;
	
	document.getElementById('drag-bar').style.top = newBar + 'px';
	
	if (scrolling)
	{
		setTimeout("doScroll('" + pn + "')", 50);
	}
}

function drag()
{
	dragging = true;
	doDrag();
}

function semidrag()
{
	if (!dragging)
	{
		semidragging = true;
		doSemiDrag();
	}
}

function doSemiDrag()
{
	var mouseOffset = y - document.getElementById('scroller').offsetTop;
	mouseOffset = mouseOffset / height * max;
	
	if (mouseOffset < Math.abs(parseInt(document.getElementById('text').style.top)))
	{
		if (previous == -1 || previous == 0)
		{
			previous = -1;
			scrollOnce(-1);
		}
		else
		{
			semidragging = false;
			last = 'sd';
		}
	}
	else
	{
		if (previous == 1 || previous == 0)
		{
			previous = 1;
			scrollOnce(1);
		}
		else
		{
			semidragging = false;
			last = 'sd';
		}
	}
	
	if (semidragging)
	{
		setTimeout("doSemiDrag()", 50);
	}
	else
	{
		if (last != 'undo')
		{
			drag();
		}
	}
}

function scrollOnce(pn)
{
	var scrollAmount = sa * pn;
	var bar = parseInt(document.getElementById('drag-bar').style.top);
	var ypos = bar / height * max;
	var newY = ypos + parseInt(scrollAmount);
	
	if (newY < 0)
	{
		newY = 0;
	}
	else
	{
		if (newY > max)
		{
			newY = max;
		}
		else
		{
			document.getElementById('text').style.top = parseInt(document.getElementById('text').style.top) - scrollAmount + 'px';
		}
	}
	
	var newBar = ((newY / max) * height);
	
	document.getElementById('drag-bar').style.top = newBar + 'px';
}

function doDrag()
{
	var bar = parseInt(document.getElementById('drag-bar').style.top);
	var ypos = bar / height * max;
	var newBar = y - document.getElementById('scroller').offsetTop - 27;
	var scrollAmount = newBar - bar;
	var newY = ypos + scrollAmount;

	if (newY < 0)
	{
		newY = 0;
		newBar = 0;
	}
	else
	{
		if (newY > max)
		{
			newY = max;
			newBar = newY / max * height;
		}
		else
		{
			document.getElementById('text').style.top = -newY + 'px';
		}
	}
	
	document.getElementById('drag-bar').style.top = newBar + 'px';

	if (dragging)
	{
		setTimeout("doDrag()", 10);
	}
}

function undo()
{
	dragging = false;
	scrolling = false;
	semidragging = false;
	previous = 0;
	last = 'undo';
}

function getScrollY()
{
	var scrOfY = 0;
	
	if(typeof(window.pageYOffset) == 'number')
	{
    		scrOfY = window.pageYOffset;
	}
	else if(document.body && document.body.scrollTop)
	{
    		scrOfY = document.body.scrollTop;
	}
	else if(document.documentElement && document.documentElement.scrollTop)
	{
		scrOfY = document.documentElement.scrollTop;
  	}
  	
  	return scrOfY;
}

function mousePos(e)
{
	if (!e) var e = window.event;
	
	if (e.pageY)
	{
		y = e.pageY;
	}
	else if (e.y)
	{
		y = e.y;
	}
	else if (e.clientY)
	{
		try
		{
			y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
		}
		catch (error)
		{
			y = e.clientY;
		}
	}
}

function initScroller()
{
	document.getElementById('drag-bar').style.top = '0px';
	document.getElementById('text').style.top = '0px';
	max = document.getElementById('text').clientHeight - document.getElementById('scroller').clientHeight + 24;
	height = document.getElementById('scroller').clientHeight - 26;
	
	document.getElementById('scroll-up').onmousedown = function() { scroll(-1); };
	document.getElementById('scroll-down').onmousedown = function() { scroll(1); };
	document.getElementById('drag-bar').onmousedown = drag;
	document.getElementById('scroll-box').onmousedown = semidrag;
	document.getElementById('scroller').onselectstart = function() { return false; };
	document.getElementById('scroll-box').onselectstart = function() { return false; };
	document.getElementById('drag-bar').onselectstart = function() { return false; };
	document.getElementById('drag-bar').onmouseover = function() { semidragging = false; previous = 0; };
}

window.onmousemove = mousePos;
document.onmousemove = mousePos;
window.onmouseup = undo;
document.onmouseup = undo;