NavTree = function (id, nodeClass, treeClass, closedClass, selectedClass, href) {
	nodeClass = nodeClass || 'node';
	treeClass = treeClass || 'tree';
	closedClass = closedClass || 'node-closed';
	selectedClass = selectedClass || 'node-selected';
	href = href || location.protocol +'//'+ location.hostname + location.pathname + location.search;
	NavTree.search($(id), nodeClass, treeClass, closedClass, selectedClass, href);
};

NavTree.search = function (element, nodeClass, treeClass, closedClass, selectedClass, href, root) {
	for (var c in element.childNodes) {
		var child = element.childNodes[c];
		if (child.nodeType == 1) {
			var classes = new ClassList(child);
			if (!node) {
				if (classes.match(nodeClass)) {
					var node = child;
				}
			} else {
				if (classes.match(treeClass)) {
					new NavTree.Node(node, child, nodeClass, closedClass, selectedClass, href, root);
					root = true;
				}
			}
			NavTree.search(child, nodeClass, treeClass, closedClass, selectedClass, href, root);
		}
	}
};

NavTree.Node = function (element, tree, nodeClass, closedClass, selectedClass, href, root) {
	this.treeElement = tree;
	this.closedClass = closedClass;
	this.selectedClass = selected;
	extend(element, this);
	new Listener(element, 'click', this.toggleTree, element);
	
	var selected = false;
	var links = Array.fromNodeList(element.getElementsByTagName('a'));
	links = links.concat(Array.fromNodeList(tree.getElementsByTagName('a')));
	for (var l in links) {
		var link = links[l];
		if (link.href == href) {
			var node = getParentByClass(nodeClass, link)
			if (node) {
				var classes = new ClassList(node);
				classes.add(selectedClass);
			}
			selected = true;
			break;
		}
	}
	if (!selected && root) {
		element.toggleTree();
	}
};

NavTree.Node.prototype = {
	
	toggleTree: function (e) {
		var classes = new ClassList(this);
		if (this.treeElement.style.display) {
			this.treeElement.style.display = '';
			classes.del(this.closedClass);
		} else {
			this.treeElement.style.display = 'none';
			classes.add(this.closedClass);
		}
	}
	
};
