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

/**
 * @class Zarafa.common.plugins.PercentSpinner
 * @extends Zarafa.common.plugins.NumberSpinner
 * @ptype zarafa.percentspinner
 *
 * Extension to the {@link Zarafa.common.plugins.NumberSpinner} object,
 * to correctly parse percentages. This is used by the {@link Zarafa.common.ui.SpinnerField SpinnerField}.
 *
 * We inherit from the {@link Zarafa.common.plugins.NumberSpinner} class because
 * percentages are represented as Floats, and only our raw DOM value is a string
 * where the % sign is postfixed.
 */
Zarafa.common.plugins.PercentSpinner = Ext.extend(Zarafa.common.plugins.NumberSpinner, {
	/**
	 * @constructor
	 * @param {Object} config Configuration object
	 */
	constructor : function(config)
	{
		config = config || {};

		Ext.applyIf(config, {
			allowDecimals : true,
			decimalPrecision : 4
		});

		Zarafa.common.plugins.PercentSpinner.superclass.constructor.call(this, config);
	},

	/**
	 * Initializes the {@link Zarafa.common.ui.SpinnerField SpinnerField} to which
	 * this plugin has been hooked.
	 * @param {Zarafa.common.ui.SpinnerField} The parent field to which this component is connected
	 */
	init : function(field)
	{
		// The superClass will call parseFloat() on the defaultValue, minValue and
		// maxValue when those values are written in Strings. We however expect a string
		// to be formatted with a '%' as postfix. Although we don't really care for that
		// case (parseFloat will still work as expected), we must divide the value by 100
		// to get a value between 0 and 1.
		if (Ext.isDefined(field.defaultValue) && Ext.isString(field.defaultValue)) {
			field.defaultValue = this.stringToFloat(field.defaultValue);
		}
		if (!Ext.isDefined(field.minValue)) {
			field.minValue = 0;
		} else if (Ext.isString(field.minValue)) {
			field.minValue = this.stringToFloat(field.minValue);
		}
		if (!Ext.isDefined(field.maxValue)) {
			field.maxValue = 1;
		} else if (Ext.isString(field.maxValue)) {
			field.maxValue = this.stringToFloat(field.maxValue);
		}

		Zarafa.common.plugins.PercentSpinner.superclass.init.call(this, field);
	},

	/**
	 * Convert a String into a Float. If the String contains the '%' character,
	 * the value is converted as percentage (and thus divided by 100), otherwise
	 * it is assumed to be the literal stringified version of the float.
	 * @param {String} value The string to convert to a float
	 * @return {Float} The float value representing the string
	 * @protected
	 */
	stringToFloat : function(value)
	{
		var isPercent;

		if (Ext.isEmpty(value)) {
			return undefined;
		}

		isPercent = value.indexOf('%');

		value = parseFloat(value);
		if (isPercent) {
			value /= 100;
		}

		return value;
	},

	/**
	 * Convert a Float to a String representing the Float as percentage.
	 * @param {Float} value The float value which must be converted
	 * @return {String} The stringified value represented as percentage
	 * @protected
	 */
	floatToString : function(value)
	{
		if (!Ext.isDefined(value)) {
			return undefined;
		}

		return (value * 100) + '%';
	},

	/**
	 * Sets a data value into the field and validates it.
	 * To set the value directly without validation see {@link Ext.form.Field#setRawValue}.
	 * @param {Number/String} value The value to set
	 * @private
	 */
	setValue : function(value)
	{
		if (!Ext.isEmpty(value) && Ext.isString(value)) {
			value = parseFloat(value) / 100;
		}
		Zarafa.common.plugins.PercentSpinner.superclass.setValue.call(this, value);
	}
});

// Register as plugin, so that it can be used using lazy loading
// with the Zarafa.common.ui.SpinnerField
Ext.preg('zarafa.percentspinner', Zarafa.common.plugins.PercentSpinner);