// link jQuery object to tyQuery
if( typeof $ty != "undefined" ) {
	var _jQuery = jQuery;
	jQuery = $ty;
}

;(function($) {
	var tySuggestPlugin = function (inputElement, settings) {
		var self = this;
		var _inputElement = null;
		var _resultListSelector;
		var _selectedStateClass;
		var _submitCallback = null;
		var _enterCallback = null;
		var _selectCallback = null;
		var _blurCallback = null;
		var _focusCallback = null;
		var _blurTimeout = 100;
		var _blurTimeoutID;
		var _enableBlur = true;
		var _defaultValue = null;
		var _minInputChars = 1;
		var _inputTimeout = 500;
		var _selectedItemIndex = 0;
		var _lastSelectedItem = null;
		var _selectable = false;

		//var _isReady = false;
		var _submitTimeoutID;
		var _lastInputValue = '';
		function init (inputElement) {
			_inputElement = inputElement.get(0);
			self.unbind();
			_selectable = false;
			_defaultValue = _inputElement.value;
			$(_inputElement).focus(onFocus);
			$(_inputElement).blur(onBlur);
			$(_inputElement).keydown(keyDown);
			//_isReady = true;
		}
		function onFocus() {
			if (_inputElement.value == _defaultValue) _inputElement.value = '';
			if (_focusCallback != null) _focusCallback(self);
			window.clearTimeout(_blurTimeoutID);
		}
		function onBlur() {
			window.clearTimeout(_blurTimeoutID);
			_blurTimeoutID = window.setTimeout(delayBlurCall, _blurTimeout);
		}
		function delayBlurCall(window) {
			if (_enableBlur != true) return;
			_inputElement.value = _lastInputValue = _defaultValue;
			if (_blurCallback != null) _blurCallback(self);
		}
		this.onBlur = function(callback, timeout) {
			_blurCallback = callback;
			if (timeout != undefined) _blurTimeout = timeout;
			return this;
		}
		this.enableBlur = function (truefalse) {
			_enableBlur = truefalse;
			return this;
		}
		this.onFocus = function(callback) {
			_focusCallback = callback;
			return this;
		}
		this.getInputElement = function() {
			return _inputElement;
		}
		this.getSelectedItem = function() {
			return _lastSelectedItem;
		}
		this.getDefaultValue = function() {
			return _defaultValue;
		}
		function keyDown(event) {
			if (event.keyCode == 13 && _enterCallback != null) {
				_enterCallback(self);
				return;
			/*} else if (event.keyCode == 27) {
				console.log('canceld ' + _defaultValue);
				if (_setDefaultOnCancel==true) {
					console.log(_inputElement);
					console.log('set default ' + _inputElement.value);
					_inputElement.value = 'katze';
					console.log(_inputElement.value);
				}
				if (_cancelCallback != null) _cancelCallback(self);
				//event.preventCapture();
				return;*/
			} else if (_selectable==true) {
				if (event.keyCode == 38) {
					if (_lastSelectedItem == null) {
						selectItemIndex(0);
						return;
					}
					selectItemIndex(_selectedItemIndex-1);
				} else if (event.keyCode == 40) {
					if (_lastSelectedItem == null) {
						selectItemIndex(0);
						return;
					}
					selectItemIndex(_selectedItemIndex+1);
				}
			}
			if ((event.keyCode < 33 || event.keyCode > 39) &&
						(event.keyCode < 16 || event.keyCode > 20) &&
						event.keyCode != 40 && event.keyCode != 9) {
					delaySubmitCall();
			}
		}

		function delaySubmitCall() {
			/*if (_isReady == false) return;
			_isReady = false;*/
			window.clearTimeout(_submitTimeoutID);
			_submitTimeoutID = window.setTimeout(submitCall, _inputTimeout);
		}

		function submitCall() {
			self.submit(_inputElement.value);
		}
		
		this.submit = function(newValue) {
			window.clearTimeout(_blurTimeoutID);
			if (newValue == undefined) return;
			if (newValue.length < _minInputChars
				|| newValue == _lastInputValue
				|| newValue == _defaultValue) return;
			_lastInputValue = _inputElement.value = newValue;
			if (_submitCallback !== null) {
				_selectable = false;
				_submitCallback(self);
			}
		}
		this.makeSelectableResults = function(resultListSelector, selectedStateClass, onSelect) {
			_lastSelectedItem = null;
			_selectedItemIndex = 0;
			_selectCallback = onSelect;
			_resultListSelector = resultListSelector;
			_selectedStateClass = selectedStateClass;
			_selectable = true;
		}

		this.unbind = function() {
			if (_inputElement != null) {
				$(_inputElement).unbind('keydown', keyDown);
				$(_inputElement).unbind('focus', onFocus);
				$(_inputElement).unbind('blur', onBlur);
			}
		}

		function selectItemIndex(index) {
			if (_lastSelectedItem != null && _selectedStateClass != undefined) $(_lastSelectedItem).removeClass(_selectedStateClass);
			var itemList = $(_resultListSelector);
			if (itemList.length == 0) return;
			if (index > itemList.length-1) index = itemList.length-1;
			else if (index < 0) index = 0;
			_lastSelectedItem = itemList[index];
			_selectedItemIndex = index;
			if (_selectedStateClass != undefined) $(_lastSelectedItem).addClass(_selectedStateClass);
			if (_selectCallback != null) _selectCallback(self);
		}

		this.onInput = function (callback, timeout) {
			_submitCallback = callback;
			if (timeout != undefined) _inputTimeout = timeout;
			return this;
		}
		this.onEnter = function(callback) {
			_enterCallback = callback;
			return this;
		}
		this.minInputChars = function(minInputChars) {
			_minInputChars = minInputChars;
			return this;
		}
		init(inputElement);
		return this;
	}
	
	if( typeof $ty != "undefined" && $.widgetLoader != "undefined" ) {
		$.widgetLoader.widgets['suggest'] = tySuggestPlugin;
	} else {
		$.fn.suggest = function(settings) {
			return this.each(function(idx,element) {
				var tyElement = $(element);
				var instance = new tySuggestPlugin(tyElement, settings);
				tyElement.data('suggest', instance);
			});
		}
	}
})(jQuery);
// set back original jQuery object
if( typeof $ty != "undefined" ) {
	jQuery = _jQuery;
}

