Newsgroup: it.comp.lang.javascript
Titolo: negozio, help me

Ciao a tutti,
sto cercando di realizzare un piccolo applicativo per calcolare preventivi
on line con java script poiché mi risulta
che sia l'unico modo per farlo quando non si hanno santi protettori sul lato
server.
Purtroppo però non mi riesce di far funzionare questo applicativo.
Ora io allego il codice, c'è qualcuno che può dirmi perché non funziona??
Ometto tutta o quasi la parte in html
<html>
<head>
<script language="JavaScript">
function MakeArray(size) {
   this.length = size;
   for(i = 1; i <= size; i++)
      this[i] = null;
   return this;
}
function Part(strName, iCost) {
 
this.name
   = strName;
   this.cost   = iCost;
}
sacchiList       = new MakeArray(3);
sacchiList[1]    = new Part("Quantita' 1", 300.000);
sacchiList[2]    = new Part("Quantita' 2", 600.000);
sacchiList[3]    = new Part("Quantita' 3", 900.000);
bagsList       = new MakeArray(3);
bagsList[1]    = new Part("Quantity 1", 154,94);
bagsList[2]    = new Part("Quantity 2", 309,87);
bagsList[3]    = new Part("Quantity 3", 464,81);
scatoleList       = new MakeArray(3);
scatoleList[1]    = new Part("Quantita' 1", 150.000);
scatoleList[2]    = new Part("Quantita' 2", 300.000);
scatoleList[3]    = new Part("Quantita' 3", 450.000);
boxesList       = new MakeArray(3);
boxesList[1]    = new Part("Quantity 1", 77.47);
boxesList[2]    = new Part("Quantity 2", 154.94);
boxesList[3]    = new Part("Quantity 3", 232.41);
totalCost      = 0;
strDesc        = "";
function createSelect(strName, objList) {
  var tStr = "<SELECT NAME=\"" + strName + "\">"
           + "<OPTION SELECTED>- Quantity -";
  for(var i=1; i<=objList.length; i++)
    tStr += "<OPTION>" + objList[i].name;
  tStr += "</SELECT>";
  return tStr;
}
totalCost      = 0;
strDesc        = "";
function calculate() {
   totalCost   = 0;
   strDesc     = "";
   if(!calcSacchi())
      return false;
   if(!calcBags())
      return false;
   if(!calcScatole())
      return false;
   if(!calcBoxes())
      return false;
   alert("\nAvete selezionato i seguenti prodotti - You have selected the
following products" +
         "configuration:\n\n" + strDesc +
         "\n with a total cost of Lit" +
         totalCost + ".");
   return true;
}
function calcSacchi() {
  var which = 0, j = -1;
  for(var i=0; i<document.order1.sacchi.length; i++) {
    if(document.order1.sacchi[i].checked) {
      j = i;
      break;
    }
  for(var i=1; i<=sacchiList.length; i++) {
    if(document.order1.sacchi[j].value ==
       sacchiList[i].name) {
      which = i;
    }
  }
  totalCost += eval(sacchiList[which].cost);
  strDesc   += " - " + sacchiList[which].name + " Sacchi\n";
  return true;
}
function calcBags() {
  var which = 0, j = -1;
  for(var i=0; i<document.order1.bags.length; i++) {
    if(document.order1.bags[i].checked) {
      j = i;
      break;
    }
  for(var i=1; i<=bagsList.length; i++) {
    if(document.order1.bags[j].value ==
       bagsList[i].name) {
      which = i;
    }
  }
  totalCost += eval(bagsList[which].cost);
  strDesc   += " - " +bagsList[which].name + " Bags\n";
  return true;
}
function calcScatole() {
  var which = 0, j = -1;
  for(var i=0; i<document.order1.scatole.length; i++) {
    if(document.order1.scatole[i].checked) {
      j = i;
      break;
    }
  for(var i=1; i<=bagsList.length; i++) {
    if(document.order1.scatole[j].value ==
       bagsList[i].name) {
      which = i;
    }
  }
  totalCost += eval(scatoleList[which].cost);
  strDesc   += " - " +scatoleList[which].name + " Scatole\n";
  return true;
}
function calcBoxes() {
  var which = 0, j = -1;
  for(var i=0; i<document.order1.boxes.length; i++) {
    if(document.order1.boxes[i].checked) {
      j = i;
      break;
    }
  for(var i=1; i<=boxesList.length; i++) {
    if(document.order1.boxes[j].value ==
       boxesList[i].name) {
      which = i;
    }
  }
  totalCost += eval(boxesList[which].cost);
  strDesc   += " - " +boxesList[which].name + " Boxes\n";
  return true;
}
</script>
</head>
<body>
<form name="order1" method=POST>
   Descrizione - Description
                  <script language="JavaScript">
      <!-- begin hide
        document.write(createSelect("sacchi", sacchiList)
                       + "<BR>");
      // end hide -->
</script>
                  Sacchi da Kg 20 di bottoni in varie misure, colori,
modelli,
                  materiali (metallo, poliestere, madreperla, golalite)
                  Lit 300.000 cadauno
                  <script language="JavaScript">
      <!-- begin hide
        document.write(createSelect("bags", bagsList)
                       + "<BR>");
      // end hide -->
</script>
                  Cloth Bags of 20 Kilos each full of buttons in various
sizes,
                  colours, models and materials (metal, polyestere, shell,
galalite)
                  euro; 154,94
 <h1>Descrizione - <i>Description</i> </h1>
                <h6>
                  <script language="JavaScript">
      <!-- begin hide
        document.write(createSelect("scatole", scatoleList)
                       + "<BR>");
      // end hide -->
</script>
                  Scatole con bottoni assortite in colore e misure in
materiali
                  di polyestere, metallo, madreperla.<br>
                  Lit 150.000 cadauna
                  <script language="JavaScript">
      <!-- begin hide
        document.write(createSelect("boxes", boxesList)
                       + "<BR>");
      // end hide -->
</script>
                  Boxes full of buttons in various sizes, colours and
materials
                  (polyestere, metal, shell)<br>
                  &euro; 77,47
 </form>
        <br>
        <input type=button name="compute"
       value="Calcola il costo - Calculate the cost" onClick="calculate()">

 Ometto tutta o quasi la parte in html
Due errori di sintassi:
- il "punto" nei numeri significa "virgola decimale", quindi devi toglierla dai 
prezzi in lire
- la "virgola" in un array separa gli elementi, i prezzi in "bagsList" devono 
avere il punto
- nelle SELECT l'indice selezionato non si cerca come facevi tu, si legge la 
proprietà "selectedIndex" come vedi nel codice sotto
- tutti quei "return" non servono, esegui le funzioni verificando che sia stato 
selezionato un valore.
- il controllo "if (which>0)" è necessario perché i tuoi array cominciano da 1 
dato che a 0 per te corrisponde "scelta non effettuata". Ma mi sembra che tu 
intendevi usare "j" per questo.
Lo script seguente funziona, per tua comodità l'ho indentato tutto riga per 
riga (comprese le parentesi graffe) così puoi ricostruire facilmente le righe 
lunghe.
Ti ho ricostruito anche la parte HTML del documento per renderla più 
leggibile, ma sopratutto perché avevi messo il pulsante FUORI dal form.
Alla fine di questo messaggio una considerazione.
<script>
<!--
function MakeArray(size)
	{
	this.length = size;
	for(i = 1; i <= size; i++)
		this[i] = null;
	return this;
	}
function Part(strName, iCost)
	{
 
this.name
 = strName;
	this.cost = iCost;
	}
sacchiList = new MakeArray(3);
sacchiList[1]= new Part("Quantita' 1", 300000);
sacchiList[2]= new Part("Quantita' 2", 600000);
sacchiList[3]= new Part("Quantita' 3", 900000);
bagsList = new MakeArray(3);
bagsList[1]= new Part("Quantity 1", 154.94);
bagsList[2]= new Part("Quantity 2", 309.87);
bagsList[3]= new Part("Quantity 3", 464.81);
scatoleList = new MakeArray(3);
scatoleList[1]= new Part("Quantita' 1", 150000);
scatoleList[2]= new Part("Quantita' 2", 300000);
scatoleList[3]= new Part("Quantita' 3", 450000);
boxesList = new MakeArray(3);
boxesList[1]= new Part("Quantity 1", 77.47);
boxesList[2]= new Part("Quantity 2", 154.94);
boxesList[3]= new Part("Quantity 3", 232.41);
var totalCost= 0;
var strDesc= "";
function createSelect(strName, objList)
	{
	var tStr = "<SELECT NAME=\"" + strName + "\">"  + "<OPTION SELECTED>- 
Quantity -";
	for(var i=1; i<=objList.length; i++)
		tStr += "<OPTION>" + objList[i].name;
	tStr += "</SELECT>";
	return tStr;
	}
function calculate()
	{
	totalCost = 0;
	strDesc = "";
	calcSacchi();
	calcBags();
	calcScatole();
	calcBoxes();
	alert("\nAvete selezionato i seguenti prodotti - You have selected the 
following products" +  "configuration:\n\n" + strDesc +  "\n with a total cost 
of Lit" +  totalCost + ".");
	}
function calcSacchi()
	{
	var which = document.order1.sacchi.options.selectedIndex;
	if (which>0)
		{
		totalCost += eval(sacchiList[which].cost);
		strDesc += " - " + sacchiList[which].name + " Sacchi\n";
		}
	}
function calcBags()
	{
	var which = document.order1.bags.options.selectedIndex;
	if (which>0)
		{
		totalCost += eval(bagsList[which].cost);
		strDesc += " - " +bagsList[which].name + " Bags\n";
		}
	}
function calcScatole()
	{
	var which = document.order1.scatole.options.selectedIndex;
	if (which>0)
		{
		totalCost += eval(scatoleList[which].cost);
		strDesc += " - " +scatoleList[which].name + " Scatole\n";
		}
	}
function calcBoxes()
	{
	var which = document.order1.boxes.options.selectedIndex;
	if (which>0)
		{
		totalCost += eval(boxesList[which].cost);
		strDesc += " - " +boxesList[which].name + " Boxes\n";
		}
	}
//-->
</script>
<body>
<form name="order1" method=POST>
Descrizione - Description <BR>
<script language="JavaScript">
<!-- begin hide
document.write(createSelect("sacchi", sacchiList));
// end hide -->
</script>
Sacchi da Kg 20 di bottoni in varie misure, colori, modelli, materiali 
(metallo, poliestere, madreperla, golalite) Lit 300.000 cadauno <P>
<script language="JavaScript">
<!-- begin hide
document.write(createSelect("bags", bagsList));
// end hide -->
</script>
Cloth Bags of 20 Kilos each full of buttons in various sizes, colours, models 
and materials (metal, polyestere, shell, galalite) euro; 154,94 <P>
Descrizione - <i>Description</i><BR>
<script language="JavaScript">
<!-- begin hide
document.write(createSelect("scatole", scatoleList));
// end hide -->
</script>
Scatole con bottoni assortite in colore e misure in materiali di polyestere, 
metallo, madreperla. Lit 150.000 cadauna  <P>
<script language="JavaScript">
<!-- begin hide
document.write(createSelect("boxes", boxesList));
// end hide -->
</script>
Boxes full of buttons in various sizes, colours and materials (polyestere, 
metal, shell) &euro; 77,47 <P> <P>
<input type=button name="compute" value="Calcola il costo - Calculate the cost" 
onClick="calculate()">
</form>
</BODY>
--------------------------------------------------------------
Considerazione:
Non mi sembra per niente funzionale, nelle stesse varibili sommi sia lire che 
euro ed ottieni un prezzo che.... non è nessuno dei due.
Ti consiglio di lavorare direttamente in lire con una sola SELECT sia per i 
sacchi che per le scatole. Gli importi in EURO li ottieni dividendo la somma 
trovata per 1936.27 ed arrotondando.
Per mettere i punti nel totale usa questo script che ho fatto qualche giorno fa 
per un altra richiesta qui nel newsgroup integrando lo script per i punti delle 
migliaia che trovi su 
http://www.jsdir.com
<SCRIPT>
<!--
/*
 * JavaScripting by 
ri.ri...@agora.stm.it
 - 
http://www.jsdir.com
 */
function punti(numero)
	{
	leadingspaces="                    "; // 20 spazi. Allinea a destra in 
una TEXTbox monospazio di 20 caratteri
	var numerononpuntato=numero.toString();
	var cifre=numero.toString().length;
	var gruppi=parseInt(cifre/3);
	if (isNaN(gruppi)){gruppi=0}
	var resto=parseInt(cifre - gruppi*3);
	var numeropuntato="";
	for (i=gruppi ; i>0 ; i--) 
{numeropuntato=numeropuntato+"."+numerononpuntato.substr(cifre-3*i,3)}
	numeropuntato=numerononpuntato.substr(0,resto)+numeropuntato;
	if (numeropuntato.substr(0,1) == "." 
){numeropuntato=numeropuntato.substr(1,numeropuntato.length)}
	numeropuntato.length==0?numeropuntato="0":null;
	numeropuntato=leadingspaces.substring(0,leadingspaces.length-
numeropuntato.length)+numeropuntato;
	return(numeropuntato);
	}
function converti(lireTOconvert)
	{
	plire=punti(lire)
	euro=(Math.round(lire/19.3627)/100).toString();
	euro.indexOf(".")==-
1?euro+=".00":euro.substring(euro.indexOf("."),euro.length).length==2?euro+="0"
:null;
	deceuro=euro.substring(euro.indexOf(".")+1,euro.length)
	inteuro=punti(euro.substring(0,euro.indexOf(".")));
	peuro=inteuro+","+deceuro;
	risultato = plire+"\n"+peuro);
	return risultato
	}
//-->
</SCRIPT>
Anche questo è indentato per le righe lunghe.
A me serviva scrivere il risultato in un TEXTBOX quindi ho inserito una serie 
di spazi per giustificarlo a destra (crossbrowser), modificalo se necessario.
La function da usare è converti(lireToconvert)
Tu dovresti fare:
alert("Il prezzo in euro e': "+converti(totalCost));
-- 
Ciao, Riccardo
------------------------------------------------------------------------
WebMaster: ----> 
http://www.jsdir.com
 <---- (aka 
http://www.jspoint.it
)
------------------------------------------------------------------------
               Nessun traguardo è abbastanza lontano.
------------------------------------------------------------------------

 ha scritto nel messaggio ...
Riccardo:
grazie di cuore per l'aiuto.
Buon lavoro
Roberto

 ha scritto nel messaggio ....
dimenticavo: mi sono scaricato il suo corso su js così vedo di imparare
qualcosa :-)
Roberto

 Buon lavoro
Tnx anche a te.
