var ns4 = (navigator.appName.indexOf("Netscape")>=0 && !document.getElementById)? 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;

var posNeg;



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

	// alert("thisTag = " + thisTag + "\nnameID = " + nameID + "\nie4 = " + ie4 + "\nw3c = " + w3c);
	return thisTag;	
}

function colorChange(whatID,howChange) {
	whatTag = getLabel(whatID);
	whatTag = eval(whatID);

	if (howChange == 0) {
		if ((!posNeg) || (posNeg == "pos" && whatTag.id == "nLR") || 
(posNeg == "neg" && whatTag.id == "pLR")) whatTag.style.color = "#000000";
	}
	if (howChange == 1) {
		whatTag.style.color = "#ff0000";
	}
	if (howChange == 2) {
		whatTag.style.color = "#ff0000";
		var otherTag;
		if (whatTag.id == "pLR") {
			otherTag = "nLR";
			posNeg = "pos";
			var prev = document.Bayes1.prev.value;
			var plh = document.Bayes2.plh.value;
			if (prev && plh) {
				var postT = calcPostT(prev,plh);
				document.Bayes2.postT.value = rounding(postT,4);
			}
		}
		if (whatTag.id == "nLR") {
			otherTag = "pLR";
			posNeg = "neg";
			var prev = document.Bayes1.prev.value;
			var nlh = document.Bayes2.nlh.value;
			if (prev && nlh) {
				var postT = calcPostT(prev,nlh);
				document.Bayes2.postT.value = rounding(postT,4);
			}
		}

		otherTag = getLabel(otherTag);
		otherTag = eval(otherTag);
		if (otherTag.style.color == "#ff0000") otherTag.style.color = "#000000";
	}


	return;
}

function bayesCalc1(b1) {
	var prev = b1.prev.value;
	var sensit = b1.sens.value;
	var specif = b1.spec.value;

        if ((!checkNum(prev)) || (prev > 1)) {
                alert("WARNING: PREVALENCE must be between 0 and 1!");
                b1.prev.focus();
                b1.prev.select();
                return false
        }

        if ((!checkNum(sensit)) || (sensit > 1)) {
                alert("WARNING: SENSITIVITY must be between 0 and 1!");
                b1.sens.focus();
                b1.sens.select();
                return false
        }

        if ((!checkNum(specif)) || (specif > 1)) {
                alert("WARNING: SPECIFICITY must be between 0 and 1!");
                b1.spec.focus();
                b1.spec.select();
                return false
        }

	var total = 1000;
	var dYes = total * prev;
	var dNo = total - dYes;

	var tp = dYes * sensit;
	var fn = dYes - tp;
	var tn = dNo * specif;
	var fp = dNo - tn;

	var ppv = calcPPV(tp,fp);
	var npv = calcNPV(tn,fn);
	var plh = calcPLH(sensit,specif);
	var nlh = calcNLH(sensit,specif);
	if (posNeg == "pos" || !posNeg) {
		var postT = calcPostT(prev,plh);
	} else {
		var postT = calcPostT(prev,nlh);
	}

	tp = Math.round(tp);
	fn = Math.round(fn);
	tn = Math.round(tn);
	fp = Math.round(fp);

	display(tp,fn,tn,fp,sensit,specif,prev,ppv,npv,plh,nlh,total,postT);
	return true;
}

function bayesCalc2(b2) {
	var tp = b2.tp.value;
	var fn = b2.fn.value;
	var tn = b2.tn.value;
	var fp = b2.fp.value;

        if (!checkNum(tp)) {
                alert("WARNING: Please enter a value for TRUE POSITIVE.");
                b2.tp.focus();
                b2.tp.select();
                return false
        }

        if (!checkNum(fn)) {
                alert("WARNING: Please enter a value for FALSE " +
			"NEGATIVE.");
                b2.fn.focus();
                b2.fn.select();
                return false
        }

        if (!checkNum(fp)) {
                alert("WARNING: Please enter a value for FALSE " +
			"POSITIVE.");
                b2.fp.focus();
                b2.fp.select();
                return false
        }

        if (!checkNum(tn)) {
                alert("WARNING: Please enter a value for TRUE NEGATIVE.");
                b2.tn.focus();
                b2.tn.select();
                return false;
        }

	tp = Number(tp);
	tn = Number(tn);
	fp = Number(fp);
	fn = Number(fn);

	var total = tp + fn + tn + fp;

	var sensit = tp / (tp + fn);
	var specif = tn / (tn + fp);
	var prev = (tp + fn) / total;

	var ppv = calcPPV(tp,fp);
	var npv = calcNPV(tn,fn);
	var plh = calcPLH(sensit,specif);
	var nlh = calcNLH(sensit,specif);
	if (posNeg == "pos" || !posNeg) {
		var postT = calcPostT(prev,plh);
	} else {
		var postT = calcPostT(prev,nlh);
	}

	display(tp,fn,tn,fp,sensit,specif,prev,ppv,npv,plh,nlh,total,postT);
	return true;
}

function calcPPV(tp,fp) {
	ppv = tp / (tp + fp);
	return ppv;
}

function calcNPV(tn,fn) {
	npv = tn / (fn + tn);
	return npv;
}

function calcPLH(sensit,specif) {
	plh = sensit / (1 - specif);
	return plh;
}

function calcNLH(sensit,specif) {
	nlh = (1 - sensit) / specif;
	return nlh;
}

function calcPostT(preT,plh) {
// function calcPostT(preT,plh,posNeg) {
	var preOdds = preT / (1 - preT);
	var postOdds = preOdds * plh;
	var postT = postOdds / (1 + postOdds);

	var postText = getLabel("postTText");
	postText = eval(postText);

	if (posNeg == "pos") {
		postText.style.display = "";
		postText.innerHTML = "(Pos Predict Value)";
	} else if (posNeg == "neg") {
		postText.style.display = "";
		postText.innerHTML = "(1 - Neg Predict Value)";
	}

	return postT;
}

function display(tp,fn,tn,fp,sensit,specif,prev,ppv,npv,plh,nlh,total,postT) {
	document.Bayes1.prev.value = rounding(prev,4);
	document.Bayes1.sens.value = rounding(sensit,4);
	document.Bayes1.spec.value = rounding(specif,4);

	document.Bayes2.tp.value = rounding(tp,4);
	document.Bayes2.fn.value = rounding(fn,4);
	document.Bayes2.tn.value = rounding(tn,4);
	document.Bayes2.fp.value = rounding(fp,4); 

	document.Bayes2.total.value = "N = " + total;

	document.Bayes2.ppv.value = rounding(ppv,4);
	document.Bayes2.npv.value = rounding(npv,4);
	document.Bayes2.plh.value = rounding(plh,4);
	document.Bayes2.nlh.value = rounding(nlh,4);

	document.Bayes2.preT.value = rounding(prev,4);
	document.Bayes2.postT.value = rounding(postT,4);
}


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


function rounding(number,decimal) {
        multiplier = Math.pow(10,decimal);
        number = Math.round(number * multiplier) / multiplier;
        return number
}
