import java.awt.*;
import java.awt.event.*;
import java.smartcard.*;
import java.io.*;

/*
 * a jelszo modositasa a banki ATM automatanal
 */
class JelszoModositas
{
   String elso = new String(""); /* az aktualisan beirt jelszo */
   String ujjelszo = new String(""); /* az elsonek beirt jelszo */
   String iButtonID; /* a gyuru azonositoja */
   JelszoModositasAblak jelszomodositasablak; /* az uj jelszavakat bekero ablak */
   
   public JelszoModositas(String azonosito, String ID)
   {
      iButtonID = ID;
      /* uj jelszo eloszor */
      jelszomodositasablak = new JelszoModositasAblak("K\u00e9rem az \u00faj jelsz\u00f3t","\u00cdrd be az \u00faj jelszavadat");
      jelszomodositasablak.show();
      if(!elso.equals("*nemjo*"))
      {
         ujjelszo = elso;
         /* uj jelszo masodszor */
         jelszomodositasablak = new JelszoModositasAblak("K\u00e9rem az \u00faj jelsz\u00f3t (m\u00e1sodik)","\u00cdrd be az \u00faj jelszavadat m\u00e9gegyszer");
         jelszomodositasablak.show();
         /* ha a ket uj jelszo egyezik */
         if(elso.equals(ujjelszo))
         {
            /* ha sikeres a jelszo megvaltoztatasa... */
            if(Gyuru.eszkoz.jelszoModosit(Gyuru.bank.jelszoKerdez(azonosito,ID),ujjelszo))
            {
               /* az uj jelszo elmentese */
               write();
               SzovegAblak szovegablak = new SzovegAblak(Gyuru.atmablak,"Sikeres jelsz\u00f3m\u00f3dos\u00edt\u00e1s","","Mostant\u00f3l az \u00faj jelsz\u00f3 \u00e9rv\u00e9nyes az eszk\u00f6z\u00f6n!");
               szovegablak.show();
               Gyuru.atmablak = new ATMAblak();
               Gyuru.atmablak.show();
            }
            else /* ...es ha nem */
            {
               SzovegAblak szovegablak = new SzovegAblak(Gyuru.atmablak,"Sikertelen jelsz\u00f3m\u00f3dos\u00edt\u00e1s","Hiba t\u00f6rt\u00e9nt az eszk\u00f6zzel val\u00f3 kommunik\u00e1ci\u00f3ban","M\u00e9g mind\u00edg az el\u00f4z\u00f4 jelsz\u00f3 \u00e9rv\u00e9nyes az eszk\u00f6z\u00f6n!");
               szovegablak.show();
               Gyuru.atmablak = new ATMAblak();
               Gyuru.atmablak.show();
            }
         }
         /* a ket uj jelszo nem egyezik */
         else if(!elso.equals("*nemjo*"))
         {
            SzovegAblak szovegablak = new SzovegAblak(Gyuru.atmablak,"Sikertelen jelsz\u00f3m\u00f3dos\u00edt\u00e1s","A k\u00e9t \u00fajonnan megadott jelsz\u00f3 nem egyezik!","M\u00e9g mind\u00edg az el\u00f4z\u00f4 jelsz\u00f3 \u00e9rv\u00e9nyes az eszk\u00f6z\u00f6n!");
            szovegablak.show();
            Gyuru.atmablak = new ATMAblak();
            Gyuru.atmablak.show();
         }
         else /* megse irta be a jelszot */
         {
            Gyuru.atmablak = new ATMAblak();
            Gyuru.atmablak.show();
         }
      }
      else /* megse irta be a jelszot */
      {
         Gyuru.atmablak = new ATMAblak();
         Gyuru.atmablak.show();
      }
   }

   /*
    * Az uj jelszo eltarolasa (log)
    */
   private void write()
   {
      try
      {
         String s;
         RandomAccessFile raf = new RandomAccessFile(new File("jelszo.txt"),"rw");
         raf.seek(raf.length());
         s = kodol(Gyuru.eszkoz.getiButtonID()+" $"+ujjelszo+"\n");
         raf.writeBytes(s);
      }
      catch(IOException e)
      {
         System.out.println("\u00cdr\u00e1si hiba: jelszo.txt");
      }
      catch(SecurityException e)
      {
         System.out.println("Hozz\u00e1f\u00e9r\u00e9si hiba: jelszo.txt");
      }
   }
   
   /*
    * A logfile-ba kerulo adat kodolasa (erdemes idotol fuggo kodolast alkalmazni)
    */
   private String kodol(String s)
   {
      return(s);
   }

   /*
    * Az uj jelszavak bekeresere szolgalo ablak
    */
   class JelszoModositasAblak extends Dialog implements ActionListener, KeyListener, Runnable
   {
      Label jelszoLabel;
      Button rendbenButton, megsemButton, torlesButton;
      Thread thread;

      public JelszoModositasAblak(String s, String labelszoveg)
      {
         super(Gyuru.atmablak,s,true);

         setSize(300, 200);
         setResizable(false);
         setLocation(250,200);

         setLayout(new BorderLayout());

         Panel szovegPanel = new Panel();
         {
          szovegPanel.setLayout(new FlowLayout());
          {
           szovegPanel.add(new Label(labelszoveg));
          }
          add("North",szovegPanel);
         }
         Panel jelszoPanel = new Panel();
         {
          jelszoPanel.setLayout(new FlowLayout());
          {
           jelszoLabel = new Label("                ");
           jelszoPanel.add(jelszoLabel);
           torlesButton = new Button("t\u00f6rl\u00e9s");
           {
            torlesButton.addActionListener(this);
            torlesButton.addKeyListener(this);
           }
           jelszoPanel.add(torlesButton);
          }
          add("Center",jelszoPanel);
         }
         Panel gombPanel = new Panel();
         {
          gombPanel.setLayout(new FlowLayout());
          {
           rendbenButton = new Button("OK");
           {
            rendbenButton.addActionListener(this);
            rendbenButton.addKeyListener(this);
           }
           gombPanel.add(rendbenButton);
           megsemButton = new Button("M\u00e9gsem");
           {
            megsemButton.addActionListener(this);
            megsemButton.addKeyListener(this);
           }
           gombPanel.add(megsemButton);
          }
          add("South",gombPanel);
         }
         elso = new String("");

         thread = new Thread(this);
         thread.start();
      }

      public void run()
      {
         boolean haveiButton;
         haveiButton = !(Gyuru.eszkoz.eszkozJelen()&&Gyuru.eszkoz.appletJelen());
         while (true)
         {
	         try
   	      {
               Thread.sleep(250);
	         }
	         catch (InterruptedException e)
   	      {
	         }

            try
            {
	            if (haveiButton && !(Gyuru.eszkoz.eszkozJelen()&&Gyuru.eszkoz.appletJelen()&&iButtonID.equals(Gyuru.eszkoz.getiButtonID())))
	            {
	               haveiButton = false;
                  elso = new String("*nemjo*");
                  dispose();
                  thread.stop();
   	         }
	            else
	            {
	               haveiButton = true;
      	      }
            }
            catch (NullPointerException e)
            {
            }
         }
      }

      public void keyTyped(KeyEvent evt)
      {
         String csillag = new String("");
         char[] betuk = new char[elso.length()+1];

         elso.getChars(0,elso.length(),betuk,0);
         switch(betuk[elso.length()] = evt.getKeyChar())
         {
            case (char)(byte)13:
            case evt.VK_ENTER:
            {
               /* OK */
               thread.stop();
               dispose();
               break;
            }
            case evt.VK_CANCEL:
            {
               /* Megsem */
               elso = new String("*nemjo*");
               thread.stop();
               dispose();
               break;
            }
            case evt.VK_BACK_SPACE:
            {
               if(betuk.length!=1)
               {
                  char[] b = new char[betuk.length-2];
                  for(int i = 0;i<b.length;i++)
                  {
                     b[i] = betuk[i];
                  }
                  elso = elso.copyValueOf(b);
                  for(int i = 0;i<elso.length();i++)
                  {
                     csillag = csillag.concat("*");
                  }
                  jelszoLabel.setText(csillag);
               }
               else
               {
               }
               break;
            }
            case evt.VK_CLEAR:
            case evt.VK_ESCAPE:
            {
               /* Torles */
               elso = new String("");
               jelszoLabel.setText("        ");
               break;
            }
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
            case 'a':
            case 'b':
            case 'c':
            case 'd':
            case 'e':
            case 'f':
            case 'g':
            case 'h':
            case 'i':
            case 'j':
            case 'k':
            case 'l':
            case 'm':
            case 'n':
            case 'o':
            case 'p':
            case 'q':
            case 'r':
            case 's':
            case 't':
            case 'u':
            case 'v':
            case 'w':
            case 'x':
            case 'y':
            case 'z':
            case 'A':
            case 'B':
            case 'C':
            case 'D':
            case 'E':
            case 'F':
            case 'G':
            case 'H':
            case 'I':
            case 'J':
            case 'K':
            case 'L':
            case 'M':
            case 'N':
            case 'O':
            case 'P':
            case 'Q':
            case 'R':
            case 'S':
            case 'T':
            case 'U':
            case 'V':
            case 'W':
            case 'X':
            case 'Y':
            case 'Z':
            {
               elso = elso.copyValueOf(betuk);
               for(int i = 0;i<elso.length();i++)
               {
                  csillag = csillag.concat("*");
               }
               jelszoLabel.setText(csillag);
               break;
            }
            default:
            {
               break;
            }
         }
      }

      public void keyPressed(KeyEvent evt)
      {
      }

      public void keyReleased(KeyEvent evt)
      {
      }

      public void actionPerformed(ActionEvent evt)
      {
         if(evt.getSource()==rendbenButton)
         {
            /* OK */
            thread.stop();
            dispose();
         }
         if(evt.getSource()==megsemButton)
         {
            /* Megsem */
            elso = new String("*nemjo*");
            thread.stop();
            dispose();
         }
         if(evt.getSource()==torlesButton)
         {
            /* Torles */
            elso = new String("");
            jelszoLabel.setText("        ");
         }
      }
   }

}