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

/* 
 * a banki ATM automata 
 */
class ATMAblak extends Frame 
               implements ActionListener, 
                          Runnable
{
   Button egyenlegButton, /* a gyurun levo egyenleg lekerdezese */
          feltoltesButton, /* a gyurun levo egyenleg megvaltoztatasa */
          limitkerdezButton, /* a gyurun levo limit lekerdezese */
          limitButton, /* a gyurun levo limit megvaltoztatasa */
          kodszoButton, /* a gyurun levo jelszo megvaltoztatasa */
          visszaButton; /* vissza az utcara */
   Thread thread; /* a gyurut figyelo szal */
   String jelszo = new String(""); /* a megadott jelszo */
   String iButtonID = new String(""); /* a gyuru azonositoja */
   
   final String ATMazonosito = new String("1"); /* az ATM automata azonositoja */

   public ATMAblak() 
   {
      setSize(300, 200);
      setResizable(false);
      setLocation(250,200);

      setLayout(new BorderLayout());

      Panel gombPanel = new Panel();
      {
       gombPanel.setLayout(new GridLayout(0,1));
       egyenlegButton = new Button("Egyenleg lek\u00e9rdez\u00e9se"); 
       {
        gombPanel.add(egyenlegButton);
        egyenlegButton.addActionListener(this);
       }
       feltoltesButton = new Button("Egyenleg m\u00f3dos\u00edt\u00e1sa");
       {
        gombPanel.add(feltoltesButton);
        feltoltesButton.addActionListener(this);
       }
       limitkerdezButton = new Button("P\u00e9nzlimit lek\u00e9rdez\u00e9se");
       {
        gombPanel.add(limitkerdezButton);
        limitkerdezButton.addActionListener(this);
       }
       limitButton = new Button("P\u00e9nzlimit megv\u00e1ltoztat\u00e1sa");
       {
        gombPanel.add(limitButton);
        limitButton.addActionListener(this);
       }
       kodszoButton = new Button("K\u00f3dsz\u00f3 megv\u00e1ltoztat\u00e1sa");
       {
        gombPanel.add(kodszoButton);
        kodszoButton.addActionListener(this);
       }
       add("North",gombPanel);
      }

      Panel szovegPanel = new Panel();
      {
       szovegPanel.setLayout(new FlowLayout());
       {
        szovegPanel.add(
         (new Label("V\u00e1laszd ki a Neked tetsz\u00f4 gombot!")));
       }
       add("Center",szovegPanel);
      }

      Panel kilepPanel = new Panel();
      {
       kilepPanel.setLayout(new FlowLayout());
       visszaButton = new Button("Vissza az utc\u00e1ra");
       {
        kilepPanel.add(visszaButton);
        visszaButton.addActionListener(this);
       }
       add("South",kilepPanel);
      }
      thread = new Thread(this);
      thread.start();
   }

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

         try
         {
            // Ellenorzi az eltuno iButton-t
            if (haveiButton&& 
                !(Gyuru.eszkoz.eszkozJelen()&&
                  Gyuru.eszkoz.appletJelen()))
            {
               haveiButton = false;
               setTitle("ATM automata (nincs eszk\u00f6z jelen)");
               egyenlegButton.setEnabled(false);
               feltoltesButton.setEnabled(false);
               limitkerdezButton.setEnabled(false);
               limitButton.setEnabled(false);
               kodszoButton.setEnabled(false);
            }
            // Ellenorzi a megjeleno iButton-t
            else if (!haveiButton&& 
                     (Gyuru.eszkoz.eszkozJelen()&&
                      Gyuru.eszkoz.appletJelen()))
            {
               haveiButton = true;
               if(iButtonID.equals(""))
               {
                  iButtonID = Gyuru.eszkoz.getiButtonID();
               }
               else
               {
               }
               if(!iButtonID.equals(Gyuru.eszkoz.getiButtonID()))
               {
                  setTitle("ATM automata (eszk\u00f6z megv\u00e1ltozott)");
                  egyenlegButton.setEnabled(false);
                  feltoltesButton.setEnabled(false);
                  limitkerdezButton.setEnabled(false);
                  limitButton.setEnabled(false);
                  kodszoButton.setEnabled(false);
               }
               else
               {
                  setTitle("ATM automata (eszk\u00f6z el\u00e9rhet\u00f4)");
                  egyenlegButton.setEnabled(true);
                  feltoltesButton.setEnabled(true);
                  limitkerdezButton.setEnabled(true);
                  limitButton.setEnabled(true);
                  kodszoButton.setEnabled(true);
               }
            }
         }
         catch(NullPointerException e)
         {
         }
      }
   }

   public void actionPerformed(ActionEvent evt)
   {
      if(evt.getSource()==visszaButton)
      {
         /* Vissza */
         dispose();
         thread.stop();
         Gyuru.valasztasablak = new ValasztasAblak();
         Gyuru.valasztasablak.show();
      }
      if(evt.getSource()==egyenlegButton)
      {
         /* Egyenleg */
         dispose();
         thread.stop();
         Gyuru.egyenlegatmablak = new EgyenlegATMAblak(iButtonID);
         Gyuru.egyenlegatmablak.show();
      }
      if(evt.getSource()==feltoltesButton)
      {
         /* Feltoles */
         setVisible(false);
         JelszoAblak jelszoablak = new JelszoAblak("");
         jelszoablak.show();
         /* helyes jeszot adtak meg */
         try
         {
            if(Gyuru.eszkoz.jelszoHasonlit(jelszo))
            {
               dispose();
               thread.stop();
               Gyuru.egyenlegmodositasablak = 
                  new EgyenlegModositasAblak(ATMazonosito,iButtonID);
               Gyuru.egyenlegmodositasablak.show();
            }
            /* rossz jelszot adtak meg */
            else if(!jelszo.equals("*nemjo*"))
            {
               SzovegAblak szovegablak = 
                  new SzovegAblak("Hib\u00e1s jelsz\u00f3",
                                  "Ez a jelsz\u00f3 nem \u00e9rv\u00e9nyes az "+
                                  "eszk\u00f6z\u00f6n!");
               szovegablak.show();
               setVisible(true);
            }
            else /* nem adtak meg jelszot */
            {
               setVisible(true);
            }
         }
         catch(NullPointerException e)
         {
            Gyuru.atmablak = new ATMAblak();
            Gyuru.atmablak.show();
         }
      }
      if(evt.getSource()==limitkerdezButton)
      {
         /* Limit lekerdezese */
         dispose();
         thread.stop();
         Gyuru.limitatmablak = new LimitATMAblak(iButtonID);
         Gyuru.limitatmablak.show();
      }
      if(evt.getSource()==limitButton)
      {
         /* Limit megvaltoztatasa */
         setVisible(false);
         JelszoAblak jelszoablak = new JelszoAblak("");
         jelszoablak.show();
         try
         {
            if(Gyuru.eszkoz.jelszoHasonlit(jelszo))
            {
               dispose();
               thread.stop();
               Gyuru.limitmodositasablak = 
                  new LimitModositasAblak(ATMazonosito,iButtonID);
               Gyuru.limitmodositasablak.show();
            }
            else if(!jelszo.equals("*nemjo*"))
            {
               SzovegAblak szovegablak = 
                  new SzovegAblak("Hib\u00e1s jelsz\u00f3",
                                  "Ez a jelsz\u00f3 nem \u00e9rv\u00e9nyes az "+
                                  "eszk\u00f6z\u00f6n!");
               szovegablak.show();
               setVisible(true);
            }
            else
            {
               setVisible(true);
            }
         }
         catch(NullPointerException e)
         {
            Gyuru.atmablak = new ATMAblak();
            Gyuru.atmablak.show();
         }
      }
      if(evt.getSource()==kodszoButton)
      {
         /* Kodszo megvaltoztatasa */
         setVisible(false);
         JelszoAblak jelszoablak = new JelszoAblak("");
         jelszoablak.show();
         try
         {
            if(Gyuru.eszkoz.jelszoHasonlit(jelszo))
            {
               dispose();
               thread.stop();
               Gyuru.jelszomodositas = 
                  new JelszoModositas(ATMazonosito,iButtonID);
            }
            else if(!jelszo.equals("*nemjo*"))
            {
               SzovegAblak szovegablak = 
                  new SzovegAblak("Hib\u00e1s jelsz\u00f3",
                                  "Ez a jelsz\u00f3 nem \u00e9rv\u00e9nyes az "+
                                  "eszk\u00f6z\u00f6n!");
               szovegablak.show();
               setVisible(true);
            }
            else
            {
               setVisible(true);
            }
         }
         catch(NullPointerException e)
         {
            Gyuru.atmablak = new ATMAblak();
            Gyuru.atmablak.show();
         }
      }
   }

   /*
    * a megadott parameterekkel DialogusAblakot hoz letre 
    */
   class SzovegAblak extends Dialog implements ActionListener
   {
      Label szovegLabel;
      Button rendbenButton;

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

         setSize(500, 100);
         setResizable(false);
         setLocation(150,250);

         setLayout(new BorderLayout());

         Panel szovegPanel = new Panel();
         {
          szovegPanel.setLayout(new FlowLayout());
          {
           szovegPanel.add(new Label(labelszoveg));
          }
          add("Center",szovegPanel);
         }
         Panel gombPanel = new Panel();
         {
          gombPanel.setLayout(new FlowLayout());
          {
           rendbenButton = new Button("OK");
           {
            rendbenButton.addActionListener(this);
           }
           gombPanel.add(rendbenButton);
          }
          add("South",gombPanel);
         }
      }

      public void actionPerformed(ActionEvent evt)
      {
         if(evt.getSource()==rendbenButton)
         {
            /* OK */
            dispose();
         }
      }
   }

   /* 
    * jelszo megkerdezese
    * (egyeb megjegyzesek: VasarlasAblak.class)
    */
   class JelszoAblak extends Dialog 
                     implements ActionListener, 
                                KeyListener, 
                                Runnable
   {
      Label jelszoLabel;
      Button rendbenButton, 
             megsemButton, 
             torlesButton;
      String regi = new String("");
      Thread thread;

      public JelszoAblak(String s)
      {
         super(Gyuru.atmablak,"Jelsz\u00f3 be\u00edr\u00e1sa",true);
         
         setSize(300, 200);
         setResizable(false);
         setLocation(250,200);

         setLayout(new BorderLayout());

         Panel szovegPanel = new Panel();
         {
          szovegPanel.setLayout(new FlowLayout());
          {
           szovegPanel.add(new Label("\u00cdrd be a jelszavadat!"));
          }
          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);
         }
         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;
                  jelszo = 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[regi.length()+1];

         regi.getChars(0,regi.length(),betuk,0);
         switch(betuk[regi.length()] = evt.getKeyChar())
         {
            case (char)(byte)13:
            case evt.VK_ENTER:
            {
               /* OK */
               jelszo = regi;
               thread.stop();
               dispose();
               break;
            }
            case evt.VK_CANCEL:
            {
               /* Megsem */
               jelszo = 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];
                  }
                  regi = regi.copyValueOf(b);
                  for(int i = 0;i<regi.length();i++)
                  {
                     csillag = csillag.concat("*");
                  }
                  jelszoLabel.setText(csillag);
                  jelszo = regi;
               }
               else
               {
               }
               break;
            }
            case evt.VK_CLEAR:
            case evt.VK_ESCAPE:
            {
               /* Torles */
               regi = 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':
            {
               regi = regi.copyValueOf(betuk);
               for(int i = 0;i<regi.length();i++)
               {
                  csillag = csillag.concat("*");
               }
               jelszoLabel.setText(csillag);
               jelszo = regi;
               break;
            }
            default:
            {
               break;
            }
         }
      }

      public void keyPressed(KeyEvent evt)
      {
      }

      public void keyReleased(KeyEvent evt)
      {
      }

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