document.onmousemove = mouseMove;
document.onmouseup   = mouseUp;

var dragObject  = null;
var origin = null;
var mouseOffset = null;

function getMouseOffset(target, ev){
	ev = ev || window.event;

	var docPos    = getPosition(target);
	var docPos = {x:0,y:0};
	var mousePos  = mouseCoords(ev);
	return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}

function getPosition(e){
	var left = 0;
	var top  = 0;

	while (e.offsetParent){
		left += e.offsetLeft;
		top  += e.offsetTop;
		e     = e.offsetParent;
	}

	left += e.offsetLeft;
	top  += e.offsetTop;

	return {x:left, y:top};
}

function mouseMove(ev){
	ev = ev || window.event;
	var mousePos = mouseCoords(ev);

	if(dragObject){
		ctop = mousePos.y - mouseOffset.y;
		cleft = mousePos.x - mouseOffset.x;
		dragObject.parentNode.scrollTop = origin.y - ctop;
		dragObject.parentNode.scrollLeft = origin.x - cleft;
		return false;
	}
}

function mouseCoords(ev){
	if(ev.pageX || ev.pageY){
		return {x:ev.pageX, y:ev.pageY};
	}
	if (!document || !document.body) return {x:0,y:0,ie:'sucks'};
	return {
		x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
		y:ev.clientY + document.body.scrollTop  - document.body.clientTop
	};
}
function mouseUp(){
	dragObject = null;
}

function makeDraggable(item){
	if(!item) return;
	item.onmousedown = function(ev){
		dragObject  = this;
		mouseOffset = getMouseOffset(this, ev);
		origin = {x:dragObject.parentNode.scrollLeft,y:dragObject.parentNode.scrollTop};
		return false;
	}
}
