Utilisateur:Dr Brains/ListfilesDeluxe.js

Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
// Permet de zoomer une image au survol de la souris ou au focus du clavier dans la page spécial Special:Listfiles

// Documentation : [[Projet:JavaScript/Notices/ListfilesDeluxe]]

// {{Catégorisation JS|ListfilesDeluxe}}

//<syntaxhighlight lang=javascript>
//<pre><nowiki>
////////////////////////////////////////////////////////////// VARIABLES PERSONNALISABLES //////////////////////////////////////////
 

// délai avant zoom en millisecondes
if(typeof(ListfilesDeluxe_Delay)=="undefined") var ListfilesDeluxe_Delay = 200;
// délai entre deux étapes d'agrandissement en millisecondes
if(typeof(ListfilesDeluxe_TimeOut)=="undefined") var ListfilesDeluxe_TimeOut = 20;
// multiplicateur de grossissement max
if(typeof(ListfilesDeluxe_MaxMultiplicator)=="undefined") var ListfilesDeluxe_MaxMultiplicator = 4;  
 
////////////////////////////////////////////////////////////// FONCTIONS //////////////////////////////////////////

 
/* VARIABLES */
var ListfilesDeluxe_LinkOnImage = new Array();                 // Liste des liens "image"
var ListfilesDeluxe_LinkOnImageState = new Array();            // État de zoom : 1 = zoom avant, -1 = zoom arrière, 0 = taille normale
var ListfilesDeluxe_LinkOnImageOriginalWidth = new Array();    // Largeur originale de l'image
var ListfilesDeluxe_LinkOnImageOriginalHeight = new Array();   // Hauteur originale de l'image
var ListfilesDeluxe_LinkOnImageOriginalTarget = new Array();   // Cible originale de l'image (basse résolution)
var ListfilesDeluxe_LinkOnImageZoomedTarget = new Array();     // Cible zoomée de l'image (haute résolution)
 
/* LANCEMENT */
if(mw.config.get('wgCanonicalSpecialPageName')=="Listfiles")
$(ListfilesDeluxe_CheckLinks);
 
/* ÉTABLISSEMENT DE LA LISTE DES LIENS "IMAGE" */
function ListfilesDeluxe_CheckLinks(){
     var TDs = document.getElementsByTagName('td');
     for(var a=0;a<TDs.length;a++){
          if($(TDs[a]).hasClass("TablePager_col_thumb")){
               var TDThumb = TDs[a];
               $(TDThumb).addClass("nopopups");
               var Links = TDThumb.getElementsByTagName('a');
               var LinkOnImage = Links[0];
               if(LinkOnImage){
                    while(LinkOnImage.className != "image"){
                         LinkOnImage = LinkOnImage.nextSibling;
                         if(!LinkOnImage) break;
                    }
               }
               if(LinkOnImage){
                    var Extension = LinkOnImage.href.replace(/.*\./g,"").toLowerCase();
                    if((Extension!='ogg')&&(Extension!='ogv')&&(Extension!='pdf')){
                         ListfilesDeluxe_LinkOnImage.push(LinkOnImage); 
                    }
               }              
          }
     }
     ListfilesDeluxe_ModifyLinks();
}
 
/* TRANSFORMATION DES LIENS, MISE A JOUR VARIABLES */
function ListfilesDeluxe_ModifyLinks(){
     for(var b=0;b<ListfilesDeluxe_LinkOnImage.length;b++){
          var ThisLink = ListfilesDeluxe_LinkOnImage[b];
          ThisLink.id = "ZoomLink_" +b;
          ThisLink.onmouseover = function(){
               var ID = parseInt(this.id.split('ZoomLink_').join(''));
               ListfilesDeluxe_LinkOnImageState[ID] = 1; 
               ListfilesDeluxe_ReplaceSrc(ID);
               setTimeout("ListfilesDeluxe_ZoomIn("+ID+");", ListfilesDeluxe_Delay);
          }
          ThisLink.onfocus = function(){
               var ID = parseInt(this.id.split('ZoomLink_').join(''));
               ListfilesDeluxe_LinkOnImageState[ID] = 1; 
               ListfilesDeluxe_ReplaceSrc(ID);
               setTimeout("ListfilesDeluxe_ZoomIn("+ID+");", ListfilesDeluxe_Delay);
          }
          ThisLink.onmouseout = function(){
               var ID = parseInt(this.id.split('ZoomLink_').join(''));
               ListfilesDeluxe_LinkOnImageState[ID] = -1; 
               ListfilesDeluxe_ZoomOut(ID);
          }
          ThisLink.onblur = function(){
               var ID = parseInt(this.id.split('ZoomLink_').join(''));
               ListfilesDeluxe_LinkOnImageState[ID] = -1; 
               ListfilesDeluxe_ZoomOut(ID);
          }
          var ThisImage = ThisLink.getElementsByTagName('img')[0];
          ThisImage.id = "ZoomImage_" +b;
          ThisImage.setAttribute('style', 'background:url("http://upload.wikimedia.org/wikipedia/commons/5/5d/Checker-16x16.png");');
          ListfilesDeluxe_LinkOnImageOriginalWidth[b] = ThisImage.width;
          ListfilesDeluxe_LinkOnImageOriginalHeight[b] = ThisImage.height;
          ListfilesDeluxe_LinkOnImageOriginalTarget[b] = ThisImage.src;
          ListfilesDeluxe_LinkOnImageState[b] = 0;
     }
}
 
/* ZOOM AVANT */
function ListfilesDeluxe_ZoomIn(ID){
     if(ListfilesDeluxe_LinkOnImageState[ID]!= 1) return;
 
     var Image = document.getElementById('ZoomImage_'+ID);
     if(!Image) return; 
 
     var ImageWidth = parseInt(Image.width);
     var ImageHeight = parseInt(Image.height);
 
     var Content = document.getElementById("bodyContent");
     if(!Content) Content = document.getElementById("mw_contentholder");
     if(!Content) Content = document.getElementById("article");
     var ContentWidth = (parseInt(Content.offsetWidth) - 30);

     if(ImageWidth<(ListfilesDeluxe_LinkOnImageOriginalWidth[ID]*ListfilesDeluxe_MaxMultiplicator)){
          var NewImageWidth = parseInt(ImageWidth * 1.05);
          var NewImageHeight = parseInt(ImageHeight * 1.05);
          if(NewImageWidth>ContentWidth) return;
          Image.width = NewImageWidth;
          Image.height = NewImageHeight;
          setTimeout("ListfilesDeluxe_ZoomIn("+ID+");", ListfilesDeluxe_TimeOut);
     }
}
 
/* ZOOM ARRIÈRE */
function ListfilesDeluxe_ZoomOut(ID){
     if(ListfilesDeluxe_LinkOnImageState[ID]!= -1) return;
 
     var Image = document.getElementById('ZoomImage_'+ID);
     if(!Image) return;
 
     var ImageWidth = parseInt(Image.width);
     var ImageHeight = parseInt(Image.height);
 
     if(ImageWidth>ListfilesDeluxe_LinkOnImageOriginalWidth[ID]){
          var NewImageWidth = parseInt(ImageWidth * 0.8);
          var NewImageHeight = parseInt(ImageHeight * 0.8);
          if(NewImageWidth<ListfilesDeluxe_LinkOnImageOriginalWidth[ID]){
               NewImageWidth = ListfilesDeluxe_LinkOnImageOriginalWidth[ID];
               NewImageHeight = ListfilesDeluxe_LinkOnImageOriginalHeight[ID];
               Image.src = ListfilesDeluxe_LinkOnImageOriginalTarget[ID];
               ListfilesDeluxe_LinkOnImageState[ID] = 0;
          }
          Image.width = NewImageWidth;
          Image.height = NewImageHeight;
          setTimeout("ListfilesDeluxe_ZoomOut("+ID+");", ListfilesDeluxe_TimeOut);
     }
}
 
/* RECHERCHE CIBLE DE L'IMAGE EN HAUTE RÉSOLUTION */
function ListfilesDeluxe_ReplaceSrc(ID){
     var Image = document.getElementById('ZoomImage_'+ID);
     var Link = document.getElementById('ZoomLink_'+ID);
     if((!Image)||(!Link)) return; 
     if(ListfilesDeluxe_LinkOnImageZoomedTarget[ID]){
          Image.src = ListfilesDeluxe_LinkOnImageZoomedTarget[ID];
          return;
     }
     var Cible = mw.config.get('wgFormattedNamespaces')[6] + ':' + Link.href.split(mw.config.get('wgFormattedNamespaces')[6] + ':')[1];
     var AdresseRequete = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=xml&action=query&prop=imageinfo&iiprop=url&iiurlwidth='+(ListfilesDeluxe_LinkOnImageOriginalWidth[ID]*ListfilesDeluxe_MaxMultiplicator)+'&titles=' + encodeURIComponent(Cible);
     var NouvelleRequete = sajax_init_object();
     NouvelleRequete.open("GET", AdresseRequete, true);
     NouvelleRequete.onreadystatechange = function() {
          if(NouvelleRequete.readyState != 4 || NouvelleRequete.status != 200) return;
          var ObjetXML = NouvelleRequete.responseXML; 
          if(!ObjetXML) return;
          var Info = ObjetXML.getElementsByTagName('ii')[0];
          if(Info){ 
               var NewSrcImage = Info.getAttribute("thumburl");
               ListfilesDeluxe_LinkOnImageZoomedTarget[ID] = NewSrcImage;
               if(ListfilesDeluxe_LinkOnImageState[ID]!= 1) return;
               Image.src = NewSrcImage;
          }
     }
     NouvelleRequete.send(null);
}
 
///////////////////////////////////////////////////////////////////////////////////////////</nowiki></pre></syntaxhighlight>