function Menu(sId) {
	this.id = sId;		// Id of each Menu control; must be unique for each instance!
}


Menu.menus = new Array();	// keeps list
Menu.logString = '';

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;
}


/* Actions */
Menu.expand = function (ntevent, ev, tag) {
	// 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 = 'none';
			}
		}
	}

	// 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.collapse = function (ntevent, ev, tag) {
	tag.style.display = '';
	return true;
}

Menu.collapseAll = function (ntevent, ev, tag) {
	var uls = document.getBySelector('ul.menu ul');
	for(var iUl = uls.length - 1; iUl >= 0; iUl--) {
		uls[iUl].style.display = 'none';
	}
	
	return true;
}

Menu.passThru = function (ntevent, ev, tag) {
	return true;
}

Menu.logEvent = function (ntevent, ev, tag, options) {
	var sLog = ntevent.getString();

	if(event) {
		var sTagName = new String(event.srcElement.tagName);
		sLog += ' <' + sTagName.toLowerCase() + '>' + '\n';
	}
	
	Menu.logString = sLog + Menu.logString;
	
	if(options) {	// write log to optional div
		var div = document.getElementById(options);
		if(div)
			div.innerText = Menu.logString;
	}
	return true;
}
