(function ($) {
	$.fn.searchOnType = function (options) {
		var o = $.extend({}, $.fn.searchOnType.defaults, options);
		return this.each(function () {
			$Input = $(this);
			
			$Input.attr("autocomplete","off");
			
			var opts = $.meta ? $.extend({}, o, $Input.data()) : o;
			var timeOutID = 0;
			var searchWords = "";
			var $ResultList = null;
			var searchActive = false;			
			
			if(opts.inittext != "" && $Input.val() == ""){
				$Input.val(opts.inittext);
			}
			
			$Input.change(function () {
				trigSearch.call(this);
			});

			var key_array = [9, 13, 16, 17, 18, 19, 20, 27, 33, 34, 35, 36, 37, 38, 39, 40, 44, 45];
			$Input.keyup(function (event) {
				var key = event.charCode || event.keyCode || 0;
				if ($.inArray(key, key_array) == -1) {
					trigSearch.call(this);
				}
			});

			var listIndex = -1;
			$Input.keydown(function (event) {
				var key = event.charCode || event.keyCode || 0;
				clearTimeout(timeOutID);
				if ($.inArray(key, key_array) > -1) {

					$TRs = $("tr", $ResultList).not("tr.heading");
					$TRs.each(function (index) {
						if ($(this).hasClass("over")) {
							listIndex = index;
						}
					})
					
					if (key == 13 || key == 27) {
						$(this).blur();
						if (key == 13) {
							if (listIndex < 0) {
								if ($(this).val() != this.defaultValue && $(this).val() != "") {									
									opts.submitQuery();
									return false;
								}
							} else {								
								window.location.href = URL + $("tr.over a:first", $ResultList).attr("href");
								return false;
							}
						} else if (key == 27) {
							if ($ResultList != null) killList();
						}
						return true;
					}
					if ($ResultList != null){
						if (key == 38) // up
							listIndex = (listIndex > 0) ? listIndex - 1 : $TRs.length - 1;
						if (key == 33) // page up
							listIndex = 0;
						if (key == 40) // down
							listIndex = (listIndex < $TRs.length - 1) ? listIndex + 1 : 0;
						if (key == 34) // page down
							listIndex = $TRs.length - 1;
						if (listIndex > -1) 
							selectItem($TRs.eq(listIndex));
					}
				}
			});

			function selectItem($SelTR) {
				var $TR = $("tr", $ResultList).not("tr.heading");
				$TR.removeClass("over");
				$SelTR.addClass("over");
			}
			$Input.focus(function () {
				if ($(this).val() == opts.inittext) {
					$(this).val("");
				} else {
					searchWords = $(this).val();
					trigSearch.call(this);
				}
			});
			$Input.blur(function () {
				clearTimeout(timeOutID);
				timeOutID = setTimeout(function () {
					if ($(this).val() == "") $(this).val(opts.inittext);
					killList();
					searchActive = false;
				},
				300);
			});
			function trigSearch() {
				clearTimeout(timeOutID);
				var This = this;
				if ($(this).val().length > 1) {
					timeOutID = setTimeout(function(){
						runSearch.call(This);
					}, 300);
				} else {
					searchActive = false;
					listIndex = -1;
					killList();
				}
			}
			function runSearch() {
				var $This = $(this);
				var searchString = $This.val().replace(/^\s+|\s+$/g, "");
				searchString = encodeURIComponent(searchString);
				
				var maxResults = 5;

				$This.addClass("ajaxLoading");
				var $This = $(this);
				
				var jsonURL = opts.searchURL + 's=' + searchString + '&max=' + maxResults + '&t=' + opts.type + '&jsoncallback=?';
				$.getJSON(jsonURL, function(data){
					searchComplete.call($This, data);				
				});
				//$.getJSON("prototypes/META.json", searchComplete);
			}
			var reEscape = new RegExp('(\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'].join('|\\') + ')', 'g');
			function formatKeyWord(value, currentValue) {
				var pattern = '(' + currentValue.replace(reEscape, '\\$1') + ')';
				return value.replace(new RegExp(pattern, 'gi'), '<span class="searchWords">$1<\/span>');
			}
			function searchComplete(data) {
	
				
				var $This = $(this);
				$This.removeClass("ajaxLoading");
				var searchResults = formatResults(data, $This.val());

				searchResults = '<div class="'+opts.containerClass+'">' + searchResults + '</div><div class="'+opts.bottomClass+'"></div>';
				$ResultList = $('<div class="'+opts.resultClass+'">' + searchResults + '</div>');

				killList();

				var $InputContainer = $(opts.element);
				var $Container = $(opts.container);				

				var left = $InputContainer.offset().left - $Container.offset().left + opts.left;
				var top = $InputContainer.offset().top - $Container.offset().top + opts.top;		
				
				$ResultList.css({"left" : left+"px", "top" : top+"px"});

				var $HeadingA = $("tr.heading:last a", $ResultList);
				
				$HeadingA.click(opts.submitQuery);
				
				var $TRItems = $("tr", $ResultList).not("tr.heading");
				$TRItems.click(function () {
					var $a =$("a:first", this);
					if($a.length > 0){
						window.location.href = $a.attr("href");
					}
				});
				$TRItems.mouseover(function () {
					selectItem($(this));
				});
				$TRItems.mouseout(function () {
					$(this).removeClass("over");
				});
				$Container.append($ResultList);
				if (!searchActive) {
					$ResultList.hide();
					$ResultList.slideDown("slow");
				}

				searchActive = true;

				if ($.browser.msie && Number($.browser.version.charAt(0)) < 7) {
					$("select").hide();
				}

				$("." + opts.containerClass, $ResultList).pngfix();
				$("." + opts.bottomClass, $ResultList).pngfix();
			}
			
			function formatResults(data, searchString) {
				var searchResults = "";
				if (typeof(data.books) != "undefined" && data.books.length > 0) {
					searchResults += '<tr class="heading"><td class="category">Titler</td><td colspan="2">Viser ' + data.books.length + ' af ' + data.bookcount + ' resultater</td></tr>';
					for (var i = 0; i < data.books.length; i++) {
						searchResults += '<tr><td><span class="imgCol"><a href="' + data.books[i].redirecturl + '"><img src="' + data.books[i].imageurl + '" width="13" /></a></span>';
						searchResults += '<span class="nameCol"><a href="' + data.books[i].redirecturl + '">' + formatKeyWord(data.books[i].booktitle, searchString) + '</a></span></td>';
						searchResults += '<td >' + formatKeyWord(data.books[i].authors, searchString) + '</td>';
						if(opts.format == "small"){
							searchResults += '<td></td></tr>';
						} else {
							searchResults += '<td class="propertiesCol"><span class="smallRating_' + data.books[i].averagerating + '"></span>';
							searchResults += '<span class="smallRatingCount">(' + data.books[i].ratings + ')</span>';
							searchResults += '<span class="smallCommentCount"><span>' + data.books[i].comments + '</span></span></span></td></tr>';
						}						
					}					
				}
				
				if (typeof(data.authors) != "undefined" && data.authors.length > 0) {
					searchResults += '<tr class="heading"><td class="category">Forfattere</td><td colspan="2">Viser ' + data.authors.length + ' af ' + data.authorcount + ' resultater</td></tr>';
					for (var i = 0; i < data.authors.length; i++) {
						searchResults += '<tr><td colspan="3"><span class="imgCol"><a href="' + data.authors[i].redirecturl + '"><img src="' + data.authors[i].imageurl + '" width="13" /></a></span>';
						searchResults += '<span class="nameCol"><a href="' + data.authors[i].redirecturl + '">' + formatKeyWord(data.authors[i].authorname, searchString) + '</a></span></td>';
					}
				}
				if (typeof(data.articles) != "undefined" && data.articles.length > 0) {
					searchResults += '<tr class="heading"><td class="category">Artikler</td><td colspan="2">Viser ' + data.articles.length + ' af ' + data.articlecount + ' resultater</td></tr>';
					for (var i = 0; i < data.articles.length; i++) {
						searchResults += '<tr><td><span class="imgCol"><a href="' + data.articles[i].redirecturl + '"><img src="' + data.articles[i].imageurl + '" width="13" /></a></span>';
						searchResults += '<span class="nameCol"><a href="' + data.articles[i].redirecturl + '">' + formatKeyWord(data.articles[i].articlename, searchString) + '</a></span></td>';
						searchResults += '<td colspan="2">' + formatKeyWord(data.articles[i].articleauthor, searchString) + '</td>';
					}
				}
				if (typeof(data.videos) != "undefined" && data.videos.length > 0) {
					searchResults += '<tr class="heading"><td class="category">Videos</td><td colspan="2">Viser ' + data.videos.length + ' af ' + data.videocount + ' resultater</td></tr>';
					for (var i = 0; i < data.videos.length; i++) {
						searchResults += '<tr><td><span class="imgCol"><a href="' + data.videos[i].videourl + '"><img src="' + data.videos[i].imageurl + '" width="13" vspace="3" /></a></span>';
						searchResults += '<span class="nameCol"><a href="' + data.videos[i].videourl + '">' + formatKeyWord(data.videos[i].videoname, searchString) + '</a></span></td>';
						searchResults += '<td colspan="2">' + data.videos[i].duration + '</td>';
					}
				}
				if (searchResults == "") {
					searchResults = (searchResults == "") ? '<tr><td>Din søgning gav intet resultat</td></tr>' : searchResults;
				} else {
					searchResults += '<tr class="heading"><td></td><td colspan="2"><a href="#">Se alle resultater &gt;&gt;</a></td></tr>';
				} //
				searchResults = '<table width="100%" border="0" cellspacing="0" cellpadding="0">' + searchResults + '</table>';
				return searchResults;
			}

			function killList() {
				listIndex = -1;
				$("."+opts.resultClass).remove();
				if ($.browser.msie && Number($.browser.version.charAt(0)) < 7) {
					$("select").show();
				}
			}
		});
	};
	$.fn.searchOnType.defaults = {
		inittext: "",
		type: "",
		top: 0,
		left: 0,
		format: "normal",
		containerClass: "searchOnTypeContainer",
		bottomClass: "searchOnTypeBottom"
	};
})(jQuery);



(function(b){b.fn.searchOnType=function(q){var n=b.extend({},b.fn.searchOnType.defaults,q);return this.each(function(){function o(a){b("tr",g).not("tr.heading").removeClass("over");a.addClass("over")}function m(){clearTimeout(j);var a=this;if(b(this).val().length>1)j=setTimeout(function(){r.call(a)},300);else{k=false;h=-1;l()}}function r(){var a=b(this),e=a.val().replace(/^\s+|\s+$/g,"");e=encodeURIComponent(e);a.addClass("ajaxLoading");a=b(this);b.getJSON(f.searchURL+"s="+e+"&max=5&t="+f.type+"&jsoncallback=?", function(d){s.call(a,d)})}function i(a,e){var d="("+e.replace(t,"\\$1")+")";return a.replace(RegExp(d,"gi"),'<span class="searchWords">$1</span>')}function s(a){var e=b(this);e.removeClass("ajaxLoading");a=u(a,e.val());a='<div class="'+f.containerClass+'">'+a+'</div><div class="'+f.bottomClass+'"></div>';g=b('<div class="'+f.resultClass+'">'+a+"</div>");l();var d=b(f.element);a=b(f.container);e=d.offset().left-a.offset().left+f.left;d=d.offset().top-a.offset().top+f.top;g.css({left:e+"px",top:d+"px"}); b("tr.heading:last a",g).click(f.submitQuery);e=b("tr",g).not("tr.heading");e.click(function(){var c=b("a:first",this);if(c.length>0)window.location.href=c.attr("href")});e.mouseover(function(){o(b(this))});e.mouseout(function(){b(this).removeClass("over")});a.append(g);if(!k){g.hide();g.slideDown("slow")}k=true;b.browser.msie&&Number(b.browser.version.charAt(0))<7&&b("select").hide();b("."+f.containerClass,g).pngfix();b("."+f.bottomClass,g).pngfix()}function u(a,e){var d="";if(typeof a.books!="undefined"&& a.books.length>0){d+='<tr class="heading"><td class="category">Titler</td><td colspan="2">Viser '+a.books.length+" af "+a.bookcount+" resultater</td></tr>";for(var c=0;c<a.books.length;c++){d+='<tr><td><span class="imgCol"><a href="'+a.books[c].redirecturl+'"><img src="'+a.books[c].imageurl+'" width="13" /></a></span>';d+='<span class="nameCol"><a href="'+a.books[c].redirecturl+'">'+i(a.books[c].booktitle,e)+"</a></span></td>";d+="<td >"+i(a.books[c].authors,e)+"</td>";if(f.format=="small")d+="<td></td></tr>"; else{d+='<td class="propertiesCol"><span class="smallRating_'+a.books[c].averagerating+'"></span>';d+='<span class="smallRatingCount">('+a.books[c].ratings+")</span>";d+='<span class="smallCommentCount"><span>'+a.books[c].comments+"</span></span></span></td></tr>"}}}if(typeof a.authors!="undefined"&&a.authors.length>0){d+='<tr class="heading"><td class="category">Forfattere</td><td colspan="2">Viser '+a.authors.length+" af "+a.authorcount+" resultater</td></tr>";for(c=0;c<a.authors.length;c++){d+= '<tr><td colspan="3"><span class="imgCol"><a href="'+a.authors[c].redirecturl+'"><img src="'+a.authors[c].imageurl+'" width="13" /></a></span>';d+='<span class="nameCol"><a href="'+a.authors[c].redirecturl+'">'+i(a.authors[c].authorname,e)+"</a></span></td>"}}if(typeof a.articles!="undefined"&&a.articles.length>0){d+='<tr class="heading"><td class="category">Artikler</td><td colspan="2">Viser '+a.articles.length+" af "+a.articlecount+" resultater</td></tr>";for(c=0;c<a.articles.length;c++){d+='<tr><td><span class="imgCol"><a href="'+ a.articles[c].redirecturl+'"><img src="'+a.articles[c].imageurl+'" width="13" /></a></span>';d+='<span class="nameCol"><a href="'+a.articles[c].redirecturl+'">'+i(a.articles[c].articlename,e)+"</a></span></td>";d+='<td colspan="2">'+i(a.articles[c].articleauthor,e)+"</td>"}}if(typeof a.videos!="undefined"&&a.videos.length>0){d+='<tr class="heading"><td class="category">Videos</td><td colspan="2">Viser '+a.videos.length+" af "+a.videocount+" resultater</td></tr>";for(c=0;c<a.videos.length;c++){d+= '<tr><td><span class="imgCol"><a href="'+a.videos[c].videourl+'"><img src="'+a.videos[c].imageurl+'" width="13" vspace="3" /></a></span>';d+='<span class="nameCol"><a href="'+a.videos[c].videourl+'">'+i(a.videos[c].videoname,e)+"</a></span></td>";d+='<td colspan="2">'+a.videos[c].duration+"</td>"}}if(d=="")d=d==""?"<tr><td>Din s\u00f8gning gav intet resultat</td></tr>":d;else d+='<tr class="heading"><td></td><td colspan="2"><a href="#">Se alle resultater &gt;&gt;</a></td></tr>';return d='<table width="100%" border="0" cellspacing="0" cellpadding="0">'+ d+"</table>"}function l(){h=-1;b("."+f.resultClass).remove();b.browser.msie&&Number(b.browser.version.charAt(0))<7&&b("select").show()}$Input=b(this);$Input.attr("autocomplete","off");var f=b.meta?b.extend({},n,$Input.data()):n,j=0,g=null,k=false;f.inittext!=""&&$Input.val()==""&&$Input.val(f.inittext);$Input.change(function(){m.call(this)});var p=[9,13,16,17,18,19,20,27,33,34,35,36,37,38,39,40,44,45];$Input.keyup(function(a){b.inArray(a.charCode||a.keyCode||0,p)==-1&&m.call(this)});var h=-1;$Input.keydown(function(a){a= a.charCode||a.keyCode||0;clearTimeout(j);if(b.inArray(a,p)>-1){$TRs=b("tr",g).not("tr.heading");$TRs.each(function(e){if(b(this).hasClass("over"))h=e});if(a==13||a==27){b(this).blur();if(a==13)if(h<0){if(b(this).val()!=this.defaultValue&&b(this).val()!=""){f.submitQuery();return false}}else{window.location.href=URL+b("tr.over a:first",g).attr("href");return false}else a==27&&g!=null&&l();return true}if(g!=null){if(a==38)h=h>0?h-1:$TRs.length-1;if(a==33)h=0;if(a==40)h=h<$TRs.length-1?h+1:0;if(a==34)h= $TRs.length-1;h>-1&&o($TRs.eq(h))}}});$Input.focus(function(){if(b(this).val()==f.inittext)b(this).val("");else{b(this).val();m.call(this)}});$Input.blur(function(){clearTimeout(j);j=setTimeout(function(){b(this).val()==""&&b(this).val(f.inittext);l();k=false},300)});var t=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\)","g")})};b.fn.searchOnType.defaults={inittext:"",type:"",top:0,left:0,format:"normal",containerClass:"searchOnTypeContainer",bottomClass:"searchOnTypeBottom"}})(jQuery);
