doDebug = true;

debug = function(s) {
	if(doDebug && typeof console != 'undefined') {
		console.log(s);
	}
}

menu = function(elm,direction,maxLevels) {
	var i, arrMenuItems, menuItem;
	this.c = this;
	this.c.direction = direction;
	this.c.maxLevels = maxLevels;
	this.c.draggedItem = null;
	this.c.elmOffsetX = 0;
	this.c.elmOffsetY = 0;
	
	if(typeof elm == 'string') {
		elm = $(elm);
	}
	if(elm) {
		this.c.navContainer = elm;
		this.c.name = elm.id;
		if(typeof arrMenus == 'undefined') arrMenus = [];
		arrMenus.push(this.c.name);
		arrMenuItems = elm.getElementsByTagName('A');
		for(i=0;i<arrMenuItems.length;i++) {
			menuItem = arrMenuItems[i];
			menuItem.c = this;
			menuItem.onmousedown = this.c.initDrag;
		}
	}
	
	if(!$('ddContainer')) {
		this.c.ddOuterContainer = document.createElement('DIV');
		this.c.ddOuterContainer.id = 'ddOuterContainer';
		this.c.ddContainer = document.createElement('UL');
		this.c.ddContainer.id = 'ddContainer';
		this.c.ddOuterContainer.appendChild(this.c.ddContainer)
		document.body.appendChild(this.c.ddOuterContainer);
	} else {
		this.c.ddContainer = $('ddContainer');
	}
}

menu.prototype.initDrag = function(e) {
	this.c.sourceItem = this.parentNode.parentNode;

	if(!e) e = window.event;
	
	this.c.clientX = e.clientX;
	this.c.clientY = e.clientY;
	this.c.elmOffsetX = (e.clientX+document.documentElement.scrollLeft)-getElementPosX(this.c.sourceItem);
	this.c.elmOffsetY = (e.clientY+document.documentElement.scrollTop)-getElementPosY(this.c.sourceItem);

	document.c = this.c;
	window.c = this.c;

	document.onmouseup = this.c.onDragEnd;
	this.c.intDrag = setTimeout("this.c.onDragStart()",140);
	return false;
}

menu.prototype.onDragStart = function() {
	var i;
	
	this.c.draggedItem = this.c.sourceItem.cloneNode(true);
	this.c.draggedItem.id = '';
	this.c.draggedItem.c = this.c;
	
	// alle Links unschädlich machen
	var a = this.c.draggedItem.getElementsByTagName('A');
	for(i=0;i<a.length;i++) {
		a[i].href = 'javascript:;';
	}
	
	document.onmousemove = this.c.drag;
	
	this.c.draggedItem.style.width = this.c.sourceItem.offsetWidth+'px';
	this.c.draggedItem.style.position = 'absolute';
	if(typeof document.body.style.filter != 'undefined') {
		this.c.draggedItem.style.filter = 'alpha(opacity=60)';
	} else {
		this.c.draggedItem.style.opacity = 0.6;
	}
	
	var oc = $(this.c.name).parentNode.className;
	$('ddOuterContainer').className = oc;
	
	$('ddContainer').appendChild(this.c.draggedItem);
	$('ddContainer').className = this.c.sourceItem.parentNode.className;
	$('ddContainer').style.position = 'absolute';
	$('ddContainer').style.left = '0px';
	$('ddContainer').style.top = '0px';
	$('ddContainer').style.marginLeft = '0px';
	$('ddContainer').style.marginTop = '0px';
	$('ddContainer').style.zIndex = 50000;
	
	this.c.sourceItem.style.backgroundColor = '#FFFFFF';
	this.c.sourceItem.getElementsByTagName('DIV')[0].style.border = '2px solid #F00';
	for(var i=0;i<this.c.sourceItem.getElementsByTagName('A').length;i++) {
		this.c.sourceItem.getElementsByTagName('A')[i].style.visibility = 'hidden';
	}
	
	// Erste Position setzen (vor allem wenn kein mousemove)
	this.c.posX = (this.c.clientX+document.documentElement.scrollLeft) - this.c.elmOffsetX;
	this.c.posY = (this.c.clientY+document.documentElement.scrollTop) - this.c.elmOffsetY;
	this.c.draggedItem.style.left = this.c.posX + "px";
	this.c.draggedItem.style.top = this.c.posY + "px";

	return false;
}

menu.prototype.getMouseXY = function(ev) {
	var pos = {};

	if(typeof ev.pageX != 'undefined'){
		pos.x = ev.pageX;	
		pos.y = ev.pageY;
	} else if(window.event && window.event.clientX) {
		var isStrictMode = document.compatMode && document.compatMode != 'BackCompat' ? true : false;
		var scrollX = isStrictMode ? document.documentElement.scrollLeft : document.body.scrollLeft;
		var scrollY	= isStrictMode ? document.documentElement.scrollTop : document.body.scrollTop;
		pos.x = window.event.clientX + scrollX;
		pos.y = window.event.clientY + scrollY;
	}
	return pos;
}


menu.prototype.drag = function(e) {
	if(!e) e = window.event;
	var pos = this.c.getMouseXY(e);
	this.c.posX = pos.x - this.c.elmOffsetX;
	this.c.posY = pos.y - this.c.elmOffsetY;
	
	if(this.c.draggedItem != null) {
		this.c.draggedItem.style.left = this.c.posX + "px";
		this.c.draggedItem.style.top = this.c.posY + "px";
	}
	
	this.c.whileDragging();
	
	// Focus resetten und Selection verhindern
	document.body.focus();
	document.onselectstart = function () {
		return false;
	}
	
	return false;
}

menu.prototype.onDragEnd = function(e) {
	if(!e) e = window.event;
	var i;
	clearTimeout(this.c.intDrag);
	if(this.c.draggedItem) {
		$('ddContainer').removeChild(this.c.draggedItem);
		var pos = this.c.getMouseXY(e);
		var dropElm = document.elementFromPoint(pos.x,pos.y);
		
		if(dropElm.id == 'papierkorb') {
			var vId = this.c.sourceItem.id.split('_')[2];
			this.c.sourceItem.parentNode.removeChild(this.c.sourceItem);
			new Ajax.Request('/admin/rpc/menu.php',{
				method: 'get',
				parameters : {action:'del',id:vId},
				onSuccess : function() {
					document.location.href = '/admin/?admin=funktionen/papierkorb/papierkorb.php';
				},
				onFailure : function() {
					alert('Beim löschen ist ein Fehler aufgetreten.');
					document.location.refresh();
				}
			});
		} else {
			this.c.sourceItem.style.backgroundColor = '';
			this.c.sourceItem.getElementsByTagName('DIV')[0].style.border = '0px';
			this.c.sourceItem.getElementsByTagName('DIV')[0].style.marginLeft = '0px';
			var oldId = this.c.sourceItem.id.split('_');
			this.c.sourceItem.id = 'navItem_'+this.c.sourceItem.parentNode.id.split('_')[1]+'_'+oldId[2];
			for(i=0;i<this.c.sourceItem.getElementsByTagName('A').length;i++) {
				this.c.sourceItem.getElementsByTagName('A')[i].style.visibility = 'visible';
			}
			// Sub-Levels nachführen
			var vSubLevels = this.c.sourceItem.getElementsByTagName('UL');
			var vCurrentId = this.c.sourceItem.parentNode.id.split('_');
			var vCurrentNaviName = vCurrentId[1];
			var vCurrentLevel = vCurrentId[2];
			var vSubLevelId;
			for(i=0;i<vSubLevels.length;i++) {
				vCurrentLevel++;
				vSubLevelId = vSubLevels[i].id.split('_');
				vSubLevels[i].id = vSubLevelId[0]+'_'+vCurrentNaviName+'_'+vCurrentLevel+'_'+vSubLevelId[3];
				vSubLevels[i].className = vSubLevels[i].className.replace(/navLevel[0-9]+/,'navLevel'+vCurrentLevel);
			}
			var vSubEntries = this.c.sourceItem.getElementsByTagName('LI');
			var vSubEntryId;
			for(i=0;i<vSubEntries.length;i++) {
				vSubEntryId =  vSubEntries[i].id.split('_');
				vSubEntries[i].id = vSubEntryId[0]+'_'+vCurrentNaviName+'_'+vSubEntryId[2];
			}
			
			// Sortierung speichern
			this.c.updateSort();
		}
	}
	document.c = null;
	document.onmousemove = null;
	document.onmouseup = null;
	document.onselectstart = null;
}

menu.prototype.updateSort = function() {
	var menuUL,vUL;
	var menuSort = [];
	for(var i=0;i<arrMenus.length;i++) {
		menuUL = document.getElementById(arrMenus[i]).getElementsByTagName('UL')[0];
		if(menuUL) {
			menuSort[arrMenus[i]] = this.c.getMenuItemsByLevel(menuUL);
		}
	}
	
	new Ajax.Request('/admin/rpc/menu.php',{
		method : 'post',
		parameters : {action:'updateSort',menus:serialize(menuSort)}
	});
}

menu.prototype.getMenuItemsByLevel = function(p) {
	var vLI = [];
	var vUL,vNode;
	var vSub;
	for(var i=0;i<p.childNodes.length;i++) {
		vNode = p.childNodes[i];
		vSub = [];
		if(vNode.tagName && vNode.tagName == 'LI') {
			vUL = vNode.getElementsByTagName('UL');
			if(vUL.length > 0) {
				vSub = this.c.getMenuItemsByLevel(vUL[0]);
			}
			vLI.push([vNode.id.split('_')[2],vSub]);
		}
	}
	return vLI;
}

menu.prototype.whileDragging = function() {
	var isBottom = false;
	
	// Element abfragen (anhand der linken oberen Ecke des DragElements)
	var targetElm = this.c.getTargetElm(this.c.posX-1,this.c.posY);

	if(!targetElm) {
		// Element abfragen (anhand der rechten oberen Ecke des DragElements)
		targetElm = this.c.getTargetElm(this.c.posX+this.c.draggedItem.firstChild.offsetWidth+1,this.c.posY);
	}
	if(!targetElm) {
		// Element abfragen (anhand der linken unteren Ecke des DragElements)
		targetElm = this.c.getTargetElm(this.c.posX-1,this.c.posY+this.c.draggedItem.firstChild.offsetHeight+1);
		isBottom = true;
	}
	if(!targetElm) {
		// Element abfragen (anhand der rechten unteren Ecke des DragElements)
		targetElm = this.c.getTargetElm(this.c.posX+this.c.draggedItem.firstChild.offsetWidth+1,this.c.posY+this.c.draggedItem.firstChild.offsetHeight+1);
		isBottom = true;
	}
	
	this.c.targetHitBottom = isBottom;
	this.c.targetElm = targetElm;
	if(targetElm) {
		this.c.sourceItemParentNode = this.c.sourceItem.parentNode;
		this.c.tempPlaceSourceItem();
		this.c.cleanSourceItemParentNode();
	}
}

menu.prototype.tempPlaceSourceItem = function() {
	var i;
	var targetElm = this.c.targetElm;
	var isBottom = this.c.targetHitBottom;
	var offsetDragItem = this.c.posX - getElementPosX(this.c.navContainer);
	var targetElmLevel = targetElm.parentNode.id.split('_')[2];
	var levelInsetOffset = 4;
	var levelInset = 10;
	var newLevel = 0;
	
	if(this.c.sourceItemParentNode.className.indexOf('navLevel1') > -1 && this.c.sourceItemParentNode.childNodes.length == 2) {
		var navName = this.c.sourceItemParentNode.id.split('_')[1];
		$('navItemPlaceholder'+navName).style.display = '';
	}
	
	if(!this.c.targetHitBottom) {
		var whichLevel = Math.floor((offsetDragItem+levelInsetOffset)/levelInset);
		if(whichLevel > targetElmLevel+1) whichLevel = targetElmLevel+1;
		if(whichLevel < 1) whichLevel = 1;
		if(whichLevel > this.c.maxLevels) whichLevel = this.c.maxLevels;
		
		if(targetElm.id.indexOf('navItemPlaceholder') > -1) whichLevel = 1;
		
		if(whichLevel <= targetElmLevel) {
			parentNode = targetElm.parentNode;
			nextSiblingNode = targetElm.nextSibling;
			for(i=whichLevel;i<targetElmLevel;i++) {
				nextSiblingNode = parentNode.parentNode.parentNode.nextSibling;
				parentNode = parentNode.parentNode.parentNode.parentNode;
			}
			newLevel = whichLevel;
		} else if(targetElm.id.indexOf('navItemPlaceholder') < 0) {
			if(targetElm.getElementsByTagName('UL').length == 0) {
				ul = document.createElement('UL');
				ul.id = 'navLevelContainer_'+this.c.name+'_'+(parseInt(targetElmLevel)+1)+'_'+targetElm.id.split('_')[2];
				ul.className = 'navLevelContainer navLevel'+(parseInt(targetElmLevel)+1);
				targetElm.getElementsByTagName('DIV')[0].appendChild(ul);
				
				parentNode = ul;
				nextSiblingNode = null;
			} else {
				parentNode = targetElm.getElementsByTagName('UL')[0];
				nextSiblingNode = parentNode.firstChild;
			}
			newLevel = parentNode.id.split('_')[2];
		}
		if(parentNode) {
			parentNode.insertBefore(this.c.sourceItem,nextSiblingNode);
			if(parseInt(newLevel) < 1) newLevel = 1;
			this.c.sourceItem.getElementsByTagName('DIV')[0].style.marginLeft = (((parseInt(newLevel)-1)*10))+(newLevel > 1 ? levelInsetOffset : 0)+'px';
		}
	} else if(targetElm.parentNode.className.indexOf('navLevel1') > -1) {
		targetElm.parentNode.insertBefore(this.c.sourceItem,targetElm);
		this.c.sourceItem.getElementsByTagName('DIV')[0].style.marginLeft = '0px';
	}
	
	if(this.c.sourceItem.parentNode.className.indexOf('navLevel1') > -1 && this.c.sourceItem.parentNode.childNodes.length > 1) {
		var navName = this.c.sourceItem.parentNode.id.split('_')[1];
		$('navItemPlaceholder'+navName).style.display = 'none';
	}
}

menu.prototype.cleanSourceItemParentNode = function() {
	var sourceParent = this.c.sourceItemParentNode;
	
	if(sourceParent && sourceParent.tagName == 'UL' && sourceParent.getElementsByTagName('LI').length == 0) {
		sourceParent.parentNode.removeChild(sourceParent);
	}
}

menu.prototype.getTargetElm = function(x,y) {
	var retElm = null;
	
	x -= document.documentElement ? document.documentElement.scrollLeft : document.body.scrollLeft;
	y -= document.documentElement ? document.documentElement.scrollTop : document.body.scrollTop;
	
	var targetElm = document.elementFromPoint(x,y);
	
	if(targetElm) {
				
		if(targetElm.parentNode && targetElm.parentNode.tagName == 'A') {
			targetElm = targetElm.parentNode;
		}
		
		if(targetElm.parentNode && targetElm.parentNode.tagName == 'DIV' && targetElm.parentNode.className.indexOf('divNavSubContainer') > -1) {
			targetElm = targetElm.parentNode;
		}
		
		if(targetElm.parentNode && targetElm.parentNode.tagName == 'LI') {
			targetElm = targetElm.parentNode;
		}
		
		if(this.c.sourceItem == targetElm) {
			if(targetElm.previousSibling && targetElm.previousSibling.tagName == 'LI') {
				targetElm = targetElm.previousSibling;
				var vSubLi = targetElm.getElementsByTagName('LI');
				if(vSubLi.length > 0) {
					targetElm = vSubLi[vSubLi.length-1];
				}
			} else {
				targetElm = targetElm.parentNode.parentNode.parentNode;
			}
			retElm = targetElm;
		} else if(targetElm && targetElm.tagName == 'LI' && targetElm.id.indexOf('navItem') > -1 && !this.c.isInChildTree(this.c.sourceItem,targetElm)) {
			retElm = targetElm;
		}
	}
	if(retElm && retElm.tagName != 'LI') retElm = null;
	return retElm;
}

menu.prototype.isInChildTree = function(parent,child) {
	var cNode = child;
	while(cNode) {
		if(cNode == parent) return true;
		cNode = cNode.parentNode;
	}
	return false;
}
