Subversion Repositories eFlore/Applications.cel

Rev

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

Rev Author Line No. Line
3425 idir 1
/**
2
 * Constructeur ReleveASL par défaut
3
 * S'applique au squelette apaforms.tpl.html
4
 * Qui se charge dans apa.tpl.php
5
 * Lors de la saisie du relevé et des arbres
6
 */
7
// ASL : APA, sTREETs, Lichen's Go!
8
function ReleveASL( proprietes, widgetProp ) {
9
	if  ( utils.valOk( proprietes ) && utils.valOk( widgetProp ) ) {
10
		this.sujet             = proprietes.sujet;
11
		this.tagImg            = proprietes.tagImg;
12
		this.separationTagImg  = proprietes.separationTagImg;
13
		this.tagImg            = proprietes.tagImg;
14
		this.tagObs            = proprietes.tagObs;
15
		this.separationTagObs  = proprietes.separationTagObs;
16
		this.tagObs            = proprietes.tagObs;
17
		this.nomSciReferentiel = proprietes.nomSciReferentiel;
18
		this.referentielImpose = proprietes.referentielImpose;
19
		this.widgetProp        = widgetProp;
20
		this.urlWidgets        = widgetProp.urlWidgets;
21
		this.module            = widgetProp.nomSquelette;
22
	}
23
	this.isTaxonListe = false;
24
	this.numArbre     = 0;
25
}
26
ReleveASL.prototype = new WidgetsSaisiesASL( this.widgetProp );
27
 
28
/**
29
 * Initialise le formulaire, les validateurs, les listes de complétion...
30
 */
31
ReleveASL.prototype.initForm = function() {
32
	const lthis = this;
33
 
34
	var idUtilisateur = $( '#id_utilisateur' ).val();
35
 
36
	$('[type="date"]').prop('max', function(){
37
		return new Date().toJSON().split('T')[0];
38
	});
39
	if( this.valOk( idUtilisateur ) ) {
40
		if ( this.valOk( $( '#releve-data' ).val() ) ) {
41
			const datRuComun = $.parseJSON( $( '#dates-rues-communes' ).val() );
42
 
43
			var releveDatas = $.parseJSON( $( '#releve-data' ).val() );
44
			if ( !this.valOk( releveDatas[1] ) || -1 === datRuComun.indexOf( releveDatas[1]['date_rue_commune'] )  ) {
45
				this.releveDatas = releveDatas;
46
				if ( this.valOk( this.releveDatas[0].utilisateur, true, idUtilisateur ) ) {
47
					$( '#releve-date' ).val( this.releveDatas[0].date );
48
					this.rechargerFormulaire();
49
					this.saisirArbres();
50
					$( '#bouton-list-releves' )
51
						.removeClass( 'hidden' )
3432 idir 52
						.on( 'click', function( event ) {
53
							event.preventDefault();
3425 idir 54
							$( '#table-releves' ).removeClass( 'hidden' );
55
							$( this ).addClass( 'hidden' );
56
					});
57
				}
58
			}
59
		}
60
		if ( this.valOk(  $( '.charger-releve' ) ) ) {
61
			var btnChargementForm = this.determinerBtnsChargementForm( '.' );
62
			// #releve-data est modifié, bouton dans #releves-utilisateur
63
			this.btnsChargerForm( btnChargementForm );
64
		}
65
	}
66
	this.ajouterAutocompletionNoms();
67
	this.configurerFormValidator();
68
	this.definirReglesFormValidator();
69
};
70
 
71
/**
72
 * Initialise les écouteurs d'événements
73
 */
74
ReleveASL.prototype.initEvts = function() {
75
	const lthis = this;
76
 
77
	// comportement du bouton nouveau releve
78
	if ( this.valOk( $( '#id_utilisateur' ).val() ) ) {
79
		// #releve-data est modifié, bouton dans #releves-utilisateur
80
		this.btnsChargerForm( '#bouton-nouveau-releve' );
81
	}
82
	// on location, initialisation de la géoloc
83
	this.initEvtsGeoloc();
84
	// Sur téléchargement image
85
	this.initEvtsFichier();
86
 
87
	if ( 'tb_streets' !== this.module ) {
88
		// Gérer une option "aucune" sur plusieurs checkboxes
89
		$( '#face-ombre input' ).on( 'click', function () {
90
			if ( 'aucune' === $( this ).val() ) {
91
				$( '#face-ombre input' ).not( '#aucune' ).prop( 'checked' , false );
92
			} else {
93
				$( '#aucune' ).prop( 'checked' , false );
94
			}
95
		});
96
	}
97
	$( '#soumettre-releve' ).on( 'click', function( event ) {
98
		event.preventDefault();
99
		lthis.saisirArbres();
100
	});
101
	// Création / Suppression / Transmission des obs
102
	// Défilement des miniatures dans le résumé obs
103
	this.initEvtsObs();
104
 
105
	$( '#bloc-info-arbres' ).on( 'click', '.arbre-info', function ( event ) {
106
		event.preventDefault();
107
		$( this ).addClass( 'disabled' );
108
		$( '.arbre-info' ).not( $( this ) ).removeClass( 'disabled' );
109
 
110
		var numArbre = $( this ).data( 'arbre-info' );
111
 
112
		lthis.chargerInfosArbre( numArbre );
3427 idir 113
		lthis.scrollFormTop( '#zone-arbres' );
3425 idir 114
	});
115
	// après avoir visualisé les champs d'un arbre, retour à la saisie
116
	$( '#retour' ).on( 'click', function( event ) {
117
		event.preventDefault();
118
 
119
		var numArbre = lthis.numArbre + 1;
120
 
121
		// activation des champs et retour à la saisie
122
		lthis.modeArbresBasculerActivation( false, numArbre );
123
		$( '#taxon' )
124
			.val('')
125
			.removeData([
126
				'value',
127
				'numNomSel',
128
				'nomRet',
129
				'numNomRet',
130
				'nt',
131
				'famille'
132
			]);
3427 idir 133
		lthis.scrollFormTop( '#zone-arbres' );
3425 idir 134
	});
135
	// chargement plantes ou lichens
136
	var btnChargementForm = this.determinerBtnsChargementForm( '#' );
137
	// #releve-data n'est pas modifié, bouton dans #charger-form
138
	this.btnsChargerForm( btnChargementForm, false, false );
139
	// Alertes et aides
140
	this.initEvtsAlertes();
141
};
142
 
143
/**
144
 * Recharge le formulaire relevé (étape 1) à partir des infos
145
 * présentes dans l'input hidden '#releve-data'
146
 */
147
ReleveASL.prototype.rechargerFormulaire = function() {
148
	const lthis = this;
149
 
150
	this.releveDatas = $.parseJSON( $( '#releve-data' ).val() );
151
	$.each( this.releveDatas[0], function( cle , valeur ) {
152
		if ( 'zone-pietonne' === cle ||  'pres-lampadaires' === cle ) {
153
			$( 'input[name=' + cle + '][value=' + valeur + ']' , '#zone-observation' ).prop( 'checked', true );
154
		} else if ( lthis.valOk( $( '#' + cle ) ) ) {
155
			$( '#' + cle ).val( valeur );
156
		}
157
	});
158
 
159
	if (
160
		this.valOk( $( '#latitude-releve' ).val() ) &&
161
		this.valOk( $( '#longitude-releve' ).val() ) &&
162
		this.valOk( $( '#rue' ).val() ) &&
163
		this.valOk( $( '#commune-nom' ).val() )
164
	) {
165
		$( '#geoloc' ).addClass( 'hidden' );
166
		$( '#geoloc-datas' ).removeClass( 'hidden' );
167
	}
3427 idir 168
	this.scrollFormTop( '#zone-observation', '#releve-date' )
3425 idir 169
};
170
 
171
/**
172
 * Recharge le formulaire étape arbres à partir des infos
173
 * présentes dans l'input hidden '#releve-data'
174
 */
175
ReleveASL.prototype.chargerArbres = function() {
176
	this.releveDatas = $.parseJSON( $( '#releve-data' ).val() );
177
	this.obsNbre     = this.releveDatas.length - 1;
178
	this.numArbre    = parseInt( this.releveDatas[ this.obsNbre ]['num-arbre'] ) || this.obsNbre;
179
	$( '.obs-nbre' ).text( this.obsNbre );
180
	$( '.obs-nbre' ).triggerHandler( 'changement' );
181
	$( '#arbre-nb' ).text( this.numArbre + 1 );
182
 
183
	var infosArbre = {
184
		releve : this.releveDatas[0],
185
		obsNum : 0,
186
		sujet  : {}
187
	};
188
 
189
	for( var i = 1; i <= this.obsNbre; i ++ ) {
190
		infosArbre.obsNum = i;
191
		infosArbre.sujet = this.releveDatas[i];
192
		this.lienArbreInfo( infosArbre.sujet['num-arbre'] );
193
		this.afficherObs( infosArbre );
194
		this.stockerObsData( infosArbre, true );
195
	}
196
};
197
 
198
ReleveASL.prototype.lienArbreInfo = function( numArbre ) {
199
	if ( numArbre == 1 ) {
200
		$( '#bloc-info-arbres-title' ).removeClass( 'hidden' );
201
	}
202
	$( '#bloc-info-arbres' ).append(
203
		'<div'+
204
			' id="arbre-info-' + numArbre + '"'+
205
			' class="col-sm-8"'+
206
		'>'+
207
			'<a'+
208
				' id="arbre-info-lien-' + numArbre + '"'+
209
				' href=""'+
210
				' class="arbre-info btn btn-outline-info btn-block mb-3"'+
211
				' data-arbre-info="' + numArbre + '"'+
212
			'>'+
213
				'<i class="fas fa-info-circle"></i>'+
214
				' Arbre ' + numArbre +
215
			'</a>'+
216
		'</div>'
217
	);
218
};
219
 
220
// Ajouter Obs ****************************************************************/
221
/**
222
 * Etape formulaire avec transfert carto
223
 */
224
ReleveASL.prototype.saisirArbres = function() {
225
	const lthis = this;
226
 
227
	if ( this.validerReleve() ) {
228
		$( '#soumettre-releve' )
229
			.addClass( 'disabled' )
230
			.attr( 'aria-disabled', true )
231
			.off();
232
		$( '#form-observation' ).find( 'input, textarea' ).prop( 'disabled', true );
233
		$( '#zone-arbres,#geoloc-datas,#bouton-nouveau-releve' ).removeClass( 'hidden' );
234
		this.confirmerSortie();
235
		if ( !this.valOk( $( '#releve-data' ).val() ) ) {
236
			var releveDatasTmp = {
237
				obs  : {
238
					ce_utilisateur     : $( '#id_utilisateur' ).val(),
239
					date_observation   : $( '#releve-date' ).val(),
240
					zone_geo           : $( '#commune-nom' ).val(),
241
					ce_zone_geo        : $( '#commune-insee' ).val(),
242
					pays               : $( '#pays' ).val(),
243
					commentaire        : $( '#commentaires' ).val().trim()
244
				},
245
				obsE : {
246
					rue                : $( '#rue' ).val(),
247
					'latitude-releve'  : $( '#latitude-releve' ).val(),
248
					'longitude-releve' : $( '#longitude-releve' ).val(),
249
					'altitude-releve'  : $( '#altitude-releve' ).val()
250
				}
251
			};
252
			if ( 'tb_lichensgo' !== this.module ) {
253
				releveDatasTmp.obsE['zone-pietonne'] = $( '#zone-pietonne input:checked' ).val();
254
				releveDatasTmp.obsE['pres-lampadaires'] = $( '#pres-lampadaires input:checked' ).val();
255
			}
256
			this.releveDatas = this.formaterReleveData(releveDatasTmp);
257
			$( '#releve-data' ).val( JSON.stringify( this.releveDatas ) );
258
			this.numArbre = this.releveDatas.length - 1;
259
		} else {
260
			this.releveDatas = $.parseJSON( $( '#releve-data' ).val() );
261
			this.releveDatas[0].date                = $( '#releve-date' ).val();
262
			if ( 'tb_lichensgo' !== this.module ) {
263
				this.releveDatas[0]['zone-pietonne']    = $( '#zone-pietonne input:checked' ).val();
264
				this.releveDatas[0]['pres-lampadaires'] = $( '#pres-lampadaires input:checked' ).val();
265
			}
266
			this.releveDatas[0].commentaires        = $( '#commentaires' ).val().trim();
267
			for ( var i = 1 ; i < this.releveDatas.length; i++ ) {
268
				this.releveDatas[i]['date_rue_commune'] = (
269
					this.releveDatas[0].date +
270
					this.releveDatas[0].rue +
271
					this.releveDatas[0]['commune-nom']
272
				);
273
			}
274
			$( '#releve-data' ).val( JSON.stringify( this.releveDatas ) );
275
			//charger les images
276
			this.chargerImgEnregistrees();
277
			this.numArbre = $.parseJSON( $( '#releve-data' ).val() ).length - 1;
278
		}
279
		// transfert carto
280
		// $cartoRemplacee = $( '#tb-geolocation' ),
281
		// layer = 'osm',
282
		// zoomInit = 18
283
		var donnesResetCarto = {
284
			latitude  : $( '#latitude-releve' ).val(),
285
			longitude : $( '#longitude-releve' ).val(),
286
			suffixe   : 'arbres',
287
			layer     : 'google hybrid'
288
		};
289
 
290
		this.transfererCarto( donnesResetCarto );
3427 idir 291
		this.scrollFormTop( '#zone-arbres' );
3425 idir 292
	}
293
};
294
 
295
ReleveASL.prototype.chargerImgEnregistrees = function() {
296
	const releveL = this.releveDatas.length;
297
	var idArbre = 0,
298
		last  = false;
299
 
300
	for ( var i = 1; i < releveL; i++ ) {
301
		idArbre = this.releveDatas[i]['id_observation'];
302
 
303
		var urlImgObs = this.serviceObsImgs + idArbre,
304
			imgDatas  = {
305
				'indice'      : i,
306
				'idArbre'     : idArbre,
307
				'numArbre'    : this.releveDatas[i]['num-arbre'],
308
				'nomRet'      : this.releveDatas[i].taxon.nomRet.replace( /\s/, '_' ),
309
				'releveDatas' : this.releveDatas
310
			};
311
 
312
		if ( ( releveL - 1) === i ) {
313
			last = true;
314
		}
315
		this.chargerImgArbre( urlImgObs, imgDatas, last );
316
	}
317
};
318
 
319
ReleveASL.prototype.chargerImgArbre = function( urlImgObs, imgDatas, last ) {
320
	const lthis   = this;
321
 
322
	$.ajax({
323
		url: urlImgObs,
324
		type: 'GET',
325
		success: function( idsImg, textStatus, jqXHR ) {
326
			if ( lthis.valOk( idsImg ) ) {
327
				var urlImg   = '',
328
					images   = [];
329
 
330
				idsImg = idsImg[parseInt( imgDatas.idArbre )];
331
				$.each( idsImg, function( i, idImg ) {
332
					urlImg = lthis.serviceObsImgUrl.replace( '{id}', '000' + idImg );
333
					images[i] = {
334
						nom : imgDatas.nomRet + '_arbre'+ imgDatas.numArbre +'_image' + ( i + 1 ),
335
						src : urlImg,
336
						b64 :[],
337
						id  : idImg
338
					};
339
				});
340
				imgDatas.releveDatas[imgDatas.indice]['miniature-img'] = images;
341
				$( '#releve-data' ).val( JSON.stringify( imgDatas.releveDatas ) );
342
			} else {
343
				console.dir( lthis.msgTraduction( 'erreur-image' ) + ' : ' + lthis.msgTraduction( 'arbre' ) + ' ' + imgDatas.idArbre );
344
			}
345
		},
346
		error: function( jqXHR, textStatus, errorThrown ) {
347
			console.dir( lthis.msgTraduction( 'erreur-image' ) );
348
		}
349
	})
350
	.always( function() {
351
		if (last) {
352
			lthis.chargerArbres();
353
		}
354
	});
355
};
356
 
357
/**
358
 * Retourne un Array contenant les valeurs des champs
359
 * dont les données seront transmises dans la table cel-obs-etendues
360
 */
361
ReleveASL.prototype.getObsChpSpecifiques = function( datasArbres ) {
362
	const lthis = this;
363
 
364
	var retour = [],
365
		champs = [
366
			'rue',
367
			'latitude-releve',
368
			'longitude-releve',
369
			'altitude-releve'
370
		];
371
 
372
	if ( 'tb_lichensgo' !== this.module ) {
373
		champs.push(
374
			'zone-pietonne',
375
			'pres-lampadaires',
376
			'surface-pied',
377
			'equipement-pied-arbre',
378
			'tassement',
379
			'dejections',
380
			'com-arbres'
381
		);
382
	}
383
	champs.push(
384
		'rue-arbres',
385
		'circonference'
386
	);
387
 
388
	var cleValeur = '';
389
 
390
	$.each( champs, function( i , value ) {
391
		cleValeur = ( 4 > i ) || ( 6 > i && 'tb_lichensgo' !== lthis.module ) ? 'releve' : 'sujet';
392
		if ( lthis.valOk( datasArbres[cleValeur][value] ) ) {
393
			retour.push({ cle : value, valeur : datasArbres[cleValeur][value] });
394
		}
395
	});
396
	if ( 'tb_streets' !== this.module ) {
397
		var faceOmbre = '',
398
			faceOmbreLength = datasArbres.sujet['face-ombre'].length;
399
 
400
		if ( 'string' === typeof datasArbres.sujet['face-ombre'] ) {
401
			faceOmbre = datasArbres.sujet['face-ombre'];
402
		} else {
403
			$.each( datasArbres.sujet['face-ombre'], function( i ,value ) {
404
				faceOmbre += value
405
				if ( faceOmbreLength > ( i + 1 ) ) {
406
					faceOmbre += ';';
407
				}
408
			});
409
		}
410
		retour.push({ cle : 'face-ombre', valeur : faceOmbre });
411
	}
412
	retour.push({ cle : 'num_arbre' , valeur : datasArbres.obsNum });
413
 
414
	var stockerImg  = this.valOk( datasArbres.sujet['miniature-img'] );
415
 
416
	if( stockerImg ) {
417
		$.each( datasArbres.sujet['miniature-img'], function( i, paramsImg ) {
418
			if( !paramsImg.hasOwnProperty( 'id' ) ) {
419
				stockerImg = false;
420
			}
421
			return stockerImg;
422
		});
423
	}
424
	if( stockerImg ) {
425
		retour.push({ cle : 'miniature-img' , valeur : JSON.stringify( datasArbres.sujet['miniature-img'] ) });
426
	}
427
	return retour;
428
};
429
 
430
ReleveASL.prototype.chargerInfosArbre = function( numArbre ) {
431
	const lthis = this;
432
 
433
	var desactiverForm = ( parseInt( numArbre ) !== ( this.numArbre + 1 ) );
434
 
435
	if ( desactiverForm ) {
436
		var releveDatas = $.parseJSON( $( '#releve-data' ).val() ),
437
			arbreDatas  = releveDatas[numArbre],
438
			taxon       = {item:{}},
439
			imgHtml     = '';
440
 
441
		$( '#arbre-nb' ).text( numArbre + ' (visualisation)' );
442
		taxon.item = arbreDatas.taxon;
443
		this.surAutocompletionTaxon( {}, taxon );
444
 
445
		var selects = [ 'certitude' ];
446
 
447
		if ( 'tb_lichensgo' !== this.module ) {
448
			selects.push( 'equipement-pied-arbre', 'tassement' );
449
		}
450
		$.each( selects, function( i, value ) {
451
			if( !lthis.valOk( arbreDatas[value] ) ) {
452
				arbreDatas[value] = '';
453
			}
454
			if ( $( this ).hasClass( 'other' ) && lthis.valOk( $( this ).val() ) ) {
455
				$( this ).text( $( this ).val() );
456
			}
457
			$( '#' + value + ' option' ).each( function() {
458
				if ( arbreDatas[value] === $( this ).val() ) {
459
					$( this ).prop( 'selected', true );
460
				} else {
461
					$( this ).prop( 'selected', false );
462
				}
463
			});
464
		});
465
		$( '#rue-arbres' ).val( arbreDatas['rue-arbres'] );
466
		$( '#latitude-arbres' ).val( arbreDatas['latitude-arbres'] );
467
		$( '#longitude-arbres' ).val( arbreDatas['longitude-arbres'] );
468
		$( '#altitude-arbres' ).val( arbreDatas['altitude-arbres'] );
469
		// image
470
		this.supprimerMiniatures();
471
		$.each( arbreDatas['miniature-img'], function( i, value ) {
472
			imgHtml +=
473
			'<div class="miniature mb-3 mr-3">'+
474
				'<img class="miniature-img" class="miniature img-rounded" alt="' + value.nom + '" src="' + value.src + '"/>'+
475
			'</div>';
476
		});
477
		$( '#miniatures' ).append( imgHtml );
478
		$( '#circonference' ).val( arbreDatas.circonference );
479
		$( '#com-arbres' ).val( arbreDatas['com-arbres'] );
480
		if ( 'tb_lichensgo' !== this.module ) {
481
			$( '#surface-pied' ).val( arbreDatas['surface-pied'] );
482
			if ( undefined != arbreDatas.dejections ) {
483
				$( '#dejections-oui' ).prop( 'checked', arbreDatas.dejections );
484
				$( '#dejections-non' ).prop( 'checked', !arbreDatas.dejections );
485
			}
486
		}
487
		if ( 'tb_streets' !== this.module ) {
488
			$( '#face-ombre input' ).each( function() {
489
				if ( -1 < arbreDatas['face-ombre'].indexOf( $( this ).val() ) ) {
490
					$( this ).prop( 'checked', true );
491
				} else {
492
					$( this ).prop( 'checked', false );
493
				}
494
			});
495
		}
496
	}
497
	this.modeArbresBasculerActivation( desactiverForm, numArbre );
498
};
499
 
500
ReleveASL.prototype.modeArbresBasculerActivation = function( desactiver, numArbre = 0 ) {
501
	var selecteurs =
502
		'#taxon,'+
503
		'#certitude,'+
504
		'#latitude-arbres,'+
505
		'#longitude-arbres,'+
506
		'#rue-arbres,'+
507
		'#fichier,'+
508
		'#circonference,'+
509
		'#com-arbres,'+
510
		'#ajouter-obs';
511
 
512
	if ( 'tb_lichensgo' !== this.module ) {
513
		selecteurs +=
514
			',#equipement-pied-arbre,'+
515
			'#tassement,'+
516
			'#surface-pied';
517
		$( '#dejections' ).find( 'input' ).prop( 'disabled', desactiver );
518
	}
519
	$( selecteurs ).prop( 'disabled', desactiver );
520
	if ( 'tb_streets' !== this.module ) {
521
		$( '#face-ombre' ).find( 'input' ).prop( 'disabled', desactiver );
522
	}
523
	if ( desactiver ) {
524
		$( '#geoloc-arbres,#bouton-fichier,#miniature-info' ).addClass( 'hidden' );
525
		$( '#geoloc-datas-arbres,#retour' ).removeClass( 'hidden' );
526
	} else {
527
		// quand on change ou qu'on revient à la normale :
528
		$( '#geoloc-arbres,#bouton-fichier,#miniature-info' ).removeClass( 'hidden' );
529
		$( '#geoloc-datas-arbres,#retour' ).addClass( 'hidden' );
530
		// reset carto
531
		// typeLocalisation = 'point',
532
		// zoomInit = 18
533
		var donnesResetCarto = {
534
			cartoRemplacee : $( '#tb-geolocation-arbres' ),
535
			latitude : $( '#latitude-releve' ).val(),
536
			longitude : $( '#longitude-releve' ).val(),
537
			suffixe : 'arbres',
538
			layer : 'google hybrid'
539
		};
540
		this.transfererCarto( donnesResetCarto );
541
		// retour aux valeurs par defaut
542
		selecteurs = '#certitude option';
543
		if ( 'tb_lichensgo' !== this.module ) {
544
			selecteurs += ',#equipement-pied-arbre option,#tassement option';
545
			$( '#equipement-pied-arbre .other' ).text( 'Autre' ).val( 'other' );
546
			$( '#collect-other-equipement-pied-arbre' ).closest( '.control-group' ).remove();
547
			$( '#dejections' ).find( 'input' ).prop( 'checked', false );
548
		}
549
		if ( 'tb_streets' !== this.module ) {
550
			$( '#face-ombre' ).find( 'input' ).prop( 'checked', false );
551
		}
552
		$( selecteurs ).each( function() {
553
			if ( $( this ).hasClass( 'choisir' ) ) {
554
				$( this ).prop( 'selected', true );
555
			} else {
556
				$( this ).prop( 'selected', false );
557
			}
558
		});
559
		this.supprimerMiniatures();
560
		selecteurs =
561
			'#circonference,'+
562
			'#com-arbres,'+
563
			'#rue-arbres,'+
564
			'#latitude-arbres,'+
565
			'#longitude-arbres,'+
566
			'#certitude';
567
		if ( 'tb_lichensgo' !== this.module ) {
568
			selecteurs +=
569
			',#equipement-pied-arbre,'+
570
			'#tassement,'+
571
			'#surface-pied';
572
		}
573
		$( selecteurs ).val( '' );
574
		if( 0 < numArbre ) {
575
			$( '#arbre-nb' ).text( numArbre );
576
			$( '#arbre-info-lien-' + numArbre ).addClass( 'disabled' );
577
			$( '.arbre-info' ).not( '#arbre-info-lien-' + numArbre ).removeClass( 'disabled' );
578
		}
579
	}
580
};
581
 
582
/*
583
 * Actualise l'id_observation ( id de l'obs en bdd )
584
 * à partir des données renvoyées par le service après transfert
585
 */
586
ReleveASL.prototype.actualiserReleveDataIdObs = function( obsId, id_observation ) {
587
	this.releveData  = $.parseJSON( $( '#releve-data' ).val() );
588
	this.releveData[obsId ]['id_observation'] = id_observation;
589
	$( '#releve-data' ).val( JSON.stringify( this.releveData ) );
590
};
591
 
592
// Géolocalisation *************************************************************/
593
/**
594
 * Fonction handler de l'évenement location du module tb-geoloc
595
 */
596
ReleveASL.prototype.locationHandler = function( location ) {
597
	const lthis = this;
598
	var isGeolocArbres = ( 'tb-geolocation-arbres' === location.target.id ),
599
		locDatas       = location.originalEvent.detail;
600
 
601
	if ( this.valOk( locDatas ) ) {
602
		console.dir( locDatas );
603
 
604
		var rue          = ( this.valOk( locDatas.osmRoad ) ) ? locDatas.osmRoad : '';
605
		var altitude     = ( this.valOk( locDatas.elevation ) ) ? locDatas.elevation : '';
606
		var pays         = ( this.valOk( locDatas.osmCountryCode ) ) ? locDatas.osmCountryCode.toUpperCase() : 'FR';
607
		var latitude     = '';
608
		var longitude    = '';
609
		var nomCommune   = '';
610
		var	communeInsee = '';
611
 
612
		if ( this.valOk( locDatas.geometry.coordinates ) ) {
613
			if ( 'Point' === locDatas.geometry.type ) {
614
				if ( this.valOk( locDatas.geometry.coordinates[0] ) ) {
615
					longitude = locDatas.geometry.coordinates[0];
616
				}
617
				if ( this.valOk( locDatas.geometry.coordinates[1] ) ) {
618
					latitude = locDatas.geometry.coordinates[1];
619
				}
620
			} else if ( 'LineString' === locDatas.geometry.type ) {// on a besoin que d'un point de la rue
621
				if ( this.valOk( locDatas.geometry.coordinates[0][0] ) ) {
622
					longitude = locDatas.geometry.coordinates[0][0];
623
				}
624
				if ( this.valOk( locDatas.geometry.coordinates[0][1] ) ){
625
					latitude = locDatas.geometry.coordinates[0][1];
626
				}
627
			}
628
		}
629
		if ( !isGeolocArbres ) {
630
			if ( this.valOk( locDatas.inseeData ) ) {
631
				nomCommune = locDatas.inseeData.nom;
632
				communeInsee = ( this.valOk( locDatas.inseeData.code ) ) ? locDatas.inseeData.code : '';
633
			} else if ( this.valOk( locDatas.locality ) ) {
634
				nomCommune = locDatas.locality;
635
			} else if ( this.valOk( locDatas.osmCounty ) ) {
636
				nomCommune = locDatas.osmCounty;
637
			}
638
			$( '#rue' ).val( rue );
639
			$( '#latitude-releve' ).val( latitude );
640
			$( '#longitude-releve' ).val( longitude );
641
			$( '#commune-nom' ).val( nomCommune );
642
			$( '#commune-insee' ).val( communeInsee );
643
			$( '#altitude-releve' ).val( altitude );
644
			$( '#pays' ).val( pays );
645
			if ( this.valOk( $( '#rue' ).val() ) && this.valOk( $( '#commune-nom' ).val() ) ) {
646
				$( '#geoloc-error' ).addClass( 'hidden' );
647
				$( '#geoloc-datas' ).closest( '.control-group' ).removeClass( 'error' );
648
			} else {
649
				$( '#rue,#commune-nom' ).prop( 'disabled', false );
650
				$( '#geoloc-datas' )
651
					.removeClass( 'hidden' )
652
					.closest( '.control-group' )
653
						.addClass( 'error' );
654
				$( '#geoloc-error' ).removeClass( 'hidden' );
655
				$( '#releve-date' )
656
					.removeClass( 'erreur' )
657
					.closest( '.control-group' )
658
						.removeClass( 'error' )
659
						.find( '#error-drc' )
660
							.remove();
661
			}
662
			$( '#rue,#commune-nom' ).change( function() {
663
				if ( lthis.valOk( $( '#rue' ).val() ) && lthis.valOk( $( '#commune-nom' ).val() ) ) {
664
					$( '#geoloc-error' ).addClass( 'hidden' );
665
				} else {
666
					$( '#geoloc-error' ).removeClass( 'hidden' );
667
				}
668
			});
669
		} else {
670
			$( '#rue-arbres' ).val( rue );
671
			$( '#latitude-arbres' ).val( latitude );
672
			$( '#longitude-arbres' ).val( longitude );
673
			$( '#altitude-arbres' ).val( altitude );
674
			if ( this.valOk( $( '#latitude-arbres' ).val() ) && this.valOk( $( '#longitude-arbres' ).val() ) ) {
675
				$( '#geoloc-arbres' ).closest( '.control-group' ).removeClass( 'error' );
676
			} else {
677
				$( '#geoloc-arbres' ).closest( '.control-group' ).addClass( 'error' );
678
			}
679
		}
680
	} else {
681
		console.dir( 'Error location' );
682
	}
683
};
684
 
685
// Form Validator *************************************************************/
686
ReleveASL.prototype.validerMinMax = function( element ) {
687
	var mMCond      = new Boolean(),
688
		minCond     = parseFloat( element.value ) >= parseFloat( element.min ),
689
		maxCond     = parseFloat( element.value ) <= parseFloat( element.max ),
690
		messageMnMx = 'La valeur entrée doit être',
691
		returnMnMx  = { cond : true , message : '' };
692
 
693
	if (
694
			( this.valOk( element.type, true, 'number' ) || this.valOk( element.type, true, 'range' ) ) &&
695
			( this.valOk( element.min ) || this.valOk( element.max ) )
696
		) {
697
 
698
		if ( element.min && element.max ) {
699
			messageMnMx += ' comprise entre ' + element.min + ' et ' + element.max;
700
			mnMxCond     = ( minCond && maxCond );
701
		} else if ( element.min ) {
702
			messageMnMx += ' supérieure à ' + element.min;
703
			mnMxCond     = minCond;
704
		} else {
705
			messageMnMx += ' inférieure à ' + element.max;
706
			mnMxCond     = maxCond;
707
		}
708
		returnMnMx.cond    = mnMxCond;
709
		returnMnMx.message = messageMnMx;
710
	}
711
 
712
	return returnMnMx;
713
};
714
 
715
/**
716
 * Valider date/rue/commune par rapport aux relevés précédents
717
 */
718
ReleveASL.prototype.validerDateRueCommune = function( valeurDate, valeurRue, valeurCmn ) {
719
	var valide = true;
720
 
721
	if (
722
		this.valOk( $( '#dates-rues-communes' ).val() ) &&
723
		this.valOk( valeurDate ) &&
724
		this.valOk( valeurRue ) &&
725
		this.valOk( valeurCmn )
726
	) {
727
		var valsEltDRC = $.parseJSON( $( '#dates-rues-communes' ).val() ),
728
			valeurDRC = valeurDate + valeurRue + valeurCmn;
729
		valide = ( -1 === valsEltDRC.indexOf( valeurDRC ) );
730
 
731
	}
732
	return valide;
733
};
734
 
735
/**
736
 * FormValidator pour les champs date/rue/Commune
737
 */
738
ReleveASL.prototype.dateRueCommuneFormValidator = function() {
739
	var dateValid    = ( /^(?:[0-9]{4}-[0-9]{2}-[0-9]{2})|(?:[0-9]{2}\/[0-9]{2}\/[0-9]{4})$/.test( $( '#releve-date' ).val() ) ),
740
		geolocValid  = ( this.valOk( $( '#commune-nom' ).val() ) && this.valOk( $( '#rue' ).val() ) );
741
	const errorDateRue =
742
			'<span id="error-drc" class="error">'+
743
				this.msgTraduction( 'date-rue' )+
744
			'</span> ';
745
 
746
	if( this.validerDateRueCommune( $( '#releve-date' ).val(), $( '#rue' ).val(), $( '#commune-nom' ).val()  ) ) {
747
		$( '#releve-date' )
748
			.removeClass( 'erreur' )
749
			.closest( '.control-group' )
750
				.removeClass( 'error' )
751
				.find( '#error-drc' )
752
					.remove();
753
		if ( geolocValid ) {
754
			$( '#geoloc' )
755
			.closest( '.control-group' )
756
				.removeClass( 'error' );
757
		}
758
	} else {
759
		$( '#releve-date' )
760
			.addClass( 'erreur' )
761
			.closest( '.control-group' )
762
				.addClass( 'error' );
763
		if ( !this.valOk( $( '#releve-date' ).closest( '.control-group' ).find( '#error-drc' ) ) ) {
764
			$( '#releve-date' ).after( errorDateRue );
765
		}
766
		$( '#geoloc' ).closest( '.control-group' ).addClass( 'error' );
767
	}
768
	if ( dateValid ) {
769
		$( '#releve-date' ).closest( '.control-group span.error' ).not( '#error-drc' ).remove();
770
	}
771
};
772
 
773
ReleveASL.prototype.definirReglesFormValidator = function() {
774
	const lthis = this;
775
 
776
	$( '#form-observation' ).validate({
777
		rules : {
778
			'zone-pietonne' : {
779
				required : function() {
780
					return( 'tb_lichensgo' !== this.module );
781
				},
782
				minlength : 1
783
			},
784
			'latitude-releve' : {
785
				required : true,
786
				minlength : 1,
787
				range : [-90, 90]
788
			},
789
			'longitude-releve' : {
790
				required : true,
791
				minlength : 1,
792
				range : [-180, 180]
793
			}
794
		}
795
	});
796
	$( 'input[type=date]' ).not( '#releve-date' ).on( 'input', function() {
797
		$( this ).valid();
798
	});
799
	// validation date/rue/commune au démarage
800
	this.dateRueCommuneFormValidator();
801
	// validation date/rue/commune sur event
802
	$( '#releve-date,#rue,#commune-nom' ).on( 'change input focusout', this.dateRueCommuneFormValidator.bind( this ) );
803
	$( '#form-arbres' ).validate({
804
		rules : {
805
			taxon : {
806
				required : true,
807
				minlength : 1
808
			},
809
			certitude : {
810
				required : true,
811
				minlength : 1
812
			},
813
			'latitude-arbres' : {
814
				required : true,
815
				minlength : 1,
816
				range : [-90, 90]
817
			},
818
			'longitude-arbres' : {
819
				required : true,
820
				minlength : 1,
821
				range : [-180, 180]
822
			}
823
		}
824
	});
825
	$( '#form-arbre-fs' ).validate({
826
		onkeyup : false,
827
		onclick : false,
828
		rules : {
829
			circonference : {
830
				required : true,
831
				minlength : 1
832
			},
833
			'surface-pied' : {
834
				required :  function() {
835
					return( 'tb_lichensgo' !== this.module );
836
				},
837
				minlength : 1,
838
				'minMaxOk' : true
839
			},
840
			'equipement-pied-arbre' : {
841
				required :  function() {
842
					return( 'tb_lichensgo' !== this.module );
843
				},
844
				minlength : 1
845
			},
846
			'face-ombre' : {
847
				required :  function() {
848
					return( 'tb_streets' !== this.module );
849
				},
850
				minlength : 1
851
			}
852
		}
853
	});
854
	$( '#form-observateur' ).validate({
855
		rules : {
856
			courriel : {
857
				required : true,
858
				minlength : 1,
859
				email : true,
860
				'userEmailOk' : true
861
			},
862
			mdp : {
863
				required : true,
864
				minlength : 1
865
			}
866
		}
867
	});
868
	if ( 'tb_lichensgo' !== this.module ) {
869
		$( '#equipement-pied-arbre' ).change( function() {
870
			if ( lthis.valOk( $( this ).val(), false, 'other' ) ) {
871
				$( this )
872
					.closest( '.control-group' )
873
						.removeClass( 'error' )
874
						.find( 'span.error' )
875
							.addClass( 'hidden' );
876
			}
877
		});
878
	}
879
	if ( 'tb_streets' !== this.module ) {
880
		$( '#face-ombre input' ).on( 'click', function() {
881
			var oneIsChecked = false;
882
			$( '#face-ombre input' ).each( function() {
883
				if ( $( this ).is( ':checked' ) ) {
884
					oneIsChecked = true;
885
					return false;
886
				}
887
			});
888
			if ( oneIsChecked ) {
889
				$( '#face-ombre.control-group' )
890
					.removeClass( 'error' )
891
					.find( 'span.error' )
892
						.addClass( 'hidden' );
893
			} else {
894
				$( '#face-ombre.control-group' )
895
					.addClass( 'error' )
896
					.find( 'span.error' )
897
						.removeClass( 'hidden' );
898
			}
899
		});
900
	}
901
	$( '#connexion,#inscription,#oublie' ).on( 'click', function() {
902
		$( '#tb-observateur .control-group' ).removeClass( 'error' );
903
	});
904
};
905
 
906
/**
907
 * Valide le formulaire Relevé (= étape 1) au click sur un bouton "enregistrer"
908
 */
909
ReleveASL.prototype.validerReleve = function() {
910
	const observateur = ( $( '#form-observateur' ).valid() && $( '#courriel' ).valid() )
911
	const obs         = $( '#form-observation' ).valid();
912
	const geoloc      = (
913
		this.valOk( $( '#latitude-releve' ).val() ) &&
914
		this.valOk( $( '#longitude-releve' ).val() ) &&
915
		this.valOk( $( '#rue' ).val() ) &&
916
		this.valOk( $( '#commune-nom' ).val() )
917
	) ;
918
	var dateRue = true;
919
	if ( this.valOk( $( '#dates-rues-communes' ).val() ) ) {
920
		dateRue = (
921
			this.valOk( $( '#releve-date' ).val() ) &&
922
			this.valOk( $( '#rue' ).val() ) &&
923
			this.validerDateRueCommune( $( '#releve-date' ).val(), $( '#rue' ).val(), $( '#commune-nom' ).val() )
924
		);
925
	}
926
	if ( !obs ) {
927
		this.scrollFormTop( '#zone-observation' );
928
	}
929
	// panneau observateur
930
	if ( observateur ) {
931
		this.masquerPanneau( '#dialogue-utilisateur-non-identifie' );
932
		$( '#tb-observateur .control-group' ).removeClass( 'error' );
933
	} else {
934
		this.afficherPanneau( '#dialogue-utilisateur-non-identifie' );
935
		$( '#tb-observateur .control-group' ).addClass( 'error' );
936
	}
937
	if ( dateRue && geoloc ) {
938
		this.masquerPanneau( '#dialogue-date-rue-ko' );
939
		$( '#geoloc-datas' ).closest( '.control-group' ).removeClass( 'error' );
940
	} else {
941
		if (
942
			this.valOk( $( '#releve-date' ).val() ) &&
943
			this.valOk( $( '#rue' ).val() ) &&
944
			this.valOk( $( '#dates-rues-communes' ).val() )
945
		) {
946
			this.afficherPanneau( '#dialogue-date-rue-ko' );
947
		}
948
		$( '#geoloc-datas' ).closest( '.control-group' ).addClass( 'error' );
949
	}
950
	if (
951
		!this.valOk( $( '#releve-date' ).val() ) ||
952
		!this.valOk( $( '#rue' ).val() ) ||
953
		!this.valOk( $( '#dates-rues-communes' ).val() )
954
	) {
955
		this.masquerPanneau( '#dialogue-date-rue-ko' );
956
	}
957
	if ( geoloc ) {
958
		this.masquerPanneau( '#dialogue-geoloc-ko' );
959
		if ( dateRue ) {
960
			$( '#geoloc' ).closest( '.control-group' ).removeClass( 'error' );
961
		}
962
	} else {
963
		this.afficherPanneau( '#dialogue-geoloc-ko' );
964
		$( '#geoloc' ).closest( '.control-group' ).addClass( 'error' );
965
	}
966
 
967
	return  (observateur && obs && geoloc && dateRue);
968
};
969
 
970
/**
971
 * Valide le formulaire Arbres (= étape 2) au click sur un bouton "suivant"
972
 */
973
ReleveASL.prototype.validerForm = function() {
974
	const validerReleve = this.validerReleve();
975
	const geoloc      = (
976
		this.valOk( $( '#latitude-arbres' ).val() ) &&
977
		this.valOk( $( '#longitude-arbres' ).val() )
978
	);
979
	const taxon = this.valOk( $( '#taxon' ).val() );
980
	var piedArbre = true;
981
 
982
	if ( 'tb_lichensgo' !== this.module ) {
983
		piedArbre = this.valOk( $( '#equipement-pied-arbre' ).val(), false, 'other' );
984
		if ( piedArbre ) {
985
			$( '#equipement-pied-arbre' )
986
				.closest( '.control-group' )
987
					.removeClass( 'error' )
988
					.find( 'span.error' )
989
						.addClass( 'hidden' );
990
		} else {
991
			$( '#equipement-pied-arbre' )
992
				.closest( '.control-group' )
993
					.addClass( 'error' )
994
					.find( 'span.error' )
995
						.removeClass( 'hidden' );
996
		}
997
	}
998
 
999
	const obs   = (
1000
		$( '#form-arbres' ).valid() &&
1001
		$( '#form-arbre-fs' ).valid() &&
1002
		piedArbre
1003
	);
1004
 
1005
	if ( geoloc ) {
1006
		this.masquerPanneau( '#dialogue-geoloc-ko' );
1007
		$( '#geoloc-arbres' ).closest( '.control-group' ).removeClass( 'error' );
1008
	} else {
1009
		this.afficherPanneau( '#dialogue-geoloc-ko' );
1010
		$( '#geoloc-arbres' ).closest( '.control-group' ).addClass( 'error' );
1011
	}
1012
 
1013
	return ( validerReleve && obs && geoloc && taxon );
1014
};