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('Osumia hakulausekkeella <strong>' + searchStringShow + '</strong>');
		
				var suggestList = document.createElement('ul');
				
				var suggestCount = 0;
							
		   		$.each(kwlist, function(keyword, items) {
					if ( (keyword.toLowerCase()).indexOf(searchString.toLowerCase()) == 0 && suggestCount < suggestMax ) {
						suggestCount++;
						var suggestListItem = document.createElement('li');
						var suggestListItemKeyword = document.createElement('h4');
						$.each(items, function(i, content) {
							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(hilightRE, '<strong>' + searchString + '</strong>'));
							$(suggestListItem).append(suggestListItemTitle);
						});
						$(suggestList).append(suggestListItem);
					}
					if ( keyword.indexOf(searchString) == 0 && suggestCount == suggestMax ) {
						var suggestMoreMessage = document.createElement('a');
						$(suggestMoreMessage)
							.text('Lisää hakutuloksia hakusivulla.')
							.addClass('suggest-list-more');
					}
				});
				
				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 suggestDiv = document.createElement('div');
				$(suggestDiv)
					.attr('id', listId + '-suggest-list')
					.css('zIndex', '90')
					.addClass('suggest-list')
					.append(suggestP)
					.append(suggestList)
					.append(closeSuggestDiv);

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

				if ( suggestCount == 0 ) {
					var suggestNullMessage = document.createElement('p');
					$(suggestNullMessage)
						.text("Sivustolla ei ole hakuasi vastaavia otsikoita.")
						.addClass("no-results");
					$(suggestDiv).append(suggestNullMessage);
				}
				if ( suggestCount == suggestMax ) {
					var suggestMoreMessage = document.createElement('a');
					$(suggestMoreMessage)
						.text('Lisää hakutuloksia hakusivulla.')
						.attr('href', '/haku/?E*Q=' + this.value)
						.addClass('suggest-list-more');
					$(suggestDiv).append(suggestMoreMessage);
				}
				
				var searchMoreText = document.createElement('a');
				$(searchMoreText)
					.attr({href: '/haku/?E*Q=' + this.value, id: listId + '-search-more'})
					.addClass('suggest-list-search')
					.html('Suorita vapaasanahaku hakulausekkeella "' + this.value + '".')
					.css({display: 'block', marginTop: '15px'})
					.mouseover(function() {
						$(this).css('cursor', 'pointer');
					});
				$(suggestDiv).append(searchMoreText);

				$(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;
};
