/*
 *
 * File: mixer.js
 *
 * Copyright 2007, 2008 Greg McLaughlin
 */
 
/* system holds the current setting for Imperial/US vs metric
 *	Imperial/US = 0
 *	Metric = 1
 */
var system = 0;

var pressureUnitIds = [];
var pressureUnitsSet = []
pressureUnitsSet[0] = "psi";
pressureUnitsSet[1] = "bar";

var atmUnitsSet = [];
atmUnitsSet[0] = "ata";
atmUnitsSet[1] = "bar";

var depthUnitIds = [];
var depthUnitsSet = [];
depthUnitsSet[0] = "fsw";
depthUnitsSet[1] = "msw";

var depthIndSet = [];
depthIndSet[0] = "'";
depthIndSet[1] = "m";

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}

function setdefaults() {
	var currSystem = readCookie("NitroxMixerSystem");
	
	if (currSystem != null) {
		system = currSystem;
	}
	/* reset the system default cookie for another 2 years */
	createCookie("NitroxMixerSystem", system, 720);
}

setdefaults();
 
function setup() {

	if (typeof document.body.style.WebkitTransition == "string") {
		document.getElementById('viewPort').style.WebkitTransition = "left 400ms linear";
	}

 	document.getElementById('topupmixArea').style.visibility = "hidden";
 	document.getElementById('bleeddownArea').style.visibility = "hidden";
 	document.getElementById('eadArea').style.visibility = "hidden";
 	document.getElementById('bestmixArea').style.visibility = "hidden";

 	document.getElementById("topupmixResult").style.display = "none";
 	document.getElementById("bleeddownResult").style.display = "none";
 	document.getElementById("eadResult").style.display = "none";
 	document.getElementById("bestmixResult").style.display = "none";
 	
 	document.getElementById("sMix").innerHTML = insertO2options(10, 100, 32);
	document.getElementById("tMix").innerHTML = insertO2options(10, 100, 32);
	document.getElementById("tGas").innerHTML = insertO2options(10, 100, 21);
	document.getElementById("bdsMix").innerHTML = insertO2options(21, 100, 36);
	document.getElementById("bdtMix").innerHTML = insertO2options(10, 100, 32);
	document.getElementById("bdtGas").innerHTML = insertO2options(10, 100, 21);
	document.getElementById("useMix").innerHTML = insertO2options(10, 100, 32);
 	
 	setSystem();
 	
 	setTimeout(function() {hideAddressBar();}, 10);
 	
}

function toggleSystem() {

	if (system == 0) {
		system = 1;
	} else {
		system = 0;
	}
	
	/* reset the system default cookie for another 2 years */
	createCookie("NitroxMixerSystem", system, 720);
	
	if (document.getElementById("topupmixResult").style.display != "none") {
		slideUp("topupmixResult");
	}
	if (document.getElementById("bleeddownResult").style.display != "none") {
		slideUp("bleeddownResult");
	}
	if (document.getElementById("eadResult").style.display != "none") {
		slideUp("eadResult");
	}
	if (document.getElementById("bestmixResult").style.display != "none") {
		slideUp("bestmixResult");
	}
	
	document.getElementById("sPressure").value = "";
	document.getElementById("tPressure").value = "";
	document.getElementById("bdtPressure").value = "";
	document.getElementById("planDepth").value = "";
	document.getElementById("bmPlanDepth").value = "";
	
	setSystem();
}

function setSystem() {

	if (system == 0) {
		document.getElementById("topupmixSBut").innerHTML = "Metric";
		document.getElementById("bleeddownSBut").innerHTML = "Metric";
		document.getElementById("eadSBut").innerHTML = "Metric";
		document.getElementById("bestmixSBut").innerHTML = "Metric";
	} else {
		document.getElementById("topupmixSBut").innerHTML = "Imp/US";
		document.getElementById("bleeddownSBut").innerHTML = "Imp/US";
		document.getElementById("eadSBut").innerHTML = "Imp/US";
		document.getElementById("bestmixSBut").innerHTML = "Imp/US";
	}

	for (var i=0; i < pressureUnitIds.length; i++) {
		document.getElementById(pressureUnitIds[i]).innerHTML = pressureUnitsSet[system];
	}
	
	for (var i=0; i < depthUnitIds.length; i++) {
		document.getElementById(depthUnitIds[i]).innerHTML = depthUnitsSet[system];
	}
	
 	document.getElementById("mPPO2").innerHTML = insertATAoptions(null, 1.0, 1.6, 1.4);
	document.getElementById("cPPO2").innerHTML = insertATAoptions(null, 1.0, 1.6, 1.6);
 	document.getElementById("bmPPO2").innerHTML = insertATAoptions(0.21, 0.3, 1.6, 1.4);
}

function insertO2options(start, end, selected) {

	var  optionStr = "";
	
	for (var i = start; i <= end; i++) {
		if (i == selected) {
			optionStr = optionStr + "<option value=\"" + i + "\" selected=" +
													selected + "\">" + i + "%</option>"
		} else {	
			optionStr = optionStr + "<option value=\"" + i + "\">" + i + "%</option>"
		}
	}
	return optionStr;
}

function insertATAoptions(special, start, end, selected) {

	var  s = parseInt((start * 10).toFixed(0), 10);
	var  e = parseInt((end * 10).toFixed(0), 10);
	var  sel = parseInt((selected * 10).toFixed(0), 10);
	var  optionStr = "";
	
	if (special != null) {
		optionStr = optionStr + "<option value=\"" + special +
				"\" selected=" + selected + "\">" + special + " " + 
										atmUnitsSet[system] + "</option>"
	}
	
	for (var i = s; i <= e; i++) {
		if (i == sel) {
			optionStr = optionStr + "<option value=\"" +
				(i / 10).toFixed(1) + "\" selected=" +
					selected + "\">" + (i /10).toFixed(1) + " " +
									atmUnitsSet[system] + "</option>"
		} else {	
			optionStr = optionStr + "<option value=\"" +
				(i / 10).toFixed(1) + "\">" + (i / 10).toFixed(1) + " " +
											atmUnitsSet[system] + "</option>"
		}
	}
	return optionStr;
}

function pressureUnits(id) {
	pressureUnitIds[pressureUnitIds.length] = id;
}

function depthUnits(id) {
	depthUnitIds[depthUnitIds.length] = id;
}

function hideAddressBar() {
 	window.scrollTo(0, 1);
}

function slideDown(id) {
	/* use the server based animation effects if they are available */
	if (typeof document.body.style.WebkitTransition == "string") {
		hideAddressBar();
			
		var clipElement = $(id);
		var renderedElement = clipElement.down();
		
		clipElement.makePositioned();
		renderedElement.makePositioned();
		clipElement.makeClipping().show();
		
		var dimensions = renderedElement.getDimensions();
		renderedElement.setStyle({top: "-" + dimensions.height + "px"});
		renderedElement.setStyle({WebkitTransition: "top 700ms linear"});
		
		/* give the elements a chance to render before starting the animation */
		setTimeout(function() {renderedElement.style.top = "0px"}, 1);
	} else {
		Effect.SlideDown(document.getElementById(id),
				{beforeStart: hideAddressBar}
		);
	}
}

function slideUp(id) {
	/* use the server based animation effects if they are available */
	if (typeof document.body.style.WebkitTransition == "string") {
		hideAddressBar();
			
		var clipElement = $(id);
		var renderedElement = clipElement.down();
		var dimensions = renderedElement.getDimensions();
		
		/* DEBUG -- 
			window.console.log("id: " + id + " Height: " + dimensions.height);
		*/
		
		renderedElement.setStyle({top: "-" + dimensions.height + "px"});

		/* give the effect enought time to run before turning off the display */
		setTimeout(function() {clipElement.style.display = "none"}, 900);
	} else {
		Effect.SlideUp(document.getElementById(id),
			{beforeStart: hideAddressBar}
		);
	}
}

function goBack(event, area) {
	
	if (typeof document.body.style.WebkitTransition == "string") {
		hideAddressBar();
		document.getElementById('viewPort').style.left = "0px";
		
		/* Give the effect time to happen before hidding the area */
		setTimeout(function() {
			document.getElementById(area).style.visibility = "hidden";
		}, 500);
	
	} else {
		var slide = new Effect.Move(document.getElementById('viewPort'),
			{
				x: 0, y: 0, mode: 'absolute', duration: 0.4,
				beforeStart: function(){
					hideAddressBar();
				},
				afterFinish: function(){
					document.getElementById(area).style.visibility = "hidden";
				}
			});
		delete slide;
	}
}

function showArea(event, area) {

	if (typeof document.body.style.WebkitTransition == "string") {
		hideAddressBar();
		document.getElementById(area).style.visibility = "visible";

		/* every thing is good behind the curtain so slide it into place */
		document.getElementById('viewPort').style.left = "-320px";
	} else {
		var slide = new Effect.Move(document.getElementById('viewPort'),
			{
				x: -320, y: 0, mode: 'absolute', duration: 0.4,
				beforeStart: function(){
					hideAddressBar();
					document.getElementById(area).style.visibility = "visible";
				}
			});
		delete slide;
	}

}

function calcMix() {

	var sPressure = parseFloat(document.getElementById("sPressure").value);
	var sMix = parseFloat(document.getElementById("sMix").value);
	var tPressure = parseFloat(document.getElementById("tPressure").value);
	var tMix = parseFloat(document.getElementById("tMix").value);
	var tGas = parseFloat(document.getElementById("tGas").value);
	var addO2to;
	
	var precision = (system == 0) ? 1 : 2;
	
	if (isNaN(document.getElementById("sPressure").value) ||
		isNaN(document.getElementById("tPressure").value) ||
		isNaN(sPressure) || isNaN(tPressure) || (sPressure < 0) || (tPressure < 0))
	{
		alert("Error: You must enter positive numbers for the Start and Target Pressures!");
		if (document.getElementById("topupmixResult").style.display != "none") {
			slideUp("topupmixResult");
		}
		return false;
	}
	
	addO2to = (((((((tMix/100) * tPressure) - ((sMix/100) * sPressure)) /
				(tPressure - sPressure) - (tGas/100)) / ((100 - tGas) / 100)) *
				(tPressure - sPressure)) + sPressure);
				
	if (isNaN(addO2to) || (addO2to < sPressure) || (addO2to > tPressure)) {
		alert("Warning: Can not achieve the desired mix using this method!");
		if (document.getElementById("topupmixResult").style.display != "none") {
			slideUp("topupmixResult");
		}
		return false;
	}
				
	// fill in the results of the calculations
	document.getElementById("bPressure").innerHTML = sPressure + " " + pressureUnitsSet[system];
	document.getElementById("addO2").innerHTML = 
										addO2to.toFixed(precision) + " " + pressureUnitsSet[system];
	document.getElementById("fPressure").innerHTML = tPressure + " " + pressureUnitsSet[system];
	if (tGas == "21") {
		document.getElementById("toppingGas").innerHTML = "air";
	} else {
		document.getElementById("toppingGas").innerHTML = tGas + "% O<sub>2</sub>";
	}
	
	if (document.getElementById("topupmixResult").style.display == "none") {
		slideDown("topupmixResult");
	} else {
		/* to address iPhone's form input function leaving the address bar partly visible */
		hideAddressBar();
	}
	
	// return false so that we don't "submit" the form since all the calculations are done
	// already.
	return false;
	
}

function calcBleedDown() {

	var sMix = parseFloat(document.getElementById("bdsMix").value);
	var tPressure = parseFloat(document.getElementById("bdtPressure").value);
	var tMix = parseFloat(document.getElementById("bdtMix").value);
	var tGas = parseFloat(document.getElementById("bdtGas").value);
	var bleedTo;
	
	var precision = (system == 0) ? 1 : 2;
	
	if (isNaN(document.getElementById("bdtPressure").value) ||
		isNaN(tPressure) || (tPressure < 0))
	{
		alert("Error: You must enter a positive number for the Target Pressure!");
		if (document.getElementById("bleeddownResult").style.display != "none") {
			slideUp("bleeddownResult");
		}
		return false;
	}
	
	bleedTo = (tPressure * (tMix - tGas)) / (sMix - tGas);
				
	if (isNaN(bleedTo) || (bleedTo > tPressure)) {
		alert("Warning: Can not achieve the desired mix using this method!");
		if (document.getElementById("bleeddownResult").style.display != "none") {
			slideUp("bleeddownResult");
		}
		return false;
	}
				
	// fill in the results of the calculations
	document.getElementById("bdPressure").innerHTML = bleedTo.toFixed(precision) + " "
														+ pressureUnitsSet[system];
	document.getElementById("bdfPressure").innerHTML = tPressure + " "
														+ pressureUnitsSet[system];
	if (tGas == "21") {
		document.getElementById("bdtoppingGas").innerHTML = "air";
	} else {
		document.getElementById("bdtoppingGas").innerHTML = tGas + "% O<sub>2</sub>";
	}
	
	if (document.getElementById("bleeddownResult").style.display == "none") {
		slideDown("bleeddownResult");
	} else {
		/* to address iPhone's form input function leaving the address bar partly visible */
		hideAddressBar();
	}
	
	// return false so that we don't "submit" the form since all the calculations are done
	// already.
	return false;
	
}

function calcEAD() {

	var useMix = parseFloat(document.getElementById("useMix").value);
	var planDepth = parseFloat(document.getElementById("planDepth").value);
	var mPPO2 = parseFloat(document.getElementById("mPPO2").value);
	var cPPO2 = parseFloat(document.getElementById("cPPO2").value);
	var maxDepth;
	
	var oneAtm = (system == 0) ? 33 : 10;
	var precision = (system == 0) ? 0 : 2;
	
	// fill in the results of the calculations
	if (isNaN(document.getElementById("planDepth").value) ||
		(planDepth <= 0) || (isNaN(planDepth)))
	{
		alert("Planned Depth is not appropriate. EAD will not be calculated.");
		document.getElementById("ead").innerHTML = "N/A";
	} else {
		document.getElementById("ead").innerHTML =
					((((1 - (useMix/100)) * (planDepth + oneAtm))/(0.79)) - oneAtm).toFixed(precision)
						+ " " + depthUnitsSet[system];
	}
	
	if (isNaN(document.getElementById("planDepth").value) || isNaN(planDepth)) {
		document.getElementById("dPlanDepth").innerHTML = "---";
	} else {
		document.getElementById("dPlanDepth").innerHTML = planDepth + depthIndSet[system] + " ";
	}
	document.getElementById("dUseMix").innerHTML = useMix;
	
	document.getElementById("dMaxPPO2").innerHTML = mPPO2 + atmUnitsSet[system];
	maxDepth = ((((mPPO2)/(useMix/100))-1) * oneAtm);
	document.getElementById("maxDepth").innerHTML = maxDepth.toFixed(precision)
														+ " " + depthUnitsSet[system];
	
	document.getElementById("dContPPO2").innerHTML = cPPO2 + atmUnitsSet[system];
	document.getElementById("contDepth").innerHTML =
					((((cPPO2)/(useMix/100))-1) * oneAtm).toFixed(precision)
														+ " " + depthUnitsSet[system];
	
	if (document.getElementById("eadResult").style.display == "none") {
		slideDown("eadResult");
	} else {
		/* to address iPhone's form input function leaving the address bar partly visible */
		hideAddressBar();
	}
	
	if (maxDepth < planDepth) {
		alert("Warning: Planned Depth exceeds the Maximum Depth (@ " +
									mPPO2 + " " + atmUnitsSet[system] + ")!");
	}
	
	// return false so that we don't "submit" the form since all the calculations are done
	// already.
	return false;
	
}

function calcBestMix() {

	var planDepth = parseFloat(document.getElementById("bmPlanDepth").value);
	var desiredPPO2 = parseFloat(document.getElementById("bmPPO2").value);
	
	if (isNaN(document.getElementById("bmPlanDepth").value) ||
		(planDepth <= 0) || (isNaN(planDepth)))
	{
		alert("Planned Depth must be a number greater than 0 feet.");
		if (document.getElementById("bestmixResult").style.display != "none") {
			slideUp("bestmixResult");
		}
		return false;
	}
	
	document.getElementById("bmrPlanDepth").innerHTML = planDepth + depthIndSet[system] + " ";
	document.getElementById("bmdPPO2").innerHTML = desiredPPO2 + atmUnitsSet[system];
	
	var oneAtm = (system == 0) ? 33 : 10;
	
	document.getElementById("bmRes").innerHTML =
		(((desiredPPO2 * oneAtm) / (planDepth + oneAtm)) * 100).toFixed(0);

	if (document.getElementById("bestmixResult").style.display == "none") {
		slideDown("bestmixResult");
	} else {
		/* to address iPhone's form input function leaving the address bar partly visible */
		hideAddressBar();
	}
	
	// return false so that we don't "submit" the form since all the calculations are done
	// already.
	return false;
}