/* $Id: calculator.js 31908 2010-02-12 20:07:16Z 16867 $ */
/*
 * calculator.js
 * 
 * This file contains the functionality which runs the Personal Emissions Calculator.
 * The free JavaScript library Prototype is used throughout. For more information, visit 
 * http://www.prototypejs.org/
 *
 */

// These global variables shall be considered constants (even though JavaScript
// doesn't really have constants), so be careful not to modify their values.
var g_NUM_WEEKS_PER_YEAR = 52;
var g_NUM_MONTHS_PER_YEAR = 12;

var g_NUM_OF_VEHICLE_ENTRIES = 5;

var g_AVG_GAS_PRICE_PER_GALLON = 2.84;
var g_AVG_FUEL_OIL_PRICE_PER_GALLON = 2.78;
var g_AVG_PROPANE_PRICE_PER_GALLON = 2.19;
var g_AVG_NAT_GAS_PRICE_PER_THOUSAND_CUBIC_FEET = 14.14;
var g_AVG_ELEC_PRICE_PER_KILOWATT = 0.1;

var g_CO2_EMITTED_PER_GALLON_OF_GASOLINE = 19.4;
var g_NONCO2_EMITTED_PER_GALLON_OF_GASOLINE = (100 / 95);
var g_AVG_COST_PER_MILE = 0.16;

var g_NAT_GAS_CUBIC_FEET_EMISSIONS_FACTOR = 120.61;
var g_NAT_GAS_THERMS_EMISSIONS_FACTOR = 11.7;

var g_FUEL_OIL_EMISSIONS_FACTOR = 22.37;

var g_PROPANE_EMISSIONS_FACTOR = 12.17;

var g_NAT_GAS_AVG_EMISSIONS_PER_PERSON = 3600;
var g_NAT_GAS_AVG_COST_PER_PERSON = 35;
var g_ELEC_AVG_EMISSIONS_PER_PERSON = 5750;
var g_ELEC_AVG_COST_PER_PERSON = 35;
var g_FUEL_OIL_AVG_EMISSIONS_PER_PERSON = 4400;
var g_FUEL_OIL_AVG_COST_PER_PERSON = 45;
var g_PROPANE_AVG_EMISSIONS_PER_PERSON = 2650;
var g_PROPANE_AVG_COST_PER_PERSON = 40;

var g_WASTE_AVERAGE_PER_PERSON = 1021;

var g_NEWSPAPER_REDUCTION = -172.38;
var g_GLASS_REDUCTION = -29.95;
var g_PLASTIC_REDUCTION = -46.93;
var g_METAL_REDUCTION = -145.58;
var g_MAGAZINE_REDUCTION = -51.91;

var g_TOTAL_EMISSIONS_AVERAGE_PER_PERSON = 20750;

var g_SWITCH_WINDOWS_SAVINGS = 25210000 // in BTUs

// This global variable will hold the current e factor value
// as set by setEFactorFromZipCode() function. Defaults to 1 to
// prevent divide by zero errors if for some reason the real value is
// not set.
var g_eFactorValue = 1;


var submitting = false;
var dirty = false;
function taint(e) {
	dirty = true;
}
	
// This function sets the global variable g_eFactorValue by looking up
// the zip code retrieved from the form field in the object zipToEF
function setEFactorFromZipCode()
{
	var zip = $F($('calculator')['zip']);
	if(zip.length != 5)
	{
		displayZipError("Sorry, that is not a valid ZIP code.");
	} else {
		new Ajax.Request( 'energycost.php', { method:'get', parameters:'zip=' + zip,
			onCreate: function() {
				if(!$('waiting')) {			
					new Insertion.After($('calculator')['zip'], '<img id="waiting" src="/images/waiting.gif" height="16px" width="16px" />');
				} else {
					$('waiting').show();
				}
			},
			onSuccess: function(transport)
			{
				var efactor = parseFloat(transport.responseText);
				if(isNaN(efactor))
				{
					displayZipError("We don't have specific energy data for that ZIP code.  We'll use an approximate value for computing your carbon footprint instead.");
				}
				else
				{			
					// Value in database is in lbs per MWh; convert to lbs per KWh
					g_eFactorValue = efactor / 1000;
				
					var err = $('zipError');
					if(err)
					{
						err.hide();
					}
				}
			},
			onComplete: function() {
				$('waiting').hide();
			}
		});
	}
}

function displayZipError(errString)
{
	var zipField = $('calculator')['zip'];
	var zipError = $('zipError');
	if(!zipError)
	{
	    new Insertion.After(zipField, '<span id="zipError" class="error"></span>');
		var zipError = $('zipError');
	}
	zipError.update(errString);
	zipError.show();
	g_eFactorValue = 1;
}

function getPercentageOfTotal(value)
{
    var total = parseInt(stripCommas($F($('calculator')['TotalEmissions'])), 10);
    return (value/total) * 100;
}

function insertCommas(number)
{
    // Only insert commas in numbers greater than 1000
    // or less than -1000
    if ((number >= 1000) || (number <= -1000))
    {
        var wholePart;
        var fractionalPart;
        var position = 0;

        // convert to string
        number = String(number);

        if ((position = number.indexOf(".",0)) != -1)
        {
            wholePart = number.substring(0,position);
            fractionalPart = "." + number.substring(position + 1,number.length);
        }
        else
        {
            wholePart = number;
            fractionalPart = "";
        }

        if ((wholePart.length > 3))
        {
            var mod = wholePart.length % 3;
            var output = (mod > 0 ? (wholePart.substring(0,mod)) : '');
            for (var i = 0 ; i < Math.floor(wholePart.length/3) ; i++)
            {
                if ((mod === 0) && (i === 0))
				{
                    output += wholePart.substring(mod + 3 * i, mod + 3 * i + 3);
                }
				else
				{
                    output += ',' + wholePart.substring(mod + 3 * i, mod + 3 * i + 3);
				}
            }
            return output + fractionalPart;
        }
        else
        {
            return number;
        }
    }
    else
    {
        return number;
    }
}

function stripCommas(number)
{
    var searchString = /,/g;
    return number.replace(searchString, "");
}

// Since radio groups do not give out the selected value automatically,
// this function will loop through a group of radio buttons and find which
// is checked, and return its value
// radios - an array of form inputs of type radio
function getValueFromRadios(radioGroupName)
{
	var radios = $('calculator').getInputs('radio', radioGroupName);
    var checked = radios.find(function(radio)
	{
		return radio.checked;
	});
	return (checked) ? checked.value : 0;
}

function getYesNoRadiosValue(radioGroupName)
{
    return (getValueFromRadios(radioGroupName) == "Yes") ? true : false;
}

function checkGreenPowerPercentages()
{
    var form = $('calculator');
	var message = $("percentMessage");
	var newPercentageField = form['increaseGreenPowerPercentage'];
	var newPercentage = parseFloat($F(newPercentageField));
	
	if (getYesNoRadiosValue('yesNoGreenPower'))
	{
		var currentPercentage = parseFloat($F(form['buyGreenPowerPercentage']));
		var potentialPercentage = 100 - currentPercentage;
        
        if(potentialPercentage != 0)
        {
    		message.update("Based on how much of your electricity you currently purchase as Green Power ("
    			 + currentPercentage + "%), you may purchase up to "
    			 + potentialPercentage + "% more Green Power.");
    		message.show();
    		
    		if ((newPercentage + currentPercentage) > 100)
    		{
    			newPercentageField.value = 100 - currentPercentage;
    		}
            
            $('increaseGreenPowerQuestion').show();
        }
        else
        {
            $('increaseGreenPowerQuestion').hide();
        }
	}
	else
	{
		if (newPercentage > 100)
		{
			newPercentageField.value = 100;
		}
		message.hide();
	}
}

function checkItemsRecycled()
{   
    var newspaper = getYesNoRadiosValue('yesNoNewspaper');
    var glass = getYesNoRadiosValue('yesNoGlass');
    var plastic = getYesNoRadiosValue('yesNoPlastic');
    var metal = getYesNoRadiosValue('yesNoMetal');
    var mags = getYesNoRadiosValue('yesNoMagazines');

    if(![newspaper, glass, plastic, metal, mags].all())
    {
        var itemsNotRecycled = new Array();
        itemsNotRecycled.push( newspaper ? null : "newspaper" );
        itemsNotRecycled.push( glass ? null : "glass" );
        itemsNotRecycled.push( plastic ? null : "plastic" );
        itemsNotRecycled.push( metal ? null : "metal" );
        itemsNotRecycled.push( mags ? null : "magazines" );
    
        itemsNotRecycled = itemsNotRecycled.compact();
    
        var list = "";
        for(var i = 0, len = itemsNotRecycled.length; i < len; ++i)
        {
            var s = itemsNotRecycled[i];
			if(len == 1)
			{
				list = s;
				break;
			}
			
            if(i == len - 1)
            {
                list = list + " and " + s;
            }
            else if(i == len - 2)
            {
                list = list + s;
            }
            else
            {
                list = list + s + ", ";
            }
        }
        $('non-recycled_items').update("(such as " + list + ")");
        $$('#startRecyclingMore tr').invoke('show');
        
        if($('recyclingAllNote'))
        {
            $('recyclingAllNote').remove();
        }
    }
    else
    {
        $('non-recycled_items').update();
        $$('#startRecyclingMore tr').invoke('hide');
        if(!$('recyclingAllNote'))
        {
            new Insertion.Top('startRecyclingMore', 
                '<tr id="recyclingAllNote"><td colspan="5"><p>You indicated in the previous section that you already recycle newspaper, plastic, magazines, glass, and metal. Thank you!</p></td></tr>');
			$('startRecyclingMore').up('table').setStyle({width: '100%'});
        }
        else
        {
            $('recyclingAllNote').show();
        }
    }
}

function currentTransportationEmissions()
{
    var form = $('calculator');
    
    for (var i = 1; i <= g_NUM_OF_VEHICLE_ENTRIES; i++)
    {
        var mileage = stripCommas($F(form["avgMileage_veh" + i]));
        var gasMileage = stripCommas($F(form["avgGasMileage_veh" + i]));

        // If either value is zero, we can assume the fields have not yet been filled out
        if ((mileage === '0') || (gasMileage === '0'))
        {
            continue;
        }

        var milesPerWhat = getValueFromRadios("milesPerWhat_veh" + i);
        var emissions = 0;
        if (milesPerWhat == "Per Week")
        {
            emissions = (mileage * g_NUM_WEEKS_PER_YEAR) / gasMileage * g_CO2_EMITTED_PER_GALLON_OF_GASOLINE * g_NONCO2_EMITTED_PER_GALLON_OF_GASOLINE;
        }
        else if(milesPerWhat == "Per Year")
        {
            emissions = mileage / gasMileage * g_CO2_EMITTED_PER_GALLON_OF_GASOLINE * g_NONCO2_EMITTED_PER_GALLON_OF_GASOLINE;
        }
        form["co2_veh" + i].value = insertCommas(Math.round(emissions));
    }
}

function currentHomeEnergyEmissions()
{
    var form = $('calculator');
    
    function calcElectric()
    {
        var electric = stripCommas($F(form['amountElectricity']));
        var amountType = getValueFromRadios('amountElectricChoice');
        
        var emissions = 0;
        if (amountType == "dollars")
        {
            emissions = (electric / g_AVG_ELEC_PRICE_PER_KILOWATT) * g_eFactorValue * g_NUM_MONTHS_PER_YEAR;
        }
        else if (amountType == "kilowatthours")
        {
            emissions = electric * g_eFactorValue * g_NUM_MONTHS_PER_YEAR;
        }

        if (getYesNoRadiosValue('yesNoGreenPower'))
        {
            var greenPercentage = $F(form['buyGreenPowerPercentage']);
            emissions = emissions * (1 - (greenPercentage / 100));
        }
        
        form['lbsElectric'].value = insertCommas(Math.round(emissions));
    }

    function calcNaturalGas()
    {
        var natGas = stripCommas($F(form['amountNatGas']));
        var amountType = getValueFromRadios('amountNatGasChoice');
        
        var emissions = 0;
        if (amountType == "dollars")
        {
            emissions = (natGas / g_AVG_NAT_GAS_PRICE_PER_THOUSAND_CUBIC_FEET) 
				* g_NAT_GAS_CUBIC_FEET_EMISSIONS_FACTOR * g_NUM_MONTHS_PER_YEAR;
        }
        else if (amountType == "thousandcubicfeet")
        {
            emissions = g_NAT_GAS_CUBIC_FEET_EMISSIONS_FACTOR * natGas * g_NUM_MONTHS_PER_YEAR;
        }
        else if (amountType == "therms")
        {
            emissions = g_NAT_GAS_THERMS_EMISSIONS_FACTOR * natGas * g_NUM_MONTHS_PER_YEAR;
        }

        form['lbsNatGas'].value = insertCommas(Math.round(emissions));
    }

    function calcFuelOil()
    {
        var fuelOil = stripCommas($F(form['amountFuelOil']));
        var amountType = getValueFromRadios('amountFuelOilChoice');

        var emissions = 0;
        if (amountType == "dollars")
        {
            emissions = (fuelOil / g_AVG_FUEL_OIL_PRICE_PER_GALLON) * g_FUEL_OIL_EMISSIONS_FACTOR * g_NUM_MONTHS_PER_YEAR;
        }
        else if (amountType == "gallons")
        {
            emissions = g_FUEL_OIL_EMISSIONS_FACTOR * fuelOil * g_NUM_MONTHS_PER_YEAR;
        }

        form['lbsFuelOil'].value = insertCommas(Math.round(emissions));
    }
	
	function calcPropane()
    {
        var propane = stripCommas($F(form['amountPropane']));
        var amountType = getValueFromRadios('amountPropaneChoice');

        var emissions = 0;
        if (amountType == "dollars")
        {
            emissions = (propane / g_AVG_PROPANE_PRICE_PER_GALLON) * g_PROPANE_EMISSIONS_FACTOR * g_NUM_MONTHS_PER_YEAR;
        }
        else if (amountType == "gallons")
        {
            emissions = g_PROPANE_EMISSIONS_FACTOR * propane * g_NUM_MONTHS_PER_YEAR;
        }

        form['lbsPropane'].value = insertCommas(Math.round(emissions));
    }

    calcElectric();
    calcNaturalGas();
    calcFuelOil();
	calcPropane();
}

function currentWasteEmissions()
{
    var form = $('calculator');
    var numPeople = $F(form['occupants']);

    var wasteEm = numPeople * g_WASTE_AVERAGE_PER_PERSON;
    form['lbsWaste'].value = insertCommas(wasteEm);

    var newspaper = getYesNoRadiosValue('yesNoNewspaper');
    var glass = getYesNoRadiosValue('yesNoGlass');
    var plastic = getYesNoRadiosValue('yesNoPlastic');
    var metal = getYesNoRadiosValue('yesNoMetal');
    var mags = getYesNoRadiosValue('yesNoMagazines');

    var newsEm = (newspaper) ? numPeople * g_NEWSPAPER_REDUCTION : 0;
    form['lbsForNewspaper'].value = Math.round(newsEm);

    var glassEm = (glass) ? numPeople * g_GLASS_REDUCTION : 0;
    form['lbsForGlass'].value = Math.round(glassEm);

    var plasticEm = (plastic) ? numPeople * g_PLASTIC_REDUCTION : 0;
    form['lbsForPlastic'].value = Math.round(plasticEm);

    var metalEm = (metal) ? numPeople * g_METAL_REDUCTION : 0;
    form['lbsForMetal'].value = Math.round(metalEm);
    
    var magsEm = (mags) ? numPeople * g_MAGAZINE_REDUCTION : 0;
    form['lbsForMagazines'].value = Math.round(magsEm);
    
    var total = Math.round(wasteEm + newsEm + glassEm + plasticEm + metalEm + magsEm);
    form['TotalRecyclingEmissions'].value = insertCommas(total);
}

function currentTotalEmissions()
{
    var form = $('calculator');
    var total = 0;

    for (var i = 1; i <= g_NUM_OF_VEHICLE_ENTRIES; i++)
    {
        if ($("vehicle" + i).visible())
        {
            var vehicle = parseFloat(stripCommas($F(form["co2_veh" + i])));
            total += vehicle;
        }
    }

    total += parseFloat(stripCommas($F(form['lbsElectric'])));
    total += parseFloat(stripCommas($F(form['lbsNatGas'])));
    total += parseFloat(stripCommas($F(form['lbsFuelOil'])));

    var totalAfterRecycle = parseFloat(stripCommas($F(form['TotalRecyclingEmissions'])));
    total += totalAfterRecycle;

    form['TotalEmissions'].value = insertCommas(Math.round(total));
}

function reduceTransportationEmissions()
{
    var form = $('calculator');
    
    function calcDriveLess()
    {
        for (var i = 1; i <= g_NUM_OF_VEHICLE_ENTRIES; i++)
        {
            var dollarSavings = 0;
            var co2Savings = 0;
            var percentSavings = 0;

            if (getYesNoRadiosValue("driveLessChoice_veh" + i))
            {
                var milesLess = stripCommas($F(form["driveLessAmount_veh" + i]));
                var gasMileage = parseFloat($F(form["avgGasMileage_veh" + i]));
                if (getYesNoRadiosValue("increaseGasMileageChoice_veh" + i))
                {
                    gasMileage = gasMileage + parseFloat($F(form["increaseGasMileageAmount_veh" + i]));
                }
                
                // If either value is zero, do not do any calculations
                if ((milesLess === '0') || (gasMileage == 0))
                {
                    continue;
                }
                
                // Calculate value as amount per week, because that's what the form asks for
                dollarSavings = milesLess * g_NUM_WEEKS_PER_YEAR * g_AVG_COST_PER_MILE;
                co2Savings = (milesLess * g_NUM_WEEKS_PER_YEAR) / gasMileage * g_CO2_EMITTED_PER_GALLON_OF_GASOLINE * g_NONCO2_EMITTED_PER_GALLON_OF_GASOLINE;

                percentSavings = getPercentageOfTotal(co2Savings);
            }

            form["reduceMileageAnnualSavings_veh" + i].value = insertCommas(Math.round(dollarSavings));
            form["lbsForReduceMileage_veh" + i].value = insertCommas(Math.round(co2Savings));
            form["reduceMileagePercent_veh" + i].value = Math.round(percentSavings);
        }
    }

    function calcRegMaintenance()
    {
        var multiplier = 0.07
        var dollarSavings = 0;
        var co2Savings = 0;
        var percentSavings = 0;

        if (getYesNoRadiosValue('regMaintenance'))
        {	
            for (var i = 1; i <= g_NUM_OF_VEHICLE_ENTRIES; i++)
            {
                if ($("vehicle" + i).visible())
                {
                    var mileage = stripCommas($F(form["avgMileage_veh" + i]));
                    var gasMileage = stripCommas($F(form["avgGasMileage_veh" + i]));

                    // If either value is zero, do not do any calculations
                    if ((mileage === '0') || (gasMileage === '0'))
                    {
                        continue;
                    }

                    if (getValueFromRadios("milesPerWhat_veh" + i) == "Per Week")
                    {
                        mileage *= g_NUM_WEEKS_PER_YEAR;
                    }

                    dollarSavings += mileage / gasMileage * g_AVG_GAS_PRICE_PER_GALLON * multiplier;
                    co2Savings += mileage / gasMileage * g_CO2_EMITTED_PER_GALLON_OF_GASOLINE * g_NONCO2_EMITTED_PER_GALLON_OF_GASOLINE * multiplier;
                }
            }

            percentSavings = getPercentageOfTotal(co2Savings);
        }

        form['annualSavingsForRegMaintenance'].value = insertCommas(Math.round(dollarSavings));
        form['lbsForRegMaintenance'].value = insertCommas(Math.round(co2Savings));
        form['percentForRegMaintenance'].value = Math.round(percentSavings);
    }


    function calcIncreaseGasMileage()
    {
        for (var i = 1; i <= g_NUM_OF_VEHICLE_ENTRIES; i++)
        {
            var dollarSavings = 0;
            var co2Savings = 0;
            var percentSavings = 0;

            if (getYesNoRadiosValue("increaseGasMileageChoice_veh" + i))
            {
                var moreMPG = parseInt(stripCommas($F(form["increaseGasMileageAmount_veh" + i])));
                var mileage = parseInt(stripCommas($F(form["avgMileage_veh" + i])));
                var gasMileage = parseInt(stripCommas($F(form["avgGasMileage_veh" + i])));

                // If either value is zero, do not do any calculations
                if ((mileage == 0) || (gasMileage == 0))
                {
                    continue;
                }

                if (getValueFromRadios("milesPerWhat_veh" + i) == "Per Week")
				{
					mileage *= g_NUM_WEEKS_PER_YEAR;
				}
				
				dollarSavings = ((mileage / gasMileage) * g_AVG_GAS_PRICE_PER_GALLON) - ((mileage / (gasMileage + moreMPG)) * g_AVG_GAS_PRICE_PER_GALLON);
                co2Savings = ((mileage / gasMileage) * g_CO2_EMITTED_PER_GALLON_OF_GASOLINE * g_NONCO2_EMITTED_PER_GALLON_OF_GASOLINE)
                             - ((mileage / (gasMileage + moreMPG)) * g_CO2_EMITTED_PER_GALLON_OF_GASOLINE * g_NONCO2_EMITTED_PER_GALLON_OF_GASOLINE);

                percentSavings = getPercentageOfTotal(co2Savings);
            }

            form["increaseGasMileageAnnualSavings_veh" + i].value = insertCommas(Math.round(dollarSavings));
            form["lbsForIncreaseGasMileage_veh" + i].value = insertCommas(Math.round(co2Savings));
            form["increaseGasMileagePercent_veh" + i].value = Math.round(percentSavings);
        }
    }

    calcDriveLess();
    calcIncreaseGasMileage();
    calcRegMaintenance();
}

function reduceHomeEnergyEmissions()
{
    var form = $('calculator');
    
    function calcWinterAndSummerDegrees()
    {
        var winterDegrees = $F(form['winterDegrees']);
        var summerDegrees = $F(form['summerDegrees']);

        var energyType = getValueFromRadios('energyType');

        var lbsWinter = 0;

        var lbsElectric = stripCommas($F(form['lbsElectric']));
        var lbsSummer = lbsElectric * 0.16 * 0.05 * 0.42 * summerDegrees;

        if (energyType == "electric")
        {
            lbsWinter = lbsElectric * 0.33 * 0.01 * winterDegrees;
        }
        else if (energyType == "natGas")
        {
            var lbsNatGas = stripCommas($F(form['lbsNatGas']));
            lbsWinter = lbsNatGas * 0.42 * 0.01 * winterDegrees;
        }
        else if (energyType == "fuelOil")
        {
            var lbsFuelOil = stripCommas($F(form['lbsFuelOil']));
            lbsWinter = lbsFuelOil * 0.42 * 0.01 * winterDegrees;
        }
        else if (energyType == "propane")
        {
            var lbsPropane = stripCommas($F(form['lbsPropane']));
            lbsWinter = lbsPropane * 0.42 * 0.01 * winterDegrees;
        }
        else if (energyType == "wood")
        {
            lbsWinter = 0;
        }

        if (getYesNoRadiosValue('winterDegreesChoice'))
        {
            form['annualSavingsForWinterDegrees'].value = winterDegrees * 18;
            form['lbsForWinter'].value = insertCommas(Math.round(lbsWinter));
            form['percentForWinter'].value = Math.round(getPercentageOfTotal(lbsWinter));
        }
        else
        {
            form['annualSavingsForWinterDegrees'].value = 0;
            form['lbsForWinter'].value = 0;
            form['percentForWinter'].value = 0;
        }

        if (getYesNoRadiosValue('summerDegreesChoice'))
        {
            form['annualSavingsForSummerDegrees'].value = summerDegrees * 10;
            form['lbsForSummer'].value = insertCommas(Math.round(lbsSummer));
            form['percentForSummer'].value = Math.round(getPercentageOfTotal(lbsSummer));
        }
        else
        {
            form['annualSavingsForSummerDegrees'].value = 0;
            form['lbsForSummer'].value = 0;
            form['percentForSummer'].value = 0;
        }
    }
	
	function calcColdWater()
	{
		if (getYesNoRadiosValue('choiceColdWater'))
        {
			var numLoads = parseInt($F(form['numLoads']));
            var lbs = 1.07 * g_NUM_WEEKS_PER_YEAR * numLoads * g_eFactorValue;
            var dollarSavings = 1.07 * 0.1 * numLoads * g_NUM_WEEKS_PER_YEAR;
            form['annualSavingsForColdWater'].value = Math.round(dollarSavings);
            form['lbsForColdWater'].value = insertCommas(Math.round(lbs));
            form['percentForColdWater'].value = Math.round(getPercentageOfTotal(lbs));
        }
        else
        {
            form['annualSavingsForColdWater'].value = 0;
            form['lbsForColdWater'].value = 0;
            form['percentForColdWater'].value = 0;
        }
	}
	
    function calcYesNoAction(actionName, lbsMultiplier, dollarSavings)
    {
        if (getYesNoRadiosValue("choice" + actionName))
        {
            var lbs = lbsMultiplier * g_eFactorValue;
            form["annualSavingsFor" + actionName].value = dollarSavings;
            form["lbsFor" + actionName].value = insertCommas(Math.round(lbs));
            form["percentFor" + actionName].value = Math.round(getPercentageOfTotal(lbs));
        }
        else
        {
            form["annualSavingsFor" + actionName].value = 0;
            form["lbsFor" + actionName].value = 0;
            form["percentFor" + actionName].value = 0;
        }
    }

    function calcActionWithEnergyType(actionName, elecVal, gasVal, oilVal, propaneVal, dollarSavings)
    {
        if (getYesNoRadiosValue("choice" + actionName))
        {
            var energyType = getValueFromRadios('energyType');
            var lbs = 0;
            if (energyType == "electric")
            {
                lbs = elecVal;
            }
            else if (energyType == "natGas")
            {
                lbs = gasVal;
            }
            else if (energyType == "fuelOil")
            {
                lbs = oilVal;
            }
            else if (energyType == "propane")
            {
                lbs = propaneVal;
            }

            form["annualSavingsFor" + actionName].value = dollarSavings;
            form["lbsFor"+ actionName].value = insertCommas(Math.round(lbs));
            form["percentFor" + actionName].value = Math.round(getPercentageOfTotal(lbs));
        }
        else
        {
            form["annualSavingsFor" + actionName].value = 0;
            form["lbsFor"+ actionName].value = 0;
            form["percentFor" + actionName].value = 0;
        }
    }
    
    function calcGreenPower()
    {
        if (getYesNoRadiosValue('choiceGreenPower'))
        {
            var percentage = parseInt($F(form['increaseGreenPowerPercentage'])) / 100;
            var lbsElectric = stripCommas($F(form['lbsElectric']));
            var lbs = percentage * lbsElectric;
            form['lbsForGreenPower'].value = insertCommas(Math.round(lbs));
            form['percentForGreenPower'].value = Math.round(getPercentageOfTotal(lbs));
        }
        else
        {
            form['lbsForGreenPower'].value = 0;
            form['percentForGreenPower'].value = 0;
        }
    }

    function calcReplaceBulbs()
    {
        if (getYesNoRadiosValue('choiceReplaceBulbs'))
        {
            var numBulbs = parseInt($F(form['numBulbs']));
            var lbs = numBulbs * 73 * g_eFactorValue;
            form['annualSavingsForReplaceBulbs'].value = numBulbs * 7;
            form['lbsForReplaceBulbs'].value = insertCommas(Math.round(lbs));
            form['percentForReplaceBulbs'].value = Math.round(getPercentageOfTotal(lbs));
        }
        else
        {
            form['annualSavingsForReplaceBulbs'].value = 0;
            form['lbsForReplaceBulbs'].value = 0;
            form['percentForReplaceBulbs'].value = 0;
        }
    }

    calcWinterAndSummerDegrees();
    
    calcYesNoAction("ComputerSleep", 554, 55);
    calcYesNoAction("NoDryer", 375, 38);
    calcYesNoAction("ReplaceFridge", 380, 38);
    
    calcActionWithEnergyType("ReplaceFurnace", 0, 3011, 4151, 0, 266);
    calcActionWithEnergyType("ReplaceWindows", g_SWITCH_WINDOWS_SAVINGS / 10280 * g_eFactorValue, g_SWITCH_WINDOWS_SAVINGS / 1030000 * g_NAT_GAS_CUBIC_FEET_EMISSIONS_FACTOR, g_SWITCH_WINDOWS_SAVINGS / 149793 * g_FUEL_OIL_EMISSIONS_FACTOR, g_SWITCH_WINDOWS_SAVINGS / 88571 * g_PROPANE_EMISSIONS_FACTOR, 358);
    
	calcColdWater();
    calcGreenPower();
    calcReplaceBulbs();
}

function reduceWasteEmissions()
{
    var form = $('calculator');
    var numPeople = $F(form['occupants']);

    if (getYesNoRadiosValue('yesNoRecycling'))
    {
        var newspaper = getYesNoRadiosValue('yesNoNewspaper');
        var glass = getYesNoRadiosValue('yesNoGlass');
        var plastic = getYesNoRadiosValue('yesNoPlastic');
        var metal = getYesNoRadiosValue('yesNoMetal');
        var mags = getYesNoRadiosValue('yesNoMagazines');

        var newsEm = (newspaper) ? 0 : numPeople * -g_NEWSPAPER_REDUCTION;
        var glassEm = (glass) ? 0 : numPeople * -g_GLASS_REDUCTION;
        var plasticEm = (plastic) ? 0 : numPeople * -g_PLASTIC_REDUCTION;
        var metalEm = (metal) ? 0 : numPeople * -g_METAL_REDUCTION;
        var magsEm = (mags) ? 0 : numPeople * -g_MAGAZINE_REDUCTION;

        var lbs = newsEm + glassEm + plasticEm + metalEm + magsEm;
        form['lbsForRecycling'].value = insertCommas(Math.round(lbs));
        form['percentForRecycling'].value = Math.round(getPercentageOfTotal(lbs));
    }
    else
    {
        form['lbsForRecycling'].value = 0;
        form['percentForRecycling'].value = 0;
    }
}

function totalSavings()
{
    var form = $('calculator');
    var totalLbs = 0;
	var totalDollarSavings = 0;
    
    for (var i = 1; i <= g_NUM_OF_VEHICLE_ENTRIES; i++)
    {
        totalLbs += parseInt(stripCommas($F(form["lbsForReduceMileage_veh" + i])));
        totalLbs += parseInt(stripCommas($F(form["lbsForIncreaseGasMileage_veh" + i])));
	    totalDollarSavings += parseInt(stripCommas($F(form["reduceMileageAnnualSavings_veh" + i])));
	    totalDollarSavings += parseInt(stripCommas($F(form["increaseGasMileageAnnualSavings_veh" + i])));
    }
	
    totalLbs += parseInt(stripCommas($F(form['lbsForRegMaintenance'])));
    totalLbs += parseInt(stripCommas($F(form['lbsForWinter'])));
    totalLbs += parseInt(stripCommas($F(form['lbsForSummer'])));
    totalLbs += parseInt(stripCommas($F(form['lbsForComputerSleep'])));
    totalLbs += parseInt(stripCommas($F(form['lbsForColdWater'])));
    totalLbs += parseInt(stripCommas($F(form['lbsForNoDryer'])));
    totalLbs += parseInt(stripCommas($F(form['lbsForGreenPower'])));
    totalLbs += parseInt(stripCommas($F(form['lbsForReplaceBulbs'])));
    totalLbs += parseInt(stripCommas($F(form['lbsForReplaceFridge'])));
    totalLbs += parseInt(stripCommas($F(form['lbsForReplaceFurnace'])));
    totalLbs += parseInt(stripCommas($F(form['lbsForReplaceWindows'])));
    totalLbs += parseInt(stripCommas($F(form['lbsForRecycling'])));

    totalDollarSavings += parseInt(stripCommas($F(form['annualSavingsForRegMaintenance'])));
    totalDollarSavings += parseInt(stripCommas($F(form['annualSavingsForWinterDegrees'])));
    totalDollarSavings += parseInt(stripCommas($F(form['annualSavingsForSummerDegrees'])));
    totalDollarSavings += parseInt(stripCommas($F(form['annualSavingsForComputerSleep'])));
    totalDollarSavings += parseInt(stripCommas($F(form['annualSavingsForColdWater'])));
    totalDollarSavings += parseInt(stripCommas($F(form['annualSavingsForNoDryer'])));
    totalDollarSavings += parseInt(stripCommas($F(form['annualSavingsForReplaceBulbs'])));
    totalDollarSavings += parseInt(stripCommas($F(form['annualSavingsForReplaceFridge'])));
    totalDollarSavings += parseInt(stripCommas($F(form['annualSavingsForReplaceFurnace'])));
    totalDollarSavings += parseInt(stripCommas($F(form['annualSavingsForReplaceWindows'])));
    
    form['lbsEmissionsReduced'].value = insertCommas(Math.round(totalLbs));
    form['percentEmissionsReduced'].value = Math.round(getPercentageOfTotal(totalLbs));
    form['annualDollarSavings'].value = insertCommas(Math.round(totalDollarSavings));

    var total = parseInt(stripCommas($F($('calculator')['TotalEmissions'])), 10);
	var occupants = parseInt($F(form['occupants']));
	var newTotal = total - totalLbs;
    form['newTotalEmissions'].value = insertCommas(Math.round(newTotal));
	form['newTotalEmissionsPerOccupant'].value = insertCommas(Math.round(newTotal / occupants));
}

function changeEnergyType()
{
	var heatingAreas = $('turnDownHeat', 'replaceFurnace', 'replaceWindows');
    var energyType = getValueFromRadios('energyType');
	if ((energyType == "none") ||
        (energyType == "wood"))
	{
		heatingAreas.invoke('hide');
	}
	else
	{
		heatingAreas.invoke('show');
	}
	
	if ((energyType == "fuelOil") || (energyType == "natGas")) {
		$('replaceFurnace').show();
	} else {
		$('replaceFurnace').hide();
	}
}

function changeNumVehicles()
{
    var radioValue = getValueFromRadios('numVehicles');
    var num = radioValue == "none" ? 0 : parseInt(radioValue);
    var form = $('calculator');
	
    for (var i = 1; i <= g_NUM_OF_VEHICLE_ENTRIES; i++)
    {
        var vehicle = "vehicle" + i;
		var reduceMileage = "reduceMileageVeh" + i;
		var replaceVehicle = "replacevehicle" + i;
		
        if (i <= num)
        {
            $(vehicle, reduceMileage, replaceVehicle, 'calc_reduceOnTheRoad').invoke('show');
        }
        else
        {
	        if (num > 0)
	        {
	            $(vehicle, reduceMileage, replaceVehicle).invoke('hide');
	        }
	        else
	        {
	            $(vehicle, reduceMileage, replaceVehicle, 'calc_reduceOnTheRoad').invoke('hide');
	        }
            form['avgMileage_veh'+i].value = 0;
            form['avgGasMileage_veh'+i].value = 0;
            form['co2_veh'+i].value = 0;
        }
    }
	
    if(num == 1)
    {
        $('vehiclePlural').update();
    }
    else
    {
        $('vehiclePlural').update("s");
    }
}

function showNumLoadsQuestion()
{
	if (getYesNoRadiosValue('choiceColdWater'))
	{
		$('numLoadsParagraph').show();
	}
	else
	{
		$('numLoadsParagraph').hide();
	}
}

function showGreenPowerQuestion()
{
	if (getYesNoRadiosValue('yesNoGreenPower'))
	{
		$('greenPowerPortion').show();
	}
	else
	{
		$('greenPowerPortion').hide();
        $('calculator')['buyGreenPowerPercentage'].value = 0;
	}
}

function changeNumInHousehold()
{
	var numPeopleField = $('calculator').occupants;
	var numPeople = Number($F(numPeopleField));
	
	var numbers = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
	var numberPart = "one";
	var nounPart = "person";
	
	if (numPeople > 9)
	{
		numberPart = String(numPeople);
	}
	else
	{
		numberPart = numbers[numPeople - 1];
	}
		
	if (numPeople > 1)
	{
		nounPart = "people";
	}
	
	$$('span.numInHousehold').invoke('update', numberPart + " " + nounPart);
	
	$('natgas_avg_cost').update(insertCommas((numPeople * g_NAT_GAS_AVG_COST_PER_PERSON).floor()));
	$('natgas_avg_emissions').update(insertCommas(numPeople * g_NAT_GAS_AVG_EMISSIONS_PER_PERSON));
	$('elec_avg_cost').update(insertCommas((numPeople * g_ELEC_AVG_COST_PER_PERSON).floor()));
	$('elec_avg_emissions').update(insertCommas(numPeople * g_ELEC_AVG_EMISSIONS_PER_PERSON));
	$('fueloil_avg_cost').update(insertCommas((numPeople * g_FUEL_OIL_AVG_COST_PER_PERSON).floor()));
	$('fueloil_avg_emissions').update(insertCommas(numPeople * g_FUEL_OIL_AVG_EMISSIONS_PER_PERSON));
	$('propane_avg_cost').update(insertCommas((numPeople * g_PROPANE_AVG_COST_PER_PERSON).floor()));
	$('propane_avg_emissions').update(insertCommas(numPeople * g_PROPANE_AVG_EMISSIONS_PER_PERSON));
	$$('.waste_avg').invoke('update', insertCommas(numPeople * g_WASTE_AVERAGE_PER_PERSON));
    $('nat_avg_emissions').update(insertCommas(numPeople * g_TOTAL_EMISSIONS_AVERAGE_PER_PERSON));
}

// This function is executed after any editable field value is changed,
// and recalculates every field value.
function recalculate()
{
	$('calculator').getInputs('text').each(function(tf)
    {
		if (tf.name != "zip")
		{
			// Check for empty string or invalid value
	        if (tf.value === "" || isNaN(parseFloat(stripCommas(tf.value))))
    	    {
        	    tf.value = 0;
        	}
        
			// Check for leading zeros
			while ((tf.value.charAt(0) == "0") && (tf.value.length > 1))
			{
				tf.value = tf.value.substring(1)
			}
		}
    });
	
	changeNumInHousehold();
    checkItemsRecycled();
    checkGreenPowerPercentages();
	
    currentTransportationEmissions();
    currentHomeEnergyEmissions();
    currentWasteEmissions();
    currentTotalEmissions();

    reduceTransportationEmissions();
    reduceHomeEnergyEmissions();
    reduceWasteEmissions();
    totalSavings();
	
	// Update DYP fields
	$('est_emissions').update(stringToBigDigits($F($('calculator')['TotalEmissions']).toString() + " lbs."));
	centerBigDigits($('est_emissions'));
	$('pledged').update($F($('calculator')['lbsEmissionsReduced']) + " lbs.");
	$('savings').update('$' + $F($('calculator')['annualDollarSavings']));
}

var TabNav = Class.create({
	initialize: function(container) {
		this.container = $(container);
		this.tabs = this.container.select('a');
		
		this.resetWidths();
		
		this.last = this.tabs.first().addClassName('current');
		this.last.setStyle({ width: this.getExpandedWidth(this.last) + 'px' });
		
		this.tabs.reject(function(tab) { return tab == this.last }.bind(this)).pluck('hash').each(function(hash) {
			$(hash.substr(1)).hide();
		});
		
		this.tabs.invoke('observe', 'click', this.swap.bindAsEventListener(this));
	},
	
	setActiveTab: function(fresh) {
		fresh = $(fresh);
		if(fresh != this.last) {
			var stale = this.last;
			var staleWidth = this.getNaturalWidth(stale);
			var freshWidth = this.getExpandedWidth(fresh);
			var staleSection = $(stale.hash.substr(1));
			var freshSection = $(fresh.hash.substr(1));
			
			stale.setStyle({width: staleWidth + 'px' }).removeClassName('current');
			fresh.setStyle({width: freshWidth + 'px' }).addClassName('current');
			
			staleSection.hide();
			freshSection.show().setStyle({opacity: 1});
			
			this.last = fresh;
		}
	},
	
	swap: function(e) {
		Event.stop(e);
		var fresh = Event.element(e);
		if(this.swapListener) {
			this.swapListener(fresh.id);
		}
		this.swapTo(fresh);
	},
	
	swapTo: function(fresh) {
		fresh = $(fresh);
		if(fresh != this.last) {
			var stale = this.last;
			var staleWidth = this.getNaturalWidth(stale);
			var freshWidth = this.getExpandedWidth(fresh);
			var staleSection = $(stale.hash.substr(1));
			var freshSection = $(fresh.hash.substr(1));
			new Effect.Parallel([new Effect.Morph(stale, { style: { width: staleWidth + 'px' },
					beforeStart: function(effect) {
				  	effect.element.removeClassName('current');
				}}),
				new Effect.Morph(fresh, { style: { width: freshWidth + 'px' },
					afterFinish: function(effect) {
					effect.element.addClassName('current');
				}})
			
			/*@cc_on
			/*@if (@_jscript_version < 5.7)
				], {
				afterFinish: function(effect) {
					staleSection.hide();
					freshSection.show();
				}});
			@else @*/
				,
				new Effect.Opacity(staleSection, { from: 1.0, to: 0.0,
					afterFinish: function(effect) {
						new Effect.Appear($(fresh.hash.substr(1)), {
							beforeUpdate: function(effect) {
								if(effect.currentFrame <= 10) {
									staleSection.hide();
								}
							},
							afterFinish: function(effect) {
								if(staleSection.visible()) { 
									staleSection.hide();
								}
							}});
					}})
				]);
			/*@end
			@*/
			this.last = fresh;
		}
	},
	
	getExpandedWidth: function(tab) {
		return this.containerWidth - this.tabs.reject(function(a) { return a == tab; }).inject(0, function(acc, t) { return acc + this.tabWidths.get(t); }.bind(this)) - (parseInt(tab.getStyle('padding-left')) + parseInt(tab.getStyle('padding-right')) + parseInt(tab.getStyle('borderRightWidth')));
	},
	
	getNaturalWidth: function(tab) {
		return this.tabWidths.get(tab) - (parseInt(tab.getStyle('padding-left')) + parseInt(tab.getStyle('padding-right')) + parseInt(tab.getStyle('borderRightWidth')));
	},
	
	setSwapListener: function(listener) {
		this.swapListener = listener;
	},
	
	resetWidths: function() {
		this.containerWidth = this.container.getWidth();
		this.tabWidths = new Hash();
		this.tabs.each(function(tab) {
			this.tabWidths.set(tab, tab.getWidth());
			tab.setStyle({ width: this.getNaturalWidth(tab) + 'px' });
		}.bind(this));
	}
});

function goNextSection(e) {
	Event.stop(e);
	var hist = YAHOO.util.History;
	
	var calcTabsState = hist.getCurrentState('calc_tabs');
	var currentTabsState = hist.getCurrentState('current_tabs');
	var pledgeTabsState = hist.getCurrentState('pledge_tabs');
	
	if(calcTabsState == "calc_instructions") {
		hist.multiNavigate({'calc_tabs': 'calc_currentEmissions', 'current_tabs': 'calc_tabnav_theBasics'});
	} else
	if(calcTabsState == "calc_currentEmissions") {
		if(currentTabsState == 'calc_tabnav_theBasics') {
			hist.navigate('current_tabs', 'calc_tabnav_transportation');
		} else
		if(currentTabsState == 'calc_tabnav_transportation') {
			hist.navigate('current_tabs', 'calc_tabnav_homeEnergy');
		} else
		if(currentTabsState == 'calc_tabnav_homeEnergy') {
			hist.navigate('current_tabs', 'calc_tabnav_waste');
		} else
		if(currentTabsState == 'calc_tabnav_waste') {
			hist.multiNavigate({'calc_tabs': 'calc_WYCD', 'pledge_tabs': 'calc_tabnav_reduceOnTheRoad'});
		}
	} else
	if(calcTabsState == "calc_WYCD") {
		if(pledgeTabsState == 'calc_tabnav_reduceOnTheRoad') {
			hist.navigate('pledge_tabs', 'calc_tabnav_reduceAtHome');
		} else
		if(pledgeTabsState == 'calc_tabnav_reduceAtHome') {
			hist.navigate('pledge_tabs', 'calc_tabnav_reduceWaste');
		}
	}
	$('calc').scrollTo();
}

function finish(e) {
	Event.stop(e);
	submitting = true;
	$('calculator').submit();
}

document.observe('dom:loaded', function(e)
{
	$('noscript_warning').hide();
	$$('.calc_rounded').invoke('insert', { after: '<div class="calc_cap bottom"><span></span></div>' });

	$$('.error').each(function(err) {
		if(err.innerHTML == "") {
			err.hide();
		}
	});
	
	$('next_section_link').observe('click', goNextSection);
	
	$('prev_section_link').observe('click', function(e) {
		Event.stop(e);
		var hist = YAHOO.util.History;
		
		var calcTabsState = hist.getCurrentState('calc_tabs');
		var currentTabsState = hist.getCurrentState('current_tabs');
		var pledgeTabsState = hist.getCurrentState('pledge_tabs');
			
		if(calcTabsState == "calc_currentEmissions") {
			if(currentTabsState == 'calc_tabnav_theBasics') {
				hist.navigate('calc_tabs', 'calc_instructions');
			} else
			if(currentTabsState == 'calc_tabnav_transportation') {
				hist.navigate('current_tabs', 'calc_tabnav_theBasics');
			} else
			if(currentTabsState == 'calc_tabnav_homeEnergy') {
				hist.navigate('current_tabs', 'calc_tabnav_transportation');
			} else
			if(currentTabsState == 'calc_tabnav_waste') {
				hist.navigate('current_tabs', 'calc_tabnav_homeEnergy');
			}
		} else
		if(calcTabsState == "calc_WYCD") {
			if(pledgeTabsState == "calc_tabnav_reduceOnTheRoad") {
				hist.multiNavigate({'calc_tabs': 'calc_currentEmissions', 'current_tabs': 'calc_tabnav_waste'});
			} else
			if(pledgeTabsState == 'calc_tabnav_reduceAtHome') {
				hist.navigate('pledge_tabs', 'calc_tabnav_reduceOnTheRoad');
			} else
			if(pledgeTabsState == 'calc_tabnav_reduceWaste') {
				hist.navigate('pledge_tabs', 'calc_tabnav_reduceAtHome');
			}
		}
        
		$('calc').scrollTo();
	});
			
	var form = $('calculator');
	
	form.getInputs('radio', 'numVehicles').invoke('observe', 'click', changeNumVehicles);
	changeNumVehicles();
	
	form.getInputs('radio', 'choiceColdWater').invoke('observe', 'click', showNumLoadsQuestion);
	showNumLoadsQuestion();
    
    form.getInputs('radio', 'yesNoGreenPower').invoke('observe', 'click', showGreenPowerQuestion);
    showGreenPowerQuestion();
    
    form.getInputs('radio', 'energyType').invoke('observe', 'click', changeEnergyType);
    changeEnergyType();
	
	$(form['occupants']).observe('blur', changeNumInHousehold);
	changeNumInHousehold();
	
	$(form['zip']).observe('blur', setEFactorFromZipCode);

	// run the default recalculate after any field specific stuff is done
	form.getInputs('text').invoke('observe', 'blur', recalculate);
	form.getInputs('text').invoke('observe', 'change', taint);
	form.getInputs('radio').invoke('observe', 'click', recalculate);
	form.getInputs('radio').invoke('observe', 'change', taint);
	
	// Add handlers for DYP buttons
	$$('#save4later a').reduce().observe('click', function(e)
	{
		Event.stop(e);
		$('submitaction').value = 'saveforlater';
		submitting = true;
		form.submit();
	});
	
	checkItemsRecycled();
	recalculate();
			
	// Update DYP fields
	$('est_emissions').update(stringToBigDigits($F($('calculator')['TotalEmissions']).toString() + " lbs."));
	centerBigDigits($('est_emissions'));
	$('pledged').update($F($('calculator')['lbsEmissionsReduced']) + " lbs.");
	$('savings').update('$' + $F($('calculator')['annualDollarSavings']));
	   
    var bookmarkedCurrentTabsState = YAHOO.util.History.getBookmarkedState("current_tabs");
    var initialCurrentTabsState = bookmarkedCurrentTabsState || "calc_tabnav_theBasics";

    var bookmarkedPledgeTabsState = YAHOO.util.History.getBookmarkedState("pledge_tabs");
    var initialPledgeTabsState = bookmarkedPledgeTabsState || "calc_tabnav_reduceOnTheRoad";
	
    var bookmarkedCalcTabsState = YAHOO.util.History.getBookmarkedState("calc_tabs");
    var initialCalcTabsState = bookmarkedCalcTabsState || "calc_currentEmissions";

    var calcTabs;
	var currentTabs, pledgeTabs;
	
	YAHOO.util.History.register("current_tabs", initialCurrentTabsState, function (state) {
		updateApplicationState();
		currentTabs.swapTo(state);
    });
		
	YAHOO.util.History.register("pledge_tabs", initialPledgeTabsState, function (state) {
        updateApplicationState();
		pledgeTabs.swapTo(state);
    });
	
    YAHOO.util.History.register("calc_tabs", initialCalcTabsState, function (state) {
        updateApplicationState();
		updateCalcTabs(state);
    });
	
	function updateCalcTabs(state) {
		if(state == "calc_instructions") {
			calcTabs.set("activeIndex", 0);
		} else
		if(state == "calc_currentEmissions") {
			calcTabs.set("activeIndex", 1);
		} else
		if(state == "calc_WYCD") {
			calcTabs.set("activeIndex", 2);
		}
	}
	
	function updateApplicationState() {
		var hist = YAHOO.util.History;
		
		var calcTabsState = hist.getCurrentState('calc_tabs');
		var currentTabsState = hist.getCurrentState('current_tabs');
		var pledgeTabsState = hist.getCurrentState('pledge_tabs');
				
		if((calcTabsState == "calc_currentEmissions" && currentTabsState == "calc_tabnav_theBasics") 
			|| (calcTabsState == "calc_instructions")) {
			$('databox').hide();
			$('total_message').hide();
		} else {
			$('databox').show();
			$('total_message').show();
		}
		
		if(calcTabsState == "calc_WYCD") {
			$('calc_costExplanation').show();
			$('calc_potentialNote').show();
		} else {
			$('calc_costExplanation').hide();
			$('calc_potentialNote').hide();
		}
		
		if(calcTabsState == "calc_instructions") {			
			$('prev_section_link').hide();
		} else {
			$('prev_section_link').show();
		}
		
		if(pledgeTabsState == "calc_tabnav_reduceWaste" && calcTabsState == "calc_WYCD") {
			$('calc_co2Equivalents').show();
			
			// Change next section button to finish button
			$('next_section_link').update("Finish").addClassName('finish_button');
			$('next_section_link').stopObserving('click', goNextSection).observe('click', finish);
		
			// Hide the save4Later button
			$('save4later').hide();

		} else {
			$('calc_co2Equivalents').hide();

			if($('next_section_link').innerHTML === "Finish") {
				$('next_section_link').update("Next Section &#187;").removeClassName('finish_button');
				$('next_section_link').stopObserving('click', finish).observe('click', goNextSection);
			}
			// Show save4Later button
			$('save4later').show();
		}
	}

    function handleCalcTabsActiveTabChange(e) {
        var newState, currentState;
        newState = e.newValue.get('href');
		newState = newState.substr(newState.search(/#/) + 1);
        try {
            currentState = YAHOO.util.History.getCurrentState("calc_tabs");
            if (newState != currentState) {
                YAHOO.util.History.navigate("calc_tabs", newState);
            }
        } catch (e) {
			var newIndex = tool.getTabIndex(activeTabChangeEvent.newValue);
            calcTabs.set("activeIndex", newIndex);
        }
    }

    function initCalcTabs() {
        calcTabs = new YAHOO.widget.TabView("calc_nav");
        calcTabs.addListener("activeTabChange", handleCalcTabsActiveTabChange);
    }
	
	function handleCurrentTabsSwap(name) {
        var newState, currentState;
        newState = name;
        try {
            currentState = YAHOO.util.History.getCurrentState("current_tabs");
            if (newState != currentState) {
                YAHOO.util.History.navigate("current_tabs", newState);
            }
        } catch (e) {
			currentTabs.setActiveTab(state);
        }
    }
	
	function initCurrentTabs() {
		currentTabs = new TabNav('calc_tabnav_current');
		currentTabs.setSwapListener(handleCurrentTabsSwap);
	}
	
	function handlePledgeTabsSwap(name) {
        var newState, currentState;
        newState = name;
        try {
            currentState = YAHOO.util.History.getCurrentState("pledge_tabs");
            if (newState != currentState) {
                YAHOO.util.History.navigate("pledge_tabs", newState);
            }
        } catch (e) {
			pledgeTabs.setActiveTab(state);
        }
    }
	
	function initPledgeTabs() {
		pledgeTabs = new TabNav('calc_tabnav_wycd');
		pledgeTabs.setSwapListener(handlePledgeTabsSwap);
	}
	
    YAHOO.util.History.onReady(function () {
        var currentState;
		
		initCurrentTabs();
		currentState = YAHOO.util.History.getCurrentState("current_tabs");
		currentTabs.setActiveTab(currentState);
		
		initPledgeTabs();
		currentState = YAHOO.util.History.getCurrentState("pledge_tabs");
		pledgeTabs.setActiveTab(currentState);

        initCalcTabs();
        currentState = YAHOO.util.History.getCurrentState("calc_tabs");
		updateCalcTabs(currentState);
		
		updateApplicationState();
    });

    try {
        YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe");
    } catch (e) {
		initCurrentTabs();
		initPledgeTabs();
        initCalcTabs();
    }
    
    
});

// trap attempts to navigate away from the page; pop-up a warning message
Event.observe(window,'load', function()
{
    Event.observe(window, 'beforeunload', function() 
	{
		if ( dirty && !submitting ) 
		{
			if ( confirm( "Would you like to save your changes before you leave this page?\n" +
						 "Select OK to save your changes and continue.\n" +
						 "Select Cancel to discard your changes and continue.") ) 
			{
				new Ajax.Request( 'savecalculator.php', 
				{ 
					asynchronous: false,
					method:'post', 
					parameters:$('calculator').serialize(true)
				} 
				);
			}
		}
	}
	);
}
);
