// Robert Horne jQuery autocomplete plugin
// @uthor: Oliver Dore (oliverd@magneticn.co.uk)
// date: 30.5.08
// Shall we?

(function($){

	$.fn.extend({
    	autocomplete: function(options) {    
      		var def = $.autocomplete.defaults;
      		options = $.extend({}, $.autocomplete.defaults, options);
      		return this.each(function() {
		  	new $.autocomplete(this, options);
			});
    	}
  	});

	$.autocomplete = function(input, settings){
		// Turns autocomplete on
		var $input = $(input).attr('autocomplete','off');
		
		// Set options as settings
		var options = settings;
		
		// Timeout
		var timeout = options.postDelay;
		
		// Create autocomplete results DIV
		var $results = $('<div>')
			.html('results')
			.addClass(options.resultsClass)
			.insertAfter($input);
			
		var $resultsContainer = $('#'+options.resultsContainerID);
		var $ac = $resultsContainer.parent();
		
		// If it's IE
			$($ac.children('div')).each(function(){
				if($.browser.msie){
					$(this).addClass('ie');
				}
			});
		
		$resultsContainer.append($results);
		
		var resultsVisible = false;
		var resultsCount = 0;
		var maxResults = 9;
		var selectedIndex = -1;
		var cache = {};
		var resultsBuild = '';
		
		// Let's bind some function, fo realz
		$input.bind('click', autoFocus);
		$input.bind('keydown', autoKeyDown);
		$input.bind('blur', autoBlur);
		
    	$results.bind('mousedown', autoMouseDown);
   		$results.bind('mouseup', autoMouseUp);
    	$results.bind('mouseover', onMouseOver);
		
		$('#rh-search').submit(function(event){
			event.preventDefault();
		});
		
   	 // Other buttons
  	  $('#search-all').bind('click', goSearch);
		
		// Input focus event
		function autoFocus(event){
			if($(input).val() == 'Search Robert Horne'){
				$(input).val('');
			}
		}
		
		function autoKeyDown(event){
			switch(event.keyCode){
				case KEY.UP:
					event.preventDefault();
					if(resultsVisible) autoMovePrev();
				  	break;
				case KEY.DOWN:
					event.preventDefault();
					if(resultsVisible) autoMoveNext();
					break;
				case KEY.RETURN:				  
					event.preventDefault();
					if(resultsVisible){
				    	autoSelect();
					}
					break;
				case KEY.DEL:
					event.preventDefault();
					break;
				case KEY.ESC:
					event.preventDefault();
					hideAutoComplete();
					break;
				default: 
					clearTimeout(timeout);
					timeout = setTimeout(autoChange, options.postDelay);
					break;
			}
		}
		
		// Input blur event
		function autoBlur(event){
			hideAutoComplete();
			if($(input).val() == ''){
				$(input).val('Search Robert Horne');
			}
		}
		
		function autoChange(event){
			var value = $input.val();
      		if(value.length >= options.minChars) {
        		getAutoResults(value, loadAutoResults, autoFailure);
      		}else{
      			hideAutoComplete();
      		}
		}
		
		function getAutoResults(term, autoSuccess, autoFailure){
    		
    		// Is it in the cache? If so, load from cache
    		if(options.cache && cache[term]) {
        		loadAutoResults(cache[term]);
        		return;
      		}      
            
      		$.ajax({
        		type: 'POST',
        		url: options.url,
        		data: 'searchterm='+term+'&count='+options.maxResults,
        		success: function(xml, $results){
          			if(options.cache){
            			cache[term] = xml;
          			}
          			loadAutoResults(xml);
        		},
        		error: function(req, msg, exc) {
          			autoFailure(msg ? msg : exc);
        		}
      		});
    	}
		
		function loadAutoResults(xml){
			selectedIndex = -1;
			resultsCount = 0;
			maxResults = 9;
      		
      		$('string', xml).each(function() {
        		resultsCount++;
        		if(resultsCount == 1){ $results.empty(); }
        		if(resultsCount < maxResults){

        		var item = $(this).text();
        
        		var iArray = item.split('|');
        		if(iArray.length == 4) {
          			var iTitle = iArray[0];
          			var iSummary = iArray[1];
          			var iLink = iArray[2];
          			var iPic = iArray[3];
          			var $itemElem = $('<div class="ac-result"><a href="'+iLink+'"><span style="display:block; width:40px; height:30px; background:url('+iPic+') no-repeat; margin-bottom:10px; " class="image"></span><span class="searchAcTitle">'+iTitle+'</span><br /><span class="searchAcSummary">'+iSummary+'</span></a><span class="clear"></span></div>');
       				$results.append($itemElem);
       				
        		} 		
        	}
        	        	
      		});
      		
			if(resultsCount > 0){
        		if(!resultsVisible){
        			$resultsContainer.children('div:last').css('border-bottom','0');
        			showAutoComplete();
        		}
        	}else{
        			hideAutoComplete();
        	}
      		      
      }
		
		function autoFailure(msg){
			window.status = 'Error loading search data: ' + msg;
		}
		
		function hideAutoComplete(){
		  $ac.fadeOut("medium");
		  resultsVisible = false;
		  selectedIndex = -1;
		}
		
		function autoMovePrev(){
	 		if(selectedIndex > 0) {
        		$('div', $results).removeClass('over');
        		selectedIndex--;
        		$('div:eq(' + selectedIndex + ')', $results).addClass('over');
      		}else{
      			selectedIndex = resultsCount-1;
      			$('div', $results).removeClass('over');
      			$('div:eq(' + selectedIndex + ')', $results).addClass('over');
      		}	
		}
		
		function autoMoveNext(){
      		if(selectedIndex < resultsCount-1) {
        		$('div', $results).removeClass('over');
        		selectedIndex++;
        		$('div:eq(' + selectedIndex + ')', $results).addClass('over');
      		}else{
      			$('div', $results).removeClass('over');
      			selectedIndex = 0;
        		$('div:eq(' + selectedIndex + ')', $results).addClass('over');
      		}
		}
		
		function showAutoComplete(){
			resultsVisible = true;
			$ac.fadeIn("medium");
		}
		
		function autoMouseUp(event){
			
		}
		
		function onMouseOver(event){
			autoMouseOver($(event.target).parents('div')[0]);
		}
		
		function autoMouseOver(item){
			index = -1;
      		$('div', $results).each(function() {
        		index++;
        		if(this == item) {
          			$(this).addClass('over');
          			selectedIndex = index;
        		}
        		else {
          			$(this).removeClass('over');
        		}
      		});
		}
		
		function autoMouseDown(event){
			window.location = $(event.target).parent().attr('href');
		}
		
		function autoSelect(){
			if(selectedIndex > -1 && selectedIndex < resultsCount) {
        		var url = $('div:eq(' + selectedIndex + ') a', $results).attr('href');
        		window.location = url;
      		}
		}
		
    function goSearch(event) {
      event.preventDefault();
      window.location = '/search/summary/' + $input.val()+'/';
    }
		
    	var KEY = {
			UP: 38,
			DOWN: 40,
			ESC: 27,
			DEL: 46,
			RETURN: 13
		};

	}

	$.autocomplete.defaults = {
		url: '/ajax/autocomplete.php',
		minChars: 3,
		postDelay: 200,
		showDelay: 1000,
		cache: true,
		resultsContainerID: 'ac-results-wrap',
		resultsClass: 'ac-results',
		maxResults: 5
	}

})(jQuery);