
// Lookup Arrays
// Size Of System
var lu_size_of_system = new Array();

lu_size_of_system[0] = 0;
lu_size_of_system[1] = 0;
lu_size_of_system[2] = 0;
lu_size_of_system[3] = 0;
lu_size_of_system[4] = 0;
lu_size_of_system[5] = 0;
lu_size_of_system[6] = 0;
lu_size_of_system[7] = 0;
lu_size_of_system[8] = 0;
lu_size_of_system[9] = 0;
lu_size_of_system[10] = 0;
lu_size_of_system[11] = 0;
lu_size_of_system[12] = 0;
lu_size_of_system[13] = 1.8;
lu_size_of_system[14] = 1.8;
lu_size_of_system[15] = 1.8;
lu_size_of_system[16] = 2.16;
lu_size_of_system[17] = 2.16;
lu_size_of_system[18] = 2.16;
lu_size_of_system[19] = 2.52;
lu_size_of_system[20] = 2.52;
lu_size_of_system[21] = 3.24;
lu_size_of_system[22] = 3.24;
lu_size_of_system[23] = 3.24;
lu_size_of_system[24] = 3.24;
lu_size_of_system[25] = 3.24;
lu_size_of_system[26] = 3.6;
lu_size_of_system[27] = 3.6;
lu_size_of_system[28] = 3.6;
lu_size_of_system[29] = 3.6;
lu_size_of_system[30] = 3.6;
lu_size_of_system[31] = 3.6;
lu_size_of_system[32] = 3.96;
lu_size_of_system[33] = 3.96;
lu_size_of_system[34] = 3.96;
lu_size_of_system[35] = 3.96;
lu_size_of_system[36] = 3.96;
lu_size_of_system[37] = 3.96;
lu_size_of_system[38] = 3.96;
lu_size_of_system[39] = 3.96;
lu_size_of_system[40] = 3.96;
lu_size_of_system[41] = 3.96;
lu_size_of_system[42] = 3.96;
lu_size_of_system[43] = 3.96;
lu_size_of_system[44] = 3.96;
lu_size_of_system[45] = 3.96;
lu_size_of_system[46] = 3.96;
lu_size_of_system[47] = 3.96;
lu_size_of_system[48] = 3.96;
lu_size_of_system[49] = 3.96;
lu_size_of_system[50] = 3.96;
lu_size_of_system[51] = 3.96;
lu_size_of_system[52] = 3.96;
lu_size_of_system[53] = 3.96;
lu_size_of_system[54] = 3.96;
lu_size_of_system[55] = 3.96;
lu_size_of_system[56] = 3.96;
lu_size_of_system[57] = 3.96;
lu_size_of_system[58] = 3.96;
lu_size_of_system[59] = 3.96;
lu_size_of_system[60] = 3.96;
lu_size_of_system[61] = 3.96;
lu_size_of_system[62] = 3.96;
lu_size_of_system[63] = 3.96;
lu_size_of_system[64] = 3.96;
lu_size_of_system[65] = 3.96;
lu_size_of_system[66] = 3.96;
lu_size_of_system[67] = 3.96;
lu_size_of_system[68] = 3.96;
lu_size_of_system[69] = 3.96;
lu_size_of_system[70] = 3.96;
lu_size_of_system[71] = 3.96;
lu_size_of_system[72] = 3.96;
lu_size_of_system[73] = 3.96;
lu_size_of_system[74] = 3.96;
lu_size_of_system[75] = 3.96;
lu_size_of_system[76] = 3.96;
lu_size_of_system[77] = 3.96;
lu_size_of_system[78] = 3.96;
lu_size_of_system[79] = 3.96;
lu_size_of_system[80] = 3.96;
lu_size_of_system[81] = 3.96;
lu_size_of_system[82] = 3.96;
lu_size_of_system[83] = 3.96;
lu_size_of_system[84] = 3.96;
lu_size_of_system[85] = 3.96;
lu_size_of_system[86] = 3.96;
lu_size_of_system[87] = 3.96;
lu_size_of_system[88] = 3.96;
lu_size_of_system[89] = 3.96;
lu_size_of_system[90] = 3.96;
lu_size_of_system[91] = 3.96;
lu_size_of_system[92] = 3.96;
lu_size_of_system[93] = 3.96;
lu_size_of_system[94] = 3.96;
lu_size_of_system[95] = 3.96;
lu_size_of_system[96] = 3.96;
lu_size_of_system[97] = 3.96;
lu_size_of_system[98] = 3.96;
lu_size_of_system[99] = 3.96;
lu_size_of_system[100] = 3.96;
lu_size_of_system[101] = 3.96;
lu_size_of_system[102] = 3.96;
lu_size_of_system[103] = 3.96;
lu_size_of_system[104] = 3.96;
lu_size_of_system[105] = 3.96;
lu_size_of_system[106] = 3.96;
lu_size_of_system[107] = 3.96;
lu_size_of_system[108] = 3.96;
lu_size_of_system[109] = 3.96;
lu_size_of_system[110] = 3.96;
lu_size_of_system[111] = 3.96;
lu_size_of_system[112] = 3.96;
lu_size_of_system[113] = 3.96;
lu_size_of_system[114] = 3.96;
lu_size_of_system[115] = 3.96;
lu_size_of_system[116] = 3.96;
lu_size_of_system[117] = 3.96;
lu_size_of_system[118] = 3.96;
lu_size_of_system[119] = 3.96;
lu_size_of_system[120] = 3.96;
lu_size_of_system[121] = 3.96;
lu_size_of_system[122] = 3.96;
lu_size_of_system[123] = 3.96;
lu_size_of_system[124] = 3.96;
lu_size_of_system[125] = 3.96;
lu_size_of_system[126] = 3.96;
lu_size_of_system[127] = 3.96;
lu_size_of_system[128] = 3.96;
lu_size_of_system[129] = 3.96;
lu_size_of_system[130] = 3.96;
lu_size_of_system[131] = 3.96;
lu_size_of_system[132] = 3.96;
lu_size_of_system[133] = 3.96;
lu_size_of_system[134] = 3.96;
lu_size_of_system[135] = 3.96;
lu_size_of_system[136] = 3.96;
lu_size_of_system[137] = 3.96;
lu_size_of_system[138] = 3.96;
lu_size_of_system[139] = 3.96;
lu_size_of_system[140] = 3.96;
lu_size_of_system[141] = 3.96;
lu_size_of_system[142] = 3.96;
lu_size_of_system[143] = 3.96;
lu_size_of_system[144] = 3.96;
lu_size_of_system[145] = 3.96;
lu_size_of_system[146] = 3.96;
lu_size_of_system[147] = 3.96;
lu_size_of_system[148] = 3.96;

// SAP
var lu_SAP = new Array();

lu_SAP[0] = new Array();
lu_SAP[0][0] = 933;
lu_SAP[0][30] = 709;
lu_SAP[0][45] = 621;
lu_SAP[0][60] = 485;
lu_SAP[0][90] = 360;

lu_SAP[135] = new Array();
lu_SAP[135][0] = 933;
lu_SAP[135][30] = 997;
lu_SAP[135][45] = 968;
lu_SAP[135][60] = 900;
lu_SAP[135][90] = 684;

lu_SAP[180] = new Array();
lu_SAP[180][0] = 933;
lu_SAP[180][30] = 1042;
lu_SAP[180][45] = 1023;
lu_SAP[180][60] = 960;
lu_SAP[180][90] = 724;

lu_SAP[225] = new Array();
lu_SAP[225][0] = 933;
lu_SAP[225][30] = 997;
lu_SAP[225][45] = 968;
lu_SAP[225][60] = 900;
lu_SAP[225][90] = 684;

lu_SAP[270] = new Array();
lu_SAP[270][0] = 933;
lu_SAP[270][30] = 886;
lu_SAP[270][45] = 829;
lu_SAP[270][60] = 753;
lu_SAP[270][90] = 565;

lu_SAP[315] = new Array();
lu_SAP[315][0] = 933;
lu_SAP[315][30] = 762;
lu_SAP[315][45] = 666;
lu_SAP[315][60] = 580;
lu_SAP[315][90] = 427;

lu_SAP[45] = new Array();
lu_SAP[45][0] = 933;
lu_SAP[45][30] = 762;
lu_SAP[45][45] = 666;
lu_SAP[45][60] = 580;
lu_SAP[45][90] = 427;

lu_SAP[90] = new Array();
lu_SAP[90][0] = 933;
lu_SAP[90][30] = 886;
lu_SAP[90][45] = 829;
lu_SAP[90][60] = 753;
lu_SAP[90][90] = 565;

lu_SAP[270] = new Array();
lu_SAP[270][0] = 933;
lu_SAP[270][30] = 886;
lu_SAP[270][45] = 829;
lu_SAP[270][60] = 753;
lu_SAP[270][90] = 565;

// Cost of system
var lu_cost_of_system = new Array();

lu_cost_of_system[1.8] = 9999;
lu_cost_of_system[2.16] = 10999;
lu_cost_of_system[2.52] = 12382;
lu_cost_of_system[3.24] = 14999;
lu_cost_of_system[3.6] = 16500;
lu_cost_of_system[3.96] = 17295;

// Area of system
var lu_area_of_system = new Array();

lu_area_of_system[1.8] = 13;
lu_area_of_system[2.16] = 16;
lu_area_of_system[2.52] = 19;
lu_area_of_system[3.24] = 21;
lu_area_of_system[3.6] = 26;
lu_area_of_system[3.96] = 32;


// Annual Returns work array
var ann_ret = new Array();
var i = 0;

for (i=0;i<25;i++) {
  ann_ret[i] = new Array();
  ann_ret[i]['annual_elec_savings'] = 0;
  ann_ret[i]['annual_fit_income'] = 0;
  ann_ret[i]['annual_fit_export_income'] = 0;
  ann_ret[i]['net_benefit'] = 0;
  ann_ret[i]['cum_total'] = 0;

}

function getValue(itemid) {
	return getElement(itemid).value;
}

function getSelectValue(itemid) {
	return getElement(itemid).options[getElement(itemid).selectedIndex].value;
}

function setValue(itemid, value) {
	getElement(itemid).value = value;
}

function setSelectValue(itemid, value)
{
  var field = getElement(itemid);

  for(i=0;i<field.length;i++)
  {
    if(field.options[i].value==value)
    {
      field.selectedIndex=i
    }
  }


}

function setInnerHTML(itemid, value) {
	getElement(itemid).innerHTML = value;
}

function getElement(itemid) {
	var theElement;
	if (document.all) {
		eval("theElement = document.all."+itemid+";");
	}
	else {
		if (navigator.userAgent.indexOf("Gecko")!=-1) {// is NS6 ?
			theElement = document.getElementById(itemid);
		}
		else {
			eval("theElement = document.layers['"+itemid+"'];");
		}
	}
	return theElement;
}

function addCommas(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

function checkResult(result, short, commas)
{
	if (isNaN(result))
		if (!short) {
			return "* ERROR *";
                }
		else {
			return "ERR";
                }
	else {
                if (commas)
			return addCommas(result);
                else return result;
        }
}

function data_change(field,allowPoint)
{
	var check = true;
	var value = field.value; //get characters
	//check that all characters are digits, ., -, or ""
	for(var i=0;i < field.value.length; ++i)
	{
	   var new_key = value.charAt(i); //cycle through characters
	   if (!((new_key == ".") && allowPoint))
	   {
		   if(((new_key < "0") || (new_key > "9")) && 
				(new_key != ""))
		   {
				check = false;
				break;
		   }
	   }
	}
	//apply appropriate colour based on value
	if(!check)
	{
	   field.style.backgroundColor = "red";
	}
	else
	{
	   field.style.backgroundColor = "";
	}
}



// Returns estimated system size based on size of roof - size_of_roof should be an integer between 0 and 148
function get_estimated_system_size(size_of_roof)
{
  return lu_size_of_system[size_of_roof];
}

function set_defaults() {

  setSelectValue('orientation', 180);
  setSelectValue('tilt', 30);
  setValue('size_of_roof', 16);
  setSelectValue('estimated_system_size', 2.16);
  setValue('price_per_unit', 13.9);
  setValue('annual_elec_inflation', 9);
  setValue('export_amount', 50);
  setValue('fit_rate', 41.3);
  setValue('fit_export_rate', 3);
  setValue('inflation_rate', 3);

}


function calculate(estimatesize, estimatekwpa)
{
  var size_of_roof;
  size_of_roof = getValue('size_of_roof');

  if (size_of_roof < 14)
    alert('Roof size must be 14 metres squared or more to fit the smallest system.');

  if (size_of_roof > 50)
    size_of_roof = 50;

  var est_size_of_system;
  if (estimatesize)
  {
    est_size_of_system = get_estimated_system_size(size_of_roof);
    setSelectValue('estimated_system_size', est_size_of_system);
  }
  else
  {
    est_size_of_system = parseFloat(getSelectValue('estimated_system_size'));
  }

  setInnerHTML('size_of_system', checkResult(est_size_of_system,false,false));

  var orientation, tilt;
  orientation = getValue('orientation');
  tilt = getValue('tilt');

  var estimated_kwh_per_annum;
  estimated_kwh_per_annum = lu_SAP[orientation][tilt] * est_size_of_system * 0.8;
  setValue('estimated_kwh_per_annum', checkResult(estimated_kwh_per_annum.toFixed(0),false,false));
  data_change(getElement('estimated_kwh_per_annum'));

  var est_cost_of_system;
  est_cost_of_system = lu_cost_of_system[est_size_of_system];
  if (est_cost_of_system)
    setInnerHTML('est_cost_of_system', checkResult(est_cost_of_system.toFixed(0), false, true));

  var annual_elec_savings, price_per_unit, export_amount;
  price_per_unit = getValue('price_per_unit') / 100.0;
  export_amount = getValue('export_amount') / 100.0;
  
  annual_elec_savings = price_per_unit * estimated_kwh_per_annum * (1 - export_amount);
  setInnerHTML('annual_elec_savings', checkResult(annual_elec_savings.toFixed(2), false, true));

  var annual_fit_income, fit_rate;
  fit_rate = getValue('fit_rate') / 100.0;

  annual_fit_income = estimated_kwh_per_annum * fit_rate
  setInnerHTML('annual_fit_income', checkResult(annual_fit_income.toFixed(2), false, true));

  var annual_fit_export_income, fit_export_rate;
  fit_export_rate = getValue('fit_export_rate') / 100.0;

  annual_fit_export_income = estimated_kwh_per_annum * export_amount * fit_export_rate;
  setInnerHTML('annual_fit_export_income', checkResult(annual_fit_export_income.toFixed(2), false, true));

  var net_benefit_year1;
  net_benefit_year1 = annual_fit_export_income + annual_fit_income + annual_elec_savings;
  setInnerHTML('net_benefit_year1', checkResult(net_benefit_year1.toFixed(2), false, true));

  // Annual Returns calc
  var annual_elec_inflation, inflation_rate;
  annual_elec_inflation = getValue('annual_elec_inflation') / 100.0;
  inflation_rate = getValue('inflation_rate') / 100.0;

  // Setup array
  ann_ret[0]['annual_elec_savings'] = annual_elec_savings;
  ann_ret[0]['annual_fit_income'] = annual_fit_income;
  ann_ret[0]['annual_fit_export_income'] = annual_fit_export_income;
  ann_ret[0]['net_benefit'] = net_benefit_year1;
  ann_ret[0]['cum_total'] = net_benefit_year1;

  var i;
  var payback_period = 0;

  for (i=1;i<25;i++) {
    ann_ret[i]['annual_elec_savings'] = ann_ret[i-1]['annual_elec_savings'] * (1+annual_elec_inflation);
    ann_ret[i]['annual_fit_income'] = ann_ret[i-1]['annual_fit_income'] * (1+inflation_rate);
    ann_ret[i]['annual_fit_export_income'] = ann_ret[i-1]['annual_fit_export_income'];
    ann_ret[i]['net_benefit'] = ann_ret[i]['annual_elec_savings'] + ann_ret[i]['annual_fit_income'] + ann_ret[i]['annual_fit_export_income'];
    ann_ret[i]['cum_total'] = ann_ret[i-1]['cum_total'] + ann_ret[i]['net_benefit'];

    if (ann_ret[i]['cum_total'] > est_cost_of_system && payback_period == 0)
      payback_period = i + 1;

  }

  var net_profit;
  net_profit = ann_ret[24]['cum_total'] - est_cost_of_system;
  setInnerHTML('net_profit', checkResult(net_profit.toFixed(0), false, true));

  if (payback_period != 0)
    setInnerHTML('payback_period', checkResult(payback_period.toFixed(0), false, true));  
  else
    setInnerHTML('payback_period', '>25');  
  
  var area_of_panels;
  area_of_panels = lu_area_of_system[est_size_of_system];
  setInnerHTML('area_of_panels', checkResult(area_of_panels.toFixed(0), false, true));  

}


