/*
	Copyright (c) 2006-2009, ePages GmbH
	All Rights Reserved.

	epages.cartridges.de_epages.mediagallery.widget.Filetree

*/
dojo.provide("epages.cartridges.de_epages.mediagallery.widget.Filetree");
dojo.require("dijit.Tree");
dojo.require("epages.io.json");
dojo.require("epages.lang.hash");
dojo.require("epages.widget");
dojo.require("epages.event");

dojo.declare(
	"epages.cartridges.de_epages.mediagallery.widget.Filetree",
	[dijit.Tree],
	{
		/**
		* public properties
		*/
		listId            : "",
		viewAction        : "JSONViewResponse",
		url               : "?",
		directory         : 'MediaGallery',
		label             : 'Files',
		persist            : false,
		/**
		* private properties
		*/
		_currentDirectory : undefined,
		_lastSelectedNode : undefined,
		/**
		* public methods
		*/
		postCreate  : function() {
			this.inherited("postCreate", arguments);
			this._currentDirectory = this.directory;
			this.rootNode.item.id = this.directory;
			this.rootNode.item.directory = this.directory;
			if (this.listId != "") {
				dojo.subscribe(this.listId + '/rename', this.model.store, 'renameFile');
			}
		},

		_getFileList : function(directory) {
			var files =  this.model.store.getFiles(directory);
			return files;
		},

		onClick: function(item, node){
			if(item && item.children !== undefined){
				this._expandNode(node);
			}
			if(this.lastFocused === undefined){ 
				this.lastFocused = node;
			}
			//check if title of tree was clicked and load files if neccessary
			var directory = undefined;
			if(item && item.root == true){
				var files = this._getFileList(this.directory);
				if(this.listId != ""){
					var filelist = $$(this.listId);
					if(files){
					filelist.setChildren(files);
				}
					else{
						filelist.setChildren([]);
					}
				}
				this._lastSelectedNode = node;
				directory = this.directory;
				this._currentDirectory = this.directory;
			}
			if(item && item.root != true){
				directory = item.directory;
				this.model.store._loadList(directory);
				this._lastSelectedNode = node;
				this._currentDirectory = directory;
				var files = this._getFileList(directory);
				if(this.listId != ""){
					var filelist = $$(this.listId);
					if(files){
						filelist.setChildren(files);
					}
					else{
						filelist.setChildren([]);
					}
				}
			}
			//fix for ie without timeout is can not give focus to element
			window.setTimeout(dojo.hitch(this,this.focusNode,node),10);
			dojo.publish(this.id+'/select',[{node:node, currentDirectory: directory}]);
		},

		getCurrentDirectory: function () {
		// summary: get full path name
			return this._currentDirectory; //String?
		},

		getCurrentDirectoryName: function () {
		// summary: get folder name
		// returns: folder name
			if(this._lastSelectedNode == undefined) {
				return false;
			}
			return this._lastSelectedNode.label; //String?
		},

		getLastSelectedNode: function () {
			return this._lastSelectedNode; //String?
		},

		deleteFiles: function(selectedNodes) {
		// summary: delete specified (or selected) files
			if(selectedNodes === undefined && this.listId){
				selectedNodes = $$(this.listId).selectedNodes();
			}
			if(selectedNodes == undefined || selectedNodes.length == 0){
				console.warn('nothing selected');
				return;
			}
			else{
				if(this.model.store.deleteFiles(selectedNodes,this._currentDirectory) == true){
					this.reloadFiles();
				}
				else{
					console.warn('cant delete files');
				}
			}
		},

		createDirectory: function (name) {
			if(this.model.store.createDirectory(name,this._currentDirectory) == true) {
				if(this._lastSelectedNode.item.children == undefined){
					this._lastSelectedNode.item.children = [];
				}
				this._refreshNode(this._lastSelectedNode);
				return true;
			}
			else {
				return false;
			}
		},

		renameDirectory: function (name) {
			if(this._lastSelectedNode == undefined || this._lastSelectedNode.isTree == true){ 
				return;
			}
			var node = this._lastSelectedNode;
			var oldName = node.item.title;
			var newName = this.model.store.renameDirectory(name,oldName,this._currentDirectory);
			if(newName != false)
			{
				// set node elements
				this.setLabelNode(node,newName);
				node.item.directory = node.item.directory.substr(0,node.item.directory.lastIndexOf("/"))+'/'+newName;
				this._collapseNode(node);

				this.onClick(node.item, node);
				return true;
			}
			else {
				return false;
			}
		},

		deleteDirectory: function (directory) {
			//summary: delete given or current directory
			if(directory == undefined){ 
				directory = this._currentDirectory;
			}
			if(this._lastSelectedNode == undefined || this._lastSelectedNode.isTree == true){ 
				return;
			}
			if(this.model.store.deleteDirectory(directory) == true){
				var node = this._lastSelectedNode;
				parentNode = node.getParent();
				var children = parentNode.item.children;
				for( var i=0,iLength=children.length ; i<iLength ; i++ ){
					var child = children[i];
					if(child.directory == directory){
						var deleteIndex = i;
					}
				}
				children.splice(deleteIndex,1);
				if(parentNode.getChildren().length == 1){
					parentNode.isExpandable = false;
				}
				this._refreshNode(parentNode);
				epages.event.fire(parentNode.domNode,'click');
			}
		},


		selectDirectory: function (directory) {
			var node = this._getNodeByDirectory(directory);
			var item = node.item ? node.item : undefined;
			this.onClick(item, node);
		},

		_getNodeByDirectory: function(directory, parentNode) {
			if (parentNode == undefined){ 
				parentNode = this;
			}
			if(directory == this.directory){ 
				return this;
			}
			var nodesWithChildren = [];
			var children = parentNode.getChildren();
			for( var i=0,iLength=children.length ; i<iLength ; i++ ) {
				var node = children[i];
				if (node.item.directory == directory){
					return node;
				}
				if (node.getChildren() && node.getChildren().length > 0){ 
					nodesWithChildren.push(node);
				}
			}
			for( var i=0,iLength=nodesWithChildren.length ; i<iLength ; i++ ) {
				var node = this._getNodeByDirectory(directory, nodesWithChildren[i]);
				if (node != null){ 
					return node;
				}
			}
			return null;
		},

		openNode:function(directory){
			if (directory === undefined || directory == "") {
				directory = this.directory;
			}
			//convert directory from string to array
			var selectedNodePath = new Array();
			var directories = directory.split("/");
			for( var i=0,l=directories.length ; i<l ; i++ ){
				if(i === 0){
					selectedNodePath[i] = directories[i];
				}
				else{
					selectedNodePath[i] = selectedNodePath[i-1]+'/'+directories[i];
				}
			}
			for( var i=0,iLength=selectedNodePath.length ; i<iLength ; i++ ) {
				var directory = selectedNodePath[i];
				var node = this._getNodeByDirectory(directory);
				if(node == undefined){
					this.model.store._loadList(directory);
					node = this._getNodeByDirectory(directory);
				}
				if(node == undefined){
					window.setTimeout(dojo.hitch(this,this.focusNode,this._lastSelectedNode),10);
					return false;
				}
				if (i == selectedNodePath.length - 1) {
					this._lastSelectedNode = node;
					this._currentDirectory = directory;
					//need timeout for ie
					window.setTimeout(dojo.hitch(this,this.focusNode,node),10);
					dojo.publish(this.id+'/select', [{
							node : node,
							currentDirectory : directory
					}]);
					return true;
				}
				else{
					this._lastSelectedNode = node;
					this._currentDirectory = directory;
					this._expandNode(node);
				}
			}
		},

		reloadFiles: function(){
			var files = this._getFileList(this._currentDirectory);
				if(this.listId != ""){
					var filelist = $$(this.listId);
					if(files){
						filelist.setChildren(files);
					}
					else{
						filelist.destroyDescendants();
					}
				}
		},

		getLabelClass: function(/*dojo.data.Item*/ item){
			// summary: user overridable function to return CSS class name to display label
			//if no return value is set dojo adds a class "undefined" to every label in the tree
			return '';
		},

		focusNode: function(node) {
			this._onNodeFocus(node);
		},
		_onNodeFocus: function(/*dijit._Widget*/ node){
			// summary:
			//		Called when a TreeNode gets focus, either by user clicking
			//		it, or programatically by arrow key handling code.
			// description:
			//		It marks that the current node is the selected one, and the previously
			//		selected node no longer is.

			if(node){
				if(node != this.lastFocused && this.lastFocused && !this.lastFocused._destroyed){
					// mark that the previously selected node is no longer the selected one
					this.blurNode();
					if(this.lastFocused){
						this.lastFocused.setSelected(false);
					}
				}

				// mark that the new node is the currently selected one
				dojo.addClass(node.labelNode,"Selected");
				node.setSelected(true);
				this.lastFocused = node;
			}
		},

		blurNode: function() {
			var node = this.lastFocused;
			if(!node){
				return;
			}
			dojo.removeClass(node.labelNode, "Selected");
			var labelNode = node.labelNode;
			dojo.removeClass(labelNode, "dijitTreeLabelFocused");
			labelNode.setAttribute("tabIndex", "-1");
			this.lastFocused = null;
		},

		_refreshNode: function(/*Object*/ node) {
			// summary: Refreshes the given node in the tree.
			// description: There's also a thread on dojo campus:
			//	http://dojocampus.org/content/2008/06/04/refreshing-a-data-store/.
			// example:
			//	_refreshNode(this._lastSelectedNode);
			if(node.isExpanded == true || node.item.children != undefined){
				this._collapseNode(node);
				node.state = "UNCHECKED";
				node.isExpandable = true;
				node._setExpando(false);
				if(node == this.rootNode){
					this.rootNode.item.children = this.model.store.getValues(this.rootNode.item,'children');
				}
				this._expandNode(node);
			}
			else{
				node.state = "UNCHECKED";
				node.isExpandable = false;
				node._setExpando(false);
			}
		},

	setLabelNode: function(node,label){
		node.labelNode.innerHTML = "";
		node.labelNode.appendChild(dojo.doc.createTextNode(label));
	}
});