﻿(function ($) {
	$.fn.searchOnType = function (options) {
		var o = $.extend({}, $.fn.searchOnType.defaults, options);
		
		
		return this.each(function () {
			$Input = $(this);
			debug($Input.attr("id"))
			
			$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) {
				debug("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) {
				debug("searchComplete")
				
				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 (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);