| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 299
 300
 301
 302
 303
 304
 305
 306
 307
 308
 309
 310
 311
 312
 313
 314
 315
 316
 317
 318
 319
 320
 321
 322
 323
 324
 325
 326
 
 | /* 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é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();
	   }
	} |