/* Calendrier perpétuel modifié NE FONCTIONNE QU'AVEC LE MOTEUR VOL.
    Ce calendrier est liée à  une textbox
    Lorsqu'aucune date n'est précisée dans la textbox, le calendrier affiche le mois de la date courante
    Lorsqu'une date existe déjà  dans la textbox, le calendrier affiche le mois de cette date
    Lorsque l'on clique sur une date, cette date est renvoyée à la textbox et le calendrier s'efface de l'écran
    Ce calendrier prend en compte les jours fériés français (entre autre, il dispose de l'algorithme d'Euler pour le calcul de la date de Pâques)
*/
//Tableaux généraux
//Mois
var MonthName=new Array(11);
MonthName[0]="Janvier";
MonthName[1]="Février";
MonthName[2]="Mars";
MonthName[3]="Avril";
MonthName[4]="Mai";
MonthName[5]="Juin";
MonthName[6]="Juillet";
MonthName[7]="Août";
MonthName[8]="Septembre";
MonthName[9]="Octobre";
MonthName[10]="Novembre";
MonthName[11]="Décembre";
//Jours de semaine
var WeekdayName=new Array(6);
WeekdayName[0]="Dimanche";
WeekdayName[1]="Lundi";
WeekdayName[2]="Mardi";
WeekdayName[3]="Mercredi";
WeekdayName[4]="Jeudi";
WeekdayName[5]="Vendredi";
WeekdayName[6]="Samedi";
//Variables globales
var dtToday=new Date();               //Date du jour
var Cal;                              //Objet calendrier
var exDate;                           //Date existante
var ColWeekDays=new Array(6);         //Ordre de succession des colonnes jours de la semaine
//Paramètres configurables
var FirstDayOfWeek=1;                 //Premier jour de la semaine
var cTop=200; 					      //Coordonnée du haut du calendrier
var cLeft=300;					      //Coordonnée de la gauche du calendrier
var CalTitle="Dateur";	              //Titre du tableau calendrier
var CellWidth=25;				      //Largeur d'un cellule d'affichage de date
var WeekChar=2;					      //Nombre de caractères des jours de semaines affichés en têtes de colonnes
var DateSeparator="/"; 			      //Séparateur de date

function ColWeekDay(iFirsDayOfWeek) {
    /*Cette fonction défini l'ordre de succession des colonnes "jours de semaine" du tableau*/
	switch(iFirsDayOfWeek) {
	      case 0:ColWeekDays=[0,1,2,3,4,5,6];break;
		  case 1:ColWeekDays=[1,2,3,4,5,6,0];break;
		  case 2:ColWeekDays=[2,3,4,5,6,0,1];break;
		  case 3:ColWeekDays=[3,4,5,6,0,1,2];break;
		  case 4:ColWeekDays=[4,5,6,0,1,2,3];break;
		  case 5:ColWeekDays=[5,6,0,1,2,3,4];break;
		  case 6:ColWeekDays=[6,0,1,2,3,4,5];break;
          }
	}

function Calendar(pDate,pCtrl){
   /* Création de l'objet calendrier et définition de ses premières propriétés*/
   this.Date=pDate.getDate();//Date sélectionnée
   this.Month=pDate.getMonth();//Mois sélectionné
   this.Year=pDate.getFullYear();//Année sélectionnée
   this.Ctrl=(pCtrl)?pCtrl:null;//Textbox liée à l'objet
   this.Format="DDMMYYYY";//Format d'affichage de la date par défaut
   this.Separator=DateSeparator;//Séparateur de date
   }

function InitCalendar() {
    /* Cette fonction construit le tableau destiné à afficher le calendrier*/
    Cal=new Calendar(dtToday);//Par défaut, le calendrier créé est celui du mois de la date du jour
	ColWeekDay(FirstDayOfWeek);
	InitCalHeader();
	}


function NewCal(pCtrl,pFormat,pX,pY) {
    /* Cette fonction construit un nouveau calendrier à  partir des arguments :
             * pCtrl = nom de la textbox liée au calendrier,
             * pFormat = format d'affichage de la date dans la textbox liée. 
	   *pX et pY = coordonnées du tableau container du calendrier*/
    if (pCtrl) Cal.Ctrl=pCtrl;//Affectation de la propriété contrôle de l'objet calendrier défini par sa propriété id de la textbox
    if (pFormat) Cal.Format=pFormat.toUpperCase();//Affectation de la propriété format de date de l'objet calendrier
    exDate=document.getElementById(pCtrl).value;//Récupération d'une éventuelle date existant dans la textbox
    if (exDate!="") {//Si une date existe dans la textbox extraction des valeurs jour, mois et année
       var Sp1=0;//Index du premier séparateur de date
	   var Sp2=0;//Index du second séparateur de date
	   var sDate;//Jour
	   var sMonth;//Mois
	   var iMonth;//Index du mois en chiffre
	   var sYear;//Année
	   Sp1=exDate.indexOf(DateSeparator,0);
	   Sp2=exDate.indexOf(DateSeparator,(parseInt(Sp1,10)+1));
	   if ((Cal.Format.toUpperCase()=="DDMMYYYY")||(Cal.Format.toUpperCase()=="DDMMMYYYY")) {
	      sDate=exDate.substring(0,Sp1);
		  sMonth=exDate.substring(Sp1+1,Sp2);
		  sYear=exDate.substring(Sp2+1);
		  }
	   else if ((Cal.Format.toUpperCase()=="MMDDYYYY")||(Cal.Format.toUpperCase()=="MMMDDYYYY")) {
	      sDate=exDate.substring(Sp1+1,Sp2);
		  sMonth=exDate.substring(0,Sp1);
		  sYear=exDate.substring(Sp2+1);
		  }
	   else if ((Cal.Format.toUpperCase()=="YYYYMMDD")||(Cal.Format.toUpperCase()=="YYYYMMMDD")) {
	      sDate=exDate.substring(Sp2+1);
		  sMonth=exDate.substring(Sp1+1,Sp2);
		  sYear=exDate.substring(0,Sp1);
		  }
	   Cal.Year=sYear;//Affectation de la valeur année à l'objet calendrier
       if (isNaN(sMonth)) {//Si le mois est designé en lettre
          iMonth=Cal.getMonthIndex(sMonth);
          }
       else {
          iMonth=parseInt(sMonth,10)-1;
          }
       if (iMonth>=0&&iMonth<12) Cal.Month=iMonth;
       if ((parseInt(sDate,10)>0)&&(parseInt(sDate,10)<=Cal.getMonthDays())) Cal.Date=parseInt(sDate,10);
	   }
	else {
	   Cal.Month=dtToday.getMonth();
	   Cal.Year=dtToday.getFullYear();
	   }
       RedrawCal(pX,pY);	   
	  }

function getMonthIndex(sMonth) {
    /*Cette fonction renvoie l'index d'un mois à partir du texte abrégé de ce mois */
	for (i=0;i<12;i++) {
	    if (MonthName[i].parseInt(0,3).toUpperCase()==sMonth.toUpperCase()) {
		   return i;
		   break;
		   }
	    }
	}

Calendar.prototype.getMonthIndex=getMonthIndex; //Affectation de la méthode à  l'objet calendrier

function getMonthDays(Other) {
    /*Cette fonction renvoie le nombre de jours du mois */
	var DaysInMonth=[31,28,31,30,31,30,31,31,30,31,30,31];//Nombre de jours des mois d'une annÃ©e non bissectile
	if (this.IsLeapYear()) DaysInMonth[1]=29;//S'il s'agit d'une annÃ©e bissectile le mois de fÃ©vrier Ã  29 jours
	if (!Other) {
	   return DaysInMonth[this.Month];
	   }
	else {//Utilisé pour trouver le nombre de jours du mois précédent dans le dessin du calendrier
	   return DaysInMonth[PrevMonth(this.Month)];
	   }
	}

Calendar.prototype.getMonthDays=getMonthDays; //Affectation de la méthode à  l'objet calendrier

function getMonthName(isLong,Other) {
    /*Cette fonction renvoie le nom du mois du calendrier, ou de l'un ou l'autre des mois encadrants, à  partir de son index*/
	if (!Other) {
	   var sMonth=MonthName[this.Month];
	   }
	else if (Other=="Prev") {
	   var sMonth=MonthName[PrevMonth(this.Month)];
	   }
	else if (Other=="Next") {
	   var sMonth=MonthName[NextMonth(this.Month)];
	   }
	if (isLong) {
	   return sMonth;
	   }
	else {
	   return sMonth.substr(0,3);
	   }
    }
	
Calendar.prototype.getMonthName=getMonthName;//Affectation de la méthode à  l'objet calendrier

function IsLeapYear() {
    /*Cette fonction renvoie vrai si l'année est une année bissectile */
	if (this.Year%4==0) {
	   if ((this.Year%100==0)&&(this.Year%400!=0)) {
	      return false;
		  }
	   else {
	      return true;
	      }
	   }
	else {
	   return false;
	   }
    }
Calendar.prototype.IsLeapYear=IsLeapYear; //Affectation de la propriété à  l'objet calendrier

function setPrevYear() {
    /*Cette fonction déplace le calendrier vers l'année précédante*/
    this.Year--;
	}

Calendar.prototype.setPrevYear=setPrevYear; //Affectation de la méthode à  l'objet calendrier

function setNextYear() {
    /*Cette fonction déplace le calendrier vers l'année suivante*/
	this.Year++;
    }

Calendar.prototype.setNextYear=setNextYear; //Affectation de la méthode à  l'objet calendrier

function setPrevMonth() {
    /*Cette fonction déplace le calendrier vers le mois précédent */
	var iPrevMonth=PrevMonth(this.Month);
	var iPrevYear=PrevYear(this.Month, this.Year);
	this.Month=iPrevMonth;
	this.Year=iPrevYear;	
    }

Calendar.prototype.setPrevMonth=setPrevMonth; //Affectation de la méthode à  l'objet calendrier

function PrevMonth(iMonth) {
    /*Cette fonction détermine l'index du mois précédent le mois en cours */
	if (iMonth==0) {
	   return 11;
	   }
	   else {
	   return iMonth-1;
	   }
    }

function PrevYear(iMonth,iYear) {
    /*Cette fonction renvoie l'année du mois précédent*/
	var CalYear=eval(iYear);
	if (iMonth==0) {
	   return CalYear-1;
	   }
	else {
	   return CalYear;
	   }
	}

function setNextMonth() {
    /*Cette fonction déplace le calendrier vers le mois suivant*/
	var iNextMonth=NextMonth(this.Month);
	var iNextYear=NextYear(this.Month,this.Year);
	this.Month=iNextMonth;
	this.Year=iNextYear;
	}

Calendar.prototype.setNextMonth=setNextMonth;//Affectation de la méthode à  l'objet calendrier

function NextMonth(iMonth) {
    /*Cette fonction renvoie l'index du mois suivant le mois en cours*/
	if (iMonth==11) {
	   return 0;
	   }
	else {
	   return iMonth+1;
	   }
	}

function NextYear(iMonth,iYear) {
    /*Cette fonction renvoie l'année du mois suivant le mois en cours*/
	var CalYear=eval(iYear);
	if (iMonth==11) {
	   return CalYear+1;
	   }
	else {
       return CalYear;
	   }
	}

function getEaster(iYear) {
    /*Cette fonction renvoie la date de Pâques et permet de déterminer :
	  * le lundi de Pâques,
	  * le jeudi de l'Ascension,
	  * le lundi de Pentecôte.*/
	var v1=new Number((iYear%19)+1);
	var v2=new Number();
	v2=Math.floor(iYear/100)+1;
	var v3=new Number();
    v3=Math.floor((3*v2)/4)-12;
	var v4=new Number();
	v4=Math.floor(((8*v2)+5)/25)-5;
	var v5=new Number();
	v5=Math.floor((5*iYear)/4)-v3-10;
	var v6=new Number();
	v6=(11*v1+20-v4-v3)%30;
	var v7=new Number();
	if ((v6==25&&v1>11)||v6==24) v6+=1;
	v7=44-v6;
	if (v7<21) v7+=30;
	var v8=new Number(v7+7);
	v7-=(v5 + v8) % 7;
	if (v7<=31) {
	   var datEaster=new Date(iYear,2,v7);
	   }
	else {
	   var datEaster=new Date(iYear,3,v7-24);
	   }
	return datEaster;
    }

function IsFeastDay(iDate,iMonth,iYear) {
    /*Cette fonction renvoie vrai lorsqu'une date correspond à  un jour férié*/
	var datSel=new Date(iYear,iMonth,iDate);//Date du jour à tester
	var datEaster=new Date();
	datEaster=getEaster(iYear);//Date de Pâques
	var datSelUTC=Date.UTC(iYear,datSel.getMonth(),datSel.getDate());
	var datEasterUTC=Date.UTC(iYear,datEaster.getMonth(),datEaster.getDate());
	if (datSelUTC>datEasterUTC) {//Lundi de Pâques, Ascension, Lundi de Pentecôte
	   if ((datSelUTC-datEasterUTC)==86400000) return true;
	   if ((datSelUTC-datEasterUTC)==(86400000*39)) return true;
	   if ((datSelUTC-datEasterUTC)==(86400000*50)) return true;
	   }
	if (iDate==1&&iMonth==0) return true;// Jour de l'an
    if (iDate==1&&iMonth==4) return true;//Fête du travail
	if (iDate==8&&iMonth==4) return true;//Fête de la victoire du 8 mai 1945
	if (iDate==14&&iMonth==6) return true;//Fête nationale
	if (iDate==15&&iMonth==7) return true;//Assomption
	if (iDate==1&&iMonth==10) return true;//Toussaint
	if (iDate==11&&iMonth==10) return true;//Armistice 1918
	if (iDate==25&&iMonth==11) return true;//Noël
	}
	
function TwoChar(iDate) {
    /*Cette fonction force le format d'affichage des dates à 2 caractères lorsque les valeurs sont inférieures à  10*/
	if (iDate<10) {
	   return "0"+iDate.toString();
	   }
	else {
	   return iDate.toString();
	   }
	}

function FormatDate(iDate,Other) {
    /*Cette fonction défini le format de date renvoyé par l'objet calendrier (ce format est identique à  celui utilisé pour entrer les données)*/
    if (this.Format.toUpperCase()=="DDMMYYYY") {
	   if (!Other) {
	      return TwoChar(iDate)+this.Separator+TwoChar(this.Month+1)+this.Separator+this.Year;
		  }
	   else if (Other=="Prev") {
	      return TwoChar(iDate)+this.Separator+TwoChar(PrevMonth(this.Month)+1)+this.Separator+PrevYear(this.Month,this.Year);
		  }
	   else if (Other=="Next") {
	      return TwoChar(iDate)+this.Separator+TwoChar(NextMonth(this.Month)+1)+this.Separator+NextYear(this.Month,this.Year);
		  }
	   }
	else if (this.Format.toUpperCase()=="DDMMMYYYY") {
	   if (!Other) {
	      return TwoChar(iDate)+this.Separator+this.getMonthName(false)+this.Separator+this.Year;
		  }
	   else if (Other=="Prev") {
	      return TwoChar(iDate)+this.Separator+this.getMonthName(false,Other)+this.Separator+PrevYear(this.Month,this.Year);
		  }
	   else if (Other=="Next") {
	      return TwoChar(iDate)+this.Separator+this.getMonthName(false,Other)+this.Separator+NextYear(this.Month,this.Year);
		  }
	   }
    else if (this.Format.toUpperCase()=="MMDDYYYY") {
	   if (!Other) {
	      return TwoChar(this.Month+1)+this.Separator+TwoChar(iDate)+this.Separator+this.Year;
		  }
	   else if (Other=="Prev") {
	      return TwoChar(PrevMonth(this.Month)+1)+this.Separator+TwoChar(iDate)+this.Separator+PrevYear(this.Month,this.Year);
		  }
	   else if (Other=="Next") {
	      return TwoChar(NextMonth(this.Month)+1)+this.Separator+TwoChar(iDate)+this.Separator+NextYear(this.Month,this.Year);
		  }
	   }
	else if (this.Format.toUpperCase()=="MMMDDYYYY") {
	   if (!Other) {
	      return this.getMonthName(false)+this.Separator+TwoChar(iDate)+this.Separator+this.Year;
		  }
	   else if (Other=="Prev") {
	      return this.getMonthName(false,Other)+this.Separator+TwoChar(iDate)+this.Separator+PrevYear(this.Month,this.Year);
		  }
	   else if (Other=="Next") {
	      return this.getMonthName(false,Other)+this.Separator+TwoChar(iDate)+this.Separator+NextYear(this.Month,this.Year);
		  }
	   }
    else if (this.Format.toUpperCase()=="YYYYMMDD") {
	   if (!Other) {
	      return this.Year+this.Separator+TwoChar(this.Month+1)+this.Separator+TwoChar(iDate);
		  }
	   else if (Other=="Prev") {
	      return PrevYear(this.Month,this.Year)+this.Separator+TwoChar(PrevMonth(this.Month)+1)+this.Separator+TwoChar(iDate);
		  }
	   else if (Other=="Next") {
	      return NextYear(this.Month,this.Year)+this.Separator+TwoChar(NextMonth(this.Month)+1)+this.Separator+TwoChar(iDate);
		  }
	   }
	else if (this.Format.toUpperCase()=="YYYYMMMDD") {
	   if (!Other) {
	      return this.Year+this.Separator+this.getMonthName(false)+this.Separator+TwoChar(iDate);
		  }
	   else if (Other=="Prev") {
	      return PrevYear(this.Month,this.Year)+this.Separator+this.getMonthName(false,Other)+this.Separator+TwoChar(iDate);
		  }
	   else if (Other=="Next") {
	      return NextYear(this.Month,this.Year)+this.Separator+this.getMonthName(false,Other)+this.Separator+TwoChar(iDate);
		  }
	   }
    }
	
Calendar.prototype.FormatDate=FormatDate;//Ajout de la propriété à l'objet calendrier

function Show() {
    /*Cette fonction commande l'affichage du calendrier */
	document.getElementById("calbody").style.visibility="visible";
	}
Calendar.prototype.Show=Show;//Ajout de la méthode à l'objet calendrier

function Close() {
    /*Cette fonction commande l'effacement du calendrier */
	document.getElementById("calbody").style.visibility="hidden";
	recupchamps();
	}
	
Calendar.prototype.Close=Close;//Ajout de la méthode à l'objet calendrier
	
function InitCalHeader() {
    /*Cette fonction dessine l'en tête du calendrier lors de son initialisation*/
	var CalBody=document.createElement("table");//Création de la table qui permet d'afficher une bordure au calendrier
	with (CalBody) {
	     id="calbody";
	     border=2;
	     width=179;
	     className="calbody";
	     style.visibility="hidden";
		 }
	var CalContainer=document.getElementById("calcontainer");
	with (CalContainer) {
	     appendChild(CalBody);
	     style.position="absolute";
	     style.top=cTop+"px";
	     style.left=cLeft+"px";
		 }
	var CalBodyTr=CalBody.insertRow(0);
	var CalBodyTd=document.createElement("td");
	CalBodyTd.className="title";
	var CalTitleBar=document.createElement("table");
	with (CalTitleBar) {
	     id="caltitlebar";
	     border=0;
	     cellSpacing=0;
	     cellPadding=2;
	     width="100%";
		 }
	CalBodyTd.appendChild(CalTitleBar);
	CalBodyTr.appendChild(CalBodyTd);
	var CalTitTr=CalTitleBar.insertRow(0);
	var CalTitTd=document.createElement("td");
	with (CalTitTd) {
	     className="titlebar";
	     width="85%";
	     align="left";
		 }
	var CalNodeText=document.createTextNode(CalTitle);
	CalTitTd.appendChild(CalNodeText);
	CalTitTr.appendChild(CalTitTd);
	CalTitTd=document.createElement("td");
	with (CalTitTd) {
	     className="titlebar";
	     width="15%";
	     align="right";
		 }
	var CalAnc=document.createElement("a");
	with (CalAnc) {
	     className="browser";
	     title="Fermer"
	     href="javascript:Cal.Close()";
		 }
	CalNodeText=document.createTextNode("X");
	CalAnc.appendChild(CalNodeText);
	CalTitTd.appendChild(CalAnc);
	CalTitTr.appendChild(CalTitTd);
	CalBodyTr=CalBody.insertRow(1);
	CalBodyTd=document.createElement("td");
	var CalTable=document.createElement("table");
	with (CalTable) {
	     id="calendar";
	     border=0;
	     cellSpacing=0;
	     cellPadding=1;
	     width=175;
		 }
	CalBodyTd.appendChild(CalTable);
	CalBodyTr.appendChild(CalBodyTd);
	var CalTr=CalTable.insertRow(0);
	var CalTd=document.createElement("td");
	with (CalTd) {
	     className="header";
	     width=CellWidth;
	     align="center";
		 }
	CalAnc=document.createElement("a");
	with (CalAnc) {
	     className="browser";
	     title="Mois précédant"
	     href="javascript:Cal.setPrevMonth();RedrawCal()";
		 }
	CalNodeText=document.createTextNode("«");
	CalAnc.appendChild(CalNodeText);
	CalTd.appendChild(CalAnc);
	CalTr.appendChild(CalTd);
	CalTd=document.createElement("td");
	with (CalTd) {
	     id="monthname";
	     className="header";
         colSpan=5;
	     align="center";
		 }
	CalNodeText=document.createTextNode(MonthName[Cal.Month]);
	CalTd.appendChild(CalNodeText);
	CalTr.appendChild(CalTd);
	CalTd=document.createElement("td");
	with (CalTd) {
	     className="header";
	     width=CellWidth;
	     align="center";
		 }
	CalAnc=document.createElement("a");
	with (CalAnc) {
	     className="browser";
	     title="Mois suivant"
	     href="javascript:Cal.setNextMonth();RedrawCal()";
		 }
	CalNodeText=document.createTextNode("»");
	CalAnc.appendChild(CalNodeText);
	CalTd.appendChild(CalAnc);
	CalTr.appendChild(CalTd);
	CalTr=CalTable.insertRow(1);
    CalTd=document.createElement("td");
	with (CalTd) {
	     className="header";
	     width=CellWidth;
	     align="center";
		 }
	CalAnc=document.createElement("a");
	with (CalAnc) {
	     className="browser";
	     title="Année précédante"
	     href="javascript:Cal.setPrevYear();RedrawCal()";
		 }
	CalNodeText=document.createTextNode("«");
	CalAnc.appendChild(CalNodeText);
	CalTd.appendChild(CalAnc);
	CalTr.appendChild(CalTd);	
    CalTd=document.createElement("td");
	with (CalTd) {
	     id="yearname";
	     className="header";
         colSpan=5;
	     align="center";
		 }
	CalNodeText=document.createTextNode(Cal.Year);
	CalTd.appendChild(CalNodeText);
	CalTr.appendChild(CalTd);
    CalTd=document.createElement("td");
	with (CalTd) {
	     className="header";
	     width=CellWidth;
	     align="center";
		 }
	CalAnc=document.createElement("a");
	with (CalAnc) {
	     className="browser";
	     title="Année suivante"
	     href="javascript:Cal.setNextYear();RedrawCal()";
		 }
	CalNodeText=document.createTextNode("»");
	CalAnc.appendChild(CalNodeText);
	CalTd.appendChild(CalAnc);
	CalTr.appendChild(CalTd);	
	CalTr=CalTable.insertRow(2);
	var i=0;
    for (i=0;i<7;i++) {//Création des en têtes de colonnes jours de semaines
		var DayName=WeekdayName[ColWeekDays[i]];
	    var WeekdayHeader=DayName.substr(0,WeekChar);
        CalTd=document.createElement("td");
        with (CalTd) {
		     className="header";
             width=CellWidth;
             align="center";
             }			 
	    CalNodeText=document.createTextNode(WeekdayHeader);
		CalTd.appendChild(CalNodeText);
		CalTr.appendChild(CalTd);
	    }
	}


function DrawCell(oCell,iDay,Other) {
    /*Cette fonction défini les cellules du corps du calendrier*/
	var CellAnc=document.createElement("a");
	with (oCell) {
	     width=CellWidth;
	     align="center";
		 }
	if (!Other) {
	   var DateCell=new Date(Cal.Year,Cal.Month,iDay);
	   var DayCell=DateCell.getDay();
	   var sCell="";
	   if (DayCell==0||DayCell==6) {
	      oCell.className="weday";
		  if (DayCell==0||IsFeastDay(iDay,Cal.Month,Cal.Year)) {
		     if (iDay==dtToday.getDate()) {
				CellAnc.className="today"; 
			    }
			 else {
			    CellAnc.className="feast";
		        }	  
			 }
		  else {
		     if (iDay==dtToday.getDate()) {
		        CellAnc.className="today"; 
			    }
			 else {
			    CellAnc.className="month";
		        }	  		     
		     }
	      }
	   else {
	      oCell.className="wkday";
	      if (IsFeastDay(iDay,Cal.Month,Cal.Year)) {
	         if (iDay==dtToday.getDate()) {
		        CellAnc.className="today";
				}
		     else {
                CellAnc.className="feast";
                }				
			 }		  
		  else {
	         if (iDay==dtToday.getDate()) {
		        CellAnc.className="today";
				}
		     else {
                CellAnc.className="month";
                }				
		     }
	      }
	    CellAnc.href="javascript:document.getElementById('"+Cal.Ctrl+"').value='"+Cal.FormatDate(iDay)+"';Cal.Close()";
        }
    else if (Other=="Prev") {
	    oCell.className="other";
		if (IsFeastDay(iDay,PrevMonth(Cal.Month),PrevYear(Cal.Month,Cal.Year))) {
		   CellAnc.className="feast";
		   }
		else {
		   CellAnc.className="other";
		   }    
        CellAnc.href="javascript:document.getElementById('"+Cal.Ctrl+"').value='"+Cal.FormatDate(iDay,"Prev")+"';Cal.Close()"; 	      }
	else if (Other=="Next") {
	    oCell.className="other";
		if (IsFeastDay(iDay,NextMonth(Cal.Month),NextYear(Cal.Month,Cal.Year))) {
		   CellAnc.className="feast";
		   }
		else {
		   CellAnc.className="other";
		   }
        
        CellAnc.href="javascript:document.getElementById('"+Cal.Ctrl+"').value='"+Cal.FormatDate(iDay,"Next")+"';Cal.Close()";
	    }
	var CellTextNode=document.createTextNode(iDay);
	CellAnc.appendChild(CellTextNode);
    oCell.appendChild(CellAnc);    	
    }
		
function DrawCalBody() {
    /*Cette fonction dessine le corp du calendrier*/
	var CalRows=document.getElementById("calendar").rows;
	if (CalRows.length>3) {//S'il existe des données dans le corps du tableau, elles sont effacées
	   for (i=CalRows.length;i>3;i--) {
	       document.getElementById("calendar").deleteRow(i-1);
	       }
	   }
	var iNumRow=3
	var trCal=document.getElementById("calendar").insertRow(iNumRow);
	var dtFirstDay=new Date(Cal.Year,Cal.Month,1);
	var iFirstDayOfMonth=dtFirstDay.getDay();
	var iMonth=Cal.getMonthDays();
	var iPrevMonth=Cal.getMonthDays("Prev");
	var iNumCell=0;//Compteur de cellules 
	for (i=0;i<=6;i++) {//Recherche de l'emplacement du premier jour du mois et des jours du mois précédent à reporter
	    if (ColWeekDays[i]==iFirstDayOfMonth) {
		   var DaysPrev=i;
		   break;
		   }
	    }
	for (i=1;i<=DaysPrev;i++) {//Copie des derniers jours du mois précédent
	    var tdCal=document.createElement("td");
	    DrawCell(tdCal,(iPrevMonth-DaysPrev+i),"Prev");
		trCal.appendChild(tdCal);
		iNumCell++;
	    }
	for (i=1;i<=iMonth;i++) {//Copie des jours du mois
	    var tdCal=document.createElement("td");
	    DrawCell(tdCal,i);
		trCal.appendChild(tdCal);
		iNumCell++
		if (iNumCell==7) {//Fin de ligne et retour à la ligne suivante
		   iNumRow++;
		   if (i<iMonth) trCal=document.getElementById("calendar").insertRow(iNumRow);
		   iNumCell=0;
		   }
	    }
	if (iNumCell>0) {//Copie des premiers jours du mois suivant
	   for (i=1;i<(8-iNumCell);i++) {
	       var tdCal=document.createElement("td");
	       DrawCell(tdCal,i,"Next");
		   trCal.appendChild(tdCal);
	       }
	   }
	}

function RedrawCal(pX,pY) {
    /*Cette fonction dessine le calendrier*/
	if (pX) document.getElementById("calcontainer").style.left=pX+"px";
	if (pY) document.getElementById("calcontainer").style.top=pY+"px";
	var sMonth=MonthName[Cal.Month];
	var sYear=Cal.Year;
	document.getElementById("monthname").firstChild.nodeValue=sMonth;
	document.getElementById("yearname").firstChild.nodeValue=sYear;
	DrawCalBody();
	Cal.Show();
	}
