/* fxText.java
 * Copyright (C) 1996 by William Giel
 *
 * E-mail: rvdi@usa.nai.net
 * WWW: http://www.nai.net/~rvdi/home.htm
 *
 ***************************************************************************
 * Abstract
 * --------
 * Uses transparency in GIF images to create a special effect.
 *
 * The BACKGROUND parameter references a GIF background texture or image
 * tile, which ideally should be smaller than the image to be displayed and
 * should be saved WITHOUT any transparency info.
 *
 * The FOREGROUND parameter references the GIF, with transparent elements
 * that will reveal the moving background. This GIF should be saved WITH
 * transparency information. The applets HEIGHT and WIDTH parameters must
 * specify the dimensions of this GIF.
 *
 * The HYPERLINK parameter should specify an URL, which will be called if the
 * mouse is clicked within the applet. Note that this does not function very
 * well for some reason... there is a LONG delay between clicking and the
 * actual link that is unacceptable.
 *
 ***************************************************************************
 * Permission to use, copy, modify, and distribute this software and its
 * documentation without fee for NON-COMMERCIAL purposes is hereby granted.
 *
 * THE AUTHOR MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY
 * OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. THE AUTHOR SHALL NOT BE LIABLE
 * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 ***************************************************************************/

import java.applet.Applet;
import java.awt.Event;
import java.awt.Graphics;
import java.awt.Image;
import java.net.MalformedURLException;
import java.net.URL;

public class fxText extends Applet implements Runnable
{
    int width, height;

    String[] szImages = new String[2];

    Image images[] = new Image[2];

    Image virtualImage = null;

    Graphics virtualGC = null;

    Image offscrImage = null;

    Graphics offscrImageGC = null;

    Thread kicker = null;

    imageLoader il = null;

    int X, Y;

    boolean allOK = true;

    URL link = null;

    public void init()
    {

        width = getWidth();
        height = getHeight();

        virtualImage = createImage(width * 2, height * 2);
        virtualGC = virtualImage.getGraphics();

        offscrImage = createImage(width, height);
        offscrImageGC = offscrImage.getGraphics();

        System.out.println("fxText Applet Copyright(C)1996 by Bill Giel");

        szImages[0] = getParameter("BACKGROUND");
        if (null == szImages[0])
        {
            System.out.println("fxText Error: No background parameter.");
            allOK = false;
        }

        szImages[1] = getParameter("FOREGROUND");
        if (null == szImages[1])
        {
            System.out.println("fxText Error: No foreground parameter.");
            allOK = false;
        }

        String param = getParameter("HYPERLINK");
        if (null != param)
        {
            try
            {
                link = new URL(param);
            }
            catch (MalformedURLException e)
            {
                System.out.println("fxText Error: Malformed URL");
                link = null;
            }
        }

        if (allOK)
        {
            il = new imageLoader(this, szImages, 2, null);
            il.start();
        }

        X = Y = 0;
        images = null;

    }

    public void start()
    {
        if (kicker == null)
        {
            kicker = new Thread(this);
            kicker.start();
        }

    }

    public void stop()
    {
        if (null != kicker)
        {
            kicker.stop();
            kicker = null;
        }
    }

    public boolean handleEvent(Event e)
    {
        if (e.id == Event.MOUSE_DOWN)
        {

            if (null != link)
            {

                getAppletContext().showDocument(link);
                return true;
            }
        }
        return super.handleEvent(e);
    }

    public void run()
    {
        if (allOK && null != il)
        {
            Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

            while (null == (images = il.retrieveImages()))
                ;

            int tileWidth = images[0].getWidth(this);
            int tileHeight = images[0].getHeight(this);
            int xTiles = width / tileWidth;
            int yTiles = height / tileHeight;

            for (int y = 0; y < virtualImage.getHeight(this); y = y
                    + tileHeight)
                for (int x = 0; x < virtualImage.getWidth(this); x = x
                        + tileWidth)
                    virtualGC.drawImage(images[0], x, y, this);

            while (null != kicker)
            {

                try
                {
                    Thread.sleep(50);
                }
                catch (InterruptedException e)
                {
                }
                if (-(--X) > ((0 == xTiles) ? width : xTiles * tileWidth))
                    X = 0;
                if (-(--Y) > ((0 == yTiles) ? height : yTiles * tileHeight))
                    Y = 0;
                repaint();
            }
        }
        else
            repaint();
    }

    public void paint(Graphics g)
    {

        if (null == images)
        {

            if (allOK)
                g.drawString("Loading Images...", 5, height / 2);
            else
                g.drawString("Error - No images!", 5, height / 2);
        }
        else
            update(g);

    }

    public void update(Graphics g)
    {
        if (null != images)
        {
            offscrImageGC.drawImage(virtualImage, X, Y, this);
            offscrImageGC.drawImage(images[1], 0, 0, this);
            g.drawImage(offscrImage, 0, 0, this);

        }
    }
}

