/*
 * Modificado por Wilker Souza
 * 
 * $('selector').simpleAutoComplete("ajax_query.php", {
 *	identifier: 'estado',
 *	extraParamFromInput: '#extra',
 *	attrCallBack: 'rel',
 *	autoCompleteClassName: 'autocomplete',
 *	selectedClassName: 'sel'
 * },calbackFunction);
 * 
 */

(function(jQuery){

	jQuery.fn.extend(
	{
		simpleAutoComplete: function( page, options, callback )
		{
                    	if(typeof(page) == "undefined" )
			{
				alert("simpleAutoComplete: Você deve especificar a página que processará a consulta.");
			}
			
			var classAC = 'autocomplete';
			var selClass = 'sel';
			var attrCB = 'rel';
			var thisElement = jQuery(this);

			jQuery(":not(div." + classAC + ")").click(function(){
				jQuery("div." + classAC).remove();
			});
			
			thisElement.attr("autocomplete","off");

                       var lastLength =0;
                       var currentLength =0;
                       var parar =0;

                       

                       thisElement.keyup(function( ev )
                       {
                           
                            //pega o lenght atual
                            currentLength = thisElement.val().length;

                            //Grava o codigo do char de entrada
                            kc = ( ( typeof( ev.charCode ) == 'undefined' || ev.charCode === 0 ) ? ev.keyCode : ev.charCode );

                            //A cada um segundo chama a funcao para controlar as requisiçoes no banco
                            setTimeout(controlarRequisicoes, 200);

                            //Controla a quantidade de requisições.
                            //So envia requisição quando o usuario nao digitar nada durante 1 segundo
                            function controlarRequisicoes()
                            {

                                //alert(" lastL " + lastLength + "\n Atual " +thisElement.val().length);
                                //Se o ultimo Lenght for diferente ao atual, ele iguala e zera o controlador "parar"
                                if ((lastLength!=currentLength))
                                {
                                    lastLength = currentLength;
                                    parar =0;
                                }
                                else
                                    {
                                        //Quanto o controlador estiver zerado, é feita a requisição
                                        if(parar==0)
                                        {
                                            requestQuery();
                                            parar =1;
                                        }
                                    }
                            }

                            //Função para fazer a requisição e listagem
                            function requestQuery()
                            {
                                //alert("Requisicao: " + thisElement.val());
                                var getOptions = {chat: thisElement.val()}

                                /*if( typeof(options) == "object" )
                                {
                                        classAC = typeof( options.autoCompleteClassName ) != "undefined" ? options.autoCompleteClassName : classAC;
                                        selClass = typeof( options.selectedClassName ) != "undefined" ? options.selectedClassName : selClass;

                                        attrCB = typeof( options.attrCallBack ) != "undefined" ? options.attrCallBack : attrCB;
                                        if( typeof( options.identifier ) == "string" )
                                        getOptions.identifier = options.identifier;

                                        if( typeof( options.extraParamFromInput ) != "undefined" )
                                        getOptions.extraParam = jQuery( options.extraParamFromInput ).val();
                                }*/

                                //kc = ( ( typeof( ev.charCode ) == 'undefined' || ev.charCode === 0 ) ? ev.keyCode : ev.charCode );
                                key = String.fromCharCode(kc);

                                //console.log(kc, key, ev );

                                if (kc == 27)
                                {
                                        jQuery('div.' + classAC).remove();
                                }
                                if (kc == 13)
                                {
                                        jQuery('div.' + classAC + ' li.' + selClass).trigger('click');
                                        jQuery('div.' + classAC).remove();
                                }

                                if (key.match(/[a-zA-Z0-9_\- ]/) || kc == 8 || kc == 46)//8-> back 46-> delete
                                {
                                        jQuery.post(page, getOptions, function(r)
                                        {
                                                jQuery('div.' + classAC).remove();
                                                autoCompleteList = jQuery('<div>').addClass(classAC).html(r);

                                                if (r != '')
                                                {
                                                        autoCompleteList.insertAfter(thisElement);

                                                        var position = thisElement.position();
                                                        var height = thisElement.height();
                                                        var width = thisElement.width();

                                                        jQuery('div.' + classAC).css({
                                                                'top': ( height + position.top + 6 ) + 'px',
                                                                'left': ( position.left )+'px',
                                                                'margin': '0px'
                                                        });

                                                        jQuery('div.' + classAC + ' ul').css({
                                                                'margin-left': '0px'
                                                        });

                                                        jQuery('div.' + classAC + ' li').each(function( n, el )
                                                        {
                                                                el = jQuery(el);
                                                                el.mouseenter(function(){
                                                                        jQuery('div.' + classAC + ' li.' + selClass).removeClass(selClass);
                                                                        jQuery(this).addClass(selClass);
                                                                });
                                                                el.click(function()
                                                                {
                                                                        thisElement.attr('value', el.text());

                                                                        if( typeof( callback ) == "function" )
                                                                                callback( el.attr(attrCB).split('_') );

                                                                        jQuery('div.' + classAC).remove();
                                                                        thisElement.focus();
                                                                });
                                                        });
                                                }
                                        });
                                }
                          
                            }

                            //Se o input estiver vazio a lista some
                            if (thisElement.val() == '')
                            {
                                    jQuery('div.' + classAC).remove();
                            }

                            if (kc == 27)
                            {
                                    jQuery('div.' + classAC).remove();
                            }
                            if (kc == 13)
                            {
                                    jQuery('div.' + classAC + ' li.' + selClass).trigger('click');
                                    jQuery('div.' + classAC).remove();
                            }

                            //Move UP (key 40) AND Move Down (key 38)
                            if (kc == 38 || kc == 40){
                                    if (jQuery('div.' + classAC + ' li.' + selClass).length == 0)
                                    {
                                            if (kc == 38)
                                            {
                                                    jQuery(jQuery('div.' + classAC + ' li')[jQuery('div.' + classAC + ' li').length - 1]).addClass(selClass);
                                            } else {
                                                    jQuery(jQuery('div.' + classAC + ' li')[0]).addClass(selClass);
                                            }
                                    }
                                    else
                                    {
                                            sel = false;
                                            jQuery('div.' + classAC + ' li').each(function(n, el)
                                            {
                                                    el = jQuery(el);
                                                    if ( !sel && el.hasClass(selClass) )
                                                    {
                                                    el.removeClass(selClass);
                                                    jQuery(jQuery('div.' + classAC + ' li')[(kc == 38 ? (n - 1) : (n + 1))]).addClass(selClass);
                                                    sel = true;
                                                    }
                                            });
                                    }
                            }

                            jQuery('#count').html(thisElement.val().length);

                  });

              
		}
	});
})(jQuery);

