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

(function(){
	var level;			// レベル
	var operator;			// 演算子
	var questions = new Array();	// サーバから取得した問題を入れる配列
	var answers = new Array();	// 送信前の解答を保存しておく配列
	var currentQuestion = 0;	// 現在の問題番号
	var startTime;			// 開始ボタンを押したときの時間
	var endTime;			// 終了ボタンを押したときの時間

	// 開始ボタンを押したときに呼ばれる関数
	function getStart(){
		startTime = new Date();

		getQuestion();
	}

	// サーバ側から問題の取得
	function getQuestion(){
		level = document.getElementById("f_input_level").value;

		var data = {};
		var p1;
		var p2;

		//   1: 二桁の足し算
		if( level == 1 ){
			p1 = Math.floor( Math.random()*88 ) + 11;
			p2 = Math.floor( Math.random()*88 ) + 11;

			data = {
				'p1':p1,
				'p2':p2,
				'operator':'add'
			};
		}
		//   2: 二桁の引き算
		else if( level == 2 ){
			p1 = Math.floor( Math.random()*88 ) + 11;
			p2 = Math.floor( Math.random()*88 ) + 11;

			if( p1 < p2 ){
				var buf = p1;
				p1 = p2;
				p2 = buf;
			}

			data = {
				'p1':p1,
				'p2':p2,
				'operator':'subtract'
			};
		}
		//   3: 三桁の足し算
		else if( level == 3 ){
			p1 = Math.floor( Math.random()*898 ) + 101;
			p2 = Math.floor( Math.random()*898 ) + 101;

			data = {
				'p1':p1,
				'p2':p2,
				'operator':'add'
			};
		}
		//   4: 三桁の引き算
		else if( level == 4 ){
			p1 = Math.floor( Math.random()*898 ) + 101;
			p2 = Math.floor( Math.random()*898 ) + 101;

			if( p1 < p2 ){
				var buf = p1;
				p1 = p2;
				p2 = buf;
			}

			data = {
				'p1':p1,
				'p2':p2,
				'operator':'subtract'
			};
		}
		//   5: 二桁×一桁の掛け算
		else if( level == 5 ){
			p1 = Math.floor( Math.random()*88 ) + 11;
			p2 = Math.floor( Math.random()*8 ) + 2;

			data = {
				'p1':p1,
				'p2':p2,
				'operator':'multiply'
			};
		}
		//   6: 三桁×一桁の掛け算
		else if( level == 6 ){
			p1 = Math.floor( Math.random()*898 ) + 101;
			p2 = Math.floor( Math.random()*8 ) + 2;

			data = {
				'p1':p1,
				'p2':p2,
				'operator':'multiply'
			};
		}
		//   7: 二桁の二乗
		else if( level == 7 ){
			p1 = Math.floor( Math.random()*88 ) + 11;
			p1 = ( ( p1 % 10 ) == 0 )? p1+1 : p1;

			data = {
				'p1':p1,
				'p2':p1,
				'operator':'multiply'
			};
		}
		//   8: 二桁×二桁の掛け算
		else if( level == 8 ){
			p1 = Math.floor( Math.random()*88 ) + 11;
			p2 = Math.floor( Math.random()*88 ) + 11;

			data = {
				'p1':p1,
				'p2':p2,
				'operator':'multiply'
			};
		}
		//   9: 三桁の二乗
		else if( level == 9 ){
			p1 = Math.floor( Math.random()*898 ) + 101;
			p1 = ( ( p1 % 100 ) == 0 )? p1+1 : p1;

			data = {
				'p1':p1,
				'p2':p1,
				'operator':'multiply'
			};
		}
		//   それ以外のときは、とりあえずレベル1
		else{
			p1 = Math.floor( Math.random()*88 ) + 11;
			p2 = Math.floor( Math.random()*88 ) + 11;

			data = {
				'p1':p1,
				'p2':p2,
				'operator':'add'
			};
		}

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

		currentQuestion++;
	}

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

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

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

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

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

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

		ans.onkeyup = function(){
			nyan.checkAnswer(
				ans,
				document.getElementById('f_next_button'),
				data.p1,
				data.p2,
				data.operator
			);
		};
	}

	function displayResult(){
		// 画面切り替え
		nyan.changeDisplay( "free_result_disp" );

		endTime = new Date();

		var ans_num = currentQuestion - 1;
		var ans_time = ( endTime.getTime() - startTime.getTime() ) / 1000;
		document.getElementById('f_answer_num').innerHTML = ans_num.toString();
		document.getElementById('f_answer_time').innerHTML = ans_time.toFixed(1).toString();
		if( ans_num == 0 ){
			document.getElementById('f_answer_avg').innerHTML = "-";
		}
		else{
			document.getElementById('f_answer_avg').innerHTML = ( ans_time / ans_num ).toFixed(1);
		}

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

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


