VenomGT / PostAt Respawn

// ==UserScript==
// @name         PostAt Respawn
// @version      2.0.4
// @description  Postez à un instant précis sur les forums JVC
// @author       VenomGT
// @grant        none
// @match        http://www.jeuxvideo.com/forums/*
// @import       https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js
// @updateURL    https://openuserjs.org/scripts/VenomGT/PostAt_(respawn)
// ==/UserScript==
 
/* NOTE : Le script d'origine (celui d'avant Respawn) n'est pas de moi :
je m'en suis pas mal inspiré pour la structure du script mais je l'ai adapté à Respawn
et j'ai modifié quelques trucs pour le rendre plus compact */
 
//On récupère la div contenant le bouton 'post'
var a = $('#bloc-formulaire-forum > form > div.row > div')[2];
if(!a) a = $('#bloc-formulaire-forum > form > div.row > div')[1];
 
//Insertion des boutons et champs de texte
a.innerHTML += "<input id = \"minu\" style = \"width:30px;margin-left:7px;margin-right:7px;margin-bottom:3px;\" placeholder = \"min.\" maxlength = \"2\"></input>";
a.innerHTML += "<input id = \"seco\" style = \"width:30px;margin-left:7px;margin-right:12px;margin-bottom:3px;\" placeholder = \"sec.\" maxlength = \"2\"></input>";
a.innerHTML += "<button id = \"diff\" type = \"button\" style = \"border:1px solid rgba(0,0,0,0);border-radius:2px;cursor:pointer;display:inline-block;margin-bottom:0;padding:0 40px;text-align:center;vertical-align:bottom;white-space:nowrap;background:#7ba1d3;color:#fff;font-weight:700;height:32px;text-transform:uppercase;font-size:13px;margin-right:7px;margin-left:7px;\" onmouseover = \"this.style.backgroundColor='#185fcf';\" onmouseout = \"this.style.backgroundColor='#7ba1d3';\">Différer</button>";
a.innerHTML += "<input id = \"deco\" type = \"text\" readonly style = \"width:30px;margin-left:7px;margin-right:12px;margin-bottom:3px;\"></input>";
a.innerHTML += "<button id = \"annu\" type = \"button\" style = \"border:1px solid rgba(0,0,0,0);border-radius:2px;cursor:pointer;display:inline-block;margin-bottom:0;padding:0 40px;text-align:center;vertical-align:bottom;white-space:nowrap;background:#7ba1d3;color:#fff;font-weight:700;height:32px;text-transform:uppercase;font-size:13px;margin-left:9px;\" onmouseover = \"this.style.backgroundColor='#185fcf';\" onmouseout = \"this.style.backgroundColor='#7ba1d3';\">Annuler</button>";
 
//Sélection des différents éléments affichés
var differer = $('#diff');
var minutes = $('#minu');
var secondes = $('#seco');
var annuler = $('#annu');
var decompte = $('#deco');
 
//On masque le bouton annuler et le décompte
annuler.toggle();
decompte.toggle();
 
//On détecte le click sur un bouton pour lancer la fonction correspondante
$(differer).click(function(){ Differer(); });
$(annuler).click(function(){ reinit(); });
 
var decompte2;
var differer2;
 
function reinit(){ //On remet les boutons, input à leur etat initial
    minutes.fadeIn();
    secondes.fadeIn();
    annuler.hide();
    decompte.hide();
    differer.fadeIn();
    if(differer2 !== null) clearTimeout(differer2);
    if(decompte2 !== null) clearInterval(decompte2);
    minutes.val(null);
    secondes.val(null);
    decompte.val(null);
}
 
function poster(){
    if($('#message_topic').val().length > 0){
        $(".btn-poster-msg").trigger("click"); //Déclenchement du post
    }
    reinit();
}
 
function Differer(){
    var delai;
    var date;
    var minServ;
    var secServ;
    var minEntr = parseInt(minutes.val());
    var secEntr = parseInt(secondes.val());
   
    if(isNaN(minEntr) || isNaN(secEntr) || minEntr>59 || secEntr>59 || minEntr<0 || secEntr<0){ //Vérifie que l'on entre des minutes et secondes valides
        alert("Entrée invalide");
        reinit();
    }
    else {
        $.ajax({
            success: function(output, status, xhr) { //Si la requête aboutit
                 date = xhr.getResponseHeader("Date"); //On récupère la date du serveur
                 var dateServ = new Date(date);
                 //On récupère l'heure du serveur
                 minServ = parseInt(dateServ.getMinutes());
                 secServ = parseInt(dateServ.getSeconds());
                 
                 if((minServ - minEntr) < 5 && (minServ - minEntr) > 0 || (minEntr == minServ && secEntr < secServ)) { alert("Heure dépassée"); } //Si on entre involontairement une heure dépassée (moins de 5 min d'écart)
                 else if((minServ - minEntr) > 5) { minEntr += 60; } //Plus de 5 min d'écart : on souhaite probablement poster à l'heure suivante
 
                 //Calcul du délai avant le post
                 delai = (((minEntr*60+secEntr) - (minServ*60+secServ)) * 1000);
                 
                 if(delai > 0){
                     differer2 = setTimeout(function(){ poster(); }, delai); //On lance la fonction 'post' une fois le délai écoulé
                     decompte.val(parseInt(delai/1000)); //On donne une valeur au compte à rebours affiché
                     
                     differer.toggle();
                     minutes.toggle();
                     secondes.toggle();
                     annuler.fadeToggle();
                     decompte.fadeToggle();
                     
                     decompte2 = setInterval(function(){
                         decompte.val(decompte.val() - 1); //On désincrémente le compte à rebours
                         if(decompte.val() < 0) clearInterval(decompte2);
                     }, 1000);
                 }
             },
             error: function() { //Si la requête échoue
                 alert("Erreur");
                 reinit();
             }
        });
    }
}