Subversion Repositories eFlore/Applications.eflore-consultation

Rev

Rev 785 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
119 aurelien 1
/**-------------------------- Objets globaux -----------------------------------*/
2
/*
3
 * Les variables suivantes sont ajoutée automatiquement dans le squelette du moteur de
4
 * recherche par php, elles sont commentées ici pour qu'elles n'aient pas l'air
5
 * de sortir de la cuisse de Jupiter
6
 *
457 jpm 7
 * var AUTOCOMPLETION_ELEMENTS_NBRE : indique le nombre d'éléments à afficher dans la liste d'autocomplétion.
8
 *
9
 * var URL_SERVICE_AUTOCOMPLETION_NOM_SCI : url de base du service de complétion de noms scientifiques
119 aurelien 10
 * pour le projet en cours de consultation.
11
 * Exemple : http://localhost/service:eflore:0.1/bdtfx/noms?recherche=etendue&retour.format=min&masque=Ace%mo
12
 *
457 jpm 13
 * var URL_SERVICE_AUTOCOMPLETION_NOM_VERNA : url de base du service de complétion de noms vernaculaires
119 aurelien 14
 * pour le projet en cours de consultation.
131 delphine 15
 * Exemple : http://localhost/service:eflore:0.1/nvjfl/noms-vernaculaires?recherche=etendue&retour.format=oss&masque=aca&masque.lg=fra
119 aurelien 16
 *
457 jpm 17
 * var VALEUR_DEFAUT_NOM_SCI : Contient la valeur par défaut affichée dans le formulaire en mode sci
119 aurelien 18
 * Exemple: Rechercher un nom scientifique
457 jpm 19
 *
20
 * var VALEUR_DEFAUT_NOM_VERNA : Contient la valeur par défaut affichée dans le formulaire en mode verna
119 aurelien 21
 * Exemple: Recherche un nom commun
22
 */
23
 
724 mathilde 24
var champs_ts = ["#au","#and","#anf","#nom","#bib"];
785 aurelien 25
var autocompletionFicheOuverte = false;
26
var elementAutocompletionSelectionne = null;
27
var nomRechercheEnCours = null;
724 mathilde 28
 
457 jpm 29
$(document).ready(function() {
724 mathilde 30
	ajouterAutocompletion();
31
	ajouterActionClicSurTexteRecherche(champs_ts);
32
	gererAffichageValeursParDefaut(champs_ts);
33
	afficherValeurParDefaut(champs_ts);
785 aurelien 34
	gererAccesFicheFlecheDroite();
457 jpm 35
});
119 aurelien 36
 
457 jpm 37
/**------------------- Fonctions de gestion de l'autocompletion ---------------------------------*/
724 mathilde 38
function ajouterAutocompletion(){
39
		ajouterAutocompletionNoms();
40
		$('.champ_autocomplete').each(function(index) {
41
			ajouterAutocompletionAvancee($(this));
42
		});
43
}
44
 
45
function ajouterAutocompletionAvancee(champs){
46
			champs.autocomplete({
47
				source: function(requete, add){
48
				// la variable de requête doit être vidée car sinon le parametre "term" est ajouté
49
					requete = "";
50
					var id = champs.attr('id');
51
					var url = getUrlAutocompletionAvancee(id);
52
						$.getJSON(url, requete, function(data) {
53
					var suggestions = [];
54
					suggestions = traiterRetourAvance(data,champs);
55
					add(suggestions);
56
					});
57
				},
58
	        	html: true
59
			});
60
 
61
}
785 aurelien 62
 
457 jpm 63
function ajouterAutocompletionNoms() {
64
	$('#nom').autocomplete({
65
		source: function(requete, add){
66
			// la variable de requête doit être vidée car sinon le parametre "term" est ajouté
67
			requete = "";
68
			var url = getUrlAppelCompletion();
724 mathilde 69
			$.getJSON(url, requete, function(data) {
457 jpm 70
				var suggestions = [];
71
				if (nomVernaculaireEstDemande()) {
72
					suggestions = traiterRetourNomsVerna(data);
73
				} else if (nomSciEstDemande()) {
74
					suggestions = traiterRetourNomsSci(data);
75
				}
76
				add(suggestions);
77
            });
78
        },
785 aurelien 79
        search: function(event, ui) {
80
        	nomRechercheEnCours = 'nom_sci';
81
        },
82
        focus: function(event, ui) {
83
        	elementAutocompletionSelectionne = ui.item;
84
        },
85
        open: function(event, ui) {
86
        	autocompletionFicheOuverte = true;
809 aurelien 87
        	var parent = $('.autocompletion_nom.ui-menu-item').parent();
88
        	parent.width(parent.width() + 10);
785 aurelien 89
        },
90
        close: function(event, ui) {
91
        	autocompletionFicheFermee = false;
92
        	nomRechercheEnCours = null;
93
        },
457 jpm 94
        html: true
95
	});
105 aurelien 96
 
459 jpm 97
	$("#nom").bind("autocompleteselect", function(event, ui) {
457 jpm 98
		if (ui.item.retenu == true) {
99
			$("#nom").addClass('ns-retenu');
100
		} else {
101
			$("#nom").removeClass('ns-retenu');
102
		}
103
	});
105 aurelien 104
}
105
 
785 aurelien 106
// gére l'acces direct à une fiche par l'appui sur droite
107
// dans la liste d'autocompletion des noms scientifiques
108
function gererAccesFicheFlecheDroite() {
109
	$(document).keypress(function(event) {
110
		// flèche droite
111
		if(event.keyCode == '39') {
112
			if(autocompletionFicheOuverte && elementAutocompletionSelectionne != null && nomSciEstDemande()) {
113
				$('#nom').val(elementAutocompletionSelectionne.value);
114
				$('#eflore_nomenclature_fiche').click();
115
				$('#nom').autocomplete( "disable" );
116
				//TODO : ajout d'un message de chargement ?
117
			}
118
		}
119
	});
120
}
121
 
119 aurelien 122
function traiterRetourNomsSci(data) {
131 delphine 123
	var suggestions = [];
457 jpm 124
	if (data.resultat != undefined) {
131 delphine 125
		$.each(data.resultat, function(i, val) {
457 jpm 126
			val.nn = i;
127
			var nom = {label : '', value : '', retenu : false};
128
			if (suggestions.length >= AUTOCOMPLETION_ELEMENTS_NBRE) {
129
				nom.label = "...";
130
				nom.value = $('#nom').val();
131
				suggestions.push(nom);
132
				return false;
133
			} else {
134
				nom.label = val.nom_sci_complet;
135
				nom.value = val.nom_sci;
136
				nom.nn = val.nn;
720 delphine 137
				nom.retenu = (val.retenu == 'true') ? true : false;
457 jpm 138
				suggestions.push(nom);
139
			}
131 delphine 140
		});
119 aurelien 141
	}
142
	return suggestions;
143
}
144
 
724 mathilde 145
 
146
function traiterRetourAvance(data, champs) {
147
	var suggestions = [];
148
	if (jQuery.type(data) == "array") {
149
		$.each(data[1], function(i, val) {
150
			var ch = {label : '', value : ''};
151
			if (suggestions.length >= AUTOCOMPLETION_ELEMENTS_NBRE) {
152
				ch.label = "...";
153
				ch.value = champs.val();
154
				suggestions.push(ch);
155
				return false;
156
			} else {
157
				ch.label = val;
158
				ch.value = val;
159
				suggestions.push(ch);
160
			}
161
		});
162
	}
163
	return suggestions;
164
}
165
 
119 aurelien 166
function traiterRetourNomsVerna(data) {
131 delphine 167
	var suggestions = [];
457 jpm 168
	if (jQuery.type(data) == "array") {
131 delphine 169
		$.each(data[1], function(i, val){
457 jpm 170
			var nom = {label : '', value : ''};
171
			if (suggestions.length >= AUTOCOMPLETION_ELEMENTS_NBRE) {
172
				nom.label = "...";
173
				nom.value = $('#nom').val();
174
				suggestions.push(nom);
175
				return false;
176
			} else {
177
				nom.label = val;
178
				nom.value = val;
179
				suggestions.push(val);
180
			}
131 delphine 181
		});
119 aurelien 182
	}
183
	return suggestions;
184
}
185
 
105 aurelien 186
 
457 jpm 187
/**------------ Fonctions de gestion des urls d'autocompletion et des fiches ------------------*/
724 mathilde 188
 
189
function getUrlAutocompletionAvancee(parametre) {
190
	var valeur = getValeurMasque(parametre);
191
	var ns_str = getValeurNsStructure(parametre);
192
	var url = URL_SERVICE_AUTOCOMPLETION_NOM_SCI+"?recherche=etendue&"+
193
	"navigation.limite="+AUTOCOMPLETION_ELEMENTS_NBRE +'&masque.'+parametre+'='+valeur+
194
	'&retour.format=oss&distinct=1&ns.structure='+ns_str;
195
	return url;
196
}
197
 
198
function getValeurMasque(parametre) {
199
	var valeur = $('#'+parametre).val();
200
	if (parametre == 'au' ){
201
		valeur = valeur +',(' + valeur + ')';
202
	} else if (parametre == 'bib' ){
203
		valeur = valeur +', %; ' + valeur ;
204
	}
205
	return valeur;
206
}
207
 
208
function getValeurNsStructure(parametre) {
209
	var ns = '';
210
	if (parametre == 'au' || parametre == 'bib'){
211
		ns = parametre +'_ss';
212
	} else {
213
		ns = parametre;
214
	}
215
	return ns;
216
}
217
 
218
 
457 jpm 219
function getUrlAppelCompletion() {
220
	var url = '';
221
	var mots = $('#nom').val();
222
	if (nomSciEstDemande()) {
223
		url = getUrlAutocompletionNomsSci(mots);
224
	} else if (nomVernaculaireEstDemande()) {
225
		mots = mots.replace('  ',' ');
226
		mots = mots.replace(' ','_');
227
		url = getUrlAutocompletionNomsVerna(mots);
228
	}
229
	return url;
230
}
105 aurelien 231
 
457 jpm 232
function getUrlAutocompletionNomsSci(requete) {
233
	var url = getUrlAutocompletion(URL_SERVICE_AUTOCOMPLETION_NOM_SCI, requete, 'min')+
234
		"&ns.structure=au,an";
235
	return url;
119 aurelien 236
}
237
 
457 jpm 238
function getUrlAutocompletionNomsVerna(requete) {
239
	var url = getUrlAutocompletion(URL_SERVICE_AUTOCOMPLETION_NOM_VERNA, requete, 'oss')+
240
		"&masque.lg=fra";
241
	return url;
242
}
243
 
244
function getUrlAutocompletion(baseUrl, requete, format) {
245
	var url = baseUrl+"?"+
246
		"masque="+requete+"&"+
247
		"recherche=etendue&"+
248
		"retour.format="+format+"&"+
249
		"navigation.limite="+AUTOCOMPLETION_ELEMENTS_NBRE;
250
	return url;
251
}
252
 
253
/**------------ Fonctions de détection de l'état du formulaire ------------------*/
254
function nomSciEstDemande()  {
255
	var boutonRadioNomSci = $('#type_nom_scientifique');
256
	return (boutonRadioNomSci.attr("checked") != "undefined" && boutonRadioNomSci.attr("checked") == "checked");
257
}
258
 
259
function nomVernaculaireEstDemande()  {
260
	var boutonRadioNomSci = $('#type_nom_vernaculaire');
261
	return (boutonRadioNomSci.attr("checked") != "undefined" && boutonRadioNomSci.attr("checked") == "checked");
262
}
263
 
119 aurelien 264
/**------------ Fonctions de gestion de l'affichage des valeurs par defaut ----------------------*/
724 mathilde 265
function ajouterActionClicSurTexteRecherche(champs) {
266
	$.each(champs, function(index, value) {
267
		$(value).click(function() {
268
			if (formulaireAfficheValeurParDefaut(value)) {
269
				$(value).val('');
270
			}
271
			if ($(value).hasClass('valeur-defaut-recherche')) {
272
				$(value).removeClass('valeur-defaut-recherche');
273
			}
274
		});
119 aurelien 275
	});
276
}
277
 
724 mathilde 278
function formulaireAfficheValeurParDefaut(champ) {
279
	valeur_form = $(champ).val();
278 aurelien 280
	valeur_form = $.trim(valeur_form);
724 mathilde 281
	return ( valeur_form == '' || valeur_form == VALEUR_DEFAUT_NOM_SCI || valeur_form == VALEUR_DEFAUT_NOM_VERNA
282
			|| valeur_form == VALEUR_DEFAUT_AU || valeur_form == VALEUR_DEFAUT_BIB || valeur_form == VALEUR_DEFAUT_DATE );
119 aurelien 283
}
284
 
724 mathilde 285
function gererAffichageValeursParDefaut(champs) {
286
		$('input[name="type_nom"]').click(function() {
287
			afficherValeurParDefautNom();
288
		});
289
		$.each(champs, function(index, value) {
290
			$(value).focus(function() {
291
				$(value).removeClass('valeur-defaut-recherche');
292
				if (formulaireAfficheValeurParDefaut(value)) {
293
					$(value).val('');
294
				} else {
295
					$(value).select();
296
				}
297
			});
298
		});
299
}
300
 
301
function afficherValeurParDefaut(champs){
302
	$.each(champs, function(index, value) {
303
		if (value == '#nom') {
304
			afficherValeurParDefautNom();
305
		}else{
306
			afficherValeurParDefautAvance(value);
119 aurelien 307
		}
308
	});
309
}
310
 
724 mathilde 311
function afficherValeurParDefautNom() {
119 aurelien 312
	if($('#nom') != undefined && $('#nom').val() != undefined) {
278 aurelien 313
		valeur_form = $('#nom').val();
314
		valeur_form = $.trim(valeur_form);
724 mathilde 315
		if (formulaireAfficheValeurParDefaut('#nom')) {
457 jpm 316
			if (nomSciEstDemande()) {
317
	    		$('#nom').val(VALEUR_DEFAUT_NOM_SCI);
119 aurelien 318
	    	} else {
457 jpm 319
	    		$('#nom').val(VALEUR_DEFAUT_NOM_VERNA);
119 aurelien 320
	    	}
321
			$('#nom').addClass('valeur-defaut-recherche');
322
		}
466 aurelien 323
 
324
		if (nomSciEstDemande()) {
325
			$('#eflore_nomenclature_fiche').show();
326
		} else {
327
			$('#eflore_nomenclature_fiche').hide();
328
		}
119 aurelien 329
	}
330
}
331
 
724 mathilde 332
 
333
function afficherValeurParDefautAvance(champs) {
785 aurelien 334
	if($(champs) != undefined && $(champs).val() != undefined) {
335
		valeur_form = $(champs).val();
336
		valeur_form = $.trim(valeur_form);
337
		if (formulaireAfficheValeurParDefaut(champs)) {
338
			if (champs == "#au") {
339
				$(champs).val(VALEUR_DEFAUT_AU);
340
 
341
			}else if (champs == "#bib" ) {
342
				$(champs).val(VALEUR_DEFAUT_BIB);
343
			} else {
344
				$(champs).val(VALEUR_DEFAUT_DATE);
724 mathilde 345
			}
785 aurelien 346
			$(champs).addClass('valeur-defaut-recherche');
724 mathilde 347
		}
348
 
785 aurelien 349
	}
724 mathilde 350
}
351
 
119 aurelien 352
/*
353
 * jQuery UI Autocomplete HTML Extension
354
 *
355
 * Copyright 2010, Scott González (http://scottgonzalez.com)
356
 * Dual licensed under the MIT or GPL Version 2 licenses.
357
 *
358
 * http://github.com/scottgonzalez/jquery-ui-extensions
359
 *
360
 * Adaptation par Aurélien Peronnet pour la mise en gras des noms de taxons valides
361
 */
362
(function( $ ) {
457 jpm 363
	var proto = $.ui.autocomplete.prototype,
364
		initSource = proto._initSource;
365
 
366
	function filter( array, term ) {
367
		var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
368
		return $.grep( array, function(value) {
369
			return matcher.test( $( "<div>" ).html( value.label || value.value || value ).text() );
370
		});
371
	}
372
 
373
	$.extend( proto, {
374
		_initSource: function() {
375
			if (this.options.html && $.isArray(this.options.source) ) {
376
				this.source = function( request, response ) {
377
					response( filter( this.options.source, request.term ) );
378
				};
379
			} else {
380
				initSource.call( this );
381
			}
382
		},
383
		_renderItem: function( ul, item) {
384
			if (item.retenu == true) {
385
				item.label = "<strong>"+item.label+"</strong>";
386
			}
785 aurelien 387
			var classe = (nomRechercheEnCours == 'nom_sci' && nomSciEstDemande()) ? 'class="autocompletion_nom"' : '';
388
			return $("<li "+classe+"></li>")
457 jpm 389
				.data("item.autocomplete", item)
390
				.append( $("<a></a>")[ this.options.html ? "html" : "text" ](item.label))
391
				.appendTo(ul);
392
		}
119 aurelien 393
	});
457 jpm 394
})( jQuery );