// ==========================================================================
// Author:  Yee Hsu
// Date:    3/2/2007
// File:    counter.java
//
// Desc:    Counter
// ==========================================================================

package countdown;

import java.applet.Applet;
import java.applet.AppletContext;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.image.ImageObserver;
import java.net.URL;
import java.util.Date;

public class CountDown extends Applet implements Runnable {

    String strCurrentDateTimeParam;
    private MediaTracker mtTracker;
    private Thread thdRunner;
    private Graphics gBuffer;
    private Image imBuffer;
    private Image imBackgroundImage;
    private Image[] imNormalDigitImages;
    private Image[] imBlueDigitImages;
    private long lClockOffset;
    private long lCurrentCountDown;
    private long lLastTick;
    private Date dtTarget;
    private String strDate;
    private int iCharSpace;
    private int iPosX;
    private int iPosY;
    private boolean isStandalone = false;
    private String[] strNormalDigitImageFiles = {
        "0.gif",
        "1.gif",
        "2.gif",
        "3.gif",
        "4.gif",
        "5.gif",
        "6.gif",
        "7.gif",
        "8.gif",
        "9.gif",
        "colin.gif"
    };
    private String[] strBlueDigitImageFiles = {
        "b0.gif",
        "b1.gif",
        "b2.gif",
        "b3.gif",
        "b4.gif",
        "b5.gif",
        "b6.gif",
        "b7.gif",
        "b8.gif",
        "b9.gif",
        "bcolin.gif"
    };
    private int[] iBlueDigitsLocations = {
        3,
        1,
        12,
        12,
        20,
        8,
        5,
        19,
        8,
        15,
        20
    };
    private int iBlueNumDigits = 11;
    private URL uLink = null;

    public String getParameter(String key, String def) {
        return (isStandalone) ? System.getProperty(key, def) : (getParameter(key) != null) ? getParameter(key) : def;
    }

    public void init() {
        try {
            String strTempParameter = null;
            Date dtCurrent = null;

            mtTracker = new MediaTracker(this);
            imNormalDigitImages = getMultiImage(strNormalDigitImageFiles);
            imBlueDigitImages = getMultiImage(strBlueDigitImageFiles);
            lLastTick = 0L;
            strTempParameter = getParameter("CurrentDateTime", "");
            if (strTempParameter != null && strTempParameter != "") dtCurrent = new Date(strTempParameter);
            else dtCurrent = new Date();
            strTempParameter = getParameter("TargetDateTime", "");
            if (strTempParameter != null && strTempParameter != "") dtTarget = new Date(strTempParameter);
            else dtTarget = new Date("9/20/2002 10:00");
            lClockOffset = dtCurrent.getTime() - new Date().getTime();
            strTempParameter = getParameter("BackgroundImage");
            if (strTempParameter != null && strTempParameter != "") imBackgroundImage = getSingleImage(strTempParameter);
            else imBackgroundImage = getSingleImage("bg1.gif");
            strTempParameter = getParameter("CharSpaceing");
            if (strTempParameter != null && strTempParameter != "") iCharSpace = Integer.parseInt(strTempParameter, 10);
            else iCharSpace = 1;
            strTempParameter = getParameter("XPos");
            if (strTempParameter != null && strTempParameter != "") iPosX = Integer.parseInt(strTempParameter, 10);
            else iPosX = 125;
            strTempParameter = getParameter("YPos");
            if (strTempParameter != null && strTempParameter != "") iPosY = Integer.parseInt(strTempParameter, 10);
            else iPosY = 155;
            strTempParameter = getParameter("Data");
            if (strTempParameter != null && strTempParameter != "") {
                int i = 0;

                iBlueNumDigits = strTempParameter.length();
                iBlueDigitsLocations = new int[iBlueNumDigits];
                for (i = 0; i < iBlueNumDigits; ++i) {
                    if (strTempParameter.charAt(i) == 46) iBlueDigitsLocations[i] = -1;
                    else iBlueDigitsLocations[i] = 47 - strTempParameter.charAt(i) + 27 + 1;
                }
            }
            uLink = new URL("http://www.blizzard.com/frontpage.shtml");
        }
        catch(Exception exception1) {
            exception1.printStackTrace();
        }
    }

    public void start() {
        imBuffer = createImage(size().width, size().height);
        gBuffer = imBuffer.getGraphics();
        if (thdRunner == null) {
            thdRunner = new Thread(this);
            thdRunner.start();
        }
    }

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

    public void run() {
        for (;;) {
            try {
                Thread.sleep(50L);
            }
            catch(Exception exception1) {}
            repaint();
        }
    }
}