﻿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 isValidDate(d) {
		var dateRegEx = /^((((0?[1-9]|[12]\d|3[01])[\.\-\/](0?[13578]|1[02])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|[12]\d|30)[\.\-\/](0?[13456789]|1[012])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|1\d|2[0-8])[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|(29[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00)))|(((0[1-9]|[12]\d|3[01])(0[13578]|1[02])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|[12]\d|30)(0[13456789]|1[012])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|1\d|2[0-8])02((1[6-9]|[2-9]\d)?\d{2}))|(2902((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00))))$/;
		return d.match(dateRegEx);
	}



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";
	}
	
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);
    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();
	}