//  Marignan version 2008-05-15


	// Envoi un message décrivant la table
	function print_r(table)
	{
		var i, chaine="";
		for(i in table)
			chaine = chaine + "\n" + i + "     " + table[i];
		alert(chaine);
	}
	
	// Test si une valeur est dans une liste
	function estDans(valeur, liste)
	{
		var i, elem;
		for(i in liste)
		{
			elem = liste[i];
			if(valeur == elem)
				return true;
		}
		
		return false;
	}
	
	
	
function positionneCadre(){
	if(cadreListe){
	 cadreListe.style.left = calculPosGauche(champ) + "px";
	 cadreListe.style.top = calculPosHaut(champ) + champ.offsetHeight - 1 + "px";
	 cadreListe.style.width = calculLargeur() + "px"
	}
}


// calcule la position absolue gauche
function calculPosGauche(r){
	return calculPos(r,"offsetLeft")
}

// calcule la position absolue haut
function calculPosHaut(r){
	return calculPos(r,"offsetTop")
}

// Calcul de la position 'haut' absolue
function posHaut(objet){
	var cumul = 0;
	while(objet){
	 cumul += objet["offsetTop"];		// cumul des positions
	 objet = objet.offsetParent;		// boucle sur l'élément parent
	}
	return cumul
}

// Calcul de la position 'gauche' absolue
function posGauche(objet){
	var cumul = 0;
	while(objet){
	 cumul += objet["offsetLeft"];		// cumul des positions
	 objet = objet.offsetParent;		// boucle sur l'élément parent
	}
	return cumul
}

	
	
	
	
	// Supprime l'élément de table d'indice ind 
	function array_suppr(ind, table)
	{
		var t1 = table.slice(0, ind);
		var t2 = table.slice(ind+1);
		return t1.concat(t2);
	}



	// Retourne l'indice de l'élément de la table égal à val
	function array_search(val, table)
	{
		for(var i=0; i<table.length; i++)
		{
			if(table[i] == val)
				return i;
		}
		return false
	}
	

	function $id(id)
	{
		return document.getElementById(id);
	}
	
	

// Elimine les doublons d'une liste triée
function array_unique(liste){
	var imax = liste.length;
	var liste1 = new Array();

	for(i=0; i<imax; i++)
		liste1.push(liste[i])	
		
	var i=1;
	while(i<imax){
		if(liste1[i]==liste1[i-1])
		{
			liste1 = array_suppr(i, liste1);
			imax--;
		}
		else
			i++;
	}
	return liste1;
}



// Pose d'une liste d'options relatives � une balise html 'select' � partir d'une liste
//	id_balise_select :	id de la balise input. Ex : 'departement'
//	liste_vals :		liste des valeurs associ�es aux libell�s du menu d�roulant. Ex : array(01, 02, 03, ...)
//							Toutes valeurs num�riques ou litt�rales accept�es sauf 0 et "" (chaine vide)
//	liste_libels :		liste des libell�s apparaissant dans le menu déroulant. Ex : array('Ain', '', '', ...) 
//	val_select :		valeur apparaissant dans le contr�le avant toute action sur celui-ci (pr�selection). Ex : 02
//	libel_defaut :		lib�lle par d�faut, correspondant � la valeur 0 ou "". Ex : 'Choisissez un d�partement'
function cree_options(id_balise_select, liste_vals, liste_libels, val_select, libel_defaut)
	{
	var i, val, option, texte, balise_select, balises_option, libel;
	//var nb = document.getElementById('select_id').value;
	balise_select = document.getElementById(id_balise_select);
	//IE6 = /MSIE[ ]*[^78 ]/.test(navigator.userAgent);

	// Ajout A
	//if(id_balise_select != "dept" || nb == 0 || !IE6)
	//{
	//	document.getElementById('select_id').value= 1;
		//
	
		// Suppression des options d�j�pr�sentes
		balises_option = balise_select.getElementsByTagName("option");
		while(balises_option.length>0)
			balise_select.removeChild(balises_option[0]);
	
		// Cr�ation des nouvelles options
		for(i=0; i<liste_vals.length; i++){
			val = liste_vals[i];
			option = document.createElement("option");
			option.setAttribute("value", val );
			if(val == val_select){
				option.setAttribute("selected", "selected");
			}
			if(liste_libels==null)
				libel=val;
			else
				libel = liste_libels[val];
			if(val==0)
				libel = libel_defaut;
			texte = document.createTextNode(libel);
			option.appendChild(texte);
			balise_select.appendChild(option)
		}
	//}
}




// Temporisation (duree en ms)
function tempo(duree){
	var date = new Date();
    var depart = date.getTime();
	var actuel = depart;
    while(depart+duree > actuel)
	{ 
		date = new Date();
		actuel = date.getTime();
	}	
    return;
}


	// Retourne la liste des élements ayant une classe donnée
	//		classe :	la classe en question
	//		noeudParent :	par défaut, c'est 'document'
	//		balise :	éventuellement, restriction de la réponse à cette famille de balises
	function getElementsByClass( classe, noeudParent, balise) {
		if (noeudParent == null) noeudParent = document;
		if (balise == null) balise = '*';
		var el = new Array();
		var tags = noeudParent.getElementsByTagName(balise);
		var tcl = " "+classe+" ";
		for(i=0,j=0; i<tags.length; i++) {
			var test = " " + tags[i].className + " ";
			if (test.indexOf(tcl) != -1)
				el[j++] = tags[i];
		}
		return el;
	}
	
	// Retourne les balises-enfant de l'objet
	function enfants(objet)
	{
		var i, item, enfants
		enfants = new Array();
		items = objet.childNodes;
		for(i=0; i<items.length; i++)
		{
			item = items[i];
			if(item.nodeType==1)
				enfants.push(item);
		}
		return enfants;		
	}
	
	
	// Returne le chemin d'un fichier sous la forme d'une table de chaînes : rep, nom, ext
	function elements_chemin(chaine_fichier)
	{
		var loc = new Array();
		var p1 = chaine_fichier.lastIndexOf("/");
		if(p1==-1)
			 p1 = chaine_fichier.lastIndexOf("\\");
		var p2 = chaine_fichier.lastIndexOf(".");
		var rep = chaine_fichier.substr(0, p1);
		var nom = chaine_fichier.substr(p1+1, p2-p1-1);
		var ext =  chaine_fichier.substr(p2+1);
		loc['rep'] = rep;
		loc['nom'] = nom;
		loc['ext'] = ext;
		return loc;
	}
	
	
	
	
	
	
//-----------------------------------  VALIDATION DE SAISIES -----------------------------------------


/* Valide les champs d'un formulaire qui ont été déclarés avec les noms de classe suivants :
		"ident", "passe", "nom", "courriel", "tel"
	IdFormulaire :	L'id du formulaire à valider
	ListeOblig : 	Liste des noms des champs considérés comme obligatoires. Exemple : array("Nom", "Téléphone").
	Retourne vrai si tous les champs sont valides.
	Si un ou plusieurs des champs sont invalides, affiche un message d'erreur et retourne faux.
	
*/
	function valider_saisies(IdFormulaire, ListeOblig, Message){
		var Formulaire, NbrChamps, NbrOblig, Champ, Classe, NomChamp, NomGroupe, Texte, groupes_radio, i, j;
		var Valide = true;
		
		Formulaire = document.getElementById(IdFormulaire);
		Champs = Formulaire.elements;
		//Champs = Formulaire.getElementsByTagName('input');
		NbrChamps = Champs.length;
		NbrOblig = ListeOblig.length;
		groupes_radio = new Array();
		
		// Pour chacun des champs du formulaire
		for (i=0; i<NbrChamps; i++){
			Champ = Champs[i];

			switch(Champ.type)
			{
				case "text":
				case "textarea":
				case "password":
					Classe = Champ.className;
					NomChamp = Champ.name;
					Texte = Champ.value;
					Oblig = false;
					// Ce champ est-il dans la liste des champs obligatoires ?
					for (j=0; j<NbrOblig; j++){
						if (ListeOblig[j]==NomChamp)
						{
							Oblig = true;
							break;
						}
					}
					// Faire la validation correspondant au type de champ
					switch (Classe)
					{
						//	(attention � l'op�rateur && : Mettre en premier l'�ventuel terme ��valuer obligatoirement)
						case "ident" :
							Valide = IdentValide(Champ, Message, Oblig) && Valide;
							break;
						case "passe" :
							Passe = Texte;
							Valide = PasseValide(Champ, Message, Oblig) && Valide; 
							break;
						case "passe_conf":
							Valide = PasseConfValide(Champ, Message, Oblig) && Valide; 
							break;
						case "nom" :
							Valide = NomValide(Champ, Message, Oblig) && Valide; 
							break;
						case "courriel" :
							Valide = CourrielValide(Champ, Message, Oblig) && Valide; 
							break;
						case "tel" : 
							Valide = TelValide(Champ, Message, Oblig) && Valide; 
							break;
						default:
							Message[Champ.name] = "";
							Valide = !ChampManquant(Champ, Message, Oblig) && Valide;
							break;

				break;
					}
					break;
					
				case "radio":
					groupes_radio[Champ.name] = groupes_radio[Champ.name] || Champ.checked;
					break;
				
				case "textarea":
					break;
					
				case "select-one":
					Message[Champ.name] = "";
					if(!Champ.selectedIndex){
						Message[Champ.name] = "Veuillez faire un choix";
						Valide = false;
					}
					break
					
				default:
					continue;
			}
		}
		
		for(NomGroupe in groupes_radio){
			Message[NomGroupe] = "";
			// Ce groupe est-il dans la liste des champs obligatoires ?
			Oblig = false;
			for (j=0; j<NbrOblig; j++){
				if (ListeOblig[j]==NomGroupe)
				{
					Oblig = true; 
					break;
				}
			}
			Val = groupes_radio[NomGroupe];
			if (Oblig && !Val){
				Message[NomGroupe] = "Veuillez cocher une case.";
				Valide = false;
			}
		}				
		
			
		return Valide;
		                  
	}


/* Validation d'un pseudo, ou nom d'utilisateur.
	Retourne vrai si valide.
	Si invalide ou manquant, ajoute une ligne de message et retourne faux.
	Etiqu :		Nom du champ du formulaire
	Valeur :		Contenu du champ
	Message : 	Liste des messages retournés
	Oblig :		Booléen indiquant si le champ doit tre rempli.
*/
	function IdentValide(Champ, Message, Oblig){
		Message[Champ.name] = "";
		if (ChampManquant(Champ, Message, Oblig)) {return false;}

		//Seuls sont acceptés les lettres et les chiffres
		var PasLettre = /[\x00-\x40\x5B-\x60\x7B-\xBF]/;
		var QueLettres = /^[\x41-\x5A\x61-\x7A]+$/;
		var QueLettresEtChiffres = /^[\x30-\x39\x41-\x5A\x61-\x7A]+$/;
		var QueLettresEtAccents = /^[\x41-\x5A\x61-\x7A\xC0-\xFF]+$/;
		var QueLettresEtAccentsEtChiffres = /^[\x30-\x39\x41-\x5A\x61-\x7A\xC0-\xFF]+$/;
		//var QueLettresOuChiffres = /^([\x41-\x5A\x61-\x7A\xC0-\xFF]|\d)+$/;        
		var LettresPuisLettresChiffres = /^[\x41-\x5A\x61-\x7A\xC0-\xFF]([\x30-\x39\x41-\x5A\x61-\x7A\xC0-\xFF]|\d)*$/;        
		if (!LettresPuisLettresChiffres.test(Champ.value)){
			Message[Champ.name] = "Seuls sont accept&eacute;s les lettres et chiffres. Le premier caract&egrave;re doit &ecirc;tre une lettre.";
			return false;
		}
		return true;
	}
	
	
	
/* Validation d'un mot de passe.
	Retourne vrai si valide.
	Si invalide ou manquant, ajoute une ligne de message et retourne faux.
	NomChamp :		Nom du champ du formulaire
	Texte :	Contenu du champ
	Message : 	Liste des messages retournés
	Oblig :		Booléen indiquant si le champ doit être rempli.
*/
	function PasseValide(Champ, Message, Oblig){
		var Test;
		
		NomChamp = Champ.name;
		Texte = Champ.value;
		
		Message[Champ.name] = "";
		if (ChampManquant(Champ, Message, Oblig)) {return false;}
								
		//Seuls sont acceptés les lettres non accentuées et les chiffres
		Test = Texte.search(/^[a-zA-Z0-9]*$/);
		if (Test == -1){
			Message[NomChamp] = "Seuls sont accept&eacute;s les lettres non accentu&eacute;es et les chiffres.";
			return false;
		}
		
		Longueur = Texte.length;
		if (Longueur <4 || Longueur >12) {
			Message[NomChamp] = "Le mot de passe doit comporter entre 4 et 12 caract&egrave;res.";
			return false;
		}
		
		return true;		
	}	
	
	
	
	function PasseConfValide(Champ, Message, Oblig){
		Message[Champ.name] = "";
		if (ChampManquant(Champ, Message, Oblig)) {return false;}
		
		if(Champ.value != Passe){
			Message[Champ.name] = "La confirmation ne correspond pas au mot de passe.";
			return false;
		}
		
		return true;	
	}
	
	
	
	
/* Validation d'un nom.
	Retourne vrai si valide.
	Si invalide ou manquant, ajoute une ligne de message et retourne faux.
	NomChamp :		Nom du champ du formulaire
	Texte :		Contenu du champ
	Message : 	Liste des messages retournés
	Oblig :		Booléen indiquant si le champ doit tre rempli.
*/
	function NomValide(Champ, Message, Oblig){
		var Test;
		
		NomChamp = Champ.name;
		Texte = Champ.value;
		
		Message[Champ.name] = "";
		if (ChampManquant(Champ, Message, Oblig)) {return false;}
								
		//Les seuls symboles autorisés dans le champ 'Nom' sont : espace, apostrophe, point et trait d'union.
			Test = Texte.search(/[\x00-\x19\x21-\x26\x28-\x2C\x2F-\x40\x5B-\x60\x7B-\xBF]/)!=-1;
			if(Test){
				Message[NomChamp] = "Les seuls symboles autoris&eacute;s sont : espace, apostrophe, trait d'union et point.";
				return false;
			}
				
		//Le champ 'Nom' doit commencer par une lettre.
			Test = Texte.charAt(0).search(/[\'\.\-]/)!=-1;
			if(Test){
				Message[NomChamp] = "Ce champ doit commencer par une lettre.";
				return false;
			}
				
			return true;
	}



/* Validation d'un numro de tlphone.
	Retourne vrai si valide.
	Si invalide ou manquant, ajoute une ligne de message et retourne faux.
	NomChamp :		Nom du champ du formulaire
	Texte :		Contenu du champ
	Message : 	Liste des messages retourns
	Oblig :		Boolen indiquant si le champ doit tre rempli.
*/
	function TelValide(Champ, Message, Oblig){
		var Test, Res;

		Texte = Champ.value;
		
		Message[Champ.name] = "";
		if (ChampManquant(Champ, Message, Oblig)) {return false;}
								
		//Seuls sont accepts le signe + (en tte), les parenthses et l'espace simple (hors parenthses).	
			Test = Texte.search(/^\+?( ?(\(\d+\)|\d+))+$/)==-1;
			if(Test){
				Message['tel'] = "Seuls sont accept&eacute;s le signe + (en t&ecirc;te), les parenth&egrave;ses et l'espace simple (hors parenth&egrave;ses).";
				return false;
			}
		//Les numro nationaux ont 10 chiffres, les internationaux commencent par +
			Res = Texte.match(/\d/g);
			Test = Res.length!=10 && Texte.charAt(0)!="+";
			if (Test){
				Message[Champ.name] = "Les num&eacute;ro nationaux ont 10 chiffres, les internationaux commencent par +";
				return false;
			}
			
		return true;
	}
	
	
	
	
/* Validation d'une adresse lectronique (courriel).
	Retourne vrai si valide.
	Si invalide ou manquant, ajoute une ligne de message et retourne faux.
	NomChamp :		Nom du champ du formulaire
	Texte :		Contenu du champ
	Message : 	Liste des messages retourns
	Oblig :		Boolen indiquant si le champ doit tre rempli.
*/
	function CourrielValide(Champ, Message, Oblig){
		var Test;
		
		Message[Champ.name] = "";
		if (ChampManquant(Champ, Message, Oblig)) {return false;}
								
		// Structure : Lettres ou chiffres ou _ ou - ou ., puis @, puis idem, puis ., puis lettres ou chiffres.	
		Test = Champ.value.search(/^[\w][\w\.-]*@[\w\.-]+\.[\w]+$/i )==-1; 
			if(Test){
				Message[Champ.name] = "Ceci n'est pas une adresse &eacute;lectronique.";
				return false;
			}
		return true;
	}



	function ChampManquant(Champ, Message, Oblig){
		/* Indique si le champ n'a pas été rempli alors qu'il est obligatoire.
			Si c'est le cas, ajoute une ligne de message et retourne vrai. 
			Sinon retourne faux.
		*/
		if (Oblig && Champ.value ==""){
			Message[Champ.name] = "Veuillez remplir ce champ.";
			return true;
		}		
		
		return false;
	}
	

	

//-----------------------------------  SQUELETTES -----------------------------------------


	// Evenement sur une élement
	// Exemple : appui et lâcher sur une touche du clavier
	
/*	<div onkeydown="appuie(event)" onkeyup="relache(event)">

	// Sur l'appui d'une touche
	function appuie(e)
	{
		var t = (window.Event)? e.keyCode : e.which ;
		if(t == 17) 
			touche = "ctrl";
		if(t == 16)
			touche = "maj";
	}
	
	
	// Sur le lâcher d'une touche
	function relache(e)
	{
		touche = "";
	}
*/	
