// Classes
function measures() {
	this.us = 236.5882365;
	this.si = 250;
	this.ca = 227.3045;
	this.size = new Array(1, 3/4, 2/3, 1/2, 1/3, 1/4, 1/16, 1/48);
	this.label = new Array("c", "¾c", "⅔c", "½c", "⅓c", "¼c", "T", "t");
	// cups = x ^ 0.5333; spoons = x ^ ((0.5333 ^ 3) / 2) ^ 1/3)
	this.depth = new Array(5.32, 4.56, 4.28, 3.68, 2.96, 2.54, 1.41, 0.887);
}

// Main
var tools = new Array("m-v", "m-p", "p_p", "h_h");
var ci = new measures();
var fourth = 1;
var m2v = true;
var p2m = true;
var pincount = 2;
var base = 5;

function defraction(value) {
	var slash = value.indexOf("/");
	if (slash == -1)
		return value;
	var space = value.lastIndexOf(" ", slash);
	return (value.substring(0, space) * 1) + (value.substring(space, slash) / value.substring(slash + 1, value.length));
}

function getMass(m, k, size, depth) {
	m = m.convert("g", document.getElementById("uom").value);
	var vector = (depth < ci.depth[base]) ? -ci.depth[base] / depth : depth / ci.depth[base];
	var mass = (size == ci.size[base]) ? m : Math.pow(Math.E, k * vector) * m * (size / ci.size[base]);
	return mass;
}

function switchScale() {
	var tunit = document.getElementById("tunit").innerHTML;
	tunit = tunit.toUpperCase();
	var T = document.getElementById("hh_temp").value;
	var HTML = '<pre>      <input id="hh_temp" type="text" style="width: 60px;" onchange="postback(\'hh\')" /> &deg;';
	if (document.getElementsByName("scaleradio")[0].checked) {
		if (tunit.lastIndexOf("C</PRE>") != -1) {
			document.getElementById("tunit").innerHTML = HTML + 'F</pre>';
			document.getElementById("hh_temp").value = (T * 1.8) + 32;
		}
	} else {
		if (tunit.lastIndexOf("F</PRE>") != -1) {
			document.getElementById("tunit").innerHTML = HTML + 'C</pre>';
			document.getElementById("hh_temp").value = (T - 32) / 1.8;
		}
	}
}

function massVolume() {
	var options = document.getElementById("method").getElementsByTagName("option");
	var method = document.getElementById("method").value;
	if (method == 'medium') {
		document.getElementById("method_quantity").style.display = "inline";
	} else {
		document.getElementById("method_quantity").style.display = "none";
	}
	for (var i = 0; i < options.length; i++) {
		var display = (options[i].value == method) ? "" : "none";
		document.getElementById(options[i].value + "_expo").style.display = display;
	}
	var total = document.getElementById("total");
	if (document.getElementsByName("mvradio")[0].checked != m2v) {
		m2v = !m2v;
		if (m2v) {
			total.style.backgroundColor = "#fff";
			var bgc = "#f4ffd9";
			document.getElementById("v2m_expo").style.display = "none";
			document.getElementById("m2v_expo").style.display = "";
		} else {
			total.style.backgroundColor = "#f4ffd9";
			var bgc = "#fff";
			document.getElementById("m2v_expo").style.display = "none";
			document.getElementById("v2m_expo").style.display = "";
		}
		inputs = document.body.getElementsByTagName("input");
		for (i = 0; i < inputs.length; i++) {
			if (inputs[i].className == "output") {
				inputs[i].style.backgroundColor = bgc;
			}
		}
	}
	
	var sum = 0;
	var digits = (document.getElementById("uom").value == "g") ? 2 : 3;
	
	if (m2v) {
		if (total.value <= 0)
			return;
		sum = total.value;
	} else {
		total.value = sum.round(digits);
	}
	
	var substance = document.getElementById("substance").value;
	var constants = new Array();
	constants = substance.split(",");
	var m = parseFloat(constants[0]);
	var k = parseFloat(constants[1]);
	switch (method) {
		case "light":
			m = Math.pow(m, Math.pow(Math.E, k));
			k = 0;
			break;
		case "medium":
			k *= (document.getElementById("extra").checked) ? 2 : Math.SQRT2;
			m = Math.pow(m, Math.pow(Math.E, k * Math.SQRT2));
			break;
		case "heavy":
			m = Math.pow(m, Math.pow(Math.E, k * Math.sqrt(27)));
			k *= 2;
			break;
	}
	
	var masses = new Array();
	var volume = "";
	
	for (i = 0; i < ci.size.length; i++) {
		if (document.getElementById("check" + i).checked) {
			masses[i] = getMass(m, k, ci.size[i], ci.depth[i])
			if (m2v) {
				q = sum / masses[i];
				if (q >= 1 && i != (ci.size.length - 1)) {
					sum -= (Math.floor(q) * masses[i]);
					document.getElementById("vol" + i).value = (Math.floor(q) <= 0) ? "" : Math.floor(q);
				} else if (i == (ci.size.length - 1) && sum > 0) {
					document.getElementById("vol" + i).value = ((sum / masses[i]).round(digits) <= 0) ? "" : (sum / masses[i]).round(digits);
				} else {
					document.getElementById("vol" + i).value = "";
				}
			} else {
				sum += (document.getElementById("vol" + i).value * masses[i]);
				total.value = sum.round(digits);
			}
		} else {
			document.getElementById("vol" + i).value = "";
		}
		if (document.getElementById("vol" + i).value != "")
			volume += document.getElementById("vol" + i).value + " " + ci.label[i] + " + ";
	}
	volume = volume.substring(0, volume.length - 3);
	try {
		var textArea = document.createElement("textarea");
		textArea.value = volume;
		textRange = textArea.createTextRange();
		textRange.execCommand("RemoveFormat");
		textRange.execCommand("Copy");
		document.removeChild(textArea);
	} catch (e) {}
}

function mixedMass() {
	var nMt = document.getElementById("MT");
	var nPt = document.getElementById("percent");
	if (document.getElementsByName("mpradio")[0].checked != p2m) {
		p2m = !p2m;
		if (p2m) {
			nPt.style.backgroundColor = "#fff";
			var bgc = "#f4ffd9";
		} else {
			nPt.style.backgroundColor = "#f4ffd9";
			var bgc = "#fff";
		}
		document.getElementById("MA").style.backgroundColor = bgc;
		document.getElementById("MB").style.backgroundColor = bgc;
	}
	var Mt = nMt.value;
	var Pt = nPt.value / 100;
	if (document.getElementsByName("dP1")[0].checked) {
		var Pa = document.getElementById("PA1").value / 100;
	} else {
		var Pa = document.getElementById("PA2").value / 100;
	}
	if (document.getElementsByName("dP2")[0].checked) {
		var Pb = document.getElementById("PB1").value / 100;
	} else {
		var Pb = document.getElementById("PB2").value / 100;
	}
	var nMA = document.getElementById("MA");
	var nMB = document.getElementById("MB");
	if (document.getElementsByName("mpradio")[0].checked) {
		if (Pa < Pb) {
			var Mb = ((Pt - Pa) / (Pb - Pa)) * Mt;
			var Ma = Mt - Mb;
		} else {
			var Ma = ((Pt - Pb) / (Pa - Pb)) * Mt;
			var Mb = Mt - Ma;
		}
		if (Ma < 0 || Mb < 0) {
			nMA.value = "";
			nMB.value = "";
		} else {
			nMA.value = Math.round(Ma * 10000) / 10000;
			nMB.value = Math.round(Mb * 10000) / 10000;
		}
		if (nMA.value == "NaN")
			nMA.value = "";
		if (nMB.value == "NaN")
			nMB.value = "";
	} else {
		nMA.value = Math.round(nMA.value * 10000) / 10000;
		nMB.value = Math.round(nMB.value * 10000) / 10000;
		if (Pa < Pb) {
			Pt = (((nMA.value * (Pa - Pb)) / Mt) + Pb) * 100;
		} else {
			Pt = (((nMA.value * (Pb - Pa)) / Mt) + Pa) * 100;
		}
		nPt.value = Math.round(Pt * 10000) / 10000;
		if (nPt.value == "NaN")
			nPt.value = "";
	}
}

function addPin() {
	document.getElementById("padd" + pincount).style.display = "none";
	
	var lPin = document.getElementById("pin_list");
	var nListItem = document.createElement("pre");
	
	var nText1 = document.createTextNode("      ");
	nListItem.appendChild(nText1);
	
	var nInput1 = document.createElement("input");
	nInput1.id = "pin" + ++pincount;
	nInput1.type = "text";
	nInput1.style.width = "60px";
	nInput1.setAttribute("onchange", "postback('pp')");
	nListItem.appendChild(nInput1);
	
	var nText2 = document.createTextNode(" % ");
	nListItem.appendChild(nText2);
	
	var nInput2 = document.createElement("input");
	nInput2.id = "padd" + pincount;
	nInput2.type = "button";
	nInput2.value = " + ";
	if (document.attachEvent) {
		// IE shenanigan
		nInput2.attachEvent("onclick", addPin);
	} else {
		nInput2.setAttribute("onclick", "addPin()");
	}
	nListItem.appendChild(nInput2);
	
	lPin.appendChild(nListItem);
	
	if (pincount > 8)
		document.getElementById("precision_perfect").style.overflow = "auto";
}

function precisionPerfect() {
	var min = document.getElementById("rmin").value;
	var max = document.getElementById("rmax").value;
	var precision = Math.pow(10, document.getElementById("precision").value);
	var retnum = document.getElementById("results").value;
	var mag = 100 * precision;
	var p = new Array();
	var r = new Array();
	var j = 0;
	var tmpTotal = 0;
	
	for (i = 1; i <= pincount; ++i) {
		tmpValue = document.getElementById("pin" + i).value * 1;
		if (tmpValue > 0) {
			p[j++] = tmpValue / 100;
			tmpTotal += tmpValue;
		}
	}
	var num = p.length;
	if (num < 2) return;
	if (tmpTotal != 100) {
		var tmpScale = 100 / tmpTotal;
		for (i = 0; i < num; ++i) {
			p[i] *= tmpScale;
		}
	}
	
	i = -1;
	j = -1;
	
	for (x = (min * precision); x <= (max * precision); ++x) {
		tmpResult = 0;
		for (i = 0; i < num; ++i) {
			tmpValue1 = x * p[i];
			tmpValue2 = tmpValue1 - Math.floor(tmpValue1);
			if (tmpValue2 > 0.5) tmpValue2 = 1 - tmpValue2;
			tmpResult += tmpValue2 / tmpValue1;
		}
		r[++j] = new Object();
		r[j].total = x / precision;
		r[j].margin = tmpResult;
	}
	r.sort(function(a, b){ return a.margin - b.margin; });
	document.getElementById("pout_list").innerHTML = "";
	for (j = 0; j < retnum; ++j) {
		document.getElementById("pout_list").innerHTML += r[j].total + "<br />";
	}
}

function humidityHydration() {
	// http://weather.yahooapis.com/forecastrss?p=
	// 1g/15m/0.0314159265m2/7.869721557767041g-m3 (3.9564551269g-m2)
	// 16.1789656323 g/h/m2/g-m3
	// 32.1813215452 g/h/m2/g-m2
	var T = document.getElementById("hh_temp").value;
	if (document.getElementsByName("scaleradio")[0].checked) {
		T = (T - 32) / 1.8;
	}
	if (T <= 40) {
		var d = 5.018 + (0.32321 * T) + (0.0081847 * Math.pow(T, 2)) + (0.00031243 * Math.pow(T, 3));
	} else {
		var d = 6.335 + (0.6718 * T) - (0.020887 * Math.pow(T, 2)) + (0.00073095 * Math.pow(T, 3));
	}
	document.getElementById("hh_density").value = document.getElementById("hh_humid").value * d / 100;
}

function changeTools() {
	var tool = document.getElementById("toolbox").value;
	for (t = 0; t < tools.length; t++) {
		if (tool == tools[t]) {
			document.getElementById(tool + "_info").style.display = "";
			document.getElementById(tool).style.display = "";
		} else {
			document.getElementById(tools[t] + "_info").style.display = "none";
			oldTool = document.getElementById(tools[t]);
			if (oldTool.className == document.getElementById(tool).className) {
				oldTool.style.display = "none";
			}
		}
	}
}

function showEquations(e) {
	if (e.target) {
		var eventNode = e.target;
	} else {
		var e = window.event
		var eventNode = e.srcElement;
	}
	var pnodeID = eventNode.parentNode.parentNode.id;
	window.open("http://tools.foodsim.com/viewer.php?image=http://tools.foodsim.com/images/formulas/"+pnodeID+".png","equation","menubar=false,resizable=true,width=360,height=270"); 
}

function postback(tool) {
	switch (tool) {
		case "mv":
			massVolume();
			break;
		case "mp":
			mixedMass();
			break;
		case "pp":
			precisionPerfect();
			break;
		case "hh":
			humidityHydration();
			break;
		default:
			changeTools();
			massVolume();
			break;
	}
}
