function DraggableObject (domNode) {

	this.domNode = domNode;
	this.domNode.style.cursor = 'default';

	var selfRef = this;
	this.domNode.onmousedown = function (event) { selfRef.mouseDown (event); };

}

DraggableObject.prototype.mouseDown = function (event) {
	if (!event) event = window.event;

	if (event.preventDefault) {
		event.preventDefault ();
	} else {
		document.body.ondrag = function () { return false; };
		document.body.onselectstart = function () { return false; };
	}

	var left = 0, top = 0, parent = this.domNode;
	while (parent) {
		left += parent.offsetLeft;
		top += parent.offsetTop;
		parent = parent.offsetParent;
	}

	this.dragStartX = DraggableObject.getLeft (event) - left;
	this.dragStartY = DraggableObject.getTop (event) - top;

	var selfRef = this;
	document.onmousemove = function (event) { selfRef.mouseMove (event); };
	document.onmouseup = function (event) { selfRef.mouseUp (event, false); };
	document.onkeypress = function (event) { if (!event) event = window.event; if (event.keyCode == 27) selfRef.mouseUp (event, true); };
	if (this.customDblClick) {
		document.ondblclick = function (event) { selfRef.customDblClick (event); };
	}
}

DraggableObject.lastMove = 0;

DraggableObject.prototype.mouseMove = function (event) {
	var now = new Date ().valueOf ();
	if (now - DraggableObject.lastMove < 25) {
		return;
	}

	DraggableObject.lastMove = now;

	if (!event) event = window.event;

	if (this.customMouseMove) {
		this.customMouseMove (event);
	}
}

DraggableObject.prototype.mouseUp = function (event, cancel) {
	document.onmousemove = null;
	document.onmouseup = null;
	document.onkeypress = null;

	if (document.ondrag) {
		document.ondrag = null;
		document.onselectionstart = null;
	}

	if (this.customMouseUp) {
		this.customMouseUp (event, cancel);
	}
}

DraggableObject.getLeft = function (event) {
	var left = event.clientX + document.body.scrollLeft;
	if (document.body.clientLeft) {
		left -= document.body.clientLeft;
	}

	return left;
}

DraggableObject.getTop = function (event) {
	var top = event.clientY + document.body.scrollTop;
	if (document.body.clientTop) {
		top -= document.body.clientTop;
	}

	return top;
}
