/*
作業ツールボックス用関数
拡張ツール用

ツールボックスは、ペン等のポインタを使用した汎用入力パネル
jquery導入に合わせて、ドラッガブルでミニマイズ可能な作りに変更　2013.04.07

*/
//親ウィンドウを設定
	var targetObj=new Object;

//ツールボックスの初期化処理
//ソフトウェアキーボード処理
function skbPush(Chr){
	var textBody=document.getElementById("iNputbOx").value;
	switch(Chr){
	case	"(*)":if(textBody.length){document.getElementById("iNputbOx").value="("+textBody+")"};
	break;
	case	"○":chkValue("ok");
	break;
	case	"^z":chkValue("undo");
	break;
	case	"^y":chkValue("redo");
	break;
	case	"←":if(textBody.length){document.getElementById("iNputbOx").value=textBody.slice(0,-1)};
	break;
	case	"esc":chkValue("ng");return;
	break;
	default	:document.getElementById("iNputbOx").value+=Chr;//
	}
	if((! targetObj.xUI.edchg)&&(textBody!=document.getElementById("iNputbOx").value)){
		targetObj.xUI.edChg(true);//編集フラグ立て
	}
	document.getElementById("iNputbOx").focus();
}
//キーダウンでキー入力をサバく

//IEがプレスだとカーソルが拾えないようなのでキーダウン
function keyDown(e){
//フォーカスされたテーブル上の入力ボックスのキーダウンを検出
	key = getKEYCODE(e);//キーコードを取得

	var eddt = document.getElementById("iNputbOx").value;

	var interpKey=110;





	switch(key) {
case	25	:if(! Safari) break;
case	9	:	//tab
if (! targetObj.xUI.tabSpin) {
	if(!targetObj.xUI.edchg) return;
	targetObj.xUI.put(eddt);
	return false;break;
}
case	13	:		//Enter 標準/次スピン・シフト/前スピン・コントロール/interpSpin
	if(chkCtrl(e)){interpSign();return false;}
	if (targetObj.xUI.edchg){
		targetObj.xUI.put(targetObj.nas_expdList(eddt));//更新
//		alert("xstop");
//		targetObj.xUI.selection();
		targetObj.xUI.selectCell(add(targetObj.xUI.Select,[0,1]));//入力あり
	}else{
	    if(e.shiftKey){
		if(targetObj.expd_repFlag){
			targetObj.xUI.spin("up");targetObj.expd_repFlag=false;
		}else{
			targetObj.xUI.spin("back");
		}
	    }else{
		if(targetObj.expd_repFlag){
		targetObj.xUI.spin("down");targetObj.expd_repFlag=false;
		}else{
			targetObj.xUI.spin("fwd");//入力なしカラ送り
//			targetObj.xUI.selectCell(add(targetObj.xUI.Select,[0,1]));//入力あり
		}
	    };
//	if(! e.ctrlKey){}
	    if(! chkCtrl(e)){
		if(targetObj.xUI.getid("Selection")!="0_0")
			{targetObj.xUI.selection();targetObj.xUI.spinHi();};//選択範囲解除
	    }
	}
	return false;
	break;
case	27	:	//esc 選択範囲解除
//		編集中
	if (targetObj.xUI.edchg){return false;}//バックアップ復帰のためスキップ(実処理はUP)
//		複数セレクト状態
	if(targetObj.xUI.getid("Selection")!="0_0")
		{targetObj.xUI.selection();targetObj.xUI.spinHi();break;};//選択範囲解除
		return false;break;//標準処理(NOP)

//case 32	:		//space 値を確定してフォーカスアウト
//	targetObj.xUI.edchg=false;
//	targetObj.xUI.focusCell();	break;
case	38	:		//カーソル上・下
case	40	:		//[shift]+時はセレクションの調整 [ctrl]+時はさらにスピン量の調整も兼ねる
 	if (	chkShift(e) &&
		targetObj.xUI.Select[1]+targetObj.xUI.Selection[1]>=0 &&
		targetObj.xUI.Select[1]+targetObj.xUI.Selection[1]<(targetObj.XPS.duration()-1)
	){
		var kOffset=(key==38)? -1:1;
		targetObj.xUI.selection(targetObj.xUI.Select[0]+"_"+
		(targetObj.xUI.Select[1]+targetObj.xUI.Selection[1]+kOffset));
		if((chkCtrl(e))||(targetObj.xUI.spinSelect)) targetObj.xUI.spin("update");
	}else{
		//通常入力処理
	 if(! chkCtrl(e)){
		if(targetObj.xUI.getid("Selection")!="0_0"){targetObj.xUI.selection();targetObj.xUI.spinHi();};//選択範囲解除
	 }
		if (targetObj.xUI.edchg){targetObj.xUI.put(eddt);}//更新
		if(key==38){targetObj.xUI.spin("up")}else{targetObj.xUI.spin("down")};
	}	;return false;	break;
case	39	:		//右
	if (! targetObj.xUI.edchg) {targetObj.xUI.spin("right")	;return false;
	}else{
	return true;
	};	break;
case	37	:		//左?
	if (! targetObj.xUI.edchg) {targetObj.xUI.spin("left")	;return false;
	}else{
	return true;
	};	break;
case 	33:		//ページアップ
	if (targetObj.xUI.edchg){targetObj.xUI.put(eddt);}//更新
	targetObj.xUI.spin("pgup");return false;	break;
case 	34:		//ページダウン
	if (targetObj.xUI.edchg){targetObj.xUI.put(eddt);}//更新
	targetObj.xUI.spin("pgdn");return false;	break;
case	35 :;//[END]
	targetObj.xUI.selectCell(targetObj.xUI.Select[0]+"_"+targetObj.XPS.duration());
	break;
case	36 :;//[HOME]
	targetObj.xUI.selectCell(targetObj.xUI.Select[0]+"_0");
	break;
case	65 :		;	//[ctrl]+[A]/selectAll
 	if (chkCtrl(e))	{
		targetObj.xUI.selectCell(targetObj.xUI.Select[0]+"_0");
		targetObj.xUI.selection(
			targetObj.xUI.Select[0]+"_"+targetObj.XPS.duration()
		);
		return false;}else{return true}
	break;
case	67 :		;	//[ctrl]+[C]/copy
	if (chkCtrl(e))	{
		targetObj.xUI.yank();
		return false;}else{return true}
	break;
/*
case	79 :		;	//[ctrl]+[O]/ Open Document
	if ((chkCtrl(e))&&(! chkShift(e)))	{
		targetObj.xUI.openDocument();
		return false;}else{return true}
	break;
case	83 :	alert("SSS");	//[ctrl]+[S]/ Save or Store document
	if (chkCtrl(e)) {
		 if(chkShift(e)){targetObj.xUI.storeDocument("as");}else{targetObj.xUI.storeDocument();}
		return false;
	}else{
		return true
	}
	break;
*/
case	86 :		;	//[ctrl]+[V]/paste
	if (chkCtrl(e))	{
		targetObj.xUI.paste();
		return false;}else{return true}
	break;
case	88 :		;	//[ctrl]+[X]/cut
	if (chkCtrl(e))	{
		targetObj.xUI.cut();
		return false;}else{return true}
	break;
case	89 :		;	//[ctrl]+[Y]/redo
	if (chkCtrl(e))	{
		targetObj.xUI.redo();
		return false;}else{return true}
	break;
case	90 :		;	//[ctrl]+[Z]/undo
	if (chkCtrl(e))	{
		targetObj.xUI.undo();
		return false;}else{return true}
	break;
//case	61 :		;
//case	107 :		;
//case	221 :		;	//[+]/plus
//	alert("PLUS :"+key);
//return dialogSpin("incr");
//return true;
//	break;
//case	108 :		;
//case	109 :		;
case	interpKey :		;//[.]/dot-Tenkey これは問題あるキーの交換が出来ない
	if(! targetObj.xUI.edchg) {
		interpSign();return false;
	}else{
		return true;
	}
break;
//case	219 :		;	//[-]/minus
//	alert("MINUS :"+key);
//return dialogSpin("decr");
//return true;
//	break;
/* 保留
case 8	:	targetObj.xUI.spin("bs");	break;	//bs NOP
case 46	:	targetObj.xUI.spin("del");	break;	//del 
case  :	window.status="[]";	break;	//
*/
default :	return true;
	}
//return false;
}
////

function keyPress(e)
{
//	フォーカスされたテーブル上の入力ボックスのキープレスを検出して
//	動作コントロールのために戻り値を調整
	key = getKEYCODE(e);//キーコードを取得
//dbgPut("press :"+key)
/*		フロートモード判定
	フロート（ブロック移動/セクション編集）モードでは、キー動作の入力が制限される。
	最初にモード内動作を判定して処理
	モードを抜けるまでは他の機能に移行できない
	モードイン判定はノーマル入力モードアウト判定はこのルーチン内
-------------------------------------------------ブロック移動：
[↑][↓][→][←][h][j][k][l][8][2][4][6]	移動
[enter][5]			確定>モードアウト
[esc][0]			モードアウト
-------------------------------------------------セクション編集：
[ctrl] +[↑]/[↓]		端点移動
[shift]+[↑]/[↓]		セクション移動
[enter][5]			確定>モードアウト
[esc][0]			モードアウト

*/
	if(targetObj.xUI.edmode>0){
if(targetObj.xUI.edmode==1){
//ブロック移動モード

}else{
//セクション編集モード
}
	  return;
	}
/*
	ラピッドモード!=0 分岐処理
	ラピッドキーモードでは、マウスの入力は受け入れない
	0:解除
	1:スタンバイ（導入キーが一度押しされた状態）
	2:ラピッドモード
	
 */
if(targetObj.xUI.eXMode){
	//ラピッドモード前駆状態フラグONなのでラピッドモード判定
	if(targetObj.xUI.eXMode==1 && document.getElementById("iNputbOx").value.length==1)
	{	//	入力が前キーと同一ならばモードアクティブ
		if(targetObj.xUI.eXCode==key && document.getElementById("iNputbOx").value.charCodeAt(0)==key)
		{
			targetObj.xUI.eXMode++;//モード遷移
			eddt="";
			targetObj.xUI.eddt="";
			targetObj.xUI.selectedColor=targetObj.xUI.inputModeColor.EXTEND;
			targetObj.xUI.spinAreaColor=targetObj.xUI.inputModeColor.EXTENDspin;
			targetObj.xUI.spinAreaColorSelect=targetObj.xUI.inputModeColor.EXTENDselection;
			targetObj.xUI.spinHi();
		}else{
			targetObj.xUI.eXMode=0;targetObj.xUI.eXCode=0;return true;//遷移失敗 このセッションでは入れない
		};
	}
//モード変更直後でも1回はラピッド動作する
	if(targetObj.xUI.eXMode>=2){
		if(targetObj.xUI.eXMode==2){
//	モード遷移直後なので、現在の入力コントロールとバッファをクリアしてモードを確定する
			targetObj.xUI.eXMode++;
			if(targetObj.xUI.eddt==targetObj.xUI.bkup())targetObj.xUI.edChg(false);
			targetObj.syncInput(targetObj.xUI.bkup());
		};
	for (idx=0;idx<(targetObj.rapidMode.length-1)/2;idx++){if(key==targetObj.rapidMode[idx*2].charCodeAt(0))break;};
		if(idx<(targetObj.rapidMode.length-1)/2)
		{
			targetObj.xUI.doRapid([targetObj.rapidMode[idx*2+1]]);
			return false;
		}else{
			if (key!=13 && key!=8 && key!=9)
			{
		//モード解除
				if(targetObj.xUI.eXMode)
				{
		targetObj.xUI.eXMode=0;	targetObj.xUI.eXCode=0;

		targetObj.xUI.selectedColor=targetObj.xUI.inputModeColor.NORMAL;
		targetObj.xUI.spinAreaColor=targetObj.xUI.inputModeColor.NORMALspin;
		targetObj.xUI.spinAreaColorSelect=targetObj.xUI.inputModeColor.NORMALselection;
		targetObj.xUI.spinHi();
		return true;
//		return false;
				}
			}
		}
	}
}else{
//		通常状態なので予備モード遷移判定
	for (idx=0;idx<(targetObj.rapidMode.length-1)/2;idx++)
	{
//		if(key==targetObj.rapidMode[idx*2].charCodeAt(0) && document.getElementById("iNputbOx").value.length==0)
		if(key==targetObj.rapidMode[idx*2].charCodeAt(0) && targetObj.xUI.edChg)
		{
//dbgPut("exMode-ready: "+ key);
			targetObj.xUI.eXMode=1;targetObj.xUI.eXCode=key;return true;//予備モードに入る
		}
	}
}

//		通常判定
	switch(key) {
case	27	: 			;//esc
	return false;
case	25	:if(! Safari) break;
case	0	: 			;//キーコード0を返すコントロールキー群
case	9	:			;//またはTAB および ctr-I
//	return false;

if (! targetObj.xUI.tabSpin) {
	if(!targetObj.xUI.edchg) return true;
	return false;break;
}else{
	if (targetObj.xUI.edchg)
	{return true} else {return false};break;
}
case	13	:			;//Enter
		return false;break;
case	65	:			;//a
case	67	:			;//c
//case	79	:			;//o
//case	83	:			;//s
case	86	:			;//v
case	88	:			;//x
case	89	:			;//y
case	90	:			;//z
case	97	:			;//A
case	99	:			;//C
case	118	:			;//V
case	120	:			;//X
case	121	:			;//Y
case	122	:			;//Z
	if (chkCtrl(e))	{return false;}else{return true;};
		break;
//case		: ;	//
default :;
	return true;
	}
//return true;
}
//
//キーアップもキャプチャする。UI制御に必要 今のところは使ってない?
function keyUp(e)
{
	key = getKEYCODE(e);//キーコードを取得
	if(targetObj.xUI.eXMode>=2){
		document.getElementById("iNputbOx").select();
		return false;
	}
	if(false){
//alert(key+" : "+document.getElementById("iNputbOx").value.length);
//		通常状態なので予備モード遷移判定
	for (idx=0;idx<(targetObj.rapidMode.length-1)/2;idx++)
	{
		
		if(key==targetObj.rapidMode[idx*2].charCodeAt(0) && document.getElementById("iNputbOx").value.length==1)
		{
			targetObj.xUI.eXMode=1;targetObj.xUI.eXCode=key;break;//予備モードに入る
		}
	}
}
;
//	通常処理 入力コントロールとバックアップが食い違っているので編集中フラグON
	if(targetObj.xUI.bkup()!=document.getElementById("iNputbOx").value){
if(targetObj.dbg)targetObj.document.getElementById("app_status").innerHTML=targetObj.xUI.bkup()+" <> "+document.getElementById("iNputbOx").value;
	if(! targetObj.xUI.edchg) targetObj.xUI.edChg(true);//変更されていたらフラグ立て
	};
	switch(key) {
case  27:	;	//esc

	if(targetObj.xUI.edchg){targetObj.xUI.edChg(false);}
//		document.getElementById("iNputbOx").value=targetObj.xUI.bkup();
		targetObj.syncInput(targetObj.xUI.bkup());
		return false;
break;
case  9	:	;	//tab はシステムで使うのでUPは注意
case  13:	;	//Enter
case  32:	;	//space
case  38:	;	//上カーソル
case  40:	;	//下
case  39:	;	//右
case  37:	;	//左
case  33:	;	//ページアップ
case  34:	;	//ページダウン
case  16:	;	//シフト
case  17:	;	//コントロール
case  18:	;	//ALT
case  45:	;	//ins
case  46:	;	//del
case  144:	;	//clear(NumLock)
//case  :	;	//
	if(!targetObj.xUI.edchg) document.getElementById("iNputbOx").select();
//	if(!targetObj.xUI.edchg) document.getElementById("iNputbOx").focus();
//	targetObj.syncInput(document.getElementById("iNputbOx").value);
	return true;
//case  :	window.status="[]";	break;	//
case	65	:	;//[a]
case	67	:	;//[c]
//case	79	:	;//[o]
//case	83	:	;//[s]
case	86	:	;//[v]
case	88	:	;//[x]
case	89	:	;//[y]
case	90	:	;//[z]
	if (chkCtrl(e))	{
		return true;
	}
		break;
//case 110:;//.テンキー
//case 190:;//.>
//	if(!targetObj.xUI.edchg) document.getElementById("iNputbOx").select();

//break;
//case 99 :	;	//[C]copy	このあたりは横取り
//case 118 :	;	//[V]paste
//case 120 :	;	//[X]cut	しないほうが良い?
case 8	:	;	//bs NOP
default :
//if(! targetObj.xUI.edchg) targetObj.xUI.edChg(true);
if(targetObj.xUI.Select[0]>0){targetObj.syncInput(document.getElementById("iNputbOx").value);};
	return true;
	}
//if(! targetObj.xUI.edchg)	targetObj.xUI.edChg(true);
return true;
}
/*
//現在の有効データを取得
function getCurrent(){
	currentValue=null;
	for(id=targetObj.xUI.Select[1];id>=0;id--)
	{
		currentValue=targetObj.dataCheck(targetObj.XPS.xpsBody[targetObj.xUI.Select[0]][id]);
		if(currentValue && currentValue!="blank")break;
	 }
	return currentValue;
}
//
function dialogSpin(param)
{
	var doSpin=true;
	var entry=getCurrent();

	if (! entry){return;};

	switch(param)
	{
	case "incr":	doSpin=false;entry++;break;
	case "decr":	doSpin=false;if(entry>1){entry--;break}else{return;break;}
	case "incrS":	entry++;break;
	case "decrS":	if(entry>1){entry--;break}else{return;break;}
	}

	if(doSpin) 
	{
		targetObj.xUI.put(entry);//更新
		targetObj.xUI.spin("fwd");
	}else{
		targetObj.XPS.xpsBody[targetObj.xUI.Select[0]][targetObj.xUI.Select[1]]=entry;//直更新
		targetObj.document.getElementById(targetObj.xUI.Select[0]+"_"+targetObj.xUI.Select[1]).innerHTML=entry;//
	}
		document.getElementById("iNputbOx").value="";//入力エリア消去
	return false;
}
*/
//サブミットの際の動作
function chkAction()
{
	return false;
}
//
function chkValue(id)
{
	document.getElementById("iNputbOx").select();

	switch (id)
	{
case	"fct0"	:
case	"fct1"	:
	targetObj.xUI.selectCell(targetObj.xUI.Select[0]+'_'+
		targetObj.nas.FCT2Frm(document.getElementById(id).value));
	;break;
case	"selall"	:
		targetObj.xUI.selectCell(targetObj.xUI.Select[0]+"_0");
		targetObj.xUI.selection(
			targetObj.xUI.Select[0]+"_"+targetObj.XPS.duration()
		);break;
case	"copy"	:	targetObj.xUI.copy();break;
case	"cut"	:	targetObj.xUI.cut();break;
case	"paste"	:	targetObj.xUI.paste();break;
case	"activeLvl"	:
	var Lvl=targetObj.xUI.Select[0];
	if(Lvl>0&&Lvl<=(targetObj.XPS.layers.length+1))
	{	targetObj.writeAEKey(Lvl);
		
	}
	return;break;
case	"iNputbOx"	:	hello();break;
case	"ok"	:
	if (targetObj.xUI.edchg)
	{
		targetObj.xUI.put(targetObj.nas_expdList(document.getElementById("iNputbOx").value));//更新
	}
	if(targetObj.expd_repFlag){
		targetObj.xUI.spin("down");targetObj.expd_repFlag=false;
	}else{
		targetObj.xUI.spin("fwd")
	}
		break;

case	"ng"	:
	if(targetObj.xUI.edchg){targetObj.xUI.edChg(false);}
	targetObj.syncInput(targetObj.xUI.bkup());
	if(targetObj.xUI.getid("Selection")!="0_0")
		{targetObj.xUI.selection();break;}
		//選択範囲解除
		break;

case	"undo"	:	targetObj.xUI.undo();break;
case	"redo"	:	targetObj.xUI.redo();break;
case	"up"	:	;//スピン
case	"down"	:	;
case	"right"	:	;
case	"left"	:	;
case	"fwd"	:	;
case	"back"	:	;
	targetObj.xUI.spin(id);break;
case	"home"	:	;targetObj.xUI.selectCell(targetObj.xUI.Select[0]+"_0");break;
case	"end"	:	;targetObj.xUI.selectCell(targetObj.xUI.Select[0]+"_"+targetObj.XPS.duration());break;
//
case	"spin_V"	:
	targetObj.xUI.spin(document.getElementById(id).value);break;
case	"v_up"	:	;//スピン関連
case	"v_dn"	:	;//IDとキーワードを合わせてそのまま送る
case	"pgdn"	:	;
case	"pgup"	:
	targetObj.xUI.spin(id);break;
case	"spinCk":	;//スイッチ変更
	targetObj.xUI.spinSelect=document.getElementById(id).checked;
	targetObj.sync("spinS");
			break;
case	"exportCheck":	;//スイッチ変更
	var myCheck=document.getElementById(id);
	myCheck.checked=(myCheck.checked)?false:true;
	return false;
			break;
case	"layer"	:	;//レイヤ変更
	if (document.getElementById("single")){}

	targetObj.xUI.selectCell(
		(document.getElementById(id).selectedIndex).toString()+
		"_"+targetObj.xUI.Select[1]
	);
	reWriteCS();//cセレクタの書き直し
	break;
case	"cell"	:	;//セルの入力
	targetObj.xUI.put((document.getElementById(id).selectedIndex+1));
	targetObj.xUI.spin("fwd");

	break;
case	"fav"	:	;//文字の一括入力
EXword=targetObj.xUI.favoriteWords[document.getElementById(id).selectedIndex];
TGword=targetObj.XPS.xpsBody[targetObj.xUI.Select[0]][targetObj.xUI.Select[1]];
//文字列に*があれば、現在の値と置換
if(EXword.match(/\*/))EXword=EXword.replace(/\*/,TGword);
//#があれば現在の値の数値部分と置換

if(EXword.match(/\#/)){
	if(TGword.match(/(\D*)([0-9]+)(.*)/)){
		var prefix=RegExp.$1;var num=RegExp.$2;var postfix=RegExp.$3;
		EXword=EXword.replace(/\#/,num);
		EXword=prefix+EXword+postfix;
	}
}

//	targetObj.xUI.put(targetObj.xUI.favoriteWords[document.getElementById(id).selectedIndex]);
	targetObj.xUI.put(EXword);
	targetObj.xUI.spin("fwd");

	break;
case	"single":	break;
default:	alert(id);return false;
	}
//	alert(id);
return false;
}
//チェックボックストグル操作
function chg(id)
{
	document.getElementById(id).checked=
	(document.getElementById(id).checked) ?
	false	:	true	;
	chkValue(id);
	return false;
}
//

//ツールボックス初期化
function initToolbox()
{
	targetObj = window;

//エレメントブラウザを初期化

	var Selector="";
	var selected=targetObj.xUI.Select[0];
Selector+=(selected==0)?'<option selected/>台詞':'<option />台詞';
for(c=0;c<targetObj.XPS.layers.length;c++)
{
	Selector+=(selected==(c+1))?
'<option selected/>'+targetObj.XPS.layers[c]["name"]:
'<option />'+targetObj.XPS.layers[c]["name"];
}
Selector+=(selected==(targetObj.xUI.SheetWidth-1))?'<option selected/>MEMO.':'<option />MEMO.';

	document.getElementById("layer").innerHTML=Selector;
//
	reWriteCS();//cellセレクタの書き直し
	reWriteWS();//wordセレクタの書き直し

//入力ボックスにイベントハンドラを設定
//	document.getElementById("iNputbOx").onkeydown=targetObj.xUI.keyDown;
//	document.getElementById("iNputbOx").onkeypress=targetObj.xUI.keyPress;
//	document.getElementById("iNputbOx").onkeyup=targetObj.xUI.keyUp;
}

//セルのセレクタを書き直す。
function reWriteCS(){
	var Selector='';
	if(targetObj.xUI.Select[0] == 0)
	{
	}else{
		if(targetObj.xUI.Select[0] < (targetObj.XPS.xpsBody.length-1))
		{
	var cOunt=
	(isNaN(targetObj.XPS["layers"][targetObj.xUI.Select[0]-1]["lot"]))?
20 : targetObj.XPS["layers"][targetObj.xUI.Select[0]-1]["lot"];
for(f=1;f<=cOunt;f++){Selector+='<option />'+f.toString()}
		}else{
		}
	};

	document.getElementById("cell").innerHTML=Selector;
}
//お気に入り単語のセレクタを書き直す。
function reWriteWS(){
var Selector='';

	var wCount=targetObj.xUI.favoriteWords.length;
for(id=0;id<wCount;id++){Selector+='<option />'+targetObj.xUI.favoriteWords[id]};

	document.getElementById("fav").innerHTML=Selector;
}
//
function toss(target){document.getElementById(target).focus();};
//
function hello(){alert("この辺は、まだなのだ。\nのんびり待っててチョ。");}
