import java.applet.*;
import java.awt.*;
import java.net.*;

public class buttonmenu extends Applet {


//"maxitems" får hålla reda på hur
//många menyknappar användaren har
//specifierat.
public int maxitems;

//Nu när vi har flera knappar så
//måste vi göra om alla bildvariabler
//till arrayer.
public Image currentimage[],normalimage[],mouseoverimage[];

//Nu lägger vi till ännu en bild för att
//visa att besökaren har klickat på en knapp.
public Image mousedownimage[];

//Arrayen "urls" får hålla reda på
//adressen för varje knapp.
//"target" är målramen.
public String urls[],target;

//Vi slipper inte ifrån dubbelbuffringen
//den här gången, nu när vi ritar ut
//flera bilder. Dimension behövs också.
//Vi bör också låta användaren
//specifiera en bakgrundsfärg och
//bakgrundsbild.
public Image bufferimage;
public Graphics bufferg;
public Color backgroundcolor;
public Image backgroundimage=null;
public Dimension d;

//"currentitem" kommer att användas
//för att hålla reda på vilken
//knapp som precis har valts.
public int currentitem=0;

public void init()
{
    MediaTracker tracker=new MediaTracker(this);

    //Vi har tidigare använt oss
    //av en "maxitems" parameter för
    //att specifiera antal bilder eller
    //meddelanden. Nu så kommer vi istället att
    //söka oss fram. While-slingan kommer
    //att leta efter parametern "normalimage0",
    //"normalimage1", "normalimage2" osv tills
    //den inte hittar fler sådana parametrar.
    //Samtidigt så inkrementeras "maxitems" för
    //att hållar räkningen.
    maxitems=0;
    while (getParameter("normalimage"+maxitems)!=null) maxitems++;

    normalimage=new Image[maxitems];
    currentimage=new Image[maxitems];
    mouseoverimage=new Image[maxitems];
    mousedownimage=new Image[maxitems];
    urls=new String[maxitems];

    //for-slingan laddar in alla bilder.
    for (int i=0; i<maxitems; i++)
    {
        //Observera tricket vi använder för att
        //lägga in bilderna i spåraren.
        normalimage[i]=getImage(getDocumentBase(),getParameter("normalimage"+i));
        tracker.addImage(normalimage[i],i*3);
        mouseoverimage[i]=getImage(getDocumentBase(),getParameter("mouseoverimage"+i));
        tracker.addImage(mouseoverimage[i],i*3+1);
        mousedownimage[i]=getImage(getDocumentBase(),getParameter("mousedownimage"+i));
        tracker.addImage(mousedownimage[i],i*3+2);
        currentimage[i]=normalimage[i];

        //Vi passar på att ladda in adresserna
        //och lagrar dem i "urls".
        urls[i]=getParameter("url"+i);
    }
    try {tracker.waitForAll();}
    catch(InterruptedException e)
    {
        System.out.println("Någonting stoppade inladdningen...");
    }

    //Targetparametern laddas in...
    target=getParameter("target");

    //Här kommer koden som hanterar
    //bakgrundsfärgen och bakgrundsbilden.
    //Det är bara att klistra in raderna
    //från textscroller3 exemplet.
    backgroundcolor=new Color(getIntegerParameter("backgroundcolor",16));
    String backimage=getParameter("backgroundimage");
    if (backimage!=null &&
        (backimage.toUpperCase().indexOf("JPG")>-1 ||
        backimage.toUpperCase().indexOf("GIF")>-1))
    {
        backgroundimage=getImage(getDocumentBase(),backimage);
        tracker.addImage(backgroundimage,0);
        try {tracker.waitForAll();}
        catch(InterruptedException e) {}
    }

    //Slutligen måste vi initiera bufferten.
    //Det är bara att klistra in raderna
    //från textscroller3 exemplet.
    d=size();
    bufferimage=createImage(d.width,d.height);
    bufferg=bufferimage.getGraphics();
}

public int getIntegerParameter(String name, int base)
{
    String value=getParameter(name);
    int intvalue;
    try {intvalue=Integer.parseInt(value,base);}
    catch (NumberFormatException e) {return 0;}
    return intvalue;
}

public void paint(Graphics g)
{
    if (bufferg!=null)
    {
        if (backgroundimage!=null)
        {
            bufferg.drawImage(backgroundimage,0,0,this);
        }
        else
        {
            bufferg.setColor(backgroundcolor);
            bufferg.fillRect(0,0,d.width,d.height);
        }
        //Slingan ser till att alla knappar
        //ritas ut.
        for (int i=0; i<maxitems; i++)
        {
            //Följande rad används för att centrera
            //knappen horizontellt.
            int dx=(d.width-currentimage[i].getWidth(this))/2;

            //Följande rad används för att centrera
            //knappen vertikalt.
            int dy=(d.height/maxitems-currentimage[i].getHeight(this))/2;

            //Observer att eftersom menyn är en vertikal
            //meny så ser vi till att det finns ett
            //steg på (d.height/maxitems) innan nästa
            //knapp ritas ut.
            bufferg.drawImage(currentimage[i],dx,dy+i*d.height/maxitems,this);
        }
        g.drawImage(bufferimage,0,0,this);
    }
}

public void update(Graphics g) {paint(g);}

public boolean mouseMove(Event e, int x, int y)
{
    //När muspekaren kommer in i appleten
    //så måste vi räkna ut vilken knapp
    //som han pekar på. Vi vet att
    //området som varje knapp "innehar", är
    //(d.height/maxitems). Så vi delar
    //muspekarens y-parameter med det
    //här värdet, och vi får ett index
    //som vi kan använda.
    currentitem=y/(d.height/maxitems);

    //Först måste vi undersöka att innehållet
    //i "currentitem" inte ger oss en
    //ArrayOutOfBoundsException.
    if (currentitem>=0 && currentitem<maxitems)
    {
        //"nollställ" alla knappar så att
        //de pekar på den normala bilden.
        for (int i=0; i<maxitems; i++)
            currentimage[i]=normalimage[i];
        currentimage[currentitem]=mouseoverimage[currentitem];
    }

    //update() ser till att skärmen
    //updateras efter att bilden har ändrats.
    update(getGraphics());
    return true;
}

public boolean mouseExit(Event e, int x, int y)
{
    //Om besökaren lämnar appletområdet så
    //måste "currentimage" arrayen nollställas.
    for (int i=0; i<maxitems; i++)
        currentimage[i]=normalimage[i];
    update(getGraphics());
    return true;
}

public boolean mouseDown(Event e, int x, int y)
{
    //Om användaren klickar på en knapp
    //så måste vi först ändra bilden.
    currentimage[currentitem]=mousedownimage[currentitem];
    update(getGraphics());

    //Nu exekverar vi adressen relaterat till
    //det menyvalet.
    gotoURL(urls[currentitem],target);
    return true;
}

public void gotoURL(String address, String target)
{
    URL link=null;
    AppletContext appletcontrol=getAppletContext();
    try {link=new URL(address);}
    catch (MalformedURLException ex)
    {
        showStatus("FELSKRIVEN ADRESS."+address);
    };
    if (link!=null)
    {
        if (target!=null && target.length()>0) appletcontrol.showDocument(link,target);
        else appletcontrol.showDocument(link);
    }
}


}
