var report = new Object;

report.home = new Object;
report.home.electric = 0;
report.home.gas = 0;
report.home.oil = 0;
report.home.coal = 0;
report.home.wood = 0;
report.home.share = 0;
report.home.total = 0;

report.trans = new Object;
report.trans.car1 = 0;
report.trans.car2 = 0;
report.trans.bike = 0;
report.trans.taxi = 0;
report.trans.bus = 0;
report.trans.coach = 0;
report.trans.ferry = 0;
report.trans.nrail = 0;
report.trans.irail = 0;

report.trans.flight = new Object;

report.trans.flight.long = 0;

report.trans.total = 0;

report.food = new Object;
report.food.diet = 0;
report.food.src = 0;
report.food.total = 0;

report.industry = new Object;
report.industry.national = 0;
report.industry.spending = 1;
report.industry.total = 0;

report.grand = new Object;
report.grand.total = 0;

function make_percent(decimal) {

    return Math.round(1000 * decimal) / 10;
}

function make_number(string) {

    return string.replace(/[^\d\.]/g,"") * 1;
}

function getval(element,tonum) {

    var theform = document.getElementById("quickcalc");
    
    if (!theform[element]) {

	alert("unable to get " + element);
    }
    
    if (tonum) {
	return make_number(theform[element].value);
    } else {
	return theform[element].value;
    }
}

function getcheck(element) {

    var theform = document.getElementById("quickcalc");

    return theform[element].checked;
}

function getradval(element)
{
    var theform =  document.getElementById("quickcalc");

    var e = theform[element];

    for (var i=0; i < e.length; i++) {

	if (e[i].checked) {
		
	    return e[i].value;
	}
    }
    
    return;
}

function setval(element,value) {

    if (!document.getElementById(element)) {

	alert("unable to set " + element);
    }
    
    document.getElementById(element).innerHTML = value;   
}

function setinput(element,value) {
    document.getElementById(element).value = value;   
}

// ----------------

function grand_change() {

    setval("home_total",report.home.share);

    setval("trans_total",report.trans.total);
    setval("food_total",report.food.total);
    setval("industry_total",report.industry.total);

    report.grand.total = report.home.share + report.trans.total + report.food.total + report.industry.total;

    if (report.grand.total > 0) {
	setval("home_percent", make_percent(report.home.share / report.grand.total));
	setval("trans_percent", make_percent(report.trans.total / report.grand.total));
	setval("food_percent", make_percent(report.food.total / report.grand.total));
	setval("industry_percent", make_percent(report.industry.total / report.grand.total));
    }

    setval("grand_total",report.grand.total + " kg");
    setval("grand_total_tn",Math.round(report.grand.total/100)/10 + " tonnes");

    if (report.home.total > 0) {

	setval("percent_electric", make_percent(report.home.electric / report.grand.total));
	setval("percent_gas", make_percent(report.home.gas / report.grand.total));
	setval("percent_oil", make_percent(report.home.oil / report.grand.total));
	setval("percent_coal", make_percent(report.home.coal / report.grand.total));
	setval("percent_wood", make_percent(report.home.wood / report.grand.total));
    }

    if (report.trans.total > 0) {
	setval("percent_car1", make_percent(report.trans.car1 / report.grand.total));
	setval("percent_car2", make_percent(report.trans.car2 / report.grand.total));
	setval("percent_bike", make_percent(report.trans.bike / report.grand.total));
	setval("percent_taxi", make_percent(report.trans.taxi / report.grand.total));
	setval("percent_bus", make_percent(report.trans.bus / report.grand.total));
	setval("percent_coach", make_percent(report.trans.coach / report.grand.total));
	setval("percent_ferry", make_percent(report.trans.ferry / report.grand.total));
	setval("percent_nrail", make_percent(report.trans.nrail / report.grand.total));
	setval("percent_irail", make_percent(report.trans.irail / report.grand.total));
	setval("percent_flight_long", make_percent(report.trans.flight.long / report.grand.total));
    }

    if (report.food.total > 0) {
	setval("percent_diet", make_percent(report.food.diet / report.grand.total));
	setval("percent_src", make_percent(report.food.src / report.grand.total));
    }

    if (report.industry.total > 0) {
	setval("percent_national", make_percent(report.industry.national / report.grand.total));
	setval("percent_spending", make_percent(report.industry.spending / report.grand.total));
    }

}

// ----------------

function home_change() {

    setval("total_electric",report.home.electric);
    setval("electric_total",report.home.electric);

    setval("total_gas",report.home.gas);
    setval("gas_total",report.home.gas);

    setval("total_oil",report.home.oil);
    setval("oil_total",report.home.oil);

    setval("total_coal",report.home.coal);
    setval("coal_total",report.home.coal);

    setval("total_wood",report.home.wood);
    setval("wood_total",report.home.wood);

    var people = getval("numadult",true) + (getval("numchild",true)/2);

    report.home.total = report.home.electric 
	+ report.home.gas 
	+ report.home.oil
	+ report.home.coal
	+ report.home.wood;

    report.home.share = Math.round(report.home.total / people);

    setval("total_home",report.home.total);
    setval("share_home",report.home.share);

    grand_change();
}

function trans_change() {

    setval("total_car1",report.trans.car1);
    setval("car1_total",report.trans.car1);

    setval("total_car2",report.trans.car2);
    setval("car2_total",report.trans.car2);

    setval("cars_total",report.trans.car1 + report.trans.car2);

    setval("total_bike",report.trans.bike);
    setval("bike_total",report.trans.bike);

    setval("total_taxi",report.trans.taxi);
    setval("taxi_total",report.trans.taxi);

    setval("total_bus",report.trans.bus);
    setval("bus_total",report.trans.bus);

    setval("total_coach",report.trans.coach);
    setval("coach_total",report.trans.coach);

    setval("total_ferry",report.trans.ferry);
    setval("ferry_total",report.trans.ferry);

    setval("total_nrail",report.trans.nrail);
    setval("nrail_total",report.trans.nrail);

    setval("total_irail",report.trans.irail);
    setval("irail_total",report.trans.irail);

    setval("total_flight_long",report.trans.flight.long);
    setval("flight_long_total",report.trans.flight.long);

    report.trans.total = report.trans.car1
	+ report.trans.car2
	+ report.trans.bike
	+ report.trans.taxi
	+ report.trans.bus
	+ report.trans.coach
	+ report.trans.ferry
	+ report.trans.nrail
	+ report.trans.irail
	+ report.trans.flight.long;

    setval("total_trans",report.trans.total);

    grand_change();
}

function food_change() {

    report.food.diet = getradval("fdiet") * 1 || 0;
    report.food.src = getradval("fsrc") * 1 || 0;

    setval("total_diet",report.food.diet);
    setval("diet_total",report.food.diet);

    setval("total_src",report.food.src);
    setval("src_total",report.food.src);

    report.food.total = report.food.diet + report.food.src;

    setval("total_food",report.food.total);

    grand_change();
}

function industry_change() {

    var people = getval("numadult",true) + (getval("numchild",true)/2);

    report.industry.national = 1000;

    report.industry.spending = Math.round(( getval("itonnes",true) / people ) * 1000 * getradval("iaware"));

    setval("total_national",report.industry.national);
    setval("total_spending",report.industry.spending);
    setval("spending_total",report.industry.spending);

    report.industry.total = report.industry.national + report.industry.spending; 

    setval("total_industry",report.industry.total);

    grand_change();
}

function people_change() {
    
    home_change();
    industry_change();
}

// ----------------

function electric_change() {

    var ecpu = 0.14; // electricity cost per unit

    report.home.electric = Math.round(( getval("espend",true) / ecpu ) * getradval("etype") * getval("efreq"));

    home_change();
}

function gas_change() {

    var gcpu = 0.05; // gas cost per unit
    var gconv = 0.206; 

    var pg = Math.round(( getval("gspend",true) / gcpu ) * gconv * getval("gfreq"));

    var buweight = Math.round(getval("bu45n",true) * 4.5 
			      + getval("bu70n",true) * 7
			      + getval("bu150n",true) * 15);

    var prweight = Math.round(getval("pr39n",true) * 3.9 
			      + getval("pr60n",true) * 6
			      + getval("pr130n",true) * 13
			      + getval("pr195n",true) * 19.5);

    var bg = buweight * 1.74 * 1.495;
    var rg = prweight * 1.95 * 1.495;

    report.home.gas = Math.round(pg + bg + rg);

    home_change();
}

function oil_change() {

    var ocpu = 0.53;
    var oconv = 2.518;

    report.home.oil = Math.round(( getval("ospend",true) / ocpu ) * oconv * getval("ofreq",true));

    home_change();
}

function coal_change() {

    var cconv = 2.523;

    var cweight = getval("c20kg",true) * 20
	+ getval("c25kg",true) * 25
	+ getval("c50kg",true) * 50
	+ getval("c14tn",true) * 250
	+ getval("c12tn",true) * 500
	+ getval("c11tn",true) * 1000;

    report.home.coal = Math.round(cweight * cconv);

    home_change();
}

function coal_calc() {

    setinput("c20kg",
	     getval("cWi20",true) * 13 
	     + getval("cSp20",true) * 13 
	     + getval("cSu20",true) * 13 
	     + getval("cAu20",true) * 13);

    setinput("c25kg",
	     getval("cWi25",true) * 13 
	     + getval("cSp25",true) * 13 
	     + getval("cSu25",true) * 13 
	     + getval("cAu25",true) * 13);

    setinput("c50kg",
	     getval("cWi50",true) * 13 
	     + getval("cSp50",true) * 13 
	     + getval("cSu50",true) * 13 
	     + getval("cAu50",true) * 13);

    coal_change();
}

function wood_change() {

    var wconv = 1.779 / 2; // half charge

    var wweight = 0;
    
    var wburn = 7; // kg per period
    
    var seasons = new Array("Wi", "Sp", "Su", "Au");
    var times = new Array("Mo", "Af", "Ev");

    for (var s in seasons) {
	
	var ss = seasons[s];
	var nf = getval("w" + ss + "NF", true)

	    for (var t in times) {

		var ts = times[t];

		//	    if (getcheck("w" + ss + ts)) {
		//		wweight += 8 * 7 * 13 * nf;
		//	    }
	    
		wweight += wburn * getval("w" + ss + ts) * 13 * nf;
	    }
    }

    report.home.wood = Math.round(wweight * wconv);

    home_change();
}

// ----------------

var carfact = new Object;

carfact.small = new Object;
carfact.medium = new Object;
carfact.large = new Object;
carfact.fourbyfour = new Object;

carfact.small.petrol = 0.26;
carfact.small.diesel = 0.22;
carfact.small.lpg = 0.21; // made up
carfact.small.electric = 0.06;

carfact.medium.petrol = 0.35;
carfact.medium.diesel = 0.31;
carfact.medium.lpg = 0.30;
carfact.medium.electric = 0.08;

carfact.large.petrol = 0.43;
carfact.large.diesel = 0.37;
carfact.large.lpg = 0.42;
carfact.large.electric = 0.10;

carfact.fourbyfour.petrol = 0.49;
carfact.fourbyfour.diesel = 0.43;
carfact.fourbyfour.lpg = 0.48; // made up
carfact.fourbyfour.electric = 0.12; // made up

function car_change(n) {

    var prefix = "c" + n;

    var size = getval(prefix + "size");
    var fuel = getval(prefix + "fuel");

    var carbon = getval(prefix + "miles",true) * carfact[size][fuel];

    if (fuel == "diesel") {
	carbon *= 1 - getval(prefix + "bio")/200;
    }   

    if (getcheck(prefix + "new")) {

	var f;

	if (fuel == "electric") {
	    f = "petrol";
	} else {
	    f = fuel;
	}

	carbon += carfact[size][fuel] * 1000;
    }

    var owners = getval(prefix + "coown")*1 + 1;

    report.trans["car" + n] = Math.round(carbon / owners);

    trans_change();
}
    
var bikefact = new Object;

bikefact.small = 0.12;
bikefact.medium = 0.15;
bikefact.large = 0.21;

function bike_change() {

    var size = getval("bsize");
    
    report.trans.bike = Math.round(getval("bmiles",true) * bikefact[size]);

    if (getcheck("bnew")) {

	report.trans.bike += bikefact[size] * 150;
    }

    trans_change();
}

function taxi_change() {

    var miles = 0;
    var conv = 0.36; // 0.22 * 8/5?

    for (var n = 1; n <= 5; n++) {

	var prefix = "tt" + n;

	var dist = getval(prefix + "dist",true);
	var num = getval(prefix + "num",true);
	
	if (dist > 0 && num > 0) {

	    miles += dist * num * getval(prefix + "ret") * getval(prefix + "freq") / getval(prefix + "person");
	}
    }

    report.trans.taxi = Math.round(miles * conv);

    trans_change();
}

function bus_change() {

    var miles = 0;
    var conv = 0.11 * 8/5;

    for (var n = 1; n <= 5; n++) {

	var prefix = "tb" + n;

	var dist = getval(prefix + "dist",true);
	var num = getval(prefix + "num",true);
	
	if (dist > 0 && num > 0) {

	    miles += dist * num * getval(prefix + "ret") * getval(prefix + "freq");
	}
    }

    report.trans.bus = Math.round(miles * conv);

    trans_change();
}

function coach_change() {

    var miles = 0;
    var conv = 0.03 * 8/5;

    for (var n = 1; n <= 5; n++) {

	var prefix = "tc" + n;

	var dist = getval(prefix + "dist",true);
	var num = getval(prefix + "num",true);
	
	if (dist > 0 && num > 0) {

	    miles += dist * num * getval(prefix + "ret") * getval(prefix + "freq");
	}
    }
    
    report.trans.coach = Math.round(miles * conv);

    trans_change();
}

function ferry_change() {

    var miles = 0;
    var conv = 0.12 * 8/5;

    for (var n = 1; n <= 5; n++) {

	var prefix = "tf" + n;

	var dist = getval(prefix + "dist",true);
	var num = getval(prefix + "num",true);
	
	if (dist > 0 && num > 0) {

	    miles += dist * num * getval(prefix + "ret") * getval(prefix + "freq");
	}
    }
    
    report.trans.ferry = Math.round(miles * conv);

    trans_change();
}

function nrail_change() {

    var miles = 0;
    var conv = 0.06 * 8/5;

    for (var n = 1; n <= 5; n++) {

	var prefix = "tnr" + n;

	var dist = getval(prefix + "dist",true);
	var num = getval(prefix + "num",true);
	
	if (dist > 0 && num > 0) {

	    miles += dist * num * getval(prefix + "ret") * getval(prefix + "freq");
	}
    }
    
    report.trans.nrail = Math.round(miles * conv);

    trans_change();
}

function irail_change() {

    var miles = 0;
    
    var mph = 100;
    var conv = 0.02 * 8/5;

    for (var n = 1; n <= 5; n++) {

	var prefix = "tir" + n;

	var jtime = getval(prefix + "time",true);
	var num = getval(prefix + "num",true);
	
	if (jtime > 0 && num > 0) {

	    miles += jtime * mph * num * getval(prefix + "ret");
	}
    }

    report.trans.irail = Math.round(miles * conv);

    trans_change();
}

var flightfact = new Object;

flightfact.long = new Object;

flightfact.long.mph = 500; // overridden later
flightfact.long.rfi = 3; // this is overridden later
flightfact.long.eco = 0.08*8/5;
flightfact.long.pre = 0.13*8/5;
flightfact.long.bus = 0.23*8/5;
flightfact.long.fir = 0.32*8/5;

function flight_change(ftype) {

    var carbon = 0;
    
    var fact = flightfact[ftype];

    for (var n = 1; n <= 5; n++) {

	var prefix = "fl_" + ftype + n;

	var jtime = getval(prefix + "time",true);

	var mph = jtime > 1 ? jtime > 4 ? 500 : 400 : 250;
	var rfi = jtime > 1 ? 3 : 2;

	var num = getval(prefix + "num",true);
	
	if (jtime > 0 && num > 0) {

	    var fclass = getval(prefix + "class");

	    var miles = jtime * mph * num * getval(prefix + "ret");
	    
	    var fconv = fact[fclass];

	    carbon += miles * fconv * rfi;
	}
    }
    
    report.trans.flight[ftype] = Math.round(carbon);
    
    trans_change();
}

// -----------------

function all_change() {
    
    food_change();
    industry_change();
    electric_change();
    gas_change();
    oil_change();
    coal_change();
    wood_change();
    diesel_change(1);
    car_change(1);
    diesel_change(2);
    car_change(2);
    bike_change();
    taxi_change();
    bus_change();
    coach_change();
    ferry_change();
    nrail_change();
    irail_change();
    flight_change("long");

}
