/* Calendrier perpétuel.

    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&eacute;vrier";

MonthName[2]="Mars";

MonthName[3]="Avril";

MonthName[4]="Mai";

MonthName[5]="Juin";

MonthName[6]="Juillet";

MonthName[7]="Ao&ucirc;t";

MonthName[8]="Septembre";

MonthName[9]="Octobre";

MonthName[10]="Novembre";

MonthName[11]="D&eacute;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 winCal;   			              //Fenêtre popup du calendrier

var docCal;                           //Objet document de la fenêtre calendrier

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 de la fenêtre 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

var NumberRows=0;                     //Nombre de lignes dans le corps du calendrier (4,5 ou 6 selon la position du 1er jour du mois et le nombre de jours de celui ci)



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 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 = coordonnées gauche de la fenêtre popup

	   * pY = coordonnée haut de la fenêtre popup*/

    Cal=new Calendar(dtToday);//Par défaut, le calendrier créé est celui du mois de la date du jour

    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

    if (pX) cLeft=pX;

	if (pY) cTop=pY;

    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);

	   }

       winCal=window.open("","Calendar","width=199,height=166,menubar=0,status=0,top="+cTop+",left="+cLeft);

       docCal=winCal.document;

       DrawCal();	    

	  }



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 CalStyle() {

	/*Cette fonction défini la feuille de style du calendrier*/

	var sCalStyle=new String();

	sCalStyle="body{margin:0px;font-family:arial;font-size:11px}\n";

	sCalStyle+="a.browser:link{text-decoration:none;font-weight:bold;color:black}\n";

	sCalStyle+="a.browser:visited{text-decoration:none;font-weight:bold;color:black}\n";

	sCalStyle+="a.browser:hover{text-decoration:none;font-weight:bold;color:lightgrey}\n";

	sCalStyle+="a.month:link{text-decoration:none;font-weight:bold;color:darkblue}\n";

	sCalStyle+="a.month:visited{text-decoration:none;font-weight:bold;color:darkblue}\n";

	sCalStyle+="a.month:hover{text-decoration:underline;font-weight:bold;color:green}\n";

	sCalStyle+="a.feast:link{text-decoration:none;font-weight:bold;color:orange}\n";

	sCalStyle+="a.feast:visited{text-decoration:none;font-weight:bold;color:orange}\n";

	sCalStyle+="a.feast:hover{text-decoration:underline;font-weight:bold;color:green}\n";

	sCalStyle+="a.today:link{text-decoration:none;font-weight:bold;color:red}\n";

	sCalStyle+="a.today:visited{text-decoration:none;font-weight:bold;color:red}\n";

	sCalStyle+="a.today:hover{text-decoration:underline;font-weight:bold;color:green}\n";

	sCalStyle+="a.other:link{text-decoration:none;font-weight:bold;color:lightgrey}\n";

	sCalStyle+="a.other:visited{text-decoration:none;font-weight:bold;color:lightgrey}\n";

	sCalStyle+="a.other:hover{text-decoration:underline;font-weight:bold;color:green}\n";

	sCalStyle+="td.wkday{background-color:#f2f2f2}\n";

	sCalStyle+="td.weday{background-color:#c3c3c3}\n";

	sCalStyle+="td.other{background-color:lightslategrey}\n";

	sCalStyle+="td.header{background-color:white;color:black;font-weight:bold}\n";

	return sCalStyle;

	}

	

function DrawCalHeader() {

    /*Cette fonction dessine l'en tête du calendrier*/

	var sCalHeader=new String();

	sCalHeader="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" ";

    sCalHeader+="\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";

	sCalHeader+="<html lang=\"fr\" xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<title>"+CalTitle+"</title>\n";

	sCalHeader+="<meta content=\"text/html; charset=ISO-8859-1\" http-equiv=\"content-type\" />\n";

	sCalHeader+="<style type=\"text/css\">\n"+CalStyle()+"</style>\n";

	sCalHeader+="<script type=\"text/javascript\">var winMain=window.opener;</script>\n</head>\n";

	sCalHeader+="<body>\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"1\" width=\"175\">\n<tbody>\n";

	sCalHeader+="<tr>\n<td class=\"header\" width=\""+CellWidth+ "\" align=\"center\">\n";

	sCalHeader+="<a title=\"Mois pr&eacute;c&eacute;dant\" class=\"browser\" "

    sCalHeader+="href=\"javascript:winMain.Cal.setPrevMonth();winMain.DrawCal()\"><<</a>";

	sCalHeader+="</td>\n<td class=\"header\" colspan=\"5\" rowspan=\"2\" align=\"center\">";

	sCalHeader+=MonthName[Cal.Month]+"<br />"+Cal.Year;

	sCalHeader+="</td>\n<td class=\"header\" width=\""+CellWidth+ "\" align=\"center\">\n";

	sCalHeader+="<a title=\"Mois suivant\" class=\"browser\" "

    sCalHeader+="href=\"javascript:winMain.Cal.setNextMonth();winMain.DrawCal()\">>></a>";

	sCalHeader+="</td>\n</tr>\n<tr>\n<td class=\"header\" width=\""+CellWidth+ "\" align=\"center\">\n";

	sCalHeader+="<a title=\"Ann&eacute;e pr&eacute;c&eacute;dante\" class=\"browser\" ";

    sCalHeader+="href=\"javascript:winMain.Cal.setPrevYear();winMain.DrawCal()\"><<</a>";

    sCalHeader+="</td>\n<td class=\"header\" width=\""+CellWidth+ "\" align=\"center\">\n";

	sCalHeader+="<a title=\"Ann&eacute;e suivante\" class=\"browser\" "

    sCalHeader+="href=\"javascript:winMain.Cal.setNextYear();winMain.DrawCal()\">>></a>";

	sCalHeader+="</td>\n</tr>\n<tr>\n";

	for (i=0;i<=6;i++) {//Création des en têtes de colonnes jours de semaines

		var DayName=WeekdayName[ColWeekDays[i]];

	    var WeekdayHeader=DayName.substr(0,WeekChar);

		sCalHeader+="<td class=\"header\" width=\""+CellWidth+ "\" align=\"center\">"+WeekdayHeader+"</td>\n";

	    }

	sCalHeader+="</tr>\n";

	return sCalHeader;

	}



function DrawCell(iDay,Other) {

    /*Cette fonction dessine les cellules du corps du calendrier*/

	var sCalCell=new String();

	if (!Other) {

	   var DateCell=new Date(Cal.Year,Cal.Month,iDay);

	   var DayCell=DateCell.getDay();

	   if (DayCell==0||DayCell==6) {

	      sCalCell="<td class=\"weday\" width=\""+CellWidth+"\" align=\"center\">";

		  if (DayCell==0||IsFeastDay(iDay,Cal.Month,Cal.Year)) {

		     if (iDay==dtToday.getDate()) {

		        sCalCell+="<a class=\"today\" "; 

			    }

			 else {

			    sCalCell+="<a class=\"feast\" ";

		        }	  

			 }

		  else {

		     if (iDay==dtToday.getDate()) {

		        sCalCell+="<a class=\"today\" "; 

			    }

			 else {

			    sCalCell+="<a class=\"month\" ";

		        }	  		     

		     }

	      }

	   else {

	      sCalCell="<td class=\"wkday\" width=\""+CellWidth+"\" align=\"center\">";

	      if (IsFeastDay(iDay,Cal.Month,Cal.Year)) {

	         if (iDay==dtToday.getDate()) {

		        sCalCell+="<a class=\"today\" ";

				}

		     else {

                sCalCell+="<a class=\"feast\" ";

                }				

			 }		  

		  else {

	         if (iDay==dtToday.getDate()) {

		        sCalCell+="<a class=\"today\" ";

				}

		     else {

                sCalCell+="<a class=\"month\" ";

                }				

		     }

	      }

	    sCalCell+="href=\"javascript:winMain.document.getElementById('"+Cal.Ctrl+"').value='"

	    sCalCell+=Cal.FormatDate(iDay)+"';window.close()\">"+iDay+"</a></td>\n";

        }

    else if (Other=="Prev") {

		sCalCell="<td class=\"other\" width=\""+CellWidth+"\" align=\"center\">";

		if (IsFeastDay(iDay,PrevMonth(Cal.Month),PrevYear(Cal.Month,Cal.Year))) {

		   sCalCell+="<a class=\"feast\" ";

		   }

		else {

		   sCalCell+="<a class=\"other\" ";

		   }    

        sCalCell+="href=\"javascript:winMain.document.getElementById('"+Cal.Ctrl+"').value='"

	    sCalCell+=Cal.FormatDate(iDay,"Prev")+"';window.close()\">"+iDay+"</a></td>\n";

	    }

	else if (Other=="Next") {

		sCalCell="<td class=\"other\" width=\""+CellWidth+"\" align=\"center\">";

		if (IsFeastDay(iDay,NextMonth(Cal.Month),NextYear(Cal.Month,Cal.Year))) {

		   sCalCell+="<a class=\"feast\" ";

		   }

		else {

		   sCalCell+="<a class=\"other\" ";

		   }

        

        sCalCell+="href=\"javascript:winMain.document.getElementById('"+Cal.Ctrl+"').value='"

	    sCalCell+=Cal.FormatDate(iDay,"Next")+"';window.close()\">"+iDay+"</a></td>\n";

	    }

    return sCalCell;    	

    }

		

function DrawCalBody() {

    /*Cette fonction dessine le corp du calendrier*/

	var sCalBody=new String();

	var sCalBody="<tr>\n";

	var iNumCell=0;//Compteur de cellules

	NumberRows=0;//Remise à zéro du compteur de lignes avant le dessin du corp du calendrier

	var dtFirstDay=new Date(Cal.Year,Cal.Month,1);

	var iFirstDayOfMonth=dtFirstDay.getDay();

	var iMonth=Cal.getMonthDays();

	var iPrevMonth=Cal.getMonthDays("Prev");

	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

	    sCalBody+=DrawCell((iPrevMonth-DaysPrev+i),"Prev");

		iNumCell++;

	    }

	for (i=1;i<=iMonth;i++) {//Copie des jours du mois

	    sCalBody+=DrawCell(i);

		iNumCell++

		if (iNumCell==7) {//Fin de ligne et retour à la ligne suivante

		   sCalBody+="</tr>\n<tr>\n";

		   iNumCell=0;

		   NumberRows++;

		   }

	    }

	if (iNumCell>0) {//Copie des premiers jours du mois suivant

	   for (i=1;i<(8-iNumCell);i++) {

	       sCalBody+=DrawCell(i,"Next");

	       }

	   NumberRows++;

	   }

	sCalBody+="</tr>\n</tbody>\n</table>\n</body>\n</html>";

	return sCalBody;

	}



function CalResize() {

    /*Cette fonction redimensionne la fenêtre du calendrier selon le nombre de lignes du tableau*/

	if (navigator.appName=="Netscape") {

	   switch (NumberRows) {

	          case 4:winCal.resizeTo(282,307);break;

		      case 5:winCal.resizeTo(282,327);break;	   

		      case 6:winCal.resizeTo(282,347);break;

	          }

	   }

	else {

	   switch (NumberRows) {

	          case 4:winCal.resizeTo(282,258);break;

		      case 5:winCal.resizeTo(282,278);break;	   

		      case 6:winCal.resizeTo(282,298);break;

	          }

	

	   }

    }

	

function DrawCal() {

    /*Cette fonction dessine le calendrier*/

	ColWeekDay(FirstDayOfWeek);

	var sCal=new String();

	sCal=DrawCalHeader()+DrawCalBody();//Variable chaîne qui copie le contenu complet du tableau calendrier

	CalResize();

	docCal.open();

	docCal.write(sCal);

	docCal.close();

	}