Utilisatrice:Slate/common.js

De Inkipédia
< Utilisatrice:Slate
Révision datée du 4 juillet 2016 à 23:45 par Slate (discussion | contributions) (Page créée avec « // ================================================================================ // Countdowns // =====================================================================... »)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche

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).
  • Internet Explorer / Edge : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl + F5.
  • Opera : appuyez sur Ctrl + F5.

// ================================================================================
// Countdowns
// ================================================================================
// Credits go to AbelToy, Guy Perfect, Espyo for the countdown code.

// List of countdowns on the current page
var countdowns = [];

// Converts from time to a clean time info structure
function timeToStruct(time) {

  var passed = time < 0; //Has the moment passed?
  
  // Parse time fields from the number
                                              time = Math.floor(time / 1000);
  var secs  = ("00" + (time % 60)).slice(-2); time = Math.floor(time /   60);
  var mins  = ("00" + (time % 60)).slice(-2); time = Math.floor(time /   60);
  var hours = ("00" + (time % 24)).slice(-2); time = Math.floor(time /   24);

  // Construct the string representation
  return {
    d: time,
    h: hours,
    m: mins,
    s: secs,
    p: passed
  };
  
}

// Gets the time remaining until the next stage rotation
function getStageCountdown(now) {
  var hour   = Math.floor(now / 3600000) % 24 + 2; // Add 2 for UTC bias
  var now    = hour * 3600000 + now % 3600000;     // Current adjusted hour
  var target = (hour + 4 & -4) * 3600000;          // Target hour
  return target - now;
}

function tickCountdowns() {
  var now = Date.now();
  
  for(var c = 0; c < countdowns.length; c++){
    
    var diff = 0;
    if(countdowns[c].stage) {
      diff = timeToStruct(getStageCountdown(now));
    } else {
      diff = timeToStruct(countdowns[c].time - now);
    }
    
    if(diff.p && diff.d < -1) {
      // Over 24 hours passed
      countdowns[c].span.innerHTML = countdowns[c].doneMessage;
    } else if(diff.p){
      // 24 hours haven't passed yet
      countdowns[c].span.innerHTML = countdowns[c].ongoingMessage;
    } else {
      // The time hasn't come yet
      countdowns[c].span.innerHTML =
        ((diff.d > 0) ? (diff.d + " day" + (diff.d == 1 ? "" : "s") + ", ") : "") +
        diff.h + ":" +
        diff.m + ":" +
        diff.s;
    }
  }
}

// Returns the info from a countdown span on the page.
function getCountdownInfo(countdown, stage) {
  var time = null;
  var ongoingMessage = "";
  var doneMessage = "";

  if(!stage) {
    // Format is "<day> <hour>|<24 hour msg>|<afterwards msg>"
    var parts = countdown.innerHTML.split("|");
    doneMessage = (parts.length >= 3) ? parts[2] : parts[1];
    ongoingMessage = parts[1];
    
    var timeParts = parts[0].split(/[ \n]/);
    var date = timeParts[0].split("/");
    var hour = timeParts[1].split(":");
    time = Date.UTC(date[0], date[1] - 1, date[2], hour[0], hour[1]);
  }
  
  countdowns.push( {
    span:           countdown,
    stage:          stage,
    time:           time,
    ongoingMessage: ongoingMessage,
    doneMessage:    doneMessage
  } );
  
  // The spans start hidden and with the info
  // Delete the info and show the span
  countdown.style.display = "inline";
  countdown.innerHTML = "";
}

// Finds countdown spans on the document and sets up the countdowns
function setupCountdowns() {
  var stageCountdowns = document.getElementsByClassName("stageCountdown");
  for(var sc = 0; sc < stageCountdowns.length; sc++) {
    getCountdownInfo(stageCountdowns[sc], true);
  }
  
  var countdowns = document.getElementsByClassName("countdown");
  for(var c = 0; c < countdowns.length; c++) {
    getCountdownInfo(countdowns[c], false);
  }
  
  setInterval(tickCountdowns, 1000);
}

setupCountdowns();