(function($, F){



	F.NumberColumn = F.Column.extend(/** @lends FooTable.NumberColumn */{

		/**

		 * The number column class is used to handle simple number columns.

		 * @constructs

		 * @extends FooTable.Column

		 * @param {FooTable.Table} instance -  The parent {@link FooTable.Table} this column belongs to.

		 * @param {object} definition - An object containing all the properties to set for the column.

		 * @returns {FooTable.NumberColumn}

		 */

		construct: function(instance, definition){

			this._super(instance, definition, 'number');

			this.decimalSeparator = F.is.string(definition.decimalSeparator) ? definition.decimalSeparator : '.';

			this.thousandSeparator = F.is.string(definition.thousandSeparator) ? definition.thousandSeparator : ',';

			this.decimalSeparatorRegex = new RegExp(F.str.escapeRegExp(this.decimalSeparator), 'g');

			this.thousandSeparatorRegex = new RegExp(F.str.escapeRegExp(this.thousandSeparator), 'g');

			this.cleanRegex = new RegExp('[^0-9' + F.str.escapeRegExp(this.decimalSeparator) + ']', 'g');

		},

		/**

		 * This is supplied either the cell value or jQuery object to parse. Any value can be returned from this method and will be provided to the {@link FooTable.Column#formatter} function

		 * to generate the cell contents.

		 * @instance

		 * @protected

		 * @param {(*|jQuery)} valueOrElement - The value or jQuery cell object.

		 * @returns {(number|null)}

		 * @this FooTable.NumberColumn

		 */

		parser: function(valueOrElement){

			if (F.is.element(valueOrElement) || F.is.jq(valueOrElement)){

				var data = $(valueOrElement).data('value');

				valueOrElement = F.is.defined(data) ? data : $(valueOrElement).text().replace(this.cleanRegex, '');

			}

			if (F.is.string(valueOrElement)){

				valueOrElement = valueOrElement.replace(this.thousandSeparatorRegex, '').replace(this.decimalSeparatorRegex, '.');

				valueOrElement = parseFloat(valueOrElement);

			}

			if (F.is.number(valueOrElement)) return valueOrElement;

			return null;

		},

		/**

		 * This is supplied the value retrieved from the {@link FooTable.NumberColumn#parse} function and must return a string, HTMLElement or jQuery object.

		 * The return value from this function is what is displayed in the cell in the table.

		 * @instance

		 * @protected

		 * @param {number} value - The value to format.

		 * @returns {(string|HTMLElement|jQuery)}

		 * @this FooTable.NumberColumn

		 */

		formatter: function(value){

			if (value == null) return '';

			var s = (value + '').split('.');

			if (s.length == 2 && s[0].length > 3) {

				s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, this.thousandSeparator);

			}

			return s.join(this.decimalSeparator);

		}

	});



	F.columns.register('number', F.NumberColumn);



})(jQuery, FooTable);