/**  VARIÁVEIS DE PAGINAÇÃO  **/
var subgrupos_por_pagina = 8;  // número de subgrupos por página
var generico_por_pagina  = 8;  // número de produtos genéricos por página
var produtos_por_pagina  = 8;  // número de produtos por página

/**  VARIÁVEIS GLOBAIS  **/
var req;                                 // requisição do ajax
var grupoAtivo;                          // armazena qual o grupo ativo
var subGrupoAtivo;                       // armazena qual o subgrupo ativo
var genericoAtivo;                       // armazena qual o genérico ativo
var paginaAtiva;                         // lembra qual página de produtos está visualizada
var arraySubGrupos         = new Array;  // armazena os subgrupos
var arrayGenericos         = new Array;  // armazena os produtos genéricos
var arrayProdutos          = new Array;  // armazena os produtos genéricos
var arrayNomesGrupos       = new Array;  // armazena os nomes dos grupos
var arrayNomesSubGrupos    = new Array;  // armazena os nomes dos subgrupos
var arrayIdsSubGrupos      = new Array;  // armazena as ids dos subgrupos por grupo
var arrayIdsGenericos      = new Array;  // armazena as ids dos produtos genéricos por subgrupo
var arrayFotosProdutos     = new Array;  // armazena os nomes dos arquivos da primeira foto de cada produto genérico
var arrayDescricaoProdutos = new Array;  // armazena as descrições dos produtos
var arrayDetalhesProdutos  = new Array;  // armazena os detalhes dos produtos

/**  SEMÁFOROS  **/
var semaf_loadSubGrupos      = new Array;  // armazena a fila de requisições de loadSubGrupos ()
var semaf_loadGenericos      = new Array;  // armazena a fila de requisições de loadGenericos ()
var semaf_loadProdutos       = new Array;  // armazena a fila de requisições de loadProdutos ()
var semaf_loadEspecificacoes = new Array;  // armazena a fila de requisições de loadEspecificacoes ()

var tem_fila_loadSubGrupos;
var tem_fila_loadGenericos;
var tem_fila_loadProdutos;
var tem_fila_loadEspecificacoes;



var _load_agrupa_sub       = '<p style="width:100%;text-align:center;color:#ddd">carregando...</p>';
var _load_agrupa_subgrupos = '<img src="img/loading01.gif" alt="carregando..." title="carregando..." width="43" height="11" class="loading01" />';
var _load_produ_generico   = 'carregando...';
var _load_agrupa_genericos = '<img src="img/loading03.gif" alt="carregando..." title="carregando..." width="32" height="32" class="loading01" />';
var _load_agrupa_produtos  = '<img src="img/loading02.gif" alt="carregando..." title="carregando..." width="32" height="32" class="loading02" />';
var _load_especificacoes   = '<img src="img/loading01.gif" alt="carregando..." title="carregando..." width="43" height="11" class="loading03" />';

var img_seta_baixo         = '<img style="vertical-align: bottom;margin-right:3px;" src="img/seta_baixo.gif" alt=" + " title=" + " />';
var img_seta_cima          = '<img style="vertical-align: bottom;margin-right:3px;" src="img/seta_cima.gif" alt=" -- " title=" -- " />';


function loadXMLPOST2 ( url, param )
{
    req = null;
    
    // PROCURA POR UM OBJETO NATIVO (MOZILLA/SAFARI)
    if ( window.XMLHttpRequest )
        req = new XMLHttpRequest();
    
    // PROCURA POR UMA VERSAO ACTIVEX (IE)
    else if ( window.ActiveXObject )
        req = new ActiveXObject("Microsoft.XMLHTTP");
    
    else
        alert( 'Seu browser não suporta AJAX! Está página não funcionará corretamente.' )
    
    req.open('POST', url, true);
    req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    req.setRequestHeader("Content-length", param.length);
    req.setRequestHeader("Connection", "close");
    req.onreadystatechange = processReqChange;
    req.send(param);
}


function processReqChange ()
{
    // apenas quando o estado for "completado"
    if (req.readyState == 4) {
        // apenas se o servidor retornar "OK"
        if (req.status == 200) {
            // executa a chamada da função
            funcao = req.responseText.split('{{{funcname}}}')[0].split ( ' ' );
            eval ( funcao [0] ).apply( this, funcao[1].replace('(', '').replace(')', '').split(',') );
        } else {
            // alert("Houve um problema ao obter os dados:\n" + req.statusText);
            return false;
        }
    }
}


/*
 * função loadXPath ()
 *  carrega dados a partir de um XPath
 * @param  path = xpath string
 */
function loadXPath ( url, path, funcao )
{
    // monta o post e executa o método que faz o envio asspíncrono dos dados
    loadXMLPOST2 ( url, 'xpath=' + path + '{{{funcname}}}' + funcao );
}


/**
 * função init ()
 *  carrega e monta o conteúdo inicial da página
 *  @param id Id do grupo do qual os produtos serão carregados
 */
function init (grupo_id)
{
    loadGrupos ('',grupo_id);
    return false;
}


/*
 * função loadGrupos ()
 *  carrega e monta a lista de grupos
 * @param  acao = "false": envia a requisição pro AJAX, "1": processa o retorno do AJAX
 */
function loadGrupos ( acao, grupo_id )
{
    var agrupa_sub       = document.getElementById('agrupa_sub');
    var agrupa_subgrupos = document.getElementById('agrupa_subgrupos');
    var agrupa_genericos = document.getElementById('agrupa_genericos');
    var agrupa_produtos  = document.getElementById('agrupa_produtos');
    var produ_generico   = document.getElementById('produ_generico');
    
    if ( !grupo_id ) grupo_id = 0;
    
    if ( acao == 1 )
    {
        var id;
        var item;
        var menuItens = '';
        
        // captura o retorno do AJAX
        menu = req.responseText.split( '{{{funcname}}}' )[1].split ( "\n" );
        
        // percorre os itens, montando o menu
        for ( var i = 0; i < menu.length; i += 2 )
        {
            // quebra o responseText para pegar a ID e o nome do ITEM
            id   = menu[i].split( '=\\"' )[1];
            if ( ! id ) break;
            
            item = menu[i+1].split( '=\\"' )[1];
            if ( ! item ) break;
            
            // monta os links
            id   = id.split( '\\"' )[0];
            item = item.split( '\\"' )[0];
            menuItens += '\n<a href="#" class="link_texto_subs" onclick="return loadSubGrupos(\'\', \'' + id + '\');" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage(\'sub_' + item.toLowerCase() + '\',\'\',\'img/sub_' + item.toLowerCase() + '-over.jpg\',1)"><img src="img/sub_' + item.toLowerCase() + '.jpg" name="sub_' + item.toLowerCase() + '" alt="Linha ' + item.capitalize() + '" title="Linha ' + item.capitalize() + '" height="18" class="subs" /></a>';
            
            // grava o nome do Grupo no array de grupos
            arrayNomesGrupos [id] = item;
            
            // carrega o primeiro subgrupo a ser exibido na página
            if ( ! arraySubGrupos [id] && grupo_id == 0 && i == 0 )
            {
                loadSubGrupos ( '', id );
                grupoAtivo = id;
            }
        }
        
        if ( grupo_id > 0 )
        {
            loadSubGrupos ( '', grupo_id );
            grupoAtivo = grupo_id;
        }
        
        // div onde será inserido o menu dos grupos
        agrupa_sub.innerHTML = menuItens;
    }
    else
    {
        // carregando...
        agrupa_sub.innerHTML       = _load_agrupa_sub;
        /*
        agrupa_subgrupos.innerHTML = _load_agrupa_subgrupos;
        produ_generico.innerHTML   = _load_produ_generico;
        agrupa_genericos.innerHTML = _load_agrupa_genericos;
        agrupa_produtos.innerHTML  = _load_agrupa_produtos;
        mostraTabelaCarregando();
        */
        
        // carrega o XPath
        loadXPath ( 'xpath_produtos.php', '/dsProdutos/tblProdutoGrupo/@Produto_Grupo | /dsProdutos/tblProdutoGrupo/@ID_Produto_Grupo', 'loadGrupos (1,' + grupo_id + ')' );
    }
    
    return false;
}


/*
 * função loadSubGrupos ()
 *  carrega e monta a lista de subgrupos
 * @param  acao     = "false": envia a requisição pro AJAX ou pega o conteúdo do array, "1": processa o retorno do AJAX
 * @param  grupo_id = id do grupo
 */
function loadSubGrupos ( acao, grupo_id )
{
    var agrupa_subgrupos = document.getElementById('agrupa_subgrupos');
    var agrupa_genericos = document.getElementById('agrupa_genericos');
    var agrupa_produtos  = document.getElementById('agrupa_produtos');
    var produ_generico   = document.getElementById('produ_generico');
    var top_linha        = document.getElementById('top_linha');
    
    // Verifica se está executando a partir da resposta do servidor
    if ( acao == 1 )
    {
        // libera o semáforo
        tem_fila_loadSubGrupos = false;
        
        var id;
        var item;
        var pagina = 0;
        var itens_na_pagina = 0;
        var menuItens = '<ul class="agrupa_menuprod">';
        
        // captura o retorno do AJAX
        menu = req.responseText.split( '{{{funcname}}}' )[1].split ( "\n" );
        
        // cria a primeira posicao do array de paginas de subgrupos
        arraySubGrupos [grupo_id]    = new Array;
        arraySubGrupos [grupo_id][0] = new Array;
        
        // percorre os itens, montando o menu
        for ( var i = 0; i < menu.length; i += 2 )
        {
            // se atingiu o limite de itens na página, faz a paginação do array
            if ( itens_na_pagina++ == subgrupos_por_pagina )
            {
                // armazena a página do subgrupo
                menuItens += '\n</ul>';
                arraySubGrupos [grupo_id][pagina] = menuItens;
                
                // inicia uma nova lista de itens
                menuItens = '<ul class="agrupa_menuprod">';
                
                // passa para a próxima página de itens
                itens_na_pagina = 1;      // zera o número de itens por página
                pagina++;                 // incrementa o número da página
                
                arraySubGrupos [grupo_id][pagina] = new Array;
            }
            
            // quebra o responseText para pegar a ID e o nome do ITEM
            id   = menu[i].split( '=\\"' )[1];
            if ( ! id ) break;
            
            item = menu[i+1].split( '=\\"' )[1];
            if ( ! item ) break;
            
            // monta os links
            id   = id.split( '\\"' )[0];
            item = item.split( '\\"' )[0];
            menuItens += '\n<li class="float"><a href="#" onclick="return loadGenericos(\'\', ' + id + ',this);" class="link_produtos">' + item + '</a></li>';
            
            if ( ! arrayIdsSubGrupos [grupo_id] )
            {
                // grava o nome do SubGrupo no array de subgrupos
                arrayIdsSubGrupos   [grupo_id] = id;
                arrayNomesSubGrupos [grupo_id] = item.toUpperCase();
                
                // verifica se o usuário não clicou em algum outro grupo enquanto carregava o ajax
                if ( grupoAtivo == grupo_id )
                {
                    produ_generico.innerHTML = item.toUpperCase();
                    
                    // libera o semáforo
                    tem_fila_loadGenericos = false;
                    
                    // carrega a lista de produtos genéricos do primeiro subgrupo a ser exibido na página
                    loadGenericos ( '', id );
                }
            }
        }
        
        
        // Fecha o último <ul>
        menuItens += '\n</ul>';
        
        // Grava o menu no array de subgrupos
        arraySubGrupos [grupo_id][pagina] = menuItens;
        
        // Monta a barra de paginação do menu de subgrupos
        var paginacao;
        
        // Se tiver mais de uma página, monta a barra de paginação
        if ( pagina > 0 )
        {
            paginacao = '\n<p class="paginacao3">';
            
            for ( i = 0; i <= pagina; i++ )
            {
                paginacao += '\n<a href="#" onclick="return doPaginacaoSubGrupos(' + grupo_id + ', ' + i + ');" class="link04">' + ( i + 1 ) + '</a>';
                if ( i < pagina )
                {
                    paginacao += ' | ';
                }
            }
            
            paginacao += '\n</p>';
        }
        
        // Se não, monta a barra vazia
        else
        {
            paginacao = '\n<p class="paginacao3">&nbsp;</p>';
        }
        
        // Inclui a barra de paginação, vazia ou não, abaixo de cada menu de subgrupo
        for ( i = 0; i <= pagina; i++ )
        {
            arraySubGrupos [grupo_id][i] += paginacao;
        }
        
        // verifica se o usuário não clicou em algum outro grupo enquanto carregava o ajax
        if ( grupoAtivo == grupo_id )
        {
            // div onde será inserido o menu dos grupos
            agrupa_subgrupos.innerHTML = arraySubGrupos [grupo_id][0];
        }
        
        // processa a fila de requisições, caso haja
        if ( semaf_loadSubGrupos.length > 0 )
        {
            // remove o primeiro elemento da fila
            grupo_id = semaf_loadSubGrupos.shift();
            
            // carrega o próximo subgrupo
            loadSubGrupos ( '', grupo_id );
        }
    }
    
    // verifica se o subrupo já foi carregado alguma vez, e então utiliza o conteúdo pré-existente
    else if ( arraySubGrupos [grupo_id] && arraySubGrupos [grupo_id][0] )
    {
        // defino o grupo selecionado como sendo o ativo
        grupoAtivo = grupo_id;
        
        // div onde será inserido o menu dos grupos
        agrupa_subgrupos.innerHTML = arraySubGrupos [grupo_id][0];
        produ_generico.innerHTML   = arrayNomesSubGrupos [grupo_id];
        
        // carrega a lista de produtos genéricos do primeiro subgrupo do grupo
        loadGenericos ( '', arrayIdsSubGrupos [grupo_id] );
        
        // altera o título do submenu
        top_linha.src = 'img/top_linha' + arrayNomesGrupos [grupo_id].toLowerCase() + '.gif';
    }
    
    // verifica se não há requisições na fila
    else if ( ! tem_fila_loadSubGrupos )
    {
        // pega o semáforo
        tem_fila_loadSubGrupos  = true;
        
        // defino o grupo selecionado como sendo o ativo
        grupoAtivo = grupo_id;
        
        // altera o título do submenu
        top_linha.src = 'img/top_linha' + arrayNomesGrupos [grupo_id].toLowerCase() + '.gif';
        
        // carregando...'s
        agrupa_subgrupos.innerHTML = _load_agrupa_subgrupos;
        /*
        produ_generico.innerHTML   = _load_produ_generico;
        agrupa_genericos.innerHTML = _load_agrupa_genericos;
        agrupa_produtos.innerHTML  = _load_agrupa_produtos;
        mostraTabelaCarregando();
        */
        
        // carrega o XPath
        loadXPath ( 'xpath_produtos.php', '/dsProdutos/tblProdutoSubGrupo[@ID_Produto_Grupo = ' + grupo_id + ']/@Produto_SubGrupo | /dsProdutos/tblProdutoSubGrupo[@ID_Produto_Grupo = ' + grupo_id + ']/@ID_Produto_SubGrupo', 'loadSubGrupos (1,' + grupo_id + ')' );
    }
    
    // enfilera a requisição no semáforo
    else
    {
        semaf_loadSubGrupos.unshift ( grupo_id );
    }
    
    return false;
}


/*
 * função loadGenericos ()
 *  carrega e monta a lista de produtos genéricos
 * @param  acao        = "false": envia a requisição pro AJAX ou pega o conteúdo do array, "1": processa o retorno do AJAX
 * @param  subgrupo_id = id do subgrupo
 * @param  obj         = elemento que contém o texto para substituir o nome do subgrupo sendo visualizado
 */
function loadGenericos ( acao, subgrupo_id, obj )
{
    // div que abriga a lista de fotos de produtos genéricos
    var agrupa_genericos = document.getElementById( 'agrupa_genericos' );
    var agrupa_produtos  = document.getElementById( 'agrupa_produtos' );
    
    // Se a função está sendo chamada a partir do clique em um link, 
    // pega o texto do link para exibir no nome do produto genérico
    if ( obj )
    {
        document.getElementById( 'produ_generico' ).innerHTML = obj.innerHTML;
    }
    
    // Verifica se está executando a partir da resposta do servidor
    if ( acao == 1 )
    {
        // libera o semáforo
        tem_fila_loadGenericos = false;
        
        arrayGenericos [subgrupo_id] = new Array;
        
        var id;
        var foto, teste_foto;
        var menu;
        var menuItens       = '<div id="div_genericos_1" class="envolve_tbs">';
        var pagina          = 0;
        var itens_na_pagina = 0;
        
        // captura o retorno do AJAX
        menu = req.responseText.split( '{{{funcname}}}' )[1].split ( "\n" );
        
        // se retornou produtos...
        if ( menu.length > 1 )
        {
            // percorre os itens, montando o menu
            for ( var i = 0; i < menu.length; i += 2 )
            {
                // quebra o responseText para pegar a ID e 
                id   = menu[i].split( '=\\"' )[1];
                if ( ! id ) break;
                else id = id.split( '\\"' )[0];
                
                teste_foto = menu[i+1].split( '=' )[0].replace( /\ /g, '' );
                foto = menu[i+1].split( '=\\"' )[1];
                
                if ( ! foto || teste_foto != 'FotoPequena' )
                {
                    // produto sem foto
                    foto = 'semfoto.jpg';
                    i--;
                }
                else
                {
                    foto = foto.split( '\\"' )[0].replace ( /\.tif|\.jpeg|\.JPG/gi, '.jpg' ).replace(/\\\'/g,"'");
                }
                
                
            // >>>>>>>>>> DESFAZER DEPOIS <<<<<<<<<<<<<
            if ( ! arrayFotosProdutos [id] )
            {
                arrayFotosProdutos [id] = foto;
                if ( i == 0 ) showAmpli ( foto );
                
                // reseta a página de visualização
                paginaAtiva = 1;
            }
            // >>>>>>>>>> DESFAZER ATÉ AQUI <<<<<<<<<<<<<
                
                // se atingiu o limite de itens na página, passa para a próxima página
                if ( itens_na_pagina++ == generico_por_pagina )
                {
                    itens_na_pagina = 1;      // zera o número de itens por página
                    pagina++;                 // incrementa o número da página
                    
                    // inicia um novo div
                    menuItens += '</div><div id="div_genericos_' + ( pagina + 1 ) + '" style="display:none;" class="envolve_tbs">';
                }
                
                // monta os links
                menuItens += '\n<a href="#" onclick="return loadProdutos(\'\', \'' + id + '\');"><img src="produtos/thumbs/' + foto + '" alt="" width="48" height="50" class="thumbs_produtos" /></a>';
                
                if ( ! arrayIdsGenericos [subgrupo_id] && subGrupoAtivo == subgrupo_id )
                {
                    arrayIdsGenericos [subgrupo_id] = id;
                    
                    // libera o semáforo dos produtos
                    tem_fila_loadProdutos = false;
                    
                    // carrega a lista de produtos do primeiro produto genérico a ser exibido na página
                    loadProdutos ( '', id );
                }
            }
            
            menuItens += '</div>';
            menuItens += '<p class="paginacao">';
            
            for ( var i = 1; i <= pagina + 1; i++ )
            {                    
                nome_classe = ( i == 1 ? 'link02' : 'link01' );
                menuItens += '<a href="#" id="link_pag_generico_' + i + '" onclick="return doPaginacaoGenericos(' + subgrupo_id + ', ' + i + ');" class="' + nome_classe + '">' + i + '</a>';
                
                if ( i <= pagina )
                {
                    menuItens += ' | ';
                }
            }
            
            menuItens += '</p>';
            
            // grava a lista no array de produtos genéricos
            arrayGenericos [subgrupo_id]['itens']   = menuItens;
            arrayGenericos [subgrupo_id]['paginas'] = pagina;
            
            // verifica se o usuário não clicou em algum outro subgrupo enquanto carregava o ajax
            if ( subGrupoAtivo == subgrupo_id )
            {
                // mostra a lista de fotos
                agrupa_genericos.innerHTML = menuItens;
            }
        }
        else
        {
            showAmpli ( "semfoto.jpg" );
            arrayGenericos [subgrupo_id]['itens'] = '<p style="padding-top: 30px;text-align:center;">Nenhum produto para este subgrupo.</p>';
            agrupa_genericos.innerHTML = arrayGenericos [subgrupo_id]['itens'];
        }
        
        // processa a fila de requisições, caso haja
        if ( semaf_loadGenericos.length > 0 )
        {
            // remove o primeiro elemento da fila
            subgrupo_id = semaf_loadGenericos.shift();
            
            // carrega o próximo produto genérico
            loadGenericos ( '', subgrupo_id );
        }
    }
    
    // verifica se o genérico já foi carregado alguma vez, e então utiliza o conteúdo pré-existente
    else if ( arrayGenericos [subgrupo_id] && arrayGenericos [subgrupo_id]['itens'] )
    {
        showAmpli ( "semfoto.jpg" );
        // defino o subgrupo selecionado como sendo o ativo
        subGrupoAtivo = subgrupo_id;
        
        // monta a barra de paginação dos genéricos, montando a lista de fotos
        agrupa_genericos.innerHTML = arrayGenericos [subgrupo_id]['itens'];
        
        // carrega a lista de produtos genéricos do primeiro subgrupo a ser exibido na página, se existir
        if ( arrayIdsGenericos [subgrupo_id] )
        {
            loadProdutos ( '', arrayIdsGenericos [subgrupo_id] );
        }
    }
    
    else if ( ! tem_fila_loadGenericos )
    {
        // Pega o semáforo
        tem_fila_loadGenericos = true;
        
        // defino o subgrupo selecionado como sendo o ativo
        subGrupoAtivo = subgrupo_id;
        
        // carregando...
        agrupa_genericos.innerHTML = _load_agrupa_genericos;
        /*
        agrupa_produtos.innerHTML  = _load_agrupa_produtos;
        mostraTabelaCarregando();
        */
        
        // carrega o XPath
        loadXPath ( 'xpath_fotos.php', 'generico-' + subgrupo_id, 'loadGenericos (1,' + subgrupo_id + ')' );
    }
    
    // enfilera a requisição no semáforo
    else
    {
        semaf_loadGenericos.unshift ( subgrupo_id );
    }
    
    return false;
}


/*
 * função loadProdutos ()
 *  carrega e monta a lista de produtos do produto genérico selecionado
 * @param  acao        = "false": envia a requisição pro AJAX ou pega o conteúdo do array, "1": processa o retorno do AJAX
 * @param  generico_id = id do generico
 */
function loadProdutos ( acao, generico_id )
{
    // div que abriga a lista de fotos de produtos genéricos
    var agrupa_produtos = document.getElementById( 'agrupa_produtos' );
    var tabela_produtos = document.getElementById( 'tabela_produtos' );
    
    // verifica se está executando a partir da resposta do servidor
    if ( acao == 1 )
    {
        // libera o semáforo
        tem_fila_loadProdutos = false;
        
        arrayProdutos [generico_id]          = new Array;
        arrayDescricaoProdutos [generico_id] = new Array;
        
        var tr;
        var cont_tr = 0;
        var td_produto, td_preco;
        var nome_classe_linha;
        var id;
        var foto, teste_foto;
        // >>>>>>>>>>>>> DESFAZER DEPOIS <<<<<<<<<<<<<
        foto = arrayFotosProdutos [generico_id];
        showAmpli ( foto );
        // >>>>>>>>>> DESFAZER ATÉ AQUI <<<<<<<<<<<<<
        
        var produto;
        var menu;
        var menuItens       = '<div id="div_produtos_1" class="envolve_tbs">';
        var pagina          = 0;
        var itens_na_pagina = 0;
        
        // captura o retorno do AJAX
        menu = req.responseText.split( '{{{funcname}}}' )[1].split ( "\n" );
        
        // se retornou produtos...
        if ( menu.length > 1 )
        {
            arrayDescricaoProdutos [generico_id][pagina]         = new Array;
            arrayDescricaoProdutos [generico_id][pagina]['nome'] = new Array;
            arrayDescricaoProdutos [generico_id][pagina]['id']   = new Array;
            
            // percorre os itens, montando o menu
            for ( var i = 0; i < menu.length; i += 3 )
            {
                // quebra o responseText para pegar a ID e 
                id   = menu[i].split( '=\\"' )[1];
                if ( ! id ) break;
                else id = id.split( '\\"' )[0];
                
                teste_foto = menu[i+1].split( '=' )[0].replace( /\ /g, '' );
                
                // >>>>>>>>>> DESFAZER DEPOIS <<<<<<<<<<
                //foto = menu[i+1].split( '=\\"' )[1];
                // >>>>>>>>>> DESFAZER ATÉ AQUI <<<<<<<<<<<<<
                if ( ! foto || teste_foto != 'FotoPequena' )
                {
                    // produto sem foto
                    foto = 'semfoto.jpg';
                    i--;
                }
                else foto = foto.split( '\\"' )[0].replace ( /\.tif|\.jpeg|\.JPG/gi, '.jpg' ).replace(/\\\'/g,"'");
                
                produto = menu[i+2].split( '=\\"' )[1];
                if ( ! produto )
                {
                    // produto sem nome (vai que tenha, né???)
                    produto = '&nbsp;';
                }
                else produto = produto.split( '\\"' )[0].replace(/\\\'/g,"'");
                
                
                
                // se atingiu o limite de itens na página, faz a paginação dos arrays
                if ( itens_na_pagina++ == produtos_por_pagina )
                {
                    // passa para a próxima página de itens
                    itens_na_pagina = 1;      // zera o número de itens por página
                    pagina++;                 // incrementa o número da página
                    
                    // inicia um novo div
                    menuItens += '</div><div id="div_produtos_' + ( pagina + 1 ) + '" style="display:none;" class="envolve_tbs">';
                    
                    
                    // próxima página da tabela de descrição de produtos
                    cont_tr = 0;
                    arrayDescricaoProdutos [generico_id][pagina]         = new Array;
                    arrayDescricaoProdutos [generico_id][pagina]['nome'] = new Array;
                    arrayDescricaoProdutos [generico_id][pagina]['id']   = new Array;
                }
                
                // monta os links
                // >>>>>>>>>>>>>>> DESFAZER DEPOIS <<<<<<<<<<<<<<<
                //menuItens += '\n<a href="#" onclick="return showAmpli(\'' + foto + '\');"><img src="produtos/thumbs/' + foto + '" alt="" width="48" height="50" class="thumbs_modelos" /></a>';
                menuItens += '\n<a href="#" onclick="return showAmpli(\'' + arrayFotosProdutos [generico_id] + '\');"><img src="produtos/thumbs/' + foto + '" alt="" width="48" height="50" class="thumbs_modelos" /></a>';
                // >>>>>>>>>>>>>>> DESFAZER ATÉ AQUI <<<<<<<<<<<<<<<
                
                // grava a linha da tabela numa posição do array
                arrayDescricaoProdutos [generico_id][pagina]['nome'][cont_tr]   = produto;
                arrayDescricaoProdutos [generico_id][pagina]['id']  [cont_tr++] = id;
                
                
                if ( ! arrayFotosProdutos [generico_id] )
                {
                    arrayFotosProdutos [generico_id] = foto;
                    showAmpli ( foto );
                    
                    // reseta a página de visualização
                    paginaAtiva = 1;
                }
            }
            
            menuItens += '</div>';
            menuItens += '<p class="paginacao2">';
            if ( pagina > 0 )
            {
                menuItens += '<a href="#" class="link04" onclick="return doPaginacaoProdutos (' + generico_id + ',\'prev\');"><strong><<</strong></a>';
                menuItens += '<a href="#" class="link04" onclick="return doPaginacaoProdutos (' + generico_id + ',\'next\');"><strong> >></strong></a>';
            }
            else
                menuItens += '&nbsp;';
            
            menuItens += '</p>';
            
            // grava a lista no array de produtos genéricos
            arrayProdutos [generico_id]['itens']   = menuItens;
            arrayProdutos [generico_id]['paginas'] = pagina;
            
            
            // verifica se o usuário não clicou em algum outro subgrupo enquanto carregava o ajax
            if ( genericoAtivo == generico_id || 1 )
            {
                // mostra a lista de fotos
                agrupa_produtos.innerHTML = menuItens;
                
                // monta e mostra a tabela da primeira página de descrição de produtos
                doPaginacaoDescricaoProdutos ( generico_id, 1 );
            }
        }
        else
        {
            arrayProdutos [generico_id]['itens'] = 'Nenhum produto para este subgrupo.';
            agrupa_produtos.innerHTML = arrayProdutos [generico_id]['itens'];
        }
        
        // processa a fila de requisições, caso haja
        if ( semaf_loadProdutos.length > 0 )
        {
            // remove o primeiro elemento da fila
            generico_id = semaf_loadProdutos.shift();
            
            // carrega o próximo produto genérico
            loadProdutos ( '', generico_id );
        }
    }
    
    // verifica se o genérico já foi carregado alguma vez, e então utiliza o conteúdo pré-existente
    else if ( arrayProdutos [generico_id] && arrayProdutos [generico_id]['itens'] )
    {
        // defino o subgrupo selecionado como sendo o ativo
        genericoAtivo = generico_id;
        
        // monta a barra de paginação dos genéricos, montando a lista de fotos
        agrupa_produtos.innerHTML = arrayProdutos [generico_id]['itens'];
        showAmpli ( arrayFotosProdutos [generico_id] );
        //alert (arrayFotosProdutos);
        
        // reseta a página de visualização
        paginaAtiva = 1;
        
        // monta e mostra a tabela da primeira página de descrição de produtos
        doPaginacaoDescricaoProdutos ( generico_id, 1 );
    }
    
    else if ( ! tem_fila_loadProdutos )
    {
        // Pega o semáforo
        tem_fila_loadProdutos = true;
        
        // defino o subgrupo selecionado como sendo o ativo
        genericoAtivo = generico_id;
        
        // carregando...
        agrupa_produtos.innerHTML  = _load_agrupa_produtos;
        /*
        mostraTabelaCarregando();
        */
        
        // carrega o XPath
        loadXPath ( 'xpath_fotos.php', 'produto-' + generico_id, 'loadProdutos (1,' + generico_id + ')' );
    }
    
    // enfilera a requisição no semáforo
    else
    {
        semaf_loadProdutos.unshift ( generico_id );
    }
    
    return false;
}


/*
 * função loadEspecificacoes ()
 *  carrega e monta a lista de especificações de um produto
 */
function loadEspecificacoes ( acao, produto_id )
{
    // tr que abriga as especificações
    var hid_tr = document.getElementById( 'hid_tr_' + produto_id );
    var hid_td = document.getElementById( 'hid_td_' + produto_id );
    
    // verifica se está executando a partir da resposta do servidor
    if ( acao == 1 )
    {
        // libera o semáforo
        tem_fila_loadEspecificacoes = false;
        
        var nome, conteudo;
        var menu;
        var nome_classe_txt;
        var especificacoes  = '';
        
        // captura o retorno do AJAX
        menu = req.responseText.split( '{{{funcname}}}' )[1].split ( "\n" );
        // se retornou produtos...
        if ( menu.length > 1 )
        {
            // percorre os itens, montando o menu
            for ( var i = 0; i < menu.length; i += 2 )
            {
                // quebra o responseText para pegar a ID e 
                nome = menu[i].split( '=\\"' )[1];
                if ( ! nome ) break;
                else nome = nome.split( '\\"' )[0];
                
                conteudo = menu[i+1].split( '=\\"' )[1];
                if ( ! conteudo )
                {
                    conteudo = '---';
                }
                else conteudo = conteudo.split( '\\"' )[0];
                
                // monta as especificações
                nome_classe_txt = ( ( i + 3 ) < menu.length ? 'txt_produtos' : 'txt_produtos2' );
                especificacoes += '\n<p class="' + nome_classe_txt + '">' + nome + ' ' + conteudo + '</p>';
            }
            
            // grava as especificações no array de detalhes dos produtos
            arrayDetalhesProdutos [produto_id] = especificacoes;
            
            // verifica se o usuário não clicou em algum outro produto enquanto carregava o ajax
            if ( hid_td = document.getElementById( 'hid_td_' + produto_id ) )
            {
                // mostra a lista de fotos
                hid_td.innerHTML = especificacoes;
                hid_tr.style.display = '';
            }
        }
        else
        {
            arrayDetalhesProdutos [produto_id] = '<p class="txt_produtos2">Não há mais detalhes para este produto.</p>';
            
            // verifica se o usuário não clicou em algum outro produto enquanto carregava o ajax
            if ( hid_td = document.getElementById( 'hid_td_' + produto_id ) )
            {
                // mostra a lista de fotos
                hid_td.innerHTML = arrayDetalhesProdutos [produto_id];
                hid_tr.style.display = '';
            }
        }
        
        // processa a fila de requisições, caso haja
        if ( semaf_loadEspecificacoes.length > 0 )
        {
            // remove o primeiro elemento da fila
            produto_id = semaf_loadEspecificacoes.shift();
            
            // carrega o próximo subgrupo
            loadEspecificacoes ( '', produto_id );
        }
    }
    
    // verifica se as especificações já foram carregadas alguma vez, e então utiliza o conteúdo pré-existente
    else if ( arrayDetalhesProdutos [produto_id] )
    {
        hid_td.innerHTML = arrayDetalhesProdutos [produto_id];
        toggleHidTR ( hid_tr );
    }
    
    // verifica se não há requisições na fila
    else if ( ! tem_fila_loadEspecificacoes )
    {
        // pega o semáforo
        tem_fila_loadEspecificacoes = true;
        
        // carregando...
        hid_tr.previousSibling.getElementsByTagName('img')[0].src   = 'img/seta_cima-over.gif';
        hid_tr.previousSibling.getElementsByTagName('img')[0].alt   = ' - ';
        hid_tr.previousSibling.getElementsByTagName('img')[0].title = ' - ';
        hid_td.innerHTML     = _load_especificacoes;
        hid_tr.style.display = '';
        
        // carrega o XPath
        loadXPath ( 'xpath_produtos.php', '/dsProdutos/tblProdutoEspecificacao[@ID_Produto = ' + produto_id + ']/@Especificacao | /dsProdutos/tblProdutoEspecificacao[@ID_Produto = ' + produto_id + ']/@Texto', 'loadEspecificacoes (1,' + produto_id + ')' );
    }
    
    else
    {
        // carregando...
        hid_tr.previousSibling.getElementsByTagName('img')[0].src   = 'img/seta_cima-over.gif';
        hid_tr.previousSibling.getElementsByTagName('img')[0].alt   = ' - ';
        hid_tr.previousSibling.getElementsByTagName('img')[0].title = ' - ';
        hid_td.innerHTML     = _load_especificacoes;
        hid_tr.style.display = '';
        
        // enfilera a requisição no semáforo
        semaf_loadEspecificacoes.unshift ( produto_id );
    }
    
    return false;
}


/*
 * função doPaginacaoSubGrupos ()
 *  navega entre as páginas de subgrupos
 * @param  grupo_id = id do grupo
 * @param  pagina   = número da página
 */
function doPaginacaoSubGrupos ( grupo_id, pagina )
{
    var agrupa_subgrupos = document.getElementById( 'agrupa_subgrupos' );
    
    if ( grupo_id && ( pagina || pagina === 0 ) && arraySubGrupos [grupo_id][pagina] )
    {
        agrupa_subgrupos.innerHTML = arraySubGrupos [grupo_id][pagina];
    }
    
    return false;
}


/*
 * função doPaginacaoGenericos ()
 *  monta a barra de paginação dos produtos genéricos, com a lista de fotos
 * @param  subgrupo_id = id do subgrupo
 * @param  pagina      = página a ser exibida
 */
function doPaginacaoGenericos ( subgrupo_id, pagina )
{
    // <div> onde serão inseridas as fotos e a barra de paginação
    document.getElementById ( 'div_genericos_' + pagina ).style.display = '';
    document.getElementById ( 'link_pag_generico_' + pagina ).className = 'link02';
    document.getElementById ( 'link_pag_generico_' + pagina ).setAttribute ( 'class', 'link02' );
    
    for ( var i = 0; i <= arrayGenericos [subgrupo_id]['paginas']; i++ )
    {
        if ( i != pagina - 1 )
        {
            document.getElementById ( 'div_genericos_' + ( i + 1 ) ).style.display = 'none';
            document.getElementById ( 'link_pag_generico_' + ( i + 1 ) ).className = 'link01';
            document.getElementById ( 'link_pag_generico_' + ( i + 1 ) ).setAttribute ( 'class', 'link01' );
        }
    }
    
    return false;
}


/*
 * função doPaginacaoProdutos ()
 *  navega entre as páginas de produtos
 * @param  generico_id = id do produto genérico
 * @param  acao        = 'prev': página anterior, 'next': próxima página
 */
function doPaginacaoProdutos ( generico_id, acao )
{
    var tabela_produtos = document.getElementById( 'tabela_produtos' );
    
    if ( ( acao == 'prev' && paginaAtiva > 1 ) || ( acao == 'next' && paginaAtiva - 1 < arrayProdutos [generico_id]['paginas'] ) )
    {
        paginaAtiva += ( acao == 'next' ? 1 : -1 );
        
        doPaginacaoDescricaoProdutos ( generico_id, paginaAtiva );
        
        for ( var i = 0; i <= arrayProdutos [generico_id]['paginas']; i++ )
        {
            if ( i != paginaAtiva - 1 )
            {
                document.getElementById ( 'div_produtos_' + ( i + 1 ) ).style.display = 'none';
            }
            else
            {
                document.getElementById ( 'div_produtos_' + ( i + 1 ) ).style.display = '';
            }
        }
    }
    
    return false;
}


/*
 * função doPaginacaoDescricaoProdutos ()
 *  monta e mostra a tabela de descrição de produtos
 * @param  generico_id = id do produto genérico
 * @param  pagina      = página que irá mostrar
 */
function doPaginacaoDescricaoProdutos ( generico_id, pagina )
{
    pagina--;
    
    if ( generico_id && ( pagina || pagina === 0 ) && arrayDescricaoProdutos [generico_id][pagina]['nome'] )
    {
        var tabela_produtos = document.getElementById ( 'tabela_produtos' );;
        
        var thead = document.createElement ( 'thead' );
        var tr, td_preco, td_produto, hid_tr, td_detalhe;
        var nome_classe_linha;
        var produto_id;
        
        for ( var i = 0; i < arrayDescricaoProdutos [generico_id][pagina]['nome'].length; i++ )
        {
            produto_id = arrayDescricaoProdutos [generico_id][pagina]['id'][i];
            
            // cria a linha
            tr                = document.createElement ( 'tr' );
            tr.id             = 'tr_' + produto_id;
            nome_classe_linha = 'linha_tr' + ( i % 2 == 1 ? '02' : '01' );
            tr.className      = nome_classe_linha;
            tr.setAttribute ( 'class', nome_classe_linha );
            
            tr.onmouseover = function () {
                this.style.cursor = 'pointer';
                this.style.color  = '#b00';
                this.getElementsByTagName('img')[0].src = this.getElementsByTagName('img')[0].src.replace ( /\.gif/, '-over.gif' );
            }
            tr.onmouseout  = function () {
                this.style.cursor = '';
                this.style.color  = '#707172';
                this.getElementsByTagName('img')[0].src = this.getElementsByTagName('img')[0].src.replace ( '-over.gif', '.gif' );
            }
            tr.onclick     = function () {
                loadEspecificacoes ( '', this.id.replace ( 'tr_', '' ) );
            }
            
            // cria as células
            td_produto  = document.createElement ( 'td' );
            td_produto.className = 'td01';
            td_produto.setAttribute ( 'class', 'td01' );
            td_preco    = document.createElement ( 'td' );
            td_preco.className = 'td04';
            td_preco.setAttribute ( 'class', 'td04' );
            
            // insere o conteúdo nas células
            td_produto.innerHTML = img_seta_baixo + arrayDescricaoProdutos [generico_id][pagina]['nome'][i];
            td_preco.innerHTML   = '&nbsp;';
            
            // insere as células na linha
            tr.appendChild ( td_produto );
            tr.appendChild ( td_preco );
            
            // cria a linha oculta que abriga as especificações do produto
            hid_tr               = document.createElement ( 'tr' );
            hid_tr.id            = 'hid_tr_' + produto_id;
            hid_tr.className     = nome_classe_linha;
            hid_tr.setAttribute ( 'class', nome_classe_linha );
            hid_tr.style.display = 'none';
            
            // se estas especificações já foram carregadas, põe seu conteúdo na célula, se não, a célula vai vazia mesmo
            td_detalhe           = document.createElement ( 'td' );
            td_detalhe.id        = 'hid_td_' + produto_id;
            td_detalhe.colSpan   = 2;
            td_detalhe.innerHTML = arrayDetalhesProdutos [produto_id] ? arrayDetalhesProdutos [produto_id] : '';
            
            // insere a célula na linha
            hid_tr.appendChild ( td_detalhe );
            
            // insere as linhas no <thead>
            thead.appendChild ( tr );
            thead.appendChild ( hid_tr );
        }
        
        tabela_produtos.deleteTHead ();
        tabela_produtos.appendChild ( thead );
    }
    
    return false;
}


/*
 * função mostraTabelaCarregando ()
 *  mostra o 'carregando...' da tabela de descrição de produtos
 */
function mostraTabelaCarregando ()
{
    var tabela_produtos = document.getElementById( 'tabela_produtos' );
    
    // elementos vazios para colocar na tabela enquanto carrega
    var _load_thead = document.createElement ( 'thead' );
    var _load_tr    = document.createElement ( 'tr' );
    var _load_td    = document.createElement ( 'td' );
    _load_td.innerHTML = 'carregando...';
    _load_tr.appendChild ( _load_td );
    _load_thead.appendChild ( _load_tr );
    
    _load_tr.className = 'linha_tr01';
    _load_tr.setAttribute ( 'class', 'linha_tr01' );
    
    _load_td.className = 'td01';
    _load_td.setAttribute ( 'class', 'td01' );
    
    
    tabela_produtos.deleteTHead ();
    tabela_produtos.appendChild ( _load_thead );
    
    return false;
}


/*
 * função showAmpli ()
 *  mostra a foto ampliada
 * @param  foto = nome do arquivo da foto
 */
function showAmpli ( foto )
{
    //alert(foto);
    //var img = document.getElementById( 'foto_ampli' );
    document.getElementById( 'foto_ampli' ).src = 'produtos/ampli/' + foto;
    
    return false;
}


/*
 * função toggleHidTR ()
 *  alterna a visibilidade da <tr> de especificações
 * @param  tr = elemento <tr>
 */
function toggleHidTR ( tr )
{
    // mostra ou esconde a linha_tr
    if ( tr.style.display == 'none' )
    {
        tr.previousSibling.getElementsByTagName('img')[0].src   = 'img/seta_cima-over.gif';
        tr.previousSibling.getElementsByTagName('img')[0].alt   = ' - ';
        tr.previousSibling.getElementsByTagName('img')[0].title = ' - ';
        tr.style.display = '';
    }
    else
    {
        tr.previousSibling.getElementsByTagName('img')[0].src   = 'img/seta_baixo-over.gif';
        tr.previousSibling.getElementsByTagName('img')[0].alt   = ' + ';
        tr.previousSibling.getElementsByTagName('img')[0].title = ' + ';
        tr.style.display = 'none';
    }
    
    return false;
}



//+ Jonas Raoni Soares Silva
//@ http://jsfromhell.com/string/capitalize [v1.0]
String.prototype.capitalize = function(){ //v1.0
    return this.replace(/\w+/g, function(a){
        return a.charAt(0).toUpperCase() + a.substr(1).toLowerCase();
    });
};