var SuperCaixa = function(){
    var labels = {
      "options":[]
    };

    /**
     * Adiciona uma opcao, ou seja, um select nas configuracoes
     */
    function addOption(options){
        var qtd = labels.options.length;
        for(var i=0;i<qtd;i++){
            if(labels.options[i].seletor == options.seletor){
                labels.options[i] = options;
                return true;
            }
        }
        labels.options.push(options);
        return true;
    }

    /**
     * Retorna as opcoes de uma determinada caixa
     */
    function getOptions(seletor){
        var qtd = labels.options.length;
        for(var i=0;i<qtd;i++){
            if(labels.options[i].seletor == seletor){
                return labels.options[i];
            }
        }
        return false;
    }

    /**
     * Inicializa a supercaixa
     */
    function init(options){
        if(typeof options == "string"){
            options = {seletor:options};
        }
        addOption(options);
        selectToSuperCaixa(options);
    }
    
    /**
     * Transforma um simples combobox em uma SuperCaixa
     */
    function selectToSuperCaixa(options){
        //alert("selectToSupercaixa");
        var obj = jQuery(options["seletor"]);
        if(!obj.hasClass(".superbox")){
            var id = obj.attr("id");
            var opts = [];
            obj.find("option").each(function(){
                opts.push({
                    key : jQuery(this).text(),
                    value : jQuery(this).val(),
                    selected : jQuery(this).attr("selected")
                });
            });
            var html = "";
            if(options["tipoExibicao"] == "superselect"){
                html = getHTMLSuperSelect(id, opts, options); // pega o html do superselect
            } else {
                html = getHTMLSuperCaixa(id, opts, options); // pega o html da supercaixa
            }
            
            obj.replaceWith(html); // substitui a combo pela supercaixa
            setListeners(options); // Define os eventos
        }
    }

    /**
     * Retorna o html do super select
     */
    function getHTMLSuperSelect(id, valores, options) {
        var size = valores.length;
        var div = "<div class='flutuante'><span class='fechar-flutuante' style='float:right;'>"+options['fechar']+"</span><div class='resultado-superselect'>";
        for(var i=0;i<size;i++){
            div += "<label><input type='checkbox' value='"+valores[i].value+"' key='"+valores[i].key+"'/>"+valores[i].key+"</label>";
        }
        div += "</div>";
        var span = "<span id='"+id+"' class='multiSelect superbox fechado'><input type='text' value='"+options['nenhumSelecionado']+"' readonly='readonly' size='14' /></span>";
        return "<div class='SuperSelect'>"+span+div+"</div>";
    }

    /**
     * Retorna o conteudo html da supercaixa
     */
    function getHTMLSuperCaixa(id, valores, options) {
        var size = valores.length;
        var div = "<div class='flutuante'><div class='titulo-flutuante'><span class='texto'>"+options['titulo']+"</span><span class='fechar-flutuante'>"+options['fechar']+"</span></div><div class='resultado-supercaixa'>";
        for(var i=0;i<size;i++){
            div += "<label><input type='checkbox' value='"+valores[i].value+"' key='"+valores[i].key+"'/>"+valores[i].key+"</label>";
        }        
        div +=  "</div>";

        var idioma = "";
        switch(BuscaRapidaLanguage.getIdiomaPadrao()){
            case "EN-US":
                idioma = "_ing";
                break;
            case "ESP":
                idioma = "_esp";
                break;
        }
        div += "<div class='fundo'><input type='button' class='supercaixa_btn_prosseguir "+idioma+"' onclick='return false;' value='' class='btn_prosseguir' /></div>";
        div += "</div>";
        var span = "<span id='"+id+"' class='multiSelect superbox'><input type='text' value='"+options['nenhumSelecionado']+"' readonly='readonly' /></span>";
        return "<div class='SuperCaixa'>"+span+div+"</div>";
    }

    /**
     * Aplica os eventos nos objetos
     */
    function setListeners(options){
        var id = options["seletor"];        
        // Listener para quando clicar no botao fechar
        jQuery(id).siblings(".flutuante").find(".fechar-flutuante, .btn_prosseguir, .supercaixa_btn_prosseguir").unbind().click(function(){
            fechar(id);
        });

        // Quando sair da janela
        // Jarícia removeu pois estava muito ruim de usar.
        // Verificar quem solicitou isso e fazer algum tipo de configuração própria para ele.
/*        jQuery(id).siblings(".flutuante").mouseleave(function(){
            fechar(id);
        });*/

        // Listener para quando clicar na combobox para abrir a janela
        jQuery(id).unbind().click(function(){
            if(options["onOpen"] != undefined){
                // Se deixar abrir, entao abre
                if(options["onOpen"]()){
                    if(options["tipoExibicao"] == "superselect"){
                        if(jQuery(this).hasClass("fechado")){                            
                            abrir(id);
                        } else if(jQuery(this).hasClass("aberto")){                            
                            fechar(id);
                        }
                    } else {
                        abrir(id);
                    }
                }
            } else {
                if(options["tipoExibicao"] == "superselect"){
                    if(jQuery(this).hasClass("aberto")){
                        fechar(id);
                    } else if(jQuery(this).hasClass("fechado")){
                        abrir(id);
                    }
                } else {
                    abrir(id);
                }
            }
        });
        
        var sc = jQuery(id).siblings(".flutuante").find(".resultado-supercaixa, .resultado-superselect");
        // Quando clicar nas checkboxes da caixa
        sc.find("input[type=checkbox]").unbind().click(function(){
            var opt = getOptions(id);
            var str = "";
            var marcados = getItensMarcados(id);
            var qtdMarcados = marcados.length;
            for(var i=0;i<qtdMarcados;i++)
                str += (str == "") ? marcados[i].key : ", "+marcados[i].key;

            if(str == ""){
                str = options["nenhumSelecionado"];
            }
            jQuery(id).find("input[type=text]").val(str);
           if(opt["onClickItem"] != undefined){
               opt["onClickItem"](jQuery(this));
           }
        });
        sc.prepend("<div class='"+id.replace("#","")+"-busca'></div>");

        // Aplica o plugin de busca nas checkboxes da caixa
        sc.find("label").quicksearch({
            position: 'before',
            attached: "."+id.replace("#","")+"-busca",
            loaderText: '',
            labelText: (options["tipoExibicao"] == "superselect") ? "" : options["consultar"]+':',
            delay: 100
        });
    }

    /**
     * Transforma a SuperCaixa em um combobox novamente.
     */
    function toSelect(seletor){
        var id = jQuery(seletor).attr("id");
        // Pega todas as checkboxes do div
        var options = [];
        jQuery(seletor).siblings(".flutuante").find("input[type=checkbox]").each(function(){
            options.push({key:jQuery(this).attr("key"),value:jQuery(this).val(),checked:jQuery(this).attr("checked")});
        });

        // Agora cria o html do select
        var qtdOptions = options.length;
        var s = "<select name='"+id+"' id='"+id+"'>";
        for(var i=0;i<qtdOptions;i++){
            s += "<option value='"+options[i].value+"'>"+options[i].key+"</option>";
        }
        s += "</select>";
        jQuery(seletor).parent(".SuperCaixa, .SuperSelect").replaceWith(s);
        return getOptions(seletor);
    }

    /**
     * Adiciona um item na supercaixa
     */
    function addItem(seletor, item){
        var options = toSelect(seletor);
        jQuery(seletor).append("<option value='"+item[0]+"'>"+item[1]+"</option>");
        selectToSuperCaixa(options);
    }

    /**
     * Adiciona varios itens na supercaixa
     */
    function addItens(seletor, itens){
        var options = toSelect(seletor);
        var size = itens.length;
        for(var i=0;i<size;i++){
            jQuery(seletor).append("<option value='"+itens[i][0]+"'>"+itens[i][1]+"</option>");
        }
        selectToSuperCaixa(options);
    }

    /**
     * Retorna todos os itens da supercaixa
     */
    function getItens(seletor){
        var options = []
        jQuery(seletor).siblings(".flutuante").find(".resultado-supercaixa,.resultado-superselect").find("input[type=checkbox]").each(function(){
            options.push({
                key     : jQuery(this).attr("key"),
                value   : jQuery(this).val(),
                checked : jQuery(this).attr("checked")
            });
        });
        return options;
    }

    /**
     * Retorna todos os itens marcados da supercaixa
     */
    function getItensMarcados(seletor){
        var options = []
        var opt = getItens(seletor);
        var qtd = opt.length;
        for(var i=0;i<qtd;i++){
            if(opt[i]["checked"]){
                options.push(opt[i]);
            }
        }
        return options;
    }

    /**
     * Marca todos itens que possuirem os valores passados por array
     */
    function marcarItens(seletor, values){
        var size = values.length;
        var str = "";
        jQuery(seletor).siblings(".flutuante").find(".resultado-supercaixa,.resultado-superselect").find("input[type=checkbox]").each(function(){
            for(var i=0;i<size;i++){
                if(jQuery(this).val() == values[i]){
                    jQuery(this).attr("checked", true);
                    str += ((str == "") ? "" : ", ")+jQuery(this).attr("key");
                }
            }
        });
        jQuery(seletor).find("input[type=text]").val(str);
    }

    /**
     * Remove todos os itens da supercaixa
     */
    function limpar(seletor){
        var options = toSelect(seletor);
        jQuery(seletor).empty();
        selectToSuperCaixa(options);
    }

    function abrir(seletor){
        var options = getOptions(seletor);
        jQuery(seletor).removeClass("fechado").addClass("aberto");
        if(jQuery.browser.msie){
            jQuery(seletor).siblings(".flutuante").css("display","block");
            /*if(options["tipoExibicao"] != "superselect"){
                jQuery(this).css("top", window.scrollY + 50);
            }*/
        } else {
            jQuery(seletor).siblings(".flutuante").fadeIn(300, function(){
                /*if(options["tipoExibicao"] != "superselect"){
                    jQuery(this).css("top", window.scrollY + 50);
                }*/
            });
        }
        
    }

    function fechar(seletor){
        var options = getOptions(seletor);
        jQuery(seletor).removeClass("aberto").addClass("fechado");
        if(jQuery.browser.msie){
            jQuery(seletor).parent(".SuperCaixa, .SuperSelect").find(".flutuante").css("display", "none");
            /*if(options["tipoExibicao"] != "superselect"){
                jQuery(this).css("top", window.scrollY + 50);
            }*/
        } else {
            jQuery(seletor).siblings(".flutuante").fadeOut(function(){
                /*if(options["tipoExibicao"] != "superselect"){
                    jQuery(this).css("top", window.scrollY + 50);
                }*/
            });
        }
    }
    
    return {
        init                : init,
        addItem             : addItem,
        addItens            : addItens,
        getItens            : getItens,
        getItensMarcados    : getItensMarcados,
        marcarItens         : marcarItens,
        limpar              : limpar,
        abrir               : abrir,
        fechar              : fechar
    }
}();
