Subversion Repositories eFlore/Applications.cel

Rev

Rev 2118 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2118 Rev 2408
1
//+---------------------------------------------------------------------------------------------------------+
1
//+---------------------------------------------------------------------------------------------------------+
2
// GÉNÉRAL
2
// GÉNÉRAL
3
$(document).ready(function() {
3
$(document).ready(function() {
4
	if (DEBUG == false) {
4
	if (DEBUG == false) {
5
		$(window).on('beforeunload', function(event) {
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.';
6
			return 'Êtes vous sûr de vouloir quiter la page?\nLes observations saisies mais non transmises seront perdues.';
7
		});
7
		});
8
	}
8
	}
9
});
9
});
10
//+----------------------------------------------------------------------------------------------------------+
10
//+----------------------------------------------------------------------------------------------------------+
11
// FONCTIONS GÉNÉRIQUES
11
// FONCTIONS GÉNÉRIQUES
12
/**
12
/**
13
 * Stope l'évènement courrant quand on clique sur un lien.
13
 * Stope l'évènement courrant quand on clique sur un lien.
14
 * Utile pour Chrome, Safari...
14
 * Utile pour Chrome, Safari...
15
 * @param evenement
15
 * @param evenement
16
 * @return
16
 * @return
17
 */
17
 */
18
function arreter(evenement) {
18
function arreter(evenement) {
19
	if (evenement.stopPropagation) {
19
	if (evenement.stopPropagation) {
20
		evenement.stopPropagation();
20
		evenement.stopPropagation();
21
	}
21
	}
22
	if (evenement.preventDefault) {
22
	if (evenement.preventDefault) {
23
		evenement.preventDefault();
23
		evenement.preventDefault();
24
	}
24
	}
25
	return false;
25
	return false;
26
}
26
}
27
 
27
 
28
function extraireEnteteDebug(jqXHR) {
28
function extraireEnteteDebug(jqXHR) {
29
	var msgDebug = '';
29
	var msgDebug = '';
30
	if (jqXHR.getResponseHeader('X-DebugJrest-Data') != '') {
30
	if (jqXHR.getResponseHeader('X-DebugJrest-Data') != '') {
31
		var debugInfos = jQuery.parseJSON(jqXHR.getResponseHeader('X-DebugJrest-Data'));
31
		var debugInfos = jQuery.parseJSON(jqXHR.getResponseHeader('X-DebugJrest-Data'));
32
		if (debugInfos != null) {
32
		if (debugInfos != null) {
33
			$.each(debugInfos, function (cle, valeur) {
33
			$.each(debugInfos, function (cle, valeur) {
34
				msgDebug += valeur + "\n";
34
				msgDebug += valeur + "\n";
35
			});
35
			});
36
		}
36
		}
37
	}
37
	}
38
	return msgDebug;
38
	return msgDebug;
39
}
39
}
40
 
40
 
41
function afficherPanneau(selecteur) {
41
function afficherPanneau(selecteur) {
42
	$(selecteur).fadeIn('slow').delay(DUREE_MESSAGE).fadeOut('slow');
42
	$(selecteur).fadeIn('slow').delay(DUREE_MESSAGE).fadeOut('slow');
43
}
43
}
44
 
44
 
45
//+----------------------------------------------------------------------------------------------------------+
45
//+----------------------------------------------------------------------------------------------------------+
46
// PRÉCHARGEMENT DU FORMULAIRE
46
// PRÉCHARGEMENT DU FORMULAIRE
47
var latLngDebPre = {lat: null, lng: null},
47
var latLngDebPre = {lat: null, lng: null},
48
	latLngFinPre = {lat: null, lng: null},
48
	latLngFinPre = {lat: null, lng: null},
49
	okPourChargementCarte = 2;
49
	okPourChargementCarte = 2;
50
 
50
 
51
$(document).ready(function() {
51
$(document).ready(function() {
52
	if (OBS_ID != '') {
52
	if (OBS_ID != '') {
53
		chargerInfoObs();
53
		chargerInfoObs();
54
	}
54
	}
55
});
55
});
56
 
56
 
57
function chargerInfoObs() {
57
function chargerInfoObs() {
58
	var urlObs = SERVICE_OBS_URL + '/' + OBS_ID;
58
	var urlObs = SERVICE_OBS_URL + '/' + OBS_ID;
59
	$.ajax({
59
	$.ajax({
60
		url: urlObs,
60
		url: urlObs,
61
		type: 'GET',
61
		type: 'GET',
62
		success: function(data, textStatus, jqXHR) {
62
		success: function(data, textStatus, jqXHR) {
63
			if (data != undefined) {
63
			if (data != undefined) {
64
				prechargerForm(data);
64
				prechargerForm(data);
65
			} else {
65
			} else {
66
				surErreurChargementInfosObs();
66
				surErreurChargementInfosObs();
67
			}
67
			}
68
		},
68
		},
69
		error: function(jqXHR, textStatus, errorThrown) {
69
		error: function(jqXHR, textStatus, errorThrown) {
70
			surErreurChargementInfosObs();
70
			surErreurChargementInfosObs();
71
		}
71
		}
72
	});
72
	});
73
}
73
}
74
 
74
 
75
function prechargerForm(infos) {
75
function prechargerForm(infos) {
76
	$('input[name="station"]').val(infos.station);
76
	$('input[name="station"]').val(infos.station);
77
	
77
 
78
	//console.log(infos.extension);
78
	//console.log(infos.extension);
79
	if (infos.extension) {
79
	if (infos.extension) {
80
		var ext = infos.extension;
80
		var ext = infos.extension;
81
		if (ext.latitudeDebutRue && ext.longitudeDebutRue && ext.latitudeFinRue && ext.longitudeFinRue) {
81
		if (ext.latitudeDebutRue && ext.longitudeDebutRue && ext.latitudeFinRue && ext.longitudeFinRue) {
82
			okPourChargementCarte--;
82
			okPourChargementCarte--;
83
			latLngDebPre.lat = parseFloat(ext.latitudeDebutRue.valeur);
83
			latLngDebPre.lat = parseFloat(ext.latitudeDebutRue.valeur);
84
			latLngDebPre.lng = parseFloat(ext.longitudeDebutRue.valeur);
84
			latLngDebPre.lng = parseFloat(ext.longitudeDebutRue.valeur);
85
			latLngFinPre.lat = parseFloat(ext.latitudeFinRue.valeur);
85
			latLngFinPre.lat = parseFloat(ext.latitudeFinRue.valeur);
86
			latLngFinPre.lng = parseFloat(ext.longitudeFinRue.valeur);
86
			latLngFinPre.lng = parseFloat(ext.longitudeFinRue.valeur);
87
			prechargerRue();
87
			prechargerRue();
88
		}
88
		}
89
		
89
 
90
		var chpsARemplir = ['adresse', 'typoUrbaine', 'revetementSol', 'presenceZoneVegetalise', 'hauteurBatimentAvoisinant',
90
		var chpsARemplir = ['adresse', 'typoUrbaine', 'revetementSol', 'presenceZoneVegetalise', 'hauteurBatimentAvoisinant',
91
			'intensiteGestion', 'periodiciteTraitementPhyto', 'dateArretTraitementPhyto', 'itineraireGestion'];
91
			'intensiteGestion', 'periodiciteTraitementPhyto', 'dateArretTraitementPhyto', 'itineraireGestion'];
92
		$.each(infos.extension, function(nomDuChp, value) {
92
		$.each(infos.extension, function(nomDuChp, value) {
93
			if (chpsARemplir.indexOf(nomDuChp) >= 0) {
93
			if (chpsARemplir.indexOf(nomDuChp) >= 0) {
94
				if ($('[name="' + nomDuChp + '"]').hasClass('slider')) {
94
				if ($('[name="' + nomDuChp + '"]').hasClass('slider')) {
95
					$('select[name="' + nomDuChp + '"] option[value="' + value.valeur + '"]')
95
					$('select[name="' + nomDuChp + '"] option[value="' + value.valeur + '"]')
96
						.attr('selected', 'selected');
96
						.attr('selected', 'selected');
97
					var selectedIndexOptions = $('select[name="' + nomDuChp + '"]').prop('selectedIndex') + 1;
97
					var selectedIndexOptions = $('select[name="' + nomDuChp + '"]').prop('selectedIndex') + 1;
98
					$('[name="' + nomDuChp + '"]').parent().find('.horizontal-slider').slider('value', selectedIndexOptions);
98
					$('[name="' + nomDuChp + '"]').parent().find('.horizontal-slider').slider('value', selectedIndexOptions);
99
					
99
 
100
					if (nomDuChp == 'periodiciteTraitementPhyto') {
100
					if (nomDuChp == 'periodiciteTraitementPhyto') {
101
						$('[name="periodiciteTraitementPhyto"]').trigger('change');
101
						$('[name="periodiciteTraitementPhyto"]').trigger('change');
102
					}
102
					}
103
				} else {
103
				} else {
104
					$('[name="' + nomDuChp + '"]').val(value.valeur);
104
					$('[name="' + nomDuChp + '"]').val(value.valeur);
105
				}
105
				}
106
			}
106
			}
107
		});
107
		});
108
	}
108
	}
109
}
109
}
110
 
110
 
111
function prechargerRue() {
111
function prechargerRue() {
112
	//console.log('okPourChargementCarte : '+okPourChargementCarte);
112
	//console.log('okPourChargementCarte : '+okPourChargementCarte);
113
	if (okPourChargementCarte == 0) {
113
	if (okPourChargementCarte == 0) {
114
		latLngDeb = new google.maps.LatLng(latLngDebPre.lat, latLngDebPre.lng);
114
		latLngDeb = new google.maps.LatLng(latLngDebPre.lat, latLngDebPre.lng);
115
		markerDeb = undefined;
115
		markerDeb = undefined;
116
		initialiserMarkerDeb();
116
		initialiserMarkerDeb();
117
		deplacerMarkerDeb(latLngDeb);
117
		deplacerMarkerDeb(latLngDeb);
118
		premierDeplacement = false;
118
		premierDeplacement = false;
119
		markerFin = undefined;
119
		markerFin = undefined;
120
		latLngFin = new google.maps.LatLng(latLngFinPre.lat, latLngFinPre.lng);
120
		latLngFin = new google.maps.LatLng(latLngFinPre.lat, latLngFinPre.lng);
121
		initialiserMarkerFin();
121
		initialiserMarkerFin();
122
		deplacerMakerFin(latLngFin)
122
		deplacerMakerFin(latLngFin)
123
		surDeplacementMarkerFin();
123
		surDeplacementMarkerFin();
124
		map.setZoom(16);
124
		map.setZoom(16);
125
	}
125
	}
126
}
126
}
127
 
127
 
128
//+----------------------------------------------------------------------------------------------------------+
128
//+----------------------------------------------------------------------------------------------------------+
129
//FORM IDENTITE : gestion de l'observateur
129
//FORM IDENTITE : gestion de l'observateur
130
 
130
 
131
$(document).ready(function() {
131
$(document).ready(function() {
132
	requeterIdentite();// Sur rechargement de la page
132
	requeterIdentite();// Sur rechargement de la page
133
 
133
 
134
	// Interaction sur le formulaire observateur
134
	// Interaction sur le formulaire observateur
135
	$('#prenom').on('change', formaterPrenom);
135
	$('#prenom').on('change', formaterPrenom);
136
	$('#nom').on('change', formaterNom);
136
	$('#nom').on('change', formaterNom);
137
	$('#courriel').on('blur', requeterIdentite);
137
	$('#courriel').on('blur', requeterIdentite);
138
	$('#courriel').on('keyup', testerLancementRequeteIdentite);
138
	$('#courriel').on('keyup', testerLancementRequeteIdentite);
139
	$('#courriel_confirmation').on('paste', bloquerCopierCollerCourriel);
139
	$('#courriel_confirmation').on('paste', bloquerCopierCollerCourriel);
140
});
140
});
141
 
141
 
142
function testerLancementRequeteIdentite(event) {
142
function testerLancementRequeteIdentite(event) {
143
	if (event.which == 13) {
143
	if (event.which == 13) {
144
		requeterIdentite();
144
		requeterIdentite();
145
		event.preventDefault();
145
		event.preventDefault();
146
		event.stopPropagation();
146
		event.stopPropagation();
147
	}
147
	}
148
}
148
}
149
 
149
 
150
function requeterIdentite() {
150
function requeterIdentite() {
151
	var courriel = $('#courriel').val();
151
	var courriel = $('#courriel').val();
152
	if (courriel) {
152
	if (courriel) {
153
		var urlAnnuaire = SERVICE_ANNUAIRE_ID_URL + courriel;
153
		var urlAnnuaire = SERVICE_ANNUAIRE_ID_URL + courriel;
154
		$.ajax({
154
		$.ajax({
155
			url: urlAnnuaire,
155
			url: urlAnnuaire,
156
			type: 'GET',
156
			type: 'GET',
157
			success: function(data, textStatus, jqXHR) {
157
			success: function(data, textStatus, jqXHR) {
158
				if (data != undefined && data[courriel] != undefined) {
158
				if (data != undefined && data[courriel] != undefined) {
159
					var infos = data[courriel];
159
					var infos = data[courriel];
160
					$('#id_utilisateur').val(infos.id);
160
					$('#id_utilisateur').val(infos.id);
161
					$('#prenom').val(infos.prenom);
161
					$('#prenom').val(infos.prenom);
162
					$('#nom').val(infos.nom);
162
					$('#nom').val(infos.nom);
163
					$('#courriel_confirmation').val(courriel);
163
					$('#courriel_confirmation').val(courriel);
164
					$('#prenom, #nom, #courriel_confirmation').attr('disabled', 'disabled');
164
					$('#prenom, #nom, #courriel_confirmation').attr('disabled', 'disabled');
165
					$('#structure').focus();
165
					$('#structure').focus();
166
				} else {
166
				} else {
167
					surErreurCompletionCourriel();
167
					surErreurCompletionCourriel();
168
				}
168
				}
169
			},
169
			},
170
			error: function(jqXHR, textStatus, errorThrown) {
170
			error: function(jqXHR, textStatus, errorThrown) {
171
				surErreurCompletionCourriel();
171
				surErreurCompletionCourriel();
172
			},
172
			},
173
			complete: function(jqXHR, textStatus) {
173
			complete: function(jqXHR, textStatus) {
174
				$('#zone-courriel-confirmation, #zone-prenom-nom').removeClass('hidden');
174
				$('#zone-courriel-confirmation, #zone-prenom-nom').removeClass('hidden');
175
			}
175
			}
176
		});
176
		});
177
	}
177
	}
178
}
178
}
179
 
179
 
180
function surErreurCompletionCourriel() {
180
function surErreurCompletionCourriel() {
181
	$('#prenom, #nom, #courriel_confirmation').removeAttr('disabled');
181
	$('#prenom, #nom, #courriel_confirmation').removeAttr('disabled');
182
	afficherPanneau('#dialogue-courriel-introuvable');
182
	afficherPanneau('#dialogue-courriel-introuvable');
183
}
183
}
184
 
184
 
185
function formaterNom() {
185
function formaterNom() {
186
	$(this).val($(this).val().toUpperCase());
186
	$(this).val($(this).val().toUpperCase());
187
}
187
}
188
 
188
 
189
function formaterPrenom() {
189
function formaterPrenom() {
190
	var prenom = new Array(),
190
	var prenom = new Array(),
191
		mots = $(this).val().split(' ');
191
		mots = $(this).val().split(' ');
192
	for (var i = 0; i < mots.length; i++) {
192
	for (var i = 0; i < mots.length; i++) {
193
		var mot = mots[i];
193
		var mot = mots[i];
194
		if (mot.indexOf('-') >= 0) {
194
		if (mot.indexOf('-') >= 0) {
195
			var prenomCompose = new Array(),
195
			var prenomCompose = new Array(),
196
				motsComposes = mot.split('-');
196
				motsComposes = mot.split('-');
197
			for (var j = 0; j < motsComposes.length; j++) {
197
			for (var j = 0; j < motsComposes.length; j++) {
198
				var motSimple = motsComposes[j],
198
				var motSimple = motsComposes[j],
199
					motMajuscule = motSimple.charAt(0).toUpperCase() + motSimple.slice(1);
199
					motMajuscule = motSimple.charAt(0).toUpperCase() + motSimple.slice(1);
200
				prenomCompose.push(motMajuscule);
200
				prenomCompose.push(motMajuscule);
201
			}
201
			}
202
			prenom.push(prenomCompose.join('-'));
202
			prenom.push(prenomCompose.join('-'));
203
		} else {
203
		} else {
204
			var motMajuscule = mot.charAt(0).toUpperCase() + mot.slice(1);
204
			var motMajuscule = mot.charAt(0).toUpperCase() + mot.slice(1);
205
			prenom.push(motMajuscule);
205
			prenom.push(motMajuscule);
206
		}
206
		}
207
	}
207
	}
208
	$(this).val(prenom.join(' '));
208
	$(this).val(prenom.join(' '));
209
}
209
}
210
 
210
 
211
function bloquerCopierCollerCourriel() {
211
function bloquerCopierCollerCourriel() {
212
	afficherPanneau('#dialogue-bloquer-copier-coller');
212
	afficherPanneau('#dialogue-bloquer-copier-coller');
213
	return false;
213
	return false;
214
}
214
}
215
 
215
 
216
//+----------------------------------------------------------------------------------------------------------+
216
//+----------------------------------------------------------------------------------------------------------+
217
// GOOGLE MAP
217
// GOOGLE MAP
218
 
218
 
219
var map,
219
var map,
220
	geocoder,	
220
	geocoder,
221
	markerDeb,
221
	markerDeb,
222
	latLngDeb,
222
	latLngDeb,
223
	markerFin,
223
	markerFin,
224
	latLngFin,
224
	latLngFin,
225
	ligneRue,
225
	ligneRue,
226
	premierDeplacement = true;
226
	premierDeplacement = true;
227
 
227
 
228
$(document).ready(function() {
228
$(document).ready(function() {
229
	initialiserGoogleMap();
229
	initialiserGoogleMap();
230
	afficherEtapeGeolocalisation(1);
230
	afficherEtapeGeolocalisation(1);
231
	
231
 
232
	// Autocompletion du champ adresse
232
	// Autocompletion du champ adresse
233
	$('#carte-recherche').on('focus', function() {
233
	$('#carte-recherche').on('focus', function() {
234
		$(this).select();
234
		$(this).select();
235
	});
235
	});
236
	$('#carte-recherche').on('mouseup', function(event) {// Pour Safari...
236
	$('#carte-recherche').on('mouseup', function(event) {// Pour Safari...
237
		event.preventDefault();
237
		event.preventDefault();
238
	});
238
	});
239
	
239
 
240
	$('#carte-recherche').keypress(function(e) {
240
	$('#carte-recherche').keypress(function(e) {
241
		if (e.which == 13) {
241
		if (e.which == 13) {
242
			e.preventDefault();
242
			e.preventDefault();
243
		}
243
		}
244
	});
244
	});
245
	
245
 
246
	$('#carte-recherche').autocomplete({
246
	$('#carte-recherche').autocomplete({
247
		//Cette partie utilise geocoder pour extraire des valeurs d'adresse
247
		//Cette partie utilise geocoder pour extraire des valeurs d'adresse
248
		source: function(request, response) {
248
		source: function(request, response) {
249
			
249
 
250
			geocoder.geocode( {'address': request.term+', France', 'region' : 'fr' }, function(results, status) {
250
			geocoder.geocode( {'address': request.term+', France', 'region' : 'fr' }, function(results, status) {
251
				if (status == google.maps.GeocoderStatus.OK) {
251
				if (status == google.maps.GeocoderStatus.OK) {
252
					response($.map(results, function(item) {
252
					response($.map(results, function(item) {
253
						var retour = {
253
						var retour = {
254
							label: item.formatted_address,
254
							label: item.formatted_address,
255
							value: item.formatted_address,
255
							value: item.formatted_address,
256
							latitude: item.geometry.location.lat(),
256
							latitude: item.geometry.location.lat(),
257
							longitude: item.geometry.location.lng()
257
							longitude: item.geometry.location.lng()
258
						};
258
						};
259
						return retour;
259
						return retour;
260
					}));
260
					}));
261
				} else {
261
				} else {
262
					afficherErreurGoogleMap(status);
262
					afficherErreurGoogleMap(status);
263
				}
263
				}
264
			});
264
			});
265
		},
265
		},
266
		// Cette partie est executee a la selection d'une adresse
266
		// Cette partie est executee a la selection d'une adresse
267
		select: function(event, ui) {
267
		select: function(event, ui) {
268
			var nouvellePosition = new google.maps.LatLng(ui.item.latitude, ui.item.longitude);
268
			var nouvellePosition = new google.maps.LatLng(ui.item.latitude, ui.item.longitude);
269
			initialiserMarkerDeb();
269
			initialiserMarkerDeb();
270
			deplacerMarkerDeb(nouvellePosition);
270
			deplacerMarkerDeb(nouvellePosition);
271
			map.setZoom(16);
271
			map.setZoom(16);
272
			afficherEtapeGeolocalisation(2);
272
			afficherEtapeGeolocalisation(2);
273
		}
273
		}
274
	});
274
	});
275
	
275
 
276
	$('#geolocaliser').on('click', geolocaliser);
276
	$('#geolocaliser').on('click', geolocaliser);
277
});
277
});
278
 
278
 
279
function initialiserGoogleMap(){
279
function initialiserGoogleMap(){
280
	latLngDeb = new google.maps.LatLng(46.30871, 2.54395);// Centre de la France
280
	latLngDeb = new google.maps.LatLng(46.30871, 2.54395);// Centre de la France
281
	var options = {
281
	var options = {
282
			zoom: 5,
282
			zoom: 5,
283
			center: latLngDeb,
283
			center: latLngDeb,
284
			mapTypeId: google.maps.MapTypeId.HYBRID,
284
			mapTypeId: google.maps.MapTypeId.HYBRID,
285
			mapTypeControlOptions: {
285
			mapTypeControlOptions: {
286
				mapTypeIds: ['OSM', 
286
				mapTypeIds: ['OSM',
287
					google.maps.MapTypeId.ROADMAP, 
287
					google.maps.MapTypeId.ROADMAP,
288
					google.maps.MapTypeId.HYBRID, 
288
					google.maps.MapTypeId.HYBRID,
289
					google.maps.MapTypeId.SATELLITE, 
289
					google.maps.MapTypeId.SATELLITE,
290
					google.maps.MapTypeId.TERRAIN]}
290
					google.maps.MapTypeId.TERRAIN]}
291
		};
291
		};
292
	
292
 
293
	// Ajout de la couche OSM à la carte
293
	// Ajout de la couche OSM à la carte
294
	osmMapType = new google.maps.ImageMapType({
294
	osmMapType = new google.maps.ImageMapType({
295
		getTileUrl: function(coord, zoom) {
295
		getTileUrl: function(coord, zoom) {
296
			return 'http://tile.openstreetmap.org/' + zoom + '/' + coord.x + '/' + coord.y + '.png';
296
			return 'http://tile.openstreetmap.org/' + zoom + '/' + coord.x + '/' + coord.y + '.png';
297
		},
297
		},
298
		tileSize: new google.maps.Size(256, 256),
298
		tileSize: new google.maps.Size(256, 256),
299
		isPng: true,
299
		isPng: true,
300
		alt: 'OpenStreetMap',
300
		alt: 'OpenStreetMap',
301
		name: 'OSM',
301
		name: 'OSM',
302
		maxZoom: 19
302
		maxZoom: 19
303
	});
303
	});
304
	
304
 
305
	// Création de la carte Google
305
	// Création de la carte Google
306
	map = new google.maps.Map(document.getElementById('map-canvas'), options); //affiche la google map dans la div map_canvas
306
	map = new google.maps.Map(document.getElementById('map-canvas'), options); //affiche la google map dans la div map_canvas
307
	map.mapTypes.set('OSM', osmMapType);
307
	map.mapTypes.set('OSM', osmMapType);
308
	
308
 
309
	// Ajout de l'évènment sur click dans Carte
309
	// Ajout de l'évènment sur click dans Carte
310
	google.maps.event.addListener(map, 'click', surClickDansCarte);
310
	google.maps.event.addListener(map, 'click', surClickDansCarte);
311
	
311
 
312
	// Lorsque la carte est chargée, on vérifie si on peut précharger des données
312
	// Lorsque la carte est chargée, on vérifie si on peut précharger des données
313
	google.maps.event.addListenerOnce(map, 'idle', function(){
313
	google.maps.event.addListenerOnce(map, 'idle', function(){
314
		if (OBS_ID == '') {
314
		if (OBS_ID == '') {
315
			// Initialisation du marker de début de rue
315
			// Initialisation du marker de début de rue
316
			initialiserMarkerDeb();
316
			initialiserMarkerDeb();
317
			// Tentative de geocalisation si aucune obs à précharger
317
			// Tentative de geocalisation si aucune obs à précharger
318
			if (OBS_ID == '') {
318
			if (OBS_ID == '') {
319
				tenterGeolocalisation();
319
				tenterGeolocalisation();
320
			}
320
			}
321
		} else {
321
		} else {
322
			okPourChargementCarte--;
322
			okPourChargementCarte--;
323
			prechargerRue();
323
			prechargerRue();
324
		}
324
		}
325
	});
325
	});
326
	
326
 
327
	// Création du Geocoder
327
	// Création du Geocoder
328
	geocoder = new google.maps.Geocoder();
328
	geocoder = new google.maps.Geocoder();
329
}
329
}
330
 
330
 
331
function initialiserMarkerDeb() {
331
function initialiserMarkerDeb() {
332
	premierDeplacement = true;
332
	premierDeplacement = true;
333
	if (markerDeb == undefined) {
333
	if (markerDeb == undefined) {
334
		// Marqueur de début de Rue
334
		// Marqueur de début de Rue
335
		markerDeb = new google.maps.Marker({
335
		markerDeb = new google.maps.Marker({
336
			map: map,
336
			map: map,
337
			draggable: true,
337
			draggable: true,
338
			title: 'Début de la portion de rue étudiée',
338
			title: 'Début de la portion de rue étudiée',
339
			icon: GOOGLE_MAP_MARQUEUR_DEBUT_URL,
339
			icon: GOOGLE_MAP_MARQUEUR_DEBUT_URL,
340
			position: latLngDeb
340
			position: latLngDeb
341
		});
341
		});
342
		google.maps.event.addListener(markerDeb, 'dragend', surDeplacementMarkerDeb);
342
		google.maps.event.addListener(markerDeb, 'dragend', surDeplacementMarkerDeb);
343
	}
343
	}
344
	
344
 
345
	latLngFin = latLngDeb;
345
	latLngFin = latLngDeb;
346
	if (markerFin != undefined) {
346
	if (markerFin != undefined) {
347
		markerFin.setMap(null);
347
		markerFin.setMap(null);
348
	}
348
	}
349
	latLngCentre = latLngDeb;
349
	latLngCentre = latLngDeb;
350
	if (ligneRue != undefined) {
350
	if (ligneRue != undefined) {
351
		ligneRue.setMap(null);
351
		ligneRue.setMap(null);
352
	}
352
	}
353
}
353
}
354
 
354
 
355
function surDeplacementMarkerDeb() {
355
function surDeplacementMarkerDeb() {
356
	deplacerMarkerDeb(markerDeb.getPosition());
356
	deplacerMarkerDeb(markerDeb.getPosition());
357
}
357
}
358
 
358
 
359
function deplacerMarkerDeb(nouvellePosition) {
359
function deplacerMarkerDeb(nouvellePosition) {
360
	latLngDeb = nouvellePosition;
360
	latLngDeb = nouvellePosition;
361
	markerDeb.setPosition(latLngDeb);
361
	markerDeb.setPosition(latLngDeb);
362
	map.setCenter(latLngDeb);
362
	map.setCenter(latLngDeb);
363
	mettreAJourStationPosition(latLngDeb);
363
	mettreAJourStationPosition(latLngDeb);
364
	trouverCommune(latLngDeb);
364
	trouverCommune(latLngDeb);
365
 
365
 
366
	if (premierDeplacement) {
366
	if (premierDeplacement) {
367
		initialiserMarkerDeb();
367
		initialiserMarkerDeb();
368
		premierDeplacement = false;
368
		premierDeplacement = false;
369
	} else {
369
	} else {
370
		var nouvellePositionFin = new google.maps.LatLng(latLngDeb.lat(), latLngDeb.lng() + 0.0010);
370
		var nouvellePositionFin = new google.maps.LatLng(latLngDeb.lat(), latLngDeb.lng() + 0.0010);
371
		initialiserMarkerFin();
371
		initialiserMarkerFin();
372
		deplacerMakerFin(nouvellePositionFin)
372
		deplacerMakerFin(nouvellePositionFin)
373
		afficherEtapeGeolocalisation(3);
373
		afficherEtapeGeolocalisation(3);
374
	}
374
	}
375
}
375
}
376
 
376
 
377
function initialiserMarkerFin() {
377
function initialiserMarkerFin() {
378
	if (markerFin == undefined) {
378
	if (markerFin == undefined) {
379
		markerFin = new google.maps.Marker({
379
		markerFin = new google.maps.Marker({
380
			map: map,
380
			map: map,
381
			draggable: true,
381
			draggable: true,
382
			title: 'Fin de la portion de rue étudiée',
382
			title: 'Fin de la portion de rue étudiée',
383
			icon: GOOGLE_MAP_MARQUEUR_FIN_URL,
383
			icon: GOOGLE_MAP_MARQUEUR_FIN_URL,
384
			position: latLngFin
384
			position: latLngFin
385
		});
385
		});
386
		google.maps.event.addListener(markerFin, 'dragend', surDeplacementMarkerFin);
386
		google.maps.event.addListener(markerFin, 'dragend', surDeplacementMarkerFin);
387
	} else {
387
	} else {
388
		markerFin.setMap(null);
388
		markerFin.setMap(null);
389
	}
389
	}
390
}
390
}
391
 
391
 
392
function deplacerMakerFin(nouvellePosition) {
392
function deplacerMakerFin(nouvellePosition) {
393
	latLngFin = nouvellePosition;
393
	latLngFin = nouvellePosition;
394
	markerFin.setMap(map);
394
	markerFin.setMap(map);
395
	markerFin.setPosition(latLngFin);
395
	markerFin.setPosition(latLngFin);
396
	dessinerLigneRue(latLngDeb, latLngFin);
396
	dessinerLigneRue(latLngDeb, latLngFin);
397
}
397
}
398
 
398
 
399
function surDeplacementMarkerFin() {
399
function surDeplacementMarkerFin() {
400
	dessinerLigneRue(markerDeb.getPosition(), markerFin.getPosition());
400
	dessinerLigneRue(markerDeb.getPosition(), markerFin.getPosition());
401
	afficherCentreRue();
401
	afficherCentreRue();
402
	afficherEtapeGeolocalisation(4);
402
	afficherEtapeGeolocalisation(4);
403
}
403
}
404
 
404
 
405
function dessinerLigneRue(pointDebut, pointFin) {
405
function dessinerLigneRue(pointDebut, pointFin) {
406
	if (ligneRue != undefined) {
406
	if (ligneRue != undefined) {
407
		ligneRue.setMap(null);
407
		ligneRue.setMap(null);
408
	}
408
	}
409
	
409
 
410
	ligneRue = new google.maps.Polyline({
410
	ligneRue = new google.maps.Polyline({
411
		path: [pointDebut, pointFin],
411
		path: [pointDebut, pointFin],
412
		strokeColor: "#FF0000",
412
		strokeColor: "#FF0000",
413
		strokeOpacity: 1.0,
413
		strokeOpacity: 1.0,
414
		strokeWeight: 2
414
		strokeWeight: 2
415
	});
415
	});
416
 
416
 
417
	ligneRue.setMap(map);
417
	ligneRue.setMap(map);
418
}
418
}
419
 
419
 
420
function afficherCentreRue() {
420
function afficherCentreRue() {
421
	latLngDeb = markerDeb.getPosition();
421
	latLngDeb = markerDeb.getPosition();
422
	latLngFin = markerFin.getPosition();
422
	latLngFin = markerFin.getPosition();
423
	latLngCentre = new google.maps.LatLng((latLngFin.lat() + latLngDeb.lat())/2, (latLngFin.lng() + latLngDeb.lng())/2); 
423
	latLngCentre = new google.maps.LatLng((latLngFin.lat() + latLngDeb.lat())/2, (latLngFin.lng() + latLngDeb.lng())/2);
424
	mettreAJourStationPosition(latLngCentre);
424
	mettreAJourStationPosition(latLngCentre);
425
}
425
}
426
 
426
 
427
function mettreAJourStationPosition(latLng) {
427
function mettreAJourStationPosition(latLng) {
428
	var lat = latLng.lat().toFixed(5),
428
	var lat = latLng.lat().toFixed(5),
429
		lng = latLng.lng().toFixed(5); 
429
		lng = latLng.lng().toFixed(5);
430
	remplirChampLatitude(lat);
430
	remplirChampLatitude(lat);
431
	remplirChampLongitude(lng);
431
	remplirChampLongitude(lng);
432
}
432
}
433
 
433
 
434
function remplirChampLatitude(latDecimale) {
434
function remplirChampLatitude(latDecimale) {
435
	var lat = Math.round(latDecimale * 100000) / 100000;
435
	var lat = Math.round(latDecimale * 100000) / 100000;
436
	$('#latitude').val(lat);
436
	$('#latitude').val(lat);
437
}
437
}
438
 
438
 
439
function remplirChampLongitude(lngDecimale) {
439
function remplirChampLongitude(lngDecimale) {
440
	var lng = Math.round(lngDecimale * 100000) / 100000;
440
	var lng = Math.round(lngDecimale * 100000) / 100000;
441
	$('#longitude').val(lng);
441
	$('#longitude').val(lng);
442
}
442
}
443
 
443
 
444
function trouverCommune(pos) {
444
function trouverCommune(pos) {
445
	$(function() {
445
	$(function() {
446
		var url_service = SERVICE_NOM_COMMUNE_URL,
446
		var url_service = SERVICE_NOM_COMMUNE_URL,
447
			urlNomCommuneFormatee = url_service.replace('{lat}', pos.lat()).replace('{lon}', pos.lng());
447
			urlNomCommuneFormatee = url_service.replace('{lat}', pos.lat()).replace('{lon}', pos.lng());
448
		$.ajax({
448
		$.ajax({
449
			url: urlNomCommuneFormatee,
449
			url: urlNomCommuneFormatee,
450
			type: 'GET',
450
			type: 'GET',
451
			dataType: 'jsonp',
451
			dataType: 'jsonp',
452
			beforeSend: function() {
452
			beforeSend: function() {
453
				$('.commune-info').empty();	
453
				$('.commune-info').empty();
454
				$('#dialogue-erreur .alert-txt').empty();
454
				$('#dialogue-erreur .alert-txt').empty();
455
			},
455
			},
456
			success: function(data, textStatus, jqXHR) {
456
			success: function(data, textStatus, jqXHR) {
457
				$('.commune-info').empty();
457
				$('.commune-info').empty();
458
				$('#commune-nom').append(data.nom);
458
				$('#commune-nom').append(data.nom);
459
				$('#commune-code-insee').append(data.codeINSEE);
459
				$('#commune-code-insee').append(data.codeINSEE);
460
				$('#marqueur-commune').data('commune', {'nom' : data.nom, 'codeInsee' : data.codeINSEE});
460
				$('#marqueur-commune').data('commune', {'nom' : data.nom, 'codeInsee' : data.codeINSEE});
461
			},
461
			},
462
			statusCode: {
462
			statusCode: {
463
				500: function(jqXHR, textStatus, errorThrown) {
463
				500: function(jqXHR, textStatus, errorThrown) {
464
					if (DEBUG) {	
464
					if (DEBUG) {
465
						$('#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>');
465
						$('#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>');
466
						reponse = jQuery.parseJSON(jqXHR.responseText);
466
						reponse = jQuery.parseJSON(jqXHR.responseText);
467
						var erreurMsg = "";
467
						var erreurMsg = "";
468
						if (reponse != null) {
468
						if (reponse != null) {
469
							$.each(reponse, function (cle, valeur) {
469
							$.each(reponse, function (cle, valeur) {
470
								erreurMsg += valeur + '<br />';
470
								erreurMsg += valeur + '<br />';
471
							});
471
							});
472
						}
472
						}
473
						
473
 
474
						$('#dialogue-erreur .alert-txt').append(
474
						$('#dialogue-erreur .alert-txt').append(
475
							'<p class="msg-erreur">Erreur 500 : '+errorThrown+'<br />'+erreurMsg+'</p>');
475
							'<p class="msg-erreur">Erreur 500 : '+errorThrown+'<br />'+erreurMsg+'</p>');
476
					}
476
					}
477
				}
477
				}
478
			},
478
			},
479
			error: function(jqXHR, textStatus, errorThrown) {
479
			error: function(jqXHR, textStatus, errorThrown) {
480
				if (DEBUG) {
480
				if (DEBUG) {
481
					$('#dialogue-erreur .alert-txt').append(
481
					$('#dialogue-erreur .alert-txt').append(
482
						'<p class="msg">Une erreur Ajax est survenue lors de la transmission de vos observations.</p>');
482
						'<p class="msg">Une erreur Ajax est survenue lors de la transmission de vos observations.</p>');
483
					reponse = jQuery.parseJSON(jqXHR.responseText);
483
					reponse = jQuery.parseJSON(jqXHR.responseText);
484
					var erreurMsg = '';
484
					var erreurMsg = '';
485
					if (reponse != null) {
485
					if (reponse != null) {
486
						$.each(reponse, function (cle, valeur) {
486
						$.each(reponse, function (cle, valeur) {
487
							erreurMsg += valeur + '<br />';
487
							erreurMsg += valeur + '<br />';
488
						});
488
						});
489
					}
489
					}
490
					
490
 
491
					$('#dialogue-erreur .alert-txt').append(
491
					$('#dialogue-erreur .alert-txt').append(
492
						'<p class="msg-erreur">Erreur Ajax : '+errorThrown+' (type : '+textStatus+') <br />'+erreurMsg+'</p>');
492
						'<p class="msg-erreur">Erreur Ajax : '+errorThrown+' (type : '+textStatus+') <br />'+erreurMsg+'</p>');
493
				}
493
				}
494
			},
494
			},
495
			complete: function(jqXHR, textStatus) {
495
			complete: function(jqXHR, textStatus) {
496
				var debugMsg = extraireEnteteDebug(jqXHR);
496
				var debugMsg = extraireEnteteDebug(jqXHR);
497
				if (debugMsg != '') {
497
				if (debugMsg != '') {
498
					if (DEBUG) {
498
					if (DEBUG) {
499
						$("#dialogue-erreur .alert-txt").append('<pre class="msg-debug msg">Débogage : '+debugMsg+'</pre>');
499
						$("#dialogue-erreur .alert-txt").append('<pre class="msg-debug msg">Débogage : '+debugMsg+'</pre>');
500
					}
500
					}
501
				}
501
				}
502
				if ($("#dialogue-erreur .msg").length > 0) {
502
				if ($("#dialogue-erreur .msg").length > 0) {
503
					$("#dialogue-erreur").show();
503
					$("#dialogue-erreur").show();
504
				}
504
				}
505
			}
505
			}
506
		});
506
		});
507
	});
507
	});
508
}
508
}
509
 
509
 
510
function afficherEtapeGeolocalisation(numEtape) {
510
function afficherEtapeGeolocalisation(numEtape) {
511
	$('.liste_indication_geolocalisation').children().hide();
511
	$('.liste_indication_geolocalisation').children().hide();
512
	$('.liste_indication_geolocalisation :nth-child('+numEtape+')').show();
512
	$('.liste_indication_geolocalisation :nth-child('+numEtape+')').show();
513
}
513
}
514
 
514
 
515
function afficherErreurGoogleMap(status) {
515
function afficherErreurGoogleMap(status) {
516
	if (DEBUG) {
516
	if (DEBUG) {
517
		$('#dialogue-google-map .contenu').empty().append(
517
		$('#dialogue-google-map .contenu').empty().append(
518
			'<pre class="msg-erreur">'+
518
			'<pre class="msg-erreur">'+
519
			"Le service de Géocodage de Google Map a échoué à cause de l'erreur : "+status+
519
			"Le service de Géocodage de Google Map a échoué à cause de l'erreur : "+status+
520
			'</pre>');
520
			'</pre>');
521
		afficherPanneau('#dialogue-google-map');
521
		afficherPanneau('#dialogue-google-map');
522
	}
522
	}
523
}
523
}
524
 
524
 
525
function geolocaliser(event) {
525
function geolocaliser(event) {
526
	var latitude = $('#latitude').val(),
526
	var latitude = $('#latitude').val(),
527
		longitude = $('#longitude').val(),
527
		longitude = $('#longitude').val(),
528
		nouvellePosition = new google.maps.LatLng(latitude, longitude);
528
		nouvellePosition = new google.maps.LatLng(latitude, longitude);
529
	initialiserMarkerDeb();
529
	initialiserMarkerDeb();
530
	deplacerMarkerDeb(nouvellePosition);
530
	deplacerMarkerDeb(nouvellePosition);
531
	afficherEtapeGeolocalisation(2);
531
	afficherEtapeGeolocalisation(2);
532
	map.setZoom(16);
532
	map.setZoom(16);
533
	arreter(event);
533
	arreter(event);
534
}
534
}
535
 
535
 
536
function tenterGeolocalisation() {
536
function tenterGeolocalisation() {
537
	if (navigator.geolocation) {
537
	if (navigator.geolocation) {
538
		navigator.geolocation.getCurrentPosition(function(position) {
538
		navigator.geolocation.getCurrentPosition(function(position) {
539
			var latitude = position.coords.latitude,
539
			var latitude = position.coords.latitude,
540
				longitude = position.coords.longitude,
540
				longitude = position.coords.longitude,
541
				nouvellePosition = new google.maps.LatLng(latitude, longitude);
541
				nouvellePosition = new google.maps.LatLng(latitude, longitude);
542
			initialiserMarkerDeb();
542
			initialiserMarkerDeb();
543
			deplacerMarkerDeb(nouvellePosition);
543
			deplacerMarkerDeb(nouvellePosition);
544
			map.setZoom(16);
544
			map.setZoom(16);
545
		});
545
		});
546
	}
546
	}
547
}
547
}
548
 
548
 
549
function surClickDansCarte(event) {
549
function surClickDansCarte(event) {
550
	deplacerMarkerDeb(event.latLng);
550
	deplacerMarkerDeb(event.latLng);
551
}
551
}
552
 
552
 
553
 
553
 
554
//+---------------------------------------------------------------------------------------------------------+
554
//+---------------------------------------------------------------------------------------------------------+
555
//AUTO-COMPLÉTION Noms Scientifiques
555
//AUTO-COMPLÉTION Noms Scientifiques
556
 
556
 
557
function ajouterAutocompletionNoms() {
557
function ajouterAutocompletionNoms() {
558
	$('#taxon').autocomplete({
558
	$('#taxon').autocomplete({
559
		source: function(requete, add){  
559
		source: function(requete, add){
560
			// la variable de requête doit être vidée car sinon le parametre "term" est ajouté
560
			// la variable de requête doit être vidée car sinon le parametre "term" est ajouté
561
			
561
 
562
			var url = getUrlAutocompletionNomsSci();
562
			var url = getUrlAutocompletionNomsSci();
563
			$.getJSON(url, function(data) {
563
			$.getJSON(url, function(data) {
564
				var suggestions = traiterRetourNomsSci(data);
564
				var suggestions = traiterRetourNomsSci(data);
565
				add(suggestions);  
565
				add(suggestions);
566
			});
566
			});
567
		},
567
		},
568
		html: true
568
		html: true
569
	});
569
	});
570
	
570
 
571
	$('#taxon').bind('autocompleteselect', function(event, ui) {
571
	$('#taxon').bind('autocompleteselect', function(event, ui) {
572
		$('#taxon').data(ui.item);
572
		$('#taxon').data(ui.item);
573
		if (ui.item.retenu == true) {
573
		if (ui.item.retenu == true) {
574
			$('#taxon').addClass('ns-retenu');
574
			$('#taxon').addClass('ns-retenu');
575
		} else {
575
		} else {
576
			$('#taxon').removeClass('ns-retenu');
576
			$('#taxon').removeClass('ns-retenu');
577
		}
577
		}
578
	});
578
	});
579
}
579
}
580
 
580
 
581
function getUrlAutocompletionNomsSci() {
581
function getUrlAutocompletionNomsSci() {
582
	var mots = $('#taxon').val(),
582
	var mots = $('#taxon').val(),
583
		url = SERVICE_AUTOCOMPLETION_NOM_SCI_URL_TPL.replace('{referentiel}',NOM_SCI_PROJET);
583
		url = SERVICE_AUTOCOMPLETION_NOM_SCI_URL_TPL.replace('{referentiel}',NOM_SCI_PROJET);
584
	url = url.replace('{masque}', mots);
584
	url = url.replace('{masque}', mots);
585
	return url;
585
	return url;
586
}
586
}
587
 
587
 
588
function traiterRetourNomsSci(data) {
588
function traiterRetourNomsSci(data) {
589
	var suggestions = [];
589
	var suggestions = [];
590
	if (data.resultat != undefined) {
590
	if (data.resultat != undefined) {
591
		$.each(data.resultat, function(i, val) {
591
		$.each(data.resultat, function(i, val) {
592
			val.nn = i;
592
			val.nn = i;
593
			var nom = {label: '', value: '', nt: '', nomSel: '', nomSelComplet: '', numNomSel: '',
593
			var nom = {label: '', value: '', nt: '', nomSel: '', nomSelComplet: '', numNomSel: '',
594
				nomRet: '', numNomRet: '', famille: '', retenu: false
594
				nomRet: '', numNomRet: '', famille: '', retenu: false
595
			};
595
			};
596
			if (suggestions.length >= AUTOCOMPLETION_ELEMENTS_NBRE) {
596
			if (suggestions.length >= AUTOCOMPLETION_ELEMENTS_NBRE) {
597
				nom.label = '...';
597
				nom.label = '...';
598
				nom.value = $('#taxon').val();
598
				nom.value = $('#taxon').val();
599
				suggestions.push(nom);
599
				suggestions.push(nom);
600
				return false;
600
				return false;
601
			} else {
601
			} else {
602
				nom.label = val.nom_sci_complet;
602
				nom.label = val.nom_sci_complet;
603
				nom.value = val.nom_sci_complet;
603
				nom.value = val.nom_sci_complet;
604
				nom.nt = val.num_taxonomique;
604
				nom.nt = val.num_taxonomique;
605
				nom.nomSel = val.nom_sci;
605
				nom.nomSel = val.nom_sci;
606
				nom.nomSelComplet = val.nom_sci_complet;
606
				nom.nomSelComplet = val.nom_sci_complet;
607
				nom.numNomSel = val.nn;
607
				nom.numNomSel = val.nn;
608
				nom.nomRet = val.nom_retenu_complet;
608
				nom.nomRet = val.nom_retenu_complet;
609
				nom.numNomRet = val['nom_retenu.id'];
609
				nom.numNomRet = val['nom_retenu.id'];
610
				nom.famille = val.famille;
610
				nom.famille = val.famille;
611
				nom.retenu = (val.retenu == 'false') ? false : true;
611
				nom.retenu = (val.retenu == 'false') ? false : true;
612
				
612
 
613
				suggestions.push(nom);
613
				suggestions.push(nom);
614
			}
614
			}
615
		});
615
		});
616
	}
616
	}
617
	return suggestions;
617
	return suggestions;
618
}
618
}
619
 
619
 
620
/*
620
/*
621
* jQuery UI Autocomplete HTML Extension
621
* jQuery UI Autocomplete HTML Extension
622
*
622
*
623
* Copyright 2010, Scott González (http://scottgonzalez.com)
623
* Copyright 2010, Scott González (http://scottgonzalez.com)
624
* Dual licensed under the MIT or GPL Version 2 licenses.
624
* Dual licensed under the MIT or GPL Version 2 licenses.
625
*
625
*
626
* http://github.com/scottgonzalez/jquery-ui-extensions
626
* http://github.com/scottgonzalez/jquery-ui-extensions
627
* 
627
*
628
* Adaptation par Aurélien Peronnet pour la mise en gras des noms de taxons valides
628
* Adaptation par Aurélien Peronnet pour la mise en gras des noms de taxons valides
629
*/
629
*/
630
(function($) {
630
(function($) {
631
	var proto = $.ui.autocomplete.prototype,
631
	var proto = $.ui.autocomplete.prototype,
632
		initSource = proto._initSource;
632
		initSource = proto._initSource;
633
	
633
 
634
	function filter(array, term) {
634
	function filter(array, term) {
635
		var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), 'i');
635
		var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), 'i');
636
		return $.grep(array, function(value) {
636
		return $.grep(array, function(value) {
637
			return matcher.test($('<div>').html(value.label || value.value || value).text());
637
			return matcher.test($('<div>').html(value.label || value.value || value).text());
638
		});
638
		});
639
	}
639
	}
640
	
640
 
641
	$.extend(proto, {
641
	$.extend(proto, {
642
		_initSource: function() {
642
		_initSource: function() {
643
			if (this.options.html && $.isArray(this.options.source)) {
643
			if (this.options.html && $.isArray(this.options.source)) {
644
				this.source = function( request, response ) {
644
				this.source = function( request, response ) {
645
					response(filter(this.options.source, request.term));
645
					response(filter(this.options.source, request.term));
646
				};
646
				};
647
			} else {
647
			} else {
648
				initSource.call(this);
648
				initSource.call(this);
649
			}
649
			}
650
		},
650
		},
651
		_renderItem: function(ul, item) {
651
		_renderItem: function(ul, item) {
652
			if (item.retenu == true) {
652
			if (item.retenu == true) {
653
				item.label = '<strong>'+item.label+'</strong>';
653
				item.label = '<strong>'+item.label+'</strong>';
654
			}
654
			}
655
			
655
 
656
			return $('<li></li>')
656
			return $('<li></li>')
657
				.data('item.autocomplete', item)
657
				.data('item.autocomplete', item)
658
				.append($('<a></a>')[this.options.html ? 'html' : 'text'](item.label))
658
				.append($('<a></a>')[this.options.html ? 'html' : 'text'](item.label))
659
				.appendTo(ul);
659
				.appendTo(ul);
660
		}
660
		}
661
	});
661
	});
662
})(jQuery);
662
})(jQuery);
663
 
663
 
664
//+----------------------------------------------------------------------------------------------------------+
664
//+----------------------------------------------------------------------------------------------------------+
665
//UPLOAD PHOTO : Traitement de l'image 
665
//UPLOAD PHOTO : Traitement de l'image
666
$(document).ready(function() {
666
$(document).ready(function() {
667
	$('#fichier').on('click change', function(event) {
667
	$('#fichier').on('click change', function(event) {
668
		if ($(this).val().length > 0) {
668
		if ($(this).val().length > 0) {
669
			arreter(event);
669
			arreter(event);
670
			var options = { 
670
			var options = {
671
				success: afficherMiniature, // post-submit callback 
671
				success: afficherMiniature, // post-submit callback
672
				dataType: 'xml', // 'xml', 'script', or 'json' (expected server response type) 
672
				dataType: 'xml', // 'xml', 'script', or 'json' (expected server response type)
673
				resetForm: true // reset the form after successful submit 
673
				resetForm: true // reset the form after successful submit
674
			};
674
			};
675
			$('#miniature').append(
675
			$('#miniature').append(
676
				'<img id="miniature-chargement" class="miniature" alt="chargement" src="'+CHARGEMENT_IMAGE_URL+'"/>');
676
				'<img id="miniature-chargement" class="miniature" alt="chargement" src="'+CHARGEMENT_IMAGE_URL+'"/>');
677
			$('#ajouter-obs').attr('disabled', 'disabled');
677
			$('#ajouter-obs').attr('disabled', 'disabled');
678
			if (verifierFormat($(this).val())) {
678
			if (verifierFormat($(this).val())) {
679
				$('#form-upload').ajaxSubmit(options);
679
				$('#form-upload').ajaxSubmit(options);
680
			} else {
680
			} else {
681
				$('#form-upload')[0].reset();
681
				$('#form-upload')[0].reset();
682
				window.alert("Le format de fichier n'est pas supporté, les formats acceptés sont "+	$('#fichier').attr('accept'));
682
				window.alert("Le format de fichier n'est pas supporté, les formats acceptés sont "+	$('#fichier').attr('accept'));
683
			}
683
			}
684
			return false;
684
			return false;
685
		}
685
		}
686
	});
686
	});
687
	
687
 
688
	$('#photo-placeholder').click(function(event) {
688
	$('#photo-placeholder').click(function(event) {
689
		$('#fichier').click();
689
		$('#fichier').click();
690
	});
690
	});
691
	
691
 
692
	$('body').on('click', '.effacer-miniature', function(event) {
692
	$('body').on('click', '.effacer-miniature', function(event) {
693
		supprimerMiniature($(this));
693
		supprimerMiniature($(this));
694
	});
694
	});
695
});
695
});
696
 
696
 
697
 
697
 
698
 
698
 
699
function verifierFormat(nom) {
699
function verifierFormat(nom) {
700
	var parts = nom.split('.');
700
	var parts = nom.split('.');
701
	extension = parts[parts.length - 1];
701
	extension = parts[parts.length - 1];
702
	return (extension.toLowerCase() == 'jpeg' || extension.toLowerCase() == 'jpg');
702
	return (extension.toLowerCase() == 'jpeg' || extension.toLowerCase() == 'jpg');
703
}
703
}
704
 
704
 
705
function afficherMiniature(reponse) { 
705
function afficherMiniature(reponse) {
706
	if (DEBUG) {
706
	if (DEBUG) {
707
		var debogage = $('debogage', reponse).text();
707
		var debogage = $('debogage', reponse).text();
708
		//console.log('Débogage upload : ' + debogage);
708
		//console.log('Débogage upload : ' + debogage);
709
	}
709
	}
710
	var message = $('message', reponse).text();
710
	var message = $('message', reponse).text();
711
	if (message != '') {
711
	if (message != '') {
712
		$('#miniature-msg').append(message);
712
		$('#miniature-msg').append(message);
713
	} else {
713
	} else {
714
		$('#miniatures').append(creerWidgetMiniature(reponse));
714
		$('#miniatures').append(creerWidgetMiniature(reponse));
715
	}
715
	}
716
	$('#ajouter-obs').removeAttr('disabled');
716
	$('#ajouter-obs').removeAttr('disabled');
717
}
717
}
718
 
718
 
719
function creerWidgetMiniature(reponse) {
719
function creerWidgetMiniature(reponse) {
720
	var miniatureUrl = $('miniature-url', reponse).text(),
720
	var miniatureUrl = $('miniature-url', reponse).text(),
721
		imgNom = $('image-nom', reponse).text(),
721
		imgNom = $('image-nom', reponse).text(),
722
		html = 
722
		html =
723
			'<div class="miniature">'+
723
			'<div class="miniature">'+
724
				'<img class="miniature-img" class="miniature" alt="'+imgNom+'" src="'+miniatureUrl+'"/>'+
724
				'<img class="miniature-img" class="miniature" alt="'+imgNom+'" src="'+miniatureUrl+'"/>'+
725
				'<button class="btn effacer-miniature" type="button">Effacer</button>'+
725
				'<button class="btn effacer-miniature" type="button">Effacer</button>'+
726
			'</div>'
726
			'</div>'
727
	return html;
727
	return html;
728
}
728
}
729
 
729
 
730
function supprimerMiniature(miniature) {
730
function supprimerMiniature(miniature) {
731
	miniature.parents('.miniature').remove();
731
	miniature.parents('.miniature').remove();
732
}
732
}
733
 
733
 
734
function supprimerMiniatures() {
734
function supprimerMiniatures() {
735
	$('#miniatures').empty();
735
	$('#miniatures').empty();
736
	$('#miniature-msg').empty();
736
	$('#miniature-msg').empty();
737
}
737
}
738
 
738
 
739
 
739
 
740
//+---------------------------------------------------------------------------------------------------------+
740
//+---------------------------------------------------------------------------------------------------------+
741
// FORMULAIRE : traitements génériques
741
// FORMULAIRE : traitements génériques
742
 
742
 
743
$(document).ready(function() {	
743
$(document).ready(function() {
744
	// Interaction générales
744
	// Interaction générales
745
	$('.alert .close').on('click', fermerPanneauAlert);
745
	$('.alert .close').on('click', fermerPanneauAlert);
746
	$('.has-tooltip').tooltip('enable');
746
	$('.has-tooltip').tooltip('enable');
747
	$('#btn-aide').on('click', basculerAffichageAide);
747
	$('#btn-aide').on('click', basculerAffichageAide);
748
	$('.dropdown-menu input, .dropdown-menu label').on('click', function(event) {
748
	$('.dropdown-menu input, .dropdown-menu label').on('click', function(event) {
749
		event.stopPropagation();
749
		event.stopPropagation();
750
	});
750
	});
751
	
751
 
752
	// Afficher/Cacher champs cachés par défaut
752
	// Afficher/Cacher champs cachés par défaut
753
	surChangementPeriodiciteTraitementPhyto();// Vérif lors du chargement de la page
753
	surChangementPeriodiciteTraitementPhyto();// Vérif lors du chargement de la page
754
	$('#periodicite-traitement-phyto').on('change', surChangementPeriodiciteTraitementPhyto);
754
	$('#periodicite-traitement-phyto').on('change', surChangementPeriodiciteTraitementPhyto);
755
	
755
 
756
	// Sliders
756
	// Sliders
757
	transformerEnSlider('#presence-zone-vegetalise');
757
	transformerEnSlider('#presence-zone-vegetalise');
758
	transformerEnSlider('#hauteur-batiment-avoisinant');
758
	transformerEnSlider('#hauteur-batiment-avoisinant');
759
	transformerEnSlider('#periodicite-traitement-phyto');
759
	transformerEnSlider('#periodicite-traitement-phyto');
760
	transformerEnSlider('#resistance-traitement-phyto');
760
	transformerEnSlider('#resistance-traitement-phyto');
761
	transformerEnSlider('#vitesse-croissance');
761
	transformerEnSlider('#vitesse-croissance');
762
 
762
 
763
	// Date picker
763
	// Date picker
764
	configurerDatePicker('#date');
764
	configurerDatePicker('#date');
765
	configurerDatePicker('#date-arret-traitement-phyto');
765
	configurerDatePicker('#date-arret-traitement-phyto');
766
	
766
 
767
	// Gestion de la liste des taxons
767
	// Gestion de la liste des taxons
768
	surChangementTaxonListe();// Vérif lors du chargement de la page
768
	surChangementTaxonListe();// Vérif lors du chargement de la page
769
	ajouterAutocompletionNoms();
769
	ajouterAutocompletionNoms();
770
	$('#taxon-liste').on('change', surChangementTaxonListe);
770
	$('#taxon-liste').on('change', surChangementTaxonListe);
771
	
771
 
772
	// Validation du formulaire
772
	// Validation du formulaire
773
	configurerFormValidator();
773
	configurerFormValidator();
774
	definirReglesFormValidator();
774
	definirReglesFormValidator();
775
	
775
 
776
	// Gestion des obs
776
	// Gestion des obs
777
	$('.cb-milieux').on('click', function(event) {
777
	$('.cb-milieux').on('click', function(event) {
778
		$(this).valid();
778
		$(this).valid();
779
		event.stopPropagation();
779
		event.stopPropagation();
780
	});
780
	});
781
	$('input#hauteur-plante').on('blur', function() {
781
	$('input#hauteur-plante').on('blur', function() {
782
		// if there's a bad value
782
		// if there's a bad value
783
		var valeur = $(this).val();
783
		var valeur = $(this).val();
784
		if (! valeur.match(/^[0-9]+$/)) {
784
		if (! valeur.match(/^[0-9]+$/)) {
785
			// replace it with nothing
785
			// replace it with nothing
786
			var nouvelleValeur = valeur.replace(/[^0-9]/g, '');
786
			var nouvelleValeur = valeur.replace(/[^0-9]/g, '');
787
			$(this).val(nouvelleValeur);
787
			$(this).val(nouvelleValeur);
788
		}
788
		}
789
	});		
789
	});
790
	$('a.afficher-coord').on('click', basculerAffichageCoord);
790
	$('a.afficher-coord').on('click', basculerAffichageCoord);
791
	$('#ajouter-obs').on('click', ajouterObs);
791
	$('#ajouter-obs').on('click', ajouterObs);
792
	$('.obs-nbre').on('changement', surChangementNbreObs);
792
	$('.obs-nbre').on('changement', surChangementNbreObs);
793
	$('body').on('click', '.supprimer-obs', supprimerObs);
793
	$('body').on('click', '.supprimer-obs', supprimerObs);
794
	$('#transmettre-obs').on('click', transmettreObs);
794
	$('#transmettre-obs').on('click', transmettreObs);
795
 
795
 
796
	// Défilement des photos
796
	// Défilement des photos
797
	$('body').on('click', '.defilement-control-zone', function(event) {
797
	$('body').on('click', '.defilement-control-zone', function(event) {
798
		defilerMiniatures($(this));
798
		defilerMiniatures($(this));
799
	});
799
	});
800
	$('body').on('mouseover', '.defilement-control-zone', function(event) {
800
	$('body').on('mouseover', '.defilement-control-zone', function(event) {
801
		$('.defilement-control', this).removeClass('hidden');
801
		$('.defilement-control', this).removeClass('hidden');
802
	});
802
	});
803
	$('body').on('mouseout', '.defilement-control-zone', function(event) {
803
	$('body').on('mouseout', '.defilement-control-zone', function(event) {
804
		$('.defilement-control', this).addClass('hidden');
804
		$('.defilement-control', this).addClass('hidden');
805
	});
805
	});
806
	
806
 
807
});
807
});
808
 
808
 
809
function transformerEnSlider(selector) {
809
function transformerEnSlider(selector) {
810
	$(selector).each(function(index, el) {
810
	$(selector).each(function(index, el) {
811
		// hide the element
811
		// hide the element
812
		$(el).addClass('slider-on');
812
		$(el).addClass('slider-on');
813
		
813
 
814
		// add the slider to each element
814
		// add the slider to each element
815
		var slider = $( '<div class="slider-holder"><div class="horizontal-slider"></div></div>' ).
815
		var slider = $( '<div class="slider-holder"><div class="horizontal-slider"></div></div>' ).
816
			insertBefore( el ).find('.horizontal-slider').slider({
816
			insertBefore( el ).find('.horizontal-slider').slider({
817
				min: 1,
817
				min: 1,
818
				max: el.options.length,
818
				max: el.options.length,
819
				range: 'min',
819
				range: 'min',
820
				value: el.selectedIndex + 1,
820
				value: el.selectedIndex + 1,
821
				slide: function(event, ui) {
821
				slide: function(event, ui) {
822
					el.selectedIndex = ui.value - 1;
822
					el.selectedIndex = ui.value - 1;
823
					slider.find('a').text(el.options[el.selectedIndex].text);
823
					slider.find('a').text(el.options[el.selectedIndex].text);
824
					
824
 
825
					$(selector + ' option[selected="selected"]').removeAttr('selected');
825
					$(selector + ' option[selected="selected"]').removeAttr('selected');
826
					$(selector + ' :nth-child('+ui.value+')').attr('selected', 'selected')
826
					$(selector + ' :nth-child('+ui.value+')').attr('selected', 'selected')
827
					$(selector).valid();
827
					$(selector).valid();
828
				},
828
				},
829
				stop: function() {
829
				stop: function() {
830
					$(el).change();
830
					$(el).change();
831
				}
831
				}
832
			});
832
			});
833
		
833
 
834
		slider.find('a').text(el.options[el.selectedIndex].text);
834
		slider.find('a').text(el.options[el.selectedIndex].text);
835
		
835
 
836
		// Create a legend under the slider so we can see the options
836
		// Create a legend under the slider so we can see the options
837
		var options = [];
837
		var options = [];
838
		for (var option in $(el).children()) {
838
		for (var option in $(el).children()) {
839
			if (!isNaN(parseInt(option))) {
839
			if (!isNaN(parseInt(option))) {
840
				options.push(el.options[option].text);
840
				options.push(el.options[option].text);
841
			}
841
			}
842
		}
842
		}
843
		// the width of each legend/option
843
		// the width of each legend/option
844
		var width = (slider.width() / (options.length - 1));
844
		var width = (slider.width() / (options.length - 1));
845
		
845
 
846
		// Add the legend. Half the width of the first and last options for display consistency.
846
		// Add the legend. Half the width of the first and last options for display consistency.
847
		slider.after('<div class="slider-legend"><p style="width:' + (width / 2) + 'px;text-align:left;">' + 
847
		slider.after('<div class="slider-legend"><p style="width:' + (width / 2) + 'px;text-align:left;">' +
848
			options.join('</p><p style="width:' + width + 'px;">') +'</p></div>')
848
			options.join('</p><p style="width:' + width + 'px;">') +'</p></div>')
849
			.parent().find('.slider-legend p:last-child').css('width', width / 2)
849
			.parent().find('.slider-legend p:last-child').css('width', width / 2)
850
			.css('text-align', 'right');
850
			.css('text-align', 'right');
851
		
851
 
852
		// if there are too many options so that the text is wider than the width, then hide the text
852
		// if there are too many options so that the text is wider than the width, then hide the text
853
		var lastChild = slider.parent().find('.slider-legend p:last-child');
853
		var lastChild = slider.parent().find('.slider-legend p:last-child');
854
		if (lastChild[0].clientWidth < lastChild[0].scrollWidth) {
854
		if (lastChild[0].clientWidth < lastChild[0].scrollWidth) {
855
			slider.parent().find('.slider-legend p');//.css('text-indent', '200%');
855
			slider.parent().find('.slider-legend p');//.css('text-indent', '200%');
856
		}
856
		}
857
	});
857
	});
858
}
858
}
859
 
859
 
860
function surChangementPeriodiciteTraitementPhyto() {
860
function surChangementPeriodiciteTraitementPhyto() {
861
	if ($('#periodicite-traitement-phyto').val() === 'jamais') {
861
	if ($('#periodicite-traitement-phyto').val() === 'jamais') {
862
		$('#datp-zone').removeClass('hidden');
862
		$('#datp-zone').removeClass('hidden');
863
	} else {
863
	} else {
864
		$('#datp-zone').addClass('hidden');
864
		$('#datp-zone').addClass('hidden');
865
	}
865
	}
866
}
866
}
867
 
867
 
868
function surChangementTaxonListe() {
868
function surChangementTaxonListe() {
869
	if ($('#taxon-liste').val() === '?') {
869
	if ($('#taxon-liste').val() === '?') {
870
		$('#taxon-input-groupe').removeClass('hidden');
870
		$('#taxon-input-groupe').removeClass('hidden');
871
	} else {
871
	} else {
872
		$('#taxon-input-groupe').addClass('hidden');
872
		$('#taxon-input-groupe').addClass('hidden');
873
	}
873
	}
874
}
874
}
875
 
875
 
876
function configurerDatePicker(selector) {
876
function configurerDatePicker(selector) {
877
	$.datepicker.setDefaults($.datepicker.regional['fr']);
877
	$.datepicker.setDefaults($.datepicker.regional['fr']);
878
	$(selector).datepicker({
878
	$(selector).datepicker({
879
		dateFormat: 'dd/mm/yy',
879
		dateFormat: 'dd/mm/yy',
880
		maxDate: new Date,
880
		maxDate: new Date,
881
		showOn: 'button',
881
		showOn: 'button',
882
		buttonImageOnly: true,
882
		buttonImageOnly: true,
883
		buttonImage: CALENDRIER_ICONE_URL,
883
		buttonImage: CALENDRIER_ICONE_URL,
884
		buttonText: 'Afficher le calendrier pour saisir la date.',
884
		buttonText: 'Afficher le calendrier pour saisir la date.',
885
		showButtonPanel: true,
885
		showButtonPanel: true,
886
		onSelect: function(date) {
886
		onSelect: function(date) {
887
			$(this).valid();
887
			$(this).valid();
888
		}
888
		}
889
	});
889
	});
890
	$(selector + ' + img.ui-datepicker-trigger').appendTo(selector + '-icone.add-on');
890
	$(selector + ' + img.ui-datepicker-trigger').appendTo(selector + '-icone.add-on');
891
}
891
}
892
 
892
 
893
function configurerFormValidator() {
893
function configurerFormValidator() {
894
	$.validator.addMethod(
894
	$.validator.addMethod(
895
		'dateCel', 
895
		'dateCel',
896
		function (value, element) { 
896
		function (value, element) {
897
			return value == '' || (/^[0-9]{2}[-\/][0-9]{2}[-\/][0-9]{4}$/.test(value)); 
897
			return value == '' || (/^[0-9]{2}[-\/][0-9]{2}[-\/][0-9]{4}$/.test(value));
898
		}, 
898
		},
899
		'Format : jj/mm/aaaa. Date incomplète, utiliser 0, exemple : 00/12/2011.');
899
		'Format : jj/mm/aaaa. Date incomplète, utiliser 0, exemple : 00/12/2011.');
900
	
900
 
901
	$.extend($.validator.defaults, {
901
	$.extend($.validator.defaults, {
902
		ignore: [],// Forcer Jquery Validate à examiner les éléments avec en display:none;
902
		ignore: [],// Forcer Jquery Validate à examiner les éléments avec en display:none;
903
		highlight: function(element) {
903
		highlight: function(element) {
904
			$(element).closest('.control-group').removeClass('success').addClass('error');
904
			$(element).closest('.control-group').removeClass('success').addClass('error');
905
		},
905
		},
906
		success: function(element) {
906
		success: function(element) {
907
			element.text('OK!').addClass('valid');
907
			element.text('OK!').addClass('valid');
908
			element.closest('.control-group').removeClass('error').addClass('success');
908
			element.closest('.control-group').removeClass('error').addClass('success');
909
			
909
 
910
			if (element.attr('id') == 'taxon' && $('#taxon').val() != '') {
910
			if (element.attr('id') == 'taxon' && $('#taxon').val() != '') {
911
				// Si le taxon n'est pas lié au référentiel, on vide le data associé
911
				// Si le taxon n'est pas lié au référentiel, on vide le data associé
912
				if ($('#taxon').data('value') != $('#taxon').val()) {
912
				if ($('#taxon').data('value') != $('#taxon').val()) {
913
					$('#taxon').data('numNomSel', '');
913
					$('#taxon').data('numNomSel', '');
914
					$('#taxon').data('nomRet', '');
914
					$('#taxon').data('nomRet', '');
915
					$('#taxon').data('numNomRet', '');
915
					$('#taxon').data('numNomRet', '');
916
					$('#taxon').data('nt', '');
916
					$('#taxon').data('nt', '');
917
					$('#taxon').data('famille', '');
917
					$('#taxon').data('famille', '');
918
				}
918
				}
919
			}
919
			}
920
		}
920
		}
921
	});
921
	});
922
}
922
}
923
 
923
 
924
function definirReglesFormValidator() {
924
function definirReglesFormValidator() {
925
	$('#form-observateur').validate({
925
	$('#form-observateur').validate({
926
		rules: {
926
		rules: {
927
			courriel: {
927
			courriel: {
928
				required: true,
928
				required: true,
929
				email: true},
929
				email: true},
930
			courriel_confirmation: {
930
			courriel_confirmation: {
931
				required: true,
931
				required: true,
932
				equalTo: '#courriel'},
932
				equalTo: '#courriel'},
933
			prenom: {
933
			prenom: {
934
				required: true},
934
				required: true},
935
			nom: {
935
			nom: {
936
				required: true},
936
				required: true},
937
			personneStructure: {
937
			personneStructure: {
938
				required: true},
938
				required: true},
939
			personneService: {
939
			personneService: {
940
				required: true}
940
				required: true}
941
		}
941
		}
942
	});
942
	});
943
	$('#form-site').validate({
943
	$('#form-site').validate({
944
		rules: {
944
		rules: {
945
			station: {
945
			station: {
946
				required: true},
946
				required: true},
947
			latitude : {
947
			latitude : {
948
				required: true,
948
				required: true,
949
				range: [-90, 90]},
949
				range: [-90, 90]},
950
			longitude: {
950
			longitude: {
951
				required: true,
951
				required: true,
952
				range: [-180, 180]},
952
				range: [-180, 180]},
953
			typoUrbaine: {
953
			typoUrbaine: {
954
				required: true},
954
				required: true},
955
			revetementSol: {
955
			revetementSol: {
956
				required: true},
956
				required: true},
957
			intensiteGestion: {
957
			intensiteGestion: {
958
				required: true},
958
				required: true},
959
			periodiciteTraitementPhyto: {
959
			periodiciteTraitementPhyto: {
960
				required: true},
960
				required: true},
961
			itineraireGestion: {
961
			itineraireGestion: {
962
				required: true}
962
				required: true}
963
		}
963
		}
964
	});
964
	});
965
	$('#form-date').validate({
965
	$('#form-date').validate({
966
		rules: {
966
		rules: {
967
			date: {
967
			date: {
968
				required: true,
968
				required: true,
969
				'dateCel' : true},
969
				'dateCel' : true},
970
			dateDerniereIntervention: {
970
			dateDerniereIntervention: {
971
				required: true}
971
				required: true}
972
		},
972
		},
973
		errorPlacement: function(error, element) {
973
		errorPlacement: function(error, element) {
974
			if (element.attr('name') == 'date') {
974
			if (element.attr('name') == 'date') {
975
				element.parent('.input-prepend').after(error);
975
				element.parent('.input-prepend').after(error);
976
			} else {
976
			} else {
977
				error.insertAfter(element);
977
				error.insertAfter(element);
978
			}
978
			}
979
		}
979
		}
980
	});
980
	});
981
	$('#form-obs').validate({
981
	$('#form-obs').validate({
982
		rules: {
982
		rules: {
983
			'taxon-liste': {
983
			'taxon-liste': {
984
				required: true},
984
				required: true},
985
			'milieux[]': {
985
			'milieux[]': {
986
				required: true,
986
				required: true,
987
				minlength: 1},
987
				minlength: 1},
988
			hauteurPlante: {
988
			hauteurPlante: {
989
				required: true,
989
				required: true,
990
				digits: true},
990
				digits: true},
991
			resistanceTraitementPhyto: {
991
			resistanceTraitementPhyto: {
992
				required: true}
992
				required: true}
993
		},
993
		},
994
		errorPlacement: function(error, element) {
994
		errorPlacement: function(error, element) {
995
			if (element.attr('name') == 'milieux[]') {
995
			if (element.attr('name') == 'milieux[]') {
996
				error.insertAfter('#milieux-controls');
996
				error.insertAfter('#milieux-controls');
997
			} else {
997
			} else {
998
				error.insertAfter(element);
998
				error.insertAfter(element);
999
			}
999
			}
1000
		}
1000
		}
1001
	});
1001
	});
1002
}
1002
}
1003
 
1003
 
1004
function validerFormulaire() {
1004
function validerFormulaire() {
1005
	var observateur = $('#form-observateur').valid(),
1005
	var observateur = $('#form-observateur').valid(),
1006
		station = $('#form-site').valid(),
1006
		station = $('#form-site').valid(),
1007
		date = $('#form-date').valid(),
1007
		date = $('#form-date').valid(),
1008
		obs = $('#form-obs').valid(),
1008
		obs = $('#form-obs').valid(),
1009
		debRue = (latLngDeb == undefined) ? false : true,
1009
		debRue = (latLngDeb == undefined) ? false : true,
1010
		finRue = (latLngFin == undefined) ? false : true;
1010
		finRue = (latLngFin == undefined) ? false : true;
1011
	var ok = (observateur && station && obs && date && debRue && finRue) ? true : false;
1011
	var ok = (observateur && station && obs && date && debRue && finRue) ? true : false;
1012
	//console.log(observateur+'-'+station+'-'+obs+'-'+date+'-'+debRue+'-'+finRue);
1012
	//console.log(observateur+'-'+station+'-'+obs+'-'+date+'-'+debRue+'-'+finRue);
1013
	return ok;
1013
	return ok;
1014
}
1014
}
1015
 
1015
 
1016
function fermerPanneauAlert() {
1016
function fermerPanneauAlert() {
1017
	$(this).parentsUntil('.zone-alerte', '.alert').hide();
1017
	$(this).parentsUntil('.zone-alerte', '.alert').hide();
1018
}
1018
}
1019
 
1019
 
1020
function basculerAffichageAide() {
1020
function basculerAffichageAide() {
1021
	if ($(this).hasClass('btn-warning')) {
1021
	if ($(this).hasClass('btn-warning')) {
1022
		$('.has-tooltip').tooltip('enable');
1022
		$('.has-tooltip').tooltip('enable');
1023
		$(this).removeClass('btn-warning').addClass('btn-success');
1023
		$(this).removeClass('btn-warning').addClass('btn-success');
1024
		$('#btn-aide-txt', this).text("Désactiver l'aide");
1024
		$('#btn-aide-txt', this).text("Désactiver l'aide");
1025
	} else {
1025
	} else {
1026
		$('.has-tooltip').tooltip('disable');
1026
		$('.has-tooltip').tooltip('disable');
1027
		$(this).removeClass('btn-success').addClass('btn-warning');
1027
		$(this).removeClass('btn-success').addClass('btn-warning');
1028
		$('#btn-aide-txt', this).text("Activer l'aide");
1028
		$('#btn-aide-txt', this).text("Activer l'aide");
1029
	}
1029
	}
1030
}
1030
}
1031
 
1031
 
1032
function basculerAffichageCoord() {
1032
function basculerAffichageCoord() {
1033
	$('.afficher-coord-action').toggle();
1033
	$('.afficher-coord-action').toggle();
1034
	$('#coordonnees-geo').toggle('slow');
1034
	$('#coordonnees-geo').toggle('slow');
1035
	//valeur false pour que le lien ne soit pas suivi
1035
	//valeur false pour que le lien ne soit pas suivi
1036
	return false;
1036
	return false;
1037
}
1037
}
1038
 
1038
 
1039
 
1039
 
1040
//+----------------------------------------------------------------------------------------------------------+
1040
//+----------------------------------------------------------------------------------------------------------+
1041
// CRÉER OBS : Gestion des obs
1041
// CRÉER OBS : Gestion des obs
1042
 
1042
 
1043
var obsNbre = 0;
1043
var obsNbre = 0;
1044
function ajouterObs() {
1044
function ajouterObs() {
1045
	if (validerFormulaire() == true) {
1045
	if (validerFormulaire() == true) {
1046
		obsNbre = obsNbre + 1;
1046
		obsNbre = obsNbre + 1;
1047
		$('.obs-nbre').text(obsNbre);
1047
		$('.obs-nbre').text(obsNbre);
1048
		$('.obs-nbre').triggerHandler('changement');
1048
		$('.obs-nbre').triggerHandler('changement');
1049
		afficherObs();
1049
		afficherObs();
1050
		stockerObsData();
1050
		stockerObsData();
1051
		supprimerMiniatures();
1051
		supprimerMiniatures();
1052
	} else {
1052
	} else {
1053
		var debRue = (latLngDeb == undefined) ? false : true,
1053
		var debRue = (latLngDeb == undefined) ? false : true,
1054
			finRue = (latLngFin == undefined) ? false : true;
1054
			finRue = (latLngFin == undefined) ? false : true;
1055
		if (debRue == false || finRue == false) {
1055
		if (debRue == false || finRue == false) {
1056
			afficherPanneau('#dialogue-form-invalide-rue');
1056
			afficherPanneau('#dialogue-form-invalide-rue');
1057
		} else {
1057
		} else {
1058
			afficherPanneau('#dialogue-form-invalide');			
1058
			afficherPanneau('#dialogue-form-invalide');
1059
		}
1059
		}
1060
	}
1060
	}
1061
}
1061
}
1062
 
1062
 
1063
function afficherObs() {
1063
function afficherObs() {
1064
	var numNomSel = ($('#taxon-liste').val() == '?') ? $('#taxon').data('numNomSel') : $('#taxon-liste').val(),
1064
	var numNomSel = ($('#taxon-liste').val() == '?') ? $('#taxon').data('numNomSel') : $('#taxon-liste').val(),
1065
		nomSpecial = $('#taxon-liste option:selected').hasClass('nom-special'),
1065
		nomSpecial = $('#taxon-liste option:selected').hasClass('nom-special'),
1066
		taxon = ($('#taxon-liste').val() == '?') ? $('#taxon').val() : $('#taxon-liste option:selected').data('nom-a-sauver'),
1066
		taxon = ($('#taxon-liste').val() == '?') ? $('#taxon').val() : $('#taxon-liste option:selected').data('nom-a-sauver'),
1067
		referentiel = (numNomSel == undefined) ? '' : '['+NOM_SCI_PROJET+']',
1067
		referentiel = (numNomSel == undefined) ? '' : '['+NOM_SCI_PROJET+']',
1068
		commune = $('#commune-nom').text(),
1068
		commune = $('#commune-nom').text(),
1069
		codeInsee = $('#commune-code-insee').text(),
1069
		codeInsee = $('#commune-code-insee').text(),
1070
		lat = $('input[name="latitude"]').val(),
1070
		lat = $('input[name="latitude"]').val(),
1071
		lng = $('input[name="longitude"]').val(),
1071
		lng = $('input[name="longitude"]').val(),
1072
		date = $('#date').val(),
1072
		date = $('#date').val(),
1073
		site = $('#station').val(),
1073
		site = $('#station').val(),
1074
		revetement = $('#revetement-sol').val(),
1074
		revetement = $('#revetement-sol').val(),
1075
		intensiteGestion = $('#intensite-gestion').val(),
1075
		intensiteGestion = $('#intensite-gestion').val(),
1076
		resistance = $('#resistance-traitement-phyto').val(),
1076
		resistance = $('#resistance-traitement-phyto').val(),
1077
		milieux = getMilieux(),
1077
		milieux = getMilieux(),
1078
		notes = (nomSpecial ? taxons[numNomSel]['nom_fr'] + ".<br />" : '') + $('#notes').val();
1078
		notes = (nomSpecial ? taxons[numNomSel]['nom_fr'] + ".<br />" : '') + $('#notes').val();
1079
	
1079
 
1080
	$('#liste-obs').prepend(
1080
	$('#liste-obs').prepend(
1081
		'<div id="obs'+obsNbre+'" class="row-fluid obs obs'+obsNbre+'">'+
1081
		'<div id="obs'+obsNbre+'" class="row-fluid obs obs'+obsNbre+'">'+
1082
			'<div class="span12">'+
1082
			'<div class="span12">'+
1083
				'<div class="well">'+
1083
				'<div class="well">'+
1084
					'<div class="obs-action pull-right has-tooltip" data-placement="bottom" '+
1084
					'<div class="obs-action pull-right has-tooltip" data-placement="bottom" '+
1085
						'title="Supprimer cette observation de la liste à transmettre">'+
1085
						'title="Supprimer cette observation de la liste à transmettre">'+
1086
						'<button class="btn btn-danger supprimer-obs" value="'+obsNbre+'" title="'+obsNbre+'">'+
1086
						'<button class="btn btn-danger supprimer-obs" value="'+obsNbre+'" title="'+obsNbre+'">'+
1087
							'<i class="icon-trash icon-white"></i>'+
1087
							'<i class="icon-trash icon-white"></i>'+
1088
						'</button>'+
1088
						'</button>'+
1089
					'</div> '+		
1089
					'</div> '+
1090
					'<div class="row-fluid">'+	
1090
					'<div class="row-fluid">'+
1091
						'<div class="span2 obs-miniatures">'+
1091
						'<div class="span2 obs-miniatures">'+
1092
							ajouterImgMiniatureAuTransfert()+
1092
							ajouterImgMiniatureAuTransfert()+
1093
						'</div>'+
1093
						'</div>'+
1094
						'<div class="span8">'+
1094
						'<div class="span8">'+
1095
							'<ul class="unstyled">'+
1095
							'<ul class="unstyled">'+
1096
								'<li>'+
1096
								'<li>'+
1097
									'<span class="nom-sci">' + taxon + '</span> ' +
1097
									'<span class="nom-sci">' + taxon + '</span> ' +
1098
									formaterNumNomSel(numNomSel)+
1098
									formaterNumNomSel(numNomSel)+
1099
									'<span class="referentiel-obs">' + referentiel + '</span>' +
1099
									'<span class="referentiel-obs">' + referentiel + '</span>' +
1100
									' observé à ' +
1100
									' observé à ' +
1101
									'<span class="commune">' + commune + '</span> ' +
1101
									'<span class="commune">' + commune + '</span> ' +
1102
									'(' + codeInsee + ') [' + lat +' / ' + lng + ']' +
1102
									'(' + codeInsee + ') [' + lat +' / ' + lng + ']' +
1103
									' le ' +
1103
									' le ' +
1104
									'<span class="date">' + date + '</span>' +
1104
									'<span class="date">' + date + '</span>' +
1105
								'</li>' +
1105
								'</li>' +
1106
								'<li>' +
1106
								'<li>' +
1107
									'<span>Site :</span> ' + site + ' ' + ' ; ' +
1107
									'<span>Site :</span> ' + site + ' ' + ' ; ' +
1108
									'<span>Revêtement au sol :</span> ' + revetement + ' ' + ' ; ' +
1108
									'<span>Revêtement au sol :</span> ' + revetement + ' ' + ' ; ' +
1109
									'<span>Intensité de gestion :</span> ' + intensiteGestion + ' ' + ' ; ' +
1109
									'<span>Intensité de gestion :</span> ' + intensiteGestion + ' ' + ' ; ' +
1110
									'<span>Milieu :</span> ' + milieux + ' ' + ' ; ' +
1110
									'<span>Milieu :</span> ' + milieux + ' ' + ' ; ' +
1111
									'<span>Résistance/Résilience :</span> ' + resistance + ' ' +
1111
									'<span>Résistance/Résilience :</span> ' + resistance + ' ' +
1112
								'</li>' +
1112
								'</li>' +
1113
								'<li>' +
1113
								'<li>' +
1114
									'Commentaires : ' + notes + 
1114
									'Commentaires : ' + notes +
1115
								'</li>'+
1115
								'</li>'+
1116
							'</ul>'+
1116
							'</ul>'+
1117
						'</div>'+
1117
						'</div>'+
1118
					'</div>'+
1118
					'</div>'+
1119
				'</div>'+
1119
				'</div>'+
1120
			'</div>'+
1120
			'</div>'+
1121
		'</div>');
1121
		'</div>');
1122
}
1122
}
1123
 
1123
 
1124
function getMilieux() {
1124
function getMilieux() {
1125
	var milieuxStr = '',
1125
	var milieuxStr = '',
1126
		milieux = [];
1126
		milieux = [];
1127
	$('.cb-milieux:checked').each(function() {
1127
	$('.cb-milieux:checked').each(function() {
1128
		milieux.push($(this).val());
1128
		milieux.push($(this).val());
1129
	});
1129
	});
1130
	
1130
 
1131
	milieuxStr = Array.prototype.slice.call(milieux).join(', ');
1131
	milieuxStr = Array.prototype.slice.call(milieux).join(', ');
1132
	return milieuxStr;
1132
	return milieuxStr;
1133
}
1133
}
1134
 
1134
 
1135
function ajouterImgMiniatureAuTransfert() {
1135
function ajouterImgMiniatureAuTransfert() {
1136
	var html = '',
1136
	var html = '',
1137
		miniatures = '',
1137
		miniatures = '',
1138
		indicateurs = '',
1138
		indicateurs = '',
1139
		premiere = true,
1139
		premiere = true,
1140
		numero = 1;
1140
		numero = 1;
1141
	if ($('#miniatures img').length == 0) {
1141
	if ($('#miniatures img').length == 0) {
1142
		html = '<img class="miniature" alt="Aucune photo"src="'+PAS_DE_PHOTO_ICONE_URL+'" />';
1142
		html = '<img class="miniature" alt="Aucune photo"src="'+PAS_DE_PHOTO_ICONE_URL+'" />';
1143
	} else if ($('#miniatures img').length >= 1) {
1143
	} else if ($('#miniatures img').length >= 1) {
1144
		$('#miniatures img').each(function() {
1144
		$('#miniatures img').each(function() {
1145
			var visible = premiere ? 'miniature-selectionnee' : 'miniature-cachee',
1145
			var visible = premiere ? 'miniature-selectionnee' : 'miniature-cachee',
1146
				css = $(this).hasClass('b64') ? 'miniature b64' : 'miniature',
1146
				css = $(this).hasClass('b64') ? 'miniature b64' : 'miniature',
1147
				src = $(this).attr('src'),
1147
				src = $(this).attr('src'),
1148
				alt = $(this).attr('alt');
1148
				alt = $(this).attr('alt');
1149
			
1149
 
1150
			var miniature = '<img class="'+css+' '+visible+'"  alt="'+alt+'"src="'+src+'" />';
1150
			var miniature = '<img class="'+css+' '+visible+'"  alt="'+alt+'"src="'+src+'" />';
1151
			miniatures += miniature;
1151
			miniatures += miniature;
1152
			
1152
 
1153
			var indicateurActif = premiere ? 'active' : '';
1153
			var indicateurActif = premiere ? 'active' : '';
1154
			var indicateur = '<li class="' + indicateurActif + '" data-numero="' + numero++ + '"></li>';
1154
			var indicateur = '<li class="' + indicateurActif + '" data-numero="' + numero++ + '"></li>';
1155
			indicateurs += indicateur;
1155
			indicateurs += indicateur;
1156
		
1156
 
1157
			premiere = false;
1157
			premiere = false;
1158
		});
1158
		});
1159
		
1159
 
1160
		if ($('#miniatures img').length == 1) {
1160
		if ($('#miniatures img').length == 1) {
1161
			html = miniatures;
1161
			html = miniatures;
1162
		} else {
1162
		} else {
1163
			html = 
1163
			html =
1164
				'<div class="defilement">' +
1164
				'<div class="defilement">' +
1165
					miniatures +
1165
					miniatures +
1166
					'<a class="defilement-control-zone gauche">' +
1166
					'<a class="defilement-control-zone gauche">' +
1167
					'	<span class="defilement-control gauche hidden">&#60;</span>' +
1167
					'	<span class="defilement-control gauche hidden">&#60;</span>' +
1168
					'</a>' +
1168
					'</a>' +
1169
					'<a class="defilement-control-zone droite">' +
1169
					'<a class="defilement-control-zone droite">' +
1170
					'	<span class="defilement-control droite hidden">&#62;</span>' +
1170
					'	<span class="defilement-control droite hidden">&#62;</span>' +
1171
					'</a>' +
1171
					'</a>' +
1172
					'<ol class="defilement-indicateurs">' + indicateurs + '</ol>' +
1172
					'<ol class="defilement-indicateurs">' + indicateurs + '</ol>' +
1173
				'</div>';
1173
				'</div>';
1174
		}
1174
		}
1175
	}
1175
	}
1176
	return html;
1176
	return html;
1177
}
1177
}
1178
 
1178
 
1179
function defilerMiniatures(element) {
1179
function defilerMiniatures(element) {
1180
	var miniatureSelectionne = element.siblings('img.miniature-selectionnee');
1180
	var miniatureSelectionne = element.siblings('img.miniature-selectionnee');
1181
	miniatureSelectionne.removeClass('miniature-selectionnee').addClass('miniature-cachee');
1181
	miniatureSelectionne.removeClass('miniature-selectionnee').addClass('miniature-cachee');
1182
	var miniatureAffichee = miniatureSelectionne;
1182
	var miniatureAffichee = miniatureSelectionne;
1183
	
1183
 
1184
	var indicateurActif = element.parent().find('.defilement-indicateurs .active');
1184
	var indicateurActif = element.parent().find('.defilement-indicateurs .active');
1185
	indicateurActif.removeClass('active');
1185
	indicateurActif.removeClass('active');
1186
	
1186
 
1187
	if (element.hasClass('defilement-control-zone') && element.hasClass('gauche')) {
1187
	if (element.hasClass('defilement-control-zone') && element.hasClass('gauche')) {
1188
		if (miniatureSelectionne.prev('.miniature').length != 0) {
1188
		if (miniatureSelectionne.prev('.miniature').length != 0) {
1189
			miniatureAffichee = miniatureSelectionne.prev('.miniature');
1189
			miniatureAffichee = miniatureSelectionne.prev('.miniature');
1190
			indicateurActif.prev().addClass('active');
1190
			indicateurActif.prev().addClass('active');
1191
		} else {
1191
		} else {
1192
			miniatureAffichee = miniatureSelectionne.siblings('.miniature').last();
1192
			miniatureAffichee = miniatureSelectionne.siblings('.miniature').last();
1193
			indicateurActif.siblings().last().addClass('active');
1193
			indicateurActif.siblings().last().addClass('active');
1194
		}
1194
		}
1195
	} else {
1195
	} else {
1196
		if (miniatureSelectionne.next('.miniature').length != 0) {
1196
		if (miniatureSelectionne.next('.miniature').length != 0) {
1197
			miniatureAffichee = miniatureSelectionne.next('.miniature');
1197
			miniatureAffichee = miniatureSelectionne.next('.miniature');
1198
			indicateurActif.next().addClass('active');
1198
			indicateurActif.next().addClass('active');
1199
		} else {
1199
		} else {
1200
			miniatureAffichee = miniatureSelectionne.siblings('.miniature').first();
1200
			miniatureAffichee = miniatureSelectionne.siblings('.miniature').first();
1201
			indicateurActif.siblings().first().addClass('active');
1201
			indicateurActif.siblings().first().addClass('active');
1202
		}
1202
		}
1203
	}
1203
	}
1204
	miniatureAffichee.addClass('miniature-selectionnee').removeClass('miniature-cachee');
1204
	miniatureAffichee.addClass('miniature-selectionnee').removeClass('miniature-cachee');
1205
}
1205
}
1206
 
1206
 
1207
function formaterNumNomSel(numNomSel) {
1207
function formaterNumNomSel(numNomSel) {
1208
	var nn = '';
1208
	var nn = '';
1209
	if (numNomSel == undefined) {
1209
	if (numNomSel == undefined) {
1210
		nn = '<span class="alert-error">[non lié au référentiel]</span>';
1210
		nn = '<span class="alert-error">[non lié au référentiel]</span>';
1211
	} else {
1211
	} else {
1212
		nn = '<span class="nn">[nn'+numNomSel+']</span>';
1212
		nn = '<span class="nn">[nn'+numNomSel+']</span>';
1213
	}
1213
	}
1214
	return nn;
1214
	return nn;
1215
}
1215
}
1216
 
1216
 
1217
function surChangementReferentiel() {
1217
function surChangementReferentiel() {
1218
	NOM_SCI_PROJET = $('#referentiel').val();
1218
	NOM_SCI_REFERENTIEL = $('#referentiel').val();
1219
	NOM_SCI_REFERENTIEL = NOM_SCI_PROJET+':'+PROJETS_VERSIONS[NOM_SCI_PROJET];
-
 
1220
	$('#taxon').val('');
1219
	$('#taxon').val('');
1221
}
1220
}
1222
 
1221
 
1223
function surChangementNbreObs() {
1222
function surChangementNbreObs() {
1224
	if (obsNbre == 0) {
1223
	if (obsNbre == 0) {
1225
		$('#transmettre-obs').attr('disabled', 'disabled');
1224
		$('#transmettre-obs').attr('disabled', 'disabled');
1226
		$('#ajouter-obs').removeAttr('disabled');
1225
		$('#ajouter-obs').removeAttr('disabled');
1227
		$('#zone-liste-obs').addClass('hidden');
1226
		$('#zone-liste-obs').addClass('hidden');
1228
	} else {
1227
	} else {
1229
		$('#zone-liste-obs').removeClass('hidden');
1228
		$('#zone-liste-obs').removeClass('hidden');
1230
		
1229
 
1231
		if (obsNbre > 0 && obsNbre < OBS_MAX_NBRE) {
1230
		if (obsNbre > 0 && obsNbre < OBS_MAX_NBRE) {
1232
			$('#transmettre-obs').removeAttr('disabled');
1231
			$('#transmettre-obs').removeAttr('disabled');
1233
			$('#ajouter-obs').removeAttr('disabled');
1232
			$('#ajouter-obs').removeAttr('disabled');
1234
		} else if (obsNbre >= OBS_MAX_NBRE) {
1233
		} else if (obsNbre >= OBS_MAX_NBRE) {
1235
			$('#ajouter-obs').attr('disabled', 'disabled');
1234
			$('#ajouter-obs').attr('disabled', 'disabled');
1236
			afficherPanneau('#dialogue-bloquer-creer-obs');
1235
			afficherPanneau('#dialogue-bloquer-creer-obs');
1237
		}
1236
		}
1238
	}
1237
	}
1239
}
1238
}
1240
 
1239
 
1241
function supprimerObs() {
1240
function supprimerObs() {
1242
	var obsId = $(this).val();
1241
	var obsId = $(this).val();
1243
	// Problème avec IE 6 et 7
1242
	// Problème avec IE 6 et 7
1244
	if (obsId == "Supprimer") {
1243
	if (obsId == "Supprimer") {
1245
		obsId = $(this).attr("title");
1244
		obsId = $(this).attr("title");
1246
	}
1245
	}
1247
	supprimerObsParId(obsId);
1246
	supprimerObsParId(obsId);
1248
}
1247
}
1249
 
1248
 
1250
function supprimerObsParId(obsId) {
1249
function supprimerObsParId(obsId) {
1251
	obsNbre = obsNbre - 1;
1250
	obsNbre = obsNbre - 1;
1252
	$(".obs-nbre").text(obsNbre);
1251
	$(".obs-nbre").text(obsNbre);
1253
	$(".obs-nbre").triggerHandler('changement');
1252
	$(".obs-nbre").triggerHandler('changement');
1254
	$('.obs'+obsId).remove();
1253
	$('.obs'+obsId).remove();
1255
	$("#liste-obs").removeData('obsId'+obsId);
1254
	$("#liste-obs").removeData('obsId'+obsId);
1256
}
1255
}
1257
 
1256
 
1258
function initialiserBarreProgression() {
1257
function initialiserBarreProgression() {
1259
	$('#barre-progression-upload').attr('aria-valuenow', 0);
1258
	$('#barre-progression-upload').attr('aria-valuenow', 0);
1260
	$('#barre-progression-upload').attr('style', "width: 0%");
1259
	$('#barre-progression-upload').attr('style', "width: 0%");
1261
	$('#barre-progression-upload .sr-only').text("0/0 observations transmises");
1260
	$('#barre-progression-upload .sr-only').text("0/0 observations transmises");
1262
	$('.progress').addClass('active');
1261
	$('.progress').addClass('active');
1263
	$('.progress').addClass('progress-striped');
1262
	$('.progress').addClass('progress-striped');
1264
}
1263
}
1265
 
1264
 
1266
function initialiserObs() {
1265
function initialiserObs() {
1267
	obsNbre = 0;
1266
	obsNbre = 0;
1268
	nbObsTransmises = 0;
1267
	nbObsTransmises = 0;
1269
	nbObsEnCours = 0;
1268
	nbObsEnCours = 0;
1270
	totalObsATransmettre = 0;
1269
	totalObsATransmettre = 0;
1271
	initialiserBarreProgression();
1270
	initialiserBarreProgression();
1272
	$(".obs-nbre").text(obsNbre);
1271
	$(".obs-nbre").text(obsNbre);
1273
	$(".obs-nbre").triggerHandler('changement');
1272
	$(".obs-nbre").triggerHandler('changement');
1274
	$("#liste-obs").removeData();
1273
	$("#liste-obs").removeData();
1275
	$('.obs').remove();
1274
	$('.obs').remove();
1276
	$("#dialogue-bloquer-creer-obs").hide();
1275
	$("#dialogue-bloquer-creer-obs").hide();
1277
}
1276
}
1278
 
1277
 
1279
function getNomsImgsOriginales() {
1278
function getNomsImgsOriginales() {
1280
	var noms = new Array();
1279
	var noms = new Array();
1281
	$('.miniature-img').each(function() {
1280
	$('.miniature-img').each(function() {
1282
		noms.push($(this).attr('alt'));
1281
		noms.push($(this).attr('alt'));
1283
	});
1282
	});
1284
	return noms;
1283
	return noms;
1285
}
1284
}
1286
 
1285
 
1287
function stockerObsData() {
1286
function stockerObsData() {
1288
	var nomHorsListe = $('#taxon-liste').val() == '?' ? true : false;
1287
	var nomHorsListe = $('#taxon-liste').val() == '?' ? true : false;
1289
		nomSpecial = $('#taxon-liste option:selected').hasClass('nom-special'),
1288
		nomSpecial = $('#taxon-liste option:selected').hasClass('nom-special'),
1290
		numNomSel = nomHorsListe ? $('#taxon').data('numNomSel') : $('#taxon-liste').val(),
1289
		numNomSel = nomHorsListe ? $('#taxon').data('numNomSel') : $('#taxon-liste').val(),
1291
		nomSel = nomHorsListe ? $('#taxon').val() : $('#taxon-liste option:selected').data('nom-a-sauver'),
1290
		nomSel = nomHorsListe ? $('#taxon').val() : $('#taxon-liste option:selected').data('nom-a-sauver'),
1292
		nomRet = nomHorsListe ? $('#taxon').data('nomRet') : taxons[numNomSel]['nom_ret'],
1291
		nomRet = nomHorsListe ? $('#taxon').data('nomRet') : taxons[numNomSel]['nom_ret'],
1293
		numNomRet = nomHorsListe ? $('#taxon').data('numNomRet') : taxons[numNomSel]['num_nom_ret'],
1292
		numNomRet = nomHorsListe ? $('#taxon').data('numNomRet') : taxons[numNomSel]['num_nom_ret'],
1294
		numTaxon = nomHorsListe ? $('#taxon').data('nt') : taxons[numNomSel]['num_taxon'],
1293
		numTaxon = nomHorsListe ? $('#taxon').data('nt') : taxons[numNomSel]['num_taxon'],
1295
		famille = nomHorsListe ? $('#taxon').data('famille') : taxons[numNomSel]['famille'],
1294
		famille = nomHorsListe ? $('#taxon').data('famille') : taxons[numNomSel]['famille'],
1296
		referentiel = (numNomSel == undefined) ? '' : NOM_SCI_REFERENTIEL,
1295
		referentiel = (numNomSel == undefined) ? '' : NOM_SCI_REFERENTIEL,
1297
		notes = (nomSpecial ? taxons[numNomSel]['nom_fr'] + '. ' : '') + $('#notes').val();
1296
		notes = (nomSpecial ? taxons[numNomSel]['nom_fr'] + '. ' : '') + $('#notes').val();
1298
	
1297
 
1299
	$('#liste-obs').data('obsId'+obsNbre, {
1298
	$('#liste-obs').data('obsId'+obsNbre, {
1300
		'date': $('#date').val(), 
1299
		'date': $('#date').val(),
1301
		'notes': notes,
1300
		'notes': notes,
1302
		
1301
 
1303
		'station': $('#station').val(),
1302
		'station': $('#station').val(),
1304
		'latitude': $('#latitude').val(),
1303
		'latitude': $('#latitude').val(),
1305
		'longitude': $('#longitude').val(),
1304
		'longitude': $('#longitude').val(),
1306
		'commune_nom': $('#commune-nom').text(),
1305
		'commune_nom': $('#commune-nom').text(),
1307
		'commune_code_insee': $('#commune-code-insee').text(),
1306
		'commune_code_insee': $('#commune-code-insee').text(),
1308
		
1307
 
1309
		'nom_sel': nomSel,
1308
		'nom_sel': nomSel,
1310
		'num_nom_sel': numNomSel,
1309
		'num_nom_sel': numNomSel,
1311
		'nom_ret': nomRet,
1310
		'nom_ret': nomRet,
1312
		'num_nom_ret': numNomRet,
1311
		'num_nom_ret': numNomRet,
1313
		'num_taxon': numTaxon,
1312
		'num_taxon': numTaxon,
1314
		'famille': famille,
1313
		'famille': famille,
1315
		'referentiel': referentiel,
1314
		'referentiel': referentiel,
1316
		
1315
 
1317
		'milieu': getMilieux(),
1316
		'milieu': getMilieux(),
1318
		
1317
 
1319
		// Ajout des champs images
1318
		// Ajout des champs images
1320
		'image_nom': getNomsImgsOriginales(),
1319
		'image_nom': getNomsImgsOriginales(),
1321
		
1320
 
1322
		// Ajout des champs étendus de l'obs
1321
		// Ajout des champs étendus de l'obs
1323
		'obs_etendue': getObsChpEtendus()
1322
		'obs_etendue': getObsChpEtendus()
1324
	});
1323
	});
1325
	//console.log($('#liste-obs').data('obsId'+obsNbre));
1324
	//console.log($('#liste-obs').data('obsId'+obsNbre));
1326
}
1325
}
1327
 
1326
 
1328
function getObsChpEtendus() {
1327
function getObsChpEtendus() {
1329
	var champs = [],
1328
	var champs = [],
1330
		perceptionTechnicien = getPerceptionTechnicien();
1329
		perceptionTechnicien = getPerceptionTechnicien();
1331
	if (perceptionTechnicien != undefined) {
1330
	if (perceptionTechnicien != undefined) {
1332
		champs.push(perceptionTechnicien);
1331
		champs.push(perceptionTechnicien);
1333
	}
1332
	}
1334
	if (latLngDeb != undefined) {
1333
	if (latLngDeb != undefined) {
1335
		var latitudeDebutRue = {cle: 'latitudeDebutRue', label: 'Latitude du début de la rue', valeur: latLngDeb.lat().toFixed(5)};
1334
		var latitudeDebutRue = {cle: 'latitudeDebutRue', label: 'Latitude du début de la rue', valeur: latLngDeb.lat().toFixed(5)};
1336
		champs.push(latitudeDebutRue);
1335
		champs.push(latitudeDebutRue);
1337
		var longitudeDebutRue = {cle: 'longitudeDebutRue', label: 'Longitude du début de la rue', valeur: latLngDeb.lng().toFixed(5)};
1336
		var longitudeDebutRue = {cle: 'longitudeDebutRue', label: 'Longitude du début de la rue', valeur: latLngDeb.lng().toFixed(5)};
1338
		champs.push(longitudeDebutRue);
1337
		champs.push(longitudeDebutRue);
1339
	}
1338
	}
1340
	if (latLngFin != undefined) {
1339
	if (latLngFin != undefined) {
1341
		var latitudeFinRue = {cle: 'latitudeFinRue', label: 'Latitude de fin de la rue', valeur: latLngFin.lat().toFixed(5)};
1340
		var latitudeFinRue = {cle: 'latitudeFinRue', label: 'Latitude de fin de la rue', valeur: latLngFin.lat().toFixed(5)};
1342
		champs.push(latitudeFinRue);
1341
		champs.push(latitudeFinRue);
1343
		var longitudeFinRue = {cle: 'longitudeFinRue', label: 'Longitude de fin de la rue', valeur: latLngFin.lng().toFixed(5)};
1342
		var longitudeFinRue = {cle: 'longitudeFinRue', label: 'Longitude de fin de la rue', valeur: latLngFin.lng().toFixed(5)};
1344
		champs.push(longitudeFinRue);
1343
		champs.push(longitudeFinRue);
1345
	}
1344
	}
1346
	
1345
 
1347
	$('.obs-chp-etendu').each(function() {
1346
	$('.obs-chp-etendu').each(function() {
1348
		var valeur = $(this).val(),
1347
		var valeur = $(this).val(),
1349
			cle = $(this).attr('name'),
1348
			cle = $(this).attr('name'),
1350
			label = $(this).data('label');
1349
			label = $(this).data('label');
1351
		if (valeur != '') {
1350
		if (valeur != '') {
1352
			var chpEtendu = {cle: cle, label: label, valeur: valeur};
1351
			var chpEtendu = {cle: cle, label: label, valeur: valeur};
1353
			champs.push(chpEtendu);
1352
			champs.push(chpEtendu);
1354
		}
1353
		}
1355
	});
1354
	});
1356
	return champs;
1355
	return champs;
1357
}
1356
}
1358
 
1357
 
1359
function getPerceptionTechnicien() {
1358
function getPerceptionTechnicien() {
1360
	var perceptionTechnicien = undefined,
1359
	var perceptionTechnicien = undefined,
1361
		perceptions = [];
1360
		perceptions = [];
1362
	$('.cb-perception-technicien:checked').each(function() {
1361
	$('.cb-perception-technicien:checked').each(function() {
1363
		perceptions.push($(this).val());
1362
		perceptions.push($(this).val());
1364
	});
1363
	});
1365
	if (perceptions.length > 0) {
1364
	if (perceptions.length > 0) {
1366
		var valeur = Array.prototype.slice.call(perceptions).join(', ');
1365
		var valeur = Array.prototype.slice.call(perceptions).join(', ');
1367
		perceptionTechnicien = {cle: 'perceptionTechnicien', label: "Perceptions par l'équipe", valeur: valeur};
1366
		perceptionTechnicien = {cle: 'perceptionTechnicien', label: "Perceptions par l'équipe", valeur: valeur};
1368
	}
1367
	}
1369
	return perceptionTechnicien;
1368
	return perceptionTechnicien;
1370
}
1369
}
1371
 
1370
 
1372
//+----------------------------------------------------------------------------------------------------------+
1371
//+----------------------------------------------------------------------------------------------------------+
1373
// TRANSFERER OBS : envoie des obs au CEL
1372
// TRANSFERER OBS : envoie des obs au CEL
1374
var nbObsEnCours = 1;
1373
var nbObsEnCours = 1;
1375
var totalObsATransmettre = 0;
1374
var totalObsATransmettre = 0;
1376
function transmettreObs() {
1375
function transmettreObs() {
1377
	var observations = $("#liste-obs").data();
1376
	var observations = $("#liste-obs").data();
1378
	if (observations == undefined || jQuery.isEmptyObject(observations)) {
1377
	if (observations == undefined || jQuery.isEmptyObject(observations)) {
1379
		afficherPanneau("#dialogue-zero-obs");
1378
		afficherPanneau("#dialogue-zero-obs");
1380
	} else {
1379
	} else {
1381
		nbObsEnCours = 1;
1380
		nbObsEnCours = 1;
1382
		nbObsTransmises = 0;
1381
		nbObsTransmises = 0;
1383
		totalObsATransmettre = $.map(observations, function(n, i) { return i; }).length;
1382
		totalObsATransmettre = $.map(observations, function(n, i) { return i; }).length;
1384
		depilerObsPourEnvoi();
1383
		depilerObsPourEnvoi();
1385
	}
1384
	}
1386
	return false;
1385
	return false;
1387
}
1386
}
1388
 
1387
 
1389
function depilerObsPourEnvoi() {
1388
function depilerObsPourEnvoi() {
1390
	var observations = $("#liste-obs").data();
1389
	var observations = $("#liste-obs").data();
1391
	// la boucle est factice car on utilise un tableau
1390
	// la boucle est factice car on utilise un tableau
1392
	// dont on a besoin de n'extraire que le premier élément
1391
	// dont on a besoin de n'extraire que le premier élément
1393
	// or javascript n'a pas de méthode cross browsers pour extraire les clés
1392
	// or javascript n'a pas de méthode cross browsers pour extraire les clés
1394
	// TODO: utiliser var.keys quand ça sera plus répandu
1393
	// TODO: utiliser var.keys quand ça sera plus répandu
1395
	// ou bien utiliser un vrai tableau et pas un objet
1394
	// ou bien utiliser un vrai tableau et pas un objet
1396
	for (var obsNum in observations) {	
1395
	for (var obsNum in observations) {
1397
		obsATransmettre = new Object();	
1396
		obsATransmettre = new Object();
1398
	    
1397
 
1399
	    obsATransmettre['projet'] = TAG_PROJET;
1398
	    obsATransmettre['projet'] = TAG_PROJET;
1400
	    obsATransmettre['tag-obs'] = TAG_OBS;
1399
	    obsATransmettre['tag-obs'] = TAG_OBS;
1401
	    obsATransmettre['tag-img'] = TAG_IMG;
1400
	    obsATransmettre['tag-img'] = TAG_IMG;
1402
		
1401
 
1403
		var utilisateur = new Object();
1402
		var utilisateur = new Object();
1404
		utilisateur.id_utilisateur = $("#id_utilisateur").val();
1403
		utilisateur.id_utilisateur = $("#id_utilisateur").val();
1405
		utilisateur.prenom = $("#prenom").val();
1404
		utilisateur.prenom = $("#prenom").val();
1406
		utilisateur.nom = $("#nom").val();
1405
		utilisateur.nom = $("#nom").val();
1407
		utilisateur.courriel = $("#courriel").val();
1406
		utilisateur.courriel = $("#courriel").val();
1408
		obsATransmettre['utilisateur'] = utilisateur;
1407
		obsATransmettre['utilisateur'] = utilisateur;
1409
		obsATransmettre[obsNum] = observations[obsNum];
1408
		obsATransmettre[obsNum] = observations[obsNum];
1410
		var idObsNumerique = obsNum.replace('obsId', '');
1409
		var idObsNumerique = obsNum.replace('obsId', '');
1411
		if(idObsNumerique != "") {
1410
		if(idObsNumerique != "") {
1412
			envoyerObsAuCel(idObsNumerique, obsATransmettre);
1411
			envoyerObsAuCel(idObsNumerique, obsATransmettre);
1413
		}
1412
		}
1414
		
1413
 
1415
		break;
1414
		break;
1416
	}
1415
	}
1417
}
1416
}
1418
 
1417
 
1419
var nbObsTransmises = 0;
1418
var nbObsTransmises = 0;
1420
function mettreAJourProgression() {
1419
function mettreAJourProgression() {
1421
	nbObsTransmises++;
1420
	nbObsTransmises++;
1422
	var pct = (nbObsTransmises/totalObsATransmettre)*100;
1421
	var pct = (nbObsTransmises/totalObsATransmettre)*100;
1423
	$('#barre-progression-upload').attr('aria-valuenow', nbObsTransmises);
1422
	$('#barre-progression-upload').attr('aria-valuenow', nbObsTransmises);
1424
	$('#barre-progression-upload').attr('style', "width: "+pct+"%");
1423
	$('#barre-progression-upload').attr('style', "width: "+pct+"%");
1425
	$('#barre-progression-upload .sr-only').text(nbObsTransmises+"/"+totalObsATransmettre+" observations transmises");
1424
	$('#barre-progression-upload .sr-only').text(nbObsTransmises+"/"+totalObsATransmettre+" observations transmises");
1426
 
1425
 
1427
	if(obsNbre == 0) {
1426
	if(obsNbre == 0) {
1428
		$('.progress').removeClass('active');
1427
		$('.progress').removeClass('active');
1429
		$('.progress').removeClass('progress-striped');
1428
		$('.progress').removeClass('progress-striped');
1430
	}
1429
	}
1431
}
1430
}
1432
 
1431
 
1433
function envoyerObsAuCel(idObs, observation) {
1432
function envoyerObsAuCel(idObs, observation) {
1434
	var erreurMsg = '',
1433
	var erreurMsg = '',
1435
		debugNonJson = '';
1434
		debugNonJson = '';
1436
	$.ajax({
1435
	$.ajax({
1437
		url: SERVICE_SAISIE_URL,
1436
		url: SERVICE_SAISIE_URL,
1438
		type: 'POST',
1437
		type: 'POST',
1439
		data: observation,
1438
		data: observation,
1440
		dataType: 'json',
1439
		dataType: 'json',
1441
		beforeSend: function() {
1440
		beforeSend: function() {
1442
			$('#dialogue-obs-transaction-ko').hide();
1441
			$('#dialogue-obs-transaction-ko').hide();
1443
			$('#dialogue-obs-transaction-ok').hide();
1442
			$('#dialogue-obs-transaction-ok').hide();
1444
			$('.alert-txt').empty();	
1443
			$('.alert-txt').empty();
1445
			$('#chargement').show();
1444
			$('#chargement').show();
1446
		},
1445
		},
1447
		success: function(data, textStatus, jqXHR) {
1446
		success: function(data, textStatus, jqXHR) {
1448
			// mise à jour du nombre d'obs à transmettre
1447
			// mise à jour du nombre d'obs à transmettre
1449
			// et suppression de l'obs
1448
			// et suppression de l'obs
1450
			supprimerObsParId(idObs);
1449
			supprimerObsParId(idObs);
1451
			nbObsEnCours++;
1450
			nbObsEnCours++;
1452
			// mise à jour du statut
1451
			// mise à jour du statut
1453
			mettreAJourProgression();
1452
			mettreAJourProgression();
1454
			if(obsNbre > 0) {
1453
			if(obsNbre > 0) {
1455
				// dépilement de la suivante
1454
				// dépilement de la suivante
1456
				depilerObsPourEnvoi();
1455
				depilerObsPourEnvoi();
1457
			}
1456
			}
1458
			supprimerMiniatures();
1457
			supprimerMiniatures();
1459
		},
1458
		},
1460
		statusCode: {
1459
		statusCode: {
1461
			500: function(jqXHR, textStatus, errorThrown) {
1460
			500: function(jqXHR, textStatus, errorThrown) {
1462
				erreurMsg += "Erreur 500 :\ntype : " + textStatus + ' ' + errorThrown + "\n";
1461
				erreurMsg += "Erreur 500 :\ntype : " + textStatus + ' ' + errorThrown + "\n";
1463
			}
1462
			}
1464
		},
1463
		},
1465
		error: function(jqXHR, textStatus, errorThrown) {
1464
		error: function(jqXHR, textStatus, errorThrown) {
1466
			erreurMsg += "Erreur Ajax :\ntype : " + textStatus + ' ' + errorThrown + "\n";
1465
			erreurMsg += "Erreur Ajax :\ntype : " + textStatus + ' ' + errorThrown + "\n";
1467
			try {
1466
			try {
1468
				reponse = jQuery.parseJSON(jqXHR.responseText);
1467
				reponse = jQuery.parseJSON(jqXHR.responseText);
1469
				if (reponse != null) {
1468
				if (reponse != null) {
1470
					$.each(reponse, function (cle, valeur) {
1469
					$.each(reponse, function (cle, valeur) {
1471
						erreurMsg += valeur + "\n";
1470
						erreurMsg += valeur + "\n";
1472
					});
1471
					});
1473
				}
1472
				}
1474
			} catch(e) {
1473
			} catch(e) {
1475
				erreurMsg += "L'erreur n'est pas en JSON.";
1474
				erreurMsg += "L'erreur n'est pas en JSON.";
1476
				debugNonJson = jqXHR.responseText;
1475
				debugNonJson = jqXHR.responseText;
1477
			}
1476
			}
1478
		},
1477
		},
1479
		complete: function(jqXHR, textStatus) {
1478
		complete: function(jqXHR, textStatus) {
1480
			var debugMsg = extraireEnteteDebug(jqXHR);
1479
			var debugMsg = extraireEnteteDebug(jqXHR);
1481
			
1480
 
1482
			if (erreurMsg != '') {
1481
			if (erreurMsg != '') {
1483
				if (DEBUG) {
1482
				if (DEBUG) {
1484
					$('#dialogue-obs-transaction-ko .alert-txt').append('<pre class="msg-erreur">' + erreurMsg + '</pre>');
1483
					$('#dialogue-obs-transaction-ko .alert-txt').append('<pre class="msg-erreur">' + erreurMsg + '</pre>');
1485
					$('#dialogue-obs-transaction-ko .alert-txt').append('<pre class="msg-debug">Débogage : ' + debugNonJson + debugMsg + '</pre>');
1484
					$('#dialogue-obs-transaction-ko .alert-txt').append('<pre class="msg-debug">Débogage : ' + debugNonJson + debugMsg + '</pre>');
1486
				}
1485
				}
1487
				var hrefCourriel = 'mailto:cel_remarques@tela-botanica.org?' + 
1486
				var hrefCourriel = 'mailto:cel_remarques@tela-botanica.org?' +
1488
					'subject=Disfonctionnement du widget de saisie ' + TAG_PROJET + 
1487
					'subject=Disfonctionnement du widget de saisie ' + TAG_PROJET +
1489
					'&body=' + erreurMsg + "\nDébogage :\n" + debugMsg + debugNonJson;
1488
					'&body=' + erreurMsg + "\nDébogage :\n" + debugMsg + debugNonJson;
1490
				
1489
 
1491
				// mise en valeur de l'obs en erreur + scroll vers celle ci en changeant le hash
1490
				// mise en valeur de l'obs en erreur + scroll vers celle ci en changeant le hash
1492
				$('#obs'+idObs+' div div').addClass('obs-erreur');
1491
				$('#obs'+idObs+' div div').addClass('obs-erreur');
1493
				window.location.hash = "obs"+idObs;
1492
				window.location.hash = "obs"+idObs;
1494
				
1493
 
1495
				$('#dialogue-obs-transaction-ko .alert-txt').append($('#tpl-transmission-ko').clone()
1494
				$('#dialogue-obs-transaction-ko .alert-txt').append($('#tpl-transmission-ko').clone()
1496
					.find('.courriel-erreur')
1495
					.find('.courriel-erreur')
1497
					.attr('href', hrefCourriel)
1496
					.attr('href', hrefCourriel)
1498
					.end()
1497
					.end()
1499
					.html());
1498
					.html());
1500
				$('#dialogue-obs-transaction-ko').show();
1499
				$('#dialogue-obs-transaction-ko').show();
1501
				$("#chargement").hide();
1500
				$("#chargement").hide();
1502
				initialiserBarreProgression();
1501
				initialiserBarreProgression();
1503
			} else {
1502
			} else {
1504
				if (DEBUG) {
1503
				if (DEBUG) {
1505
					$('#dialogue-obs-transaction-ok .alert-txt').append('<pre class="msg-debug">Débogage : ' + debugMsg + debugNonJson + '</pre>');
1504
					$('#dialogue-obs-transaction-ok .alert-txt').append('<pre class="msg-debug">Débogage : ' + debugMsg + debugNonJson + '</pre>');
1506
				}
1505
				}
1507
				if(obsNbre == 0) {
1506
				if(obsNbre == 0) {
1508
					setTimeout(function() {
1507
					setTimeout(function() {
1509
						$("#chargement").hide();
1508
						$("#chargement").hide();
1510
						$('#dialogue-obs-transaction-ok .alert-txt').append($('#tpl-transmission-ok').clone().html());
1509
						$('#dialogue-obs-transaction-ok .alert-txt').append($('#tpl-transmission-ok').clone().html());
1511
						$("#dialogue-obs-transaction-ok").show();
1510
						$("#dialogue-obs-transaction-ok").show();
1512
						window.location.hash = "dialogue-obs-transaction-ok";
1511
						window.location.hash = "dialogue-obs-transaction-ok";
1513
						initialiserObs();
1512
						initialiserObs();
1514
					}, 1500);
1513
					}, 1500);
1515
					
1514
 
1516
				}
1515
				}
1517
			}
1516
			}
1518
		}
1517
		}
1519
	});
1518
	});
1520
}
1519
}