jQuery.fn.quickSearch = function() {
	var minInput = 2;
	var textInput = $j(this);
	var container = $j('.quicksearch-results');
	var thisObject = this;
	var searchData;
	
	$j.getJSON('/search/getLookAheadData/json', setData);
	
	function setData(json)
	{
		searchData = json;
	}
	
	textInput.keyup(function(key) {
			if (key.which == 27) { // escape
				hide();
				return false;
			}
			
			if(key.which == 13) { // return key
				var selected = container.find('li.selected');
				if (selected.length === 0) {
					$j(this).closest('form').submit();
					return true;
				} else {
					var loc = selected.find('a').attr('href');
					if(loc == undefined) loc = '/experts';
					window.location = loc;
					return false;
				}
			}

			if(key.which == 40 || key.which == 9 || key.which == 38)
			{
				key.preventDefault();
				var items = container.find('li');
				var selected = items.filter('.selected');
				selected.removeClass("selected");
				
				if (key.which == 40 || key.which == 9) { // down key
					if(selected.length === 0 || selected.next().length === 0)
						selected = items.eq(0);
					else
						selected = selected.next();
				} else if (key.which == 38) { // up key
					if(selected.prev().length === 0)
					{
						hide();
						return false;
					}
					else
						selected = selected.prev();
				}
				selected.addClass("selected");
				return false;
			}
			
			checkForMatches()
	})
	
	function checkForMatches(){
		var terms = textInput.val();
		if(terms.length < minInput){
			hide();
			return;
		}
		var matches = false;
		
		textInput.addClass('throbber');
		container.html('<ul></ul>');
		list = container.children();
		list.hide();
		
		// pattern for bounded matches
		var regex = new RegExp('\\b' + terms ,'i');
		
		for(var i in searchData['experts'])
		{
			var expert = searchData['experts'][i];
			if(expert.match(regex) != null)
			{
				if(!matches) list.append('<li class="qs-header">Experts:</li>');
				matches = true;
				appendExpert(i,expert);
			}
		}
		
		for(var i in searchData['services'])
		{
			
			var service = searchData['services'][i];
			if(service.name.match(regex) != null)
			{
				matches = true;
				list.append('<li class="qs-header">Specialization: <a href="/services/service/id/'+i+'">'+service.name+'</a></li>');
				for(x in service.experts)
					appendExpert(service.experts[x],searchData.experts[service.experts[x]]);
			}
		}
		
		for(var i in searchData['locations'])
		{
			
			var location = searchData['locations'][i];
			if(location.name.match(regex) != null)
			{
				matches = true;
				list.append('<li class="qs-header">Location: <a href="/experts/getByLocation/id/'+i+'">'+location.name+'</a></li>');
				for(x in location.experts)
					appendExpert(location.experts[x],searchData.experts[location.experts[x]]);
			}
		}
		
		function appendExpert(id,name)
		{
			list.append('<li class="qs-item"><a href="/experts/view/id/'+id+'">'+name+'</a></li>');
		}
		
		if(matches) show();
	}
	
	function show() {
			textInput.removeClass('throbber');
			container.children().slideDown('slow');
			
			// install watcher to detect clicks on the background
			$j(document).bind('mousedown.quicksearch', function(click) {
				// hide quicksearch if click was not inside quicksearch area
				if ($j(click.target).parents('div.quicksearch-results').length == 0 && click.target != thisObject) {
					hide(container.children());
				}
			});
	}
	
	function hide() {
		textInput.removeClass('throbber');
		$j(document).unbind('mousedown.quicksearch');
		container.children().slideUp(400);
	}
};

