function DropDownMenu(menuData) {
	this.data = menuData;
	
	var aryMenuData = this.data.substring(0, this.data.indexOf('[')).split(':');
	this.itemClass = aryMenuData[0];
	this.itemSemiBrightClass = aryMenuData[1];
	this.itemBrightClass = aryMenuData[2];
	this.closeTimeout = aryMenuData[3];
	
	function unescapeText(text) {
		return text.replace(/&amp;#91;/g, "[").replace(/&amp;#93;/g, "]").replace(/&amp;#39;/g, "'").replace(/&amp;#124;/g, "|").replace(/&amp;#58;/g, ":");
	}
	
	function getNodeData(strData) {
		var nodeData;
		
		if(strData.charAt(0) == "i") {
			var aryNodeData = strData.substring(0, strData.indexOf('[')).split(':');
			nodeData = {
				type:aryNodeData[0],
				text:unescapeText(aryNodeData[1]),
				iconURL:aryNodeData[2],
				linkURL:unescapeText(aryNodeData[3]),
				isDisabled:aryNodeData[4] == 'true',
				nodeID:aryNodeData[5],
				childrenHaveIcons:aryNodeData[6] == 'true'
			};
		} else {
			var aryNodeData = strData.split(':');
			nodeData = {
				type:aryNodeData[0],
				id:aryNodeData[1]
			};
		}
				
		return nodeData;
	}
	
	function getChildHTML(nodeID, strData, blnChildrenHaveIcons, depth) {
		var strChildren = strData.substring(strData.indexOf('[') + 1, strData.lastIndexOf(']'));
		var html = "";
		
		if (strChildren.length > 0) {
			var aryChildren = strChildren.split('|' + nodeID + '|');
		
			//length - 1 as there's always a delimeter at the end
			for(var i = 0; i < aryChildren.length - 1; i++) {
				var nodeData = getNodeData(aryChildren[i]);
				if(nodeData.type == "s") {
					html += "<tr id=\""+ nodeData.id +"\">";
					if(blnChildrenHaveIcons) {
						html += "<td class=\"t_iconcol\"/><td class=\"t_separator_horizontal\" colspan=\"2\"><div class=\"t_separator_horizontal\"><img src=\"/images/shim.gif\"/></div></td>";
					} else {
						html += "<td class=\"t_separator_horizontal\" colspan=\"3\"><div class=\"t_separator_horizontal\"><img src=\"/images/shim.gif\"/></div></td>";
					}
					html += "<td height=\"1\"></td></tr>";
				} else {
					html += getHTML(nodeData, aryChildren[i], blnChildrenHaveIcons, depth + 1);
				}
			}
		}
		
		return html;
	}
	
	function getHTML(nodeData, strData, blnIcons, depth) {
			
		var html = "";
		
		//html before children
		html += "<tr id=\"b"+ nodeData.nodeID +"\" ";
		if(nodeData.isDisabled) {
			html += "title=\"You must log in to use this feature\" class=\"t_disabled\" ";
		} else {
			html += "class=\"t\" ";
			html += "onclick=\"ddmenu_onclick('"+ nodeData.linkURL +"', '"+ nodeData.nodeID +"', event)\" ";
		}
		html += "onmouseout=\"mo(event)\" ";
		html += "onmouseover=\"mi('"+ nodeData.nodeID +"', event)\" ";
		html += ">";
		if(blnIcons) {
			html += "<td class=\"t_iconcol\" width=\"30\">";
			if(nodeData.iconURL.length > 0) {
				html += "<img src=\""+ nodeData.iconURL +"\" hspace=\"2\"/>"
			} else {
				html += "&#160;&#160;&#160;&#160;&#160;";
			}
			html += "</td>";
		} else {
			html += "<td class=\"t_indentcol\">&#160;</td>";
		}
		html += "<td class=\"t\"><div class=\"t\">"+ nodeData.text.replace(/ /g, "&nbsp;") +"</div></td>";
		
		if(depth < 4) {
			var childHtml = getChildHTML(nodeData.nodeID, strData, false, depth);			
		} else {
			var childHtml = "";
		}
		var blnHasChildren = childHtml.length > 0;
		html += "<td class=\"t\">"+ (blnHasChildren ? "&#187;&#160;" : "") +"</td>";
		html += "<td valign=\"top\" class=\"t\">";
		if(blnHasChildren) {
			html += "<div class=\"tav\" id=\""+ nodeData.nodeID +"\">";
			html += "<table class=\"t\">"+ childHtml +"</table>";
			html += "</div>";
		}
		html += "</td>";
		
		html += "</tr>";
		
		return html;
	}
	
	function getEvent(e, w) {
		var event;
		if (w.event) {
			event = w.event;
		} else if (e) {
			event = e;
		}
		return event;
	}
	
	function attachEvents(elem, nodeData) {
		elem.onmouseout = function(e) { mo(getEvent(e,window)); };
		elem.onmouseover = function(e) { mi(nodeData.nodeID, getEvent(e,window)); };
		elem.onclick = function(e) { ddmenu_onclick(nodeData.linkURL, nodeData.nodeID, getEvent(e,window)) };
	}
	
	this.buildMenu = function() {
		var strTopLevel = this.data.substring(this.data.indexOf('[') + 1, this.data.lastIndexOf(']'));
		if (strTopLevel.length > 0) {
			var aryTopLevel = strTopLevel.split('|m|');
		
			//length - 1 as there's always a delimeter at the end
			for(var i = 0; i < aryTopLevel.length - 1; i++) {
				var nodeData = getNodeData(aryTopLevel[i]);
				if(nodeData.type == "s") {
					//separator - ignore
				} else {
					//top level menu element, attach the javascript to the right part of the page
					var div = document.getElementById("b" + nodeData.nodeID).firstChild;
					attachEvents(div, nodeData);
					document.getElementById(nodeData.nodeID).innerHTML = "<table class=\"t\" cellspacing=\"0\">" + getChildHTML(nodeData.nodeID, aryTopLevel[i], nodeData.childrenHaveIcons, 1) + "</table>";
				}
			}
		}
	};
	
	this.buildMenu();
	
}

var closeTimer;

function mi(id, event) {
	event.cancelBubble = true;
	close_children(removeLastSuffix(id));
	var btn = document.getElementById("b"+id);
	if(btn.className != "t_disabled")
		if(btn.tagName == "TR")
			btn.className = "t_hi";
		else
			btn.className = "t_horizontal_hi";

	var child = document.getElementById(id);
	if(child)
		child.style.display = 'block';
		
	if(closeTimer)
		clearTimeout(closeTimer);
		
	showSelectBoxes(false);
}

function mo(event) {
	closeTimer = setTimeout("closeTimeoutHit()", 500);
	event.cancelBubble = true;
}

function closeTimeoutHit() {
	close_children('m');
	showSelectBoxes(true);
}

function close_children(id) {
	var i = 1;
	var btn;
	while(btn = document.getElementById("b"+id+"_"+i)) {
		var child = document.getElementById(id+"_"+i);
		if(child)
			if(child.style.display == 'block') {
				close_children(child.id);
				child.style.display = "none";
			}

		if((btn.className == "t_hi") || (btn.className == "t_horizontal_hi"))
			if(btn.tagName == "TR")
				btn.className = "t";
			else
				btn.className = "t_horizontal";
		i++;
		if(i>200)break;
	}
}

function removeLastSuffix(str) {
	var i = str.length - 1;
	while(str.charAt(i) != "_") {
		i -= 1;
		if(i<0)break;
	}
		
	return str.substring(0, i);
}

function ddmenu_onclick(url, id, event) {
	var child = document.getElementById(id);
	if(child && child.style.display !== 'block') {
		mi(id, event);
	} else {
		go_abs(url, event);
	}
}

function go_abs(url, event) {
	closeTimeoutHit();
	event.cancelBubble = true;

	document.location.href = url;
}
