Subversion Repositories eFlore/Applications.eflore-consultation

Rev

Rev 105 | Go to most recent revision | Blame | Last modification | View Log | RSS feed

/**-------------------------- Objets globaux -----------------------------------*/

/*
 * Liste des noms scientifiques reçus pour la mise en gras des noms valide
 * et l'accès direct aux fiches 
 */
var listeNomsScientifiques = new Object();
/*
 * Les variables suivantes sont ajoutée automatiquement dans le squelette du moteur de
 * recherche par php, elles sont commentées ici pour qu'elles n'aient pas l'air 
 * de sortir de la cuisse de Jupiter
 * 
 * var urlServiceAutocompletionNomsSci : url de base du service de complétion de noms scientifiques
 * pour le projet en cours de consultation. 
 * Exemple : http://localhost/service:eflore:0.1/bdtfx/noms?recherche=etendue&retour.format=min&masque=Ace%mo
 * 
 * var urlServiceAutocompletionNomsVerna : url de base du service de complétion de noms vernaculaires
 * pour le projet en cours de consultation. 
 * Exemple : http://localhost/service:eflore:0.1/nvjfl/noms-vernaculaires?recherche=etendue&retour.format=oss&masque=aca&masque.lg=fra
 * 
 * var urlBaseFicheTaxon : url de base de fiches des taxons afin de rediriger l'utilisateur sans 
 * faire de recherche dans le cas d'une selection d'un nom sci dans la liste d'autocompletion
 * Exemple : http://localhost/eflore-consultation/index_botanique.php?referentiel=bdtfx&module=fiche&action=fiche&nn=127
 * 
 * 
 * var valeurDefautNomSci : Contient la valeur par défaut affichée dans le formulaire en mode sci
 * Exemple: Rechercher un nom scientifique
 * var valeurDefautNomVerna : Contient la valeur par défaut affichée dans le formulaire en mode verna
 * Exemple: Recherche un nom commun
 */


/**------------ Fonctions de détection de l'état du formulaire ------------------*/
function nomSciEstDemande()  {
        var boutonRadioNomSci = $('#type_nom_scientifique');
        return (boutonRadioNomSci.attr("checked") != "undefined" && boutonRadioNomSci.attr("checked") == "checked");
}

function nomVernaculaireEstDemande()  {
        var boutonRadioNomSci = $('#type_nom_vernaculaire');
        return (boutonRadioNomSci.attr("checked") != "undefined" && boutonRadioNomSci.attr("checked") == "checked");
}

/**------------ Fonctions de gestion des urls d'autocompletion et des fiches ------------------*/
function getUrlAutocompletion(baseUrl, requete, format) {
        return baseUrl+"?recherche=etendue&retour.format="+format+"&navigation.limite=10&masque="+requete;
}

function getUrlAutocompletionNomsVerna(requete) {
        return getUrlAutocompletion(urlServiceAutocompletionNomsVerna, requete, 'oss')+"&masque.lg=fra";
}

function getUrlAutocompletionNomsSci(requete) {
        return getUrlAutocompletion(urlServiceAutocompletionNomsSci, requete, 'min');
}

function getUrlAppelCompletion(requete) {
        var url = getUrlAutocompletionNomsSci(requete);
        if(nomVernaculaireEstDemande()) {
                requete = requete.replace('  ',' ');
                requete = requete.replace(' ','_');
                var url = getUrlAutocompletionNomsVerna(requete);
        }
        
        return url;
}

function getUrlFicheTaxon(num_nom) {
        return urlBaseFicheTaxon.replace('{num_taxon}',num_nom).replace('&','&');
}

/**------------------- Fonctions de gestion de l'autocompletion ---------------------------------*/
function traiterRetourNomsSci(data) {
        
    var suggestions = [];  
    if(data.resultat != undefined) {
            $.each(data.resultat, function(i, val) {  
                val.num_tax = i;
                listeNomsScientifiques[val.nom_sci] = val;
                suggestions.push(val.nom_sci);  
            });  
        }
        
        return suggestions;
}

function traiterRetourNomsVerna(data) {
        
    var suggestions = [];
    if(jQuery.type(data) == "array") {
            $.each(data[1], function(i, val){  
                suggestions.push(val);  
            });  
        }
        
        return suggestions;
}

function ajouterAutocompletionNoms() {
        $('#nom').autocomplete({
        source: function(req, add){  
            // la variable de requête doit être vidée car sinon le parametre "term" est ajouté
                req = "";
            $.getJSON(getUrlAppelCompletion($('#nom').val()), req, function(data) {  

                if(nomVernaculaireEstDemande()) {
                        suggestions = traiterRetourNomsVerna(data);
                } else {
                        suggestions = traiterRetourNomsSci(data);
                }

                add(suggestions);  
            });
        },
        select: function(ui, item) {
                var nom = item.item.value;
                if(listeNomsScientifiques[nom] != undefined) {
                        // En cas de selection d'un nom scientifique de la liste
                        var num_tax = listeNomsScientifiques[nom].num_tax;
                        // On redirige automatique l'utilisateur vers sa fiche
                        window.location = getUrlFicheTaxon(num_tax);
                }
        },
        html: true
        });
}

/**------------ Fonctions de gestion de l'affichage des valeurs par defaut ----------------------*/
function ajouterActionClicSurTexteRecherche() {
        $('#nom').click(function() {
                if(formulaireAfficheValeurParDefaut()) {
                        $('#nom').val('');
                }
                
                if($('#nom').hasClass('valeur-defaut-recherche')) {
                        $('#nom').removeClass('valeur-defaut-recherche');
                }
        });
}

function formulaireAfficheValeurParDefaut() {
        valeur_form = $('#nom').val().trim();
        return valeur_form == '' || valeur_form == valeurDefautNomSci || valeur_form == valeurDefautNomVerna;
}

function gererAffichageValeursParDefaut() {
        $('input[name="type_nom"]').click(function() {
                afficherValeurParDefaut();
        });
        
        $('#nom').focus(function() {
                $('#nom').removeClass('valeur-defaut-recherche');
                if(formulaireAfficheValeurParDefaut()) {
                        $('#nom').val('');
                } else {
                        $('#nom').select();
                }
        });
}

function afficherValeurParDefaut() {
        if($('#nom') != undefined && $('#nom').val() != undefined) { 
                valeur_form = $('#nom').val().trim();
                if(formulaireAfficheValeurParDefaut()) {
                        if(nomSciEstDemande()) {
                        $('#nom').val(valeurDefautNomSci);
                } else {
                        $('#nom').val(valeurDefautNomVerna);
                }
                        $('#nom').addClass('valeur-defaut-recherche');
                }
        }
}

$(document).ready(function() {
        ajouterAutocompletionNoms();
        ajouterActionClicSurTexteRecherche();
        gererAffichageValeursParDefaut();
        afficherValeurParDefaut();
});

/*
 * 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(listeNomsScientifiques[item.label] != undefined && listeNomsScientifiques[item.label].retenu == "true") {
                        item.label = "<b>"+item.label+"</b>";
                }
                
                return $( "<li></li>" )
                        .data( "item.autocomplete", item )
                        .append( $( "<a></a>" )[ this.options.html ? "html" : "text" ]( item.label ) )
                        .appendTo( ul );
        }
});

})( jQuery );