      // 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_xxx where xxx is from & notation
      // The characters can later be retrieved with GetCharacter(cap_de) for example
      var firstchar = cap_alpha.substr(2,3);
      var lastchar = low_omega.substr(2,3);
      document.write("<form name='convert'>");
      for (var i=firstchar; i<=lastchar; i++) {
        document.write("<input type='hidden' name='char_" + i + "' value='&#" + i + ";'>\n");
      }
      document.write("</form>");

      function GetCharacter(c) {
        return document.convert["char_" + c.substr(2,3)].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) == ' '));
      }

      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 DisplayGreek(dialect, text) {
        var classical = dialect[0].checked;
        var modern = dialect[1].checked;

        var greekText = [''];
        var upper = true;
        for (var i=0; i<text.length; i++) {
          upper = (text.charAt(i) == text.charAt(i).toUpperCase());
          var englishLetter = text.charAt(i).toUpperCase();
          if (englishLetter == PrevChar(i, text)) {
            continue;
          }
          var greekLetter = '';
          if (englishLetter == 'A') {
            greekLetter = GetCharacter(upper ? cap_alpha : low_alpha);
          } else if (englishLetter == 'B') {
            if (classical) {
              greekLetter = GetCharacter(upper ? cap_beta : low_beta);
            } else {
              // see http://www.comp.brad.ac.uk/~mick/greek.html
              greekLetter = GetCharacter(upper ? cap_mu : low_mu) + GetCharacter(upper ? cap_pi : low_pi);
            }
          } else if (englishLetter == 'C') {
            if (!AtEnd(i, text)) {
              if ((NextChar(i, text) == 'E') || (NextChar(i, text) == 'I') || (NextChar(i, text) == 'Y')) {
                greekLetter = GetCharacter(upper ? cap_sigma : low_sigma);
                i += nextCharSpan;
              } else if (NextChar(i, text) == 'H') {
                greekLetter = GetCharacter(upper ? cap_chi : low_chi);
                // not correct but is the best we can do
                i += nextCharSpan;
              } else if (NextChar(i, text) == 'Z') {
                greekLetter = GetCharacter(upper ? cap_chi : low_chi);
                // not correct but is the best we can do
                i += nextCharSpan;
              } else {
                greekLetter = GetCharacter(upper ? cap_kappa : low_kappa);
                if (NextChar(i, text) == 'K') {
                  i += nextCharSpan;
                }
              }
            } else {
              greekLetter = GetCharacter(upper ? cap_kappa : low_kappa);
            }
          } else if (englishLetter == 'D') {
            if (classical) {
              greekLetter = GetCharacter(upper ? cap_delta : low_delta);
            } else {
              // see http://www.comp.brad.ac.uk/~mick/greek.html
              greekLetter = GetCharacter(upper ? cap_nu : low_nu) + GetCharacter(upper ? cap_tau : low_tau);
            }
          } else if (englishLetter == 'E') {
            if (!AtEnd(i, text) && (NextChar(i, text) == 'Y' || NextChar(i, text) == 'I')) { // long e
              if (classical) {
                greekLetter = GetCharacter(upper ? cap_eta : low_eta) + "|" + GetCharacter(upper ? cap_epsilon : low_epsilon);
                // not completely correct because eta and epsilon are short e whereas we need a long one here
              } else {
                greekLetter = GetCharacter(upper ? cap_eta : low_eta) + "|" + GetCharacter(upper ? cap_iota : low_iota);
              }
              i += nextCharSpan;
            } else if (!AtEnd(i, text) && TrueNextChar(i, text) == 'E') { // long e
              if (classical) {
                greekLetter = GetCharacter(upper ? cap_eta : low_eta) + "|" + GetCharacter(upper ? cap_epsilon : low_epsilon);
                // not completely correct because eta and epsilon are short e whereas we need a long one here
              } else {
                greekLetter = GetCharacter(upper ? cap_eta : low_eta) + "|" + GetCharacter(upper ? cap_iota : low_iota);
              }
              i += nextCharSpan;
            } else {
              if (!AtEnd(i, text)) { // short e
                if (classical) {
                  greekLetter = GetCharacter(upper ? cap_eta : low_eta) + "|" + GetCharacter(upper ? cap_epsilon : low_epsilon);
                } else {
                  greekLetter = GetCharacter(upper ? cap_epsilon : low_epsilon);
                }
              } else {
                continue;
              }
            }
          } else if (englishLetter == 'F') {
            if (classical) {
              greekLetter = GetCharacter(upper ? cap_phi : low_phi);
              // not correct but is the best we can do
            } else {
              greekLetter = GetCharacter(upper ? cap_phi : low_phi);
            }
          } else if (englishLetter == 'G') {
            greekLetter = GetCharacter(upper ? cap_gamma : low_gamma); // what about G like in George???
            if (!AtEnd(i, text)) {
              if (NextChar(i, text) == 'H') {
                greekLetter = GetCharacter(upper ? cap_gamma : low_gamma); // what about G like in George???
                i += nextCharSpan;
              }
            }
          } else if (englishLetter == 'H') {
            greekLetter = "[H]";
          } else if (englishLetter == 'I') {
            if (!AtEnd(i, text) && (NextChar(i, text) == 'E')) { // long e
              if (classical) {
                greekLetter = GetCharacter(upper ? cap_eta : low_eta) + "|" + GetCharacter(upper ? cap_epsilon : low_iota);
                // not completely correct because eta and epsilon are short e whereas we need a long one here
              } else {
                greekLetter = GetCharacter(upper ? cap_eta : low_eta) + "|" + GetCharacter(upper ? cap_iota : low_iota);
              }
              i += nextCharSpan;
            } else { // long or short i, but there is no long i in greek
              greekLetter = GetCharacter(upper ? cap_iota : low_iota);
           }
          } else if (englishLetter == 'J') {
            greekLetter = GetCharacter(upper ? cap_iota : low_iota);
            // not quite correct
          } else if (englishLetter == 'K') {
            if (!AtEnd(i, text) && (NextChar(i, text) == 'H')) {
              greekLetter = GetCharacter(upper ? cap_chi : low_chi);
              // not correct for classic greek but is the best we can do
              i += nextCharSpan;
            } else {
              greekLetter = GetCharacter(upper ? cap_kappa : low_kappa);
            }
          } else if (englishLetter == 'L') {
            greekLetter = GetCharacter(upper ? cap_lambda : low_lambda);
          } else if (englishLetter == 'M') {
            greekLetter = GetCharacter(upper ? cap_mu : low_mu);
          } else if (englishLetter == 'N') {
            if (!AtEnd(i, text) &&
                (NextChar(i, text) == 'G' || NextChar(i, text) == 'K' || NextChar(i, text) == 'X')) {
                greekLetter = GetCharacter(upper ? cap_gamma : low_gamma) + "|" + GetCharacter(upper ? cap_nu : low_nu);
            } else {
              greekLetter = GetCharacter(upper ? cap_nu : low_nu);
            }
          } else if (englishLetter == 'O') {
            if (!AtEnd(i, text) && (NextChar(i, text) == 'O')) { // oo = u
              greekLetter = GetCharacter(upper ? cap_upsilon : low_upsilon);
              i += nextCharSpan;
            } else {
              greekLetter = GetCharacter(upper ? cap_omicron : low_omicron) + "|" + GetCharacter(upper ? cap_omega : low_omega);
            }
          } else if (englishLetter == 'P') {
            greekLetter = GetCharacter(upper ? cap_pi : low_pi);
            if (!AtEnd(i, text) && NextChar(i, text) == 'H') {
              if (classical) {
                greekLetter = GetCharacter(upper ? cap_phi : low_phi);
                // not correct but is the best we can do
              } else {
                greekLetter = GetCharacter(upper ? cap_phi : low_phi);
              }
              i += nextCharSpan;
            }
          } else if (englishLetter == 'Q') {
            greekLetter = GetCharacter(upper ? cap_ka : low_kappa);
            // not quite correct but is the best we can do
          } else if (englishLetter == 'R') {
            greekLetter = GetCharacter(upper ? cap_rho : low_rho);
          } else if (englishLetter == 'S') {
            if (!AtEnd(i, text)) {
              if (TrueNextChar(i, text) == 'S') {
                greekLetter = GetCharacter(upper ? cap_sigma : low_sigma);
                i += nextCharSpan;
              } else if (NextChar(i, text) == 'Z' || NextChar(i, text) == 'H') {
                greekLetter = GetCharacter(upper ? cap_sigma : low_sigma);
                // not correct but is the best we can do
                i += nextCharSpan;
              } else {
                greekLetter = GetCharacter(upper ? cap_sigma : low_sigma);
              }
            } else {
              greekLetter = GetCharacter(upper ? cap_sigma : low_sigma);
            }
          } else if (englishLetter == 'T') {
            if (!AtEnd(i, text)) {
              if ((NextChar(i, text) == 'H')) {
                if (classical) {
                  greekLetter = GetCharacter(upper ? cap_theta : low_theta);
                  // not correct but is the best we can do
                } else {
                  greekLetter = GetCharacter(upper ? cap_delta : low_delta) + "|" + GetCharacter(upper ? cap_theta : low_theta);
                }
                i += nextCharSpan;
              } else {
                greekLetter = GetCharacter(upper ? cap_tau : low_tau);
              }
            } else {
              greekLetter = GetCharacter(upper ? cap_tau : low_tau);
            }
          } else if (englishLetter == 'U') {
            greekLetter = GetCharacter(upper ? cap_upsilon : low_upsilon);
          } else if (englishLetter == 'V') {
            if (classical) {
              greekLetter = GetCharacter(upper ? cap_beta : low_beta);
              // not correct but is the best we can do
            } else {
              greekLetter = GetCharacter(upper ? cap_beta : low_beta);
            }
          } else if (englishLetter == 'W') {
            greekLetter = "[W]";
          } else if (englishLetter == 'X') {
            greekLetter = GetCharacter(upper ? cap_xi : low_xi);
          } else if (englishLetter == 'Y') {
            greekLetter = GetCharacter(upper ? cap_iota : low_iota);
            // not quite correct but is the best we can do
          } else if (englishLetter == 'Z') {
            greekLetter = GetCharacter(upper ? cap_zeta : low_zeta);
            // not quite correct for classical
          } else if (englishLetter == ' ') {
            greekLetter = ' ';
          }

//alert(i + ": " +greekLetter);

          var greekLetterArray = greekLetter.split('|');
          letterCount = greekLetterArray.length;
          wordCount = greekText.length;
          for (var letterIndex=1; letterIndex<letterCount; letterIndex++) {
            for (var wordIndex=0; wordIndex<wordCount; wordIndex++) {
              greekText[letterIndex*wordCount + wordIndex] = greekText[wordIndex];
            }
          }
          for (var letterIndex=0; letterIndex<letterCount; letterIndex++) {
            for (var wordIndex=0; wordIndex<wordCount; wordIndex++) {
              greekText[letterIndex*wordCount + wordIndex] += greekLetterArray[letterIndex];
            }
          }
        }


        // fix up lower case sigma at the end of a word

        for (var x=0; x<greekText.length; x++) {

          for (len=0; len<=greekText[x].length; len++) {
            if (len==greekText[x].length || (greekText[x].charAt(len) == ' ')) {
              lastChar = (len<1) ? "" : greekText[x].charAt(len-1);
              var change = false;
              if (lastChar == GetCharacter(low_sigma)) {
                lastChar = GetCharacter(low_sigma_final);
                change = true;
              }
              if (change) {
                greekText[x] = greekText[x].substr(0, len-1) + lastChar + greekText[x].substr(len);
              }
            }
          }
        }


//alert(greekText.join(', '));
//document.write("<scr"+"ipt>myform.greek.value='"+greekText.join(', ')+"';</scr"+"ipt>");

        return greekText.join(', ');
      }

      function Init(dialect, text) {
        DisplayGreek(dialect, text);
      }

