var _gTRUE = true;
var _gFALSE = false;
var _gWindowId = 'windowId';        // WindowIDの項目ID
var _gChildWinList = new Array();	// 自分で生成したウィンドウを管理ための配列
var _gLAYER_PREFIX = 'L_';
var _gLayer = null;
var _gDIV_LAYER = 'div_layer';
var _gDIV_MODALBACK = 'div_modalback';

/*-----------------------------------------------
 関数名：コード入力フィールド・コード選択リスト連携機能
 引数  ：item：コード入力フィールド
         id  ：コード選択リストのID
 戻り値：true ：入力されたコードに対応する値がリストに存在する場合
         false：入力されたコードに対応する値がリストに存在しない場合
 ---------------------------------------------*/
function selectField(item, id){
	var list = document.getElementById(id);
	if(list){
		var inputCode = item.value;
		for(var ix=0; ix < list.options.length; ix++){
			if(inputCode == list.options[ix].value){
				list.selectedIndex = ix;
				return true;
			}
		}
	}
	return false;
}

/*-----------------------------------------------
 関数名：コード入力フィールド・コード選択リスト連携機能
 引数  ：item：コード選択リスト
         id  ：コード入力フィールドのID
 戻り値：なし
 ---------------------------------------------*/
function selectCode(item, id){
	var codeField = document.getElementById(id);
	if(codeField){
		codeField.value = item.options[item.selectedIndex].value;
	}
}

/*-----------------------------------------------
 関数名：かな・漢字制御機能
 引数  ：sts ：IME切り替えステータス（true：IME有効/false：IME無効）
         item：IME切り替え対象オブジェクト
 戻り値： なし
 ---------------------------------------------*/
function setIme(sts, item){
	if(item){
		if(sts == _gTRUE){
			item.style.imeMode = 'active';
		}else if(sts == _gFALSE){
			item.style.imeMode = 'disabled';
		}
	}
}

/*-----------------------------------------------
 関数名：カンマ付数字制御機能
 引数  ：item：金額入力フィールドオブジェクト
         sts ：カンマ制御ステータス（true：カンマ付与/false：カンマ除去）
 戻り値：true ：カンマ編集が正常に行われた場合
         false：カンマ編集が失敗した場合
 ---------------------------------------------*/
function commaFormat(item, sts){
	if(item.value){
		if(sts == _gTRUE){
			//小数点が２つ以上の場合はカンマ付与しない。
			if(item.value.indexOf('.') != item.value.lastIndexOf('.')) return false;

			//先頭の１文字が + - , . 半角数字 以外の場合はカンマ付与しない。
			var firstChar = item.value.substring(0,1);
			if(!firstChar.match(/[\+\-\,\.]|[0-9]/)) return false;

			//先頭の１文字を除いた文字列に , . 半角数字 以外が含まれている場合はカンマ付与しない。
			var subStr = item.value.substring(1,item.value.length);
			subStr = subStr.split(',').join('');
			subStr = subStr.split('.').join('');
			if(subStr.match(/[^0-9]+/)) return false;

			//カンマ付与処理
			var i;
			item.value = item.value.split(',').join('');
			for(i = 0; i < item.value.length/3; i++){
				item.value = item.value.replace(/^([+-]?\d+)(\d\d\d)/,"$1,$2");
			}
		}else if(sts == _gFALSE){
			item.value = item.value.split(',').join('');
		}else{
			return false;
		}
			return true;
	}
}

/*-----------------------------------------------
 関数名：カレンダー機能
 引数  ：id：フィールドセットID
         disp_x：カレンダー表示位置(ウィンドウ左端からの位置)
         disp_y：カレンダー表示位置(ウィンドウ上端からの位置)
         (座標指定しない場合は引数idのフィールドセットの右下に表示)
 戻り値：なし
 ---------------------------------------------*/
var _gYear;
var _gMonth; // 0から11
var _gDateFieldId;
var _gCalendarWinId = _gLAYER_PREFIX + 'calendar'; //カレンダーウィンドウのID
function showCalendar(id, disp_x, disp_y){
	//既にカレンダーが表示されているかどうか判定します。
	var defCalendar = document.getElementById(_gCalendarWinId);
	if(defCalendar){
		return;
	}
	var date = new Date();
	_gYear = date.getFullYear();
	_gMonth = date.getMonth();
	_gDateFieldId = id;

	//カレンダーのヘッダ部分を作成します。
	var headerSrc = '<table class="tbl_headerTbl"><tr>'
					+'<td class="changeMonth" onclick="JavaScript:changeCalendar(\'back\')"><<</td>'
					+'<td id="headerYM">' + (_gYear+'年'+(_gMonth+1)+'月') + '</td>'
					+'<td class="changeMonth" onclick="JavaScript:changeCalendar(\'fwd\')">>></td>'
					+'</tr></table>';
	//曜日表示領域を作成します。
	var daySrc = 	'<table class="tbl_dayTbl" id=""><tr>'
					+'<td class="sun">日</td>'
					+'<td>月</td><td>火</td><td>水</td><td>木</td><td>金</td>'
					+'<td class="sat">土</td>'
					+'</tr></table>';
	//カレンダー領域を作成します。
	var calendarSrc = '<table class="tbl_calTbl" '
					+' onmouseover="JavaScript:return moverDate(event.srcElement.id)"'
					+' onmouseout="JavaScript:return moutDate(event.srcElement.id)"'
					+' onclick="JavaScript:return mclickDate(event.srcElement.id)">'
					+'<tr><td id="date_1" class="sun"></td><td id="date_2"></td><td id="date_3"></td><td id="date_4"></td><td id="date_5"></td><td id="date_6"></td><td id="date_7" class="sat"></td></tr>'
					+'<tr><td id="date_8" class="sun"></td><td id="date_9"></td><td id="date_10"></td><td id="date_11"></td><td id="date_12"></td><td id="date_13"></td><td id="date_14" class="sat"></td></tr>'
					+'<tr><td id="date_15" class="sun"></td><td id="date_16"></td><td id="date_17"></td><td id="date_18"></td><td id="date_19"></td><td id="date_20"></td><td id="date_21" class="sat"></td></tr>'
					+'<tr><td id="date_22" class="sun"></td><td id="date_23"></td><td id="date_24"></td><td id="date_25"></td><td id="date_26"></td><td id="date_27"></td><td id="date_28" class="sat"></td></tr>'
					+'<tr><td id="date_29" class="sun"></td><td id="date_30"></td><td id="date_31"></td><td id="date_32"></td><td id="date_33"></td><td id="date_34"></td><td id="date_35" class="sat"></td></tr>'
					+'<tr><td id="date_36" class="sun"></td><td id="date_37"></td><td id="date_38"></td><td id="date_39"></td><td id="date_40"></td><td id="date_41"></td><td id="date_42" class="sat"></td></tr>'
					+'</table>';
	var calendar = '<table class="tbl_calBaseTbl">'
					+('<tr><td>'+ headerSrc +'</td></tr>')
					+('<tr><td>'+ daySrc +'</td></tr>')
					+('<tr><td><div id="calendar">'+ calendarSrc +'</div></td></tr>')
					+'</table>';
	var calendarDiv = document.createElement('DIV');
	calendarDiv.id = 'calendar';
	calendarDiv.innerHTML = calendar;
	calendarDiv.style.display = 'none';
	calendarDiv.dynamic = true;
	//カレンダー用のHTMLをDOMに変換します。
	document.body.appendChild(calendarDiv);
	//日付を出力します。
	createCalendar(_gYear,_gMonth,id);
	//カレンダーの表示位置
	var x, y;
	if (disp_x == '' || disp_x == null || isNaN(disp_x) || 
		disp_y == '' || disp_y == null || isNaN(disp_y)){
		var field = document.getElementById(id);
		var pos = getPosition(field);
		x = pos.x + field.offsetWidth;
		y = pos.y + field.offsetHeight;
	} else {
		x = disp_x;
		y = disp_y;
	}
	//生成したカレンダーをレイヤーウィンドウで表示します。
	layerWindow(calendarDiv.id, 165, 130, x, y, 'カレンダー');
}

function getPosition(elem) {
	var pos = new function(){ this.x = 0; this.y = 0; }
	while( elem ){
		pos.x += elem.offsetLeft; 
		pos.y += elem.offsetTop; 
		elem = elem.offsetParent;
	}
	return pos;
}

function moverDate(id){
	with(document.getElementById(id)){
		if( innerHTML == '' ) return;
		style.backgroundColor ='#ffff66';
	}
}

function moutDate(id){
	with(document.getElementById(id)){
		if( innerHTML == '' ) return;
		style.backgroundColor='';
	}
}

function mclickDate(id){
	with(document.getElementById(id)){
		setDate(innerHTML,_gDateFieldId);
		closeLayer(_gCalendarWinId);
	}
}

function createCalendar(year,month){
	//指定された年の月開始日の曜日を求めます。(日曜:0～土曜:6)
	var firstDay = new Date(year,month,1).getDay();
	//指定された年月の最終日を求めます。
	var lastDay = new Date(year,(month+1),0).getDate();
	var dateCnt = 1;
	var idCnt = 1;
	var endFlg = false;
	for(var week=1; week <= 6; week++){
		for(var day=0; day< 7; day++){
			var dateTd = document.getElementById('date_'+ idCnt);
			idCnt++;
			if((week == 1 && (day < firstDay)) || endFlg){
				//第1週であれば、指定年月の開始日以前はスキップします。
				dateTd.innerHTML = '';
				continue;
			}
			dateTd.innerHTML = dateCnt;
			dateCnt++;
			//月の最終日に到達した場合、以降の日付をスキップするため、フラグを立てます。
			if(dateCnt > lastDay) endFlg = true;
		}
	}
	//ヘッダ部分の年月表示を変更します。
	var headerTd = document.getElementById('headerYM');
	headerTd.innerHTML = (year + '年' + (month+1) + '月');
}
//カレンダーの表示月を変更します。
function changeCalendar(prop){
	if(prop == 'back'){
		if(_gMonth == 0){
			_gYear = _gYear -1;
			_gMonth = 11;
		}else{
			_gMonth += -1;
		}
	}else if(prop == 'fwd'){
		if(_gMonth == 11){
			_gYear = _gYear +1;
			_gMonth = 0;
		}else{
			_gMonth += 1;
		}
	}
	createCalendar(_gYear,_gMonth);
}
//選択された日付を日付フィールドに設定します。
function setDate(date,id){
	var target = document.getElementById(id);
    
	if(target){
		var dateYM = document.getElementById('headerYM').innerHTML.match(/\d+/g).join('/');
		var japaneseDate = parseJapaneseDate(dateYM + '/' + date);

		var dateFieldSet = target.childNodes;
		for(var ix=0; ix < dateFieldSet.length; ix++){
		    var targetClass = dateFieldSet.item(ix).name;
			if (targetClass == 'eraCode'){
				dateFieldSet[ix].value = japaneseDate[0];
			} else if (targetClass == 'eraList'){
				dateFieldSet[ix].value = japaneseDate[0];
			} else if (targetClass == 'year'){
				dateFieldSet[ix].value = japaneseDate[1];
			} else if (targetClass == 'month'){
				dateFieldSet[ix].value = japaneseDate[2];
			} else if (targetClass == 'day'){
				dateFieldSet[ix].value = japaneseDate[3];
			}
		}
	}
}
//指定された西暦文字列を、和暦日付に変換します。
function parseJapaneseDate(date){

	//改元日を保持します。
	var meijiStart = new Date(1868,8,8);
	var taishoStart = new Date(1912,6,30);
	var showaStart = new Date(1926,11,25);
	var heiseiStart = new Date(1989,0,8);

	var dateList = date.split('/');
	var inputDate = new Date(dateList[0],dateList[1]-1,dateList[2]);

	var eraCode;
	var year;
	if(inputDate.getTime() < meijiStart.getTime()){
		return;
	}else if(inputDate.getTime() < taishoStart.getTime()){
		eraCode = 1;
		year = (inputDate.getFullYear() - meijiStart.getFullYear() + 1);
	}else if(inputDate.getTime() < showaStart.getTime()){
		eraCode = 3;
		year = (inputDate.getFullYear() - taishoStart.getFullYear() + 1);
	}else if(inputDate.getTime() < heiseiStart.getTime()){
		eraCode = 5;
		year = (inputDate.getFullYear() - showaStart.getFullYear() + 1);
	}else{
		eraCode = 7;
		year = (inputDate.getFullYear() - heiseiStart.getFullYear() + 1);
	}
	var japaneseDate = new Array(eraCode,year,inputDate.getMonth()+1,inputDate.getDate());
	return japaneseDate;
}

/*-----------------------------------------------
 関数名：チェックボックス一括選択機能
 引数　：fm    ：対象フィールドが属するフォーム
         prefix：フィールドのID名の接頭辞
 戻り値：なし
 ---------------------------------------------*/
function checkAll(fm, prefix){
	check(fm,prefix,true);
}
//チェックボックスの状態を制御します。
function check(fm,prefix,sts){
	var wk = fm.elements;
	if(wk){
		for(var ix=0; ix<wk.length; ix++){
			if(wk[ix].type == 'checkbox' && wk[ix].id.indexOf(prefix) == 0){
				if(!wk[ix].disabled)wk[ix].checked = sts;
			}
		}
	}
}

/*-----------------------------------------------
 関数名：チェックボックス一括解除機能
 引数　：fm    ：対象フィールドが属するフォーム
         prefix：フィールドのID名の接頭辞
 戻り値： なし
 ---------------------------------------------*/
function checkCancel(fm, prefix){
	check(fm,prefix,false);
}

/*-----------------------------------------------
 関数名：フォーカス自動遷移機能
 引数　：item ：入力フィールドオブジェクト
         id   ：フォーカス遷移先フィールドID名
         index：遷移先タブインデックス
 戻り値：なし
 ---------------------------------------------*/
function autoFocus(item, id, index){
	var max = item.maxLength;
	if(item.value.length >= max){
		if(id != ''){
			var wk = document.getElementById(id);
			if(!wk) return;
			if(isFocusAvailable(wk)) wk.focus();
		}else if(index){
			var form = item.form.elements;
			for(var i=0; i < form.length; i++){
				if(form[i].tabIndex == index && isFocusAvailable(form[i])){
					form[i].focus();
					return;
				}
			}
		}else{
			var form = item.form.elements;
			var firstItem = null;
			var afterItem = null;
			for(var i=0; i < form.length; i++){
				if(firstItem == null && isFocusAvailable(form[i])){
					firstItem = form[i]
				}

				if(form[i] == item){
					for( var j=i+1 ; j<form.length ; j++ ){
						if(isFocusAvailable(form[j])){
							afterItem = form[j];
							break;
						}
					}
				}
			}
			if(afterItem != null){
				afterItem.focus();
			}else if(firstItem != null){
				firstItem.focus();
			}
		}
	}
}

//指定したエレメントが、フォーカスの遷移が可能かどうか判定します。
function isFocusAvailable(item){
	return item.disabled != true
		&& item.style.display != 'none'
		&& item.type != 'hidden';
}

/*-----------------------------------------------
 関数名：キー割当機能
 引数  ：keyCode     ：キーの文字もしくはキーコード
                       (数値でない場合はキーコードに変換します)
         fn          ：コールバック関数
         isShift     ：SHIFTキー押下状態(true:押下/false:非押下)
         isCtrl      ：CTRLキー押下状態(true:押下/false:非押下)
         isAlt       ：ALTキー押下状態(true:押下/false:非押下)
 戻り値：なし
 
 (同時に認識できるキーは3つまでのため、
 SHIFT、CTRL、ALTキーを全て押下しながらFキー押下などの状態は認識できない。)
 
 ---------------------------------------------*/
var F1_KEYCODE  = '112';
var F2_KEYCODE  = '113';
var F3_KEYCODE  = '114';
var F4_KEYCODE  = '115';
var F5_KEYCODE  = '116';
var F6_KEYCODE  = '117';
var F7_KEYCODE  = '118';
var F8_KEYCODE  = '119';
var F9_KEYCODE  = '120';
var F10_KEYCODE = '121';
var F11_KEYCODE = '122';
var F12_KEYCODE = '123';

var _gKeyArray = new Array();

function keyMap(keycode, fn, isShift, isCtrl, isAlt){
	var map = new Array();
	if (isNaN(keycode)){
		if (getByteLength(keycode) != 1){
			return;
		}
		map['keycode'] = keycode.toUpperCase().charCodeAt(0);
	} else {
		if (getByteLength(keycode) == 1){
			map['keycode'] = keycode.toUpperCase().charCodeAt(0);
		} else {
			map['keycode'] = keycode;
		}
	}
	if (isShift == true){
		map['shift'] = isShift;
	} else {
		map['shift'] = false;
	}
	if (isCtrl == true){
		map['ctrl'] = isCtrl;
	} else {
		map['ctrl'] = false;
	}
	if (isAlt == true){
		map['alt'] = isAlt;
	} else {
		map['alt'] = false;
	}
	map['fn'] = fn;

	_gKeyArray.push(map);
}

function getByteLength(str) {
   len = 0;
   str = escape(str);
   for (i = 0; i < str.length; i++, len++) {
      if (str.charAt(i) == "%") {
         if (str.charAt(++i) == "u") {
            i += 3;
            len++;
         }
         i++;
      }
   }
   return len;
}

document.onkeydown = function(e){
	var keycode, shift, ctrl, alt;
    if (e != null) { 
	    // Mozilla(Firefox, NN) and Opera 
        keycode = e.which;
        shift   = typeof e.modifiers == 'undefined' ? e.shiftKey : e.modifiers & Event.SHIFT_MASK;
        ctrl    = typeof e.modifiers == 'undefined' ? e.ctrlKey : e.modifiers & Event.CONTROL_MASK;
        alt     = typeof e.modifiers == 'undefined' ? e.altKey : e.modifiers & Event.ALT_MASK;
    } else { 
	    // Internet Explorer 
        keycode = event.keyCode;
        shift   = event.shiftKey;
        ctrl    = event.ctrlKey;
        alt     = event.altKey;
    }

    for (i = 0; i < _gKeyArray.length; i++){
    	if ((_gKeyArray[i]['keycode'] == keycode) 
    		&& (_gKeyArray[i]['shift'] == shift)
    		&& (_gKeyArray[i]['ctrl'] == ctrl)
    		&& (_gKeyArray[i]['alt'] == alt)){
    		
		    if (e != null) { 
				e.preventDefault();
				e.stopPropagation();
		    } else { 
				event.returnValue = false;
				event.cancelBubble = true;
		    }
    		_gKeyArray[i]['fn'].call();
    		return;
    	}
    }
}


/*-----------------------------------------------
 関数名：一覧ソート機能
 引数  ：id   ：一覧テーブルのID
         index：ソート対象の列インデックス
 戻り値：なし
 ---------------------------------------------*/
function sortTable(id,index){
	var orderByFlg = true;
	var table = document.getElementById(id);
	if(table){
		//不正なインデックスが指定されていないかチェックをします。
		if(!table.rows[0].cells[index])return;
		//ソート後の列番号保持
		var sortKey = new Array(table.rows.length);
		for(var ix = 0; ix < table.rows.length; ix++){
			if(ix == 0) continue;
			var row = table.rows[ix];
			sortKey[ix] = row.cells[index].innerHTML + '\t' + ix;
		}
		//ソート前のデータを保持します。
		var beforeSort = sortKey.concat();
		sortKey.sort();
		//ソート結果がソート前と変化していなければ、reverseメソッドで降順ソートします。
		if(beforeSort.join('') == sortKey.join('')){
			sortKey.reverse();
			orderByFlg = false;
		}
		for(var j=0 ; j < sortKey.length ; j++){
			if(sortKey[j]){
				var sortedIndex = sortKey[j].split('\t');
				sortKey[j] = sortedIndex[1];
			}
		}
		var parents = table.firstChild.childNodes;
		var clone = table.cloneNode(true);
		var cloneParents = clone.firstChild.childNodes;
		for(var rowIndex=0 ; rowIndex < parents.length ; rowIndex++){
			if(parents[rowIndex].firstChild.nodeName == 'TH'){
				continue;
			}
			for(var cellIndex=0 ; cellIndex < parents[rowIndex].childNodes.length ; cellIndex++){
				var index = rowIndex;
				if(orderByFlg){
					index--;
				}
				var newObj = cloneParents[sortKey[index]].childNodes[0];
				var oldObj = parents[rowIndex].childNodes[cellIndex];
				parents[rowIndex].replaceChild(newObj, oldObj);
			}
		}
	}
}

/*-----------------------------------------------
 関数名：表示・非表示機能
 引数　：id ：入力フィールドのID
         sts：表示制御ステータス（true：表示/false：非表示）
 戻り値：なし
 ---------------------------------------------*/
function showField(id, sts){
	var wk = document.getElementById(id);
	if(wk){
		if(sts == _gTRUE){
			wk.style.display = '';
		}else if(sts == _gFALSE){
			wk.style.display = 'none';
		}
	}
}

/*-----------------------------------------------
 関数名：画面表示機能
 引数　：prefix     ：ウィンドウIDの接頭辞
         fm         ：フォームオブジェクト
         actionName ：アクション名
         methodName ：メソッド名
         eventId    ：イベントID
         ctxRoot    ：コンテキストルート
                      (省略した場合は_gContextPathから取得する)
         width      ：ウィンドウ幅
         height     ：ウィンドウ高さ
         menubar    ：メニューバー表示指定
         toolbar    ：ツールバー表示指定
         locationbar：ロケーションバー表示指定
         statusbar  ：ステータスバー表示指定
         resizable  ：サイズ変更
         scrollbar  ：スクロールバー表示指定

 戻り値：ウィンドウオブジェクト
 ---------------------------------------------*/
var UPD = 'UPD';
var REF = 'REF';

function openWindow(prefix,fm,actionName,methodName,eventId, ctxRoot, width, height, menubar, toolbar, locationbar, statusbar, resizable, scrollbar){
	//ウィンドウの各パラメータを設定します。
	var winStatus = '';

	if(width != '' && width != null && width != 'undefined') {
		winStatus += 'width=' + width;
	}
	if(height != '' && height != null && height != 'undefined') {
		winStatus += ',height=' + height
	}
	if(menubar != '' && menubar != null && menubar != 'undefined') {
		winStatus += ',menubar=' + menubar
	}
	if(toolbar != '' && toolbar != null && toolbar != 'undefined') {
		winStatus += ',toolbar=' + toolbar
	}
	if(locationbar != '' && locationbar != null && locationbar != 'undefined') {
		winStatus += ',location=' + locationbar
	}
	if(statusbar != '' && statusbar != null && statusbar != 'undefined') {
		winStatus += ',status=' + statusbar
	}
	if(resizable != '' && resizable != null && resizable != 'undefined') {
		winStatus += ',resizable=' + resizable
	}
	if(scrollbar != '' && scrollbar != null && scrollbar != 'undefined') {
		winStatus += ',scrollbars=' + scrollbar;
	}

	if(winStatus.charAt(0) == ','){
		winStatus = winStatus.substring(1)
	}

	if(ctxRoot == '' || ctxRoot == null || ctxRoot == 'undefined') {
		ctxRoot = _gContextPath;
	}
	if(actionName.charAt(0) != '/'){
		actionName = '/' + actionName
	}

	var windowId = prefix;
	//参照系画面の場合、複数のウィンドウ表示を可能にします。
	if( prefix == REF ){
		var date = new Date();
		windowId += '_' + date.getTime();
	}
	var win = window.open('about:blank', windowId, winStatus);
	
	//target、windowIdを保存します。
	var beforeWindowId = fm.windowId.value;
	var beforeTarget = fm.target;

	//引数で指定されたフォームに、prefix,eventIdを設定します。
	fm.target = windowId;
	fm.prefix.value = prefix;
	fm.eventId.value = eventId;
	fm.windowId.value = windowId;
	fm.isOpenWindow.value = true;
	fm.action = ctxRoot + actionName + "/" + methodName;
	fm.submit();

	//元のtarget、windowIdに戻します。
	fm.windowId.value = beforeWindowId;
	fm.target = beforeTarget;
	
	//自分で生成したウィンドウを管理するため、配列に格納します。
	_gChildWinList[windowId] = win;
	return win;
}

/*-----------------------------------------------
 関数名：活性・非活性機能
 引数　：id ：入力フィールドのID
         sts：活性制御ステータス（true：活性/false：非活性）
 戻り値：なし
 ---------------------------------------------*/
function activeField(id, sts){
	var wk = document.getElementById(id);
	if(wk){
		if(sts == _gTRUE){
			wk.disabled = false;
			wk.style.backgroundColor = '';
		}else if(sts == _gFALSE){
			wk.disabled = true;
			wk.style.backgroundColor = '#EEEEEE';
		}
	}
}

/*-----------------------------------------------
 関数名：非同期通信機能
 引数　：url       ：リクエストURL
         params      ：サーバに送信するパラメータ
         callBackFunc：コールバック関数
         eventId     ：イベントID
 戻り値：なし
 ---------------------------------------------*/
function asyncPost(url, params, callBackFunc, eventId){

	// paramsからクエリ文字列を作成します。
	var query = '';
	for (i in params) {
		query += i + '=' + params[i] + '&';
	}
	query+='eventId=' + eventId + '&';
		
	if (query.match(/\&$/)) {
		query = query.substr(0, query.length - 1);
	}

	//非同期通信中は透過レイヤーを表示します。
	var modal = document.getElementById(_gDIV_MODALBACK);
	if( modal ){
		modal.style.display = '';
	}else{
		var modal = new modalWindow();
		modal.showModalBack();
	}
	formDisabled(true);

	var request;
	var method = 'POST';
	if(window.XMLHttpRequest){
		request = new XMLHttpRequest();
	}else if(window.ActiveXObject){
		try{
			request = new ActiveXObject('Msxml2.XMLHTTP');
		}catch(e){
			request = new ActiveXObject('Microsoft.XMLHTTP');
		}
	}else{
		//サポート対象外のブラウザです。
		return;
	}
	request.onreadystatechange = function(){

		if(request.readyState==4){
			if(request.status==200){
				if(request.getResponseHeader('SystemExceptionFlg') == '1'){
					document.write(request.responseText);
				}else{
					var result = parseJSON(request.responseText);
					callBackFunc(true,result);
				}
			}else{
				callBackFunc(false,null);
			}
			//透過レイヤーを解除します。
			
			var modalBck = null;
			if(document) modalBck = document.getElementById(_gDIV_MODALBACK);
			if(modalBck) modalBck.style.display = 'none';
			// フォームの使用不可を解除します。
			if(document) formDisabled(false);
		}
	}
	request.open(method, url, true);
	request.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	request.send(query);
}

/*-----------------------------------------------
 関数名：右クリック禁止機能
 引数　：なし
 戻り値：なし
 ---------------------------------------------*/
function noRightClick(){
	document.oncontextmenu = function(){ return false; }
}
//右クリック禁止を適用します。
noRightClick();

/*-----------------------------------------------
 関数名：ログアウト機能
 引数　：fm       ：フォーム
         transPage：ログアウト画面遷移有無
                   （true：遷移有／false：遷移無  省略時はfalseとなります）
         ctxRoot  ：コンテキストルート
 戻り値：なし
 ---------------------------------------------*/


//指定されたウィンドウが、openWindowメソッドを利用して生成されたものかどうかチェックします。
function isOpenWinName(name){
	if(name.match(/REF|UPD/) == null){
		return false;
	}
	return true;
}

/*-----------------------------------------------
 関数名：画面クローズ機能
 引数　：fm           ：フォーム
         windowMode   ：ウィンドウ開閉パターン
                       （SELF：単一ウインドウ/ALL：全ウインドウ）
         sessionRemove：セッション無効化フラグ
                       （true：セッション無効/false：セッション継続）
         ctxRoot      ：コンテキストルート
 戻り値：なし
 ---------------------------------------------*/
var SELF = 'SELF';
var ALL = 'ALL';
var selfMsg='現在操作中の画面を閉じます。よろしいですか？';
var allMsg='現在操作中の画面を全て閉じます。よろしいですか？';
var windowIdList = '';

function closeWindow(fm, windowMode, sessionRemove, ctxRoot){
	
	if(ctxRoot == '' || ctxRoot == null || ctxRoot == 'undefined') {
		ctxRoot = _gContextPath;
	}
	//自画面CLOSEモード
	if(windowMode==SELF){
		if( window.confirm(selfMsg) ){
			window.closeWindowFunc(true, fm, window.name, windowMode, sessionRemove, ctxRoot, false);
		}
	//全画面CLOSEモード
	}else if(windowMode==ALL){
		if( window.confirm(allMsg) ){
			var parent = window;
			while(parent.opener){
				parent = parent.opener;
			}
			parent.closeWindowFunc(true, fm, '', windowMode, sessionRemove, ctxRoot, false);
		}
	}
}

//画面クローズ関数
//rootflg:自画面のセッション情報を削除するかどうか。ture:削除する false:削除しない
//notClose:自画面を閉じないかどうか。ture:閉じない false:閉じる
function closeWindowFunc(rootflg, fm, windowID, windowMode, sessionRemove, ctxRoot, notClose){

	var childFlg = false;
	//子ウィンドウが存在するかチェック
	for(child in _gChildWinList){
		if(_gChildWinList.hasOwnProperty(child)){
			if(_gChildWinList[child]){
				childFlg = true;
			}
		}
	}

	if(notClose == '' || notClose == null || notClose == 'undefined') {
		notClose = false;
	}

	//子ウィンドウが存在する場合
	if(childFlg){
		//セッション情報をクリアする場合
		if(sessionRemove) {
			for(child in _gChildWinList){
				if(_gChildWinList.hasOwnProperty(child)){
					windowIdList = windowIdList + "," + child;
				}
			}
			if(windowIdList.charAt(0) == ','){
				windowIdList = windowIdList.substring(1)
			}
			var params = new Object();
			//closeWindowFuncが最初にCALLされた場合のみ自画面のセッション情報を削除する。
			if(rootflg) {
				windowIdList = windowIdList + "," + windowID;
			} 
			params["windowIdList"] = windowIdList;
			asyncPost(
				ctxRoot + '/windowManagement/closeAllWindow'
				,params
				,function(sts, data) {
					if (sts) {
						for(child in _gChildWinList){
							if(_gChildWinList.hasOwnProperty(child)) {
								if(_gChildWinList[child]){
									try {
										_gChildWinList[child].closeWindowFunc(false, fm, '', windowMode, sessionRemove, ctxRoot);
									}catch(e){
									}
								}
							}
						}
						if(!notClose) closeFunc();
					}
				}
			        ,''
			);
		} else {
			for(child in _gChildWinList){
				if(_gChildWinList.hasOwnProperty(child)) {
					if(_gChildWinList[child]){
						try {
							_gChildWinList[child].closeWindowFunc(false, fm, '', windowMode, sessionRemove, ctxRoot);
						}catch(e){
						}
					}
				}
			}
			if(!notClose) closeFunc();
		}

	//子ウィンドウが存在しない場合
	} else {
		if(sessionRemove) {
			//closeWindowFuncが最初にCALLされた場合のみ自画面のセッション情報を削除する。
			if(rootflg) {	
				var params = new Object();
				params["windowId"] = windowID;
				asyncPost(
					ctxRoot + '/windowManagement/sessionClear'
					,params
					,function(sts, data) {
						if (sts) {
							if(!notClose) closeFunc();
						}
				 	}
			       		,''
				);
			} else {
				if(!notClose) closeFunc();
			}
		} else {
			if(!notClose) closeFunc();
		}
	}
}


//safari対応の為のclose関数
function closeFunc() {

	if(!window.opener){
		if (navigator.userAgent.toLowerCase().indexOf("firefox") == -1) {
			window.opener = window;
			var win = window.open(location.href,"_self");
			win.close();
		} else {
			window.close();
		}
	} else {
		window.close();
	}

}


/*-----------------------------------------------
 関数名：レイヤーウィンドウ機能(静的)
 引数　：id：エレメントID
         w ：ウィンドウの幅
         h ：ウィンドウの高さ
         x ：ウィンドウのX座標
         y ：ウィンドウのY座標
         titleStr： ヘッダタイトル
 戻り値：レイヤーウィンドウオブジェクト
 ---------------------------------------------*/
function layerWindow(id,w,h,x,y,titleStr){

	var modal = document.getElementById(_gDIV_MODALBACK);
	if(modal){
		modal.style.display = '';
	}else{
		//透過レイヤーを作成します。
		var modal = new modalWindow();
		modal.showModalBack();
	}
	formDisabled(true);
	if(document.getElementById(_gLAYER_PREFIX + id)){
		document.getElementById(_gLAYER_PREFIX + id).style.display = '';
		return;
	}
	//ウィンドウの初期表示位置を設定します。
	var xPoint;
	var yPoint;
	if(x){
		xPoint = x;
	}else{
		var centerX = (document.documentElement.clientWidth || document.body.scrollWidth);
		xPoint = ((centerX/2) - (w/2));
	}
	if(y){
		yPoint = y;
	}else{
		var centerY = (document.documentElement.clientHeight || document.body.scrollHeight);
		yPoint = ((centerY/2) - (h/2));
	}
	var layerBase = document.createElement('DIV');
	layerBase.id = _gLAYER_PREFIX + id;

	with(layerBase.style){
		width = w + 'px';
		height = h + 'px';
		position = 'absolute';
		left = xPoint;
		top = yPoint;
		margin = 0 + 'px';
		padding = 0 + 'px';
		border = 'solid 1px #000000';
	}
	//ヘッダ部分を作成します。
	var headerBtnImg = _gContextPath + '/img/closeBtn.gif';

	var headerSrc =  '<table class="tbl_header" id="layerHeader"><tr>'
	//ヘッダタイトルが指定されている場合
	if(titleStr) headerSrc += ('<td class="title">' + titleStr + '</td>');
	headerSrc += '<td><img src="' + headerBtnImg + '" width="23px" height="23px" id="closeBtn" onclick="javaScript:closeLayer(\'' + layerBase.id + '\')"></td>';
	headerSrc += '</tr></table>';

	//レイヤーウィンドウに表示するHTMLを取得します。
	var contentSrc = '<div id="layerContent">'
					+ document.getElementById(id).innerHTML
					+'</div>';
	layerBase.innerHTML = headerSrc + contentSrc;
	//動的に生成されたコンテンツの場合、IDの重複を防ぐため削除します。
	if(document.getElementById(id).dynamic){
		document.body.removeChild(document.getElementById(id));
	}
	document.body.appendChild(layerBase);

	//ドラッグのイベントをハンドリングします。
	_gLayer = new layerWindow_();
	_gLayer.setUp(layerBase.id);

	return layerBase;
}

function layerWindow_(){};

layerWindow_.prototype.mDown = function(event){
	event = window.event;
	this.dragFlg = true;
	this.offsetX = event.offsetX + 2;
	this.offsetY = event.offsetY + 2;
}

layerWindow_.prototype.mMove = function(event,id){

	var windowObj = document.getElementById(id);
	event = window.event;
	if( this.dragFlg ){
		windowObj.style.top = (event.clientY - this.offsetY + document.body.scrollTop) + 'px';
		windowObj.style.left = (event.clientX - this.offsetX + document.body.scrollLeft) + 'px';
	}
}

layerWindow_.prototype.mUp = function(event){
	this.dragFlg = false;
}

layerWindow_.prototype.setUp = function(id){

	layerWindow_.prototype.eventList = ['onmousedown','onmousemove','onmouseout','oumouseover','onmouseup','onselect'];
	for(var ix=0; ix < this.eventList.length; ix++){
		var key = this.eventList[ix];
		this.eventList[key] = document[key];
		document[key] = null;
	}

	layerWindow_.prototype.offsetX = null;
	layerWindow_.prototype.offsetY = null;

	layerWindow_.prototype.dragFlg = false;
	layerWindow_.prototype.target = document.getElementById('layerHeader');
	this.target.onmouseover = function(event){ this.style.cursor = 'move' };
	this.target.onmousedown = function(event){ return _gLayer.mDown(event) };

	layerWindow_.prototype.content = document.getElementById('layerContent');
	this.content.onmouseover = function(event){  };
	this.content.onmouseout = function(event){  };

	document.onmousemove = function(event){ return _gLayer.mMove(event,id) };
	document.onmouseup = function(event){ return _gLayer.mUp(event) };
}

function modalWindow(){};
//モーダルウィンドウとして表示するための透過フィルタを生成します。
modalWindow.prototype.showModalBack = function(){

	modalLayer = document.createElement('DIV');
	modalLayer.id = _gDIV_MODALBACK;
	with(modalLayer.style){
		width = ((document.body.scrollWidth < document.documentElement.scrollWidth )?document.documentElement.scrollWidth: document.body.scrollWidth) + 'px';
		height = ((document.body.scrollHeight < document.documentElement.scrollHeight)?document.documentElement.scrollHeight: document.body.scrollWidth) + 'px';
		
		filter = 'alpha(style=0,opacity=10);';
		MozOpacity = 0.1;
		opacity = 0.1;
		
	}
	document.body.appendChild(modalLayer);
	return modalLayer;
}

//layerWindow()を利用して生成したレイヤーウィンドウを閉じます。
function closeLayer(id){
	var target = document.getElementById(id);
	if(target) document.body.removeChild(target);
	//モーダルを解除します。
	var modal = document.getElementById(_gDIV_MODALBACK);
	if(modal) modal.style.display = 'none';
	
	// フォームの使用不可を解除します。
	formDisabled(false);
}

/*-----------------------------------------------
 関数名：レイヤーウィンドウ機能(動的)
 引数　：url         ：リクエストURL
         params      ：サーバに送信するパラメータ
         callBackFunc：コールバック関数
         eventId     ：イベントID
         w           ：ウィンドウの幅
         h           ：ウィンドウの高さ
         x           ：ウィンドウのX座標
         y           ：ウィンドウのY座標
         titleStr    ：ヘッダタイトル
 戻り値：レイヤーウィンドウオブジェクト
 ---------------------------------------------*/
function dynamicLayerWindow(url,params,callBackFunc,eventId,w,h,x,y,titleStr){

	//透過レイヤーを作成します。
	var modal = document.getElementById(_gDIV_MODALBACK);
	if( modal ){
		modal.style.display = '';
	}else{
		var modal = new modalWindow();
		modal.showModalBack();
	}
	//コールバック関数内で生成したHTMLを元に、レイヤーウィンドウを生成します。
	baseCallBack = function(result){
		//コールバック関数を実行し、HTMLを取得します。
		var src = callBackFunc(result);
		var dynamicLayerDiv = document.createElement('DIV');
		dynamicLayerDiv.id = 'layerContents';
		dynamicLayerDiv.innerHTML = src;
		dynamicLayerDiv.style.display = 'none';
		document.body.appendChild(dynamicLayerDiv);
		layerWindow(dynamicLayerDiv.id,w,h,x,y,titleStr);
	}
	asyncPost(url,params,baseCallBack);
}

 /*-----------------------------------------------
 関数名：ゼロパディング機能
 引数  ：id：入力フィールドID
 戻り値：なし
 ---------------------------------------------*/
function zeroPadding(id){
	var ieMaxLength = 2147483647;

	var field = document.getElementById(id);
	length = field.maxLength;
	if (length < 0 || length == ieMaxLength){
		return;
	}

	if(field){
		if(field.value == '' || field.value.match(/[^0-9]+/)) return;
		if(field.value.length < length){
			var diff = (length - field.value.length);
			var zeroPad = '';
			for(var ix=0; ix < diff; ix++){
				zeroPad += '0';
			}
			field.value = zeroPad + field.value;
		}
	}
}

/*-----------------------------------------------
 関数名：メッセージ管理機能
 引数　：id：メッセージID
         str1：置換文字列1
         str2：置換文字列2
         str3：置換文字列3
         str4：置換文字列4
 戻り値：置換済メッセージ
 ---------------------------------------------*/
function messageFormat(msg, str1, str2, str3, str4){
	var repTxt = [];
	repTxt.push(str1, str2, str3, str4);
	var msgTxt = msg;
	var reg = new RegExp('({\\d})');
	for(var ix=0; ix < repTxt.length; ix++){
		if(repTxt[ix]) msgTxt = msgTxt.replace(reg, repTxt[ix]);
	}
	return msgTxt;
}

/*-----------------------------------------------
 関数名：サブミット機能
 引数　：fm        ：フォームオブジェクト
         actionName：アクション名
         methodName：エントリポイントメソッド名
         eventId   ：イベントID
         isNoDoubleSubmit：2重送信防止フラグ(省略の場合はtrue)
                           (true：2重送信防止を行う、false：2重送信防止を行わない)
         ctxRoot   ：コンテキストルート
                     (省略した場合は_gContextPathから取得する)
 戻り値：なし
 ---------------------------------------------*/
function submitForm(fm, actionName, methodName, eventId, isNoDoubleSubmit, ctxRoot){
	if (isNoDoubleSubmit != 'false' && isNoDoubleSubmit !=_gFALSE ){
		noDoubleSubmit(fm);
	}
	if(ctxRoot == '' || ctxRoot == null || ctxRoot == 'undefined') {
		ctxRoot = _gContextPath;
	}
	if(actionName.charAt(0) != '/'){
		actionName = '/' + actionName;
	}
	if(fm.eventId) fm.eventId.value = eventId;
	fm.action = ctxRoot + actionName + "/" + methodName;
	fm.submit();
}

/*-----------------------------------------------
 関数名：2重送信防止機能
 引数　：fm：フォームオブジェクト
 戻り値：なし
 ---------------------------------------------*/
function noDoubleSubmit(fm){
	var elm = fm.elements;
	if(elm){
		for(var ix=0; ix < elm.length; ix++){
			if(elm[ix].type == 'button'){
				elm[ix].disabled = true;
			}
		}
		var linkObj = document.getElementsByTagName('a');
		for(var jx=0; jx < linkObj.length; jx++){
			linkObj[jx].onclick = function(){return false;}
		}
	}
}

/*-----------------------------------------------
 関数名：JSON形式データ変換機能
 引数　：data：JSON形式データ
 戻り値：変換後データ
 ---------------------------------------------*/
function parseJSON(data){
	if(data){
		return eval('(' + data + ')');
	}
	return '';
}

/*-----------------------------------------------
 関数名：背景色変更機能(バリデーションエラー時)
 引数　：id：オブジェクトのID
 戻り値：なし
 ---------------------------------------------*/
function setBgError(id){
	var wk = document.getElementById(id);
	if(wk){
		var errorClazz = 'bg_error';
		if(wk.className){
			wk.className += ' ' + errorClazz;
		}else{
			wk.className = errorClazz;
		}
	}
}

/*-----------------------------------------------
 関数名：背景色変更機能
 引数　：id ：オブジェクトのID
       color：背景色
戻り値：なし
 ---------------------------------------------*/
function setBgColor(id, color){
	var wk = document.getElementById(id);
	if(wk){
		wk.style.backgroundColor = color;
	}
}

/*-----------------------------------------------
内部で利用するための関数です。
---------------------------------------------*/
function isTrue(value){
	if(typeof value == 'boolean' && value){
		return true;
	}
	return false;
}
function formDisabled(state){
	for(i = 0; i < window.document.forms.length; i++){
		for(j = 0; j < document.forms[i].elements.length; j++){
			document.forms[i].elements[j].disabled = state;
		}
	}
}

