var FolderController = function(model) {
	this.model = model;
}

FolderController.prototype = {
	model : null,

	toggleNode : function(node) {
		node.collapsed = !node.collapsed;
	},

	selectNode : function(node) {
		var selected = this.findSelectedNode();
		if(selected)
			selected.selected = false;
		var editing = this.findEditingNode();
		if(editing)
			editing.editing = false;
		if(node)
			node.selected = true;
	},

	addNode : function() {
		var parent = this.findSelectedNode();
		var newChild = { name: "New folder", children: [] };
		parent.children[parent.children.length] = newChild;
		this.selectNode(newChild);
		this.renameNode(newChild);
	},

	deleteNode : function() {
		var node = this.findSelectedNode();
		var parent = this.findParent(node);
		if(parent)
			for(var i = 0; i < parent.children.length; i++)
				if(parent.children[i] == node)
					parent.children.splice(i, 1);
	},

	renameNode : function() {
		this.findSelectedNode().editing = true;
	},

	applyRename : function(newName) {
		var node = this.findSelectedNode();
		node.name = newName;
		node.editing = false;
	},
	
	findSelectedNode : function() {
		return this.findNode(this.model, function(node) { return node.selected; });
	},

	findEditingNode : function() {
		return this.findNode(this.model, function(node) { return node.editing; });
	},

	findNode : function(root, criteria) {
		if(criteria(root)) return root;
		for(var i = 0; i < root.children.length; i++) {
			var match = this.findNode(root.children[i], criteria);
			if(match) return match;
		}
		return null;
	},

	findParent : function(node, root) {
		if(!root) root = this.model;
		for(var i = 0; i < root.children.length; i++)
			if(root.children[i] == node)
				return root;
		for(var i = 0; i < root.children.length; i++) {
			var parent = this.findParent(node, root.children[i]);
			if(parent) 
				return parent;
		}	
		return null;
	}	
};

