//
//  	ProKost v0.99
// 	Basierend auf KostenRisiko 3.3 , Franz Xaver Dimbeck , Erding
//  	freeware GNU GPL
//
//	Copyright (C) 2008  Kai Dziock
//
//    This program is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//    This program is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with this program.  If not, see <http://www.gnu.org/licenses/>.
//
//

//import java.applet.Applet;
//import java.applet.AppletContext;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;

//

public class ProKost  extends java.applet.Applet 
{
    private java.lang.String farbe;
    private int a;
    private Label	Heading;
    private Color       cFarbe;
    private Label	Title;
    private Label	Title2;
    private Label       lStreitwert;
    private TextField   eStreitwert;
    private Checkbox    KlgAnw;
    private Checkbox    BklAnw;
    private Label       lAuslagen;
    private Button      bHilfe;
    private Button	bReset;
    private TextField   eAuslagen;
    private Label       lErgebnis;
    private TextField   eErgebnis;
    private TextArea    tTEXT;
    private Checkbox    chBerufung;
    private Checkbox    chEinigung;
    private Checkbox	chAusserGer;
    private Font        myFont;
    private Font        ergFont;
    private Font        helpFont;
    private int aGer;
    private int Ger;
    
    
    /**
    *  Constructor für das ProKost object
    */
    
    public void ProKost() 
    {
    }
    
   public static void main( String args[] )
   {
   final ProKost applet = new ProKost();
   Frame frame = new Frame( "ProKost" );
   frame.setSize( 530 , 520 ); // 26 allow space for a Frame-Bar
   frame.addWindowListener
   (
   new WindowAdapter()
      {
      public void windowClosing( WindowEvent e )
         {
         applet.stop();
         applet.destroy();
         System.exit( 0 );
         } // end WindowClosing
      } // end anonymous class
   ); // end addWindowListener line
   frame.add( applet ); 
  
   frame.setVisible( true );  
   applet.init();
   applet.start();
   frame.validate();

   }       // end main
   
   

	/**
	 *  Initialisierung des Applets
	 */
	public void init() {
		super.init();
		
		aGer=1;
		Ger=1;
		
//		cFarbe = "e0dfdd";
		
		myFont = new Font("Helvetica", Font.BOLD, 14);
		ergFont = new Font("Monospaced", 0, 12); //Monospaced
		helpFont = new Font("Serif", 0, 13);

	java.awt.Panel 	panel  = new Panel();
	panel.setLayout(new GridLayout(7, 2, 5 ,5));
		
		Title = new Label("ProKost v0.99");
		Title.setFont(myFont);
		panel.add(Title);
		
		Title2 = new Label("Stand Oktober 2008");
		Title2.setFont(myFont);
		panel.add(Title2);
	
		lStreitwert = new Label("Geben Sie hier den Streitwert ein");
		lStreitwert.setFont(myFont);
		panel.add(lStreitwert);

		eStreitwert = new TextField();
		panel.add(eStreitwert);

// VER 3.2
		lErgebnis = new Label("Erwartetes Ergebnis / Vergleich");
		lErgebnis.setFont(myFont);
		panel.add(lErgebnis);

		eErgebnis = new TextField();
		panel.add(eErgebnis);
//

		lAuslagen = new Label("Beweisauslagen");
		lAuslagen.setFont(myFont);
		panel.add(lAuslagen);
		
		eAuslagen = new TextField();
		panel.add(eAuslagen);

		tTEXT = new TextArea("", 25, 60, TextArea.SCROLLBARS_VERTICAL_ONLY);
		tTEXT.setFont(ergFont);
		tTEXT.setBackground(java.awt.Color.white); // new Color((new Integer(a)).parseInt("ffffff", 16)));
		tTEXT.setForeground(java.awt.Color.black);

		tTEXT.setEditable(false);
		panel.add(tTEXT);
			
		KlgAnw = new Checkbox("Klage mit einem Anwalt");
		
		KlgAnw.setFont(myFont);
		panel.add(KlgAnw);

		BklAnw = new Checkbox("Beklagter hat einen Anwalt");
		BklAnw.setFont(myFont);
		panel.add(BklAnw);
		
		chEinigung = new Checkbox("Einigung / Vergleich");
		chEinigung.setFont(myFont);
		panel.add(chEinigung);
		
		chBerufung = new Checkbox("Berufung");
		chBerufung.setFont(myFont);
		panel.add(chBerufung);

		chAusserGer = new Checkbox("Nur außergerichtliche Kosten");
		chAusserGer.setFont(myFont);
		panel.add(chAusserGer);
		
		bReset = new Button("Neue Eingabe / Reset");
		bReset.setFont(myFont);
		panel.add(bReset);
		
		bHilfe = new Button("Hilfe");
                                        
	//	panel.add(bHilfe);
        //damit die Auslagen in ne neue Zeile kommen


		setLayout(new BorderLayout(4,5));
		add("North", panel);

		add("South", bHilfe);
		add("Center", tTEXT);

                                  // Applet PARAMS Farbe abfragen
		try {
			farbe = "e0dfdd"; // getParameter("Farbe");
			cFarbe = new Color((new Integer(a)).parseInt(farbe, 16));
		} catch (java.lang.RuntimeException runtimeexception) {
			//cFarbe = java.awt.Color.white;
			cFarbe=java.awt.SystemColor.control;
		}

		setBackground(cFarbe);
		panel.setBackground(cFarbe);
		KlgAnw.setBackground(cFarbe);
		BklAnw.setBackground(cFarbe);
		lStreitwert.setBackground(cFarbe);
		lAuslagen.setBackground(cFarbe);		

	// VER 3.2
		lErgebnis.setBackground(cFarbe);
		chEinigung.setBackground(cFarbe);
		chAusserGer.setBackground(cFarbe);		
	//
		chBerufung.setBackground(cFarbe);

		a = cFarbe.getRed() + cFarbe.getGreen() + cFarbe.getBlue();
		if (a < 500) {
			setForeground(java.awt.Color.white);
			KlgAnw.setForeground(java.awt.Color.white);
			BklAnw.setForeground(java.awt.Color.white);
			lStreitwert.setForeground(java.awt.Color.white);
			lAuslagen.setForeground(java.awt.Color.white);
			chBerufung.setForeground(java.awt.Color.white);
			chEinigung.setForeground(java.awt.Color.white);
			lErgebnis.setForeground(java.awt.Color.white);
		}
		rechne();
	}

	/**
	 *  Behandlung der Benutzerinteraktionen
	 *
	 *@param  event  Benutzerinteraktion
	 *@return        true bei definerten Aktionen
	 */
	public boolean handleEvent(java.awt.Event event) {
		aGer = 1; Ger = 1;                                                   // ausserGer und KlgAnw Status
		if ((event.id == 1001) && (event.target == chBerufung)) {
			rechne();
			return true;
		}
		if ((event.id == 402) && (event.target == eAuslagen)) {
			rechne();
			return true;
		}
		if ((event.id == 1001) && (event.target == KlgAnw)) {
			Ger = 0;
			rechne();
			return true;
		}
		if ((event.id == 1001) && (event.target == BklAnw)) {
			rechne();
			return true;
		}
		if ((event.id == 1001) && (event.target == chEinigung)) {
			rechne();
			return true;
		}
		if ((event.id == 1001) && (event.target == chAusserGer)) {
			Ger = 1;
			if (aGer > 0) {			// Status merken
				aGer = 0;
			} else {
			aGer = 1;
			}
			rechne();
			return true;
		}
		if ((event.id == 402) && (event.target == eStreitwert)) {
			rechne();
			return true;
		}
		if ((event.id == 402) && (event.target == eErgebnis)) {
			rechne();
			return true;
		}
		if ((event.id == 1001) && (event.target == bReset)) {
			eStreitwert.setText("");
			eErgebnis.setText("");
			eAuslagen.setText("");
			chBerufung.setState(false);
			chEinigung.setState(false);
			chAusserGer.setState(false);
			KlgAnw.setState(false);
			BklAnw.setState(false);	
		}
		
		if ((event.id == 1001) && (event.target == bHilfe)) {
			java.lang.String  hText;
			tTEXT.setFont(myFont);
			tTEXT.setBackground(java.awt.Color.white);
			tTEXT.setForeground(java.awt.Color.black);

			hText =	"Kostenrisikorechner f\374r den Zivilprozess\n"
				 + "\nProKost Version 0.99\n"
				 + "\nCopyright 2008 Kai Dziock, ProKost@dziock.de\n"
				 + "\nBasierend auf KostenRisiko 3.3 (c) 1998-2007 Franz Xaver Dimbeck, Erding "
				 + "\nLizenz GNU GPL \t http://ProKost.dziock.de"
		                 + "\n__________________________________________\n\n"
				 + "ProKost berechnet das Prozesskostenrisiko f\374r Standard-Fälle. "
				 + "Beispielsweise durch weitere am Prozess Beteiligte und Auslagen "
				 + "\n\n"
            			 + "\n\nStreitwert:"
		                 + "\nDer Wert des Gegenstandes, um den prozessiert wird. "
		                 + "Bitte in Euro eingeben, Cent-Beträge m\374ssen durch Komma gettrennt werden."
            			 + "\n\nErwartetes Ergebnis / Vergleich:\n"
		                 + "Hier kann beispielesweise ein minimaler akzeptierbarer Betrag eines Vergleiches angegeben werden."
		                 + "\nDas Programm errechnet dann auch die Kostenquote und "
		                 + "die Beträge, die auf Kläger und Beklagten entfallen."
		                 + "\nWenn dieser Wert nicht angegeben wird, werden die Kosten eines vollständigen Unterliegens errechnet."
		                 + "\n\nBeweisauslagen:"
            			 + "\nGeben Sie hier die zusaetzlichen Kosten einer etwaigen "
		                 + "Beweisaufnahme ein, z.B. Zeugenentschädigungen, "
            			 + "Sachverstaendigenkosten."
		                 + "\n\n'Klage mit Anwalt':"
				 + "\n'Beklagter hat Anwalt':\n"
				 + "Die Kosten einer Klage mit anwaltlicher Vertretung auf Klägerseite bzw. Beklagtenseite."
				 + "\nEs besteht die Auswahl der Errechnung der aussergerichtlichen Kosten oder der einer Klage.\n"
				 + "Liegt der Streitwert \374ber 5.000 EUR, so ist das Landgericht zuständig. Dort ist eine anwaltilche Vertretung vorgeschrieben, 78 ZPO."
            			 + "\n\nEinigung:"
		                 + "\nDurch Markieren dieses Feldes werden die Kosten einer Einigung berechnet."
		                 + "Ist das Feld nicht markiert, werden die Kosten eines streitigen Urteils angezeigt."
		                 + "\n\nBerufung:"
		                 + "\nWenn dieses Feld markiert ist, werden die Kosten eines Berufungsverfahrens berechnet.\n"
		                 + "__________________________________________\n"
				 + "\nJede Gewähr fuer die Richtigkeit der Ausgaben wird ausgeschlossen.\n\n"
				 + "Falls Sie einen Fehler finden, senden Sie ihn bitte an ProKost@dziock.de\n"
    ;
			tTEXT.setText(hText);
			return true;
		} else {
			return super.handleEvent(event);
		}
	}

	/**
	 *  wertet die Benutzereingaben aus und berechnet die Kosten
	 */
public void rechne() {
	double            dZhtAnw   = 0.0D;        //  Zehntel Anwalt
	double            dZhtGer   = 0.0D;        //  Zehntel Gericht
	
	double            d     = 0.0D;        //  Anwaltsgebühr
	double            g     = 0.0D;       // Anwaltsgebuehr 1,3 fuer anrechenbare GGeb
	double		  h     = 0.0D;		// halbe anrechenbare GGeb 0,65
	double		VerfG = 0.0D;	// Verfahrensgebuehr
	double 		GG = 0.0D;	// Geschaeftsgebuehr
	double 		berV = 0.0D;	// ex -b Berufung VerfGeb 1,6
	double		Term = 0.0D;	// ex - i Terminsgebuehr 1,2
	double		eErst = 0.0D;     	// ex - e einigung erste instanz
	double 		eBer = 0.0D;  	// ex - v  einigung berufung
	double 		eAusser = 0.0D; // aussergerichtliche einigung
	double		gGesamtkostenAng = 0.0D; 
	double 		Klgkosten = 0.0D;
	double 		KlgkostenOhne = 0.0D;
	double		KlgKostenGer = 0.0D;
	double		KlgkostenMsteuer = 0.0D;
	double		BklkostenMsteuer = 0.0D;
	double		Bklkosten = 0.0D;
	double		Gerkosten = 0.0D;
	double		Berkosten = 0.0D;	// Kosten der Berufung
	double		BerGerg = 0.0D;
	double 		  eigene = 0.0D;  	// eigene RA-Gebuehren
	double		  fremde = 0.0D;	//fremde RA-Gebuehren
	double		  gerg	= 0.0D;		// Gerichtsgebuehr
	double            dNumAnw    = 0.0D;        //  Anzahl der Anwälte
	double            dGergeb    = 0.0D;        //  Gerichtsgebühr
	double            dAusl    = 0.0D;
	double		  gAusl	   = 0.0D;        //  Auslagen
	double            dPausch    = 0.0D;        //  Auslagenpauschale
	double		  gPausch    = 0.0D;
	double            dMwst    = 0.0D;        //  Mehrwertsteuer
	double 		  gMwst   = 0.0D;
	double		  hMwst	  = 0.0D;
	double            strw;                //  Streitwert
	double            dErg;                //  Prozessergebnis
	double		  gErg;
	double            dGestamtkosten;                //  Gestamtkosten
	double		  gGesamtkosten;

	long            dQuoteK;              //  Quote Obsigen Kläger
	long            dQuoteB;              //  Quote Obsigen Beklagter

	java.lang.String  Bkl = "";			// Fuer die "2x " Anzeige der RAGeb im Einzelnen
	java.lang.String  s;                   //  für Textausgabe

		tTEXT.setFont(ergFont);
		tTEXT.setBackground(java.awt.Color.white);
		tTEXT.setForeground(java.awt.Color.black);
		
		strw = ProKost.getDouble(eStreitwert);
		dErg = ProKost.getDouble(eErgebnis);
		
// Fehlermeldugen
		if (strw < 0.01D) {
			s = "Bitte den Streitwert in Euro eingeben. Hinweise zur Ermittlung des Streitwerts finden Sie unten auf der Seite.\n\n"
			+ "ProKost v0.99 berechnet die Kosten der rechtlichen Durchsetzung von Anspr\374chen. "
			+ "Es basiert auf KostenRisiko 3.3 vgl. dimbeck.de und steht unter der GPL.\n\n"
			+ "Jede Gewähr fuer die Richtigkeit der Ausgaben wird ausgeschlossen.\n\n"
			+ "Falls Sie einen Fehler entdecken, senden Sie ihn bitte an ProKost@dziock.de\n\n"
			+ "Hinweise zur Eingabe erhalten Sie, wenn sie unten auf die Schaltfläche "
			+ "'Hilfe' klicken.\n"
			+ "Der Hilfetext verschwindet wieder, wenn Sie neue Eingaben machen.\n\n"
			+ "http://ProKost.dziock.de";
			
			tTEXT.setText(s);
			return;
		}
				
		if (strw > 30000000D) {
			s="Streitwert höchstens 30 Millionen\n § 22 Abs. 2 RVG, § 39 Abs. 2 GKG.\n";
			s+="\nGeben Sie bitte einen geringeren Streitwert ein.\n";
			tTEXT.setText(s);
			return;
		}
			

		
		if (dErg >strw) {
			s = "Ergebnis darf nicht größer als Streitwert sein\n";
			tTEXT.setText(s);
			return;
		}
//
// Entweder Klage mit Anwalt Oder Nur aussergerichtlich
//
		if (aGer > 0) {
			if (KlgAnw.getState()) {
			    chAusserGer.setState(false);
			}
		}

// wenn wechsel von aussergerichtlich zu Klage, einigung ausschalten
//
//		if (KlgAnw.getState()) {
//		    if (Ger > 0) {
//			chEinigung.setState(false);
//		    }
//		}		
		
//
// Wenn Nur aussergerichtlich, dann auch Vergleichsgebuehr
//
		
		if (chAusserGer.getState()) {
		    chEinigung.setState(true);
		}

		
// ------------------------------
// Anwaltszwang vorm Landgericht bzw bei Berufung
//-------------------------------

		if (chAusserGer.getState() == false)           // Wenn nicht nur aussergerichtlich, dann Anwaltszwang vorm LG und bei Berufung
		{    
			if (strw > 5000D) {			// Wenn Streitwert > 5000 EUR -> Anwaltszwang vorm Landgericht
				KlgAnw.setState(true);
				BklAnw.setState(true);
			}
			if (chBerufung.getState()) {
			    if (strw > 600D) {
				    KlgAnw.setState(true);
				    BklAnw.setState(true);
			    }
			}
		} else {		// Wenn Nur aussergerichtlich, dann entferne Klage mit Anwaelten
				KlgAnw.setState(false);
				BklAnw.setState(false);
				chBerufung.setState(false);
		}

//-------------------------------
// Beschwerdesumme bei Berufung -> Streitwert mindestens 600 EUR			
//-------------------------------
		if (chBerufung.getState() == true) {
			if (strw < 600.01D) {
				chBerufung.setState(false);
			}
		}
		
		
// ------------------------------
//        Berechnung
// ------------------------------
	
		// Quote    

		double dtep;
		dtep=100D*runde(dErg/strw);
		dQuoteK = (long)  dtep;
		dQuoteB=100-dQuoteK;

//		// Wieviele Anwaelte?
//		
		if (KlgAnw.getState()) {
			dNumAnw = 1.0D;
		}
		if (BklAnw.getState()) {
			dNumAnw++;
		}

//		//Welcher Gesamt-Faktor?
		
		dZhtAnw = 25  ;                  //Zehntel ohne Einigung 1.Insantz, Anwaltsfaktor
	        dZhtGer = 30;                    // Gerichtsgebuehren
		if (chBerufung.getState()) {
			dZhtAnw += 28;   
			dZhtGer += 40;
		}
 		if (chEinigung.getState()) {
			dZhtAnw += 20  ;   
			dZhtGer = 10;
			if (chBerufung.getState()) {
			    dZhtAnw = 66  ;   
			    dZhtGer = 50;	
        		};
    		};

		// Gesamt-Faktor der Anwaelte

		dZhtAnw *= dNumAnw;         // Anwaltsfaktor * Zahl der Anwaelte
		
		// aussergerichtliche Kosten
		
		g = GebRVG(strw, 13);    // g ist die Basis um die ausserger Geb (gGesamtkosten usw.) zu berechnen, sie ist wie d, nur als statische 1,3 Gebuehr. Die Gebuehren koennte man auch allg dynamisch machen... :)
		dGergeb = GebGkgE(strw, dZhtGer); 	// 
		gerg = GebGkgE(strw, 10);		// 1,0 Gerichtsgebuehr
		gAusl = ProKost.getDouble(eAuslagen);	// aussergerichtliche Auslagen
		gPausch = Pausch(g);			// aussergerichtliche Pauschale
		gMwst = Mwst(g + gPausch);		// aussgerichtliche Mwst

		gGesamtkosten=g + gPausch + gMwst + gAusl;  // Gesamte aussergerichtliche kosten

		// Wenn kein Anwalt dann gGesamtkosten = 0
                  
		if (dNumAnw < 1D) {                      
		    h = 0D;      			// h ist die aussergerichtliche gebuehr ohne Zusatzkosten, um sie halbieren zu koennen 
		    gGesamtkosten  = 0D;
		}
		else {
		    h -= (g/2); 			//Halbe aussger Geb! GebRVG(str, 6.5) ist nicht moeglich, h ist negativ
		}

		// Faktoren festlegen
		
		d = GebRVG(strw, dZhtAnw); 	// Gesamtfaktor
		GG = GebRVG(strw, 13);		// Geschaeftsgebuehr
		VerfG = GebRVG (strw, 13);	// VerfahrensGeb
    		berV = GebRVG(strw, 16);	// ex -b Berufung VerfGeb 1,6
		Term = GebRVG(strw, 12);	// ex - i Terminsgebuehr 1,2
		eErst = GebRVG(strw, 10);     	// ex - e 1,0 erstinstanzliche einigung
		eBer = GebRVG(strw, 13);  	// ex - v 1,3 berufung einigung
		eAusser = GebRVG(strw, 15);	// ausserger einigung
		

		// Gerichtsgebuehren + Auslagen

		dGergeb = GebGkgE(strw, dZhtGer);	// Gerichtsgebuehren
		dAusl = ProKost.getDouble(eAuslagen);  	// Auslagen
		
// ------------------------------
//          Textergebnis
// ------------------------------

		s = "\nProKost v0.99\t (c) Kai Dziock / F. X. Dimbeck\n";
		s += "_________________________________________\n\n";

	    // Hinweise

		s += "Hinweise:\n";
		if (strw > 5000.01D) {
		    s += "Bei einem Streitwert \374ber 5000 EUR ist das Landgericht\n";
		    s += "zuständig. Dort m\374ssen beide Parteien anwaltlich\n";
		    s += "vertreten sein, § 78 ZPO\n\n";
		}
		if (strw < 600.01D) {
		    s += "Die Mindestbeschwer f\374r die Berufung beträgt 600 EUR.\n\n";
		}
		if (chBerufung.getState() == true) {
		    s += "Bei einer Berufung m\374ssen die Parteien anwaltlich \n";
		    s += "vertreten sein, § 78 ZPO. \n\n";
		}
		
		s += "_________________________________________\n\n";		
		
	    // Wieviele Anwaelte Einigung oder Urteil
		
	    if (chAusserGer.getState() == false) {
		if (chBerufung.getState()) {
			s += "2. Instanz, ";
		} else if (KlgAnw.getState()) {
			s += "1. Instanz, ";
		} else {
			s += "Außergerichtlich, ";
		}
		if (dNumAnw == 0)  {
			s += "ohne Anwälte";
		} else if (dNumAnw == 1) {
			s += "ein Anwalt";
		} else {
			s += "zwei Anwälte";
		}
		if (chEinigung.getState()) {
			s += ", Einigung \n";
		} else {
			s += ", Urteil \n";
		}
	    } else {
		s += "Nur außergerichtliche Vertretung\n\n";
	    }

		s += "Ergebnis Urteil/Vergleich f\374r Kläger     \t" + ProKost.dbl2str(dErg) + "\n\n";
		s += "Info: 1,0 Geb\374hr nach § 13 RVG           \t" + ProKost.dbl2str(eErst)+"\n\n";
		s += "Streitwert                               \t" + ProKost.dbl2str(strw) + "\n\n";
		
	    // aussergerichtlich

		s += "_________________________________________\n\n";
		s += "Außergerichtliche Vertretung:\n\n";
		s += "Geschaeftgeb\374hr VV2300 1,3               \t" + ProKost.dbl2str(GG) + "\n";	
		s += "Pauschale VV 7001, 7002                  \t" + ProKost.dbl2str(gPausch) + "\n";
		s += "MWSt 19 %                                \t" + ProKost.dbl2str(gMwst) + "\n\n";
		s += "Gesamt RAGeb                             \t" + ProKost.dbl2str(GG + gPausch + gMwst + gAusl) + "\n\n";
		gGesamtkosten = GG + gPausch + gMwst + gAusl; // aussgerichtliche Kosten

	    // aussergerichtlich und Einigung	

		if (chEinigung.getState()) {
		s += "-----------------------------------------\n\n";
		s += "Bei außergerichtlicher Einigung:\n\n";
		s += "Einigungsgeb\374hr VV 1000 1,5              \t" + ProKost.dbl2str(eAusser) + "\n";
		s += "MwSt 19 %                                \t" + ProKost.dbl2str(Mwst(eAusser)) + "\n\n";
		s += "Gesamtkosten der Einigung                \t" + ProKost.dbl2str (g + gPausch + gMwst + gAusl + eAusser + Mwst(eAusser)) + "\n\n";
		}
		
		dGestamtkosten = gGesamtkosten + g + gPausch + gMwst + gAusl + eAusser + Mwst(eAusser); // Gesamtkosten = aussergerichtliche + Einigungsgebuehr

	// Prozessuale Kosten

if (chAusserGer.getState() == false) {
		s += "_________________________________________\n\n";
		s += "Gerichtliche Anwaltsgeb\374hren: \n\n";
		
	    // Berechnung eigene Anwaltskosten
		
		dGestamtkosten = 0.0D; 	// Gesamtkosten
		Klgkosten = 0.0D;      	// Klaegerkosten
		KlgkostenOhne = 0.0D;	// Klaegerkosten ohne aussergerichtliche Vertretung
		KlgKostenGer = 0.0D;  	// nur gerichtliche Klaegerkosten 
		Bklkosten = 0.0D;	// Beklagtenkosten
		Berkosten = 0.0D;	// nur Kosten der Berufung
		BerGerg = 0.0D;		// Gerichtskosten der Berufung
		
	    
        if (KlgAnw.getState()) {
		s += "Eigene Anwaltskosten:\n\n";		
	    	s += "Verfahrensgeb\374hr VV 3100 1,3             \t" + ProKost.dbl2str(VerfG) + "\n";
		s += "Terminsgeb\374hr VV 3104 1,2                \t" + ProKost.dbl2str(Term) + "\n";
		s += "Pauschale VV 7001, 7002                  \t" + ProKost.dbl2str(Pausch(VerfG+Term+h)) + "\n"; // Einberechnung der aussergerichtlichen Pauschale
		Klgkosten = Klgkosten + VerfG + Term + Pausch(VerfG+Term+h); //  h ist negativ
		KlgKostenGer = KlgKostenGer + VerfG + Term + Pausch(VerfG+Term+h); // h ist negativ
		KlgkostenOhne = VerfG + Term + Pausch(VerfG+Term);
		
		s += "Außergerichtliche Kosten                 \t" + ProKost.dbl2str(gGesamtkosten) + "\n"; 
		s += "Geschäftsgeb\374hr, Pauschale, MwSt\n";
		s += "Anzurechnende halbe GG                   \t" + ProKost.dbl2str(h) + "\n";
		gGesamtkostenAng = gGesamtkosten + h; // h ist negativ, merke aussergerichtliche ohne halbe anzurechnende GG
		Klgkosten = Klgkosten + h; // h ist negativ, halbe aussergerichtliche subtrahieren
		KlgKostenGer = KlgKostenGer + h; // h ist negativ

	    if (chBerufung.getState()) {
		s += "Berufung Verfahrensgeb\374hr VV 3200 1,6    \t" + ProKost.dbl2str(berV) + "\n";
		s += "Berufung Terminsgeb\374hr VV 3202 1,2       \t" + ProKost.dbl2str(Term) + "\n";
		s += "Pauschale VV 7001, 7002                  \t" + ProKost.dbl2str(Pausch(berV+Term)) + "\n";
		Klgkosten = Klgkosten + berV + Term + Pausch(berV+Term);
		KlgKostenGer = KlgKostenGer + berV + Term + Pausch(berV+Term);
		KlgkostenOhne = KlgkostenOhne + berV + Term + Pausch(berV+Term);
	    }	
			
	    if (chEinigung.getState()) {
		if (chBerufung.getState()) {
		s += "Einigungsgeb\374hr VV 1000, 1004 1,3        \t"+  ProKost.dbl2str(eBer) + "\n";
		Klgkosten = Klgkosten + eBer;
		KlgKostenGer = KlgKostenGer + eBer;
		KlgkostenOhne = KlgkostenOhne + eBer;
		} else {
		s += "Einigungsgeb\374hr VV 1003 1,0              \t" +ProKost.dbl2str(eErst) + "\n"; 
		Klgkosten = Klgkosten + eErst;
		KlgKostenGer = KlgKostenGer + eErst;
		KlgkostenOhne = KlgkostenOhne + eErst;
		}
	    }	
		s += "MwSt                                     \t" + ProKost.dbl2str(Mwst(Klgkosten)) + "\n\n";
		KlgkostenMsteuer = Mwst(Klgkosten);
		Klgkosten = Klgkosten + Mwst(Klgkosten) + gGesamtkosten;  // Klaegerkosten + Mwst + aussgerichtliche Vertretung
		KlgKostenGer = KlgKostenGer + Mwst(KlgKostenGer);      // Klgkosten + 
		KlgkostenOhne = KlgkostenOhne + Mwst(KlgkostenOhne);
		s += "-----------------------------------------\n\n";
		s += "Nur gerichtliche Anwaltskosten           \t" + ProKost.dbl2str(KlgKostenGer) + "\n\n";
		s += "Gesamte Anwaltskosten Kläger             \t" + ProKost.dbl2str(Klgkosten) + "\n\n";
		s += "Einzuklagende außergerichtliche Kosten   \t" + ProKost.dbl2str(gGesamtkosten) + "\n\n";
		s += "Klägerkosten ohne außerger. Vertretung   \t" + ProKost.dbl2str(KlgkostenOhne) + "\n\n";
        }	
	    
	    // Berechnung fremde Anwaltskosten
	    
		s += "-----------------------------------------\n\n";
        if (BklAnw.getState()) {
		s += "Fremde Anwaltskosten:\n\n";
	    	s += "Verfahrensgeb\374hr VV 3100 1,3            \t" + ProKost.dbl2str(VerfG) + "\n";
		s += "Terminsgeb\374hr VV 3104 1,2               \t" + ProKost.dbl2str(Term) + "\n";
		s += "Pauschale VV 7001, 7002                 \t" + ProKost.dbl2str(Pausch(VerfG+Term)) + "\n";
		Bklkosten = Bklkosten + VerfG + Term + Pausch(VerfG+Term);

	    if (chBerufung.getState()) {
		s += "Berufung Verfahrensgeb\374hr VV 3200 1,6   \t" + ProKost.dbl2str(berV) + "\n";
		s += "Berufung Terminsgeb\374hr VV 3202 1,2      \t" + ProKost.dbl2str(Term) + "\n";
		s += "Pauschale VV 7001, 7002                 \t" + ProKost.dbl2str(Pausch(berV+Term)) + "\n";
		Bklkosten = Bklkosten + berV + Term + Pausch(berV+Term);
	    }
	    
	    if (chEinigung.getState()) {
		if (chBerufung.getState()) {
		s += "Einigungsgeb\374hr VV 1000, 1004 1,3       \t"+  ProKost.dbl2str(eBer) + "\n";
		Bklkosten = Bklkosten + eBer;
		} else {
		s += "Einigungsgeb\374hr VV 1003 1,0            \t" +ProKost.dbl2str(eErst) + "\n"; 
		Bklkosten = Bklkosten + eErst;
		}
	    }
		
		BklkostenMsteuer = Mwst(Bklkosten);
	    	s += "MwSt                                     \t" + ProKost.dbl2str(Mwst(Bklkosten)) + "\n\n";
		Bklkosten = Bklkosten + Mwst(Bklkosten);
		s += "-----------------------------------------\n\n";
		s += "Gesamte Anwaltskosten Beklagter          \t" + ProKost.dbl2str(Bklkosten) + "\n\n";
        } 	
	
	    // Gesamte Anwaltskosten

		s += "-----------------------------------------\n\n";
                s += "Gesamt Anwaltskosten                     \t" + ProKost.dbl2str(Klgkosten + Bklkosten) + "\n\n";
		s += "_________________________________________\n\n";

	    // Gerichtskosten
	    
		s += "Gerichtskosten:\n\n";
		s += "Info: Gerichtsgeb\374hren GKG 1,0           \t"+ ProKost.dbl2str(gerg) + "\n\n";		
		
	    if (chBerufung.getState()) {
		if (chEinigung.getState()) {
		s += "GerGeb\374hren Nr. 1210 GKG 3,0 1. Inst.    \t"+ ProKost.dbl2str(gerg*3) + "\n";
		s += "GerGeb\374hren Nr. 1222 GKG 2,0 2. Inst.    \t"+ ProKost.dbl2str(gerg*2) + "\n";
		Gerkosten = Gerkosten + (gerg*5);
		} else {
		s += "GerGeb\374hren Nr. 1210 GKG 3,0 1. Inst.    \t"+ ProKost.dbl2str(gerg*3) + "\n";
		s += "GerGeb\374hren Nr. 1220 GKG 4,0 2. Inst.    \t"+ ProKost.dbl2str(gerg*4) + "\n";
		Gerkosten = Gerkosten + (gerg*7);
		}
	    }
	    
	    if (chEinigung.getState()) {
		if (chBerufung.getState() == false) { 		
		s += "Gerichtsgeb\374hren Nr. 1211 GKG 1,0        \t"+ ProKost.dbl2str(dGergeb) + "\n";
		Gerkosten = Gerkosten + gerg;
		}
	    } else {
		if (chBerufung.getState() == false) { 
		    s += "Gerichtsgeb\374hren Nr. 1210 GKG 3,0        \t"+ ProKost.dbl2str(dGergeb) + "\n";
		    Gerkosten = Gerkosten + (gerg*3);
		}
	    }
	    
		    s += "Auslagen                                 \t" + ProKost.dbl2str(dAusl) + "\n\n";
		    Gerkosten = Gerkosten + dAusl;
		    s += "_________________________________________\n\n";


		    // Kosten einer Berufung
		    
	    if (chBerufung.getState()) {
		    s += "Kostenanteil der Berufung:\n\n";
		    s += "Berufung Verfahrensgeb\374hr VV 3200 1,6 2x\t" + ProKost.dbl2str(berV*2) + "\n";
		    s += "Berufung Terminsgeb\374hr VV 3202 1,2    2x\t" + ProKost.dbl2str(Term*2) + "\n";
		    Berkosten = (berV*2) + (Term*2);
		    
		if (chEinigung.getState()) {
		    s += "Einigungsgeb\374hr VV 1000, 1004 1,3     2x\t"+  ProKost.dbl2str(eBer*2) + "\n";
		    Berkosten = Berkosten + (eBer*2);
		}
		    s += "Pauschale VV 7001, 7002                2x\t" + ProKost.dbl2str(Pausch(berV+Term)*2) + "\n";
		    
    		if (chEinigung.getState()) {
		    s += "Gerichtsgeb\374hren Nr. 1222 GKG 2,0        \t"+ ProKost.dbl2str(gerg*2) + "\n";
		    BerGerg = (gerg*2);
	    	} else {
		    s += "Gerichtsgeb\374hren Nr. 1220 GKG 4,0        \t"+ ProKost.dbl2str(gerg*4) + "\n";
		    BerGerg = (gerg*4);
		}

		    Berkosten = Berkosten + (Pausch(berV+Term)*2);
		    s += "MwSt                                     \t" + ProKost.dbl2str(Mwst(Berkosten)) + "\n\n";
		    s += "-----------------------------------------\n\n";		    
		    Berkosten = Berkosten + Mwst(Berkosten) + BerGerg;
		    
		    s += "Kosten der Berufung                      \t" + ProKost.dbl2str(Berkosten) + "\n\n";
		    s += "_________________________________________\n\n";
	    }
		    // Gesamtkosten 
		    
		    dGestamtkosten = Klgkosten + Bklkosten + Gerkosten;
    		    s += "Gesamtkosten                             \t" + ProKost.dbl2str(dGestamtkosten) + "\n\n";


		    s += "_________________________________________\n\n";
		    
		    // Kostenquoten
		    
		    s += "Kostenquoten: Kläger " + dQuoteB + "%  Beklagter "+ dQuoteK +"%\n\n";
	    	    s += "Kosten Kläger                            \t"+ dbl2str(dQuoteB*(dGestamtkosten)/100)+"\n";
	    	    s += "Kosten Beklagter                         \t"+ dbl2str(dQuoteK*(dGestamtkosten)/100)+"\n\n";
	    	    s += "Ergebnis Kläger                          \t"+ dbl2str(dErg-dQuoteB*(dGestamtkosten)/100)+"\n";
	    	    s += "Ergebnis Beklagter                       \t"+ dbl2str(-dErg-dQuoteK*(dGestamtkosten)/100)+"\n\n";
		    s += "_________________________________________\n\n";

		    // enthaltene MwSt

		    s += "Enthaltene MWSt 19%                      \t" + ProKost.dbl2str(KlgkostenMsteuer + BklkostenMsteuer + gMwst) + "\n\n";

		if (KlgAnw.getState()== true) {
    		    s += "Gesamtkosten ohne außerger. Vertretung   \t" + ProKost.dbl2str(Gerkosten + (KlgkostenOhne + Bklkosten)) + "\n\n";
		}
		    s += "-----------------------------------------\n\n";
		    s += "Gesamtkosten                             \t" + ProKost.dbl2str(dGestamtkosten) + "\n\n" ;
		    s += "_________________________________________\n\n";

    } // if aussergerichtlich false    

		tTEXT.setText(s);                 // Ergebnistext ausgeben

} //Ende Routine

	/**
	 *  Informationen zum Applet
	 *
	 *@return    Informationsstring
	 */
	public java.lang.String getAppletInfo() {
		return "ProKost Version 0.99: \n - 2008 Kai Dziock \n - Lizenz: GNU GPL";
	};

        public String[][] getParameterInfo() {
        
        String pinfo[][] = {
         {"Farbe",    "RRGGBB",    "Farbe des Hintergrunds in Hex"}
         
         };
        return pinfo;
        };

    
	/**
	 *  string (mit DezimalKomma) in Zahl umwandeln, auf zwei
	 *  Nachkomastellen kaufmännisch gerundet
	 *
	 *@param  s  der umzuwandelnde String
	 *@return    das Ergebnis, wenn der String nicht in eine Zahl
	 *      umgewandelt werden konnt, w1rd 0.00 zurückgegeben
	 */
	public static double str2dbl(java.lang.String s) {
        java.lang.String s2;
	double  d;
		try {
		    s2=s.replaceAll("\\.","");
		    s2=s2.replaceAll(" ","");
			d = java.lang.Double.valueOf(s2.replace(',', '.')).doubleValue();
			d = ProKost.runde(d);
		} catch (java.lang.NumberFormatException numberformatexception) {
			d = 0.0D;
		}
		return d;
	}

	/**
	 *  Verwandelt Zahl in String mit Dezimalkomma und
	 *  Tausendertrennzeichen, kaufmännisch gerundet auf zwei
	 *  Nachkommastellen, mit Euro-Zeichen am Ende
	 *
	 *@param  d  Zahl, die umgewandelt werden soll
	 *@return    String mit der formatierten Zahl
	 */
	public static java.lang.String dbl2str(double d) {

	long              l   = (long) java.lang.Math.floor(java.lang.Math.abs(d));
	long              l1  = (long) java.lang.Math.round(
			(java.lang.Math.abs(d) - (double) l) * 100D);
	java.lang.String  s   = java.lang.String.valueOf(l);
	java.lang.String  s1  = java.lang.String.valueOf(l1);
	java.lang.String  s2  = "";
	java.lang.String  s3  = "";
		if (s1.length() < 2) {
			s1 = "0" + s1;
		}

	int               i   = s.length() - 3;
		if (d < 0.0D) {
			s2 = "-";
		}
		if ((l >= 1000L) || (l <= -1000L)) {
			for (; i >= 1; i -= 3) {
				s = s.substring(0, i) + "." + s.substring(i, s.length());
			}
		}
		s3 = s2 + s + "," + s1 + " \u20ac";   //String zusammensetzen, EURO-Zeichen ans Ende
		for (int j = s3.length() - 2; j < 14; ) {
			j = s3.length();
			s3 = " " + s3;
		}
		return s3;
	}

	/**
	 *  rundet kaufmännisch auf zwei Nachkommastellen
	 *
	 *@param  d  zu rundende Zahl
	 *@return    gerundete Zahl
	 */
	private static double runde(double d) {
		return java.lang.Math.round(d * 100D) / 100D;
	}

	/**
	 *  getDouble(TextFiel) wandelt den Inhalt eines Textfeldes in eine
	 *  Zahl um
	 *
	 *@param  textfield  Textfeld, dessen Ihnhalt ungewandelt werden
	 *      soll>
	 *@return            Zahlenwert (double) des Textfeldinhaltes >
	 */
	private static double getDouble(java.awt.TextField textfield) {
		return str2dbl(textfield.getText());
	}

	/**
	 *  teilgeb: Hilfsfunktion, berechnet die Teilgebühr aus einer
	 *  Gebührenstufe
	 *
	 *@param  Strw      Streitwert
	 *@param  Untergr   Untergrenze
	 *@param  Obergr    Obergrenze
	 *@param  Schrittw  Schrittweite der Stufen
	 *@param  Erhoeh    Erhöhungsbetrag pro Stufe
	 *@return           Teilgebühr
	 */
	private static double teilgeb(double Strw, double Untergr, double Obergr, double Schrittw,
	                              double Erhoeh) {
	double  AnzStufen;
		if (Strw > Obergr) {
			Strw = Obergr;
		}
		Strw -= Untergr;
		if (Strw <= 0.0D) {
			return 0.0D;
		}
		AnzStufen = java.lang.Math.ceil(Strw / Schrittw);
		if ((AnzStufen * Schrittw) > Obergr) {
			AnzStufen--;
		}
		return AnzStufen * Erhoeh;
	}

	/**
	 * berechnet die MwSt
	 *@param Wert 	Wert der MwSt
	*/
	public static double Mwst(double Wert) {
	 	double St = 0.0D;
		St = Wert * 0.19;
		return St;
	}
	
	/**
	 * berechnet die Pauschale
	 * Param Wert Wert der Pauschale
	*/
	public static double Pausch(double Wert) {
		double Pau = 0.0D;
		Pau = Wert * 0.2;
		if (Pau > 20D) {                      // höchstens 20 EURO
			Pau = 20D;
		}
		return Pau;
	}	
  
	/**
	 *  berechnet die Anwaltsgebühr
	 *
	 *@param  Streitw  Streitwert
	 *@param  zehntel  Zehntel (= Faktor * 10)
	 *@return          Gebühr nach RVG
	 */
	public static double GebRVG(double Streitw, double zehntel) {

	double  RAGeb  = 25D;
                                        //== Mindestgebühr
		RAGeb += teilgeb(Streitw, 300D, 1500D, 300D, 20D);
		RAGeb += teilgeb(Streitw, 1500D, 5000D, 500D, 28D);
		RAGeb += teilgeb(Streitw, 5000D, 10000D, 1000D, 37D);
		RAGeb += teilgeb(Streitw, 10000D, 25000D, 3000D, 40D);
		RAGeb += teilgeb(Streitw, 25000D, 50000D, 5000D, 72D);
		RAGeb += teilgeb(Streitw, 50000D, 200000D, 15000D, 77D);
		RAGeb += teilgeb(Streitw, 200000D, 500000D, 30000D, 118D);
		RAGeb += teilgeb(Streitw, 500000D, 1E+020D, 50000D, 150D);
		RAGeb = (zehntel * RAGeb) / 10D;
		if (RAGeb < 10D) {
			RAGeb = 10D;
		}
		RAGeb = runde(RAGeb);
		return RAGeb;
	}





	/**
	 *  Berechnet die Gerichtsgebühr
	 *
	 *@param  Streitw  Streitwert
	 *@param  zehntel  Zehntel
	 *@return          GKG-Gebühr
	 */
	public static double GebGkgE(double Streitw, double zehntel) {

	double  GerGeb  = 25D;
                                        //== Mindestgebühr
		GerGeb += teilgeb(Streitw, 300D, 1500D, 300D, 10D);
		GerGeb += teilgeb(Streitw, 1500D, 5000D, 500D, 8D);
		GerGeb += teilgeb(Streitw, 5000D, 10000D, 1000D, 15D);
		GerGeb += teilgeb(Streitw, 10000D, 25000D, 3000D, 23D);
		GerGeb += teilgeb(Streitw, 25000D, 50000D, 5000D, 29D);
		GerGeb += teilgeb(Streitw, 50000D, 200000D, 15000D, 100D);
		GerGeb += teilgeb(Streitw, 200000D, 500000D, 30000D, 150D);
		GerGeb += teilgeb(Streitw, 500000D, 1E+020D, 50000D, 150D);
		GerGeb = (zehntel * GerGeb) / 10D;
		if (GerGeb < 10D) {
			GerGeb = 10D;
		}
		GerGeb = runde(GerGeb);
		return GerGeb;
	}
}

