(function($) {

	var start = 0;
	var show = 10;
	var item = 0;
	var c = 0;
	var dropdown;
	var open = false;
	var current = '';
	var scroll = false;
	var element = false;
	var geoids = new Array();

	$.fn.autocomplete = function(settings) {
		if(settings) {
			settings = jQuery.extend({
				setting1: false
			}, settings);
		}

		$(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'));
		}

		return $(this);
	}

	$.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) {
				$.getScript('http://api.offbeatguides.com/reseller/tools/search.php?q=' + $(this).val() + '&jsond=true');
				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'));
			}
		} 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/, '');
		id = geoids['item'+item];
		target = $(element).attr('id');
		$('input[name='+target+']').val(id);
	}

	$.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);

			geoids['item'+c] = this.id;

			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);
