1/* 2 * Ensemble d'actions sur l'écran ARTICLE 3 * 4 * 1 - GESTION MENU 5 * 2 - GESTION SOMMAIRE 6 * 3 - GESTION IMAGES 7 * 4 - GESTION TABLEAUX 8 * 5 - GESTION REFERENCES 9 * 6 - GESTION AUTEURS 10 * 7 - GESTION NOTES DE BAS DE PAGE 11 */ 12 13$(document).ready(function () { 14 15 16 /****************************** 1 - GESTION MENU **********************************/ 17 /* Affiche le contenu lié à l'onglet sélectionné. Met en surbrillance cet onglet. */ 18 /**********************************************************************************/ 19 20 $(".js-nav-tab").each(function (i) { 21 // cache tous les onglets sauf le 1er 22 if (i !== 0) { 23 $(this).css({display: "none"}); 24 } 25 }); 26 27 $("#menu li").click(function () { 28 29 $("#menu li").removeClass("active"); 30 $(this).addClass("active"); 31 32 $(".js-nav-tab").css({display: "none"}); 33 34 // On affiche l'onglet concerné 35 var id = $(this).attr("data-target"); 36 $("#" + id).css({display: "block"}); 37 38 // si le sommaire avait été préalablement fixé, on le déverrouille 39 $("#jump-to").removeClass("fixed-summary"); 40 }); 41 42 /******************************** 2 - GESTION SOMMAIRE **************************************************/ 43 /* Construit dynamiquement les éléments du sommaire à partir des titres présents dans l'article. */ 44 /* Met en surbrillance le 1er élement du sommaire. */ 45 /* Vient se placer au bon endroit dans l'article (animation de scroll) lorsqu'on clique sur un élément. */ 46 /* Met en surbrillance l'élement de sommaire concerné. */ 47 /* Fixe le sommaire et les onglets lors du scroll de la page */ 48 /********************************************************************************************************/ 49 50 if ($("#articleHTML").length || $("article").length) { 51 $("#article h2") 52 .filter(function () { 53 if ($.trim($(this).text()) === "") { 54 $(this).remove(); 55 } 56 return $.trim($(this).text()) !== ""; 57 }) 58 .each(function (i) { 59 60 // Place la classe "active" seulement sur le 1er élément du sommaire 61 var selectMenu = ""; 62 if (i === 0) { 63 selectMenu = "active"; 64 } 65 66 // regex permettant de récupérer tous les caractères spéciaux, cad tout ce qui n'est pas une lettre ou un chiffre 67 var regex = /[^a-zA-Z0-9]/g; 68 69 70 if ($("a[id], span[id]", this).length) { 71 var a = $("a[id], span[id]", this).first(); 72 var anchorName = ""; 73 var urlText = ""; 74 if ($("a[id], span[id]", this).html().trim() !== "") { 75 urlText = $("a[id], span[id]", this).first().text(); 76 } else { 77 urlText = $(this).text(); 78 } 79 80 if (a.attr("id") != null) { 81 anchorName = a.attr("id").replace(regex, ""); 82 a.attr("id", anchorName); 83 } else { 84 anchorName = urlText.replace(regex, ""); 85 } 86 87 // $(this).html(urlText); 88 // $(this).before('<a id="' + urlText.replace(regex, "") + '"></a>'); 89 $("#jump-to").append("<a class=\"list-group-item " + selectMenu + "\" href=\"#" + anchorName + "\">" + urlText + "</a>"); 90 } else { 91 $(this).before("<span id=\"" + $(this).html().replace(regex, "") + "\"></span>"); 92 $("#jump-to").append("<a class=\"list-group-item " + selectMenu + "\" href=\"#" + $(this).html().replace(regex, "") + "\">" + $(this).html() + "</a>"); 93 //$("body").append('<a class="list-group-item ' + selectMenu + '" href="#' + $(this).html().replace(regex, "") + '">' + $(this).html() + '</a>'); 94 } 95 }); 96 97 // VARIABLES DE CACHE 98 var dernierId; 99 // Hauteur utilisée pour effectuer un décalage équivalent à la hauteur des onglets + la hauteur d'un titre (lorsque les onglets sont fixés) 100 var decalageOngletsFixes = $("#menu").outerHeight(true) + $("#article h2:first").outerHeight(true); 101 // Hauteur utilisée pour effectuer un décalage équivalent à la hauteur des onglets + la hauteur d'un titre + la hauteur des onglets (lorsque les onglets ne sont pas fixés) 102 var decalageOnglets = $("#menu").outerHeight(true) + $("#article h2:first").outerHeight(true) + $("#menu").outerHeight(true) - 1; 103 // Elements <a> du jump-to 104 var jumptoItems = $("#jump-to").find("a"); 105 // Ancres rattachées au jump-to 106 var ancres = jumptoItems.map(function () { 107 var item = $(this).attr("href"); 108 if (item.length) { 109 if (typeof item === "string" || item instanceof String) { 110 if (!item.match(/[:\(\)\.;]+/g)) { 111 if ($(item) && $(item) !== undefined) { 112 return $(item); 113 } 114 } 115 } else { 116 return item; 117 } 118 } 119 }); 120 var premiereAncre = $(ancres[0]); 121 // Onglets 122 var containerNavbar = $("#container-menu"); 123 var navbar = $("#menu"); 124 // Sommaire 125 var sommaire = $("#jump-to"); 126 // Article 127 var article = $("#article"); 128 129 // Animation de scroll lorsqu'on clique sur un élément du sommaire 130 jumptoItems.click(function (e) { 131 var anchor = $("a" + $(this).attr("href") + ", span" + $(this).attr("href")).first(); 132 var positionItem; 133 if (sommaire.hasClass("fixed-summary")) { 134 positionItem = anchor.offset().top - decalageOngletsFixes; 135 } else { 136 positionItem = anchor.offset().top - decalageOngletsFixes; 137 // lorsque les onglets ne sont pas fixés, offset() prend en compte la hauteur de ces onglets en plus, du coup il faut le prendre en compte dans le décalage 138 positionItem = anchor.offset().top - decalageOnglets; 139 } 140 $("html, body").stop().animate({ 141 scrollTop: positionItem 142 }, 300); 143 e.preventDefault(); 144 }); 145 146 // Lors du scroll de l'écran 147 $(window).scroll(function () { 148 var scrollbarPosition = $(this).scrollTop(); 149 // Récupère un tableau contenant tous les éléments qui ont été scrollés 150 var cur = ancres.map(function () { 151 if ($(this).offset() !== undefined && $(this).offset().top < scrollbarPosition + decalageOngletsFixes + 1) { 152 return this; 153 } 154 }); 155 156 // Récupère l'id de l'élément courant (dernier élément scrollé). Si il n'y a pas de résultats, récupère l'id de la 1ère ancre 157 cur = cur[cur.length - 1]; 158 var id = cur && cur.length && cur[0] !== undefined ? cur[0].id : premiereAncre.id; 159 160 if (dernierId !== id) { 161 dernierId = id; 162 // Ajoute/Supprime la classe "active" 163 jumptoItems.removeClass("active") 164 .filter("[href=\"#" + id + "\"]").addClass("active"); 165 } 166 167 // Fixe le sommaire quand on scroll la page, et recalcule sa taille 168 if (article.css("display") === "block") { 169 if (premiereAncre.offset() !== undefined && premiereAncre.offset().top < scrollbarPosition + decalageOngletsFixes) { 170 sommaire.addClass("fixed-summary"); 171 172 var new_width = sommaire.parent().width(); 173 sommaire.width(new_width); 174 175 } else { 176 sommaire.removeClass("fixed-summary"); 177 sommaire.width(""); 178 } 179 } 180 181 // Fixe les onglets quand on scroll la page 182 var fixed = false;
183 if (containerNavbar.offset() !== undefined && containerNavbar.offset().top < scrollbarPosition) { 184 if (!fixed) { 185 navbar.addClass("navbar-fixed-top"); 186 fixed = true; 187 } 188 } else { 189 navbar.removeClass("navbar-fixed-top"); 190 fixed = false; 191 } 192 }); 193 } 194 195 /******************************** 3 - GESTION IMAGES ********************************/ 196 /* Gestion des boutons Expand et Collapse. */ 197 /* N'affiche le bouton Save que sur les navigateurs qui gèrent l'attribut download. */ 198 /************************************************************************************/ 199 200 $("figure").not('.articleFramedText figure').each(function () { 201 if ($("> img.embedded-picture, > b img.embedded-picture, > p img.embedded-picture, > u img.embedded-picture ", this).length) { 202 203 $(this).wrap("<div class='row div-figures'><div class='col-sm-12 col-md-12 btn-figures'></div></div>").before("<a class=\"btn btn-primary btn-xs pull-right img-expand\" style=\"display: inline-block;\" alt=\""+ getTranslation("expand") + "\">" + 204 "<span class=\"glyphicon glyphicon-resize-full\" aria-hidden=\"true\">" + 205 "</span></a>"); 206 $("img.embedded-picture", $(this)).addClass("col-sm-6 col-md-6"); 207 208 $("a.btn", $(this).parent()).click(function () { 209 if ($(this).hasClass("img-expand")) { 210 $(this).removeClass("img-expand").addClass("img-collapse"); 211 $("span.glyphicon", $(this)).removeClass("glyphicon-resize-full").addClass("glyphicon-resize-small"); 212 $(this).closest(".div-figures").find("img.col-md-6").removeClass("col-sm-6 col-md-6").addClass("col-sm-12 col-md-12"); 213 } else if ($(this).hasClass("img-collapse")) { 214 $(this).removeClass("img-collapse").addClass("img-expand"); 215 $("span.glyphicon", $(this)).removeClass("glyphicon-resize-small").addClass("glyphicon-resize-full"); 216 $(this).closest(".div-figures").find("img.col-md-12").removeClass("col-sm-12 col-md-12").addClass("col-sm-6 col-md-6"); 217 } 218 }); 219 220 var imgSrc = $("img", this).attr("src"); 221 $(this).before( 222 "<a href=\"" + imgSrc + "\" download=\"image1.jpeg\" class=\"btn btn-primary btn-xs pull-right img-save\" alt=\""+ getTranslation("save") + "\">" + 223 "<span class=\"glyphicon glyphicon-floppy-disk\" aria-hidden=\"true\">" + 224 "</span></a>" 225 ); 226 } 227 }); 228 $("div.js-bloc-image").each(function () { 229 if ($(".img-expand", this).length === 0) { 230 231 $("div.affichage-image img", this).wrap("<div class='col-sm-6 col-md-6'></div>"); 232 var h6 = $(this).parent().closest("h6"); 233 h6.detach().prependTo($(this)); 234 235 236 $("div.affichage-image", this).prepend("<a class=\"btn btn-primary btn-xs pull-right img-expand\" style=\"display: inline-block;\" alt=\""+ getTranslation("expand") + "\">" + 237 "<span class=\"glyphicon glyphicon-resize-full\" aria-hidden=\"true\">" + 238 "</span></a>"); 239 240 $("div.affichage-image a.btn", this).click(function () { 241 if ($(this).hasClass("img-expand")) { 242 $(this).removeClass("img-expand").addClass("img-collapse"); 243 $("span.glyphicon", $(this)).removeClass("glyphicon-resize-full").addClass("glyphicon-resize-small"); 244 $(this).closest(".js-bloc-image").find(".affichage-image").find(".col-md-6").removeClass("col-sm-6 col-md-6").addClass("col-sm-12 col-md-12"); 245 } else if ($(this).hasClass("img-collapse")) { 246 $(this).removeClass("img-collapse").addClass("img-expand"); 247 $("span.glyphicon", $(this)).removeClass("glyphicon-resize-small").addClass("glyphicon-resize-full");
248 $(this).closest(".js-bloc-image").find(".affichage-image").find(".col-md-12").removeClass("col-sm-12 col-md-12").addClass("col-sm-6 col-md-6"); 249 250 } 251 252 }); 253 254 255 var imgSrc = $("img", this).attr("src"); 256 $("div.affichage-image", this).prepend( 257 "<a href=\"" + imgSrc + "\" download=\"image1.jpeg\" class=\"btn btn-primary btn-xs pull-right img-save\" alt=\""+ getTranslation("save") + "\">" + 258 "<span class=\"glyphicon glyphicon-floppy-disk\" aria-hidden=\"true\">" + 259 "</span></a>" 260 ); 261 } else { 262 263 $(".img-expand").click(function () { 264 $(this).css({display: "none"}); 265 $(this).next().css({display: "inline-block"}); 266 var divImage = $(this).closest(".js-bloc-image").find(".affichage-image"); 267 divImage.find(".col-md-6").removeClass("col-sm-6 col-md-6").addClass("col-sm-12 col-md-12"); 268 }); 269 270 $(".img-collapse").click(function () { 271 $(this).css({display: "none"}); 272 $(this).prev().css({display: "inline-block"}); 273 var divImage = $(this).closest(".js-bloc-image").find(".affichage-image"); 274 divImage.find(".col-md-12").removeClass("col-sm-12 col-md-12").addClass("col-sm-6 col-md-6"); 275 }); 276 } 277 }); 278 279 // Masque les boutons Save des images si l'attribut download n'est pas géré par le navigateur 280 var a = document.createElement("a"); 281 if (typeof a.download === "undefined") { 282 $(".img-save").css({display: "none"}); 283 } 284 285 /**************************************** 4 - GESTION TABLEAUX **********************************************/ 286 /* Masque une partie du tableau. Gestion des boutons Expand et Collapse et du flou appliqué sur le tableau. */ 287 /* Gestion du bouton view popup qui ouvre un nouvel onglet contenant uniquement le tableau. */ 288 /************************************************************************************************************/ 289 290 var CONST_NB_LIGNES_AFFICHEES_PAR_DEFAUT = 2; 291 292 $(".js-bloc-tableau").each(function () { 293 var currentBloc = $(this); 294 $(".affichage-tableau tbody", this).each(function () { 295 $(this).find("tr").slice(CONST_NB_LIGNES_AFFICHEES_PAR_DEFAUT).hide(); 296 }); 297 if ($(".tab-expand", this).length === 0 && $(".articleFramedText", this).length === 0) { 298 $("div.table-responsive", this).wrap("<div class='row'></div>").prepend("<div class='js-tableau-flou flou'></div>").wrap("<div class='col-sm-12 col-md-12'></div>"); 299 $(this).prepend("<div class=\"row\">" + 300 "<div class=\"col-sm-12 col-md-12 btn-figures\">" + 301 "<a class=\"btn btn-primary btn-xs pull-right tab-popup\" alt=\""+ getTranslation("popup") + "\">" + 302 "<span class=\"glyphicon glyphicon-new-window\" aria-hidden=\"true\">" + 303 "</span></a>" + 304 "<a class=\"btn btn-primary btn-xs pull-right tab-expand\" alt=\""+ getTranslation("expand") + "\">" + 305 "<span class=\"glyphicon glyphicon-resize-full\" aria-hidden=\"true\">" + 306 "</span></a>" + 307 "</div>" + 308 "</div>"); 309 310 311 $("div.btn-figures a.btn", this).click(function () { 312 if ($(this).hasClass("tab-expand")) { 313 $(this).removeClass("tab-expand").addClass("tab-collapse").show(); 314 $("span.glyphicon", $(this)).removeClass("glyphicon-resize-full").addClass("glyphicon-resize-small"); 315 $(".affichage-tableau tbody", $(currentBloc)).find("tr").slice(CONST_NB_LIGNES_AFFICHEES_PAR_DEFAUT).show(); 316 $(".js-tableau-flou", $(currentBloc)).removeClass("flou"); 317 318 } else if ($(this).hasClass("tab-collapse")) { 319 $(this).removeClass("tab-collapse").addClass("tab-expand"); 320 $("span.glyphicon", $(this)).removeClass("glyphicon-resize-small").addClass("glyphicon-resize-full"); 321 $(".affichage-tableau tbody", $(currentBloc)).find("tr").slice(CONST_NB_LIGNES_AFFICHEES_PAR_DEFAUT).hide(); 322 $(".js-tableau-flou", $(currentBloc)).addClass("flou"); 323 } else if ($(this).hasClass("tab-popup")) { 324 var data = "<html><title>" + $("head title").html() + "</title><meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">"; 325 326 // Récupération des fichiers CSS de la page, pour les réappliquer sur le nouvel onglet 327 $("head link[type=\"text/css\"]").each(function () { 328 data += $(this).prop("outerHTML"); 329 }); 330 data += "<body style='overflow:auto; height:100%;'>"; 331 data += "</body>"; 332 data += "</html>"; 333 var newTab = window.open("about:blank", "table_popup", "toolbar=yes,resizable=yes,scrollbars=yes,width=800,height=600,left=0,top=0"); 334 newTab.document.write(data); 335 newTab.focus(); 336 337 // On duplique l'objet pour que les opérations faites desssus n'affectent pas le DOM en même temps
338 var DOMTableau = $(this).closest(".js-bloc-tableau").clone(); 339 DOMTableau.find(".js-tableau-flou").remove(); 340 DOMTableau.find(".btn-figures").remove(); 341 DOMTableau.find(".affichage-tableau tr").show(); 342 343 var content = DOMTableau.prop("outerHTML"); 344 content += "<div style=\"text-align: center;\"><a class=\"btn btn-primary btn-lg\" href=\"javascript:top.close();\"><span class=\"glyphicon glyphicon-remove\" aria-hidden=\"true\"></a></a></div>"; 345 346 newTab.document.body.innerHTML = content; 347 348 } 349 }); 350 351 352 } else if($(".tab-expand", this).length > 0 && $(".articleFramedText", this).length === 0){ 353 354 $(".tab-expand", this).click(function () { 355 $(this).css({display: "none"}); 356 $(this).next().css({display: "inline-block"}); 357 var divTableau = $(this).closest(".js-bloc-tableau").find(".affichage-tableau"); 358 divTableau.find("tbody tr").slice(CONST_NB_LIGNES_AFFICHEES_PAR_DEFAUT).show(); 359 $(".js-tableau-flou").removeClass("flou"); 360 }); 361 362 $(".tab-collapse", this).click(function () { 363 $(this).css({display: "none"}); 364 $(this).prev().css({display: "inline-block"}); 365 var divTableau = $(this).closest(".js-bloc-tableau").find(".affichage-tableau"); 366 divTableau.find("tbody tr").slice(CONST_NB_LIGNES_AFFICHEES_PAR_DEFAUT).hide(); 367 $(".js-tableau-flou").addClass("flou"); 368 }); 369 370 $(".tab-popup", this).click(function () { 371 var data = "<html><title>" + $("head title").html() + "</title><meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">"; 372 373 // Récupération des fichiers CSS de la page, pour les réappliquer sur le nouvel onglet 374 $("head link[type=\"text/css\"]").each(function () { 375 data += $(this).prop("outerHTML"); 376 }); 377 data += "<body style='overflow:auto; height:100%;'>"; 378 data += "</body>"; 379 data += "</html>"; 380 381 var newTab = window.open("about:blank", "table_popup", "toolbar=yes,resizable=yes,scrollbars=yes,width=800,height=600,left=0,top=0"); 382 newTab.document.write(data); 383 newTab.focus(); 384 385 // On duplique l'objet pour que les opérations faites desssus n'affectent pas le DOM en même temps 386 var DOMTableau = $($(this).closest(".js-bloc-tableau")).clone(); 387 DOMTableau.find(".js-tableau-flou").remove(); 388 DOMTableau.find(".btn-figures").remove(); 389 DOMTableau.find(".affichage-tableau tr").show(); 390 391 var content = DOMTableau.prop("outerHTML"); 392 content += "<div style=\"text-align: center;\"><a class=\"btn btn-primary btn-lg\" href=\"javascript:top.close();\"><span class=\"glyphicon glyphicon-remove\" aria-hidden=\"true\"></a></div>"; 393 394 newTab.document.body.innerHTML = content; 395 }); 396 397 } 398 }); 399 400 401 /******************************************* 5 - GESTION REFERENCES ***********************************************/ 402 /* Fait le lien entre les références et les éléments présents dans l'article. Construit le lien DOI si il existe, */ 403 /* et à condition qu'un autre lien n'est pas déjà présent dans la référence. */ 404 /* Mise en place d'une tooltip affichant dans l'article la référence sur laquelle on pointe. */ 405 /******************************************************************************************************************/ 406 407 var CONST_DOI = "doi:"; 408 var CONST_DOI_HTTPS = "https://doi.org"; 409 var CONST_SLASH = "/"; 410 var CONST_URL_DOI_HTTPS = CONST_DOI_HTTPS+CONST_SLASH; 411 var CONST_SPACE = " "; 412 var CONST_2POINTS = ":"; 413 var CONST_HTTPS = "https://"; 414 var CONST_HTTP = "http://"; 415 var cptReference = 1; 416 $(".js-reference").each(function () { 417 $(this).prepend("<span class=\"js-num-reference\">" + cptReference + ". </span>") 418 .wrapInner("<div id=\"ref_" + cptReference + "\"></div>"); 419 // Ajoute une div spécifique faisant le lien avec les références dans le full text 420 cptReference++; 421 422 423 // Récupère le contenu de la référence 424 var contenuReference = $("div", this).html(); 425 var positionDOI = contenuReference.indexOf(CONST_DOI); 426 var positionDOIHTTPS = contenuReference.indexOf(CONST_DOI_HTTPS);
427 var positionHTTPS = contenuReference.indexOf(CONST_HTTPS); 428 var positionHTTP = contenuReference.indexOf(CONST_HTTP); 429 430 // Reference + URL de type "doi:" 431 if (positionDOI !== -1) { 432 // récupère la position après le mot clé "doi :" ou "doi:" 433 var positionLienDOI = contenuReference.indexOf(CONST_2POINTS, positionDOI) + 1; 434 // on regarde si il y a un espace juste après 435 if (contenuReference.charAt(positionLienDOI) === CONST_SPACE) { 436 positionLienDOI++; 437 } 438 // on regarde si il y a un slash "/" juste après le mot clé "doi:" 439 if (contenuReference.charAt(positionLienDOI) === CONST_SLASH) { 440 positionLienDOI++; 441 } 442 // Récupère le contenu du doi 443 var contenuDOI = contenuReference.substr(positionLienDOI); 444 contenuDOI = contenuDOI.trim(); 445 // Si la partie http ou https n'est pas déjà présente dans le doi, on la rajoute 446 if ((contenuReference.slice(positionLienDOI, CONST_HTTP.length) !== CONST_HTTP) || (contenuReference.slice(positionLienDOI, CONST_HTTPS.length) !== CONST_HTTPS)) { 447 lienURLDOIHTTPS = CONST_URL_DOI_HTTPS + contenuDOI; 448 } 449 var contenuRef = contenuReference.substring(0, positionDOI); 450 var lienDOIHREFHTTPS = "<div><a href=\"" + lienURLDOIHTTPS + "\" target=\"_blank\">" + lienURLDOIHTTPS + "</a></div>"; 451 $("div", this).html(contenuRef + lienDOIHREFHTTPS); 452 } 453 // Reference + URL de type "https://doi.org" 454 if (positionDOIHTTPS !== -1) { 455 // Récupère la position après le mot clé "https://doi.org" 456 var positionlienDOIHTTPS = contenuReference.indexOf(CONST_SLASH, positionDOIHTTPS) + 10; 457 // Récupère le contenu du doi 458 var contenuDOI = contenuReference.substr(positionlienDOIHTTPS); 459 contenuDOI = contenuDOI.trim(); 460 lienDOIURLHTTPS = CONST_URL_DOI_HTTPS + contenuDOI; 461 var contenuRef = contenuReference.substring(0, positionDOIHTTPS); 462 var lienDOIHREFHTTPS = "<div><a href=\"" + lienDOIURLHTTPS + "\" target=\"_blank\">" + lienDOIURLHTTPS + "</a></div>"; 463 $("div", this).html(contenuRef + lienDOIHREFHTTPS); 464 // Reference + URL de type "https" 465 } else if (positionHTTPS !== -1) { 466 // Récupère la position après le mot clé "https" 467 var positionlienURLHTTPS = contenuReference.indexOf(CONST_HTTPS, positionHTTPS); 468 // Récupère le contenu du lien 469 var lienURLHTTPS = contenuReference.substr(positionlienURLHTTPS); 470 lienURLHTTPS = lienURLHTTPS.trim(); 471 //console.log("lienURLHTTPS:"+lienURLHTTPS); 472 var contenuRef = contenuReference.substring(0, positionHTTPS); 473 var lienHREFHTTPS = "<div><a href=\"" + lienURLHTTPS + "\" target=\"_blank\">" + lienURLHTTPS + "</a></div>"; 474 $("div", this).html(contenuRef + lienHREFHTTPS); 475 // Reference + URL de type "http" 476 } else if (positionHTTP !== -1) { 477 // Récupère la position après le mot clé "http" 478 var positionlienURLHTTP = contenuReference.indexOf(CONST_HTTP, positionHTTP); 479 // Récupère le contenu du lien 480 var lienURLHTTP = contenuReference.substr(positionlienURLHTTP); 481 lienURLHTTP = lienURLHTTP.trim(); 482 var contenuRef = contenuReference.substring(0, positionHTTP); 483 var lienHREFHTTP = "<div><a href=\"" + lienURLHTTP + "\" target=\"_blank\">" + lienURLHTTP + "</a></div>"; 484 $("div", this).html(contenuRef + lienHREFHTTP); 485 } 486 487 }); 488 489 490 $("body").append("<div id=\"tooltip_ref\"></div>"); 491 492 var selectedReference; 493 494 $("ref, cite[data-reference]").mouseenter(function () { 495 496 // On enlève le timeout de l'ancienne référence où on était pour ne pas que la tooltip soit masquée lorsqu'on se positionne rapidement sur une autre référence 497 if (typeof selectedReference !== "undefined") { 498 clearTimeout(selectedReference.data("timeoutId")); 499 } 500 selectedReference = $(this); 501 502 var id = $(this).attr("data-reference") ? $(this).attr("data-reference") : $(this).attr("id"); 503 // On duplique l'objet pour que les opérations faites desssus n'affectent pas le DOM en même temps 504 var reference = $("#references").find("#ref_" + id).clone(); 505 // La tooltip ne doit pas contenir le numéro de référence 506 reference.find(".js-num-reference").remove(); 507 508 $("#tooltip_ref").html(reference.html()); 509 $(this).find("#tooltip_ref").fadeIn(400); 510 511 }).mousemove(function (kmouse) { 512 // Décale la tooltip vers le haut en prenant en compte le padding, et en rajoutant 15px 513 var decalageHeightTooltip = 15; 514 var heightTooltip = $("#tooltip_ref").outerHeight(true) + decalageHeightTooltip; 515 516 // Moitié de la largeur de la tooltip 517 var halfWidthTooltip = $("#tooltip_ref").outerWidth(true) / 2; 518 519 // Si la position (abscisse) de la souris est inférieure à la moitié de la largeur de la tooltip (c'est à dire qu'un bout de la tooltip dépasse de l'écran) 520 if (kmouse.pageX < halfWidthTooltip) { 521 // On place la tooltip à une position fixe 522 var positionFixe = $("#article").position().left; 523 $("#tooltip_ref").css({left: positionFixe, top: kmouse.pageY - heightTooltip}).fadeIn(400); 524 } else { 525 // Sinon on peut la laisser s'afficher normalement 526 $("#tooltip_ref").css({ 527 left: kmouse.pageX - halfWidthTooltip, 528 top: kmouse.pageY - heightTooltip 529 }).fadeIn(400); 530 } 531 532 }).mouseleave(function () { 533 var timeoutId = setTimeout(function () { 534 $("#tooltip_ref").fadeOut(400); 535 }, 300); 536 537 //set the timeoutId, allowing us to clear this trigger if the mouse
537comes back over 538 $(this).data("timeoutId", timeoutId); 539 }); 540 541 $("#tooltip_ref").mouseenter(function () { 542 clearTimeout(selectedReference.data("timeoutId")); 543 }).mouseleave(function () { 544 var timeoutId = setTimeout(function () { 545 $("#tooltip_ref").fadeOut(400); 546 }, 400); 547 selectedReference.data("timeoutId", timeoutId); 548 }); 549 550 /************************* 6 - GESTION AUTEURS *************************/ 551 /* Mise en place d'une tooltip affichant les informations de l'auteur. */ 552 /***********************************************************************/ 553 554 $("body").append("<div id='tooltip_author'></div>"); 555 556 var selectedAuthor; 557 var tailleMaxBiography = 150; 558 var endText = "..."; 559 560 $(".js-article-author").mouseenter(function () { 561 562 // On enlève le timeout de l'ancien auteur où on était pour ne pas que la tooltip soit masquée lorsqu'on se positionne rapidement sur un autre auteur 563 if (typeof selectedAuthor !== "undefined") { 564 clearTimeout(selectedAuthor.data("timeoutId")); 565 } 566 selectedAuthor = $(this); 567 568 var id = $(this).attr("data-target"); 569 var content = $("#author").find("#author_" + id).clone(); 570 571 // Si le contenu de la biographie existe et est trop grand, on en affiche qu'une partie pour être sûr que la tooltip ne dépasse pas de l'écran 572 if ($(".js-author-biography").length) { 573 var biography = $(".js-author-biography").html().trim(); 574 if (biography.length > tailleMaxBiography) { 575 biography = biography.substring(0, tailleMaxBiography); 576 biography += endText; 577 content.find(".js-author-biography").html(biography); 578 } 579 } 580 581 $("#tooltip_author").html(content.html()); 582 $(this).find("#tooltip_author").fadeIn(400); 583 584 }).mousemove(function (kmouse) { 585 // Décale la tooltip vers le haut en prenant en compte le padding, et en rajoutant 15px 586 var decalageHeightTooltip = 15; 587 var heightTooltip = $("#tooltip_author").outerHeight(true) + decalageHeightTooltip; 588 589 // Moitié de la largeur de la tooltip 590 var halfWidthTooltip = $("#tooltip_author").outerWidth(true) / 2; 591 592 // Si la position (abscisse) de la souris est inférieure à la moitié de la largeur de la tooltip (c'est à dire qu'un bout de la tooltip dépasse de l'écran) 593 if (kmouse.pageX < halfWidthTooltip) { 594 // On place la tooltip à une position fixe 595 var positionFixe = $("#article").position().left; 596 $("#tooltip_author").css({left: positionFixe, top: kmouse.pageY - heightTooltip}).fadeIn(400); 597 } else { 598 // Sinon on peut la laisser s'afficher normalement 599 $("#tooltip_author").css({ 600 left: kmouse.pageX - halfWidthTooltip, 601 top: kmouse.pageY - heightTooltip 602 }).fadeIn(400); 603 } 604 605 }).mouseleave(function () { 606 var timeoutId = setTimeout(function () { 607 $("#tooltip_author").fadeOut(400); 608 }, 300); 609 610 //set the timeoutId, allowing us to clear this trigger if the mouse comes back over 611 $(this).data("timeoutId", timeoutId); 612 }); 613 614 $("#tooltip_author").mouseenter(function () { 615 clearTimeout(selectedAuthor.data("timeoutId")); 616 }).mouseleave(function () { 617 var timeoutId = setTimeout(function () { 618 $("#tooltip_author").fadeOut(400); 619 }, 400); 620 selectedAuthor.data("timeoutId", timeoutId); 621 }); 622 623 /******************************************* 7 - GESTION DES NOTES DE BAS DE PAGE ************************/ 624 /* Fait le lien entre les notes de bas de page et les éléments présents dans l'article. */ 625 /* Mise en place d'une tooltip affichant dans l'article la note de bas de page sur laquelle on pointe. */ 626 /********************************************************************************************************/ 627 628 var cptRefootnote = 1; 629 $(".js-refootnote").each(function () { 630 if($(this).find(".refootnote-id").length){ 631 $(this).find(".refootnote-id").addClass("js-num-refootnote"); 632 $(this).wrapInner("<div id=\"refootnote_" + cptRefootnote + "\"></div>"); 633 } else { 634 $(this).prepend("<span class=\"js-num-refootnote\">" + cptRefootnote + ". </span>") 635 .wrapInner("<div id=\"refootnote_" + cptRefootnote + "\"></div>"); 636 // Ajoute une div spécifique faisant le lien avec les notes de bas de pages dans le full text 637 cptRefootnote++; 638 } 639 }); 640 641 $("body").append("<div id='tooltip_refootnote'></div>"); 642 643 var selectedRefootnote; 644 645 $("refootnote").mouseenter(function () { 646 647 // On enlève le timeout de l'ancienne note de bas de page où on était pour ne pas que la tooltip soit masquée lorsqu'on se positionne rapidement sur une autre note de bas de page 648 if (typeof selectedRefootnote !== "undefined") { 649 clearTimeout(selectedRefootnote.data("timeoutId")); 650 } 651 selectedRefootnote = $(this); 652 653 var id = $(this).attr("id"); 654 // On duplique l'objet pour que les opérations faites desssus n'affectent pas le DOM en même temps 655 var refootnote = $("#refootnotes").find("#refootnote_" + id).clone(); 656 // La tooltip ne doit pas contenir le numéro de note de bas de page 657 refootnote.find(".js-num-refootnote").remove(); 658 $("#tooltip_refootnote").html(refootnote.html()); 659 $(this).find("#tooltip_refootnote").fadeIn(400); 660 661 }).mousemove(function (kmouse) { 662 // Décale la tooltip vers le haut en prenant en compte le padding, et en rajoutant 15px 663 var decalageHeightTooltip = 15; 664 var heightTooltip = $("#tooltip_refootnote").outerHeight(true) + decalageHeightTooltip; 665 666 // Moitié de la largeur de la tooltip 667 var halfWidthTooltip = $("#tooltip_refootnote").outerWidth(true) / 2; 668 669 // Si la position (abscisse) de la souris est inférieure à la moitié de la largeur de la tooltip (c'est à dire qu'un bout de la tooltip dépasse de l'écran) 670 if (kmouse.pageX < halfWidthTooltip) { 671 // On place la tooltip à une position fixe 672 var positionFixe = $("#article").position().left;
673 $("#tooltip_refootnote").css({left: positionFixe, top: kmouse.pageY - heightTooltip}).fadeIn(400); 674 } else { 675 // Sinon on peut la laisser s'afficher normalement 676 $("#tooltip_refootnote").css({ 677 left: kmouse.pageX - halfWidthTooltip, 678 top: kmouse.pageY - heightTooltip 679 }).fadeIn(400); 680 } 681 682 }).mouseleave(function () { 683 var timeoutId = setTimeout(function () { 684 $("#tooltip_refootnote").fadeOut(400); 685 }, 300); 686 687 //set the timeoutId, allowing us to clear this trigger if the mouse comes back over 688 $(this).data("timeoutId", timeoutId); 689 }); 690 691 $("#tooltip_refootnote").mouseenter(function () { 692 clearTimeout(selectedRefootnote.data("timeoutId")); 693 }).mouseleave(function () { 694 var timeoutId = setTimeout(function () { 695 $("#tooltip_refootnote").fadeOut(400); 696 }, 400); 697 selectedRefootnote.data("timeoutId", timeoutId); 698 }); 699}); 700 701 702var docLanguage = document.documentElement.lang; 703var langDefault = "en-US"; 704var dictionary = { 705 "fr-FR" : { 706 "expand": "Ãtendre", 707 "popup": "Ouvrir", 708 "save" : "Télécharger" 709 }, 710 "en-US" : { 711 "expand": "Expland inline", 712 "popup": "View popup", 713 "save" : "Save" 714 } 715}; 716 717function getTranslation(key) { 718 // Vérifie si la langue du document est dans le dictionnaire 719 if (dictionary[docLanguage] && dictionary[docLanguage][key]) { 720 return dictionary[docLanguage][key]; 721 } 722 // Sinon, utilise la langue par défaut 723 return dictionary[langDefault][key]; 724}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.