// JavaScript Document
//Core Communications rewrite Feb 7 20003 to allow multiple categories, etc.
//initialize associative arrays, etc. in global scope
//updates will be implemented merely by changing fields values (some hidden)

itemSelect=new Object;
itemKWh   =new Object;
itemCost  =new Object;
itemMonthKWh=new Object;
itemCategory = new Object;
baseServiceCharge = 15;//should be 15 for Douglas, June 2005
costPerKWh1=0.0765; //should be 0.0754 for Douglas, June 2005
costPerKWh2=0.0765; //should be 0.0754 for Douglas, June 2005
costPerKWhThreshold=1300;//should be 1300 for CPI, May 2004
costPerKWh= costPerKWh1;

categoryTotalKWh=new Object;
categoryTotalCost=new Object;

function fillArrays() {
var f, e, theElement, itemName, code;
for(f=0;f<document.forms.length;f++) {
for(e=0;e<document.forms[f].elements.length;e++) {
theElement=document.forms[f].elements[e];

code='Select'; if (theElement.name.indexOf(code) == (theElement.name.length-code.length)) {
	itemName=theElement.name.substring(0,theElement.name.indexOf(code));
	itemSelect[itemName]=theElement;
//alert("Found select for "+itemName+" ("+theElement.name+")");//testing
	}
code='itemCategory'; if (theElement.name.indexOf(code) == (theElement.name.length-code.length)) {
	itemName=theElement.name.substring(0,theElement.name.indexOf(code));
	itemCategory[itemName]=theElement;
//alert("Found type for "+itemName+" ("+theElement.name+")");//testing
	}
code='MonthKWh'; if (theElement.name.indexOf(code) == (theElement.name.length-code.length)) {
	itemName=theElement.name.substring(0,theElement.name.indexOf(code));
//alert("Found monthlyKWh for "+itemName+" ("+theElement.name+")");//testing
	itemMonthKWh[itemName]=theElement;
	}
code='KWhField'; if (theElement.name.indexOf(code) == (theElement.name.length-code.length)) {
	itemName=theElement.name.substring(0,theElement.name.indexOf(code));
	itemKWh[itemName]=theElement;
//alert("Found kwh for "+itemName+" ("+theElement.name+")");//testing
	}
code='CostField'; if (theElement.name.indexOf(code) == (theElement.name.length-code.length)) {
	itemName=theElement.name.substring(0,theElement.name.indexOf(code));
//alert("Found cost for "+itemName+" ("+theElement.name+")");//testing
	itemCost[itemName]=theElement;
	}
	
code='TotalKWh'; if (theElement.name.indexOf(code) == (theElement.name.length-code.length)) {
	itemName=theElement.name.substring(0,theElement.name.indexOf(code));
//alert("Found TotalKWh for "+itemName+" ("+theElement.name+")");//testing
	categoryTotalKWh[itemName]=theElement;
	}
code='TotalCost'; if (theElement.name.indexOf(code) == (theElement.name.length-code.length)) {
	itemName=theElement.name.substring(0,theElement.name.indexOf(code));
//alert("Found TotalCost for "+itemName+" ("+theElement.name+")");//testing
	categoryTotalCost[itemName]=theElement;
	}

if (theElement.name=='finalHeatingCost') finalHeatingCostField=theElement;
if (theElement.name=='finalHeatingKWh') finalHeatingKWhField=theElement;
if (theElement.name=='finalCost') finalCostField=theElement;
if (theElement.name=='finalKWh') finalKWhField=theElement;

}}//for elements and forms
}//f fillArrays

function updateItem(thisSelect) {//call via onchange="updateItem(this)"
	var thisItemName, thisSelect;
	thisItemName=thisSelect.name.substring(0,thisSelect.name.indexOf('Select'));
//alert("Updating "+thisItemName+": \nqty="+thisSelect.options[thisSelect.selectedIndex].value+"\nitemMonthKWh="+itemMonthKWh[thisItemName].value);//testing
	itemKWh[thisItemName].value=Math.round(parseFloat(thisSelect.options[thisSelect.selectedIndex].value)*parseFloat(itemMonthKWh[thisItemName].value));
	updateCategoryTotals();
	itemCost[thisItemName].value=round2(parseFloat(itemKWh[thisItemName].value)*costPerKWh);
	updateCategoryTotals();
	}//f updateItem

function updateCategoryTotals() {
	var categoryName, itemName, total;
	total=new Number(0.0);
	for (categoryName in categoryTotalCost) {
	total=0.0;
		for(itemName in itemCost) {
			if (itemCategory[itemName].value==categoryName) {
				if (! isNaN(parseFloat(itemCost[itemName].value))) {
					total=total+parseFloat(itemCost[itemName].value);
					}//if numeric value in cost
				}//if right type
			}//for all itemCosts
		categoryTotalCost[categoryName].value=round2(total);
		}//for all categoryTotalCosts
	for (typeName in categoryTotalKWh) {
	total=0.0;
		for(itemName in itemKWh) if (itemCategory[itemName].value==typeName) if (! isNaN(parseFloat(itemKWh[itemName].value))) total=total+parseFloat(itemKWh[itemName].value);
		categoryTotalKWh[typeName].value=Math.round(total);
		}
	finalCalculations();
	}//f updateCategoryTotals

function finalCalculations() {
	var heatKWh, elecKWh, altKWh, totalKWh;
	elecKWh=(isNaN(parseFloat(categoryTotalKWh['elecHeat'].value))?0:parseFloat(categoryTotalKWh['elecHeat'].value));
	altKWh=(isNaN(parseFloat(categoryTotalKWh['altHeat'].value))?0:parseFloat(categoryTotalKWh['altHeat'].value));
	heatKWh=elecKWh-(Math.min(altKWh,elecKWh*0.8));//what is this 0.8 value? Soms sort of fudge factor that keeps it from assigning all electricity to heat?
	finalHeatingKWhField.value=Math.round(heatKWh);
	finalHeatingCostField.value=round2((isNaN(parseFloat(finalHeatingKWhField.value))?0:parseFloat(finalHeatingKWhField.value))*costPerKWh);

	totalKWh=Math.round( (isNaN(parseFloat(categoryTotalKWh['household'].value) )?0:parseFloat(categoryTotalKWh['household'].value) )+(isNaN(parseFloat(finalHeatingKWhField.value) )?0:parseFloat(finalHeatingKWhField.value)));
	setCostPerKWh(totalKWh);
	
	finalKWhField.value=totalKWh;
	finalCostField.value=round2(baseServiceCharge + ( isNaN(parseFloat(finalKWhField.value))?0:parseFloat(finalKWhField.value))*costPerKWh);
}//f finalCalculations. Number 8 is for the base charge of $8.00. Used to be 12 in Lane Electric.

function setCostPerKWh(totalKWh)
{
	//global costPerKWh;
	var totalKWh, tmp;
	if (totalKWh <= costPerKWhThreshold)
	{
		costPerKWh=costPerKWh1;
		return costPerKWh;
	}
	costPerKWh= ( (costPerKWh1 * costPerKWhThreshold) + (costPerKWh2 * (totalKWh-costPerKWhThreshold) ) ) / totalKWh;
	return costPerKWh;
}

function round2(x) {
	var x,s;
	x=parseFloat(x);
	x=Math.round(x*100)/100;
	s=x.toString();
	if(s.indexOf('.')==-1) return(s+".00");
	if(s.indexOf('.')==s.length-1) return(s+"00");
	if(s.indexOf('.')==s.length-2) return(s+"0");
	if(s.indexOf('.')==s.length-3) return(s);
	return(Math.round(x*100)/100);//give up on figuring it out
	}//f round2

function callJS(jsStr) {
  return eval(jsStr)
}

function MM_reloadPage(init) {  //reloads the window if Nav4 resized
  if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
    document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
  else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);

function MM_callJS(jsStr) { //v2.0
  return eval(jsStr)
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}