(function($){
	$.fn.extend({
		autocompletar: function(options)
		{
            //Valores padrão dos parametros
            var defaults =
			{
				arquivo: 'relacao.php',
                phpVar: 'q',
                funcao: '',
                qtd: 1,
				separador: ''
			};
			var options = $.extend(defaults, options);

    		return this.each(function() {
				var opcao=options;
				var c = '';
				var valor = '';
                var descricao = '';
                var digitado = '';
                var ativo = -1;

				var results = document.createElement("div");
				var foco = 1;
				var retorno = 'ok';

				// jQuery objetos
				var $results = $(results);
				var $input = $(this);

				//Adicionando DIV ao BODY
				$("body").append(results);
				//Adicionando classe
				$(results).addClass("ac_results");
				$results.hide(); // Esconde objeto
				//Função TRIM
				String.prototype.trim = function()
				{
					return this.replace(/^\s*/, "").replace(/\s*$/, "");
				}
				//Função REPLACE
				String.prototype.replace_fn = function(antigo,novo)
				{
					return this.split(antigo).join(novo); 
				}

				//Adicionando resultado a tag UL LI
				function fn_carrega(dados)
				{
					var x = 0;
					ativo = -1;
					if(foco==1)
						$results.show();

					if(dados.trim()!='')
					{
						var ul = document.createElement("ul");
						ar_dados = dados.split("\n");
						$results.empty();
						for(a=0;a<ar_dados.length;a++)
						{
							var li = document.createElement("li");
							if(ar_dados[a].trim()!='')
							{
								li.innerHTML = ar_dados[a].substring(0,ar_dados[a].indexOf("|"));
								li.selectValue = ar_dados[a].substring(ar_dados[a].indexOf("|")+1,ar_dados[a].length);
								li.selectPosition = x;
								ul.appendChild(li);
								x++;
							}
						}
						if(x>0)
						{
							$(results).append(ul);
							$results.css({
							width: parseInt($input.width()) + 3 + "px",
							top: (($input.offset().top)+$input.height()+6) + "px",
							left: ($input.offset().left) + "px"
							}).show();

							//Adicionando Hover
							var $lis = $("li", results); // Pega as LIs
							$lis.hover(
									function() { $("li", ul).removeClass("ac_over"); $(this).addClass("ac_over"); ativo=$(this)[0].selectPosition; },
									function() { $(this).removeClass("ac_over"); }
								).click(function(e) { e.preventDefault(); e.stopPropagation(); fn_seleciona_li(); });
						}

					}
					else
					{
						$results.empty();
						$results.hide();
						$results.html("");
					}
				}
				//Seleciona a linha LI
				function fn_seleciona_li()
				{
                         var liSel = $("li.ac_over", results)[0];
                         descricao = liSel.innerHTML;
                         valor = liSel.selectValue;

                         if(opcao.funcao!='')
                         eval(opcao.funcao);

						 if(opcao.separador!='')
						 $input.val(descricao.substring(0,descricao.indexOf(opcao.separador)).replace_fn("&amp;","&"));
						 else
						 $input.val(descricao.replace_fn("&amp;","&"));

						 $results.html("");
						 $results.hide();
						 $(results).empty();

				}
				var timeout = '';
				//Eventos
				$input.keydown(function (e) {
					 if(e.keyCode==40) //down
					 {
						e.preventDefault();
						fn_move('desce');
					 }
					 else if(e.keyCode==38) //up
					 {
						e.preventDefault();
						fn_move('sobe');
					 }
					 else if(e.keyCode==13) //enter
					 {
						fn_seleciona_li();
					 }
					 else
					 {
						 if( e.keyCode == 46 || (e.keyCode > 8 && e.keyCode < 32) )
						 {
							 $results.html("");
							 $results.hide();
							 $(results).empty();
						 }
						 else
						 {
							 if(timeout) clearTimeout(timeout);
							   timeout = setTimeout(fn_request, 400);
						 }
					 }
				});
				$input.blur(function () {
					foco = 0;
					$results.hide();
				});
				$input.focus(function () {
					foco = 1;
				});
				$results.focus(function () {
					foco = 1;
					$results.show();
				});
				//Envia variaveis ao PHP
				function fn_request()
				{
					digitado = $input.val();

					if(digitado.length>=opcao.qtd)
					{	
						if(opcao.arquivo.indexOf('?') != -1)
							opcao.arquivo = opcao.arquivo + '&';
						else
							opcao.arquivo = opcao.arquivo + '?';

						campos = opcao.phpVar+'='+encodeURI(digitado);
						
						$.ajax({
			              	type: 'post',
			                data: campos,
			                url: opcao.arquivo,
			                success:
			   	             function(retorno)
			   	             {
								fn_carrega(retorno);
			   	             }
			               });
						
						
						//$.get(opcao.arquivo+opcao.phpVar+'='+encodeURI(digitado),'',function(data){ fn_carrega(data); });
					}
					else
					{
						$results.html("");
						$results.hide();
					}
				}
				//Adiciona classe quando objeto selecionando pelo mouse ou tecla
				function fn_move(selecao)
				{
					var lis = $("li", results);
					if (!lis) return;
					ativo += (selecao=='desce') ? 1 : -1;
					if (ativo < 0 && selecao=='sobe')
						ativo = lis.size()-1;
					if (ativo < 0 || ativo >= lis.size()) {
						ativo = 0;
					}
					lis.removeClass("ac_over");
					$(lis[ativo]).addClass("ac_over");
				}




  			});
    	}
	});
})(jQuery);



