function Menu(sId) {
	this.id = sId;		// Id of each Menu control; must be unique for each instance!
}


Menu.menus = new Array();	// keeps list

Menu.getById = function (sMenuId) {	// factory method
	var menu = Menu.menus.getById(sMenuId);
	if(!menu) {
		menu = Menu.create(sMenuId);
	}
	
	return menu;
}

Menu.create = function (sMenuId) {
	var menu = new Menu(sMenuId);
	Menu.menus.push(menu);
	return menu;
}

// Menu should be a subclass of parent "Handler"
Menu.addAction = function (sAction, fnAction) {
	this[sAction] = new Action(this, fnAction, sAction);
}

Menu.addAction('expand',
	function (event, tag, handler) {
		// collapse any other submenus, siblings to this
		var parentNode = tag.parentNode;
		var lis = parentNode.childNodes;
		for(var iLi = lis.length - 1; iLi >= 0; iLi--) {
			var li = lis[iLi];
			if(li != tag) {
				var uls = callGetBySelector(li, 'ul');
				for(var iUl = uls.length - 1; iUl >= 0; iUl--) {
					uls[iUl].style.display = '';
				}
			}
		}
	
		// expand this UL (this submenu)
		var uls = callGetChildTags(tag, 'ul');
		if(uls.length == 1) {
			uls[0].style.display = 'block';
		} else if(uls.length > 1) {
			throw "More than 1 submenu (UL) in this LI tag! " + uls.length + " ULs found.";
		}
		
		return false;
	}
);

Menu.addAction('collapseAll',
	function (event, tag, handler) {
		var uls = document.getBySelector('ul.menu ul');
		for(var iUl = uls.length - 1; iUl >= 0; iUl--) {
			uls[iUl].style.display = 'none';
		}
		
		return true;
	}
);

Menu.addAction('passThrough',
	function (event, tag, handler) {
		return true;
	}
);

p = Menu.prototype;