
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//	JavaScriptライブラリ - バリデーション
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■



var VLD = {

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■Cookie有効チェック
	 * IE4-,NN6-
	 * @example	if (!VLD.cookie()) {}
	 * @date	
	 * @param	void
	 * @return	bool
	 *--------------------------------------------------------------------------------
	 */
	cookie : function()
	{
		return (navigator.cookieEnabled);
	},

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■空チェック
	 * 文字列が空白文字のみかチェック。
	 * @date	2010-02-17
	 * @param	string	str	対象文字列
	 * @return	bool
	 *--------------------------------------------------------------------------------
	 */
	kara : function(str)
	{
		return (str.match(/^[\s　]*$/));
	},

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■ひらがなチェック
	 * @date	2010-06-29
	 * @param	string	str	対象文字列
	 * @return	bool
	 *--------------------------------------------------------------------------------
	 */
	hirakana : function(str)
	{
		return (str.match(/^[\u3040-\u309F]+$/));
	},

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■カタカナチェック
	 * @date	2010-06-29
	 * @param	string	str	対象文字列
	 * @return	bool
	 *--------------------------------------------------------------------------------
	 */
	katakana : function(str)
	{
		return (str.match(/^[\u30A0-\u30FF]+$/));
	},

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■ASCII印字可能文字チェック
	 * 制御文字以外の空白を含むASCII。空文字・数値はfalse。
	 * @date	2010-07-07
	 * @param	string	str	対象文字列
	 * @return	bool
	 *--------------------------------------------------------------------------------
	 */
	asciiPrint : function(str)
	{
		return (str.match(/^[\x20-\x7E]+$/));
	},

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■ASCII図形文字チェック
	 * 制御文字・空白以外のASCII。空文字・数値はfalse。
	 * @date	2010-06-30
	 * @param	string	str	対象文字列
	 * @return	bool
	 *--------------------------------------------------------------------------------
	 */
	asciiGraph : function(str)
	{
		return (str.match(/^[\x21-\x7E]+$/));
	},

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■半角数字チェック
	 * @date	2010-02-17
	 * @param	string	str	対象文字列
	 * @return	bool
	 *--------------------------------------------------------------------------------
	 */
	num : function(str)
	{
		var c;
		for (var i = 0; i < str.length; i++) {
			c = str.charAt(i);
			if ("0123456789".indexOf(c,0) < 0) {return false;}
		}
		return true;
	},

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■全半角数字チェック
	 * @date	2010-02-22
	 * @param	string	str	対象文字列
	 * @return	bool
	 *--------------------------------------------------------------------------------
	 */
	numZenhan : function(str)
	{
		return (VLD.num(BASIC.toHanNum(str)));
	},

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■半角英数チェック
	 * @date	2010-02-17
	 * @param	string	str	対象文字列
	 * @return	bool
	 *--------------------------------------------------------------------------------
	 */
	alnum : function(str)
	{
		return (str.match(/^[0-9a-zA-Z]+$/));
	},

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■メールアドレスチェック
	 * 【注意】ローカルパートのquoted-string形式、ドメインの「[IPアドレス]」形式は未対応（falseを返す）。
	 * ドメインの最初に数字もOKにしています。TLD部分は適当に。
	 * @todo	D修飾子
	 * @date	2010-04-27
	 * @param	string	str		対象文字列
	 * @param	bool	mobile_flg	Docomo・AU等の不正メールアドレス許可フラグ（デフォルト：許可）
	 * @return	bool
	 *--------------------------------------------------------------------------------
	 */
	email : function(str, mobile_flg)
	{
		//■正規表現
		var regex = /^[\w!#$%&'*+\/=?^`{|}~.-]+@(?:[a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)+[a-z]{2,}$/i;

		//■正規表現チェック
		if (!str.match(regex)) {
			return false;
		}

		//■長さチェック
		var list = str.split("@");
		var local  = list[0];
		var domain = list[1];
		var domain_array = domain.split(".");

		if (str.length > 256 || local.length > 64 || domain.length > 255) {
			return false;
		}

		for (var i = 0; i < domain_array.length; i++) {
			if (domain_array[i].length > 63) {
				return false;
			}
		}

		//■ローカルパート・ドットチェック
		if (mobile_flg === false) {
			if (local.substr(0, 1) === "."
			|| local.substr(-1, 1) === "."
			|| local.indexOf("..") !== -1) {
				return false;
			}
		} else if (local === ".") {
			return false;
		}

		return true;
	},

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■URLチェック
	 * @date	2008-12-22
	 * @param	string	str	対象文字列
	 * @return	bool
	 *--------------------------------------------------------------------------------
	 */
	url : function(str)
	{
		var regex = /^https?:\/\/([A-Za-z0-9;\?:@&=\+\$,\-_\.!~\*'\(\)%]+)(:\d+)?(\/?[A-Za-z0-9;\/\?:@&=\+\$,\-_\.!~\*'\(\)%#])*$/;
		return (str.match(regex));
	},

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■通常ファイル名チェック
	 * [半角英数,_,-].[拡張子]
	 * @date	2010-06-17
	 * @param	string	str	対象文字列
	 * @return	bool
	 *--------------------------------------------------------------------------------
	 */
	filenameNormal : function(str)
	{
		var regex = /^(?:[0-9A-Za-z_\-]+)\.([0-9A-Za-z]+)$/;
		return (str.match(regex));
	},

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■RGBチェック
	 * @date	2007-07-30
	 * @param	string	str	対象文字列
	 * @return	bool
	 *--------------------------------------------------------------------------------
	 */
	rgb : function(str)
	{
		return (str.match(/^[a-fA-F0-9]{6}$/));
	},

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■日付期間内チェック
	 * @example	VLD.dateRange(ymd, start_ymd, end_ymd)
	 * @date	2010-09-06
	 * @param	string	check_ymd	対象年月日文字列（yyyy-mm-dd, yyyy/mm/dd等）
	 * @param	string	start_ymd	開始年月日文字列
	 * @param	string	end_ymd		終了年月日文字列
	 * @return	bool
	 *--------------------------------------------------------------------------------
	 */
	dateRange : function(check_ymd, start_ymd, end_ymd)
	{
		//■日付フォーマット変更
		// Date.parse()は「yyyy-mm-dd」フォーマットはダメみたい
		check_ymd = check_ymd.replace(/\-/g, '/');
		start_ymd = start_ymd.replace(/\-/g, '/');
		end_ymd   = end_ymd.replace(/\-/g, '/');

		//■Dateオブジェクト作成
		var check_date = new Date();
		var start_date = new Date();
		var end_date   = new Date();

		check_date.setTime(Date.parse(check_ymd));
		start_date.setTime(Date.parse(start_ymd));
		end_date.setTime(Date.parse(end_ymd));

		//■引数に時刻付きフォーマットが混じっているかもしれないので時刻を00:00:00に
		check_date.setHours(0);
		check_date.setMinutes(0);
		check_date.setSeconds(0);
		start_date.setHours(0);
		start_date.setMinutes(0);
		start_date.setSeconds(0);
		end_date.setHours(0);
		end_date.setMinutes(0);
		end_date.setSeconds(0);

		return (check_date.getTime() >= start_date.getTime() && check_date.getTime() <= end_date.getTime());
	},

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■閏年チェック
	 * 西暦年が4で割り切れる年は閏年
	 * ただし、西暦年が100で割り切れる年は平年
	 * ただし、西暦年が400で割り切れる年は閏年
	 * @date	2008-12-25
	 * @param	int	y	年（デフォルト：今年）
	 * @return	bool
	 *--------------------------------------------------------------------------------
	 */
	leapYear : function(y)
	{
		if (y === undefined) {
			var now = new Date();	// 日付オブジェクト
			y = now.getFullYear();	// 年
		}
		return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
	}
}



/**
 *****************************************************************************************************
 * ■■■フォーム入力バリデーション■■■
 *
 * フォームidはまだ使っていない
 * zip,tel,faxは非必須時、一部未入力があってもエラーにならない。
 * @example
 *		var vld = new VLD_input();
 *		vld.validate("text", "氏名", 1, "name", 50);
 *		vld.validate("kana", "フリガナ", 1, "member_ruby", null, null, true);
 *		vld.validate("hirakana", "ふりがな", 1, "ruby");
 *		vld.validate("katakana", "フリガナ", 1, "ruby");
 *		vld.validate("zip", "郵便番号", 1, "zip1", "zip2");
 *		vld.validate("select", "都道府県", 1, "ken_id");
 *		vld.validate("text", "住所", 1, "addr");
 *		vld.validate("tel", "電話番号", 1, "tel1", "tel2", "tel3");
 *		vld.validate("tel", "FAX", 1, "fax1", "fax2", "fax3");
 *		vld.validate("email", "Eメールアドレス", 1, "email");
 *		vld.validate("url", "URL", 1, "url");
 *		vld.validate("ymd", "配送希望年月日", 1, "y", "m", "d", "20090401", "20090531");
 *		vld.validate("num", "税込単価", 1, "price");
 *		vld.validate("filename_normal", "画像ファイル名", 1, "filename");
 *		vld.validate("ascii_normal", "ログインID", 1, "login_id");
 *		vld.validate("ascii_print", "ログインパスワード", 1, "login_passwd");	// 空白OK
 *		vld.validate("ascii_graph", "ログインパスワード", 1, "login_passwd");	// 空白NG
 *		vld.validate("checkbox", "バスコース", 1, "bus_id[]");	// これだけname属性値を指定
 *		if (document.getElementById("haitatsu_d").selectedIndex == 0) {
 *			vld.setError("「配達希望日時」の月が設定されていますが日が設定されていません。", "haitatsu_d");
 *		}
 *		if (vld.isError()) {vld.alertError(); return false;}
 *
 * @date	2011-01-24
 *****************************************************************************************************
 */

function VLD_input(form_id)
{
	this.form_id;			// 検証フォームid属性値
	this.error = [];		// エラー文格納配列
	this.error_first_ele = null;	// 最初のエラーエレメントID
}

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■バリデーション
	 * @date	2010-12-15
	 * @access	public
	 * @param	mixed			チェック項目情報
	 * @param	bool			（エラー地点を知りたい場合があるのでreturnする）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype.validate = function()
	{
		if (!arguments.length) {return false;}

		//■引数配列化
		var arg = [];
		arg.push.apply(arg, arguments);

		//■第1引数を取り出す
		var type = arg.shift();

		//■バリデーション実行
		var error = eval("this._vld_" + type + ".apply(this, arg)");

		//■エラー文格納
		if (error.length) {
			this.error = this.error.concat(error);
			if (this.error_first_ele === null) {
				switch (type) {
					case "ymd":		this.error_first_ele = arg[4]; break;
					case "checkbox":	break;	// チェックボックスではidではなくname属性値なので
					default:		this.error_first_ele = arg[2]; break;
				}
			}
		}

		return (error.length) ? false : true;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●チェック・文字列長
	 * @date	2010-06-30
	 * @access	private
	 * @param	object	ele		エレメント
	 * @param	string	value		入力値
	 * @param	string	name		項目名
	 * @param	int	maxlen		最大入力文字数（未定義|null|false|0：制限無し）
	 * @param	int	minlen		最小入力文字数（未定義|null|false|0：制限無し）
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._checkLength = function(ele, value, name, required, maxlen, minlen)
	{
		//■空チェック
		if (value === "" && required && required !== "0") {
			return "「" + name + "」が未入力です。";
		}

		//■最大・最小入力文字数が未指定時、エレメント属性での指定があればそれを使用
		if (maxlen === undefined || maxlen === null || maxlen === false) {
			var ele_maxlen = ele.getAttribute("maxlen");
			if (ele_maxlen && VLD.num(ele_maxlen)) {
				maxlen = ele_maxlen;
			}
		}

		if (minlen === undefined || minlen === null || minlen === false) {
			var ele_minlen = ele.getAttribute("minlen");
			if (ele_minlen && VLD.num(ele_minlen)) {
				minlen = ele_minlen;
			}
		}

		//■文字列長チェック
		var max_ng_flg = (maxlen && value.length > maxlen);
		var min_ng_flg = (minlen && value.length < minlen);

		if (maxlen && minlen && (max_ng_flg || min_ng_flg)) {
			return "「" + name + "」は" + minlen + "～" + maxlen + "文字以内で入力してください。";
		} else if (max_ng_flg) {
			return "「" + name + "」は" + maxlen + "文字以内で入力してください。";
		} else if (min_ng_flg) {
			return "「" + name + "」は" + minlen + "文字以上で入力してください。";
		}

		return true;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●バリデーション（mb文字・テキストフィールド）
	 * @date	2010-06-30
	 * @access	private
	 * @param	string	name		項目名
	 * @param	int	required	入力必須フラグ
	 * @param	string	ele_id		エレメントid属性値
	 * @param	int	maxlen		最大入力文字数（未定義|null|false|0：制限無し）
	 * @param	int	minlen		最小入力文字数（未定義|null|false|0：制限無し）
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._vld_text = function(name, required, ele_id, maxlen, minlen)
	{
		var error = [];

		//■エレメントデータ取得
		var ele_obj   = document.getElementById(ele_id);	// エレメントオブジェクト
		var ele_value = this._mbtrim(ele_obj.value);		// エレメントvalue属性値

		//■文字長チェック
		var result = this._checkLength(ele_obj, ele_value, name, required, maxlen, minlen);
		if (result !== true) {
			error.push(result);
		}

		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●バリデーション（mb文字・テキストエリア）
	 * @date	2010-06-30
	 * @access	private
	 * @param	string	name		項目名
	 * @param	int	required	入力必須フラグ
	 * @param	string	ele_id		エレメントid属性値
	 * @param	int	maxlen		最大入力文字数（未定義|null|false|0：制限無し）
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._vld_textarea = function(name, required, ele_id, maxlen)
	{
		var error = [];

		//■エレメントデータ取得
		var ele_obj   = document.getElementById(ele_id);	// エレメントオブジェクト
		var ele_value = this._mbtrim(ele_obj.value);		// エレメントvalue属性値

		//■文字長チェック
		if (ele_value === "") {
			if (required && required !== "0") {
				error.push("「" + name + "」が未入力です。");
			}
		} else {
			if (maxlen) {	// 改行は1文字とカウント
				var input_len = ele_value.length;
				if (input_len > maxlen) {
					var result = ele_value.match(/\r\n/g);
					if (result !== null) {
						input_len -= result.length;
					}
					if (input_len > maxlen) {
						error.push("「" + name + "」は" + maxlen + "文字以内で入力してください。");
					}
				}
			}
		}

		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●バリデーション（ひらがな・カタカナ）
	 * @date	2011-01-24
	 * @access	private
	 * @param	string	name		項目名
	 * @param	int	required	入力必須フラグ
	 * @param	string	ele_id		エレメントid属性値
	 * @param	int	maxlen		最大入力文字数（未定義|null|false|0：制限無し）
	 * @param	int	minlen		最小入力文字数（未定義|null|false|0：制限無し）
	 * @param	bool	valid_space	スペース許可フラグ
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._vld_kana = function(name, required, ele_id, maxlen, minlen, valid_space)
	{
		var error = [];

		//■エレメントデータ取得
		var ele_obj   = document.getElementById(ele_id);	// エレメントオブジェクト
		var ele_value = this._mbtrim(ele_obj.value);		// エレメントvalue属性値

		//■文字長チェック
		var result = this._checkLength(ele_obj, ele_value, name, required, maxlen, minlen);
		if (result !== true) {
			error.push(result);
		}

		//■スペース許可
		if (valid_space) {
			ele_value = BASIC.deleteSpace(ele_value);
		}

		//■フォーマットチェック
		if (result === true && ele_value !== "" && !VLD.katakana(BASIC.toKatakana(ele_value))) {
			error.push("「" + name + "」にひらがな・カタカナ以外の文字が入っています。");
		}

		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●バリデーション（ひらがな）
	 * @date	2010-07-13
	 * @access	private
	 * @param	string	name		項目名
	 * @param	int	required	入力必須フラグ
	 * @param	string	ele_id		エレメントid属性値
	 * @param	int	maxlen		最大入力文字数（未定義|null|false|0：制限無し）
	 * @param	int	minlen		最小入力文字数（未定義|null|false|0：制限無し）
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._vld_hirakana = function(name, required, ele_id, maxlen, minlen)
	{
		var error = [];

		//■エレメントデータ取得
		var ele_obj   = document.getElementById(ele_id);	// エレメントオブジェクト
		var ele_value = this._mbtrim(ele_obj.value);		// エレメントvalue属性値

		//■文字長チェック
		var result = this._checkLength(ele_obj, ele_value, name, required, maxlen, minlen);
		if (result !== true) {
			error.push(result);
		}

		//■フォーマットチェック
		if (result === true && ele_value !== "" && !VLD.hirakana(ele_value)) {
			error.push("「" + name + "」にひらがな以外の文字が入っています。");
		}

		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●バリデーション（カタカナ）
	 * @date	2010-07-13
	 * @access	private
	 * @param	string	name		項目名
	 * @param	int	required	入力必須フラグ
	 * @param	string	ele_id		エレメントid属性値
	 * @param	int	maxlen		最大入力文字数（未定義|null|false|0：制限無し）
	 * @param	int	minlen		最小入力文字数（未定義|null|false|0：制限無し）
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._vld_katakana = function(name, required, ele_id, maxlen, minlen)
	{
		var error = [];

		//■エレメントデータ取得
		var ele_obj   = document.getElementById(ele_id);	// エレメントオブジェクト
		var ele_value = this._mbtrim(ele_obj.value);		// エレメントvalue属性値

		//■文字長チェック
		var result = this._checkLength(ele_obj, ele_value, name, required, maxlen, minlen);
		if (result !== true) {
			error.push(result);
		}

		//■フォーマットチェック
		if (result === true && ele_value !== "" && !VLD.katakana(ele_value)) {
			error.push("「" + name + "」にカタカナ以外の文字が入っています。");
		}

		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●バリデーション（数字・テキストフィールド）
	 * @date	2010-07-13
	 * @access	private
	 * @param	string	name		項目名
	 * @param	int	required	入力必須フラグ
	 * @param	string	ele_id		エレメントid属性値
	 * @param	int	maxlen		最大入力文字数（未定義|null|false|0：制限無し）
	 * @param	int	minlen		最小入力文字数（未定義|null|false|0：制限無し）
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._vld_num = function(name, required, ele_id, maxlen, minlen)
	{
		var error = [];

		//■エレメントデータ取得
		var ele_obj   = document.getElementById(ele_id);	// エレメントオブジェクト
		var ele_value = this._mbtrim(ele_obj.value);		// エレメントvalue属性値

		//■文字列置換
		ele_value = this._toHanNum(ele_value);	// 全角→半角数字

		//■文字長チェック
		var result = this._checkLength(ele_obj, ele_value, name, required, maxlen, minlen);
		if (result !== true) {
			error.push(result);
		}

		//■フォーマットチェック
		if (result === true && ele_value !== "" && !VLD.numZenhan(ele_value)) {
			error.push("「" + name + "」に数字以外の文字が入っています。");
		}

		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●バリデーション（郵便番号・テキストフィールド）
	 * @date	2010-06-30
	 * @access	private
	 * @param	string	name		項目名
	 * @param	int	required	入力必須フラグ
	 * @param	string	zip1_id		エレメントid属性値・郵便番号1
	 * @param	string	zip2_id		エレメントid属性値・郵便番号2
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._vld_zip = function(name, required, zip1_id, zip2_id)
	{
		var error = [];

		//■エレメントデータ取得
		var zip1_obj = document.getElementById(zip1_id);	// エレメントオブジェクト
		var zip2_obj = document.getElementById(zip2_id);	// エレメントオブジェクト
		var zip1     = this._mbtrim(zip1_obj.value);		// エレメントvalue属性値
		var zip2     = this._mbtrim(zip2_obj.value);		// エレメントvalue属性値

		//■文字列置換
		zip1 = this._toHanNum(zip1);	// 全角→半角数字
		zip2 = this._toHanNum(zip2);	// 全角→半角数字

		//■文字長・フォーマットチェック
		if (required && required !== "0" && (zip1 == "" || zip2 == "")) {
			error.push("「" + name + "」に未入力があります。");
		}
		if (zip1 != "" && !VLD.num(zip1)) {
			error.push("「" + name + "」に数字以外の文字が入っています。");
		} else if (zip2 != "" && !VLD.num(zip2)) {
			error.push("「" + name + "」に数字以外の文字が入っています。");
		}
		if (zip1 != "" && zip2 != "") {
			if (zip1.length != 3 || zip2.length != 4) {
				error.push("「" + name + "」の桁数が違います。");
			}
		}

		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●バリデーション（電話（FAX）番号・テキストフィールド）
	 * @date	2010-06-30
	 * @access	private
	 * @param	string	name		項目名
	 * @param	int	required	入力必須フラグ
	 * @param	string	tel1_id		エレメントid属性値・電話番号1
	 * @param	string	tel2_id		エレメントid属性値・電話番号2
	 * @param	string	tel3_id		エレメントid属性値・電話番号3
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._vld_tel = function(name, required, tel1_id, tel2_id, tel3_id)
	{
		var error = [];

		//■エレメントデータ取得
		var tel1_obj = document.getElementById(tel1_id);	// エレメントオブジェクト
		var tel2_obj = document.getElementById(tel2_id);	// エレメントオブジェクト
		var tel3_obj = document.getElementById(tel3_id);	// エレメントオブジェクト
		var tel1     = this._mbtrim(tel1_obj.value);		// エレメントvalue属性値
		var tel2     = this._mbtrim(tel2_obj.value);		// エレメントvalue属性値
		var tel3     = this._mbtrim(tel3_obj.value);		// エレメントvalue属性値

		//■文字列置換
		tel1 = this._toHanNum(tel1);	// 全角→半角数字
		tel2 = this._toHanNum(tel2);	// 全角→半角数字
		tel3 = this._toHanNum(tel3);	// 全角→半角数字

		//■文字長・フォーマットチェック
		if (required && required !== "0" && (tel1 === "" || tel2 === "" || tel3 === "")) {
			error.push("「" + name + "」に未入力があります（市外局番も入力してください）。");
		}
		if ((tel1 !== "" && !VLD.num(tel1))
		|| (tel2 !== "" && !VLD.num(tel2))
		|| (tel3 !== "" && !VLD.num(tel3))) {
			error.push("「" + name + "」に数字以外の文字が入っています。");
		}
		if (tel1.length > 6 || tel2.length > 6 || tel3.length > 6) {
			error.push("「" + name + "」は1箇所あたり数字6文字以内で入力してください。");
		}

		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●バリデーション（メールアドレス・テキストフィールド）
	 * @date	2010-07-13
	 * @access	private
	 * @param	string	name		項目名
	 * @param	int	required	入力必須フラグ
	 * @param	string	ele_id		エレメントid属性値
	 * @param	int	maxlen		最大入力文字数（未定義|null|false|0：制限無し）
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._vld_email = function(name, required, ele_id, maxlen)
	{
		var error = [];

		//■エレメントデータ取得
		var ele_obj   = document.getElementById(ele_id);	// エレメントオブジェクト
		var ele_value = this._mbtrim(ele_obj.value);		// エレメントvalue属性値

		//■文字列置換
		ele_value = this._toHanNum(ele_value);	// 全角→半角数字

		//■文字長チェック
		var result = this._checkLength(ele_obj, ele_value, name, required, maxlen);
		if (result !== true) {
			error.push(result);
		}

		//■フォーマットチェック
		if (result === true && ele_value !== "" && !VLD.email(ele_value)) {
			error.push("「" + name + "」の書式が正しくありません。");
		}

		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●バリデーション（URL・テキストフィールド）
	 * @date	2010-07-13
	 * @access	private
	 * @param	string	name		項目名
	 * @param	int	required	入力必須フラグ
	 * @param	string	ele_id		エレメントid属性値
	 * @param	int	maxlen		最大入力文字数（未定義|null|false|0：制限無し）
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._vld_url = function(name, required, ele_id, maxlen)
	{
		var error = [];

		//■エレメントデータ取得
		var ele_obj   = document.getElementById(ele_id);	// エレメントオブジェクト
		var ele_value = this._mbtrim(ele_obj.value);		// エレメントvalue属性値

		//■文字列置換
		ele_value = this._toHanNum(ele_value);	// 全角→半角数字

		//■文字長チェック
		var result = this._checkLength(ele_obj, ele_value, name, required, maxlen);
		if (result !== true) {
			error.push(result);
		}

		//■フォーマットチェック
		if (result === true && ele_value !== "" && !VLD.url(ele_value)) {
			error.push("「" + name + "」の書式が正しくありません。");
		}

		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●バリデーション（通常ファイル名・テキストフィールド）
	 * [半角英数,_,-].[拡張子]
	 * @date	2010-07-13
	 * @access	private
	 * @param	string	name		項目名
	 * @param	int	required	入力必須フラグ
	 * @param	string	ele_id		エレメントid属性値
	 * @param	int	maxlen		最大入力文字数（未定義|null|false|0：制限無し）
	 * @param	int	minlen		最小入力文字数（未定義|null|false|0：制限無し）
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._vld_filename_normal = function(name, required, ele_id, maxlen, minlen)
	{
		var error = [];

		//■エレメントデータ取得
		var ele_obj   = document.getElementById(ele_id);	// エレメントオブジェクト
		var ele_value = this._mbtrim(ele_obj.value);		// エレメントvalue属性値

		//■文字列置換
		ele_value = this._toHanNum(ele_value);	// 全角→半角数字

		//■文字長チェック
		var result = this._checkLength(ele_obj, ele_value, name, required, maxlen, minlen);
		if (result !== true) {
			error.push(result);
		}

		//■フォーマットチェック
		if (result === true && ele_value !== "" && !VLD.filenameNormal(ele_value)) {
			error.push("「" + name + "」の書式が正しくありません。");
		}

		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●バリデーション（ASCII印字可能文字・テキストフィールド）
	 * 制御文字以外の空白を含むASCII。
	 * @date	2010-11-03
	 * @access	private
	 * @param	string	name		項目名
	 * @param	int	required	入力必須フラグ
	 * @param	string	ele_id		エレメントid属性値
	 * @param	int	maxlen		最大入力文字数（未定義|null|false|0：制限無し）
	 * @param	int	minlen		最小入力文字数（未定義|null|false|0：制限無し）
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._vld_ascii_print = function(name, required, ele_id, maxlen, minlen)
	{
		var error = [];

		//■エレメントデータ取得
		var ele_obj   = document.getElementById(ele_id);	// エレメントオブジェクト
		var ele_value = ele_obj.value;				// エレメントvalue属性値（トリミング無し！）

		//■文字列置換
		ele_value = this._toHanNum(ele_value);	// 全角→半角数字

		//■文字長チェック
		var result = this._checkLength(ele_obj, ele_value, name, required, maxlen, minlen);
		if (result !== true) {
			error.push(result);
		}

		//■フォーマットチェック
		if (result === true && ele_value !== "" && !VLD.asciiPrint(ele_value)) {
			error.push("「" + name + "」にASCII印字可能文字（空白を含む）以外の文字が入っています。");
		}

		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●バリデーション（ASCII図形文字・テキストフィールド）
	 * 制御文字・空白以外のASCII。
	 * @date	2010-07-13
	 * @access	private
	 * @param	string	name		項目名
	 * @param	int	required	入力必須フラグ
	 * @param	string	ele_id		エレメントid属性値
	 * @param	int	maxlen		最大入力文字数（未定義|null|false|0：制限無し）
	 * @param	int	minlen		最小入力文字数（未定義|null|false|0：制限無し）
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._vld_ascii_graph = function(name, required, ele_id, maxlen, minlen)
	{
		var error = [];

		//■エレメントデータ取得
		var ele_obj   = document.getElementById(ele_id);	// エレメントオブジェクト
		var ele_value = this._mbtrim(ele_obj.value);		// エレメントvalue属性値

		//■文字列置換
		ele_value = this._toHanNum(ele_value);	// 全角→半角数字

		//■文字長チェック
		var result = this._checkLength(ele_obj, ele_value, name, required, maxlen, minlen);
		if (result !== true) {
			error.push(result);
		}

		//■フォーマットチェック
		if (result === true && ele_value !== "" && !VLD.asciiGraph(ele_value)) {
			error.push("「" + name + "」にASCII図形文字以外の文字が入っています。");
		}

		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●バリデーション（通常ASCII・テキストフィールド）
	 * @date	2010-07-13
	 * @access	private
	 * @param	string	name		項目名
	 * @param	int	required	入力必須フラグ
	 * @param	string	ele_id		エレメントid属性値
	 * @param	int	maxlen		最大入力文字数（未定義|null|false|0：制限無し）
	 * @param	int	minlen		最小入力文字数（未定義|null|false|0：制限無し）
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._vld_ascii_normal = function(name, required, ele_id, maxlen, minlen)
	{
		var error = [];

		//■エレメントデータ取得
		var ele_obj   = document.getElementById(ele_id);	// エレメントオブジェクト
		var ele_value = this._mbtrim(ele_obj.value);		// エレメントvalue属性値

		//■文字列置換
		ele_value = this._toHanNum(ele_value);	// 全角→半角数字

		//■文字長チェック
		var result = this._checkLength(ele_obj, ele_value, name, required, maxlen, minlen);
		if (result !== true) {
			error.push(result);
		}

		//■フォーマットチェック
		if (result === true && ele_value !== "" && !ele_value.match(/^[0-9a-zA-Z_\-]+$/)) {
			error.push("「" + name + "」に半角英数・アンダーバー（_）・ハイフン（-）以外の文字が入っています。");
		}

		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●バリデーション（セレクトボックス）
	 * @date	2010-03-17
	 * @access	private
	 * @access	protected
	 * @param	string	name		項目名
	 * @param	int	required	選択必須フラグ
	 * @param	string	ele_id		エレメントid属性値
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._vld_select = function(name, required, ele_id)
	{
		var error = [];

		var ele_obj   = document.getElementById(ele_id);	// エレメントオブジェクト
		var ele_value = ele_obj.value;				// エレメントvalue属性値

		if (required && required !== "0" && ele_value === "0") {
			error.push("「" + name + "」が未選択です。");
		}

		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●バリデーション（年月日・セレクトボックス）
	 * @date	2010-03-17
	 * @access	private
	 * @param	string	name		項目名
	 * @param	int	required	入力必須フラグ
	 * @param	string	y_id		エレメントid属性値・年
	 * @param	string	m_id		エレメントid属性値・月
	 * @param	string	d_id		エレメントid属性値・日
	 * @param	string	start		範囲始め（yyyymmdd）
	 * @param	string	end		範囲終わり（yyyymmdd）
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._vld_ymd = function(name, required, y_id, m_id, d_id, start, end)
	{
		var error = [];

		var y_obj = document.getElementById(y_id);	// エレメントオブジェクト
		var m_obj = document.getElementById(m_id);	// エレメントオブジェクト
		var d_obj = document.getElementById(d_id);	// エレメントオブジェクト
		var y     = y_obj.value;			// エレメントvalue属性値
		var m     = m_obj.value;			// エレメントvalue属性値
		var d     = d_obj.value;			// エレメントvalue属性値

		if (y == 0 || m == 0 || d == 0) {
			if (required && required !== "0") {
				error.push("「" + name + "」に未選択があります。");
			}
		} else {
			if ((d == 31 && (m == 4 || m == 6 || m == 9 || m == 11))
			 || (m == 2 && d >= 29 && !VLD.leapYear(y))
			 || (m == 2 && d >= 30 && VLD.leapYear(y))) {
				error.push("「" + name + "」に存在しない日付が設定されています。");
			}

			var ymd = BASIC.joinDate(y, m, d);
			if (start && ymd < start) {
				start = "" + start;
				start_y = parseInt(start.substr(0, 4), 10);
				start_m = parseInt(start.substr(4, 2), 10);
				start_d = parseInt(start.substr(6, 2), 10);
				error.push("「" + name + "」は" + start_y + "年" + start_m + "月" + start_d + "日以降の日付を設定して下さい。");
			}
			if (end && ymd > end) {
				end = "" + end;
				end_y = parseInt(end.substr(0, 4), 10);
				end_m = parseInt(end.substr(4, 2), 10);
				end_d = parseInt(end.substr(6, 2), 10);
				error.push("「" + name + "」は" + end_y + "年" + end_m + "月" + end_d + "日以前の日付を設定して下さい。");
			}
		}

		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ●●●バリデーション（チェックボックス）
	 * @date	2010-04-27
	 * @access	private
	 * @access	protected
	 * @param	string	name		項目名
	 * @param	int	required	選択必須数
	 * @param	string	ele_name	エレメントname属性値（idじゃない！）
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._vld_checkbox = function(name, required, ele_name)
	{
		var error = [];

		var eles = document.getElementsByName(ele_name);
		var check_num = BASIC.getCheckNum(eles);	// チェック数

		if (required && required !== "0") {
			if (check_num === 0) {
				error.push("「" + name + "」が未選択です。");
			} else if (check_num < required) {
				error.push("「" + name + "」の選択数が足りません。");
			}
		}

		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■マルチバイトトリミング
	 * @date	2010-03-24
	 * @access	private
	 * @param	string	str	対象文字列
	 * @return	string		処理後文字列
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._mbtrim = function(str)
	{
		return str.replace(/^(\s+|　)+|(\s+|　)+$/g, "");
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■全角数字を半角数字に変換
	 * @date	2010-02-22
	 * @access	private
	 * @param	string	str	対象文字列
	 * @return	string		処理後文字列
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype._toHanNum = function(str)
	{
		var han = "0123456789";
		var zen = "０１２３４５６７８９";
		var dst = "";
		var c;
		var n;
		for (var i = 0; i < str.length; i++) {
			c = str.charAt(i);
			n = zen.indexOf(c,0);
			if (n >= 0) {
				c = han.charAt(n);
			}
			dst += c;
		}
		return dst;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■エラー有無
	 * @date	2010-02-18
	 * @access	public
	 * @param	void
	 * @return	bool			true(エラー有) or false(エラー無)
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype.isError = function()
	{
		return (this.error.length);
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■エラーメッセージ取得
	 * @date	2008-12-22
	 * @access	public
	 * @param	bool	reset		エラー文格納配列初期化フラグ
	 * @return	array			エラー文格納配列（エラーが無ければ空配列）
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype.getError = function(reset)
	{
		var error = this.error;
		if (reset) {
			this.error = [];	// エラー文格納配列を空にする
		}
		return error;
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■エラーメッセージ追加
	 * @date	2009-04-20
	 * @access	public
	 * @param	string	error		エラー文
	 * @param	string	ele_id		フォーカスするエレメントid属性値
	 * @return	void
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype.setError = function(error, ele_id)
	{
		if (ele_id !== undefined && this.error_first_ele === null) {
			this.error_first_ele = ele_id;
		}
		this.error = this.error.concat(error);
	}

	/**
	 *--------------------------------------------------------------------------------
	 * ■■■エラーメッセージ・アラート表示
	 * @date	2008-02-25
	 * @access	public
	 * @param	bool	reset		エラー文格納配列初期化フラグ
	 * @return	bool
	 *--------------------------------------------------------------------------------
	 */
	VLD_input.prototype.alertError = function(reset)
	{
		var error = this.error;
		if (reset) {
			this.error = [];	// エラー文格納配列を空にする
		}

		if (error.length) {
			for (var i in error) {
				error[i] = "・" + error[i];
			}

			alert(error.join("\n\n"));
			if (this.error_first_ele) {
				document.getElementById(this.error_first_ele).focus();
			}
			return false;
		}

		return true;
	}




