////////Energy form functions////////////

function handleEnergyFormEdit(updateSavedFlag) {
	EnergyScorecard.calculate();	
	Forms.setTabState('tabEnergy', 'Energy', updateSavedFlag, parseFloat($('energyTotal').value) >= 0);
}

var EnergyScorecard = {
	calculate: function(){
		this.calcMatrix();
	
		this.calculateGeyser();
		this.calcLighting();
		this.calcAirconditioning();
		this.calcMachinery();
		
		this.calcElecticityUnitsConsumers();
		
		this.calcMunicipalBenchmark();
		this.calcAlternativeBenchmark();
		
		this.calcTotal();
	},
	
	/* Utility */
	calcPercentage: function(num, total){
		if(isNaN(parseFloat(num)) || isNaN(parseFloat(total)))
			return NaN;		
		var percentage = total == 0 ? 0 : num/total*100;
		return percentage;
	},
	calcPointsScored: function(perc, target, weighting){
		return perc/target*weighting;
	},
	
	/* Formulas */
	calculateGeyser: function(){
		this.geyserTimersTotal = this.calcGeyserItem('geyserTimers1', 'geyserTimers2', 'timerPerc', 'timerPoints', 'geyserTimersTotal');
		this.geyserTempTotal = this.calcGeyserItem('geyserTemp1', 'geyserTemp2', 'tempPerc', 'tempPoints', 'geyserTempTotal');
		this.geyserInsTotal = this.calcGeyserItem('geyserInsulation1', 'geyserInsulation2', 'insPerc', 'insPoints', 'geyserInsulationTotal');
		
	},
	calcGeyserItem: function(input1, input2, perc, points, total){
		var target = 100;
		var weighting = 2;
		
		var percVal = this.calcPercentage($F(input2), $F(input1));
		var pointsVal = this.calcPointsScored(percVal, target, weighting);
		
		$(perc).update(percVal.toPerc(2));		
		$(points).update(pointsVal.toDec(2));
		$(total).value = pointsVal.toDec(2);
		$(total+'P').update(pointsVal.toDec(2));
		
		return pointsVal;
	},
	
	calcLighting: function(){
		var target = 100;
		var weighting = 4;
		
		var percVal = parseFloat($F('lightSavingTotal'));
		var pointsVal = this.calcPointsScored(percVal, target, weighting);
		
		$('lightsPerc').update(percVal.toPerc(2));
		$('lightsPoints').update(pointsVal.toDec(2));
		$('lightsTotal').value = pointsVal.toDec(2);
		$('lightsTot').update(pointsVal.toDec(2));
		
		this.lightingTotal = pointsVal;
	},
	
	calcAirconditioning: function(){
		this.airconTotal = this.calcAirconditioningItem('aircon1', 'aircon2', 'acPerc', 'acPoints', 'airconTotal');
	},
	calcAirconditioningItem: function(input1, input2, perc, points, total){
		var target = 100;
		var weighting = 2;
		
		var percVal = this.calcPercentage($F(input2), $F(input1));
		var pointsVal = this.calcPointsScored(percVal, target, weighting);
		
		$(perc).update(percVal.toPerc(2));		
		$(points).update(pointsVal.toDec(2));
		$(total).value = pointsVal.toDec(2);
		$(total+'P').update(pointsVal.toDec(2));
		
		return pointsVal;
	},
	
	calcMachinery: function(){
		this.machineWashTotal = this.calcMachineryItem('machineWash1', 'machineWash2', 'machPerc', 'machPoints', 'machineWashTotal');
		this.machineTumbleTotal = this.calcMachineryItem('machineTumble1', 'machineTumble2', 'tumPerc', 'tumPoints', 'machineTumbleTotal');		
	},
	calcMachineryItem: function(input1, input2, perc, points, total){
		var target = 75;
		var weighting = 1;
		
		var percVal = this.calcPercentage($F(input2), $F(input1));
		var pointsVal = this.calcPointsScored(percVal, target, weighting);
		var totalVal = pointsVal > weighting ? weighting : pointsVal;
		
		$(perc).update(percVal.toPerc(2));		
		$(points).update(pointsVal.toDec(2));
		$(total).value = pointsVal.toDec(2);
		$(total+'P').update(totalVal.toDec(2));
		
		return totalVal;
	},
	
	calcElecticityUnitsConsumers: function(){		
		var x1Total = parseFloat($F('x1'))/parseFloat($F('x3'));
		$('x1P').update(x1Total.toDec(2));
		
		var x4Total = parseFloat($F('x4'))/parseFloat($F('x6'));
		$('x4P').update(x4Total.toDec(2));
	},
	
	calcMunicipalBenchmark: function(){
		var target = -10;
		var weighting = 6;
	
		var x1Total = parseFloat($F('x1'))/parseFloat($F('x3'));
		$('energy_mc0809').update(x1Total.toDec(2));				
		
		var x4Total = parseFloat($F('x4'))/parseFloat($F('x6'));
		$('energy_mc0607').update(x4Total.toDec(2));
		
		var mcScore = x1Total-x4Total;
		$('energy_mcScore').update(mcScore.toDec(2));
		
		var mcPoints = mcScore/target*weighting;
		$('energy_mcPoints').update(mcPoints.toDec(2));

		var mcCalc1 = mcPoints > weighting ? weighting : mcPoints;
		$('energy_mcCalc1').update(mcCalc1.toDec(2));
		
		var mcCalc2 = mcPoints > 0 ? mcPoints : 0;
		$('energy_mcCalc2').update(mcCalc2.toDec(2));
		
		var total = mcCalc1 > mcCalc2 ? 0 : mcCalc2;
		$('benchMunicTotal').value = total.toDec(2);
		$('benchMunicTotalP').update(total.toDec(2));
		
		this.benchMSTotal = total;
	},
	calcAlternativeBenchmark: function(){
		var target = 75;
		var weighting = 6;
		
		var ac0809 = parseFloat($F('x7'))/parseFloat($F('x8'))*100;
		if(isNaN(ac0809)){
			$('energy_acScore').update(0);
			$('energy_acPoints').update(0);
			$('energy_acCalc1').update(0);
			this.benchASTotal = 0;
		}else{
			$('energy_ac0809').update(ac0809.toPerc(2));				
			
			var acScore = ac0809/target*100;
			$('energy_acScore').update(acScore.toPerc(2));
			
			var acPoints = weighting*acScore/100;
			$('energy_acPoints').update(acPoints.toDec(2));
			
			var acCalc1 = acPoints > weighting ? weighting : acPoints;
			$('energy_acCalc1').update(acCalc1.toDec(2));
			
			var total = acCalc1;
			if(isNaN(total)){
				$('benchAltTotal').value = 0;
				$('benchAltTotalP').update(0);
			}else{
				$('benchAltTotal').value = total.toDec(2);
				$('benchAltTotalP').update(total.toDec(2));
			}
			
			this.benchASTotal = total;
		}
	},
		
	calcNonNans: function(i1, i2, i3, i4, i5, i6){
		var nonTotal = 0;
		if(isNaN(i1) == false){
			nonTotal = nonTotal + i1;
		}
		if(isNaN(i2) == false){
			nonTotal = nonTotal + i2;
		}
		if(isNaN(i3) == false){
			nonTotal = nonTotal + i3;
		}
		if(isNaN(i4) == false){
			nonTotal = nonTotal + i4;
		}
		if(isNaN(i5) == false){
			nonTotal = nonTotal + i5;
		}
		if(isNaN(i6) == false){
			nonTotal = nonTotal + i6;
		}
		return nonTotal;
	},
	
	calcMatrix: function(){
		// Number total
		var y1 = parseFloat($F('y1'));
		var y2 = parseFloat($F('y2'));
		var y3 = parseFloat($F('y3'));
		var y4 = parseFloat($F('y4'));
		var y5 = parseFloat($F('y5'));
		var y6 = parseFloat($F('y6'));
		
		// Continuously updating the total
		var numTotal = y1+y2+y3+y4+y5+y6;		
		if(isNaN(numTotal)){
			var conTotal = this.calcNonNans(y1,y2,y3,y4,y5,y6);
			$('energy_matrixnumtotal').update(conTotal.toDec());
		}else{
			$('energy_matrixnumtotal').update(numTotal.toDec());
		}
		
		// Percentages
		var mp1 = y1/numTotal*100;
		$('energy_mp1').update(mp1.toPerc(2));
		
		var mp2 = y2/numTotal*100;
		$('energy_mp2').update(mp2.toPerc(2));
		
		var mp3 = y3/numTotal*100;
		$('energy_mp3').update(mp3.toPerc(2));
		
		var mp4 = y4/numTotal*100;
		$('energy_mp4').update(mp4.toPerc(2));
		
		var mp5 = y5/numTotal*100;
		$('energy_mp5').update(mp5.toPerc(2));
		
		var mp6 = y6/numTotal*100;
		$('energy_mp6').update(mp6.toPerc(2));
		
		var percTotal = mp1+mp2+mp3+mp4+mp5+mp6;
		$('energy_matrixperctotal').update(percTotal.toPerc(2));
		
		// Score
		var ms1 = mp1*1;
		$('energy_ms1').update(ms1.toPerc(2));
		
		var ms2 = mp2*1;
		$('energy_ms2').update(ms2.toPerc(2));
		
		var ms3 = mp3*0.5;
		$('energy_ms3').update(ms3.toPerc(2));
		
		var ms4 = mp4*-0.5;
		$('energy_ms4').update(ms4.toPerc(2));
		
		var ms5 = mp5*-1;
		$('energy_ms5').update(ms5.toPerc(2));
		
		var ms6 = mp6*-2;
		$('energy_ms6').update(ms6.toPerc(2));
		
		var scoreTotal = ms1+ms2+ms3+ms4+ms5+ms6;
		$('energy_matrixscoretotal').update(scoreTotal.toPerc(2));
		$('lightSavingTotal').value = scoreTotal.toDec(2);
	},
	
	calcTotal: function(){
		var total = this.geyserTimersTotal +
			this.geyserTempTotal +
			this.geyserInsTotal +
			this.lightingTotal +
			this.airconTotal +
			this.machineWashTotal +
			//this.machineTumbleTotal + //TODO: Omitted in spreadsheet
			this.benchMSTotal +
			this.benchASTotal;
			
			$('energyTotal').value = total;
			$('energyTotalP').update(total.toDec(2));
	}
};