/*
	*	Name:		Expandable/Collapsible Menu System
	*	Date:		2001-06-30

	*	Author:		Ben Boyle
	*	Email:		bboyle@inspire.server101.com
*/

// expand/collapse images
var nav_image_bullet = new Image(0,0);
var nav_image_collapsed = new Image(0,0);
var nav_image_expanded = new Image(0,0);

// menu indent level
var nav_menu_indent = 0;

// menu height level (used by netscape to ensure expandable space)
var nav_menu_height = 0;

// automatically expand (onMouseOver, onFocus)
var nav_auto_expand = false;
var nav_auto_expand_delay = 0;

// collapse other menu trees when expanding
var nav_collapse_on_expand = 'true';

/*
 end nav_config.js variables
*/

// menu
var nav_menu_tree = new Array();
var nav_menu_tree_index = 0;
// caches
var nav_image_cache = new Array();
var nav_class_cache = new Array();
// auto expand timer
var	nav_auto_expand_timer;


// new menu_tree object
function nav_menu_node(id, name, url, target, expanded, image) {
	this.id			= id.toString();
	this.expanded	= (expanded ? true : false);
	this.collapse	= nav_collapse_on_expand;
	this.name		= name;
	this.url		= (url ? url : '');
	this.target		= target;
	this.tree		= nav_menu_tree_index;
	this.expandedi	= (nav_image_expanded ? nav_find_image(nav_image_expanded) : null);
	this.collapsedi	= (nav_image_collapsed ? nav_find_image(nav_image_collapsed) : null);
	this.bulleti	= (nav_image_bullet ? nav_find_image(nav_image_bullet) : null);
	this.expandedc	= ('expanded' ? nav_find_class('expanded') : null);
	this.collapsedc	= ('collapsed' ? nav_find_class('collapsed') : null);
	this.bulletc	= ( 'bullet' ? nav_find_class( 'bullet') : null);
}


// adds a node to the end of the menu tree
function nav(level, name, url, target, expanded, node) {
	if (!node) {
		if (!nav_menu_tree[nav_menu_tree_index]) {
			// first item
			nav_menu_tree[nav_menu_tree_index] = new nav_menu_node(0, name, url, target, expanded);
			return;
		} else {
	 		node = nav_menu_tree[nav_menu_tree_index];
		}
	}

	// end of level
	while (node.next) {
		node = node.next;
	}

	if (level == 0) {
		// add to this level
		var id = node.id.lastIndexOf('-');
		if (id != -1) {
			var inc = node.id.substring(id + 1);
			inc++;
			id = node.id.substring(0, id) + '-' + inc;
		} else {
			id = parseInt(node.id) + 1;
		}
		node.next = new nav_menu_node(id, name, url, target, expanded);
	} else if (node.child) {
		// recurse on next level
		nav(level - 1, name, url, target, expanded, node.child);
	} else {
		// new child
		node.child = new nav_menu_node(node.id + '-0', name, url, target, expanded);
	}
}


// include a class
function nav_include_class(i) {
	var cl = nav_class_cache[i];
	return (cl ? ' class="' + cl + '"' : '');
}

// include an image
function nav_include_image(node, i) {
	var image = nav_image_cache[i];
	if (image) {
		return '<img src="' + image.src + '" ' + 'border="0" ID="nav_' + node.tree + '|' + node.id + '_IMG" />';
	}
	return '';
}
// include a bullet image
function nav_include_bullet_image(node) {
	return nav_include_image(node, node.bulleti);
}

// include an auto_expand control
function nav_include_auto_expand_control(node) {
	var text = '';
	if (nav_auto_expand && node.child) {
		text += ' onMouseOver="nav_set_auto_expand(' + node.tree + ', \'' + node.id + '\');" onMouseOut="nav_set_auto_expand();"';
		text += ' onFocus="nav_set_auto_expand(' + node.tree + ', \'' + node.id + '\');" onBlur="nav_set_auto_expand();"';
	}
	return text;
}

// include a node
function nav_include_node_link(node) {
	var text = '';
	if (node.url) {
		text += '<a href="' + node.url + '"' + (node.target ? ' target="' + node.target + '"' : '') + nav_include_auto_expand_control(node) + (node.child ? 'class=sidemenuCat' : 'class=smalllink') + '>';
	}
	text += node.name;
	if (node.url) {
		text += '</a>';
	}
	return text;
}

// include node
function nav_include_node(node, cl, i) {
	var	text = '<table border="0"' + (node.child ? 'cellpadding="0"' : 'cellpadding="0"') + ' cellspacing="0"><tr>';
	text += '<td valign="top">' + i + '</td>';
	text += '<td valign="top"' + nav_include_class(cl) + ' id="nav_' + node.tree + '|' + node.id + '_CL"><font face=arial size=2 color=#353535>' + nav_include_node_link(node) + '</td>';
	text += '</tr></table>';

	return text;
}

// find a node with a given id
function nav_find_node(tree, id) {
	var node = nav_menu_tree[tree];
	var level = id.toString().split('-');

	for (var i = 0; i < level.length; i++) {
		for (var j = level[i]; j > 0; j--) {
			node = node.next;
		}
		if (i + 1 < level.length) {
			node = node.child;
		}
	}
	return node;
}

// find a node with a given name
function nav_find_node_name(tree, name) {
	if (!tree) {
		tree = 0;
	}
	return nav_find_node_name_in_tree(nav_menu_tree[tree], name);
}
function nav_find_node_name_in_tree(node, name) {

	// found it (only if it is a parent node)
	if (node.child && node.name == name) {
		return node;
	}
	
	// recurse: check expanded children
	if (node.child && node.expanded) {
		var check = nav_find_node_name_in_tree(node.child, name);
		if (check) {
			return check;
		}
	}

	// recurse: check next nodes
	if (node.next) {
		var check = nav_find_node_name_in_tree(node.next, name);
		if (check) {
			return check;
		}
	}

	return null;
}


// control click to expand/collapse menu
function nav_control_click(tree, node, image) {
	node = nav_find_node(tree, node);
	nav_control_node(node, !node.expanded, image);
}


// expand a node based on name
function nav_expand(name, tree) {
	nav_control_node(nav_find_node_name(tree, name), 1);
}


// expand a node based on id
function nav_expand_id(tree, id) {
	nav_control_node(nav_find_node(tree, id), 1);
}


// collapse a node based on its name
function nav_collapse(name, tree) {
	nav_control_node(nav_find_node_name(tree, name), 0);
}


// expand all folders
function nav_expand_all(tree) {
	var collapse_on_expand = nav_collapse_on_expand;
	nav_collapse_on_expand = false;

	nav_expand_tree(nav_menu_tree[tree]);

	nav_collapse_on_expand = collapse_on_expand;
}


// expand a menu tree
function nav_expand_tree(node) {
	if (node.child) {
		nav_expand_tree(node.child);
		nav_control_node(node, 1);
	}

	// recurse
	if (node.next) {
		nav_expand_tree(node.next);
	}
}


// collapse all folders (exclude node path)
function nav_collapse_all(tree, path) {
	nav_collapse_tree(nav_menu_tree[tree], path);
}


// collapse a menu tree (exclude those in a given path)
function nav_collapse_tree(node, path) {
	if (node.child) {
		if (!path || path.id.indexOf(node.id) != 0) {
			nav_control_node(node, 0);
		}
		nav_collapse_tree(node.child, path);
	}
	// recurse
	if (node.next) {
		nav_collapse_tree(node.next, path);
	}
}


// control click to expand/collapse menu
function nav_control_node(node, expand) {
	if (expand) {
		if (!node.expanded) {
			// collapse other menus?
			if (node.collapse) {
				// collapse other trees
				if (node.collapse == 'all') {
					for (var i = 0; i < nav_menu_tree.length; i++) {
						if (i != node.tree) {
							nav_collapse_all(i);
						}
					}
				}
				// collapse other items within this tree
				nav_collapse_all(node.tree, node);
			}
			node.expanded = true;
			nav_PF_expand(node);
		}
	} else {
		if (node.expanded) {
			node.expanded = false;
			nav_PF_collapse(node);
		}
	}
}


// auto expand
function nav_set_auto_expand(tree, node) {
	if (nav_auto_expand) {
		if (!node && nav_auto_expand_timer) {
			clearTimeout(nav_auto_expand_timer);
		} else {
			nav_auto_expand_timer = setTimeout('nav_expand_id(' + tree + ', \'' + node + '\');', nav_auto_expand_delay);
		}
	}
}


// find image - caches images
function nav_find_image(image) {
	var i = 0;
	while (i < nav_image_cache.length) {
		if (nav_image_cache[i].src == image.src) {
			return i;
		}
		i++;
	}
	// cache new image - create copy
	nav_image_cache[i] = new Image(0,0);
	nav_image_cache[i].src = image.src;
	nav_image_cache[i].alt = image.alt;
	return i;
}


// find class - caches classes
function nav_find_class(name) {
	var i = 0;
	while (i < nav_class_cache.length) {
		if (nav_class_cache[i] == name) {
			return i;
		}
		i++;
	}
	// cache new class name
	nav_class_cache[i] = name;
	return i;
}


// end menu - trigger to create menu on page
function nav_end_menu() {
	if (nav_menu_tree[nav_menu_tree_index]) {
		// root node exists, continue
		nav_PF_create_menu(nav_menu_tree[nav_menu_tree_index]);
		nav_menu_tree_index++;
	}
}

