// ausgleichszahlung.cpp: Implementierungsdatei
//
#include "stdafx.h"
#include "Ecopay.h"
#include "EcopayDoc.h"
#include "ChildFrm.h"
#include "ausgleichszahlung.h"
#include "massnahme.h"
#include "modell.h"
#include "ergebnis.h"
#include "datenbank.h"
#include "visualisierung.h"
#include "visdireckt.h"
#include "kartendialog.h"
#include "savename.h"
#include <sstream> 
#include <list>
#include <time.h>

// ausgleichszahlung-Dialogfeld
IMPLEMENT_DYNAMIC(ausgleichszahlung, CDialog)

ausgleichszahlung::ausgleichszahlung(CWnd* pParent /*=NULL*/)
: CDialog(ausgleichszahlung::IDD, pParent)
{
    daten = new datenbank();
}

ausgleichszahlung::~ausgleichszahlung()
{
    delete daten;
}

void ausgleichszahlung::DoDataExchange( CDataExchange* pDX)
{
    CDialog::DoDataExchange( pDX);
    DDX_Control( pDX, IDC_1Massnahme, m_1massnahme);
    DDX_Control( pDX, IDC_2Massnahme, m_2massnahme);
    DDX_Control( pDX, IDC_3Massnahme, m_3massnahme);
    DDX_Control( pDX, IDC_1Flaeche, m_1Flaeche);
    DDX_Control( pDX, IDC_2Flaeche, m_2Flaeche);
    DDX_Control( pDX, IDC_3Flaeche, m_3Flaeche);
    DDX_Control( pDX, IDC_Artenliste, m_artenliste);
    DDX_Control( pDX, IDC_ergebnis1, ergebnis1);
    DDX_Control( pDX, IDC_ergebnis2, ergebnis2);
    DDX_Control( pDX, IDC_ergebnis3, ergebnis3);
    DDX_Control( pDX, IDC_qarten, qarten);
    DDX_Control( pDX, IDC_Summepixel, pixelsumme);
}

BEGIN_MESSAGE_MAP(ausgleichszahlung, CDialog)
ON_CBN_SELCHANGE(IDC_1Massnahme, &ausgleichszahlung::OnCbnSelchange1massnahme)
ON_CBN_SELCHANGE(IDC_2Massnahme, &ausgleichszahlung::OnCbnSelchange2massnahme)
ON_CBN_SELCHANGE(IDC_3Massnahme, &ausgleichszahlung::OnCbnSelchange3massnahme)
ON_EN_KILLFOCUS(IDC_1Flaeche, &ausgleichszahlung::OnEnKillfocus1flaeche)
ON_EN_KILLFOCUS(IDC_2Flaeche, &ausgleichszahlung::OnEnKillfocus2flaeche)
ON_EN_KILLFOCUS(IDC_3Flaeche, &ausgleichszahlung::OnEnKillfocus3flaeche)
ON_LBN_DBLCLK(IDC_Artenliste, &ausgleichszahlung::OnLbnDblclkArtenliste)
ON_BN_CLICKED(IDC_BUTTON1, &ausgleichszahlung::OnBnClickedButton1)
ON_BN_CLICKED(IDOK, &ausgleichszahlung::OnBnClickedOk)
ON_BN_CLICKED(IDC_Modelieren, &ausgleichszahlung::OnBnClickedModelieren)
ON_EN_KILLFOCUS(IDC_zahlungm1, &ausgleichszahlung::OnEnKillfocuszahlungm1)
ON_EN_KILLFOCUS(IDC_zahlungm2, &ausgleichszahlung::OnEnKillfocuszahlungm2)
ON_EN_KILLFOCUS(IDC_zahlungm3, &ausgleichszahlung::OnEnKillfocuszahlungm3)
ON_EN_KILLFOCUS(IDC_qarten, &ausgleichszahlung::OnEnKillfocusqarten)
ON_BN_CLICKED(IDC_BUTTON2, &ausgleichszahlung::OnBnClickedButton2)
ON_BN_CLICKED(IDC_Speichern, &ausgleichszahlung::OnBnClickedSpeichern)
END_MESSAGE_MAP()

BOOL ausgleichszahlung::OnInitDialog()
{
    CDialog::OnInitDialog();

    getdata();
    CWnd* p1Wnd = GetDlgItem(IDC_Speichern);
    p1Wnd->EnableWindow(0);
    CWnd* p2Wnd = GetDlgItem(IDC_BUTTON2);
    p2Wnd->EnableWindow(0);

    daten->delete_zwischenvis();

    return TRUE;
}

void ausgleichszahlung::getdata()
{
    list < CString > stringlist;
    list< CString>::iterator i;
    int massnahmenanzahl, j;
    string result;
    string monatsv;

    char ma[ 100];
    int mv;

    //Connection* con = daten->datacon();
    massnahmenliste = daten->returnmassnahmen( massnahmenanzahl);
    for( j = 0; j < massnahmenanzahl; j++)
    {
        mv = (*(massnahmenliste[ j])).mv1massnahme;
        switch( mv)
        {
            case 13:
                monatsv = "1. MV April";
                break;
            case 14:
                monatsv = "2. MV April";
                break;
            case 15:
                monatsv = "3. MV April";
                break;
            case 16:
                monatsv = "4. MV April";
                break;
            case 17:
                monatsv = "1. MV Mai";
                break;
            case 18:
                monatsv = "2. MV Mai";
                break;
            case 19:
                monatsv = "3. MV Mai";
                break;
            case 20:
                monatsv = "4. MV Mai";
                break;
            case 21:
                monatsv = "1. MV Juni";
                break;
            case 22:
                monatsv = "2. MV Juni";
                break;
            case 23:
                monatsv = "3. MV Juni";
                break;
            case 24:
                monatsv = "4. MV Juni";
                break;
            case 25:
                monatsv = "1. MV Juli";
                break;
            case 26:
                monatsv = "2. MV Juli";
                break;
            case 27:
                monatsv = "3. MV Juli";
                break;
            case 28:
                monatsv = "4. MV Juli";
                break;
            case 29:
                monatsv = "1. MV August";
                break;
            case 30:
                monatsv = "2. MV August";
                break;
            case 31:
                monatsv = "3. MV August";
                break;
            case 32:
                monatsv = "4. MV August";
                break;
            case 33:
                monatsv = "1. MV September";
                break;
            case 34:
                monatsv = "2. MV September";
                break;
            case 35:
                monatsv = "3. MV September";
                break;
            case 36:
                monatsv = "4. MV September";
                break;
            case 37:
                monatsv = "1. MV Oktober";
                break;
            case 38:
                monatsv = "2. MV Oktober";
                break;
            case 39:
                monatsv = "3. MV Oktober";
                break;
            case 40:
                monatsv = "4. MV Oktober";
                break;
            default:
                break;
        }

        stringstream returnstring;
        returnstring << j << ", " << monatsv << ", (MV"
                << (*(massnahmenliste[ j])).mv1massnahme << "), "
                << (*(massnahmenliste[ j])).abstand2massnahme << ", "
                << (*(massnahmenliste[ j])).name << ", "
                << (*(massnahmenliste[ j])).massnahmeID << " (ID)"
                << (*(massnahmenliste[ j])).duengung << " (D)";
        result = returnstring.str();
        lstrcpy( ma, result.c_str());
        m_1massnahme.AddString( ma);
        m_2massnahme.AddString( ma);
        m_3massnahme.AddString( ma);
    }

    stringlist = daten->returndata( "art", "name, name_benutzer, savetime ",
            "name_benutzer", "Astrid");
    i = stringlist.begin();
    CString auswahl;
    while( i != stringlist.end())
    {
        auswahl = *(i);
        m_artenliste.AddString( auswahl);
        i++;
    }
}

// ausgleichszahlung-Meldungshandler
bool mysortfunction( ergebnis* e1, ergebnis* e2)
{
    return (e1->massnamehmenqualitaet[ 0].gewinn
            > e2->massnamehmenqualitaet[ 0].gewinn);
}

void ausgleichszahlung::OnCbnSelchange1massnahme()
{
    CString mvwahl;
    int nIndex = m_1massnahme.GetCurSel();
    if( nIndex != CB_ERR)
    {
        m_1massnahme.GetLBText( nIndex, mvwahl);
        // aus dem string artauswahl muss der Name und die savetime ausgelesen werden.
    }

    string::size_type posA, posB;

    string line( mvwahl);

    // Find first non-whitespace character.
    posA = line.find_first_not_of( " \t", 0);

    // Find first whitespace after that (i.e. end of token).
    posB = line.find_first_of( ",", posA);

    // Extract the token.
    string num = line.substr( posA, posB - posA);
    int j = atoi( num.c_str());
    //mliste.push_back(*(massnahmenliste[j]));
    m1 = (*(massnahmenliste[ j]));
}

void ausgleichszahlung::OnCbnSelchange2massnahme()
{
    CString mvwahl;
    int nIndex = m_2massnahme.GetCurSel();
    if( nIndex != CB_ERR)
    {
        m_2massnahme.GetLBText( nIndex, mvwahl);
        // aus dem string artauswahl muss der Name und die savetime ausgelesen werden.
    }

    string::size_type posA, posB;

    string line( mvwahl);

    // Find first non-whitespace character.
    posA = line.find_first_not_of( " \t", 0);

    // Find first whitespace after that (i.e. end of token).
    posB = line.find_first_of( ",", posA);

    // Extract the token.
    string num = line.substr( posA, posB - posA);
    int j = atoi( num.c_str());
    //mliste.push_back(*(massnahmenliste[j]));
    m2 = (*(massnahmenliste[ j]));
}

void ausgleichszahlung::OnCbnSelchange3massnahme()
{
    CString mvwahl;
    int nIndex = m_3massnahme.GetCurSel();
    if( nIndex != CB_ERR)
    {
        m_3massnahme.GetLBText( nIndex, mvwahl);
        // aus dem string artauswahl muss der Name und die savetime ausgelesen werden.

    }

    string::size_type posA, posB;

    string line( mvwahl);

    // Find first non-whitespace character.
    posA = line.find_first_not_of( " \t", 0);

    // Find first whitespace after that (i.e. end of token).
    posB = line.find_first_of( ",", posA);

    // Extract the token.
    string num = line.substr( posA, posB - posA);
    int j = atoi( num.c_str());
    //mliste.push_back(*(massnahmenliste[j]));
    m3 = (*(massnahmenliste[ j]));
}

void ausgleichszahlung::OnEnKillfocus1flaeche()
{
    CString f;
    CWnd* pWnd = GetDlgItem( IDC_1Flaeche);
    pWnd->GetWindowText( f);
    max1F = atof( f);
}

void ausgleichszahlung::OnEnKillfocus2flaeche()
{
    CString f;
    CWnd* pWnd = GetDlgItem( IDC_2Flaeche);
    pWnd->GetWindowText( f);
    max2F = atof( f);
}

void ausgleichszahlung::OnEnKillfocus3flaeche()
{
    CString f;
    CWnd* pWnd = GetDlgItem( IDC_3Flaeche);
    pWnd->GetWindowText( f);
    max3F = atof( f);
}

void ausgleichszahlung::OnLbnDblclkArtenliste()
{
    CString artauswahl;
    int nIndex = m_artenliste.GetCurSel();
    if( nIndex != CB_ERR)
    {
        m_artenliste.GetText( nIndex, artauswahl);
        // aus dem string artauswahl muss der Name und die savetime ausgelesen werden.

    }

    string::size_type posA, posB, posC;

    string line( artauswahl);
    string name, savetime;

    // Find first non-whitespace character.
    posA = line.find_first_not_of( " \t", 0);
    posC = line.find_first_of( "/", 0);
    //posC = line.find_first_not_of( " \t", posD);

    // Find first whitespace after that (i.e. end of token).
    posB = line.find_first_of( ",", posC + 1);

    // Iterate this until the end of the line.
    // while( string::npos != posA || string::npos != posB)
    // {
    // Extract the token.
    name = line.substr( posC + 1, posB - (posC + 1));

    CString bname( name.c_str());

    //... do something with the token ...

    // Find next token same way as before.
    posA = line.find_first_not_of( " \t", posB + 1);

    posB = line.find_first_of( ",t", posA);
    savetime = line.substr( posA, posB - posA);
    art* nart;
    nart = new art;
    nart = nart->get_art_from_database( name, savetime);
    artliste.push_back( nart);
}

void ausgleichszahlung::OnBnClickedButton1()
{
    //datenbank* daten = new datenbank();
    artliste = daten->returnartliste( "art", "gruppe", "Vogel");
}

void ausgleichszahlung::OnBnClickedOk()
{
    daten->delete_zwischenvis();

    OnOK();
}

vector< ergebnis*> ausgleichszahlung::neueliste(
        vector< ergebnis*> eliste,
        massnahme m)
{
    int h = 0;
    vector< ergebnis*> hliste;
    vector< ergebnis*>::iterator help, el;
    vector< ergebnis::mq>::iterator mal;

    for( el = eliste.begin(); el != eliste.end(); el++)
    {
        // die Massnahme aus der Massnahmenliste der  uebrigen Ergebnisse loeschen
        for( mal = (*el)->massnamehmenqualitaet.begin();
                mal != (*el)->massnamehmenqualitaet.end(); mal++)
        {
            int id = mal->massnahm.massnahmeID;
            if( id == m.massnahmeID)
            {
                (*el)->massnamehmenqualitaet.erase( mal);
                break;
            }
        }
        if( (*el)->massnamehmenqualitaet.size() != 0)
            hliste.push_back( *el);

    }
    if( hliste.size() != 0)
        sort( hliste.begin(), hliste.end(), mysortfunction);
    return hliste;
}
vector< vector< ergebnis*>> gesergeb;
ergebnis*** er;

void ausgleichszahlung::OnBnClickedModelieren()
{
    modell mod;
    //ergebnis*** er;
    vector< ergebnis*> eliste;
    //vector<ergebnis*> pixelm1;
    pixelm1.clear();
    pixelm1.reserve( max1F);
    //vector<ergebnis*> pixelm2;
    pixelm2.clear();
    pixelm2.reserve( max2F);
    //vector<ergebnis*> pixelm3;
    pixelm3.clear();
    pixelm3.reserve( max3F);
    CString str;

    vector< ergebnis*>::iterator el, hl, help, e;
    vector< ergebnis::mq>::iterator mal;

    AfxMessageBox( "Modeliere!", MB_YESNO, 0);

    if( m1.mv1massnahme != 0)
    {
        m1.zahlung = zahlung1;
        mliste.push_back( m1);
    }
    if( m2.mv1massnahme != 0)
    {
        m2.zahlung = zahlung2;
        mliste.push_back( m2);
        //bool saved2 = daten->save_konfiguration( konfiguration, 
        //        m2.massnahmeID, z2, max2F);

    }
    if( m3.mv1massnahme != 0)
    {
        m3.zahlung = zahlung3;
        mliste.push_back( m3);
        //bool saved3 = daten->save_konfiguration( konfiguration, 
        //        m3.massnahmeID, z3, max3F);
    }

    er = mod.create_oekologiemodell( artliste, mliste, minqualitaet,
            bundeslandID, hoch, egal);
    int n, m;
    //Liste erstellen mit Pixel die zur Optimierung benutzt werden und diese
    //an modell zurückgeben
    int h = 0;

    for( n = 0; n < 674; n++)
    {
        for( m = 0; m < 885; m++)
        {
            ergebnis* ergeb = er[ n][ m];
            //int wert = ergeb->gesammtqualitaet;
            //str.Format(_T("%d"),wert);

            //ergebnis1.AddString(str);
            if( ergeb->gesammtqualitaet != 0)
                eliste.push_back( ergeb);

        }
    }
    sort( eliste.begin(), eliste.end(), mysortfunction);
    //Simulierung der Verteilung von Ausgleichzahlungen

    //die Zaehler fuer die Maxflaeche der Massnahmen
    int z1 = max1F;
    int z2 = max2F;
    int z3 = max3F;
    el = eliste.begin();

    int b = eliste.size();

    str.Format( _T( "%d"), b);
    CWnd* pWnd = GetDlgItem( IDC_Summepixel);
    pWnd->SetWindowTextA( str);

    while( (z1 != 0) && (z2 != 0) && (z3 != 0) && (el != eliste.end()))
    {
        int id = (*el)->massnamehmenqualitaet[ 0].massnahm.massnahmeID;
        if( id == m1.massnahmeID)
        {
            z1--;
            pixelm1.push_back( (*el));
        }
        if( id == m2.massnahmeID)
        {
            z2--;
            pixelm2.push_back( (*el));
        }
        if( id == m3.massnahmeID)
        {
            z3--;
            pixelm3.push_back( (*el));
        }
        el++;

    }
    
    if( z1 == 0)
    {
        eliste.erase( eliste.begin(), el);
        vector< ergebnis*> hliste = neueliste( eliste, m1);
        
        int c = hliste.size();

        str.Format( _T( "%d"), c);

        help = hliste.begin();

        while( (z2 != 0) && (z3 != 0) && (help != hliste.end()))
        {
            int id = (*help)->massnamehmenqualitaet[ 0].massnahm.massnahmeID;

            if( id == m2.massnahmeID)
            {
                z2--;
                pixelm2.push_back( (*help));
            }
            if( id == m3.massnahmeID)
            {
                z3--;
                pixelm3.push_back( (*help));
            }
            help++;
        }
        
        if( z2 == 0)
        {
            hliste.erase( hliste.begin(), help);            
            vector< ergebnis*> hl = neueliste( hliste, m2);
            if( hl.size() != 0)
            {
                help = hl.begin();
                while( (z3 != 0) && (help != hl.end()))
                {
                    z3--;
                    pixelm3.push_back( (*help));
                    help++;
                }
            }
        } else
        {
            if( z3 == 0)
            {
                hliste.erase( hliste.begin(), help);
                vector< ergebnis*> hl = neueliste( hliste, m3);
                if( hl.size() != 0)
                {
                    help = hl.begin();
                    while( (z2 != 0) && (help != hl.end()))
                    {
                        z2--;
                        pixelm2.push_back( (*help));
                        help++;
                    }
                }
            }
        }
    }

    else
    {
        if( z2 == 0)
        {
            eliste.erase( eliste.begin(), el);
            vector< ergebnis*> hliste = neueliste( eliste, m2);
            help = hliste.begin();

            while( (z1 != 0) && (z3 != 0) && (help != hliste.end()))
            {
                int id = (*help)->massnamehmenqualitaet[ 0].massnahm.massnahmeID;

                if( id == m1.massnahmeID)
                {
                    z1--;
                    pixelm1.push_back( (*help));
                }
                if( id == m3.massnahmeID)
                {
                    z3--;
                    pixelm3.push_back( (*help));
                }
                help++;
            }
            if( z1 == 0)
            {
                hliste.erase( hliste.begin(), help);
                vector< ergebnis*> hl = neueliste( hliste, m1);
                help = hl.begin();
                while( (z3 != 0) && (help != hl.end()))
                {
                    z3--;
                    pixelm3.push_back( (*help));
                    help++;
                }
            } else
            {
                if( z3 == 0)
                {
                    hliste.erase( hliste.begin(), help);
                    vector< ergebnis*> hl = neueliste( hliste, m3);
                    help = hl.begin();
                    while( (z1 != 0) && (help != hl.end()))
                    {
                        z1--;
                        pixelm1.push_back( (*help));
                        help++;
                    }
                }
            }
        } else
        {
            if( z3 == 0)
            {
                eliste.erase( eliste.begin(), el);
                vector< ergebnis*> hliste = neueliste( eliste, m3);
                help = hliste.begin();

                while( (z1 != 0) && (z2 != 0) && (help != hliste.end()))
                {
                    int id = (*help)->massnamehmenqualitaet[ 0].massnahm
                            .massnahmeID;

                    if( id == m1.massnahmeID)
                    {
                        z1--;
                        pixelm1.push_back( (*help));
                    }
                    if( id == m2.massnahmeID)
                    {
                        z2--;
                        pixelm2.push_back( (*help));
                    }
                    help++;
                }
                if( z1 == 0)
                {
                    hliste.erase( hliste.begin(), help);
                    vector< ergebnis*> hl = neueliste( hliste, m1);
                    help = hl.begin();
                    while( (z2 != 0) && (help != hl.end()))
                    {
                        z2--;
                        pixelm2.push_back( (*help));
                        help++;
                    }
                } else
                {
                    if( z2 == 0)
                    {
                        hliste.erase( hliste.begin(), help);
                        vector< ergebnis*> hl = neueliste( hliste, m2);
                        help = hl.begin();
                        while( (z1 != 0) && (help != hl.end()))
                        {
                            z1--;
                            pixelm1.push_back( (*help));
                            help++;
                        }
                    }
                }
            }
        }
    }
    
    string result;
    char ma[ 1000];

    int a = pixelm1.size();
    str.Format( _T( "%d"), a);
    ergebnis1.AddString( str);
    a = pixelm2.size();
    str.Format( _T( "%d"), a);
    ergebnis2.AddString( str);
    a = pixelm3.size();
    str.Format( _T( "%d"), a);
    ergebnis3.AddString( str);

    CString str2;
    bool saved;
    gesergeb.push_back( pixelm1);
    gesergeb.push_back( pixelm2);
    gesergeb.push_back( pixelm3);

    for( e = pixelm1.begin(); e != pixelm1.end(); e++)
    {
        stringstream returnstring;
        str.Format( _T( "%.f"), (*e)->massnamehmenqualitaet[ 0].gewinn);
        str2.Format( _T( "%.2f"), (*e)->massnamehmenqualitaet[ 0].qualitaet);
        returnstring << str << " (Gewinn), " << str2 << " (Qualitaet), "
                << (*e)->gruenlandgrundzahl << "(Gruenlandzahl)";
        result = returnstring.str();
        lstrcpy( ma, result.c_str());
        ergebnis1.AddString( ma);
    }

    for( e = pixelm2.begin(); e != pixelm2.end(); e++)
    {
        stringstream returnstring;
        str.Format( _T( "%.f"), (*e)->massnamehmenqualitaet[ 0].gewinn);
        str2.Format( _T( "%.2f"), (*e)->massnamehmenqualitaet[ 0].qualitaet);
        returnstring << str << " (Gewinn), " << str2 << " (Qualitaet), "
                << (*e)->gruenlandgrundzahl << "(Gruenlandzahl)";
        result = returnstring.str();
        lstrcpy( ma, result.c_str());
        ergebnis2.AddString( ma);
    }
    for( e = pixelm3.begin(); e != pixelm3.end(); e++)
    {
        stringstream returnstring;
        str.Format( _T( "%.f"), (*e)->massnamehmenqualitaet[ 0].gewinn);
        str2.Format( _T( "%.2f"), (*e)->massnamehmenqualitaet[ 0].qualitaet);
        returnstring << str << " (Gewinn), " << str2 << " (Qualitaet), "
                << (*e)->gruenlandgrundzahl << "(Gruenlandzahl)";
        result = returnstring.str();
        lstrcpy( ma, result.c_str());
        ergebnis3.AddString( ma);
    }

    vector< art*>::iterator artz;
    vector< ergebnis::mqart>::iterator am;
    vector< ergebnis::qart>::iterator v;
    int zaehler = 0;
    CString artname;
    //struct pixelqual{int pixel_i; int pixxel_j; double aqual;};
    //vector<pixelqual> pq;
    //struct artenanzahl{CString artname;int zaehler;};
    //struct artenanzahl{CString artname;vector<pixelqual> pq;};
    vector < artenanzahl > artenanzahlliste;
    vector< artenanzahl>::iterator az;
    for( artz = artliste.begin(); artz != artliste.end(); artz++)
    {
        artenanzahl artenzaehler;
        artenzaehler.artname = (*(*artz)).get_m_name();
        artenzaehler.zaehler = 0;
        artenanzahlliste.push_back( artenzaehler);

    }

    int p1 = pixelm1.size();
    int p2 = pixelm2.size();
    int p3 = pixelm3.size();
    
    if( p1 != 0)
    {
        for( e = pixelm1.begin(); e != pixelm1.end(); e++)
        {
            for( am = (*e)->artmasqualitaet.begin();
                    am != (*e)->artmasqualitaet.end(); am++)
            {
                if( am->massnahm.massnahmeID == m1.massnahmeID)
                {
                    //saved = daten->save_ergebnis( (*e)->mpixel.get_pixelID(),
                    //        (*e)->mpixel.get_x_koordinate(),
                    //        (*e)->mpixel.get_y_koordinate(), m1.massnahmeID,
                    //        konfiguration,
                    //        (*e)->massnamehmenqualitaet[ 0].gewinn, 
                    //        am->vqart);
                    for( az = artenanzahlliste.begin();
                            az != artenanzahlliste.end(); az++)
                    {
                        artname = (*az).artname;
                        for( v = (am->vqart.begin()); v != (am->vqart.end());
                                v++)
                        {
                            CString artname2 = v->art.get_m_name();
                            if( artname == artname2)
                            {
                                pixelqual piq;
                                piq.aqual = v->qualitaet;
                                piq.pixel_i = (*e)->mpixel.get_matrix_i();
                                piq.pixel_j = (*e)->mpixel.get_matrix_j();
                                (*az).pq.push_back( piq);
                                (*az).zaehler++;
                            }
                        }
                    }
                }
            }
        }

        for( az = artenanzahlliste.begin(); az != artenanzahlliste.end(); az++)
        {
            artname = (*az).artname;
            stringstream returnstring1;
            str.Format( _T( "%d"), (*az).zaehler);
            returnstring1 << artname << ":  " << str;
            result = returnstring1.str();
            lstrcpy( ma, result.c_str());
            ergebnis1.AddString( ma);
            (*az).zaehler = 0;
        }
    }

    if( p2 != 0)
    {
        for( e = pixelm2.begin(); e != pixelm2.end(); e++)
        {
            for( am = (*e)->artmasqualitaet.begin();
                    am != (*e)->artmasqualitaet.end(); am++)
            {
                if( am->massnahm.massnahmeID == m2.massnahmeID)
                {
                    //saved = daten->save_ergebnis( (*e)->mpixel.get_pixelID(),
                    //        (*e)->mpixel.get_x_koordinate(),
                    //        (*e)->mpixel.get_y_koordinate(), m2.massnahmeID,
                    //        konfiguration,
                    //        (*e)->massnamehmenqualitaet[ 0].gewinn, 
                    //        am->vqart);
                    for( az = artenanzahlliste.begin();
                            az != artenanzahlliste.end(); az++)
                    {
                        artname = (*az).artname;
                        for( v = (am->vqart.begin()); v != (am->vqart.end());
                                v++)
                        {
                            CString artname2 = v->art.get_m_name();
                            if( artname == artname2)
                            {
                                pixelqual piq;
                                piq.aqual = v->qualitaet;
                                piq.pixel_i = (*e)->mpixel.get_matrix_i();
                                piq.pixel_j = (*e)->mpixel.get_matrix_j();
                                (*az).pq.push_back( piq);
                                (*az).zaehler++;
                            }
                        }
                    }
                }
            }
        }

        for( az = artenanzahlliste.begin(); az != artenanzahlliste.end(); az++)
        {
            artname = (*az).artname;
            stringstream returnstring1;
            str.Format( _T( "%d"), (*az).zaehler);
            returnstring1 << artname << ":  " << str;
            result = returnstring1.str();
            lstrcpy( ma, result.c_str());
            ergebnis2.AddString( ma);
            (*az).zaehler = 0;
        }
    }

    if( p3 != 0)
    {
        for( e = pixelm3.begin(); e != pixelm3.end(); e++)
        {
            for( am = (*e)->artmasqualitaet.begin();
                    am != (*e)->artmasqualitaet.end(); am++)
            {
                if( am->massnahm.massnahmeID == m3.massnahmeID)
                {
                    //saved = daten->save_ergebnis( (*e)->mpixel.get_pixelID(),
                    //        (*e)->mpixel.get_x_koordinate(),
                    //        (*e)->mpixel.get_y_koordinate(), m3.massnahmeID,
                    //        konfiguration,
                    //        (*e)->massnamehmenqualitaet[ 0].gewinn, 
                    //        am->vqart);
                    for( az = artenanzahlliste.begin();
                            az != artenanzahlliste.end(); az++)
                    {
                        artname = (*az).artname;
                        for( v = (am->vqart.begin()); v != (am->vqart.end());
                                v++)
                        {
                            CString artname2 = v->art.get_m_name();
                            if( artname == artname2)
                            {
                                pixelqual piq;
                                piq.aqual = v->qualitaet;
                                piq.pixel_i = (*e)->mpixel.get_matrix_i();
                                piq.pixel_j = (*e)->mpixel.get_matrix_j();
                                (*az).pq.push_back( piq);
                                (*az).zaehler++;
                            }
                        }
                    }
                }
            }
        }

        for( az = artenanzahlliste.begin(); az != artenanzahlliste.end(); az++)
        {
            artname = (*az).artname;
            stringstream returnstring1;
            str.Format( _T( "%d"), (*az).zaehler);
            returnstring1 << artname << ":  " << str;
            result = returnstring1.str();
            lstrcpy( ma, result.c_str());
            ergebnis3.AddString( ma);
            (*az).zaehler = 0;
        }
    }

    //Aufräumen nicht vergessen!
    
    //for( n = 0; n < 674; n++)
    //{
    //    for( m = 0; m < 885; m++)
    //    {
    //        delete er[ n][ m];
    //    }
    //    delete[] er[ n];
    //}
    //
    //delete[] er;
    //
    //int artnum = artliste.size();
    //for( n = 0; n < artnum; n++)
    //{
    //    delete artliste[ n];
    //}
    ////artliste.clear();
    //mliste.clear();
    //max1F = 0;
    //max2F = 0;
    //max3F = 0;
    //m1.~massnahme();
    //m2.~massnahme();
    //m3.~massnahme();
    CWnd* p1Wnd = GetDlgItem( IDC_Speichern);
    p1Wnd->EnableWindow( 1);
    CWnd* p2Wnd = GetDlgItem( IDC_BUTTON2);
    p2Wnd->EnableWindow( 1);
}

void ausgleichszahlung::OnEnKillfocuszahlungm1()
{
    CString f;
    CWnd* pWnd = GetDlgItem( IDC_zahlungm1);
    pWnd->GetWindowText( f);
    zahlung1 = atof( f);
}

void ausgleichszahlung::OnEnKillfocuszahlungm2()
{
    CString f;
    CWnd* pWnd = GetDlgItem( IDC_zahlungm2);
    pWnd->GetWindowText( f);
    zahlung2 = atof( f);
}

void ausgleichszahlung::OnEnKillfocuszahlungm3()
{
    CString f;
    CWnd* pWnd = GetDlgItem( IDC_zahlungm3);
    pWnd->GetWindowText( f);
    zahlung3 = atof( f);
}

void ausgleichszahlung::OnEnKillfocusqarten()
{
    CString f;
    CWnd* pWnd = GetDlgItem( IDC_qarten);
    pWnd->GetWindowText( f);
    minqualitaet = atof( f);
}

void ausgleichszahlung::OnBnClickedButton2()
{
    //erst mal die Daten in die Datenbank zwischenspeichern, 
    //damit mann sie besser sortieren und ausgeben kann!
    int p1 = pixelm1.size();
    int p2 = pixelm2.size();
    int p3 = pixelm3.size();
    vector< ergebnis*>::iterator e;
    vector< ergebnis::mqart>::iterator am;
    vector< ergebnis::qart>::iterator aq;
    bool saved;

    if( p1 != 0)
    {
        for( e = pixelm1.begin(); e != pixelm1.end(); e++)
        {
            for( am = (*e)->artmasqualitaet.begin();
                    am != (*e)->artmasqualitaet.end(); am++)
            {
                if( am->massnahm.massnahmeID == m1.massnahmeID)
                {
                    for( aq = am->vqart.begin(); aq != am->vqart.end(); aq++)
                    {
                        saved = daten->save_zwischenvis( m1.massnahmeID,
                                am->massnahm.name, (*aq).art.get_artID(),
                                (*aq).art.get_m_name(), (*aq).qualitaet,
                                (*e)->mpixel.get_pixelID(),
                                (*e)->mpixel.get_matrix_i(),
                                (*e)->mpixel.get_matrix_j(),
                                (*e)->massnamehmenqualitaet[ 0].gewinn,
                                m1.zahlung, bundeslandID);
                    }
                }
            }
        }
    }

    if( p2 != 0)
    {
        for( e = pixelm2.begin(); e != pixelm2.end(); e++)
        {
            for( am = (*e)->artmasqualitaet.begin();
                    am != (*e)->artmasqualitaet.end(); am++)
            {
                if( am->massnahm.massnahmeID == m2.massnahmeID)
                {
                    for( aq = am->vqart.begin(); aq != am->vqart.end(); aq++)
                    {
                        saved = daten->save_zwischenvis( m2.massnahmeID,
                                am->massnahm.name, (*aq).art.get_artID(),
                                (*aq).art.get_m_name(), (*aq).qualitaet,
                                (*e)->mpixel.get_pixelID(),
                                (*e)->mpixel.get_matrix_i(),
                                (*e)->mpixel.get_matrix_j(),
                                (*e)->massnamehmenqualitaet[ 0].gewinn,
                                m1.zahlung, bundeslandID);
                    }
                }
            }
        }
    }

    if( p3 != 0)
    {
        for( e = pixelm3.begin(); e != pixelm3.end(); e++)
        {
            for( am = (*e)->artmasqualitaet.begin();
                    am != (*e)->artmasqualitaet.end(); am++)
            {
                if( am->massnahm.massnahmeID == m3.massnahmeID)
                {
                    for( aq = am->vqart.begin(); aq != am->vqart.end(); aq++)
                    {
                        saved = daten->save_zwischenvis( m3.massnahmeID,
                                am->massnahm.name, (*aq).art.get_artID(),
                                (*aq).art.get_m_name(), (*aq).qualitaet,
                                (*e)->mpixel.get_pixelID(),
                                (*e)->mpixel.get_matrix_i(),
                                (*e)->mpixel.get_matrix_j(),
                                (*e)->massnamehmenqualitaet[ 0].gewinn,
                                m1.zahlung, bundeslandID);
                    }
                }
            }
        }
    }

    //sonst wieder einfügen!
    //
    //(CEcopayApp::GetApp())->VisualisierungKarte();
    //
    //AfxGetMainWnd()->SendMessage(WM_VisualisierungKarte) ;
    //(visdireckt::GetView())->OnInitialUpdate( gesergeb, true );
    //(visdireckt::GetView())->OnInitialUpdate();
    
    // RECT rctB = { 20, 30, 80, 100};

    //(visdireckt::GetView())->Create( ("Visclass"), ("Karte"),
    //        WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST, rctB, this,
    //        1); 

     
    CCreateContext pContext;
    CMultiDocTemplate* pDocTemplate = NULL;
    pDocTemplate = new CMultiDocTemplate( IDR_EcopayYPE,
            RUNTIME_CLASS( CEcopayDoc), RUNTIME_CLASS( CChildFrame), 
            RUNTIME_CLASS( visdireckt));

    AfxGetApp()->AddDocTemplate( pDocTemplate);
    m_pTemplateI = new CMultiDocTemplate( IDR_EcopayYPE,
            RUNTIME_CLASS( CEcopayDoc), RUNTIME_CLASS( CChildFrame), 
            RUNTIME_CLASS( visdireckt));

    CMDIChildWnd * pChild = ((CMDIFrameWnd*) (AfxGetApp()->m_pMainWnd))
            ->MDIGetActive();
    CDocument * pDoc = pChild->GetActiveDocument();
    CDocTemplate* pTemplate = m_pTemplateI;
    //pDocument = pTemplate->CreateNewDocument();
    CFrameWnd* pFrame = pTemplate->CreateNewFrame( pDoc, pChild);
    pTemplate->InitialUpdateFrame( pFrame, pDoc);

    //(visdireckt::GetView())->OnInitialUpdate( gesergeb, true );
    //CDC *pDC = (visdireckt::GetView())->GetDC();

    // pContext.m_pCurrentDoc = new CMyDocument;
    /*
     pContext.m_pCurrentDoc = pChild->GetActiveDocument();
     pContext.m_pNewViewClass = RUNTIME_CLASS(visdireckt);
     visdireckt *pView =
     (visdireckt *) ((CFrameWnd*)pFrame)->CreateView(&pContext);
     ASSERT(pView);
     pView->ShowWindow(SW_NORMAL);*/
    /*
     
     kartendialog* kDlg;
     kDlg = new kartendialog;
     BOOL ret = kDlg->Create(IDD_DIALOG1);
     kDlg->ShowWindow(SW_SHOW);
     */

}

void ausgleichszahlung::OnBnClickedSpeichern()
{
    time_t seconds;

    seconds = time( NULL);
    int konfiguration = int( seconds);

    if( m1.mv1massnahme != 0)
        bool saved = daten->save_konfiguration( konfiguration, m1.massnahmeID,
                zahlung1, max1F, ergebnissavename, 1);
    if( m2.mv1massnahme != 0)
        bool saved2 = daten->save_konfiguration( konfiguration, m2.massnahmeID,
                zahlung2, max2F, ergebnissavename, 1);
    if( m3.mv1massnahme != 0)
        bool saved3 = daten->save_konfiguration( konfiguration, m3.massnahmeID,
                zahlung3, max3F, ergebnissavename, 1);

    int p1 = pixelm1.size();
    int p2 = pixelm2.size();
    int p3 = pixelm3.size();
    vector< ergebnis*>::iterator e;
    vector< ergebnis::mqart>::iterator am;
    
    if( p1 != 0)
    {
        for( e = pixelm1.begin(); e != pixelm1.end(); e++)
        {
            for( am = (*e)->artmasqualitaet.begin();
                    am != (*e)->artmasqualitaet.end(); am++)
            {
                if( am->massnahm.massnahmeID == m1.massnahmeID)
                    bool saved = daten->save_ergebnis(
                            (*e)->mpixel.get_pixelID(), m1.massnahmeID,
                            konfiguration,
                            (*e)->massnamehmenqualitaet[ 0].gewinn, am->vqart);
            }
        }
    }

    if( p2 != 0)
    {
        for( e = pixelm2.begin(); e != pixelm2.end(); e++)
        {
            for( am = (*e)->artmasqualitaet.begin();
                    am != (*e)->artmasqualitaet.end(); am++)
            {
                if( am->massnahm.massnahmeID == m2.massnahmeID)
                    bool saved = daten->save_ergebnis(
                            (*e)->mpixel.get_pixelID(), m2.massnahmeID,
                            konfiguration,
                            (*e)->massnamehmenqualitaet[ 0].gewinn, am->vqart);
            }
        }
    }

    if( p3 != 0)
    {
        for( e = pixelm3.begin(); e != pixelm3.end(); e++)
        {
            for( am = (*e)->artmasqualitaet.begin();
                    am != (*e)->artmasqualitaet.end(); am++)
            {
                if( am->massnahm.massnahmeID == m3.massnahmeID)
                    bool saved = daten->save_ergebnis(
                            (*e)->mpixel.get_pixelID(), m3.massnahmeID,
                            konfiguration,
                            (*e)->massnamehmenqualitaet[ 0].gewinn, am->vqart);
            }
        }
    }
}