// Copyright by Volker Quaschning, www.volker-quaschning.de

var Bezeichnung, Estrom, tBetrieb, tStart, tBau, Vreg, Sreg, Verh, tErh, KB, SB, VB, SV
var Kinv, Khilf, Kfremd, pfremd, tfremd, Keigen, StG, tg, Vsonst, Ssonst
var Sfuel, Kfuel, CO2fuel, eta, Afuel
var Win2, Win3
var EKCF = new Array();
var Jahr = new Array();

function ChangeVal() {
var x, PN

with (window.document.Parameter) {
x  = parseFloat(Kinv.value);
PN = parseFloat(PNenn.value);
if (PN>0) ha.value = Math.round(parseFloat(Estrom.value)/PN); else ha.value=0;
Keigen.value = parseFloat(Kinv.value) - parseFloat(Khilf.value) - parseFloat(Kfremd.value);
x = Kinv.value;
if (x>0) {
shilf.value  = Math.round(1000*parseFloat(Khilf.value)/x)/10;
sfremd.value = Math.round(1000*parseFloat(Kfremd.value)/x)/10;
seigen.value = Math.round(1000*parseFloat(Keigen.value)/x)/10;
}
else {
shilf.value=0;
sfremd.value=0;
seigen.value=0;
}
if(PN>0) Kspez.value = Math.round(x/PN);
}}

function set_values (v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,v17,v18,v19,v20,v21,v22,v23,v24,v25,v26,v27,v28,v29) {
with (window.document.Parameter) {
Bezeichnung.value = Vorauswahl.options[v1].text;
PNenn.value=v2;
Estrom.value=v3;
tBetrieb.value=v4;
tStart.value=v5;
tBau.value=v6;
Kinv.value=v7;
Khilf.value=v8;
Kfremd.value=v9;
pfremd.value=v10;
tfremd.value=v11;
Vreg.value=v12;
Sreg.value=v13;
Verh.value=v14;
tErh.value=v15;
KB.value=v16;
SB.value=v17;
VB.value=v18;
SV.value=v19;
StG.value=v20;
Vsonst.value=v21;
Ssonst.value=v22;
if (v23==0) IsVerg.checked=false; else IsVerg.checked=true;
Afuel.value=v24;
Fuel.options[v25].selected=true;
eta.value=v26;
Kfuel.value=v27;
Sfuel.value=v28;
CO2fuel.value=v29;
ChangeVal();
}}

function set_Fuel() {
with (window.document.Parameter) {
if (Fuel.options[1].selected==true) CO2fuel.value=0; // regenerativ
if (Fuel.options[2].selected==true) CO2fuel.value=0; // Biomasse regenerativ
if (Fuel.options[3].selected==true) CO2fuel.value=0.2; // Erdgas
if (Fuel.options[4].selected==true) CO2fuel.value=0.28; // Heizöl
if (Fuel.options[5].selected==true) CO2fuel.value=0.34; // Steinkohle
if (Fuel.options[6].selected==true) CO2fuel.value=0.36; // Braunkohle
}}

function set_Wahl() {
with (window.document.Parameter) {
if (Vorauswahl.options[0].selected==true) // Eigene Angaben
  Bezeichnung.value = "eigene Angaben";
if (Vorauswahl.options[1].selected==true) // 50 MW ST
  set_values(1,50000,100000000,20,2005,2,100000000,5000000,70000000,5,10,0.035,1,0.12,20,3200000,1,900000,1,28,0,1,1,0,1,35,0.02,1,0);
if (Vorauswahl.options[2].selected==true) // 5 kW PV D
  set_values(2,5,4750,30,2012,0,10000,0,5000,4,10,0.07,1,0.2443,20,150,1,100,1,28,0,1,0,0,1,35,0.02,1,0);
if (Vorauswahl.options[3].selected==true) // 5 kW PV E
  set_values(3,5,8000,30,2003,0,10000,0,0,5,10,0.035,1,0.36,20,150,1,100,1,28,0,1,1,0,1,35,0.02,1,0);
if (Vorauswahl.options[4].selected==true) // 10 MW Wind D
  set_values(4,10000,16000000,20,2003,0,12000000,0,7500000,5,10,0.035,1,0.089,20,160000,1,30000,1,28,0,1,0,0,1,35,0.02,1,0);
if (Vorauswahl.options[5].selected==true) // 10 MW Wind E
  set_values(5,10000,21500000,20,2003,0,11000000,0,7000000,5,10,0.035,1,0.062,20,150000,1,20000,1,28,0,1,0,0,1,35,0.02,1,0);
if (Vorauswahl.options[6].selected==true) // 20 MW Biomasse
  set_values(6,20000,100000000,20,2004,1,50000000,0,30000000,5,10,0.035,1,0.086,20,2300000,1,300000,1,28,2000000,1,0,100,2,35,0.01,1,0);
}}

function get_variables() {
Bezeichnung = window.document.Parameter.Bezeichnung.value;
Estrom   = parseFloat(window.document.Parameter.Estrom.value);
tBetrieb = parseFloat(window.document.Parameter.tBetrieb.value);
tStart   = parseFloat(window.document.Parameter.tStart.value);
tBau     = parseFloat(window.document.Parameter.tBau.value);
Vreg     = parseFloat(window.document.Parameter.Vreg.value);
Sreg     = parseFloat(window.document.Parameter.Sreg.value);
Verh     = parseFloat(window.document.Parameter.Verh.value);
tErh     = parseFloat(window.document.Parameter.tErh.value);
KB       = parseFloat(window.document.Parameter.KB.value);
SB       = parseFloat(window.document.Parameter.SB.value);
VB       = parseFloat(window.document.Parameter.VB.value);
SV       = parseFloat(window.document.Parameter.SV.value);
Kinv     = parseFloat(window.document.Parameter.Kinv.value);
Khilf    = parseFloat(window.document.Parameter.Khilf.value);
Kfremd   = parseFloat(window.document.Parameter.Kfremd.value);
pfremd   = parseFloat(window.document.Parameter.pfremd.value);
tfremd   = parseFloat(window.document.Parameter.tfremd.value);
Keigen   = parseFloat(window.document.Parameter.Keigen.value);
StG      = parseFloat(window.document.Parameter.StG.value);
Vsonst   = parseFloat(window.document.Parameter.Vsonst.value);
Ssonst   = parseFloat(window.document.Parameter.Ssonst.value);
Afuel    = parseFloat(window.document.Parameter.Afuel.value);
Kfuel    = parseFloat(window.document.Parameter.Kfuel.value);
Sfuel    = parseFloat(window.document.Parameter.Sfuel.value);
CO2fuel  = parseFloat(window.document.Parameter.CO2fuel.value);
eta      = parseFloat(window.document.Parameter.eta.value);
}

function writetd(text,c,a) {
with (Win2.document) {
write("<td ");
if (a==0 || a==10) write("align=LEFT "); else write("align=RIGHT ");
if (a>=10) write("class=tbd ");
write("nowrap bgcolor=");
if (c==0 || c==10) write("white>");
if (c==1 || c==11) write("darkgreen>");
if (c==2 || c==12) write("#E0FFBB>");
if (c==3 || c==13) write("#eeeedd>");
if (c==4 || c==14) write("#E1E2E3>");
if (c>=10) write("<b>");
if (c==1 || c==11) write("<font color=white>");
write(text);
if (c>10) write("</b>");
write("</td>");}
}

function CalcIRR() {
var counter, IterationDirection, IRRNPV, IRREq, dIRRNPV, IRRAccuracy;
counter = 0;
IterationDirection = 0;
IRRNPV = 0;
IRREq = 0.1;

for (i=0; i<tg; i++) IRRNPV += EKCF[i]/Math.pow(1+IRREq,(Jahr[i]-Jahr[0]));
dIRRNPV = 0.05;
IRRAccuracy = 0.1;
while ((Math.abs(IRRNPV) > IRRAccuracy) && (counter<100)) {
counter ++;
IRRNPV = 0;
for (i=0; i<tg; i++) IRRNPV += EKCF[i]/Math.pow(1+IRREq,(Jahr[i]-Jahr[0]));
if (IRRNPV < 0) {
if (IterationDirection == 1) dIRRNPV = dIRRNPV /2;
IRREq = IRREq - dIRRNPV;
if (Math.abs(1+IRREq)<0.00001) IRREq = IRREq - 0.0001; // avoid power exception
IterationDirection = -1;
}
else {
if (IterationDirection == -1) dIRRNPV = dIRRNPV /2;
IRREq = IRREq + dIRRNPV;
if (Math.abs(1+IRREq)<0.00001) IRREq = IRREq + 0.0001; // avoid power exception
IterationDirection = 1;
}
}
return (IRREq);
}


function Cashflow() {
var i, minADSCR, IRR, BauZero;
var Schulden, Tilgung, Zins, Steuer, ES, EBfuel
Vges = new Array();
Estr = new Array();
Eges = new Array();
Lges = new Array();
VCF  = new Array();
NCF  = new Array();
Schulden = new Array();
ADSCR = new Array();

get_variables();
BauZero=0;
if (tBau<=0) {tBau=1; BauZero=1;}
tg = tBetrieb+tBau;

Win2 = open("","_blank","scrollbars=yes,status=yes,resizable=yes,height=640");
Win3 = open("","_blank","scrollbars=no,status=no,resizable=no,height=40,width=200");

with (Win2.document) {

Win3.document.write('<html><head><title>Bitte warten...</title></head><body bgcolor=#FED8D4><h3><font face=arial color=darkred><center>Bitte warten...</center></font></h3><font face=arial color=darkred>o</font>');

writeln("<html><head><link rel=stylesheet href=../../styles.css type=text/css>");
writeln("<STYLE TYPE=text/css>");
writeln("<!--");
writeln(".hinweis {font-size:7pt; text-align:justify; color:darkred;}");
writeln("u.hinweis {font-size:7pt; text-align:justify; color:darkred; font-weight:bold;}");
writeln(".tbd {border-bottom:1px solid darkgreen;}");
writeln("-->");
writeln("</STYLE>");
writeln("<SCRIPT LANGUAGE=JavaScript> <!--\n"+
"if (document.images) {image1on =  new Image(); "+
"image1on.src =\"../../pics/close2.gif\"; image1sts = \"Fenster schließen\";\n"+
"image2on =  new Image(); image2on.src =\"../../pics/drucken2.gif\";"+
"image2sts = \"Drucken\"; image1off = new Image();"+
"image1off.src = \"../../pics/close1.gif\"; image2off = new Image();"+
"image2off.src = \"../../pics/drucken1.gif\"; }\n"+
"function turnOn(imageName) { if (document.images) {"+
"document[imageName].src = eval(imageName + \"on.src\");"+
"window.status = eval(imageName + \"sts\");}}\n"+
"function turnOff(imageName) { if (document.images) {"+
"document[imageName].src = eval(imageName + \"off.src\"); window.status = \"\";"+
"}}\n //-"+"->\n</SCRIPT>");
writeln("<title>Betriebsdaten und Cashflow: "+Bezeichnung+"</title></head><body>");
writeln("<img src=cashflow.jpg>");
writeln ("<a href=\"javascript:self.close()\" "+
"onmouseover=\"turnOn('image1'); return true\" onmouseout=\""+
"turnOff('image1'); return true\"><img src=\"../../pics/close1.gif\" "+
"border=0 width=34 height=34 alt=\"Fenster schließen\" name=\"image1\"></a>");
writeln("<div class=tit>"+Bezeichnung+"</div>");
writeln("<table cellpadding=2,1) border=0 cellspacing=0 width="+(tg*80+250)+"><tr>");
writetd("Phase",11,0);
for (i=1; i<=tBau; i++) writetd ("Bau",1,1);
for (i=1; i<=tBetrieb; i++) writetd ("Betrieb",1,1);

Win3.document.write('<font face=arial color=darkred>o</font>');

writeln ("</tr><tr>");
writetd ("Jahr",11,0);
for (i=1; i<=tBau; i++) writetd (i,1,1);
for (i=1; i<=tBetrieb; i++) writetd (i,1,1);

writeln ("</tr><tr>");
writetd ("Kalenderjahr",11,0);
for (i=0; i<tg; i++)
  if ((BauZero==1)&&(i==0)) Jahr[i]=i+tStart; else Jahr[i]=i+tStart-tBau;
for (i=0; i<tg; i++)
  writetd(Jahr[i],1,1);

Win3.document.write('<font face=arial color=darkred>o</font>');

writeln ("</tr><tr>");
writetd ("<u>BETRIEBSDATEN:</u>",3,0);
for (i=0; i<tg; i++) writetd("&nbsp",3,1);

writeln ("</tr><tr>");
writetd ("Brennstoffbedarf in MWh",13,0);
for (i=1; i<=tBau; i++) writetd ("&nbsp",3,1);
if (eta>0) EBfuel=Estrom*Afuel/eta; else EBfuel=Estrom;
for (i=0; i<tBetrieb; i++) writetd (Math.round(EBfuel/1000),3,1);

Win3.document.write('<font face=arial color=darkred>o</font>');

writeln ("</tr><tr>");
writetd ("Stromerzeugung in MWh",13,0);
for (i=1; i<=tBau; i++) writetd ("&nbsp",3,1);
for (i=0; i<tBetrieb; i++) writetd (Math.round(Estrom/100)/10,3,1);

writeln ("</tr><tr>");
writetd ("reguläre Vergütung in &euro;/kWh",13,0);
for (i=1; i<=tBau; i++) { writetd ("&nbsp;",3,1); Vges[i-1]=0;}
for (i=0; i<tBetrieb; i++)
{ if ((window.document.Parameter.IsVerg.checked)||(i>=tErh))
  { writetd ((Math.round(Vreg*1000)/1000),3,1);
    Vges[i+tBau]=Vreg;
  }
  else { writetd (0,3,1); Vges[i+tBau]=0; }
  Vreg = Vreg*(1+Sreg/100);
}

Win3.document.write('<font face=arial color=darkred>o</font>');

writeln ("</tr><tr>");
writetd ("erhöhte Vergütung in &euro;/kWh",13,0);
for (i=1; i<=tBau; i++) writetd ("&nbsp;",3,1);
for (i=0; i<tBetrieb; i++)
{ if (i<tErh) { writetd (Verh,3,1); Vges[i+tBau]+=Verh; } else writetd ("0",3,1);
}

writeln ("</tr><tr>");
writetd ("Gesamtvergütung in &euro;/kWh",12,10);
for (i=0; i<tg; i++) if (i>=tBau) writetd((Math.round(Vges[i]*1000)/1000),2,11); else writetd("&nbsp;",2,11);

writeln ("</tr><tr>");
writetd ("<u>ERLÖSE:</u>",3,0);
for (i=0; i<tg; i++) writetd("&nbsp",3,1);

Win3.document.write('<font face=arial color=darkred>o</font>');

writeln ("</tr><tr>");
writetd ("Stromerlöse in &euro;",13,0);
for (i=0; i<tg; i++) {
Estr[i]=Vges[i]*Estrom;
Eges[i]=Estr[i];
if (i>=tBau) writetd((Math.round(Estr[i])),3,1); else writetd("&nbsp;",3,1);
}

writeln ("</tr><tr>");
writetd ("Sonstige Erlöse in &euro;",13,0);
ES = Vsonst;
for (i=0; i<tg; i++) {
if (i>tBau) ES=ES*(1+Ssonst/100);
Eges[i]+=ES;
if (i>=tBau) writetd((Math.round(ES)),3,1); else writetd("&nbsp;",3,1);
}

writeln ("</tr><tr>");
writetd ("Gesamterlöse in &euro;",12,10);
for (i=0; i<tg; i++) {
if (i>=tBau) writetd((Math.round(Eges[i])),2,11); else writetd("&nbsp;",2,11);
}

Win3.document.write('<font face=arial color=darkred>o</font>');

writeln ("</tr><tr>");
writetd ("<u>LAUFENDE KOSTEN:</u>",3,0);
for (i=0; i<tg; i++) writetd("&nbsp",3,1);

Kfuel=Kfuel*EBfuel;
writeln ("</tr><tr>");
writetd ("Brennstoffkosten in &euro;",13,0);
for (i=1; i<=tBau; i++) {writetd ("&nbsp;",3,1); Lges[i-1]=0 }
for (i=0; i<tBetrieb; i++)
{ Lges[i+tBau]=Kfuel;
  writetd ((Math.round(Kfuel)),3,1);
  Kfuel = Kfuel*(1+Sfuel/100);
}

writeln ("</tr><tr>");
writetd ("Betriebskosten in &euro;",13,0);
for (i=1; i<=tBau; i++) writetd ("&nbsp;",3,1);
for (i=0; i<tBetrieb; i++)
{ Lges[i+tBau]+=KB;
  writetd ((Math.round(KB)),3,1);
  KB = KB * (1+SB/100);
}

Win3.document.write('<font face=arial color=darkred>o</font>');

writeln ("</tr><tr>");
writetd ("Versicherungskosten in &euro;",13,0);
for (i=1; i<=tBau; i++) {writetd ("&nbsp;",3,1);}
for (i=0; i<tBetrieb; i++)
{ Lges[i+tBau]+=VB;
  writetd ((Math.round(VB)),3,1);
  VB = VB *(1+SV/100);
}

writeln ("</tr><tr>");
writetd ("Gesamte laufende Kosten in &euro;/kWh",12,10);
for (i=0; i<tg; i++) if (i>=tBau) writetd((Math.round(Lges[i])),2,11); else writetd("&nbsp;",2,11);

Win3.document.write('<font face=arial color=darkred>o</font>');

writeln ("</tr><tr>");
writetd ("Investitionskosten in &euro;",13,0);
for (i=1; i<=tBau; i++)
{ writetd ((Math.round(Kinv/tBau)),3,1);
}
for (i=0; i<tBetrieb; i++) {writetd ("&nbsp;",3,1);}

writeln ("</tr><tr>");
writetd ("Vor-Finanzierungs-Cashflow in &euro;",14,10);
for (i=1; i<=tBau; i++) {
VCF[i-1]=Kinv/tBau;
writetd ((-Math.round(VCF[i-1])),4,11);
}
for (i=0; i<tBetrieb; i++) {
VCF[i+tBau]=Eges[i+tBau]-Lges[i+tBau];
writetd ((Math.round(VCF[i+tBau])),4,11);}

Win3.document.write('<font face=arial color=darkred>o</font>');

writeln ("</tr><tr>");
writetd ("<u>FINANZIERUNG:</u>",3,0);
for (i=0; i<tg; i++) writetd("&nbsp",3,1);

writeln ("</tr><tr>");
writetd ("Beihilfen in &euro;",13,0);
for (i=1; i<=tBau; i++)
{ writetd ((Math.round(Khilf/tBau)),3,1);
}
for (i=0; i<tBetrieb; i++) {writetd ("&nbsp;",3,1);}

Win3.document.write('<font face=arial color=darkred>o</font>');

writeln ("</tr><tr>");
writetd ("Eigenkapital in &euro;",13,0);
for (i=1; i<=tBau; i++)
{ writetd ((Math.round(Keigen/tBau)),3,1);
}
for (i=0; i<tBetrieb; i++) {writetd ("&nbsp;",3,1);}

Win3.document.write('<font face=arial color=darkred>o</font>');

writeln ("</tr><tr>");
writetd ("Kredite in &euro;",13,0);
Schulden = 0;
for (i=1; i<=tBau; i++)
{ writetd ((Math.round(Kfremd/tBau)),3,1);
  Schulden = Schulden*(1+pfremd/100) + Kfremd/tBau;
}
if (Schulden==0) Schulden = Kfremd;
for (i=0; i<tBetrieb; i++) {writetd ("&nbsp;",3,1);}

if (tfremd>0) Tilgung=Schulden/tfremd; else Tilgung=0;
writeln ("</tr><tr>");
writetd ("Tilgung in &euro;",13,0);
for (i=1; i<=tBau; i++)
{ writetd ("&nbsp;",3,1);
}
for (i=0; i<tBetrieb; i++)
if (i<tfremd) writetd (Math.round(Tilgung),3,1); else writetd ("&nbsp;",3,1);

Win3.document.write('<font face=arial color=darkred>o</font>');

writeln ("</tr><tr>");
writetd ("Zinsen in &euro;",13,0);
for (i=1; i<=tBau; i++) {
NCF[i-1]=0;
ADSCR[i-1]=0;
writetd ("&nbsp;",3,1);
}
for (i=0; i<tBetrieb; i++) {
if (i<tfremd) {
Zins=Schulden*pfremd/100;
Schulden-=Tilgung;
NCF[i+tBau]=VCF[i+tBau]-Tilgung-Zins;
ADSCR[i+tBau]=Tilgung+Zins;
writetd (Math.round(Zins),3,1);
}
else {
NCF[i+tBau]=VCF[i+tBau];
writetd ("&nbsp;",3,1);}
}

Win3.document.write('<font face=arial color=darkred>o</font>');

writeln ("</tr><tr>");
writetd ("Nach-Finanzierungs-Cashflow in &euro;",14,10);
for (i=0; i<tg; i++) writetd(Math.round(NCF[i]),4,11);

Win3.document.write('<font face=arial color=darkred>o</font>');

writeln ("</tr><tr>");
writetd ("Steuern in &euro;",13,0);
for (i=1; i<=tBau; i++) {
EKCF[i-1]=-Keigen/tBau;
writetd ("0",3,1);
}
minADSCR=1000;
for (i=0; i<tBetrieb; i++) {
if (NCF[i+tBau]>0) Steuer=NCF[i+tBau]*StG/100; else Steuer=0;
EKCF[i+tBau]=NCF[i+tBau]-Steuer;
if (i<tfremd) {
if(ADSCR[i+tBau]>0) ADSCR[i+tBau] = (VCF[i+tBau]-Steuer)/ADSCR[i+tBau];
if (ADSCR[i+tBau]<minADSCR) minADSCR = ADSCR[i+tBau];
}
else ADSCR[i+tBau]=0;
writetd (Math.round(Steuer),3,1);}

Win3.document.write('<font face=arial color=darkred>o</font>');

writeln ("</tr><tr>");
writetd ("Eigenkapitalfluss in &euro;",14,10);
for (i=0; i<tg; i++) writetd(Math.round(EKCF[i]),4,11);

writeln ("</tr><tr>");
writetd ("<u>KENNWERTE:</u>",3,0);
for (i=0; i<tg; i++) writetd("&nbsp;",3,1);

Win3.document.write('<font face=arial color=darkred>o</font>');

writeln ("</tr><tr>");
writetd ("ADSCR",13,0);
Schulden = 0;
for (i=1; i<=tBau; i++) if (i<=1) writetd ("&nbsp;",3,1); else writetd ("&nbsp;",3,11);
for (i=0; i<tBetrieb; i++) {
if(i<tfremd) writetd (Math.round(1000*ADSCR[i+tBau])/1000,3,11); else writetd ("&nbsp;",3,11);
}

Win3.document.write('<font face=arial color=darkred>o</font>');

writeln ("</tr><tr>");
writetd ("minimaler ADSCR",13,0);
writetd (Math.round(1000*minADSCR)/1000,3,0);
for (i=0; i<tg-1; i++) writetd ("&nbsp",0,0);

IRR = CalcIRR();

writeln ("</tr><tr>");
writetd ("Interner Zinsfuß",13,10);
writetd ((Math.round(1000*IRR)/10)+" %",3,10);
for (i=0; i<tg-1; i++) writetd ("&nbsp",0,0);

Win3.document.write('<font face=arial color=darkred>o</font>');

write("<br></tr></table><br>");

write("<div class=small>&copy; 2003 by Volker Quaschning</div>");

write ("<table width=90%><tr><td><hr size=1 color=darkgreen>");
write ("<div class=hinweis><u class=hinweis>Wichtiger Hinweis:</u>");
write (" Sämtliche Eingabeparameter dieser Cashflow-Analyse sind mit einer gewissen Unsicherheit behaftet. Die Werte realer Projekte können daher von diesen Berechnungen erheblich abweichen. Die Berechnungsalgorithmen wurden sorgfältig umgesetzt, doch können Fehler nie vollständig ausgeschlossen werden. Sämtliche Angaben und Berechnungen erfolgen ohne Gewähr.</div><hr size=1 color=darkgreen>");
write ("</td></tr></table>");
write("</body></html>");

Win3.close();
}
}
