Subversion Repositories eFlore/Applications.cel

Rev

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