NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name TurboForum // @namespace JV Flux // @description Naviguez plus rapidement sur les forums de jeuxvideo.com // @version 1.4 // @include http://www.jeuxvideo.com/* // @include http://*.forumjv.com/* // @include http://jvflux.com/turboforum/* // ==/UserScript== function geid(id) { return document.getElementById(id) } if (location.href.indexOf('http://www.jeuxvideo.com/forums/') == 0) { var TurboForum = function() { "use strict" function geid(id) { return document.getElementById(id) } function getag(tag) { return document.getElementsByTagName(tag) } function geclass(className) { return document.getElementsByClassName(className) } var turboforum_version = '1.4' function mode_from_url(url) { if (url.indexOf('http://www.jeuxvideo.com/forums/') != 0) { return -1 } return parseInt(url.substr('http://www.jeuxvideo.com/forums/'.length)) } function no_hash(url) { if (url.indexOf('#') == -1) { return url } return url.substr(0, url.indexOf('#')) } function remove_element(elem) { if (typeof elem == 'string') { elem = geid(elem) } if (elem) { elem.parentNode.removeChild(elem) } } function storage(item, data) { if (data == undefined) { return localStorage['turboforum_' + item] } localStorage['turboforum_' + item] = data } var col1 = geid('col1'), current_pathname, yscroll = 0, // 211 pour sauter le header t_count = 0, update_img, update_img_src = 'http://jvflux.com/turboforum/version.gif', p_id = 0, opacity = '.85', p_history = {html: {}, title: {}}, jvchat_on = -2, blacklist = [] var p = [{}, {}] for (var i = 0; i < 2; i++) { p[i].xhr = new XMLHttpRequest() p[i].xhr.id = i p[i].xhr.addEventListener('readystatechange', readystatechange) p[i].url = false p[i].url_alias = false p[i].html = false p[i].title = false p[i].state = '' p[i].timing_start = false p[i].timing = false } function readystatechange(e) { var id = e.target.id if (p[id].xhr.readyState < 4) { return } /* Arrive quand une requête est complétée */ if (p[id].xhr.status != 200) { if (p[id].xhr.status != 404) { window.console && console.log('p[' + id + '].xhr.status ≠ 200 (' + p[id].xhr.status + ') ' + p[id].url) } if (p[id].xhr.status == 0) { /* Arrive aléatoirement, quand ça arrive l’inspecteur réseau de Chrome ne montre pas de requête */ /* Quand ça arrive, les requêtes futures vers cette page donneront la même erreur */ /* Sauf si on crée une image avec comme src l’url du lien, les requêtes futures marchent (sous Chrome du moins) */ new Image().src = p[id].url } } p[id].timing = new Date().getTime() - p[id].timing_start p[id].html = p[id].xhr.responseText.substring(p[id].xhr.responseText.indexOf('<div id="col1">') + ('<div id="col1">' + "\n").length, p[id].xhr.responseText.indexOf('<div id="col2">') - "\n</div>\n".length) p[id].html = add_goodies(p[id].html) p[id].title = p[id].xhr.responseText.substring(p[id].xhr.responseText.indexOf('<title>') + ('<title>').length, p[id].xhr.responseText.indexOf('</title>')) if (mode_from_url(p[id].url) == 26) { p[id].url_alias = p[id].html.substring(p[id].html.indexOf('<p id="rafraichir">'), p[id].html.indexOf('http://image.jeuxvideo.com/pics/forums/bt_forum_rafraichir.gif')).split('"')[3] } p_history.html[no_hash(p[id].url_alias)] = p[id].html p_history.title[no_hash(p[id].url_alias)] = p[id].title } function preload(url) { /* Arrive quand on passe la souris sur un lien en liste blanche Ou après que p[p_id].state == 'displayed' dans display (quand on clique une deuxième fois sur un forum préféré) */ var id = p_id if (p[p_id].state == 'waiting') { /* Arrive quand on survole un lien alors qu’un autre (ou le même) est déjà en train de charger */ id ^= 1 } p[id].state = 'preloading' p[id].url = url p[id].url_alias = url p[id].html = false p[id].timing_start = new Date().getTime() p[id].timing = false p[id].xhr.open('GET', url, true) p[id].xhr.send() } function display(url, t) { /* Arrive quand on clique sur un lien en liste blanche Ou 50ms après que !p[p_id].html Ou 50ms après que p[p_id].state == 'displayed' */ if (p[p_id].state == 'preloading') { /* Première fois */ if (t < 1000) { /* On ne vient pas d’hover un autre lien */ t += 1000 } } else { /* On est plus en preloading, il y a eu au moins un setTimeout depuis */ if (p[p_id].state == 'waiting' && t < 1000) { /* Il n’y a pas eu de preloading préalable, ça arrive quand on clique sur le même lien avant que celui-ci ai été displayed, p[p_id].state est directement en waiting et cette instance de display tourne en parralèle de la première */ /* Ou alors on a cliqué sur un autre lien pendant qu’on en charge un */ if (p[p_id].url != url && p[p_id ^ 1].url == url) { p_id ^= 1 setTimeout("display('" + url + "', " + t + ")", 50) } return } } if (p[p_id].url != url) { /* Arrive quand on a swappé p_id, `url` est l’url précédente */ return } if (!p[p_id].html) { /* La réponse du serveur n’a pas encore était reçu, ou il y a eu un problème avec la requête */ p[p_id].state = 'waiting' if (!col1.style.opacity) { col1.style.opacity = opacity } setTimeout("display('" + url + "', " + t + ")", 50) return } if (p[p_id].state == 'displayed') { /* Ça arrive quand on clique à la suite sur les forums préférés */ if (!col1.style.opacity) { col1.style.opacity = opacity } preload(url) // display(url) setTimeout("display('" + url + "', " + t + ")", 50) return } p[p_id].state = 'displayed' col1.style.opacity = '' col1.innerHTML = p[p_id].html document.title = p[p_id].title Utilisateur() // fonction de JVC pour mettre à jour les MP if (p[p_id].url == no_hash(location.href)) { /* Bouton rafraîchir, on rajoute de l’opacité un court moment pour montrer que le rafraîchissement a bien eu lieu. */ col1.style.opacity = opacity setTimeout('col1.style.opacity = ""', 50) } if (p[p_id].url != location.href) { if (no_hash(p[p_id].url) != no_hash(location.href)) { if (p[p_id].url.indexOf('#') == -1) { scrollTo(0, yscroll) } else { var elem = p[p_id].url.substr(p[p_id].url.indexOf('#') + 1) if (geid(elem) || document.getElementsByName(elem).length > 0) { elem = geid(elem) || document.getElementsByName(elem)[0] var offset = 0 for (; elem.offsetParent; elem = elem.offsetParent) { offset += elem.offsetTop } scrollTo(0, offset) } else { scrollTo(0, yscroll) } } } history.pushState(null, null, p[p_id].url_alias) } current_pathname = location.pathname speed_up_all() // À faire après history.pushState pour faire des conditions sur location.href dans speed_up_all } function speed_up_all(forums_prefs) { var links = getag('a'), a, mode for (var i = 0; i < links.length; i++) { a = links[i] if (a.href.indexOf('http://www.jeuxvideo.com/forums/') != 0) { /* On ne précharge pas en dehors des forums */ continue } if (a.className == 'citer') { a.addEventListener('click', function(e) { store_quote(e.target.getAttribute('message')) }) } if (a.className == 'add_blacklist') { a.addEventListener('click', blacklist_add_from_button) } mode = mode_from_url(a.href) if ([0, 1, 3, 26].indexOf(mode) == -1) { /* On précharge seulement liste des sujets, page d’un topic, formulaire de réponse, retour liste des sujets */ continue } if (a.target) { continue } if (a.className == 'sup_pref') { /* Bouton pour supprimer un forum préféré */ continue } if (a.parentNode.id && a.parentNode.id.indexOf('coeur_suppr_') == 0) { /* Forums préférés */ if (!forums_prefs) { continue } } if (no_hash(a.href) == no_hash(location.href)) { if (a.href.indexOf('#') != -1) { /* Liens magiques (uploader noelshack, forum 1280px, etc.) et permanents */ continue } /* Boutons Rafraîchir */ } /* Le reste */ speed_up(a) } /* Lien permanent en surbrillance */ if (location.hash.indexOf('#message_') != -1) { if (geclass('msg_ancre').length) { geclass('msg_ancre')[0].classList.remove('msg_ancre') } geid(location.hash.substr(1)).classList.add('msg_ancre') } /* Autofocus sur le champ de réponse + affichage citation */ if (location.hash == '#form_post') { mode = mode_from_url(location.href) if (mode == 3) { geid('newmessage').focus() } else if (mode == 0) { geid('newsujet').focus() } if (storage('quote')) { geid('newmessage').value = storage('quote') storage('quote', '') } } /* Bouton pour ajouter forum aux favoris */ if (geid('coeur_ajouter')) { geid('coeur_ajouter').addEventListener('click', function(e) { e.preventDefault() coeur_ajouter() // Fonction de JVC }) } } function speed_up(e) { e.addEventListener('mouseover', function() { preload(this.href) }) e.addEventListener('click', function(e) { if (e.which > 1 || e.metaKey || e.ctrlKey) { return } e.preventDefault() display(this.href, ++t_count) if (t_count >= 1000) { t_count -= 1000 } }) } function store_quote(id) { if (!geid('message_' + id)) { window.console && console.log('can’t quote ' + id) return } var text if (geid('message_' + id).children[0].children[3].children.length == 2) { text = textToQuote(geid('message_' + id).innerHTML, geid('message_' + id).children[0].children[3].children[1].href) } else { text = textToQuote(geid('message_' + id).innerHTML) } if (geid('newmessage')) { if (geid('newmessage').value) { geid('newmessage').value += "\r\n\r\n" + text } else { geid('newmessage').value = text } geid('newmessage').focus() geid('newmessage').scrollTop = geid('newmessage').scrollHeight geid('newmessage').selectionStart = geid('newmessage').selectionEnd = geid('newmessage').value.length } else { storage('quote', text) } } function textToQuote(citation_html, lien_citation) { var pseudo = str_between(citation_html, 'title="Voir le profil de ', '"'); // var de = 'aeiou'.indexOf(pseudo[0].toLowerCase()) == -1 ? 'de ' : 'd’'; var de = 'de ' var date = str_between(citation_html, '<li class="date">', '<a').replace(/<span>via mobile<\/span> /, '').replace(/\r?\n/g, '').replace('Posté le ', '').trim(); var aujourdhui = '' var date_a = date.split(' ') var date_o = new Date() date_o = [ date_o.getDate(), 'janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre'.split(',')[date_o.getMonth()], date_o.getFullYear() ] if (parseInt(date_a[0], 10) == date_o[0] && date_a[1] == date_o[1] && date_a[2] == date_o[2]) { aujourdhui = 'aujourdhui' } // date = date.replace(date_o[2] + ' ', '') citation_html = citation_html.substr(citation_html.indexOf('<li class="post">') + '<li class="post">'.length); citation_html = citation_html.substr(0, citation_html.indexOf('</li>')); citation_html = citation_html.trim(); var citation_texte = ""; citation_texte += '| ' + pseudo + ' - ' + (aujourdhui ? ('aujourd’hui à ' + date.split('à ')[1].split(':')[0] + ':' + date.split('à ')[1].split(':')[1]) : ('le ' + date.split('à')[0])) + "\r\n" if (lien_citation) { citation_texte += '| ' + lien_citation + "\r\n"; } citation_texte += '| ' + html_entity_decode(jvcHtmlToText(citation_html)) + "\r\n\r\n> "; return citation_texte; } function jvcHtmlToText(message_html) { var texte = message_html; /* Sauts de ligne */ var texte_retour = "\r\n"; while (texte.indexOf("\n") != -1) { texte = texte.replace("\n", ""); } while (texte.indexOf("\r") != -1) { texte = texte.replace("\r", ""); } while (texte.indexOf("<br />") != -1) { texte = texte.replace("<br />", texte_retour); } while (texte.indexOf("<br>") != -1) { texte = texte.replace("<br>", texte_retour); } /* Citation dans une citation */ var lines = texte.split("\n") var last_line_citation = -2 var lines2 = [] for (var i = 0; i < lines.length; i++) { if (lines[i].substr(0, 2) == '| ') { if (last_line_citation != i - 1) { lines2.push('[Citation]') } last_line_citation = i } else { lines2.push(lines[i]) } } texte = lines2.join("\n| ") /* Smileys */ while (/ ?<img src="http:\/\/image.jeuxvideo.com\/smileys_img\/[^"]+" alt="([^"]+)"( \/)?>/.test(texte)) { texte = texte.replace(/ ?<img src="http:\/\/image.jeuxvideo.com\/smileys_img\/[^"]+" alt="([^"]+)"( \/)?>/, "$1"); } /* Liens */ while (/<a href="(mailto:)?([^"]+)".+<\/a>/.test(texte)) { texte = texte.replace(/<a href="(mailto:)?([^"]+)".+<\/a>/, '$2'); } return texte; } function str_between(str, begin, end) { var _1 = str.split(begin)[1]; if (typeof _1 == 'undefined') { return false; } var _2 = _1.split(end)[0]; return _2; } function html_entity_decode(string) { var elem = document.createElement('div'); elem.innerHTML = string; return elem.textContent; } function add_goodies(html) { /* Ignorer */ /* Agit sur l’icône des dossiers, à faire avant Lastpage */ html = blacklist_html(html) /* Lastpage */ if (html.indexOf('<tr class="tr') != -1) { var trs = html.split('<tr class="tr'), tds, tr, nb, url, segments for (var i = 1; i < trs.length; i++) { tr = trs[i] tds = tr.split('<td>') nb = parseInt(tds[3]) url = tds[2].split('"')[5] segments = url.split('-') segments[3] = parseInt(nb / 20) + 1 url = segments.join('-') tds[1] = '<a href="' + url + '">' + tds[1].split('</td>')[0] + '</a></td>' trs[i] = tds.join('<td>') } html = trs.join('<tr class="tr') } /* Liens Citer - topic */ if (html.indexOf('<li class="ancre">') != -1) { var ancres = html.split('<li class="ancre">'), url_repondre = html.split('<li class="ancre"><a href="')[1].split('"')[0] // Ne pas récupérer l’URL du bouton répondre : il n’y est pas sur les topics lockés url_repondre = url_repondre.split('/') url_repondre[4] = '3' + url_repondre[4].substring(1) url_repondre = url_repondre.join('/').split('#')[0] + '#form_post' for (var i = 1; i < ancres.length; i++) { ancres[i] = '<a href="' + url_repondre + '" message="' + parseInt(ancres[i].split('#message_')[1]) + '" class="citer">Citer</a> - ' + ancres[i] } html = ancres.join('<li class="ancre">') } /* Liens citer - formulaire de réponse */ if (html.indexOf('<div id="message_') != -1 && html.indexOf('<li class="ancre"') == -1 && (html.indexOf("</li>\n</ul>\n</div>") != -1 || html.indexOf("</li>\r\n</ul>\r\n</div>") != -1)) { var char = html.indexOf("</li>\r\n</ul>\r\n</div>") != -1 ? "\r\n" : "\n" var posts = html.split("</li>" + char + "</ul>" + char + "</div>") for (var i = 0; i < posts.length; i++) { if (posts[i].indexOf('<div id="message_') == -1) { continue } var message = parseInt(posts[i].substr(posts[i].indexOf('<div id="message_') + '<div id="message_'.length, 10)) posts[i] += '</li><li class="ancre"><a href="#form_post" message="' + message + '" class="citer">Citer</a>' } html = posts.join("</li>" + char + "</ul>" + char + "</div>") } /* Boutons JV Chat */ if (jvchat_on < 0) { jvchat_on++ if (html.indexOf('<a target="jvchat"') == -1) { var styles = document.getElementsByTagName('style') for (var i = 0; i < styles.length; i++) { if (styles[i].type == 'text/css' && styles[i].innerHTML.indexOf('.jvchat') != -1) { jvchat_on = 1 } } } } if (jvchat_on == 1) { /* Liste des sujets */ if (html.indexOf('<input id="newsujet"') != -1 && html.indexOf('<a class="p_debut"') == -1) { var url = str_between(html, '<p id="rafraichir">', '"><img').split('/').pop() html = html.replace(/<td class="navig_prec">\r?\n /g, '<td class="navig_prec"><a target="jvchat" class="jvchat" href="/jvchat#' + url + '">JV Chat</a>') } /* Topic */ if (html.indexOf('alt="Répondre" width="80" height="17" />') != -1) { var url = str_between(html, 'alt="Répondre" width="80" height="17" />', '" class="bt_rafraichir"').split('/').pop() html = html.replace(/<\/td>\r?\n<td class="user">/g, '<a target="jvchat" class="jvchat" href="/jvchat#' + url + '">JV Chat</a></td>' + "\r\n" + '<td class="user">') } } return html } function check_update() { update_img = new Image() update_img.src = update_img_src + '?version=' + turboforum_version + '&time=' + (new Date().getTime()) update_img.addEventListener('load', function() { if (update_img.height > 5) { show_update() } storage('lastupdatecheck', new Date().getTime()) }) } function show_update() { var bar = document.createElement('div') bar.id = 'tf_update_bar' bar.className = 'tf_update_bar' bar.innerHTML = '<span class="tf_update_bar_close">×</span><div><b>TurboForum</b> : Une <a href="http://jvflux.com/turboforum/?from=' + turboforum_version + '" target="_blank">nouvelle version</a> est désormais disponible.</div>' bar.children[0].addEventListener('click', function() { remove_element('tf_update_bar') }) document.body.insertBefore(bar, geid('global')) } /** Ignorer **/ function blacklist_load() { if (storage('blacklist')) { blacklist = storage('blacklist').split(';') } } function blacklist_save() { storage('blacklist', blacklist.join(';')) } function blacklist_add(pseudo) { if (blacklist_has(pseudo)) { return } pseudo = pseudo.toLowerCase() blacklist.push(pseudo) blacklist_save() } function blacklist_remove(pseudo) { if (!blacklist_has(pseudo)) { return } pseudo = pseudo.toLowerCase() var blacklist2 = [] for (var i = 0; i < blacklist.length; i++) { if (blacklist[i] != pseudo) { blacklist2.push(blacklist[i]) } } blacklist = blacklist2 blacklist_save() } function blacklist_add_from_button(e) { e.preventDefault() var childs = e.target.parentNode.previousElementSibling.children for (var i = 0; i < childs.length; i++) { if (childs[i].tagName.toUpperCase() == 'STRONG') { if (e.target.title[0] == 'N') { blacklist_remove(childs[i].innerHTML) break } else { blacklist_add(childs[i].innerHTML) break } } } if (geid('newmessage')) { blacklist_dom() p_history.html[no_hash(location.href)] = col1.innerHTML } else { col1.innerHTML = blacklist_html(col1.innerHTML) p_history.html[no_hash(location.href)] = col1.innerHTML speed_up_all() } } function blacklist_has(pseudo) { pseudo = pseudo.toLowerCase() for (var i = 0; i < blacklist.length; i++) { if (blacklist[i] == pseudo) { return true } } return false } function blacklist_html(html) { if (html.indexOf('<a target="avertir"') != -1) { html = html.replace(/class="msg_blacklisted msg/g, 'class="msg') html = html.replace(/<a class="add_blacklist" [^>]+><\/a> /g, '') var messages = html.split('<div id="message_') for (var i = 1; i < messages.length; i++) { var message = messages[i] var id = message.substr(0, message.indexOf('"')) var pseudo = message.substr(message.indexOf('<strong'), 100).split('>')[1].split('<')[0] var has = blacklist_has(pseudo) if (has) { message = message.replace(/class="msg/, 'class="msg_blacklisted msg') if (message.indexOf('target="kick_user">') != -1) { message = message.replace(/(<a href="http:\/\/www\.jeuxvideo\.com\/cgi-bin\/jvforums\/kick_user\.cgi[^>]+target="kick_user">)/, '<a class="add_blacklist" href="#" title="Ne plus définir ' + pseudo + ' comme indésirable" message=' + id + '></a> $1') } else { message = message.replace(/<a target="avertir"/, '<a class="add_blacklist" href="#" title="Ne plus définir ' + pseudo + ' comme indésirable" message=' + id + '></a> <a target="avertir"') } } else { if (message.indexOf('target="kick_user">') != -1) { message = message.replace(/(<a href="http:\/\/www\.jeuxvideo\.com\/cgi-bin\/jvforums\/kick_user\.cgi[^>]+target="kick_user">)/, '<a class="add_blacklist" href="#" title="Définir ' + pseudo + ' comme indésirable" message=' + id + '></a> $1') } else { message = message.replace(/<a target="avertir"/, '<a class="add_blacklist" href="#" title="Définir ' + pseudo + ' comme indésirable" message=' + id + '></a> <a target="avertir"') } } messages[i] = message } html = messages.join('<div id="message_') } if (html.indexOf('<td><a class="ltopic"') != -1) { var topics = html.split('<td><a class="ltopic"') var dossiers = [] for (var i = 1; i < topics.length; i++) { var fragments = topics[i].split('">') var pseudo = fragments[2].split('<')[0] if (blacklist_has(pseudo)) { var fragments1 = fragments[1].split('<') var title = fragments1[0] fragments[0] = fragments[0].substr(0, fragments[0].length) + '" title="' + title + '' fragments1[0] = ' ' fragments[1] = fragments1.join('<') dossiers[i] = true } topics[i] = fragments.join('">') } html = topics.join('<td><a class="ltopic"') if (dossiers.length > 0) { topics = html.split('<td><img src="http://image.jeuxvideo.com/pics/') for (var i = 1; i < topics.length; i++) { if (dossiers[i]) { topics[i] = 'messages_prives/ico_black_on.png" class="dossier_blacklisted' + topics[i].substring(topics[i].indexOf('"')) } } html = topics.join('<td><img src="http://image.jeuxvideo.com/pics/') } } return html } function blacklist_dom() { /* Utilisé quand on ignore quelqu’un sur le formulaire de réponse, on ne peut recharger col1 sans perdre le message */ var msgs = geclass('msg'), msg, childs, pseudo, has, button for (var i = 0; i < msgs.length; i++) { button = undefined msg = msgs[i] childs = msg.children[0].children[0].children for (var j = 0; j < childs.length; j++) { if (childs[j].tagName.toUpperCase() == 'STRONG') { pseudo = childs[j].innerHTML } } has = blacklist_has(pseudo) childs = msg.children[0].children[1].children for (var j = 0; j < childs.length; j++) { if (childs[j].className == 'add_blacklist' && childs[j].getAttribute('message') == msg.id.substring('message_'.length)) { button = childs[j] } } if (has) { msg.classList.add('msg_blacklisted') button.title = 'Ne plus définir ' + pseudo + ' comme indésirable' } else { msg.classList.remove('msg_blacklisted') button.title = 'Définir ' + pseudo + ' comme indésirable' } } } /** Action **/ addEventListener('popstate', function() { /* Arrive quand on utilise les boutons précédent/suivant du navigateur */ if (current_pathname == location.pathname) { /* Lien permanent */ return } if (!p_history.html[no_hash(location.href)]) { /* Arrive quand on a rafraîchit la page au préalable et que TurboForum n’a plus ce lien en mémoire */ location.href = location.href return } current_pathname = location.pathname col1.innerHTML = p_history.html[no_hash(location.href)] document.title = p_history.title[no_hash(location.href)] speed_up_all() }) if (geid('fiche_infos2')) { /* On retire la pub pour Amazon/Fnac sur les forums de jeux, elle est dans col2 alors qu’on update uniquement col1 */ remove_element('fiche_infos2') } if (geid('sponso_forum')) { /* Présent sur certains forums de jeux comme LoL */ remove_element('sponso_forum') } blacklist_load() current_pathname = location.pathname col1.innerHTML = add_goodies(col1.innerHTML) p_history.html[no_hash(location.href)] = col1.innerHTML p_history.title[no_hash(location.href)] = document.title speed_up_all(true) if ((new Date().getTime() - storage('lastupdatecheck')) > 1000 * 60 * 60 * 12) { check_update() } var style = document.createElement('style') style.innerHTML = '.tf_update_bar { padding: 6px 0 8px; background: #ddd; box-shadow: 0 1px 3px rgba(0, 0, 0, .5); }\ .tf_update_bar_close { float: right; border: 1px solid rgba(0, 0, 0, .5); border-radius: 2px; background: white; font-size: 120%; padding: 0 4px; margin-right: 5px; cursor: pointer; }\ .msg .ancre { color: #666; }\ .add_blacklist { display: none; background: url(http://image.jeuxvideo.com/pics/messages_prives/ico_black_on.png) no-repeat; margin-right: 3px; cursor: pointer; opacity: .9; }\ .date:hover .add_blacklist { display: inline-block; height: 12px; width: 13px; }\ .msg_blacklisted .post, .msg_blacklisted .ancre { display: none; }\ .msg_blacklisted .pseudo { margin-bottom: 0; }\ .msg_blacklisted .add_blacklist { display: inline-block; height: 12px; width: 13px; background-image: url(http://image.jeuxvideo.com/pics/messages_prives/ico_black_off.png); opacity: 1; }\ .dossier_blacklisted { margin-left: 1px; }' document.head.appendChild(style) } var script = document.createElement('script') script.innerHTML = TurboForum.toString().substring("function () {\n".length, TurboForum.toString().length - "\t}".length) document.body.appendChild(script) } else if (geid('turboforum_derniere_version')) { var turboforum_version = '1.4' var derniere_version = geid('turboforum_derniere_version').innerHTML if (geid('turboforum_ma_version')) { geid('turboforum_ma_version').innerHTML = turboforum_version } if (turboforum_version == derniere_version) { document.body.classList.add('a_jour') } else { document.body.classList.add('pas_a_jour') } }