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/yyyy
envoyerRequeteAjaxSaisieObservation('', $(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/yyyy
if(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-ci
if(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ée
if(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ée
afficherAbsenceObservationPourIndividuEtAnnee($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ée
afficherOuCacherBoutonSignalerAbsenceObservation($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 stade
afficherOuCacherConteneurAjout(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-date
function 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();
// entree
if(event.which==13){
selectionnerCommune(indice_commune_en_cours);
event.preventDefault();
}
// haut
if(event.which == 38){
if(indice_commune_en_cours > 0) {
mettreEnSurbrillanceCommune(indice_commune_en_cours - 1);
}
}
// bas
if(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/Objects
for(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;
}