/*****************************************************************************
 * Musoクラス: Musoモード関連処理を行う
 *****************************************************************************/
nyan.Muso = {};

(function(){
	var guid;			// GUID
	var level;			// レベル
	var operator;			// 演算子
	var questions = new Array();	// サーバから取得した問題を入れる配列
	var answers = new Array();	// 送信前の解答を保存しておく配列
	var currentQuestion = 0;	// 現在の問題番号

	// サーバ側から問題の取得
	function sendGetQuestion(){
		var $params = "handle=" + encodeURIComponent( document.getElementById("input_handle").value || "no name" )
			+ "&level=" + encodeURIComponent( document.getElementById("input_level").value );

		nyan.sendRequest(
			'anzan_musou.php',
			_getResponse,
			'get',
			$params
		);

		// 問題取得用コールバック関数
		function _getResponse( req ){
			try{
				var j_q = eval( "(" + req.responseText + ")" );
			}
			catch( e ){
				alert( e.toString() );
			}

			// サーバから取得したデータをクラスのプロパティに代入
			var data = j_q.anzan_musou.get_question;
			guid = data.guid;
			level = data.level;
			operator = data.operator;
			for( var i=0; i<data.q.length; i++ ){
				questions.push( data.q[i] );
			}

			// 取得した問題を表示する
			displayQuestion();
		}

		function _getError( req ){
			alert( req.responseText );
		}
	}

	// サーバから取得した問題の1問目を表示する
	function displayQuestion(){
		// 無双モードの問題出力画面を表示
		nyan.changeDisplay("muso_disp");

		// 問題番号を表示する
		document.getElementById('q_num').innerHTML = '■1/30 問目';

		// 1問目の問題を入力する
		document.getElementById('p1').innerHTML = questions[0][0];
		document.getElementById('p2').innerHTML = questions[0][1];
		switch (operator){
		case 'add':
			document.getElementById('ope').innerHTML = "＋";
			break;
		case 'subtract':
			document.getElementById('ope').innerHTML = "－";
			break;
		case 'multiply':
			document.getElementById('ope').innerHTML = "×";
			break;
		case 'devide':
			document.getElementById('ope').innerHTML = "÷";
			break;
		default:
			break;
		}

		var ans = document.getElementById('ans');

		// 解答欄を空白にする
		ans.value = "";

		// 解答ボックスの背景を赤くする
		ans.style.backgroundColor = '#FCC';

		// "次の問題"ボタンを無効にする
		document.getElementById('next_button').disabled = 'true';

		ans.change = function(){
			nyan.checkAnswer(
				ans,
				document.getElementById('next_button'),
				document.getElementById('p1').innerHTML,
				document.getElementById('p2').innerHTML,
				operator
			);
		};
	}

	// "次の問題"ボタンを押したとき、次の問題を表示する
	function nextQuestion(){
		// 現在の問題番号が問題総数を越えている状態でこの関数が呼ばれたときは、falseを返す
		if( currentQuestion > questions.length ){
			document.getElementById("next_button").disabled = 'true';
			return false;
		}

		// 解答をanswer配列に保存しておく
		answers.push( document.getElementById('ans').value );

		currentQuestion++;

		// 最後の問題の解答を入力して"送信"ボタンを押すと、解答を送信する
		if( currentQuestion >= questions.length ){
			// 解答の送信
			var $params = "guid=" + encodeURIComponent( guid )
				+ "&answers=" + encodeURIComponent( answers.join() );

			nyan.sendRequest(
				'anzan_musou.php',
				_getResponse,
				'get',
				$params
			);

			// "送信"ボタンを無効にする
			document.getElementById('next_button').disabled = 'true';
			// answers配列を空にする
			while( answers.length ){
				answers.pop();
			}
			// currentQuestionを0にする
			currentQuestion = 0;

			return true;
		}

		// 最後の問題のときは、"次の問題"ボタンを"結果を送信"ボタンに変える
		if( currentQuestion >= questions.length-1 ){
			document.getElementById('next_button').value = '結果を送信';
		}

		// 問題番号を表示する
		document.getElementById('q_num').innerHTML = '■' + (currentQuestion + 1) + '/30 問目';

		document.getElementById('p1').innerHTML = questions[currentQuestion][0];
		document.getElementById('p2').innerHTML = questions[currentQuestion][1];
		switch (operator){
		case 'add':
			document.getElementById('ope').innerHTML = "＋";
			break;
		case 'subtract':
			document.getElementById('ope').innerHTML = "－";
			break;
		case 'multiply':
			document.getElementById('ope').innerHTML = "×";
			break;
		case 'devide':
			document.getElementById('ope').innerHTML = "÷";
			break;
		default:
			break;
		}

		// 解答欄を空白にする
		document.getElementById('ans').value = "";

		// "次の問題"ボタンを無効にする
		document.getElementById('next_button').disabled = 'true';

		// コールバック関数群
		function _getResponse( req ){
			// 画面切り替え
			nyan.changeDisplay( "muso_result_disp" );

			try{
				var j_a = eval( "(" + req.responseText + ")" );
			}
			catch( e ){
				alert( e.toString() );
			}

			document.getElementById('result_answer_time').innerHTML = Number(j_a.anzan_musou.answer.answer_time).toFixed(1);
			document.getElementById('result_rank').innerHTML = j_a.anzan_musou.answer.ranking;
			document.getElementById('result_class').innerHTML = j_a.anzan_musou.answer.class_level;

			// "メインメニュー"ボタンクリック時のイベントハンドラ
			document.getElementById('button_return_main_menu').onclick = function(){
				location.reload(true)
			};
		}

		function _getError( req ){
			alert( req.responseText );
		}
	}

	// 外部からアクセスできるように、Musoクラスのメソッドとローカル関数を関連付ける
	nyan.Muso.sendGetQuestion = sendGetQuestion;
	nyan.Muso.nextQuestion = nextQuestion;
})();


