import java.applet.*;
import java.awt.*;

public class Geldscheintester extends Applet
{
	int arDiederMult[][] = {
		{ 0,1,2,3,4, 5,6,7,8,9 },
		{ 1,2,3,4,0, 6,7,8,9,5 },
		{ 2,3,4,0,1, 7,8,9,5,6 },
		{ 3,4,0,1,2, 8,9,5,6,7 },
		{ 4,0,1,2,3, 9,5,6,7,8 },

		{ 5,9,8,7,6, 0,4,3,2,1 },
		{ 6,5,9,8,7, 1,0,4,3,2 },
		{ 7,6,5,9,8, 2,1,0,4,3 },
		{ 8,7,6,5,9, 3,2,1,0,4 },
		{ 9,8,7,6,5, 4,3,2,1,0 }	};

	int arDMPermutate[][] = {
		{ 1,5,7,6,2, 8,3,0,9,4 },
		{ 5,8,0,3,7, 9,6,1,4,2 },
		{ 8,9,1,6,0, 4,3,5,2,7 },
		{ 9,4,5,3,1, 2,6,8,7,0 },
		{ 4,2,8,6,5, 7,3,9,0,1 },
		{ 2,7,9,3,8, 0,6,4,1,5 },
		{ 7,0,4,6,9, 1,3,2,5,8 },
		{ 0,1,2,3,4, 5,6,7,8,9 },
		{ 1,5,7,6,2, 8,3,0,9,4 },
		{ 5,8,0,3,7, 9,6,1,4,2 },
		{ 0,1,2,3,4, 5,6,7,8,9 }	};

	boolean isChar[] = { true,true,false,false,false,false,
					  	 false,false,false,true,false };

	String arChar2Digit = "ADGKLNSUYZ";
	String arToken2Digit = "0123456789";

	final int _OK = 0;
	final int _WRONGLENGTH = 1;
	final int _INVALIDTOKEN = 2;
	final int _WRONGCODE = -1;


	TextField tfEingabe;
	TextField tfAusgabe;
	Button	  bnPruefen;


	byte CheckNumber(String Number)
	{
		int Result = 0;

		if (Number.length()!=11)
			return _WRONGLENGTH;

		Number = Number.toUpperCase();

		for (int i=0; i<11; i++)
		{
			int CurrDigit;

			if (isChar[i])
				CurrDigit = arChar2Digit.indexOf(Number.charAt(i));
			else
				CurrDigit = arToken2Digit.indexOf(Number.charAt(i));

			if (CurrDigit == -1)
				return _INVALIDTOKEN;

			CurrDigit = arDMPermutate[i][CurrDigit];
			Result = arDiederMult[Result][CurrDigit];
		}

		if (Result==0)
			return _OK;
		else
			return _WRONGCODE;
	}


	public String getAppletInfo()
	{
		return "Geldscheintester von Stephan Brumme";
	}

	public void init()
	{
    	resize(400, 50);

		tfEingabe = new TextField();
		tfAusgabe = new TextField();
		tfAusgabe.setEditable(false);
		bnPruefen = new Button("Überprüfen");

		Panel paTFHelper = new Panel();
		paTFHelper.setLayout(new BorderLayout());
		paTFHelper.add("Center",tfEingabe);
		paTFHelper.add("East",bnPruefen);

		setLayout(new BorderLayout());
		add("North",paTFHelper);
		add("Center",tfAusgabe);
	}

	public boolean action(Event event, Object what)
	{

		if ((event.target==bnPruefen)||(event.target==tfEingabe))
		{
			String sAusgabe;

			switch(CheckNumber(tfEingabe.getText()))
			{
			case _OK:			sAusgabe = "Der Geldschein hat eine gültige Seriennummer."; break;
			case _WRONGLENGTH:  sAusgabe = "Die Seriennummer hat eine falsche Länge (genau 11 Zeichen erforderlich)."; break;
			case _INVALIDTOKEN: sAusgabe = "Die Seriennummer enthält ungültige/falsche Zeichen."; break;
			case _WRONGCODE:	sAusgabe = "Die Seriennummer ist falsch."; break;
			default: sAusgabe ="Hi";
			}

			tfAusgabe.setText(sAusgabe);
		}

		return super.action(event,what);
	}
}
