Subversion Repositories eFlore/Applications.moissonnage

Rev

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

Rev 37 Rev 41
1
var map = null,
1
var map = null,
2
optionsCoucheOSM = {
2
optionsCoucheOSM = {
3
	attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors,'
3
	attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors,'
4
	+ ' <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>',
4
	+ ' <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>',
5
	maxZoom: 18
5
	maxZoom: 18
6
},
6
},
7
optionsCoucheGoogle = {
7
optionsCoucheGoogle = {
8
	attribution: 'Map data &copy;'+new Date().getFullYear()+' <a href="http://maps.google.com">Google</a>',
8
	attribution: 'Map data &copy;'+new Date().getFullYear()+' <a href="http://maps.google.com">Google</a>',
9
	maxZoom: 18
9
	maxZoom: 18
10
},
10
},
11
coucheOSM = new L.TileLayer("http://a.tile.openstreetmap.org/{z}/{x}/{y}.png",
11
coucheOSM = new L.TileLayer("http://a.tile.openstreetmap.org/{z}/{x}/{y}.png",
12
	optionsCoucheOSM),
12
	optionsCoucheOSM),
13
coucheRelief = new L.TileLayer("http://c.tile3.opencyclemap.org/landscape/{z}/{x}/{y}.png",
13
coucheRelief = new L.TileLayer("http://c.tile3.opencyclemap.org/landscape/{z}/{x}/{y}.png",
14
	optionsCoucheOSM),
14
	optionsCoucheOSM),
15
coucheSatellite = new L.TileLayer("http://mt1.google.com/vt/lyrs=y@218131653&hl=fr&src=app&x={x}&y={y}&z={z}",
15
coucheSatellite = new L.TileLayer("http://mt1.google.com/vt/lyrs=y@218131653&hl=fr&src=app&x={x}&y={y}&z={z}",
16
	optionsCoucheGoogle),
16
	optionsCoucheGoogle),
17
optionsCarte = {
17
optionsCarte = {
18
	center : new L.LatLng(46, 2),
18
	center : new L.LatLng(46, 2),
19
	zoom : 6,
19
	zoom : 6,
20
	minZoom : 3,
20
	minZoom : 3,
21
	maxBounds : [[-85.051129, -180], [85.051129, 180]],
21
	maxBounds : [[-85.051129, -180], [85.051129, 180]],
22
	layers : [coucheOSM]
22
	layers : [coucheOSM]
23
},
23
},
24
zoom = 6,
24
zoom = 6,
25
legende = null,
25
legende = null,
26
coucheDepartement = null,
26
coucheDepartement = null,
27
infoBulle = null;
27
infoBulle = null;
28
 
28
 
29
var coucheSites = null,
29
var coucheSites = null,
30
sources = new Object(),
30
sources = new Object(),
31
typeSite = 'maille',
31
typeSite = 'maille',
32
overlays = [];
32
overlays = [];
33
 
33
 
34
var requeteChargementPoints = null,
34
var requeteChargementPoints = null,
35
timer = null,
35
timer = null,
36
ancienneRequete = null,
36
ancienneRequete = null,
37
deplacement = true,
37
deplacement = true,
38
url = '';
38
url = '';
39
 
39
 
40
 
40
 
41
 
41
 
42
 
42
 
43
$(document).ready(function() {
43
$(document).ready(function() {
44
	initialiserWidget();
44
	initialiserWidget();
45
});
45
});
46
 
46
 
47
$(window).resize(function() {
47
$(window).resize(function() {
48
	dimensionnerCarte();
48
	dimensionnerCarte();
49
});
49
});
50
 
50
 
51
function initialiserWidget() {
51
function initialiserWidget() {
52
	initialiserCarte();
52
	initialiserCarte();
53
	chargerLimitesCommunales();
53
	chargerLimitesCommunales();
54
	initialiserPanneauControle();
54
	initialiserPanneauControle();
55
	initialiserSources();
55
	initialiserSources();
56
	initialiserListeners();
56
	initialiserListeners();
57
	chargerLocalisations();
57
	chargerLocalisations();
58
}
58
}
59
 
59
 
60
function initialiserCarte() {
60
function initialiserCarte() {
61
	dimensionnerCarte();
61
	dimensionnerCarte();
62
	map = L.map('map', optionsCarte);
62
	map = L.map('map', optionsCarte);
63
	coucheSatellite.addTo(map);
63
	coucheSatellite.addTo(map);
64
	coucheRelief.addTo(map);
64
	coucheRelief.addTo(map);
65
	coucheOSM.addTo(map);
65
	coucheOSM.addTo(map);
66
	var echelle = new L.Control.Scale({
66
	var echelle = new L.Control.Scale({
67
		maxWidth : 50,
67
		maxWidth : 50,
68
		metric : true,
68
		metric : true,
69
		imperial : false,
69
		imperial : false,
70
		updateWhenIdle : true
70
		updateWhenIdle : true
71
	});
71
	});
72
	map.addControl(echelle);
72
	map.addControl(echelle);
73
	zoom = map.getZoom();
73
	zoom = map.getZoom();
74
}
74
}
75
 
75
 
76
function dimensionnerCarte() {
76
function dimensionnerCarte() {
77
	$('#map').height($(window).height());
77
	$('#map').height($(window).height());
78
	$('#map').width($(window).width());
78
	$('#map').width($(window).width());
79
}
79
}
80
 
80
 
81
function initialiserListeners() {
81
function initialiserListeners() {
82
	map.on('moveend', surChangementVueCarte);
82
	map.on('moveend', surChangementVueCarte);
83
	map.on('zoomend', surChangementVueCarte);
83
	map.on('zoomend', surChangementVueCarte);
84
	map.on('popupclose', function(e) {
84
	map.on('popupclose', function(e) {
85
		masquerInfoBulle();
85
		masquerInfoBulle();
86
		programmerRafraichissementCarte();
86
		programmerRafraichissementCarte();
87
	});
87
	});
88
}
88
}
89
 
89
 
90
function initialiserPanneauControle() {
90
function initialiserPanneauControle() {
91
	var baseMaps = {
91
	var baseMaps = {
92
		"Satellite" : coucheSatellite,
92
		"Satellite" : coucheSatellite,
93
		"Relief" : coucheRelief,
93
		"Relief" : coucheRelief,
94
		"Plan" : coucheOSM
94
		"Plan" : coucheOSM
95
	};
95
	};
96
 
96
 
97
	var overlayMaps = {};
97
	var overlayMaps = {};
98
	for (var index = 0; index < listeSources.length; index ++) {
98
	for (var index = 0; index < listeSources.length; index ++) {
99
		sources[listeSources[index]] = estValeurDansTableau(source, listeSources[index]);
99
		sources[listeSources[index]] = estValeurDansTableau(source, listeSources[index]);
100
		overlayMaps[listeSources[index]] = new L.LayerGroup();
100
		overlayMaps[listeSources[index]] = new L.LayerGroup();
101
	}
101
	}
102
	L.control.layers(baseMaps, overlayMaps).addTo(map);
102
	L.control.layers(baseMaps, overlayMaps).addTo(map);
103
	coucheOSM.bringToFront();
103
	coucheOSM.bringToFront();
104
	map.removeLayer(coucheRelief);
104
	map.removeLayer(coucheRelief);
105
	map.removeLayer(coucheOSM);
105
	map.removeLayer(coucheOSM);
106
	
106
	
107
	// garder par defaut la couche plan google comme selectionnee dans le panel
107
	// garder par defaut la couche plan google comme selectionnee dans le panel
108
	var selecteursFonds = $('.leaflet-control-layers-base .leaflet-control-layers-selector');
108
	var selecteursFonds = $('.leaflet-control-layers-base .leaflet-control-layers-selector');
109
	selecteursFonds[0].checked = true;
109
	selecteursFonds[0].checked = true;
110
	selecteursFonds[1].checked = false;
110
	selecteursFonds[1].checked = false;
111
	selecteursFonds[2].checked = false;
111
	selecteursFonds[2].checked = false;
112
}
112
}
113
 
113
 
114
function chargerLimitesCommunales() {
114
function chargerLimitesCommunales() {
115
	coucheDepartement = new L.KML(null, {async : true}).addTo(map);
115
	coucheDepartement = new L.KML(null, {async : true}).addTo(map);
116
	if (urlsLimitesCommunales != null) {
116
	if (urlsLimitesCommunales != null) {
117
		coucheDepartement.addKMLFiles(urlsLimitesCommunales);
117
		coucheDepartement.addKMLFiles(urlsLimitesCommunales);
118
	}
118
	}
119
}
119
}
120
 
120
 
121
function initialiserSources() {
121
function initialiserSources() {
122
	overlays = $('.leaflet-control-layers-overlays .leaflet-control-layers-selector');
122
	overlays = $('.leaflet-control-layers-overlays .leaflet-control-layers-selector');
123
	$.each(overlays, function (index, input) {
123
	$.each(overlays, function (index, input) {
124
		input.value = listeSources[index];
124
		input.value = listeSources[index];
125
		input.id = 'overlay' + (index+1);
125
		input.id = 'overlay' + (index+1);
126
		var lien = '<a href="' + liensVersSources[index] + '" target="_blank">' + nomListeSources[index] + '</a>';
126
		var lien = '<a href="' + liensVersSources[index] + '" target="_blank">' + nomListeSources[index] + '</a>';
127
		$('#overlay' + (index+1) + ' ~ span').html(lien);
127
		$('#overlay' + (index+1) + ' ~ span').html(lien);
128
		input.checked = sources[listeSources[index]];
128
		input.checked = sources[listeSources[index]];
129
		input.onclick = function(event) {
129
		input.onclick = function(event) {
130
			changerSource(event.target.value);
130
			changerSource(event.target.value);
131
		}
131
		}
132
	});
132
	});
133
}
133
}
134
 
134
 
135
function changerSource(projetClique) {
135
function changerSource(projetClique) {
136
	var indexProjetClique;
136
	var indexProjetClique;
137
	for (var index = 0; index < overlays.length; index ++) {
137
	for (var index = 0; index < overlays.length; index ++) {
138
		if (overlays[index].value == projetClique) {
138
		if (overlays[index].value == projetClique) {
139
			indexProjetClique = index;
139
			indexProjetClique = index;
140
		}
140
		}
141
	}
141
	}
142
	masquerInfoBulle();
142
	masquerInfoBulle();
143
	sources[projetClique] = overlays[indexProjetClique].checked;
143
	sources[projetClique] = overlays[indexProjetClique].checked;
144
	if (sources[projetClique] == true) {
144
	if (sources[projetClique] == true) {
145
		programmerRafraichissementCarte(projetClique);
145
		programmerRafraichissementCarte(projetClique);
146
	} else {
146
	} else {
147
		if (requeteEnCours()) {
147
		if (requeteEnCours()) {
148
			stopperRequeteAjax();
148
			stopperRequeteAjax();
149
		}
149
		}
150
		supprimerFeaturesSource(projetClique);
150
		supprimerFeaturesSource(projetClique);
151
	}
151
	}
152
}
152
}
153
 
153
 
154
function supprimerFeaturesSource(source) {
154
function supprimerFeaturesSource(source) {
155
	if (coucheSites != null) {
155
	if (coucheSites != null) {
156
		coucheSites.eachLayer(function(layer) {
156
		coucheSites.eachLayer(function(layer) {
157
			if (layer.typeSite == 'maille') {
157
			if (layer.typeSite == 'maille') {
158
				retirerStationsEtObservations(layer, source);
158
				retirerStationsEtObservations(layer, source);
159
			} else {
159
			} else {
160
				layer.supprimerSource(source, coucheSites);
160
				layer.supprimerSource(source, coucheSites);
161
				if (layer._map == 'null') {
161
				if (layer._map == 'null') {
162
					couheSites.removeLayer(layer);
162
					couheSites.removeLayer(layer);
163
				}
163
				}
164
			}
164
			}
165
		});
165
		});
166
		if (typeSite == 'maille') {
166
		if (typeSite == 'maille') {
167
			var nombreMailles = calculerNombreMaillesVisibles();
167
			var nombreMailles = calculerNombreMaillesVisibles();
168
			if (nombreMailles == 0) {
168
			if (nombreMailles == 0) {
169
				coucheSites.clearLayers();
169
				coucheSites.clearLayers();
170
				masquerLegende();
170
				masquerLegende();
171
				typeSite = 'point';
171
				typeSite = 'point';
172
			}
172
			}
173
		}
173
		}
174
	}
174
	}
175
}
175
}
176
 
176
 
177
function retirerStationsEtObservations(maille, sourceRetrait) {
177
function retirerStationsEtObservations(maille, sourceRetrait) {
178
	var sources = maille.properties.source;
178
	var sources = maille.properties.source;
179
	var nombreStations = 0;
179
	var nombreStations = 0;
180
	for (var index = 0; index < sources.length; index ++) {
180
	for (var index = 0; index < sources.length; index ++) {
181
		var source = sources[index];
181
		var source = sources[index];
182
		if (source == sourceRetrait) {
182
		if (source == sourceRetrait) {
183
			delete maille.properties.stations[source];
183
			delete maille.properties.stations[source];
184
			delete maille.properties.observations[source];
184
			delete maille.properties.observations[source];
185
		} else if (typeof(maille.properties.stations[source]) != 'undefined') {
185
		} else if (typeof(maille.properties.stations[source]) != 'undefined') {
186
			nombreStations += parseInt(maille.properties.stations[source]);
186
			nombreStations += parseInt(maille.properties.stations[source]);
187
		}
187
		}
188
	}
188
	}
189
	if (nombreStations == 0) {
189
	if (nombreStations == 0) {
190
		coucheSites.removeLayer(maille);
190
		coucheSites.removeLayer(maille);
191
	} else {
191
	} else {
192
		colorerMaille(maille)
192
		colorerMaille(maille)
193
		genererInfobulle(maille);		
193
		genererInfobulle(maille);		
194
	}
194
	}
195
}
195
}
196
 
196
 
197
function calculerNombreMaillesVisibles() {
197
function calculerNombreMaillesVisibles() {
198
	var nombreMailles = 0;
198
	var nombreMailles = 0;
199
	coucheSites.eachLayer(function(layer) {
199
	coucheSites.eachLayer(function(layer) {
200
		if($(layer._path).attr('fill-opacity') != '0') {
200
		if($(layer._path).attr('fill-opacity') != '0') {
201
			nombreMailles ++;
201
			nombreMailles ++;
202
		}
202
		}
203
	});
203
	});
204
	return nombreMailles;
204
	return nombreMailles;
205
}
205
}
206
 
206
 
207
function estValeurDansTableau(tableau, valeur) {
207
function estValeurDansTableau(tableau, valeur) {
208
	var index;
208
	var index;
209
	for (index = 0; index < tableau.length && tableau[index] != valeur; index ++);
209
	for (index = 0; index < tableau.length && tableau[index] != valeur; index ++);
210
	return (tableau.length > 0 && index != tableau.length);
210
	return (tableau.length > 0 && index != tableau.length);
211
}
211
}
212
 
212
 
213
//************************************
213
//************************************
214
// requetes stations
214
// requetes stations
215
 
215
 
216
function surChangementVueCarte() {
216
function surChangementVueCarte() {
217
	programmerRafraichissementCarte();
217
	programmerRafraichissementCarte();
218
}
218
}
219
 
219
 
220
function programmerRafraichissementCarte(source) {
220
function programmerRafraichissementCarte(source) {
221
	$('#tooltip').css('display', 'none');
221
	$('#tooltip').css('display', 'none');
222
	source = (source == null || source == 'null') ? null : source;
222
	source = (source == null || source == 'null') ? null : source;
223
	if (timer != null) {
223
	if (timer != null) {
224
		window.clearTimeout(timer);
224
		window.clearTimeout(timer);
225
	}
225
	}
226
	if (requeteChargementPoints != null) {
226
	if (requeteChargementPoints != null) {
227
		stopperRequeteAjax();
227
		stopperRequeteAjax();
228
	}
228
	}
229
	var nombreSourcesVisibles = 0;
229
	var nombreSourcesVisibles = 0;
230
	for (var index = 0; index < overlays.length; index ++) {
230
	for (var index = 0; index < overlays.length; index ++) {
231
		if (overlays[index].checked) {
231
		if (overlays[index].checked) {
232
			nombreSourcesVisibles ++;
232
			nombreSourcesVisibles ++;
233
		}
233
		}
234
	}
234
	}
235
	if (source == null) {
235
	if (source == null) {
236
		timer = window.setTimeout("chargerLocalisations()", 100);
236
		timer = window.setTimeout("chargerLocalisations()", 100);
237
	} else {
237
	} else {
238
		timer = window.setTimeout("chargerSource('"+source+"')", 100);
238
		timer = window.setTimeout("chargerSource('"+source+"')", 100);
239
	}
239
	}
240
}
240
}
241
 
241
 
242
function stopperRequeteAjax() {
242
function stopperRequeteAjax() {
243
	requeteChargementPoints.abort();
243
	requeteChargementPoints.abort();
244
	requeteChargementPoints = null;
244
	requeteChargementPoints = null;
245
}
245
}
246
 
246
 
247
function chargerLocalisations() {
247
function chargerLocalisations() {
248
	if (requeteEnCours()) {
248
	if (requeteEnCours()) {
249
		requeteChargementPoints.abort();
249
		requeteChargementPoints.abort();
250
	}
250
	}
251
	afficherMessageChargement('stations');
251
	afficherMessageChargement('stations');
252
	if (!(ancienneRequete != null && ancienneRequete[1] == map.getZoom()
252
	if (!(ancienneRequete != null && ancienneRequete[1] == map.getZoom()
253
		&& map.getBounds().intersects(ancienneRequete[0]))) {	
253
		&& map.getBounds().intersects(ancienneRequete[0]))) {	
254
		supprimerFeatures();
254
		supprimerFeatures();
255
		deplacement = false;
255
		deplacement = false;
256
	}
256
	}
257
	var bboxRequete = calculerBboxRequete();
257
	var bboxRequete = calculerBboxRequete();
258
	var parametres = {
258
	var parametres = {
259
		"bbox" : bboxRequete,
259
		"bbox" : bboxRequete,
260
		"zoom" : map.getZoom(),
260
		"zoom" : map.getZoom(),
261
		"source" : recupererSourcesActivees(),
261
		"source" : recupererSourcesActivees(),
262
		"num_taxon" : numTaxon,
262
		"num_taxon" : numTaxon,
263
		"nn" : nn,
263
		"nn" : nn,
264
		"referentiel" : referentiel,
264
		"referentiel" : referentiel,
265
		"dept" : dept,
265
		"dept" : dept,
266
		"auteur" : auteur,
266
		"auteur" : auteur,
267
		"date_debut" : dateDebut,
267
		"date_debut" : dateDebut,
268
		"date_fin" : dateFin,
268
		"date_fin" : dateFin,
269
		"nb_jours" : nbJours
269
		"nb_jours" : nbJours
270
	};
270
	};
271
	if (deplacement == true) {
271
	if (deplacement == true) {
272
		parametres.format = typeSite;
272
		parametres.format = typeSite;
273
	}
273
	}
274
	ancienneRequete = [map.getBounds(), map.getZoom()];
274
	ancienneRequete = [map.getBounds(), map.getZoom()];
275
	url = urlBase + "stations?" + convertirEnParametresUrl(parametres);
275
	url = urlBase + "stations?" + convertirEnParametresUrl(parametres);
276
	fonctionCallback = traiterDonneesStations;
276
	fonctionCallback = traiterDonneesStations;
277
	executerAJAX();
277
	executerAJAX();
278
}
278
}
279
 
279
 
280
function supprimerFeatures() {
280
function supprimerFeatures() {
281
	if (coucheSites != null) {
281
	if (coucheSites != null) {
282
		coucheSites.clearLayers();
282
		coucheSites.clearLayers();
283
		coucheSites = null;
283
		coucheSites = null;
284
	}
284
	}
285
}
285
}
286
 
286
 
287
function recupererSourcesActivees(sourceAIgnorer) {
287
function recupererSourcesActivees(sourceAIgnorer) {
288
	sourceAIgnorer = typeof(sourceAIgnorer) == 'undefined' ? '' : sourceAIgnorer;
288
	sourceAIgnorer = typeof(sourceAIgnorer) == 'undefined' ? '' : sourceAIgnorer;
289
	var sourcesActivees = [];
289
	var sourcesActivees = [];
290
	for (var index = 0; index < overlays.length; index ++) {
290
	for (var index = 0; index < overlays.length; index ++) {
291
		if (overlays[index].checked == true && overlays[index].value != sourceAIgnorer) {
291
		if (overlays[index].checked == true && overlays[index].value != sourceAIgnorer) {
292
			sourcesActivees.push(overlays[index].value);
292
			sourcesActivees.push(overlays[index].value);
293
		}
293
		}
294
	}
294
	}
295
	return sourcesActivees.join(',');
295
	return sourcesActivees.join(',');
296
}
296
}
297
 
297
 
298
function chargerSource(sourceAjout) {
298
function chargerSource(sourceAjout) {
299
	if (requeteEnCours()) {
299
	if (requeteEnCours()) {
300
		requeteChargementPoints.abort();
300
		requeteChargementPoints.abort();
301
	}
301
	}
302
	afficherMessageChargement('stations');
302
	afficherMessageChargement('stations');
303
	var bboxRequete = determinerCoordonneesBordure();
303
	var bboxRequete = determinerCoordonneesBordure();
304
	var parametres = {
304
	var parametres = {
305
		"bbox" : bboxRequete,
305
		"bbox" : bboxRequete,
306
		"zoom" : map.getZoom(),
306
		"zoom" : map.getZoom(),
307
		"format" : typeSite,
307
		"format" : typeSite,
308
		"source" : sourceAjout,
308
		"source" : sourceAjout,
309
		"num_taxon" : numTaxon,
309
		"num_taxon" : numTaxon,
310
		"nn" : nn,
310
		"nn" : nn,
311
		"referentiel" : referentiel,
311
		"referentiel" : referentiel,
312
		"dept" : dept,
312
		"dept" : dept,
313
		"auteur" : auteur,
313
		"auteur" : auteur,
314
		"date_debut" : dateDebut,
314
		"date_debut" : dateDebut,
315
		"date_fin" : dateFin,
315
		"date_fin" : dateFin,
316
		"nb_jours" : nbJours
316
		"nb_jours" : nbJours
317
	};
317
	};
318
	ancienneRequete = [map.getBounds(), map.getZoom()];
318
	ancienneRequete = [map.getBounds(), map.getZoom()];
319
	url = urlBase + "stations?" + convertirEnParametresUrl(parametres);
319
	url = urlBase + "stations?" + convertirEnParametresUrl(parametres);
320
	fonctionCallback = traiterRetourChargementSource;
320
	fonctionCallback = traiterRetourChargementSource;
321
	executerAJAX();
321
	executerAJAX();
322
}
322
}
323
 
323
 
324
function calculerBboxRequete() {
324
function calculerBboxRequete() {
325
	var bordure = map.getBounds();
325
	var bordure = map.getBounds();
326
	var bboxRequete = "";
326
	var bboxRequete = "";
327
	if (ancienneRequete != null && ancienneRequete[1] == map.getZoom()
327
	if (ancienneRequete != null && ancienneRequete[1] == map.getZoom()
328
		&& bordure.intersects(ancienneRequete[0])) {
328
		&& bordure.intersects(ancienneRequete[0])) {
329
		bboxRequete = calculerIntersectionRectangle(ancienneRequete[0], bordure);
329
		bboxRequete = calculerIntersectionRectangle(ancienneRequete[0], bordure);
330
	} else {
330
	} else {
331
		bboxRequete = determinerCoordonneesBordure();
331
		bboxRequete = determinerCoordonneesBordure();
332
	}
332
	}
333
	return bboxRequete;
333
	return bboxRequete;
334
}
334
}
335
 
335
 
336
function calculerIntersectionRectangle(rectangle1, rectangle2) {
336
function calculerIntersectionRectangle(rectangle1, rectangle2) {
337
	var bbox1 = [rectangle2.getSouthWest().lng.toFixed(6), rectangle2.getSouthWest().lat.toFixed(6),
337
	var bbox1 = [rectangle2.getSouthWest().lng.toFixed(6), rectangle2.getSouthWest().lat.toFixed(6),
338
	    rectangle2.getNorthEast().lng.toFixed(6), rectangle2.getNorthEast().lat.toFixed(6)];
338
	    rectangle2.getNorthEast().lng.toFixed(6), rectangle2.getNorthEast().lat.toFixed(6)];
339
	var bbox2 = [rectangle2.getSouthWest().lng.toFixed(6), rectangle2.getSouthWest().lat.toFixed(6),
339
	var bbox2 = [rectangle2.getSouthWest().lng.toFixed(6), rectangle2.getSouthWest().lat.toFixed(6),
340
	    rectangle2.getNorthEast().lng.toFixed(6), rectangle2.getNorthEast().lat.toFixed(6)];
340
	    rectangle2.getNorthEast().lng.toFixed(6), rectangle2.getNorthEast().lat.toFixed(6)];
341
	
341
	
342
	if (rectangle2.getSouthWest().lng >= rectangle1.getSouthWest().lng
342
	if (rectangle2.getSouthWest().lng >= rectangle1.getSouthWest().lng
343
	 	&& rectangle2.getSouthWest().lng <= rectangle1.getNorthEast().lng) {
343
	 	&& rectangle2.getSouthWest().lng <= rectangle1.getNorthEast().lng) {
344
		bbox2[0] = bbox1[2] = rectangle1.getNorthEast().lng.toFixed(6);
344
		bbox2[0] = bbox1[2] = rectangle1.getNorthEast().lng.toFixed(6);
345
		if (rectangle2.getSouthWest().lat >= rectangle1.getSouthWest().lat
345
		if (rectangle2.getSouthWest().lat >= rectangle1.getSouthWest().lat
346
			&& rectangle2.getSouthWest().lat <= rectangle1.getNorthEast().lat) {
346
			&& rectangle2.getSouthWest().lat <= rectangle1.getNorthEast().lat) {
347
			bbox1[1] = rectangle1.getNorthEast().lat.toFixed(6);
347
			bbox1[1] = rectangle1.getNorthEast().lat.toFixed(6);
348
		} else {
348
		} else {
349
			bbox1[3] = rectangle1.getSouthWest().lat.toFixed(6);
349
			bbox1[3] = rectangle1.getSouthWest().lat.toFixed(6);
350
		}
350
		}
351
	} else {
351
	} else {
352
		bbox2[0] = bbox1[2] = rectangle1.getSouthWest().lng.toFixed(6);
352
		bbox2[0] = bbox1[2] = rectangle1.getSouthWest().lng.toFixed(6);
353
		if (rectangle2.getSouthWest().lat >= rectangle1.getSouthWest().lat
353
		if (rectangle2.getSouthWest().lat >= rectangle1.getSouthWest().lat
354
			&& rectangle2.getSouthWest().lat <= rectangle1.getNorthEast().lat) {
354
			&& rectangle2.getSouthWest().lat <= rectangle1.getNorthEast().lat) {
355
			bbox2[1] = rectangle1.getNorthEast().lat.toFixed(6);
355
			bbox2[1] = rectangle1.getNorthEast().lat.toFixed(6);
356
		} else {
356
		} else {
357
			bbox2[3] = rectangle1.getSouthWest().lat.toFixed(6);
357
			bbox2[3] = rectangle1.getSouthWest().lat.toFixed(6);
358
		}
358
		}
359
	}
359
	}
360
	return bbox1.join(',')+'|'+bbox2.join(',');
360
	return bbox1.join(',')+'|'+bbox2.join(',');
361
}
361
}
362
 
362
 
363
function determinerCoordonneesBordure() {
363
function determinerCoordonneesBordure() {
364
	var ouest = map.getBounds().getSouthWest().lng.toFixed(6),
364
	var ouest = map.getBounds().getSouthWest().lng.toFixed(6),
365
		sud = Math.max(map.getBounds().getSouthWest().lat, -85.051129).toFixed(6),
365
		sud = Math.max(map.getBounds().getSouthWest().lat, -85.051129).toFixed(6),
366
		est = map.getBounds().getNorthEast().lng.toFixed(6),
366
		est = map.getBounds().getNorthEast().lng.toFixed(6),
367
		nord = Math.min(map.getBounds().getNorthEast().lat, 85.051129).toFixed(6);
367
		nord = Math.min(map.getBounds().getNorthEast().lat, 85.051129).toFixed(6);
368
	// appliquer les limites possibles de la projection actuellement utilisee aux coordonnees
368
	// appliquer les limites possibles de la projection actuellement utilisee aux coordonnees
369
	// longitudes ouest et est de la bbox (permettra d'eviter de renvoyer des messages d'erreur)
369
	// longitudes ouest et est de la bbox (permettra d'eviter de renvoyer des messages d'erreur)
370
	if (ouest < -180) {
370
	if (ouest < -180) {
371
		ouest += 360;
371
		ouest += 360;
372
	} else if (ouest > 180) {
372
	} else if (ouest > 180) {
373
		ouest -= 360;
373
		ouest -= 360;
374
	}
374
	}
375
	if (est < -180) {
375
	if (est < -180) {
376
		est += 360;
376
		est += 360;
377
	} else if (est > 180) {
377
	} else if (est > 180) {
378
		est -= 360;
378
		est -= 360;
379
	}
379
	}
380
	return [ouest, sud, est, nord].join(',');
380
	return [ouest, sud, est, nord].join(',');
381
}
381
}
382
 
382
 
383
function afficherMessageChargement(element) {
383
function afficherMessageChargement(element) {
384
	if ($("#zone-chargement").css('display') == 'none') {
384
	if ($("#zone-chargement").css('display') == 'none') {
385
		var divTmplElement = 'tpl-chargement-' + element;
385
		var divTmplElement = 'tpl-chargement-' + element;
386
		$("#zone-chargement").append($("#" + divTmplElement).text());
386
		$("#zone-chargement").append($("#" + divTmplElement).text());
387
		$("#zone-chargement").css('display', 'block');
387
		$("#zone-chargement").css('display', 'block');
388
	}
388
	}
389
}
389
}
390
 
390
 
391
function masquerMessageChargement() {
391
function masquerMessageChargement() {
392
	$("#zone-chargement").css('display', 'none');
392
	$("#zone-chargement").css('display', 'none');
393
	$("#zone-chargement").children().remove();
393
	$("#zone-chargement").children().remove();
394
}
394
}
395
 
395
 
396
function executerAJAX() {
396
function executerAJAX() {
397
	if (requeteEnCours()) {
397
	if (requeteEnCours()) {
398
		requeteChargementPoints.abort();
398
		requeteChargementPoints.abort();
399
	}
399
	}
400
	requeteChargementPoints = $.getJSON(url).complete(function() {
400
	requeteChargementPoints = $.getJSON(url).complete(function() {
401
		fonctionCallback();
401
		fonctionCallback();
402
	});
402
	});
403
}
403
}
404
 
404
 
405
function requeteEnCours() {
405
function requeteEnCours() {
406
	return (requeteChargementPoints != null && requeteChargementPoints.readyState != 4);
406
	return (requeteChargementPoints != null && requeteChargementPoints.readyState != 4);
407
}
407
}
408
 
408
 
409
function estStatutRequeteOK() {
409
function estStatutRequeteOK() {
410
	return ((requeteChargementPoints.status == 200 || requeteChargementPoints.status == 304)
410
	return ((requeteChargementPoints.status == 200 || requeteChargementPoints.status == 304)
411
		|| requeteChargementPoints.status == 0);
411
		|| requeteChargementPoints.status == 0);
412
}
412
}
413
 
413
 
414
function convertirEnParametresUrl(objet) {
414
function convertirEnParametresUrl(objet) {
415
	var parametresUrl = '';
415
	var parametresUrl = '';
416
	for (attribut in objet) {
416
	for (attribut in objet) {
417
		if (typeof(objet[attribut]) == 'function' || typeof(objet[attribut]) == 'undefined' ||
417
		if (typeof(objet[attribut]) == 'function' || typeof(objet[attribut]) == 'undefined' ||
418
			objet[attribut] == null || objet[attribut] == '*' || objet[attribut] == 0)
418
			objet[attribut] == null || objet[attribut] == '*' || objet[attribut] == 0)
419
			continue;
419
			continue;
420
		parametresUrl += (parametresUrl == '' ? '' : '&') + attribut + "=" + objet[attribut];
420
		parametresUrl += (parametresUrl == '' ? '' : '&') + attribut + "=" + objet[attribut];
421
	}
421
	}
422
	return parametresUrl;
422
	return parametresUrl;
423
};
423
};
424
 
424
 
425
function traiterDonneesStations() {
425
function traiterDonneesStations() {
426
	masquerMessageChargement();
426
	masquerMessageChargement();
427
	masquerLegende();
427
	masquerLegende();
428
	if (deplacement == true) {
428
	if (deplacement == true) {
429
		supprimerFeaturesHorsBbox();
429
		supprimerFeaturesHorsBbox();
430
	}
430
	}
431
	deplacement = true;
431
	deplacement = true;
432
	var texte = requeteChargementPoints.responseText;
432
	var texte = requeteChargementPoints.responseText;
433
	if (!estStatutRequeteOK()) {
433
	if (!estStatutRequeteOK()) {
434
		alert(texte);
434
		alert(texte);
435
	} else {
435
	} else {
436
		var donneesJSON = eval("(function(){return " + texte + ";})()");
436
		var donneesJSON = eval("(function(){return " + texte + ";})()");
437
		if (donneesJSON != null && donneesJSON.features.length > 0) {
437
		if (donneesJSON != null && donneesJSON.features.length > 0) {
438
			ajouterStationsSurCarte(donneesJSON);
438
			ajouterStationsSurCarte(donneesJSON);
439
		}
439
		}
440
	}
440
	}
441
}
441
}
442
 
442
 
443
function traiterRetourChargementSource() {
443
function traiterRetourChargementSource() {
444
	masquerMessageChargement();
444
	masquerMessageChargement();
445
	var texte = requeteChargementPoints.responseText;
445
	var texte = requeteChargementPoints.responseText;
446
	if (!estStatutRequeteOK()) {
446
	if (!estStatutRequeteOK()) {
447
		alert(texte);
447
		alert(texte);
448
	} else {
448
	} else {
449
		var donneesJSON = eval("(function(){return " + texte + ";})()");
449
		var donneesJSON = eval("(function(){return " + texte + ";})()");
450
		if (donneesJSON != null && donneesJSON.features.length > 0) {
450
		if (donneesJSON != null && donneesJSON.features.length > 0) {
451
			var formatRetourDifferent = donneesJSON.stats.formeDonnees != typeSite;
451
			var formatRetourDifferent = donneesJSON.stats.formeDonnees != typeSite;
452
			ajouterStationsSurCarte(donneesJSON);
452
			ajouterStationsSurCarte(donneesJSON);
453
			if (formatRetourDifferent) {
453
			if (formatRetourDifferent) {
454
				var sourceAIgnorer = donneesJSON.stats.source[0];
454
				var sourceAIgnorer = donneesJSON.stats.source[0];
455
				var sourcesARecharger = recupererSourcesActivees(sourceAIgnorer);
455
				var sourcesARecharger = recupererSourcesActivees(sourceAIgnorer);
-
 
456
				if (sourcesARecharger.length > 0) {
456
				rechargerSources(sourcesARecharger);
457
					rechargerSources(sourcesARecharger);
-
 
458
				}
457
			}
459
			}
458
		}
460
		}
459
	}
461
	}
460
}
462
}
461
 
463
 
462
function supprimerFeaturesHorsBbox() {
464
function supprimerFeaturesHorsBbox() {
463
	var bordure = map.getBounds();
465
	var bordure = map.getBounds();
464
	var layersRestants = 0;
466
	var layersRestants = 0;
465
	if (coucheSites != null) {
467
	if (coucheSites != null) {
466
		coucheSites.eachLayer(function(layer) {
468
		coucheSites.eachLayer(function(layer) {
467
			if (typeof(layer._latlng) != 'undefined') {
469
			if (typeof(layer._latlng) != 'undefined') {
468
				if (bordure.contains(layer.getLatLng())) {
470
				if (bordure.contains(layer.getLatLng())) {
469
					layersRestants ++;
471
					layersRestants ++;
470
				} else {
472
				} else {
471
					coucheSites.supprimerPoint(layer);
473
					coucheSites.supprimerPoint(layer);
472
				}
474
				}
473
			} else {
475
			} else {
474
				if (bordure.intersects(layer.getBounds())) {
476
				if (bordure.intersects(layer.getBounds())) {
475
					layersRestants ++;
477
					layersRestants ++;
476
				} else {
478
				} else {
477
					coucheSites.removeLayer(layer);
479
					coucheSites.removeLayer(layer);
478
				}
480
				}
479
			}
481
			}
480
		});
482
		});
481
	}
483
	}
482
	if (layersRestants == 0) {
484
	if (layersRestants == 0) {
483
		coucheSites = null;
485
		coucheSites = null;
484
	}
486
	}
485
}
487
}
486
 
488
 
487
function rechargerSources(sourcesARecharger) {
489
function rechargerSources(sourcesARecharger) {
488
	var listeSourcesASupprimer = sourcesARecharger.split(',');
490
	var listeSourcesASupprimer = sourcesARecharger.split(',');
489
	for (var index = 0; index < listeSourcesASupprimer.length; index ++) {
491
	for (var index = 0; index < listeSourcesASupprimer.length; index ++) {
490
		supprimerFeaturesSource(listeSourcesASupprimer[index]);
492
		supprimerFeaturesSource(listeSourcesASupprimer[index]);
491
	}
493
	}
492
	chargerSource(sourcesARecharger);
494
	chargerSource(sourcesARecharger);
493
}
495
}
494
 
496
 
495
function ajouterStationsSurCarte(donnees) {
497
function ajouterStationsSurCarte(donnees) {
496
	typeSite = donnees.stats.formeDonnees;
498
	typeSite = donnees.stats.formeDonnees;
497
	if (coucheSites == null) {
499
	if (coucheSites == null) {
498
		coucheSites = (typeSite == 'maille') ? new L.FeatureGroup() : new L.ClusterGroup();
500
		coucheSites = (typeSite == 'maille') ? new L.FeatureGroup() : new L.ClusterGroup();
499
		map.addLayer(coucheSites);
501
		map.addLayer(coucheSites);
500
	}
502
	}
501
	for (var index = 0; index < donnees.features.length; index ++) {
503
	for (var index = 0; index < donnees.features.length; index ++) {
502
		var feature = donnees.features[index];
504
		var feature = donnees.features[index];
503
		if (typeSite == 'maille') {
505
		if (typeSite == 'maille') {
504
			traiterMaille(feature);
506
			traiterMaille(feature);
505
		} else {
507
		} else {
506
			ajouterPoint(feature);
508
			ajouterPoint(feature);
507
		}
509
		}
508
	}
510
	}
509
	if (donnees.features.length > 0) {
511
	if (donnees.features.length > 0) {
510
		afficherLegende();
512
		afficherLegende();
511
	}
513
	}
512
	if (typeSite == 'maille') {
514
	if (typeSite == 'maille') {
513
		genererInfobulleMailles();
515
		genererInfobulleMailles();
514
	} else {
516
	} else {
515
		coucheSites.afficherClusters();
517
		coucheSites.afficherClusters();
516
	}
518
	}
517
}
519
}
518
 
520
 
519
// =========================================
521
// =========================================
520
// Gestion des mailles
522
// Gestion des mailles
521
 
523
 
522
function traiterMaille(feature) {
524
function traiterMaille(feature) {
523
	var coordonnees = [];
525
	var coordonnees = [];
524
	for (var i = 0; i < feature.geometry.coordinates.length; i++) {
526
	for (var i = 0; i < feature.geometry.coordinates.length; i++) {
525
		var sommet = new L.LatLng(feature.geometry.coordinates[i][0], feature.geometry.coordinates[i][1]);
527
		var sommet = new L.LatLng(feature.geometry.coordinates[i][0], feature.geometry.coordinates[i][1]);
526
		coordonnees.push(sommet);
528
		coordonnees.push(sommet);
527
	}
529
	}
528
	var maille = rechercherMailleExistante(coordonnees);
530
	var maille = rechercherMailleExistante(coordonnees);
529
	if (maille) {
531
	if (maille) {
530
		mettreAJourMaille(maille, feature);
532
		mettreAJourMaille(maille, feature);
531
	} else {
533
	} else {
532
		maille = ajouterMaille(feature, coordonnees);
534
		maille = ajouterMaille(feature, coordonnees);
533
	}
535
	}
534
	colorerMaille(maille);
536
	colorerMaille(maille);
535
}
537
}
536
 
538
 
537
function rechercherMailleExistante(coordonnees) {
539
function rechercherMailleExistante(coordonnees) {
538
	var mailleTrouvee = null;
540
	var mailleTrouvee = null;
539
	coucheSites.eachLayer(function(layer) {
541
	coucheSites.eachLayer(function(layer) {
540
		if ('typeSite' in layer && layer.typeSite == 'maille') {
542
		if ('typeSite' in layer && layer.typeSite == 'maille') {
541
			if (sontMaillesIdentiques(coordonnees, layer._latlngs)) {
543
			if (sontMaillesIdentiques(coordonnees, layer._latlngs)) {
542
				mailleTrouvee = layer;
544
				mailleTrouvee = layer;
543
				return;
545
				return;
544
			}
546
			}
545
		}
547
		}
546
	});
548
	});
547
	return mailleTrouvee;
549
	return mailleTrouvee;
548
}
550
}
549
 
551
 
550
function sontMaillesIdentiques(coordonnees1, coordonnees2) {
552
function sontMaillesIdentiques(coordonnees1, coordonnees2) {
551
	return (
553
	return (
552
		coordonnees1[0].lat == coordonnees2[0].lat &&
554
		coordonnees1[0].lat == coordonnees2[0].lat &&
553
		coordonnees1[0].lng == coordonnees2[0].lng &&
555
		coordonnees1[0].lng == coordonnees2[0].lng &&
554
		coordonnees1[2].lat == coordonnees2[2].lat &&
556
		coordonnees1[2].lat == coordonnees2[2].lat &&
555
		coordonnees1[2].lng == coordonnees2[2].lng
557
		coordonnees1[2].lng == coordonnees2[2].lng
556
	);
558
	);
557
}
559
}
558
 
560
 
559
function ajouterMaille(feature, coordonnees) {
561
function ajouterMaille(feature, coordonnees) {
560
	var maille = new L.Polygon(coordonnees);
562
	var maille = new L.Polygon(coordonnees);
561
	var optionsMaille = {
563
	var optionsMaille = {
562
		color: '#FFFFFF',
564
		color: '#FFFFFF',
563
		opacity : 0.7,
565
		opacity : 0.7,
564
		weight: 1,
566
		weight: 1,
565
		fillOpacity : 0.6
567
		fillOpacity : 0.6
566
	};
568
	};
567
	maille.setStyle(optionsMaille);
569
	maille.setStyle(optionsMaille);
568
	maille.typeSite = 'maille';
570
	maille.typeSite = 'maille';
569
	maille.properties = feature.properties;
571
	maille.properties = feature.properties;
570
	coucheSites.addLayer(maille);
572
	coucheSites.addLayer(maille);
571
	return maille;
573
	return maille;
572
}
574
}
573
 
575
 
574
function mettreAJourMaille(maille, feature) {
576
function mettreAJourMaille(maille, feature) {
575
	var sources = feature.properties.source;
577
	var sources = feature.properties.source;
576
	for (var index = 0; index < sources.length; index ++) {
578
	for (var index = 0; index < sources.length; index ++) {
577
		var source = sources[index];
579
		var source = sources[index];
578
		maille.properties.stations[source] = parseInt(feature.properties.stations[source]);
580
		maille.properties.stations[source] = parseInt(feature.properties.stations[source]);
579
		maille.properties.observations[source] = parseInt(feature.properties.observations[source]);
581
		maille.properties.observations[source] = parseInt(feature.properties.observations[source]);
580
		maille.properties.source.push(source);
582
		maille.properties.source.push(source);
581
	}
583
	}
582
}
584
}
583
 
585
 
584
function colorerMaille(maille) {
586
function colorerMaille(maille) {
585
	var nombreStations = 0;
587
	var nombreStations = 0;
586
	var sources = maille.properties.source;
588
	var sources = maille.properties.source;
587
	for (var index = 0; index < sources.length; index ++) {
589
	for (var index = 0; index < sources.length; index ++) {
588
		var source = sources[index];
590
		var source = sources[index];
589
		if (typeof(maille.properties.stations[source]) != 'undefined') {
591
		if (typeof(maille.properties.stations[source]) != 'undefined') {
590
			nombreStations += parseInt(maille.properties.stations[source]);
592
			nombreStations += parseInt(maille.properties.stations[source]);
591
		}
593
		}
592
	}
594
	}
593
	if (nombreStations > 0) {
595
	if (nombreStations > 0) {
594
		maille.on('click', surClicMaille);
596
		maille.on('click', surClicMaille);
595
		maille.setStyle({fillColor : genererCouleur(nombreStations), fillOpacity: 0.45, opacity: 0.7});
597
		maille.setStyle({fillColor : genererCouleur(nombreStations), fillOpacity: 0.45, opacity: 0.7});
596
	} else {
598
	} else {
597
		maille.setStyle({fillOpacity: 0, opacity: 0});
599
		maille.setStyle({fillOpacity: 0, opacity: 0});
598
		maille.off('click');
600
		maille.off('click');
599
	}
601
	}
600
}
602
}
601
 
603
 
602
function genererCouleur(nombrePoints) {
604
function genererCouleur(nombrePoints) {
603
	var couleur = {'bleu': 231, 'vert': 224, 'rouge': 64},
605
	var couleur = {'bleu': 231, 'vert': 224, 'rouge': 64},
604
		seuils = [1, 10, 50 ,100, 500, 1000, 2500],
606
		seuils = [1, 10, 50 ,100, 500, 1000, 2500],
605
		pas = 26,
607
		pas = 26,
606
		position = 0;
608
		position = 0;
607
	for (var index = 1; index < seuils.length-1 && nombrePoints >= seuils[index]; index ++) {
609
	for (var index = 1; index < seuils.length-1 && nombrePoints >= seuils[index]; index ++) {
608
		position ++;
610
		position ++;
609
	}
611
	}
610
	couleur.vert -= position*pas;
612
	couleur.vert -= position*pas;
611
	return 'rgb('+couleur.bleu+','+couleur.vert+','+couleur.rouge+')';
613
	return 'rgb('+couleur.bleu+','+couleur.vert+','+couleur.rouge+')';
612
}
614
}
613
 
615
 
614
function surClicMaille(event) {
616
function surClicMaille(event) {
615
	map.fitBounds(event.layer.getBounds());
617
	map.fitBounds(event.layer.getBounds());
616
}
618
}
617
 
619
 
618
function afficherLegende() {
620
function afficherLegende() {
619
	if (legende == null) {
621
	if (legende == null) {
620
		legende = new L.Control({position : 'bottomright'});
622
		legende = new L.Control({position : 'bottomright'});
621
		legende.onAdd = function(map) {
623
		legende.onAdd = function(map) {
622
			var contenuHtml = '';
624
			var contenuHtml = '';
623
			if (typeSite == 'maille') {
625
			if (typeSite == 'maille') {
624
				contenuHtml = construireContenuHtmlLegendeMailles();
626
				contenuHtml = construireContenuHtmlLegendeMailles();
625
			} else {
627
			} else {
626
				contenuHtml = construireContenuHtmlLegendePoints(); 
628
				contenuHtml = construireContenuHtmlLegendePoints(); 
627
			}
629
			}
628
			return contenuHtml;
630
			return contenuHtml;
629
		};
631
		};
630
		map.addControl(legende);
632
		map.addControl(legende);
631
	}
633
	}
632
}
634
}
633
 
635
 
634
function construireContenuHtmlLegendeMailles() {
636
function construireContenuHtmlLegendeMailles() {
635
	var div = L.DomUtil.create('div', 'info');
637
	var div = L.DomUtil.create('div', 'info');
636
	div.innerHTML = '<h4>' + titreLegende + '</h4>';
638
	div.innerHTML = '<h4>' + titreLegende + '</h4>';
637
	var seuils = [1, 10, 50 ,100, 500, 1000, 2500];
639
	var seuils = [1, 10, 50 ,100, 500, 1000, 2500];
638
	var labels = [];
640
	var labels = [];
639
	for (var i = 0; i < seuils.length; i ++) {
641
	for (var i = 0; i < seuils.length; i ++) {
640
		div.innerHTML += 
642
		div.innerHTML += 
641
			'<div class="legend">'+
643
			'<div class="legend">'+
642
				'<span class="couleur-maille" style="background:' + genererCouleur(seuils[i] + 1) + '">'+
644
				'<span class="couleur-maille" style="background:' + genererCouleur(seuils[i] + 1) + '">'+
643
				'</span>'+seuils[i]+ (i + 1 < seuils.length ? '&ndash;' + seuils[i + 1] : '+')+
645
				'</span>'+seuils[i]+ (i + 1 < seuils.length ? '&ndash;' + seuils[i + 1] : '+')+
644
			'</div>';
646
			'</div>';
645
	}
647
	}
646
	return div;
648
	return div;
647
}
649
}
648
 
650
 
649
function masquerLegende() {
651
function masquerLegende() {
650
	if (legende != null) {
652
	if (legende != null) {
651
		map.removeControl(legende);
653
		map.removeControl(legende);
652
		legende = null;
654
		legende = null;
653
	}
655
	}
654
}
656
}
655
 
657
 
656
function genererInfobulleMailles() {
658
function genererInfobulleMailles() {
657
	coucheSites.eachLayer(function(layer) {
659
	coucheSites.eachLayer(function(layer) {
658
		if (layer.typeSite == 'maille') {
660
		if (layer.typeSite == 'maille') {
659
			genererInfobulle(layer);
661
			genererInfobulle(layer);
660
		}
662
		}
661
	});
663
	});
662
}
664
}
663
 
665
 
664
function genererInfobulle(maille) {
666
function genererInfobulle(maille) {
665
	var sources = maille.properties.source;
667
	var sources = maille.properties.source;
666
	var textes = new Array();
668
	var textes = new Array();
667
	for (var index = 0; index < sources.length; index ++) {
669
	for (var index = 0; index < sources.length; index ++) {
668
		var source = sources[index];
670
		var source = sources[index];
669
		if (typeof(maille.properties.stations[source]) != 'undefined') {
671
		if (typeof(maille.properties.stations[source]) != 'undefined') {
670
			textes.push(source+" : "+maille.properties.stations[source]+" stations, "
672
			textes.push(source+" : "+maille.properties.stations[source]+" stations, "
671
				+maille.properties.observations[source]+" observations");
673
				+maille.properties.observations[source]+" observations");
672
		}
674
		}
673
	}
675
	}
674
	var contenu = textes.join('<br />');
676
	var contenu = textes.join('<br />');
675
	maille.on('mouseover', function() {
677
	maille.on('mouseover', function() {
676
		afficherTooltip(contenu, map.latLngToContainerPoint(maille.getBounds().getSouthWest()));
678
		afficherTooltip(contenu, map.latLngToContainerPoint(maille.getBounds().getSouthWest()));
677
	});
679
	});
678
	maille.on('mouseout', function() {
680
	maille.on('mouseout', function() {
679
		$("#tooltip").css('display', 'none');
681
		$("#tooltip").css('display', 'none');
680
	});
682
	});
681
}
683
}
682
 
684
 
683
function afficherTooltip(texte, point) { 
685
function afficherTooltip(texte, point) { 
684
	$("#tooltip").html(texte);
686
	$("#tooltip").html(texte);
685
	if ($("#tooltip").css('display') == 'none') {
687
	if ($("#tooltip").css('display') == 'none') {
686
		var x = point.x - 15;
688
		var x = point.x - 15;
687
		var y = point.y + (typeSite == 'maille' ? 1 : 10);
689
		var y = point.y + (typeSite == 'maille' ? 1 : 10);
688
		$("#tooltip").css('display', 'block');
690
		$("#tooltip").css('display', 'block');
689
		$("#tooltip").css('left', x + 'px');
691
		$("#tooltip").css('left', x + 'px');
690
		$("#tooltip").css('top', y + 'px');
692
		$("#tooltip").css('top', y + 'px');
691
	}
693
	}
692
}
694
}
693
 
695
 
694
 
696
 
695
 
697
 
696
 
698
 
697
// ====================================================================
699
// ====================================================================
698
// Gestion des points
700
// Gestion des points
699
 
701
 
700
function ajouterPoint(feature) {
702
function ajouterPoint(feature) {
701
	var iconePoint = new L.Icon({ iconUrl : pointImageUrl,   iconSize : [16, 16] }),
703
	var iconePoint = new L.Icon({ iconUrl : pointImageUrl,   iconSize : [16, 16] }),
702
		iconeCommune   = new L.Icon({ iconUrl : communeImageUrl, iconSize : [24, 32] }),
704
		iconeCommune   = new L.Icon({ iconUrl : communeImageUrl, iconSize : [24, 32] }),
703
		icone = (feature.properties.typeSite == 'STATION') ? iconePoint : iconeCommune,
705
		icone = (feature.properties.typeSite == 'STATION') ? iconePoint : iconeCommune,
704
		point = new L.LatLng(feature.geometry.coordinates[0], feature.geometry.coordinates[1]);
706
		point = new L.LatLng(feature.geometry.coordinates[0], feature.geometry.coordinates[1]);
705
	var marker = new L.Cluster(point, {
707
	var marker = new L.Cluster(point, {
706
		icon  : icone,
708
		icon  : icone,
707
		titre : feature.properties.nom
709
		titre : feature.properties.nom
708
	});
710
	});
709
	marker.typeSite = feature.properties.typeSite.toLowerCase();
711
	marker.typeSite = feature.properties.typeSite.toLowerCase();
710
	marker.source = feature.properties.source;
712
	marker.source = feature.properties.source;
711
	marker.on('click', surClicMarqueur);
713
	marker.on('click', surClicMarqueur);
712
	marker.on('mouseover', function() {
714
	marker.on('mouseover', function() {
713
		afficherTooltip(marker.options.titre, map.latLngToContainerPoint(marker.getLatLng()));
715
		afficherTooltip(marker.options.titre, map.latLngToContainerPoint(marker.getLatLng()));
714
	});
716
	});
715
	marker.on('mouseout', function() {
717
	marker.on('mouseout', function() {
716
		$("#tooltip").css('display', 'none');
718
		$("#tooltip").css('display', 'none');
717
	});
719
	});
718
	coucheSites.ajouterPoint(marker);
720
	coucheSites.ajouterPoint(marker);
719
}
721
}
720
 
722
 
721
function construireContenuHtmlLegendePoints() {
723
function construireContenuHtmlLegendePoints() {
722
	var div = L.DomUtil.create('div', 'info');
724
	var div = L.DomUtil.create('div', 'info');
723
	div.innerHTML =
725
	div.innerHTML =
724
	'<h4>Stations</h4>'+
726
	'<h4>Stations</h4>'+
725
	'<div class="legend"><table>'+
727
	'<div class="legend"><table>'+
726
		'<tr>'+
728
		'<tr>'+
727
			'<td class="image-station"><img src="'+communeImageUrl+'" width="24" height="32" /></td>'+
729
			'<td class="image-station"><img src="'+communeImageUrl+'" width="24" height="32" /></td>'+
728
			'<td class="label-station">Commune</td>'+
730
			'<td class="label-station">Commune</td>'+
729
		'</tr>'+
731
		'</tr>'+
730
		'<tr>'+
732
		'<tr>'+
731
			'<td class="image-station"><img src="'+pointImageUrl+'" /></td>'+
733
			'<td class="image-station"><img src="'+pointImageUrl+'" /></td>'+
732
			'<td class="label-station">Lieu précis</td>'+
734
			'<td class="label-station">Lieu précis</td>'+
733
		'</tr>'+
735
		'</tr>'+
734
		'<tr>'+
736
		'<tr>'+
735
			'<td class="image-station"><img src="'+clusterImageUrl+'" width="20" height="20" /></td>'+
737
			'<td class="image-station"><img src="'+clusterImageUrl+'" width="20" height="20" /></td>'+
736
			'<td class="label-station">Groupe de stations proches</td>'+
738
			'<td class="label-station">Groupe de stations proches</td>'+
737
		'</tr>'+
739
		'</tr>'+
738
	'</table></div>';
740
	'</table></div>';
739
	return div;
741
	return div;
740
}
742
}
741
 
743
 
742
 
744
 
743
function surClicMarqueur(event) {
745
function surClicMarqueur(event) {
744
	var nombreMarkers = event.target.recupererMarkers().length;
746
	var nombreMarkers = event.target.recupererMarkers().length;
745
	if (nombreMarkers == 1 || map.getZoom() == map.getMaxZoom()) {
747
	if (nombreMarkers == 1 || map.getZoom() == map.getMaxZoom()) {
746
		recupererObservations(event.target);
748
		recupererObservations(event.target);
747
	} else {
749
	} else {
748
		map.setView(event.target.getLatLng(), Math.min(map.getZoom()+2, map.getMaxZoom()));
750
		map.setView(event.target.getLatLng(), Math.min(map.getZoom()+2, map.getMaxZoom()));
749
	}
751
	}
750
}
752
}
751
 
753
 
752
function recupererObservations(cluster) {
754
function recupererObservations(cluster) {
753
	pointClique = cluster;
755
	pointClique = cluster;
754
	var latlng = cluster.getLatLng();
756
	var latlng = cluster.getLatLng();
755
	afficherMessageChargement('observations');
757
	afficherMessageChargement('observations');
756
	var parametres = {
758
	var parametres = {
757
		"source" : recupererSourcesCluster(cluster),
759
		"source" : recupererSourcesCluster(cluster),
758
		"stations" : construireListeStationsCluster(cluster),
760
		"stations" : construireListeStationsCluster(cluster),
759
		"num_taxon" : numTaxon,
761
		"num_taxon" : numTaxon,
760
		"nn" : nn,
762
		"nn" : nn,
761
		"referentiel" : referentiel,
763
		"referentiel" : referentiel,
762
		"auteur" : auteur,
764
		"auteur" : auteur,
763
		"date_debut" : dateDebut,
765
		"date_debut" : dateDebut,
764
		"date_fin" : dateFin,
766
		"date_fin" : dateFin,
765
		"nb_jours" : nbJours
767
		"nb_jours" : nbJours
766
	};
768
	};
767
	url = urlBase + "observations?" + convertirEnParametresUrl(parametres);
769
	url = urlBase + "observations?" + convertirEnParametresUrl(parametres);
768
	fonctionCallback = traiterDonneesObservations;
770
	fonctionCallback = traiterDonneesObservations;
769
	executerAJAX();
771
	executerAJAX();
770
}
772
}
771
 
773
 
772
function recupererSourcesCluster(cluster) {
774
function recupererSourcesCluster(cluster) {
773
	var markers = cluster.recupererMarkers();
775
	var markers = cluster.recupererMarkers();
774
	var sourcesCluster = [];
776
	var sourcesCluster = [];
775
	for (var index = 0; index < markers.length; index ++) {
777
	for (var index = 0; index < markers.length; index ++) {
776
		if (sourcesCluster.indexOf(markers[index].source) == -1) {
778
		if (sourcesCluster.indexOf(markers[index].source) == -1) {
777
			sourcesCluster.push(markers[index].source);
779
			sourcesCluster.push(markers[index].source);
778
		}
780
		}
779
	}
781
	}
780
	return sourcesCluster.join(',');
782
	return sourcesCluster.join(',');
781
}
783
}
782
 
784
 
783
function construireListeStationsCluster(cluster) {
785
function construireListeStationsCluster(cluster) {
784
	var markers = cluster.recupererMarkers();
786
	var markers = cluster.recupererMarkers();
785
	var listePoints = [];
787
	var listePoints = [];
786
	for (var index = 0; index < markers.length; index ++) {
788
	for (var index = 0; index < markers.length; index ++) {
787
		var latlng = markers[index].getLatLng();
789
		var latlng = markers[index].getLatLng();
788
		listePoints.push(markers[index].source+":"+markers[index].typeSite+":"+latlng.lng+","+latlng.lat);
790
		listePoints.push(markers[index].source+":"+markers[index].typeSite+":"+latlng.lng+","+latlng.lat);
789
	}
791
	}
790
	return listePoints.join('|');
792
	return listePoints.join('|');
791
}
793
}
792
 
794
 
793
function traiterDonneesObservations() {
795
function traiterDonneesObservations() {
794
	masquerMessageChargement();
796
	masquerMessageChargement();
795
	var texte = requeteChargementPoints.responseText;
797
	var texte = requeteChargementPoints.responseText;
796
	if (!estStatutRequeteOK()) {
798
	if (!estStatutRequeteOK()) {
797
		alert(texte);
799
		alert(texte);
798
	} else {
800
	} else {
799
		obsJSON = eval("(function(){return " + texte + ";})()");
801
		obsJSON = eval("(function(){return " + texte + ";})()");
800
		if (obsJSON != null) {
802
		if (obsJSON != null) {
801
			viderListeObservations();
803
			viderListeObservations();
802
			if (obsJSON.total > 0) {
804
			if (obsJSON.total > 0) {
803
				doitRafraichirCarte = false;
805
				doitRafraichirCarte = false;
804
				map.setView(new L.LatLng(pointClique.getLatLng().lat, pointClique.getLatLng().lng), map.getZoom());
806
				map.setView(new L.LatLng(pointClique.getLatLng().lat, pointClique.getLatLng().lng), map.getZoom());
805
				afficherInfoBulle();
807
				afficherInfoBulle();
806
			} else if (infoBulle != null)  {
808
			} else if (infoBulle != null)  {
807
				masquerInfoBulle();
809
				masquerInfoBulle();
808
			}
810
			}
809
		}
811
		}
810
	}
812
	}
811
}
813
}
812
 
814
 
813
 
815
 
814
 
816
 
815
 
817
 
816
// ====================================================================
818
// ====================================================================
817
// Gestion de l'infobulle
819
// Gestion de l'infobulle
818
 
820
 
819
var obsJSON = null,
821
var obsJSON = null,
820
	pointClique = null,
822
	pointClique = null,
821
	obsStation = [],
823
	obsStation = [],
822
	pagineur = {'limite':100, 'start':0, 'total':0, 'stationId':null, 'format':'tableau'};
824
	pagineur = {'limite':100, 'start':0, 'total':0, 'stationId':null, 'format':'tableau'};
823
 
825
 
824
function afficherInfoBulle() {
826
function afficherInfoBulle() {
825
	var latitude = pointClique.getLatLng().lat;
827
	var latitude = pointClique.getLatLng().lat;
826
	var longitude = pointClique.getLatLng().lng;
828
	var longitude = pointClique.getLatLng().lng;
827
	infoBulle = new L.Popup({maxWidth : definirLargeurInfoBulle(), maxHeight : 380});
829
	infoBulle = new L.Popup({maxWidth : definirLargeurInfoBulle(), maxHeight : 380});
828
	infoBulle.setLatLng(new L.LatLng(latitude, longitude));
830
	infoBulle.setLatLng(new L.LatLng(latitude, longitude));
829
	infoBulle.setContent($("#tpl-obs").html());
831
	infoBulle.setContent($("#tpl-obs").html());
830
	infoBulle.openOn(map);
832
	infoBulle.openOn(map);
831
	remplirContenuPopup();
833
	remplirContenuPopup();
832
	$('#info-bulle').css('width', '99%');
834
	$('#info-bulle').css('width', '99%');
833
	$('#observations').css('height', '250px');
835
	$('#observations').css('height', '250px');
834
	$('#observations').css('overflow', 'auto');
836
	$('#observations').css('overflow', 'auto');
835
	$('.leaflet-popup-scrolled').css('overflow', 'visible');
837
	$('.leaflet-popup-scrolled').css('overflow', 'visible');
836
}
838
}
837
 
839
 
838
function viderListeObservations() {
840
function viderListeObservations() {
839
	obsStation = new Array();
841
	obsStation = new Array();
840
}
842
}
841
 
843
 
842
function definirLargeurInfoBulle() {
844
function definirLargeurInfoBulle() {
843
	var largeurViewPort = $(window).width();
845
	var largeurViewPort = $(window).width();
844
	var lageurInfoBulle = null;
846
	var lageurInfoBulle = null;
845
	if (largeurViewPort < 800) {
847
	if (largeurViewPort < 800) {
846
		largeurInfoBulle = 400;
848
		largeurInfoBulle = 400;
847
	} else if (largeurViewPort >= 800 && largeurViewPort < 1200) {
849
	} else if (largeurViewPort >= 800 && largeurViewPort < 1200) {
848
		largeurInfoBulle = 500;
850
		largeurInfoBulle = 500;
849
	} else if (largeurViewPort >= 1200) {
851
	} else if (largeurViewPort >= 1200) {
850
		largeurInfoBulle = 600;
852
		largeurInfoBulle = 600;
851
	}
853
	}
852
	return largeurInfoBulle;
854
	return largeurInfoBulle;
853
}
855
}
854
 
856
 
855
function redimensionnerPopup() {
857
function redimensionnerPopup() {
856
	$('.leaflet-popup-content*').css('width', definirLargeurInfoBulle());
858
	$('.leaflet-popup-content*').css('width', definirLargeurInfoBulle());
857
	$('#info-bulle').css('width', '99%');
859
	$('#info-bulle').css('width', '99%');
858
}
860
}
859
 
861
 
860
function remplirContenuPopup() {
862
function remplirContenuPopup() {
861
	ajouterTableauTriable("#obs-tableau");
863
	ajouterTableauTriable("#obs-tableau");
862
	ajouterTitre();
864
	ajouterTitre();
863
	afficherTableau();
865
	afficherTableau();
864
	afficherTexteStationId();
866
	afficherTexteStationId();
865
}
867
}
866
 
868
 
867
function masquerInfoBulle() {
869
function masquerInfoBulle() {
868
	if (infoBulle != null && map.hasLayer(infoBulle)) {
870
	if (infoBulle != null && map.hasLayer(infoBulle)) {
869
		map.removeLayer(infoBulle);
871
		map.removeLayer(infoBulle);
870
	}
872
	}
871
	infoBulle = null;
873
	infoBulle = null;
872
}
874
}
873
 
875
 
874
function ajouterTitre() {
876
function ajouterTitre() {
875
	var texteStationTitre = obsJSON.total + ' observation' + (obsJSON.total > 1 ? 's' : '')
877
	var texteStationTitre = obsJSON.total + ' observation' + (obsJSON.total > 1 ? 's' : '')
876
		+ ' sur ' + (pointClique.typeSite=='station' ? 'la station : ' : 'la commune : ')
878
		+ ' sur ' + (pointClique.typeSite=='station' ? 'la station : ' : 'la commune : ')
877
		+ pointClique.options.title;
879
		+ pointClique.options.title;
878
	$('#obs-station-titre').text(texteStationTitre);
880
	$('#obs-station-titre').text(texteStationTitre);
879
}
881
}
880
 
882
 
881
function afficherTableau() {
883
function afficherTableau() {
882
	construireListeObservations();
884
	construireListeObservations();
883
	afficherPagination();
885
	afficherPagination();
884
	afficherObservationsDansHTML();
886
	afficherObservationsDansHTML();
885
}
887
}
886
 
888
 
887
function construireListeObservations() {
889
function construireListeObservations() {
888
	if (obsStation.length==0) {
890
	if (obsStation.length==0) {
889
		// premiere execution de la fonction : faire une copie des objets JSON decrivant les observations 
891
		// premiere execution de la fonction : faire une copie des objets JSON decrivant les observations 
890
		for (var index = 0; index < obsJSON.observations.length; index ++) {
892
		for (var index = 0; index < obsJSON.observations.length; index ++) {
891
			obsStation.push(obsJSON.observations[index]);
893
			obsStation.push(obsJSON.observations[index]);
892
		}
894
		}
893
	}
895
	}
894
	pagineur.total = obsStation.length;
896
	pagineur.total = obsStation.length;
895
}
897
}
896
 
898
 
897
function afficherPagination() {
899
function afficherPagination() {
898
	$(".navigation").pagination(pagineur.total, {
900
	$(".navigation").pagination(pagineur.total, {
899
		items_per_page:pagineur.limite,
901
		items_per_page:pagineur.limite,
900
		callback:afficherObservationsDansHTML,
902
		callback:afficherObservationsDansHTML,
901
		next_text:'Suivant',
903
		next_text:'Suivant',
902
		prev_text:'Précédent',
904
		prev_text:'Précédent',
903
		prev_show_always:false,
905
		prev_show_always:false,
904
		num_edge_entries:1,
906
		num_edge_entries:1,
905
		num_display_entries:4,
907
		num_display_entries:4,
906
		load_first_page:true
908
		load_first_page:true
907
	});
909
	});
908
}
910
}
909
 
911
 
910
function afficherObservationsDansHTML(indexPage) {
912
function afficherObservationsDansHTML(indexPage) {
911
	$("#obs-tableau-lignes").empty();
913
	$("#obs-tableau-lignes").empty();
912
	if (typeof(indexPage) == 'undefined') {
914
	if (typeof(indexPage) == 'undefined') {
913
		indexPage = 0;
915
		indexPage = 0;
914
	}
916
	}
915
	var depart = indexPage * pagineur.limite;
917
	var depart = indexPage * pagineur.limite;
916
	var obsPage = [];
918
	var obsPage = [];
917
	for (var index = depart; index < depart + pagineur.limite; index ++) {
919
	for (var index = depart; index < depart + pagineur.limite; index ++) {
918
		obsPage.push(obsStation[index]);
920
		obsPage.push(obsStation[index]);
919
	}
921
	}
920
	$("#tpl-obs-tableau").tmpl(obsPage).appendTo("#obs-tableau-lignes");
922
	$("#tpl-obs-tableau").tmpl(obsPage).appendTo("#obs-tableau-lignes");
921
	mettreAJourTableauTriable();
923
	mettreAJourTableauTriable();
922
}
924
}
923
 
925
 
924
function ajouterTableauTriable() {
926
function ajouterTableauTriable() {
925
	$.tablesorter.addParser({ 
927
	$.tablesorter.addParser({ 
926
		id: 'date_cel', 
928
		id: 'date_cel', 
927
		is: function(s) { 
929
		is: function(s) { 
928
			// doit retourner false si le parseur n'est pas autodétecté
930
			// doit retourner false si le parseur n'est pas autodétecté
929
			return /^\s*\d{2}[\/-]\d{2}[\/-]\d{4}\s*$/.test(s);
931
			return /^\s*\d{2}[\/-]\d{2}[\/-]\d{4}\s*$/.test(s);
930
		}, 
932
		}, 
931
		format: function(date) { 
933
		format: function(date) { 
932
			// Transformation date jj/mm/aaaa en aaaa/mm/jj
934
			// Transformation date jj/mm/aaaa en aaaa/mm/jj
933
			date = date.replace(/^\s*(\d{2})[\/-](\d{2})[\/-](\d{4})\s*$/, "$3-$2-$1");
935
			date = date.replace(/^\s*(\d{2})[\/-](\d{2})[\/-](\d{4})\s*$/, "$3-$2-$1");
934
			// Remplace la date par un nombre de millisecondes pour trier numériquement
936
			// Remplace la date par un nombre de millisecondes pour trier numériquement
935
			return $.tablesorter.formatFloat(new Date(date).getTime());
937
			return $.tablesorter.formatFloat(new Date(date).getTime());
936
		}, 
938
		}, 
937
		type: 'numeric' 
939
		type: 'numeric' 
938
	});
940
	});
939
	$("#obs-tableau").tablesorter({ 
941
	$("#obs-tableau").tablesorter({ 
940
        headers: { 
942
        headers: { 
941
			1: { 
943
			1: { 
942
            	sorter:'date_cel'
944
            	sorter:'date_cel'
943
        	} 
945
        	} 
944
    	}
946
    	}
945
	});
947
	});
946
}
948
}
947
 
949
 
948
function mettreAJourTableauTriable() {
950
function mettreAJourTableauTriable() {
949
	$("#obs-tableau").trigger('update');
951
	$("#obs-tableau").trigger('update');
950
}
952
}
951
 
953
 
952
function afficherTexteStationId() {
954
function afficherTexteStationId() {
953
	var latitude = pointClique.getLatLng().lat.toFixed(5);
955
	var latitude = pointClique.getLatLng().lat.toFixed(5);
954
	var longitude = pointClique.getLatLng().lng.toFixed(5);
956
	var longitude = pointClique.getLatLng().lng.toFixed(5);
955
	var texteStationId = pointClique.typeSite.toUpperCase() + ':'
957
	var texteStationId = pointClique.typeSite.toUpperCase() + ':'
956
		+ latitude + '|' + longitude + ', SOURCE:' + pointClique.source;
958
		+ latitude + '|' + longitude + ', SOURCE:' + pointClique.source;
957
	$('#obs-station-id').text(texteStationId);
959
	$('#obs-station-id').text(texteStationId);
958
}
960
}