/*
    Simple AutoComplete plugin for jQuery
    Author: Wellington Ribeiro
    Version: 1.0.0 (14/03/2010 12:02)
    Version: 1.1.0 (04/05/2010 13:05) - resolve problemas do ie6 sem necessidade de hacks, fecha o autocomplete ao clicar fora, insere automaticamente o atributo para não permitir o autocomplete do navegador.
    Copyright (c) 2008-2010 IdealMind ( www.idealmind.com.br )
    Licensed under the GPL license (http://blog.idealmind.com.br/projetos/simple-autocomplete-jquery-plugin/#license)

 *
 * jQuery('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");

            thisElement.keyup(function( ev )
            {
                var getOptions = { query: 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');
                }
                if (key.match(/[a-zA-Z0-9_\- ]/) || kc == 8 || kc == 46)
                {
                    jQuery.get(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();

                            var top = position.top + 23;

                            jQuery('div.' + classAC).css('top', top + 'px');
                            jQuery('div.' + classAC).css('left', position.left + 'px');
                            jQuery('div.' + classAC).css('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();
                                });
                            });
                        }
                    });
                }
                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;
                            }
                        });
                    }
                }
                if (thisElement.val() == '')
                {
                    jQuery('div.' + classAC).remove();
                }
            });
        }
    });
})(jQuery);

