// *************************************************************************************
// Version 3.0 de Pluck_article.js utilisant la nouvelle SDK de Pluck pour 450 et Ppage.
// Par Sébastien Mérel
// Radio-canada.ca
// Dernière mise à jour : 8 février 2012
// Dernière modification majeure : Ajout d'une fonction de finission qui s'exécute lorsque les commentaires sont écrits.
// *************************************************************************************

var commentsPerPage = 10; // Le nombre de commentaires par page.
var commentsMaxLength = 2500; // La longueur maximale qu'un utilisateur peut entrer pour un commentaire. // Un setting chez pluck (CommentLengthLimit ) limite la longueur des commentaires qui leur est envoyé. Le setting local doit être plus petit.
var currentPage = 1; // La page en cours. Cliquer sur "afficher plus" augmente ce int de 1.
var more = false; // Flag si on est sur la première page ou dans un "afficher plus". Si true, n'écrit pas de head/footer aux commentaires.
var backtotop = false; // retourne a l'ancre commentaires lorsque l'on publie un nouveau message.
var fromAnchor = false; // Flag si on a un commentId en paramètre pour ancre vers un commentaire précis.
var endPage = 1; // Le nombre maximal de page à afficher. Si le currentPage = endpage alors il n'y a plus de Paging.
var commentsSorting = 'descending'; // Le orderby par défaut pour les requêtes de CommentsPagesRequests à pluck.
var commentsType = ''; // Le type de page (article, document, discussion, etc.) N'est pas utile pour les CommentsPagesRequests.
var abuseReportMax = 3; // Le nombre maximal de abuse avant de cacher un commentaire.
var isCommentPageEmpty = false; // Debug
var embargo = false; // Flag pour les évènements spéciaux (élections) empêchant les utilisateurs de pouvoir commenter.
var article; // L'objet vide par défaut de l'article. Sera récupéré par CommentsPagesRequest.
var articleID; // Le ID de l'article ex: ghtml-12345
var articleKey; // Le ID de l'article ex: ghtml-12345
var _commentPage; // L'objet contenant les items de la page. Sera remplis par _pluckResponse.
var oDocument = null; // (Obselet)
var oDocumentHead = null; // (Obselet)
var oRCRegionValues = null; // (Obselet)
var oResponse = null; // (Obselet)
var cssLoaded = false; // (obselet)
var agreedArray = new Array(); // Les recommend bidons pour les articles legacy.
var btnClickDisabled = false; // Disable du bouton submit pour empêcher les doublons.
var switchvalueArray = new Array(); // Liste des valeurs à updater.
var currentUserKey = '-1'; // Le userKey identifiant l'utilisateur. Provient soit du cookie de RCID (non-logué) ou du cookie AT (logué).
var currentuserObj; // L'objet sérialisé de l'utilisateur loggé et ses infos.
var currentuserStatus = ''; // Status de l'utilisateur (badges).
var userObj; // L'objet sérialisé de l'utilisateur et ses infos.
var userCompleteName = ""; // Le nom de l'utilisateur logué.
var loggedIn = false; // L'utilisateur est logué ou non.
var ancreLien = ""; // Ancre pour cour
var arrayFlagCount = 0; // Nombre d'action d'update a faire. Chaque update incrémente de 2 : 1- update "positive" ou "negative" 2- set flag.
var flag = 0; // Nombre de flag d'update a true. Si le nombre d'update n'égale pas le nombre de commentaire par page, l'update n'est pas complet.

// Pluck
var oServiceforPluckResponseCall = null; // Objet de requête vers pluck V1 (obselet)
var httpRequestForModuleLoad = null; // Objet de requête vers pluck V1 (obselet)
var domainPrefix = ""; // Identifiant Prod / staging pour l'API utilisant la SDK C# de pluck. 

var RCPluckSDKEndPoint = "http://pluck.cloudapp.net/ShowComments.aspx"; // lien vers l'api.
var RCPluckSDKEndPointAddComment = "http://pluck.cloudapp.net/Command.aspx"; // lien vers l'api.

var _pluckResponse = ""; // Variable contenant la réponse du commentsPageRequest.
var _pluckResponsestatus = ""; // Sert à vérifier dans la réponse de la requête à pluck est un succès ou un échec.

var _pluckReady = false; // Pour les commentaires : Sert à vérifier si la requête a pluck est terminée. Le injectScriptFile valide en boucle cette variable tant qu'elle n'est pas à true.
var _pluckReadyScores = false; // Pour les scores :Sert à vérifier si la requête a pluck est terminée. Le injectScriptFile valide en boucle cette variable tant qu'elle n'est pas à true.
var _pluckReadyAdd = false; // Pour l'ajout de commentaires :Sert à vérifier si la requête a pluck est terminée. Le injectScriptFile valide en boucle cette variable tant qu'elle n'est pas à true.
var _pluckReadyUpdateFlag = false; // Pour l'update des anciens commentaires vers les bons scores. Sera exécuté dans un array pour éviter les clash de requêtes asynchrones.
var _pluckReadyDelete = false; // Effacement d'un message par un admin.

var _serverTime = ""; // L'heure d'un serveur.

// 450
var _450 = false; // Flag qui définit si on est dans le(s) site(s) de 450 pour changements de libellés et d'affichage.
var _phaseoneActivated = false; // Définit certaines options cachées pour la phase 1.
var rc_j = null; // Journalistes.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Code de base pour l'inject script file afin de récupérer les JSONP de l'API qui fait les requête vers pluck
// Retourne les variables : _article, _pluckReady (ou _pluckReadyScores, ou _pluckReadyAdd), _pluckResponse, user,  _pluckResponsestatus, _serverTime, firstLevelcommentsOnCurrentPage
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function getGlobalLookups() {
    if (oDocument === null) {
        oDocument = document;
        oDocumentHead = oDocument.getElementsByTagName("head")[0];
    }
}

function injectScriptFile(sFilename, isReturnReference) {
    if (typeof (sFilename) === "string") {
        getGlobalLookups();
        var o = oDocument.createElement('script');
        if (o !== null) {
            o.setAttribute("type", "text/javascript");
            o.setAttribute("language", "javascript");
            o.setAttribute("src", sFilename);
            oDocumentHead.appendChild(o);

            if (typeof (isReturnReference) !== "undefined" && isReturnReference === true) {
                return o;
            }
        }
    }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


// Déclanche le processus de chargemet d'une page de commentaire (Est exécuté par défaut au load des pages.)
function src_loadArticle(ID, moveToPage, sortingVal, type) {

    articleID = ID;
    GetPluckJSON(articleID, moveToPage, sortingVal, type);

    if (embargo) {
        showNoCommentLegalNotice();
    }
    else {
        showCommentBox(0);
    }
}


// Vérifie dans quelle section du site on se trouve.
// Fait l'appel au load du document.
function GetPluckJSON(_articleid, _page, _sorting, _type) {

    if (document.location.href.indexOf("blogues.radio-canada.ca/monteregie") > -1)
        _450 = true;

    if (document.location.href.indexOf("http://blogues.radio-canada.ca/rive-sud") > -1)
        _450 = true;

    if (document.location.href.indexOf("http://blogues.radio-canada.ca/rive-nord") > -1)
        _450 = true;

    if (_450 == true)
        commentsType = "discussion";

    jQuery(document).ready(function () {
        GetPluckJSonDocumentReady(_articleid, _page, _sorting, _type);
    });
}

// Récupère les données utilisateur logué et fait la requête (injectscriptFile) pour récupérer la page de commentaire.
function GetPluckJSonDocumentReady(_articleid, _page, _sorting, _type) {

    var atCookie = Get_Cookie('at');
    var RCCookie = Get_Cookie('RCID');

    if (_sorting)
        commentsSorting = _sorting;

    if (_page == null) {
        _page = currentPage;
    } else {
        currentPage = _page;
    }

    articleID = _articleid

    // Vérifie si l'utilisateur est logué et récupère son Id du centre des membres.
    // Si l'utilisateur n'est pas logué on récupère son RCID du profilage de RC et on set le currentUserKey à cette valeur "anonyme"
    if (atCookie) { // If logged, take the thindata ID.
        if (atCookie.length > 0) {
            currentUserKey = atCookie.substring(atCookie.indexOf("u=") + 2, atCookie.indexOf("&"));
            loggedIn = true;
        }
    } else {
        loggedIn = false;
        if (RCCookie) {
            if (RCCookie.length > 0) {
                currentUserKey = RCCookie.substring(RCCookie.indexOf("{\"rcid\":") + 8, RCCookie.indexOf(","));
            }
        }
    }

    // Determine si l'utilisateur provient d'une ancre vers un commentaire particulier.
    // Si oui, récupère tous les commentaires et va vers cet ancre.
    var anchor = "";

    if (getQueryString("anchor") != null) {
        anchor = getQueryString("anchor");
        commentsPerPage = 1000;

        if (getQueryString("page") != null) { // Force to get a particular page for an anchor.
            currentPage = getQueryString("page");
            fromAnchor = true;
        }
    }

    var uniquetimestamp = new Date().getTime();

    _pluckReady = false;

    // Requête de la page de commentaire vers l'API interne qui récupère les données de Pluck et les sérialize en JSON.
    oServiceforPluckResponseCall = injectScriptFile(RCPluckSDKEndPoint + "?articleId=" + escape(articleID) + "&numberofcomments=" + commentsPerPage + "&userId=" + currentUserKey + "&displayPage=" + _page + "&sorting=" + commentsSorting + "&type=" + commentsType + "&ts=" + uniquetimestamp, true);

    // Boucle tant que la réponse n'est pas reçue. Quand _pluckReady sera a true on procède à src_renderResponse.
    BouclePourPluckJSONResponse(0, src_renderResponse);


    if (anchor != "") {
        location.hash = anchor; // Si on est dans un anchor, mène l'utilisateur au commentaire visé.
    }
}


// Ces blocs peuvent être optimisés mais pour l'instant c'est un quick fix. Ici on valide des conditions de pluckready différents pour éviter des clash de code ou des problèmes de synchronisation.

// COMMENTS : Boucle tant que la réponse n'est pas reçue. Quand _pluckReady sera a true on procède à src_renderResponse.
function BouclePourPluckJSONResponse(iTimeElapsed, successHandler) {
    if (iTimeElapsed < 0) { iTimeElapsed = 0; };

    if (_pluckReady == false) {
        if (iTimeElapsed <= 25000)
            setTimeout("BouclePourPluckJSONResponse(" + (iTimeElapsed + 100) + ", " + successHandler + ")", 100);
    } else {
        _pluckReady = false;
        successHandler();
    }
}

// SCORES : Boucle tant que la réponse n'est pas reçue. Quand _pluckReadyScores sera a true on procède à src_renderResponse.
function BouclePourPluckJSONResponseScores(iTimeElapsed, successHandler) {
    if (iTimeElapsed < 0) { iTimeElapsed = 0; };

    if (_pluckReadyScores == false) {
        if (iTimeElapsed <= 25000)
            setTimeout("BouclePourPluckJSONResponseScores(" + (iTimeElapsed + 100) + ", " + successHandler + ")", 100);
    } else {
        _pluckReadyScores = false;
        successHandler();
    }
}

// DELETE : Boucle tant que la réponse n'est pas reçue. Quand _pluckReadyScores sera a true on procède à src_renderResponse.
function BouclePourPluckJSONResponseDelete(iTimeElapsed, successHandler) {
    if (iTimeElapsed < 0) { iTimeElapsed = 0; };

    if (_pluckReadyDelete == false) {
        if (iTimeElapsed <= 25000)
            setTimeout("BouclePourPluckJSONResponseDelete(" + (iTimeElapsed + 100) + ", " + successHandler + ")", 100);
    } else {
        _pluckReadyDelete = false;
        successHandler();
    }
}

// ADD COMMENT : Boucle tant que la réponse n'est pas reçue. Quand _pluckReadyAdd sera a true on procède à src_renderResponse.
function BouclePourPluckJSONResponseAddcomment(iTimeElapsed, successHandler) {
    if (iTimeElapsed < 0) { iTimeElapsed = 0; };

    if (_pluckReadyAdd == false) {
        if (iTimeElapsed <= 25000)
            setTimeout("BouclePourPluckJSONResponseAddcomment(" + (iTimeElapsed + 100) + ", " + successHandler + ")", 100);
    } else {
        _pluckReadyAdd = false;
        successHandler();
    }
}

// Update flag to set : Boucle tant que la réponse n'est pas reçue. Quand _pluckReadyUpdateFlag sera a true on procède à src_renderResponse.
function BouclePourPluckJSONResponseUpdate(iTimeElapsed, successHandler) {
    if (iTimeElapsed < 0) { iTimeElapsed = 0; };

    if (_pluckReadyUpdateFlag == false) {
        if (iTimeElapsed <= 25000)
            setTimeout("BouclePourPluckJSONResponseUpdate(" + (iTimeElapsed + 100) + ", " + successHandler + ")", 100);
    } else {
        _pluckReadyUpdateFlag = false;
        successHandler();
    }
}

// Est exécuté lorsque la réponse de pluck et de l'api ont été reçues (donc json complet)
function src_renderResponse() {
    if (isPluckActive === false) return;

    if (_pluckResponse != "") {

        src_renderArticleComments(article, agreedArray);
        src_renderWithUser();

        src_renderDisapprovals(_pluckResponse);

        src_renderCommentRecommendationStatus(agreedArray);

        // Determine si l'utilisateur provient d'une ancre vers un commentaire particulier.
        // Si oui, récupère tous les commentaires et va vers cet ancre.
        var anchor = "";

        if (getQueryString("anchor") != null) {
            anchor = getQueryString("anchor");
            commentsPerPage = 1000;

            if (getQueryString("page") != null) { // Force to get a particular page for an anchor.
                currentPage = getQueryString("page");
                fromAnchor = true;
            }
        }

        if (anchor != "") {
            location.hash = "";
            location.hash = anchor; // Si on est dans un anchor, mène l'utilisateur au commentaire visé.
        } else {
            if (backtotop == true) {
                backtotop = false;
                location.hash = "";
                location.hash = "commentaires";
            }
        }
    }
}


// Fait l'appel de l'affichage des commentaires. src_displayCommentsList(_pluckResponse);
// Valide si c'est une première page ou si on a cliqué sur "afficher plus de commentaires"
function src_renderArticleComments(article) {

    if (isPluckActive === false) return;

    _pluckReady = false;

    if (more == false) { //Operation seulement pour la premiere page a charger.
        more = true;

        document.getElementById('commentList').innerHTML = "<div id='innerCommentPage'></div><div id='innerShowMorePage'></div>"; //Containing Div

        src_displayCommentsTotal(article);
        src_displayCommentsList(_pluckResponse);


        //Display divs
        if (!isCommentPageEmpty) {
            document.getElementById('sortSelect').style.display = 'block';
            document.getElementById('commentTotalTitle').style.display = 'block';
            //document.getElementById('commentNav').style.display = 'block';
        }
        document.getElementById('commentForm').style.display = 'block';

        if (_450 == true) {
            document.getElementById('commentDisplayText').innerHTML = 'Contribuez &agrave;' + src_returnCommentTitle();
        } else {
            document.getElementById('commentDisplayText').innerHTML = 'Participez &agrave;' + src_returnCommentTitle();
        }

    } else {
        src_displayCommentsList(_pluckResponse);
    }

    if (typeof finishFunction == 'function') {
        finishFunction();
    }

}

// Boucle dans les commentaires et bâtis le HTML pour l'affichage selon son niveau/thread/auteur.
function src_displayCommentsList(commentPage) {

    if (isPluckActive === false) return;

    if (user != null) {
        currentuserObj = eval("(" + user + ")");
    }

    // Nettoie les variables pour prochain appel de page.
    //_pluckResponse = "";
    _pluckReady = false;

    if (firstLevelcommentsOnCurrentPage == 0) {
        if (_pluckResponse.indexOf("Error") > -1) {
            // Section pour les logs des erreurs de serveur de Pluck.
            var StatsUse = 1;
            var StatsProfil = "Logs_pluck";
            statsToClics('clic_action', 'Erreur_Reponse_Pluck_' + _pluckResponse, 'clic_contenu', _serverTime + "_" + document.location.href, 'WT.ti', 'Erreur_Reponse_Pluck_' + _pluckResponse + "-" + _serverTime + "_" + document.location.href);
        }
    }

    var html = "";
    var comment;

    var HTMLBlock = document.getElementById('innerCommentPage'); //Containing Div

    if (commentPage.Items.length < 1) {
        isCommentPageEmpty = true;
    } else {
        isCommentPageEmpty = false;

        if (commentPage.Items) {
            if (commentPage.Items.length > 0) {
                src_embedNavigation(firstLevelcommentsOnCurrentPage, commentsPerPage);
            }
        }

        if (user) {
            currentuserObj = eval("(" + user + ")");

            if (currentuserObj.AwardStatus) {
                if (currentuserObj.AwardStatus.Badges) {
                    if (currentuserObj.AwardStatus.Badges.length > 0) {
                        //alert(currentuserObj.AwardStatus.Badges[0].Name);
                        if (currentuserObj.AwardStatus.Badges[0].Name == 'Journaliste') {
                            currentuserStatus = 'Journaliste';
                        }
                    }
                }
            }
        }

        for (var i = 0; i < commentPage.Items.length; i++) {

            comment = commentPage.Items[i];

            var Threaddeepness = "";
            if (comment.ThreadDepth > 1) //var Threaddeepness = ((comment.ThreadDepth -1) * 20);
                Threaddeepness = " response";

            var Threading = '<div id="commentbackgroundDiv:' + comment.CommentKey.Key + '" class="comment-news' + Threaddeepness + '">'; // Définit si la commentaire est un reply

            if (_450 == true) {
                if (comment.ScoreData[3]) {
                    if (comment.ScoreData[3].DeltaScore > 0) {
                        Threading = '<div id="commentbackgroundDiv:' + comment.CommentKey.Key + '" class="comment-news' + Threaddeepness + ' hilight">'; // Définit si le commentaire est un hilight de journaliste.
                    }
                }
            }

            var Threadingend = '</div">';

            var RCUserLogo = "";
            var RCBrand = "";

            //Do not show comment if : reported abuse more than max, author is blocked, comment is blocked.
            if (comment.Owner.AbuseCounts.AbuseReportCount < abuseReportMax && comment.Owner.IsBlocked === false && comment.ContentBlockingState == 0) {

                html += Threading;

                // Récupère le badge du journaliste ayant écrit le message en cours de traitement.
                if (_450 == true) {
                    if (comment.Owner.AwardStatus.Badges.length > 0) {
                        if (comment.Owner.AwardStatus.Badges[0].Name == "Journaliste") { RCUserLogo = ' journaliste'; RCBrand = " de Radio-Canada" }
                        if (comment.Owner.AwardStatus.Badges[0].Name == "Contribueur") { RCUserLogo = ' contribueur' }
                    }
                }


                // Valide l'utilisateur logué comme journaliste.
                var options = "";
                if (rc_j != null) {
                    if (rc_j == "true") {
                        options = "true";
                    }
                }

                // Récupération du nom, prénom et ville et nettoyage des caractères illégaux.
                var _userInfo = getUserInfo(comment); //userObj.ExtendedProfile["First Name"] + " " + _userObj.ExtendedProfile["Last Name"]; //getUserInfo(comment);
                if (_450 == true) {
                    if (comment.Owner.AwardStatus.Badges.length > 0) {
                        if (comment.Owner.AwardStatus.Badges[0].Name == "Journaliste") {
                            var _userInfo = getJournalisteInfo(comment); //userObj.ExtendedProfile["First Name"] + " " + _userObj.ExtendedProfile["Last Name"]; //getUserInfo(comment);
                        }
                    }
                }

                _userInfo = unescape(escape(_userInfo).replace(/%00/g, "")); //  Enleve les caracteres NULL (??? ils sortent de ou? de Pluck?);

                // Delete un message.
                if (_450 == true) {
                    if (currentuserStatus == 'Journaliste') {

                        html += '<a href="javascript:;" class="delete-comment" onclick="javascript:src_deleteMessage(\'' + comment.CommentKey.Key + '\'); return false;" title="Supprimer la contribution">x</a>';

                        //html += '<li class="hilight" id="DeleteMessageDiv:' + comment.CommentKey.Key + '">';
                        //html += '<a href="javascript:;" id="DeleteMessage:' + comment.CommentKey.Key + '" onclick="javascript:src_deleteMessage(\'' + comment.CommentKey.Key + '\'); return false;">Delete</a>';
                        //html += '</li>';
                    }
                }

                // Nom de l'auteur et particules (logo journaliste et Radio-canada)
                html += '<p class="comment-author' + RCUserLogo + '">Envoy&eacute; par <a name="' + comment.CommentKey.Key + '" id="' + comment.CommentKey.Key + '" href="https://mesabonnements.radio-canada.ca/ViewMember.aspx?u=' + comment.Owner.UserKey.Key + '&HasKey=1" target="_blank">';

                html += _userInfo;
                html += RCBrand;
                html += '</p>';

                var textWithReplyToForDate = "";
                var commentBody = comment.Body;

                if (commentBody.indexOf("%from%") > -1) {
                    textWithReplyToForDate = commentBody.substring(commentBody.indexOf("%from%"), commentBody.indexOf("%/from%") + 8);
                    commentBody = commentBody.replace(textWithReplyToForDate, "");

                    // En réponse : Ajout de l'italique et de l'espace à la variable.
                    textWithReplyToForDate = "&nbsp;<em>" + textWithReplyToForDate + "</em></p>";

                    // En réponse : Retrait de la fausse balise au body original.
                    textWithReplyToForDate = textWithReplyToForDate.replace("%/from% ", "");
                    textWithReplyToForDate = textWithReplyToForDate.replace("%/from%", "");
                    textWithReplyToForDate = textWithReplyToForDate.replace("%from%", "");
                }

                // En réponse : Ajout du texte après la date et l'heure.
                html += '<p class="comment-posted">' + src_formatDateTime(comment.PostedAtTime) + textWithReplyToForDate;

                // Ajout de l'ancre pour les journalistes.
                // EX : http://blogues.radio-canada.ca/monteregie/2011/11/22/lorem-ipsum?anchor=CommentKey:739d7cce-cea0-43ab-9ca4-c5eb3762e762#CommentKey:739d7cce-cea0-43ab-9ca4-c5eb3762e762
                ancreLien = document.location.href;
                ancreLien = ancreLien.substr(0, ancreLien.indexOf("#"));
                ancreLien = ancreLien.substr(0, ancreLien.indexOf("?")) + '?anchor=' + comment.CommentKey.Key;

                if (currentuserStatus == 'Journaliste') {
                    html += '<p><a href=' + ancreLien + '>' + ancreLien + '</a>';
                }

                html += '<p class="comment-body">' + testParagrahe(commentBody) + '</p>';

                //Recommend comment link
                html += '<ul class="choix-recommendation">';

                // Si le commentaire est un premier niveau on ajoute le bouton de reply. Mettre en commentaire la validation pour avoir le bouton de reply partout.
                var replyButton = "";
                if (comment.ThreadDepth == 1) {
                    replyButton = '<li class="repondre"><a href="#commenter" onclick="javascript:src_submitCommentInThread(\'' + comment.CommentKey.Key + '\', \'' + _userInfo + '\');">R&eacute;pondre</a></li>';
                }
                html += replyButton;


                if (comment.RecommendationCounts.CurrentUserHasRecommended === false) {
                    agreedArray.push(comment.CommentKey.Key); //Push in CommentKey into Array to parse later
                }

                // Hilight sur le scoreid "Hilight" Si on est journaliste.
                if (_450 == true) {
                    if (currentuserStatus == 'Journaliste') {
                        if (comment.ScoreData[3]) {
                            if (comment.ScoreData[3].CurrentUserHasScored === false) {
                                html += '<li class="hilight" id="HilightCountDiv:' + comment.CommentKey.Key + '">';
                                html += '<a href="javascript:;" id="hilight:' + comment.CommentKey.Key + '" onclick="javascript:src_submithilight(\'' + comment.CommentKey.Key + '\', \'' + Threaddeepness + '\'); return false;">Hilight</a>';
                                html += '</li>';
                            } else {
                                html += '<li class="hilight" id="HilightCountDiv:' + comment.CommentKey.Key + '">';
                                html += '<a href="javascript:;" class="inactif" id="Hilight:' + comment.CommentKey.Key + '" onclick="javascript:src_submitundohilight(\'' + comment.CommentKey.Key + '\', \'' + Threaddeepness + '\'); return false;">Hilight</a>';
                                html += '</li>';
                            }
                        }
                    }
                }

                // Bouton Pertinent seulement pour le projet 450
                //if (_450 == true) {

                // Recommend sur le scoreid "recommend"
                if (comment.ScoreData[1].CurrentUserHasScored === false) {
                    html += '<li class="pertinent" id="RecommendCountDiv:' + comment.CommentKey.Key + '">';
                    html += '<a href="javascript:;" id="Recommendation:' + comment.CommentKey.Key + '" onclick="javascript:src_submitRecommend(\'' + comment.CommentKey.Key + '\', \'' + comment.ScoreData[1].PositiveCount + '\'); return false;">Pertinent</a>';
                    html += '<div class="nb-comments">' + comment.ScoreData[1].PositiveCount + '</div>';
                    html += '</li>';
                } else {
                    html += '<li class="pertinent" id="RecommendCountDiv:' + comment.CommentKey.Key + '">';
                    html += '<a href="javascript:;" class="inactif" id="Recommendation:' + comment.CommentKey.Key + '">Pertinent</a>';
                    html += '<div class="nb-comments">' + comment.ScoreData[1].PositiveCount + '</div>';
                    html += '</li>';
                }
                //}


                var positivescorestring = comment.ScoreData[2].PositiveCount;
                var negativesscorestring = comment.ScoreData[2].NegativeCount;

                // Validation si le commentaire a ete update pour les valeurs positives provenant du recommend.
                // comment.scoredata[0] est le flag, si c'est a 0 c'est que le transfert n'a pas ete fait.
                // Les scores positifs du recommend iront dans comment.scoredata[2].positivescore.
                if (comment.ScoreData[0].PositiveCount == 0) {

                    // Update action seulement s'il y a des recommend (vieil article)
                    if (comment.RecommendationCounts.NumberOfRecommendations > 0) {

                        switchvalueArray.push(new Array());
                        switchvalueArray[(switchvalueArray.length - 1)].push("positive");
                        switchvalueArray[(switchvalueArray.length - 1)].push(comment.CommentKey.Key);
                        switchvalueArray[(switchvalueArray.length - 1)].push(comment.RecommendationCounts.NumberOfRecommendations);
                    }

                    // Flag Set
                    switchvalueArray.push(new Array());
                    switchvalueArray[(switchvalueArray.length - 1)].push("flag");
                    switchvalueArray[(switchvalueArray.length - 1)].push(comment.CommentKey.Key);
                    switchvalueArray[(switchvalueArray.length - 1)].push("1");

                }

                // Vieux Recommend et Vieux Not Recomment. PAS VISIBLE, POUR TRANSFERT SEULEMENT
                html += '<div style="display:none;">';
                html += '   <div id="RecommendLabel:' + comment.CommentKey.Key + '"></div>'; //DO NOT REMOVE!!!
                html += '   <span id="RecommendCount:' + comment.CommentKey.Key + '">' + comment.NumberOfRecommendations + '</span>';
                html += '   <div id="DisapproveLabel:CommentArticle:' + comment.CommentKey.Key + '"></div>'; //DO NOT REMOVE!!!
                html += '   <a class="disapprove" id="DisapproveThumbImg:CommentArticle:' + comment.CommentKey.Key + '" href="#" onclick="javascript:src_submitDisapproval(\'' + comment.CommentKey.Key + '\'); return false;">';
                html += '   En d&eacute;saccord (<span id="DisapproveCount:CommentArticle:' + comment.CommentKey.Key + '">0</span>)';
                html += '   &raquo;</a>';
                html += '   <div id="DecisionLabel:' + comment.CommentKey.Key + '" class="approvalValid"></div>';
                html += '</div>';


                if (comment.ScoreData[2].CurrentUserHasScored === false) {
                    html += '<li class="accord" id="ApproveCountDiv:' + comment.CommentKey.Key + '">';
                    html += '<a href="javascript:;" id="RecommendThumbImg:' + comment.CommentKey.Key + '" onclick="javascript:src_submitApproval(\'' + comment.CommentKey.Key + '\', \'' + positivescorestring + '\',\'' + negativesscorestring + '\'); return false;">En accord</a>';
                    html += '<div class="nb-comments">' + positivescorestring + '</div>';
                    html += '</li>';
                } else {
                    html += '<li class="accord" id="ApproveCountDiv:' + comment.CommentKey.Key + '">';
                    html += '<a href="javascript:;" class="inactif" id="RecommendThumbImg:' + comment.CommentKey.Key + '">En accord</a>';
                    html += '<div class="nb-comments">' + positivescorestring + '</div>';
                    html += '</li>';
                }

                // Ce resultat est uniquement dans le cas ou on utilise le bidon recommend
                if (comment.ScoreData[2].CurrentUserHasScored === false) {
                    html += '<li class="desaccord" id="DisapproveCountDiv:' + comment.CommentKey.Key + '">';
                    html += '<a href="javascript:;" id="RecommendThumbImg:' + comment.CommentKey.Key + '" onclick="javascript:src_submitDisapproval(\'' + comment.CommentKey.Key + '\', \'' + negativesscorestring + '\',\'' + positivescorestring + '\'); return false;">En d&eacute;saccord</a>';
                    html += '<div id=\"DisapproveCountVisible:CommentArticle:' + comment.CommentKey.Key + '"\" class="nb-comments">' + negativesscorestring + '</div>';
                    html += '</li>';
                } else {
                    html += '<li class="desaccord" id="DisapproveCountDiv:' + comment.CommentKey.Key + '">';
                    html += '<a href="javascript:;" class="inactif" id="RecommendThumbImg:' + comment.CommentKey.Key + '">En d&eacute;saccord</a>';
                    html += '<div id=\"DisapproveCountVisible:CommentArticle:' + comment.CommentKey.Key + '"\" class="nb-comments">' + negativesscorestring + '</div>';
                    html += '</li>';
                }

                //Report abuse

                // Partager TODO!
                if (_phaseoneActivated == true) {
                    html += '<li class="partager"><a href="javascript:;" onclick="javascript:alert(\'' + location.href + '?page=' + currentPage + '#' + comment.CommentKey.Key + '\');">partagez</a></li>';
                }

                if (comment.CurrentUserHasReportedAbuse == 'True') {

                    if (_450 == true) {
                        html += '<span id="AbuseAction:' + comment.CommentKey.Key + '" class="reported">Cette contribution a &eacute;t&eacute; signal&eacute;e</span>';
                    } else {
                        html += '<span id="AbuseAction:' + comment.CommentKey.Key + '" class="reported">Ce commentaire a &eacute;t&eacute; signal&eacute;</span>';
                    }

                } else {
                    html += '<li class="moderateur"><a href="#' + comment.CommentKey.Key + '" id="AbuseAction:' + comment.CommentKey.Key + '" onclick="src_openAbuseForm(this, \'' + comment.CommentKey.Key + '\'); return false;">Signalez un abus</a></li>';
                }
                html += '</ul>';


                html += '</div>';
                html += '</div>';

                html += Threadingend;

            }

            //Comment has been blocked by moderators
            else if (comment.ContentBlockingState != 'Unblocked') {
                html += '<div class="comment-news">';
                html += '<p class="comment-author">Envoy&eacute; par un utilisateur non divulgu&eacute;</p>';
                html += '<p class="comment-posted">' + src_formatDateTime(comment.PostedAtTime) + '</p>';
                //html += '<div class="commentBody"><p>Ce commentaire est consid&eacute;r&eacute; comme non pertinent et a &eacute;t&eacute; retir&eacute;.</p></div>';

                if (_450 == true) {
                    html += '<p class="comment-body">"Cette contribution a &eacute;t&eacute; supprim&eacute;e car elle ne respectait pas la <a href="javascript:;" onclick="oSrc.popup(\'http://www.radio-canada.ca/apropos/politiquesDiffusions/netiquette/popUp.shtml\', \'popup\', \'width=600,height=500,scrollbars=yes\'); return false;">n&eacute;tiquette</a>.</p>';
                } else {
                    html += '<p class="comment-body">Ce commentaire a &eacute;t&eacute; retir&eacute; par le mod&eacute;rateur car il ne respectait pas la <a href="javascript:;" onclick="oSrc.popup(\'http://www.radio-canada.ca/apropos/politiquesDiffusions/netiquette/popUp.shtml\', \'popup\', \'width=600,height=500,scrollbars=yes\'); return false;">n&eacute;tiquette</a>.</p>';
                }

                "Cette contribution a &eacute;t&eacute; supprim&eacute;e car elle ne respectait pas la Netiquette."

                html += '</div>';
            }

        }
    }

    //HTMLBlock.innerHTML = html; // OLD VERSION : ALLOW ONLY 1 PAGE AT A TIME, NEW VERSION ADDS PAGES AT THE BOTTOM OF THE LIST WHEN 'MORE' IS CLICKED.
    HTMLBlock.innerHTML += html;
}

function testParagrahe(texte) {
    texte = texte.replace(/\n/g, '<br>');
    return texte;
}


/////////////////////////////
//Comments approval handeling
function src_submitApproval(key, count, oppositecount) {
    if (isPluckActive === false) return;
    oServiceforPluckResponseCall = injectScriptFile(RCPluckSDKEndPointAddComment + "?command=ApproveComment&articleId=" + escape(articleID) + "&commentId=" + key + "&userid=" + currentUserKey, true);
    BouclePourPluckJSONResponseScores(0, src_renderSubmitRecommendation);

    document.getElementById("ApproveCountDiv:" + key).innerHTML = "<a href=\"javascript:;\" class=\"inactif\">En accord </a><div class=\"nb-comments\">" + (eval(count) + 1) + "</div>";
    document.getElementById("DisapproveCountDiv:" + key).innerHTML = "<a href=\"javascript:;\" class=\"inactif\">En d&eacute;saccord </a><div class=\"nb-comments\">" + oppositecount + "</div>";
}

function src_submitDisapproval(key, count, oppositecount) {
    if (isPluckActive === false) return;
    oServiceforPluckResponseCall = injectScriptFile(RCPluckSDKEndPointAddComment + "?command=DissapproveComment&articleId=" + escape(articleID) + "&commentId=" + key + "&userid=" + currentUserKey, true);
    BouclePourPluckJSONResponseScores(0, src_renderSubmitDisapprovalComplete);

    document.getElementById("DisapproveCountDiv:" + key).innerHTML = "<a href=\"javascript:;\" class=\"inactif\">En d&eacute;saccord </a><div class=\"nb-comments\">" + (eval(count) + 1) + "</div>";
    document.getElementById("ApproveCountDiv:" + key).innerHTML = "<a href=\"javascript:;\" class=\"inactif\">En accord </a><div class=\"nb-comments\">" + oppositecount + "</div>";
}

function src_submitRecommend(key, count) {
    if (isPluckActive === false) return;
    oServiceforPluckResponseCall = injectScriptFile(RCPluckSDKEndPointAddComment + "?command=recommend&articleId=" + escape(articleID) + "&commentId=" + key + "&userid=" + currentUserKey, true);
    BouclePourPluckJSONResponseScores(0, src_renderSubmitRecommendComplete);

    document.getElementById("RecommendCountDiv:" + key).innerHTML = "<a href=\"javascript:;\" class=\"inactif\">Pertinent </a><div class=\"nb-comments\">" + (eval(count) + 1) + "</div>";
}

function src_submithilight(key, deep) {
    if (isPluckActive === false) return;
    oServiceforPluckResponseCall = injectScriptFile(RCPluckSDKEndPointAddComment + "?command=hilight&articleId=" + escape(articleID) + "&commentId=" + key + "&userid=" + currentUserKey, true);
    BouclePourPluckJSONResponseScores(0, src_renderSubmitRecommendComplete);

    document.getElementById("HilightCountDiv:" + key).innerHTML = "<a href=\"javascript:;\" class=\"inactif\">Hilight </a>";
    document.getElementById("commentbackgroundDiv:" + key).className = "comment-news " + deep + " hilight";
}

function src_submitundohilight(key, deep) {
    if (isPluckActive === false) return;
    oServiceforPluckResponseCall = injectScriptFile(RCPluckSDKEndPointAddComment + "?command=dissapprovecomment&scoreId=hilight&articleId=" + escape(articleID) + "&scoreCount=1&commentId=" + key + "&userid=" + currentUserKey, true);
    BouclePourPluckJSONResponseScores(0, src_renderSubmitRecommendComplete);

    document.getElementById("HilightCountDiv:" + key).innerHTML = "<a href=\"javascript:;\" class=\"actif\">Hilight </a>";
    document.getElementById("commentbackgroundDiv:" + key).className = "comment-news " + deep;
}

function src_deleteMessage(key) {
    if (confirmDelete(key) === true) {
        oServiceforPluckResponseCall = injectScriptFile(RCPluckSDKEndPointAddComment + "?command=deletemsg&articleId=" + escape(articleID) + "&commentId=" + key + "&userid=" + currentUserKey, true);
        BouclePourPluckJSONResponseDelete(0, src_renderdeleteComplete);
    } else {
        return false;
    }
}

function confirmDelete(key) {
    if (confirm("Vous allez effacer cette contribution : " + key)) {
        return true;
    } else {
        return false;
    }
}

function src_renderdeleteComplete() {
    alert("La contribution est effac\u00E9e");
}

function src_renderSubmitRecommendComplete() {
    //ToDo
}

// D'accord
function src_renderSubmitRecommendation() {
    if (isPluckActive === false) return;
    // TO DO
}

// Désaccord
function src_renderSubmitDisapprovalComplete(responseBatch) {
    if (isPluckActive === false) return;
    // TO DO
}

// Pertinent
function src_renderRecommendationDisplay(thisComment) {
    if (isPluckActive === false) return;
    // TO DO
}

//Switch les recommend du commentaire pour des positives scores ou les negativescore.
// Le successhandler (migreRecommendToScores) est une fonction qui va appeler automatiquement l'update suivant du array. 
function UpdateValeurRecommendations(key, action, count) {

    if (action == "positive") {
        oServiceforPluckResponseCall = injectScriptFile(RCPluckSDKEndPointAddComment + "?command=updatepositivescore&articleId=" + escape(articleID) + "&scoreCount=" + count + "&scoreId=thumbs&commentId=" + key + "&userid=1", true);
        BouclePourPluckJSONResponseUpdate(0, migreRecommendToScores);
    }
    if (action == "negative") {
        oServiceforPluckResponseCall = injectScriptFile(RCPluckSDKEndPointAddComment + "?command=updatenegativescore&articleId=" + escape(articleID) + "&scoreCount=" + count + "&scoreId=thumbs&commentId=" + key + "&userid=2", true);
        BouclePourPluckJSONResponseUpdate(0, migreRecommendToScores);
    }
    if (action == "flag") {
        oServiceforPluckResponseCall = injectScriptFile(RCPluckSDKEndPointAddComment + "?command=updateflagscore&articleId=" + escape(articleID) + "&scoreCount=" + count + "&scoreId=flag&commentId=" + key + "&userid=2", true);
        BouclePourPluckJSONResponseUpdate(0, migreRecommendToScores);
    }
}

function src_renderDisapprovalDisplay(thisArticle) {
    if (isPluckActive === false) return;

    if (thisArticle && thisArticle.ArticleKey && thisArticle.ArticleKey.Key) {
        var thisArticleKeyObj = thisArticle.ArticleKey;
        var thisArticleKeyStr = thisArticle.ArticleKey.Key;
        var thisCommentKeyStr = thisArticleKeyStr.substr(15, thisArticleKeyStr.length);
        var theDisapprovalThumbImgDiv = document.getElementById('DisapproveThumbImg:' + thisArticleKeyStr);
        var theDisapprovalLabelDiv = document.getElementById('DisapproveLabel:' + thisArticleKeyStr);
        var theDisapprovalCountSpan = document.getElementById('DisapproveCount:' + thisArticleKeyStr);

        if (theDisapprovalThumbImgDiv && (thisArticle.Ratings.CurrentUserRating != '0')) {
            var newDiv = document.createElement('div');
            newDiv.id = 'DisapproveLabel:' + thisArticleKeyStr;
            newDiv.className = 'disapprove disapproveChk';
            newDiv.innerHTML = 'En d&eacute;saccord (<span id="DisapproveCount:' + thisArticleKeyStr + '">' + thisArticle.Ratings.NumberOfRatings + '</span>)';
            theDisapprovalThumbImgDiv.parentNode.removeChild(theDisapprovalThumbImgDiv);
            theDisapprovalLabelDiv.parentNode.insertBefore(newDiv, theDisapprovalLabelDiv);
            theDisapprovalLabelDiv.parentNode.removeChild(theDisapprovalLabelDiv);

            //Decision label
            //src_displayDecisionLabelText(thisCommentKeyStr, false);
        }

        theDisapprovalCountSpan.innerHTML = thisArticle.Ratings.NumberOfRatings;

        // Update score
        switchvalueArray.push(new Array());
        switchvalueArray[(switchvalueArray.length - 1)].push("negative");
        switchvalueArray[(switchvalueArray.length - 1)].push(thisCommentKeyStr);
        switchvalueArray[(switchvalueArray.length - 1)].push(thisArticle.Ratings.NumberOfRatings);

    }
}


// src_submitComment() : Exécute la préparation et l'envois de nouveau commentaires vers Pluck.
// Fait d'abbord les validations si l'utilisateur est logué
// Valide que le nom de l'utilisateur a été récupéré.
// Fait l'appel au injectScriptFile pour l'envois de la requête à Pluck.
function src_submitComment() {
    if (isPluckActive === false) return;

    if (btnClickDisabled === false) {

        btnClickDisabled = true;
        backtotop = true;

        var text = document.getElementById('commentText').value;
        var checkSignedComments = document.getElementById('acceptSignedComments');

        if (!checkSignedComments.checked) { // Verifie si l'utilisateur a coché la case signedcomments.
            alertSignedComments();
            btnClickDisabled = false; // Permet a l'utilisateur de recliquer sur le bouton submit.

        } else {
            if (text == "") { // Verifie si l'utilisateur a laisser la boite de commentaire vide.
                if (_450 == true) {
                    alert('Vous devez entrer une contribution.');
                } else {
                    alert('Vous devez entrer un commentaire.');
                }

                btnClickDisabled = false; // Permet a l'utilisateur de recliquer sur le bouton submit.

            } else {

                if (_450 == true) {
                    alert("Votre contribution a \u00E9t\u00E9 envoy\u00E9e avec succ\u00E8s.\n\n Elle sera mod\u00E9r\u00E9e avant d'\u00EAtre publi\u00E9e.");
                } else {
                    alert("Votre commentaire a \u00E9t\u00E9 envoy\u00E9 avec succ\u00E8s.\n\n Il sera mod\u00E9r\u00E9 avant d'\u00EAtre publi\u00E9.");
                }

                // Remplace le nickname par le nom complet de l'utilisateur.
                replaceUserName();

                if (userCompleteName == null) { // Valide que l'utilisateur a un nom complet sinon récupère le du cookie AT.
                    currentuserObj = eval("(" + user + ")");
                    userCompleteName = currentuserObj.ExtendedProfile[1].Value + " " + currentuserObj.ExtendedProfile[2].Value;
                }

                var additionalParameters = "";
                var textPourNotification = "";

                var urlApi = "http://api.radio-canada.ca/pluck/command.aspx";

                if (_450 == true) {
                    textPourNotification = document.location.href;
                    textPourNotification = textPourNotification.substr(0, textPourNotification.indexOf("#"));
                    textPourNotification = textPourNotification.substr(0, textPourNotification.indexOf("?")) + 'commentaires';


                    if (document.location.href.indexOf("blogues.radio-canada.ca/rive-sud") > -1) {
                        //additionalParameters = "&450=true&useremail=" + currentuserObj.Email + "&mailjournaliste=sebastien.merel@radio-canada.ca&username=" + encodeURIComponent(userCompleteName);
                        additionalParameters = "&450=true&useremail=" + currentuserObj.Email + "&mailjournaliste=redaction.rivesud@radio-canada.ca&username=" + encodeURIComponent(userCompleteName);
                    }
                    if (document.location.href.indexOf("blogues.radio-canada.ca/rive-nord") > -1) {
                        //additionalParameters = "&450=true&useremail=" + currentuserObj.Email + "&mailjournaliste=sebastien.merel@radio-canada.ca&username=" + encodeURIComponent(userCompleteName);
                        additionalParameters = "&450=true&useremail=" + currentuserObj.Email + "&mailjournaliste=redaction.rivenord@radio-canada.ca&username=" + encodeURIComponent(userCompleteName);
                    }
                    if (document.location.href.indexOf("blogues.radio-canada.ca/monteregie") > -1) {
                        additionalParameters = "&450=true&useremail=" + currentuserObj.Email + "&mailjournaliste=sebastien.merel@radio-canada.ca&username=" + encodeURIComponent(userCompleteName);

                    }
                }


                if (_450 == true) {
                    // Fait l'appel de l'ajout du message avec le texte reply to si c'est un comment en thread.
                    if (document.getElementById('ReplyIDHiddenBox').value != "") {
                        text = "%from% en r&eacute;ponse &agrave; " + document.getElementById('replytoNameHiddenBox').value.replace("</a>", "").replace("<%2Fa>", "") + "%/from% " + text;
                        oServiceforPluckResponseCall = injectScriptFile(urlApi + "?articleId=" + articleID + "&command=addcommentInThread&userId=" + currentUserKey + "&responseTo=" + encodeURIComponent(document.getElementById('ReplyIDHiddenBox').value.replace("</a>", "").replace("<%2Fa>", "")) + "&username=" + encodeURIComponent(userCompleteName.replace("</a>", "").replace("<%2Fa>", "")) + "&t=" + encodeURIComponent(text) + "&articleTitle=" + encodeURIComponent(article.Title) + "&articleUrl=" + encodeURIComponent(document.location.href) + additionalParameters + "&anchorlink=" + textPourNotification, true);
                    } else {
                        oServiceforPluckResponseCall = injectScriptFile(urlApi + "?articleId=" + articleID + "&command=addcomment&userId=" + currentUserKey + "&username=" + encodeURIComponent(userCompleteName.replace("</a>", "").replace("<%2Fa>", "")) + "&t=" + encodeURIComponent(text) + "&articleTitle=" + encodeURIComponent(article.Title) + "&articleUrl=" + encodeURIComponent(document.location.href) + additionalParameters + "&anchorlink=" + textPourNotification, true);
                    }
                } else {
                    // Fait l'appel de l'ajout du message avec le texte reply to si c'est un comment en thread.
                    if (document.getElementById('ReplyIDHiddenBox').value != "") {
                        text = "%from% en r&eacute;ponse &agrave; " + document.getElementById('replytoNameHiddenBox').value.replace("</a>", "").replace("<%2Fa>", "") + "%/from% " + text;
                        oServiceforPluckResponseCall = injectScriptFile(RCPluckSDKEndPointAddComment + "?articleId=" + articleID + "&command=addcommentInThread&userId=" + currentUserKey + "&responseTo=" + encodeURIComponent(document.getElementById('ReplyIDHiddenBox').value.replace("</a>", "").replace("<%2Fa>", "")) + "&username=" + encodeURIComponent(userCompleteName.replace("</a>", "").replace("<%2Fa>", "")) + "&t=" + encodeURIComponent(text) + "&articleTitle=" + encodeURIComponent(article.Title) + "&articleUrl=" + encodeURIComponent(document.location.href) + "&anchorlink=" + textPourNotification, true);
                    } else {
                        oServiceforPluckResponseCall = injectScriptFile(RCPluckSDKEndPointAddComment + "?articleId=" + articleID + "&command=addcomment&userId=" + currentUserKey + "&username=" + encodeURIComponent(userCompleteName.replace("</a>", "").replace("<%2Fa>", "")) + "&t=" + encodeURIComponent(text) + "&articleTitle=" + encodeURIComponent(article.Title) + "&articleUrl=" + encodeURIComponent(document.location.href), true);
                    }
                }

                // Boucle pour ajouter le commentaire.
                BouclePourPluckJSONResponseAddcomment(0, AddCommentCallSuccess);

                // Reset les formulaires et les variables pour le prochain appel.
                document.getElementById('ReplyIDHiddenBox').value = "";
                document.getElementById('replytoNameHiddenBox').value = "";
                document.getElementById('commentText').value = "";
                text = "";
                btnClickDisabled = false;
            }
        }
    }
}

// fonction préparatoire à l'envoir d'un nouveau commentaire dans un THREAD.
// Remplis les hidden text fields avec les valeurs de texte à ajouter au commentaire. 
// Remplis le texte "reponse à" et l'affiche.
function src_submitCommentInThread(_responseToCommentId, _userName) {
    if ((_responseToCommentId != null) && (_userName != null)) {
        document.getElementById('ReplyIDHiddenBox').value = _responseToCommentId;
        document.getElementById('replytoNameHiddenBox').value = _userName;
        document.getElementById('ReplyToRemainder').innerHTML = "<p class='txtLegal'><b>Votre r&eacute;ponse &agrave; la contribution de " + _userName + "</b></p></br>";
    }
}


// Fonction générique pour lire les valeurs d'un cookie du domaine.
function src_readCookie(name) {
    if (isPluckActive === false) return;

    var nameEQ = name + '=';
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
    return null;
}


// fonction qui extrait la valeur du userId du cookie AT du centre des membres (appelle la fonction readcookie('at')
function src_extractUserID() {
    if (isPluckActive === false) return;

    //var userID = src_extractUserID();
    var sCookie = src_readCookie('at');
    if (sCookie != null) {
        var s = sCookie.split('&');
        for (var i = 0; i < s.length; i++) {
            if (s[i].substring('u=', s[i].length))
                return s[i].substring(2, s[i].length);
        }
    }
    return null;
}

// Fonction qui définit si l'utilisateur est logué au centre des membres.
// Écrit le status connecté de l'utilisateur sous forme de texte et de lien
// Définit la variable userCompleteName utilisée pour afficher le nom de l'utilisateur.
function src_renderWithUser() {

    if (isPluckActive === false) return;

    var status = 'nonConnecte';
    var loginLink = document.getElementById('loginLink');
    var commentText = document.getElementById('commentText');
    var submitButton = document.getElementById('btnSubmit');
    var formBtn = document.getElementById('formBtn');
    var confirmSignedComments = document.getElementById('confirmSignedComments');

    var commentText1 = document.getElementById('commentText');

    commentText.disabled = !loggedIn; //Enable/Disable comment form textarea
    submitButton.disabled = !loggedIn; //Enable/Disable comment form submit button
    formBtn.style.display = loggedIn ? 'block' : 'none'; //Enable/Disable comment form submit button
    confirmSignedComments.style.display = loggedIn ? 'block' : 'none';

    commentText1.style.background = loggedIn ? '#F9F9F9' : '#eeeeee';

    if (loggedIn) {

        var html = 'Vous &ecirc;tes connect&eacute; en tant que <a href="https://mesabonnements.radio-canada.ca/ViewMember.aspx?u=' + currentUserKey + '&HasKey=1" target="_blank">' + currentuserObj.ExtendedProfile[1].Value + " " + currentuserObj.ExtendedProfile[2].Value + '</a>';
        //var html = 'Vous &ecirc;tes connect&eacute; en tant que <a href="https://mesabonnements.radio-canada.ca/ViewMember.aspx?u=' + currentUserKey + '&HasKey=1" target="_blank">' + getUserNameConnected(userObj) + '</a>';
        html += '<a class="deconnecter" href="https://mesabonnements.radio-canada.ca/logout.aspx?redirecturl=' + window.location + '">Se d&eacute;connecter</a>';
        loginLink.innerHTML = html;
        status = 'connecte';

        user = eval("(" + user + ")");

        userCompleteName = user.ExtendedProfile[1].Value + " " + user.ExtendedProfile[2].Value;

    }
    src_pushStats(status); //Compile stats
}


// Fonction utilisée par la barre partagée pour retourner le total des commentaires lié à un article.
function src_displayCommentsTotal(article) {
    if (isPluckActive === false) return;

    if (article) {
        var html = '';
        //Head - Barre partager
        try {
            oSrc.oPlusX.showCommentBtn({ 'n': article.Comments.NumberOfComments });
        }
        catch (err) {
        }
        try {
            showCommentBtn({ 'n': article.Comments.NumberOfComments });
        }
        catch (err) {
        }

        //Title
        if (article.Comments.NumberOfComments > 0) {

            var HTMLBlock = document.getElementById('commentTotalTitle');
            html = '<h2 class="title-block-gradient">';

            if (_450 == true) {
                html += article.Comments.NumberOfComments <= 1 ? 'Vos contributions' : 'Vos contributions';
                html += ' <div class="nb-commentaires">(' + article.Comments.NumberOfComments + ')</div>';
                html += '<a href="#commenter" class="contribuez">Contribuez</a>';
            } else {
                html += article.Comments.NumberOfComments <= 1 ? 'Les commentaires' : 'Les commentaires';
                html += ' <div class="nb-commentaires">(' + article.Comments.NumberOfComments + ')</div>';
                html += '<a href="#commenter" class="participez">Participez</a>';
            }

            html += '</h2>';
            HTMLBlock.innerHTML = html;
        }
    }
}


// Récupère les informations du profil de l'utilisateur actuellement logué.
function getUserNameConnected(user) {
    var _name = '';
    if (sectionLimitee()) {
        //_name = userObj.DisplayName;
        _name = userObj.ExtendedProfile[0].Value;
    }
    else {
        if (userObj.ExtendedProfile[1] && userObj.ExtendedProfile[2]) {
            _name = capitaliseFirstLetter(userObj.ExtendedProfile[1].Value) + ' ' + capitaliseFirstLetter(userObj.ExtendedProfile[2].Value);
        }
        else {
            _name = userObj.ExtendedProfile[0].Value;
        }
    }

    userCompleteName = _name;
    return _name
}

function getJournalisteInfo(comment) {
    var info = '';
    var nom = '';
    var location = '';
    if (sectionLimitee() || ancienCommentaire(comment)) {
        info = getUserName(comment);
    }
    else {
        nom = getNomJournaliste(comment);
        info = nom;
    }
    return info;
}

// Appele les différentes fonctions qui récupèrent les informations des utilisateurs.
// Retourne un string avec le nom en lien et la ville.
function getUserInfo(comment) {
    var info = '';
    var nom = '';
    var location = '';
    if (sectionLimitee() || ancienCommentaire(comment)) {
        info = getUserName(comment);
    }
    else {
        nom = getNom(comment);
        info = nom;
    }
    return info;
}

// Retourne un flag si le commentaire est un "ancien commentaire".
// Un commentaire est ancien si il a été fait avant l'ajout du Extended profile.
function ancienCommentaire(comment) {
    ancien = false;
    var dateLimite = new Date(2011, 6, 13); //13 Juillet 2011

    if (comment.PostedAtTime) {
        var d = comment.PostedAtTime;
        d = d.replace("Date(", "");
        d = d.replace(")/", "");
        d = d.replace("/", "");

        var da = new Date();
        da.setTime(d);

        var _day = da.getDay();
        var _date = da.getDate();
        var _month = da.getMonth();
        var _year = da.getFullYear();
        var datePoster = new Date(_year, _month, _day);

        if (datePoster < dateLimite) {
            ancien = true;
        }
    }
    return ancien;
}


// Vérifie si on est dans Jeunesse.
function sectionLimitee() {
    var path = location.pathname;
    return path.startsWith('/jeunesse');
}

String.prototype.startsWith = function (str) {
    return (this.indexOf(str) === 0);
}

function getNomJournaliste(comment) {
    var name = '';

    if (comment.Owner.ExtendedProfile[1] && comment.Owner.ExtendedProfile[2]) {
        name = capitaliseFirstLetter(comment.Owner.ExtendedProfile[1].Value) + ' ' + capitaliseFirstLetter(comment.Owner.ExtendedProfile[2].Value);
        name += "</a>";
    }
    else {
        name = comment.Owner.DisplayName;
        name += "</a>";
    }
    return name;
}
// Récupère le nom complet de l'utilisateur ainsi que sa ville.
// Si l'utilisateur n'a pas de profil étendu, on récupère le displayName.
function getNom(comment) {
    var name = '';

    if (comment.Owner.ExtendedProfile[1] && comment.Owner.ExtendedProfile[2]) {
        name = capitaliseFirstLetter(comment.Owner.ExtendedProfile[1].Value) + ' ' + capitaliseFirstLetter(comment.Owner.ExtendedProfile[2].Value);
        name += "</a>";
        name += getLocation(comment);
    }
    else {
        name = comment.Owner.DisplayName;
        name += "</a>";
    }
    return name;
}

// Ajoute une lettre majuscule au début d'un string.
function capitaliseFirstLetter(string) {
    return string.charAt(0).toUpperCase() + string.slice(1);
}

// Récupère le displayName de l'utilisateur
function getUserName(comment) {
    var name = comment.Owner.DisplayName + '</a>';
    return name;
}

// Récupère la ville d'un utilisateur.
function getLocation(comment) {
    var location = '';
    if (comment.Owner.ExtendedProfile[4]) {
        location = ' de ' + comment.Owner.ExtendedProfile[4].Value; //capitaliseFirstLetter(comment.Owner.ExtendedProfile["City"]);
    }
    return location;
}

// Fonction exécutée lorsque la boucle du injectscriptfile de l'ajout d'un nouveau commentaire a retournée une valeur de l'API/pluck.
// La fonction avise l'utilisateur que son commentaire sera modéré et reset la page des commentaires + reset le formulaire.
function AddCommentCallSuccess() {

    btnClickDisabled = false;

    if (_pluckResponsestatus.indexOf("ok") > -1) {
        src_pushStats('commentaireEnvoye'); //Compile stats

        src_toCount('commentText', 'sBann', commentsMaxLength + ' caract&egrave;res restants', commentsMaxLength); //reset word counter

        more = false;

        GetPluckJSonDocumentReady(articleID, 1, commentsSorting, commentsType);

    } else {
        alert(_pluckResponsestatus);
    }

    document.getElementById('commentText').value = '';
    btnClickDisabled = false;
}


////////////////////////////////////////////////
//Decision labeling (for comment agree/disagree)
// src_renderCommentRecommendationStatus : Cette fonction était autrefois utilisée pour récupérer la valeur recommend des faux comments pour les valeurs négatives du score. (obselete pour la nouvelle version)
// Trouve et set la fausse valeur de recommend (fake article id)
function src_renderCommentRecommendationStatus(agreedArray) {
    if (isPluckActive === false) return;

    if (agreedArray.length > 0) {
        for (var i = 0; i < agreedArray.length; i++) {
            //document.getElementById('DisapproveCountVisible:CommentArticle:' + agreedArray[i]).innerHTML = document.getElementById('DisapproveCount:CommentArticle:' + agreedArray[i]).innerHTML;
            src_displayDecisionLabelText(agreedArray[i], true);
        }
    }
}

function src_displayDecisionLabelText(CommentKey, agree) {
    if (isPluckActive === false) return;
}


////////////////////////////////
////////////////////////////////
//Comments disapproval handling

function src_renderDisapprovals() {

    if (isPluckActive === false) return;

    // Si le nombre de commentaires qui ont été updatés n'égale pas le nombre de commentaire par page alors l'update n'a pas été complété et on doit faire le call pour les recommend bidons.
    if (flag < commentsPerPage) {

        var nbArticles = 0;
        var requestBatch = new RequestBatch();
        for (var j = 0; j < _pluckResponse.Items.length; j++) {
            requestBatch.AddToRequest(new ArticleKey('CommentArticle:' + _pluckResponse.Items[j].CommentKey.Key));
            nbArticles++;
        }
        if (nbArticles > 0) requestBatch.BeginRequest(src_serverUrl, src_renderDisapprovalsComplete);
    } else {
        flag = 0; // reset la variable flag pour la prochaine page.
    }
}

function src_renderDisapprovalsComplete(responseBatch) {
    if (isPluckActive === false) return;


    if (switchvalueArray.length > 0) {

        for (var i = 0; i < responseBatch.Responses.length; i++) {
            if (responseBatch.Responses[i].Article) {
                if (responseBatch.Responses[i].Article.ArticleKey && responseBatch.Responses[i].Article.ArticleKey.Key) {
                    src_renderDisapprovalDisplay(responseBatch.Responses[i].Article);
                }
            }
        }

        // Exécute l'update maintenant que tous les disapprove et positivescore sont faits.
        if (switchvalueArray.length > 0) {
            migreRecommendToScores();
        }

        flag = 0; // reset la variable flag pour la prochaine page.
    }
}


// migreRecommendToScores fait l'appel de chacune des migrations du array une par une pour éviter les clash de réponse asynchrone du système.
var quelElementDuArray = 0;
function migreRecommendToScores() {

    if (quelElementDuArray < switchvalueArray.length) {
        UpdateValeurRecommendations(switchvalueArray[quelElementDuArray][1], switchvalueArray[quelElementDuArray][0], switchvalueArray[quelElementDuArray][2]);
        quelElementDuArray++;
    } else {
        quelElementDuArray = 0;
        return;
    }
}

/////////////////
/////////////////
//Abuse reporting
function src_submitAbuse() {
    if (isPluckActive === false) return;

    var key = document.getElementById('abuseKey').value;
    var reason = document.getElementById('abuseType').value;
    var description = document.getElementById('abuseComment').value;

    if (reason == '') {
        alert('Veuillez s&eacute;lectionner un type d\'abus.');
    } else {
        description = (description != '' && description != 'undefined' && description != null) ? encodeToHTMLEntities(description) : description;
        src_reportAbuse(key, reason, description);
    }
}
function src_reportAbuse(key, reason, description) {
    if (isPluckActive === false) return;

    var requestBatch = new RequestBatch();
    var commentKey = new CommentKey(key);
    var abuseReport = new ReportAbuseAction(commentKey, reason, description);
    requestBatch.AddToRequest(abuseReport);
    requestBatch.BeginRequest(src_serverUrl, src_renderAbuseReported);
}

function src_renderAbuseReported(responseBatch) {
    if (isPluckActive === false) return;

    if (responseBatch.Messages[0].Message == 'ok') {
        var key = document.getElementById('abuseKey').value;
        var abuseLink = document.getElementById('AbuseAction:' + key);

        //Remove link and replace it with a SPAN
        var newDiv = document.createElement('span');
        newDiv.className = 'reported';
        newDiv.innerHTML = 'Ce commentaire a &eacute;t&eacute; signal&eacute;';
        abuseLink.parentNode.insertBefore(newDiv, abuseLink);
        abuseLink.parentNode.removeChild(abuseLink);

        src_pushStats('commentaireAbus'); //Compile stats
        src_closeAbuseForm();
    }
}

function src_openAbuseForm(parent, key) {
    if (isPluckActive === false) return;

    var offsetLeft = 0;
    var offsetTop = 486; //sports et information

    document.getElementById('abuseKey').value = key; //Insert CommentKey into hidden field
    var div = document.getElementById('commentAbuse');
    div.style.display = 'block';

    var placement = src_findPos(parent);
    div.style.right = offsetLeft + 'px';
    div.style.top = placement[1] - offsetTop + 'px';
}

function src_closeAbuseForm() {
    if (isPluckActive === false) return;

    document.getElementById('abuseKey').value = '';
    document.getElementById('abuseType').value = '';
    document.getElementById('abuseComment').value = '';
    document.getElementById('commentAbuse').style.display = 'none';
}

function src_findPos(obj) {
    if (isPluckActive === false) return;

    var curleft = curtop = 0;
    if (obj.offsetParent) {
        curleft = obj.offsetLeft;
        curtop = obj.offsetTop;
        while (obj = obj.offsetParent) {
            curleft += obj.offsetLeft;
            curtop += obj.offsetTop;
        }
    }
    return [curleft, curtop];
}

function loadMorePages() {

    _pluckResponse = "";
    _pluckReady = false;
    _pluckReadyScores = false;
    _pluckReadyAdd = false;

    switchvalueArray = new Array();

    var nextPage = (currentPage + 1);

    //alert(articleID + " " + (currentPage + 1) + " " + commentsSorting + " " + commentsType);
    GetPluckJSON(articleID, nextPage, commentsSorting, commentsType);


    if ((currentPage + 1) >= endPage) {
        document.getElementById('innerShowMorePage').innerHTML = "";
    } else {
        currentPage = (currentPage + 1);
    }

}

/////////////////////
/////////////////////
//Navigation controls
function src_embedNavigation(nbComments, commentsPerPage) {

    if (isPluckActive === false) return;

    if (article.Comments.NumberOfComments > 0) {
        document.getElementById("sortSelect").style.display = "inline";
    }

    var html = '';

    //var HTMLBlock = document.getElementById('commentNav'); //Div where nav will be created
    var HTMLBlock = document.getElementById('innerShowMorePage'); //Div where nav will be created

    var nbPages = Math.ceil(nbComments / commentsPerPage);

    var startPage = 1;
    endPage = nbPages;

    var commentairesDePremierNiveauxrestants = (article.Comments.NumberOfTopLevelComments - (commentsPerPage * currentPage));

    if (commentairesDePremierNiveauxrestants == 1) {
        html = '<a href="javascript:;" onclick="javascript:loadMorePages();" class="plus">Afficher la contribution suivante</a>';
    }
    else if (commentairesDePremierNiveauxrestants > 10) {
        html = '<a href="javascript:;" onclick="javascript:loadMorePages();" class="plus">Afficher les ' + Math.min(commentairesDePremierNiveauxrestants, 10) + ' contributions suivantes (' + commentairesDePremierNiveauxrestants + ')</a>';
    }
    else if (commentairesDePremierNiveauxrestants > 1) {
        html = '<a href="javascript:;" onclick="javascript:loadMorePages();" class="plus">Afficher les ' + Math.min(commentairesDePremierNiveauxrestants, 10) + ' contributions suivantes</a>';
    }

    HTMLBlock.innerHTML = html;
}

////////////////
////////////////
//Util functions

function src_splitTitle(s) {
    if (isPluckActive === false) return;

    var title = s.split('|');
    return (title.length > 0) ? title[0] : document.title;
}

function src_returnCommentTitle() {
    if (isPluckActive === false) return;

    switch (commentsType) {
        case 'article':
            return ' cet article';
            break;
        case 'nouvelles':
            return ' cette nouvelle';
            break;
        case 'chronique':
            return ' cette chronique';
            break;
        case 'discussion':
            return ' cette discussion';
            break;
        default:
            return ' cet article';
            break;
    }
}

//function src_returnCommentButtonClass() {
// if(isPluckActive===false)return; 

//	switch (commentsType) {
//		case 'article' :
//			return 'btnCommenterArt'; //CSS Class
//			break;
//		case 'chronique' :
//			return 'btnCommenterChro'; //CSS Class
//			break;
//	}
//}

function src_validateCommentType(t) {
    if (isPluckActive === false) return;

    var a = new String(t);
    a = t != null || t == 'undefined' ? t.toLowerCase() : '';
    switch (a) {
        case 'chroniques':
            return 'chronique';
            break;
        default:
            return 'article';
    }
}

function src_validatePageNumber(pageNumber) {
    if (isPluckActive === false) return;

    return pageNumber <= 0 || isNaN(pageNumber) ? 1 : Number(pageNumber);
}

function src_validateSorting(sort) {
    if (isPluckActive === false) return;

    return (sort == 'TimeStampAscending' || sort == 'RecommendationsDescending' || sort == 'RecommendationsAscending') ? sort : 'TimeStampDescending';
}


function src_sortComments(ddn, s) {

    // Si le tri est vide, alors ne fait rien.
    if (s != "") {
        commentsSorting = s;

        if (isPluckActive === false) return;

        more = false;

        document.getElementById('innerCommentPage').innerHTML = "";
        document.getElementById('innerShowMorePage').innerHTML = "";

        jQuery(document).ready(function () {
            GetPluckJSonDocumentReady(articleID, 1, commentsSorting, commentsType);
        });
    }
}

function src_formatDateTime(d) {
    if (isPluckActive === false) return;

    var d_names = new Array('dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi');
    var m_names = new Array('janvier', 'f&eacute;vrier', 'mars', 'avril', 'mai', 'juin', 'juillet', 'ao&ucirc;t', 'septembre', 'octobre', 'novembre', 'd&eacute;cembre');

    d = d.replace("Date(", "");
    d = d.replace(")/", "");
    d = d.replace("/", "");


    var da = new Date();
    da.setTime(d);


    var curr_day = da.getDay();
    var curr_date = da.getDate();
    var curr_month = da.getMonth();
    var curr_year = da.getFullYear();
    var sup = curr_date == 1 ? 'er' : '';

    var dt = /*d_names[curr_day] + ' ' +*/curr_date + '<sup>' + sup + '</sup> ' + m_names[curr_month] + ' ' + curr_year;
    var tm = src_padLeft(da.getHours()) + ' h ' + src_padLeft(da.getMinutes());
    var dst = da >= src_setDSTStart(da.getFullYear()) && da < src_setDSTEnd(da.getFullYear()) ? 'HAE' : 'HNE';

    return dt + ' &agrave; ' + tm + ' ' + dst;
}

function src_setDSTStart(y) {	//DST starts on 2nd Sunday of March
    if (isPluckActive === false) return;

    var sunday = 0;
    var n = new Date(y, 2, 1, 0, 0, 0, 0); //March 1st 20??

    for (var i = 1; i <= 31; i++) {
        n.setDate(i);
        if (n.getDay() == 0) {
            sunday++;
            if (sunday == 2) break;
        }
    }
    return (n);
}

function src_setDSTEnd(y) {	//DST ends on 1st Sunday of November
    if (isPluckActive === false) return;

    var sunday = 0;
    var n = new Date(y, 10, 1, 0, 0, 0, 0); //November 1st 20??

    for (var i = 1; i <= 30; i++) {
        n.setDate(i);
        if (n.getDay() == 0)
            break;
    }
    return (n);
}

function src_padLeft(val) {
    if (isPluckActive === false) return;

    return val < 10 ? '0' + val : val;
}

function encodeToHTMLEntities(s) {
    if (isPluckActive === false) return;

    var result = '';
    for (var i = 0; i < s.length; i++) {
        var c = s.charAt(i);
        result += { '&': '&amp;', 'Ÿ': '&Yuml;', '¡': '&iexcl;', '¢': '&cent;', '£': '&pound;', '¤': '&curren;', '¥': '&yen', '¦': '&brvbar;', '§': '&sect;',
            '¨': '&uml;', '©': '&copy;', 'ª': '&ordf;', '«': '&laquo;', '¬': '&not;', '­': '&shy;', '®': '&reg;', '¯': '&masr;', '°': '&deg;', '±': '&plusmn;',
            '²': '&sup2;', '³': '&sup3;', '´': '&acute;', 'µ': '&micro;', '¶': '&para;', '·': '&middot;', '¸': '&cedil;', '¹': '&sup1;', 'º': '&ordm;', '»': '&raquo;',
            '¼': '&frac14;', '½': '&frac12;', '¾': '&frac34;', '¿': '&iquest;', 'À': '&Agrave;', 'Á': '&Aacute;', 'Â': '&Acirc;', 'Ã': '&Atilde;', 'Ä': '&Auml;',
            'Å': '&Aring;', 'Æ': '&Aelig', 'Ç': '&Ccedil;', 'È': '&Egrave;', 'É': '&Eacute;', 'Ê': '&Ecirc;', 'Ë': '&Euml;', 'Ì': '&Igrave;', 'Í': '&Iacute;', 'Î': '&Icirc;',
            'Ï': '&Iuml;', 'Ð': '&eth;', 'Ñ': '&Ntilde;', 'Ò': '&Ograve;', 'Ó': '&Oacute;', 'Ô': '&Ocirc;', 'Õ': '&Otilde;', 'Ö': '&Ouml;', '×': '&times;', 'Ø': '&Oslash;',
            'Ù': '&Ugrave;', 'Ú': '&Uacute;', 'Û': '&Ucirc;', 'Ü': '&Uuml;', 'Ý': '&Yacute;', 'Þ': '&thorn;', 'ß': '&szlig;', 'à': '&agrave;', 'á': '&aacute;', 'â': '&acirc;',
            'ã': '&atilde;', 'ä': '&auml;', 'å': '&aring;', 'æ': '&aelig;', 'ç': '&ccedil;', 'è': '&egrave;', 'é': '&eacute;', 'ê': '&ecirc;', 'ë': '&euml;', 'ì': '&igrave;',
            'í': '&iacute;', 'î': '&icirc;', 'ï': '&iuml;', 'ð': '&eth;', 'ñ': '&ntilde;', 'ò': '&ograve;', 'ó': '&oacute;', 'ô': '&ocirc;', 'õ': '&otilde;', 'ö': '&ouml;',
            '÷': '&divide;', 'ø': '&oslash;', 'ù': '&ugrave;', 'ú': '&uacute;', 'û': '&ucirc;', 'ü': '&uuml;', 'ý': '&yacute;', 'þ': '&thorn;', 'ÿ': '&yuml;'
        }[c] || c;
    }
    return result;
}

function src_getObject(obj) {
    if (isPluckActive === false) return;

    var theObj;
    if (document.all) {
        if (typeof obj == "string") {
            return document.all(obj);
        } else {
            return obj.style;
        }
    }
    if (document.getElementById) {
        if (typeof obj == "string") {
            return document.getElementById(obj);
        } else {
            return obj.style;
        }
    }
    return null;
}

function src_toCount(entrance, exit, text, characters) {
    if (isPluckActive === false) return;

    var entranceObj = src_getObject(entrance);
    var exitObj = src_getObject(exit);
    var length = characters - entranceObj.value.length;
    if (length <= 0) {
        length = 0;
        text = text;
        entranceObj.value = entranceObj.value.substr(0, characters);
    }
    exitObj.innerHTML = text.replace("{CHAR}", length);
}

function src_showHideCounter(show) {
    if (isPluckActive === false) return;

    var counter = document.getElementById('sBann');
    if (counter) counter.style.visibility = show == true ? 'visible' : 'hidden';
}

function src_pushStats(contenu) {
    if (isPluckActive === false) return;

    statsToClics(
		'WT.clic', 'clics_commentaire',
		'clic_action', articleID,
		'clic_contenu', contenu
	);
}

/////////////////////////////////////
/////////////////////////////////////
//Draw Comment content + Form content
function src_drawCommentContent(id) {
    if (isPluckActive === false) return;

    var HTMLBlock = document.getElementById('pluckComments-' + id);

    if (HTMLBlock) {
        var output = '';
        output += '<a name="commentaires"></a>';
        output += '<div id="commentStart"></div>';
        //output += '<div id=avertissementEmbargo class="txtLegalElection">La loi &eacute;lectorale nous interdit de diffuser des r&eacute;sultats &eacute;lectoraux sur Internet avant la fermeture de tous les bureaux de scrutin au pays. Pour cette raison, vous ne pourrez pas publier de commentaires avant 22 h (HAE).</div>';
        output += '<div id=avertissementEmbargo></div>';
        //output += '<div id=avertissementEmbargo class="txtLegalElection">Radio-Canada est pr&eacute;sentement en train de mettre &agrave; jour le syst&egrave;me de gestion des commentaires. Nous pr&eacute;voyons r&eacute;tablir cette fonctionnalit&eacute; sous peu.</div>';	
        output += '<div id="commentTotalTitle"></div>';

        output += '<select id="sortSelect" class="sortSelect" style="display:none;" size="1" onchange="src_sortComments(this, this.options[this.selectedIndex].value);">';
        output += '<option value="descending">Afficher les plus r&eacute;cents</option>';
        output += '<option value="ascending">Afficher les plus anciens</option>';
        output += '<option value="RecommendationsDescending">Les plus appr&eacute;ci&eacute;s</option>';

        output += '</select>';

        if (_450 == true) {
            output += '<p class="code-pertinent">Contributions pertinentes</p>';
        }

        output += '<div class="comment-abuse" id="commentAbuse">';
        output += '<input type="hidden" id="abuseKey" name="abuseKey" value="" />';
        output += '<a href="#" onclick="src_closeAbuseForm(); return false;" class="fermer">X</a>';
        output += '<h3>Signalez un abus</h3>';
        output += '<p>Signalez dans un commentaire : (Requis)</p>';
        output += '<select id="abuseType" name="abuseType" size="1">';
        output += '<option value=""></option>';
        output += '<option value="Propos vulgaires">Propos vulgaires</option>';
        output += '<option value="Propos haineux">Propos haineux</option>';
        output += '<option value="Propos racistes">Propos racistes</option>';
        output += '<option value="Propos sexistes">Propos sexistes</option>';
        output += '<option value="Propos homophobes">Propos homophobes</option>';
        output += '<option value="Attaque personnelle">Attaque personnelle</option>';
        output += '<option value="Publicit&eacute; ind&eacute;sirable">Publicit&eacute; ind&eacute;sirable</option>';
        output += '<option value="Violation de droits d\'auteur / plagiat">Violation de droits d\'auteur / plagiat</option>';
        output += '<option value="Autre">Autre</option>';
        output += '</select>';
        output += '<p>Commentaire : (Facultatif)</p>';
        output += '<textarea id="abuseComment"></textarea>';
        output += '<input type="button" id="abuseSubmit" value="Soumettre" onclick="src_submitAbuse();" />';
        output += '</div>';

        output += '<div id="commentList" class="list-comment"><div id="loadingAnim"><span>Veuillez patienter</span></div></div>';
        //output += '<div id="commentNav"></div>';
        HTMLBlock.innerHTML = output;
    }

}

function src_drawFormContent(id) {
    if (isPluckActive === false) return;
}

function removeHTMLTags(inputName) {
    if (document.getElementById && document.getElementById(inputName)) {
        var strInputCode = document.getElementById(inputName).value;
        /*
        This line is optional, it replaces escaped brackets with real ones,
        i.e. < is replaced with < and > is replaced with >
        */
        strInputCode = strInputCode.replace(/&(lt|gt);/g, function (strMatch, p1) {
            return (p1 == "lt") ? "<" : ">";
        });
        var strTagStrippedText = strInputCode.replace(/<\/?[^>]+(>|$)/g, "");

        document.getElementById(inputName).value = strTagStrippedText;
    }
}

function showNoCommentLegalNotice(id) {
    document.getElementById('avertissementEmbargo').style.display = "block";
}

function acceptSignedComments() {
    if (document.getElementById('acceptSignedComments') && document.getElementById('btnSubmit')) {
        var checkSignedComments = document.getElementById('acceptSignedComments');
        var btnSubmit = document.getElementById('btnSubmit');
        if (checkSignedComments.checked) {
            btnSubmit.className = "btnEnvoyer";
            btnSubmit.href = "#";
            btnSubmit.onclick = submitComment;
            Set_Cookie('acceptSignedComments', 'true');
        }
        else {
            document.getElementById('btnSubmit').className = "btnEnvoyerDisabled";
            btnSubmit.onclick = alertSignedComments;
            deleteCookie();
        }
    }
}

// Nettoie le code de balises HTML malveillants.
function submitComment() {
    removeHTMLTags('commentText');

    src_submitComment();

    return false;
}

// Alerte l'utilisateur qu'il doit accepter de révéler son nom. Exécuté si la case à cocher ne l'est pas.
function alertSignedComments() {
    alert('Vous devez accepter que votre pr\u00E9nom et nom de famille soient publi\u00E9s');
}


// Écrit la base du formulaire et les textes légaux dans les DIV destinées à Pluck dans la page. La div pluckform-id doit se trouver dans toutes les pages d'avance.
function showCommentBox(id) {
    if (isPluckActive === false) return;

    var HTMLBlock = document.getElementById('pluckForm-' + id);

    if (HTMLBlock) {
        var output = '';
        output += '<a name="commenter" is="commenter"></a>';
        output += '<div id="commentForm">';
        output += '<h2 class="title-block-gradient" id="commentDisplayText"></h2>';

        output += '<div id="loginLink">';
        output += 'Vous devez &ecirc;tre connect&eacute; pour contribuer &agrave la discussion';
        output += '<ul>';
        output += '<li><a href="#" onclick=\"connect()\">Se connecter</a></li>';
        output += '<li><a href="https://mesabonnements.radio-canada.ca/Register.aspx?redirecturl=' + window.location + '#commentaires" target="_blank">Cr&eacute;er un compte</a></li>';
        output += '</ul>';
        output += '</div>';

        if (!sectionLimitee()) {

            if (_450 == true) {
                output += '<p class="txtLegal"><span class="important">Important</span> Afin de favoriser des discussions riches, respectueuses et constructives, <strong>chaque contribution soumise sur les tribunes de <a href="http://www.radio-canada.ca">Radio-Canada.ca</a> sera dor&eacute;navant sign&eacute;e des nom(s) et pr&eacute;nom(s) de son auteur</strong> (&agrave; l\'exception de la zone Jeunesse). Le nom d\'utilisateur (pseudonyme) ne sera plus affich&eacute;.</p>';
            } else {
                output += '<p class="txtLegal"><span class="important">Important</span> Afin de favoriser des discussions riches, respectueuses et constructives, <strong>chaque commentaire soumis sur les tribunes de <a href="http://www.radio-canada.ca">Radio-Canada.ca</a> sera dor&eacute;navant sign&eacute; des nom(s) et pr&eacute;nom(s) de son auteur</strong> (&agrave; l\'exception de la zone Jeunesse). Le nom d\'utilisateur (pseudonyme) ne sera plus affich&eacute;.</p>';
            }
        }

        if (_450 == true) {
            output += '<p class="txtLegal">En nous soumettant vos contributions, vous reconnaissez que Radio-Canada a le droit de les ';
        } else {
            output += '<p class="txtLegal">En nous soumettant vos commentaires, vous reconnaissez que Radio-Canada a le droit de les ';
        }

        output += 'reproduire et de les diffuser, en tout ou en partie et de quelque mani&egrave;re que ce soit. Veuillez ';

        if (_450 == true) {
            output += 'noter que Radio-Canada ne cautionne pas les opinions exprim&eacute;es. Vos contributions seront mod&eacute;r&eacute;es, ';
        } else {
            output += 'noter que Radio-Canada ne cautionne pas les opinions exprim&eacute;es. Vos commentaires seront mod&eacute;r&eacute;s, ';
        }

        if (_450 == true) {
            output += 'et publi&eacute;es si elles respectent la <a href="#" onclick="oSrc.popup(\'http://www.radio-canada.ca/apropos/politiquesDiffusions/netiquette/popUp.shtml\', \'popup\', \'width=600,height=500,scrollbars=yes\'); return false;">n&eacute;tiquette</a>. Bonne discussion !</p>';
        } else {
            output += 'et publi&eacute;s s\'ils respectent la <a href="#" onclick="oSrc.popup(\'http://www.radio-canada.ca/apropos/politiquesDiffusions/netiquette/popUp.shtml\', \'popup\', \'width=600,height=500,scrollbars=yes\'); return false;">n&eacute;tiquette</a>. Bonne discussion !</p>';
        }

        if (!sectionLimitee()) {
            output += '<div class=confirmSignedComments id=confirmSignedComments><p class=textAcceptSignedComments><input type=checkbox class=chkAcceptSignedComments =acceptSignedComments id=acceptSignedComments onclick=acceptSignedComments() ' + chkAcceptSignedComments + '>&nbsp;J\'accepte que mes nom(s) et pr&eacute;nom(s) soient publi&eacute;s</p></div>';
        }

        output += '<textarea id="ReplyIDHiddenBox" style="display:none;" ></textarea>';
        output += '<textarea id="replytoNameHiddenBox" style="display:none;"></textarea>';

        output += '<div id="ReplyToRemainder"></div><textarea class="comment-block" id="commentText" disabled="disabled" onclick="src_showHideCounter(true);" onpaste="src_toCount(\'commentText\', \'sBann\', \'{CHAR} caract&egrave;res restants\', ' + commentsMaxLength + ');" onblur="src_toCount(\'commentText\', \'sBann\', \'{CHAR} caract&egrave;res restants\', ' + commentsMaxLength + '); src_showHideCounter(false);" onkeyup="src_toCount(\'commentText\', \'sBann\', \'{CHAR} caract&egrave;res restants\', ' + commentsMaxLength + ');"></textarea>';

        output += '<span class="nbCaracteres" id="sBann">' + commentsMaxLength + ' caract&egrave;res restants</span>';
        //output += '<p class="caractere">' + commentsMaxLength + caract&egrave;res minimum</p>';

        var chkAcceptSignedComments = "";
        var btnSubmitClass = "btnEnvoyerDisabled";

        if (isAcceptSignedComments()) {
            chkAcceptSignedComments = 'checked="checked"';
        }

        output += '<div id="formBtn">';
        if (!sectionLimitee() && !isAcceptSignedComments()) {
            output += '<a id="btnSubmit" name="btnSumbit" class="btnEnvoyerDisabled" href="#btnSumbit" onclick="alertSignedComments()">Envoyer</a><br/><br/>';
        }
        else {
            output += '<a id="btnSubmit" name="btnSumbit" class="btnEnvoyer" href="#btnSumbit" onclick="javascript:submitComment();">Envoyer</a><br/><br/>';
        }
        output += '</div>';
        HTMLBlock.innerHTML = output;
    }
}

function replaceUserName() {
    try {
        var cookieName = 'at';
        var cookieValue = readCookie(cookieName);

        var currentNickname = getCurrentNickname(cookieValue);
        var newNickname = getNewNickname(cookieValue);
        replaceNickname(cookieValue, cookieName, currentNickname, newNickname);

        cookieValue = readCookie(cookieName);
    }
    catch (err) {

    }
}

function replaceNickname(cookieValue, cookieName, currentNickname, newNickname) {
    var newCookieValue = cookieValue.replace('&a=' + currentNickname, '&a=' + newNickname);
    Set_Cookie(cookieName, newCookieValue);
    cookieValue = readCookie(cookieName);
}

function getNewNickname(cookieValue) {
    var ARRcookies = cookieValue.split("&pd=");
    var pd = ARRcookies[1];
    var pd2 = UTF8.decode(pd);

    var pd3 = decode_base64(pd2);

    var tabExtendedProfil = pd3.split("&");
    var firstNameComplete = tabExtendedProfil[1].split("=");
    var lastNameComplete = tabExtendedProfil[2].split("=");
    var cityComplete = tabExtendedProfil[4].split("=");

    var firstName = firstNameComplete[1];
    var lastName = lastNameComplete[1];
    var city = cityComplete[1];
    var nickname = firstName + ' ' + lastName + ' de ' + city;
    return nickname;
}

function getCurrentNickname(cookieValue) {
    var afterNickname = cookieValue.split("&a=");
    var nicknameComplete = afterNickname[1].split("&");
    return nicknameComplete[0];
}
UTF8 = {
    encode: function (s) {
        for (var c, i = -1, l = (s = s.split("")).length, o = String.fromCharCode; ++i < l;
			s[i] = (c = s[i].charCodeAt(0)) >= 127 ? o(0xc0 | (c >>> 6)) + o(0x80 | (c & 0x3f)) : s[i]
		);
        return s.join("");
    },
    decode: function (s) {
        for (var a, b, i = -1, l = (s = s.split("")).length, o = String.fromCharCode, c = "charCodeAt"; ++i < l;
			((a = s[i][c](0)) & 0x80) &&
			(s[i] = (a & 0xfc) == 0xc0 && ((b = s[i + 1][c](0)) & 0xc0) == 0x80 ?
			o(((a & 0x03) << 6) + (b & 0x3f)) : o(128), s[++i] = "")
		);
        return s.join("");
    }
};

function decode_base64(s) {
    var e = {}, i, k, v = [], r = '', w = String.fromCharCode;
    var n = [[65, 91], [97, 123], [48, 58], [47, 48], [43, 44]];

    for (z in n) { for (i = n[z][0]; i < n[z][1]; i++) { v.push(w(i)); } }
    for (i = 0; i < 64; i++) { e[v[i]] = i; }

    for (i = 0; i < s.length; i += 72) {
        var b = 0, c, x, l = 0, o = s.substring(i, i + 72);
        for (x = 0; x < o.length; x++) {
            c = e[o.charAt(x)]; b = (b << 6) + c; l += 6;
            while (l >= 8) { r += w((b >>> (l -= 8)) % 256); }
        }
    }
    return r;
}

function isAcceptSignedComments() {
    if (Get_Cookie('acceptSignedComments')) {
        return Get_Cookie('acceptSignedComments');
    }
    return false;
}

function connect() {
    deleteCookie();
    window.location = 'https://inscription.radio-canada.ca/SSOAuthenticationDomain.ashx?mode=login&redirecturl=' + window.location + '#commentaires';
}

function readCookie(c_name) {
    var i, x, y, ARRcookies = document.cookie.split(";");
    for (i = 0; i < ARRcookies.length; i++) {
        x = ARRcookies[i].substr(0, ARRcookies[i].indexOf("="));
        y = ARRcookies[i].substr(ARRcookies[i].indexOf("=") + 1);
        x = x.replace(/^\s+|\s+$/g, "");
        if (x == c_name) {
            return unescape(y);
        }
    }
}

function deleteCookie() {
    Set_Cookie('acceptSignedComments', 'false');
    name = 'acceptSignedComments';
    path = '/';
    domain = ''

    if (Get_Cookie(name)) document.cookie = name + "=" +
	((path) ? ";path=" + path : "") +
	((domain) ? ";domain=" + domain : "") +
	";expires=Thu, 01-Jan-1970 00:00:01 GMT";
}

function getCookie(c_name) {
    var i, x, y, ARRcookies = document.cookie.split(";");
    for (i = 0; i < ARRcookies.length; i++) {
        x = ARRcookies[i].substr(0, ARRcookies[i].indexOf("="));
        y = ARRcookies[i].substr(ARRcookies[i].indexOf("=") + 1);
        x = x.replace(/^\s+|\s+$/g, "");
        if (x == c_name) {
            return unescape(y);
        }
    }
}

function Get_Cookie(c_name) {
    var i, x, y, ARRcookies = document.cookie.split(";");
    for (i = 0; i < ARRcookies.length; i++) {
        x = ARRcookies[i].substr(0, ARRcookies[i].indexOf("="));
        y = ARRcookies[i].substr(ARRcookies[i].indexOf("=") + 1);
        x = x.replace(/^\s+|\s+$/g, "");
        if (x == c_name) {
            return unescape(y);
        }
    }
}

// Vérifie dans quel timezone on se trouve.
function getTime(zone, success) {
    var url = 'http://json-time.appspot.com/time.json?tz=' + zone,
	ud = 'json' + (+new Date());
    window[ud] = function (o) {
        success && success(new Date(o.datetime), o);
    };

    document.getElementsByTagName('head')[0].appendChild(
		(function () {
		    var s = document.createElement('script');
		    s.type = 'text/javascript';
		    s.src = url + '&callback=' + ud;
		    return s;
		}
	)());
}

// Récupère un querrystring de l'URL (pour ancre par exemple)
function getQueryString(qString) {
    hu = window.location.search.substring(1);
    gy = hu.split("&");
    for (i = 0; i < gy.length; i++) {
        ft = gy[i].split("=");
        if (ft[0] == qString) {
            return ft[1];
        }
    }
}


// Désactive les commentaires selon évènements spéciaux (élections)
function verifierEmbargo(time) {
    var data = time;
    var currentTime = (new Date(data)).getTime();

    var beginTime = (new Date(2011, 04, 27, 8, 0, 0, 0)).getTime();
    var endTime = (new Date(2011, 04, 27, 10, 30, 0, 0)).getTime();

    if (beginTime <= currentTime && endTime >= currentTime) {
        return true;
    }
    else {
        return false;
    }
}

function Set_Cookie(name, value) {
    path = '/';
    domain = 'radio-canada.ca'
    secondes = 24 * 60 * 60 * 1000; //1 journée
    var today = new Date();
    today.setTime(today.getTime());
    var expires = new Date(today.getTime() + (secondes));
    var secure = "";


    document.cookie = name + "=" + escape(value) +
	((expires) ? ";expires=" + expires.toGMTString() : "") +
	((path) ? ";path=" + path : "") +
	((domain) ? ";domain=" + domain : "") +
	((secure) ? ";secure" : "");
}

// Variables pour la configuration de base (contenu du fichier legacy pluck.js)

var sDomainExtention = (document.location.host.indexOf(".dev") != -1) ? "dev" : "ca";
sDomainExtention = (document.location.host.indexOf(".pp") != -1) ? "pp" : sDomainExtention; //PP fix
sDomainExtention = (document.location.host.indexOf(".lab") != -1) ? "lab" : sDomainExtention; //lab fix
document.domain = 'radio-canada.' + sDomainExtention;
var sPluckUrl = (sDomainExtention == 'dev') ? 'http://sitelifestage.radio-canada.dev/ver1.0/Direct' : 'http://sitelife.radio-canada.ca/ver1.0/Direct';
var src_serverUrl = sPluckUrl + "/Process";
var isPluckActive = true; // mettre à false pour désactiver

//document.write('<sc'+'ript language="javascript" type="text/javascript" src="http://www.radio-canada.'+sDomainExtention+'/lib/v3/pluck/v2/pluck.js"></sc'+'ript>'); // Pour le loadsummary
//document.write('<sc'+'ript language="javascript" type="text/javascript" src="'+sPluckUrl+'/DirectProxy"></sc'+'ript>'); // Données Proxy pour les méthodes Legacy uniquement.
