// *************** SCRIPTS JOURNAL DU NET ***********************
// Les 5 prochains scripts : http://developpeur.journaldunet.com/tutoriel/dht/060512-5-javascripts-vraiment-utiles.shtml

/*
getElementById()
L'une des fonctionnalités les plus utilisées du DOM est getElementById().
Désormais reconnue par tous les navigateurs modernes, elle reste cependant inaccessible aux autres.
Pour que les scripts modernes puissent cependant fonctionner sur les navigateurs ne reconnaissant pas cette méthode très appréciée,
la voici recréée en JavaScript. A placer au début de tout script faisant appel à getElementById().

L'usage est le même que pour la fonction originale : getElementById("identifiant").

*/

/*
if (!document.getElementById)
{
	if (document.all)
    		document.getElementById=function()
    		{
      			if ( typeof(document.all[arguments[0]]) != "undefined")
        			return document.all[arguments[0]];
      			else
        			return null;
      		}
  	else if (document.layers)
    		document.getElementById=function()
    		{
      			if ( typeof(document[arguments[0]]) != "undefined")
        			return document[arguments[0]];
      			else
        			return null;
      		}
  }*/

/*
Après avoir recréé une fonction JavaScript dans ce même langage,
l'étape suivante consiste à pallier aux manques de ce langage.
Notamment, nombre de développeurs se sont trouvés frustrés de pouvoir sélectionner un élément que par identifiant avec getElementById(),
mais auraient voulu également pouvoir sélectionner l'ensemble des éléments correspondant à
une certaine classe - ce que le DOM ne propose pas. De nombreuses versions de getElementsByClass()
ont donc été conçues au fil des années. En voici deux. La première a été créée par Dustin Diaz :
*/

/*
function getElementsByClass(searchClass, node, tag)
{
	var classElements = new Array();
    	if ( node == null )
        	node = document;
    	if ( tag == null )
        	tag = '*';
    	var els = node.getElementsByTagName(tag);
    	var elsLen = els.length;
    	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
    	for (i = 0, j = 0; i < elsLen; i++)
    	{
        	if ( pattern.test(els[i].className) )
        	{
            		classElements[j] = els[i];
            		j++;
        	}
    	}
    	return classElements;
}*/

/*

La seconde provient de Dylan Schiemann, et propose de passer par les méthodes XPath proposées par le DOM,
dans le cadre d'une page XHTML :

En l'état, la fonction de Dustin Diaz est plus efficace, car elle offre deux arguments supplémentaires et optionnels :
le premier pour préciser que la recherche se fait au sein d'un élément (récupéré via getElementById(), par exemple),
la seconde pour limiter la recherche à un nom de balise donnée (on peut également utiliser le joker * dans le cas par exemple de sélecteurs multiple).
*/
/*
function getElementByClassName(needle)
{
	//var xpathResult = document.evaluate('//*[@class = "'needle'"]', document, null, 0, null);
  	var outArray = new Array();
  	var item;
  	while (item = xpathResult.iterateNext()) outArray[outArray.length] = item;
  	return outArray;
}
*/
/*
Cette fonction est un pas supplémentaire dans l'accès aux balises par JavaScript :
viser les balises disposant d'un même attribut d'une valeur donnée.
Elle est disponible chez certains parseurs XML. Cette version a été créée par Robert Nyman.

    Copyright Robert Nyman, http://www.robertnyman.com
    Free to use if this text is included
*/
/*
function getElementsByAttribute(oElm, strTagName, strAttributeName, strAttributeValue)
{
	//	Copyright Robert Nyman, http://www.robertnyman.com
    	//	Free to use if this text is included


	var arrElements = (strTagName == "*" && document.all)? document.all : oElm.getElementsByTagName(strTagName);
    	var arrReturnElements = new Array();
    	var oAttributeValue = (typeof strAttributeValue != "undefined")? new RegExp("(^|\\s)" + strAttributeValue + "(\\s|$)") : null;
    	var oCurrent;
    	var oAttribute;
    	for(var i=0; i<arrElements.length; i++)
    	{
	        oCurrent = arrElements[i];
	        oAttribute = oCurrent.getAttribute(strAttributeName);
	        if (typeof oAttribute == "string" && oAttribute.length > 0)
	        {
            		if (typeof strAttributeValue == "undefined" || (oAttributeValue && oAttributeValue.test(oAttribute)))
            		{
                		arrReturnElements.push(oCurrent);
            		}
        	}
    	}
    	return arrReturnElements;
}*/

/*
La dernière innovation en la matière est la fonction baptisée $(),
issue du projet Prototype et qui sert de remplacement efficace à getElementById().
En effet, grâce à elle, un développeur peut remplacer ces appels de la forme var el = document.getElementById('id');
en var el = $('id'). C'est bien sûr plus court, mais $() va plus loin,
en donnant la possibilité d'appeller plusieurs id différents pour obtenir un tableau d'éléments à parcourir ensuite :
var el = $('id1', 'id2', 'id3');. La version que nous présentons ici est celle de Matthew Pennell :

L'idée de cette version est d'offrir un raccourci non seulement pour getElementById(),
mais également getElementsByTagName() et getElementsByClass(), le tout en une seule fonction.
En somme, une boîte à outils entière en une seule fonction simple d'usage : l'auteur la surnomme d'ailleurs getElementsByAnything().

*/
/*
function $()
{
	var elements = new Array();
    	for (var i=0,len=arguments.length;i<len;i++)
    	{
        	var element = arguments[i];
        	if (typeof element == 'string')
        	{
            		var matched = document.getElementById(element);
            		if (matched)
            		{
                		elements.push(matched);
            		}
            		else
            		{
                		var allels = (document.all) ? document.all : document.getElementsByTagName('*');
                		var regexp = new RegExp('(^| )'+element+'( |$)');
                		for (var i=0,len=allels.length;i<len;i++)
                			if (regexp.test(allels[i].className))
                				elements.push(allels[i]);
            		}
            		if (!elements.length)
            			elements = document.getElementsByTagName(element);
            		if (!elements.length)
            		{
                		elements = new Array();
                		var allels = (document.all) ? document.all : document.getElementsByTagName('*');
                		for (var i=0,len=allels.length;i<len;i++) if (allels[i].getAttribute(element)) elements.push(allels[i]);
            		}
            		if (!elements.length)
            		{
                		var allels = (document.all) ? document.all : document.getElementsByTagName('*');
                		for (var i=0,len=allels.length;i<len;i++)
                			if (allels[i].attributes)
                				for (var j=0,lenn=allels[i].attributes.length;j<lenn;j++)
                					if (allels[i].attributes[j].specified)
                						if (allels[i].attributes[j].nodeValue == element)
                							elements.push(allels[i]);
            		}
        	}
        	else
        	{
            		elements.push(element);
        	}
	}
    	if (elements.length == 1)
    	{
	        return elements[0];
    	}
    	else
    	{
	        return elements;
    	}
}*/

/*
var link = document.createElement('a');
link.setAttribute('href', 'index.html');
link.appendChild(document.createTextNode('go home'));
document.getElementById('content').appendChild(link);

...devient...

domEl('a', 'go home', [['href', 'index.html']], document.getElementById('content'));

domEl() prend 5 arguments, la plupart optionnels ce qui permet d'avoir plusieurs cas de figure.
Le premier donne le type de l'élément à créer, le second le contenu de cet élément, le troisième ses attributs,
le quatrième indique dans quel(s) élément(s) celui-ci doit être créé, et le dernier précise si l'élément remplace les éléments existants, ou s'ajoute à eux.
*/
/*
var domEl = function(e,c,a,p,x)
{
	if(e||c)
	{
    		c=(typeof c=='string'||(typeof c=='object'&&!c.length))?[c]:c;
    		e=(!e&&c.length==1)?document.createTextNode(c[0]):e;
    		var n = (typeof e=='string')?document.createElement(e) : !(e&&e===c[0])?e.cloneNode(false):e.cloneNode(true);
    		if(e.nodeType!=3)
    		{
        		c[0]===e?c[0]='':'';
        		for(var i=0,j=c.length;i<j;i++)
        			typeof c[i]=='string'? n.appendChild(document.createTextNode(c[i]))  : n.appendChild(c[i].cloneNode(true));
        		if(a)
        		{
        			for(var i=(a.length-1);i>=0;i--)
        				a[i][0]=='class' ? n.className=a[i][1] : n.setAttribute(a[i][0],a[i][1]);
        		}
    		}
	}

    	if(!p)
    		return n;
    	p=(typeof p=='object'&&!p.length)?[p]:p;
    	for(var i=(p.length-1);i>=0;i--)
    	{
        	if(x)
        	{
        		while(p[i].firstChild) p[i].removeChild(p[i].firstChild);
            		if(!e&&!c&&p[i].parentNode) p[i].parentNode.removeChild(p[i]);
            	}
        	if(n)
        		p[i].appendChild(n.cloneNode(true));
    	}
}*/


/* Génère une succesion de caractères aléatoires. Il suffit de donner le nb de caractère, le type (A, N, AN) et dans
le cas de A ou AN préciser la casse (min, maj, minmaj) nb_car,type,casse */

function generer_chaine_aleatoire(nb_car,type,casse)
{
	var cars = new Array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9');
	var cpt = 1;
	var n = 0, b_inf = 0, b_sup = 0;
	var chaine = "";

	if(type == "A")
	{
		if(casse == "maj")
		{
			b_inf	 = 0;
			b_sup = 25;
		}
		else if(casse == "min")
		{
			b_inf	 = 26;
			b_sup = 51;
		}
		if(casse == "minmaj")
		{
			b_inf	 = 0;
			b_sup = 51;
		}
	}
	else if(type == "N")
	{
		b_inf	 = 52;
		b_sup = 61;
	}
	else if(type == "AN")
	{
		if(casse == "min" || casse == "maj")
		{
			b_inf	 = 26;
			b_sup = 61;
		}
		if(casse == "minmaj")
		{
			b_inf	 = 0;
			b_sup = 61;
		}
	}

	while(cpt <= nb_car)
	{
		n = Math.floor(b_inf + Math.random() * (b_sup-b_inf+1)); // entre les bornes incluses

		chaine += cars[n];
		cpt++;
	}
	return chaine;
}

function insertion(input,repdeb, repfin)
{
	input.focus();

	/* pour l'Explorer Internet */
	if(typeof document.selection != 'undefined')
	{
		/* Insertion du code de formatage */
		var range = document.selection.createRange();
		var insText = range.text;
		range.text = repdeb + insText + repfin;
		/* Ajustement de la position du curseur */
		range = document.selection.createRange();
		if (insText.length == 0)
			range.move('character', -repfin.length);
		else
			range.moveStart('character', repdeb.length + insText.length + repfin.length);
		range.select();
	}
	/* pour navigateurs plus récents basés sur Gecko*/
	else if(typeof input.selectionStart != 'undefined')
	{
		/* Insertion du code de formatage */
		var start = input.selectionStart;
		var end = input.selectionEnd;
		var insText = input.value.substring(start, end);
		input.value = input.value.substr(0, start) + repdeb + insText + repfin + input.value.substr(end);
		/* Ajustement de la position du curseur */
		var pos;
		if (insText.length == 0)
			pos = start + repdeb.length;
		else
			pos = start + repdeb.length + insText.length + repfin.length;
		input.selectionStart = pos;
		input.selectionEnd = pos;
	}
	/* pour les autres navigateurs */
	else
	{
		/* requête de la position d'insertion */
		var pos;
		var re = new RegExp('^[0-9]{0,3}$');
		while(!re.test(pos))
			pos = prompt("Insertion à la position (0.." + input.value.length + "):", "0");
		if(pos > input.value.length)
			pos = input.value.length;

		/* Insertion du code de formatage */
		var insText = prompt("Veuillez entrer le texte à formater:");
		input.value = input.value.substr(0, pos) + repdeb + insText + repfin + input.value.substr(pos);
	}
}


function get_liste_objets_coches(obj_chk)
{
	var s = '';

	if(obj_chk.length)
	{
			for(var i=0;i<obj_chk.length;i++)
			{
				if(obj_chk[i].checked)
					s += obj_chk[i].value+',';
			}
	}
	else
	{
		if(obj_chk.checked)
			s += obj_chk.value;
	}

	return s;
}


/* Le journal du net: permet de récupérer un chemin vers un élément de la page sans se soucier du navigateur. */
function recupereChemin(id)
{
	/* Variables à mettre en global pour éviter de tester à chaque appel de cette fonction */
	var nn4 = (document.layers) ? true : false
	var ie5 = (document.all) ? true : false
	var dom = (document.getElementById && !document.all) ? true : false

  	if (nn4)
  	{
	  	chemin = document.layers[id];
  	}
  	else if (ie5)
  	{
	  	chemin = document.all[id];
  	}
  	else
  	{
	  	chemin = document.getElementById(id);
  	}
  	return chemin;
}

function get_descript_status_http(status)
{
	if(status == 100) return "Continue";
	if(status == 101) return "Switching protocols";
	if(status == 200) return "OK";
	if(status == 201) return "Created";
	if(status == 202) return "Accepted";
	if(status == 203) return "Non-Authoritative Information";
	if(status == 204) return "No Content";
	if(status == 205) return "Reset Content";
	if(status == 206) return "Partial Content";
	if(status == 300) return "Multiple Choices";
	if(status == 301) return "Moved Permanently";
	if(status == 302) return "Found";
	if(status == 303) return "See Other";
	if(status == 304) return "Not Modified";
	if(status == 305) return "Use Proxy";
	if(status == 307) return "Temporary Redirect";
	if(status == 400) return "Bad Request";
	if(status == 401) return "Unauthorized";
	if(status == 402) return "Payment Required";
	if(status == 403) return "Forbidden";
	if(status == 404) return "Not Found";
	if(status == 405) return "Method Not Allowed";
	if(status == 406) return "Not Acceptable";
	if(status == 407) return "Proxy Authentication Required";
	if(status == 408) return "Request Timeout";
	if(status == 409) return "Conflict";
	if(status == 410) return "Gone";
	if(status == 411) return "Length Required";
	if(status == 412) return "Precondition Failed";
	if(status == 413) return "Request Entity Too Large";
	if(status == 414) return "Request-URI Too Long";
	if(status == 415) return "Unsupported Media Type";
	if(status == 416) return "Requested Range Not Suitable";
	if(status == 417) return "Expectation Failed";
	if(status == 500) return "Internal Server Error";
	if(status == 501) return "Not Implemented";
	if(status == 502) return "Bad Gateway";
	if(status == 503) return "Service Unavailable";
	if(status == 504) return "Gateway Timeout";
	if(status == 505) return "HTTP Version Not Supported";

	return "";
}
