      function setup(band, space, boxes, hosted, data, cvsreps, webdev, ssh) {
	document.calc.bw.value = band;
	document.calc.hdd.value = space;
	document.calc.pop.value = boxes;
	document.calc.domains.value = hosted;
	document.calc.mySql.value = data;
	document.calc.cvs.value = cvsreps;
	document.calc.webHost.checked = webdev;
	document.calc.shell.checked = ssh;
	allValid();
	doPrice();
      }

      function allValid() {
	forceMin(document.calc.bw, bwDefault);
	forceMin(document.calc.hdd, hddDefault);
	forceMin(document.calc.pop, popDefault);
	forceMin(document.calc.domains, domainDefault);
	forceMin(document.calc.mySql, mysqlDefault);
	forceMin(document.calc.cvs, cvsDefault);
      }

      function numUp(id) {
	document.getElementById(id).value++;
	allValid();
	doPrice();
      }

      function numDown(id) {
	document.getElementById(id).value--;
	allValid();
	doPrice();
      }

      function validBox(id) {
	id.value = id.value.replace(/[^0-9]/g, "");
      }

      function forceMin(id, min) {
	if (id.value < min) {
	  id.value = min;
	}
      }

      function doPrice() {
	var warn = false;

	var essent = 0

	if (document.calc.hdd.value >= hddDefault) {
	  essent += document.calc.hdd.value * hddUnit;
	} else {
	  warn = true;
	}

	if (document.calc.bw.value >= bwDefault) {
	  essent += document.calc.bw.value * bwUnit;
	} else {
	  warn = true;
	}

        var opt = 0;
	if (document.calc.pop.value - popDefault >= 0) {
	  opt += (document.calc.pop.value - popDefault) * popUnit;
	} else {
	  warn = true;
	}

	if (document.calc.domains.value - domainDefault >= 0) {
	  opt += (document.calc.domains.value - domainDefault) * domainUnit;
	} else {
	  warn = true;
	}

	if (document.calc.mySql.value - mysqlDefault >= 0) {
	  opt += (document.calc.mySql.value - mysqlDefault) * mysqlUnit;
	} else {
	  warn = true;
	}

	opt += (document.calc.cvs.value - cvsDefault) * cvsUnit;

	if (document.calc.webHost.checked) {
	  opt += webHostUnit;
	}
	
	if (document.calc.shell.checked) {
	  opt += shellUnit;
	}

	if (!warn) {
	  asPounds("subEss", essent);
	  asPounds("subExt", opt);
	  asPounds("essential", essent);
	  asPounds("extra", opt);
	  asPounds("total", essent + opt);
	  asPounds("yrTotal", ((essent + opt) * 12) - 3);
	} else {
	  document.getElementById("subEss").innerHTML = "N/A";
	  document.getElementById("essential").innerHTML = "N/A";
	  document.getElementById("extra").innerHTML = "N/A";
	  document.getElementById("total").innerHTML = "N/A";
	  document.getElementById("yrTotal").innerHTML = "N/A";
	}
      }

      function asPounds(id, price) {
	price = Math.round(price * 100) / 100;
	price += "";
	if (price.indexOf(".") == -1) {
	  price += ".00";
	} else if (price.length - price.indexOf(".") == 2) {
	  price += "0";
	}
	document.getElementById(id).innerHTML = "&pound;" + price;
      }