/* 

****  KPSearch 1.2  ****

Copyright Laurent Le Coustumer
llc@wanadoo.fr
Août 1999 

Autorisation d'adapter le code, à condition de ne
pas supprimer ces informations de copyright

*/

var requete = new String;
	ndb = new String;
	depart = new String;
	exclu = new String;
var	maxAtteint = false;
var max;
var special;
var output;
var chkPage ;
var chkMotsCles ;
var chkDescription ; 
var exact;

var boucle;
var nbrTotalOcc;

var taille;  // taille du fichier
var titre;
var	auteur;
var	description;
var	motsclefs;
var debutcorps;
var fincorps;
var cadre = false;  // sera true si la page est déclare des frames

var frset1, frset2 ; // pour voir si la page ne comporte pas une déclaration de frames

liens = new Array();  // tableau pour les liens trouvés	
resultats = new Array();
page = new Array();  // tableau des pages à visiter
listeSauf = new Array();  // tableau des pages à ne pas visiter
listeSeulement = new Array();  // tableau des seules pages à visiter


function messageErreur(m) {

	switch (m) {
		case 0 : alert("Erreur d\'implémentation.\nL\'administrateur n\'a pas spécifié de nom de domaine de base.")
			 break
		case 1 : alert("Erreur d\'implémentation.\nL\'administrateur n\'a pas spécifié de page de départ.")
			 break
		case 2 : alert("Veuillez saisir un ou plusieurs mot-clé(s).")
			 break
		case 3 : alert("Veuillez cocher un champ de recherche.\n(Les pages, les mots-clés, ou les descriptions)")
			 break
	}
}


function vireSpec(chaine){		  // vire les caractères spéciaux

spec = new Array("à","â","ä","é","è","ê","ë","ô","ö","õ","ù","ü","û","ï","î","ç","ñ");
remp = new Array("a","a","a","e","e","e","e","o","o","o","u","u","u","i","i","c","n");

	 for (sp=0;sp<spec.length;sp++){
	 	 re = new RegExp(spec[sp],'g');			// 'g' : ne pas s'arrêter à la première occurence)
		 chaine=chaine.replace(re,remp[sp]);
	 }
 
return chaine;
}


function virecarHtmlSpeciaux(chaine)   // vire les &eacute; etc... et les remplace par leur équivalent neutre
{

spec = new Array("&aacute;","&acirc;","&aelig;","&oelig;","&agrave;","&aring;","&atilde;","&auml;","&ccedil;","&eacute;","&ecirc;","&egrave;","&eth;","&euml;","&iacute;","&igrave;","&ntilde;","&oacute;","&ocirc;","&ograve;","&oslash;","&otilde;","&ouml;","&uacute;","&ucirc;","&ugrave;","&uuml;");
remp = new Array("a","a","ae","oe","a","a","a","a","c","e","e","e","e","e","i","i","n","o","o","o","o","o","o","u","u","u","u");

	 for (sp=0;sp<spec.length;sp++){
	 	 re = new RegExp(spec[sp],'g');			
		 chaine=chaine.replace(re,remp[sp]);
	 }
 
return chaine;

}

function vireEsp(ch)  // vire tous les espaces de la chaîne (pour s'assurer de l'intégrité des adresse http
{
		es = ch.search(/ /);
		while ( es > -1) 
		{
		    ch = ch.replace(" ","");
			es = ch.search(/ /);
		}
		return ch;
}


function vireEspace(chaine)  // vire les espaces en début de chaîne
{
 	while (chaine.substr(0,1) == " ")
	{
	   chaine = chaine.substr(1);
	}
	chaine = escape(chaine);
	while ((chaine.substr(0,3) == "%0A")||(chaine.substr(0,3) == "%0D"))
    {
	   chaine = chaine.substr(3);
	}
	chaine = unescape(chaine);
    return chaine;
}


function remplGuill(chaine) { //remplace les " par des '

spec = new Array("\"");
remp = new Array("\'");

	 for (sp=0;sp<spec.length;sp++){
	 	 re = new RegExp(spec[sp],'g');
		 chaine=chaine.replace(re,remp[sp]);
	 }
 
return chaine;
}


function lit(p)  // lit la page p par l'intermédiaire de l'applet Java, et retourne son contenu en une chaîne
{
var ch;
 	ch = document.AplJava.litFichier(p,ndb);
	return ch;
}


function tagfin(ch)  // renvoie la position du prochain '>'
{
   return (ch.search(/>/));
}
 
function contenuGuill(ch)  // renvoie ce qui est contenu entre les deux prochains guillemets
{
   d = ch.search(/\"/);
   ch = ch.substr(d+1);
   d = ch.search(/\"/);
   if (d > 0)
   	  return(ch.substring(0,d));
   else return("");
}

function litTag(tt,f)  // renvoie le contenu du CONTENT du tag le plus proche
{

	if (tt > -1)
	{
	   fin = tagfin(f.substr(tt));
	   tag = f.substr(tt,fin);   // isole le content
	   deb = (tag.toLowerCase()).search(/content/);
	   tag = tag.substr(deb);
	   retour = vireEspace(contenuGuill(tag));
	}
	else retour="";

	return retour;

}

function vireComm(f)   // vire les commentaires, qui peuvent mettre le souk s'ils contiennent des tags importants
{
    comm1 = f.search(/<!--/);
	comm2 = f.search(/-->/);
	
	while ((comm1 > -1) && (comm2 > -1))
	{
	   if ( (comm1 < comm2) && ( comm1+1+(f.substr(comm1+1).search(/<!--/) > comm2) || (f.substr(comm1+1).search(/<!--/) == -1) ) )
       {
	     f = f.substring(0,comm1)+f.substring(comm2+3);
		 comm1 = f.search(/<!--/);
		 comm2 = f.search(/-->/);
	   }
	   else comm2 = comm2+1+(f.substr(comm2+1).search(/-->/));	
	} 
	return f;
}


function extirpe_structure(fich)  // analyse les tags présents pour en tirer les informations de base
{
	fi=fich.toLowerCase();
	htm1 = fi.search(/<html>/);	
	htm2 = fi.search(/<\/html>/);	
	hea1 = fi.search(/<head>/);
	hea2 = fi.search(/<\/head>/);
	tit1 = fi.search(/<title>/);
	tit2 = fi.search(/<\/title>/);
	bod1 = fi.search(/<body/);
	bod2 = fi.search(/<\/body>/);
	frset1 = fi.search(/<frameset/);
	frset2 = fi.search(/<\/frameset>/);

	aut = fi.search(/meta *name *= *\" *author.*content *= *\"/); 
	key = fi.search(/meta *name *= *\" *keywords.*content *= *\"/);
	des = fi.search(/meta *name *= *\" *description.*content *= *\"/);

	if ((tit1 > -1)&&(tit2 > -1)&&(tit2-tit1 > 7))
	   titre = vireEspace(fich.substring(tit1+7,tit2));
	else
	   titre = "";

    auteur = litTag(aut,fich);	
	description = litTag(des,fich);
	motsclefs = litTag(key,fich);
	
	if (bod1 >-1) debutcorps = bod1+tagfin(fi.substr(bod1))+1; // calcule la place absolue du début du CORPS
	  else debutcorps=0;
	if (bod2 >-1) fincorps = bod2;
	  else fincorps = fich.length;
	
}


function vireTag(cor)   // retourne la chaîne sans Tags (et stocke les tags A HREF)
{
    ouv = cor.search(/</);
	while (ouv > -1)
	{
	    ferm = cor.search(/>/);
		if (ferm > -1)
		{
		   ouvsuiv = ouv+((cor.substr(ouv+1)).search(/</))+1;
		   if (ouvsuiv < ferm) ouv = ouvsuiv;
		   href = ((cor.substring(ouv,ferm+1)).toLowerCase()).search(/href/);
		   if (href > -1)  // si le tag en question est A HREF...
		   {
		   	  l = contenuGuill(cor.substring(ouv+href,ferm+1));
			  if (l.substr(0,1) != "#")   // si le lien n'est pas interne
			  {
			      if ((l.search(/htm.*#/)) > -1)   // si on trouve un revoi vers une ancre dans l'adresse...
			      {
			         l = l.substring(0,l.search(/#/));
			      }
			      // if ((l.search(/\..*htm/)) > -1 )  // stocke le lien uniquement s'il pointe vers une page html
		   	      liens[liens.length]= l;
			  }
		   }
		   cor = cor.substring(0,ouv)+cor.substr(ferm+1);
		   ouv = cor.search(/</);
		}
		else ouv = -1;
		
	}

 	return cor;
}


function nvResul(p,t,a,d,o,om,od)  // construit une fiche de résultat
{
   this.page = p;
   if (t == "") this.titre="<i>Pas de titre</i>";
   else this.titre = t;
   if (a == "") this.auteur="<i>Pas d'auteur spécifié</i>";
   else this.auteur = a;
   if (d == "") this.description="<i>Pas de description</i>";
   else this.description = d;
   this.occ = o;
   this.occMC = om;
   this.occDes = od;
}

function trouveRep(p,n)   // renvoie l'adresse du répertoire dans lequelle se trouve la page p, au niveau n (avec 1 = rep actuel, 2 = rep précédent...)
{
rep = "adresse incorrecte";

   for (bb=0;bb<n;bb++)
   {
      for (k=p.length-2;k>7;k--)
      {
          if (p.substr(k,1) == "/")
	      {
		     p = p.substr(0,k+1);
			 break
		  }
      }
   }
   rep = p;
   return rep;
}

function recomposeLiens()  // recompose les liens relatifs
{
 	for (j=0;j<liens.length;j++)
	{
     if (liens[j] != "")
	 {
	    l = liens[j].toLowerCase();
	    if ( (l.substring(0,7) != "http://") && (l.substring(0,6) != "ftp://") && (l.substring(0,9) != "gopher://") && (l.substring(0,9) != "telnet://") && (l.substring(0,7) != "mailto:") && (l.substring(0,5) != "news:") )
		{
		    if (l.substring(0,3) != "../")
			{
			   repertoire = trouveRep(page[boucle],1);
			   liens[j] = repertoire+liens[j];
			}
			else
			{
			   nb=1;
			   while (l.substring(0,3) == "../")
			   {
			      nb++;
				  l = l.substr(3);
			   }
			   repertoire = trouveRep(page[boucle],nb);
			   liens[j] = repertoire+l;
			}
		}
	 }
	}
}

function renvoieFin(l)  // renvoie le nom du fichier, ou du repertoire si un "/" n'a pas été mis
{
      for (k=l.length-1;k>0;k--)
      {
          if (l.substr(k,1) == "/")
	      {
		     l = l.substr(k+1);
			 break
		  }
      }   

	  if (l.search(/\./) == -1)
	     l = l+"/";
	  return l;
}


function elimineLiens()   // élimine les liens non valides (autre domaine, fichier non HTML)
{
 	for (j=0;j<liens.length;j++)
	{
	    l = liens[j].toLowerCase();
	    if ( ((l.substring(0,7) == "http://")&&(l.substring(0,ndb.length) != ndb)) || (l.substring(0,6) == "ftp://") || (l.substring(0,9) == "gopher://") || (l.substring(0,9) == "telnet://") || (l.substring(0,7) == "mailto:") || (l.substring(0,5) == "news:") || (l.substring(0,11) =="javascript:") )
		  liens[j]="";
		else
		{
		   l = renvoieFin(l);
		   if ( (l.search(/\//) == -1) && (l.search(/\..*htm/) == -1) )
		     liens[j]="";
		}
    }
}


function ajouteLiens()  // ajoute les liens à visiter (en éliminant les doublons, les liens exclus et/ou ceux qui n'appartiennent pas à la liste obligatoire)
{
  for (aj=0;aj<liens.length;aj++)
  {
      stocke = true ;
	  if (listeSeulement.length >0)
	  {
	      stocke = false;
		  for (ls=0;ls<listeSeulement.length;ls++)
		  {
		     if (listeSeulement[ls].substr(listeSeulement[ls].length-1) == "*")  // si c'est un répertoire entier qui est obligatoire
			 {
			    repObl = listeSeulement[ls].substr(0,((listeSeulement[ls].length)-1));
				if ( repObl == liens[aj].substr(0,repObl.length) )
				  stocke = true;
			 }
			 else
			 {
			    if (listeSeulement[ls] == liens[aj])
				  stocke = true;
			 }
		  }
	  }

	  if (listeSauf.length >0)
	  {
	      for (ls=0;ls<listeSauf.length;ls++)
		  {
		     if (listeSauf[ls].substr(listeSauf[ls].length-1) == "*")  // si c'est un répertoire entier qui est exclu
			 {
			    repExcl = listeSauf[ls].substr(0,((listeSauf[ls].length)-1));
				if ( repExcl == liens[aj].substr(0,repExcl.length) )
				  stocke = false;
			 }
			 else
			 {
			    if (listeSauf[ls] == liens[aj])
				  stocke = false;
			 }
		  }
	  }

      if (stocke)
	  {
	    for (ver=0;ver<page.length;ver++)
	    { 	  
	      if ( (liens[aj].toLowerCase() == page[ver].toLowerCase()) || (liens[aj] == "") )
		    stocke = false;
	    }
	    if ((stocke)&&(page.length<max))
		{
		    liens[aj] = vireEsp(liens[aj]);
			page[page.length]=liens[aj];
	    }
	  }
   }
}


function creeListe(s)   // crée un tableau avec les adresses passées en paramètre dans une seule chaîne
{
clTemp = new Array();

      pv = s.search(/;/);
	  
	  while (pv > -1)
	  {
	     sss = s.substr(0,pv);
		 if (sss.substr(0,1) == "/") sss = sss.substr(1);  // si l'adresse commence par un /, on le vire
	     clTemp[clTemp.length] = ndb+sss;
		 s = s.substr(pv+1);
		 pv = s.search(/;/);
	  }
	  if (s.substr(0,1) == "/") s = s.substr(1);
	  clTemp[clTemp.length] = ndb+s;
	  return clTemp;
}



function classe(res)
{
    classeRes = new Array();
	
 	for (va=0;va<res.length;va++)
	{
	    mT = 0;
		for (vb=0;vb<res.length;vb++)
		{
		    tOcc = (res[vb].occ)+(res[vb].occMC)+(res[vb].occDes);
			if (tOcc > mT)
			{
			   mT = tOcc;
			   ret = vb;
			} 
		}
		with (res[ret])
		{
		    classeRes[va] = new nvResul(page,titre,auteur,description,occ,occMC,occDes);
	    }
		res[ret].occ = 0;res[ret].occMC = 0;res[ret].occDes=0;		
	}
	return classeRes;
}



function affiche(res)
{
 	document.open();


/****************** DEBUT du code à personnaliser pour l'affichage  simple des résultats ******************/

	document.write("<HTML>\n<HEAD>\n<TITLE>KPSearch - Résultat de la recherche : "+requete+"</TITLE>\n"
				   +"</HEAD>\n<BODY BGCOLOR=\"#76AEE7\" TEXT=\"#000000\" LINK=\"#0000FF\" VLINK=\"#800080\" ALINK=\"#FF0000\">\n"
				   +"<center><TABLE BGCOLOR=\"#A6CAF0\" cellpadding=15><COL><TR><TD><center>\n"
				   +"<font face=\"Verdana,Arial\" size=5><b>KPSearch</b><br>"
				   +"<font size=1><i>Copyright <a href=\"http://perso.wanadoo.fr/laurent.le-coustumer/kpsearch/menu_kpsearch.htm\" "
				   +"target=\_blank\">Laurent Le Coustumer</a> 1999</FONT>"
				   +"</center></FORM></TD></TR></TABLE></center>");
				   
	if (resultats.length == 0)
	{
	   document.write("<font face=\"Verdana,Arial\" size=2>\n<BR><BR>&nbsp;&nbsp;&nbsp;Pas de résultats pour "+requete+" sur "+page.length+" page");
	   if (page.length >1) document.write("s");
	   document.write(".<BR><i>(Recherche sur mot ");
	   if (!exact) document.write("non ");
	   document.write("exact)</i><BR><hr>");
	}
	else
	{
	   document.write("<font face=\"Verdana,Arial\" size=2>\n<BR>&nbsp;&nbsp;&nbsp;"+resultats.length+" résultats pour \"<b>"+requete+"</b>\" sur "+page.length+" page");
	   if (page.length >1) document.write("s");
	   document.write(".<small>&nbsp;&nbsp;&nbsp;("+nbrTotalOcc+" occurence");
	   if (nbrTotalOcc > 1) document.write("s");
	   document.write(")</small><BR><i>(Recherche sur mot ");
	   if (!exact) document.write("non ");
	   document.write("exact)</i><BR><BR>");
	   for (rs=0;rs<resultats.length;rs++)
	   {
	   	  document.write(rs+1+" : ");
		  with (resultats[rs])
		  {
		     totalOcc = occ+occMC+occDes;
			 document.write("<b>"+titre+"</b>\n&nbsp;&nbsp;&nbsp;<small><font color=\"#007800\">("+totalOcc+" occurence");
			 if (totalOcc >1) document.write("s");
			 document.write(")</font></small><BR>\n");
			 document.write("<a href=\""+page+"\" target=\"_blank\">"+page+"</a><BR>");
			 if (chkPage && occ >0 && special == "o")
			 {
			     adr = page.substr(7);
				 if (exact) exa="1"; else exa="0";
				 reqT = requete;
				 nett = reqT.search(/ /);
				 while ( nett > -1)  // gestion des espaces, dont on décide qu'ils seront replacés à l'appel par des %
				 {
				     reqT = reqT.replace(" ","%");
					 nett = reqT.search(/ /);
				 }
				 document.write("\n<small><a href=\"affichage.htm?"+adr+"&&"+reqT+exa
				 +"\" target=\"_blank\">Voir cette page avec les occurences soulignées</a></small>\n<br>");
			 }
			 document.write(description);
			 document.write("<BR><BR>\n<hr>");
		  }
	   }	   
	}
	document.write("<BR><BR>\n<center><form><input type=\"button\" value=\"Nouvelle recherche\" onclick=\"history.back();\"></form></center>\n");	
	document.write("<BR><BR></font></BODY>\n</HTML>");

/****************** FIN du code à personnaliser pour l'affichage  simple des résultats ******************/

}



function valide(rr,ex,pA,plA)   // si la recherche est sur mot exact, teste si la requête trouvée est entourée des bons caractères
{
    if (ex)
	{
		if (plA > 0)
		{
		    t1 = false;
			cher = pA.substr(plA-1,1);
			if ( (cher ==",")|| (cher ==" ") || (cher == ";") || (cher == ":") || (cher =="!")|| (cher =="?") || (cher == ".") || (cher == "/") || (cher =="§")
			|| (cher =="(") || (cher == ")") || (cher == "\"") || (cher =="\'") || (cher =="<") || (cher == ">") || (cher == "-") || (cher =="+")
			|| (cher =="=") || (cher == "&") || (cher == "*") || (cher =="%")|| (cher =="$") || (cher == "\\") )
			    t1 = true;
		}
		else t1 = true;
		
		if (plA+rr.length <= pA.length)
		{
		    t2 = false;
			cher = pA.substr(plA+rr.length,1);
			if ( (cher ==",")|| (cher ==" ") || (cher == ";") || (cher == ":") || (cher =="!")|| (cher =="?") || (cher == ".") || (cher == "/") || (cher =="§")
			|| (cher =="(") || (cher == ")") || (cher == "\"") || (cher =="\'") || (cher =="<") || (cher == ">") || (cher == "-") || (cher =="+")
			|| (cher =="=") || (cher == "&") || (cher == "*") || (cher =="%")|| (cher =="$") || (cher == "\\") )
			    t2 = true;
		}
		else t2 = true;
		
		if (t1 && t2) return true;
		else return false;
		
	}
	else return true;
}


function cherche(frm)
{
   requete = frm.requete.value;
   ndb = frm.ndb.value;
   depart = frm.depart.value;
   seulement = frm.seulement.value;
   sauf = frm.sauf.value;
   max = frm.max.value;
   special = frm.special.value.toLowerCase();
   output = (frm.output.value).toLowerCase();
   
   chkPage = true;  // anciennement frm.chkPage.checked;   recherche sur le contenu des pages 
   chkMotsCles = false; // anciennement frm.chkMotsCles.checked;    recherche sur les mots-clés
   chkDescription = false ;  // anciennement frm.chkDescription.checked;   recherche sur les descriptions
   
   exact = frm.chkExact.checked;  // recherche sur mot exact ou non

   sortieOuvert = false ; // pour détecter si la fenêtre de sortie est ouverte
   etatOuvert = false; // pour détecter si la fenêtre d'état est ouverte
  
if (chkPage || chkMotsCles || chkDescription)  
{ 
  if (ndb != "") 
  {
   if (depart != "")
   {
    if (requete != "")
	{
	   listeSauf = new Array();
	   listeSeulement = new Array();
	   liens = new Array();
	   	   
	   if (ndb.substr(ndb.length-1) != "/")  // compose l'adresse complète de la première page
	  	  ndb = ndb+"/";
	   if (seulement != "")
	      listeSeulement = creeListe(seulement);
	   if (sauf != "")  // crée la liste des pages à ne pas visiter
	      listeSauf = creeListe(sauf);

	   if ( (max < 0) || (max =="") || ((!(max<0))&&(!(max>0))) )  // si max n'est pas un entier, ou est vide, ou est négatif, on impose max=40
	      max = 40;

	   page = new Array();
	   if (depart.substr(0,1) == "/") depart = depart.substr(1);  // si l'adresse commence par un /, on le vire
	   page[0] = ndb+depart;

	   if (listeSeulement.length >0)  // ajoute d'emblée les liens forcés qui sont des adresses de pages (et non des répertoires)
	   {
	      for (lseul=0;lseul<listeSeulement.length;lseul++)
		  {
		     if (listeSeulement[lseul].substr(listeSeulement[lseul].length-1) != "*")
			    liens[liens.length] = listeSeulement[lseul];
		  }
		  if (liens.length >0) ajouteLiens(); 
	   }  
		 
	   contenu = new String;
	   resultats = new Array();
	   boucle = 0;
	   nbrTotalOcc = 0;
       document.AplJava.init();
	   while (boucle < page.length)
	   {  
         if (!etatOuvert) 
		 {
		      var etat = open("vide.htm","etat","width=200 , height=140");   // ouvre une fenêtre pour afficher l'état de la recherche
		      etatOuvert = true;
		      etat.document.open();
		      etat.document.write("<HTML><HEAD><TITLE>Recherche en cours - KPSearch</TITLE></HEAD>\n"
		        +"<BODY BGCOLOR=\"#76AEE7\"><font face=\"Verdana,Arial\" size=\"2\">\n<center><b>KPSearch</b><BR>Recherche en cours :<BR><BR>"
		        +"Veuillez patienter...<br><br><b>(NE FERMEZ PAS CETTE FENETRE)</b></center></BODY></HMTL>");
		 }
		 cadre = false;
		 liens = new Array();
	   	 contenu = lit(page[boucle]);
		 if (contenu != "Acces interdit.")
		 {  
		   contenu = vireComm(contenu);   // vire les commentaires
		   extirpe_structure(contenu);
	       if ((frset1 != -1)&&(frset2 != -1))  // si la page contient une déclaration de frames
	       { 
		      cadre = true; 
	   	      f = (contenu.substring(frset1,frset2)).toLowerCase();
		      f = f.substring(tagfin(f)+1);
	   	      frsrc = f.search(/frame .*src/) ;
		      while (frsrc > -1)
		      {  
		         source = f.search(/src/);
			     liens[liens.length] = contenuGuill(f.substr(source));
		         f = f.substring(tagfin(f)+1);
			     frsrc = f.search(/frame .*src/) ;
		      }
	       }
	       corps = contenu.substring(debutcorps,fincorps);
	       corps = vireTag(corps);
		   corpsTemp = virecarHtmlSpeciaux(corps);
		   corpsTemp = vireSpec(corpsTemp).toLowerCase();
		   titreTemp = vireSpec(titre.toLowerCase());		   
		   requ = vireSpec(requete).toLowerCase();
		   occ = 0;
		   occMC = 0;
		   occDes = 0;
		   
		   aj = 0;
		   
	       if (chkPage)
		   {
		      corpsTemp2 = corpsTemp;
			  cherch = corpsTemp.search(requ); // cherche si la requete est présente dans la page, et compte combien de fois le cas échéant
		      while (cherch > -1)
		      {
				 if (valide(requ,exact,corpsTemp2,(cherch+aj)))
				     occ++;
				 aj += (corpsTemp.substr(0,(cherch+(requ.length)))).length;
				 corpsTemp = corpsTemp.substr((cherch+(requ.length)));
				 cherch = corpsTemp.search(requ);
		      }
			 /* cherch = titreTemp.search(requ);   // cherche si la requête est présente dans le titre
		      while (cherch > -1)
		      {
			     occ++;
				 titreTemp = titreTemp.substring(cherch+requ.length);
				 cherch = titreTemp.search(requ);
		      }*/
		   }
		   if ((motsclefs != "")&&(chkMotsCles))
		   {
			  mcTemp = vireSpec(motsclefs).toLowerCase();
		      cherch = mcTemp.search(requ); // cherche si la requete est présente dans les mots-clés, et compte combien de fois le cas échéant
		      while (cherch > -1)
		      {
			        occMC++;
			   	    mcTemp = mcTemp.substr(cherch+requ.length);
				    cherch = mcTemp.search(requ);
		      }
		   }
		   	
		   if ((description != "")&&(chkDescription))
		   {	   
		      desTemp = vireSpec(description).toLowerCase();
		      cherch = desTemp.search(requ); // cherche si la requete est présente dans la description, et compte combien de fois le cas échéant
		      while (cherch > -1)
		      {
			        occDes++;
				    desTemp = desTemp.substring(cherch+requ.length);
				    cherch = desTemp.search(requ);
		      }		
		   }		   
		   if ( ( ((chkPage)&&(occ > 0)) || ((chkMotsCles)&&(occMC > 0)) || ((chkDescription)&&(occDes > 0)) )&&(!cadre) ) // si on a trouvé la requête dans la page (et qu'elle ne déclare pas des frames), on stocke adresse, titre etc...
		   {
				nbrTotalOcc += occ + occMC + occDes;
				resultats[resultats.length] = new nvResul(page[boucle],titre,auteur,description,occ,occMC,occDes);
		   }

    	   if (liens.length > 0) // traite les éventuels liens trouvés
		   {
			  elimineLiens();
		   	  recomposeLiens();
			  ajouteLiens();
		   }		   
		   boucle++;

		   etat.document.open();
		   prct = boucle*(100/page.length);
		   etat.document.write("<HTML><HEAD><TITLE>"+boucle+" / "+page.length+" - KPSearch</TITLE></HEAD>\n"
		   +"<BODY BGCOLOR=\"#76AEE7\"><font face=\"Verdana,Arial\" size=\"2\">\n<center><b>KPSearch</b><BR>Avancement de la recherche :<BR><BR>"
		   +"<TABLE WIDTH=160 HEIGHT=12 BORDER=1 cellpadding=0 cellspacing=0><COL><TR><TD><img src=\"barre.jpg\" height=12 width="+(prct*1.5)+" align=left>"
		   +"<BR></TD></TR></TABLE><b>"+boucle+" / "+page.length+"</b></center><BR></BODY></HMTL>");
		   			   
		   if (output == "o")  // si l'option fenêtre de sortie (pour débogage notamment) est activée
		   {
		       if (!sortieOuvert) 
		       {
	  	          var sortie = open("vide.htm","sortie");
			      sortieOuvert = true;
				  sortie.document.open();
		       }
	       
		       sortie.document.write(boucle+"<BR>Page explorée : "+titre+"<BR>Adresse : "+page[boucle-1]+"<small><BR><BR>"+auteur+"<BR>"+description+"<BR>"+motsclefs+"<BR><BR>"+corps+"</small><BR><BR>Pages à explorer :"+((page.length)-boucle)+"<BR>");
		       for (pa=boucle;pa<page.length;pa++)
	           {
	   	           sortie.document.write(page[pa]+"<BR>");
	           }
		       sortie.document.write("<BR>"+resultats.length+" résultat(s) pour \""+requete+"\"<BR>");
		       for (r=0;r<resultats.length;r++)
		       {
		           sortie.document.write(r+1+") "+resultats[r].page+"<BR>"+resultats[r].titre+"<BR>");
			       sortie.document.write(resultats[r].occ+" occurence(s) dans la page");
				   //sortie.document.write(", "+resultats[r].occMC+" occurence(s) dans les mots-clés, "+resultats[r].occDes+" occurence(s) dans la description");
				   sortie.document.write("<BR><BR>");
		       }
		       /*for (li=0;li<liens.length;li++)
		       {
		           sortie.document.write("Lien "+(li+1)+liens[li]+"<BR>");
		       }*/
		       sortie.document.write("<BR><BR><HR><BR>");
		   }
		   if (boucle == max)
		   {
		      if (output == "o") sortie.document.close();
			  page.length = max;
			  break
		   }
		 }  // du if "acces inaccessible"
	    }  // du while
		
	if (output == "o") sortie.document.close(); 
	etat.close();
	
	if (resultats.length > 0) resultats = classe(resultats);
    document.AplJava.destroy();	
	affiche(resultats);
	
	}
	else messageErreur(2);  // pas de mots-clés		  
   }
   else messageErreur(1);   // pas de page de départ
  }
  else messageErreur(0);   // pas de ndb
}
else messageErreur(3);  // pas d'option cochée (page, description...)
}