$ = function(id) { return document.getElementById(id) }

linear = function (t, b, c, d) { return c*t/d + b; }


var xPos = 0;
var yPos = 0;

//	document.onmousemove = function(event) {  }

	function getClickPos(e)
			{
			if (isFF)
				{
				xPos = e.pageX;
				yPos = e.pageY;
				}
			else
				{
				if (document.documentElement && document.documentElement.scrollTop)
					{
					xPos = event.clientX + document.documentElement.scrollLeft;
					yPos = event.clientY + document.documentElement.scrollTop;
					}
				else
					{
					xPos = event.clientX + document.body.scrollLeft;
					yPos = event.clientY + document.body.scrollTop;
					}
				}
			}
			
	function getPosition(obj)
		{
		var elem = obj

    	var l = 0;
    	var t = 0;

    	while (elem)
	   		{
	       	l += elem.offsetLeft;
	      	t += elem.offsetTop;
	     	elem = elem.offsetParent;
	   		}
	   	obj.l = l;
	   	obj.t = t;
		}

var timer;
var t = 0;

runner = {
	
	init: function(topHandler, bottomHandler, obj, scrollObj) {
		obj.style.cursor = 'pointer';
		topHandler.style.cursor = 'pointer';
		bottomHandler.style.cursor = 'pointer';
		getPosition(obj.offsetParent);
		runner.obj = obj;
		runner.scrollObj = scrollObj;
		
		bottomHandler.onmousedown = function() { obj.top = obj.offsetTop; co = (obj.offsetParent.offsetHeight-obj.offsetHeight); timer = setInterval('runner.buttonHandler(runner.obj, runner.scrollObj, co, true)', 30) }
		bottomHandler.onmouseup = function() { clearInterval(timer); t = 0 }
		
		topHandler.onmousedown = function() { obj.top = obj.offsetTop; co = -(obj.offsetParent.offsetHeight-obj.offsetHeight); timer = setInterval('runner.buttonHandler(runner.obj, runner.scrollObj, co, true)', 30) }
		topHandler.onmouseup = function() { clearInterval(timer); t = 0 }
		
		obj.onmousedown = function(event) { runner.startDrag(this, scrollObj, event) }
	},
	
	startDrag: function(obj, scrollObj, event) {
		event = (event || window.event)
		try 
			{
			event.preventDefault();
			}
		catch (event) 
			{
			obj.ondragstart = function () { return false };
			document.onselectstart = function () { return false }
			}
		
		document.onmouseup = function() { runner.stopDrag() }
		runner.grade = obj.offsetParent.offsetHeight/runner.maxVal;
		
		document.onmousemove = function(event) {
			getClickPos(event);
			
			if (yPos<=obj.offsetParent.t+obj.offsetHeight/2)
				{
				obj.style.top = 0;
				scrollObj.style.top = 0;
				return;
				}
				
			if (yPos >= obj.offsetParent.t+(obj.offsetParent.offsetHeight-obj.offsetHeight/2))
				{
				obj.style.top = obj.offsetParent.offsetHeight-obj.offsetHeight+'px';
				scrollObj.style.top = -(scrollObj.offsetHeight - scrollObj.offsetParent.offsetHeight) + 'px'
				return;
				}
				
			obj.style.top = (yPos - obj.offsetParent.t)-obj.offsetHeight + 'px';
			scrollObj.style.top = - ((yPos - obj.offsetParent.t)*(scrollObj.offsetHeight/scrollObj.offsetParent.offsetHeight)+obj.offsetHeight/2)*(1-obj.offsetParent.offsetHeight/scrollObj.offsetHeight) + 'px'

		}
	},
	
	stopDrag: function() {
		document.onmousemove = '';
		document.onmouseup = '';
	},
	
	buttonHandler: function(obj, scrollObj, co, moveDown) {
		t++;
		
		obj.style.top = Math.floor(linear(t, obj.top, co, 30)) + 'px';
		scrollObj.style.top = - (Math.floor(linear(t, obj.top, co, 30))*(scrollObj.offsetHeight/scrollObj.offsetParent.offsetHeight)+obj.offsetHeight/2)*(1-obj.offsetParent.offsetHeight/scrollObj.offsetHeight) + 'px'
		scrollObj.style.top = Math.floor();
		
		if (parseInt(obj.style.top) >= (obj.offsetParent.offsetHeight-obj.offsetHeight))
			{
			obj.style.top = (obj.offsetParent.offsetHeight-obj.offsetHeight) + 'px';
			scrollObj.style.top = -(scrollObj.offsetHeight - scrollObj.offsetParent.offsetHeight) + 'px'
			clearInterval(timer);
			t = 0;
			return
			}
		if (parseInt(obj.style.top) <= 0)
			{
			obj.style.top = 0;
			scrollObj.style.top = 0;
			clearInterval(timer);
			t = 0;
			return
			}
		if (t >= 30)
			{
			clearInterval(timer);
			scrollObj.style.top = -(scrollObj.offsetHeight - scrollObj.offsetParent.offsetHeight) + 'px'
			t = 0;
			return
			}
	},
	
	destroyRunners: function(objs) {
		for (i=0; i<objs.length; i++)
			{
			$(objs[i].id+'_handler').style.cursor = 'default';
			$(objs[i].id+'_handler').onmousedown = function() { return false }
			document.onmouseup = function() { runner.stopDrag() }
			}
	}
}
