/*
 * 防災台風災害情報用JavaScript
 * 作成者：村松 尚子
 * 更新者：
 * 作成日：2003/4/14
 * 更新日：2003/6/22
 */

//エラーメッセージ
/*
var NECESSITY_ERROR = "を入力してください。";
var NUMERIC_ERROR = "には数値を入力してください。";
var ONEBYTE_ENG_ERROR = "には半角英数を入力してください。";
var FROMTO_ERROR = "の大小関係が間違っています。";
var DATE_ERROR = "が間違っています。";
*/
var SYMBOL_ERROR = "機種依存文字は使用しないようにしてください。";
//===== removed by Muramatsu 03.06.22
// var LENGTH_ERROR = "の桁数が間違っています。";
// ===== end

//var XML_ERROR = "XML禁則文字「\<\>\"\&」は使用しないようにしてください。";

//確認メッセージ
var ALL_BLANK_MSG = "検索結果が膨大になる可能性があります。\n検索を実行してよろしいですか？";

//フレーム名称
var FR_TOP = "top";
//var FR_BOTTOM = "bottom";
//var FR_RIGHT = "right";
var FR_MAIN = "main";
var FR_LEFT = "left";
var FR_SELF = "_self";

var necessityList = new CheckList( new NecessityChecker() );		//入力必須チェック項目リスト
var numericList = new CheckList( new NumericChecker() );			//数値チェック項目リスト
var intList = new CheckList( new IntChecker() );						//整数値チェック項目リスト
var onebyteEngList = new CheckList( new OneByteEnglishChecker() );		//半角英数チェック項目リスト
var halfSizeList = new CheckList( new HalfSizeChecker() );			//半角チェック項目リスト
var fromtoList = new CheckList( null );									//大小チェック項目リスト
var dateList = new CheckList( new DateChecker() );					//日付チェック項目リスト（8桁のみ）
var lengthList = new DynaCheckList();									//桁数チェック項目リスト
var notKeyList = new List();			//検索条件の絞込みとは無関係なinput,select,check名
//var toAZ = new List();		//小文字大文字変換項目リスト

/**
 * document.forms[0]の引数名称を持つチェックボックスの値を全て調べて、一つでもチェックされている場合はtrueを返します
 * @cname チェックボックスの名称
 */
function existChecked(cname){
	var form = document.forms[0];
	var elems = document.getElementsByName(cname);
	for (var loop=0 ; loop< elems.length ; loop++){
		temp = elems[loop];
		if (temp.type=="checkbox" && temp.checked){
			return true;
		}
	}
	return false;
}

/**
 * エラー表示および、該当エレメントへのフォーカス
 * @param ele
 * @param msg
 */
function error( ele, msg ){
//	ele.select();
	ele.focus();
	window.alert(msg);
}
/**
 * エラーメッセージを作成
function createMsg( chkel, chkr ){
	return ( chkel.label + chkr.msg);
}
 */

/**
 * 当日の日付をyyyyMMddで返します。
 */
function getToday(){
	var today = new Date();
	return ( today.getFullYear()*10000 + ( today.getMonth()+1 )*100 + today.getDate() );
}

/**
 * 指定されたフォームの全ての入力項目がブランクの場合にconfirmを出し、処理続行の有無を返します。
 * @return boolean
 * @param form	formオブジェクト
 */
function checkAllBlank(form){
	for (var loop=0 ; loop<form.elements.length ; loop++){
		temp = form.elements[loop];
		if ( notKeyList.exists( temp.name ) ){
			continue;
		}
		if (temp.type == "text" || temp.type == "textarea"){
			if ( existValue(temp.value) ){
				return true;
			}
		} else if (temp.type == "select-one"){
			if ( temp.options[ temp.selectedIndex ].value != "" ){
				return true;
			}
		}
	}

	return window.confirm(ALL_BLANK_MSG);
}

// ========================================================================================-
// forward用関数
// ========================================================================================-

/**
 * コマンドIDをセットし、フレームtopに対してsubmitを発行します。
 * @param cid コマンドID
 */
function forwardTop(cid){
	doForward( cid, "_top");
}
/**
 * コマンドIDをセットし、topフレームに対してsubmitを発行します。
 * @param cid コマンドID
 */
function forwardFTop(cid){
	doForward( cid, FR_TOP);
}

function test(){
	alert("test");
}
/**
 * コマンドIDをセットし、bottomフレームに対してsubmitを発行します。
 * @param cid コマンドID
 */
/*function forwardBottom(cid){
	doForward( cid, FR_BOTTOM);
}*/
/**
 * コマンドIDをセットし、mainフレームに対してsubmitを発行します。
 * @param cid コマンドID
 */
function forwardMain(cid){
	doForward( cid, FR_MAIN);
}
/**
 * コマンドIDをセットし、leftフレームに対してsubmitを発行します。
 * @param cid コマンドID
 */
function forwardLeft(cid){
	doForward( cid, FR_LEFT);
}
/**
 * コマンドIDをセットし、自分自身のフレームに対してsubmitを発行します。
 * @param cid コマンドID
 */
function forward(cid){
	doForward( cid, "_self");
}
/**
 * コマンドIDをセットし、引数フレームに対してsubmitを発行します。
 * @param cid コマンドID
 * @param trg 送信先フレーム
 */
function doForward(cid, trg){
	var form = document.forms[0];
	form.target=trg;
	form.commandID.value = cid;
	form.submit();
}

/**
 * コマンドID及び、targetをセットし、入力項目のバリデーションをチェックし、submitを発行します。
 * @param cid コマンドID
 * @param trg 送信先フレーム
 */
function checkAndForward(cid, trg){
	if(simpleCheck()) doForward(cid, trg);
}

/**
 * コマンドID及び、targetをセットし、入力項目のバリデーションをチェックします。
 * @param cid コマンドID
 * @param trg 送信先フレーム
 * @return boolean 入力エラーがあればfalse、なければtrue。
 */
function checkAndSet(cid, trg){
	var form = document.forms[0];
	form.target=trg;
	form.commandID.value = cid;
	return simpleCheck();
}
/**
 * コマンドID及び、targetをセットし、入力項目のバリデーションをチェックします。
 * すべてのフォーム部品がブランクの場合、confirmを出します。
 * @param cid コマンドID
 * @param trg 送信先フレーム
 * @return boolean 入力エラーがあればfalse、なければconfirmの回答。
 */
function checkAndConfirm(cid, trg){
	var form = document.forms[0];
	return ( checkAndSet(cid, trg) && checkAllBlank(form) );
}


/**
 * 入力項目のバリデーションをチェックします。
 * @return boolean 入力エラーがあればfalse、なければtrue。
 */
function simpleCheck(){
	//入力必須項目チェック
	if( !checkList(necessityList) )
		return false;
	//数値項目型チェック
	if( !checkList(numericList) )
		return false;
	//整数チェック
	if( !checkList(intList) )
		return false;
	//半角英数チェック
	if( !checkList(onebyteEngList) )
		return false;
	//日付の妥当性チェック
	if( !checkList(dateList) )
		return false;
	//桁数チェック
	if( !checkList(lengthList) )
		return false;
	//大小関係チェック
	if( !checkFromTo() )
		return false;
	
	//XML禁則文字チェック
//	if( !checkXML() )
//		 return false;
	//機種依存文字チェック
	if( !checkSymbol() )
		return false;
	
	//大文字小文字変換
//	changeToAZ();
	return true;
}

// ========================================================================================-
// 連続Check用関数
// ========================================================================================-

/**
 * 引数Listに対する入力チェックを行います。
 * 同名のエレメントが複数存在する場合は、その全てに対してチェックを行います。
 * @param list チェック対象のList
 * 更新日：2003/6/22
 */
function checkList( list ){
	for(var i=0; i<list.size; i++){
		var chkele = list.get(i);
		var checker = chkele.checker;
	//===== modified by Muramatsu 03.6.22
	//	var ele = chkele.getElement();
		
		var eleList = chkele.getElements();
		for( var j=0 ; j<eleList.size ; j++ ){
			var ele = eleList.get(j);
		//===== modified by Muramatsu 03.07.11
			var val = ( ele.type=="select-one" ? ele.options[ele.selectedIndex].value : ele.value );
			if ( !checker.accept(val) ){
		//	if ( !checker.accept(ele.value) ){
		// ===== end
//				error( ele, chkele.label+checker.msg );
//				error( ele, createMsg( chkele, checker ) );
				error( ele, checker.createMsg(chkele.label) );
				return false;
			}
		}
	//===== end
	}
	return true;
}

/**
 * fromtoListにエントリーされた項目に対する大小チェックを行います。
 * ※checkListと違い、同名のエレメントの配列はサポートしていません。
 * ※数値項目型チェックも同時に行います。
 */
function checkFromTo(){
	var nschecker = new NecessityChecker();
	var nchecker = new NumericChecker();
	var frchecker = new FromToChecker();

	for(var i=0; i<fromtoList.size; i++){
		var chkele = fromtoList.get(i);
		var tmpFrom = chkele.getFrom();
		var tmpTo = chkele.getTo();
	//===== added by Muramtsu 03.06.19
	// 検索タイプが存在し、かつbetweenの場合は入力有無チェックを行うように追加
		var tmpType = chkele.getType();
		if ( tmpType!=null ){
			if ( tmpType.value=="4" && !checkForFromTo(nschecker, chkele) ){
				return false;
			}
		}
	//=====end
		if ( !checkForFromTo(nchecker, chkele) ){
			return false;
		}
		if ( !frchecker.accept( tmpFrom.value, tmpTo.value ) ){
//			error( tmpTo, chkele.label+frchecker.msg );
//			error( tmpTo, createMsg( chkele, frchecker ) );
			error( tmpTo, frchecker.createMsg(chkele.label) );
			return false;
		}
	}
	return true;
}
function checkForFromTo(checker, chkele){
	var tfrom = chkele.getFrom();
	var tto = chkele.getTo();
	if ( !checker.accept(tfrom.value) ){
//		error( tfrom, chkele.label+checker.msg );
//		error( tfrom, createMsg(chkele,checker) );
		error( tfrom, checker.createMsg(chkele.label) );
		return false;
	}
	if ( !checker.accept(tto.value) ){
//		error( tto, chkele.label+checker.msg );
//		error( tto, createMsg(chkele,checker) );
		error( tto, checker.createMsg(chkele.label) );
		return false;
	}
	return true;
}

/**
 * toAZ(Vector)要素の文字列を全て大文字に変換します。
function changeToAZ(){
	for(var i = 0; i < toAZ.size; i++){
		var ele = toAZ.get(i).getElement();
		ele.value = ele.value.toUpperCase();
	}
}
 */

/**
 * 機種依存文字チェック
 */
function checkSymbol(){
	var form = document.forms[0];
	for(var i = 0; i < form.elements.length; i++){
		var ele = form.elements[i];
		if( ele.type=="text" || ele.type=="textarea"){
			if( isSymbol(ele.value) ){
				error( ele, SYMBOL_ERROR);
				return false;
			}
		}
	}
	return true;
}


/**
  *XML禁則文字チェック
function checkXML(){
	var form = document.forms[0];
	for(var i = 0; i < form.elements.length; i++){
		var ele = form.elements[i];
		if( ele.type=="text" || ele.type=="textarea"){
			if( isXML(ele.value) ){
				error( ele, XML_ERROR);
				return false;
			}
		}
	}
	return true;
}
 */


/**
 * 機種依存文字の判別
 */
function isSymbol(moji) {
	var numStr = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\"#$%&'()*+,-./:\;<=>?@[\\]^_`{|}~";

	for (i=0; i<moji.length; i++){
		c = escape(moji.charAt(i));

		//半角はスキップ：0x00XX
		if( numStr.indexOf( moji.charAt(i) ) != -1 ){
			continue;
		}
		//Unicodeの丸付き数字：0x2460 〜 0x2473
		if ( eval("0x"+c.charAt(2)) == 2){
	  		if ( eval("0x"+c.charAt(3)) == 4){
	     		if (eval("0x"+c.charAt(4))==6 || eval("0x"+c.charAt(4))==7){
		        		return true;
	     		}
	  		}
		}
		//Unicodeの丸付き"上中下左右"、括弧付き"株有代"：0x3231 〜 0x32a8
		if ( eval("0x"+c.charAt(2)) == 3){
	  		if ( eval("0x"+c.charAt(3)) == 2){
	     		return true;
	  		}
		}
		//Unicodeの一文字単位、年号：0x3300 〜 0x33ff
		if ( eval("0x"+c.charAt(2)) == 3){
	  		if ( eval("0x"+c.charAt(3)) == 3){
	     		return true;
	  		}
		}
	}
	return false;
}

/**
 * XML禁則文字の判定
function isXML(str){
	if(str.match(/[<>"&]/)){
		return true;
	}
	return false;
}
 */

/**
 * 文字列の前後の半角及び、全角スペースを削る関数
 */
function trim(str){
	var rstr = str;
	while ( isSpace(rstr.charAt(0)) ){
		rstr = rstr.substring(1,rstr.length);
	}
	while ( isSpace(rstr.charAt(rstr.length-1)) ){
		rstr = rstr.substring(0,rstr.length-1);
	}
	return rstr;
}
function isSpace(cha){
	if (cha == " " || cha == "　")	return true;
}


// ========================================================================================-
// 改ページ用関数
// ========================================================================================-

/**
 * 改ページに使用します。currentタグの値に+-1した値をnextタグにsetします。
function setNextPage(){
	setNext(1);
}
function setPrevPage(){
	setNext(-1);
}
 */
/**
 * currentタグの値に引数をplusした値をnextタグにsetします。
 */
function setNext(addValue){
	form = document.forms[0];
	if ( !form.currentPage || !form.nextPage){
		alert("アプリケーションエラー。 \n currentPage,nextPageタグが必要です。");
	}
	var curValue = form.currentPage.value;
	curValue = curValue?eval(curValue):1;
	form.nextPage.value = curValue+addValue;
}
/**
 * currentタグの値に引数をplusした値をnextタグにsetします。
 */
function setSelect(addValue){
	form = document.forms[0];
	if ( !form.currentPage || !form.nextPage){
		alert("アプリケーションエラー。 \n currentPage,nextPageタグが必要です。");
	}
	var curValue = form.currentPage.value;
	curValue = curValue?eval(curValue):1;
	form.nextPage.value = addValue;
}

// ========================================================================================-
// Checkクラス
// ========================================================================================-

// 必須項目Checkクラス
function NecessityChecker(){
	this.accept = existValue;
	this.createMsg = new Function("str", "return ( str +' は必須です');");
//	this.msg = NECESSITY_ERROR;
}

// 数値項目Checkクラス
function NumericChecker(){
	this.accept = isNumeric;
	this.createMsg = new Function("str", "return ( str + ' には数値を入力してください');");
//	this.msg = NUMERIC_ERROR;
}

// 半角英数Checkクラス
function OneByteEnglishChecker(){
	this.accept = isOneByteEnglish;
	this.createMsg = new Function("str", "return ( str + ' には半角英数を入力してください');");
//	this.msg = ONEBYTE_ENG_ERROR;
}

/**
 * 半角Checkクラス。
 * 作成日：2003/7/11
 */
function HalfSizeChecker(){
	this.accept = isHalfSize;
	this.createMsg = new Function("str", "return ( str + ' は半角で入力してください');");
}

// 日付Checkクラス
function DateChecker(){
	this.accept = isDate;
	this.createMsg = new Function("str", "return ( str + ' には日付（yyyymmdd）を入力してください');");
//	this.msg = DATE_ERROR;
}

// 大小Checkクラス
function FromToChecker(){
	this.accept = isFromTo;
	this.createMsg = new Function("str", "return ( str + ' の大小関係が間違っています');");
//	this.msg = FROMTO_ERROR;
}

/**
 * 桁数Checkクラス。
 * DynaCheckListにこのクラスのインスタンスを追加した場合、対象となる値が引数の長さと同じであるか否かをチェックします
 * @param len 桁数
 * 更新日：2003/6/22
 */
function LengthChecker( len ){
	this.accept = new Function("str","return (str.length==0 || str.length==this.length);");
	this.createMsg = new Function("str", "return ( str + ' は' + this.length + '桁で入力してください');");
//	this.msg = "は"+len+"桁で入力してください。";
//	this.msg = LENGTH_ERROR+"("+len+")";
	this.length = len;
}

/**
 * 桁数Checkクラス。
 * DynaCheckListにこのクラスのインスタンスを追加した場合、対象となる値が引数の長さ以上であるか否かをチェックします
 * @param len 桁数
 */
function MinLengthChecker( len ){
	this.accept = new Function("str","return (str.length>=this.length);");
	this.createMsg = new Function("str", "return ( str + ' は' + this.length + '桁以上で入力してください');");
//	this.msg = "は"+len+"桁以上で入力してください。";
	this.length = len;
}

/**
 * 小数部・整数部を合わせた桁数Checkクラス。
 * DynaCheckListにこのクラスのインスタンスを追加した場合、対象となる値の整数部がilen以下で、かつ小数部がdlen以下であるか否かをチェックします。
 * このチェックは、対象となる値が数値であることを前提としており、内部での数値チェックは行いません。
 * @param ilen 整数部の桁数
 * @param dlen 小数部の桁数
 * 作成日：2003/06/22
 * 更新日：
 */
function DoubleLengthChecker( ilen, dlen ){
	this.accept = new Function("str","return checkDoubleLen(str, this.ilength, this.dlength);");
	this.createMsg = new Function("str", "return ( str + ' は整数部' + this.ilength + '桁、小数部' + this.dlength + '桁以内で入力してください。');");
//	this.msg = "は整数部"+ilen+"桁、小数部"+dlen+"桁以内で入力してください。";
	this.ilength = ilen;
	this.dlength = dlen;
}

/**
 * 整数Checkクラス。
 * 作成日：2003/07/08
 * 更新日：
 */
function IntChecker(){
	this.accept = isInt;
	this.createMsg = new Function("str", "return ( str + ' には半角数字を入力してください。');");
}

// ========================================================================================-
// Checkクラスのmethod・文字列チェック関数
// 使い回しを考慮し、意図的に「this.」による参照は使用しないようにしています
// ========================================================================================-

/**
 * 入力有無判別
 */
function existValue(str){
	return ( trim(str) != "" );
}

/**
 * 数値判別
 */
function isNumeric(str){
	if ( str!="" && trim(str)=="" ){
		return false;
	}
	return ( !isNaN(Number(str)) );
}

/**
 * 整数判別
 */
function isInt(str){
	return ( isNumeric(str) && str.indexOf(".")==-1 );
}

/**
 * 半角英数判別
 */
function isOneByteEnglish(str){
	for(var j=0; j<str.length ; j++){
		var ch = str.charAt(j);
		if ( ch >= " " && ch <= "~")	continue;
		return false;
	}
	return true;
}

/**
 * 半角判別
 */
function isHalfSize(str){
	for(var j=0; j<str.length ; j++){
		var ch = str.charAt(j);
		if ( ch >= " " && ch <= "~")	continue;
		if ( ch >=  'ｦ' && ch <= 'ﾟ' )	continue;
		return false;
	}
	return true;
}

/**
 * 大小判別
 */
function isFromTo(from,to){
	if ( from=="" || to=="" ){
		return true;
	}
	return ( Number(from) < Number(to) );
}

/**
 * 日付の妥当性判別
 */
function isDate(str){
	if( str==""){
		return true;
	}
	if ( str.length==8 && isNumeric(str) ){
		var year = Number(str.substring(0,4));
		var month = Number(str.substring(4,6));
		var day = Number(str.substring(6,8));
		var tmpDate = new Date(year, month-1, day);
		if( year==tmpDate.getFullYear() && month==(tmpDate.getMonth()+1) && day==tmpDate.getDate() ){
			return true;
		}
	}
	return false;
}

/**
 * double型の桁数チェック
 * @param str チェック文字列
 * @param ilen 整数部桁数
 * @param dlen 少数部桁数
 */
function checkDoubleLen( str, ilen, dlen ){
	if ( str.length<=1 ){
		return true;
	}
	var idx = str.indexOf(".");
	if ( idx==-1 ){
		//整数が入力されました
		return ( str.length <= ilen );
	}
	return ( idx<=ilen && (str.length-idx-1)<=dlen );
}
// ========================================================================================-
// その他のクラス
// ========================================================================================-

//----------------------------------------------------------------
// LabeledElementクラス

/**
 * formのエレメント情報を保持するクラス
 * @param chker 入力チェッククラス
 * @param lab 「ユーザID」などのラベル名
 * @param name inputタイプのname
 * ----------------------------------
 * form：全ての基盤となるformオブジェクト（document.forms[0]以外を使用したい場合は、セットし直してください）
 *
 * getElement()			formのelementを返します
 * getFrom(), getTo()		開始・終了に該当するelementを返します
 * getType()				検索条件に該当するelementを返します
 */
function CheckElement(chker, lab, name){
	this.form = document.forms[0];
	this.checker = chker;
	this.label = lab;
	this.name = name;
//===== added by Muramatsu 03.6.22
//エレメントの配列をサポートするように修正
	this.getElements = findElements;
//=====
	this.getElement = findElement;
	this.getFrom = findFrom;
	this.getTo = findTo;
	this.getType = findType;
}

function findElement(){
	return this.form.elements[this.name];
}
/**
 * 引数名称を持つエレメントのList（配列ではありません）を返します
 * 作成日：2003/6/22
 */
function findElements(){
	var eleAry = document.getElementsByName(this.name);
	var eleList = new List();
	for( var i=0 ; i<eleAry.length ; i++ ){
		var ele = eleAry[i];
		if ( ele.form==this.form ){
			eleList.add( ele );
		}
	}
	return eleList;
}
function findFrom(){
	return this.form.elements[this.name+"_from"];
}
function findTo(){
	return this.form.elements[this.name+"_to"];
}
function findType(){
	return this.form.elements[this.name+"_type"];
}

//----------------------------------------------------------------
// Listクラス

/**
 * JavaのListのようなクラス。メソッドは以下の２つです。
 * add(obj)：このオブジェクトにobjを追加。
 * get(index)：index番目のobjを取得。
 */
function List(){
	this.size = 0;
	this.elements = new Array();
	this.add = addToList;
	this.get = getByIndex;
	this.exists = findObj;
}
function addToList(obj){
	addToTarget( this, obj );
}
function addToTarget(list,obj){
	list.elements[list.size] = obj;
	list.size++;
}
function findObj(obj){
	for( var i=0 ; i< this.elements.length ; i++ ){
		if ( this.elements[i]==obj ){
			return true;
		}
	}
	return false;
}
function getByIndex(idx){
	return this.elements[idx];
}

//----------------------------------------------------------------
// CheckListクラス

/**
 * Listのサブクラス。メソッドはListを参照してください。
 * add(checker, lab, name)：このListにCheckElementを追加。
 */
function DynaCheckList(){
	List.call(this);
	this.add = addCheckElement;
}
/**
 * DynaCheckListのaddメソッド。
 * @param chker (例： new LengthChecker(10) )
 * @param lab ラベル（例：ユーザID）
 * @param name 要素名（例：user_id）
 */
function addCheckElement( chker, lab, name ){
	addToTarget( this, new CheckElement( chker, lab, name ) );
}

/**
 * Listのサブクラス。メソッドはListを参照してください。
 * add(lab, name)：このListにCheckElementを追加。
 */
function CheckList(chker){
	List.call(this);
	this.checker = chker;
	this.add = addElement;
}
/**
 * CheckListのaddメソッド。
 * @param lab ラベル（例：ユーザID）
 * @param name 要素名（例：user_id）
 */
function addElement( lab, name ){
	addToTarget( this, new CheckElement( this.checker, lab, name ) );
}

 function batchRun1(){	
 	 alert("test");
 	fs = new ActiveXObject("Scripting.FileSystemObject");
//	var WshShell = WScript.CreateObject("WScript.Shell");
//	WshShell.Run("C:\\Kashmir\\Kash.exe");
 }

function manual(url){
var form = document.bform;
var url = url
form.action=url;
form.target="_blank";
form.submit();

}
