//
/* ----------------------------------------------------------------------------------------------
    stars.java		GIFアニメ							ver. 1.00 (JDK 1.02)
    														ueyama@infonet.co.jp  2002.02.25
---------------------------------------------------------------------------------------------- */

import java.applet.*;
import java.awt.*;
import java.util.*;


public class stars extends Applet implements Runnable
{
	int			Xs=304,Ys=170, Xb=378,Yb=193, Xm=Xs+20, Xc=0;		// 表示座標値
	int			Fn=0;												// フレーム No.
	int			Wt[]={200, 100, 100, 300, 100, 100, 100, 100, 100, 100, 100, 100, 700, 100, 100, 100};
	boolean		Run=false;
	Image		Img;
	Thread		th=null;
	int			bgc;
	Graphics	gr;
	
	public void init()
	{
		String	Bg=getParameter("BgColor");
		bgc=Integer.valueOf(Bg,16).intValue();
		setBackground(new Color(bgc)); 
		MediaTracker mt=new MediaTracker(this);
		Img=getImage(getCodeBase(), getParameter("figure"));
		mt.addImage(Img, 0);
		try
		{
			mt.waitForID(0);
		}
		catch(InterruptedException e){};
		gr=getGraphics();
	}
	
	public void start()
	{
		if(th==null)
		{
			th=new Thread(this);
			th.start();
		}
	}
	
	public boolean inside(int x, int a, int b)
	{
		return (x<=Math.max(a,b) && x>=Math.min(a,b)) ? true:false;
	}
	
	public void dsp_img(int x, int y, int n, int c)					// 画像の表示
	{
		int			w=0, h=0, ox=0, oy=0;
		Graphics	gx=gr.create();
		switch(n)
		{
			case 0: w=16; h=15; ox=  0; oy= 0; break;				// |>
			case 1: w=16; h=15; ox=  0; oy=15; break;				// <|
			case 2: w=26; h=23; ox=  0; oy=30; break;				// Run
			case 3: w=26; h=23; ox=  0; oy=53; break;				// Stop
			case 4: w=48; h=70; ox= 64; oy= 0; break;				// Stars & Data
			case 5: w=48; h=59; ox= 64; oy= 0; break;				// Stars のみ
			case 6: w=16; h=13; ox= 48; oy= 0; break;				// スクロールバー
			case 7: w=48; h= 9; ox= 64; oy=61; 						// フレーム No.
					gr.clearRect(x, y, w, h);  break;
		}
		gx.clipRect(x,y,w,h);
		gx.drawImage(Img,x-(ox+c*w),y-oy,this);
		gx.dispose();
	}

	public void dsp_anm(int x)										// アニメーション画像表示
	{
		gr.setColor(new Color(0xe5e5de));
		gr.fillRect(Xs+20, Ys+1, 136, 13);
		dsp_img(367, 102, 5, Fn);
		dsp_img(x, Ys+1, 6, 0);										// スクロールバーの表示
		dsp_img(415, 152, 7, Fn);
		Xm=Xs+20+Fn*8;
	}
	
	public void paint(Graphics g)
	{
		int i;
		for(i=0;i<16;i++) dsp_img(i*49, 0, 4, i);
		dsp_img(Xs, Ys, 1, (Fn>0)?0:2);
		dsp_img(Xs+160, Ys, 0, (Fn<15)?0:2);
		dsp_img(Xb, Yb, (Run)?3:2, 0);
		dsp_anm(Xs+20+Fn*8);
	}
	
	public void run()
	{
		while(th!=null)
		{
			if(Run) dsp_anm(Xs+20+Fn*8);
			try
			{
				th.sleep((Run)?Wt[Fn]:256);
			}
			catch (InterruptedException e){}
			if(Run) { Fn++; Fn%=16; }
		}
	}
	
	public void stop()
	{
		if(th!=null)
		{
			th.stop();
			th=null;
		}
	}
	
	public boolean mouseDrag(Event e, int mx, int my)				// スクロールバーの操作
	{
		if(inside(my, Ys-10, Ys+25) && inside(mx, Xm-16, Xm+32))
		{
			if(inside(mx-Xc-20, Xs, Xs+120))
			{
				dsp_img(Xs, Ys, 1, (Fn>0)?0:2);
				dsp_img(Xs+160, Ys, 0, (Fn<15)?0:2);
				Fn=(mx-Xc-(Xs+20)+4)/8;
				dsp_anm(mx-Xc);
				Xm=mx-Xc;
			}
		}
		return true;
	}
	
	public boolean mouseDown(Event e, int mx, int my)
	{
		if(inside(my, Ys, Ys+15))
		{
			if(inside(mx, Xs, Xs+16) && Fn>0)						// |>
			{
				Fn--;
				dsp_img(Xs, Ys, 1, 1);
				dsp_anm(Xs+20+Fn*8);
			}
			if(inside(mx, Xs+160, Xs+176) && Fn<15)					// <|
			{
				Fn++;
				dsp_img(Xs+160, Ys, 0, 1);
				dsp_anm(Xs+20+Fn*8);
			}
			if(inside(mx, Xm, Xm+16)) Xc=mx-Xm;						// スクロールバー
		}
		if(inside(mx, Xb, Xb+26) && inside(my, Yb, Yb+23))
		{
			dsp_img(Xb, Yb, (Run)?3:2, 1);
			Run=!Run;
		}
		return true;
	}
	
	public boolean mouseUp(Event e, int mx, int my)
	{
		if(inside(my, Ys, Ys+15) && (inside(mx, Xs, Xs+16) || inside(mx, Xs+160, Xs+184)))
		{
			dsp_img(Xs+160, Ys, 0, (Fn<15)?0:2);
			dsp_img(Xs, Ys, 1, (Fn>0)?0:2);
		}
		if(inside(mx, Xb, Xb+26) && inside(my, Yb, Yb+23))
		{
			dsp_img(Xb, Yb, (Run)?3:2, 0);
			if(!Run) dsp_anm(Xs+20+Fn*8);
		}
		return true;
	}
}
//
戻る