	/* 
		Search autocomplete jQuery plugin

		
	*/

(function($) {
	
	$.fn.extend({
    searchautocomplete: function(options) {    
      
      var def = $.SearchAutoComplete.defaults;
      
      options = $.extend({}, $.SearchAutoComplete.defaults, options);
      
      return this.each(function() {
			  new $.SearchAutoComplete(this, options);
		  });
    
    }
  });


  $.SearchAutoComplete = function(input, settings) {
    
    var $input = $(input)
      .attr("autocomplete", "off");
    
    
    var lastKeyCode;
    var timeout;
    var options = settings;
    
    var $results = $("<div>")	
      .html('results')
		  .addClass(options.resultsCssClass)
		  .insertAfter($input);		  
		
		var $resultsContainer = $('#'+options.resultsContainerId);		
		var $slider = $resultsContainer.parent();
		
		$resultsContainer.append($results);
		
		$slider.hide(0);		
		$slider.parent().css({overflow: 'visible', display: 'block'});
		
		var resultsVisible = false;
		var resultsCount = 0;		
		var selectedIndex = -1;		
		
		var cache = {};
    
    
    $input.bind('keydown', onKeyDown);      
    $input.bind('blur', onLostFocus);
    $input.bind('focus', onGotFocus);
    
    $results.bind('mousedown', onMouseDown);
    $results.bind('mouseup', onMouseUp);
    $results.bind('mouseover', onMouseOver);
    
   
    // Other buttons
    $('.searchtxt').bind('click', goSearch);
    $('#searchAcSearchAllLink').bind('click', goSearch);
    
		
		function onGotFocus() {
		  // TODO: enable timer?
		}
		
		function onLostFocus() {
		  hideResults();
		}
		
		function onKeyDown(event) {
		  switch(event.keyCode) {
		
			  case KEY.UP:
				  event.preventDefault();
				  if(resultsVisible) resultsMovePrev();
				  break;
				  
				case KEY.DOWN:
				  event.preventDefault();
				  if(resultsVisible) resultsMoveNext();
				  break;
				  
				case KEY.RETURN:				  
				  event.preventDefault();
				  if(resultsVisible) {
				    $input.blur();
				    resultsSelect();
				  }
				  break;
				  
				case KEY.ESC:
				  event.preventDefault();
				  hideResults();
				  break;
				  
				  
				default: 
				  clearTimeout(timeout);
				  timeout = setTimeout(onChange, options.delay);
				  break;
		  }	  
		}
		
    function onChange(event) {
      var value = $input.val();
      if(value.length >= options.chars) {
        getResults(value, loadResults, onLoadFailure);
      }
    }
    
    function onMouseDown(event) {
    }
    
    function onMouseUp(event) {
    }
        
    function onMouseOver(event) {
      resultsMoveOver($(event.target).parents('div')[0]);
    }
    
    
    function getResults(term, onsuccess, onfailure) {
    
      if(options.enableCache && cache[term]) {
        loadResults(cache[term]);
        return;
      }      
      
     // alert("Searching for " + 'prefixText='+term+'&count='+options.resultsMax);
      
      $.ajax({
        type: 'POST',
        url: options.url,
        data: 'prefixText='+term+'&count='+options.resultsMax,
        success: function(xml, $results){
          if(options.enableCache){
            cache[term] = xml;
          }
          loadResults(xml);
        },
        error: function(req, msg, exc) {
          onfailure(msg ? msg : exc);
        }
      });
    }
    
    function onLoadFailure(msg) {
      window.status = 'Error loading search data: ' + msg;
    }
    
    
    function loadResults(xml) {    
      
      resultsCount = 0;      
      $results.empty();
      
      $('string', xml).each(function() {
        resultsCount++;
        var item = $(this).text();
        
        var iArray = item.split('|');
        if(iArray.length == 3) {
          var iTitle = iArray[0];
          var iSummary = iArray[1];
          var iLink = iArray[2];
          
          var $itemElem = $('<div><a href="'+iLink+'"><span class="searchAcTitle">'+iTitle+'</span><br /><span class="searchAcSummary">'+iSummary+'</span></a></div>');
       
          $results.append($itemElem);
        }
      });      
      
      showResults();
    }
    
    
    function hideResults() {
		  $slider.slideUp(options.showDelay);
		  resultsVisible = false;
		  resultsIndex = -1;
		};
	  
	  
	  function showResults() {
	    $results.show();
			$slider.slideDown(options.showDelay/2);
	    resultsVisible = true;
	  }
    
    function resultsMoveOver(item) {
      index = -1;
      $('div', $results).each(function() {
        index++;
        if(this == item) {
          $(this).addClass('over');
          selectedIndex = index;
        }
        else {
          $(this).removeClass('over');
        }
      });
    }
    
    function resultsMovePrev() {
      if(selectedIndex > 0) {
        $('div', $results).removeClass('over');
        selectedIndex--;
        $('div:eq(' + selectedIndex + ')', $results).addClass('over');
      }
    }
    
    function resultsMoveNext() {
      if(selectedIndex < resultsCount-1) {
        $('div', $results).removeClass('over');
        selectedIndex++;
        $('div:eq(' + selectedIndex + ')', $results).addClass('over');
      }
    }
    
    function resultsSelect() { 
      if(selectedIndex > -1 && selectedIndex < resultsCount-1) {
        var url = $('div:eq(' + selectedIndex + ') a', $results).attr('href');
        hideResults();
        window.location = url;
      }
    }
    
    function goSearch(event) {
      event.preventDefault();
      window.location = '/search/?q=' + $input.val();
    }
    
    
    
    var KEY = {
		  UP: 38,
		  DOWN: 40,
		  ESC: 27,
			DEL: 46,
		  RETURN: 13		  
	  };
  }
  
  
  $.SearchAutoComplete.defaults = {
    url: '/search/autocomplete.asmx/GetCompletionList',//'/search/autocomplete.ashx', //
    delay: 200,
    showDelay: 1000,
    chars: 3,
    enableCache: true,
		resultsWidth: 200,
		resultsContainerId: 'searchAcContent',
    resultsCssClass: 'searchautocomplete-results',
    resultsMax: 5
  };    
  
})(jQuery);


