Guest User

Userscript Gallerie d'images

a guest
Oct 11th, 2014
655
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name           Galerie d'images
  3. // @namespace      fr.kergoz-panic.watilin
  4. // @description    Génère une galerie dynamique à partir de liens d'images
  5. // @version        1.0
  6. // @include        *
  7. // @exclude        https://www.facebook.com/*
  8. // @grant          none
  9. // ==/UserScript==
  10.  
  11. // si pas de liens d'images dans la page, le script s'arrête
  12. if (!document.querySelectorAll(
  13.   'a[href$=".jpg"], a[href$=".png"], a[href$=".gif"], a[href$=".bmp"]'
  14. ).length) return;
  15.  
  16. {///////////////// styles //////////////////////////////////////////////
  17. GM_addStyle(
  18. '#GMU-diapo-shader\
  19. {\
  20.  background: black;\
  21.  opacity: 0.4;\
  22.  position: fixed;\
  23.  z-index: 1000;\
  24.  top: 0;\
  25.  left: 0;\
  26. }\
  27. #GMU-diapo-wrapper\
  28. {\
  29.  position: absolute;\
  30.  background: black;\
  31.  color: white;\
  32.  text-align: center;\
  33.  font-family: sans-serif;\
  34.  z-index: 1001;\
  35.  top: 1em;\
  36.  margin: 0;\
  37.  padding: 1ex;\
  38. }\
  39. #GMU-diapo-launch\
  40. {\
  41.  position: fixed;\
  42.  bottom: 0;\
  43.  right: 0;\
  44.  z-index: 1000;\
  45.  opacity: 0.67;\
  46.  display: block;\
  47.  background: black;\
  48.  color: white;\
  49.  font-size: small;\
  50.  padding: 0.4ex 1ex 0.4ex 2ex;\
  51.  font-family: sans-serif;\
  52.  text-decoration: none;\
  53.  -moz-border-radius: 2ex 0 0 0;\
  54. }\
  55. .GMU-padded { margin: 0.4em 1em }\
  56. #GMU-diapo-controls a\
  57. {\
  58.  position: absolute;\
  59.  background: black;\
  60.  color: white;\
  61.  opacity: 0.5;\
  62.  display: block;\
  63.  width: 40px;\
  64.  height: 40px;\
  65.  font-family: consolas, "courier new", monospace;\
  66.  font-size: 30px;\
  67.  text-align: center;\
  68.  cursor: pointer;\
  69. }\
  70. #GMU-diapo-controls a:hover\
  71. {\
  72.  opacity: 0.75;\
  73. }\
  74. #GMU-diapo-debug\
  75. {\
  76.  display: block;\
  77.  position: fixed;\
  78.  z-index: 1002;\
  79.  top: 1em;\
  80.  right: 1em;\
  81.  padding: 1ex;\
  82.  min-width: 20em;\
  83.  max-height: 10em;\
  84.  font: 0.6em "courier new";\
  85.  background: white;\
  86.  color: gray;\
  87.  border: solid medium gray;\
  88.  text-align: right;\
  89.  overflow: hidden;\
  90. }\
  91. '
  92. );
  93.  
  94. }
  95. {///////////// variables et fonctions //////////////////////////////////
  96. var Globals = {
  97.   $launch: null,
  98.   $wrapper: null,
  99.   $shader: null,
  100.   $pic: null,
  101.   $controls: null,
  102.   $swap: null,
  103.   $prev: null,
  104.   $next: null,
  105.   $play: null,
  106.   $stop: null,
  107.   $close: null,
  108.   $debug: null,
  109. }
  110.  
  111. var Controls = {
  112.   DELTA: 0.1,
  113.   FRAME: 15,
  114.  
  115.   $: null,
  116.   shown: false,
  117.   hideTimer: 0,
  118.   animTimer: 0,
  119.  
  120.   show: function show() {
  121.     var $style = Controls.$.style;
  122.     $style.display = '';
  123.     // l'opacité n'est pas remise à 0
  124.     function anim() {
  125.       var opacity = $style.opacity * 1;
  126.       if (opacity + Controls.DELTA > 1) {
  127.         $style.opacity = '1';
  128.       } else {
  129.         $style.opacity = opacity + Controls.DELTA;
  130.         Controls.animTimer = setTimeout(anim, Controls.FRAME);
  131.       }
  132.     }
  133.     anim();
  134.   }, // show
  135.  
  136.   hide: function hide() {
  137.     var $style = Controls.$.style;
  138.     function anim() {
  139.       var opacity = $style.opacity * 1;
  140.       if (opacity - Controls.DELTA < 0) {
  141.         $style.opacity = '0';
  142.         $style.display = 'none';
  143.       } else {
  144.         $style.opacity = opacity - Controls.DELTA;
  145.         Controls.animTimer = setTimeout(anim, Controls.FRAME);
  146.       }
  147.     }
  148.     anim();
  149.   }, // hide
  150.  
  151.   mousemove: function mousemove( e ) {
  152.     if (!Controls.shown) {
  153.       clearTimeout(Controls.animTimer);
  154.       Controls.show();
  155.       Controls.shown = true;
  156.     } else {
  157.       clearTimeout(Controls.hideTimer);
  158.       if ('A' != e.target.tagName) {
  159.         // les contrôles ne sont pas masqués si le curseur en survole un
  160.         Controls.hideTimer = setTimeout(function() {
  161.           Controls.hide();
  162.           Controls.shown = false;
  163.         }, 1500);
  164.       }
  165.     }
  166.   }, // mousemove
  167.  
  168.   mouseout: function mouseout() {
  169.     clearTimeout(Controls.animTimer);
  170.     clearTimeout(Controls.hideTimer);
  171.     Controls.hide();
  172.     Controls.shown = false;
  173.   }, // mouseout
  174.  
  175.   keyup: function keyup( e ) {
  176.     if (17 == e.keyCode) {
  177.       Diapo.removeMovable();
  178.     }
  179.   }, // keyup
  180.  
  181.   keydown: function keydown( e ) {
  182.     var actions = {
  183.       17: 'setMovable',    // ctrl
  184.       27: 'close',         // echap
  185.       32: 'togglePlaying', // espace
  186.       37: 'prev',          // gauche
  187.       39: 'next',          // droite
  188.     };
  189.     var k = e.keyCode;
  190.     if (k in actions) {
  191.       e.preventDefault();
  192.       Diapo[actions[k]]();
  193.     }
  194.   }, // keydown
  195.  
  196.   rearrange: function rearrange() {
  197.     var mx = Globals.$wrapper.offsetWidth / 2;
  198.     var my = Globals.$wrapper.offsetHeight / 2;
  199.     var px = mx - 20;
  200.     var py = my - 20;
  201.     Globals.$prev.style.left = px - 55 + 'px';
  202.     Globals.$prev.style.top = py + 'px';
  203.     Globals.$next.style.left = px + 55 + 'px';
  204.     Globals.$next.style.top = py + 'px';
  205.     Globals.$stop.style.left = px + 'px';
  206.     Globals.$stop.style.top = py + 'px';
  207.     Globals.$play.style.left = px + 'px';
  208.     Globals.$play.style.top = py + 'px';
  209.   }, // rearrange
  210.  
  211.   set: function set( $ ) {
  212.     Controls.$ = $;
  213.   }
  214. } // Controls
  215.  
  216. var Diapo = {
  217.  
  218.   hrefs: [],
  219.   index: 0,
  220.   period: 6500,
  221.   timer: 0,
  222.   playing: false,
  223.  
  224.   prev: function prev() {
  225.     Diapo.index = Diapo.index > 0
  226.       ? Diapo.index - 1
  227.       : Diapo.hrefs.length - 1;
  228.     Globals.$pic.src = Diapo.hrefs[Diapo.index];
  229.     centerWrapper();
  230.     Controls.rearrange();
  231.   }, // prev
  232.  
  233.   next: function next() {
  234.     Diapo.index = Diapo.index < Diapo.hrefs.length - 1
  235.       ? Diapo.index + 1
  236.       : 0;
  237.     Globals.$pic.src = Diapo.hrefs[Diapo.index];
  238.     centerWrapper();
  239.     Controls.rearrange();
  240.   }, // next
  241.  
  242.   play: function play() {
  243.     Diapo.timer = setInterval(Diapo.next, Diapo.period);
  244.     Globals.$play.style.display = 'none';
  245.     Globals.$stop.style.display = '';
  246.     Diapo.playing = true;
  247.   }, // play
  248.  
  249.   stop: function stop() {
  250.     clearInterval(Diapo.timer);
  251.     Globals.$stop.style.display = 'none';
  252.     Globals.$play.style.display = '';
  253.     Diapo.playing = false;
  254.   }, // stop
  255.  
  256.   togglePlaying: function togglePlaying() {
  257.     if (Diapo.playing) {
  258.       Diapo.stop();
  259.     } else {
  260.       Diapo.play();
  261.     }
  262.   }, // togglePlaying
  263.  
  264.   close: function close() {
  265.     window.removeEventListener('keydown', Controls.keydown, false);
  266.     Globals.$wrapper.style.display = 'none';
  267.     Globals.$shader.style.display = 'none';
  268.     $launch.style.display = '';
  269.   }, // close
  270.  
  271.   setMovable: function setMovable() {
  272.     Globals.$wrapper.style.cursor = 'move';
  273.   }, // setMovable
  274.  
  275.   removeMovable: function removeMovable() {
  276.     Globals.$wrapper.style.cursor = 'default';
  277.   }, // removeMovable
  278.  
  279.   load: function load() {
  280.     // recherche des liens
  281.     Diapo.hrefs = Array.map(
  282.       document.querySelectorAll('a[href$=".jpg"]'),
  283.       function($) $.href
  284.     );
  285.    
  286.     // mise en cache des images
  287.     var $pic = Globals.$pic,
  288.       $wrapper = Globals.$wrapper;
  289.     function start() {
  290.       $pic.removeEventListener('load', start, false);
  291.       Diapo.play();
  292.     }
  293.     $pic.addEventListener('load', start, false);
  294.     $pic.addEventListener('load', function() {
  295.       $wrapper.replaceChild($pic, $wrapper.firstChild);
  296.       centerWrapper();
  297.       Controls.rearrange();
  298.     }, false);
  299.     $pic.src = Diapo.hrefs[0];
  300.     for (var i = 1, src; src = Diapo.hrefs[i++];) {
  301.       new Image().src = src;
  302.     }
  303.   }, // load
  304.  
  305.   debug: function debug( text ) {
  306.     var $debug = Globals.$debug;
  307.     $debug.style.display = '';
  308.     if ($debug.firstChild) {
  309.       $debug.insertBefore(document.createTextNode(text + '\n'), $debug.firstChild);
  310.     } else {
  311.       $debug.appendChild(document.createTextNode(text + '\n'));
  312.     }
  313.   } // debug
  314.  
  315. } // Diapo
  316.  
  317. function resizeShader() {
  318.   var $style = Globals.$shader.style;
  319.   $style.width = window.innerWidth + 'px';
  320.   $style.height = window.innerHeight + 'px';
  321. } // resizeShader
  322.  
  323. function centerWrapper() {
  324.   var $wrapper = Globals.$wrapper;
  325.   var width = $wrapper.offsetWidth;
  326.   if (width >= window.innerWidth) {
  327.     $wrapper.style.left = 0;
  328.   } else {
  329.     $wrapper.style.left = (window.innerWidth - width) / 2 + 'px';
  330.   }
  331.   var height = $wrapper.offsetHeight;
  332.   if (height >= window.innerHeight) {
  333.     $wrapper.style.top = 0;
  334.   } else {
  335.     $wrapper.style.top = (window.innerHeight - height) / 3 + 'px';
  336.   }
  337. } // centerWrapper
  338.  
  339. }
  340. {/////////////// initialisation ////////////////////////////////////////
  341.  
  342. var launched = false;
  343.  
  344. function launchDiapo( e ) {
  345.   e.preventDefault();
  346.   $launch.style.display = 'none';
  347.   window.addEventListener('keyup', Controls.keyup, false);
  348.   window.addEventListener('keydown', Controls.keydown, false);
  349.  
  350.   if (!launched) {/////////////////////////////////////////////
  351.  
  352.   // créations du shader, l'ombre qui couvre toute la page
  353.   var $shader = Globals.$shader = document.createElement('div');
  354.   $shader.id = 'GMU-diapo-shader';
  355.   resizeShader();
  356.   document.body.appendChild($shader);
  357.  
  358.   // création de l'image principale
  359.   var $pic = Globals.$pic = new Image();
  360.   $pic.id = 'GMU-pic';
  361.  
  362.   // création du bloc central
  363.   var $wrapper = Globals.$wrapper = document.createElement('div');
  364.   $wrapper.id = 'GMU-diapo-wrapper';
  365.   var $span = document.createElement('span');
  366.   $span.className = 'GMU-padded';
  367.   $span.appendChild(document.createTextNode('Veuillez patienter\u2026'));
  368.   $wrapper.appendChild($span);
  369.   var $img = new Image();
  370.   $img.src = 'spinner.gif';
  371.   setTimeout(centerWrapper, 10); // différation (si ça se dit) nécessaire pour prendre en compte la nouvelle largeur
  372.  
  373.   // création du calque de contrôles
  374.   var $controls = Globals.$controls = document.createElement('div');
  375.   $controls.id = 'GMU-diapo-controls';
  376.   $controls.style.display = 'none';
  377.  
  378.   // création des contrôles
  379.   var $prev = Globals.$prev = document.createElement('a');
  380.   $prev.title = 'image précédente';
  381.   $prev.appendChild(document.createTextNode('←'));
  382.   $controls.appendChild($prev);
  383.  
  384.   var $next = Globals.$next = document.createElement('a');
  385.   $next.title = 'image suivante';
  386.   $next.appendChild(document.createTextNode('→'));
  387.   $controls.appendChild($next);
  388.  
  389.   var $stop = Globals.$stop = document.createElement('a');
  390.   $stop.title = 'arrêter le diaporama';
  391.   $stop.appendChild(document.createTextNode('■'));
  392.   $controls.appendChild($stop);
  393.  
  394.   var $play = Globals.$play = document.createElement('a');
  395.   $play.title = 'lancer le diaporama';
  396.   $play.appendChild(document.createTextNode('►')); // ▸
  397.   $controls.appendChild($play);
  398.  
  399.   var $close = Globals.$close = document.createElement('a');
  400.   $close.title = 'fermer';
  401.   $close.appendChild(document.createTextNode('✕'));
  402.   $close.style.top = '0';
  403.   $close.style.right = '0';
  404.   $controls.appendChild($close);
  405.  
  406.   Controls.set($controls);
  407.   $wrapper.appendChild($controls);
  408.   setTimeout(Controls.rearrange, 10);
  409.  
  410.   // création de la boîte d'infos de débogage
  411.   var $debug = Globals.$debug = document.createElement('pre');
  412.   $debug.id = 'GMU-diapo-debug';
  413.   $debug.style.display = 'none';
  414.   document.body.appendChild($debug);
  415.  
  416.   // insertion des éléments dans la page
  417.   document.body.appendChild($wrapper);
  418.   window.addEventListener('resize', function() {
  419.     resizeShader();
  420.     centerWrapper();
  421.   }, false);
  422.  
  423.   Diapo.load();
  424.  
  425.   // interaction avec les contrôles
  426.   $prev.addEventListener('click', Diapo.prev, false);
  427.   $next.addEventListener('click', Diapo.next, false);
  428.   $play.addEventListener('click', Diapo.play, false);
  429.   $stop.addEventListener('click', Diapo.stop, false);
  430.   $close.addEventListener('click', Diapo.close, false);
  431.   $wrapper.addEventListener('mousemove', Controls.mousemove, false);
  432.   $wrapper.addEventListener('mouseout', Controls.mouseout, false);
  433.  
  434.   launched = true;
  435.  
  436.   } else {/////////////////////////////////////////////////////
  437.  
  438.   Globals.$shader.style.display = '';
  439.   Globals.$wrapper.style.display = '';
  440.  
  441.   }
  442. } // launchDiapo
  443.  
  444. // création du bouton de lancement
  445. $launch = document.createElement('a');
  446. $launch.id = 'GMU-diapo-launch';
  447. $launch.href = '#';
  448. $launch.appendChild(document.createTextNode('Diaporama'));
  449. $launch.addEventListener('click', launchDiapo, false);
  450. document.body.appendChild($launch);
  451.  
  452. }
Advertisement
Add Comment
Please, Sign In to add comment