Basculer le menu
Changer de menu des préférences
Basculer le menu personnel
Non connecté(e)
Votre adresse IP sera visible au public si vous faites des modifications.

MediaWiki:Common.js

Page de l’interface de MediaWiki

Note : après avoir publié vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

  • Firefox / Safari : maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou appuyez sur Ctrl + F5 ou Ctrl + R (⌘ + R sur un Mac).
  • Google Chrome : appuyez sur Ctrl + Maj + R (⌘ + Shift + R sur un Mac).
  •  Edge : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl + F5.
( function () {
    'use strict';

    var css = [
        '#tj-pdf-overlay {',
        '    display: none;',
        '    position: fixed;',
        '    top: 0; left: 0; right: 0; bottom: 0;',
        '    background: rgba(0,0,0,0.75);',
        '    z-index: 9999;',
        '    align-items: center;',
        '    justify-content: center;',
        '}',
        '#tj-pdf-overlay.actif {',
        '    display: flex;',
        '}',
        '#tj-pdf-boite {',
        '    background: #1a1a2e;',
        '    border-radius: 6px;',
        '    width: 90vw;',
        '    height: 92vh;',
        '    display: flex;',
        '    flex-direction: column;',
        '    overflow: hidden;',
        '    box-shadow: 0 8px 32px rgba(0,0,0,0.6);',
        '}',
        '#tj-pdf-entete {',
        '    display: flex;',
        '    align-items: center;',
        '    justify-content: space-between;',
        '    padding: 8px 14px;',
        '    background: #16213e;',
        '    color: #e0e0e0;',
        '    font-family: sans-serif;',
        '    font-size: 13px;',
        '    border-bottom: 1px solid #0f3460;',
        '    flex-shrink: 0;',
        '}',
        '#tj-pdf-titre {',
        '    font-weight: bold;',
        '    color: #a8c7fa;',
        '    white-space: nowrap;',
        '    overflow: hidden;',
        '    text-overflow: ellipsis;',
        '    max-width: 70%;',
        '}',
        '#tj-pdf-actions {',
        '    display: flex;',
        '    gap: 10px;',
        '    align-items: center;',
        '}',
        '#tj-pdf-actions a {',
        '    color: #a8c7fa;',
        '    text-decoration: none;',
        '    font-size: 12px;',
        '    border: 1px solid #0f3460;',
        '    padding: 3px 8px;',
        '    border-radius: 3px;',
        '}',
        '#tj-pdf-actions a:hover { background: #0f3460; }',
        '#tj-pdf-fermer {',
        '    cursor: pointer;',
        '    color: #e0e0e0;',
        '    font-size: 20px;',
        '    line-height: 1;',
        '    padding: 2px 6px;',
        '    border-radius: 3px;',
        '}',
        '#tj-pdf-fermer:hover { background: #c0392b; color: #fff; }',
        '#tj-pdf-iframe {',
        '    flex: 1;',
        '    border: none;',
        '    width: 100%;',
        '}'
    ].join( '\n' );

    var style = document.createElement( 'style' );
    style.textContent = css;
    document.head.appendChild( style );

    var overlay = document.createElement( 'div' );
    overlay.id = 'tj-pdf-overlay';
    overlay.innerHTML = [
        '<div id="tj-pdf-boite">',
        '  <div id="tj-pdf-entete">',
        '    <span id="tj-pdf-titre">Document</span>',
        '    <div id="tj-pdf-actions">',
        '      <a id="tj-pdf-telecharger" href="#" target="_blank">⬇ Télécharger</a>',
        '      <span id="tj-pdf-fermer" title="Fermer">✕</span>',
        '    </div>',
        '  </div>',
        '  <iframe id="tj-pdf-iframe" allowfullscreen></iframe>',
        '</div>'
    ].join( '' );
    document.body.appendChild( overlay );

    var BASE_VIEWER = '/pdfjs/web/viewer.html';

    function nomFichier( chemin ) {
        return chemin.split( '/' ).pop().replace( /\.pdf$/i, '' )
            .replace( /[-_]/g, ' ' );
    }

function ouvrirViewer( fichier, page, citation ) {
    page = parseInt( page, 10 ) || 1;
    var url = BASE_VIEWER + '?file=' + encodeURIComponent( fichier ) + '&page=' + page + '&disableHistory=true&disableRange=true&disableStream=true';
    if ( citation ) { url += '&citation=' + encodeURIComponent( citation ); }
    url += '#page=' + page + '&zoom=page-width';
    document.getElementById( 'tj-pdf-titre' ).textContent = nomFichier( fichier );
    document.getElementById( 'tj-pdf-telecharger' ).href = fichier;
    document.getElementById( 'tj-pdf-iframe' ).src = url;
    overlay.classList.add( 'actif' );
    document.body.style.overflow = 'hidden';
  }
function fermerViewer() {
    overlay.classList.remove( 'actif' );
    document.body.style.overflow = '';
}
    document.getElementById( 'tj-pdf-fermer' ).addEventListener( 'click', fermerViewer );
    overlay.addEventListener( 'click', function ( e ) { if ( e.target === overlay ) { fermerViewer(); } } );
    document.addEventListener( 'keydown', function ( e ) { if ( e.key === 'Escape' ) { fermerViewer(); } } );
    document.addEventListener( 'click', function ( e ) {
        var el = e.target.closest( '.tj-sourcedoc' );
        if ( !el ) { return; }
        e.preventDefault();
        ouvrirViewer( el.dataset.fichier, el.dataset.page, el.dataset.citation || '' );
    } );

} )();

/* ══ TJ-Encyclopédie — Page d'accueil ══ */
mw.hook( 'wikipage.content' ).add( function () {
  if ( mw.config.get( 'wgPageName' ) !== 'Accueil' ) return;

  var catColors = {
    'Histoire':      { bg: '#c9a84c', text: '#3a2800' },
    'Doctrine':      { bg: '#7f77dd', text: '#fff' },
    'Science':       { bg: '#1d9e75', text: '#fff' },
    'Biographie':    { bg: '#d85a30', text: '#fff' },
    'Controverses':  { bg: '#e24b4a', text: '#fff' },
    'Société':       { bg: '#378add', text: '#fff' },
    'Bibliographie': { bg: '#639922', text: '#fff' }
  };

  /* ── SLIDER ── */
  var slideEls = document.querySelectorAll( '#tj-slider-data .tj-slide' );
  var slides = [];
  slideEls.forEach( function ( el ) {
    slides.push( {
      bg:    el.getAttribute( 'data-bg' ),
      href:  el.getAttribute( 'data-href' ),
      icon:  el.getAttribute( 'data-icon' ),
      label: el.getAttribute( 'data-label' ),
      desc:  el.getAttribute( 'data-desc' )
    } );
  } );

  var current  = 0;
  var sliderEl = document.getElementById( 'tj-slider' );
  var dotsEl   = document.getElementById( 'tj-dots' );

  if ( sliderEl && slides.length ) {
    function renderSlide( i ) {
      var s = slides[ i ];
      sliderEl.style.background = s.bg;
      sliderEl.style.cursor     = 'pointer';
      sliderEl.onclick = function () { window.location.href = s.href; };
      document.getElementById( 'tj-slide-icon' ).textContent  = s.icon;
      document.getElementById( 'tj-slide-label' ).textContent = s.label;
      document.getElementById( 'tj-slide-desc' ).textContent  = s.desc;
      document.querySelectorAll( '.tj-dot' ).forEach( function ( d, di ) {
        d.style.opacity = di === i ? '1' : '0.35';
        d.style.width   = di === i ? '24px' : '8px';
      } );
    }

    slides.forEach( function ( _, i ) {
      var d = document.createElement( 'span' );
      d.className = 'tj-dot';
      d.addEventListener( 'click', function ( e ) {
        e.stopPropagation();
        current = i;
        renderSlide( i );
      } );
      dotsEl.appendChild( d );
    } );

    renderSlide( 0 );
    setInterval( function () {
      current = ( current + 1 ) % slides.length;
      renderSlide( current );
    }, 3500 );
  }

  /* ── CATÉGORIES ── */
  var catEls  = document.querySelectorAll( '#tj-cats-data .tj-catdata' );
  var catsDiv = document.getElementById( 'tj-cats' );

  if ( catsDiv && catEls.length ) {
    catEls.forEach( function ( el ) {
      var href  = el.getAttribute( 'data-href' );
      var icon  = el.getAttribute( 'data-icon' );
      var label = el.getAttribute( 'data-label' );
      var div   = document.createElement( 'div' );
      div.className = 'tj-cat';
      div.innerHTML = '<div class="tj-cat-icon">' + icon + '</div>'
                    + '<div class="tj-cat-overlay"></div>'
                    + '<span class="tj-cat-label">' + label + '</span>';
      div.addEventListener( 'click', function () { window.location.href = href; } );
      catsDiv.appendChild( div );
    } );
  }

  /* ── DERNIERS ARTICLES ── */
  var container = document.getElementById( 'tj-articles' );
  if ( !container ) return;

  $.ajax( {
    url: mw.util.wikiScript( 'api' ),
    data: { action: 'query', list: 'recentchanges', rctype: 'edit|new', rcnamespace: '0', rclimit: '300', rcprop: 'title', format: 'json' },
    success: function ( data ) {
      var seen = [], pages = [];
      ( data.query.recentchanges || [] ).forEach( function ( rc ) {
        if ( seen.indexOf( rc.title ) === -1 && rc.title !== 'Accueil' ) {
          seen.push( rc.title );
          if ( pages.length < 12 ) pages.push( rc.title );
        }
      } );
      if ( !pages.length ) { container.innerHTML = '<p class="tj-empty">Aucun article récent.</p>'; return; }
      chargerImages( pages );
    }
  } );

  function chargerImages( titres ) {
    $.ajax( {
      url: mw.util.wikiScript( 'api' ),
      data: { action: 'query', titles: titres.join( '|' ), prop: 'pageimages|categories', piprop: 'thumbnail', pithumbsize: '400', cllimit: '5', format: 'json' },
      success: function ( data ) {
        var pages  = data.query.pages;
        var cartes = titres.map( function ( titre ) {
          var page = null;
          Object.values( pages ).forEach( function ( p ) { if ( p.title === titre ) page = p; } );
          if ( !page ) return null;
          var catLabel = '';
          ( page.categories || [] ).forEach( function ( c ) {
            Object.keys( catColors ).forEach( function ( cl ) { if ( c.title.indexOf( cl ) !== -1 && !catLabel ) catLabel = cl; } );
          } );
          return { title: page.title, thumb: page.thumbnail ? page.thumbnail.source : null, cat: catLabel };
        } ).filter( Boolean );
        afficherCartes( cartes );
      }
    } );
  }

  function afficherCartes( cartes ) {
    var html = '';
    cartes.forEach( function ( c ) {
      var url     = mw.util.getUrl( c.title );
      var bgStyle = c.thumb ? 'background-image:url(' + c.thumb + ');background-size:cover;background-position:center;' : 'background-color:#1a1a2a;';
      var col = catColors[ c.cat ] || { bg: '#c9a84c', text: '#3a2800' };
      html += '<a class="tj-art-card" href="' + url + '">'
            + '<div class="tj-art-bg" style="' + bgStyle + '"></div>'
            + '<div class="tj-art-overlay"></div>'
            + '<div class="tj-art-content">'
            + ( c.cat ? '<span class="tj-art-badge" style="background:' + col.bg + ';color:' + col.text + ';">' + c.cat + '</span>' : '' )
            + '<div class="tj-art-title">' + mw.html.escape( c.title ) + '</div>'
            + '</div></a>';
    } );
    container.innerHTML = html || '<p class="tj-empty">Aucun article récent.</p>';
  }
} );

/* ── Le saviez-vous : clic sur la box = ouvre l'article ── */
( function () {
  var idx = { 1: 0, 2: 0 };

  function chargerImages( bloc, articles ) {
    jQuery.ajax( {
      url: mw.util.wikiScript( 'api' ),
      data: { action: 'query', titles: articles.join( '|' ), prop: 'pageimages', piprop: 'thumbnail', pithumbsize: '600', format: 'json' },
      success: function ( data ) {
        Object.values( data.query.pages ).forEach( function ( p ) {
          if ( !p.thumbnail ) return;
          var i = articles.indexOf( p.title );
          if ( i === -1 ) return;
          var el = document.getElementById( 'tj-sbg-' + bloc + '-' + i );
          if ( el ) el.style.backgroundImage = 'url(' + p.thumbnail.source + ')';
        } );
      }
    } );
  }

  function afficher( bloc, i ) {
    var items = document.querySelectorAll( '#tj-saviez-' + bloc + ' .tj-saviez-item' );
    if ( !items.length ) return;
    i = ( i + items.length ) % items.length;
    idx[ bloc ] = i;
    items.forEach( function ( el ) { el.classList.remove( 'actif' ); } );
    items[ i ].classList.add( 'actif' );
  }

  function indexAleatoire( bloc, nbItems ) {
    if ( nbItems <= 1 ) return 0;
    var i;
    do {
      i = Math.floor( Math.random() * nbItems );
    } while ( i === idx[ bloc ] );
    return i;
  }

  mw.hook( 'wikipage.content' ).add( function () {
    if ( !document.getElementById( 'tj-saviez-wrapper' ) ) return;

    document.querySelectorAll( '.tj-saviez-item[data-href]' ).forEach( function ( item ) {
      var href = item.getAttribute( 'data-href' );
      item.addEventListener( 'click', function () { window.location.href = href; } );
    } );

    [ 1, 2 ].forEach( function ( bloc ) {
      var items = document.querySelectorAll( '#tj-saviez-' + bloc + ' .tj-saviez-item' );
      var articles = [];
      items.forEach( function ( el ) { articles.push( el.getAttribute( 'data-article' ) ); } );
      chargerImages( bloc, articles );
      // Départ aléatoire aussi, au lieu de toujours commencer à 0
      afficher( bloc, Math.floor( Math.random() * items.length ) );
    } );

    setInterval( function () {
      var n1 = document.querySelectorAll( '#tj-saviez-1 .tj-saviez-item' ).length;
      afficher( 1, indexAleatoire( 1, n1 ) );
    }, 10000 );

    setInterval( function () {
      var n2 = document.querySelectorAll( '#tj-saviez-2 .tj-saviez-item' ).length;
      afficher( 2, indexAleatoire( 2, n2 ) );
    }, 12000 );
  } );
} )();