// Jacek Szwaj, K1I3, projekt nr4 zadanie 5 , semestr 1
// Program do prowadzenia budzetow.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// +++++++++++++++++++++++++++++++++++++++++++++++++
        #define NBUDZETOW 3
        #define NMAX 5
        #define NSTR 40
        #define R_BUFOR 1024

        char buff[R_BUFOR], c, k, szuk_kontrahent[NSTR]; // c i k = zmienna polecenia
        int l_trans[NBUDZETOW*NMAX], ID = 0, szuk = 0, ilosc_budzetow = 0, l_wszystkich_t = 0;
        double saldo[NBUDZETOW];
        double szuk_kwota_min = 0.0, szuk_kwota_max = 0.0;
        char kryt_data = 'n', kryt_kwota = 'n', kryt_kontrahent = 'n', nowy_budzet = 'n';
        char sort_wgco = 'd', sort_metoda = 'r', szyfrowanie = 'n';
        int sort_ile = 0, ost_ile = 0;
        int nr_najstarszej_tr[NBUDZETOW];
        char budzet[NBUDZETOW][NSTR];  
        int ktory_budzet = 0, z_budzet = -1;
        FILE *plik, *splik;    
// obsluga katalogoow +++++++++++++++++++++++++++++++++++++++++++++++++


char nazwa[40], nazwa2[40];
struct wezel_drzewa *root = NULL;
struct lista {
        struct wezel_drzewa *wsk;
        struct lista *next;
};
struct wezel_drzewa {
        char katalog[40];
        struct lista *pocz;
        struct wezel_drzewa *nad_drzewo;
};

        struct datka // struktura przechowujaca daty
        {
            int rok;
            int miesiac;
            int dzien;
        };
        
        struct transakcja // najwazniejsza struktura, zawierajaca transakcje
        {
            struct datka data;
            double kwota;
            char kontrahent[NSTR];
            char opis[40*NSTR+1];
            struct wezel_drzewa *katalog;
            int nr_budzetu;
        };
        
        struct datka dat_min;
        struct datka dat_max;
        struct transakcja rekord[NMAX*NBUDZETOW];         // glowna tablica struktur transakcja
        struct transakcja ost_wyszukane[NMAX]; // tablica przechowuje wyniki ostatniego wyszukiwania
        struct transakcja *sorty[NMAX];       // tablica wskaznikow potrzebna do sortowania
// +++++++++++++++++++++++++++++++++++++++++++++++++
void edytuj_transakcje (char, int);          // deklaruje funkcje edycji transakcji
void dostepne_budzety();                        // deklaracja
void  czysc_buff ();
void wczyt_do_buf();                    // deklaracja
void sprawdz_dane(int, int);                    // deklaracja
void dodaj_katalog (struct wezel_drzewa *doktorego, struct wezel_drzewa *w_nazwa);
// +++++++++++++++++++++++++++++++++++++++++++++++++
void stworz_pierwszy_katalog () {
        root = (struct wezel_drzewa *)malloc(sizeof(struct wezel_drzewa));
        strcpy(root->katalog, "transakcje");
        root->pocz = NULL;
        root->nad_drzewo = NULL;
}

struct wezel_drzewa * znajdz_wezel(struct wezel_drzewa *temp, char *nazwa){
        struct lista *l_temp;
        struct wezel_drzewa *wynik;

        if(temp != NULL)
        {
                if(strcmp(temp->katalog, nazwa) == 0)
                        return temp;
                l_temp = temp->pocz;
                while(l_temp != NULL)
                {
                        if((wynik = znajdz_wezel(l_temp->wsk, nazwa))!= NULL)
                                return wynik;
                        l_temp = l_temp->next;
                }
        }
        return NULL;
}
void wypisz_drzewo_do_plik (struct wezel_drzewa *root) {
        struct wezel_drzewa *aktualny;
        struct lista *l_temp;
        static int wciecie = 1;
        int i = 0;

        for(i = 0; i < wciecie; i++)
                //fprintf(plik, "\t");
        aktualny = root;

        if(strcmp(aktualny->katalog, "transakcje") != 0)
        fprintf(plik, "%s\t%s\n", aktualny->nad_drzewo->katalog, aktualny->katalog);

        l_temp = root->pocz;
                while(l_temp != NULL)
                {
                        wciecie++;
                        wypisz_drzewo_do_plik(l_temp->wsk);
                        l_temp = l_temp->next;
                        wciecie--;
                }
        printf("\n");
}

void zapis_do_plik () {
        char nazwa[NSTR];
        int i;

        printf("Podaj nazwe pliku do ktorego zapisac dane: ");  wczyt_do_buf ();  strcpy(nazwa, buff);

        plik = fopen(nazwa, "w");
        for(i = 0; i < NBUDZETOW; i++)
                fprintf(plik, "%s\n", budzet[i]);
        for(i = 0; i < l_wszystkich_t; i++)
                fprintf(plik, "%d;%d;%d;%.2lf;%s;%s;%s;%d;\n", rekord[i].data.rok, rekord[i].data.miesiac, rekord[i].data.dzien, rekord[i].kwota, rekord[i].kontrahent, rekord[i].opis, rekord[i].katalog->katalog, rekord[i].nr_budzetu);
        fprintf(plik, "\t\n");
        wypisz_drzewo_do_plik(root);

        printf("Dane zostaly zapisane.\n\n");
        fclose(plik);
}

void zapis_szyfr_do_plik () {
        char nazwa[NSTR], haslo[NSTR];
        int i, znak;
        FILE *tmp;
        plik = fopen(".tmpek", "w+"); //zmiana z r+

        printf("Podaj haslo do pliku, aby go zabezpieczyc: ");  wczyt_do_buf ();  strcpy(haslo, buff);
        fprintf(plik, "*%s\n", haslo);

        for(i = 0; i < NBUDZETOW; i++)
                fprintf(plik, "%s\n", budzet[i]);
        for(i = 0; i < l_wszystkich_t; i++)
                fprintf(plik, "%d;%d;%d;%.2lf;%s;%s;%s;%d;\n", rekord[i].data.rok, rekord[i].data.miesiac, rekord[i].data.dzien, rekord[i].kwota, rekord[i].kontrahent, rekord[i].opis, rekord[i].katalog->katalog, rekord[i].nr_budzetu);
        fprintf(plik, "\t\n");
        wypisz_drzewo_do_plik(root);


        printf("Podaj nazwe pliku do ktorego zapisac dane: ");  wczyt_do_buf ();  strcpy(nazwa, buff);
        //tmp = plik;
        tmp = fopen(nazwa, "w");
        rewind(plik);
        while( (znak = getc(plik)) != EOF )
                putc(znak+1, tmp);

        printf("Dane zostaly zapisane.\n\n");
        fclose(plik);
        fclose(tmp);
        remove(".tmpek");
}

void odczyt_z_plik () {
        char wiersz[4*NSTR], nad[4*NSTR], pod[4*NSTR];
        int i,j = 0, licz = 0, znak, blad, kropka;
        struct wezel_drzewa *cel, *kat;

        for(i = 0; i < NBUDZETOW; i++) {
                fgets(wiersz, 4*NSTR, plik);  while(wiersz[j] != '\0') { if(wiersz[j] == '\n') wiersz[j] = '\0'; j++; } j = 0;
                strcpy(budzet[i], wiersz);
                if(strlen(budzet[i]) > 0) licz++;    
                //printf("budzet: %s\n", budzet[i]);
        }
                
        ilosc_budzetow = licz;
// budzety zostaly wczytane jusz w tym miejscu
        licz = 0;
        for(i = 0; i < (NBUDZETOW*NMAX); i++)
                l_trans[i] = 0;
        for(i = 0; i < (NBUDZETOW); i++)
                saldo[i] = 0.0;
        while((znak = getc(plik)) != '\t'){
                ungetc(znak, plik);
                while((znak = getc(plik)) != '\n'){
                        ungetc(znak, plik);
                                // ROK *****************************************************************************************************
                                i = 0;  czysc_buff ();
                                while((znak = getc(plik)) != ';'){  
                                        buff[i] = znak;
                                        i++;
                                }
                                buff[i+1] = '\0';
                                if(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] < '0' || buff[2] > '9' || buff[3] < '0' || buff[3] > '9' || buff[4] != '\0' || (rekord[licz].data.rok = atoi(buff)) > 2100) // rok max np 2100
                                {
                                        printf("UWAGA!! Bledny rok %s! Odczyt przerwany! Wiersz transakcji nr %i. \n", buff, licz);
                                        return;
                                }
                                // MIESIAC *****************************************************************************************************
                                i = 0;  czysc_buff ();
                                while((znak = getc(plik)) != ';'){  
                                        buff[i] = znak;
                                        i++;
                                }              
                                buff[i+1] = '\0';
                                if(buff[0] < '0' || buff[0] > '9' || ((buff[1] < '0' || buff[1] > '9') && buff[1]) != '\0' || buff[2] != '\0' || (rekord[licz].data.miesiac = atoi(buff)) > 12 || (buff[0] == '0' && buff[1] == '0'))
                                {
                                        printf("UWAGA!! Bledny miesiac %s!  Wiersz transakcji nr %i. \n", buff, licz);
                                        return;
                                }
                                
                                // DZIEN *****************************************************************************************************
                                i = 0;  czysc_buff ();
                                while((znak = getc(plik)) != ';'){  
                                        buff[i] = znak;
                                        i++;
                                }              
                                buff[i+1] = '\0';
                                if(buff[0] < '0' || buff[0] > '9' || ((buff[1] < '0' || buff[1] > '9') && buff[1]) != '\0' || buff[2] != '\0' || (rekord[licz].data.dzien = atoi(buff)) > 31 || (buff[0] == '0' && buff[1] == '0'))
                                {
                                        printf("UWAGA!! Bledny dzien %s!  Wiersz transakcji nr %i. \n", buff, licz);
                                        return;
                                }
                                // KWOTA *****************************************************************************************************
                                i = 0;  czysc_buff ();
                                while((znak = getc(plik)) != ';'){  
                                        buff[i] = znak;
                                        i++;
                                }
                                buff[i+1] = '\0';
                                blad = 0;
                                kropka = 0;
                                if(buff[j] != '\0' && blad == 0)
                                {
                                if(buff[j] == '.')  // "zabawy z kropka" liczby zmiennoprzecinkowe
                                        if(kropka == 0)
                                                kropka = 1;
                                        else if (kropka == 1)
                                                blad = 1;
                                        if(j == 0 && buff[0] == '-') // akceptacja kwoty ujemnej
                                        { j++; continue; }
                                        if((buff[j] >= '0' && buff[j] <= '9') || buff[j] == '.') { } else {blad = 1;}
                                j++;
                                
                                }
                                if(blad == 1)
                                {
                                printf("UWAGA!! Bledna kwota %s!  Wiersz transakcji nr %i. \n", buff, licz);
                                        return;
                                }
                                rekord[licz].kwota = atof(buff);
                                // KONTRAHENT *****************************************************************************************************
                                i = 0;  czysc_buff ();
                                while((znak = getc(plik)) != ';'){  
                                        buff[i] = znak;
                                        i++;
                                }
                                buff[i+1] = '\0';
                                strcpy(rekord[licz].kontrahent, buff);
                                // OPIS *****************************************************************************************************
                                i = 0;  czysc_buff ();
                                while((znak = getc(plik)) != ';'){  
                                        buff[i] = znak;
                                        i++;
                                }
                                buff[i+1] = '\0';
                                strcpy(rekord[licz].opis, buff);
                                // KATALOG *****************************************************************************************************
                                i = 0;  czysc_buff ();
                                while((znak = getc(plik)) != ';'){  
                                        buff[i] = znak;
                                        i++;
                                }
                                buff[i+1] = '\0';
                                if(!znajdz_wezel(root, buff)){
                                printf("UWAGA!! Bledny katalog %s!  Wiersz transakcji nr %i. \n", buff, licz);
                                        return;
                                }
                                
                                rekord[licz].katalog = znajdz_wezel(root, buff);
                                // NUMER BUDZETU *****************************************************************************************************
                                i = 0;  czysc_buff ();
                                while((znak = getc(plik)) != ';'){  
                                        buff[i] = znak;
                                        i++;
                                }
                                buff[i+1] = '\0';
                                if(atoi(buff) >= NBUDZETOW || atoi(buff) < 0){
                                printf("UWAGA!! Bledny budzet %s!  Wiersz transakcji nr %i. \n", buff, licz);
                                        return;
                                }
                                
                                rekord[licz].nr_budzetu = atoi(buff);
                                l_trans[rekord[licz].nr_budzetu]++;
                                saldo[rekord[licz].nr_budzetu] = saldo[rekord[licz].nr_budzetu] + rekord[licz].kwota;
                                licz++;
                                l_wszystkich_t = licz;
                }
        }
// mamy wczytane transakcje teraz czas na strukture katalogoow
        getc(plik);
        root->pocz = NULL;  // ciach
        while(fscanf(plik, "%s%s", &nad, &pod) != EOF && znajdz_wezel(root, nad)) { //printf("\n\n%s i %s\n\n", nad, pod);
                        cel = znajdz_wezel(root, nad);
                        kat = (struct wezel_drzewa *)malloc(sizeof(struct wezel_drzewa));    
                        strcpy(kat->katalog, pod);
                        dodaj_katalog (cel, kat);
        }  //if(!znajdz_wezel(root, nad)) printf("Blad!! nie mozna utworzyc katalogu!\n\n");
}

void odczyt_szyfr_z_plik () {
        char wiersz[4*NSTR], nad[4*NSTR], pod[4*NSTR],  haslo[NSTR],  pomhaslo[NSTR];
        int i,j = 0, licz = 0, znak, blad, kropka;
        struct wezel_drzewa *cel, *kat;
        
        printf("Plik szyfrowany: Podaj haslo do pliku: ");  wczyt_do_buf ();  strcpy(haslo, buff);

        splik = fopen(".tmpek", "w");
//      tmp = fopen(".tmpek2", "w+");

        rewind(plik);
;       while( (znak = getc(plik)) != EOF )
                putc(znak-1, splik);
        fclose(splik);

        splik = fopen(".tmpek", "r");

        fgets(wiersz, NSTR, splik);

        pomhaslo[0] = '*';pomhaslo[1] = '\0';
        strcat(pomhaslo, haslo); strcat(pomhaslo, "\n");// printf("%s i %s", wiersz, pomhaslo);
        if(strcmp(wiersz, pomhaslo) != 0){printf("\n\nZle haslo! \n\n"); return;}
//ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
        //printf("teste\nteste\nteste\nteste\n");

        for(i = 0; i < NBUDZETOW; i++) {
                fgets(wiersz, 4*NSTR, splik); while(wiersz[j] != '\0') { if(wiersz[j] == '\n') wiersz[j] = '\0'; j++; } j = 0;
                strcpy(budzet[i], wiersz);
                if(strlen(budzet[i]) > 0) licz++;    
                //printf("budzet: %s\n", budzet[i]);
        }
//      
        ilosc_budzetow = licz;
// budzety zostaly wczytane jusz w tym miejscu
        licz = 0;
        for(i = 0; i < (NBUDZETOW*NMAX); i++)
                l_trans[i] = 0;
        for(i = 0; i < (NBUDZETOW); i++)
                saldo[i] = 0.0;
        while((znak = getc(splik)) != '\t'){
                ungetc(znak, splik);
                while((znak = getc(splik)) != '\n'){
                        ungetc(znak, splik);
                                // ROK *****************************************************************************************************
                                i = 0;  czysc_buff ();
                                while((znak = getc(splik)) != ';'){
                                        buff[i] = znak;
                                        i++;
                                }
                                buff[i+1] = '\0';
                                if(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] < '0' || buff[2] > '9' || buff[3] < '0' || buff[3] > '9' || buff[4] != '\0' || (rekord[licz].data.rok = atoi(buff)) > 2100) // rok max np 2100
                                {
                                        printf("UWAGA!! Bledny rok %s! Odczyt przerwany! Wiersz transakcji nr %i. \n", buff, licz);
                                        return;
                                }
                                // MIESIAC *****************************************************************************************************
                                i = 0;  czysc_buff ();
                                while((znak = getc(splik)) != ';'){
                                        buff[i] = znak;
                                        i++;
                                }              
                                buff[i+1] = '\0';
                                if(buff[0] < '0' || buff[0] > '9' || ((buff[1] < '0' || buff[1] > '9') && buff[1]) != '\0' || buff[2] != '\0' || (rekord[licz].data.miesiac = atoi(buff)) > 12 || (buff[0] == '0' && buff[1] == '0'))
                                {
                                        printf("UWAGA!! Bledny miesiac %s!  Wiersz transakcji nr %i. \n", buff, licz);
                                        return;
                                }
                                
                                // DZIEN *****************************************************************************************************
                                i = 0;  czysc_buff ();
                                while((znak = getc(splik)) != ';'){
                                        buff[i] = znak;
                                        i++;
                                }              
                                buff[i+1] = '\0';
                                if(buff[0] < '0' || buff[0] > '9' || ((buff[1] < '0' || buff[1] > '9') && buff[1]) != '\0' || buff[2] != '\0' || (rekord[licz].data.dzien = atoi(buff)) > 31 || (buff[0] == '0' && buff[1] == '0'))
                                {
                                        printf("UWAGA!! Bledny dzien %s!  Wiersz transakcji nr %i. \n", buff, licz);
                                        return;
                                }
                                // KWOTA *****************************************************************************************************
                                i = 0;  czysc_buff ();
                                while((znak = getc(splik)) != ';'){
                                        buff[i] = znak;
                                        i++;
                                }
                                buff[i+1] = '\0';
                                blad = 0;
                                kropka = 0;
                                if(buff[j] != '\0' && blad == 0)
                                {
                                if(buff[j] == '.')  // "zabawy z kropka" liczby zmiennoprzecinkowe
                                        if(kropka == 0)
                                                kropka = 1;
                                        else if (kropka == 1)
                                                blad = 1;
                                        if(j == 0 && buff[0] == '-') // akceptacja kwoty ujemnej
                                        { j++; continue; }
                                        if((buff[j] >= '0' && buff[j] <= '9') || buff[j] == '.') { } else {blad = 1;}
                                j++;
                                
                                }
                                if(blad == 1)
                                {
                                printf("UWAGA!! Bledna kwota %s!  Wiersz transakcji nr %i. \n", buff, licz);
                                        return;
                                }
                                rekord[licz].kwota = atof(buff);
                                // KONTRAHENT *****************************************************************************************************
                                i = 0;  czysc_buff ();
                                while((znak = getc(splik)) != ';'){
                                        buff[i] = znak;
                                        i++;
                                }
                                buff[i+1] = '\0';
                                strcpy(rekord[licz].kontrahent, buff);
                                // OPIS *****************************************************************************************************
                                i = 0;  czysc_buff ();
                                while((znak = getc(splik)) != ';'){
                                        buff[i] = znak;
                                        i++;
                                }
                                buff[i+1] = '\0';
                                strcpy(rekord[licz].opis, buff);
                                // KATALOG *****************************************************************************************************
                                i = 0;  czysc_buff ();
                                while((znak = getc(splik)) != ';'){
                                        buff[i] = znak;
                                        i++;
                                }
                                buff[i+1] = '\0';
                                if(!znajdz_wezel(root, buff)){
                                printf("UWAGA!! Bledny katalog %s!  Wiersz transakcji nr %i. \n", buff, licz);
                                        return;
                                }
                                
                                rekord[licz].katalog = znajdz_wezel(root, buff);
                                // NUMER BUDZETU *****************************************************************************************************
                                i = 0;  czysc_buff ();
                                while((znak = getc(splik)) != ';'){
                                        buff[i] = znak;
                                        i++;
                                }
                                buff[i+1] = '\0';
                                if(atoi(buff) >= NBUDZETOW || atoi(buff) < 0){
                                printf("UWAGA!! Bledny budzet %s!  Wiersz transakcji nr %i. \n", buff, licz);
                                        return;
                                }
                                
                                rekord[licz].nr_budzetu = atoi(buff);
                                l_trans[rekord[licz].nr_budzetu]++;
                                saldo[rekord[licz].nr_budzetu] = saldo[rekord[licz].nr_budzetu] + rekord[licz].kwota;
                                licz++;
                                l_wszystkich_t = licz;
                }
        }
// mamy wczytane transakcje teraz czas na strukture katalogoow
        getc(splik);
        root->pocz = NULL;  // ciach
        while(fscanf(splik, "%s%s", &nad, &pod) != EOF && znajdz_wezel(root, nad)) { //printf("\n\n%s i %s\n\n", nad, pod);
                        cel = znajdz_wezel(root, nad);
                        kat = (struct wezel_drzewa *)malloc(sizeof(struct wezel_drzewa));    
                        strcpy(kat->katalog, pod);
                        dodaj_katalog (cel, kat);
        }  //if(!znajdz_wezel(root, nad)) printf("Blad!! nie mozna utworzyc katalogu!\n\n");

//ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
        fclose(splik);
//      fclose(tmp);
        remove(".tmpek");
}

void odczyt_z_plik_form () {
        char nazwa[NSTR];
        int i, znak;
        

        printf("Podaj nazwe pliku z ktorego odczytac dane: ");  wczyt_do_buf ();  strcpy(nazwa, buff);
        if( (plik = fopen(nazwa, "r")) == NULL ) {
                printf("\n\nNie moge odworzyc pliku %s ! \n\n", nazwa);
                return;
        }
        
//printf("KONTROLLLLLAAA    X");
if((znak = getc(plik)) == '+')
        {
        ungetc(znak, plik);
        odczyt_szyfr_z_plik ();         // poprawic dodac rozpoznawanie pliku szyf i nie
        }
else    {
        ungetc(znak, plik);
        odczyt_z_plik ();
        }

        fclose(plik);
        
}


void przychody_rozchody_katalogi(struct wezel_drzewa *dany_katalog) {
        int i;
        double przychody = 0.0, odchody = 0.0;

        for(i = 0; i < l_wszystkich_t; i++)
                if(rekord[i].katalog == dany_katalog)
                {
                        if(rekord[i].kwota > 0.0)
                                przychody += rekord[i].kwota;
                        else
                                odchody += rekord[i].kwota;
                }
        printf("p: %.2lf, r: %.2lf", przychody, odchody);
}

int czy_mbudzetowa (int nr_tr) {  // funkcja dostaje numer transakcji i zwraca 1 lub -1 jest transakcja jest miedzybudzetowa i 0 jesli nie jest
        if(nr_tr > 0)
                if((rekord[nr_tr].nr_budzetu == ktory_budzet || rekord[nr_tr-1].nr_budzetu == ktory_budzet) && rekord[nr_tr].data.rok == rekord[nr_tr-1].data.rok && rekord[nr_tr].data.miesiac == rekord[nr_tr-1].data.miesiac && rekord[nr_tr].data.dzien == rekord[nr_tr-1].data.dzien && rekord[nr_tr].katalog == rekord[nr_tr-1].katalog && rekord[nr_tr].kwota == -rekord[nr_tr-1].kwota && !strcmp(rekord[nr_tr].kontrahent, rekord[nr_tr-1].kontrahent) && !strcmp(rekord[nr_tr].opis, rekord[nr_tr-1].opis))
                return -1;
        if(nr_tr < l_wszystkich_t-1)
                if((rekord[nr_tr].nr_budzetu == ktory_budzet || rekord[nr_tr+1].nr_budzetu == ktory_budzet) && rekord[nr_tr].data.rok == rekord[nr_tr+1].data.rok && rekord[nr_tr].data.miesiac == rekord[nr_tr+1].data.miesiac && rekord[nr_tr].data.dzien == rekord[nr_tr+1].data.dzien && rekord[nr_tr].katalog == rekord[nr_tr+1].katalog && rekord[nr_tr].kwota == -rekord[nr_tr+1].kwota && !strcmp(rekord[nr_tr].kontrahent, rekord[nr_tr+1].kontrahent) && !strcmp(rekord[nr_tr].opis, rekord[nr_tr+1].opis))
                return 1;
        
return 0;
}


void przychody_rozchody_mtransakcje() {
        int i;
        double przychody = 0.0, odchody = 0.0;

        for(i = 1; i <= l_wszystkich_t; i++)
        {      
                if((rekord[i].nr_budzetu == ktory_budzet || rekord[i-1].nr_budzetu == ktory_budzet) && rekord[i].data.rok == rekord[i-1].data.rok && rekord[i].data.miesiac == rekord[i-1].data.miesiac && rekord[i].data.dzien == rekord[i-1].data.dzien && rekord[i].katalog == rekord[i-1].katalog && rekord[i].kwota == -rekord[i-1].kwota && !strcmp(rekord[i].kontrahent, rekord[i-1].kontrahent) && !strcmp(rekord[i].opis, rekord[i-1].opis))
                {
                        if(rekord[i].nr_budzetu == ktory_budzet)
                        {
                                if(rekord[i].kwota <= 0.0)
                                        odchody += rekord[i].kwota;
                                else
                                        przychody += rekord[i].kwota;
                        }
                        else
                        {
                                if(rekord[i-1].kwota <= 0.0)
                                        odchody += rekord[i-1].kwota;
                                else
                                        przychody += rekord[i-1].kwota;
                        }
                }
        //printf("\n\nliczba transakcji - %i\n\n", l_wszystkich_t);
        //printf("%i   |       %i\n", rekord[i-1].nr_budzetu, rekord[i].nr_budzetu);
        //printf("%i/%i/%i     |       %i/%i/%i\n", rekord[i-1].data.rok, rekord[i-1].data.miesiac, rekord[i-1].data.dzien, rekord[i].data.rok, //rekord[i].data.miesiac, rekord[i].data.dzien);
        //printf("%s   |       %s\n", rekord[i-1].katalog->katalog, rekord[i].katalog->katalog);      
        //printf("%.2lf        |       %.2lf\n", rekord[i-1].kwota, -rekord[i].kwota);
        //printf("%s   |       %s\n", rekord[i-1].kontrahent, rekord[i].kontrahent);
        //printf("%s   |       %s\n", rekord[i-1].opis, rekord[i].opis);
        }
        printf("\n\nBilans z innymi budzetami przychody: %.2lf, rozchody: %.2lf\n\n", przychody, odchody);
}


void wypisz_drzewo (struct wezel_drzewa *root) {
        struct wezel_drzewa *aktualny;
        struct lista *l_temp;
        static int wciecie = 1;
        int i = 0;

        for(i = 0; i < wciecie; i++)
                printf("---");
        aktualny = root;
        printf("/%s            ", aktualny->katalog);  przychody_rozchody_katalogi(znajdz_wezel(root, aktualny->katalog)); printf("\n");

        l_temp = root->pocz;
                while(l_temp != NULL)
                {
                        wciecie++;
                        wypisz_drzewo(l_temp->wsk);
                        l_temp = l_temp->next;
                        wciecie--;
                }
                
}



void dodaj_element_listy (struct lista **root, struct wezel_drzewa *wsk) {
        struct lista *temp;
        struct lista *temp2;
        int i = 0;
        
        temp = (struct lista *)malloc(sizeof(struct lista));
        temp->next = NULL;
        temp->wsk = wsk;
        if(*root == NULL)
                *root = temp;
        else
        {
                temp2 = *root;
                while(temp2->next != NULL)
                        temp2 = temp2->next;
                temp2->next = temp;
        }
}

void dodaj_katalog (struct wezel_drzewa *doktorego, struct wezel_drzewa *w_nazwa) {
        struct wezel_drzewa *wsk_znal, *temp;
        int licz = 1;
        char temp_str2[NSTR];

        if(doktorego == NULL)
        {
                printf("Podaj nazwe wezla, do ktorego mamy wstawic element: ");   wczyt_do_buf ();  sprawdz_dane(32, -1);   //scanf("%s", nazwa);
                strcpy(nazwa, buff);
                wsk_znal = znajdz_wezel(root, nazwa);
        }
        else
        {
                wsk_znal = doktorego;
        }
        
        if(wsk_znal != NULL)
        {
                temp = (struct wezel_drzewa *)malloc(sizeof(struct wezel_drzewa));
                if(w_nazwa == NULL)
                {              
                        printf("Podaj nazwe nowego katalogu: ");    wczyt_do_buf ();  sprawdz_dane(31, -1);           //scanf("%s", nazwa2);
                        strcpy(nazwa2, buff);
                }
                else
                {
                        strcpy(temp_str2, w_nazwa->katalog);
                        while(znajdz_wezel(root, temp_str2) != NULL)
                        {
                //    sprintf(temp_str, "*", licz);
                        strcat(temp_str2, "*");
                        licz++;
                        }
                        strcpy(nazwa2, temp_str2);
                }
                strcpy(temp->katalog, nazwa2);
                temp->pocz = NULL;
                temp->nad_drzewo = wsk_znal;
                dodaj_element_listy(&wsk_znal->pocz, temp);
        //wypisz_drzewo(root);
        }
        
}
void zmiana_nazwy_katalogu ()
{
        struct wezel_drzewa *wsk_znal;
        //while(wsk_znal == NULL)
        printf("Podaj nazwe katalogu do zmiany: ");   wczyt_do_buf ();  sprawdz_dane(32, -1);  strcpy(nazwa, buff);// scanf("%s", nazwa);
        wsk_znal = znajdz_wezel(root, nazwa);
        printf("Podaj nowa nazwe katalogu: ");   wczyt_do_buf ();  sprawdz_dane(31, -1);  strcpy(nazwa, buff);// scanf("%s", nazwa);
        strcpy(wsk_znal->katalog, nazwa);
}

int usun_katalog()
{
        struct wezel_drzewa *wsk_znal, *nad_wsk_znal, *d_temp;
        struct lista *temp;
        //while(wsk_znal == NULL)
        printf("Podaj nazwê katalogu do usuniecia: ");   wczyt_do_buf ();  sprawdz_dane(32, -1);  strcpy(nazwa, buff); //scanf("%s", nazwa);
        wsk_znal = znajdz_wezel(root, nazwa);
        nad_wsk_znal = wsk_znal->nad_drzewo;

        if(nad_wsk_znal == NULL)
        {
                printf("Nie mozna usunac glownego katalogu!\n");
                return 0;
        }

        temp = nad_wsk_znal->pocz;
        while(temp->next != NULL)
                temp = temp->next;
        temp->next = wsk_znal->pocz;

        
        temp = nad_wsk_znal->pocz;
        if(strcmp(nad_wsk_znal->pocz->wsk->katalog, nazwa) == 0)
                nad_wsk_znal->pocz = nad_wsk_znal->pocz->next;
        else {
                while(1)
                {
                        if(strcmp(temp->next->wsk->katalog, nazwa) == 0)
                                {       temp->next = temp->next->next; break;  }
                        else
                                temp = temp->next;
                }

        }
        free(wsk_znal);
}

void katalog_przenies (){
        struct wezel_drzewa *wsk_znal, *nad_wsk_znal, *wsk_znal2, *nad_wsk_znal2;
        struct lista *temp, *temp2, *pom;

        printf("Podaj nazwe katalogu do przeniesienia: ");   wczyt_do_buf ();  sprawdz_dane(32, -1);  strcpy(nazwa, buff); // scanf("%s", nazwa);
        printf("Podaj nazwe katalogu do którego podczepic katalog: ");   wczyt_do_buf ();  sprawdz_dane(32, -1);  strcpy(nazwa2, buff); //scanf("%s", nazwa2);
        
        if(strcmp(root->katalog, nazwa) == 0) {
                printf("\n\nNie mozna przeniesc drzewa z korzeniem!;] \n\n"); return;
        }

        wsk_znal = znajdz_wezel(root, nazwa);
        nad_wsk_znal = wsk_znal->nad_drzewo;
        temp = nad_wsk_znal->pocz;
        
        if(znajdz_wezel(wsk_znal, nazwa2)) {
                printf("\n\nNie mozna przeniesc katalogu nadrzednego do podrzednego! \n\n"); return;
        }

        if(strcmp(temp->wsk->katalog, nazwa) == 0)
        {
                nad_wsk_znal->pocz = nad_wsk_znal->pocz->next;
                temp->next = NULL;
        }
        else
        {
                while(strcmp(temp->next->wsk->katalog, nazwa) != 0)
                temp = temp->next;
        
        pom = temp;
        temp = temp->next;
        pom->next = pom->next->next;
        temp->next = NULL;
        }

        wsk_znal2 = znajdz_wezel(root, nazwa2);
        if(wsk_znal2->pocz == NULL)
                wsk_znal2->pocz = temp;
        else
        {
        temp2 = wsk_znal2->pocz;
        while(temp2->next != NULL)
                temp2 = temp2->next;
        temp2->next = temp;
        }
        wsk_znal->nad_drzewo = wsk_znal2;
}

void tworz_kopie_drzewo (struct wezel_drzewa *kopiowany, struct wezel_drzewa *cel) {

        struct lista *l_temp, *pom;


        dodaj_katalog (cel, kopiowany);

        l_temp = kopiowany->pocz;
        pom = cel->pocz;
                while(l_temp != NULL)
                {
                        tworz_kopie_drzewo(l_temp->wsk, pom->wsk);
                        l_temp = l_temp->next;
                }
                
}

void katalog_kopiuj () {
        struct wezel_drzewa *wsk_znal, *nad_wsk_znal, *wsk_znal2, *nad_wsk_znal2;
        struct lista *temp, *temp2, *pom;

        printf("Podaj nazwe katalogu do skopiowania: ");   wczyt_do_buf ();  sprawdz_dane(32, -1);  strcpy(nazwa, buff);//scanf("%s", nazwa);
        printf("Podaj nazwe katalogu do którego skopiowac katalog: ");   wczyt_do_buf ();  sprawdz_dane(32, -1);  strcpy(nazwa2, buff);//scanf("%s", nazwa2);
        
        wsk_znal = znajdz_wezel(root, nazwa);
        nad_wsk_znal = wsk_znal->nad_drzewo;

        wsk_znal2 = znajdz_wezel(root, nazwa2);

        tworz_kopie_drzewo (wsk_znal, wsk_znal2);
        
}


// +++++++++++++++++++++++++++++++++++++++++++++++++

void czysc_buff (){ // funkcja wykonuje czysczenie bufora [tablicy buff]
        int i;
        
        for(i = 0; i < R_BUFOR; i++)
                buff[i] = '\0';
}
// +++++++++++++++++++++++++++++++++++++++++++++++++
int czy_rowne (char s1[NSTR], char s2[NSTR]){   // funkcja sprawdza czy dwa stringi [tablice znakowe] sa rowne
        int odp = 0, i = 0;
        while(s1[i] == s2[i] && (s1[i] != '\0' || s2[i] != '\0')) {i++; odp = 1;}
        if(s1[i] != s2[i]) odp = 0;

return odp;
}
//++++++++++++++++++++++++++++++++++++++++++++++++
int porownaj_r (char s1[100], char s2[100])   // funkcja porownuje stringi
{
        int i = 0;

        while(s1[i] == s2[i] && (s1[i] != '\0' || s2[i] != '\0')) i++;
        if(s1[i] > s2[i]) // < wyrazy rosnaco
        return 0;
        else
        return 1;

}
//++++++++++++++++++++++++++++++++++++++++++++++++
int porownaj_m (char s1[100], char s2[100]) // funkcja porownuje stringi
{
        int i = 0;

        while(s1[i] == s2[i] && (s1[i] != '\0' || s2[i] != '\0')) i++;
        if(s1[i] < s2[i]) // < wyrazy malejaco
        return 0;
        else
        return 1;

}
//++++++++++++++++++++++++++++++++++++++++++++++++
void wczyt_do_buf () // wczytywanie danych do bufora, niezwykle przydatna funkcja
{
        char znak;
        int i = 0;

        czysc_buff ();
        while((znak = getchar()) != '\n' && znak != EOF)
        {
                if(i < R_BUFOR-1){
                buff[i] = znak;
                i++;
                }
                else if(i == R_BUFOR - 1) {
                buff[R_BUFOR-1] = '\0';
                }
        }
//        fflush(stdin);
}

void sprawdz_dane (int opcja, int  numer_t) // f. sprawdzajaca poprawnosc wprowadzonych danych
{

        int i = 0, j = 0, nr = 0;
        _Bool blad, kropka;

        if(opcja == 1){ // wczytujemy rok
                while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] < '0' || buff[2] > '9' || buff[3] < '0' || buff[3] > '9' || buff[4] != '\0' || (rekord[numer_t].data.rok = atoi(buff)) > 2100) // rok max np 2100
                {
                        printf("Bledny rok %s! Podaj poprawny: ", buff);
                        wczyt_do_buf ();
                }
        }

        if(opcja == 2){ //wczytujemy miech
                while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] != '\0' || (rekord[numer_t].data.miesiac = atoi(buff)) > 12 || (buff[0] == '0' && buff[1] == '0'))
                {
                        printf("Bledny miesiac %s! Podaj poprawny: ", buff);
                        wczyt_do_buf ();
                }
        }
        
        if(opcja == 3){ //wczytujemy dzien
                while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] != '\0' || (rekord[numer_t].data.dzien = atoi(buff)) > 31 || (buff[0] == '0' && buff[1] == '0'))
                {
                        printf("Bledny dzien %s! Podaj poprawny: ", buff);
                        wczyt_do_buf ();
                }
        }

        if(opcja == 4){ //wczytujemy kwote
                        blad = 0;
                        kropka = 0;
                        while(buff[j] != '\0' && blad == 0)
                        {
                                if(buff[j] == '.')  // "zabawy z kropka" liczby zmiennoprzecinkowe
                                        if(kropka == 0)
                                                kropka = 1;
                                        else if (kropka == 1)
                                                blad = 1;
                                        if(j == 0 && buff[0] == '-') // akceptacja kwoty ujemnej
                                        { j++; continue; }
                                        if((buff[j] >= '0' && buff[j] <= '9') || buff[j] == '.') { } else {blad = 1;}
                                j++;
                                
                        }
                        if(blad == 1)
                        {
                                printf("Bledna kwota %s! Podaj poprawna: ", buff);
                                wczyt_do_buf ();
                        }
                        rekord[numer_t].kwota = atof(buff);
        }
        
        if(opcja == 5) { // wprowadzamy kontrahenta
                        while(buff[nr] != '\0'){
                        rekord[numer_t].kontrahent[nr] = buff[nr];
                        nr++;
                        }
                        nr = 0;
        }

        if(opcja == 6) { // wprowadzamy opis
                        while(buff[nr] != '\0'){
                        rekord[numer_t].opis[nr] = buff[nr];
                        nr++;
                        }
                        nr = 0;
        }
        if(opcja == 7) { // wprowadzamy numer transakcji do edycjii
                        while(((ID = atoi(buff)) == 0) || atoi(buff) < 0 || atoi(buff) > l_wszystkich_t || rekord[ID-1].nr_budzetu != ktory_budzet){
                        printf("Bledny numer ID transakcji! Podaj poprawny: ");
                        wczyt_do_buf ();
                        }
        }
        if(opcja == 8) { // sprawdzamy polecanie
                        while(buff[0] < 'a' || buff[0] > 'z' || buff[1] != '\0'){
                        printf("Bledne polecenie! Podaj poprawne: ");
                        wczyt_do_buf ();
                        }
                        c = buff[0];
                        
        }
        if(opcja == 9){ // wczytujemy rok dat min

                while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] < '0' || buff[2] > '9' || buff[3] < '0' || buff[3] > '9' || buff[4] != '\0' || (dat_min.rok = atoi(buff)) > 2100) // rok max np 2100
                {
                printf("Bledny rok %s! Podaj poprawny: ", buff);
                wczyt_do_buf ();
                }
        }
        if(opcja == 10){ //wczytujemy miech dat min
                while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] != '\0' || (dat_min.miesiac = atoi(buff)) > 12 || (buff[0] == '0' && buff[1] == '0'))
                {
                        printf("Bledny miesiac %s! Podaj poprawny: ", buff);
                        wczyt_do_buf ();
                }
        }
        
        if(opcja == 11){ //wczytujemy dzien dat min
                while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] != '\0' || (dat_min.dzien = atoi(buff)) > 31 || (buff[0] == '0' && buff[1] == '0'))
                {
                        printf("Bledny dzien %s! Podaj poprawny: ", buff);
                        wczyt_do_buf ();
                }
        }
        if(opcja == 12){ // wczytujemy rok dat max

                while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] < '0' || buff[2] > '9' || buff[3] < '0' || buff[3] > '9' || buff[4] != '\0' || (dat_max.rok = atoi(buff)) > 2100) // rok max np 2100
                {
                printf("Bledny rok %s! Podaj poprawny: ", buff);
                wczyt_do_buf ();
                }
        }
        if(opcja == 13){ //wczytujemy miech dat max
                while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] != '\0' || (dat_max.miesiac = atoi(buff)) > 12 || (buff[0] == '0' && buff[1] == '0'))
                {
                        printf("Bledny miesiac %s! Podaj poprawny: ", buff);
                        wczyt_do_buf ();
                }
        }
        
        if(opcja == 14){ //wczytujemy dzien dat max
                while(buff[0] < '0' || buff[0] > '9' || buff[1] < '0' || buff[1] > '9' || buff[2] != '\0' || (dat_max.dzien = atoi(buff)) > 31 || (buff[0] == '0' && buff[1] == '0'))
                {
                        printf("Bledny dzien %s! Podaj poprawny: ", buff);
                        wczyt_do_buf ();
                }
        }
        if(opcja == 15){ //wczytujemy kwote min
                        blad = 0;
                        kropka = 0;
                        while(buff[j] != '\0' && blad == 0)
                        {
                                if(buff[j] == '.')  // "zabawy z kropka" liczby zmiennoprzecinkowe
                                        if(kropka == 0)
                                                kropka = 1;
                                        else if (kropka == 1)
                                                blad = 1;
                                        if(j == 0 && buff[0] == '-') // akceptacja kwoty ujemnej
                                        { j++; continue; }
                                        if((buff[j] >= '0' && buff[j] <= '9') || buff[j] == '.') { } else {blad = 1;}
                                j++;
                                
                        }
                        if(blad == 1)
                        {
                                printf("Bledna kwota %s! Podaj poprawna: ", buff);
                                wczyt_do_buf ();
                        }
                        szuk_kwota_min = atof(buff);
        }
        if(opcja == 16){ //wczytujemy kwote max
                        blad = 0;
                        kropka = 0;
                        while(buff[j] != '\0' && blad == 0)
                        {
                                if(buff[j] == '.')  // "zabawy z kropka" liczby zmiennoprzecinkowe
                                        if(kropka == 0)
                                                kropka = 1;
                                        else if (kropka == 1)
                                                blad = 1;
                                        if(j == 0 && buff[0] == '-') // akceptacja kwoty ujemnej
                                        { j++; continue; }
                                        if((buff[j] >= '0' && buff[j] <= '9') || buff[j] == '.') { } else {blad = 1;}
                                j++;
                                
                        }
                        if(blad == 1)
                        {
                                printf("Bledna kwota %s! Podaj poprawna: ", buff);
                                wczyt_do_buf ();
                        }
                        szuk_kwota_max = atof(buff);
        }
        
        if(opcja == 17) { // wprowadzamy kontrahenta
                        while(buff[nr] != '\0'){
                        szuk_kontrahent[nr] = buff[nr];
                        nr++;
                        }
                        nr = 0;
        }
        if(opcja == 18) { // czy z data
                        while((buff[0] != 't' && buff[0] != 'n') || buff[1] != '\0'){
                        printf("Bledne polecenie %s! Podaj poprawne: ", buff);
                        wczyt_do_buf ();
                        }
                        kryt_data = buff[0];
        }
        if(opcja == 19) { // czy z kwota
                        while((buff[0] != 't' && buff[0] != 'n') || buff[1] != '\0'){
                        printf("Bledne polecenie %s! Podaj poprawne: ", buff);
                        wczyt_do_buf ();
                        }
                        kryt_kwota = buff[0];
        }
        if(opcja == 20) { // czy z kontrahent
                        while((buff[0] != 't' && buff[0] != 'n') || buff[1] != '\0'){
                        printf("Bledne polecenie %s! Podaj poprawne: ", buff);
                        wczyt_do_buf ();
                        }
                        kryt_kontrahent = buff[0];
        }
        if(opcja == 21) { // sort
                        while((buff[0] != 'd' && buff[0] != 'k' && buff[0] != 'c') || buff[1] != '\0'){
                        printf("Bledne polecenie %s! Podaj poprawne: ", buff);
                        wczyt_do_buf ();
                        }
                        sort_wgco = buff[0];
        }
        if(opcja == 22) { // sort metoda
                        while((buff[0] != 'r' && buff[0] != 'm') || buff[1] != '\0'){
                        printf("Bledne polecenie %s! Podaj poprawne: ", buff);
                        wczyt_do_buf ();
                        }
                        sort_metoda = buff[0];
        }
        if(opcja == 23) { // sprawdzamy liczbe wyswietlanych transakcji po sortowaniu
                        while(((sort_ile = atoi(buff)) == 0) || atoi(buff) < 0 || atoi(buff) > l_trans[ktory_budzet]){
                        printf("Bledna liczba transakcji do wyswietlenia! Podaj poprawna: ");
                        wczyt_do_buf ();
                        }
        }
        if(opcja == 24) { // sprawdzamy liczbe wyswietlanych transakcji po sortowaniu
                        while(((ost_ile = atoi(buff)) == 0) || atoi(buff) < 0 || atoi(buff) > szuk){
                        printf("Bledna liczba transakcji do wyswietlenia! Podaj poprawna: ");
                        wczyt_do_buf ();
                        }
        }
        if(opcja == 25) { // sprawdzanie poprawnosci nazwy nowego budzetu
                        while(buff[nr] != '\0' && nr < NSTR-1){
                        budzet[ilosc_budzetow][nr] = buff[nr];
                        nr++;
                        }
                        nr = 0;
                        czysc_buff (); // czyscimy buff-a
                        }
        if(opcja == 26) { // sprawdzanie poprawnosci wyboru budzetu
                        while(atoi(buff) < 1 || atoi(buff) >= ilosc_budzetow+1)
                        {
                        printf("Bledny [%s] numer! Podaj poprawny: ", buff);
                        wczyt_do_buf ();
                        }
                        ktory_budzet = atoi(buff)-1;// printf("ktory: %d \n\n\n\n", ktory_budzet);
                        }
        if(opcja == 27) { // czy z kontrahent
                        while((buff[0] != 't' && buff[0] != 'n') || buff[1] != '\0'){
                        printf("Bledne polecenie %s! Podaj poprawne: ", buff);
                        wczyt_do_buf ();
                        }
                        nowy_budzet = buff[0];
                        }
        if(opcja == 28) { // sprawdzanie poprawnosci wyboru budzetu
                        while(atoi(buff) < 1 || atoi(buff) >= ilosc_budzetow+1 || (atoi(buff)-1) == ktory_budzet)
                        {
                        printf("Bledny [%s] numer! Podaj poprawny: ", buff);
                        wczyt_do_buf ();
                        }
                        z_budzet = atoi(buff)-1;// printf("ktory: %d \n\n\n\n", ktory_budzet);
                        }
        if(opcja == 29) { // sprawdzamy polecanie
                        while(buff[0] < 'a' || buff[0] > 'z' || buff[1] != '\0'){
                        printf("Bledne polecenie! Podaj poprawne: ");
                        wczyt_do_buf ();
                        }
                        k = buff[0];
                        
        }
        if(opcja == 30) { // sprawdzamy poprawnosc nazwy katalogu
                        while(!znajdz_wezel(root, buff)){
                        printf("Nie ma takiego katalogu! Wybierz inny: ");
                        wczyt_do_buf ();
                        }
                        
                        rekord[numer_t].katalog = znajdz_wezel(root, buff);
        }
        if(opcja == 31) { // sprawdzamy poprawnosc nazwy katalogu
                        while(znajdz_wezel(root, buff)){
                        printf("Taki katalog juz istanieje! Wpisz inna nazwe: ");
                        wczyt_do_buf ();
                        }
        }
        if(opcja == 32) { // sprawdzamy poprawnosc nazwy katalogu
                        while(!znajdz_wezel(root, buff)){
                        printf("Taki katalog nie istanieje! Wpisz inna nazwe: ");
                        wczyt_do_buf ();
                        }
        }
        if(opcja == 33) { // czy z szyfrowanie
                        while((buff[0] != 't' && buff[0] != 'n') || buff[1] != '\0'){
                        printf("Bledne polecenie %s! Podaj poprawne: ", buff);
                        wczyt_do_buf ();
                        }
                        szyfrowanie = buff[0];
        }
}
// ++++++++++++++++++++++++++++++++++++++++++++++++
int dodaj_transakcje (char m) // funkcja dodajaca transakcje
{
//      char tab[40*NSTR+1], pom[255];
//      char c;
        int i = 0, li_str = 0;
        
        if(l_trans[ktory_budzet] == NMAX)
        {
                edytuj_transakcje ('m', nr_najstarszej_tr[ktory_budzet]);
                nr_najstarszej_tr[ktory_budzet]++;
                nr_najstarszej_tr[ktory_budzet] = nr_najstarszej_tr[ktory_budzet] % NMAX;
        }
        else
        {
//      getchar();
        printf("Uzupelnij dane: \n");
        
        if(m == 'm')
        {
                for(i = 1; i <= ilosc_budzetow; i++)
                        printf("%d. %s\n", i, budzet[i-1]);
                printf("\nWpisz numer budzetu z ktorym chcesz przeprowadzic transakcje: ");  wczyt_do_buf ();  sprawdz_dane(28, -1);
        }

        printf("                       Rok [format YYYY]: "); wczyt_do_buf (); sprawdz_dane (1, l_wszystkich_t);
        printf("                       Miesiac [format MM]: "); wczyt_do_buf (); sprawdz_dane (2, l_wszystkich_t);
        printf("                       Dzien [format DD]: "); wczyt_do_buf (); sprawdz_dane (3, l_wszystkich_t);
        printf("- kwota transakcji: ");      wczyt_do_buf (); sprawdz_dane (4, l_wszystkich_t);
        printf("- kontrahent: "); wczyt_do_buf (); sprawdz_dane (5, l_wszystkich_t);
        printf("- opis: "); wczyt_do_buf ();  sprawdz_dane (6, l_wszystkich_t);
        wypisz_drzewo(root);
        printf("\n- wybierz nazwe katalogu: "); wczyt_do_buf ();  sprawdz_dane (30, l_wszystkich_t);

        rekord[l_wszystkich_t].nr_budzetu = ktory_budzet;   // transakcja dodawana jest do obeznego budzetu
        printf("\nTransakcja przyjeta :) \n\n");
        saldo[ktory_budzet] = saldo[ktory_budzet] + rekord[l_wszystkich_t].kwota;
        l_trans[ktory_budzet]++;
        l_wszystkich_t++;

        if(m == 'm')
        {       if(l_trans[z_budzet] == NMAX) return 1;
                rekord[l_wszystkich_t].data.rok = rekord[l_wszystkich_t-1].data.rok;
                rekord[l_wszystkich_t].data.miesiac = rekord[l_wszystkich_t-1].data.miesiac;
                rekord[l_wszystkich_t].data.dzien = rekord[l_wszystkich_t-1].data.dzien;
                rekord[l_wszystkich_t].kwota = -rekord[l_wszystkich_t-1].kwota;
                while(rekord[l_wszystkich_t-1].kontrahent[li_str] != '\0') { rekord[l_wszystkich_t].kontrahent[li_str] = rekord[l_wszystkich_t-1].kontrahent[li_str]; li_str++;} li_str = 0;
                while(rekord[l_wszystkich_t-1].opis[li_str] != '\0') { rekord[l_wszystkich_t].opis[li_str] = rekord[l_wszystkich_t-1].opis[li_str]; li_str++;} li_str = 0;
                rekord[l_wszystkich_t].katalog = rekord[l_wszystkich_t-1].katalog;
                rekord[l_wszystkich_t].nr_budzetu = z_budzet;
                saldo[z_budzet] = saldo[z_budzet] + rekord[l_wszystkich_t].kwota; //taprintf("kwota odj: %lf i %lf\n\n", rekord[l_wszystkich_t].kwota, rekord[l_wszystkich_t-1].kwota);
                l_trans[z_budzet]++;
                l_wszystkich_t++;
                z_budzet = -1;
        }
        }
        return 1;
}
// +++++++++++++++++++++++++++++++++++++++++++++++
void posortowane_pokaz (int n) // funkcja wyswietla wynik sortowania
{
        int i;

        printf("\nWynik sortowania: \n");
        printf(" ID ||    data    ||   kwota  || kontrahent || katalog  || opis\n");
        printf("--------------------------------------------------------\n");
        for(i = 1; i <= n; i++){
                printf("%3d || %4i-%2d-%2d || %8.2lf || %10s ||  %15s || %10s\n", i, sorty[i-1]->data.rok, sorty[i-1]->data.miesiac, sorty[i-1]->data.dzien, sorty[i-1]->kwota, sorty[i-1]->kontrahent, sorty[i-1]->katalog->katalog, sorty[i-1]->opis);
        }
        printf("--------------------------------------------------------\n");

}
// +++++++++++++++++++++++++++++++++++++++++++++++
void sortuj_transakcje (char wg_danych, char metoda) // wg_danych: d - daty, k - kwoty, c - kontrahent | metoda: r - rosnaco, m - malejaco
{
        int i = 0, j = 0;
        struct transakcja *tmp;        

        for(i = 0; i < l_wszystkich_t; i++)
        {
        sorty[i] = &rekord[i];
//      printf("Tablica: %i, Sorty: %i \n", rekord[i].data.rok, sorty[i]->data.rok);    
        }

        if(wg_danych == 'd')
        {
                if(metoda == 'r')
                {
                        for(i = 0; i < l_wszystkich_t; i++)
                        {      
                                for(j = 1; j < l_wszystkich_t; j++)
                                {
                                // printf("j: %d; j-1:%d    ", sorty[j]->nr_budzetu, sorty[j-1]->nr_budzetu);
                                if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu == ktory_budzet)
                                {
                                        if(sorty[j]->data.rok < sorty[j-1]->data.rok)
                                        {
                                                tmp = sorty[j];
                                                sorty[j] = sorty[j-1];
                                                sorty[j-1] = tmp;
                                        }
                                        if(sorty[j]->data.rok == sorty[j-1]->data.rok)
                                        {
                                                if(sorty[j]->data.miesiac < sorty[j-1]->data.miesiac)
                                                {
                                                tmp = sorty[j];
                                                sorty[j] = sorty[j-1];
                                                sorty[j-1] = tmp;
                                                }
                                                if(sorty[j]->data.miesiac == sorty[j-1]->data.miesiac)
                                                {
                                                        if(sorty[j]->data.dzien < sorty[j-1]->data.dzien)
                                                        {
                                                        tmp = sorty[j];
                                                        sorty[j] = sorty[j-1];
                                                        sorty[j-1] = tmp;
                                                        }
                                                }
                                        }
                                //printf("pierwszy\n");
                                }
                                if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu != ktory_budzet)
                                {
                                                tmp = sorty[j];
                                                sorty[j] = sorty[j-1];
                                                sorty[j-1] = tmp;
                                //  printf("drugi\n");
                                }
                                }
                        }
                posortowane_pokaz (sort_ile);
                }
                if(metoda == 'm')
                {
                        for(i = 0; i < l_wszystkich_t; i++)
                        {
                                for(j = 1; j < l_wszystkich_t; j++)
                                {
                                if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu == ktory_budzet)
                                {
                                        if(sorty[j]->data.rok > sorty[j-1]->data.rok)
                                        {
                                                tmp = sorty[j];
                                                sorty[j] = sorty[j-1];
                                                sorty[j-1] = tmp;
                                        }
                                        if(sorty[j]->data.rok == sorty[j-1]->data.rok)
                                        {
                                                if(sorty[j]->data.miesiac > sorty[j-1]->data.miesiac)
                                                {
                                                tmp = sorty[j];
                                                sorty[j] = sorty[j-1];
                                                sorty[j-1] = tmp;
                                                }
                                                if(sorty[j]->data.miesiac == sorty[j-1]->data.miesiac)
                                                {
                                                        if(sorty[j]->data.dzien > sorty[j-1]->data.dzien)
                                                        {
                                                        tmp = sorty[j];
                                                        sorty[j] = sorty[j-1];
                                                        sorty[j-1] = tmp;
                                                        }
                                                }
                                        }
                                }
                                if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu != ktory_budzet)
                                {
                                                tmp = sorty[j];
                                                sorty[j] = sorty[j-1];
                                                sorty[j-1] = tmp;
                                }
                                }
                        }
                posortowane_pokaz (sort_ile);
                }
        }
        if(wg_danych == 'k')
        {
                if(metoda == 'r')
                {
                        for(i = 0; i < l_wszystkich_t; i++)
                        {
                                for(j = 1; j < l_wszystkich_t; j++)
                                {
                                if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu == ktory_budzet)
                                {      
                                        if(sorty[j]->kwota < sorty[j-1]->kwota)
                                        {
                                                tmp = sorty[j];
                                                sorty[j] = sorty[j-1];
                                                sorty[j-1] = tmp;
                                        }
                                }
                                if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu != ktory_budzet)
                                {
                                                tmp = sorty[j];
                                                sorty[j] = sorty[j-1];
                                                sorty[j-1] = tmp;
                                }
                                }
                        }
                posortowane_pokaz (sort_ile);
                }
                if(metoda == 'm')
                {
                        for(i = 0; i < l_wszystkich_t; i++)
                        {
                                for(j = 1; j < l_wszystkich_t; j++)
                                {
                                if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu == ktory_budzet)
                                {
                                        if(sorty[j]->kwota > sorty[j-1]->kwota)
                                        {
                                                tmp = sorty[j];
                                                sorty[j] = sorty[j-1];
                                                sorty[j-1] = tmp;
                                        }
                                }
                                if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu != ktory_budzet)
                                {
                                                tmp = sorty[j];
                                                sorty[j] = sorty[j-1];
                                                sorty[j-1] = tmp;
                                }
                                }
                        }
                posortowane_pokaz (sort_ile);
                }
        }
        if(wg_danych == 'c')
        {
                if(metoda == 'r')
                {
                        for(i = 0; i < l_wszystkich_t; i++)
                        {
                                for(j = 1; j < l_wszystkich_t; j++)
                                {
                                if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu == ktory_budzet)
                                {
                                        if(porownaj_r(sorty[j]->kontrahent, sorty[j-1]->kontrahent))
                                        {
                                                tmp = sorty[j];
                                                sorty[j] = sorty[j-1];
                                                sorty[j-1] = tmp;
                                        }
                                }
                                if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu != ktory_budzet)
                                {
                                                tmp = sorty[j];
                                                sorty[j] = sorty[j-1];
                                                sorty[j-1] = tmp;
                                }
                                }
                        }
                posortowane_pokaz (sort_ile);
                }
                if(metoda == 'm')
                {
                        for(i = 0; i < l_wszystkich_t; i++)
                        {
                                for(j = 1; j < l_wszystkich_t; j++)
                                {
                                if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu == ktory_budzet)
                                {
                                        if(porownaj_m(sorty[j]->kontrahent, sorty[j-1]->kontrahent))
                                        {
                                                tmp = sorty[j];
                                                sorty[j] = sorty[j-1];
                                                sorty[j-1] = tmp;
                                        }
                                }
                                if(sorty[j]->nr_budzetu == ktory_budzet && sorty[j-1]->nr_budzetu != ktory_budzet)
                                {
                                                tmp = sorty[j];
                                                sorty[j] = sorty[j-1];
                                                sorty[j-1] = tmp;
                                }
                                }
                        }
                posortowane_pokaz (sort_ile);
                }
        }
}
// +++++++++++++++++++++++++++++++++++++++++++++++
int sortuj_formularz () // wprowadzamy parametry sortowania
{
        if(l_trans[ktory_budzet] == 0){ printf("Brak transakcji do sortowania\n\n"); return 1;}
        printf("Wedlug jakich danych chcesz sortowac? [d - daty, k - kwoty, c - kontrahenta]: ");  wczyt_do_buf (); sprawdz_dane (21, -1);
        printf("Rosnaco czy malejaco? [r - rosnaco, m - malejaco]: ");  wczyt_do_buf (); sprawdz_dane (22, -1);
        printf("Ile pierwszych transakcji wyswietlic?: ");  wczyt_do_buf (); sprawdz_dane (23, -1);

        sortuj_transakcje (sort_wgco, sort_metoda);
        return 1;
}
// +++++++++++++++++++++++++++++++++++++++++++++++
void wyswietl_transakcje () // wyswietlamy transakcje aktualnie przechowywane w programie
{

        int li = 1, sumat = 0;

        //for(li = 0; li <= (NBUDZETOW*NMAX); li++)
        //     sumat += l_trans[li];  //printf("sumat: %d \n\n\n\n", sumat);
                                        //printf("ktory_budzet: %d \n\n\n\n", ktory_budzet);
        printf("\nProgram przechowuje nastepujace transakcje: \n");
        printf(" ID ||    data    ||   kwota  || kontrahent || katalog    || opis\n");
        printf("--------------------------------------------------------\n");
        for(li = 1; li <= l_wszystkich_t; li++){
                if(rekord[li-1].nr_budzetu == ktory_budzet && rekord[li-1].data.rok != 0)
                printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s || %10s\n", li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].katalog->katalog, rekord[li-1].opis/*, rekord[li-1].nr_budzetu*/);
        }
//      getchar();
        printf("--------------------------------------------------------\n");

}
// +++++++++++++++++++++++++++++++++++++++++++++++
int data_porownaj (int r1, int m1, int d1, int r2, int m2, int d2) // funkcja porownujaca dwie daty
{
        int data1 = 0, data2 = 0;

        data1 = d1+31*m1+12*31*r1;
        data2 = d2+31*m2+12*31*r2;

        if(data1 > data2)
                return 1;
        else
                return 0;
}
// +++++++++++++++++++++++++++++++++++++++++++++++
void szukaj_transakcje () // funkcja wyszukujaca transakcje
{
        int li = 0, li_str = 0;        
        double zmiana_salda = 0.0;

//      getchar();
        szuk = 0;

        printf("\nCzy szukac wg daty? [t lub n]: "); wczyt_do_buf (); sprawdz_dane (18, -1);
        printf("Czy szukac wg kwoty? [t lub n]: "); wczyt_do_buf (); sprawdz_dane (19, -1);
        printf("Czy szukac wg kontrahenta? [t lub n]: "); wczyt_do_buf (); sprawdz_dane (20, -1);

        printf("\nWpisz kryteria wyszukiwania: \n");
        if(kryt_data == 't'){
        printf("- data poczatkowa: \n");
        printf("                       Rok [format YYYY]: "); wczyt_do_buf (); sprawdz_dane (9, -1);
        printf("                    Miesiac [format MM]: "); wczyt_do_buf (); sprawdz_dane (10, -1);
        printf("                   Dzien [format DD]: "); wczyt_do_buf (); sprawdz_dane (11, -1);
        printf("- data koncowa: \n");
        printf("                       Rok [format YYYY]: "); wczyt_do_buf (); sprawdz_dane (12, -1);
        printf("                    Miesiac [format MM]: "); wczyt_do_buf (); sprawdz_dane (13, -1);
        printf("                   Dzien [format DD]: "); wczyt_do_buf (); sprawdz_dane (14, -1);
        }
        if(kryt_kwota == 't'){
        printf("- minimalna kwota transakcji: ");    wczyt_do_buf (); sprawdz_dane (15, -1);
        printf("- maksymalna kwota transakcji: ");     wczyt_do_buf (); sprawdz_dane (16, -1);
        }
        if(kryt_kontrahent == 't'){
        printf("- kontrahent: "); wczyt_do_buf (); sprawdz_dane (17, -1);
        }
        
        printf("\nWyniki wyszukiwania: \n\n");
        printf("--------------------------------------------------------\n");
        
        if(kryt_data == 't' && kryt_kwota == 't' && kryt_kontrahent == 't')
        {
                for(li = 1; li <= l_wszystkich_t; li++)
                {
                        if(data_porownaj(rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, dat_min.rok, dat_min.miesiac, dat_min.dzien) && data_porownaj(dat_max.rok, dat_max.miesiac, dat_max.dzien, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien) && rekord[li-1].kwota > szuk_kwota_min && rekord[li-1].kwota < szuk_kwota_max && czy_rowne(rekord[li-1].kontrahent, szuk_kontrahent) && rekord[li-1].nr_budzetu == ktory_budzet)
                        {
                        printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n", li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].opis);
                        zmiana_salda = zmiana_salda + rekord[li-1].kwota;
                        
                        ost_wyszukane[szuk].data.rok = rekord[li-1].data.rok;
                        ost_wyszukane[szuk].data.miesiac = rekord[li-1].data.miesiac;
                        ost_wyszukane[szuk].data.dzien = rekord[li-1].data.dzien;
                        ost_wyszukane[szuk].kwota = rekord[li-1].kwota;
                        while(rekord[li-1].kontrahent[li_str] != '\0') { ost_wyszukane[szuk].kontrahent[li_str] = rekord[li-1].kontrahent[li_str]; li_str++;} li_str = 0;
                        while(rekord[li-1].opis[li_str] != '\0') { ost_wyszukane[szuk].opis[li_str] = rekord[li-1].opis[li_str]; li_str++;} li_str = 0;
                        

                        szuk++;
                        }
                }
        }
        
        if(kryt_data == 't' && kryt_kwota == 't' && kryt_kontrahent == 'n')
        {
                for(li = 1; li <= l_wszystkich_t; li++)
                {
                        if(data_porownaj(rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, dat_min.rok, dat_min.miesiac, dat_min.dzien) && data_porownaj(dat_max.rok, dat_max.miesiac, dat_max.dzien, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien) && rekord[li-1].kwota > szuk_kwota_min && rekord[li-1].kwota < szuk_kwota_max && rekord[li-1].nr_budzetu == ktory_budzet)
                        {
                        printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n", li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].opis);
                        zmiana_salda = zmiana_salda + rekord[li-1].kwota;
                        
                        ost_wyszukane[szuk].data.rok = rekord[li-1].data.rok;
                        ost_wyszukane[szuk].data.miesiac = rekord[li-1].data.miesiac;
                        ost_wyszukane[szuk].data.dzien = rekord[li-1].data.dzien;
                        ost_wyszukane[szuk].kwota = rekord[li-1].kwota;
                        while(rekord[li-1].kontrahent[li_str] != '\0') { ost_wyszukane[szuk].kontrahent[li_str] = rekord[li-1].kontrahent[li_str]; li_str++;} li_str = 0;
                        while(rekord[li-1].opis[li_str] != '\0') { ost_wyszukane[szuk].opis[li_str] = rekord[li-1].opis[li_str]; li_str++;} li_str = 0;
                        

                        szuk++;
                        }
                }
        }
        
        if(kryt_data == 'n' && kryt_kwota == 't' && kryt_kontrahent == 't')
        {
                for(li = 1; li <= l_wszystkich_t; li++)
                {
                        if(rekord[li-1].kwota > szuk_kwota_min && rekord[li-1].kwota < szuk_kwota_max && czy_rowne(rekord[li-1].kontrahent, szuk_kontrahent) && rekord[li-1].nr_budzetu == ktory_budzet)
                        {
                        printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n", li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].opis);
                        zmiana_salda = zmiana_salda + rekord[li-1].kwota;
                        
                        ost_wyszukane[szuk].data.rok = rekord[li-1].data.rok;
                        ost_wyszukane[szuk].data.miesiac = rekord[li-1].data.miesiac;
                        ost_wyszukane[szuk].data.dzien = rekord[li-1].data.dzien;
                        ost_wyszukane[szuk].kwota = rekord[li-1].kwota;
                        while(rekord[li-1].kontrahent[li_str] != '\0') { ost_wyszukane[szuk].kontrahent[li_str] = rekord[li-1].kontrahent[li_str]; li_str++;} li_str = 0;
                        while(rekord[li-1].opis[li_str] != '\0') { ost_wyszukane[szuk].opis[li_str] = rekord[li-1].opis[li_str]; li_str++;} li_str = 0;
                        

                        szuk++;
                        }
                }
        }

        if(kryt_data == 't' && kryt_kwota == 'n' && kryt_kontrahent == 't')
        {
                for(li = 1; li <= l_wszystkich_t; li++)
                {
                        if(data_porownaj(rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, dat_min.rok, dat_min.miesiac, dat_min.dzien) && data_porownaj(dat_max.rok, dat_max.miesiac, dat_max.dzien, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien) && czy_rowne(rekord[li-1].kontrahent, szuk_kontrahent) && rekord[li-1].nr_budzetu == ktory_budzet)
                        {
                        printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n", li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].opis);
                        zmiana_salda = zmiana_salda + rekord[li-1].kwota;
                        
                        ost_wyszukane[szuk].data.rok = rekord[li-1].data.rok;
                        ost_wyszukane[szuk].data.miesiac = rekord[li-1].data.miesiac;
                        ost_wyszukane[szuk].data.dzien = rekord[li-1].data.dzien;
                        ost_wyszukane[szuk].kwota = rekord[li-1].kwota;
                        while(rekord[li-1].kontrahent[li_str] != '\0') { ost_wyszukane[szuk].kontrahent[li_str] = rekord[li-1].kontrahent[li_str]; li_str++;} li_str = 0;
                        while(rekord[li-1].opis[li_str] != '\0') { ost_wyszukane[szuk].opis[li_str] = rekord[li-1].opis[li_str]; li_str++;} li_str = 0;
                        

                        szuk++;
                        }
                }
        }

        if(kryt_data == 't' && kryt_kwota == 'n' && kryt_kontrahent == 'n')
        {
                for(li = 1; li <= l_wszystkich_t; li++)
                {
                        if(data_porownaj(rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, dat_min.rok, dat_min.miesiac, dat_min.dzien) && data_porownaj(dat_max.rok, dat_max.miesiac, dat_max.dzien, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien) && rekord[li-1].nr_budzetu == ktory_budzet)
                        {
                        printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n", li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].opis);
                        zmiana_salda = zmiana_salda + rekord[li-1].kwota;
                        
                        ost_wyszukane[szuk].data.rok = rekord[li-1].data.rok;
                        ost_wyszukane[szuk].data.miesiac = rekord[li-1].data.miesiac;
                        ost_wyszukane[szuk].data.dzien = rekord[li-1].data.dzien;
                        ost_wyszukane[szuk].kwota = rekord[li-1].kwota;
                        while(rekord[li-1].kontrahent[li_str] != '\0') { ost_wyszukane[szuk].kontrahent[li_str] = rekord[li-1].kontrahent[li_str]; li_str++;} li_str = 0;
                        while(rekord[li-1].opis[li_str] != '\0') { ost_wyszukane[szuk].opis[li_str] = rekord[li-1].opis[li_str]; li_str++;} li_str = 0;
                        

                        szuk++;
                        }
                }
        }

        if(kryt_data == 'n' && kryt_kwota == 't' && kryt_kontrahent == 'n')
        {
                for(li = 1; li <= l_wszystkich_t; li++)
                {
                        if(rekord[li-1].kwota > szuk_kwota_min && rekord[li-1].kwota < szuk_kwota_max && rekord[li-1].nr_budzetu == ktory_budzet)
                        {
                        printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n", li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].opis);
                        zmiana_salda = zmiana_salda + rekord[li-1].kwota;
                        
                        ost_wyszukane[szuk].data.rok = rekord[li-1].data.rok;
                        ost_wyszukane[szuk].data.miesiac = rekord[li-1].data.miesiac;
                        ost_wyszukane[szuk].data.dzien = rekord[li-1].data.dzien;
                        ost_wyszukane[szuk].kwota = rekord[li-1].kwota;
                        while(rekord[li-1].kontrahent[li_str] != '\0') { ost_wyszukane[szuk].kontrahent[li_str] = rekord[li-1].kontrahent[li_str]; li_str++;} li_str = 0;
                        while(rekord[li-1].opis[li_str] != '\0') { ost_wyszukane[szuk].opis[li_str] = rekord[li-1].opis[li_str]; li_str++;} li_str = 0;
                        

                        szuk++;
                        }
                }
        }

        if(kryt_data == 'n' && kryt_kwota == 'n' && kryt_kontrahent == 't')
        {
                for(li = 1; li <= l_wszystkich_t; li++)
                {
                        if(czy_rowne(rekord[li-1].kontrahent, szuk_kontrahent) && rekord[li-1].nr_budzetu == ktory_budzet)
                        {
                        printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n", li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].opis);
                                zmiana_salda = zmiana_salda + rekord[li-1].kwota;
                        
                        ost_wyszukane[szuk].data.rok = rekord[li-1].data.rok;
                        ost_wyszukane[szuk].data.miesiac = rekord[li-1].data.miesiac;
                        ost_wyszukane[szuk].data.dzien = rekord[li-1].data.dzien;
                        ost_wyszukane[szuk].kwota = rekord[li-1].kwota;
                        while(rekord[li-1].kontrahent[li_str] != '\0') { ost_wyszukane[szuk].kontrahent[li_str] = rekord[li-1].kontrahent[li_str]; li_str++;} li_str = 0;
                        while(rekord[li-1].opis[li_str] != '\0') { ost_wyszukane[szuk].opis[li_str] = rekord[li-1].opis[li_str]; li_str++;} li_str = 0;
                        

                        szuk++;
                        }
                }
        }
//      getchar();
        printf("--------------------------------------------------------\n");
        printf("Zmiana salda w wyniku powyszych transakcji to: %.2lf \n", zmiana_salda);
        zmiana_salda = 0.0;
}
// +++++++++++++++++++++++++++++++++++++++++++++++
void edytuj_mtrans (int str, int nr_tr){
                printf("\nAktualizuj dane: \n");
        
                printf("                      Rok [format YYYY] [obecnie: %i]: ", rekord[nr_tr].data.rok); wczyt_do_buf (); sprawdz_dane (1, nr_tr);
                printf("                      Miesiac [format MM] [obecnie: %i]: ", rekord[nr_tr].data.miesiac); wczyt_do_buf (); sprawdz_dane (2, nr_tr);
                printf("                      Dzien [format DD] [obecnie: %i]: ", rekord[nr_tr].data.dzien); wczyt_do_buf (); sprawdz_dane (3, nr_tr);
                printf("- kwota transakcji [obecnie: %.2lf]: ", rekord[nr_tr].kwota);
                                                                                saldo[rekord[nr_tr].nr_budzetu] = saldo[rekord[nr_tr].nr_budzetu] - rekord[nr_tr].kwota;        wczyt_do_buf (); sprawdz_dane (4, nr_tr);
                printf("- kontrahent [obecnie: %s]: ", rekord[nr_tr].kontrahent); wczyt_do_buf (); sprawdz_dane (5, nr_tr);
                wypisz_drzewo(root);
                printf("- katalog [obecnie: %s]: ", rekord[nr_tr].katalog->katalog); wczyt_do_buf (); sprawdz_dane (30, nr_tr);
                printf("- opis: "); wczyt_do_buf ();  sprawdz_dane (6, nr_tr);
                saldo[rekord[nr_tr].nr_budzetu] = saldo[rekord[nr_tr].nr_budzetu] + rekord[nr_tr].kwota;                


                rekord[nr_tr+str].data.rok = rekord[nr_tr].data.rok;
                rekord[nr_tr+str].data.miesiac = rekord[nr_tr].data.miesiac;
                rekord[nr_tr+str].data.dzien = rekord[nr_tr].data.dzien;
                saldo[rekord[nr_tr+str].nr_budzetu] -= rekord[nr_tr+str].kwota;

                rekord[nr_tr+str].kwota = -rekord[nr_tr].kwota;
                strcpy(rekord[nr_tr+str].kontrahent, rekord[nr_tr].kontrahent);
                strcpy(rekord[nr_tr+str].opis, rekord[nr_tr].opis);            
                rekord[nr_tr+str].katalog = rekord[nr_tr].katalog;

                saldo[rekord[nr_tr+str].nr_budzetu] += rekord[nr_tr+str].kwota;


                printf("\nTransakcja zaktualizowana :) \n\n");


}
// +++++++++++++++++++++++++++++++++++++++++++++++
void edytuj_transakcje (char metoda, int index)  // funkcja umozliwiajaca edycje transakcji
{
        int li = 0;

        if(metoda == 'n'){
                printf("\nMozesz edytowac nastepujace transakcje: \n");
                printf(" ID ||    data    ||   kwota  || kontrahent || opis\n");
                printf("--------------------------------------------------------\n");
                for(li = 1; li <= l_wszystkich_t; li++){
                        if(rekord[li-1].nr_budzetu == ktory_budzet && rekord[li-1].data.rok != 0)
                        printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n",  li, rekord[li-1].data.rok, rekord[li-1].data.miesiac, rekord[li-1].data.dzien, rekord[li-1].kwota, rekord[li-1].kontrahent, rekord[li-1].opis);
                }
        //     getchar();
                printf("--------------------------------------------------------\n");
                printf("\nWpisz numer ID transakcji do edycji: "); wczyt_do_buf ();  sprawdz_dane (7, 0);
                if(czy_mbudzetowa (ID-1) != 0) {
                        printf("\nUWAGA! Transakcja miedzybudzetowa.\n\n");
                        edytuj_mtrans (czy_mbudzetowa (ID-1), ID-1);
                return;
                }
                
                printf("\nAktualizuj dane: \n");
        
                printf("                      Rok [format YYYY] [obecnie: %i]: ", rekord[ID-1].data.rok); wczyt_do_buf (); sprawdz_dane (1, ID-1);
                printf("                      Miesiac [format MM] [obecnie: %i]: ", rekord[ID-1].data.miesiac); wczyt_do_buf (); sprawdz_dane (2, ID-1);
                printf("                      Dzien [format DD] [obecnie: %i]: ", rekord[ID-1].data.dzien); wczyt_do_buf (); sprawdz_dane (3, ID-1);
                printf("- kwota transakcji [obecnie: %.2lf]: ", rekord[ID-1].kwota);  
                                                                                saldo[ktory_budzet] = saldo[ktory_budzet] - rekord[ID-1].kwota;       wczyt_do_buf (); sprawdz_dane (4, ID-1);
                printf("- kontrahent [obecnie: %s]: ", rekord[ID-1].kontrahent); wczyt_do_buf (); sprawdz_dane (5, ID-1);
                wypisz_drzewo(root);
                printf("- katalog [obecnie: %s]: ", rekord[ID-1].katalog->katalog); wczyt_do_buf (); sprawdz_dane (30, ID-1);
                printf("- opis: "); wczyt_do_buf ();  sprawdz_dane (6, ID-1);
                
                printf("\nTransakcja zaktualizowana :) \n\n");
                saldo[ktory_budzet] = saldo[ktory_budzet] + rekord[ID-1].kwota;
        }
        else 
        {       //printf("[nr_starej: %d]: \n", index);
                for(li = 0; li < l_wszystkich_t; li++){
                        if(rekord[li].nr_budzetu == ktory_budzet)
                        {
                        if(index == 0) break;
                        if(index > 0)
                        index--;
                        }
                        }
                
                printf("Uzupelnij dane: \n", li);
        
                printf("                      Rok [format YYYY]: "); wczyt_do_buf (); sprawdz_dane (1, li);
                printf("                      Miesiac [format MM]: "); wczyt_do_buf (); sprawdz_dane (2, li);
                printf("                      Dzien [format DD]: "); wczyt_do_buf (); sprawdz_dane (3, li);
                printf("- kwota transakcji: ");       wczyt_do_buf ();
                                                                saldo[ktory_budzet] = saldo[ktory_budzet] - rekord[li].kwota;   sprawdz_dane (4, li);
                printf("- kontrahent: "); wczyt_do_buf (); sprawdz_dane (5, li);
                printf("- opis: "); wczyt_do_buf ();  sprawdz_dane (6, li);
                wypisz_drzewo(root);
                printf("- katalog: ", rekord[li].katalog->katalog); wczyt_do_buf (); sprawdz_dane (30, li);

                printf("\nTransakcja przyjeta :) \n\n");
                saldo[ktory_budzet] = saldo[ktory_budzet] + rekord[li].kwota;
        }
        
        
}
// +++++++++++++++++++++++++++++++++++++++++++++++
void wyswietl_ost_wyszukane (int szuk) // wyswietlamy ostatnie wyszukiwanie
{
        int li = 1;
        double zmiana_salda = 0.0;
        printf("\nWynik ostatniego wyszukiwania: \n");
        printf(" ID ||    data    ||   kwota  || kontrahent || opis\n");
        printf("--------------------------------------------------------\n");
        for(li = 1; li <= szuk; li++){
                printf("%3d || %4i-%2d-%2d || %8.2lf || %10s || %10s\n", li, ost_wyszukane[li-1].data.rok, ost_wyszukane[li-1].data.miesiac, ost_wyszukane[li-1].data.dzien, ost_wyszukane[li-1].kwota, ost_wyszukane[li-1].kontrahent, ost_wyszukane[li-1].opis);
        zmiana_salda = zmiana_salda + ost_wyszukane[li-1].kwota;
        }
//      getchar();
        printf("--------------------------------------------------------\n");
        printf("Zmiana salda w wyniku powyszych transakcji to: %.2lf \n", zmiana_salda);
}
// +++++++++++++++++++++++++++++++++++++++++++++++
void formularz_ost_wyszukane () // ustalamy parametry do wyswietlenia ostatniego wyszukiwania
{
        if(szuk == 0){
        printf("\n\nNie szukales jeszcze transakcji! \n\n");
        }
        else{
        printf("Ile transakcji wyswietlic? [max = %d]: ", szuk);  wczyt_do_buf (); sprawdz_dane (24, -1);

        wyswietl_ost_wyszukane (ost_ile);
        }
}
// +++++++++++++++++++++++++++++++++++++++++++++++
void menu_katalogi ()
{
        do {
            if(k == 'd')
            {
                dodaj_katalog (NULL, NULL);
            }
            if(k == 'u')
            {
                usun_katalog ();
            }
            if(k == 'k')
            {
                katalog_kopiuj ();
            }
            if(k == 'p')
            {
                katalog_przenies ();
            }
            if(k == 'z')
            {
                zmiana_nazwy_katalogu ();
            }
          

        printf("\n ++++++++++++++++++++++++++++++++++++ \n");
        wypisz_drzewo (root);
        printf("\nd - dodaj katalog \n");
        printf("u - usun istniejacy katalog \n");
        printf("p - przenies katalog \n");    
        printf("k - kopiuj katalog \n");
        printf("z - zmien nazwe katalogu \n");
        printf("q - opusc menu katalogow \n");
        
        printf("\nPolecanie: "); wczyt_do_buf ();  sprawdz_dane (29, -1);

                                        
        }
        while(k != 'q');
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void menu () // funkcja wyswietlajaca menu programu
{      
        int i = 0;    

        do {
            if(c == 'd')
            {
                dodaj_transakcje ('x');
            }
            if(c == 'e')
            {
                edytuj_transakcje ('n', -1);
            }
            if(c == 's')
            {
                sortuj_formularz ();
            }
            if(c == 'f')
            {
                szukaj_transakcje ();
            }
            if(c == 'w')
            {
                wyswietl_transakcje ();
            }
            if(c == 'o')
            {
                formularz_ost_wyszukane ();
            }
            if(c == 'b')
            {
                dostepne_budzety ();
            }
            if(c == 'y')
            {
                menu_katalogi ();
            }
            if(c == 'm')
            {
                if(ilosc_budzetow == 1){printf("Masz tylko jeden budzet...\n\n"); }
                else{ dodaj_transakcje ('m');}
            }
            if(c == 'p')
            {
                przychody_rozchody_mtransakcje();
            }
            if(c == 'z')
            {
                printf("Czy plik ma byc szyfrowany? [t/n]: ");  wczyt_do_buf (); sprawdz_dane (33, -1);
                if(szyfrowanie == 't')
                        zapis_szyfr_do_plik ();
                else
                        zapis_do_plik ();
            }
            if(c == 'l')
            {
                odczyt_z_plik_form (); // doklepac funkcje rozpoznajaca plik szyfrowany i zwykly
            }
//          if(c == 't')  // pozycja do testowania funkcji
//          {
//              for(i = 0; i < l_wszystkich_t; i++)
//              printf("nr: %d  -  %d\n", i, czy_mbudzetowa (i));
//          }

        printf("\n ++++++++++++++++++++++++++++++++++++ \n");
        printf("Liczba transakcji przechowywanych w budzecie [%s]: %d/%d\n", budzet[ktory_budzet], l_trans[ktory_budzet], NMAX);
        printf("Saldo: %.2f\n", saldo[ktory_budzet]);
        printf("Menu: \nq - koniec \nd - dodaj transakcje \ne - edytuj transakcje \ns - sortuj transakcje\nf - szukaj transakcji\nw - wyswietl transakcje\no - wyswietl wynik ostatniego wyszukiwania\nb - wybierz inny budzet lub dodaj nowy\nm - trans. z innym budzetem\ny - drzewo katalogow\np - bilans transakcji z innymi budzetami\nz - zapis do pliku\nl - odczyt z pliku\n");
            
        printf("Polecanie: ");  wczyt_do_buf ();  sprawdz_dane (8, -1); //c = getchar();

                                        
        }
        while(c != 'q');
        
        printf("\nMoze jeszcze kiedys tu wrocisz ;) BYE BYE\n\n");
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void stworz_budzet ()
{
        if(ilosc_budzetow == NBUDZETOW)
        {
                printf("Zalozyles juz maksymalna ilosc budzetow.\n\n");
        }
        else
        {
        printf("Podaj nazwe dla nowego budzetu: "); wczyt_do_buf ();  sprawdz_dane(25, -1);
        printf("Budzet %s zostal utworzony.\n\n", budzet[ilosc_budzetow]);
        ilosc_budzetow++;
        }
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void dostepne_budzety()
{
        int i;
        if(ilosc_budzetow == 0)
        {
                printf("Nie zalozyles jeszcze zadnego budzetu.\n\n");
                stworz_budzet();
        }
        else {
        printf("Czy chcesz zalozyc nowy budzet? [t/n]: ");  wczyt_do_buf ();  sprawdz_dane(27, -1);
        if(nowy_budzet == 't')
                stworz_budzet ();
        }
        printf("Dotepne budzety:\n\n");
        for(i = 1; i <= ilosc_budzetow; i++)
                printf("%d. %s\n", i, budzet[i-1]);
        printf("Wpisz numer budzetu na ktorym chcesz operowac: ");  wczyt_do_buf ();  sprawdz_dane(26, -1);
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

int main () // main;]
{
        stworz_pierwszy_katalog ();
        dostepne_budzety ();
        menu ();

return 0;
}