var DropdownMenu = {
	init: function(rootNode, transitionFuncs) {
		//console.log('DropdownMenu.init --- rootNode:');console.log(rootNode);
		var rootULs = DOM.getChildren(rootNode, { tagName:'ul' });
		var links = [];
		var getLinkSubmenu = function(){};
		var toggleSubmenu = function(){};
		//console.log('DropdownMenu.init --- rootULs:');console.log(rootULs);
		if (rootULs.length > 0) {
			DropdownMenu.setSubmenuIndexes(rootULs[0], 0, 0);
			links = rootNode.getElementsByTagName('a');
			var submenus = rootNode.getElementsByTagName('ul');
			getLinkSubmenu = function(link) {
				return DOM.getNextElement(link);
			};
			//var hideSubmenu = function(submenu
			toggleSubmenu = function(submenu, link) {
				//console.log('showSubmenu --- submenu:');console.log(submenu);
				if (DOM.hasClass(submenu, 'selected')) {
					DOM.removeClass(submenu, 'selected');
					transitionFuncs.hideSubmenu(submenu)
					if (submenu.getAttribute('data-depth') !== '0') {
						DOM.addClass(submenu.parentNode.parentNode, 'selected');
					}
				}
				else {
					var newIndexes = DropdownMenu.getSubmenuIndexes(submenu);
					var oldSubmenu = List.select(submenus, function(s) { return DOM.hasClass(s,'selected'); });
					if (oldSubmenu.length > 0) {
						oldSubmenu = oldSubmenu[0];
						DOM.removeClass(oldSubmenu, 'selected');
						oldIndexes = DropdownMenu.getSubmenuIndexes(oldSubmenu);
						for (var i = 0; i < newIndexes.length && i < oldIndexes.length; i++) {
							if (newIndexes[i] !== oldIndexes[i]) {
								oldSubmenu = DropdownMenu.getSubmenuByIndexes(submenus, oldIndexes.slice(0, i + 1));
								transitionFuncs.hideSubmenu(oldSubmenu);
							}
						}
					}
					DOM.addClass(submenu, 'selected');
					transitionFuncs.showSubmenu(submenu);
				}
			};
		}
		return {
			links: links,
			getLinkSubmenu: getLinkSubmenu,
			toggleSubmenu: toggleSubmenu
		};
	},

	setSubmenuIndexes: function(menuUL, depth, index, previousSubmenuIndexes) {
		//console.log('setSubmenuIndexes --- menuUL:');console.log(menuUL);
		menuUL.setAttribute('data-depth', depth);
		var submenuIndexes = previousSubmenuIndexes === undefined ? index : previousSubmenuIndexes + '-' + index;
		menuUL.setAttribute('data-indexes', submenuIndexes);
		List.walk(DOM.getChildren(menuUL, { tagName:'LI' }), function(LI, linkIndex) {
			List.walk(DOM.getChildren(LI, { tagName:'UL' }), function(UL) {
				//console.log('setSubmenuIndexes --- UL:');console.log(UL);
				DropdownMenu.setSubmenuIndexes(UL, depth + 1, linkIndex, submenuIndexes);
			});
		});
	},

	getSubmenuIndexes: function(submenu) {
		return List.map(submenu.getAttribute('data-indexes').split('-'), function(index) {
			return parseInt(index, 10);
		});
	},

	getSubmenuByIndexes: function(submenus, indexes) {
		var depth = indexes.length - 1;
		submenu = List.select(submenus, function(s) {
			return s.getAttribute('data-depth') === depth.toString() && s.getAttribute('data-indexes') === indexes.join('-');
		});
		return submenu.length > 0 ? submenu[0] : null;
	}
};

