function sort_mot_cle_alpha(mot_cle_1, mot_cle_2) {
	if(mot_cle_1.nom < mot_cle_2.nom)
		return -1;
	else if(mot_cle_1.nom == mot_cle_2.nom)
		return 0;
	else
		return +1;
}
var Jacquard = Class.create();
Jacquard.prototype = {
	/** Constructeur 
	 *	@param options_formulaire : les caractériques du formulaire de recherche
	 *		form : le formulaire de recherche
	 *		plein_texte : l'element input pour la recherche plein texte
	 *		select_mots_cles (optionnel) : le menu déroulant pour selectionner un mot-clé (utile dans l'admin)
	 *		new_mot_cle (optionnel) : le bouton pour créer un nouveau mot-clé
	 *		new_emission (optionnel) : le bouton pour créer une nouvelle émission
	 *
	 *	@param zones : les différentes zones à rafraichir en fonction des actions
	 *		lecteur : la zone de lecture du flux audio
	 *		script : la zone d'affichage du script d'une émission
	 *		resultats : la zone d'affichage des résultats de recherche
	 */
	initialize: function(options_formulaire, zones, admin, nouveautes, status_nouveautes) {
		//alert(status_nouveautes);
		this.status_nouveautes=status_nouveautes;
		this.nouveautes = nouveautes;
		//alert('-> '+siteRoot);
		//alert('nouveautes = '+nouveautes[1]);
		this.admin = admin;
		this.setOptions_form(options_formulaire);
		this.setZones(zones);
		/* Emission courante (dans le lecteur et le script) */
		this.emission = null;
		
		/* Objet Ajax.Request pour la communication client/serveur */
		this.ajax = null;
		this.url = "../composants_php/submit_recherche.php";
		
		/*variables pour naviguer les resultats de 5 en 5*/
		this.limit=undefined;
		this.nombre=undefined;
		
		/* Initialisation de la structure puis du comportement */
		this.setStructure();
		this.setBehaviour();
		this.setDefault(zones);
		
		//affiche les nouveautes
		//this.traite_nouveautes();
	},
	
	/** Enregistre les options concernant le formulaire de recherche */
	setOptions_form: function(options) {

		this.form_recherche = $(options_formulaire.form);
		this.input_plein_texte = $(options_formulaire.plein_texte);

		//lien pour afficher la fenêtre d'aide / accueil
		this.retour_accueil = $(options.retour_accueil);
		
		//lien pour afficher toutes les émissions (ajouté par JB Joulé Oct 2007
		this.liste = $(options.liste);	
		
		//lien pour afficher les nouveautes JB Joulé Oct 2007
		this.les_nouveautes=$(options.les_nouveautes);
		
		/* Si on est dans l'admin, on a des zones et des boutons en plus */
		if(options.select_mot_cle)	this.select_mot_cle = $(options.select_mot_cle);
		if(options.new_mot_cle)	this.new_mot_cle = $(options.new_mot_cle);
		if(options.new_emission) this.new_emission = $(options.new_emission);
		
		//détails de tous les mots_clés
		//alert(options.mots_cles[29].nb_emissions_liees);
		this.mots_cles = options.mots_cles;
		//alert(this.mots_cles);
	},
	
	setZones: function(zones) {
		/* Zone d'affichage : lecteur, script, résultats */
		//alert(zones.accueil);
		this.zone_accueil = $(zones.accueil);
		this.zone_lecteur = $(zones.lecteur);
		this.zone_script = $(zones.script);
		this.zone_resultats = $(zones.resultats);
		this.zone_nouveautes=$(zones.lesnouveautes);
		//alert (zones.lesnouveautes);//==> zone_nouveautes
		//this.zone_nouveautes.innerHtml="la zone ??";//ne donne rien
		//this.zone_nouveautes
		if(zones.modif_emission)		this.zone_emission = $(zones.modif_emission);
		if(zones.modif_mot_cle)			this.zone_mot_cle = $(zones.modif_mot_cle);
	},

	/** Détermine les valeurs par défaut qu'on affiche au chargement de la page */	
	setDefault: function(zones) {
		if(zones.emissions_resultats) {
			this.traite_resultats(zones.emissions_resultats);
		}

		if(zones.emission_lecteur && zones.emission_lecteur.id_emission > 0) {
			var emission_lecteur = new Emission(zones.emission_lecteur, this.box_resultats, this.box_lecteur, this.box_script, this.admin);
			emission_lecteur.ecouter();
		}

		if(zones.emission_script && zones.emission_script.id_emission > 0) {
			var emission_script = new Emission(zones.emission_script, this.box_resultats, this.box_lecteur, this.box_script, this.admin);
			emission_script.remplir_script();
		}
	},
	
	/** Initialise la structure HTML */
	setStructure: function(){
		
		/** Creation des infoboxs pour les différentes zones, fermées à l'initialisation */
		this.box_accueil = new InfoBox_accueil(this.zone_accueil, true);
		this.box_accueil.init_bis(this);
		this.box_accueil.open();
		this.box_accueil.expand();
		this.box_lecteur = new InfoBox_lecteur(this.zone_lecteur, true);
		this.box_lecteur.init_bis();
		
		this.box_script = new InfoBox_script(this.zone_script, true);
		this.box_script.init_bis();
		if(this.admin) {
			this.box_script.initialise_formulaire();
		}

		this.box_resultats = new InfoBox_resultats(this.zone_resultats, true);
		this.box_resultats.init_bis();
		this.box_resultats.setRole("nouveautes");
		//la ligne suivante dit a la box resultat de mettre a jour l'affichage de l partie qui sert a naviguer les resultats de 5 en 5
		
		this.traite_nouveautes();//probleme si box resultat n'est pas défini à ce stade
		this.box_resultats.open();
		this.box_resultats.expand();
		//this.box_resultats.collapse();
	
		/* Pour l'admin : 1 zone de plus pour modifier les mot_cles
		 * (ou pour le podcasting dans l'interface client ?)
		 */
		if(this.zone_mot_cle)	 {
			this.box_mot_cle = new InfoBox_mot_cle(this.zone_mot_cle, true);
			this.box_mot_cle.init_bis();
		}
	},
	
	/** Définit le comportement */
	setBehaviour: function(){
		/** A la soumission du formulaire, interrogation des resultats */
		var current = this;
		this.form_recherche.onsubmit = function() {current.reset_formulaire();};
		
		//retour à l'accueil / voir l'aide
		this.retour_accueil.onclick = function() {
			//réinitialisation de la recherche. Ajout D. Ruhlmann mai 2009
			current.form_recherche.reset();

			/* à l'ouverture de la fenêtre, on ferme les fenêtres de lecteur et script et on affiche les résultats*/
			current.box_script.close();
			current.box_lecteur.close();
			current.box_accueil.open();
			current.box_accueil.expand();
			current.box_resultats.open();
			current.box_resultats.setRole("nouveautes");
			current.traite_nouveautes();
			current.box_resultats.expand();
			current.box_accueil.refresh();
		};
		
		this.liste.onclick = function() {
			current.form_recherche.reset();
			current.reset_formulaire();
		};
		

		this.box_resultats.fleche_gauche.onclick = function() {
			nextLimit=current.limit-5;
			current.limit=Math.max(nextLimit,0);
			current.soumettre_formulaire();
		};
		this.box_resultats.fleche_droite.onclick = function() {
			current.limit=5+parseInt(current.limit);
			current.soumettre_formulaire();
		};
/*
On va calculer la valeur de la limite pointée par la premiere case
*/			
		this.setLimitCase1 = function(){
		
			var limitecase1;
			var pages_max=(Math.floor((((parseInt(current.nombre)-1))/5)))+1;
			var page_courante=1+((parseInt(current.limit))/5);
			if ((pages_max<10)||(page_courante<6)){
				limitecase1=0;
				//alert ("A");
			}
			else {
				if ((pages_max >9) && (page_courante>5) && ((pages_max - page_courante)>3)){
					limitecase1=(page_courante-5)*5;
					//alert ("B");
				}
				else {
					limitecase1=(pages_max - 9)*5;
					//alert ("C");
				}
			}
			//limitecase1=Math.floor(limitecase1);
			//alert("limitecase1="+limitecase1);
			return (limitecase1);
		
		};
/*-----------------------------------------------------------------------------------------------------------*/
//on va permettre a chaque case de pointer vers la bonne page paginée
	
		this.box_resultats.case1.onclick = function(){
			//current.limit=
			var newlimit=current.setLimitCase1();
			current.limit=parseInt(newlimit);
			current.soumettre_formulaire();
		};
		this.box_resultats.case2.onclick = function(){
			//current.limit=
			var newlimit=5+current.setLimitCase1();
			current.limit=parseInt(newlimit);
			current.soumettre_formulaire();
		};
		this.box_resultats.case3.onclick = function(){
			//current.limit=
			var newlimit=10+current.setLimitCase1();
			current.limit=parseInt(newlimit);
			current.soumettre_formulaire();
		};
		this.box_resultats.case4.onclick = function(){
			//current.limit=
			var newlimit=15+current.setLimitCase1();
			current.limit=parseInt(newlimit);
			current.soumettre_formulaire();
		};
		this.box_resultats.case5.onclick = function(){
			//current.limit=
			var newlimit=20+current.setLimitCase1();
			current.limit=parseInt(newlimit);
			current.soumettre_formulaire();
		};
		this.box_resultats.case6.onclick = function(){
			//current.limit=
			var newlimit=25+current.setLimitCase1();
			current.limit=parseInt(newlimit);
			current.soumettre_formulaire();
		};
		this.box_resultats.case7.onclick = function(){
			//current.limit=
			var newlimit=30+current.setLimitCase1();
			current.limit=parseInt(newlimit);
			current.soumettre_formulaire();
		};
		this.box_resultats.case8.onclick = function(){
			//current.limit=
			var newlimit=35+current.setLimitCase1();
			current.limit=parseInt(newlimit);
			current.soumettre_formulaire();
		};
		this.box_resultats.case9.onclick = function(){
			//current.limit=
			var newlimit=40+current.setLimitCase1();
			current.limit=parseInt(newlimit);
			current.soumettre_formulaire();
		};		
	
		this.les_nouveautes.onclick = function() {
		//alert("les nouveautes");
			current.box_script.close();
			current.box_lecteur.close();
			current.box_resultats.collapse();
			current.box_accueil.open();
			current.box_accueil.collapse();
			current.box_resultats.setRole("nouveautes");
			current.traite_nouveautes();
			current.box_resultats.open();
			current.box_resultats.expand();
			current.box_accueil.refresh();
		};
		
		/* Pour l'admin : Comportement au clic sur les divs new_mot_cle et new_emission */
		if(this.new_mot_cle) {
			this.new_mot_cle.onclick = function() {
				current.nouveau_mot_cle();
			};
		}
		if(this.new_emission) {
			this.new_emission.onclick = function() {
				current.nouvelle_emission();
			};
		}
	},
	
	reset_formulaire: function(){//pour soumettre le formulaire avec une nouvelle requete (bouton "rechercher")
		this.limit=undefined;
		this.nombre=undefined;
	//	this.box_resultats.
		this.soumettre_formulaire();
	},
	/** Soumission du formulaire : envoi d'une requête au serveur */
	soumettre_formulaire: function() {//pour soumettre le formulaire en navigauant dans une requete existante (page suivante, page precedente, etc...
		//on réduit les autres fenêtres : résultats, podcast et script
		//this.box_mot_cle.close();
		this.box_accueil.close();
		this.box_mot_cle.collapse();
		//this.box_script.close();
		this.box_script.collapse();
		//this.box_resultats.close();
		this.box_resultats.setRole("resultats");
		//this.box_resultats.format_nav();
		this.box_resultats.wait();
		this.box_resultats.open();
		this.box_resultats.expand();

		//arrêt de la requete en cours s'il y en a une
		if(this.ajax && this.ajax.transport && this.ajax.transport.readyState != 4) {
			this.ajax.transport.abort();
		}
		//lancement d'une nouvelle requete
		var params = Form.serialize($(this.form_recherche));
		//alert(params);
		var current = this;
		// this.url = "../composants_php/submit_recherche.php"
		params+="&nombre="+this.nombre+"&limit="+this.limit;
		//alert(params);
		//alert (params);
		this.ajax = new Ajax.Request(this.url, {
			method: 'post',
			parameters: params,
			onSuccess: function(xhr) {
				//alert(xhr.responseText);
				//var emissions = eval(xhr.responseText);
				var emissions = eval("(" + xhr.responseText + ")"); 
				current.nombre=emissions["nombre"];
				current.limit=emissions["limit"];
				emissions = eval("(" + emissions["emissions"] + ")"); 
				//current.nombre=emissions.length;
				//alert (current.nombre);
				//alert(emissions.nombre);
				current.traite_resultats(emissions);
				current.box_resultats.format_nav(current.nombre, current.limit);
			},			
			onFailure: function(xhr) {
				current.traite_erreur(xhr);
			},			
			onException: function(xhr, e) {
				current.traite_exception(xhr, e);
			}
		});
	},
	
	
	traite_nouveautes: function(){
		//alert ("traite-nouveautes");
		var nouveautes=this.nouveautes;//un tableau qui contient les 5 dernieres nouveautes
		var status_nouveautes=this.status_nouveautes;//une chaine de caractères quidonne le nombre de nouveautés à la date du jour
		//alert('traite_nouveautes dans Jacquard.js dit : '+nouveautes[1]);
		//this.box_nouveautes.zone_resultats.innerHTML='Nouveau :';//encore faut il q
		//$("nouveautes_content").innerHTML = 'traite_nouveautes essaye d\'ecrire quelque chose et ca marche';
		//var zone_resultats =$("nouveautes_content");
		//zone_resultats.innerHTML="Nouveautes : ";//ce qui fonctionne .. 
		//deux lignes suivantes servent en test
		this.box_resultats.flush();
		this.box_resultats.set_status(status_nouveautes);
		//this.box_resultats.setRole("nouveautes");
		
		//#########################
		for(var i=1; i<6; i++){
			//alert (nouveautes[i]);
			//eval("monemission = nouveautes[i]");
			var monemission = eval('(' + nouveautes[i] + ')');
			
			//alert (monemission);
			var emission_resultat = new Emission(monemission, this.box_resultats, this.box_lecteur, this.box_script, this, this.admin);
			//Ajout de l'emission dans la zone de résultats
			//emission_resultat.ajoute_resume();//envoie malheureusement l'émission dans l'infobox resultats
			emission_resultat.ajoute_nouveau();
		}
		this.box_resultats.open();
		this.box_resultats.expand();
		//this.box_resultats.close();//provisoirement
	},
	
	/** Récupère et met en forme les résultats d'une requête */
	traite_resultats: function(emissions) {
		//on cache la fenêtre d'accueil au chargement des résultats
		this.box_accueil.close();
		//vidage des résultats précédents
		//this.box_resultats.body.innerHTML = '';
		this.box_resultats.zone_resultats.innerHTML = '';
		//affichage (et vidage si nécéssaire) de la zone de résultats
		this.box_resultats.open();
		this.box_resultats.expand();
		//uneEmission=emissions[1];
		//uneString=uneEmission.toJSONString();
		//uneString=uneEmission.toJSONString();
		//msg='jacquard.js fonction traite.resultats() emissions[1] = '+uneString;
		//alert (msg);
		for(var i=0; i<emissions.length; i++) {
			var emission_resultat = new Emission(emissions[i], this.box_resultats, this.box_lecteur, this.box_script, this, this.admin);
			//Ajout de l'emission dans la zone de résultats
			emission_resultat.ajoute_resume();
		}
		/* A VOIR : peut-être pas systématiquement à l'envoi du formulaire
		 * Si un mot-clé est selectionné, on le charge dans sa fenêtre pour le podcast
		 * Pour les admin, permet de le modifier
		 */
		if(this.box_mot_cle) {
			//if( ($F(this.select_mot_cle) > 0) && (! this.box_mot_cle.estVisible()) ) {
			if( ($F(this.select_mot_cle) > 0)) {				
				//Chargement du mot-clé
				for(var i=0; i<this.mots_cles.length; i++) {
					//alert(i+' : '+this.mots_cles[i].id_mot_cle)
					if(this.mots_cles[i].id_mot_cle == $F(this.select_mot_cle))
						var mot_cle_json = this.mots_cles[i];
				}
				//alert(mot_cle_json.nom);
				//var mot_cle_json = {id_mot_cle: $F(this.select_mot_cle), nom: $(this.select_mot_cle).options[$(this.select_mot_cle).selectedIndex].text};
				var mot_cle_en_cours = new Mot_cle(mot_cle_json, this.box_mot_cle, this);
				//var podcast = 'S\'abonner au podcast pour le thème '+ $('mot_cle').options[$('mot_cle').selectedIndex].text +'';
				
				var podcast = 'S\'abonner au podcast pour ce thème ';
				//je veux vérifier si j'ai l'id du mot clé (ce qui reient a avoir le numéro du podcast)
				// je vais  disséquer (  mot_cle_json  );
				/*
				msg="";
				for (i in mot_cle_json) {
				msg+=i+"\n>";  
				}
				alert(msg);
				*/
				//alert (mot_cle_json.url_podcast);
				url=mot_cle_json.url_podcast;
				//modif JB j'envoie l'URL en argument pour permettre a mot_cle.js de construire un lien vers le podcast
				this.box_resultats.setPodcast(podcast, this.box_mot_cle,url);
				this.box_mot_cle.close();
				//mot_cle_en_cours.affiche_details();
			}
			else {
				this.box_resultats.cacherPodcast();
			}
		}
//termes de recherche et éventuellement podcast
		var recherche = '';
		var podcast = '';
		/*
			alert(this.nombre+" - "+this.limit);
			this.box_resultats.format_nav(this.nombre,this.limit);
		*/
		//gestion du pluriel : on met un s a partir de 2 emissions
		var plural="";
		if (this.nombre>1){
			plural="s";
		}
		if (($F('mot_cle') > 0)  && ($F('plein_texte') != '') ){//cas ou on recherche sur les deux criteres
			recherche += this.nombre+' émission'+plural+' pour le thème <span style="font-weight: bold;">'+ $('mot_cle').options[$('mot_cle').selectedIndex].text +'</span> contenant l'+"'"+'expression <span style="font-weight: bold;">'+$F('plein_texte')+'</span>';
		}
		else  {//cas ou on ne recherche pas les deux criteres mais soit l'un soit l'autre soit aucun
			//alert("un critere maxi");
			if (($F('mot_cle') == -1) && ($F('plein_texte') == '')){//cas de la recherche sans aucun critère (toutes les émissions)
				recherche += this.nombre+' émissions au total';
			}
			else {//un critère et un seul
				//alert ("un seul critere");
				if($F('mot_cle') > 0) {//recherche sur une catégorie
					recherche += this.nombre+' émission'+plural+' pour le thème <span style="font-weight: bold;">'+ $('mot_cle').options[$('mot_cle').selectedIndex].text +'</span>';
				}
				// else if($F('plein_texte') != '') {//recherche plein texte
				else {//plein texte seulement
					/*if(recherche != '') {
						recherche += ', ';
					}*/
					recherche = this.nombre+' émission'+plural+ " contenant l'expression "+'<span style="font-weight: bold;">'+$F('plein_texte')+'</span>';
				}
			}
		}

		
		if(emissions.length != 0) {
			//this.box_resultats.change_sousTitre(sous_titre);
			this.box_resultats.setTermes_recherche(recherche);
		}
		else {
			/* Code ajouté par JBJ pour signaler si un mot clé n'est pas utilisé*/
			/* modif par jb joulé pour le cas ou le mot clé n'est pas utilisé
			this.box_resultats.cacherTermes_recherche();
			*/
			this.box_resultats.setTermes_recherche("Aucun résultat pour votre recherche");
			/* fin de modif JB*/
		}
	},

	
	traite_erreur: function(xhr) {
		alert("Erreur : "+xhr.statusText);
	},
	
	traite_exception: function(xhr, e) {
		alert("Exception : "+e.message+' : ligne '+e.lineNumber+', fichier '+e.fileName);
	},

	/** 
	 * Fonctions pour l'admin :
	 *		- nouveau mot_cle
	 *		- nouvelle emission
	 *		- rafraichissement de la liste des mots_clés
	 */
	nouveau_mot_cle: function() {
		var mot_cle_json = {id_mot_cle: -1, nom: '', emissions_liees: []};
		var mot_cle = new Mot_cle(mot_cle_json, this.box_mot_cle, this);
		mot_cle.setStructure();
		mot_cle.afficheFormulaire();

		this.box_accueil.close();
	},
	
	nouvelle_emission: function() {
		var emission_json = {id_emission: -1};
		var emission = new Emission(emission_json, this.box_resultats, this.box_lecteur, this.box_script, this, this.admin);

		emission.remplir_script();
		emission.montrer_script();
		emission.afficheFormulaire_script();

		this.box_accueil.close();
	},
	
	//rafraichir_mots_cles: function(liste_mots_cles) {
	rafraichir_mots_cles: function(id_mot_cle_en_cours) {
		id_mot_cle_selectionne = (id_mot_cle_en_cours) ? id_mot_cle_en_cours : -1;
	
		//suppression des options
		while(this.select_mot_cle.options.length > 1) {
			this.select_mot_cle.remove(1);
		}

		//conversion de this.mots_cles en tableau, pour le trier
		var mots_cles = new Array();
		for(index in this.mots_cles) {
			if(!isNaN(index)) {
				mots_cles.push(this.mots_cles[index]);
				//alert(this.mots_cles[index]);
			}
		}
		

		this.mots_cles = mots_cles.sort(sort_mot_cle_alpha);


		for(var i=0; i<this.mots_cles.length; i++) {
			
			var option = document.createElement('option');
			option.text = this.mots_cles[i].nom;
			option.value = this.mots_cles[i].id_mot_cle;

			if(this.mots_cles[i].id_mot_cle == id_mot_cle_selectionne)
				option.selected = true;

			try {			
				this.select_mot_cle.add(option, null);
			}
			catch(e) {
				this.select_mot_cle.add(option);
			}
		}
		this.soumettre_formulaire();
	},
	
	/** 
		Créée le 5 octobre 2007 par Lucille : selection d'une émission par les nouveautés
		et affichage comme un résultat de recherche
		@param emission : l'objet json decrivant l'émission à afficher
	 */
	selectionne_nouveaute: function(emission) {
		alert("selectionne_nouveaute dans jacquard.js");
		//on cache la fenêtre d'accueil au chargement des résultats
		this.box_accueil.collapse();
		//vidage des résultats précédents
		this.box_resultats.zone_resultats.innerHTML = '';
		//affichage (et vidage si nécéssaire) de la zone de résultats
		this.box_resultats.open();
		this.box_resultats.expand();
		var emission_resultat = new Emission(emission, this.box_resultats, this.box_lecteur, this.box_script, this, this.admin);
		//Ajout de l'emission dans la zone de résultats
		emission_resultat.ajoute_resume();
	}
};
