// www.PressDisplay.com
// © 2003-2008 NewspaperDirect, Inc. All rights reserved.

Drag={
	cursorStartX:0,
	cursorStartY:0,
	targets:[],
	frames:[],
	dx:0,
	dy:0,
	inDrag:false,
	delegate:new pdcore.events.delegate()
}
Drag.init=function(){
	if(!Drag.inited){
		Drag.inited=true;;
		pdcore.addToUnload(Drag.unload);
	}
	
    // prevent IE text selection while dragging
    document.body.ondrag=function(){return !Drag.inDrag;}
    document.body.onselectstart=function(){return !Drag.inDrag;}
}
Drag.unload=function(){
	var t=Drag;
	t.DragEnd=t.DragMove=t.DragStart=t.trueElm=t.elm=null;
	var targets=t.targets;
	if(targets){
		for(var idx=targets.length-1;idx>=0;idx--){
			var target=targets[idx];
			if(target){
				pdcore.events.removeEvent(target, "mousedown", target._PDDragHandler);
				target._PDDragHandler=null;
				target.onmousedown=null;
				target.draggingTarget=null;
			}
			targets[idx]=null;
		}
		t.targets=null;
	}
	document.body.ondrag=null;
	document.body.onselectstart=null;
	
	pdcore.events.removeEvent(document, "mousemove", t.dragGo);
	pdcore.events.removeEvent(document, "mouseup", t.dragStop);
	pdcore.events.removeEvent(document, "mouseout", t.dragStop);
	t.unload=null;
}
Drag.subscribeToEvents=function(instance,handler){
	if(Drag.delegate)
		Drag.delegate.add(instance,handler);
}
Drag.onevent=function(isDragStart,isDragStop,isDragGo){
	if(Drag.delegate){
		try{
			Drag.delegate.fire(isDragStart,isDragStop,isDragGo);
		}catch(E){}
	}
}
Drag.ondragstart=function(){
	Drag.onevent(true,false);
}
Drag.ondraggo=function(){
	Drag.onevent(false,false,true);
}
Drag.ondragstop=function(){
	Drag.onevent(false,true);
}

Drag.turnOnDrag=function(target, fDragStart, fDragMove, fDragEnd){

	if(!target || pdcore.isFunc(target._PDDragHandler))return;

	Drag.init();

	target.drag_targets_indx=Drag.targets.length;
	Drag.targets.push(target);

	target._PDDragHandler=function(e){Drag.dragStart(e,target,fDragStart,fDragMove,fDragEnd)};
	pdcore.events.addEvent(target, "mousedown", target._PDDragHandler);
}
Drag.turnOffDrag=function(target){
	if(!target)return;

	try{
		pdcore.events.removeEvent(target, "mousedown", target._PDDragHandler);
		target._PDDragHandler=null;
		target.onmousedown=null;
		target.draggingTarget=null;
		target.drag_targets_indx=null;
	}catch(E){}


	if(!Drag.targets)return;

	try{
		if(target.drag_targets_indx && target.drag_targets_indx >=0 && target.drag_targets_indx < Drag.targets.length){
			Drag.targets[target.drag_targets_indx]=null;
			return;
		}
		for(var idx=0;idx<Drag.targets.length;idx++){
			if(Drag.targets[idx]==target)
				Drag.targets[idx]=null;
		}
	}catch(E){}
}
Drag.turnOnAutodrag=function(target,draggingTarget,fDragEnd){
	if(!target)return;
	target.draggingTarget=(draggingTarget ? draggingTarget : target);
	this.turnOnDrag(target, Drag.autodrag_DragStart, Drag.autodrag_DragMove, fDragEnd);
}
Drag.autodrag_DragStart=function(eX,eY,target){
	var t=Drag;
	if(!t.elm)return;
	var draggingTarget=t.elm.draggingTarget;
	t.elStartLeft=draggingTarget.offsetLeft;
	t.elStartTop=draggingTarget.offsetTop;
};
Drag.autodrag_DragMove=function(eX,eY,dX,dY,target){
	var t=Drag;
	if(!t.elm)return;
	var draggingTargetStyle=t.elm.draggingTarget.style;
	draggingTargetStyle.left=eX;
	draggingTargetStyle.top=eY;
}
Drag.cancelDrag=function(){
	var t=this;
	if(t.inDrag){
		t.dragStop();
		t.inDrag=false;
	}
}
Drag.dragStart=function(event,target,fDragStart,fDragMove,fDragEnd){
	var t=this;
	if(t.inDrag)
		t.dragStop();

	if(!event){
		event=window.event;
		if(!event)
			return;
	}


	t.inDrag=true;
	
	Drag.ondragstart();

	var cX=event.screenX,cY=event.screenY;

	t.elm=target;
	t.cursorStartX=cX;
	t.cursorStartY=cY;
	t.elStartLeft=target.offsetLeft;
	t.elStartTop=target.offsetTop;
	t.dragGoFired=false;

	t.DragStart=fDragStart;
	t.DragMove=fDragMove;
	t.DragEnd=fDragEnd;
	

	pdcore.events.addEvent(document, "mousemove", Drag.dragGo);
	pdcore.events.addEvent(document, "mouseup", Drag.dragStop);
	

//	for(var idx=0;idx<window.frames.length;idx++){
//		try{
//			var frame=window.frames[idx];
//			pdcore.events.addEvent(frame.document, "mousemove", function(event){Drag.dragGo(event);});
//			pdcore.events.addEvent(frame.document, "mouseup", function(event){Drag.dragStop(event);});
//		}catch(E){}
//	}


	pdcore.events.preventBubble(event);
	
	t.dx=0;
	t.dy=0;

	if(t.DragStart) t.DragStart(t.elStartLeft,t.elStartTop,t.elm,event);
}
if (pdcore.isIE){
	Drag.dragGo=function(event){
		var t=Drag;
		if(!t.inDrag)return;

		// check is left mouse button is pressed
		if(event.button!=1){
			//mouse button was released outside window
			t.dragStop(event);
			return;
		}
		
		if(!t.dragGoFired){
			t.dragGoFired=true;
			t.ondraggo();
		}

		var dX=event.screenX-t.cursorStartX;
		var dY=event.screenY-t.cursorStartY;
		var eX=t.elStartLeft+dX;
		var eY=t.elStartTop+dY;
		var dx=dX-t.dx;//dx since last event
		var dy=dY-t.dy;//dy since last event
		t.dx=dX;
		t.dy=dY;
		try{t.DragMove(eX,eY,dX,dY,t.elm,event,dx,dy)}catch(E){}

		//cancel event
		event.returnValue=false;
		event.canceled=event.cancelBubble=true;
		return false;
	}
}else{
	Drag.dragGo=function(event){
		var t=Drag;
		if(!t.inDrag)return;

		// check is left mouse button is pressed
		if(pdcore.isOpera && event.which!=1){
			//mouse button was released outside window
			t.dragStop(event);
			return;
		}

		if(!t.dragGoFired){
			t.dragGoFired=true;
			t.ondraggo();
		}

		var dX=event.screenX-t.cursorStartX;
		var dY=event.screenY-t.cursorStartY;
		var eX=t.elStartLeft+dX;
		var eY=t.elStartTop+dY;
		var dx=dX-t.dx;//dx since last event
		var dy=dY-t.dy;//dy since last event
		t.dx=dX;
		t.dy=dY;
		try{t.DragMove(eX,eY,dX,dY,t.elm,event,dx,dy)}catch(E){}

		//cancel event
		try{if(event.stopPropagation)event.stopPropagation();}catch(E){}
		event.canceled=true;
		return false;
	}
}
Drag.dragStop=function(event){
	var t=Drag;//Drag;
	if(!t.inDrag)return;
	t.inDrag=false;
	
	Drag.ondragstop();
	
	if(!event)event=window.event;
	if(!event)return;

	var dX = event.screenX-t.cursorStartX;
	var dY = event.screenY-t.cursorStartY;
	var eX = t.elStartLeft+dX;
	var eY = t.elStartTop+dY;
	t.dx=dX;
	t.dy=dY;
	try{if(Drag.DragEnd)Drag.DragEnd(eX,eY,dX,dY,t.elm,event)}catch(E){}

	pdcore.events.removeEvent(document, "mousemove", Drag.dragGo);
	pdcore.events.removeEvent(document, "mouseup", Drag.dragStop);
	
//	for(var idx=0;idx<window.frames.length;idx++){
//		try{
//			var frame=window.frames[idx];
//			pdcore.events.removeEvent(frame.document, "mousemove", function(event){Drag.dragGo(event);});
//			pdcore.events.removeEvent(frame.document, "mouseup", function(event){Drag.dragStop(event);});
//		}catch(E){}
//	}

	pdcore.events.preventBubble(event);
}
Drag.DragMoveEmpty=function(){}