/*
 * かれこアナライズメインプログラム
 *
 * 見ちゃいましたねこのプログラムを・・・笑
 * Ajaxで初めて作ったプログラムなので、汚いソース＋エラー処理がほとんど出来ていない
 * そんなソースでも利用価値が有って貴方のプログラム開発の参考になればよいのですが。
 * どうぞごゆっくりとご覧下さいませ。
 * 但し、模倣と、データを要求しているURLへ不正なリクエストは行なわないで下さいね。
 * データが一番有益な情報ですので。
 */

// ことばの一覧
ListWordResult = "";
ListWordWord = "";
ListWordTitle = "";
ListWord = new Array();
ListRate = new Array();


// 連想ゲーム入口のことば
InWordResult = "";
InWordWord = "";
InWordTitle = "";
InWord = new Array();
InRate = new Array();

// 連想ゲーム出口のことば
OutWordResult = "";
OutWordWord = "";
OutWordTitle = "";
OutWord = new Array();
OutRate = new Array();

// 選択中のインデックス
SelectIndex = -1;

// ページ番号
PageNo = 1;

// 一覧表示フラグ
ListFlg = true;

// 登録されていることばの数
AllWordCount  = 0;

// バックカラー定義
ListBGColor = "#ffd0ff";
InBGColor   = "#80ffff";
OutBGColo   = "#ffff80";

// フォーカスがあるときの色
ForBGColo   = "#E8E8E8";

// 選択中の色
SelectBGColo   = "#ff0000";


// リクエストのモード
ReqMode = 0;  // 0:リスト 1:入り口のことば 2:出口のことば -1: クリヤー状態


// 一番最初の処理
function StartUp(){
	// 選択中のインデックスを初期化
	SelectIndex = -1;
	// ページ番号
	PageNo = 1;
	// 一覧を読込む
	ajaxReq("",0);
	// 入口のことば、出口のことばを初期化
	$("InList").innerHTML = "";
	// 生成する要素と属性
	var ele = document.createElement("div");
	Title = "入口のことば";
	var str = document.createTextNode(Title);	// 生成する要素の値（文字列）
	ele.appendChild(str);					// 生成する要素の作成（要素に値を追加）
	// タイトルのセグメントを灰色に
	ele.style.backgroundColor="#B0B0B0"; 
	ele.style.borderBottomWidth = "1px";
	ele.style.borderBottomStyle = "solid";
	ele.style.borderBottomColor = "black";
	ele.style.padding = "0.5em";
	$("InList").appendChild(ele);
	$("OutList").innerHTML = "";
	// 生成する要素と属性
	var ele = document.createElement("div");
	Title = "出口のことば";
	var str = document.createTextNode(Title);	// 生成する要素の値（文字列）
	ele.appendChild(str);					// 生成する要素の作成（要素に値を追加）
	// タイトルのセグメントを灰色に
	ele.style.backgroundColor="#B0B0B0"; 
	ele.style.borderBottomWidth = "1px";
	ele.style.borderBottomStyle = "solid";
	ele.style.borderBottomColor = "black";
	ele.style.padding = "0.5em";
	$("OutList").appendChild(ele);
}

// XMLファイルを読込む
function ajaxReq(word,Mode){
	var msec=(new Date()).getTime();

	switch(Mode){
		case 0:	// 一覧を求める
			var strPage = "";
			if  ( PageNo >= 1 ){
				strPage = "&page=" + PageNo;
			
			}
			// 検索キーワードを入手する
			var elms = document.getElementsByName("KeyWord");
			var KeyWord = Element.extend(elms.item(0)).value;
			if ( trim(KeyWord) != "" ){
				var url="http://krk.mixsn.com/analyze/?mode=list" + strPage + "&word=" + encodeURIComponent(KeyWord);
			} else {
				var url="http://krk.mixsn.com/analyze/?mode=list" + strPage ;
			}
			$("WordList").innerHTML = "読み込み中<br />";
			new Ajax.Request(url, {
				method:"post",
				parameters:"mode=list" +  "&cash="+msec,
				onSuccess:function(req){
						xmlRead(req,1);
					},
				onFailure:function(req){
						xmlReadError(req,1);
					}
			});
			break;
		case 1:	// 入り口のことばを求める
			var url="http://krk.mixsn.com/analyze/?mode=in&word=" + encodeURIComponent(word);
			// リクエストしたことばを保存
			InWordWord = word;
			$("InList").innerHTML = "読み込み中<br />";
			new Ajax.Request(url, {
				method:"post",
				parameters:"mode=in" +  "&cash="+msec,
				onSuccess:function(req){
						xmlRead(req,0);
					},
				onFailure:function(req){
						xmlReadError(req,0);
					}
			});
			break;
		case 2:	// 出口のことばを求める
			var url="http://krk.mixsn.com/analyze/?mode=out&word="+ encodeURIComponent(word);
			// リクエストしたことばを保存
			OutWordWord = word;
			$("OutList").innerHTML = "読み込み中<br />";
			new Ajax.Request(url, {
				method:"post",
				parameters:"mode=out" +  "&cash="+msec,
				onSuccess:function(req){
						xmlRead(req,2);
					},
				onFailure:function(req){
						xmlReadError(req,2);
					}
			});
			break;
	}
}


// 正常に読込めた時の処理
function xmlRead(httpObj,Mode){

	var xmlDoc = httpObj.responseXML;
	switch(Mode){
		case 1: // リスト要求
			$("WordList").innerHTML = "データ展開中";
			xmlListWord(xmlDoc, 1);
			$("WordList").innerHTML = "データ終了・表示処理中";
			ListWordWord = "ことば一覧";
			ListWordTitle = "ことば一覧";
			ListFlg = true;
			DispListWord($("WordList"), ListWord, ListRate,1);
			break;
		case 0: // 入口のことば要求
			$("InList").innerHTML = "データ展開中";
			xmlListWord(xmlDoc, 0);
			$("InList").innerHTML = "データ終了・表示処理中";
			InWordTitle = "＝＞" + InWordWord;
			DispListWord($("InList"), InWord, InRate,0);
			break;
		case 2: // 出口のことば要求
			$("OutList").innerHTML = "データ展開中";
			xmlListWord(xmlDoc, 2);
			$("OutList").innerHTML = "データ終了・表示処理中";
			OutWordTitle = OutWordWord + "＝＞";
			DispListWord($("OutList"), OutWord, OutRate,2);
			break;
		default: // その他
			break;
	}
}

// 正常に読込めた無かった時の処理
function xmlReadError(httpObj,Mode){
	switch(Mode){
		case 1:
			$("WordList").innerHTML = "エラーで読込めませんでした";
			break;
		case 0:
			$("InList").innerHTML = "エラーで読込めませんでした";
			break;
		case 2:
			$("OutList").innerHTML = "エラーで読込めませんでした";
			break;
	}
}

// Articleタグよりことばの一覧を返す
function xmlListWord(xmlDoc, Mode){

	// 応答ステータスを入手
	var NodeResult  = xmlDoc.getElementsByTagName( "Result" );
	try {
		var Result  = NodeResult.item( 0 ).firstChild.nodeValue;;
	} catch (e) {
		var Result  = "";
 	}

	// 総数（分母）を求める
	var NodeAllCount  = xmlDoc.getElementsByTagName( "AllAnsCount" );
	try {
		var AllCount  = NodeAllCount.item( 0 ).firstChild.nodeValue;;
	} catch (e) {
		var AllCount  = 0;
 	}
//window.alert(Mode);
	// 総数（分母）を求める
	if ( Mode == 1 ){	// 一覧要求の時
		var NodeAllWordCount  = xmlDoc.getElementsByTagName( "AllWordCount" );
		try {
			AllWordCount  = NodeAllWordCount.item( 0 ).firstChild.nodeValue;;
		} catch (e) {
			AllWordCount  = 0;
 		}
 	}

 	switch( Mode ){
 		case 1:	// 一覧
			ListWord.clear();
			ListRate.clear();
			ListWordResult = Result;
			// 選択ポジションをクリヤーする
			SelectIndex = -1;
			break;
 		case 0:	// 入り口のことば
			InWord.clear();
			InRate.clear();
			OutWordResult = Result;
			break;
 		case 2:	// 出口のことば
			OutWord.clear();
			OutRate.clear();
			OutWordResult = Result;
			break;
 	}

	// Wordのタグ一覧を入手
	var nodeWord = xmlDoc.getElementsByTagName( "Word" );
	// Countのタグ一覧を入手
	var nodeCount = xmlDoc.getElementsByTagName( "Count" );



	// Articleのループ
	for( var i = 0; i < nodeWord.length; i++ ) {
		var nodeWordi = nodeWord.item( i );
		var nodeCounti = nodeCount.item( i );
		// ことばの入手
		var word = "";
		try {
			word = nodeWordi.firstChild.nodeValue;
		} catch (e) {
			word = "";
	 	}
		// 件数の入手
		var count = 0;
		try {
			count = nodeCounti.firstChild.nodeValue;
		} catch (e) {
			count = 0;
	 	}
	 	switch( Mode ){
	 		case 1:	// 一覧
				ListWord[i] = word;
				try {
					if ( AllCount > 0 ){
						ListRate[i] = count ;
					}
				} catch (e) {
					ListRate[i] = "0";
			 	}
				break;
	 		case 0:	// 入り口のことば
				InWord[i] = word;
				try {
					if ( AllCount > 0 ){
						InRate[i] = FormatRate(Math.round(count/AllCount * 1000) / 10);
					}
				} catch (e) {
					InRate[i] = "0";
			 	}
				break;
	 		case 2:	// 出口のことば
				OutWord[i] = word;
				try {
					if ( AllCount > 0 ){
						OutRate[i] = FormatRate(Math.round(count/AllCount * 1000) / 10);
					}
				} catch (e) {
					OutRate[i] = "0";
			 	}
				break;
	 	}
	}
}


// ことばの一覧のデータを表示する
function DispListWord(VThisElem, VListWord, VListCount,Mode){

	VThisElem.innerHTML = "";
	
	// ステータスの表示を行なう。

	// 生成する要素と属性
	var ele = document.createElement("div");
	var Title = "";
	switch( Mode ){
		case 1:
			Title = "ことば一覧";
			if ( ListFlg == true ){
				Title += "(" + AllWordCount + ")";
			}
			//Title = ListWordTitle;
			break;
		case 0:
			Title = "入口のことば";
			//Title = InWordTitle;
			break;
		case 2:
			Title = "出口のことば";
			//Title = OutWordTitle;
			break;
		default:
			break;
	}


	str = document.createTextNode(Title);	// 生成する要素の値（文字列）
	ele.appendChild(str);					// 生成する要素の作成（要素に値を追加）

	//ele.appendChild(str);					// 生成する要素の作成（要素に値を追加）
	//ele.setAttribute("name", "stitle" );	
	// タイトルのセグメントを灰色に
	ele.style.backgroundColor="#B0B0B0"; 
	ele.style.borderBottomWidth = "1px";
	ele.style.borderBottomStyle = "solid";
	ele.style.borderBottomColor = "black";
	ele.style.padding = "0.5em";

	VThisElem.appendChild(ele);

	for( var i = 0; i < VListWord.length; i++ ) {
		// 生成する要素と属性
		var ele = document.createElement("div");
		var name_at = "";
		var col = "";
		var CelBGColor = "";
		switch(Mode ){
			case 0:	// IN文字
				name_at = "i" + i;
				col = "i";
				// バックカラーの設定
				CelBGColor=InBGColor; 
				break;
			case 1: // Center文字
				name_at = "c" + i;
				col = "c";
				// バックカラーの設定
				CelBGColor=ListBGColor; 
				break;
			case 2: // OUT文字
				name_at = "o" + i;
				col = "o";
				// バックカラーの設定
				CelBGColor=OutBGColo; 
				break;
		}
		
		if ( col == "c" && i == SelectIndex ){
			ele.style.backgroundColor=SelectBGColo; 
		} else {
			ele.style.backgroundColor=CelBGColor; 
		}

		// スタイルの設定
		// スタイルを設定する
		ele.style.borderBottomWidth = "1px";
		ele.style.borderBottomStyle = "solid";
		ele.style.borderBottomColor = "black";
		ele.style.padding = "0.3em";

		ele.style.width = "100%";
		ele.style.cursor = "pointer";
		
		//ele.setAttribute("name", name_at );	
		ele.setAttribute("name", "sword" );	
		// 段落の位置と行番号をアトリビュートとして保存しておく（後の処理が行ないやすいので）
		ele.setAttribute("col", col );	
		ele.setAttribute("pos", i );	

		ele.setAttribute("id", name_at );	

		var str = document.createTextNode(VListWord[i]);	// 生成する要素の値（文字列）
		ele.appendChild(str);					// 生成する要素の作成（要素に値を追加）

		// 件数・比率のデータを生成し追加する
		var dispstr = "";
		if( Mode  == 1 ){
			if ( ListFlg == true ){
				dispstr += "(" + VListCount[i] + ")";
			} else {
				dispstr += "(" + VListCount[i] + "%)";
			}
		} else {
			dispstr += "(" + VListCount[i] + "%)";
		}

		var NodeSpan = document.createElement("span");
		var StrSpan = document.createTextNode(dispstr);	// 生成する要素の値（文字列）
		NodeSpan.appendChild(StrSpan);					// 生成する要素の作成（要素に値を追加）
		NodeSpan.style.fontSize ="80%";
		NodeSpan.style.color ="#ff6600";


		ele.appendChild(NodeSpan);					// 生成する要素の作成（要素に値を追加）


		// イベントをセットする
		ele.onclick = function () { ajaxReqWord(this); }; 
		ele.onmouseover = function () { MouseOver(this); }; 
		ele.onmouseout  = function () { MouseOut(this); }; 
		VThisElem.appendChild(ele);
	}
	// 前頁・次頁・一覧表示ボタンの表示を行なう。
	if ( Mode === 1 ){
		var DivMenu = $("BtnArea");
		DivMenu.innerHTML = "";
		// 生成する要素と属性
		if ( ListFlg == true ){
			// 選択していない時には、ページ番号を元に、前頁・次ページのボタンを表示する。
			// 前頁のボタン表示
			var btn = document.createElement("input");
			btn.setAttribute("type", "button" );	
			btn.setAttribute("value", "前頁" );	
			btn.onclick = function () { PrevList();  };
			DivMenu.appendChild(btn);
			// 次頁のボタン表示
			// 生成する要素と属性
			var btn = document.createElement("input");
			btn.setAttribute("type", "button" );	
			btn.setAttribute("value", "次頁" );	
			btn.onclick = function () { NextList(); };
			DivMenu.appendChild(btn);
		}
		//ele.style.borderBottomWidth = "1px";
		//ele.style.borderBottomStyle = "solid";
		//ele.style.borderBottomColor = "black";
		//DivMenu.innerHTML.appendChild(ele);;
	}

}

// 次ページをクリックした
function NextList(){
	PageNo ++;
	// 一覧を読込む
	ajaxReq("",0);
}

// 前頁をクリックした
function PrevList(){
	if ( PageNo > 1 ){
		PageNo --;
		// 一覧を読込む
		ajaxReq("",0);
	}
}

// ことばより入り口、出口を求める
function ajaxReqWord(th){
	var Word = th.firstChild.nodeValue;;

	var Col  = th.getAttribute("col");
	var Posi  = th.getAttribute("pos");

	switch(Col){
		case "i":	// IN側の文字をクリックした
			// 表示を移動する
			MoveNode(0);
			break;
		case "o":	// OUT側の文字をクリックした
			// 表示を移動する
			MoveNode(2);
			break;
	}

	if ( Col == "c" && SelectIndex == Posi ){
	} else {
		// 選択中のインデックスを保持する。
		SelectIndex = Posi;
		// 再表示する（色を変更する為に）
		DispListWord($("WordList"), ListWord, ListRate,1);

		Word = ListWord[SelectIndex];
		// 入り口の文字をリクエストする
		ajaxReq(Word,1);
		// 出口の文字をリクエストする
		ajaxReq(Word,2);
	}
}

// マウスが入って来た
function MouseOver(th){
	// スタイルシートの色を変える

	// 選択中のものは変更しない
	var Col  = th.getAttribute("col");
	var Posi  = th.getAttribute("pos");
	if ( Col == "c" && SelectIndex == Posi ){
	} else {
		th.style.backgroundColor= ForBGColo; 
	}
}
// マウスが出て行った
function MouseOut(th){
	// スタイルシートの色を変える

	// 選択中のものは変更しない
	var Col  = th.getAttribute("col");
	var Posi  = th.getAttribute("pos");
	if ( Col == "c" && SelectIndex == Posi ){
	} else {
		switch(Col){
			case "i": th.style.backgroundColor=InBGColor   ; break;
			case "c": th.style.backgroundColor=ListBGColor ; break;
			case "o": th.style.backgroundColor=OutBGColo   ; break;
		}
	}
}
// ノードの内容を移動させる
function MoveNode(Mode){
	switch( Mode ){
		case 0:	// InをCenterに
			ListWord.clear();
			ListRate.clear();
			for ( var i = 0 ; i < InWord.length ; i ++){
				ListWord[i] = InWord[i];
				ListRate[i] = InRate[i];
			}
			// エレメントの作成
			ListWordWord = InWordWord;
			ListWordTitle = InWordTitle;
			DispListWord($("WordList"), ListWord, ListRate,1);
			// Inlistのクリヤー
			$("InList").innerHTML =  "";
			ListFlg = false;
			break;
		case 2:	// OutをCenterに
			ListWord.clear();
			ListRate.clear();
			for ( var i = 0 ; i < OutWord.length ; i ++){
				ListWord[i] = OutWord[i];
				ListRate[i] = OutRate[i];
			}
			// エレメントの作成
			ListWordWord = OutWordWord;
			ListWordTitle = OutWordTitle;
			DispListWord($("WordList"), ListWord, ListRate,1);
			// Inlistのクリヤー
			$("OutList").innerHTML =  "";
			ListFlg = false;
			break;
	}
}

// 数値のフォーマット関数が分からなかったので、小数点以下を固定で表示する
// フォーマット関数の自作(汎用化は考えていないバージョン)
function FormatRate(Moto){
	var Seisu = Math.floor(Moto);
	var decsu = Math.floor((Moto - Math.floor(Moto)) * 10);
	var ResultStr = "";
	if ( Seisu != 0 ){
		ResultStr = Seisu;
	} else {
		ResultStr = "0";
	}
	ResultStr += ".";
	if ( decsu != 0 ){
		ResultStr += decsu;
	} else {
		ResultStr += "0";
	}
	return (ResultStr);
}

function trim(argValue){

    return String(argValue).replace(/^[ 　]*/gim, "").replace(/[ 　]*$/gim, "");

}

