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

/**
 * @class Zarafa.common.settings.SettingsRuleWidget
 * @extends Zarafa.settings.ui.SettingsWidget
 * @xtype zarafa.settingsrulewidget
 *
 * The {@link Zarafa.settings.ui.SettingsWidget widget} for configuring
 * delegation options in the {@link Zarafa.common.settings.SettingsRuleCategory rule category}.
 */
Zarafa.common.settings.SettingsRuleWidget = Ext.extend(Zarafa.settings.ui.SettingsWidget, {

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

		Ext.applyIf(config, {
			title : _('Rules'),
			xtype : 'zarafa.settingsrulewidget',
			cls: 'zarafa-settings-widget k-rules-widget',
			layout : {
				// override from SettingsWidget
				type : 'fit'
			},
			items : [{
				xtype : 'zarafa.rulespanel',
				ref : 'rulesPanel'
			}]
		});

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

	/**
	 * @return {Zarafa.common.rules.data.RulesStore} The store which is holds all rules
	 */
	getRulesStore : function()
	{
		return this.rulesPanel.store;
	},

	/**
	 * initialize events for the {@link Zarafa.common.settings.SettingsDelegateWidget SettingsDelegateWidget}.
	 * @private
	 */
	initEvents : function()
	{
		Zarafa.common.settings.SettingsRuleWidget.superclass.initEvents.call(this);

		// listen to savesettings and discardsettings to save/discard rules data
		var contextModel = this.settingsContext.getModel();

		this.mon(contextModel, 'savesettings', this.onSaveSettings, this);
		this.mon(contextModel, 'discardsettings', this.onDiscardSettings, this);

		this.mon(this.getRulesStore(), {
			// Don't listen to the 'add' event,
			// when the UI adds a rule, it will fire
			// the 'update' event when the rule is
			// completely filled in.
			'remove' : this.doStoreRemove,
			'update' : this.doStoreUpdate,
			scope : this
		});
	},

	/**
	 * Event handler for the {@link Ext.data.Store#remove} event which is fired
	 * by the {@link Ext.data.Store} inside the {@link #rulesPanel}.
	 * This will mark the {@link Zarafa.settings.SettingsContextModel} as
	 * {@link Zarafa.settings.SettingsContextModel#setDirty dirty}.
	 * @param {Ext.data.Store} store The store which fired the event
	 * @param {Ext.data.Record} record The record which was updated
	 * @private
	 */
	doStoreRemove : function(store, record)
	{
		if (record.phantom !== true) {
			this.settingsContext.getModel().setDirty();
		}
	},

	/**
	 * Event handler for the {@link Ext.data.Store#update} event which is fired
	 * by the {@link Ext.data.Store} inside the {@link #rulesPanel}.
	 * This will mark the {@link Zarafa.settings.SettingsContextModel} as
	 * {@link Zarafa.settings.SettingsContextModel#setDirty dirty}.
	 * @param {Ext.data.Store} store The store which fired the event
	 * @param {Ext.data.Record} record The record which was updated
	 * @param {String} operation The update operation being performed.
	 * @private
	 */
	doStoreUpdate : function(store, record, operation)
	{
		if (operation !== Ext.data.Record.COMMIT) {
			this.settingsContext.getModel().setDirty();
		}
	},

	/**
	 * Event handler will be called when {@link Zarafa.settings.SettingsContextModel#savesettings} event is fired.
	 * This will relay this event to {@link Zarafa.common.delegates.ui.RulesPanel RulesPanel} so it can
	 * save rules data.
	 * @private
	 */
	onSaveSettings : function()
	{
		this.rulesPanel.saveChanges();
	},

	/**
	 * Event handler will be called when {@link Zarafa.settings.SettingsContextModel#discardsettings} event is fired.
	 * This will relay this event to {@link Zarafa.common.delegates.ui.RulesPanel RulesPanel} so it can
	 * discard current changes and reload rules data from server.
	 * @private
	 */
	onDiscardSettings : function()
	{
		this.rulesPanel.discardChanges();
	}
});

Ext.reg('zarafa.settingsrulewidget', Zarafa.common.settings.SettingsRuleWidget);