// ==UserScript==
// @name          LinuxFR papa on disk
// @namespace     http://arliguy.net/papa
// @description	  [fr] : version de papa.user.js qui fonctionne avec une page sauvegardee sur disque.
// @include       http://linuxfr.org/*
// @exclude       http://linuxfr.org/my/
// ==/UserScript==
// Notes:
//   version 0.1 - 08/10/2005 - premiere version.
//
//   auteur  : Bruno ARLIGUY
//
//   licence : GPL license - http://www.gnu.org/copyleft/gpl.html


(function()
{
	//Ajoute une balise <script> à l'entete HTML qui pointe sur les
	// fonctions complémentaires. 
	function add_papa_js()
	{
		var head   = document.getElementsByTagName('head')[0];
		var script = document.createElement('script');

		script.setAttribute('type', 'text/javascript');
		script.setAttribute('src', 'http://arliguy.net/papa.disk.functions.js');

		head.appendChild(script);
	}

	//Construit un block (div) qui contient les liens "Masquer" et "Afficher" pour l'UL passé en paramètre.
	//
	// param ul : un objet qui doit représenter un UL correspondant à 
	//            un commentaire (ie répond au xpath //ul[@class='commentsul'])
	function getPapaBlock(ul)
	{
		var namedLink  = ul.firstChild.childNodes[1];
		var parentLink = ul.parentNode.childNodes[1];
		var id         = namedLink.name;
		var div        = document.createElement("div");
		var aHide      = document.createElement("a");
		var aShow      = document.createElement("a");

		//
		div.setAttribute("id", "pn" + namedLink.name);
		div.setAttribute("class", "pn");
		div.setAttribute("style", "float: right;");

		//Faire pointer le lien masquant sur le commentaire parent.
		aHide.setAttribute("href", "#" + parentLink.name);
		aHide.setAttribute("id", "hide" + namedLink.name);
		aHide.setAttribute("class", "pn");
		aHide.setAttribute("onclick", "hideSibling(event);");

		aShow.setAttribute("href", "#" + namedLink.name);
		aShow.setAttribute("id", "show" + namedLink.name);
		aShow.setAttribute("class", "pn");
		aShow.setAttribute("style", "display: none");
		aShow.setAttribute("onclick", "showSibling(event);");

		div.appendChild(aHide);
		div.appendChild(aShow);

		aHide.appendChild(document.createTextNode("- Masquer"));
		aShow.appendChild(document.createTextNode("+ Afficher"));

		return div;
	}

		try
		{
			//Ajouter le javascript contenant les fonctions qui seront utilisées par les liens "Masquer" et "Afficher"
			add_papa_js();

			// Recupérer tous les UL de classe "commentsul". Pour chacun, ajouter un bloc dans sa barre de titre.
			// Ce bloc contiendra deux liens : "Masquer" et "Afficher". Chaque lien appellera un script
			// qui appliquera l'action correspondante (masquer ou afficher) sur tous les "previousSibling" du
			// commentaire associé. Le lien en lui même consistera à appeler la même page en la positionnant sur :
			//    - le lien nommé correspondant au commentaire parent si l'utilisateur a cliqué sur "Masquer"
			//    - le lien nommé correspondant au commentaire si l'utilisateur a cliqué sur "Afficher".
			// les liens nommés sont ceux de la forme <a name="580185"></a> et qui sont les "childNodes[1]" de chaque //ul[@class='commentsul'].
			var elements = document.evaluate("//ul[@class='commentsul']", document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); 
			var uls = new Array();
			var ul  = null;
			//tranferer les éléments trouvés dans un tableau.
			for (var i = 0; ul = elements.iterateNext(); i++)
			{
				uls[i] = ul;
			}

			var before = null;
			var previous = null;
			for (var i = 0; i < uls.length; i++)
			{
				previous = uls[i].previousSibling;
				while (previous.nodeName == "#text")
				{
					previous = previous.previousSibling;
				}

				if (previous.nodeName == "UL")
				{
					//Selectionner le premier H1 à partir du premier enfant de cet UL. J'utilise une expression xPath car
					// apparement le Html de LinuxFR a tendance à évoluer. Donc un accés relatif comme avant (avec des numéros
					// d'index dans les enfants, par exemple uls[i].firstChild.childNodes[5]) rendait le code trop dépendant des
					// modifications du code.
					before = document.evaluate("./h1", uls[i].firstChild, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.firstChild; 
					before.parentNode.insertBefore(getPapaBlock(uls[i]), before);
				}
			}
		}
		catch (ex)
		{
			GM_log(ex);
		}
})();