document.onselectstart = function () { return false; };

function oNode_getOffsetTop(obj){
	var tmp=0;
	while(obj.offsetParent!=null){
		tmp+=obj.offsetTop;
		obj=obj.offsetParent;
	}
	return tmp;
}

function oNode_getOffsetLeft(obj){
	var tmp=0;
	while(obj.offsetParent!=null){
		tmp+=obj.offsetLeft;
		obj=obj.offsetParent;
	}
	return tmp;
}

function oNode_dragStart(ref,e){
	var tmp = document.createElement("DIV");
	tmp.innerHTML = ref.oNode.innerHTML;
	tmp.style.position = 'absolute';
	tmp.style.top = oNode_getOffsetTop(ref.oNode)+'px';
	tmp.style.left = oNode_getOffsetLeft(ref.oNode)+'px';
	if(document.all){
		tmp.style.filter='alpha(opacity=70)';
	}else{
		tmp.style.setProperty('-moz-opacity',0.7,'');
	}
	
	tmp.id = 'dragNode';
	document.body.appendChild(tmp);
	//document.body.style.cursor = 'default';
}

function dragEvent_onMousemove(e){
	if (!e){e=event}
	//cancelEventBubbling(e);
	var x = e.clientX;
	var y = e.clientY; 
	
	var diffX = (Math.max(draggingNode.mousedownX,x) - Math.min(draggingNode.mousedownX,x));
	var diffY = (Math.max(draggingNode.mousedownY,y) - Math.min(draggingNode.mousedownY,y));
	
	if((diffX < 10 && diffY < 10) && !document.getElementById('dragNode')){
		return;
	}
	
	
	
	// create ghost
	if(!document.getElementById('dragNode')){
		// execute attached handler, which returns a bool telling us to proceed or to abort the dragging
		var proceed = draggingNode.treeview.onNodeDragStartHandler(draggingNode);
		if(!proceed){
			document.onmousemove = null;
			return;
		}
		
		oNode_dragStart(draggingNode,e);
		
	// move the ghost, it exists
	}else{
		var el = document.getElementById('dragNode');
		el.style.top = y+'px';
		el.style.left = x+'px';
	}
}
function oNode_onMousedown(e){
	if (!e){e=event}
	cancelEventBubbling(e);
	this.obj.mousedownX = e.clientX;
    this.obj.mousedownY = e.clientY;
	draggingNode = this.obj;
	

	document.onmousemove = function(e){
		if (!e){e=event}
		//cancelEventBubbling(e);
		var x = e.clientX;
		var y = e.clientY; 
		
		var diffX = (Math.max(draggingNode.mousedownX,x) - Math.min(draggingNode.mousedownX,x));
		var diffY = (Math.max(draggingNode.mousedownY,y) - Math.min(draggingNode.mousedownY,y));
		
		if((diffX < 10 && diffY < 10) && !document.getElementById('dragNode')){
			return;
		}
		
		
		
		// create ghost
		if(!document.getElementById('dragNode')){
			// execute attached handler, which returns a bool telling us to proceed or to abort the dragging
			var proceed = draggingNode.treeview.onNodeDragStartHandler(draggingNode);
			if(!proceed){
				document.onmousemove = null;
				return;
			}
			
			oNode_dragStart(draggingNode,e);
			
		// move the ghost, it exists
		}else{
			var el = document.getElementById('dragNode');
			el.style.top = y+'px';
			el.style.left = x+'px';
		}
	}
		
	document.onmouseup = function(e){
		if (!e){e=event}
		//cancelEventBubbling(e);
		if(document.getElementById('dragNode')){
			document.body.removeChild(document.getElementById('dragNode'));
			oNode_onDragend(e);
			
			
			// clean up
			document.body.style.cursor = '';
			draggingNode = null;
		}
		document.onmousemove = null;
	}
	
}
function oNode_onDragend(e){
    if (!e){e=event}
    cancelEventBubbling(e);
	
	if(targetNode == draggingNode){
		//alert('Object cannot be dropped into itself');
	}
	targetNode.select();
	draggingNode.treeview.onNodeDragEndHandler(targetNode);
	
	//alert('targetnode:'+targetNode.label);
}
treenode.prototype.cancelDrag = function(){
	this.treeview.cancelDrag();
}
treeview.prototype.cancelDrag = function(){
	if(document.getElementById('dragNode')){
		document.body.removeChild(document.getElementById('dragNode'));
			
		// clean up
		document.body.style.cursor = '';
		draggingNode = null;
	}
	document.onmousemove = null;
}
