var ns4 = (navigator.appName.indexOf("Netscape")>=0 && !document.getElementById)? true : false;
var ie4 = (document.all)? true : false;
//  var ie4 = (document.all && !document.getElementById)? true : false;
//  var ie5 = (document.getElementById && document.all)? true : false;
//  var ns6 = (document.getElementById && navigator.appName.indexOf("Netscape")>=0 )? true: false;
var ns6 = (document.getElementById)? true : false;

function calcNa(form) {
	checkForm();
	var na = document.na;
	var ptNa = na.ptNa.value;
	var goalNa = na.goalNa.value;
	var rateNa = na.rateNa.value;
	var weight = na.weight.value;
	var wtType = na.wtType.selectedIndex;
	var ptType = na.ptType.selectedIndex;
	var ivf = na.ivf.selectedIndex;
	var ivfText = na.ivf.options[ivf].text;
	var calcType = na.calcType.selectedIndex;
	var iNa, tbw;
	
	//  Convert weight from lbs to kg
	if (wtType == 1) {weight *= 0.453597}
	
	//  Determine infusate Na concentration (mmol/L)
	if (ivfText == "5% NaCl") {iNa = 855}	//  5% NaCl
	if (ivfText == "3% NaCl") {iNa = 513}	//  3% NaCl
	if (ivfText == "0.9% NaCl (NS)") {iNa = 154}	//  0.9% NaCl (NS)
	if (ivfText == "Lactate Ringer's") {iNa = 130}	//  Lactate Ringer's + 4 mEq/L of K+
	if (ivfText == "0.45% NaCl (½ NS)") {iNa = 77}	//  0.45% NaCl (1/2 NS)
	if (ivfText == "0.2% NaCl (¼ NS)") {iNa = 34}	//  0.2% NaCl (1/4 NS)
	if (ivfText == "5% Dextrose in water (D5W)") {iNa = 0}		//  5% Dextrose in water (D5W)
	
	//  Determine Total Body Water
	if (ptType == 0) {tbw = weight * 0.6}	//  Men
	if (ptType == 1) {tbw = weight * 0.5}	//  Women
	if (ptType == 2) {tbw = weight * 0.5}	//  Elderly Men
	if (ptType == 3) {tbw = weight * 0.45}	//  Elderly Men
	if (ptType == 4) {tbw = weight * 0.6}	//  Children
	
	//  Adrogue formula
	if (calcType == 0) {
		//  Lactate Ringer's solution contains 4 mEq/L of K+	
		var changeNa = (iNa - ptNa) / (tbw + 1);
		var ivfTime = (goalNa - ptNa) / rateNa;
		var ivfRate = (goalNa - ptNa) * 1000 / (changeNa * ivfTime);
	}
	
	//  Classic formulae
	if (calcType == 1) {
		var ivfTime = (goalNa - ptNa) / rateNa;
		ivfTime = Math.abs(ivfTime);
		
		//  Classic Hyponatremia
		//  Rate of correction 0.5 - 1 mEq/L/hr
		if (ptNa < 140) {
			var naDef = (goalNa - ptNa) * tbw;
			var clVol = naDef / iNa;
			var ivfRate = clVol * 1000 / ivfTime;
		}
	
		//  Classic Hyponatremia
		//  Rate of correction 0.5 - 1 mEq/L/hr
		if (ptNa > 140) {
			var waterDef = tbw * (ptNa - goalNa) / goalNa;
			var ivfRate = waterDef * 1000 / ivfTime;
		}
	}

	//  Add insensible water losses, if selected
	var addFluids = 0;		//  in cc/day
	if (na.fever.checked) {
		var temp = na.temp.value;
		var whatTemp = na.whatTemp.selectedIndex;
		
		//  Convert Fahrenheit to Celsius
		if (whatTemp == 0) {temp = (temp - 32) * 5/9;}
		if (temp > 38) {
			if (na.insense.checked && na.loss.value) {
				var loss = na.loss.value;
				var whatLoss = na.whatLoss.selectedIndex;
				
				if (whatLoss == 1) {loss *= 1000;}
				addFluids += ((temp - 38) / 100) * loss;
			} else {
				addFluids += (temp - 37) * 100;
			}
		}
	}
	if (na.insense.checked) {
		var loss = na.loss.value;
		var whatLoss = na.whatLoss.selectedIndex;

		if (whatLoss == 1) {loss *= 1000;}
		addFluids += parseFloat(loss);
	}

	ivfRate = Math.abs(ivfRate);
	ivfRate += addFluids/24;	//  add insensible water losses

	na.ccMin.value = ivfRate / 60;
	na.ccHr.value = ivfRate;
	na.ccDay.value = ivfRate * 24;
	dispIVF();
	// na.ivfTime.value = roundNum(ivfTime,1);
	var rateText = eval(getLabel("rateText"));
	var rateHours = eval(getLabel("rateHours"));
	rateHours.innerHTML = roundNum(Math.abs(ivfTime),1);
	rateText.style.display = "";	
	
	return true;
}

function dispIVF() {
	var na = document.na;
	var rateType = na.rateType.selectedIndex;
	var whatRate;
	
	if (rateType == 0) {whatRate = na.ccMin.value}
	if (rateType == 1) {whatRate = na.ccHr.value}
	if (rateType == 2) {whatRate = na.ccDay.value}

	// na.ivfRate.value = roundNum(whatRate,1);
	var rateNum = eval(getLabel("rateNum"));
	rateNum.innerHTML = roundNum(whatRate,1);
	
	return true;
}

function checkForm() {
	var na = document.na;
	var ptNa = na.ptNa.value;
	var goalNa = na.goalNa.value;
	var rateNa = na.rateNa.value;
	var weight = na.weight.value;
	var temp = na.temp.value;
	var loss = na.loss.value;

	if (!checkError(ptNa, "ptNa", "patient's serum sodium")) return false;
	if (!checkError(goalNa, "goalNa", "target sodium value")) return false;
	if (!checkError(rateNa, "rateNa", "rate of sodium correction")) return false;
	if (!checkError(weight, "weight", "patient's weight")) return false;
	if (na.fever.checked && !checkError(temp, "temp", "patient's temperature")) return false;
	if (na.insense.checked && !checkError(loss, "loss", "patient's insensible losses")) return false;
	return true;
}

function checkNa(whatNa) {
	var na = document.na;
	var whatGoal;
	if (!checkError(whatNa, "ptNa", "patient's serum sodium")) return false;

	if (whatNa >= 145) {
		whatGoal = whatNa - 10;
		if (whatGoal < 145) {whatGoal = 145}
	} else if (whatNa <= 136) {
		if (whatNa >= 130) {whatGoal = 140}
			else {
				whatGoal = 8 + whatNa;
				if (whatGoal > 130) {whatGoal = 130}
			}
	} else {whatGoal = 140}
	
	na.goalNa.value = whatGoal;
	calcRate();
	ivfOptions();
	
	return true;
}

function calcRate() {
	var na = document.na;
	var ptNa = na.ptNa.value;
	var goalNa = na.goalNa.value;
	var rateNa = na.rateNa.value;
	var whatRate, newRate, cHours;
	
	if (!checkError(ptNa, "ptNa", "patient's serum sodium")) return false;
	if (!checkError(goalNa, "ptNa", "target sodium value")) return false;
	if (!rateNa) {rateNa = 0.5}			// Recommend rate of 0.5 mEq/L/hour
		else if ((ptNa > 140 && rateNa > 0) || (ptNa < 140 && rateNa < 0)) {rateNa = -rateNa;}

	cHours = (goalNa - ptNa) / rateNa;
	cHours = Math.abs(cHours);
	cHours = roundNum(cHours,1);
	
	// na.rateNa.value = roundNum(whatRate,2);
	na.rateNa.value = rateNa;
	
	var rateNaText = eval(getLabel("rateNaText"));
	rateNaText.innerHTML = "over " + cHours + " hours";
	rateNaText.style.display = "";
	
	return true;
}

function checkRate(whichRate) {
	var na = document.na;
	var ptNa = na.ptNa.value;
	
	if (ptNa > 140 && whichRate < -0.5) {
		alert("Recommend rate correction of more than 0.5-1 mmol/L/hr ONLY for SEVERAL HOURS and ONLY for patients with severe symptoms from acute hypernatremia.\n\nCerebral edema results from rapid correction of hypernatremia.");
	}
	if (ptNa < 140 && whichRate > 1) {
		alert("Recommend rate correction of more than 1-2 mmol/L/hr ONLY for SEVERAL HOURS and ONLY for patients with severe symptoms from acute hyponatremia.\n\nOsmotic demyelination results from rapid correction of hyponatremia.");
	}
	if ((ptNa > 140 && whichRate > 0) || (ptNa < 140 && whichRate < 0)) {
		na.rateNa.value = -whichRate;
	}


	return true;
}

/*
function selectFluid() {
	var na = document.na;
	var ptNa = na.ptNa.value;
	
	if (ptNa < 140) {
		//  If hyponatremic, use 3% NS
		na.ivf.selectedIndex = 1;
	}
	if (ptNa > 140) {
		//  If hypernatremic, use D5W (can also use 1/4 NS, 1/2 NS)
		na.ivf.selectedIndex = 6;
	}

	return true;
}
*/

function ivfOptions() {
	var na = document.na;
	var ptNa = na.ptNa.value;
	var ivf = na.ivf;
	
	if (ptNa < 140) {
		if (ivf.length == 7) {
			ivf.options[6] = null;
			ivf.options[5] = null;
			ivf.options[4] = null;
			ivf.options[1].selected = true;
		}
		if (ivf.length == 5) {
			ivf.options[4] = null;
			ivf.options[3] = new Option(ivf.options[1].text);
			ivf.options[2] = new Option(ivf.options[0].text);
			ivf.options[0] = new Option("5% NaCl");
			ivf.options[1] = new Option("3% NaCl");
			ivf.options[1].selected = true;
		}

	}
	if (ptNa > 140) {
		if (ivf.length == 7) {
			ivf.options[1] = null;
			ivf.options[0] = null;
			ivf.options[4].selected = true;
		}
		if (ivf.length == 4) {
			ivf.options[1] = null;
			ivf.options[0] = null;
			ivf.options[2] = new Option("0.45% NaCl (½ NS)");
			ivf.options[3] = new Option("0.2% NaCl (¼ NS)");
			ivf.options[4] = new Option("5% Dextrose in water (D5W)");
			ivf.options[4].selected = true;
		}
	}
	return true;
}

function hideText(whatText) {
	var rateNaText = eval(getLabel(whatText));
	rateNaText.style.display = "none";
	
	return true;
}

function dispText(thisText) {
	var na = document.na;
	var whereText = thisText.indexOf("Text");
	var origText = thisText.substring(0, whereText);
	var isCheck = eval("na." + origText + ".checked;");
	var showText = eval(getLabel(thisText));
	
	/*alert("thisText = " + thisText +
		"\nwhereText = " + whereText +
		"\norigText = " + origText +
		"\nisCheck = " + isCheck
		);
	*/
	
	if (isCheck) {showText.style.display = "";}
		else {showText.style.display = "none";}
		
	return true;
}

function getLabel(nameID) {
	var whatTag;
	
	if (ie4) {whatTag = "document.all[\"" + nameID + "\"]";}
	if (ns6) {whatTag = "document.getElementById(\"" + nameID + "\")";}
	return whatTag;	
}

function checkError(whatVar, varName, varText) {
	if ((whatVar == "") || (whatVar <= 0 && varName != "rateNa") || (isNaN(whatVar))) {
		alert("Please enter the " + varText + ".");
		eval("document.na." + varName + ".focus();");
		eval("document.na." + varName + ".select();");
		return false;
	}
	return true;
}

function roundNum(thisNum,dec) {
	thisNum = thisNum * Math.pow(10,dec);
	thisNum = Math.round(thisNum);
	thisNum = thisNum / Math.pow(10,dec);
	return thisNum;
}