/*
Préconditions
EXISTS(element divdragger)
EXISTS(fonction sendMoveRequest(usermodid, movemode, othermodid))
NOTNULL(leftcontentid, middlecontentid, rightcontentid, largecontentid)
CANBENULL(bottomcontent)
*/


	var MOVEMOD_AFTER = 0;
	var MOVEMOD_BEFORE = 1;
	var MOVEMOD_FIRST = 2;
	var MOVEMOD_LAST = 3;

	var mods = new Array();	
	var selectedMod = null;
	var previewMode;
	var relativeDiv;
	var previewDiv = null;

	var drag_ignoresaves = false;
	

	var leftcontentid = 'leftcontent', 
	    middlecontentid = 'middlecontent', 
	    rightcontentid = 'rightcontent', 
	    bottomcontentid = 'bottomcontent',
	    largecontentid = 'largecontent',
		maincontentid = 'maincontent';
		

	function setContentIds(left, middle, right, bottom, large){
		leftcontentid = left;
		middlecontentid = middle;
		rightcontentid = right;
		bottomcontentid = bottom;
		if (large != null)
			largecontentid = large;
	}


	function ModBox(modid, title, x, cantInsertBefore, cantMove, fixedColumn, restrictedColumn){
		this.restrictedColumn = (restrictedColumn ? restrictedColumn : 0);
		this.modid = modid;
		this.title = title;
		this.x = x;
		
		this.cantInsertBefore = (cantInsertBefore ? true : false);
		
		this.cantMove = (cantMove ? true : false);
		this.fixedColumn = (fixedColumn ? fixedColumn : 0);
		this.divid = "";
		this.innerHTML = "";
		this.destCol = 0;
		this.className = "";
		this.borderstyle = "";
		//this.haha = "1212";
		
	}

	function selectBox(mouseevent, modid, divid){
		
		if (!dragdropenabled)
			return;
		
		addEvent(getElem(maincontentid), 'mousemove', managePreview2);
		
		var mod = mods[modid];
		mod.divid = divid;

		if (mod.cantMove)
			return;

		selectedMod = mod;

		var item = document.getElementById(divid);
		var dragger = document.getElementById('divdragger');

		dragger.className = item.className;
		
		dragger.innerHTML = item.innerHTML;
		//enlever le titre
		//var child = dragger.childNodes[0];
		//dragger.removeChild(child);
		
		
		
		var width = getW(item);
		
		dragger.style.width = width.toString() + "px";
		
		var tempInner = item.innerHTML;
		mod.innerHTML = tempInner;		
		mod.className = item.className;
		
		
		
		var height = getH(item);
		
		
		item.innerHTML = "<div class='mod_box' style='height:" + 
						height.toString() + "px;'>&nbsp;</div>"; 
		
		previewDiv = null;
		relativeDiv = null;
		
		hideAllFlash();
		
		placeDragger(mouseevent);
		
	}


	function unselectBox(){
		if (!selectedMod)
			return;
			
		
			//if (typeof fname == 'function'){
				
			//}

		if (previewDiv != null){
			
			removeElement(document.getElementById(selectedMod.divid));

			previewDiv.id = selectedMod.divid;
			previewDiv.innerHTML = selectedMod.innerHTML;
			/*var subchild = previewDiv.childNodes[0].childNodes[0];
			subchild.className = "block_title_text";
			subchild.id = "block_title_text_" + selectedMod.modid.toString();
			subchild.innerHTML = selectedMod.title;
			executeSIFR("#" + subchild.id);*/
		
			var othermodid = 0;
			
			if (previewMode == MOVEMOD_LAST){
				othermodid = selectedMod.destCol;
				selectedMod.x = selectedMod.destCol;
			}
			else{
			
				othermodid = relativeDiv.id.replace(/moddef/, "");
				othermodid = othermodid.replace(/modtitle/, "");
				selectedMod.x = mods[othermodid].x;
			}
			
			
			
			if (!drag_ignoresaves)
				sendMoveRequest(selectedMod.modid, previewMode, othermodid);
			
		}
		else{
			
			if (selectedMod.divid != null){
				var target = document.getElementById(selectedMod.divid);
				target.innerHTML = selectedMod.innerHTML;
				
				
			}
		}
		
		var fname = 'onmoddrop' + selectedMod.modid.toString();
		previewDiv = null;
		relativeDivId = null;
		selectedMod = null;
		previewMode = 0;
		getElem('divdragger').innerHTML = "";

		dragger = document.getElementById('divdragger');
		dragger.style.display = 'none';
		//setSelectable(document.getElementsByTagName('body')[0], true);
		
		unhideAllFlash();
		fixBoxBG();
		
		removeEvent(getElem(maincontentid), 'mousemove', managePreview2);
		
		
		if(eval('typeof ' + fname) == 'function'){
			eval(fname + '()');
		}
		
		//resizeColumns(largecontentid, rightcontentid);
		
		
	}

	function debug(msg){
		document.getElementById("moddef90").innerHTML = msg;
	}

	function managePreview2(evt){
		if (selectedMod == null)
			return;
			
		
			
		
		var divleft = document.getElementById(leftcontentid);
		var divmiddle = document.getElementById(middlecontentid);
		var divright = document.getElementById(rightcontentid);
		
		var bottomy = 99999;
		if (bottomcontentid != null){
			var divbottom = document.getElementById(bottomcontentid);
			bottomy = getY(divbottom);
		}
		bottomy = 99999;

		


		var divs = new Array(divleft, divmiddle, divright);
		var mx = mouseX(evt);
		var my = mouseY(evt);
		var curX = -1;
		
		//trouver dans quelle colonne on est
		if (mx > getX(divleft) && mx < getX(divleft) + getW(divleft) && my < bottomy && my > getY(divleft)){
				curX = 1;
		}
		else if (mx > getX(divmiddle) && mx < getX(divmiddle) + getW(divmiddle) && my < bottomy && my > getY(divmiddle)){
				curX = 2;
		}
		else if (mx > getX(divright) && mx < getX(divright) + getW(divright) && 
				my > getY(divright)){
				curX = 3;
				
		}
		

		
		if (curX == -1){
			leavePreview(evt);
			return;
		}
		
		if (checkPreviewLeave(mx, my, curX, divs))
			leavePreview(evt);
				
		if (previewDiv != null)
			return;
		
		if (selectedMod.fixedColumn > 0 && selectedMod.fixedColumn != curX)
			return;	
			
		if (selectedMod.restrictedColumn > 0 && selectedMod.restrictedColumn == curX){
			return;
		}
		
		//trouver vis-à-vis quel box (en y) on essaie de placer le preview
		relativeDiv = null;
		for (var i = 0; i < divs[curX - 1].childNodes.length; i++){
			var tdiv = divs[curX - 1].childNodes[i];


			if (tdiv.tagName && my > getY(tdiv) - 10 && my < getY(tdiv) + getH(tdiv)){
				relativeDiv = tdiv;
				break;
			}
		}
		
		
		
		if (!relativeDiv){	//2 cas : la souris est en dessous de tout div, ou il n'y a pas d'item
			
			previewMode = MOVEMOD_LAST;
		}
		else{
			if (relativeDiv.id == selectedMod.divid || relativeDiv.id == "divpreview" ||
				!relativeDiv.id || relativeDiv.id == "")
				return;
		}
		
		
			
		/*if (previewDiv != null){
			removeElement(previewDiv);
			previewDiv = null;
		}*/
		selectedMod.destCol = curX;
		
		var dragger = document.getElementById("divdragger");
		previewDiv = document.createElement("div");
		previewDiv.className = dragger.className;
		previewDiv.style.position = "relative";
		previewDiv.innerHTML = dragger.innerHTML;
		
		//previewDiv.style.border = "1px solid black";
		previewDiv.id = 'divpreview';
		
		if (previewMode == MOVEMOD_LAST){
			
			divs[curX - 1].appendChild(previewDiv);
		}
		else{
			var othermodid = relativeDiv.id.replace(/moddef/, "");
			othermodid = othermodid.replace(/modtitle/, "");
			
			//SOLUTION TEMPORAIRE pour empêcher le plaçage entre infobox et optionsbox
			if (mods[othermodid].cantMove)
				return;
			
			var h = getH(relativeDiv);
			var pos = getRelativeMousePos(relativeDiv.id, evt);
			
			if (pos['y'] < h/2 && !mods[othermodid].cantInsertBefore){
				divs[curX - 1].insertBefore(previewDiv, relativeDiv);
				previewMode = MOVEMOD_BEFORE;
			}
			else{
				insertAfter(divs[curX - 1], previewDiv, relativeDiv);
				previewMode = MOVEMOD_AFTER;
			}
			
		}
		


	}
	
	
	function checkPreviewLeave(mx, my, curCol, divs){
		
		if (previewDiv == null || selectedMod == null)
			return false;
			
		if (curCol != selectedMod.destX)
			return true;
		
		debug(previewMode.toString());
				
		if (previewMode == MOVEMOD_LAST){
			if (my < getY(previewDiv))
				return true;
			else
				return false;
		}
		else if (previewMode == MOVEMOD_BEFORE){
			if (my < getY(previewDiv) || my > getY(relativeDiv) + getH(relativeDiv))
				return true;
			else
				return false;
		}
		else if (previewMode == MOVEMOD_AFTER){
			if (my < getY(relativeDiv) + getH(relativeDiv)/2 || my > getY(previewDiv) + getH(previewDiv))
				return true;
			else
				return false;
		}	
		
		return 100/0;	//pas censé arriver ici
		
	}

	
	var dragdropenabled = true;
	function disableDragDrop(){
		dragdropenabled = false;		
	}
	
	function enableDragDrop(){
		dragdropenabled = true;
	}



	
	
	function placeDragger(mouseevent){
		if (selectedMod == null){
			return true;
		}
		
		dragger = document.getElementById('divdragger');
		
		
		dragger.style.left = (mouseX(mouseevent) + 5).toString() + 'px';
		dragger.style.top = (mouseY(mouseevent) + 5).toString() + 'px';
		dragger.style.display = '';
		
		return false;
	}
	
	
	
	
	function leavePreview(mouseevent){
		
		if (previewDiv != null)
			removeElement(previewDiv);
		
		
		previewDiv = null;
		relativeDivId = null;
		previewMode = 0;
		
	}
	
		
	
	document.onmousemove = placeDragger;
	document.onmouseup = unselectBox;
