﻿/* LISTE DES CONSTANTE*/
	nbr_occurrence_min=2;
	chemin_fic_donnerXml="fichiers/sample.xml";//fichier xml contenant les données a ne pas compter
	ID_element_Affichage_Resultat="result";//un champs div

/* VARIABLES GLOBALES*/
	var  xmlDoc=null //contient le document xml
	tabListeMotsIgnorer = new Array();//le tableau contennat les mots a ignorer


function getAlphaNumMot(stexteBrute){
		
	//si le texte est vide on ne fait rien
	if(stexteBrute.replace(/^[ \s\n\r]+/g,"")==""){
	alert("Veuiller inserrer du texte");
	return 0;
	}
	
	//consider [c'est ] comme un seul mot ainsi que les divers
	var Exp=new RegExp("[ \\s\\n\\t]*['’][ \\s\\n\\t]*","ig");
	stexteBrute = stexteBrute.replace(Exp,"'");
	 
	//suppression espace et ponctuation en debut du texte 
	 var exp=new RegExp("^[, ;?!:.«»\"\s\n\r]+"); 
	stexteBrute=stexteBrute.replace(exp,"");	
	// suppression espace et ponctuation en fin du texte
	 exp=new RegExp("[, ;?!:.«»\"\\s\\n\\r]+$"); 
	 stexteBrute=stexteBrute.replace(exp,"");
	
 
	//enlever les blancs et les signes de ponctuation 
	  var exp=/[:,;?!\.«»\/\|\(\)\{\}\"\s\n\r]+/; 
	  var tabNom=stexteBrute.split(exp);	  
	  if (tabNom==null) {
		  alert("Problème dans l'expression !");
	  return 0;
	  }
	  
	//concatenation de chaque mot separer par un espace
	  sTexte=getTexteWithTab(tabNom) ;	
	 //on supprime tout ce qui est appostrophe
	 //consider [c'est ] comme un seul mot ainsi que les divers
	  
	var Exp=new RegExp("[^ \\s\\n\\t][ \\s\\n\\t]*['’][ \\s\\n\\t]*","ig");
	sTexte = sTexte.replace(Exp," ");
	
	//enlever les mots inutiles
	//n'inserrer espace  ni au debut ni en fin de text	 
	  sTexte=enleverMotInutile(sTexte);	  
	 
	 //enlever les blancs et les signes de ponctuation 
	  var exp=/[:,;?!\.«»\/\|\(\)\{\}\"\s\n\r]+/;  
	 //tabnom contient chaque mot a compter
	 tabNom=sTexte.split(exp);	
	 if (tabNom==null) {
		  alert("Problème dans l'expression !");
	  return 0;
	 }
	
	 sTexte=" "+sTexte+" ";//Texte ou sont cherchés les mots
	 Tab_mot_Cpt=new Array();//un tbleau comptenant le mot au singulier et aux pluriel
	 TabRes=new Array(); //un tableau contenant les données resultat des recherches et 
	 					 //que l'on va afficher par la suite
	
	
	 if(tabNom.length>0)	  
	 for (i=0;i<tabNom.length;i++) {
		 //construction du mot
		 	mot_Cpt=tabNom[i]; 
			if(mot_Cpt.length <2)continue;
		//est ce que le mot ne contient pas de caractere étrange; 
		//y compris les chiffres
			var Exp=/[^@\-_a-zA-Z\x80-\xff]/;
			tabResult = mot_Cpt.match(Exp);
			if(tabResult!=null)	{continue;	}
			numChar=mot_Cpt.length -1;			
		//distinguer le mot singulier du mot pluriel
		 if((mot_Cpt.length >2) && (mot_Cpt.charAt(numChar)== "s" || mot_Cpt.charAt(numChar)== "S"))
		 {	 //mot initial est au pluriel			 
			 Tab_mot_Cpt[1]=mot_Cpt
			 //creation du mot au singulier					
			 Tab_mot_Cpt[0]=mot_Cpt.substr(0,(mot_Cpt.length-1)) ;			
		 }
		 else
		 {
			 //mot initiale est un mot singulier			 
			 Tab_mot_Cpt[0]= mot_Cpt  
			 //creation du mot pluriel			
			 Tab_mot_Cpt[1]= mot_Cpt + "s" //pluriel		
		 }	 
		var occSing=0;
	 	 var occPlur=0;
		//occurrence singulier	
		for(var j=0;j<=1;j++){
			//echapement des caracteres spéciaux
			var mot_chercher=echaperCarSpeciaux(Tab_mot_Cpt[j]);
		 	var elt1="[ \\t\\s\\n]+" + mot_chercher + "[ \\s\\n\\t]+" ;
			
			expReg=new RegExp( elt1,'ig'); 
			var resul=sTexte.match(expReg);			
			while(resul!= null ){			
			//dans le tableau, le mot singulier est toujours placé avant le mot au pluriel
				if(j==0)occSing+=resul.length;
				else occPlur+=resul.length;			
			 
			    sTexte=sTexte.replace(expReg," ");	
			    resul=sTexte.match(expReg);			 
			}  	 	  
		}
		
		//sauvegarde du resultat pour les occurenced supérieurs aux minimum
		if((occSing + occPlur)>= nbr_occurrence_min){
			var motAfficher="";
			if(occSing!=0)motAfficher=Tab_mot_Cpt[0];
			else motAfficher=Tab_mot_Cpt[1];
			TabRes[TabRes.length]=motAfficher+"=>"+occSing+"=>"+occPlur;			
		}
	 }//fin du for
	 
	 //preparer le resultat=>TRIER en fonction du nombre d'occurence singulier et pluriel
	 TabResTrie=TrierTableau(TabRes);	 
	 afficherETableauSousFormeHTML(TabResTrie,ID_element_Affichage_Resultat); 
  
}//fin fonction

function enleverMotInutile(sChaine){
		  var mot_Ign="";
		  sChaine= " "+ sChaine + " ";
		  //suppression des mots inutiles
		  if(tabListeMotsIgnorer.length>0)
		  for (i=0;i<tabListeMotsIgnorer.length;i++) {
				mot_Ign=tabListeMotsIgnorer[i];		 
				var elt1="[ \\t\\s\\n]+" + mot_Ign + "[ \\s\\n\\t]+" ;
				expReg=new RegExp( elt1,'ig'); 
				var resul=sChaine.match(expReg);			
				while(resul!= null ){				
				 sChaine=sChaine.replace(expReg," ");	
				 resul=sChaine.match(expReg);			 
				}
		  } 
	 //construction de la liste de mot a compter	
	 sChaine=sChaine.replace(/^[ \s]+/,""); //supprimer espace au dedut en fin du texte
 	 sChaine=sChaine.replace(/[ \s]+$/,"");//supprimer espace en fin du texte	

	 return sChaine ;
}

function getTexteWithTab(ltabNom){
	//la recherche par mot necessite un espace en debut et un espace en fin du texte
	var ltexte="";
	for (var i=0;i<ltabNom.length;i++){
		if(ltexte != "")ltexte += " ";
		  ltexte +=ltabNom[i];
		}
return ltexte;
}

function afficherNombreElt(tabNom){
var affichage="Nombre de noms trouvés = " + tabNom.length + "\n";
    for (var i=0;i<tabNom.length;i++){
      affichage=affichage + " ["+ tabNom[i] + "]\n";
    }
   return affichage;
}
function afficherETableauSousFormeHTML(tabNom,IdElement){
	if(tabNom.length==0){
		affichage="Aucun mot n'apparait "+nbr_occurrence_min+" fois";
		document.getElementById(IdElement).innerHTML=affichage;
		return 0;
	}
var affichage="Le resultat prend en compte les mots apparaissant plus de 2 fois";
affichage+="<table border='1'><tr><td>Mot</td><td>Occurrence singulier</td><td>Occurrence pluriel</td><td>TOTAL</td>";
    for (var i=0;i<tabNom.length;i++){
	  exp=/=>/;	 
	  valgt=tabNom[i].split(exp);	
	   smot= valgt[0];
	  if(parseInt(valgt[1])==0)  nbrsing="";
	  else nbrsing=valgt[1];
	  if(parseInt(valgt[2])==0) nbrPlur="";
	  else nbrPlur=valgt[2];
	 
      affichage+= "<tr><td>"+ smot +"&nbsp;</td><td>" + nbrsing+ "&nbsp;</td> <td>"+nbrPlur+"&nbsp;</td><td>"+(parseInt(valgt[2])+parseInt(valgt[1]))  +"&nbsp;</td>";
    }
	affichage+="</table>"
   document.getElementById(IdElement).innerHTML=affichage;
}


function TrierTableau(tabNom){
	//on trie le tableau rn fonction du nombre d'occurrence de chaque element trouvé
	//format de mise en page: elt;nbelt
	j=0;
	if(tabNom.length<2){
		return tabNom;
	}
	do
	{
		permut=false;
		
		for(i=tabNom.length-1;i>j;i--){
			//extraction des valeurs a comparer
			exp=/=>/;
			valgt=tabNom[i].split(exp);
			vallt=tabNom[i-1].split(exp);
			if((parseInt(valgt[1])+parseInt(valgt[2]))>(parseInt(vallt[1])+parseInt(vallt[2])) ){
				ch=tabNom[i-1];
				tabNom[i-1]=tabNom[i];
				tabNom[i]=ch;
				permut=true;
			}
		}
		j++;
	}while(permut==true);
	return tabNom;
}
 
//fonction de lecture dnsun fichier xml 
function importerXML()
{
    if (window.document.implementation && window.document.implementation.createDocument)
    {
        xmlDoc = window.document.implementation.createDocument("", "", null);
	xmlDoc.async="false";
        xmlDoc.onload = chargerFichierXML;
	 
    }
    else if (window.window.ActiveXObject)
    {
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
	xmlDoc.async="false";	
        xmlDoc.onreadystatechange  = function () {			
			if (xmlDoc.readyState == 4){ chargerFichierXML(); }
			};
     
	}
    else
    {
        alert('Votre navigateur ne supporte pas ce script');
        return 0;
    }
   
   xmlDoc.load(chemin_fic_donnerXml);    
 
 
}
//de preference mettre ca de cette facon <body onload="importXML();">

function chargerFichierXML()
{ 
	//le document ne contient donc plus d'erreur
     var racine = xmlDoc.getElementsByTagName("MOT_IGNORER");
     var ListesMotIngorer = racine[0].firstChild.nodeValue;
 
//consider [c'est ] comme un seul mot ainsi que les divers
	ListesMotIngorer = ListesMotIngorer.replace(new RegExp("[\\s\\n\\t]*['’][\\s\\n\\t]*","ig"),"'");

//suppression espace et ponctuation en debut du texte a analyser
	 var exp=new RegExp("^[, ;?!:.\"\s\n\r]+"); 
	 ListesMotIngorer=ListesMotIngorer.replace(exp,"");
// suppression espace et ponctuation en fin du texte a analyser
	 exp=new RegExp("[, ;?!:.\"\\s\\n\\r]+$"); 
	 ListesMotIngorer=ListesMotIngorer.replace(exp,"");
//suppression des espaces avant et apres le separateur
	 ListesMotIngorer = ListesMotIngorer.replace(new RegExp("[\\s\\n\\t]*;[\\s\\n\\t]*","ig"),";");
 //echapement des caractere spéciale dans le recherche	 
	 ListesMotIngorer =echaperCarSpeciaux(ListesMotIngorer)   	
	//on extraire chacun des mots du les textes
	//les mot son séparer par les blanc ou les signe de ponctuation 
	
 var exp=new RegExp("[;]+"); 
 tabListeMotsIgnorer=ListesMotIngorer.split(exp);   
   //extraction ok
  if (tabListeMotsIgnorer==null) {alert("Probleme dans l'expression !");}	
 
}

function echaperCarSpeciaux(sCh){
 var zSpéciaux = /(\.|\$|\^|\{|\[|\(|\||\)|\]|\}|\*|\+|\?)/gi;
	 var echaper = "\\$1";
	return sCh.replace(zSpéciaux, echaper);
}


