/**
 *
 * @author a.novikov
 * @version 0.9.0
 *
 * Depends on library.js
 * 
 * to destroy form use $(...).inputFilter('destroy');
 *
 */

(function(Lib, $){
	
	var InputFilter = function(input) {
		this.validCodes = {};
		this.addCodes(this.defaultValidCodes);
		this.bind(input);
	};
	
	InputFilter.prototype = {
		bind: function(element) {
			this.element = element;
			var object = this;

			$(element).keypress(function(event) {
				object.onKeyPress(event);
			});
		},
		changeCodes: function(codes) {
			for (var code in codes) {
				if (codes[code]) {
					this.validCodes[code] = true;
				}
				else {
					delete this.validCodes[code];
				}
			}

		},
		addCodes: function(codes) {
			for (var i in codes) {
				this.validCodes[codes[i]] = true;
			}
		},
		removeCodes: function(codes) {
			for (var i in codes) {
				delete this.validCodes[codes[i]];
			}
		},
		addLetters: function(lettersString) {
			this.addCodes(Lib.String.getCodesByExpression(lettersString));
		},
		removeLetters: function(lettersString) {
			this.removeCodes(Lib.String.getCodesByExpression(lettersString));
		},
		onKeyPress: function(event) {
			var code = event.charCode || event.keyCode;

			if (!(code in this.validCodes) ) {
				event.preventDefault();
				if (code == 13) {
					$(this.element).change();
				}
			}
		},
		setOptions: function(options) {

		},
		setOption: function(option, value) {

		},
		getOption: function(option) {

		},
		defaultValidCodes: [
			8,	// backspace
			9,	// tab
			13,	// enter
			35,	// end
			36,	// home
			37,	// left
			39,	// right
			46	// del //@todo В FireFox так же отвечает за символ ".", надо как то отличать
		]
	};
	
	var Adapter = function(inputFilter) {
		this.inputFilter = inputFilter;
	};
	
	Adapter.prototype = {
		init: function(options) {
			this.inputFilter.setOptions(options);
		},
		option: function(option, value) {
			var argCount = arguments.length;
			
			if (argCount == 1) {
				return this.inputFilter.getOption(option);
			}
			else if (argCount == 2) {
				this.inputFilter.setOption(option, value);
			}
			else {
				$.error('Invalid arguments');
			}
		},
		letters: function(addLetters, removeLetters) {
			if (addLetters) {
				this.inputFilter.addLetters(addLetters);
			}
			if (removeLetters) {
				this.inputFilter.removeLetters(removeLetters);
			}
		},
		changeCodes: function(codes) {
			this.inputFilter.changeCodes(codes);
		},
		removeCodes: function(codes) {
			this.inputFilter.removeCodes(codes);
		},
		digits: function() {
			this.inputFilter.addLetters('0-9');
			this.inputFilter.removeLetters('.');	// @todo Костыль против FireFox, надо будет поправить
		},
		destroy: function() {
			this.inputFilter.destroy();
		}
	};

	Lib.bindClassToJQuery(InputFilter, 'inputFilter', Adapter);

})(NLib, jQuery);
