Greasy Fork is available in English.

MH - Kassbi - Message RTE

Transformation de la boite d'édition standard des messages en un Rich Text Editor

// ==UserScript==
// @name        MH - Kassbi - Message RTE
// @namespace   MH
// @description Transformation de la boite d'édition standard des messages en un Rich Text Editor
// @include     */MH_Play/Play_vue.php
// @include     */Messagerie/MH_Messagerie.php?cat=3*
// @include     */Messagerie/ViewMessage.php?answer=1*
// @icon        https://xballiet.github.io/ImagesMH/MZ.png
// @version     2.8
// @grant       none
// @require     https://greasyfork.org/scripts/23602-tout-mz?version=892175&d=.user.js
// ==/UserScript==

/*
* Script MZ : Transformation de la boite d'édition standard des messages en un Rich Text Editor
* Auteur : Kassbinette (95429)
* Contributeur : Utilisation des exemples Mozilla de RTE
*				fonction addbutton empruntée aux scripts de Marmotte86 (93138) & disciple (62333)
* Intégration complète des scripts Messagerie.js de Marmotte86 (93138) & disciple (62333)
*
* Merci à Vapulabehemot(82169) pour ses remarques pertinentes et ses corrections dans les infobulles.
*
* La variable hostName doit être adaptée si le script est copié sur un autre serveur.
* Le chemin du fichier doit subir le même sort si l'arborescence est changée.
*/

//var hostName = "http://localhost:2305";
var hostName = "https://xballiet.github.io";
var editorPath = "/MessageRTE/";
var editorPage = editorPath + "MessageRTE.htm";

if (isPage("MH_Play/Play_vue.php")) {
	function appendLinkToCopiableTable(labelName, tableName) {
		try {
			document.getElementsByName(labelName)[0].parentNode.innerHTML = "<span>" + document.getElementsByName(labelName)[0].parentNode.innerHTML + "</span>";
			oA = document.createElement("A");
			oA.style.cssFloat = "right";
			//oA.innerHTML = "showCopiable";
			oImg = document.createElement("IMG");
			oImg.src = hostName + editorPath + "ClipBoard.png";
			oImg.alt = "Montrer une version copier-collable du tableau";
			oA.appendChild(oImg);
			oA.addEventListener('click',
				function () {
					if (document.getElementById("showCopiableTable") == null || document.getElementById("showCopiableTable").style.display == "none") {
						displayTable(labelName, tableName);
					} else {
						document.getElementById("showCopiableTable").style.display = "none";
					}
				},
				true
			);
			document.getElementsByName(labelName)[0].parentNode.appendChild(oA);
		} catch (e) {
			alert("JS - appendLinkToCopiableTable : " + e.message);
		}
	}

	function removeChildren(oObj) {
		if (oObj.hasChildNodes()) {
			while (oObj.childNodes.length >= 1) {
				oObj.removeChild(oObj.firstChild);
			}
		}
	}

	function findPosY(obj) {
		var curtop = 0;
		if (obj.offsetParent) {
			do {
				curtop += obj.offsetTop;
			} while (obj = obj.offsetParent);
		}
		return curtop;
	}

	function displayTable(labelName, tableName) {
		try {
			var oDiv = document.getElementById("showCopiableTable");
			if (oDiv == null) {
				oDiv = document.createElement("DIV");
			} else {
				removeChildren(oDiv);
			}

			oDiv.style.display = "block";
			oDiv.id = "showCopiableTable";
			oDiv.style.zIndex = 100;
			oDiv.style.padding = "0px";
			oDiv.style.margin = "0px";
			oDiv.style.top = findPosY(document.getElementsByName(labelName)[0]);
			oDiv.style.left = 100;
			oDiv.style.border = "1px black solid";
			oDiv.style.position = "absolute";

			var oEntete = document.createElement("DIV");
			oEntete.style.width = "100%";
			oEntete.style.height = "22px";
			oEntete.style.border = "1px black solid";
			//oEntete.style.background = "White";
			oEntete.style.backgroundImage = "url('" + hostName + editorPath + "MHfond.jpg')";
			oEntete.id = "showCopiableTableEntete";

			var oEnteteTextInnerDiv = document.createElement("DIV");
			oEnteteTextInnerDiv.style.cssFloat = "left";
			oEnteteTextInnerDiv.style.height = "20px";
			oEnteteTextInnerDiv.innerHTML = "Tableau copier-collable vers le MessageRTE";
			oEnteteTextInnerDiv.style.marginTop = "2px";
			oEnteteTextInnerDiv.style.marginLeft = "2px";

			var oEnteteInnerDiv = document.createElement("DIV");
			oEnteteInnerDiv.style.cssFloat = "right";
			oEnteteInnerDiv.style.height = "20px";
			oEnteteInnerDiv.style.width = "20px";

			var oImg = document.createElement("Img");
			oImg.style.width = "100%";
			oImg.style.marginRight = "5px";
			oImg.style.paddingRight = "3px";
			oImg.style.paddingTop = "3px";
			oImg.style.height = "15px";
			oImg.style.width = "15px";
			oImg.addEventListener('click', function () { document.getElementById("showCopiableTable").style.display = "none"; }, true);
			oImg.src = hostName + editorPath + "index.png";
			oImg.style.float = "right";

			oEnteteInnerDiv.appendChild(oImg);
			oEntete.appendChild(oEnteteTextInnerDiv);
			oEntete.appendChild(oEnteteInnerDiv);
			oDiv.appendChild(oEntete);

			var oInnerDiv = document.createElement("DIV");
			oInnerDiv.style.width = "100%";
			oInnerDiv.innerHTML = document.getElementById(tableName).innerHTML;

			oDiv.appendChild(oInnerDiv);

			document.body.appendChild(oDiv);
		} catch(e) {
			alert("JS - displayTable : " + e.message);
		}
	}

	appendLinkToCopiableTable("monstres", "mh_vue_hidden_monstres");
	appendLinkToCopiableTable("trolls", "mh_vue_hidden_trolls");
	appendLinkToCopiableTable("tresors", "mh_vue_hidden_tresors");
	appendLinkToCopiableTable("champignons", "mh_vue_hidden_champignons");
	appendLinkToCopiableTable("lieux", "mh_vue_hidden_lieux");
	appendLinkToCopiableTable("cadavres", "mh_vue_hidden_cadavres");
}

if (isPage("Messagerie/MH_Messagerie.php?cat=3")) {
	// Dialogue avec l'iframe
	function receiveMessage(event) {
		try {
				// Vérifier l'origine du message
				if (event.origin.toLowerCase() == hostName.toLowerCase()) {
					if (event.data.substring(0, "SendHtml".length) == "SendHtml") {
						// L'iframe enfant envoie le texte qu'elle contient, donc l'ajouter dans la textArea originale
						SendHtml(event.data);
					} else if (event.data == "RequestText") {
						// L'iframe demande le texte présent dans la textArea, donc lui fournir le texte présent dans celle-ci
						FillText();
					} else if (event.data == "HideTextArea") {
						HideTextArea();
					} else if (event.data == "DisplayRTE") {
						DisplayRTE();
					} else if (event.data == "Preview") {
						displayPreview();
					} else if (event.data == "SaveMsg") {
						SaveMsg();
					} else if (event.data.substring(0, "SaveMpFont".length) == "SaveMpFont") {
						SaveFont(event.data.substring("SaveMpFont".length, event.data.length));
					} else if (event.data == "RTERequestMpFont") {
						SendFont();
					} else if (event.data == "RestoreMsg") {
						RestoreMsg();
					} else if (event.data == "Reply") {
						Reply();
					} else if (event.data == "RTERequestMpSignature") {
						SendSignature();
					} else if (event.data == "RTERequestMpSignatureUsage") {
						SendSignatureUsage();
					} else if (event.data.substring(0, "SaveSignatureUsage".length) == "SaveSignatureUsage") {
						SaveSignatureUsage(event.data.substring("SaveSignatureUsage".length, event.data.length));
					} else if (event.data.substring(0, "SaveMpSignature".length) == "SaveMpSignature") {
						SaveSignature(event.data.substring("SaveMpSignature".length, event.data.length));
					} else {
						alert("JS - receiveMessage - Commande non reconnue : " + event.data);
					}
			} else {
				alert("HostName incorrect :" + event.origin + " alors que " + hostName + " était attendu.");
			}
		} catch (e) {
			alert("JS - receiveMessage : " + e.message);
		}
	}

	// Stocker la signature
	function SaveSignature(signature) {
		try {
			window.localStorage['MpSignature'] = signature;
		} catch (e) {
			alert("JS - SaveSignature : " + e.message);
		}
	}

	// Stocker l'utilisation de la signature
	function SaveSignatureUsage(usage) {
		try {
			window.localStorage['MpSignatureUsage'] = usage;
		} catch (e) {
			alert("JS - SaveSignatureUsage : " + e.message);
		}
	}

	// Envoyer la signature
	function SendSignature(){
		try {
			if (window.localStorage['MpSignature']) {
				signature = window.localStorage['MpSignature'];
				var iFrameWindow = unsafeWindow.document.getElementById('RTEedit').contentWindow;
				iFrameWindow.postMessage("JsSendMpSignature" + signature, hostName);
			}
		} catch (e) {
			alert("JS - SaveSignature : " + e.message);
		}
	}

	// Envoyer l'utilisation de la signature
	function SendSignatureUsage() {
		try {
			if (window.localStorage['MpSignatureUsage']) {
				signatureUsage = window.localStorage['MpSignatureUsage'];
				var iFrameWindow = unsafeWindow.document.getElementById('RTEedit').contentWindow;
				iFrameWindow.postMessage("JsSendMpSignatureUsage" + signatureUsage, hostName);
			}
		} catch (e) {
			alert("JS - SaveSignature : " + e.message);
		}
	}

	// Stocker la font
	function SaveFont(fontName) {
		try {
			window.localStorage['MpFont'] = fontName;
		} catch (e) {
			alert("JS - SaveFont : " + e.fontName);
		}
	}

	// Envoyer la font
	function SendFont() {
		try {
			if (window.localStorage['MpFont']) {
				fontname = window.localStorage['MpFont'];
				var iFrameWindow = unsafeWindow.document.getElementById('RTEedit').contentWindow;
				iFrameWindow.postMessage("JsSendMpFont" + fontname, hostName);
			}
		} catch (e) {
			alert("JS - SendFont : " + e.message);
		}
	}

	// Fonction envoyant le texte du RTE à la textArea
	function SendHtml(text) {
		 try {
			document.getElementsByName('Message')[0].value = text.substring("SendHtml".length, text.length).replace(/<br>/gi, '\r\n');
			displayPreview();
		} catch (e) {
			alert("JS - SendHtml : " + e.message);
		}
	}

	// Fonction demandant au RTE de fournir le texte qu'il contient
	function RequestHtmlText() {
		try {
			var iFrameWindow = unsafeWindow.document.getElementById('RTEedit').contentWindow;
			// Demander le texte contenu dans la textArea
			iFrameWindow.postMessage("RequestHtmlText", hostName);
		} catch (err) {
			alert("JS - error : " + err.message);
		}
	}

	// Fournir le texte de la textArea au RTE
	function FillText() {
		try {
			var iFrameWindow = unsafeWindow.document.getElementById('RTEedit').contentWindow;
			// Forcer le stockage du texte contenu dans la textArea dans la boite d'édition
			iFrameWindow.postMessage("FillText" + document.getElementsByName('Message')[0].value.replace(/\n/gi, '<br>'), hostName);
			displayPreview();
		} catch (err) {
			alert("JS - error : " + err.message);
		}
	}

	// Cacher la textArea
	function HideTextArea() {
		try {
			document.getElementsByName('Message')[0].style.visibility = "hidden";
			document.getElementsByName('Message')[0].style.display = "none";
		} catch (e) {
			alert("JS - HideTextArea : " + e.message);
		}
	}

	// Montrer la textArea
	function ShowTextArea() {
		try {
			document.getElementsByName('Message')[0].style.visibility = "visible";
			document.getElementsByName('Message')[0].style.display = "block";
			document.getElementsByName('Message')[0].focus();
		} catch (e) {
			alert("JS - ShowTextArea : " + e.message);
		}
	}

	// Créer le RTE
	function createRTE() {
		try {
			// Création de la textArea
			var messageArea = document.getElementsByName('Message')[0];
			//messageArea.parentNode.appendChild(document.createElement('br'));
			var newTextArea = document.createElement('iframe');
			newTextArea.setAttribute('id', 'RTEedit');
			newTextArea.setAttribute('src', hostName + editorPage);
			newTextArea.setAttribute('style', 'border:0px;overflow:hidden;width:630px;height:440px;display:none');
			messageArea.parentNode.appendChild(newTextArea);
			submitButton = document.getElementsByName('bsSend')[0];
		} catch (e) {
			alert("JS - CreateRTE : " +e.message);
		}
	}

	// Montrer le RTE
	function DisplayRTE() {
		try {
			document.getElementById('RTEedit').style.display = "block";
		} catch (e) {
			alert("JS - DisplayRTE : " + e.message);
		}
	}

	// Ajout d'un bouton
	function addButton(caption, clickFunction) {
		try {
			var sendButton = document.getElementsByName('bsSend')[0];
			var newButton = document.createElement('input');
			newButton.setAttribute('type', 'button');
			newButton.setAttribute('class', 'mh_form_submit');
			newButton.setAttribute('value', caption);
			newButton.addEventListener('click', clickFunction, true);
			sendButton.parentNode.appendChild(document.createTextNode(' '));
			sendButton.parentNode.appendChild(newButton);
		} catch (e) {
			alert("JS - addButton : " + e.message);
		}
	}

	/// Intégration des scripts de marmotte et disciple ///
	function addPreviewBox() {
		try {
			// Ajout de la ligne d'affichage de l'aperçu
			var trPreview = document.createElement('tr');
			trPreview.setAttribute('class', 'mh_tdpage');
			var tdPreview = document.createElement('td');
			tdPreview.setAttribute('id', 'marmotte_preview');
			tdPreview.setAttribute('colspan', 4);
			trPreview.appendChild(tdPreview);
			//document.getElementsByTagName('form')[0].getElementsByTagName('table')[2].getElementsByTagName('tbody')[0].appendChild(trPreview);
			document.getElementsByName('bsSend')[0].parentNode.parentNode.parentNode.appendChild(trPreview);
		} catch (e) {
			alert("JS - addPreviewBox : " + e.message);
		}
	}

	// Affichage de l'aperçu
	function displayPreview() {
		try {
			var tdPreview = document.getElementById('marmotte_preview');
			var messageArea = document.getElementsByName('Message')[0];
			tdPreview.innerHTML = messageArea.value.replace(/\r?\n/g, '<br>');
		} catch (e) {
			alert("JS - displayPreview : " + e.message);
		}
	}

	// Sauvegarde du MP
	function SaveMsg() {
		try {
			var messageArea = document.getElementsByName('Message')[0];
			var titleInput = document.getElementsByName('Titre')[0];
			if (titleInput.value != '') {
				window.localStorage['lastMPTitle'] = titleInput.value;
			}
			if (messageArea.value != '') {
				window.localStorage['lastMP'] = messageArea.value;
			}
		} catch (e) {
			alert("JS - SaveMsg : " + e.message);
		}
	}

	// Restauration du MP sauvegardé
	function RestoreMsg() {
		try {
			var messageArea = document.getElementsByName('Message')[0];
			var titleInput = document.getElementsByName('Titre')[0];
			if (window.localStorage['lastMPTitle']) {
				titleInput.value = window.localStorage['lastMPTitle'];
			}
			if (window.localStorage['lastMP']) {
				messageArea.value = window.localStorage['lastMP'];
			}
			FillText();
		} catch (e) {
			alert("JS - RestoreMsg : " + e.message);
		}
	}

	// Restauration du MP sauvegardé
	function Reply() {
		var messageArea = document.getElementsByName('Message')[0];
		if (window.localStorage['lastReply']) {
			messageArea.value = window.localStorage['lastReply'];
		}
		FillText();
	}
	/// Fin première partie intégration ///

	// Modification de la page MH
	try {
		// Initialiser les événements sur la page
		unsafeWindow.addEventListener("message", receiveMessage, false);
		// Ajout d'un event onChange sur la textArea
		//document.getElementsByName('Message')[0].addEventListener("change", FillText, false);
		// Ajouter le RTE (mais pas le montrer : lorsqu'il sera créé, il demandera lui-même à cette page de l'afficher)
		createRTE();
		/// Marmotte : ajouter la boite de preview
		addPreviewBox();
		/// Marmotte : ajouter l'événement enregistrant la copie durant l'envoi du message
		document.getElementsByName('bsSend')[0].addEventListener('click', SaveMsg, true);

		if (hostName == "http://localhost:2105" || hostName == "http://localhost:2305") {
			addButton("Textarea Text", ShowTextArea);
		}
	} catch (e) {
		alert("JS - Init page: " + e.message);
	}
} else if (isPage("Messagerie/ViewMessage.php?answer=1")) {
	/* Ajout de disciple (62333) */
	function reply(e) {
		var reply = document.evaluate("//table/tbody/tr[5]/td", document, null, XPathResult.ANY_TYPE, null).iterateNext().innerHTML;
		reply = '> ' + reply.replace(/<br>/g, '<br>&gt; ');
		window.localStorage['lastReply'] = reply + '\n\n';
	};

	document.getElementsByName('bAnswer')[0].addEventListener('click', reply, true);
	document.getElementsByName('bAnswerToAll')[0].addEventListener('click', reply, true);
}