      // Convert characters from &#xxxx; notation to actual characters
      // Do so by writing out hidden input fields containing the & values
      // Since this is written as html, it will be automatically converted to the character values
      // The names of the hidden input fields will be char_xxxx where xxxx is from & notation
      // The characters can later be retrieved with GetCharacter(cap_de) for example
      var firstchar = cap_a.substr(2,4);
      var lastchar = low_ya.substr(2,4);
      document.write("<form name='convert'>");
      for (var i=firstchar; i<=lastchar; i++) {
        document.write("<input type='hidden' name='char_" + i + "' value='&#" + i + ";'>\n");
      }
      // need to special-case yo since it is not in sequence with the others
      var char_capyo = cap_yo.substr(2,4);
      var char_lowyo = low_yo.substr(2,4);
      document.write("<input type='hidden' name='char_" + char_capyo + "' value='&#" + char_capyo + ";'>\n");
      document.write("<input type='hidden' name='char_" + char_lowyo + "' value='&#" + char_lowyo + ";'>\n");
      document.write("</form>");

      var nextCharSpan = 0;

      function GetCharacter(c) {
        return document.convert["char_" + c.substr(2,4)].value;
      }

      function AtStart(i, text) {
        return ((i == 0) || (text.charAt(i-1) == ' '));
      }

      function AtEnd(i, text) {
        var ch = text.charAt(i).toUpperCase();
        while(i < text.length-1) {
          rv = text.charAt(i+1).toUpperCase();
          if (ch != rv) {
            break;
          }
          i++;
        }
        return ((i >= text.length-1) || (text.charAt(i+1) == ' '));
        // use >= instead of == above so that this works even if initially i exceeds allowable range
        // occurs when testing for following character being at end (see f case)
      }

      function PrevChar(i, text) {
        if (i==0) {
          return "";
        }
        return text.charAt(i-1).toUpperCase();
      }

      var nexCharSpan;

      function NextChar(i, text) {
        var ch = text.charAt(i).toUpperCase();
        var rv ="";
        nextCharSpan = 0;
        while(i < text.length-1) {
          nextCharSpan = nextCharSpan - (-1);
          rv = text.charAt(++i).toUpperCase();
          if (ch != rv) {
            break;
          }
        }
        return rv;
      }

      function TrueNextChar(i, text) {
        nextCharSpan = 1;
        if (i >= text.length) {
          return "";
        }
        return text.charAt(i+1).toUpperCase();
      }

      function EnglishVowel(letter) {
        return (letter == "A" | letter == "E" | letter == "I" | letter == "O" | letter == "U" | letter == "Y");
      }

      function DisplayRussian(dialect, text) {
/*
        var sephardic = dialect[0].checked;
        var ashkenazi = dialect[1].checked;
        var yiddish = dialect[2].checked;
*/
        var russianText = [''];
        var upper = true;
        for (var i=0; i<text.length; i++) {
          if (text.charAt(i) != "'" && text.charAt(i) != '"') {
            // note that for hard and soft we can't make the upper-case test so use case of previous letter
            upper = (text.charAt(i) == text.charAt(i).toUpperCase());
          }
          var englishLetter = text.charAt(i).toUpperCase();
          if (englishLetter == PrevChar(i, text)) {
            continue;
          }
          var russianLetter = '';
          if (englishLetter == 'A') {
            russianLetter = GetCharacter(upper ? cap_a : low_a) + "|" + GetCharacter(upper ? cap_e : low_e);
          } else if (englishLetter == 'B') {
            russianLetter = GetCharacter(upper ? cap_be : low_be);
          } else if (englishLetter == 'C') {
            if (!AtEnd(i, text)) {

              if ((NextChar(i, text) == 'A')) {
                russianLetter =
                  GetCharacter(upper ? cap_ka : low_ka) + GetCharacter(upper ? cap_a : low_a) + "|" +
                  GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_a : low_a);
                i += nextCharSpan;
              } else if ((NextChar(i, text) == 'O')) {
                russianLetter =
                  GetCharacter(upper ? cap_ka : low_ka) + GetCharacter(upper ? cap_o : low_o) + "|" +
                  GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_o : low_o);
                i += nextCharSpan;
              } else if ((NextChar(i, text) == 'E')) {
                russianLetter =
                  GetCharacter(upper ? cap_es : low_es) + "|" + GetCharacter(upper ? cap_tse : low_tse) + "|" +
                  GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_ye : low_ye) + "|" +
                  GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_e : low_e);
                i += nextCharSpan;
              } else if ((NextChar(i, text) == 'I') || (NextChar(i, text) == 'Y')) {
                russianLetter =
                  GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_yeru : low_yeru) + "|" +
                  GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_ee : low_ee) + "|" +
                  GetCharacter(upper ? cap_ka : low_ka) + GetCharacter(upper ? cap_ee : low_ee) + "|" +
                  GetCharacter(upper ? cap_che : low_che) + GetCharacter(upper ? cap_ee : low_ee);

/*
                russianLetter += // these are for eastern (e.g., Korean, Afganistan, Kirkgizstan, Kazahstan) only
                  GetCharacter(upper ? cap_ka : low_ka) + GetCharacter(upper ? cap_yeru : low_yeru);
                russianLetter += // these are for Bessarabian, Romanian, Hungarian, Galician, etc. only
                  GetCharacter(upper ? cap_che : low_che) + GetCharacter(upper ? cap_yeru : low_yeru);
*/
                i += nextCharSpan;
              } else if (NextChar(i, text) == 'H') {
                russianLetter = GetCharacter(upper ? cap_che : low_che) + "|" + GetCharacter(upper ? cap_kha : low_kha);
                i += nextCharSpan;
              } else if (NextChar(i, text) == 'Z') {
                russianLetter = GetCharacter(upper ? cap_che : low_che);
                i += nextCharSpan;


              } else if (NextChar(i, text) == 'U') {
                  russianLetter = 
                    GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_yeru : low_yeru) + "|" +
                    GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_u : low_u) + "|" +
                    GetCharacter(upper ? cap_ka : low_ka) + GetCharacter(upper ? cap_u : low_u) + "|" +
                    GetCharacter(upper ? cap_ka : low_ka) + GetCharacter(upper ? cap_yeru : low_yeru);
                i += nextCharSpan;

              } else {
                russianLetter = GetCharacter(upper ? cap_ka : low_ka);
                if (NextChar(i, text) == 'K') {
                  i += nextCharSpan;
                }
              }
            } else {
              russianLetter =
                GetCharacter(upper ? cap_ka : low_ka) + "|" + GetCharacter(upper ? cap_tse : low_tse);
            }
          } else if (englishLetter == 'D') {
            russianLetter = GetCharacter(upper ? cap_de : low_de);
          } else if (englishLetter == 'E') {
            if (!AtEnd(i, text) && (NextChar(i, text) == 'Y' || NextChar(i, text) == 'I')) {
              russianLetter =
                GetCharacter(upper ? cap_a : low_a) + GetCharacter(upper ? cap_ee : low_ee) + "|" +
                GetCharacter(upper ? cap_a : low_a) + GetCharacter(upper ? cap_i : low_i) + "|" +
                GetCharacter(upper ? cap_ye : low_ye) + GetCharacter(upper ? cap_i : low_i) + "|" +
                GetCharacter(upper ? cap_ye : low_ye) + GetCharacter(upper ? cap_ee : low_ee) + "|" +
                GetCharacter(upper ? cap_ee : low_ee) + "|" +
                GetCharacter(upper ? cap_e : low_e) + GetCharacter(upper ? cap_ee : low_ee);
              i += nextCharSpan;
            } else if (TrueNextChar(i, text) == 'E') {
              russianLetter =
                GetCharacter(upper ? cap_ee : low_ee) + "|" +
                GetCharacter(upper ? cap_ye : low_ye) + GetCharacter(upper ? cap_ye : low_ye);
              i += nextCharSpan;
            } else {
              if (!AtEnd(i, text)) {
                russianLetter =
                  GetCharacter(upper ? cap_ye : low_ye) + "|" + GetCharacter(upper ? cap_e : low_e);
              } else {
                russianLetter = "|" + GetCharacter(upper ? cap_ye : low_ye);
              }
            }
          } else if (englishLetter == 'F') {
            if (AtEnd(i+1, text) && TrueNextChar(i, text) == 'F') {
              russianLetter = GetCharacter(upper ? cap_ve : low_ve);
              i += nextCharSpan;
            } else {
              russianLetter = GetCharacter(upper ? cap_ef : low_ef);
            }
          } else if (englishLetter == 'G') {
            russianLetter = GetCharacter(upper ? cap_ge : low_ge); // what about G like in George???
            if (!AtEnd(i, text)) {
              if (NextChar(i, text) == 'H') {
                russianLetter = GetCharacter(upper ? cap_ge : low_ge); // what about G like in George???
                i += nextCharSpan;
              }
            }
          } else if (englishLetter == 'H') {
            russianLetter = GetCharacter(upper ? cap_ge : low_ge) + "|" + GetCharacter(upper ? cap_kha : low_kha); // no H in russian
          } else if (englishLetter == 'I') {
            if (!AtEnd(i, text) && (NextChar(i, text) == 'E')) {
              russianLetter =
                GetCharacter(upper ? cap_ee : low_ee) + "|" +
                GetCharacter(upper ? cap_ee : low_ee) + GetCharacter(upper ? cap_ye : low_ye);
              i += nextCharSpan;
            } else if (!AtEnd(i, text) && (NextChar(i, text) == 'A')) {
              russianLetter =
                GetCharacter(upper ? cap_ya : low_ya) + "|" +
                GetCharacter(upper ? cap_ee : low_ee) + GetCharacter(upper ? cap_a : low_a);
              i += nextCharSpan;
            } else if (!AtEnd(i, text) && (NextChar(i, text) == 'O')) {
              russianLetter =
                GetCharacter(upper ? cap_yo : low_yo) + "|" +
                GetCharacter(upper ? cap_ee : low_ee) + GetCharacter(upper ? cap_o : low_o);
              i += nextCharSpan;
            } else if (!AtEnd(i, text) && (NextChar(i, text) == 'U')) {
              russianLetter =
                GetCharacter(upper ? cap_yu : low_yu) + "|" +
                GetCharacter(upper ? cap_ee : low_ee) + GetCharacter(upper ? cap_u : low_u);
              i += nextCharSpan;
            } else if (!AtEnd(i, text) && AtEnd(i+1, text) && (NextChar(i, text) == 'J')) {
              russianLetter =
                GetCharacter(upper ? cap_ee : low_ee) + GetCharacter(upper ? cap_i : low_i);
              i += nextCharSpan;
            } else if (AtEnd(i, text) && !AtStart(i, text) && (!EnglishVowel(PrevChar(i, text)))) {
              russianLetter =
                GetCharacter(upper ? cap_ee : low_ee) + GetCharacter(upper ? cap_i : low_i);
            } else {
              russianLetter = GetCharacter(upper ? cap_ee : low_ee);
            }
          } else if (englishLetter == 'J') {
//            russianLetter = GetCharacter(upper ? cap_de : low_de) + GetCharacter(upper ? cap_zhe : low_zhe);
            if (!AtStart(i, text)) {
              if (AtEnd(i, text) && (!EnglishVowel(PrevChar(i, text)))) {
                russianLetter =
                  GetCharacter(upper ? cap_ee : low_ee) + GetCharacter(upper ? cap_i : low_i);
              } else {
                russianLetter =
                  GetCharacter(upper ? cap_i : low_i) + "|" + GetCharacter(upper ? cap_zhe : low_zhe);
              }
            } else if (NextChar(i, text) == 'A') {
              russianLetter =
                GetCharacter(upper ? cap_ya : low_ya) + "|" +
                GetCharacter(upper ? cap_zhe : low_zhe) + GetCharacter(upper ? cap_a : low_a);
              i += nextCharSpan;
            } else if (NextChar(i, text) == 'E') {
              russianLetter =
                GetCharacter(upper ? cap_ye : low_ye) + "|" +
                GetCharacter(upper ? cap_zhe : low_zhe) + GetCharacter(upper ? cap_ye : low_ye) + "|" +
                GetCharacter(upper ? cap_zhe : low_zhe) + GetCharacter(upper ? cap_e : low_e);
              i += nextCharSpan;
            } else if (NextChar(i, text) == 'O') {
              russianLetter =
                GetCharacter(upper ? cap_yo : low_yo) + "|" +
                GetCharacter(upper ? cap_zhe : low_zhe) + GetCharacter(upper ? cap_o : low_o);
              i += nextCharSpan;
            } else if (NextChar(i, text) == 'U') {
              russianLetter =
                GetCharacter(upper ? cap_yu : low_yu) + "|" +
                GetCharacter(upper ? cap_zhe : low_zhe) + GetCharacter(upper ? cap_u : low_u);
              i += nextCharSpan;
            } else {
              russianLetter = GetCharacter(upper ? cap_zhe : low_zhe);
            }
          } else if (englishLetter == 'K') {
            if (!AtEnd(i, text) && (NextChar(i, text) == 'H')) {
              russianLetter =
                GetCharacter(upper ? cap_kha : low_kha) + "|" +
                GetCharacter(upper ? cap_ka : low_ka) + GetCharacter(upper ? cap_kha : low_kha);
              i += nextCharSpan;
            } else {
              russianLetter = GetCharacter(upper ? cap_ka : low_ka);
            }
          } else if (englishLetter == 'L') {
            russianLetter = GetCharacter(upper ? cap_el : low_el);
          } else if (englishLetter == 'M') {
            russianLetter = GetCharacter(upper ? cap_em : low_em);
          } else if (englishLetter == 'N') {
            russianLetter = GetCharacter(upper ? cap_en : low_en);
          } else if (englishLetter == 'O') {
            if (!AtEnd(i, text) && (NextChar(i, text) == 'O')) {
              russianLetter =
                GetCharacter(upper ? cap_u : low_u) + "|" +
                GetCharacter(upper ? cap_o : low_o) + "|" + GetCharacter(upper ? cap_o : low_o);
              i += nextCharSpan;
            } else {
              russianLetter = GetCharacter(upper ? cap_o : low_o);
              if (!AtEnd(i, text) && (NextChar(i, text) == 'I' || NextChar(i, text) == 'Y')) {
                russianLetter = GetCharacter(upper ? cap_o : low_o) + GetCharacter(upper ? cap_i : low_i);
                if (NextChar(i, text) == "I") {
                  russianLetter = GetCharacter(upper ? cap_o : low_o) + GetCharacter(upper ? cap_ee : low_ee);
                }
                i += nextCharSpan;
              }
            }
          } else if (englishLetter == 'P') {
            russianLetter = GetCharacter(upper ? cap_pe : low_pe);
            if (!AtEnd(i, text) && NextChar(i, text) == 'H') {
              russianLetter = GetCharacter(upper ? cap_ef : low_ef);
              i += nextCharSpan;
            }
          } else if (englishLetter == 'Q') {
            russianLetter =
              GetCharacter(upper ? cap_ka : low_ka) + GetCharacter(upper ? cap_ve : low_ve) + "|" +
              GetCharacter(upper ? cap_ka : low_ka);
          } else if (englishLetter == 'R') {
            russianLetter = GetCharacter(upper ? cap_er : low_er);
          } else if (englishLetter == 'S') {
            if (!AtEnd(i, text)) {
              if (TrueNextChar(i, text) == 'S') {
                russianLetter =
                  GetCharacter(upper ? cap_es : low_es) + "|" +
                  GetCharacter(upper ? cap_es : low_es) + GetCharacter(upper ? cap_es : low_es);
                i += nextCharSpan;
              } else if (NextChar(i, text) == 'Z') {
                russianLetter =
                  GetCharacter(upper ? cap_sha : low_sha) + "|" + GetCharacter(upper ? cap_zhe : low_zhe);
              } else if (NextChar(i, text) == 'H') {
                russianLetter = GetCharacter(upper ? cap_sha : low_sha);
                if (text.substr(i,4).toUpperCase() == "SHCH") {
                  russianLetter = GetCharacter(upper ? cap_shcha : low_shcha);
                  i += 3;
                } else {
                  i += nextCharSpan;
                }
              } else if (NextChar(i, text) == 'C') {
                russianLetter =
                  GetCharacter(upper ? cap_es : low_es) + "|" + GetCharacter(upper ? cap_tse : low_tse);
                if (text.substr(i,3).toUpperCase() == "SCH") {
                  russianLetter =
                    GetCharacter(upper ? cap_shcha : low_shcha) + "|" +
                    GetCharacter(upper ? cap_sha : low_sha) + "|" +
                    GetCharacter(upper ? cap_es : low_es) + GetCharacter(upper ? cap_che : low_che);
                  i += 2;
                }
              } else {
                russianLetter = GetCharacter(upper ? cap_es : low_es) + "|" + GetCharacter(upper ? cap_ze : low_ze);
              }
            } else {
              russianLetter = GetCharacter(upper ? cap_es : low_es) + "|" + GetCharacter(upper ? cap_ze : low_ze);
            }
          } else if (englishLetter == 'T') {
            if (!AtEnd(i, text)) {
              if ((NextChar(i, text) == 'H')) {
                russianLetter = GetCharacter(upper ? cap_te : low_te);
                i += nextCharSpan;
              } else if (NextChar(i, text) == 'C') {
                if (text.substr(i+2,1).toUpperCase() == "I" || text.substr(i+2,1).toUpperCase() == "Y") {
                  if (AtStart(i, text)) {
                    russianLetter =
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_ee : low_ee) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_yeru : low_yeru) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_ka : low_ka) + GetCharacter(upper ? cap_ee : low_ee) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_che : low_che) + GetCharacter(upper ? cap_yeru : low_yeru);
                  } else {
                    russianLetter =
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_ka : low_ka) + GetCharacter(upper ? cap_ee : low_ee) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_che : low_che) + GetCharacter(upper ? cap_yeru : low_yeru) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_ee : low_ee) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_yeru : low_yeru);
                  }
                  i += 2;
                } else if (text.substr(i+2,1).toUpperCase() == "U") {
                  if (AtStart(i, text)) {
                    russianLetter = 
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_u : low_u) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_yeru : low_yeru) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_ka : low_ka) + GetCharacter(upper ? cap_u : low_u) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_che : low_che) + GetCharacter(upper ? cap_u : low_u);
                  } else {
                    russianLetter = 
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_ka : low_ka) + GetCharacter(upper ? cap_u : low_u) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_che : low_che) + GetCharacter(upper ? cap_u : low_u) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_u : low_u) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_yeru : low_yeru);
                  }
                  // te + ka + yeru is possible but very rare so not being mentioned here
                  i += 2;
//                } else if (AtEnd(i+1, text)) {
                } else {
                  russianLetter = GetCharacter(upper ? cap_tse : low_tse) + "|" +
                                  GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_tse : low_tse) + "|" +
                                  GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_ze : low_ze);
                  i += nextCharSpan;
/*
                } else {
                  russianLetter = GetCharacter(upper ? cap_tse : low_tse);
                  i += nextCharSpan;
*/
                }
              } else if (NextChar(i, text) == 'S') {
                if (text.substr(i+2,1).toUpperCase() == "I" || text.substr(i+2,1).toUpperCase() == "Y") {
                  if (AtStart(i, text)) {
                    russianLetter =
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_ee : low_ee) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_yeru : low_yeru) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_es : low_es) + GetCharacter(upper ? cap_ee : low_ee) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_es : low_es) + GetCharacter(upper ? cap_yeru : low_yeru);
                  } else {
                    russianLetter =
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_es : low_es) + GetCharacter(upper ? cap_ee : low_ee) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_es : low_es) + GetCharacter(upper ? cap_yeru : low_yeru) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_ee : low_ee) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_yeru : low_yeru);
                  }
                  i += 2;
                } else if (text.substr(i+2,1).toUpperCase() == "U") {
                  if (AtStart(i, text)) {
                    russianLetter = 
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_u : low_u) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_yeru : low_yeru) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_es : low_es) + GetCharacter(upper ? cap_u : low_u) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_es : low_es) + GetCharacter(upper ? cap_yeru : low_yeru);
                  } else {
                    russianLetter = 
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_es : low_es) + GetCharacter(upper ? cap_u : low_u) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_es : low_es) + GetCharacter(upper ? cap_yeru : low_yeru) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_u : low_u) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_yeru : low_yeru);
                  }
                  i += 2;
//                } else if (AtEnd(i+1, text)) {
                } else {
                  russianLetter = GetCharacter(upper ? cap_tse : low_tse) + "|" +
                                  GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_tse : low_tse) + "|" +
                                  GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_ze : low_ze);
                  i += nextCharSpan;
/*
                } else {
                  russianLetter = GetCharacter(upper ? cap_tse : low_tse);
                  i += nextCharSpan;
*/
                }
              } else if (NextChar(i, text) == 'Z') {
                if (text.substr(i+2,1).toUpperCase() == "I" || text.substr(i+2,1).toUpperCase() == "Y") {
                  if (AtStart(i, text)) {
                    russianLetter =
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_ee : low_ee) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_yeru : low_yeru) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_ze : low_ze) + GetCharacter(upper ? cap_ee : low_ee) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_ze : low_ze) + GetCharacter(upper ? cap_yeru : low_yeru);
                  } else {
                    russianLetter = 
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_ze : low_ze) + GetCharacter(upper ? cap_ee : low_ee) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_ze : low_ze) + GetCharacter(upper ? cap_yeru : low_yeru) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_ee : low_ee) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_yeru : low_yeru);
                  }
                  i += 2;
                } else if (text.substr(i+2,1).toUpperCase() == "U") {
                  if (AtStart(i, text)) {
                    russianLetter = 
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_u : low_u) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_yeru : low_yeru) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_ze : low_ze) + GetCharacter(upper ? cap_u : low_u) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_ze : low_ze) + GetCharacter(upper ? cap_yeru : low_yeru);
                  } else {
                    russianLetter = 
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_ze : low_ze) + GetCharacter(upper ? cap_u : low_u) + "|" +
                      GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_ze : low_ze) + GetCharacter(upper ? cap_yeru : low_yeru) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_u : low_u) + "|" +
                      GetCharacter(upper ? cap_tse : low_tse) + GetCharacter(upper ? cap_yeru : low_yeru);
                  }
                  i += 2;
//                } else if (AtEnd(i+1, text)) {
                } else {
                  russianLetter = GetCharacter(upper ? cap_tse : low_tse) + "|" +
                                  GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_tse : low_tse) + "|" +
                                  GetCharacter(upper ? cap_te : low_te) + GetCharacter(upper ? cap_ze : low_ze);
                  if (AtEnd(i+1, text)) { // treat names like Rabinowitz which should really by ich
                    russianLetter += "|" + GetCharacter(upper ? cap_che : low_che);
                  }
                  i += nextCharSpan;
/*
                } else {
                  russianLetter = GetCharacter(upper ? cap_tse : low_tse);
                  i += nextCharSpan;
*/
                }
              } else {
                russianLetter = GetCharacter(upper ? cap_te : low_te);
              }
            } else {
              russianLetter = GetCharacter(upper ? cap_te : low_te);
            }
          } else if (englishLetter == 'U') {
            russianLetter = GetCharacter(upper ? cap_u : low_u) + "|" + GetCharacter(upper ? cap_yu : low_yu);
          } else if (englishLetter == 'V') {
            russianLetter = GetCharacter(upper ? cap_ve : low_ve);
          } else if (englishLetter == 'W') {
            russianLetter = GetCharacter(upper ? cap_ve : low_ve);
          } else if (englishLetter == 'X') {
            russianLetter = GetCharacter(upper ? cap_ka : low_ka) + GetCharacter(upper ? cap_es : low_es);
          } else if (englishLetter == 'Y') {
            if (AtEnd(i, text) && !AtStart(i, text) && (!EnglishVowel(PrevChar(i, text)))) {
              russianLetter =
                GetCharacter(upper ? cap_ee : low_ee) + GetCharacter(upper ? cap_i : low_i);
            } else if (NextChar(i, text) == 'A') {
              russianLetter =
                GetCharacter(upper ? cap_ya : low_ya) + "|" +
                GetCharacter(upper ? cap_ee : low_ee) + GetCharacter(upper ? cap_a : low_a);
              i += nextCharSpan;
            } else if (NextChar(i, text) == 'E') {
              russianLetter =
                GetCharacter(upper ? cap_ye : low_ye) + "|" +
                GetCharacter(upper ? cap_ee : low_ee) + GetCharacter(upper ? cap_ye : low_ye);
              i += nextCharSpan;
            } else if (NextChar(i, text) == 'O') {
              russianLetter =
                GetCharacter(upper ? cap_yo : low_yo) + "|" +
                GetCharacter(upper ? cap_ee : low_ee) + GetCharacter(upper ? cap_o : low_o);
              i += nextCharSpan;
            } else if (NextChar(i, text) == 'U') {
              russianLetter =
                GetCharacter(upper ? cap_yu : low_yu) + "|" +
                GetCharacter(upper ? cap_ee : low_ee) + GetCharacter(upper ? cap_yu : low_yu);
              i += nextCharSpan;
            } else {
              if (!AtStart(i, text) && EnglishVowel(PrevChar(i, text))) {
                russianLetter =
                  GetCharacter(upper ? cap_i : low_i) + "|" + GetCharacter(upper ? cap_ee : low_ee);
              } else {
                russianLetter = GetCharacter(upper ? cap_ee : low_ee);
              }
            }
          } else if (englishLetter == 'Z') {
            if (!AtEnd(i, text) && NextChar(i, text) == 'H') {
              russianLetter = GetCharacter(upper ? cap_zhe : low_zhe);
              i += nextCharSpan;
            } else {
              russianLetter =
                GetCharacter(upper ? cap_ze : low_ze) + "|" + GetCharacter(upper ? cap_zhe : low_zhe);
            }
          } else if (englishLetter == '"') {
            if (AtStart(i, text) || EnglishVowel(PrevChar(i, text))) {
              continue;
            } else {
              russianLetter = GetCharacter(upper ? cap_hard : low_hard);
            }
          } else if (englishLetter == "'") {
            if (AtStart(i, text) || EnglishVowel(PrevChar(i, text))) {
              continue;
            } else {
              russianLetter = GetCharacter(upper ? cap_soft : low_soft);
            }
          } else if (englishLetter == "*") {
            if (AtStart(i, text)) {
              continue;
            } else {
              russianLetter = GetCharacter(low_yeru); // yeru never appears at the start of a word
            }
          } else if (englishLetter == ' ') {
            upper = true; // so hard and soft at start of next word will come out uppercase
            // actually hard and soft can never occur at start, but this is harmless anyway
            russianLetter = ' ';
          }

//alert(i + ": " +russianLetter);

          var russianLetterArray = russianLetter.split('|');
          letterCount = russianLetterArray.length;
          wordCount = russianText.length;
          for (var letterIndex=1; letterIndex<letterCount; letterIndex++) {
            for (var wordIndex=0; wordIndex<wordCount; wordIndex++) {
              russianText[letterIndex*wordCount + wordIndex] = russianText[wordIndex];
            }
          }
          for (var letterIndex=0; letterIndex<letterCount; letterIndex++) {
            for (var wordIndex=0; wordIndex<wordCount; wordIndex++) {
              russianText[letterIndex*wordCount + wordIndex] += russianLetterArray[letterIndex];
            }
          }
        }
//alert(russianText.join(', '));
//document.write("<scr"+"ipt>myform.russian.value='"+russianText.join(', ')+"';</scr"+"ipt>");

        return russianText.join(', ');
      }

      function Init(dialect, text) {
        DisplayRussian(dialect, text);
      }

