// ==UserScript==
// @name [HFR] wiki smileys et raccourcis no altgr mod_r21
// @version 2.4.3
// @namespace http://toyonos.info
// @description Rajoute le wiki smilies et des raccourcis clavier pour la mise en forme, dans la réponse rapide et dans l'édition rapide
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAilBMVEX%2F%2F%2F8AAADxjxvylSrzmzf5wYLzmjb%2F9er%2F%2Fv70nj32q1b5woT70qT82rT827b%2F%2B%2FjxkSHykybykyfylCjylCnzmDDzmjX0nTv1o0b1qFH2qVL2qlT3tGn4tmz4uHD4uXL5vHf83Lf83Lj937394MH%2B587%2B69f%2F8%2BX%2F8%2Bf%2F9On%2F9uz%2F%2BPH%2F%2BvT%2F%2FPmRE1AgAAAAwElEQVR42s1SyRbCIAysA7W2tdZ93%2Ff1%2F39PEtqDEt6rXnQOEMhAMkmC4E9QY9j9da1OkP%2BtTiBo1caOjGisDLRDANCk%2FVIHwwkBZGReh9avnGj2%2FWFg%2Feg5hD1bLZTwqdgU%2FlTSdrqZJWN%2FKImPOnGjiBJKhYqMvikxtlhLNTuz%2FgkxjmJRRza5mbcXpbz4zldLJ0lVEBY5nRL4CJx%2FMEfXE4L9j4Qr%2BZakpiandMpX6FO7%2FaPxxUTJI%2FsJ4cd4AoSOBgZnPvgtAAAAAElFTkSuQmCC
// @include https://forum.hardware.fr/*
// @author toyonos
// @modifications basé sur la version 1 (ou a) - simplification de l’édition des mots-clé (réduction des délais d'affichage et suppression de la popup de confirmation), contournement d'un problème pour le raccourci url, ajout du support pour reho.st, unification des fonctionnalités pour chaque mode d'édition et ajout de trois raccourcis
// @modtype modification de fonctionnalités
// @updateURL https://raw.githubusercontent.com/roger21/hfr/master/hfr_wiki_smileys_mod_r21.user.js
// @installURL https://raw.githubusercontent.com/roger21/hfr/master/hfr_wiki_smileys_mod_r21.user.js
// @downloadURL https://raw.githubusercontent.com/roger21/hfr/master/hfr_wiki_smileys_mod_r21.user.js
// @supportURL https://forum.hardware.fr/hfr/Discussions/Viepratique/sujet_116015_1.htm
// @homepageURL http://roger21.free.fr/hfr/
// @noframes
// @connect generateurs.super-h.fr
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addStyle
// @grant GM_registerMenuCommand
// @grant GM_xmlhttpRequest
// ==/UserScript==
// modifications roger21 $Rev: 3788 $
// historique :
// 2.4.3 (12/04/2023) :
// - suppression des raccourcis pour les générateurs
// - mise à jour du lien vers les générateurs
// - mise à jour du lien vers l'api du smiley helper
// 2.4.2 (13/11/2021) :
// - retour à reho.st pour le raccourci rehost
// 2.4.1 (17/09/2020) :
// - utilisation de images.weserv.nl pour le raccourci rehost
// 2.4.0 (17/09/2020) :
// - amélioration du code pour éviter un affichage tardif de la popup de complétion des smileys
// 2.3.9 (13/02/2020) :
// - utilisation d'une url en data pour l'icône du script et changement d'hébergeur (free.fr -> github.com)
// 2.3.8 (11/02/2020) :
// - adaptation du code pour fonctionner avec [HFR] Vos smileys favoris mod_r21 3.0.0 (à venir)
// - correction des marges autour des smileys
// 2.3.7 (11/01/2020) :
// - petites modifications des styles pour être homogène avec [HFR] Vos smileys favoris mod_r21 3.0.0 (à venir)
// - nettoyage du code relatif aux stickers
// 2.3.6 (17/12/2019) :
// - correction de la taille de la réponse normale et limitation au resize vertical
// 2.3.5 (14/12/2019) :
// - correction de la mise en page de la colonne de gauche sur la réponse normale
// 2.3.4 (21/11/2019) :
// - deplace le curseur après le = pour l'insertion d'url (proposé par Heeks)
// 2.3.3 (02/10/2019) :
// - suppression de la directive "@inject-into" (mauvaise solution, changer solution)
// 2.3.2 (18/09/2019) :
// - ajout de la directive "@inject-into content" pour isoler le script sous violentmonkey
// 2.3.1 (28/10/2018) :
// - modification de la gestion des raccourcis pour prendre en compte la nouvelle gestion de altGr depuis ff63 ->
// https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/63#DOM_events
// - modification du raccourcis puce par défaut de '*' (mal géré) à 'x'
// 2.3.0 (13/05/2018) :
// - check du code dans tm
// - ajout de la metadata @connect pour tm
// - suppression des @grant inutiles
// - maj de la metadata @homepageURL
// 2.2.1 (28/11/2017) :
// - passage au https
// 2.2.0 (12/11/2017) :
// - ajout de 2 tempos pour éviter de spammer hfr (risque de ban ip) sur l'affichage des mots-clés et sur la recherche par mot(s)-clé(s) ->
// il ne peut plus y avoir plusieurs requêtes en même temps et il y a toujours un délais de 250ms et 500ms entre les requêtes ->
// et les requêtes pour l'affichage des mots-clés ne sont faites qu'une fois
// - meilleure gestion de la distinction des recherches par mot(s)-clé(s) l'orsqu'il y en a plusieurs d'ouvertes (en cas d'editions rapide)
// 2.1.1 (11/02/2017) :
// - correction du style font-fammily à Verdana,Arial,Sans-serif,Helvetica (HFR Style)
// 2.1.0 (15/12/2016) :
// - ajout de trois raccourcis : smiley (m), orange (5) et violet (6)
// - ajout de l'ouverture de la fenêtre de configuration en double-cliquant sur le bouton d'aide
// 2.0.1 (11/11/2016) :
// - correction d'un "bug" d'affichage en réponse normale (pour certains) sur la disposition ->
// des smileys de base (passage de 152px à 155px de large pour les afficher)
// 2.0.0 (11/11/2016) :
// - nouveau numéro de version : 0.7.11 -> 2.0.0
// - nouveau nom : [HFR] Wiki smilies & raccourcis dans la reponse/edition rapide -> [HFR] wiki smileys et raccourcis mod_r21
// - léger restylage de la fenêtre de configuration
// - compression des images (pngoptimizer)
// - genocide de lignes vides et de commentaires ([:roger21:2])
// - découpage des décalarations multiples
// - remplacement des ' par des " (pasque !)
// - modification de l'année dans les dates de l'historique : passage de 2 a 4 chiffres
// - reformatage du code (Online JavaScript beautifier : ->
// "2 spaces, unlimited newlines, do not wrap, braces with" et rien coché)
// 0.7.11 (06/08/2016) :
// - ajout du nom de la version de base dans la metadata @modifications
// 0.7.10 (07/03/2015) :
// - ajout de la metadata @noframes (interdit l'execution du script dans une frame pour plus de sécurité)
// 0.7.9 (21/01/2015) :
// - ajout d'encodeURIComponent sur les requetes ajax comme dans Edition rapide du Wiki smilies, ça semble plus sain
// - amelioration de la position de la popup d'edition rapide (encore)
// - compactage du css
// - decoupage des lignes de code trop longue
// - reformatage du code (Online JavaScript beautifier : ->
// "2 spaces, unlimited newlines, do not wrap, braces with" et rien coché)
// 0.7.8 (21/01/2015) :
// - amelioration de la position de la popup d'edition rapide
// 0.7.7 (20/01/2015) :
// - suppression des raccourcis media et webm devenu inutiles avec le nouveau script "html5 media link replacer"
// 0.7.6 (05/09/2014) :
// - correction d'un problème sur la position de l'aide contextuel (smilies_helper) en cas de reponse flotante
// 0.7.5 (05/09/2014) :
// - gestion d'une différence d'affichage entre win7 et winXP pour cet espace
// 0.7.4 (05/09/2014) :
// - ajout d'un espace identique entre la réponse rapide et les boutons en cas de désactivation de feeligo
// 0.7.3 (24/08/2014) :
// - modification de l'insertion de l'icone d'aide et du lien générateurs sur la réponse rapide pour éviter ->
// un conflit avec le script "vos smileys favoris"
// 0.7.2 (20/08/2014) :
// - correction du bold sur le lien de suppression des smileys favoris hfr sur la page de réponse normale
// 0.7.1 (29/04/2014) :
// - ajout d'un scroll à l'ouverture des stickers
// 0.7.0 (28/04/2014) :
// - nouvelle numérotation des versions
// 0.6.2a.10 (28/04/2014) :
// - ajout d'un
entre l'arbo du bas et la reponse rapide
// - reencodage en png/64 et déclaration unique des images
// - ajustement et homogénéisation des marges autour des textarea
// 0.6.2a.9 (27/04/2014) :
// - supression du fade et de la transparency variable sur la réponse rapide flotante
// - ajout d'une div d'espace autoadaptative quand la réponse rapide est flotante
// - meilleure gestion des marges pour les recherches de smileys et la reponse flotante
// 0.6.2a.8 (26/04/2014) :
// - suppression du module d'auto-update (code mort)
// - ajout de l'aide, du lien des générateurs et du smilies helper sur l'edition rapide
// - restylage du code pour une meilleur indentation automatique (rend le diff pratiquement illisible)
// - intégration du script dans la page de réponse normale
// 0.6.2a.7 (07/04/2014) :
// - ajout du support pour 4chan webm ([webm][/webm]) avec ctrl+alt+n (attention aussi un raccourcis tab mix plus)
// 0.6.2a.6 (04/04/2014) :
// - ajout de metadata pour la publication (@author, @modifications, @modtype)
// - ajout d'une icone au script
// - ajout des dates dans l'historique
// 0.6.2a.5 (18/03/2014) :
// - maj des metadata @grant et indentation des metadata
// 0.6.2a.4 (10/10/2013) :
// - passage de http://hfr-rehost.net/ vers http://reho.st/ pour le raccourci rehost
// 0.6.2a.3 (14/09/2012) :
// - ajout des metadata @grant
// 0.6.2a.1 @ 0.6.2a.2 (07/12/2011) :
// - activation du script pour la page d'edition pas radide
// - ajout du support pour la balise media
// - désactivation de la popup pour le racourci url (bug sur le paste d'url dans la popup)
// - suppression de la popup de validation de modification du wiki smiley
// - changement du message de confirmation de modification du wiki smiley
// - réduction du délais d'affichage de la popup de confirmation de modification du wiki smiley
// - désactivation du message d'erreur XML dans la toyolib
// - ajout d'un .1 sur le numero de version
// - désactivation de l'auto-update pour conserver les modifs
var imgHelpPngLol = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAACnElEQVR42q2T3U%2BSYRjG%2FVvgT2it5mrVap3V1jjooAOn5ifQ1HK1DJazdJjTLCk1M50KauqcigJvAiKIJsqXIPBiIl%2FKx0B44VWz7eqNNZyb88hn%2B50912%2B77t13Xt5FPx15xNa6DwUa5wGp2qSpH%2FY0pbBR5JwlKZgx7bPPDaudNGfekQl5wkfY2qPhDlJZPLsZOAIZjC1HQyNLYc6ZYWIjzZFbU%2BntyAHMv%2BKQLvghmnCicWwTPcQWDI4oXCEK31T%2BdA%2Bxc1oiMydZ0%2BuJ4FaYxpIzhnom1E144I%2FR8MUymFgOoE5qhXI9BLsvifZpMtg66WLlBOMrUeGGP401TwLCYTue95mROTxm%2BPOfY9QPW1A3aMKiPQLtRgQNUqswJxhYCJEupmsvsY3aPhNqetfgj2YwsxqA2rYLmhGobUFwO3Von3HA6o3jRa%2BRzAm6FF7aHUxBKLGg%2BqsRvG4D81mPWaMPceoQe3Ea%2FfMulHdoUf1FD4dvHzyxns4J2iZdtCuQwsshC7hdelR%2B1qHikw4p%2Bjd2IhT4Yi1K2lR4zMAXa2D3J1DYoj4RvJHaSNtOAmKZC7xOAyrEiyj7uIDS9%2Bosxe8IFDcrUNQsR6N0FUZPBA8b5CcVmD5ChTEAvSOC6i5DLhhLHiCyT6NANJelWCQDse6DhKlzr27qZIh88RKr8sNicMUZgXLND26HBkUtSnRMmrL8Cxc2TWFU44bGEsDd2ong7afjrFO7UCCa5zxqItI6%2By7U1iDeSlZQ1ipHSfMsXvfroTR6oTL7cbPqe%2Fr6k5Gzt%2FGBUMa5%2F2o6NEBs4qc7DIs3lmXZuYcemQ35PGnoaqWEc%2B493Hk2zr5VMya4UTVKXuMPU%2FlcKXWlYoi8XD4ouFQ6wL7w6%2F0LXCsKj6bCqcQAAAAASUVORK5CYII%3D";
var imgOkPngLol = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAACl0lEQVR42q2T60uTYRiH%2FTv2bnttAwlkRCGChFD7FCQSm2ZDMQ%2FL0nRnj7TNGDbTooychzFSSssstdqc8zB1anNrSpm47FVCzH3pQLVhdLBfzztoJlifvOEHz4fnuu7nGBe311XgOyLMnTmsz%2FakMBljB8OSEVFY4kpkJM5Efbp9v%2FC%2FcJ43VSrzJId0HhluBy3oW%2BmKpnOpGSWuExD30iFxDy3dFSZdpZkTSZHr80Y41%2Fphe3UDpvnKaNixY60PjbNVOGTjRZJtvJ2SHE%2BKINOdtMHC7MSaQBkq%2FCXQzJ6DjqScpNp3HvY3D3B5ugIiC3dDdJMriAlk7iSDajwr2pmFWVDlPQPFTCEU0wVQTxfCvT4Ig1cJB5Hk9hxDwjWuISbIGBExncFmWINNqPAVQ%2FlUTsB8KKdIPPmYeOsCW6HIOtpeNMI234j4ei4TExy3J2w%2BWr2L2oAGWm8RWckAlj4uQDVZiPH1oSj8c%2BsH2p5fgWGyGH3BTvCN1GZMIH5Ib%2FavdMPoV6HWr8Xnb5%2Bi0Iev72KwZa4ealc29O6z6A92gF%2Fzt6CHZm4tNKF98Sp0U3KYfdWIfP8Shbd%2BbcHy7BLKnFnQEEFLoA7tXjPoKmp7C6l3%2BAb5QBrsq%2FdRPSmH2n0adTPlWH6%2FiLa5BpQOnoTCcQo6Zw7sr7uRbj0KupLaPsRkK09wgFyN2aPBY%2BYeKkfzoB3OgWpIBqWDDQtn48lyF4xDxeCrORu0mhLseAuJTVxpfAMVMbnL4CCS1oAZ%2BtEiXBiWo5VswU5gvbMIvFJOhMC7v8Z9DVwpbaJCkg4x2v1m9L60onfBCovXhLSWVPAVnBCt%2Bgf8p%2BiLXCFtoPR0DcXwtZwwX8UJk44MiZ4upYR7%2Fnt%2FA%2Bw9sdKFchsrAAAAAElFTkSuQmCC";
var imgCancelPngLol = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAACEklEQVR42q1S%2FU9SYRhlbW13%2FQ0V5Woub05zfZkCXhUhpmmb8v3h5ZKoCQjcwVBi1Q%2B19Zf0d2lWxpeR3AuX93J8qGVjgK2tZ3u3d3t2znmecx6D4R%2BrsS5dGdiEnDXS4weCQ2Fe9QUSdafH3B%2Bc3UM7k4OeSPWQNIIi3xAjaG5u48fz1Y%2B1peU7PWAU3qBNT0%2FKaG3tnJOogXWe1NGKJYB8AZ3%2Fic2RqMxaL%2F0iSGe4dlLW23uvgPcfoOfyHQI0RYlX%2FSGe1KHtxAHqqyERJwtPWUWYv9w1oh5PcuxlnOlyFnj7DiydQSMcAalD244Buf2f%2F6rVTuA5rq9JregW15Q2WCu2S%2Bu8BvYLBMwD2RxUfxDVeRurzMxyF8cUFDnFG9CRo3V8QcDtA%2BQMqnMLetkicH%2FNWfH4O1EBlAacHmDVBeymaG87ipPT%2FMVgt49XvH5okSiQkgmYBuK0DhmorrlQMVnwdXyiP0nd5eUVjw%2BatAFQjIrbCzKLlabN%2BunSChDdRP3ZCor3H%2BJoeKSbhC6LJ3Vo4RekmoRCo5NZrDRl5oqPJrnjiQesZrUBYQmndgeOR8dweGPoDwldllB3uqGJEpQ1N8gsVnpiOjfsy%2Bg493nkLvtuEaA4FvFt7B4OrhmFrinosoTa4jLK5hmdzOpx%2B%2Bj2MPdp6BbrC%2F5dZZNFKD6eGhjVofEmd3D1umD4n3UGltFKFDkd60gAAAAASUVORK5CYII%3D";
var doubleClickInterval = 250;
var lastClickTime = 0;
var keywordsTitleTimeout = null;
var inputSearchTimeout = null;
var cssManager = {
cssContent: "",
addCssProperties: function(properties) {
cssManager.cssContent += properties;
},
insertStyle: function() {
GM_addStyle(cssManager.cssContent);
cssManager.cssContent = "";
}
}
var getElementByXpath = function(path, element) {
let arr = Array();
let xpr = document.evaluate(path, element, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);
let item = xpr.iterateNext();
while(item) {
arr.push(item);
item = xpr.iterateNext();
}
return arr;
}
var $ = function() {
var elements = new Array();
for(var i = 0; i < arguments.length; i++) {
var element = arguments[i];
if(typeof element == "string") {
element = document.getElementById(element);
}
if(arguments.length == 1) {
return element;
}
elements.push(element);
}
return elements;
}
function getOffset(el) {
var _x = 0;
var _y = 0;
while(el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) {
_x += el.offsetLeft - el.scrollLeft;
_y += el.offsetTop - el.scrollTop;
el = el.offsetParent;
}
return {
top: _y,
left: _x
};
}
var cmScript = {
shortcuts: {
"ws_spoiler": {
left: "[spoiler]",
sample: "texte",
right: "[/spoiler]",
key: 83
},
"ws_b": {
left: "[b]",
sample: "texte",
right: "[/b]",
key: 66
},
"ws_i": {
left: "[i]",
sample: "texte",
right: "[/i]",
key: 73
},
"ws_u": {
left: "[u]",
sample: "texte",
right: "[/u]",
key: 85
},
"ws_img": {
left: "[img]",
sample: "image",
right: "[/img]",
key: 80
},
"ws_img_rehost": {
left: "[img]https://reho.st/",
sample: "image",
right: "[/img]",
key: 72
},
"ws_quote": {
left: "[quote]",
sample: "texte",
right: "[/quote]",
key: 81
},
"ws_url": {
left: "[url]",
sample: "url",
right: "[/url]",
key: 76
},
"ws_code": {
left: "[code]",
sample: "code",
right: "[/code]",
key: 67
},
"ws_fixed": {
left: "[fixed]",
sample: "texte",
right: "[/fixed]",
key: 70
},
"ws_strike": {
left: "[strike]",
sample: "texte",
right: "[/strike]",
key: 82
},
"ws_puce": {
left: "[*]",
sample: "texte",
right: "",
key: 88
},
"ws_smiley": {
left: "[:",
sample: "smiley",
right: "]",
key: 77
},
"ws_color_red": {
left: "[#ff0000]",
sample: "texte",
right: "[/#ff0000]",
key: 97
},
"ws_color_blue": {
left: "[#0000ff]",
sample: "texte",
right: "[/#0000ff]",
key: 98
},
"ws_color_yellow": {
left: "[#ffff00]",
sample: "texte",
right: "[/#ffff00]",
key: 99
},
"ws_color_green": {
left: "[#00ff00]",
sample: "texte",
right: "[/#00ff00]",
key: 100
},
"ws_color_orange": {
left: "[#ff7f00]",
sample: "texte",
right: "[/#ff7f00]",
key: 101
},
"ws_color_purple": {
left: "[#bf00ff]",
sample: "texte",
right: "[/#bf00ff]",
key: 102
}
},
keysBinding: {
65: "a",
66: "b",
67: "c",
68: "d",
70: "f",
71: "g",
72: "h",
73: "i",
74: "j",
75: "k",
76: "l",
77: "m",
78: "n",
79: "o",
80: "p",
81: "q",
82: "r",
83: "s",
84: "t",
85: "u",
86: "v",
87: "w",
88: "x",
89: "y",
90: "z",
96: "numpad 0",
97: "numpad 1",
98: "numpad 2",
99: "numpad 3",
100: "numpad 4",
101: "numpad 5",
102: "numpad 6",
103: "numpad 7",
104: "numpad 8",
105: "numpad 9"
},
backgroundDiv: null,
configDiv: null,
timer: null,
getShortcutKey: function(id) {
return GM_getValue(id, cmScript.shortcuts[id].key);
},
get templateSmileyLeft() {
return GM_getValue("ws_template_smiley_left", " ");
},
get templateSmileyRight() {
return GM_getValue("ws_template_smiley_right", " ");
},
get alwaysNotSticky() {
return GM_getValue("ws_always_not_sticky", false);
},
get activeOnMq() {
return GM_getValue("ws_active_on_mq", false);
},
setDivsPosition: function() {
cmScript.setBackgroundPosition();
cmScript.setConfigWindowPosition();
},
setBackgroundPosition: function() {
cmScript.backgroundDiv.style.width = document.documentElement.clientWidth + "px";
cmScript.backgroundDiv.style.height = document.documentElement.clientHeight + "px";
cmScript.backgroundDiv.style.top = window.scrollY + "px";
},
setConfigWindowPosition: function() {
cmScript.configDiv.style.left = (document.documentElement.clientWidth / 2) -
(parseInt(cmScript.configDiv.style.width) / 2) + window.scrollX + "px";
cmScript.configDiv.style.top = (document.documentElement.clientHeight / 2) -
(parseInt(cmScript.configDiv.clientHeight) / 2) + window.scrollY + "px";
},
disableKeys: function(event) {
var key = event.which;
if(key == 27) {
clearInterval(cmScript.timer);
cmScript.hideConfigWindow();
} else if(key == 13) {
cmScript.validateConfig();
} else if(event.altKey || (event.target.nodeName.toLowerCase() != "input" && key >= 33 && key <= 40)) {
event.preventDefault();
}
},
disableTabUp: function(elt) {
elt.addEventListener("keydown", function(event) {
var key = event.which;
if(key == 9 && event.shiftKey) {
event.preventDefault();
}
}, false);
},
disableTabDown: function(elt) {
elt.addEventListener("keydown", function(event) {
var key = event.which;
if(key == 9 && !event.shiftKey) {
event.preventDefault();
}
}, false);
},
disableScroll: function() {
document.body.style.overflow = "hidden";
window.addEventListener("keydown", cmScript.disableKeys, false);
},
enableScroll: function() {
document.body.style.overflow = "visible";
window.removeEventListener("keydown", cmScript.disableKeys, false);
},
alterWindow: function(opening) {
if(opening) {
cmScript.disableScroll();
window.addEventListener("resize", cmScript.setDivsPosition, false);
getElementByXpath("//iframe", document.body).forEach(function(iframe) {
iframe.style.visibility = "hidden";
});
} else {
cmScript.enableScroll();
window.removeEventListener("resize", cmScript.setDivsPosition, false);
getElementByXpath("//iframe", document.body).forEach(function(iframe) {
iframe.style.visibility = "visible";
});
}
},
buildBackground: function() {
if(!$("ws_back")) {
cmScript.backgroundDiv = document.createElement("div");
cmScript.backgroundDiv.id = "ws_back";
cmScript.backgroundDiv.addEventListener("click", function() {
clearInterval(cmScript.timer);
cmScript.hideConfigWindow();
}, false);
cssManager.addCssProperties("#ws_back{display:none;position:absolute;left:0px;top:0px;" +
"background-color:#242424;z-index:1000;}");
document.body.appendChild(cmScript.backgroundDiv);
}
},
selectMenuItem: function(item, tableId) {
item.className = "selected";
var items = item.parentNode.childNodes;
for(var i = 0; i < items.length; i++) {
if(items[i] != item) {
items[i].className = "";
}
}
var table = $(tableId);
table.style.display = "table";
getElementByXpath(".//table", cmScript.configDiv).filter(function(t) {
return t != table;
}).forEach(function(t) {
t.style.display = "none";
});
},
refreshSmileyTemplateExemple: function() {
$("ws_template_smiley_exemple").innerHTML = "texte" + $("ws_template_smiley_left").value.replace(/ /g, " ") +
"[:smiley]" + $("ws_template_smiley_right").value.replace(/ /g, " ") + "texte";
},
buildConfigWindow: function() {
if(!$("ws_front")) {
cmScript.configDiv = document.createElement("div");
cmScript.configDiv.id = "ws_front";
cmScript.configDiv.style.width = "600px";
cmScript.configDiv.style.height = "auto";
cssManager.addCssProperties("#ws_front{display:none;vertical-align:bottom;position:absolute;" +
"background-color:#F7F7F7;z-index:1001;border:1px dotted #000;" +
"padding:16px;text-align:right;font-family:Verdana,Arial,Sans-serif,Helvetica;font-size:14px;}");
cssManager.addCssProperties("#ws_front input[type=text]{text-align:center;border:1px solid black;}");
cssManager.addCssProperties("#ws_front div{margin:16px 0 0;}");
cssManager.addCssProperties("#ws_front div input{float:right;margin:0 0 0 8px;}");
cssManager.addCssProperties("#ws_front table{text-align:left;margin:16px 0 0;width:100%;" +
"font-size:smaller;font-weight:bold;border-collapse:collapse;}");
var menu = document.createElement("ul");
menu.id = "ws_front_menu";
cssManager.addCssProperties("#ws_front_menu{margin:4px 0 0;padding:0;width:100%;text-align:left;}");
cssManager.addCssProperties("#ws_front_menu li{display:inline;list-style-type:none;padding:3px;" +
"margin-right:8px;border:1px solid black;font-size:smaller;" +
"background-color:#DEDFDF;cursor:pointer;}");
cssManager.addCssProperties("#ws_front_menu li.selected{font-weight:bold;font-style:italic;}");
cmScript.configDiv.appendChild(menu);
var newTable = document.createElement("table");
newTable.id = "ws_front_rc";
newTable.style.display = "table";
var newTr, newTd, newInput, firstShortcut = true;
for(var id in cmScript.shortcuts) {
newTr = document.createElement("tr");
newTd = document.createElement("td");
newTd.innerHTML = cmScript.shortcuts[id].left + "" +
cmScript.shortcuts[id].sample + "" + cmScript.shortcuts[id].right;
newTr.appendChild(newTd);
newTd = document.createElement("td");
newTd.style.textAlign = "right";
newInput = document.createElement("input");
newInput.id = id;
newInput.type = "text";
newInput.size = "10";
newInput.setAttribute("key", cmScript.getShortcutKey(id));
newInput.addEventListener("keydown", function(event) {
if(event.which != 9) {
event.preventDefault();
}
}, false);
newInput.addEventListener("keyup", function(event) {
var key = event.which;
if(key == 8 || key == 46 || key == 110) {
this.value = "";
this.setAttribute("key", "");
} else if(key != 9 && cmScript.keysBinding[key] != undefined) {
this.value = cmScript.keysBinding[key];
this.setAttribute("key", key);
} else if(key != 9) {
event.preventDefault();
}
}, false);
if(firstShortcut) {
cmScript.disableTabUp(newInput);
firstShortcut = false;
}
newTd.appendChild(newInput);
newTr.appendChild(newTd);
newTable.appendChild(newTr);
}
cmScript.configDiv.appendChild(newTable);
var menuElt = document.createElement("li");
menuElt.className = "selected";
menuElt.innerHTML = "Raccourcis clavier";
menuElt.addEventListener("click", function() {
cmScript.selectMenuItem(this, "ws_front_rc");
}, false);
menu.appendChild(menuElt);
newTable = document.createElement("table");
newTable.id = "ws_front_ps";
newTable.style.display = "none";
newTr = document.createElement("tr");
newTd = document.createElement("td");
var helpImg = document.createElement("img");
helpImg.src = imgHelpPngLol;
helpImg.alt = "help";
helpImg.title = "Caractères qui seront insérés avant et après un smiley lors d'un clic sur ce dernier";
helpImg.style.verticalAlign = "text-bottom";
helpImg.style.cursor = "help";
newTd.innerHTML = "Template d'insertion du smiley ";
newTd.appendChild(helpImg);
newTd.rowSpan = "2";
newTr.appendChild(newTd);
newTd = document.createElement("td");
newTd.style.textAlign = "right";
newTd.style.fontWeight = "normal";
newInput = document.createElement("input");
newInput.id = "ws_template_smiley_left";
newInput.type = "text";
newInput.size = "2";
newInput.maxLength = "5";
newInput.addEventListener("keyup", cmScript.refreshSmileyTemplateExemple, false);
cmScript.disableTabUp(newInput);
newTd.appendChild(newInput);
newTd.appendChild(document.createTextNode("[:smiley]"));
newInput = document.createElement("input");
newInput.id = "ws_template_smiley_right";
newInput.type = "text";
newInput.size = "2";
newInput.maxLength = "5";
newInput.addEventListener("keyup", cmScript.refreshSmileyTemplateExemple, false);
newTd.appendChild(newInput);
newTr.appendChild(newTd);
newTable.appendChild(newTr);
newTr = document.createElement("tr");
newTd = document.createElement("td");
newTd.id = "ws_template_smiley_exemple";
newTd.style.textAlign = "right";
newTd.style.fontStyle = "italic";
newTd.style.fontWeight = "normal";
newTr.appendChild(newTd);
newTable.appendChild(newTr);
cmScript.configDiv.appendChild(newTable);
newTr = document.createElement("tr");
newTd = document.createElement("td");
helpImg = document.createElement("img");
helpImg.src = imgHelpPngLol;
helpImg.alt = "help";
helpImg.title = "Activer en permance la zone de réponse flottante au chargement d'une page";
helpImg.style.verticalAlign = "text-bottom";
helpImg.style.cursor = "help";
newTd.innerHTML = "Zone de réponse flottante permanente ? ";
newTd.appendChild(helpImg);
newTr.appendChild(newTd);
newTd = document.createElement("td");
newTd.style.textAlign = "right";
newInput = document.createElement("input");
newInput.id = "ws_always_not_sticky";
newInput.type = "checkbox";
newTd.appendChild(newInput);
newTr.appendChild(newTd);
newTable.appendChild(newTr);
newTr = document.createElement("tr");
newTd = document.createElement("td");
helpImg = document.createElement("img");
helpImg.src = imgHelpPngLol;
helpImg.alt = "help";
helpImg.title = "Activer la zone de réponse flottante par un double clic sur l'icône de multi-quotes";
helpImg.style.verticalAlign = "text-bottom";
helpImg.style.cursor = "help";
newTd.innerHTML = "Zone de réponse flottante pour le multi-quotes ? ";
newTd.appendChild(helpImg);
newTr.appendChild(newTd);
newTd = document.createElement("td");
newTd.style.textAlign = "right";
newInput = document.createElement("input");
newInput.id = "ws_active_on_mq";
newInput.type = "checkbox";
newTd.appendChild(newInput);
newTr.appendChild(newTd);
newTable.appendChild(newTr);
menuElt = document.createElement("li");
menuElt.innerHTML = "Paramétrage divers";
menuElt.addEventListener("click", function() {
cmScript.selectMenuItem(this, "ws_front_ps");
}, false);
menu.appendChild(menuElt);
var buttonsContainer = document.createElement("div");
var inputOk = document.createElement("input");
inputOk.type = "image";
inputOk.src = imgOkPngLol;
inputOk.title = "Valider";
inputOk.addEventListener("click", cmScript.validateConfig, false);
var inputCancel = document.createElement("input");
inputCancel.type = "image";
inputCancel.src = imgCancelPngLol;
inputCancel.title = "Annuler";
inputCancel.addEventListener("click", cmScript.hideConfigWindow, false);
cmScript.disableTabDown(inputCancel);
buttonsContainer.appendChild(inputCancel);
buttonsContainer.appendChild(inputOk);
cmScript.configDiv.appendChild(buttonsContainer);
document.body.appendChild(cmScript.configDiv);
}
},
validateConfig: function() {
getElementByXpath(".//table[contains(@style, \"table\")]//input[starts-with(@id, \"ws_\")]",
$("ws_front")).forEach(function(input) {
var value = null;
if(input.getAttribute("key")) {
value = input.getAttribute("key");
} else if(input.type == "checkbox") {
value = input.checked;
} else {
value = input.value;
}
GM_setValue(input.id, value);
});
cmScript.hideConfigWindow();
},
initBackAndFront: function() {
if($("ws_back")) {
cmScript.setBackgroundPosition();
cmScript.backgroundDiv.style.opacity = 0;
cmScript.backgroundDiv.style.display = "block";
}
if($("ws_front")) {
for(var id in cmScript.shortcuts) {
if(cmScript.getShortcutKey(id) != "") {
$(id).value = cmScript.keysBinding[cmScript.getShortcutKey(id)];
}
}
$("ws_template_smiley_left").value = cmScript.templateSmileyLeft;
$("ws_template_smiley_right").value = cmScript.templateSmileyRight;
$("ws_always_not_sticky").checked = cmScript.alwaysNotSticky == true;
$("ws_active_on_mq").checked = cmScript.activeOnMq == true;
cmScript.refreshSmileyTemplateExemple();
}
},
showConfigWindow: function() {
cmScript.alterWindow(true);
cmScript.initBackAndFront();
var opacity = 0;
cmScript.timer = setInterval(function() {
opacity = Math.round((opacity + 0.1) * 100) / 100;
cmScript.backgroundDiv.style.opacity = opacity;
if(opacity >= 0.8) {
clearInterval(cmScript.timer);
cmScript.configDiv.style.display = "block";
cmScript.setConfigWindowPosition();
}
}, 1);
},
hideConfigWindow: function() {
cmScript.configDiv.style.display = "none";
var opacity = cmScript.backgroundDiv.style.opacity;
cmScript.timer = setInterval(function() {
opacity = Math.round((opacity - 0.1) * 100) / 100;
cmScript.backgroundDiv.style.opacity = opacity;
if(opacity <= 0) {
clearInterval(cmScript.timer);
cmScript.backgroundDiv.style.display = "none";
cmScript.alterWindow(false);
}
}, 1);
},
setUp: function() {
cmScript.buildBackground();
cmScript.buildConfigWindow();
cssManager.insertStyle();
},
createConfigMenu: function() {
GM_registerMenuCommand("[HFR] wiki smileys et raccourcis -> configuration",
this.showConfigWindow);
}
};
cmScript.setUp();
cmScript.createConfigMenu();
var getKeyWords = function(code, cbf) {
toyoAjaxLib.loadDoc("https://forum.hardware.fr/wikismilies.php", "get",
"config=hfr.inc&detail=" + encodeURIComponent(code),
function(pageContent) {
var keyWords = pageContent.match(/name="keywords0"\s*value="(.*)"\s*onkeyup/).pop();
cbf(keyWords);
});
}
if($("content_form")) {
$("content_form").style.marginTop = "2px";
$("content_form").style.marginBottom = "2px";
var addCommentMessage = document.getElementById("addCommentMessage");
var newDiv = document.createElement("div");
newDiv.setAttribute("style", "display:inline;");
newDiv.innerHTML = " ";
if(addCommentMessage) {
// suppression des br en trop
let l_brs = document.querySelectorAll("tr.reponse > td.repCase2 div.spacer + br, " +
"tr.reponse > th.repCase1 > br");
for(let l_br of l_brs) {
l_br.parentNode.removeChild(l_br);
}
// ajout de br mieux placés
let l_new_br = document.querySelector("tr.reponse > th.repCase1 > div:first-of-type > " +
"div.center:first-child > br:first-child");
if(!l_new_br) {
var l_div_smiley = document.querySelector("tr.reponse > th.repCase1 > div:first-of-type > " +
"div.center:first-child > div.smiley");
if(l_div_smiley) {
l_div_smiley.parentNode.removeChild(l_div_smiley.previousSibling);
l_div_smiley.parentNode.removeChild(l_div_smiley.previousElementSibling);
l_div_smiley.parentNode.insertBefore(document.createElement("br"), l_div_smiley.previousElementSibling);
l_div_smiley.parentNode.insertBefore(document.createElement("br"), l_div_smiley);
l_div_smiley.parentNode.insertBefore(document.createElement("br"), l_div_smiley);
}
}
var style = document.createElement("style");
document.head.appendChild(style);
style.sheet.insertRule("div.smiley img{margin:0 !important;padding:2px !important;" +
"vertical-align:middle !important;}", 0);
style.sheet.insertRule("div#dynamic_smilies img{margin:0 !important;padding:4px 2px 0 2px !important;" +
"vertical-align:middle !important;}", 0);
style.sheet.insertRule("div.smiley{width:147px !important;}", 0);
style.sheet.insertRule("div#dynamic_smilies{font-weight:normal !important;}", 0);
style.sheet.insertRule("div#dynamic_smilies a.s1Topic{font-weight:bold !important;}", 0);
var helpGenDiv = document.createElement("div");
helpGenDiv.setAttribute("style", "display:inline;");
helpGenDiv.appendChild(document.createTextNode(" "));
$("content_form").parentNode.insertBefore(newDiv, addCommentMessage);
$("content_form").parentNode.insertBefore(helpGenDiv, addCommentMessage);
$("content_form").style.marginTop = "0";
$("content_form").style.width = "calc(100% - 6px)";
$("content_form").style.resize = "vertical";
$("content_form").parentNode.style.fontSize = "small";
} else {
var br1 = document.createElement("br");
document.getElementById("md_arbo_bottom").parentNode
.insertBefore(br1, document.getElementById("md_arbo_bottom").nextElementSibling.nextElementSibling);
$("content_form").parentNode.appendChild(newDiv);
}
newDiv = document.createElement("div");
newDiv.id = "dynamic_smilies_pouet";
newDiv.setAttribute("style", "text-align:center;");
if(addCommentMessage) {
newDiv.setAttribute("class", "reponse");
}
$("content_form").parentNode.appendChild(newDiv);
function putSmiley(code, textAreaId) {
insertBBCode(textAreaId, cmScript.templateSmileyLeft + code + cmScript.templateSmileyRight, "");
}
var insertBBCode = function(textAreaId, left, right, offset = 0) {
var content = $(textAreaId);
if(content.selectionStart || content.selectionStart == 0) {
if(content.selectionEnd > content.value.length) {
content.selectionEnd = content.value.length;
}
var firstPos = content.selectionStart;
var secondPos = content.selectionEnd + left.length;
var contenuScrollTop = content.scrollTop;
content.value = content.value.slice(0, firstPos) + left + content.value.slice(firstPos);
content.value = content.value.slice(0, secondPos) + right + content.value.slice(secondPos);
content.selectionStart = firstPos + left.length;
content.selectionEnd = secondPos;
if(offset !== 0) {
content.selectionStart = content.selectionStart + offset;
content.selectionEnd = content.selectionStart;
}
content.focus();
content.scrollTop = contenuScrollTop;
}
}
var proceedShortcut = function(event, textAreaId) {
var key = event.keyCode ? event.keyCode : event.which;
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_spoiler")) {
event.preventDefault();
insertBBCode(textAreaId, "[spoiler]", "[/spoiler]");
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_b")) {
event.preventDefault();
insertBBCode(textAreaId, "[b]", "[/b]");
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_i")) {
event.preventDefault();
insertBBCode(textAreaId, "[i]", "[/i]");
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_u")) {
event.preventDefault();
insertBBCode(textAreaId, "[u]", "[/u]");
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_img")) {
event.preventDefault();
insertBBCode(textAreaId, "[img]", "[/img]");
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_img_rehost")) {
event.preventDefault();
insertBBCode(textAreaId, "[img]https://reho.st/", "[/img]");
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_quote")) {
event.preventDefault();
insertBBCode(textAreaId, "[quote]", "[/quote]");
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_url")) {
event.preventDefault();
insertBBCode(textAreaId, "[url=]", "[/url]", -1);
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_code")) {
event.preventDefault();
var language = window.prompt("Entrez le nom du langage :");
insertBBCode(textAreaId, language == null || language == "" ? "[code]" : "[code=" + language + "]", "[/code]")
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_fixed")) {
event.preventDefault();
insertBBCode(textAreaId, "[fixed]", "[/fixed]");
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_strike")) {
event.preventDefault();
insertBBCode(textAreaId, "[strike]", "[/strike]");
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_puce")) {
event.preventDefault();
insertBBCode(textAreaId, "[*]", "");
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_smiley")) {
event.preventDefault();
insertBBCode(textAreaId, "[:", "]");
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_color_red")) {
event.preventDefault();
insertBBCode(textAreaId, "[#ff0000]", "[/#ff0000]");
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_color_blue")) {
event.preventDefault();
insertBBCode(textAreaId, "[#0000ff]", "[/#0000ff]");
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_color_yellow")) {
event.preventDefault();
insertBBCode(textAreaId, "[#ffff00]", "[/#ffff00]");
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_color_green")) {
event.preventDefault();
insertBBCode(textAreaId, "[#00ff00]", "[/#00ff00]");
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_color_orange")) {
event.preventDefault();
insertBBCode(textAreaId, "[#ff7f00]", "[/#ff7f00]");
}
if(((event.altKey && event.ctrlKey) /*|| event.getModifierState("AltGraph")*/) && key == cmScript.getShortcutKey("ws_color_purple")) {
event.preventDefault();
insertBBCode(textAreaId, "[#bf00ff]", "[/#bf00ff]");
}
}
var findSmilies = function(inputId, targetId) {
var hashCheck = getElementByXpath("//input[@name=\"hash_check\"]", document).pop().value;
var searchkeyword = $(inputId).value;
var divsmilies = $(targetId);
if(searchkeyword.length > 2 && (searchkeyword !== findSmiliesBuffer || inputId !== lastSearchId)) {
divsmilies.innerHTML = "";
document.documentElement.scrollTop += divsmilies.clientHeight;
lastSearchId = inputId;
findSmiliesBuffer = searchkeyword;
toyoAjaxLib.loadDoc("https://forum.hardware.fr/message-smi-mp-aj.php", "get",
"config=hfr.inc&findsmilies=" + encodeURIComponent(searchkeyword),
function(reponse) {
if(reponse.indexOf("<") === -1) {
divsmilies.innerHTML = "