//================================================================
// 棒読みちゃんでおつのが悲鳴を上げる事案が発声
// 略称 ぼつのひめ
// 
// プログラム概要
// 式姫の庭のチャットを棒読みちゃんに読み上げさせるアプリです。
// 
// 実行環境
// IE専用 IE6以上
// BASP21のインストールが必要
// 棒読みちゃん Ver0.1.8.3以降
// 式姫の庭をフレームなしでの起動が必要
// 
//================================================================
// 
// HISTORY
// 2014.7.27 MSX.X68 作成 version 0.10 暫定公開
// 2014.7.29 ちらつき対策 write前にBODYの背景属性に最初から画像を指定
//           動作速度改善 チャット取得はIEのBUSY状態解除を待つように
// 
//================================================================

var VERSION = "0.11";
//----------------------------
// HTML取得操作用定数
//----------------------------
var str_URL = new Array(
		"ce76839ba28a43fbba873070856f433a.app.os.nicoapp.jp", //niconico
		"s1.shikihime-garden.com/game" //mixi (本家も同じはず)
	);
var str_chat_id = "chat_all"; //HTML中のチャット一覧を表示しているHTML要素

var POLLING_INTERVAL = 5000; //チャット取得間隔(単位 ミリ秒)
var TALK_INTERVAL = 500; //読み上げ中の棒読みちゃんの状態取得間隔(単位 ミリ秒)
var IE_BUSY_INTERVAL = 500; //IEの状態取得間隔(単位 ミリ秒)
var CHAT_MAX_LINE = 10; //何行取得するか？


//----------------------------
// 棒読みちゃん操作用定数
//----------------------------
var sHostName = "localhost";	//棒読みちゃんが実行されているマシン
var iPort = 50001;				//棒読みちゃんの接続ポート
var lengthData = {
	"byte"	:1,
	"short"	:2,
	"int"	:4
	};

//----------------------------
// 棒読みちゃん操作用変数
//----------------------------
var	iCommand = 0x0001;	//	short コマンド(0x0001)
var	iSpeed   = -1;		//	short 速度(-1：デフォルト, 50〜300)
var	iTone    = -1;		//	short 音程(-1：デフォルト, 50〜200)
var	iVolume  = -1;		//	short 音量(-1：デフォルト,  0〜100)
var	iVoice   = 0;	//	short 声質( 0：デフォルト,  1〜8:AquesTalk, 2001〜:AquesTalk2, 10001〜:SAPI5)
						//	1:女性1、2:女性2、3:男性1、4:男性2、5:中性、6:ロボット、7:機械1、8:機械2
						//	2001〜:AquesTalk2、10001〜:SAPI5）
var	bCode    = 0;		//	byte  文字列の文字コード(0:UTF-8, 1:Unicode, 2:Shift-JIS)

var OBJ_FSO = WScript.CreateObject("Scripting.FileSystemObject"); //ファイルストリーム
var OBJ_SHELLAPP = WScript.CreateObject("Shell.Application").Windows(); //シェルプログラム一覧


//----------------------------
// ウグイス操作用変数
//----------------------------
var settingUguis = {
	"isUguis":true,					//ウグイス連動を行う場合 true
	"pathUguis":"uguis",			//ウグイスフォルダ
	"strUguisName":"sample1",		//ウグイスの指定
	"objUguisIE":null,				//ウグイスを表示しているIEオブジェクト
	"silent":null,					//何もしていないときの画像
	"speak":null,					//発言中の画像
	"guild":null,					//同盟通知
	"system":null,					//システム通知
	"keyword":null,					//キーワードリスト
	"max_keyword":50				//キーワード最大設定件数
}


//----------------------------
// メイン処理
//----------------------------

var objGameIE = null; //ゲーム画面を表示しているIEオブジェクト
var objChat = null; //ゲーム画面中のチャット一覧を表示しているHTML要素

// 起動中シェルをすべて取得
for( var i=0 ; i < OBJ_SHELLAPP.Count ; i++ ) {

	var OBJ = OBJ_SHELLAPP.item(i);
	if(OBJ == null) {
		// シェル一覧の途中が抜けている場合はスキップ
		continue;
	}
	// 実行ファイル名からIEを探す
	STR_ProgramName = OBJ_FSO.GetFileName(OBJ.FullName);
	if( STR_ProgramName.toLowerCase() == "iexplore.exe" ) {
		// IEが見つかったら式姫の庭のURLを探す
		var isDitect = false;
		for(var j=0;j<str_URL.length;j++) {
			if( OBJ.LocationURL.indexOf( str_URL[j] ) >= 0) {
				isDitect = true;
				break;
			}
		}
		if(isDitect==true) {
			var element_chat = null; //チャット全体を表示しているHTML要素

			// 式姫の庭のURLが見つかったらチャットを表示しているHTML要素を探す
			element_chat = OBJ.document.getElementById(str_chat_id);
			if(element_chat != null) {
				// 目的のHTML要素が見つかった
				objGameIE = OBJ;
				objChat = element_chat;
				break;
			} else {
				// 目的のHTML要素が見つからない
				WScript.Echo( "HTMLの中にID="+str_chat_id+"のHTML要素が見つかりませんでした。" );
				WScript.Quit(1);
			}
		}
	}
}

// 目的のHTMLを取得できたかチェック
if( (objGameIE == null) || (objChat == null)) {
	WScript.Echo( "式姫の庭の画面が見つかりませんでした");
	WScript.Quit(1);
}

//----------------------------
// ウグイス用IE表示
//----------------------------
if(settingUguis["isUguis"]) {
	settingUguis["objUguisIE"] = bootUguisIE(settingUguis);
}

//----------------------------
// チャット取得処理開始
//----------------------------
loop_get_chat(objChat,objGameIE,settingUguis);


WScript.Quit(1);










//================================================================
//================================================================
//
// チャット操作関数
//
//================================================================
//================================================================

//================================================================
//	チャット取得ループ
//================================================================
function loop_get_chat(element_chat,obj_ie,settingUguis) {
	
	var newest_chat = new Array(CHAT_MAX_LINE); //最新のチャットリスト
	var old_chat = new Array(CHAT_MAX_LINE); //前回のチャットリスト
	var start = 0; //newest_chatの何番目からが新しいチャットか
	var isSilent = true; //更新がなかった場合true。ウグイスのちらつき防止用
	var i=0;

	var iPassTime = 0; //ポーリング後の経過時間
	var interval = 0; //次のポーリングまでのスリープ時間

	//起動直後は更新なしにするため、ループ開始前に取得しておく
	newest_chat = get_newest_chat( element_chat , CHAT_MAX_LINE );

	while(1) {
		//IE busyの間待機する。動作速度改善策
		if(obj_ie != null) {
			waitIE(obj_ie);
		}

		// 最新の内容を前回の内容にコピー
		old_chat = newest_chat.concat();
		try {
			//最新チャットを取得
			newest_chat = get_newest_chat( element_chat , CHAT_MAX_LINE );
		} catch(e) {
			WScript.echo("例外が発生しました。\n"+
							//e+"\n"+
							"error number = "+(e.number & 0xFFFF)+"\n"+
							"error name ="+e.name+"\n"+
							"error message ="+e.message+"\n"+
							"ぼつのひめを終了します。");
		}

		//newest_chatの何番目から表示するかを得る
		start = diff_chat( newest_chat , old_chat );

		iPassTime = 0;
		if( start >= 0 ) {
			//新しい発言がある
			isSilent = false;
			for(i=start;i<newest_chat.length;i++) {
				//WScript.Echo(newest_chat[i]["content"]); //ここを有効にすると(cscriptで実行した場合)毎行画面に出力する
				//ウグイス描画
				if(settingUguis["isUguis"]) {
					//画像取得
					var image = "";
					image = getImageByKeyword(settingUguis,newest_chat[i]["content"]);
					//画像書き換え
					bg_change(settingUguis,newest_chat[i]["content"],image);
				}
				//棒読みちゃんに読み上げ要求
				BouyomiTalk(newest_chat[i]["content"],iCommand,iSpeed,iTone,iVolume,iVoice,bCode);
				//無音状態まで待機(音声再生中の間はループ)
				do {
					WScript.sleep(TALK_INTERVAL);
					iPassTime += TALK_INTERVAL;
				} while (BouyomiGetNowPlaying()=="01");
			}
		} else {
			//更新なし
			if(settingUguis["isUguis"] && isSilent==false) {
				//前回更新があった場合のみ静止状態に戻す ちらつき防止
				bg_change(settingUguis,"",settingUguis["silent"]);
			}
			isSilent = true;
		}

		//次のポーリング時間まで待機
		interval = POLLING_INTERVAL-iPassTime
		if(interval < 0) {
			//読み上げ中にポーリング間隔を過ぎていたら待機しない
			interval=0;
		}
		WScript.sleep(interval);
	}
}



//================================================================
//	最新のチャットを max_line 行取得する
//================================================================
function get_newest_chat(element_chat , max_line) {

	//var str_chat = "";
	var start = 0;
	var retArray = new Array(max_line); //返却用
	var line = 0; //返却用配列の行数カウント用

	// チャットは<ul>のリストで作られていて、個々の行は<li>要素
	var elements_li = element_chat.getElementsByTagName("li");
	//WScript.Echo(element_chat,elements_li,elements_li.length,elements_li.count);

	// HTMLで持っている発言の何番目から取得するか
	// 最も古いのが 0 。
	if(elements_li.length-max_line > 0) {
		//取得件数より多くの発言があるなら現在の件数-取得件数
		start = elements_li.length-max_line;
	} else {
		//取得件数未満なら最も古いのから取得
		start = 0;
	}

	//チャットを取得する
	for(var i=start;i<elements_li.length;i++) {
		var str_time="";
		var str_name_root="";
		var str_name="";
		var str_content="";
		var set_chat = "";

		//時刻
		str_time = elements_li[i].getElementsByTagName("span")[0].innerHTML;
		//名前
		str_name_root = elements_li[i].getElementsByTagName("span")[1].getElementsByTagName("a");
		//システムメッセージは名前を持たない。
		//<a>タグは記載されているがDOMは何も返さないため事前にチェックする
		if(str_name_root.length == 0) {
			//WScript.Echo("<a>タグ要素がありません")
			str_name = "<system>";
		} else {
			str_name = str_name_root[0].innerHTML;
		}

		//内容
		str_content = elements_li[i].getElementsByTagName("p")[0].innerHTML;
		//str_chat = str_time + "  " + str_name+str_content; //時刻＋名前＋発言内容
		//str_chat = str_content; //発言内容のみ
		//WScript.Echo(i+" "+str_chat);
		set_chat = {"time":str_time,
					"name":str_name,
					"content":str_content};
		retArray[line] = set_chat;
		line++;
	}

	return retArray;

}

//================================================================
//	最新のチャットと前回のチャットを比較し、更新分となる
//	最新のチャットのインデックスを返す
//	更新がない場合は-1を返す。
//================================================================
function diff_chat( newest_chat , old_chat) {
	var i=0;
	var str_last = old_chat[old_chat.length-1]["content"]; //前回の最後の発言内容
	var str_last_name = old_chat[old_chat.length-1]["name"]; //前回の最後の発言者
	var str_last_time = old_chat[old_chat.length-1]["time"]; //前回の最後の発言時刻
	var ret_index = 0;
	var is_hit = false; //前回の最後の発言が最新チャットに含まれていればtrue

	//WScript.Echo("最後の発言は",str_last)

	//最新のチャットの古い順に検索する。
	//名前と時刻も検証しないと、「おめー」等の同じ発言が連続で繰り返された場合に
	//正常に更新分を取得できない
	for(i=0;i<newest_chat.length;i++) {
		if( (str_last == newest_chat[i]["content"]) &&
			(str_last_name == newest_chat[i]["name"]) &&
			(str_last_time == newest_chat[i]["time"]) ) {
			ret_index = i+1;
			is_hit = true;
			//WScript.Echo(ret_index+"番目にヒット。"+(ret_index+1)+"番目からが更新分");
			break;
		}
	}

	//最新チャットの最後の発言と一致しているなら更新なし
	if(ret_index == newest_chat.length) {
		ret_index = -1;
	}
	//ヒットしていないなら最新チャットの内容は全て更新された内容とし
	//newest_chat[0]から最後まで全てが更新分である
	if(is_hit == false) {
		ret_index = 0;
	}
	
	return ret_index;

}




//================================================================
//================================================================
//
// 棒読みちゃん操作関数
//
//================================================================
//================================================================


//================================================================
//	棒読みちゃんに読み上げ要求
//================================================================
function BouyomiTalk(sMessage,iCommand,iSpeed,iTone,iVolume,iVoice,bCode) {

	// ソケット通信のためのBASP21ソケットオブジェクト生成
	var bsocket = WScript.CreateObject("basp21.socket");

	var i = 0;
	var rc1 = 0; //戻り値用
	var byteStreamData = "";

	//入力値チェック
	//★★★未実装★★★

	// 棒読みちゃんに接続
	rc1 = bsocket.Connect(sHostName, iPort, 10)
	if (rc1 != 0 ) {
		WScript.echo("棒読みちゃんとの接続に失敗しました\nbsocket戻り値="+rc1);
		WScript.Quit();
	}

	byteStreamData	+= toByte(iCommand,lengthData["short"]);
	byteStreamData	+= toByte(iSpeed  ,lengthData["short"]);
	byteStreamData	+= toByte(iTone   ,lengthData["short"]);
	byteStreamData	+= toByte(iVolume ,lengthData["short"]);
	byteStreamData	+= toByte(iVoice  ,lengthData["short"]);
	byteStreamData	+= toByte(bCode   ,lengthData["byte"]);
	byteStreamData	+= toByte(getLength(sMessage),lengthData["int"]);

	var strReq=""; //送信文字列
	//バイト列を16進数の文字列に変換
	for(i=0;i<byteStreamData.length;i++){
		strReq+=("00"+byteStreamData.charCodeAt(i).toString(16)).slice(-2);
	}

	//棒読みちゃんに送信
	rc1 = bsocket.writeHex(strReq);
	if (rc1 != 0 ) {
		WScript.echo("棒読みちゃんとへの読み上げコマンド送信(コマンド部)に失敗しました\n"+"送信文字列="+strReq+"\nbsocket戻り値="+rc1);
		WScript.Quit(-1);
	}
	rc1 = bsocket.writeHex(URItoHex(encodeURIComponent(sMessage)));
	if (rc1 != 0 ) {
		WScript.echo("棒読みちゃんへの読み上げコマンド送信(読み上げメッセージ本文)に失敗しました\nbsocket戻り値="+rc1);
		WScript.Quit(-1);
	}
	bsocket.close();
}

//================================================================
//	状態を取得する
//	取得した状態は16進数文字列で返す
//================================================================
function BouyomiGetNowPlaying() {

	// ソケット通信のためのBASP21ソケットオブジェクト生成
	var bsocket = WScript.CreateObject("basp21.socket");
	var i=0,loop=0;
	var data = ""; //取得した状態 (00:無音状態中, 01:音声再生中)

	// 棒読みちゃんに接続
	rc1 = bsocket.Connect(sHostName, iPort, 10)
	if (rc1 != 0 ) {
		WScript.echo("棒読みちゃんとの接続に失敗しました\nbsocket戻り値="+rc1);
		WScript.Quit();
	}

	// 状態取得コマンド送信
	var byteStreamData = "";
	byteStreamData	+= toByte(0x0120,lengthData["short"]);

	var strReq=""; //送信文字列
	for(i=0;i<byteStreamData.length;i++){
		strReq+=("00"+byteStreamData.charCodeAt(i).toString(16)).slice(-2);
	}
	rc1 = bsocket.writeHex(strReq);
	if (rc1 != 0 ) {
		WScript.echo("棒読みちゃんへの状態取得コマンド送信に失敗しました\n"+"送信文字列"+strReq+"\nbsocket戻り値="+rc1);
		WScript.Quit();
	}

	data = bsocket.Read2(2);
	bsocket.close();

	return data;
}


//================================================================
//	iData(任意の数値) を iLengthバイトにした数値の配列で返す
//	リトルエンディアン形式
//	例 268,4(32bit数値) → 0x0000010C → 戻る配列の中身は 13,1,0,0
//================================================================
function toByte(iData,iLength) {
	var ret = "";	//戻り値
	var a=0;
	var base=0;		//基数
	var retArray = new Array(); //変換結果の各桁を格納する

	//上位桁を計算
	for(var i = iLength ; i>1;i-- ) {
		base = Math.pow(0x100,i-1);
		a=Math.floor(iData/base);
		retArray[i-1] = a;
		//WScript.echo("iData="+iData,"base="+base,"a="+a);
		iData -= a*base;
	}
	//最後に残った余りを追加
	retArray[0] = iData;

	//数値を文字列に変換
	for(var i=0;i<iLength;i++) {
		if(retArray[i] < 0) {
			//負数は2の補数にする
			ret += String.fromCharCode(0x100+retArray[i]);
		} else {
			//正の数はそのまま
			ret += String.fromCharCode(retArray[i]);
		}
	//WScript.echo("i="+i,retArray[i]);
	}
	return ret;

}

//================================================================
//	文字コードに関係なく文字列のバイト長を求める
//================================================================
function getLength(iString) {
	var ue = "";	// URIエンコード後の文字列
	var per=0;

	ue=encodeURIComponent(iString);
	per=ue.match(/%/g);	// 変換後の全部の%を配列に入れる
	// %xxの３文字で１バイトなのでperの数×2を引いたのが
	// 文字列のバイト数
	if(per!=null) {
		len=(ue.length)-per.length*2;
	} else {
		len=ue.length
	}
	return len;
}


//================================================================
//	URIエンコードされた文字列を16進数の文字列に変換する
//		変換ルール
//		%xx → xx をそのまま渡す
//		上記以外 → 文字コードを先頭0埋めした2文字の16進数にする
//================================================================
function URItoHex(iString) {

	var strRet = "";
	var len = iString.length;

	for(var i=0;i<len;i++) {
		if( iString.charAt(i) != "%" ) {
			// %以外の文字だったら文字コードを16進数にする
			strRet += ("00"+iString.charCodeAt(i).toString(16)).slice(-2);
		} else {
			// %がきたら続く2文字をそのまま渡す
			strRet += iString.charAt(i+1);
			strRet += iString.charAt(i+2);
			i += 2;
		}
	}

	return strRet;
}


//================================================================
//================================================================
//
// ウグイス操作関数
//
//================================================================
//================================================================

//=====================================================
//特定発言に対応した画像ファイルを返す
//=====================================================
function getImageByKeyword(settingUguis,strChat) {
	var i=0;
	for(i=0;i<settingUguis["keyword"].length;i++) {
		//発言の中にキーワードがあるか調べる
		if(strChat.indexOf( settingUguis["keyword"][i]["key"] ) >= 0) {
			//ヒットしたらその発言用の画像を返す
			return settingUguis["keyword"][i]["image"];
		}
	}

	// 通常の発言用画像
	return settingUguis["speak"];
}

//=====================================================
// IE起動 および ウグイス初期設定
//=====================================================
function bootUguisIE(settingUguis) {

	var strURL;

	//ウグイス設定を読み込む
	setUguis(settingUguis);

	//ウグイス表示IEを起動する
	var objIE = WScript.CreateObject("InternetExplorer.Application","UGUIS_");
	settingUguis["objUguisIE"]=objIE;

	strURL = "about:blank";
	objIE.Navigate(strURL);

	objIE.Visible = true; //見えないと確認できないのでここだけは Trueにします。
	//objIE.Top = 100;
	//objIE.Left = 100;
	objIE.Width = 250; //250以下は250になる
	objIE.Height = 220;
	objIE.AddressBar = false;	//アドレスバー
	objIE.MenuBar = false;		//メニューバー
	objIE.ToolBar = false;		//ツールバー
	objIE.StatusBar = false;	//ステータスバー

	//操作可能になるまで待つ
	waitIE(objIE);
	//初期画面
	bg_change(settingUguis,
				"<b style=\"font-size:larger;color:fuchsia\">棒</b>読みちゃんで<br>お<b style=\"font-size:larger;color:fuchsia\">つの</b>が<br><b style=\"font-size:larger;color:fuchsia\">悲鳴</b>を上げる事案が発声",
				settingUguis["silent"]);

	return objIE;

}

//=====================================================
// IEがビジー状態の間待つ
//=====================================================
function waitIE(ie) {
	do {
		WScript.Sleep(IE_BUSY_INTERVAL);
	} while((ie.Busy == true) || (ie.readystate != 4))
	WScript.Sleep(IE_BUSY_INTERVAL);
}

//=====================================================
// IEの背景画像を書き換える
//=====================================================
function bg_change(settingUguis,strMessage,pathImage) {

	var objWshShell = new ActiveXObject("WScript.Shell");
	var strCurrentDir = objWshShell.CurrentDirectory;
	var strURLprefix=strCurrentDir+"\\"+settingUguis["pathUguis"]+"\\"+settingUguis["strUguisName"]+"\\";

	//画像描画 BODYの背景として表示
	var strHtmlHeader="<HTML><HEAD><TITLE>ぼつのひめ "+VERSION+"</TITLE></HEAD><BODY background=\""+strURLprefix+pathImage+"\" style=\"text-shadow: 1px 1px white,0px 1px white\">";
	var strHtmlFooter="</BODY></HTML>";

	var objIE = settingUguis["objUguisIE"];

	//サニタイズ
	//★★未実装★★
	//strMessage = sanitize(strMessage);

	//チャット内容を表示
	objIE.document.open();
	objIE.document.clear();
	if(strMessage!=null) {
		objIE.document.write(strHtmlHeader+strMessage+strHtmlFooter);
	}
	objIE.document.close();
}

//=====================================================
//ウグイスIE終了コールバック
//=====================================================
function UGUIS_OnQuit() {
	//ウグイス表示が閉じられたら終了とみなす
	BouyomiTalk("ぼつのひめを終了します",iCommand,iSpeed,iTone,iVolume,iVoice,bCode);
	//WScript.echo("ウグイス終了を確認。\nぼつの姫を終了します");
	WScript.quit();
}


//=====================================================
//ウグイス設定読込
//=====================================================
function setUguis(settingUguis) {

	//  オープンモード
	var FORREADING      = 1;    // 読み取り専用
	var FORWRITING      = 2;    // 書き込み専用
	var FORAPPENDING    = 8;    // 追加書き込み

	//  開くファイルの形式
	var TRISTATE_TRUE       = -1;   // Unicode
	var TRISTATE_FALSE      =  0;   // ASCII
	var TRISTATE_USEDEFAULT = -2;   // システムデフォルト

	var line_num = 0; //読み込んだファイルの行数
	var keyword = null;
	var keyword_count = 0;

	var fs = WScript.CreateObject( "Scripting.FileSystemObject" );

	var date = new Date();
	if((date.getSeconds() % 12 ) == 0) {
		if(fs.FileExists(settingUguis["pathUguis"]+"\\"+settingUguis["strUguisName"]+"_rare\\"+"uguis.txt") == true) {
			settingUguis["strUguisName"] = settingUguis["strUguisName"]+"_rare";
		}
	}

	var file_path = settingUguis["pathUguis"]+"\\"+settingUguis["strUguisName"]+"\\"+"uguis.txt"

	// ファイルの存在チェック
	if( false == fs.FileExists(file_path) ) {
		WScript.Echo("ウグイス設定ファイル\n"+file_path+" が\n見つかりません");
	}

	// ファイルを読み取り専用で開く
	file = fs.OpenTextFile( file_path , FORREADING, false, TRISTATE_FALSE );

	//  ファイルの文字データを一行ずつ読み込む
	settingUguis["keyword"] = new Array();
	while( !file.AtEndOfStream )
	{
		var line;		// ファイルから読み込んで , で分割した文字列の配列

		var strKeyword;	// キーワード(1項目目)
		var strValue;	// 設定値(2項目目)
		var iSpeed;		// 再生スピード
		var iTone;		// 音程
		var iVolume;	// 音量
		var iVoice;		// 声質

		line_num++;

		// 1行取り出して , で分割した配列にする
		line = file.ReadLine().split(",");

		// 先頭が#だったらコメント行扱いにして次の行へ
		// 空行でも次の行へ
		if( line[0].substr(0,1) == "#" || line[0].length == 0) {
			continue;
		}

		// 項目が3項目未満ならエラー
		if( line.length < 2 ) {
			WScript.Echo("ウグイス設定ファイルの "+line_num+"行目の項目数が足りません");
			WScript.quit(-1);
		}

		// 項目を変数に設定＆前後の空白のトリミングする
		strKeyword  = line[0].replace( /(^\s+|\s+$)/g , "" );
		strValue    = line[1].replace( /(^\s+|\s+$)/g , "" );

		switch(strKeyword) {
			//基本設定
			case "silent":
				settingUguis["silent"]=strValue;
				break;
			case "speak":
				settingUguis["speak"]=strValue;
				break;
			case "guild":
				settingUguis["guild"]=strValue;
				break;
			case "system":
				settingUguis["system"]=strValue;
				break;
			//特定発言
			default:
				if(keyword_count >= settingUguis["max_keyword"]) {
					WScript.echo("登録できる特定発言は最大"+settingUguis["max_keyword"]+"件です。");
					WScript.quit(-1);
				}
				keyword={"key":strKeyword,"image":strValue};
				settingUguis["keyword"].push(keyword);
				keyword_count++;
		}
	}

	/*
	var allsetting = "";
	for(var i=0;i<settingUguis["keyword"].length;i++) {
		allsetting += settingUguis["keyword"][i]["key"]+":"+settingUguis["keyword"][i]["image"]+"\n";
	}
	WScript.echo(allsetting);
	*/

	// ファイルを閉じる
	file.Close();
}


