Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
1537 jpm 1
//+---------------------------------------------------------------------------------------------------------+
2
// GÉNÉRAL
3
$(document).ready(function() {
4
	if (DEBUG == false) {
5
		$(window).on('beforeunload', function(event) {
6
			return 'Êtes vous sûr de vouloir quiter la page?\nLes observations saisies mais non transmises seront perdues.';
7
		});
8
	}
9
});
10
//+----------------------------------------------------------------------------------------------------------+
11
// FONCTIONS GÉNÉRIQUES
12
/**
13
 * Stope l'évènement courrant quand on clique sur un lien.
14
 * Utile pour Chrome, Safari...
15
 * @param evenement
16
 * @return
17
 */
18
function arreter(evenement) {
19
	if (evenement.stopPropagation) {
20
		evenement.stopPropagation();
21
	}
22
	if (evenement.preventDefault) {
23
		evenement.preventDefault();
24
	}
25
	return false;
26
}
27
 
28
function extraireEnteteDebug(jqXHR) {
29
	var msgDebug = '';
30
	if (jqXHR.getResponseHeader('X-DebugJrest-Data') != '') {
31
		var debugInfos = jQuery.parseJSON(jqXHR.getResponseHeader('X-DebugJrest-Data'));
32
		if (debugInfos != null) {
33
			$.each(debugInfos, function (cle, valeur) {
34
				msgDebug += valeur + "\n";
35
			});
36
		}
37
	}
38
	return msgDebug;
39
}
40
 
41
function afficherPanneau(selecteur) {
42
	$(selecteur).fadeIn('slow').delay(DUREE_MESSAGE).fadeOut('slow');
43
}
44
 
45
//+----------------------------------------------------------------------------------------------------------+
46
//UPLOAD PHOTO : Traitement de l'image
47
$(document).ready(function() {
48
	$('.effacer-miniature').click(function () {
49
		supprimerMiniatures($(this));
50
	});
51
 
52
	$('#photo-placeholder').click(function(event) {
1540 jpm 53
		$('#fichier').click();
1537 jpm 54
	});
55
 
56
	$('#fichier').bind('change', function (e) {
57
		arreter(e);
58
		var options = {
59
			success: afficherMiniature, // post-submit callback
60
			dataType: 'xml', // 'xml', 'script', or 'json' (expected server response type)
61
			resetForm: true // reset the form after successful submit
62
		};
1540 jpm 63
		$('#miniature').append(
64
			'<img id="miniature-chargement" class="miniature" alt="chargement" src="'+CHARGEMENT_IMAGE_URL+'"/>');
1537 jpm 65
		$('#ajouter-obs').attr('disabled', 'disabled');
66
		if(verifierFormat($('#fichier').val())) {
67
			$('#form-upload').ajaxSubmit(options);
68
		} else {
1540 jpm 69
			window.alert("Le format de fichier n'est pas supporté, les formats acceptés sont "+	$('#fichier').attr('accept'));
1537 jpm 70
		}
71
		return false;
72
	});
73
 
74
	$('.effacer-miniature').on('click', function() {
75
		$(this).parent().remove();
76
	});
77
});
78
 
79
function verifierFormat(nom) {
80
	var parts = nom.split('.');
81
	extension = parts[parts.length - 1];
82
	return (extension.toLowerCase() == 'jpeg' || extension.toLowerCase() == 'jpg');
83
}
84
 
85
function afficherMiniature(reponse) {
86
	if (DEBUG) {
87
		var debogage = $('debogage', reponse).text();
88
		console.log('Débogage upload : ' + debogage);
89
	}
90
	var message = $('message', reponse).text();
91
	if (message != '') {
92
		$('#miniature-msg').append(message);
93
	} else {
94
		$('#miniatures').append(creerWidgetMiniature(reponse));
95
	}
96
	$('#ajouter-obs').removeAttr('disabled');
97
}
98
 
99
function creerWidgetMiniature(reponse) {
100
	var miniatureUrl = $('miniature-url', reponse).text(),
101
		imgNom = $('image-nom', reponse).text(),
102
		html =
103
			'<div class="miniature">'+
104
				'<img class="miniature-img" class="miniature" alt="'+imgNom+'" src="'+miniatureUrl+'"/>'+
105
				'<button class="effacer-miniature" type="button">Effacer</button>'+
106
			'</div>'
107
	return html;
108
}
109
 
110
function supprimerMiniatures() {
111
	$('#miniatures').empty();
112
	$('#miniature-msg').empty();
113
}
114
 
115
//+----------------------------------------------------------------------------------------------------------+
116
// GOOGLE MAP
1540 jpm 117
var map,
118
	marker,
119
	latLng,
120
	geocoder;
1537 jpm 121
 
122
$(document).ready(function() {
123
	initialiserGoogleMap();
124
 
125
	// Autocompletion du champ adresse
1540 jpm 126
	$('#carte-recherche').on('focus', function() {
1537 jpm 127
		$(this).select();
128
	});
1540 jpm 129
	$('#carte-recherche').on('mouseup', function(event) {// Pour Safari...
1537 jpm 130
		event.preventDefault();
131
	});
132
 
1540 jpm 133
	$('#carte-recherche').keypress(function(e) {
1537 jpm 134
		if (e.which == 13) {
135
			e.preventDefault();
136
		}
137
	});
138
 
1540 jpm 139
	$('#carte-recherche').autocomplete({
1537 jpm 140
		//Cette partie utilise geocoder pour extraire des valeurs d'adresse
141
		source: function(request, response) {
142
 
143
			geocoder.geocode( {'address': request.term+', France', 'region' : 'fr' }, function(results, status) {
144
				if (status == google.maps.GeocoderStatus.OK) {
145
					response($.map(results, function(item) {
146
						var retour = {
147
							label: item.formatted_address,
148
							value: item.formatted_address,
149
							latitude: item.geometry.location.lat(),
150
							longitude: item.geometry.location.lng()
151
						};
152
						return retour;
153
					}));
154
				} else {
155
					afficherErreurGoogleMap(status);
156
				}
157
			});
158
		},
159
		// Cette partie est executee a la selection d'une adresse
160
		select: function(event, ui) {
161
			var latLng = new google.maps.LatLng(ui.item.latitude, ui.item.longitude);
162
			deplacerMarker(latLng);
163
		}
164
	});
165
 
1540 jpm 166
	$('#geolocaliser').on('click', geolocaliser);
1537 jpm 167
 
168
	google.maps.event.addListener(marker, 'dragend', surDeplacementMarker);
169
 
170
	google.maps.event.addListener(map, 'click', surClickDansCarte);
171
});
172
 
173
function initialiserGoogleMap(){
174
	// Carte
1540 jpm 175
	var latLng = new google.maps.LatLng(46.30871, 2.54395),// Centre de la France
176
		zoomDefaut = 5;
177
		options = {
178
			zoom: zoomDefaut,
179
			center: latLng,
180
			mapTypeId: google.maps.MapTypeId.HYBRID,
181
			mapTypeControlOptions: {
182
				mapTypeIds: ['OSM',
183
					google.maps.MapTypeId.ROADMAP,
184
					google.maps.MapTypeId.HYBRID,
185
					google.maps.MapTypeId.SATELLITE,
186
					google.maps.MapTypeId.TERRAIN]}
187
		};
1537 jpm 188
 
189
	// Ajout de la couche OSM à la carte
190
	osmMapType = new google.maps.ImageMapType({
191
		getTileUrl: function(coord, zoom) {
1540 jpm 192
			return 'http://tile.openstreetmap.org/' + zoom + '/' + coord.x + '/' + coord.y + '.png';
1537 jpm 193
		},
194
		tileSize: new google.maps.Size(256, 256),
195
		isPng: true,
196
		alt: 'OpenStreetMap',
197
		name: 'OSM',
198
		maxZoom: 19
199
	});
200
 
201
	// Création de la carte Google
202
	map = new google.maps.Map(document.getElementById('map-canvas'), options); //affiche la google map dans la div map_canvas
203
	map.mapTypes.set('OSM', osmMapType);
204
 
205
	// Création du Geocoder
206
	geocoder = new google.maps.Geocoder();
207
 
208
	// Marqueur google draggable
209
	marker = new google.maps.Marker({
210
		map: map,
211
		draggable: true,
212
		title: 'Ma station',
213
		icon: GOOGLE_MAP_MARQUEUR_URL,
214
		position: latLng
215
	});
216
 
217
	initialiserMarker(latLng);
218
 
219
	// Tentative de geocalisation
1540 jpm 220
 
1537 jpm 221
	if (navigator.geolocation) {
222
		navigator.geolocation.getCurrentPosition(function(position) {
1540 jpm 223
			var latitude = position.coords.latitude,
224
				longitude = position.coords.longitude;
1537 jpm 225
			latLng = new google.maps.LatLng(latitude, longitude);
1540 jpm 226
 
1537 jpm 227
			deplacerMarker(latLng);
228
		});
229
	}
230
}
231
 
232
function surDeplacementMarker() {
233
	trouverCommune(marker.getPosition());
234
	mettreAJourMarkerPosition(marker.getPosition());
235
}
236
 
237
function surClickDansCarte(event) {
238
	deplacerMarker(event.latLng);
239
}
240
 
1540 jpm 241
function geolocaliser(event) {
242
	var latitude = $('#latitude').val(),
243
		longitude = $('#longitude').val();
1537 jpm 244
	latLng = new google.maps.LatLng(latitude, longitude);
245
	deplacerMarker(latLng);
1540 jpm 246
	arreter(event);
1537 jpm 247
}
248
 
249
function initialiserMarker(latLng) {
250
	if (marker != undefined) {
251
		marker.setPosition(latLng);
252
		map.setCenter(latLng);
1540 jpm 253
		mettreAJourMarkerPosition(latLng);
254
		trouverCommune(latLng);
1537 jpm 255
	}
256
}
257
 
258
function deplacerMarker(latLng) {
259
	if (marker != undefined) {
260
		marker.setPosition(latLng);
261
		map.setCenter(latLng);
262
		mettreAJourMarkerPosition(latLng);
263
		trouverCommune(latLng);
264
	}
265
}
266
 
267
function mettreAJourMarkerPosition(latLng) {
1540 jpm 268
	var lat = latLng.lat().toFixed(5),
269
		lng = latLng.lng().toFixed(5);
1537 jpm 270
	remplirChampLatitude(lat);
271
	remplirChampLongitude(lng);
272
}
273
 
274
function remplirChampLatitude(latDecimale) {
275
	var lat = Math.round(latDecimale * 100000) / 100000;
276
	$('#latitude').val(lat);
277
}
278
 
279
function remplirChampLongitude(lngDecimale) {
280
	var lng = Math.round(lngDecimale * 100000) / 100000;
281
	$('#longitude').val(lng);
282
}
283
 
284
function trouverCommune(pos) {
285
	$(function() {
1540 jpm 286
		var url_service = SERVICE_NOM_COMMUNE_URL,
287
			urlNomCommuneFormatee = url_service.replace('{lat}', pos.lat()).replace('{lon}', pos.lng());
1537 jpm 288
		$.ajax({
1540 jpm 289
			url: urlNomCommuneFormatee,
290
			type: 'GET',
291
			dataType: 'jsonp',
292
			beforeSend: function() {
293
				$('.commune-info').empty();
294
				$('#dialogue-erreur .alert-txt').empty();
1537 jpm 295
			},
1540 jpm 296
			success: function(data, textStatus, jqXHR) {
297
				$('.commune-info').empty();
298
				$('#commune-nom').append(data.nom);
299
				$('#commune-code-insee').append(data.codeINSEE);
300
				$('#marqueur-commune').data('commune', {'nom' : data.nom, 'codeInsee' : data.codeINSEE});
1537 jpm 301
			},
1540 jpm 302
			statusCode: {
303
				500: function(jqXHR, textStatus, errorThrown) {
1537 jpm 304
					if (DEBUG) {
1540 jpm 305
						$('#dialogue-erreur .alert-txt').append('<p id="msg">Un problème est survenu lors de l\'appel au service fournissante le nom des communes.</p>');
1537 jpm 306
						reponse = jQuery.parseJSON(jqXHR.responseText);
307
						var erreurMsg = "";
308
						if (reponse != null) {
309
							$.each(reponse, function (cle, valeur) {
1540 jpm 310
								erreurMsg += valeur + '<br />';
1537 jpm 311
							});
312
						}
313
 
1540 jpm 314
						$('#dialogue-erreur .alert-txt').append(
315
							'<p class="msg-erreur">Erreur 500 : '+errorThrown+'<br />'+erreurMsg+'</p>');
1537 jpm 316
					}
1540 jpm 317
				}
1537 jpm 318
			},
1540 jpm 319
			error: function(jqXHR, textStatus, errorThrown) {
1537 jpm 320
				if (DEBUG) {
1540 jpm 321
					$('#dialogue-erreur .alert-txt').append(
322
						'<p class="msg">Une erreur Ajax est survenue lors de la transmission de vos observations.</p>');
1537 jpm 323
					reponse = jQuery.parseJSON(jqXHR.responseText);
1540 jpm 324
					var erreurMsg = '';
1537 jpm 325
					if (reponse != null) {
326
						$.each(reponse, function (cle, valeur) {
1540 jpm 327
							erreurMsg += valeur + '<br />';
1537 jpm 328
						});
329
					}
330
 
1540 jpm 331
					$('#dialogue-erreur .alert-txt').append(
332
						'<p class="msg-erreur">Erreur Ajax : '+errorThrown+' (type : '+textStatus+') <br />'+erreurMsg+'</p>');
1537 jpm 333
				}
334
			},
1540 jpm 335
			complete: function(jqXHR, textStatus) {
1537 jpm 336
				var debugMsg = extraireEnteteDebug(jqXHR);
337
				if (debugMsg != '') {
338
					if (DEBUG) {
339
						$("#dialogue-erreur .alert-txt").append('<pre class="msg-debug msg">Débogage : '+debugMsg+'</pre>');
340
					}
341
				}
342
				if ($("#dialogue-erreur .msg").length > 0) {
343
					$("#dialogue-erreur").show();
344
				}
345
			}
346
		});
347
	});
348
}
349
//+---------------------------------------------------------------------------------------------------------+
350
// IDENTITÉ
351
$(document).ready(function() {
352
	$('#courriel').on('blur', requeterIdentite);
353
	$('#courriel').on('keypress', testerLancementRequeteIdentite);
354
});
355
 
356
function testerLancementRequeteIdentite(event) {
357
	if (event.which == 13) {
358
		requeterIdentite();
359
		event.preventDefault();
360
		event.stopPropagation();
361
	}
362
}
363
 
364
function requeterIdentite() {
365
	var courriel = $('#courriel').val();
366
	//TODO: mettre ceci en paramètre de config
367
	var urlAnnuaire = SERVICE_ANNUAIRE_ID_URL + courriel;
368
	$.ajax({
1540 jpm 369
		url: urlAnnuaire,
370
		type: 'GET',
371
		success: function(data, textStatus, jqXHR) {
1537 jpm 372
			console.log('SUCCESS:'+textStatus);
373
			if (data != undefined && data[courriel] != undefined) {
374
				var infos = data[courriel];
375
				$('#id_utilisateur').val(infos.id);
376
				$('#prenom').val(infos.prenom);
377
				$('#nom').val(infos.nom);
378
				$('#courriel_confirmation').val(courriel);
379
				$('#prenom, #nom, #courriel_confirmation').attr('disabled', 'disabled');
380
				$('#date').focus();
381
			} else {
382
				surErreurCompletionCourriel();
383
			}
384
		},
1540 jpm 385
		error: function(jqXHR, textStatus, errorThrown) {
1537 jpm 386
			console.log('ERREUR :'+textStatus);
387
			surErreurCompletionCourriel();
388
		},
1540 jpm 389
		complete: function(jqXHR, textStatus) {
1537 jpm 390
			console.log('COMPLETE :'+textStatus);
391
			$('#zone-prenom-nom').removeClass('hidden');
392
			$('#zone-courriel-confirmation').removeClass('hidden');
393
		}
394
	});
395
}
396
 
397
function surErreurCompletionCourriel() {
398
	$('#prenom, #nom, #courriel_confirmation').val('');
399
	$('#prenom, #nom, #courriel_confirmation').removeAttr('disabled');
400
	afficherPanneau('#dialogue-courriel-introuvable');
401
}
402
//+---------------------------------------------------------------------------------------------------------+
403
// FORMULAIRE
404
var obsNbre = 0;
405
 
406
$(document).ready(function() {
407
	// Sliders
408
	transformerEnSlider('#presence-zone-vegetalise');
409
	transformerEnSlider('#hauteur-batiment-avoisinant');
410
	transformerEnSlider('#periodicite-traitement-phyto');
411
	transformerEnSlider('#resistance-traitement-phyto');
412
	transformerEnSlider('#vitesse-croissance');
413
 
1540 jpm 414
	// Afficher/Cacher champs cachés par défaut
1537 jpm 415
	$('#periodicite-traitement-phyto').on('change', function() {
416
		if ($(this).val() === 'jamais') {
417
			$('#datp-zone').removeClass('hidden');
418
		} else {
1540 jpm 419
			$('#datp-zone').addClass('hidden');
1537 jpm 420
		}
421
	});
422
	$('#taxon-liste').on('change', function() {
423
		if ($(this).val() === '?') {
424
			$('#taxon-input-groupe').removeClass('hidden');
425
		} else {
1540 jpm 426
			$('#taxon-input-groupe').addClass('hidden');
1537 jpm 427
		}
428
	});
429
 
430
	$('.alert .close').on('click', fermerPanneauAlert);
431
 
432
	$('[rel=tooltip]').tooltip('enable');
433
	$('#btn-aide').on('click', basculerAffichageAide);
434
 
435
	$('#prenom').on('change', formaterPrenom);
436
	$('#nom').on('change', formaterNom);
437
 
438
	configurerDatePicker('#date');
439
	configurerDatePicker('#date-arret-traitement-phyto');
1540 jpm 440
 
1537 jpm 441
	ajouterAutocompletionNoms();
1540 jpm 442
 
1537 jpm 443
	configurerFormValidator();
444
	definirReglesFormValidator();
445
 
446
	$('#courriel_confirmation').on('paste', bloquerCopierCollerCourriel);
447
 
448
	$('a.afficher-coord').on('click', basculerAffichageCoord);
449
 
450
	$('#ajouter-obs').on('click', ajouterObs);
451
 
452
	$('.obs-nbre').on('changement', surChangementNbreObs);
453
 
454
	$('body').on('click', '.supprimer-obs', supprimerObs);
455
 
456
	$('#transmettre-obs').on('click', transmettreObs);
457
 
458
	$('body').on('click', '.defilement-miniatures-gauche', function(event) {
459
		event.preventDefault();
460
		defilerMiniatures($(this));
461
	});
462
 
463
	$('body').on('click', '.defilement-miniatures-droite', function(event) {
464
		event.preventDefault();
465
		defilerMiniatures($(this));
466
	});
1540 jpm 467
 
468
	$('.dropdown-menu input, .dropdown-menu label').on('click', function(event) {
469
		event.stopPropagation();
470
	});
471
 
472
	$('input#hauteur-plante').on('blur', function() {
473
		// if there's a bad value
474
		var valeur = $(this).val();
475
		console.log(valeur);
476
		if (! valeur.match(/^[0-9]+$/)) {
477
			// replace it with nothing
478
			var nouvelleValeur = valeur.replace(/[^0-9]/g, '');
479
			$(this).val(nouvelleValeur);
480
		}
481
	});
1537 jpm 482
});
483
 
484
function transformerEnSlider(selector) {
485
	$(selector).each(function(index, el) {
486
		// hide the element
487
		$(el).addClass('slider-on');
488
 
489
		// add the slider to each element
490
		var slider = $( '<div class="slider-holder"><div class="horizontal-slider"></div></div>' ).
1560 jpm 491
			insertBefore( el ).find('.horizontal-slider').slider({
1537 jpm 492
				min: 1,
493
				max: el.options.length,
494
				range: 'min',
495
				value: el.selectedIndex + 1,
496
				slide: function( event, ui ) {
497
					el.selectedIndex = ui.value - 1;
498
					slider.find('a').text(el.options[el.selectedIndex].text);
499
				},
500
				stop: function() {
501
					$(el).change();
502
				}
503
			});
504
 
505
		slider.find('a').text(el.options[el.selectedIndex].text);
506
 
507
		// Create a legend under the slider so we can see the options
508
		var options = [];
509
		for (var option in $(el).children()) {
510
			if (!isNaN(parseInt(option))) {
511
				options.push(el.options[option].text);
512
			}
513
		}
514
		// the width of each legend/option
515
		var width = (slider.width() / (options.length - 1));
516
 
517
		// Add the legend. Half the width of the first and last options for display consistency.
518
		slider.after('<div class="slider-legend"><p style="width:' + (width / 2) + 'px;text-align:left;">' +
519
			options.join('</p><p style="width:' + width + 'px;">') +'</p></div>')
520
			.parent().find('.slider-legend p:last-child').css('width', width / 2)
521
			.css('text-align', 'right');
522
 
523
		// if there are too many options so that the text is wider than the width, then hide the text
524
		var lastChild = slider.parent().find('.slider-legend p:last-child');
525
		if (lastChild[0].clientWidth < lastChild[0].scrollWidth) {
1560 jpm 526
			slider.parent().find('.slider-legend p');//.css('text-indent', '200%');
1537 jpm 527
		}
528
	});
529
}
530
 
531
function configurerFormValidator() {
532
	$.validator.addMethod(
533
		'dateCel',
534
		function (value, element) {
535
			return value == '' || (/^[0-9]{2}[-\/][0-9]{2}[-\/][0-9]{4}$/.test(value));
536
		},
537
		'Format : jj/mm/aaaa. Date incomplète, utiliser 0, exemple : 00/12/2011.');
1560 jpm 538
	$.validator.addMethod(
539
		'chckMilieux',
540
		function(value, element) {
541
			var ok = $('input[name="milieux"]:checked').length > 0 ? true : false;
542
			console.log('Check Milieux : ' + ok);
543
			return ok;
544
		},
545
		'Veuillez sélectionner au moins une case à cocher.');
1537 jpm 546
 
547
	$.extend($.validator.defaults, {
1540 jpm 548
		highlight: function(element) {
549
			$(element).closest('.control-group').removeClass('success').addClass('error');
1560 jpm 550
 
551
			console.log('KO:'+$(element).attr('name')+' / nbre: '+$(element).length);
552
 
1537 jpm 553
		},
1540 jpm 554
		success: function(element) {
1560 jpm 555
			console.log('OK:'+element.before+' / nbre: '+$(element).length);
556
			console.log(element);
557
 
558
			element.text('OK!').addClass('valid');
559
			element.closest('.control-group').removeClass('error').addClass('success');
560
 
1540 jpm 561
			if (element.attr('id') == 'taxon' && $('#taxon').val() != '') {
562
				// Si le taxon n'est pas lié au référentiel, on vide le data associé
563
				if ($('#taxon').data('value') != $('#taxon').val()) {
564
					$('#taxon').data('numNomSel', '');
565
					$('#taxon').data('nomRet', '');
566
					$('#taxon').data('numNomRet', '');
567
					$('#taxon').data('nt', '');
568
					$('#taxon').data('famille', '');
1537 jpm 569
				}
570
			}
571
		}
572
	});
573
}
574
 
575
function definirReglesFormValidator() {
576
	$('#form-observateur').validate({
577
		rules: {
578
			courriel: {
579
				required: true,
580
				email: true},
581
			courriel_confirmation: {
582
				required: true,
1560 jpm 583
				equalTo: '#courriel'},
584
			prenom: {
585
				required: true},
586
			nom: {
587
				required: true},
588
			personneStructure: {
589
				required: true},
590
			personneService: {
591
				required: true}
1537 jpm 592
		}
593
	});
1560 jpm 594
	$('#form-site').validate({
1537 jpm 595
		rules: {
1560 jpm 596
			station: {
597
				required: true},
1537 jpm 598
			latitude : {
1560 jpm 599
				required: true,
1537 jpm 600
				range: [-90, 90]},
1540 jpm 601
			longitude: {
1560 jpm 602
				required: true,
603
				range: [-180, 180]},
604
			typoUrbaine: {
605
				required: true},
606
			revetementSol: {
607
				required: true},
608
			intensiteGestion: {
609
				required: true},
610
			periodiciteTraitementPhyto: {
611
				required: true},
612
			itineraireGestion: {
613
				required: true}
1537 jpm 614
		}
615
	});
1560 jpm 616
	$('#form-date').validate({
617
		rules: {
618
			date: {
619
				required: true,
620
				'dateCel' : true},
621
			dateDerniereIntervention: {
622
				required: true}
623
		}
624
	});
1537 jpm 625
	$('#form-obs').validate({
626
		rules: {
1560 jpm 627
			'taxon-liste': {
628
				required: true},
629
			milieux: {
630
				chckMilieux:true},
631
			hauteurPlante: {
632
				required: true,
633
				digits: true},
634
			resistanceTraitementPhyto: {
635
				required: true}
1537 jpm 636
		}
637
	});
638
}
639
 
640
function configurerDatePicker(selector) {
641
	$.datepicker.setDefaults($.datepicker.regional['fr']);
642
	$(selector).datepicker({
643
		dateFormat: 'dd/mm/yy',
644
		showOn: 'button',
645
		buttonImageOnly: true,
646
		buttonImage: CALENDRIER_ICONE_URL,
647
		buttonText: 'Afficher le calendrier pour saisir la date.',
648
		showButtonPanel: true
649
	});
650
	$(selector + ' + img.ui-datepicker-trigger').appendTo(selector + '-icone.add-on');
651
}
652
 
653
function fermerPanneauAlert() {
654
	$(this).parentsUntil('.zone-alerte', '.alert').hide();
655
}
656
 
657
function formaterNom() {
658
	$(this).val($(this).val().toUpperCase());
659
}
660
 
661
function formaterPrenom() {
1540 jpm 662
	var prenom = new Array(),
663
		mots = $(this).val().split(' ');
1537 jpm 664
	for (var i = 0; i < mots.length; i++) {
665
		var mot = mots[i];
666
		if (mot.indexOf('-') >= 0) {
1540 jpm 667
			var prenomCompose = new Array(),
668
				motsComposes = mot.split('-');
1537 jpm 669
			for (var j = 0; j < motsComposes.length; j++) {
1540 jpm 670
				var motSimple = motsComposes[j],
671
					motMajuscule = motSimple.charAt(0).toUpperCase() + motSimple.slice(1);
1537 jpm 672
				prenomCompose.push(motMajuscule);
673
			}
674
			prenom.push(prenomCompose.join('-'));
675
		} else {
676
			var motMajuscule = mot.charAt(0).toUpperCase() + mot.slice(1);
677
			prenom.push(motMajuscule);
678
		}
679
	}
680
	$(this).val(prenom.join(' '));
681
}
682
 
1560 jpm 683
function basculerAffichageAide() {
1537 jpm 684
	if ($(this).hasClass('btn-warning')) {
685
		$('[rel=tooltip]').tooltip('enable');
686
		$(this).removeClass('btn-warning').addClass('btn-success');
1540 jpm 687
		$('#btn-aide-txt', this).text("Désactiver l'aide");
1537 jpm 688
	} else {
689
		$('[rel=tooltip]').tooltip('disable');
690
		$(this).removeClass('btn-success').addClass('btn-warning');
691
		$('#btn-aide-txt', this).text("Activer l'aide");
692
	}
693
}
694
 
695
function bloquerCopierCollerCourriel() {
696
	afficherPanneau('#dialogue-bloquer-copier-coller');
697
	return false;
698
}
699
 
700
function basculerAffichageCoord() {
1540 jpm 701
	$('.afficher-coord-action').toggle();
1537 jpm 702
	$('#coordonnees-geo').toggle('slow');
703
	//valeur false pour que le lien ne soit pas suivi
704
	return false;
705
}
706
 
707
function ajouterObs() {
708
	if (validerFormulaire() == true) {
709
		obsNbre = obsNbre + 1;
710
		$('.obs-nbre').text(obsNbre);
711
		$('.obs-nbre').triggerHandler('changement');
712
		afficherObs();
713
		stockerObsData();
714
		supprimerMiniatures();
1540 jpm 715
		$('#taxon').val('').data('numNomSel', undefined).removeClass('ns-retenu');
1537 jpm 716
	} else {
717
		afficherPanneau('#dialogue-form-invalide');
718
	}
719
}
720
 
721
function afficherObs() {
1540 jpm 722
	var numNomSel = ($('#taxon-liste').val() == '?') ? $('#taxon').data('numNomSel') : $('#taxon-liste').val(),
723
		taxon = ($('#taxon-liste').val() == '?') ? $('#taxon').val() : taxons[numNomSel]['nom_sel'],
724
		referentiel = (numNomSel == undefined) ? '' : '['+NOM_SCI_PROJET+']',
725
		commune = $('#commune-nom').text(),
726
		codeInsee = $('#commune-code-insee').text(),
727
		lat = $('input[name="latitude"]').val(),
728
		lng = $('input[name="longitude"]').val(),
729
		date = $('#date').val(),
730
		site = $('#station').val(),
731
		milieux = getMilieux(),
732
		notes = $('#notes').val();
733
 
1537 jpm 734
	$('#liste-obs').prepend(
735
		'<div id="obs'+obsNbre+'" class="row-fluid obs obs'+obsNbre+'">'+
736
			'<div class="span12">'+
737
				'<div class="well">'+
738
					'<div class="obs-action pull-right" rel="tooltip" data-placement="bottom" '+
739
						'title="Supprimer cette observation de la liste à transmettre">'+
740
						'<button class="btn btn-danger supprimer-obs" value="'+obsNbre+'" title="'+obsNbre+'">'+
741
							'<i class="icon-trash icon-white"></i>'+
742
						'</button>'+
743
					'</div> '+
744
					'<div class="row-fluid">'+
745
						'<div class="thumbnail span2">'+
746
							ajouterImgMiniatureAuTransfert()+
747
						'</div>'+
748
						'<div class="span9">'+
749
							'<ul class="unstyled">'+
750
								'<li>'+
1540 jpm 751
									'<span class="nom-sci">' + taxon + '</span> ' +
752
									formaterNumNomSel(numNomSel)+
753
									'<span class="referentiel-obs">' + referentiel + '</span>' +
754
									' observé à ' +
755
									'<span class="commune">' + commune + '</span> ' +
756
									'(' + codeInsee + ') [' + lat +' / ' + lng + ']' +
757
									' le ' +
758
									'<span class="date">' + date + '</span>' +
759
								'</li>' +
760
								'<li>' +
761
									'<span>Site :</span> ' + site + ' ' +
762
									'<span>Milieu :</span> ' + milieux + ' ' +
763
								'</li>' +
764
								'<li>' +
765
									'Commentaires : <span class="discretion">' + notes + '</span>'+
1537 jpm 766
								'</li>'+
767
							'</ul>'+
768
						'</div>'+
769
					'</div>'+
770
				'</div>'+
771
			'</div>'+
772
		'</div>');
773
}
774
 
1540 jpm 775
function getMilieux() {
776
	var milieuxStr = '',
777
		milieux = [];
778
	$('input:checkbox[name="milieux"]:checked').each(function() {
779
		milieux.push($(this).val());
780
	});
781
 
782
	milieuxStr = Array.prototype.slice.call(milieux).join(', ');
783
	return milieuxStr;
784
}
785
 
786
function ajouterImgMiniatureAuTransfert() {
787
	var html = '',
788
		miniatures = '',
789
		premiere = true;
790
	if ($('#miniatures img').length >= 1) {
791
		$('#miniatures img').each(function() {
792
			var visible = premiere ? 'miniature-selectionnee' : 'miniature-cachee',
793
				css = $(this).hasClass('b64') ? 'miniature b64' : 'miniature',
794
				src = $(this).attr('src'),
795
				alt = $(this).attr('alt');
796
			premiere = false;
797
			miniature = '<img class="'+css+' '+visible+'"  alt="'+alt+'"src="'+src+'" />';
798
			miniatures += miniature;
799
		});
800
		visible = ($('#miniatures img').length > 1) ? '' : 'defilement-miniatures-cache';
801
		var html =
802
			'<div class="defilement-miniatures">'+
803
				'<a href="#" class="defilement-miniatures-gauche '+visible+'">&#60;</a>'+
804
				miniatures+
805
				'<a href="#" class="defilement-miniatures-droite '+visible+'">&#62;</a>'+
806
			'</div>';
807
	} else {
808
		html = '<img class="miniature" alt="Aucune photo"src="'+PAS_DE_PHOTO_ICONE_URL+'" />';
809
	}
810
	return html;
811
}
812
 
813
function formaterNumNomSel(numNomSel) {
814
	var nn = '';
815
 
816
	if (numNomSel == undefined) {
817
		nn = '<span class="alert-error">[non lié au référentiel]</span>';
818
	} else {
819
		nn = '<span class="nn">[nn'+numNomSel+']</span>';
820
	}
821
	return nn;
822
}
823
 
1537 jpm 824
function stockerObsData() {
825
	$('#liste-obs').data('obsId'+obsNbre, {
826
		'date' : $('#date').val(),
827
		'notes' : $('#notes').val(),
828
 
829
		'nom_sel' : $('#taxon').val(),
830
		'num_nom_sel' : $('#taxon').data('numNomSel'),
831
		'nom_ret' : $('#taxon').data('nomRet'),
832
		'num_nom_ret' : $('#taxon').data('numNomRet'),
833
		'num_taxon' : $('#taxon').data('nt'),
834
		'famille' : $('#taxon').data('famille'),
835
		'referentiel' : ($('#taxon').data('numNomSel') == undefined ? '' : NOM_SCI_REFERENTIEL),
836
 
837
		'latitude' : $('#latitude').val(),
838
		'longitude' : $('#longitude').val(),
839
		'commune_nom' : $('#commune-nom').text(),
840
		'commune_code_insee' : $('#commune-code-insee').text(),
841
		'lieudit' : $('#lieudit').val(),
842
		'station' : $('#station').val(),
843
		'milieu' : $('#milieu').val(),
844
 
845
		//Ajout des champs images
846
		'image_nom' : getNomsImgsOriginales(),
847
		'image_b64' : getB64ImgsOriginales()
848
	});
1560 jpm 849
	console.log($('#liste-obs').data('obsId'+obsNbre));
1537 jpm 850
}
851
 
852
function surChangementReferentiel() {
853
	NOM_SCI_PROJET = $('#referentiel').val();
854
	NOM_SCI_REFERENTIEL = NOM_SCI_PROJET+':'+PROJETS_VERSIONS[NOM_SCI_PROJET];
855
	$('#taxon').val('');
856
}
857
 
858
function surChangementNbreObs() {
859
	if (obsNbre == 0) {
860
		$('#transmettre-obs').attr('disabled', 'disabled');
861
		$('#ajouter-obs').removeAttr('disabled');
862
	} else if (obsNbre > 0 && obsNbre < OBS_MAX_NBRE) {
863
		$('#transmettre-obs').removeAttr('disabled');
864
		$('#ajouter-obs').removeAttr('disabled');
865
	} else if (obsNbre >= OBS_MAX_NBRE) {
866
		$('#ajouter-obs').attr('disabled', 'disabled');
867
		afficherPanneau('#dialogue-bloquer-creer-obs');
868
	}
869
}
870
 
871
function transmettreObs() {
872
	var observations = $('#liste-obs').data();
873
	console.log(observations);
874
 
875
	if (observations == undefined || jQuery.isEmptyObject(observations)) {
876
		afficherPanneau('#dialogue-zero-obs');
877
	} else {
878
		observations['projet'] = TAG_PROJET;
879
		observations['tag-obs'] = TAG_OBS;
880
		observations['tag-img'] = TAG_IMG;
881
 
882
		var utilisateur = new Object();
883
		utilisateur.id_utilisateur = $('#id_utilisateur').val();
884
		utilisateur.prenom = $('#prenom').val();
885
		utilisateur.nom = $('#nom').val();
886
		utilisateur.courriel = $('#courriel').val();
887
		observations['utilisateur'] = utilisateur;
888
		envoyerObsAuCel(observations);
889
	}
890
	return false;
891
}
892
 
893
function envoyerObsAuCel(observations) {
894
	var erreurMsg = '';
895
	$.ajax({
1540 jpm 896
		url: SERVICE_SAISIE_URL,
897
		type: 'POST',
898
		data: observations,
899
		dataType: 'json',
900
		beforeSend: function() {
1537 jpm 901
			$('#dialogue-obs-transaction-ko').hide();
902
			$('#dialogue-obs-transaction-ok').hide();
903
			$('.alert-txt .msg').remove();
904
			$('.alert-txt .msg-erreur').remove();
905
			$('.alert-txt .msg-debug').remove();
906
			$('#chargement').show();
907
		},
1540 jpm 908
		success: function(data, textStatus, jqXHR) {
1537 jpm 909
			$('#dialogue-obs-transaction-ok .alert-txt').append($('#tpl-transmission-ok').clone().html());
910
			supprimerMiniatures();
911
		},
1540 jpm 912
		statusCode: {
913
			500: function(jqXHR, textStatus, errorThrown) {
1537 jpm 914
				erreurMsg += "Erreur 500 :\ntype : " + textStatus + ' ' + errorThrown + "\n";
1540 jpm 915
			}
1537 jpm 916
		},
1540 jpm 917
		error: function(jqXHR, textStatus, errorThrown) {
1537 jpm 918
			erreurMsg += "Erreur Ajax :\ntype : " + textStatus + ' ' + errorThrown + "\n";
919
			try {
920
				reponse = jQuery.parseJSON(jqXHR.responseText);
921
				if (reponse != null) {
922
					$.each(reponse, function (cle, valeur) {
923
						erreurMsg += valeur + "\n";
924
					});
925
				}
926
			} catch(e) {
927
				erreurMsg += "L'erreur n'était pas en JSON.";
928
			}
929
		},
1540 jpm 930
		complete: function(jqXHR, textStatus) {
1537 jpm 931
			$('#chargement').hide();
932
			var debugMsg = extraireEnteteDebug(jqXHR);
933
 
934
			if (erreurMsg != '') {
935
				if (DEBUG) {
936
					$('#dialogue-obs-transaction-ko .alert-txt').append('<pre class="msg-erreur">' + erreurMsg + '</pre>');
937
					$('#dialogue-obs-transaction-ko .alert-txt').append('<pre class="msg-debug">Débogage : ' + debugMsg + '</pre>');
938
				}
1540 jpm 939
				var hrefCourriel = 'mailto:cel@tela-botanica.org?' +
940
					'subject=Disfonctionnement du widget de saisie ' + TAG_PROJET +
941
					'&body=' + erreurMsg + "\nDébogage :\n" + debugMsg;
1537 jpm 942
 
943
				$('#dialogue-obs-transaction-ko .alert-txt').append($('#tpl-transmission-ko').clone()
944
					.find('.courriel-erreur')
945
					.attr('href', hrefCourriel)
946
					.end()
947
					.html());
948
				$('#dialogue-obs-transaction-ko').show();
949
			} else {
950
				if (DEBUG) {
951
					$('#dialogue-obs-transaction-ok .alert-txt').append('<pre class="msg-debug">Débogage : ' + debugMsg + '</pre>');
952
				}
953
				$('#dialogue-obs-transaction-ok').show();
954
			}
955
			initialiserObs();
956
		}
957
	});
958
}
959
 
960
function validerFormulaire() {
1560 jpm 961
	var observateur = $('#form-observateur').valid(),
962
		station = $('#form-site').valid(),
963
		date = $('#form-date').valid(),
964
		obs = $('#form-obs').valid();
965
	return (observateur == true && station == true && obs == true && date == true) ? true : false;
1537 jpm 966
}
967
 
968
function getNomsImgsOriginales() {
969
	var noms = new Array();
970
	$('.miniature-img').each(function() {
971
		noms.push($(this).attr('alt'));
972
	});
973
	return noms;
974
}
975
 
976
function getB64ImgsOriginales() {
977
	var b64 = new Array();
978
	$('.miniature-img').each(function() {
979
		if ($(this).hasClass('b64')) {
980
			b64.push($(this).attr('src'));
981
		} else if ($(this).hasClass('b64-canvas')) {
982
			b64.push($(this).data('b64'));
983
		}
984
	});
985
	return b64;
986
}
987
 
988
function supprimerObs() {
989
	var obsId = $(this).val();
990
	// Problème avec IE 6 et 7
991
	if (obsId == 'Supprimer') {
992
		obsId = $(this).attr('title');
993
	}
994
	obsNbre = obsNbre - 1;
995
	$('.obs-nbre').text(obsNbre);
996
	$('.obs-nbre').triggerHandler('changement');
997
 
998
	$('.obs'+obsId).remove();
999
	$('#liste-obs').removeData('obsId' + obsId);
1000
}
1001
 
1002
function initialiserObs() {
1003
	obsNbre = 0;
1004
	$('.obs-nbre').text(obsNbre);
1005
	$('.obs-nbre').triggerHandler('changement');
1006
	$('#liste-obs').removeData();
1007
	$('.obs').remove();
1008
	$('#dialogue-bloquer-creer-obs').hide();
1009
}
1010
 
1011
 
1012
function defilerMiniatures(element) {
1540 jpm 1013
	var miniatureSelectionne = element.siblings('img.miniature-selectionnee');
1537 jpm 1014
	miniatureSelectionne.removeClass('miniature-selectionnee');
1015
	miniatureSelectionne.addClass('miniature-cachee');
1016
	var miniatureAffichee = miniatureSelectionne;
1017
 
1018
	if(element.hasClass('defilement-miniatures-gauche')) {
1019
		if(miniatureSelectionne.prev('.miniature').length != 0) {
1020
			miniatureAffichee = miniatureSelectionne.prev('.miniature');
1021
		} else {
1540 jpm 1022
			miniatureAffichee = miniatureSelectionne.siblings('.miniature').last();
1537 jpm 1023
		}
1024
	} else {
1025
		if(miniatureSelectionne.next('.miniature').length != 0) {
1026
			miniatureAffichee = miniatureSelectionne.next('.miniature');
1027
		} else {
1540 jpm 1028
			miniatureAffichee = miniatureSelectionne.siblings('.miniature').first();
1537 jpm 1029
		}
1030
	}
1031
	miniatureAffichee.addClass('miniature-selectionnee');
1032
	miniatureAffichee.removeClass('miniature-cachee');
1033
}
1034
 
1035
//+---------------------------------------------------------------------------------------------------------+
1036
// AUTO-COMPLÉTION Noms Scientifiques
1037
 
1038
function ajouterAutocompletionNoms() {
1039
	$('#taxon').autocomplete({
1040
		source: function(requete, add){
1041
			// la variable de requête doit être vidée car sinon le parametre "term" est ajouté
1042
 
1043
			var url = getUrlAutocompletionNomsSci();
1044
			$.getJSON(url, function(data) {
1045
				console.log(data);
1046
				var suggestions = traiterRetourNomsSci(data);
1047
				add(suggestions);
1048
			});
1049
		},
1050
		html: true
1051
	});
1052
 
1540 jpm 1053
	$('#taxon').bind('autocompleteselect', function(event, ui) {
1054
		$('#taxon').data(ui.item);
1537 jpm 1055
		if (ui.item.retenu == true) {
1540 jpm 1056
			$('#taxon').addClass('ns-retenu');
1537 jpm 1057
		} else {
1540 jpm 1058
			$('#taxon').removeClass('ns-retenu');
1537 jpm 1059
		}
1060
	});
1061
}
1062
 
1063
function getUrlAutocompletionNomsSci() {
1540 jpm 1064
	var mots = $('#taxon').val(),
1065
		url = SERVICE_AUTOCOMPLETION_NOM_SCI_URL_TPL.replace('{referentiel}',NOM_SCI_PROJET);
1537 jpm 1066
	url = url.replace('{masque}', mots);
1067
	return url;
1068
}
1069
 
1070
function traiterRetourNomsSci(data) {
1540 jpm 1071
	var suggestions = [];
1537 jpm 1072
	if (data.resultat != undefined) {
1073
		$.each(data.resultat, function(i, val) {
1074
			val.nn = i;
1540 jpm 1075
			var nom = {label: '', value: '', nt: '', nomSel: '', nomSelComplet: '', numNomSel: '',
1076
				nomRet: '', numNomRet: '', famille: '', retenu: false
1537 jpm 1077
			};
1078
			if (suggestions.length >= AUTOCOMPLETION_ELEMENTS_NBRE) {
1540 jpm 1079
				nom.label = '...';
1537 jpm 1080
				nom.value = $('#taxon').val();
1081
				suggestions.push(nom);
1082
				return false;
1083
			} else {
1084
				nom.label = val.nom_sci_complet;
1085
				nom.value = val.nom_sci_complet;
1086
				nom.nt = val.num_taxonomique;
1087
				nom.nomSel = val.nom_sci;
1088
				nom.nomSelComplet = val.nom_sci_complet;
1089
				nom.numNomSel = val.nn;
1090
				nom.nomRet = val.nom_retenu_complet;
1540 jpm 1091
				nom.numNomRet = val['nom_retenu.id'];
1537 jpm 1092
				nom.famille = val.famille;
1093
				nom.retenu = (val.retenu == 'false') ? false : true;
1094
 
1095
				suggestions.push(nom);
1540 jpm 1096
			}
1537 jpm 1097
		});
1098
	}
1099
	return suggestions;
1100
}
1101
 
1102
/*
1103
 * jQuery UI Autocomplete HTML Extension
1104
 *
1105
 * Copyright 2010, Scott González (http://scottgonzalez.com)
1106
 * Dual licensed under the MIT or GPL Version 2 licenses.
1107
 *
1108
 * http://github.com/scottgonzalez/jquery-ui-extensions
1109
 *
1110
 * Adaptation par Aurélien Peronnet pour la mise en gras des noms de taxons valides
1111
 */
1540 jpm 1112
(function($) {
1537 jpm 1113
	var proto = $.ui.autocomplete.prototype,
1114
		initSource = proto._initSource;
1115
 
1540 jpm 1116
	function filter(array, term) {
1117
		var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), 'i');
1118
		return $.grep(array, function(value) {
1119
			return matcher.test($('<div>').html(value.label || value.value || value).text());
1537 jpm 1120
		});
1121
	}
1122
 
1540 jpm 1123
	$.extend(proto, {
1537 jpm 1124
		_initSource: function() {
1540 jpm 1125
			if (this.options.html && $.isArray(this.options.source)) {
1537 jpm 1126
				this.source = function( request, response ) {
1540 jpm 1127
					response(filter(this.options.source, request.term));
1537 jpm 1128
				};
1129
			} else {
1540 jpm 1130
				initSource.call(this);
1537 jpm 1131
			}
1132
		},
1540 jpm 1133
		_renderItem: function(ul, item) {
1537 jpm 1134
			if (item.retenu == true) {
1540 jpm 1135
				item.label = '<strong>'+item.label+'</strong>';
1537 jpm 1136
			}
1137
 
1540 jpm 1138
			return $('<li></li>')
1139
				.data('item.autocomplete', item)
1140
				.append($('<a></a>')[this.options.html ? 'html' : 'text'](item.label))
1141
				.appendTo(ul);
1537 jpm 1142
		}
1143
	});
1540 jpm 1144
})(jQuery);