      var sounds = [ // starting at charsetBase
        "",
        "A", "A", "I", "I", "U", "U", "E", "E", "O", "O",
        "Ka", "Ga", "Ki", "Gi", "Ku", "Gu", "Ke", "Ge", "Ko", "Go",
        "Sa", "Za", "Shi", "Ji", "Su", "Zu", "Se", "Ze", "So", "Zo",
        "Ta", "Da", "Chi", "Ji", "Tsu", "Tsu", "Du", "Te", "De", "To", "Do",
        "Na", "Ni", "Nu", "Ne", "No",
        "Ha", "Ba", "Pa", "Hi", "Bi", "Pi", "Fu", "Bu", "Pu", "He", "Be", "Pe", "Ho", "Bo", "Po",
        "Ma", "Mi", "Mu", "Me", "Mo",
        "", "Ya", "", "Yu", "", "Yo", 
        "Ra", "Ri", "Ru", "Re", "Ro",
        "Wa", "WA", "I", "E", "O",
        "N",
        "Vu",
        "?", "?", "?", "?", "?", "?", " ", "-", "", ""
      ];


      function EndsWith(text, suffix) {
        if ((text.length >= suffix.length) &&
            (text.substr(text.length-suffix.length) == suffix)) {
          return true;
        } else {
          return false;
        }
/* don't know why this doesn't work
        return
          ((text.length >= suffix.length) &&
           (text.substr(text.length-suffix.length) == suffix));
*/
      }

      function isLowerCase(ch) {
        return (ch >= "a" && ch <= "z");
      }

      function RemoveLast(text) {
        // Every syllable starts with upper case and is followed by all lower case
        var result = text;

        // get rid of lowercase part of syllable
        while (result.length > 0 &&
                isLowerCase(result.charAt(result.length-1))) {
          result = result.substr(0, result.length-1);
        }

        // get rid of uppercase letter at start of syllable
        if (result.length > 0) {
          result = result.substr(0, result.length-1);
        }

        return result;
      }

      function RepeatLast(text, voiced) {

        // get to start of last syllable

        var start = text.length;
        while (start > 0 && isLowerCase(text.charAt(start-1))) {
          start--;
        }
        if (start > 0) {
          start--;
        }
        var syllable = text.substr(start);

        // handle voiced/unvoiced

        if (voiced) {

          if (syllable == "Ka") {
            syllable = "Ga";
          } else if (syllable == "Ki") {
            syllable = "Gi";
          } else if (syllable == "Ku") {
            syllable = "Gu";
          } else if (syllable == "Ke") {
            syllable = "Ge";
          } else if (syllable == "Ko") {
            syllable = "Go";
	
          } else if (syllable == "Sa") {
            syllable = "Za";
          } else if (syllable == "Shi") {
            syllable = "Ji";
          } else if (syllable == "Su") {
            syllable = "Zu";
          } else if (syllable == "Se") {
            syllable = "Ze";
          } else if (syllable == "So") {
            syllable = "Zo";
	
          } else if (syllable == "Ta") {
            syllable = "Da";
          } else if (syllable == "Chi") {
            syllable = "Ji";
          } else if (syllable == "Tsu") {
            syllable = "Du";
          } else if (syllable == "Te") {
            syllable = "De";
          } else if (syllable == "To") {
            syllable = "Do";
	
          } else if (syllable == "Ha") {
            syllable = "Ba";
          } else if (syllable == "Hi") {
            syllable = "Bi";
          } else if (syllable == "Fu") {
            syllable = "Bu";
          } else if (syllable == "He") {
            syllable = "Be";
          } else if (syllable == "Ho") {
            syllable = "Bo";
	        }

	      } else {

          if (syllable == "Ga") {
            syllable = "Ka";
          } else if (syllable == "Gi") {
            syllable = "Ki";
          } else if (syllable == "Gu") {
            syllable = "Ku";
          } else if (syllable == "Ge") {
            syllable = "Ke";
          } else if (syllable == "Go") {
            syllable = "Ko";
	
          } else if (syllable == "Za") {
            syllable = "Sa";
          } else if (syllable == "Ji") {
            syllable = "Shi";
          } else if (syllable == "Zu") {
            syllable = "Su";
          } else if (syllable == "Ze") {
            syllable = "Se";
          } else if (syllable == "Zo") {
            syllable = "So";
	
          } else if (syllable == "Da") {
            syllable = "Ta";
          } else if (syllable == "Fi") {
            syllable = "Chi";
          } else if (syllable == "Du") {
            syllable = "Tsu";
          } else if (syllable == "De") {
            syllable = "Te";
          } else if (syllable == "Do") {
            syllable = "To";
	
          } else if (syllable == "Ba") {
            syllable = "Ha";
          } else if (syllable == "Bi") {
            syllable = "Hi";
          } else if (syllable == "Bu") {
            syllable = "Fu";
          } else if (syllable == "Be") {
            syllable = "He";
          } else if (syllable == "Bo") {
            syllable = "Ho";
	        }

        }

        return text+syllable;
      }

      function DisplayEnglish(dialect, text) {
//        dialect 0 = 16-bit unicode
//        dialect 1 = &# notation for unicode

        var base;
        var result = "";
        var englishLetter;

        for (var i=0; i<text.length; i++) {
          var charCode = 0;
          var lowerCase = false;

          if (text.charAt(i) == " ") {
            result += " ";
            continue;
          } else if (dialect == 0) { // charcode is the code value of the unicode character
            charCode = text.charCodeAt(i);
          } else if (text.substr(i,2) != "&#") {
            result += text.charAt(i);
            continue;  
          } else { // charcode is found inside the &# notation
            i += 2;
            while (true) {
              var c = text.substr(i,1);
              if (c == ";") {
                break;
              }
              charCode = 10*charCode + (c-'0');
              i++;
            }
          }

          base = 0;
          if (charCode >= 12352 && charCode <= 12447) { // katakana
            base = 12352;
          } else if (charCode >= 12448 && charCode <= 12543) { // hiragana
            base = 12448;
          }
          if (base != 0) {
            var japaneseLetter = "&#" + charCode + ";";

            // modify preceding sound if current letter is 12515, 12517, or 12519

            var oldresult = result; // so we can see if a change was made

            if (charCode-base == 67) { // &#12515
              if (EndsWith(result, "Ki")) {
                result = RemoveLast(result) + "Kya";
              } else if (EndsWith(result, "Shi")) {
                result = RemoveLast(result) + "Sha";
              } else if (EndsWith(result, "Chi")) {
                result = RemoveLast(result) + "Cha";
              } else if (EndsWith(result, "Ni")) {
                result = RemoveLast(result) + "Nya";
              } else if (EndsWith(result, "Hi")) {
                result = RemoveLast(result) + "Hya";
              } else if (EndsWith(result, "Mi")) {
                result = RemoveLast(result) + "Mya";
              } else if (EndsWith(result, "Ri")) {
                result = RemoveLast(result) + "Rya";

              } else if (EndsWith(result, "Gi")) {
                result = RemoveLast(result) + "Gya";
              } else if (EndsWith(result, "Ji")) {
                result = RemoveLast(result) + "Ja";
              } else if (EndsWith(result, "Ji")) { // redundant ??
                result = RemoveLast(result) + "Ja";
              } else if (EndsWith(result, "Bi")) {
                result = RemoveLast(result) + "Bya";
              } else if (EndsWith(result, "Pi")) {
                result = RemoveLast(result) + "Pya";
              }

            } else if (charCode-base == 69) { // &#12517
              if (EndsWith(result, "Ki")) {
                result = RemoveLast(result) + "Kyu";
              } else if (EndsWith(result, "Shi")) {
                result = RemoveLast(result) + "Shu";
              } else if (EndsWith(result, "Chi")) {
                result = RemoveLast(result) + "Chu";
              } else if (EndsWith(result, "Ni")) {
                result = RemoveLast(result) + "Nyu";
              } else if (EndsWith(result, "Hi")) {
                result = RemoveLast(result) + "Hyu";
              } else if (EndsWith(result, "Mi")) {
                result = RemoveLast(result) + "Myu";
              } else if (EndsWith(result, "Ri")) {
                result = RemoveLast(result) + "Ryu";

              } else if (EndsWith(result, "Gi")) {
                result = RemoveLast(result) + "Gyu";
              } else if (EndsWith(result, "Ji")) {
                result = RemoveLast(result) + "Ju";
              } else if (EndsWith(result, "Ji")) { // redundant ??
                result = RemoveLast(result) + "Ju";
              } else if (EndsWith(result, "Bi")) {
                result = RemoveLast(result) + "Byu";
              } else if (EndsWith(result, "Pi")) {
                result = RemoveLast(result) + "Pyu";
              }

            } else if (charCode-base == 71) { // &#12519
              if (EndsWith(result, "Ki")) {
                result = RemoveLast(result) + "Kyo";
              } else if (EndsWith(result, "Shi")) {
                result = RemoveLast(result) + "Sho";
              } else if (EndsWith(result, "Chi")) {
                result = RemoveLast(result) + "Cho";
              } else if (EndsWith(result, "Ni")) {
                result = RemoveLast(result) + "Nyo";
              } else if (EndsWith(result, "Hi")) {
                result = RemoveLast(result) + "Hyo";
              } else if (EndsWith(result, "Mi")) {
                result = RemoveLast(result) + "Myo";
              } else if (EndsWith(result, "Ri")) {
                result = RemoveLast(result) + "Ryo";

              } else if (EndsWith(result, "Gi")) {
                result = RemoveLast(result) + "Gyo";
              } else if (EndsWith(result, "Ji")) {
                result = RemoveLast(result) + "Jo";
              } else if (EndsWith(result, "Ji")) { // redundant ??
                result = RemoveLast(result) + "Jo";
              } else if (EndsWith(result, "Bi")) {
                result = RemoveLast(result) + "Byo";
              } else if (EndsWith(result, "Pi")) {
                result = RemoveLast(result) + "Pyo";
              }

            // new sound if current letter is 12449, 12451, 12453, 12455, or 12457

            } else if (charCode-base == 1) { // &#12449
              if (EndsWith(result, "Vu")) {
                result = RemoveLast(result) + "Va";
              } else if (EndsWith(result, "Fu")) {
                result = RemoveLast(result) + "Fa";
              }

            } else if (charCode-base == 3) { // &#12451
              if (EndsWith(result, "Vu")) {
                result = RemoveLast(result) + "Vi";
              } else if (EndsWith(result, "U")) {
                result = RemoveLast(result) + "Wi";
              } else if (EndsWith(result, "Fu")) {
                result = RemoveLast(result) + "Fi";
              } else if (EndsWith(result, "De")) {
                result = RemoveLast(result) + "Di";
              } else if (EndsWith(result, "Te")) {
                result = RemoveLast(result) + "Ti";
              }

            } else if (charCode-base == 5) { // &#12453
              if (EndsWith(result, "Do")) {
                result = RemoveLast(result) + "Du";
              } else if (EndsWith(result, "To")) {
                result = RemoveLast(result) + "Tu";
              }

            } else if (charCode-base == 7) { // &#12455
              if (EndsWith(result, "Vu")) {
                result = RemoveLast(result) + "Ve";
              } else if (EndsWith(result, "U")) {
                result = RemoveLast(result) + "We";
              } else if (EndsWith(result, "Fu")) {
                result = RemoveLast(result) + "Fe";
              } else if (EndsWith(result, "Chi")) {
                result = RemoveLast(result) + "Che";
              } else if (EndsWith(result, "Ji")) {
                result = RemoveLast(result) + "Je";
              } else if (EndsWith(result, "Shi")) {
                result = RemoveLast(result) + "She";
              }

            } else if (charCode-base == 9) { // &#12457
              if (EndsWith(result, "Vu")) {
                result = RemoveLast(result) + "Vo";
              } else if (EndsWith(result, "U")) {
                result = RemoveLast(result) + "Wo";
              } else if (EndsWith(result, "Fu")) {
                result = RemoveLast(result) + "Fo";
              }

            // repeat last syllable if current letter is 12541 or 12542

            } else if (charCode-base == 93) { // &#12541
              result = RepeatLast(result, false); // repeat unvoiced
            } else if (charCode-base == 94) { // &#12542
              result = RepeatLast(result, true); // repeat voiced

            }
            if (result == oldresult) { // no change was made above
              englishLetter = sounds[charCode-base];
              result += englishLetter;
            }
          }
        }
        return result;
      }
