FR.initTree = function() {
	var t = new Ext.tree.TreePanel({
		id: 'FR-Tree-Panel', el: 'tree', 
		enableDD: !User.perms.read_only, ddGroup: 'TreeDD', dropConfig: {appendOnly:true},
		animate: false, autoScroll: true, rootVisible: false, border: false, lines: false
	});
	FR.UI.tree.panel = t;

	var r = new Ext.tree.TreeNode({ pathname: 'ROOT', allowDrag: false, allowDrop: false});
	t.setRootNode(r);
	FR.UI.tree.root = r;
	t.render();
	
	t.getSelectionModel().on('selectionchange', function(selectionModel, treeNode) {
		FR.UI.tree.onSelectionChange(selectionModel, treeNode);
	});
	t.getSelectionModel().on('beforeselect', function(selectionModel, treeNode) {
		if (treeNode.attributes.section == 'userWithShares') {return false;}
	});
	
	FR.UI.tree.homeFolderNode = new Ext.tree.AsyncTreeNode({
		text: User.fname, pathname: 'HOME', section: 'myfiles',
		cls: 'album-node', iconCls: 'folder',
		allowDrag: false, allowDrop: !User.perms.read_only, homefolder: true,
		loader: new Ext.tree.TreeLoader({
			dataUrl: this.myfilesBaseURL+'&page=tree',
			listeners: {'beforeload': function(loader, node){loader.baseParams.path = node.getPath('pathname');}}
		}),
		listeners: {'beforecollapse': function(node, e){node.loaded=false;}}
	});
	r.appendChild(FR.UI.tree.homeFolderNode);

	if (!User.perms.read_only) {
		var 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...'));
					}
					Ext.Ajax.request({
						url: url,
						method: 'post',
						params: pars,
						callback: function(opts, succ, req) {
							Ext.getCmp('FR-Tree-Region').getEl().unmask();
							try {
								var rs = Ext.util.JSON.decode(req.responseText);
							} catch (er){return false;}
							var node = FR.UI.tree.treeEditor.editNode;
							if (!rs.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 = rs.folderName;
									node.setText(rs.folderName);
									if (node == FR.UI.tree.currentSelectedNode) {
										FR.currentPath = FR.UI.tree.getCurrentPath();
									}
								}
							}
							FR.UI.feedback(rs.msg);
						}
					});
				} else {
					if (value != User.fname) {
						editNode.setText(User.fname);
					}
				}
			}
		});
	}
	
	Ext.each(AnonShares, function(fld) {
		r.appendChild(new Ext.tree.AsyncTreeNode({
			text: fld.name, pathname: fld.path, perms: fld.perms, readonly: true,
			cls: 'album-node', iconCls: fld.iconCls, allowDrag: false, allowDrop: fld.perms.upload, section: 'sharedFolder',
			loader: new Ext.tree.TreeLoader({
				dataUrl:FR.myfilesBaseURL+'&page=tree_shares&nocache=1',
				listeners: {'beforeload': function(loader, node){loader.baseParams.path = node.getPath('pathname');}}
			})
		}));
	});
	
	FR.UI.tree.trashNode = new Ext.tree.AsyncTreeNode({
		text: FR.T('Deleted Files'),
		cls: 'album-node', leaf: true, allowDrag: false, allowDrop: false,
		iconCls: 'trash', pathname: 'TRASH', section: 'trash'
	});
	r.appendChild(FR.UI.tree.trashNode);
	if (User.trashCount < 1 || User.perms.read_only) {
		FR.UI.tree.trashNode.getUI().hide();
	}
	
	Ext.each(Sharing, function(usr) {
		r.appendChild(new Ext.tree.AsyncTreeNode({
			text: usr.name, pathname: usr.id,
			cls: 'album-node', iconCls: 'user', allowDrag: false, allowDrop: false, section: 'userWithShares',
			loader: new Ext.tree.TreeLoader({
				dataUrl:FR.myfilesBaseURL+'&page=tree_shares&nocache=1',
				listeners: {'beforeload': function(loader, node){loader.baseParams.path = node.getPath('pathname');}}
			})
		}));
	});

	FR.UI.tree.getCurrentPath = function() {
		return this.currentSelectedNode.getPath('pathname');
	}

	FR.UI.tree.onSelectionChange = function(selectionModel, treeNode) {
		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();
			}
			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.currentFolderPerms && !FR.currentFolderPerms.upload) || 
					((treeNode.attributes.section == 'myfiles' || treeNode.attributes.section == 'sharedFolder') && User.perms.upload == 0)
				) {
				FR.UI.treeToolbar.getItem('upload').disable();
			} else {
				FR.UI.treeToolbar.getItem('upload').enable();
			}
			if (treeNode.attributes.section == 'trash') {
				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.treeToolbar.getItem('upload').disable();
				Ext.getCmp('folderMenu').disable();
			} else {
				FR.UI.grid.panel.getColumnModel().setHidden(FR.UI.grid.panel.getColumnModel().getIndexById('trash_deleted_from'), true);
			}	
		}
	}
}

FR.initTreeDD = function() {
	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') {
			FR.UI.tree.onDrop2Tree(drop);
		} else {
			FR.UI.tree.moveNodeParent = drop.dropNode.parentNode;
			FR.UI.tree.onTreeDrop(drop);
		}
		return false;
	});

	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...'));
		Ext.Ajax.request({
			url:url,
			method: 'post',
			params: pars,
			callback: function(opts, succ, req) {
				FR.UI.tree.homeFolderNode.select();
				try {
					var rs = Ext.util.JSON.decode(req.responseText);
				} catch (er){return false;}
				if (rs.rs) {
					var node = FR.UI.tree.movingNode;
					node.parentNode.removeChild(node);
					FR.UI.tree.reloadNode(FR.UI.tree.moveTarget);
				} else {
					FR.UI.tree.reloadNode(FR.UI.tree.homeFolderNode);
				}
				FR.UI.tree.movingNode = false;
				FR.UI.tree.moveTarget = false;
				Ext.get('tree').unmask();
				FR.UI.feedback(rs.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)...'));
			Ext.Ajax.request({
				url: url,
				method: 'post',
				params: pars,
				callback: function(opts, succ, req) {
					FR.UI.doneLoading();
					try {
						var rs = Ext.util.JSON.decode(req.responseText);
					} catch (er){return false;}
					if (rs.rs) {
						Ext.each(FR.currentlyMovingFiles, function(gridRow) {
							gridRow.store.remove(gridRow);
						});
					}
					FR.UI.feedback(rs.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: FR.UI.tree.arrayActions
	});
	cm.menu.on('hide', function(menu) {
		FR.UI.tree.contextMenuVisible = false;
		if (FR.UI.tree.contextMenuSelectedNode) {
			Ext.get(FR.UI.tree.contextMenuSelectedNode.getUI().anchor).removeClass('highlighted-tree-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) {
			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.show();ta.deleteFolder.show();} else {ta.rename.hide();ta.deleteFolder.hide();}
		if (User.perms.share && showShare) {ta.share.show();} else {ta.share.hide();}
		if (User.perms.weblink && User.perms.download && 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 && User.perms.download_folders) {ta.zip.show();} else {ta.zip.hide();}
		if (User.perms.download && User.perms.download_folders && 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 (node.attributes.section == 'myfiles' || node.attributes.section == 'sharedFolder') {
			this.contextMenuSelectedNode = node;
			this.updateActions(node);
			Ext.get(node.getUI().anchor).addClass('highlighted-tree-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;
		}
	}
}
