import java.applet.Applet;
import java.awt.*;
import java.util.Date;

public class Pascha10 extends Applet {

TextField yearfld;
Label easterlbl;

// 曜日(0=SUN)を返す。1-2 月，1582年10-12月の処理は省略
int wday(int year, int month, int date)
{
    int adjust = year <= 1582 ? 2 : year/100 - year/400;
    return (year + year/4 - adjust + (13*month+8)/5 + date) % 7;
}

// 復活祭が 3/21 から何日後かを返す
int pascha(int year)
{
    int golden = year % 19;
    int fullmoon = (golden*(30 - 11)+15) % 30;
    if (year > 1582) {
        int century = (year - 1500)/100;
        int adjust = (century/25)*8 + Math.min(8, century%25/3) + 3;
        fullmoon = (fullmoon + year/100 - year/400 - 2 - adjust) % 30;
        // 第２エパクト補正
        if (fullmoon == 28 && golden >= 11) fullmoon--;
        // 4/26 -> 4/25補正
        else if (fullmoon > 28) fullmoon = 28;
    }
    return fullmoon + 7 - wday(year, 3, 21 + fullmoon);
}

// -------------- Java user interface ------------------------------

public void calc()
{
    // JDK1.0.2 documentation:
    //  getYear(): the year represented by this date, minus 1900. 
    Date d = new Date();
    int thisyear = d.getYear() + 1900;

    int year;
    String ystr = yearfld.getText();
    if (ystr.length() == 0)
        year = thisyear;
    else {
        try {
            year = Integer.parseInt(ystr);
        }
        catch (NumberFormatException ex) {
            year = -1;
        }
        if (year <= 0) {
            showStatus("invalid year value: " + ystr);
            year = thisyear;
        }
    }
    int month = 3;
    int date = 21 + pascha(year);
    if (date > 31) {
        month++; date -= 31;
    }
    easterlbl.setText("EASTER DATE: " + year + "-" + month + "-" + date);
    yearfld.setText(Integer.toString(year));
    yearfld.requestFocus();
    yearfld.selectAll();
}

public void init()
{
    try {
        Font f = getFont();
        setFont(new Font(f.getName(), f.getStyle(), 
            Integer.parseInt(getParameter("FONTSIZE"))
            ));
    } catch(Exception ex) {
        // do nothing
    }

    easterlbl = new Label("EASTER DATE: MMMM=MM=MM");
    yearfld = new TextField(5);

    setLayout(new GridLayout(0,1));

    Panel p;
    p = new Panel();
    p.add(new Label("YEAR:"));
    p.add(yearfld);
    add(p);
    add(easterlbl);
}

public void start()
{
    calc();     // calc here to set correct text selection
}

public boolean action(Event e, Object o)
{
    if (e.target instanceof TextField)
        calc();
    return true;
}

}
