// LOADER - loads browser specific version
if (document.getElementById) {
	// standard - Netscape6, IE 4/5
	document.writeln('<script language="Javascript" type="text\/javascript" src="/js/Mcmenuid.js"><\/script>');
} else if (document.layers) {
	// layers (Netscape 4, 3)
	document.writeln('<script language="Javascript" type="text\/javascript" src="/js/Mcmenulayer.js"><\/script>');
} else {
	// default - uses UL/LI display
	document.writeln('<script language="Javascript" type="text\/javascript" src="/js/Mcmenudefault.js"><\/script>');
}



// expand/collapse images
var MCCI_image_bullet = new Image();
var MCCI_image_collapsed = new Image();
var MCCI_image_expanded = new Image();

// CSS classes
var MCCI_class_bullet = 'bullet';
var MCCI_class_collapsed = 'collapsed';
var MCCI_class_expanded = 'expanded';

// menu indent level
var MCCI_menu_indent = 0;

// menu height level (used by netscape to ensure expandable space)
var MCCI_menu_height = 0;

// display title (or name) in status bar
var MCCI_status_display = false;

// repeat links with images/text
var MCCI_repeat_links = false;

// automatically expand (onfocus, onmouseover)
var MCCI_auto_expand = false;
var MCCI_auto_expand_delay = 0;

// collapse other menu trees when expanding
var MCCI_collapse_on_expand = '';

/*
 end MCCI_config.js variables
*/


// menu
var MCCI_menu_tree = new Array();
var MCCI_menu_tree_index = 0;
// caches
var MCCI_image_cache = new Array();
var MCCI_class_cache = new Array();
// auto expand timer
var	MCCI_auto_expand_timer;


// new menu_tree object
function MCCI_menu_node(id, name, url, target, expanded, title, image) {
	this.id			= id.toString();
	this.expanded	= (expanded ? true : false);
	this.name		= name;
	this.url		= (url ? url : null);
	this.title		= (title ? title : name);
	this.target		= (target ? target : null);
	this.tree		= MCCI_menu_tree_index;
	this.expandedi	= (MCCI_image_expanded ? MCCI_find_image(MCCI_image_expanded) : null);
	this.collapsedi	= (MCCI_image_collapsed ? MCCI_find_image(MCCI_image_collapsed) : null);
	this.bulleti	= (MCCI_image_bullet ? MCCI_find_image(MCCI_image_bullet) : null);
	this.expandedc	= (MCCI_class_expanded ? MCCI_find_class(MCCI_class_expanded) : null);
	this.collapsedc	= (MCCI_class_collapsed ? MCCI_find_class(MCCI_class_collapsed) : null);
	this.bulletc	= (MCCI_class_bullet ? MCCI_find_class(MCCI_class_bullet) : null);
}


// adds a node to the end of the menu tree
function MCCI_add_item(level, name, url, target, expanded, title, node) {
	if (!node) {
		if (!MCCI_menu_tree[MCCI_menu_tree_index]) {
			// first item
			MCCI_menu_tree[MCCI_menu_tree_index] = new MCCI_menu_node(0, name, url, target, expanded, title);
			// menu settings
			MCCI_menu_tree[MCCI_menu_tree_index].menu_height = MCCI_menu_height;
			MCCI_menu_tree[MCCI_menu_tree_index].status_display = MCCI_status_display;
			MCCI_menu_tree[MCCI_menu_tree_index].repeat_links = MCCI_repeat_links;
			MCCI_menu_tree[MCCI_menu_tree_index].auto_expand = MCCI_auto_expand;
			MCCI_menu_tree[MCCI_menu_tree_index].auto_expand_delay = MCCI_auto_expand_delay;
			MCCI_menu_tree[MCCI_menu_tree_index].collapse_on_expand = MCCI_collapse_on_expand;
			return;
		} else {
	 		node = MCCI_menu_tree[MCCI_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 MCCI_menu_node(id, name, url, target, expanded, title);
	} else if (node.child) {
		// recurse on next level
		MCCI_add_item(level - 1, name, url, target, expanded, title, node.child);
	} else {
		// new child
		node.child = new MCCI_menu_node(node.id + '-0', name, url, target, expanded, title);
	}
}


// include a class
function MCCI_include_class(i) {
	var cl = MCCI_class_cache[i];
	return (cl ? ' class="' + cl + '"' : '');
}

// include a image
function MCCI_include_image(node, i) {
	var image = MCCI_image_cache[i];
	if (image) {
		var alt = (node.child ? node.name + ' ' + image.alt : image.alt);
		return '<img src="' + image.src + '" ' + (image.width ? 'width="' + image.width + ' ' : '') + (image.height ? 'height="' + image.height + ' ' : '') + 'border="0" alt="' + alt + '" ID="MCCI_' + node.tree + '|' + node.id + '_IMG" />';
	}
	return '';
}
// include a bullet image
function MCCI_include_bullet_image(node) {
	var image = MCCI_include_image(node, node.bulleti);
	// link the image
	if (node.url && MCCI_menu_tree[node.tree].repeat_links) {
		image = MCCI_include_node_link(node, image);
	}
	return image;
}

// include control image
function MCCI_include_control_image(node, image) {
	return MCCI_include_control_link(node, MCCI_include_image(node, image));
}

// include control link
function MCCI_include_control_link(node, text) {
	return '<a href="javascript:MCCI_control_click(' + node.tree + ', \'' + node.id + '\');" title="' + node.title + '" target="_self"' + MCCI_include_behaviours(node) + '>' + text + '</a>';
}

// include behaviours
function MCCI_include_behaviours(node, text) {
	var f = ''; // focus handler
	var f = ''; // blur handler
	var menu = MCCI_menu_tree[node.tree];

	// status
	if (menu.status_display) {
		f = 'window.status = \'' + node.title + '\';';
		b = 'window.status = \'\';';
	}

	// auto expand
	if (menu.auto_expand && node.child) {
		f += 'MCCI_set_auto_expand(' + node.tree + ', \'' + node.id + '\');';
		b += 'MCCI_set_auto_expand();';
	}
	var t = 'return true;';

	return (f ? ' onfocus="' + f + t +'" onblur="' + b + t +'" onmouseover="' + f + t +'" onmouseout="' + b + t +'"' : '');
}

// include a node link
function MCCI_include_node_link(node, display) {
	var text = (display ? display : node.name);
	if (node.url) {
		text = '<a href="' + node.url + '" title="' + node.title + '"' + (node.target ? ' target="' + node.target + '"' : '') + MCCI_include_behaviours(node) + '>' + text + '</a>';
	} else if (node.child && MCCI_menu_tree[node.tree].repeat_links) {
		text = MCCI_include_control_link(node, node.name);
	}

	return text;
}

// include node
function MCCI_include_node(node, cl, i) {
	var	text = '<table border="0" cellpadding="0" cellspacing="0"><tr>';
	text += '<td valign="top">' + i + '&nbsp;</td>';
	text += '<td valign="top"' + MCCI_include_class(cl) + ' id="MCCI_' + node.tree + '|' + node.id + '_CL">' + MCCI_include_node_link(node) + '</td>';
	text += '</tr></table>';

	return text;
}

// find a node with a given id
function MCCI_find_node(tree, id) {
	var node = MCCI_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 MCCI_find_node_name(tree, name) {
	if (!tree) {
		tree = 0;
	}
	return MCCI_find_node_name_in_tree(MCCI_menu_tree[tree], name);
}
function MCCI_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 = MCCI_find_node_name_in_tree(node.child, name);
		if (check) {
			return check;
		}
	}

	// recurse: check next nodes
	if (node.next) {
		var check = MCCI_find_node_name_in_tree(node.next, name);
		if (check) {
			return check;
		}
	}

	return null;
}


// control click to expand/collapse menu
function MCCI_control_click(tree, node, image) {
	node = MCCI_find_node(tree, node);
	MCCI_control_node(node, !node.expanded, image);
}


// expand a node based on name
function MCCI_expand(name, tree) {
	MCCI_control_node(MCCI_find_node_name(tree, name), 1);
}


// expand a node based on id
function MCCI_expand_id(tree, id) {
	MCCI_control_node(MCCI_find_node(tree, id), 1);
}


// collapse a node based on its name
function MCCI_collapse(name, tree) {
	MCCI_control_node(MCCI_find_node_name(tree, name), 0);
}


// expand all folders
function MCCI_expand_all(tree) {
	var collapse_on_expand = MCCI_menu_tree[tree].collapse_on_expand;
	// turn of auto collapsing
	MCCI_menu_tree[tree].collapse_on_expand = false;
	// expand all
	MCCI_expand_tree(MCCI_menu_tree[tree]);
	// restore auto collapsing setting
	MCCI_menu_tree[tree].collapse_on_expand = collapse_on_expand;
}


// expand a menu tree
function MCCI_expand_tree(node) {
	if (node.child) {
		MCCI_expand_tree(node.child);
		MCCI_control_node(node, 1);
	}

	// recurse
	if (node.next) {
		MCCI_expand_tree(node.next);
	}
}


// collapse all folders (exclude node path)
function MCCI_collapse_all(tree, path) {
	MCCI_collapse_tree(MCCI_menu_tree[tree], path);
}


// collapse a menu tree (exclude those in a given path)
function MCCI_collapse_tree(node, path) {
	if (node.child) {
		if (!path || path.id.indexOf(node.id) != 0) {
			MCCI_control_node(node, 0);
		}
		MCCI_collapse_tree(node.child, path);
	}
	// recurse
	if (node.next) {
		MCCI_collapse_tree(node.next, path);
	}
}


// control click to expand/collapse menu
function MCCI_control_node(node, expand) {
	if (expand) {
		if (!node.expanded) {
			// collapse other menus?
			var collapse = MCCI_menu_tree[node.tree].collapse_on_expand;
			if (collapse) {
				// collapse other trees
				if (collapse == 'all') {
					for (var i = 0; i < MCCI_menu_tree.length; i++) {
						if (i != node.tree) {
							MCCI_collapse_all(i);
						}
					}
				}
				// collapse other items within this tree
				MCCI_collapse_all(node.tree, node);
			}
			node.expanded = true;
			MCCI_PF_expand(node);
		}
	} else {
		if (node.expanded) {
			node.expanded = false;
			MCCI_PF_collapse(node);
		}
	}
}


// auto expand
function MCCI_set_auto_expand(tree, node) {
	if (!node && MCCI_auto_expand_timer) {
		clearTimeout(MCCI_auto_expand_timer);
	} else if (MCCI_menu_tree[tree].auto_expand) {
		MCCI_auto_expand_timer = setTimeout('MCCI_expand_id(' + tree + ', \'' + node + '\');', MCCI_menu_tree[tree].auto_expand_delay);
	}
}


// find image - caches images
function MCCI_find_image(image) {
	var i = 0;
	while (i < MCCI_image_cache.length) {
		if (MCCI_image_cache[i].src == image.src) {
			return i;
		}
		i++;
	}
	// cache new image - create copy
	MCCI_image_cache[i] = new Image();
	MCCI_image_cache[i].src = image.src;
	MCCI_image_cache[i].alt = image.alt;
	return i;
}


// find class - caches classes
function MCCI_find_class(name) {
	var i = 0;
	while (i < MCCI_class_cache.length) {
		if (MCCI_class_cache[i] == name) {
			return i;
		}
		i++;
	}
	// cache new class name
	MCCI_class_cache[i] = name;
	return i;
}


// end menu - trigger to create menu on page
function MCCI_end_menu() {
	if (MCCI_menu_tree[MCCI_menu_tree_index]) {
		// root node exists, continue
		MCCI_PF_create_menu(MCCI_menu_tree[MCCI_menu_tree_index]);
		MCCI_menu_tree_index++;
	}
}
