
// Fonction Javascript qui calcule la coordonnée Left d'un objet element
function posleft(element)
{
	var offset=0;
	while(element)
	{
		offset+=element["offsetLeft"];
		element=element.offsetParent;
	}
	return offset;
}
// Fonction Javascript qui calcule la coordonnée Top d'un objet element
function postop(element)
{
	var offset=0;
	while(element)
	{
		offset+=element["offsetTop"];
		element=element.offsetParent;
	}
	return offset;
}
var Drag = {

	obj : null,

	init : function(o, oRoot, minX, maxX, minY, maxY, bSwapHorzRef, bSwapVertRef, fXMapper, fYMapper)
	{
		o.onmousedown	= Drag.start;

		o.hmode			= bSwapHorzRef ? false : true ;
		o.vmode			= bSwapVertRef ? false : true ;

		o.root = oRoot && oRoot != null ? oRoot : o ;

		if (o.hmode  && isNaN(parseInt(o.root.style.left  ))) o.root.style.left   = "0px";
		if (o.vmode  && isNaN(parseInt(o.root.style.top   ))) o.root.style.top    = "0px";
		if (!o.hmode && isNaN(parseInt(o.root.style.right ))) o.root.style.right  = "0px";
		if (!o.vmode && isNaN(parseInt(o.root.style.bottom))) o.root.style.bottom = "0px";

		o.minX	= typeof minX != 'undefined' ? minX : null;
		o.minY	= typeof minY != 'undefined' ? minY : null;
		o.maxX	= typeof maxX != 'undefined' ? maxX : null;
		o.maxY	= typeof maxY != 'undefined' ? maxY : null;

		o.xMapper = fXMapper ? fXMapper : null;
		o.yMapper = fYMapper ? fYMapper : null;

		o.root.onDragStart	= new Function();
		o.root.onDragEnd	= new Function();
		o.root.onDrag		= new Function();
	},

	start : function(e)
	{
		var o = Drag.obj = this;
		e = Drag.fixE(e);
		var y = parseInt(o.vmode ? o.root.style.top  : o.root.style.bottom);
		var x = parseInt(o.hmode ? o.root.style.left : o.root.style.right );
		o.root.onDragStart(x, y);

		o.lastMouseX	= e.clientX;
		o.lastMouseY	= e.clientY;

		if (o.hmode) {
			if (o.minX != null)	o.minMouseX	= e.clientX - x + o.minX;
			if (o.maxX != null)	o.maxMouseX	= o.minMouseX + o.maxX - o.minX;
		} else {
			if (o.minX != null) o.maxMouseX = -o.minX + e.clientX + x;
			if (o.maxX != null) o.minMouseX = -o.maxX + e.clientX + x;
		}

		if (o.vmode) {
			if (o.minY != null)	o.minMouseY	= e.clientY - y + o.minY;
			if (o.maxY != null)	o.maxMouseY	= o.minMouseY + o.maxY - o.minY;
		} else {
			if (o.minY != null) o.maxMouseY = -o.minY + e.clientY + y;
			if (o.maxY != null) o.minMouseY = -o.maxY + e.clientY + y;
		}
		o.style.zIndex=1; // Code rajouté Hervé
		document.onmousemove	= Drag.drag;
		document.onmouseup		= Drag.end;

		return false;
	},

	drag : function(e)
	{
		e = Drag.fixE(e);
		var o = Drag.obj;

		var ey	= e.clientY;
		var ex	= e.clientX;
		var y = parseInt(o.vmode ? o.root.style.top  : o.root.style.bottom);
		var x = parseInt(o.hmode ? o.root.style.left : o.root.style.right );
		var nx, ny;

		if (o.minX != null) ex = o.hmode ? Math.max(ex, o.minMouseX) : Math.min(ex, o.maxMouseX);
		if (o.maxX != null) ex = o.hmode ? Math.min(ex, o.maxMouseX) : Math.max(ex, o.minMouseX);
		if (o.minY != null) ey = o.vmode ? Math.max(ey, o.minMouseY) : Math.min(ey, o.maxMouseY);
		if (o.maxY != null) ey = o.vmode ? Math.min(ey, o.maxMouseY) : Math.max(ey, o.minMouseY);

		nx = x + ((ex - o.lastMouseX) * (o.hmode ? 1 : -1));
		ny = y + ((ey - o.lastMouseY) * (o.vmode ? 1 : -1));

		if (o.xMapper)		nx = o.xMapper(y)
		else if (o.yMapper)	ny = o.yMapper(x)

		Drag.obj.root.style[o.hmode ? "left" : "right"] = nx + "px";
		Drag.obj.root.style[o.vmode ? "top" : "bottom"] = ny + "px";
		Drag.obj.lastMouseX	= ex;
		Drag.obj.lastMouseY	= ey;

		Drag.obj.root.onDrag(nx, ny);
		return false;
	},

	end : function()
	{ Drag.obj.style.zIndex=0; // Code rajouté Hervé
		document.onmousemove = null;
		document.onmouseup   = null;
		Drag.obj.root.onDragEnd(	parseInt(Drag.obj.root.style[Drag.obj.hmode ? "left" : "right"]), 
									parseInt(Drag.obj.root.style[Drag.obj.vmode ? "top" : "bottom"]));
		Drag.obj = null;
	},

	fixE : function(e)
	{
		if (typeof e == 'undefined') e = window.event;
		if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
		if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
		return e;
	}
};

var sourcetop=new Array();
var sourceleft=new Array();
var destinfo=new Array();
var deplacement=new Array();
var nbelem=0;
function initdragdrop() 
{ 
	var tblsource= new Array();
	if (document.all || document.getElementById)
	{	texte ="";
		i=1;
		sourceid = "source" + i ;
		var existe = document.getElementById(sourceid) || 0 ;
		while (existe!=0)
		{			
			tblsource[i] = existe;
			sourcetop[sourceid]=postop(tblsource[i]);
			sourceleft[sourceid]=posleft(tblsource[i]);
			tblsource[i].style.top= sourcetop[sourceid] + "px";
			tblsource[i].style.left=sourceleft[sourceid] + "px";
			Drag.init(tblsource[i], null, 0, 2000, 0, 1000);
			texte += "tblsource[" + i + "].onDragEnd = function(x, y) { deposersource(tblsource[" + i + "], x, y); };";
			i++;
			sourceid = "source" + i ;
			existe = document.getElementById(sourceid) || 0 ;
		}
		nbelem = i-1;
		eval(texte);
		for(i=1;i<=nbelem;i++) 
		{// Attention ce n'est pas une erreur de prog, il ne faut pas rapatrier cette instruction dans la boucle précédente
			tblsource[i].style.position="absolute";
		}
	}
	deplacement[1]=postop(document.getElementById('frmordonner'));
	deplacement[2]=posleft(document.getElementById('frmordonner'));
}

function deposersource(source, x, y)
{
	var itrouve = 0;
	var i=1;
	var $marge=20;
	while (itrouve == 0 && i<=nbelem) // Recherche si l'on est au dessus d'un objet destination
	{	destid="dest" + i;
		dest = document.all ? document.all[destid] : document.getElementById(destid);
		topmindest=postop(dest)-$marge;
		topmaxdest=parseInt(topmindest) + parseInt(dest.style.height) + $marge;
		leftmindest=posleft(dest)-$marge;
		leftmaxdest=parseInt(leftmindest) + parseInt(dest.style.width) + $marge;
		if (y>topmindest && y<topmaxdest && x>leftmindest && x<leftmaxdest)
			itrouve=i;
		i++;
	}
	if (itrouve>0)
	{	if (dest.readOnly!=true) // en liaison avec Corriger
		{	if (dest.value!="")
				viderdest(dest);
			dest.value = source.innerHTML.replace(/&nbsp;/g," "); // enlever les &nbsp; générés en Php pour IE6
			source.innerHTML="";
			source.style.visibility = "hidden";
			destinfo[destid]=source.id;
			// en liaison avec Corriger
			dest.style.color="black";
			dest.style.backgroundColor="white"; 
		}
	}
	source.style.top = sourcetop[source.id] + "px";
	source.style.left = sourceleft[source.id] + "px";
}


function deplacersources()
{
	deplacement[3]=postop(document.getElementById('frmordonner'));
	deplacement[4]=posleft(document.getElementById('frmordonner'));
	deplacement[5]=deplacement[3]-deplacement[1];
	deplacement[6]=deplacement[4]-deplacement[2];
	var i=1; 
	sourceid = "source" + i ;
	var existe = document.getElementById(sourceid) || 0 ;
	while (existe!=0)
	{			
		sourcetop[sourceid]=sourcetop[sourceid]+deplacement[5];
		sourceleft[sourceid]=sourceleft[sourceid]+deplacement[6];
		document.getElementById(sourceid).style.top= sourcetop[sourceid] + "px";
		document.getElementById(sourceid).style.left=sourceleft[sourceid] + "px";
		i++;
		sourceid = "source" + i ;
		existe = document.getElementById(sourceid) || 0 ;
	}
	deplacement[1]=deplacement[3];
	deplacement[2]=deplacement[4];
}
 
function viderdest(dest)
{	if (dest.readOnly!=true ) //&& dest.value!="" en liaison avec Corriger
	{
		if (dest.value=="?") // en liaison avec Corriger
		{
			dest.value= "";
			dest.style.backgroundColor="white";
			dest.style.color="black";
		}
		else
		{
			var source = document.getElementById(destinfo[dest.id]) || 0;
			if (source)
			{ 
				source.innerHTML=dest.value.replace(/ /g,"&nbsp;");;
				source.style.visibility = "visible";		
				source.style.top = sourcetop[source.id] + "px";
				source.style.left = sourceleft[source.id] + "px";
				dest.value= "";
				destinfo[dest.id]="";
				// en liaison avec Corriger :
				dest.style.color="black";
				dest.style.backgroundColor="white"; 
			}
		}
	}
}

function clicsource(source)
{	// Algo éventuellement optimisable pour arréter la boucle avant mais serait ce plus rapide ???
	if (source.innerHTML!="")
	{
		var itrouve = 0;
		var i=1; 
		while (itrouve == 0 && i<=nbelem) // Recherche du 1er objet destination vide
		{	destid="dest" + i;
			dest = document.all ? document.all[destid] : document.getElementById(destid);
			if ((dest.value=="" || dest.value=="?") && dest.readOnly!=true)
			{
				itrouve=i;
				dest.value="";
			}
			i++;
		}
		if (itrouve>0)
		{	
			dest.value = source.innerHTML.replace(/&nbsp;/g," "); // enlever les &nbsp; générés en Php pour IE6
			source.innerHTML="";
			source.style.visibility = "hidden";
			destinfo[destid]=source.id;
			// en liaison avec Corriger :
			dest.style.color="red"; // ne pas enlever pb bug IE
			dest.style.backgroundColor="white"; 
			dest.style.color="black";
		}
	}
}

