// ==UserScript==
// @name Google Images - Image Direct Link
// @namespace http://tazzito.wordpress.com
// @author Taz-G(iancarlo)
// @description Adds a direct link to the image on the details text
// @include http://images.google.*/*
// ==/UserScript==

/* You can redistribute and modify this script as your convenience  */

(function()
	{
	var cur_thumb = 0; // Vignette courante traitée.
	var detail = null; // Partie tDataTexte courante.
	var image = null; // Partie tDataImage courante.
	var texte = ""; // Texte de noeud_texte sauvegardé avant suppression du noeud.
	var href_image = ""; // Lien direct vers l'image extrait devant figurer dans le href  du nouveau noeud.
	var noeud_lien_image = null; // Nouveau noeud lien (lien direct vers l'image) qui remplace le noeud texte supprimé.
	var regex_image = "imgurl=(.*?)&"; // Expression régulière servant à extraire l'URL de l'image.
	
	/*
	* Les détails des vignettes et illustrations sont repérables par des sections débutant par tDataText et tDataImage
	* respectivement, suivi du numéro de vignette sur la page courante.
	* Le numéro minimum est 0, le numéro maxmimun est 19.
	*/
	
	var structok = true; // Indice approximatif de la structure attendue (risque d'erreur : 50/50).
	
	do
		{
		detail = document.getElementById("tDataText" + cur_thumb);
		image = document.getElementById("tDataImage" + cur_thumb);
		if(detail!=null && image!=null)
			{
				// "Echappement" de la balise <font> englobée par le <td> identifiant
			detail = detail.firstChild;
			image = image.firstChild;
			if(detail!=null && image!=null)
				{
				
					// Trouver le texte des détails techniques (noeud texte suivant directement le premier <br/>)
				var curtag = detail.firstChild;
				var trouve = false;
				var position_curtag = 0;
				while(curtag != null && trouve == false)
					{
					if(curtag.nodeType == 1) // Si c'est un noeud, on teste si c'est le tag <br/>
						if(curtag.tagName.toLowerCase() == "br") trouve = true;
					curtag = curtag.nextSibling;
					position_curtag++ ;
					}
				if(trouve) // Si on était en possession du premier <br/> on vérifie qu'on a bien un noeud texte (obligatoire pour poursuivre)
					if(curtag.nodeType == 3)
						{
						texte = curtag.nodeValue;
						href_image = image.getAttribute("href").match(regex_image)[1]; // Obtention de l'URL vers l'image seule.
							
							// Ajout du lien direct vers l'image sur le texte de détail technique de l'image.
						detail.removeChild(curtag);
						noeud_lien_image = document.createElement("a");
						noeud_lien_image.setAttribute("title", "Image direct link");
						noeud_lien_image.setAttribute("href", href_image);
						noeud_lien_image.appendChild(document.createTextNode(texte));
						detail.insertBefore(noeud_lien_image, detail.childNodes[position_curtag]);
						}
					else structok = false;
				else structok = false;	
				}
			else structok = false;
			}
		else structok = false;
		
			// Vignette suivante
		cur_thumb++ ;
		}
		while(structok);
	})();
