// ----------------------------------
// Moteur de recherche
// Auteur  : Rui Nibau (http://www.omacronides.com)
// URL     : http://www.omacronides.com/informatique/web/web-moteur-recherche-js.html
// Date    : 22 juillet 2005
// Licence : By-Nc-Sa (http://creativecommons.org/licenses/by-nc-sa/2.0/fr/)
// Ver.    : 1.0
// ----------------------------------

// variables personnalisées
// Identifiant du formulaire
FormId = "f-search";

// ----------------------------------
// Effectuer la recherche
// ----------------------------------
function SearchItem(txt) {
	// Transformer les espaces en "+"
	txt = unescape(txt);
	// xxxxx
	if (txt == "Saisir un mot clé") {
		alert("Entrez un mot pour la recherche");
	}	
	else {	
//	    fForm.elements["mot"].value = txt;
		// nb: variable pour stocker le nb de résultats
		nb = 0;
		// Boucles pour différentes options
		// Si symbole "+", recherche "ET"
		if (txt.indexOf('+',0) > 0) {
			SearchAnd(txt);
		}
		// Si symbole "|", recherche "OU"
		else if (txt.indexOf('|', 0) >0) {
			SearchOr(txt);
		}
		// sinon, recherche simple
		else {
			SearchOne(txt);
		}
		// Afficher les résultats
		DisplayResult(txt);
	}
}

// -----------------------------
// Trouver un mot
// SearchOne(db,str)
// db  -> Base de données
// str -> mot à chercher
// -----------------------------
function SearchOne(str) {
	// Pour toutes les lignes de la bdd
	// Boucle à itération négative: si les entrées de la bdd sont classées par
	// ordre chronologique, cette boucle négative va permettre d'obtenir une liste
	// de résultat dans l'ordre chronologique inverse, soit le plus récent en premier.
	//for (var l = ddb.length - 1; l >= 0; l--) {
	  for (var l = 0; l<ddb.length; l++) {
		// si le mot à chercher se trouve dans la cellule mots-clés de l'entrée de la bdd
		if (ddb[l][2].toUpperCase().indexOf(str.toUpperCase(),0)!="-1") {
			// Création de la liste
			CreerListe(l);
			//Incrémenter nb pour le nombre final de résultats
			nb++;
		}
	}
}

// -----------------------------
// Trouver plusieurs mots ET
// SearchAnd(db,str)
// db  -> base de données
// str -> mots à chercher: mot1+mot2...
// -----------------------------
function SearchAnd(str) {
	// Couper le mot au niveau des "+". Le tableau sWord est alors formé
	// de tous les mots à chercher: sWord[0]=mot1, sWord[1]=mot2, etc.
	var sWord = str.split('+');
	// Pour Toutes les lignes de la bdd
	// Boucle à itération négative. voir ci-dessus.
	//for (var l = ddb.length - 1; l >= 0; l--) {
	for (var l = 0; l<ddb.length; l++) {
		// Définition d'une variable "indent". Elle va nous permettre de vérifier
		// que tous les mots cherchés sont bien dans l'entrée de la bdd analysée.
		var indent = 0;
		// Pour tous les mots
		for (var e = 0; e < sWord.length; e++) {
			// Si le mot cherché est présent dans l'entrée de la bdd
			if(ddb[l][2].toUpperCase().indexOf(sWord[e].toUpperCase(),0)!="-1") {
				// incrémenter "indent"
				indent++;
			}
		}
		// Si Indent est égal au nombre de mot dans le tableau sWord, c'est que
		// tous les mots cherchés sont bien dans cette entrée de la bdd.
		if (indent == sWord.length) {
			// Donc création de la liste
			CreerListe(l);
			// Incrémenter nb pour le nombre final de résultats
			nb++;
		}
	}	
}

// -----------------------------
// Trouver plusieurs mots: OU
// SearchOr(db,str)
// db  -> base de données
// str -> mots à cherchés: mot1|mot2...
// -----------------------------
function SearchOr(str) {
	// Couper le mot au niveau des "|". Le tableau sWord est alors formé
	// de tous les mots à chercher: sWord[0]=mot1, sWord[1]=mot2, etc.
	var sWord = str.split('|');
	// Pour toutes les lignes de la bdd
	// Boucle à itération négative. voir ci-dessus.
	//for (var l = ddb.length - 1; l >= 0; l--) {
	for (var l = 0; l<ddb.length; l++) {
		// Définition d'une variable "indent". Elle va nous permettre de vérifier
		// qu'au moins un des mots cherchés est dans l'entrée de la bdd analysée.
		var indent = 0;
		// Pour chaque mot
		for (var o = 0; o < sWord.length; o++) {
			// Si le mot cherché est présent dans l'entrée de la bdd
			if(ddb[l][2].toUpperCase().indexOf(sWord[o].toUpperCase(),0)!="-1") {
				// incrémenter "indent"
				indent++;
			}
		}
		// Si indent est positif (>0), alors au moins un des mots recherchés
		// est présent dans l'entrée de la bdd analysée.
		if (indent > 0) {
			// Donc réation de la liste
			CreerListe(l);
			// Incrémenter nb pour le nombre final de résultats			
			nb++;
		}
	}
}

// -----------------------------
// Création de la liste des résultats
// CreerListe(db, l)
// db  -> base de données
// l -> mots à cherchés: mot1|mot2...
// -----------------------------
function CreerListe(l) {
	// Construire le lien pour l'entrée
	var a = document.createElement('a');
	a.setAttribute('href', ddb[l][1]);
	a.setAttribute('title', 'Lire');
	a.appendChild(document.createTextNode(ddb[l][0]));
	// Construire la liste li
	var li = document.createElement('li');
	li.appendChild(a);
	// Incrémenter la liste ordonnée lResult
	lResult.appendChild(li);
}

// -----------------------------
// Afficher le résultat
// DisplayResult(w)
// w  -> mot(s) à chercher
// -----------------------------
function DisplayResult(w) {
	// Le résultat de la recherche est inséré avant le formulaire
	// Titre du résultat
	var hResult = document.createElement('h2');
	hResult.appendChild(document.createTextNode('Résultats de la recherche'));
	fForm.insertBefore(hResult);
	// paragraphe pour présenter les résultats
	var pResult = document.createElement('p');
		pResult.className='1';
	// Dans le paragraphe, mettre le(s) mot(s) recherché(s) en 'italique'
	var waResult = document.createElement('em');
	waResult.appendChild(document.createTextNode(w));
	waResult.className='search';
	// Si le nb de résultats est positif
	if (nb > 0) {
		(nb == 1) ? Phrase = ' résultat trouvé pour le(s) mot(s) ' : Phrase = ' résultats trouvés pour le(s) mot(s) ';
		pResult.appendChild(document.createTextNode(nb));
		pResult.appendChild(document.createTextNode(Phrase));
		pResult.appendChild(waResult);
		pResult.appendChild(document.createTextNode('.'));
		// Finalement, insérer le paragraphe de présentation des résultats
		fForm.insertBefore(pResult);
		// et la liste ordonnée des entrées trouvées
		fForm.insertBefore(lResult);
		lResult.className='result';
	}
	// si nb = 0
	else {
		pResult.appendChild(document.createTextNode('Aucun résultat pour le(s) mot(s) '));
		pResult.appendChild(waResult);
		pResult.appendChild(document.createTextNode('.'));
		fForm.insertBefore(pResult);
	}
}

// -----------------------------
// Initialisation de la recherche
// -----------------------------

function Search() {
	// Liste ordonnée qui contiendra les résultats
	lResult = document.createElement('ol');

	// formulaire dans l'arborescence
	fForm = document.getElementById(FormId);



	// Formulaire
	var Bouton = fForm.chercher;
	var ChampMot = fForm.mot;
	// Vérifier saisie du mot
	if (ChampMot)
	{
	ChampMot.onfocus = function (e) {if (this.value == 'Saisir un mot clé') { this.value = '';}}
	ChampMot.onblur= function(e) {if (this.value == '') { this.value = 'Saisir un mot clé'; }}
	}
	// Lancer la recherche
	if (Bouton)
	{
	Bouton.onclick = function (e) {fForm.submit();}
	}



	// Analyser l'URL: on récupère l'url: s'il y a eu soumission d'un mot dans le champ
	// de recherche, l'url est de la forme: recherche.html?mot=mot_a_chercher
	var url = document.location.href;
	// si l'expression "?mot=" se trouve dans l'url
	if (url.indexOf('?mot=',0) > 0) {
		// on nettoie l'url pour ne garder que "mot_a_chercher"
		mot = url.substring(url.indexOf("?mot=",0)+5); 
		if (mot.indexOf("&", 0)>0)
		mot = mot.substring(0, mot.indexOf("&", 0));
		// On lance la recherche
		SearchItem(mot);
	}
}


// Lancement de la fonction au chargement de la page
window.onload = function () {
	// Vérification que le javascript est activé. Si oui,
	// afficher le formulaire et cacher le message d'avertissement.
	if (document.getElementById('f-search')){
		document.getElementById('js-warning').style.display = 'none';
		document.getElementById('f-search').style.display = 'block';
	}
	// initialiser la fonction de recherche
	Search();
}
