// *****************************************************************************
// LIBRAIRIE GENERALE JAVASCRIPT
// 2007 - 2008 Adventi Informatique
// Description : les fonctions suivantes ont été développer afin d'effectuer des
// traitements courants en Javascript.
// *****************************************************************************

// variable calculatrice
calc_memory = "";

// *****************************************************************************
// FONCTION de personnalisation d'infos bulle
var IB=new Object;
var posX=0;posY=0;
var xOffset=10;yOffset=10;
var timer = "";
function AffBulle(texte) {

  clearTimeout(timer);
  HideBulle();
  contenu="<div style=\"position: absolute; z-index: 10;\"><TABLE border=0 cellspacing=0 cellpadding="+IB.NbPixel+" width=\"210px\"><TR bgcolor='"+IB.ColFond+"'><TD style=\"border: 1px solid "+IB.ColContour+"\"><TABLE border=0 cellpadding=2 cellspacing=0 bgcolor='"+IB.ColFond+"'><TR><TD><FONT style=\"font-size: 8pt;\" face='verdana' color='"+IB.ColTexte+"'>"+texte+"</FONT></TD></TR></TABLE></TD></TR></TABLE></div>&nbsp;";
  var finalPosX=posX-xOffset;
  var finalPosY=posY+yOffset;
  if (finalPosX<0) finalPosX=0;
  if (finalPosX>550) finalPosX=550;
  if (finalPosY>505) finalPosY=505;
  if (document.layers) {
    document.layers["bulle"].document.write(contenu);
    document.layers["bulle"].document.close();
    document.layers["bulle"].top=finalPosY;
    document.layers["bulle"].left=finalPosX;
    document.layers["bulle"].visibility="show";}
  if (document.all) {
    //var f=window.event;
    //doc=document.body.scrollTop;
    bulle.innerHTML=contenu;
    document.all["bulle"].style.top=finalPosY;
    document.all["bulle"].style.left=finalPosX;//f.x-xOffset;
    document.all["bulle"].style.visibility="visible";
  }
  //modif CL 09/2001 - NS6 : celui-ci ne supporte plus document.layers mais document.getElementById
  else if (document.getElementById) {
    document.getElementById("bulle").innerHTML=contenu;
    document.getElementById("bulle").style.top=finalPosY;
    document.getElementById("bulle").style.left=finalPosX;
    document.getElementById("bulle").style.visibility="visible";
  }
  
  timer = setTimeout(HideBulle,3000);
}
function getMousePos(e) {
  if (document.all) {
  posX=event.x+document.body.scrollLeft; //modifs CL 09/2001 - IE : regrouper l'évènement
  posY=event.y+document.body.scrollTop;
  }
  else {
  posX=e.pageX; //modifs CL 09/2001 - NS6 : celui-ci ne supporte pas e.x et e.y
  posY=e.pageY; 
  }
}
function HideBulle() {
	if (document.layers) {document.layers["bulle"].visibility="hide";}
	if (document.all) {document.all["bulle"].style.visibility="hidden";}
	else if (document.getElementById){document.getElementById("bulle").style.visibility="hidden";}
}

function InitBulle(ColTexte,ColFond,ColContour,NbPixel) {
	IB.ColTexte=ColTexte;IB.ColFond=ColFond;IB.ColContour=ColContour;IB.NbPixel=NbPixel;
	if (document.layers) {
		window.captureEvents(Event.MOUSEMOVE);window.onMouseMove=getMousePos;
		document.write("<LAYER name='bulle' top=0 left=0 visibility='hide'></LAYER>");
	}
	if (document.all) {
		document.write("<DIV id='bulle' style='position:absolute;top:0;left:0;visibility:hidden; z-index: 10;'></DIV>");
		document.onmousemove=getMousePos;
	}
	//modif CL 09/2001 - NS6 : celui-ci ne supporte plus document.layers mais document.getElementById
	else if (document.getElementById) {
	        document.onmousemove=getMousePos;
	        document.write("<DIV id='bulle' style='position:absolute;top:0;left:0;visibility:hidden; z-index: 10;'></DIV>");
	}

}
// *****************************************************************************

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédure permet de supprimer les espaces en début et fin de chaîne
// PARAMETRES : la chaîne à traiter
// RETOUR : la chaîne une fois traitée.
//**********************************************************************************************************************************
function js_trim(string)
{
   return string.replace(/(^\s*)|(\s*$)/g,'');
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédure permet de vérifier la validité d'une adresse email
// PARAMETRES : la chaîne à traiter
// RETOUR : booléen
//**********************************************************************************************************************************
function js_email_valide(email)
{ 
   // Déclaration de la variable de retour
   var etat_retour = true;
   email = email.toLowerCase();
   // Expression régulière de composition de la chaîne de caractère de l'email
   if(email.search(/^[^._-][a-z0-9._-]+[^._-]@[a-z0-9._-]+([a-z0-9]+[^._-])?[.-]+[a-z]{2,4}$/) == -1)
   {
      etat_retour = false;
   }
   // Pas d'espace dans la chaîne (l'expression régulière au-dessus laisse passer les espaces)
   if(email.search(/\s/) != -1)
   {
      etat_retour = false;
   }
   // Retour booléen
   return etat_retour;
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédure permet de lire la valeur d'un cookie
// PARAMETRES : le nom du cookie
// RETOUR : la valeur du cookie
//**********************************************************************************************************************************
function js_lire_cookie(CookieName)
{
   var CookieString = document.cookie;
   var CookieSet = CookieString.split(';');
   var SetSize = CookieSet.length;
   var CookiePieces;
   var ReturnValue = "";
   var x = 0;
   for(x = 0; (x < SetSize && ReturnValue == ""); x++)
   {
      CookiePieces = CookieSet[x].split ('=');
      if(CookiePieces[0].substring (0,1) == ' ')
      {
         CookiePieces[0] = CookiePieces[0].substring(1, CookiePieces[0].length);
      }
      if(CookiePieces[0] == CookieName)
      {
         ReturnValue = CookiePieces[1];
      }
   }
   return ReturnValue;
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédure permet d'écrire un cookie
// PARAMETRES : le nom du cookie, sa valeur et la durée de validité (en jours)
// RETOUR : aucun
//**********************************************************************************************************************************
function js_ecrire_cookie(nom,texte,jours)
{
   // lit la date
   var datecourante = new Date();
   var expires = new Date();
   expires.setTime(datecourante.getTime()+1000*60*60*24*jours);
   document.cookie = nom+'='+escape(texte)+'; expires='+expires.toGMTString();
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette fonction vérifie la validité d'une date
// PARAMETRES : date d, chaine de caractère
// RETOUR : booleén : vrai si la date est valide, faux si elle ne l'est pas.
//**********************************************************************************************************************************
function js_date_valide(d)
{
   // si la variable est vide on retourne faux
   if(d == "") return false;
   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; // Si pas bon, retourne faux
   // 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
   // Si l'année n'est composée que de 2 chiffres on complète automatiquement
   if(a < 1000)
   {
   if(a < 89) a+=2000; // Si a < 89 alors on ajoute 2000 sinon on ajoute 1900
   else a+=1900;
   }
   // 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]);
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette fonction recherche un élément dans un tableau
// PARAMETRES : tableau, valeur recherchée
// RETOUR : booleén
//**********************************************************************************************************************************
function js_est_dans_tableau(tableau, valeur) 
{
   // On créer un chaine depuis notre tableau
   var chaine = "|" + tableau.join("|") + "|";
   // On recherche l'élément dans cette chaine
   if (chaine.indexOf("|"+valeur+"|") == -1) return false;
   // Retour si OK
   return true;
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédure permet de vérifier la validité des valeurs saisies (valeurs entières ou décimales)
// PARAMETRES : valeur à tester
// RETOUR : aucun
//**********************************************************************************************************************************
function js_numerique_valide(valeur)
{
    // Expression régulière
    var reg = /^\d+[.]?\d*$/;
    // On vérifie
    if( (!reg.test(valeur)) && (valeur!="") ) return false;
    // Retour si OK
    return true;
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédure affecte un masque de saisie de type date sur le champ correspondant à l'évènement passé en paramètre
// PARAMETRES : évènement
// RETOUR : aucun
//**********************************************************************************************************************************
function js_masque_date(evt)
{
   // Cette Méthode permet de savoir si le navigateur de l'utilisateur est de type Netscape (Netscape, Mozilla, Firefox...)
   function js_local_methode_est_Netscape()
   {
      return (navigator.appName == "Netscape");
   }
   // Cette Méthode permet de savoir si le navigateur de l'utilisateur est de type Internet Explorer (IE, Opera...)
   function js_local_methode_est_IE()
   {
      return (navigator.appName == "Microsoft Internet Explorer");
   }
   // Cette méthode indique si le caractère testé est un numérique
   function js_local_methode_est_numerique(c)
   {
      return ((c >= "0") && (c <= "9"));
   }
   // Cette méthode indique si le caractère testé est un caractère de contrôle (code ASCII de 0 à 32)
   function js_local_methode_controle(c)
   {
      return (c < " ");
   }
   // Cette méthode construit la valeur de retour pour Internet Explorer et compatibles
   function js_local_methode_valeur_retour_IE(evt,test)
   {
      if (test || (evt.keyCode == 13))
      {
         return evt.keyCode;
      }
      return test;
   }
   // Cette méthode effectue les opérations de complétion automatique du texte saisi
   function js_local_methode_completion(evt,sep)
   {
      // Déclaration des variables locales
      var champ = null;
      var car = null;
      var pos = 0;
      // Traitement pour IE
      if(js_local_methode_est_IE())
      {
         car = evt.keyCode;
         champ = evt.srcElement;
      }
      // Traitement pour Netscape
      else if(js_local_methode_est_Netscape())
      {
         car = evt.which;
         champ = evt.target;
         if(champ.selectionStart == null) 
         {
            return;
         }
      }
      // Doit-on arrêter là ?
      if((champ == null) || (car == null) || (js_local_methode_controle(car = String.fromCharCode(car))) || (car == sep) || (champ.value == null) || ((champ.value.length != 2) && (champ.value.length != 5)))
      {
         return;
      }
      // Complétion
      champ.value += sep;
   }
   // Cette méthode utilise les méthodes précédentes afin d'appliquer le masque sur le champ choisi
   function js_local_masque_JJMMAA(evt)
   {
      // Déclaration des variables locales
      var car;
      var res = true;
      var complete = true;
      // Traitement pour Netscape
      if(js_local_methode_est_Netscape())
      {
         car = String.fromCharCode(evt.which);
         complete = res = ( (js_local_methode_est_numerique(car) || (car == "/")) && (!js_local_methode_controle(car)) );
      }
      // Traitement pour IE
      if(js_local_methode_est_IE())
      {
         car = String.fromCharCode(evt.keyCode);
         complete = res = evt.returnValue = js_local_methode_valeur_retour_IE(evt,js_local_methode_est_numerique(car) || (car == "/"));
      }
      // Doit-on appeler la méthode de complétion ?
      if(complete)
      {
         js_local_methode_completion(evt,"/");
      }
      // retour booléen
      return res;
   }
   // Création de l'objet et retour du résultat
   return js_local_masque_JJMMAA(evt);
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédure permet de communiquer avec le serveur web et ainsi lui envoyer des données et en récupérer
// PARAMETRES : script serveur visé, données à envoyer, méthode, mode (1 = synchrone, autres = asynchrone), fontion à éxécuter
// RETOUR : selon la dernière valeur
// Exemple : js_client_serveur("calculer.php", "citrons=3&kiwis=5&papailles=12", "POST", 0)
//**********************************************************************************************************************************
function js_client_serveur(script, donnees, methode, mode, fonction)
{
   // Déclaration de notre objet ajax
   var xhr_object = null;
   // On déclare la variable de résultat
   var resultat = null;
   // Contrôle de la compatibilité navigateur
   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 n'est pas compatible avec l'application");
      return false;
   }
   // Si on a choisi le mode synchrone
   if(mode == 1)
   {
      xhr_object.open(methode, script, false);
      if(methode.toUpperCase() == "POST") xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      xhr_object.send(donnees);
      resultat = xhr_object.responseText;
      if(typeof(fonction) == "function") fonction(resultat);
   }
   // Si on a choisi le mode asynchrone
   else
   {
      xhr_object.open(methode, script, true);
      xhr_object.onreadystatechange = function()
                                      {
                                         if(xhr_object.readyState == 4)
                                         {
                                            resultat = xhr_object.responseText;
                                            if(typeof(fonction) == "function") fonction(resultat);
                                         }
                                      }
      if(methode.toUpperCase() == "POST") xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      xhr_object.send(donnees);
   }
   // Retour du résultat
   return resultat;
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédure permet de récupérer la position d'un élément sur la page
// PARAMETRES : objet
// RETOUR : tableau(pos x, pos y)
//**********************************************************************************************************************************
function js_position_element(obj) 
{
   // Déclaration des variables de position
   var curleft = curtop = 0;
   if (obj.offsetParent) 
   {
     curleft = obj.offsetLeft
     curtop = obj.offsetTop
     while (obj = obj.offsetParent) 
     {
        curleft += obj.offsetLeft
        curtop += obj.offsetTop
     }
   }
   // Retour du tableau des coordonnées
   return [curleft,curtop];
}

//**********************************************************************************************************************************
// Fonction js_deplacer_element() : cette procédure permet le déplacement d'un élément
// Paramètres : id de l'élément à déplacer
// Retour : aucun
//**********************************************************************************************************************************
function js_deplacer_element(id_element)
{
   var diff_x = -1;
   var diff_y = -1;
   function position(e)
   {
      // Position de la souris sur la page
      var x = (navigator.appName.substring(0,3) == "Net") ? e.pageX : event.x+document.body.scrollLeft;
      var y = (navigator.appName.substring(0,3) == "Net") ? e.pageY : event.y+document.body.scrollTop;
      // Position du chat par l'angle haut gauche
      var x_chat = document.getElementById(id_element).offsetLeft;
      var y_chat = document.getElementById(id_element).offsetTop;
      // Différence
      diff_x = (diff_x == -1) ? x - x_chat : diff_x;
      diff_y = (diff_y == -1) ? y - y_chat : diff_y;
      // Nouvelle position du chat
      var position_x = x - diff_x;
      var position_y = y - diff_y;// + correcteur;
      // Nouvelle position
      document.getElementById(id_element).style.left = (position_x)+"px";
      document.getElementById(id_element).style.top = (position_y)+"px";
   }
   function figer_element()
   {
      document.onmousemove = null;
   }
   document.onmousemove = position;
   document.onmouseup = figer_element;
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédure permet d'ajouter le site en favori
// PARAMETRES : phrase, lien
// RETOUR : aucun
//**********************************************************************************************************************************
function favori(phrase,lien)
{
   if(window.sidebar)
   {
      window.sidebar.addPanel(phrase, lien,"");
   }
   else if( document.all )
   {
      window.external.AddFavorite(lien, phrase);
   }
   else
   {
      return true;
   }
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédure permet d'ajouter le site en page d'accueil
// PARAMETRES : lien
// RETOUR : aucun
//**********************************************************************************************************************************
function accueil(lien)
{
   if( document.all )
   {
      document.body.style.behavior = "url(#default#homepage)";
      document.body.setHomePage(lien);
   }
   else
   {
      alert("Votre navigateur n'est pas compatible avec cette fonction.");
   }
}

//************************************************************************
// js_formatter_telephone : cette fonction formatte une chaine en numéro
// de téléphone de ce type : XX.XX.XX.XX.XX
// Paramètres : chaine à formatter
// Retour : chaine formattée
//************************************************************************
function js_formatter_telephone(telephone_maison)
{
   // Nouvelle chaine
   var et_telephone_maison = "";
   // Chaine des séparateurs connus
   var expression = new RegExp('[-_.:,/!*\ ]','g');
   // Suppression des caractères spréciaux
   telephone_maison = telephone_maison.replace(expression,"");
   // Parcours des caractères
   for(var i = 0; i < telephone_maison.length; i++)
   {
      // Ajout d'un séparateur
      if(((i % 2) == 0) && (i < telephone_maison.length-1) && (i != 0))
      {
         et_telephone_maison += ".";
      }
      // Complétion de la chaine
      et_telephone_maison += telephone_maison.substr(i,1);
   }
   // Retour du résultat
   return et_telephone_maison;
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédure affiche la calculatrice
// PARAMETRES : nom du champ
// RETOUR : aucun
//**********************************************************************************************************************************
function js_afficher_calculatrice(nom_champ)
{
   calc_memory = nom_champ;
   var coords = js_position_element(document.getElementsByName(nom_champ)[0]);
   document.getElementById("calculatrice_dhtml").style.left = coords[0]-20;
   document.getElementById("calculatrice_dhtml").style.top = coords[1]-20;
   document.getElementById("calculatrice_dhtml").style.display = "block";
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédure ferme la calculatrice
// PARAMETRES : nom du champ
// RETOUR : aucun
//**********************************************************************************************************************************
function js_fermer_calculatrice()
{
   calc_memory = "";
   document.getElementById("calculatrice_dhtml").style.display = "none";
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédure ferme la calculatrice
// PARAMETRES : nom du champ
// RETOUR : aucun
//**********************************************************************************************************************************
function js_bouton_calculatrice(valeur)
{
   document.getElementsByName(calc_memory)[0].focus();
   document.getElementsByName(calc_memory)[0].value += valeur;
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédure efface le champ
// PARAMETRES : nom du champ
// RETOUR : aucun
//**********************************************************************************************************************************
function js_calculatrice_effacer()
{
   document.getElementsByName(calc_memory)[0].focus();
   document.getElementsByName(calc_memory)[0].value = "";
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédure gère les touches de la calculatrice
// PARAMETRES : évènement
// RETOUR : aucun
//**********************************************************************************************************************************
function js_gestion_calculatrice(e,nom_champ,nb_zeros)
{
   // Récupération du code touche
   var keycode = window.event ? e.keyCode : e.which;
   // Selon la touche pressée
   switch(keycode)
   {
      // Touhe entrée : Ferme la calcutatrice
      case 13:
         var resultat = (document.getElementsByName(nom_champ)[0].value == "") ? 0 : eval(document.getElementsByName(nom_champ)[0].value);
         document.getElementsByName(nom_champ)[0].value = js_format_decimal(""+resultat,nb_zeros);
         // Fermeture de la calculatrice
         js_fermer_calculatrice();
         return false;
      break;
      // Touche + : effectue un + et affiche la calculatrice
      case 107:
         js_afficher_calculatrice(nom_champ);
      break;
      // Touche - : effectue un - et affiche la calculatrice
      case 109:
         js_afficher_calculatrice(nom_champ);
      break;
      // Touche * : effectue un * et affiche la calculatrice
      case 106:
         js_afficher_calculatrice(nom_champ);
      break;
      // Touche / : effectue un / et affiche la calculatrice
      case 111:
         js_afficher_calculatrice(nom_champ);
      break;
   }
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette fonction transforme un nombre en décimal
// PARAMETRES : nombre, nombre de zéros après la virgule
// RETOUR : décimal nn.nn
//**********************************************************************************************************************************
function js_format_decimal(valeur, nbz)
{
    // Si la valeur est nulle, on retourne nul
    if(valeur=="")
    {
       return "";
       exit();
    }
    // On retourne la position du point
    var position = valeur.indexOf(".");
    // Si la valeur ne possède pas de point
    if(position==(-1))
    {
        // On retourne la valeur complétée de nbz zéros
        var retour = valeur+".";
        for(var i=1; i<=nbz; i++)
        { retour = retour+"0"; }
        return retour;
    }
    else
    {
        // On extrait la partie avant
        var avant = valeur.substr(0, parseInt(position));

        // On extrait la partie après
        var apres = valeur.substr(eval(position+1), valeur.length);
        
        // On formatte la valeur de retour
        var decimal = apres+"0000000000000000000000000000000000000000000";
        var apres = decimal.substr(0,nbz);
        var retour = avant+"."+apres;
        
        // On retourne la valeur
        return retour;
    }
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédurede vérifier la description d'un produit
// PARAMETRES : aucun
// RETOUR : aucun
//**********************************************************************************************************************************
function js_verif_infos_produit()
{
	// Get the editor instance that we want to interact with.
	var oEditor = FCKeditorAPI.GetInstance('description') ;
	valeur = oEditor.EditorDocument.body.innerHTML;
	//valeur=oEditor.EditorDocument.body.innerHTML.replace(#<\/?(span|strong|br).+?>#gi, '');

	// Get the editor contents in XHTML.
	valeur = valeur.replace('<br>', '');

	// On met à jour le champ caché contenant les id des catégories
	cats = '';
	for (var n=0 ; n<document.getElementById('cat').length ; n++)
	{
		if(n!=0)
			cats += '|';
		cats += document.getElementById('cat')[n].value;
	}
	document.getElementById('cats').value = cats;

	// Vérification des catégories
	if(document.getElementById('cat').length == 0 || document.getElementById('cats').value == '')
	{
		alert('Veuillez remplir la description du produit.');
		return false;
	}
	else
	{	
		// Vérification de la description
		if(valeur == '')	
		{
			alert('Veuillez remplir la description du produit.');
			return false;
		}
		else
			return true;
	}
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédurede permet de glisser un element entre deux liste de choix
// PARAMETRES : aucun
// RETOUR : aucun
//**********************************************************************************************************************************
function js_glisser_element(liste_principal, liste, action)
{
	element_existe = 0;
	switch(action)
	{
		case 'ajouter':
		{
			//alert(document.getElementById(liste_principal)[document.getElementById(liste_principal).selectedIndex].value);
			if ( document.getElementById(liste_principal).selectedIndex >=0 )
			{	
				
				for (var n=0 ; n<document.getElementById(liste).length ; n++)
				{ 
					if(document.getElementById(liste)[n].value == document.getElementById(liste_principal)[document.getElementById(liste_principal).selectedIndex].value )
						element_existe = 1;
				}
				
				if(element_existe == 0)
				{
					document.getElementById(liste).length++;
					document.getElementById(liste)[document.getElementById(liste).length-1].text=document.getElementById(liste_principal)[document.getElementById(liste_principal).selectedIndex].text;
					document.getElementById(liste)[document.getElementById(liste).length-1].value=document.getElementById(liste_principal)[document.getElementById(liste_principal).selectedIndex].value;					
				}
			}
			break;
		}
		
		case 'supprimer':
		{
			if ( document.getElementById(liste).selectedIndex >=0 )
			{	
				for (var n=document.getElementById(liste).selectedIndex;n<document.getElementById(liste).length-1;n++)
				{ 
					document.getElementById(liste)[n].text=document.getElementById(liste)[n+1].text; 
					document.getElementById(liste)[n].value=document.getElementById(liste)[n+1].value; 
				}
				document.getElementById(liste).length--;  				
			}
			break;
		}
	}
	
	//On met à jour le champ caché contenant les id des catégories
	cats = '';
	for (var n=0 ; n<document.getElementById(liste).length ; n++)
	{
		if(n!=0)
			cats += '|';
		cats += document.getElementById(liste)[n].value;
	}
	document.getElementById('cats').value = cats;	
}

//**********************************************************************************************************************************
// DESCRIPTION : Cette procédure permet la gestion de la couleur de fond de cellule des formulaires
// PARAMETRES : this, etat_(edit|blur)
// RETOUR : aucun.
//**********************************************************************************************************************************
function js_edit_saisie(item, etat)
{
  if(item.className.indexOf("_action") != -1 && etat != 'edit') item.className = item.className.substring(0, item.className.indexOf("_action"));
  else if(item.className.indexOf("_action") != -1 && etat == 'edit') {}
  else item.className = item.className + '_action';
}

//********************************************************************************************************************************
// JS_RAZ_SAISIE
// DESCRIPTION : Cette procédure permet d'initialiser le contenu d'un champ input texte
// PARAMETRES : this
// RETOUR : aucun
//********************************************************************************************************************************
function js_initialise_saisie(item, libelle, etat)
{
	if(item.value == libelle && etat=='edit') 
		item.value = "";
	else
		if(item.value == "" && etat == 'blur') item.value = libelle;
	
}

//**********************************************************************************************************************************
// DESCRIPTION : Ces procédures permettent la sélection d'élément
// PARAMETRES : objet
// RETOUR : aucun.
//**********************************************************************************************************************************
var selected;

function selectRowEffect(object, buttonSelect) {
  if (!selected) {
    if (document.getElementById) {
      selected = document.getElementById('defaultSelected');
    } else {
      selected = document.all['defaultSelected'];
    }
  }

  if (selected) selected.className = 'moduleRow';
  object.className = 'moduleRowSelected';
  selected = object;

// one button is not an array
  if (document.checkout_address.address[0]) {
    document.checkout_address.address[buttonSelect].checked=true;
  } else {
    document.checkout_address.address.checked=true;
  }
}

function rowOverEffect(object) {
  if (object.className == 'moduleRow') object.className = 'moduleRowOver';
}

function rowOutEffect(object) {
  if (object.className == 'moduleRowOver') object.className = 'moduleRow';
}

function check_form_optional(form_name) {
  var form = form_name;

  var firstname = form.elements['firstname'].value;
  var lastname = form.elements['lastname'].value;
  var street_address = form.elements['street_address'].value;

  if (firstname == '' && lastname == '' && street_address == '') {
    return true;
  } else {
    return check_form(form_name);
  }
}
//**********************************************************************************************************************************

