// variable to hold all the info we need to operate a production page
var dsInfo;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// general utility functions
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function getStart(sysId) { return eval('startDate' + sysId + '().toLocaleString()'); }
function getStop(sysId) { return eval('endDate' + sysId + '().toLocaleString()'); }
function setStart(sysId, val) { eval('setStartDate' + sysId + '(val)'); }
function setStop(sysId, val) { eval('setEndDate' + sysId + '(val)'); }
function _Object(objId)
{ // an overloaded _getObject() function *specific to the production page html layout*
  // designed to help speed up retrieval of object references after updating to .NET 2.0
    var obj = (typeof document.getElementById != 'undefined') ? document.getElementById(objId) : null;
    if(! isValid(obj))
        obj = _getObject('_ctl0__ctl0_bodyContent_bodyContent_' + objId);
    if(! isValid(obj))
        obj = _getObject(objId);
    return obj;
}
function _setVis(objName, isVisible, useDisplayProperty)
{
    _setVisibility('_ctl0__ctl0_bodyContent_bodyContent_' + objName, isVisible, useDisplayProperty);
}
function CustomException(message, value) { this.message = message; this.name = "CustomException"; }
function handleException(src, ex)
{
	stopSubmitting();
	var msg = new String('An exception has occurred within the Production form client-side JavaScript.\nPlease contact a system administrator if the problem persists.');
	msg += '\nException occurred in "' + src + '"';
	if(isValid(ex))
		msg += '\n\nException ' + (ex.number & 0xFFFF).toString() + ': ' + ex.message;
	alert(msg);
}
function formatNumber(n, numDecimals)
{
	var d = 2;
	if(isValid(numDecimals)) { d = numDecimals; }
	var s = new String();
	if(isValid(n))
	{
		if(! isNaN(n) )
		{
			if(isValid(n.toFixed)) { s = n.toFixed(d); }
			else { s = n.toString(); }
		}
	}
	return s;
}
function formatDate(objDate)
{
	var s = new String();
	if(isValid(objDate))
	{
		var dat = (objDate.getMonth() + 1).toString() + '/' + objDate.getDate() + '/' + getFY(objDate) + ' ';
		var h = objDate.getHours(); var ap = 'AM';
		if(parseInt(h) >= 12)
		{
			ap = 'PM';
			if(parseInt(h) > 12) { h -= 12; }
		}
		else if(parseInt(h) == 0)
			h = 12;
		var m = objDate.getMinutes();
		if(parseInt(m) < 10) { m = '0' + m.toString(); }
		s = dat + h + ':' + m + ' ' + ap;
	}
	return s;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// event handlers specific to the production form
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function Exclude_OnClick(sysId)
{
	var chk = _Object('chkExclude' + sysId);
	if(isValid(chk))
	{
		_setVis('pnlSubSystems' + sysId, ! chk.checked);
		_setVis('tblSystem' + sysId, ! chk.checked);
		
		var obj = _Object('pnlSubSystems' + sysId);
		if(isValid(obj) && isValid(obj.style))
			obj.style.display = (chk.checked ? 'none' : 'block');
		obj = _Object('tblSystem' + sysId);
		if(isValid(obj) && isValid(obj.style))
			obj.style.display = (chk.checked ? 'none' : 'block');
		obj = _Object('pnlTotalTons' + sysId);
		if(isValid(obj) && isValid(obj.style))
			obj.style.display = (chk.checked ? 'none' : 'block');
		obj = _Object('pnlTPH' + sysId);
		if(isValid(obj) && isValid(obj.style))
			obj.style.display = (chk.checked ? 'none' : 'block');
	}
}

function TotalTons_OnChange(sysId)
{
	var tph = _Object('txtTPH' + sysId);
	if(isValid(tph))
		tph.value = '';
	// added to also clear out all subsystem/material usage values when a new total is entered
	if(getEntryMode() == 3)
	{
		var ssPanel = _Object('pnlSubSystems' + sysId);
		if(isValid(ssPanel))
		{
			var inputs = getChildrenOfType(ssPanel, 'text');
			for(var i = 0; i < inputs.length; i++)
			{
				if(inputs[i].id.substr(0, 4) == 'Open')
					inputs[i].value = '';
			}
		}
	}
}

function TPH_OnChange(sysId)
{
	var totaltons = _Object('txtTotalTons' + sysId);
	if(isValid(totaltons))
		totaltons.value = '';
	// added to also clear out all subsystem/material usage values when a new TPH is entered
	if(getEntryMode() == 3)
	{
		var ssPanel = _Object('pnlSubSystems' + sysId);
		if(isValid(ssPanel))
		{
			var inputs = getChildrenOfType(ssPanel, 'text');
			for(var i = 0; i < inputs.length; i++)
			{
				if(inputs[i].id.substr(0, 4) == 'Open')
					inputs[i].value = '';
			}
		}
	}
}

function Store_OnClick()
{
	try
	{
		startSubmitting();
		resetForm();
		
		var entryMode = getEntryMode();
		
		var sOpenValues = new String();
		var sCloseValues = new String();
		var sMMBtuValues = new String();
		var sRateFlags = new String();
		var sPctFlags = new String();
		
		var arSystems = new Array();
		var sSysInfo = new String();
		
		for(var x = 0; x < dsInfo.Tables.Systems.Rows.length; x++)
		{ // first get a list of systemId's to save
			var sysId = dsInfo.Tables.Systems.Rows[x].SystemID;
			var obj = _Object('chkExclude' + sysId);
			var bExclude = false;
			if(isValid(obj))
				bExclude = obj.checked;
			if(! bExclude)
			{
				var ndx = _Object('ddlProducts' + sysId).selectedIndex;
				var prodId = _Object('ddlProducts' + sysId).options[ndx].value;
				arSystems.push(sysId);

				// get silo				
				var siloId = 0;
				var ddlSilo = _Object('ddlSilos' + sysId);
				if(isValid(ddlSilo))
				{
					ndx = ddlSilo.selectedIndex;
					siloId = ddlSilo.options[ndx].value;
				}
				if(siloId == '')
					siloId = 0;
				
				// get tph and total tons numbers
				var tph = 0, total = 0;
				if(parseInt(entryMode) != 1) // tph & total tons don't matter for totalizers
				{
					obj = _Object('txtTPH' + sysId);
					if(isValid(obj))
						tph = obj.value;
					obj = _Object('txtTotalTons' + sysId);
					if(isValid(obj))
						total = obj.value;
					if(isNaN(total) || total == '')
						total = 0;
					if(isNaN(tph) || tph == '')
						tph = 0;
				}
				
				var s = new Date(Date.parse(getStart(sysId)));
				var strStart = (s.getMonth() + 1).toString() + '/' + s.getDate() + '/' + getFY(s) + ' ' + s.getHours() + ':' + s.getMinutes();
				var s = new Date(Date.parse(getStop(sysId)));
				var strStop = (s.getMonth() + 1).toString() + '/' + s.getDate() + '/' + getFY(s) + ' ' + s.getHours() + ':' + s.getMinutes();
				
				sSysInfo += (sSysInfo.length > 0 ? ';' : '') + sysId + '$' + prodId + ',' + 
					siloId + ',' + tph + ',' + total + ',' + strStart + ',' + strStop;
			}
		}

		var savedCount = 0;
		
		for(var x = 0; x < arSystems.length; x++)
		{ // loop through systemId's we're going to attempt to save
			var sysId = arSystems[x];
			var panel = _Object('pnlSubSystems' + sysId);
			if(!isValid(panel))
				{ stopSubmitting(); return; }
			
			// get the subsystem values
			var inputs = getChildrenOfType(panel, 'text');
			var openValues = new Array();
			var closeValues = new Array();
			var mmbtuValues = new Array();
			for(var i = 0; i < inputs.length; i++)
			{
				if((inputs[i].value == '')||(inputs[i].value.indexOf(',')>-1)||(inputs[i].value.indexOf('=')>-1))
					inputs[i].value = 0;
				if(inputs[i].id.substr(0, 4) == 'Open')
					openValues.push(inputs[i].id.substr(4, inputs[i].id.length - 4) + '=' + inputs[i].value);
				else if(inputs[i].id.substr(0, 5) == 'Close')
					closeValues.push(inputs[i].id.substr(5, inputs[i].id.length - 5) + '=' + inputs[i].value);
				else if(inputs[i].id.substr(0, 5) == 'MMBtu')
					mmbtuValues.push(inputs[i].id.substr(5, inputs[i].id.length - 5) + '=' + inputs[i].value);
			}
			
			// look for the mix % and feed rate checkbox values
			inputs = getChildrenOfType(panel, 'checkbox');
			var pctValues = new Array();
			var rateValues = new Array();
			for(var i = 0; i < inputs.length; i++)
			{
				if(inputs[i].disabled)
					inputs[i].checked = false;
				if(inputs[i].id.substr(0, 11) == 'ChkFeedRate')
					rateValues.push(inputs[i].id.substr(11, inputs[i].id.length - 11) + '=' + inputs[i].checked);
				else if(inputs[i].id.substr(0, 9) == 'ChkMixPct')
					pctValues.push(inputs[i].id.substr(9, inputs[i].id.length - 9) + '=' + inputs[i].checked);
			}
			
			if(openValues.length > 0)
				sOpenValues += (sOpenValues.length > 0 ? ";" : "") + sysId + ":" + openValues;
			if(closeValues.length > 0)
				sCloseValues += (sCloseValues.length > 0 ? ";" : "") + sysId + ":" + closeValues;
			if(mmbtuValues.length > 0)
				sMMBtuValues += (sMMBtuValues.length > 0 ? ";" : "") + sysId + ":" + mmbtuValues;
			if(rateValues.length > 0)
				sRateFlags += (sRateFlags.length > 0 ? ";" : "") + sysId + ":" + rateValues;
			if(pctValues.length > 0)
				sPctFlags += (sPctFlags.length > 0 ? ";" : "") + sysId + ":" + pctValues;
			
			savedCount++;
		} // for each system...

        Anthem_InvokePageMethod(
            'SaveNew', 
            [entryMode, sSysInfo, sOpenValues, sCloseValues, sMMBtuValues, sRateFlags, sPctFlags], 
            callback_Store
        );
//		ProdPage.SaveNew(entryMode, sSysInfo, sOpenValues, sCloseValues, 
//			sMMBtuValues, sRateFlags, sPctFlags, callback_Store);

		if(savedCount == 0)
			stopSubmitting();
		
	} catch(ex) { handleException('Store_OnClick()', ex); }
}


function Product_OnChange(sysId)
{
	try
	{
		startSubmitting();
		resetForm();
		
		Selected_SiloID = 0;
		
		var entryMode = getEntryMode();
		if(parseInt(entryMode) == 3)
		{
			var ndx = _Object('ddlProducts' + sysId).selectedIndex;
			if(ndx < 0) { ndx = 0; }
			var prodId = _Object('ddlProducts' + sysId).options[ndx].value;
			Anthem_InvokePageMethod(
			    'DefaultTPH', 
			    [sysId, prodId, getStart(sysId), getStop(sysId), false, true], 
			    callback_DefaultTPH
			);
//			ProdPage.DefaultTPH(sysId, prodId, getStart(sysId), getStop(sysId), false, true, callback_DefaultTPH);
		}
		else
		{
			buildSubSystems(entryMode);
			stopSubmitting();
		}
	} catch(ex) { handleException('Product_OnChange()', ex); }
}

function EntryMode_OnChange(val)
{
	try
	{
		startSubmitting();
		resetForm();
		
		if(! isValid(dsInfo)) { return; }
		
		Selected_EnterMode = parseInt(val);
		
		if((parseInt(Selected_EnterMode) == 3) && (isValid(dsInfo.Tables)))
		{
			var dtSystems = dsInfo.Tables.Systems;
			if(isValid(dtSystems))
			{
			    var sysValues = new String('');
			    
				for(var i = 0; i < dtSystems.Rows.length; i++)
				{
					var sysId = dtSystems.Rows[i].SystemID;
					
					var ddlProd = _Object('ddlProducts' + sysId);
					var ndx = ddlProd.selectedIndex;
					if(ndx < 0) { ndx = 0; }
					var prodId = ddlProd.options[ndx].value;
					
					var panel = _Object('pnlSubSystems' + sysId);
					if(panel.childNodes.length > 0) // clear out textboxes while retrieving default TPH values
						panel.removeChild(panel.childNodes[0]);
/*
					var doRefresh = (i == dtSystems.Rows.length - 1) ? true : false;

                    Anthem_InvokePageMethod(
                        'DefaultTPH', 
                        [sysId, prodId, getStart(sysId), getStop(sysId), false, doRefresh], 
                        callback_DefaultTPH
                    );
*/
				}
				setTimeout('defaultTPH()', 10);
			}
		}
		else
		{
			buildSubSystems(Selected_EnterMode);
			stopSubmitting();
		}
	} catch(ex) { handleException('EntryMode_OnChange()', ex); }
}

function calculateTotal(sysId)
{
	startSubmitting();
	resetForm();
	
	var panel = _Object('pnlSubSystems' + sysId);
	if(!isValid(panel))
		return;
	var inputs = getChildrenOfType(panel, 'text');
	var values = new Array();
	for(var i = 0; i < inputs.length; i++)
	{
		if(inputs[i].id.substr(0, 4) == 'Open')
		{
			if((inputs[i].value == '')||(inputs[i].value.indexOf(',')>-1)||(inputs[i].value.indexOf('=')>-1))
				inputs[i].value = 0;
			values.push(inputs[i].id.substr(4, inputs[i].id.length - 4) + '=' + inputs[i].value);
		}
	}
	var ndx = _Object('ddlProducts' + sysId).selectedIndex;
	var prodId = _Object('ddlProducts' + sysId).options[ndx].value;
	var total = 0;
	if(parseInt(getEntryMode()) == 3) // entering via TPH, so use the total tons rather than calculate it
		total = _Object('txtTotalTons' + sysId).value;

    Anthem_InvokePageMethod(
        'CalculateTotal_Click', 
        [sysId, prodId, values, getStart(sysId), getStop(sysId), total], 
        callback_calculateTotal
    );
//	ProdPage.CalculateTotal_Click(sysId, prodId, values, getStart(sysId), getStop(sysId), total, callback_calculateTotal);
}

function calculateTPH(sysId)
{
	startSubmitting();
	resetForm();

	var ndx = _Object('ddlProducts' + sysId).selectedIndex;
	var prodId = _Object('ddlProducts' + sysId).options[ndx].value;
	
	var tph = _Object('txtTPH' + sysId).value;
	if(isNaN(tph))
		tph = 0;

    Anthem_InvokePageMethod(
        'CalculateTPH_Click', 
        [sysId, prodId, getStart(sysId), getStop(sysId), tph], 
        callback_calculateTPH
    );
//	ProdPage.CalculateTPH_Click(sysId, prodId, getStart(sysId), getStop(sysId), tph, callback_calculateTPH);
}

function toggle_UseMixPct(objCheckBox, subSysId)
{
	var obj = _Object('Open' + subSysId);
	if(isValid(obj))
	{
		obj.disabled = objCheckBox.checked;
		obj.style.background = (obj.disabled ? '#dddddd' : 'white');
	}
	var obj = _Object('Close' + subSysId);
	if(isValid(obj))
	{
		obj.disabled = objCheckBox.checked;
		obj.style.background = (obj.disabled ? '#dddddd' : 'white');
	}
	var obj = _Object('ChkFeedRate' + subSysId);
	if(isValid(obj))
	{
		obj.checked = false;
		obj.disabled = objCheckBox.checked;
	}
	var obj = _Object('MMBtu' + subSysId);
	if(isValid(obj))
	{
		obj.disabled = objCheckBox.checked;
		obj.style.background = (obj.disabled ? '#dddddd' : 'white');
	}
}

function toggle_UseRate(objCheckBox, subSysId)
{
	var obj = _Object('Open' + subSysId);
	if(isValid(obj))
	{
		obj.disabled = objCheckBox.checked;
		obj.style.background = (obj.disabled ? '#dddddd' : 'white');
	}
	var obj = _Object('Close' + subSysId);
	if(isValid(obj))
	{
		obj.disabled = objCheckBox.checked;
		obj.style.background = (obj.disabled ? '#dddddd' : 'white');
	}
	var obj = _Object('ChkMixPct' + subSysId);
	if(isValid(obj))
	{
		obj.checked = false;
		obj.disabled = objCheckBox.checked;
	}
	var obj = _Object('MMBtu' + subSysId);
	if(isValid(obj))
	{
		obj.disabled = objCheckBox.checked;
		obj.style.background = (obj.disabled ? '#dddddd' : 'white');
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Ajax callback functions 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function callback_GetSystemInfo(result)
{
	try
	{
		startSubmitting();
		dsInfo = result.value;
		
		if((! isValid(dsInfo)) || (! isValid(dsInfo.Tables)))
		{
		    alert('Error retrieving system information.\nPlease contact a system administrator or your help desk.');
		}
		else if(dsInfo.Tables.Systems.Rows.length > 0)
		{
		    defaultDates();
    		
		    var bShowForm = true;
		    var tmpId = getEntryMode();
		    if((tmpId == null) || (Selected_EnterMode == 0))
		    {
			    if(Selected_EnterMode == 0)
			    {
				    bShowForm = ! setDefaultEntryMode();
			    }
			    else
				    bShowForm = ! setEntryMode(Selected_EnterMode);
		    }
		    //toggleForm(true);
    		
		    if(bShowForm)
		    {
			    resetForm();
			    //callback_DefaultTPH(null);
			    buildSubSystems(Selected_EnterMode);
		    }
		    stopSubmitting();
		}
		else
		{
			_setVis('pnlNoSystemsMsg', true);
			toggleForm(false);
			stopSubmitting();
		}
	} catch(ex) { 
	    handleException('callback_GetSystemInfo()', ex); 
    }
}

function callback_Store(result)
{
	try
	{
		if(isValid(result.value))
		{
			var dtResults = result.value.Tables.SaveResults;
			var err = new String();
			var msg = new String();
			var bAllSuccess = false;
			
			showSavedData(result.value.Tables.SavedData);
			
			if(isValid(dtResults))
			{
				for(x = 0; x < dtResults.Rows.length; x++)
				{
					var dr = dtResults.Rows[x];
					var success = eval(dr.Success);
					
					if(parseInt(dr.SystemID) == 0)
					{
						bAllSuccess = success;
						if(isValid(dr.MessageString))
							msg = dr.MessageString;
					}
					else if(success)
					{ // go ahead and exclude this system from being saved again when trying to re-save systems in error
						var chk = _Object('chkExclude' + dr.SystemID);
						chk.checked = true;
						Exclude_OnClick(dr.SystemID);
					}
					if(isValid(dr.ErrorString))
					{
						if(dr.ErrorString.length > 0)
						{
							err += dr.ErrorString;
						}
					}
				}
			}
			
			if(msg.length > 0) { alert(msg); }

			if(! bAllSuccess)
			{
				var obj = _Object('lblDataEntryError');
				if(isValid(obj))
				{
					_Object('lblDataEntryError').innerHTML = err;
					_setVis('lblDataEntryError', (err.length > 0)); // just in case
				}
				stopSubmitting();
			}
			else
			    Anthem_InvokePageMethod('getSystemInfo', null, callback_GetSystemInfo);
//				ProdPage.getSystemInfo(callback_GetSystemInfo);
		}
		else
			stopSubmitting();
		
	} catch(ex) { handleException('callback_Store()', ex); }
}

function callback_DefaultTPH(result)
{
	try
	{
		var sysId;
		if(isValid(result.value))
		{
			var dtTPH = result.value.Tables.TPH;
			try { sysId = dtTPH.Rows[0].SystemID; } catch(ex) {}
			
			var exclude;
			if(isValid(sysId))
			{
				for(var i = 0; i < dsInfo.Tables.Systems.Rows.length; i++)
					if(parseInt(dsInfo.Tables.Systems.Rows[i].SystemID) == parseInt(sysId))
					{
						exclude = dsInfo.Tables.Systems.Rows[i].Exclude;
						break;
					}
			}
				
			if((parseInt(Selected_EnterMode) == 3) || (parseInt(Selected_EnterMode) == 2))
			{
				buildSubSystems(Selected_EnterMode, sysId, exclude);
				callback_calculateTPH(result);
			}
			else
			{
				buildSubSystems(Selected_EnterMode, sysId, exclude);
				stopSubmitting();
			}
		}
		else
			stopSubmitting();
	} catch(ex) { handleException('callback_DefaultTPH()', ex); }
}

//var tphTables = new Array();
function defaultTPH()
{
	try
	{
		if(isValid(dsInfo))
		{
			var dtSystems = dsInfo.Tables.Systems;
			for(var i = 0; i < dtSystems.Rows.length; i++)
			{
			    var sysId = dtSystems.Rows[i].SystemID;
			    var exclude = dtSystems.Rows[i].Exclude;
			    
			    if((parseInt(Selected_EnterMode) == 3) || (parseInt(Selected_EnterMode) == 2))
			    {
				    buildSubSystems(Selected_EnterMode, sysId, exclude);
				    
				    var dtTPH = null;
				    dtTPH = eval('dsInfo.Tables.TPH' + sysId.toString());
				    if(isValid(dtTPH))
				    {
				        //tphTables[sysId] = dtTPH;
				        //setTimeout('finishCalcTPH(' + sysId + ',' + (i == dtSystems.Rows.length - 1).toString() + ')', 200);
				        finishCalcTPH(sysId, dtTPH, (i == dtSystems.Rows.length - 1));
				    }
				    else
				    {
				        var ddlProd = _Object('ddlProducts' + sysId);
					    var prodId = ddlProd.options[ddlProd.selectedIndex].value;
					    var doRefresh = (i == dtSystems.Rows.length - 1) ? true : false;
                        Anthem_InvokePageMethod(
                            'DefaultTPH', 
                            [sysId, prodId, getStart(sysId), getStop(sysId), false, doRefresh], 
                            callback_DefaultTPH
                        );
                    }
			    }
			    else
			    {
				    buildSubSystems(Selected_EnterMode, sysId, exclude);
				    stopSubmitting();
			    }
            }
		}
		else
			stopSubmitting();
	} catch(ex) { handleException('defaultTPH()', ex); }
}

function callback_calculateTotal(result)
{
	stopSubmitting();

	var dt = result.value;
	if(isValid(dt))
	{
		if(parseInt(getEntryMode()) == 3) // entering via TPH, so use the total tons to calculate TPH
		{
			var dTPH = 0;
			for(var i = 0; i < dt.Rows.length; i++)
			{
				if(parseInt(dt.Rows[i].SubSystemID) == 0)
					dTPH = dt.Rows[i].Value;
				else
				{
					var txt = _Object('Open' + dt.Rows[i].SubSystemID);
					if(isValid(txt))
						txt.value = dt.Rows[i].Value;
				}
			}
			if(dt.Rows.length > 0)
				_Object('txtTPH' + dt.Rows[0].SystemID).value = dTPH;
		}
		else if(dt.Rows.length > 0)
			_Object('txtTotalTons' + dt.Rows[0].SystemID).value = dt.Rows[0].Value;
	}
}

function callback_calculateTPH(result)
{
    try
    {
		var dt = null, dtRefresh = null;
		var arSystems = new Array();
		if(isValid(result) && isValid(result.value))
		{
		    var bStopSubmit = true;
			dt = result.value.Tables.TPH;
			if(isValid(result.value.Tables.Refresh))
				if(result.value.Tables.Refresh.Rows.length > 0)
					bStopSubmit = result.value.Tables.Refresh.Rows[0].Value;
		    
		    //tphTables[dt.Rows[0].SystemID] = dt;
		    //setTimeout('finishCalcTPH(' + dt.Rows[0].SystemID + ',' + bStopSubmit.toString() + ')', 200);
		    finishCalcTPH(dt.Rows[0].SystemID, dt, bStopSubmit);
		}
    } catch(ex) { handleException('callback_calculateTPH()', ex); }
}

//function finishCalcTPH(sysId, bStopSubmit)
function finishCalcTPH(sysId, dtTPH, bStopSubmit)
{
	try
	{
	    //var dtTPH = tphTables[sysId];
		// calculating USING the tons per hour, so set the resulting total tons after the calulations have been made
		// return value is a dataset

		var dTotal = 0; dTPH = 0;
		var objTPH = _Object('txtTPH' + sysId);
		var objTotal = _Object('txtTotalTons' + sysId);
		var dSum = 0;
		
		_setVis('lblTPHMsg' + sysId, false);
		
		if(isValid(objTPH))
			dTPH = (isNaN(objTPH.value) ? 0 : _Object('txtTPH' + sysId).value);
		
		if(isValid(dtTPH))
		{
			var dHours = 0;
			for(var i = 0; i < dtTPH.Rows.length; i++)
			{
				if(parseInt(dtTPH.Rows[i].SubSystemID) == 0)
					dTotal = dtTPH.Rows[i].Value;
				else if(parseInt(dtTPH.Rows[i].SubSystemID) == -1)
				{
					dTPH = dtTPH.Rows[i].Value;
					if(dtTPH.Rows[i].DTHours != null) dHours = dtTPH.Rows[i].DTHours;
					_setVis('lblTPHMsg' + sysId, (parseFloat(dHours) == parseFloat("0")));
				}
				else
				{
					var txt = _Object('Open' + dtTPH.Rows[i].SubSystemID);
					var sVal = new String(parseFloat(dtTPH.Rows[i].Value).toString());
					if(isValid(txt))
					{
						txt.value = sVal;
						dSum += dtTPH.Rows[i].Value;
					}
				}
			}
		}
		
		if(isValid(objTotal))
			objTotal.value = dTotal;
		if(isValid(objTPH))
			objTPH.value = dTPH;

	} catch(ex) { handleException('finishCalcTPH()', ex); }
	finally { if(bStopSubmit) { stopSubmitting(); } }
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// functions specific to the production form
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function defaultDates()
{
    try
    {
	    if(isValid(dsInfo)) { if(isValid(dsInfo.Tables)) { if(isValid(dsInfo.Tables.Systems)) 
	    {
		    var dt = dsInfo.Tables.Systems;
		    for(var i = 0; i < dt.Rows.length; i++)
		    {
			    if(isValid(dt.Rows[i].DefaultStart))
			        setTimeout('setStart(' + dt.Rows[i].SystemID.toString() + ', "' + dt.Rows[i].DefaultStart.toString() + '")', 20);
    //				eval('setStartDate' + dt.Rows[i].SystemID.toString() + '(\'' + dt.Rows[i].DefaultStart.toString() + '\')');
			    if(isValid(dt.Rows[i].DefaultStop))
			        setTimeout('setStop(' + dt.Rows[i].SystemID.toString() + ', "' + dt.Rows[i].DefaultStop.toString() + '")', 20);
    //				eval('setEndDate' + dt.Rows[i].SystemID.toString() + '(\'' + dt.Rows[i].DefaultStop.toString() + '\')');
		    }
	    }}}
    } catch(ex) { handleException('defaultDates()', ex); }
}

function toggleForm(visi)
{
	_setVis('pnlDataEntry', visi);
	if(visi)
	{
		_setVis('pnlNoSystemsMsg', false);
		_setVis('tblDataEntry', true);
	}
	_setVis('tblFilter', visi);
	_setVis('pnlDataGrid', visi);
	_setVis('pnlNoData', visi);
	_setVis('btnEdit', visi);
}

function resetForm()
{
	var obj = _Object('lblDataEntryError');
	if(isValid(obj))
		obj.innerHTML = "";

	if(isValid(dsInfo.Tables)) { if(isValid(dsInfo.Tables.Systems))
	{
		for(var i = 0; i < dsInfo.Tables.Systems.Rows.length; i++)
		{
			var sysId = dsInfo.Tables.Systems.Rows[i].SystemID;
			//obj = _Object('ddlProducts' + sysId);
			//if(! isValid(obj)) { return; }
			//var ndx = obj.selectedIndex;
			//var prodId = obj.options[ndx].value;

			_setVis('pnlTPH' + sysId, (parseInt(Selected_EnterMode) == 3));
			_setVis('pnlTotalTons' + sysId, (parseInt(Selected_EnterMode) != 1));
			
			if(parseInt(Selected_EnterMode) != 1)
			{
				var tt = _Object('pnlTotalTons' + sysId);
				if(isValid(tt))
				{
				    var ttch = (typeof tt.children == 'undefined' ? tt.childNodes : tt.children);
					for(var x = 0; x < ttch.length; x++)
					{
						if(isValid(ttch[x].onclick))
						{ // we have the link
						    var ttch2 = (typeof ttch[x].children == 'undefined' ? ttch[x].childNodes : ttch[x].children);
							var img = ttch2[0];
							if(isValid(img))
							{
								if(parseInt(Selected_EnterMode) == 3)
									img.alt = 'Calculate based on Total Tons';
								else
									img.alt = 'Calculate Total Tons';
								break;
							}
						}
					}
				}
//				else
//				    alert('resetForm: "tt" (pnlTotalTons) is not valid!');
			}
		}
	} }
}

function callback_GetSavedData(result)
{
	showSavedData(result.value);
}
function showSavedData(dtData)
{
	try
	{
		_setVis('pnlSavedData', true);
		panel = _Object('pnlSavedData');
		if(isValid(panel))
		{
			while(panel.childNodes.length > 0)
				panel.removeChild(panel.childNodes[0]);
			
			if(isValid(dtData))
			{
				if(dtData.Rows.length > 0)
				{
					var parag = document.createElement('p');
					parag.setAttribute('class', 'normal');
					parag.setAttribute('align', 'center');
					parag.appendChild( document.createTextNode('Recently Saved Data') );
					
					var tbl = document.createElement('table');
					tbl.align = 'center';
					tbl.cellspacing = '0';
					tbl.cellpadding = '2';
					tbl.setAttribute('rules', 'all');
					tbl.setAttribute('class', 'dataGridTable');
					// create the header row for the saved data table
					var row = document.createElement('tr');
					row.setAttribute('class', 'HeaderStyle');
					var cell = document.createElement('td');
					cell.appendChild( document.createTextNode('System') );
					row.appendChild(cell);
					cell = document.createElement('td');
					cell.appendChild( document.createTextNode('Product') );
					row.appendChild(cell);
					cell = document.createElement('td');
					cell.appendChild( document.createTextNode('Qty') );
					row.appendChild(cell);
					cell = document.createElement('td');
					cell.appendChild( document.createTextNode('Start') );
					row.appendChild(cell);
					cell = document.createElement('td');
					cell.appendChild( document.createTextNode('Stop') );
					row.appendChild(cell);
					tbl.appendChild(row);
					// loop through the saved data, adding it to the table
					for(x = 0; x < dtData.Rows.length; x++)
					{
						row = document.createElement('tr');
						if(x % 2 != 0)
							row.setAttribute('class', 'AlternatingItemStyle');
						cell = document.createElement('td');
						cell.appendChild( document.createTextNode(dtData.Rows[x].FromSystemName) );
						row.appendChild(cell);
						cell = document.createElement('td');
						cell.appendChild( document.createTextNode(dtData.Rows[x].Material) );
						row.appendChild(cell);
						cell = document.createElement('td');
						cell.setAttribute('align', 'right');
						var s = null;
						if(isValid(dtData.Rows[x].Qty))
							s = formatNumber(dtData.Rows[x].Qty, 2);
						cell.appendChild( document.createTextNode(s) );
						row.appendChild(cell);
						cell = document.createElement('td');
						cell.setAttribute('align', 'right');
						s = null;
						if(isValid(dtData.Rows[x].StartTime))
							s = new Date(dtData.Rows[x].StartTime);
						cell.appendChild( document.createTextNode(formatDate(s)) );
						row.appendChild(cell);
						cell = document.createElement('td');
						cell.setAttribute('align', 'right');
						s = null;
						if(isValid(dtData.Rows[x].StopTime))
							s = new Date(dtData.Rows[x].StopTime);
						cell.appendChild( document.createTextNode(formatDate(s)) );
						row.appendChild(cell);
						tbl.appendChild(row);
					}
					
					parag.appendChild(tbl);
					panel.appendChild(parag);
					var str = new String(panel.innerHTML);
					panel.innerHTML = str;
				}
			}
		}
	} catch(ex) { handleException('showSavedData()', ex); }
}
/* jgg - 10/17/06 - supplanted by the new DatePicker.EnableClientSideDateChangedHandling property
function prepForm(sysId)
{
	var obj = _Object('dtpBegDate' + sysId);
	obj.ClientSideDateChanged = DTPHandler;
	obj = _Object('dtpEndDate' + sysId);
	obj.ClientSideDateChanged = DTPHandler;
}

function DTPHandler()
{
	var func = eval('SetDate_' + arguments[0]);
	func(arguments[1]);
	func = eval('toggleCal' + arguments[0]);
	func();
	return false;
}
*/
function buildSubSystems(entryMode, sysId, exclude)
{
	try
	{
		var dtSubSystems = dsInfo.Tables.SubSystems;
		var bTotalizers = (parseInt(entryMode) == 1 ? true : false);
		var bQuantities = (parseInt(entryMode) == 2 ? true : false);
		var arSystems = new Array(), arExclude = new Array();
		if(isValid(sysId))
		{
			arSystems.push(sysId);
			arExclude.push(exclude);
		}
		else
		{
			for(var x = 0; x < dsInfo.Tables.Systems.Rows.length; x++)
			{
				arSystems.push(dsInfo.Tables.Systems.Rows[x].SystemID);
				arExclude.push(dsInfo.Tables.Systems.Rows[x].Exclude);
			}
		}
		
		_setVis('pnlRolloverWarning', bTotalizers, true);
		_setVis('pnlFactorWarning', !bTotalizers, true);

		for(var x = 0; x < arSystems.length; x++)
		{
			var sysId = arSystems[x];
			var obj = _Object('ddlProducts' + sysId);
			if(! isValid(obj)) { continue; }
			var ndx = obj.selectedIndex;
			var prodId = obj.options[ndx].value;
			
			//prepForm(sysId);
			_setVis('pnlTPH' + sysId, (parseInt(entryMode) == 3));
			_setVis('pnlTotalTons' + sysId, (parseInt(entryMode) != 1));
			
			var panel = _Object('pnlSubSystems' + sysId);
			if(panel.childNodes.length > 0)
				panel.removeChild(panel.childNodes[0]);
			var tbl = document.createElement('table');
			var row1 = document.createElement('tr');
			var row2 = document.createElement('tr');
			var row3 = document.createElement('tr');
			var row4 = document.createElement('tr');
			var rowRate = document.createElement('tr');
			var rowBtu = document.createElement('tr');
			var cell, txt1, txt2, txtMMBtu, chkRate, chkPct, span, lbl;
			var arrayMaterials = new Array();
			var bShowRate = false;
			var bShowMixPct = false;
			var bShowMMBtu = false;
			
			var bExcluded = arExclude[x];
			var chk = _Object('chkExclude' + sysId);
			if(isValid(chk))
			{
				chk.checked = bExcluded;
				chk.disabled = bExcluded;
				g_toggleEnable_DisabledStatus[chk.id] = bExcluded;
				setTimeout('Exclude_OnClick(' + sysId.toString() + ')', 100);
			}
			
			var subsysCount = 0;
			
			for(var i = 0; i < dtSubSystems.Rows.length; i++)
			{
				var dr = dtSubSystems.Rows[i];
				if(
					(parseInt(dr.SystemID) == parseInt(sysId)) && 
					(parseInt(dr.EndProductID) == parseInt(prodId)) && 
					(parseInt(dr.DataEntryMode) == parseInt(entryMode)) && 
					(bTotalizers || (arrayMaterials[dr.MaterialID] != true))
				)
				{
					arrayMaterials[dr.MaterialID] = true;
					
					// either the material or feeder name
					cell = document.createElement('td');
					cell.setAttribute('valign', 'bottom');
					cell.setAttribute('align', 'center');
					cell.style.width = '60px';
					cell.style.fontWeight = 'bold';
					cell.style.padding = '1px 1px 1px 1px';
					if(bTotalizers)
						cell.appendChild( document.createTextNode(dr.SubSystemName) );
					else
						cell.appendChild( document.createTextNode(dr.MaterialName) );
					row1.appendChild(cell);
					
					// the "open" textbox
					cell = document.createElement('td');
					cell.setAttribute('align', 'center');
					cell.style.padding = '1px 1px 1px 1px';
					txt1 = document.createElement('input');
					txt1.setAttribute('type', 'text');
					txt1.setAttribute('id', 'Open' + dr.SubSystemID);
					txt1.setAttribute('name', 'Open' + dr.SubSystemID);
					txt1.setAttribute('class', 'rightAlignTextBox');
					txt1.setAttribute('onFocus', 'this.select();');
					if(parseInt(entryMode) == 2)
						txt1.setAttribute('value', dr.Qty);
					else
						txt1.setAttribute('value', dr.OpenValue);
					txt1.style.width = '60px';
					txt1.disabled = ((! dr.Enabled) || bExcluded);
					cell.appendChild(txt1);
					row2.appendChild(cell);
					
					// either the "close" textbox or the material unit of measure
					cell = document.createElement('td');
					cell.setAttribute('align', 'center');
					cell.style.padding = '1px 1px 1px 1px';
					if(bTotalizers)
					{
						txt2 = document.createElement('input');
						txt2.setAttribute('type', 'text');
						txt2.setAttribute('id', 'Close' + dr.SubSystemID);
						txt2.setAttribute('name', 'Close' + dr.SubSystemID);
						txt2.setAttribute('class', 'rightAlignTextBox');
						txt2.setAttribute('value', dr.CloseValue);
						txt1.setAttribute('onFocus', 'this.select();');
						txt2.style.width = '60px';
						txt2.disabled = ((! dr.Enabled) || bExcluded);
						cell.appendChild(txt2);
					}
					else
					{
						cell.appendChild( document.createTextNode(dr.MaterialUoM) );
					}
					row3.appendChild(cell);
					
					// feed rate checkbox
					cell = document.createElement('td');
					cell.setAttribute('align', 'left');
					cell.style.padding = '1px 1px 1px 1px';
					if(bTotalizers || bQuantities)
					{
						span = document.createElement('span');
						span.style.fontSize = 'smaller';
						span.disabled = ((dr.FeedRate <= 0) || bExcluded);
						chkRate = document.createElement('input');
						chkRate.setAttribute('type', 'checkbox');
						chkRate.setAttribute('id', 'ChkFeedRate' + dr.SubSystemID);
						chkRate.setAttribute('name', 'ChkFeedRate' + dr.SubSystemID);
						chkRate.setAttribute('onClick', 'javascript:toggle_UseRate(this, "' + dr.SubSystemID + '");return true;');
						chkRate.disabled = ((dr.FeedRate <= 0) || bExcluded);
						chkRate.checked = dr.FeedRateChecked;
						lbl = document.createElement('label');
						lbl.setAttribute('for', 'ChkFeedRate' + dr.SubSystemID);
						lbl.innerHTML = 'Use Rate';
						var nobr = document.createElement('nobr');
						nobr.appendChild(chkRate);
						nobr.appendChild(lbl);
						span.appendChild(nobr);
						cell.appendChild(span);
						bShowRate = true;
					}
					else
					{
						cell.innerHTML = '&nbsp;';
					}
					rowRate.appendChild(cell);
					
					// use mix percentage checkbox
					cell = document.createElement('td');
					cell.style.padding = '1px 1px 1px 1px';
					cell.setAttribute('align', 'left');
					cell.setAttribute('valign', 'bottom');
					if((bTotalizers || bQuantities) && (parseInt(dr.SubSystemTypeID) != 1)) // system type 1 = production
					{
						span = document.createElement('span');
						span.style.fontSize = 'smaller';
						span.disabled = ((dr.MixPercent <= 0) || bExcluded);
						chkPct = document.createElement('input');
						chkPct.setAttribute('type', 'checkbox');
						chkPct.setAttribute('id', 'ChkMixPct' + dr.SubSystemID);
						chkPct.setAttribute('name', 'ChkMixPct' + dr.SubSystemID);
						chkPct.setAttribute('onClick', 'javascript:toggle_UseMixPct(this, "' + dr.SubSystemID + '");return true;');
						chkPct.disabled = ((dr.MixPercent <= 0) || bExcluded);
						chkPct.checked = dr.MixPercentChecked;
						lbl = document.createElement('label');
						lbl.setAttribute('for', 'ChkMixPct' + dr.SubSystemID);
						lbl.innerHTML = 'Use Mix %';
						var nobr = document.createElement('nobr');
						nobr.appendChild(chkPct);
						nobr.appendChild(lbl);
						span.appendChild(nobr)
						cell.appendChild(span);
						bShowMixPct = true;
					}
					else
					{
						cell.innerHTML = '&nbsp;';
					}
					row4.appendChild(cell);
					
					// mmbtu factor textbox
					cell = document.createElement('td');
					cell.setAttribute('align', 'left');
					cell.setAttribute('valign', 'bottom');
					cell.style.padding = '1px 1px 1px 1px';
					if((parseInt(dr.SubSystemTypeID) == 2) && dr.ShowMMBtu) // system type 2 = fuel
					{
						txtMMBtu = document.createElement('input');
						txtMMBtu.setAttribute('type', 'text');
						txtMMBtu.setAttribute('id', 'MMBtu' + dr.SubSystemID);
						txtMMBtu.setAttribute('name', 'MMBtu' + dr.SubSystemID);
						txtMMBtu.setAttribute('class', 'rightAlignTextBox');
						txtMMBtu.setAttribute('value', dr.MMBtuFactor);
						txtMMBtu.setAttribute('onFocus', 'this.select();');
						txtMMBtu.style.width = '70px';
						txtMMBtu.disabled = ((dr.MMBtuFactor <= 0) || bExcluded);
						if(SiteID == 27)
							cell.appendChild( document.createTextNode('Btu Factor:') );
						else
							cell.appendChild( document.createTextNode('MMBtu Factor:') );
						cell.appendChild( document.createElement('br') );
						cell.appendChild(txtMMBtu);
						bShowMMBtu = true;
					}
					else
					{
						cell.innerHTML = '&nbsp;';
					}
					rowBtu.appendChild(cell);
					
					subsysCount++;
				}
			}
			if(subsysCount == 0)
			{
				panel.innerHTML = "<p align=center valign=top class='alert'>No SubSystems have been configured.</p>";
			}
			else
			{
				tbl.appendChild(row1);
				tbl.appendChild(row2);
				tbl.appendChild(row3);
				if(bShowMixPct)
					tbl.appendChild(row4);
				if(bShowRate)
					tbl.appendChild(rowRate);
				if(bShowMMBtu)
					tbl.appendChild(rowBtu);
				
				tbl.setAttribute('border', '0');
				tbl.setAttribute('cellspacing', '0');
				tbl.setAttribute('cellpadding', '0');
				panel.appendChild(tbl);
				var str = new String(panel.innerHTML);
				panel.innerHTML = str;
				
				setupSilos(sysId, prodId);
			}
		}
	} catch(ex) { handleException('buildSubSystems()', ex); }
}

function setupSilos(sysId, prodId)
{
	try
	{
		var ddl = _Object('ddlSilos' + sysId);
		if(isValid(ddl))
		{
			var arSilos = getSilos(prodId);
			
			// clear the dropdown (intentionally leaving the first item ("nothing selected")
			while(ddl.options.length > 1)
				ddl.remove(1);
			for(var i = 0; i < arSilos.length; i++)
			{
				var drSilo = arSilos[i];
				var newO = new Option(drSilo.Name, drSilo.SiloID);
				ddl.options[ddl.options.length] = newO;
			}
		}
	} catch(ex) { handleException('setupSilos()', ex); }
}

function getDefaultPMID(sysId)
{
	var pmid = 0;
	try
	{
		var dtSystems = dsInfo.Tables.Systems;
		for(var i = 0; i < dtSystems.Rows.length; i++)
		{
			if(parseInt(dtSystems.Rows[i].SystemID) == parseInt(sysId))
			{
				pmid = parseInt(dtSystems.Rows[i].DefaultPMID);
				break;
			}
		}
	} catch(ex) { handleException('getDefaultPMID()', ex); }
	return pmid;
}

function getProductInfo(pmid)
{
	var drProduct = null;
	try
	{
		var dtProducts = dsInfo.Tables.Products;
		for(var i = 0; i < dtProducts.Rows.length; i++)
		{
			if(parseInt(dtProducts.Rows[i].PMID) == parseInt(pmid))
			{
				drProduct = dtProducts.Rows[i];
				break;
			}
		}
	} catch(ex) { handleException('getProductInfo()', ex); }
    return drProduct;
}

function getSilos(pmid)
{
	var arrayRet = new Array();
	try
	{
		var dtSilos = dsInfo.Tables.Silos;
		for(var x = 0; x < dtSilos.Rows.length; x++)
		{
			if(parseInt(dtSilos.Rows[x].PMID) == parseInt(pmid))
			{
				arrayRet.push(dtSilos.Rows[x]);
			}
		}
	} catch(ex) { handleException('getSilos()', ex); }
	return arrayRet;
}

function setEntryMode(val)
{ // returns boolean, true if a function (postback, most likely) is going to be envoked
	var bRet = false;
	try
	{
		var ptrOnClick = null;
		Selected_EnterMode = val;
		
		if(parseInt(val) == 3)
			r = _Object('radEnterModeTPH');
		else if(parseInt(val) == 2)
			r = _Object('radEnterModeUsage');
		else
			r = _Object('radEnterModeTotalizers');
			
		if(!r.checked)
		{ // only doing everything if it's a CHANGE in selected value
			startSubmitting();
			r.checked = true;
			bRet = true;
			
			setTimeout('EntryMode_OnChange(' + val + ')', 10);
		}
	} catch(ex) { handleException('setEntryMode()', ex); }
	
	return bRet;
}

function getEntryMode()
{
	var ret = 0;
	try
	{
		var rbTot = _Object('radEnterModeTotalizers'); 
		var rbQty = _Object('radEnterModeUsage'); 
		var rbTPH = _Object('radEnterModeTPH'); 
		if(isValid(rbTot) && isValid(rbQty) && isValid(rbTPH))
		{
			if(rbQty.checked)
				ret = rbQty.value;
			else if(rbTPH.checked)
				ret = rbTPH.value;
			else if(rbTot.checked)
				ret = rbTot.value;
		}
	} catch(ex) { handleException('getEntryMode()', ex); }
	
	return ret;
}

function setDefaultEntryMode()
{ // returns true if a postback will be occurring, otherwise false
	var bRet = false;
	try
	{
		var dtSystems = dsInfo.Tables.Systems;
		// set the correct default data entry mode
		var entryMode = 0;

		if(dtSystems.Rows.length > 0)
			entryMode = dtSystems.Rows[0].DefaultEntryMode;
		
		if(parseInt(entryMode) > 0)
			bRet = setEntryMode(entryMode);
	
	} catch(ex) { handleException('setDefaultEntryMode()', ex); }
	
	return bRet;
}

function refreshSavedData()
{
	//startSubmitting();
	Anthem_InvokePageMethod('GetSavedData', null, callback_GetSavedData);
//	ProdPage.GetSavedData(callback_GetSavedData);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// startup code (basically resets the form on each page load)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
_setVis('lblTPHMsg', false);
_setVis('pnlNoSystemsMsg', false);
_setVis('pnlSavedData', false);

Anthem_InvokePageMethod('GetSavedData', null, callback_GetSavedData);
//ProdPage.GetSavedData(callback_GetSavedData);

Anthem_InvokePageMethod('getSystemInfo', null, callback_GetSystemInfo);
//ProdPage.getSystemInfo(callback_GetSystemInfo);

