Chrisschristou, ask yourself a few questions :

  • Why calculate grandtotal but not use it?
  • Why is grandtotal = parseFloat(totalofptotal + shippingtotal) inside the loop?
  • Should there be a shippingtotal += ... statement?
  • Is the expression shippingtotal = parseFloat(shipping * wholeqtty) correct? Is shipping proportional to quantity? It may be, but typically it doesn't cost twice as much to ship two items to the same address. Most shipping companies charge by weight or "volumetric weight".
  • grandtotal = parsefloat(...) and shippingtotal = parsefloat(...) - Why parsefloat() values that are already numbers? parsefloat() is only necessary to convert a string representation of a number to Number.

i have change the focntion but still same i take some line out of loop,
but for the shipping i know but i don't know how to calculate by weight
cause i have to shipp by airmail and express.
how i can do ??
i have prudct weight

=< 250gr
> 250gr

for diferece price by diferent shipping option.
for the moment here is the script i edited

<script type="text/javascript">
function MM_validateForm() { //v4.0
  if (document.getElementById){
    var i,p,q,nm,test,num,min,max,errors='',args=MM_validateForm.arguments;
    for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; val=document.getElementById(args[i]);
      if (val) {; if ((val=val.value)!="") {
        if (test.indexOf('isEmail')!=-1) { p=val.indexOf('@');
          if (p<1 || p==(val.length-1)) errors+='- '+nm+' must contain an e-mail address.\n';
        } else if (test!='R') { num = parseFloat(val);
          if (isNaN(val)) errors+='- '+nm+' must contain a number.\n';
          if (test.indexOf('inRange') != -1) { p=test.indexOf(':');
            min=test.substring(8,p); max=test.substring(p+1);
            if (num<min || max<num) errors+='- '+nm+' must contain a number between '+min+' and '+max+'.\n';
      } } } else if (test.charAt(0) == 'R') errors += '- '+nm+' is required.\n'; }
    } if (errors) alert('The following error(s) occurred:\n'+errors);
    document.MM_returnValue = (errors == '');
} }