// declare particulars global data

var pg = new Object;

pg.htype = new Object; // by house type

pg.htype.detached = new Object;
pg.htype.semi = new Object;
pg.htype.terrace = new Object;
pg.htype.gflat = new Object;
pg.htype.mflat = new Object;
pg.htype.tflat = new Object;

// ground floors and roof

pg.htype.detached.hasground = true;
pg.htype.detached.hasroof = true;
pg.htype.semi.hasground = true;
pg.htype.semi.hasroof = true;
pg.htype.terrace.hasground = true;
pg.htype.terrace.hasroof = true;
pg.htype.gflat.hasground = true;
pg.htype.gflat.hasroof = false;
pg.htype.mflat.hasground = false;
pg.htype.mflat.hasroof =  false;
pg.htype.tflat.hasground =  false;
pg.htype.tflat.hasroof = true;

// external walls

pg.htype.detached.ewalls = 4;
pg.htype.semi.ewalls = 3;
pg.htype.terrace.ewalls = 2;
pg.htype.gflat.ewalls = 2;
pg.htype.mflat.ewalls = 2;
pg.htype.tflat.ewalls = 2;

pg.rsize = new Object; // by room size

pg.rsize.small = new Object;
pg.rsize.medium = new Object;
pg.rsize.large = new Object;
pg.rsize.vlarge = new Object;

pg.rsize.small.farea = 10;
pg.rsize.medium.farea = 20;
pg.rsize.large.farea = 30;
pg.rsize.vlarge.farea = 50;

pg.rsize.small.wheight = 2;
pg.rsize.medium.wheight = 2.3;
pg.rsize.large.wheight = 2.7;
pg.rsize.vlarge.wheight = 3.7;

// temperatures

var tg = new Object;

tg.internal = new Object;
tg.external = new Object;

tg.internal.cool = 15;
tg.internal.moderate = 18; 
tg.internal.warm = 21; 

tg.external.south = 10;
tg.external.midlands = 9.5;
tg.external.north = 9;

// r values

var rv = new Object;

rv.none = 0;

rv.stonemc = 0.717;
rv.stonecc = 0.500;
rv.brick   = 0.450;
rv.brickac = 1.000;
rv.brickic = 2.200;
rv.cobb    = 0.900;
rv.straw   = 6.000;
rv.timber  = 1.800;

rv.dryline  = 1;
rv.idryline = 2.5;

rv.inone  = 0.500;
rv.i100   = 2.500;
rv.i200   = 5.000;
rv.i250   = 6.250;
rv.i300   = 7.500;
rv.thatch = 4.000;

rv.mfsgnc = 0.170;
rv.mfscwc = 0.221;
rv.mfsg   = 0.340;
rv.wusfnc = 0.200;
rv.wusgwc = 0.260;
rv.wusg   = 0.400;
rv.wudg   = 0.400;
rv.wlowe  = 0.590;

rv.sconcrete = 0.800;
rv.stimber = 1.450;

// u values

var uv = new Object;

uv.drh = 0.6;
uv.mdh = 0.4;
uv.ldh = 0.2;

// declare data variables

var pd = new Object; // particulars
var td = new Object; // temperature
var cd = new Object; // construction

// summary

var sd = new Object;

// supplementary stuff

var pitch = 1.2;  // the roof pitch factor
var winpc = 11;   // window percentage
var cpkwh = 0.05; // cost per kwk (pounds)

// ad hoc variables

var tmdiff; // temperature difference
var cpkwhp = cpkwh * 100; // cost in pence

function updateparticulars() {

    var f = document.house;

    var htype = pg.htype[f.htype.value];

    var rsize = pg.rsize[f.rsize.value];

    var nrooms = f.nrooms.value;
    var nfloors = f.nfloors.value;

    pd.fai = rsize.farea * nrooms;
    pd.cai = pd.fai;

    pd.fae = htype.hasground ? pd.fai / nfloors : 0;
    pd.rae = htype.hasroof ? pitch * pd.cai / nfloors : 0;
    pd.wh = nfloors * rsize.wheight;
    pd.wl = Math.sqrt(pd.fai / nfloors) * 4;
    pd.waeg = pd.wh * pd.wl * htype.ewalls / 4;
    pd.wda = pd.waeg * winpc / 100;
    pd.waen = pd.waeg - pd.wda;
    pd.hv = rsize.wheight * rsize.farea * nrooms;

    popobj(pd);
    updateconstruction();
}

function setspecific(i) {

    var f = document.temperature;
    
    var opts = f[i].options;

    opts[opts.length-1].selected = true;;
}


function updatetm() {

    var f = document.temperature;

    if (f.internal.value != 'other') {
	td.tmint = tg.internal[f.internal.value];
    } else {
	if (f.iother.value) {
	    td.tmint = f.iother.value;
	} else {
	    f.iother.value = td.tmint;
	}
    }
    if (f.external.value != 'other') {
	td.tmext = tg.external[f.external.value];
    } else {
	if (f.eother.value) {
	    td.tmext = f.eother.value;
	} else {
	    f.eother.value = td.tmext;
	}
    }

    tmdiff = td.tmint - td.tmext;

    popobj(td);

    updateconstruction();
}

function updateconstruction() {

    var f = document.construction;

    var extwalls = f.extwalls.value;
    var lining = f.lining.value;

    sd.sewl = loss(rv[extwalls] + rv[lining], pd.waen, tmdiff);
    sd.sbewl = loss(rv[extwalls] + rv.idryline, pd.waen, tmdiff);

    cd.ewc = sd.sewc = cost(sd.sewl);
    cd.bewc = sd.sbewc = cost(sd.sbewl);

    var insulation = f.insulation.value;
    
    sd.sril = loss(rv[insulation], pd.rae, tmdiff + 1);
    sd.sbril = loss(rv.i300, pd.rae, tmdiff + 1);

    cd.ric = sd.sric = cost(sd.sril);
    cd.bric = sd.sbric = cost(sd.sbril);

    var windoor = f.windoor.value;

    sd.swil = loss(rv[windoor], pd.wda, tmdiff);
    sd.sbwil = loss(rv.wlowe, pd.wda, tmdiff);

    cd.wic = sd.swic = cost(sd.swil);
    cd.bwic = sd.sbwic = cost(sd.sbwil);

    var grfloor = f.grfloor.value;

    sd.sgfl = loss(rv[grfloor], pd.fae, tmdiff/2);
    sd.sbgfl = loss(rv.stimber, pd.fae, tmdiff/2);

    cd.gfc = sd.sgfc = cost(sd.sgfl);
    cd.bgfc = sd.sbgfc = cost(sd.sbgfl);

    var air = f.air.value;

    sd.sail = loss(1/uv[air], pd.hv, tmdiff);
    sd.sbail = loss(1/uv.ldh, pd.hv, tmdiff);

    cd.aic = sd.saic = cost(sd.sail);
    cd.baic = sd.sbaic = cost(sd.sbail);
    
    popobj(cd);

    updatesummary();
}

function updatesummary() {

    sd.stotc = sd.sewc + sd.sric + sd.swic + sd.sgfc + sd.saic;
    sd.stotl = sd.sewl + sd.sril + sd.swil + sd.sgfl + sd.sail;

    sd.sewp = 100 * sd.sewc / sd.stotc;
    sd.srip = 100 * sd.sric / sd.stotc;
    sd.swip = 100 * sd.swic / sd.stotc;
    sd.sgfp = 100 * sd.sgfc / sd.stotc;
    sd.saip = 100 * sd.saic / sd.stotc;

    sd.sbtotc = sd.sbewc + sd.sbric + sd.sbwic + sd.sbgfc + sd.sbaic;
    sd.sbtotl = sd.sbewl + sd.sbril + sd.sbwil + sd.sbgfl + sd.sbail;

    sd.sbewp = 100 * sd.sbewc / sd.sbtotc;
    sd.sbrip = 100 * sd.sbric / sd.sbtotc;
    sd.sbwip = 100 * sd.sbwic / sd.sbtotc;
    sd.sbgfp = 100 * sd.sbgfc / sd.sbtotc;
    sd.sbaip = 100 * sd.sbaic / sd.sbtotc;

    sd.sbewpv = 100 * (sd.sewc - sd.sbewc) / sd.sewc;
    sd.sbripv = 100 * (sd.sric - sd.sbric) / sd.sric;
    sd.sbwipv = 100 * (sd.swic - sd.sbwic) / sd.swic;
    sd.sbgfpv = 100 * (sd.sgfc - sd.sbgfc) / sd.sgfc;
    sd.sbaipv = 100 * (sd.saic - sd.sbaic) / sd.saic;

    sd.sbtotpv = 100 * (sd.stotc - sd.sbtotc) / sd.stotc;
    
    sd.csaving = sd.stotc - sd.sbtotc;
    sd.psaving = sd.sbtotpv;

    popobj(sd);
}

function all_change() {
    updateparticulars();
    updatetm();
}


function loss(r,a,dt) {

    var u = 1/r;
    var q = u * a * dt;
    var akwh = q * 8.76;

    return akwh;
}

function cost(akwh) {
    
    var cost = akwh * cpkwh;
    return cost;
}

function annual(r,a,dt) {

    return cost(loss(r,a,dt));
}

function popobj(o) {
    for (var i in o) {
	poptext(i,Math.round(o[i]));
    }
}

function poptext(xid,xvalue) {
    document.getElementById(xid).innerHTML = xvalue;
}

function today() {

    var date = new Date();
    var d  = date.getDate();
    var day = (d < 10) ? '0' + d : d;
    var m = date.getMonth() + 1;
    var month = (m < 10) ? '0' + m : m;
    var yy = date.getYear();
    var year = (yy < 1000) ? yy + 1900 : yy;

    return day + "/" + month + "/" + year;
}



