1function changeMenuInstance(cbo) 2{ 3 for(i=0;i<cbo.options.length;i++) 4 { 5 var obj = document.getElementById("map_" + cbo.options[i].value); 6 if(obj.id == "map_" + cbo.value) 7 obj.style.display=""; 8 else 9 obj.style.display="none"; 10 } 11} 12 13/* Fonction anonyme auto appelée pour déclencher le fonctionnement du menu */ 14(function() { 15 function workoutCopy() 16 { 17 $("#leftPanel ul > li > a.copy").each(function(){ 18 var $me = $(this); 19 $me.closest("ul").prev("a").css("cursor", "pointer").click(function(evt){ evt.preventDefault(); $me[0].click(); }); 20 }); 21 } 22 23 function moveMenu() 24 { 25 var $leftPanel = $("#leftPanel"); 26 var $menuHolderInLeftPanel = $(".menuHolder", $leftPanel); 27 var $menuHolderInMainPanel = $("#mainPanel .menuHolder").not($menuHolderInLeftPanel); 28 29 if($leftPanel.is(":visible")) 30 { 31 if($menuHolderInLeftPanel.is(":empty")) 32 { 33 $menuHolderInLeftPanel.append($menuHolderInMainPanel.children().remove()).find("ul").removeAttr("style"); 34 neutralizeLeftPanelLink(); 35 workoutCopy(); 36 responsiveMenuOpen(); 37 } 38 } 39 else if($menuHolderInMainPanel.is(":empty")) 40 { 41 $menuHolderInMainPanel.append($menuHolderInLeftPanel.children().remove()).find("ul").removeAttr("style");; 42 setTimeout(function(){ $menuHolderInMainPanel.trigger("runmenuanim"); }, 200); 43 } 44 }; 45 46 function neutralizeLeftPanelLink() 47 { 48 $("#leftPanel .menuHolder li a[href='#']").click(function(e){ e.preventDefault(); }).css("cursor", "default"); //Empeche les liens avec un "#" de se déclencher 49 } 50 51 function iconeMenu() 52 { 53 var $leftPanel = $("#leftPanel"); 54 var $mainPanel = $("#mainPanel"); 55 var $menuIcone = $("#menuIcone"); 56 $menuIcone.click(function(evt){ 57 evt.preventDefault(); 58 if($mainPanel.hasClass("open")) 59 { 60 $("html, body").removeClass("nooverflow"); 61 $mainPanel.css("left",0).removeClass("open").find(">.neutralizer").remove(); 62 $leftPanel.removeClass("scrolling"); 63 unswipe("body"); 64 } 65 else 66 { 67 $("html, body").addClass("nooverflow"); 68 $("<div class=\"neutralizer\"></div>").click(function(){ $menuIcone.trigger("click"); }).appendTo($mainPanel); 69 $mainPanel.addClass("open").css("left",$leftPanel.width()); 70 $leftPanel.addClass("scrolling"); 71 swipe("body", function(){ $menuIcone.trigger("click"); }); 72 } 73 }); 74 75 $(window).resize(function(){ if($mainPanel.hasClass("open")) $menuIcone.trigger("click"); }); 76 }; 77 78 79 $(window).resize( moveMenu ); 80 $(document).ready( function(){ neutralizeLeftPanelLink(); workoutCopy(); responsiveMenuOpen(); moveMenu(); iconeMenu(); }); 81})(); 82 83 84/*Fonction qui permet de gérer l'ouverture du menu en version responsive*/ 85function responsiveMenuOpen() { 86 87 /*Met un toogle d'ouverture sur tous les a*/ 88 $('#leftPanel ul.menu0 a').click(function(){ 89 90 var lastChar = this.href; 91 lastChar = lastChar.slice(- 1); 92 93 //Rem. Si le UL est déjà ouvert et qu'il y a une URL sur le menu on ne relance pas le toogle 94 if(!($(this).next('ul').is(":visible") && lastChar !="#")) 95 $(this).next('ul').slideToggle(); 96 }); 97 98 //Réouverture des menus sélectionnés 99 $('#leftPanel a.menuselected').each(function(){ 100 101 $(this).next('ul').css("display","block"); 102 103 }); 104} 105 106function fireMenuAnim(psIdMenu, poCallbak) 107{ 108 if($(".menuHolder " + psIdMenu).length==1) 109 $(".menuHolder").on("runmenuanim", poCallbak); 110 else 111 poCallbak(); 112} 113 114/*------------------------------------------------------------------------------------------------*/ 115/*GESTION DU SEPARATOR : */ 116/* si on veut supprimer un separator (bordure ou background) du dernier menu */ 117/* $(nomMenu + " li.menu0:last-child").css("border-right","0px"); */ 118/* on enlève par style la propriété qui affiche le separator */ 119/*------------------------------------------------------------------------------------------------*/ 120 121/*--------------------------------------------------------*/
122/*FONCTION POUR L'OUVERTURE DU MENU DEROULANTE VERS LE BAS*/ 123/*--------------------------------------------------------*/ 124function animeMenu(nomMenu,pi_LevelNot,$pi_nbreLevel) 125{ 126 var nomMenu = "#"+nomMenu; 127 var margeDroite = 5; 128 129 var fAnim = function(){ 130 $(nomMenu+" li.menu0").hover(function(){ 131 132 $(nomMenu + " #" + this.id + " > a").addClass("menuHover"); 133 134 //Permet de faire dérouler le menu depuis le début du parent, on crée le décalage 135 var hauteurParent = - ($(this).height()) + "px"; 136 var largeurParent = $(this).width() + margeDroite + "px";//5= petite marge sur la droite 137 $(this).not(".menu"+ pi_LevelNot).find(">ul").css("margin-top","0px" ); 138 $(this).not(".menu"+ pi_LevelNot).find(">ul").css("margin-left",largeurParent ); 139 $(this).not(".menu"+ pi_LevelNot).find(">ul").css("top",$(this).position().top);//On ne met pas "$("#ul" + this.id)" car pour le menu horizontal cela ne déroule pas comme on veut 140 141 //Permet d'afficher le sous-menu au bon endroit. Ex. ne pas dépasser la fenêtre 142 var alevel = this.className.split(" "); 143 var level = alevel[0].replace("menu","").trim(); 144 145 var tailleFenetre = $(window).width(); 146 var positionParent = parseFloat($(this).offset().left); 147 var tailleparent = (level > 0)?$(this).outerWidth() + margeDroite:0; 148 var tailleEnfant = ($(nomMenu + " #ul" + this.id).outerWidth())?parseFloat($(nomMenu + " #ul" + this.id).outerWidth()):0; 149 150 /*if(positionParent + tailleparent + tailleEnfant > tailleFenetre) 151 { 152 if(level > 0) 153 $(nomMenu + " #ul" + this.id).css("right",largeurParent); 154 else 155 $(nomMenu + " #ul" + this.id).css("right",0); 156 } 157 else 158 $(nomMenu + " #ul" + this.id).css("right","auto");*/ 159 //Force à gauche 160 /*var positionPremierMenu = $("#menuMain li.menu0:nth-child(1)").position(); 161 positionPremierMenu = positionPremierMenu.left;*/ 162 //positionPremierMenu = "calc(50% - 270px)";//540 = 250(col1) + 40(margin)+250(col2) 163 164 $(nomMenu + " #ul" + this.id).css("padding-left","35%").css("left",0); 165 166 //Decalage du sous-menu pour éviter que ça ne passe plus sur X colonnes 167 if($pi_nbreLevel > 1) 168 { 169 if($(nomMenu + " #ul" + this.id + " > li").length >= $pi_nbreLevel) 170 { 171 var tailleMaxSousMenu = $(nomMenu + " li.menu1:first").width() * $pi_nbreLevel; 172 if($(nomMenu + " #ul" + this.id).width() < tailleMaxSousMenu) 173 $(nomMenu + " #ul" + this.id).css("right",0); 174 } 175 176 } 177 178 //Ajout de l'effet déroulant 179 $(nomMenu +" #ul" + this.id).stop(true,true).delay("200").slideDown("slow"); 180 181 //Ajout de l'effet déroulant 182 var tailleSousMenu = $(nomMenu +" #ul" + this.id).height(); 183 184 if(tailleSousMenu!=null) 185 { 186 187 if(tailleSousMenu <= 556) 188 tailleSousMenu = 556; 189 else 190 tailleSousMenu = tailleSousMenu + 50; 191 192 $("#mainSousMenu").animate( { height : tailleSousMenu+"px" } , 200, function(){ 193 $("#mainSousMenu").slideDown("fast"); 194 $(".divWidth100Percent.divSousMenu").css("box-shadow","0px 20px 21.6px 2.4px rgba(0, 0, 0, 0.18)"); 195 }); 196 197 /*Ancienne version$("#mainSousMenu").css("height",tailleSousMenu+"px"); 198 $("#mainSousMenu").stop(true,true).delay("100").slideDown("slow"); 199 $(nomMenu +" #ul" + this.id).stop(true,true).delay("100").slideDown("slow");*/ 200 201 //Ajout de l'event pour fermer le sous-menu 202 203 $(nomMenu + " #ul" + this.id + " > .close").click(function(){ 204 $(this).parent().css("display","none"); 205 $("#mainSousMenu").css("height","0px"); 206 $(".divWidth100Percent.divSousMenu").css("box-shadow","none"); 207 }) 208 209 } 210 else 211 { 212 $("#mainSousMenu").css("height","0px"); 213 $(".divWidth100Percent.divSousMenu").css("box-shadow","none"); 214 } 215 } , 216 217 function(){ 218 $(nomMenu + " #ul" + this.id).stop(true,true).delay("200").slideUp("fast"); 219 $(nomMenu + " #" + this.id + " > a").removeClass("menuHover"); 220 221 222 }); 223 224 $(nomMenu+" li.menu2").hover(function(){ 225 226 $(nomMenu + " #" + this.id + " > a").addClass("menuHover"); 227 },function(){ 228 $(nomMenu + " #" + this.id + " > a").removeClass("menuHover"); 229 }); 230 231 //Empeche les liens avec un "#" de se déclencher 232 $(nomMenu+' li a[href=\'#\']').click(function(e){ e.preventDefault(); }).css("cursor", "default"); 233 234 //Fermeture du sous-menu 235 $(nomMenu+" ul.menu0").hover(function(){ 236 237 },function(){
238 $("#mainSousMenu").stop(true,true).delay("100").slideUp("fast"); 239 $(".divWidth100Percent.divSousMenu").css("box-shadow","none"); 240 }); 241 }; 242 243 fireMenuAnim(nomMenu, fAnim); 244} 245 246/*--------------------------------------------------------*/ 247/*FONCTION POUR L'OUVERTURE DU MENU DEROULANTE VERS LE HAUT*/ 248/*--------------------------------------------------------*/ 249function animeMenuUp(nomMenu,pi_LevelNot,$pi_nbreLevel) 250{ 251 var nomMenu = "#"+nomMenu; 252 var margeDroite = 5; 253 254 var fAnim = function(){ 255 //On lance l'animation que sur le premier niveau 256 $(nomMenu+" li.menu0").hover(function(){ 257 258 //Stop l'effet des autres ouvertures 259 $(this).siblings("li").find("ul").stop(true,true); 260 261 $("#" + this.id + " > a").addClass("menuHover"); 262 263 //Recherche la hauteur du premier niveau pour faire le décalage 264 h = $(this).find("ul").first().height(); 265 266 //On enlève les padding de décalage pour faire mouvement, sinon on doit les prendre aussi en compte dans le calcul de la hauteur 267 $("#ul" + this.id).css("top","0" ).css("padding","0").css("margin","0"); 268 269 //Decalage du sous-menu pour éviter que ça ne passe plus sur X colonnes 270 if($pi_nbreLevel > 1) 271 { 272 if($(nomMenu + " #ul" + this.id + " > li").length >= $pi_nbreLevel) 273 { 274 var tailleMaxSousMenu = $(nomMenu + " li.menu1:first").width() * $pi_nbreLevel; 275 if($(nomMenu + " #ul" + this.id).width() < tailleMaxSousMenu) 276 $(nomMenu + " #ul" + this.id).css("right",0); 277 } 278 279 } 280 281 //Lancement de l'animation 282 $("#ul" + this.id).stop(true,true).animate( 283 { 284 height: 'toggle', 285 top:-h 286 }, 1000); 287 } , 288 289 function(){ 290 291 $("#" + this.id + " > a").removeClass("menuHover"); 292 $("#ul" + this.id).stop(true,true).animate({ 293 height:'toggle', 294 top:0 295 }, 1000); 296 297 } ); 298 299 //Pour les sous-menu, on laisse le fonctionnement normal du déroulant sur la droite. 300 $(nomMenu+" li").not(".menu"+ pi_LevelNot).hover(function(){ 301 302 $("#" + this.id + " > a").addClass("menuHover"); 303 304 //Permet de faire dérouler le menu depuis le début du parent, on crée le décalage 305 var hauteurParent = - ($(this).height()) + "px"; 306 var largeurParent = $(this).width() + margeDroite + "px";//5= petite marge sur la droite 307 $(this).not(".menu"+ pi_LevelNot).find("ul").css("margin-top","0px" ); 308 $(this).not(".menu"+ pi_LevelNot).find("ul").css("margin-left",largeurParent ); 309 $(this).not(".menu"+ pi_LevelNot).find("ul").css("top",$(this).position().top);//On ne met pas "$("#ul" + this.id)" car pour le menu horizontal cela ne déroule pas comme on veut 310 311 //Permet d'afficher le sous-menu au bon endroit. Ex. ne pas dépasser la fenêtre 312 var alevel = this.className.split(" "); 313 var level = alevel[0].replace("menu","").trim(); 314 315 var tailleFenetre = $(window).width(); 316 var positionParent = parseFloat($(this).offset().left); 317 var tailleparent = (level > 0)?$(this).outerWidth() + margeDroite:0; 318 var tailleEnfant = ($(nomMenu + " #ul" + this.id).outerWidth())?parseFloat($(nomMenu + " #ul" + this.id).outerWidth()):0; 319 320 if(positionParent + tailleparent + tailleEnfant > tailleFenetre) 321 { 322 if(level > 0) 323 $(nomMenu + " #ul" + this.id).css("right",largeurParent); 324 else 325 $(nomMenu + " #ul" + this.id).css("right",0); 326 } 327 else 328 $(nomMenu + " #ul" + this.id).css("right","auto"); 329 330 331 //Ajout de l'effet déroulant 332 $("#ul" + this.id).stop(true,true).delay("100").slideDown("slow"); 333 } , 334 335 function(){ 336 $("#ul" + this.id).stop(true,true).delay("200").slideUp("fast"); 337 $("#" + this.id + " > a").removeClass("menuHover"); 338 }); 339 //Empeche les liens avec un "#" de se déclencher 340 $(nomMenu+' li a[href=\'#\']').click(function(e){ e.preventDefault(); }).css("cursor", "default"); 341 342 }; 343 344 fireMenuAnim(nomMenu, fAnim); 345} 346 347/*--------------------------------------*/ 348/*FONCTION POUR L'OUVERTURE DU MENU CLIC*/ 349/*--------------------------------------*/ 350function animeMenuClic(nomMenu,b_fromMenu2Niveaux) 351{ 352 var nomMenu = "#"+nomMenu; 353 354 var fAnim = function(){ 355 // On déclare des variables 356 var accordion_head = $(nomMenu + ' li a.HeaderClic'); 357 var accordion_body = $(nomMenu + ' li.contentClic'); 358
359 //On ouvre tous les menus qui sont menuselected. On ouvre rapidement si c'est un menu 2 niveaux pour ne pas avoir l'effet déroulant 360 if(b_fromMenu2Niveaux==true) 361 $(nomMenu + " li a.menuselected").addClass("menuselected").parent().next().css('display',"block"); 362 else 363 $(nomMenu + " li a.menuselected").addClass("menuselected").parent().next().slideDown('normal'); 364 365 accordion_head.click(function(event) { 366 367 //Si on a un lien on le suit et on n'ouvre pas le sous-menu 368 if($(this).attr('href') != '#') 369 return; 370 371 //Pour stopper l'effet du clic et donc par remonter au sommet de la page à cause du # 372 event.preventDefault(); 373 event.stopPropagation(); 374 375 //Si on n'a pas de lien et pas de sous-menu on ne fait rien, évite un mini effet d'ouverture 376 if($(this).parent().next().html()=="") 377 return; 378 379 // On annule l'effet naturel du lien 380 // On vérifie la présence de la classe "menuselected" 381 if ($(this).attr('class').search('menuselected HeaderClic')>0){ 382 383 // On ouvre celui qui suit directement le lien (.HeaderClic) sur lequel on a cliqué 384 $(this).parent().next().stop(true,true).slideToggle('normal'); 385 386 // On enlève la classe .menuselected de tous les liens 387 accordion_head.removeClass('menuselected'); 388 389 // On rajoute la classe .menuselected au lien sur lequel on a cliqué 390 $(this).addClass('menuselected'); 391 } 392 else 393 { 394 //Lance l'ouverture d'un menu qui n'a pas de lien et pas selected 395 $(this).parent().next().slideToggle('normal'); 396 } 397 398 }); 399 //Change le style des liens avec un "#" 400 $(nomMenu+' li a[href=\'#\']').css("cursor", "default"); 401 }; 402 403 fireMenuAnim(nomMenu, fAnim); 404} 405 406/*----------------------------------------------------------*/ 407/*FONCTION POUR L'OUVERTURE DU MENU DEROULANTE 2 NIVEAUX TOP*/ 408/*----------------------------------------------------------*/ 409 410function animeMenu2NiveauxTop(nomMenu,pi_nbreLevel,nomSousMenu,typeSousMenu,pi_nbreCol) 411{ 412 var nomMenu = "#"+nomMenu; 413 var nomSousMenu = "#"+nomSousMenu; 414 var fAnim = function(){ 415 $(nomMenu+" li").hover(function(){ 416 417 $(nomMenu + " #" + this.id + " > a").addClass("menuHover"); 418 419 if(pi_nbreLevel > 1 && $(this).hasClass("menu0"))//Indique qu'il n'y a pas de sous-menu 420 { 421 //Decalage du sous-menu pour éviter que ça ne passe plus sur X colonnes 422 if(pi_nbreCol > 1) 423 { 424 if($(nomMenu + " #ul" + this.id + " > li").length >= pi_nbreCol) 425 { 426 var tailleMaxSousMenu = $(nomMenu + " li.menu1:first").width() * pi_nbreCol; 427 428 if($(nomMenu + " #ul" + this.id).width() < tailleMaxSousMenu) 429 $(nomMenu + " #ul" + this.id).css("right",0); 430 } 431 432 } 433 434 //Ajout de l'effet déroulant 435 $(nomMenu + " #ul" + this.id).stop(true,true).delay("100").slideDown("slow"); 436 } 437 } , 438 439 function(){ 440 if(pi_nbreLevel > 1 && $(this).hasClass("menu0"))//Indique qu'il n'y a pas de sous-menu 441 $(nomMenu + " #ul" + this.id).stop(true,true).delay("200").slideUp("fast"); 442 443 $(nomMenu + " #" + this.id + " > a").removeClass("menuHover"); 444 } ); 445 446 447 //Gère l'ouverture du sous-menu si il n'y a pas de lien 448 $(nomMenu+' li a[href=\'#\']').click(function(e){ 449 450 var idParentEnCours = $(this).parent().get(0).id; 451 452 //Recherche le premier lien qui est != # et != de "javascript..." (menu admin) 453 if(!window.isMobile) 454 var newUrl = $(nomSousMenu + " #ul" + idParentEnCours).find("li a[href!='#']:not([href^='javascript'])").first().attr("href"); 455 456 if(newUrl) 457 $(this).attr("href",newUrl); 458 else//Force l'ouverture du sous-menu 459 { 460 //Pour stopper l'effet du clic et donc par remonter au sommet de la page à cause du # 461 e.preventDefault(); 462 e.stopPropagation(); 463 464 var nomParentDisplay = idParentEnCours; 465 466 while(!$("#"+nomParentDisplay).hasClass("menu0") ) 467 { 468 var myULid = $("#"+nomParentDisplay).parent().get(0).id; 469 var aKey = myULid.split("_"); 470 var id=aKey[1]; 471 472 //recherch du parent de l'élément suivant 473 nomParentDisplay = "mid_"+id; 474 } 475 476 if(typeSousMenu=="clic")//Version click 477 { 478 $(nomSousMenu +" #"+nomParentDisplay).siblings("ul > li").css("display","none");//cherche les frères et les cache 479 $(nomSousMenu +" #"+nomParentDisplay).next().css('display',"block");//affichage du sous-menu 480 } 481 else //Version déroulant 482 { 483 484 //cache les frères et soeurs 485 $(nomSousMenu).find("ul.menu1").css('display',"none");//affichage du sous-menu 486 //Affiche le sous-menu 487 $(nomSousMenu +" #ul"+nomParentDisplay).css('display',"block");//affichage du sous-menu 488 489 //Positionnement du menu en haut 490 $(nomSousMenu +" #ul"+nomParentDisplay).css("top",0); 491 $(nomSousMenu +" #ul"+nomParentDisplay).css("margin",0); 492 493 } 494 495 496 } 497 498 }); 499 }; 500 501 fireMenuAnim(nomMenu, fAnim); 502} 503 504/*---------------------------------------------------------------*/
505/*FONCTION POUR L'OUVERTURE DU MENU DEROULANTE 2 NIVEAUX VERTICAL*/ 506/*---------------------------------------------------------------*/ 507 508function animeMenu2NiveauxDeroulant(nomMenu,pi_LevelNot) 509{ 510 var nomMenu = "#"+nomMenu; 511 512 var fAnim = function(){ 513 //On affecte un style pour cacher les ul du premier niveau si ceux-ci on un style, on le voit encore un peu 514 $(nomMenu + " ul.menu0").addClass("hideLevel"); 515 516 517 //Réouverture du sous-menu 518 if($(nomMenu + " li a.menuselected").parent().length > 0) 519 { 520 var id = " #ul" + $(nomMenu + " li a.menuselected").parent().get(0).id; 521 $(nomMenu + id).css('display',"block"); 522 $(nomMenu +id).css("top",0); 523 $(nomMenu +id).css("margin",0); 524 } 525 526 527 $(nomMenu+" li").hover(function(){ 528 529 $(nomMenu + " #" + this.id + " > a").addClass("menuHover"); 530 531 //Permet de faire dérouler le menu depuis le début du parent, on crée le décalage 532 var hauteurParent = - ($(this).height()) + "px"; 533 var largeurParent = $(this).width() + 5 + "px";//5= petite marge sur la droite 534 $(this).find("ul").not(".menu"+pi_LevelNot).css("margin-top","0px" ); 535 $(this).find("ul").not(".menu"+pi_LevelNot).css("margin-left",largeurParent ); 536 $(this).find("ul").not(".menu"+pi_LevelNot).css("top",$(this).position().top);//On ne met pas "$("#ul" + this.id)" car pour le menu horizontal cela ne déroule pas comme on veut 537 538 539 //Ajout de l'effet déroulant 540 $(nomMenu +" #ul" + this.id).stop(true,true).delay("100").slideDown("slow"); 541 } , 542 543 function(){ 544 $(nomMenu + " #ul" + this.id).not(".menu"+ pi_LevelNot).stop(true,true).delay("200").slideUp("fast"); 545 $(nomMenu + " #" + this.id + " > a").removeClass("menuHover"); 546 }); 547 548 //Empeche les liens avec un "#" de se déclencher 549 $(nomMenu+' li a[href=\'#\']').click(function(e){ e.preventDefault(); }).css("cursor", "default"); 550 }; 551 552 fireMenuAnim(nomMenu, fAnim); 553} 554 555/*------------------------------------------*/ 556/*FONCTIONS POUR L'OUVERTURE DU MENU D'ADMIN*/ 557/*------------------------------------------*/ 558function initAdminMenu() 559{ 560 $(".myArrowAdmin").each(function(){ 561 562 var idArrow = this.id; 563 var aKey = idArrow.split("-"); 564 var pkey=aKey[1]; 565 var pDebutID = aKey[0]; 566 var sParent = ""; 567 568 //Utilisé si menu 2 niveaux pour éviter le conflit des id 569 if(pDebutID.indexOf("imgMenu_") != -1) 570 { 571 var aParent = pDebutID.split("_"); 572 sParent= "#" + aParent[1] + " "; 573 } 574 575 //Permet de faire dérouler 576 $(sParent + "#"+idArrow+", #"+pkey).hover( function(){ 577 578 $(sParent + "#"+pkey).stop(true,true).delay(100);//on attend pour permettre de passer sur le div depuis la flèche 579 $(sParent + "#"+pkey).show("fast") 580 581 }, 582 function(){ 583 $(sParent + "#"+pkey).stop(true,true).delay(200);//on attend pour permettre de passer sur le div depuis la flèche 584 $(sParent + "#"+pkey).hide("fast"); 585 }); 586 587 }); 588 589}
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.