var EquivCalc = {};

/*
	factors for converting co2,ch4,n2o,hfc,pfc,sf6,and carb to Carbon Dioxide Equivalent
*/
EquivCalc.conv_factors = new Hash({
						  'co2' : 1,
						  'ch4' : 21,
						  'n2o' : 310,
						  'hfc' : 11700,
						  'pfc' : 6500,
						  'sf6' : 23900,
						  'carb' : 44/12});

/*
	equivalency factors; 
	i.e. 	4.62 metric ton of Carbon Dioxide Equivalent = 1 car off the road for one year
*/
EquivCalc.equiv_factors = new Array(
5.46, 	//	Passenger cars not driven for one year
10.99, 	// Household energy use
0.00881,	// Gallons of gasoline
0.43,	// Barrels of oil
74.88,	// Tanker trucks filled with gasoline
7.21,	// Household electricity use for one year (# of households)
0.039, 	// Number of tree seedlings grown for 10 years
4.4,		// Acres of pine or fir forests storing carbon for one year 
143.37,	// Acres of forest preserved from deforestation
0.024,	// Propane cylinders used for home barbeques
191.5, 	// Coal burned/railcars of coal
2.90,	// Tons of waste recycled instead of landfilled 
4643734); // coal fired power plant for one year

/*programmer Notes:
02/12/2009: above values are from the a formula, please click the question mark besides each item on the html page to find it
Household electricity use for one year (# of households): change from 7.55 to 7.21
Household energy use: change from 11.33 to 10.99
*/

EquivCalc.multiples = new Array(0.9071847,0.00045359237,1,0.001); //multiples for converting into metric tons
// The order is: Tons, Pounds, Metric Tons, Kilograms
// 1 ton [metric] = 1.1023113 ton [short]
// 1 ton [short] = 907.18474 kilogram
// 1 ton [metric] = 2,204.6226218 pound
// 1 ton [short] = 2,000 pound
EquivCalc.finalResultUnits = 2; // the default units for displaying the result is in Metric Tons

EquivCalc.setConvFactors = function(e)
{
	var targetSelect = Event.element(e);
	var chemName = targetSelect.name.substring(0, 3);
	var chemValue = $F($('conversion_table')[chemName]);
	this.conv_factors.set(chemName, parseFloat($F(targetSelect)));
	if (chemValue != "" && $F($('conversion_table')['y0']) != "") this.calculateTotal();
}

EquivCalc.calculateTotal = function(e)
{   //alert(this.finalResultUnits)
	if(e) Event.stop(e);
	var total = 0; // variable holding the total greenhouse gas reduction
	var error_flag = "No GHG values have been entered"; // variable holding the appropriate error message
	this.conv_factors.each(function(pair) {
		var name = pair.key;
		var value = EquivCalc.stripCommas($F($('conversion_table')[name]));
		if (value != "" && !isNaN(value)) {
			value = value * pair.value; // convert to Carbon Dioxide Equivalent
			value = parseFloat(EquivCalc.convertToTons(name, value)); // convert to Metric Tons
			total += value;
			error_flag = "";
		} else if (value != "" && isNaN(value)) {
			$('conversion_table')[name].focus();
			$('conversion_table')[name].select();
			error_flag = "<span class=\"calculator-warning\">Please enter a valid numerical value.</span>";
			return;
		}
	});
	
	if (error_flag == "") {
		this.clearErrs();
		$('conversion_table')['y0'].value = this.commaSplit(this.roundIt(total / this.multiples[this.finalResultUnits]));
		$('conversion_table').resultUnits[this.finalResultUnits].selected = true;
		for (i = 1; i <= this.equiv_factors.length; i++){
			var fieldName = "y" + i;
			$('conversion_table')[fieldName].value = this.commaSplit(this.roundIt(total / this.equiv_factors[i - 1]));
		}
	}
	else {
		this.convErr(error_flag);
	}
	
}

EquivCalc.setResultUnits = function()
{   //alert("set result units")
	this.finalResultUnits = parseFloat($F($('conversion_table')['resultUnits']));
	//alert($F($('starting_points')['equivalency']))
	if ($F($('conversion_table')['y0']) != "")  //this.calculateTotalV2();
	{
	  	if  ($F($('starting_points')['equivalency']) != "") {
	   		this.calculateTotalV2();
		}
	   
	    if  ($F($('starting_points')['equivalency']) == "") {
	   		this.calculateTotal();
		}	   
	}
}
		
EquivCalc.convertToTons = function(name, value)
{
	var factor = $F($('conversion_table')[name + "units"]);
	return (value * this.multiples[factor]);
}

EquivCalc.roundIt = function(number)
{
	var absolute = Math.abs(number);
	if (isNaN(number) || number == 0)
	{
		return number;
	}
	else
	{
		// If the result is above 100 let's just use a whole number. 
		if (absolute > 100)
		{
			number = Math.round(number);
		}
		// If it's lower than 100 but greater than 1, let's show it out to one decimal place (e.g., 10.1).
		else if ((absolute < 100) && (absolute > 1))
		{
			number = Math.round(number * 10) / 10;
		}
		// If it's below zero, let's show it out to two decimal places for numbers up to 1/100 (e.g., 0.95, or 0.09)
		else if ((absolute < 1) && (absolute > 0.001))
		{
			number = Math.round(number * 100) / 100;
		}
		//  and out to four decimal places for numbers smaller than that (e.g., 0.0097, 0.0030).
		else
		{
			number = Math.round(number * 10000) / 10000;
		}
		return number;
	}
}

EquivCalc.stripCommas = function(str)
{
	var commaFilter = /,/g;
	return str.replace(commaFilter, "");
}

EquivCalc.commaSplit = function(srcNumber)
{
	var txtNumber = new String(srcNumber);
	
	if (isNaN(srcNumber) || txtNumber == "") {
		return srcNumber;
	}
	else {
		var rxSplit = new RegExp('([0-9])([0-9][0-9][0-9][,.])');
		var arrNumber = txtNumber.split('.');
		arrNumber[0] += '.';
		do {
			arrNumber[0] = arrNumber[0].replace(rxSplit, '$1,$2');
		} while (rxSplit.test(arrNumber[0]));
		
		if (arrNumber.length > 1) {
			return arrNumber.join('');
		}
		else {
			return arrNumber[0].split('.')[0];
		}
    }
}

EquivCalc.handleStartingPoints = function(e)
{
	//alert("starting")
	var factors = { "gasoline" : 0.00881,
					"kilowatthours" : 0.0007181637346,
					"therms" : 0.005,
					"vehicles" : 5.46 };

//old data
//"kilowatthours" : 0.00077745732218,
//old data 2009 Jan27
//"kilowatthours" : 0.0007115911741323,

// Notes for engineer:
// this value=the data sent by client/(1000*2204.6226)
// unit for the data sent is "US annual non-baseload CO2 output emission rate (lb/MWh)"
// need to convert Mwh to kwh and convert lb to ton


	Event.stop(e);
	var typeChoice = $('starting_points')['equiv_type']
	var eType = $F(typeChoice);
	if(eType != "")
	{
		var userValue = 0;
		userValue = this.stripCommas($F($('starting_points')['equivalency']));
		if (userValue == "" || isNaN(userValue))
		{
			var typeString = typeChoice.options[typeChoice.selectedIndex].innerHTML;
			this.startErr("<span class=\"calculator-warning\">Please enter a valid numerical value.</span> " + typeString + ".");
			return false;
		}
		this.clearErrs();
		
		var CO2equiv = userValue * factors[eType];
	
		var form = $('conversion_table');
		form.reset();
		form.co2.value = CO2equiv; // set the value for CO2
		form.co2units[2].selected = true; // select metric tons
		this.calculateTotal(); // run the calculator
		form.co2.value = this.commaSplit(this.roundIt(CO2equiv)); // round the value for CO2
	}
}


EquivCalc.handleStartingPoints2 = function(e)
{
	//alert("starting2")
	var factors = { "gasoline" : 0.00881,
					"kilowatthours" : 0.0007181637346,
					"therms" : 0.005,
					"vehicles" : 5.46 };

      //old data
//"kilowatthours" : 0.00077745732218,
//old data 2009 Jan27
//"kilowatthours" : 0.0007115911741323,

	//Event.stop(e);
	var typeChoice = $('starting_points')['equiv_type']
	var eType = $F(typeChoice);
	//alert(eType)
	if(eType != "")
	{
		var userValue = 0;
		userValue = this.stripCommas($F($('starting_points')['equivalency']));
		if (userValue == "" || isNaN(userValue))
		{
			var typeString = typeChoice.options[typeChoice.selectedIndex].innerHTML;
			this.startErr("<span class=\"calculator-warning\">Please enter a valid numerical value.</span> " + typeString + ".");
			return false;
		}
		this.clearErrs();
		
		var CO2equiv = userValue * factors[eType];
		//alert(CO2equiv)
	
		var form = $('conversion_table');
		form.reset();
		form.co2.value = CO2equiv; // set the value for CO2
		form.co2units[2].selected = true; // select metric tons
		
		this.calculateTotal(); // run the calculator
		form.co2.value = this.commaSplit(this.roundIt(CO2equiv)); // round the value for CO2
	}
}

EquivCalc.handleCalcsAndRefs = function(e)
{
	var eType = $F($('starting_points')['equiv_type']);
	if(eType != "")
	{
		this.href = "refs.html#" + eType;
	}
	else
	{
		Event.stop(e);
	}
}

EquivCalc.startErr = function(errorMessage)
{
	$('startError').update(errorMessage);
}

EquivCalc.convErr = function(errorMessage)
{
	$('convError').update(errorMessage);
}

EquivCalc.clearErrs = function()
{
	$('convError').update("");
	$('startError').update("");
}

document.observe("dom:loaded", function() {
	$$('#starting_points a')[0].observe('click', EquivCalc.handleCalcsAndRefs);
	$('starting_points').observe('submit', EquivCalc.handleStartingPoints.bindAsEventListener(EquivCalc));
	$('conversion_table').observe('submit', EquivCalc.calculateTotal.bindAsEventListener(EquivCalc));
	$('conversion_table').observe('reset', EquivCalc.clearErrs);
	$($('conversion_table')['resultUnits']).observe('change', EquivCalc.setResultUnits.bindAsEventListener(EquivCalc));
	$($('conversion_table')['hfcoptions']).observe('change', EquivCalc.setConvFactors.bindAsEventListener(EquivCalc));
	$($('conversion_table')['pfcoptions']).observe('change', EquivCalc.setConvFactors.bindAsEventListener(EquivCalc));
});


EquivCalc.calculateTotalV2 = function(e)
{
		this.handleStartingPoints2(); // run the calculator	
}
