
function makePassword() {
  var f = document.forms.mkpasswd;
  var l = parseInt(f.len.value);
  var c = new Array(4);
  c[0] = (f.c1.checked) ? f.c1.value : "";
  c[1] = (f.c2.checked) ? f.c2.value : "";
  c[2] = (f.c3.checked) ? f.c3.value : "";
  c[3] = (f.c4.value != "") ? f.c4.value : "";

  f.disp.value = generateString(l, c);
}

function generateString(l, c) {
  var o = "";
  var re = new Array(c.length);
  for (var i = 0; i < c.length; i++) {
    o += c[i];
    if (c[i].length > 0) {
      re[i] = RegExp("["+escape(c[i])+"]");
    }
  }
  var s = randomizedString(randomizedString(o));
  var len = s.length;
  var str;
  do {
    str = "";
    for(var i = 0; i < l; i++) {
      str += s.charAt(Math.floor(len*Math.random()));
    }
    var loop = false;
    for (var i = 0; i < c.length; i++) {
      if (c[i].length > 0) {
        if (!re[i].test(str)) {
          loop = true;
          break;
        }
      }
    }
  } while (loop);
  return str;
}

function escape(s) {
  s = s.replace(/[\\]/g, "\\");
  s = s.replace(/[*?+-|\[\]^]/g, "\\$&");
  return s;
}

function randomizedString(o) {
  var len = o.length;
  var s = "";
  for(var i = 0; i < len; i++) {
    var n = Math.floor((len-i)*Math.random());
    s += o.charAt(n)
    o = o.substring(0, n)+o.substring(n+1)
  }
  return s;
}

