/*
 * #dependsFile client/zarafa/hierarchy/data/SharedFolderTypes.js
 */
Ext.namespace('Zarafa.hierarchy.dialogs');

/**
 * @class Zarafa.hierarchy.dialogs.SharedFolderPanel
 * @extends Ext.Panel
 * @xtype zarafa.sharedfolderpanel
 */
Zarafa.hierarchy.dialogs.SharedFolderPanel = Ext.extend(Ext.Panel, {
	/**
	 * @cfg {Zarafa.hierarchy.data.SharedFolderTypes} defaultSelectedFolderType Default selected folder in combolist.
	 */
	defaultSelectedFolderType : Zarafa.hierarchy.data.SharedFolderTypes['ALL'],

	/**
	 * @cfg {Zarafa.core.data.IPMRecipientStore} store The store in which the user is stored which
	 * will contain the user whose store we wish to open.
	 */
	store : undefined,

	/**
	 * @constructor
	 * @param {Object} config Configuration structure
	 */
	constructor : function(config)
	{
		config = config || {};

		Ext.applyIf(config, {
			layout: 'form',
			border: false,
			labelWidth : 80,
			flex : 1,
			items: [
				this.createRecipientField(config.store),
				this.createFolderTypeCombo(config.defaultSelectedFolderType),
				this.createSubfolderSelection()
			]
		});

		Zarafa.hierarchy.dialogs.SharedFolderPanel.superclass.constructor.call(this, config);
	},

	/**
	 * Creates recipient selection field.
	 * @param {Zarafa.core.data.IPMRecipientStore} store The store to hook into the RecipientField
	 * @return {Object} config object for creating recipient selection field.
	 * @private
	 */
	createRecipientField : function(store)
	{
		return {
			xtype: 'zarafa.compositefield',
			hideLabel: true,
			style : 'margin-top: 10px; margin-bottom: 10px;',
			anchor :'100%',
			items: [{
				xtype: 'button',
				width: 80,
				text: _('Name') + ':',
				handler: this.onSelectUser,
				scope: this
			},{
				xtype: 'zarafa.addressbookboxfield',
				ref: '../userField',
				boxStore : store,
				flex: 1,
				boxLimit : 1,
				boxConfig : {
					validDisplayType : Zarafa.core.mapi.DisplayType.DT_MAILUSER
				}
			}]
		};
	},

	/**
	 * Creates folder type selection combo,
	 * To chose which type of shared folder user want to open.
	 * @param {Zarafa.hierarchy.data.SharedFolderTypes} defaultSelectedFolderType The folder type which will be
	 * selected by default
	 * @return {Object} config object for creating folder type selection combo.
	 * @private
	 */
	createFolderTypeCombo : function(defaultSelectedFolderType)
	{
		return {
			xtype : 'combo',
			fieldLabel : _('Folder type'),
			typeAhead : true,
			triggerAction : 'all',
			lazyRender : true,
			mode : 'local',
			style : 'margin-bottom: 10px;',
			anchor :'100%',
			value : defaultSelectedFolderType,
			store : new Ext.data.JsonStore({
				fields: ['value', 'name'],
				data : Zarafa.hierarchy.data.SharedFolderTypes.folders
			}),
			lazyInit: false,
			editable: false,
			displayField: 'name',
			valueField: 'value',
			ref : 'folderTypeCombo',
			listeners : {
				select : this.onFolderTypeSelect,
				scope: this
			}
		};
	},

	/**
	 * Creates subfolder selection checkbox,
	 * To chose whether user want to open subfolders of the shared folders.
	 * @return {Object} config object for subfolder selection checkbox.
	 * @private
	 */
	createSubfolderSelection : function()
	{
		return {
			xtype : 'checkbox',
			ref: 'checkSubFolders',
			boxLabel : _('Show subfolders'),
			anchor :'100%'
		};
	},

	/**
	 * Called by ExtJs during rendering of the component. This will call
	 * {@link #updateSubFolderCheckBox} to initialize the dialog.
	 * @private
	 */
	onRender : function()
	{
		Zarafa.hierarchy.dialogs.SharedFolderPanel.superclass.onRender.apply(this, arguments);
		this.updateSubFolderCheckBox();
	},

	/**
	 * Event handler which is fired when the user presses the 'Name' button.
	 * This will open the Address Book User Selection Dialog to select a user.
	 * @private
	 */
	onSelectUser : function()
	{
		Zarafa.common.Actions.openABUserSelectionContent({
			callback : this.abCallBack,
			scope : this,
			hideContactsFolders : true,
			listRestriction : {
				hide_users : [ 'contact', 'system' ],
				hide_groups : true,
				hide_companies : true
			}
		});
	},

	/**
	 * Callback function for {@link Zarafa.addressbook.dialogs.ABUserSelectionContentPanel AddressBook}
	 * @param {Ext.data.Record} record user selected from AddressBook
	 * @private
	 */
	abCallBack : function(record)
	{
		this.store.removeAll();
		this.store.add(record.convertToRecipient());
	},

	/**
	 * Called when the user selects a different Folder Type from the ComboBox.
	 * This will call {@link #updateSubFolderCheckBox}.
	 * @param {Ext.form.ComboBox} field The combobox which was changed
	 * @param {Mixed} newValue The new value which was selected
	 * @private
	 */
	onFolderTypeSelect : function(field, newValue)
	{
		this.updateSubFolderCheckBox();
	},

	/**
	 * This will enabled/disable the "Show Subfolders" checkbox depending if the
	 * Folder Type selection is for the {@link Zarafa.common.data.FolderContentTypes#ipmsubtree} or not.
	 * @private
	 */
	updateSubFolderCheckBox : function()
	{
		var enabled = this.folderTypeCombo.getValue() !== Zarafa.hierarchy.data.SharedFolderTypes['ALL'];
		this.checkSubFolders.setDisabled(!enabled);
	},

	/**
	 * Obtain the options which are currently selected in the form.
	 * @return {Object} The Shared Folder options which were selected
	 */
	getFolderOptions : function()
	{
		return {
			type : this.folderTypeCombo.getValue(),
			subfolders : this.checkSubFolders.getValue()
		};
	}
});

Ext.reg('zarafa.sharedfolderpanel', Zarafa.hierarchy.dialogs.SharedFolderPanel);
