$j.fn.askSuggest = function(options) {
	settings = $j.extend({
		liveSuggestDelay: 1000, // time to wait to fire up ajax request
		liveSuggestTimeout: null,
		liveSuggestResultUrl: null
	}, options);
	
	liveSuggestExtFields = function() {
		// remove pre definied value text
		var oldText = $j('#questionTitle').attr('value');
		
		if(oldText == 'Wie lautet deine Frage?') {
			$j('#questionTitle').attr('value', '').addClass('active');
		}
		
		$j('#questionExp').delay(700).slideDown();
		$j('#askQuestionSample').remove();
	};
	
	liveSuggestSearch = function(option) {
		var inputValue = $j('#questionTitle').attr('value');
		
		if(inputValue.length >= 3) {
			$j('#askQuestionIdle').addClass('loading');
			
			askLiveSearchUrl = $j('input[name="askLiveSearch"]').attr('value');
			
			$j.getJSON(askLiveSearchUrl, { q: inputValue, display: option }, function(json){
				var htmlOutput = '';
				
				if(json.length === 0) {
					// Keine Objekte gefunden
					$j('#askQueryResults').slideUp(100).find('ul').remove();
				} else {
					$j('#askQueryResults').slideDown(200);
					htmlOutput = json.html
				}
				
				$j('#askQueryResults').html(htmlOutput);
				$j('#askQuestionIdle').removeClass('loading');
			});
		}
	};
	
	liveSuggestNavigation = function(direction){
		var resultList = $j('#askQueryResults ul');
		
		// check if any result is selected
		if($j(resultList).find('li.selected').size() === 0) {
			current = -1;
		}
	
		if(direction == 'up') {
			current--;
		} else if(direction == 'down') {
			current++;
		}
		
		// focus active element
		$j(resultList).find('li').removeClass('selected');
		$j(resultList).find('li').eq(current).addClass('selected');
		settings.liveSuggestResultUrl = $j(resultList).find('li').eq(current).find('a').attr('href');
	};
	
	$j('#questionTitle').bind({
		focusin: liveSuggestExtFields,
		click: liveSuggestExtFields,
		focusout: function(e){
			// remove result list
			$j('#askQueryResults').delay(500).slideUp(100, function(){
				$j(this).find('ul').remove();
			});
		},
		keydown: function(e){
			var keyCode = (e.keyCode ? e.keyCode : e.which);
			
			switch(e.keyCode) {
				case 38: // up
					e.preventDefault();
					liveSuggestNavigation('up');
					break;
				case 40: // down
					e.preventDefault();
					liveSuggestNavigation('down');
					break;
				case 8: // delete
					// was auch immer
					break;
				case 9: // tab
					// interrupt live search at user pressed tab key to leave the field
					clearTimeout(settings.liveSuggestTimeout);
					break;
				case 13: // return
					e.preventDefault();
					
					if(settings.liveSuggestResultUrl !== null) {
						window.location = settings.liveSuggestResultUrl;
					} else {
						// interrupt live search at user pressed tab key to leave the field
						clearTimeout(settings.liveSuggestTimeout);
					
						$j(this).effect('highlight', { speed: 500 }, 1500).focus();
						$j('#questionDescription').effect('highlight', { speed: 500 }, 1500).focus();
					}
					
					break;
				case 27: // escape
					$j('#askQueryResults').slideUp(100).find('ul').remove();
					break;
				default:
					if(settings.liveSuggestTimeout){
						clearTimeout(settings.liveSuggestTimeout);
					}
					
					settings.liveSuggestTimeout = setTimeout(function(){
						liveSuggestSearch();
					}, settings.liveSuggestDelay);
							
					break;
			}
		}
	});
	
	$j('#questionDescription').bind({
		focusin: function(){
			clearTimeout(settings.liveSuggestTimeout);
			$j('#askQueryResults').slideUp(100).find('ul').remove();
		}
	});
	
	var questionDefaultTitle = $j('#questionTitle').attr('value');
	
	// simple form validation to prevent empty submitted forms
	$j('#askQuestion form').attr('autocomplete', 'off').attr('autosave', '').submit(function(e){
		var title            = $j('#questionTitle');
		var titleValue       = title.attr('value');
		var defaultTitle     = 'Wie lautet deine Frage?';
		var description      = $j('#questionDescription');
		var descriptionValue = description.attr('value');
		var submitButton     = $j(this).find('input[type=submit], button[type=submit]');
		
		if((titleValue == undefined) || (titleValue == '')) {
			title.effect('highlight', { speed: 500 }, 1500).focus();
			return false;
		} else if(titleValue == descriptionValue) {
			title.effect('highlight', { speed: 500 }, 1500).focus();
			description.effect('highlight', { speed: 500 }, 1500);
			return false;
		} else {
			return true;
		}
	});
		
	$j('a.toggleSuggestionList').live('click', function(e){
		e.preventDefault();
		
		if($j('#askQueryResults ul li').length > 0) {
			$j('#askQueryResults').slideToggle(100);
		} else {
			liveSuggestSearch('random');
		}
	});
	
	return this;
};
