//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 messa