package chiffre;

/**
 * AlgDs WS99 Uebungsblatt 4 Zusatzaufgabe "Code entziffern"<p>
 *
 * Christian.Semrau@student.uni-magdeburg.de
 * @author Christian Semrau, 28.11.1999
 */
class Matrixcode implements ChiffreInterface {
	int matrixbreite;
	int updown;
	boolean set = false;

	String eingabe;
	String ausgabe;
	int tmpbreite;
	int len;
	int rest;
	int maxlen;
	int[] spaltenleng;
	int[] zeilenleng;
	char[][] feld;

public String decode(String E) {
  if (!set) return "";
  eingabe = E;
  vorarbeit();

  // die Spalten fuellen
  int pos=0;
  for(int s=0; s<tmpbreite; s++)
	if ((s%2==0)==(updown==0))
	// gerade Spalten abwaerts
	  for(int z=0; z<spaltenleng[s]; z++)
	    feld[s][z] = eingabe.charAt(pos++);
	else
	// ungerade Spalten aufwaerts
	  for(int z=spaltenleng[s]-1; z>=0; z--)
	    feld[s][z] = eingabe.charAt(pos++);

  // Feld zeilenweise auslesen
  String ausgabe = "";
  for(int z=0; z<maxlen; z++)
	for(int s=0; s<zeilenleng[z]; s++)
	  ausgabe += feld[s][z];

  return ausgabe;
}

public String encode(String E) {
  if (!set) return "";
  eingabe = E;
  vorarbeit();

  // feld zeilenweise fuellen
  int pos=0;
  for(int z=0; z<maxlen; z++)
	for(int s=0; s<zeilenleng[z]; s++)
	  feld[s][z] = eingabe.charAt(pos++);

  String ausgabe = "";
  // die Spalten auslesen
  for(int s=0; s<tmpbreite; s++)
	if ((s%2==0)==(updown==0))
	// gerade spalten abwaerts (oder neuerdings aufwaerts...)
	  for(int z=0; z<spaltenleng[s]; z++)
		ausgabe += feld[s][z];
	else
	// ungerade spalten aufwaerts
	  for(int z=spaltenleng[s]-1; z>=0; z--)
	    ausgabe += feld[s][z];

  return ausgabe;
}
/**
 * 
 */
public void setKey(String s) {
	if (s==null||s.length()<=0){ set = false; return; }

	try{
		int p = s.indexOf(",");
		if (p<0){
			matrixbreite = new Integer(s).intValue();
			updown = 0;
			set = true;
		}else{
			matrixbreite = new Integer(s.substring(0,p)).intValue();
			updown = new Integer(s.substring(p+1)).intValue();
			set = true;
		}
	}catch(NumberFormatException e){
		set = false;
	}
}
public void vorarbeit() {
  tmpbreite = Math.min(matrixbreite, 1+eingabe.length());
  len = eingabe.length() / tmpbreite;  // Anzahl ganzer Zeilen
  rest= eingabe.length() % tmpbreite;  // Laenge der letzten Zeile bzw. 0
  maxlen = rest>0 ? len+1 : len;       // Gesamtzahl der Zeilen

  // Spaltenlaengen
  spaltenleng = new int[tmpbreite];
  for(int s=0; s<tmpbreite; s++)
	spaltenleng[s]=(s<rest) ? len+1 : len;
  // Zeilenlaengen
  zeilenleng = new int[maxlen];
  for(int z=0; z<maxlen; z++)
	zeilenleng[z]=tmpbreite;
  if (rest>0) zeilenleng[maxlen-1]=rest;

  feld = new char[tmpbreite][];  // feld [spalten] [spaltenlaenge]

  // Spalten anlegen
  for(int s=0; s<tmpbreite; s++)
	feld[s] = new char[spaltenleng[s]];
}
}