
function defocus(x) {
  document.BuyForm.qty2.focus();
}
function roundOff(value) {  // rounds numbers to numerical formatting
  if (value == 0) {return "0.00";}
  else {
    pennies = value * 100;
    pennies = Math.round(pennies);
    strPennies = "" + pennies;
    len = strPennies.length;
    return strPennies.substring(0, len - 2) + "." + strPennies.substring(len - 2, len);
  }
}
function CheckNull(value) {  // checks for empty quantities
  if (value == "") {value = "0";}
  return value;
}
function leftPad(n) {  
    return (new Array(8 - String(n).length + 1)).join("&nbsp;").concat(n);  
}  
function calculate(x) {  // adds shipping to total price of the products
  basicprice = calc(x);
  GST = 0.00
  if(Number(basicprice) > 0) {
    shipping = calcship(x);
    if(x.country.options[x.country.selectedIndex].value == "CA") {GST = (Number(basicprice) + Number(shipping)) * .05;}
    x.desc.value = add_items(x);
    x.amount.value = roundOff(Number(basicprice) + Number(shipping) + Number(GST));
    document.getElementById('subtotal').innerHTML = leftPad(roundOff(basicprice));
    document.getElementById('shiptotal').innerHTML = leftPad(roundOff(shipping));
    document.getElementById('GSTtotal').innerHTML = leftPad(roundOff(GST));
    document.getElementById('grandtotal').innerHTML = leftPad(x.amount.value);
    if(shipping == "999.99") {document.getElementById('check_zip').innerHTML = "ZIP?";}
    else {document.getElementById('check_zip').innerHTML = "";}
  }
  else {
    x.amount.value = "0.00";
    document.getElementById('subtotal').innerHTML = "&nbsp; &nbsp; 0.00";
    document.getElementById('shiptotal').innerHTML = "&nbsp; &nbsp; 0.00";
    document.getElementById('GSTtotal').innerHTML = "&nbsp; &nbsp; 0.00";
    document.getElementById('grandtotal').innerHTML = "&nbsp; &nbsp; 0.00";
    document.getElementById('check_zip').innerHTML = "";
  }
}
function calc(x) {  // calculates subtotal
  x.amount.value = 0;
  wt = 0;
  var y = x.price.length;
  var z = x.qty.length;
  var a = Number(x.amount.value);
  var v = Number(y);
  var b,c,d,w;
  d = true;
  while(y > 0) {
    b = Number(CheckNull(x.price[y-1].value));
    c = Number(CheckNull(x.qty[y-1].value));
    w = Number(CheckNull(x.weight[y-1].value));
    if(c < 0) {
      d = false;
      c = 0;
      x.qty[y-1].value = c;
    }
    a += (b * c);
    wt += (w * c) + 25 * c;
   y--;
  }
  if(d == false) {alert("Negative quantities not permitted; these have been set to zero.");}
   return a;
}
function calcship(x) {
  var h = parseInt(wt / 500, 10) - 1;
  var s = 999.99;
  switch (x.country.options[x.country.selectedIndex].value) {
    case "CA" :
      if(wt < 500) {s = 3.00;}
      else if(x.postcode.value.length > 5) {
        var zip = (x.postcode.value.substring(0,1)).toUpperCase();
        var digit = Number(x.postcode.value.substring(1,2));
        switch (zip) {
          case ("A") : s = (12.40 + 0.70 * h); break;
          case ("B") : s = (12.40 + 0.70 * h); break;
          case ("C") : s = (12.40 + 0.70 * h); break;
          case ("E") : s = (12.40 + 0.70 * h); break;
          case ("G") : s = (11.00 + 0.65 * h); break;
          case ("H") : s = (11.00 + 0.65 * h); break;
          case ("J") : s = (11.00 + 0.65 * h); break;
          case ("K") : s = (10.40 + 0.60 * h); break;
          case ("L") : s = (10.40 + 0.60 * h); break;
          case ("M") : s = (10.40 + 0.60 * h); break;
          case ("N") : s = (10.40 + 0.60 * h); break;
          case ("P") : s = (10.40 + 0.60 * h); break;
          case ("R") : s = (10.40 + 0.60 * h); break;
          case ("S") : 
            switch (true) {
              case (digit <= 2) : s = (9.30 + 0.45 * h); break;
              case (digit >= 3) : s = (10.60 + 0.50 * h); break;
              default : break;
            }
            break;
          case ("T") : 
            switch (digit) {
              case 0 : s = (10.60 + 0.50 * h); break;
              case 1 : s = (10.60 + 0.50 * h); break;
              case 4 : s = (10.60 + 0.50 * h); break;
              case 7 : s = (10.60 + 0.50 * h); break;
              case 2 : s = (9.30 + 0.45 * h); break;
              case 3 : s = (9.30 + 0.45 * h); break;
              case 5 : s = (9.30 + 0.45 * h); break;
              case 6 : s = (9.30 + 0.45 * h); break;
              case 8 : s = (9.30 + 0.45 * h); break;
              case 9 : s = (9.30 + 0.45 * h); break;
              default : break;
            }
            break;
          case ("V") :
            switch (digit) {
              case 0 : s = (9.10 + 0.45 * h); break;
              case 1 : s = (9.10 + 0.45 * h); break;
              case 2 : s = (7.75 + 0.35 * h); break;
              case 3 : s = (6.30 + 0.30 * h); break;
              case 4 : s = (6.30 + 0.30 * h); break;
              case 5 : s = (6.30 + 0.30 * h); break;
              case 6 : s = (6.30 + 0.30 * h); break;
              case 7 : s = (6.30 + 0.30 * h); break;
              case 8 : s = (8.80 + 0.40 * h); break;
              case 9 : s = (8.80 + 0.40 * h); break;
              default : break;
            }
            break;
          case ("X") : s = (12.40 + 0.70 * h); break;
          case ("Y") : s = (12.40 + 0.70 * h); break;
          default : break;
        }
      }
      if(s != 999.99) {s = s + 0.50;}
      break;
    case "US" :
      if(wt < 500) {s = 7.00;}
      else if(x.postcode.value.length > 4) {
        var zip = Number(x.postcode.value.substring(0,3));
        switch (true) {
          case (zip >= 150 && zip <= 196) : s = (13.15 + 1.45 * h); break;
          case (zip >= 247 && zip <= 269) : s = (13.15 + 1.45 * h); break;
          case (zip >= 300 && zip <= 319) : s = (13.15 + 1.45 * h); break;
          case (zip >= 350 && zip <= 459) : s = (13.15 + 1.45 * h); break;
          case (zip >= 460 && zip <= 499) : s = (13.20 + 1.40 * h); break;
          case (zip >= 500 && zip <= 549) : s = (12.40 + 1.00 * h); break;
          case (zip >= 550 && zip <= 567) : s = (11.95 + 0.95 * h); break;
          case (zip >= 570 && zip <= 579) : s = (11.95 + 0.95 * h); break;
          case (zip >= 580 && zip <= 599) : s = (11.85 + 0.85 * h); break;
          case (zip >= 600 && zip <= 659) : s = (13.20 + 1.40 * h); break;
          case (zip >= 660 && zip <= 679) : s = (12.65 + 1.05 * h); break;
          case (zip >= 680 && zip <= 699) : s = (12.40 + 1.00 * h); break;
          case (zip >= 700 && zip <= 715) : s = (13.15 + 1.45 * h); break;
          case (zip >= 716 && zip <= 799) : s = (13.20 + 1.40 * h); break;
          case (zip >= 800 && zip <= 819) : s = (12.40 + 1.00 * h); break;
          case (zip >= 820 && zip <= 839) : s = (11.95 + 0.95 * h); break;
          case (zip >= 840 && zip <= 849) : s = (12.40 + 1.00 * h); break;
          case (zip >= 850 && zip <= 884) : s = (12.65 + 1.05 * h); break;
          case (zip >= 889 && zip <= 899) : s = (12.40 + 1.00 * h); break;
          case (zip >= 900 && zip <= 966) : s = (12.65 + 1.05 * h); break;
          case (zip >= 970 && zip <= 979) : s = (11.95 + 0.95 * h); break;
          case (zip >= 980 && zip <= 994) : s = (11.85 + 0.85 * h); break;
          default : s = (13.40 + 1.50 * h); break;
        }
      }
      if(s != 999.99) {s = s + 1.00;}
      break;
    case "MX" :
      h = parseInt(wt / 2000, 10) + 1;
      if(wt < 500) {s = 10.00}
      else {s = 20.00 * h}
      break;
    case "AU" :
      h = parseInt(wt / 500, 10) + 1;
      switch (true) {
        case (wt < 1500) : s = 16.00 * h; break;
        case (wt >= 1500 && wt < 3500) : s = 16.00 * (h - 1); break;
        default : s = 8.00 * (h + 5); break;
      }
      break;
    case "NZ" :
      h = parseInt(wt / 500, 10) + 1;
      switch (true) {
        case (wt < 1500) : s = 16.00 * h; break;
        case (wt >= 1500 && wt < 3500) : s = 16.00 * (h - 1); break;
        default : s = 8.00 * (h + 5); break;
      }
      break;
    default : // Europe
      h = parseInt(wt / 1000, 10) + 2;
      switch (true) {
        case (wt < 500) : s = 15.00; break;
        case (wt >= 500 && wt < 1000) : s = 30.00; break;
        case (wt >= 1000 && wt < 2000) : s = 45.00; break;
        default : s = 15.00 * h; break;
      }
      break;
  }
  return roundOff(s);
}
function reset(x) {  // resets form
  var y = x.price.length;
  wt = 0;
  while(y > 0) {
    x.qty[y-1].value = 0;
    y--;
  }
}
function add_items(x) {  // adds the descriptions and prices to be sent to WorldPay secure server
  var y = x.price.length;
  var z = x.code.length;
  var d = "";
  if(y != z) alert("Missing items in form; found "+y+" occurrences of price and "+z+" of code.");
  var c = 0;
  while (c < y) {
    if(Number(CheckNull(x.qty[c].value)) > 0) {d += add_item(d,x.qty[c].value,x.code[c].value);}
    c++;
  }
  return d;
}
function add_item(d,q,c) {
  var r = "";
  if(d != "") {r += ",<br>";}
  r += q + " \"" + c + "\"";
  return r;
}
function validate_form(x) {  // validates the details input by the customer
  var e = "";
  var r = true;
  var z,n,q,t;
  t = true;
  q = 0;
  n = 0;
  z = 0;
  while(z < x.qty.length) {
    if(Number(CheckNull(x.qty[z].value)) < 0) {n++;}
    else {q += Number(CheckNull(x.qty[z].value));}
    z++;
  }
  if(n > 0) {
    e += "\nYou have entered "+n+" negative quantit";
    if(n == 1) {e += "y.";}
    else {e += "ies.";}
    r = false;
  }
  if(q == 0) {
    e += "\nYou need to select at least one item.";
    r = false;
  }
  // an error message will be displayed for each empty field
  if(x.name.value == "") {e += "\nName"; r = false;}
  if(x.address.value == "") {e += "\nAddress"; r = false;}
  if(x.postcode.value == "") {e += "\nPostal/ZIP code"; r = false;}
  if(x.tel.value == "") {e += "\nTelephone number"; r = false;}
  if(x.email.value == "") {e += "\nE-mail address"; r = false;}
  if(r == false) {alert("Before checking out, you must enter your ...\n"+e);}
  return r;
}


