//////////  Drag & Drop Libraries  //////////
//
// Author: Csete Roland of flashpistols
// E-mail: akta@fps.hu 
/////////////////////////////////////////////

// Read blocks in the containers
function readDnDcontainer(dragConts, dragClass){
	var dragArray = [];
	//alert(dragConts.id);
	var x = 0;
		for(j=0; j<dragConts.childNodes.length; j++){
		//alert(dragConts.childNodes[j].className);
			if(dragConts.childNodes[j].className==dragClass){
				dragArray[x++] = dragConts.id + ',' + dragConts.childNodes[j].id;
			}
		}
	xajax_write_order(dragArray);
}

// Drag & Drop maker
function makeDnD(dragConts, handleClass, mapID, clearObjs){
	
	var dragConts;
	var handleClass;
	var mapID;
	var clearObjs;
	var mouseXY = null;
	var mouseOffset = null;
	var origanPosition = null;
	var dragObject = null;
	var dragableObject = null;
	var dragMap = null;
	var activeCont = null;
	var containerPosition = [];
	var boxPosition = [];
	var rootParent = null;
	var rootSibling = null;
	var dragHelper = null;
	
	var originalParent = null;
	var originalNum = null;
	var rootNum = null;
	var contNum = null;
	var tmpObj = null;
	var tmpRoot = null;
	var tmpOriginal = null;

	this.ajaxCall = new Function();
	
	this.init = function(){
		dragHelper = document.createElement('div');
		dragHelper.style.cssText = 'position:absolute; display:none;';
		document.body.appendChild(dragHelper);
		
		for(var n=0; n<dragConts.length; n++){
			for(j=0; j<dragConts[n].childNodes.length; j++){ // Remove firefox #text nodes
				if(dragConts[n].childNodes[j].nodeName=='#text'){
					dragConts[n].removeChild(dragConts[n].childNodes[j]);
				}
			}
		} // end FOR n;
	};
	
	this.returnMovedElements = function(){
		if(tmpObj && tmpOriginal && tmpRoot){
			return {id:tmpObj.id, oldposition:originalNum, oldcontainer:tmpOriginal.id, newposition:rootNum, newcontainer:tmpRoot.id};
		}else{
			return false;
		}
	};

	this.mouseMove = function(e){
		e = event(e);
		
		mouseXY = getMouseCoords(e);

		var handleObj = e.target || e.srcElement;
		var rootObj = handleObj.parentNode;
		var contObj = handleObj.parentNode.parentNode;
		
		if(handleObj.className==handleClass){
			handleObj.onmousedown = function(e){
				mouseDown(rootObj, e);
			}
		}
		
		if(dragableObject){
			rootParent = dragMap.parentNode;
			rootSibling = dragMap.nextSibling;

			for(var i=0; i<dragConts.length; i++){
				with(dragConts[i]){
					var pos = getPosition(dragConts[i]);
					containerP = { top:pos.y, left:pos.x, height:dragConts[i].offsetHeight, width:dragConts[i].offsetWidth };
				}
				containerPosition[i] = containerP;
				
				for(var j=0; j<dragConts[i].childNodes.length; j++){
					with(dragConts[i].childNodes[j]){
						if(dragConts[i].childNodes[j]==dragMap) continue;
						var pos = getPosition(dragConts[i].childNodes[j]);
						boxP = { top:pos.y, left:pos.x, height:dragConts[i].childNodes[j].offsetHeight, width:dragConts[i].childNodes[j].offsetWidth };
					}
					boxPosition[dragConts[i].childNodes[j].id] = boxP;
				}
			}
		
			dragableObject.style.top  = mouseXY.y - mouseOffset.y + 'px';
			dragableObject.style.left = mouseXY.x - mouseOffset.x + 'px';
			
			var xPos = mouseXY.x - mouseOffset.x + (origanPosition.width/2);
			var yPos = mouseXY.y - mouseOffset.y + (origanPosition.height/2);

			for(var i=0; i<dragConts.length; i++){
				with(dragConts[i]){
					if((containerPosition[i].left < xPos) && (containerPosition[i].top < yPos) &&
						((containerPosition[i].left + containerPosition[i].width) > xPos) && ((containerPosition[i].top + containerPosition[i].height) > yPos)){
						activeCont = dragConts[i];
						contNum = i;
						break;
					}
				}
			}

			if(activeCont){ // Our target object is in one of our containers!
				var beforeNode = null;
				for(var i=activeCont.childNodes.length-1; i>=0; i--){
					with(activeCont.childNodes[i]){
						if(id!=dragMap.id){ // if the current item is "After" the item being dragged
							if(dragMap != activeCont.childNodes[i] &&
								((boxPosition[id].left + boxPosition[id].width) > xPos) && 
								((boxPosition[id].top + boxPosition[id].height) > yPos)){ 
									beforeNode = activeCont.childNodes[i];
							}
						}
					}
				}
				if(beforeNode){
					if(beforeNode!=dragMap.nextSibling){
						if(dragMap.parentNode!=activeCont){
							rootParent.removeChild(dragMap); // remove dragMap
						}else{
							activeCont.removeChild(dragMap); // remove dragMap
						}
						activeCont.insertBefore(dragMap, beforeNode); // reinsert dragMap
					}
					
				}else{
					if((dragMap.nextSibling) || (dragMap.parentNode!=activeCont)){
						if(clearObjs[contNum]){
							//activeCont.insertBefore(dragMap, clearObjs[contNum]);
						}else{
							activeCont.appendChild(dragMap);
						}
					}
				}
			}
		} // end IF dragableObject
		return false;
	};

	this.mouseUp = function(){
		if(rootParent){			
			if(rootSibling){
				rootParent.insertBefore(dragObject, dragMap); // insert dragObject
				rootParent.removeChild(dragMap); // remove dragMap
			}else{
				rootParent.removeChild(dragMap); // remove dragMap
				rootParent.appendChild(dragObject); // insert dragObject
			}
			
			for(var i=0; i<rootParent.childNodes.length; i++){
				if(rootParent.childNodes[i]==dragObject){
					rootNum=i;
					break;
				}
			}
			tmpObj = dragObject;
			tmpOriginal = originalParent;
			tmpRoot = rootParent;
			dragHelper.style.display = 'none';
			dragObject = null;
			dragableObject = null;
			dragMap = null;
			originalParent = null;
			rootParent = null;
			rootSibling = null;
			
			if((tmpOriginal!=tmpRoot) || (originalNum!=rootNum)){
				this.ajaxCall();
			}

			originalNum = null;
			rootNum = null;
			contNum = null;
		}
		return false;
	};

	function mouseDown(item, e){
		e = event(e);
		dragObject = item;
		originalParent = dragObject.parentNode;
		for(var i=0; i<originalParent.childNodes.length; i++){
			if(originalParent.childNodes[i]==dragObject){
				originalNum=i;
				break;
			}
		}

		// save container position
		mouseOffset = getMouseOffset(dragObject,e);
		var originalXY = getPosition(dragObject);
		origanPosition = {top:originalXY.y, left:originalXY.x, height:dragObject.offsetHeight, width:dragObject.offsetWidth };

		// init dragHelper
		for(var i=0; i<dragHelper.childNodes.length; i++) dragHelper.removeChild(dragHelper.childNodes[i]);
		dragHelper.appendChild(dragObject.cloneNode(true));
		dragHelper.style.display = 'block';		
		dragHelper.style.opacity = 0.50;
		dragHelper.style.filter = 'alpha(opacity=50)';
		dragHelper.style.zIndex = '101';		
		dragHelper.style.top  = mouseXY.y - mouseOffset.y + 'px';
		dragHelper.style.left = mouseXY.x - mouseOffset.x + 'px';
		
		// init dragMap
		dragMap = document.createElement('div');
		dragMap.id = mapID;
		dragObject.parentNode.insertBefore(dragMap, dragObject);
		dragMap.style.height = (dragObject.offsetHeight - 4) + 'px';
		dragMap.style.width = (dragObject.offsetWidth - 4) + 'px';

		dragableObject = dragHelper;
		rootParent = dragMap.parentNode;
		rootSibling = dragMap.nextSibling;
		
		dragObject.parentNode.removeChild(dragObject); // remove dragObject
		
		return false;
	}
	
	function getMouseOffset(target, e){
		e = event(e);
		var targPos =  getPosition(target);
		var mousePos = getMouseCoords(e);
		return {x:mousePos.x - targPos.x, y:mousePos.y - targPos.y};
	}
	
	function getMouseCoords(e){
		e = event(e);

		sL = (document.body.scrollLeft) ? document.body.scrollLeft : 0 ;
		sT = (document.body.scrollTop) ? document.body.scrollTop : 0 ;
		cL = (document.body.clientLeft) ? document.body.clientLeft : 0 ;
		cT = (document.body.clientTop) ? document.body.clientTop : 0 ;

		var mouseX = e.clientX + sL - cL;
		var mouseY = e.clientY + sT - cT;
		return {x:mouseX, y:mouseY};
	}

	function getPosition(target){
		var left = 0;
		var top  = 0;
		while (target.offsetParent){
			left += target.offsetLeft + (target.currentStyle ? (parseInt(target.currentStyle.borderLeftWidth)).NaN0() : 0);
			top += target.offsetTop + (target.currentStyle ? (parseInt(target.currentStyle.borderTopWidth)).NaN0() : 0);
			target = target.offsetParent;
		}

		left += target.offsetLeft + (target.currentStyle ? (parseInt(target.currentStyle.borderLeftWidth)).NaN0() : 0);
		top += target.offsetTop + (target.currentStyle ? (parseInt(target.currentStyle.borderTopWidth)).NaN0() : 0);

		return {x:left, y:top};
	}

	function event(e){
		if (typeof e == 'undefined') e = window.event;
		return e;
	}

	function info(target,mode,text){
		if(mode){
			document.getElementById('inp'+target).value += text;
		}else{
			document.getElementById('inp'+target).value = text;
		}
	}
}


// Add new item to DnD
function addNewDnD(dragConts, addCont, handleClass, mapID, bColor, bColorHover, clearObjs){
	
	var dragConts;
	var addCont;
	var handleClass;
	var mapID;
	var clearObjs;
	var bColor;
	var bColorHover;
	var mouseXY = null;
	var mouseOffset = null;
	var origanPosition = null;
	var dragObject = null;
	var dragableObject = null;
	var dragMap = null;
	var activeCont = null;
	var containerPosition = [];
	var boxPosition = [];
	var rootParent = null;
	var dragHelper = null;
	
	var contNum = null;
	
	this.ajaxCall = new Function();
	this.activeContainer;
	this.addItem;
	this.addPosition = 0;
	
	this.init = function(){
		dragHelper = document.createElement('div');
		dragHelper.style.cssText = 'position:absolute; display:none;';
		document.body.appendChild(dragHelper);

		for(var n=0; n<dragConts.length; n++){
			for(j=0; j<dragConts[n].childNodes.length; j++){ // Remove firefox #text nodes
				if(dragConts[n].childNodes[j].nodeName=='#text'){
					dragConts[n].removeChild(dragConts[n].childNodes[j]);
				}
			}
		} // end FOR n;
		
		for(var i=0; i<addCont.childNodes.length; i++){ // Remove firefox #text nodes
			if(addCont.childNodes[i].nodeName=='#text'){
				addCont.removeChild(addCont.childNodes[i]);
			}
		} // end FOR i;
		
	};

	this.mouseMove = function(e){
		e = event(e);
		
		mouseXY = getMouseCoords(e);

		var handleObj = e.target || e.srcElement;
		var rootObj = handleObj.parentNode;
		var contObj = handleObj.parentNode.parentNode;
		
		//info(1,0, 'x:' + mouseXY.x + '; y:' +  mouseXY.y );
		if(handleObj.className==handleClass){
			handleObj.onmousedown = function(e){
				mouseDown(rootObj, e);
			}
		}
		
		if(dragableObject){
			rootParent = dragMap.parentNode;

			for(var i=0; i<dragConts.length; i++){
				with(dragConts[i]){
					var pos = getPosition(dragConts[i]);
					containerP = { top:pos.y, left:pos.x, height:dragConts[i].offsetHeight, width:dragConts[i].offsetWidth };
				}
				containerPosition[i] = containerP;
				
				for(var j=0; j<dragConts[i].childNodes.length; j++){
					with(dragConts[i].childNodes[j]){
						if(dragConts[i].childNodes[j]==dragMap) continue;
						var pos = getPosition(dragConts[i].childNodes[j]);
						boxP = { top:pos.y, left:pos.x, height:dragConts[i].childNodes[j].offsetHeight, width:dragConts[i].childNodes[j].offsetWidth };
					}
					boxPosition[dragConts[i].childNodes[j].id] = boxP;
				}
			}
		
			dragableObject.style.top  = mouseXY.y - mouseOffset.y - addCont.scrollTop + 'px';
			dragableObject.style.left = mouseXY.x - mouseOffset.x - addCont.scrollLeft + 'px';
			
			var xPos = mouseXY.x - mouseOffset.x + (origanPosition.width/2) - addCont.scrollLeft;
			var yPos = mouseXY.y - mouseOffset.y + (origanPosition.height/2) - addCont.scrollTop;
			
			for(var i=0; i<dragConts.length; i++){
				with(dragConts[i]){
					if((containerPosition[i].left < xPos) && (containerPosition[i].top < yPos) &&
						((containerPosition[i].left + containerPosition[i].width) > xPos) && ((containerPosition[i].top + containerPosition[i].height) > yPos)){
						activeCont = dragConts[i];
						activeCont.style.border = 'dashed 2px ' + bColorHover;
						dragMap.style.width = '100%';
						dragMap.style.display = 'block';
						contNum = i;
						break;
					}else{
						if(activeCont){ 
							activeCont.style.border = 'solid 2px ' + bColor;
							dragMap.style.display = 'none';
						}
						activeCont = null;
					}
				}
			}
			
			if(activeCont){ // Our target object is in one of our containers!
				var beforeNode = null;
				for(var i=activeCont.childNodes.length-1; i>=0; i--){
					with(activeCont.childNodes[i]){
						if(id!=dragMap.id){ // if the current item is "After" the item being dragged
							if(dragMap != activeCont.childNodes[i] &&
								((boxPosition[id].left + boxPosition[id].width) > xPos) && 
								((boxPosition[id].top + boxPosition[id].height) > yPos)){ 
									beforeNode = activeCont.childNodes[i];
							}
						}
					}
				}
				if(beforeNode){
					if(beforeNode!=dragMap.nextSibling){
						if(dragMap.parentNode!=activeCont){
							rootParent.removeChild(dragMap); // remove dragMap
						}else{
							activeCont.removeChild(dragMap); // remove dragMap
						}
						activeCont.insertBefore(dragMap, beforeNode); // reinsert dragMap
					}
					
				}else{
					if((dragMap.nextSibling) || (dragMap.parentNode!=activeCont)){
						if(clearObjs[contNum]){
							//activeCont.insertBefore(dragMap, clearObjs[contNum]);
						}else{
							activeCont.appendChild(dragMap);
						}
					}
				}
			}
		} // end IF dragableObject
		return false;
	};

	this.mouseUp = function(){
		if(rootParent){			
			for(var i=0; i<rootParent.childNodes.length; i++){
				if(rootParent.childNodes[i]==dragMap){
					this.addPosition = i;
					break;
				}
			}
			
			//rootParent.insertBefore(dragObject, dragMap); // insert dragObject
			rootParent.removeChild(dragMap); // remove dragMap

			dragHelper.style.display = 'none';
			
			dragableObject = null;
			dragMap = null;
			rootParent = null;
			
			if(activeCont){
				activeCont.style.border = 'solid 2px #FF7800';
				this.activeContainer = activeCont.id;
				this.addItem = dragObject.id;
				this.ajaxCall(this.activeContainer, this.addItem, this.addPosition);
			}
			
			dragObject = null;
			activeCont = null;
			this.activeContainer = null;
		}
		return false;
	};

	function mouseDown(item, e){
		e = event(e);
		dragObject = item;

		// save container position
		mouseOffset = getMouseOffset(dragObject,e);
		var originalXY = getPosition(dragObject);
		origanPosition = {top:originalXY.y, left:originalXY.x, height:dragObject.offsetHeight, width:dragObject.offsetWidth };

		// init dragHelper
		for(var i=0; i<dragHelper.childNodes.length; i++) dragHelper.removeChild(dragHelper.childNodes[i]);
		dragHelper.appendChild(dragObject.cloneNode(true));
		dragHelper.style.display = 'block';		
		dragHelper.style.opacity = 0.50;
		dragHelper.style.filter = 'alpha(opacity=50)';
		dragHelper.style.zIndex = '101';		
		dragHelper.style.top  = mouseXY.y - mouseOffset.y - addCont.scrollTop + 'px';
		dragHelper.style.left = mouseXY.x - mouseOffset.x - addCont.scrollLeft + 'px';
		
		// init dragMap
		dragMap = document.createElement('div');
		dragMap.id = mapID;
		dragObject.parentNode.insertBefore(dragMap, dragObject);
		dragMap.style.height = 1 + 'px';
		dragMap.style.width = (dragObject.offsetWidth - 2) + 'px';
		dragMap.style.display = 'none';
		
		dragableObject = dragHelper;
		rootParent = dragMap.parentNode;
		
		dragObject.parentNode.removeChild(dragObject); // remove dragObject
		rootParent.insertBefore(dragObject, dragMap); // insert dragObject
		
		return false;
	}
	
	function getMouseOffset(target, e){
		e = event(e);
		var targPos =  getPosition(target);
		var mousePos = getMouseCoords(e);
		return {x:mousePos.x - targPos.x, y:mousePos.y - targPos.y};
	}
	
	function getMouseCoords(e){
		e = event(e);

		sL = (document.body.scrollLeft) ? document.body.scrollLeft : 0 ;
		sT = (document.body.scrollTop) ? document.body.scrollTop : 0 ;
		cL = (document.body.clientLeft) ? document.body.clientLeft : 0 ;
		cT = (document.body.clientTop) ? document.body.clientTop : 0 ;

		var mouseX = e.clientX + sL - cL;
		var mouseY = e.clientY + sT - cT;
		return {x:mouseX, y:mouseY};
	}

	function getPosition(target){
		var left = 0;
		var top  = 0;
		while (target.offsetParent){
			left += target.offsetLeft + (target.currentStyle ? (parseInt(target.currentStyle.borderLeftWidth)).NaN0() : 0);
			top += target.offsetTop + (target.currentStyle ? (parseInt(target.currentStyle.borderTopWidth)).NaN0() : 0);
			target = target.offsetParent;
		}

		left += target.offsetLeft + (target.currentStyle ? (parseInt(target.currentStyle.borderLeftWidth)).NaN0() : 0);
		top += target.offsetTop + (target.currentStyle ? (parseInt(target.currentStyle.borderTopWidth)).NaN0() : 0);

		return {x:left, y:top};
	}

	function event(e){
		if (typeof e == 'undefined') e = window.event;
		return e;
	}

	function info(target,mode,text){
		if(mode){
			document.getElementById('inp'+target).value += text;
		}else{
			document.getElementById('inp'+target).value = text;
		}
	}
}
