Subversion Repositories eFlore/Applications.cel

Rev

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

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