<?php
/**
 * PasswordMaker
 * パスワード生成のためのロジック
 * Javaクラスbiz.tailwalk.util.PasswrodMakerの焼き直し
 * $Id: PasswordMaker.inc,v 1.1 2015/10/08 11:18:56 wanggb Exp $
 * @author iimuro
 * @access public
 * @package jp.aimslib2.util
 */

class PasswordMaker {
	
	/**
	 * <pre>
	 * 数字とアルファベット。人間が間違えやすい、01lo などの文字を含みません。
	 * 23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz
	 * </pre>
	 */
	public $human_chars =
		"23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz";

	/**
	 * <pre>
	 * 数字と小文字アルファベット。人間が間違えやすい、01lo などの文字を含みません。
	 * 23456789abcdefghijkmnpqrstuvwxyz
	 * </pre>
	 */
	public $human_lower_chars =
		"23456789abcdefghijkmnpqrstuvwxyz";

	/**
	 * <pre>
	 * 数字と大文字アルファベット。人間が間違えやすい、01lo などの文字を含みません。
	 * 23456789ABCDEFGHJKLMNPQRSTUVWXYZ
	 * </pre>
	 */
	public $upper_lower_chars =
		"23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
	
	/**
	 * <pre>
	 * 数字とアルファベットと記号。人間が間違えやすい、01lo| などの文字を含みません。
	 * 23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz_!\"#$%&'()=~^-+/*,.[]{}@`;:<>?
	 * </pre>
	 */
	public $human_texts =
		"23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz_!\"#\$%&'()=~^-+/*,.[]{}@`;:<>?";
	
	/**
	 * <pre>
	 * 数字とアルファベット。
	 * 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
	 * </pre>
	 */
	public $chars =
		"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
	
	/**
	 * <pre>
	 * 数字とアルファベットと記号。
	 * 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_!\"#\$%&'()=~^-+/*,.[]{}\\|@`;:<>?
	 * </pre>
	 */
	public $texts =
		"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_!\"#\$%&'()=~^-+/*,.[]{}\\|@`;:<>?";
	
	/**
	 * <pre>
	 * 数字。
	 * 0123456789
	 * </pre>
	 */
	public $numbers =
		"0123456789";
	
	/**
	 * <pre>
	 * アルファベット。
	 * ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
	 * </pre>
	 */
	public $alphabets =
		"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
	
	/**
	 * <pre>
	 * 大文字アルファベット。
	 * ABCDEFGHIJKLMNOPQRSTUVWXYZ
	 * </pre>
	 */
	public $upper_alphabets =
		"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	
	/**
	 * <pre>
	 * 小文字アルファベット
	 * abcdefghijklmnopqrstuvwxyz
	 * </pre>
	 */
	public $lower_alphabets =
		"abcdefghijklmnopqrstuvwxyz";
	
	/**
	 * <pre>
	 * 記号。
	 * _\"#$%&'()=~|^-+/*,.[]{}\\|@`;:<>?
	 * </pre>
	 */
	public $signs =
		"_\"#\$%&'()=~|^-+/*,.[]{}\\|@`;:<>?";
	
	
	/**
	 * Singletonインスタンスの取得
	 */
	public static function &getInstance() {
		static $_me;
		
		if (!is_object($_me)) {
			$_me = new PasswordMaker();
		}
		
		return $_me;
	}
	
	
	/**
	 * private constructor.
	 */
	public function __construct() {
		
	}

	/**
	 * 数字とアルファベットのパスワードを生成します。<br>
	 * 人間が間違えやすい、01lo などの文字を含みません。<br>
	 * 23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz
	 * @param min パスワードの最小桁数
	 * @param max パスワードの最大桁数
	 * @return String パスワード
	 * @see AsciiChars#HumanChars
	 */
	public static function humanChars($min, $max = -1){
		$password = new PasswordMaker();
		return PasswordMaker::generate($password->human_chars, $min, $max);
	}
	
	
	
	/**
	 * 数字とアルファベットと記号のパスワードを生成します。<br>
	 * 人間が間違えやすい、01lo| などの文字を含みません。<br>
	 * 23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz_!\"#$%&'()=~^-+/*,.[]{}@`;:<>?
	 * @param min パスワードの最小桁数
	 * @param max パスワードの最大桁数
	 * @return String パスワード
	 * @see AsciiChars#HumanTexts
	 */
	public static function humanTexts($min, $max = -1){
		$password = new PasswordMaker();
		return PasswordMaker::generate($password->human_texts, $min, $max);
	}
	
	
	
	
	/**
	 * 数字とアルファベットのパスワードを生成します。<br>
	 * 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
	 * @param min パスワードの最小桁数
	 * @param max パスワードの最大桁数
	 * @return String パスワード
	 * @see AsciiChars#Chars
	 */
	public static function chars($min, $max = -1){
		$password = new PasswordMaker();
		return PasswordMaker::generate($password->chars, $min, $max);
	}
	
	
	
	/**
	 * 数字とアルファベットと記号のパスワードを生成します。<br>
	 * 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_!\"#$%&'()=~^-+/*,.[]{}\\|@`;:<>?
	 * @param min パスワードの最小桁数
	 * @param max パスワードの最大桁数
	 * @return String パスワード
	 * @see AsciiChars#Texts
	 */
	public static function texts($min, $max = -1){
		$password = new PasswordMaker();
		return PasswordMaker::generate($password->texts, $min, $max);
	}
	
	
	
	/**
	 * 数字のパスワードを生成します。<br>
	 * 0123456789
	 * @param min パスワードの最小桁数
	 * @param max パスワードの最大桁数
	 * @return String パスワード
	 * @see AsciiChars#Numbers
	 */
	public static function numbers($min, $max = -1){
		$password = new PasswordMaker();
		return PasswordMaker::generate($password->numbers, $min, $max);
	}
	
	
	
	/**
	 * アルファベットのパスワードを生成します。<br>
	 * ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
	 * @param min パスワードの最小桁数
	 * @param max パスワードの最大桁数
	 * @return String パスワード
	 * @see AsciiChars#Alphabets
	 */
	public static function alphabets($min, $max = -1){
		$password = new PasswordMaker();
		return PasswordMaker::generate($password->alphabets, $min, $max);
	}
	
	
	/**
	 * 大文字アルファベットのパスワードを生成します。<br>
	 * ABCDEFGHIJKLMNOPQRSTUVWXYZ
	 * @param min パスワードの最小桁数
	 * @param max パスワードの最大桁数
	 * @return String パスワード
	 * @see AsciiChars#UpperAlphabets
	 */
	public static function upperAlphabets($min, $max = -1){
		$password = new PasswordMaker();
		return PasswordMaker::generate($password->upper_alphabets, $min, $max);
	}
	
	
	/**
	 * 小文字アルファベットのパスワードを生成します。<br>
	 * abcdefghijklmnopqrstuvwxyz
	 * @param min パスワードの最小桁数
	 * @param max パスワードの最大桁数
	 * @return String パスワード
	 * @see AsciiChars#LowerAlphabets
	 */
	public static function lowerAlphabets($min, $max = -1){
		$password = new PasswordMaker();
		return PasswordMaker::generate($password->lower_alphabets, $min, $max);
	}
	
	
	
	/**
	 * 記号のパスワードを生成します。<br>
	 * _\"#$%&'()=~|^-+/*,.[]{}\\|@`;:<>?
	 * @param min パスワードの最小桁数
	 * @param max パスワードの最大桁数
	 * @return String パスワード
	 * @see AsciiChars#Signs
	 */
	public static function signs($min, $max = -1){
		$password = new PasswordMaker();
		return PasswordMaker::generate($password->signs, $min, $max);
	}
	
	
	/**
	 * 指定した文字を使用して、パスワードを生成します。
	 * @param words パスワードに使用する文字。
	 * @param figure パスワードの桁数
	 * @return String パスワード
	 */
	public static function generate($words, $min, $max = -1){
		
		$figure = PasswordMaker::randomLength($min, $max);
		
		$buf = "";
		//StringBuffer buf = new StringBuffer();
		for($i=0; $i < $figure; $i++){
			$buf .= PasswordMaker::randomSelect($words);
		}
		return $buf;
	}
	
	
	public static function randomSelect($words){
		$select = rand(0, strlen($words) - 1);
		return substr($words, $select, 1);
	}
	
	
	
	/**
	 * 適当な長さを返します。
	 */
	public static function randomLength($min, $max) {
		
		
		if ($min < $max) {
			list($usec, $sec) = explode(' ', microtime());
			srand((float) $sec + ((float) $usec * 100000));
			$figure = rand($min, $max); 			
		} else {
			$figure = $min;
		}
		
		return $figure;
	}
	
}

?>