function valancy(number) {
         switch( number.toUpperCase() ) {
         case "M": return 1000;
         case "D": return 500;
         case "C": return 100;
         case "L": return 50
         case "X": return 10;
         case "V": return 5;
         case "I": return 1;
         default:  return 0;
         }
         return 0;
}

function is_mainchar(number) {
         switch( number.toUpperCase() ) {
         case "M": return 1;
         case "C": return 1;
         case "X": return 1;
         case "I": return 1;
         default:  return 0;
         }
         return 0;
}

function print_bem(bem) {
         document.roemzahl.bem.value+=bem+"\n";
}

function init_bem() {
         document.roemzahl.bem.value="";
}

function roe2dec(roe, art) {
         /*** umwandlung ***/
         max_valancy=valancy("M")+1;
         old_valancy=valancy("M");
         akt_valancy=0;
         char_ctr=0;
         char_type=0; /* 1=Grundzahlen; 0=Zwischenzahlen; 2=subtraktive Kombination */
         dec=0;
         for( t=0; t<roe.length; t++ ) {
              /*** handelt es sich um eine subtraktive Kombination ***/
              if( (t+1)<roe.length && valancy(roe.charAt(t))<valancy( roe.charAt(t+1)) ) {
                    /* subtraktive Kombination immer mit Grundzahlen vor beliebigen zeichen! */
                    if( is_mainchar( roe.charAt(t) ) == 0 ) {
                        print_bem("Verstoß gegen Regel 2: die Kombination '"
                        + roe.charAt(t) + roe.charAt(t+1) + "' ist falsch! Zwischenzahlen (hier '"
                        + roe.charAt(t) + "') dürfen nicht subtrahiert werden." )
                        return 0;
                    }
                    /* es ist eine sk! */
                    akt_valancy = valancy( roe.charAt(t+1) ) - valancy( roe.charAt(t) );
                    char_type=2;
              } else {
                    akt_valancy = valancy( roe.charAt(t) );
                    char_type = is_mainchar( roe.charAt(t) );
              }

              if( old_valancy < akt_valancy ) {
                  print_bem("Fehler: die einzelnen Zeichen sind nicht von links"
                   + " nach rechts mit absteigender Wertigkeit angeordnet.")
                  return 0;
              }

              if( art == 0 ) {
                if( char_type != 2 && max_valancy <= valancy( roe.charAt(t)) ) {
                   print_bem("Warnung: das Zeichen '"+roe.charAt(t)+"' an Stelle "+(t+1)+" hat die"
                   +" gleiche oder eine höhere Wertigkeit als ein Zeichen in einer subtraktiven Kombination links davon.")
                }
                if( char_type == 2 && max_valancy <= valancy( roe.charAt(t+1)) ) {
                  print_bem("Warnung: die subtraktive Kombination '"+roe.charAt(t)+roe.charAt(t+1)
                   +"' enthält Zeichen mit gleicher oder höherer Wertigkeit als ein Zeichen"
                   +" in einer subtraktiven Kombination links davon.")
                }
              } else {
                if( char_type != 2 && max_valancy < valancy( roe.charAt(t)) ) {
                   print_bem("Warnung: das Zeichen '"+roe.charAt(t)+"' an Stelle "+(t+1)+" hat"
                   +" eine höhere Wertigkeit als ein Zeichen in einer subtraktiven Kombination links davon.")
                }
                if( char_type == 2 && max_valancy < valancy( roe.charAt(t+1)) ) {
                  print_bem("Warnung: die subtraktive Kombination '"+roe.charAt(t)+roe.charAt(t+1)
                   +"' enthält Zeichen mit einer höheren Wertigkeit als ein Zeichen"
                   +" in einer subtraktiven Kombination links davon.")
                }
                if( char_type == 2 && (valancy(roe.charAt(t+1))/valancy(roe.charAt(t)) )>10 ) {
                  print_bem("Verstoß gegen Regel 3: Bei '"+roe.charAt(t)+roe.charAt(t+1)
                   +"' darf kein "+roe.charAt(t)+" vor einem " +
                   roe.charAt(t+1)+" stehen!")
                }
              }

              if( t>0 && char_type != 2 && old_valancy == akt_valancy ) {
                   char_ctr++;
                   if(char_type == 1 && char_ctr == 3) {
                       print_bem("Verstoß gegen Regel 1: es dürfen höchstens 3 Grundzahlen (hier'"
                        +roe.charAt(t-1)+"') nebeneinander stehen.");
                   }
                   if(char_type == 0 && char_ctr == 1) {
                       print_bem("Fehler: ein und die selbe Zwischenzahl (hier'"+roe.charAt(t-1)
                       +"') darf nicht direkt hintereinander stehen.");
                       return 0;
                   }
              } else {
                   char_ctr = 0;
              }

              /* übernahme für nächsten schritt */
              dec += akt_valancy;
              old_valancy = akt_valancy;
              if( char_type == 2 ) max_valancy = valancy(roe.charAt(t))
              if( char_type == 2 ) t++;
         }

         return dec;
}

function dec2roe2(Mydec) {
         Mydec = parseInt(Mydec)
         roe="";
         potenz=1000;
         while( Mydec > 0 ) {
                p = Math.floor(Mydec / potenz)
                Mydec %= potenz;
                if( p == 0 ) {
                    potenz /= 10;
                }
                if( potenz == 1000 ) {
                    if( p == 1 ) roe += "M";
                    if( p == 2 ) roe += "MM";
                    if( p == 3 ) roe += "MMM";
                    if( p == 4 ) roe += "MMMM";
                }
                if( potenz == 100 ) {
                    if( p == 1 ) roe += "C";
                    if( p == 2 ) roe += "CC";
                    if( p == 3 ) roe += "CCC";
                    if( p == 4 ) roe += "CD";
                    if( p == 5 ) roe += "D";
                    if( p == 6 ) roe += "DC";
                    if( p == 7 ) roe += "DCC";
                    if( p == 8 ) roe += "DCCC";
                    if( p == 9 ) roe += "CM";
                }
                if( potenz == 10 ) {
                    if( p == 1 ) roe += "X";
                    if( p == 2 ) roe += "XX";
                    if( p == 3 ) roe += "XXX";
                    if( p == 4 ) roe += "XL";
                    if( p == 5 ) roe += "L";
                    if( p == 6 ) roe += "LX";
                    if( p == 7 ) roe += "LXX";
                    if( p == 8 ) roe += "LXXX";
                    if( p == 9 ) roe += "XC";
                }
                if( potenz == 1 ) {
                    if( p == 1 ) roe += "I";
                    if( p == 2 ) roe += "II";
                    if( p == 3 ) roe += "III";
                    if( p == 4 ) roe += "IV";
                    if( p == 5 ) roe += "V";
                    if( p == 6 ) roe += "VI";
                    if( p == 7 ) roe += "VII";
                    if( p == 8 ) roe += "VIII";
                    if( p == 9 ) roe += "IX";
                }
         }
         return roe;
}

function dec2roe(dec) {
         /*** Bilden eines Arrays mit den Sonderzahlen im Römischen Zahlensystem:
                | Grundzahlen                           | Zwischenzahlen -------|----------------------------------------|---------------------------------------
         1er    | 1   = I;                               | 4   = IV; 5   = V;
         10er   | 9   = IX; 10  = X;                     | 40  = XL; 49  = IL; 50  = L;
         100er  | 90  = XC; 99  = IC; 100 = C;           | 400 = CD; 490 = XD; 499 = ID; 500 = D
         1000er | 900 = CM; 990 = XM; 999 = IM; 1000 = M |
         ***/
         sn = new Array(19);
         for(t=0; t<sn.length; t++) { sn[t]=new Array(2); }
         sn[0][0] = 1;   sn[0][1] = "I";
         sn[1][0] = 4;   sn[1][1] = "IV";
         sn[2][0] = 5;   sn[2][1] = "V";
         sn[3][0] = 9;   sn[3][1] = "IX";
         sn[4][0] = 10;  sn[4][1] = "X";
         sn[5][0] = 40;  sn[5][1] = "XL";
         sn[6][0] = 49;  sn[6][1] = "IL";
         sn[7][0] = 50;  sn[7][1] = "L";
         sn[8][0] = 90;  sn[8][1] = "XC";
         sn[9][0] = 99;  sn[9][1] = "IC";
         sn[10][0] = 100; sn[10][1] = "C";
         sn[11][0] = 400; sn[11][1] = "CD";
         sn[12][0] = 490; sn[12][1] = "XD";
         sn[13][0] = 499; sn[13][1] = "ID";
         sn[14][0] = 500; sn[14][1] = "D";
         sn[15][0] = 900; sn[15][1] = "CM";
         sn[16][0] = 990; sn[16][1] = "XM";
         sn[17][0] = 999; sn[17][1] = "IM";
         sn[18][0] = 1000; sn[18][1] = "M"

         roe="";
         while( dec > 0 ) {
                for( t=(sn.length-1); t>=0; t-- ) {
                     if( sn[t][0] > dec ) continue;
                     roe += sn[t][1];
                     dec -= sn[t][0];
                     break;
                }
         }
         return roe;
}

function r2d2() {
         init_bem();

         /*** haben alle eine gültige Wertigkeit? ***/
         roe=document.roemzahl.roe1.value;
         for( t=0; t<roe.length; t++ )
            if( valancy( roe.charAt(t) ) == 0 ) {
              print_bem("Fehler: Die römische Zahl enthält ein ungültiges Zeichen: '" + roe.charAt(t) +"'");
              return;
            }
         dec=roe2dec(roe,1);
         document.roemzahl.dec.value=dec;
         if( dec == 0 ) return;
         your_roe = roe;
         my_roe=dec2roe2(dec);
         if( my_roe != your_roe ) {
              print_bem("\nDie römische Zahl lässt sich besser darstellen: " + my_roe);
         }
}

function d2r() {
         init_bem();
         NewDec=document.roemzahl.dec.value;
         if( NewDec > 3999 ) {
             print_bem("Fehler: Die höchste Zahl im römischen Zahlensystem ist 3999.");
             document.roemzahl.dec.value = "3999";
             return;
         }
         NewRoe=dec2roe(NewDec);
         NewRoe1=dec2roe2(NewDec)
         document.roemzahl.roe1.value=NewRoe1;
}

