__DragDrop__ = function () {

this.start = function (sender, mode, onDragCallback, onDropCallback, clipRect, copy) {
	document.onmousemove = DragDrop.onDrag
	document.onmouseup = DragDrop.onDrop
	this.mode = mode || 0 
	this.onDragCallback = onDragCallback
	this.onDropCallback = onDropCallback
	var clipRect0 = new Array(0,0,document.body.offsetWidth,document.body.offsetHeight)
	this.clipRect = clipRect
	if (! clipRect) this.clipRect = clipRect0
	if (clipRect) {if (clipRect.length==0) this.clipRect = clipRect0}
	this.copy = copy
	this.mx = 0
	this.my = 0
	sender.is_draged = false 

	if (! this.copy) {this.sender = sender} 
	else {
		var sender_c = sender.cloneNode(true)
		sender_c.origObj = sender
		document.body.appendChild(sender_c)
		sender_c.style.position = 'absolute'
		var x,y
		x=y=0
		for (var obj=sender; obj; obj=obj.offsetParent) {x += obj.offsetLeft; y += obj.offsetTop}
		sender_c.style.left = x + 'px'
		sender_c.style.top = y + 'px'
		sender_c.onmousedown = function () {return false} 
		this.sender = sender_c
	}
	return false
}

this.onDrop = function (event) {
	var event = event || window.event
	var onDropCallback = DragDrop.onDropCallback
	var sender = DragDrop.sender
	event.cancelBubble = true
	document.onmousemove = null
	document.onmouseup = null
	if (onDropCallback) onDropCallback(event, sender) 
	DragDrop.sender = null
	return false
}

this.onDrag = function (event) {
	var event = event || window.event
	event.cancelBubble = true
	var sender = DragDrop.sender
	var mode = DragDrop.mode
	var clipRect = DragDrop.clipRect
	var onDragCallback = DragDrop.onDragCallback
	var mx = DragDrop.mx
	var my = DragDrop.my

	var cx = event.clientX
	var cy = event.clientY
	var ox = event.offsetX ? event.offsetX : event.layerX
	var oy = event.offsetY ? event.offsetY : event.layerY

	if (mx) {
		var dx = cx - mx
		var dy = cy - my

		sender.is_draged = true
		var x = parseInt(sender.style.left || '0') + dx 
		var y = parseInt(sender.style.top || '0') + dy 
		if (x < clipRect[0]) x = clipRect[0] 
		if (y < clipRect[1]) y = clipRect[1] 
		if (clipRect[2] && (x + sender.offsetWidth > clipRect[2])) x = clipRect[2] - sender.offsetWidth
		if (clipRect[3] && (y + sender.offsetHeight > clipRect[3])) y = clipRect[3] - sender.offsetHeight 

		if (mode==0) {sender.style.top = y + 'px'; sender.style.left = x + 'px'}
		if (mode==1) {sender.style.top = y + 'px'}
		if (mode==2) {sender.style.left = x + 'px'}
		if (onDragCallback) onDragCallback(event, sender) 
	}
	DragDrop.mx = cx; DragDrop.my = cy
	return false

}
}

DragDrop = new __DragDrop__()

