//var urlDeDeveloppement = "/projets/NATALIE%20M/CC%2099XXXX%20-%20Site%20Internet/Developpement/";
//var urlDeDeveloppement = "/maquette/";

// recup le nom de la page HTML ou PHP
// dans une URL
function nomPage(URL)
{
	var position_debut;
	var position_fin;
	var page;
	
	if (URL.lastIndexOf("\\")>-1)
		position_debut=URL.lastIndexOf("\\");
	else if (URL.lastIndexOf("/")>-1)
		position_debut=URL.lastIndexOf("/");
	if (URL.lastIndexOf("?")>-1)
		position_fin=URL.lastIndexOf("?");		
	else
		position_fin=URL.length;		
	page = URL.substring(position_debut+1,position_fin);
	return page;
}
//Detection du navigateur 
/* renvoi un objet qui contient comme propriété les noms des navigateurs (ie6, ns4...).
* Chaque propriété est positionnée à VRAI ou FAUX en fonctions du navigateur.
* version 1.2 - 05/01/2006 (prise en compte de IE 7)
*/
function NavCheck()
{ 
	this.ver=navigator.appVersion;
	this.agent=navigator.userAgent;
	this.dom=document.getElementById?1:0;
	this.opera5=(navigator.userAgent.indexOf("Opera")>-1 && document.getElementById)?1:0;
	this.opera=(navigator.userAgent.indexOf("Opera")>-1 && document.getElementById)?1:0;
	this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom && !this.opera5)?1:0; 
	this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom && !this.opera5)?1:0;
	this.ie7=(this.ver.indexOf("MSIE 7")>-1 && this.dom && !this.opera5)?1:0;
	this.ie4=(document.all && !this.dom && !this.opera5)?1:0;
	this.ie=this.ie4||this.ie5||this.ie6||this.ie7;
	this.mac=this.agent.indexOf("Mac")>-1;
	this.ns6=(this.dom && parseInt(this.ver) >= 5)?1:0; 
	this.ns4=(document.layers && !this.dom)?1:0;
	this.firefox=(this.dom && parseInt(this.ver) >= 5 && this.agent.indexOf("Firefox")>-1) ?1:0;
	this.gecko=(!this.firefox && this.dom && parseInt(this.ver) >= 5 && this.agent.indexOf("Gecko")>-1) ?1:0;
	this.NC=(this.ie7 || this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.opera5 || this.firefox || this.gecko);
	return this;
}
// Fonction pour déplacer un calque en fonction d'un pas donné
// v 0.5
function moveCalque(calque, pas, depart, destination)
{	
	// Définition du Navigateur Client
	Navigateur = NavCheck();	
	// Netscape 4
	if(Navigateur.ns4)
		calqueToMove = window.document.layers[calque];
	// Internet Explorer
	else if(Navigateur.ie)
		calqueToMove = window.document.all[calque];
	// W3C - Navigateur compatible DOM
	else if(Navigateur.dom)
		calqueToMove = 	window.document.getElementById(calque);
	
	// Initialisation du point de départ	
	if (calqueToMove.style.left == "")
		calqueToMove.style.left = depart;
	
	// Transofrmation de la position en numérique
	var posX = calqueToMove.style.left.split("px");
	var positionCalque = posX[0] * 1;
	
	// Test la position du calque 
	if ((positionCalque) < destination)
	{
		// Déplacement de calque
		calqueToMove.style.left = (positionCalque) + pas;		
	}
	else
	{
		// Arrêt de la minuterie
		window.clearInterval(moveInterval);
	}
}
// Fonctions pour deplacer un objet Horizontalement, comme la voiture dans VRM. (v 0.5)
function timerMove(calque, pas, depart, destination, interval)
{	
	moveInterval = setInterval ('moveCalque(\'' + calque + '\', '+pas+', '+depart+', '+destination+')', interval);
}
// Fonctions pour afficher les menus DHTML en fonction d'un objet HTML donné
// v 0.3
function affichMenu(objetReference, calqueMenu, decalageX, decalageY, decalageOutX, decalageOutY)
{
	// Compatibilité Menu AST du bas
	if (!decalageOutX)
		decalageOutX = (-85);
	if (!decalageOutY)
		decalageOutY = (-160);
	
	// Definition des objets calques
	var calqueMenuOut = calqueMenu + "Out";
	objet = window.document.getElementById(objetReference);
	var menu = window.document.all[calqueMenu];
	var menuOut = window.document.all[calqueMenuOut];	
	
	// Gestion des arguments optionnels
	if (!decalageX)
		decalageX = 0;
	if (!decalageY)
		decalageY = 0;
	// Recupération des coordonnées
	var posX = findPosX(objet);
	var posY = findPosY(objet);
	
	// Gestion des décalage optionnels
	decalageX = (decalageX*1); // Force un type INTEGER
	decalageY = (decalageY*1); // Force un type INTEGER
	var newPosX = posX + (decalageX);
	var newPosY = posY + (decalageY);
	
	// Positionnement du menu réel
	var coordonneesX = newPosX + "px";
	var coordonneesY = newPosY + "px";
	menu.style.left = coordonneesX;
	menu.style.top = coordonneesY;
	
	// Positionnement du menu de détection de sortie
	posOut_X = newPosX + (decalageOutX);
	posOut_Y = newPosY + (decalageOutY);
	menuOut.style.left = posOut_X + "px";
	menuOut.style.top = posOut_Y + "px";
	
	// Affichage du claque
	menu.style.visibility = "visible";
	menuOut.style.visibility = "visible";
}

function cacheMenu(arrayMenus)
{
	if (!arrayMenus)
		var menus = new Array('calcCID', 'calcCIDOut');
	else
		var menus = arrayMenus;
	for (bclMenu = 0; bclMenu < menus.length; bclMenu++)
	{
		calqueMenu = menus[bclMenu];
		window.document.all[calqueMenu].style.visibility = "hidden";
	}
}

// Pour connaitre la position horizontale d'un objet obj
function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}
// Pour connaitre la position verticale d'un objet obj
function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

// Fonction pour verifier si X champs d'un formulaire ont été rempli
function nbChampForm(formulaire,nbAremplir,msgErreur)
{
	var nbValider=0;
	for (var numChamp = 0; numChamp<formulaire.elements.length-2; numChamp++)
	{
		if (formulaire.elements[numChamp].value != "" && formulaire.elements[numChamp].value != "#")
			nbValider = nbValider+1;
	}
	if (nbValider < nbAremplir)
		alert(msgErreur);
	else
		formulaire.submit();	
}

/* Fonctions qui vérifie si les formulaires sont remplis -------------------------------------------------------------------------------------------------------
 Version : 2.3.0 (14/03/2008)
 
 Necessite les fonctions colorErreur(), colorNormal() et verifNumTel().
 @PARAM object formulaire le chemin complet du formulaire a tester : window.document.nomFormulaire
 @PARAM [facultatif] array arrayChToTest un tableau contenant les noms des champs à tester sous de chaine. Ex : ch_Nom
 		Si array "arrayToTest" n'existe pas, tous les champs du formulaire "formulaire" sont testé.
 @PARAM [facultatif] boolean getReturn TRUE pour que la fonction renvoie VRAI ou FAUX. FALSE pour que le formulaire soit posté si tout est bon.
 @PARAM [facultatif] string lang La langue dans laquelle on affiche les messages divers. Mettre fr  ou en uniquement
 @RETURN void (sauf si le param getReturn = TRUE)
 
 - Version 2.3.0 :
 		* Ajout de la vérification automatique des champs qui doivent contenir un nombre.
		  Pour cela il suffit de placer le mot vfInt dans l'attribut class du champs à tester
		  ex : <input type="text" name="ch_Tarif" class="chNormal vfInt"/>
 - Version 2.2.3 :
		* Utilisation de la fonction alerte pour les messages d'erreurs en lieu et place de alert
 - Version 2.2.2 :
 		* Correction BUG sur Test de tous les champs du formulaire (formulaire.elements.disabled est undiefined sous FireFox)
 - Version 2.2.1 :
 		* Prise en charge des champs TinyMCE (Attention l'objet TinyMCE doit s'appeler "tinyMCE") et
 		  les champs doivent avoir un ID identique au Name (ex : <input type="text" name="area_Description" id="area_Description") 
	
 - version 2.1.0 :
 		* Possibilité d'appeler une fontion personnalisée pour traiter le message d'erreur en parametre (par défaut alert)
		* Détection automatique de la largeur des cahmps texte pour afficher ??? ou non renseigné.
 - version 2.0.2 : 
 		* Toutes les erreurs sont affichées à la fin du traitment.
		* Traitement des champs dates (necessite fonction verifDate).
		* Traitement des champs cours, on l'on affiche pas "Non renseigné" mais "???"
		* Tous les champs commençant par ch_Tel et ch_Fax sont traiter comme des numéros de tél (ex : ch_TelPortable)
 - version 1.99 : ajout de la vérification des champs ch_Tel et ch_Fax (necessite fonction verifNumTel).
 - version 1.8.1 : correction bug - regle regXp mauvaise, renvoiyait toujours null
 - version 1.80 : si getReturn = true, on ne poste plus le formulaire, on renvoie seulement true.
*/
function verifFormulaire(formulaire, arrayChToTest, getReturn, lang, funcErreur)
{
	if (!getReturn)
		getReturn = false;
	if (!lang)
		lang = "fr";
	if(!funcErreur)
		funcErreur = alerte;
		
	var box = new Array();
	if(arrayChToTest) // seulemnt les champs du tableau arrayChToTest sont à tester
	{
		for(bclChToTest=0; bclChToTest < arrayChToTest.length; bclChToTest++)
		{
			// Reconstruction des objets à partir des string passer dans le tableau
			if (eval("window.document."+formulaire.name+"."+arrayChToTest[bclChToTest]).disabled == false)			
				box[bclChToTest] = eval("window.document."+formulaire.name+"."+arrayChToTest[bclChToTest]);
		}
	}
	else // Tous les champs seront testés
	{
		if (!formulaire.elements.disabled || formulaire.elements.disabled == false)
			box = formulaire.elements;
	}

	formErreur = false;
	var msgErreur = new Array();
	regXpMail = new RegExp("mail", "i"); // Correspond à /^.*mail.*$/ insensible à la casse
	
	// Définition des Messages d'erreur --------------------------------------------------------------------------------------------------
	var arrayMsg = new Array();
	arrayMsg["fr"] = new Array();
	arrayMsg["en"] = new Array();
	
	// Français
	arrayMsg["fr"]["vide"] = "Non renseigné !";
	arrayMsg["fr"]["pwd"] = "les mot de passe ne sont pas identiques !";
	arrayMsg["fr"]["email"] = "Email incorrect !";
	arrayMsg["fr"]["date"] = "Date incorrecte !";
	arrayMsg["fr"]["tel"] = "Numéro incorrect !";
	arrayMsg["fr"]["msgFin"] = "Vérifiez que tous les champs obligatoires sont bien remplis...";
	arrayMsg["fr"]["msgEmail"] = "Email incorrect. Utiliser la forme adresse@domaine.tld";
	arrayMsg["fr"]["msgTel"] = "Numéro incorrect. Utiliser la forme 01 02 03 04 05";
	arrayMsg["fr"]["msgDate"] = "Date incorrecte. Utiliser le format jj/mm/aaaa";
	arrayMsg["fr"]["msgNombre"] = "Nombre incorrect. Utiliser uniquement des chiffres, le point ou la virgule.";
	// Anglais
	arrayMsg["en"]["vide"] = "Empty !";
	arrayMsg["en"]["pwd"] = "Password do not match !";
	arrayMsg["en"]["email"] = "Bad email adress !";
	arrayMsg["en"]["date"] = "Incorrect Date !";
	arrayMsg["en"]["tel"] = "Incorrect number !";
	arrayMsg["en"]["msgFin"] = "Please check all fields...";
	arrayMsg["en"]["msgEmail"] = "Bad email address. Email must look like adresse@domaine.tld";
	arrayMsg["en"]["msgTel"] = "Incorrect phone number. Allowed numbers looks like +33 1 02 03 04 05";
	arrayMsg["en"]["msgDate"] = "Incorrect date. Use this format please : dd/mm/yyyy";
	arrayMsg["en"]["msgNombre"] = "Incorrect number. Use only digits, dot and comma.";
	
	// FIN Définition des Messages d'erreur --------------------------------------------------------------------------------------------------
	
	for (bclChamps=0; bclChamps < box.length; bclChamps++)
	{
		// Reinitialisation de l'aspect du champs
		if (box[bclChamps].type != "checkbox") // Pour ne pas prendre en compte les checkbox
			colorNormal(box[bclChamps]);
		
		// Test des champs TinyMCE		
		if(typeof(tinyMCE) == "object" && tinyMCE.getInstanceById(box[bclChamps].id))
		{
			// Creation de l'instance TinyMCE
			tinyMceInstance = tinyMCE.getInstanceById(box[bclChamps].id);
			
			// Recupération de contenu
			var tinyContenu = tinyMceInstance.getHTML();
			
			// On remet la couleur normal
			colorNormal(tinyMceInstance.getWin().document.body);
			// On supprime les balises avec un background
			tinyMceInstance.setHTML(tinyContenu.replace(/<font style="background-color:.*">(.*)<\/font>/, "$1"));
			
			
			// S'il s'agit d'un champs tinyMCE, on vérifie si le contenu est vide			
			if (tinyContenu == "" || tinyContenu.replace(/&eacute;/, 'é') == arrayMsg[lang]["vide"] || tinyContenu == "???")
			{
				colorErreur(tinyMceInstance.getWin().document.body);
				tinyMceInstance.setHTML(arrayMsg[lang]["vide"]);
				
				// Pour éviter d'avoir plusieurs fois le message "Vérifier que tout est rempli".
				if(formErreur == false)
					msgErreur.push(arrayMsg[lang]["msgFin"]);
				formErreur = true;
			}
			
		}
		// Test des champs textes		
		else if (box[bclChamps].value == "" || box[bclChamps].value == arrayMsg[lang]["vide"] || box[bclChamps].value == "???") // si le champs est vide
		{
			colorErreur(box[bclChamps]);
			if (box[bclChamps].type != "password" && box[bclChamps].type != "select-one")
			{
				tailleChamps = getStyleCss(box[bclChamps], 'width');
				// On test la largeur du champs (! doit être défini avec un style sur le champs lui même)
				if (tailleChamps)
				{
					tailleChamps = (tailleChamps.replace('px','')) * 1;
					if (tailleChamps < 80)
						box[bclChamps].value = '???';
					else
						box[bclChamps].value = arrayMsg[lang]["vide"];
				}
				else
					box[bclChamps].value = arrayMsg[lang]["vide"];
			}
			// Pour éviter d'avoir plusieurs fois le message "Vérifier que tout est rempli".
			if(formErreur == false)
				msgErreur.push(arrayMsg[lang]["msgFin"]);
			formErreur = true;
		}
		// Pour tester les mot de passe, attention le champs de confirmation de mot de passe
		// doit être placé juste derriere le 1er champs du mot de passe. (pas d'element de formulaire
		// entre les deux !!!)
		else if (box[bclChamps].type == "password") // si le champs est le mot de passe
		{
			if (box[bclChamps+1] && box[bclChamps+1].type == "password")
			{
				if (box[bclChamps].value != box[bclChamps+1].value)
				{
					colorErreur(box[bclChamps]);
					colorErreur(box[bclChamps+1]);
					msgErreur.push (arrayMsg[lang]["pwd"]);
					formErreur = true;
				}
			}
		}
		// si le nom du champs contient le mot mail
		else if (box[bclChamps].name.match(regXpMail))
		{
			result = box[bclChamps].value.match(/^[a-zA-Z0-9\-\_\.]*@[a-zA-Z0-9\-\_\.]*\.[a-zA-Z]{2,4}$/);
			if (result == null)
			{
				colorErreur(box[bclChamps]);
				box[bclChamps].value = arrayMsg[lang]["email"];
				msgErreur.push(arrayMsg[lang]["msgEmail"]);
				formErreur = true;
			}				
		}		
		// test des champs de telephone  et Fax
		else if (box[bclChamps].name.match(/^ch\_Tel.*$/) || box[bclChamps].name.match(/^ch\_Fax.*$/))
		{
			if (verifNumTel(box[bclChamps].value) == false || box[bclChamps].value == arrayMsg[lang]["tel"])
			{
				colorErreur(box[bclChamps]);
				box[bclChamps].value = arrayMsg[lang]["tel"];
				msgErreur.push(arrayMsg[lang]["msgTel"]);
				formErreur = true;
			}
		}
		// Test des champs Date
		else if(box[bclChamps].name.match(/^date\_.*$/))
		{
			if (verifDate(box[bclChamps].value) == false)
			{
				colorErreur(box[bclChamps]);	
				box[bclChamps].value = arrayMsg[lang]["date"];
				msgErreur.push(arrayMsg[lang]["msgDate"]);
				formErreur = true;
			}
		}
		// Test des champs SELECT (valeur par défaut ModeliXe = #)
		else if (box[bclChamps].type == "select-one" && box[bclChamps].value == "#")
		{
			colorErreur(box[bclChamps]);
			
			// Pour éviter d'avoir plusieurs le message "Vérifier que tout est rempli".
			if(formErreur == false)
				msgErreur.push(arrayMsg[lang]["msgFin"]);
			
			formErreur = true;
		}
		// test des champs dont l'attribut class contient vfInt. On vérifie qu'il s'agit bien d'un nombre
		else if(box[bclChamps].className.search(/vfInt/) != -1)
		{
			var verifInt = strToInt(box[bclChamps].value);
			if (verifInt !== false)
			{
				box[bclChamps].value = verifInt;
			}
			else
			{
				colorErreur(box[bclChamps]);
				msgErreur.push(arrayMsg[lang]["msgNombre"]);
				formErreur = true;
			}
		}
	}
	if (formErreur == false)
	{
		if (getReturn == true) 
			return true;
		else
			formulaire.submit();
	}
	else
	{
		if (msgErreur.length == 0)
			msgErreur.push(arrayMsg[lang]["msgFin"]);
		
		if (msgErreur.length > 1)
		{
			var message = "";
			for (bclMsg = 0; bclMsg < msgErreur.length; bclMsg++)
			{
				message += (bclMsg + 1) + ". " + msgErreur[bclMsg] + '\n';
			}
			funcErreur(message);
		}
		else if (msgErreur.length == 1)
			funcErreur(msgErreur[0]);

		if (getReturn == true) return false;
	}
}



// Fonction utiliser par la vérification de formulaire pour mettre en évidence les erreurs (v1.3)
function colorErreur(elementDuForm)
{
	//elementDuForm.style.border = "1px";
	//elementDuForm.style.borderStyle = "solid";
	//elementDuForm.style.borderColor = "#FF0000";
	elementDuForm.style.backgroundColor = "#FFDDDD";
}
function colorNormal(elementDuForm)
{
	elementDuForm.style.backgroundColor = "#FFFFFF";
}

/*
* v 0.1 - N - 07/02/2008
* Fonction pour remplacer la fonction alert javascript
* Elle est compatible avec le alert javascript : si OK element HTML ne porte l'id message
* alors on affiche la boite de dialogue classique.
* @PARAM string message Le message à afficher
* @PARAM int nbSecondes, le temps d'affichage max du message
*/
function alerte(message, nbSecondes)
{
	if (!window.document.getElementById("message"))
	{
		alert(message);
	}
	else
	{
		while (message.match("\n")){
			message= message.replace("\n", '<br/>');
		}
		
		window.document.getElementById("message").innerHTML = message;
		
		if(!nbSecondes)
			var nbSecondes = 4;
			
		window.setTimeout("window.document.getElementById(\"message\").innerHTML = '';", nbSecondes * 1000);
	}		
}

// Fonction pour vérifier les numéros de téléphones, Fax etc....

/**
* Fonction de vérification de numéro de téléphone Français - v 1.1 - 10/03/2006
* Forme de numéros autorisés : 	01 02 03 04 05 ou encore +33 (0)1 02 03 04 05
*								0820 110 111 ou encore +33 (0)820 110 111
*								0102030405
* Les séparateurs peuvent être des espaces, points ou tirets.
* @PARAM string numero le numéro de téléphone à vérifier
* @PARAM boolean verifStricte TRUE pour utiliser uniquement les RegExp, FALSE pour vérifier qu'il y a au moins 10 caractères.
* @RETURN boolean TRUE si numéro correct / sinon FALSE
*/
function verifNumTel(numero, verifStricte)
{
	retour = false;
	var debug = false;
	
	if (!verifStricte)
		verifStricte = false;
		
	
	// Déclaration des expressions régulières
	// Vérification des numéros de téléphone tous attachés (exactement 10 chiffres)
	regXpTel = /^\d{10}$/;
	// Vérif des numéros du type 04 01 02 03 04
	/*		 		 verif +00    |(0)0 ou 00          |		00	|	  00    |	00       |     00     |	*/
	regXpTelPar2 = 		/^(((\+|00\s?)\d{1,2}\s(\W?\d\W?\s?)?)|\d)\d[\s\.\-]\d{2}[\s\.\-]\d{2}[\s\.\-]\d{2}[\s\.\-]\d{2}$/;
	// Vérif des numéros du type 0800 118 119
	/*		 		 verif +00    |(0) ou 0           |	000	  |	  000      |	000						*/
	regXpTelPar3 = 	/^(((\+|00\s?)\d{1,2}\s(\W?\d\W?)?)|\d)\s?\d{3}[\s\.\-]\d{3}[\s\.\-]\d{3}$/;
	
	// Comparaison avec la valeur du champs passé en argument
	var resultat = numero.match(regXpTel);
	var resultat2 = numero.match(regXpTelPar2);
	var resultat3 = numero.match(regXpTelPar3);
	
	if (resultat != null || resultat2 != null || resultat3 != null)
	{
		if (debug == true)
			alert('Numéro correct\nR : ' + resultat + '\nR1 : ' + resultat2 + '\nR2 : ' + resultat3);
		retour = true;
	}
	else if (verifStricte == false)
	{
			// On controle le nombre de chiffres saisis (doit être supérieur à 10)
			var numeroSansEspace = "";
			var arrayNumero = numero.split(" ");
			for (bclNumero = 0; bclNumero < arrayNumero.length; bclNumero++)
				numeroSansEspace += arrayNumero[bclNumero];
			
			if (numeroSansEspace.length >= 10)			
				retour = true;
	}
	else
	{		
		if (debug == true)
			alert('Numéro incorrect !!!');
		retour = false;
	}
	
	return retour;
}

/*
* Fonction pour vérifier le format d'une date doit être au format jj/mm/aaaa.
* et que les chiffres saisis sont corrects
* v 1.2 - 04/07/2007
* v 1.2 : Correction Bug : les slash n'étaient pas echappés dans l'expression rationnelle regXpDate (dans les [-/])
*						   l'interprétation du fichier entier n'était pas réalisée sous Mozilla 1.x !
* v 1.1 : Correction Bug : Le nombre de jour max par mois pour tout les mois entre Aout et Décembre était faux.
*/
function verifDate(strDate)
{
	var retour = false;
	var regXpDate = /^(\d{1,2})[-\/](\d{1,2})[-\/](\d{2}(?:\d{2})?)$/;
	var arrayVerifDate = strDate.match(regXpDate);
	
	// Si le format de date est correct
	if (arrayVerifDate != null)
	{
		var jour = arrayVerifDate[1] * 1; // Multiplié par un pour convertir en integer
		var mois = arrayVerifDate[2] * 1; // Multiplié par un pour convertir en integer
		var annee = arrayVerifDate[3] * 1; // Multiplié par un pour convertir en integer
		var nbJourMaxDansMois = 0;
		
		// On vérifie le nombre de jour max dans le mois
		switch (mois)
		{
			/* Rappel de la règle pour les années bissextiles
			* Les années divisibles par 4 SONT bissextiles, pas les autres.
			* Exception: les années divisibles par 100 NE SONT PAS bissextiles
			* Exception à l'exception: les années divisibles par 400 SONT bissextiles
			*/
			case 2 :
				// On test si l'année est bissextile
				if (annee % 4 == 0 && (annee % 100 != 0 || annee % 400 ==0))
					nbJourMaxDansMois = 29;
				else
					nbJourMaxDansMois = 28;
				break;
			default:
				if (mois < 8)
				{
					if (mois % 2 == 0)
						nbJourMaxDansMois = 30;
					else
						nbJourMaxDansMois = 31;
				}
				else
				{
					if (mois % 2 == 0)
						nbJourMaxDansMois = 31;
					else
						nbJourMaxDansMois = 30;
				}
		}

		
		// on  vérifie que le mois est compris entre 1 et 12
		if (mois >= 1 && mois <= 12)
		{
			// On vérifie que le jour est compris entre 0 et 31
			if (jour >= 1 && jour <= nbJourMaxDansMois)
				retour = true;
		}
	}
	
	return retour;
}

/**
* Fonction pour récuperer le style d'un élément, qu'il soit déclaré dans un balise style ou non
*/
function getStyleCss(element, propriete)
{
	if (element.style[propriete])
	{
		return element.style[propriete];
	}
	else if (element.currentStyle) 
	{
		return element.currentStyle[propriete];
	}
	else if (document.defaultView && document.defaultView.getComputedStyle)
	{
		var style = document.defaultView.getComputedStyle(element, null);
		return style.getPropertyValue(propriete);
	}
	else
	{
		return null;
	}
}

// Fin fonction de vérification de formulaire générique--------------------------------------------------------------------------------------------------------------------


// Fonctions pour le traitement des dates------------------------------------------------
/*
* Fonction pour tester si la date saisie est supèrieure à la date du jour.
* Renvoi true si OK / false + message erreur si pas OK
*/
function checkDateMini(champDate, dateMini, msg)
{
	var date;
	var retour = false;
	if (!msg)
		msg = "La date saisie n'est pas valide, veuillez choisir une date supèrieure au " + dateMini;
		
	var dateChamps = new Date(champDate.value.substring(6,10), champDate.value.substring(3,5)-1, champDate.value.substring(0,2));
	var dateMin = new Date(dateMini.substring(6,10), dateMini.substring(3,5)-1, dateMini.substring(0,2));

	if (dateChamps > dateMin)
	{
		colorNormal(champDate);
		retour = true;
	}
	else
	{
		colorErreur(champDate);
		alert(msg);
	}
	return retour;
}

/*
* Fonction pour tester si la date saisie est inférieure à une date.
* Renvoi true si OK / false + message erreur si pas OK
*/
function checkDateMaxi(champDate, dateMaxi, msg)
{
	var date;
	var retour = false;
	if (!msg)
		msg = "La date saisie n'est pas valide, veuillez choisir une date inférieure au " + dateMaxi;
		
	var dateChamps = new Date(champDate.value.substring(6,10), champDate.value.substring(3,5)-1, champDate.value.substring(0,2));
	var dateMax = new Date(dateMaxi.substring(6,10), dateMaxi.substring(3,5)-1, dateMaxi.substring(0,2));

	if (dateChamps < dateMax)
	{
		colorNormal(champDate);
		retour = true;
	}
	else
	{
		colorErreur(champDate);
		alert(msg);
	}
	return retour;
}

function checkIntervalDate(champDate, dateDebut, dateFin, msg)
{
	var date;
	var retour = false;
	if (!msg)
		msg = "La date saisie n'est pas valide, elle doit être \ncomprise entre le " + dateDebut + " et le " + dateFin;
		
	var dateChamps = new Date(champDate.value.substring(6,10), champDate.value.substring(3,5)-1, champDate.value.substring(0,2));
	var dateD = new Date(dateDebut.substring(6,10), dateDebut.substring(3,5)-1, dateDebut.substring(0,2));
	var dateF = new Date(dateFin.substring(6,10), dateFin.substring(3,5)-1, dateFin.substring(0,2));

	if ((dateD <= dateChamps) && (dateChamps < dateF))
	{
		colorNormal(champDate);
		retour = true;
	}
	else
	{
		colorErreur(champDate);
		alert(msg);
	}
	
	return retour;
}
// Fin fonctions traitements des dates---------------------------------------------------------------------------



/* --------------------------------------------------------------------------------------------------------------
* 	Gestion des cookies 
*	v 0.1
*----------------------------------------------------------------------------------------------------------------*/
// verif si le navigateur accepte les cookies
function acceptCookie() {
	document.cookie = "essai=cookie";
	if (!document.cookie) {
		alert("Vous devez accepter les cookies. Vérifiez les configurations de votre navigateur Internet.");
		document.location.href = "/";
	}
}
// Sauvegarde d'un cookie
function enregisterCookie(nomCookie, valeurCookie, nbJourValid)
{
	var contenuCookie = nomCookie + "=" + escape(valeurCookie);
	
	// Date d'expiration si le paramètre NbJourValid est spécifié
	// sinon Cookie de session valable jusqu'a la fermeture du navigateur
	if (nbJourValid)
	{
		var dateExpiration = new Date();
		dateExpiration.setDate(dateExpiration.getDate()+nbJourValid);
		contenuCookie += "; expires=" + dateExpiration.toGMTString();
	}
	
	contenuCookie += "; path=/";
	
	window.document.cookie = contenuCookie;	
}
// Lecture d'un cookie
function lireCookie(nomCookie)
{
	var search = nomCookie + "=";
	if (window.document.cookie.length > 0) 
	{
		offset = window.document.cookie.indexOf(search);
		if (offset != -1) 
		{
			offset += search.length;
			end = window.document.cookie.indexOf(";", offset);
			if (end == -1) 
			{
				end = window.document.cookie.length;
			}
			return unescape(window.document.cookie.substring(offset, end));
		}
	}
}

// Suppression d'un cookie
function effacerCookie(nomCookie)
{
	var dateExpiration = new Date();
	dateExpiration.setDate(dateExpiration.getDate() - 1);
	enregisterCookie(nomCookie,'',dateExpiration);
}
// ----------------- Fin gestion des cookies ---------------------------------------------------------------



// GESTION DE ROLLOVER CSS BASE SUR DES NOM DE CSS FINISSANT PAR _on et _off. --------------------------------------------------
// Tableau servant en enregistrer les etats (ON et OFF) des objets de la page
var arrayEtats = new Array();

// Pour effectuer un rollover sur un objet a l'aide d'un CSS
function rollover(objet)
{
	// Récupération de la classe CSS de l'objet (qui doit contenir _off ou _on en fin de nom)
	var nomClasse = objet.className;
	
	// on vérifie l'etat (ON ou OFF)
	var arrayInfos = nomClasse.split("_");
	var classe = arrayInfos[0];
	var etat = arrayInfos[1];
	
	// On enregistre l'etat de l'objet en cours
	enregistrerEtat(objet.id, etat);
	
	if (etat == "off")
		objet.className = classe +  "_on";
}
// Pour annuler un rollover sur un objet a l'aide d'un CSS
function rollout(objet)
{
	// Récupération de la classe CSS de l'objet (qui doit contenir _off ou _on en fin de nom)
	var nomClasse = objet.className;
	
	// on vérifie l'etat (ON ou OFF)
	var arrayInfos = nomClasse.split("_");
	var classe = arrayInfos[0];
	var etat = arrayInfos[1];
	
	// On récupère l'état précédent
	var etatPrecedent = getEtat(objet.id);
	
	if (etat == "on" || etat == "down")
		objet.className = classe +  "_" + etatPrecedent;
}
// Utiliser dans le cas de bouton 3 etats
function rolldown(objet)
{
	// Récupération de la classe CSS de l'objet (qui doit contenir _off ou _on en fin de nom)
	var nomClasse = objet.className;
	
	// on vérifie l'etat (ON ou OFF)
	var arrayInfos = nomClasse.split("_");
	var classe = arrayInfos[0];
	var etat = arrayInfos[1];
	
	// On enregistre l'etat de l'objet en cours
	enregistrerEtat(objet.id, 'down');
	
	objet.className = classe +  "_down";
}

// Enregistrer l'etat d'un objet
function enregistrerEtat(idObjet, etat)
{
	window.arrayEtats[idObjet] = etat;
}
// Permet de récupérer l'état d'un objet
function getEtat(idObjet)
{
	var etat = window.arrayEtats[idObjet];
	return etat;
}
// FIN GESTION ROLLOVER CSS-----------------------------------------------------------------------------



// Fonction pour cocher toutes les checkbox d'un formulaires
// Param object formulaire le formulaire contenant les cases à cocher
// Param boolean boolCocher true ou false pour cocher et décocher.
// Param optionnal string nomCheckbox le nom de la checkbox à prendre en compte
// Param optionnal string exception la valeur de la checkbox à ne pas cochée.
// Return void
function checkAllBox(formulaire, boolCocher, nomCheckbox, exception)
{
	box = formulaire.elements;
	// Paramètres facultatifs
	if (!nomCheckbox) nomCheckbox = "";	
	if (!exception) exception = "";	
	
	for (bclChamps=0; bclChamps < box.length; bclChamps++)
	{
		if (box[bclChamps].type == "checkbox")
		{
			if (nomCheckbox != "")
			{
				if (box[bclChamps].name.indexOf(nomCheckbox) != -1)
					if (exception != "")
					{
						if (box[bclChamps].value != exception)
							box[bclChamps].checked = boolCocher;
					}
					else
						box[bclChamps].checked = boolCocher;
			}
			else
				box[bclChamps].checked = boolCocher;
		}
	}
}



// Fonction d'enregistrement de la mailing Liste
function saveMail(formulaire, popupWidth, popupHeigth, langue)
{
	if (!langue)
		langue = "";
		
	var chMail = formulaire.chMail.value;
	// Ouverture de la popup de suavegarde
	eval ("window.open('" + getCheminRelatif() + "mailing-liste/inscription-lettre-information.php?chMail=" + chMail + "&lang=" + langue + "', 'mailingListe','width=" + popupWidth + ", height=" + popupHeigth + "');");
	// Reinitialisation du formulaire
	formulaire.chMail.value = "Votre adresse email";
}

/* Fonction pour effacer la phrase par défaut d'un champs
* @PARAM  object champs : L'objet de formulaire, exemple : window.document.chMail
* @PARAM string txtAEffacer le texte qui entrainenra l'effacement du champs.
* @RETURN void
*/
function initChampsDefaut(champs, txtAEffacer)
{
	if (champs.value == "") 
		champs.value = txtAEffacer;
	else if (champs.value == txtAEffacer) 
		champs.value = "";
}

// Fonction pour poster un formulaire vers une page données
// Permet par exemple de poster les données (mémorisation) vers une page de retour
// v 0.1
function sendFormulaireTo(formulaire,nomPage)
{
	formulaire.action=nomPage;
	formulaire.submit();
}


// Fonction de vérification de caractères interdit dans un champs -  15/09/2003 v 0.1
function verifCaracInterdit(formulaire,champsToTest)
{
	var caracInterdit = new Array(" ",".","@","/","!",";",",","#","é","è","ç");
	var listeCarac = "";
	for (bclCaracInterdit=0; bclCaracInterdit < caracInterdit.length; bclCaracInterdit++)
	{
		// Test du caractère interdit dans la chaine
		var verifCI = champsToTest.value.indexOf(""+caracInterdit[bclCaracInterdit]+"",1);
		// Si la chaine à tester contient un carcatère interdit
		if (verifCI != -1)
		{
			if (caracInterdit[bclCaracInterdit] == " ")
				listeCarac += " [espace]";
			else
				listeCarac += " [" + caracInterdit[bclCaracInterdit] + "]";
		}
	}
	if (listeCarac != "")
	{
		alert ("Les caractères suivants sont interdits : " + listeCarac);
		return;
	}
	else
	{
		formulaire.submit();
	}
}

/*
*	Fonction pour transformer un string en entier
* 	Gére le remplacement des virgules par des points
*	v 1.1 - 28/09/2006
*
*	// ChangeLog
*	v 1.1 - 28/09/2006 - Suppression des espaces blancs avant le test. Permet la saisie de nombre comme 75 000,35.
*
* 	@PARAM stirng str, la chaine à transformer
*	@RETURN decimal nombre si la conversion est OK sinon renvoi false
*/
function strToInt(str)
{
	var retour = false;

	// Suppression de tous les espaces blancs
	while (str.match(/\s/))			 
		str = str.replace(/\s/, "");

	// Converion des virgules en points
	if (str.indexOf(",") != -1)
	{
		var arrayConversion = str.split(",");
		str = arrayConversion[0] + "." + arrayConversion[1];
	}
	
	var nombre = (str * 1);
	// Si ce n'est pas un nombre
	if (!isNaN(nombre))
		retour = nombre;
		
	return retour;
}


// Ajouter dans le <body> onkeydown="document.onKeyDown = verifTouche(event);"
// FOnction qui permet de detecter l'appui de la touche entrée
function verifTouche(event) 
{
	if (event.which) touche=event.which;
	else if (event.keyCode) touche=event.keyCode;
	if (touche==13)
		document.formRecherche.submit();
}

/* 
* Fonction pour afficher les élements disponibles d'un objet HTML -- Version 1
* exemple getPropertiesOf(window.document.form)
*/
function getPropertiesOf(objet)
{
	strProprietes='';
	for (propriete in objet)
		strProprietes += propriete + ' : ' + objet[propriete]+'\n';
	return(strProprietes);
}


// ********************************************
// Récupération de paramètre d'une requête HTTP
// ou récupération des données d'un formulaire.
// Auteur : Oznog (www.trucsweb.com)
// ********************************************

// NE PAS MODIFIER CE CODE
var paramOk = true;

function FaitTableau(n) {
  // Création d'un tableau (array)
  // aux dimensions du nombre de paramètres.
  this.length = n;
  for (var i = 0; i <= n; i++) {
    this[i] = 0;
  }
  return this
}

function ParamValeur(nValeur) {
  // Récupération de la valeur d'une variable
  // Pour créer la variable en Javascript.
  var nTemp = "";
  for (var i=0;i<(param.length+1);i++) {
    if (param[i].substring(0,param[i].indexOf("=")) == nValeur)
	{
      nTemp = param[i].substring(param[i].indexOf("=")+1,param[i].length);
	  if (nTemp == "%23")
			nTemp = "";
	}
  }

  return Decode(nTemp)
}



// Extraction des paramètres de la requête HTTP
// et initialise la variable "paramOk" à false
// s'il n'y a aucun paramètre.
if (!location.search) {
  paramOk = false;
}
else {
  // Éliminer le "?"
  nReq = location.search.substring(1,location.search.length)
  // Extrait les différents paramètres avec leur valeur.
  nReq = nReq.split("&");
  param = new FaitTableau(nReq.length-1)
  for (var i=0;i<(nReq.length);i++) {
    param[i] = nReq[i];
  }
}

// Décoder la requête HTTP
// manuellement pour le signe (+)
function Decode(tChaine) {
  while (true) {
    var i = tChaine.indexOf('+');
    if (i < 0) break;
	    tChaine = tChaine.substring(0,i) + '%20' + tChaine.substring(i + 1, tChaine.length);
  }
  return unescape(tChaine)
}

/*
* Fonction pour trier les données dans les backOffice
* v 0.1 - 22/03/2007
*/
function triInfo(nomChamps, url)
{
	var formulaire = window.document.formFiltre;
	
	if(!url)
		url = "liste.php?champsTri=";
	else
		url = url + "?champsTri=";	
		
	// On vérifie s'il y a des parametres dans l'url
	if (paramOk == true)
	{
		var champsTriActuel = ParamValeur("champsTri");
			
		// S'il s'agit du même champs
		if (champsTriActuel != "" && nomChamps.indexOf(champsTriActuel) != -1)
		{
			// On vérifie si le tri est ascendant ou descendant
			if (champsTriActuel.toLowerCase().indexOf('desc') != -1)
			{
				nomChamps = champsTriActuel.replace(" DESC", "");
			}
			else
			{
				nomChamps = champsTriActuel + " DESC";
			}
			window.location.href = url + nomChamps;						
		}
		else
		{
			window.location.href = url + nomChamps;
		}
	}
	else
		window.location.href = url + nomChamps;	
}


/*
* Fonction pour lancer l'impression d'une page et la refermée, un fois terminée
* @PARAM integer delai le temps d'atttente avant la fermeture de la fenetre, exprimé en millisecondes.
*/
function printAndClose(delai)
{
	if (!delai)
		var delai = 1500; // exprimé en millisecondes
	
	navigateur = NavCheck();
	// La fonction window.print() n'est pas implémentée sous Opera car cette méthode n'existe dans aucune norme.
	if (navigateur.opera == false)
	{
		// Si c'est pas Opera, on lance l'impression
		window.status = "Demande d'impression en cours...";
		window.print()
		window.setTimeout("window.self.close();", delai);
	}
	else // Si c'est Opera, on affiche un message javascript
		alert('Utilisez la fonction Imprimer de votre navigateur.');
}

// Fonction pour générer une chaine aléatoire
function mdp(tailleChaine)
{
	var caracteresAutorises='23456789abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ';
	
	var chaineAleatoire = '';
	while(chaineAleatoire.length < tailleChaine)
		chaineAleatoire += caracteresAutorises.charAt(Math.round(Math.random() * (caracteresAutorises.length)));
	
	return chaineAleatoire;
}

/** 
* Fonction pour obtenir le chemin relatif vers un fichier
* Version 0.1 - 25/04/2006
* Copyright 2006 Anhtemis, Inc. All rights reserved.
* @PARAM void
* @RETURN string cheminRelatif Le chemin relatif vers le fichier (ex : '../')
*/
function getCheminRelatif()
{
	var cheminUrl = window.location.pathname;
	var cheminRelatif = '';
	
	// Possibilite de placer une url de develeppoment (a partir de la racine du domaine)
	// pour que le script fonctionne en dev ou sous maquette.
	// La variable doit être nommée urlDeDeveloppement et doit être déclarée avant l'appel de la fonction getCheminRelatif();
	// Exemple : var urlDeDeveloppement = '/maquette' pour une site accessible sous www.mondomaine.com/maquette. 
	// /!\ Ne pas oublier le slash racine devant /!\. La déclaration peut être placer dans le template dream le temps du dev.
	if (window.urlDeDeveloppement)	
		 cheminUrl = cheminUrl.replace(window.urlDeDeveloppement, ''); // On extrait l'url de developpement du chemin

	// On supprime le premier slash du chemin
	if (cheminUrl.charAt(0) == '/')
		cheminUrl = cheminUrl.slice(1);	
	// On compte le nombre de répertoires pour acceder au fichier
	var arraySlash = cheminUrl.split('/');
	// On comptes le nombre de slash dans le chemin de l'url restante
	var nbRep = arraySlash.length;
	// Constrcution du chemin relatif en fonction du nombre de dossiers à parcourir
	if (nbRep == 1) // On est à la racine du site
		cheminRelatif = './';
	else // On est dans des niveaux inférieurs
		for (bclRep = 1; bclRep < nbRep; bclRep++)
			cheminRelatif += '../';

	return cheminRelatif;
}



// Fonctions propores à Dreamweaver -------------------------------------------------------------------
function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

function MM_nbGroup(event, grpName) { //v6.0
  var i,img,nbArr,args=MM_nbGroup.arguments;
  if (event == "init" && args.length > 2) {
    if ((img = MM_findObj(args[2])) != null && !img.MM_init) {
      img.MM_init = true; img.MM_up = args[3]; img.MM_dn = img.src;
      if ((nbArr = document[grpName]) == null) nbArr = document[grpName] = new Array();
      nbArr[nbArr.length] = img;
      for (i=4; i < args.length-1; i+=2) if ((img = MM_findObj(args[i])) != null) {
        if (!img.MM_up) img.MM_up = img.src;
        img.src = img.MM_dn = args[i+1];
        nbArr[nbArr.length] = img;
    } }
  } else if (event == "over") {
    document.MM_nbOver = nbArr = new Array();
    for (i=1; i < args.length-1; i+=3) if ((img = MM_findObj(args[i])) != null) {
      if (!img.MM_up) img.MM_up = img.src;
      img.src = (img.MM_dn && args[i+2]) ? args[i+2] : ((args[i+1])? args[i+1] : img.MM_up);
      nbArr[nbArr.length] = img;
    }
  } else if (event == "out" ) {
    for (i=0; i < document.MM_nbOver.length; i++) {
      img = document.MM_nbOver[i]; img.src = (img.MM_dn) ? img.MM_dn : img.MM_up; }
  } else if (event == "down") {
    nbArr = document[grpName];
    if (nbArr)
      for (i=0; i < nbArr.length; i++) { img=nbArr[i]; img.src = img.MM_up; img.MM_dn = 0; }
    document[grpName] = nbArr = new Array();
    for (i=2; i < args.length-1; i+=2) if ((img = MM_findObj(args[i])) != null) {
      if (!img.MM_up) img.MM_up = img.src;
      img.src = img.MM_dn = (args[i+1])? args[i+1] : img.MM_up;
      nbArr[nbArr.length] = img;
  } }
}

function MM_openBrWindow(theURL,winName,features) { //v2.0
  window.open(theURL,winName,features);
}
// -- FIN Fonctions propores à Dreamweaver -------------------------------------------------------------

// -------------- FONCTIONS POUR L'AFFICHAGE DES ANIMATIONS FLASH --------------------------------------
//v1.7
// Flash Player Version Detection
// Detect Client Browser type
// Copyright 2005-2007 Adobe Systems Incorporated.  All rights reserved.
var isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;

function ControlVersion()
{
	var version;
	var axo;
	var e;

	// NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry

	try {
		// version will be set for 7.X or greater players
		axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
		version = axo.GetVariable("$version");
	} catch (e) {
	}

	if (!version)
	{
		try {
			// version will be set for 6.X players only
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
			
			// installed player is some revision of 6.0
			// GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
			// so we have to be careful. 
			
			// default to the first public version
			version = "WIN 6,0,21,0";

			// throws if AllowScripAccess does not exist (introduced in 6.0r47)		
			axo.AllowScriptAccess = "always";

			// safe to call for 6.0r47 or greater
			version = axo.GetVariable("$version");

		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 4.X or 5.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = axo.GetVariable("$version");
		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 3.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = "WIN 3,0,18,0";
		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 2.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
			version = "WIN 2,0,0,11";
		} catch (e) {
			version = -1;
		}
	}
	
	return version;
}

// JavaScript helper required to detect Flash Player PlugIn version information
function GetSwfVer(){
	// NS/Opera version >= 3 check for Flash plugin in plugin array
	var flashVer = -1;
	
	if (navigator.plugins != null && navigator.plugins.length > 0) {
		if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
			var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
			var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
			var descArray = flashDescription.split(" ");
			var tempArrayMajor = descArray[2].split(".");			
			var versionMajor = tempArrayMajor[0];
			var versionMinor = tempArrayMajor[1];
			var versionRevision = descArray[3];
			if (versionRevision == "") {
				versionRevision = descArray[4];
			}
			if (versionRevision[0] == "d") {
				versionRevision = versionRevision.substring(1);
			} else if (versionRevision[0] == "r") {
				versionRevision = versionRevision.substring(1);
				if (versionRevision.indexOf("d") > 0) {
					versionRevision = versionRevision.substring(0, versionRevision.indexOf("d"));
				}
			}
			var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
		}
	}
	// MSN/WebTV 2.6 supports Flash 4
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
	// WebTV 2.5 supports Flash 3
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
	// older WebTV supports Flash 2
	else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
	else if ( isIE && isWin && !isOpera ) {
		flashVer = ControlVersion();
	}	
	return flashVer;
}

// When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available
function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
{
	versionStr = GetSwfVer();
	if (versionStr == -1 ) {
		return false;
	} else if (versionStr != 0) {
		if(isIE && isWin && !isOpera) {
			// Given "WIN 2,0,0,11"
			tempArray         = versionStr.split(" "); 	// ["WIN", "2,0,0,11"]
			tempString        = tempArray[1];			// "2,0,0,11"
			versionArray      = tempString.split(",");	// ['2', '0', '0', '11']
		} else {
			versionArray      = versionStr.split(".");
		}
		var versionMajor      = versionArray[0];
		var versionMinor      = versionArray[1];
		var versionRevision   = versionArray[2];

        	// is the major.revision >= requested major.revision AND the minor version >= requested minor
		if (versionMajor > parseFloat(reqMajorVer)) {
			return true;
		} else if (versionMajor == parseFloat(reqMajorVer)) {
			if (versionMinor > parseFloat(reqMinorVer))
				return true;
			else if (versionMinor == parseFloat(reqMinorVer)) {
				if (versionRevision >= parseFloat(reqRevision))
					return true;
			}
		}
		return false;
	}
}

function AC_AddExtension(src, ext)
{
  if (src.indexOf('?') != -1)
    return src.replace(/\?/, ext+'?'); 
  else
    return src + ext;
}

function AC_Generateobj(objAttrs, params, embedAttrs) 
{ 
  var str = '';
  if (isIE && isWin && !isOpera)
  {
    str += '<object ';
    for (var i in objAttrs)
    {
      str += i + '="' + objAttrs[i] + '" ';
    }
    str += '>';
    for (var i in params)
    {
      str += '<param name="' + i + '" value="' + params[i] + '" /> ';
    }
    str += '</object>';
  }
  else
  {
    str += '<embed ';
    for (var i in embedAttrs)
    {
      str += i + '="' + embedAttrs[i] + '" ';
    }
    str += '> </embed>';
  }

  document.write(str);
}

function AC_FL_RunContent(){
  var ret = 
    AC_GetArgs
    (  arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
     , "application/x-shockwave-flash"
    );
  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}

function AC_SW_RunContent(){
  var ret = 
    AC_GetArgs
    (  arguments, ".dcr", "src", "clsid:166B1BCA-3F9C-11CF-8075-444553540000"
     , null
    );
  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}

function AC_GetArgs(args, ext, srcParamName, classid, mimeType){
  var ret = new Object();
  ret.embedAttrs = new Object();
  ret.params = new Object();
  ret.objAttrs = new Object();
  for (var i=0; i < args.length; i=i+2){
    var currArg = args[i].toLowerCase();    

    switch (currArg){	
      case "classid":
        break;
      case "pluginspage":
        ret.embedAttrs[args[i]] = args[i+1];
        break;
      case "src":
      case "movie":	
        args[i+1] = AC_AddExtension(args[i+1], ext);
        ret.embedAttrs["src"] = args[i+1];
        ret.params[srcParamName] = args[i+1];
        break;
      case "onafterupdate":
      case "onbeforeupdate":
      case "onblur":
      case "oncellchange":
      case "onclick":
      case "ondblClick":
      case "ondrag":
      case "ondragend":
      case "ondragenter":
      case "ondragleave":
      case "ondragover":
      case "ondrop":
      case "onfinish":
      case "onfocus":
      case "onhelp":
      case "onmousedown":
      case "onmouseup":
      case "onmouseover":
      case "onmousemove":
      case "onmouseout":
      case "onkeypress":
      case "onkeydown":
      case "onkeyup":
      case "onload":
      case "onlosecapture":
      case "onpropertychange":
      case "onreadystatechange":
      case "onrowsdelete":
      case "onrowenter":
      case "onrowexit":
      case "onrowsinserted":
      case "onstart":
      case "onscroll":
      case "onbeforeeditfocus":
      case "onactivate":
      case "onbeforedeactivate":
      case "ondeactivate":
      case "type":
      case "codebase":
      case "id":
        ret.objAttrs[args[i]] = args[i+1];
        break;
      case "width":
      case "height":
      case "align":
      case "vspace": 
      case "hspace":
      case "class":
      case "title":
      case "accesskey":
      case "name":
      case "tabindex":
        ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
        break;
      default:
        ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
    }
  }
  ret.objAttrs["classid"] = classid;
  if (mimeType) ret.embedAttrs["type"] = mimeType;
  return ret;
}
// -------------- FIN FONCTIONS POUR L'AFFICHAGE DES ANIMATIONS FLASH ---------------------------------