(function($) {

$.fn.autocompleteAjaxSearch = function(options) {
	options = $.extend({}, $.autocompleteAjaxSearcher.defaults, options);
	
	this.each(function(){
		new $.autocompleteAjaxSearcher(this,options);
	});
	return this;
}


$.autocompleteAjaxSearcher = function(input, options) {
	var $input = $(input);
	var $text_content = "";
	var $current_search = "";
	var $query_active = false;
	var theInterval = false;
	var $results = $(document.createElement("ul"));	
	$results.addClass(options.searchClass).appendTo(options.searchFieldContainer);


	function init() {

		if ($input.val() == '') {
			$input.blur(); 
			$input.val(options.searchText); 
		}

		$input.focus(function(){ 
			if ($(this).val() == options.searchText) $(this).val(''); 
			else $(this).select(); 
		});	
		$input.blur(function(){ 
			if ($(this).val() == '') $(this).val(options.searchText); 
		});

		$(options.searchForm).submit(function() { var v = $input.val(); return (v != '') && (v != options.searchText); });

		$(options.submitBTN).click( function() {
			var v = $input.val();
			if((v != '') && (v != options.searchText)) {
				$(options.searchForm).submit();
			}
			return false;
		});
		
		$input.attr("autocomplete", "off");

		if ($.browser.mozilla)
			$input.keypress(processSpecialKey);
		else
			$input.keydown(processSpecialKey);

		$input.keyup(processKey);
		
		$('BODY').click(function() { closeWindow(); });
	}
	

	function processSpecialKey(e) 
	{
		var letItGo = false;

		switch(e.keyCode)
		{		
			case 38: /* up */     prevResult(); break;		
			case 40: /* down */	  nextResult(); break;		
			case 27: /*	escape */ closeWindow(); break;				
			case 13: /* return */ letItGo = !selectCurrentResult(); break;				
			default: letItGo = true;
		}
		
		if (!letItGo)
		{
	        if (e.preventDefault) e.preventDefault();
			if (e.stopPropagation) e.stopPropagation();	
			e.cancelBubble = true;
			e.returnValue = false;
		}
	}
	
	function processKey(e) 
	{
		if ($input.val() != $text_content)
		{
			$text_content = $input.val();
			if (theInterval) clearTimeout(theInterval);
			theInterval = setTimeout(performSearch, 200);
		}
	}
	
	function performSearch()
	{
		if (theInterval) { clearTimeout(theInterval); theInterval = false; }
		if ($query_active) return;
		if ($current_search == $text_content) return;
		$current_search = $text_content;
		if ($current_search.length == 0) { $results.html(""); closeWindow(); return; }
		$query_active = true;
		$.ajax({
		  url: options.searchAjaxURL,
		  data: {search: $current_search},
		  cache: false,
		  success: responseFromDb
		});
	}

	function responseFromDb(html)
	{
		$query_active = false;
		$results.html(html);
		if (html.length > 0)
		{
			$results.children('li').mouseover(function() {
					$results.children('li').removeClass("selected");
					$(this).addClass("selected"); });
			openWindow();
		}
		else
			closeWindow(); 

		if (!theInterval) performSearch();
	}
	
	function closeWindow()
	{
		$results.hide();
	}
	
	function openWindow()
	{
		if ($results.html() == "") return;
		$results.show();
	}
	
	function getCurrentResult()
	{			
		if (!$results.is(':visible')) return false;			
		var $currentResult = $results.children('li.selected');				
		if (!$currentResult.length) $currentResult = false;					
		return $currentResult;
	}
			
	function selectCurrentResult()
	{	
		$currentResult = getCurrentResult();	
		if ($currentResult)
		{
			location.href = $currentResult.find("A").attr('href');
			return true;
		}
		return false;
	}

	function nextResult()
	{	
		$currentResult = getCurrentResult();	
		if ($currentResult)
			$currentResult.removeClass("selected").next().addClass("selected");
		else
		{
			openWindow();
			$results.children('li:first-child').addClass("selected");
		}	
	}
			
	function prevResult()
	{			
		$currentResult = getCurrentResult();	
		if ($currentResult)
			$currentResult.removeClass('selected').prev().addClass('selected');
		else
			$results.children('li:last-child').addClass('selected');	
	}


	init();
	return {}
};


$.autocompleteAjaxSearcher.defaults = {
	searchText:'Cauta o carte sau un autor',
	searchClass:'search_ajax',
	searchFieldContainer:'#search_field_container',
	searchForm:'#search_form',
	searchAjaxURL:'search_ajax.php',
	submitBTN:'.btn_submit_form_autori'
}

})(jQuery);




	

	

