//<![CDATA[


/*********************************************************************************************************************************************************
	code initial réalisé par Stephane Moriaux (http://stephane.moriaux.pagesperso-orange.fr/contact)  en 2009 à la demande de pascal chalopin (1000 mercis pour cette regex !)	
	sur l'excellent et très réactif forum fr.comp.lang.javascript :  http://groups.google.fr/group/fr.comp.lang.javascript/browse_thread/thread/fbb213b067fee7ce?hl=fr#
 	code modifié et commenté ultérieurement par Pascal Chalopin http://www.scalpa.info
 	licence : http://creativecommons.org/licenses/by-nc-sa/3.0/deed.fr
 	amélioration nécessaire : traitement des homonymes
	version 1.9 du 18:07 vendredi 2 avril 2010
 **********************************************************************************************************************************************************/

/******** rien à changer ci-dessous *******/

var nbTentatives = 0;
var NbEssaisAutorises = 3; // minimum 3
var NbMotsTrouve = 0;
var Score = 0;
var NbClics = 0;
var NbMotsAtrouver = 0;
var NbMotsRestantAtrouver = 0;
var ListeReelle = new Array();
var ListeMotsCliques = new Array();
// On laisse la possibilité ou non (0) de recommencer l'exo avant de voir la soluce
var SamePlayerShootAgain = 1;

// Tolérance des erreurs = 20%
var tolerance = 1.2;
var debut;

// récupérer le nom de la page pour le mettre dans  une variable de session
var PageName = window.location.pathname;

PageName = PageName.split("/");
PageName = PageName[PageName.length - 1];
PageName = PageName.substr(0, PageName.lastIndexOf("."));
PageName = PageName.replace(new RegExp("(%20|_|-)", "g"), "");

/*********************************************************************
Rendre chaque mot cliquable en l'entourant d'une balise <span>
Calculer le nombre de mots à trouver et 
copier cette valeur dans les variables NbMotsAtrouver et NbMotsRestantAtrouver
Créer un tableau contenant l'ensemble des mots à trouver
**********************************************************************/
function initialiser() {
	//"exo" est le div (et aussi l'id du div) qui contient le texte à analyser 
	var exo = document.getElementById('exo');
	//"txt" est l'innerHTML de ce div (le contenu du div en  "string") à ce moment-ci 
	var txt = exo.innerHTML;
	// c'est ce symbole (l'espèce de carré :    ) de la regex qui permet de traiter les espaces insécables , en utf-8 la regex peut sans doute être plus courte ?  txt = txt.replace(/([\w]+)(?=[\s '".,;!?«»\-(\)])/gi,'<span class=\'blue\' onclick="verif(this)">$1<\/span>');
	txt = txt.replace(/([\wéçâêîôûàèùëï]+)(?=[\s '".,;!?«»\-(\)])/gi,'<span class=\'blue\' onclick="verif(this)">$1<\/span>');
	//nouveau contenu de la div 
	exo.innerHTML = txt;
 
	var x = exo.getElementsByTagName('SPAN');
	// Initialisation de la liste réelle :  ListeReelle
	// A chaque fois qu'un mot entre balises span correspond à un de la liste sans doublon, on incrémente  NbMotsAtrouver et NbMotsRestantAtrouver
	for(var i=0, n=x.length; n>i; i++) {
		for(var j in ListeSansDoublon) 
			if(ListeSansDoublon[j] == x[i].innerHTML) 
			{ 
				NbMotsAtrouver++; 
				ListeReelle.push(ListeSansDoublon[j]);
			}
   }
   
	//J'écris l'identité du visiteur et le nombre de mots à trouver dans la <div id="identity">
	affichage();
	
	// A ce stade 
	NbMotsRestantAtrouver = NbMotsAtrouver;
	
	// debug purpose
		if (_debug==1){
			var DivDebug = document.getElementById('debug');
			var mots_restants = ListeReelle.join("-");
			var mots_cliques = ListeMotsCliques.join(" ");
			DivDebug.innerHTML = NbClics + ' clic(s)<br \/>';
			DivDebug.innerHTML += MotRechercher+' restant à cliquer : ' + mots_restants + '<br />';
			DivDebug.innerHTML += MotRechercher+' cliqué(s) : ' + mots_cliques + '<br />';
		}

} //#fin de la fonction initialiser


/********************************************************************
affichage() est la fonction appelée au chargement de la page 
pour recueillir l'identité du joueur
********************************************************************/
function affichage (){
	var DivIdentity = document.getElementById('identity');
	var nomsurfeur = prompt("Entrez vos nom et prénom, SVP","???   ???");
	
	if ((nomsurfeur=="")||(nomsurfeur=="???   ???")||(nomsurfeur==null)) {
		nomsurfeur = 'Surfeur Anonyme';
	}
	DivIdentity.innerHTML += '<h3 \" class=\"cntr\">Bienvenue ' + nomsurfeur + '</h3>';
	DivIdentity.innerHTML += '<h4>Il y a ' + NbMotsAtrouver + ' ' + MotRechercher + ' à trouver.</h4>';
	
}


/********************************************************************
verif() est la fonction appelée dans chaque span  (au clic sur chaque mot)  
"quoi" est l'élément span (balises et contenu) 
démarrage du chronomètre
Elle maintient  à jour les listes de mots.
********************************************************************/
function verif(quoi) {
	// A chaque clic, on incrémente les clics
	NbClics++;
	document.getElementById('FeedBack').innerHTML='Tu as cliqué ' + NbClics + ' fois.';
	//compteur temps
	// Au premier clic on déclenche le compteur
	if (NbClics==1){
	debut = new Date();
 	// Initialisation du timer
	CalculTemps();
	}
	// afficher bouton  corriger après un nombre de clics du joueur équivalent au nombre de mots à trouver
	if (NbClics>=NbMotsAtrouver){
		document.getElementById('btn').innerHTML = '<button id="btn_correction" onclick="corrige()">Corriger</button>';
	}

	// Condition permettant à l'élève de revenir sur sa décision 
	
	if (quoi.className == 'red')// si le mot est rouge, c'est qu'il a été dèjà cliqué
	{ 
		quoi.className = 'blue'; // je le remets en bleu
		quoi = quoi.innerHTML; // Je réinjecte le contenu dans le tag <span> 
			// Si le mot cliqué devait faire partie des mots à trouver, je le réinjecte dans le tableau ListeReelle (pouvant contenir des doublons)
			for(var i=0, n=ListeSansDoublon.length; n>i; i++){
				if ( ListeSansDoublon[i] == quoi){
					NbMotsRestantAtrouver ++;  
					ListeReelle.push(ListeSansDoublon[i]);
					// on sort de la boucle si le mot cliqué a été trouvé 
					break;
				}
			}		
					// puisqu'il était rouge, c'est que le joueur l'avait cliqué, donc on le vire de la liste de ses mots
			for(var i=0, n=ListeMotsCliques.length; n>i; i++){
				if ( ListeMotsCliques[i] == quoi){
					ListeMotsCliques[i]=ListeMotsCliques[ListeMotsCliques.length-1]; 
					ListeMotsCliques.pop();
					// on sort de la boucle si le mot cliqué a été trouvé 
					break;
				}
			}
					
			// Si on est d'humeur généreuse, possibilité de décrémenter d'un demi point le nombre de clics... décommenter la ligne ci-dessous
			//NbClics -= .5; 
	}
	else // si le mot est bleu
	{	
		quoi.className = 'red'; // Le mot est rouge maintenant
		quoi = quoi.innerHTML; // On réinjecte le contenu dans le tag <span> 
			// On compare chaque mot de la liste réelle (pouvant contenir des doublons)  avec le mot actuellement cliqué
			for(var i=0, n=ListeReelle.length; n>i; i++){
				if ( ListeReelle[i] == quoi){ // si le mot cliqué est dans la liste 
					// on décrémente NbMotsRestantAtrouver le nombre de réponses à trouver
					NbMotsRestantAtrouver --;  
					// on vire le mot de la liste  par cette astuce
					ListeReelle[i]=ListeReelle[ListeReelle.length-1]; 
					ListeReelle.pop(); 
					// on sort de la boucle si le terme (le mot cliqué) a été trouvé  dans la liste (des termes restants à trouver) 
					break;
				}
			}
		// on ajoute le mot dans la liste du joueur
		ListeMotsCliques.push(quoi);
	}
		
		// debug purpose
		if (_debug==1){
			var DivDebug = document.getElementById('debug');
			var mots_restants = ListeReelle.join("-");
			var mots_cliques = ListeMotsCliques.join(" ");
			DivDebug.innerHTML = NbClics + ' clic(s)<br \/>';
			DivDebug.innerHTML += MotRechercher+' restant à cliquer : ' + mots_restants + '<br />';
			DivDebug.innerHTML += MotRechercher+' cliqué(s) : ' + mots_cliques + '<br />';
		}
}//#fin de la fonction verif


/********************************************************************
corrige() est la fonction appelée quand on clique sur le bouton corriger
Elle compare 
********************************************************************/
function corrige() {
	var DivFin = document.getElementById('fin');
	var DivFeedBack = document.getElementById('FeedBack');
	
	// Je compare les réponses à la soluion
	solution();
	
	//A chaque clic, on incrémente le nombre de tentatives et on affiche les commentaires
	nbTentatives ++;
	DivFin.style.display = 'block';
	DivFeedBack.innerHTML = 'Tentative n° '+ nbTentatives + ' sur 3.';
	
//Si tous les mots sont trouvés
if(oubli==0){
	//aucun oubli et aucune erreur
	if(erreur==0){
		switch(nbTentatives){
			case 1 :
				cas=1;
				appreciation="C'EST VRAIMENT GÉNIAL!!! TU AS TOUT TROUVÉ DU PREMIER COUP!!!";
				break;
			case 2 :
				cas=2;
				appreciation="C'EST VRAIMENT EXTRA!!! TU AS TOUT TROUVÉ DU DEUXIÈME COUP!!!";
				break;
			case 3 :
				cas=3;
				appreciation="C'EST VRAIMENT SUPER!!! TU AS TOUT TROUVÉ DU TROISIÈME COUP!!!";
				break;
			default :
				cas=4;
				appreciation="C'EST BIEN!!! TU AS FINI PAR TROUVER!!!";
			
		}
		// On donne la correction et les résultats
		resultat();
			}
	//aucun oubli et des erreurs
	else{
		// aucun oubli mais trop de clics : trop aléatoire
		if(NbClics>NbMotsAtrouver*tolerance){
			// Tant qu'on a des essais, on peut toujours se corriger à l'aide du feedback
			if(nbTentatives<NbEssaisAutorises){
				//FeedBack
				var commentaire = param();
				DivFin.innerHTML += '<p><b>INDICES :</b> '+commentaire+'</p>';
			}
			//Le nombre d'essais autorisés est atteint, on ne peut plus se corriger
			else{
				cas=5;
				appreciation="BIEN QUE TU AIES TOUT TROUVÉ, TU AS FAIT TROP D'ERREURS POUR CONSIDÉRER LA COMPÉTENCE ACQUISE!!!";
					// On donne la correction et les résultats
					if(SamePlayerShootAgain==1){
					//FeedBack
					var commentaire = param();
					DivFin.innerHTML += '<p><b>INDICES :</b> '+commentaire+'</p>';
						// afficher bouton
						stripOnclick();
						document.getElementById('btn').innerHTML = '<button id="btn_again" onclick="location=self.location">Recommencer</button> ou <button id="btn_solution" onclick="resultat();">Voir la solution</button>';
					}else{
					// On donne la correction et les résultats
						resultat();
					}
			}
		}
		// aucun oubli et le nombre d'erreurs est sous le seuil de tolérance
		else{
			// Tant qu'on a des essais, on peut toujours se corriger à l'aide du feedback
			if(nbTentatives<NbEssaisAutorises){
				//FeedBack
				var commentaire = param();
				DivFin.innerHTML += '<p><b>INDICES :</b> '+commentaire+'</p>';
			}
			//Le nombre d'essais autorisés est atteint, on ne peut plus se corriger
			else{
				cas=6;
				appreciation="TU AS TOUT TROUVÉ, MAIS TU AS LAISSÉ QUELQUES D'ERREURS. LA COMPÉTENCE EST EN VOIE D'ACQUISITION!!!";
					// On donne la correction et les résultats
					if(SamePlayerShootAgain==1){
					//FeedBack
					var commentaire = param();
					DivFin.innerHTML += '<p><b>INDICES :</b> '+commentaire+'</p>';
						// afficher bouton
						stripOnclick();
						document.getElementById('btn').innerHTML = '<button id="btn_again" onclick="location=self.location">Recommencer</button> ou <button id="btn_solution" onclick="resultat();">Voir la solution</button>';
					}else{
						// On donne la correction et les résultats
						resultat();
					}
			}
		}
	}
}
//Si des mots ne sont pas trouvés oubli>0
else{
	// Des oublis mais aucune erreur
	if(erreur==0){
		// Tant qu'on a des essais, on peut toujours se corriger à l'aide du feedback
		if(nbTentatives<NbEssaisAutorises){
			//FeedBack
			var commentaire = param();
			DivFin.innerHTML += '<p><b>INDICES :</b> '+commentaire+'</p>';
		}
		//Le nombre d'essais autorisés est atteint, on ne peut plus se corriger
		else{
			cas=7;
			appreciation="TU N'AS PAS TOUT TROUVÉ, MAIS TU N'AS FAIT AUCUNE ERREUR. LA COMPÉTENCE EST EN VOIE D'ACQUISITION!!!";
				// On donne la correction et les résultats
				if(SamePlayerShootAgain==1){
					//FeedBack
					var commentaire = param();
					DivFin.innerHTML += '<p><b>INDICES :</b> '+commentaire+'</p>';
					// afficher bouton
					stripOnclick();
					document.getElementById('btn').innerHTML = '<button id="btn_again" onclick="location=self.location">Recommencer</button> ou <button id="btn_solution" onclick="resultat();">Voir la solution</button>';
				}else{
					// On donne la correction et les résultats
					resultat();
				}
			}
	}
	// Des oublis et des erreurs
	else{
		// Tant qu'on a des essais, on peut toujours se corriger à l'aide du feedback
		if(nbTentatives<NbEssaisAutorises){
			//FeedBack
			var commentaire = param();
			DivFin.innerHTML += '<p><b>INDICES :</b> '+commentaire+'</p>';
		}
		//Le nombre d'essais autorisés est atteint, on ne peut plus se corriger
		else{
			cas=8;
			appreciation="TU N'AS PAS TOUT TROUVÉ, ET TU AS FAIT DES ERREURS. LA COMPÉTENCE N'EST PAS ACQUISE!!!";
				// On donne la correction et les résultats
				if(SamePlayerShootAgain==1){
					//FeedBack
					var commentaire = param();
					DivFin.innerHTML += '<p><b>INDICES :</b> '+commentaire+'</p>';
					// afficher bouton
					stripOnclick();
					document.getElementById('btn').innerHTML = '<button id="btn_again" onclick="location=self.location">Recommencer</button> ou <button id="btn_solution" onclick="resultat();">Voir la solution</button>';
				}else{
					// On donne la correction et les résultats
					resultat();
				}
			}
	}

}

}//fin function corrige


/********************************************************************
resultat()  retourne les commentaires finaux, le temps mis et la note
********************************************************************/
function resultat() {
	
	var DivFeedBack = document.getElementById('FeedBack');
	var DivFin = document.getElementById('fin');
	
	calculeScore();
	

	DivFeedBack.innerHTML += '<p class="cntr"><b>Note : ' + Score + ' / 20</b><br />';
	DivFeedBack.innerHTML += 'Tu as réalisé l\'exercice en '+FormatTemps(tps)+'. </p>';
	
	var commentaire = param();
	DivFeedBack.innerHTML += '<p><b>Récapitulons :</b> '+commentaire+'</p>';
	DivFeedBack.innerHTML +='<p>'+appreciation+'</p>';
		
	// Je remplace les boutons par la légende de la correction
	document.getElementById('btn').innerHTML = 'Légende de la correction : Vert = <span class ="green">Bonne réponse</span>, Violet = <span class ="violet">Oubli</span>, Rouge = <span class ="surligner">Erreur</span>';
	// Je cache les commentaires
	DivFin.style.display ='none'
		
	// J'affiche la correction
	var DivSoluce = document.getElementById('exo');
	DivSoluce.parentNode.replaceChild(Solution,DivSoluce);
	//document.getElementById('soluce').style.display = 'block';

}//fin function resultat()

/********************************************************************
param()  retourne des commentaires en fonction de certains paramètres
********************************************************************/
function param(){
	
	var co = "";
	
	//pluriel
	co += 'Tu as cliqué ' + NbClics + ' fois. Et il reste ' + NbMotsRestantAtrouver + ' ' + MotRechercher + ' à trouver.<br />';
	
	if (oubli>0) {
		co+='Tu as fait '+oubli+' oubli'+pluriel(oubli)+'. ';
	}
	else{
		co+='Tu n\'as rien oublié. ';
	}
	
	if (erreur>0) {
		co+='Tu as commis '+erreur+' erreur'+pluriel(erreur)+'. ';
	}
	else{
		co+='Tu n\'as commis aucune erreur. ';
	}
	
	if (repok>0) {
		co+='Tu as '+repok+' bonne'+pluriel(repok)+' réponse'+pluriel(repok)+'.';
	}
	else{
		co+='Il n\'y a aucune bonne réponse. ';
	}
		
		
	return co;
	
}

/********************************************************************
solution()  construit la solution à partir de la div exo qu'elle épure puis par 
comparaison établit un cataloque de la situation 
********************************************************************/
function solution() {
		oubli = 0;
		erreur = 0;
		repok = 0;
	var DivSoluce = document.getElementById('soluce');
	var Reponses = document.getElementById('exo');
	Solution = Reponses.cloneNode(true);
	
    var MotsSolution = Solution.getElementsByTagName('SPAN');
	var MotsReponse = Reponses.getElementsByTagName('SPAN');
	
	//Création de la solution
	for(var i=0, n=MotsSolution.length; n>i; i++) {
		var a = MotsSolution[i];
		a.onclick = '';
		a.className = 'blue';
			for(var j in ListeSansDoublon){
				if(ListeSansDoublon[j] == a.innerHTML){
					a.className='red';
				}
			}
	}// fin du for
	
	// Comparaison de la className du mot-réponse avec celle du mot-solution et mise en forme
	for(var i=0, n=MotsSolution.length; n>i; i++) {

		var a = MotsSolution[i];
		var b = MotsReponse[i];
		//var c = MotsCorrection[i];
		
			if(a.className =='red' && b.className == 'red'){
				// C'est une bonne réponse
				a.className = 'green';
				repok++;
			}
		
			if (a.className =='red' && b.className == 'blue'){
				// C'est un oubli
				a.className = 'violet';
				oubli++;
			}
			
			if (a.className =='blue' && b.className == 'red'){
				// C'est une erreur
				a.className = 'surligner';
				erreur++;
			}
			
			if (a.className =='blue' && b.className == 'blue'){
				// Rien à faire
			}

		 
	} //fin du for
	//replacedNode = parentNode.replaceChild(newChild, oldChild);

	//DivSoluce.parentNode.replaceChild(Solution,DivSoluce);
	DivSoluce.style.display = 'none';
	
	
		// debug purpose
		if (_debug==1){
			var DivDebug = document.getElementById('debug');
			if (oubli+repok==NbMotsAtrouver){
				DivDebug.innerHTML += 'Vérification n° '+(nbTentatives+1)+' de la correction faite avec succès.<br />';			
			}
			else{
			alert("Erreur dans la vérification de la solution");
			DivDebug.innerHTML += oubli+' oubli(s) '+erreur+' erreur(s) '+repok+' (bonne(s) réponse(s)<br />';
			DivDebug.innerHTML += 'Résultat du calcul : oubli+repok='+(oubli+repok)+' '+MotRechercher+' à trouver : '+NbMotsAtrouver+'<br />';
			}
		}
}//fin function solution


/********************************************************************
calculeScore()  calcule la note pondérée par le ratio nbre de mots/ nbre de clics
comparaison établit un cataloque de la situation 
********************************************************************/
function calculeScore(){
	
	var NbMotsTrouve = NbMotsAtrouver-NbMotsRestantAtrouver;
	
	// j'arrête le temps ...
		if (typeof t != "undefined"){
			clearTimeout(t);
		}
	// Note pondérée
	Score = Math.round((((NbMotsTrouve)/NbMotsAtrouver)*20)*(NbMotsAtrouver/NbClics));
		
		if(Score<0){
			Score=0;
		}
}


function die_ext($page){ 
$extpage = substr(strrchr($page, "."), 1); 
$extpage =".".$extpage; 
$dieext=str_replace($extpage,"",$page); 
return $dieext ; 
}

// Calculer durée de l'exo
function pluriel(nb) {
	if (nb>1) {
	return "s";
	} 
	else {
	return "";
	}
}
 
function FormatTemps(tps) {
	var reste="";
	var heure =Math.floor(tps/3600);
	var min=Math.floor(tps/60);
	var sec=tps-min*60;
	
	if (heure>0) {
		reste+=heure+" heure"+pluriel(heure)+" ";
	}
	
	if (min>0) {
		reste+=min+" minute"+pluriel(min)+" ";
	}
	
	if (sec>0) {
		reste+=sec+" seconde"+pluriel(sec)+" ";
	}
	
	return reste;	
}
 
function CalculTemps() {
	var fin=new Date()
	tps = Math.round((fin.getTime() - debut.getTime()) / 1000)
	window.status=FormatTemps(tps);
	t=setTimeout("CalculTemps()",1000);		
}

function stripOnclick() {
	var QuelDiv = document.getElementById('exo');
	var QuelTag = QuelDiv.getElementsByTagName('SPAN');
	for (var i = 0, n = QuelTag.length; n > i; i++) {
		var a = QuelTag[i];
		a.onclick = '';
	}// fin du for
}

window.onload = initialiser;

//]]>
