/**
 * Tree object
 **/

function Tree()
{
	this.nodes = new Array();
	var m_children = new Array();
	
	this.getNode = function(id)
	{
		return this.nodes[id+""];
	}
	
	this.getNodeChildren = function(id)
	{
		var c = new Array();
		var cid = m_children[id+""];
		if ( cid )
			for ( var i=0;i<cid.length; i++ ) c[c.length] = this.getNode(cid[i]);
		return c;
	}
	
	this.getParentNode = function ( id )
	{
		if ( this.getNode(id) )
			return this.nodes[this.getNode(id).parentid];
	}
	
	this.getNodeLevel = function(id)
	{
		var level = 0;
		var n = this.nodes[id+""];
		
		while ( n )
		{
			n = this.nodes[n.parentid+""];
			level++;
		}
		return level;
	}
	
	this.addNode = function(n)
	{
		var id = "" + n.id;
		var pid = "" + n.parentid;
		this.nodes[id] = n;
		if ( !m_children[pid] ) m_children[pid] = new Array();
		m_children[pid][m_children[pid].length] = id;
	}	
}

/**
 * Node object
 **/
function Node(id, parentid, label, uri )
{
	this.id = id;
	this.label = label;
	this.uri = uri;
	this.parentid = parentid;
}

/**
 * Menu object
 *
 * @tree node tree
 * @baseuri base uri
 * @currenturi current uri
 **/

function Menu( tree )
{
	var m_tree = tree;
	var m_items = new Array();
	var m_currentnode;
	
	/**
	 * set menu item
	 * @level menu level ( 1..n or "any" )
	 * @current true if render current node in tree
	 * @navigation true if render navigation node in tree
	 * @code html code with placeholders:
	 * 	${label} -> node label
	 * 	${uri} -> node uri
	 * 	${id} -> node id
	 * 	${children} -> node children
	 */	 
	this.setMenuItem = function (level, current, navigation, menuitem)
	{
		m_items[level + "_" + current + "_" + navigation ] = menuitem;
	}
	
	/**
	 * render menu
	 **/
	this.draw = function(baseuri, currenturi)
	{
		var ht = new Array();
		var l = m_tree.getNodeChildren(0);
		if ( l )
		{
			for ( var i=0;i<l.length;i++ )
			{
				ht[ht.length] = this.renderNode( l[i], baseuri, currenturi );
			}	
		}
		document.write(ht.join(""));
	}	
	
	// private section -------------------------------
	
	this.renderNode = function ( node, baseuri, currenturi )
	{
		var ht = "";	
		var mi = this.findMenuItem(node, currenturi);
		
		// render menuitem
		if ( mi )
		{
			ht = mi +"";
			ht = Utility.replace(ht, "${uri}", ((node.uri!="#" && node.uri.indexOf("javascript:")==-1 && node.uri.indexOf("http:")==-1 && node.uri.indexOf("https:")==-1) ? baseuri : "" ) + node.uri);
			ht = Utility.replace(ht, "${label}", node.label);
			ht = Utility.replace(ht, "${id}", node.id);
			
			if ( ht.indexOf("${children}") != -1 )
			{
				var l = m_tree.getNodeChildren(node.id);
				var h = new Array();
				if ( l )
				{
					for ( var i=0;i<l.length;i++ )
						h[h.length] = this.renderNode( l[i], baseuri, currenturi );
				}
				ht = Utility.replace(ht, "${children}", h.join(""))
			}
		}
		
		return ht;		
	}
	
	this.findMenuItem = function(node, currenturi)
	{
		// get level
		var level = m_tree.getNodeLevel(node.id);
		// get if current
		var current = ( currenturi == node.uri );
		// get if navigation
		var navigation = false;
		var c = this.getCurrentNode(currenturi);
		while ( c )
		{
			if ( node.id == c.id )
			{
				navigation = true;
				break;
			}
			else
				c = m_tree.getParentNode(c.id);
		}
		
		// get MenuItem
		var mi = m_items[level + "_" + current + "_" + navigation ];
		if ( !mi ) mi = m_items["any" + "_" + current + "_" + navigation ]
		return mi;
	}
	
	this.getCurrentNode = function(currenturi)
	{
		if (!m_currentnode)
		{
			for ( var i in m_tree.nodes )
			{
				if ( m_tree.nodes[i].uri.toLowerCase() == currenturi.toLowerCase() ) 
				{
					m_currentnode = m_tree.nodes[i];
					break;
				}
			}
		}
		return m_currentnode;
	}
	
	// private section -------------------------------	
}

/**
 * Utility
 **/

function Utility() {};

Utility.replace = function(str, pattern, substitute)	
{
	if ( str.indexOf(pattern)==-1 ) 
		return str;
	else
		return str.split(pattern).join(substitute);
}

Utility.getBaseUri = function( imagepath )
{	
	var sr;
	for ( var i=0; i<document.images.length; i++ )
	{
		sr = Utility.replace ( document.images[i].src + "", "\\", "/" );
		if ( sr.indexOf("/timeo/res/img") == -1 )
			return sr.substring( 0, sr.indexOf(imagepath)+1 );
	}
}

/**
 * Dropdown control function
 **/

function DropDownController() {};

DropDownController.LAYERPREFIX = "drp";
DropDownController.timerHide = document.getElementById("___");

DropDownController.showMenu = function (id)
{
	clearTimeout(DropDownController.timerHide);
	DropDownController.executeHideMenus();
	DropDownController.setMenuLayerVisibility(id, true);
}

DropDownController.hideMenus = function()
{
	DropDownController.timerHide = setTimeout("DropDownController.executeHideMenus()", 300);
}

DropDownController.executeHideMenus = function()
{
	divlist = document.getElementsByTagName("div");
		
	for (var i=0; i<divlist.length; i++)
	{		
		if (divlist[i].id!=null)
		{	
			if ( divlist[i].id.length>=DropDownController.LAYERPREFIX.length &&
				divlist[i].id.substring( 0, DropDownController.LAYERPREFIX.length )== DropDownController.LAYERPREFIX )
					DropDownController.setMenuLayerVisibility(divlist[i].id, false);
		}

	}
}

DropDownController.setMenuLayerVisibility = function(menuID, isVisible)
{
	if (isVisible)
		document.getElementById(menuID).style.display = "block";
	else
		document.getElementById(menuID).style.display = "none";
}

/**
 * Menu manager
 */
 
function MenuManager() {};

MenuManager.m_menumap = new Array();
MenuManager.m_imagepath = "/res/img";

// bug 1
MenuManager.registerMenu = function(id, t)
{
	MenuManager.m_menumap[id] = new Menu(t);
}

MenuManager.registerMenuItem = function(menuid, level, current, navigation, code)
{
	MenuManager.m_menumap[menuid].setMenuItem (level, current, navigation, code);
}

MenuManager.drawMenu = function(id)
{
	var currenturi = document.location.href.substring(MenuManager.getBaseUri().length, document.location.href.length);
	MenuManager.m_menumap[id].draw(MenuManager.getBaseUri(), currenturi);
}

MenuManager.getBaseUri = function()
{
	if ( !MenuManager.m_baseuri )
		MenuManager.m_baseuri = Utility.getBaseUri(MenuManager.m_imagepath);
	return MenuManager.m_baseuri;
}

MenuManager.setImagePath = function(imagepath)
{
	MenuManager.m_imagepath = imagepath;
}
