/***********************************************************

 *

 * Fade v1.05 by Giuseppe Gennaro, 1996

 *

 *	Feel free to modify or distribute this code as you 

 *	wish, just mention the author somewhere on the page

 *      you use it. It is one of my many learning attempts at

 *	the java language.  Here are the parameters for the

 * 	applet:

 *

 *	<applet code="Fade.class" width="300" height="100">

 *	<param name="bgcolor" value="ffffff">

 *	<param name="txtcolor" value="000000">

 *	<param name="changefactor" value="dx">

 *	<param name="text1" value="First text">

 *	<param name="url1" value="http://www.xxx.xxx">

 *	<param name="font1" value="FontName,FontStyle,FontSize">

 *	<param name="text2" value="Second text">

 *	<param name="url2" value="http://www.xxx.xxx">

 *	<param name="fontname2" value="FontName,FontStyle,FontSize">

 * 	...

 *	</applet>

 *      

 *	You should be able to change the width, height, background 

 * 	color, text color, etc...  Also, the text with the extension

 *	number following it is affected by all other parameters with

 * 	that same extension number. (Just stating the obvious.) 

 */



import java.awt.*;

import java.lang.*;

import java.net.*;

import java.applet.*;

import java.io.*;



//////////////////////////////////////

// OTHER CLASSES

//////////////////////////////////////



class Thoughts {

	static int MAX = 10;

	String theThoughts[] = new String[MAX];

	URL theUrls[] = new URL[MAX];

	Font theFonts[] = new Font[MAX];

	int R, G, B;

	int dr, dg, db;

	int rinit, ginit, binit;

	int rfinal, gfinal, bfinal;

	Color bgColor;

	boolean maxxed = false;

	boolean darker = false;

	int curr, count;



	Thoughts() {

		R = G = B = 0;

		dr = dg = db = 1;

		rinit = ginit = binit = 0;

		rfinal = gfinal = bfinal = 255;

		bgColor = new Color(R,G,B);

		curr = -1;

		count = 0;

	}



	public void SetBackground(int i, int j, int k) {

		R = rinit = i;

		G = ginit = j;

		B = binit = k;

		bgColor = new Color(R,G,B);

	}



	public Color GetBackground() {

		return bgColor;

	}



	public void SetTextColor(int i, int j, int k)

	{	rfinal = i;

		gfinal = j;

		bfinal = k;

	}



	public void SetChangeFactor(int i) {

		if(rfinal > rinit)

			dr = i;

		else if(rfinal == rinit)

			dr = 0;

		else

			dr = -i;

		if(gfinal > ginit)

			dg = i;

		else if(gfinal == ginit)

			dg = 0;

		else

			dg = -i;

		if(bfinal > binit)

			db = i;

		else if(bfinal == binit)

			db = 0;

		else

			db = -i;

	}



	public void AddThought(String idea, String url, String fontname, int fontstyle, int fontsize) {

		if(curr < MAX)

		{	curr++;

			count++;

			theThoughts[curr] = idea;

			try{

				theUrls[curr] = new URL(url);

			}catch(MalformedURLException e) {}

			theFonts[curr] = new Font(fontname, fontstyle, fontsize);

		}

	}



	public void Reset() {

		curr = 0;

	}



	public void Next() {

		curr++;

		if(curr >= count) Reset();

	}



	public void DrawThoughts(Fade that, Graphics g) {

		FontMetrics fm = that.getFontMetrics(theFonts[curr]);

		Color temp = new Color(R,G,B);

		g.setColor(temp);

		g.setFont(theFonts[curr]);

		g.drawString(theThoughts[curr],

				(that.size().width - fm.stringWidth(theThoughts[curr]))/2,

				(that.size().height + fm.getAscent())/2);

	}

	

	// (that.size().height + fm.getHeight())/2



	public URL GetCurrentURL() {

		return theUrls[curr];

	}



	public int ChangeColors() {

		int pause = 1;



		if(!maxxed)

		{  // Adjust colors to fade in...

			R += dr;

			G += dg;

			B += db;

			if(!((dr > 0 && R < rfinal) || (dr < 0 && R > rfinal)))

				R = rfinal;

			if(!((dg > 0 && G < gfinal) || (dg < 0 && G > gfinal)))

				G = gfinal;

			if(!((db > 0 && B < bfinal) || (db < 0 && B > bfinal)))

				B = bfinal;

			if(R == rfinal && G == gfinal && B == bfinal)

			{	maxxed = true;

				pause = 10;

			}

		}

		else

		{  // Adjust colors to fade out...

			R -= dr;

			G -= dg;

			B -= db;

			if(!((dr > 0 && R > rinit) || (dr < 0 && R < rinit)))

				R = rinit;

			if(!((dg > 0 && G > ginit) || (dg < 0 && G < ginit)))

				G = ginit;

			if(!((db > 0 && B > binit) || (db < 0 && B < binit)))

				B = binit;

			if(R == rinit && G == ginit && B == binit)

			{	maxxed = false;

				pause = 10;

				Next();

			}

		}

		return pause;

	}



}



//------------------------------------



public class Fade extends java.applet.Applet implements Runnable {

	Thoughts thoughts = new Thoughts();

	Thread runner = null;



	public void init() {

		// Set the background...

		String bgRGB = getParameter("bgcolor");

		if(bgRGB == null || bgRGB.length() != 6)

		{	thoughts.SetBackground(0,0,0);

		}

		else

		{	thoughts.SetBackground(HexToInt(bgRGB.substring(0,2)),

						HexToInt(bgRGB.substring(2,4)),

						HexToInt(bgRGB.substring(4)));

		}

		setBackground(thoughts.GetBackground());



		// Set the text color...

		String txtRGB = getParameter("txtcolor");

		if(txtRGB == null || txtRGB.length() != 6)

		{	thoughts.SetTextColor(255,255,255);

		}

		else

		{

			thoughts.SetTextColor(HexToInt(txtRGB.substring(0,2)),

						HexToInt(txtRGB.substring(2,4)),

						HexToInt(txtRGB.substring(4)));

		}



		// Set the delta for the changing color...

		String changeFactor = getParameter("changefactor");

		if(changeFactor == null)

			thoughts.SetChangeFactor(1);

		else

			thoughts.SetChangeFactor(Integer.valueOf(changeFactor).intValue());



		// Obtaining the data for the thoughts...

		GetThoughts(this);



		thoughts.Reset();

		resize(size().width, size().height);

	}



	public void start() {

		if(runner == null)

		{	runner = new Thread(this);

			runner.setPriority(runner.MIN_PRIORITY);

			runner.start();

		}

	}



	public void stop() {

		runner = null;

	}



	public void paint(Graphics g) {

	}



	public void update(Graphics g) {

		thoughts.DrawThoughts(this, g);

	}



	public boolean mouseDown(java.awt.Event evt, int x, int y) {

		super.getAppletContext().showDocument(thoughts.GetCurrentURL());

		return true;

	}



	public boolean mouseEnter(java.awt.Event evt, int x, int y) {

		// Showing who made this...

		showStatus("Fade.java by Giuseppe Gennaro");

		return true;

	}



	public void run() {

		int sleepfactor;



		while(runner != null)

		{  sleepfactor = thoughts.ChangeColors();

			repaint();

			try{runner.sleep(25*sleepfactor);}catch(InterruptedException e) {}

		}

	}



	public String getAppletInfo() {

		return "Fade by Giuseppe Gennaro";

	}



	////////////////////////////////////////

	// OTHER FUNCTIONS

	////////////////////////////////////////



	public void GetThoughts(Fade that){

		boolean done = false;

		int i=1;



		while(!done)

		{	String extension = String.valueOf(i);

			

			String fontParam = "font" + extension;

			String fontName;

			int fontSize, fontStyle;

			String textParam = "text" + extension;

			String urlParam = "url" + extension;

	

			String font = super.getParameter(fontParam);

			if(font == null)

			{	fontName = "TimesRoman";

				fontSize = 12;

				fontStyle = Font.PLAIN;

				done = true;

			}

			else

			{	int comma1 = font.indexOf(","),

				    comma2 = font.lastIndexOf(",");

				String name = font.substring(0, comma1);

				String style = font.substring(comma1+1, comma2);

				String size = font.substring(comma2+1);

				

				fontName = name;

				fontSize = Integer.valueOf(size).intValue();

				if(style.equalsIgnoreCase("PLAIN"))

					fontStyle = Font.PLAIN;

				else if(style.equalsIgnoreCase("BOLD"))

					fontStyle = Font.BOLD;

				else if(style.equalsIgnoreCase("ITALIC"))

					fontStyle = Font.ITALIC;

				else

					fontStyle = Font.PLAIN;

			}



			String theText = that.getParameter(textParam);

			if(theText == null)

			{	theText = "No Text Given.";

				done = true;

			}

			String theUrl = that.getParameter(urlParam);



			if(!done)

				thoughts.AddThought(theText, theUrl, fontName, fontStyle, fontSize);

			i++;

		}

	}



	public int HexToInt(String value) {

		int answer = 0;



		if(value.substring(0,1).equalsIgnoreCase("a"))

			answer = 160;

		else if(value.substring(0,1).equalsIgnoreCase("b"))

			answer = 176;

		else if(value.substring(0,1).equalsIgnoreCase("c"))

			answer = 192;

		else if(value.substring(0,1).equalsIgnoreCase("d"))

			answer = 208;

		else if(value.substring(0,1).equalsIgnoreCase("e"))

			answer = 224;

		else if(value.substring(0,1).equalsIgnoreCase("f"))

			answer = 240;

		else

			answer = Integer.valueOf(value.substring(0,1)).intValue() * 16;



		if(value.substring(1).equalsIgnoreCase("a"))

			answer += 10;

		else if(value.substring(1).equalsIgnoreCase("b"))

			answer += 11;

		else if(value.substring(1).equalsIgnoreCase("c"))

			answer += 12;

		else if(value.substring(1).equalsIgnoreCase("d"))

			answer += 13;

		else if(value.substring(1).equalsIgnoreCase("e"))

			answer += 14;

		else if(value.substring(1).equalsIgnoreCase("f"))

			answer += 15;

		else

			answer += Integer.valueOf(value.substring(1)).intValue();



		return answer;

	}



}


