/*	nomura.js
	copyleft Thomas Baspeyras 2004-2005

requires:
	dom.js
	perikura.js
	multiple_answers.js

index:
	Nomura()
*/

function Nomura() {
/*	prototype of professor Nomura
	prototype du professeur Nomura
*/
	var numberOfAnswers = 20;

	var perikura;
	var options;
	var questionNode;
	var marksGauge;
	var mainButton;
	var answersA;
	var answersB;

	var hiragana = new Array(
		"あ", "い", "う", "え", "お",
		"か", "き", "く", "け", "こ",
		"さ", "し", "す", "せ", "そ",
		"た", "ち", "つ", "て", "と",
		"な", "に", "ぬ", "ね", "の",
		"は", "ひ", "ふ", "へ", "ほ",
		"ま", "み", "む", "め", "も",
		"や", "ゆ", "よ",
		"ら", "り", "る", "れ", "ろ",
		"わ", "を",
		"ん",
		"が", "ぎ", "ぐ", "げ", "ご",
		"ざ", "じ", "ず", "ぜ", "ぞ",
		"だ", "ぢ", "づ", "で", "ど",
		"ば", "び", "ぶ", "べ", "ぼ",
		"ぱ", "ぴ", "ぷ", "ぺ", "ぽ",
		"きゃ", "きゅ", "きょ",
		"ぎゃ", "ぎゅ", "ぎょ",
		"しゃ", "しゅ", "しょ",
		"じゃ", "じゅ", "じょ",
		"ちゃ", "ちゅ", "ちょ",
		"にゃ", "にゅ", "にょ",
		"ひゃ", "ひゅ", "ひょ",
		"びゃ", "びゅ", "びょ",
		"ぴゃ", "ぴゅ", "ぴょ",
		"みゃ", "みゅ", "みょ",
		"りゃ", "りゅ", "りょ");
	var katakana = new Array(
		"ア", "イ", "ウ", "エ", "オ",
		"カ", "キ", "ク", "ケ", "コ",
		"サ", "シ", "ス", "セ", "ソ",
		"タ", "チ", "ツ", "テ", "ト",
		"ナ", "ニ", "ヌ", "ネ", "ノ",
		"ハ", "ヒ", "フ", "ヘ", "ホ",
		"マ", "ミ", "ム", "メ", "モ",
		"ヤ", "ユ", "ヨ",
		"ラ", "リ", "ル", "レ", "ロ",
		"ワ", "ヲ",
		"ン",
		"ガ", "ギ", "グ", "ゲ", "ゴ",
		"ザ", "ジ", "ズ", "ゼ", "ゾ",
		"ダ", "ヂ", "ヅ", "デ", "ド",
		"バ", "ビ", "ブ", "ベ", "ボ",
		"パ", "ピ", "プ", "ペ", "ポ",
		"キャ", "キュ", "キョ",
		"ギャ", "ギュ", "ギョ",
		"シャ", "シュ", "ショ",
		"ジャ", "ジュ", "ジョ",
		"チャ", "チュ", "チョ",
		"ニャ", "ニュ", "ニョ",
		"ヒャ", "ヒュ", "ヒョ",
		"ビャ", "ビュ", "ビョ",
		"ピャ", "ピュ", "ピョ",
		"ミャ", "ミュ", "ミョ",
		"リャ", "リュ", "リョ");
	var romaji = new Array(
		"a", "i", "u", "e", "o",
		"ka", "ki", "ku", "ke", "ko",
		"sa", "shi", "su", "se", "so",
		"ta", "chi", "tsu", "te", "to",
		"na", "ni", "nu", "ne", "no",
		"ha", "hi", "fu", "he", "ho",
		"ma", "mi", "mu", "me", "mo",
		"ya", "yu", "yo",
		"ra", "ri", "ru", "re", "ro",
		"wa", "wo",
		"n",
		"ga", "gi", "gu", "ge", "go",
		"za", "ji", "zu", "ze", "zo",
		"da", "ji", "zu", "de", "do",
		"ba", "bi", "bu", "be", "bo",
		"pa", "pi", "pu", "pe", "po",
		"kya", "kyu", "kyo",
		"gya", "gyu", "gyo",
		"sha", "shu", "sho",
		"ja", "ju", "jo",
		"cha", "chu", "cho",
		"nya", "nyu", "nyo",
		"hya", "hyu", "hyo",
		"bya", "byu", "byo",
		"pya", "pyu", "pyo",
		"mya", "myu", "myo",
		"rya", "ryu", "ryo");

	var fromKanaRange;
	var toKanaRange;

	function addKanaRange(id, onchange) {
	/*	creates selectors used to specify the studied range of kana
		créé les sélecteurs utilisés pour spécifier la plage de kana étudiés
	*/
		function rangeSelector(value) {
			var selector = select();
			for (var i = 0; i < hiragana.length; i++) selector.appendChild(option(hiragana[i], i));
			/*	Unfortunately Opera cannot do this immediately (see hack later in the file) :
				Malheureusement Opera ne peut pas faire ceci immédiatement (voir l'astuce plus loin) :
			*/
			selector.value = value;
			return selector;
		}

		fromKanaRange = rangeSelector(0);
		toKanaRange = rangeSelector(103);
		fromKanaRange.onchange = function() {
			if (1*fromKanaRange.value > 1*toKanaRange.value) toKanaRange.value = fromKanaRange.value;
			onchange();
		}
		toKanaRange.onchange = function() {
			if (1*fromKanaRange.value > 1*toKanaRange.value) fromKanaRange.value = toKanaRange.value;
			onchange();
		}

		/*	Opera hack (I want this fucking value set and I'm gonna have it set) :
			Astuce pour Opera (je veux fixer cette valeur et je la fixerai, nom d'une pipe) :
		*/
		fromKanaRange.id = "fromKanaRange";
		setTimeout("document.getElementById('fromKanaRange').value = 0;", 10);
		toKanaRange.id = "toKanaRange";
		setTimeout("document.getElementById('toKanaRange').value = 103;", 10);

		return addTo(id, textNode("kana de "), fromKanaRange, textNode(" à "), toKanaRange);
	}

	addLoadEvent(
		function() {
		/*	creates professor Nomura's interface
			créé l'interface du professeur Nomura
		*/
			perikura = new Perikura("nomura", "onizuka");
			perikura.addTeacherInitialChat("Sensei, qu'est-ce que je dois faire\u00A0?", "J'aimerais bien vous faire plaisir.", "Je ne l'ai encore jamais fait...", "Bonne chance, sensei.");
			perikura.addOnizukaInitialChat("Laisse-moi m'occuper de tout.", "Moi, Onizuka Eikichi, je vais déchirer !", "Tomoko, suit tes intuitions.", "Fais confiance à ton professeur.");
			perikura.addGoodComments("Génial\u00A0!", "T'as vu ça un peu\u00A0?");
			perikura.addGoodComments("Vous êtes vraiment fort.", "Je m'étonne moi-même.");
			perikura.addBadComments("Je savais que c'était trop difficile...", "Tu rigoles\u00A0? On recommence.");
			perikura.addBadComments("Sensei, je laisse tomber.", "Tomoko, faut jamais laisser tomber\u00A0!");
			perikura.addPerikura();

			addKanaRange("kanaRange", newQuestion);

			addTo("options", textNode("questionner par l'écriture "));
			options = new Options("hiragana", "katakana", "rōmaji")
			options.addOptions("options", newQuestion);

			/*	opera hack : "" does not work, using "?"
				astuce pour opera : "" ne marche pas, utiliser "?"
			*/
			questionNode = textNode("?");
			addTo("question", questionNode);

			marksGauge = new Gauge("jauge_", ".gif", 3);
			marksGauge.addGauge("marksGauge");

			mainButton = button("Correction");
			mainButton.onclick = pushMainButton;
			addTo("mainButton", mainButton);

			answersA = new MultipleAnswers(numberOfAnswers);
			answersB = new MultipleAnswers(numberOfAnswers);
			answersA.addMultipleAnswers("headerA", new Array("answersACol1", "answersACol2", "answersACol3", "answersACol4"));
			answersB.addMultipleAnswers("headerB", new Array("answersBCol1", "answersBCol2", "answersBCol3", "answersBCol4"));
		}
	);

	function makeNewQuestion(questionSet, titleA, answerSetA, titleB, answerSetB) {
	/*	create new question and answers
		créé de nouvelles question et réponses
	*/
		answersA.setTitle(titleA);
		answersB.setTitle(titleB);
		/*	question and right answers
			question et réponses justes
		*/
		var index = questionSet.randomIndex(fromKanaRange.value, toKanaRange.value);
		questionNode.data = questionSet[index];

		function addTrueIfInRange(index) {
			if (index < fromKanaRange.value) return;
			if (index > toKanaRange.value) return;
			answersA.randomAdd(answerSetA[index], true);
			answersB.randomAdd(answerSetB[index], true);
		}

		if (questionSet[index] == "ji") {
			addTrueIfInRange(52);
			addTrueIfInRange(57);
		}
		else if (questionSet[index] == "zu") {
			addTrueIfInRange(53);
			addTrueIfInRange(58);
		} else {
			answersA.randomAdd(answerSetA[index], true);
			answersB.randomAdd(answerSetB[index], true);
		}
		/*	other answers
			autres réponses
		*/
		for (var i = 0; i <= numberOfAnswers; i++) if (!answersA.randomAdd(answerSetA.random(fromKanaRange.value, toKanaRange.value), false)) break;
		for (var i = 0; i <= numberOfAnswers; i++) if (!answersB.randomAdd(answerSetB.random(fromKanaRange.value, toKanaRange.value), false)) break;
	}

	function newQuestion() {
		answersA.clear();
		answersB.clear();
		switch (options.random()) {
			case 0: makeNewQuestion(hiragana, "katakana ?", katakana, "rōmaji ?", romaji); break;
			case 1: makeNewQuestion(katakana, "hiragana ?", hiragana, "rōmaji ?", romaji); break;
			case 2: makeNewQuestion(romaji, "hiragana ?", hiragana, "katakana ?", katakana); break;
		}
		mainButton.value = "Correction";
	}

	function pushMainButton() {
		if (mainButton.value == "Correction") {
			var marks = answersB.mark(answersA.mark());
			marksGauge.sum(marks["right"], marks["missing"], marks["wrong"]);
			perikura.commentMarks(marks);
			mainButton.value = "Question Suivante";
		}
		else newQuestion();
	}

	/*	Opera hack (see earlier in file), should have been : addLoadEvent(newQuestion);
		astuce pour Opera (voir plus haut dans le fichier), cela aurait du être : addLoadEvent(newQuestion);
	*/
	this.operaHack = function() { newQuestion(); }
	addLoadEvent(function () { setTimeout("operaHack();", 400) });
}

nomura = Nomura();
