MH - Raistlin - Previous/Next Msg

Boutons "Message suivant" et "Message précédent" dans la fenêtre de lecture des messages

// ==UserScript==
// @name        MH - Raistlin - Previous/Next Msg
// @namespace   MH
// @description Boutons "Message suivant" et "Message précédent" dans la fenêtre de lecture des messages
// @include     */Messagerie/ViewMessage.php*
// @include     */Messagerie/ViewMessageBot.php*
// @include     */Messagerie/ViewMessageAlliance.php*
// @icon        https://xballiet.github.io/ImagesMH/MZ.png
// @version     2.0
// @grant       none
// @require     https://update.greasyfork.org/scripts/23602/Tout_MZ.user.js
// ==/UserScript==

// Script MZ pour rajouter les boutons "Message suivant" et "Message précédent" dans la fenêtre de lecture des messages
var urlMessageCourant;
var listeMessages;

// Ajout des KeyHandlers
function keyHandler(e) {
	// DOM_VK_ESCAPE = 27 correspond à la touche Esc
	if ((e.keyCode == 27) && (window.opener != null)) {
		window.close();
	}
}

// Récupérer la liste des URLs de messages depuis la page précédente sous forme de tableau
function getMessagesList() {
	var maListe = new Array();
	var fenetreSource = window.opener;
	if (fenetreSource == null || fenetreSource.document == null) {
		return false;
	} else {
		documentSource = fenetreSource.document;
	}
	var listeElems = documentSource.evaluate("//table//tr[descendant::a[starts-with(@href, 'ViewMessage')]]", documentSource, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
	var isNew = false;
	var elemCourant = listeElems.iterateNext();
	while (elemCourant) {
		var newMsg = documentSource.evaluate(".//td//img[contains(@src, 'New.gif')]", elemCourant, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
		if (newMsg.singleNodeValue != null) {
			isNew = true;
		} else {
			isNew = false;
		}
		var viewMsg = documentSource.evaluate(".//td//a[starts-with(@href, 'ViewMessage')]", elemCourant, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
		if (viewMsg != null) {
			maListe.push(new Array(viewMsg.singleNodeValue.href, isNew));
		}
		elemCourant = listeElems.iterateNext();
	}
	return maListe;
}

// Créer un bouton ou un espace (direction : g = Précédent et d = Suivant)
function addButton(parent, direction, unread, title, cible) {
	var bouton;
	var largeurImg = '12%';
	if (cible == null) {
		bouton = document.createTextNode('');
	} else {
		bouton = document.createElement('IMG');
		var sourceImg = '/MH_Packs/packMH_parchemin/fleches/fleche' + direction + '.jpg';
		if (unread) {
			sourceImg = '/mountyhall/Images/New.gif';
			largeurImg = '16%';
		}
		bouton.setAttribute('src', sourceImg);
		bouton.setAttribute('name', cible[0]);
		bouton.setAttribute('title', title);
		bouton.addEventListener('click', getOtherMessage, false);
	}

	var td = document.createElement('TD');
	td.setAttribute('align', 'center');
	td.setAttribute('width', largeurImg);
	td.appendChild(bouton);
	parent.appendChild(td);
}

// Créer un bouton pour check/uncheck
function addButtonJustToggle(parent) {
	var bouton = document.createElement('IMG');
	bouton.setAttribute('src', 'https://xballiet.github.io/ImagesMH/check.png');
	bouton.setAttribute('name', 'toggleBtn');
	bouton.setAttribute('title', 'Cocher / Décocher');
	bouton.addEventListener('click', toggleMessage, false);

	var td = document.createElement('TD');
	td.setAttribute('align', 'center');
	td.setAttribute('width', '12%');
	td.appendChild(bouton);
	parent.appendChild(td);
}

// Créer un bouton ou un espace pour check/uncheck et aller au message précédent/suivant (direction : g = Précédent et d = Suivant)
function addButtonToggle(parent, direction, title, cible) {
	var bouton;
	if (cible == null) {
		bouton = document.createTextNode('');
	} else {
		bouton = document.createElement('IMG');
		bouton.setAttribute('src', 'https://xballiet.github.io/ImagesMH/check' + direction + '.png');
		bouton.setAttribute('name', cible[0]);
		bouton.setAttribute('title', title);
		bouton.addEventListener('click', toggleMessage, false);
		bouton.addEventListener('click', getOtherMessage, false);
	}

	var td = document.createElement('TD');
	td.setAttribute('align', 'center');
	td.setAttribute('width', '16%');
	td.appendChild(bouton);
	parent.appendChild(td);
}

// Trouver le message suivant et le message précédent dans la liste
function getSurroundingMessages(urlMessage, listeMessages) {
	var retourArray = new Array();
	for (i = 0 ; i < listeMessages.length ; i++) {
		if (listeMessages[i][0] == urlMessage) {
			if (i > 0) {
				retourArray[0] = listeMessages[i - 1];
			}
			if (i < listeMessages.length - 1) {
				retourArray[1] = listeMessages[i + 1];
			}
		}
	}
	return retourArray;
}

// Trouver le message suivant et le message précédent non-lus dans la liste
function getSurroundingUnreadMessages(urlMessage, listeMessages) {
	var retourArray = new Array();
	var tmpArray = new Array();
	// On récupère uniquement les nouveaux messages
	for (var i = 0 ; i < listeMessages.length ; i++) {
		if (listeMessages[i][1] || (listeMessages[i][0] == urlMessage)) {
			tmpArray.push(listeMessages[i]);
		}
	}
	// Et on fait comme avant
	for (var i = 0 ; i < tmpArray.length ; i++) {
		if (tmpArray[i][0] == urlMessage) {
			if (i > 0) {
				retourArray[0] = tmpArray[i - 1];
			}
			if (i < tmpArray.length-1) {
				retourArray[1] = tmpArray[i + 1];
			}
		}
	}
	return retourArray;
}

// Fermer le message en cours, ouvrir le message depuis la fenêtre mère
function getOtherMessage(e) {
	window = window.opener.open(e.target.name, 'MsgView');
	window.focus();
}

// Fonction utilisée quand on clique sur le bouton pour cocher / décocher le message dans la fenêtre principale
function toggleMessage() {
	var fenetreSource = window.opener;
	if (fenetreSource == null || fenetreSource.document == null) {
		return false;
	} else {
		documentSource = fenetreSource.document;
	}
	var msgId = window.self.location.toString().split("msgId=")[1];
	var messageCourant = documentSource.evaluate("//table//tr//td//input[contains(@value, " + msgId + ")]", documentSource, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
	if (messageCourant.checked == undefined || messageCourant.checked == false) {
		messageCourant.checked = true;
	} else {
		messageCourant.checked = false;
	}
}

if (isPage("Messagerie/ViewMessage")) {
	// Écoute des touches pressées
	document.addEventListener('keypress', keyHandler, true);

	urlMessageCourant = window.self.location.toString();
	listeMessages = getMessagesList();

	// Rajout des flèches en haut de page
	var arrowTable = document.createElement('DIV');
	arrowTable.setAttribute('id', 'arrows');
	//var form = document.getElementsByName('msgForm')[0];
	var form = document.body;
	form.insertBefore(arrowTable, form.firstChild);

	var maTable = document.createElement('table');
	maTable.setAttribute('width', '98%');
	maTable.setAttribute('border', '0');
	maTable.setAttribute('bgcolor', '#000000');
	maTable.setAttribute('align', 'center');
	maTable.setAttribute('cellpadding', '2');
	maTable.setAttribute('cellspacing', '1');
	maTable.setAttribute('id', 'arrowTable');

	var mytbody = document.createElement('tbody');
	maTable.appendChild(mytbody);

	arrowTable.appendChild(maTable);
	var tr = document.createElement('TR');
	tr.setAttribute('bgcolor', '#CED2F7');
	tr.setAttribute('class', 'mh_tdpage');
	tr.setAttribute('align', 'center');
	mytbody.appendChild(tr);

	// On affiche les boutons ou des espaces vides
	var surroundings = getSurroundingMessages(urlMessageCourant, listeMessages);
	var surroundingsUnread = getSurroundingUnreadMessages(urlMessageCourant, listeMessages);
	addButton(tr, 'g', true,  'Précédent non-lu',              surroundingsUnread[1]);
	addButton(tr, 'g', false, 'Précédent',                     surroundings[1]);
	addButtonToggle(tr, 'g',  'Cocher / Décocher + Précédent', surroundings[1]);
	addButtonJustToggle(tr);
	addButtonToggle(tr, 'd',  'Cocher / Décocher + Suivant',   surroundings[0]);
	addButton(tr, 'd', false, 'Suivant',                       surroundings[0]);
	addButton(tr, 'd', true,  'Suivant non-lu',                surroundingsUnread[0]);
	if (surroundings == '' && surroundingsUnread == '') {
		form.removeChild(arrowTable);
	}
}