function PopupMenu (button, menu) {
	
	var canBeDismissed = false;
	
	// Initialize animation
	var anim = new AnimationTimeline();
	
	// Add events
	button.onmousedown = ToggleMenu;
	menu.onmouseover = function () { canBeDismissed = false; return true; }
	menu.onmouseout = function () { canBeDismissed = true; return true; }
	menu.hide = HideMenu;
	menu.reset = ResetMenu;
	document.onmouseup = DismissCheck;
	var menuLinks = menu.getElementsByTagName("a");
	for (var i = 0; i < menuLinks.length; i++) {
		// Menu links should activate on mouseup
		menuLinks[i].onclick = function() { return false; }
		menuLinks[i].onmouseup = LinkClicked;
		menuLinks[i].highlight = menuLinks[i].onmouseover = Highlight;
		menuLinks[i].unhighlight = menuLinks[i].onmouseout = Unhighlight;
		menuLinks[i].gotoLink = GotoLink;
		menu.reduceOpacity = ReduceOpacity;
	}
	
	// Disable text selection in IE
	button.onselectstart = function() { return false; }
	
	function ToggleMenu () {
		if (this.className == "on") {
			HideMenu();
		} else {
			ShowMenu();
		}
		return false;	// Disable text selection in Mozilla
	}
	
	function ShowMenu () {
		button.className = "on";
		menu.className = "visible";
	}
	
	function HideMenu () {
		menu.style.opacity = 1;
		opacityCallback = new Callback(menu, "reduceOpacity");
		for (i = 0; i < 5; i++) {
			anim.QueueEvent(opacityCallback, 30);
		}
		resetCallback = new Callback(menu, "reset");
		anim.QueueEvent(resetCallback, 30);
		canBeDismissed = false;
	}
	
	function ResetMenu () {
		button.className = "off";
		this.className = "invisible";
		this.style.opacity = 1;
		this.style.filter = 'alpha(opacity = 100)';
		anim.Clear();
	}
	
	function LinkClicked() {
		// Blink selected menu item
		this.unhighlight();
		var highlightCallback = new Callback(this, "highlight");
		var unhighlightCallback = new Callback(this, "unhighlight");
		anim.QueueEvent(highlightCallback, 60);
		anim.QueueEvent(unhighlightCallback, 60);
		anim.QueueEvent(highlightCallback, 60);
		
		// Fade out
		menu.hide();

		// Go to link
		var gotoLinkCallback = new Callback(this, "gotoLink");
		anim.QueueEvent(gotoLinkCallback, 0);
		return true;
	}
	
	function Highlight() {
		this.className = "hover";
	}
	
	function Unhighlight() {
		this.className = "normal";
	}
	
	function ReduceOpacity() {
		this.style.opacity = this.style.opacity * 0.5;
		this.style.filter = 'alpha(opacity = '+ this.style.opacity * 100 +')';
	}
	
	function GotoLink() {
		location.href = this.href;
	}
	
	function DismissCheck() {
		if (canBeDismissed) {
			menu.hide();
		}
	}
	
}
