/** -*- Mode:js;tab-width:2;indent-tabs-mode:nil;coding:utf-8 -*- */
/**
 * PasswordMaker.js
 *
 * パスワードの候補を作成するクラスです。
 *
 * @id: $Id$
 * @author: norio minato
 */

function PasswordMaker()
{
  var _length     = 0;
  var _opt_num    = true;
  var _opt_symbol = true;

  /**
   * constructor
   */
  this.constructor = function ()
  {
    if (!new XMLHttpRequest()) {
      var msg = "ご利用のブラウザでは、Javascriptの特定の機能が利用できません。\n";
      msg += "Javascript機能をオフにして「変換する」ボタンをご利用ください。";
      alert(msg);
    }
  }
  this.constructor(); // 実行

  /**
   * パスワード生成
   */
  this.make = function ()
  {
    // 初期化
    var result_nd = document.getElementById('result-msg');
    result_nd.innerHTML = '';

    // パラメータを取得する
    getParameter();

    var alphabet = new Array('A','B','C','D','E','F','G','H','I',
                             'J','K','L','M','N','O','P','Q','R',
                             'S','T','U','V','W','X','Y','Z','a',
                             'b','c','d','e','f','g','h','i','j',
                             'k','l','m','n','o','p','q','r','s',
                             't','u','v','w','x','y','z');

    var symbol = new Array('!','"','#','$','%','&','\'','(',')',
                           '=','-','~','^','|','\\','`','@','{',
                           '[','+',';','*',':','}',']','<',',',
                           '>','.','?','/','_');

    // 候補は5個表示
    for (var i=0; i<5; ++i) {
      var is_symbol  = false;
      var is_numeric = false;
      var password   = '';

      for (var j=0; j<_length; ++j) {
        var character = '';

        // アルファベット
        var alpha_n = parseInt(Math.random() * 51);
        character = alphabet[alpha_n];

        // 数字
        if (_opt_num) {
          if ((parseInt(Math.random() * 10)) <= 2) {
            var num = parseInt(Math.random() * 10);
            character = num;
          }
        }
        // 記号
        if (_opt_symbol) {
          if ((parseInt(Math.random() * 10)) <= 1) {
            var symbol_n = parseInt(Math.random() * 31);
            character = symbol[symbol_n];
          }
        }
        password += character;
      }

      var txt_nd = document.createTextNode(password);
      var div_nd = document.createElement('div');
      div_nd.appendChild(txt_nd);
      result_nd.appendChild(div_nd);
    }
  }

  /**
   * パラメータを取得する
   */
  function getParameter()
  {
    // 文字数
    var select_nd = document.getElementById('length');
    var opt_num   = select_nd.options.length;

    for (var i=0; i<opt_num; ++i) {
      if (select_nd.options[i].selected == true)
        _length = select_nd.options[i].value;
    }

    // 数字を含めるか
    _opt_num = (document.getElementById('opt_num').checked) ? true : false;

    // 記号を含めるか
    _opt_symbol = (document.getElementById('opt_symbol').checked) ? true : false;
  }

}
