import java.awt.*;
import java.util.*;
import java.net.*;
import java.applet.*;

class rgbsChars {
  int size;      
  char[] chars;  
  Color[] colors; 

  rgbsChars(String st, Color c){
    size = st.length();
    chars = new char[size];
    colors = new Color[size];
    for(int i = 0; i < size; i++){
      chars[i] = st.charAt(i);
      colors[i] = c;
    }
  }

  public void draw(Graphics g){
    Color ctmp = g.getColor();
    FontMetrics fm = g.getFontMetrics();
    int fh = fm.getHeight();
    int x = 10;
    for(int i = 0; i < size ; i ++){
      g.setColor(colors[i]);
      g.drawChars(chars, i, 1, x, fh);
      x += fm.charWidth(chars[i]);
    				   }
    g.setColor(ctmp);
  }

  public void newColor(Color c){
    for(int i = size-1; i > 0; i--){
      colors[i] = colors[i-1];
    }
    colors[0] = c;
  }
}

interface rgbsModel {
 public void go();
 public void init(String s);
 public Color getColor();
} 

public class RainbowText2 extends Applet implements Runnable{

  Font font;
  Thread th;
  rgbsChars chars;
  rgbsModel model;
  Image image;		
  Graphics gr;		
  Color bgcolor, bordercolor;
  int fontsize, fontstyle, speed;
  String fontname, param;
  
  public void init(){
    
    fontsize = Integer.valueOf(getParameter("fontsize")).intValue();
    fontstyle = Integer.valueOf(getParameter("fontstyle")).intValue();
    fontname = getParameter("fontname");
    font = new Font(fontname, fontstyle, fontsize);

    speed = Integer.valueOf(getParameter("speed")).intValue();
   
    try {
      param = getParameter("model");
      model = (rgbsModel)Class.forName(param).newInstance();

      param = getParameter("fontcolor");
      model.init(param);

    } catch(Exception e){}

    int[] ints;
    ints = parseInt(getParameter("bgcolor"), ",");
    bgcolor = new Color(ints[0], ints[1], ints[2]);

    ints = parseInt(getParameter("bordercolor"), ",");
    bordercolor = new Color(ints[0], ints[1], ints[2]);

    param = getParameter("text");
    chars = new rgbsChars(param, bgcolor);
    
    image = createImage(size().width, size().height);
    gr = image.getGraphics();
    gr.setFont(font);

  }

  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;
    }

  public void start(){
    th = new Thread(this);
    th.start();
  }

  public void stop(){
    th.stop();
    th = null;
  }

  public void update(Graphics g){
    
    gr.setColor(bgcolor);
    gr.fillRect(0, 0, size().width, size().height);

    gr.setColor(bordercolor);//bordercolor
  
    gr.fill3DRect(0, 0, size().width, size().height, true); //border
    gr.fill3DRect(3, 3, size().width-6, size().height-6, false);

    gr.fill3DRect(6, 6, size().width-12, size().height-12, true); //border
    gr.fill3DRect(9, 9, size().width-18, size().height-18, false);
 
    chars.draw(gr);
    g.drawImage(image, 0, 0, this);

  }

  public void run(){
    Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

    while (true) {
      try {
	chars.newColor(model.getColor());
	repaint();
	model.go();
	Thread.sleep(speed);
      } catch (Exception e){}
    }
  }

}

