//=================================================================================================
	var
		currItem  = null, 
		currMenu  = null, 
		hideSpeed = 450;
//=================================================================================================
function node( ID )
{
	return document.getElementById( ID );
}
//=================================================================================================
function isFloating( menu )
{
	if ( menu && isMenu( menu ) )
		return (menu.style.position == "absolute");
	else
		return false;
}
//=================================================================================================
function isHorizontal( menu )
{
	if ( isMenu( menu ) )
	{
		if ( isIE )
			return (menu.horizontal == "true");
		else
			return aHorizontal[menu.id];
	}
	else
		return false;
}
//=================================================================================================
function isItem( item )
{
	if ( item )
		return (new String( item.id ).search(/^i\d+$/) > -1);
	else
		return false;
}
//=================================================================================================
function isMenu( menu )
{
	if ( menu )
		return (new String( menu.id ).search(/^m\d+$/) > -1);
	else
		return false;
}
//=================================================================================================
function isChild( parent, child )
{
	return isParent( child, parent );
}
//=================================================================================================
function isParent( child, parent )
{
	var
		directParent = getParent( child );
	
	if ( directParent == parent )
		return true;
	else if ( directParent )
		return isParent( directParent, parent );
	else
		return false;
}
//=================================================================================================
function canHide( menu )
{
	if ( menu )
	{
		if ( currMenu )
			return (
					currMenu != menu && 
					getParent( getParent( menu ) ) != currMenu &&	//	menu is direct child from currMenu 
					! isParent( currMenu, menu ) );						//	menu is parent from currMenu 
		else
			return true;
	}
	else
		return false;
}
//=================================================================================================
function getFirstChild( sender )
{
	if ( sender )
	{
		for ( var i = 0; i < sender.childNodes.length; i++ )
		{
			if ( sender.childNodes[i].nodeName != "#text")
				return sender.childNodes[i];
		}
		
		return null;
	}
	else
		return null;
}
//=================================================================================================
function getFirstItem( sender )
{
	if ( isMenu( sender ) )
	{
		if ( isIE )
			return sender.children[0].rows[0].cells[0].childNodes[0];
		else
		{
			var
				table = getFirstChild( sender ), 
				rows  = getFirstChild( table ).childNodes;
			
			for ( var i = 0; i < rows.length - 1; i++ )
			{
				var
					cells = rows[i].childNodes;
				
				for ( var j = 1; j < cells.length; j += 2 )
				{
					var
						a = cells[j].childNodes[0];
						
						if ( a )
							return a;
				}
			}
		}
	}
	
	return null;
}
//=================================================================================================
function getParent( sender )
{
	if ( isItem( sender ) )
	{
		var
			parent = sender.parentNode;
		
		while ( parent && parent.nodeName != "DIV")
			parent = parent.parentNode;
		
		if ( isMenu( parent ) )
			return parent;
		else
			return null;
	}
	else if ( isMenu( sender ) )
	{
		if ( isIE )
			return node( sender.parent );
		else if ( sender )
			return node( aParent[sender.id] );
	}
	else
		return null;
}
//=================================================================================================
function getChild( sender )
{
	if ( isItem( sender ) )
	{
		if ( isIE )
			return node( sender.child );
		else if ( sender )
			return node( aChild[sender.id] );
	}
	else if ( isMenu( sender ) )
		return getFirstChild( sender );
	else
		return null;
}
//=================================================================================================
function select( item )
{
	if ( isItem( item ) )
	{
		var 
			menu = getChild( item );
		
		if ( menu && isFloating( menu ) )
		{
			position( menu );
			
			var 
				frame = node("f" + new String( menu.id ).substr( 1 ) );
			
			if ( frame )
			{
				frame.style.left       = menu.style.left;
				frame.style.top        = menu.style.top;
				frame.style.width      = menu.clientWidth + 
						(menu.style.borderLeftWidth   ? parseInt( menu.style.borderLeftWidth   ) : 0) + 
						(menu.style.borderRightWidth  ? parseInt( menu.style.borderRightWidth  ) : 0);
				frame.style.height     = menu.clientHeight + 
						(menu.style.borderTopWidth    ? parseInt( menu.style.borderTopWidth    ) : 0) + 
						(menu.style.borderBottomWidth ? parseInt( menu.style.borderBottomWidth ) : 0);
				frame.style.visibility = "visible";
			}
			
			menu.style.visibility = "visible";
		}
		
		if ( isIE )
		{
			if ( item.onselect )
				eval( replaceString( item.onselect, "this", "node(\"" + item.id + "\")") );
		}
		else if ( aSelect[item.id] )
			eval( replaceString( aSelect[item.id], "this", "node(\"" + item.id + "\")") );
	}
}
//=================================================================================================
function deselect( item )
{
	if ( isItem( item ) )
	{
		var 
			menu  = getChild( item );
		
		if ( menu )
		{
			var  
				frame = node("f" + new String( menu.id ).substr( 1 ) );
			
			if ( frame )
				frame.style.visibility = "hidden";
			
			if ( isFloating( menu ) )
				menu.style.visibility = "hidden";
		}
		
		if ( isIE )
		{
			if ( item.ondeselect )
				eval( replaceString( item.ondeselect, "this", "node(\"" + item.id + "\")") );
		}
		else if ( aDeselect[item.id] )
			eval( replaceString( aDeselect[item.id], "this", "node(\"" + item.id + "\")") );
	}
}
//=================================================================================================
function hideItem( item )
{
	currItem = null;
}
//=================================================================================================
function showItem( item )
{
	if ( item )
	{
		currItem = item;
		
		hideSiblings( item );
		select( item );
	}
}
//=================================================================================================
function hideMenu( menu )
{
	currMenu = null;
	
	if ( menu )
	{
		setTimeout("hideDown( node(\"" + menu.id + "\") );", hideSpeed );
		
		if ( isFloating( menu ) )
			setTimeout("hide( node(\"" + menu.id + "\") ); hideUp( node(\"" + menu.id + "\") );", hideSpeed );
	}
}
//=================================================================================================
function showMenu( menu )
{
	if ( menu )
		currMenu = menu;
}
//=================================================================================================
function hideUp( menu )
{
	var
		parentMenu = getParent( getParent( menu ) );
	
	if ( ! canHide( parentMenu ) )
		return;
	
	if ( parentMenu )
	{
		deselect( getParent( parentMenu ) );
		hideUp( parentMenu );
	}
}
//=================================================================================================
function hide( menu )
{
	if ( ! canHide( menu ) )
		return;
	
	deselect( getParent( menu ) );
}
//=================================================================================================
function hideDown( menu )
{
	var 
		rows, cells;
	
	if ( isIE )
	{
		rows = menu.children[0].rows;
		
		for ( var i = 0; i < rows.length; i++ )
		{
			var
				cells = rows[i].cells;
			
			for ( var j = 0; j < cells.length; j++ )
			{
				var
					sibling = cells[j].childNodes[0];
				
				if ( sibling )
				{
					var 
						subMenu = getChild( sibling );
					
					if ( canHide( subMenu ) )
					{
						hideDown( subMenu );
						deselect( getParent( subMenu ) );
					}
				}
			}
		}
	}
	else
	{
		rows = getFirstChild( getFirstChild( menu ) ).childNodes;
		
		for ( var i = 0; i < rows.length - 1; i++ )
		{
			var
				cells = rows[i].childNodes;
			
			for ( var j = 1; j < cells.length; j += 2 )
			{
				var
					sibling = cells[j].childNodes[0];
				
				if ( sibling )
				{
					var 
						subMenu = getChild( sibling );
					
					if ( canHide( subMenu ) )
					{
						hideDown( subMenu );
						deselect( getParent( subMenu ) );
					}
				}
			}
		}
	}
}
//=================================================================================================
function hideSiblings( item )
{
	if ( item )
	{
		var
			menu = getParent( item );
		
		if ( menu )
		{
			var 
				rows, cells;
			
			if ( isIE )
			{
				rows = menu.children[0].rows;
				
				for ( var i = 0; i < rows.length; i++ )
				{
					var
						cells = rows[i].cells;
					
					for ( var j = 0; j < cells.length; j++ )
					{
						var
							sibling = cells[j].childNodes[0];
						
						if ( sibling && sibling != item )
						{
							var 
								subMenu = getChild( sibling );
							
							if ( subMenu && isFloating( subMenu ) )
								hide( subMenu );
						}
					}
				}
			}
			else
			{
				rows = getFirstChild( getFirstChild( menu ) ).childNodes;
				
				for ( var i = 0; i < rows.length - 1; i++ )
				{
					var
						cells = rows[i].childNodes;
					
					for ( var j = 1; j < cells.length; j += 2 )
					{
						var
							sibling = cells[j].childNodes[0];
						
						if ( sibling && sibling != item )
						{
							var 
								subMenu = getChild( sibling );
							
							if ( subMenu && isFloating( subMenu ) )
								hide( subMenu );
						}
					}
				}
			}
		}
	}
}
//=================================================================================================
function position( menu )
{
	var
		item  = getParent( menu ), 
		pMenu = getParent( item );
	
	if ( isIE )
	{
		if ( isHorizontal( pMenu ) )
			menu.style.top = getTop( item ) + item.offsetHeight;
		else
			menu.style.top = getTop( item );
		
		if ( ! isHorizontal( menu ) )
		{
			if ( isHorizontal( pMenu ) )
				menu.style.left = getLeft( item );
			else
				menu.style.left = getLeft( item ) + item.offsetWidth - 5;
			
			if ( menu.offsetLeft + menu.offsetWidth > document.body.offsetWidth - 20 )
				if ( isHorizontal( pMenu ) )
					menu.style.left = document.body.offsetWidth - 20 - menu.offsetWidth;
				else
					menu.style.left = getLeft( item ) - menu.offsetWidth + 5;
		}
	}
	else
	{
		if ( isHorizontal( pMenu ) )
			menu.style.top = getTop( item.parentNode ) + (item.offsetHeight + item.offsetTop) + "px";
		else
			menu.style.top = getTop( item.parentNode ) + "px";
		
		if ( ! isHorizontal( menu ) )
		{
			if ( isHorizontal( pMenu ) )
				menu.style.left = getLeft( item ) + "px";
			else
				menu.style.left = getLeft( item ) + item.parentNode.offsetWidth - 5 + "px";
		}
	}
}
//=================================================================================================
function getTop( sender )
{
//	if ( isIE )
		return topIE( sender );
//	else
//		return topMoz( sender );
}
//=================================================================================================
function getLeft( sender )
{
//	if ( isIE )
		return leftIE( sender );
//	else
//		return leftMoz( sender );
}
//=================================================================================================
function topIE( sender )
{
	if ( sender && sender.nodeName != "#document")
	{
		if ( ! isMenu( sender ) && sender.style.position == "absolute")
			return 0;
		else if ( sender.style.position == "absolute")
			return sender.offsetTop;
		else
			return sender.offsetTop + topIE( sender.offsetParent );
	}
	else
		return 0;
}
//=================================================================================================
function topMoz( sender )
{
	if ( sender && sender.nodeName != "#document")
	{
		if ( isMenu( sender ) && sender.offsetTop )
			return sender.offsetTop;
		else if ( (sender.nodeName == "TD" || sender.id == "") && sender.nodeName != "TR")
			return sender.offsetTop + topMoz( sender.offsetParent );
		else
			return topMoz( sender.offsetParent );
	}
	else
		return 0;
}
//=================================================================================================
function leftIE( sender )
{
	if ( sender && sender.nodeName != "#document")
	{
		if ( ! isMenu( sender ) && sender.style.position == "absolute")
			return 0;
		else if ( sender.style.position == "absolute")
			return sender.offsetLeft;
		else 
			return sender.offsetLeft + leftIE( sender.offsetParent );
	}
	else
		return 0;
}
//=================================================================================================
function leftMoz( sender )
{
	if ( sender && sender.nodeName != "#document")
	{
		if ( sender.style.position == "absolute")
			return sender.offsetLeft;
		else if ( sender.nodeName == "TABLE" && sender.offsetLeft )
			return sender.parentNode.offsetLeft;
		else
			return sender.offsetLeft + leftMoz( sender.offsetParent );
	}
	else
		return 0;
}
//=================================================================================================
