/*

JavaScript:  Framingham Heart Disease Risk Calculator
February 28, 1999

This calculator was created by Charles Hu for the Medical College of
Wisconsin General Internal Medicine Clinic.  This calculator may not be
copied without consent from the author.  Please contact him at
chuckhu@hotmail.com

*/

function riskCalc(form,complete) {
	var age = form.age.value;
	var sbp = form.sbp.value;
	var dbp = form.dbp.value;
	var chol = form.ldlchol.selectedIndex;
	var cholnum = form.cholnum.value;
	var hdl = form.hdl.value;

	var agerf, smokerf, smokerr, dmrf, dmrr, bprf, bprr
	var cholrf, cholrr, hdlrf, hdlrr, sbppt, dbppt, chdrisk
	var avgrisk, lowrisk

//  Check sex
	if (form.sex[0].checked) {
		var sex = "male"
	} else {
		if (form.sex[1].checked) {
		var sex = "female"
		} else {
			alert("Please select your sex.");
			return false
		}
	}

//  Check age
	if (age == "pi") {alert("Pi = 3.14159265358979323...");
		  alert("This calculator was written by Charles Hu.")};

	if (!checkNum(age)) {
		alert("Please enter your age.");
		form.age.select();
		form.age.focus();
		return false
	}

	if ((age < 30) || (age > 74)) {
		if (!confirm("Results are ONLY applicable between the " +
		"ages of 30 and 74.  Do you still want to proceed?")) {
			form.age.select();
			form.age.focus();

			form.agerf.value = "";
			form.smokerf.value = "";
			form.smokerr.value = "";
			form.dmrf.value = "";
			form.dmrr.value = "";
			form.bprf.value = "";
			form.bprr.value = "";
			form.cholrf.value = "";
			form.cholrr.value = "";
			form.hdlrf.value = "";
			form.hdlrr.value = "";
			form.totalpts.value = "";
			form.chdrisk.value = "";
			form.avgrisk.value = "";
			form.lowrisk.value = "";

			return false
		}
	}

//  Check smoking
	if (form.smoke[0].checked) {
		var smoke = "yes"
	} else {
		if (form.smoke[1].checked) {
		var smoke = "no"
		} else {
			alert("Do you smoke?");
			return false
		}
	}


//  Check diabetes
	if (form.dm[0].checked) {
		var dm = "yes"
	} else {
		if (form.dm[1].checked) {
		var dm = "no"
		} else {
			alert("Do you have diabetes?");
			return false
		}
	}

if (complete == 1) {
//  Check blood pressure
	if (!checkNum(sbp)) {
		alert("Please enter your systolic blood pressure.");
		form.sbp.focus();
		form.sbp.select();
		return false
	}

	if (!checkNum(dbp)) {
		alert("Please enter your diastolic blood pressure.");
		form.dbp.focus();
		form.dbp.select();
		return false
	}


//  Check cholesterol
	if (chol < 2) {
		alert("Please select a cholesterol.");
		form.ldlchol.focus();
		return false
	}

	if (chol == 2) 	{var whatChol = "total"}
		else	{var whatChol = "LDL"}

	if (!checkNum(cholnum)) {
		alert("Please enter your " + whatChol + " cholesterol.")
		form.cholnum.select();
		form.cholnum.focus();
		return false
	}

	if (!checkNum(hdl)) {
		alert("Please enter your HDL cholesterol.")
		form.hdl.focus();
		form.hdl.select();
		return false
	}
}


//  Calculate risks

//  Sex Risks
	if (sex == "male") {
		agerf = Math.floor((age-35)/5);

		if (age < 35) {agerf = -1}
		if (age >=70) {agerf = 7}
	}

	if (sex == "female") {
		if (age < 35) {agerf = -9}
		if ((age >=35) && (age < 40)) {agerf = -4}
		if ((age >=40) && (age < 45)) {agerf = 0}
		if ((age >=45) && (age < 50)) {agerf = 3}
		if ((age >=50) && (age < 55)) {agerf = 6}
		if ((age >=55) && (age < 60)) {agerf = 7}
		if (age >=60) {agerf = 8}
	}

	form.agerf.value = agerf;


//  Smoking risks
	if (smoke == "yes") {
		smokerf = 2;
		smokerr = "High"
	} else {
		smokerf = 0;
		smokerr = "Low"
	}

	form.smokerf.value = smokerf;
	form.smokerr.value = smokerr;


//  Diabetes risks
	if (dm == "yes") {
		dmrr = "High"
		if (sex == "female") {dmrf = 4}
			else {dmrf = 2}
	} else {
		dmrf = 0;
		dmrr = "Low"
	}

	form.dmrf.value = dmrf;
	form.dmrr.value = dmrr;


//  Blood Pressure risks

if ((checkNum(sbp)) && (checkNum(dbp))) {
	if (dbp < 85) {dbppt = 0}
	if ((dbp >=85) && (dbp < 90)) {dbppt = 1}
	if ((dbp >=90) && (dbp < 100)) {dbppt = 2}
	if (dbp >=100) {dbppt = 3}

	if (sbp < 130) {sbppt = 0}
	if ((sbp >=130) && (sbp < 140)) {sbppt = 1}
	if ((sbp >=140) && (sbp < 160)) {sbppt = 2}
	if (sbp >= 160) {sbppt = 3}

	//  Which gives more points?
	bprf = Math.max(sbppt,dbppt);


	if (bprf == 0) {
		if ((sbp < 120) && (dbp < 80)) {
			bprr = "Very Low"
		} else {
			bprr = "Low"
		}
	}
	if (bprf == 1) {bprr = "Moderate"}
	if (bprf == 2) {bprr = "High"}
	if (bprf == 3) {bprr = "Very High"}

	form.bprf.value = bprf;
	form.bprr.value = bprr;
} else {
	form.sbp.value = "";
	form.dbp.value = "";
	form.bprf.value = "";
	form.bprr.value = "";
}


//  Cholesterol risks

if ((chol > 1) && (checkNum(cholnum))) {
if (sex == "male") {
	if ((whatChol == "ldl") || (chol == 3)) {
		if (cholnum < 100) {
			cholrf = -3;
			cholrr = "Very Low"
		}
		if ((cholnum >= 100) && (cholnum < 160)) {
			cholrf = 0;
			if (cholnum < 130) {cholrr = "Low"}
				else {cholrr = "Moderate"}
		}
		if ((cholnum >= 160) && (cholnum < 190)) {
			cholrf = 1;
			cholrr = "High"
		}
		if (cholnum >= 190) {
			cholrf = 2;
			cholrr = "Very High"
		}
	} else {	//  For Total Cholesterol...

		if (cholnum < 160) {
			cholrf = -3;
			cholrr = "Very Low"
		}
		if ((cholnum >= 160) && (cholnum < 200)) {
			cholrf = 0;
			cholrr = "Low"
		}
		if ((cholnum >= 200) && (cholnum < 240)) {
			cholrf = 1;
			cholrr = "Moderate"
		}
		if ((cholnum >= 240) && (cholnum < 280)) {
			cholrf = 2;
			cholrr = "High"
		}
		if (cholnum >= 280) {
			cholrf = 3;
			cholrr = "Very High"
		}
	}
} else {		//  For females...

	if ((whatChol == "ldl") || (chol == 3)) {
		if (cholnum < 100) {
			cholrf = -2;
			cholrr = "Very Low"
		}
		if ((cholnum >= 100) && (cholnum < 160)) {
			cholrf = 0;
			if (cholnum < 130) {cholrr = "Low"}
				else {cholrr = "Moderate"}
		}
		if (cholnum >= 160) {
			cholrf = 2;
			if (cholnum < 190) {cholrr = "High"}
				else {cholrr = "Very High"}
		}
	} else {	//  For Total Cholesterol...chuckhu

		if (cholnum < 160) {
			cholrf = -2;
			cholrr = "Very Low"
		}
		if ((cholnum >= 160) && (cholnum < 200)) {
			cholrf = 0;
			cholrr = "Low"
		}
		if ((cholnum >= 200) && (cholnum < 280)) {
			cholrf = 1;
			if (cholnum < 240) {cholrr = "Moderate"}
				else {cholrr = "High"}
		}
		if (cholnum >= 280) {
			cholrf = 3;
			cholrr = "Very High"
		}
	}
}
	form.cholrf.value = cholrf;
	form.cholrr.value = cholrr
} else {
	form.ldlchol.selectedIndex = 0;
	form.cholnum.value = "";
	form.cholrf.value = "";
	form.cholrr.value = ""
}


//  HDL risks
if (checkNum(hdl)) {
if (sex == "male") {
	if (hdl < 35) {
		hdlrf = 2;
		hdlrr = "Very High"
	}
	if ((hdl >=35) && (hdl < 45)) {
		hdlrf = 1;
		hdlrr = "High"
	}
	if ((hdl >= 45) && (hdl < 60)) {
		hdlrf = 0;
		if (hdl < 50) {hdlrr = "Moderate"}
			else {hdlrr = "Low"}
	}
	if (hdl >= 60) {
		hdlrr = "Very Low"
		if (chol == 3) {hdlrf = -1}	// If LDL's were also done
			else {hdlrf = -2}
	}
} else {		//  For women...

	if (hdl < 35) {
		hdlrf = 5;
		hdlrr = "Very High"
	}
	if ((hdl >=35) && (hdl < 45)) {
		hdlrf = 2;
		hdlrr = "High"
	}
	if ((hdl >= 45) && (hdl < 50)) {
		hdlrf = 1;
		hdlrr = "Moderate"
	}
	if ((hdl >= 50) && (hdl < 60)) {
		hdlrf = 0;
		hdlrr = "Low"
	}
	if (hdl >= 60) {
		hdlrr = "Very Low"
		if (chol == 3) {hdlrf = -2}	// If LDL's were also done
			else {hdlrf = -3}
	}
}
	form.hdlrf.value = hdlrf;
	form.hdlrr.value = hdlrr
} else {
	form.hdl.value = "";
	form.hdlrf.value = "";
	form.hdlrr.value = ""
}


//  Calculate Point Total
	if (isNaN(bprf)) {bprf = 0}
	if (isNaN(cholrf)) {cholrf = 0}
	//isNaN(chuckhu@mcw.edu) = 0
	if (isNaN(hdlrf)) {hdlrf = 0}

	totalpts = agerf + smokerf + dmrf + bprf + cholrf + hdlrf;
	form.totalpts.value = totalpts;


//  Find 10-Year Risk
if (sex == "male") {
	for (var gg=0; gg < 16; gg++) {
		if (totalpts == menchd[gg][0]) {
			if (chol == 3) {	// LDL risk
				chdrisk = menchd[gg][1]
			} else {		// chol risk
				chdrisk = menchd[gg][2]
			}
		break
		}
	}
	if ((totalpts <= -3) && (chol==3)) {chdrisk = 1}
				// Minimum risk for lowest LDL points
	if ((totalpts >= 14) && (chol==3)) {chdrisk = "> 56"}
				// Maximum risk for highest LDL points
	if ((totalpts <= -1) && (chol==2)) {chdrisk = 2}
				// Minimum risk for lowest chol points
	if ((totalpts >= 14) && (chol==2)) {chdrisk = "> 53"}
				// Maximum risk for highest chol points

	//  Male average & low risk
	gh = Math.floor((age - 30) / 5);
	if (gh < 0) {gh = 0}
	if (gh > 8) {gh = 8}

	avgrisk = avgmrisk[gh][0];
	lowrisk = avgmrisk[gh][1];

} else {	//  Risks for women...

	for (var gg=0; gg < 20; gg++) {
		if (totalpts == femchd[gg][0]) {
			if (chol == 3) {	// LDL risk
				chdrisk = femchd[gg][1]
			} else {		// chol risk
				chdrisk = femchd[gg][2]
			}
		break
		}
	}
	if (totalpts < -2) {chdrisk = 1}
				// Minimum risk for lowest points
	if ((totalpts > 17) && (chol==3)) {chdrisk = "> 32"}
				// Maximum risk for highest LDL points
	if ((totalpts > 17) && (chol==2)) {chdrisk = "> 27"}
				// Maximum risk for highest chol points

	//  Female average & low risk
	gh = Math.floor((age - 30) / 5);
	if (gh < 0) {gh = 0}
	if (gh > 8) {gh = 8}

	avgrisk = avgfrisk[gh][0];
	lowrisk = avgfrisk[gh][1];
}

	form.chdrisk.value = chdrisk;
	form.avgrisk.value = avgrisk;
	form.lowrisk.value = lowrisk;

	return true;
}


//  An array of CHD risk factors for men
//  menchd[x] = [points, ldlrisk, cholrisk]

menchd = new Array(16)
for (var g=0; g < 16; g++) {
	menchd[g] = new Array(2)
}

menchd[0] = [-2,2,2]
menchd[1] = [-1,2,2]
menchd[2] = [0,3,3]
menchd[3] = [1,4,3]
menchd[4] = [2,4,4]
menchd[5] = [3,6,5]
menchd[6] = [4,7,7]
menchd[7] = [5,9,8]
menchd[8] = [6,11,10]
menchd[9] = [7,14,13]
menchd[10] = [8,18,16]
menchd[11] = [9,22,20]
menchd[12] = [10,27,25]
menchd[13] = [11,33,31]
menchd[14] = [12,40,37]
menchd[15] = [13,47,45]


//  An array of average CHD risk factors for men
//  avgmrisk[x] = [avgrisk, lowrisk]

avgmrisk = new Array(9)
for (g=0; g < 9; g++) {
	avgmrisk[g] = new Array(1)
}

avgmrisk[0] = [3,2]
avgmrisk[1] = [5,3]
avgmrisk[2] = [7,4]
avgmrisk[3] = [11,4]
avgmrisk[4] = [14,6]
avgmrisk[5] = [16,7]
avgmrisk[6] = [21,9]
avgmrisk[7] = [25,11]
avgmrisk[8] = [30,14]



//  An array of CHD risk factors for women
//  femchd[x] = [points, ldlrisk, cholrisk]

femchd = new Array(20)
for (var g=0; g < 20; g++) {
	femchd[g] = new Array(2)
}

femchd[0] = [-2,1,1]
femchd[1] = [-1,2,2]
femchd[2] = [0,2,2]
femchd[3] = [1,2,2]
femchd[4] = [2,3,3]
femchd[5] = [3,3,3]
femchd[6] = [4,4,4]
femchd[7] = [5,5,4]
femchd[8] = [6,6,5]
femchd[9] = [7,7,6]
femchd[10] = [8,8,7]
femchd[11] = [9,9,8]
femchd[12] = [10,11,10]
femchd[13] = [11,13,11]
femchd[14] = [12,15,13]
femchd[15] = [13,17,15]
femchd[16] = [14,20,18]
femchd[17] = [15,24,20]
femchd[18] = [16,27,24]
femchd[19] = [17,32,27]


//  An array of average CHD risk factors for women
//  avgfrisk[x] = [avgrisk, lowrisk]

avgfrisk = new Array(9)
for (g=0; g < 9; g++) {
	avgfrisk[g] = new Array(1)
}

avgfrisk[0] = ["< 1","< 1"]
avgfrisk[1] = ["< 1",1]
avgfrisk[2] = [2,2]
avgfrisk[3] = [5,3]
avgfrisk[4] = [8,5]
avgfrisk[5] = [12,7]
avgfrisk[6] = [12,8]
avgfrisk[7] = [13,8]
avgfrisk[8] = [14,8]



function checkNum(val) {
	if ((val == null) || (isNaN(val)) || (val == "") || (val < 0)) {
		return false
	}
	return true;
}
