function portfolio_berechnen()
{
    //zinsstaffel löschen
zeile_loeschen('tabelle_staffel','alle');
variablen_zuruecksetzen();

if (portfolio_angaben_einlesen()!="err"){
}else{alert("Ein Fehler ist aufgetreten, die Berechnung wird abgebrochen");return;}

bewegungen_zusammenstellen();
//Bewegungen zusammen ausdrucken
var datum_probe =new Date();
for (i=0;i<bewegungen_zusammen[0].length;i++){
    datum_probe.setTime(bewegungen_zusammen[0][i]);
    //alert (datum_probe.getDate()+"."+datum_probe.getMonth()+"."+datum_probe.getFullYear()+ " " +bewegungen_zusammen[1][i]+ " " +bewegungen_zusammen[2][i]+ " " +bewegungen_zusammen[3][i]);
}

portfolio_zinssatz_berechnen();
//ergebnis ausdrucken
zeile_loeschen('tabelle_staffel','alle');
var staffelzeile=new Array(7);
var summe_soll=0;
var summe_haben=0;



for (k=0;k<g_variablen_ergebnis[0].length;k++){
    staffelzeile[0]=millisec_to_datastring(g_variablen_ergebnis[0][k]);
    //for (j=1;j < 5;j++){
    //soll und haben vertauscht wegen der Anzeige
       staffelzeile[1]= format_double_to_string(g_variablen_ergebnis[2][k],2);
       staffelzeile[2]= format_double_to_string(g_variablen_ergebnis[1][k],2);
       staffelzeile[3]= format_double_to_string(g_variablen_ergebnis[3][k],2);
       staffelzeile[4]= g_variablen_ergebnis[4][k];
    //}
    //letzte Zeile eins hochstellen, zeiel letzte Zeile +1 nicht mehr schreiben - sieht besser aus
    if (k<g_variablen_ergebnis[0].length){
        if(g_variablen_ergebnis[5][k+1]==undefined){staffelzeile[5]="";}
        staffelzeile[5]= g_variablen_ergebnis[5][k+1];
        staffelzeile[6]= format_double_to_string(g_variablen_ergebnis[6][k+1],3);
        staffelzeile[7]= format_double_to_string(g_variablen_ergebnis[7][k+1],2);
        //damit am Ende keine Ausgabe mehr erfolgt
        if(g_variablen_ergebnis[5][k+1]==undefined){staffelzeile[5]="-";}
        if(g_variablen_ergebnis[6][k+1]==undefined){staffelzeile[6]="-";}
        if(g_variablen_ergebnis[7][k+1]==undefined){staffelzeile[7]="-";}
    }
    //nicht alle anzeigen----------------------------------------------   
    if ((g_variablen_ergebnis[0][k] > g_variablen_periodenbeginn)||(g_variablen_ergebnis[0][k] == g_variablen_periodenbeginn && bewegungen_zusammen[2][k]==0)){  //wenn die Art "Bewegung" ist, dann anzeigen"
        //für die endummen
        summe_soll=Number(summe_soll)+Number(g_variablen_ergebnis[2][k]);
        summe_haben=Number(summe_haben)+Number(g_variablen_ergebnis[1][k]);
        //if (g_variablen_ergebnis[0][k] <= g_variablen_periodenende){
        staffel_schreiben('tabelle_staffel',staffelzeile);
    }

}

 //Summen bilden
            saldo_bewegungen=0;
            saldo_soll=0;
            saldo_haben=0;
            saldo_saldo=0;
            saldo_zinsen=0;
            zahl="";
            document.getElementById('tab_ergebnis_summe_saldo').innerHTML=staffelzeile[3];
            document.getElementById('tab_ergebnis_summe_soll').innerHTML=format_double_to_string(summe_soll,2);
            document.getElementById('tab_ergebnis_summe_haben').innerHTML=format_double_to_string(summe_haben,2);

/*
            jLabel_saldo_zahl.setText(formatierung.format_double_to_string(saldo_bewegungen,2));
            for (i=0;i<jTable_staffel.getRowCount();i++){
                if(jTable_staffel.getModel().getValueAt(i,1)!=null){
                    zahl=jTable_staffel.getModel().getValueAt(i,1).toString();
                    saldo_soll=saldo_soll+eigene_funktionen.string_mit_tausenderpunkt_als_double(zahl);}
                if(jTable_staffel.getModel().getValueAt(i,2)!=null){
                    zahl=jTable_staffel.getModel().getValueAt(i,2).toString();
                    saldo_haben=saldo_haben+eigene_funktionen.string_mit_tausenderpunkt_als_double(zahl);}
                if(jTable_staffel.getModel().getValueAt(i,7)!=null){
                    zahl=jTable_staffel.getModel().getValueAt(i,7).toString();
                    saldo_zinsen=saldo_zinsen+eigene_funktionen.string_mit_tausenderpunkt_als_double(zahl);}
            }

            jLabel_summen_zinsen.setText(formatierung.format_double_to_string(saldo_zinsen,2));
            jLabel_summen_soll.setText(formatierung.double_als_waehrungsstring(saldo_soll));
            jLabel_summen_haben.setText(formatierung.double_als_waehrungsstring(saldo_haben));
            //dez 2008 zinsensumme herausgenommen, da irritierend wg. teilweise kumulierter zinsen (z. B. bei Zinsänderungen)
            jLabel_summen_saldo.setText(formatierung.double_als_waehrungsstring(g_variablen.endsaldo));




*/
}

function portfolio_angaben_einlesen()
	{
//Daten einlesen und bereinigen-----------------------------------------------------------------------------
var err="OK"
zinsaenderungen_haben[0][0]=stringdate_to_millisec("31.12.1900");
zinsaenderungen_haben[1][0]=0;
zinsaenderungen_haben[2][0]=3;

zinsaenderungen_soll[0][0]=zinsaenderungen_haben[0][0];
zinsaenderungen_soll[1][0]=0;
zinsaenderungen_soll[2][0]=2;

var bewegungen_=werte_aus_tabellen_in_array_schreiben('tabelle_bewegungen');
if (bewegungen_.length==0){err="fehler";return err;}
for(i=0;i<bewegungen_.length;i++){
    split_string=bewegungen_[i].split("#");
    bewegungen[0][i]=split_string[0];
    bewegungen[1][i]=split_string[1];
    bewegungen[2][i]=split_string[2];
}
if(document.getElementById('text_datum_abschluss').value==""){		//Datum der letzten Bewegung auslesen-------
	document.getElementById('text_datum_abschluss').value=bewegungen[0][bewegungen[0].length-1];
}
g_variablen_periodenende=stringdate_to_millisec(document.getElementById('text_datum_abschluss').value)+Number(10);
array_sortiert_in_tabelle_schreiben(bewegungen, 'tabelle_bewegungen');     //sind global definiert und werden in der funktion neu geordnet
g_variablen_periodenbeginn=Number(bewegungen[0][0]);        //sind bereits millisec durch funktion vorher - 10 Sekunden dazu, damit, wenn Abschuß gleich letzter Bewegung ist, noch der Abschluß dazugenommen wird

//kapitalisierung
if (document.getElementById('kapitalisierung_monatlich').checked==true){kapitalisierungszeitraum='M';}
if (document.getElementById('kapitalisierung_vierteljaehrlich').checked==true){kapitalisierungszeitraum='V';}
if (document.getElementById('kapitalisierung_halbjaehrlich').checked==true){kapitalisierungszeitraum='H';}
if (document.getElementById('kapitalisierung_jaehrlich').checked==true){kapitalisierungszeitraum='J';}
if (document.getElementById('kapitalisierung_keine').checked==true){kapitalisierungszeitraum='K';}

if (document.getElementById('option_tageberechnung_jahr_kalendermaessig').checked==true){tageberechnung_jahr='365';}
if (document.getElementById('option_tageberechnung_jahr_360').checked==true){tageberechnung_jahr='360';}

if (document.getElementById('option_tageberechnung_monat_kalendermaessig').checked==true){tageberechnung_monat='31';}
if (document.getElementById('option_tageberechnung_monat_30').checked==true){tageberechnung_monat='30';}

abschlusstag_verzinsen=false;
//if (document.getElementById('checkbox_abschlusstag_verzinsen').checked==true){g_variablen_abschlusstag_verzinsen=true;}
return err;
}

function bewegungen_zusammenstellen(){
    kapitalisierungstermine_berechnen();
    //bewegungen zusammenfassen und sortieren----------------------------
    //wenn periodenende nicht gleich der letzten Bewegung ist, dann eine Bewegung "Abschluß dazunehmen"
    if (g_variablen_periodenende!=bewegungen[0][bewegungen[0].length-1]){
        anzahl_bewegungen_kapitalisierungen=Number(1)+ Number(bewegungen[0].length) + Number(zinsaenderungen_soll[0].length)+Number(zinsaenderungen_haben[0].length)+Number(kapitalisierung[0].length);
    }else {
        anzahl_bewegungen_kapitalisierungen=Number(bewegungen[0].length) + Number(zinsaenderungen_soll[0].length)+Number(zinsaenderungen_haben[0].length)+Number(kapitalisierung[0].length);
    }
    j=0;
    i=0;
    for (i=0; i< zinsaenderungen_soll[0].length;i++){      //die Soll_zinssatzänderungen
        bewegungen_zusammen[0][j]=zinsaenderungen_soll[0][i];
        bewegungen_zusammen[1][j]=zinsaenderungen_soll[1][i];
        bewegungen_zusammen[2][j]=2;     //Code für zinsaenderung soll
        bewegungen_zusammen[3][j]="Zinsänderung Soll";     //keine Bedeutung
        j++;
    }
    for (i=0; i< zinsaenderungen_haben[0].length;i++){      //die haben_zinssatzänderungen
        bewegungen_zusammen[0][j]=zinsaenderungen_haben[0][i];
        bewegungen_zusammen[1][j]=zinsaenderungen_haben[1][i];
        bewegungen_zusammen[2][j]=3;     //Code für zinsaenderung haben
        bewegungen_zusammen[3][j]="Zinsänderung Haben";     //keine Bedeutung
        j++;
    }
    for (i=0; i< kapitalisierung[0].length;i++){      //die Kapitalisierungen
        bewegungen_zusammen[0][j]=kapitalisierung[0][i];
        bewegungen_zusammen[1][j]=kapitalisierung[1][i];
        bewegungen_zusammen[2][j]=1;     //Code für zinsaenderung kapitalisierung
        bewegungen_zusammen[3][j]="Kapitalisierung";     //keine Bedeutung
        j++;
    }

    for (i=0; i< bewegungen[0].length;i++){      //die Bewegungen
        bewegungen_zusammen[0][j]=bewegungen[0][i];
        bewegungen_zusammen[1][j]=bewegungen[1][i];
        bewegungen_zusammen[2][j]=0;     //Code für Bewegung
        if(bewegungen[2][i]==""){bewegungen_zusammen[3][j]="Bewegung";}
        else{bewegungen_zusammen[3][j]=bewegungen[2][i];}
        j++;
    }

    //wenn periodenende nicht gleich der letzten Bewegung ist, dann eine Bewegung "Abschluß dazunehmen"
        //if (g_variablen_periodenende!=bewegungen[0][bewegungen[0].length-1]){
        bewegungen_zusammen[0][j]=Number(10)+Number(g_variablen_periodenende);
        bewegungen_zusammen[1][j]=0;  //  0 Keine Bedeutung
        bewegungen_zusammen[2][j]=4;    // Code Zeichen für "Abschluß"
        bewegungen_zusammen[3][j]=0;    //
        j++;
        //}
    //Bewegungen sortieren-------------------------------------------------------------
        hilf=0;hilf_1=0; hilf_2=0;
        for(i=0;i<bewegungen_zusammen[0].length;i++) {
        for(j=i+1;j < bewegungen_zusammen[0].length;j++) {
        if(bewegungen_zusammen[0][i]>bewegungen_zusammen[0][j]) {
        hilf=bewegungen_zusammen[0][j]; hilf_2=bewegungen_zusammen[2][j];hilf_1=bewegungen_zusammen[1][j];hilf_3=bewegungen_zusammen[3][j];
        bewegungen_zusammen[0][j]=bewegungen_zusammen[0][i];
        bewegungen_zusammen[1][j]=bewegungen_zusammen[1][i];
        bewegungen_zusammen[2][j]=bewegungen_zusammen[2][i];
        bewegungen_zusammen[3][j]=bewegungen_zusammen[3][i];
        
        bewegungen_zusammen[0][i]=hilf; bewegungen_zusammen[1][i]=hilf_1; bewegungen_zusammen[2][i]=hilf_2;bewegungen_zusammen[3][i]=hilf_3;
        }
        }
        }
        //Kontrolle----------------------------------------
        
        //alert("anzahl beweigungen"+bewegungen_zusammen[0].length+" " +anzahl_bewegungen_kapitalisierungen);
        for (i=0;i<bewegungen_zusammen[0].length;i++){
            kontrolldatum=new Date();
            kontrolldatum.setTime(bewegungen_zusammen[0][i]);

            k_jahr=kontrolldatum.getFullYear();
            k_monat=kontrolldatum.getMonth()+1;
            k_tag=kontrolldatum.getDate();
            k_stunden=kontrolldatum.getHours();
            datum = k_tag + "." + k_monat+ "." + k_jahr+"stunde=  "+k_stunden;
            //alert("Kontrolle sortierte Bewegungen "  + datum + " Kapital " + bewegungen_zusammen[1][i]+" " + bewegungen_zusammen[2][i]);
        }

}

function kapitalisierungstermine_berechnen(){
    //kapitalisierungsdaten ermitteln----------------------------------------------------------------------------
    jahr=0;
    monat=0;
    tag=0;

    zw_sp_datum =new Date();
    zw_sp_datum.setHours(0, 0, 0, 0);
    k_datum=new Date();
    k_datum.setHours(0,0,0,0);
    zw_sp_datum.setTime(g_variablen_periodenbeginn)
    jahr=zw_sp_datum.getFullYear();
    monat=zw_sp_datum.getMonth()+Number(1);
    tag=zw_sp_datum.getDate();
    zeit_in_millisec=0;
    kapitalisierung_zaehler=0;
    switch (kapitalisierungszeitraum){
            case 'M':
                do {
                zeit_objekt=Tag_Ende_Monat(zw_sp_datum.getFullYear(),zw_sp_datum.getMonth());       //zurückgabe ist time in millisec
                k_datum.setTime(zeit_objekt);
                kapitalisierung[0][kapitalisierung_zaehler]=zeit_objekt;
                kapitalisierung[1][kapitalisierung_zaehler]=0;              //nicht wichtig
                kapitalisierung[2][kapitalisierung_zaehler]=1;              //Schlüssel für die Kapitalisierung
                zw_sp_datum.setFullYear(k_datum.getFullYear(),k_datum.getMonth(),k_datum.getDate()+1);
                zeit_in_millisec=zw_sp_datum.getTime();
                kapitalisierung_zaehler++                   //index weiterzählen
                } while (zeit_in_millisec < g_variablen_periodenende); //(Zinsende > DateAdd("d", -1, Zw_Sp_Datum)
                break;
            case 'V':
                do {
                zeit_objekt=naechstes_Quartal(zw_sp_datum.getFullYear(),zw_sp_datum.getMonth());
                k_datum.setTime(zeit_objekt);
                kapitalisierung[0][kapitalisierung_zaehler]=zeit_objekt;
                kapitalisierung[1][kapitalisierung_zaehler]=0;              //nicht wichtig
                kapitalisierung[2][kapitalisierung_zaehler]=1;              //Schlüssel für die Kapitalisierung
                zw_sp_datum.setFullYear(k_datum.getFullYear(),k_datum.getMonth(),k_datum.getDate()+1);
                zeit_in_millisec=zw_sp_datum.getTime();
                kapitalisierung_zaehler++                   //index weiterzählen
                } while (zeit_in_millisec < g_variablen_periodenende); //(Zinsende > DateAdd("d", -1, Zw_Sp_Datum)
                break;
            case 'H':
                do {
                zeit_objekt=naechstes_Halbjahr(zw_sp_datum.getFullYear(),zw_sp_datum.getMonth());
                k_datum.setTime(zeit_objekt);
                kapitalisierung[0][kapitalisierung_zaehler]=zeit_objekt;
                kapitalisierung[1][kapitalisierung_zaehler]=0;              //nicht wichtig
                kapitalisierung[2][kapitalisierung_zaehler]=1;              //Schlüssel für die Kapitalisierung
                zw_sp_datum.setFullYear(k_datum.getFullYear(),k_datum.getMonth(),k_datum.getDate()+1);
                zeit_in_millisec=zw_sp_datum.getTime();
                kapitalisierung_zaehler++                   //index weiterzählen
                } while (zeit_in_millisec < g_variablen_periodenende); //(Zinsende > DateAdd("d", -1, Zw_Sp_Datum)
                break;
            case 'J':
                do {
                zeit_objekt=naechstes_Jahresende(zw_sp_datum.getFullYear(),zw_sp_datum.getMonth());
                k_datum.setTime(zeit_objekt);
                kapitalisierung[0][kapitalisierung_zaehler]=zeit_objekt;
                kapitalisierung[1][kapitalisierung_zaehler]=0;              //nicht wichtig
                kapitalisierung[2][kapitalisierung_zaehler]=1;              //Schlüssel für die Kapitalisierung
                zw_sp_datum.setFullYear(k_datum.getFullYear(),k_datum.getMonth(),k_datum.getDate()+1);
                zeit_in_millisec=zw_sp_datum.getTime();
                kapitalisierung_zaehler++                   //index weiterzählen
                } while (zeit_in_millisec < g_variablen_periodenende); //(Zinsende > DateAdd("d", -1, Zw_Sp_Datum)
                break;
          }
}
function portfolio_zinssatz_berechnen() {
var abbruchmeldung="Die Berechnung wird abgebrochen";
    var index_zinssatz_haben=0;
    var index_zinssatz_soll=0;
            for (i=0;i<bewegungen_zusammen[0].length;i++){
                if (bewegungen_zusammen[2][i]==3){
                    index_zinssatz_haben=i;
                    break;
                }
            }
            for (i=0;i<bewegungen_zusammen[0].length;i++){
                if (bewegungen_zusammen[2][i]==2){
                    index_zinssatz_soll=i;
                    break;
                }
            }
            //Zinsstaffel berechnen----------------------------------------------------------
        var endsaldo_errechnet=0.01;
        var endsaldo_eingabe=string_to_double(document.getElementById('field_abschlusskapital').value);
        var zinskorrektur=0;
        var abbruch=false;
        zinskorrektur=10;
        //ausgabe der Bewegungen zur kontrolle
        /*
        for (i=0;i<bewegungen_zusammen[0].length;i++){
            var jahr_=new Date();
            jahr_.setTime(bewegungen_zusammen[0][i]);
            alert("Bewegungen" + jahr_.getDate()+"."+jahr_.getMonth()+"."+jahr_.getFullYear()+"."+" " + bewegungen_zusammen[1][i] + " " + bewegungen_zusammen[2][i] );
        }
        */

        while (endsaldo_eingabe >= endsaldo_errechnet){
            if (endsaldo_eingabe == endsaldo_errechnet){break;}
            bewegungen_zusammen[1][index_zinssatz_haben]=Number(bewegungen_zusammen[1][index_zinssatz_haben])+Number(zinskorrektur);
            bewegungen_zusammen[1][index_zinssatz_soll]=Number(bewegungen_zusammen[1][index_zinssatz_soll])+Number(zinskorrektur);
            if (bewegungen_zusammen[1][index_zinssatz_haben]>1000 || bewegungen_zusammen[1][index_zinssatz_haben] < -1000){
                //Meldung ausgeben-----------------------------------------------------

            abbruch=true;
            alert(abbruchmeldung);
            return;
            }
            ein_auszahlungen_berechnen();
            endsaldo_errechnet = g_variablen_endsaldo;
                //eventuell :Text_errechneter_Zinssatz = Format(Zinssatz_Haben, "#,###0.0000")
        }

        if (abbruch==false){
        zinskorrektur=-1;
        while (endsaldo_eingabe <= endsaldo_errechnet){
            if (endsaldo_eingabe == endsaldo_errechnet){break;}
            bewegungen_zusammen[1][index_zinssatz_haben]=Number(bewegungen_zusammen[1][index_zinssatz_haben])+Number(zinskorrektur);
            bewegungen_zusammen[1][index_zinssatz_soll]=Number(bewegungen_zusammen[1][index_zinssatz_soll])+Number(zinskorrektur);
            if (bewegungen_zusammen[1][index_zinssatz_haben]>1000 || bewegungen_zusammen[1][index_zinssatz_haben] < -1000){
            alert(abbruchmeldung);
            return;
            }
            ein_auszahlungen_berechnen();
            endsaldo_errechnet = g_variablen_endsaldo;
                //eventuell :Text_errechneter_Zinssatz = Format(Zinssatz_Haben, "#,###0.0000")

        }

        zinskorrektur=0.1;
        while (endsaldo_eingabe >= endsaldo_errechnet){
            if (endsaldo_eingabe == endsaldo_errechnet){break;}
            bewegungen_zusammen[1][index_zinssatz_haben]=Number(string_to_double(bewegungen_zusammen[1][index_zinssatz_haben]))+Number(zinskorrektur);
            bewegungen_zusammen[1][index_zinssatz_soll]=Number(string_to_double(bewegungen_zusammen[1][index_zinssatz_soll]))+Number(zinskorrektur);
            if (bewegungen_zusammen[1][index_zinssatz_haben]>1000){
            alert(abbruchmeldung);
            break;
            }
            ein_auszahlungen_berechnen();
            endsaldo_errechnet = g_variablen_endsaldo;
            //alert("endsaldo 0.1 "+g_variablen_endsaldo + "zinssatz+++"+bewegungen_zusammen[1][index_zinssatz_haben]);

                //eventuell :Text_errechneter_Zinssatz = Format(Zinssatz_Haben, "#,###0.0000")
        }
                //alert("endsaldo 0.1 "+g_variablen_endsaldo + "zinssatz+++"+bewegungen_zusammen[1][index_zinssatz_haben]);

        zinskorrektur=-0.01;
        while (endsaldo_eingabe <= endsaldo_errechnet){
            if (endsaldo_eingabe == endsaldo_errechnet){break;}
            bewegungen_zusammen[1][index_zinssatz_haben]=Number(bewegungen_zusammen[1][index_zinssatz_haben])+Number(zinskorrektur);
            bewegungen_zusammen[1][index_zinssatz_soll]=Number(bewegungen_zusammen[1][index_zinssatz_soll])+Number(zinskorrektur);
            if (bewegungen_zusammen[1][index_zinssatz_haben]>1000){
            alert(abbruchmeldung);
            break;
            }
            ein_auszahlungen_berechnen();
            endsaldo_errechnet = g_variablen_endsaldo;
                //eventuell :Text_errechneter_Zinssatz = Format(Zinssatz_Haben, "#,###0.0000")
        }
                //alert("endsaldo -0.01 "+g_variablen_endsaldo + "zinssatz+++"+bewegungen_zusammen[1][index_zinssatz_haben]);

        zinskorrektur=0.001;

        while (endsaldo_eingabe >= endsaldo_errechnet){
            if (endsaldo_eingabe == endsaldo_errechnet){break;}
            bewegungen_zusammen[1][index_zinssatz_haben]=Number(bewegungen_zusammen[1][index_zinssatz_haben])+Number(zinskorrektur);
            bewegungen_zusammen[1][index_zinssatz_soll]=Number(bewegungen_zusammen[1][index_zinssatz_soll])+Number(zinskorrektur);
            if (bewegungen_zusammen[1][index_zinssatz_haben]>1000){
            alert(abbruchmeldung);
            break;
            }
            ein_auszahlungen_berechnen();
            endsaldo_errechnet = g_variablen_endsaldo;
                //eventuell :Text_errechneter_Zinssatz = Format(Zinssatz_Haben, "#,###0.0000")
        }
        errechneter_Zinssatz=bewegungen_zusammen[1][index_zinssatz_haben];
        document.getElementById('durchschnitts_zinssatz').value=format_double_to_string(bewegungen_zusammen[1][index_zinssatz_haben],3);
        }           //Abbruchbedingung wegen zu hohem Zinssatz fertig (Portfolio)

         //alert("in ein-auszahlungen"+zinsen_zwischensumme+ "endsumme"+g_variablen_endsaldo);
    }

