/**
 * calc.js
 * JavaScript to power the calculator
 * @author Copyright 2007, Live Oak Interactive
 */
var login_url = "/account/login";
var registration_url = "/account/api/register";
var get_footprints_url = "/account/api/get_footprints";
var save_footprint_url = "/account/api/save_footprint";
var newsletter_url = "/account/newsletter";
var offset_emissions_url = "";
var total_tonnage_limit = 999.99;

function calcTrack(clickaction, clicklabel, clickvalue) {
    // implements ga page tracking set in subfooter
    // switch to try/catch after testing
   // bgCalcTracker._trackEvent(clickaction, clicklabel, clickvalue);
    pageTracker._trackPageview("/calculator/"+clicklabel); 
}
function numberFormat(nStr,decimals,fix){
    var prefix = fix || '';
    nStr += '';
    x = nStr.split('.');
    x1 = x[0];
    var decimal_places = 0;
    
    if(x.length > 1) {
        decimal_places = decimals || x[1].toString().length;
    }
    
    x2 = x.length > 1 ? '.' + x[1].substr(0,decimal_places) : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1))
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    return prefix + x1 + x2;
}

function simpleNumber(number_string) {
    return number_string.replace(/[^0-9.]/g, "");
}

function randomString() {
    var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
    var string_length = 8;
    var randomstring = '';
    for (var i=0; i<string_length; i++) {
        var rnum = Math.floor(Math.random() * chars.length);
        randomstring += chars.substring(rnum,rnum+1);
    }
    return randomstring;
}

function getAverages() {
    taglist = 'auto,elec,gas,air';
    tagloop = taglist.split(',');
    new Ajax.Request('/calc/api/calc.meta.averageTonnages', {
        parameters: { api_key: $F('api_key') },
        onSuccess: function(transport) {
            tagloop.each(function(x) {
                y = transport.responseXML.getElementsByTagName(x);
                if (y.length > 0) {
                    $('display_av_'+x).title = y[0].firstChild.data;
                    $('display_av_arrow_'+x).alt = "National Average: " + y[0].firstChild.data + " Metric Tons";
                    $('display_av_arrow_'+x).title = "National Average: " + y[0].firstChild.data + " Metric Tons";
                }
            });
        }

    });
}

function setEvents() {
    // Emptying session_id FOR SURE...as reloads will sometimes leave the id there.
    $("sessionid").value = "";
    offset_emissions_url = $("offsetbutton").href;
    
    Event.observe($('electricdefault'), 'click', function(event) {
        // $('kwh_val').value = numberFormat($('display_av_elec').title);
        get_unit_averages("elec", 'kwh_val');
        $('kwh_timespan_year').checked = true;
        Event.stop(event);
    });
    
    Event.observe($('naturalgasdefault'), 'click', function(event) {
        // $('therms_val').value = numberFormat($('display_av_gas').title);
        get_unit_averages("gas", 'therms_val');
        $('therms_timespan_year').checked = true;
        Event.stop(event);
    });
    
    Event.observe($('vehicledefault'), 'click', function(event) {
        // $('miles_val').value = numberFormat($('display_av_auto').title);
        get_unit_averages("auto", 'miles_val');
        Event.stop(event);
    });
    
    Event.observe($('vehicles'), 'click', function(event) {
        hideSections();
        hideTips();
        $('calcvehicle').show();
        $('vehiclestip').show();
        $('vehicles').addClassName('v_on');
        $('auto_graph_icon').addClassName('vi_on');
        Event.stop(event);
    });
    
    Event.observe($('electricity'), 'click', function(event) {
        hideSections();
        hideTips();
        $('calcelectric').show();
        $('electricitytip').show();
        $('electricity').addClassName('e_on');
        $('el_graph_icon').addClassName('ei_on');
        Event.stop(event);
    });
    
    Event.observe($('airtravel'), 'click', function(event) {
        show_flights_panel();
        Event.stop(event);
    });
    
    Event.observe($('naturalgas'), 'click', function(event) {
        hideSections();
        hideTips();
        $('calcnaturalgas').show();
        $('naturalgastip').show();
        $('naturalgas').addClassName('g_on');
        $('gas_graph_icon').addClassName('gi_on');
        Event.stop(event);
    });
    
    Event.observe($('calc_flight'), 'click', function(event) {
        // delete_all_bulk_flights();
        $("lastair").value = "flight";
        show_flights_panel();
        Event.stop(event);
    });
    
    Event.observe($('calc_bulkflight'), 'click', function(event) {
        // delete_all_flights();
        $("lastair").value = "bulkflight";
        show_flights_panel();
        Event.stop(event);
    });
    
    Event.observe($("showaccessmyemissionsformbutton"), "click", function(event) {
        $("showaccessmyemissionsformbutton").hide();
        $("accessmyemissionsform").show();
        
        var user_details = get_saved_user_details();

        if((user_details["username"] == "") || (user_details["password"] == "")) {
            $("accessmyemissionsform").show();
        }
        else {
            get_footprints();
            //calcTrack('Calculator', 'Load Previous', '')
        }
        
        Event.stop(event);
    });
    
    Event.observe($("saveshowformbutton"), "click", function(event) {
        if($F("footprintname") == "") {
            $("footprintname").value = build_footprint_name();
        }
        
        $("saveshowformbutton").hide();
        $("savemyemissionsform").show();
        
        var user_details = get_saved_user_details();

        if((user_details["username"] == "") || (user_details["password"] == "")) {
            $("show_login_save_form").show();
        }
        
        Event.stop(event);
    });
    
    Event.observe($("accessmyemissionsdatabutton"), "click", function(event) {
        get_footprints();
        Event.stop(event); 
    });
    
    Event.observe($("startnewcalculationbutton"), "click", function(event) {
        clear_calculator();
        showVehicles();
        //calcTrack('Calculator', 'Start New Calculation', '')
        Event.stop(event); 
    });
    
    Event.observe($("savemyemissionsdatabutton"), "click", function(event) {
        $("savemyemissionsform").hide();
        $("saveshowformbutton").show();
        save_session();
        Event.stop(event); 
    });
    
    Event.observe($("registration_link"), "click", function(event) {
        if($F("registerfootprintname") == "") {
            $("registerfootprintname").value = build_footprint_name();
        }
        
        $("savemyemissionsform").hide();
        $("registersavemyemissionsform").show();
        Event.stop(event); 
    });
    
    Event.observe($("registersavemyemissionsdatabutton"), "click", function(event) {
        $("registersavemyemissionsform").hide();
        $("saveshowformbutton").show();
        save_session(true);
        Event.stop(event); 
    });
    
    Event.observe($("offsetbutton"), "click", function(event) {
        var metric_tons = get_metric_tonnage();
        if(metric_tons <= 0) {
            Event.stop(event);
            alert("Before we can offset those emissions, you need to first calculate your carbon footprint.");
        }
        //calcTrack('Calculator', 'Offseting Footprint', metric_tons);      
    });

    Event.observe(window, "beforeunload", function(event) {
        // cannot redefine msgs, ref: http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/events/onbeforeunload.asp
        //var result = confirm();
        //if(! result) {
        //    Event.stop(event);
        //}
        if($F("last_saved") == "") {
            event.returnValue = "You may lose your calculator data if you have not saved.";
        }
    });
}


function show_flights_panel() {
    hideSections();
    hideTips();
    $('airtraveltip').show();
    
    var last_air_state = $F("lastair");
    
    if(last_air_state == "") {
        $("lastair").value = "flight";
        $('calcflight').show();
    }
    else if(last_air_state == "flight") {
        $('calcflight').show();
    }
    else {
        $('calcbulkflight').show();
    }
    
    $('airtravel').addClassName('t_on');
    $('air_graph_icon').addClassName('ti_on');
}


function DeleteRow(x) {
    targetrow = $(x.substring(4));
    targetrow.parentNode.removeChild(targetrow);
    runningOffsetTotal();   
    return false;
};

function reCalDelete() {
    tontotal = 0;
    tabletotal = $('itemlist_el_body').getElementsBySelector('span.emissions_el_tons');
    for (i=0; i<tabletotal.length; i++) {
        testx = tabletotal[i].innerHTML
        tontotal = tontotal + parseFloat(testx);    
    }
    $('electrictotal').innerHTML = numberFormat(tontotal, 2);
    percentage = parseInt($('display_av_elec').title);
    tontotal = 0;
    tabletotal = $('itemlist_ngas_body').getElementsBySelector('span.emissions_ngas_tons');
    for (i=0; i<tabletotal.length; i++) {
        testx = tabletotal[i].innerHTML
        tontotal = tontotal + parseFloat(testx);    
    }
    $('naturalgastotal').innerHTML = numberFormat(tontotal, 2);
    tontotal = 0;
    tabletotal = $('itemlist_vehicle_body').getElementsBySelector('span.emissions_vehicle_tons');
    for (i=0; i<tabletotal.length; i++) {
        testx = tabletotal[i].innerHTML
        tontotal = tontotal + parseFloat(testx);    
    }
    $('vehicletotal').innerHTML = numberFormat(tontotal, 2);
    tontotal = 0;
    tabletotal = $('itemlist_flight_body').getElementsBySelector('span.emissions_flight_tons');
    for (i=0; i<tabletotal.length; i++) {
        testx = tabletotal[i].innerHTML
        tontotal = tontotal + parseFloat(testx);    
    }
    $('flighttotal').innerHTML = numberFormat(tontotal, 2);
    tontotal = 0;
    tabletotal = $('itemlist_bulkflight_body').getElementsBySelector('span.emissions_bulkflight_tons');
    for (i=0; i<tabletotal.length; i++) {
        testx = tabletotal[i].innerHTML
        tontotal = tontotal + parseFloat(testx);    
    }
    $('bulkflighttotal').innerHTML = numberFormat(tontotal, 2);
}

function runningOffsetTotal() {
    var runningtotal = 0;
    reCalDelete();
    totallist = $A($$('span.co2emissions'));
    totallist.each(function(s) {
        x = s.firstChild.nodeValue;
        runningtotal = runningtotal + parseFloat(simpleNumber(x));
    });
    $('offsettotal').innerHTML = numberFormat(runningtotal, 2);
    
    var metric_tons = get_metric_tonnage();
    $("offsetbutton").href = offset_emissions_url + "&quantity=" + metric_tons.toString();
    
    if(runningtotal > total_tonnage_limit) {
        $("total_within_limit").hide();
        $("total_outside_limit").show();
    }
    else {
        $("total_within_limit").show();
        $("total_outside_limit").hide();
    }
    
    update_graphs();
}


function update_graphs() {
    update_electricity_graph();
    update_vehicle_graph();
    update_natural_gas_graph();
    update_flights_graph();
}


function update_electricity_graph() {
    var user_electricity = calculate_electricity_usage();
    var national_electricity = parseFloat($('display_av_elec').title);
    var total_bar_height = $("display_av_elec").getHeight();
    
    var bar_heights = calculate_bar_heights(user_electricity, national_electricity, total_bar_height);
    $("el_percent").style.height = bar_heights["user_empty_height"] + "px";
    $("el_arrow").style.top = bar_heights["national_height"] + "px";
}


function update_vehicle_graph() {
    var user_vehicle = calculate_vehicle_mileage();
    var national_vehicle = parseFloat($('display_av_auto').title);
    var total_bar_height = $("display_av_auto").getHeight();
    
    var bar_heights = calculate_bar_heights(user_vehicle, national_vehicle, total_bar_height);
    $("auto_percent").style.height = bar_heights["user_empty_height"] + "px";
    $("auto_arrow").style.top = bar_heights["national_height"] + "px";
}


function update_natural_gas_graph() {
    var user_natural_gas = calculate_natural_gas_usage();
    var national_natural_gas = parseFloat($('display_av_gas').title);
    var total_bar_height = $("display_av_gas").getHeight();
    
    var bar_heights = calculate_bar_heights(user_natural_gas, national_natural_gas, total_bar_height);
    $("gas_percent").style.height = bar_heights["user_empty_height"] + "px";
    $("gas_arrow").style.top = bar_heights["national_height"] + "px";
}


function update_flights_graph() {
    var user_flight = calculate_flight_mileage() + calculate_bulk_flight_mileage();
    var national_flights = parseFloat($('display_av_air').title);
    var total_bar_height = $("display_av_air").getHeight();
    
    var bar_heights = calculate_bar_heights(user_flight, national_flights, total_bar_height);
    $("air_percent").style.height = bar_heights["user_empty_height"] + "px";
    $("air_arrow").style.top = bar_heights["national_height"] + "px";
}


function calculate_vehicle_mileage() {
    /*
    var vehicle_rows = $("itemlist_vehicle_body").getElementsBySelector("tr.vehicle_data");
    var total_miles = 0;
    
    vehicle_rows.each(function(vehicle_elem_row) {
        total_miles += parseInt(vehicle_elem_row.down("td.v_miles").innerHTML);
    });
    */
    total_miles = parseFloat(simpleNumber($("vehicletotal").innerHTML));
    return total_miles;
}


function calculate_electricity_usage() {
    /*
    var electricity_rows = $("itemlist_el_body").getElementsBySelector("tr.electricity_data");
    var total_usage = 0;
    
    electricity_rows.each(function(el_elem_row) {
        var usage = el_elem_row.down("td.usage_el").down("span.usage_el_kwh").innerHTML;
        var tspan = el_elem_row.down("td.usage_el").down("span.usage_el_timespan").innerHTML;
        if (tspan == "Month") {
            usage *= 12;
        }
        total_usage += usage;
    });
    */
    total_usage = parseFloat(simpleNumber($("electrictotal").innerHTML));
    return total_usage;
}


function calculate_natural_gas_usage() {
    /*
    var natural_gas_rows = $("itemlist_ngas_body").getElementsBySelector("tr.natural_gas_data");
    var total_usage = 0;
    
    natural_gas_rows.each(function(ngas_elem_row) {
        var usage = parseInt(ngas_elem_row.down("td.usage_ngas").down("span.usage_ngas_therms").innerHTML);
        var tspan = parseInt(ngas_elem_row.down("td.usage_ngas").down("span.usage_ngas_timespan").innerHTML);
        if (tspan == "Month") {
            usage *= 12;
        }
        total_usage += usage;
    });
    */
    total_usage = parseFloat(simpleNumber($("naturalgastotal").innerHTML));
    return total_usage;
}


function calculate_flight_mileage() {
    /*
    var flight_rows = $("itemlist_flight_body").getElementsBySelector("tr.flight_data");
    var total_miles = 0;
    
    flight_rows.each(function(flight_elem_row) {
        total_miles += parseInt(flight_elem_row.down("td.f_distance").innerHTML);
    });
    */
    total_miles = parseFloat(simpleNumber($("flighttotal").innerHTML));
    return total_miles;
}


function calculate_bulk_flight_mileage() {
    /*
    var bulk_air_rows = $("itemlist_bulkflight_body").getElementsBySelector("tr.bulkflight_data");
    var total_miles = 0;
    
    bulk_air_rows.each(function(bulk_air_elem_row) {
        // NOTE - We're assuming an average flight is 1,660 miles so each bulk flight
        // is that distance.
        total_miles += parseInt(bulk_air_elem_row.down("td.bf_qty").innerHTML) * 1660;
    });
    */
    total_miles = parseFloat(simpleNumber($("bulkflighttotal").innerHTML));
    return total_miles;
}


function calculate_bar_heights(user_usage, national_usage, div_height) {
    var total_div_height = div_height || 100;
    
    // Start with zero and middle of the bar respectively.
    user_empty_height_percent = 100;
    national_height_percent = 50;
    
    if(user_usage <= national_usage * 2) {
        // Since we're less than twice the national average, the national average
        // indicator stays where it's at (50%) and the user bar is calculated 
        // then converted to the empty percentage of the div (from the top).
        user_empty_height_percent = 100 - (parseInt(user_usage / (national_usage * 2) * 100));
        national_height_percent = 50;
    }
    else {
        user_empty_height_percent = 0;
        national_height_percent = 100 - (parseInt((national_usage / user_usage) * 100));
    }
    
    var bar_heights = {}
    // Now (for IE's sake), convert the percentages to pixel heights.
    bar_heights["user_empty_height"] = parseInt(user_empty_height_percent * total_div_height / 100);
    bar_heights["national_height"] = parseInt(national_height_percent * total_div_height / 100) - 4; // image height = 8, offset half of it = 4
    
    // don't let the national average arrow be below the bar
    if (bar_heights['national_height'] > (total_div_height - 8)) {
        bar_heights['national_height'] = total_div_height - 8;
    }
        
    // if the empty height is too large (particularly, if it's the full height), it needs
    // to have two pixels shaved off of it -- one pixel for the top border and another for
    // the bottom border; however, in order to maximize bar graph accuracy, as well
    // as to avoid negative height values (heehee), perform this subtraction if and only if
    // the bar exceeds 50% of the total area
    if (bar_heights['user_empty_height'] >= (total_div_height / 2)) {
        bar_heights['user_empty_height'] -= 2; // one pixel for the top border, one for the bottom border
    }
    
    return bar_heights;
}


function showSection() {
    alert(this.href);   
}

function hideSections() {
    $$('div.calcsection').invoke('hide');
    $('vehicles').removeClassName('v_on');
    $('electricity').removeClassName('e_on');
    $('airtravel').removeClassName('t_on');
    $('naturalgas').removeClassName('g_on');
    $('auto_graph_icon').removeClassName('vi_on');
    $('el_graph_icon').removeClassName('ei_on');
    $('air_graph_icon').removeClassName('ti_on');
    $('gas_graph_icon').removeClassName('gi_on');
}

function hideTips() {
    $$('div#calctip .calculatortip').invoke('hide');
}

function addElectric() {
    calculator_changed();
    $('kwh_val').removeClassName('formerror');
    $('kwh_state').removeClassName('formerror');
    
    $('electricform').request({
        parameters: { api_key: $F('api_key'), kWh: simpleNumber($F('kwh_val'))  },
        on400: function() {
            if ($F('kwh_val') == '') {
                $('kwh_val').addClassName('formerror'); 
            } 
            if ($F('kwh_state') == '') {
                $('kwh_state').addClassName('formerror');   
            }   
            errormsg = 'There are missing or incorrect values for your electrical usage';
            reportError(errormsg); 
        },
        onSuccess: function(transport) {
            $('calclist_el').show();
            y = transport.responseXML.getElementsByTagName('metricTons');
            tons = y[0].firstChild.data;
            targetrow = $('itemlist_el_clone').cloneNode(true);
            rowid = 'electric_' + randomString();
            targetrow.id = rowid;
            label = targetrow.getElementsBySelector('td.label_el');
            state = targetrow.getElementsBySelector('td.state_el');
            usage = targetrow.getElementsBySelector('span.usage_el_kwh');
            timespan = targetrow.getElementsBySelector('span.usage_el_timespan');
            emission = targetrow.getElementsBySelector('span.emissions_el_tons');
            deletelink = targetrow.getElementsBySelector('a.deleterow');
            deletelink[0].id = 'del_'+ rowid;
            // update values
            label[0].innerHTML = $F('kwh_location');
            state[0].innerHTML = $F('kwh_state');
            usage[0].innerHTML =  simpleNumber($F('kwh_val'));
            timespan[0].innerHTML = ($F('kwh_timespan_year') == null) ? 'Month' : 'Year';
            emission[0].innerHTML = tons;               
            $('itemlist_el_body').appendChild(targetrow);
            spacingrow = $('itemlist_electricity_spacing').cloneNode(true);
            $('itemlist_el_body').appendChild(spacingrow);
            tontotal = 0;
            tabletotal = $('itemlist_el_body').getElementsBySelector('span.emissions_el_tons');
            for (i=0; i<tabletotal.length; i++) {
                testx = tabletotal[i].innerHTML
                tontotal = tontotal + parseFloat(testx);    
            }
            $('electrictotal').innerHTML = numberFormat(tontotal, 2);
            clear_electricity_form();
            runningOffsetTotal();
            calcTrack('Calculator', 'electricity', numberFormat(tons, 2))
        }
    });
    return false;   
}

function addGas() {
    calculator_changed();
    $('therms_val').removeClassName('formerror');
    
    $('naturlagasform').request({
        parameters: {
            api_key: $F('api_key'),
            therms: simpleNumber($F('therms_val'))
        },
        on400: function() {
            if ($F('therms_val') == '') {
                $('therms_val').addClassName('formerror');  
            }  
            errormsg = 'There are missing or incorrect values for your natural gas usage';
            reportError(errormsg); 
        },
        onSuccess: function(transport) {
            $('calclist_ngas').show();
            y = transport.responseXML.getElementsByTagName('metricTons');
            tons = y[0].firstChild.data;
            targetrow = $('itemlist_ngas_clone').cloneNode(true);
            rowid = 'ngas_' + randomString();
            targetrow.id = rowid;
            label = targetrow.getElementsBySelector('td.label_ngas');
            usage = targetrow.getElementsBySelector('span.usage_ngas_therms');
            timespan = targetrow.getElementsBySelector('span.usage_ngas_timespan');
            emission = targetrow.getElementsBySelector('span.emissions_ngas_tons');
            deletelink = targetrow.getElementsBySelector('a.deleterow');
            deletelink[0].id = 'del_'+ rowid;
            // update values
            label[0].innerHTML = $F('therms_location');
            usage[0].innerHTML = simpleNumber($F('therms_val'));
            timespan[0].innerHTML = ($F('therms_timespan_year') == null) ? 'Month' : 'Year';
            emission[0].innerHTML = tons;   
            $('itemlist_ngas_body').appendChild(targetrow);
            spacingrow = $('itemlist_ngas_spacing').cloneNode(true);
            $('itemlist_ngas_body').appendChild(spacingrow);
            tontotal = 0;
            tabletotal = $('itemlist_ngas_body').getElementsBySelector('span.emissions_ngas_tons');
        
            for (i=0; i<tabletotal.length; i++) {
                testx = tabletotal[i].innerHTML
                tontotal = tontotal + parseFloat(testx);    
            }
            
            $('naturalgastotal').innerHTML = numberFormat(tontotal, 2);
            clear_natural_gas_form();
            runningOffsetTotal();
            calcTrack('Calculator', 'natural_gas', numberFormat(tons, 2))
        }
    })
    return false;   
}

function getVehicleMakes() {
	$('vehicleform').action = '/calc/api/calc.auto.getMakes';
	$('vehicle_make').innerHTML = '';
	$('vehicle_model').innerHTML = '<option value=""></option>';
	$('vehicle_id').value = '';	
	$('vehicleform').request({
		parameters: { api_key: $F('api_key') },
  		onSuccess: function(transport) {
		    newoption = document.createElement("option");
			newoption.value = '';
			newoption.innerHTML = '&nbsp;';
			$('vehicle_make').appendChild(newoption);
  			y = transport.responseXML.getElementsByTagName('make');	
			var optionlist = $A(y);
			optionlist.each(function(s) {
				 newoption = document.createElement("option");
				 newoption.value = s.firstChild.nodeValue;
				 newoption.innerHTML = s.firstChild.nodeValue;
				 $('vehicle_make').appendChild(newoption);
			});
  		}
	})
	return false;	
}

function getVehicleModels() {
	$('vehicleform').action = '/calc/api/calc.auto.getModels';
	$('vehicle_model').innerHTML = '';
	$('vehicle_id').value = '';	
	$('vehicleform').request({
		parameters: { api_key: $F('api_key') },
		on400: function(error) {
			makesrequest = $F('vehicle_make');
			makesyear = $F('vehicle_year');
			errormsg = 'There are no models for '+makesrequest+ ' in '+makesyear;
			reportError(errormsg); 
		},
  		onSuccess: function(transport) {
		    newoption = document.createElement("option");
			newoption.value = '';
			newoption.innerHTML = '&nbsp;';
			$('vehicle_model').appendChild(newoption);
  			y = transport.responseXML.getElementsByTagName('model');	
			var optionlist = $A(y);
			optionlist.each(function(s) {
				 newoption = document.createElement("option");
				 newoption.value = s.firstChild.nodeValue;
				 newoption.innerHTML = s.firstChild.nodeValue;
				 $('vehicle_model').appendChild(newoption);
			});
  		}
	})
	return false;	
}

function getVehicleId() {
    $('vehicleform').action = '/calc/api/calc.auto.getAutoid';
    $('vehicle_id').value = ''; 
    $('vehicleform').request({
        parameters: { api_key: $F('api_key') },
        onSuccess: function(transport) {
            y = transport.responseXML.getElementsByTagName('autoId');
            vehicle = y[0].firstChild.data;
            $('vehicle_id').value = vehicle;                        
        }
    })
    return false;   
}

function addVehicle() {
    calculator_changed();
    $('vehicleform').action = '/calc/api/calc.compute.auto';
    $('vehicle_year').removeClassName('formerror');
    $('vehicle_make').removeClassName('formerror');
    $('vehicle_model').removeClassName('formerror');    
    $('miles_val').removeClassName('formerror');
    
    $('vehicleform').request({
        parameters: { api_key: $F('api_key'), miles: simpleNumber($F('miles_val')) },
        on400: function() {
            if ($F('vehicle_year') == '') {
                $('vehicle_year').addClassName('formerror');    
            } 
            if ($F('vehicle_make') == '') {
                $('vehicle_make').addClassName('formerror');    
            }   
            if ($F('vehicle_model') == '') {
                $('vehicle_model').addClassName('formerror');   
            } 
            if ($F('miles_val') == '') {
                $('miles_val').addClassName('formerror');   
            } 
            errormsg = 'There are missing or incorrect values for your vehicle';
            reportError(errormsg); 
        },
        onSuccess: function(transport){ 
            $('calclist_vehicle').show();
            y = transport.responseXML.getElementsByTagName('metricTons');
            tons = y[0].firstChild.data;
            targetrow = $('itemlist_vehicle_clone').cloneNode(true);
            rowid = 'vehicle_' + randomString();
            targetrow.id = rowid;
            autoId = targetrow.getElementsBySelector('td.v_id');
            year = targetrow.getElementsBySelector('td.v_year');
            make = targetrow.getElementsBySelector('td.v_make');
            model = targetrow.getElementsBySelector('td.v_model');
            miles = targetrow.getElementsBySelector('td.v_miles');
            emission = targetrow.getElementsBySelector('span.emissions_vehicle_tons');
            deletelink = targetrow.getElementsBySelector('a.deleterow');
            deletelink[0].id = 'del_'+ rowid;
            // update values
            
            autoId[0].innerHTML = $F('vehicle_id');
            year[0].innerHTML = $F('vehicle_year');
            make[0].innerHTML = $F('vehicle_make');         
            model[0].innerHTML = $F('vehicle_model');
            miles[0].innerHTML =  simpleNumber($F('miles_val'));
            emission[0].innerHTML = tons;   

            $('itemlist_vehicle_body').appendChild(targetrow);
            spacingrow = $('itemlist_vehicle_spacingclone').cloneNode(true);
            $('itemlist_vehicle_body').appendChild(spacingrow);
                        
            tontotal = 0;
            tabletotal = $('itemlist_vehicle_body').getElementsBySelector('span.emissions_vehicle_tons');
        
            for (i=0; i<tabletotal.length; i++) {
                testx = tabletotal[i].innerHTML
                tontotal = tontotal + parseFloat(testx);    
            }
            $('vehicletotal').innerHTML = numberFormat(tontotal, 2);
            $('vehicle_year').selectedIndex = 0;            
            $('vehicle_make').innerHTML = '<option value=""></option>';
            $('vehicle_model').innerHTML = '<option value=""></option>';
            $('vehicle_id').clear();    
            $('miles_val').clear();
            runningOffsetTotal(); 
            calcTrack('Calculator', 'vehicle', numberFormat(tons, 2))  
        }
    })
    return false;   
}

function addBulkTravel() {
    calculator_changed();
    
    $('bulktravelform').request({
        parameters: { api_key: $F('api_key') },
        onSuccess: function(transport){ 
            $('calclist_bf').show();
            y = transport.responseXML.getElementsByTagName('metricTons');
            tons = y[0].firstChild.data;
            rowid = 'bulktravel_' + randomString();
            targetrow = $('itemlist_bulkflight_clone').cloneNode(true);
            targetrow.id = rowid;
            qty = targetrow.getElementsBySelector('td.bf_qty');
            emission = targetrow.getElementsBySelector('span.emissions_bulkflight_tons');
            deletelink = targetrow.getElementsBySelector('a.deleterow');
            deletelink[0].id = 'del_'+ rowid;
            qty[0].innerHTML = $F('bulkflight_val');    
            emission[0].innerHTML = tons;   
            
            $('itemlist_bulkflight_body').appendChild(targetrow);
            spacingrow = $('itemlist_bulkflight_spacing').cloneNode(true);
            $('itemlist_bulkflight_body').appendChild(spacingrow);
            
            update_bulk_flights_total();
            $('bulkflight_val').value = ''; 
            runningOffsetTotal(); 
            calcTrack('Calculator', 'bulk_travel', numberFormat(tons, 2))  
        }

    })
    return false;   
}

function getAirLocation(airtarget, targetid) {
    new Ajax.Request('/calc/api/calc.air.getLocationId', {
        method: 'post',
        parameters: { api_key: $F('api_key'), airCode: airtarget },
        onSuccess: function(transport) {
            y = transport.responseXML.getElementsByTagName('locationId');
            locationid = y[0].firstChild.data;
            $('location_'+targetid).value = locationid;
        }
    }); 
}

function getAirDropdown(airtarget, targetid) {
    if (airtarget.length >= 3) {
        new Ajax.Request('/calc/api/calc.air.autoComplete', {
          method: 'post',
          parameters: { api_key: $F('api_key'), airCode: airtarget },
          onSuccess: function(transport) {
            listtarget = $(targetid+"_list");
            listtarget.show();
            var str = ''; 
            y = transport.responseXML.getElementsByTagName('airport');
            if (y.length > 0) {
                x = $A(y);
                x.each(function(s) {
                    country = s.getAttribute('country');
                    city = s.getAttribute('city');
                    airCode = s.getAttribute('airCode');
                    locationId = s.getAttribute('locationId');
                    attrstring = locationId+'|'+airCode+'|'+targetid;
                    str = str+'<li><a href="#" class="airportlist" onclick="selectAir(\''+attrstring+'\'); return false;">'+city+" ("+country+" - "+airCode+")</a></li>";  
                });
                
                if(x.length > 10) {
                    str = "<li><strong>Type More To Narrow Results...</strong></li>" + str;
                }
            } else {
                str = "<li><strong>No Results Found.</strong></li>";
            }
            listtarget.innerHTML = str;
          }
        }); 
    }
}

function selectAir(attrstring) {
    optionx = attrstring.split('|');
    locationId = optionx[0];
    airCode = optionx[1];
    targetid = optionx[2];
    $(targetid).value = airCode;
    hiddenitem = targetid.split("_");
    h1 = hiddenitem[1];
    $('location_'+h1).value = locationId;
    $(targetid+'_list').style.display='none';
}

function addTravel() {
    var rt = $F("flight_roundTrip");
    
    if(rt != 1) {
        rt = 0;
    }
    
    calculator_changed();
    
    $('flightform').request({
        parameters: { 
            api_key: $F('api_key'),
            roundTrip: rt
        },
        onSuccess: function(transport){ 
            $('calclist_flight').show();
            y = transport.responseXML.getElementsByTagName('metricTons');
            tons = y[0].firstChild.data;
            distance_received = transport.responseXML.getElementsByTagName('distance');
            distance_received = distance_received[0].firstChild.data;
            
            rowid = 'travel_' + randomString();
            targetrow = $('itemlist_flight_clone').cloneNode(true);
            targetrow.id = rowid;
            from = targetrow.getElementsBySelector('td.f_from');
            to = targetrow.getElementsBySelector('td.f_to');
            from_location = targetrow.getElementsBySelector('td.f_from_location');
            to_location = targetrow.getElementsBySelector('td.f_to_location');
            distance = targetrow.getElementsBySelector('td.f_distance');
            qty = targetrow.getElementsBySelector('td.f_qty');
            roundtrip = targetrow.getElementsBySelector('td.f_roundtrip');
            emission = targetrow.getElementsBySelector('span.emissions_flight_tons');
            deletelink = targetrow.getElementsBySelector('a.deleterow');
            
            deletelink[0].id = 'del_'+ rowid;
            from[0].innerHTML = $F('flight_from');
            to[0].innerHTML = $F('flight_to');
            from_location[0].innerHTML = $F('location_from');
            to_location[0].innerHTML = $F('location_to');           
            distance[0].innerHTML = distance_received;
            qty[0].innerHTML = $F('flight_quantity');
            roundtrip[0].innerHTML = ($F('flight_roundTrip')) ? 'Yes' : 'No';
            emission[0].innerHTML = tons;   
            
            $('itemlist_flight_body').appendChild(targetrow);
            spacingrow = $('itemlist_flight_spacing').cloneNode(true);
            $('itemlist_flight_body').appendChild(spacingrow);
            
            update_flights_total();
            clear_flight_form();            
            runningOffsetTotal();
            calcTrack('Calculator', 'air travel', numberFormat(tons, 2))
        }
    });
    return false;   
}


function update_flights_total() {
    var ton_total = 0;
    var table_total = $('itemlist_flight_body').getElementsBySelector('tr.flight_data');

    table_total.each(function(row) {
        var tons = parseFloat(row.down('span.emissions_flight_tons').innerHTML);
        ton_total += tons;  
    });
    
    $('flighttotal').innerHTML = numberFormat(ton_total, 1);
}


function update_bulk_flights_total() {
    tontotal = 0;
    tabletotal = $('itemlist_bulkflight_body').getElementsBySelector('span.emissions_bulkflight_tons');

    for (i=0; i<tabletotal.length; i++) {
        testx = tabletotal[i].innerHTML
        tontotal = tontotal + parseFloat(testx);    
    }
    
    $('bulkflighttotal').innerHTML = numberFormat(tontotal, 2);
}


function delete_all_flights() {
    $("itemlist_flight_body").getElementsBySelector("tr.flight_data").each(function(the_element) {
        the_element.remove();
    });
    
    update_flights_total();
    runningOffsetTotal();
}


function delete_all_bulk_flights() {
    $("itemlist_bulkflight_body").getElementsBySelector("tr.bulkflight_data").each(function(the_element) {
        the_element.remove();
    });
    
    update_bulk_flights_total();
    runningOffsetTotal();
}


function clear_electricity_form() {
    $('kwh_state').selectedIndex = 0;           
    $('kwh_location').value = "Home";
    $('kwh_val').clear();
    $('kwh_timespan_month').checked = false;    
    $('kwh_timespan_year').checked = false;
}


function clear_natural_gas_form() {
    $('therms_location').value = "Home";    
    $('therms_val').clear();
    $('therms_timespan_month').checked = false; 
    $('therms_timespan_year').checked = false;
}


function clear_flight_form() {
    $('flight_quantity').value = 1; 
    $('flight_distance').value = '';
    $('flight_from').value = '';    
    $('flight_to').value = '';  
    $('location_from').value = '';
    $('location_to').value = '';
    $('flight_roundTrip').checked = true;
}


function reportError(msg) {
    alert(msg);
}

function submitProfile() {
    target = $$;
}

function testMe() {
    Event.observe($('vehicles'), 'click', function(event) {
        new Ajax.Updater('vehicles', '/calc/api/calc.meta.averages', {
            parameters: { api_key: $F('api_key') },
            insertion: Insertion.Bottom
        });
        Event.stop(event);
    });     
}

function initCalculator() {
    getAverages();
    setModals();
    setEvents();
}


function showVehicles() {
    hideSections();
    hideTips();
    $('calcvehicle').show();
    $('vehiclestip').show();
    $('vehicles').addClassName('v_on');
}


function start_session() {
    var api_key = $F("api_key");
    
    new Ajax.Request("/calc/api/calc.session.start", {
        parameters: {
            api_key: api_key
        },
        asynchronous: false,
        onSuccess: function(transport) {
            var result = transport.responseXML;
            var session_tags = result.getElementsByTagName("sessionId");
            $("sessionid").value = session_tags[0].firstChild.data;
            showVehicles();
        },
        onFailure: function() {
            alert("Sorry, we could not start a new calculation at this time.");
        }
    });
}

function stop_session() {
    $("sessionid").value = '';
}


function unpack_session_data(response_xml) {
    unpack_electricity_data(response_xml);
    unpack_natural_gas_data(response_xml);
    unpack_vehicle_data(response_xml);
    unpack_flights_data(response_xml);
    unpack_bulk_air_data(response_xml);
}


function unpack_electricity_data(response_xml) {
    var elec_root = response_xml.getElementsByTagName('elec');
    
    if(elec_root.length > 0) {
        var powers = elec_root[0].getElementsByTagName("power");
        
        if(powers.length > 0) {
            for(var i = 0; i < powers.length; i++) {
                var xml_data = {};
                
                xml_data["kWh"] = powers[i].getElementsByTagName("kWh")[0].firstChild.data;
                xml_data["state"] = powers[i].getElementsByTagName("state")[0].firstChild.data;
                xml_data["index"] = powers[i].getAttribute("index");
                xml_data["metric_tons"] = powers[i].getAttribute("metricTons");
                xml_data["timespan"] = powers[i].getElementsByTagName('timespan')[0].firstChild.data;
                xml_data["label"] = powers[i].getElementsByTagName('label')[0].firstChild.data;
                
                if(xml_data["timespan"].length <= 0) {
                    xml_data["timespan"] = "month";
                }
                
                targetrow = $('itemlist_el_clone').cloneNode(true);
                rowid = 'electric_' + randomString();
                targetrow.id = rowid;
                label = targetrow.getElementsBySelector('td.label_el');
                state = targetrow.getElementsBySelector('td.state_el');
                usage = targetrow.getElementsBySelector('span.usage_el_kwh');
                timespan = targetrow.getElementsBySelector('span.usage_el_timespan');
                emission = targetrow.getElementsBySelector('span.emissions_el_tons');
                deletelink = targetrow.getElementsBySelector('a.deleterow');
                deletelink[0].id = 'del_'+ rowid;
                
                // update values
                label[0].innerHTML = xml_data["label"];
                state[0].innerHTML = xml_data["state"];
                usage[0].innerHTML = xml_data["kWh"];
                timespan[0].innerHTML = (xml_data["timespan"] == "month") ? 'Month' : 'Year';
                emission[0].innerHTML = xml_data["metric_tons"];
                
                $('itemlist_el_body').appendChild(targetrow);
                spacingrow = $('itemlist_electricity_spacing').cloneNode(true);
                $('itemlist_el_body').appendChild(spacingrow);
            }
            
            tontotal = 0;
            tabletotal = $('itemlist_el_body').getElementsBySelector('span.emissions_el_tons');
            
            for (i=0; i<tabletotal.length; i++) {
                testx = tabletotal[i].innerHTML
                tontotal = tontotal + parseFloat(testx);    
            }
            
            $('electrictotal').innerHTML = numberFormat(tontotal, 2);
            $("calclist_el").show();
            runningOffsetTotal();
        }
    }
}


function unpack_natural_gas_data(response_xml) {
    var gas_root = response_xml.getElementsByTagName('gas');
    
    if(gas_root.length > 0) {
        var usages = gas_root[0].getElementsByTagName('usage');
        
        if(usages.length > 0) {
            for(var i = 0; i < usages.length; i++) {
                var xml_data = {};
                
                xml_data["therms"] = usages[i].getElementsByTagName('therms')[0].firstChild.data;
                xml_data["index"] = usages[i].getAttribute("index");
                xml_data["metric_tons"] = usages[i].getAttribute("metricTons");
                xml_data["timespan"] = usages[i].getElementsByTagName('timespan')[0].firstChild.data;
                xml_data["label"] = usages[i].getElementsByTagName('label')[0].firstChild.data;
                
                if(xml_data["timespan"].length <= 0) {
                    xml_data["timespan"] = "month";
                }
                
                targetrow = $('itemlist_ngas_clone').cloneNode(true);
                rowid = 'ngas_' + randomString();
                targetrow.id = rowid;
                label = targetrow.getElementsBySelector('td.label_ngas');
                usage = targetrow.getElementsBySelector('span.usage_ngas_therms');
                timespan = targetrow.getElementsBySelector('span.usage_ngas_timespan');
                emission = targetrow.getElementsBySelector('span.emissions_ngas_tons');
                deletelink = targetrow.getElementsBySelector('a.deleterow');
                deletelink[0].id = 'del_'+ rowid;
                
                // update values
                label[0].innerHTML = xml_data["label"];
                usage[0].innerHTML = xml_data["therms"];
                timespan[0].innerHTML = (xml_data["timespan"] == "month") ? 'Month' : 'Year';
                emission[0].innerHTML = xml_data["metric_tons"];    
                
                $('itemlist_ngas_body').appendChild(targetrow);
                spacingrow = $('itemlist_ngas_spacing').cloneNode(true);
                $('itemlist_ngas_body').appendChild(spacingrow);
            }
            
            tontotal = 0;
            tabletotal = $('itemlist_ngas_body').getElementsBySelector('span.emissions_ngas_tons');

            for (i=0; i<tabletotal.length; i++) {
                testx = tabletotal[i].innerHTML
                tontotal = tontotal + parseFloat(testx);    
            }

            $('naturalgastotal').innerHTML = numberFormat(tontotal, 2);
            $("calclist_ngas").show();
            runningOffsetTotal();
        }
    }
}


function unpack_vehicle_data(response_xml) {
    var auto_root = response_xml.getElementsByTagName('auto');
    
    if(auto_root.length > 0) {
        var mileages = auto_root[0].getElementsByTagName('mileage');
        
        if(mileages.length > 0) {
            for(var i = 0; i < mileages.length; i++) {
                var vehicles = mileages[i].getElementsByTagName("vehicle");
                
                if(vehicles.length > 0) {
                    var xml_data = {};
                    
                    xml_data["year"] = vehicles[0].getElementsByTagName('year')[0].firstChild.data;
                    xml_data["make"] = vehicles[0].getElementsByTagName('make')[0].firstChild.data;
                    xml_data["model"] = vehicles[0].getElementsByTagName('model')[0].firstChild.data;
                    xml_data["autoId"] = vehicles[0].getElementsByTagName('autoId')[0].firstChild.data;
                    xml_data["miles"] = mileages[i].getElementsByTagName("miles")[0].firstChild.data;
                    xml_data["index"] = mileages[i].getAttribute("index");
                    xml_data["metric_tons"] = mileages[i].getAttribute("metricTons");
                    
                    targetrow = $('itemlist_vehicle_clone').cloneNode(true);
                    rowid = 'vehicle_' + randomString();
                    targetrow.id = rowid;
                    autoId = targetrow.getElementsBySelector('td.v_id');
                    year = targetrow.getElementsBySelector('td.v_year');
                    make = targetrow.getElementsBySelector('td.v_make');
                    model = targetrow.getElementsBySelector('td.v_model');
                    miles = targetrow.getElementsBySelector('td.v_miles');
                    emission = targetrow.getElementsBySelector('span.emissions_vehicle_tons');
                    deletelink = targetrow.getElementsBySelector('a.deleterow');
                    
                    deletelink[0].id = 'del_'+ rowid;
                    targetrow.title = xml_data["index"];
                    autoId[0].innerHTML = xml_data["autoId"];
                    year[0].innerHTML = xml_data["year"];
                    make[0].innerHTML = xml_data["make"];   
                    model[0].innerHTML = xml_data["model"];
                    miles[0].innerHTML = xml_data["miles"];
                    emission[0].innerHTML = xml_data["metric_tons"];
                    
                    $('itemlist_vehicle_body').appendChild(targetrow);
                    spacingrow = $('itemlist_vehicle_spacingclone').cloneNode(true);
                    $('itemlist_vehicle_body').appendChild(spacingrow);
                }
            }
            
            tontotal = 0;
            tabletotal = $('itemlist_vehicle_body').getElementsBySelector('span.emissions_vehicle_tons');

            for (i=0; i<tabletotal.length; i++) {
                testx = tabletotal[i].innerHTML
                tontotal = tontotal + parseFloat(testx);    
            }
            
            $('vehicletotal').innerHTML = numberFormat(tontotal, 2);
            $("calclist_vehicle").show();
            runningOffsetTotal();
        }
    }
}


function unpack_flights_data(response_xml) {
    var air_root = response_xml.getElementsByTagName('air');
    
    if(air_root.length > 0) {
        var flights = air_root[0].getElementsByTagName('flight');
        
        if(flights.length > 0) {
            for(var i = 0; i < flights.length; i++) {
                var xml_data = {};
                
                xml_data["from"] = flights[i].getElementsByTagName('from')[0];
                xml_data["from_location"] = xml_data["from"].getElementsByTagName('locationId')[0].firstChild.data;
                xml_data["from_air_code"] = xml_data["from"].getElementsByTagName('airCode')[0].firstChild.data;
                xml_data["from_city"] = xml_data["from"].getElementsByTagName('city')[0].firstChild.data;
                xml_data["from_country"] = xml_data["from"].getElementsByTagName('country')[0].firstChild.data;
                xml_data["to"] = flights[i].getElementsByTagName('to')[0];
                xml_data["to_location"] = xml_data["to"].getElementsByTagName('locationId')[0].firstChild.data;
                xml_data["to_air_code"] = xml_data["to"].getElementsByTagName('airCode')[0].firstChild.data;
                xml_data["to_city"] = xml_data["to"].getElementsByTagName('city')[0].firstChild.data;
                xml_data["to_country"] = xml_data["to"].getElementsByTagName('country')[0].firstChild.data;
                xml_data["index"] = flights[i].getAttribute("index");
                xml_data["metric_tons"] = flights[i].getAttribute("metricTons");
                xml_data["round_trip"] = flights[i].getElementsByTagName('roundTrip');
                xml_data["quantity"] = flights[i].getElementsByTagName('quantity');
                
                if(xml_data["round_trip"].length > 0) {
                    xml_data["round_trip"] = xml_data["round_trip"][0].firstChild.data;
                }
                else {
                    xml_data["round_trip"] = 1;
                }
                
                if(xml_data["quantity"].length > 0) {
                    xml_data["quantity"] = xml_data["quantity"][0].firstChild.data;
                }
                else {
                    xml_data["quantity"] = 1;
                }
                
                rowid = 'travel_' + randomString();
                targetrow = $('itemlist_flight_clone').cloneNode(true);
                targetrow.id = rowid;
                from = targetrow.getElementsBySelector('td.f_from');
                to = targetrow.getElementsBySelector('td.f_to');
                from_location = targetrow.getElementsBySelector('td.f_from_location');
                to_location = targetrow.getElementsBySelector('td.f_to_location');
                qty = targetrow.getElementsBySelector('td.f_qty');
                roundtrip = targetrow.getElementsBySelector('td.f_roundtrip');
                emission = targetrow.getElementsBySelector('span.emissions_flight_tons');
                deletelink = targetrow.getElementsBySelector('a.deleterow');
                
                deletelink[0].id = 'del_'+ rowid;
                targetrow.title = xml_data["index"];
                from[0].innerHTML = xml_data["from_air_code"];
                to[0].innerHTML = xml_data["to_air_code"];
                from_location[0].innerHTML = xml_data["from_location"];
                to_location[0].innerHTML = xml_data["to_location"];         
                qty[0].innerHTML = xml_data["quantity"];    
                roundtrip[0].innerHTML = (xml_data["round_trip"]) ? 'Yes' : 'No';
                emission[0].innerHTML = xml_data["metric_tons"];
                
                $('itemlist_flight_body').appendChild(targetrow);
                spacingrow = $('itemlist_flight_spacing').cloneNode(true);
                $('itemlist_flight_body').appendChild(spacingrow);
            }
            
            update_flights_total();
            $("calclist_flight").show();
            runningOffsetTotal();
        }
    }
}


function unpack_bulk_air_data(response_xml) {
    var bulk_air_root = response_xml.getElementsByTagName('bulkAir');
    
    if(bulk_air_root.length > 0) {
        var flights = bulk_air_root[0].getElementsByTagName("flights");
        
        if(flights.length > 0) {
            for(var i = 0; i < flights.length; i++) {
                var xml_data = {};
                
                xml_data["quantity"] = flights[i].getElementsByTagName("quantity")[0].firstChild.data;
                xml_data["index"] = flights[i].getAttribute("index");
                xml_data["metric_tons"] = flights[i].getAttribute("metricTons");
                
                rowid = 'bulktravel_' + randomString();
                targetrow = $('itemlist_bulkflight_clone').cloneNode(true);
                targetrow.id = rowid;
                qty = targetrow.getElementsBySelector('td.bf_qty');
                emission = targetrow.getElementsBySelector('span.emissions_bulkflight_tons');
                deletelink = targetrow.getElementsBySelector('a.deleterow');
                
                deletelink[0].id = 'del_'+ rowid;
                qty[0].innerHTML = xml_data["quantity"];    
                emission[0].innerHTML = xml_data["metric_tons"];
                
                $('itemlist_bulkflight_body').appendChild(targetrow);
                spacingrow = $('itemlist_bulkflight_spacing').cloneNode(true);
                $('itemlist_bulkflight_body').appendChild(spacingrow);
            }
            
            update_bulk_flights_total();
            $("calclist_bf").show();
            runningOffsetTotal();
        }
    }
}


function load_session() {
    var api_key = $F("api_key");
    var session_id = $F("sessionid");
    clear_calculator();
    
    new Ajax.Request("/calc/api/calc.session.load", {
        parameters: {
            api_key: api_key,
            sessionId: session_id
        },
        onSuccess: function(transport) {
            unpack_session_data(transport.responseXML);
            // alert("Your stored emissions data has been successfully loaded!");
            tracktotal = $('offsettotal').innerHTML;
            //calcTrack('Calculator', 'Retrieve Session', tracktotal);
        },
        onFailure: function() {
            alert("Sorry, we could not load your data at this time.");
        }
    });
}


function serialize_data() {
    var electricity_params = serialize_electricity();
    var natural_gas_params = serialize_natural_gas();
    var vehicles_params = serialize_vehicles();
    var flights_params = serialize_flights();
    var bulk_flights_params = serialize_bulk_flights();
    
    var the_params = new Hash();
    the_params.merge(electricity_params);
    the_params.merge(natural_gas_params);
    the_params.merge(vehicles_params);
    the_params.merge(flights_params);
    the_params.merge(bulk_flights_params);
    return the_params;
}


function serialize_electricity() {
    var the_params = new Hash();
    
    // Pull all electricity data.
    var electricity_rows = $("itemlist_el_body").getElementsBySelector("tr.electricity_data");
    var used_indices = [];
    
    electricity_rows.each(function(el_elem_row) {
        if(el_elem_row.title != "") {
            used_indices.push(el_elem_row.title);
        }
    });
    
    var count = 0;
    
    electricity_rows.each(function(el_elem_row) {
        var current_index = count;
        
        if(el_elem_row.title == "") {
            while(used_indices.indexOf(count) != -1) {
                count++;
            }
            
            current_index = count;
        }
        else {
            current_index = el_elem_row.title;
        }
        
        used_indices.push(current_index);
        the_params["elec_" + current_index + "_kWh"] = el_elem_row.down("td.usage_el").down("span.usage_el_kwh").innerHTML;
        the_params["elec_" + current_index + "_state"] = el_elem_row.down("td.state_el").innerHTML;
        the_params["elec_" + current_index + "_label"] = el_elem_row.down("td.label_el").innerHTML;
        the_params["elec_" + current_index + "_timespan"] = el_elem_row.down("td.usage_el").down("span.usage_el_timespan").innerHTML;
        count++;
    });
    
    return the_params;
}


function serialize_natural_gas() {
    var the_params = new Hash();
    
    // Pull all of the natural gas data.
    var natural_gas_rows = $("itemlist_ngas_body").getElementsBySelector("tr.natural_gas_data");
    var used_indices = [];
    
    natural_gas_rows.each(function(ngas_elem_row) {
        if(ngas_elem_row.title != "") {
            used_indices.push(ngas_elem_row.title);
        }
    });
    
    var count = 0;
    
    natural_gas_rows.each(function(ngas_elem_row) {
        var current_index = count;
        
        if(ngas_elem_row.title == "") {
            while(used_indices.indexOf(count) != -1) {
                count++;
            }
            
            current_index = count;
        }
        else {
            current_index = ngas_elem_row.title;
        }
        
        used_indices.push(current_index);
        the_params["gas_" + current_index + "_therms"] = ngas_elem_row.down("td.usage_ngas").down("span.usage_ngas_therms").innerHTML;
        the_params["gas_" + current_index + "_label"] = ngas_elem_row.down("td.label_ngas").innerHTML;
        the_params["gas_" + current_index + "_timespan"] = ngas_elem_row.down("td.usage_ngas").down("span.usage_ngas_timespan").innerHTML;
        count++;
    });
    
    return the_params;
}


function serialize_vehicles() {
    var the_params = new Hash();
    
    // Pull all of the vehicle data.
    var vehicle_rows = $("itemlist_vehicle_body").getElementsBySelector("tr.vehicle_data");
    var used_indices = [];
    
    vehicle_rows.each(function(vehicle_elem_row) {
        if(vehicle_elem_row.title != "") {
            used_indices.push(vehicle_elem_row.title);
        }
    });
    
    var count = 0;
    
    vehicle_rows.each(function(vehicle_elem_row) {
        var current_index = count;
        
        if(vehicle_elem_row.title == "") {
            while(used_indices.indexOf(count) != -1) {
                count++;
            }
            
            current_index = count;
        }
        else {
            current_index = vehicle_elem_row.title;
        }
        
        used_indices.push(current_index);
        the_params["auto_" + current_index + "_autoId"] = vehicle_elem_row.down("td.v_id").innerHTML;
        the_params["auto_" + current_index + "_miles"] = vehicle_elem_row.down("td.v_miles").innerHTML;
        count++;
    });
    
    return the_params;
}


function serialize_flights() {
    var the_params = new Hash();
    
    // Pull all of the air travel data.
    var flight_rows = $("itemlist_flight_body").getElementsBySelector("tr.flight_data");
    var used_indices = [];
    
    flight_rows.each(function(flight_elem_row) {
        if(flight_elem_row.title != "") {
            used_indices.push(flight_elem_row.title);
        }
    });
    
    var count = 0;
    
    flight_rows.each(function(flight_elem_row) {
        var current_index = count;
        
        if(flight_elem_row.title == "") {
            while(used_indices.indexOf(count) != -1) {
                count++;
            }
            
            current_index = count;
        }
        else {
            current_index = flight_elem_row.title;
        }
        
        used_indices.push(current_index);
        the_params["air_" + current_index + "_from"] = flight_elem_row.down("td.f_from_location").innerHTML;
        the_params["air_" + current_index + "_to"] = flight_elem_row.down("td.f_to_location").innerHTML;
        
        if(flight_elem_row.down("td.f_roundtrip").innerHTML == "Yes") {
            the_params["air_" + current_index + "_roundTrip"] = 1;
        }
        else {
            the_params["air_" + current_index + "_roundTrip"] = 0;
        }
        
        the_params["air_" + current_index + "_quantity"] = flight_elem_row.down("td.f_qty").innerHTML;
        count++;
    });
    
    return the_params;
}


function serialize_bulk_flights() {
    var the_params = new Hash();
    
    // Pull all of the bulk air travel data.
    var bulk_air_rows = $("itemlist_bulkflight_body").getElementsBySelector("tr.bulkflight_data");
    var used_indices = [];
    
    bulk_air_rows.each(function(bulk_air_elem_row) {
        if(bulk_air_elem_row.title != "") {
            used_indices.push(bulk_air_elem_row.title);
        }
    });
    
    var count = 0;
    
    bulk_air_rows.each(function(bulk_air_elem_row) {
        var current_index = count;
        
        if(bulk_air_elem_row.title == "") {
            while(used_indices.indexOf(count) != -1) {
                count++;
            }
            
            current_index = count;
        }
        else {
            current_index = bulk_air_elem_row.title;
        }
        
        used_indices.push(current_index);
        the_params["bulkAir_" + current_index + "_quantity"] = bulk_air_elem_row.down("td.bf_qty").innerHTML;
        count++;
    });
    
    return the_params;
}


function save_session(register_user) {
    register_user = register_user || false;
    
    var api_key = $F("api_key");
    var session_id = $F("sessionid");
    
    if(session_id == "") {
        // alert("Starting session.");
        start_session();
    }
    else {
        // alert("Session present: " + session_id);
    }
    
    // Get the serialized data from the tables and fill the params.
    var the_params = serialize_data();
    session_id = $F("sessionid");
    
    // Finally, add on the api_key & session_id.
    the_params["api_key"] = api_key;
    the_params["sessionId"] = session_id;
    
    new Ajax.Request("/calc/api/calc.session.save", {
        parameters: the_params,
        onSuccess: function(transport) {
            if(register_user == true) {
                register_save_footprint();
            }
            else {
                login_save_footprint();
            }
        },
        onFailure: function() {
            alert("Sorry, we could not store your information at this time.");
        }
    });
}


function get_footprints() {
    var api_key = $F("api_key");
    var user_details = get_saved_user_details();
    var username;
    var password;
    
    if((user_details["username"] == "") || (user_details["password"] == "")) {
        username = $F("loginusername");
        password = $F("loginpassword");
        $("accessformerrors").innerHTML = "";
        
        var required_fields = new Hash({
            loginusername: "Username",
            loginpassword: "Password"
        });

        if(! check_required_fields(required_fields)) {
            $("accessmyemissionsform").show();
            $("accessmyemissionsprocessing").hide();
            $("accessformerrors").innerHTML = "Please correct the invalid fields.";
            $("accessformerrors").show();
            return false;
        }
    }
    else {
        username = user_details["username"];
        password = user_details["password"];
    }
    
    $("accessmyemissionsform").hide();
    $("accessmyemissionsprocessing").show();
    
    new Ajax.Request(get_footprints_url, {
        parameters: {
            api_key: api_key,
            username: username,
            password: password
        },
        onSuccess: function(transport) {
            save_user_details(username, password);
            var result = transport.responseXML;
            var the_list = result.getElementsByTagName('ul');
            
            if(typeof XMLSerializer != "undefined") {
                the_list = (new XMLSerializer()).serializeToString(the_list[0]);
            }
            else if(the_list[0].xml) {
                the_list = the_list[0].xml;
            }
            else {
                alert("Oops! You appear to be using an unsupported browser!");
            }
            
            new Insertion.Top($("footprintlist"), the_list);
            
            $$("#footprintlist ul li a").each(function(list_item) {
                Event.observe(list_item, "click", function(event) {
                    $("sessionid").value = list_item.getAttribute("title");
                    load_session();
                    Event.stop(event);
                });
            });
            
            $("accessmyemissionsprocessing").hide();
            $("footprintlisterrors").hide();
            $("footprintlistwrapper").show();
        },
        onFailure: function(transport) {
            calculator_changed();
            $("accessmyemissionsprocessing").hide();
            $("footprintlisterrors").innerHTML = "Sorry, there doesn't appear to be any prior data for you.";
            $("footprintlisterrors").show();
            $("showaccessmyemissionsformbutton").show();
        }
    });
}


function save_footprint(api_key, session_id, username, password, footprint_name) {
    clear_save_messages();
    
    new Ajax.Request(save_footprint_url, {
        parameters: {
            api_key: api_key,
            calc_session_id: session_id,
            username: username,
            password: password,
            footprint_name: footprint_name
        },
        onSuccess: function(transport) {
            $("savedataresult").innerHTML = transport.responseText;
            tracktotal = $('offsettotal').innerHTML;
            calcTrack('Calculator', 'saving_footprint', tracktotal);
            calculator_saved();
        },
        on401: function(transport) {
            $("savemyemissionsform").show();
            $("savemyemissionsprocessing").hide();
            $("saveshowformbutton").hide();
            $("saveloginformerrors").innerHTML = transport.responseText;
            $("saveloginformerrors").show();
            $("savedataresult").innerHTML = "";
        },
        onFailure: function(transport) {
            $("saveloginformerrors").innerHTML = transport.responseText;
            $("saveloginformerrors").show();
            $("savedataresult").innerHTML = "";
            calculator_changed();
        },
        onComplete: function() {
            // This really doesn't belong here but we can't fire this until
            // we're really done. So...
            $("savemyemissionsprocessing").hide();
        }
    });
}


function login_save_footprint() {
    $("savemyemissionsprocessing").show();
    var api_key = $F("api_key");
    var session_id = $F("sessionid");
    var username;
    var password;
    var user_details = get_saved_user_details();
    $("saveloginformerrors").innerHTML = "";
    
    if((user_details["username"] == "") || (user_details["password"] == "")) {
        username = $F("username");
        password = $F("password");
        
        var required_fields = new Hash({
            username: "Username",
            password: "Password"
        });

        if(! check_required_fields(required_fields)) {
            $("savemyemissionsform").show();
            $("savemyemissionsprocessing").hide();
            $("saveshowformbutton").hide();
            $("saveloginformerrors").innerHTML = "Please correct the invalid fields.";
            $("saveloginformerrors").show();
            return false;
        }
    }
    else {
        username = user_details["username"];
        password = user_details["password"];
    }
    
    var footprint_name = $F("footprintname");
    save_footprint(api_key, session_id, username, password, footprint_name);
}


function register_save_footprint() {
    var api_key = $F("api_key");
    var session_id = $F("sessionid");
    var email = $F("registeremail");
    var confirm_email = $F("registerconfirmemail");
    var firstname = $F("registerfirstname");
    var lastname = $F("registerlastname");
    var username = $F("registerusername");
    var password = $F("registerpassword");
    var confirm_password = $F("registerconfirmpassword");
    var signupfornewsletter = $F("registersignupfornewsletter");
    var footprint_name = $F("registerfootprintname");
    clear_save_messages();
    $("saveregistrationformerrors").innerHTML = "";
    $("savemyemissionsprocessing").show();
    
    var required_fields = new Hash({
        registeremail: "E-mail", 
        registerconfirmemail: "Confirm E-mail",
        registerfirstname: "First Name",
        registerlastname: "Last Name",
        registerusername: "Username",
        registerpassword: "Password",
        registerconfirmpassword: "Confirm Password"
    });
    
    if(! check_required_fields(required_fields)) {
        $("registersavemyemissionsform").show();
        $("savemyemissionsprocessing").hide();
        $("saveshowformbutton").hide();
        $("saveregistrationformerrors").innerHTML = "Please correct the invalid fields.";
        $("saveregistrationformerrors").show();
        return false;
    }
    
    if(confirm_email != email) {
        $("registeremail").addClassName("formerror");
        $("registerconfirmemail").addClassName("formerror");
        $("saveregistrationformerrors").innerHTML = "E-mail addresses don't match.";
        $("saveregistrationformerrors").show();
        $("registersavemyemissionsform").show();
        $("savemyemissionsprocessing").hide();
        return false;
    }
    
    if(confirm_password != password) {
        $("registerpassword").addClassName("formerror");
        $("registerconfirmpassword").addClassName("formerror");
        $("saveregistrationformerrors").innerHTML = "Passwords don't match.";
        $("saveregistrationformerrors").show();
        $("registersavemyemissionsform").show();
        $("savemyemissionsprocessing").hide();
        return false;
    }
    
    new Ajax.Request(registration_url, {
        parameters: {
            firstname: firstname,
            lastname: lastname,
            username: username,
            password: password,
            email: email
        },
        onSuccess: function(transport) {
            if(signupfornewsletter == 1) {
                send_newsletter_signup(email);
            }
            
            if(transport.responseText.match(/success/)) {
                save_user_details(username, password);
                save_footprint(api_key, session_id, username, password, footprint_name);
            }
            else {
                $("registersavemyemissionsform").show();
                $("saveshowformbutton").hide();
                $("saveregistrationformerrors").innerHTML = "Sorry, your registration failed.";
                $("saveregistrationformerrors").show();
            }
        },
        onFailure: function(transport) {
            $("registersavemyemissionsform").show();
            $("saveshowformbutton").hide();
            $("saveregistrationformerrors").innerHTML = "Sorry, your registration failed.";
            $("saveregistrationformerrors").show();
        },
        on401: function(transport) {
            $("registersavemyemissionsform").show();
            $("saveshowformbutton").hide();
            $("saveregistrationformerrors").innerHTML = "Sorry, your registration failed.";
            $("saveregistrationformerrors").show();
            var reason_parent = transport.responseXML.getElementsByTagName("reason");
            
            if(reason_parent.length > 0) {
                var reason = reason_parent[0].firstChild.data;
                
                if(reason) {
                    $("saveregistrationformerrors").innerHTML += "<br />\n" + reason;
                }
            }
        },
        onComplete: function() {
            $("savemyemissionsprocessing").hide();
        }
    });
}


function send_newsletter_signup(email) {
    var newsletter_parameters = encodeURI("email=" + email);

    // Sign them up for the newsletter.
    new Ajax.Request(newsletter_url, {
        parameters: newsletter_parameters,
        onFailure: function(transport) {
            $("saveregistrationformerrors").innerHTML += "Sorry, we could not sign you up for the newsletter at this time.";
            $("saveregistrationformerrors").show();
        }
    });
}


function clear_save_messages() {
    $("savedataresult").innerHTML = "";
}


function clear_error_fields() {
    $$(".formerror").each(function(the_element) {
        the_element.removeClassName("formerror");
    });
}


function check_required_fields(required_fields) {
    var invalid_fields = new Array();
    clear_error_fields();
    
    required_fields.each(function(pair) {
        if($F(pair.key) == "") {
            invalid_fields.push(pair.key);
        }
    });
    
    if(invalid_fields.length > 0) {
        invalid_fields.each(function(invalid_field) {
           $(invalid_field).addClassName("formerror");
        });
        
        return false;
    }
    else {
        return true;
    }
}


function setModals() {
    /*
    $$(".modal").each(function(the_modal) {
        new Control.Modal(the_modal, {
            opacity: 0.6,
            position: 'absolute',
            height: 400,
            width: 830,
            iframe: true
        });
    });
    */
    new Control.Modal("how_is_this_calculated_link", {
        opacity: 0.6,
        position: 'absolute',
        height: 500,
        width: 500
    });
}


function save_user_details(username, password) {
    $("current_username").value = username;
    $("current_password").value = password;
}


function get_saved_user_details() {
    var user_details = new Hash();
    user_details["username"] = $F("current_username");
    user_details["password"] = $F("current_password");
    return user_details;
}


function calculator_saved() {
    $("last_saved").value = new Date();
}


function calculator_changed() {
    $("last_saved").clear();
}


function clear_calculator() {
    // Flight
    $$("#itemlist_flight_body tr.flight_data").each(function(the_magic_row) {
        the_magic_row.remove();
    });
    
    // Bulk Flight
    $$("#itemlist_bulkflight_body tr.bulkflight_data").each(function(the_magic_row) {
        the_magic_row.remove();
    });
    
    // Vehicles
    $$("#itemlist_vehicle_body tr.vehicle_data").each(function(the_magic_row) {
        the_magic_row.remove();
    });
    
    // Natural Gas
    $$("#itemlist_ngas_body tr.natural_gas_data").each(function(the_magic_row) {
        the_magic_row.remove();
    });
    
    // Electricity
    $$("#itemlist_el_body tr.electricity_data").each(function(the_magic_row) {
        the_magic_row.remove();
    });
    
    runningOffsetTotal();
    stop_session();
}


function build_footprint_name() {
    var the_name = "";
    var completed = new Array();
    
    if($$("#itemlist_vehicle_body tr.vehicle_data").length > 0) {
        completed.push("Vehicles");
    }
    
    if($$("#itemlist_ngas_body tr.natural_gas_data").length > 0) {
        completed.push("Natural Gas");
    }
    
    if($$("#itemlist_flight_body tr.flight_data").length > 0) {
        completed.push("Air Travel");
    }
    
    if($$("#itemlist_bulkflight_body tr.bulkflight_data").length > 0) {
        completed.push("Bulk Flights");
    }
    
    if($$("#itemlist_el_body tr.electricity_data").length > 0) {
        completed.push("Electricity");
    }
    
    the_name = completed.join(", ");
    
    // Note: Total tons can't be used for math (has commas).
    // The "simpleNumber" function can strip those if you need to.
    total_tons = $("offsettotal").innerHTML;
    
    if(the_name.length > 0) {
        // Add a hyphen if any sections are present.
        the_name += " - "
    }
    
    the_name += total_tons + " Tons";
    
    return the_name;
}


function get_unit_averages(average_type, desired_field) {
    new Ajax.Request('/calc/api/calc.meta.averages', {
        parameters: { 
            api_key: $F('api_key')
        },
        onSuccess: function(transport) {
            y = transport.responseXML.getElementsByTagName(average_type);
            
            if(y.length > 0) {
                $(desired_field).value = parseInt(simpleNumber(y[0].firstChild.data));
            }
        }
    });
}


function get_metric_tonnage() {
    return Math.ceil(simpleNumber($("offsettotal").innerHTML));
}


//addEvent(window, "DOMContentLoaded", initCalculator);
