
function Markov() {
  this.Version = 0.3;
  this.dict = {};
}

Markov.prototype = new GamMo();

Markov.prototype.add = function(text) {
  var token = this.parse(text);
  token.unshift("__START__"), token.push("__END__");
  for (var i = 0, l = token.length; i < l; i++) {
    var prefix1 = String(token[i]), prefix2 = String(token[i+1]);
    var suffix = String(token[i+2]);
    if (prefix1 in this.dict) {
      if (prefix2 in this.dict[prefix1]) {
        try {
          var ary = this.dict[prefix1][prefix2];
          //if (!(suffix in ary)) {
          if ((suffix == "__END__") && (sufifix in ary)) continue;
          ary.push(suffix);
        } catch (e) {}
      } else {
        this.dict[prefix1][prefix2] = [suffix];
      }
    } else {
      this.dict[prefix1] = {};
      this.dict[prefix1][prefix2] = [suffix];
    }
    if (suffix == "__END__") break;
  }
  token.shift(), token.pop();
}

Markov.prototype.generate = function(Max) {
  var result = [];
  var max = Max || 100;
  if (!"__START__" in this.dict) return false;
  var prefix1 = Util.keys(this.dict["__START__"]).random();
  result.push(prefix1);
  var prefix2 = Util.keys(this.dict[prefix1]).random();
  result.push(prefix2);
  for (var i = 0; i < max; i++) {
    if (prefix1 in this.dict) var suffix = this.dict[prefix1][prefix2].random();
    if (suffix == "__END__") break;
    result.push(suffix);
    prefix1 = prefix2;
    prefix2 = suffix;
  }

  return result.join("");
}