
function calcGetFormData(frm)
{
    var inp = {};

    for(var i = 0; i < frm.elements.length; ++i)
    {
        inp[frm.elements[i].name] = parseFloat(frm.elements[i].value);

        if(isNaN(inp[frm.elements[i].name]))
            inp[frm.elements[i].name] = 0.0;
    }

    return inp;
}

function calcPrintResults(res)
{
    for(var n in res)
    {
        if(isNaN(res[n]))
        {
            var val = res[n];
        }
        else
        {
            var val = digits(Math.round(res[n]));
        }

        if(n.match(/(cost|price|total)/) && val != '&nbsp;')
            val = val.replace(/(-|^)/, '$1$$');

        document.getElementById(n + '_res').innerHTML = val;

        if(document.getElementById(n + '_res2'))
            document.getElementById(n + '_res2').innerHTML = val;

        if(document.getElementById(n + '_res3'))
            document.getElementById(n + '_res3').innerHTML = val;
    }
}


function calculateAC()
{
    var frm = document.calc;

    if(frm.hours.value == '')
    {
        alert('Please check your zipcode');
        return false;
    }

    var inp = calcGetFormData(frm);

    var a =
    {
        c13: inp.cap_star,
        c14: 14,

        c25: inp.cap_conv,
        c30: 20,
        c31: 0,
        c35: inp.hours,
        c38: 0.04,
        c39: 0.16,
        c46: 1.54,
        c49: 8066,
        c50: 11470


    };

    var res =
    {
        units:0
    };

    res.units = inp.units;

    res.init_cost_diff = (inp.init_cost_star - inp.init_cost_conv) * inp.units;

    if(inp.therm_star == 2)
        res.energy_cons_star = inp.units * a.c13 * inp.hours * (1.0/inp.seer_star) / 1000;
    else
        res.energy_cons_star = (1 - a.c39) * inp.units * a.c13 * inp.hours * (1.0/inp.seer_star) / 1000;

    if(inp.therm_conv == 2)
        res.energy_cons_conv = inp.units * a.c25 * inp.hours * (1.0/inp.seer_conv) / 1000;
    else
        res.energy_cons_conv = (1 - a.c39) * inp.units * a.c25 * inp.hours * (1.0/inp.seer_conv) / 1000;

    res.energy_cons_save = res.energy_cons_conv - res.energy_cons_star;

    res.energy_cost_star = res.energy_cons_star * inp.rate;
    res.energy_cost_conv = res.energy_cons_conv * inp.rate;
    res.energy_cost_save = res.energy_cost_conv - res.energy_cost_star;

    res.main_cost_star = inp.units * a.c30 * a.c31;
    res.main_cost_conv = inp.units * a.c30 * a.c31;
    res.main_cost_save = res.main_cost_conv - res.main_cost_star;

    res.an_cost_star = res.energy_cost_star + res.main_cost_star;
    res.an_cost_conv = res.energy_cost_conv + res.main_cost_conv;
    res.an_cost_save = res.energy_cost_save + res.main_cost_save;


    res.lf_energy_cons_star = a.c14 * res.energy_cons_star;
    res.lf_energy_cons_conv = a.c14 * res.energy_cons_conv;
    res.lf_energy_cons_save = res.lf_energy_cons_conv - res.lf_energy_cons_star;

    res.lf_energy_cost_star = excel_pv(a.c38, a.c14, res.energy_cost_star);
    res.lf_energy_cost_conv = excel_pv(a.c38, a.c14, res.energy_cost_conv);
    res.lf_energy_cost_save = res.lf_energy_cost_conv - res.lf_energy_cost_star;

    res.lf_main_cost_star = excel_pv(a.c38, a.c14, res.main_cost_star);
    res.lf_main_cost_conv = excel_pv(a.c38, a.c14, res.main_cost_conv);
    res.lf_main_cost_save = res.lf_main_cost_conv - res.lf_main_cost_star;

    res.op_cost_star = res.lf_energy_cost_star + res.lf_main_cost_star;
    res.op_cost_conv = res.lf_energy_cost_conv + res.lf_main_cost_conv;
    res.op_cost_save = res.op_cost_conv - res.op_cost_star;

    res.price_star = inp.units * inp.init_cost_star;
    res.price_conv = inp.units * inp.init_cost_conv;
    res.price_save = res.price_conv - res.price_star;

    res.total_star = res.op_cost_star + res.price_star;
    res.total_conv = res.op_cost_conv + res.price_conv;
    res.total_save = res.total_conv - res.total_star;

    res.lf_co2 = res.lf_energy_cons_save * a.c46;
    res.cars = res.lf_co2 / a.c50;
    res.forest = res.lf_co2 / a.c49;

    res.percent_save = Math.round(res.total_save / (inp.init_cost_star * inp.units) * 100) + '%';

    res.payback_years = (res.an_cost_save < 0)?'N/A':
                            ((res.an_cost_save == 0)? '> 14':
                                ((res.init_cost_diff / res.an_cost_save > 14)? '> 14': Math.round(res.init_cost_diff / res.an_cost_save * 100) / 100) + '&nbsp;');


    frm.saved_results = res;

    calcPrintResults(res);

    return false;
}

function calcRoundPrec(val, prec)
{
    return Math.round(val * (10 * prec)) / (10 * prec);
}

function calcRefresh(frm)
{
    frm = document[frm];

    calcClear();

    if(frm.saved_results)
        calcPrintResults(frm.saved_results);
}

function excel_pv(percent, period, val)
{
    var sum = 0;

    for(var i = 0; i < period; ++i)
    {
      val = Math.ceil(val/(1 + percent) * 100) / 100;
      sum += val;
    }

    return Math.ceil(sum);
}

function digits(d)
{
    return ('' + d).replace(/(\d{0,3})(\d{3})?(\d{3})?(\d{3})?(\d{3})?(\d{3})?(\d{3})?(\d{3})?$/, '$1,$2,$3,$4,$5,$6,$7,$8').replace(/,+$/, '');
}


function calcChange()
{
    var frm = document.calc2;

    if(frm.fuel.value == '1')
    {
        frm.rate.value = 1.17;
    }
    else
    {
        frm.rate.value = 2.41;
    }

    //frm.init_cost_conv.value = (frm.exists.value == '7')? 780: 0;

    var eff =
    {
        '1':[60,60,65,68,68,76,78,78],
        '2':[60,65,72,75,80,80,80,80]
    };

    frm.eff_star.value = (frm.fuel.value == '1')?90:83;
    frm.eff_conv.value = eff[frm.fuel.value][frm.exists.value];

    var res =
    {
        fuel: (frm.fuel.value == '1')? 'Gas': 'Oil',
        rate: (frm.fuel.value == '1')? 'Gas Rate ($/therm)': 'Oil Rate ($/gal)',
        fuel_units: (frm.fuel.value == '1')? 'Therms': 'Gallons'
    };

    calcPrintResults(res);
}

function calculateHeat()
{
    var frm = document.calc2;

    if(frm.census.value == '' || frm.region.value == '0')
    {
        alert('Please check your zipcode');
        return false;
    }

    var inp = calcGetFormData(frm);

    var c221tbl1 =
    [
        [-0.00370000, 0.38900000, 30.70000000, 60.70000000],
        [-0.00420000, 0.39100000, 27.90000000, 54.60000000],
        [-0.00470000, 0.39800000, 26.20000000, 49.80000000],
        [-0.00500000, 0.39900000, 23.20000000, 44.00000000],
        [-0.00590000, 0.39900000, 20.70000000, 39.20000000],
        [-0.00650000, 0.39500000, 18.20000000, 35.00000000],
        [-0.00690000, 0.37800000, 14.70000000, 30.60000000],
        [-0.00720000, 0.36200000, 11.90000000, 27.20000000]
    ];

    var r =
    [
        [50, 49, 45, 34, 62, 47, 49, 55, 29],
        [46, 45, 41, 33, 56, 44, 43, 50, 27],
        [43, 41, 37, 33, 51, 41, 37, 45, 26],
        [40, 38, 32, 32, 45, 38, 31, 40, 25],
        [37, 34, 28, 31, 39, 35, 24, 36, 24],
        [34, 30, 24, 30, 34, 32, 18, 31, 22],
        [31, 26, 20, 29, 28, 29, 12, 26, 21],
        [29, 24, 18, 28, 24, 27,  9, 23, 20]
    ];

    inp.region -= 1;

    var d27 = inp.census * r[inp.age][inp.region];

    inp.eff_star /= 100;
    inp.eff_conv /= 100;

    var a =
    {
        d11: ((inp.fuel == '1')? 18: 17),
        d21: 20,
        d22: 0,
        'd27': d27,
        g26: 5,
        g51: inp.fuel,
        g57: inp.therm_star,
        g60: inp.therm_conv,
        d221: (c221tbl1[inp.age][2] >= d27)? 0.276: ((c221tbl1[inp.age][3] <= d27)? 0.166:((c221tbl1[inp.age][0] * d27) + c221tbl1[inp.age][1])),
        d224: 0.04,
        d227: 139000,
        d228: 100000,
        d237: 161.27,
        d238: 116.97,
        d241: 8066,
        d242: 11470

    };

    var res = {};

    res.energy_cons_star = inp.size * a.d27 / inp.eff_star / 1000 * ((a.g57 == 1)? (1 - a.d221): 1);
    res.energy_cons_conv = inp.size * a.d27 / inp.eff_conv / 1000 * ((a.g60 == 1)? (1 - a.d221): 1);
    res.energy_cons_save = res.energy_cons_conv - res.energy_cons_star;

    res.energy_cons_g_star = ((a.g51 == 1)? (res.energy_cons_star / a.d228): (res.energy_cons_star / a.d227)) * 1000000;
    res.energy_cons_g_conv = ((a.g51 == 1)? (res.energy_cons_conv / a.d228): (res.energy_cons_conv / a.d227)) * 1000000;
    res.energy_cons_g_save = res.energy_cons_g_conv - res.energy_cons_g_star;

    res.energy_cost_star = res.energy_cons_g_star * inp.rate;
    res.energy_cost_conv = res.energy_cons_g_conv * inp.rate;
    res.energy_cost_save = res.energy_cost_conv - res.energy_cost_star;

    res.main_cost_star = a.d21 * a.d22;
    res.main_cost_conv = a.d21 * a.d22;
    res.main_cost_save = 0;

    res.an_cost_star = res.energy_cost_star + res.main_cost_star;
    res.an_cost_conv = res.energy_cost_conv + res.main_cost_conv;
    res.an_cost_save = res.energy_cost_save + res.main_cost_save;


    res.lf_energy_cost_star = excel_pv(a.d224, a.d11, res.energy_cost_star);
    res.lf_energy_cost_conv = excel_pv(a.d224, a.d11, res.energy_cost_conv);
    res.lf_energy_cost_save = res.lf_energy_cost_conv - res.lf_energy_cost_star;

    res.lf_main_cost_star = excel_pv(a.d224, a.d11, res.main_cost_star);
    res.lf_main_cost_conv = excel_pv(a.d224, a.d11, res.main_cost_conv);
    res.lf_main_cost_save = res.lf_main_cost_conv - res.lf_main_cost_star;

    res.lf_energy_cons_star = res.energy_cons_star * a.d11;
    res.lf_energy_cons_conv = res.energy_cons_conv * a.d11;
    res.lf_energy_cons_save = res.lf_energy_cons_conv - res.lf_energy_cons_star;

    res.lf_energy_cons_g_star = res.energy_cons_g_star * a.d11;
    res.lf_energy_cons_g_conv = res.energy_cons_g_conv * a.d11;
    res.lf_energy_cons_g_save = res.lf_energy_cons_g_conv - res.lf_energy_cons_g_star;

    res.op_cost_star = res.lf_energy_cost_star + res.lf_main_cost_star;
    res.op_cost_conv = res.lf_energy_cost_conv + res.lf_main_cost_conv;
    res.op_cost_save = res.op_cost_conv - res.op_cost_star;

    res.price_star = inp.init_cost_star;
    res.price_conv = inp.init_cost_conv;
    res.price_save = res.price_conv - res.price_star;

    res.total_star = res.op_cost_star + res.price_star;
    res.total_conv = res.op_cost_conv + res.price_conv;
    res.total_save = res.total_conv - res.total_star;

    res.lf_co2 = res.lf_energy_cons_save * ((a.g51 == 1)? a.d238: a.d237);
    res.cars = res.lf_co2 / a.d242;
    res.forest = res.lf_co2 / a.d241;

    res.percent_save = Math.round(res.total_save / inp.init_cost_star * 100) + '%';

    res.init_cost_diff = inp.init_cost_star - inp.init_cost_conv;

    res.payback_years = (res.init_cost_diff <= 0)? 0:
                            ((res.an_cost_save < 0)? 'N/A':
                                ((res.an_cost_save == 0)? '>' + a.d11:
                                    ((res.init_cost_diff / res.an_cost_save > a.d11)? '>' + a.d11:
                                        (res.init_cost_diff / res.an_cost_save))));

    res.payback_years = calcRoundPrec(res.payback_years, 1) + '&nbsp;';

    frm.saved_results = res;

    calcPrintResults(res);

    return false;

}

function calcClear()
{

    var res = {};

    var values =
    [
        'energy_cons_star', 'energy_cons_conv', 'energy_cons_save', 'energy_cons_g_star',
        'energy_cons_g_conv', 'energy_cons_g_save', 'energy_cost_star', 'energy_cost_conv',
        'energy_cost_save', 'main_cost_star', 'main_cost_conv', 'main_cost_save', 'an_cost_star',
        'an_cost_conv', 'an_cost_save', 'lf_energy_cost_star', 'lf_energy_cost_conv',
        'lf_energy_cost_save', 'lf_main_cost_star', 'lf_main_cost_conv',
        'lf_main_cost_save', 'lf_energy_cons_star', 'lf_energy_cons_conv',
        'lf_energy_cons_save', 'lf_energy_cons_g_star', 'lf_energy_cons_g_conv',
        'lf_energy_cons_g_save', 'op_cost_star', 'op_cost_conv', 'op_cost_save',
        'price_star', 'price_conv', 'price_save', 'total_star', 'total_conv',
        'total_save', 'lf_co2', 'cars','forest', 'percent_save', 'init_cost_diff', 'payback_years'
    ];

    for(var i = 0; i < values.length; ++i)
        res[values[i]] = '&nbsp;';

    calcPrintResults(res);

}


if(location.hash == '#heating')
{
    document.getElementById('tab_selector').className = 'heating';
    document.zip.action='#heating';
}

calcChange();
