/*
Copyright (c) 2007, PMP Concept
version: 1
*/


// include des classes requises
if(typeof PMP != "undefined")
{
	PMP.include("librairiesjs/event.js");
}


/*****************************************************************************
 *
 * 								Classe pmpDragDrop
 *
 *	Fonction : 	gestion des glisser déposer
 *
 *  Paramètres
 *  	- element	: (string / object) l'objet à gérer
 *
*****************************************************************************/

PMP.util.pmpDragDrop = function(elementToDrag, elementStartDrag, parameters) 
{
	this.setDragDrop(elementToDrag, elementStartDrag, parameters);
}


PMP.util.pmpDragDrop.prototype = {
	
	setDragDrop : function(elementToDrag, elementStartDrag, parameters) 
	{
		
		this.element = typeof(elementToDrag)=="string" ? document.getElementById(elementToDrag) : elementToDrag;
		if(!this.element)
			this.element = false;
		else
		{
			// active le glisser
			this.startDragElement = typeof(elementStartDrag)=="string" ? document.getElementById(elementStartDrag) : elementStartDrag;
			if(!this.startDragElement)
				this.startDragElement = this.element;

			this.startDragElement.onselectstart = this._mousedown.bind(this); // ie
			this.startDragElement.onmousedown = this._mousedown.bind(this); // mozilla
			
		}

		if(!PMP.common.isObject(parameters))
			var parameters = {};

		this.parentElement = parameters.parent ? parameters.parent : PMP.common.truebody();
		this.onDragStart = parameters.onDragStart ? parameters.onDragStart : null;
		this.onDragEnd = parameters.onDragEnd ? parameters.onDragEnd : null;
	},
	
	_mousedown : function(evt) 
	{
		if(this.drag)
			return false;
			
		if(this.onDragStart)
			this.onDragStart();

		this.drag = true;
		this.element.style.cursor = "move";	
		
		this.mousemove = PMP.common.truebody().onmousemove;
		this.mouseup = PMP.common.truebody().onmouseup;
		
		var pmpEvt = new PMP.util.pmpEvent();
		pmpEvt.getEvent(evt);
		
		var coord = pmpEvt.getCoordinate();
		this.mouseOffsetX =  coord.x - PMP.common.getElementLeft(this.element);
		this.mouseOffsetY =  coord.y - PMP.common.getElementTop(this.element);
		
		PMP.common.truebody().onmousemove = this._mousemove.bind(this);
		PMP.common.truebody().onmouseup = this._mouseup.bind(this);

		// désactive la sélection du texte au déplacement de la souris
		return false;
	},
	
	_mousemove : function(evt) 
	{
		var pmpEvt = new PMP.util.pmpEvent();
			
		pmpEvt.getEvent(evt);
		
		if(this.element && this.drag)
		{
			var coord = pmpEvt.getCoordinate();
			
			var left = coord.x - this.mouseOffsetX;
			var top = coord.y - this.mouseOffsetY;


			if(top<0)
				this.element.style.top = 0 + "px";
			else if(top+this.element.offsetHeight > PMP.common.getContentHeight(this.parentElement))
				this.element.style.top = PMP.common.getContentHeight(this.parentElement) - this.element.offsetHeight + "px";
			else
				this.element.style.top = top + "px";

			if(left<0)
				this.element.style.left = 0 + "px";
			else if(left+this.element.offsetWidth > PMP.common.getContentWidth(this.parentElement))
				this.element.style.left = PMP.common.getContentWidth(this.parentElement) - this.element.offsetWidth + "px";
			else
				this.element.style.left = left + "px";
		}
	},
	
	_mouseup : function(evt) 
	{
		this.drag = false;	
		this.element.style.cursor = "default";	
		
		if(this.onDragEnd)
			this.onDragEnd();
		
		PMP.common.truebody().onmousemove = this.mousemove;
		PMP.common.truebody().onmouseup = this.mouseup;
	}
}
