      function isAlphaNumeric(c) {
        return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')
      }

      function AtStart(i, text) {
        return ((i == 0) || !isAlphaNumeric(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) || !isAlphaNumeric(text.charAt(i+1)));
      }

      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 DisplayHebrew(dialect, text) {
        var sephardic = dialect[0].checked;
        var ashkenazi = dialect[1].checked;
        var yiddish = dialect[2].checked;
        var hebrewText = [''];
        for (var i=0; i<text.length; i++) {
          var englishLetter = text.charAt(i).toUpperCase();
          if (englishLetter == PrevChar(i, text)) {
            continue;
          }
          var hebrewLetter = '';
          if (englishLetter == 'A') {
            if (!AtEnd(i, text) && (NextChar(i, text) == 'Y' || NextChar(i, text) == 'I')) {
              if (AtStart(i, text)) {
                hebrewLetter = ALEF + YUD + YUD;
              } else {
                hebrewLetter = YUD + YUD;
              }
              i += nextCharSpan;
            } else if (yiddish) {
              hebrewLetter = ALEF;
            } else if (AtEnd(i, text)) {
              hebrewLetter = HAY;
            } else if (AtStart(i, text)) {
              hebrewLetter = ALEF + '|' + AYIN;
            } else {
              continue;
            }
          } else if (englishLetter == 'B') {
            hebrewLetter = BAIS;
          } else if (englishLetter == 'C') {
            if (!AtEnd(i, text)) {
              if ((NextChar(i, text) == 'E') || (NextChar(i, text) == 'I') || (NextChar(i, text) == 'Y')) {
                hebrewLetter = SAMEKH;
                if (!yiddish) {
                  hebrewLetter = hebrewLetter + "|" + SHIN;
                }
                i += nextCharSpan;
              } else if (NextChar(i, text) == 'H') {
                if (yiddish) {
                  hebrewLetter = KAF + "|" + TESS + SHIN;
                } else {
                  hebrewLetter = TSADI + QUOTE + "|" + KAF + "|" + KHESS;
                }
                i += nextCharSpan;
              } else {
                hebrewLetter = KUF + "|" + KAF;
                if (NextChar(i, text) == 'K') {
                  i += nextCharSpan;
                }
              }
            } else {
              hebrewLetter = KUF;
            }
          } else if (englishLetter == 'D') {
            hebrewLetter = DALET;
          } else if (englishLetter == 'E') {
            if (!AtEnd(i, text) && (NextChar(i, text) == 'Y' || NextChar(i, text) == 'I')) {
              if (AtStart(i, text)) {
                hebrewLetter = ALEF + YUD + YUD;
              } else {
                hebrewLetter = YUD + YUD + "|" + YUD;
              }
              i += nextCharSpan;
            } else if (AtStart(i, text)) {
              if (yiddish) {
                hebrewLetter = AYIN;
              } else {
                hebrewLetter = ALEF;
              }
            } else if (!AtEnd(i, text) && TrueNextChar(i, text) == 'E') {
              hebrewLetter = YUD + YUD + "|" + YUD;
              i += nextCharSpan;
            } else {
              if (yiddish && !AtEnd(i, text)) {
                hebrewLetter = AYIN;
              } else {
                continue;
              }
            }
          } else if (englishLetter == 'F') {
            hebrewLetter = PAY;
          } else if (englishLetter == 'G') {
            hebrewLetter = GIMEL; // what about G like in George???
          } else if (englishLetter == 'H') {
            hebrewLetter = HAY;
          } else if (englishLetter == 'I') {
            if (!AtEnd(i, text) && (NextChar(i, text) == 'E')) {
              if (AtStart(i, text)) {
                hebrewLetter = ALEF + YUD + YUD;
              } else {
                hebrewLetter = YUD + YUD + "|" + YUD;
              }
              i += nextCharSpan;
            } else {
              if (yiddish) {
                hebrewLetter = YUD;
              } else {
                hebrewLetter = YUD + "|" + "";
              }
            }
          } else if (englishLetter == 'J') {
            if (yiddish) {
              hebrewLetter = DALET + ZAYIN;
            } else {
              hebrewLetter = GIMEL + QUOTE;
            }
          } else if (englishLetter == 'K') {
            if (!AtEnd(i, text) && NextChar(i, text) == 'H') {
              if (yiddish) {
                hebrewLetter = KAF;
              } else {
                hebrewLetter = KAF + "|" + KHESS;
              }
              i += nextCharSpan;
            } else {
              hebrewLetter = KUF + (!AtEnd(i, text) ? ("|" +KAF) : "");
            }
          } else if (englishLetter == 'L') {
            hebrewLetter = LAMED;
          } else if (englishLetter == 'M') {
            hebrewLetter = MEM;
          } else if (englishLetter == 'N') {
            hebrewLetter = NUN;
          } else if (englishLetter == 'O') {
            if (AtStart(i, text)) {
              hebrewLetter = ALEF + VAV;
            } else {
              hebrewLetter = VAV;
            }
            if (!AtEnd(i, text) && (NextChar(i, text) == 'I' || NextChar(i, text) == 'Y')) {
              hebrewLetter = hebrewLetter + YUD;
              i += nextCharSpan;
            }
          } else if (englishLetter == 'P') {
            hebrewLetter = PAY;
            if (!AtEnd(i, text) && NextChar(i, text) == 'H') {
              i += nextCharSpan;
            }
          } else if (englishLetter == 'Q') {
            hebrewLetter = KUF;
          } else if (englishLetter == 'R') {
            hebrewLetter = RAISH;
          } else if (englishLetter == 'S') {
            if (!AtEnd(i, text)) {
              if (TrueNextChar(i, text) == 'S') {
                if (yiddish) {
                  hebrewLetter = SAMEKH;
                } else {
                  hebrewLetter = SHIN;
                }
                i += nextCharSpan;
              } else if (NextChar(i, text) == 'Z' || NextChar(i, text) == 'H') {
                hebrewLetter = SHIN;
                i += nextCharSpan;
              } else if (NextChar(i, text) == 'T' && !yiddish) {
                hebrewLetter = SHIN + TESS;
                i += nextCharSpan;
              } else {
                hebrewLetter = SAMEKH;
                if (!yiddish) {
                  hebrewLetter = hebrewLetter + "|" + SHIN;
                }
                if (ashkenazi) {
                  hebrewLetter = hebrewLetter + "|" + TAF;
                }
              }
            } else {
              hebrewLetter = SAMEKH;
              if (!yiddish) {
                hebrewLetter = hebrewLetter + "|" + SHIN;
              }
              if (ashkenazi) {
                hebrewLetter = hebrewLetter + "|" + TAF;
              }
            }
          } else if (englishLetter == 'T') {
            if (!AtEnd(i, text) && (NextChar(i, text) == 'S' || NextChar(i, text) == 'Z')) {
              hebrewLetter = (AtEnd(i+1, text) ? TSADI2 : TSADI);
              i += nextCharSpan;
            } else if (!AtEnd(i, text) && (NextChar(i, text) == 'C') &&
                       !AtEnd(i+1, text) && (NextChar(i+1, text)) == 'H') {
              // do nothing (TCH is same as CH
            } else if (yiddish) {
              hebrewLetter = TESS;
            } else {
              hebrewLetter = (AtEnd(i, text) ? (TESS + "|" + TAF) : TESS);
            }
          } else if (englishLetter == 'U') {
            if (AtStart(i, text)) {
              hebrewLetter = ALEF + VAV;
            } else {
              hebrewLetter = VAV;
            }
          } else if (englishLetter == 'V') {
            if (yiddish) {
              hebrewLetter = VAV + VAV;
            } else {
              hebrewLetter = BAIS + "|" + VAV;
            }
          } else if (englishLetter == 'W') {
            hebrewLetter = VAV + VAV;
            if (yiddish) {
              hebrewLetter = VAV + VAV;
            } else {
              hebrewLetter = VAV + VAV + "|" + VAV;
          }
          } else if (englishLetter == 'X') {
            hebrewLetter = KUF + SAMEKH;
          } else if (englishLetter == 'Y') {
            hebrewLetter = YUD;
          } else if (englishLetter == 'Z') {
            hebrewLetter = ZAYIN;
          } else if (englishLetter >= "0" && englishLetter <= "9") {
            hebrewLetter = englishLetter;
          } else {
            hebrewLetter = ' ';
          }
//alert(i + ": " +hebrewLetter);

          var hebrewLetterArray = hebrewLetter.split('|');
          letterCount = hebrewLetterArray.length;
          wordCount = hebrewText.length;
          for (var letterIndex=1; letterIndex<letterCount; letterIndex++) {
            for (var wordIndex=0; wordIndex<wordCount; wordIndex++) {
              hebrewText[letterIndex*wordCount + wordIndex] = hebrewText[wordIndex];
            }
          }
          for (var letterIndex=0; letterIndex<letterCount; letterIndex++) {
            for (var wordIndex=0; wordIndex<wordCount; wordIndex++) {
              hebrewText[letterIndex*wordCount + wordIndex] += hebrewLetterArray[letterIndex];
            }
          }
        }

        // change last character of each word to the suffit form
        for (var x=0; x<hebrewText.length; x++) {

          for (len=0; len<=hebrewText[x].length; len++) {
            if (len==hebrewText[x].length || (hebrewText[x].charAt(len) == ' ')) {
              lastChar = (len<1) ? "" : hebrewText[x].charAt(len-1);
              nextToLastChar = (len<2) ? "" : hebrewText[x].charAt(len-2);
              var change = false;
              if (lastChar == KAF) {
                lastChar = KHAF2;
                change = true;
              } else if (lastChar == MEM) {
                lastChar = MEM2;
                change = true;
              } else if (lastChar == NUN) {
                lastChar = NUN2;
                change = true;
              } else if (lastChar == PAY) {
                lastChar = FAY2;
                change = true;
              } else if (lastChar == TSADI) {
                lastChar = TSADI2;
                change = true;
              }
              if (change) {
                hebrewText[x] = hebrewText[x].substr(0, len-1) + lastChar + hebrewText[x].substr(len);
              }
              if (lastChar == QUOTE && nextToLastChar == TSADI) {
                hebrewText[x] = hebrewText[x].substr(0, len-2) + TSADI2 + QUOTE;
              }
            }
          }
        }

//alert(hebrewText.join(', '));
        return hebrewText.join(', ');
      }

      function Init(dialect, text) {
        DisplayHebrew(dialect, text);
      }

