/* generic menu handling, needs tree.js by theo.van.eijndhoven@chello.nl */

	// here is the more or less generic code for menu handling
	function NodeFinder(innerHTML)
	{
		this.innerHTML = innerHTML;
		this.foudNode = null;
		
		this.accept = NodeFinder_compare;
	}
	
	function NodeFinder_compare(node, level)
	{
		if ( node.innerHTML && node.innerHTML.indexOf(this.innerHTML) > -1 )
		{
			this.foundNode = node;
		}
	}
	
	function nodeFind(tree, innerHTML)
	{
		var finder = new NodeFinder(innerHTML);
		tree.treeWalk(finder, -1);
		return finder.foundNode;
	}
		
	function pathFind(tree, innerHTML)
	{
		var nodes = [];
		var node = nodeFind(tree, innerHTML);
		
		while(node)
		{
			nodes[nodes.length] = node;
			node = node.parent;
		}
		nodes.reverse();
		return nodes;
	}
	
	function initializeMenu(menu, htmFile)
	{
		var path = pathFind(menu, htmFile);
		
		var domElement;
		//create the menu in the dom
		for ( var i = 0; i < path.length; i++ )
			nodeClickedNode(path[i]);

		// but... several anchors in div, may be with imgs inside...
		domElement = path[path.length-1].domElement;
		
		var elements = domElement.getElementsByTagName("A");
		var anchor = null;
		
		for ( var i = 0; i < elements.length; i++ )
		{
			if ( elements[i].href.indexOf(htmFile) > -1 )
			{
				anchor = elements[i];
				break;
			}
		}
		
		//maybe the anchor contains a img thumb that needs to be clicked
		elements = anchor.getElementsByTagName("IMG");
		if ( elements && elements[0] )
			elements[0].onclick(null);
		
		return anchor;
	}

	// deal with displaying the leaf that is current
	// (it might have been deleted from the dom tree)
	function CurrentLeaf()
	{
		this.current = null;
		
		this.set = CurrentLeaf_set;
		this.refresh = CurrentLeaf_refresh;
		this.selected = null;
		this.deselected = null;
	}
	function CurrentLeaf_set(domId)
	{
		if ( domId == this.current ) return;
		
		var domObj;
		if ( this.current )
		{
			if ( domObj = document.getElementById(this.current) )
				if ( this.deselected )
					this.deselected(domObj);
		}
		this.current = domId;
		this.refresh();
	}
	function CurrentLeaf_refresh()
	{
		var domObj;
		if ( this.current )
			if ( domObj = document.getElementById(this.current) )
				if ( this.selected )
					this.selected(domObj);
				
	}
	
	var currentLeaf = null;
	
	function setStateSetter(selected, deselected)
	{
		if ( currentLeaf == null )
			currentLeaf = new CurrentLeaf();
		currentLeaf.selected = selected;
		currentLeaf.deselected = deselected;
	}
	
	// this event-handler is attached to dom-tree img's of class thumb
	function thumbClicked(e)
	{
		// alert(this.id + " was clicked");
		if ( currentLeaf )
			currentLeaf.set(this.id);
	}
	
	// this object gives thumbs an ID and attaches an event-handler
	function ThumbsHandler()
	{
		this.thumbs = [];
		this.init = ThumbsHandler_init;
	}
	function ThumbsHandler_init()
	{
		var images = document.getElementsByTagName('img');
		var i, div, thumb;
		
		this.thumbs = [];	
		for ( i = 0; i < images.length; i++ )
		{
			if ( images[i].className == "thumb" )
				this.thumbs[this.thumbs.length] = images[i];
		}
		
		for ( i = 0; i < this.thumbs.length; i++ )
		{
			thumb = this.thumbs[i];
			
			// assign thumb an ID if it didn't have one
			if ( thumb.id == null || thumb.id == "" )
			{
				div = thumb;
				while ( div )
				{
					if ( div.tagName == "DIV" ) break;
					div = div.parentNode;
				}
				if ( div ) thumb.id = div.id + ".thumb" + i;
			}
			
			// assign thumb a click handler
			thumb.onclick = thumbClicked;
			if ( thumb.captureEvents ) thumb.captureEvents(Event.CLICK);
		}
	}
	
	// with this object we walk the menu-tree to from the dom-tree remove
	// stuff we want hidden
	function NodeDestructor()
	{
		this.accept = destroyNode;
	}
	function destroyNode(node, level)
	{
		var parent = null;
		
		node.display = "n";
		if ( !node.domElement) return;

		// FIX ? remove sub-tree ?
		parent = node.domElement.parentNode;
		parent.removeChild(node.domElement);
		
		node.domElement = null;
	}
	
	// attached to menu-tree dom elements to handle click
	function nodeClicked(e)
	{
		nodeClickedNode(this.menuNode);
		// may not be a good idea to remove dom-elements from whitin their eventhandler
		// window.setTimeout("nodeC()", 50);
		// alert("event on: " + this.id); or e.target.id
	}
	
	function nodeClickedNode(clickedNode)
	{
		// if node is not a leaf the menu needs change
		// FIX: node is leaf of different parent (has problem with destroyed link?)
		if ( clickedNode.children )
		{
			// find root and destroy menu from dom-tree
			var root = clickedNode;
			while (root.parent) root = root.parent;
			root.treeWalk(new NodeDestructor(), -1);

			//set to display nodes between clicked node and root
			var node = clickedNode;
			var c;
			while (node)
			{
				if ( node.children )
					for ( c = 0; c < node.children.length; c++ )
						node.children[c].display = "y";
						
				node = node.parent;
			}
		
			//re-create the to-be visible part of the menu-tree
			root.treeWalk(new MenuCreator(), -1);
		
			//attach dynamics to thumbs
			thumbsHandler.init();
		}
		
		// we have a leaf to set current, if no thumbs attached
		if ( clickedNode.children == null ) 
		{
			var thumbs = clickedNode.domElement.getElementsByTagName('img');
			if ( thumbs == null || thumbs.length == 0 )
				if ( currentLeaf )
					currentLeaf.set(clickedNode.domElement.id);
			return;
		}
		else
		{
			// re-show the re-created current
			if ( currentLeaf )
				currentLeaf.refresh();
		}
	}
	
	// attached to menu-tree elements this object creates a equivalent dom-tree
	// node -a DIV in fact- if asked to by the MenuCreator
	function MenuNodeCreator(parentObject, className)
	{
		this.parentObject = parentObject;
		this.className = className;
		
		this.create = MenuNodeCreator_create;
	}
	function MenuNodeCreator_create(node)
	{
		var div = document.createElement("div")
		div.id = node.name;
		div.className = this.className;

		if ( node.innerHTML )
			div.innerHTML = node.innerHTML;
		else
			div.innerHTML = node.name;
		
		// point dom-tree div to node and node to dom-tree div
		div.menuNode = node;
		node.domElement = div;
		
		// in this callback we'll handle re-layouting of the menu
		div.onclick = nodeClicked;
		if ( div.captureEvents ) div.captureEvents(Event.CLICK);
		
		// hang the div in the dom tree
		this.parentObject.appendChild(div);
	}
	
	// this one will walk the menu-tree and invoke the creator where necesary
	function MenuCreator()
	{
		this.accept = MenuCreator_accept;
	}
	function MenuCreator_accept(node, level)
	{
		if ( node.creator && node.display && node.display == "y")
			node.creator.create(node);
	}
			
/* Printer object with which to walk-print the menu tree */
   		
function Printer()
{
	this.accept = print;
}
function print(node, level)
{
	var stripes = "";
	for ( var i = 0; i < level; i++) stripes = stripes + "- ";
	document.write(stripes + node.name + " display=" + node.userData.display + "<br>");
}

