var hoverSuffix = "_hover";
var imageOverSuffix = "_over";
var activeMenu = null;
var closeMenu = null;
var timer = null;
var nextMenu = null;
var openClick = false; // set to tru if menu is pend by on click event

/**
 * Adds a hover behavior to any element.
 *
 * @declare public
 * @param elm HTMLElement The element to hover.
 */
function hover( elm, images, imageId, arrowId) {
	if (elm != null){
		var clsname = elm.className;
		if (clsname.indexOf(hoverSuffix)<0) {
			elm.className = clsname + hoverSuffix;
		}
	}
	if (images!=null && imageId!=null) {
		var image = document.getElementById('mi_' + imageId);
		setImageSrc(image,imageId + imageOverSuffix,images)
		if (arrowId!=null) {
			var arrow =  document.getElementById('ma_' + imageId);
			setImageSrc(arrow,arrowId + imageOverSuffix,images)
		}
	}
}

/**
 * Removes the hover behavior from any element.
 *
 * @declare public
 */
function unhover( elm, images, imageId, arrowId  ) {
	if (elm != null){
		var clsname = "";
		clsname = elm.className;
		elm.className = clsname.split( hoverSuffix )[0];
	}
	if (images!=null && imageId!=null) {
		var image = document.getElementById('mi_' + imageId);
		setImageSrc(image,imageId,images)
	}
	if (images!=null && arrowId!=null) {
		var arrow =  document.getElementById('ma_' + imageId);
		setImageSrc(arrow,arrowId,images)
	}
}


function holdMenu (hold) {
	// firts clear timer if set
	if (timer!=null) {
		window.clearTimeout(timer);
	}
	// close menu if open
	if (closeMenu!=null) {
		// loop from top to bottom
		while (activeMenu!=null && activeMenu.id!=closeMenu) {
			hideMenu(activeMenu);
			activeMenu = activeMenu.parent;
		}
		closeMenu=null;
	}

	// if active menu exists then set the timer again
	if (hold!=null && hold && activeMenu!=null) {
		timer = window.setTimeout("holdMenu()", 2000);
	}
}

function showMenu (id, elm, parentId, images, imageId, arrowId, openByClick, top, left, isSubmenu) {	
	// test for menu element existence
	var _elm = document.getElementById(id);
	if (_elm==null) {
		return false;
	}
	if (activeMenu!=null && activeMenu.id==id) {
		closeMenu=null;
		nextMenu=id;
	 	return false;
	}
	closeActiveMenu(parentId);
	// add current child
	activeMenu = new savedMenu(id, parentId, activeMenu, elm, images, imageId, arrowId);
	// hold child menu
//	holdMenu();
	hover(elm, images, imageId, arrowId);
	if (id == 'QuickFilterMenu') {
		appendClass(document.getElementById('filterMenus'), 'hideQuickFilterItems');
	}
	if (top!=null && left!=null) {
		show(id,elm,top,left,isSubmenu);
	} else {
		show(id,elm,"bottom");
	}
	nextMenu=id;
	openClick = openByClick;

}

function showSubmenu(id, elm, parentId, images, imageId, arrowId, openByClick, top, left) {
	showMenu(id, elm, parentId, images, imageId, arrowId, openByClick, top, left, true);
//	saveMenu(id);
}

function hideMenu (menu) {
	unhover(menu.hoverElm, menu.images, menu.imageId, menu.arrowId);
	if (menu.id == 'QuickFilterMenu') {
		switchClass (document.getElementById('filterMenus'), 'hideQuickFilterItems', '');
	}
	hide(menu.id);
}

function killMenu (id) {
	holdMenu(true);
	closeMenu = true;
	nextMenu = null;
}

function saveMenu (id) {
	if (nextMenu!=null) {
		closeMenu=nextMenu;
	} else {
		closeMenu=id;
	}
	holdMenu(true);
}

function savedMenu(id, parentId, parent, elm, images, imageId, arrowId) {
	this.parent = parent;
	this.id = id;
	this.parentId = parentId;
	this.hoverElm = elm;
	this.images = images;
	this.imageId = imageId;
	this.arrowId = arrowId;
}

function closeActiveMenu (parentId) {
	var _activeMenu = activeMenu;
	// we will determine what exactly to close ...
	closeMenu = null;
	while (_activeMenu!=null && _activeMenu.id!=parentId) {
		// ... and that will be everything up to parentId menu
		closeMenu=_activeMenu.parentId;
		_activeMenu=_activeMenu.parent;
	}
	// this hold menu will actualy drop menus if necessary
	holdMenu();
}

function forceCloseMenu(e,clsName) {
	if (clsName==null) {
		clsName="";
	}
	// ignore click that opend the menu
	if (!openClick) {
		// browser incompatibility issue
		var eventElement = null;
		if (app.isNS4 || app.isNS6) {
			eventElement=e.target;
			// find first table because menus are in table elements
//			alert(eventElement.nodeType + ' - ' + eventElement.className + ' - ' + clsName);
			while (eventElement!=null && (eventElement.className!=clsName)) {
				eventElement = eventElement.parentNode;
			}
		} else {
			eventElement=window.event.srcElement;
			// find first table because menus are in table elements
			while (eventElement!=null && (eventElement.className!=clsName)) {
				eventElement = eventElement.parentElement;
			}
		}
		// if not over active menu then kill the menu
		if(activeMenu!=null && (eventElement==null || eventElement.id!=activeMenu.id)) {
			killMenu();
			holdMenu();
		}
	}
	openClick=false; // any other click will be valid
}


document.onclick = forceCloseMenu;


