function IsInt(str){	//正の整数値かどうかを調べる
	if(str=="")	return(false);
	var i,len,num=0;
	len=str.length;
	for(i=0;i<len;i++)	num+=parseInt(str.charAt(i));
	return(!isNaN(num));
}
function IsHone(str){	//電話番号のフォーマットかどうかを調べる
	if(str=="")	return(false);
	var i,len,num=0;
	len=str.length;
	for(i=0;i<len;i++)	if(str.charAt(i)!="-")	num+=parseInt(str.charAt(i));
	return(!isNaN(num));
}
function IsTime(str){	//時間のフォーマット(17:30等)かどうかを調べる。要正規表現
	if(str=="")	return(false);
	$time=/^(0?[0-9]|[1-9][0-9]):([0-9]{2})$/.exec(str);
	if(($time==null)||(parseInt($time[1])>23)||(parseInt($time[2])>59)) return(false);
	return(true);
}
function IsYear(str){//入力された日付が日付形式かどうかをチェックする。範囲チェックは行わない
	var i,list,num=0;
	if(str=="")	return(false);
	list=str.split('/');
	if(list.length!=3) return(false);
	if(list[0].length!=4&&list[0].length!=2) return(false);
	if(list[1].length!=2&&list[1].length!=1) return(false);
	if(list[2].length!=2&&list[2].length!=1) return(false);
	for(i=0;i<str.length;i++)	if(str.charAt(i)!="/")	num+=parseInt(str.charAt(i));
	return(!isNaN(num));
}

//-----------------------------------------------------------------------------------------------------

function GetSelectVal(obj){	//リストの値を返す
	if(obj.selectedIndex==-1)	return(null);
	return(obj.options[obj.selectedIndex].value);
}
function GetSelectText(obj){	//リストのテキストを返す
	if(obj.selectedIndex==-1)	return(null);
	return(obj.options[obj.selectedIndex].text);
}
function GetRadioVal(obj){	//ラジオボタンの値を返す
	var val=false;
	for(i=0;i<obj.length;i++)	if(obj[i].checked)	val=obj[i].value;
	return(val);
}
//MultiSelectリストの選択された値のカンマ区切りリストを返す
function GetMultiSelectVal(obj){
	var ans='';
	for(i=0;i<obj.options.length;i++){
		if(obj.options[i].selected)	ans+=obj.options[i].value+',';
	}
	if(ans!='')	ans=ans.substr(0,ans.length-1);
	return(ans);
}

function SetSelectVal(obj,value){	//リストに値を設定する
	for(i=0;i<obj.length;i++)	if(obj.options[i].value==value)	obj.selectedIndex=i;
}
function SetSelectText(obj,value){	//リストに値を設定する
	for(i=0;i<obj.length;i++)	if(obj.options[i].text==value)	obj.selectedIndex=i;
}
function SetRadioVal(obj,value){	//ラジオボタンに値を設定する
	for(i=0;i<obj.length;i++)	if(obj[i].value==value)	obj[i].checked=true;
}

//リスト(obj)からkeyを選択位置から順にサーチする。末端まで行ったら上に戻る
function LoopSearch(obj,key){
	if(key=='') return;
	num=(obj.selectedIndex<0)?0:obj.selectedIndex+1;
	for(i=0;i<obj.length;i++){
		idx=i+num;
		if(idx>=obj.length) idx-=obj.length;
		if(obj.options[idx].text.indexOf(key)!=-1){
			obj.selectedIndex=idx;
			return;
		}
	}
}

//-----------------------------------------------------------------------------------------------------

//複数のチェックボックスに値を設定する。
//例)	SetCheckBit(document.f,'Options',5);	//numはビット値。
function SetCheckBit(obj,nam,num){
	cnt=0;
	while(num!=0){
		if(num&1==1)	obj.elements[nam+cnt].checked=true;
		num>>=1;
		cnt++;
	}
}
//複数のチェックボックスの値をビット値として得る。
//例)	SetCheckBit(document.f,'Options',5);	//numはCheckBoxの数。
function GetCheckBit(obj,nam,num){
	ans=0;
	for(i=0;i<=num;i++)	if(obj.elements[nam+i].checked)	ans+=1<<i;
	return(ans);
}
//サブコンボの中身を動的に書き換える。
//Mainがメインコンボ。Subがサブコンボ
//aryは[キー,Value,Text]をレコードとする二次元配列
//Keyはaryのキー値。キーが一致したもののみが反映される
//サブコンボの先頭一行はデフォルト値扱いになる
function ChangeComboBox(Main,Sub,Key,ary){
	Sub.options.length=1;
	idx=0;
	for(i=0;i<ary.length;i++){
		if(ary[i][0]==Key){
			Sub.options[idx+1]=new Option(ary[i][2],ary[i][1]);
			idx++;
		}
	}
	if(navigator.appName.substring(0, 1)=="N"&&navigator.appVersion.substring(0, 1)=="4")	history.go(0);
	Sub.selectedIndex=0;
}
//TR変換
function TR(str,FromStr,ToStr){
	if(FromStr.length!=ToStr.length) alert('変換エラー');
	for(i=0;i<str.length;i++){
		for(j=0;j<FromStr.length;j++){
			if(str.charAt(i)==FromStr.charAt(j)){
				str=str.replace(FromStr.charAt(j),ToStr.charAt(j));
				break;
			}
		}
	}
	return(str);
}

//-----------------------------------------------------------------------------------------------------

//追記：クッキーで使用されるescape,unescapeはブラウザ依存の危険度の高い関数であるため､
//いずれ自前で変換する関数を用意すべき。
//クッキーを削除する。
function DeleteCookie(){
	time=(new Date()).toGMTString();
	document.cookie="cook=damy;expires="+time;
}
/*
配列のデータ全てをcookieファイルに保存する
配列は通常配列でも連想配列でもその混在でも可。
timeにfalseを指定すると期限なしで設定する。
(: & = ;)は区切り文字なので使ってはいけない。
例)
	var list=new Array();
	list['name']=document.f.name.value;
	list['mail']=document.f.mail.value;
	list['del']=document.f.del.value;
	SetCookie(list,1);
*/
function SetCookie(list,time){
	var str="";
	if(time==false)	time=";";
	else{
		var tdate=new Date();
//		tdate.setMinutes((tdate.getMinutes())+time);	//time分追加
		tdate.setFullYear((tdate.getFullYear())+time);	//time年追加
		time=";expires="+tdate.toGMTString();
	}
	for(i in list)	str+=i+":"+escape(list[i])+"&";
	str=str.substring(0,str.length-1);
	document.cookie="cook="+str+time;
}
/*
cookieファイルの全てのインデックスとアイテムの値を取り出す。
データはインデックスを添え字に持つ連想配列として返される。
又、cookieに値がない場合はfalseを返す。
例)
	var ary=GetCookie();
	if(ary!==false){
		document.f.name.value=ary['name'];
		document.f.mail.value=ary['mail'];
		document.f.del.value=ary['del'];
	}
*/
function GetCookie(){
	var str,cook,i,ptr,list=new Array();
	str=document.cookie;
	if(str.indexOf(";")!=-1)	str=str.substring(0,str.indexOf(";"));	//PHPなどと連動させる場合、必要になる時がある。
	str=str.substring(str.indexOf("=")+1,str.length);
	cook=str.split("&");
	for(i=0;i<cook.length;i++){
		ptr=cook[i].indexOf(":");
		list[unescape(cook[i].substring(0,ptr))]=unescape(cook[i].substring(ptr+1,cook[i].length));
	}
	return((str=='')?false:list);
}

//-----------------------------------------------------------------------------------------------------

/*
ss=和暦(平成、昭和、大正、明治)または(1,2,3,4)、
yy=年(元年可)、mm=月、dd=日付
入力された年が存在するかどうかを調べる。
存在すれば西暦を返し、存在しなければfalseを返す。
*/
function ToYear(ss,yy,mm,dd,str){
	if(yy=="元年")	yy=1;
	var ans=(IsInt(yy)&&IsInt(mm)&&IsInt(dd))?ToYearPreper(ss,yy,mm,dd):"err1";

	if(ans=="err1")	alert(str+"には正の整数を入力してください。");
	if(ans=="err2")	alert(str+"の入力が不正です。\n正しく入力しなおしてください。");
	if(ans=="err3")	alert("その年は存在しません。\n正しい"+str+"を入力してください。");
	if(ans=="err4")	alert("その日付は存在しません。\n正しい日付を入力してください。");
	if(ans=="err5")	alert("プログラムエラー。\n和暦は平成から明治までしかサポートされません。");
	return(((ans+"").indexOf("err")==-1)?ans:false);
}
function ToYearPreper(ss,yy,mm,dd){
	ss=(0<ss&&ss<5)?ss:((ss=="平成")?1:((ss=="昭和")?2:((ss=="大正")?3:((ss=="明治")?4:"err5"))));
	if(1>yy||1>mm||mm>12||1>dd||dd>31)	return("err2");
	yy=YeartoYYYY(ss,eval(yy),mm,dd);
	if(yy=="err")	return("err3");
	all_month=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	if(((yy%4==0)&&(yy%100!=0))||(yy%400==0))	all_month[1]=29;
	return((dd>all_month[mm-1])?"err4":yy);
}
/*和暦を西暦にして返す。変更できなければ"err"がかえる*/
function YeartoYYYY(flag,yy,mm,dd){
	nen=[	/*最終年、開始年、開始月、開始日*/
			["damy",11988,12,32],
			[9999,1989,1,8],
			[64,1926,12,25],
			[15,1912,7,30],
			[45,1868,9,8]
		]

	var fin=nen[flag][0];
	var syy=nen[flag][1];
	var smm=nen[flag][2];
	var sdd=nen[flag][3];
	var eyy=nen[flag-1][1];
	var emm=nen[flag-1][2];
	var edd=nen[flag-1][3]-1;

	if(yy>1&&yy<fin){		yy+=syy-1;				}
	else if(yy==1){
		if(mm>smm){			yy=syy;					}
		else if(mm==smm){	yy=(dd>=sdd)?syy:"err";	}
		else{				yy="err";				}
	}
	else if(yy==fin){
		if(mm<emm){			yy=eyy;					}
		else if(mm==emm){	yy=(dd<=edd)?eyy:"err";	}
		else{				yy="err";				}
	}
	else{					yy="err";				}
	return(yy);
}
//西暦を和暦にする。和暦,年数のリストを返す
function YYYYtoYear(yyyy,mm,dd){
	if(isNaN(parseInt(yyyy)))	return(['err']);
	if(isNaN(parseInt(mm)))		return(['err']);
	if(isNaN(parseInt(dd)))		return(['err']);
	year=yyyy+(mm<10?"0":"")+mm+(dd<10?"0":"")+dd;
	nen=[	/*最終年、開始年、開始月、開始日*/
			[9999,19890108,1989],
			[64,19261225,1926],
			[15,19120730,1912],
			[45,18680908,1868]
		]
	if(year<nen[3][1])	return(['err']);
	if(year>=nen[0][1])	return(['平成',yyyy-nen[0][2]+1]);
	if(year>=nen[1][1])	return(['昭和',yyyy-nen[1][2]+1]);
	if(year>=nen[2][1])	return(['大正',yyyy-nen[2][2]+1]);
	if(year>=nen[3][1])	return(['明治',yyyy-nen[3][2]+1]);
}