//
// Scripts JS pour les topos, toutes pratiques.
// Dépendances:  'js/evo.js', JQuery.
//

var affichage_topo = {
    nb_contributions_visibles_mini: 3,
    id_topo_actif: undefined, // Correspond à l'onglet actif, null ou undefined si autre que description ou parcours.
    type_topo_actif: undefined // Correspond à l'onglet actif, null ou undefined si autre que description ou parcours.
};

//
// Supprime une contribution à un topo (un commentaire, une dernière descente, une photo):
// - Envoit la requête de suppression (AJAX).
// - Actualise l'affichage.
//
// Paramètres:
// - 'id_entite_contribuee': ID de site ou de topo, dépendamment du type de contribution.
//
function supprimerContribution(url_suppression, id_contribution, type_contribution, id_entite_contribuee)
{
    var supprimer = confirm('Voulez-vous réellement supprimer cette contribution ?');
    if (supprimer)
    {
        trace('Ajax URL = ' + url_suppression);
        $.post(url_suppression,
               {id_contribution: id_contribution, type_contribution: type_contribution},
               function(data, textStatus) {
                    trace('textStatus = ' + textStatus);
                    trace('data = ' + data);
                    for (var i in data)
                        trace('data[' + i + '] = ' + data[i]);
                    if (textStatus != 'success' // Si erreur AJAX ...
                     || data.hasOwnProperty('erreur')) // ... ou si erreur EVO:
                        alert(messageEchecRequete(data, textStatus, 'supprimer'));
                    else // Succès de la requête:
                    {
                        switch (type_contribution)
                        {
                            case 'commentaire':
                                var id_bloc_commentaire = 'commentaire_topo_' + id_entite_contribuee + '_' + id_contribution;
                                trace('ID commentaire = ' + id_bloc_commentaire);
                                $('#' + id_bloc_commentaire).slideUp('slow').remove();
                                actualiserAffichageCommentaires(id_entite_contribuee);
                                break;
                            case 'derniere-descente':
                                var id_bloc_descente = 'derniere_descente_' + id_contribution;
                                trace('ID descente = ' + id_bloc_descente);
                                $('#' + id_bloc_descente).slideUp('slow').remove();
                                actualiserAffichageDernieresDescentes();
                                break;
                            default:
                                trace('Type de contribution invalide ("' + type_contribution + '".');
                        }
                    }
                },
            'json'
            );
    }
}

function estModeCommentairesTousVisibles(id_entite_contribuee)
{
    var rel = $('#' + 'voir_commentaires_' + id_entite_contribuee).attr('rel');
    var tous = rel.substring('tous='.length);
    trace('rel = ' + rel + ', tous = ' + tous);
    if (tous == 'true')
        return true;
    if (tous == 'false')
        return false;
    trace('Valeur de l\'attribut rel invalide ("' + rel + '").');
    return undefined;
}

//
// Actualise l'affichage d'un commentaire.
//
// A appeler après modification d'un commentaire.
//
function actualiserAffichageCommentaire(id_commentaire, id_topo, texte)
{
    var elt_texte = $('#commentaire_topo_' + id_topo + '_' + id_commentaire).children('.contenu_commentaire');
    elt_texte.hide();
    elt_texte.html(texte);
    elt_texte.show('slow');
}

//
// Actualise l'affichage des commentaires en fonction du nombre de commentaires et du
// mode d'affichage (tous / seulement les premiers visibles). Pour un topo de rivière
// n'opère que sur le descriptif de la rivière ou le parcours, qui correspond au
// paramètre 'id_topo'.
//
// A appeler après ajout ou suppression d'un bloc commentaire.
//
function actualiserAffichageCommentaires(id_topo)
{
    var elts_commentaire = $('#liste_commentaires_' + id_topo).children('.commentaire_topo');
    trace('Nb commentaires = ' + elts_commentaire.length);
    var bloc_commentaires = $('#commentaires_topo_' + id_topo);
    if (elts_commentaire.length == 0)
        bloc_commentaires.hide();
    else // Il y a des commentaires.
    {
        bloc_commentaires.show(); // Utile si un commentaire vient d'être créé et qu'il est le seul.
        var elts_commentaire_cache = elts_commentaire.filter(function(index) {return $(this).css('display') == 'none'});
        trace('Nb commentaires cachés = ' + elts_commentaire_cache.length + ', visibles = ' + (elts_commentaire.length - elts_commentaire_cache.length));
        var id_lien_voir_tout = 'voir_commentaires_' + id_topo;
        if (estModeCommentairesTousVisibles(id_topo))
        {
            // Rend tous les commentaires visibles:
            for (var j = 0; j < elts_commentaire.length; j++)
            {
                trace('$(elts_commentaire.get(i)).attr("id") = ' + $(elts_commentaire.get(j)).attr("id"));
                $(elts_commentaire.get(j)).show('normal');
            }

            // Fait disparaître le lien pour les rendres tous visibles:
            $('#' + id_lien_voir_tout).hide();
            $('#' + id_lien_voir_tout).attr('rel', 'tous=true');
        }
        else // Mode d'affichage = seulement les x premiers commentaires sont visibles.
        {
            // Rend visible seulement les x premiers commentaires. Peut faire apparaître des commentaires cachés
            // ou disparaître des commentaires visibles suivant l'opération qui a précédé (ajout ou suppression d'un commentaire),
            var nb_commentaires_caches = 0;
            for (var i = 0; i < elts_commentaire.length; i++)
            {
                trace('$(elts_commentaire.get(i)).attr("id") = ' + $(elts_commentaire.get(i)).attr("id"));
                if (i < affichage_topo.nb_contributions_visibles_mini)
                    $(elts_commentaire.get(i)).show('slow');
                else
                {
                    $(elts_commentaire.get(i)).hide();
                    nb_commentaires_caches++;
                }
            }
            
            // Fait apparaître le lien pour montrer tous les commentaires, le cas échéant:
            if (nb_commentaires_caches > 0)
                $('#' + id_lien_voir_tout).show();
            else
                $('#' + id_lien_voir_tout).hide();
            $('#' + id_lien_voir_tout).attr('rel', 'tous=false');
        }
    }
}

function montrerOngletTopo(id_topo, type_topo, nom_onglet, partie)
{
    $('.contenu_volet').hide();
    $('#' + nom_onglet).show();

    $('.onglet').css('fontWeight', 'normal');
    $('#lien_onglet_' + nom_onglet).css('fontWeight', 'bold');

    affichage_topo.id_topo_actif = id_topo;
    affichage_topo.type_topo_actif = type_topo;
    console.debug(affichage_topo);
    if (affichage_topo.type_topo_actif != null)
        $('.bascule_edition').show();
    else
        $('.bascule_edition').hide();

    if (partie != undefined)
    {
        trace('montrer la partie "' + partie + '".');
        var bloc_commentaires;
        if (nom_onglet == 'description')
            bloc_commentaires = $('#' + nom_onglet).children('.commentaires_topo');
        else // Parcours.
        {
            bloc_commentaires = $('#' + nom_onglet).children('.commentaires_topo');
            if (bloc_commentaires.attr('id') == undefined) // Cas où le parcours a des photos: il y a un bloc intermédiaire.
                bloc_commentaires = $('#' + nom_onglet).children('#texte_parcours').children('.commentaires_topo'); 
        }
        trace(bloc_commentaires.attr('id'));
        window.scrollTo(0, bloc_commentaires.offset().top - 20);
    }
}

function alerterPasConnecte()
{
    alert('Merci de vous connecter pour contribuer.');
}

function messageEchecRequete(data, textStatus, action)
{
    var message = 'ERREUR';
    if (textStatus != 'success') // Si erreur AJAX:
    {
        if (action == 'ajouter')
            message += '\n\nImpossible d\'enregistrer les données saisies.';
        else if (action == 'supprimer')
            message += '\n\nImpossible de procéder à la suppression.';
        else
            message += '\n\nImpossible de réaliser la requête.';
    }
    else // Si la requête a échoué:
    {
        message += '\n\n' + data.erreur;
        if (data.hasOwnProperty('message'))
            message += '\n\n' + data.message;
    }
    return message;
}

function actualiserAideValidation(message)
{
    $('#fct_aide_validation').text(message).effect("highlight", {}, 1500);
}

function htmlPourFormulaireContribution(type_contribution, id_contribution, id_entite_contribuee, titre, laius, url_action, id_elt_texte, id_elt_date)
{
    var html = '<div id="fct_dlg_contribution" title="' + titre + '" style="display: none; width: 80em">\n';
    html += '<form id="fct_contribution" style="padding: 1.5em" method="post" action="' + url_action + '">\n';
    html += '<input id="fct_id_entite_contribuee" type="hidden" value="' + id_entite_contribuee + '">\n';
    html += '<input id="fct_id_contribution" type="hidden" value="' + (id_contribution == null ? 0 : id_contribution) + '">\n';
    if (laius != undefined && laius != null && laius.length > 0)
        html += '<p>' + laius + '</p>\n';
    var saisir_date = (type_contribution.indexOf('derniere-descente') == 0);
    trace('saisir_date = ' + saisir_date);
    if (saisir_date)
    {
        saisir_date = true;
        var date_a_editer = '';
        if (id_elt_date != undefined && id_elt_date != null)
        {
            date_a_editer = $('#' + id_elt_date).html();
            trace('Date à éditer = ' + date_a_editer);
        }
        html += '<p id="fct_aide_validation">Tous les champs sont requis.</p>\n';
        html += '<div style="margin-bottom: 2em">\n';
        html += '<label>le: </label><br>\n';
        html += '<input id="fct_date_commentaire" type="text" size="10" value="' + date_a_editer + '">\n';
        html += '</div>\n';
    }
    else // On ne saisit pas la date.
    {
        saisir_date = false;
        html += '<p id="fct_aide_validation">&nbsp;</p>\n';
    }
    html += '<div>\n';

    var texte_a_editer = '';
    if (id_elt_texte != undefined && id_elt_texte != null)
    {
        texte_a_editer = $('#' + id_elt_texte).html();
        trace('Texte à éditer = ' + texte_a_editer);
    }

    /*
    var texte_a_editer = '';
    if (id_contribution != null)
    {
        texte_a_editer = $('#commentaire_topo_' + id_entite_contribuee + '_' + id_contribution).children('.contenu_commentaire').html();
        trace('Texte commentaire à éditer = ' + texte_a_editer);
    }
    */
    html += '<label>Commentaire: </label><br>\n';
    html += '<textarea id="fct_texte_commentaire" cols="80" style="height: 6em">' + texte_a_editer + '</textarea>\n';
    html += '</div>\n';
    html += '</form>\n';
    html += '</div>\n';
    return html;
}

//
// - 'type_contribution': chaîne parmi {'derniere-descente', 'commentaire'}.
// - 'id_entite_contribuee': ID du site ou du topo, dépendamment du type de contribution.
// - 'titre': titre de la boite de dialogue.
// - 'url': url de validation du formulaire.
// - 'laius': Texte explicatif affiché avant les champs. Optionnel.
// - 'id_elt_texte': ID de l'élément DOM qui contient le texte a éditer (null si il s'agit d'une création).'
// - 'id_elt_date': ID de l'élément DOM qui contient la date a éditer (null si il s'agit d'une création ou que le formulaire n'inclut pas de champ date).'
//
function editerContribution(type_contribution, id_contribution, id_entite_contribuee, titre, laius, url, id_elt_texte, id_elt_date)
{
    var html = htmlPourFormulaireContribution(type_contribution, id_contribution, id_entite_contribuee, titre, laius, url, id_elt_texte, id_elt_date);
    $('body').append(html);

    var saisir_date = (type_contribution.indexOf('derniere-descente') == 0);
    $('#fct_date_commentaire').datepicker({showOn: 'button', dateFormat: 'dd-mm-yy'});
    $('#fct_dlg_contribution').dialog({
        bgiframe: true,
        autoOpen: false,
        width: 640,
        height: (saisir_date ? 400 : 350),
        modal: true,
        buttons: {
            'Ok': function() {

                // Récupère les données du contexte:
                var id_entite_contribuee = $('#fct_id_entite_contribuee').val();
                trace('ID entité contribuée : ' + id_entite_contribuee);
                var id_contribution = $('#fct_id_contribution').val(); // 0 en mode création.
                trace('ID contribution : ' + id_contribution);

                // Récupère et filtre les valeurs saisies:
                if (saisir_date)
                {
                    var date_du_picker = $('#fct_date_commentaire').datepicker('getDate');
                    trace('Date commentaire (date picker): ' + date_du_picker);
                    if (date_du_picker == null)
                    {
                        actualiserAideValidation('Merci de saisir une date...');
                        return;
                    }
                    var date_commentaire = new Date(date_du_picker);
                    trace('Date commentaire (objet date): ' + date_commentaire);
                }
                var texte_commentaire = $('#fct_texte_commentaire').val();
                texte_commentaire = jQuery.trim(texte_commentaire);
                trace('Commentaire : ' + texte_commentaire);
                if (texte_commentaire == null || texte_commentaire.length == 0)
                {
                    actualiserAideValidation('Merci de saisir un commentaire...');
                    return;
                }

                // Envoit la requête d'édition, récupère les données enregistrées et actualise la page :
                var params_formulaire = {type_contribution: type_contribution, id_entite_contribuee: id_entite_contribuee, texte_commentaire: texte_commentaire};
                if (saisir_date)
                    params_formulaire['date_commentaire'] = date_commentaire;
                if (id_contribution != 0) // Mode modification.
                    params_formulaire['id_contribution'] = id_contribution;
                for (var k in params_formulaire) trace('params_formulaire[' + k + '] = ' + params_formulaire[k]);
                var url_action = $('#fct_contribution').attr('action');
                trace('URL AJAX = ' + url_action);
                soumettreFormulaireContribution(url_action, params_formulaire);

                $(this).dialog('close');
            },
            'Annuler': function() {
                $(this).dialog('close');
            }
        },
        close: function() {
            trace('Closing.');
            $('#fct_date_commentaire').datepicker('destroy');
            $('#fct_dlg_contribution').remove();
        }
    });
    $('#fct_dlg_contribution').dialog('open');

}

function soumettreFormulaireContribution(url, params)
{
    $.post(url,
           params,
           function(data, textStatus) {
                trace('textStatus = ' + textStatus);
                trace('data = ' + data);
                for (var i in data)
                    trace('data[' + i + '] = ' + data[i]);
                if (textStatus != 'success' // si erreur AJAX ...
                 || data.hasOwnProperty('erreur')) // ... ou si erreur EVO:
                    alert(messageEchecRequete(data, textStatus, (params.hasOwnProperty('id_contribution') ? 'modifier' : 'ajouter')));
                else // Succès de la requête:
                {
                    for (var c in data.contribution)
                        trace('data.contribution[' + c + '] = ' + data.contribution[c]);
                    var id_entite_contribuee = (data.contribution.id_topo == undefined ? data.contribution.id_site : data.contribution.id_topo);
                    if (data.action == 'creation')
                    {
                        var html;
                        switch (data.type_contribution)
                        {
                            case 'commentaire':
                                html = htmlPourCommentaire(data.contribution.id, id_entite_contribuee, new Date(data.contribution.date_creation),
                                                           new Date(data.contribution.date_modification), data.contribution.commentaire,
                                                           data.contribution.pseudo_auteur, data.contribution.url_auteur,
                                                           true, data.contribution.url_edition, data.contribution.url_suppression);
                                $('#liste_commentaires_' + id_entite_contribuee).prepend(html);
                                actualiserAffichageCommentaires(id_entite_contribuee);
                                var bloc_contributions = $('#commentaires_topo_' + id_entite_contribuee);
                                window.scrollTo(0, bloc_contributions.offset().top - 20);
                                break;
                            case 'derniere-descente':
                                html = htmlPourDerniereDescente(data.contribution.id, id_entite_contribuee, data.contribution.numero_parcours,
                                                                new Date(data.contribution.date_creation),
                                                                new Date(data.contribution.date_modification),
                                                                new Date(data.contribution.quand),
                                                                data.contribution.commentaire,
                                                                data.contribution.pseudo_auteur, data.contribution.url_auteur,
                                                                data.contribution.url_edition, data.contribution.url_suppression);
                                $('#dernieres_descentes').prepend(html);
                                actualiserAffichageDernieresDescentes();
                                montrerOngletTopo(null, null, 'conditions');
                                $('#derniere_descente_' + data.contribution.id).effect('pulsate', {}, 25);
                                break;
                            default:trace('Type de contribution non supporté ou invalide ("' + data.type_contribution + '").');
                        }
                    }
                    else if (data.action == 'modification')
                    {
                        switch (data.type_contribution)
                        {
                            case 'commentaire':
                                actualiserAffichageCommentaire(data.contribution.id, id_entite_contribuee, data.contribution.commentaire);
                                break;
                            case 'derniere-descente':
                                actualiserAffichageDerniereDescente(data.contribution.id, new Date(data.contribution.quand), data.contribution.commentaire);
                                break;
                            default:trace('Type de contribution non supporté ou invalide ("' + data.type_contribution + '").');
                        }
                    }
                    else
                        trace('ERREUR: action invalide ("' + data.action + '").');
                }
           },
           'json'
    );
}

function htmlPourCommentaire(id_commentaire, id_topo, date_creation, date_modif, commentaire, pseudo_auteur, url_auteur, est_editable, url_edition, url_suppression)
{
    var html = '<div id="commentaire_topo_' + id_topo + '_' + id_commentaire + '" class="commentaire_topo">\n';
    var id_elt_texte_commentaire = 'contenu_commentaire_' + id_commentaire;
    html += '<div id="' + id_elt_texte_commentaire + '" class="contenu_commentaire">\n';
    html += commentaire + '\n';
    html += '</div>\n';
    html += '<div class="pied_commentaire">\n';
    html += '<a href="' + url_auteur + '" target="_blank">' + pseudo_auteur + '</a>';
    html += ', le ' + date_creation.toLocaleDateString();
    if (date_modif != undefined && date_modif != null)
        html += ' (révisé le ' + date_modif.toLocaleDateString() + ')\n';
    if (est_editable)
    {
        html += '<span style="margin-left: 2em">\n';
        var appel_js_editer = 'editerContribution("commentaire"'
                                                + ',' + id_commentaire
                                                + ',' + id_topo
                                                + ',"Modifier un commentaire"'
                                                + ',null' // Laius.
                                                + ',"' + url_edition + '"'
                                                + ',"' + id_elt_texte_commentaire + '", null)';
        html += '&nbsp;<a href="javascript:;" onClick=\'' + appel_js_editer  + '\'><img src="/img/communes/icones/editer.gif" alt="Editer"></a>\n';
        
        var appel_js_supprimer = 'supprimerContribution("' + url_suppression + '"'
                                                      + ',' + id_commentaire
                                                      + ',"commentaire"'
                                                      + ',' + id_topo + ')';
        html += '&nbsp;<a href="javascript:;" onClick=\'' + appel_js_supprimer  + '\'><img src="/img/communes/icones/supprimer.gif" alt="Supprimer"></a>\n';
        html += '</span>\n';
    }
    html += '</div>\n';
    html += '</div>\n';
    html += '</div>\n';
    return html;
}

function deroulerRelevesNiveau(lien, visibles_mini, libelle_tous, libelle_mini)
{
    var etat = $(lien).attr('rel');
    if (etat == 'tout:non') {
        $('.releve_niveau').show('slow');
        $(lien).html(libelle_mini);
        $(lien).attr('rel', 'tout:oui');
    }
    else { // Tout est visible, on ne montre que les x premiers.
        $('.releve_niveau').filter(function(index) {
            return index > (visibles_mini - 1);
        }).hide();
        $(lien).html(libelle_tous);
        $(lien).attr('rel', 'tout:non');
    }
}