/* 
******************************************************************************
  Filename    : common.js
  Language    : JavaScript
  
  Description : 共通
  ==============================================================================
  Change Log  :
  
  Date:         Ver:        Description:
  ------------------------------------------------------------------------------
  2005/10/27	1.00	    Hishikawa@LimeNet
  2006/02/17    1.01        Hishikawa@LimeNet
****************************************************************************** 
*/

//==============================================================================
//グローバル変数
//==============================================================================

//クライアントOS・ブラウザ
var g_cl_os = null;
var g_cl_browser = null;

//文字列チェックで、「'」「"」「\」を許可するか
var g_allow_quote = false;

//ハイフンの必須フラグ
//→null:ハイフン有り無し可
//  true:ハイフン必須
//  false:ハイフン不要
var g_ness_bar_zip = null;		//郵便番号
var g_ness_bar_tel = null;		//電話・FAX番号

//******************************************************************************
// <summary> document.getElementByIdのラッパー
// <param  > eid : 要素ID
// <returns> 該当要素
// <remarks> 
function get_e(eid)
{
	return document.getElementById(eid);
}


//******************************************************************************
// <summary> ロケーションのURLより、クエリを取得する
// <param  > loc : ロケーションオブジェクト
// <returns> クエリストリング配列(hash)
//             →PHPの連想配列と同様
// <remarks> 
function get_qs(loc)
{
	var arr_ret = new Array();

	if (loc == null)
	{
		loc = document.location;
	}

	var QS = new Array;
	
	//クエリがある場合
	if (loc.search.length > 1)
	{
		//「?」を除き、「&」でクエリ要素を展開
		var arr_prm = location.search.substr(1).split("&");
		
		for (var i = 0; i < arr_prm.length; i++)
		{
			//「=」で展開
			var arr_tmp = arr_prm[i].split("=");
		
			//hash配列要素を生成
			arr_ret[arr_tmp[0]] = arr_tmp[1];
		}
	}
	
	return arr_ret;
}

//******************************************************************************
// <summary> クライアントのOSを判別する
// <param  > 
// <returns>
// <remarks> 
function judge_os()
{	
	//判別済の場合
	if (g_cl_os != null)
	{
		return g_cl_os;
	}

	// Macintosh
	if (navigator.userAgent.indexOf('Macintosh') >= 0 || navigator.userAgent.indexOf('Mac') >= 0)
	{
		return "MAC";
	}
	// Windows
	else if (navigator.userAgent.indexOf('Windows') >= 0 || navigator.userAgent.indexOf('Win') >= 0 )
	{
		return "WIN";
	}
	// Unix
	else
	{
		return "UNIX";
	}
}

//******************************************************************************
// <summary> クライアントのブラウザを判別する
// <param  > 
// <returns>
// <remarks> 
function judge_browser()
{
	//判別済の場合
	if (g_cl_browser != null)
	{
		return g_cl_browser;
	}

	// IE
	if (navigator.appName.indexOf('Microsoft') >= 0 || navigator.appName.indexOf('Explorer') >= 0)
	{
		return "IE";
	}
	// Firefox
	else if (navigator.userAgent.indexOf('Firefox') >= 0)
	{
		return "FIREFOX";
	}
	// Safari
	else if (navigator.userAgent.indexOf('Safari') >= 0)
	{
		return "SAFARI";
	}
	//その他
	else
	{
		return "OTHER";
	}
}



//******************************************************************************
// <summary> 属性値を取得する
// <param  > element   : 要素インスタンス(object) または 要素ID名
//           attribute : 取得する属性名
// <returns> 該当要素の該当属性の値 / null
// <remarks> 不正引数、該当要素なしの場合はNULLを返す
function get_attr(element,attribute)
{

	//パラメータがNULLの場合
	if (element == null || attribute == null)
	{
		return null;
	}

	//[element]のタイプで分岐
	switch (typeof(element))
	{
		case "string":
			
			//引数が要素IDとして、該当要素を取得
			element = document.getElementById(element);
			
			//該当要素がない場合
			if (element == null)
			{
				return null;
			}
			
			break;
			
		case "object":
		
			//要素インスタンスとして扱う(特になにもしない)
		
			break;
			
		default:
			return null;
	}
	
	//クライアントOSを取得
	var cl_os = judge_os();
	
	//クライアントブラウザを取得
	var cl_br = judge_browser();
	
	//戻り値
	var ret = "";
	
		
	//MAC ========================================================
	if (cl_os == "MAC")
	{
		//ブラウザで分岐
		switch (cl_br)
		{
			//IE  -------------------------------------------
			case "IE":
				
				ret = element.getAttribute(attribute)
				break;
				
			//Safari-----------------------------------------
			case "SAFARI":
			
				ret = element.getAttribute(attribute)
				break;
				
			//Firefox、など
			default:
			
				//form要素の任意属性を取得
				attr = element.attributes[attribute];
				
				//該当の属性が無い場合
				if (attr == null)
				{
					ret = null;
				}
				else
				{
					//取得した任意属性に格納されたチェックパラメータを取得
					ret = attr.value;
				}				
				
				break;
		}
	}
	//Windows、Linux ==============================================
	else
	{
		//form要素の任意属性を取得
		attr = element.attributes[attribute];
		
		//該当の属性が無い場合
		if (attr == null)
		{
			ret = null;
		}
		else
		{
			//取得した任意属性に格納されたチェックパラメータを取得
			ret = attr.value;
		}
	}

	return ret;
}

//******************************************************************************
// <summary> フォームを取得する
// <param  > index : フォームインデックス、または、フォームID属性
// <returns>
// <remarks> 
function get_form(index)
{
	//パラメータ取得
	index = (index == null ? 0 : index);
	
	//数値でない場合
	if (isNaN(index))
	{
		//フォームのIDから取得
		//→[strict]では、<form name="">属性は非推奨
		return document.getElementById(index);
	}
	//数値の場合
	else
	{
		//フォームインデックスから取得
		return document.forms[index];
	}
}

//******************************************************************************
// <summary> 引数の名前の要素を取得する
// <param  > name : 要素名
//           form : フォーム
// <returns> 要素(オブジェクト)
// <remarks> PHPでは配列要素(name[])が設定できるがjavascriptだと、
//           その名前では参照できないので、この手法を用いる
function get_element_by_name(name,form)
{
 	if (form == null)
 	{
 		form = get_form();
 	}
 	
 	for (var i=0; i < form.elements.length; i++)
 	{
 		//各要素で、名前が一致する場合
  		if (form.elements[i].name == name)
  		{
  			//要素を返す
			return form.elements[i];
  		}
	}
	
	return null;
}

//******************************************************************************
// <summary> 引数の名前の要素に値を設定する
// <param  > name       : 要素名
//           val        : 値
//           form_index : フォームインデックス
// <returns> 
// <remarks> PHPでは配列要素(name[])が設定できるがjavascriptだと、
//           その名前では参照できないので、この手法を用いる
function set_element_by_name(name,val,form_index)
{
	//フォーム取得
	form = get_form(form_index);
 	
 	
 	for (var i=0; i < form.elements.length; i++)
 	{
 		//各要素で、名前が一致する場合
  		if (form.elements[i].name == name)
  		{
  			//要素に値を設定する
			form.elements[i].value = val;
  		}
	}
}


//******************************************************************************
// <summary> 日付選択リストに現在日付を設定
// <param  > year_name    : 年の要素名
//           month_name   : 月の要素名
//           day_name     : 日の要素名
//           hour_name    : 時の要素名
//           minute_name  : 分の要素名
//           second_name  : 秒の要素名
//           diff_year    : 西暦を年号にする際の差引く年数
//                          →平成にする場合は、西暦-1988
// <returns>
// <remarks> 
function set_current_date(year_name,month_name,day_name,hour_name,minute_name,second_name,diff_year)
{
	//日付オブジェクト生成
	var d = new Date();
	
	//年月日を取得
	year = d.getFullYear();
	month = (d.getMonth() + 1);
	day = d.getDate();
	hour = d.getHours();
	minute = d.getMinutes();
	second = d.getSeconds();
	
	//差引年数が設定されている場合
	if (diff_year != null)
	{
		year = year - diff_year;
	}
	
	//月日を桁埋
	//year = (year < 10 ? '0' + year : year);
	month = (month < 10 ? '0' + month : month);
	day = (day < 10 ? '0' + day : day);
	hour = (hour < 10 ? '0' + hour : hour);
	minute = (minute < 10 ? '0' + minute : minute);
	second = (second < 10 ? '0' + second : second);
	
	//日付選択リストに当日の日付を設定
	set_element_by_name(year_name,year);
	set_element_by_name(month_name,month);
	set_element_by_name(day_name,day);
	if (hour_name != null)
	{
		set_element_by_name(hour_name,hour);
	}
	if (minute_name != null)
	{
		set_element_by_name(minute_name,minute);
	}
	if (second_name != null)
	{
		set_element_by_name(second_name,second);
	}
	
	return true;
}

//******************************************************************************
// <summary> 日付選択リストに、現在の日付に指定日数後の日付を設定する
// <param  > year_name    : 年の要素名
//           month_name   : 月の要素名
//           day_name     : 日の要素名
//           hour_name    : 時の要素名
//           minute_name  : 分の要素名
//           second_name  : 秒の要素名
//           add_day      : 加算する日数
// <returns> 
// <remarks> 
function set_add_date(year_name,month_name,day_name,add_day)
{
	//加算日が未設定の場合
	if (add_day == null)
	{
		add_day = 0;
	}
	
	//日付オブジェクト生成
	var d = new Date();
	
	//年月日を取得
	year = d.getFullYear();
	month = (d.getMonth() + 1);
	day = d.getDate();
	
	//加算日を取得
	ds = new Date(year,month-1,day + add_day)

	//日付加算
	year = ds.getFullYear();
	month = (ds.getMonth() + 1);
	day = ds.getDate();

	//月日を桁埋
	//year = (year < 10 ? '0' + year : year);
	month = (month < 10 ? '0' + month : month);
	day = (day < 10 ? '0' + day : day);

	//日付選択リストに当日の日付を設定
	set_element_by_name(year_name,year);
	set_element_by_name(month_name,month);
	set_element_by_name(day_name,day);
	
	return true;
}

//******************************************************************************
// <summary> 日付選択リストをクリアする
// <param  > year_name    : 年の要素名
//           month_name   : 月の要素名
//           day_name     : 日の要素名
// <returns> 
// <remarks> 
function clear_date(year_name,month_name,day_name)
{
	set_element_by_name(year_name,'');
	set_element_by_name(month_name,'');
	set_element_by_name(day_name,'');
	
	return true;	
}

//******************************************************************************
// <summary> ポップアップ画面をオープンする
// <param  > path       : オープンするページのパス
//           note       : 備考(常に新規ウィンドウを表示する場合は「_blank」)
//           width      : 幅
//           heigth     : 高さ
//           scrollbars : スクロールバー表示(true/false)
//           toolbar    : ツールバー表示(true/false)
//           location_  : ロケーション(true/false)
//           top        : ウィンドウの上位置
//           left       : ウィンドウの左位置
//           rthandle   : 開いたウインドウのハンドルを返すか(true/false)
// <returns> なし or 開いたウィンドウのハンドル
// <remarks> 
function open_window(path,note,width,height,scrollbars,toolbar,location_,top,left,rthandle)
{
	//幅、高さを設定
	var wx = (width == null ? 600 : width);
	var wy = (height == null ? 400 : height);
	
	//位置を設定
	var x = (left == null ? (screen.width - wx) / 2 : left);
	var y = (top == null ? (screen.height - wy) / 2 : top);
	
	//スクロールバー
	scrollbars = (scrollbars == null || scrollbars == false  ? "no" : "yes");
	
	//ツールバー
	toolbar = (toolbar == null || toolbar == false  ? "no" : "yes");

	//ロケーション
	location_ = (location_ == null || location_ == false  ? "no" : "yes");

	//オープン	
	var handle = window.open(path,
		            		  note, 
				              "scrollbars=" + scrollbars + 
				              ",toolbar=" + toolbar +
				              ",location=" + location_ +
			    	          ",directories=no" +
			        	      ",left=" + x +  
			            	  ",top=" + y + 
			            	  ",width=" + wx + 
			            	  ",height=" + wy);

	
	//ハンドルを返す場合
	if (rthandle)
	{
		return handle;
	}
	else
	{
		return;
	}
}


//******************************************************************************
// <summary> 一括チェックオン・オフ
// <param  > name       : 要素名
//           form_index : フォームインデックス
// <returns> 
// <remarks> 
function checkall(name,form_index)
{
	var index = (form_index == null ? 0 : form_index);

	// フォームのエレメント数取得
	var e       = get_form(index).elements;
	var l       = e.length;
	
	// デフォルトでフォルスに
	var checked = false;
	
	// 見つける名前を設定
	//var eval = val+ "[]";
	var eval = name;

	// trueにするかfalseにするかを決める
	for(var i = 0 ; i < l ; i ++ )
	{
		var ename = e[i].name;
		if( ename == eval && !e[i].checked)
		{
			checked = true;
		}
	}
	
	// 最終処理
	for(var i = 0 ; i < l ; i ++ )
	{
		var ename = e[i].name;
		if( ename == eval)
		{
			e[i].checked = checked;
		}
	}
}

//******************************************************************************
// <summary> 一括チェックオン・オフ拡張
// <param  > name       : 要素名
//           target     : 対象属性値
//                          →[chktgt]属性に設定された値と一致するもののみを対象とする
// <returns> 
// <remarks> 
function checkall_ex(name,target)
{
	//該当要素名の要素を取得
	var arr_e = document.getElementsByName(name);

	// デフォルトでフォルスに
	var checked = false;

	//対象属性が未設定の場合
	if (target == null)
	{
		//trueにするかfalseにするかを決める
		for (var i = 0; i < arr_e.length; i++)
		{
			//未チェックがある場合
			if (!arr_e[i].checked)
			{
				//チェックONとする
				checked = true;
				break;
			}
		}
		
		//チェック処理
		for (var i = 0; i < arr_e.length; i++)
		{
			arr_e[i].checked = checked;
		}		
	}
	//設定されている場合
	else
	{
		//trueにするかfalseにするかを決める
		for (var i = 0; i < arr_e.length; i++)
		{
			//該当要素の[chktgt]属性値を取得
			var chktgt_val = get_attr(arr_e[i],"chktgt");
			
			//未設定の場合
			if (chktgt_val == null || chktgt_val.length == 0)
			{
				continue;
			}
			
			//指定ターゲットと異なる場合
			if (chktgt_val != target)
			{
				continue;
			}
		
			//未チェックがある場合
			if (!arr_e[i].checked)
			{
				//チェックONとする
				checked = true;
				break;
			}
		}
		
		//チェック処理
		for (var i = 0; i < arr_e.length; i++)
		{
			//該当要素の[chktgt]属性値を取得
			var chktgt_val = get_attr(arr_e[i],"chktgt");
			
			//未設定の場合
			if (chktgt_val == null || chktgt_val.length == 0)
			{
				continue;
			}
			
			//指定ターゲットと異なる場合
			if (chktgt_val != target)
			{
				continue;
			}
					
			arr_e[i].checked = checked;
		}	
	}
}

/* 
//******************************************************************************
// <summary> チェックボックスが、チェックされているか(ver1)
// <param  > name : 要素名
//           form_index : フォームインデックス
// <returns> 
// <remarks> 
function is_checked(name,form_index)
{
	var index = (form_index == null ? 0 : form_index);

	// フォームのエレメント数取得
	var e       = get_form(index).elements;
	var l       = e.length;

	//全エレメントループ
	for(var i = 0 ; i < l ; i ++ )
	{
		//要素名が一致し、チェックされている場合
		if(e[i].name == name && e[i].checked)
		{
			return true;
		}
	}
	
	return false;
}
*/

//******************************************************************************
// <summary> チェックボックスが、チェックされているか(ver2)
// <param  > name : 要素名
// <returns> 
// <remarks> ver1よりこっちの方が速い
function is_checked(name)
{
	//該当要素名の要素を取得
	var arr_e = document.getElementsByName(name);

	//全エレメントループ
	for(var i = 0; i < arr_e.length; i++)
	{
		//1つでもチェックされている場合
		if (arr_e[i].checked == true)
		{
			return true;
		}
	}

	return false;
}

//******************************************************************************
// <summary> チェックボックスが、チェックされている数を返す
// <param  > name : 要素名
// <returns> 
// <remarks> 
function get_checked_cnt(name)
{
	var ret = 0;

	//該当要素名の要素を取得
	var arr_e = document.getElementsByName(name);

	//全エレメントループ
	for(var i = 0; i < arr_e.length; i++)
	{
		//チェックされている場合
		if (arr_e[i].checked == true)
		{
			ret++;
		}
	}

	return ret;;
}

//******************************************************************************
// <summary> 指定した名前のチェック要素から、チェックされた値のみを配列で取得する
// <param  > target : 要素名
// <returns> チェック済項目の値の配列
// <remarks>
function get_checked_arr(name)
{
	var arr_ret = new Array();
	
	//要素を取得
	var arr_e = document.getElementsByName(name);
	
	//全ループ
	for (var i = 0; i < arr_e.length; i++)
	{
		//チェックされていない場合
		if (!arr_e[i].checked)
		{
			//次へ
			continue;
		}
		
		//該当要素を配列へ格納
		arr_ret.push(arr_e[i].value);
	}
	
	return arr_ret;
}

/*
//******************************************************************************
// <summary> ファイルの拡張子が指定拡張子と一致するか
// <param  > path : ファイルパス
//           ext  : 拡張子(パイプで区切る)
// <returns>
// <remarks> (例) ext : 「jpe?g|gif|bmp」
function check_ext(path,ext)
{
	if (path == null || ext == null)
	{
		return false;
	}
	
	//拡張子のマッチング
	if(path.match(ext)
	{
		return true;
	}
	else
	{
		return false;
	}
}
*/

//******************************************************************************
// <summary> ファイルの拡張子がPDFかどうか
// <param  > path : ファイルパス
// <returns>
// <remarks> 正規表現の部分はパラメータ化できないの？
function check_pdf(path)
{
	if (path == null)
	{
		return false;
	}

	//拡張子のマッチング
	return path.match(/\.(pdf)$/i);
}

//******************************************************************************
// <summary> ファイルの拡張子が画像かどうか
// <param  > path : ファイルパス
// <returns>
// <remarks> 正規表現の部分はパラメータ化できないの？
function check_img(path)
{
	if (path == null)
	{
		return false;
	}
	
	//拡張子のマッチング
	return path.match(/\.(jpe?g|gif|bmp)$/i);

}

//******************************************************************************
// <summary> 指定したID名のラジオ項目から、選択されている要素を取得する
// <param  > id        : radio要素のID名(連番の添え字は除く)
//           start_idx : 開始インデックス
//           end_idx   : 終了インデックス
// <returns>
// <remarks> 要素のID名は、数値の連番で割り振られていること
function get_selected_radio(id,start_idx,end_idx)
{
	//ID名が未設定の場合
	if (id == null || id.length == 0)
	{
		return null;
	}
	
	//開始インデックスが未設定の場合
	if (start_idx == null)
	{
		start_idx = 1;
	}
	
	//終了インデックスが未設定の場合
	if (end_idx == null)
	{
		end_idx = 100;
	}
	
	//指定範囲回数ループ
	for (var i = start_idx; i <= end_idx; i++)
	{
		//ID名取得
		id_name = id + i;

		//該当の要素を取得
		//IEだと変数名が「item」の場合エラーになる
		itm = document.getElementById(id_name);

		//該当要素が無い場合
		if (itm == null)
		{
			break;
		}
		
		//該当要素が選択されている場合
		if (itm.checked == true)
		{
			return itm;
		}
	}
	
	return null;
}

//******************************************************************************
// <summary> 指定した要素名の選択されている要素を取得する
// <param  > ename : 要素名
// <returns>
// <remarks> 
function get_checked_item_by_name(ename)
{
	if (ename == null)
	{
		return null;
	}

	//該当要素を取得
	var arr_e = document.getElementsByName(ename);
	
	//全ループ
	for (var i = 0; i < arr_e.length; i++)
	{
		//チェックされている場合
		if (arr_e[i].checked)
		{
			return arr_e[i];
		}
	}
	
	return null;
}


//******************************************************************************
// <summary> フォーム入力値チェック
// <param  > form_index : フォームインデックス
//           attribute  : 下記チェックモードを設定する任意属性
//                       　 ※省略時はを「chkmode」デフォルト
//           to_str     : 汎用チェックモードの変換後の文字列
//                        　※「i」を指定した場合、「num_x」→「num_i」として動作する
// <returns> true/false
// <remarks> 
//           htmlソースのフォームのエレメントの任意属性に、
//           以下の値を設定することで入力値のチェックを行う(禁則文字チェック含む)
//
//           チェックエラーとなった場合は、警告メッセージを表示し、
//           フォーカスを設定し、選択状態にする
//
//           ※任意属性に設定するチェックモード
//               num_i  :必須数値       num_n  : 任意数値       num_x  : 汎用数値 
//               alp_i  :必須半角文字   alp_n  : 任意半角文字   alp_x  : 汎用半角文字
//               str_i  :必須文字列     str_n  : 任意文字列     str_x  : 汎用文字列
//               mail_i :必須メール     mail_n : 任意メール     mail_x : 汎用メール
//               url_i  :必須URL        url_n  : 任意URL        url_x  : 汎用URL
//               sel_i  :必須選択       sel_n  : 任意選択       sel_x  : 汎用選択
//               tel_i  :必須電話       tel_n  : 任意電話       tel_x  : 汎用電話
//               zip_i  :必須郵便番号   zip_n  : 任意郵便番号   zip_x  : 汎用郵便番号
//               chk_i  :必須チェック   chk_n  : 任意チェック   chk_x  : 汎用チェック
//               date_i :必須日付       date_n : 任意日付       date_x : 汎用日付
//
//           ※[minlength][maxlength]属性により、最低入力桁数チェックが可能
//             以下の[chkmode]属性が設定されている要素に限る
//             →[num_*][alp_*][str_*]
//           ※[date_i]のチェック対象は「yyyy/mm/dd」書式
function check_form(form_index,attribute,to_str)
{
	//メッセージ
	var msg_hissu =     "必須項目が未入力です。入力してください";
	var msg_hissu_sel = "必須項目が未選択です。リストから選択してください";
	var msg_alp =       "半角英数字を入力してください";
	var msg_num =       "半角数字を入力してください";
	var msg_mail =      "正しいメールアドレスを入力してください";
	var msg_url =       "正しいURLを入力してください";
	var msg_tel =       "正しい電話(FAX)番号を入力してください";
	var msg_zip =       "正しい郵便番号番号を入力してください";
	var msg_err_str =   "禁則文字[ " + (g_allow_quote == true ? "| : ; ? *" : "\' \" \\ | : ; ? *") + " ]は入力できません";
	var msg_len =   	"正しい入力桁数(文字数)を入力して下さい";
	var msg_hissu_chk = "必須項目が未チェックです。いずれかにチェックしてください";
	var msg_chked_cnt =   "チェックされた項目数が不正です";
	var msg_date =      "正しい日付を入力してください";

	//フォームを取得
	var form = get_form(form_index);

	//属性が、NULLまたは空文字の場合
	if (attribute == null || attribute.length == 0)
	{
		//デフォルト属性を設定
		attribute = 'chkmode';
	}

	//要素数分ループ
	for(var i = 0; i < form.elements.length; i++)
	{
		/* チェックパラメータ取得 */
		//*****************************************************************************
		
		//該当する要素のチェック属性を取得
		var mychkmode = get_attr(form.elements[i],attribute);

		//チェックパラメータが設定されていない場合
		if (mychkmode == null || mychkmode.length == 0)
		{
			//次要素へ
			continue;
		}
		
		//変換後文字列が設定されている場合
		if (to_str != null && to_str.length != 0)
		{
			mychkmode = mychkmode.replace('_x','_' + to_str);
		}
		
		//最低文字数属性の値を取得
		var minlength = get_attr(form.elements[i],'minlength');
		
		//未設定の場合はnullに統一
		if (minlength == null || minlength.length == 0)
		{
			minlength = null;
		}
		
		//最低文字数属性の値を取得
		var maxlength = get_attr(form.elements[i],'maxlength');
		
		//未設定の場合はnullに統一
		if (maxlength == null || maxlength.length == 0)
		{
			maxlength = null;
		}
			

		/* チェックメイン */
		//*****************************************************************************

		//form要素の値を取得
		myvalue = form.elements[i].value;



		//チェックパラメータで分岐
		switch(mychkmode)
		{
			//数値チェック------------------//
			case "num_i":
			
				if(myvalue.length == 0)
				{
					alert(msg_hissu);
					form.elements[i].focus();
					return false;
				}
				else
				{
					if (!check_len(myvalue,minlength,maxlength))
					{
						alert(msg_len + get_min_max_err_msg(minlength,maxlength));
						form.elements[i].focus();
						form.elements[i].select();
						return false;
					}
					
					if(!check_num(myvalue))
					{
						alert(msg_num);
						form.elements[i].focus();
						form.elements[i].select();
						return false;
					}
				}
				break;
			
			case "num_n":

				if (myvalue.length == 0)
				{
					break;
				}

				if (!check_len(myvalue,minlength,maxlength))
				{
					alert(msg_len + get_min_max_err_msg(minlength,maxlength));
					form.elements[i].focus();
					form.elements[i].select();
					return false;
				}
			
				if(!check_num(myvalue))
				{
					alert(msg_num);
					form.elements[i].focus();
					form.elements[i].select();
					return false;
				}
				break;
			
			//英数字チェック----------------//
			case "alp_i":
			
				if(myvalue.length == 0)
				{
					alert(msg_hissu);
					form.elements[i].focus();
					return false;
				}
				else
				{
					if (!check_len(myvalue,minlength,maxlength))
					{
						alert(msg_len + get_min_max_err_msg(minlength,maxlength));
						form.elements[i].focus();
						form.elements[i].select();
						return false;
					}				
				
					if(!check_alphanumeric(myvalue))
					{
						alert(msg_alp);
						form.elements[i].focus();
						form.elements[i].select();
						return false;
					}
					
					if(!check_special_str(myvalue))
					{
						alert(msg_err_str);
						form.elements[i].focus();
						form.elements[i].select();
						return false;
					}
				}
				break;
			
			case "alp_n":
			
				if (myvalue.length == 0)
				{
					break;
				}
			
				if (!check_len(myvalue,minlength,maxlength))
				{
					alert(msg_len + get_min_max_err_msg(minlength,maxlength));
					form.elements[i].focus();
					form.elements[i].select();
					return false;
				}		
			
				if(!check_alphanumeric(myvalue))
				{
					alert(msg_alp);
					form.elements[i].focus();
					form.elements[i].select();
					return false;
				}
				
				if(!check_special_str(myvalue))
				{
					alert(msg_err_str);
					form.elements[i].focus();
					form.elements[i].select();
					return false;
				}
				break;
			
			//文字列チェック----------------//
			case "str_i":
			
				if(myvalue.length == 0)
				{
					alert(msg_hissu);
					form.elements[i].focus();
					return false;
				}
				
				if (!check_len(myvalue,minlength,maxlength))
				{
					alert(msg_len + get_min_max_err_msg(minlength,maxlength));
					form.elements[i].focus();
					form.elements[i].select();
					return false;
				}
				
				if(!check_special_str(myvalue))
				{
					alert(msg_err_str);
					form.elements[i].focus();
					form.elements[i].select();
					return false;
				}
				break;
			
			case "str_n":
			
				if (myvalue.length == 0)
				{
					break;
				}
				
				if (!check_len(myvalue,minlength,maxlength))
				{
					alert(msg_len + get_min_max_err_msg(minlength,maxlength));
					form.elements[i].focus();
					form.elements[i].select();
					return false;
				}
			
				if(!check_special_str(myvalue))
				{
					alert(msg_err_str);
					form.elements[i].focus();
					form.elements[i].select();
					return false;
				}
				break;
			
			//メールチェック----------------//
			case "mail_i":
			
				if(myvalue.length == 0)
				{
					alert(msg_hissu);
					form.elements[i].focus();
					return false;
				}
				else
				{
					if(!check_mail(myvalue))
					{
						alert(msg_mail);
						form.elements[i].focus();
						form.elements[i].select();
						return false;
					}
				}
				break;
			
			case "mail_n":

				if(myvalue.length != 0)
				{
					if(!check_mail(myvalue))
					{
						alert(msg_mail);
						form.elements[i].focus();
						form.elements[i].select();
						return false;
					}
				}
				break;
				
			//URLチェック----------------//
			case "url_i":
			
				if(myvalue.length == 0)
				{
					alert(msg_hissu);
					form.elements[i].focus();
					return false;
				}
				else
				{
					if(!check_url(myvalue))
					{
						alert(msg_url);
						form.elements[i].focus();
						form.elements[i].select();
						return false;
					}
				}
				break;
			
			case "url_n":
			
				if(myvalue.length != 0)
				{
					if(!check_url(myvalue))
					{
						alert(msg_url);
						form.elements[i].focus();
						form.elements[i].select();
						return false;
					}
				}
				break;
				
			//選択チェック----------------//
			case "sel_i":
			
				if(myvalue.length == 0)
				{
					alert(msg_hissu_sel);
					form.elements[i].focus();
					return false;
				}
				break;
				
			case "sel_n":
				//特になし
				break;

				
			//電話(FAX)チェック----------------//
			case "tel_i":
			
				if(myvalue.length == 0)
				{
					alert(msg_hissu);
					form.elements[i].focus();
					return false;
				}
				else
				{
					if(!check_tel(myvalue))
					{
						alert(msg_tel);
						form.elements[i].focus();
						form.elements[i].select();
						return false;
					}
				}
				break;
			
			case "tel_n":
			
				if(myvalue.length != 0)
				{
					if(!check_tel(myvalue))
					{
						alert(msg_tel);
						form.elements[i].focus();
						form.elements[i].select();
						return false;
					}
				}
				break;

			//郵便番号チェック----------------//
			case "zip_i":
			
				if(myvalue.length == 0)
				{
					alert(msg_hissu);
					form.elements[i].focus();
					return false;
				}
				else
				{
					if(!check_zip(myvalue))
					{
						alert(msg_zip);
						form.elements[i].focus();
						form.elements[i].select();
						return false;
					}
				}
				break;
			
			case "zip_n":
			
				if(myvalue.length != 0)
				{
					if(!check_zip(myvalue))
					{
						alert(msg_zip);
						form.elements[i].focus();
						form.elements[i].select();
						return false;
					}
				}
				break;
				
			//チェックボックスチェック----------------//
			case "chk_i":

				//対象のチェックボックス名を設定要素(hidden)の[value]属性から取得
				var chkbox_name = form.elements[i].value;
			
				//一つもチェックされていない場合
				if(!is_checked(chkbox_name))
				{
					alert(msg_hissu_chk);
					try
					{
						//該当名要素の最初の要素にフォーカス
						document.getElementsByName(chkbox_name)[0].focus();
					}
					catch(e)
					{
						
					}
					return false;
				}
				
				//対象のチェックボックスのチェック最小値を取得
				var chkmin = get_attr(form.elements[i],"chkmin");
				
				//未設定の場合はnullに統一
				if (chkmin == null || chkmin.length == 0)
				{
					chkmin = null;
				}			
				
				//対象のチェックボックスのチェック最大値を取得
				var chkmax = get_attr(form.elements[i],"chkmax");
				
				//未設定の場合はnullに統一
				if (chkmax == null || chkmax.length == 0)
				{
					chkmax = null;
				}
				
				//チェック数エラーの場合
				if (!check_checked_cnt(chkbox_name,chkmin,chkmax))
				{
					alert(msg_chked_cnt + get_min_max_err_msg(chkmin,chkmax,"項目"));
					try
					{
						//該当名要素の最初の要素にフォーカス
						document.getElementsByName(chkbox_name)[0].focus();
					}
					catch(e)
					{
						
					}
					return false;
				}

				break;
				
			case "chk_n":
			
				//対象のチェックボックス名を設定要素(hidden)の[value]属性から取得
				var chkbox_name = form.elements[i].value;
			
				//対象のチェックボックスのチェック最小値を取得
				var chkmin = get_attr(form.elements[i],"chkmin");
				
				//未設定の場合はnullに統一
				if (chkmin == null || chkmin.length == 0)
				{
					chkmin = null;
				}			
				
				//対象のチェックボックスのチェック最大値を取得
				var chkmax = get_attr(form.elements[i],"chkmax");
				
				//未設定の場合はnullに統一
				if (chkmax == null || chkmax.length == 0)
				{
					chkmax = null;
				}
				
				//チェック数エラーの場合
				if (!check_checked_cnt(chkbox_name,chkmin,chkmax))
				{
					alert(msg_chked_cnt + get_min_max_err_msg(chkmin,chkmax,"項目"));
					try
					{
						//該当名要素の最初の要素にフォーカス
						document.getElementsByName(chkbox_name)[0].focus();
					}
					catch(e)
					{
						
					}
					return false;
				}
			
				//特になし
				break;
				
			//日付チェック----------------//
			case "date_i":
			
				if(myvalue.length == 0)
				{
					alert(msg_hissu);
					form.elements[i].focus();
					return false;
				}
				
				var arr_date = myvalue.split("/");
				
				if (arr_date.length != 3)
				{
					alert(msg_date);
					form.elements[i].focus();
					form.elements[i].select();
					return false;
				}
				
				if (!is_date(arr_date[0],arr_date[1],arr_date[2]))
				{
					form.elements[i].focus();
					form.elements[i].select();
					return false;				
				}

				//ゼロ詰め
				arr_date[1] = (arr_date[1].length < 2 && arr_date[1] < 10 ? '0' + arr_date[1] : arr_date[1]);
				arr_date[2] = (arr_date[2].length < 2 &&  arr_date[2] < 10 ? '0' + arr_date[2] : arr_date[2]);
				
				//ゼロ詰めした値をセット
				form.elements[i].value = arr_date.join("/");
				
				break;
			
			case "date_n":
			
				if (myvalue.length == 0)
				{
					break;
				}
				
				var arr_date = myvalue.split("/");
				
				if (arr_date.length != 3)
				{
					alert(msg_date);
					form.elements[i].focus();
					form.elements[i].select();
					return false;
				}
				
				if (!is_date(arr_date[0],arr_date[1],arr_date[2]))
				{
					form.elements[i].focus();
					form.elements[i].select();
					return false;				
				}

				//ゼロ詰め
				arr_date[1] = (arr_date[1].length < 2 && arr_date[1] < 10 ? '0' + arr_date[1] : arr_date[1]);
				arr_date[2] = (arr_date[2].length < 2 &&  arr_date[2] < 10 ? '0' + arr_date[2] : arr_date[2]);
				
				//ゼロ詰めした値をセット
				form.elements[i].value = arr_date.join("/");				
				
				break;
				
			default:
				break;
		}
	}

	return true;
}

//******************************************************************************
// <summary> 数値入力チェック
// <param  > str : 対象文字列
// <returns> true/false
// <remarks>
function check_num(str)
{
	return !isNaN(str);

	/*
	//文字列を走査し、数値以外が含まれていれば偽、数値なら正
	for(j=0; j < str.length; j++)
	{
		c=str.charAt(j);
		
		if("0123456789".indexOf(c,0) < 0)
		{
			return false;
		}
	}
	return true;
	*/
}

//******************************************************************************
// <summary> 特殊文字入力チェック
// <param  > str : 対象文字列
// <returns> true/false
// <remarks>
function check_special_str(str)
{
	//文字列を走査し、特殊文字が含まれていれば偽、以外は正
	for(var l=0; l < str.length; l++)
	{
		var c = str.charAt(l);
		
		//クォート不許可で、クォート文字列の場合
		if(!g_allow_quote && (c=="\'" || c=="\"" || c=="\\"))
		{
				return false;
		}

		//パイプ
		if(c=="\|")
		{
			return false;
		}
	
		//その他
		var other = ":;?*";
		
		//その他
		if(other.indexOf(c) >= 0)
		{
			return false;
		}
	}

	return true;
}

//******************************************************************************
// <summary> 英数字入力チェック
// <param  > str : 対象文字列
// <returns> true/false
// <remarks>
function check_alphanumeric(str)
{
	
	check = /^\w+$/i
	
	if(!str.match(check))
	{
		return false;
	}
	
	return true;
	
	/*
	var newString = "";
	for (k = 0; k < str.length; k++)
	{
		c = str.substring(k, k+1);
		if (c >= " " && c <= "~")
		{
			newString += c;
		}
		else
		{
			//英数字以外
			return false;
		}
	}
	return true;
	*/
}

//******************************************************************************
// <summary> 文字桁数チェック
// <param  > str : 対象文字列
//           min : 最低桁数
//           max : 最大桁数
// <returns> true/false
// <remarks>
function check_len(str,min,max)
{
	if (str == null )
	{
		return false;
	}
	
	if (min != null && max != null)
	{
		if (!(min <= str.length && str.length <= max))
		{
			return false;
		}
	}
	else if(min != null && max == null)
	{
		if (str.length < min)
		{
			return false;
		}
	}
	else if(min == null && max != null)
	{
		if (str.length > max)
		{
			return false;
		}
	}
	
	return true;
}

//******************************************************************************
// <summary> チェックBOXの選択数チェック
// <param  > name : 対象チェックボックス名(*[]となっていること)
//           min  : 最低選択数
//           max  : 最大選択数
// <returns> true/false
// <remarks>
function check_checked_cnt(name,min,max)
{
	if (name == null )
	{
		return false;
	}
	
	//チェックされている数を取得
	var chk_cnt = get_checked_cnt(name);

	
	if (min != null && max != null)
	{
		if (!(min <= chk_cnt && chk_cnt <= max))
		{
			return false;
		}
	}
	else if(min != null && max == null)
	{
		if (chk_cnt < min)
		{
			return false;
		}
	}
	else if(min == null && max != null)
	{
		if (chk_cnt > max)
		{
			return false;
		}
	}
	
	return true;
}

//******************************************************************************
// <summary> チェック数のチェックエラー時の桁数メッセージを取得
// <param  > min  : 最低チェック数
//           max  : 最大チェック数
//           name : エラー表示の際の単位名
// <returns> true/false
// <remarks>
function get_min_max_err_msg(min,max,uname)
{
	if (uname == null)
	{
		uname = "桁";
	}

	if (min != null && max != null)
	{
		if (min == max)
		{
			return "[ " + min + uname + " ]";
		}
		else
		{
			return "[ " + min + uname + " から " + max + uname + " ]";
		}
	}
	else if(min != null && max == null)
	{
		return "[ " + min + uname + "以上 ]";
	}
	else if(min == null && max != null)
	{
		return "[ " + max + uname + "まで ]";
	}
}

//******************************************************************************
// <summary> メール形式チェック
// <param  > str : 対象文字列
// <returns> true/false
// <remarks>
function check_mail(str)
{
	check = /[!#-9A-~]+@+[a-z0-9]+.+[!#-9A-~]/i;
	
	if(!str.match(check))
	{
		return false;
	}
	
	return true;
}

//******************************************************************************
// <summary> URL形式チェック
// <param  > str : 対象文字列
// <returns> true/false
// <remarks>
function check_url(str)
{
	check = /(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/i;
	
	if(!str.match(check))
	{
		return false;
	}
	
	return true;
}

//******************************************************************************
// <summary> 電話番号形式チェック
// <param  > str : 対象文字列
// <returns> true/false
// <remarks>
function check_tel(str)
{
	//ハイフン必須未設定の場合
	if (g_ness_bar_tel == null)
	{
		check = /^\d{2,4}\-?\d{2,4}\-?\d{2,4}$/;
	}
	//必須の場合
	else if (g_ness_bar_tel == true)
	{
		check = /^\d{2,4}\-\d{2,4}\-\d{2,4}$/;
	}
	//不要の場合
	else
	{
		check = /^\d{10,11}$/;
	}

	if(!str.match(check))
	{
		return false;
	}
	
	return true;
}

//******************************************************************************
// <summary> 郵便番号形式チェック
// <param  > str : 対象文字列
// <returns> true/false
// <remarks>
function check_zip(str)
{
	//ハイフン必須未設定の場合
	if (g_ness_bar_zip == null)
	{
		check = /^\d{3}\-?\d{4}$/;
	}
	//必須の場合
	else if (g_ness_bar_zip == true)
	{
		check = /^\d{3}\-\d{4}$/;
	}
	//不要の場合
	else
	{
		check = /^\d{7}$/;
	}
	
	if(!str.match(check))
	{
		return false;
	}
	
	return true;
}

//******************************************************************************
// <summary> 日付チェック
// <param  > year  : 年
//           month : 月
//           day   : 日
// <returns>
// <remarks> 不正な場合、内部でエラーメッセージを表示(サンプルより抜粋)
function is_date(year,month,day)
{    
	//年
	if (isNaN(year))
	{
		alert("年には 数字 を設定してください。");
		return false;
	}
	if(year.length != 4){
		alert("年には 西暦４桁を設定してください。");
		return false;
	}

	//月
	if (isNaN(month))
	{
		alert("月には 数字 を設定してください。");
		return false;
	}
	if(mon_chk(month)){
		alert("月に正しい値を設定してください。");
		return false;
	}

	//日
	if (isNaN(day))
	{	
		alert("日には 半角数字 を設定してください。");
		return false;
	}
	if(day.length == 0)
	{
		alert("日には 正しい値を設定してください。");
		return false;
	}
	var d = daymonth(year,month);
	if(d < day){
		alert("日が間違っています。"+ d + "日までです。");
		return false;
	}

	return true;
}

//******************************************************************************
// <summary> 日付の範囲チェック
// <param  > year  : 年
//           month : 月
// <returns>
// <remarks> 
function daymonth(year,month){	
	day = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	if(month==2 && leapyear(year)) return 29;
	return day[month-1];
}

//******************************************************************************
// <summary> うるう年のチェック
// <param  > year  : 年
// <returns>
// <remarks> 
function leapyear(year){
	return year%4==0 && (year%100!=0 || year%400==0);
}

//******************************************************************************
// <summary> 月の範囲チェック
// <param  > month  : 月
// <returns>
// <remarks> 
function mon_chk(month){	
	if((month >= 1) && (month <= 12)) return false;
	return true;
}

//******************************************************************************
// <summary> 乱数取得
// <param  > s : 乱数範囲開始
//           e : 乱数範囲終了
// <returns> 乱数の値
// <remarks> GetRandom(3,8)とすると、3から8の間の値が帰ってくる
function get_random(s,e)
{
	if( s > e )
	{
		var c = s;
		s = e;
		e = c;
    }
    var t = e - s;
    return Math.floor( Math.random() * (t+1) ) + s;
}

//******************************************************************************
// <summary> 日付文字列を取得する
// <param  > date    : Dateオブジェクトのインスタンス(object)
//           is_time : 時間を含めるかの是非(bool)
// <returns> 
// <remarks> 
function get_date_str(date,is_time)
{
	var ret = "";
	
	//年月日を取得
	year = date.getFullYear();
	month = (date.getMonth() + 1);
	day = date.getDate();
	hour = date.getHours();
	minute = date.getMinutes();
	second = date.getSeconds();
	
	//月日を桁埋
	year = (year < 10 ? '0' + year : year);
	month = (month < 10 ? '0' + month : month);
	day = (day < 10 ? '0' + day : day);

	//日付を取得
	ret = year + "/" + month + "/" + day;
	
	//時間を含める場合
	if (is_time)
	{
		//時間を桁埋
		hour = (hour < 10 ? '0' + hour : hour);
		minute = (minute < 10 ? '0' + minute : minute);
		second = (second < 10 ? '0' + second : second);	
	
		//時刻も取得
		ret += " " + hour + ":" + minute + ":" + second;
	}
	
	return ret;
}

//******************************************************************************
// <summary> 日数を取得
// <param  > end   : 終了日付(Dateオブジェクトのインスタンス)
//           start : 開始日付(Dateオブジェクトのインスタンス)
// <returns> 日数
// <remarks> 未設定時は当日
function get_diff_days(end,start)
{
	//未設定の場合は当日
	end = (end == null ? new Date() : end);
	start = (start == null ? new Date() : start);
			
	var dayms = 24 * 60 * 60 * 1000;
	var n = Math.floor((end.getTime() - start.getTime())/dayms) + 1;

	//指定日から何日たったかを表示するには、"n"を"-n"にする
	return n;
}

//******************************************************************************
// <summary> 日数を取得(年月日入力)
// <param  > e_year  : 終了年
//           e_month : 終了月
//           e_day   : 終了日
//           s_year  : 開始年
//           s_month : 開始月
//           s_day   : 開始日    
// <returns> 日数
// <remarks> 未設定時は当日(年月日何れかでも未設定ならば当日とする)
function get_diff_days_ymd(e_year,e_month,e_day,s_year,s_month,s_day)
{
	//終了
	if (e_year == null || e_month == null || e_day == null)
	{
		var start = new Date();
	}
	else
	{
		var start = new Date(e_year,e_month-1,e_day);
	}
	
	//開始
	if (s_year == null || s_month == null || s_day == null)
	{
		var end = new Date();
	}
	else
	{
		var end = new Date(s_year,s_month-1,s_day);
	}	

	return get_diff_days(start,end);
}

//******************************************************************************
// <summary> 経過時間(秒数の差分)を取得する
// <param  > start : 開始時間(Dateオブジェクトのインスタンス)
//           end   : 終了時間(Dateオブジェクトのインスタンス)
// <returns> 
// <remarks> 
function get_diff_second(start,end)
{
	//終了時間から開始時間を引いた値(ミリ秒)を秒に換算して(1000で割る)、切捨てする
	return Math.floor((end - start)/1000);
}

//******************************************************************************
// <summary> IE以外のブラウザのイベントハンドラをwindow.eventにセットする
// <param  > 
// <returns>
// <remarks> 
function set_window_event()
{
	if (judge_browser() == "IE")
	{
		return;
	}
	
	for (var property in Event.prototype)
	{
		if(property.match(/MOUSE|CLICK|KEYDOWN/))
		{
			window.addEventListener(property.toLowerCase(), function(e){window.event = e;}, true);
		}
  	}
  	
  	/* 別手法
	var events = ["mousedown", "mouseover", "mouseout", "mousemove", "mousedrag", "click", "dblclick"];  
	for (var i = 0; i < events.length; i++)
	{
		window.addEventListener(events[i], function(e){window.event = e;}, true);
	}
	*/
}

//******************************************************************************
// <summary> フォーカスをセットする
// <param  > element   : 要素インスタンス(object) または 要素ID名
// <returns> 
// <remarks> 
function set_focus(element)
{
	//パラメータがNULLの場合
	if (element == null)
	{
		return;
	}
	
	//[element]のタイプで分岐
	switch (typeof(element))
	{
		case "string":
			
			//引数が要素IDとして、該当要素を取得
			element = document.getElementById(element);
			
			//該当要素がない場合
			if (element == null)
			{
				return null;
			}
			
			break;
			
		case "object":
		
			//要素インスタンスとして扱う(特になにもしない)
		
			break;
			
		default:
			break;
	}
	
	try
	{
		//フォーカスを与え、既存文字をハイライトする
		element.focus();
		element.select();
	}
	catch(e)
	{
	}
}

//******************************************************************************
// <summary> 改行コードをラインフィード(LF)に統一する
// <param  > str : 対象文字列
// <returns> 変換された文字列
// <remarks> 
function rnton(str)
{
	str = str.replace(/\r\n/g,"\n");
	str = str.replace(/\r/g,"\n");
	return str;
}

//******************************************************************************
// <summary> 数字文字列を数値へ変換する
// <param  > str : 対象文字列
// <returns> 変換された数値
// <remarks> 
function to_num(str)
{
	return str - 0;
}

//******************************************************************************
// <summary> 数値を数字文字列へ変換する
// <param  > num : 対象数値
// <returns> 変換された数字文字列
// <remarks> 
function to_str(num)
{
	return num + "";
}

//******************************************************************************
// <summary> 配列に指定した値が存在するか否か
// <param  > val     : チェック対象
//           arr_lst : 対象配列
//           numeric : 値を数値として判別するか(true/false)
// <returns> true/false
// <remarks> 
function in_array(val,arr_lst,numeric)
{
	if (val == null || arr_lst == null)
	{
		return false;
	}
	
	//判別区分
	numeric = (numeric == null ? true : numeric);
	
	//全ループ
	for (var i = 0; i < arr_lst.length; i++)
	{
		//数字として判別する場合
		if (numeric)
		{
			//数値変換
			var tgt = to_num(arr_lst[i]);
		}
		//文字として判別する場合
		else
		{
			//文字変換
			var tgt = to_str(arr_lst[i]);			
		}
		
		//一致する場合
		if (tgt == val)
		{
			return true;
		}		
	}
	
	return false;
}

//******************************************************************************
// <summary> 一覧表示変更
// <param  > name    : 表示変更項目名
//           idx     : 項目インデックス
// <returns> 
// <remarks> 
function change_disp_hide(name,idx)
{
	if (name == null)
	{
		return;
	}
	
	if (idx == null)
	{
		idx = "";
	}
	
	//該当の要素を取得
	var e = document.getElementById(name + idx);

	//要素のクラス名の設定で表示切替
	try
	{
		e.className = (e.className.length == 0 ? "hide" : "");
	}
	catch(e)
	{
		alert(e);
	}
}

/*
//******************************************************************************
// <summary> バイト長を取得する
// <param  > str : 対象文字列
// <returns> バイト長
// <remarks> 
function getByte(str)
{
	if (str=="" || !str || str==null) return 0;
	str=trashGomi(str);
	var strS=str.replace(/[^0-9a-zｱ-ﾝ\!\"\#\$\%\&\'\(\)\-\=\^\~\\\|\@\`\[\{\;\+\:\*\]\}\,\<\.\>\/\?\_]/ig,"##");
	return strS.length;
}

//******************************************************************************
// <summary> 文字数を取得する
// <param  > str : 対象文字列
// <returns> 文字数
function getLength(str)
{
	if (str=="" || !str || str==null) return 0;
	str=trashGomi(str);
	var strS=str.replace(/[^0-9a-zｱ-ﾝ\!\"\#\$\%\&\'\(\)\-\=\^\~\\\|\@\`\[\{\;\+\:\*\]\}\,\<\.\>\/\?\_]/ig,"#");
	return strS.length;
}

function trashGomi(s)
{
	s=unescape(escape(s).split("%00")[0]);
	return s;
}
*/

//******************************************************************************
// <summary> クリップボードに指定要素の値をコピーする
// <param  > arg : コピー元オブジェクト
// <returns> Bool
// <remarks> 
function copy_text(arg)
{
	try
	{
		var obj = document.all && document.all(arg) || document.getElementById && document.getElementById(arg);
		
		if (obj.value)
		{
			var doc = document.body.createTextRange();
			doc.moveToElementText(obj);
			doc.execCommand("copy");
			alert('クリップボードにコピーしました。');
			return true;
		}
		else
		{
			alert('コピーするデータがありません。');
			return false;
		}		
	}
	catch(e)
	{
		alert("ご利用のブラウザではクリップボードにコピーできません\n[" + e + "]");
		return false;
	}	
}

//******************************************************************************
// <summary> オブジェクトの全ての情報を取得する
// <param  > 
// <returns> 
// <remarks> 
function get_obj_cts(obj)
{
	try
	{
		var ret = "";
		
		var itm = Array();
		
		if (obj == null)
		{
			return ret;
		}
		
		for(var nm in obj)
		{
			try
			{
				itm.push(nm + ":" + obj[nm].value);
			}
			catch(e)
			{
				itm.push(nm + ":" + obj[nm]);				
			}
			
		}
		
		return itm.join("\n");		
	}
	catch(e)
	{
		alert(e);		
		return;
	}
}

//******************************************************************************
// <summary> オブジェクトの全ての情報を表示する
// <param  > 
// <returns> 
// <remarks> 
function disp_obj_cts(obj)
{
	try
	{	
		if (obj == null)
		{
			return;
		}
		
		for(var nm in obj)
		{
			var itm = "";
			
			try
			{
				itm = nm + ":" + obj[nm].value;
			}
			catch(e)
			{
				itm = nm + ":" + obj[nm];
			}
			
			document.write(itm + "<br />");			
		}
	}
	catch(e)
	{
		alert(e);		
		return;
	}
}

//*****************************************************************************************************************
//▼カレンダー制御▼
//*****************************************************************************************************************

//******************************************************************************
// <summary> カレンダーを表示する
// <param  > path   : カレンダーファイルのパス
//           eid    : 親ページの選択した値をセットする要素ID
//           fmt    : 親ページのセット対象要素へのフォーマット
//           year   : デフォルト年
//           month  : デフォルト月
//           width  : ウィンドウ幅
//           height : ウィンドウ高
// <returns> 
// <remarks> 
function open_calendar(path,eid,fmt,year,month,width,height)
{
	var dt = new Date();
	year = (year == null ? dt.getFullYear() : year);
	month = (month == null ? dt.getMonth()+1 : month);

	width = (width == null ? 200 : width);
	height = (height == null ? 200 : height);

	try
	{
		open_window(path + "?year=" + year + "&month=" + month + "&eid=" + eid + "&fmt=" + fmt,null,width,height);
	}
	catch(e)
	{
		alert(e);
	}
}

//******************************************************************************
// <summary> カレンダーを表示し、選択された日付を指定した要素に設定する
// <param  > dt_year   : デフォルト年
//           dt_monht  : デフォルト月
// <returns> 
// <remarks> 
function calendar(dt_year, dt_month)
{
	var date       = new Date();
	var Monthdays  = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	var Days       = new Array("日","月","火","水","木","金","土");

	var col = 0;
	var val = "";

	/* 年 */
	var year = "";
	if (dt_year != "")
	{
		year = dt_year;
	}
	else
	{
		year = date.getYear();
	}

	if(year<2000)
	{
		year=year+1900;
	}

	if(((year%4==0)&&(year%100!=0))||(year%400==0))
	{
		Monthdays[1]=29;
	}

	var month = ""
	if (dt_month != "")
	{
		month = dt_month-1;
	}
	else
	{
		month = date.getMonth();
	}

	var thisMonthDays = Monthdays[month];
	date.setYear(year);
	date.setMonth(month);
	date.setDate(1);
	
	Startday = date.getDay();
	
	var this_year = year;
	var this_month = month+1;

	var pre_year = 0;
	var pre_month = 0;
	if (this_month-1 == 0)
	{
		pre_year = this_year -1;
		pre_month = 12;
	}
	else
	{
		pre_year = this_year;
		pre_month = this_month -1;
	}
	
	var next_year = 0;
	var next_month = 0;
	
	if (this_month+1 > 12)
	{
		next_year = to_num(this_year) +1;
		next_month = 1;
	}
	else
	{
		next_year = this_year;
		next_month = to_num(this_month) + 1;
	}

	val += '<table>';
	val += '<tr><th colspan=7>';
	val += '<a href="javascript:calendar(' + pre_year+ ', ' + pre_month + ');">&lt;&lt;</a>&nbsp;';
	val += '<a href="javascript:calendar(' + _year+ ', ' + _month + ');">' + year + '年' +(month+1)+ '月</a>';
	val += '&nbsp;<a href="javascript:calendar(' + next_year + ', ' + next_month + ');">&gt;&gt;</a>';
	val += '</th></tr>';

	//曜日のスタイル
	var yb_style = "";
	val += '<tr>';
	for(i=0;i<7;i++)
	{
		if (i == 0)
		{	
			yb_style = ' style="color:#FF0000;"';	
		}
		else
		{	
			yb_style = "";	
		}
		val += '<th><span' + yb_style + '>' + Days[i]+ '</span></th>';
	}
	val += "</tr>";

	//日
	val += "<tr>";

	//戻り地点
	for(i=0;i<Startday;i++)
	{
		val += '<td>&nbsp;</td>';
		col++;
	}

	//現在日付取得
	var tday = new Date();
	var tyear = tday.getFullYear();
	var tmonth = tday.getMonth()+1;
	var tdate = tday.getDate();	

	//日付の背景色
	var day_bgcolor = "";
	
	//日付のスタイル
	var day_style = "";

	//戻り地点
	for(i=1; i<=thisMonthDays; i++)
	{
		//現在日付の場合
		if (this_year == tyear && this_month == tmonth && i == tdate)
		{	
			day_bgcolor = "#FFCCFF";	
		}
		else
		{	
			day_bgcolor = "";	
		}
		
		//日曜日の場合
		if (col == 0)
		{	
			day_style = ' style="color:#FF0000;"';	
		}
		else
		{	
			day_style = "";	
		}
		
		//日
		val += '<td bgcolor=' + day_bgcolor + '><a href="javascript:set_to_parent(' + this_year + ',' + this_month + ',' + i + ",'" + _eid + "'," + _fmt + ');"><span' + day_style + '>'  + i + '</span></a></td>';		

		col++;
		if(col==7)
		{
			val += "</tr>";
			val += "<tr>";
			col=0;
		}
	}

	val += '</table>';
	
	document.getElementById("_dt_").innerHTML = val;
	
	return;
}

//******************************************************************************
// <summary> カレンダーを表示し、選択された日付を指定した要素に設定する
// <param  > year  : 年
//           month : 月
//           day   : 日
//           eid   : 親ページの値をセットする要素ID
//           fmt   : セットする値の書式
// <returns> 
// <remarks> 
function set_to_parent(year,month,day,eid,fmt)
{
	var val = "";
	
	if (year == null || month == null || day == null || eid == null)
	{
		return;
	}
	
	if (fmt == null)
	{
		fmt = "yyyy/mm/dd";
	}

	try
	{
		//ゼロ詰め
		month = (month < 10 ? '0' + month : month);
		day = (day < 10 ? '0' + day : day);
	
		//フォーマットで分岐
		switch (fmt)
		{
			case "yyyy/mm/dd":
			
				//日付を連結
				val = year + "/" + month + "/" + day;
				
				//親ページへセット
				window.opener.document.getElementById(eid).value = val;
				
				break;
		
			default:
				break;
		}
		
		window.close();
	}
	catch(e)
	{
		alert(e);
	}
	
	return;
}

function chg_angle(a,b,c){
	myDate=new Date;
	mySec=myDate.getMilliseconds();
	pathNode = "domPath"+a;
	imgNode = "domImg"+a;
	document.getElementById(pathNode).href=b+"?"+mySec;
	//document.images[imgNode].src="pic.php?file="+b+"&angle=90&t="+mySec;
	if(c){
		document.images[imgNode].src="pic.php?file="+c+"&fileOrg="+b+"&angle=90&t="+mySec;
	}else{
		document.images[imgNode].src="pic.php?file="+b+"&angle=90&t="+mySec;
	}
}

//*****************************************************************************************************************
//▲カレンダー制御▲
//*****************************************************************************************************************

function PrintPage(){
	if(document.getElementById || document.layers){
		window.print();		//印刷をします
	}
}

function chkLen(id,len){
	var MAXLENGTH = len;
	var tmp = document.getElementById(id).value;
	var len = tmp.length;
	if(len > MAXLENGTH){
		alert("入力可能な文字数は"+MAXLENGTH+"文字までです");
		document.getElementById(id).focus();
	}
}

function openWin(sURL, sWindowName, w, h, sScroll)
{
	// 画面中央のPopup - Scrollbarはオプション
	// ex)
	//			openWin("test.asp", "winTest", 400, 300);			■ Scrollbar無し
	//			openWin("test.asp", "winTest", 400, 300, "yes");	■ Scrollbar有り
	//			openWin("test.asp", "winTest", 400, 300, "auto");	■ Scrollbar自動

	var x = (screen.width - w) / 2;
	var y = (screen.height - h) / 2;

	if (sScroll==null) sScroll = "no";

	var sOption = "";
	sOption = sOption + "toolbar=no, channelmode=no, location=no, directories=no, resizable=yes, menubar=no";
	sOption = sOption + ", scrollbars=" + sScroll + ", left=" + x + ", top=" + y + ", width=" + w + ", height=" + h;

	if( window.name == sWindowName ){
		var win = window.open(sURL, "", sOption);
		win.name = sWindowName;
		window.close();
	}else{
		var win = window.open(sURL, sWindowName, sOption);
	}
	return win;
}

function tagChange(grp,id){
	for(i=0;i<=2;i++){
		document.getElementById(grp+i).style.display="none";
		document.getElementById(grp+i+"I").style.display="none";
	}
	document.getElementById(grp+id).style.display="block";
	document.getElementById(grp+id+"I").style.display="block";
}

function win01(URL,Winname,Wwidth,Wheight){
	var WIN;
	WIN = window.open(URL,Winname,"width="+Wwidth+",height="+Wheight+",scrollbars=no,resizable=no,toolbar=no,location=no,directories=no,status=no");
	WIN.focus();
}
function disp(msg,url){
		if (!confirm(msg)){
		}else{
			location.href = url;
		}
}
function chkCode(id) {
  work='';
  for (lp=0;lp<id.value.length;lp++) {
    unicode=id.value.charCodeAt(lp);
    if ((0xff0f<unicode) && (unicode<0xff1a)) {
      work+=String.fromCharCode(unicode-0xfee0);
    } else if ((0xff20<unicode) && (unicode<0xff3b)) {
      work+=String.fromCharCode(unicode-0xfee0);
    } else if ((0xff40<unicode) && (unicode<0xff5b)) {
      work+=String.fromCharCode(unicode-0xfee0);
    } else {
      work+=String.fromCharCode(unicode);
    }
  }
  id.value=work; /* 半角処理のみ */
  //id.value=work.toUpperCase(); /* 大文字に統一する場合に使用 */
  //id.value=work.toLowerCase(); /* 小文字に統一する場合に使用 */
}

function chkQuo(id) {
	var work=id.value;
for (lp=0;lp<id.value.length;lp++) {
	work = work . replace(/\"/i , "”");
	work = work . replace(/\'/i , "’");
}
	id.value=work;
	//id.value=work.toUpperCase(); /* 大文字に統一する場合に使用 */
	//id.value=work.toLowerCase(); /* 小文字に統一する場合に使用 */
}

function chkTotalTime(){
var icnt=0;
var scnt=0;
var time=0;
var totaltime=0;
var maxtime=180;
var input = document.getElementsByTagName('input');
	for (var i = 0, l = input.length; i < l; i++) {
	if (!input[i].id.match(/time\.*/)) continue;
	icnt++;
	}
var select = document.getElementsByTagName('select');
	for (var i = 0, l = select.length; i < l; i++) {
	if (!select[i].id.match(/time\.*/)) continue;
	icnt++;
}
	for (var i = 0, l = icnt; i < l; i++) {
var timeId="time"+i;
totaltime+=parseInt(document.getElementById(timeId).value);
}
	if(totaltime>maxtime){
		document.getElementById("nowTotalTime").innerHTML = "<span class='notice'>"+totaltime+"秒</span>";
		document.getElementById("nowTotalTime2").innerHTML = "<span class='notice'>"+totaltime+"秒</span>";
		document.getElementById("alert").innerHTML = "<p class='alC'><span class='notice'>180秒を超えるムービーは作成できません。シーン秒数を減らして下さい。</span></p>";
		//alert("180秒を超えるムービーは作成できません。シーン秒数を減らして下さい。");
		document.getElementById('prevTable').style.display="none";
		document.getElementById('compTable').style.display="none";
	}else{
		document.getElementById("alert").innerHTML = "";
		document.getElementById("nowTotalTime").innerHTML = totaltime+"秒";
		document.getElementById("nowTotalTime2").innerHTML = totaltime+"秒";
		document.getElementById('prevTable').style.display="block";
		document.getElementById('compTable').style.display="block";
	}
}
function skinOn(node){
	document.getElementById(node).style.backgroundColor="#ff00ff";
}
function skinOut(node){
	document.getElementById(node).style.backgroundColor="#ffffff";
}
function selectSkin(path,node){
	document.getElementById('template_id').value=path;
	document.getElementById(node).style.backgroundColor="#ff00ff";
}

function openSkinList(){
	window.open("./skinlist.php","skinlist","width=500,height=300,toolbar=no,scrollbar=yes");
}
function delSkin(){
	if(window.confirm('現在選択されているスキンを解除します。よろしいですか？')){
		document.getElementById('template_id').value="";
		document.getElementById('nowSkin').innerHTML="現在スキンは選択されていません。<br /><img src='images/noskin.jpg'>";
	}
}

function playMU(){
var path=document.getElementById('bgm').value;
var volume=document.getElementById('vol').value
var fullPath="http://sys.mono-api.jp/bgmup/"+path;
  document["playmusic"].setMusic(fullPath,volume);
}

function playSE(pnode,vnode){
var path=document.getElementById(pnode).value;
var volume=document.getElementById(vnode).value
var fullPath="http://sys.mono-api.jp/seup/"+path;
  document["playmusic"].setMusic(fullPath,volume);
}

function stopMU(){
  document["playmusic"].stMusic();
}
function chkByte(id,byte){
	var MAXLENGTH = byte/2;
	var MAXBYTE = byte;
	var tmp = document.getElementById(id).value;
	var len = CountLength(tmp);
	if(len > MAXBYTE){
		alert("入力可能な文字数は全角"+MAXLENGTH+"文字までです");
		document.getElementById(id).focus();
	}
}
function CountLength(str) {
	var r = 0;
	for (var i = 0; i < str.length; i++) {
		var c = str.charCodeAt(i);
		// Shift_JIS: 0x0 〜 0x80, 0xa0 , 0xa1 〜 0xdf , 0xfd 〜 0xff
		// Unicode : 0x0 〜 0x80, 0xf8f0, 0xff61 〜 0xff9f, 0xf8f1 〜 0xf8f3
		if ( (c >= 0x0 && c < 0x81) || (c == 0xf8f0) || (c >= 0xff61 && c < 0xffa0) || (c >= 0xf8f1 && c < 0xf8f4)) {
			r += 1;
		} else {
			r += 2;
		}
	}
	return r;
}

function clearSort(n){
	for (var i = 0; i < n; i++) {
		nodeId = "sort"+i;
		document.getElementById(nodeId).value="";
	}
}

