var answerData; // 回答履歴
var answerWord; // 回答した言葉(候補から除外する用)
var hintWord; // ヒントに出した言葉(候補から除外する用)
var wordData; // 取得データ
var doneData; // 回答済みデータ
var hintNo = 0;
var isDebug = false;
if (window.location.search.substr(1, 5) == 'debug') {
	isDebug = true;
}

window.onload = function () {
	init();
}

// 初期化
function init() {
	historyClear();
}

function historyClear() {
	answerData = new Array();
	answerWord = new Array();
	hintWord = new Array();
	wordData = new Array();
	doneDate = new Array();
	$('history').innerHTML = '';
	Element.hide('history');
}

// メッセージ出力
function setMessage(message) {
	Element.show('message');
	$('message').innerHTML = (""+message).escapeHTML();
}

// メッセージクリア
function clearMessage() {
	$('message').innerHTML = "";
	Element.hide('message');
}

// ヒント送信
function sendHint() {
	if ($F('hint') == '') {
		return;
	}
	setMessage('考え中...');
	
	var url = 'get_word.cgi';
	var param = 'key=' + encodeURI($F('hint'));
	hintNo++;
	param += '&no=' + hintNo;
	var request = new Ajax.Request(
		url,
		{
			method: 'post',
			parameters: param,
			onSuccess: showAnswer,
			onFailure: function(req, json) {
				setMessage(
					'エラーが発生しました sts('
					+ request.transport.status
					+ ')'
				);
			}
		}
	);
}

function showAnswer(res) {
	var data;
	try {
		eval("data =" + res.responseText);
	} catch (e) {
		setMessage('エラーが発生しました');
		debugPrint(res.responseText);
		return false;
	}
	debugPrint(data.no);
	if (data.no != hintNo) {
		debugPrint('古いリクエストに対するレスポンスです');
		return false;
	}
	clearMessage();
	
	addWordData(data);
	$('history').innerHTML = getAnswerHtml(data);
	Element.show('history');
	$('hint').value = '';
	Field.focus('hint');
}

function addWordData(data) {
	data.words.each(function(item) {
		var point = 1;
		if (reduceWord[item.text]) {
			point = 0.9;
		}
		if (wordData[item.text] > 0) {
			wordData[item.text] = wordData[item.text] - 0 + point;
		} else {
			wordData[item.text] = point;
		}
	});
}

function getAnswerData() {
	var count = 0;
	var answer = '';
	
	$H(wordData).each(function(value) {
		var word = value[0];
		//debugPrint(word + ':' + value[1]);
		if (value[1] > count) {
			var isExcept = false;
			if (ngWord[word]) {
				isExcept = true;
			} else if (answerWord[word]) {
				// 答えに使った言葉は対象外
				isExcept = true;
			} else if (word.indexOf("::") != -1) {
				// "::"が含まれる言葉は対象外(kizaiが返してくることがある)
				isExcept = true;
			} else {
				hintWord.each(function(item) {
					// ヒントで使った言葉が入っている物は対象外
					if (word.indexOf(item) > -1) {
						isExcept = true;
						return;
					}
					// ヒントで使った言葉の一部になっている物は対象外
					if (item.indexOf(word) > -1) {
						isExcept = true;
						return;
					}
				});
			}
			if (! isExcept) {
				answer = word;
				count = value[1];
			} else {
				debugPrint('[' + word + ']は除外対象です');
			}
		}
	});
	
	return answer;
}

function getAnswerHtml(data) {
	hintWord.push(data.key); // ヒントに使った物は回答候補から除外
	var answer = getAnswerData();
	if (answer == '') {
		answer = '？'; // そんなヒントじゃわからない
	} else {
		answerWord[answer] = true; // 一度回答した物は回答候補から除外
	}
	answerData.push(new Array(data.key, answer));
	
	var html = '';
	html += '<table class="answer">'
	var no = 1;
	answerData.each(function(item) {
		html += '<tr>';
		html += '<td class="no">';
		html += no++;
		html += '</td>';
		html += '<td class="hint">';
		html += (""+item[0]).escapeHTML();
		html += '</td>';
		html += '<td class="answer">';
		html += (""+item[1]).escapeHTML();
		html += '</td>';
		html += '</tr>';
	});
	html += '</table>';
	
	return html;
}

function debugPrint(message) {
	if (isDebug) {
		try {
			console.log(message);
		} catch (e) {
		}
	}
}

