var CALC_WIDTH=700

// Calculators Array
	var IDX_CAL_NAME=0		// 	Name
	var IDX_CAL_DESC=1		//	Description
	var IDX_CAL_HELP=2		//	Help
	var IDX_CAL_FIELDS=3		//	Fields Array
		var IDX_FLD_CODE1=0	//		-Code1 OBR
		var IDX_FLD_CODE2=1	//		-Code2 OBX - if blank, then it's expected to be filled in manully
		var IDX_FLD_NAME=2	//		-Name
		var IDX_FLD_UNITS=3	//		-Units
		var IDX_FLD_MINRANGE=4	//		-RangeMin
		var IDX_FLD_MAXRANGE=5	//		-RangeMax
		var IDX_FLD_TYPE=6	//		-0= data, 1=result
		var IDX_FLD_VALID=7	//		-0=invalid (out of range or not set), 1=valid
		var IDX_FLD_PRECISION=8	//		-Presision (for result fields only)
	var IDX_CAL_NOTES=4		//	Notes
	var IDX_CAL_RESMINRANGE=5	//	Result Min Range - if either range is numeric, then value must be numeric
	var IDX_CAL_RESMAXRANGE=6	//	Result Max Range
	var IDX_CAL_RESUNITS=7		//	Result UNITS
	var IDX_CAL_FORM=8		//	Form
	var IDX_CAL_DIV=9		//	Calculator Division panel
	var IDX_CAL_CVIS=10		//	Calculator is Visible flag
	var IDX_CAL_CALCFUNC=11		//	Calculate/Compute Func
	var IDX_CAL_HVIS=12		//	Help is Visible flag
	var IDX_CAL_HELPDIV=13		//	Help DIV panel
	var IDX_CAL_PRECISION=14	//	Result Precsion (significant decimal places)
	var IDX_CAL_BUILDFUNC=15	//	Calculator Build Function
	var IDX_CAL_INDEX=16		//	Save This Calculators array index


var nCalculators = 0;
var Calculators = new Array ();


function BuildCalculatorHead(calcIndex,CalcFormName) {
	var CalcDef = Calculators[calcIndex];
	var text="";
	// Build Calculator Title
	text=text+ "<A NAME='#"+CalcFormName+"'>"
	text=text+ "<TABLE BORDER=0 CELLSPACING=0 WIDTH="+CALC_WIDTH+">"
	text=text+ "<TR CLASS=c_t_header>"
	text=text+ "<TD CLASS=c_tl_header></TD>"
	text=text+ "<TD CLASS=c_header ALIGN=LEFT ROWSPAN=2><FONT style='font-size:11px;'>"
	text=text+ "<A HREF='#"+CalcFormName+"' onClick='showHideCalculator("+CalcFormName+",\"t\")'><IMG SRC=images/sm_calculator.gif BORDER=0 ALIGN=MIDDLE>"
	text=text+ "<B>Calculator: "+CalcDef[IDX_CAL_NAME]+"</A></TD>"
	text=text+ "<TD CLASS=c_header ALIGN=RIGHT ROWSPAN=2>"
	text=text+ "<A HREF='#"+CalcFormName+"' onClick='showHideHelp("+calcIndex+",\"t\")'><IMG SRC=images/help.gif BORDER=0></A></TD>"
	text=text+ "<TD CLASS=c_tr_header></TD>"
	text=text+ "</TR><TR CLASS=c_t_header>"
	text=text+ "<TD CLASS=c_bl_header></TD><TD CLASS=c_br_header></TD></TR></TABLE>"

	// Build Help Bubble
	text=text+ "<DIV CLASS='helpstyle' ID='divHelp"+CalcFormName+"'><TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>"
	text=text+ "<TR><TD CLASS=c_tl_help></TD><TD CLASS=c_help></TD><TD CLASS=c_tr_help WIDTH=12 HEIGHT=12></TD></TR>"
	text=text+ "<TR><TD CLASS=c_help>&nbsp;</TD><TD CLASS=c_help>"+CalcDef[IDX_CAL_HELP]
	text=text+ "<BR><BR><INPUT TYPE=TEXT SIZE=4 style='background:pink' VALUE='PINK' READONLY>fields are either out of range or missing.</TD><TD CLASS=c_help>&nbsp;</TD></TR>"
	text=text+ "<TR><TD CLASS=c_help>&nbsp;</TD><TD CLASS=c_help><CENTER><INPUT TYPE=BUTTON VALUE='Close' onClick='showHideHelp("+calcIndex+",0)'></TD><TD CLASS=c_help>&nbsp;</TD></TR>"
	text=text+ "<TR><TD CLASS=c_bl_help></TD><TD CLASS=c_help></TD><TD CLASS=c_br_help></TD></TR>"
	text=text+ "</TABLE></DIV>"
	return text;
}

function showHideHelp(calcIndex,state) {
	var calcDef = Calculators[calcIndex];
        if((state=="t" && calcDef[IDX_CAL_HVIS]==0) || state==1) {
                calcDef[IDX_CAL_HVIS]=1;
                calcDef[IDX_CAL_HELPDIV].style.display='';
        }
        else {
                calcDef[IDX_CAL_HVIS]=0;
                calcDef[IDX_CAL_HELPDIV].style.display='None';
        }
}

function BuildCalculatorField(calcIndex,FieldIndex) {
	var CalcDef = Calculators[calcIndex];
	var CalFlds = CalcDef[IDX_CAL_FIELDS];
	var text="";
	text=text+ "<TD CLASS='fieldstyle' ALIGN=CENTER>"+CalFlds[FieldIndex][IDX_FLD_NAME]+"<BR><INPUT TYPE=TEXT SIZE=8 NAME='"+CalFlds[FieldIndex][IDX_FLD_CODE2]+"' VALUE='' onChange='ComputeCalculator("+calcIndex+")' style='background:lightblue'><BR>"
	text=text+ CalFlds[FieldIndex][IDX_FLD_UNITS]+"</TD>"

	return text;
}

function BuildCalculatorResultField(calcIndex,FieldIndex) {
        var CalcDef = Calculators[calcIndex];
	var formname='Result';
	if(FieldIndex != "") {
		var CalFlds = CalcDef[IDX_CAL_FIELDS];
		var min=CalFlds[FieldIndex][IDX_FLD_MINRANGE];
		var max=CalFlds[FieldIndex][IDX_FLD_MAXRANGE];
		var units=CalFlds[FieldIndex][IDX_FLD_UNITS];
		var name=CalFlds[FieldIndex][IDX_FLD_NAME];
		var formname=formname+FieldIndex;
	}
	else {
		var min=CalcDef[IDX_CAL_RESMINRANGE];
		var max=CalcDef[IDX_CAL_RESMAXRANGE];
		var units=CalcDef[IDX_CAL_RESUNITS];
		var name=CalcDef[IDX_CAL_DESC];
	}
        var text="";
        text=text+ "<TD CLASS='equstyle' ALIGN=CENTER><FONT COLOR=BLUE><CENTER>=</TD>"
        text=text+ "<TD CLASS='fieldstyle'>"+name+"<BR>"
	text=text+ "<INPUT TYPE=TEXT NAME='"+formname+"' VALUE='' READONLY SIZE=10 style='background:lightgrey'>"
	if(FieldIndex != "") text=text+ units+" "
	if(min!="" && max!="") {
		text=text+ "Range:("+min
		if(min=="") text=text+" < "
		else if(max=="") text=text+" > "
		else text=text+" - "
		text=text+max+")"
	}
	if(FieldIndex == "") text=text+ "<BR>"+units
	else 		     text=text+ "<BR>&nbsp;"
	text=text+"</TD>"

        return text;
}

function BuildCalculatorTail(CalcDef) {
	var text="";

	text=text+ "<TR CLASS=c_t_body>"
	text=text+ "<TD CLASS=c_bl_body>&nbsp;</TD><TD CLASS=c_body>"+CalcDef[IDX_CAL_NOTES]+"</TD><TD CLASS=c_br_body>&nbsp;</TD></TR>"

	return text;
}

//
//	Check Value between Range
//
function CheckReferenceRange(Val,Min,Max) {
	// If either Min or Max are numbers but Val is non blank and not a number, then return false.
	if((!isNaN(parseFloat(Min)) || !isNaN(parseFloat(Max))) && Val!="" && isNaN(parseFloat(Val))) 
		return false;
	// check if val is between min and max.
	if( ((Min != "") && (parseFloat(Val) < parseFloat(Min))) || ((Max != "") && (parseFloat(Val) > parseFloat(Max))) )
		return false;
	return true;
}

//
//	Calculator Utility FUnctions
//
function ComputeCalculator(calcIndex) {

	ValidateCalculatorFields(calcIndex);

	var result= Calculators[calcIndex][IDX_CAL_CALCFUNC](Calculators[calcIndex]);
}

function SetCalculatorResult(calcIndex,result,ResFldIndex) {
	var calcDef=Calculators[calcIndex];
	var calcForm=calcDef[IDX_CAL_FORM];
        var calcFlds=calcDef[IDX_CAL_FIELDS];

	if(ResFldIndex == '') {
		var fld = calcForm.Result;
		var min = calcDef[IDX_CAL_RESMINRANGE];
		var max = calcDef[IDX_CAL_RESMAXRANGE];
		var p = Calculators[calcIndex][IDX_CAL_PRECISION];
	}
	else {
		var fld = calcForm.elements[ResFldIndex];
		var min = calcFlds[ResFldIndex][IDX_FLD_MINRANGE];
		var max = calcFlds[ResFldIndex][IDX_FLD_MAXRANGE];
		var p = calcFlds[ResFldIndex][IDX_FLD_PRECISION];
		calcFlds[ResFldIndex][IDX_FLD_VALID]=0;	// Assume it's invalid
	}

	if(result == "") {			// If no result, set to blank (grey).
		fld.value=""
                fld.style.background='lightgrey';
                return;
	}
	result=Math.round(result * Math.pow(10,p))/Math.pow(10,p);
	if(!isNaN(parseFloat(result)) && CheckReferenceRange(result,min,max)) {
		fld.style.background='lightgreen';
		if(ResFldIndex != '') calcFlds[ResFldIndex][IDX_FLD_VALID]=1;
	}
	else {
		fld.style.background='pink';
		result=result+" *";
	}
	if(isNaN(parseFloat(result))) result="SeekAdvice";
	fld.value=result;
}

function ValidateCalculatorFields(calcIndex) {
	var calcDef=Calculators[calcIndex];
	var calcForm=calcDef[IDX_CAL_FORM];
	var calcFlds=calcDef[IDX_CAL_FIELDS];
	var invalid=0

	for(var i=0; i<calcFlds.length; i++) {
	    if(calcFlds[i][IDX_FLD_TYPE] != 0) continue;		// Only validate Data fields (type = 0)
	    calcFlds[i][IDX_FLD_VALID]=0;				// Assume it's invalid

	    if(!CheckReferenceRange(calcForm.elements[i].value,calcFlds[i][IDX_FLD_MINRANGE],calcFlds[i][IDX_FLD_MAXRANGE])) {
		calcForm.elements[i].style.background='pink';
		calcForm.elements[i].focus();
		alert("Calculator "+calcDef[IDX_CAL_NAME]+" Field: "+calcFlds[i][IDX_FLD_NAME]+" "+calcForm.elements[i].value+" is out of range ("+calcFlds[i][IDX_FLD_MINRANGE]+" - "+calcFlds[i][IDX_FLD_MAXRANGE]+")")
		invalid++;
   	    }
	    else if(calcForm.elements[i].value=="") {
		calcForm.elements[i].style.background='pink';
		invalid++;
	    }
	    else {
		calcForm.elements[i].style.background='lightblue';
		calcFlds[i][IDX_FLD_VALID]=1;
	    }
	}
	return (invalid==0);
}

// state = t for toggle, 0 = hide, 1 = show
function showHideCalculator(Calc,state) {
	var calcDef=Calculators[Calc.calcIndex.value];
	if((state=="t" && calcDef[IDX_CAL_CVIS]==0) || state==1) {
		calcDef[IDX_CAL_CVIS]=1;
		calcDef[IDX_CAL_DIV].style.display='';
	}
	else {
		calcDef[IDX_CAL_CVIS]=0;
		calcDef[IDX_CAL_DIV].style.display='None';
	}
}

//
// Set up the calculators' fields to provided Data values.
//	if Data is missing, fields are reset to blank.
function SetCalculatorFields(Calc, Data) {
	var c
	var found
	var matchingFields=0
	var missingFields=0

	var calcDef=Calculators[Calc.calcIndex.value];
	var calcFlds=calcDef[IDX_CAL_FIELDS];

	for (var f=0; f<calcFlds.length; f++ ) {
	// search the data for a matching code and fill in form if found
	    if(Data) { 
		for (c=0, found=0; c<Data[IDX_BIO_RESULTS].length && found==0; c++) {
			if(Data[IDX_BIO_RESULTS][c][IDX_RES_CODE2]==calcFlds[f][IDX_FLD_CODE2]) found=1
		}
		if(found){
			Calc.elements[f].value=Data[IDX_BIO_RESULTS][c-1][IDX_RES_VAL]; 
			Calc.elements[f].readOnly=true;
			matchingFields++;
		}
		else {
			Calc.elements[f].value="";
			Calc.elements[f].readOnly=false;
			if(calcFlds[f][IDX_FLD_CODE2] != "") missingFields++;
		}
	    }
	    else {	// If no data, just leave blank
		Calc.elements[f].value="";
		Calc.elements[f].readOnly=false;
		if(calcFlds[f][IDX_FLD_CODE2] != "") missingFields++;
	    }
	}
	//return (matchingFields>0);	// return true if at least one field matches
	return (missingFields==0);	// return true if no missing fields
}

function SetupAllCalculators(Calculators,Data) {
	for (var i=0;i<Calculators.length; i++) {
		if(!SetCalculatorFields(Calculators[i][IDX_CAL_FORM],Data))	
			showHideCalculator(Calculators[i][IDX_CAL_FORM],0);	// hide the calculator if not all fields are present
		else showHideCalculator(Calculators[i][IDX_CAL_FORM],1);
		if(Data) ComputeCalculator(i);
	}
}
