Number.implement({

	/*
	Property: numberFormat
		Format a number with grouped thousands.

	Arguments:
		decimals, optional - integer, number of decimal percision; default, 2
		dec_point, optional - string, decimal point notation; default, '.'
		thousands_sep, optional - string, grouped thousands notation; default, ','

	Returns:
		a formatted version of number.

	Example:
		>(36432.556).numberFormat()  // returns 36,432.56
		>(36432.556).numberFormat(2, '.', ',')  // returns 36,432.56
	*/

	numberFormat : function(decimals, dec_point, thousands_sep) {
		decimals = Math.abs(decimals) + 1 ? decimals : 2;
		dec_point = dec_point || '.';
		thousands_sep = thousands_sep || ',';
	
		var matches = /(-)?(\d+)(\.\d+)?/.exec((isNaN(this) ? 0 : this) + ''); // returns matches[1] as sign, matches[2] as numbers and matches[3] as decimals
		matches[2] = (matches[2] == 0) ? '' : matches[2];
		var remainder = matches[2].length > 3 ? matches[2].length % 3 : 0;
		
//		console.log((matches[1] ? matches[1] : ''));
//		console.log((remainder ? matches[2].substr(0, remainder) + thousands_sep : ''));
//		console.log(matches[2].substr(remainder).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep));
//		console.log(dec_point + (+matches[3] || 0).toFixed(decimals).substr(2));
//		console.log((decimals && (matches[3] * 100) > 1) ? dec_point + (+matches[3] || 0).toFixed(decimals).substr(2) : '');
//		console.log(matches[3] + ' | ' + (matches[3] * 100));
		
		return (matches[1] ? matches[1] : '') + (remainder ? matches[2].substr(0, remainder) + thousands_sep : '') + matches[2].substr(remainder).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep) + ((decimals && (matches[3] * 100) > 1) ? dec_point + (+matches[3] || 0).toFixed(decimals).substr(2) : '');
	}


});
