$(document).ready(function(){
	
	function Search(){
		this.busy = false;
		this.finalText;
		this.searched = false;

		this.setBusy = function(busy){
			this.busy = busy;
		};
		
		this.isBusy = function(){
			return this.busy;
		};
		
		this.setFinalText = function(text){
			this.finalText = text;
		};
		
		this.getFinalText = function(){
			return this.finalText;
		};

		this.focus = null;

		this.setFocus = function(focus){
			this.focus = focus;
		};

		this.getFocus = function(){
			return this.focus;
		};
		
		this.setSearched = function(searched){
			this.searched = searched;
		};
		
		this.getSearched = function(){
			return this.searched;
		};
	}
	
	var extension = {
		search: new Search()
	};
	
	$.extend(true,window.TAP,extension);
	
	var search = window.TAP.search;	
	
	$('#searchBox').bind('keyup', function(e){
		
		if(search.isBusy())
		{
			return;
		}
		else
		{
			search.setBusy(true);
		}
		
		$("#uri").val('');
		
		var text = $("#searchBox").val().toLowerCase();
		
		var code = e.keyCode;
		
		if (text != '') 
		{
		 	if (code == 13 || code == 32 || code == 16) // Enter Key and Space Key and Shift
			{
				search.setBusy(false);
			}
			else // Every other key
			{
				autoComplete(text);
			}
		}
		else
		{
			defaultSearchBox();
		}
	});
	
	$('#searchBox').bind('focus', function(){
		
		search.setFocus('searchBox');
		
		var text = $("#searchBox").val().toLowerCase();
		
		search.setBusy(false);
		
		if( (text != '') && search.getSearched())
		{
			//autoComplete(text);
			if ( $("#search_results").css('display') == 'none' )
				$("#search_results").show(750);
		}
	});

	$('#searchBox').bind('blur', function(e){

		search.setBusy(false);

		if (search.getFocus() == 'results')
		{
			if (search.getFocus() == 'searchBox') 
			{
				search.setFocus('null');
			}
			
			$(this).focus();
		}
		else
		{
			if ( $('#search_results').css('display') != 'none' )
				$("#search_results").hide(750);
		}
	});

	$('#searchBox').bind('click', function(){
		search.setFocus('searchBox');
		if ( $('#search_results').html() !== '' && $('#search_results').css('display') == 'none' )
			$('#search_results').show(750);
	});

	$('#search_results').bind('mouseenter', function(){
		search.setFocus('results');
	});

	$('#search_results').bind('mouseleave', function(){
		search.setFocus(null);
		$("#searchBox").focus();
	});
	
	$('#search_results').bind('click',function(){
		search.setFocus('results');
	});
	
	

	function autoComplete(text){
		
		var finalText = search.getFinalText();
		
		var re = new RegExp('^('+ finalText +')');
		if (text.match(re) != null) {
			search.setBusy(false);
		}
		else {
			$.ajax({
				type: "POST",
				url: "/perl/uksearch.pl",
				data: "option=auto_complete" +
				"&searchBox=" + encodeURIComponent(text),
				dataType: 'json',
				success: function(json){
					
					var cat_flag = false;
					var manu_flag = false;
					
					var html;
					var list1;
					var list2;
					var name;
					var url;
					
					html = '<ul class="out_ul">';
					list1 = '<li><ul class="in_ul"><li id="box_heading"><strong>Categories:</strong></li>';
					list2 = '<li><ul class="in_ul"><li id="box_heading"><strong>Manufacturers:</strong></li>';
					
					$.each(json, function(index, item){
						if(item.type == 1)
						{
							cat_flag = true;
							
							name = item.name;
							url = item.url;
							
						list1 += '<li><a style="color:#666666" href="'+ url +'" >'+ name +'</a></li>';
						}
						else if(item.type == 2)
						{
							manu_flag = true;
							
							name = item.name;
							url = item.url;
							
						list2 += '<li><a style="color:#666666" href="'+ url +'" >'+ name +'</a></li>';
						}
					});
					
					if(cat_flag)
					{
						list1 += '</ul></li>';
						html += list1;
					}
					
					if(manu_flag)
					{
						list2 += '</ul></li>';
						html += list2;
					}
					
					html+= '</ul>';
					
					if(!cat_flag && !manu_flag)
					{
						html = 'none';
						console.log(html);
					}
					
					if (text != $("#searchBox").val().toLowerCase()) {
						autoComplete($("#searchBox").val().toLowerCase());
						return;
					}
					
					search.setBusy(false);
					
					if (html != 'none' && text != '') 
					{
						
						search.setSearched(true);
						
						$("#search_results").html(html);
						$("#search_results").show(750);
						
						$(".auto_result").bind("click", function(){
						
							var uri = $(this).attr("id");
							var text = $("span", $(this)).attr("name");
							
							$("#searchBox").val(text);
							$("#uri").val(uri);
							
							defaultSearchBox();
						});
						
						$(".auto_result").bind("mouseover", function(){
							$(this).css("background-color", "#BDEDFF");
						});
						
						$(".auto_result").bind("mouseout", function(){
							$(this).css("background-color", "White");
						});
						
						$("#close_button").bind("click", function(){
							if ($('#search_results').css('display') != 'none') 
							{
								$("#search_results").hide(750);
								$("#searchBox").blur();
							}
						});
					}
					else if (html == 'none') 
					{
							search.setFinalText(text);
							defaultSearchBox();
							console.log("html was none");
					}
					else 
					{
						defaultSearchBox();
					}
				}
			});
		}
	};
	
	function defaultSearchBox(){
		search.setBusy(false);
		
		$("#search_results").empty();
		if ( $('#search_results').css('display') != 'none' )
			$("#search_results").hide(750);
	};
	
	$("#search_form").bind("submit", function(){
		
		var uri = $("#uri").val();
		
		if( uri == '')
		{
			return true;
		}
		else
		{
			window.location.href = "" + uri;
			return false;
		}
	});
});

/*function adv_srch(){
	var index = document.getElementById('srch_drop').selectedIndex;
	var cat = document.getElementById('srch_drop').options[index].value;
	
	if(index == 0) 
	{ 
		return; 
	}
	else 
	{
		window.location ='/scripts/search?action=adv&_t=' + cat;
	}
}*/
