import java.awt.*;
import java.applet.*;
import java.net.*;
import java.util.*;

public class MenuButton extends Applet
{
 String kohde, menu_text = new String(), mail = new String();
 String fontname;
 int fontstyle, fontsize;
 int rows, cols, hspace, vspace, index;
 Color textcolor1, textcolor2, textbgcolor, bordercolor;
 RMenu rmenu;
 Image img;
 int i_x, i_y, i_w, i_h; // buttons_area
 MediaTracker tracker;

 Image image_gr;
 Graphics gr, g;
 boolean b;
 Rectangle[] area;
 boolean[] down;
 String[][] item_url;
 String[][] item;
 int curMenu;
 int curMenuItem;
 Rectangle[] menuitem_rect;
 Color textmenu_color[] = new Color[2];
 Color bgmenu_color[] = new Color[2];
 int marginH, marginV;
 String menuitem_fontname;
 int menuitem_fontstyle, menuitem_fontsize;
 Font menuitem_font;
 FontMetrics fm;  

 public void init()
 {
  tracker = new MediaTracker(this);
  img = getImage(getDocumentBase(), getParameter("imagename"));
  tracker.addImage(img, 0);
  try { tracker.waitForID(0); }
  catch (InterruptedException e) {}

  StringTokenizer st = new StringTokenizer(
                                  getParameter("menu_buttons_area"), ",");
  i_x = Integer.parseInt(st.nextToken());
  i_y = Integer.parseInt(st.nextToken());
  i_w = Integer.parseInt(st.nextToken());
  i_h = Integer.parseInt(st.nextToken());

  rows = Integer.parseInt(getParameter("rows"));  	//rivi
  cols = Integer.parseInt(getParameter("cols"));	//sarake
  hspace = Integer.parseInt(getParameter("hspace"));
  vspace = Integer.parseInt(getParameter("vspace"));

  fontsize = Integer.parseInt(getParameter("fontsize"));
  fontstyle = Integer.parseInt(getParameter("fontstyle"));
  fontname = getParameter("fontname");

  int[] ints;
  ints = parseInt(getParameter("menu_button_textcolor_1"), ",");
  textcolor1 = new Color(ints[0], ints[1], ints[2]);

  ints = parseInt(getParameter("menu_button_textcolor_2"), ",");
  textcolor2 = new Color(ints[0], ints[1], ints[2]);

  ints = parseInt(getParameter("menu_text_bgcolor"), ",");
  textbgcolor = new Color(ints[0], ints[1], ints[2]);

  ints = parseInt(getParameter("menu_button_bordercolor"), ",");
  bordercolor = new Color(ints[0], ints[1], ints[2]);


  marginH = Integer.parseInt(getParameter("marginh"));
  marginV = Integer.parseInt(getParameter("marginv"));

  ints = parseInt(getParameter("textmenu_color1"), ",");
  textmenu_color[0] = new Color(ints[0], ints[1], ints[2]);

  ints = parseInt(getParameter("textmenu_color2"), ",");
  textmenu_color[1] = new Color(ints[0], ints[1], ints[2]);
	
  ints = parseInt(getParameter("bgmenu_color1"), ",");
  bgmenu_color[0] = new Color(ints[0], ints[1], ints[2]);
  
  ints = parseInt(getParameter("bgmenu_color2"), ",");
  bgmenu_color[1] = new Color(ints[0], ints[1], ints[2]);

  menuitem_fontsize = Integer.parseInt(getParameter("menuitem_fontsize"));
  menuitem_fontstyle = Integer.parseInt(getParameter("menuitem_fontstyle"));
  menuitem_fontname = getParameter("menuitem_fontname");

  menuitem_font = new Font(menuitem_fontname, menuitem_fontstyle, menuitem_fontsize);  

  fm = getFontMetrics(menuitem_font);
   
  setLayout(new GridLayout(rows, cols, hspace, vspace));

  image_gr = createImage(size().width, size().height);
  gr = image_gr.getGraphics(); g = getGraphics();

  for (int i = 0; ;i++)
  {
   if (getParameter("menu"+i) == null)
   {
      area = new Rectangle[i];
      down = new boolean[i];
      item_url = new String[i][];
      item = new String[i][];

      break;
   }
 }

 for (int i = 0; i < area.length; i++)
 {
  String[] fields = parse(getParameter("menu"+i), getParameter("separator"));
            
  ints = parseInt(fields[0], ",");
  area[i] = new Rectangle(ints[0], ints[1], ints[2], ints[3]);
  
  down[i] = fields[1].equals("d");
	    
  item[i] = new String[(fields.length-2)/2];
  item_url[i] = new String[(fields.length-2)/2];
  for (int j = 0; j < item[i].length; j++) 
     {
     item[i][j] = fields[j*2+2];
     item_url[i][j] = fields[j*2+3];
     }
  }
 
  for(index = 0; index < (rows * cols); index++)
  {

  menu_text = getParameter("menu_button_text" + index);// button_text
  //mail = getParameter("url" + index); // button_url
  //kohde = getParameter("target");
  

  rmenu = new RMenu(menu_text, fontname, fontstyle, fontsize, textcolor1, textcolor2,
              textbgcolor, bordercolor, mail, getAppletContext(), kohde);
  add (rmenu, index);
  }
   
 }

int[] parseInt(String s, String sep) 
    {
	StringTokenizer st = new StringTokenizer(s, sep);
        int[] result = new int[st.countTokens()];

	for (int i=0; i<result.length; i++) {
            result[i] = Integer.parseInt(st.nextToken());
	}
        return result;
    }

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 Insets insets () 
  {
  return new Insets (i_y, i_x, size().height-i_y-i_h, size().width-i_x-i_w);
                     //top,left,bottom,right
  }

public void paint(Graphics g) 
  {
  b = false;
  update(g);
  
  }

public void update(Graphics g)
  {
   Graphics g2;

  if (!b)
  {
   b = g.drawImage(img, 0, 0, this);
   return;
   }
    gr.drawImage(img, 0, 0, this);
        
    if (curMenu >= 0) {
           
	    g2 = image_gr.getGraphics();
	    for (int i = 0; i < menuitem_rect.length; i++)
            {
	     drawMenuItem(g2, i);
	    }
	    g2.dispose();
        }
        g.drawImage(image_gr, 0, 0, this);
 }

void drawMenuItem(Graphics g, int i)
 {
  int y;      
  String[] line = parse(item[curMenu][i], getParameter("newline"));

   int hi = 0;
   if (i == curMenuItem) 
   {
   hi = 1;
   getAppletContext().showStatus(item_url[curMenu][i]);
   }
    g.setColor(bgmenu_color[hi]);
    g.fillRect(menuitem_rect[i].x, menuitem_rect[i].y,
	       menuitem_rect[i].width, menuitem_rect[i].height);

    g.setColor(textmenu_color[hi]);

    g.drawRect(menuitem_rect[i].x, menuitem_rect[i].y,
	       menuitem_rect[i].width, menuitem_rect[i].height);

    g.setFont(menuitem_font);
    y = menuitem_rect[i].y + marginV;
    for (i = 0; i < line.length; i++) 
    {

g.drawString(line[i], 
menuitem_rect[i].x+(menuitem_rect[i].width-fm.stringWidth(line[i])-marginH)/2,
                y + fm.getAscent());

                 y += fm.getHeight();
    }
 }

    public boolean mouseExit(Event evt, int x, int y)
    {
        curMenuItem = curMenu = -1;
	repaint();
        return true;
    }

    public boolean mouseEnter(Event evt, int x, int y)
    {
        repaint(); return mouseMove(evt, x, y);
    }

   public boolean mouseMove(Event evt, int x, int y)
   {
    if (curMenu >= 0)
       {
        int sm = inMenu(menuitem_rect, x, y);

	if (curMenuItem != sm)
           {
	    curMenuItem = sm;
	    repaint();
	   }
            if (sm >= 0) { return true; }
            curMenu = -1;
        }

        int m = inMenu(area, x, y);
        if (m != curMenu) 
          {
           curMenu = m;
           if (m >= 0) 
             {
              int maxWidth = area[m].width-(2*marginH +2); //menuitem_rectangle width    
              int maxHeight = 0;    

              menuitem_rect = new Rectangle[item[curMenu].length];
              for (int i = 0; i < menuitem_rect.length; i++)
              {
               String[] line = parse(item[curMenu][i], getParameter("newline"));

               for (int j = 0; j < line.length; j++)
               {
		int w = fm.stringWidth(line[j]);
                if (w > maxWidth) maxWidth = w;
               }
               menuitem_rect[i] = new Rectangle();
               menuitem_rect[i].height = 
               parse(item[curMenu][i], getParameter("newline")).length
                                 * fm.getHeight()
                                 + 2 * marginV;
                    maxHeight += menuitem_rect[i].height;
                }

	        
		maxWidth +=  2 * marginH + 1;

                if (down[m]) {  // down
                    y = Math.max(0, Math.min(size().height-maxHeight-1, 
                        area[curMenu].y + area[curMenu].height-1));
                        
                } else {        // up
                    y = Math.max(0, Math.min(size().height-maxHeight+1, 
                        area[curMenu].y - maxHeight));
                }

		x = area[curMenu].x; 

	        for (int i=0; i<item[curMenu].length; i++) 
                {
                    menuitem_rect[i].x = x;
                    menuitem_rect[i].y = y;
                    menuitem_rect[i].width = maxWidth;
                    y += menuitem_rect[i].height;
	        }
	        
            }
            repaint();
        }
        return true;
    }

        int inMenu(Rectangle[] rs, int x, int y) 
        {
        if (rs != null) 
          {
           for (int i = 0; i < rs.length; i++) 
              {
               if (rs[i].inside(x, y)) { return i; }
              }
          }
        return -1;
        }

}

class RMenu extends Canvas
{
 String menu_text, fontname, mail, kohde;
 int fontstyle, fontsize;
 Color textcolor1, textcolor2, textbgcolor, bordercolor;
 int X, Y, index;
 AppletContext ac;
 Font font;
 
 public RMenu(String menu_text1, String fontname1, int fontstyle1, int fontsize1,
            Color textcolor01, Color textcolor02, Color textbgcolor1, 
            Color bordercolor1,
    	    String mail1, AppletContext browser, String kohde1)
 {
  menu_text = menu_text1;
  fontname = fontname1;
  fontstyle = fontstyle1;
  fontsize = fontsize1;
  textcolor1 = textcolor01;
  textcolor2 = textcolor02;
  textbgcolor = textbgcolor1;
  bordercolor = bordercolor1;
  mail = mail1;
  ac = browser;
  kohde = kohde1;
  font = new Font(fontname, fontstyle, fontsize); 
      
 }
 public void paint(Graphics g)
 {
  X = (size().width - getFontMetrics(font).stringWidth(menu_text))/2;
       // X ja Y keskitävät textiä
  Y = (int)(size().height/1.4);
  
  g.setFont(font);
 
  g.setColor(bordercolor);//bordercolor
  
  g.fill3DRect(0, 0, size().width, size().height, true); //border
  g.fill3DRect(3, 3, size().width-6, size().height-6, false);
 
  g.setColor(textbgcolor);//textbgcolor
  g.drawString(menu_text, X+2, Y+2);
  g.setColor(textcolor1);//textcolor1
  g.drawString(menu_text, X, Y);
 
 }
 public boolean mouseMove (Event evt, int x, int y)
  {  
     Graphics g = getGraphics();
     g.setFont(font);
     g.setColor(textcolor2);
     g.drawString(menu_text, X, Y);
     ac.showStatus(menu_text);
     return true;
   }  
 public boolean mouseExit (Event evt, int x, int y)
  { 
   Graphics g = getGraphics();
   g.setFont(font);
   g.setColor(textbgcolor);//textbgcolor
   g.drawString(menu_text, X+2, Y+2);
   g.setColor(textcolor1);//textcolor1
   g.drawString(menu_text, X, Y);
   ac.showStatus("");
   
   return true;  
  }
}






