/*
 * AnimalFortuneTelling.java
 * copyright (c) since 2005 "Kimmy" all right reserved.
 */

/*
<applet code="AnimalFortuneTelling.class" width=400 height=700>
</applet>
*/
 
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class AnimalFortuneTelling extends Applet implements ActionListener{

    public Dimension d;
    public Image bi;
    public Graphics bg;

    public boolean mode;

    public Panel letter, component, yyyymmdd, button;
    public TextField year;
    public Choice month, day;
    public Button run, clear, back;
    public int num;

    public String animal[];
    public String ft[][];

    public Font f1, f2;

    //初期化メソッド
    public void init(){
	this.setBackground(Color.white);
	d = getSize();
        bi = createImage(d.width, d.height);
        bg = bi.getGraphics();

	f1 = new Font("TimesRoman", Font.BOLD, 36);
	f2 = new Font("Helvetica", Font.PLAIN, 12);

	mode = true;
	String temp1[] = {"チータ", "タヌキ", "サル", "コアラ",
			  "クロヒョウ", "トラ", "コジカ", "ゾウ",
			  "オオカミ", "ヒツジ", "ペガサス", "ライオン"};
	animal = temp1;
	String temp2[][] = {{"・成功願望が強い",
			     "・好奇心が極めて強い",
			     "・瞬発力はあるが、長続きしない",
			     "・チャレンジャーではあるが、諦めも早い",
			     "・欲しいと思ったらすぐ買う",
			     "・プライドが高い",
			     "・恥をかきたくない",
			     "・大きな数字に強いが、小さな数字には興味がない",
			     "・常に大勢の中心でいたい",
			     "・人前でカッコつけたがる",
			     "・超プラス志向で、マイナスの事を言うのを嫌う",
			     "・早とちりのお人好しのところがある",
			     "・話も態度も大きい",
			     "・焼肉が好き"},
			    {"・何事も経験と実績を重んじる",
			     "・古いものが好き",
			     "・究極の逸品に弱い",
			     "・根拠のない自信がある",
			     "・年配の人、年の離れた人からかわいがられる",
			     "・天然ボケの人が多い",
			     "・こじつけ、ごろ合わせが好き",
			     "・他のマスコットにもなれるが、しっぽが出ている",
			     "・行きつけの店にしか行かない",
			     "・他人の話をすぐ自分の話にする特技がある",
			     "・役割分担が好き",
			     "・物忘れが多い",
			     "・「はい、わかりました」と返事だけはいい",
			     "・自分の出番待ちをする",
			     "・存在感がないとダメ",
			     "・子供の時おとなしい人が多い",
			     "・そばが好き"},
			    {"・細かなこと、小さいことに気がつく",
			     "・乗せられると弱い",
			     "・堅苦しい雰囲気に弱い",
			     "・何でもゲーム感覚で楽しむ",
			     "・落ち着きがない",
			     "・早とちりや早合点が多い",
			     "・信じやすい、だまされやすい",
			     "・目的や指示を明確にしてあげないとダメ",
			     "・人の真似をするのがうまい",
			     "・ほめられたいために頑張る",
			     "・話すときは、相手の目をじっと見る",
			     "・手先が器用",
			     "・何事も短期決戦"},
			    {"・一見おとなしい人が多い",
			     "・計算高い",
			     "・疑い深い",
			     "・しっぽを出さない",
			     "・ボーっとしている時間がないと頑張れない",
			     "・競争意識は強いが、負ける勝負はしない",
			     "・出し抜いて勝つのが好き",
			     "・笑いをとるための毒舌家",
			     "・下ネタはＯＫ",
			     "・最悪のケースを考えてから行動する",
			     "・サービス精神旺盛",
			     "・後からあれこれと悔やむ",
			     "・ロマンチストだが現実的",
			     "・南の島、温泉が好き",
			     "・長期的展望に立って考える",
			     "・昼寝が好きで、夜は強い",
			     "・見つかったときの言い訳がうまい"},
			    {"・メンツやプライド、立場にこだわる",
			     "・常にリーダーシップを取りたい",
			     "・スマートでありたい",
			     "・新しいものが大好き",
			     "・気を遣われると上機嫌",
			     "・小さな親切",
			     "・いつまでも現役でいたい",
			     "・攻撃的だが、あきらめやすい",
			     "・正義感が強い",
			     "・批判精神が強い",
			     "・喜怒哀楽が、顔や態度に出やすい",
			     "・傷つきやすい",
			     "・先行逃げ切り型",
			     "・白い色にひかれるので、黒が好き",
			     "・おしゃれ",
			     "・主語が多い"},
			    {"・ＭＯＯＮの要素を強く持っている",
			     "・自由、平等、博愛主義",
			     "・誠心誠意",
			     "・バランス感覚抜群",
			     "・悠然とした雰囲気",
			     "・即断即決はしない",
			     "・決めると徹底的にやる",
			     "・あまり大きい話はしない",
			     "・全体像がつかめないとダメ",
			     "・自分の生活圏を大切にする",
			     "・カラフルなおしゃれ",
			     "・器用貧乏",
			     "・気づかない計算高さ",
			     "・面倒見がよく、親分肌",
			     "・笑いながらきつい一言が言える",
			     "・相手の「言い方」が気になる",
			     "・思い込みが強い"},
			    {"・好奇心旺盛",
			     "・緊張が長く続かない",
			     "・初対面では警戒心が強い",
			     "・大勢の中でも、仲のよい人としか話さない",
			     "・親しくなるとわがままになる",
			     "・相手の人柄がすべて",
			     "・好き嫌いは激しい",
			     "・愛情が確認できないと不安になる",
			     "・かけひきや裏表のある対応は苦手",
			     "・感情を隠しきれない",
			     "・行動範囲が限られている",
			     "・食べ物、飲み物の添加物が気になる",
			     "・人を育てたり、教えたりするのがうまい"},
			    {"・常に何かに打ち込んでいたい",
			     "・その道のプロ、職人を目指す",
			     "・さりげなく努力しているポーズを見せる",
			     "・努力という言葉は嫌い",
			     "・人の話を聞かない",
			     "・個人プレーが多い",
			     "・やると決めたら最後までやる",
			     "・自分がダメだと思ったものには挑まない",
			     "・徹夜は平気",
			     "・「俺達に明日はない」的",
			     "・敵、味方の区別が極めてはっきりしている",
			     "・根回しがうまい",
			     "・細かい計算はできない問題発見のプロ",
			     "・報、連、相ができない",
			     "・話が大きい",
			     "・キレたときは最も怖い"},
			    {"・一人だけの時間と空間が好き",
			     "・ペースを乱されるのを嫌う",
			     "・自分しかできない事でＮＯ.１を目指す",
			     "・「××流」",
			     "・自己流を持っている",
			     "・初対面ではとっつきにくい",
			     "・言葉足らずのとこらがある",
			     "・臨機応変の対応は苦手",
			     "・歩くのが苦にならない",
			     "・すぐメモを取る習慣がある",
			     "・唯我独尊",
			     "・人まねをしたくない",
			     "・時系列の記憶力が高い",
			     "・「変わってるね」と言われると嬉しい"},
			    {"・淋しがり屋で、独りぼっちが嫌い",
			     "・仲間はずれにされると傷つく",
			     "・人から相談されると、すごく嬉しい",
			     "・相手に気を遣われると、すごく嬉しい",
			     "・皆で助け合いの精神",
			     "・「和」を乱す人を最も嫌う",
			     "・客観的配慮、気配りができる",
			     "・客観的に物事を判断できる",
			     "・ハッキリものを言える",
			     "・好き嫌いは激しい",
			     "・「世のため、人のため」が口癖",
			     "・約束は絶対に守り、守れない約束はしない",
			     "・情報収集家",
			     "・お金を貯めるのが好き",
			     "・お金の事にはキッチリしている",
			     "・自分を売る",
			     "・何事も丁寧",
			     "・感情的になりやすい",
			     "・ぐちやぼやきが多い",
			     "・本当の自分を出さない"},
			    {"・気分屋",
			     "・天気屋だが、それを隠そうとしない",
			     "・乗っている時とそうでない時の落差が激しい",
			     "・長所はすごいが、あとは平凡",
			     "・ピンと来る感性はすごい",
			     "・ポイントは一言でいい",
			     "・いちいち細かく指示されるとダメ",
			     "・束縛される環境に弱い",
			     "・わがままである",
			     "・根拠のない考え方をする",
			     "・大げさな人が多い",
			     "・一番面倒臭がり屋",
			     "・豪華絢爛",
			     "・断られる前に断ってしまう",
			     "・自分で自分がわからない",
			     "・他人が横を通っただけで気になって仕方ない",
			     "・社交辞令の天才",
			     "・人を使うのがうまい",
			     "・うなづきながら他の事を考えている"},
			    {"・徹底的にこだわる",
			     "・その道の先生を目指す",
			     "・教え方が厳しい",
			     "・他人の細かいところに気づく",
			     "・言ったことをよく覚えている",
			     "・服装はキチンとしている",
			     "・礼儀礼節にうるさい",
			     "・世間体を気にする",
			     "・決して弱音を吐かない",
			     "・本音を言わない",
			     "・王様扱いに弱い",
			     "・数字や計算に弱い",
			     "・装飾的おしゃれ",
			     "・甘えん坊である",
			     "・大きく漠然とした話が多い",
			     "・内外の落差が激しい"}};
	ft = temp2;

	letter = new Panel();
	component = new Panel();
	yyyymmdd = new Panel();
	button = new Panel();

	year = new TextField("", 5);
	month = new Choice();
	day = new Choice();
	try{
	    month.add("");
	    day.add("");
	    for(int i=1; i<32; i++){
		if(i<13){
		    month.add(""+i);
		}
		day.add(""+i);
	    }
	}catch(Exception e){
	    //
	}
	yyyymmdd.add(year);
	yyyymmdd.add(new Label("年"));
	yyyymmdd.add(month);
	yyyymmdd.add(new Label("月"));
	yyyymmdd.add(day);
	yyyymmdd.add(new Label("日"));

	run = new Button("run");
	clear = new Button("clear");
	back = new Button("back");
        run.addActionListener(this);
	clear.addActionListener(this);
	back.addActionListener(this);
	button.add(run);
	button.add(clear);
	button.add(back);

	component.setLayout(new GridLayout(2, 1));
	component.add(yyyymmdd);
	component.add(button);

	this.setLayout(new GridLayout(6, 1));
	this.add(component);

    }

    //閏年かどうかを判断するメソッド
    public boolean leapyear(int n){
	if(n%400==0){
	    return true;
	}else if(n%100==0){
	    return false;
	}else if(n%4==0){
	    return true;
	}else{
	    return false;
	}
    }

    //ナンバーを設定するメソッド
    public int setNumber(int y, int m, int d){
	int n = 0;
	if(y<1944){
	    n = 60000;
	    for(int i=1943; i>=y; i--){
		if(leapyear(i)){
		    n -= 366;
		}else{
		    n -= 365;
		}
	    }
	}else{
	    for(int i=1944; i<y; i++){
		if(leapyear(i)){
		    n += 366;
		}else{
		    n += 365;
		}
	    }
	}
	for(int i=1; i<m; i++){
	    if(i==2){
		if(leapyear(y)){
		    n += 29;
		}else{
		    n += 28;
		}
	    }else if(i==4 || i==6 || i==9 || i==11){
		n += 30;
	    }else{
		n += 31;
	    }
	}
	n += d;
	return n%60;
    }

    //動物を設定するメソッド
    public int setAnimal(int n){
	switch(n){
	case 1:
	case 7:
	case 42:
	case 48:
	    return 0;//チータ
	case 2:
	case 8:
	case 41:
	case 47:
	    return 1;//タヌキ
	case 3:
	case 9:
	case 15:
	case 34:
	case 40:
	case 46:
	    return 2;//サル
	case 4:
	case 10:
	case 16:
	case 33:
	case 39:
	case 45:
	    return 3;//コアラ
	case 5:
	case 44:
	case 50:
	case 53:
	case 56:
	case 59:
	    return 4;//クロヒョウ
	case 6:
	case 43:
	case 49:
	case 54:
	case 55:
	case 0:
	    return 5;//トラ
	case 11:
	case 17:
	case 32:
	case 38:
	    return 6;//コジカ
	case 12:
	case 18:
	case 31:
	case 37:
	    return 7;//ゾウ
	case 13:
	case 19:
	case 24:
	case 25:
	case 30:
	case 36:
	    return 8;//オオカミ
	case 14:
	case 20:
	case 23:
	case 26:
	case 29:
	case 35:
	    return 9;//ヒツジ
	case 21:
	case 22:
	case 27:
	case 28:
	    return 10;//ペガサス
	case 51:
	case 52:
	case 57:
	case 58:
	    return 11;//ライオン
	default:
	    return -1;
	}
    }

    //アクション設定メソッド
    public void actionPerformed(ActionEvent ev){
	if(ev.getSource() instanceof Button){
	    if(((Button)(ev.getSource())).getLabel()=="run"){
		int yyyy, mm, dd;
		try{
		    yyyy = Integer.parseInt(year.getText());
		    mm = Integer.parseInt(month.getSelectedItem());
		    dd = Integer.parseInt(day.getSelectedItem());
		}catch(Exception e){
		    yyyy = 0;
		    mm = 0;
		    dd = 0;
		}
		if(yyyy<1900 || mm==0 || dd==0){
		    repaint();
		    return;
		}
		num = setNumber(yyyy, mm, dd);
		mode = false;
	    }else if(((Button)(ev.getSource())).getLabel()=="clear"){
		year.setText("");
		month.select(0);
		day.select(0);
	    }else if(((Button)(ev.getSource())).getLabel()=="back"){
		if(mode){
		    year.setText("");
		    month.select(0);
		    day.select(0);
		}else{
		    mode = true;
		}
	    }
	    repaint();
	}
    }


    //描画メソッド
    public void paint(Graphics g){
	bg.clearRect(0, 0, d.width, d.height);
	if(mode){
	    bg.setColor(Color.lightGray);
	    bg.setFont(f1);
	    bg.drawString("Animal", 55, 205);
	    bg.drawString("Fortune", 105, 255);
	    bg.drawString("Telling!!", 155, 305);
	    bg.setColor(Color.blue);
	    bg.drawString("Animal", 50, 200);
	    bg.drawString("Fortune", 100, 250);
	    bg.drawString("Telling!!", 150, 300);
	    bg.setColor(Color.black);
	    bg.setFont(f2);
	    bg.drawString("※ 生年月日を入力し、「run」を押して下さい。", 50, 400);
	    bg.drawString("※ 未入力のままでは何も起こりません。", 50, 425);
	    bg.drawString("※ 年は1900年以降として下さい。", 50, 450);
	    bg.drawString("※ 「clear」を押すと、生年月日が初期状態となります。。", 50, 475);
	    bg.drawString("※ 「back」を押すと、初期画面に戻ります。", 50, 500);
	    
	}else{
	    try{
		int ani = setAnimal(num);
		bg.setColor(Color.lightGray);
		bg.setFont(f1);
		bg.drawString(animal[ani], 5, 155);
		bg.setColor(Color.blue);
		bg.drawString(animal[ani], 0, 150);
		bg.drawString(animal[ani], 1, 150);
		bg.drawString(animal[ani], 0, 151);
		bg.drawString(animal[ani], 1, 151);
		bg.setColor(Color.red);
		bg.setFont(f2);
		for(int i=0; i<ft[ani].length; i++){
		    bg.drawString(ft[ani][i], 50, 25*i+200);
		}
	    }catch(Exception e){
		//
	    }
	}
	
	g.drawImage(bi, 0, 0, this);
    }

    //更新メソッド
    public void update(Graphics g){
	paint(g);
    }

}
