Subversion Repositories eFlore/Applications.eflore-consultation

Rev

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