/**
* <script>
*
* EasyGUI MenuTree Class
* This Class creates from the same source a tree or a menu
*
* Menu part inspired by Mark Hall's Article
* 'Revenge of the Menu Bar' on www.brainjar.com
*
* @author Gaetan Lauff <glauff@plansoft.de>
* @copyright Plan Software GmbH, 2002 - 2004
* @version	2.0
* @package 	Base
*
* This is not free software
*/
var activeButton = null;

function MenuTree(id) {
	this.id 	= id;
	this.type 	= 'easygui-menutree';
	this.el 	= document.getElementById(id);
	this.items 	= this.el.getElementsByTagName('DIV');
	
	this.el.style.display 	= 'block';
	this.el.state 			= 'opened';
	this.el.submitfield 	= id;

	this.styleDefinitions = getStyleDefinitions( this.el );
	
	this.target = getElementAttributeValue(this.el, 'target', '_self');
	this.selected = getElementAttributeValue(this.el, 'selected', '');
	this.modus = getElementAttributeValue(this.el, 'modus', 'tree');

	this.el.oTree 	= this;
	
	/**
	 * Methods
	 */
	this.getTreeStyleDefinition = function(level, childNodes, treeitem) {
		var customstyle = treeitem.getAttribute( 'customstyle' );
		
		if ( customstyle != "" ) return customstyle;
		
		if (this.styleDefinitions['leaf'] != null && childNodes == '0') {
			level = 'leaf';
		}
			
		if (typeof(level) == 'number') {
			while (this.styleDefinitions[level] == null && level > 0) {
				level--;
			}
			
			if (this.styleDefinitions[level] == null) {
				level = 'default';
			}
		}
		
		return this.styleDefinitions[level]
	};
	
	this.openTreeItem = function(item) {
		var cNodes = item.childNodes;
		
		for (var i=0; i < cNodes.length; i++) {
			if (cNodes[i].nodeName == 'DIV') {
				cNodes[i].style.display = 'block';
			}
		}
	};
	
	this.closeTreeItem = function(item) {
		var cNodes = item.childNodes;
		
		for (var i=0; i < cNodes.length; i++) {
			if (cNodes[i].nodeName == 'DIV') {
				cNodes[i].style.display = 'none';
			}
		}
	};
	
	this.setTreeStyle = function(item, state) {
		styleClass = item.firstChild.className.split(' ');
		item.firstChild.className = styleClass[0] + ' ' + styleClass[0] + '-' + state;
	};

	this.resetTree = function() {
		for (var i=0; i < this.items.length; i++) {
			this.items[i].state = 'closed';
			this.closeTreeItem(this.items[i]);
		}
	};

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	this.getMenuStyleDefinition = function( def ) {
		if (this.styleDefinitions[ def ] == null) 
			return 'easygui-menutree-' + def;
			
		return this.styleDefinitions[def]
	};
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	this.initTree = function() {
		this.init();
	};
	
	this.init();	
}

MenuTree.prototype.init = function() {
	if (this.modus == 'tree') {
		this.resetTree();
		this.openTreeItem(this.el);
		
		for (var i=0; i < this.items.length; i++) {
			var treeitem	= this.items[i].firstChild;
			var depth 		= getItemDepth(treeitem);
			var cn			= this.items[i].getElementsByTagName('DIV');
			var styleDef 	= this.getTreeStyleDefinition(depth, cn.length, treeitem);
		
			var paddingLeft = parseInt(getCSSRuleAttribute(styleDef, 'paddingLeft', 'custom'));
			
			if (!paddingLeft)
				paddingLeft = 0;
			
			var marginLeft = parseInt(getCSSRuleAttribute(styleDef, 'marginLeft', 'custom'));
	
			if (isNaN(marginLeft))
				marginLeft = 0;
			
			var bgPos = getCSSRuleAttribute(styleDef, 'backgroundPosition', 'custom');
			
			if (!bgPos)
				bgPos = "0 0";
			
			var bgPos = bgPos.split(' ');
			
			vPos = parseInt(bgPos[0]);
			hPos = parseInt(bgPos[1]);
			
			if (isNaN(hPos))
				hPos = bgPos[1];
			else
				hPos += 'px';
			
			if (isNaN(vPos)) {
				vPos = bgPos[0];
			} else {
				vPos = (((depth * paddingLeft) - (depth * marginLeft)) + vPos)
				vPos += 'px';
			}
			
			this.items[i].style.marginLeft = marginLeft;
			
			this.items[i].firstChild.className = styleDef + ' ' + styleDef + '-closed';
			this.items[i].firstChild.onclick = function() { focusItem(this); navigate(this); return false;};
			this.items[i].firstChild.style.marginLeft = '0px';
			
			this.items[i].firstChild.style.paddingLeft = (((depth * paddingLeft) - (depth * marginLeft)) + paddingLeft) + 'px';
			this.items[i].firstChild.style.backgroundPosition =  vPos + ' ' + hPos;
		}
		
		createNewHiddenFormField(this.id, this.selected);
		
		if (this.selected != '') {
			focusItem(this.selected);
		}
	} else {
		zIndex = 10000;
		this.activateOnMouseover 	= getElementAttributeValue(this.el, 'activateonmouseover', false);
		this.orientation 			= getElementAttributeValue(this.el, 'orientation', 'horizontal');
		this.defaulticon 			= getElementAttributeValue(this.el, 'defaulticon');
		
		this.menubar = this.buildMenubar();
		document.body.appendChild(this.menubar);
	}
}
		
MenuTree.prototype.buildMenubar = function () {
	var menubar = document.createElement( 'DIV' );
		
	menubar.className 	= this.getMenuStyleDefinition('menubar');
		
	menubar.style.left 	= this.el.style.left;
	menubar.style.top 	= this.el.style.top;
	menubar.style.width = this.el.style.width;
	menubar.menuTree	= this;
	
	for (var i=0; i < this.items.length; i++) {
		var menubutton = this.items[i].firstChild;
		var depth 	= getItemDepth(this.items[i]);
		
		if (depth == 0) {
			menubutton.className = this.getMenuStyleDefinition('menubutton');
			menubutton.menuId = menubutton.id + '_MENU';
			menubutton.menuTree = this;
		
			if (this.orientation == 'horizontal') {
				menubutton.style.display = 'inline';
			} else {
				alert('vertical orientation not implented yet !');
				break;
			}

			addEvent(menubutton, 'click', openMenu, false);
			addEvent(menubutton, 'mouseover', menuButtonOver, false);
			
			menubar.appendChild( menubutton );
			this.buildMenu( this.items[i], true, menubutton.id );
		}
	}
	
	return menubar;
}

MenuTree.prototype.getIcon = function(menuitem) {
	var menuItemIcon = document.createElement('span');
	menuItemIcon.className = this.getMenuStyleDefinition('menuitem') + '-icon';
		
	var iconImg = document.createElement('img');	
	var icon = getElementAttributeValue(menuitem, 'icon', this.defaulticon);
		
	iconImg.src 			= icon;
	iconImg.border 			= 0;
	iconImg.style.position 	= 'relative';
	
	iconImg.style.width 	= '16px';
	iconImg.style.height 	= '16px';
	
	iconImg.height 	= 16;
	iconImg.width 	= 16;
	
	menuItemIcon.appendChild( iconImg );
	
	return menuItemIcon;
}

MenuTree.prototype.getSeparator = function( menuitem ) {
	var separator = document.createElement( 'DIV' );
	separator.className = this.getMenuStyleDefinition('menuitem') + '-separator';
	separator.style.position = 'relative';
	
	return separator;
}

MenuTree.prototype.buildMenu = function ( menuitem, isButton, parentId, parentMenu ) {
	if (!hasChildNodesByNodeName( menuitem, 'DIV' ))
		return;
	
	if (!isButton) {
		var parentMenuItem = menuitem.firstChild;
		
		var menuItemIcon = this.getIcon( menuitem );
		
		var menuId = parentMenuItem.id + '_MENU';				
		var menuItemText = document.createElement('span');
						
		menuItemText.className = this.getMenuStyleDefinition('menuitem') + '-text';
		menuItemText.menuId = menuId;
						
		var menuItemArrow = document.createElement('span');
					
		menuItemArrow.className = this.getMenuStyleDefinition('menuitem') + '-arrow';
		menuItemArrow.menuId = menuId;
						
		menuItemText.innerText = parentMenuItem.innerText;
		menuItemArrow.innerHTML = '<b>></b>';
		
		parentMenuItem.innerText = '';
		
		parentMenuItem.appendChild(menuItemIcon);
		parentMenuItem.appendChild(menuItemText);
		parentMenuItem.appendChild(menuItemArrow);

		parentMenuItem.menuId = menuId;
		
		addEvent(parentMenuItem, 'mouseover', menuItemOver, false);
		addEvent(parentMenu, 'mouseover', menuOver, false);
		
		parentMenuItem.onclick = function() { return false; }
	}

	var menu = document.createElement('DIV');
	
	menu.style.lineHeight = "2.5ex";
	menu.style.zIndex = zIndex++;
					
	menu.id = parentId + '_MENU';
					
	menu.className 	= this.getMenuStyleDefinition('menu');
	menu.menuTree 	= this;
	
	var cNodes  = getChildNodesByNodeName( menuitem, 'DIV' );
	
	for (var i=0; i < cNodes.length; i++) {
		if (cNodes[i].separator == 'true') {
			menu.appendChild(this.getSeparator());
			continue;
		}
		
		menuitem = cNodes[i].firstChild;
		
		this.buildMenu(cNodes[i], false, menuitem.id, menu);
		
		menuitem.className = this.getMenuStyleDefinition('menuitem');

		if (!hasChildNodesByNodeName(menuitem, 'SPAN') ) {
			var menuItemIcon = this.getIcon( cNodes[i] );
			var menuItemText = document.createElement('span');
			var menuItemLabel = document.createTextNode( menuitem.innerText );
			
			menuItemText.className = this.getMenuStyleDefinition('menuitem') + '-text';
					
			menuitem.innerHTML 		= '';
				
			menuItemText.appendChild( menuItemIcon );
			menuItemText.appendChild( menuItemLabel );
			
			menuitem.appendChild( menuItemText );
		}
		
		menuitem.onclick = function () { navigate( this ); };
		menu.appendChild( menuitem );
	}

	document.body.appendChild(menu);
	this.correctMenu(menu);
}

MenuTree.prototype.renderTree = function() {
	for (var i=0; i < this.items.length; i++) {
		var item = this.items[i];
		var state = item.state;
		
		this.setTreeStyle(item, state);

		switch (state) {
			case 'opened':
				this.openTreeItem(item);				
				break;
			case 'focused':
				this.openTreeItem(item);
				break;
			default:
				this.closeTreeItem(item);	
				break;
		}
	}
}

MenuTree.prototype.correctMenu = function ( menu ) {
	var itemList = menu.getElementsByTagName("A");
	
	if (itemList.length > 0)
		itemWidth = itemList[0].offsetWidth;
	else
		return;
	
	for (i = 0; i < itemList.length; i++) {
		spanList = itemList[i].getElementsByTagName("SPAN");
		
		textEl  = null;
		arrowEl = null;
		
		for (j = 0; j < spanList.length; j++) {
	  		if (hasClassName(spanList[j], this.getMenuStyleDefinition("menuitem") + "-text")) 
	  			textEl = spanList[j];
	  			
	  		if (hasClassName(spanList[j], this.getMenuStyleDefinition("menuitem") + "-arrow"))
	    		arrowEl = spanList[j];
		}
		
		if (textEl != null && arrowEl != null) {
	  		textEl.style.paddingRight = (itemWidth - ( textEl.offsetWidth  + arrowEl.offsetWidth)) + "px";
			
	  		if (browser.isOP)
	    		arrowEl.style.marginRight = "0px";
		}
	}
	
	if (browser.isIE) {
		w = itemList[0].offsetWidth;
		itemList[0].style.width = w + "px";
		
		dw = itemList[0].offsetWidth - w;
		w -= dw;
		itemList[0].style.width = w + "px";
		
		menu.iframeEl = menu.parentNode.insertBefore(document.createElement("IFRAME"), menu);
		menu.iframeEl.style.display = "none";
		menu.iframeEl.style.position = "absolute";
	}

	menu.isInitialized = true;
}

/** 
 * Eventhandler
 */
function focusItem(el) {
	if (typeof(el) == 'string') {
		el = getElement(el);
	}
	
	var id 	= el.id;
	var el = el.parentNode;
	var oTree = getTreeObject(el);

	oTree.resetTree();
	oTree.el.selected = id;
	el.state = 'focused';
	
	sourceElement = el;
	
	while(el.nextSibling && el.nextSibling.nodeType != 3) {
		el = el.nextSibling;
		el.state = 'focused-sibling';
	}
	
	el = sourceElement;
	
	while(el.previousSibling && el.previousSibling.nodeType != 3) {
		el = el.previousSibling;
		el.state = 'focused-sibling';
	}
	
	var parentItem = el.parentNode;
	
	while (parentItem.nodeType != 9 && parentItem.ctrltype != 'menutree') {
		if (parentItem.nodeName == 'DIV') {
			parentItem.state = 'opened';
			
			sourceElement = parentItem;
			
			while (parentItem.nextSibling && parentItem.nextSibling.nodeType != 3) {
				parentItem = parentItem.nextSibling
				parentItem.state = 'opened-sibling';
			}
			
			parentItem = sourceElement;
			
			while (parentItem.previousSibling && parentItem.previousSibling.nodeType != 3) {
				parentItem = parentItem.previousSibling;
				parentItem.state = 'opened-sibling';
			}
			
			parentItem = sourceElement;
		}
		
		parentItem = parentItem.parentNode;
	}
	
	oTree.renderTree();
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function openMenu(evt) {
	var button = getElement( evt );
  	button.blur();

  	if (button.menu == null)
    	button.menu = document.getElementById(button.menuId);

  	if (activeButton != null)
    	resetButton(activeButton);

  	if (button != activeButton) {
    	menuButtonOut( button );
    	activeButton = button;
  	}
 	else
    	activeButton = null;

  	return false;
}

function menuButtonOver(evt) {
	var button = getElement(evt);
	var menubar = getElementByTagName( button, 'DIV' );
	
	if (menubar.menuTree.activateOnMouseover) {
		if (activeButton == null) {
    		openMenu(evt);
    		return;
  		}
	}
  	
	if (activeButton != null && activeButton != button)
    	openMenu(evt);
}

function menuButtonOut(button) {
	var x, y;
	var menubar = getElementByTagName( button, 'DIV' );
	
	button.className += ' ' + menubar.menuTree.getMenuStyleDefinition("menubutton") + "-active";
		
	if (menubar.menuTree.activateOnMouseover) {
		if (button.onmouseout == null)
    		button.onmouseout = buttonOrMenuMouseout;
    	
  		if (button.menu != null && button.menu.onmouseout == null)
    		button.menu.onmouseout = buttonOrMenuMouseout;
	}

	if (button.style.display == 'block') {
		x = getPageOffsetLeft(button) + button.offsetWidth;
		y = getPageOffsetTop(button);
	} else {
		x = getPageOffsetLeft(button);
  		y = getPageOffsetTop(button) + button.offsetHeight;
	}

  	if (browser.isIE) {
  		x += button.offsetParent.clientLeft;
    	y += button.offsetParent.clientTop;
  	}

  	if (button.menu != null) {
  		button.menu.style.left = x + "px";
  		button.menu.style.top  = y + "px";
  		button.menu.style.visibility = "visible";

  		if (button.menu.iframeEl != null) {
    		button.menu.iframeEl.style.left 	= button.menu.style.left;
    		button.menu.iframeEl.style.top  	= button.menu.style.top;
    		button.menu.iframeEl.style.width  	= button.menu.offsetWidth + "px";
    		button.menu.iframeEl.style.height 	= button.menu.offsetHeight + "px";
    		button.menu.iframeEl.style.display 	= "";
  		}
	}
}

function resetButton(button) {
	var menubar = getElementByTagName( button, 'DIV');
	removeClassName(button, menubar.menuTree.getMenuStyleDefinition("menubutton") + "-active");
	
	if (button.menu != null) {
    	closeSubMenu(button.menu);
    	button.menu.style.visibility = "hidden";
    	
    	if (button.menu.iframeEl != null)
      		button.menu.iframeEl.style.display = "none";
  }
}

function menuOver(evt) {
	var menu = getElement(evt);
	
	if (menu.nodeName != 'DIV')
		menu = getElementByTagName( menu, 'DIV');
	
  	if (menu.activeItem != null)
    	closeSubMenu(menu);
}

function menuItemOver(evt) {
	var x, y;
	var element = getElement(evt);

	var item = getElementByTagName( element, 'A');
	var menu = getElementByTagName( item, 'DIV' );
	
  	if (menu.activeItem != null)
    	closeSubMenu(menu);
  	
    if (menu.activeItem == item ) return;
    	
    menu.activeItem = item;
    
  	item.className += " " + menu.menuTree.getMenuStyleDefinition("menuitem") + "-over";
  	
  	if (item.subMenu == null)
    	item.subMenu = document.getElementById(item.menuId);
    	
    
    if (menu.menuTree.activateOnMouseover)
    	if (item.subMenu.onmouseout == null)
    		item.subMenu.onmouseout = buttonOrMenuMouseout;
    
  	x = getPageOffsetLeft(item) + item.offsetWidth;
  	y = getPageOffsetTop(item);
  	
  	var maxX, maxY;

  	if (browser.isIE) {
    	maxX = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft) +
      		(document.documentElement.clientWidth != 0 ? document.documentElement.clientWidth : document.body.clientWidth);
    	maxY = Math.max(document.documentElement.scrollTop, document.body.scrollTop) +
      		(document.documentElement.clientHeight != 0 ? document.documentElement.clientHeight : document.body.clientHeight);
  	}
  	
  	if (browser.isOP) {
    	maxX = document.documentElement.scrollLeft + window.innerWidth;
    	maxY = document.documentElement.scrollTop  + window.innerHeight;
  	}
  	
  	if (browser.isNS) {
   		maxX = window.scrollX + window.innerWidth;
    	maxY = window.scrollY + window.innerHeight;
  	}
  	
  	maxX -= item.subMenu.offsetWidth;
  	maxY -= item.subMenu.offsetHeight;

  	if (x > maxX)
    	x = Math.max(0, x - item.offsetWidth - item.subMenu.offsetWidth + (menu.offsetWidth - item.offsetWidth));
  		
    y = Math.max(0, Math.min(y, maxY));

  	item.subMenu.style.left       = x + "px";
  	item.subMenu.style.top        = y + "px";
  	item.subMenu.style.visibility = "visible";

  	if (item.subMenu.iframeEl != null) {
    	item.subMenu.iframeEl.style.left    = item.subMenu.style.left;
    	item.subMenu.iframeEl.style.top     = item.subMenu.style.top;
    	item.subMenu.iframeEl.style.width   = item.subMenu.offsetWidth + "px";
    	item.subMenu.iframeEl.style.height  = item.subMenu.offsetHeight + "px";
    	item.subMenu.iframeEl.style.display = "";
  	}

	cancelEventBubble();
}

function closeSubMenu(menu) {
	if (menu == null || menu.activeItem == null)
    	return;

  	if (menu.activeItem.subMenu != null) {
    	closeSubMenu(menu.activeItem.subMenu);

    	menu.activeItem.subMenu.style.visibility = "hidden";

		if (menu.activeItem.subMenu.iframeEl != null)
      		menu.activeItem.subMenu.iframeEl.style.display = "none";

    	menu.activeItem.subMenu = null;
  	}

  	removeClassName(menu.activeItem, menu.menuTree.getMenuStyleDefinition("menuitem") + "-over");
  	menu.activeItem = null;
}

function getMenuItemDepth(node) {
	var depth = -1;
	
	while (node.ctrltype != 'menu') {		
		if (node.nodeName == 'A') {
			depth++;
		}
		
		node = node.parentNode;
	}
	
	return depth;
}

/**
 * Utility Functions
 */
function getTreeObject(node) {
	node = getElementByAttribute( node, 'ctrltype', 'menutree');
	//alert(node.oTree.);
	return node.oTree;
}

function getItemDepth(node) {
	var depth = -1;
	
	while (node.ctrltype != 'menutree') {		
		if (node.nodeName == 'DIV')
			depth++;
		
		node = node.parentNode;
	}
	
	return depth;
}

function pageMousedown(evt) {
	var el = getElement(evt);
	
	if (activeButton == null)
    	return;
    	
	if (el == activeButton)
		return;
		
	if (el.menuTree == null && !elementHasParentWithAttribute( el, 'menuTree')) {
		resetButton(activeButton);
	    activeButton = null;
	}
}

function buttonOrMenuMouseout(evt) {
  	if (activeButton == null)
    	return;
    
    var el = getTargetElement(evt);
    
  	if (el.menuTree == null && !elementHasParentWithAttribute( el, 'menuTree')) {
    	resetButton(activeButton);
    	activeButton = null;
  	}
}

function frameMousedown(evt) {
	if (activeButton == null)
    	return;
    	
	resetButton(activeButton);
	activeButton = null;
}


addEvent(document, 'mousedown', pageMousedown, true);
addEventHandler(window, 'load', addHandler, false);

function addHandler( evt ) {
	for (var i=0; i < window.frames.length; i++) {
		addEvent(window.frames[i].document, 'mousedown', top.frameMousedown, false);
	}
}