
//
// Nach einer Idee von Dirk Meier
//
// Javascript-Umsetzung, Anpassungen und Erweiterung von Maxx
// Version 2.3 vom 20.3.2003
//

var initDone=0;
var PLURAL    = 2;
var SINGULAR  = 1;
var NOMINATIV = 0;
var GENITIV   = 1;
var DATIV     = 2;
var AKKUSATIV = 3;

function Generator(thema, defmuster)
  {
  var va = new Array();
  var zeile = new Array();
  var tmpLine = new Array();
  var vers = new Array();
  var nomKat  = 0;
  var verbKat = 0;

  q0=saetze.length;
  q1=praepos.length;
  q2=zeit.length;
  q3=konj.length;
  q6=phrase.length;
  q8=subj.length;
  q9=pronom.length;

  if(thema == 0) // Mystik
    bthema=4;

  if(thema == 1) // Space
    bthema=2;

  if(thema == 2) // Poesie
    bthema=1;

  if(!initDone)
    {
// Umwandeln Nomen
    for(i1=0; i1<q4; i1++)
      {
      nomen[i1][3]=bin2dez(nomen[i1][3]);
      nomen[i1][4]=bin2dez(nomen[i1][4]);
      }

// Umwandeln Adjektive
    for(i1=0; i1<q11; i1++)
      {
      adj[i1][1]=bin2dez(adj[i1][1]);
      adj[i1][2]=bin2dez(adj[i1][2]);
      }

// Umwandeln Verben
    for(i1=0; i1<q5; i1++)
      {
      verb[i1][3]=bin2dez(verb[i1][3]);
      verb[i1][4]=bin2dez(verb[i1][4]);
      }
    }
  initDone=1;

  if(defmuster == -1)
    {
    b=Math.floor(Math.random()*q10);  // Muster
    az=muster[b][0];

    for(a=0; a<az; a++)
      {
      zeile[a]=saetze[muster[b][a+1]];
      }
    }
  else
    {
    zeile[0]=saetze[defmuster];
    az=1;
    }

  for(a=0; a<az; a++)
    {
    parseZeile=zeile[a];

    z1=0;
    z2=0;

    while(z1 < parseZeile.length)
      {
      token=parseZeile.substr(z1,3);

      if(token == "UND")
        {
        tmpLine[z2] = "und";
        z1+=4;
        z2++;
        }

      if(token == "ODR")
        {
        tmpLine[z2] = "oder";
        z1+=4;
        z2++;
        }

      if(token == "WRD")
        {
        tmpLine[z2] = "wird";
        z1+=4;
        z2++;
        }

      if(token == "PRA") // Präposition
        {
        tmpLine[z2] = praepos[Math.floor(Math.random()*q1)];
        z1+=4;
        z2++;
        }

      if(token == "KON") // Konjunktion
        {
        tmpLine[z2] = konj[Math.floor(Math.random()*q3)];
        z1+=4;
        z2++;
        }

      if(token == "TMP") // Tempus
        {
        tmpLine[z2] = zeit[Math.floor(Math.random()*q2)];
        z1+=4;
        z2++;
        }

      if(token == "PRO") // Pronomen
        {
        tmpLine[z2] = pronom[Math.floor(Math.random()*q9)];
        z1+=4;
        z2++;
        }

      if(token == "SUB") // Substantiv
        {
        nArtikel=parseInt(parseZeile.substr(z1+3,1));
        nAdj=parseInt(parseZeile.substr(z1+4,1));
        nFall=parseInt(parseZeile.substr(z1+5,1));
        nNumerus=parseInt(parseZeile.substr(z1+6,1));

        if(nNumerus==PLURAL && nArtikel==1)
          nArtikel=2;

        if(verbKat != 0)
          {
          do {
             wa=Math.floor(Math.random()*q4);
             } while((verbKat & nomen[wa][3]) == 0 || (bthema & nomen[wa][4]) == 0)

          verbKat=0;
          }
        else
          {
          do {
             wa=Math.floor(Math.random()*q4);
             } while((bthema & nomen[wa][4]) == 0)
          }

        nGesch=nomen[wa][2]-1; // Genus

        if(nFall == 0)
          nomKat=nomen[wa][3];

        if(nGesch < 0)
          {
          nArtikel=0;
          nGesch=0;
          f=1;
          }
        else
          {
          f=0;
          if(nArtikel >= 2)
            {
            if(nNumerus == SINGULAR)
              tmpLine[z2] = artikel[nFall*3+nGesch];
            if(nNumerus == PLURAL)
              tmpLine[z2] = artikel[nFall+12];

            z2++;
            }

          if(nArtikel == 1)
            {
            tmpLine[z2] = "ein"+en_str[nFall*3+nGesch];
            z2++;
            }

          if(nAdj != 0)   // mit Adjektiv
            {
            do
              {
              rnd=Math.floor(Math.random()*q11);
              katadj   = adj[rnd][1];         // 16| 8| 4 |2|1
              katnomen = nomen[wa][3];        // Lw|Di|UDi|+|-

              sub1 = katnomen & 3;
              sub2 = katadj & 3;

if(bthema==1 && sub1==2)
  sub2=2;
              katadj   = katadj    & 28;
              katnomen = katnomen  & 28;
              } while ((katadj & katnomen) == 0 || (bthema & adj[rnd][2]) == 0 || (sub1 & sub2) == 0)

            tmpLine[z2] = adj[rnd][0];

            if(nNumerus != PLURAL)
              {
              if(nArtikel == 0)   // ohne Artikel
                tmpLine[z2] = tmpLine[z2]+d3_str[nFall*3+nGesch];

              if(nArtikel == 1)   // mit unbestimmtem Artikel
                tmpLine[z2] = tmpLine[z2]+d2_str[nFall*3+nGesch];

              if(nArtikel == 2)   // mit bestimmten
                tmpLine[z2] = tmpLine[z2]+d4_str[nFall*3+nGesch];

              z2++;
              }
            else
              {
              if(nArtikel == 0)
                tmpLine[z2] = tmpLine[z2]+d3_str[nFall+12];

              if(nArtikel == 2)
                tmpLine[z2] = tmpLine[z2]+d4_str[nFall+12];

              z2++;
              }
            }
          } // Ende Geschlecht Die, Der, Das

        tmpLine[z2] = nomen[wa][nNumerus-1];

        l0_end=tmpLine[z2].substr(tmpLine[z2].length-1,1);
        l1_end=tmpLine[z2].substr(tmpLine[z2].length-2,1);
        l2_end=tmpLine[z2].substr(tmpLine[z2].length-3,1);

        vo=0;
        if(l0_end == "a" || l0_end == "e" || l0_end == "i" || l0_end == "o" || l0_end == "u")
          vo=4;

        if(l1_end == "a" || l1_end == "e" || l1_end == "i" || l1_end == "o" || l1_end == "u")
          vo=vo|2;

        if(l2_end == "a" || l2_end == "e" || l2_end == "i" || l2_end == "o" || l2_end == "u")
          vo=vo|1;

        l2_end=l0_end+l1_end;
        l3_end=tmpLine[z2].substr(tmpLine[z2].length-3,3);

        endung=EndungSubstantiv(vo, nNumerus, nFall, nGesch, f, l0_end, l2_end, l3_end);

        tmpLine[z2]=tmpLine[z2]+endung;

        z1=z1+8;
        z2++;
        } //end "SUB" (Substantiv)

      if(token == "VRB")
        {
        et=parseInt(parseZeile.substr(z1+3,1));
        nNumerus=parseInt(parseZeile.substr(z1+4,1));

        if(nomKat != 0)
          {
          no=nomen[wa][0];
          do {
             wa=Math.floor(Math.random()*q5);
             } while(((verb[wa][2] != et) && (verb[wa][2] != 2)) || ((verb[wa][3] & nomKat) == 0) || (bthema & verb[wa][4]) == 0)

          nomKat=0;
          }
        else
          {
          if(nomKat == 0)
            {
            do {
               wa=Math.floor(Math.random()*q5);
               } while((verb[wa][2] != et) && (verb[wa][2] != 2) || (bthema & verb[wa][4]) == 0)

            verbKat=verb[wa][3];
            }
          }

        tmpLine[z2]=verb[wa][nNumerus-1];

        z1+=6;
        z2++;
        } //end "VRB" (Verb)

      if(token == "IWO")
        {
        tmpLine[z2] = phrase[Math.floor(Math.random()*q6)];
        z1+=4;
        z2++;
        } //end "IWO" (Phrasen / irgendwelche Worte)

      if(token == "DIE")
        {
        tmpLine[z2] = "die";
        z1+=4;
        z2++;
        } //end "DIE"

      if(token == "IST")
        {
        tmpLine[z2] = "ist";
        z1+=4;
        z2++;
        } //end "IST"

      if(token == "SND")
        {
        tmpLine[z2] = "sind";
        z1+=4;
        z2++;
        } //end "SND"

      if(token == "KSS")
        {
        tmpLine[z2] = subj[Math.floor(Math.random()*q8)];
        z1+=4;
        z2++;
        } //end "KSS" (irgendein Subjekt)

      if(token == "KOM")
        {
        tmpLine[z2] = ",";
        z1+=4;
        z2++;
        } //end "KOM" (,)
      } // End while(z1 < parseZeile.len())

    vers[a]="";
    for(x=0; x<z2; x++)
      {
      if(x==0)
        {
        vers[a]  = tmpLine[0].substr(0,1).toUpperCase();
        vers[a] += tmpLine[0].substr(1,tmpLine[0].length-1);
        }
      else
        vers[a] += tmpLine[x];

      if(tmpLine[x+1] != ",")
        vers[a] += " ";
      }

    } // for a=

  return vers;
  }




function EndungSubstantiv(vo, nNumerus, nKasus, nGesch, f, l0_end, l2_end, l3_end)
  {
  end="";

  if(nNumerus == PLURAL)
    {
    if(nKasus != DATIV)
      return end;

    if(l0_end != "n")
      end="n";

    return end;
    }

// Singular
  if(nGesch == 1 || nKasus == NOMINATIV)
    {
    return end;
    }

  if(nKasus == GENITIV)
    {
    end="es";
    if(l0_end == "e" && ((vo & 6) == 4) && nGesch == 0)
      {
      end="ns";
      return end;
      }
    if(l2_end == "et" || l2_end == "rr" || l3_end == "eit")
      {
      end="en";
      return end;
      }
    if((l0_end == "r" || l0_end == "n" || l0_end == "l") && ((vo & 2) == 2))
      {
      end="s";
      return end;
      }
    if(f == 1)
      {
      end="s";
      return end;
      }
    if(l0_end == "s" && ((vo & 3) != 3))
      {
      end="ses";
      return end;
      }
    if(vo <= 1)
      {
      end="es";
      }
    if(end == "es" && l0_end == "e")
      {
      end="s";
      }

    return end;
    } // ende Genitiv

  if(nKasus == DATIV)  // Dativ
    {
    end="e";

    if(l0_end == "e")
      {
      end="";
      }

    if(l3_end == "net" || l2_end == "rr" || l3_end == "eit")
      {
      end="en";
      return end;
      }

    if(((l0_end == "r" || l0_end == "n" || l0_end == "l") && ((vo & 2) == 2)) || vo <= 1)
      {
      end="";
      }

    if(((vo & 6) == 4) && nGesch == 0)
      {
      end="n";
      }

    if(f == 1)
      {
      end="";
      }

    return end;
    }  // ende Dativ

  if(nKasus == AKKUSATIV)
    {
    if(l2_end == "et" || l2_end == "rr" || l3_end == "eit")
      {
      end="en";
      }

    if(((vo & 6) == 4) && nGesch == 0)
      {
      end="n";
      }

    if(f == 1)
      {
      end="";
      }

    return end;
    } // Ende Akkusativ

  return "";
  }

function bin2dez(bin)
  {
  n=0;
  dez=0;
  len=bin.length;

  for(i=len-1;i>=0;i--,n++)
    {
    if(bin.substr(i,1) == "1")
      dez+=Math.pow(2,n);
    }
  return dez;
  }


