Utilisateur:Dr Brains/ZoomOnThumb.js
Apparence
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) ;
Firefox (sur GNU/Linux) / Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.// Permet de zoomer une image ("thumb" ou galerie) au survol de la souris ou au focus du clavier
// Documentation : [[Projet:JavaScript/Notices/ZoomOnThumb]]
// {{Catégorisation JS|ZoomOnThumb}}
//<source lang=javascript>
//<pre><nowiki>
////////////////////////////////////////////////////////////// VARIABLES PERSONNALISABLES //////////////////////////////////////////
//// Images thumb ////
// délai avant zoom en millisecondes
if(typeof(ZoomOnThumb_Delay)=="undefined") var ZoomOnThumb_Delay = 200;
// délai entre deux étapes d'agrandissement en millisecondes
if(typeof(ZoomOnThumb_TimeOut)=="undefined") var ZoomOnThumb_TimeOut = 50;
// multiplicateur de grossissement max
if(typeof(ZoomOnThumb_MaxMultiplicator)=="undefined") var ZoomOnThumb_MaxMultiplicator = 3;
//// Images galeries ////
// délai avant zoom en millisecondes
if(typeof(ZoomOnGallery_Delay)=="undefined") var ZoomOnGallery_Delay = 200;
// délai entre deux étapes d'agrandissement en millisecondes
if(typeof(ZoomOnGallery_TimeOut)=="undefined") var ZoomOnGallery_TimeOut = 50;
// pourcentage d'agrandissement entre deux étapes
if(typeof(ZoomOnGallery_ZoomFactor)=="undefined") var ZoomOnGallery_ZoomFactor = 4;
// multiplicateur de grossissement max
if(typeof(ZoomOnGallery_MaxMultiplicator)=="undefined") var ZoomOnGallery_MaxMultiplicator = 3;
////////////////////////////////////////////////////////////// FONCTIONS //////////////////////////////////////////
// --------------------------------------------------- IMAGES THUMB -----------------------------------------------------------------
/* VARIABLES */
var ZoomOnThumb_LinkOnImage = []; // Liste des liens "image"
var ZoomOnThumb_LinkOnImageState = []; // État de zoom : 1 = zoom avant, -1 = zoom arrière, 0 = taille normale
var ZoomOnThumb_LinkOnImageOriginalWidth = []; // Largeur originale de l'image
var ZoomOnThumb_LinkOnImageOriginalHeight = []; // Hauteur originale de l'image
var ZoomOnThumb_LinkOnImageOriginalTarget = []; // Cible originale de l'image (basse résolution)
var ZoomOnThumb_LinkOnImageZoomedTarget = []; // Cible zoomée de l'image (haute résolution)
/* ÉTABLISSEMENT DE LA LISTE DES LIENS "IMAGE" */
function ZoomOnThumb_CheckLinks(){
var Divs = document.getElementsByTagName('div');
for(var a=0;a<Divs.length;a++){
if($(Divs[a]).hasClass("thumbinner")){
var DivThumb = Divs[a];
var Parent = DivThumb.parentNode;
while(Parent){
if(Parent.className && (Parent.className.indexOf("infobox")!=-1 || Parent.className.indexOf("noZoom")!=-1)) break;
Parent = Parent.parentNode;
}
if(Parent) continue;
$(DivThumb).addClass("nopopups");
var Links = DivThumb.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(/.*\./,"").toLowerCase();
if(['ogg','ogv','pdf','webm'].indexOf(Extension) == -1){
ZoomOnThumb_LinkOnImage.push(LinkOnImage);
}
}
}
}
ZoomOnThumb_ModifyLinks();
}
/* TRANSFORMATION DES LIENS, MISE A JOUR VARIABLES */
function ZoomOnThumb_ModifyLinks(){
for(var b=0;b<ZoomOnThumb_LinkOnImage.length;b++){
var ThisLink = ZoomOnThumb_LinkOnImage[b];
ThisLink.id = "ZoomLink_" +b;
ThisLink.onmouseover = function(){
var ID = parseInt(this.id.split('ZoomLink_').join(''));
ZoomOnThumb_LinkOnImageState[ID] = 1;
ZoomOnThumb_ReplaceSrc(ID);
setTimeout("ZoomOnThumb_ZoomIn("+ID+");", ZoomOnThumb_Delay);
}
ThisLink.onfocus = function(){
var ID = parseInt(this.id.split('ZoomLink_').join(''));
ZoomOnThumb_LinkOnImageState[ID] = 1;
ZoomOnThumb_ReplaceSrc(ID);
setTimeout("ZoomOnThumb_ZoomIn("+ID+");", ZoomOnThumb_Delay);
}
ThisLink.onmouseout = function(){
var ID = parseInt(this.id.split('ZoomLink_').join(''));
ZoomOnThumb_LinkOnImageState[ID] = -1;
ZoomOnThumb_ZoomOut(ID);
}
ThisLink.onblur = function(){
var ID = parseInt(this.id.split('ZoomLink_').join(''));
ZoomOnThumb_LinkOnImageState[ID] = -1;
ZoomOnThumb_ZoomOut(ID);
}
var ThisDiv = ThisLink.parentNode;
ThisDiv.id = "ZoomDiv_" +b;
var ThisImage = ThisLink.getElementsByTagName('img')[0];
ThisImage.id = "ZoomImage_" +b;
ZoomOnThumb_LinkOnImageOriginalWidth[b] = ThisImage.width;
ZoomOnThumb_LinkOnImageOriginalHeight[b] = ThisImage.height;
ZoomOnThumb_LinkOnImageOriginalTarget[b] = ThisImage.src;
ZoomOnThumb_LinkOnImageState[b] = 0;
}
}
/* ZOOM AVANT */
function ZoomOnThumb_ZoomIn(ID){
if(ZoomOnThumb_LinkOnImageState[ID]!= 1) return;
var Image = document.getElementById('ZoomImage_'+ID);
var Div = document.getElementById('ZoomDiv_'+ID);
if((!Image)||(!Div)) 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<(ZoomOnThumb_LinkOnImageOriginalWidth[ID]*ZoomOnThumb_MaxMultiplicator)){
var NewImageWidth = parseInt(ImageWidth * 1.05);
var NewImageHeight = parseInt(ImageHeight * 1.05);
if(NewImageWidth>ContentWidth) return;
Image.width = NewImageWidth;
Image.height = NewImageHeight;
Div.style.width = (2+NewImageWidth) + 'px';
setTimeout("ZoomOnThumb_ZoomIn("+ID+");", ZoomOnThumb_TimeOut);
}
}
/* ZOOM ARRIÈRE */
function ZoomOnThumb_ZoomOut(ID){
if(ZoomOnThumb_LinkOnImageState[ID]!= -1) return;
var Image = document.getElementById('ZoomImage_'+ID);
var Div = document.getElementById('ZoomDiv_'+ID);
if((!Image)||(!Div)) return;
var ImageWidth = parseInt(Image.width);
var ImageHeight = parseInt(Image.height);
if(ImageWidth>ZoomOnThumb_LinkOnImageOriginalWidth[ID]){
var NewImageWidth = parseInt(ImageWidth * 0.8);
var NewImageHeight = parseInt(ImageHeight * 0.8);
if(NewImageWidth<ZoomOnThumb_LinkOnImageOriginalWidth[ID]){
NewImageWidth = ZoomOnThumb_LinkOnImageOriginalWidth[ID];
NewImageHeight = ZoomOnThumb_LinkOnImageOriginalHeight[ID];
Image.src = ZoomOnThumb_LinkOnImageOriginalTarget[ID];
ZoomOnThumb_LinkOnImageState[ID] = 0;
}
Image.width = NewImageWidth;
Image.height = NewImageHeight;
Div.style.width = (2+NewImageWidth) + 'px';
setTimeout("ZoomOnThumb_ZoomOut("+ID+");", ZoomOnThumb_TimeOut);
}
}
/* RECHERCHE CIBLE DE L'IMAGE EN HAUTE RÉSOLUTION */
function ZoomOnThumb_ReplaceSrc(ID){
var Image = document.getElementById('ZoomImage_'+ID);
var Link = document.getElementById('ZoomLink_'+ID);
if((!Image)||(!Link)) return;
if(ZoomOnThumb_LinkOnImageZoomedTarget[ID]){
Image.src = ZoomOnThumb_LinkOnImageZoomedTarget[ID];
return;
}
var Cible = mw.config.get('wgFormattedNamespaces')[6] + ':' + decodeURIComponent(Link.href).split('File:')[1].replace(/(&|\?)uselang=.*/, '');
var queryopt = {
action: 'query',
prop: 'imageinfo',
iiprop: 'url',
iiurlwidth: (ZoomOnThumb_LinkOnImageOriginalWidth[ID]*ZoomOnThumb_MaxMultiplicator),
titles: Cible
}
var api = new mw.Api();
api.get( queryopt ).then( function ( data ) {
var pages = data.query.pages;
if ( pages ) {
for(var index in pages){
if(!pages.hasOwnProperty(index)) continue;
var imageinfo = pages[index].imageinfo[0];
if(!imageinfo) continue;
var thumburl = imageinfo.thumburl;
ZoomOnThumb_LinkOnImageZoomedTarget[ID] = thumburl;
if(ZoomOnThumb_LinkOnImageState[ID]!= 1) return;
Image.src = thumburl;
}
}
} );
}
/* LANCEMENT */
mw.loader.using( ['mediawiki.api'], function(){ $( document ).ready(ZoomOnThumb_CheckLinks) });
// --------------------------------------------------- IMAGES GALERIES ---------------------------------------------------------------
/* VARIABLES */
var ZoomOnGallery_LinkOnImage = []; // Liste des liens "image"
var ZoomOnGallery_LinkOnImageState = []; // État de zoom : 1 = zoom avant, -1 = zoom arrière, 0 = taille normale
var ZoomOnGallery_LinkOnImageOriginalWidth = []; // Largeur originale de l'image
var ZoomOnGallery_LinkOnImageOriginalHeight = []; // Hauteur originale de l'image
var ZoomOnGallery_LinkOnImageOriginalTarget = []; // Cible originale de l'image (basse résolution)
var ZoomOnGallery_LinkOnImageZoomedTarget = []; // Cible zoomée de l'image (haute résolution)
/* ÉTABLISSEMENT DE LA LISTE DES LIENS "IMAGE" */
function ZoomOnGallery_CheckLinks(){
var Divs = document.getElementsByTagName('li');
for(var a=0;a<Divs.length;a++){
if($(Divs[a]).hasClass("gallerybox")){
var DivGallery = Divs[a];
$(DivGallery).addClass("nopopups");
var Links = DivGallery.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(/.*\./,"").toLowerCase();
if(['ogg','ogv','pdf','webm'].indexOf(Extension) == -1){
ZoomOnGallery_LinkOnImage.push(LinkOnImage);
}
}
}
}
ZoomOnGallery_ModifyLinks();
}
/* TRANSFORMATION DES LIENS, MISE A JOUR VARIABLES */
function ZoomOnGallery_ModifyLinks(){
for(var b=0;b<ZoomOnGallery_LinkOnImage.length;b++){
var ThisLink = ZoomOnGallery_LinkOnImage[b];
ThisLink.id = "ZoomLink_" +(b+1000);
ThisLink.onmouseover = function(){
var ID = parseInt(this.id.split('ZoomLink_').join(''));
ZoomOnGallery_LinkOnImageState[ID] = 1;
ZoomOnGallery_ReplaceSrc(ID);
setTimeout("ZoomOnGallery_ZoomIn("+ID+");", ZoomOnGallery_Delay);
}
ThisLink.onfocus = function(){
var ID = parseInt(this.id.split('ZoomLink_').join(''));
ZoomOnGallery_LinkOnImageState[ID] = 1;
ZoomOnGallery_ReplaceSrc(ID);
setTimeout("ZoomOnGallery_ZoomIn("+ID+");", ZoomOnGallery_Delay);
}
ThisLink.onmouseout = function(){
var ID = parseInt(this.id.split('ZoomLink_').join(''));
ZoomOnGallery_LinkOnImageState[ID] = -1;
ZoomOnGallery_ZoomOut(ID);
}
ThisLink.onblur = function(){
var ID = parseInt(this.id.split('ZoomLink_').join(''));
ZoomOnGallery_LinkOnImageState[ID] = -1;
ZoomOnGallery_ZoomOut(ID);
}
var ThisDiv1 = ThisLink.parentNode;
ThisDiv1.id = "ZoomDiv1_" +(b+1000);
var ThisThumb = ThisDiv1.parentNode;
ThisThumb.id = "ZoomThumb_" +(b+1000);
var ThisDiv2 = ThisThumb.parentNode;
ThisDiv2.id = "ZoomDiv2_" +(b+1000);
var ThisGalleryBox = ThisDiv2.parentNode;
ThisGalleryBox.id = "ZoomGalleryBox_" +(b+1000);
var ThisImage = ThisLink.getElementsByTagName('img')[0];
ThisImage.id = "ZoomImage_" +(b+1000);
ZoomOnGallery_LinkOnImageOriginalWidth[(b+1000)] = ThisImage.width;
ZoomOnGallery_LinkOnImageOriginalHeight[(b+1000)] = ThisImage.height;
ZoomOnGallery_LinkOnImageOriginalTarget[(b+1000)] = ThisImage.src;
ZoomOnGallery_LinkOnImageState[(b+1000)] = 0;
}
}
/* ZOOM AVANT */
function ZoomOnGallery_ZoomIn(ID){
if(ZoomOnGallery_LinkOnImageState[ID]!= 1) return;
var Image = document.getElementById('ZoomImage_'+ID);
var Div1 = document.getElementById('ZoomDiv1_'+ID);
var Thumb = document.getElementById('ZoomThumb_'+ID);
var Div2 = document.getElementById('ZoomDiv2_'+ID);
var GalleryBox = document.getElementById('ZoomGalleryBox_'+ID);
if((!Image)||(!Div1)||(!Thumb)||(!Div2)||(!GalleryBox)) 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);
var Factor = (100+ZoomOnGallery_ZoomFactor)/100;
var MaxWidth = (parseInt(ZoomOnGallery_LinkOnImageOriginalWidth[ID])*parseInt(ZoomOnGallery_MaxMultiplicator));
if(ImageWidth<MaxWidth){
var NewImageWidth = parseInt(ImageWidth * Factor);
var NewImageHeight = parseInt(ImageHeight * Factor);
if(NewImageWidth>ContentWidth) return;
var MaxSize = NewImageWidth;
if(ImageHeight>NewImageWidth) MaxSize = NewImageHeight;
Image.width = NewImageWidth;
Image.height = NewImageHeight;
Div1.style.width = NewImageWidth + 'px';
Thumb.style.width = Math.floor( MaxSize+30 ) + 'px';
Thumb.style.height = Math.floor( MaxSize+30 ) + 'px';
Div2.style.width = Math.floor( MaxSize+35 ) + 'px';
GalleryBox.style.width = Math.floor( MaxSize+35 ) + 'px';
setTimeout("ZoomOnGallery_ZoomIn("+ID+");", ZoomOnGallery_TimeOut);
}
}
function ZoomOnGallery_GetWidth(Node){
return parseInt(Node.style.width.split("px").join(""));
}
function ZoomOnGallery_GetHeight(Node){
return parseInt(Node.style.height.split("px").join(""));
}
/* ZOOM ARRIÈRE */
function ZoomOnGallery_ZoomOut(ID){
if(ZoomOnGallery_LinkOnImageState[ID]!= -1) return;
var Image = document.getElementById('ZoomImage_'+ID);
var Div1 = document.getElementById('ZoomDiv1_'+ID);
var Thumb = document.getElementById('ZoomThumb_'+ID);
var Div2 = document.getElementById('ZoomDiv2_'+ID);
var GalleryBox = document.getElementById('ZoomGalleryBox_'+ID);
if((!Image)||(!Div1)||(!Thumb)||(!Div2)||(!GalleryBox)) return;
var ImageWidth = parseInt(Image.width);
var ImageHeight = parseInt(Image.height);
var MinWidth = ZoomOnGallery_LinkOnImageOriginalWidth[ID];
var Factor = 0.8;
if(ImageWidth>MinWidth){
var NewImageWidth = parseInt(ImageWidth * Factor);
var NewImageHeight = parseInt(ImageHeight * Factor);
if(NewImageWidth<MinWidth){
Factor = 0.9;
NewImageWidth = parseInt(ImageWidth * Factor);
NewImageHeight = parseInt(ImageHeight * Factor);
if(NewImageWidth<MinWidth){
Factor = 0.95;
NewImageWidth = parseInt(ImageWidth * Factor);
NewImageHeight = parseInt(ImageHeight * Factor);
if(NewImageWidth<MinWidth){
NewImageWidth = ZoomOnGallery_LinkOnImageOriginalWidth[ID];
NewImageHeight = ZoomOnGallery_LinkOnImageOriginalHeight[ID];
Image.src = ZoomOnGallery_LinkOnImageOriginalTarget[ID];
ZoomOnGallery_LinkOnImageState[ID] = 0;
return;
}
}
}
var MaxSize = NewImageWidth;
if(ImageHeight>NewImageWidth) MaxSize = NewImageHeight;
Image.width = NewImageWidth;
Image.height = NewImageHeight;
Image.width = NewImageWidth;
Image.height = NewImageHeight;
Div1.style.width = NewImageWidth + 'px';
Thumb.style.width = (MaxSize+30) + 'px';
Thumb.style.height = (MaxSize+30) + 'px';
Div2.style.width = (MaxSize+35) + 'px';
GalleryBox.style.width = (MaxSize+35) + 'px';
setTimeout("ZoomOnGallery_ZoomOut("+ID+");", ZoomOnGallery_TimeOut);
}
}
/* RECHERCHE CIBLE DE L'IMAGE EN HAUTE RÉSOLUTION */
function ZoomOnGallery_ReplaceSrc(ID){
var Image = document.getElementById('ZoomImage_'+ID);
var Link = document.getElementById('ZoomLink_'+ID);
if((!Image)||(!Link)) return;
if(ZoomOnGallery_LinkOnImageZoomedTarget[ID]){
Image.src = ZoomOnGallery_LinkOnImageZoomedTarget[ID];
return;
}
var Cible = mw.config.get('wgFormattedNamespaces')[6] + ':' + decodeURIComponent(Link.href).split('File:')[1].replace(/(&|\?)uselang=.*/, '');
var queryopt = {
action: 'query',
prop: 'imageinfo',
iiprop: 'url',
iiurlwidth: (ZoomOnGallery_LinkOnImageOriginalWidth[ID]*ZoomOnGallery_MaxMultiplicator),
titles: Cible
}
var api = new mw.Api();
api.get( queryopt ).then( function ( data ) {
var pages = data.query.pages;
if ( pages ) {
for(var index in pages){
if(!pages.hasOwnProperty(index)) continue;
var imageinfo = pages[index].imageinfo[0];
if(!imageinfo) continue;
var thumburl = imageinfo.thumburl;
ZoomOnGallery_LinkOnImageZoomedTarget[ID] = thumburl;
if(ZoomOnGallery_LinkOnImageState[ID] != 1) return;
Image.src = thumburl;
}
}
} );
}
/* LANCEMENT */
mw.loader.using( ['mediawiki.api'], function(){ $( document ).ready(ZoomOnGallery_CheckLinks) });
//</nowiki></pre>
//</source>