var lastSearchTerm;

jQuery(document).ready( function() {
	// SearchSuggestions
	jQuery('#search').keyup( function(event) {
		event.stopImmediatePropagation();
		
		var searchQuery = jQuery(this).attr('value');
		if( lastSearchTerm == searchQuery )
			return false;
		
		lastSearchTerm = searchQuery;
		if( searchQuery.length < 3 ) {
			jQuery('.SearchSuggestions').css('display', 'none');
			return false;
		}
		
		setTimeout("getSearchSuggestions('" + searchQuery + "')", 350);
		return true;
	});
	
	// SearchSuggestionsBrowse
	jQuery('#search').keydown( function(event) {
		event.stopImmediatePropagation();
		
		if( event.keyCode == 38 ) // arrow up
		{
			SearchSuggestionsBrowse('up'); 
			return false;
		}
		else if( event.keyCode == 40 ) // arrow down
		{
			SearchSuggestionsBrowse('down'); 
			return false;
		}
		else if( event.keyCode == 9 ) // tab
		{
			ApplySuggestionViaTabKey();
			return false;
		}
		else if( event.keyCode == 13 ) // enter
		{
			SearchSuggestionsSubmit();
			return false;
		}
		
		// aktive suggestion nach keypress "deaktivieren"
		jQuery('.SearchSuggestions .suggestionactive').attr('class', 'suggestion');
	});
	
	// hover per js, da sonst doppelte hovers wenn pfeiltasten benutzt werden
	jQuery('.SearchSuggestions').mouseover( function(event) {
		var suggestion = jQuery(event.target).parent('.suggestion');
		if( suggestion.length != 1)
			return false;
		
		jQuery('.SearchSuggestions .suggestionactive').attr('class', 'suggestion');
		suggestion.attr('class', 'suggestionactive');
		return false;
	});
	
	jQuery('.SearchSuggestions').mouseout( function() {
		jQuery('.SearchSuggestions .suggestionactive').attr('class', 'suggestion');
		return false;
	});
});

function getSearchSuggestions(searchquery)
{
	if( jQuery('#search').attr('value') != searchquery ) {
		return false;
	}
	
	var suggestionBox = jQuery('.SearchSuggestions');
	
	jQuery.ajax({
		   type: "POST",
		   url: DSTORE_BASE_URL + '/index.php',
		   data: {screen:jQuery('#search').attr('rel'),search:searchquery},
		   dataType: "json",
		   success: function(response)
		   {
			   // response in javascript objekt eval'en
			   var suggestions = jQuery.evalJSON(unescape(response.Content));
			   
			   // alte suggestions entfernen falls vorhanden
			   suggestionBox.children('.suggestion').remove();
			   suggestionBox.children('.suggestionactive').remove();

			   // referenz-zeile einer suggestion in der "dropdown"-box kopieren
			   // diese wird verwendet um die gefundenen suggestions in die box einzufügen
			   var suggestionRow = jQuery('.SearchSuggestionReferenceRow').clone();
			   suggestionRow.attr('class', 'suggestion');
			   
			   if( suggestions.length == 0 ) {
				   suggestionBox.css('display', 'none');
				   return true;
			   }
			   
			   // anzahl von suggestions einschränken
			   var numberOfSuggestions = suggestions.length;
			   
			   if (numberOfSuggestions >= 6)
				   numberOfSuggestions = 5;
			   
			   // gefundene suggestions durchlaufen und zur dropdown-box hinzufügen
			   for( var i=0; i < numberOfSuggestions; i++ )
			   {
				   var newSuggestion = suggestionRow.clone();
				   var regex = new RegExp(jQuery('#search').attr('value'), 'i');
				   var foundAtPos = suggestions[i].Subject.search(regex);
				   if( foundAtPos > -1 ) {
					   var searchTermInResult = suggestions[i].Subject.slice(foundAtPos, foundAtPos + jQuery('#search').attr('value').length);
					   newSuggestion.children('.suggestvalue').html(suggestions[i].Subject.replace( regex, '<strong>' + searchTermInResult + '</strong>') + ' <small>(' + suggestions[i].ForumName + ')</small>');
				   }
				   else {
					   newSuggestion.children('.suggestvalue').html(suggestions[i].Subject) ; // + ' (' + suggestions[i].ForumName + ')'
				   }
				   
				   newSuggestion.children('.searchvalue').html(suggestions[i].Subject); // + ' (' + suggestions[i].ForumName + ')'
				   
			   		// onclick-event fuer suggestion: übernehmen und artikel-screen aufrufen
			   		newSuggestion.children('.suggestvalue').click( function(event) {
			   			event.stopImmediatePropagation();

			   			jQuery('#search').attr('value', jQuery(this).siblings('.searchvalue').html());
			   			

			   			if( jQuery(this).siblings('.url').length == 1 && jQuery(this).siblings('.url').html().length > 0 ) {
			   				window.location.href = jQuery(this).siblings('.url').html().replace(/\&amp\;/, '&');
			   			}
			   			else
			   			{
			   				jQuery('#search').attr('value', '"' + jQuery('#search').attr('value') + '"');
			   				jQuery('#search').closest('form').submit();
			   			}
			   			
			   			return false; 
			   		});
				   
				   suggestionBox.append(newSuggestion);
			   }
			   
			   suggestionBox.css('display', 'block');
			   
		   },
		   error: function(response, ajaxOptions, thrownError)
		   {
			   suggestionBox.children('.suggestion').remove();
			   suggestionBox.children('.suggestionactive').remove();
		   }
	});
}

function SearchSuggestionsBrowse(direction)
{
	if( direction != 'down' && direction != 'up' )
		return false;
	
	var suggestionBox = jQuery('.SearchSuggestions');
	if( suggestionBox.css('display') != 'block' )
		return false;

	var suggestions = suggestionBox.children();
	var currentActiveSuggestion = jQuery('.SearchSuggestions .suggestionactive');
	if( currentActiveSuggestion.length < 1 ) {
		if( direction == 'down' )
			browseToPos = 0;
		else if( direction == 'up' )
			browseToPos = suggestions.length - 1;
	}
	else
	{
		if( suggestions.length == 1 )
			return false;
		
		if( direction == 'down' )
			var browseToPos = currentActiveSuggestion.prevAll().length + 1;
		else if( direction == 'up' )
			var browseToPos = currentActiveSuggestion.prevAll().length - 1;
		
		if( browseToPos < 0 )
			browseToPos = suggestions.length - 1;
		else if( browseToPos >= suggestions.length )
			browseToPos = 0;
		
		currentActiveSuggestion.attr('class', 'suggestion');
	}
	
	jQuery(suggestions[browseToPos]).attr('class', 'suggestionactive');
	return true;
}

function ApplySuggestionViaTabKey()
{
	var currentActiveSuggestion = jQuery('.SearchSuggestions .suggestionactive');
	if( currentActiveSuggestion.length == 0 ) {
		return true;
	}
	
	jQuery('#search').attr('value', currentActiveSuggestion.children('.searchvalue').html());
	jQuery('.SearchSuggestions').css('display', 'none');
}

function SearchSuggestionsSubmit()
{
	var currentActiveSuggestion = jQuery('.SearchSuggestions .suggestionactive');

	if( currentActiveSuggestion.length > 0 ) {
		if( currentActiveSuggestion.children('.url').html() != '' ) {
			window.location.href = currentActiveSuggestion.children('.url').html().replace(/\&amp\;/, '&');
		}
		else {
			jQuery('#search').attr('value', '"' + currentActiveSuggestion.children('.searchvalue').html() + '"');
			jQuery('#search').closest('form').submit();
		}
		
		return true;
	}
	
	jQuery('#search').closest('form').submit();
	return true;
}
