
//***********************************************************************************************************//
// FONCTION PERMETTANT D'ACCÉLÉRER ET DE RENDRE COMPATIBLE LA FONCTION GETELEMENTSBYCLASSNAME  //
//***********************************************************************************************************//
document.getElementsByClassName = function(className, parentElement) {
  if (typeof parentElement == 'string'){
    parentElement = document.getElementById(parentElement);
  } else if (typeof parentElement != 'object' ||
             typeof parentElement.tagName != 'string'){
    parentElement = document.body;
  }
  var children = parentElement.getElementsByTagName('*');
  var re = new RegExp('\\b' + className + '\\b');
  var el, elements = [];
  var i = 0;
  while ( (el = children[i++]) ){
    if ( el.className && re.test(el.className)){
      elements.push(el);
    }
  }
  return elements;
} 

//*****************************************************************************//
// FONCTION PERMETTANT LE SWAPPING DES IMAGES DANS LA FICHE DÉTAILLÉE //
//*****************************************************************************//
function slide(img_big, img){	
	document.images[img_big].src = $(img).src.replace('_small.jpg', '.jpg');
}


//**************************************************************//
// FONCTION PERMETTANT DE MODIFIER LA CLASS D'UN ELEMENT	//
//**************************************************************//
function setClass(elt, newClass){	
	var obj=document.getElementById(elt); 	
	if (obj==null) {alert(elt);}
	obj.className=newClass;
} 


//******************************************************************************//
// FONCTION PERMETTANT D'ACTIVER OU DE DÉSACTIVER L'ATTRIBUT DISABLED	//
//******************************************************************************//
function setDisabled(id, state){	
	var divObj = null;
	divObj = $(id);
 	divObj.disabled = state; 	
} 


//******************************************************************************//
// FONCTION PERMETTANT D'ACTIVER OU DE DÉSACTIVER L'ATTRIBUT READONLY	//
//******************************************************************************//
function setReadonly(id, state){	
	var divObj = null;
	divObj = $(id); 	 	 		
	divObj.readOnly = state;
} 


//************************************************************************//
// FONCTION PERMETTANT DE TRANSFORMER UNE LISTBOX EN CHAMP TEXTE //
//************************************************************************//
function ListingToFields(parent, id, valeur, maxlength){	
	// On récupère l'objet DIV qui contient le listing
	var div = document.getElementById(parent);
	
	// On le transforme en champ texte qui contient la valeur sélectionnée
	div.innerHTML = '<input size="35" maxlength="' + maxlength + '" type="text" id="' + id + '" name="' + id + '" value="' + valeur + '">';	
}


//***************************************************************************//
// FONCTION PERMETTANT DE RACCOURCIR ET AMÉLIORER LE GETELEMENTBYID //
//***************************************************************************//
/* 
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; 
  } 
}


//*************************************************************************//
// FONCTION PERMETTANT D'AUTORISER QUE LES CHIFFRES DANS UN CHAMP //
//*************************************************************************//
function NumMask(e){
	var IE5 = false;

	if (!e) var e = window.event;
	if (e.keyCode){
		IE5= true; code = e.keyCode;}
	else if (e.which) code = e.which ;

	//test du code
	if (code < 48 || code > 57) {
		if(IE5){
			e.returnValue = false;
		}
		else
			e.preventDefault();
	} 
}


//***********************************************************************************************************//
// FONCTION PERMETTANT D'EMPÊCHER LES DOUBLES QUOTES ET LES PIPES DANS UN CHAMP ALPHANUMÉRIQUE //
//***********************************************************************************************************//
function QuotePipeMask(e){	
	var IE5 = false;

	if (!e) var e = window.event;
	if (e.keyCode){
		IE5= true; code = e.keyCode;}
	else if (e.which) code = e.which ;

	//test du code
	if (code == 34 || code == 166) {
		if(IE5){
			e.returnValue = false;
		}
		else
			e.preventDefault();
	} 
}


//***********************************************************************//
// FONCTION PERMETTANT DE VÉRIFIER LE FORMAT D'UNE ADRESSE EMAIL //
//***********************************************************************//
function checkEmail(email){	
	var i;
	
	// Recherche de @
	i = email.indexOf("@");
	if (i == -1) return false;	
	
	// Séparation du nom de l'utilisateur et du nom de domaine.
	var username = email.substring(0, i);
	var domain = email.substring(i + 1, email.length)

	// Recherche des espaces au début du nom de l'utilisateur.
	i = 0;
	while ((username.substring(i, i + 1) == " ") && (i < username.length)){
		i++;
	}
	
	// Les enlève s'il en trouve.
	if (i > 0) username = username.substring(i, username.length);
	
	// Recherche d'espaces à la fin du nom de domaine.
	i = domain.length - 1;
	while ((domain.substring(i, i + 1) == " ") && (i >= 0)) {
		i--;
	}
	
	// Les enlève s'il en trouve.
	if (i < (domain.length - 1)) domain = domain.substring(0, i + 1);
	
	// Vérifie que le nom de l'utilisateur et du domaine ne soit pas vide.
	if ((username == "") || (domain == ""))	return false;
	
	// Vérifie s'il n'y a pas de caractères interdits dans le nom de l'utilisateur.
	var ch;
	for (i = 0; i < username.length; i++){
		ch = (username.substring(i, i + 1)).toLowerCase();
		if (!(((ch >= "a") && (ch <= "z")) || ((ch >= "0") && (ch <= "9")) ||	(ch == "_") || (ch == "-") || (ch == "."))) return false;		
	}
	
	// Vérifie s'il n'y a pas de caractères interdits dans le nom de domaine
	for (i = 0; i < domain.length; i++){
		ch = (domain.substring(i, i + 1)).toLowerCase();
		if (!(((ch >= "a") && (ch <= "z")) || ((ch >= "0") && (ch <= "9")) ||	(ch == "_") || (ch == "-") || (ch == "."))){
			return false;
		}
	}

	// Ajouter ci-dessous de nouveaux noms de domaine (une liste sur http://www.toulouse-renaissance.net/c_outils/c-nom-domaine.htm)
	var aSuffix = new Array("com","net","int","aero","biz","museum","name","info","coop","pro","eu","edu","org","gov","gouv","mil","bj","dz","de","ad","be","ca","bf","bi","cm","cf","cg","cd","ci","cn","dj","fr","ga","gp","gf","jp","lu","mg","ml","ma","mq","mr","mc","nc","pf","re","pm","sn","ch","td","tf","tn");
	var bFoundSuffix = false;
	i = 0;
	while (i < aSuffix.length){
		if (("." + aSuffix[i]) == domain.substring(domain.length - aSuffix[i].length - 1, domain.length))	return true;		
		i++;
	}
	
	// Si le nom de domaine est inconnu  : return false
	return false;	
}


//*******************************************************************************************//
// FONCTION PERMETTANT DE VÉRIFIER LE FORMULAIRE DE CONTACTE AVANT DE LE SOUMETTRE //
//*******************************************************************************************//
function checkFormContact(){
	 // On vérifie chaque champ
	 if (document.form_contact.nom.value == ''){alert('Votre nom est une information obligatoire !'); return;}
	 if (document.form_contact.email.value == ''){alert('Votre email est une information obligatoire !'); return;}
	 if (!checkEmail(document.form_contact.email.value)){alert('Votre email est dans un format incorrect !'); return;}
	 
	 if (document.form_contact.nom.value == ''){alert('Votre nom est une information obligatoire !'); return;}
	 if (document.form_contact.nom.value == ''){alert('Votre nom est une information obligatoire !'); return;}
	 
	 
	 var error = true;
	 for(var i = 2; i < arguments.length; i++)
	 	{
		 var arg = eval('formContact.check' + arguments[i]);
		 if(arg(arguments[0]))		 	
			 error = false;
		 else
		 	{
			 error = true;
			 break;
			}
		}
	
	 // S'il n'y a aucune erreur, on lance le traitement de la Popup
	 if(!error)
	 	{
		 var _form = eval('document.' + arguments[0]);
		 // Si l'argument Popup est rempli, alors on l'ouvre en HTML et on l'indique à la CGI...
		 if (arguments[1] != "")
			{			 
			 window.open(arguments[1],'POPUP','top='+top_centre(165)+', left='+left_centre(395)+', width=395,height=165,scrollbars=no,status=no,menubar=no');
			}
			
		 // On soumet le formulaire
		 _form.submit();		 
		 
		 // On remet le formulaire à zero...
		 _form.reset();
		}
	// Ici, il y a une erreur... on sort.
	else				
		return;	
}


//****************************************************************************************************//
// FONCTION PERMETTANT DE FAIRE UN REMPLACEMENT RECURRENT D'UN CARACTERE DANS UNE CHAÎNE //
//****************************************************************************************************//
function replaceAll(str, new_car, old_car) {	
  while (str.indexOf(old_car) != -1)   	
    str = str.replace(old_car, new_car);
  return str;
}


//***********************************************************************************************//
// FONCTION PERMETTANT D'ENLEVER TOUS LES CARACTERES SPÉCIAUX D'UN STRING POUR L'AJAX //
//***********************************************************************************************//
function Normalize(str) {  
  // Tableau des caractères spéciaux
  var spec = new Array("à", "â", "ä", "À", "Â", "Ä", "é", "è", "ê", "ë", "É", "È", "Ê", "Ë", "î", "ï", "Î", "Ï", "ô", "ö", "Ô", "Ö", "ù", "û", "ü", "Ù", "Û", "Ü", "ç", "Ç");
  // Equivalent de la version normalisée
  var norm = new Array("a", "a", "a", "A", "A", "A", "e", "e", "e", "e", "E", "E", "E", "E", "i", "i", "I", "I", "o", "o", "O", "O", "u", "u", "u", "U", "U", "U", "c", "C");
    
  // On parcourt toutes les possibilités de caractères
  for (var i = 0; i < spec.length; i++)
  	// fonction de remplacement
  	str = replaceAll(str, norm[i], spec[i]);
  
  // On renvoit la chaîne ainsi traitée
  return str;
}

//*******************************************************************//
// FONCTION PERMETTANT DE RENDRE EDITABLE UN CHAMP DESACTIVE //
//*******************************************************************//
function setEnabled(obj) 
{	var o=document.getElementById(obj);
	o.style.border="2px solid red";
	o.style.backgroundColor="#EEE";
	}
	
function disable(obj) 
{	var o=document.getElementById(obj);
	o.style.border="1px solid blue";
	o.style.backgroundColor="#DDD";
}


//******************************************************//
// FONCTION PERMETTANT DE RENDRE VISIBLE UN OBJET //
//******************************************************//
function setVisible(obj){
	obj = document.getElementById(obj);
	obj.style.visibility = 'visible';
}


//*********************************************************//
// FONCTION PERMETTANT DE RENDRE INVISIBLE UN OBJET //
//*********************************************************//
function setUnvisible(obj){
	obj = document.getElementById(obj);
	obj.style.visibility = 'hidden';
}


//****************************************************************************************************************************//
// FONCTION POUR CONCATENER DES VALEURS DANS UN CHAMP TEXT + METTRE UN HIDDEN A JOUR. UTLISISEE DANS liste_email.cgi //
//****************************************************************************************************************************//
function ajoute(valeur) 
{ 
		if (window.name=='receiver' && this.opener.document.getElementById('receiver').value=="")
		{ o=(this.opener.document.getElementById('receiver'));}
		else if (window.name=='copie-cachee')
			{o=(this.opener.document.getElementById('copie-cachee'));}
		else {o=(this.opener.document.getElementById('copie'));}
	
	o.value=valeur+";"+o.value;
}


//**********************************************************************************************************************************************//
// FONCTION PERMETTANT DE CONSERVER L'ADRESSE COMPLETE D'UN FICHIER A UPLOADER (I.E. ECRIT DANS UN CHAMP HIDDEN LE CHEMIN COMPLET //
//**********************************************************************************************************************************************//
function cheminUpload(chemin){
	var o = this.document.getElementById('cheminPJ');
	o.value=chemin+";"+o.value;	
}
	

//***************************************************************************************//
// FONCTION PERMETTANT DE REMPLACER DANS UNE EXPRESSION UN MOTIF PAR UN AUTRE //
//***************************************************************************************//
function Remplace(expr,a,b) {
	var i=0
  while (i!=-1){
  	i=expr.indexOf(a,i);
    if (i>=0){
    	expr=expr.substring(0,i)+b+expr.substring(i+a.length);
      i+=b.length;
    }
  }
  return expr
}


//*******************************************************************************************//
// FONCTION PERMETTANT DE SELECTIONNER 1 NB CHOISI DE CHECKBOX DANS UN FORMULAIRE //
//*******************************************************************************************//
function select_part() {
	var tab=opener.document.getElementsByName('prospect_select');
	var i=this.document.getElementById('nb_selection').value;
	if (i>tab.length) {i=tab.length;}
	for (j=1; j<=i; j++) {
		tab[j-1].checked=true;
		}
	}


//***************************************************************************************************//
// FONCTION PERMETTANT DE SELECTIONNER OU DESELECT TOUS LES CHECKBOX DANS UN FORMULAIRE //
//***************************************************************************************************//
function select_all(bool) {
	var tab=document.getElementsByName('prospect_select');
	for (j=0; j<tab.length; j++) {
		tab[j].checked=bool;
		}
	}


//**************************************************************************************************************//
// FONCTION PERMETTANT DE DÉSÉLECTIONNER TOUS LES CHECKBOX DANS UN FORMULAIRE N'AYANT PAS MEME ID	//
//**************************************************************************************************************//
function unselect(formulaire, selection) {
	var tab=document.forms[formulaire].elements;
			for (i=0; i<tab.length; i++) {
			if (tab[i].name!=selection) {tab[i].checked=false;}
		}
}

//**************************************************************************************************//
// FONCTION PERMETTANT DE METTRE TOUS LES CHECKBOX 'selection' D'UN FORMULAIRE 'formulaire' DANS LE MEME//
//			ETAT QU'UN REFERER 'referer'
//**************************************************************************************************//
function setSelectedOrNot(formulaire, selection, referer) {
	var tab=document.forms[formulaire].elements;
			for (i=0; i<tab.length; i++) {
			if (tab[i].name==selection) {tab[i].checked=document.getElementById(referer).checked;}
		}
}


//*********************************************************//
// FONCTION PERMETTANT D'AJOUTER UN ÉLÉMENT DANS UN SELECT //
//*********************************************************//
function AddOptionSelect(libelle, valeur, selectId, optGroupName){	
	// On vérifie tout d'abord que le département n'est pas vide...
	if (valeur == ""){
		alert("Vous devez indiquer un département !");
		return;
	}
	// Et qu'il est composé de 2 chiffres !
	if (valeur != "" && valeur.length <2){
		alert("Le département doit être composé de 2 chiffres !");
		return;
	}		
	
	// Y a-t'il doublon ?
	for (i = 0; i < $(selectId).options.length; i++){
		if ($(selectId).options[i].value == valeur){
			alert('Le département ' + valeur + ' est déjà dans la liste !');
			// On remet le Select à l'index 0
			$(selectId).options.selectedIndex = 0;
			$('dept').value = "";
			return;
		}
	}

	// Calcul du nombre de départements actuels
  var nb_dept_left = $(selectId).options.length - 1;  
	var newOption = new Option(libelle,valeur);
	if (optGroupName == ""){		
  	document.getElementById(selectId).options[document.getElementById(selectId).options.length] = newOption;
  }
  else{
  	var optGroup = document.getElementById("optGroup_"+ selectId +"_"+ optGroupName);
    var Tlibelle = new Array;
    var Tvaleur = new Array;
    var nbOptOrigine;
    // Mis en mémoire des options actuelle
    for (var i = 0; i < optGroup.getElementsByTagName("option").length; i++){
    	Tvaleur[i] = optGroup.getElementsByTagName("option")[i].value;
      Tlibelle[i] = optGroup.getElementsByTagName("option")[i].innerHTML;
      nbOptOrigine = i;
    }
    // Suppression de tout le optGroup
    supp_optgroup(selectId, optGroupName)
    // Création de l'optGroup en fin du select
    ajout_optgroup(selectId, optGroupName)
    // Parcour et ajout des options mémorisées
    for (var i = 0; i < nbOptOrigine+1; i++){
    	memOption = new Option(Tlibelle[i],Tvaleur[i]);
      document.getElementById(selectId).options[document.getElementById(selectId).options.length] = memOption;
    }    
    // Ajout de la nouvelle option
    newOption = new Option(libelle,valeur);
    document.getElementById(selectId).options[document.getElementById(selectId).options.length] = newOption;
    newOption.selected = true;           
  }
  
  // Incrémentation du nombre de départements liés
  nb_dept_left++;
  $('intro_liste_dept').innerHTML = nb_dept_left + " département(s) lié(s)";
  // On remet le Select à l'index 0
	$(selectId).options.selectedIndex = 0;
	$('dept').value = "";
  // Message utilisateur
  alert("Département " + valeur + " correctement ajouté de la liste."); 
}


//************************************************************//
// FONCTION PERMETTANT DE SUPPRIMER UN ÉLÉMENT DANS UN SELECT //
//************************************************************//
function DelOptionSelect(selectId){	
	// On vérifie qu'on a sélectionné un département	
	if ($(selectId).options.selectedIndex > 0){
		// Mise en mémoire du département sélectionné
		var dept = $(selectId).options[$(selectId).options.selectedIndex].value;
		// Suppression du département choisi
		$(selectId).options[$(selectId).options.selectedIndex] = null;
		// Réindication du nombre de département restant
		var nb_dept_left = $(selectId).options.length - 1;
		if (nb_dept_left == 0){
			$('intro_liste_dept').innerHTML = "Aucun département lié";
		}
		else{			
			$('intro_liste_dept').innerHTML = nb_dept_left + " département(s) lié(s)";
		}
		// On remet le Select à l'index 0
		$(selectId).options.selectedIndex = 0;
		// Message utilisateur
		alert("Département " + dept + " correctement supprimé de la liste.");
  } 
  else{
		alert("Vous devez sélectionner un département !");
	}
}


//****************************************************************//
// FONCTION PERMETTANT DE VÉRIFIER UNE DATE DE FORMAT JJ/MM/AAAA  //
//****************************************************************//
function MaskDate(d) {
	// La date peut être vide
	if (d == "" || d == "sans objet")
		return true;
	
	e = new RegExp("^[0-9]{2}\/[0-9]{2}\/([0-9]{4})$");
	
	// On teste l'expression régulière pour valider la forme de la date
	if (!e.test(d))
		return false

	// On sépare la date en 3 variables pour vérification, parseInt() converti du texte en entier
	j = parseInt(d.split("/")[0], 10); // jour
	m = parseInt(d.split("/")[1], 10); // mois
	a = parseInt(d.split("/")[2], 10); // année

	// Définition du dernier jour de février
	// Année bissextile si annnée divisible par 4 et que ce n'est pas un siècle, ou bien si divisible par 400
	if (a%4 == 0 && a%100 !=0 || a%400 == 0) fev = 29;
	else fev = 28;

	// Nombre de jours pour chaque mois
	nbJours = new Array(31,fev,31,30,31,30,31,31,30,31,30,31);

	// Enfin, retourne vrai si le jour est bien entre 1 et le bon nombre de jours, idem pour les mois, sinon retourn faux
	return ( m >= 1 && m <=12 && j >= 1 && j <= nbJours[m-1] );
}


//****************************************************************//
// FONCTION PERMETTANT DE VÉRIFIER UNE DATE DE FORMAT JJ/MM/AAAA  //
//****************************************************************//
function MaskCA(ca) {	
	// Définition du mask
	e = new RegExp("g{1}[0-9]{4}");
	
	// Test de l'expression régulière
	if (!e.test(d))
		return false
		
	return true;
}


//*********************************************************************************//
// FONCTION PERMETTANT DE VÉRIFIER UNE DATE D'APRES 3 VARIABLES JOUR, MOIS, ANNEE  //
//*********************************************************************************//
function MaskDate2(j, m, a) {
	// Définition du dernier jour de février
	// Année bissextile si annnée divisible par 4 et que ce n'est pas un siècle, ou bien si divisible par 400
	if (a%4 == 0 && a%100 !=0 || a%400 == 0) fev = 29;
	else fev = 28;

	// Nombre de jours pour chaque mois
	nbJours = new Array(31,fev,31,30,31,30,31,31,30,31,30,31);

	// Enfin, retourne vrai si le jour est bien entre 1 et le bon nombre de jours, idem pour les mois, sinon retourn faux
	return ( m >= 1 && m <=12 && j >= 1 && j <= nbJours[m-1] );
}

//*********************************************************************************//
// FONCTION POUR EMPECHER LE RAFRAICHISSEMENT DE LA PAGE						  //
//*********************************************************************************//
function antiRefresh(e) {
	/*if (e.which=='116') {
		for (var i=0; i<this.document.forms.length;i++) {
			var formulaire=this.document.forms[i];
			formulaire.reset();
			/*for (var j=0;j<formulaire.elements.length;j++) {
				formulaire.elements[j].value=0;
				}
			}
		}	*/
var xhr_object ;
if(window.XMLHttpRequest) // Firefox 
	   xhr_object = new XMLHttpRequest(); 
	else if(window.ActiveXObject) // Internet Explorer 
	   xhr_object = new ActiveXObject("Microsoft.XMLHTTP"); 
	else { // XMLHttpRequest non supporté par le navigateur 
	   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
	   } 
	xhr_object.abort();
		
	return;
}


//******************************************//
// FONCTIONS PERMETTANT DE CENTRER LA POPUP //
//******************************************//
function top_centre(hauteur){
	 var top=(screen.height-hauteur)/2;
	 return top;
}	

function left_centre(largeur){
	 var left=(screen.width-largeur)/2;
	 return left;
}


//*****************************************************************************//
// FONCTIONS PERMETTANT D'APPLIQUER UN STYLE SPÉCIAL ERREUR AUX OBJETS //
//*****************************************************************************//
function setErrorClass(objet){
	objet.className = 'borderRed';
}


//*****************************************************************************//
// FONCTIONS PERMETTANT D'APPLIQUER UN STYLE SPÉCIAL ERREUR AUX OBJETS //
//*****************************************************************************//
function releaseErrorClass(objet){
	$(objet).className = 'texte';
}