Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
3120 delphine 1
/**
2
 * Constructeur WidgetSaisie par défaut
3
 */
4
function WidgetSaisie() {
5
	this.langue = 'fr';
6
	this.obsNbre = 0;
7
	this.nbObsEnCours = 1;
8
	this.totalObsATransmettre = 0;
9
	this.nbObsTransmises = 0;
10
	this.debug = null;
11
	this.html5 = null;
12
	this.tagProjet = null;
13
	this.tagImg = null;
14
	this.tagObs = null;
15
	this.separationTagImg = null;
16
	this.separationTagObs = null;
17
	this.obsId = null;
18
	this.serviceSaisieUrl = null;
19
	this.serviceObsUrl = null;
20
	this.nomSciReferentiel = null;
21
	this.especeImposee = false;
22
	this.infosEspeceImposee = null;
23
	this.autocompletionElementsNbre = null;
24
	this.referentielImpose = null;
25
	this.serviceAutocompletionNomSciUrl = null;
26
	this.serviceAutocompletionNomSciUrlTpl = null;
27
	this.obsMaxNbre = null;
28
	this.dureeMessage = null;
29
	this.serviceAnnuaireIdUrl = null;
30
	this.serviceNomCommuneUrl = null;
31
	this.serviceNomCommuneUrlAlt = null;
32
	this.chargementIconeUrl = null;
33
	this.chargementImageIconeUrl = null;
34
	this.calendrierIconeUrl = null;
35
	this.pasDePhotoIconeUrl = null;
36
}
37
 
38
/**
39
 * Initialisation du widget
40
 */
41
WidgetSaisie.prototype.init = function() {
42
	this.initForm();
43
	this.initEvts();
44
	this.requeterIdentite();
45
};
46
 
47
/**
48
 * Initialise le formulaire, les validateurs, les listes de complétion...
49
 */
50
WidgetSaisie.prototype.initForm = function() {
51
	if (this.obsId != '') {
52
		//this.chargerInfoObs();
53
	}
54
 
55
	this.configurerDatePicker('#date');
56
	this.ajouterAutocompletionNoms();
57
	//this.configurerFormValidator();
58
	//this.definirReglesFormValidator();
59
 
60
	if(this.especeImposee) {
61
		$("#taxon").attr("disabled", "disabled");
62
		$("#taxon-input-groupe").attr("title","");
63
		// Bricolage cracra pour avoir le nom retenu avec auteur (nom_retenu.libelle ne le mentionne pas)
64
		var nomRetenuComplet = this.infosEspeceImposee["nom_retenu_complet"],
65
			debutAnneRefBiblio = nomRetenuComplet.indexOf(" [");
66
		if (debutAnneRefBiblio != -1) {
67
			nomRetenuComplet = nomRetenuComplet.substr(0, debutAnneRefBiblio);
68
		}
69
		// fin bricolage cracra
70
		var infosAssociee = {
71
			label : this.infosEspeceImposee.nom_sci_complet,
72
			value : this.infosEspeceImposee.nom_sci_complet,
73
			nt : this.infosEspeceImposee.num_taxonomique,
74
			nomSel : this.infosEspeceImposee.nom_sci,
75
			nomSelComplet : this.infosEspeceImposee.nom_sci_complet,
76
			numNomSel : this.infosEspeceImposee.id,
77
			nomRet : nomRetenuComplet,
78
			numNomRet : this.infosEspeceImposee["nom_retenu.id"],
79
			famille : this.infosEspeceImposee.famille,
80
			retenu : (this.infosEspeceImposee.retenu == 'false') ? false : true
81
		};
82
		$("#taxon").data(infosAssociee);
83
	}
84
};
85
 
86
/**
87
 * Initialise les écouteurs d'événements
88
 */
89
WidgetSaisie.prototype.initEvts = function() {
90
	var lthis = this;
91
	$('body').on('click', '.effacer-miniature', function() {
92
		$(this).parent().remove();
93
	});
94
	$("#fichier").bind('change', function (e) {
95
		arreter(e);
96
		var options = {
97
			success: lthis.afficherMiniature.bind(lthis), // post-submit callback
98
			dataType: 'xml', // 'xml', 'script', or 'json' (expected server response type)
99
			resetForm: true // reset the form after successful submit
100
		};
101
		$("#miniature").append('<img id="miniature-chargement" class="miniature" alt="chargement" src="'+this.chargementImageIconeUrl+'"/>');
102
		$("#ajouter-obs").attr('disabled', 'disabled');
103
		if(lthis.verifierFormat($("#fichier").val())) {
104
			$("#form-upload").ajaxSubmit(options);
105
		} else {
106
			$('#form-upload')[0].reset();
107
			window.alert("Le format de fichier n'est pas supporté, les formats acceptés sont "+	$("#fichier").attr("accept"));
108
		}
109
		return false;
110
	});
111
	// identité
112
	$("#courriel").on('blur', this.requeterIdentite.bind(this));
113
	$("#courriel").on('keypress', this.testerLancementRequeteIdentite.bind(this));
114
	$(".alert .close").on('click', this.fermerPanneauAlert);
115
	$(".has-tooltip").tooltip('enable');
116
	$("#btn-aide").on('click', this.basculerAffichageAide);
117
	$("#prenom").on("change", this.formaterPrenom.bind(this));
118
	$("#nom").on("change", this.formaterNom.bind(this));
119
 
120
	$("#courriel_confirmation").on('paste', this.bloquerCopierCollerCourriel.bind(this));
121
	/*$("#ajouter-obs").on('click', this.ajouterObs.bind(this));
122
	$(".obs-nbre").on('changement', this.surChangementNbreObs.bind(this));
123
	$("body").on('click', ".supprimer-obs", function() {
124
		var that = this,
125
			suppObs = lthis.supprimerObs.bind(lthis);
126
		// bricolage pour avoir les deux contextes en même temps (objet et elt. du DOM)
127
		suppObs(that);
128
	});
129
	$("#transmettre-obs").on('click', this.transmettreObs.bind(this));
130
	$("#referentiel").on('change', this.surChangementReferentiel.bind(this));
131
 
132
	$("body").on('click', ".defilement-miniatures-gauche", function(event) {
133
		event.preventDefault();
134
		lthis.defilerMiniatures($(this));
135
	});
136
	$("body").on('click', ".defilement-miniatures-droite", function(event) {
137
		event.preventDefault();
138
		lthis.defilerMiniatures($(this));
139
	});
140
*/
141
	// fermeture fenêtre
142
	if (this.debug == false) {
143
		$(window).on('beforeunload', function(event) {
144
			return 'Êtes vous sûr de vouloir quiter la page?\nLes observations saisies mais non transmises seront perdues.';
145
		});
146
	}
147
 
148
};
149
 
150
/**
151
 * Retourne true si l'extension de l'image "nom" est .jpg ou .jpeg
152
 */
153
WidgetSaisie.prototype.verifierFormat = function(nom) {
154
	var parts = nom.split('.');
155
	extension = parts[parts.length - 1];
156
	return (extension.toLowerCase() == 'jpeg' || extension.toLowerCase() == 'jpg');
157
};
158
 
159
/**
160
 * Affiche la miniature d'une image temporaire (formulaire) qu'on a ajoutée à l'obs
161
 */
162
WidgetSaisie.prototype.afficherMiniature = function(reponse) {
163
	if (this.debug) {
164
		var debogage = $("debogage", reponse).text();
165
		//console.log("Débogage upload : "+debogage);
166
	}
167
	var message = $("message", reponse).text();
168
	if (message != '') {
169
		$("#miniature-msg").append(message);
170
	} else {
171
		$("#miniatures").append(this.creerWidgetMiniature(reponse));
172
	}
173
	$('#ajouter-obs').removeAttr('disabled');
174
};
175
 
176
/**
177
 * Crée la miniature d'une image temporaire (formulaire), avec le bouton pour l'effacer
178
 */
179
WidgetSaisie.prototype.creerWidgetMiniature = function(reponse) {
180
	var miniatureUrl = $("miniature-url", reponse).text();
181
	var imgNom = $("image-nom", reponse).text();
182
	var html =
183
		'<div class="miniature">'+
184
			'<img class="miniature-img" class="miniature" alt="'+imgNom+'" src="'+miniatureUrl+'"/>'+
185
			'<button class="effacer-miniature" type="button">Effacer</button>'+
186
		'</div>'
187
	return html;
188
};
189
 
190
/**
191
 * Efface une miniature (formulaire)
192
 */
193
WidgetSaisie.prototype.supprimerMiniature = function(miniature) {
194
	miniature.parents('.miniature').remove();
195
};
196
 
197
/**
198
 * Efface toutes les miniatures (formulaire)
199
 */
200
WidgetSaisie.prototype.supprimerMiniatures = function() {
201
	$("#miniatures").empty();
202
	$("#miniature-msg").empty();
203
};
204
 
205
/* Observateur */
206
WidgetSaisie.prototype.testerLancementRequeteIdentite = function(event) {
207
	if (event.which == 13) {
208
		this.requeterIdentite();
209
		this.event.preventDefault();
210
		this.event.stopPropagation();
211
	}
212
};
213
 
214
WidgetSaisie.prototype.requeterIdentite = function() {
215
	var lthis = this;
216
	var courriel = $("#courriel").val();
217
	var urlAnnuaire = this.serviceAnnuaireIdUrl + courriel;
218
	if (courriel != '') {
219
		$.ajax({
220
			url : urlAnnuaire,
221
			type : "GET",
222
			success : function(data, textStatus, jqXHR) {
223
				if (lthis.debug) {
224
					console.log('SUCCESS: '+textStatus);
225
				}
226
				if (data != undefined && data[courriel] != undefined) {
227
					var infos = data[courriel];
228
					lthis.surSuccesCompletionCourriel(infos, courriel);
229
				} else {
230
					lthis.surErreurCompletionCourriel();
231
				}
232
			},
233
			error : function(jqXHR, textStatus, errorThrown) {
234
				if (lthis.debug) {
235
					console.log('ERREUR: '+textStatus);
236
				}
237
				lthis.surErreurCompletionCourriel();
238
			},
239
			complete : function(jqXHR, textStatus) {
240
				if (lthis.debug) {
241
					console.log('COMPLETE: '+textStatus);
242
				}
243
				// @TODO harmoniser class="hidden" VS style="display:none;"
244
				$("#zone-prenom-nom").removeClass("hidden").show();
245
				$("#zone-courriel-confirmation").removeClass("hidden").show();
246
			}
247
		});
248
	}
249
};
250
 
251
WidgetSaisie.prototype.surSuccesCompletionCourriel = function(infos, courriel) {
252
	$("#id_utilisateur").val(infos.id);
253
	$("#prenom").val(infos.prenom);
254
	$("#nom").val(infos.nom);
255
	$("#courriel_confirmation").val(courriel);
256
	$("#prenom, #nom, #courriel_confirmation").attr('disabled', 'disabled');
257
	this.focusChampFormulaire();
258
	this.masquerPanneau("#dialogue-courriel-introuvable");
259
};
260
 
261
WidgetSaisie.prototype.surErreurCompletionCourriel = function() {
262
	$("#prenom, #nom, #courriel_confirmation").val('');
263
	$("#prenom, #nom, #courriel_confirmation").removeAttr('disabled');
264
	this.afficherPanneau("#dialogue-courriel-introuvable");
265
};
266
 
267
WidgetSaisie.prototype.formaterNom = function() {
268
	$(this).val($(this).val().toUpperCase());
269
};
270
 
271
WidgetSaisie.prototype.formaterPrenom = function() {
272
	var prenom = new Array();
273
	var mots = $(this).val().split(' ');
274
	for (var i = 0; i < mots.length; i++) {
275
		var mot = mots[i];
276
		if (mot.indexOf('-') >= 0) {
277
			var prenomCompose = new Array();
278
			var motsComposes = mot.split('-');
279
		    for (var j = 0; j < motsComposes.length; j++) {
280
		    	var motSimple = motsComposes[j];
281
		    	var motMajuscule = motSimple.charAt(0).toUpperCase() + motSimple.slice(1);
282
		    	prenomCompose.push(motMajuscule);
283
		    }
284
		    prenom.push(prenomCompose.join('-'));
285
		} else {
286
			var motMajuscule = mot.charAt(0).toUpperCase() + mot.slice(1);
287
			prenom.push(motMajuscule);
288
		}
289
	}
290
	$(this).val(prenom.join(' '));
291
};
292
 
293
WidgetSaisie.prototype.bloquerCopierCollerCourriel = function() {
294
	this.afficherPanneau("#dialogue-bloquer-copier-coller");
295
	return false;
296
};
297
 
298
WidgetSaisie.prototype.focusChampFormulaire = function() {
299
	$("#date").focus();
300
};
301
 
302
/* calendrier */
303
WidgetSaisie.prototype.configurerDatePicker = function(selector) {
304
	$.datepicker.setDefaults($.datepicker.regional[this.langue]);
305
	$(selector).datepicker({
306
		dateFormat: "dd/mm/yy",
307
		maxDate: new Date,
308
		onSelect: function(date) {
309
			$(this).valid();
310
		}
311
	});
312
	$(selector + ' + img.ui-datepicker-trigger').appendTo(selector + '-icone.add-on');
313
};
314
 
315
/* auto completion nom sci */
316
WidgetSaisie.prototype.ajouterAutocompletionNoms = function() {
317
	var lthis = this;
318
	$('#taxon').autocomplete({
319
		source: function(requete, add){
320
			// la variable de requête doit être vidée car sinon le parametre "term" est ajouté
321
			requete = "";
322
			if($("#referentiel").val() != "autre") {
323
				var url = lthis.getUrlAutocompletionNomsSci();console.log(url);
324
				$.getJSON(url, requete, function(data) {
325
					var suggestions = lthis.traiterRetourNomsSci(data);
326
					add(suggestions);
327
	            });
328
			}
329
        },
3163 delphine 330
        html: true,
331
        position : {
332
            my : 'top',
333
            at : 'top'
334
        }
3120 delphine 335
	});
336
 
337
	$("#taxon").bind("autocompleteselect", this.surAutocompletionTaxon);
338
};
339
 
340
WidgetSaisie.prototype.surAutocompletionTaxon = function(event, ui) {
341
	$("#taxon").data(ui.item);
342
	if (ui.item.retenu == true) {
343
		$("#taxon").addClass('ns-retenu');
344
	} else {
345
		$("#taxon").removeClass('ns-retenu');
346
	}
347
};
348
 
349
WidgetSaisie.prototype.getUrlAutocompletionNomsSci = function() {
350
	var mots = $('#taxon').val();
351
	var url = this.serviceAutocompletionNomSciUrlTpl.replace('{referentiel}', this.nomSciReferentiel);
352
	url = url.replace('{masque}', mots);
353
	return url;
354
};
355
 
356
WidgetSaisie.prototype.traiterRetourNomsSci = function(data) {
357
	var suggestions = [];
358
	if (data.resultat != undefined) {
359
		$.each(data.resultat, function(i, val) {
360
			val.nn = i;
361
			var nom = {label : '', value : '', nt : '', nomSel : '', nomSelComplet : '', numNomSel : '',
362
				nomRet : '', numNomRet : '', famille : '', retenu : false
363
			};
364
			if (suggestions.length >= this.autocompletionElementsNbre) {
365
				nom.label = "...";
366
				nom.value = $('#taxon').val();
367
				suggestions.push(nom);
368
				return false;
369
			} else {
370
				nom.label = val.nom_sci_complet;
371
				nom.value = val.nom_sci_complet;
372
				nom.nt = val.num_taxonomique;
373
				nom.nomSel = val.nom_sci;
374
				nom.nomSelComplet = val.nom_sci_complet;
375
				nom.numNomSel = val.nn;
376
				nom.nomRet = val.nom_retenu_complet;
377
				nom.numNomRet = val["nom_retenu.id"];
378
				nom.famille = val.famille;
379
				// Tester dans ce sens, permet de considérer "absent" comme "false" => est-ce opportun ?
380
				// en tout cas c'est harmonisé avec le CeL
381
				nom.retenu = (val.retenu == 'true') ? true : false;
382
 
383
				suggestions.push(nom);
384
			}
385
		});
386
	}
387
 
388
	return suggestions;
389
};
390
 
391
WidgetSaisie.prototype.afficherPanneau = function(selecteur) {
392
	$(selecteur).fadeIn("slow").delay(this.dureeMessage).fadeOut("slow");
393
};
394