
 (function($) {
    
    var start = 0;
    var show = 10;
    var item = 0;
    var c = 0;
    var open = false;
    var current = "";
    var scroll = false;
    var element = false;
    var dropdown;
    var src;
    
    $.fn.autocomplete = function(url, settings) {
        
        settings = jQuery.extend({
            setting1: false
        }, settings);

        src = url;
        
        $(this).keyup($.fn.autocomplete.keyUp);
        $(this).keydown($.fn.autocomplete.keyDown);
        $(this).blur(function(){ setTimeout($.fn.autocomplete.close, 150) } );
        
        if($('#acParent') && $('#acParent').length == 0)
        {
          dropdown =  document.createElement('div');
          $(dropdown).addClass('acParent').attr('id', 'acParent').css('position', 'absolute');

          var child =  document.createElement('div');
          $(child).addClass('acDropdown');
          $(child).attr('id', 'acDropdown');
          $(child).appendTo($(dropdown));

          var list =  document.createElement('ul');
          $(list).appendTo($(child));

          $(dropdown).appendTo($('body'));
        }

    }
  
    $.fn.autocomplete.keyUp = function(e) {
        
        element = this;
        
        var val = $(this).val();
        
        if((e.keyCode == 22 || e.keyCode == 8) && $(this).val().length == 0)
            return $.fn.autocomplete.close();
        else if(e.keyCode == 9 || e.keyCode == 13)
            return true;
        else if(e.keyCode == 40 || e.keyCode == 38)
            return clearInterval(scroll);
        else if(val.length > 1)
        {
            if(val != current)
            {
                $.getJSON(src + $(this).val(), $.fn.autocomplete.update);
                current = val;
            }
            return true;
        }
        else
        {
            c = 0;
            $.fn.autocomplete.close();
            return true;
        }
      
    }
  
    $.fn.autocomplete.keyDown = function(e) {
        
        element = this;
        
        $(dropdown).css({'top': ($.fn.autocomplete.findPos(this).y + this.offsetHeight) + 'px', 'left': $.fn.autocomplete.findPos(this).x + 'px'})
        
        if(e.keyCode == 27)
            $.fn.autocomplete.close();
        else if(e.keyCode == 9)
        {
            if(open)
                $.fn.autocomplete.select($('#acDropdown .selected'));
        }
        else if(e.keyCode == 13)
        {
            if(open)
            {
                e.preventDefault();
                $.fn.autocomplete.select($('#acDropdown .selected'));
            }
            //$('.form-primary button').focus();
        }
        else if(e.keyCode == 40)
        {
            $.fn.autocomplete.open();
            item++;
            if(item <= c)
            {
                if(item + 1 > start + (show ))
                {
                    $.fn.autocomplete.setStart(item - show + 1);
                }

                $('#acDropdown .selected').removeClass('selected');
                $('#item' + item).addClass('selected');
          
            }
            else
                item = c;
        }
        else if(e.keyCode == 38)
        {
            $.fn.autocomplete.open();
            item--;
            if(item > 0)
            {
                if(item < start + 1)
                {
                    $.fn.autocomplete.setStart(item);
                }

                $('#acDropdown .selected').removeClass('selected');
                $('#item' + item).addClass('selected');
            }
            else
                item = 1;
        }
      
    }
  
    $.fn.autocomplete.open = function() {
        
        var amt = (c > show) ? show : c;
        var height = amt * $('#item1').css('height').replace(/px/, '');
        if(amt > 0 && height + 'px' != $('#acDropdown').css('height') && $(element).val().length)
        {
            open = true;
            $('#acDropdown').show();
            $('#acDropdown').animate({'height': height} );
        }
    }
  
    $.fn.autocomplete.close = function() {
        
        if(open)
            $('#acDropdown').animate({'height': 0}, "fast", function(){$('#acDropdown').hide(); open=false;} );
        
        return true;
    }
  
    $.fn.autocomplete.findPos = function(obj) {
        
        var curleft = obj.offsetLeft || 0;
        var curtop = obj.offsetTop || 0;
        while (obj = obj.offsetParent) {
            curleft += obj.offsetLeft
                curtop += obj.offsetTop
        }
        return {x:curleft,y:curtop};
        
    }
  
    $.fn.autocomplete.select = function(el) {
        
      $.fn.autocomplete.close();
      $(element).val($(el).text());
      $(element).focus();
      item = $(el).attr('id').replace(/item/, '');
   
    }
  
    $.fn.autocomplete.selectAuto = function() { 
       $.fn.autocomplete.select(this);
    }
    
    
    $.fn.autocomplete.update = function(data)
    {
      var ul = document.createElement('ul');
      var first = true;
      c = 0;
      item = 1;
      start = 1;
      $(data.hits).each(function(){
        c++;
        var li = document.createElement('li');
        $(li).text(this.name);
        $(li).appendTo(ul);
        $(li).attr('id', 'item'+c);
        $(li).mousedown($.fn.autocomplete.selectAuto);
        $(li).mouseover($.fn.autocomplete.over);
        $(li).mouseout($.fn.autocomplete.out);
        if(first) $(li).addClass('selected');
        first = false;
      });
      
      $(ul).replaceAll('#acDropdown ul');

      
      if(c > 0)
        $.fn.autocomplete.open();
      else
        $.fn.autocomplete.close(this);
    }
    
  
    $.fn.autocomplete.over = function()
    {
        if(! $(this).hasClass('selected'))
            $(this).addClass('over');
    }
    
    $.fn.autocomplete.out = function()
    {
        if($(this).hasClass('over'))
            $(this).removeClass('over');
    }
    
    $.fn.autocomplete.setStart = function(s)
    {
      start = s;
      $('#acDropdown ul').animate({'top': ((s-1) * $('#item' + s).css('height').replace(/px/,'') * -1)}, "fast");
    }
    
    
})(jQuery);
