var managerList = null;
var elemSize1=5;
var elemSize2=elemSize1+5;

function initWxObjs()
{
	var frm = document.ui;

	managerList = new managerListObject();

	var obj = new managerObject(frm.drybulb, frm.dbunit, new Temperature(), ioEnum.input, degreeUnitDefs, degreePrecisionDefs);
	managerList.addManager(obj, "drybulb");

	obj = new managerObject(frm.wind, frm.windunit, new Wind(), ioEnum.input, speedUnitDefs, speedPrecisionDefs);
	managerList.addManager(obj, "wind");

	obj = new managerObject(frm.pressure, frm.pressunit, new Pressure(), ioEnum.input, forceUnitDefs, forcePrecisionDefs);
	managerList.addManager(obj, "pressure");

	obj = new managerObject(frm.dewpoint, frm.dpunit, new Temperature(), ioEnum.input, degreeUnitDefs, degreePrecisionDefs);
	managerList.addManager(obj, "dewpoint");

	obj = new managerObject(frm.rh, null, new genericMetVariable(), ioEnum.input, null, genericPrecisionDefs2);
	managerList.addManager(obj, "rh");

	obj = new managerObject(frm.wetbulb, frm.wbunit, new Temperature(), ioEnum.input, degreeUnitDefs, degreePrecisionDefs);
	managerList.addManager(obj, "wetbulb");

	obj = new managerObject(frm.heatidx, frm.heatidxunit, new Temperature(), ioEnum.output, degreeUnitDefs, degreePrecisionDefs);
	managerList.addManager(obj, "heatidx");

	obj = new managerObject(frm.windchill, frm.wcunit, new Temperature(), ioEnum.output, degreeUnitDefs, degreePrecisionDefs);
	managerList.addManager(obj, "windchill");

	obj = new managerObject(frm.saturvp, frm.avpunit, new Pressure(), ioEnum.output, forceUnitDefs2, forcePrecisionDefs2);
	managerList.addManager(obj, "saturvp");

	obj = new managerObject(frm.actualvp, frm.svpunit, new Pressure(), ioEnum.output, forceUnitDefs2, forcePrecisionDefs2);
	managerList.addManager(obj, "actualvp");

	obj = new managerObject(frm.spechum, null, new genericMetVariable(), ioEnum.output, null, genericPrecisionDefs);
	managerList.addManager(obj, "spechum");

	obj = new managerObject(frm.abshum, null, new genericMetVariable(), ioEnum.output, null, genericPrecisionDefs);
	managerList.addManager(obj, "abshum");

	obj = new managerObject(frm.mixratio, null, new genericMetVariable(), ioEnum.output, null, genericPrecisionDefs);
	managerList.addManager(obj, "mixratio");
}

function calcWithDp(ml)
{
	var mlv=ml.values;

	var dryb=mlv.drybulb.getValue(degreeEnum.celsius);
	var dp=mlv.dewpoint.getValue(degreeEnum.celsius);
	var es=calcVaporPressure(dryb);
	var e=calcVaporPressure(dp);

	var havePress=mlv.pressure.hasValue();

	mlv.rh.setValue(calcRelHumidity(e, es));

	mlv.saturvp.setValue(es, forceEnum.mb);
	mlv.actualvp.setValue(e, forceEnum.mb);
	mlv.abshum.setValue(calcAbsHumidity(e, dryb));

	var press = defaultPressure;

	if (havePress)
		press=mlv.pressure.getValue(forceEnum.mb);
	var bulb=calcWetbulb(press, dryb,  dp);
	mlv.wetbulb.setValue(bulb, degreeEnum.celsius);

	mlv.mixratio.setValue(calcMixingRatio(e, press));
	mlv.spechum.setValue(calcSpecHumidity(e, press));
}

function calcWithTemp(ml)
{
	var mlv=ml.values;

	var dryb=mlv.drybulb.getValue(degreeEnum.celsius);
	var es=calcVaporPressure(dryb);
	mlv.saturvp.setValue(es, forceEnum.mb);
}

function validatePrompt (ctrl, prompt)
{
	alert (prompt);
	ctrl.focus();
	ctrl.select();
	return;
}
	
function validateTemp (temp)
{
	if (temp.value.length==0)
	{
		validatePrompt (temp, "Temperature field is required.");
		return false;
	}
	return true;
}

function validateRh (ctrl)
{
	var rh=0+ctrl.value;
	if ((rh < 0) || (rh > 100))
	{
		validatePrompt (ctrl, "Relative Humidity must be between 0 and 100.");
		return false;
	}
	return true;
}

function validateSpeed (ctrl)
{
	if (emptyValue(ctrl.value)) return true;

	var v = parseInt(ctrl.value, 10);
	if (v < 0)
	{
		validatePrompt (ctrl, "Wind speed must be greater than or equal to zero.");
		return false;
	}
	return true;
}

function compute()
{
	var frm=document.ui;

	if (!validateTemp(frm.drybulb)) return;

	if (!validateRh(frm.rh)) return;

	if (!validateSpeed(frm.wind)) return;

	var ml=managerList;
	var mlv=managerList.values;

	var haveTemp=mlv.drybulb.hasValue();
	var haveWind=mlv.wind.hasValue();
	var havePres=mlv.pressure.hasValue();
	var haveDp=mlv.dewpoint.hasValue();
	var haveRh=mlv.rh.hasValue();
	var haveWb=mlv.wetbulb.hasValue();

	if (haveDp || haveRh || haveWb)
	{
		if (haveDp) calcWithDp(ml);
		else
		{
			if (haveRh) calcWithRh(ml);
			else if (havePres) calcWithWb(ml);
		}
		haveDp=true;
		haveRh=true;

		if (havePres) haveWb=true;
	}
	else
		calcWithTemp(ml);

	var temp=mlv.drybulb.getValue(degreeEnum.fahr);
	if (haveWind)
	{
		var wind=mlv.wind.getValue(speedEnum.mph);
		var wc;

		if (temp <= 70)
		{
			wc = calcWindChillF(temp,  wind);
			mlv.windchill.setValue(wc, degreeEnum.fahr);
		}
	}

	if (haveRh)
		if (temp >= 70)
		{
			var rh=mlv.rh.getValue();
			var hi=calcHeatIndex2(temp, rh);
			mlv.heatidx.setValue(hi, degreeEnum.fahr);
		}

	managerList.output();
}

function getFormUnitType()
{
	var frm=document.forms.units;

	if (frm.unitselect[unitTypeEnum.english].checked)
		return unitTypeEnum.english;
	else if (frm.unitselect[unitTypeEnum.metric].checked)
		return unitTypeEnum.metric;

	return unitTypeEnum.scientific;
}

function startup()
{
	initWxObjs();
	var t=getFormUnitType()
	managerList.resetManagers(t);
}

function clearCtrls (curCtrl, ctrl1, ctrl2)
{
	if (curCtrl.value.length==0) return;

	curCtrl.manager.io = ioEnum.input;

	ctrl1.manager.setValue("");
	ctrl1.manager.io = ioEnum.output;

	ctrl2.manager.setValue("");
	ctrl2.manager.io = ioEnum.output;
}