Ext.ns('Zarafa.common.ui');

/**
 * @class Zarafa.common.ui.TimePeriodField
 * @extends Zarafa.common.ui.DateRangeField
 * @xtype zarafa.timeperiodfield
 *
 * This class can be used to combine two {@link Zarafa.common.ui.SpinnerField SpinnerFields}
 * with the {@link Zarafa.common.plugins.TimeSpinner TimeSpinner} plugins applied to them.
 */
Zarafa.common.ui.TimePeriodField = Ext.extend(Zarafa.common.ui.DateRangeField, {
	/**
	 * @cfg {String} timeFormat The format in which the time appears in the
	 * time {@link Zarafa.common.ui.SpinnerField Spinner}.
	 */
	timeFormat : _('G:i'),
	/**
	 * @cfg {Number} timeIncrement The number of minutes to increase/decrease
	 * when the time {@link Zarafa.common.ui.SpinnerField Spinner} is used.
	 */
	timeIncrement : 30,
	/**
	 * @cfg {Object} pluginCfg Configuration object which should be applied
	 * by default on the {@link Zarafa.common.plugins.TimeSpinner TimeSpinner} plugin.
	 */
	pluginCfg : undefined,
	/**
	 * @constructor
	 * @param {Object} Configuration object
	 */
	constructor : function(config)
	{
		config = config || {};

		config.startFieldConfig = config.startFieldConfig || {};
		config.startFieldConfig.plugins = Ext.value(config.startFieldConfig.plugins, []);
		config.startFieldConfig.plugins.push(Ext.applyIf(config.pluginCfg || {}, {
			ptype: 'zarafa.timespinner',
			format: config.timeFormat || this.timeFormat
		}));
		config.startFieldConfig.listeners = Ext.value(config.startFieldConfig.listeners, {});
		if (config.startFieldConfig.listeners.spin) {
			config.startFieldConfig.listeners.spin = config.startFieldConfig.listeners.spin.createInterceptor(this.onStartSpin, this);
		} else {
			config.startFieldConfig.listeners.spin = this.onStartSpin.createDelegate(this);
		}

		Ext.applyIf(config.startFieldConfig, {
			xtype: 'zarafa.spinnerfield',
			fieldLabel : _('Start time'),
			width : 190,
			minValue: config.minValue || this.minValue,
			maxValue: config.maxValue || this.maxValue,
			incrementValue: config.timeIncrement || this.timeIncrement,
			alternateIncrementValue: 1
		});

		config.endFieldConfig = config.endFieldConfig || {};
		config.endFieldConfig.plugins = Ext.value(config.endFieldConfig.plugins, []);
		config.endFieldConfig.plugins.push(Ext.applyIf(config.pluginCfg || {}, {
			ptype: 'zarafa.timespinner',
			format: config.timeFormat || this.timeFormat
		}));
		config.endFieldConfig.listeners = Ext.value(config.endFieldConfig.listeners, {});
		if (config.endFieldConfig.listeners.spin) {
			config.endFieldConfig.listeners.spin = config.endFieldConfig.listeners.spin.createInterceptor(this.onEndSpin, this);
		} else {
			config.endFieldConfig.listeners.spin = this.onEndSpin.createDelegate(this);
		}

		config.endFieldConfig = Ext.applyIf(config.endFieldConfig || {}, {
			xtype: 'zarafa.spinnerfield',
			fieldLabel : _('End time'),
			width : 190,
			minValue: config.minValue || this.minValue,
			maxValue: config.maxValue || this.maxValue,
			incrementValue: config.timeIncrement || this.timeIncrement,
			alternateIncrementValue: 1
		});

		Zarafa.common.ui.TimePeriodField.superclass.constructor.call(this, config);
	},

	/**
	 * Event handler fired when the {@link #startField} has spinned. This will call
	 * the {@link #onStartChange} function to fix the duration of the entire field
	 * appropriately.
	 * @param {Zarafa.common.plugins.TimeSpinner} spinner The spinner which fired the event
	 * @private
	 */
	onStartSpin : function(spinner)
	{
		this.onStartChange(spinner.field, spinner.field.getValue(), spinner.field.startValue);
	},

	/**
	 * Event handler fired when the {@link #endField} has spinned. This will call
	 * the {@link #onEndChange} function to fix the duration of the entire field
	 * appropriately.
	 * @param {Zarafa.common.plugins.TimeSpinner} spinner The spinner which fired the event
	 * @private
	 */
	onEndSpin : function(spinner)
	{
		this.onEndChange(spinner.field, spinner.field.getValue(), spinner.field.startValue);
	}
});

Ext.reg('zarafa.timeperiodfield', Zarafa.common.ui.TimePeriodField);