var FAILURE = 0;
var SUCCESS = 1;
var TOO_MANY_RESULTS = 2;

var DerniereRecherche=null;
var Recherches=[];

/**
* Accrocher une fonction sur la modification du texte.
* Donner le focus au champ pour faciliter l'utilisation.
* Déclencher l'évenement keyUp au chargement pour afficher les résultats directement
*/
$(function()
{
	$('form').bind('submit',function(){return false;});
	$('#search').bind('keyup mouseup',onChange);
	$('#search').triggerHandler('keyup');
	$('#search').focus();
});

/**
* Passer le champ getAnchor en bleu même s'il a déjà été visité.
* Le faire pointer vers le bon lien
*/
$(function()
{
	$('#getAnchor').css('color','blue');
});

/**
* Déclenchée sur la modification du champ de texte, génére la requête AJAX pour récupérer les résultats.
* Utilise une stratégie de mise en cache pour ne pas surcharger inutilement le serveur
*/
function onChange()
{
	//Récupérer le masque pour un accès rapide
	Masque = $('#search').val();

	//Ne pas refaire la même requête deux fois de suite
	if(DerniereRecherche == Masque)
		return;
	DerniereRecherche = Masque;

	//Ne pas réeffectuer les anciens appels
	if(Recherches[Masque])
	{//La recherche est déjà effectuée : resservir directement l'ancien fichier XML
		getData(Recherches[Masque]);
	}
	else
	{//Sinon on n'y coupe pas, il faut effectuer la recherche et récupérer un XML
		$.ajax(
		{
			url: "script/query.php",
			cache: true,
			success:getData,
			data:{Mot:Masque},
			dataType:"xml"
		});
	}

	//Mettre à jour le champ pour récupérer une ancre
	$('#getAnchor').attr('href','http://cruciverbiste.neamar.fr/?Mot=' + Masque);
}

/**
* Récupère les données depuis le serveur.
* Exemple de fichier XML retourné :
* <?xml version="1.0" encoding="iso-8859-1"?>
* <resultats>
* 	<recherche>j_u___ux</recherche>
* 	<statut success="1">OK</statut>
* 	<mots>
* 		<mot>journaux</mot>
* 	</mots>
* </resultats>
*
* recherche : la recherche pour laquelle ce document XML s'applique. Si le document arrive en retard, on ne le traite donc pas.
* statut : si success=1, inutile. Sinon, contient le message d'erreur
* mots : la liste des mots correspondants.
*/
function getData(xml)
{
	//Mettre en cache le résultat pour un futur appel
	Recherches[$(xml).find('recherche').text()]=xml;

	//Quitter si on est sur le résidu d'un ancien appel.
	if(DerniereRecherche != $(xml).find('recherche').text())
		return;

	//Vérifier le succés de l'opération avec le noeud success :
	if($(xml).find('statut').attr('success')==FAILURE)
		$('#resultats').html('<strong>Échec : </strong><span class="failure">' + $(xml).find('statut').text() + '</span>');
	else
	{
		$('#resultats').html('<span class="success">OK</span>');
		if($(xml).find('statut').attr('success')==SUCCESS)
		{
			if($(xml).find('mots mot').length==1)
				$('#resultats').html('<p class="success">Mot trouvé !');
			else
				$('#resultats').html('<p class="success">' + $(xml).find('mots mot').length + ' mots trouvés.');
		}
		else if($(xml).find('statut').attr('success')==TOO_MANY_RESULTS)
			$('#resultats').html('<p class="success">Trop de mots correspondent, seuls les '+ $(xml).find('mots mot').length + ' premiers résultats sont affichés.');

		$('#resultats').append('<ol id="resultats_mots"></ol>');
		$(xml).find('mots mot').each(mettreEnForme);
	}
}

/**
* Met en forme un mot brut (exemple : "journal" pour une sortie HTML stylable par CSS :
* <li class="resultat"><span class="letter find">j</span><span class="letter given">o</span><span class="letter find">u</span><span class="letter given">r</span><span class="letter given">n</span><span class="letter given">a</span><span class="letter find">u</span><span class="letter find">x</span></li>
*/
function mettreEnForme()
{
	var Masque=$('#search').val();
	var resultat=$(this).text();
	var resultatMEF='';

	//Erreur, tout arrêter.
	if(Masque.length!=resultat.length)
		return false;

	for(var i=0;i<resultat.length;i++)
	{
		if(Masque.charAt(i)=='_')
			resultatMEF += '<span class="letter given">' + resultat.charAt(i) + '</span>';
		else
			resultatMEF += '<span class="letter find">' + resultat.charAt(i) + '</span>';
	}
	$('#resultats_mots').append('<li class="resultat">' + resultatMEF + '</li>');
}

