Rev 320 | Blame | Compare with Previous | Last modification | View Log | RSS feed
function getUrlBaseJrest() {return urlBaseJrest;}/**************************************************************************************************************************************************************************************************Fonction permettant de transformer les élements de la classe pliage en accordéon**************************************************************************************************************************************************************************************************/function initialiserElementsPliables() {$('.pliage h4').addClass('lien_pliage');$('.pliage ul').hide();$('.pliage > ul:first-child').hide();$('.1er_element_date ul').show();$('.1er_element_date > ul:first-child').show();$('.lien_pliage').bind('click', function() {$(this).nextAll('ul').slideToggle();return false;});}$('.pliage').ready(function() {initialiserElementsPliables();});/**************************************************************************************************************************************************************************************************Fonctions de gestion des onglets du formulaire de saisie d'espèce**************************************************************************************************************************************************************************************************/function initialiserOnglets() {$(".contenu_onglet").hide();$("ul.liste_onglets li:first").addClass("active").show();$(".contenu_onglet:first").show();$("ul.liste_onglets li").click(function() {$("ul.liste_onglets li").removeClass("active");$(this).addClass("active");$(".contenu_onglet").hide();var activeTab = $(this).find("a").attr("href");$(activeTab).fadeIn();return false;});}$('.contenu_onglet').ready(function() {initialiserOnglets();});function agrandirZoneClicBoutonsRadios() {$('.formulaire_informations_espece_mini').addClass("element_cliquable");$('#form_saisie_espece').children('input[type="submit"]').hide();$('.formulaire_informations_espece_mini').children('input[type="radio"]').hide();$('.titre_type').hide();$('.formulaire_informations_espece_mini').bind('click',function() {$(this).children('input[type="radio"]').attr('checked','checked');$('.formulaire_informations_espece_mini').removeClass('element_clique');$(this).addClass('element_clique');$('#form_saisie_espece').submit();});}$('#form_saisie_espece').ready(function() {agrandirZoneClicBoutonsRadios();});/**************************************************************************************************************************************************************************************************Fonctions permettant de transformer les cases du tableau d'évenements en mini formulaire**************************************************************************************************************************************************************************************************/function initialiserLignesCliquables() {$('.conteneur_element_modifier').hide();$(".date_observation_individu").live("click", function(e) {e.preventDefault();var est_absence_observation = $(e.target).parents('[data-absence-observation="1"]').length > 0;if($(e.target).hasClass('conteneur_supprimer_observation') ||$(e.target).hasClass('supprimer_observation') ||est_absence_observation) {return;}$('.element_clique').removeClass('element_clique');if($(this).hasClass('element_clique')) {fermerDatePicker();return false;} else {$(this).addClass('element_clique');afficherSaisieObservation($(this));return false;}});$(".date_observation_individu .conteneur_supprimer_observation").live("click", function(e) {e.preventDefault();if(window.confirm('Êtes-vous sûr.e de vouloir supprimer cette observation ?')) {// les obs ne sont jamais vraiment supprimées// mais seulement remplacées par des dates au format 00/00/yyyyenvoyerRequeteAjaxSaisieObservation('', $(this).parent('.date_observation_individu'));}return false;});$(".date_observation_individu .absence_observation").live("click", function(e) {e.preventDefault();var avertissement_absence_evenement = 'Attention ! Vous êtes sur le point de signaler que ce stade n\'a pas eu lieu dans l\'année. '+"\n"+'C\'est-à-dire que vous êtes certain.e de ne pas l\'avoir raté. '+"\n"+'Êtes-vous sûr.e ?';if(window.confirm(avertissement_absence_evenement)) {$(this).parent('.date_observation_individu').data('absence-observation', '1');var date_absence_evenement = '';var dateEnCours = new Date();if(getAnneeEnCoursDeConsultation() == dateEnCours.getFullYear()) {date_absence_evenement = dateEnCours.getDate()+'/'+dateEnCours.getMonth()+'/'+dateEnCours.getFullYear();} else {date_absence_evenement = '01/01/'+dateEnCours.getFullYear();}envoyerRequeteAjaxSaisieObservation(date_absence_evenement, $(this).parent('.date_observation_individu'));}return false;});// pour fermer le datepicker sur esc$(document).keyup(function(e) {if (e.keyCode === 27) {$('.element_clique').removeClass('element_clique');fermerDatePicker(); // esc}});}function afficherSaisieObservation($obs) {fermerDatePicker();var dateMin = getDateMinCalendrier();var dateMax = getDateMaxCalendrier();var dateCouranteStr = $obs.data('date-observation');var dateCourante = new Date();if(!!dateCouranteStr && dateCouranteStr != '' && dateCouranteStr != '+') {var jour = parseInt(dateCouranteStr.substring(0,2));var mois = parseInt(dateCouranteStr.substring(3,5));var annee = parseInt(dateCouranteStr.substring(6,10));dateCourante = new Date(annee, mois-1, jour);}$obs.find('.datepicker_container').datepicker({disabled: true,constrainInput: true,altFormat: 'dd/mm/yyyy',minDate: dateMin,maxDate: dateMax,changeMonth: true,defaultDate: dateCourante,onSelect: function(dateText, inst) {validerSaisieObservation(dateText, $obs)},beforeShowDay: function(date) {var dates_a_exclure = getDatesSaisiesPourStadeEtIndividu($obs.data('id-individu'), $obs.data('id-stade-observation'));var string = jQuery.datepicker.formatDate('dd/mm/yy', date);return [dates_a_exclure.indexOf(string) == -1]}});$obs.datepicker("show");$('.ui-datepicker').attr("title", "Appuyez sur échap pour annuler l'édition");}function validerSaisieObservation(dateStr, $obs) {if(estUneDateValide(dateStr)) {envoyerRequeteAjaxSaisieObservation(dateStr, $obs);}}function formaterDonneesObservationPourEnvoi(dateStr, $obs) {if(dateStr == null ) {return false ;}var anneeEnCours = getAnneeEnCoursDeConsultation();if(jQuery.trim(dateStr) == '') {dateStr = '00/00/'+anneeEnCours;}donnees_obs = {"id_individu": $obs.data('id-individu'),"id_evenement": $obs.data('id-stade-observation'),"date_evenement": dateStr,"annee_en_cours": anneeEnCours};if(!!$obs.data('absence-observation')) {donnees_obs.absence_observation = $obs.data('absence-observation');}if(!!$obs.data('id-observation')) {donnees_obs.id_observation = $obs.data('id-observation');}return donnees_obs;}/** Fonctions d'envoi et de récupération des élements du formulaire ajax **/function envoyerRequeteAjaxSaisieObservation(dateStr, $obs) {var est_obs_existante = !!$obs.data('id-observation');var donnees_obs = formaterDonneesObservationPourEnvoi(dateStr, $obs);url_page_courante = document.URL;url_page_courante = url_page_courante.replace('module=Individu','module=Observation');url_page_courante = url_page_courante.replace('action=afficherListeIndividu','action=validerFormulaireModificationObservationAjax');url_ajax = url_page_courante.replace('action=validerFormulaireSaisieIndividu','action=validerFormulaireModificationObservationAjax');$conteneurAjout = null;if(!est_obs_existante) {var id_conteneur_ajout = 'ajouter_observation_individu_'+donnees_obs['id_individu']+'_evenement_'+donnees_obs['id_evenement'];var $conteneurAjout = $('#'+id_conteneur_ajout).clone();}if(absenceStadePourIndividuEtAnneeEstSignalee($obs.data('id-individu'), $obs.data('id-stade'))) {$obs.find('.date-observation').text('Absent');return;}var donnees_obs = formaterDonneesObservationPourEnvoi(dateStr, $obs);donnees_obs['id_participant'] = 3;$.post(url_ajax, donnees_obs, function(obj_retour) {if(!!obj_retour.data.erreurs) {var message = 'Une ou plusieurs erreurs se sont produites : '+"\n";for (var key in obj_retour.data.erreurs) {if (obj_retour.data.erreurs.hasOwnProperty(key))message += '- '+obj_retour.data.erreurs[key]+"\n";}window.alert(message);return;}if(obj_retour.reponse === 'OK') {// les obs ne sont jamais vraiment supprimées// mais seulement remplacées par des dates au format 00/00/yyyyif(estUneDateSuppressionObs(dateStr)) {// si l'on a supprimé le signalement de l'absence d'un stade, alors on peut de nouveau saisir des// observations pour ce stade (le signalement de l'absence d'un stade pour une année est une observation)if(estUneAbsenceObservation($obs)) {afficherOuCacherConteneurAjout($obs.data('id-individu'), $obs.data('id-stade-observation'), true);afficherOuCacherBoutonSignalerAbsenceObservation($obs.data('id-individu'), $obs.data('id-stade-observation'), true);}$obs.remove();delete $obs;// s'il l'on vient de supprimer la dernière obs d'une évènement pour un individu on peut également à nouveau// saisir des observations pour celui-ciif(getDatesSaisiesPourStadeEtIndividu($obs.data('id-individu'), $obs.data('id-stade-observation')).length == 0) {afficherOuCacherBoutonSignalerAbsenceObservation($obs.data('id-individu'), $obs.data('id-stade-observation'), true);}return;}if(!!obj_retour.data.id_observation) {donnees_obs['id_observation'] = obj_retour.data.id_observation;}// sl'on vient de signaler que la stade n'a pas du tout eu lieu dans l'annéeif(estUneAbsenceObservation($obs)) {// alors on affiche une observation spéciale qui indique que le stade est absent// et qui bloque la saisie d'autres observations de ce stade pour cet individu et cette annéeafficherAbsenceObservationPourIndividuEtAnnee($obs, $conteneurAjout, donnees_obs);} else {afficherObservation(dateStr, $obs, $conteneurAjout, donnees_obs, est_obs_existante);// à partir du moment où l'on a au moins une observation pour un stade et un individu donné// on ne peut plus signaler que l'évènement n'a pas eu lieu cette annéeafficherOuCacherBoutonSignalerAbsenceObservation($obs.data('id-individu'), $obs.data('id-stade-observation'), false);}$('.element_clique').removeClass('element_clique');fermerDatePicker();}});}function afficherObservation(dateStr, $obs, $conteneurAjout, donnees_obs, est_obs_existante) {$obs.find('.date_observation').text(dateStr);$obs.data('date-observation', dateStr);if(!est_obs_existante) {$obs.removeClass('ajouter_observation');$obs.attr('title', 'Cliquez pour modifier la date de cette observation')$obs.data('id-observation', donnees_obs['id_observation']);var id_conteneur_observation = 'individu_'+donnees_obs['id_individu']+'_evenement_'+donnees_obs['id_evenement']+'_observation_'+donnees_obs['id_observation'];$obs.attr('id', id_conteneur_observation);$obs.after($conteneurAjout);}}function afficherAbsenceObservationPourIndividuEtAnnee($obs, $conteneurAjout, donnees_obs) {afficherObservation('Absent', $obs, $conteneurAjout, donnees_obs, false);$obs.attr('title', 'Vous avez indiqué que ce stade n\'a pas été observé pour cette année');$obs.data('absence-observation', '1');$obs.attr('data-absence-observation', '1');// on cache le conteneur d'ajout car une fois l'absence d'un stade signalée pour une année// et un individu, il est illogique de vouloir signaler des observations de ce stadeafficherOuCacherConteneurAjout(donnees_obs['id_individu'], donnees_obs['id_evenement'], false);}function afficherOuCacherConteneurAjout(id_individu, id_evenement, afficher) {var $conteneurAjout = $('#ajouter_observation_individu_'+id_individu+'_evenement_'+id_evenement);$conteneurAjout.toggleClass('hide', !afficher);}function afficherOuCacherBoutonSignalerAbsenceObservation(id_individu, id_evenement, afficher) {var $conteneurSignalementAbsenceObs = $('#ajouter_observation_individu_'+id_individu+'_evenement_'+id_evenement+' .absence_observation');console.log($conteneurSignalementAbsenceObs);$conteneurSignalementAbsenceObs.toggleClass('hide', !afficher);}function estUneAbsenceObservation($obs) {return $obs.data('absence-observation') == 1;}function estUneDateSuppressionObs(dateStr) {var date_vide_pattern = /^00\/00\/\d{4}$/;return dateStr == '' || date_vide_pattern.test(dateStr);}function fermerDatePicker() {if($(".hasDatepicker").length == 0) {return;}$(".hasDatepicker").each(function() {$(this).datepicker("destroy");$(this).removeClass(".hasDatepicker").removeAttr('id');});}function obtenirAttributsData(el) {return [].filter.call(el.attributes, function(at) { return /^data-/.test(at.name); });}// vérifie qu'une date est au format d/m/y// merci stacky https://stackoverflow.com/questions/5812220/how-to-validate-a-datefunction estUneDateValide(s) {var bits = s.split('/');var d = new Date(bits[2], bits[1] - 1, bits[0]);return d && (d.getMonth() + 1) == bits[1];}function absenceStadePourIndividuEtAnneeEstSignalee(id_individu, id_stade) {var selecteur_data = '[data-id-individu="'+id_individu+'"]'+'[data-id-stade-observation="'+id_stade+'"]'+'[data-absence-observation="1"]';return $('.date_observation_individu'+selecteur_data).length >= 1;}function getDatesSaisiesPourStadeEtIndividu(id_individu, id_stade) {var selecteur_data = '[data-id-individu="'+id_individu+'"]'+'[data-id-stade-observation="'+id_stade+'"]';return $('.date_observation_individu'+selecteur_data).map(function() {return $(this).data("date-observation");}).get();}function getAnneeEnCoursDeConsultation() {anneeEnCours = jQuery.trim($("#annee_en_cours").html());if(typeof(anneeEnCours)=='undefined'){dateCourante = new Date();anneeEnCours = dateCourante.getFullYear();}return anneeEnCours;}function getDateMinCalendrier() {anneeEnCours = getAnneeEnCoursDeConsultation();dateMin = '01/01/'+anneeEnCours;return dateMin;}function getDateMaxCalendrier() {anneeEnCours = getAnneeEnCoursDeConsultation();dateMax = '31/12/'+anneeEnCours;dateCourante = new Date();if(anneeEnCours == dateCourante.getFullYear()) {dateMax = dateCourante.getDate()+'/'+(dateCourante.getMonth()+ 1)+'/'+anneeEnCours;}return dateMax;}$('#saisie_liste_evenements').ready(function() {initialiserLignesCliquables();});/**************************************************************************************************************************************************************************************************Fonctions concernant la carte permettant de pointer d'afficher l'emplacement des stations**************************************************************************************************************************************************************************************************/var map;var marker;var liste_localite_en_cours;var indice_commune_en_cours;var liste_auto_completion_a_le_focus;var timerRequeteAutocompletion;var timerAffichageAutocompletion;function cacherElementsRafraichissables() {$('.rafraichissable input').attr('disabled', 'disabled');$('.rafraichissable input[type="text"]').addClass("chargement");}function montrerElementsRafraichissables() {$('.rafraichissable input').removeAttr('disabled');$('.chargement').removeClass("chargement");}function ajouterAutoCompletionCommune() {$('input#station_commune').after('<div class="conteneur_suggestions"></div>');$('input#station_commune').parent().addClass('autocompletion');$('input#station_commune').attr('autocomplete','off');$('.conteneur_suggestions').hide();rendreListeAutoCompletionInteractive('input#station_commune');}function ajouterListenerFormulaireSaisieLatLon() {$('input#localiser_lat_lon').click(function() {verifierEtLocaliserCoordonnees();});}function carteEstEnSaisie() {return ($('#conteneur_form_liens_lat_lon').length > 0);}function verifierEtLocaliserCoordonnees() {lat ;lon;if(carteEstEnSaisie()) {lat = $('#station_lat').val();lon = $('#station_lon').val();obtenirInformationsPourCoordonnees(lat, lon);} else {var lat = jQuery.trim($('#station_lat').html());var lon = jQuery.trim($('#station_lon').html());}if(jQuery.trim(lat) == '' || jQuery.trim(lon) == '') {return;}if(!isNaN(lat) && lat.length > 0 && !isNaN(lon) && lon.length > 0) {} else {window.alert("coordonnées invalides");}var positionMarker = new google.maps.LatLng(lat, lon);marker.setPosition(positionMarker);map.setCenter(positionMarker);map.setZoom(12);}function obtenirInformationsPourCoordonnees(lat, lon) {lat = jQuery.trim(lat);lon = jQuery.trim(lon);if(isNaN(lat) || lat.length <= 0 || isNaN(lon) || lon.length <= 0) {return;}cacherElementsRafraichissables();$.get(urlBaseJrest+'OdsCommune/informationsPourCoordonnees/?lat='+lat+'&lon='+lon, function(data) {infos_localites = jQuery.parseJSON(data);$('#station_alt').val(infos_localites.alt);if(infos_localites.commune != null && infos_localites.commune != '') {$('#station_commune').val(infos_localites.commune);$('#station_code_insee').val(infos_localites.code_insee);}montrerElementsRafraichissables();});}function obtenirInformationsPourCommune(nom_commune) {if(jQuery.trim(nom_commune) == '') {$('.conteneur_suggestions').hide();return;}$.get(urlBaseJrest+'OdsCommune/informationsPourCommune/?commune='+nom_commune, function(data) {infos_localites = jQuery.parseJSON(data);afficherListeAutoCompletion(infos_localites);});}function afficherListeAutoCompletion(tableau_localites) {liste_localite_en_cours = tableau_localites;html_liste_localite = '<ul class="liste_suggestions">';for(i = 0; i< tableau_localites.length; i++) {html_liste_localite += '<li id="commune_'+i+'" class="element_auto_completion_commune">'+tableau_localites[i]['commune']+' ('+tableau_localites[i]['dpt']+')</li>';}html_liste_localite += '</ul>';$('.conteneur_suggestions').html(html_liste_localite);$('.element_auto_completion_commune').hover(function() {indice = $(this).attr('id').split('_')[1];mettreEnSurbrillanceCommune(indice);});$('.element_auto_completion_commune').click(function() {indice = $(this).attr('id').split('_')[1];selectionnerCommune(indice);});if(tableau_localites.length > 0) {$('.conteneur_suggestions').show();mettreEnSurbrillanceCommune(0);}}function mettreEnSurbrillanceCommune(indice) {if(indice_commune_en_cours != null) {$('#commune_'+indice_commune_en_cours).removeClass('element_selectionne');}$('#commune_'+indice).addClass('element_selectionne');indice_commune_en_cours = indice;reprogrammerTimerPourCacherListeAutoCompletion();}function rendreListeAutoCompletionInteractive(selecteur) {$(selecteur).keyup(function(event) {if(event.which == 8 || (event.which >= 48 && event.which <= 90)) {reprogrammerTimerPourCacherListeAutoCompletion();reprogrammerTimerPourLancerRequeteCommune();}});$(selecteur).keydown(function(event) {reprogrammerTimerPourCacherListeAutoCompletion();// entreeif(event.which==13){selectionnerCommune(indice_commune_en_cours);event.preventDefault();}// hautif(event.which == 38){if(indice_commune_en_cours > 0) {mettreEnSurbrillanceCommune(indice_commune_en_cours - 1);}}// basif(event.which == 40){if(indice_commune_en_cours < liste_localite_en_cours.length - 1) {mettreEnSurbrillanceCommune(indice_commune_en_cours + 1);}}});$('.conteneur_suggestions').blur(function() {$('.conteneur_suggestions').hide();});}function reprogrammerTimerPourCacherListeAutoCompletion() {if(timerAffichageAutocompletion != null) {window.clearTimeout(timerAffichageAutocompletion);}timerAffichageAutocompletion = window.setTimeout(function() {$('.conteneur_suggestions').hide();}, 2000);}function reprogrammerTimerPourLancerRequeteCommune() {if(timerRequeteAutocompletion != null) {window.clearTimeout(timerRequeteAutocompletion);}timerRequeteAutocompletion = window.setTimeout(function() {obtenirInformationsPourCommune($('input#station_commune').val());}, 350);}function selectionnerCommune(indice) {infos_commune = liste_localite_en_cours[indice];$('input#station_commune').val(infos_commune['commune']);$('input#station_lat').val(infos_commune['lat']);$('input#station_lon').val(infos_commune['lon']);$('input#station_code_insee').val(infos_commune['code_insee']);verifierEtLocaliserCoordonnees();$('.conteneur_suggestions').hide();}function mettreAJourValeursFormulaire(latlon) {latlon = latlon.toString().split(',');lat = latlon[0].replace('(', '');lon = latlon[1].replace(')', '');$('#station_lat').val(latlon[0].replace('(', ''));$('#station_lon').val(latlon[1].replace(')', ''));obtenirInformationsPourCoordonnees(lat, lon);}function initialiserCarte() {if($('#map_canvas').length == 0) {return;}var latlng = new google.maps.LatLng(47.0504, 2.2347);var myOptions = {zoom: 6,center: latlng,mapTypeId: google.maps.MapTypeId.HYBRID};map = new google.maps.Map(document.getElementById("map_canvas"),myOptions);marker = new google.maps.Marker({position: latlng,title:""});if (carteEstEnSaisie()) {marker.setDraggable(true);google.maps.event.addListener(marker, 'dragend', function(event) {mettreAJourValeursFormulaire(marker.getPosition());});$('#conteneur_form_liens_lat_lon').ready(function() {verifierEtLocaliserCoordonnees();ajouterListenerFormulaireSaisieLatLon();ajouterAutoCompletionCommune();});} else {marker.setDraggable(false);$('#conteneur_liens_lat_lon').ready(function() {verifierEtLocaliserCoordonnees();});}marker.setClickable(true);// To add the marker to the map, call setMap();marker.setMap(map);}$('#map_canvas').ready(function() {initialiserCarte();});/**************************************************************************************************************************************************************************************************Fonctions généralistes s'appliquant automatiquement à certaines classes css**************************************************************************************************************************************************************************************************/function initialiserLiensNouvelleFenetre() {$('a.lien_nouvelle_fenetre').each(function() {var titre = $(this).attr("title");$(this).attr("title", titre+" (s'ouvre dans une nouvelle fenêtre)");});$('a.lien_nouvelle_fenetre').click(function(event) {event.preventDefault();window.open($(this).attr('href'));});}function initialiserLiensSuppression() {$('.lien_suppression').click(function() {return window.confirm('Êtes vous sûr.e de vouloir supprimer ?');});}$(document).ready(function() {initialiserLiensSuppression();initialiserLiensNouvelleFenetre();});/**************************************************************************************************************************************************************************************************Fonctions de debug permattant d'afficher les objets javascript à la manière de print_r**************************************************************************************************************************************************************************************************/function dump(arr,level) {var dumped_text = "";if(!level) level = 0;//The padding given at the beginning of the line.var level_padding = "";for(var j=0;j<level+1;j++) level_padding += " ";if(typeof(arr) == 'object') { //Array/Hashes/Objectsfor(var item in arr) {var value = arr[item];if(typeof(value) == 'object') { //If it is an array,dumped_text += level_padding + "'" + item + "' ...\n";dumped_text += dump(value,level+1);} else {dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";}}} else { //Stings/Chars/Numbers etc.dumped_text = "===>"+arr+"<===("+typeof(arr)+")";}return dumped_text;}