Ajuda com JavaScript

21 respostas
F

Bom dia a todos,

Estou precisando da ajuda de vocês para traduzir um script, estou lendo bastante, estudando bastante mas gostaria de confirmações.

//Grade de produtos

var FC_posIDProduto=0;
var FC_posEstoque=2;
var FC_posIniDescritor=9;
var FC_QtdDescritores=2;  //Alterado de 7 para 2 pois esta loja utiliza apenas cor e tamanho
var SeparadorRGBCor="|";

function FC_fDistintos(aDados,iCampo,aDistintos){
//Retorna array de valores distintos não vazios
  for(var i=0;i<aDados.length;i++){
    var j=0,JaTem=false;
    while(j<aDistintos.length && !JaTem){
      JaTem=(aDistintos[j]==aDados[i][iCampo]);
      j++;
    }
    if(!JaTem)aDistintos[aDistintos.length]=aDados[i][iCampo];
  }
}

As vars fora da function podem ser usadas por qualquer método, certo?

Na função FC_fDistintos os parametros são aDados, iCampo e aDistintos, como eles são inicializados? Com 0? Pergunto porque o for vai continuar enquanto i for menor que aDados.length, correto?

Dentro do for tem o while e a pergunta é praticamente a mesma, com que valor o aDistintos começa?

A não ser que.. aDados, iCampo e aDistintos venham de algum outro lugar e estejam apenas sendo usados no método, não sei, to perdido :?

21 Respostas

drsmachado
fggs:
Bom dia a todos,

Estou precisando da ajuda de vocês para traduzir um script, estou lendo bastante, estudando bastante mas gostaria de confirmações.

//Grade de produtos

var FC_posIDProduto=0;
var FC_posEstoque=2;
var FC_posIniDescritor=9;
var FC_QtdDescritores=2;  //Alterado de 7 para 2 pois esta loja utiliza apenas cor e tamanho
var SeparadorRGBCor="|";

function FC_fDistintos(aDados,iCampo,aDistintos){
//Retorna array de valores distintos não vazios
  for(var i=0;i<aDados.length;i++){
    var j=0,JaTem=false;
    while(j<aDistintos.length && !JaTem){
      JaTem=(aDistintos[j]==aDados[i][iCampo]);
      j++;
    }
    if(!JaTem)aDistintos[aDistintos.length]=aDados[i][iCampo];
  }
}

As vars fora da function podem ser usadas por qualquer método, certo?
[color=red]Sim, podem[/color]

Na função FC_fDistintos os parametros são aDados, iCampo e aDistintos, como eles são inicializados? Com 0? Pergunto porque o for vai continuar enquanto i for menor que aDados.length, correto?
[color=red]Com os valores passados na chamada da função[/color]
Dentro do for tem o while e a pergunta é praticamente a mesma, com que valor o aDistintos começa?
[color=red]Mesma pergunta, mesma resposta da anterior[/color]
A não ser que.. aDados, iCampo e aDistintos venham de algum outro lugar e estejam apenas sendo usados no método, não sei, to perdido :?


[color=red]Você possuía o conhecimento, faltava confiar no mesmo[/color]

F

Valeu drsmachado!

Você disse: Com os valores passados na chamada da função, bem… então esses parametros estão setados em algum outro lugar, pois não vejo valores ali…

Tenho o webdeveloper e o Firebug, como pesquiso por esses parametros com eles?

Desde já muuuito agradecido!

drsmachado

Você precisa encontrar, no html. alguma chamada do tipo

onaaaaaaa="FC_fDistintos(x, y, z);"

Onde onaaaaaaa pode ser um onclick, onsubmit, onblur, onfocus, etc
Ali você encontra os valores a serem passados (pois eles devem ser referenciados.

F

Eu encontrei ele nesse outro método:

function FC_fInitProd(IDProduto){
//Inicializa arrays e exibe opções de IDProduto
  var FC_aProduto=new Array();
  for(var i=0;i<FC_aSubProd.length;i++)FC_aProduto=FC_aProduto.concat(FC_aSubProd[i]);
  eval("FC_aProduto_"+ IDProduto +"=FC_aProduto");

  var aDistintos=new Array();
  for(var i=0;i<FC_QtdDescritores;i++){
    var aTemp=new Array();
    FC_fDistintos(FC_aProduto,FC_posIniDescritor+i,aTemp);
    aDistintos=aDistintos.concat([aTemp]);
  }

É só um pedaço do código, mas parece criar um array aDistintos usando o método FC_fDistintos, isso explica alguma coisa ou devo procurar mais?

F

Matei parte da charada, porém ainda preciso de uma certa ajuda.

Os valores são conseguidos através desse evento onclick:

Porque a função FC_fRedefineOpcoes começa assim:

O value do this.value seria o que contiver no value= do <input…?

kiko_lp_St_jimmy

fggs:
Matei parte da charada, porém ainda preciso de uma certa ajuda.

Os valores são conseguidos através desse evento onclick:

Porque a função FC_fRedefineOpcoes começa assim:

O value do this.value seria o que contiver no value= do <input…?

O this.value é o valor do objeto onde esta o evento onclick, ou seja se o evento estiver num input sera o valor deste mesmo.

F

Muito obrigado kiko!

Agora a coisa tá começando a andar!

F

Seguinte gente, o código tá muito confuso para o meu conhecimento, se eu postar o código todo, vocês me ajudam a interpretar? É um pouco grande, se falarem que sim, posto sem problemas

F

Isso aqui que ta me embananando um pouco:

//Inicializa arrays e exibe opções de IDProduto
  var FC_aProduto=new Array();
  
  for(var i=0;i<FC_aSubProd.length;i++)
  FC_aProduto=FC_aProduto.concat(FC_aSubProd[i]);
  
  eval("FC_aProduto_"+ IDProduto +"=FC_aProduto");

  var aDistintos=new Array();
  
  for(var i=0;i<FC_QtdDescritores;i++)
  {
    var aTemp=new Array();
    FC_fDistintos(FC_aProduto,FC_posIniDescritor+i,aTemp);
    aDistintos=aDistintos.concat([aTemp]);
  }
  
  eval("FC_aDistintos_"+ IDProduto +"=aDistintos");

Array dentro de array?

FC_aSubProd é isso aqui:

FC_aSubProd[FC_aSubProd.length]=[[<IDProduto>,"<CodProd>",<Estoque>,"<PrecoOri>","<PrecoNum>","<PesoNum>","<ImagemProdPri>","<ImagemProdDet>","<ImagemProdAmp>",sCor,"<Adicional1Val>","<Adicional2Val>","<Adicional3Val>","<AdicionalD1Val>","<AdicionalD2Val>","<AdicionalD3Val>"]];

De acordo com o Firebug, FC_aDistintos_"+ IDProduto +" fica assim [["Cor"], ["SubProduto1", "SubProduto2"]], no meu caso eu preciso que fique [["SubProduto1", "SubProduto2"]].

drsmachado

Se você tem certeza que o primeiro elemento deve ser eliminado (ou conhece os valores dos campos que precisa) crie um novo array com os elementos que irá utilizar e passe ele como parâmetro para a função que deseja.

F

Obrigado pela sugestão, só falta agora eu descobrir os valores dos campos e os elementos…

Estou quase postando todo o código aqui, mas é extenso e confuso, o que você acha? Fica mais facil para você e o pessoal me ajudar?

Novamente muito obrigado!

F

Após extensa análise não consegui muita coisa, sei que o parametro aDistintos é um array com elementos separados, pelo menos tá assim [ ["Cor cadastrada no subproduto"], ["Subproduto1 Cadastrado no produto", "Subproduto2 Cadastrado no produto"]], eu até brinquei um pouco com o código, mas mesmo que eu crie um novo array, vou ter que editar mais coisa pra informar que os subprodutos agora estão na posição 0 do array, coisa que eu não to sabendo fazer...

Enfim, acho que to precisando de um pai de santo, banho de sal grosso ou sei la, 2 semanas olhando pra esse código e avancei pouco..

O que eu quero é bem simples, eliminar qualquer coisa relacionada a Cor e criar uma tabela com os Subprodutos selecionaveis por botão radio..

Vou subir o Pelourinho de joelho se eu conseguir, tá louco!

BarraTopo.htm

<script>
var IDLoja='<IDLoja>' //Obtém IDLoja para montar links
var IDLojaGrid='<IDLoja>' //Obtém IDLoja para Grid
var IDLojaNum='<IDLojaNum>' //Obtém IDLoja para montar links
var sCaminhoImagens='<BaseLoja>'+'images/'
var sCaminhoProds='<BaseLoja>'+'prod/'
var Juros=new Array(0,0,0,0,0,0); //Juros e parcelas utilizadas nas funções de parcelamento na capa da loja e lista/detalhes dos produtos
</script>

<script src="<Baseloja>htm/js/jquery132min.js" type="text/javascript"></script>
<script src="<Baseloja>htm/js/jqzoompack101.js" type="text/javascript"></script>
<link rel="stylesheet" href="<Baseloja>htm/css/jqzoom.css" type="text/css">
<script src=<BaseLoja>htm/LojaLib.js></script>
<script src=<BaseLoja>htm/SpryTabbedPanels.js></script>
<script src=<BaseLoja>htm/FC_Grid.js></script>

LojaSite.css

/* GRIDE DE PRODUTOS */
.NivelOn{background-color:#ffffff;height:1px;}
.NivelOff{background-color:#ffffff;height:1px;}
.estOpcaotrue{color:#333333;}
.estOpcaofalse{color:#AAAAAA;}
.BotComprarGrid{background:url('../images/BotGridSelecione.png') no-repeat;cursor:pointer;width: 253px;height: 70px;border: none;}
ul.lstColor{float:center;display:inline;position:relative;zoom:1;overflow:hidden;margin: 0 0 0 0;}
ul.lstColor li{float:left;display:inline;width:35px;margin-right:1px;padding:1px 1px 1px 1px;}
ul.lstColor li input{display:none} /* FF */
.FC_Opcao{cursor:pointer;font-size:18px;}

LojaLib.js

function MostraBotIndique(IDProduto){
  document.write("<center><span class=mnText><a href='javascript:MostraIndiqueCaptcha("+IDLojaNum+","+IDProduto+")' class=RodapeMenu><img src="+sCaminhoImagens+"r.gif border=0 vspace=2><br>Recomende<br>este produto</a></span></center>");
}

function MostraBotAval(IDProduto){
  document.write("<center><span class=mnText><a href='Opiniao.asp?IDLoja="+IDLoja+"&IDProduto="+IDProduto+"' class=RodapeMenu><img src="+sCaminhoImagens+"IcAvalie.png border=0 vspace=2><br>Avalie este<br>produto</a></span></center>");
}

function MostraPreco(PrecoProd,PrecoOri,IDProd){
if(PrecoProd==0 && PrecoOri==0){document.write("<span class=EstPrecoProdCapa><a href=ListaProdutos.asp?"+IDLoja+"&IDProduto="+IDProd+">DETALHES</a></span>");return void(0);}
if(PrecoProd!=PrecoOri){
 document.write("<span class=EstPrecoNormal>de:"+FormatPrice(PrecoOri,'R$')+"</span><br><span class=EstPrecoPromocional>por:"+FormatPrice(PrecoProd,'R$')+"</span>");
 }
 else{
 document.write("<span class=EstPrecoNormal>por: "+FormatPrice(PrecoProd,'R$')+"</span>");
 }
}

function MostraFreteGratis(iPeso){
  if(iPeso==0)document.write("<img src='"+sCaminhoImagens+"BtFreteGratis.gif'>");
}

function MostraMaxParcela(PrecoProd,MaxParcelas){
  var ComSem;

  if(PrecoProd>=300)MaxParcelas=6;
  else if(PrecoProd>=250)MaxParcelas=5;
  else if(PrecoProd>=200)MaxParcelas=4;
  else if(PrecoProd>=150)MaxParcelas=3;
  else if(PrecoProd>=100)MaxParcelas=2;
  else if(PrecoProd>=1)MaxParcelas=1;

  if(PrecoProd==0||MaxParcelas==1||Juros.length==0)return;
  if(MaxParcelas==0||MaxParcelas>Juros.length)MaxParcelas=Juros.length;
  if(Juros[MaxParcelas-1]>0)ComSem=""; else ComSem="<font color=#990000> sem juros</font>";
  document.write("ou <b>"+MaxParcelas+"x</b>"+ComSem+" de <b>"+FormatPrecoReais(CalculaParcelaJurosCompostos(PrecoProd,MaxParcelas))+"</b>");
}

function MostraMaxParcelaJS(PrecoProd,MaxParcelas){
  var ComSem;

  if(PrecoProd>=300)MaxParcelas=6;
  else if(PrecoProd>=250)MaxParcelas=5;
  else if(PrecoProd>=200)MaxParcelas=4;
  else if(PrecoProd>=150)MaxParcelas=3;
  else if(PrecoProd>=100)MaxParcelas=2;
  else if(PrecoProd>=1)MaxParcelas=1;

  if(PrecoProd==0||MaxParcelas==1||Juros.length==0)return "";
  if(MaxParcelas==0||MaxParcelas>Juros.length)MaxParcelas=Juros.length;
  if(Juros[MaxParcelas-1]>0)ComSem=""; else ComSem="<font color=#990000> sem juros</font>";
  return "<span class=EstParc>ou <b>"+MaxParcelas+"x</b>"+ComSem+" de <b>"+FormatPrecoReais(CalculaParcelaJurosCompostos(PrecoProd,MaxParcelas))+"</b></span>";}

FC_Grid.js

Variaveis:

var FC_posIDProduto=0;
var FC_posEstoque=2;
var FC_posIniDescritor=9;
var FC_QtdDescritores=2;  //Alterado de 7 para 2 pois esta loja utiliza apenas cor e tamanho
var SeparadorRGBCor="|";

Funções

function FC_fDistintos(aDados,iCampo,aDistintos){
//Retorna array de valores distintos não vazios
  for(var i=0;i<aDados.length;i++){
    var j=0,JaTem=false;
    while(j<aDistintos.length && !JaTem){
      JaTem=(aDistintos[j]==aDados[i][iCampo]);
      j++;
    }
    if(!JaTem)aDistintos[aDistintos.length]=aDados[i][iCampo];
  }
}
function FC_fExisteDescritor(aDados,iCampo,ValorCampo,iCampoDisp,aValoresDisp){
//Retorna array de descritores disponíveis do descritor informado
  for(var i=0;i<aDados.length;i++){
    if(aDados[i][iCampo]==ValorCampo)aValoresDisp[aValoresDisp.length]=aDados[i][iCampoDisp];
  }
}
function FC_fSubProdSelec(IDProduto,aDados,aDistintos){
//Informa o ID do sub-produto com as características selecionadas nas opções e o seu estoque
//Retorna Existe=false se não encontrar

  var aSelecionados=new Array();
  FC_fSelecionados(IDProduto,aDistintos,FC_QtdDescritores,aSelecionados);

  var i=0,j=0,AcheiSubProd=false;
  while(!AcheiSubProd && i<aDados.length){
    j=ObtemNivelSeguinte(aDistintos,-1);
    var bComparador=true;
    while(bComparador && j!=-1){
      bComparador=(bComparador && aDados[i][j+FC_posIniDescritor]==aSelecionados[j]);
      if(bComparador){j=ObtemNivelSeguinte(aDistintos,j);}
    }
    if(bComparador)AcheiSubProd=true;
    if(!AcheiSubProd)i++;
  }
  if(AcheiSubProd){
    this.IDSubProduto=aDados[i][FC_posIDProduto];
    this.iEstoque=aDados[i][FC_posEstoque];
    this.Cor=aDados[i][FC_posIniDescritor];
    this.Adicional1=aDados[i][FC_posIniDescritor+1];
    this.Adicional2=aDados[i][FC_posIniDescritor+2];
    this.Adicional3=aDados[i][FC_posIniDescritor+3];
    this.AdicionalD1=aDados[i][FC_posIniDescritor+4];
    this.AdicionalD2=aDados[i][FC_posIniDescritor+5];
    this.AdicionalD3=aDados[i][FC_posIniDescritor+6];
    this.PrecoOri=aDados[i][3];//Posição do Preço original do produto no array
    this.PrecoNum=aDados[i][4];//Posição do Preço num do produto no array
  }
  this.Existe=AcheiSubProd;
}
function FC_fRedefineOpcoes(IDProduto,aDados,aDistintos,iCampo,ValorCampo){

  //Marca o selecionado e desmarca os demais
  for(var j=0;j<aDistintos[iCampo].length;j++){
    FC_Option=document.getElementById("FC_liOpcao_"+ iCampo +"_"+ j +"_"+ IDProduto);
    if(aDistintos[iCampo][j]!=ValorCampo){
      FC_Option.style.borderWidth='2px';
      FC_Option.style.borderStyle='solid';
      FC_Option.style.borderColor='white';
    }
    else{
      FC_Option.style.borderWidth='2px';
      FC_Option.style.borderStyle='solid';
      FC_Option.style.borderColor='#888888';
    }
  }

  //Se for cor, altera a foto do produto caso tenha
  if(iCampo==0 && aDados.length>1){
    var i=0,j=0,AcheiFotoProd=false;
    while(!AcheiFotoProd && i<aDados.length){
        AcheiFotoProd=(aDados[i][FC_posIniDescritor]==ValorCampo);
        i++;
      }
    if(bDet){var sSrcFoto=aDados[i-1][7];var sSrcFotoA=aDados[i-1][8]} else{var sSrcFoto=aDados[i-1][6]} 
    if(sSrcFoto!='')document.getElementById("Foto"+ IDProduto).src=sSrcFoto;
    if(sSrcFotoA!='')document.getElementById("hrefFoto"+ IDProduto).href=sSrcFotoA; //Altera a foto do ZOOM de acordo com o produto
  }


    //Mostra cor e tamanho
   if(iCampo==0){
    var aNomeRGB=ValorCampo.split(SeparadorRGBCor);
    var sNomeCor=aNomeRGB[0];
    var sRGBCor=aNomeRGB[1];
    document.getElementById('CorProduto').innerHTML="<b>Cor:</b> "+sNomeCor+"&nbsp; &nbsp; ";
    //document.getElementById('RGBCorProduto').style.backgroundColor='#'+sRGBCor;
    document.getElementById('RGBCorProduto').style.width='20px';
    document.getElementById('RGBCorProduto').innerHTML="<span style='width:15px;background-color:#"+sRGBCor+"'>&nbsp;&nbsp;</span>";

    document.getElementById('TamanhoProduto').innerHTML='';
   }
   else if(iCampo==1){
    document.getElementById('TamanhoProduto').innerHTML="<b>Tamanho:</b> "+ValorCampo;
   }


  var NivelSeguinte=ObtemNivelSeguinte(aDistintos,iCampo);
  if(NivelSeguinte!=-1){  //habilita um nível abaixo
    document.getElementById("FC_idNivel_"+ NivelSeguinte +"_"+ IDProduto).className="NivelOn";
    for(var j=0;j<aDistintos[NivelSeguinte].length;j++){  //habilita opções do nível abaixo
      if(aDistintos[NivelSeguinte][j]!=''){
        var bExisteOpcao=FC_fExisteOpcao(IDProduto,aDados,aDistintos,NivelSeguinte,j);

        FC_Option=document.getElementById("FC_liOpcao_"+ NivelSeguinte +"_"+ j +"_"+ IDProduto);	//pinta o fundo das opções indisponíveis
        if(bExisteOpcao){FC_Option.style.backgroundColor='#CCCCCC';}
        else{FC_Option.style.backgroundColor='white';}

        document.getElementById("FC_oOpcao_"+ NivelSeguinte +"_"+ j +"_"+ IDProduto).disabled=bExisteOpcao;
        document.getElementById("FC_idOpcao_"+ NivelSeguinte +"_"+ j +"_"+ IDProduto).className='estOpcao'+!bExisteOpcao;
        document.getElementById("FC_oOpcao_"+ NivelSeguinte +"_"+ j +"_"+ IDProduto).checked=false;

        FC_Option=document.getElementById("FC_liOpcao_"+ NivelSeguinte +"_"+ j +"_"+ IDProduto);	//desmarca opção selecionada 
        FC_Option.style.borderWidth='2px';
        FC_Option.style.borderStyle='solid';
        FC_Option.style.borderColor='white';

      }
    }   
    for(var i=NivelSeguinte+1;i<FC_QtdDescritores;i++){  //desabilita níveis inferiores
      document.getElementById("FC_idNivel_"+ i +"_"+ IDProduto).className="NivelOff";
      for(var j=0;j<aDistintos[i].length;j++){  //desabilita opções dos níveis inferiores
        if(aDistintos[i][j]!=''){
          document.getElementById("FC_oOpcao_"+ i +"_"+ j +"_"+ IDProduto).disabled=true;
          document.getElementById("FC_idOpcao_"+ i +"_"+ j +"_"+ IDProduto).className='estOpcaotrue';
          document.getElementById("FC_oOpcao_"+ i +"_"+ j +"_"+ IDProduto).checked=false;
        }
      }   
    }
  }
  var oBotao=document.getElementById("FC_oBotao_"+ IDProduto);
  if(NivelSeguinte==-1){  //verifica o ID e o estoque do produto
    var oSubProd=new FC_fSubProdSelec(IDProduto,aDados,aDistintos);
    if(oSubProd.Existe){

       bSubProdSemPreco=false;
      //Altera o preço do produto de acordo com o preço do sub-produto
      if(oSubProd.PrecoNum==0 && oSubProd.PrecoOri==0){
        bSubProdSemPreco=true;
        document.getElementById('PrecoProdPrinc').innerHTML="<span class=EstPrecoProdCapa>sem preço neste item</span>";
        oBotao.style.backgroundImage="url('"+sCaminhoImagens+"BotGridConsultenos.png')";
        oBotao.onclick=new Function('FC_ConsultenosSubProd("'+ oSubProd.IDSubProduto +'","'+oSubProd.Cor+'","'+oSubProd.Adicional1+'","'+oSubProd.Adicional2+'","'+oSubProd.Adicional3+'","'+oSubProd.AdicionalD1+'","'+oSubProd.AdicionalD2+'","'+oSubProd.AdicionalD3+'");');
      }

      if(!bSubProdSemPreco){
        var ParcelamentoJS=MostraMaxParcelaJS(oSubProd.PrecoNum,0);
        if(oSubProd.PrecoNum!=oSubProd.PrecoOri){
         document.getElementById('PrecoProdPrinc').innerHTML="de <strike>"+FormatPrice(oSubProd.PrecoOri,'R$')+"</strike> por <b>"+FormatPrice(oSubProd.PrecoNum,'R$')+"</b> "+ParcelamentoJS;
         }
         else{
         document.getElementById('PrecoProdPrinc').innerHTML="<b>"+FormatPrice(oSubProd.PrecoNum,'R$')+"</b> "+ParcelamentoJS;
         }

        if(oSubProd.iEstoque>0){
          //oBotao.value="Comprar";
          oBotao.style.backgroundImage="url('"+sCaminhoImagens+"BotGridComprar.png')";
          oBotao.onclick=new Function('FC_CompraSubProd("'+ oSubProd.IDSubProduto +'","'+oSubProd.Cor+'","'+oSubProd.Adicional1+'","'+oSubProd.Adicional2+'","'+oSubProd.Adicional3+'","'+oSubProd.AdicionalD1+'","'+oSubProd.AdicionalD2+'","'+oSubProd.AdicionalD3+'");');	//Função para comprar o produto
        }
        else{
          //oBotao.value="Produto esgotado. Avise-me";
          oBotao.style.backgroundImage="url('"+sCaminhoImagens+"BotGridEsgotado.png')";
          oBotao.onclick=new Function('MostraDispCaptcha('+IDLojaNum+',"'+oSubProd.IDSubProduto+'");');	//Função para aviso de disponibilidade
        }

      }
      oBotao.disabled=false;
      
    }
    else{
      oBotao.value="n/a";  //não encontrou
      oBotao.disabled=true;
      oBotao.onclick=null;
    }
  }
  else{

    //Volta o preço do produto Pai
    var ParcelamentoJS=MostraMaxParcelaJS(PrecoProdPaiNum,0);
    if(PrecoProdPaiNum!=PrecoProdPaiOri){
     document.getElementById('PrecoProdPrinc').innerHTML="de <strike>"+FormatPrice(PrecoProdPaiOri,'R$')+"</strike> por <b>"+FormatPrice(PrecoProdPaiNum,'R$')+"</b> "+ParcelamentoJS;
     }
     else{
     document.getElementById('PrecoProdPrinc').innerHTML="<b>"+FormatPrice(PrecoProdPaiNum,'R$')+"</b> "+ParcelamentoJS;
     }

    //oBotao.value="Selecione";  //limpa botão
    oBotao.style.backgroundImage="url('"+sCaminhoImagens+"BotGridSelecione.png')";
    oBotao.disabled=true;
    oBotao.onclick=null;
  }
}
function FC_CompraSubProd(IDSubProd,Cor,Adicional1,Adicional2,Adicional3,AdicionalD1,AdicionalD2,AdicionalD3){
  //alert(IDSubProd+'-'+Cor+'-'+Adicional1+'-'+Adicional2+'-'+Adicional3+'-'+AdicionalD1+'-'+AdicionalD2+'-'+AdicionalD3);
  var aNomeRGB=Cor.split(SeparadorRGBCor);
  var sNomeCor=aNomeRGB[0];
  var sURLCompra='AddProduto.asp?IDLoja='+IDLojaGrid+'&IDProduto='+ IDSubProd;
  if(sNomeCor!='')sURLCompra+='&Cor='+ sNomeCor.replace(/\+/g,'%2B');
  if(Adicional1!='')sURLCompra+='&Adicional1='+ Adicional1;
  if(Adicional2!='')sURLCompra+='&Adicional2='+ Adicional2;
  if(Adicional3!='')sURLCompra+='&Adicional3='+ Adicional3;
  if(AdicionalD1!='')sURLCompra+='&AdicionalD1='+ AdicionalD1;
  if(AdicionalD2!='')sURLCompra+='&AdicionalD2='+ AdicionalD2;
  if(AdicionalD3!='')sURLCompra+='&AdicionalD3='+ AdicionalD3;
  //alert(sURLCompra);
  top.location.href=sURLCompra;
}
function FC_ConsultenosSubProd(IDSubProd,Cor,Adicional1,Adicional2,Adicional3,AdicionalD1,AdicionalD2,AdicionalD3){
  //alert(IDSubProd+'-'+Cor+'-'+Adicional1+'-'+Adicional2+'-'+Adicional3+'-'+AdicionalD1+'-'+AdicionalD2+'-'+AdicionalD3);
  var aNomeRGB=Cor.split(SeparadorRGBCor);
  var sNomeCor=aNomeRGB[0];
  var sURLConsultenos='FaleConosco.asp?IDLoja='+IDLojaGrid+'&Assunto=Consulta%20sobre%20produto ('+ IDSubProd +') ';
  if(sNomeCor!='')sURLConsultenos+=' Cor='+ sNomeCor.replace(/\+/g,'%2B');
  if(Adicional1!='')sURLConsultenos+=' '+ Adicional1;
  if(Adicional2!='')sURLConsultenos+=' '+ Adicional2;
  if(Adicional3!='')sURLConsultenos+=' '+ Adicional3;
  if(AdicionalD1!='')sURLConsultenos+=' '+ AdicionalD1;
  if(AdicionalD2!='')sURLConsultenos+=' '+ AdicionalD2;
  if(AdicionalD3!='')sURLConsultenos+=' '+ AdicionalD3;
  //alert(sURLConsultenos);
  top.location.href=sURLConsultenos;
}
function FC_fExisteOpcao(IDProduto,aDados,aDistintos,iNivel,iOpcao){
//retorna false se existe a opção combinada com as opções  selecionadas
  var aSelecionados=new Array();
  FC_fSelecionados(IDProduto,aDistintos,iNivel,aSelecionados);
  aSelecionados[aSelecionados.length]=aDistintos[iNivel][iOpcao];

  var i=0,j=0,AcheiSubProd=false;
  while(!AcheiSubProd && i<aDados.length){
    j=ObtemNivelSeguinte(aDistintos,-1);
    var bComparador=true;
    while(bComparador && j!=-1 && j<aSelecionados.length){
      bComparador=(bComparador && aDados[i][j+FC_posIniDescritor]==aSelecionados[j]);
//alert(aDados[i][j+FC_posIniDescritor]+"="+aSelecionados[j]);
      if(bComparador)j=ObtemNivelSeguinte(aDistintos,j);
    }
    if(bComparador)AcheiSubProd=true;
    if(!AcheiSubProd)i++;
  }
  return !AcheiSubProd;
}
function FC_fSelecionados(IDProduto,aDistintos,iNivel,aSelecionados){
//Retorna array de opções selecionadas até o nível iNivel
  for(var i=0;i<iNivel;i++){
    if(!FC_fIsVazio(aDistintos[i])){
      for(var j=0;j<aDistintos[i].length;j++){
        if(aDistintos[i][j]!=''){
          if(document.getElementById("FC_oOpcao_"+ i +"_"+ j +"_"+ IDProduto).checked){
            aSelecionados[aSelecionados.length]=aDistintos[i][j];
          }
        }
      }
    }
    else {
      aSelecionados[aSelecionados.length]='';
    }
  }
}
function ObtemNivelSeguinte(aDistintos,iCampo){
//retorna índice de array do próximo nível com opções não vazias
//retorna -1 se não existir nível seguinte
  var i=iCampo+1,IsBranco=true;
  while(i<aDistintos.length && IsBranco){
    IsBranco=(FC_fIsVazio(aDistintos[i]));
    if(IsBranco)i++;
  }
  if(IsBranco)return -1;
  else return i;
}
function FC_fIsVazio(aValores){
//retorna true se array aValores  contém string vazia
  var i=0,IsVazio=true;
  while(IsVazio && i<aValores.length){
    IsVazio=(aValores[i]=='');
    if(IsVazio)i++;
  }
  return IsVazio;
}

A função abaixo é a função chamada no EstiloProduto.htm, caso o produto tenha subprodutos, é aqui que começa tudo...

function FC_fInitProd(IDProduto){
//Inicializa arrays e exibe opções de IDProduto
  var FC_aProduto=new Array();
  for(var i=0;i<FC_aSubProd.length;i++)FC_aProduto=FC_aProduto.concat(FC_aSubProd[i]);
  eval("FC_aProduto_"+ IDProduto +"=FC_aProduto");

  var aDistintos=new Array();
  for(var i=0;i<FC_QtdDescritores;i++){
    var aTemp=new Array();
    FC_fDistintos(FC_aProduto,FC_posIniDescritor+i,aTemp);
    aDistintos=aDistintos.concat([aTemp]);
  }
  eval("FC_aDistintos_"+ IDProduto +"=aDistintos");
  
  var NivelSeguinte=ObtemNivelSeguinte(aDistintos,-1);  //procura pelo primeiro nível com opções
  if(NivelSeguinte==-1)return void(0); //alert('Sem opções nos sub-produtos de '+IDProduto);
  else document.write("<form name=FC_oForm_"+ IDProduto +">");

  for(var i=0;i<FC_QtdDescritores;i++){
    if(i==NivelSeguinte){FC_sClass="NivelOn";var sDisabled="";}
    else{FC_sClass="NivelOff";var sDisabled=" disabled";}
    document.write("<table><tr><td><div id=FC_idNivel_"+ i +"_"+ IDProduto +" class="+ FC_sClass +"><ul class=lstColor>");

    if(aDistintos[i].length>0){
      for(var j=0;j<aDistintos[i].length;j++){
        //alert(aDistintos[i][j]);
        if(i==0){  //separa nome e RGB da cor
          var aNomeRGB=aDistintos[i][j].split(SeparadorRGBCor);
          //sValor="<span style=background-color:#"+ aNomeRGB[1] +">&nbsp;&nbsp;&nbsp;</span>&nbsp;&nbsp;<span>"+ aNomeRGB[0] +"</span>";
          sValor="<span style=width:27px;background-color:#"+ aNomeRGB[1] +">&nbsp;&nbsp;&nbsp;&nbsp;</span>";
          //sValor="<span style='width:27px;background:url("+sCaminhoProds+"cores/"+aNomeRGB[0]+".gif) no-repeat;'>&nbsp;&nbsp;&nbsp;&nbsp;</span>"; //EXEMPLO DE IMAGEM PARA CADA COR
          sValor=sValor.replace("+","_");
        }
        else{sValor=aDistintos[i][j];}
        if(aDistintos[i][j]!=''){
          document.write("<span id=FC_idOpcao_"+ i +"_"+ j +"_"+ IDProduto +">");
          document.write("<li id=FC_liOpcao_"+ i +"_"+ j +"_"+ IDProduto +" style='border-style:solid;border-width:2px;border-color:white;text-align:center;'><input type=radio name=FC_oOpcao_"+ i +"_"+ IDProduto +" id=FC_oOpcao_"+ i +"_"+ j +"_"+ IDProduto +" value="+aDistintos[i][j]+" onclick='FC_fRedefineOpcoes("+ IDProduto +",FC_aProduto_"+ IDProduto +",FC_aDistintos_"+ IDProduto +","+i+",this.value);'"+ sDisabled +"><label class=FC_Opcao for=FC_oOpcao_"+ i +"_"+ j +"_"+ IDProduto +">"+ sValor +"</label>");
          setTimeout("document.getElementById('FC_oOpcao_"+ i +"_"+ j +"_"+ IDProduto+"').checked=false",1);  //força desmarcar radio quando recarrega a página no IE
          if(sDisabled!="")document.getElementById("FC_oOpcao_"+ i +"_"+ j +"_"+ IDProduto).disabled=true;
          document.write("</li></span>");
        }
      }
      //if(!FC_fIsVazio(aDistintos[i]))document.write("<hr>");
    }
    document.write("</ul></div></td></tr></table>");
  }
  document.write("<br><hr><table cellspacing=0 cellpadding=0><tr height=20><td id=RGBCorProduto></td><td id=CorProduto></td><td id=TamanhoProduto></td></tr></table><br><input type=button class=BotComprarGrid name=FC_oBotao_"+ IDProduto +" id=FC_oBotao_"+ IDProduto +" onClick='' value='' disabled>");
  if(NivelSeguinte!=-1)document.write("</form>");
}

EstiloProduto.htm

<ProdDet>
<script>
var FC_aSubProd=new Array();
var bDet=true;
var bTemSubProds=false;
var PrecoProdPaiOri=<PrecoOri>
var PrecoProdPaiNum=<PrecoNum>
</script>

<script>
<Sub>
bTemSubProds=true;
var sCor="<CorVal>"
if(sCor!="")sCor=sCor+"|<CorRGB>"
FC_aSubProd[FC_aSubProd.length]=[[<IDProduto>,"<CodProd>",<Estoque>,"<PrecoOri>","<PrecoNum>","<PesoNum>","<ImagemProdPri>","<ImagemProdDet>","<ImagemProdAmp>",sCor,"<Adicional1Val>","<Adicional2Val>","<Adicional3Val>","<AdicionalD1Val>","<AdicionalD2Val>","<AdicionalD3Val>"]];
</Sub>
</script>

<table width=100% border=0>
  <tr>
    <td width=400 align=center>
      <a href="<ImagemProdAmp>" id=hrefFoto<IDProduto> class="jqzoom" style=""  title="<NomeProd>"><img src="<ImagemProdDet>" border="0" id=Foto<IDProduto>></a><br>
      <table width=50%><tr><td><script>MostraBotIndique(<IDProduto>);</script></td><td><script>MostraBotAval(<IDProduto>);</script></td></tr></table> 
    </td>
    <td valign=top><br>
      <table cellpadding=5>
        <tr><td class="EstNomeProdDet"><NomeProd></td></tr>
        <tr><td><table><tr><td><OpiniaoMedia></td><td>&nbsp; [ <a href="Opiniao.asp?IDLoja=<IDLoja>&IDProduto=<IDProduto>">Avalie</a> este produto ]</td></tr></table></td></tr>
        <tr><td class=EstPrecoProd>Preço: <span id=PrecoProdPrinc><PrecoSimples> <span class=EstParc><script>MostraMaxParcela(<PrecoNum>,<MaxParcelasProdNum>);</script></span></span></td></tr>
        <tr><td>



<script>
if(bTemSubProds)
  {  //Com Sub-produtos
  document.write("<table bgcolor=gray><tr><td bgcolor=#f7f7f7 align=center><br>");
  FC_fInitProd(<IDProduto>);
  document.write("</td></tr></table>");
  }
else
  {  //Produto sem sub-produtos
  if(<Estoque>>0)
    {
    document.write("<a href='AddProduto.asp?IDLoja=<IDLoja>&IDProduto=<IDProduto>'><img src='<BaseLoja>images/BotGridComprar.png' border=0></a>");
    }
    else
    {
    document.write("<a href='#E' onclick=MostraDispCaptcha('"+IDLojaNum+"',<IDProduto>);><img src='<BaseLoja>images/BotGridEsgotado.png' border=0></a>");
    }
  }
</script>

        </td></tr>
      </table>
    </td>
  </tr>
</table><IndicaProd>
<br><br><br>

    <!-- INICIO TABELA INFO -->
        <div class="TabbedPanels" id="tp1">
          <ul class="TabbedPanelsTabGroup">
            <li class="TabbedPanelsTab" tabindex="0">Descrição</li>
            <li class="TabbedPanelsTab" tabindex="0">Avaliações do produto</li>
            <li class="TabbedPanelsTab" tabindex="0">Compre também</li>
          </ul>
          <div class="TabbedPanelsContentGroup">
            <div class="TabbedPanelsContent"><table cellpadding=10><tr><td><Descricao><DescrHTM></td></tr></table></div>
            <div class="TabbedPanelsContent"><Comments></div>
            <div class="TabbedPanelsContent"><CrossSelling></div>
          </div>
        </div>
        <script language="JavaScript" type="text/javascript">var tp1 = new Spry.Widget.TabbedPanels("tp1");</script>
    <!-- FIM TABELA INFO -->
<br><br><br>
</ProdDet>
F

Continuo na minha empreitada..

function FC_fExisteDescritor(aDados,iCampo,ValorCampo,iCampoDisp,aValoresDisp)
{
//Retorna array de descritores disponíveis do descritor informado

  for(var i=0;i<aDados.length;i++)
  {
    if (aDados[i][iCampo]==ValorCampo) aValoresDisp[aValoresDisp.length]=aDados[i][iCampoDisp];
  }
}

O método acima não é "usado" em nenhum lugar do código, parece "solto", os parametros iCampoDisp e aValoresDisp só estão aqui, logo.. não consigo entender para que serve esse método..

Se aDados[i][iCampo] for igual a ValorCampo, o tamanho do array aValoresDisp vai ser aDados[i][iCampoDisp], seria mais ou menos isso?

drsmachado
fggs:
Continuo na minha empreitada..
function FC_fExisteDescritor(aDados,iCampo,ValorCampo,iCampoDisp,aValoresDisp)
{
//Retorna array de descritores disponíveis do descritor informado

  for(var i=0;i<aDados.length;i++)
  {
    if (aDados[i][iCampo]==ValorCampo) aValoresDisp[aValoresDisp.length]=aDados[i][iCampoDisp];
  }
}

O método acima não é "usado" em nenhum lugar do código, parece "solto", os parametros iCampoDisp e aValoresDisp só estão aqui, logo.. não consigo entender para que serve esse método..

Se aDados[i][iCampo] for igual a ValorCampo, o tamanho do array aValoresDisp vai ser aDados[i][iCampoDisp], seria mais ou menos isso?

Não.
Significa que o último elemento do array aValoresDisp vai receber aDados[i][iCampoDisp].

F

Mais uma vez muito obrigado pela resposta, como você pode ver, estou me esforçando pra desvendar isso sozinho.

Pergunto: Qual é a lógica de criar o array aValoresDisp se ele não aparece em nenhum outro lugar no código e nem o método FC_fExisteDescritores?

drsmachado

Isso eu não tenho como te responder.
Só quem desenvolveu o script pode te dar uma luz.

F

Tava com medo dessa resposta :frowning: hehehe

Você acha que é possivel rodar esse código no Eclipse IDE para JavaScript e enxergar passo a passo o que acontece?

F

Eu posso usar o mesmo método FC_fRedefineOpcoes utilizado no evento onclick, para deixar uma opção pré-selecionada quando inicializar o produto?

Faz sentido?

Fico todo perdido porque esse método chama outros métodos, que chamam outros métodos e por ai vai…

Assim que eu terminar toda minha tarefa posto o código aqui todo explicado, já consegui bastaaante coisa!

F

Poxa vida, a parte mais “fácil” eu não estou conseguindo decifrar, já tentei colocar checked dentro do input, ja tentei usar o método FC_fRedefineOpcoes, o método FC_fSelecionados entre outras tentativas frustradas.

Se ficar mais fácil para dar sugestões posto os métodos novamente, mas se não for problema, todos eles estão na página anterior.

O método chamado quando se entra num produto é o FC_fInitProd, foi lá que eu tentei de tudo e nada!

F

Uma pergunta, preciso usar document.write para executar um método dentro do FC_fInitProd?

Desde já, muito obrigado!

F

Provavelmente vou tomar bronca de algum usuário ou moderador, mas estou muito perto de finalizar a primeira fase do meu projeto.

Agora gostaria da ajuda dos caros colegas para alinhar verticalmente o texto com o botão radio, pelo que pesquisei, usa-se vertical-align e line-height ou CSS.

Eis a linha:

A linha original tinha esse label no lugar do “teste”:

Alguma sugestão?

Desde já, muito obrigado!

PS: Se eu não estou sabendo pedir ajuda ou estou sendo chato/inconveniente por favor me digam o jeito certo, estou aqui para aprender, inclusive, a como se comportar num fórum de programação, isso tudo é muito novo para mim

Criado 28 de setembro de 2011
Ultima resposta 5 de out. de 2011
Respostas 21
Participantes 3