/*	multiple_answers.js
	copyleft Thomas Baspeyras 2005

requires :
	dom.js

index :
	MultipleAnswers(numberOfAnswers)
		addMultipleAnswers(headerId, answerIds, [buttonText, buttonOnclic, buttonTitle])
		clear()
		mark([marksToSum])
		randomAdd(answer, correct)
		setTitle(title)
*/

function MultipleAnswers(numberOfAnswers) {
/*	prototype of multiple input answers
	prototype de réponses multiples
*/

	var titleNode;

	this.setTitle = function(title) {
	/*	set title node
		change le titre
	*/
		titleNode.data = title;
	}

	var answers = new Array;
	var inputs = new Array;
	var textNodes = new Array;
	var corrects = new Array;

	this.addMultipleAnswers = function(headerId, answerIds, buttonText, buttonOnclic, buttonTitle) {
	/*	creates inputs and text nodes of answers
		headerId and answerIds specifies where to insert answers
		buttonText and buttonOnclic define an optional button added to each answer

		ajoute les entrées et les noeuds de texte des réponses au parent
		headerId et answerIds spécifie où insérer les réponses
		buttonText et buttonOnclic définissent un bouton optionnel ajouté à chaque réponse
	*/

		/*	opera hack : "" does not work, using "?"
			astuce pour opera : "" ne marche pas, utiliser "?"
		*/
		titleNode = textNode("?");
		var titleDiv = div(titleNode);
		titleDiv.className = "title";

		var container = addTo(headerId, titleDiv);
		container.className = "multipleAnswers";

		var answersPerId = numberOfAnswers / answerIds.length;
		var idIndex = 0;
		var answerCount = answersPerId;

		
		for (var i = 0; i < numberOfAnswers; i++) {

			/*	dispatch answers in elements specified in answerIds
				réparti les réponses dans les éléments spécifié dans answerIds
			*/
			if (answerCount >= answersPerId) {
				answerCount = 0;
				container = document.getElementById(answerIds[idIndex]);
				container.className = "multipleAnswers";
				idIndex += 1;
			}
			answerCount += 1;

			var input = checkboxWithLabel(" ");
			inputs[i] = input;
			textNodes[i] = input.label.firstChild;

			if (buttonOnclic) {
			/*	with optional button
				avec bouton optionnel
			*/
				var optionalButton = button(buttonText, buttonOnclic);
				optionalButton.forTextNode = input.label.firstChild;
				optionalButton.title = buttonTitle;
				optionalButton.className = "optionalButton";
				var answer = div(optionalButton, input);
			}
			else var answer = div(input);

			answer.className = "answer";
			answers[i] = answer;
			container.appendChild(answer);
		}
		return container;
	}

	/*	interval of answers that may have content already
		plage des réponses qui ont peut-être déjà un contenu
	*/
	var firstAnswer = numberOfAnswers - 1;
	var lastAnswer = 0;

	this.randomAdd = function(answer, correct) {
	/*	add an answer in random position
		return false when there is no more empty answers

		ajoute une réponse à une position aléatoire
		rend faux quand il n'y a plus de réponses vides
	*/
		function hasAnswer(answer) {
			for (var i = firstAnswer; i <= lastAnswer; i++) if (textNodes[i].data == answer) return i;
			return -1;
		}

		function randomEmpty() {
			var index = Math.floor(numberOfAnswers * Math.random());
			for (var i = 0; i < numberOfAnswers; i++, index++) {
				if (index >= numberOfAnswers) index = 0;
				if (textNodes[index].data == " ") return index;
			}
			return -1;
		}

		var doubleIndex = hasAnswer(answer);
		if (doubleIndex != -1) {
		/*	in case of doubles
			en cas de doublons
		*/
			if (correct) corrects[doubleIndex] = true;
			return true;
		}
		var emptyIndex = randomEmpty();
		if (emptyIndex == -1) return false;
		textNodes[emptyIndex].data = answer;
		corrects[emptyIndex] = correct;
		if (emptyIndex  < firstAnswer) firstAnswer = emptyIndex;
		if (emptyIndex  > lastAnswer) lastAnswer = emptyIndex;
		return true;
	}

	this.mark = function(marksToSum) {
	/*	mark answers
		note les réponses
	*/
		var marks = new Array;
		if (marksToSum) {
			marks["right"] = marksToSum["right"];
			marks["missing"] = marksToSum["missing"];
			marks["wrong"] = marksToSum["wrong"];
		}
		else {
			marks["right"] = 0;
			marks["missing"] = 0;
			marks["wrong"] = 0;
		}
		for (var i = 0; i < numberOfAnswers; i++) {
			if (corrects[i])
				if (inputs[i].checkbox.checked) {
					answers[i].style.backgroundColor = "#B2EFFF";
					marks["right"] += 1;
				}
				else {
					answers[i].style.backgroundColor = "#FFDCBC";
					marks["missing"] += 1;
				}
			else 
				if (inputs[i].checkbox.checked) {
					answers[i].style.backgroundColor = "#FFBFC0";
					marks["wrong"] += 1;
				}
		}
		return marks;
	}

	this.clear = function() {
	/*	clear all answers
		efface toutes les réponses
	*/
		for (var i = 0; i < numberOfAnswers; i++) {
			answers[i].style.backgroundColor = "transparent";
			inputs[i].checkbox.checked = false;
			textNodes[i].data = " ";
			corrects[i]= false;
		}
		var firstAnswer = numberOfAnswers - 1;
		var lastAnswer = 0;
	}
}
