(function($){
	$.acomplete = function($elem,options) {
		//$(this).remove().text();
		//$(this).addClass('placeholder').val(searchLabel)
		
        if (typeof options === 'string') {
            this.options = { url:options };
        } else {
            this.options = options;
        }
	
//	var posturl = this.options.url;
		
	this.dom = {};
	
	this.dom.elem = $elem;
	
	this.dom.results = $('<ul/>');
	
	this.dom.results.addClass("autocomplete").hide().insertAfter(this.dom.elem);

	this.selectedItem = null;
	
	this.position = this.dom.elem.position();
	
	var self = this;
//	console.debug($elem.val());

	


	$elem.attr('autocomplete', 'off').keyup(function(event)
	{
		//alert($(this).val().length);
		if ((event.keyCode > 40 || event.keyCode == 8) && self.dom.elem.val().length > 1) {
		// Keys with codes 40 and below are special
		// (enter, arrow keys, escape, etc.).
		// Key code 8 is backspace.
		$.ajax({
		url: self.options.url,
		data: 'q='+self.dom.elem.val(),
		dataType: 'json',
		type: 'GET',
		success: self.processdata
		});
		}
		else if (event.keyCode == 38 && self.selectedItem !== null)
		{
			// User pressed up arrow.
			self.setSelectedItem(self.selectedItem - 1);
			event.preventDefault();
		}
		else if (event.keyCode == 40 && self.selectedItem !== null)
		{
			// User pressed down arrow.
			self.setSelectedItem(self.selectedItem + 1);
			event.preventDefault();
		}
		else if (event.keyCode == 27 && self.selectedItem !== null)
		{
			// User pressed escape key.
			self.setSelectedItem(null);
		}
		}).keypress(function(event)
		{
			if (event.keyCode == 13 && self.selectedItem !== null)
			{
				// User pressed enter key.
				self.populateSearchField();
				event.preventDefault();
			}
			}).blur(function(event)
			{
				setTimeout(function(){self.setSelectedItem(null);}, 500);
			});
		
	
	$.acomplete.prototype.processdata = function (data) 
	{
				if (data.length)
				{
					self.dom.results.empty();
					$.each(data, function(index, res)
					{
						var li = $('<li/>');
						var img = $('<img/>');
						var span = $('<span>');
						var atag = $('<a/>');
												
						span.html(res.name)
						img.attr({src:res.picture});
						atag.attr({href : "#/profile/"+res.id}).append(img).append(span);

//						;
						li.append(atag).appendTo(self.dom.results)
						.mouseover(function()
						{
							self.setSelectedItem(index);
						}).click(self.populateSearchField);
					});
					self.setSelectedItem(0);
				}
				else
				{
					self.setSelectedItem(null);
				}

	
	};
	
	$.acomplete.prototype.setSelectedItem = function (item)
	{
		self.selectedItem = item;
		if (self.selectedItem === null)
		{
			self.dom.results.fadeOut("fast");
			return;
		}
		if (self.selectedItem < 0)
		{
			self.selectedItem = 0;
		}
		if (self.selectedItem >= self.dom.results.find('li').length)
		{
			self.selectedItem = self.dom.results.find('li').length - 1;
		}
		
		self.dom.results.find('li').removeClass('selected').eq(self.selectedItem).addClass('selected');
		//self.dom.results.find('li').addClass({'backgroundColor':"#728ADC"}).eq(self.selectedItem).css({'backgroundColor':"#000000"});
		self.dom.results.css({left:self.position.left, top:self.position.top+self.dom.elem.height()});
		self.dom.results.fadeIn("fast");	
	};
	
	$.acomplete.prototype.populateSearchField = function ()
	{
//		console.debug(self.selectedItem);
		self.dom.elem.val(self.dom.results.find('li').eq(self.selectedItem).text());
		self.setSelectedItem(null);
	};

	$.acomplete.prototype.processParams = function ()
	{
		//console.debug(self.dom.elem.val());
		return "q=" + self.dom.elem.val();
	};

};

 $.fn.autocompletesearch = function(options) {
        if (typeof options === 'string') {
            options = {
                url: options
            };
        }
        var o = $.extend({}, $.fn.autocompletesearch.defaults, options);
        return this.each(function() {
            var $this = $(this);
            var ac = new $.acomplete($this, o);
            $this.data('acomplete', ac);
        });

    };


})(jQuery);
