jQuery.fn.d4kwsuggest = function(opts, suggestMax) {

	opts = jQuery.extend({
		
	}, opts);

	if ( ! suggestMax ) {
		var suggestMax = 6;
	}
	var retryTimerActive = false;

	
	this.each(function() {
	
		var kwlistLoaded = false;

		
		var input = $(this);
		
		
		$(input).attr('autocomplete', 'off');
		
		
		var kwlist = {};
		$.ajax({
			type: "POST",
			contentType: "application/json; charset=utf-8",
			data: '{}',
			dataType: "json",
			url: "/--kwlist",
			success: function(data) {
				kwlist = data;
				kwlistLoaded = true;
			}
		});
		
		$(this).keyup(function() {

			if ( retryTimerActive ) {
				return false;
			}
			
			if ( ! kwlistLoaded ) {
				retryTimerActive = true;
				window.setTimeout(function() {
					retryTimerActive = false;
					$(input).trigger('keyup');
				}, 250);				
				return false;
			}
			
		   
		   var listId = this.name.replace("*", "__");

			if ( ! this.value ) {
				$(this).parent().find('div#' + listId + '-suggest-list').remove();
			} else {
				htmlRE = new RegExp('</?\w+((\s+\w+(\s*=\s*(?:".*?"|\'.*?\'|[^\'">\s]+))?)+\s*|\s*)/?>', 'gi');
				var searchString = this.value.replace(htmlRE, '');
				if ( searchString.length > 50 ) {
					var searchStringShow = searchString.substr(0, 50) + "...";
				} else {
					var searchStringShow = searchString;
				}
				hilightRE = new RegExp(searchString, 'gi');
				
				$(this).parents('form').find('div#' + listId + '-suggest-list').remove();
		
				var suggestP = document.createElement('p');
				$(suggestP).html('Ehdotuksia hakulausekkeella <strong>' + searchStringShow + '</strong>');
		
				var suggestList = document.createElement('ul');
				
				var suggestCount = 0;
				
				var searchStrings = this.value.split(" ");
				$.each(searchStrings, function(index, searchString) {
				
				    if ( searchString && searchString != "" ) {

		   		        $.each(kwlist, function(keyword, items) {
					        if ( (keyword.toLowerCase()).indexOf(searchString.toLowerCase()) == 0 && suggestCount < suggestMax ) {
					
					            var suggestChecklist = [];
					            $(suggestList).find('li a').each(function() {
					                suggestChecklist[$(this).text()] = 1;
					            });
					
						        var append = false;
						
				                var suggestListItem = document.createElement('li');
				                var suggestListItemKeyword = document.createElement('h4');
										
						        $.each(items, function(i, content) {
						
						            if (!suggestChecklist[items[i]["Title"]]) {
					
					                    suggestCount++;
						
							            var suggestListItemLink = document.createElement('a');
							            var suggestListItemTitle = document.createElement('a');
							            $(suggestListItemTitle)
								            .attr('href', items[i]["page_uri"])
								            .attr('title', items[i]["page_uri"])
								            .html(items[i]["Title"].replace(searchString, '<strong>' + searchString + '</strong>'));
							            $(suggestListItem).append(suggestListItemTitle);
						
						                append = true;
							
						            };
						
						        });
						
						        if (append) {
						            $(suggestList).append(suggestListItem);
						        };
						
					        };
				        });
				
				    };

				});
				
				var closeSuggestDiv = document.createElement('a');
				var closeSuggestEm = document.createElement('em');
				$(closeSuggestEm).text('Sulje');
				$(closeSuggestDiv)
					.addClass('suggest-list-close')
					.click(function() {
						$(this).parent().remove();
					});
				
				$(closeSuggestDiv).append(closeSuggestEm);
				
				var createMoreButton = '<ul class="search-more-button"><li class="suggestive-button"><a href="/haku/?E*Q=' + this.value + '">Lisää hakutuloksia hakusivulla &raquo;</a></li></ul>';
				
				var createReadMoreHere = '<a id="open-read-more-here">Näytä ohjeet</a>';
				
				var suggestHelpText = '<div style="display: none;" id="suggest-help-text-area"><h3>OHJE</h3><p>Voit hakea sivuston sivuja yhdellä tai useammalla hakusanalla. Haku etsii sivut, joilta löytyy jokainen kirjoittamistasi hakusanoista. Katkaise sanat, jotta haku löytää sanojen eri taivutusmuodot. (Et tarvitse katkaisumerkkejä tai AND-sanoja.)<br/>Lainausmerkeillä voit hakea sanoja, joiden tulee esiintyä sivuilla peräkkäin.<br />Hakuesimerkkejä: yhteystied, aukiolo kesä, "matti meikäläi".</p></div>';
                
				if ( suggestCount == 0 ) {
					var suggestNullMessage = document.createElement('p');
					$(suggestNullMessage)
						.html('Pikahaku ei löytänyt hakusanoja vastaavia ehdotuksia.<br />Tee tarkempi haku: paina "Hae"-painiketta tai "Lisää hakutuloksia hakusivulla" -linkkiä.')
						.addClass("no-results");
				}                
                
				var suggestDiv = document.createElement('div');
				$(suggestDiv)
					.attr('id', listId + '-suggest-list')
					.css('zIndex', '90')
					.addClass('suggest-list')
					.append(suggestP)
					.append(suggestList)
					.append(suggestNullMessage)
					.append(createMoreButton)
					.append(createReadMoreHere)
					.append(closeSuggestDiv)
					.append(suggestHelpText);
                					
                $(suggestDiv).find("#open-read-more-here").click( function(){
                    $("#suggest-help-text-area").toggle("fast");
                });					

				
				$(document).keypress(function(key) {
					if (key.keyCode == 27) {
						$('input').blur();
						$(suggestDiv).remove();
					}
				});
				


				$(this).after(suggestDiv);


				
				if ( ! $('.suggest-list-background').length ) {
				var suggestDivBackground = document.createElement('div');
				$(suggestDivBackground)
					.addClass('suggest-list-background')
					.css({
						zIndex: '20',
						position: 'fixed',
						_position: 'absolute',
						left: '0',
						top: '0',
						width: '100%',
						height: '100%'
					})
					.click(function() {
						$(".suggest-list, .suggest-list-background").remove();
					});
				$(this).after(suggestDivBackground);
				}
				
   			}
		});        

	});
	return this;
};

