function scrollinit() {
	scrollspeed = 8; 
	dragheight = document.getElementById("drag").offsetHeight;
	trackheight = document.getElementById("track").offsetHeight;
	
	tracktop = document.getElementById("drag").offsetTop;
	tracklength = trackheight - dragheight;
	trackbottom = tracktop + tracklength;
	contentmaskheight = document.getElementById("contentmask").offsetHeight;
	
	scrolltimer = null;
	
	document.getElementById("track").onmousedown = scrolljump;

	document.getElementById("up").onmousedown = function() { scroll(scrollspeed); return false; }
	document.getElementById("up").onmouseup = stopscroll;
	document.getElementById("up").onmouseout = stopscroll;
	
	document.getElementById("down").onmousedown = function() { scroll(-scrollspeed); return false; }
	document.getElementById("down").onmouseup = stopscroll;
	document.getElementById("down").onmouseout = stopscroll;
	
	document.getElementById("drag").onmousedown = startdrag;
	document.getElementById("drag").ondragstart = function() { return false };
	
	loadcontent();
}

function loadcontent(){
	contentheight = document.getElementById("text").offsetHeight;
	contentlength = contentheight - contentmaskheight;
	scrolllength = tracklength / contentlength;
	document.getElementById("drag").style.top = tracktop + 'px';

	if (contentheight <= contentmaskheight) {
		document.getElementById("track").style.visibility = 'hidden';
		document.getElementById("up").style.visibility = 'hidden';
		document.getElementById("down").style.visibility = 'hidden';
		document.getElementById("drag").style.visibility = 'hidden';
	}
}

function scroll(speed) {
	var contentmovement = document.getElementById("text").offsetTop + speed;
	var dragmovement = tracktop - Math.round(document.getElementById("text").offsetTop * (tracklength / contentlength));

	if (contentmovement > 0) {
		contentmovement = 0;
	} else if (contentmovement < -contentlength) {
		contentmovement = -contentlength;
	}

	if (dragmovement < tracktop) {
		dragmovement = tracktop;
	} else if (dragmovement > trackbottom) {
		dragmovement = trackbottom;
	}
	
	document.getElementById("text").style.top = contentmovement + 'px';
	document.getElementById("drag").style.top = dragmovement + 'px';
	scrolltimer = window.setTimeout('scroll(' + speed + ')', 25);
}

function stopscroll() {
	if (scrolltimer) {
		window.clearTimeout(scrolltimer);
		scrolltimer = null;
	}
}

function getmouse(e) {
	return document.all ? event.clientY : e.pageY;
}

function startdrag(e) {
	dragstartmouse = getmouse(e);
	dragstartoffset = document.getElementById("drag").offsetTop;
	document.onmousemove = drag;
	document.onmouseup = stopdrag;
	return false;
}

function stopdrag(){
	document.onmousemove = null;
	document.onmouseup = null;
}

function drag(e){
	var currentmouse = getmouse(e);
	var mousedifference = currentmouse - dragstartmouse;
	var dragdistance = dragstartoffset + mousedifference;
	var dragmovement = (dragdistance < tracktop) ? tracktop : (dragdistance > trackbottom) ? trackbottom : dragdistance;
	document.getElementById("drag").style.top = dragmovement + 'px';
	var contentmovement = -(dragmovement - tracktop) * (1 / scrolllength);
	document.getElementById("text").style.top = contentmovement + 'px';
	return false;
}

function scrolljump(e) {
	var currentmouse = getmouse(e);
	var yoffset = document.getElementById('textarea') ? gettop(document.getElementById('textarea')) : 0;
	var scrolloffset = getscrollposition();
	var dragdistance = (currentmouse - yoffset + scrolloffset) - (dragheight / 2);
	var dragmovement = (dragdistance < tracktop) ? tracktop : (dragdistance > trackbottom) ? trackbottom : dragdistance;
	document.getElementById("drag").style.top = dragmovement + 'px';
	var contentmovement = -(dragmovement - tracktop) * (1 / scrolllength);
	document.getElementById("text").style.top = contentmovement + 'px';
	return false;
}

function gettop(whichelement) {
    var toppos = whichelement.offsetTop;
    var parentelement = whichelement.offsetParent;
    while (parentelement != null) {
        toppos += parentelement.offsetTop;
        parentelement = parentelement.offsetParent;
    }
    return toppos;
}

function getscrollposition() {
	var x, y;
	if (self.pageYOffset) {
		x = self.pageXOffset;
		y = self.pageYOffset;
		return 0;
	} else if (document.documentElement && document.documentElement.scrollTop) {
		x = document.documentElement.scrollLeft;
		y = document.documentElement.scrollTop;
		return y;
	} else if (document.body) {
		x = document.body.scrollLeft;
		y = document.body.scrollTop;
		return y;
	}
}

function checkscroll() {
	el = document.getElementById("text");
	if (el) {
		var contentmovement = document.getElementById("text").style.top;
//		var dragdistance = (-el.offsetTop) - (dragheight / 2);
//		var dragmovement = (dragdistance < tracktop) ? tracktop : (dragdistance > trackbottom) ? trackbottom : dragdistance;
//		var dragmovement = -contentmovement * scrolllength + tracktop;
//		document.getElementById("drag").style.top = dragmovement + 'px';
		alert(contentmovement);
	}
}

window.onload = scrollinit;