Ext.namespace('Zarafa.hierarchy.ui');

/**
 * @class Zarafa.hierarchy.ui.TreeEditor
 * @extends Ext.tree.TreeEditor
 * @xtype zarafa.foldertreeeditor
 *
 * Editor for editing nodes within {@link Zarafa.hierarchy.ui.Tree HierarchyTree}
 */
Zarafa.hierarchy.ui.TreeEditor = Ext.extend(Ext.tree.TreeEditor, {
	/**
	 * Used to lock editing on treenodes
	 */
	enableEdit : undefined,

	/**
	 * @constructor
	 * @param {Zarafa.hierarchy.ui.Tree} treeObj object of parent {@link Zarafa.hierarchy.ui.Tree HierarchyTree}
	 * which uses this {@link Zarafa.hierarchy.ui.TreeEditor TreeEditor}.
	 * @param {Object} fc config of {@link Ext.form.Field Field} which can be used for editing {@link Zarafa.hierarchy.ui.FolderNode FolderNode}.
	 * @param {Object} config Configuration object for {@link Ext.tree.TreeEditor TreeEditor}
	 */
	constructor : function(treeObj, fc, config) {
		fc = fc || {};
		config = config || {};

		fc = Ext.applyIf(fc, {
			ignoreNoChange : true
		});

		config = Ext.applyIf(config, {
			cancelOnEsc : true,
			completeOnEnter : true
		});

		Zarafa.hierarchy.ui.TreeEditor.superclass.constructor.call(this, treeObj, fc, config);

		// treeEditor event handlers
		this.on({
			'beforenodeclick' : this.onBeforeNodeClick,
			'beforestartedit' : this.onBeforeStartEdit,
			'canceledit' : this.onEditCancel,
			'complete' : this.onEditComplete,
			scope : this
		});

	},

	/**
	 * Fired before triggering click on treeNode.
	 * @return {Boolean} when true it does not enter edit mode on selection of node
	 * @private
	 */
	onBeforeNodeClick : function() {
		return true;
	},

	/**
	 * Fired before triggering edit on treeNode.
	 * @return {Boolean} false if editing should be stopped.
	 * @private
	 */
	onBeforeStartEdit : function() {
		// Editing? Only if its unlocked
		if (!this.enableEdit) {
			return false;
		}
	},

	/**
	 * Fired on cancel of editing treeNode
	 * @private
	 */
	onEditCancel : function() {
		// Put edit lock back ON.
		this.enableEdit = false;
	},

	/**
	 * Fired on completion of editing of treeNode
	 * @param {Ext.tree.TreeNode} treeNode node which is edited
	 * @param {String} newName new name of node
	 * @param {String} oldName old name of node
	 * @private
	 */
	onEditComplete : function(treeNode, newName, oldName) {
		this.enableEdit = false;

		var folder = treeNode.editNode.getFolder();

		folder.set('display_name', newName);
		folder.save();
	},

	/**
	 * Triggers node editing
	 * @param {Ext.tree.TreeNode} treeNode node to be edited
	 */
	startEditingNode : function(treeNode) {
		// Release edit lock
		this.enableEdit = true;
		this.triggerEdit(treeNode);
	}
});

Ext.reg('zarafa.foldertreeeditor', Zarafa.hierarchy.ui.TreeEditor);