function setAttributes(element, attributes){
	if(element == null){
		alert(attributes);
	}
	// element is the DOM element, not the ID or anything like that.
	// attributes is an object whose name-value pairs are the attribute name and attribute value.
	var attributelist = attributes.split(/;/);
	var attributeparts;
	for(var i=0; i<attributelist.length; i++){
		attributeparts = attributelist[i].split(/:/);
		element.setAttribute(attributeparts[0], attributeparts[1]);
	}
}

function setStyles(element, attributes){
	// element is the DOM element, not the ID or anything like that.
	// attributes is an object whose name-value pairs are the attribute name and attribute value.
	var attributelist = attributes.split(/;/);
	var attributeparts;
	for(var i=0; i<attributelist.length; i++){
		attributeparts = attributelist[i].split(/:/);
		element.style[attributeparts[0]] = attributeparts[1];
	}
}

var menus__nextid=0;
function getNextId(){
	menus__nextid++;
	return(menus__nextid);
}

var availablemenus = [];
var menuspeed = 90;
function renderMenu(targetnode, menudata, options){
	availablemenus[availablemenus.length] = [targetnode, menudata, options];
	addEvent(window, 'load', function(e){
		for(var i=0; i<availablemenus.length; i++){
			renderMenuNow(document.getElementById(availablemenus[i][0]), availablemenus[i][1], availablemenus[i][2]);
		}
	});
}

function renderMenuNow(targetnode, menudata, opt){
	var options;
	if(typeof(opt)=='undefined'){
		options = {'toplevelorientation':'horizontal'};
	}else{
		options = opt;
	}
	if(typeof(options['width'])=='undefined'){
		options['width'] = '100%';
	}
	if(typeof(options['fixedwidthmenus'])=='undefined'){
		options['fixedwidthmenus'] = '1';
	}
	if(typeof(options['height'])=='undefined'){
		options['height'] = '30px';
	}

	var maintable = document.createElement('TABLE');
	setStyles(maintable, 'borderCollapse:collapse;height:'+options['height']+';width:'+options['width']+';border:0px');
	maintable.className = 'menuHeaderTable';
	setAttributes(maintable, 'cellpadding:0;cellspacing:0');
	if(options['toplevelorientation'] == 'horizontal'){
		var toptr = maintable.insertRow(-1);
		var bottomtr = maintable.insertRow(-1);
		for(var i=0; i<menudata.length; i++){
			var toptd = toptr.insertCell(-1);
			toptd.setAttribute('xtype','xtoptd');
			setStyles(toptd, "padding:0px;margin:0px;border:0px");
			var toptddiv = document.createElement('DIV');
			toptd.appendChild(toptddiv);
			var toptddivcontents = document.createElement('DIV');
			toptddiv.appendChild(toptddivcontents);
			toptddivcontents.className = 'menuHeaderItem menuHeaderItemInactive';
			if(options['fixedwidthmenus']==1){
				setStyles(toptd, 'width:'+(Math.round(100/menudata.length))+'%');
			}
			setStyles(toptddiv, 'width:100%;height:'+options['height']+';position:relative;display:block;margin:0px;border:0px solid yellow');
			toptddivcontents.innerHTML = menudata[i]['display'];
			setAttributes(toptddivcontents, 'xtype:toptddivcontents;id:toptddivcontents_'+i);
			setStyles(toptddivcontents, "margin:0px;border:0px");
			var bottomtd = bottomtr.insertCell(-1);
			setAttributes(bottomtd, 'valign:top');
			var bottomtddiv = document.createElement('DIV');
			var menuid = 'submenu_'+getNextId();
			setAttributes(bottomtddiv, 'xtype:submenucontainer;id:'+menuid+';xlevel:0;xordinal:'+i);
			setStyles(bottomtddiv, 'display:none;position:relative;padding:0px;margin:0px;border:0px solid green;zIndex:1000');
			bottomtd.appendChild(bottomtddiv);
			if(typeof(menudata[i]['submenu'])!='undefined'){
				setAttributes(toptddiv, 'submenuid:'+menuid);
				renderSubmenu(bottomtddiv, menudata[i]['submenu'], menuid);
				
				addEvent(toptddiv, 'mouseover', function(e){
					var elem=eventToElement(e);
					while(elem.getAttribute('submenuid') == null && elem.tagName != 'BODY'){
						elem = elem.parentNode;
					}
					var elems = elem.getElementsByTagName('DIV');
					for(var j=0; j<elems.length; j++){
						var thiselem = elems.item(j);
						if(thiselem.getAttribute('xtype') == 'toptddivcontents'){
							thiselem.className = 'menuHeaderItem menuHeaderItemActive';
						}
					}
					setStyles(document.getElementById(elem.getAttribute('submenuid')), 'display:block');
					clearTimeout(hidemenutimers[elem.getAttribute('submenuid')]);
				});
				
				addEvent(toptddiv, 'mouseout', function(e){
					var elem=eventToElement(e);
					while(elem.getAttribute('submenuid') == null && elem.tagName != 'BODY'){
						elem = elem.parentNode;
					}
					elems = elem.getElementsByTagName('DIV');
					for(var j=0; j<elems.length; j++){
						if(elems.item(j).getAttribute('xtype') == 'toptddivcontents'){
							elems.item(j).className = 'menuHeaderItem menuHeaderItemInactive';
						}
					}
					clearTimeout(hidemenutimers[elem.getAttribute('submenuid')]);
					hidemenutimers[elem.getAttribute('submenuid')] = setTimeout("document.getElementById('"+elem.getAttribute('submenuid')+"').style.display = 'none'", menuspeed);
				});
				
			}
			if(typeof(menudata[i]['link'])!='undefined'){
				toptddiv.setAttribute('xlink',menudata[i]['link']);
				if(typeof(menudata[i]['target'])!='undefined' && menudata[i]['target']=="_NEW"){
					toptddiv.setAttribute('xtarget',menudata[i]['target']);
				}
				addEvent(toptddivcontents, 'click', function(e){
					var elem = eventToElement(e);
					while(elem.getAttribute('xlink') == null && elem.tagName != 'BODY'){
						elem = elem.parentNode;
					}
					killAncestors(elem);
					if(elem.getAttribute('xtarget') != null && elem.getAttribute('xtarget') == '_NEW'){
						window.open(elem.getAttribute('xlink'));
					}else{
						document.location = elem.getAttribute('xlink');
					}
				});
				addEvent(toptddiv, 'mouseover', function(e){
					var elem=eventToElement(e);
					while(elem.getAttribute('xlink') == null && elem.tagName != 'BODY'){
						elem = elem.parentNode;
					}
					elems = elem.getElementsByTagName('DIV');
					for(var j=0; j<elems.length; j++){
						if(elems.item(j).getAttribute('xtype') == 'toptddivcontents'){
							elems.item(j).className = 'menuHeaderItem menuHeaderItemActive';
						}
					}
				});
				addEvent(toptddiv, 'mouseout', function(e){
					var elem=eventToElement(e);
					while(elem.getAttribute('xlink') == null && elem.tagName != 'BODY'){
						elem = elem.parentNode;
					}
					elems = elem.getElementsByTagName('DIV');
					for(var j=0; j<elems.length; j++){
						if(elems.item(j).getAttribute('xtype') == 'toptddivcontents'){
							elems.item(j).className = 'menuHeaderItem menuHeaderItemInactive';
						}
					}
				});
			}
		}
	}else if(options['toplevelorientation'] == 'vertical'){
		// Make a vertical top-level menu. Not needed now, so put this off...
	}
	targetnode.appendChild(maintable);
}

var hidemenutimers = [];

function renderSubmenu(targetnode, menudata, parentid, level){
	if(typeof(level) == 'undefined'){
		level = 1;
	}
	var maintable = document.createElement('TABLE');
	var classes = 'submenuTable';
	if(level == 1){
		classes += ' level'+level+'Submenu';
	}
	for(var i=0; i<menudata.length; i++){
		var toptr = maintable.insertRow(-1);
		var lefttd = toptr.insertCell(-1);
		setStyles(lefttd, 'padding:0px;margin:0px;border:0px');
		var lefttddiv = document.createElement('DIV');
		lefttd.appendChild(lefttddiv);
		var lefttddivcontents = document.createElement('DIV');
		lefttddiv.appendChild(lefttddivcontents);
		positionalclass = '';
		if(i==0){
			positionalclass = 'submenuFirstItem';
		}
		if(i==menudata.length-1){
			positionalclass = 'submenuLastItem';
		}
		lefttddivcontents.className = 'submenuItem '+positionalclass+' submenuItemInactive';
		setStyles(lefttddiv, 'width:100%;height:100%;position:relative;display:block;padding:0px;margin:0px;marginTop:-1px;border:0px');
		var menuid = 'submenu_'+getNextId();
		setAttributes(lefttddivcontents, 'xtype:lefttddivcontents');
		setAttributes(lefttddiv, 'parentid:'+parentid+';submenuid:'+menuid+';positionalclass:'+positionalclass);
		lefttddivcontents.innerHTML = menudata[i]['display'].replace(' ', '&nbsp;');
		
		addEvent(lefttddiv, 'mouseover', function(e){
			var elem = eventToElement(e);
			while(elem.getAttribute('parentid') == null && elem.tagName != 'BODY'){
				elem = elem.parentNode;
			}
			document.getElementById(elem.getAttribute('submenuid')).style.display = 'block';
			preserveAncestors(elem.getAttribute('submenuid'));
			elems = elem.getElementsByTagName('DIV');
			for(var j=0; j<elems.length; j++){
				if(elems.item(j).getAttribute('xtype') == 'lefttddivcontents'){
					elems.item(j).className = 'submenuItem '+elem.getAttribute('positionalclass')+' submenuItemActive';
				}
			}
		});
		
		addEvent(lefttddiv, 'mouseout', function(e){
			var elem = eventToElement(e);
			while(elem.getAttribute('parentid') == null && elem.tagName != 'BODY'){
				elem = elem.parentNode;
			}
			elems = elem.getElementsByTagName('DIV');
			for(var j=0; j<elems.length; j++){
				if(elems.item(j).getAttribute('xtype') == 'lefttddivcontents'){
					elems.item(j).className = 'submenuItem '+elem.getAttribute('positionalclass')+' submenuItemInactive';
				}
			}
			hidemenutimers[elem.getAttribute('submenuid')] = setTimeout("document.getElementById('"+elem.getAttribute('submenuid')+"').style.display = 'none'", menuspeed);
			killAncestors(elem.getAttribute('parentid'));
		});
		
		righttd = toptr.insertCell(-1);
		var righttddiv = document.createElement('DIV');
		righttd.appendChild(righttddiv);
		setStyles(righttd, 'padding:0px;margin:0px;border:0px');
		setAttributes(righttd, 'valign:top;submenuid:'+menuid);
		setStyles(righttddiv, 'position:relative;display:none;padding:0px;margin:0px;border:0px');
		setAttributes(righttddiv, 'xtype:submenucontainer;id:'+menuid+';xlevel:'+level);
		if(typeof(menudata[i]['submenu'])!='undefined'){
			renderSubmenu(righttddiv, menudata[i]['submenu'], menuid, level + 1);
		}
		if(typeof(menudata[i]['link'])!='undefined'){
			if(typeof(menudata[i]['target'])!='undefined' && menudata[i]['target']=="_NEW"){
				lefttddiv.setAttribute('xtarget',menudata[i]['target']);
			}
			lefttddiv.setAttribute('xlink',menudata[i]['link']);
			addEvent(lefttddivcontents, 'click', function(e){
				var elem = eventToElement(e);
				while(elem.getAttribute('xlink') == null && elem.tagName != 'BODY'){
					elem = elem.parentNode;
				}
				killAncestors(elem.getAttribute('parentid'));
				if(elem.getAttribute('xtarget') != null && elem.getAttribute('xtarget') == '_NEW'){
					window.open(elem.getAttribute('xlink'));
				}else{
					document.location = elem.getAttribute('xlink');
				}
			});
		}
	}
	setAttributes(maintable, 'cellpadding:0;cellspacing:0;border:0;id:submenu_in_'+parentid);
	setStyles(maintable, 'borderCollapse:collapse;position:absolute;top:0px;zIndex:3;display:block;padding:0px;margin:0px;border:0px');
	maintable.className = classes;
	targetnode.appendChild(maintable);
}

function preserveAncestors(childid){
	var node=document.getElementById(childid);
	var level = -1;
	while(node.parentNode != null && node.tagName != 'BODY'){
		if(typeof(node.getAttribute('xtype')) != 'undefined' && node.getAttribute('xtype') == 'submenucontainer'){
			clearTimeout(hidemenutimers[node.id]);
			var tempnode = node;
			while(tempnode.parentNode != null && tempnode.tagName != 'BODY' && tempnode.tagName != 'TD'){
				tempnode = tempnode.parentNode;
			}
			if(tempnode.tagName == 'TD' && tempnode.childNodes[0].getAttribute('xlevel')!=null){
				level = parseInt(tempnode.childNodes[0].getAttribute('xlevel'), 10);
				ordinal = parseInt(tempnode.childNodes[0].getAttribute('xordinal'), 10);
				if(level == 0){
					while(tempnode.tagName != 'TABLE' && tempnode.tagName != 'BODY'){
						tempnode = tempnode.parentNode;
					}
					tempnode = tempnode.rows[0].cells[ordinal];
					tempnode.childNodes[0].childNodes[0].className = 'menuHeaderItem menuHeaderItemActive';
				}else{
					tempnode = tempnode.parentNode.childNodes[0];
					tempnode.childNodes[0].childNodes[0].className = 'submenuItem submenuItemActive';
				}
			}
		}
		node = node.parentNode;
	}
}

function killAncestors(childid){
	var node=document.getElementById(childid);
	if(node == null){
		return;
	}
	while(node.parentNode != null && node.tagName != 'BODY'){
		if(typeof(node.getAttribute('xtype')) != 'undefined' && node.getAttribute('xtype') == 'submenucontainer'){
			hidemenutimers[node.id] = setTimeout("document.getElementById('"+node.id+"').style.display = 'none'", menuspeed);
			var tempnode = node;
			while(tempnode.parentNode != null && tempnode.tagName != 'BODY' && tempnode.tagName != 'TD'){
				tempnode = tempnode.parentNode;
			}
			if(tempnode.tagName == 'TD' && tempnode.childNodes[0].getAttribute('xlevel')!=null){
				level = parseInt(tempnode.childNodes[0].getAttribute('xlevel'), 10);
				ordinal = parseInt(tempnode.childNodes[0].getAttribute('xordinal'), 10);
				if(level == 0){
					while(tempnode.tagName != 'TABLE' && tempnode.tagName != 'BODY'){
						tempnode = tempnode.parentNode;
					}
					tempnode = tempnode.rows[0].cells[ordinal];
					tempnode.childNodes[0].childNodes[0].className = 'menuHeaderItem menuHeaderItemInactive';
				}else{
					tempnode = tempnode.parentNode.childNodes[0];
					tempnode.childNodes[0].childNodes[0].className = 'submenuItem submenuItemInactive';
				}
			}
		}
		node = node.parentNode;
	}
}

