Subversion Repositories eFlore/Applications.eflore-consultation

Rev

Rev 866 | 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();
864 aurelien 35
	gererClicIllustrationsResultats()
457 jpm 36
});
119 aurelien 37
 
457 jpm 38
/**------------------- Fonctions de gestion de l'autocompletion ---------------------------------*/
724 mathilde 39
function ajouterAutocompletion(){
40
		ajouterAutocompletionNoms();
41
		$('.champ_autocomplete').each(function(index) {
42
			ajouterAutocompletionAvancee($(this));
43
		});
44
}
45
 
46
function ajouterAutocompletionAvancee(champs){
47
			champs.autocomplete({
48
				source: function(requete, add){
49
				// la variable de requête doit être vidée car sinon le parametre "term" est ajouté
50
					requete = "";
51
					var id = champs.attr('id');
895 aurelien 52
					var url = encodeURI(getUrlAutocompletionAvancee(id));
724 mathilde 53
						$.getJSON(url, requete, function(data) {
54
					var suggestions = [];
55
					suggestions = traiterRetourAvance(data,champs);
56
					add(suggestions);
57
					});
58
				},
59
	        	html: true
60
			});
61
 
62
}
785 aurelien 63
 
457 jpm 64
function ajouterAutocompletionNoms() {
65
	$('#nom').autocomplete({
66
		source: function(requete, add){
67
			// la variable de requête doit être vidée car sinon le parametre "term" est ajouté
68
			requete = "";
895 aurelien 69
			var url = encodeURI(getUrlAppelCompletion());
724 mathilde 70
			$.getJSON(url, requete, function(data) {
457 jpm 71
				var suggestions = [];
72
				if (nomVernaculaireEstDemande()) {
73
					suggestions = traiterRetourNomsVerna(data);
74
				} else if (nomSciEstDemande()) {
75
					suggestions = traiterRetourNomsSci(data);
76
				}
77
				add(suggestions);
78
            });
79
        },
785 aurelien 80
        search: function(event, ui) {
81
        	nomRechercheEnCours = 'nom_sci';
82
        },
83
        focus: function(event, ui) {
84
        	elementAutocompletionSelectionne = ui.item;
85
        },
86
        open: function(event, ui) {
87
        	autocompletionFicheOuverte = true;
809 aurelien 88
        	var parent = $('.autocompletion_nom.ui-menu-item').parent();
89
        	parent.width(parent.width() + 10);
785 aurelien 90
        },
91
        close: function(event, ui) {
92
        	autocompletionFicheFermee = false;
93
        	nomRechercheEnCours = null;
94
        },
457 jpm 95
        html: true
96
	});
105 aurelien 97
 
459 jpm 98
	$("#nom").bind("autocompleteselect", function(event, ui) {
457 jpm 99
		if (ui.item.retenu == true) {
100
			$("#nom").addClass('ns-retenu');
101
		} else {
102
			$("#nom").removeClass('ns-retenu');
103
		}
104
	});
105 aurelien 105
}
106
 
785 aurelien 107
// gére l'acces direct à une fiche par l'appui sur droite
108
// dans la liste d'autocompletion des noms scientifiques
109
function gererAccesFicheFlecheDroite() {
110
	$(document).keypress(function(event) {
111
		// flèche droite
895 aurelien 112
		if(event.keyCode == 39) {
785 aurelien 113
			if(autocompletionFicheOuverte && elementAutocompletionSelectionne != null && nomSciEstDemande()) {
114
				$('#nom').val(elementAutocompletionSelectionne.value);
115
				$('#eflore_nomenclature_fiche').click();
116
				$('#nom').autocomplete( "disable" );
117
				//TODO : ajout d'un message de chargement ?
118
			}
119
		}
895 aurelien 120
 
121
		if(event.keyCode == 13) {
122
			if(autocompletionFicheOuverte && elementAutocompletionSelectionne == null && $('#nom').is(":focus")) {
123
				$('#eflore_nomenclature_submit').click();
124
			}
125
		}
785 aurelien 126
	});
127
}
128
 
119 aurelien 129
function traiterRetourNomsSci(data) {
131 delphine 130
	var suggestions = [];
457 jpm 131
	if (data.resultat != undefined) {
131 delphine 132
		$.each(data.resultat, function(i, val) {
457 jpm 133
			val.nn = i;
134
			var nom = {label : '', value : '', retenu : false};
135
			if (suggestions.length >= AUTOCOMPLETION_ELEMENTS_NBRE) {
136
				nom.label = "...";
137
				nom.value = $('#nom').val();
138
				suggestions.push(nom);
139
				return false;
140
			} else {
141
				nom.label = val.nom_sci_complet;
142
				nom.value = val.nom_sci;
143
				nom.nn = val.nn;
720 delphine 144
				nom.retenu = (val.retenu == 'true') ? true : false;
457 jpm 145
				suggestions.push(nom);
146
			}
131 delphine 147
		});
119 aurelien 148
	}
149
	return suggestions;
150
}
151
 
724 mathilde 152
 
153
function traiterRetourAvance(data, champs) {
154
	var suggestions = [];
155
	if (jQuery.type(data) == "array") {
156
		$.each(data[1], function(i, val) {
157
			var ch = {label : '', value : ''};
158
			if (suggestions.length >= AUTOCOMPLETION_ELEMENTS_NBRE) {
159
				ch.label = "...";
160
				ch.value = champs.val();
161
				suggestions.push(ch);
162
				return false;
163
			} else {
164
				ch.label = val;
165
				ch.value = val;
166
				suggestions.push(ch);
167
			}
168
		});
169
	}
170
	return suggestions;
171
}
172
 
119 aurelien 173
function traiterRetourNomsVerna(data) {
131 delphine 174
	var suggestions = [];
457 jpm 175
	if (jQuery.type(data) == "array") {
131 delphine 176
		$.each(data[1], function(i, val){
457 jpm 177
			var nom = {label : '', value : ''};
178
			if (suggestions.length >= AUTOCOMPLETION_ELEMENTS_NBRE) {
179
				nom.label = "...";
180
				nom.value = $('#nom').val();
181
				suggestions.push(nom);
182
				return false;
183
			} else {
184
				nom.label = val;
185
				nom.value = val;
186
				suggestions.push(val);
187
			}
131 delphine 188
		});
119 aurelien 189
	}
190
	return suggestions;
191
}
192
 
105 aurelien 193
 
457 jpm 194
/**------------ Fonctions de gestion des urls d'autocompletion et des fiches ------------------*/
724 mathilde 195
 
196
function getUrlAutocompletionAvancee(parametre) {
197
	var valeur = getValeurMasque(parametre);
198
	var ns_str = getValeurNsStructure(parametre);
199
	var url = URL_SERVICE_AUTOCOMPLETION_NOM_SCI+"?recherche=etendue&"+
200
	"navigation.limite="+AUTOCOMPLETION_ELEMENTS_NBRE +'&masque.'+parametre+'='+valeur+
201
	'&retour.format=oss&distinct=1&ns.structure='+ns_str;
202
	return url;
203
}
204
 
205
function getValeurMasque(parametre) {
206
	var valeur = $('#'+parametre).val();
207
	if (parametre == 'au' ){
208
		valeur = valeur +',(' + valeur + ')';
209
	} else if (parametre == 'bib' ){
210
		valeur = valeur +', %; ' + valeur ;
211
	}
212
	return valeur;
213
}
214
 
215
function getValeurNsStructure(parametre) {
216
	var ns = '';
217
	if (parametre == 'au' || parametre == 'bib'){
218
		ns = parametre +'_ss';
219
	} else {
220
		ns = parametre;
221
	}
222
	return ns;
223
}
224
 
225
 
457 jpm 226
function getUrlAppelCompletion() {
227
	var url = '';
228
	var mots = $('#nom').val();
229
	if (nomSciEstDemande()) {
230
		url = getUrlAutocompletionNomsSci(mots);
231
	} else if (nomVernaculaireEstDemande()) {
232
		mots = mots.replace('  ',' ');
233
		mots = mots.replace(' ','_');
234
		url = getUrlAutocompletionNomsVerna(mots);
235
	}
236
	return url;
237
}
105 aurelien 238
 
457 jpm 239
function getUrlAutocompletionNomsSci(requete) {
240
	var url = getUrlAutocompletion(URL_SERVICE_AUTOCOMPLETION_NOM_SCI, requete, 'min')+
241
		"&ns.structure=au,an";
242
	return url;
119 aurelien 243
}
244
 
457 jpm 245
function getUrlAutocompletionNomsVerna(requete) {
246
	var url = getUrlAutocompletion(URL_SERVICE_AUTOCOMPLETION_NOM_VERNA, requete, 'oss')+
247
		"&masque.lg=fra";
248
	return url;
249
}
250
 
251
function getUrlAutocompletion(baseUrl, requete, format) {
252
	var url = baseUrl+"?"+
253
		"masque="+requete+"&"+
254
		"recherche=etendue&"+
255
		"retour.format="+format+"&"+
256
		"navigation.limite="+AUTOCOMPLETION_ELEMENTS_NBRE;
257
	return url;
258
}
259
 
260
/**------------ Fonctions de détection de l'état du formulaire ------------------*/
261
function nomSciEstDemande()  {
262
	var boutonRadioNomSci = $('#type_nom_scientifique');
263
	return (boutonRadioNomSci.attr("checked") != "undefined" && boutonRadioNomSci.attr("checked") == "checked");
264
}
265
 
266
function nomVernaculaireEstDemande()  {
267
	var boutonRadioNomSci = $('#type_nom_vernaculaire');
268
	return (boutonRadioNomSci.attr("checked") != "undefined" && boutonRadioNomSci.attr("checked") == "checked");
269
}
270
 
119 aurelien 271
/**------------ Fonctions de gestion de l'affichage des valeurs par defaut ----------------------*/
724 mathilde 272
function ajouterActionClicSurTexteRecherche(champs) {
273
	$.each(champs, function(index, value) {
274
		$(value).click(function() {
275
			if (formulaireAfficheValeurParDefaut(value)) {
276
				$(value).val('');
277
			}
278
			if ($(value).hasClass('valeur-defaut-recherche')) {
279
				$(value).removeClass('valeur-defaut-recherche');
280
			}
281
		});
119 aurelien 282
	});
283
}
284
 
724 mathilde 285
function formulaireAfficheValeurParDefaut(champ) {
286
	valeur_form = $(champ).val();
278 aurelien 287
	valeur_form = $.trim(valeur_form);
724 mathilde 288
	return ( valeur_form == '' || valeur_form == VALEUR_DEFAUT_NOM_SCI || valeur_form == VALEUR_DEFAUT_NOM_VERNA
289
			|| valeur_form == VALEUR_DEFAUT_AU || valeur_form == VALEUR_DEFAUT_BIB || valeur_form == VALEUR_DEFAUT_DATE );
119 aurelien 290
}
291
 
724 mathilde 292
function gererAffichageValeursParDefaut(champs) {
293
		$('input[name="type_nom"]').click(function() {
294
			afficherValeurParDefautNom();
295
		});
296
		$.each(champs, function(index, value) {
297
			$(value).focus(function() {
298
				$(value).removeClass('valeur-defaut-recherche');
299
				if (formulaireAfficheValeurParDefaut(value)) {
300
					$(value).val('');
301
				} else {
302
					$(value).select();
303
				}
304
			});
305
		});
306
}
307
 
308
function afficherValeurParDefaut(champs){
309
	$.each(champs, function(index, value) {
310
		if (value == '#nom') {
311
			afficherValeurParDefautNom();
312
		}else{
313
			afficherValeurParDefautAvance(value);
119 aurelien 314
		}
315
	});
316
}
317
 
724 mathilde 318
function afficherValeurParDefautNom() {
119 aurelien 319
	if($('#nom') != undefined && $('#nom').val() != undefined) {
278 aurelien 320
		valeur_form = $('#nom').val();
321
		valeur_form = $.trim(valeur_form);
724 mathilde 322
		if (formulaireAfficheValeurParDefaut('#nom')) {
457 jpm 323
			if (nomSciEstDemande()) {
324
	    		$('#nom').val(VALEUR_DEFAUT_NOM_SCI);
119 aurelien 325
	    	} else {
457 jpm 326
	    		$('#nom').val(VALEUR_DEFAUT_NOM_VERNA);
119 aurelien 327
	    	}
328
			$('#nom').addClass('valeur-defaut-recherche');
329
		}
466 aurelien 330
 
331
		if (nomSciEstDemande()) {
332
			$('#eflore_nomenclature_fiche').show();
333
		} else {
334
			$('#eflore_nomenclature_fiche').hide();
335
		}
119 aurelien 336
	}
337
}
338
 
724 mathilde 339
 
340
function afficherValeurParDefautAvance(champs) {
785 aurelien 341
	if($(champs) != undefined && $(champs).val() != undefined) {
342
		valeur_form = $(champs).val();
343
		valeur_form = $.trim(valeur_form);
344
		if (formulaireAfficheValeurParDefaut(champs)) {
345
			if (champs == "#au") {
346
				$(champs).val(VALEUR_DEFAUT_AU);
347
 
348
			}else if (champs == "#bib" ) {
349
				$(champs).val(VALEUR_DEFAUT_BIB);
350
			} else {
351
				$(champs).val(VALEUR_DEFAUT_DATE);
724 mathilde 352
			}
785 aurelien 353
			$(champs).addClass('valeur-defaut-recherche');
724 mathilde 354
		}
355
 
785 aurelien 356
	}
724 mathilde 357
}
358
 
864 aurelien 359
/**------------ Fonctions de gestion du zoom sur les images affichées dans les résultats de recherche ----------------------*/
360
function gererClicIllustrationsResultats() {
361
	$('.illustration_resultat_cel').click(function() {
362
		var url = $(this).attr('src')/*.replace('CS','XL')*/;
866 aurelien 363
		var titre = trouverNomTaxon($(this));
364
		console.log($(this).parent().parent().find('a.lien_fiche_eflore'));
864 aurelien 365
		ouvrirFenetreIllustrationResultat(url, titre, 400, 400);
366
	});
367
 
368
	$('.illustration_resultat_choro').click(function() {
369
		var url = $(this).attr('src').replace('108x101','432x404');
866 aurelien 370
		var titre = 'Chorologie du taxon '+trouverNomTaxon($(this));
864 aurelien 371
		ouvrirFenetreIllustrationResultat(url, titre, 432, 404);
372
	});
373
 
374
	$('.illustration_resultat_coste').click(function() {
375
		var url = $(this).attr('src');
866 aurelien 376
		var titre = 'Illustration de Coste du taxon '+trouverNomTaxon($(this));
864 aurelien 377
		ouvrirFenetreIllustrationResultat(url, titre, 400, 400);
378
	});
379
}
380
 
866 aurelien 381
function trouverNomTaxon(objet) {
382
	nom = "";
383
	if(nomVernaculaireEstDemande()) {
384
		nom = objet.parent().parent().find('a.lien_fiche_eflore').text();
385
	} else {
386
		nom = objet.parent().find('a.lien_fiche_eflore').text();
387
	}
388
	return nom;
389
}
390
 
864 aurelien 391
function ouvrirFenetreIllustrationResultat(url, titre, hauteur, largeur) {
392
	var fenetre = window.open('_blank', titre,'directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no, width='+(largeur+17)+', height='+(hauteur+17));
393
	var tmp = fenetre.document;
394
	tmp.write('<html><head><title>'+titre+'</title>');
395
	tmp.write('</head><body>');
396
	tmp.write('<p style="height='+hauteur+'px;text-align:center;line-height='+hauteur+'px;"><img id="image_agrandie" height="'+hauteur+'" width="'+largeur+'" style="vertical-align:middle;" src="'+url+'" /></p>');
397
	tmp.write('</body></html>');
398
	tmp.close();
399
}
400
 
119 aurelien 401
/*
402
 * jQuery UI Autocomplete HTML Extension
403
 *
404
 * Copyright 2010, Scott González (http://scottgonzalez.com)
405
 * Dual licensed under the MIT or GPL Version 2 licenses.
406
 *
407
 * http://github.com/scottgonzalez/jquery-ui-extensions
408
 *
409
 * Adaptation par Aurélien Peronnet pour la mise en gras des noms de taxons valides
410
 */
411
(function( $ ) {
457 jpm 412
	var proto = $.ui.autocomplete.prototype,
413
		initSource = proto._initSource;
414
 
415
	function filter( array, term ) {
416
		var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
417
		return $.grep( array, function(value) {
418
			return matcher.test( $( "<div>" ).html( value.label || value.value || value ).text() );
419
		});
420
	}
421
 
422
	$.extend( proto, {
423
		_initSource: function() {
424
			if (this.options.html && $.isArray(this.options.source) ) {
425
				this.source = function( request, response ) {
426
					response( filter( this.options.source, request.term ) );
427
				};
428
			} else {
429
				initSource.call( this );
430
			}
431
		},
432
		_renderItem: function( ul, item) {
433
			if (item.retenu == true) {
434
				item.label = "<strong>"+item.label+"</strong>";
435
			}
785 aurelien 436
			var classe = (nomRechercheEnCours == 'nom_sci' && nomSciEstDemande()) ? 'class="autocompletion_nom"' : '';
437
			return $("<li "+classe+"></li>")
457 jpm 438
				.data("item.autocomplete", item)
439
				.append( $("<a></a>")[ this.options.html ? "html" : "text" ](item.label))
440
				.appendTo(ul);
441
		}
119 aurelien 442
	});
457 jpm 443
})( jQuery );