import java.awt.*;
import java.applet.*;
import java.util.*;
import java.awt.event.*;
import java.awt.image.*;

public class GIFMenu2 extends Applet implements MouseListener, MouseMotionListener 
{
 Image bg_image[] = new Image[1];
 Image menu_image[];
 MediaTracker tracker;
 boolean b = true, b1 = true, b2 = true;
 Rectangle menu_rect, tree_rect;
 String menu_text, tree_text;
 IMenu imenu[];
 ITree itree[][];

 Font menu_textfont, tree_textfont;

 Color menu_textcolor[]     = new Color[2];
 Color menu_trianglecolor[] = new Color[2];
 Color tree_textcolor[]     = new Color[2];
 Color tree_squarecolor[]   = new Color[2];

 Color bg_color[]           = new Color[1];
 String menu, tree;
 FontMetrics fm_menu, fm_tree;
 Thread th;

 boolean image_key = true;
 boolean transparent;
 int u = 1000;
 int a = 0, t = 0, k1 = 0, i = 0, number = 1000;
  
 Vector v;

 Image upd;
 Graphics gr;
 StringTokenizer st2;

 Image bg[] = new Image[1];

 public void init()
 {
  addMouseListener(this); addMouseMotionListener(this);
  v = new Vector(); 

  tracker = new MediaTracker(this);
  upd = createImage(getSize().width, getSize().height);
  gr = upd.getGraphics();

     for(int i = 1; (getParameter("menu" + i)) != null; i++)
     { 
      
      itree      = new ITree[i][100];
      menu_image = new Image[i];

       for(int k = 1; (tree = getParameter("tree" + i + k)) != null; k++)
       {
        
        k1 = k;
     
       }

      v.addElement(new Integer(k1));
      k1 = 0;

      imenu      = new IMenu[i];
      
     }

/********************************* M E N U ****************************************/
      
     StringTokenizer st3 = new StringTokenizer(getParameter("menu_textcolor"), ",#");
  
     menu_textcolor[0] = new Color(Integer.parseInt(st3.nextToken()), 
                                   Integer.parseInt(st3.nextToken()), 
                                   Integer.parseInt(st3.nextToken()));

     menu_textcolor[1] = new Color(Integer.parseInt(st3.nextToken()), 
                                   Integer.parseInt(st3.nextToken()), 
                                   Integer.parseInt(st3.nextToken()));


     StringTokenizer st5 = new StringTokenizer(getParameter("menu_trianglecolor"), ",#");
  
     menu_trianglecolor[0] = new Color(Integer.parseInt(st5.nextToken()), 
                                       Integer.parseInt(st5.nextToken()), 
                                       Integer.parseInt(st5.nextToken()));

     menu_trianglecolor[1] = new Color(Integer.parseInt(st5.nextToken()), 
                                       Integer.parseInt(st5.nextToken()), 
                                       Integer.parseInt(st5.nextToken()));


     StringTokenizer st4 = new StringTokenizer(getParameter("menu_textfont"), ",#"); 
  
     menu_textfont = new Font(st4.nextToken(), Integer.parseInt(st4.nextToken()), 
                                               Integer.parseInt(st4.nextToken()));

     fm_menu = getFontMetrics(menu_textfont);


/************************************ T R E E **************************************/
     StringTokenizer st6 = new StringTokenizer(getParameter("tree_textcolor"), ",#");
  
     tree_textcolor[0] = new Color(Integer.parseInt(st6.nextToken()), 
                                   Integer.parseInt(st6.nextToken()), 
                                   Integer.parseInt(st6.nextToken()));

     tree_textcolor[1] = new Color(Integer.parseInt(st6.nextToken()), 
                                   Integer.parseInt(st6.nextToken()), 
                                   Integer.parseInt(st6.nextToken()));


     StringTokenizer st7 = new StringTokenizer(getParameter("tree_squarecolor"), ",#");
  
     tree_squarecolor[0] = new Color(Integer.parseInt(st7.nextToken()), 
                                     Integer.parseInt(st7.nextToken()), 
                                     Integer.parseInt(st7.nextToken()));

     tree_squarecolor[1] = new Color(Integer.parseInt(st7.nextToken()), 
                                     Integer.parseInt(st7.nextToken()), 
                                     Integer.parseInt(st7.nextToken()));


     StringTokenizer st8 = new StringTokenizer(getParameter("tree_textfont"), ",#"); 
  
     tree_textfont = new Font(st8.nextToken(), Integer.parseInt(st8.nextToken()), 
                                               Integer.parseInt(st8.nextToken()));

     fm_tree = getFontMetrics(tree_textfont);

/********************************************************************************/

          
     bg_image[0] = getImage(getDocumentBase(), getParameter("bg_image"));

     transparent = Boolean.valueOf(getParameter("transparent_boolean")).booleanValue();

     if(transparent) {
                      bg[0] = getImage(getDocumentBase(), getParameter("transparent_image"));
                      tracker.addImage(bg[0], 0);
                     }

     tracker.addImage(bg_image[0], 0);
     try { tracker.waitForID(0); } catch (InterruptedException e) {}

     
     for(int i = 0; (menu = getParameter("menu" + (i+1))) != null; i++)
     {
      StringTokenizer st1 = new StringTokenizer(menu, "#");
     
      menu_text = st1.nextToken();

      menu_image[i] = getImage(getDocumentBase(), st1.nextToken());
      tracker.addImage(menu_image[i], (i+1));
      try { tracker.waitForID((i+1)); } catch (InterruptedException e) {}
 
      menu_rect = new Rectangle(0, (i+1)*fm_menu.getHeight(), getSize().width, fm_menu.getHeight());

      imenu[i] = new IMenu(menu_text, menu_textcolor[0], menu_textcolor[1], menu_trianglecolor[0],
                           menu_trianglecolor[1], menu_textfont, menu_rect, this);


          for(int t = 0; (tree = getParameter("tree" + (i+1) + (t+1))) != null; t++)
          {
            
            st2 = new StringTokenizer(tree, "#");
                       
     
               tree_text = st2.nextToken();

               String tree_text2 = st2.nextToken();

               tree_rect = new Rectangle(0, menu_rect.y+(t+1)*fm_menu.getHeight(), 
                                       getSize().width, fm_menu.getHeight());

               itree[i][t] = new ITree(tree_text, tree_textcolor[0], tree_textcolor[1], 
                                       tree_squarecolor[0], tree_squarecolor[1], 
                                       tree_textfont, tree_rect, this);
        
          }
          
   
     }

    

 StringTokenizer st = new StringTokenizer(getParameter("bg_color"), ",");
  
 bg_color[0] = new Color(Integer.parseInt(st.nextToken()), 
                         Integer.parseInt(st.nextToken()), 
                         Integer.parseInt(st.nextToken()));

 setBackground(bg_color[0]);

 }

   String[] parse(String s, String sep) {
	StringTokenizer st = new StringTokenizer(s, sep);
        String result[] = new String[st.countTokens()];

	for (int i=0; i<result.length; i++) {
            result[i] = st.nextToken();
	}
        return result;
    }

 
  public int setMenuInt() { return u; }

  public void paint(Graphics g)
  {

   update(g);
  }

  public void update(Graphics g)
  {
   a = 0;
   if(image_key) gr.drawImage(bg_image[0], 0, 0, this);

   else          
                 {
                  if(transparent) gr.drawImage(bg[0], 0, 0, this);
                  gr.drawImage(menu_image[setMenuInt()], 0, 0, this);
                 }


  for(int i = 0; (menu = getParameter("menu" + (i+1))) != null; i++)
     {
      StringTokenizer st1 = new StringTokenizer(menu, "#");
     
      menu_text = st1.nextToken();

      menu_image[i] = getImage(getDocumentBase(), st1.nextToken());
      
      
      menu_rect = new Rectangle(0, a+(i+1)*fm_menu.getHeight(), getSize().width, fm_menu.getHeight());

      imenu[i] = new IMenu(menu_text, menu_textcolor[0], menu_textcolor[1], menu_trianglecolor[0],
                           menu_trianglecolor[1], menu_textfont, menu_rect, this);


      imenu[i].drawTriangle(gr, true);
      imenu[i].drawText(gr, true);

      if(number == i) b1 = false;
     

        if(!b1)
        
        for(int t = 0; (tree = getParameter("tree" + (i+1) + (t+1))) != null; t++)
         {
           
           st2 = new StringTokenizer(tree, "#");
           
             tree_text = st2.nextToken();

             String tree_text2 = st2.nextToken();

             tree_rect = new Rectangle(0, menu_rect.y+(t+1)*fm_menu.getHeight(), 
                                       getSize().width, fm_menu.getHeight());


             itree[number][t] = new ITree(tree_text, tree_textcolor[0], tree_textcolor[1], 
                                          tree_squarecolor[0], tree_squarecolor[1], 
                                          tree_textfont, tree_rect, this);

             itree[number][t].drawText(gr);
             itree[number][t].drawCircle(gr, true);

              
             a = (t+1)*fm_menu.getHeight();
            
            
        }
      
      b1 = true;

     }

  g.drawImage(upd, 0, 0, getSize().width, getSize().height, this);
  
 }

 public int setTree() { return number; }

  public void mouseExited(MouseEvent mee)
  {
   Graphics g = getGraphics();

   for(int i = 0; i < imenu.length; i++) 	
    {
      imenu[i].drawTriangle(g, true); 
    }
   
   if(!b2)
   {
    t = ((Integer) v.elementAt(number)).intValue();   
    for(int k = 0; k < t; k++)
     {
      itree[number][k].drawCircle(g, true);
     }
   }



 }

 public void mouseReleased(MouseEvent mee){}

 public void mouseClicked(MouseEvent mee) {}

 public void mouseMoved(MouseEvent mee)
 {
  Graphics g = getGraphics();
  int x = mee.getX(), y = mee.getY();
  for(int i = 0; i < imenu.length; i++) 	
  {
   if (imenu[i].contains(x, y)) { imenu[i].drawTriangle(g, false); u = i; }
  
   else                         { imenu[i].drawTriangle(g, true); }
  
  }

  

if(!b2)
{
  t = ((Integer) v.elementAt(number)).intValue();   
  for(int k = 0; k < t; k++)
  {  
     if (itree[number][k].contains(x, y)) 
     { 
      itree[number][k].drawCircle(g, false);
   
     } 
                               
     else { itree[number][k].drawCircle(g, true); } 
   
   
  }
} 
 
 

} 

 public void mouseDragged(MouseEvent mee) {}

 public void mouseEntered(MouseEvent mee) {}  

 public void mousePressed(MouseEvent mee) 
 {
   Graphics g = getGraphics();
   int x = mee.getX(), y = mee.getY();

   for(int i = 0; i < imenu.length; i++) 	
   {
    if (imenu[i].contains(x, y)) { number = i; a = 0; u = i; 
                                   image_key = false; 
                                   b2 = false; repaint(); }

   } 


if(!b2)
{
  t = ((Integer) v.elementAt(number)).intValue();   
  for(int k = 0; k < t; k++)
  {  
     if (itree[number][k].contains(x, y)) 
     { 
      itree[number][k].drawCircle(g, false);
     } 
                               
     else { itree[number][k].drawCircle(g, true);  } 
   
   
  }
}  

  
 }

}


class IMenu extends Canvas
{
 String menu_text; 
 Color menu_textcolor1, menu_textcolor2;
 Color menu_trianglecolor1, menu_trianglecolor2; 
 Font menu_textfont; 
 Rectangle menu_rect;
 FontMetrics fm;
 GIFMenu2 im;
 Polygon p1, p2;
 int z;
 

  public IMenu(String menu_text, Color menu_textcolor1, Color menu_textcolor2, Color menu_trianglecolor1, 
               Color menu_trianglecolor2, Font menu_textfont, Rectangle menu_rect, GIFMenu2 im)
 
  {
   this.menu_text        = menu_text; 
   this.menu_textcolor1  = menu_textcolor1;
   this.menu_textcolor2  = menu_textcolor2;
   this.menu_trianglecolor1  = menu_trianglecolor1;
   this.menu_trianglecolor2  = menu_trianglecolor2;  
   this.menu_textfont    = menu_textfont; 
   this.menu_rect        = menu_rect;
   
   this.im = im;

   fm = getFontMetrics(menu_textfont);
   z = menu_rect.y-menu_rect.height;

   
  }


 public void drawText(Graphics g, boolean b)
 {
  g.setFont(menu_textfont);
  g.setColor(menu_textcolor2);
  g.drawString(menu_text, ((menu_rect.width-(fm.stringWidth(menu_text)))/2)-1, (menu_rect.y-2+1));
        

  if(b) {
       
         g.setColor(menu_textcolor1);
         g.drawString(menu_text, (menu_rect.width-(fm.stringWidth(menu_text)))/2, (menu_rect.y-2));
     
   }

  else   {

          g.setColor(menu_textcolor2);
          g.drawString(menu_text, (menu_rect.width-(fm.stringWidth(menu_text)+14)), (menu_rect.y-2));
         }
  
 }

 public boolean contains (int x, int y)
  {
   if (x >= menu_rect.x && x < (menu_rect.x+menu_rect.width) && y >= z && y < (menu_rect.y)) return true;
  
   else return false;
  }



 public void drawTriangle(Graphics g, boolean b)
 {
   int[] x2 = {menu_rect.width-4, menu_rect.width-12, menu_rect.width-8, menu_rect.width-4};
   int[] x1 = {menu_rect.x+4, menu_rect.x+12, menu_rect.x+8, menu_rect.x+4};
   int[] y2 = {z+4, z+4, z+12, z+4};
   p1 = new Polygon(x1, y2, 4); 
   p2 = new Polygon(x2, y2, 4);  

   if(b)
   {
     
     g.setColor(menu_trianglecolor1);
     g.fillPolygon(p1); 
     g.fillPolygon(p2);
   }
   else {

         g.setColor(menu_trianglecolor2);
         g.fillPolygon(p1); 
         g.fillPolygon(p2);     
         
        }

 }

}


class ITree extends Canvas
{
 String tree_text; 
 Rectangle tree_rect;
 Color tree_textcolor1, tree_textcolor2, tree_squarecolor1, tree_squarecolor2;
 Font tree_textfont;
 FontMetrics fm;
 GIFMenu2 im;
 int z;
 

  public ITree(String tree_text, Color tree_textcolor1, Color tree_textcolor2, 
               Color tree_squarecolor1, Color tree_squarecolor2, Font tree_textfont, 
               Rectangle tree_rect, GIFMenu2 im)
 
  {
   this.tree_text        = tree_text; 
   this.tree_rect        = tree_rect;

   this.tree_textcolor1      = tree_textcolor1;
   this.tree_textcolor2      = tree_textcolor2;
   this.tree_squarecolor1    = tree_squarecolor1;
   this.tree_squarecolor2    = tree_squarecolor2;  
   this.tree_textfont        = tree_textfont; 
      
   this.im = im;

   fm = getFontMetrics(tree_textfont);

   z = tree_rect.y-tree_rect.height; 
   
  }


 public void drawText(Graphics g)
 {
  g.setFont(tree_textfont);
  g.setColor(tree_textcolor2);
  g.drawString(tree_text, ((tree_rect.width-(fm.stringWidth(tree_text)))/2)-1, (tree_rect.y-2+1));
  
  g.setColor(tree_textcolor1);
  g.drawString(tree_text, (tree_rect.width-(fm.stringWidth(tree_text)))/2, (tree_rect.y-2));
 
 }

 public boolean contains (int x, int y)
  {
   if (x >= tree_rect.x && x < (tree_rect.x+tree_rect.width) && y >= z && y < (tree_rect.y)) return true;
  
   else return false;
  }

 public void drawCircle(Graphics g, boolean b)
 {
   
   if(b)
   {
     
     g.setColor(tree_squarecolor1);
     g.fillRect(tree_rect.width-18, z+(tree_rect.height/2), 6, 6);
     g.fillRect(tree_rect.x+18, z+(tree_rect.height/2), 6, 6);
   }
   else {

         g.setColor(tree_squarecolor2);
         g.fillRect(tree_rect.width-18, z+(tree_rect.height/2), 6, 6);  
         g.fillRect(tree_rect.x+18, z+(tree_rect.height/2), 6, 6);    
         
        }

 }


}

