<!--
/*
 *   ReffiConsoleScript.js   :   Reffiコンソール表示スクリプト（IE用）
 *
 *                 Copyright (c) Yoko(YOKO-HMX) 2004.  All rights reserved.
 *
 *  [更新履歴]
 *    2004/10/04 : 制作開始 / 1文字出力完成
 *    2004/10/05 : 文字/画像変換 / 座標出力 -> 1枚画像からのクリッピング
 *    2004/10/05 : 画像切り分け / 1行版作成 / 入出力完成
 *    2004/10/06 : 複数行へ対応 ほぼ完成
 *    2004/10/07 : キュー構造の実装(入出力管理によるバグ除去)
 *    2004/10/08 : 画像側修正
 *    2004/10/09 : 処理の流れを変更 / デバッグウインドウ作成 / 入出力管理強化(排他制御) 
 *    2004/10/10 : 完成(構想2年越し^^;) / アスキー描画モード実装
 *    2004/10/11 : プレロード処理の強化
 *    2004/10/12 : 書き出し用レイヤーをHTML側で描画するように変更 / 変数周りの整備
 *    2004/10/18 : フォント用画像を１枚から取得できるように改良(コネクション回数の低減)
 *    2007/05/04 : ブラウザ依存箇所の修正
 */


//-----------------------------------------------//
//              [ Script Setting ]               //
//-----------------------------------------------//
var ConsoleLineNum = 8;				// コンソール表示行数
var WriteObjTop    = new Array(		// コンソール表示行の高さ
'80', '70', '60', '50', '40', '30', '20', '10', '0');
var CharTypeSec    = 10;			// 文字タイプ速度
var WatchCrSec     = 120;			// 行末であるかを監視する間隔 / 改行までのタイムアウト
var DebugMode      = 0;				// デバッグウインドウを使用するか否か / 使用時はコイツを0に
var DrawingMode    = 0;				// 描画モード(0:バイナリ(画像) 1:アスキー)
var ImgFilePass    = "./script/Reffi/gif/";		// 呼び出し先のHTMLファイルから見た画像ファイルのパス
var ImgSize        = 5;				// 画像１文字（正方形）の一辺の長さ
var PreLoadSec     = 200;			// 画像プレロードが完了しているかを監視する間隔
var VisibleMenuSec = 30;			// メニュー画像を[表示]に切り替える間隔
var MenuImgNum     = 10;			// メニューの数


//-----------------------------------------------//
//              [ Global Variable ]              //
//-----------------------------------------------//
// -- Global -- //
var CrFlag      = 'true';					// 簡易排他制御用 行末到達監視用変数
var WriteObjID  = new Array();				// コンソール表示行 ID
for(i = 0; i <= ConsoleLineNum; i++) { WriteObjID[i] = "LineNum"+(i+1); } 

// -- 名称の簡略化 -- //
var ELMenu = document.all;

if(DebugMode == 1){
	var EL_Debug = top.Debug;
	    EL_Debug = EL_Debug.document.all;
}

// -- Pre Load Image -- //
var ImgName           = new Array();
var Img               = new Array();
var PreLoadIntervalID = 0;					// タイマー初期化

// -- VisibleMenuImgFunc -- //
var VisibleMenuImgFunc_timerID = 0;			// タイマー宣言
var MenuImgCnt                 = 0;			// メニュー数 カウンタ

// -- StrImg_Ready -- //
var InputChar;								// 入力文字データ(タイピング表示) 
var CurFileTag;								// カーソル文字データ
var FontFileName;							// フォントファイル 基本名称
var ConnectSysMesFileTag;					// メッセージ格納用変数(一括表示)
var FilePass;								// フォントファイルのパス

// -- QueueCtrlFunc -- //
var QueueMaxsize = 32;						// キュー最大サイズ
var QueueArray   = new Array(QueueMaxsize);	// キューデータ
var HeadData     = 0;						// 先頭データ
var TailData     = 0;						// 末尾データ

// -- StrImg_Write -- // 
var StrImg_Write_timerID;					// タイマー初期化
var FontFileTag = new Array();				// ファイルパス格納用変数
var ConnectPass = new Array(128);			// 書き出し文字列格納用変数
for(i = 0; i < 128; i++){ ConnectPass[i] = new Array(128); }
var StrLine     = 0;						// 行カウンタ（描画先）
var StrSeq      = 0;						// 列カウンタ
var OutputStr   = new Array();				// 過去データ格納用変数
var LineCounter = 0;						// 通しての行カウンタ
var SortCounter = 0;						// 昇降用行カウンタ

//-- ReffiConsole_MainFunc --
var WatchFlag       = 0;					// 監視用フラグ
var IntervalID      = 0;					// タイマーID
var DebugIntervalID = 0;					// タイマーID
var QueueInputData  = "";					// キュー入力データ


//---------------------------------------------------------------------//
//              [ Draw Object -- DynamicHTML Draw Layer ]              //
//---------------------------------------------------------------------//
/*
 *
 * -- HTML 側で以下を描画する --
 *
 *with (document) {
 *	write('<div style="position:absolute; top:200; left:50; width:310; height:60; border:1px solid #cccccc;">');
 *	for(i=0; i <= ConsoleLineNum-1; i++) write('<span id=' +WriteObjID[i]+ ' class="ConsoleLineLyr" style=" top:'+WriteObjTop[ConsoleLineNum-i]+';"></span>');
 *	write('<span id=' +WriteObjID[i]+ ' class="ConsoleLineLyr" style="top:'+WriteObjTop[ConsoleLineNum-i]+'; visibility:hidden"></span>');
 *	write('</div>');
 *}
 */

//-------------------------------------------------------//
//               [ PreLoad Image Function]               //
//-------------------------------------------------------//
function PreLoadImage(){
	if(document.all){
		// 読み込み状況を監視
		PreLoadIntervalID = setInterval("WatchPreLoadImage()",PreLoadSec);

		// プレロード処理
		if(document.images){
			// 名称定義
			ImgName[0] = ImgFilePass + 'font01.gif';
			ImgName[1] = ImgFilePass + 'font02.gif';
			
			// 読み込み
			for(i = 0; i<ImgName.length; i++) {
				Img[i] = new Image();
				Img[i].src = ImgName[i];
				Img[i].name = "RefFontImg"+i;
			}
		}
	} else if(document.getElementById) {
		// Firefoxには今のところ対応しない
		document.getElementById("MenuImg0").style.visibility = "visible"
		document.getElementById("MenuImg1").style.visibility = "visible"
		document.getElementById("MenuImg2").style.visibility = "visible"
		document.getElementById("MenuImg3").style.visibility = "visible"
		document.getElementById("MenuImg4").style.visibility = "visible"
		document.getElementById("MenuImg5").style.visibility = "visible"
		document.getElementById("MenuImg6").style.visibility = "visible"
		document.getElementById("MenuImg7").style.visibility = "visible"
		document.getElementById("MenuImg8").style.visibility = "visible"
		document.getElementById("MenuImg9").style.visibility = "visible"
	}
}


//----------------------------------------------//
//       [ Watch PreLoad Image Function]        //
//----------------------------------------------//
function WatchPreLoadImage(){
	for(i = 0; i<ImgName.length; i++) {
		// 全て読み込み完了してなければ処理終了
		if(Img[i].complete != true) {
			// 画像読み込み率
			var per = Math.round( (i / (ImgName.length)) * 100) ;
			status = 'Loading Images ... ' +per+ '%';
			return;
		}
	}
	
	// 全て読み込み完了
	status = '';
	VisibleMenuImgFunc();				// レイヤー表示
	ReffiConsole_MainFunc('Act_Load');	// コンソール開始
	
	// タイマークリアして処理終了
	clearInterval(PreLoadIntervalID);
	return;
}


//-----------------------------------------------//
//               [ Visible MenuImg ]             //
//-----------------------------------------------//
function VisibleMenuImgFunc() {
	clearTimeout(VisibleMenuImgFunc_timerID);
	
	document.all('MenuImg'+MenuImgCnt).style.visibility = "visible";
	
	if(MenuImgCnt < (MenuImgNum-1)){
		MenuImgCnt++;
	} else{
		// タイマークリアして終了
		clearTimeout(VisibleMenuImgFunc_timerID);
		return;
	}
	VisibleMenuImgFunc_timerID = setTimeout("VisibleMenuImgFunc()",VisibleMenuSec);
}


//-------------------------------------------------------------------//
//             [ ReffiConsole PutImgAnim -- Main Function]           //
//-------------------------------------------------------------------//
function ReffiConsole_MainFunc(Mode){
	// -- デバッグ関数 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	if(DebugMode == 1){ EL_Debug.Debug_Sub0.innerHTML = "簡易排他制御用 行末到達監視用変数(CrFlag) : " +CrFlag; }
	if(DebugMode == 1){ DebugIntervalID1 = setInterval("QueueCtrlFunc('Disp')",10); }
	
	
	// -- 文字変換 / 入力処理 / キューへの入力 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	if(Mode == 'Act_Load'){
		//  文字列 <-> 画像ファイル変換
		for(WatchFlag = 0; WatchFlag <= 13; WatchFlag++){
			     if(WatchFlag ==  0) { QueueInputData = StrImg_Ready('>BOOT', '.............', 'font01'); }
			else if(WatchFlag ==  1) { QueueInputData = StrImg_Ready('>', 'WAKEUP SYSTEM....', 'font01'); }
			else if(WatchFlag ==  2) { QueueInputData = StrImg_Ready('>', '.."RVR" VIRTUAL CONTROL.', 'font01'); }
			else if(WatchFlag ==  3) { QueueInputData = StrImg_Ready('>CONNECT ', '................', 'font02'); }
			else if(WatchFlag ==  4) { QueueInputData = StrImg_Ready('>', '...........[OK].', 'font01'); }
			else if(WatchFlag ==  5) { QueueInputData = StrImg_Ready('>LOGIN', '......[OK].', 'font01'); }
			else if(WatchFlag ==  6) { QueueInputData = StrImg_Ready('>CONSOLE','....[OK].', 'font01'); }
			else if(WatchFlag ==  7) { QueueInputData = StrImg_Ready('>','', 'font01'); }
			else if(WatchFlag ==  8) { QueueInputData = StrImg_Ready('><< WELCOME TO P.N.B! >>', '', 'font02'); }
			else if(WatchFlag ==  9) { QueueInputData = StrImg_Ready('>INHERITANCE(VER 0.1.2).','', 'font02'); }
			else if(WatchFlag == 10) { QueueInputData = StrImg_Ready('>','', 'font02'); }
			else if(WatchFlag == 11) { QueueInputData = StrImg_Ready('>MAIN/SYSTEM>', '', 'font02'); }
			else if(WatchFlag == 12) { QueueInputData = StrImg_Ready('>MAIN/SYSTEM>', 'CD PNB', 'font02'); }
			else if(WatchFlag == 13) { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB', '>', 'font02'); }
			
			// 連結文字をキューに入れる
			QueueCtrlFunc('In', QueueInputData);
		}
		
	} else if(Mode == 'Act_Text') {
		for(WatchFlag = 0; WatchFlag <= 1; WatchFlag++){
			if(WatchFlag ==  0) { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>JOB TEXT', '', 'font02'); }
			               else { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>TEXT', '....[READY].', 'font02'); }
			QueueCtrlFunc('In', QueueInputData);
		}
	} else if(Mode == 'Act_BBS') {
		for(WatchFlag = 0; WatchFlag <= 1; WatchFlag++){
			if(WatchFlag ==  0) { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>JOB BBS', '', 'font02'); }
			               else { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>BBS', '.....[READY].', 'font02'); }
			QueueCtrlFunc('In', QueueInputData);
		}
	} else if(Mode == 'Act_Link' ) {
		for(WatchFlag = 0; WatchFlag <= 1; WatchFlag++){
			if(WatchFlag ==  0) { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>JOB LINK', '', 'font02'); }
			               else { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>LINK', '....[READY].', 'font02'); }
			QueueCtrlFunc('In', QueueInputData);
		}
	} else if(Mode == 'Act_About') {
		for(WatchFlag = 0; WatchFlag <= 1; WatchFlag++){
			if(WatchFlag ==  0) { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>JOB ABOUT', '', 'font02'); }
			               else { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>ABOUT', '...[READY].', 'font02'); }
			QueueCtrlFunc('In', QueueInputData);
		}
	} else if(Mode == 'Act_Desktop') {
		for(WatchFlag = 0; WatchFlag <= 1; WatchFlag++){
			if(WatchFlag ==  0) { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>JOB DESKTOP', '', 'font02'); }
			               else { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>DESKTOP', '..[READY].', 'font02'); }
			QueueCtrlFunc('In', QueueInputData);
		}
	} else if(Mode == 'Act_Web') {
		for(WatchFlag = 0; WatchFlag <= 1; WatchFlag++){
			if(WatchFlag ==  0) { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>JOB WEB', '', 'font02'); }
			               else { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>WEB', '..[READY].', 'font02'); }
			QueueCtrlFunc('In', QueueInputData);
		}
	} else if(Mode == 'Act_Circle') {
		for(WatchFlag = 0; WatchFlag <= 1; WatchFlag++){
			if(WatchFlag ==  0) { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>JOB CIRCLE', '', 'font02'); }
			               else { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>CIRCLE', '..[READY].', 'font02'); }
			QueueCtrlFunc('In', QueueInputData);
		}
	} else if(Mode == 'Act_Antenna') {
		for(WatchFlag = 0; WatchFlag <= 1; WatchFlag++){
			if(WatchFlag ==  0) { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>JOB ANTENNA', '', 'font02'); }
			               else { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>ANTENNA', '..[READY].', 'font02'); }
			QueueCtrlFunc('In', QueueInputData);
		}
	} else if(Mode == 'Act_Mixi') {
		for(WatchFlag = 0; WatchFlag <= 1; WatchFlag++){
			if(WatchFlag ==  0) { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>JOB MIXI', '', 'font02'); }
			               else { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>MIXI', '..[READY].', 'font02'); }
			QueueCtrlFunc('In', QueueInputData);
		}
	} else if(Mode == 'Act_Twitter') {
		for(WatchFlag = 0; WatchFlag <= 1; WatchFlag++){
			if(WatchFlag ==  0) { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>JOB TWITTER', '', 'font02'); }
			               else { QueueInputData = StrImg_Ready('>MAIN/SYSTEM/PNB>TWITTER', '..[READY].', 'font02'); }
			QueueCtrlFunc('In', QueueInputData);
		}
	}
	
	// -- キューからの出力 / 文字列出力処理 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
	IntervalID = setInterval("QueueWatchFunc()", WatchCrSec);
}


//-------------------------------------------------------------------//
//          [ String <-> Image Convert --  Input Function ]          //
//-------------------------------------------------------------------//
function StrImg_Ready(SysMesInputChar, InputChar,  FontFileName){

	FilePass = ImgFilePass + FontFileName + ".gif";
	
	// ******** [ Cursor -- ASCII Code Table -> Image File Table ] ******** //
	if(DrawingMode == 0){
		var DefineCurChar = '_'
		var CurFileNumber = DefineCurChar.charCodeAt(0);
		
		var CurFileNumber_Temp   = Math.floor(CurFileNumber / 16);
		var CurFileCode_Sequence = CurFileNumber - 16*(CurFileNumber_Temp);	// 列取得
		var CurFileCode_Line     = CurFileNumber_Temp - (32/16);			// 行取得
		
		// X座標算出
		var CurFileStrX = CurFileCode_Sequence * ImgSize;
		var CurFileEndX = CurFileStrX + ImgSize;
		
		// Y座標算出
		var CurFileStrY = CurFileCode_Line * ImgSize;
		var CurFileEndY = CurFileStrY + ImgSize;
		
		// 画像位置をゼロに調整
		CurFileMyTop  = -1*CurFileStrY;
		CurFileMyLeft = -1*CurFileStrX;

		CurFileTag  = "<img class=ConsoleImg src="+FilePass+" style=\"position:absolute; top:"+CurFileMyTop+"; left:"+CurFileMyLeft+"; clip:rect("+CurFileStrY+" "+CurFileEndX+" "+CurFileEndY+" "+CurFileStrX+");\">";
		
		// 連結状態で位置を保存
		CurFileTag = "<span style=\"position:relative; width:" +ImgSize*(DefineCurChar.length)+ "; height:5;\">" + CurFileTag + "</span>";
	} else {
		var CurFileTag = '_';
	}

	// ******** [ SystemMessage -- ASCII Code Table -> Image File Table ] ******** //
	// システムメッセージ定義
	// var SysMesInputChar = ">MAIN/SYSTEM/AFS>";
	if(DrawingMode == 0){
		var strcnt = 0;				// 文字位置 初期化
		ConnectSysMesFileTag = "";	// メッセージ格納用変数 初期化
		for(strcnt = 0; strcnt < SysMesInputChar.length; strcnt++){
			var SysMesFileNumber = SysMesInputChar.charCodeAt(strcnt);
			
			var SysMesFileNumber_Temp   = Math.floor(SysMesFileNumber / 16);
			var SysMesFileCode_Sequence = SysMesFileNumber - 16*(SysMesFileNumber_Temp);	// 列取得
			var SysMesFileCode_Line     = SysMesFileNumber_Temp - (32/16);					// 行取得
			
			// X座標算出
			var SysMesFileStrX = SysMesFileCode_Sequence * ImgSize;
			var SysMesFileEndX = SysMesFileStrX + ImgSize;
			
			// Y座標算出
			var SysMesFileStrY = SysMesFileCode_Line * ImgSize;
			var SysMesFileEndY = SysMesFileStrY + ImgSize;
			
			// 画像位置をゼロに調整
			SysMesFileMyTop  = -1*SysMesFileStrY;
			SysMesFileMyLeft = -1*SysMesFileStrX + (ImgSize+1)*strcnt;	// +2は画像横方向の補正量
			
			SysMesFileTag  = "<img class=ConsoleImg src="+FilePass+" style=\"position:absolute; top:"+SysMesFileMyTop+"; left:"+SysMesFileMyLeft+"; clip:rect("+SysMesFileStrY+" "+SysMesFileEndX+" "+SysMesFileEndY+" "+SysMesFileStrX+");\">";
			
			ConnectSysMesFileTag = ConnectSysMesFileTag + SysMesFileTag;
		}
		
		// 連結状態で位置を保存
		ConnectSysMesFileTag = "<span style=\"position:relative; width:" +(ImgSize+1)*(SysMesInputChar.length)+ "; height:5;\">" + ConnectSysMesFileTag + "</span>";
	} else {
		ConnectSysMesFileTag = SysMesInputChar;
	}
	
	// 変数を連結(順序はこれで保持)
	// ConnectSysMesFileTag, InputChar, CurFileTag, FontFileName
	QueueInputData = ConnectSysMesFileTag +"<>"+ InputChar +"<>"+ CurFileTag +"<>"+ FontFileName;
	
	return QueueInputData;
}


//-------------------------------------------------------------------//
//                  [ Queue Function -- In / Out ]                   //
//   Reference :                                                     //
//      http://www5c.biglobe.ne.jp/~MOGI/algorithm/algorithm05.htm   //
//-------------------------------------------------------------------//
// ******** [ Queue Control Function ] ******** //
function QueueCtrlFunc(Mode, data){
	if(Mode == 'In'){
		//var data = "Inputdata";
		if(data != 'false'){
			if(QueueIn_Func(data) == 'false'){
				if(DebugMode == 1){ EL_Debug.Debug_Main.innerHTML = "キューが一杯"; }
			}
			if(DebugMode == 1){ EL_Debug.Debug_Sub2.innerHTML = data; }
		}
	} else if(Mode == 'Out') {
		var queuedata = QueueOut_Func();
		if(queuedata != 'false') {
			CrFlag = 'false';
			if(DebugMode == 1){
				EL_Debug.Debug_Sub0.innerHTML = "簡易排他制御用 行末到達監視用変数(CrFlag) : " +CrFlag;
				EL_Debug.Debug_Sub3.innerHTML = queuedata;
			}
			
			return queuedata;
		} else {
			CrFlag = 'true';
			if(DebugMode == 1){
				EL_Debug.Debug_Main.innerHTML = "キューは空"; 
		 		EL_Debug.Debug_Sub2.innerHTML = "";
		 		EL_Debug.Debug_Sub3.innerHTML = "";
			}
			if(DebugMode == 1){ EL_Debug.Debug_Sub0.innerHTML = "簡易排他制御用 行末到達監視用変数(CrFlag) : " +CrFlag; }
			
			return 'false';
		}
	} else if(Mode == 'Disp') {
		QueueDisplay();	// キューの内容を表示
	}
}

// ******** [ Queue Function -- In ] ******** //
function QueueIn_Func(data){
	if(HeadData != ((TailData + 1) % QueueMaxsize)){
		QueueArray[TailData] = data;
		TailData = (TailData + 1) % QueueMaxsize;
	} else {
		return 'false';
	}
}

// ******** [ Queue Function -- Out ] ******** //
function QueueOut_Func(){
	var OutValue;
	if(HeadData != TailData){
		OutValue = QueueArray[HeadData];
		HeadData = (HeadData + 1) % QueueMaxsize;
		return OutValue;
	} else {
		return 'false';
	}
}

// ******** [ Queue Function -- Display ] ******** //
function QueueDisplay(){
	var DisValue;
	if(HeadData == TailData){
		if(DebugMode == 1){ EL_Debug.Debug_Sub0.innerHTML = "簡易排他制御用 行末到達監視用変数(CrFlag) : " +CrFlag; }
	} else {
		if(DebugMode == 1){
			var QueueDispTmp = "";
			for(i = HeadData; TailData != i; i = (i + 1) % QueueMaxsize){
				QueueDispTmp += i+ "番目：" + QueueArray[i] + "<br>\n";
			}
			EL_Debug.Debug_Main.innerHTML = QueueDispTmp;
		}
	}
}


//------------------------------------------------------------------//
//                     [ Queue Watch Function ]                     //
//------------------------------------------------------------------//
function QueueWatchFunc(){
	// WelcomeMess_Funcから一定間隔で監視
	// 簡易排他制御用 行末到達監視用変数が真である場合のみキューから取り出す
	
	if(CrFlag == 'true'){
		CrFlag = 'false';	// 行末到達監視用フラグを反転
		
		if(DebugMode == 1){ EL_Debug.Debug_Sub0.innerHTML = "簡易排他制御用 行末到達監視用変数(CrFlag) : " +CrFlag; }
		
		var QueueOutputData = QueueCtrlFunc('Out');	// データ取り出し
		
		// データを分割して変数に再代入
		// ConnectSysMesFileTag, InputChar, CurFileTag,  FontFileName
		if(QueueOutputData != 'false'){
			QueueOutputData      = QueueOutputData.split("<>");
			ConnectSysMesFileTag = QueueOutputData[0];
			InputChar            = QueueOutputData[1];
			CurFileTag           = QueueOutputData[2];
			FontFileName         = QueueOutputData[3];
		} else {
			// キューが空だったらタイマークリアして処理終了
			clearInterval(IntervalID);
			
			return;
		}
		
		// 出力関数に渡す
		StrImg_Write(ConnectSysMesFileTag, InputChar, CurFileTag, FontFileName);
	}
}


//-------------------------------------------------------------------//
//               [ String Image Write -- Output Function ]           //
//-------------------------------------------------------------------//
function StrImg_Write(ConnectSysMesFileTag, InputChar, CurFileTag, FontFileName){
	clearTimeout(StrImg_Write_timerID);
	
	FilePass = ImgFilePass + FontFileName + ".gif";
	
	// ******** [ InputChar -- ASCII Code Table -> Image File Table ] ******** //
	if((InputChar == '') && (StrSeq == 0)){
		// 文字列無しの場合は display:none の空白文字列で回避
		// (空白文字列だけではフォントサイズの影響を受けるため非表示にする)
		FontFileTag[StrSeq] = "<span style=\"display:none;\"></span>";
	} else {
		if(DrawingMode == 0){
			var FontFileNumber = InputChar.charCodeAt(StrSeq);
			
			var FontFileNumber_Temp   = Math.floor(FontFileNumber / 16);
			var FontFileCode_Sequence = FontFileNumber - 16*(FontFileNumber_Temp);	// 列取得
			var FontFileCode_Line     = FontFileNumber_Temp - (32/16);					// 行取得
			
			// X座標算出
			var FontFileStrX = FontFileCode_Sequence * ImgSize;
			var FontFileEndX = FontFileStrX + ImgSize;
			
			// Y座標算出
			var FontFileStrY = FontFileCode_Line * ImgSize;
			var FontFileEndY = FontFileStrY + ImgSize;
			
			// 画像位置をゼロに調整
			FontFileMyTop  = -1*FontFileStrY;
			FontFileMyLeft = -1*FontFileStrX + (ImgSize+1)*StrSeq;	// +2は画像横方向の補正量
			
			FontFileTag[StrSeq]  = "<img class=ConsoleImg src="+FilePass+" style='position:absolute;  top:"+FontFileMyTop+"; left:"+FontFileMyLeft+"; clip:rect("+FontFileStrY+" "+FontFileEndX+" "+FontFileEndY+" "+FontFileStrX+");'>";
		} else {
			FontFileTag[StrSeq] = InputChar.substr(0, StrSeq);
		}
	}
	
	// ******** [ Output -- Write Image File / Sort Image Line ] ******** //
	// ******** ソート処理 ******** //
	if(StrSeq == 0){ 
		if(LineCounter > ConsoleLineNum-1){
			// 表示位置を高さ分だけシフト
			for(i = 0; i <= ConsoleLineNum; i++){ ELMenu(WriteObjID[i]).style.posTop -= (WriteObjTop[0] - WriteObjTop[1]); }
			
			// レイヤーの昇降処理
			ELMenu(WriteObjID[SortCounter]).style.posTop = WriteObjTop[0];	// 最上位レイヤーを最下位に
			ELMenu(WriteObjID[SortCounter]).innerHTML = "";					// 配列内データを初期化
			ELMenu(WriteObjID[SortCounter]).style.visibility = "hidden";	// レイヤー非表示
			
			// 昇降用行カウンタ 一定数を越えたらカウント開始
			if(SortCounter == ConsoleLineNum){ SortCounter = 0; }
			                            else { SortCounter++; }
		}
	}
	// ******** 文字列書き出し ******** //
	if(DrawingMode == 0){
		// 現在の文字を格納 / １つ前の文字と今回の文字を連結して格納 / 文字幅は動的に変更して確保
		if(StrSeq == 0){ ConnectPass[StrLine][StrSeq] = "<span style=\"position:relative; width:" +(ImgSize+1)*(StrSeq+1)+ "; height:5;\">" + FontFileTag[StrSeq] + "</span>"; }
	              else { ConnectPass[StrLine][StrSeq] = "<span style=\"position:relative; width:" +(ImgSize+1)*(StrSeq+1)+ "; height:5;\">" + ConnectPass[StrLine][StrSeq-1] + FontFileTag[StrSeq] + "</span>"; }
	} else {
		ConnectPass[StrLine][StrSeq] = FontFileTag[StrSeq];
	}
	
	if(DebugMode == 1){ EL_Debug.Debug_Sub1.innerHTML = " 行数(StrLine) : " +StrLine+ " 列数(StrSeq) : " +StrSeq+ " 行数(LineCounter) : " +LineCounter+ "<br>昇降用行数(SortCounter) : " +SortCounter+ " 入力文字列長(InputChar.length) : " +(InputChar.length); }
	
	
	// レイヤー表示
	ELMenu(WriteObjID[StrLine]).style.visibility = "visible";
	// レイヤーデータ書き換え
	// 出力データ = システムメッセージ + 現在の行 + カーソル
	OutputStr[StrLine] = ConnectSysMesFileTag + ConnectPass[StrLine][StrSeq];
	ELMenu(WriteObjID[StrLine]).innerHTML = OutputStr[StrLine] + CurFileTag;
	
	// 1行前の CurFileTag を除去
	if(StrLine > 0) { ELMenu(WriteObjID[StrLine-1]).innerHTML = OutputStr[StrLine-1]; }
	
	// 文字列長取得
	if(DrawingMode == 0){ var InputCharImg_length = InputChar.length - 1; }
	               else { var InputCharImg_length = InputChar.length; }
	if(StrSeq < InputCharImg_length){
		// *** 行終端まで１文字ずつ進める *** //
		StrSeq++;
	} else {
		// ******** 行の終端での処理 ******** //
		// -- 廃止 --
		//  ConnectPass[StrLine][StrSeq+1] = "";	// 一応１つ先の列の配列を初期化しておく
		//  ConnectPass[StrLine][StrSeq] = tmp;		// 前行のデータを保持
		
		StrLine++; 		// 行を進める
		LineCounter++;	// 累計カウンタを進める
		
		// ******** 終了処理 ******** //
		if((StrLine % (ConsoleLineNum+1)) == 0){
			ELMenu(WriteObjID[StrLine-1]).innerHTML = OutputStr[StrLine-1];	// 末尾の CurFileTag を除去
			StrLine = 0;		// 行カウンタ（描画先）初期化
		}
		StrSeq = 0;				// 文字位置初期化
		clearTimeout(StrImg_Write_timerID);	// タイマークリア
		
		CrFlag = 'true';		// 終了フラグを立てる
		if(DebugMode == 1){ EL_Debug.Debug_Sub0.innerHTML = "簡易排他制御用 行末到達監視用変数(CrFlag) : " +CrFlag; }
		
		return;			// 処理終了
	}
	
	StrImg_Write_timerID = setTimeout("StrImg_Write('"+ConnectSysMesFileTag+"','"+InputChar+"','"+CurFileTag+"','"+FontFileName+"')",CharTypeSec);
}


//------------------------------------------------//
//               [ Debug Function ]               //
//------------------------------------------------//
function Debug_Func(Mode){
	if(Mode == 'Drawing'){
		if(DrawingMode == 0){ DrawingMode = 1; alert("描画 / アスキーモード"); }
		               else { DrawingMode = 0; alert("描画 / バイナリモード"); }
	} else if(Mode == 'Debug') {
		if(DebugMode == 0){ DebugMode = 1; alert("デバッグモード / ON"); }
		             else { DebugMode = 0; alert("デバッグモード / OFF"); }
	}
}

// -->