import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.*;

public class GIFMenu extends Applet implements MouseListener, MouseMotionListener
{
 Image image1[] = new Image[1], image2[] = new Image[1];
 Rectangle r1, r, r2;
 GIFM gifm;
 GIFM2 gifm2[];
 GIFT gift;
 MediaTracker tracker;
 String menutree, tree, menu;
 boolean b = true, c = true, b1 = true;
 int l, num[], i, s, a = 0, number = 100, h;
 Image img1, img2;
 
 public void init()
 {
  addMouseListener(this); addMouseMotionListener(this);
  tracker = new MediaTracker(this);
       
  StringTokenizer st = new StringTokenizer(getParameter("menu"), ",|");
  r = new Rectangle(Integer.parseInt(st.nextToken()),
 		    Integer.parseInt(st.nextToken()),
                    Integer.parseInt(st.nextToken()),
                    Integer.parseInt(st.nextToken()));

   
  image1[0] = getImage(getDocumentBase(), st.nextToken());
  image2[0] = getImage(getDocumentBase(), st.nextToken());
  tracker.addImage(image1[0], 0); tracker.addImage(image2[0], 0);

  try { tracker.waitForID(0); } catch (InterruptedException e) {}
  
  gifm = new GIFM(r, image1[0], image2[0]);
  
   setBackground(new Color(255,255,255));

   for (int i = 1; ;i++)
  {

   if (getParameter("menutree"+ i) == null)
   {
      num = new int[i];

      break;
   }
  }

  gifm2 = new GIFM2[num.length-1];

   Graphics g = getGraphics();
   for (h = 1; (menutree = getParameter("menutree" + h)) != null; h++)
   {
     StringTokenizer st1 = new StringTokenizer(menutree, ",|");
     r1 = new Rectangle(r.x, a+r.y+(h*r.height), r.width, r.height);

     img1 = getImage(getDocumentBase(), st1.nextToken());
     img2 = getImage(getDocumentBase(), st1.nextToken());
     tracker.addImage(img1, 1); tracker.addImage(img2, 1);

     try { tracker.waitForID(1); } catch (InterruptedException e) {}

     
     
     for (int i = 1; (tree = getParameter("tree" + h + i)) != null; i++)
       {
        StringTokenizer st2 = new StringTokenizer(tree, ",|");
  	r2 = new Rectangle(r.x, r1.y+(r.height*i), r.width, r.height);

   
              Image img3 = getImage(getDocumentBase(), st2.nextToken());
              tracker.addImage(img3, 2); 
             
              try { tracker.waitForID(2); } catch (InterruptedException e) {}

	     
      }
  } 
  
 }
 
 public void paint(Graphics g)
 {
  a = 0;
  if(c) gifm.drawImage(g, true);
  else  gifm.drawImage(g, false);
   
   if(!b)
   for (h = 1; (menutree = getParameter("menutree" + h)) != null; h++)
   {
     StringTokenizer st1 = new StringTokenizer(menutree, ",|");
     r1 = new Rectangle(r.x, a+r.y+(h*r.height), r.width, r.height);

     img1 = getImage(getDocumentBase(), st1.nextToken());
     img2 = getImage(getDocumentBase(), st1.nextToken());
     //tracker.addImage(img1, 1); tracker.addImage(img2, 1);
     //prepareImage(img1, this); prepareImage(img2, this);
     //try { tracker.waitForID(1); } catch (InterruptedException e) {}

     gifm2[h-1] = new GIFM2(this, r1, img1, img2);

     gifm2[h-1].drawImage(g, true); 
     if (number == (h-1)) { b1 = false; }
      
     if(!b1)
     for (int i = 1; (tree = getParameter("tree" + (number+1) + i)) != null; i++)
       {
        StringTokenizer st2 = new StringTokenizer(tree, ",|");
  	r2 = new Rectangle(r.x, r1.y+(r.height*i), r.width, r.height);

   
              Image img3 = getImage(getDocumentBase(), st2.nextToken());
              //tracker.addImage(img3, 2); 
              //prepareImage(img3, this);
              //try { tracker.waitForID(2); } catch (InterruptedException e) {}

	      gift = new GIFT(r2, img3);

              gift.drawImage(g);
              a = (r.height*i);

      }
     
     b1 = true;
       
   }

  g.setColor(getBackground());
  g.fillRect(r.x, a+r.y+((gifm2.length+1)*r.height), getSize().width, getSize().height); 
  
 }

public void update(Graphics g)
{
 paint(g);

}

public boolean imageUpdate(Image image, int info, int x, 
          int y, int width, int height)
 {
  return true;
 }


 public void mouseExited(MouseEvent me) 
 {

  Graphics g = getGraphics();
  
  if (l == 0) gifm.drawImage(g, true);

   if(!b)
   for (int i = 0; i < gifm2.length; i++)
   {
    gifm2[i].drawImage(g, true);
   }

 }
 public void mouseReleased(MouseEvent me) {}
 public void mouseClicked(MouseEvent me) {}

 public void mouseMoved(MouseEvent me) 
 {

  int x = me.getX(), y = me.getY();
  Graphics g = getGraphics();

  if (gifm.contains(x, y))
  {
   gifm.drawImage(g, false);
  }

  else { if (l == 0) gifm.drawImage(g, true); }


  if(!b)
  for (int i = 0; i < gifm2.length; i++)
   {
  if (gifm2[i].contains(x, y)) gifm2[i].drawImage(g, false);

  else gifm2[i].drawImage(g, true);
   }

  
 }
 
 public void mouseDragged(MouseEvent me) {}

 public void mouseEntered(MouseEvent me) {}  

 public void mousePressed(MouseEvent me) 
 {
  int x = me.getX(), y = me.getY();
  Graphics g = getGraphics();
        
  if (gifm.contains(x, y))
  {
  l ^= 1;
  if (l == 1)
  {
   b = false; c = false; repaint();
  } 

  else { b = true; b1 = true; c = false; number = -1; 
                    g.setColor(getBackground());
                    g.fillRect(r.x, r.height, getSize().width, getSize().height); 
                    s = 0; a = 0;  repaint(); 
         }
  }
 
  if(!b)
  for (int m = 0; m < gifm2.length; m++)
   {
    if (gifm2[m].contains(x, y))
      {
       number = m;  s = 0; a = 0; repaint(); 
      }
   
   }
  
 }
 
 public int setTree()
 {
  return number;
 }

}

class GIFM extends Canvas
{
 Rectangle r;
 Image image1, image2;
  
 
 public GIFM(Rectangle r, Image image1, Image image2)
 {
  this.r = r; this.image1 = image1; this.image2 = image2;

 }

 public void drawImage(Graphics g, boolean b)
 {
  if(b) g.drawImage(image1, r.x, r.y, r.width, r.height, this);
  
  else  g.drawImage(image2, r.x, r.y, r.width, r.height, this);
 }

 public boolean contains (int x, int y)
 {
  if (x >= r.x && x < r.x+r.width && y >= r.y && y < r.y+r.height) return true;
  
  else return false;
 }

}

class GIFM2 extends Canvas
{
 Rectangle r;
 Image image1, image2;
 int w, s;
 GIFMenu u;
   
 public GIFM2(GIFMenu u, Rectangle r, Image image1, Image image2)
 {
  this.u = u; this.r = r; this.image1 = image1; this.image2 = image2;

 }
 
 

 public void drawImage(Graphics g, boolean b)
 {
  if(b) g.drawImage(image1, r.x, r.y, r.width, r.height, this);
  
  else  g.drawImage(image2, r.x, r.y, r.width, r.height, this);
 }

 public boolean contains (int x, int y)
 {
  if (x >= r.x && x < r.x+r.width && y >= r.y && y < r.y+r.height) return true;
  
  else return false;
 }
 

}

class GIFT extends Canvas
{
 Rectangle r;
 Image image1;
 
 public GIFT(Rectangle r, Image image1)
 {
  this.r = r; this.image1 = image1; 

 }


 public void drawImage(Graphics g)
 {
  g.drawImage(image1, r.x, r.y, r.width, r.height, this);
 }

 public boolean contains (int x, int y)
 {
  if (x >= r.x && x < r.x+r.width && y >= r.y && y < r.y+r.height) return true;
  
  else return false;
 }

}

