Rev 2440 | Blame | Compare with Previous | Last modification | View Log | RSS feed
//+---------------------------------------------------------------------------------------------------------+// GÉNÉRAL$(document).ready(function() {if (DEBUG == false) {$(window).on('beforeunload', function(event) {return 'Êtes vous sûr de vouloir quiter la page?\nLes observations saisies mais non transmises seront perdues.';});}});//+----------------------------------------------------------------------------------------------------------+// FONCTIONS GÉNÉRIQUES/*** Stope l'évènement courrant quand on clique sur un lien.* Utile pour Chrome, Safari...* @param evenement* @return*/function arreter(evenement) {if (evenement.stopPropagation) {evenement.stopPropagation();}if (evenement.preventDefault) {evenement.preventDefault();}return false;}function extraireEnteteDebug(jqXHR) {var msgDebug = '';if (jqXHR.getResponseHeader('X-DebugJrest-Data') != '') {var debugInfos = jQuery.parseJSON(jqXHR.getResponseHeader('X-DebugJrest-Data'));if (debugInfos != null) {$.each(debugInfos, function (cle, valeur) {msgDebug += valeur + "\n";});}}return msgDebug;}function afficherPanneau(selecteur) {$(selecteur).fadeIn('slow').delay(DUREE_MESSAGE).fadeOut('slow');}//+---------------------------------------------------------------------------------------------------------+//FORMULAIRE$(document).ready(function() {if (OBS_ID != '') {chargerInfoObs();}});function chargerInfoObs() {var urlObs = SERVICE_OBS_URL + '/' + OBS_ID;$.ajax({url: urlObs,type: 'GET',success: function(data, textStatus, jqXHR) {if (data != undefined && data != '') {prechargerForm(data);}// TODO: voir s'il est pertinent d'indiquer quelque chose en cas d'erreur ou d'obs// inexistante},error: function(jqXHR, textStatus, errorThrown) {// TODO: cf TODO ci-dessus}});}function prechargerForm(data) {$('#milieu').val(data.milieu);$('#carte-recherche').val(data.zoneGeo);$('#commune-nom').text(data.zoneGeo);if (data.hasOwnProperty('codeZoneGeo')) {// TODO: trouver un moyen qui fonctionne lorsqu'on aura d'autres référentiels que INSEE$('#commune-code-insee').text(data.codeZoneGeo.replace('INSEE-C:', ''));}if (data.hasOwnProperty('latitude') && data.hasOwnProperty('longitude')) {var latLng = new google.maps.LatLng(data.latitude, data.longitude);mettreAJourMarkerPosition(latLng);marker.setPosition(latLng);map.setCenter(latLng);map.setZoom(16);}}//+----------------------------------------------------------------------------------------------------------+//FORM IDENTITE : gestion de l'observateur$(document).ready(function() {requeterIdentite();// Sur rechargement de la page// Interaction sur le formulaire observateur$('#prenom').on('change', formaterPrenom);$('#nom').on('change', formaterNom);$('#courriel').on('blur', requeterIdentite);$('#courriel').on('keyup', testerLancementRequeteIdentite);$('#courriel_confirmation').on('paste', bloquerCopierCollerCourriel);});function testerLancementRequeteIdentite(event) {if (event.which == 13) {requeterIdentite();event.preventDefault();event.stopPropagation();}}function requeterIdentite() {var courriel = $('#courriel').val();if (courriel) {var urlAnnuaire = SERVICE_ANNUAIRE_ID_URL + courriel;$.ajax({url: urlAnnuaire,type: 'GET',success: function(data, textStatus, jqXHR) {if (data != undefined && data[courriel] != undefined) {var infos = data[courriel];surSuccesCompletionCourriel(infos, courriel);} else {surErreurCompletionCourriel();}},error: function(jqXHR, textStatus, errorThrown) {surErreurCompletionCourriel();},complete: function(jqXHR, textStatus) {$('#zone-courriel-confirmation, #zone-prenom-nom').removeClass('hidden');$('#form-observateur').valid();}});}}function surErreurCompletionCourriel() {$('#prenom, #nom, #courriel_confirmation').removeAttr('disabled');afficherPanneau('#dialogue-courriel-introuvable');}function surSuccesCompletionCourriel(infos, courriel) {$('#id_utilisateur').val(infos.id);$('#prenom').val(infos.prenom);$('#nom').val(infos.nom);$('#courriel_confirmation').val(courriel);$('#prenom, #nom, #courriel_confirmation').attr('disabled', 'disabled');$('#dialogue-courriel-introuvable').hide();}function formaterNom() {$(this).val($(this).val().toUpperCase());}function formaterPrenom() {var prenom = new Array(),mots = $(this).val().split(' ');for (var i = 0; i < mots.length; i++) {var mot = mots[i];if (mot.indexOf('-') >= 0) {var prenomCompose = new Array(),motsComposes = mot.split('-');for (var j = 0; j < motsComposes.length; j++) {var motSimple = motsComposes[j],motMajuscule = motSimple.charAt(0).toUpperCase() + motSimple.slice(1);prenomCompose.push(motMajuscule);}prenom.push(prenomCompose.join('-'));} else {var motMajuscule = mot.charAt(0).toUpperCase() + mot.slice(1);prenom.push(motMajuscule);}}$(this).val(prenom.join(' '));}function bloquerCopierCollerCourriel() {afficherPanneau('#dialogue-bloquer-copier-coller');return false;}//+----------------------------------------------------------------------------------------------------------+// GOOGLE MAPvar map,marker,latLng,geocoder;$(document).ready(function() {initialiserGoogleMap();initialiserAutocompleteCommune();});function afficherErreurGoogleMap(status) {if (DEBUG) {$('#dialogue-google-map .contenu').empty().append('<pre class="msg-erreur">'+"Le service de Géocodage de Google Map a échoué à cause de l'erreur : "+status+'</pre>');afficherPanneau('#dialogue-google-map');}}function surDeplacementMarker() {mettreAJourMarkerPosition(marker.getPosition());}function surClickDansCarte(event) {deplacerMarker(event.latLng);}function geolocaliser() {var latitude = $('#latitude').val(),longitude = $('#longitude').val();latLng = new google.maps.LatLng(latitude, longitude);deplacerMarker(latLng);}function initialiserGoogleMap(){// Cartevar latLng = new google.maps.LatLng(46.30871, 2.54395);// Centre de la Francevar zoomDefaut = 5;var options = {zoom: zoomDefaut,center: latLng,mapTypeId: google.maps.MapTypeId.HYBRID,mapTypeControlOptions: {mapTypeIds: ['OSM', google.maps.MapTypeId.ROADMAP, google.maps.MapTypeId.HYBRID, google.maps.MapTypeId.SATELLITE, google.maps.MapTypeId.TERRAIN]}};// Ajout de la couche OSM à la carteosmMapType = new google.maps.ImageMapType({getTileUrl: function(coord, zoom) {return 'http://tile.openstreetmap.org/' +zoom + '/' + coord.x + '/' + coord.y + '.png';},tileSize: new google.maps.Size(256, 256),isPng: true,alt: 'OpenStreetMap',name: 'OSM',maxZoom: 19});// Création de la carte Googlemap = new google.maps.Map(document.getElementById('map-canvas'), options); //affiche la google map dans la div map_canvasmap.mapTypes.set('OSM', osmMapType);// Création du Geocodergeocoder = new google.maps.Geocoder();// Marqueur google draggablemarker = new google.maps.Marker({map: map,draggable: true,title: 'Ma station',icon: GOOGLE_MAP_MARQUEUR_URL,position: latLng});initialiserMarker(latLng);// Tentative de geocalisationif (navigator.geolocation) {navigator.geolocation.getCurrentPosition(function(position) {var latitude = position.coords.latitude;var longitude = position.coords.longitude;latLng = new google.maps.LatLng(latitude, longitude);deplacerMarker(latLng);});}// intéraction carte$('#geolocaliser').on('click', geolocaliser);google.maps.event.addListener(marker, 'dragend', surDeplacementMarker);google.maps.event.addListener(map, 'click', surClickDansCarte);}function initialiserMarker(latLng) {if (marker != undefined) {marker.setPosition(latLng);map.setCenter(latLng);mettreAJourMarkerPosition(latLng);}}function deplacerMarker(latLng) {if (marker != undefined) {marker.setPosition(latLng);map.setCenter(latLng);mettreAJourMarkerPosition(latLng);}}function mettreAJourMarkerPosition(latLng) {trouverCommune(latLng);trouverAltitude(latLng);var lat = latLng.lat().toFixed(5),lng = latLng.lng().toFixed(5);remplirChampLatitude(lat);remplirChampLongitude(lng);remplirChampsLambert93(lat, lng);}function remplirChampLatitude(latDecimale) {var lat = Math.round(latDecimale * 100000) / 100000;$('#latitude').val(lat);}function remplirChampLongitude(lngDecimale) {var lng = Math.round(lngDecimale * 100000) / 100000;$('#longitude').val(lng);}proj4.defs([['EPSG:4326', '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'],['EPSG:2154', '+title=RGF93 / Lambert-93 +proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs']]);function remplirChampsLambert93(lat, lng) {// Prendre en compte l'initialisation des projectionsvar coordinate = {x: lng,y: lat};proj4(proj4.defs('EPSG:4326'), proj4.defs('EPSG:2154')).forward(coordinate);$('#l93-x').val(coordinate.x.toFixed(0));$('#l93-y').val(coordinate.y.toFixed(0));}function trouverAltitude(pos) {$(function() {var url_service = SERVICE_ALTITUDE_URL,urlAltFormatee = url_service.replace('{lat}', pos.lat()).replace('{lon}', pos.lng());$.ajax({url: urlAltFormatee,type: 'GET',dataType: 'jsonp',beforeSend : function() {$('#altitude').empty();$('#dialogue-erreur .alert-txt').empty();},success : function(data, textStatus, jqXHR) {$('#altitude').empty().append(data.altitude);$('#marqueur-altitude').data('altitude', data.altitude);},statusCode : {500 : function(jqXHR, textStatus, errorThrown) {if (DEBUG) {$('#dialogue-erreur .alert-txt').append('<p id="msg">Un problème est survenu lors de l\'appel au service fournissant l\'altitude.</p>');reponse = jQuery.parseJSON(jqXHR.responseText);var erreurMsg = '';if (reponse != null) {$.each(reponse, function (cle, valeur) {erreurMsg += valeur + '<br />';});}$('#dialogue-erreur .alert-txt').append('<p class="msg-erreur">Erreur 500 : '+errorThrown+"<br />"+erreurMsg+'</p>');}}},error : function(jqXHR, textStatus, errorThrown) {if (DEBUG) {$("#dialogue-erreur .alert-txt").append('<p class="msg">Une erreur Ajax est survenue lors de l\'appel au service fournissant l\'altitude.</p>');reponse = jQuery.parseJSON(jqXHR.responseText);var erreurMsg = '';if (reponse != null) {$.each(reponse, function (cle, valeur) {erreurMsg += valeur + '<br />';});}$('#dialogue-erreur .alert-txt').append('<p class="msg-erreur">Erreur Ajax : '+errorThrown+' (type : '+textStatus+') <br />'+erreurMsg+'</p>');}},complete : function(jqXHR, textStatus) {var debugMsg = extraireEnteteDebug(jqXHR);if (debugMsg != '') {if (DEBUG) {$('#dialogue-erreur .alert-txt').append('<pre class="msg-debug msg">Débogage : '+debugMsg+'</pre>');}}if ($('#dialogue-erreur .msg').length > 0) {$('#dialogue-erreur').show();}}});});}function trouverCommune(pos) {$(function() {var url_service = SERVICE_NOM_COMMUNE_URL,urlNomCommuneFormatee = url_service.replace('{lat}', pos.lat()).replace('{lon}', pos.lng());$.ajax({url: urlNomCommuneFormatee,type: 'GET',dataType: 'jsonp',beforeSend : function() {$('.commune-info').empty();$('#dialogue-erreur .alert-txt').empty();},success : function(data, textStatus, jqXHR) {$('.commune-info').empty();$('#commune-nom').append(data.nom);$('#commune-code-insee').append(data.codeINSEE);$('#marqueur-commune').data('commune', {'nom' : data.nom, 'codeInsee' : data.codeINSEE});},statusCode : {500 : function(jqXHR, textStatus, errorThrown) {if (DEBUG) {$('#dialogue-erreur .alert-txt').append('<p id="msg">Un problème est survenu lors de l\'appel au service fournissante le nom des communes.</p>');reponse = jQuery.parseJSON(jqXHR.responseText);var erreurMsg = '';if (reponse != null) {$.each(reponse, function (cle, valeur) {erreurMsg += valeur + '<br />';});}$('#dialogue-erreur .alert-txt').append('<p class="msg-erreur">Erreur 500 : '+errorThrown+"<br />"+erreurMsg+'</p>');}}},error : function(jqXHR, textStatus, errorThrown) {if (DEBUG) {$("#dialogue-erreur .alert-txt").append('<p class="msg">Une erreur Ajax est survenue lors de la transmission de vos observations.</p>');reponse = jQuery.parseJSON(jqXHR.responseText);var erreurMsg = '';if (reponse != null) {$.each(reponse, function (cle, valeur) {erreurMsg += valeur + '<br />';});}$('#dialogue-erreur .alert-txt').append('<p class="msg-erreur">Erreur Ajax : '+errorThrown+' (type : '+textStatus+') <br />'+erreurMsg+'</p>');}},complete : function(jqXHR, textStatus) {var debugMsg = extraireEnteteDebug(jqXHR);if (debugMsg != '') {if (DEBUG) {$('#dialogue-erreur .alert-txt').append('<pre class="msg-debug msg">Débogage : '+debugMsg+'</pre>');}}if ($('#dialogue-erreur .msg').length > 0) {$('#dialogue-erreur').show();}}});});}//+---------------------------------------------------------------------------------------------------------+//AUTO-COMPLÉTION Noms Scientifiquesfunction ajouterAutocompletionNoms() {$('#taxon').autocomplete({source: function(requete, add){// la variable de requête doit être vidée car sinon le parametre "term" est ajoutévar url = getUrlAutocompletionNomsSci();$.getJSON(url, function(data) {var suggestions = traiterRetourNomsSci(data);add(suggestions);});},html: true});$('#taxon').on('autocompleteselect', function(event, ui) {$('#taxon').data(ui.item);if (ui.item.retenu == true) {$('#taxon').addClass('ns-retenu');} else {$('#taxon').removeClass('ns-retenu');}});}function getUrlAutocompletionNomsSci() {var mots = $('#taxon').val(),url = SERVICE_AUTOCOMPLETION_NOM_SCI_URL_TPL.replace('{referentiel}',NOM_SCI_REFERENTIEL);url = url.replace('{masque}', mots);return url;}function traiterRetourNomsSci(data) {var suggestions = [];if (data.resultat != undefined) {$.each(data.resultat, function(i, val) {val.nn = i;var nom = {label: '', value: '', nt: '', nomSel: '', nomSelComplet: '', numNomSel: '',nomRet: '', numNomRet: '', famille: '', retenu: false};if (suggestions.length >= AUTOCOMPLETION_ELEMENTS_NBRE) {nom.label = '...';nom.value = $('#taxon').val();suggestions.push(nom);return false;} else {nom.label = val.nom_sci_complet;nom.value = val.nom_sci_complet;nom.nt = val.num_taxonomique;nom.nomSel = val.nom_sci;nom.nomSelComplet = val.nom_sci_complet;nom.numNomSel = val.nn;nom.nomRet = val.nom_retenu_complet;nom.numNomRet = val['nom_retenu.id'];nom.famille = val.famille;nom.retenu = (val.retenu == 'false') ? false : true;suggestions.push(nom);}});}return suggestions;}/** jQuery UI Autocomplete HTML Extension** Copyright 2010, Scott González (http://scottgonzalez.com)* Dual licensed under the MIT or GPL Version 2 licenses.** http://github.com/scottgonzalez/jquery-ui-extensions** Adaptation par Aurélien Peronnet pour la mise en gras des noms de taxons valides*/(function($) {var proto = $.ui.autocomplete.prototype,initSource = proto._initSource;function filter(array, term) {var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), 'i');return $.grep(array, function(value) {return matcher.test($('<div>').html(value.label || value.value || value).text());});}$.extend(proto, {_initSource: function() {if (this.options.html && $.isArray(this.options.source)) {this.source = function( request, response ) {response(filter(this.options.source, request.term));};} else {initSource.call(this);}},_renderItem: function(ul, item) {if (item.retenu == true) {item.label = '<strong>'+item.label+'</strong>';}return $('<li></li>').data('item.autocomplete', item).append($('<a></a>')[this.options.html ? 'html' : 'text'](item.label)).appendTo(ul);}});})(jQuery);//+----------------------------------------------------------------------------------------------------------+//UPLOAD PHOTO : Traitement de l'image$(document).ready(function() {$('.effacer-miniature').click(function () {supprimerMiniatures($(this));});$('#fichier').on('change', function (e) {arreter(e);var options = {success: afficherMiniature, // post-submit callbackdataType: 'xml', // 'xml', 'script', or 'json' (expected server response type)resetForm: true // reset the form after successful submit};$('#ajouter-obs').attr('disabled', 'disabled');if (verifierFormat($('#fichier').val())) {$('#form-upload').ajaxSubmit(options);} else {$('#form-upload')[0].reset();window.alert("Le format de fichier n'est pas supporté, les formats acceptés sont "+$('#fichier').attr('accept'));}return false;});if (ESPECE_IMPOSEE) {$('#taxon').attr('disabled', 'disabled');$('#taxon-input-groupe').attr('title', '');var infosAssociee = new Object();infosAssociee.label = INFOS_ESPECE_IMPOSEE.nom_sci_complet;infosAssociee.value = INFOS_ESPECE_IMPOSEE.nom_sci_complet;infosAssociee.nt = INFOS_ESPECE_IMPOSEE.num_taxonomique;infosAssociee.nomSel = INFOS_ESPECE_IMPOSEE.nom_sci;infosAssociee.nomSelComplet = INFOS_ESPECE_IMPOSEE.nom_sci_complet;infosAssociee.numNomSel = INFOS_ESPECE_IMPOSEE.id;infosAssociee.nomRet = INFOS_ESPECE_IMPOSEE['nom_retenu.libelle'];infosAssociee.numNomRet = INFOS_ESPECE_IMPOSEE['nom_retenu.id'];infosAssociee.famille = INFOS_ESPECE_IMPOSEE.famille;infosAssociee.retenu = (INFOS_ESPECE_IMPOSEE.retenu == 'false') ? false : true;$('#taxon').data(infosAssociee);}$('body').on('click', '.effacer-miniature', function() {$(this).parent().remove();});});function verifierFormat(nom) {var parts = nom.split('.');extension = parts[parts.length - 1];return (extension.toLowerCase() == 'jpeg' || extension.toLowerCase() == 'jpg');}function afficherMiniature(reponse) {if (DEBUG) {var debogage = $('debogage', reponse).text();console.log("Débogage upload : "+debogage);}var message = $('message', reponse).text();if (message != '') {$('#miniature-msg').append(message);} else {$('#miniatures').append(creerWidgetMiniature(reponse));}$('#ajouter-obs').removeAttr('disabled');}function creerWidgetMiniature(reponse) {var miniatureUrl = $('miniature-url', reponse).text();var imgNom = $('image-nom', reponse).text();var html ='<div class="miniature">'+'<img class="miniature-img thumbnail" alt="'+imgNom+'" src="'+miniatureUrl+'"/>'+'<button class="effacer-miniature" type="button">Effacer</button>'+'</div>'return html;}function supprimerMiniatures() {$('#miniatures').empty();$('#miniature-msg').empty();}//Initialise l'autocomplétion de la commune, en fonction du référentielfunction initialiserAutocompleteCommune() {var geocoderOptions = {},addressSuffix = '';geocoderOptions.region = 'fr';addressSuffix = ', France';$('#carte-recherche').autocomplete({//Cette partie utilise geocoder pour extraire des valeurs d'adressesource: function(request, response) {geocoderOptions.address = request.term + addressSuffix;geocoder.geocode( geocoderOptions, function(results, status) {if (status == google.maps.GeocoderStatus.OK) {response($.map(results, function(item) {var retour = {label: item.formatted_address,value: item.formatted_address,latitude: item.geometry.location.lat(),longitude: item.geometry.location.lng()};return retour;}));} else {afficherErreurGoogleMap(status);}});},// Cette partie est executee a la selection d'une adresseselect: function(event, ui) {var latLng = new google.maps.LatLng(ui.item.latitude, ui.item.longitude);deplacerMarker(latLng);}});// Autocompletion du champ adresse$('#carte-recherche').on('focus', function() {$(this).select();});$('#carte-recherche').on('mouseup', function(event) {// Pour Safari...event.preventDefault();});$('#carte-recherche').keypress(function(e) {if (e.which == 13) {e.preventDefault();}});};//+---------------------------------------------------------------------------------------------------------+// FORMULAIRE : traitements génériquesvar obsNbre = 0;$(document).ready(function() {$('.alert .close').on('click', fermerPanneauAlert);$('body').on('click', '.fermer', function(event) {event.preventDefault();basculerOuvertureFermetureCadre($(this).find('.icone'));});$('.has-tooltip').tooltip('enable');$('#btn-aide').on('click', basculerAffichageAide);// Validation du formulaireconfigurerFormValidator();definirReglesFormValidator();// Date pickerconfigurerDatePicker();// Gestion de la liste des taxonsajouterAutocompletionNoms();surChangementAbondance();// Vérif lors du chargement de la page$('#abondance').on('change', surChangementAbondance);// Gestion des obs$('.btn-coord ').on('click', basculerAffichageCoord);$('#ajouter-obs').on('click', ajouterObs);surChangementNbreObs();$('.obs-nbre').on('changement', surChangementNbreObs);$('body').on('click', '.supprimer-obs', supprimerObs);$('#transmettre-obs').on('click', transmettreObs);// Défilement des photos$('body').on('click', '.defilement-miniatures-gauche', function(event) {event.preventDefault();defilerMiniatures($(this));});$('body').on('click', '.defilement-miniatures-droite', function(event) {event.preventDefault();defilerMiniatures($(this));});});function surChangementAbondance() {if (afficherIndividusNbreGroupe()) {$('#individus-nbre-groupe').removeClass('hidden');$('#individus-nbre').valid();} else {$('#individus-nbre-groupe').addClass('hidden');}}function afficherIndividusNbreGroupe() {var abondance = $('#abondance').val();if (abondance === '1-4 individus' || abondance === '5-9 individus' || abondance === '10-49 individus') {return true;} else {return false;}}function configurerFormValidator() {$.validator.addMethod('dateCel',function (value, element) {return value === '' || (/^[0-9]{2}[-\/][0-9]{2}[-\/][0-9]{4}$/.test(value));},'Format : jj/mm/aaaa. Date incomplète, utiliser 0, exemple : 00/12/2011.');$.validator.addMethod('individusNbre',function (value, element) {var ok = true;if (afficherIndividusNbreGroupe()) {var abondance = $('#abondance').val();if (abondance === '1-4 individus') {ok = value === '' || (value !== '' && /^[0-9]+$/.test(value) && value >= 1 && value < 5);} else if (abondance == '5-9 individus') {ok = value === '' || (value !== '' && /^[0-9]+$/.test(value) && value >= 5 && value < 10);} else if (abondance === '10-49 individus') {ok = value === '' || (value !== '' && /^[0-9]+$/.test(value) && value >= 10 && value < 50);}}return ok;},"Veuillez indiquer le nombre d'individus sous forme d'entier positif et compris dans la classe définie par le champ « Abondance » (Ex. : 3, 15 ou 33...).");$.validator.addMethod('isbn',function (value, element) {var isbn = value.trim();return (value == '' || (/^ISBN(-1(?:(0)|3))?:?( )*[0-9]+[- ][0-9]+[- ][0-9]+[- ][0-9]*[- ]*[xX0-9]$/).test(isbn));},'Format : ISBN 10 ou 13 avec chaque partie séparée par un espace ou tiret. <br />'+'Doit débuter par : "ISBN" ou "ISBN-10" ou "ISBN-13". Suivi par ":" ou ": " ou directement le code ISBN.<br />'+'(Ex. : ISBN:978-3-642-11746-6, ISBN:978 3 642 11746 6, ISBN: 978 3 642 11746 6, ISBN-10: 3 642 11746 6).');// Modification des méthodes par défaut de Jquery Validation pour Boostrap 3$.validator.setDefaults({ignore: [],// Forcer Jquery Validate à examiner les éléments en "display:none;"highlight: function(element) {$(element).closest('.form-group').addClass('has-error');},unhighlight: function(element) {$(element).closest('.form-group').removeClass('has-error');},success: function(element) {$(element).closest('.form-group').removeClass('has-error').addClass('has-success');if ($(element).attr('id') == 'taxon' && $('#taxon').val() != '') {// Si le taxon n'est pas lié au référentiel, on vide le data associéif ($('#taxon').data('value') != $('#taxon').val()) {$('#taxon').data('numNomSel', '');$('#taxon').data('nomRet', '');$('#taxon').data('numNomRet', '');$('#taxon').data('nt', '');$('#taxon').data('famille', '');}}},errorElement: 'span',errorClass: 'help-block',errorPlacement: function(error, element) {//console.log(element.attr('name') +'-'+ element.parent('.input-group').length);if (element.parent('.input-group').length) {error.insertAfter(element.parent());} else {error.insertAfter(element);}}});}function definirReglesFormValidator() {$('#form-observateur').validate({rules: {courriel : {required : true,email : true},courriel_confirmation : {required : true,equalTo: '#courriel'}}});$('#form-station').validate({rules: {latitude : {range: [-90, 90],required: true},longitude : {range: [-180, 180],required: true},'l93-x': 'required','l93-y': 'required'}});$('#form-obs-date').validate({rules: {date: {required: true,'dateCel' : true}}});$('#form-obs').validate({rules: {individusNombre: {individusNbre: true},determinationSource: {isbn: true}}});}function configurerDatePicker() {$.datepicker.setDefaults($.datepicker.regional['fr']);$('#date').datepicker({dateFormat: 'dd/mm/yy',maxDate: new Date,showOn: 'button',buttonImageOnly: true,buttonImage: CALENDRIER_ICONE_URL,buttonText: 'Afficher le calendrier pour saisir la date.',showButtonPanel: true,onSelect: function(date) {$(this).valid();}});$('img.ui-datepicker-trigger').appendTo('#date-icone');}function fermerPanneauAlert() {$(this).parentsUntil('.zone-alerte', '.alert').hide();}function basculerOuvertureFermetureCadre(element) {if (element.hasClass('glyphicon-plus-sign')) {element.removeClass('glyphicon-plus-sign').addClass('glyphicon-minus-sign');} else {element.removeClass('glyphicon-minus-sign').addClass('glyphicon-plus-sign');}}function basculerAffichageAide() {if ($(this).hasClass('btn-warning')) {$('.has-tooltip').tooltip('enable');$(this).removeClass('btn-warning').addClass('btn-success');$('#btn-aide-txt', this).text("Désactiver l'aide");} else {$('.has-tooltip').tooltip('disable');$(this).removeClass('btn-success').addClass('btn-warning');$('#btn-aide-txt', this).text("Activer l'aide");}}function bloquerCopierCollerCourriel() {afficherPanneau('#dialogue-bloquer-copier-coller');return false;}function basculerAffichageCoord() {var textActuel = $(this).text(),textARemplacer = $(this).data('toggle-text');$(this).text(textARemplacer).data('toggle-text', textActuel);if ($(this).hasClass('cacher-coord')) {$(this).removeClass('cacher-coord').addClass('afficher-coord');$('#coordonnees-geo').addClass('hidden');} else {$(this).removeClass('afficher-coord').addClass('cacher-coord');$('#coordonnees-geo').removeClass('hidden');}return false;}function ajouterObs() {// Fermeture automatique des dialogue de transmission de données$('#dialogue-obs-transaction-ko').hide();$('#dialogue-obs-transaction-ok').hide();if (validerFormulaire() == true) {obsNbre = obsNbre + 1;$('.obs-nbre').text(obsNbre);$('.obs-nbre').triggerHandler('changement');afficherObs();stockerObsData();supprimerMiniatures();if(!ESPECE_IMPOSEE) {$('#taxon').val('');$('#taxon').data('numNomSel',undefined);}$('#barre-progression-upload').attr('aria-valuemax', obsNbre);$('#barre-progression-upload .sr-only').text('0/'+obsNbre+' observations transmises');} else {afficherPanneau('#dialogue-form-invalide');}}function afficherObs() {var date = $('#date').val(),commune = $('#commune-nom').text(),codeInsee = $('#commune-code-insee').text(),lat = $('input[name="latitude"]').val(),lng = $('input[name="longitude"]').val(),lieudit = $('#lieudit').val(),station = $('#station').val(),milieux = $('#milieu').val(),exposition = getTextOptionSelectionne('station-exposition'),pente = getTextOptionSelectionne('station-pente'),phenologie = getTextOptionSelectionne('phenologie'),abondance = getTextOptionSelectionne('abondance'),individus = (($('#individus-nbre').val() === undefined || $('#individus-nbre').val() === '') ? '' : ' (' + $('#individus-nbre').val() + ')'),typeReleve = getTextOptionSelectionne('releve-type'),sourceDet = $('#determination-source').val(),notes = $('#notes').val();$('#liste-obs').prepend('<div id="obs'+obsNbre+'" class="obs obs'+obsNbre+'">'+'<div class="well">'+'<div class="obs-action pull-right has-tooltip" data-placement="bottom" '+'title="Supprimer cette observation de la liste à transmettre">'+'<button class="btn btn-danger supprimer-obs" value="'+obsNbre+'" title="'+obsNbre+'">'+'<span class="glyphicon glyphicon-trash icon-white"></i>'+'</button>'+'</div> '+'<div class="row">'+'<div class="col-md-2 obs-miniatures">'+ajouterImgMiniatureAuTransfert()+'</div>'+'<div class="col-md-8">'+'<ul class="list-unstyled obs-entete">'+'<li>'+'Observé à ' +'<span class="commune">' + commune + '</span> ' +'(' + codeInsee + ') [' + lat +' / ' + lng + ']' +' le ' +'<span class="date">' + date + '</span>' +'</li>' +'</ul>'+'<ul class="list-unstyled obs-details">'+'<li>' +'<span>Lieu-dit :</span> ' + lieudit + ' ; ' +'<span>Station :</span> ' + station + ' ; ' +'</li>' +'<li>' +'<span>Milieu :</span> ' + milieux + ' ; ' +'<span>Exposition :</span> ' + exposition + ' ; ' +'<span>Pente :</span> ' + pente + ' ; ' +'</li>' +'<li>' +'<span>Phénologie :</span> ' + phenologie + ' ; ' +'<span>Abondance :</span> ' + abondance + individus + ' ; ' +'<span>Relevé :</span> ' + typeReleve + ' ; ' +'<span>Source :</span> ' + sourceDet + ' ; ' +'</li>' +'<li>' +'<span>Commentaires :</span> ' + notes +'</li>'+'</ul>'+'</div>'+'</div>'+'</div>'+'</div>');}function getTextOptionSelectionne(id) {var optionVal = $('#' + id).val(),optionText = $('#' + id + ' option:selected').text();//console.log(optionVal+'-'+optionText);return ((optionVal === undefined || optionVal === '') ? '' : optionText);}function stockerObsData() {var numNomSel = $('#taxon').data('numNomSel'),nomSel = $('#taxon').val(),nomRet = $('#taxon').data('nomRet'),numNomRet = $('#taxon').data('numNomRet'),numTaxon = $('#taxon').data('nt'),famille = $('#taxon').data('famille'),referentiel = (numNomSel == undefined) ? '' : NOM_SCI_REFERENTIEL;$('#liste-obs').data('obsId'+obsNbre, {'date' : $('#date').val(),'notes' : $('#notes').val().trim(),'nom_sel': nomSel,'num_nom_sel': numNomSel,'nom_ret': nomRet,'num_nom_ret': numNomRet,'num_taxon': numTaxon,'famille': famille,'referentiel': referentiel,'latitude' : $('#latitude').val(),'longitude' : $('#longitude').val(),'commune_nom' : $('#commune-nom').text(),'commune_code_insee' : $('#commune-code-insee').text(),'altitude': $('#altitude').text(),'lieudit': $('#lieudit').val().trim(),'station': $('#station').val().trim(),'milieu': $('#milieu').val().trim(),'abondance': $('#abondance').val(),'phenologie': $('#phenologie').val(),//Ajout des champs images'image_nom' : getNomsImgsOriginales(),// Ajout des champs étendus de l'obs'obs_etendue': getObsChpEtendus()});}function getObsChpEtendus() {var champs = [];$('.obs-chp-etendu').each(function() {var valeur = $(this).val(),cle = $(this).attr('name');if (valeur != '') {var chpEtendu = {cle: cle, valeur: valeur.trim()};champs.push(chpEtendu);}});return champs;}function surChangementNbreObs() {if (obsNbre == 0) {$('#transmettre-obs').attr('disabled', 'disabled');$('#ajouter-obs').removeAttr('disabled');} else if (obsNbre > 0 && obsNbre < OBS_MAX_NBRE) {$('#transmettre-obs').removeAttr('disabled');$('#ajouter-obs').removeAttr('disabled');} else if (obsNbre >= OBS_MAX_NBRE) {$('#ajouter-obs').attr('disabled', 'disabled');afficherPanneau('#dialogue-bloquer-creer-obs');}}var nbObsEnCours = 1;var totalObsATransmettre = 0;function transmettreObs() {var observations = $('#liste-obs').data();if (DEBUG) {console.log(observations);}if (observations == undefined || jQuery.isEmptyObject(observations)) {afficherPanneau('#dialogue-zero-obs');} else {nbObsEnCours = 1;nbObsTransmises = 0;totalObsATransmettre = $.map(observations, function(n, i) { return i; }).length;depilerObsPourEnvoi();}return false;}function depilerObsPourEnvoi() {var observations = $('#liste-obs').data();// la boucle est factice car on utilise un tableau// dont on a besoin de n'extraire que le premier élément// or javascript n'a pas de méthode cross browsers pour extraire les clés// TODO: utiliser var.keys quand ça sera plus répandu// ou bien utiliser un vrai tableau et pas un objetfor (var obsNum in observations) {obsATransmettre = new Object();obsATransmettre['projet'] = TAG_PROJET;obsATransmettre['tag-obs'] = TAG_OBS;obsATransmettre['tag-img'] = TAG_IMG;var utilisateur = new Object();utilisateur.id_utilisateur = $('#id_utilisateur').val();utilisateur.prenom = $('#prenom').val();utilisateur.nom = $('#nom').val();utilisateur.courriel = $('#courriel').val();obsATransmettre['utilisateur'] = utilisateur;obsATransmettre[obsNum] = observations[obsNum];var idObsNumerique = obsNum.replace('obsId', '');if (idObsNumerique != '') {envoyerObsAuCel(idObsNumerique, obsATransmettre);}break;}}var nbObsTransmises = 0;function mettreAJourProgression() {nbObsTransmises++;var pct = (nbObsTransmises/totalObsATransmettre)*100;$('#barre-progression-upload').attr('aria-valuenow', nbObsTransmises);$('#barre-progression-upload').attr('style', 'width: '+pct+'%');$('#barre-progression-upload .sr-only').text(nbObsTransmises+'/'+totalObsATransmettre+' observations transmises');if (obsNbre == 0) {$('.progress').removeClass('active');$('.progress').removeClass('progress-striped');}}function envoyerObsAuCel(idObs, observation) {var erreurMsg = '';$.ajax({url : SERVICE_SAISIE_URL,type : 'POST',data : observation,dataType : 'json',beforeSend : function() {$('#dialogue-obs-transaction-ko').hide();$('#dialogue-obs-transaction-ok').hide();$('.alert-txt .msg').remove();$('.alert-txt .msg-erreur').remove();$('.alert-txt .msg-debug').remove();$('#chargement').show();},success : function(data, textStatus, jqXHR) {// mise à jour du nombre d'obs à transmettre// et suppression de l'obssupprimerObsParId(idObs);nbObsEnCours++;// mise à jour du statutmettreAJourProgression();if(obsNbre > 0) {// dépilement de la suivantedepilerObsPourEnvoi();}},statusCode : {500 : function(jqXHR, textStatus, errorThrown) {erreurMsg += "Erreur 500 :\ntype : "+textStatus+' '+errorThrown+"\n";}},error : function(jqXHR, textStatus, errorThrown) {erreurMsg += "Erreur Ajax :\ntype : "+textStatus+' '+errorThrown+"\n";try {reponse = jQuery.parseJSON(jqXHR.responseText);if (reponse != null) {$.each(reponse, function (cle, valeur) {erreurMsg += valeur + "\n";});}} catch(e) {erreurMsg += "L'erreur n'était pas en JSON.";}},complete : function(jqXHR, textStatus) {var debugMsg = extraireEnteteDebug(jqXHR);if (erreurMsg != '') {if (DEBUG) {$('#dialogue-obs-transaction-ko .alert-txt').append('<pre class="msg-erreur">'+erreurMsg+'</pre>');$('#dialogue-obs-transaction-ko .alert-txt').append('<pre class="msg-debug">Débogage : '+debugMsg+'</pre>');}var hrefCourriel = 'mailto:cel_remarques@tela-botanica.org?'+'subject=Dysfonctionnement du widget de saisie '+TAG_PROJET+'&body='+erreurMsg+'%0D%0ADébogage :%0D%0A'+debugMsg;// mise en valeur de l'obs en erreur + scroll vers celle ci en changeant le hash$('#obs'+idObs+' div div').addClass('obs-erreur');window.location.hash = 'obs'+idObs;$('#dialogue-obs-transaction-ko .alert-txt').append($('#tpl-transmission-ko').clone().find('.courriel-erreur').attr('href', hrefCourriel).end().html());$('#dialogue-obs-transaction-ko').show();$('#chargement').hide();initialiserBarreProgression();} else {if (DEBUG) {$('#dialogue-obs-transaction-ok .alert-txt').append('<pre class="msg-debug">Débogage : '+debugMsg+'</pre>');}if(obsNbre == 0) {setTimeout(function() {$('#chargement').hide();$('#dialogue-obs-transaction-ok .alert-txt').append($('#tpl-transmission-ok').clone().html());$('#dialogue-obs-transaction-ok').show();window.location.hash = 'dialogue-obs-transaction-ok';initialiserObs();}, 1500);}}}});}function validerFormulaire() {var observateur = $('#form-observateur').valid(),station = $('#form-station').valid(),obsDate = $('#form-obs-date').valid(),obs = $('#form-obs').valid();return (observateur == true && station == true && obs == true && obsDate == true) ? true : false;}function getNomsImgsOriginales() {var noms = new Array();$('.miniature-img').each(function() {noms.push($(this).attr('alt'));});return noms;}function supprimerObs() {var obsId = $(this).val();// Problème avec IE 6 et 7if (obsId == 'Supprimer') {obsId = $(this).attr('title');}supprimerObsParId(obsId);}function supprimerObsParId(obsId) {obsNbre = obsNbre - 1;$('.obs-nbre').text(obsNbre);$('.obs-nbre').triggerHandler('changement');$('.obs'+obsId).remove();$('#liste-obs').removeData('obsId'+obsId);}function initialiserBarreProgression() {$('#barre-progression-upload').attr('aria-valuenow', 0);$('#barre-progression-upload').attr('style', 'width: 0%');$('#barre-progression-upload .sr-only').text('0/0 observations transmises');$('.progress').addClass('active');$('.progress').addClass('progress-striped');}function initialiserObs() {obsNbre = 0;nbObsTransmises = 0;nbObsEnCours = 0;totalObsATransmettre = 0;initialiserBarreProgression();$('.obs-nbre').text(obsNbre);$('.obs-nbre').triggerHandler('changement');$('#liste-obs').removeData();$('.obs').remove();$('#dialogue-bloquer-creer-obs').hide();}function ajouterImgMiniatureAuTransfert() {var html = '';var miniatures = '';var premiere = true;if ($('#miniatures img').length >= 1) {$('#miniatures img').each(function() {var visible = premiere ? 'miniature-selectionnee' : 'miniature-cachee';premiere = false;var css = $(this).hasClass('b64') ? 'thumbnail b64' : 'thumbnail';var src = $(this).attr('src');var alt = $(this).attr('alt');miniature = '<img class="'+css+' '+visible+'" alt="'+alt+'"src="'+src+'" />';miniatures += miniature;});visible = ($('#miniatures img').length > 1) ? '' : 'defilement-miniatures-cache';var html ='<div class="defilement-miniatures">'+'<a class="defilement-miniatures-gauche '+visible+'"><</a>'+miniatures+'<a class="defilement-miniatures-droite '+visible+'">></a>'+'</div>';} else {html = '<img class="thumbnail" alt="Aucune photo"src="'+PAS_DE_PHOTO_ICONE_URL+'" />';}return html;}function defilerMiniatures(element) {var miniatureSelectionne = element.siblings('img.miniature-selectionnee');miniatureSelectionne.removeClass('miniature-selectionnee');miniatureSelectionne.addClass('miniature-cachee');var miniatureAffichee = miniatureSelectionne;if(element.hasClass('defilement-miniatures-gauche')) {if(miniatureSelectionne.prev('.miniature').length != 0) {miniatureAffichee = miniatureSelectionne.prev('.thumbnail');} else {miniatureAffichee = miniatureSelectionne.siblings('.thumbnail').last();}} else {if(miniatureSelectionne.next('.miniature').length != 0) {miniatureAffichee = miniatureSelectionne.next('.thumbnail');} else {miniatureAffichee = miniatureSelectionne.siblings('.thumbnail').first();}}//console.log(miniatureAffichee);miniatureAffichee.addClass('miniature-selectionnee');miniatureAffichee.removeClass('miniature-cachee');}function formaterNumNomSel(numNomSel) {var nn = '';if (numNomSel == undefined) {nn = '<span class="alert-error">[non lié au référentiel]</span>';} else {nn = '<span class="nn">[nn'+numNomSel+']</span>';}return nn;}