/*
JavaScript:  Pediatric Fluids and Electrolytes Calculator
November 20, 2000

This calculator was created by Charles Hu for MedCalc.com.  This calculator may not be
copied without consent from the author.  Please contact him at
chuckhu@medcalc.com

*/

var ie4 = (document.all) ? true : false;

function calcFluids(form) {
	var weight = form.weight.value;
	var wtUnits = form.wtUnits.selectedIndex;
	var preWeight = form.preWeight.value;
	var preWtUnits = form.preWtUnits.selectedIndex;
	var dehydrated = form.dehydrated.selectedIndex;
	var Na = form.Na.value;
	var illDays = form.illDays.selectedIndex;
	var initialCc = form.initialCc.value;
	var initialCckg = form.initialCckg.value;
/*	var infantDehydr = form.infantDehydr.selectedIndex;
	var anuria = form.anuria.checked;chuckhu
	var hypothyroid = form.hypothyroid.checked;
	var hyperthyroid = form.hyperthyroid.checked;
	var chf = form.chf.checked;
	var siadh = form.siadh.checked;
*/
	var temp0 = form.temp0.checked;
	var temp = form.temp.value;
	var tempUnit = form.tempUnit.selectedIndex;
	var fluidInfoText = "";

	var dWater24 = ongoWater24 = otherWater24 = ongoNa24 = otherNa24 = ongoK24 = otherK24 = dNa24 = dK24 = 0;
	var iWater8 = dWater8 = iNa8 = dNa8 = dK8 = fwWater8 = 0;
	var dWater16 = iNa = dNa16 = dK16 = fwWater16 = 0;

	if (!errorAlert("weight","weight",weight)) {return false};
	if ((preWeight != "") && (!errorAlert("pre-illness weight","preWeight",preWeight))) {return false};
	if ((Na != "") && (!errorAlert("sodium","Na",Na))) {return false};
	if ((initialCc != "") && (!errorAlert("initial cc bolus","initialCc",initialCc))) {return false};
	if ((initialCckg != "") && (!errorAlert("initial cc/kg bolus","initialCckg",initialCckg))) {return false};
	if ((temp != "") && (!errorAlert("temperature","temp",temp))) {return false};

//  Convert all weights to kilograms
	if (wtUnits == 1) {weight /= 1000};		// grams
	if (wtUnits == 2) {weight *= 0.45359237};	// pounds
	if (preWeight != "") {
		if (preWtUnits == 1) {preWeight /= 1000};
		if (preWtUnits == 2) {preWeight *= 0.45359237};
	}

	if ((preWeight != "") && ((preWeight*1) < weight)) {
		alert("The pre-illness weight should be MORE than current weight.");
		form.preWeight.focus();
		form.preWeight.select();
		return false;
	}

//  Convert temperature to Celsius
	if ((temp != "") && (tempUnit == 1)) {temp = (temp - 32) * 5/9};
	if (((temp >= 39) || (temp <= 35)) && (temp != "")) {
		if (form.temp0.checked == 0) {form.temp0.click()}
	} else {if (form.temp0.checked == 1) {form.temp0.click()}}




//  Maintenance Fluids
	if ((preWeight != "") || (dehydrated != 0)) {			//  Calculate maint fluids based on pre-illness weight
		if (dehydrated !=0) {preWeight = newPreweight(weight)};
		var mWater24 = getMaint(preWeight);
	} else {var mWater24 = getMaint(weight)};
	
	if (form.temp0.checked) {
		var tempChange = 0.12 * (temp - 37);
		mWater24 = mWater24 * (1 + tempChange);
		if (tempChange < 0) {var tempText = "decreased"} else {var tempText = "increased"};
		fluidInfoText += "Maintenance fluids " + tempText + " by " + roundNum(Math.abs(tempChange*100),1) + "% for temp.<br>"
	}
/*	if (form.hypothyroid.checked) {
		mWater24 *= 0.75;
		fluidInfoText += "Maintenance fluids decreased by 25% for hypothyroidism.<br>"
	}
	if (form.hyperthyroid.checked) {
		mWater24 *= 1.25;
		fluidInfoText += "Maintenance fluids increased by 25% for hyperthyroidism.<br>"
	}
*/

	var mWater8 = mWater24 / 3;
	var mWater16 = mWater24 * 2/3;
	formVal("mWater24",mWater24); formVal("mWater8",mWater8); formVal("mWater16",mWater16);

	//  Sodium = 3 mEq / 100 cal
	var mNa24 = mWater24 * 3 / 100;
	var mNa8 = mNa24 / 3;
	var mNa16 = mNa24 * 2/3;
	formVal("mNa24",mNa24); formVal("mNa8",mNa8); formVal("mNa16",mNa16);

	//  Potassium = 2 mEq / 100 cal
	var mK24 = mWater24 * 2 / 100;
	var mK8 = mK24 / 3;
	var mK16 = mK24 * 2/3;
	formVal("mK24",mK24); formVal("mK8",mK8); formVal("mK16",mK16);

/*	//  Chloride = 5 mEq / 100 cal
	var mCl24 = mWater24 * 5 / 100;
	var mCl8 = mCl24 / 3;
	var mCl16 = mCl24 * 2/3;
	formVal("mCl24",mCl24); formVal("mCl8",mCl8); formVal("mCl16",mCl16);
*/



//  Initial Bolus
	if ((initialCc != "") || (initialCckg != "")) {
		if (initialCckg != "") {
			if (preWeight != "") {initialCc = initialCckg * preWeight} else {initialCc = initialCckg * weight}
			formVal("initialCc",initialCc)
		}
		iWater8 = -initialCc;
		iNa8 = -154 * initialCc / 1000;
		formVal("iWater8",iWater8);
		formVal("iNa8",iNa8);
	} else {resetVal("iWater8"); resetVal("iNa8")}

//  Deficit Fluids
if ((preWeight != "") || (dehydrated != 0)) {
	if (preWeight != "") {var percentDehydr = (preWeight - weight) / preWeight}
	if (dehydrated != 0) {preWeight = newPreweight(weight)}

/* if initial bolus WAS given, fluid deficit = 8 cc/kg/% dehydr
   if initial bolus NOT given, fluid deficit = 10 cc/kg/% dehydr
	if (notChuckhu(this.form)) {return false}
	if ((initialCc != "") || (initialCckg != "")) {var fluidDeficit = 8 * preWeight * percentDehydr * 100}
		else {var fluidDeficit = (preWeight - weight) * 1000}
*/
	var fluidDeficit = (preWeight - weight) * 1000;

	//  Correct 1/2 fluid deficit over 8 hours, 1/2 deficit over 16 hours
	var dWater24 = fluidDeficit;
	var dWater8 = dWater16 = dWater24 / 2;
	formVal("dWater24",dWater24); formVal("dWater8",dWater8); formVal("dWater16",dWater16);

	//  Sodium & Potassium Deficit
	if (illDays == 0) {
		dNa24 = sodiumDef(0,preWeight,percentDehydr,0);
		dK24 = potassiumDef(0,preWeight,percentDehydr,0);
	}
	if (illDays == 1) {		// < 3 days illness
		dNa24 = sodiumDef(1,0,0,dWater24);
		dK24 = potassiumDef(1,0,0,dWater24);
	}
	if (illDays == 2) {		// >= 3 days illness
		dNa24 = sodiumDef(2,0,0,dWater24);
		dK24 = potassiumDef(2,0,0,dWater24);
	}
	
	
	//  Hyponatremic dehydration, calculate excess Na deficit/loss
	if ((Na < 130) && (Na != "")) {
		//  Excess Na deficit = (desired conc - actual conc) * (distrib factor=0.6 for Na) * weight
		//  Do not correct Na deficit by more than 20 mEq/L per 24 hours.
		
		if ((135 - Na) > 20) {var excessNa = 20 * 0.6 * preWeight} else
			{var excessNa = (135 - Na) * 0.6 * preWeight};
		var otherNa24 = excessNa;
		formVal("otherNa24",otherNa24);
		if (navigator.appName == "Netscape") {form.otherText.value="Excess Na+ Deficit"}
			else {otherText.innerHTML = "Excess Na<sup>+</sup> Deficit"}
		resetVal("otherWater24");
		fluidInfoText += "Hyponatremic dehydration.<br>Correct 1/2 deficit over 8 hours, then 1/2 deficit over 16 hours.<br>Do not correct Na deficit by more than 20 mEq/L/day.<br>"
		if (Na < 120) {
			var moreNa = (120 - Na) * preWeight * 0.6 / 0.513;
			moreNa = roundNum(moreNa,1);
			fluidInfoText += "If pt has hyponatremic seizures, consider "+moreNa+" cc of 3% NS over 60 min until Na=120 mEq/L, and re-calculate.<br>";
		}
	}

	//  Hypernatremic dehydration, calculate free water deficit
	if (Na > 150) {
		/*  Free Water Deficit = [(actual Na - desired Na) / actual Na] * 1000 * 0.6 * weight
		    Solute Fluid Deficit = Total fluid deficit - Free Water deficit
		    Do not correct Na by more than 10 mEq/L per 24 hours
			
			 A new formula to calculate Free Water Deficit is given in NEJM 342(20):1493-99 (May 18,2000):
			 		change Na per liter = (infusate Na - serum Na) / [(TBW = 0.6) + 1]
			 Then, volume to infuse = desired Na change in 24 hrs / change Na per liter
		*/
		
		var freeWater = (Na - 145) * 1000 * 0.6 * preWeight / Na;
		otherWater24 = freeWater;
		
		//  Correct 1/2 the Free Water Deficit in the first 24 hours
		fwWater8 = (freeWater / 2) / 3;
		fwWater16 = (freeWater / 2) * 2/3;
		dWater24 = dWater24 - freeWater;
		dWater8 = dWater24 / 3;
		dWater16 = dWater24 * 2/3;
		
		//  Recalculate Sodium & Potassium Deficit using new "Solute Water" Deficit
		if (illDays == 0) {
			dNa24 = sodiumDef(0,preWeight,percentDehydr,0);
			dK24 = potassiumDef(0,preWeight,percentDehydr,0);
		}
		if (illDays == 1) {		// < 3 days illness
			dNa24 = sodiumDef(1,0,0,dWater24);
			dK24 = potassiumDef(1,0,0,dWater24);
		}
		if (illDays == 2) {		// >= 3 days illness
			dNa24 = sodiumDef(2,0,0,dWater24);
			dK24 = potassiumDef(2,0,0,dWater24);
		}
	
		dNa8 = dNa24 / 3;	
		dNa16 = dNa24 * 2/3;	
		dK8 = dK24 / 3;
		dK16 = dK24 * 2/3;
		formVal("otherWater24",otherWater24); formVal("fwWater8",fwWater8); formVal("fwWater16",fwWater16);
		formVal("dWater24",dWater24); formVal("dWater8",dWater8); formVal("dWater16",dWater16);
	
		if (navigator.appName == "Netscape") {form.otherText.value = "Free Water Deficit"}	
			else {otherText.innerHTML = "Free Water Deficit"}
		resetVal("otherNa24");
		fluidInfoText += "Hypernatremic dehydration.<br>Do not correct Na by more than 10-12 mEq/L/day.<br>Correct hypernatremic dehydration over 48-72 hours.<br>"
	}
	if (((Na >= 130) && (Na <= 150)) || (Na == "")) {
		if (navigator.appName == "Netscape") {form.otherText.value = "Other"}
			else {otherText.innerHTML = "Other"}
		resetVal("otherWater24"); resetVal("otherNa24");
		//Charles Hu, November 20, 2000
		fluidInfoText += "Isonatremic dehydration.<br>Correct 1/2 deficit over 8 hours, then 1/2 deficit over 16 hours.<br>"
	}
	if ((Na <= 150) || (Na == "")) {
		dNa8 = dNa16 = (dNa24 + otherNa24) / 2;
		dK8 = dK16 = (dK24 + otherK24) / 2;
	}
	formVal("dNa24",dNa24); formVal("dNa8",dNa8); formVal("dNa16",dNa16);
	formVal("dK24",dK24); formVal("dK8",dK8); formVal("dK16",dK16);	
} else {
	resetVal("dWater24"); resetVal("dNa24"); resetVal("dK24");
	resetVal("dWater8"); resetVal("dNa8"); resetVal("dK8");
	resetVal("dWater16"); resetVal("dNa16"); resetVal("dK16");
	resetVal("otherWater24"); resetVal("otherNa24");
	resetVal("fwWater8"); resetVal("fwWater16");
}






//  Total Fluids and Electrolytes
	var tWater24 = mWater24 + dWater24 + ongoWater24 + otherWater24;
	var tWater8 = mWater8 + iWater8 + dWater8 + fwWater8;
	var tWater16 = mWater16 + dWater16 + fwWater16;
	formVal("tWater24",tWater24); formVal("tWater8",tWater8); formVal("tWater16",tWater16);
	form.fluids8hr.value = Math.round(tWater8 / 8);
	form.fluids16hr.value = Math.round(tWater16 / 16);

	var tNa24 = mNa24 + dNa24 + ongoNa24 + otherNa24;
	var tNa8 = mNa8 + iNa8 + dNa8;
	var tNa16 = mNa16 + dNa16;
	formVal("tNa24",tNa24); formVal("tNa8",tNa8); formVal("tNa16",tNa16);
//	form.pNa24.value = roundNum((1000*tNa24/tWater24),1);
	form.pNa8.value = roundNum((1000*tNa8/tWater8),1);
	form.pNa16.value = roundNum((1000*tNa16/tWater16),1);

	var tK24 = mK24 + dK24 + ongoK24 + otherK24;
	var tK8 = mK8 + dK8;
	var tK16 = mK16 + dK16;
	formVal("tK24",tK24); formVal("tK8",tK8); formVal("tK16",tK16);
//	form.pK24.value = roundNum((1000*tK24/tWater24),1);
	form.pK8.value = roundNum((1000*tK8/tWater8),1);
	form.pK16.value = roundNum((1000*tK16/tWater16),1);

/*	var tCl24 = mCl24 + iCl + dCl24;
	var tCl8 = mCl8 + iCl8 + dCl8;
	var tCl16 = mCl16 + dCl16;
	formVal("tCl24",tCl24); formVal("tCl8",tCl8); formVal("tCl16",tCl16);

	form.pCl24.value = roundNum((1000*tCl24/tWater24),1);
	form.pCl8.value = roundNum((1000*tCl8/tWater8),1);
	form.pCl16.value = roundNum((1000*tCl16/tWater16),1);
*/

//  Suggested Fluid Text
	var nSaline8 = roundNum(((form.pNa8.value) * 0.9/154),2);
	var nSaline16 = roundNum(((form.pNa16.value) * 0.9/154),2);
	var naText8 = whichSaline(nSaline8);
	var naText16 = whichSaline(nSaline16);
	var pK8 = form.pK8.value;
	var pK16 = form.pK16.value;
	var kSuggest8 = Math.round(pK8/10) * 10;
	var kSuggest16 = Math.round(pK16/10) * 10;

	var fluids8 = "Na<sup>+</sup> = " + nSaline8 + "% NS; K<sup>+</sup> = " + pK8 + " mEq/L<br>";
	fluids8 += "Approx fluids = D<sub>5</sub> " + naText8 + "NS + " + kSuggest8 + " mEq/L KCl";
	var fluids16 = "Na<sup>+</sup> = " + nSaline16 + "% NS; K<sup>+</sup> = " + pK16 + " mEq/L<br>";
	fluids16 += "Approx fluids = D<sub>5</sub> " + naText16 + "NS + " + kSuggest16 + " mEq/L KCl";
	
	if (!ie4) {
		fluids8 = fluids8.replace(/<sup>/g,""); 
		fluids8 = fluids8.replace(/<\/sup>/g,"");
		fluids8 = fluids8.replace(/<sub>/g,""); 
		fluids8 = fluids8.replace(/<\/sub>/g,"");
		fluids8 = fluids8.replace(/&frac14;/g,"1/4-"); 
		fluids8 = fluids8.replace(/&frac12;/g,"1/2-");
		fluids8 = fluids8.replace(/<br>/g,"\n");
		fluids16 = fluids16.replace(/<sup>/g,""); 
		fluids16 = fluids16.replace(/<\/sup>/g,"");
		fluids16 = fluids16.replace(/<sub>/g,""); 
		fluids16 = fluids16.replace(/<\/sub>/g,"");
		fluids16 = fluids16.replace(/&frac14;/g,"1/4-"); 
		fluids16 = fluids16.replace(/&frac12;/g,"1/2-");
		fluids16 = fluids16.replace(/<br>/g,"\n");
		form.fluids8.value = fluids8;
		form.fluids16.value = fluids16;
	} else {
		fluids8Text.innerHTML = fluids8;
		fluids16Text.innerHTML = fluids16;
	}


	if (fluidInfoText == "") {fluidInfoText = "Standard maintenance fluids."};
	if (!ie4) {
		fluidInfoText = fluidInfoText.replace(/<br>/g,"\n");
		form.fluidInfoText.value = fluidInfoText;
	} else {
		fluidInfo.innerHTML = fluidInfoText;
		document.all.testing.style.visibility = "visible";
		document.all.testing.style.display = "block";
	}

	return true;
}

function errorAlert(varText,varName,varNum) {
	if ((varNum <= 0) || (isNaN(parseFloat(varNum)))) {
		alert("Please enter the patient's " + varText + ".");
		eval("document.pediFEN." + varName + ".focus();");
		eval("document.pediFEN." + varName + ".select();");
		return false;
	}
	return true;
}

function newPreweight(weight) {
	var dehydrated = document.pediFEN.dehydrated.selectedIndex;
	
	if (dehydrated == 1) {percentDehydr = .05};
	if (dehydrated == 2) {percentDehydr = .1};
	if (dehydrated == 3) {percentDehydr = .15};
	if (dehydrated == 4) {percentDehydr = .03};
	if (dehydrated == 5) {percentDehydr = .06};
	if (dehydrated == 6) {percentDehydr = .09};

	var preWeight = weight / (1 - percentDehydr);
	document.pediFEN.preWeight.value = roundNum(preWeight,1);
	document.pediFEN.preWtUnits.selectedIndex = 0;
	return preWeight;
}

function getMaint(weight) {
	if (weight - 10 <= 0) {var mWater24 = weight * 100};
	if ((weight - 20 <= 0) && (weight - 10 > 0)) {var mWater24 = 1000 + ((weight - 10) * 50)};
	if (weight - 20 > 0) {var mWater24 = 1500 + ((weight - 20) * 20)};

	return mWater24;
}

function sodiumDef(illDays,preWeight,percentDehydr,dWater24) {
	if (illDays == 0) {dNa24 = 0.8 * preWeight * percentDehydr * 100}
	if (illDays == 1) {		// < 3 days illness
		dNa24 = dWater24 * 0.8 * 145 / 1000;		// Na deficit = fluid defic * (% fluid def from ECF) * (Na conc in ECF)
	}
	if (illDays == 2) {		// >= 3 days illness
		dNa24 = dWater24 * 0.6 * 145 / 1000;		// Na deficit = fluid defic * (% fluid def from ECF) * (Na conc in ECF)
	}
	return dNa24;
}

function potassiumDef(illDays,preWeight,percentDehydr,dWater24) {
	if (illDays == 0) {dK24 = 0.15 * preWeight * percentDehydr * 100}
	if (illDays == 1) {		// < 3 days illness
		dK24 = dWater24 * 0.2 * 150 / 1000;		//  K deficit = fluid defic * (% fluid def from ICF) * (K conc in ICF)
	}
	if (illDays == 2) {		// >= 3 days illness
		dK24 = dWater24 * 0.4 * 150 / 1000;		//  K deficit = fluid defic * (% fluid def from ICF) * (K conc in ICF)
	}
	return dK24;
}

function whichSaline(Na) {
	var naText;
	if (Na <= 0.375) {naText = "&frac14;"}
	if ((Na > 0.375) && (Na <= 0.75)) {naText = "&frac12;"}
//	if (Na <= 0.375) {if (ie4) {naText = "&frac14;"} else chuckhu {naText = "1/4"}}
//	if ((Na > 0.375) && (Na <= 0.75)) {if (ie4) {naText = "&frac12;"} else {naText = "1/2"}}
	if (Na > 0.75) {naText = ""}
	return naText;
}

function resetVal(whatVar) {
	eval("document.pediFEN." + whatVar + ".value = ''");
	return true;
}

function formVal(whatVar,whatNum) {
	eval("document.pediFEN." + whatVar +".value = Math.round(" + whatNum + ")");
	return true;
}

function popWindow(whatHTML) {
	window.open(whatHTML,'newWin','noresizable,noscrollbars=no,height=375,width=500');
}

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