var tabquestions=Array();
var total_pondere=0;
var tabtranches=[];

// La fonction indexOf du moduleArray n'est pas disponible dans Explorer, on l'ajoute à la volée
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function (obj, fromIndex) {
    if (fromIndex == null) {
        fromIndex = 0;
    } else if (fromIndex < 0) {
        fromIndex = Math.max(0, this.length + fromIndex);
    }
    for (var i = fromIndex, j = this.length; i < j; i++) {
        if (this[i] === obj)
            return i;
    }
    return -1;
  };
}

function getName(o){
	if(o.nodeType==1){
		return(o.getAttribute("name"));
	}
	else{
		return("");
	}
}

// Retrouve les enfant d'un noeud ayant un nom particulier
// L'idéal aurait été de passer par un prototypage, mais ça ne semble pas fonctionner sous ie pour Object
function getElementsByName(obj,name){
	var a=[];
	
	for(var n=0;n<obj.childNodes.length;n++){
	
		if(getName(obj.childNodes[n])==name){a.push(obj.childNodes[n]);}
	}
	return a;
}

function removeChildrenFromNode(node)
{

   var len = node.childNodes.length;

	while (node.hasChildNodes())
	{
	  node.removeChild(node.firstChild);
	}
}

// Lit le texte d'une division
function lit_zone(zone){
						if(zone.hasChildNodes()==true){
							var Enfant=zone.childNodes[0];

							return(Enfant.nodeValue);
						}
						else{
							return("");
						}
						
					}


// Ecrit du texte dans une division (remplace le texte existant au besoin)
function ecrit_zone(nom,valeur){
var zone=document.getElementById(nom);
removeChildrenFromNode(zone);
zone.appendChild(document.createTextNode(valeur))
}

// Ecrit du texte dans une division (remplace le texte existant au besoin)
function ecrit_zone_obj(zone,valeur){
removeChildrenFromNode(zone);
zone.appendChild(document.createTextNode(valeur))
}

	// function valide_question(){
		// return(this.index);
	// }
	
	function description_question(){
		var s=this.index+"-"+this.type+"-";
		
		for(var i=0;i<this.reponses.length;i++){
			s+=" "+this.reponses[i].valeur_cible;
		}
		s+="\n";
	
		return(s);
	}
	
	function Question(label,index,type,reponses,explication,points){
		this.index=index;
		this.type=type;
		this.reponses=reponses;
		this.valide=valide_question;
		this.description=description_question;
		this.label=label
		this.explication=explication
		this.points=points;
		this.objet=document.getElementById("question"+index);
		this.bonne_reponse=false;
	}
	
	function Reponse(objet,label,valeur_cible){
		this.objet=objet;
		this.label=label;
		this.valeur_cible=valeur_cible;
	}

	function affiche_questions(){
		var s="";
	
		for(var i=0;i<tabquestions.length;i++){
			s+=tabquestions[i].description();
		}
		
		alert(s);
	}
	
	function init(){
		init_structure();
	}
	
	function tableau_reponses(br){
		var t=br.split(",");
		for (var i=0;i<t.length;i++){
			t[i]=parseFloat(t[i])-1;
		}
		return(t);
	}
	
	function analyse_reponses(q,indice,bonnes_reponses){
		var br=tableau_reponses(bonnes_reponses);
		var tr=new Array();
		
		var lr=getElementsByName(q,"reponses")[0];

		var lp=lr.getElementsByTagName("p");
		for(var i=0;i<lp.length;i++){
			var input=lp[i].getElementsByTagName("input")[0];
			var label=lp[i].getElementsByTagName("label")[0];
			var valeur_cible=(br.indexOf(i)>=0);
			tr.push(new Reponse(input,label,valeur_cible));
		}
		return(tr);
	}
	
	function init_structure_question(q){
		var indice=q.id.substr(8);
		
		var label=getElementsByName(q,"libelle")[0];
		var explication=getElementsByName(q,"explication")[0];
		var points=parseFloat(getElementsByName(q,"points")[0].value);
		var config=getElementsByName(q,"config")[0];
		var bonnes_reponses=getElementsByName(q,"bonnes_reponses")[0];
		var reponses=analyse_reponses(q,indice,bonnes_reponses.value);
		var reponses_possibles=getElementsByName(q,"reponses_possibles")[0];
		ecrit_zone_obj(reponses_possibles,(config.value=="single"?"Une seule bonne réponse":"Plusieurs bonnes réponses"));	
		
		var quest=new Question(label,indice,config.value,reponses,explication,points);
		
		tabquestions.push(quest);
		
	}
	
	// Lit les questions définies dans le code HTML
	function init_structure(){
		if (!document.getElementById("questions")) return false;
		var questions=document.getElementById("questions").getElementsByTagName("div");
		for(var i=0;i<questions.length;i++){
			if(questions[i].className=="question"){
				init_structure_question(questions[i]);
			}
		}
		// affiche_questions();
		var pr=document.getElementById("presentation_resultats");
		total_pondere=parseFloat(getElementsByName(pr,"total_pondere")[0].value);
		var trancheshtml=getElementsByName(pr,"tranche");
		var trancheprec=-1;
		for(var i=0;i<trancheshtml.length;i++){
			var tranchefin=parseFloat(getElementsByName(trancheshtml[i],"valeur")[0].value);
			tabtranches.push(new Tranche(trancheprec,tranchefin,getElementsByName(trancheshtml[i],"texte")[0].value));
			trancheprec=tranchefin;
		}
	}
	
	function valeur_radio(name){
		var c=document.getElementsByName(name);
		var longueur_radio=c.length;
		var v=-1;
		for(var i=0;i<longueur_radio;i++){
			v=(c[i].checked?i:v);	
		}
		return(v);
	}
	
	function Resultat(bonne_reponse,score,points){
		this.bonne_reponse=bonne_reponse
		this.score=score
		this.points=points
	}
	
	// Evalue le résultat pour la question
	function valide_question(question){
		switch(question.type){
			case "multi":
			break;
			case "single":
			
			break;
		}
		var reponses_correctes=new Array();
		var reponses_incorrectes=new Array();
		var reponses_absentes=new Array();
		for(var i=0;i<question.reponses.length;i++){
			if(question.reponses[i].valeur_cible){
				question.reponses[i].label.className="reponse_correcte";
				if(question.reponses[i].objet.checked){
					reponses_correctes.push(question.reponses[i].objet);
				}
				else{
					reponses_absentes.push(question.reponses[i].objet);
				}
			}
			else{
				if(question.reponses[i].objet.checked){
					reponses_incorrectes.push(question.reponses[i].objet);
				}
			}
		}
		if((reponses_correctes.length>0)&(reponses_incorrectes.length==0)&(reponses_absentes.length==0)){
			question.label.className="libelle_question_correcte";
			question.bonne_reponse=true;
			ecrit_reponse(question,"correcte","Réponse correcte");
		}
		else{
			question.label.className="libelle_question_incorrecte";
		}
		if(reponses_incorrectes.length>0){
			question.bonne_reponse=false;
			ecrit_reponse(question,"incorrecte","Réponse incorrecte");
		}
		else{
			if(reponses_absentes.length>0){
				question.bonne_reponse=false;
				ecrit_reponse(question,"incomplete","Réponse incomplète");
			}
		}
		question.explication.className="explication_visible";
		question.points_attribues=(question.bonne_reponse?question.points:0);
		
		return(new Resultat(question.bonne_reponse,question.points_attribues,question.points));
	}
	
	function ecrit_reponse(question,classe,texte){
		if(document.getElementById("resultat_reponse"+question.index)){
			var d=document.getElementById("resultat_reponse"+question.index);
			removeChildrenFromNode(d);
		}
		else{
			var d=document.createElement("div");
			d.id="resultat_reponse"+question.index
		}
		d.appendChild(document.createTextNode(texte));
		d.className=classe;
		
		question.objet.insertBefore(d,question.label.nextSibling);
	}
	
	function valider(){
		var bonnes_reponses=0;
		var score=0;
		var points_totaux=0;
		
		for(var i=0;i<tabquestions.length;i++){
			resultat=valide_question(tabquestions[i]);
			bonnes_reponses+=resultat.bonne_reponse;
			score+=resultat.score;
			points_totaux+=resultat.points;
		}
		ecrit_resultats("resultats",bonnes_reponses,tabquestions,score,points_totaux,total_pondere);
		document.getElementById("resultats").style.visibility="visible";
		document.location.href="#bottom";
	}
	
	function arrondi(valeur,chiffres){
		return Math.round(valeur);
	}
	
	function ecrit_resultats(division,bonnes_reponses,tabquestions,score,points_totaux){
		removeChildrenFromNode(document.getElementById(division));
	
		var dres=document.createElement("div")
		dres.appendChild(document.createTextNode("Résultat : "+bonnes_reponses+" bonne(s) réponse(s) sur "+tabquestions.length+" questions, soit un total de "+score+" points sur "+points_totaux+" points possibles"))
		dres.id="resultat_texte";
		document.getElementById(division).appendChild(dres);
		
		var dscore=document.createElement("div");
		dscore.appendChild(document.createTextNode("Note : "+arrondi(score*total_pondere/points_totaux)+" / "+total_pondere))
		dscore.id="resultat_score";
		document.getElementById(division).appendChild(dscore);
		
		var t=trouve_tranche(score);
		
		var dcomm=document.createElement("div");
		dcomm.appendChild(document.createTextNode("Commentaire : "+t.texte))
		dcomm.id="resultat_score";
		document.getElementById(division).appendChild(dcomm);
	}
	
	function Tranche(min,max,texte){
		this.min=min;
		this.max=max;
		this.texte=texte;
	}
	
	function trouve_tranche(score){
		var t=0;
		// alert(score);
		for(var i=0;i<tabtranches.length;i++){
		// alert(tabtranches[i].min+" "+tabtranches[i].max+" : "+score)
			if((score>tabtranches[i].min)&&(score<=tabtranches[i].max)){
				t=i;
			}
		}
		return(tabtranches[t]);
	}
