/* Parâmetros:
 * - titulo:      Define o título a ser exibido sem seleção
 * - selecionado: Número do item já selecionado. 
 */
$.fn.extend({
	combobox: function(options) {
	    var combobox = this;
	    
		if ($("option", this).length > 0) {
			// Converter select
			combobox = $("<div class='combo-box'><a href='#' class='linkPrincipal'>&nbsp;</a></div>");
			//combobox.attr("id", this.attr("id"));
			
			var ul = $("<ul/>");

			$("option", this).each(function() {
				var item = $("<li><a href='#'>" + $(this).text() + "</a></li>");
				$('a', item).attr('value', $(this).val());
				ul.append(item);
			});
			
			combobox.append(ul);
			
			var antigo = this;
			
			combobox.bind('change', function() { antigo.val($(itemSelecionado).attr('value')); antigo.trigger('change'); });

			if (options.titulo)			
				$('.linkPrincipal', combobox).text(options.titulo);
			
			this.hide().after(combobox);
			combobox.wrap("<div class='combo-box-wrapper'/>");
		}
		
	    var procura = { letra: '', cnt: 0 };
	    var itens = new Array();

	    var ultimaProcura = new Date();
	    var itemSelecionado = null;
	    var linkPrincipal = $('.linkPrincipal', combobox);
	    
	    function procurar() {
	        return itens[procura.letra] != null ? itens[procura.letra][procura.cnt % (itens[procura.letra].length)] : null;
	    }
	
	    function keydown(e) {
	        if (e.keyCode == 38) /* Cima */ {
	            if (itemSelecionado != null)
	                $(itemSelecionado).parent().prev("li").children("a").trigger("selecionar");
	            else
	                $("ul li a:first", combobox).trigger("selecionar");
	            e.preventDefault();                
	            return false;
	        } else if (e.keyCode == 40) /* Baixo */ {
	            if (itemSelecionado != null)
	                $(itemSelecionado).parent().next("li").children("a").trigger("selecionar");
	            else
	                $("ul li a:first", combobox).trigger("selecionar");
	            e.preventDefault();
	            return false;
            } else if (e.keyCode == 9) {
				$('.linkPrincipal', combobox).toggleClass('aberto');
				$('.linkPrincipal', combobox).next('ul').slideToggle();
				
				$('#links-irpf').attr("tabindex",-1).focus();
				return false;

	        } else if (e.which == 13) {
	            return true;
	        }
	    }
        
	    function keypress(e) {
	        if (e.keyCode == 38) /* Cima */ {
	            return keydown(e);
	        } else if (e.keyCode == 40) /* Baixo */ {
	            return keydown(e);
	        } else if (e.keyCode == 9) {
				$('.linkPrincipal', combobox).toggleClass('aberto');
				$('.linkPrincipal', combobox).next('ul').slideToggle();
				$('#links-irpf').attr("tabindex",-1).focus();
				return false;

	        } else if (e.which == 13) {
	            if (itemSelecionado) {
	                window.location.href = $(itemSelecionado).attr('href');
	                return false;
	            }
	        } else {
	            var c = String.fromCharCode(e.which).toLowerCase();
	            
	            if (c != "") {
	                if (procura.letra != c)
	                    procura = { letra: c, cnt: 0 };
	                else
	                    procura.cnt++;
	                    
	                ultimaProcura = new Date();
	                
	                var item = procurar();
	                
	                if (item)
	                    $(item.elemento).trigger("selecionar");
	                
	                return false;
	            }
	        }        
	    }    
	    
	    $('a', combobox).attr('href','javascript:void(0)');
        $('ul li a', combobox).each(function() {
            var letra = $(this).text().charAt(0).toLowerCase();
            
            if (!itens[letra])
                itens[letra] = new Array();
                
            itens[letra].push({
                texto: $(this).text().toLowerCase(),
                elemento: this
            });
        }).keypress(keypress)
          .mousemove(function() { $(this).trigger("selecionar"); })
          .focus(function() { if (itemSelecionado != this) $(this).trigger("selecionar"); linkPrincipal.focus(); })
          .bind("selecionar", function() {
          		if (itemSelecionado != this) {
	                if (itemSelecionado)
	                    $(itemSelecionado).removeClass('selecionado');
	                $(this).addClass('selecionado');
	                itemSelecionado = this;
	                linkPrincipal.text($(this).text());
	                
	                if (linkPrincipal.hasClass("aberto"))
	                    $(this).focus();
	                    
	                combobox.trigger("change");
	            }
        });
	 
	    linkPrincipal.click(function() {
		    $('body').toggleClass('abrindo-combo-' + combobox.attr('id'));
		    linkPrincipal.toggleClass('aberto');
		    linkPrincipal.next('ul').slideToggle();
	    }).keypress(keypress);
    
	    if ($.browser.msie)
	      linkPrincipal.keydown(keydown);
	
	    $('body').click(function() {
	        if ($('body').hasClass('abrindo-combo-' + combobox.attr('id')))
		        $('body').toggleClass('abrindo-combo-' + combobox.attr('id'));
	        else if (linkPrincipal.hasClass('aberto')) {
		        $('.linkPrincipal', combobox).toggleClass('aberto');
		        $('.linkPrincipal', combobox).next('ul').slideToggle();
	        }
	    });
	    
	    if (options.selecionado != null) {
	    	$($('ul li a', combobox).get(options.selecionado)).focus();
	    }
	    
	    return this;
	}
});
