﻿(function($)
{
	$.fn.numberInput = function(allowDecimalSeparator)
	{
		var isCharAllowed = function(charCode, allowDecimalSeparator)
		{
			var result;
			
			if (charCode == decimalSeparatorCharCode)
			{
				result = allowDecimalSeparator;
			}
			else
			{
				result = allowedCharCodes[charCode] ? true : false;
			}

			return result;
		}

		var filterCharacters = function(event, allowDecimalSeparator)
		{
			var allowed = true;

			var charCode = event.which;

			// Если character == 0, это означает управляющий симовол. Они фильтруются в обработчике keydown.
			if (charCode != 0)
			{
				allowed = isCharAllowed(charCode, allowDecimalSeparator);

				if (!allowed && jQuery.browser.opera && !event.shiftKey)
				{
					allowed = allowedControlKeyCodes[charCode] ? true : false;
				}
			}

			Utils.debug("Character=" + charCode + ", allowed=" + allowed);
			return allowed;
		}

		var filterCharactersAfterPaste = function(element, allowDecimalSeparator)
		{
			var text = element.val();

			if (text != null)
			{
				var newText = "";

				for (var i = 0; i < text.length; ++i)
				{
					if (isCharAllowed(text.charCodeAt(i), allowDecimalSeparator))
					{
						newText += text.charAt(i);
					}
				}

				element.val(newText);
			}
		}

		return this.each(function()
		{
			$(this)
				.keypress(function(event) { return filterCharacters(event, allowDecimalSeparator); })
				.bind("paste", function(e)
				{
					var el = $(this);
					setTimeout(function() { filterCharactersAfterPaste(el, allowDecimalSeparator); }, 0);
				})
				.bind("cut", function(e)
				{
					var el = $(this);
					setTimeout(function() { el.keyup(); }, 0);
				});
		});
	};

	var allowedCharCodes =
	{
		8: 'BACKSPACE'
		, 48: 'ZERO'
		, 49: 'ONE'
		, 50: 'TWO'
		, 51: 'THREE'
		, 52: 'FOUR'
		, 53: 'FIVE'
		, 54: 'SIX'
		, 55: 'SEVEN'
		, 56: 'EIGHT'
		, 57: 'NINE'
	};

	var decimalSeparatorCharCode = 46;

	var allowedControlKeyCodes =
	{
		9: 'TAB'
		, 13: 'ENTER'
		, 35: 'END'
		, 36: 'HOME'
		, 37: 'LEFT_ARROW'
		, 39: 'RIGHT_ARROW'

		// Если строка ниже не закомментирована, то в Opera будет возможно ввести ".".
		// Если строка ниже закомментирована, то в Opera не будет работать клавиша Delete.
		//, 46: 'DELETE'
	};

	$.fn.numeric = function() { this.numberInput(false); };
	$.fn.decimalNumeric = function() { this.numberInput(true); };

})(jQuery);