var Roman2KanaConverter = function(){
   this.roman_buffer = "";
   this.dict_or_char = hiragana_table;

   this.reset_me = function(buf, table){
      this.roman_buffer = buf;
      this.dict_or_char = table;
      if (!table)
         this.dict_or_char = hiragana_table;
   };
   this.flush_buffer = function(){
      var remaining_chars = this.roman_buffer;
      this.reset_me("", hiragana_table);
      if (remaining_chars.length > 0 &&
          remaining_chars[remaining_chars.length-1] == "n") {
             return "ん";
          }
      return "";
   };
   this.rescue_translate_failure = function(c){
      var len = this.roman_buffer.length;
      if (this.roman_buffer[len-2] == "n"){
         this.reset_me(c, hiragana_table[c]);
         return {kana:"ん"+c, num:2};
      }
      if (this.roman_buffer[len-2] == this.roman_buffer[len-1]) {
         this.reset_me(c, hiragana_table[c]);
         return {kana:"っ"+c, num:2};
      }
      var removed_chars = this.roman_buffer.length-1;
      this.reset_me(c, hiragana_table[c]);
      return {kana:"", num:removed_chars}
   };
   this.input_char = function(c){
      this.roman_buffer += c;
      this.dict_or_char = this.dict_or_char[c];
      if (this.dict_or_char == undefined) {
         return this.rescue_translate_failure(c);
      }
      if (typeof(this.dict_or_char) == "object") {
         return {kana:"", num:0};
      }
      var hiragana = this.dict_or_char;
      var removed_chars = this.roman_buffer.length;
      this.reset_me("", hiragana_table);
      return {kana:hiragana, num:removed_chars};
   }
};

