// 例、onclick="scrollToId('MCS_0149_5')"
function scrollToId(id){
	// 対象の要素を取得
	var trgtEle = document.getElementById(id);
	var trgtEle$= $(trgtEle);
	
	// 親要素を取得
	var prntEle = trgtEle$.closest('pre').get(0);

	// 要素の位置を取得
	const rect = trgtEle.getBoundingClientRect();
	const parentRect = prntEle.getBoundingClientRect();
	const offsetTop = rect.top - parentRect.top + prntEle.scrollTop;
	// 要素の位置までスクロール
	prntEle.scrollTo({ top: offsetTop - 8, behavior: 'smooth' });
}

function getLvl($cur_lvl){
	var lvl_num = "";
	
	// 要素の _lvlX を取得
	if($cur_lvl.hasClass("_lvl1")){
		lvl_num = "_lvl1";
	}
	else if($cur_lvl.hasClass("_lvl2")){
		lvl_num = "_lvl2";
	}
	else if($cur_lvl.hasClass("_lvl3")){
		lvl_num = "_lvl3";
	}
	else if($cur_lvl.hasClass("_lvl4")){
		lvl_num = "_lvl4";
	}
	
	return lvl_num;
}

function toggle_tree(ele){
	$ele = $(ele);
	
	// 前の_lvl 要素を検索
	$cur_lvl = $ele.prevAll("._lvl").first();
	var lvl_num = getLvl($cur_lvl);
	
	if($cur_lvl.length>0){
		// 次の_lvl 要素を検索
		$next_lvl = $ele.nextAll("._lvl").first();
		
		if($next_lvl.length>0 && getLvl($next_lvl) > lvl_num){			
			$chd_lvls = $next_lvl.nextUntil("."+lvl_num);
			
			if($ele.hasClass("collpdBtn")){
				// 閉めるボタン
				$next_lvl.addClass("collpd");		// collapse非表示
				$chd_lvls.addClass("collpd");		// collapse非表示
			}
			else{
				// 展開
				$next_lvl.removeClass("collpd");
				$chd_lvls.removeClass("collpd");
			}
		}
	}
	
	if($ele.hasClass("collpdBtn")){
		// 閉めるボタン
		$ele.removeClass("collpdBtn");
		$ele.addClass("expdBtn");
	}
	else{
		// 展開
		$ele.removeClass("expdBtn");
		$ele.addClass("collpdBtn");
	}
}
	
function popup(url) {
    window.open(url, '_blank', 'menubar=0,width=1000,height=500,top=100,left=100');
}

// ClipBoardへコピー
function copyToClipboard(codeId) {
    // コピー対象をJavaScript上で変数として定義する
    var copyTarget = document.getElementById(codeId);

    navigator.clipboard.writeText(copyTarget.innerText.replace(/\u00A0/g, ' '));

    // コピー対象のテキストを選択する
    //copyTarget.select();

    // 選択しているテキストをクリップボードにコピーする
    //document.execCommand("Copy");
}

// 頭文字を大文字へ変更
function firstUpper(s)
{
    return s && s[0].toUpperCase() + s.slice(1);
}

// Proper
function properCase(str, removeUnderBar) {
	if(typeof removeUnderBar === 'undefined'){
		removeUnderBar = false;
	}
	
    str = str.toLowerCase().replace(/\b\w/g, function(char) {
        return char.toUpperCase();
    }).replace(/_\w/g, function(char) {
        return char.toUpperCase();
    });
    
    if(removeUnderBar){
		str = str.replaceAll("_", "");
	}
	
	return str;
}

// 半角→全角(英数字)
function replaceHalfToFull(str){
  return str.replace(/[!-~]/g, function(s){
    return String.fromCharCode(s.charCodeAt(0) + 0xFEE0);
  });
}

// 全角→半角(英数字)
function replaceFullToHalf(str){
  return str.replace(/[！-～]/g, function(s){
    return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
  });
}

// 順番数字を算出
// cur: 現在値、orgVal: 開始の順番値、変更後の値
function getSeq(curOrgVal, val, orgVal){
	var orgValh = replaceFullToHalf(orgVal);
	var fullWidthFlg = false;
		
	if( orgValh != orgVal){
		fullWidthFlg = true;	// 全角出力
	}
	
	curOrgVal =  replaceFullToHalf(curOrgVal);
	val =  replaceFullToHalf(val);
	
	var tmp = Number(curOrgVal) - Number(orgValh) + Number(val);
	
	if(fullWidthFlg == true){
		tmp = replaceHalfToFull( String(tmp) );
	}

	return tmp;
}

$(document).ready(function(){
	setupVarDialog();
	setupModeDialog();
	
	// テンプレート
	$('.tmpl').click(function() {
		var $target = $(event.target);
		
		$('#txt_TmplDialog_Val1').text($target.text());
		tmplDialog.showModal();
	});
});

// Mode更新
function setMode($ele, $rgn, slowFlg){	
	var modeNm = $ele.attr('name');
	var val = $ele.attr('m_value');
	var subModeNms = $ele.attr('m_sub');
	var $subEle = null;

	// pre取得 ※ソースの単位
	varDialog_pre = $ele.closest('pre');

	if($rgn == null){
		$rgn = varDialog_pre;
	}
	
	// class= <modeNm> の項目を取得 ループ
	$rgn.find('.' + modeNm).each(function(index) {
		// class= <name> + <val> 表示 以外の項目を不表示
		var $ele = $(this);
		var $tgt = $ele;
		
		// 行単位で表示制御
		if( $ele.hasClass("mline")){
			$tgt = $ele.closest('li');
		}
		
		// $tgtが_m_の親がない 又は 表示する時
		// _m_ _m1_ _m1_y mnow ※ 現在値
		var $par_mode = $ele.parent().closest('._m_');

		// 親モード存在しない OR 親モード＝表示
		if( $par_mode.length ==0 || $par_mode.hasClass('mnow')){
			if( $ele.hasClass( modeNm + val) ){
				$ele.addClass("mnow");
				if(slowFlg) $tgt.show('slow');
				else $tgt.show();
				
				// subModeNmsが定義された場合、Elementの値を取得
				if(subModeNms){
					var arr_subModeNm = subModeNms.split(',');

					for( subModeNm of arr_subModeNm){
						var tarTmp = varDialog_pre.find("._m[name='" + subModeNm + "']");
						if(tarTmp.length > 0){
							$subEle = $(tarTmp[0]);
							setMode($subEle, $tgt, false)
							//subModeVal = $(tarTmp[0]).attr('m_value');
						}
					}
				}
			}
			else{
				$ele.removeClass("mnow");
				if(slowFlg) $tgt.hide('slow');
				else $tgt.hide();
			}
		}
	});
}

// 変数置換Dialog設定
function setupModeDialog(){
	var modeDialog = document.getElementById('modeDialog');
	var $curModeEle = null;
	
	// class = "_m" 項目を取得ループ
	$('._m').each(function(index) {
		var $ele = $(this);
		
		// class = "_m" 項目の名称<name>と値<val>を取得		
		setMode($ele,null, false);
	});
	
	$('._m').click(function() {
		var $ele = $(this);
		var eleName = $ele.attr('name');
		var eleTitle = $ele.attr('title');
		var eleVal = $ele.attr('m_value');
		var eleOpts = $ele.attr('m_option');
			
		// Modeを取得
		$('#lbl_ModeDialog_ModeNm').text(eleTitle);
		
		var $cmb = $('#cmb_ModeDialog_Mode');
		
		$cmb.children('option').remove();
		
		var opts = eleOpts.split(',');
		
		for(let i = 0; i < opts.length; i++) {
  			$cmb.append($("<option>").val(opts[i].split(":")[0]).text(opts[i]));
		}

		$cmb.val(eleVal);
		
		$curModeEle= $ele;
		modeDialog.showModal();
	});

	$('._ml').click(function() {
		var $ele = $(this);
		var eleName = $ele.attr('name');
		
		// Linkするeleを取得
		$("._m[name='" + eleName +"']").click();
	});
	
	$('#btn_ModeDialog_Cancle').click(function() {
		// Mode Dialogをクローズ
		modeDialog.close();
	});
	
	 $('#btn_ModeDialog_OK').click(function() {
	 	var $cmb = $('#cmb_ModeDialog_Mode');
	 	$curModeEle.attr('m_value',$cmb.val());
	 	setMode($curModeEle,null, true);
	 	
		// Mode Dialogをクローズ
		modeDialog.close();
	});

	$('#btn_TmplDialog_OK').click(function() {
		// Tmpl Dialogをクローズ
		tmplDialog.close();
	});
}

// 変数置換Dialog設定
function setupVarDialog(){
	var varDialog = document.getElementById('varDialog');
	var varDialog_pre;
	var varDialog_target;
	var varDialog_name;
	var varDict = {};	// Title Dictionary
	
	/// タイトル設定
	// Title Dictionary作成
	$('._var').each(function(index) {
		var $eleVar = $(this);
		if($eleVar.attr('title')){
			varDict[$eleVar.attr('name')]=$eleVar.attr('title');
		}
	});

	$('._var').each(function(index) {
		var $eleVar = $(this);
		if(!$eleVar.attr('title')){
			$eleVar.attr('title', varDict[$eleVar.attr('name')]);
		}
	});
	
	$('._var').click(function() {
		var $target = $(event.target);
		//$('#VarDialog_val').val($target.text());

		// pre取得
		varDialog_pre = $target.closest('pre');
		var $varObj = $target.closest('._var');
		varDialog_target = $varObj;
		varDialog_name = $varObj.attr('name');
		
		if(varDialog_name.endsWith('UF') || varDialog_name.endsWith('PU') ){
			varDialog_name = varDialog_name.substring(0, varDialog_name.length -2);
		}
		else if(varDialog_name.endsWith('U') || varDialog_name.endsWith('L') || varDialog_name.endsWith('P')){
			varDialog_name = varDialog_name.substring(0, varDialog_name.length -1);
		}
		
		var lblVarNm = $varObj.attr("title");
		
		if($varObj.attr('inptval')){
			$('#VarDialog_val').val($varObj.attr('inptval'));
		}else{
			$('#VarDialog_val').val($varObj.text());
		}
		
		if(!lblVarNm){
			lblVarNm = "変更後の値を入力してください。";
		}

		$('#lbl_VarDialog_varNm').text(lblVarNm);
		
		// var1を取得
		varDialog.showModal();
	});

	 $('#btn_VarDialog_Cancle').click(function() {
		// var1を取得
		varDialog.close();
	});

	 $('#btn_VarDialog_OK').click(function() {
	 	var tmp = $('#VarDialog_val').val();

	 	varDialog_pre.find('[name=' + varDialog_name + ']').each( function() {
	 		var this$ = $(this);
	 		if(this$.attr('inptval')){
				this$.attr('inptval', tmp);
			}
			
	 		if(this$.attr('orgval')){
	 			this$.text( getSeq(this$.attr('orgval'), tmp, varDialog_target.attr('orgval')));
	 		}
	 		else if(this$.attr('match')){ // 一部抽出
	 			this$.text(tmp.match(new RegExp(this$.attr('match'))));
	 		}
	 		else{
	 			 this$.text(tmp);
			}
	 	});
	 	var tmps$ = varDialog_pre.find('[name=' + varDialog_name + 'L]');
	 	tmps$.text(tmp.toLowerCase());
	 	set_inptval(tmps$, tmp);
	 	
	 	var tmps$ = varDialog_pre.find('[name=' + varDialog_name + 'U]');
	 	tmps$.text(tmp.toUpperCase());
	 	set_inptval(tmps$, tmp);
	 	
	 	var tmps$ = varDialog_pre.find('[name=' + varDialog_name + 'UF]');
	 	tmps$.text(firstUpper(tmp.toLowerCase()));
	 	set_inptval(tmps$, tmp);
	 	
	 	var tmps$ = varDialog_pre.find('[name=' + varDialog_name + 'P]');
	 	tmps$.text(properCase(tmp));
	 	set_inptval(tmps$, tmp);
	 	
	 	var tmps$ = varDialog_pre.find('[name=' + varDialog_name + 'PU]');
	 	tmps$.text(properCase(tmp, true));
	 	set_inptval(tmps$, tmp);
	 	
		// var1を取得
		varDialog.close();
	});
}

function set_inptval(tmps$, val){
	tmps$.each( function(index, element) {
	 	var ele$ = $(element);
	 		
 		if(ele$.attr('inptval')){
			ele$.attr('inptval', val);
		}
	});
}