var predictiveSearch = function(searchform, url) {  
  var position = 0;
  var searchDisplayed = false;
  var canSubmit = false;

  $(searchform).submit(function() {
    return canSubmit;
  });
  
  $(searchform + ' .search-click').click(function() {
    canSubmit = true;
    $(searchform).submit();
    return false;
  });

  $("body").append('<div id="' + searchform.split("#").join('') + '_autocomplete"></div>');
  var autocompleteElem = $(searchform + "_autocomplete");
  var inputElem = $(searchform + " input");


  $(searchform + " input").keyup(function(e) {
    var query = escape($(this).val());
  
    if (e.keyCode != 38 && e.keyCode != 40) {
      if (query.length > 3) {
        $(searchform  + "_autocomplete").load(url + "?query=" + query, null, function() {
          autocompleteElem.css('left', inputElem.offset().left);
          autocompleteElem.css('top', inputElem.offset().top + inputElem.height());

          var searchCnt = $(searchform + "_autocomplete li").length;

          if (searchCnt > 0) {
            $(searchform + "_autocomplete").show();
            searchDisplayed = true;
          
            $(searchform + "_autocomplete li a").click(function() {
              var value = $(this).attr('title');
            
              $(searchform + " input[type=text]").val(value);
              $(searchform + " input[type=text]").focus();
              canSubmit = true;
              $(searchform).submit();
            });

            $(searchform + "_autocomplete li a").mouseover(function() {
              $(searchform + "_autocomplete li a[class=selected]").removeClass("selected");
              position = $(this).attr("rel");
              $(this).addClass("selected");
            });
          } else {
            canSubmit = true;
          }
        });
      } else {
        $(searchform + "_autocomplete").html('');
        $(searchform + "_autocomplete").hide();
        searchDisplayed = false;
        canSubmit = true;
      }
    }
    
    if (searchDisplayed && e.keyCode == 40) {
      var links = $(searchform + "_autocomplete li a").length;
      if (position < links) {
        $(searchform + "_autocomplete li a").removeClass("selected");
        position++;
        $(searchform + "_autocomplete li a[rel=" + position + "]").toggleClass("selected");
        
        return false;
      }
    }
    
    if (searchDisplayed && e.keyCode == 38) {
      var links = $(searchform + "_autocomplete li a").length;
      if (position > 0) {
        $(searchform + "_autocomplete li a").removeClass("selected");
        position--;
        $(searchform + "_autocomplete li a[rel=" + position + "]").toggleClass("selected");
        
        return false;
      }
    }
    
    if (searchDisplayed && e.keyCode == 13) {
      var link = $(searchform + "_autocomplete li a[rel=" + position + "]");
      var value = link.attr('title');
      
      if (value) {
        $(searchform + " input[type=text]").val(value);
        $(searchform + " input[type=text]").focus();
      }
      
      canSubmit = true;
      $(searchform).submit();
      
      return false;
    }
  });
}

