import java.awt.*;
import java.awt.image.*;
import java.applet.*;
import java.net.*;
import java.util.*;
import java.awt.event.*;

public class BorderFilter extends Applet implements MouseListener, MouseMotionListener
{
 String text1, target, url, text2;
 int bordersize, b=1, num[];
 Image bgimage[] = new Image[1], image1, image2;
 Image crop_image1, crop_image2;
 Color text_bgcolor, filter_color1, filter_color2;
 Color text_color0, text_color1, text_color2;
 Rectangle area;
 Font font1, font2;
 MediaTracker tracker = new MediaTracker(this);
 BF bf[];

 public void init()
 {
  addMouseListener(this); addMouseMotionListener(this);
  
  for (int i = 1; ;i++) 					
  {
   if (getParameter("button"+ i) == null)
   {
      num = new int[i];
      break;
   }
  }

  bordersize = Integer.parseInt(getParameter("border"));
  
  StringTokenizer st = new StringTokenizer(getParameter("text_bgcolor"), ",");
  text_bgcolor = new Color(Integer.parseInt(st.nextToken()), 
                           Integer.parseInt(st.nextToken()), 
                           Integer.parseInt(st.nextToken()));
                               
  target = getParameter("target");

  bgimage[0] = getImage(getDocumentBase(), getParameter("bgimage"));  
  tracker.addImage(bgimage[0], 0);
    
  bf = new BF[num.length];
  while (b < bf.length)
  {
  
  StringTokenizer fst = new StringTokenizer(getParameter("button" + b), ",|");
  
  area = new Rectangle(Integer.parseInt(fst.nextToken()), 
                       Integer.parseInt(fst.nextToken()), 
                       Integer.parseInt(fst.nextToken()), 
                       Integer.parseInt(fst.nextToken()));

  text1 = fst.nextToken();

  text2 = fst.nextToken();

  font1 = new Font(fst.nextToken(), Integer.parseInt(fst.nextToken()), 
                                    Integer.parseInt(fst.nextToken()));

  font2 = new Font(fst.nextToken(), Integer.parseInt(fst.nextToken()), 
                                    Integer.parseInt(fst.nextToken()));

  text_color0 = new Color(Integer.parseInt(fst.nextToken()), Integer.parseInt(fst.nextToken()), 
                                                             Integer.parseInt(fst.nextToken()));

  text_color1 = new Color(Integer.parseInt(fst.nextToken()), Integer.parseInt(fst.nextToken()), 
                                                             Integer.parseInt(fst.nextToken()));

  text_color2 = new Color(Integer.parseInt(fst.nextToken()), Integer.parseInt(fst.nextToken()), 
                                                             Integer.parseInt(fst.nextToken()));

  filter_color1 = new Color(Integer.parseInt(fst.nextToken()), 
                            Integer.parseInt(fst.nextToken()), 
                            Integer.parseInt(fst.nextToken()));

   
  filter_color2 = new Color(Integer.parseInt(fst.nextToken()), 
                            Integer.parseInt(fst.nextToken()), 
                            Integer.parseInt(fst.nextToken()));

  url = fst.nextToken();

  crop_image1 = createImage(new FilteredImageSource(bgimage[0].getSource(),
  new CropImageFilter(area.x, area.y, area.width, area.height)));
    
  crop_image2 = createImage(new FilteredImageSource(bgimage[0].getSource(),
  new CropImageFilter(area.x+bordersize, area.y+bordersize, area.width-(2*bordersize), area.height-(2*bordersize))));
  tracker.addImage(crop_image2, 0);

  image1 = createImage(new FilteredImageSource(crop_image1.getSource(), new CFilter(filter_color1)));
  tracker.addImage(image1, 0);

  image2 = createImage(new FilteredImageSource(crop_image1.getSource(), new CFilter(filter_color2)));  
  tracker.addImage(image2, 0);

  
  try { tracker.waitForAll(); } catch (InterruptedException e) {}
  bf[b-1] = new BF(area, text1, text2, font1, font2, text_color0, text_color1, text_color2,
                   filter_color1, filter_color2, url, crop_image2, image1, image2, this);
   
  b++;
 }
 
}

 public void paint(Graphics g)
 {
  g.drawImage(bgimage[0], 0, 0, this);

 for (int i = 0; i < bf.length; i++)
  {
   bf[i].drawImage(g, bordersize, text_bgcolor);
   
  }
 
 }


 public void mouseExited(MouseEvent me)
 {
  Graphics g = getGraphics();
  int x = me.getX(), y = me.getY();

  for (int i = 0; i < bf.length; i++) 
  {
   bf[i].setMove(g, true); 
  }
   
 }

 public void mouseReleased(MouseEvent me){}
 public void mouseClicked(MouseEvent me) {}

 public void mouseMoved(MouseEvent me)
 {
  Graphics g = getGraphics();
  int x = me.getX(), y = me.getY();
  for (int i = 0; i < bf.length; i++) 		
  {
   if (bf[i].contains(x, y)) { bf[i].setMove(g, false); }
   
   else { bf[i].setMove(g, true); }
  }
 }
 
 public void mouseDragged(MouseEvent me) {}
 public void mouseEntered(MouseEvent me) {}  
 public void mousePressed(MouseEvent me) 
 {
  Graphics g = getGraphics();
  int x = me.getX(), y = me.getY();
  for (int i = 0; i < bf.length; i++) 		
  {
   if (bf[i].contains(x, y)) bf[i].setTarget(target); 
  
  }
 }

}

class BF extends Canvas
{
 String text1, text2, url;
 Image image1, image2;
 Image crop_image2;
 Color text_bgcolor, text_color0, text_color1, text_color2, filter_color1, filter_color2;
 Rectangle r;
 Font font2, font1;
 BorderFilter fb;
 int X, X1, Y, Y1;
 
  
 public BF(Rectangle r, String text1, String text2, Font font1, Font font2, 
           Color text_color0, Color text_color1, Color text_color2, 
           Color filter_color1, Color filter_color2, String url, 
           Image crop_image2, Image image1, Image image2, BorderFilter fb) 
 {
  this.r = r; 
  this.text1 = text1; this.text2 = text2;
  this.font1 = font1; this.font2 = font2;
  this.text_color0 = text_color0; this.text_color1 = text_color1; this.text_color2 = text_color2;
  this.url = url;
  this.crop_image2 = crop_image2; this.image1 = image1; this.image2 = image2;
  this.filter_color1 = filter_color1; this.filter_color2 = filter_color2;
  this.fb = fb;
           
 }

 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;
 }

 public void drawImage(Graphics g, int size, Color text_bgcolor)
 {
  X = (int) r.x+(r.width - getFontMetrics(font1).stringWidth(text1))/2;
  Y = (int)(r.y+size);

  X1 = (int) r.x+(r.width - getFontMetrics(font2).stringWidth(text2))/2;
  Y1 = (int) r.y+(r.height/2) + (getFontMetrics(font2).getHeight()/2);
  
  g.drawImage(image2, r.x+2, r.y+2, r.width, r.height, this);
  g.drawImage(image1, r.x, r.y, r.width, r.height, this);
  
  g.drawImage(crop_image2, r.x+size, r.y+size, r.width-(2*size), r.height-(2*size), this);

  g.setFont(font1);
  g.setColor(text_bgcolor);
  g.drawString(text1, X+2, Y+2);
  g.setColor(text_color0);
  g.drawString(text1, X, Y);

  setText(g, text_bgcolor);
 }

 public void setText(Graphics g, Color text_bgcolor)
 {
  g.setFont(font2);
  g.setColor(text_bgcolor);
  g.drawString(text2, X1+2, Y1+2);

  g.setColor(text_color1);
  g.drawString(text2, X1, Y1);
 }

 public void setMove(Graphics g, boolean b)
 {
  X1 = (int) r.x+(r.width - getFontMetrics(font2).stringWidth(text2))/2; //nopeuttaa vähän Netsc, siksi tuplasti
  Y1 = (int) r.y+(r.height/2) + (getFontMetrics(font2).getHeight()/2);

  g.setFont(font2);
  if(b) g.setColor(text_color1);
  else g.setColor(text_color2);
  g.drawString(text2, X1, Y1);
 }

 public void setTarget(String target)
 {
  try {
	URL u = new URL(url);
	fb.getAppletContext().showDocument(u, target);
      }
	catch (MalformedURLException e) {}
 }
}

class CFilter extends RGBImageFilter {
	Color color;

     public CFilter(Color mask) {
		color = mask;
		canFilterIndexColorModel = true;
	}
	public int filterRGB(int x, int y, int pixel) {

return 255 << 24 |
       (((pixel & 0xff0000) >> 16) * color.getRed()/255) << 16 |
       (((pixel & 0xff00) >> 8) * color.getGreen()/255) << 8 |
       (pixel & 0xff) * color.getBlue()/255 ;
	}
}  
