Ext.namespace('Zarafa.common.settings');

/**
 * @class Zarafa.common.settings.SettingsDelegateCategory
 * @extends Zarafa.settings.ui.SettingsCategory
 * @xtype zarafa.settingsdelegatecategory
 *
 * The delegates category for users which will allow the user to configure delegation settings.
 */
Zarafa.common.settings.SettingsDelegateCategory = Ext.extend(Zarafa.settings.ui.SettingsCategory, {
	// Insertion points for this class
	/**
	 * @insert context.settings.category.delegate
	 * Insertion point to register new {@link Zarafa.settings.ui.SettingsWidget widgets}
	 * for the {@link Zarafa.common.settings.SettingsDelegateCategory Delegate Category}.
	 * @param {Zarafa.common.settings.SettingsDelegateCategory} category The delegate
	 * category to which the widgets will be added.
	 */

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

		Ext.applyIf(config, {
			title : _('Delegates'),
			categoryIndex : 5,
			xtype : 'zarafa.settingsdelegatecategory',
			iconCls : 'zarafa-settings-category-delegate',
			items : [{
					xtype : 'zarafa.settingsdelegatewidget',
					settingsContext : config.settingsContext
				},
				container.populateInsertionPoint('context.settings.category.delegate', this)
			]
		});

		Zarafa.common.settings.SettingsDelegateCategory.superclass.constructor.call(this, config);
	},

	/**
	 * Called by superclass when the Category has been deselected and is hidden from the user,
	 * this will unregister the {@link #onBeforeSaveRules} event handler.
	 * @private
	 */
	onHide : function()
	{
		Zarafa.common.settings.SettingsDelegateCategory.superclass.onHide.apply(this, arguments);

		// Unregister the 'beforesave' event. This could be lingering when
		// 'savesettings' was fired but it was cancelled by one of the
		// event handlers.
		var store = this.get(0).getDelegateStore();
		this.mun(store, 'beforesave', this.onBeforeSaveDelegate, this);
	},

	/**
	 * Event handler for the
	 * {@link Zarafa.settings.SettingsContextModel ContextModel}#{@link Zarafa.settings.SettingsContextModel#beforesavesettings beforesavesettings}
	 * event. It will reset the {@link #savingElCounter} and his will register the event handler for
	 * {@link Zarafa.settings.SettingsModel#beforesave beforesave} event.
	 * @private
	 */
	onBeforeSaveSettingsModel : function()
	{
		Zarafa.common.settings.SettingsDelegateCategory.superclass.onBeforeSaveSettingsModel.apply(this, arguments);

		var store = this.get(0).getDelegateStore();
		this.mon(store, 'beforesave', this.onBeforeSaveDelegate, this, { single : true });
	},

	/**
	 * Event handler which is fired when the {@link Zarafa.common.delegates.data.DelegateStore Delegate Store}
	 * fires the 'beforesave' event. This will {@link #displaySavingMask show a notification} and register the
	 * event handlers for the completion of the save.
	 * @private
	 */
	onBeforeSaveDelegate : function()
	{
		this.displaySavingMask();

		var store = this.get(0).getDelegateStore();
		this.mon(store, 'save', this.onDelegateSave, this);
		this.mon(store, 'exception', this.onDelegateException, this);
	},

	/**
	 * Event handler which is fired when the {@link Zarafa.common.delegates.data.DelegateStore Delegate Store}
	 * fires the 'save' event indicating the successfull save of the delegates. This will
	 * {@link #hideSavingMask hide the notification}.
	 * @private
	 */
	onDelegateSave : function()
	{
		this.hideSavingMask(true);

		var store = this.get(0).getDelegateStore();
		this.mun(store, 'save', this.onDelegateSave, this);
		this.mun(store, 'exception', this.onDelegateException, this);
	},

	/**
	 * Event handler which is fired when the {@link Zarafa.common.delegates.data.DelegateStore Delegate Store}
	 * fires the 'exception' event indicating a failing save of the delegates. This will
	 * {@link #hideSavingMask hide the notification}.
	 * @private
	 */
	onDelegateException : function()
	{
		this.hideSavingMask(false);

		var store = this.get(0).getDelegateStore();
		this.mun(store, 'save', this.onDelegateSave, this);
		this.mun(store, 'exception', this.onDelegateException, this);
	}
});

Ext.reg('zarafa.settingsdelegatecategory', Zarafa.common.settings.SettingsDelegateCategory);