Subversion Repositories Sites.obs-saisons.fr

Rev

Rev 302 | Go to most recent revision | 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

        ************************************************************************************************
        ************************************************************************************************
**/

htmlEnCours = '';
elementEnCours = null;
ancienneValeurEnCours = null;
id_formulaire = null;

function initialiserLignesCliquables() {

        $('.conteneur_element_modifier').hide();

        $(".date_observation_individu").live("click", function(e) {
                e.preventDefault();

                if($(e.target).hasClass('conteneur_supprimer_observation') || $(e.target).hasClass('supprimer_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 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'));
                }
        });

        // 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('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();
        }

        var donnees_obs = formaterDonneesObservationPourEnvoi(dateStr, $obs);
        $.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)) {
                                $obs.remove();
                                delete $obs;
                                return;
                        }

                        $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', obj_retour.data.id_observation);

                                var id_conteneur_observation = 'individu_'+donnees_obs['id_individu']+'_evenement_'+donnees_obs['id_evenement']+'_observation_'+obj_retour.data.id_observation;
                                $obs.attr('id', id_conteneur_observation);

                                $obs.after($conteneurAjout);
                        }

                        $('.element_clique').removeClass('element_clique');
                        fermerDatePicker();
                }
        });
}

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 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 sur 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;
}