/*
 * MosP - Mind Open Source Project    http://www.mosp.jp/
 * Copyright (C) MIND Co., Ltd.       http://www.e-mind.co.jp/
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
// キー押下イベントハンドラ設定
document.onkeydown = onKeyDown;

// URL
var URL_SRV = "../srv/";
var URL_PUB = "../pub/";

// メッセージ区切り
var SEPARATOR_MESSAGE = ",";

// メッセージ区切り
var SEPARATOR_MESSAGE_JP = "、";

// デフォルト例外メッセージ
var ERROR_MESSAGE = "";

// 背景色
var COLOR_BACKGROUND       = "#f8f8f8";
var COLOR_TABLE_BACKGROUND = "#eeeeee";

// 文字色
var COLOR_FONT_NORMAL  = "black";
var COLOR_FONT_DISABLE = "#8b8b7a";

// メッセージ色
var COLOR_MSG_INFO    = "black";
var COLOR_MSG_WARNING = "blue";
var COLOR_MSG_ERROR   = "red";

// フィールド色
var COLOR_FIELD_NORMAL = "#f8f8f8";
var COLOR_FIELD_ERROR  = "pink";

// テーブル色
var COLOR_TABLE_ROW1   = "#f8f8f8";
var COLOR_TABLE_ROW2   = "#eeeeee";
var COLOR_TABLE_SELECT = "pink";

// フォーカス操作関連変数
var aryFocusObjectIdStore = new Array(0);
var objFocused = null;

// 一覧表示関連
var numPosition;		// 表示開始位置
var numListCount;		// 一覧表示件数
var numDataCount;		// データ件数
var strGetRestCommand;	// 残分取得コマンド

// ダイアログオブジェクト
var objDialog = null;

// ダイアログフラグ
var isDialog = false;

// 問合中フラグ
var inquiring = false;

// ファイル取得中フラグ
var gettingFile = false;

// *****************************************************************************

/**
 * submit処理
 * @param objForm フォームオブジェクト
 * @param cmd     コマンド
 * @return 無し
 * @throws 実行時例外
 */
function doSubmit(objForm, cmd) {
	// 問合中フラグ確認
	if (inquiring) {
		return;
	} else {
		inquiring = true;
	}
	// submit
	objForm.resType.value = "html";
	objForm.cmd.value     = cmd;
	objForm.target        = "_self";
	objForm.method        = "Post";
	objForm.action        = URL_SRV;
	objForm.submit();
}

/**
 * submit処理
 * @param objForm フォームオブジェクト
 * @param cmd     コマンド
 * @return 無し
 * @throws 実行時例外
 */
function doSubmitFile(objForm, cmd) {
	// 問合中フラグ確認
	if (inquiring) {
		return;
	} else {
		inquiring = true;
	}
	// ファイル取得中フラグ設定
	gettingFile = true;
	// submit
	objForm.resType.value = "file";
	objForm.cmd.value     = cmd;
	objForm.target        = "_self";
	objForm.method        = "Post";
	objForm.action        = URL_SRV;
	objForm.submit();
	inquiring = false;
}

/**
 * submit処理
 * @param objForm フォームオブジェクト
 * @param cmd     コマンド
 * @param key1    キー1
 * @param key2    キー2
 * @return 無し
 * @throws 実行時例外
 */
function doSubmitFileKey(objForm, cmd, key1, key2) {
	// 問合中フラグ確認
	if (inquiring) {
		return;
	} else {
		inquiring = true;
	}
	// ファイル取得中フラグ設定
	gettingFile = true;
	// submit
	objForm.key1.value    = key1;
	objForm.key2.value    = key2;
	objForm.resType.value = "file";
	objForm.cmd.value     = cmd;
	objForm.target        = "_self";
	objForm.method        = "Post";
	objForm.action        = URL_SRV;
	objForm.submit();
	inquiring = false;
}

/**
 * submit処理
 * @param objForm フォームオブジェクト
 * @param cmd     コマンド
 * @return 無し
 * @throws 実行時例外
 */
function doSubmitMulti(objForm, cmd) {
	// 問合中フラグ確認
	if (inquiring) {
		return;
	} else {
		inquiring = true;
	}
	// submit
	objForm.encoding      = "multipart/form-data"
	objForm.resType.value = "html";
	objForm.cmd.value     = cmd;
	objForm.target        = "_self";
	objForm.method        = "Post";
	objForm.action        = URL_SRV;
	objForm.submit();
}

/**
 * 確認メッセージ付きsubmit処理
 * @param objForm フォームオブジェクト
 * @param cmd     コマンド
 * @param code    メッセージコード
 * @param rep     変換文字列
 * @return 無し
 * @throws 実行時例外
 */
function doSubmitMessage(objForm, cmd, code, rep) {
	// 問合中フラグ確認
	if (inquiring) {
		return;
	}
	if (!confirm(getMessage(code, rep))) {
		return;
	}
	// submit
	doSubmit(objForm, cmd);
}

/**
 * key設定付きsubmit処理
 * @param objForm フォームオブジェクト
 * @param cmd     コマンド
 * @param key1    キー1
 * @param key2    キー2
 * @return 無し
 * @throws 実行時例外
 */
function doSubmitKey(objForm, cmd, key1, key2) {
	objForm.key1.value = key1;
	objForm.key2.value = key2;
	doSubmit(objForm, cmd);
}

/**
 * 確認メッセージ付きキー設定付きsubmit処理
 * @param objForm フォームオブジェクト
 * @param cmd     コマンド
 * @param code    メッセージコード
 * @param rep     変換文字列
 * @return 無し
 * @throws 実行時例外
 */
function doSubmitMessageKey(objForm, cmd, code, rep, key1, key2) {
	// 問合中フラグ確認
	if (inquiring) {
		return;
	}
	if (!confirm(getMessage(code, rep))) {
		return;
	}
	// submit
	doSubmitKey(objForm, cmd, key1, key2);
}

/**
 * key設定付きイメージファイル取得処理
 * @param objForm フォームオブジェクト
 * @param cmd     コマンド
 * @param key1    キー1
 * @param key2    キー2
 * @return 無し
 * @throws 実行時例外
 */
function doSubmitImage(objForm, cmd, key1, key2) {
	objForm.key1.value = key1;
	objForm.key2.value = key2;
	objForm.resType.value = "image";
	objForm.cmd.value     = cmd;
	objForm.target        = "_self";
	objForm.method        = "Post";
	objForm.action        = URL_SRV;
	objForm.submit();
}

/**
 * ダイアログ表示submit処理
 * @param objForm フォームオブジェクト
 * @param cmd     コマンド
 * @return 無し
 * @throws 実行時例外
 */
function showDialog(objForm, cmd) {
	// 問合中フラグ確認
	if (inquiring) {
		return;
	} else {
		inquiring = true;
	}
	// ダイアログ準備
	objDialog = window.open("about:blank", "dialog",
		"toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=yes"
	);
	// ダイアログ表示位置調整
	var numPosition = 0;
	numPosition = isDialog ? 100 : 50;
	// submit準備
	objForm.cmd.value     = cmd;
	objForm.resType.value = "html";
	objForm.target        = "dialog";
	objForm.method        = "Post";
	objForm.action        = URL_SRV;
	// ダイアログ準備完了確認
	if (objDialog != null) {
		// ダイアログ位置調整及びsubmit(準備ができていた場合)
		objDialog.moveTo(numPosition, numPosition);
		objForm.submit();
	} else {
		// 警告メッセージ表示(準備ができていない場合)
		alert(getMessage("WC0102", ""));
		// ダイアログ準備完了再確認
		if (objDialog != null) {
			// ダイアログ位置調整及びsubmit(準備ができていた場合)
			objDialog.moveTo(numPosition, numPosition);
			objForm.submit();
		} else {
			// submitせず問合フラグを戻す(準備ができていない場合)
			inquiring = false;
		}
	}
}

/**
 * 画面読込イベントハンドラ
 * @param e 画面読込イベント
 * @return 無し
 * @throws 無し
 */
function onLoad(e) {
	try {
		// window.name初期化
		window.name = "";
		// 背景色設定
		setBgColor("base" ,COLOR_BACKGROUND)
		// 画面読込時追加処理
		onLoadExtra();
		// ダイアログ初期化処理(ダイアログの場合)
		if (isDialog) {
			initDialog();
			// procSeq設定
			setProcSeqValue(getProcSeq());
		}
	} catch (e) {
		handleException(e);
	}
}

/**
 * 画面アンロード時イベントハンドラ
 * @param e 画面アンロードイベント
 * @return 無し
 * @throws 無し
 */
function onUnload(e) {
	try {
		// 問合中でない且つダイアログでない場合
		if (!inquiring && !isDialog && !gettingFile) {
			doSubmit(document.form, "C1030");
			return;
		}
		// 問合中でないあるいは所持ダイアログ無の場合
		if (!inquiring || objDialog != null) {
			// 所持ダイアログ有の場合
			if (objDialog != null && !objDialog.closed) {
				// 所持ダイアログクローズ
				objDialog.close();
			}
			// opener有の場合
			if (window.opener != null && !window.opener.closed) {
				// opener問合中フラグ戻し
				window.opener.inquiring = false;
				// windowクローズ
				window.close();
			}
		}
		// 画面アンロード時追加処理
		onUnloadExtra();
	} catch (e) {
		handleException(e);
	}
}

/**
 * 画面クローズ(ベース画面用)
 * @param 無し
 * @return 無し
 * @throws 実行時例外
 */
function closeWindow() {
	inquiring = true;
	window.open("about:blank","_self");
	window.opener = null;
	window.close();
}

/**
 * ダイアログ初期化処理
 * @param 無し
 * @return 無し
 * @throws 無し
 */
function initDialog() {
	// ダイアログ初期化追加処理
	initDialogExtra();
}

/**
 * 画面読込時追加処理
 * @param 無し
 * @return 無し
 * @throws 無し
 */
function onLoadExtra(){}

/**
 * 画面アンロード時追加処理
 * @param 無し
 * @return 無し
 * @throws 無し
 */
function onUnloadExtra(){}

/**
 * ダイアログ初期化追加処理
 * @param 無し
 * @return 無し
 * @throws 無し
 */
function initDialogExtra() {}

/**
 * フォーカス取得イベントハンドラ設定
 * @param aryFocusObjectId フォーカス取得対象オブジェクトID配列
 * @return 無し
 * @throws 実行時例外
 */
function setOnFocusHandler(aryFocusObjectId) {
	// 繰返し要否フラグ(%使用時)
	var needLoop = false;
	// 繰返し時インデックス
	var idx = 0;
	// 旧フォーカス取得イベント除去
	for (var i = 0; i < aryFocusObjectIdStore.length; i++) {
		if (getObject(aryFocusObjectIdStore[i]) != null) {
			getObject(aryFocusObjectIdStore[i]).onfocus = "";
		}
	}
	// フォーカス取得対象オブジェクトID配列設定
	aryFocusObjectIdStore = getAryTargetId(aryFocusObjectId);
	// 新フォーカス取得イベント設定
	for (var i = 0; i < aryFocusObjectIdStore.length; i++) {
		if (getObject(aryFocusObjectIdStore[i]) != null) {
			getObject(aryFocusObjectIdStore[i]).onfocus = onFocus;
		}
	}
	// フォーカス設定
	for (var i = 0; i < aryFocusObjectIdStore.length; i++) {
		if (getObject(aryFocusObjectIdStore[i]) != null) {
			setFocus(aryFocusObjectIdStore[i]);
			break;
		}
	}
}

/**
 * フォーカス取得イベント
 * @param e フォーカス取得イベント
 * @return 無し
 * @throws 無し
 */
function onFocus(e) {
	try {
		objFocused = this;
		onFocusExtra(e);
	} catch (e) {
		handleException(e);
	}
}

/**
 * フォーカス取得イベント補足時追加処理
 * @param e フォーカス取得イベント
 * @return 無し
 * @throws 実行時例外
 */
function onFocusExtra(e){
}

/**
 * 変更イベントハンドラ設定
 * @param target      設定対象(StringあるいはObject)
 * @param objFunction 設定ファンクション
 * @return 無し
 * @throws 実行時例外
 */
function setOnChangeHandler(target, objFunction) {
	getObject(target).onchange = objFunction;
}

/**
 * 変更イベントハンドラ設定
 * @param targetId   設定対象オブジェクトID(StringあるいはArray)
 * @param objFunction 設定ファンクション
 * @return 無し
 * @throws 実行時例外
 */
function setFieldsOnChangeHandler(targetId, objFunction) {
	aryTargetId = getAryTargetId(targetId);
	for (var i = 0; i < aryTargetId.length; i++) {
		setOnChangeHandler(aryTargetId[i], objFunction);
	}
}

/**
 * キーダウンイベント
 * @param e キーダウンイベント
 * @return 無し
 * @throws 無し
 */
function onKeyDown(e) {
	try {
		
		if (window.event != null) {
			e = window.event;
		}
		switch (e.keyCode) {
			case 8:
				if (isTextField(e)) {
					return true;
				}
				break;
			case 9:
				return true;
			case 13:
				/*
				if (e.shiftKey) {
					doEnter(false);
				} else {
					doEnter(true);
				}
				break;
				if (window.event != null) {
					window.event.keyCode = 9;
					return true;
				} else {
					return false;
				}*/
				if (isTextArea(e)) {
					return true;
				}
				break;
			case 17:
				/*
				doExecute();
				break;
				*/
			case 33:
				/*
				doPageUp();
				break;
				*/
			case 34:
				/*
				doPageDown();
				break;
				*/
			case 112:
				if (e.shiftKey) {
					doF13();
				} else {
					doF1();
				}
				break;
			case 113:
				if (e.shiftKey) {
					doF14();
				} else {
					doF2();
				}
				break;
			case 114:
				if (e.shiftKey) {
					doF15();
				} else {
					doF3();
				}
				break;
			case 115:
				if (e.shiftKey) {
					doF16();
				} else {
					doF4();
				}
				break;
			case 116:
				if (e.shiftKey) {
					doF17();
				} else {
					doF5();
				}
				break;
			case 117:
				if (e.shiftKey) {
					doF18();
				} else {
					doF6();
				}
				break;
			case 118:
				if (e.shiftKey) {
					doF19();
				} else {
					doF7();
				}
				break;
			case 119:
				if (e.shiftKey) {
					doF20();
				} else {
					doF8();
				}
				break;
			case 120:
				if (e.shiftKey) {
					doF21();
				} else {
					doF9();
				}
				break;
			case 121:
				if (e.shiftKey) {
					doF22();
				} else {
					doF10();
				}
				break;
			case 122:
				if (e.shiftKey) {
					doF23();
				} else {
					doF11();
				}
				break;
			case 123:
				if (e.shiftKey) {
					doF24();
				} else {
					doF12();
				}
				break;
			default:
				return true;
		}
		if (window.event != null) {
			if (e.keyCode != 17) {
				window.event.keyCode = 0;
			}
		}
		return false;
	} catch (e) {
		handleException(e);
	}
}

// ファンクションキーダミー関数
function doExecute() {}
function doF1() {}
function doF2() {}
function doF3() {}
function doF4() {}
function doF5() {}
function doF6() {}
function doF7() {}
function doF8() {}
function doF9() {}
function doF10() {}
function doF11() {}
function doF12() {}
function doF13() {}
function doF14() {}
function doF15() {}
function doF16() {}
function doF17() {}
function doF18() {}
function doF19() {}
function doF20() {}
function doF21() {}
function doF22() {}
function doF23() {}
function doF24() {}

/**
 * Enterキー押下時実行関数
 * @param isDescending 移動方向フラグ(true:下、false：上)
 * @return 無し
 * @throws 実行時例外
 */
function doEnter(isDescending) {
	// 変数宣言
	var idx = 0;
	var objTarget = null;
	// フォーカス取得フィールドID配列確認
	if (aryFocusObjectIdStore.length == 0) {
		return;
	}
	// フォーカス外し
	removeFocus();
	// 移動方向フラグ確認
	if (isDescending) {
		idx = 0;
		for (var i = 0; i < aryFocusObjectIdStore.length; i++) {
			if (objFocused.id == aryFocusObjectIdStore[i]) {
				if (i < aryFocusObjectIdStore.length - 1) {
					idx = i + 1;
				}
				objTarget = getObject(aryFocusObjectIdStore[idx]);
				if (objTarget.style.visibility == "hidden" || objTarget.readOnly == "readonly") {
					objFocused = objTarget;
					objTarget = null;
					idx = 0;
				} else {
					break;
				}
				break;
			}
		}
		if (objTarget == null) {
			for (var i = 0; i < aryFocusObjectIdStore.length; i++) {
				objTarget = getObject(aryFocusObjectIdStore[i]);
				if (objTarget.style.visibility != "hidden" && objTarget.readOnly != "readonly") {
					break;
				}
				break;
			}
		}
	} else {
		idx = aryFocusObjectIdStore.length - 1;
		for (var i = aryFocusObjectIdStore.length - 1; i >= 0; i--) {
			if (objFocused.id == aryFocusObjectIdStore[i]) {
				if (i > 0) {
					idx = i - 1;
				}
				objTarget = getObject(aryFocusObjectIdStore[idx]);
				if (objTarget.style.visibility == "hidden" || objTarget.readOnly == "readonly") {
					objFocused = objTarget;
					objTarget = null;
					idx = 0;
				} else {
					break;
				}
				break;
			}
		}
		if (objTarget == null) {
			for (var i = aryFocusObjectIdStore.length - 1; i >= 0; i--) {
				objTarget = getObject(aryFocusObjectIdStore[i]);
				if (objTarget.style.visibility != "hidden" && objTarget.readOnly != "readonly") {
					idx = i;
					break;
				}
			}
		}
	}
	// フォーカス設定
	setFocus(aryFocusObjectIdStore[idx]);
}

/**
 * BackSpaceキー押下時実行関数
 * @param e イベントオブジェクト
 * @return 実行可否
 * @throws 実行時例外
 */
function doBackSpace(e) {
	if (e == null || e.srcElement == null) {
		return true;
	}
	var aryInput = document.all.tags("input");
	for (i = 0; i < aryInput.length; i++) {
		if (aryInput[i].name == e.srcElement.name && (
				aryInput[i].type == "text" || aryInput[i].type == "password"
		)) {
			return true;
		}
	}
	var aryArea = document.all.tags("textarea");
	for (i = 0; i < aryArea.length; i++) {
		if (aryArea[i].name == e.srcElement.name) {
			return true;
		}
	}
	return false;
}

/**
 * pageUpキー押下時実行関数
 * @param 無し
 * @return 無し
 * @throws 実行時例外
 */
function doPageUp() {
	if (xmlDoc == null) {
		return;
	}
	var elmList = xmlDoc.getElementsByTagName("List");
	if (elmList == null) {
		return;
	}
	if (numPosition != 0) {
		numPosition -= numListCount;
		numPosition = numPosition < 0 ? 0 : numPosition;
		setList();
		setPageMessage();
	}
}

/**
 * pageDownキー押下時実行関数
 * @param 無し
 * @return 無し
 * @throws 実行時例外
 */
function doPageDown() {
	if (xmlDoc == null) {
		return;
	}
	var elmList = xmlDoc.getElementsByTagName("List");
	if (elmList == null) {
		return;
	}
	if (numPosition + numListCount < numDataCount) {
		if (elmList.length > numPosition + numListCount * 2 || elmList.length == numDataCount) {
			numPosition += numListCount;
			setList();
		} else {
			getRest();
			numPosition += numListCount;
			setList();
		}
		setPageMessage();
	}
}

/**
 * pageUpキー押下時実行関数(明細用)
 * @param 無し
 * @return 無し
 * @throws 実行時例外
 */
function doPageUpDetails() {
	if (aryDetails == null) {
		return;
	}
	if (numPosition != 0) {
		removeFocus();
		if (numModeFlag == 0 || numModeFlag == 1) {
			storeDetailsValue();
		}
		numPosition -= numListCount;
		numPosition = numPosition < 0 ? 0 : numPosition;
		setDetailsValue();
	}
}

/**
 * pageDownキー押下時実行関数(明細用)
 * @param 無し
 * @return 無し
 * @throws 実行時例外
 */
function doPageDownDetails() {
	if (aryDetails == null) {
		return;
	}
	if (numPosition + numListCount < numDetailsCount) {
		removeFocus();
		if (numModeFlag == 0 || numModeFlag == 1) {
			storeDetailsValue();
		}
		numPosition += numListCount;
		setDetailsValue();
	}
}

/**
 * テキストフィールド確認関数
 * @param e キーダウンイベント
 * @return 確認結果(true：テキストフィールド、false：テキストフィールドでない)
 * @throws 実行時例外
 */
function isTextField(e) {
	var objTarget = getSrcElement(e);
	if (objTarget == null) {
		return false;
	}
	if (objTarget.type == "text" || objTarget.type == "password" || objTarget.type == "textarea") {
		if (objTarget.readOnly || objTarget.disabled) {
			return false;
		}
		return true;
	}
	return false;
}

/**
 * テキストエリア確認関数
 * @param e キーダウンイベント
 * @return 確認結果(true：テキストエリア、false：テキストエリアでない)
 * @throws 実行時例外
 */
function isTextArea(e) {
	var objTarget = getSrcElement(e);
	if (objTarget == null) {
		return false;
	}
	if (objTarget.type == "textarea") {
		if (objTarget.readOnly || objTarget.disabled) {
			return false;
		}
		return true;
	}
	return false;
}

/**
 * イベント発生オブジェクト取得
 * @param e イベント
 * @return イベント発生オブジェクト
 * @throws 実行時例外
 */
function getSrcElement(e) {
	var objTarget = null;
	if (window.event != null) {
		return window.event.srcElement;
	} else if (e.target != null) {
		return e.target;
	}
}

/**
 * 表示件数メッセージ表示
 * @param 無し
 * @return 無し
 * @throws 無し
 */
function setPageMessage() {
	var elmList = xmlDoc.getElementsByTagName("List");
	if (elmList == null) {
		return;
	}
	var strReplace = "";
	var numTo = numPosition + numListCount;
	numTo = numTo > elmList.length ? elmList.length : numTo;
	strReplace += String(numPosition + 1) + SEPARATOR_MESSAGE;
	strReplace += String(numTo) + SEPARATOR_MESSAGE;
	strReplace += String(numDataCount);
	setMessage("IC0013", strReplace);
}


/**
 * 一覧設定関数(ダミー)
 * @param 無し
 * @return 無し
 * @throws 無し
 */
function setList() {}

/**
 * 操作対象オブジェクト取得
 * @param target 取得対象(StringあるいはObject)
 * @return 操作対象オブジェクト
 * @throws 無し
 */
function getObject(target) {
	var objTarget = target;
	if (typeof target == 'string') {
		objTarget = document.getElementById(target);
	}
	return objTarget;
}

/**
 * 操作対象オブジェクト取得(配列用)
 * @param strTargetName 取得対象オブジェクトName
 * @param index         取得対象Index
 * @return 操作対象オブジェクト
 * @throws 無し
 */
function getObjectDetails(strTargetName, index) {
	var objTarget = document.getElementsByName(strTargetName);
	if (objTarget != null && objTarget.length != null && objTarget.length > 0) {
		return objTarget[index];
	}
	return null;
}

/**
 * フォーカス設定
 * @param target 設定対象(StringあるいはObject)
 * @return 無し
 * @throws 実行時例外
 */
function setFocus(target) {
	var objTarget = getObject(target);
	if (objTarget == null) {
		return;
	}
	removeFocus();
	switch (objTarget.type) {
		case "text":
			objTarget.focus();
			if (objTarget.value != "") {
				objTarget.select();
			}
			break;
		case "select-one":
			objTarget.focus();
			break;
		default:
			objTarget.focus();
	}
}

/**
 * フォーカス外し
 * @param 無し
 * @return 無し
 * @throws 実行時例外
 */
function removeFocus() {
	if (objFocused != null) {
		objFocused.blur();
	}
}

/**
 * フィールドクリア
 * @param aryTargetId 設定対象オブジェクトID配列
 * @return 無し
 * @throws 実行時例外
 */
function clearFields(aryTargetId) {
	for (var i = 0; i < aryTargetId.length; i++) {
		setFormValue(aryTargetId[i], "");
	}
}

/**
 * フィールド背景色設定
 * @param target   設定対象(StringあるいはObject)
 * @param strColor 設定色
 * @return 無し
 * @throws 実行時例外
 */
function setBgColor(target, strColor) {
	var objTarget = getObject(target);
	if (objTarget == null || objTarget.style == null) {
		return;
	}
	if (objTarget.type == null) {
		objTarget.style.backgroundColor = strColor;
		return;
	}
	switch (objTarget.type) {
		case "text":
			objTarget.style.backgroundColor = strColor;
			break;
		case "select-one":
			objTarget.style.backgroundColor = strColor;
			for (var i = 0; i < objTarget.options.length; i++) {
				objTarget.options[i].style.backgroundColor = strColor;
			}
			break;
		default:
			objTarget.style.backgroundColor = strColor;
	}
}

/**
 * フィールド背景色取得
 * @param target 取得対象(StringあるいはObject)
 * @return フィールド背景色
 * @throws 実行時例外
 */
function getBgColor(target) {
	var objTarget = getObject(target);
	if (objTarget == null || objTarget.style == null) {
		return "white";
	} else {
		return objTarget.style.backgroundColor;
	}
}

/**
 * フィールド背景色設定
 * @param targetId 設定対象オブジェクトID(StringあるいはArray)
 * @param strColor 設定色
 * @return 無し
 * @throws 実行時例外
 */
function setFieldsBgColor(targetId, strColor) {
	var aryTargetId = getAryTargetId(targetId);
	for (var i = 0; i < aryTargetId.length; i++) {
		setBgColor(aryTargetId[i], strColor);
	}
}

/**
 * フィールド背景色設定(明細用)
 * @param strTargetName 設定対象オブジェクトName
 * @param strColor      設定色
 * @return 無し
 * @throws 実行時例外
 */
function setDetailsBgColorAll(targetName, strColor) {
	var aryTargetName = getAryTargetId(targetName);
	for (var i = 0; i < aryTargetName.length; i++) {
		var objTarget = document.getElementsByName(aryTargetName[i]);
		if (objTarget != null && objTarget.length != null) {
			for (var j = 0; j < objTarget.length; j++) {
				setBgColor(getObjectDetails(aryTargetName[i], j), strColor);
			}
		}
	}
}

/**
 * フィールド背景色設定(明細用)
 * @param aryTarget 設定対象配列
 * @param strColor  設定色
 * @return 無し
 * @throws 実行時例外
 */
function setDetailsBgColor(aryTarget, strColor) {
	for (var i = 0; i < aryTarget.length; i++) {
		setBgColor(getObjectDetails(aryTarget[i][0], aryTarget[i][1]), strColor);
	}
}

/**
 * 文字色設定
 * @param target   設定対象(StringあるいはObject)
 * @param strColor 設定色
 * @return 無し
 * @throws 実行時例外
 */
function setColor(target, strColor) {
	var objTarget = getObject(target);
	if (objTarget == null || objTarget.style == null) {
		return;
	}
	if (objTarget.type == null) {
		objTarget.style.color = strColor;
		return;
	}
	switch (objTarget.type) {
		case "text":
			objTarget.style.color = strColor;
			break;
		case "select-one":
			objTarget.style.color = strColor;
			for (var i = 0; i < objTarget.options.length; i++) {
				objTarget.options[i].style.color = strColor;
			}
			break;
		default:
			objTarget.style.color = strColor;
	}
}

/**
 * 文字色設定
 * @param targetId 設定対象オブジェクトID(StringあるいはArray)
 * @param strColor 設定色
 * @return 無し
 * @throws 実行時例外
 */
function setFieldsColor(targetId, strColor) {
	aryTargetId = getAryTargetId(targetId);
	for (var i = 0; i < aryTargetId.length; i++) {
		setColor(aryTargetId[i], strColor);
	}
}

/**
 * 下線色設定
 * @param target   設定対象
 * @param strColor 設定色
 * @return 無し
 * @throws 実行時例外
 */
function setBorderBottomColor(target, strColor) {
	var objTarget = getObject(target);
	if (objTarget != null && objTarget.style != null) {
		objTarget.style.borderBottomColor = strColor;
	}
}
/**
 * 下線色設定
 * @param targetId 設定対象オブジェクトID(StringあるいはArray)
 * @param strColor 設定色
 * @return 無し
 * @throws 実行時例外
 */
function setFieldsBorderBottomColor(targetId, strColor) {
	aryTargetId = getAryTargetId(targetId);
	for (var i = 0; i < aryTargetId.length; i++) {
		setBorderBottomColor(aryTargetId[i], strColor);
	}
}

/**
 * フィールド長設定
 * @param target    設定対象(StringあるいはObject)
 * @param numLength フィールド長
 * @return 無し
 * @throws 実行時例外
 */
function setMaxLength(target, numLength) {
	var	objTarget = getObject(target);
	if (objTarget == null || objTarget.maxLength == null) {
		return;
	}
	objTarget.maxLength = numLength;
}

/**
 * フィールド長設定
 * @param strTargetId 設定対象オブジェクトID
 * @param numLength   フィールド長
 * @return 無し
 * @throws 実行時例外
 */
function setFieldsMaxLength(strTargetId, numLength) {
	var aryTargetId = getAryTargetId(strTargetId);
	for (var i = 0; i < aryTargetId.length; i++) {
		setMaxLength(aryTargetId[i], numLength);
	}
}


/**
 * ターゲットオブジェクトID配列取得
 * @param targetId 設定対象オブジェクトID(StringあるいはArray)
 * @return ターゲットオブジェクトID配列
 * @throws 実行時例外
 */
function getAryTargetId(targetId) {
	// 変数宣言
	var aryTargetId = new Array();
	var needLoop = false;
	var idx = 0;
	// 引数の型を確認
	if (typeof targetId == 'string') {
		targetId = new Array(targetId);
	}
	// 繰返し要否を確認
	for (var i = 0; i < targetId.length; i++) {
		if (targetId[i].indexOf("%") != -1) {
			needLoop = true;
			break;
		}
	}
	// 配列の作成
	for (var i = 0; i < targetId.length; i++) {
		aryTargetId.push(targetId[i].replace("%", String(idx)));
	}
	idx++;
	while (needLoop) {
		for (var i = 0; i < targetId.length; i++) {
			if (targetId[i].indexOf("%") != -1) {
				var strTargetId = targetId[i].replace("%", String(idx));
				if (getObject(strTargetId) == null) {
					needLoop = false;
					break;
				} else {
					aryTargetId.push(strTargetId);
				}
			}
		}
		idx++;
	}
	return aryTargetId;
}

/**
 * 一覧背景色設定
 * @param strTargetTable 設定対象テーブルオブジェクトID
 * @return 無し
 * @throws 実行時例外
 */
function setTableColor(strTargetTable) {
	var objTable = getObject(strTargetTable);
	if (objTable == null) {
		return;
	}
	var objTarget = null;
	var numHeader = 0;
	var numFooter = 0;
	if (objTable.tHead) {
    	numHeader = objTable.tHead.rows.length;
	}
	if (objTable.tFoot) {
    	numFooter = objTable.tFoot.rows.length;
	}
	for (var i = numHeader; i < objTable.rows.length - numFooter; i ++) {
		objTable.rows[i].bgColor = i % 2 == 0 ? COLOR_TABLE_ROW2 : COLOR_TABLE_ROW1;
		objTable.rows[i].onmouseover = function(){this.bgColor = COLOR_TABLE_SELECT;};
		objTable.rows[i].onmouseout  = function(){this.bgColor = this.rowIndex % 2 == 0 ? COLOR_TABLE_ROW2 : COLOR_TABLE_ROW1;};
	}
}

/**
 * 読取専用設定
 * @param target     設定対象(StringあるいはObject)
 * @param isReadOnly 読取専用フラグ(true：読取専用、false：入力可能)
 * @return 無し
 * @throws 実行時例外
 */
function setReadOnly(target, isReadOnly) {
	var objTarget = getObject(target);
	if (isReadOnly) {
		objTarget.blur();
		window.focus();
	}
	switch (objTarget.type) {
		case "text":
			if (isReadOnly) {
				objTarget.readOnly = "readonly";
			} else {
				objTarget.readOnly = "";
			}
			break;
		case "select-one":
		case "checkbox":
			objTarget.disabled = isReadOnly;
			break;
		default:
	}
	if (isReadOnly) {
		setColor(target, COLOR_FONT_DISABLE);
	} else {
		setColor(target, COLOR_FONT_NORMAL);
	}
}

/**
 * 読取専用設定
 * @param targetId   設定対象オブジェクトID(StringあるいはArray)
 * @param isReadOnly 読取専用フラグ(true：読取専用、false：入力可能)
 * @return 無し
 * @throws 実行時例外
 */
function setFieldsReadOnly(targetId, isReadOnly) {
	aryTargetId = getAryTargetId(targetId);
	for (var i = 0; i < aryTargetId.length; i++) {
		setReadOnly(aryTargetId[i], isReadOnly);
	}
}

/**
 * 可視設定
 * @param target    設定対象(StringあるいはObject)
 * @param isVisible 設定内容
 * @return 無し
 * @throws 実行時例外
 */
function setVisibility(target, isVisible) {
	var objTarget = getObject(target);
	if (objTarget == null) {
		return;
	}
	if (isVisible) {
		objTarget.style.visibility = "visible";
	} else {
		objTarget.style.visibility = "hidden";
	}
}

/**
 * 可視設定
 * @param targetId  設定対象オブジェクトID(StringあるいはArray)
 * @param isVisible 設定内容
 * @return 無し
 * @throws 実行時例外
 */
function setFieldsVisibility(targetId, isVisible) {
	aryTargetId = getAryTargetId(targetId);
	for (var i = 0; i < aryTargetId.length; i++) {
		setVisibility(aryTargetId[i], isVisible);
	}
}

/**
 * 不可視設定(テーブル内フィールド)
 * @param strTargetTable  設定対象テーブルオブジェクトID
 * @param strTargetPrefix 設定対象オブジェクトIDプレフィックス
 * @param numStart        不可視行開始インデックス
 * @return 無し
 * @throws 実行時例外
 */
function setFieldsHidden(strTargetTable, strTargetPrefix, numStart) {
	var targetTable = getObject(strTargetTable);
	var objTarget = null;
	for (var i = numStart; i < targetTable.rows.length; i ++) {
		objTarget = getObject(strTargetPrefix + String(i));
		if (objTarget != null) {
			objTarget.style.visibility = "hidden";
		}
	}
}

/**
 * 可視設定(テーブル内フィールド)
 * @param strTargetTable  設定対象テーブルオブジェクトID
 * @param strTargetPrefix 設定対象オブジェクトIDプレフィックス
 * @return 無し
 * @throws 実行時例外
 */
function setFieldsVisible(strTargetTable, strTargetPrefix) {
	var targetTable = getObject(strTargetTable);
	var objTarget = null;
	for (var i = 0; i < targetTable.rows.length; i ++) {
		if (i >= numListCount) {
			break;
		}
		objTarget = getObject(strTargetPrefix + String(i));
		if (objTarget != null) {
			objTarget.style.visibility = "visible";
		}
	}
}

/**
 * オブジェクトの表示・非表示
 * @param テーブルid
 * @param  num
 * @return 無し
 * @throws 実行時例外
 */
function setObjectVisibility(target , isVisible) {
	var objTarget = getObject(target);
	if (objTarget == null) {
		return;
	}
	if (isVisible) {
		objTarget.style.display = "block";
	} else {
		objTarget.style.display = "none";
	}
}

/**
 * 有効/無効設定
 * @param target   設定対象(StringあるいはObject)
 * @param disabled 有効/無効(true：無効、false：有効)
 * @return 無し
 * @throws 実行時例外
 */
function setDisabled(target, disabled) {
	var objTarget = getObject(target);
	if (objTarget != null && objTarget.disabled != null) {
		objTarget.disabled = disabled;
	}
}

/**
 * 内容設定
 * @param target   設定対象(StringあるいはObject)
 * @param strInner 設定内容
 * @return 無し
 * @throws 実行時例外
 */
function setInnerHtml(target, strInner) {
	var objTarget = getObject(target);
	if (objTarget != null) {
		objTarget.innerHTML = strInner;
	}
}

/**
 * 内容設定
 * @param targetId  設定対象オブジェクトID(StringあるいはArray)
 * @param strInner  設定内容
 * @return 無し
 * @throws 実行時例外
 */
function setFieldsInnerHtml(targetId, strInner) {
	aryTargetId = getAryTargetId(targetId);
	for (var i = 0; i < aryTargetId.length; i++) {
		setInnerHtml(aryTargetId[i], strInner);
	}
}


/**
 * 幅設定
 * @param target   設定対象(StringあるいはObject)
 * @param strWidth 設定幅(単位含：10px等)
 * @return 無し
 * @throws 実行時例外
 */
function setWidth(target, strWidth) {
	var objTarget = getObject(target);
	if (objTarget != null) {
		objTarget.style.width = strWidth;
	}
}

/**
 * 幅設定(一覧用)
 * @param strTargetId 設定対象オブジェクトID
 * @param strWidth    設定幅(単位含：10px等)
 * @return 無し
 * @throws 実行時例外
 */
function setFieldsWidth(strTargetId, strWidth) {
	var aryTarget = getAryTargetId(strTargetId);
	for (var i = 0; i < aryTarget.length; i++) {
		if (getObject(aryTarget[i]) == null) {
			continue;
		}
		getObject(aryTarget[i]).style.width = strWidth;
		getObject(aryTarget[i]).parentNode.style.width = strWidth;
	}
}

/**
 * 高さ設定
 * @param target    設定対象(StringあるいはObject)
 * @param strHeight 設定高さ(単位含：10px等)
 * @return 無し
 * @throws 実行時例外
 */
function setHeight(target, strHeight) {
	var objTarget = getObject(target);
	if (objTarget != null) {
		objTarget.style.height = strHeight;
	}
}

/**
 * タブインデックス設定
 * @param targetId 設定対象オブジェクトID(StringあるいはArray)
 * @param numIndex    設定タブインデックス
 * @return 無し
 * @throws 実行時例外
 */
function setFieldsTabIndex(targetId) {
	aryTargetId = getAryTargetId(targetId);
	for (var i = 0; i < aryTargetId.length; i++) {
		setTabIndex(aryTargetId[i], i + 100);
	}
}

/**
 * タブインデックス設定
 * @param target   設定対象(StringあるいはObject)
 * @param numIndex 設定タブインデックス
 * @return 無し
 * @throws 実行時例外
 */
function setTabIndex(target, numIndex) {
	var objTarget = getObject(target);
	if (objTarget != null) {
		objTarget.tabIndex = numIndex;
	}
}

/**
 * Windowサイズ設定
 * @param numX 設定幅
 * @param numY 設定高さ
 * @return 無し
 * @throws 実行時例外
 */
function setWindowSize(numX, numY) {
	window.resizeTo(numX, numY);
}

/**
 * 機能割当
 * @param target      設定対象(StringあるいはObject)
 * @param strFunction 設定ファンクション(F1〜F24及びEXECUTE)
 * @return 無し
 * @throws 実行時例外
 */
function setFunction(target, strFunction) {
	var objTarget = getObject(target);
	switch (strFunction) {
		case "EXECUTE":
			objTarget.onclick = doExecute;
			break;
		case "F1":
			objTarget.onclick = doF1;
			break;
		case "F2":
			objTarget.onclick = doF2;
			break;
		case "F3":
			objTarget.onclick = doF3;
			break;
		case "F4":
			objTarget.onclick = doF4;
			break;
		case "F5":
			objTarget.onclick = doF5;
			break;
		case "F6":
			objTarget.onclick = doF6;
			break;
		case "F7":
			objTarget.onclick = doF7;
			break;
		case "F8":
			objTarget.onclick = doF8;
			break;
		case "F9":
			objTarget.onclick = doF9;
			break;
		case "F10":
			objTarget.onclick = doF10;
			break;
		case "F11":
			objTarget.onclick = doF11;
			break;
		case "F12":
			objTarget.onclick = doF12;
			break;
		case "F13":
			objTarget.onclick = doF13;
			break;
		case "F14":
			objTarget.onclick = doF14;
			break;
		case "F15":
			objTarget.onclick = doF15;
			break;
		case "F16":
			objTarget.onclick = doF16;
			break;
		case "F17":
			objTarget.onclick = doF17;
			break;
		case "F18":
			objTarget.onclick = doF18;
			break;
		case "F19":
			objTarget.onclick = doF19;
			break;
		case "F20":
			objTarget.onclick = doF20;
			break;
		case "F21":
			objTarget.onclick = doF21;
			break;
		case "F22":
			objTarget.onclick = doF22;
			break;
		case "F23":
			objTarget.onclick = doF23;
			break;
		case "F24":
			objTarget.onclick = doF24;
			break;
		default:
	}
}

/**
 * ダミー文字列変換
 * @param str 変換元文字列
 * @return 無し
 * @throws 実行時例外
 */
function getDummy(str) {
	var ret = "";
	for (var i = 0; i < str.length; i++) {
		ret += "*";
	}
	return ret;
}

/**
 * メッセージ取得
 * @param code メッセージコード
 * @param rep  変換文字列
 * @return 無し
 * @throws 実行時例外
 */
function getMessage(code, rep) {
	var strMsg = msg[code];
	var aryRep = rep.split(SEPARATOR_MESSAGE);
		for (var i = 0; i < aryRep.length; i++ ) {
			strMsg = strMsg.replace("%" + String(i + 1) + "%", aryRep[i]);
		}
		return strMsg;
	return message;
}

/**
 * メッセージ表示(alert)
 * @param aryMessage メッセージ配列
 * @return 無し
 * @throws 実行時例外
 */
function showMessage(aryMsg) {
	strMsg = "";
	for (var i = 0; i < aryMsg.length; i++) {
		strMsg += aryMsg[i];
		if (i != aryMsg.length - 1) {
			strMsg += "\n";
		}
	}
	alert(strMsg);
}

/**
 * メッセージ表示(innerHtml)
 * @param code メッセージコード
 * @param rep  変換文字列
 * @return 無し
 * @throws 実行時例外
 */
function setMessage(code, rep) {
	var objTarget = getObject("lblMessage");
	var color;
	switch (code.charAt(0)) {
		case "I":
			color = COLOR_MSG_INFO;
			break;
		case "W":
			color = COLOR_MSG_WARNING;
			break;
		case "E":
			color = COLOR_MSG_ERROR;
			break;
		default:
			color = COLOR_MSG_INFO;
	}
	if (objTarget != null) {
		setInnerHtml("lblMessage", getMessage(code, rep));
		objTarget.style.color = color;
	}
}

/**
 * メッセージクリア
 * @param 無し
 * @return 無し
 * @throws 実行時例外
 */
function clearMessage() {
	var objTarget = getObject("lblMessage");
	if (objTarget != null) {
		setInnerHtml("lblMessage", "");
		objTarget.style.color = COLOR_MSG_INFO;
	}
}

/**
 * チップヘルプ表示
 * @param e 	イベント
 * @param cmt 	コメントコード
 * @return 無し
 * @throws 実行時例外
 */
function showCmt(e,cmt) {
	var object = getSrcElement(e).id;
	getObject(object).setAttribute("title", cmt);
}

/**
 * 必須確認
 * @param target     確認対象(StringあるいはObject)
 * @param rep        変換文字列
 * @param aryMessage エラーメッセージ格納配列
 * @return 無し
 * @throws 実行時例外
 */
function checkRequired(target, rep, aryMessage) {
	if (!checkRequiredNoMsg(target)) {
		if (aryMessage.length == 0) {
			setFocus(target);
			setMessage("WC0001", rep);
		}
		setBgColor(target, COLOR_FIELD_ERROR);
		aryMessage.push(getMessage("WC0001", rep));
	}
}

/**
 * 必須確認(メッセージ無し)
 * @param target 確認対象(StringあるいはObject)
 * @return 確認結果(true：OK、false：NG)
 * @throws 実行時例外
 */
function checkRequiredNoMsg(target) {
	if (getFormValue(target) == "") {
		return false;
	} else {
		return true;
	}
}

/**
 * 文字列タイプ確認(半角英数字)
 * @param target     確認対象(StringあるいはObject)
 * @param rep        変換文字列
 * @param aryMessage エラーメッセージ格納配列
 * @return 無し
 * @throws 実行時例外
 */
function checkCode(target, rep, aryMessage) {
	if (!checkCodeNoMsg(target)) {
		if (aryMessage.length == 0) {
			setFocus(target);
			setMessage("WC0002", rep);
		}
		setBgColor(target, COLOR_FIELD_ERROR);
		aryMessage.push(getMessage("WC0002", rep));
	}
}

/**
 * 文字列タイプ確認(半角英数字)(メッセージ無し)
 * @param target 確認対象(StringあるいはObject)
 * @return 確認結果(true：OK、false：NG)
 * @throws 実行時例外
 */
function checkCodeNoMsg(target) {
	if (getFormValue(target).match(/[^A-Za-z0-9]+/)) {
		return false;
	} else {
		return true;
	}
}

/**
 * 文字列タイプ確認(半角カナ+半角英数字記号)
 * @param target     確認対象(StringあるいはObject)
 * @param rep        変換文字列
 * @param aryMessage エラーメッセージ格納配列
 * @return 無し
 * @throws 実行時例外
 */
function checkKana(target, rep, aryMessage) {
	if (!checkKanaNoMsg(target)) {
		if (aryMessage.length == 0) {
			setFocus(target);
			setMessage("WC0005", rep);
		}
		setBgColor(target, COLOR_FIELD_ERROR);
		aryMessage.push(getMessage("WC0005", rep));
	}
}

/**
 * 文字列タイプ確認(半角カナ+半角英数字記号)(メッセージ無し)
 * @param target 確認対象(StringあるいはObject)
 * @return 確認結果(true：OK、false：NG)
 * @throws 実行時例外
 */
function checkKanaNoMsg(target) {
	if (getFormValue(target).match(/[^｡-ﾟ -~]+/)) {
		return false;
	} else {
		return true;
	}
}

/**
 * 文字列タイプ確認(半角数字)
 * @param target     確認対象(StringあるいはObject)
 * @param rep        変換文字列
 * @param aryMessage エラーメッセージ格納配列
 * @return 無し
 * @throws 実行時例外
 */
function checkNumber(target, rep, aryMessage) {
	if (!checkNumberNoMsg(target)) {
		if (aryMessage.length == 0) {
			setFocus(target);
			setMessage("WC0003", rep);
		}
		setBgColor(target, COLOR_FIELD_ERROR);
		aryMessage.push(getMessage("WC0003", rep));
	}
}

/**
 * 文字列タイプ確認(半角数字)(メッセージ無し)
 * @param target 確認対象(StringあるいはObject)
 * @return 確認結果(true：OK、false：NG)
 * @throws 実行時例外
 */
function checkNumberNoMsg(target) {
	if (getFormValue(target).match(/[^0-9]+/)) {
		return false;
	} else {
		return true;
	}
}

/**
 * 文字列タイプ確認(数値)
 * @param target     確認対象(StringあるいはObject)
 * @param rep        変換文字列
 * @param aryMessage エラーメッセージ格納配列
 * @return 無し
 * @throws 実行時例外
 */
function checkNumeric(target, rep, aryMessage) {
	if (!checkNumericNoMsg(target)) {
		if (aryMessage.length == 0) {
			setFocus(target);
			setMessage("WC0003", rep);
		}
		setBgColor(target, COLOR_FIELD_ERROR);
		aryMessage.push(getMessage("WC0003", rep));
	}
}

/**
 * 文字列タイプ確認(数値)(メッセージ無し)
 * @param target 確認対象(StringあるいはObject)
 * @return 確認結果(true：OK、false：NG)
 * @throws 実行時例外
 */
function checkNumericNoMsg(target) {
	if(isNaN(getFormValue(target))){
		return false;
	} else {
		return true;
	}
}

/**
 * 文字列タイプ確認(半角数字+"-")
 * @param target     確認対象(StringあるいはObject)
 * @param rep        変換文字列
 * @param aryMessage エラーメッセージ格納配列
 * @return 無し
 * @throws 実行時例外
 */
function checkPhone(target, rep, aryMessage) {
	if (getFormValue(target).match(/[^0-9-]+/)) {
		if (aryMessage.length == 0) {
			setFocus(target);
			setMessage("WC0005", rep);
		}
		setBgColor(target, COLOR_FIELD_ERROR);
		aryMessage.push(getMessage("WC0005", rep));
	}
}

/**
 * 文字列タイプ確認(少数)
 * @param target     確認対象(StringあるいはObject)
 * @param rep        変換文字列
 * @param aryMessage エラーメッセージ格納配列
 * @return 無し
 * @throws 実行時例外
 */
function checkDecimal(target, integer, decimal, rep, aryMessage) {
	var regex = "^(([1-9]\\d{0," + (integer - 1) + "})|0)(\\.\\d{1," + decimal + "})?$";
	if (getFormValue(target) != "" && !getFormValue(target).match(regex)) {
		rep = rep + SEPARATOR_MESSAGE + integer + SEPARATOR_MESSAGE + decimal
		if (aryMessage.length == 0) {
			setFocus(target);
			setMessage("WC0011", rep);
		}
		setBgColor(target, COLOR_FIELD_ERROR);
		aryMessage.push(getMessage("WC0011", rep));
	}
}

/**
 * 文字列タイプ確認(符号付整数)
 * @param target     確認対象(StringあるいはObject)
 * @param rep        変換文字列
 * @param aryMessage エラーメッセージ格納配列
 * @return 無し
 * @throws 実行時例外
 */
function checkInteger(target, rep, aryMessage) {
	var regex = "^[-]?[0-9]+$";
	if (getFormValue(target) != "" && !getFormValue(target).match(regex)) {
		if (aryMessage.length == 0) {
			setFocus(target);
			setMessage("WC0003", rep);
		}
		setBgColor(target, COLOR_FIELD_ERROR);
		aryMessage.push(getMessage("WC0003", rep));
	}
}

/**
 * 文字列タイプ確認(任意)
 * @param regex      正規表現文字列
 * @param target     確認対象(StringあるいはObject)
 * @param rep        変換文字列
 * @param aryMessage エラーメッセージ格納配列
 * @return 無し
 * @throws 実行時例外
 */
function checkRegex(regex, target, rep, aryMessage) {
	if (!getFormValue(target).match(regex)) {
		if (aryMessage.length == 0) {
			setFocus(target);
			setMessage("WC0005", rep);
		}
		setBgColor(target, COLOR_FIELD_ERROR);
		aryMessage.push(getMessage("WC0005", rep));
	}
}

/**
 * 文字桁数確認
 * @param target     確認対象(StringあるいはObject)
 * @param numLength  確認対象オブジェクト桁数
 * @param rep        変換文字列
 * @param aryMessage エラーメッセージ格納配列
 * @return 無し
 * @throws 実行時例外
 */
function checkLength(target, numLength, rep, aryMessage) {
	var numTargetLength = getFormValue(target).length 
	if (numLength < numTargetLength) {
		if (aryMessage.length == 0) {
			setFocus(target);
			setMessage("WC0004", rep + ","  + numLength);
		}
		setBgColor(target, COLOR_FIELD_ERROR);
		aryMessage.push(getMessage("WC0004", rep + SEPARATOR_MESSAGE + numLength));
	}
}

/**
 * 文字桁数確認(最低桁数)
 * @param target     確認対象(StringあるいはObject)
 * @param numLength  確認対象オブジェクト桁数
 * @param rep        変換文字列
 * @param aryMessage エラーメッセージ格納配列
 * @return 無し
 * @throws 実行時例外
 */
function checkMinLength(target, numLength, rep, aryMessage) {
	var numTargetLength = getFormValue(target).length 
	if (numLength > numTargetLength) {
		if (aryMessage.length == 0) {
			setFocus(target);
			setMessage("WC0010", rep + ","  + numLength);
		}
		setBgColor(target, COLOR_FIELD_ERROR);
		aryMessage.push(getMessage("WC0010", rep + SEPARATOR_MESSAGE + numLength));
	}
}


/**
 * 文字桁数確認(規定桁数)
 * @param target     確認対象(StringあるいはObject)
 * @param numLength  確認対象オブジェクト桁数
 * @param rep        変換文字列
 * @param aryMessage エラーメッセージ格納配列
 * @return 無し
 * @throws 実行時例外
 */
function checkRegLength(target, numLength, rep, aryMessage) {
	var numTargetLength = getFormValue(target).length 
	if (numLength != numTargetLength) {
		if (aryMessage.length == 0) {
			setFocus(target);
			setMessage("WC2011", rep + ","  + numLength);
		}
		setBgColor(target, COLOR_FIELD_ERROR);
		aryMessage.push(getMessage("WC2011", rep + SEPARATOR_MESSAGE + numLength));
	}
}


/**
 * 値確認
 * @param target1        確認対象1(StringあるいはObject)
 * @param target2        確認対象2(StringあるいはObject)
 * @param numConfirmFlag 確認フラグ(0:値同一でtrue、1：値同一でfalse)
 * @param rep            変換文字列
 * @param aryMessage     エラーメッセージ格納配列
 * @return 無し
 * @throws 実行時例外
 */
function checkCompare(target1, target2, numConfirmFlag, rep, aryMessage) {
	var value1 = getFormValue(target1);
	var value2 = getFormValue(target2);
	var messageCode = "";
	switch (numConfirmFlag) {
		case 0:
			if (value1 != value2) {
				messageCode = "WC0008";
			}
			break;
		case 1:
			if (value1 == value2) {
				messageCode = "WC0009";
			}
			break;
		default:
	}
	if (messageCode != "") {
		if (aryMessage.length == 0) {
			setFocus(target1);
			setMessage(messageCode, rep);
		}
		setBgColor(target1, COLOR_FIELD_ERROR);
		setBgColor(target2, COLOR_FIELD_ERROR);
		aryMessage.push(getMessage(messageCode, rep));
	}
}

/**
 * 年月日チェック
 * @param yyyy
 * @param mm
 * @param dd
 * @param msg
 * @param aryMessage
 * @return 無し
 * @throws 実行時例外
 */
function checkDate(yyyy, mm, dd, msg, aryMessage) {
	dayMonth = new Array(31,29,31,30,31,30,31,31,30,31,30,31);
	ValidFlag = true;
	yyyy2 = getFormValue(yyyy);
	mm2 = getFormValue(mm);
	dd2 = getFormValue(dd);
	if ((mm2 < 1) || (mm2 > 12)){
		setBgColor(yyyy, COLOR_FIELD_ERROR);
		aryMessage.push(msg + "の月は1--12を入力してください。");
		ValidFlag = false;
	}
	if ((dd2 < 1) || (dd2 > dayMonth[mm2 - 1])){
		setBgColor(dd, COLOR_FIELD_ERROR);
		aryMessage.push(getMessage("WC0006", msg));
		ValidFlag = false;
	}
	if (!chkUrudosi(yyyy2) && (mm2 == 2) && (dd2 == 29)){
		setBgColor(dd, COLOR_FIELD_ERROR);
		aryMessage.push(getMessage("WC0006", msg));
		ValidFlag = false;
	}
	return ValidFlag;
}

/**
 * うるう年チェック
 * @param yyyy
 * @return 
 * @throws 実行時例外
 */
function chkUrudosi(y) {
	if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) {
		return true;
	}
	return false;
}

/**
 * 時間、分の合計値チェック
 * @param hour       入力時間
 * @param min        入力分
 * @param target 	 指定時間(例 24)
 * @param rep        変換文字列
 * @param aryMessage エラーメッセージ格納配列
 * @return 無し
 * @throws 実行時例外
 */
function checkTimeValue(hour, min, target, rep, aryMessage) {
	var count = 0;
	var Hour = getFormValue(hour);
	var Min = getFormValue(min);
	if (!checkNumberNoMsg(hour)) {
		count++;
	}
	if (!checkNumberNoMsg(min)) {
		count++;
	}
	if (count == 0) {
		if (Hour > target) {
			setBgColor(hour, COLOR_FIELD_ERROR);
			count++;
		}
		if (Min > 59) {
			setBgColor(min, COLOR_FIELD_ERROR);
			count++;
		}
		var total = (Hour * 60) + eval(Min);
		if (total > target * 60) {
			setBgColor(hour, COLOR_FIELD_ERROR);
			setBgColor(min, COLOR_FIELD_ERROR);
			count++;
		}
	}
	if(count != 0){
		aryMessage.push(getMessage("WC0007", rep));
	}
}

/**
 * 例外処理
 * @param e 例外オブジェクト
 * @return 無し
 * @throws 無し
 */
function handleException(e) {
	alert("クライアントエラーが発生しました。");
	/*
	if (e.description != null) {
		alert(e.description);
	}
	throw e;
	*/
}

/**
 * フォーム入力値取得
 * @param target 取得対象(StringあるいはObject)
 * @return 入力値
 * @throws 実行時例外
 */
function getFormValue(target) {
	var objTarget = getObject(target);
	if (objTarget != null) {
		if (objTarget.type == "checkbox") {
			if (objTarget.checked) {
				return "1";
			} else {
				return "";
			}
		} else {
			return objTarget.value;
		}
	} else {
		return "";
	}
}

/**
 * フォーム入力値設定
 * @param target   取得対象(StringあるいはObject)
 * @param strValue 設定値
 * @return 無し
 * @throws 実行時例外
 */
function setFormValue(target, strValue) {
	var objTarget = getObject(target);
	if (objTarget == null || objTarget.type == null) {
		return;
	}
	switch (objTarget.type) {
		case "checkbox":
			if (strValue == "1") {
				objTarget.checked = true;
			} else {
				objTarget.checked = false;
			}
			break;
		case "select-one":
			if (objTarget.length > 0) {
				objTarget.value = objTarget.options[0].value;
			}
			objTarget.value = strValue;
			break;
		default:
			objTarget.value = strValue;
	}
}

/**
 * 内容取得
 * @param target 取得対象(StringあるいはObject)
 * @return 内容
 * @throws 実行時例外
 */
function getInnerHtml(target) {
	var objTarget = getObject(target);
	if (objTarget != null) {
		return objTarget.innerHTML;
	} else {
		return "";
	}
}

/**
 * テーブル内容(tbody)行数取得
 * @param strTargetId 取得対象テーブルオブジェクトID
 * @return 内容行数
 * @throws 実行時例外
 */
function getTableRows(strTargetId) {
	var targetTable = getObject(strTargetId);
	if (targetTable == null) {
		return 0;
	}
	var allRows = targetTable.rows.length;
	var headerRows = 0;
	var footerRows = 0;
	if (targetTable.tHead != null) {
 	   headerRows = targetTable.tHead.rows.length;
	}
	if (targetTable.tFoot != null) {
    	footerRows = targetTable.tFoot.rows.length;
	}
	return allRows - headerRows - footerRows;
}

/**
 * 選択インデックス取得
 * @param strTargetPrefix 取得対象オブジェクトプレフィックス
 * @param numTargetLength 取得対象オブジェクト長
 * @return 選択インデックスの配列
 * @throws 実行時例外
 */
function getSelectedIndex(strTargetPrefix, numTargetLength) {
	var arySelected = new Array(0);
	var objTarget;
	for (var i = 0; i < numTargetLength; i++) {
		objTarget = getObject(strTargetPrefix + String(i));
		if (objTarget != null && objTarget.checked) {
			arySelected.push(i);
		}
	}
	return arySelected;
}

/**
 * プルダウン選択タイトル取得
 * @param target 取得対象(StringあるいはObject)
 * @return 選択タイトル
 * @throws 実行時例外
 */
function getSelectedTitle(target) {
	var objTarget = getObject(target);
	if (objTarget != null && objTarget.length > 0) {
		return objTarget.options[objTarget.selectedIndex].text;
	} else {
		return "";
	}
}

/**
 * 値コピー
 * @param from コピー元(StringあるいはObject)
 * @param to   コピー先(StringあるいはObject)
 * @return 無し
 * @throws 実行時例外
 */
function copyValue(from, to) {
	setFormValue(to, getFormValue(from));
}

/**
 * セレクトボックスオプション移動
 * @param targetFrom 移動元セレクトボックス
 * @param targetTo   移動先セレクトボックス
 * @return 無し
 * @throws 実行時例外
 */
function moveOption(targetFrom, targetTo) {
	var objFrom = getObject(targetFrom);
	var objTo   = getObject(targetTo);
	for (var i = 0; i < objFrom.length; i++) {
		if (objFrom.options[i].selected) {
			objTo.options[objTo.length] = new Option(objFrom.options[i].text, objFrom.options[i].value);
		}
	}
	for (var i = objFrom.length - 1; i >= 0; i--) {
		if (objFrom.options[i].selected) {
			objFrom.options[i] = null;
		}
	}
}

/**
 * セレクトボックス全選択
 * @param target 処理対象
 * @return 無し
 * @throws 実行時例外
 */
function selectOptionAll(target) {
	objTarget = getObject(target);
	if (objTarget != null && objTarget.options != null && objTarget.options.length > 0) {
		for (var i = 0; i < objTarget.options.length; i++) {
			objTarget.options[i].selected = true;
		}
	}
}

/**
 * セレクトボックスオプション移動
 * @param strFromId 移動元セレクトボックスID
 * @param strToId   移動先セレクトボックスID
 * @return 無し
 * @throws 実行時例外
 */
function moveOptionAll(strFromId, strToId) {
	selectOptionAll(strFromId);
	moveOption(strFromId, strToId);
}

/**
 * プルダウンリストオプション設定
 * @param target    設定対象(StringあるいはObject)
 * @param aryOption 設定オプション
 * @return 無し
 * @throws 実行時例外
 */
function setOption(target, aryOption) {
	var objTarget = getObject(target);
	for (var i = objTarget.length - 1; i >= 0; i--) {
		objTarget.options[i] = null;
	}
	if (aryOption == null) {
		return;
	}
	for (var i = 0; i < aryOption.length; i++) {
		objTarget.options[i] = new Option(aryOption[i][1], aryOption[i][0]);
	}
}

/**
 * 明細行数取得
 * @param strTargetId 取得対象オブジェクトID
 * @return 無し
 * @throws 実行時例外
 */
function getRowCount(strTargetId) {
	// 対象オブジェクト取得
	var objNode = document.getElementById(strTargetId);
	// 対象オブジェクト内のTRノード取得
	var objNodeList = objNode.getElementsByTagName("TR");
	// 行数取得
	return objNodeList.length;
}

/**
 * 行追加
 * @param strTargetId 追加対象オブジェクトID
 * @param index       追加位置(nullで最終行)
 * @return 無し
 * @throws 実行時例外
 */
function addRow(strTargetId, index) {
	// 対象オブジェクト取得
	var objNode = document.getElementById(strTargetId);
	// 対象オブジェクト内TRノード取得
	var objNodeList = objNode.getElementsByTagName("TR");
	// 行数取得
	var length = objNodeList.length;
	// TRノードの親ノード取得
	var parentNode = objNodeList.item(0).parentNode;
	// 最終行のクローン作成及び追加
	var cloneNode;
	if (index == null) {
		cloneNode = objNodeList.item(length - 1).cloneNode(true);
		parentNode.insertBefore(cloneNode, null);
	} else {
		cloneNode = objNodeList.item(index).cloneNode(true);
		parentNode.insertBefore(cloneNode, objNodeList.item(index));
	}
}

/**
 * 行削除
 * @param strTargetId 追加対象オブジェクトID
 * @param index       追加位置(nullで最終行)
 * @return 無し
 * @throws 実行時例外
 */
function deleteRow(strTargetId, index) {
	// 対象オブジェクト取得
	var objNode = document.getElementById(strTargetId);
	// 対象オブジェクト内TRノード取得
	var objNodeList = objNode.getElementsByTagName("TR");
	// 削除
	objNode.removeChild(objNodeList.item(index));
}

/**
 * proqSeq取得
 * @param 無し
 * @return procSeq
 * @throws 実行時例外
 */
function getProcSeq() {
	return getFormValue("procSeq");
}

/**
 * proqSeq設定(値指定)
 * @param procSeq
 * @return 無し
 * @throws 実行時例外
 */
function setProcSeqValue(procSeq) {
	setFormValue("procSeq", procSeq);
	if (window.opener != null && !window.opener.closed) {
		window.opener.setProcSeqValue(procSeq);
	}
}

/**
 * 全角スペース→半角スペース変換
 * @param target 変換対象(StringあるいはObject)
 * @return 無し
 * @throws 実行時例外
 */
function convSbSpace(target) {
	var str = getFormValue(target);
	str = str.replace(/　/g, String.fromCharCode(0x20));
	setFormValue(target, str);
}

/**
 * 全角→半角カナ変換
 * @param target 変換対象(StringあるいはObject)
 * @return 無し
 * @throws 実行時例外
 */
function convSbKana(target) {
	var str = getFormValue(target);
	var sbKana = "";
	for (var i = 0; i < str.length; i++) {
		sbKana += convCharSbKana(str.charAt(i));
	}
	setFormValue(target, sbKana);
}

/**
 * 全角→半角カナ変換
 * @param char 変換対象
 * @return 変換後文字列
 * @throws 実行時例外
 */
function convCharSbKana(char) {
	var aryMbKana1 = new Array(
		"。","「","」","、","・","ヲ","ァ","ィ","ゥ","ェ","ォ","ャ","ュ","ョ","ッ","ー",
		"ア","イ","ウ","エ","オ","カ","キ","ク","ケ","コ","サ","シ","ス","セ","ソ",
		"タ","チ","ツ","テ","ト","ナ","ニ","ヌ","ネ","ノ","ハ","ヒ","フ","ヘ","ホ",
		"マ","ミ","ム","メ","モ","ヤ","ユ","ヨ","ラ","リ","ル","レ","ロ","ワ","ン",
		"゛","゜"
	);
	var aryMbKana2 = new Array(
		"ガ","ギ","グ","ゲ","ゴ","ザ","ジ","ズ","ゼ","ゾ","ダ","ヂ","ヅ","デ","ド"
	);
	var aryMbKana3 = new Array(
		"バ","ビ","ブ","ベ","ボ"
	);
	var aryMbKana4 = new Array(
		"パ","ピ","プ","ペ","ポ"
	);
	var strMbKana1 = "ヴ";
	var aryMbHira1 = new Array(
		"。","「","」","、","・","を","ぁ","ぃ","ぅ","ぇ","ぉ","ゃ","ゅ","ょ","っ","ー",
		"あ","い","う","え","お","か","き","く","け","こ","さ","し","す","せ","そ",
		"た","ち","つ","て","と","な","に","ぬ","ね","の","は","ひ","ふ","へ","ほ",
		"ま","み","む","め","も","や","ゆ","よ","ら","り","る","れ","ろ","わ","ん",
		"゛","゜"
	);
	var aryMbHira2 = new Array(
		"が","ぎ","ぐ","げ","ご","ざ","じ","ず","ぜ","ぞ","だ","ぢ","づ","で","ど"
	);
	var aryMbHira3 = new Array(
		"ば","び","ぶ","べ","ぼ"
	);
	var aryMbHira4 = new Array(
		"ぱ","ぴ","ぷ","ぺ","ぽ"
	);
	for (var i in aryMbKana1) {
		if (char == aryMbKana1[i]) {
			return String.fromCharCode(i - (-0xFF61));
		}
	}
	for (var i in aryMbKana2) {
		if (char == aryMbKana2[i]) {
			return String.fromCharCode(i - (-0xFF76), 0xFF9E);
		}
	}
	for (var i in aryMbKana3) {
		if (char == aryMbKana3[i]) {
			return String.fromCharCode(i - (-0xFF8A), 0xFF9E);
		}
	}
	for (var i in aryMbKana4) {
		if (char == aryMbKana4[i]) {
			return String.fromCharCode(i - (-0xFF8A), 0xFF9F);
		}
	}
	if (char == strMbKana1) {
		return String.fromCharCode(0xFF73, 0xFF9E);
	}
	for (var i in aryMbHira1) {
		if (char == aryMbHira1[i]) {
			return String.fromCharCode(i - (-0xFF61));
		}
	}
	for (var i in aryMbHira2) {
		if (char == aryMbHira2[i]) {
			return String.fromCharCode(i - (-0xFF76), 0xFF9E);
		}
	}
	for (var i in aryMbHira3) {
		if (char == aryMbHira3[i]) {
			return String.fromCharCode(i - (-0xFF8A), 0xFF9E);
		}
	}
	for (var i in aryMbHira4) {
		if (char == aryMbHira4[i]) {
			return String.fromCharCode(i - (-0xFF8A), 0xFF9F);
		}
	}
	return char;
}

// 暗号化 **********************************************************************
var encryptT = new Array(0x00000000, 0xd76aa478, 0xe8c7b756, 0x242070db,
		0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613,
		0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1,
		0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e,
		0x49b40821, 0xf61e2562, 0xc040b340, 0x265e5a51,
		0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681,
		0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87,
		0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9,
		0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122,
		0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60,
		0xbebfbc70, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085,
		0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8,
		0xc4ac5665, 0xf4292244, 0x432aff97, 0xab9423a7,
		0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d,
		0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314,
		0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb,
		0xeb86d391
);
var encryptround1 = new Array(new Array( 0, 7, 1), new Array( 1,12, 2),
		new Array( 2,17, 3), new Array( 3,22, 4),
		new Array( 4, 7, 5), new Array( 5,12, 6),
		new Array( 6,17, 7), new Array( 7,22, 8),
		new Array( 8, 7, 9), new Array( 9,12,10),
		new Array(10,17,11), new Array(11,22,12),
		new Array(12, 7,13), new Array(13,12,14),
		new Array(14,17,15), new Array(15,22,16)
);
var encryptround2 = new Array(new Array( 1, 5,17), new Array( 6, 9,18),
		new Array(11,14,19), new Array( 0,20,20),
		new Array( 5, 5,21), new Array(10, 9,22),
		new Array(15,14,23), new Array( 4,20,24),
		new Array( 9, 5,25), new Array(14, 9,26),
		new Array( 3,14,27), new Array( 8,20,28),
		new Array(13, 5,29), new Array( 2, 9,30),
		new Array( 7,14,31), new Array(12,20,32)
);
var encryptround3 = new Array(new Array( 5, 4,33), new Array( 8,11,34),
		new Array(11,16,35), new Array(14,23,36),
		new Array( 1, 4,37), new Array( 4,11,38),
		new Array( 7,16,39), new Array(10,23,40),
		new Array(13, 4,41), new Array( 0,11,42),
		new Array( 3,16,43), new Array( 6,23,44),
		new Array( 9, 4,45), new Array(12,11,46),
		new Array(15,16,47), new Array( 2,23,48)
);
var encryptround4 = new Array(new Array( 0, 6,49), new Array( 7,10,50),
		new Array(14,15,51), new Array( 5,21,52),
		new Array(12, 6,53), new Array( 3,10,54),
		new Array(10,15,55), new Array( 1,21,56),
		new Array( 8, 6,57), new Array(15,10,58),
		new Array( 6,15,59), new Array(13,21,60),
		new Array( 4, 6,61), new Array(11,10,62),
		new Array( 2,15,63), new Array( 9,21,64)
);
var encryptround = new Array(new Array(encryptF, encryptround1),
		new Array(encryptG, encryptround2),
		new Array(encryptH, encryptround3),
		new Array(encryptI, encryptround4)
);
function encryptF(x, y, z) { return (x & y) | (~x & z); }
function encryptG(x, y, z) { return (x & z) | (y & ~z); }
function encryptH(x, y, z) { return x ^ y ^ z;          }
function encryptI(x, y, z) { return y ^ (x | ~z);       }
function encryptpack(n32) {
	return String.fromCharCode(n32 & 0xff) +
			String.fromCharCode((n32 >>> 8) & 0xff) +
			String.fromCharCode((n32 >>> 16) & 0xff) +
			String.fromCharCode((n32 >>> 24) & 0xff);
}
function encryptunpack(s4) {
	return  s4.charCodeAt(0) |
			(s4.charCodeAt(1) <<  8) |
			(s4.charCodeAt(2) << 16) |
			(s4.charCodeAt(3) << 24);
}
function encryptnumber(n) {
	while (n < 0) n += 4294967296;
	while (n > 4294967295) n -= 4294967296;
	return n;
}
function encryptapply_round(x, s, f, abcd, r) {
	var a, b, c, d;
	var kk, ss, ii;
	var t, u;
	a = abcd[0];
	b = abcd[1];
	c = abcd[2];
	d = abcd[3];
	kk = r[0];
	ss = r[1];
	ii = r[2];
	u = f(s[b], s[c], s[d]);
	t = s[a] + u + x[kk] + encryptT[ii];
	t = encryptnumber(t);
	t = ((t<<ss) | (t>>>(32-ss)));
	t += s[b];
	s[a] = encryptnumber(t);
}
function hash(data) {
	var abcd, x, state, s;
	var len, index, padLen, f, r;
	var i, j, k;
	var tmp;
	state = new Array(0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476);
	len = data.length;
	index = len & 0x3f;
	padLen = (index < 56) ? (56 - index) : (120 - index);
	if (padLen > 0) {
		data += "\x80";
	for (i = 0; i < padLen - 1; i++)
		data += "\x00";
	}
	data += encryptpack(len * 8);
	data += encryptpack(0);
	len  += padLen + 8;
	abcd = new Array(0, 1, 2, 3);
	x    = new Array(16);
	s    = new Array(4);
	for (k = 0; k < len; k += 64) {
		for(i = 0, j = k; i < 16; i++, j += 4) {
			x[i] = data.charCodeAt(j) |
					(data.charCodeAt(j + 1) <<  8) |
					(data.charCodeAt(j + 2) << 16) |
					(data.charCodeAt(j + 3) << 24);
		}
		for (i = 0; i < 4; i++) s[i] = state[i];
		for (i = 0; i < 4; i++) {
			f = encryptround[i][0];
			r = encryptround[i][1];
			for (j = 0; j < 16; j++) {
				encryptapply_round(x, s, f, abcd, r[j]);
				tmp = abcd[0];
				abcd[0] = abcd[3];
				abcd[3] = abcd[2];
				abcd[2] = abcd[1];
				abcd[1] = tmp;
			}
		}
	    for (i = 0; i < 4; i++) {
			state[i] += s[i];
			state[i] = encryptnumber(state[i]);
		}
	}
	return encryptpack(state[0]) +
			encryptpack(state[1]) +
			encryptpack(state[2]) +
			encryptpack(state[3]);
}
function encrypt(arg) {
	var i;
	var ret;
	var c;
	arg = hash(arg);
	ret = "";
	for(i = 0; i < 16; i++) {
		c = arg.charCodeAt(i);
		ret += "0123456789abcdef".charAt((c >> 4) & 0xf);
		ret += "0123456789abcdef".charAt(c & 0xf);
	}
	return ret;
}
// *****************************************************************************
