import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.applet.AudioClip;

public class JavaVijf extends Applet
                      implements ActionListener
{
    private TextField passwordEdit,
                      xEdit,
                      yEdit,
                      breedteEdit,
                      hoogteEdit;
    private Button    autoButton;
    private AudioClip sound,
                      sound2;
    private int       x,
                      y,
                      breedte,
                      hoogte;
    private Color     lightBlue = new Color(173, 216, 230);
    private boolean   unlocked  = false,
                      showAuto  = false;
    
    public void init()
    {
        this.setBackground(Color.red);
        setLayout(null);

        autoButton   = new Button("Toon auto");
        passwordEdit = new TextField("");
        xEdit        = new TextField("");
        yEdit        = new TextField("");
        breedteEdit  = new TextField("");
        hoogteEdit   = new TextField("");

        this.add(autoButton);
        this.add(passwordEdit);
        this.add(xEdit);
        this.add(yEdit);
        this.add(breedteEdit);
        this.add(hoogteEdit);

        autoButton .setVisible(false);
        xEdit      .setVisible(false);
        yEdit      .setVisible(false);
        breedteEdit.setVisible(false);
        hoogteEdit .setVisible(false);

        autoButton  .addActionListener(this);
        passwordEdit.addActionListener(this);

        autoButton  .setBounds(390, 470, 100, 19);
        passwordEdit.setBounds(200, 240, 100, 19);
        xEdit       .setBounds(10,  470, 80, 19);
        yEdit       .setBounds(100, 470, 80, 19);
        breedteEdit .setBounds(190, 470, 80, 19);
        hoogteEdit  .setBounds(280, 470, 80, 19);

        passwordEdit.setBackground(Color.yellow);
        xEdit       .setBackground(Color.orange);
        yEdit       .setBackground(Color.cyan);
        breedteEdit .setBackground(Color.orange);
        hoogteEdit  .setBackground(Color.cyan);
        
        passwordEdit.setEchoChar('*');

        sound  = getAudioClip(getDocumentBase(), "gong.au");
        sound2 = getAudioClip(getDocumentBase(), "drip.au");
    }
    
    public void paint(Graphics pen)
    {
        if (unlocked)
        {
            pen.setColor(lightBlue);
            // fill3DRect LIJKT beter te werken dan draw3DRect...
            pen.fill3DRect(0, 0, 500, 500, true);
            if (showAuto)
            {
                xEdit      .setText("x="       + x);
                yEdit      .setText("y="       + y);
                breedteEdit.setText("breedte=" + breedte);
                hoogteEdit .setText("hoogte="  + hoogte);
                
                pen.setColor(Color.magenta);
                this.tekenAuto(pen, x, y, breedte, hoogte);
            }
        }
        else
        {
            pen.setColor(Color.red);
            // fill3DRect LIJKT beter te werken dan draw3DRect...
            pen.fill3DRect(0, 0, 500, 500, true);
            
            pen.setColor(Color.black);
            pen.drawString("Typ a.u.b. het wachtwoord:", 180, 230);
            
            pen.setColor(Color.lightGray);
            pen.drawString("Het juiste wachtwoord is \"code\"!", 170, 280);
        }
    }

    private void tekenAuto(Graphics pen, int x, int y, int breedte, int hoogte)
    {
        /* multiBreedte en multiHoogte zijn de kleinste hoogte en breedte die
         * gebruikt gaan worden en als basis gaan dienen voor alle andere hoogtes
         * en breedten (de "multipliers").
         * De originele en aanbevolen verhouding (anders zijn de wielen niet meer
         * rond maar ovaal) is:
         * breedte : hoogte
         *       6 : 5
         * In dit geval was het niet meer mogelijk om de auto's een opschrift te
         * geven, omdat alleen de hoogte en niet de breedte aangegeven kan worden.
         */
        double multiBreedte = (double) breedte / 12.0;
        double multiHoogte  = (double) hoogte  / 10.0;

        // teken het bovenstuk
        pen.drawLine((int) ((double) x + multiBreedte * 5.0), y, (int) ((double) x + multiBreedte * 3.0) , (int) ((double) y + multiHoogte * 4.0));
        pen.drawLine((int) ((double) x + multiBreedte * 9.0), y, (int) ((double) x + multiBreedte * 11.0), (int) ((double) y + multiHoogte * 4.0));
        pen.drawRect((int) ((double) x + multiBreedte * 5.0), y, (int) (multiBreedte * 4.0), (int) (multiHoogte * 4.0));
        pen.fillRoundRect(x, (int) ((double) y + multiHoogte * 4.0), (int) (multiBreedte * 12.0), (int) (multiHoogte * 4.0), (int) multiBreedte, (int) multiHoogte);

        // teken de wielen
        this.tekenWiel(pen, (int) ((double) x + multiBreedte),       (int) ((double) y + multiHoogte * 6.0), (int) (multiBreedte * 4.0), (int) (multiHoogte * 4.0));
        this.tekenWiel(pen, (int) ((double) x + multiBreedte * 7.0), (int) ((double) y + multiHoogte * 6.0), (int) (multiBreedte * 4.0), (int) (multiHoogte * 4.0));
    }

    private void tekenWiel(Graphics pen, int x, int y, int breedte, int hoogte)
    {
        // bewaar de oude kleur om die later te kunnen herstellen
        Color oudeKleur = pen.getColor();

        // buitenste cirkel
        pen.setColor(Color.black);
        pen.fillOval(x, y, breedte, hoogte);

        // binnenste cirkel
        pen.setColor(Color.white);
        pen.fillOval(x + breedte / 4, y + hoogte / 4, breedte / 2, hoogte / 2);

        pen.setColor(oudeKleur);
    }
    
    public void actionPerformed(ActionEvent e)
    {
        Object sender = e.getSource();
        if (sender == passwordEdit)
            this.passwordEditAction();
        else if (sender == autoButton)
            this.autoButtonAction();
        this.repaint();
    }
    
    private void passwordEditAction()
    {
        if (passwordEdit.getText().equals("code"))
        {
            unlocked = true;
            passwordEdit.setVisible(false);
            autoButton  .setVisible(true);
            this.setBackground(lightBlue);
            this.repaint();
        }
        else
            passwordEdit.setText("");
    }
    
    private void autoButtonAction()
    {
        showAuto = !showAuto;
        xEdit      .setVisible(showAuto);
        yEdit      .setVisible(showAuto);
        breedteEdit.setVisible(showAuto);
        hoogteEdit .setVisible(showAuto);
        if (showAuto)
        {
            sound .play();
            sound2.stop();
            autoButton.setLabel("Verberg auto");
            x       = (int) (Math.random() * 500.0);
            breedte = (int) (Math.random() * (500.0 - x));
            y       = (int) (Math.random() * 460.0);
            hoogte  = (int) (Math.random() * (460.0 - y));
        }
        else
        {
            sound .stop();
            sound2.play();
            autoButton.setLabel("Toon auto");
        }
    }
}