FR.initTree = function() {
	//init tree
	t = new Ext.tree.TreePanel({
		id: 'FR-Tree-Panel',
		el: 'tree',
	    animate: false,
	    enableDD: !User.perms.read_only,
		ddGroup : 'TreeDD',
	    autoScroll: true,
	    rootVisible: false,
		dropConfig: {appendOnly:true},
		border: false,
		lines: false
	});
	this.UI.tree.panel = t;

	//root node',
	r = new Ext.tree.TreeNode({
	    allowDrag: false,
	    allowDrop: false,
		pathname: 'ROOT'
	});

	t.setRootNode(r);

	this.UI.tree.root = r;
	t.render();

	//Tree-grid interaction',
	t.getSelectionModel().on('selectionchange', function(selectionModel, treeNode) {
		FR.UI.tree.onSelectionChange(selectionModel, treeNode);
	});

	//cancel user with shares selection',
	t.getSelectionModel().on('beforeselect', function(selectionModel, treeNode) {
		if (treeNode.attributes.section == 'userWithShares') {
			return false;
		}
	});

	//Home Folder',
	homeFolder = new Ext.tree.AsyncTreeNode({
		text: User.fname,
		cls: 'album-node',
		allowDrag: false,
		allowDrop: !User.perms.read_only,
		iconCls: 'folder',
		pathname: 'HOME',
		section: 'myfiles',
		homefolder: true,
		loader: new Ext.tree.TreeLoader({dataUrl: this.myfilesBaseURL+'&page=tree'})
	});
	r.appendChild(homeFolder);
	FR.UI.tree.homeFolderNode = homeFolder;	
	
	//reload on collapse-expand
	homeFolder.on('beforecollapse', function(node, e){node.loaded=false;});
	//set ajax var
	homeFolder.attributes.loader.on('beforeload', function(loader, node){
		loader.baseParams.path = node.getPath('pathname');
	});

	if (!User.perms.read_only) {
		// add an inline editor for the nodes
	    te = new Ext.tree.TreeEditor(FR.UI.tree.panel, {
	        allowBlank: false,
	        blankText:FR.T('A name is required'),
	        selectOnFocus: true,
		  	ignoreNoChange: true
	     });
		FR.UI.tree.treeEditor = te;
		
		te.on('startedit', function(e, value) {
			FR.UI.tree.renameOldName = value;
		});
		te.on('beforestartedit', function(e) {
			if (e.editNode.attributes.section != 'myfiles' && e.editNode.attributes.readonly) {
				return false;
			}
		});
		te.on('complete', function(e, value) {
			var editNode = FR.UI.tree.treeEditor.editNode;
			if (editNode.attributes.section == 'myfiles' || (editNode.attributes.section == 'sharedFolder' && !editNode.attributes.readonly)) {
				if (!FR.creatingNewFolder && editNode.attributes.pathname == value) {
					return false;
				}
				if (editNode.getPath('pathname') != '/ROOT/HOME') {
					var url = FR.myfilesBaseURL+'&page=tree_action_rename';
					var pars = 'path='+encodeURIComponent(editNode.getPath('pathname'));
					pars += '&newfilename='+encodeURIComponent(value);
					if (FR.creatingNewFolder) {
						editNode.attributes.pathname = value;
						pars += '&new_folder=1';
						Ext.getCmp('FR-Tree-Region').getEl().mask(FR.T('Creating new folder...'));
					} else {
						pars += '&new_folder=0';
						Ext.getCmp('FR-Tree-Region').getEl().mask(FR.T('Renaming folder...'));
					}
					var myAjax = new Ajax.Request(
						url,
						{
						method: 'post',
						parameters: pars,
						onComplete: function(originalRequest){
							Ext.getCmp('FR-Tree-Region').getEl().unmask();
							response = eval('('+originalRequest.responseText+')');
							var node = FR.UI.tree.treeEditor.editNode;
							if (!response.rs) {
								if (FR.creatingNewFolder) {
									FR.creatingNewFolder = false;
									node.parentNode.removeChild(node);
								} else {
									node.setText(FR.UI.tree.renameOldName);
								}
							} else {
								if (FR.creatingNewFolder) {
									FR.creatingNewFolder = false;
								} else {
									node.attributes.pathname = response.folderName;
									node.setText(response.folderName);
									if (node == FR.UI.tree.currentSelectedNode) {
										FR.currentPath = FR.UI.tree.getCurrentPath();
										//propagate changes
									}
								}
							}
							FR.UI.feedback(response.msg);
						}
					});
				} else {
					if (value != User.fname) {
						editNode.setText(User.fname);
					}
				}
			}
		});
	}
	
	//add Trash
	FR.UI.tree.trashNode = new Ext.tree.AsyncTreeNode({
			text: FR.T('Deleted Files'),
			cls: 'album-node',
			allowDrag: false,
			allowDrop: false,
			iconCls: 'trash',
			pathname: 'TRASH',
			section: 'trash',
			leaf: true
		});
	FR.UI.tree.root.appendChild(FR.UI.tree.trashNode);
	if (User.trashCount < 1 || User.perms.read_only) {
		FR.UI.tree.trashNode.getUI().hide();
	}
	
	//add users with shares to tree
	Sharing.each(function(usr) {
		node = new Ext.tree.AsyncTreeNode({
			text: usr.name,
			cls: 'album-node',
			allowDrag: false,
			allowDrop: false,
			iconCls: 'user',
			pathname: usr.id,
			section: 'userWithShares',
			loader: new Ext.tree.TreeLoader({dataUrl:FR.myfilesBaseURL+'&page=tree_shares&nocache=1'})
		});
		node.attributes.loader.on('beforeload', function(loader, node){
			loader.baseParams.path = node.getPath('pathname');
		});
		FR.UI.tree.root.appendChild(node);
	});

	FR.UI.tree.getCurrentPath = function() {
		return this.currentSelectedNode.getPath('pathname');
	}

	FR.UI.tree.onSelectionChange = function(selectionModel, treeNode) {
		FR.UI.resetCommentsPane();
		
		FR.UI.tree.currentSelectedNode = treeNode;
		if (!treeNode) {return false;}
		var path = treeNode.getPath('pathname');
		if (path != FR.currentPath) {
			FR.UI.grid.load(path);
			FR.currentFolderPerms = treeNode.attributes.perms ? treeNode.attributes.perms : false;
			FR.currentSection = treeNode.attributes.section;
			if (treeNode.attributes.section == 'myfiles' || treeNode.attributes.section == "sharedFolder") {
				treeNode.expand();
			}
			FR.UI.toolbar.getItem('tools').enable();
			if (treeNode.attributes.section == 'myfiles' || treeNode.attributes.section == 'sharedFolder') {
				FR.UI.folderToolbarSearch.enable();
			} else {
				FR.UI.folderToolbarSearch.disable();
			}
			if (!User.perms.read_only) {
				Ext.getCmp('folderMenu').enable();
			}
			if ((FR.currentFolderPerms && !FR.currentFolderPerms.alter)) {
				Ext.getCmp('folderMenu').disable();
			}
			if (/*FR.currentSection == 'userWithShares' ||*/ 
				(FR.currentFolderPerms && !FR.currentFolderPerms.upload) || 
				(treeNode.attributes.section == 'myfiles' && User.perms.upload == 0)) {
				FR.UI.toolbar.getItem('upload').disable();
				Ext.getCmp('popImporter').disable();
			} else {
				FR.UI.toolbar.getItem('upload').enable();
				Ext.getCmp('popImporter').enable();
			}
			if (treeNode.attributes.section == 'trash') {
				FR.UI.slidePane.collapse();
				FR.UI.grid.panel.getColumnModel().setHidden(FR.UI.grid.panel.getColumnModel().getIndexById('trash_deleted_from'), false);
				if (FR.UI.grid.currentView == 'thumbnails') {
					FR.UI.changeView('list', 1);
				}
				FR.UI.toolbar.getItem('upload').disable();
				Ext.getCmp('folderMenu').disable();
				FR.UI.toolbar.getItem('tools').disable();
			} else {
				FR.UI.grid.panel.getColumnModel().setHidden(FR.UI.grid.panel.getColumnModel().getIndexById('trash_deleted_from'), true);
			}	
		}
	}
}

FR.initTreeDD = function() {
	//Tree Drag & Drop handling
	FR.UI.tree.panel.on('nodedragover', function(e){
		if (FR.currentSection == 'trash' || 
		(e.dropNode && e.dropNode.attributes.readonly) || 
		(e.target.attributes.perms && (!e.target.attributes.perms.alter || !e.target.attributes.perms.upload)) ||
		(FR.currentPath == e.target.getPath('pathname'))
		) {
			e.cancel = true;
			return false;
		}
	});
	
	FR.UI.tree.panel.on('beforenodedrop', function(drop){
		var sourceType = drop.data.grid ? 'grid' : 'tree';
		if (sourceType == 'grid') {
			//drop.data.grid.section
			FR.UI.tree.onDrop2Tree(drop);
		} else {
			FR.UI.tree.moveNodeParent = drop.dropNode.parentNode;
			FR.UI.tree.onTreeDrop(drop);
		}
		return true;
	});

	FR.UI.tree.onTreeDrop = function(drop) {
		var url = FR.myfilesBaseURL+'&page=tree_action_move';
		var pars = '';
			pars += 'from_path='+encodeURIComponent(drop.dropNode.parentNode.getPath('pathname'));
			pars += '&to_path='+encodeURIComponent(drop.target.getPath('pathname'));
			pars += '&filename='+encodeURIComponent(drop.dropNode.attributes.pathname);
		FR.UI.tree.movingNode = drop.dropNode;
		FR.UI.tree.moveTarget = drop.target;
		Ext.get('tree').mask(FR.T('Moving folder...'));
		var myAjax = new Ajax.Request(
			url, {
			method: 'post',
			parameters: pars,
			onComplete: function(originalRequest){
				response = eval('('+originalRequest.responseText+')');
				if (response.rs) {
					var node = FR.UI.tree.movingNode;
					FR.UI.tree.homeFolderNode.select();
				} else {
					FR.UI.tree.reloadNode(FR.UI.tree.homeFolderNode);
				}
				FR.UI.tree.movingNode = false;
				Ext.get('tree').unmask();
				FR.UI.feedback(response.msg);
			}
		});
	}

	FR.UI.tree.onDrop2Tree = function(drop) {
		if (FR.currentSection == 'userWithShares') {
			FR.actions.copySelected();
			FR.actions.pasteCopied(drop.target.getPath('pathname'));
		} else {
			var s = drop.data.selections;
			FR.currentlyMovingFiles = [];
			var pars = 'from_path='+encodeURIComponent(FR.currentPath);
				pars += '&to_path='+encodeURIComponent(drop.target.getPath('pathname'));
			for(var i = 0, len = s.length; i < len; i++){
				var filename = s[i].data.filename;
				pars += '&filenames[]='+encodeURIComponent(filename);
				FR.currentlyMovingFiles.push(s[i]);
			}
			var url = FR.myfilesBaseURL+'&page=grid_action_move';
		
			FR.UI.showLoading(FR.T('Moving file(s)...'));
			var myAjax = new Ajax.Request(
				url, {
				method: 'post',
				parameters: pars,
				onComplete: function(originalRequest){
					FR.UI.doneLoading();
					response = eval('('+originalRequest.responseText+')');
					if (response.rs) {
						FR.currentlyMovingFiles.each(function(gridRow) {
							gridRow.store.remove(gridRow);
						});
					}
					FR.UI.feedback(response.msg);
				}
			});
		}
	}
}

FR.UI.tree.reloadNode = function(treeNode) {
	treeNode.loaded = false;
	treeNode.collapse();
	treeNode.expand();
}


FR.UI.tree.initContextMenu = function() {
	var cm = {options:{}};
	cm.menu = new Ext.menu.Menu({
	    id: 'myfiles-tree-contextmenu',
	    items: Object.values(FR.UI.tree.actions)
	});
	cm.menu.on('hide', function(menu) {
		FR.UI.tree.contextMenuVisible = false;
		FR.UI.tree.contextMenuSelectedNode.getUI().anchor.removeClassName('highlighted-tee-node');
	});
	this.contextMenu = cm;
	this.updateActions = function(treeNode) {
		var ta = this.actions;
		
		var showSearch = true;
		var showShare = true;
		var showLink = true;
		var showZip = true;
		var showDownload = true;
		var showNewFolder = true;
		var showPaste = true;
		var showCopy = true;
		var showPasteFolder = true;
		var showRenameDelete = true;
		var showProp = User.isAdmin;
		
		if (User.perms.read_only) {
			showSearch = false;
			showShare = false;
			showLink = false;
			showZip = false;
			showCopy = false;
			showNewFolder = false;
			showPaste = false;
			showPasteFolder = false;
			showRenameDelete = false;
			showProp = false;
		} else {
			if (treeNode.attributes.section == 'sharedFolder'){
				showShare = false;
				showProp = false;
				if (FR.currentSection == 'sharedFolder') {
					if (!this.currentSelectedNode.attributes.perms.upload) {
						showZip = false;
					}
				}
				if (!treeNode.attributes.perms.upload) {
					showPaste = false;
				} else {
					showPaste = true;
				}
				if (!treeNode.attributes.perms.download) {
					showLink = false;
					showZip = false;
					showDownload = false;
					showCopy = false;
				}
				if (!treeNode.attributes.perms.alter) {
					showRenameDelete = false;
					showNewFolder = false;
					showPasteFolder = false;
				} else {
					showRenameDelete = true;
					showNewFolder = true;
					showPasteFolder = true;
				}
				if (treeNode.attributes.readonly) {
					showPasteFolder = false;
					showRenameDelete = false;
				}
			} else {
				if (User.isAdmin) {
					showProp = true;
				}
				showSearch = true;
				showPaste = true;
				showPasteFolder = true;
				showNewFolder = true;
				if (treeNode.attributes.homefolder) {
					showShare = false;
					showLink = false;
					showRenameDelete = false;
					showCopy = false;
				} else {
					showShare = true;
					showLink = true;
					showRenameDelete = true;
					showCopy = true;
				}
			}
			if (treeNode == FR.copyingFolderNode) {
				showCopy = false;
				showPasteFolder = false;
			}
		}
		if (FR.copyingFiles && showPaste) {
			ta.pasteFiles.show();
		} else {
			ta.pasteFiles.hide();
		}
		if (FR.copyingFolder && showPasteFolder) {
			ta.pasteFolder.show();
		} else {
			ta.pasteFolder.hide();
		}
		if (showRenameDelete) {ta.rename.enable();ta.deleteFolder.enable();} else {ta.rename.disable();ta.deleteFolder.disable();}
		if (User.perms.share && showShare) {ta.share.show();} else {ta.share.hide();}
		if (User.perms.weblink && showLink) {ta.weblink.show();} else {ta.weblink.hide();}
		if (showSearch) {ta.search.show();} else {ta.search.hide();}
		if (showNewFolder) {ta.newFolder.show();} else {ta.newFolder.hide();}
		if (showProp) {ta.properties.show();} else {ta.properties.hide();}
		if (showZip) {ta.zip.show();} else {ta.zip.hide();}
		if (showDownload) {ta.download.show();} else {ta.download.hide();}
		if (showCopy) {ta.copy.show();} else {ta.copy.hide();}
	}
	this.panel.on('contextmenu', function(node, e) {FR.UI.tree.showContextMenu(node,e);});
	this.panel.on('click', function(node, e) {
		if (e.altKey) {
			FR.UI.tree.showContextMenu(node, e);
		}
	});
	this.showContextMenu = function(node, e) {
		if (User.perms.read_only) {
			return false;
		}
		if (node.attributes.section == 'myfiles' || node.attributes.section == 'sharedFolder') {
			this.contextMenuSelectedNode = node;
			this.updateActions(node);
			$(node.getUI().anchor).addClassName('highlighted-tee-node');
			FR.UI.tree.contextMenuVisible = true;
			this.contextMenu.menu.showAt([FR.UI.xy[0]+5, FR.UI.xy[1]+5]);
			if (e) {
				e.stopEvent();
			}
		    return false;
		}
	}
}