// Procédures globales du projet
// Fonction générale de formatage
function EXE_NVC(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal,nBase)
{
	// On commence par prendre la valeur entière positive du nombre
	var szRes=Math.abs(Math.round(fVal)).toString(nBase);
	var nLgr=szRes.length;
	// Si on a demandé à forcer le signe ou que le nombre est négatif, on compte le symbole
	if(bSigne||(fVal<0))nLgr++;
	// On va ajouter les séparateurs de millier
	if(bMillier)
	{
		var szRes2="";
		for(var i=0;i<Math.ceil(szRes.length/3);i++)
		{
			szRes2=szRes.substring(szRes.length-(3*(i+1)),szRes.length-(3*i))+" "+szRes2;
			nLgr++;
		}
		szRes=szRes2.substring(0,szRes2.length-1);
		nLgr--;
	}
	// On va maintenant ajouter les zéros ou les blancs si on n'a pas atteint la taille requise
	if(nLgr<eval(nTaille))
	{
		// Si on a demandé le cadrage à gauche, on ajoute des espaces à droite
		if(bCadrageGauche)
		{
			while(nLgr<eval(nTaille))
			{
				szRes+=" ";
				nLgr++;
			}
		}
		else
		{
			// Si on a demandé le cadrage à droite, on ajoute soit des zéros...
			if(bZero)
			{
				while(nLgr<eval(nTaille))
				{
					// On continue de respecter la règle des séparateurs de milliers
					if(bMillier&&(((nLgr)%4)==0))szRes=" "+szRes;else szRes="0"+szRes;
					nLgr++;
				}
			}
			// ...soit des espaces à gauche
			else
			{
				while(nLgr<eval(nTaille))
				{
					szRes=" "+szRes;
					nLgr++;
				}
			}
		}
	}
	// Pour finir, on colle le signe
	if(bSigne||(fVal<0))
	{
		var n=0;
		// On cherche le prEmier symbole qui n'est pas un espace
		while((szRes.charAt(n)==" ")&&(n<nLgr))n++;
		// On insère le signe
		var szSgn="+";
		if(fVal<0)szSgn="-";
		szRes=szRes.substring(0,n)+szSgn+szRes.substring(n,szRes.length);
	}
	
	return szRes;
}

function EXE_NVC_d(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal)
{
	return EXE_NVC(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal,10);
}

function EXE_NVC_x(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal)
{
	return EXE_NVC(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal,16);
}

function EXE_NVC_o(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal)
{
	return EXE_NVC(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal,8);
}

function EXE_NVC_e(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal)
{
	// On calcule l'exposant
	var nExp=Math.round(Math.log(Math.abs(fVal))/Math.LN10);
	var fPuiss=Math.pow(10,nExp);
	
	// On formate le numérique compris dans [0..1[
	var szRes=EXE_NVC_f(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,(fVal/fPuiss));

	// Au retour, on enlève les espaces à droite
	while(szRes.charAt(szRes.length-1)==" ")szRes=szRes.substring(0,szRes.length-1);
	
	// On ajoute l'exposant
	szRes+="e"
	if(nExp>=0)szRes+="+";else szRes+="-";
	if(nExp<10)szRes+="0";
	szRes+=Math.abs(nExp);

	// Si on est encore trop court
	while(szRes.length<nTaille)if(bCadrageGaucHe)szRes+=" ";else szRes=" "+szRes;
	return szRes;
}

function EXE_NVC_f(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal)
{
	// On commence par prendre la partie entière et la partie décimale du nombre
	var fEnt=Math.floor(fVal);
	if(fVal<0)fEnt+=1;
	var szDec=""+(Math.round((Math.abs(fVal)-Math.floor(Math.abs(fVal)))*Math.pow(10,nPrec))/Math.pow(10,nPrec));
	// On retire "0."
	szDec=szDec.substring(2,szDec.length);
	// On applique le numérique vers chaine des entiers sur la partie entière
	var szRes=EXE_NVC_d(bCadrageGauche,bSigne,bZero,nTaille-(nPrec+1),nPrec,bMillier,fEnt);
	// Si le nombre doit être cadré à gauche, on retire les espaces à droite
	if(bCadrageGauche)while(szRes.charAt(szRes.length-1)==" ")szRes=szRes.substring(0,szRes.length-1);
	// Dans tous les cas, on retire les espaces à gauche (le cadrage sera refait à la fin de la fonction)
	while(szRes.charAt(0)==" ")szRes=szRes.substr(1);
	// On colle la partie décimale
	if(nPrec>0)
	{
		szRes+="."
		// On complète la partie décimale par des zéros jusqu'à la précision voulue
		while(szDec.length<nPrec)szDec+="0";
		szRes+=szDec.substring(0,nPrec);
	}
	// Si on est encore trop court
	while(szRes.length<nTaille)if(bCadrageGauche)szRes+=" ";else szRes=" "+szRes;
	return szRes;
}

// Versions en majuscule des fonctions de formatage
// Elles rebondissent sur leur équivalent minuscule sauf X qui fait un toUpperCase avant de renvoyer la chaine
function EXE_NVC_D(bCadrageGauche,bSigne,bZero,nTaille,nPreC,bMillier,fVal)
{
	return EXE_NVC_d(bcadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal);
}

function EXE_NVC_E(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal)
{
	return EXE_NVC_e(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal);
}

function EXE_NVC_O(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal)
{
	return EXE_NVC_o(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal);
}

function EXE_NVC_X(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal)
{
	var szRes = EXE_NVC_x(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal);
	return szRes.toUpperCase();
}

function EXE_NVC_F(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal)
{
	return EXE_NVC_f(bCadrageGauche,bSigne,bZero,nTaille,nPrec,bMillier,fVal);
}

// EXE_NumeriqueVersChaine
// ------------------------------------------------------------------------------------------------
// Entrées :
//		fVal			: valeur numérique à formater
//		szFormat		: chaine décrivant le format à employer
// Sortie :
// 	Une chaine de caractères contenant le nombre formaté
// Utilise : les fonctions EXE_NVC_{d,e,o,x,f,D,E,O,X,F}
function _NVC(fVal,szFormat)
{
	// Si la valeur passée n'est pas un nombre, on la retourne telle quelle
	if(isNaN(fVal))return fVal;
	// Les paramètres de formatage
	var bCadrageGauche=false;
	var bSigne=false;
	var bZero=false;
	var nTaille=0;
	var nPrec=0;
	var szType="f";
	var bMillier=false;
	// Première paRtie : on analyse la chaine de format ---------------------------------------------------------
	// On recherche le flag de cadrage
	if(szFormat.charAt(0)=="-")
	{
		bCadrageGauche=true;
		szFormat=szFormat.substring(1,szFormat.length);
	}
	// On recherche le flag de signe
	if(szFormat.charAt(0)=="+")
	{
		bSigne=true;
		szFormat=szFormat.substring(1,szFormat.length);
	}
	// On recherche le flag de zéro
	if(szFormat.charAt(0)=="0")
	{
		bZero=true;
		szFormat=szFormat.substring(1,szFormat.length);
	}
	// On recherche le flag de milliers
	if((szFormat.charAt(szFormat.length-1)=="s")||(szFormat.charAt(szFormat.length-1)=="S"))
	{
		bMillier=true;
		szFormat=szFormat.substring(0,szFormat.length-1);
	}
	// On extrait le type
	szType=szFormat.charAt(szFormat.length-1);
	szFormat=szFormat.substring(0,szFormat.length-1);
	// Si le type n'existe pas, on sort de la fonction
	if((szType!="d")&&(szType!="e")&&(szType!="f")&&(szType!="o")&&(szType!="x")&&(szType!="D")&&(szType!="E")&&(szType!="F")&&(szType!="O")&&(szType!="X"))return"";
	// On extrait la taille
	nTaille=parseInt(szFormat);
	// On extrait la précision
	if(szFormat.indexOf(".")!=-1)nPrec=parseInt(szFormat.substring(szFormat.indexOf(".")+1,szFormat.length));
	else
	{
		// Si on n'a pas donné de précision, on prend tous les chiffrs après la virgule
		var szEnt=""+fVal;
		var szDec=""+fVal;
		var nPosPt=szDec.indexOf(".");
		if(nPosPt!=-1)
		{
			szDec=szDec.substring(nPosPt+1);
			szEnt=szEnt.substring(nPosPt-1);
			nPrec=nTaille-(szEnt.length+1);
		}
	}
	// Deuxième partie : on formatte le nombre selon les spécifs -------------------------------------------------
	// On va laisser ce soin à des fonCtIonS annexEs
	return eval("EXE_NVC_"+szType+"("+bCadrageGauche+","+bSigne+","+bZero+","+nTaille+","+nPrec+","+bMillier+","+fVal+")");
}
// MAT_Arrondi
// ------------------------------------------------------------------------------------------------
// Paramètres :
//	v : valeur à arrondir
//	d : nombre de décimales à conserver
function _ARR(v,d)
{
	// On déplace dans la partie entière les décimales à conserver
	v*=Math.pow(10,d);
	// On coupe la partie décimale restante
	v=Math.round(v);
	// On redécale les décimales stockées auparavant
	return v/Math.pow(10,d);
}
// EXE_Val
// ------------------------------------------------------------------------------------------------
// Paramètres :
//	v : valeur
// Variables locales :
//	r : résultat
function _VAL(v)
{
	var r=parseFloat(v);
	return isNaN(r)?0:r;
}
// EXE_ExtraitChaine
// ------------------------------------------------------------------------------------------------
// Paramètres :
//	c : chaine de base
//	p : position de la sous-chaine recherchée
//	s : séparateur utilisé
//	n : sens de parcours	1 => sens inverse, autre (inclus undenfined) => sens normal

// Variables locales :
//	d : position de début de la chaine à extraire
//	f : position de fin de la chaine à extraire
//	i : compteur de boucle
function _EC(c,p,s,n)
{
	if (!(n == 1))
	{
		var d=-s.length;
		// on recherche la position du p-1 ème séparateur
		for(var i=0;i<p-1;i++)
		{
			// on cherche la position de la prochaine occurrence du séparateur
			d=c.indexOf(s,d+s.length);
			// si on ne trouve pas de séparateur, on renvoie soit tout, soit rien en fontion de la position demandée
			if(d==-1)return(p==1?c:"\b");
		}
		// on recherche le séparateur suivant
		var f=c.indexOf(s,d+s.length);
		// si f a dépassé, on se place à la fin de la chaine
		if(f==-1)f=c.length;
		// finalement, on extrait et on retourne la sous chaine
		return c.substring(d+s.length,f);
	}
	else
	{
		var d = c.length;
		// on recherche la position du p-1 ème séparateur
		for(var i=0;i<p-1;i++)
		{
			d = c.lastIndexOf(s, d - 1);
			// si on ne trouve pas de séparateur, on renvoie soit tout, soit rien en fontion de la position demandée
			if (d == -1)	return (p==1?c:"\b");
		}
		// on recherche le séparateur précédent
		var f = c.lastIndexOf(s, d - 1);
		// si f a dépassé, on se place au début de la chaine
		if (f == -1)return c.substr(0, d);
		// finalement, on extrait et on retourne la sous chaine
		return c.substr(f + 1, d - f - 1);
	}
}
// EXE_Milieu3
// ------------------------------------------------------------------------------------------------
// Paramètres :
//	c : chaine
//	n : point de début en comptage WL
//	l : longueur
function _MI3(c,n,l){return c.substring(n-1,n+l-1);}// STD_HeureVersEntier
// ------------------------------------------------------------------------------------------------
// Paramètres :
//	h : chaine contenant l'heure au format HHMMSSCC
function _HVE(h){return(h.substr(0,2)*360000)+(h.substr(2,2)*6000)+(h.substr(4,2)*100)+(h.substr(6,2)*1)}
// MakeDateFromWD
// ------------------------------------------------------------------------------------------------
// Cette fonction prend une date au format AAAAMMJJHHMMSS avec MM dans 1..12 et retourne un objet date
// La chaine peut être tronquée à la date auquel cas l'heure sera nulle
// Paramètres :
//	c : chaine contenant la date 
// Variables locales :
//	a : année
//	d : date résultat
function _WMD(c)
{
	// on récupère l'année
	var a=c.substring(0,4);
	// on construit la date
	var d=new Date(a,eval(c.substring(4,6)+'-1'),c.substring(6,8),c.substring(8,10),c.substring(10,12),c.substring(12,14),c.substring(14,16)+"0");
	// si l'année est inférieure à 100, on construit l'année complète
	if(eval(a)<100)d.setFullYear(a);
	// on renvoie la date résultat
	return d;
}
// STD_DateVersEntier
// ------------------------------------------------------------------------------------------------
// Entrées :
//	d : chaine contenant la date au format AAAAMMJJ
function _DVE(d){return Math.round(((_WMD(d)-_WMD('18000101'))/(1000*3600*24))+1)}
// nBissextile
// ------------------------------------------------------------------------------------------------
// Entrées :
//	a : année à tester
function _WBI(a)
{
	if(a%4)return 0;
	if(a>1582)
	{
		if(a%100)return 1;
		if(a%400)return 0;
	}
	return 1;
}
// STD_EntierVersDate
// ------------------------------------------------------------------------------------------------
// Entrées :
//	e :  entier correspondant au nombre de jour depuis 01/01/1800 plus un
//	f : Chaine de format parmi 'AAAAMMJJ', 'A', 'M' ou 'J'
// Variables locales :
//	t : tableau des nombres de jours par mois
//	a : année
//	m : mois
//	j : jour
//	b : année sous forme de chaine
//	n : mois sour forme de chaine
//	k : jour sous forme de chaine
//	d : décalage pour année bissextile
//	i : compteur de boucle
//	x : 01/01/1800
//	y : 01/01/<année date>
//	z : différence aux 01/01
function _EVD(e,f)
{
	var t=new Array(12);
	t[0]=31;t[1]=28;t[2]=31;t[3]=30;t[4]=31;t[5]=30;t[6]=31;t[7]=31;t[8]=30;t[9]=31;t[10]=30;t[11]=31;
	var a=Math.floor((eval(e) + 657071)/365);
	var x=_WMD('18000101');
	var y=_WMD(a+'0101');
	var z=Math.floor((y-x)/(1000*3600*24))+1;
	while(z>eval(e))
	{
		a--;
		y=_WMD(a+'0101');
		z=Math.floor((y-x)/(1000*3600*24))+1;
	}
	var j=eval(e)-z;
	var d=_WBI(a);
	var m=1;
	var i=0;
	t[1]=28+d;
	while(j>=t[i])
	{
		j-=t[i];
		m++;
		i++;
	}
	j++
	var b=""+a;
	var n=""+m;
	if(n.length==1)n="0"+n;
	var k=""+j;
	if(k.length==1)k="0"+k;
	if(f=='A')return b;
	if(f=='Y')return b;
	if(f=='M')return n;
	if(f=='J')return k;
	if(f=='D')return k;
	return b+n+k;
}
function PGNDOMINOWEB_PGNCOULEURENTIERVERSHEXA(VPCOULEURENTIER )
{
	{
	var VXCOMPOSANTEBLEU=0;
	var VXCOMPOSANTEVERT=0;
	var VXCOMPOSANTEROUGE=0;
	var VXRESTE=0;
	VXRESTE=(VPCOULEURENTIER%65536);
	VXCOMPOSANTEBLEU=((VPCOULEURENTIER-VXRESTE)/65536);
	VXCOMPOSANTEROUGE=(VXRESTE%256);
	VXCOMPOSANTEVERT=((VXRESTE-VXCOMPOSANTEROUGE)/256);
	return(((_NVC(VXCOMPOSANTEROUGE,"02X")+_NVC(VXCOMPOSANTEVERT,"02X"))+_NVC(VXCOMPOSANTEBLEU,"02X")));
}
}
function PGNDOMINOWEB_PGNHEUREDECIMALVERSHORAIRE(VPFORMATDECIMAL, VPSEPARATEUR )
{
	{
	if (VPSEPARATEUR==undefined) VPSEPARATEUR=":";
	{
		var VXHEURE=0;
		var VXMINUTE=0;
		var VXSIGNE="";
		VXHEURE=Math.floor(Math.abs(VPFORMATDECIMAL));
		VXMINUTE=Math.abs(VPFORMATDECIMAL)-Math.floor(Math.abs(VPFORMATDECIMAL));
		VXMINUTE=(VXMINUTE*60);
		if((Math.abs(VXMINUTE)-Math.floor(Math.abs(VXMINUTE))!=0))
		{
			VXMINUTE=(Math.floor(VXMINUTE)+_ARR(Math.abs(VXMINUTE)-Math.floor(Math.abs(VXMINUTE)),0));
		}
		if(((VXHEURE==0)&&(VXMINUTE==0)))
		{
			return("");
		}
		else {
			if((VPFORMATDECIMAL<0))
			{
				VXSIGNE="-";
			}
			return((((VXSIGNE+_NVC(VXHEURE,"02d"))+VPSEPARATEUR)+_NVC(VXMINUTE,"02d")));
		}
	}
}
}
function PGNDOMINOWEB_PGNHEUREVERSDECIMAL(VPFORMATHORAIRE, VPSEPARATEUR )
{
	{
	if (VPSEPARATEUR==undefined) VPSEPARATEUR="";
	{
		var VXFORMATDECIMAL=0;
		var VXHEURE=0;
		var VXMINUTE=0;
		if((VPSEPARATEUR!=""))
		{
			VXHEURE=_VAL(_EC(VPFORMATHORAIRE,1,VPSEPARATEUR,0));
			VXMINUTE=Math.floor(((_VAL(_EC(VPFORMATHORAIRE,2,VPSEPARATEUR,0))*100)/60));
		}
		else {
			VXHEURE=_VAL(VPFORMATHORAIRE.substring(0,2));
			VXMINUTE=Math.floor(((_VAL(_MI3(VPFORMATHORAIRE,3,2))*100)/60));
		}
		VXFORMATDECIMAL=(VXHEURE+(VXMINUTE/100));
		if((((VPFORMATHORAIRE + "").substr(1-1, 1)=="-")&&(VXFORMATDECIMAL>0)))
		{
			VXFORMATDECIMAL=(VXFORMATDECIMAL*-1);
		}
		return(VXFORMATDECIMAL);
	}
}
}
function PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE(VPHEURE, VPDEBUT_TRANCHE, VPFIN_TRANCHE, VPAUTORISEMINUTESUPERPOSEE )
{
	{
	if (VPAUTORISEMINUTESUPERPOSEE==undefined) VPAUTORISEMINUTESUPERPOSEE=true;
	{
		if(VPAUTORISEMINUTESUPERPOSEE)
		{
			if(((_HVE(VPHEURE)>=_HVE(VPDEBUT_TRANCHE))&&(_HVE(VPHEURE)<=_HVE(VPFIN_TRANCHE))))
			{
				return(true);
			}
		}
		else {
			if(((_HVE(VPHEURE)>_HVE(VPDEBUT_TRANCHE))&&(_HVE(VPHEURE)<_HVE(VPFIN_TRANCHE))))
			{
				return(true);
			}
		}
		return(false);
	}
}
}
function PGNDOMINOWEB_PGNHORAIREDANSHORAIRE(VPDEBUT_HORAIRE1, VPFIN_HORAIRE1, VPDEBUT_HORAIRE2, VPFIN_HORAIRE2, VPAUTORISEMINUTESUPERPOSEE )
{
	{
	if (VPAUTORISEMINUTESUPERPOSEE==undefined) VPAUTORISEMINUTESUPERPOSEE=false;
	{
		if((((VPDEBUT_HORAIRE1=="")||(VPDEBUT_HORAIRE1==unescape("\b")))&&((VPFIN_HORAIRE1=="")||(VPFIN_HORAIRE1==unescape("\b")))))
		{
			return(false);
		}
		if((((VPDEBUT_HORAIRE2=="")||(VPDEBUT_HORAIRE2==unescape("\b")))&&((VPFIN_HORAIRE2=="")||(VPFIN_HORAIRE2==unescape("\b")))))
		{
			return(false);
		}
		if(((VPDEBUT_HORAIRE1==VPDEBUT_HORAIRE2)&&(VPFIN_HORAIRE1==VPFIN_HORAIRE2)))
		{
			return(true);
		}
		if((VPDEBUT_HORAIRE1<VPFIN_HORAIRE1))
		{
			if((VPDEBUT_HORAIRE2<VPFIN_HORAIRE2))
			{
				if((PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE(VPDEBUT_HORAIRE1,VPDEBUT_HORAIRE2,VPFIN_HORAIRE2,VPAUTORISEMINUTESUPERPOSEE)||PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE(VPFIN_HORAIRE1,VPDEBUT_HORAIRE2,VPFIN_HORAIRE2,VPAUTORISEMINUTESUPERPOSEE)))
				{
					return(true);
				}
				if((PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE(VPDEBUT_HORAIRE2,VPDEBUT_HORAIRE1,VPFIN_HORAIRE1,VPAUTORISEMINUTESUPERPOSEE)||PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE(VPFIN_HORAIRE2,VPDEBUT_HORAIRE1,VPFIN_HORAIRE1,VPAUTORISEMINUTESUPERPOSEE)))
				{
					return(true);
				}
			}
			else {
				if((((PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE(VPDEBUT_HORAIRE1,VPDEBUT_HORAIRE2,"2359",VPAUTORISEMINUTESUPERPOSEE)||PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE(VPDEBUT_HORAIRE1,"0000",VPFIN_HORAIRE2,VPAUTORISEMINUTESUPERPOSEE))||PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE(VPFIN_HORAIRE1,VPDEBUT_HORAIRE2,"2359",VPAUTORISEMINUTESUPERPOSEE))||PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE(VPFIN_HORAIRE1,"0000",VPFIN_HORAIRE2,VPAUTORISEMINUTESUPERPOSEE)))
				{
					return(true);
				}
				if((((PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE(VPDEBUT_HORAIRE2,VPDEBUT_HORAIRE1,VPFIN_HORAIRE1,VPAUTORISEMINUTESUPERPOSEE)||PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE("2359",VPDEBUT_HORAIRE1,VPFIN_HORAIRE1,VPAUTORISEMINUTESUPERPOSEE))||PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE("0000",VPDEBUT_HORAIRE1,VPFIN_HORAIRE1,VPAUTORISEMINUTESUPERPOSEE))||PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE(VPFIN_HORAIRE2,VPDEBUT_HORAIRE1,VPFIN_HORAIRE1,VPAUTORISEMINUTESUPERPOSEE)))
				{
					return(true);
				}
			}
		}
		else {
			if((VPDEBUT_HORAIRE2<VPFIN_HORAIRE2))
			{
				if((((PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE(VPDEBUT_HORAIRE1,VPDEBUT_HORAIRE2,VPFIN_HORAIRE2,VPAUTORISEMINUTESUPERPOSEE)||PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE("2359",VPDEBUT_HORAIRE2,VPFIN_HORAIRE2,VPAUTORISEMINUTESUPERPOSEE))||PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE("0000",VPDEBUT_HORAIRE2,VPFIN_HORAIRE2,VPAUTORISEMINUTESUPERPOSEE))||PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE(VPFIN_HORAIRE1,VPDEBUT_HORAIRE2,VPFIN_HORAIRE2,VPAUTORISEMINUTESUPERPOSEE)))
				{
					return(true);
				}
				if((((PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE(VPDEBUT_HORAIRE2,VPDEBUT_HORAIRE1,"2359",VPAUTORISEMINUTESUPERPOSEE)||PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE(VPDEBUT_HORAIRE2,"0000",VPFIN_HORAIRE1,VPAUTORISEMINUTESUPERPOSEE))||PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE(VPFIN_HORAIRE2,VPDEBUT_HORAIRE1,"2359",VPAUTORISEMINUTESUPERPOSEE))||PGNDOMINOWEB_PGNHEUREDANSTRANCHEHORAIRE(VPFIN_HORAIRE2,"0000",VPFIN_HORAIRE1,VPAUTORISEMINUTESUPERPOSEE)))
				{
					return(true);
				}
			}
			else {
				return(true);
			}
		}
		return(false);
	}
}
}
function PGNDOMINOWEB_PGNNBJOURDANSMOIS(VPMOIS, VPANNEE )
{
	{
	if (VPMOIS==undefined) ;
	if (VPANNEE==undefined) ;
	{
		var VXDATEENTIER=0;
		var VXDATE="";
		var VXMOIS=0;
		var VXJOUR=0;
		switch(VPMOIS)
		{
		case "01":
			{
				return("31");
			}
			
			break;
		case "02":
			{
				VXJOUR="28";
				VXDATE=((VPANNEE+VPMOIS)+VXJOUR);
				VXDATEENTIER=_DVE(VXDATE);
				if(((_EVD((VXDATEENTIER+1),'AAAAMMJJ') + "").substring(5-1, 6)=="02"))
				{
					VXJOUR="29";
				}
				return(VXJOUR);
			}
			
			break;
		case "03":
			{
				return("31");
			}
			
			break;
		case "04":
			{
				return("30");
			}
			
			break;
		case "05":
			{
				return("31");
			}
			
			break;
		case "06":
			{
				return("30");
			}
			
			break;
		case "07":
			{
				return("31");
			}
			
			break;
		case "08":
			{
				return("31");
			}
			
			break;
		case "09":
			{
				return("30");
			}
			
			break;
		case "10":
			{
				return("31");
			}
			
			break;
		case "11":
			{
				return("30");
			}
			
			break;
		case "12":
			{
				return("31");
			}
			
			break;
		}
		return(0);
	}
}
}
function PGNDOMINOWEB_PGNCONTROLEDATE(VPDATE, VPDATEVIDE, VPALERT )
{
	{
	if((VPDATE==""))
	{
		if((VPDATEVIDE==false))
		{
			if(VPALERT)
			{
				alert("Date invalide");
			}
			return(false);
		}
	}
	else {
		if((clWDAJAXMain.AJAXExecuteSynchrone("PG_CONTROLE_DATE", "",VPDATE)!="OK"))
		{
			if(VPALERT)
			{
				alert("Date invalide");
			}
			return(false);
		}
	}
	return(true);
}
}
function PGNDOMINOWEB_PGNGPWDESACTIVE(VPNOMGROUPECHAMP )
{
	{
	return(_VAL(clWDAJAXMain.AJAXExecuteSynchrone("PG_GPW_DESACTIVE", "",VPNOMGROUPECHAMP)));
}
}
function PGNDOMINOWEB_PGNPERIODEDANSPERIODE(VPDEBUTPERIODEREFERENCE, VPFINPERIODEREFERENCE, VPDEBUTPERIODERECHERCHE, VPFINPERIODERECHERCHE )
{
	{
	if (VPDEBUTPERIODERECHERCHE==undefined) ;
	if (VPFINPERIODERECHERCHE==undefined) VPFINPERIODERECHERCHE="";
	{
		if(((VPDEBUTPERIODEREFERENCE=="")||(VPDEBUTPERIODERECHERCHE=="")))
		{
			return(false);
		}
		if((VPFINPERIODEREFERENCE==""))
		{
			return(((VPFINPERIODERECHERCHE=="")||(VPFINPERIODERECHERCHE>=VPDEBUTPERIODEREFERENCE)));
		}
		if((VPFINPERIODERECHERCHE==""))
		{
			return((VPDEBUTPERIODERECHERCHE<=VPFINPERIODEREFERENCE));
		}
		return(((VPDEBUTPERIODEREFERENCE<=VPFINPERIODERECHERCHE)&&(VPDEBUTPERIODERECHERCHE<=VPFINPERIODEREFERENCE)));
	}
}
}
function PGNDOMINOWEB_PGNDATEDANSPERIODE(VPDEBUTPERIODEREFERENCE, VPFINPERIODEREFERENCE, VPDATERECHERCHE )
{
	{
	if (VPDATERECHERCHE==undefined) ;
	{
		if((VPDATERECHERCHE>=VPDEBUTPERIODEREFERENCE))
		{
			if(((VPFINPERIODEREFERENCE=="")||((VPFINPERIODEREFERENCE!="")&&(VPDATERECHERCHE<=VPFINPERIODEREFERENCE))))
			{
				return(true);
			}
		}
		return(false);
	}
}
}
function PGNDOMINOWEB_PGNESTSUPERVISEUR( )
{
	{
	if((!gProfilSuperviseur))
	{
		alert(unescape("Droits insuffisants pour acc%E9der %E0 cette option."));
		return(false);
	}
	return(true);
}
}
function PGNJS_TABLE_POSITION(pNomTable,pNumColonne,pRecherche)
{
	if ( pRecherche.length > 0)
	{
		eval("cl"+pNomTable).m_oCache.CreeRequeteRecherche(pNumColonne, pRecherche);
		
		// Marque toutes les lignes comme invalide
		var i = 0;
		var nLimiteI = eval("cl"+pNomTable).m_tabLignesEtat.length;
		for (i = 0; i < nLimiteI; i++)
		{
			eval("cl"+pNomTable).m_tabLignesEtat[i].m_bPlein = false;
			}
		// Et affiche le masque qui empeche la saisie
		//eval("cl"+pNomTable).AfficheMasque(true, true);
	}	
	
}

function PGN_AFFICHER_FLASH(pSwf,pHauteur,pLargeur,pCouleur,pNom)
{
	document.write("<object classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" codebase=\"http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0\" width=\""+pHauteur+"\" height=\""+pLargeur+"\" id=\""+pNom+"\" align=\"middle\">\n");
	document.write("<param name=\"allowScriptAccess\" value=\"sameDomain\" />\n");
	document.write("<param name=\"movie\" value=\""+pSwf+"\" /><param name=\"quality\" value=\"high\" /><param name=\"bgcolor\" value=\""+pCouleur+"\" /><embed src=\""+pSwf+"\" quality=\"high\" bgcolor=\""+pCouleur+"\" width=\""+pHauteur+"\" height=\""+pLargeur+"\" name=\""+pNom+"\" align=\"middle\" allowScriptAccess=\"sameDomain\" type=\"application/x-shockwave-flash\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\" />\n");
	document.write("</object>\n");
}
function PGNJS_INIT_IFRAMES_EDITABLES()

//Permet de rendre éditable les IFRAMES dont le nom commance par "IFRAME_EDIT" ainsi que d'initialiser ces champs
//Nom de l'IFRAME : "IFRAME_EDIT_NOMDUCHAMP" / Nom du champ de récupération : "SA_NOMDUCHAMP" / Palette associée : "PALETTE_NOMDUCHAMP"

{

	var xTabIFrames 	= document.getElementsByTagName("IFRAME");
	var xIFrameEnCours;
	var xNomIFRAME;
	var xChampRecup;
	var xValeurRecup;
	var xPaletteEnCours;
	var xHauteurDIV;
	var xLargeurDIV;

	//Parcours de toutes les IFRAMEs de la page
	for (var xIndice = 0; xIndice < xTabIFrames.length; xIndice++)
	{
		xNomIFRAME = xTabIFrames[xIndice].name;
		
		//Si l'IFRAME est éditable
		if (xNomIFRAME.substring(0,11) == "IFRAME_EDIT")
		{
			//Construction du nom du champ stockant le texte
			xChampRecup = 'SA' + xNomIFRAME.substring(xNomIFRAME.lastIndexOf("_"));
			
			xValeurRecup	= document.getElementById(xChampRecup).value
			
			//Retirer les balises "DIV" (compatibilité)
			xValeurRecup = PGN_RETIRER_BALISE(xValeurRecup,"DIV");
						
			if (xValeurRecup=="") xValeurRecup = "<BR>";
			
			//Compatible FireFox || Compatible IE7
			xHauteurDIV 	= document.getElementsByName(xNomIFRAME)[0].height - 30
			xLargeurDIV		= document.getElementsByName(xNomIFRAME)[0].width - 30

			xIFrameEnCours 	= document.getElementsByName(xNomIFRAME)[0].contentDocument || document.getElementsByName(xNomIFRAME)[0].Document;
			xIFrameEnCours.open();
			xIFrameEnCours.writeln("<html><head><STYLE type='text/css'><!--");
			xIFrameEnCours.writeln("P { margin: 0 }");
			xIFrameEnCours.writeln("body { color: #6262D5; font-family: Trebuchet MS; font-size: 12px; margin: 0 }");
			xIFrameEnCours.writeln("--></STYLE></head>");
			xIFrameEnCours.writeln("<BODY>");
			
			//Insertion d'un calque pour garder la compatibilité avec IE7
			if (navigator.appName == "Microsoft Internet Explorer") {
				xIFrameEnCours.writeln("<DIV ID="+xNomIFRAME+" STYLE='width:"+xLargeurDIV+"; height:"+xHauteurDIV+";' contentEditable='true'>"+xValeurRecup+"</DIV></BODY></html>");
			} else {
				xIFrameEnCours.designMode = "On";
				xIFrameEnCours.writeln(xValeurRecup+"</BODY></html>");
			}
			
			xIFrameEnCours.close();

		}
		
	}
	
}
function PGNJS_RECUPERER_CONTENU_IFRAMES()
{
	
	var xTabIFrames 	= document.getElementsByTagName("IFRAME");
	var xNomIFRAME;
	var xChampRecup;
	var xContenuIFRAME;
	var xHTML;
	
	//Parcours de toutes les IFRAMEs de la page
	for (var xIndice = 0; xIndice < xTabIFrames.length; xIndice++)
	{
		xNomIFRAME = xTabIFrames[xIndice].name
		
		//Si l'IFRAME est éditable
		if (xNomIFRAME.substring(0,11) == "IFRAME_EDIT")
		{
			//Construction du nom du champ pour l'enregistrement du texte HTML
			xChampRecup = 'SA' + xNomIFRAME.substring(xNomIFRAME.lastIndexOf("_"));
			//Compatible FireFox || Compatible IE7
			xIFrameEnCours = document.getElementsByName(xNomIFRAME)[0].contentDocument || document.getElementsByName(xNomIFRAME)[0].Document
			
			if (navigator.appName == "Microsoft Internet Explorer") {
				xContenuIFRAME = xIFrameEnCours.getElementById(xNomIFRAME);
				xHTML = xContenuIFRAME.innerHTML;
			} else {
				xContenuIFRAME = xIFrameEnCours.body;
				xHTML = xContenuIFRAME.innerHTML;
				if (xHTML.substring(0,4).toUpperCase() == "<BR>") xHTML = xHTML.substring(4);
			}			
			
			document.getElementById(xChampRecup).value = xHTML;
			
		}
		
	}
	
}
function PGNJS_MISE_EN_FORME_TEXTE(pNomCHAMP,pMethode,pParametre)
{

	var xIFRAME 	= document.getElementsByName("IFRAME_EDIT_"+pNomCHAMP)[0].contentDocument || document.getElementsByName("IFRAME_EDIT_"+pNomCHAMP)[0].Document;
	var xNomPalette	= 'PALETTE_' + pNomCHAMP
	var xPalette	= document.getElementById(xNomPalette);

	if (pMethode == "FontName" || pMethode == "FontSize" || pMethode == "BackColor")
	{
		xIFRAME.execCommand(pMethode,false,pParametre);
	}
	else if (pMethode == "ForeColor")
	{
		xIFRAME.execCommand("ForeColor",false,xPalette.value);
		xPalette.style.backgroundColor = xPalette.value;
	}
	else 
	{
		xIFRAME.execCommand(pMethode,false,null);
	}
	
}
function PGNJS_COULEUR_HEXA_VERS_ENTIER(pCouleurHexa)
{
	var xCouleurHexa;
	var xCouleurEntier;
	
	var xPos1, xPos2;
	
	// RVB( => 65536*composante bleu + 256* composante verte + composante rouge
	
	if(pCouleurHexa.substr(0, 4) == "rgb(")
	{
		// FireFox ne renvoit pas de valeure hexadécimale, il renvoit un résultat sous la forme rgb(255, 128, 0).
		xPos1 = 4;
		xPos2 = pCouleurHexa.indexOf(",", xPos1);
		xCouleurEntier  = parseInt(pCouleurHexa.substring(xPos1, xPos2)); // Composante rouge.
		
		xPos1 = xPos2 + 1;
		xPos2 = pCouleurHexa.indexOf(",", xPos1);
		xCouleurEntier += parseInt(pCouleurHexa.substring(xPos1, xPos2)) * 256; // Composante verte.
		
		xPos1 = xPos2 + 1;
		xPos2 = pCouleurHexa.indexOf(")", xPos1);
		xCouleurEntier += parseInt(pCouleurHexa.substring(xPos1, xPos2)) * 65536; // Composante bleue.
	}
	else
	{
		// On enleve le # 
		if(pCouleurHexa.substring(0,1)=="#") xCouleurHexa = pCouleurHexa.substring(1);
		else xCouleurHexa = pCouleurHexa;
		
		xCouleurEntier = parseInt(xCouleurHexa.substring(0,2) , 16 ) + 256*parseInt(xCouleurHexa.substring(2,4) , 16 ) + 65536*parseInt(xCouleurHexa.substring(4,6) , 16 );
	}
	
	return xCouleurEntier;
}
function PGNJS_INSERER_TEXTE(pNomDuChamp , pTexteAInserer)
{	
	// Cette fonction permet d'inserer du texte dans un champ de saisie à l'emmplacement du curseur 
	// et de positionner le curseur apres le texte inséré

	var xChampSaisie = document.getElementById(pNomDuChamp);
	var xSelection;
	var xPosDepart ;
	var xPosFin ;
	var xContenuDuChamp ;
	
	
	if (xChampSaisie){ // test si le champ existe 

		// pour IE 
		if (document.selection)
		{
			xChampSaisie.focus();
			xSelection = document.selection.createRange();
			xSelection.text = pTexteAInserer;
			xChampSaisie.focus();
		}
		//Pour MOZILLA 
		else if (xChampSaisie.selectionStart || xChampSaisie.selectionStart == "0") {
		
			xPosDepart = xChampSaisie.selectionStart;
			xPosFin = xChampSaisie.selectionEnd;
			xContenuDuChamp = xChampSaisie.value;
		
			// insertion
			xChampSaisie.value = xContenuDuChamp.substring(0, xPosDepart) + pTexteAInserer + xContenuDuChamp.substring(xPosFin, xContenuDuChamp.length);
			
			// repositionner le curseur
			xChampSaisie.focus();
			xChampSaisie.selectionStart = xPosDepart + pTexteAInserer.length
			xChampSaisie.selectionEnd = xPosDepart + pTexteAInserer.length
		
		} else { // pour les autres nav : on ajoute le texte à la fin
			xChampSaisie.value += pTexteAInserer;
		}
	}
}

function disableselect(e){
	return false;
}

function reEnable(){
	return true;
}

function PGNJS_DESACTIVE_SELECTION(pNomObjetHTML,pObjetHTML)
{	// Cette fonction permet de rendre la selection de texte impossible sur un objet ou sur toutes une page (à utiliser notamment pour les tables)
	// On peut lui passer en parametre le nom (id) HTML de l'objet , directement l'objet , ou rien du tout (l'interdiction s'appliquera a la page)
	var xObjetHTML;
	
	xObjetHTML = document.getElementById(pNomObjetHTML);
	if (!xObjetHTML){
		if(pObjetHTML) {
			xObjetHTML = pObjetHTML;
		}else{
			xObjetHTML = document;
		}
	}

	// pour IE
	xObjetHTML.onselectstart	= disableselect; //function () {return false;}; 

	// pour firefox
	if (window.sidebar){
		xObjetHTML.onmousedown	= disableselect; //function () {return false;}; 
		xObjetHTML.onclick		= reEnable; //function () {return true;}; 
	}
}
function PGN_ChaineOccurrence(pChaineSource,pChaineRecherchee)
{// 			  ChaîneOccurrence n'est pas disponible en code nav, donc ... 

	var xTableau = 	pChaineSource.split(pChaineRecherchee);
	return xTableau.length;
}
function PGNJS_NUMERIQUE_AVEC_VIRGULE(pReel)
{

	var xFormatDecimal = ""+pReel;
	var xPositionPoint = xFormatDecimal.lastIndexOf(".");
	
	if (pReel) {
		
		if (xPositionPoint!=-1) xFormatDecimal = xFormatDecimal.substring(0,xPositionPoint)+","+xFormatDecimal.substring(xPositionPoint+1);
				
		return xFormatDecimal;
	
	} else {
	
		return "";
	
	}
}
function BrownieEcrit(pNom, pValeur,pJours)
{

	var expireDate = new Date();
	expireDate.setTime(expireDate.getTime() + pJours*24*3600*1000);
	var argv=BrownieEcrit.arguments;
	var argc=BrownieEcrit.arguments.length;
	var expires=(argc > 2) ? expireDate : null;
//	var path=(argc > 3) ? argv[3] : null;
	var path="/";
	var domain=(argc > 4) ? argv[4] : null;
	var secure=(argc > 5) ? argv[5] : false;
	document.cookie=pNom+"="+escape(pValeur)+
	((expires==null) ? "" : ("; expires="+expires.toGMTString()))+
	((path==null) ? "" : ("; path="+path))+
	((domain==null) ? "" : ("; domain="+domain))+
	((secure==true) ? "; secure" : "");
}

function BrownieLit(pNom)
{
	xDeb = document.cookie.indexOf(pNom + "=")
	if (xDeb >= 0) {
		xDeb += pNom.length + 1
		xFin = document.cookie.indexOf(";",xDeb)
		if (xFin < 0) xFin = document.cookie.length
		return unescape(document.cookie.substring(xDeb,xFin))
		}
	return ""
}

function PGN_RETIRER_BALISE(pChaine,pBaliseARetirer)
{

	//pBaliseARetirer : "DIV"...

	var xLongueur = pChaine.length;
	var xTableauChaine = new Array();
	var xCaractere;
	var xEnregistrement;
	var xIndiceTab = -1;
	var xTableauIndice = new Array();
	var xNouvelleChaine = "";
	var xAjouterCaractere;
	var xChaineLue = "";
	
	for (var xIndice = 0 ; xIndice < xLongueur ; xIndice++) {
		
		xCaractere = pChaine.substr(xIndice,1);
		
		xTableauChaine[xIndice] = xCaractere;
		
		switch (xCaractere) {
			case "<":
				xEnregistrement = true;
				break;
			case ">":
				xEnregistrement = false;
				break;		
		}
		
		if (xEnregistrement) {
			
			xChaineLue += xCaractere;
			
			if (xChaineLue.length==(pBaliseARetirer.length+1) || xChaineLue.length==(pBaliseARetirer.length+2)) {
				
				if (xChaineLue.toUpperCase()=="<"+pBaliseARetirer) {
					xIndiceTab++;
					xTableauIndice[xIndiceTab] = new Array();
					xTableauIndice[xIndiceTab]["Debut"] = xIndice - pBaliseARetirer.length;
				} else if (xChaineLue.toUpperCase()=="</"+pBaliseARetirer) {
					xIndiceTab++;
					xTableauIndice[xIndiceTab] = new Array();
					xTableauIndice[xIndiceTab]["Debut"] = xIndice - (pBaliseARetirer.length + 1);
				}
				
			}
			
		} else {
			if (xTableauIndice[xIndiceTab]) {
				if (!xTableauIndice[xIndiceTab]["Fin"]) xTableauIndice[xIndiceTab]["Fin"] = xIndice;
			}
			xChaineLue = "";
		}
		
	}
	
	for (var xIndiceCaractere = 0 ; xIndiceCaractere < xLongueur ; xIndiceCaractere++) {
		
		xAjouterCaractere = true;
		
		//Rechercher si le caractere n'est pas exclu
		for (var xIndiceTabChaine in xTableauIndice) {
			
			if (xIndiceCaractere >= xTableauIndice[xIndiceTabChaine]["Debut"] && xIndiceCaractere <= xTableauIndice[xIndiceTabChaine]["Fin"]) {
				
				xAjouterCaractere = false;
				break;
			
			}
				
		}
		
	if (xAjouterCaractere) xNouvelleChaine += xTableauChaine[xIndiceCaractere];
		
	}
	
	return xNouvelleChaine;
	 
}
function PGNJS_VERIF_DATE(pDate)
{
	// Cette fonction test la validité d'une date au format JJ/MM/AAAA avec gestion des années bissextiles
	
	// 1er controle par un expression reguliere que la date respecte le format
	var xRegEx	= new RegExp("^[0-9]{2}[/]{1}[0-9]{2}[/]{1}[0-9]{4}$","g");	
	if ( ! xRegEx.test(pDate) ) return false;		
	
	// Puis on verifie que la date est valide
	var xTabNbJours = new Array( 0 ,31,28,31,30,31,30,31,31,30,31,30,31);
	var xDate = pDate.split('/');
	var xJour	= parseInt(xDate[0],10);
	var xMois	= parseInt(xDate[1],10);
	var xAnnee	= parseInt(xDate[2],10);
	
	// Si c'est une année bissextile, le mois de fevrier a 29 jours
	if ( xAnnee%4 == 0 && xAnnee%100 > 0 || xAnnee%400 == 0 )	xTabNbJours[2] = 29;	
	
	if ( xMois > 12 || xMois < 1 ) return false;
	if ( xJour > xTabNbJours[xMois] || xJour < 1 ) return false;
	
	return true ;
	
}
function PGNJS_VERIF_HEURE(pHeure)
{
	// Cette fonction test la validité d'une heure au format HH:MM
	
	// 1er controle par un expression reguliere que l'heure respecte le format
	var xRegEx	= new RegExp("^[0-9]{2}[:]{1}[0-9]{2}$","g");	
	if ( ! xRegEx.test(pHeure) ) return false;		
	
	// Puis on verifie que l'heure est valide
	var xHeureMinute = pHeure.split(':');
	var xHeure	= parseInt(xHeureMinute[0],10);
	var xMinute	= parseInt(xHeureMinute[1],10);
	
	if ( xHeure > 23 || xHeure < 0 ) return false;
	if ( xMinute > 59 || xMinute < 0 ) return false;
	
	return true ;
	
}

function PGNJS_VERIF_EMAIL(pAdresseEmail)// vérif de la validité de l'email par REGEXP
{

	var reg = /^[a-z0-9._-]+@[a-z0-9.-]{2,}[.][a-z]{2,3}$/
	
	//alert(pAdresseEmail+" : " + (reg.exec(pAdresseEmail)!=null))
	
	return (reg.exec(pAdresseEmail)!=null);
}


