Client Side Databaseで入力内容を保存、復元するbookmarklet

mixiとかのユーザIDとパスワードを入力するのが面倒だったので前日に簡易的なものを作りましたが
画面の作りに依存したbookmarkletも良くないなということで下記のjsを作りました。

// javascript:(function(src){var z = document.createElement('script');z.src=src;document.body.appendChild(z);})('http://xxxxxx/bookmarklet.js')
var Db = new Object();
Db.debug = false;
Db.log = function(msg){
  if (Db.debug) { 
    //console.log.apply(console, arguments);  // for iphone
    alert(msg);
  }
}
Db.sql = function(sql, param, callback, success, err) {
  Db.log(sql);
  // debug log
  var x = function (tx, rs) {
    if (Db.debug && rs.rows) {
      var log = "total->[" + rs.rows.length + "]";
      for (var i = 0; i < rs.rows.length; i++) {
        var row = rs.rows.item(i);
        for (var row_attr in row){
          log += "\n" + row_attr + "->[" + row[row_attr] + "]";
        }
      }
      Db.log(log);
    }
    if (callback != null) { callback(tx, rs); }
  }
  this.db.transaction(
    function(tx) {
      tx.executeSql(sql, param, x);
    },
    function(error) {
      Db.log('err->' + error.message);
      if (err) { err(error); }
    },
    function() {
      Db.log('sql success');
      if (success) { success(); }
    }
  );
}
Db.init = function() {
  this.db = openDatabase('bookmarkletDb', '1.0', 'bookmarkletDb');
  var ddl = "CREATE TABLE form (id INTEGER PRIMARY KEY, form_no INTEGER NOT NULL, key CAHR(10) NOT NULL, value VARCHAR(255))";
  Db.sql(ddl, []);
}
Db.init();

// javascript:(function(){Db.save();})()
Db.save = function (){
  Db.sql("DELETE FROM form", [], function (){
    var f = document.forms;
for (var i = 0; i < f.length; i++) {
  var form = f[i];
  var e = form.elements;
  for (var j=0; j < e.length; j++){
    if (e[j].name && e[j].value && (e[j].type == 'text' || e[j].type == 'password')) {
      var data = [i, e[j].name, e[j].value];
      Db.sql('INSERT INTO form(form_no, key, value)VALUES(?, ?, ?)', data);
    }
  }
}
  });
}
Db.save();

// javascript:(function(){Db.load();})()
Db.load = function (){
  Db.sql("SELECT form_no, key, value FROM form ORDER BY form_no", null, 
      function(tx, rs) {
        for (var i = 0; i < rs.rows.length; i++) {
          var form_no = rs.rows.item(i).form_no;
          var key = rs.rows.item(i).key;
          var value = rs.rows.item(i).value;
          var x = "document.forms[" + form_no + "].elements['" + key + "'].value='" + value + "'";
          Db.log(x);
          eval(x);
        }
      });
}

使い方は、わかる人だけ使ってください。
これをして保存で
javascript:(function(src){var z = document.createElement('script');z.src=src;document.body.appendChild(z);})
これをして復元
javascript:(function(){Db.load();})()
 
safariで動作します。一応iPhone用です。
追記
initとsaveが常に呼び出される。あとで直します。たぶん。