var volumes = new Array("tsp","tblsp","cup","uscup","floz","pt","qt","gal","ml","l");
var weights = new Array("oz","lb","g","kg");
var tsp2ml = 5;
var tblsp2ml = 15;
var cup2ml = 284.13;
var uscup2ml = 236.59;
var floz2ml = 28.4130625;
var pt2ml = 568.26125;
var qt2ml = 1136.5;
var gal2ml = 4546.09;
var oz2g = 28.4130625;
var lb2g = 453.59237;
var ml2ml = 1;
var l2ml = 1000;
var g2g = 1;
var kg2g = 1000;

function compute() {
  if (!(document.getElementById("quantity").value && document.getElementById("from").value && document.getElementById("to").value)) {
    return;
  }

  var quantity = document.getElementById("quantity").value;
  var from = document.getElementById("from").value;
  var to = document.getElementById("to").value;

  if ((contains(volumes,from) && contains(volumes,to)) || (contains(weights,from) && contains(weights,to))) {
    var fromMultiplier = getMultiplier(from);
    var toMultiplier = getMultiplier(to);
    var toQuantity = (quantity * fromMultiplier / toMultiplier).toPrecision(3) * 1;

    document.getElementById("result-from").innerHTML = quantity + " " + getFullName(from) + (quantity == 1 ? "" : "s");
    document.getElementById("result-to").innerHTML =  toQuantity + " " + getFullName(to) + (toQuantity == 1 ? "" : "s");
    document.getElementById("result").style.display = "";
    document.getElementById("result-error").style.display = "none";
    document.getElementById("results").style.display = "";
    document.getElementById("clearRow").style.display = "";
  } else {
    document.getElementById("result").style.display = "none";
    document.getElementById("result-error").style.display = "";
    document.getElementById("results").style.display = "";
    document.getElementById("clearRow").style.display = "";
  }
}

function clearResults() {
    document.getElementById("quantity").value = "";
    document.getElementById("from").selectedIndex = -1;
    document.getElementById("to").selectedIndex = -1;
    
    document.getElementById("result").style.display = "none";
    document.getElementById("result-error").style.display = "none";
    document.getElementById("results").style.display = "none";
    document.getElementById("clearRow").style.display = "none";
}

function contains(array, item) {
  var length = array.length;
  for (var i = 0;i < length;i++) {
    if (array[i] == item) {
      return true;
    }
  }
  return false;
}

function getMultiplier(unit) {
  switch (unit) {
    case "tsp":
      return tsp2ml;
    case "tblsp":
      return tblsp2ml;
    case "cup":
      return cup2ml;
    case "uscup":
      return uscup2ml;
    case "floz":
      return floz2ml;
    case "pt":
      return pt2ml;
    case "qt":
      return qt2ml;
    case "gal":
      return gal2ml;
    case "oz":
      return oz2g;
    case "lb":
      return lb2g;
    case "ml":
      return ml2ml;
    case "l":
      return l2ml;
    case "g":
      return g2g;
    case "kg":
      return kg2g;
  }
}

function getFullName(unit) {
  switch (unit) {
    case "tsp":
      return "teaspoon";
    case "tblsp":
      return "tablespoon";
    case "cup":
      return "UK cup";
    case "uscup":
      return "US cup";
    case "floz":
      return "fluid ounce";
    case "pt":
      return "pint";
    case "qt":
      return "quart";
    case "gal":
      return "gallon";
    case "oz":
      return "ounce";
    case "lb":
      return "pound";
    case "ml":
      return "millilitre";
    case "l":
      return "litre";
    case "g":
      return "gram";
    case "kg":
      return "kilogram";
  }
}
