/***********************************************************
 *  bt_drag.js
 *----------------------------------------------------------
 *   Készítette        : 2008 Csete Roland, Copyright (C)
 *   E-mail            : csete@fps.hu
 ***********************************************************/

 function bt_Drag(){
	var Drag,o;
	var Coords = {mouse:null, mouseOffset:null, original:null};
	var Obj = {root:null, originalParent:null, rootParent:null, rootSibling:null, originalNum:null, rootNum:null, containerNum:null, dragHelper:null, dragMap:null};
	var Tmp = {root:null, originalParent:null, rootParent:null};
	var dragableObject = null;
	var activeCont = null;

	this.ajaxCall = new Function();
	this.Add = {container:null, item:null, position:0};

	this.init = function(set){
		Drag = set;
		o = this;
		Number.prototype.NaN0 = function(){ return isNaN(this) ? 0 : this; }
		Obj.dragHelper = document.createElement('div');
		Obj.dragHelper.style.cssText = 'position:absolute; display:none;';
		document.body.appendChild(Obj.dragHelper);
		if(typeof Drag.horizontalMove == 'undefined') Drag.horizontalMove = true;
		if(typeof Drag.verticalMove == 'undefined') Drag.verticalMove = true;
		if(typeof Drag.clear == 'undefined') Drag.clear = new Array();
	};

	this.start = function(){
		for(var i=0; i<Drag.containers.length; i++){
			for(var j=0; j<Drag.containers[i].childNodes.length; j++){ // Remove firefox #text nodes
				if(Drag.containers[i].childNodes[j].nodeName=='#text'){
					Drag.containers[i].removeChild(Drag.containers[i].childNodes[j]);
				}
			}
		} // end FOR i;

		if(!Drag.addContainer){
			for(var i=0; i<Drag.containers.length; i++){
				for(var j=0; j<Drag.containers[i].childNodes.length; j++){
				var root = Drag.containers[i].childNodes[j];
					for(var n=0; n<root.childNodes.length; n++){
						var handle = root.childNodes[n];
						if(handle.className == Drag.handle){
							handle.onmousedown = function(e){
								o.mouseDown(this.parentNode, e);
							}
						}
					}
				}
			} // end FOR i;
		}else if(Drag.addContainer){
			for(var i=0; i<Drag.addContainer.childNodes.length; i++){
				var root = Drag.addContainer.childNodes[i];
				for(var j=0; j<root.childNodes.length; j++){
					var handle = root.childNodes[j];
					if(handle.className == Drag.handle){
						handle.onmousedown = function(e){
							o.mouseDown(this.parentNode, e);
						}
					}
				}
			} // end FOR i;
		}
	};

	this.returnMovedElements = function(){
		if(Tmp.root && Tmp.originalParent && Tmp.rootParent){
			return {id:Tmp.root.id, oldposition:Obj.originalNum, newposition:Obj.rootNum, oldcontainer:Tmp.originalParent.id, newcontainer:Tmp.rootParent.id};
		}else{
			return false;
		}
	};

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

		if(dragableObject){
			var containerPosition = [];
			var boxPosition = [];

			Obj.rootParent = Obj.dragMap.parentNode;
			if(!Drag.addContainer) Obj.rootSibling = Obj.dragMap.nextSibling;

			for(var i=0; i<Drag.containers.length; i++){
				with(Drag.containers[i]){
					var pos = getPosition(Drag.containers[i]);
					var containerP = { top:pos.y, left:pos.x, height:offsetHeight, width:offsetWidth };
					containerPosition[i] = containerP;
				}

				for(var j=0; j<Drag.containers[i].childNodes.length; j++){
					with(Drag.containers[i]){
						if(childNodes[j]==Obj.dragMap) continue;
						var pos = getPosition(childNodes[j]);
						var boxP = { top:pos.y, left:pos.x, height:childNodes[j].offsetHeight, width:childNodes[j].offsetWidth };
						boxPosition[childNodes[j].id] = boxP;
					}
				}
			}

			var addScrollTop = 0;
			var addScrollLeft = 0;
			if(Drag.addContainer){
				addScrollTop = Drag.addContainer.scrollTop;
				addScrollLeft = Drag.addContainer.scrollLeft;
			}

			if(Drag.verticalMove) dragableObject.style.top  = Coords.mouse.y - Coords.mouseOffset.y - addScrollTop + 'px';
			if(Drag.horizontalMove) dragableObject.style.left = Coords.mouse.x - Coords.mouseOffset.x - addScrollLeft + 'px';

			var xPos = Coords.mouse.x - Coords.mouseOffset.x + (Coords.original.width/2) - addScrollLeft;
			var yPos = Coords.mouse.y - Coords.mouseOffset.y + (Coords.original.height/2) - addScrollTop;

			if(!Drag.addContainer){
				for(var i=0; i<Drag.containers.length; i++){
					with(containerPosition[i]){
						if((left < xPos) && (top < yPos) &&
							((left + width) > xPos) && ((top + height) > yPos)){
							activeCont = Drag.containers[i];
							Obj.containerNum = i;
							break;
						}
					}
				}
			}else if(Drag.addContainer){
				for(var i=0; i<Drag.containers.length; i++){
					with(containerPosition[i]){
						if((left < xPos) && (top < yPos) &&
							((left + width) > xPos) && ((top + height) > yPos)){
							activeCont = Drag.containers[i];
							if(Drag.containerBorderHover) activeCont.style.border = Drag.containerBorderHover;
							Obj.dragMap.style.width = '100%';
							Obj.dragMap.style.display = 'block';
							Obj.containerNum = i;
							break;
						}else{
							if(activeCont){
								if(Drag.containerBorder) activeCont.style.border = Drag.containerBorder;
								Obj.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 != Obj.dragMap.id){ // if the current item is "After" the item being dragged
							if(Obj.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 != Obj.dragMap.nextSibling){
						if(Obj.dragMap.parentNode != activeCont){
							Obj.rootParent.removeChild(Obj.dragMap); // remove dragMap
						}else{
							activeCont.removeChild(Obj.dragMap); // remove dragMap
						}
						activeCont.insertBefore(Obj.dragMap, beforeNode); // reinsert dragMap
					}
				}else{
					if((Obj.dragMap.nextSibling) || (Obj.dragMap.parentNode!=activeCont)){
						if(Drag.clear[Obj.containerNum]){
							activeCont.insertBefore(Obj.dragMap, Drag.clear[Obj.containerNum]);
						}else{
							activeCont.appendChild(Obj.dragMap);
						}
					}
				}
			}
		} // end IF dragableObject
		return false;
	};

	this.mouseUp = function(){
		if(Obj.rootParent){
			if(!Drag.addContainer){
				if(Obj.rootSibling){
					Obj.rootParent.insertBefore(Obj.root, Obj.dragMap); // insert root
					Obj.rootParent.removeChild(Obj.dragMap); // remove dragMap
				}else{
					Obj.rootParent.removeChild(Obj.dragMap); // remove dragMap
					Obj.rootParent.appendChild(Obj.root); // insert root
				}
			}

			for(var i=0; i<Obj.rootParent.childNodes.length; i++){
				if(!Drag.addContainer && Obj.rootParent.childNodes[i] == Obj.root){
					Obj.rootNum = i;
					break;
				}else if(Drag.addContainer && Obj.rootParent.childNodes[i] == Obj.dragMap){
					o.Add.position = i;
					break;
				}
			}
			if(!Drag.addContainer){
				Tmp.root = Obj.root;
				Tmp.originalParent = Obj.originalParent;
				Tmp.rootParent = Obj.rootParent;

				Obj.dragHelper.style.display = 'none';
				Obj.root = null;
				dragableObject = null;
				Obj.dragMap = null;
				Obj.originalParent = null;
				Obj.rootParent = null;
				Obj.rootSibling = null;

				if((Tmp.originalParent != Tmp.rootParent) || (Obj.originalNum != Obj.rootNum)){
					o.ajaxCall();
				}

				Obj.originalNum = null;
				Obj.rootNum = null;
				Obj.containerNum = null;
			}else{
				Obj.rootParent.removeChild(Obj.dragMap); // remove dragMap

				Obj.dragHelper.style.display = 'none';
				dragableObject = null;
				Obj.dragMap = null;
				Obj.rootParent = null;

				if(activeCont){
					if(Drag.containerBorder) activeCont.style.border = Drag.containerBorder;
					o.Add.container = activeCont.id;
					o.Add.item = Obj.root.id;
					o.ajaxCall(o.Add.container, o.Add.item, o.Add.position);
				}

				Obj.root = null;
				activeCont = null;
			}
		}
	};

	this.mouseDown = function(root, e){
		e = event(e);
		Obj.root = root;
		Coords.mouse = getMouseCoords(e);

		if(!Drag.addContainer){
			Obj.originalParent = Obj.root.parentNode;
			for(var i=0; i<Obj.originalParent.childNodes.length; i++){
				if(Obj.originalParent.childNodes[i] == Obj.root){
					Obj.originalNum = i;
					break;
				}
			}
		}

		// save root position
		Coords.mouseOffset = getMouseOffset(Obj.root,e);
		var origXY = getPosition(Obj.root);
		Coords.original = {top:origXY.y, left:origXY.x, height:Obj.root.offsetHeight, width:Obj.root.offsetWidth};

		// init dragHelper
		for(var i=0; i<Obj.dragHelper.childNodes.length; i++) Obj.dragHelper.removeChild(Obj.dragHelper.childNodes[i]);
		Obj.dragHelper.appendChild(Obj.root.cloneNode(true));
		Obj.dragHelper.style.display = 'block';
		Obj.dragHelper.style.opacity = 0.50;
		Obj.dragHelper.style.filter = 'alpha(opacity=50)';
		Obj.dragHelper.style.zIndex = '101';
		if(!Drag.addContainer){
			Obj.dragHelper.style.top  = Coords.mouse.y - Coords.mouseOffset.y + 'px';
			Obj.dragHelper.style.left = Coords.mouse.x - Coords.mouseOffset.x + 'px';
		}else{
			Obj.dragHelper.style.top  = Coords.mouse.y - Coords.mouseOffset.y - Drag.addContainer.scrollTop + 'px';
			Obj.dragHelper.style.left = Coords.mouse.x - Coords.mouseOffset.x - Drag.addContainer.scrollLeft + 'px';
		}

		// init dragMap
		Obj.dragMap = document.createElement('div');
		Obj.dragMap.id = Drag.map;
		Obj.root.parentNode.insertBefore(Obj.dragMap, Obj.root);
		Obj.dragMap.style.width = (Obj.root.offsetWidth - ((Drag.mapBorderWidth) ? (Drag.mapBorderWidth*2) : 0 )) + 'px';
		if(!Drag.addContainer){
			Obj.dragMap.style.height = (Obj.root.offsetHeight - ((Drag.mapBorderWidth) ? (Drag.mapBorderWidth*2) : 0 )) + 'px';
		}else{
			Obj.dragMap.style.display = 'none';
		}

		dragableObject = Obj.dragHelper;
		Obj.rootParent = Obj.dragMap.parentNode;
		if(!Drag.addContainer) Obj.rootSibling = Obj.dragMap.nextSibling;

		Obj.root.parentNode.removeChild(Obj.root); // remove Obj.root
		if(Drag.addContainer) Obj.rootParent.insertBefore(Obj.root, Obj.dragMap); // insert Obj.root when selected text bug

		document.onmousemove = o.mouseMove;
		document.onmouseup = o.mouseUp;

		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);

		var sL = (document.body.scrollLeft) ? document.body.scrollLeft : 0 ;
		var sT = (document.body.scrollTop) ? document.body.scrollTop : 0 ;
		var cL = (document.body.clientLeft) ? document.body.clientLeft : 0 ;
		var 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;
		do{
			left += target.offsetLeft + (target.currentStyle ? (parseInt(target.currentStyle.borderLeftWidth)).NaN0() : 0);
			top += target.offsetTop + (target.currentStyle ? (parseInt(target.currentStyle.borderTopWidth)).NaN0() : 0);
		}while(target = target.offsetParent);
		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;
	};
}