// JavaScript Document
// Inspiration du code sur ce lui de Rico



var Jvs = {Version: '1.0',prototypeVersion: parseFloat(Prototype.Version.split(".")[0] + "." + Prototype.Version.split(".")[1])};

if((typeof Prototype=='undefined') || Jvs.prototypeVersion < 0)
      throw("Jvs requires the Prototype JavaScript framework >= 1.3");


Number.prototype.NaN0 = function(){return isNaN(this)?0:this;}

Jvs.Element = {};
Jvs.Element.Effect = {};
Jvs.Popup = {};


/**
 * Class qui implémente le prototype pour faire du xmlhttpRequest.
 * Exemple : new Jvs.Request("get", "ajout_pub_xmlhttp.jsp", "chaction=reloadResponsableMarche&id_minisite=869&mp_id_marche=15", true, afficheResponsableMarcheFini, document.getElementById("divWait"));
 */
Jvs.Request = Class.create();
Jvs.Request.prototype = {

 	initialize: function(ma_methode, mon_url, mes_param, mon_synchrone, ma_fonction_finie, ma_div_wait, mes_parametres_fonction_finie)
  	{
  		this.ajaxRequest = null;

    	//j'initialise les champs de ma classe
    	this.ma_methode = ma_methode;
    	this.mon_url = mon_url;
    	if (mes_param != "") mes_param = mes_param+"&";
		this.mes_param = mes_param+"laDatePourNePasChargerDansLeCache="+new Date();
		this.mon_synchrone = mon_synchrone;
		this.ma_fonction_finie = ma_fonction_finie;
		this.responseText = "";
		this.ma_div_wait = ma_div_wait;
		this.mes_param_fonction_finie = mes_parametres_fonction_finie

		//j'affiche la div de traitement sur la page si elle est présente sur la page
		try
		{
			this.ma_div_wait.style.display = "";
			lancePlacementDivWait();
		}catch(e){;}


    	//je lance le traitement dans l'initialisation de la classe
    	this.lanceTratement();
  	},


	//fonction lancée à la fin du traitement
	finTraitement : function(request)
	{
		//je cahche la div de traitement sur la page si elle est présente sur la page
		try
		{
			this.ma_div_wait.style.display = "none";
		}catch(e){;}

		this.responseText = request.responseText;
		this.ma_fonction_finie(this.responseText,this.mes_param_fonction_finie);
	},

	lanceTratement : function()
	{
		this.ajaxRequest = new Ajax.Request(this.mon_url, {onComplete:this.finTraitement.bindAsEventListener(this), method: this.ma_methode , parameters:this.mes_param, asynchronous:this.mon_synchrone, contentType: 'application/x-www-form-urlencoded', encoding: 'UTF-8'});
	},

	getResponseText : function()
	{
		return this.responseText;
	},

	abortRequest : function()
	{
		if(this.ajaxRequest != null)
		{
			abort = true;
			this.ajaxRequest.transport.abort();
			this.ajaxRequest.transport.onreadystatechange = Prototype.emptyFunction;
		}
	}

}


/**
 * Class qui implémente de generer un numero unique en javascript.
 * Exemple : new Jvs.Guid();
 */
Jvs.Guid = Class.create();
Jvs.Guid.prototype =
{

	initialize: function()
  	{
  		this.monGuid = "";

  		var d = new Date();
		var end = d.getTime().toString();
		for(var i = end.length; i < 32; i++)
		{
	 		end += Math.floor(Math.random()*16).toString(16);
		}
	  	this.monGuid = end;
  	},


  	toString: function()
  	{
  		var value = this.monGuid;
  		var retour = "";
  		retour += value.substring(0,8).toUpperCase();
  		retour += "-";
  		retour += value.substring(8,12).toUpperCase();
  		retour += "-";
  		retour += value.substring(12,16).toUpperCase();
  		retour += "-";
  		retour += value.substring(16,20).toUpperCase();
  		retour += "-";
  		retour += value.substring(20,32).toUpperCase();
  		return retour;
  	}
}








/**
 * Permet de valider un formulaire
 */
Jvs.Validator = Class.create();
Jvs.Validator.prototype = {

 	initialize: function()
  	{
    	//j'initialise les champs de ma classe
    	this.continueTraitement = true;
  	},

  	getContinueTraitement: function()
  	{
  		return this.continueTraitement;
  	},

  	addFunction : function(nomFonction)
  	{
  		eval(nomFonction);
  	},

  	addValidation : function(objet,typeValidation,monAlert,fonctionAssociee)
  	{
  		//paramètres pour la fonction
  		var command = "";
    	var commandValue = "";

  		//je regarde si l'objet existe
  		if(!objet)
  		{
  			alert("JvsValidator : l'objet passé en paramètre n'existe pas");
  		}

  		//je récupère la commande et ses valeurs
  		var epos = typeValidation.search("=");
	    if(epos >= 0)
	    {
	    	command  = typeValidation.substring(0,epos);
	     	commandValue = typeValidation.substr(epos+1);
	    }
	    else
	    {
	     	command = typeValidation;
	    }

 		if(this.continueTraitement) //je rentre si je continue le traitement
 		{
 			switch(command)
		    {
		        case "required": //l'objet est obligatoire
		        case "req":
		        {
		        	if(eval(objet.value.length) == 0)
		           	{
		              	if(!monAlert || monAlert.length ==0)
		              	{
		              		monAlert = objet.name + " : Objet manquant";
		              	}//if
		              	alert(monAlert);
		              	this.continueTraitement = false;
		           	}//if
		        	break;
		        }

		        case "maxlength": //taille maximum
		       	{
		           	if(eval(objet.value.length) >  eval(commandValue))
		         	{
		               if(!monAlert || monAlert.length ==0)
		               {
		                 	monAlert = objet.name + " : "+commandValue+" caractère(s) maximum ";
		               }//if
		               alert(monAlert);
		               this.continueTraitement = false;
		           	}//if
		            break;
		      	}//case maxlen

        		case "minlength": //taille minimum
	           	{
	             	if(eval(objet.value.length) <  eval(commandValue))
	             	{
	               		if(!monAlert || monAlert.length ==0)
	               		{
	                 		monAlert = objet.name + " : " + commandValue + " caractère(s) minimum  ";
	               		}//if
	               		alert(monAlert);
	               		this.continueTraitement = false;
	             	}//if
	             	break;
	          	}//case minlen

	          	case "alphanumeric": //chaine alphanumérique
           		{
              		var charpos = objet.value.search("[^A-Za-z0-9]");
              		if(objet.value.length > 0 &&  charpos >= 0)
              		{
               			if(!monAlert || monAlert.length ==0)
                		{
                  			monAlert = objet.name+": Seuls les caractères alpha-numeriques sont autorisés ";
                		}//if
                		alert(monAlert);
                		this.continueTraitement = false;
              		}//if
              		break;
           		}//case alphanumeric

        		case "numeric": //seulement des chiffres
           		{
              		var charpos = objet.value.search("[^0-9]");
              		if(objet.value.length > 0 &&  charpos >= 0)
              		{
                		if(!monAlert || monAlert.length ==0)
                		{
                  			monAlert = objet.name+": Seuls les chiffres sont autorisés ";
                		}//if
                		alert(monAlert);
                		this.continueTraitement = false;
              		}//if
              		break;
           		}//numeric

	        	case "alphabetic": //seulement des lettres
	           	{
	             	var charpos = objet.value.search("[^A-Za-z]");
	             	if(objet.value.length > 0 &&  charpos >= 0)
	              	{
	                  	if(!monAlert || monAlert.length ==0)
	                	{
	                  		monAlert = objet.name+": Seules les lettres alphabétiques sont autorisées ";
	                	}//if
	                	alert(monAlert);
	                	this.continueTraitement = false;
	              	}//if
	              	break;
	          	}//alpha


				case "alnumhyphen":
				{
              		var charpos = objet.value.search("[^A-Za-z0-9\-_]");
              		if(objet.value.length > 0 &&  charpos >= 0)
              		{
                 		if(!monAlert || monAlert.length ==0)
                		{
                  			monAlert = objet.name+": Seuls les lettres, chiffres et tirets sont autorisés";
                		}//if
                		alert(monAlert);
                		this.continueTraitement = false;
              		}//if
					break;
				}//alnumhyphen

				case "email":
				{
					if ( !JvsTexte.isEmail(objet.value) )
        			{
        				if(!monAlert || monAlert.length ==0)
                		{
                  			monAlert = objet.name+": Seul un email est autorisé";
                		}//if
                		alert(monAlert);
                		this.continueTraitement = false;
        			}
        			break;
				}//email

				case "regexp" :
				{
					if(!objet.value.match(commandValue))
	        {
        		if(!monAlert || monAlert.length ==0)
            {
              monAlert = objet.name+": caractères non autorisés trouvés";
            }//if
            alert(monAlert);
            this.continueTraitement = false;
        	}
        	break;
				}

				case "date": //vérifie la date au format dd/mm/aaaa
				{
					if(!JvsDate.verifDate(objet.value))
					{
						if(!monAlert || monAlert.length ==0)
            {
               	monAlert = objet.name+": le format de la date n'est pas correct";
            }//if
            alert(monAlert);
            this.continueTraitement = false;
					}
					break;
				}

				case "time": //verifie le format de l'heure
				{
					if(!JvsDate.verifHeure(objet.value,commandValue))
					{
						if(!monAlert || monAlert.length ==0)
            {
                monAlert = objet.name+": le format de l'heure n'est pas correct";
            }//if
            alert(monAlert);
            this.continueTraitement = false;
					}
					break;
				}

				case "cp": //verifie le format du code postal
				{
					if(!JvsTexte.isCodePostal(objet.value))
					{
						if(!monAlert || monAlert.length ==0)
            {
                monAlert = objet.name+": le format du code postal n'est pas correct";
            }//if
            alert(monAlert);
            this.continueTraitement = false;
					}
					break;
				}
		    }//switch

		    //un fois à la fin, je remet le focus au champ si il y a eu une erreur
	 		if(this.continueTraitement == false)
	 		{
	 			try{objet.focus();} catch(e){;}
	 			try{fonctionAssociee();}catch(e){;}
	 		}
 		}//if(this.continueTraitement)
  	}//addValidation
}




/**
 * Permet de générer une fausse popup avec un effet de slide horizontal
 * Pour la fermer : ajouter parent.nomInstance.closebe(); dans le fenetre fille
 */
Jvs.Popup.Slide1 = Class.create();
Jvs.Popup.Slide1.prototype = {

	initialize: function(ma_page, mon_titrePage, mon_nom_iframe, mon_hauteur, ma_largeur)
  	{
    	//j'initialise les champs de ma classe
    	this.ma_page = ma_page;
    	this.mon_hauteur = mon_hauteur;
    	this.ma_largeur = ma_largeur;
    	this.mon_titrePage = mon_titrePage;
    	this.mon_nom_iframe = mon_nom_iframe;

    	//il y a aussi les champs de la methode
    	this.toclose = 0;
    	this.fpx = 0;
    	this.fpy = 0;
    	this.fpxc = 0;
    	this.fpxf = 0;
    	this.deplace = 0;
    	this.ftx = 320;
    	this.fty = 250;
    	this.ftxb = 200;
    	this.decax = 0;
    	this.decay = 0;

    	//pour debugger
    	this.nbResult = 0;

		this.CreerFenetreBe();
  	},

	//va permettre le deplacement de la div
	slidebe: function ()
	{
		if (this.toclose!=3)
		{
			this.fpx += this.fpxc;
		    if ((this.fpx > this.fpxf) && (this.toclose==0))
		    {
		    	this.fpx = this.fpxf;
		    	this.fpxc = 0;
		    	this.toclose = 3;
		    }
		    if (this.toclose==1)
		    	this.fpxc = this.fpxc-15;
		    $('fenetreSlide1').style.left = this.fpx;
		    if (this.fpx<-700)
		    {
		    	this.fpxc = 0;
		    	this.fpx = 700;
		    	this.toclose = 3;
		      	$(this.mon_nom_iframe).src = "";
		      	$('fenetreSlide1').style.visibility = "hidden";
		    }
		  }
	  	tempobe=setTimeout(this.slidebe.bind(this),5);
	},


	//fonction d'initialisation d'une nouvelle fenetre
	CreerPopupSlide1: function(fichier, titre, tailleX, tailleY, mon_zindex)
	{
		//je met mes param dans la classe
		this.ma_largeur = tailleX;
		this.mon_hauteur = tailleY;
		this.mon_titrePage = titre;
		this.ma_page = fichier;
		this.mon_zindex = mon_zindex;

		var hauteurFenetre = document.body.clientHeight;
		try
		{
			if( window.parent )
				hauteurFenetre = window.parent.document.body.clientHeight ;
        }
        catch(E){;}

		self.clearTimeout();
		self.clearInterval();
		this.fpy = document.body.scrollTop+(hauteurFenetre/2)-(this.mon_hauteur/2);
		if( this.fpy < 0 )
			 this.fpy = 0;
		var elem = document.getElementById("fenetreSlide1");
		elem.style.width = this.ma_largeur;
		elem.style.height = this.mon_hauteur;
		elem.innerHTML = this.getContenuWindow(0, 0, this.ma_largeur, this.mon_hauteur, this.mon_titrePage, this.ma_page,200);
		elem.style.top = this.fpy;
		elem.style.left = -700;
		this.fpx = -700;
		this.fpxf = (document.body.clientWidth/2)-(this.ma_largeur/2);
		this.fpxc = 100;
		this.toclose = 0;
		elem.style.zIndex = mon_zindex;
		elem.style.visibility = "visible";
		$(this.mon_nom_iframe).src = this.ma_page;
		this.attachEvenements();
	},


	//permet au démarage de lancer une fenetre par default
	CreerFenetreBe: function ()
	{
	  this.beWindow(0,0,500,100,this.mon_titrePage,this.ma_page);
	  this.slidebe();
	},


	//va écrire dans le document la creation de la fenetre
	beWindow: function(fpx,fpy,ftx,fty,ftitre,fichier)
	{
		this.ftx = 100;
		this.fty = 100;
		fchaine=''
		+'<div id="fenetreSlide1" style="position:absolute;visibility:hidden;z-index:50;top:'+fpy+'px;left:'+fpx+'px;width:'+ftx+'px;height:'+fty+'px;bgcolor:#0000ff;">'
			+this.getContenuWindow(fpx,fpy,ftx,fty,ftitre,fichier,this.ftxb);
		+'</div>';
		document.write(fchaine);
		this.attachEvenements();
	},


	//va gérer le mouvement de déplacemlent de la fenetre a l'aide de la souris
	Mouvement : function (event)
	{
		//var Xpos = event.clientX+document.body.scrollLeft;
		//var Ypos = event.clientY+document.body.scrollTop;
	  	var Xpos = Event.pointerX(event);
		var Ypos = Event.pointerY(event);

	  	if (this.deplace != 0)
	  	{
	  		if (this.deplace == 1)
	  		{
	  			this.decax= Xpos - this.fpx;
	  			this.decay = Ypos - this.fpy;
	  			this.deplace=2;
	  		}
	 	  	this.fpx = Xpos-this.decax;
	 	  	this.fpy = Ypos-this.decay;

	 	  	document.all.fenetreSlide1.style.top = this.fpy;
	 	  	document.all.fenetreSlide1.style.left = this.fpx;
	 	  	return false;
	  	}
	},


	//permet d'attacher les évenements sur la div en passant this en param
	attachEvenements: function () //je vais attacher mes evenements, une fois la div ecrite
	{
		//fermer la fenêtre
		JvsUtils.ajoutEventOnElement($('JvsPopupSlide1_tg'),"click",this.closebe.bindAsEventListener(this));

		//le deplacement de la fenêtre
		Event.observe(document, "mousemove", this.Mouvement.bind(this));
		JvsUtils.ajoutEventOnElement($('JvsPopupSlide1_titre'),"mousedown",this.cliquerDown.bindAsEventListener(this));
        Event.observe(document, "mouseup", this.cliquerUp.bindAsEventListener(this));
		JvsUtils.ajoutEventOnElement($('JvsPopupSlide1_titre'),"mouseup",this.cliquerUp.bindAsEventListener(this));
	},


	//gère le onmousedown de la souris sur la barre de titre
	cliquerDown: function ()
	{
		this.deplace = 1;
		return false;
	},


	//gère le onmouseup de la souris sur la barre de titre
	cliquerUp: function ()
	{
		this.deplace = 0;
		return false;
	},


	//donne le contenu html de la div à écrire
	getContenuWindow: function (fpx,fpy,ftx,fty,ftitre,fichier,ftxb)
	{
		var fchaine2 = ''
		+'<div id="JvsPopupSlide1_window" class="JvsPopupSlide1_window" style="width:'+(ftx)+'px;height:'+(fty)+'px">'
			+'<div id="JvsPopupSlide1_hg" class="JvsPopupSlide1_hg"></div>'
			+'<div id="JvsPopupSlide1_hd" class="JvsPopupSlide1_hd" style="left:'+(ftx-6)+'px"></div>'
			+'<div id="JvsPopupSlide1_bg" class="JvsPopupSlide1_bg" style="top:'+(fty-6)+'px"></div>'
			+'<div id="JvsPopupSlide1_bd" class="JvsPopupSlide1_bd" style="top:'+(fty-6)+'px;left:'+(ftx-6)+'px"></div>'
			+'<div id="JvsPopupSlide1_h" class="JvsPopupSlide1_h" style="width:'+(ftx-10)+'"></div>'
			+'<div id="JvsPopupSlide1_b" class="JvsPopupSlide1_b" style="top:'+(fty-6)+'px;width:'+(ftx-10)+'px;">&nbsp;</div>'
			+'<div id="JvsPopupSlide1_g" class="JvsPopupSlide1_g" style="height:'+(fty-10)+'"></div>'
			+'<div id="JvsPopupSlide1_d" class="JvsPopupSlide1_d" style="left:'+(ftx-6)+'px;height:'+(fty-10)+'"></div>'
		+'</div>'
		+'<div id="JvsPopupSlide1_titre" class="JvsPopupSlide1_titre" style="width:'+(ftx)+'px">'
		  	+'<div class="JvsPopupSlide1_tg" id="JvsPopupSlide1_tg" alt="Fermer cette fenêtre"></div>'
		   	+'<div class="JvsPopupSlide1_tm" id="JvsPopupSlide1_tm" style="width:'+(ftxb-25)+'px">'
		   		+'<table CELLPADDING=0 CELLSPACING=0 border=0 width="100%" height="21"><tr><td valign=middle><FONT class="JvsPopupSlide1_textetitre"><B>&nbsp;&nbsp;&nbsp;'+ftitre+'</B></FONT></td></tr></table>'
		   	+'</div>'
		   	+'<div class="JvsPopupSlide1_td" style="left:'+(ftxb-4)+'px"></div>'
		+'</div>'
		+'<div id="JvsPopupSlide1_interieur" style="position:absolute;top:27px;left:6px;width:'+(ftx-12)+'px;height:'+(fty-12)+'px;">'
			+'<iframe name="'+this.mon_nom_iframe+'" id="'+this.mon_nom_iframe+'" TOP=0 LEFT=0 WIDTH='+(ftx-12)+' HEIGHT='+(fty-12)+' border=0 FRAMEBORDER=0 src="'+fichier+'"></iframe>'
		+'</div>'
		+'</div>'
		return fchaine2;
	},


	//permet de fermer la fenetre en slide
	closebe : function ()
	{
		this.fpxc = 80;
		this.toclose = 1;
	}


}





/**
* Effet de fading sur un element
*/
Jvs.Element.Effect.Fading1 = Class.create();
	//exemple : new Jvs.Element.Effect.Fading1(document.getElementById("tabloMenuTheme"),0,100,250);
Jvs.Element.Effect.Fading1.prototype =
{
   	//initialaisation des paramètres
   	initialize: function(elemFading, fadingDebut, fadingFin, millisec)
   	{
      	//je charge mes paramètres
       	this.elemFading        	= $(elemFading);
       	this.fadingDebut    	= fadingDebut;
       	this.fadingFin        	= fadingFin;
       	this.millisec           = millisec;
		this.currentFading		= 0;
    },


	//la function recurssive qui effectue le fading
   	play: function ()
   	{
	   //speed for each frame
		var speed = Math.round(this.millisec / 100);
		var timer = 0;

		//determine the direction for the blending, if start and end are the same nothing happens
		if(this.fadingDebut > this.fadingFin)
		{
			for(i = this.fadingDebut; i >= this.fadingFin; i--)
			{
				this.currentFading = i;
				setTimeout(this.changeOpac.bind(this), timer * speed);
				//setTimeout("changeOpac(" + i + ",'" + this.elemFading.id + "'," + this.fadingDebut + ")",(timer * speed));
				timer--;
			}
		}
		else if(this.fadingDebut < this.fadingFin)
		{

			for(i = this.fadingDebut; i <= this.fadingFin; i++)
			{
				this.currentFading = i;
				setTimeout(this.changeOpac.bind(this,i), timer * speed);
				//setTimeout("changeOpac(" + i + ",'" + this.elemFading.id + "'," + this.fadingDebut + ")",(timer * speed));
				timer++;
			}
		}
   	},

	//fonction qui modifie l'opacité d'un element
	changeOpac: function (opacity)
	{
		var id = this.elemFading.id;
		var opacStart = this.fadingDebut;
		var object = document.getElementById(id).style;
		object.opacity = (opacity / 100);
		object.MozOpacity = (opacity / 100);
		object.KhtmlOpacity = (opacity / 100);
		object.filter = "alpha(opacity=" + opacity + ")";
		if(opacity == opacStart)
			document.getElementById(id).style.visibility = "visible";
	},

	//permet de stopper le fading
	pause: function()
	{
		this.elemFading.style.visibility = "hidden";
	}
}






/**
 * Class qui permet d'ajouter un effet d'accordéon en verticalSlide sur une div.
 */
Jvs.Element.Effect.VerticalSlide = Class.create();
Jvs.Element.Effect.VerticalSlide.prototype = {

   	//constructeur
   	//exemple : new Jvs.Element.Effect.VerticalSlide(document.getElementById("tabloMenuTheme"),document.getElementById("divMenuTheme"),150,15);
   	initialize: function(elemEvent, elemSlide, duration, steps, fonctionRecurssive)
	{
		//je charge mes paramètres
		this.elemEvent		= $(elemEvent)
		this.elemSlide 		= $(elemSlide)
      	this.stepDuration 	= Math.round(duration/this.steps) ;
		this.fonctionRecurssive = fonctionRecurssive;
		this.minHeight 		= 1;
      	this.maxHeight		= 0;
      	this.sensDeplace	= "";
		this.tailleDeplace 	= 0;
		this.steps 			= steps;
		this.currentSteps 	= 0;
		this.defaultOverflow = elemSlide.style.overflow;

      	//je recupère la taille max de ma div
      	if(this.elemSlide.style.display == '')
      	{
      		this.maxHeight = this.elemSlide.offsetHeight;
      	}
      	else
      	{
			this.elemSlide.style.display = '';
			this.maxHeight = this.elemSlide.offsetHeight;
			this.elemSlide.style.height = "1px";
      	}
		this.tailleDeplace = (this.maxHeight - this.minHeight) / this.steps; //calcul de la taille de déplacemant à chaque étape
      	this.elemSlide.style.overflow = "hidden";
		this.elemEvent.style.cursor = "pointer";

      	//j'ajoute l'element onclick sur l'element
		JvsUtils.ajoutEventOnElement(this.elemEvent,"click",this.verticatSlide.bindAsEventListener(this));


   	},

   	verticatSlide: function(e)
	{
		if (this.isFinished())
		{
         	// just in case there are round errors or such...
         	//this.elemSlide.style.height = this.minHeight+"px";
			this.currentSteps = 0;
			if(this.sensDeplace == "+")
				this.elemSlide.style.overflow = this.defaultOverflow;
			this.sensDeplace = "";

			return;
      	}
      	else if(this.currentSteps == 0)
      	{
      		this.elemSlide.style.overflow = "hidden";
      	}

		//je passe une étape suivante donc j'incrémente mon nombre d'étape courante
		this.currentSteps ++;

      	//je calcul le sens de deplacement de la div (ouverture ou fermeture)
      	if(this.sensDeplace == "") //je ne connais pas le sens
      	{
			if(this.elemSlide.offsetHeight == 1)
				this.sensDeplace = "+";
			else
				this.sensDeplace = "-";
      	}

      	if(this.timer)
         	clearTimeout(this.timer);

         var newTaille = 0;
         if(this.sensDeplace == "-")
         {
         	newTaille = (this.maxHeight - this.minHeight) - parseInt(this.tailleDeplace * this.currentSteps);
         }
		 else if(this.sensDeplace == "+")
		 {
			 newTaille = this.minHeight + parseInt(this.tailleDeplace * this.currentSteps);
		 }

      	this.resizeBy(newTaille);

		//appel de la fonction recurssive
		try
		{
			this.fonctionRecurssive();
		}catch(e){;}

      	this.timer = setTimeout(this.verticatSlide.bind(this), this.stepDuration);

   },

	//permet de savoir si c'est fini
   isFinished: function()
   {
      return this.currentSteps == this.steps;
   },


   resizeBy: function(newTaille)
   {
      if(newTaille == 0) newTaille = 1;
	  this.elemSlide.style.height = newTaille + "px";
   }

};



Jvs.Element.Effect.FixScreenPosition = Class.create();
Jvs.Element.Effect.FixScreenPosition.prototype = {

   	//constructeur
   	//exemple : new Jvs.Element.Effect.FixScreenPosition(document.getElementById("tabloMenuTheme"),150,15);
   	initialize: function(elemEvent, positionX, positionY)
	{
		//je charge mes paramètres
		this.elemEvent		= $(elemEvent)
		this.positionX 		= positionX;
      	this.positionY		= positionY;

      	//je verifie que la position soit relative
      	this.elemEvent.style.position = "absolute";

      	//je lance la fonction qui place la div
		this.fixeObjet();
	},

	fixeObjet: function()
	{
		this.elemEvent.style.left = this.positionX+"px";
		this.elemEvent.style.top = (this.positionY + document.body.scrollTop)+"px";

		//je rappele la fonction en boucle
		this.timer = setTimeout(this.fixeObjet.bind(this), 50);
	}
}// fin prototype FixScreenPosition








Jvs.Element.Effect.Dragable = Class.create();
Jvs.Element.Effect.Dragable.prototype = {

	//constructeur
  initialize: function(maDivToClick,maDivToMove,pFctInitDragMetier,pFctDoDragMetier,pFctEndDragMetier)
	{
		this.maDivToClick		= $(maDivToClick);
		this.maDivToMove		= $(maDivToMove);
		this.testToMove			= false;
		this.ie  = (document.all)? true:false;
		this.ns4 = (document.layers)? true:false;
		this.ns6 = (document.getElementById)? true:false;

		this.fctInitDragMetier = pFctInitDragMetier;
		this.fctDoDragMetier	 = pFctDoDragMetier;
		this.fctEndDragMetier  = pFctEndDragMetier;

		//j'ajoute les evenements sur les div
		this.maDivToClick.style.cursor = "move";
		JvsUtils.ajoutEventOnElement(this.maDivToClick,"mousedown",this.fctMoveDiv.bindAsEventListener(this));
		JvsUtils.ajoutEventOnElement(this.maDivToClick,"mouseup",this.endDrag.bind(this));
		JvsUtils.ajoutEventOnElement(this.maDivToClick,"mousedown",this.initDrag.bind(this));

	},

	fctMoveDiv : function(e)
	{
		if (this.ie)
		{
			//Récupération de la position de la souris
			window.lastX = event.clientX;
			window.lastY = event.clientY;
			// lance doDrag tant que l'on appuie sur le bouton de la souris en la bougeant
			JvsUtils.ajoutEventOnElement(document,"mousemove",this.doDrag.bindAsEventListener(this));
			// lance endDrag quand on relache le bouton de la souris
			JvsUtils.ajoutEventOnElement(document,"mouseup",this.endDrag.bindAsEventListener(this));
		}
		else if (this.ns4)
		{
			//Récupération de la position de la souris
			window.lastX = e.pageX;
			window.lastY = e.pageY;
			// lance doDrag tant que l'on appuie sur le bouton de la souris en la bougeant
			document.captureEvents(Event.MOUSEMOVE)
			document.onmousemove = this.doDrag.bindAsEventListener(this);
			// lance endDrag quand on relache le bouton de la souris
			document.captureEvents(Event.MOUSEUP)
			document.onmouseup = this.endDrag.bindAsEventListener(this);
		}
		else if (this.ns6)
		{
			//Récupération de la position de la souris
			window.lastX = e.clientX;
			window.lastY = e.clientY;
			// lance doDrag tant que l'on appuie sur le bouton de la souris en la bougeant
			JvsUtils.ajoutEventOnElement(window,"mousemove",this.doDrag.bindAsEventListener(this));
			// lance endDrag quand on relache le bouton de la souris
			JvsUtils.ajoutEventOnElement(window,"mouseup",this.endDrag.bindAsEventListener(this));
		}

	},

	initDrag : function(e)
	{
		this.testToMove = true;

		try
		{
			this.fctInitDragMetier(e,this.maDivToMove);
		}//try
		catch(E){;}
	},

	/*
	Le programme sait donc maintenant ce qu'il doit faire pour chaque évenement.
	Maintenant, il ne nous reste plus qu'à paramétrer le déplacement du div :
	*/
	doDrag : function (e)
	{
		if(this.testToMove == true)
		{
			if (this.ie)
			{
				// Calcul de l'écart de position de la souris
				var difX = event.clientX-window.lastX;
				var difY = event.clientY-window.lastY;
				//Récupération de la position du div et ajout de l'écart de position de la souris
				var newX1 = parseInt(this.maDivToMove.offsetLeft)+difX;
				var newY1 = parseInt(this.maDivToMove.offsetTop)+difY;
				// Assignation des nouvelles coordonnées au div
				this.maDivToMove.style.left = newX1+"px";
				this.maDivToMove.style.top = newY1+"px";
				//Assignation de l'anciènne position de la souris
				window.lastX = event.clientX;
				window.lastY = event.clientY;
			}
			else if (this.ns4)
			{
				// Calcul de l'écart de position de la souris
				var difX = e.pageX-window.lastX;
				var difY = e.pageY-window.lastY;
				//Récupération de la position du div et ajout de l'écart de position de la souris
				var newX1 = parseInt(this.maDivToMove.left)+difX;
				var newY1 = parseInt(this.maDivToMove.top)+difY;
				// Assignation des nouvelles coordonnées au div
				this.maDivToMove.left = newX1;
				this.maDivToMove.top = newY1;
				//Assignation de l'anciènne position de la souris
				window.lastX = e.pageX;
				window.lastY = e.pageY;
			}
			else if (this.ns6)
			{
				// Calcul de l'écart de position de la souris
				var difX = e.clientX-window.lastX;
				var difY = e.clientY-window.lastY;
				//Récupération de la position du div et ajout de l'écart de position de la souris
				var newX1 = parseInt(this.maDivToMove.offsetLeft)+difX;
				var newY1 = parseInt(this.maDivToMove.offsetTop)+difY;
				// Assignation des nouvelles coordonnées au div
				this.maDivToMove.style.left=newX1+"px";
				this.maDivToMove.style.top=newY1+"px";
				//Assignation de l'anciènne position de la souris
				window.lastX=e.clientX;
				window.lastY=e.clientY;
			}
		}

		try
		{
			this.fctDoDragMetier(e,this.maDivToMove);
		}//try
		catch(E){;}
	},

	/*
	Et pour finir, voici la fonction qui traite le relachement du bouton :
	*/
	endDrag : function(e)
	{
		this.testToMove = false;
		if (this.ie || this.ns4)
		{
			//Réinitialisation du onmousemove
			this.maDivToClick.detachEvent('onmousemove',this.fctMoveDiv.bindAsEventListener(this));
		}
		else if (this.ns6)
		{
			//Réinitialisation du onmousemove
			this.maDivToClick.onmousemove='';
		}

		try
		{
			this.fctEndDragMetier(e,this.maDivToMove);
		}//try
		catch(E){;}
	}
};



var JvsFormulaire =
{

	/*
	 * Fonction getElementByAttribut
	 */
	getElementByAttribute: function (aAttribute,aValue,aInElement)
	{
	  var ElementVerifier;
	  var Elements = new Array();
	  function SearchElement(aElement)
		{
		  if(aElement==null||aElement==undefined)return
		  if(ElementVerifier(aElement))
			{
			  Elements[Elements.length]=aElement;
			}
			SearchElement(aElement.firstChild);
			SearchElement(aElement.nextSibling);
		}

		if(aInElement==undefined)aInElement=document.body;

		str="try{if(ElementCourant.getAttribute('"+aAttribute+"')=='"+aValue+"'){return true;}else{return false}}catch(ex){return false;}";
		ElementVerifier=function(aElement)
		{
		  	ElementCourant = aElement;
			if(aElement.nodeName == '#text')return false;
			var E = new Function(str);
			if(E()){return true;}else{return false};
		}
		SearchElement(aInElement);
		return Elements;
	},

	formToUrl: function( formulaire )
	{
		var retour = "";
		for(var i=0;i<formulaire.length;i++)
		{
			var o = formulaire.elements[i];
			if(o.type == "checkbox")
			{
				if(o.checked)
					retour += ( encodeURIComponent(o.name)+"="+encodeURIComponent(o.value)+"&" )
			}
			else
     	{
        	if(o.type == "radio")
         	{
           	if(o.checked)
                	retour += ( encodeURIComponent(o.name)+"="+encodeURIComponent(o.value)+"&" )
         	}
         	else
           	retour += ( encodeURIComponent(o.name)+"="+encodeURIComponent(o.value)+"&" )
       }
		}
		if(retour != "")
			retour = retour.substring(0,retour.length-1);
		return retour;
	}
}




//**** Utils

var JvsUtils = {

	// ajoute un evenement sur un element
	ajoutEventOnElement: function( elem, evnmt, fct )
	{
		JvsElement.ajoutEventOnElement(elem, evnmt, fct);
	},


	//retour la description d'un formulaire dans une chaine
	formToUrl: function( formulaire )
	{
		return JvsFormulaire.formToUrl(formulaire);
	},

	formToUrlRestreint: function( formulaire, nomChampAEvite )
	{
		var retour = "";
		for(var i=0;i<formulaire.length;i++)
		{
			var o = formulaire.elements[i];

			if(escape(o.name).indexOf(nomChampAEvite) == -1)
			{
				if(o.type == "checkbox")
				{
					if(o.checked)
						retour += ( escape(o.name)+"="+escape(o.value)+"&" )
				}
				else
				{
					if(o.type == "radio")
					{
						if(o.checked)
							retour += ( escape(o.name)+"="+escape(o.value)+"&" )
					}
					else
						retour += ( escape(o.name)+"="+escape(o.value)+"&" )
				}
			}
		}
		if(retour != "")
			retour = retour.substring(0,retour.length);
		return retour;
	},

	isIE: function ()
	{
		var navig_agt = navigator.userAgent.toLowerCase();
		var navig_ie = ((navig_agt.indexOf("msie")!=-1) && (navig_agt.indexOf("opera")==-1));
		return navig_ie;
	},


	/*
	 * Fonction qui permet de ne pas perdre la session.
	 * duree en milliseconde
	 */
	noPerteSession : function ( duree )
	{
		new Jvs.Request("get", "/intranet/modele.jsp", "", true, function nofunction(){}, "");
		//var mapPageNoPerteSession = window.open ('/intranet/modele.jsp', 'Modele', 'top=100000, left=100000, height=1, width=1, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, directories=no, status=no');
		//mapPageNoPerteSession.close();
		setTimeout('JvsUtils.noPerteSession('+duree+');',duree);
	},

	centreObjet : function (objet)
	{
		if (navigator.appName=="Microsoft Internet Explorer")
		{
			
			offsetx = (document.body.clientWidth / 2) - ( parseInt(objet.offsetWidth) / 2) + document.body.scrollLeft;
			offsety = (document.body.clientHeight / 2) - ( parseInt(objet.offsetHeight) / 2) + document.body.scrollTop;
		}
		else
		{
			offsetx = (document.body.clientWidth / 2) - ( parseInt(window.getComputedStyle(objet, null).width) / 2) + document.body.scrollLeft;
			offsety = (document.body.clientHeight / 2) - ( parseInt(window.getComputedStyle(objet, null).height) / 2) + document.body.scrollTop;
		}

		//alert(offsetx+" "+offsety);
		objet.style.left = offsetx + "px";
		objet.style.top = offsety + "px";
	},

	/**
	 * Permet de cacher tous les select d'une div
	 */
	cacheElementsSelect : function (condition)
	{
		var objSelect = document.getElementsByTagName("select");
		var strAffiche = "";
		if(condition == true) strAffiche= "none";
		if(objSelect)
		{
			try
			{
				if(objSelect.length)
				{
					for(i=0;i<objSelect.length;i++)
					{
						//alert(strAffiche);
						objSelect[i].style.display = strAffiche;
					}
				}
				else
					objSelect.style.display = strAffiche;
			}//try
			catch(e)
			{
				;
			}
		}
	},

	/**
	 * Permet de cacher tous les select d'un document
	 * à utiliser si il y a des iframes
	 */
	cacheElementsSelectRecurssif : function (condition,win)
	{
		var objSelect = win.document.getElementsByTagName("select");
		var strAffiche = "";
		if(condition == true) strAffiche= "none";
		if(objSelect)
		{
			try
			{
				if(objSelect.length)
				{
					for(i=0;i<objSelect.length;i++)
					{
						objSelect[i].style.display = strAffiche;
					}
				}
				else
					objSelect.style.display = strAffiche;
			}//try
			catch(e)
			{
				;
			}
		}

		//traitement des pages dans les pages
		var frames = win.frames;
		for (var i = 0; i < frames.length; i++)
		{
  			//je traite en recursif chaque frame
  			JvsUtils.cacheElementsSelectRecurssif(condition,frames[i]);
		}
	},

	/*
	 * Permet de centrer une popup
	 */
	popupCenter : function (haut,larg,url,nom,option)
    {
        var top = (screen.height-haut)/2;
        var left = (screen.width-larg)/2;
        var allOptions = "height="+haut+",width="+larg+",top="+top+",left="+left;
        if(option != "")
            allOptions += ","+option;
        return window.open(url,nom,allOptions);
    },

	/*
	 * Permet d'afficher ou non un objet selon sa situation actuelle
	 */
	displayObjet : function (elem, dispalyOblig)
	{
		if(dispalyOblig)
		{
			if(dispalyOblig == "")
				elem.style.display = '';
			else if(dispalyOblig == "none")
				elem.style.display = 'none';
		}
		else
		{
			if(elem.style.display == "")
				elem.style.display = 'none';
			else
				elem.style.display = '';
		}
	},

	/**
	 * Méthode qui permet d'encoder une URL
	 * Exemple : JvsUtils.URLEncode(String URLAEncoder);
	*/
	URLEncode : function (urlToEncode)
	{
		// The Javascript escape and unescape functions do not correspond
		// with what browsers actually do...
		var SAFECHARS = "0123456789" +					// Numeric
						"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
						"abcdefghijklmnopqrstuvwxyz" +
						"-_.!~*'()";					// RFC2396 Mark characters
		var HEX = "0123456789ABCDEF";

		var encoded = "";
		for (var i = 0; i < urlToEncode.length; i++ ) {
			var ch = urlToEncode.charAt(i);
		    if (ch == " ") {
			    encoded += "+";				// x-www-urlencoded, rather than %20
			} else if (SAFECHARS.indexOf(ch) != -1) {
			    encoded += ch;
			} else {
			    var charCode = ch.charCodeAt(0);
				if (charCode > 255) {
				    alert( "Unicode Character '"
	                        + ch
	                        + "' cannot be encoded using standard URL encoding.\n" +
					          "(URL encoding only supports 8-bit characters.)\n" +
							  "A space (+) will be substituted." );
					encoded += "+";
				} else {
					encoded += "%";
					encoded += HEX.charAt((charCode >> 4) & 0xF);
					encoded += HEX.charAt(charCode & 0xF);
				}
			}
		} // for

		return encoded;
	},

	/**
	 * Méthode qui permet de décoder une URL
	 * Exemple : JvsUtils.URLDecode(String URLADécoder);
	*/

	URLDecode : function (urlToDecode)
	{
	   // Replace + with ' '
	   // Replace %xx with equivalent character
	   // Put [ERROR] in output if %xx is invalid.
	   var HEXCHARS = "0123456789ABCDEFabcdef";
	   var encoded = document.URLForm.F2.value;
	   var urlToDecode = "";
	   var i = 0;
	   while (i < encoded.length) {
	       var ch = encoded.charAt(i);
		   if (ch == "+") {
		       urlToDecode += " ";
			   i++;
		   } else if (ch == "%") {
				if (i < (encoded.length-2)
						&& HEXCHARS.indexOf(encoded.charAt(i+1)) != -1
						&& HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) {
					urlToDecode += unescape( encoded.substr(i,3) );
					i += 3;
				} else {
					alert( 'Bad escape combination near ...' + encoded.substr(i) );
					urlToDecode += "%[ERROR]";
					i++;
				}
			} else {
			   urlToDecode += ch;
			   i++;
			}
		} // while

	   return urlToDecode;
	},

	/**
	 * Permet de copier du texte dans la presse papier
	 */
	copyToClipboard : function (meintext)
	{
	 	//pour firefox
	 	if(!window.clipboardData)
	 	{
    		window.clipboardData =
    		{
        		setData : function(mode,content)
        		{
            		var clipboard = document.body;
            		var flashclipboard = clipboard.flashclipboard;
            		if(flashclipboard == null)
            		{
                		flashclipboard = document.createElement('div');
                		clipboard.flashclipboard = flashclipboard;
                		clipboard.appendChild(flashclipboard);
            		}
            		flashclipboard.innerHTML = '<embed src="/intranet/swf/clipboard.swf" FlashVars="clipboard='+encodeURIComponent(content)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
        		}
    		}
		}
	 	window.clipboardData.setData("Text", meintext);
	},


	/**
	 * Générateur de mot de passe automatique
	 */
	genererMotDePasse: function (taille, accepteChiffre, accepteLettre, accepteMajuscule)
	{
		var retour = "";
		var lesChiffres 			= "0123456789";
		var lesMinuscules 			= "abcdefghijklmnopqrstuvwxyz";
		var lesMajuscules 			= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		var chaineCaracteres 		= "";

		if(accepteChiffre)		chaineCaracteres += lesChiffres;
		if(accepteLettre)		chaineCaracteres += lesMinuscules;
		if(accepteMajuscule)	chaineCaracteres += lesMajuscules;


		for (var i = 0; i < taille; i++)
		{
			retour += chaineCaracteres.charAt(Math.floor(Math.random() * chaineCaracteres.length))
		}
		return retour;
	}






};


var JvsElement = {

	getPosition:  function (/* HTMLElement */node)
	{
      	var pos = "relative";
      	if(node.style.position == "absolute")
      		pos = "absolute";
      	if(pos == "absolute")
      		return JvsElement.getAbsolutePosition(node)
      	else
      		return JvsElement.getRelativePosition(node);
	},

	//retourne la position absolue sur le document
	getAbsolutePosition: function (/* HTMLElement */node)
	{
		var r = { left: node.offsetLeft, top: node.offsetTop };
	    if (node.offsetParent)
	    {
	      var tmp = JvsElement.getPosition(node.offsetParent);
	      r.left += tmp.left;
	      r.top  += tmp.top;
	    }
    	return r;
	},

	//retourne la position relative sur le document
	getRelativePosition: function (/* HTMLElement */node)
	{
	    var x = 0;
	    var y = 0;
	    if(JvsUtils.isIE())
	    {
	    	//alert(node.currentStyle.paddingLeft);
	    	//je recupère la position de l'élément
	    	x = node.offsetLeft;
	    	x += ((node.currentStyle?(parseInt(node.currentStyle.marginLeft)).NaN0():0));
	    	x += (node.currentStyle?(parseInt(node.currentStyle.borderLeftWidth)).NaN0():0);

	    	y = node.offsetTop;
	    	y += ((node.currentStyle?(parseInt(node.currentStyle.marginTop)).NaN0():0));
	    	y += (node.currentStyle?(parseInt(node.currentStyle.borderTopWidth)).NaN0():0);

	    	//je rajoute la border du parent si il existe
	    	while(node.parentNode && node.tagName != "BODY")
	    	{
	    		node = node.parentNode;
	    		//alert(node.parentNode.tagName);

	    		x += (node.currentStyle?(parseInt(node.currentStyle.marginLeft)).NaN0():0);
	    		x += (node.currentStyle?(parseInt(node.currentStyle.borderLeftWidth)).NaN0():0);

	    		y += (node.currentStyle?(parseInt(node.currentStyle.marginTop)).NaN0():0);
	    		y += (node.currentStyle?(parseInt(node.currentStyle.borderTopWidth)).NaN0():0);
	    	}

	    	//je rajoute les scrollbar

	    }
	    else
	    {
	    	x = node.offsetLeft + (document.defaultView.getComputedStyle?(parseInt(document.defaultView.getComputedStyle(node,null)["marginLeft"])).NaN0():0);
	    	y = node.offsetTop + (document.defaultView.getComputedStyle?(parseInt(document.defaultView.getComputedStyle(node,null)["marginTop"])).NaN0():0);
	    }
	    return {left:x,top:y};
	},


	//retourne la position absolue sur le document
	getPositionAvecAbsolute: function (/* HTMLElement */node)
	{
		var position = JvsElement.getPosition(node);
		//Si un de mes parents est en position absolute, le top et le left se font sur leur position donc je dois supprimer cela
		var parentCourant = node.parentNode;
		var differenceParentAbsoluteTop = 0;
		var differenceParentAbsoluteLeft = 0;
		while(parentCourant)
		{
			//alert(parentCourant.tagName+" '"+parentCourant.id+"'");
			if(parentCourant.tagName == "DIV" && parentCourant.style.position == "absolute")
			{
				differenceParentAbsoluteLeft 	+= 	JvsElement.getPosition(parentCourant).left;
				differenceParentAbsoluteTop 	+= 	JvsElement.getPosition(parentCourant).top;
			}
			parentCourant = parentCourant.parentNode
		}
		position.top = position.top - differenceParentAbsoluteTop;
		position.left = position.left - differenceParentAbsoluteLeft;
		return position;
	},


	//retourne la position relative de la souris sur le document
	getCursorPosition: function(e,paramAbsolute)
	{
		if (!e) {e = window.event}
		var cursor = {left:0, top:0};

		if(e.pagex || e.pageY) //firefox
		{
			if(paramAbsolute == "absolute")
			{
				cursor.left = e.pageX - document.body.scrollLeft;
				cursor.top = e.pageY - document.body.scrollTop;
			}
			else
			{
				cursor.left = e.pageX;
				cursor.top = e.pageY;
			}
		}
		else // IE
		{
			var de = document.documentElement;
			var db = document.body;
			if(paramAbsolute == "absolute")
			{
				cursor.left = e.clientX;
				cursor.top = e.clientY;
			}
			else
			{
				cursor.left = e.clientX + document.body.scrollLeft;
				cursor.top = e.clientY + document.body.scrollTop;
			}
			//alert("left : "+cursor.left+" top : "+cursor.top);
		}
		return cursor;
	},


	getDimensions: function (/* HTMLElement */node,/* boolean */avecPadding )
	{
		var w = 0;
	    var h = 0;
	    var ancienDisplay = node.style.display;
	    //je la rend visible pour avour les mesures
	    node.style.display = '';
	    w = node.offsetWidth;
	    h = node.offsetHeight;
	    if(!JvsUtils.isIE())
	    {
	    	//alert(document.defaultView.getComputedStyle(node,null)["borderLeftWidth"]);
	    	if(avecPadding == true)
	    	{
	    		w -= parseInt(document.defaultView.getComputedStyle(node,null)["paddingLeft"]).NaN0() *2;
	    		h -= parseInt(document.defaultView.getComputedStyle(node,null)["paddingTop"]).NaN0() *2;
	    	}
	    	w -= parseInt(document.defaultView.getComputedStyle(node,null)["borderLeftWidth"]).NaN0() *2;
	    	h -= parseInt(document.defaultView.getComputedStyle(node,null)["borderTopWidth"]).NaN0() *2;
	    }
	     node.style.display = ancienDisplay;
	    return {width:w, height: h};
	},

	// ajoute un evenement sur un element
	ajoutEventOnElement: function( elem, evnmt, fct )
	{
		if (elem.addEventListener)
		{
  			elem.addEventListener(evnmt, fct, false);
  			return true;
 		}
		else if (elem.attachEvent)
		{
  			var r = elem.attachEvent("on" + evnmt, fct);
  			return r;
 		}
		else
		{
  			alert("handler could not be attached");
 		}
	},

	supprimeEventOnElement : function(elem, evnmt, fct)
	{
		if ( elem.detachEvent )
		{
			elem.detachEvent( 'on'+evnmt, elem[evnmt+fct] );
       		elem[evnmt+fct] = null;
		}
		else
		{
			elem.removeEventListener( evnmt, fct, false );
		}
	}

}



/**
 * Contient les traitement sur les chaines de caracteres.
 */
var JvsTexte = {

	getCountGSM : function (texte)
	{
		var GSM = new Array(210);
		GSM[0]=10;
		GSM[1]=13;
		GSM[2]=27;
		GSM[3]=32;
		GSM[4]=33;
		GSM[5]=34;
		GSM[6]=35;
		GSM[7]=36;
		GSM[8]=37;
		GSM[9]=38;
		GSM[10]=39;
		GSM[11]=40;
		GSM[12]=41;
		GSM[13]=42;
		GSM[14]=43;
		GSM[15]=44;
		GSM[16]=45;
		GSM[17]=46;
		GSM[18]=47;
		GSM[19]=48;
		GSM[20]=49;
		GSM[21]=50;
		GSM[22]=51;
		GSM[23]=52;
		GSM[24]=53;
		GSM[25]=54;
		GSM[26]=55;
		GSM[27]=56;
		GSM[28]=57;
		GSM[29]=58;
		GSM[30]=59;
		GSM[31]=60;
		GSM[32]=61;
		GSM[33]=62;
		GSM[34]=63;
		GSM[35]=64;
		GSM[36]=65;
		GSM[37]=66;
		GSM[38]=67;
		GSM[39]=68;
		GSM[40]=69;
		GSM[41]=70;
		GSM[42]=71;
		GSM[43]=72;
		GSM[44]=73;
		GSM[45]=74;
		GSM[46]=75;
		GSM[47]=76;
		GSM[48]=77;
		GSM[49]=78;
		GSM[50]=79;
		GSM[51]=80;
		GSM[52]=81;
		GSM[53]=82;
		GSM[54]=83;
		GSM[55]=84;
		GSM[56]=85;
		GSM[57]=86;
		GSM[58]=87;
		GSM[59]=88;
		GSM[60]=89;
		GSM[61]=90;
		GSM[62]=95;
		GSM[63]=97;
		GSM[64]=98;
		GSM[65]=99;
		GSM[66]=100;
		GSM[67]=101;
		GSM[68]=102;
		GSM[69]=103;
		GSM[70]=104;
		GSM[71]=105;
		GSM[72]=106;
		GSM[73]=107;
		GSM[74]=108;
		GSM[75]=109;
		GSM[76]=110;
		GSM[77]=111;
		GSM[78]=112;
		GSM[79]=113;
		GSM[80]=114;
		GSM[81]=115;
		GSM[82]=116;
		GSM[83]=117;
		GSM[84]=118;
		GSM[85]=119;
		GSM[86]=120;
		GSM[87]=121;
		GSM[88]=122;
		GSM[89]=161;
		GSM[90]=163;
		GSM[91]=164;
		GSM[92]=165;
		GSM[93]=167;
		GSM[94]=191;
		GSM[95]=196;
		GSM[96]=197;
		GSM[97]=198;
		GSM[98]=199;
		GSM[99]=201;
		GSM[100]=209;
		GSM[101]=214;
		GSM[102]=216;
		GSM[103]=220;
		GSM[104]=223;
		GSM[105]=224;
		GSM[106]=228;
		GSM[107]=229;
		GSM[108]=230;
		GSM[109]=232;
		GSM[110]=233;
		GSM[111]=236;
		GSM[112]=241;
		GSM[113]=242;
		GSM[114]=246;
		GSM[115]=248;
		GSM[116]=249;
		GSM[117]=252;
		GSM[118]=425;
		GSM[119]=894;
		GSM[120]=915;
		GSM[121]=916;
		GSM[122]=920;
		GSM[123]=923;
		GSM[124]=926;
		GSM[125]=928;
		GSM[126]=931;
		GSM[127]=934;
		GSM[128]=936;
		GSM[129]=937;
		GSM[130]=946;
		GSM[131]=8192;
		GSM[132]=8193;
		GSM[133]=8194;
		GSM[134]=8195;
		GSM[135]=8196;
		GSM[136]=8197;
		GSM[137]=8198;
		GSM[138]=8199;
		GSM[139]=8200;
		GSM[140]=8201;
		GSM[141]=8202;
		GSM[142]=8203;
		GSM[143]=8208;
		GSM[144]=8209;
		GSM[145]=8210;
		GSM[146]=8211;
		GSM[147]=8212;
		GSM[148]=8213;
		GSM[149]=8216;
		GSM[150]=8217;
		GSM[151]=8218;
		GSM[152]=8219;
		GSM[153]=8220;
		GSM[154]=8221;
		GSM[155]=8222;
		GSM[156]=8223;
		GSM[157]=8249;
		GSM[158]=8250;
		GSM[159]=8260;
		GSM[160]=8356;
		GSM[161]=8486;
		GSM[162]=8491;
		GSM[163]=8544;
		GSM[164]=8548;
		GSM[165]=8553;
		GSM[166]=8556;
		GSM[167]=8557;
		GSM[168]=8558;
		GSM[169]=8559;
		GSM[170]=8560;
		GSM[171]=8564;
		GSM[172]=8569;
		GSM[173]=8572;
		GSM[174]=8573;
		GSM[175]=8574;
		GSM[176]=8575;
		GSM[177]=8709;
		GSM[178]=8710;
		GSM[179]=8719;
		GSM[180]=8721;
		GSM[181]=8722;
		GSM[182]=8725;
		GSM[183]=8727;
		GSM[184]=8758;
		GSM[185]=9001;
		GSM[186]=9002;
		GSM[187]=9651;
		GSM[188]=12296;
		GSM[189]=12297;
		GSM[190]=12;
		GSM[191]=91;
		GSM[192]=92;
		GSM[193]=93;
		GSM[194]=94;
		GSM[195]=123;
		GSM[196]=124;
		GSM[197]=125;
		GSM[198]=126;
		GSM[199]=448;
		GSM[200]=708;
		GSM[201]=710;
		GSM[202]=732;
		GSM[203]=8323;
		GSM[204]=8364;
		GSM[205]=8726;
		GSM[206]=8739;
		GSM[207]=8764;
		GSM[208]=8963;
		GSM[209]=65374;

		var GSM_D= new Array(20);
		GSM_D[0]=12;
		GSM_D[1]=91;
		GSM_D[2]=92;
		GSM_D[3]=93;
		GSM_D[4]=94;
		GSM_D[5]=123;
		GSM_D[6]=124;
		GSM_D[7]=125;
		GSM_D[8]=126;
		GSM_D[9]=448;
		GSM_D[10]=708;
		GSM_D[11]=710;
		GSM_D[12]=732;
		GSM_D[13]=8323;
		GSM_D[14]=8364;
		GSM_D[15]=8726;
		GSM_D[16]=8739;
		GSM_D[17]=8764;
		GSM_D[18]=8963;
		GSM_D[19]=65374;

		Array.prototype.exists = function(x)
		{
    		for(var i = 0; i < this.length; i++)
    		{
        		if (this[i] == x) return true;
    		}
    		return false;
		}

		var doubleCount = 0;
		var isGSM = true;
		var retour = 0;

		//je fais le calcul
		for(var i=0; i<texte.length; i++)
		{
			if(GSM.exists(texte.charCodeAt(i)))
			{
				if(GSM_D.exists(texte.charCodeAt(i)))
					doubleCount++;
			}
			else
			{
				doubleCount = 0;
				isGSM = false;
			}
		}// ends for

		retour = texte.length + doubleCount;
		return retour;
	},


	/**
	 * Test si la chaine en parametre est un email valide.
	 */
	isEmail : function (chaine)
	{
		var char_interdit = " é'èçà;:!öôûüùëê,";
		var valid = true;
		// présence d'au moins un point
		if(chaine.indexOf(".")==-1)
			valid = false;
		//on compte le nombre de @ et si different de 1 --> mauvais email
		cmp = 0;
		i=0;
		while(cmp<2 && i<chaine.length)
		{
			if(chaine.charAt(i)=="@")
				cmp++;
			i++;
		}//while
		if(cmp!=1)
			valid = false;
		//on verifie la présence d'aucun charactère interdit
		for(i=0;i<char_interdit.length;i++)
		{
			if(chaine.indexOf(char_interdit.charAt(i))!=-1)
			       valid = false;
		}//for j
		return valid;

		//return /^[\w\._]+@[\w]{2,}[.][A-Za-z]{1,6}$/.test(chaine);
	},

	/*
	 * Test si la chaine est un code postal
	 * retourne un booleen
	 */
	isCodePostal: function (entier)
	{
  		var cle = /^[0-9]{5}$/;
  		if (cle.exec(entier) == null)
  			return false;
  		else
  			return true;
	},

	/*
	 * Test si la chaine est un entier
	 * retourne un booleen
	 */
	isEntier: function (entier)
	{
  		var cle = /^[0-9]+$/;
  		if (cle.exec(entier) == null)
  			return false;
  		else
  			return true;
	},

	/*
	 * Supprime tous les espaces en debut et fin de texte
	 * retourne un texte
	 */
	trim: function (texte)
	{
		texte = texte.replace(/(^\s*)|(\s*$)/g,"");
		return texte;
	},

	/*
	 * Retourne ce qui se trouve derriere le point
	 */
	getExtension : function (texte)
	{
		var retour = "";
		try
		{
			retour = texte.substring(texte.lastIndexOf(".")+1,texte.length);
		}
		catch(e){;}
		return retour;
	}
};




/**
 * Permet d'avoir des fonctions utiles sur des tableaux
 */
var JvsTablo = {


	/**
	 * Retourne le type de retour pour les box selected du formulaire
	 */
	getBoxSelected : function (formulaire,nomBox,typeRetour)
	{
		var objet = document.forms[formulaire];
		var box = objet.elements[nomBox];
		var retour = "";
		if(box) //si elle existe
		{
			if(box.length) //plusieurs box
			{
				for( i=0;i<box.length;i++)
				{
					if(box[i].checked == true)
					{
						if(typeRetour == "id")
							retour += (box[i].id+";");
						else if (typeRetour == "value")
							retour += (box[i].value+";");
					}
				} //for
			}
			else //une seule box
			{
				if(box.checked == true)
				{
					if(typeRetour == "id")
						retour += (box.id+";");
					else if (typeRetour == "value")
						retour += (box.value+";");
				} //if
			}
		}//if(objet.elements["box"])

		if(retour != "")//je retire le dernier ;
		{
			retour = retour.substring(0,retour.length - 1);
		}

		//on retourne le resultat
		return retour;
	},



	// trouve la position dans le tableau, decale de 1 a partir de l'element a effacer et supprime le dernier element du tableau
	deleteObjet: function (paramTablo, paramElemASupp)
	{
 		var effaceme = -1
    	for (var i=0;((i<paramTablo.length)&&(effaceme == -1));i++)
        {
        	if (paramTablo[i] == paramElemASupp)
            	effaceme = i;
        }
    	if (effaceme != -1)
        {
        	for (var i=effaceme;i<paramTablo.length;i++)
            {
            	paramTablo [i] = paramTablo[i+1];
            }
        	paramTablo.pop();
        }
	},


	getIndexInArray: function(paramTablo, paramObjetATrouver)
	{
		var trouve = -1;
		for (var i=0;((i<paramTablo.length)&&(trouve == -1));i++)
		{
			if (paramTablo[i] == paramObjetATrouver)
            	trouve = i;
		}
		return trouve;
	},

	//extension du prototype d'un array pour ajouter la méthode remove
	Array_Remove: function(elem)
	{
	 	for (var i=0; i<this.length; i++)
	 		if(elem == this[i])
	 			this.splice(i, 1);
 	}



};
//extension du prototype des tableaux
Array.prototype.remove = JvsTablo.Array_Remove;



/**
 * JvsUtils sur les dates.
 */
var JvsDate = {

	/**
	 * Vérifie que la date en parametre soit correcte. format : 10/10/2010
	 */
	verifDate : function(chaine)
	{
		if(chaine.length != 10)
			return false

		var jour  = chaine.substring(0,2);
		var mois  = chaine.substring(3,5);
		var annee = chaine.substring(6,10);

		if(mois>00 && mois <13)
		{
			//alert(jour+" "+dernier_jour_mois(mois,annee));
			if(jour>0 && jour <= JvsDate.dernierJourMois(mois,annee))
			{
				return true;
			}// if jour
			else
				return false;
		}//if mois
		else
			return false;
	},

	verifHeure : function (chaine,format)
	{
		var retour = true;
		var regexpHeure = /^[0-9]{2}:[0-9]{2}$/;
		if(format == "HH24:MI")
		{
			if(chaine.length != 5)
				return false;
			if(chaine.substring(2,3) != ":")
				return false;
			if(chaine.match(regexpHeure))
			{
				if(parseInt(chaine.substring(0,2)) > 23)
					return false;
				if(parseInt(chaine.substring(3,5)) > 60)
					return false;
			}
			else
				return false;
		}
		else
			return false;
		return retour;
	},


	/**
	 * renvoi le dernier jour du mois, en fonction de l'année
	 */
 	dernierJourMois : function(mois,annee)
	{
		if(mois == '01' || mois == '03' || mois == '05' || mois == '07' || mois == '08' || mois == '10' || mois == '12')
			return 31;
		else
			if( mois != 02)
				return 30;
			else
				if((annee%4)==0)
					return 29;
				else
					return 28;
	},

	/**
	 * Fonction qui permet de comparer 2 dates
	 * renvoi 	0  si les deux dates sont égales
	 * 			1  si date1 > date2
	 * 			-1 si date1 < date2
	 */
	compareDate : function (date1,date2)
	{
		var jour1  = date1.substring(0,2);
		var mois1  = date1.substring(3,5);
		var annee1 = date1.substring(6,10);

		var jour2  = date2.substring(0,2);
		var mois2  = date2.substring(3,5);
		var annee2 = date2.substring(6,10);

		if(annee2 <= annee1)
		{
			if(annee2 == annee1)
			{
			  	if (mois2 <= mois1)
				{
					if (mois2 == mois1)
					{
						 if(jour2 <= jour1)
						 {
						 	if(jour2 == jour1)
								return 0;
							else
								return 1;
						}
						else
							return -1;
					}
					else
						return 1;
				}
				else
					return -1;
			}
			else
				return 1;
		}
		else
			return -1;
	},

	/**
	 * Retourne la date du jour
	 */
	getDateToday : function()
	{
		var date = new Date();
		var retour = "";

		var jour = date.getDate();
		if(jour < 10) jour = "0"+jour;
		var mois = date.getMonth() + 1;
		if(mois < 10) mois = "0"+mois;
		var annee = date.getYear();
		if (navigator.appName =='Netscape') annee = annee + 1900 ;
		var heure = date.getHours();
		if (heure < 10) heure = "0"+heure;
		var minute = date.getMinutes();
		if (minute < 10) minute = "0"+minute;
		var seconde = date.getSeconds();
		if (seconde < 10) seconde = "0"+seconde;

		retour = jour+"/"+mois+"/"+annee+" "+heure+":"+minute+":"+seconde;
		return retour
	}


}


