﻿/*
* Module de gestion de l'objet calendrier
* Utilisé dans le runtime et dans le plugin dreamweaver
* Utilise les fichiers js :
* - AWSControlScript.js
* - AWSGlobals.js
* ATTENTION : FICHIER A SAUVEGARDER TOUJOURS EN UTF-8
*/


var SUFFIXE_VAR_CAL = "CalAWS";

// Prefixes des identifiants (id) des composants d'un calendrier
var CAL_GEN_TABLE = "tableCal"; // table generale contenant le calendrier
var CAL_POPUP_DIV = "calendar"; // div contenant le calendrier en popup div
var CAL_SPAN_TITLE = "titleBar"; // span contenant la barre de titre (boutons de navigation de mois/annee et libelles mois/annee)
var CAL_SPAN_CONTENT = "content"; // span contenant l'affichage du mois courant
var CAL_SPAN_LBLTODAY = "lblToday"; // span contenant l'affichage de la date du jour
var CAL_IMG_DECR_MONTH = "decrMonth"; // img de decrementation du mois
var CAL_IMG_INCR_MONTH = "incrMonth"; // img d'incrementation du mois
var CAL_IMG_DECR_YEAR = "decrYear"; // img de decrementation du mois
var CAL_IMG_INCR_YEAR = "incrYear"; // img d'incrementation du mois
var CAL_IMG_GOTO_DATESEL = "gotoDateSelect"; // img d'affichage de la date selectionnee
var CAL_SPAN_YEAR = "spanYear"; // span contenant l'affichage de l'annee selectionnee
var CAL_SPAN_MONTH = "spanMonth"; // span contenant l'affichage du mois selectionne
var CAL_DIV_SELDAY = "divSelDay"; // div d'affichage de la selection du jour
var CAL_TD_LBLDAY = "tdLblDay"; // balise <td> contenant le libelle des jous de la semaine
var CAL_IMG_CLOSE_CAL = "closeCal"; // img d'affichage de la croix de fermeture du calendrier

// Ensemble des valeurs de la propriete weekStartDay
var START_DAY_MONDAY = "MON";
var START_DAY_TUESDAY = "TUE";
var START_DAY_WEDNESDAY = "WED";
var START_DAY_THURSDAY = "THU";
var START_DAY_FRIDAY = "FRI";
var START_DAY_SATURDAY = "SAT";
var START_DAY_SUNDAY = "SUN";

// Ensemble de valeurs de la propriete dateFormat
var FORMAT_JMA = "DMY";
var FORMAT_JAM = "DYM";
var FORMAT_MJA = "MDY";
var FORMAT_MAJ = "MYD";
var FORMAT_AMJ = "YMD";
var FORMAT_AJM = "YDM";

// Ensemble de valeurs de la propriete popupType
var POPUP_DIV = "DIV";
var POPUP_WIN = "WIN";
var POPUP_WIN_MODAL = "WIN_MODAL";

// Ensemble de valeurs de la propriete popupPosition
var POS_NORTH = "NORTH";
var POS_SOUTH = "SOUTH";
var POS_EAST = "EAST";
var POS_WEST = "WEST";
var POS_NORTHEAST = "NORTHEAST";
var POS_SOUTHEAST = "SOUTHEAST";
var POS_SOUTHWEST = "SOUTHWEST";
var POS_NORTHWEST = "NORTHWEST";
var POS_CENTER = "CENTER";

// ID du div servant de base au tooltip (methode FIXER_INFOBULLE_DATE)
var ID_CAL_TOOLTIP = "CalAWSTooltip";

// Flag indiquant si la liste des mois de l'annee a selectionner est construite
var intervalID1, intervalID2, timeoutID1, timeoutID2;

// Recuperation de la date du jour
var TODAY_DATE = new Date();
var DAY_TODAY_DATE = TODAY_DATE.getDate();
var MONTH_TODAY_DATE = TODAY_DATE.getMonth();
var YEAR_TODAY_DATE = TODAY_DATE.getFullYear();

if (typeof(AWSCALENDAR_IN_DESIGN_MODE) != 'undefined')
	// la var AWSCALENDAR_IN_DESIGN_MODE est cree dans awsTS_Calendar.htm
	// pour indiquer que la creation du calendar se fait via dreamweaver
	// La creation des resources texte traduisibles (et nom fichiers image) 
	// se fait via var globales dans awsTS_Calendar.htm
	var tabMonthName = new Array(JANUARY_NAME, FEBRUARY_NAME, MARCH_NAME, APRIL_NAME, MAY_NAME, JUNE_NAME, JULY_NAME, AUGUST_NAME, SEPTEMBER_NAME, OCTOBER_NAME, NOVEMBER_NAME, DECEMBER_NAME);
else
{
	// La creation des resources texte traduisibles se fait via resourceBundle
	var AWSCalendarMsgBundle = new ResourceBundleCreator('/AWSResources/AWSCalendarMessage.properties');
	var tabMonthName = new Array(AWSCalendarMsgBundle.getString('JANUARY_NAME'), 
								AWSCalendarMsgBundle.getString('FEBRUARY_NAME'), 
								AWSCalendarMsgBundle.getString('MARCH_NAME'), 
								AWSCalendarMsgBundle.getString('APRIL_NAME'),
								AWSCalendarMsgBundle.getString('MAY_NAME'), 
								AWSCalendarMsgBundle.getString('JUNE_NAME'), 
								AWSCalendarMsgBundle.getString('JULY_NAME'), 
								AWSCalendarMsgBundle.getString('AUGUST_NAME'), 
								AWSCalendarMsgBundle.getString('SEPTEMBER_NAME'), 
								AWSCalendarMsgBundle.getString('OCTOBER_NAME'), 
								AWSCalendarMsgBundle.getString('NOVEMBER_NAME'), 
								AWSCalendarMsgBundle.getString('DECEMBER_NAME'));
}

// Variables globales pour le Drag Drop du calendrier
var dragCursorPosXStart;
var dragCursorPosYStart;
var dragDivCalPosLeftStart;
var dragDivCalPosTopStart;
var dragDivCal;

// IFrame servant de cache aux tags select pour un calendrier en popup div
var awsCalIFrame = null;
// ID de l'iframe servant de cache aux tags select pour un calendrier en popup div
var ID_CAL_IFRAME = "CalAWSIFrame";

/*
* Constructeur d'un objet calendrier avec affectation de ses proprietes
* On ne construit pas l'ihm (voir CreateGUICalendar)
* - CalendarID : id du tag <adelia:calendar> (chaine)
* - type : Type Adelia du calendrier (chaine)
* - typeLength : lg du type adelia (int)
* - typeNbDec : nb de decimales du type adelia (int)
* - ShowWeekNumber : Affichage des numeros de semaine (booleen true/false)
* - ShowToday : affichage de la date du jour (booleen true/false)
* - WeekStartDay : jour de debut de semaine (chaine)
* - minDate : date minimum du calendrier (entier format date Adelia)
* - maxDate : date maximum du calendrier (entier format date Adelia)
* - barColor : couleur de la barre de titre (chaine)
* - monthBgColor : couleur du fond des mois (chaine)
* - daysColor : couleur des jours (chaine)
* - titleColor : couleur du texte du titre (chaine)
* - horzLineColor : couleur de la ligne horizontale (chaine)
* - vertLineColor : couleur de la ligne verticale (chaine)
* - daysWeekColor : couleur du texte des jours de la semaine (chaine)
* - numWeekColor : couleur du texte des numeros de semaine (chaine)
* - disabled : rend inactif le calendrier (boolean true / false)
* - barColorClass : classe CSS definissant la couleur de la barre (chaine)
* - monthBgColorClass : classe CSS definissant la couleur du fond des mois (chaine)
* - daysColorClass : classe CSS definissant la couleur des jours (chaine)
* - titleColorClass : classe CSS definissant la couleur du texte du titre (chaine)
* - horzLineColorClass : classe CSS definissant la couleur de la ligne horizontale (chaine)
* - vertLineColorClass : classe CSS definissant la couleur de la ligne verticale (chaine)
* - daysWeekColorClass : classe CSS definissant la couleur du texte des jours de la semaine (chaine)
* - numWeekColorClass : classe CSS definissant la couleur du texte des numeros de semaine (chaine)
* - daysName : type de libelle des noms des jours de la semaine (chaine)
* - getClassDate : fonction qui rend la classe fixee par la methode FIXER_CLASSE_DATE
* - getSelectionDate : fonction qui rend l'autorisation de selection fixee par la methode FIXER_SELECTION_DATE
* - getTooltipDate : fonction qui rend la classe et le texte de tooltip fixee par la methode FIXER_INFOBULLE_DATE
*/
function CalendarAWS(CalendarID, ShowWeekNumber, ShowToday, WeekStartDay, minDate,
	maxDate, barColor, monthBgColor, daysColor, titleColor, horzLineColor, vertLineColor,
   daysWeekColor, numWeekColor, dateFormat,
   boundCtrlId, value, type, typeLength, typeNbDec, onChange, popupType, popupPosition, disabled,
   barColorClass, monthBgColorClass, daysColorClass, titleColorClass, horzLineColorClass, vertLineColorClass, 
   daysWeekColorClass, numWeekColorClass, daysName, getClassDate, getSelectionDate, getTooltipDate)
{
	this.calendarID = CalendarID;
   this.idVarCalAWS = CalendarID + SUFFIXE_VAR_CAL;
   if (this.idVarCalAWS.indexOf(':lst:') == 0)
   {
      // le calendrier est contenu dans un adelia:tablelist
      // Il faut transformer idVarCalAWS sinon erreur js lors de la creation de la variable CalendarAWS
      // (var :lst:... = new CalendarAWS => syntaxe incorrecte)
      var buf = '', car;

      for (i = 0; i < this.idVarCalAWS.length; i++)
      {
         car = this.idVarCalAWS.charAt(i);
         if (car == ':')
         	buf += '_';
         else
         	buf += car;
      }
      this.idVarCalAWS = buf;
   }
	this.showWeekNumber = ShowWeekNumber;
	this.showToday = ShowToday;
	this.weekStartDay = WeekStartDay; // Jour du debut de la semaine
   this.daysName = daysName;   

	// jour, mois et annee selectionnes dans le calendrier
   // C'est la valeur de value si le calendrier n'est pas lie a un controle
   // ou la valeur de la date du controle si le calendrier est lie (affectes
   // dans showCalendarAWS)
   this.daySelected = Number.NaN;
	this.monthSelected = Number.NaN;
	this.yearSelected = Number.NaN;

	// mois et annee affiches   
	this.monthDisplay = Number.NaN;
	this.yearDisplay = Number.NaN;

	// minDate
   this.minDateYear = getYearAdeliaDate (minDate);   
   this.minDateMonth = getMonthAdeliaDate (minDate) - 1;
   this.minDateDay = getDayAdeliaDate (minDate);

   // maxDate
   this.maxDateYear = getYearAdeliaDate (maxDate);
   this.maxDateMonth = getMonthAdeliaDate (maxDate) - 1;
   this.maxDateDay = getDayAdeliaDate (maxDate);

	this.barColor = barColor;
   this.monthBgColor = monthBgColor;
   this.daysColor = daysColor;
   this.titleColor = titleColor;
   this.horzLineColor = horzLineColor;
   this.vertLineColor = vertLineColor;
   this.daysWeekColor = daysWeekColor;
   this.numWeekColor = numWeekColor;
   // date du jour encerclee
	this.dateFormat = dateFormat;
	this.boundCtrlId = boundCtrlId;
   this.isBoundCtrl = boundCtrlId != '';
	this.type = type;
   this.typeLength = typeLength;
   this.typeNbDec = typeNbDec;
   this.popupType = popupType;
   this.popupPosition = popupPosition;
   this.disabled = disabled;
   this.barColorClass = barColorClass;
   this.monthBgColorClass = monthBgColorClass;
   this.daysColorClass = daysColorClass;
   this.titleColorClass = titleColorClass;
   this.horzLineColorClass = horzLineColorClass;
   this.vertLineColorClass = vertLineColorClass;
   this.daysWeekColorClass = daysWeekColorClass;
   this.numWeekColorClass = numWeekColorClass;
   this.onChangeTxt = onChange;

	this.barColorClassColor = '';
	if (barColorClass != '')
   	this.barColorClassColor = getBgColorCSSClass (barColorClass);
      
   this.daysColorClassColor = '';
	if (daysColorClass != '')
   	this.daysColorClassColor = getColorCSSClass (daysColorClass);

	if (onChange != '')  
   { 
      // Ajout d'un ; en fin d'expression si manque
      if (this.onChangeTxt.charAt(this.onChangeTxt.length - 1) != ';')
         this.onChangeTxt += ';';
      // Dans le cas d'un calendrier lie en popup window, il faut declencher le traitant
      // a partir du contexte de la window appelante
		this.onChange = new Function('if (this.isBoundCtrl && ((this.popupType == POPUP_WIN) || (this.popupType == POPUP_WIN_MODAL))) window.opener.' + this.onChangeTxt + ' else ' + onChange);   
   }

   this.getClassDate = getClassDate;   
   this.getSelectionDate = getSelectionDate;   
   this.getTooltipDate = getTooltipDate;   

	if (! this.isBoundCtrl)
   	// affectation de la valeur de la date courante du calendrier
      setDateSelected(this, value);

	// Flag indiquant si on peut declencher le onchange lorsqu'on clic sur
	// la date selectionnee (daySelected monthSelected yearSelected)
	// Cela est autorise lorsque la valeur du controle lie est une date invalide 
	// ou que cette valeur est a vide (code edition vide si *LOVAL)
	// Dans ce cas, le calendrier selectionne la date du jour : il faut declencher
	// le onchange lorsque cette date est selectionnee
	this.onChangeOnDateSel = false;
	
	// Definition du libelle des jours de la semaine
   initTabDayName(this);
}

/*
* Initialisation du tableau des libelles des noms des jours de la semaine
* Attention : c'est un tableau d'objets avec comme nom de proprietes (attributs)
* les valeurs de la prop daysName (LETTER1, LETTER3).
* Acces du type objCal.tabDayName[i][objCal.daysName]
*/
function initTabDayName (objCal)
{
   switch (objCal.weekStartDay)
   {
      case START_DAY_MONDAY : // lundi
      	if (typeof(AWSCALENDAR_IN_DESIGN_MODE) != 'undefined')
				objCal.tabDayName = new Array ({LETTER1:MONDAY_LETTER1_NAME, LETTER3:MONDAY_LETTER3_NAME}, {LETTER1:TUESDAY_LETTER1_NAME, LETTER3:TUESDAY_LETTER3_NAME}, {LETTER1:WEDNESDAY_LETTER1_NAME, LETTER3:WEDNESDAY_LETTER3_NAME}, {LETTER1:THURSDAY_LETTER1_NAME, LETTER3:THURSDAY_LETTER3_NAME}, {LETTER1:FRIDAY_LETTER1_NAME, LETTER3:FRIDAY_LETTER3_NAME}, {LETTER1:SATURDAY_LETTER1_NAME, LETTER3:SATURDAY_LETTER3_NAME}, {LETTER1:SUNDAY_LETTER1_NAME, LETTER3:SUNDAY_LETTER3_NAME});         
			else
				objCal.tabDayName = new Array ({LETTER1:AWSCalendarMsgBundle.getString('MONDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('MONDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('TUESDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('TUESDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('WEDNESDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('WEDNESDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('THURSDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('THURSDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('FRIDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('FRIDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('SATURDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('SATURDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('SUNDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('SUNDAY_LETTER3_NAME')});         
         break;

      case START_DAY_TUESDAY : // mardi
      	if (typeof(AWSCALENDAR_IN_DESIGN_MODE) != 'undefined')
      		objCal.tabDayName = new Array ({LETTER1:TUESDAY_LETTER1_NAME, LETTER3:TUESDAY_LETTER3_NAME}, {LETTER1:WEDNESDAY_LETTER1_NAME, LONG:WEDNESDAY_LETTER3_NAME}, {LETTER1:THURSDAY_LETTER1_NAME, LONG:THURSDAY_LETTER3_NAME}, {LETTER1:FRIDAY_LETTER1_NAME, LONG:FRIDAY_LETTER3_NAME}, {LETTER1:SATURDAY_LETTER1_NAME, LONG:SATURDAY_LETTER3_NAME}, {LETTER1:SUNDAY_LETTER1_NAME, LONG:SUNDAY_LETTER3_NAME}, {LETTER1:MONDAY_LETTER1_NAME, LONG:MONDAY_LETTER3_NAME});
      	else
				objCal.tabDayName = new Array ({LETTER1:AWSCalendarMsgBundle.getString('TUESDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('TUESDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('WEDNESDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('WEDNESDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('THURSDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('THURSDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('FRIDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('FRIDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('SATURDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('SATURDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('SUNDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('SUNDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('MONDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('MONDAY_LETTER3_NAME')});         
         break;

      case START_DAY_WEDNESDAY : // mercredi
      	if (typeof(AWSCALENDAR_IN_DESIGN_MODE) != 'undefined')
      		objCal.tabDayName = new Array ({LETTER1:WEDNESDAY_LETTER1_NAME, LETTER3:WEDNESDAY_LETTER3_NAME}, {LETTER1:THURSDAY_LETTER1_NAME, LETTER3:THURSDAY_LETTER3_NAME}, {LETTER1:FRIDAY_LETTER1_NAME, LETTER3:FRIDAY_LETTER3_NAME}, {LETTER1:SATURDAY_LETTER1_NAME, LETTER3:SATURDAY_LETTER3_NAME}, {LETTER1:SUNDAY_LETTER1_NAME, LETTER3:SUNDAY_LETTER3_NAME}, {LETTER1:MONDAY_LETTER1_NAME, LETTER3:MONDAY_LETTER3_NAME}, {LETTER1:TUESDAY_LETTER1_NAME, LETTER3:TUESDAY_LETTER3_NAME});
      	else
				objCal.tabDayName = new Array ({LETTER1:AWSCalendarMsgBundle.getString('WEDNESDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('WEDNESDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('THURSDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('THURSDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('FRIDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('FRIDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('SATURDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('SATURDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('SUNDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('SUNDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('MONDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('MONDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('TUESDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('TUESDAY_LETTER3_NAME')});         
         break;

      case START_DAY_THURSDAY : // jeudi
      	if (typeof(AWSCALENDAR_IN_DESIGN_MODE) != 'undefined')
      		objCal.tabDayName = new Array ({LETTER1:THURSDAY_LETTER1_NAME, LETTER3:THURSDAY_LETTER3_NAME}, {LETTER1:FRIDAY_LETTER1_NAME, LETTER3:FRIDAY_LETTER3_NAME}, {LETTER1:SATURDAY_LETTER1_NAME, LETTER3:SATURDAY_LETTER3_NAME}, {LETTER1:SUNDAY_LETTER1_NAME, LETTER3:SUNDAY_LETTER3_NAME}, {LETTER1:MONDAY_LETTER1_NAME, LETTER3:MONDAY_LETTER3_NAME}, {LETTER1:TUESDAY_LETTER1_NAME, LETTER3:TUESDAY_LETTER3_NAME}, {LETTER1:WEDNESDAY_LETTER1_NAME, LETTER3:WEDNESDAY_LETTER3_NAME});
      	else
				objCal.tabDayName = new Array ({LETTER1:AWSCalendarMsgBundle.getString('THURSDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('THURSDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('FRIDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('FRIDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('SATURDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('SATURDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('SUNDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('SUNDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('MONDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('MONDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('TUESDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('TUESDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('WEDNESDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('WEDNESDAY_LETTER3_NAME')});         
         break;

      case START_DAY_FRIDAY : // vendredi
      	if (typeof(AWSCALENDAR_IN_DESIGN_MODE) != 'undefined')
      		objCal.tabDayName = new Array ({LETTER1:FRIDAY_LETTER1_NAME, LETTER3:FRIDAY_LETTER3_NAME}, {LETTER1:SATURDAY_LETTER1_NAME, LETTER3:SATURDAY_LETTER3_NAME}, {LETTER1:SUNDAY_LETTER1_NAME, LETTER3:SUNDAY_LETTER3_NAME}, {LETTER1:MONDAY_LETTER1_NAME, LETTER3:MONDAY_LETTER3_NAME}, {LETTER1:TUESDAY_LETTER1_NAME, LETTER3:TUESDAY_LETTER3_NAME}, {LETTER1:WEDNESDAY_LETTER1_NAME, LETTER3:WEDNESDAY_LETTER3_NAME}, {LETTER1:THURSDAY_LETTER1_NAME, LETTER3:THURSDAY_LETTER3_NAME});
      	else
				objCal.tabDayName = new Array ({LETTER1:AWSCalendarMsgBundle.getString('FRIDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('FRIDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('SATURDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('SATURDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('SUNDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('SUNDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('MONDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('MONDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('TUESDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('TUESDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('WEDNESDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('WEDNESDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('THURSDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('THURSDAY_LETTER3_NAME')});         
         break;

      case START_DAY_SATURDAY : // samedi
      	if (typeof(AWSCALENDAR_IN_DESIGN_MODE) != 'undefined')
      		objCal.tabDayName = new Array ({LETTER1:SATURDAY_LETTER1_NAME, LETTER3:SATURDAY_LETTER3_NAME}, {LETTER1:SUNDAY_LETTER1_NAME, LETTER3:SUNDAY_LETTER3_NAME}, {LETTER1:MONDAY_LETTER1_NAME, LETTER3:MONDAY_LETTER3_NAME}, {LETTER1:TUESDAY_LETTER1_NAME, LETTER3:TUESDAY_LETTER3_NAME}, {LETTER1:WEDNESDAY_LETTER1_NAME, LETTER3:WEDNESDAY_LETTER3_NAME}, {LETTER1:THURSDAY_LETTER1_NAME, LETTER3:THURSDAY_LETTER3_NAME}, {LETTER1:FRIDAY_LETTER1_NAME, LETTER3:FRIDAY_LETTER3_NAME});
      	else
				objCal.tabDayName = new Array ({LETTER1:AWSCalendarMsgBundle.getString('SATURDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('SATURDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('SUNDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('SUNDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('MONDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('MONDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('TUESDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('TUESDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('WEDNESDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('WEDNESDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('THURSDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('THURSDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('FRIDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('FRIDAY_LETTER3_NAME')});         
         break;

      case START_DAY_SUNDAY : // dimanche
      	if (typeof(AWSCALENDAR_IN_DESIGN_MODE) != 'undefined')
      		objCal.tabDayName = new Array ({LETTER1:SUNDAY_LETTER1_NAME, LETTER3:SUNDAY_LETTER3_NAME}, {LETTER1:MONDAY_LETTER1_NAME, LETTER3:MONDAY_LETTER3_NAME}, {LETTER1:TUESDAY_LETTER1_NAME, LETTER3:TUESDAY_LETTER3_NAME}, {LETTER1:WEDNESDAY_LETTER1_NAME, LETTER3:WEDNESDAY_LETTER3_NAME}, {LETTER1:THURSDAY_LETTER1_NAME, LETTER3:THURSDAY_LETTER3_NAME}, {LETTER1:FRIDAY_LETTER1_NAME, LETTER3:FRIDAY_LETTER3_NAME}, {LETTER1:SATURDAY_LETTER1_NAME, LETTER3:SATURDAY_LETTER3_NAME});
      	else
				objCal.tabDayName = new Array ({LETTER1:AWSCalendarMsgBundle.getString('SUNDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('SUNDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('MONDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('MONDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('TUESDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('TUESDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('WEDNESDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('WEDNESDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('THURSDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('THURSDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('FRIDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('FRIDAY_LETTER3_NAME')}, 
						{LETTER1:AWSCalendarMsgBundle.getString('SATURDAY_LETTER1_NAME'), LETTER3:AWSCalendarMsgBundle.getString('SATURDAY_LETTER3_NAME')});         
         break;
   }
}

/*
* Fonction de creation de l'ihm principale du calendrier
* Creation :
* - d'un div global si typepopup est a div,
* - d'une table contenant des parties du calendrier
*/
function CreateGUICalendar(objCal)
{
   var styleCursor, innerHTML, divNode;

	if (objCal.disabled)
   	styleCursor = "cursor:default;";
   else
   {
		if (ie)
   		styleCursor = "cursor:hand;";
	   else
   		styleCursor = "cursor:pointer;";
   }

   
   // Affichage du calendrier   
   innerHTML = "<table id='" + CAL_GEN_TABLE + objCal.calendarID + "' cellspacing='0' cellpadding='0' class='AWSCalendar " + objCal.monthBgColorClass + "' style='background-color:" + objCal.monthBgColor + "'><tr><td><table class='" + objCal.barColorClass + "' style='background-color:" + objCal.barColor + "' width='100%'>" +
      // On fixe l'alignement du td a left suite bug IE7 affichage d'un calendar en popup win : la dimension min de la fenetre
      // est passee de 100 X 100 (IE6) a 250 X 150. Pour centrer le calendar dans la fenetre, on rajoute dans AWSCalendarPopupWin.html
      // une balise center mais cela centre tout le contenu du calendar  
      "<tr><td align='left'><span id='" + CAL_SPAN_TITLE + objCal.calendarID + "'></span></td>";
      
   // si le calendrier n'est pas lie a un controle, alors ne pas mettre la croix de fermeture
   if (objCal.isBoundCtrl && (objCal.popupType == POPUP_DIV))
   {
		innerHTML += "<td align='right'><a href='javascript:closeCalendar(" + objCal.idVarCalAWS + 
         ")'><img id='" + CAL_IMG_CLOSE_CAL + objCal.calendarID + "' class='AWSCalendarImgClose' border='0' title='" + AWSCalendarMsgBundle.getString('CLOSE_CALENDAR') + "'></a></td>";
   }
   innerHTML += "</tr></table></td></tr><tr><td style='padding:5px'><span id='" +
      CAL_SPAN_CONTENT + objCal.calendarID + "'></span></td></tr>";

   // Affichage du span "date du jour" (sans sa valeur)
   if (objCal.showToday)
      innerHTML += "<tr><td><span id='" + CAL_SPAN_LBLTODAY + objCal.calendarID +
      	"' title='" + AWSCalendarMsgBundle.getString('GOTO_TODAY') + "' style='" + styleCursor + "' onclick='setToday(" + objCal.idVarCalAWS + ");'></span></td></tr>";

   innerHTML += "</table>";

   // Si le calendrier est lie en popup div, il ne faut pas le creer a la volee (document.write)
   // car le tag calendar peut etre a l'interieur d'un tag <p> (interdit en XHTML => casse le <p>)
   // Donc on le cree comme 1er fils du body
   if (objCal.isBoundCtrl && (objCal.popupType == POPUP_DIV))
   {
      divNode = document.createElement("div");      
      divNode.setAttribute('id', CAL_POPUP_DIV + objCal.calendarID);
      divNode.innerHTML = innerHTML;
      if (ie)      
         divNode.style.setAttribute('cssText', 'visibility:hidden;position:absolute;top:0px;left:0px;z-index:1;');      
      else
         divNode.setAttribute('style', 'visibility:hidden;position:absolute;top:0px;left:0px;z-index:1;');
   	
   	// Ajout du div au body   
   	document.body.insertBefore(divNode, document.body.firstChild);
   }
   else   
      document.write(innerHTML);   

   // On fixe la classe des images
	if (objCal.isBoundCtrl && (objCal.popupType == POPUP_DIV))
      setBackgroundImageClass(CAL_IMG_CLOSE_CAL + objCal.calendarID);

	// Affichage de la date selectionnee
	initGUICalendar(objCal);
   
   // creation du div servant de base au tooltip
   createTooltip ();
}


/*
* Fonction appele lorsqu'on clic sur le bouton d'incrementation
* du mois
*/
function onClickImgIncrMonth (objImg, objCal)
{
   // le curseur est a defaut si on ne peut incrementer le mois
   // (car date max ou calendrier disabled)
   if (objImg.style.cursor != "default")
   {
      // affiche le calendrier avec le mois suivant
   	incrMonth(objCal);
   }
}

/*
* Fonction appele lorsqu'on clic sur le bouton de decrementation
* du mois
*/
function onClickImgDecrMonth (objImg, objCal)
{
   // le curseur est a defaut si on ne peut decrementer le mois
   // (car date max ou calendrier disabled)
   if (objImg.style.cursor != "default")
   {
      // affiche le calendrier avec le mois precedent
   	decrMonth(objCal);      
   }
}

/*
* Fonction appele lorsqu'on clic sur le bouton d'incrementation
* de l'annee
*/
function onClickImgIncrYear(objImg, objCal)
{
   // le curseur est a defaut si on ne peut incrementer l'annee
   // (car date max ou calendrier disabled)
	if (objImg.style.cursor != "default")
   {
      // affiche le calendrier avec l'annee suivante
   	incrYear(objCal);      
   }
}

/*
* Fonction appele lorsqu'on clic sur le bouton de decrementation
* de l'annee
*/
function onClickImgDecrYear(objImg, objCal)
{
   // le curseur est a defaut si on ne peut decrementer l'annee
   // (car date max ou calendrier disabled)
	if (objImg.style.cursor != "default")
   {
      // affiche le calendrier avec l'annee precedente
   	decrYear(objCal);      
   }
}

function onMouseOutImgIncrDecr ()
{
   if (typeof(intervalID1) != 'undefined')
	   clearInterval(intervalID1);
}

function onMouseUpImgIncrDecr ()
{
   if (typeof(timeoutID1) != 'undefined')
   {
		clearTimeout(timeoutID1);
      try
      {
      	timeoutID1 = undefined;
      }
      catch (e)
      {
         timeoutID1 = void 0;
      }
   }
   if (typeof(intervalID1) != 'undefined')
   {
		clearInterval(intervalID1);
      try
      {
      	intervalID1 = undefined;
      }
      catch(e)
      {
         intervalID1 = void 0;
      }
   }
}

function onMouseDownImgDecrMonth(objImg, objCal)
{
   // le curseur est a defaut si on ne peut decrementer le mois
   // (car date max ou calendrier disabled)
	if (objImg.style.cursor != "default")
   {
      if (typeof(timeoutID1) != 'undefined')
	   	clearTimeout(timeoutID1);

      timeoutID1 = setTimeout("StartDecrMonth(" + objCal.idVarCalAWS + ")", 500);
   }
}

function onMouseDownImgDecrYear(objImg, objCal)
{
   // le curseur est a defaut si on ne peut decrementer l'annee
   // (car date max ou calendrier disabled)
   if (objImg.style.cursor != "default")
   {
      if (typeof(timeoutID1) != 'undefined')
   		clearTimeout(timeoutID1);

      timeoutID1 = setTimeout("StartDecrYear(" + objCal.idVarCalAWS + ")", 500);
   }
}

function onMouseDownImgIncrYear(objImg, objCal)
{
   // le curseur est a defaut si on ne peut incrementer l'annee
   // (car date max ou calendrier disabled)
   if (objImg.style.cursor != "default")
   {
      if (typeof(timeoutID1) != 'undefined')
   		clearTimeout(timeoutID1);

      timeoutID1 = setTimeout("StartIncrYear(" + objCal.idVarCalAWS + ")", 500);
   }
}

function onMouseDownImgIncrMonth(objImg, objCal)
{
   // le curseur est a defaut si on ne peut incrementer le mois
   // (car date max ou calendrier disabled)
	if (objImg.style.cursor != "default")
   {
      if (typeof(timeoutID1) != 'undefined')
	   	clearTimeout(timeoutID1);

      timeoutID1 = setTimeout("StartIncrMonth(" + objCal.idVarCalAWS + ")", 500);
   }
}

/*
* Affiche le calendrier avec la date du jour
* Fonction appelee lorsqu'on clic sur le texte de la date du jour
*/
function setToday(objCal)
{
   if (objCal.disabled)
   	return;

   objCal.monthDisplay = MONTH_TODAY_DATE;
	objCal.yearDisplay = YEAR_TODAY_DATE;

   // affiche le calendrier avec la date du jour
	constructCalendar(objCal);
}

/*
* Affiche le calendrier avec la date selectionnee
* Fonction appelee lorsqu'on clic sur l'image CAL_IMG_GOTO_DATESEL 
*/
function gotoDateSelected(objCal)
{
   if (objCal.disabled)
   	return;
   
   objCal.monthDisplay = objCal.monthSelected;
	objCal.yearDisplay = objCal.yearSelected;

   // affiche le calendrier avec la date selectionnee
	constructCalendar(objCal);   
}

/*
* Fonction d'affichage des parties du calendrier en rapport avec la date courante
* - Affichage de la valeur de date du jour (span CAL_SPAN_LBLTODAY)
* - Affichage de la barre de titre (span CAL_SPAN_TITLE) sans sa valeur
* - Affichage des valeurs des jours du mois courant
*/
function initGUICalendar(objCal)
{
   var sHTML1, styleCursor;

   if (! ns4)
   {
      if (objCal.showToday)
		{
			// Affichage de la date du jour
         var textToday = "<table style='width:100%' cellspacing='0' cellpadding='0'><tr><td align='center'";
      
         textToday += "><font color='" + objCal.daysColor + "' class='" + objCal.daysColorClass + "'>&nbsp;" + AWSCalendarMsgBundle.getString('TODAY_NAME') + " "         	
            + SscDateVersTexte (YEAR_TODAY_DATE * 10000 + (MONTH_TODAY_DATE + 1) * 100 + DAY_TODAY_DATE)
            + "</font>";

			textToday += "</td></tr><tr height='3px'><td></td></tr></table>";
         document.getElementById(CAL_SPAN_LBLTODAY + objCal.calendarID).innerHTML = textToday;         
		}
      if (ie)
   		styleCursor = "cursor:hand;";
   	else
   		styleCursor = "cursor:pointer;";

		// Creation du contenu de la barre de titre (span titleBar)
		// Affichage des fleches suiv/prec du mois et de l'annee ainsi que des span pour l'affichage du mois et de l'annee selectionnes				
		sHTML1 = "<img id='" + CAL_IMG_DECR_MONTH + objCal.calendarID + "' style='" + styleCursor + "' title='" + AWSCalendarMsgBundle.getString('SCROLL_LEFT_MONTH') + 
         "' class='AWSCalendarImgDecrMonth' border='0' onclick='onClickImgDecrMonth(this, " + objCal.idVarCalAWS + ")' onmouseout='onMouseOutImgIncrDecr()' onmousedown='onMouseDownImgDecrMonth(this, " + objCal.idVarCalAWS + ")' onmouseup='onMouseUpImgIncrDecr()'/>";
      
		sHTML1 += "<img id='" + CAL_IMG_DECR_YEAR + objCal.calendarID + "' style='" + styleCursor + "' title='" + AWSCalendarMsgBundle.getString('SCROLL_LEFT_YEAR') +
         "' class='AWSCalendarImgDecrYear' border='0' onclick='onClickImgDecrYear(this, " + objCal.idVarCalAWS + ")' onmouseout='onMouseOutImgIncrDecr()' onmousedown='onMouseDownImgDecrYear(this, " + objCal.idVarCalAWS + ")' onmouseup='onMouseUpImgIncrDecr()'/>&nbsp";

		sHTML1 += "<img id='" + CAL_IMG_INCR_YEAR + objCal.calendarID + "' style='" + styleCursor + "' title='" + AWSCalendarMsgBundle.getString('SCROLL_RIGHT_YEAR') +
         "' class='AWSCalendarImgIncrYear' border='0' onclick='onClickImgIncrYear(this, " + objCal.idVarCalAWS + ")' onmouseout='onMouseOutImgIncrDecr()' onmousedown='onMouseDownImgIncrYear(this, " + objCal.idVarCalAWS + ")' onmouseup='onMouseUpImgIncrDecr()'/>";

		sHTML1 += "<img id='" + CAL_IMG_INCR_MONTH + objCal.calendarID + "' style='" + styleCursor + "' title='" + AWSCalendarMsgBundle.getString('SCROLL_RIGHT_MONTH') +
         "' class='AWSCalendarImgIncrMonth' border='0' onclick='onClickImgIncrMonth(this, " + objCal.idVarCalAWS + ")' onmouseout='onMouseOutImgIncrDecr()' onmousedown='onMouseDownImgIncrMonth(this, " + objCal.idVarCalAWS + ")' onmouseup='onMouseUpImgIncrDecr()'/>";

		sHTML1 += "<img id='" + CAL_IMG_GOTO_DATESEL + objCal.calendarID + "' style='" + styleCursor + "' title='" + AWSCalendarMsgBundle.getString('GOTO_DATESEL') +
         "' class='AWSCalendarImgGotoDateSel' border='0' onclick='gotoDateSelected(" + objCal.idVarCalAWS + ")' />&nbsp;";
      
      sHTML1 += "&nbsp;";
      
      // Pour le DnD, si le calendrier est en popup div, on englobe les span des mois et annee
      // dans un span qui sert de poignee au DnD
      if (objCal.isBoundCtrl && (objCal.popupType == POPUP_DIV))
         sHTML1 += "<span style='cursor:move' onmousedown='startDrag(event, " + objCal.idVarCalAWS + ")' onmouseup='endDrag(event)'>";

      sHTML1 += "<span id='" + CAL_SPAN_MONTH + objCal.calendarID + "' style='color:" + objCal.titleColor + "' class='" + objCal.titleColorClass + "'></span>&nbsp;";
      sHTML1 += "<span id='" + CAL_SPAN_YEAR + objCal.calendarID + "' style='color:" + objCal.titleColor + "' class='" + objCal.titleColorClass + "'></span>";

      if (objCal.isBoundCtrl && (objCal.popupType == POPUP_DIV))
         sHTML1 += "</span>";

      document.getElementById(CAL_SPAN_TITLE + objCal.calendarID).innerHTML = sHTML1;

      // On fixe la classe des images
		setBackgroundImageClass(CAL_IMG_DECR_MONTH + objCal.calendarID);
		setBackgroundImageClass(CAL_IMG_DECR_YEAR + objCal.calendarID);
		setBackgroundImageClass(CAL_IMG_INCR_YEAR + objCal.calendarID);
		setBackgroundImageClass(CAL_IMG_INCR_MONTH + objCal.calendarID);
		setBackgroundImageClass(CAL_IMG_GOTO_DATESEL + objCal.calendarID);

      // on construit l'affichage des jours du mois courant du calendrier que s'il a une date selectionnee
      // (ce qui evite un bug ie qui affecte les curseurs des images incr/decr mois annees
      // entre calendriers : effet de bord)
      if (! isNaN(objCal.daySelected))
      {         
         objCal.monthDisplay = objCal.monthSelected;
         objCal.yearDisplay = objCal.yearSelected;
	      constructCalendar(objCal);
      }
   }
}

/*
* Rend invisible de div calendar ainsi que les div
* de selection du mois et de l'annee
*/
function hideCalendar(objCal)
{
   try
   {
      // Cacher le div calendar (qui n'existe pas c'est un calendrier en popup_win_xxx)
		document.getElementById(CAL_POPUP_DIV + objCal.calendarID).style.visibility = "hidden";
   	// on cache les div en position absolue car ils ne se cachent pas si leur parent est cache
   	document.getElementById(CAL_DIV_SELDAY + objCal.calendarID + objCal.daySelected).style.visibility = "hidden";
   }
   catch(e)
   {      
   }
   finally
   {
      // Cacher l'iframe si calendrier en popup div
      if (awsCalIFrame != null)  
      {             
         awsCalIFrame.style.left = '-1000px';
         awsCalIFrame.style.top = '-1000px';
         awsCalIFrame.style.width = 0;
         awsCalIFrame.style.height = 0;
      }
   }
}


/*
* Rend visible de div calendar ainsi que les div
* de selection du mois et de l'annee
*/
function showCalendar(objCal)
{
	// Montrer le div calendar
	document.getElementById(CAL_POPUP_DIV + objCal.calendarID).style.visibility = "visible";
   // on montre les div en position absolue s'ils doivent etre affiches
   try
   {
      document.getElementById(CAL_DIV_SELDAY + objCal.calendarID + objCal.daySelected).style.visibility = "visible";      
   }
   catch(e)
   {
   }
}

function closeCalendar(objCal)
{
   hideCalendar(objCal);

   if ((objCal.popupType == POPUP_WIN) || (objCal.popupType == POPUP_WIN_MODAL))
   	self.close();
}

function StartDecrMonth(objCal)
{
   intervalID1 = setInterval("decrMonth(" + objCal.idVarCalAWS + ")", 150);
}

function StartIncrMonth(objCal)
{
   intervalID1 = setInterval("incrMonth(" + objCal.idVarCalAWS + ")", 150);
}

function incrMonth (objCal)
{
   if (document.getElementById(CAL_IMG_INCR_MONTH + objCal.calendarID).style.cursor != "default")
   {	   
      objCal.monthDisplay++;   
      if (objCal.monthDisplay > 11)
		{         
         objCal.monthDisplay = 0;
	      objCal.yearDisplay++;
   	}
	   constructCalendar(objCal);
   }
   else
   {
      clearInterval(intervalID1);
      try
      {
      	intervalID1 = undefined;
      }
      catch (e)
      {
         intervalID1 = void 0;
      }
   }
}

function decrMonth (objCal)
{
   if (document.getElementById(CAL_IMG_DECR_MONTH + objCal.calendarID).style.cursor != "default")
   {	   
      objCal.monthDisplay--;	 
      if (objCal.monthDisplay < 0)
		{         
         objCal.monthDisplay = 11;
	      objCal.yearDisplay--;
   	}
	   constructCalendar(objCal);
   }
   else
   {
      clearInterval(intervalID1);
      try
      {
      	intervalID1 = undefined;
      }
      catch (e)
      {
         intervalID1 = void 0;
      }
   }
}

function StartDecrYear(objCal)
{
   intervalID1 = setInterval("decrYear(" + objCal.idVarCalAWS + ")", 150);
}

function StartIncrYear(objCal)
{
   intervalID1 = setInterval("incrYear(" + objCal.idVarCalAWS + ")", 150);
}

function incrYear (objCal)
{
   if (document.getElementById(CAL_IMG_INCR_YEAR + objCal.calendarID).style.cursor != "default")
   {   
      objCal.yearDisplay++;
	   constructCalendar(objCal);
   }
   else
   {
      clearInterval(intervalID1);
      try
      {
      	intervalID1 = undefined;
      }
      catch (e)
      {
         intervalID1 = void 0;
      }
   }
}

function decrYear (objCal)
{
   if (document.getElementById(CAL_IMG_DECR_YEAR + objCal.calendarID).style.cursor != "default")
   {   
      objCal.yearDisplay--;
	   constructCalendar(objCal);
   }
   else
   {
      clearInterval(intervalID1);
      try
      {
      	intervalID1 = undefined;
      }
      catch (e)
      {
         intervalID1 = void 0;
      }
   }
}

/*
* Calcul le numero de semaine d'une date
* today date de travail
*/
function WeekNbr(today)
{
   var Year = today.getFullYear();
   var Month = today.getMonth();
   var Day = today.getDate();
   var newYear = new Date();
   newYear.setFullYear(Year);
   newYear.setMonth(0);
   newYear.setDate(1);

   var modDay = newYear.getDay();

	if (modDay == 0)
		modDay = 6;
   else
   	modDay--;

   var daynum = ((Date.UTC(Year, Month, Day, 0, 0, 0) -
		Date.UTC(Year, 0, 1, 0, 0, 0)) / 1000 / 60 / 60 / 24) + 1;

	if (modDay < 4)
   {
		var weeknum = Math.floor((daynum + modDay - 1) / 7) + 1;
	}
	else
   {
		var weeknum = Math.floor((daynum + modDay - 1) / 7);
		if (weeknum == 0)
      {
			Year--;
         var prevNewYear = new Date();
         prevNewYear.setFullYear(Year);
   		prevNewYear.setMonth(0);
   		prevNewYear.setDate(1);

			var prevmodDay = prevNewYear.getDay();
			if (prevmodDay == 0)
         	prevmodDay = 6;
         else
         	prevmodDay--;

			if (prevmodDay < 4)
         	weeknum = 53;
         else
         	weeknum = 52;
		}
	}
   return weeknum;
}

function TextWeekNbr (objCal, today)
{
   var numWeek = WeekNbr(today);

   if (numWeek < 10)   
      return "<span style='visibility:hidden'>0</span>" + numWeek;   
   else
   	return numWeek;
}

/*
* Fixe la date selectionnee sur :
* - l'objet calendrier s'il n'est pas lie
* - l'objet lie si le calendrier est lie
* Fonction appelee lorqu'on clic sur le texte d'un numero de jour
*/
function selectDay(objCal, day)
{
   var oldDaySelected = objCal.daySelected;
   var oldMonthSelected = objCal.monthSelected;
   var oldYearSelected = objCal.yearSelected;
   var boundCtrl;

   objCal.daySelected = day;
   objCal.monthSelected = objCal.monthDisplay;
   objCal.yearSelected = objCal.yearDisplay;
   if (objCal.isBoundCtrl)
   {
      // calendrier lie
      if (objCal.popupType == POPUP_DIV)
      	boundCtrl = document.getElementById(objCal.boundCtrlId);
      else
      	// popup win
         boundCtrl = window.opener.document.getElementById(objCal.boundCtrlId);
            
      // on formate la date en texte suivant les infos du controle lie
      // et on le fixe au controle lie
      setTextValueBoundCtrl (boundCtrl, formatDateSelected (objCal, boundCtrl));      
      closeCalendar(objCal);      
   }
   else
   {
      // calendrier non lie            
      dateSelected = convertDateToInt(objCal);
   	// mettre a jour l'attribut valeur du champ cache
	   document.getElementById(objCal.calendarID).value = dateSelected;         
   }
   if ((typeof objCal.onChange != 'undefined') && ((oldDaySelected != day) || (objCal.monthSelected != oldMonthSelected)
         || (objCal.yearSelected != oldYearSelected) || objCal.onChangeOnDateSel))
      objCal.onChange();
}

/*
* Convertit une date sur 8 en date adelia
* convention : le siecle est le siecle courant
* - date : date sur 8 a convertir (int)
* - format : format du parametre date (DMY, etc.)
*/
function convertDate8ToAdeliaDate (date, format)
{
   var annee = 0, mois = 0, jour = 0;

   switch (format)
   {
      case FORMAT_AJM :
         annee = Math.floor(date / 10000);
         mois = date % 100;
         jour  = Math.floor(date / 100) % 100;
         break;

      case FORMAT_AMJ :
         annee = Math.floor(date / 10000);
         mois = Math.floor(date / 100) % 100;
         jour  = date % 100;
         break;

      case FORMAT_JAM :
         annee = Math.floor(date / 100) % 10000;
         mois = date % 100;
         jour  = Math.floor(date / 1000000);
         break;

      case FORMAT_JMA :
         annee = date % 10000;
         mois = Math.floor(date / 10000) % 100;
         jour  = Math.floor(date / 1000000);
         break;

      case FORMAT_MAJ :
         annee = Math.floor(date / 100) % 10000;
         mois = Math.floor(date / 1000000);
         jour  = date % 100;
         break;

      case FORMAT_MJA :
         annee = date % 10000;
         mois = Math.floor(date / 1000000);
         jour  = Math.floor(date / 10000) % 100;
         break;

      default :
         break;
   }
   return (annee * 10000 + mois * 100 + jour);
}

/*
* Convertie sur date sur 6 en date adelia
* convention : si l'annee est inf a 40 alors siecle egal 20
* sinon siecle egal 19
* - date : date sur 6 a convertir (int)
* - format : format du parametre date (DMY, etc.)
*/
function convertDate6ToAdeliaDate (date, format)
{
   var annee = 0, mois = 0, jour = 0, annee2Digits;

   switch (format)
   {
      case FORMAT_AJM :
      	annee2Digits = Math.floor(date / 10000);
         annee = annee2Digits + (annee2Digits < 40 ? 2000 : 1900);
         mois = date % 100;
         jour  = Math.floor(date / 100) % 100;
         break;

      case FORMAT_AMJ :
      	annee2Digits = Math.floor(date / 10000);
         annee = annee2Digits + (annee2Digits < 40 ? 2000 : 1900);
         mois = Math.floor(date / 100) % 100;
         jour  = date % 100;
         break;

      case FORMAT_JAM :
      	annee2Digits = Math.floor(date / 100) % 100;
         annee = annee2Digits + (annee2Digits < 40 ? 2000 : 1900);
         mois = date % 100;
         jour  = Math.floor(date / 10000);
         break;

      case FORMAT_JMA :
      	annee2Digits = date % 100;
         annee = annee2Digits + (annee2Digits < 40 ? 2000 : 1900);
         mois = Math.floor(date / 100) % 100;
         jour  = Math.floor(date / 10000);
         break;

      case FORMAT_MAJ :
      	annee2Digits = Math.floor(date / 100) % 100;
         annee = annee2Digits + (annee2Digits < 40 ? 2000 : 1900);
         mois = Math.floor(date / 10000);
         jour  = date % 100;
         break;

      case FORMAT_MJA :
      	annee2Digits = date % 100;
         annee = annee2Digits + (annee2Digits < 40 ? 2000 : 1900);
         mois = Math.floor(date / 10000);
         jour  = Math.floor(date / 100) % 100;
         break;

      default :
         break;
   }
   return (annee * 10000 + mois * 100 + jour);
}

function convertDateToDate8 (year, month, day, format)
{
   switch (format)
   {
      case FORMAT_AJM :
         return (year * 10000 + day * 100 + month);

      case FORMAT_AMJ :
         return (year * 10000 + month * 100 + day);

      case FORMAT_JAM :
         return (day * 1000000 + year * 100 + month);

      case FORMAT_JMA :
         return (day * 1000000 + month * 10000 + year);

      case FORMAT_MAJ :
         return (month * 1000000 + year * 100 + day);

      case FORMAT_MJA :
         return (month * 1000000 + day * 10000 + year);

      default :
         return (0);
   }
}

/*
* Calcul une date sur 6 en fonction d'un jour, d'un mois
* d'une annee et d'un format (DMY, etc.)
*/
function convertDateToDate6 (year, month, day, format)
{
   switch (format)
   {
      case FORMAT_AJM :
         return ((year % 100) * 10000 + day * 100 + month);

      case FORMAT_AMJ :
         return ((year % 100) * 10000 + month * 100 + day);

      case FORMAT_JAM :
         return (day * 10000 + (year % 100) * 100 + month);

      case FORMAT_JMA :
         return (day * 10000 + month * 100 + (year % 100));

      case FORMAT_MAJ :
         return (month * 10000 + (year % 100) * 100 + day);

      case FORMAT_MJA :
         return (month * 10000 + day * 100 + (year % 100));

      default :
         return (0);
   }
}

/*
* Fixe la date date comme valeur de date courante du calendrier
* - date : date au format type adelia du calendrier (int)
*  ou date sur 6 ou sur 8 (int) au format dateFormat du calendrier
* - objCal : calendrier non lie
* Fonction appelee a la creation du l'objet calendrier (new CalendarAWS)
* dans le cas non lie
*/
function setDateSelected(objCal, date)
{
   var adeliaDateTmp;

   switch (objCal.type)
   {
      case TA_DATE :
      	adeliaDateTmp = date;
      	break;

      case TA_NUM_P :
      case TA_NUM_E :
      	if (objCal.typeLength == 6)
         	adeliaDateTmp = convertDate6ToAdeliaDate (date, objCal.dateFormat);
         else if (objCal.typeLength == 8)
         	adeliaDateTmp = convertDate8ToAdeliaDate (date, objCal.dateFormat);
         else
         	adeliaDateTmp = YEAR_TODAY_DATE * 10000 + (MONTH_TODAY_DATE + 1) * 100 + DAY_TODAY_DATE;
      	break;
   }
   objCal.yearSelected = getYearAdeliaDate(adeliaDateTmp);
   objCal.monthSelected = getMonthAdeliaDate(adeliaDateTmp) - 1;
   objCal.daySelected = getDayAdeliaDate(adeliaDateTmp);
}

/*
* Fonction de formatage de la valeur date selectionnee du calendrier
* Retourne une chaine formatee en fonction du type (DATE ou NUM_EP),
* du code edition ou mot edition, etc. du controle lie
* Cette date est fixee a l'objet lie
*/
function formatDateSelected(objCal, boundCtrl)
{
   var year = objCal.yearSelected;
   var month = objCal.monthSelected + 1;
   var day = objCal.daySelected;     
   var editCode, editWord, valInt = 0;

   editCode = boundCtrl.getAttribute('editcode')
   if (editCode == null)
      // l'attribut editcode peut ne pas etre present dans le tag
      // Dans ce cas il vaut aucun
      editCode = VGENJSP_EAUCUN;
   else
      editCode = parseInt(editCode);

   switch (objCal.type)
   {
      case TA_DATE :
      	// formater suivant la locale (ex: JJ/MM/AAAA, etc.)
         return SscDateVersTexte2 (year * 10000 + month * 100 + day, editCode);

      case TA_NUM_P :
      case TA_NUM_E :
         if (objCal.typeLength == 6)
         	valInt = convertDateToDate6 (year, month, day, objCal.dateFormat);
         else if (objCal.typeLength == 8)
         	valInt = convertDateToDate8 (year, month, day, objCal.dateFormat);         
                   
         editWord = boundCtrl.getAttribute('editword');
         return SscItoA2 (valInt, objCal.typeLength, objCal.typeNbDec, editWord, editCode);
   }
}

/*
* Fait apparaitre le rond de selection sur le jour selectionne et
* fixe la couleur du texte du jour selectionne a titleColor
*/
function displaySelectionDay (objCal, numDay)
{
   var divSel = document.getElementById(CAL_DIV_SELDAY + objCal.calendarID + numDay);
   var jg = new jsGraphics(CAL_DIV_SELDAY + objCal.calendarID + numDay);
   var color = getBarColor(objCal);
   var dateClass, fontObj;

   jg.clear();
   if (color != '')
   	jg.setColor(color);

   jg.fillEllipse(0, 0, divSel.offsetWidth, divSel.offsetHeight);
   jg.paint();
   divSel.style.visibility = "visible";

   // Stocker les valeurs de color et de className (qui ne sont plus forcement getDaysColor(objCal) et objCal.daysColorClass - cf hideSelectionDay)
	// car on peut fixer une classe via la methode FIXER_CLASSE_DATE qui fixe color et background-color.
	fontObj = divSel.parentNode.lastChild;
   fontObj.setAttribute('oldColor', fontObj.color);
	fontObj.setAttribute('oldClassName', fontObj.className);	
   // fixer la couleur du texte du jour selectionne
   fontObj.color = objCal.titleColor;
   fontObj.className = objCal.titleColorClass;
}

/*
* Cache le rond de selection sur le jour selectionne et
* fixe la couleur du texte du jour selectionne a daysColor
*/
function hideSelectionDay (objCal, numDay)
{
   var divSel = document.getElementById(CAL_DIV_SELDAY + objCal.calendarID + numDay);
   var dateClass, fontObj;

   divSel.style.visibility = "hidden";

   // fixer la couleur du texte du jour numDay   
	// Les anciennes valeurs sont stockees dans displaySelectionDay
	fontObj = divSel.parentNode.lastChild;
	fontObj.color = fontObj.getAttribute('oldColor');
   fontObj.className = fontObj.getAttribute('oldClassName');
}

function changeDisplaySelectedDay(e, objCal, newDay)
{
	// changeDisplaySelectedDay est appele a la fois sur le mousedown du div general
	// et sur le div de l'image de la date encerclee => l'event est propagé aux 2 div
	// Il faut stoper la propagation sinon bug si la date select est la date encerclee puis
	// clic sur autre date puis clic sur date encerclee
	if (ie)
	   window.event.cancelBubble = true;
   else
	   e.stopPropagation();

   if (! objCal.isBoundCtrl)
   {
      // Cas calendrier non lie : si on clic sur le jour deja selectionne
   	// alors ne rien faire
	   if (newDay == objCal.daySelected)
   		return;

		hideSelectionDay (objCal, objCal.daySelected);
      displaySelectionDay (objCal, newDay);
   }
   else
   {
      // Cas calendrier lie : si on clic sur la date du controle
	   // alors ne rien faire
      if ((objCal.daySelected == newDay) && (objCal.monthDisplay == objCal.monthSelected)
   			&& (objCal.yearDisplay == objCal.yearSelected))
	      return;

      // si on se trouve dans le mois de la date selectionnee, alors changer visuellement la selection
      if ((objCal.monthDisplay == objCal.monthSelected) && (objCal.yearDisplay == objCal.yearSelected))
      	hideSelectionDay (objCal, objCal.daySelected);

      displaySelectionDay (objCal, newDay);
   }
}

/*
* Affiche dans le calendrier la date courante :
* - dans la barre de titre (mois courante et annee courante)
* - dans le mois courant (span CAL_SPAN_CONTENT) avec affichage des valeurs des jours
* et du jour courant
*/
function constructCalendar (objCal)
{
   var aNumDays = Array (31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);   
   var startDate = new Date (objCal.yearDisplay, objCal.monthDisplay, 1);
   var endDate, numDaysInMonth, datePointer, dayPointer;
   var sHTML, onClickCode, sStyle, onMouseDownCode, onMouseOverCode, onMouseOutCode;
   var nbWeek = 1;   
   var dateClass = '';   

	// calcul du nb de jour dans le mois   
   if (objCal.monthDisplay == 1)
   {
		// mois de fevrier      
      endDate = new Date (objCal.yearDisplay, objCal.monthDisplay + 1, 1);
      endDate = new Date (endDate - (24 * 60 * 60 * 1000));
      numDaysInMonth = endDate.getDate();
   }
   else      
      numDaysInMonth = aNumDays[objCal.monthDisplay];
	
   datePointer = 0;
   dayPointer = (startDate.getDay() + 7 - convertWeekStartDayToInt(objCal.weekStartDay)) % 7;

   sHTML = "<table border='0' cellspacing='0' cellpadding='0' width='100%'><tr>";

	// construction de la ligne contenant le libelle des mois
	if (objCal.showWeekNumber)
      sHTML += "<td></td>";

	// Affichage des libelles des jours de la semaine
   for (i = 0; i < 7; i++)
      sHTML += "<td id='" + CAL_TD_LBLDAY + objCal.calendarID + i + "' align='center' style='border-bottom:" +      	
         objCal.horzLineColor + " solid 1px;' class='" + objCal.horzLineColorClass + "'><font color='" + objCal.daysWeekColor + "' class='" +
         objCal.daysWeekColorClass + "'>" + objCal.tabDayName[i][objCal.daysName] + "</font></td>";

   sHTML += "</tr>";

   if (objCal.showWeekNumber)
   	sHTML += "<tr height='3px'><td colspan='8'></td></tr>";

	sHTML += "<tr>";

	// affichage du numero de semaine
   if (objCal.showWeekNumber)      
      sHTML += "<td align='right' style='border-right:" + objCal.vertLineColor + " solid 1px;' class='" + objCal.vertLineColorClass + "'><font color='" + objCal.numWeekColor + "' class='" + objCal.numWeekColorClass + 
         "'>" + TextWeekNbr(objCal, startDate) + "&nbsp;</font></td>";

	// affichage d'espace jusqu'au bon libelle du premier jour du mois
   for (i = 1; i <= dayPointer; i++)
      sHTML += "<td>&nbsp;</td>";

	// on parcours les jours du mois selectionne
   for (datePointer = 1; datePointer <= numDaysInMonth; datePointer++)
   {
      sStyle = "";
      dayPointer++;		

		// on fixe le surseur par defaut si la date est inf a minDate ou sup a maxDate
      // ou si le calendrier est disabled
      if ((! isDateInMinMaxDate (objCal, datePointer, objCal.monthDisplay, objCal.yearDisplay)) || 
         (typeof(objCal.getSelectionDate) != 'undefined' && objCal.getSelectionDate != '' && ! objCal.getSelectionDate(datePointer, objCal.monthDisplay + 1, objCal.yearDisplay)) ||
         objCal.disabled)
      {
         sStyle += "cursor:default;";
         onClickCode = "";
         onMouseDownCode = "";
      }
      else
      {
         if (ie)
         	sStyle += "cursor:hand;";
         else
         	sStyle += "cursor:pointer;";

         onClickCode = "selectDay(" + objCal.idVarCalAWS + ", " + datePointer + ");";
         onMouseDownCode = "changeDisplaySelectedDay(event," + objCal.idVarCalAWS + ", " + datePointer + ");";
      }
      // Gestion du tooltip (methode FIXER_INFOBULLE_DATE)
      if (typeof(objCal.getTooltipDate) != 'undefined' && objCal.getTooltipDate != '')              
      {
         onMouseOverCode = "showTooltipDate(event, " + objCal.idVarCalAWS + ", " + datePointer + ");";
         onMouseOutCode = "hideTooltipDate(event);";
      }
      else
      {
         onMouseOverCode = "";
         onMouseOutCode = "";
      }
      
      // Gestion de la classe CSS de la cellule (methode FIXER_CALSSE_DATE)
      if (typeof(objCal.getClassDate) != 'undefined' && objCal.getClassDate != '')                
          dateClass = objCal.getClassDate(datePointer, objCal.monthDisplay + 1, objCal.yearDisplay);

		// Il faut fixer le z-index Ó 0 sinon si valeur par defaut (auto), le div de selection de date ne
      // s'affiche pad en Gecko.
		// On fixe dateClass sur le td (et plus sur le div car en gecko le div de selection de date ne s'affichait plus)
      sHTML += "<td align='center' class='" + dateClass + "'><div style='position:relative;width:100%;height:100%;z-index:0;" + sStyle +               	
         "' onclick='" + onClickCode + "' onmousedown='" + onMouseDownCode +
         "' onmousemove='" + onMouseOverCode + "' onmouseout='" + onMouseOutCode + "'>" +          
      	"<div id='" + CAL_DIV_SELDAY + objCal.calendarID + datePointer + "' style='position:absolute;visibility:hidden;top:0px;left:0px;width:100%;height:100%;z-index:-1'></div>";

		// On fixe dateClass sur le tag font car cette classe peut definir l'attribut color
      sHTML += "<font color='" + objCal.daysColor + "' class='" + objCal.daysColorClass + " " + dateClass + "'>&nbsp;" + datePointer + "&nbsp;</font>";

		sHTML += "</div></td>";
      if ((dayPointer % 7) == 0)
		{
         sHTML += "</tr>";
         if (datePointer < numDaysInMonth)
         {
         	sHTML += "<tr>";
            nbWeek++;
         }

         if (objCal.showWeekNumber && (datePointer < numDaysInMonth))
            sHTML += "<td align='right' style='border-right:" + objCal.vertLineColor + " solid 1px;' class='" + objCal.vertLineColorClass + "'><font color='" +       
               objCal.numWeekColor + "' class='" + objCal.numWeekColorClass + "'>" + TextWeekNbr(objCal, new Date(objCal.yearDisplay, objCal.monthDisplay, datePointer + 1)) + "&nbsp;</font></td>";
      }
   }
   // finir la derniere semaine
   if ((dayPointer % 7) != 0)
   {
   	while (dayPointer % 7 != 0)
   	{
      	sHTML += "<td>&nbsp;</td>";
	      dayPointer++;
   	}
      sHTML += "</tr>";
   }
   // Rajouter une ligne si le nb de semaine du mois est inf a 6
   while (nbWeek < 6)
   {
      sHTML += "<tr>";
      if (objCal.showWeekNumber)
      	sHTML += "<td>&nbsp;</td>";

      for (i = 0; i < 7; i++)
      	sHTML += "<td>&nbsp;</td>";

      sHTML += "</tr>";
      nbWeek++;
   }
   sHTML += "</table>";

   document.getElementById(CAL_SPAN_CONTENT  + objCal.calendarID).innerHTML = sHTML;		
   document.getElementById(CAL_SPAN_MONTH + objCal.calendarID).innerHTML = tabMonthName[objCal.monthDisplay];	
   document.getElementById(CAL_SPAN_YEAR + objCal.calendarID).innerHTML = objCal.yearDisplay;

   // Activer les boutons d'incrementation ou decrementation du mois et annee
   document.getElementById(CAL_IMG_DECR_MONTH + objCal.calendarID).style.cursor = (isDecrMonthEnable(objCal) && ! objCal.disabled) ? (ie ? "hand" : "pointer") : "default";
   document.getElementById(CAL_IMG_INCR_MONTH + objCal.calendarID).style.cursor = (isIncrMonthEnable(objCal) && ! objCal.disabled) ? (ie ? "hand" : "pointer") : "default";
   document.getElementById(CAL_IMG_DECR_YEAR + objCal.calendarID).style.cursor = (isDecrYearEnable(objCal) && ! objCal.disabled) ? (ie ? "hand" : "pointer") : "default";
   document.getElementById(CAL_IMG_INCR_YEAR + objCal.calendarID).style.cursor = (isIncrYearEnable(objCal) && ! objCal.disabled) ? (ie ? "hand" : "pointer") : "default";
   document.getElementById(CAL_IMG_GOTO_DATESEL + objCal.calendarID).style.cursor = (! objCal.disabled) ? (ie ? "hand" : "pointer") : "default";

	// Formatage de la largeur des libelles des jours de la semaine
   var maxWidth = 0, tdTag;
   for (i = 0; i < 7; i++)
   {
      tdTag = document.getElementById(CAL_TD_LBLDAY + objCal.calendarID + i);
      if (tdTag.offsetWidth > maxWidth)
      	maxWidth = tdTag.offsetWidth;
   }
	for (i = 0; i < 7; i++)
   {
      tdTag = document.getElementById(CAL_TD_LBLDAY + objCal.calendarID + i);
      tdTag.width = maxWidth + "px";
   }
   
   if ((objCal.monthSelected == objCal.monthDisplay) && (objCal.yearSelected == objCal.yearDisplay))
      displaySelectionDay (objCal, objCal.daySelected);
}

function isDateInMinMaxDate (objCal, day, month, year)
{
   var dateNum = year * 10000 + month * 100 + day;
   var minDateNum = objCal.minDateYear * 10000 + objCal.minDateMonth * 100 + objCal.minDateDay;
   var maxDateNum = objCal.maxDateYear * 10000 + objCal.maxDateMonth * 100 + objCal.maxDateDay;

   return (dateNum <= maxDateNum) && (dateNum >= minDateNum);
}

function isIncrMonthEnable(objCal)
{   
   var newMonth = objCal.monthDisplay + 1; 
   var newYear = objCal.yearDisplay;

   if (newMonth > 11)
	{
      newMonth = 0;
      newYear++;
   }
   return (newYear * 100 + newMonth) <= (objCal.maxDateYear * 100 + objCal.maxDateMonth);
}

function isDecrMonthEnable(objCal)
{
   var newMonth = objCal.monthDisplay - 1; 
   var newYear = objCal.yearDisplay;

   if (newMonth < 0)
	{
      newMonth = 11;
      newYear--;
   }
   return (newYear * 100 + newMonth) >= (objCal.minDateYear * 100 + objCal.minDateMonth);
}

function isIncrYearEnable(objCal)
{   
   return (objCal.yearDisplay < objCal.maxDateYear);
}

function isDecrYearEnable(objCal)
{ 
   return (objCal.yearDisplay > objCal.minDateYear);
}

/*
* Fonction appelee sur le onclick du bouton ou img
*/
function showCalendarAWS (objBtn, objCal)
{
   var objBoundCtrl;

   if (! objCal.isBoundCtrl)
   	return;

   objBoundCtrl = document.getElementById(objCal.boundCtrlId);
   // objBoundCtrl doit etre :
   // - pour un adelia:entfield, un tag input de type text
   // - pour un adelia:outputfield, un tag span ou a
   if ((objBoundCtrl == null) || (((objBoundCtrl.tagName != "INPUT") || (objBoundCtrl.type != "text")) &&
   	(objBoundCtrl.tagName != "SPAN") && (objBoundCtrl.tagName != "A")))
   	return;
   
	switch (objCal.popupType)
   {
      case POPUP_DIV :
      	showCalendarPopupDiv (objBtn, objCal);
      	break;

      case POPUP_WIN :
      case POPUP_WIN_MODAL :
      	showCalendarPopupWin (objBtn, objCal, objCal.popupType == POPUP_WIN);
      	break;
   }
}

/*
* Affiche le calendrier lie sous la forme d'un div
* On fixe la valeur de date selectionnee (selected) et date affichee (display)
* avec la valeur de la date du controle lie
*/
function showCalendarPopupDiv (objBtn, objCal)
{
   var dateBoundCtrl, divGen;

   divGen = document.getElementById(CAL_POPUP_DIV + objCal.calendarID);
   // si le calendrier est deja visible, on le cache
   if (divGen.style.visibility == "visible")
   {
   	hideCalendar(objCal);
      return;
   }
   // Fixer la valeur de la date courante avant affichage
   dateBoundCtrl = getDateBoundCtrl (objCal, document.getElementById(objCal.boundCtrlId));
   objCal.daySelected = getDayAdeliaDate(dateBoundCtrl);	
   objCal.monthDisplay = objCal.monthSelected = getMonthAdeliaDate(dateBoundCtrl) - 1;	
   objCal.yearDisplay = objCal.yearSelected = getYearAdeliaDate(dateBoundCtrl);

	constructCalendar(objCal);
   if (ie)
   {
      // bug d'affichage de ie : comme on redimentionne les balises td des
      // libelles des jours, la largeur du div general est erronee et le positionnement
      // par rapport au bouton peut etre faux.
      // Il faut afficher une premiere fois le div pour que sa largeur soit bonne
      divGen.style.left = divGen.style.top = "-1000px";
      showCalendar(objCal);
      hideCalendar(objCal);
   }
   // on positionne le calendrier par rapport au bouton
   setPositionDivInScreen(objBtn, objCal);
   if (ie)   
      createAndShowIFrame(objCal);
            
   showCalendar(objCal);
}

/*
* Affiche le calendrier lie sous la forme d'un win
* Affichage de la page "AWSCalendarPopupWin.html" avec passage des proprietes du calendrier
* dans l'url d'appel
*/
function showCalendarPopupWin (objBtn, objCal, modless)
{   
   var popupWin, docPopupWin;
   var objBoundCtrl, dateBoundCtrl;	
   var URL = AWSRESOURCES_DIR_PATH + "AWSCalendarPopupWin.html";

	// si la fenetre est deja ouverte, on la ferme
	if ((typeof(objCal.winPopup) != 'undefined') && ! objCal.winPopup.closed)
   {
      objCal.winPopup.close();
      objCal.winPopup = void 0;
      return;
   }
   // Construction de l'url appel a la page contenant le calendrier.
   // On passe toutes les proprietes du calendrier sauf la propriete valeur
	URL = setURLParameter(URL, 'lang', AWSRESOURCES_LANG);
   URL = setURLParameter(URL, 'id', objCal.calendarID);
   URL = setURLParameter(URL, 'showWeekNumber', objCal.showWeekNumber);
	URL = setURLParameter(URL, 'showToday', objCal.showToday);
	URL = setURLParameter(URL, 'weekStartDay', objCal.weekStartDay);   
   URL = setURLParameter(URL, 'minDate', objCal.minDateYear * 10000 + (objCal.minDateMonth + 1) * 100 + objCal.minDateDay);   
   URL = setURLParameter(URL, 'maxDate', objCal.maxDateYear * 10000 + (objCal.maxDateMonth + 1) * 100 + objCal.maxDateDay);
	URL = setURLParameter(URL, 'barColor', objCal.barColor);
	URL = setURLParameter(URL, 'monthBgColor', objCal.monthBgColor);
	URL = setURLParameter(URL, 'daysColor', objCal.daysColor);
	URL = setURLParameter(URL, 'titleColor', objCal.titleColor);
   URL = setURLParameter(URL, 'horzLineColor', objCal.horzLineColor);
   URL = setURLParameter(URL, 'vertLineColor', objCal.vertLineColor);
   URL = setURLParameter(URL, 'daysWeekColor', objCal.daysWeekColor);
   URL = setURLParameter(URL, 'numWeekColor', objCal.numWeekColor);   
   URL = setURLParameter(URL, 'dateFormat', objCal.dateFormat);
   URL = setURLParameter(URL, 'boundCtrlId', objCal.boundCtrlId);
   URL = setURLParameter(URL, 'type', objCal.type);
	URL = setURLParameter(URL, 'typeLength', objCal.typeLength);
   URL = setURLParameter(URL, 'typeNbDec', objCal.typeNbDec);
   URL = setURLParameter(URL, 'popupType', objCal.popupType);
   URL = setURLParameter(URL, 'popupPosition', objCal.popupPosition);	
   URL = setURLParameter(URL, 'idObjBtn', objBtn.id);
   URL = setURLParameter(URL, 'disabled', objCal.disabled);
   URL = setURLParameter(URL, 'barColorClass', objCal.barColorClass);
   URL = setURLParameter(URL, 'monthBgColorClass', objCal.monthBgColorClass);
   URL = setURLParameter(URL, 'daysColorClass', objCal.daysColorClass);
   URL = setURLParameter(URL, 'titleColorClass', objCal.titleColorClass);
   URL = setURLParameter(URL, 'horzLineColorClass', objCal.horzLineColorClass);
   URL = setURLParameter(URL, 'vertLineColorClass', objCal.vertLineColorClass);
   URL = setURLParameter(URL, 'daysWeekColorClass', objCal.daysWeekColorClass);
   URL = setURLParameter(URL, 'numWeekColorClass', objCal.numWeekColorClass);   
   URL = setURLParameter(URL, 'onChange', objCal.onChangeTxt);   
   URL = setURLParameter(URL, 'daysName', objCal.daysName);   
   URL = setURLParameter(URL, 'getClassDate', objCal.getClassDate == '' ? '' : objCal.getClassDate.getName());   
   URL = setURLParameter(URL, 'getSelectionDate', objCal.getSelectionDate == '' ? '' : objCal.getSelectionDate.getName());   
   URL = setURLParameter(URL, 'getTooltipDate', objCal.getTooltipDate == '' ? '' : objCal.getTooltipDate.getName());   

   // Ouverture de la popup window   
   if (modless)
      objCal.winPopup = window.open(URL, objCal.idVarCalAWS, "status=no,resizable=yes,dependent=yes,alwaysRaised=yes,screenX=30000,screenY=30000,left=30000,top=30000");	
   else
      showModalWindow (URL, "status=no,resizable=yes,dependent=yes,alwaysRaised=yes,screenX=30000,screenY=30000,left=30000,top=30000");
}

function setPositionDivInScreen (objBtn, objCal)
{
   var divGen = document.getElementById(CAL_POPUP_DIV + objCal.calendarID);
   var aTag, leftPos = objBtn.offsetLeft, topPos = objBtn.offsetTop;

   // recherche des coordonnees de l'objet bouton
	aTag = objBtn;
	do
   {
		aTag = aTag.offsetParent;
		leftPos += aTag.offsetLeft;
		topPos += aTag.offsetTop;
	}
   while (aTag.tagName != "BODY");

	switch (objCal.popupPosition)
   {
      case POS_NORTH :
      	divGen.style.left = leftPos + "px";
         divGen.style.top = (topPos - divGen.offsetHeight) + "px";
      	break;

      case POS_SOUTH :
      	divGen.style.left = leftPos + "px";
         divGen.style.top = (topPos + objBtn.offsetHeight) + "px";
      	break;

      case POS_EAST :
      	divGen.style.left = (leftPos + objBtn.offsetWidth) + "px";
         divGen.style.top = topPos + "px";
      	break;

      case POS_WEST :
      	divGen.style.left = (leftPos - divGen.offsetWidth) + "px";
         divGen.style.top = topPos + "px";
      	break;

      case POS_NORTHEAST :
      	divGen.style.left = (leftPos + objBtn.offsetWidth) + "px";
         divGen.style.top = (topPos - divGen.offsetHeight) + "px";
      	break;

      case POS_NORTHWEST :
      	divGen.style.left = (leftPos - divGen.offsetWidth) + "px";
      	divGen.style.top = (topPos - divGen.offsetHeight) + "px";
      	break;

      case POS_SOUTHEAST :
      	divGen.style.left = (leftPos + objBtn.offsetWidth) + "px";
         divGen.style.top = (topPos + objBtn.offsetHeight) + "px";
      	break;

   	case POS_SOUTHWEST :
      	divGen.style.left = (leftPos - divGen.offsetWidth) + "px";
      	divGen.style.top = (topPos + objBtn.offsetHeight) + "px";
      	break;

      case POS_CENTER :
      	if (! ie)
         {
            divGen.style.left = window.pageXOffset + Math.floor((window.innerWidth - divGen.offsetWidth) / 2) + "px";
      		divGen.style.top = window.pageYOffset + Math.floor((window.innerHeight - divGen.offsetHeight) / 2) + "px";
         }
         else
         {
            if (document.documentElement && document.documentElement.clientWidth)
            {
               divGen.style.left = document.documentElement.scrollLeft + Math.floor((document.documentElement.clientWidth - divGen.offsetWidth) / 2) + "px";
      			divGen.style.top = document.documentElement.scrollTop + Math.floor((document.documentElement.clientHeight - divGen.offsetHeight) / 2) + "px";
            }
            else if (document.body)
            {
               divGen.style.left = document.body.scrollLeft + Math.floor((document.body.clientWidth - divGen.offsetWidth) / 2) + "px";
      			divGen.style.top = document.body.scrollTop + Math.floor((document.body.clientHeight - divGen.offsetHeight) / 2) + "px";
            }
         }
      	break;
   }
}

function setPositionWinInScreen (idObjBtn, objCal)
{
   var leftPos, topPos;
	var objBtn = window.opener.document.getElementById(idObjBtn);
	var aTag, leftPosBtn = objBtn.offsetLeft, topPosBtn = objBtn.offsetTop;

   // recherche des coordonnees de l'objet bouton
   aTag = objBtn;
   do
   {
      aTag = aTag.offsetParent;
      leftPosBtn += aTag.offsetLeft;
      topPosBtn += aTag.offsetTop;
   }
   while (aTag.tagName != "BODY");

	switch (objCal.popupPosition)
   {
      case POS_NORTH :             	   
         if (! ie)
         {         
            leftPos = leftPosBtn + window.opener.screenX;
   	      topPos = window.opener.screenY + topPosBtn - window.outerHeight + (window.opener.outerHeight - window.opener.innerHeight);    
            if (window.opener.statusbar.visible)
               topPos -= 22;           
            // Enlever la valeur des barres de dÚfilement
            leftPos -= window.opener.pageXOffset;
            topPos -= window.opener.pageYOffset;            
         }
         else
         {            
            leftPos = leftPosBtn + window.opener.screenLeft;
   	      topPos = window.opener.screenTop + topPosBtn - window.height;        
            if (document.documentElement && document.documentElement.clientWidth)
            {    
               // Enlever la valeur des barres de dÚfilement
               leftPos -= window.opener.document.documentElement.scrollLeft;
               topPos -= window.opener.document.documentElement.scrollTop;               
            }
            else if (document.body)
            {       
               // Enlever la valeur des barres de dÚfilement
               leftPos -= window.opener.document.body.scrollLeft;
               topPos -= window.opener.document.body.scrollTop;               
            }                
         }  
         window.moveTo(leftPos, topPos);          
      	break;

		case POS_SOUTH :
         if (! ie)
         {    
            leftPos = leftPosBtn + window.opener.screenX;
            // Il faut ajouter le nb de pixels correspondant entre le point haut de la fenetre
            // du browser et le point haut de la zone cliente
	         topPos = window.opener.screenY + topPosBtn + objBtn.offsetHeight + (window.opener.outerHeight - window.opener.innerHeight);
            // Suppression d'environ la hauteur de la status bar
            if (window.opener.statusbar.visible)
               topPos -= 22;   
            // Enlever la valeur des barres de dÚfilement
            leftPos -= window.opener.pageXOffset;
            topPos -= window.opener.pageYOffset;            
         }
         else
         {      
            leftPos = leftPosBtn + window.opener.screenLeft;
	         topPos = window.opener.screenTop + topPosBtn + objBtn.offsetHeight;
            if (document.documentElement && document.documentElement.clientWidth)
            {    
               // Enlever la valeur des barres de dÚfilement
               leftPos -= window.opener.document.documentElement.scrollLeft;
               topPos -= window.opener.document.documentElement.scrollTop;               
            }
            else if (document.body)
            {       
               // Enlever la valeur des barres de dÚfilement
               leftPos -= window.opener.document.body.scrollLeft;
               topPos -= window.opener.document.body.scrollTop;               
            }                
         }  
         window.moveTo(leftPos, topPos);          
      	break;

		case POS_EAST :         
         if (! ie)
         {           
            leftPos = leftPosBtn + window.opener.screenX + objBtn.offsetWidth;
            // Il faut ajouter le nb de pixels correspondant entre le point haut de la fenetre
            // du browser et le point haut de la zone cliente
            topPos = window.opener.screenY + topPosBtn + (window.opener.outerHeight - window.opener.innerHeight);    
            // Suppression d'environ la hauteur de la status bar
            if (window.opener.statusbar.visible)
               topPos -= 22;          
            // Enlever la valeur des barres de dÚfilement
            leftPos -= window.opener.pageXOffset;
            topPos -= window.opener.pageYOffset;            
         }
         else
         {           
            leftPos = leftPosBtn + window.opener.screenLeft + objBtn.offsetWidth;
            topPos = window.opener.screenTop + topPosBtn;       
            if (document.documentElement && document.documentElement.clientWidth)
            {    
               // Enlever la valeur des barres de dÚfilement
               leftPos -= window.opener.document.documentElement.scrollLeft;
               topPos -= window.opener.document.documentElement.scrollTop;               
            }
            else if (document.body)
            {       
               // Enlever la valeur des barres de dÚfilement
               leftPos -= window.opener.document.body.scrollLeft;
               topPos -= window.opener.document.body.scrollTop;               
            }                
         }  
         window.moveTo(leftPos, topPos);          
      	break;

		case POS_WEST :         
         if (! ie)
         {              
            leftPos = leftPosBtn + window.opener.screenX - window.outerWidth;
            // Il faut ajouter le nb de pixels correspondant entre le point haut de la fenetre
            // du browser et le point haut de la zone cliente
            topPos = window.opener.screenY + topPosBtn + (window.opener.outerHeight - window.opener.innerHeight);   
            // Suppression d'environ la hauteur de la status bar
            if (window.opener.statusbar.visible)
               topPos -= 22;   
            // Enlever la valeur des barres de dÚfilement
            leftPos -= window.opener.pageXOffset;
            topPos -= window.opener.pageYOffset;            
         }
         else
         {           
            leftPos = leftPosBtn + window.opener.screenLeft - window.width;
            topPos = window.opener.screenTop + topPosBtn;       
            if (document.documentElement && document.documentElement.clientWidth)
            {    
               // Enlever la valeur des barres de dÚfilement
               leftPos -= window.opener.document.documentElement.scrollLeft;
               topPos -= window.opener.document.documentElement.scrollTop;               
            }
            else if (document.body)
            {       
               // Enlever la valeur des barres de dÚfilement
               leftPos -= window.opener.document.body.scrollLeft;
               topPos -= window.opener.document.body.scrollTop;               
            }                
         }  
         window.moveTo(leftPos, topPos);          
      	break;

		case POS_NORTHEAST :         
         if (! ie)
         {                
            leftPos = leftPosBtn + window.opener.screenX + objBtn.offsetWidth;
            // Il faut ajouter le nb de pixels correspondant entre le point haut de la fenetre
            // du browser et le point haut de la zone cliente
            topPos = window.opener.screenY + topPosBtn - window.outerHeight + (window.opener.outerHeight - window.opener.innerHeight);  
            // Suppression d'environ la hauteur de la status bar
            if (window.opener.statusbar.visible)
               topPos -= 22;
            // Enlever la valeur des barres de dÚfilement
            leftPos -= window.opener.pageXOffset;
            topPos -= window.opener.pageYOffset;            
         }
         else
         {                
            leftPos = leftPosBtn + window.opener.screenLeft + objBtn.offsetWidth;
            topPos = window.opener.screenTop + topPosBtn - window.height;  
            if (document.documentElement && document.documentElement.clientWidth)
            {    
               // Enlever la valeur des barres de dÚfilement
               leftPos -= window.opener.document.documentElement.scrollLeft;
               topPos -= window.opener.document.documentElement.scrollTop;               
            }
            else if (document.body)
            {       
               // Enlever la valeur des barres de dÚfilement
               leftPos -= window.opener.document.body.scrollLeft;
               topPos -= window.opener.document.body.scrollTop;               
            }                
         }  
         window.moveTo(leftPos, topPos);          
      	break;

		case POS_NORTHWEST :         
         if (! ie)
         {        
            leftPos = leftPosBtn + window.opener.screenX - window.outerWidth;
            // Il faut ajouter le nb de pixels correspondant entre le point haut de la fenetre
            // du browser et le point haut de la zone cliente
				topPos = window.opener.screenY + topPosBtn - window.outerHeight + (window.opener.outerHeight - window.opener.innerHeight);        
            // Suppression d'environ la hauteur de la status bar
            if (window.opener.statusbar.visible)
               topPos -= 22;
            // Enlever la valeur des barres de dÚfilement
            leftPos -= window.opener.pageXOffset;
            topPos -= window.opener.pageYOffset;            
         }
         else
         {                
            leftPos = leftPosBtn + window.opener.screenLeft - window.width;
			   topPos = window.opener.screenTop + topPosBtn - window.height;  
            if (document.documentElement && document.documentElement.clientWidth)
            {    
               // Enlever la valeur des barres de dÚfilement
               leftPos -= window.opener.document.documentElement.scrollLeft;
               topPos -= window.opener.document.documentElement.scrollTop;               
            }
            else if (document.body)
            {       
               // Enlever la valeur des barres de dÚfilement
               leftPos -= window.opener.document.body.scrollLeft;
               topPos -= window.opener.document.body.scrollTop;               
            }                
         }  
         window.moveTo(leftPos, topPos);          
      	break;

		case POS_SOUTHEAST :         
         if (! ie)
         {           
            leftPos = leftPosBtn + window.opener.screenX + objBtn.offsetWidth;
            // Il faut ajouter le nb de pixels correspondant entre le point haut de la fenetre
            // du browser et le point haut de la zone cliente
   	      topPos = window.opener.screenY + topPosBtn + objBtn.offsetHeight + (window.opener.outerHeight - window.opener.innerHeight);              
            // Suppression d'environ la hauteur de la status bar
            if (window.opener.statusbar.visible)
               topPos -= 22;

            // Enlever la valeur des barres de dÚfilement
            leftPos -= window.opener.pageXOffset;
            topPos -= window.opener.pageYOffset;            
         }
         else
         {                
            leftPos = leftPosBtn + window.opener.screenLeft + objBtn.offsetWidth;
   	      topPos = window.opener.screenTop + topPosBtn + objBtn.offsetHeight;  
            if (document.documentElement && document.documentElement.clientWidth)
            {    
               // Enlever la valeur des barres de dÚfilement
               leftPos -= window.opener.document.documentElement.scrollLeft;
               topPos -= window.opener.document.documentElement.scrollTop;               
            }
            else if (document.body)
            {       
               // Enlever la valeur des barres de dÚfilement
               leftPos -= window.opener.document.body.scrollLeft;
               topPos -= window.opener.document.body.scrollTop;               
            }                
         }  
         window.moveTo(leftPos, topPos);          
      	break;

		case POS_SOUTHWEST :         
         if (! ie)
         {                            
            leftPos = leftPosBtn + window.opener.screenX - window.outerWidth;    
            // Il faut ajouter le nb de pixels correspondant entre le point haut de la fenetre
            // du browser et le point haut de la zone cliente        	         
            topPos = window.opener.screenY + topPosBtn + objBtn.offsetHeight + (window.opener.outerHeight - window.opener.innerHeight);              
            // Suppression d'environ la hauteur de la status bar
            if (window.opener.statusbar.visible)
               topPos -= 22;
            
            // Enlever la valeur des barres de dÚfilement 
            leftPos -= window.opener.pageXOffset;
            topPos -= window.opener.pageYOffset;                                 
         }
         else
         {                  
            leftPos = leftPosBtn + window.opener.screenLeft - window.width;
	         topPos = window.opener.screenTop + topPosBtn + objBtn.offsetHeight;
            if (document.documentElement && document.documentElement.clientWidth)
            {    
               // Enlever la valeur des barres de dÚfilement
               leftPos -= window.opener.document.documentElement.scrollLeft;
               topPos -= window.opener.document.documentElement.scrollTop;               
            }
            else if (document.body)
            {       
               // Enlever la valeur des barres de dÚfilement
               leftPos -= window.opener.document.body.scrollLeft;
               topPos -= window.opener.document.body.scrollTop;               
            }                             
         }  
         window.moveTo(leftPos, topPos);          
      	break;

      case POS_CENTER :
      	if (! ie)
         {
            leftPos = window.opener.screenX + (window.opener.outerWidth - window.outerWidth) / 2;
            topPos = window.opener.screenY + (window.opener.outerHeight - window.outerHeight) / 2;
         }
         else
         {
            if (document.documentElement)
            {
               leftPos = window.opener.screenLeft + (window.opener.document.documentElement.offsetWidth - window.width) / 2;
               topPos = window.opener.screenTop + (window.opener.document.documentElement.offsetHeight - window.height) / 2;
            }
            else
            {
               leftPos = window.opener.screenLeft + (window.opener.document.body.offsetWidth - window.width) / 2;
               topPos = window.opener.screenTop + (window.opener.document.body.offsetHeight - window.height) / 2;
            }
         }
         window.moveTo(leftPos, topPos);
      	break;
   }
}

/*
* Formate une date adelia (entier AAAAMMJJ) suivant le format
* de date defini par DATE_PATTERN et DATE_SEPARATOR (AWSGlobals.js)
*/
function formatDateInDesignMode (adeliaDateVal)
{   
   var index = 1;
   var year, month, day;
   var res = "";
	   
	// extraction annee, mois, jour
   year = getYearAdeliaDate(adeliaDateVal);
   month = getMonthAdeliaDate(adeliaDateVal);
   day = getDayAdeliaDate(adeliaDateVal);
	for (index = 0; index < 3; index++)
   { 
      switch (DATE_PATTERN.charAt(index))
      {
         case 'D' :
            res = res + padZeroLeft(day, 2);
            break;

         case 'M' :
            res = res + padZeroLeft(month, 2);
            break;

         case 'Y' :
         	res = res + year;
         	break;
      }
      if (index < 2)
      	res = res + DATE_SEPARATOR;
   }   
   return res;
}

/*
* Affichage du calendrier dans le cas d'un calendrier lie en popupType a WIN
* Cette fonction est appelee dans AWSCalendarPopupWin.html (la page de la popup window)
* On recupere les proprietes du calendrier via l'url d'appel
*/
function createCalendarAWSInWin()
{
   var sURL = String(window.location);

   var id = getURLParameterString (sURL, 'id');
   var showWeekNumber = getURLParameterBoolean (sURL, 'showWeekNumber');
	var showToday = getURLParameterBoolean (sURL, 'showToday');
	var weekStartDay = getURLParameterString (sURL, 'weekStartDay');
   var minDate = getURLParameterInt (sURL, 'minDate');   
   var maxDate = getURLParameterInt (sURL, 'maxDate');
	var barColor = getURLParameterString (sURL, 'barColor');
	var monthBgColor = getURLParameterString (sURL, 'monthBgColor');
	var daysColor = getURLParameterString (sURL, 'daysColor');
	var titleColor = getURLParameterString (sURL, 'titleColor');
   var horzLineColor = getURLParameterString (sURL, 'horzLineColor');
   var vertLineColor = getURLParameterString (sURL, 'vertLineColor');
   var daysWeekColor = getURLParameterString (sURL, 'daysWeekColor');
   var numWeekColor = getURLParameterString (sURL, 'numWeekColor');   
   var dateFormat = getURLParameterString (sURL, 'dateFormat');
   var boundCtrlId = getURLParameterString (sURL, 'boundCtrlId');
   var type = getURLParameterString (sURL, 'type');
	var typeLength = getURLParameterInt (sURL, 'typeLength');
   var typeNbDec = getURLParameterInt (sURL, 'typeNbDec');
   var popupType = getURLParameterString (sURL, 'popupType');
   var popupPosition = getURLParameterString (sURL, 'popupPosition');	
   var idObjBtn = getURLParameterString (sURL, 'idObjBtn');
   var disabled = getURLParameterBoolean (sURL, 'disabled');
   var barColorClass = getURLParameterString (sURL, 'barColorClass');
   var monthBgColorClass = getURLParameterString (sURL, 'monthBgColorClass');
   var daysColorClass = getURLParameterString (sURL, 'daysColorClass');
   var titleColorClass = getURLParameterString (sURL, 'titleColorClass');
   var horzLineColorClass = getURLParameterString (sURL, 'horzLineColorClass');
   var vertLineColorClass = getURLParameterString (sURL, 'vertLineColorClass');
   var daysWeekColorClass = getURLParameterString (sURL, 'daysWeekColorClass');
   var numWeekColorClass = getURLParameterString (sURL, 'numWeekColorClass');   
   var onChange = getURLParameterString (sURL, 'onChange');   
   var daysName = getURLParameterString (sURL, 'daysName');   
   var getClassDate = getURLParameterString (sURL, 'getClassDate');
   var getSelectionDate = getURLParameterString (sURL, 'getSelectionDate');
   var getTooltipDate = getURLParameterString (sURL, 'getTooltipDate');
   var varIdJS = '';
   var fctGetClassDate = getClassDate == '' ? '' : eval('window.opener.' + getClassDate);
   var fctGetSelectionDate = getSelectionDate == '' ? '' : eval('window.opener.' + getSelectionDate);
   var fctGetTooltipDate = getTooltipDate == '' ? '' : eval('window.opener.' + getTooltipDate);
   
   // L'importation des classes CSS se fait dans AWSCalendarPopupWin.html
   
   var objCal = new CalendarAWS(id, showWeekNumber, showToday, weekStartDay, minDate, maxDate,
      barColor, monthBgColor, daysColor, titleColor, horzLineColor, vertLineColor, daysWeekColor, 
      numWeekColor, dateFormat, boundCtrlId, '', type, typeLength, typeNbDec, onChange,       
      popupType, popupPosition, disabled, barColorClass, monthBgColorClass, 
      daysColorClass, titleColorClass, horzLineColorClass, vertLineColorClass, daysWeekColorClass, 
      numWeekColorClass, daysName, fctGetClassDate, fctGetSelectionDate, fctGetTooltipDate);

	if (id.indexOf(':lst:') == 0)
   {
      // le calendrier est contenu dans un adelia:tablelist
      // Il faut transformer id sinon erreur js lors de la creation de la variable CalendarAWS
      // (var :lst:... = new CalendarAWS => syntaxe incorrecte)
      var car;

      for (i = 0; i < id.length; i++)
      {
         car = id.charAt(i);
         if (car == ':')
         	varIdJS += '_';
         else
         	varIdJS += car;
      }
   }
   else
   	varIdJS = id;

	// Faire de objCal une variable globale de nom <id>CalAWS
   eval("window." + varIdJS + SUFFIXE_VAR_CAL + " = objCal;");
   CreateGUICalendar(objCal);

	// Affecter au calendrier la valeur de la date du controle lie
   // le controle lie est dans la page appelante
   var dateBoundCtrl = getDateBoundCtrl (objCal, window.opener.document.getElementById(boundCtrlId));   
   objCal.daySelected = getDayAdeliaDate(dateBoundCtrl);   
   objCal.monthDisplay = objCal.monthSelected = getMonthAdeliaDate(dateBoundCtrl) - 1;   
   objCal.yearDisplay = objCal.yearSelected = getYearAdeliaDate(dateBoundCtrl);
	constructCalendar(objCal);

	// redimensionnement de la window
   var tableGen = document.getElementById(CAL_GEN_TABLE + objCal.calendarID);
   if (! ie)
   {   	
		// Sous FF 1.5, la fenetre se redimensionne mal en largeur (mais bon en FF 1.0)
      // => utilisation d'une api pour redimensionner la fenetre a son contenu
		window.sizeToContent();
   }
   else
   {
      var realTableWidth = tableGen.offsetWidth;
      window.resizeTo(100, 100);
      if (document.documentElement && document.documentElement.clientWidth)
      {
         // calcul subtil : 4 pour la taille de la bordure definie dans la classe CSS AWSCalendar
         // et 10 pour la taille de la bordure de la window...
         window.width = realTableWidth + 4 + 9;
			window.height = 100 - document.documentElement.clientHeight + tableGen.offsetHeight;         
      }
      else if (document.body)
      {         
         // Redimensionnement a la mimine suite changement de DOCTYPE
         // dans AWSCalendarPopupWin.html
         window.width = realTableWidth + 4 + 9;         
			window.height = 100 - document.body.clientHeight + tableGen.offsetHeight;      
      }
      window.resizeTo(window.width, window.height);
   }
   //positionnement de la window
   setPositionWinInScreen (idObjBtn, objCal);
}


function CreateGUICalendarInDesignMode (objCal)
{
   var sHTML;

   objCal.monthDisplay = objCal.monthSelected;
   objCal.yearDisplay = objCal.yearSelected;

   // Affichage du calendrier   
   sHTML = "<table id='" + CAL_GEN_TABLE + objCal.calendarID + "' cellspacing='0' cellpadding='0' class='AWSCalendar " + objCal.monthBgColorClass + "' style='background-color:" +
   	objCal.monthBgColor + "'><tr><td><table class='" + objCal.barColorClass + "' style='background-color:" + objCal.barColor + "' width='100%'>" +
      "<tr><td><span>";

	sHTML += constructSpanTitleInDesignMode(objCal);
   sHTML += "</span></td>";
   sHTML += "</tr></table></td></tr><tr><td style='padding:5px'><span>";
	sHTML += constructSpanContentInDesignMode(objCal);
   sHTML += "</span></td></tr>";

   // Affichage de la date du jour
   if (objCal.showToday)
   {
      sHTML += "<tr><td><span>";
		sHTML += constructSpanLblTodayInDesignMode(objCal);
      sHTML += "</span></td></tr>";
   }
   // Affichage de la fin du calendrier
   sHTML += "</table>";

   //DWfile.write("file:///d|/temp/mydata.txt", sHTML);
   return sHTML;
}

function constructSpanTitleInDesignMode(objCal)
{
   var sHTML;

   // Creation du contenu de la barre de titre (span titleBar)
   // Affichage des fleches suiv/prec du mois et de l'annee ainsi que des span pour l'affichage du mois et de l'annee selectionnes
   sHTML = "<img src='" + AWSRESOURCES_DIR_PATH + DECR_MONTH_FILENAME + "' border='0'/>";
   sHTML += "<img src='" + AWSRESOURCES_DIR_PATH + DECR_YEAR_FILENAME + "' border='0'/>&nbsp;";
   sHTML += "<img src='" + AWSRESOURCES_DIR_PATH + INCR_YEAR_FILENAME + "' border='0'/>";
   sHTML += "<img src='" + AWSRESOURCES_DIR_PATH + INCR_MONTH_FILENAME + "' border='0'/>";
   sHTML += "<img src='" + AWSRESOURCES_DIR_PATH + GOTO_DATESEL_FILENAME + "' border='0'/>&nbsp;";
   sHTML += "&nbsp;<span style='color:" + objCal.titleColor + "' class='" + objCal.titleColorClass + "'>" + tabMonthName[objCal.monthDisplay] + "</span>&nbsp;";      
   sHTML += "<span style='color:" + objCal.titleColor + "' class='" + objCal.titleColorClass + "'>" + objCal.yearDisplay + "</span>";
   return sHTML;
}

function constructSpanContentInDesignMode(objCal)
{
   var aNumDays = Array (31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);   
   var startDate = new Date (objCal.yearDisplay, objCal.monthDisplay, 1);
   var endDate, numDaysInMonth, datePointer, dayPointer;
   var sHTML;
   var nbWeek = 1;   

	// calcul du nb de jour dans le mois   
   if (objCal.monthDisplay == 1)
   {
		// mois de fevrier      
      endDate = new Date (objCal.yearDisplay, objCal.monthDisplay + 1, 1);
      endDate = new Date (endDate - (24 * 60 * 60 * 1000));
      numDaysInMonth = endDate.getDate();
   }
   else      
      numDaysInMonth = aNumDays[objCal.monthDisplay];

	// Dans le cas ou le calendrier n'est pas lie, si le jour
   // selectionne est sup au nb de jour du mois (dans le cas d'un changement de mois)
   // alors le jour selectionne devient le dernier jour du mois
	if (! objCal.isBoundCtrl && (objCal.daySelected > numDaysInMonth))
   	objCal.daySelected = numDaysInMonth;

   datePointer = 0;
   dayPointer = (startDate.getDay() + 7 - convertWeekStartDayToInt(objCal.weekStartDay)) % 7;

   sHTML = "<table border='0' cellspacing='0' cellpadding='0' width='100%'><tr>";

	// construction de la ligne contenant le libelle des mois
	if (objCal.showWeekNumber)
      sHTML += "<td></td>";

	// Affichage des libelles des jours de la semaine
   for (i = 0; i < 7; i++)
      sHTML += "<td align='center' style='border-bottom:" + objCal.horzLineColor + " solid 1px;' class='" + objCal.horzLineColorClass + "'><font color='" + objCal.daysWeekColor + "' class='" + 
         objCal.daysWeekColorClass + "'>" + objCal.tabDayName[i][objCal.daysName] + "</font></td>";

   sHTML += "</tr>";

   if (objCal.showWeekNumber)
   	sHTML += "<tr height='3px'><td colspan='8'></td></tr>";
	
	sHTML += "<tr>";

	// affichage du numero de semaine
   if (objCal.showWeekNumber)      
      sHTML += "<td align='right' style='border-right:" + objCal.vertLineColor + " solid 1px;' class='" + objCal.vertLineColorClass + "'><font color='" + objCal.numWeekColor + "' class='" + objCal.numWeekColorClass +      
         "'>" + TextWeekNbr(objCal, startDate) + "&nbsp;</font></td>";

	// affichage d'espace jusqu'au bon libelle du premier jour du mois
   for (i = 1; i <= dayPointer; i++)
      sHTML += "<td>&nbsp;</td>";

	// on parcours les jours du mois selectionne
   for (datePointer = 1; datePointer <= numDaysInMonth; datePointer++)
   {      
      dayPointer++;		

      sHTML += "<td align='center'>";
		
		if (datePointer == objCal.daySelected)			
         sHTML += "<font color='" + objCal.titleColor + "' class='" + objCal.titleColorClass + "'>&nbsp;" + datePointer + "&nbsp;</font>";
      else      	
         sHTML += "<font color='" + objCal.daysColor + "' class='" + objCal.daysColorClass + "'>&nbsp;" + datePointer + "&nbsp;</font>";

      sHTML += "</td>";
      if ((dayPointer % 7) == 0)
		{
         sHTML += "</tr>";
         if (datePointer < numDaysInMonth)
         {
         	sHTML += "<tr>";
            nbWeek++;
         }
         if (objCal.showWeekNumber && (datePointer < numDaysInMonth))          
            sHTML += "<td align='right' style='border-right:" + objCal.vertLineColor + " solid 1px;' class='" + objCal.vertLineColorClass + "'><font color='" + objCal.numWeekColor + "' class='" + objCal.numWeekColorClass + "'>" + TextWeekNbr(objCal, new Date(objCal.yearDisplay, objCal.monthDisplay, datePointer + 1)) + "&nbsp;</font></td>";
      }
   }
   // finir la derniere semaine
   if ((dayPointer % 7) != 0)
   {
   	while (dayPointer % 7 != 0)
   	{
      	sHTML += "<td>&nbsp;</td>";
	      dayPointer++;
   	}
      sHTML += "</tr>";
   }
   // Rajouter une ligne si le nb de semaine du mois est inf a 6
   while (nbWeek < 6)
   {
      sHTML += "<tr>";
      if (objCal.showWeekNumber)
      	sHTML += "<td>&nbsp;</td>";

      for (i = 0; i < 7; i++)
      	sHTML += "<td>&nbsp;</td>";

      sHTML += "</tr>";
      nbWeek++;
   }
   sHTML += "</table>";
   return sHTML;
}

function constructSpanLblTodayInDesignMode(objCal)
{
   // Affichage de la date du jour
   var sHTML = "<table style='width:100%' cellspacing='0' cellpadding='0'><tr><td align='center'";

   sHTML += "><font color='" + objCal.daysColor + "' class='" + objCal.daysColorClass + "'>&nbsp;" + TODAY_NAME + " "      
      // On n'utilise pas SscDateVersTexte pour ne pas inclure AWSControlScript.js
      + formatDateInDesignMode (YEAR_TODAY_DATE * 10000 + (MONTH_TODAY_DATE + 1) * 100 + DAY_TODAY_DATE)            
      + "</font>";

   sHTML += "</td></tr><tr height='3px'><td></td></tr></table>";   
   return sHTML;
}

function convertWeekStartDayToInt(weekStartDay)
{
   switch (weekStartDay)
   {
      case START_DAY_MONDAY :
      	return 1;

		case START_DAY_TUESDAY :
      	return 2;

		case START_DAY_WEDNESDAY :
      	return 3;

		case START_DAY_THURSDAY :
      	return 4;

		case START_DAY_FRIDAY :
      	return 5;

		case START_DAY_SATURDAY :
      	return 6;

		case START_DAY_SUNDAY :
      	return 7;
   }
}

/*
* Extrait la valeur du controle lie et la retourne sous la
* forme d'une date adelia
* - boundCtrl : controle lie
*/
function getDateBoundCtrl (objCal, boundCtrl)
{
   var valTxt = getTextValueBoundCtrl (boundCtrl);
   var valInt;
   var mandatory, inputCtrl;

   mandatory = boundCtrl.getAttribute('mandatory') == 'true';      
   inputCtrl = boundCtrl.getAttribute('inputctrl');

   if (inputCtrl != null)
      inputCtrl = parseInt(inputCtrl);

	objCal.onChangeOnDateSel = false;
   switch (objCal.type)
   {
      case TA_DATE :         
         // si le champ lie est vide, on retourne la date du jour
         if (valTxt == '')
         {
         	objCal.onChangeOnDateSel = true;
            return YEAR_TODAY_DATE * 10000 + (MONTH_TODAY_DATE + 1) * 100 + DAY_TODAY_DATE;
         }
                  
         if (SscVerifDate (valTxt, mandatory, inputCtrl) == ISC_OK)         
            return SscTexteVersDate(valTxt, inputCtrl);            
         else
         {
         	objCal.onChangeOnDateSel = true;
            // si la date du controle est invalide, on fournit au calendrier
            // la date du jour         
            return YEAR_TODAY_DATE * 10000 + (MONTH_TODAY_DATE + 1) * 100 + DAY_TODAY_DATE;         
         }
         
      case TA_NUM_E :
      case TA_NUM_P :                 
         if (SscVerifNumerique (valTxt, objCal.typeLength, objCal.typeNbDec, mandatory, inputCtrl) == ISC_OK)
         {            
         	var adelDate;
         	            
            valInt = SscTexteVersLongDouble (valTxt);
            if (valInt <= 0)
            {
            	objCal.onChangeOnDateSel = true;
               return YEAR_TODAY_DATE * 10000 + (MONTH_TODAY_DATE + 1) * 100 + DAY_TODAY_DATE;      	
            }

            if (objCal.typeLength == 6)
               adelDate = convertDate6ToAdeliaDate (valInt, objCal.dateFormat);
            else
               adelDate = convertDate8ToAdeliaDate (valInt, objCal.dateFormat);   
               
           	if (controlerDate(adelDate) == ISC_OK)
           		return adelDate;
           	else
           	{
           		objCal.onChangeOnDateSel = true;
           		// date semantiquement erronee
           		return YEAR_TODAY_DATE * 10000 + (MONTH_TODAY_DATE + 1) * 100 + DAY_TODAY_DATE;      	         
           	}
         }
         else
         {
         	objCal.onChangeOnDateSel = true;
            // si la date du controle est invalide, on fournit au calendrier
            // la date du jour
            return YEAR_TODAY_DATE * 10000 + (MONTH_TODAY_DATE + 1) * 100 + DAY_TODAY_DATE;      	         
         }
   }
}

/*
* Retourne la valeur textuelle du controle lie
*/
function getTextValueBoundCtrl (boundCtrl)
{
   switch (boundCtrl.tagName)
   {
      case "INPUT" :
      	// cas d'un entryfield : on retourne sa valeur
      	return boundCtrl.value;

      case "SPAN" :
      case "A" :
      	// cas d'un outputfield : on retourne le texte du span ou du a
         return boundCtrl.innerHTML;
   }
}

/*
* Fixe la valeur textuelle du controle lie
*/
function setTextValueBoundCtrl (boundCtrl, val)
{
   switch (boundCtrl.tagName)
   {
      case "INPUT" :
      	// cas d'un entryfield : on fixe sa valeur
      	boundCtrl.value = val;
         break;

      case "SPAN" :
      case "A" :
      	// cas d'un outputfield : on fixe le texte du span ou du a
         boundCtrl.innerHTML = val;
         // on fixe le champ hidden associe a l'outputfield
         var lst = boundCtrl.ownerDocument.getElementsByName(boundCtrl.id);
         for (i = 0; i < lst.length; i++)
         {
            if ((lst[i].tagName == "INPUT") && (lst[i].type == "hidden"))
            {
               lst[i].value = val;
               break;
            }
         }
         break;
   }
}

/*
* Retourne la valeur de l'attribut background-color de la classe CSS className
*/
function getBgColorCSSClass (className)
{
   if (ie)
		return getCSSClassAttribute(className, 'backgroundColor');
   else
   	return getCSSClassAttribute(className, 'background-color');
}

/*
* Retourne la valeur de l'attribut color de la classe CSS className
*/
function getColorCSSClass (className)
{
   return getCSSClassAttribute(className, 'color');
}

/*
* Retourne la valeur de la propriete barColor si elle existe
* sinon retourne la valeur de l'attribut background-color de la classe CSS barColorClass
*/
function getBarColor(objCal)
{
   if (objCal.barColor != '')
   	return objCal.barColor;
   else
   	return objCal.barColorClassColor;
}

/*
* Retourne la valeur de la propriete daysColor si elle existe
* sinon retourne la valeur de l'attribut color de la classe CSS daysColorClass
*/
function getDaysColor(objCal)
{
   if (objCal.daysColor != '')
   	return objCal.daysColor;
   else
   	return objCal.daysColorClassColor;
}

/*
* Fonction de convertion de la date selectionnee
* sous la forme d'un entier.
* Si type date, entier au format date adelia,
* Si type num, entier au format dateformat du calendrier
*/
function convertDateToInt (objCal)
{
   var year = objCal.yearSelected;
   var month = objCal.monthSelected + 1;
   var day = objCal.daySelected;

   switch (objCal.type)
   {
      case TA_DATE :
 			return year * 10000 + month * 100 + day;

      case TA_NUM_P :
      case TA_NUM_E :
         if (objCal.typeLength == 6)
         	return convertDateToDate6 (year, month, day, objCal.dateFormat);
         else if (objCal.typeLength == 8)
         	return convertDateToDate8 (year, month, day, objCal.dateFormat);
         else
         	return 0;
   }  
}

/*
* Ecrit dans le document un tag style contenant
* la definition de ou des classes dont le nom est
* passe en parametre.
* Le nombre de parametres est multiple.
* Utilisee quand le calendrier est en popup fenetre
* pour propager la definition des classes css des couleurs
* dans le document de la popup
*/
function declareCSSClass ()
{
   var buff = null, i, j;
           
   function createClass(className)
   {         
      var tmpCSSRule = window.opener.getCSSRuleClass(className);
      
      if (tmpCSSRule == null)
         return;
         
      if (buff == null)
         buff = '<style type="text/css">';
         
      if (ie)      
         buff = buff + tmpCSSRule.selectorText + '{' + tmpCSSRule.style.cssText + '}\n';         
      else
         buff = buff + tmpCSSRule.cssText + '\n';
   }

   for (i = 0; i < arguments.length; i++)
   {          
      if ((arguments[i] == null) || (arguments[i] == ''))
         continue;    
      
      if (typeof(arguments[i]) == 'string')      
         createClass(arguments[i]);      
      else if (typeof(arguments[i]) == 'object' && ((arguments[i].constructor == Array) ||
               arguments[i].constructor.toString() == Array.toString()))
      {         
         for (j = 0; j < arguments[i].length; j++)
         {
            if ((arguments[i][j] == null) || (arguments[i][j] == ''))
               continue;   
               
            createClass(arguments[i][j]);
         }
      }
   }
   if (buff != null)
   {
      buff += '<\/style>';      
      document.write(buff);
   }
}


/*
* Debut du DnD sur le mousedown du span poignee
*/
function startDrag(e, objCal)
{
   // enregistrement de la position du curseur
   if (ie)
   {
      dragCursorPosXStart = event.clientX;
      dragCursorPosYStart = event.clientY;
   }
   else
   {
      dragCursorPosXStart = e.pageX;
      dragCursorPosYStart = e.pageY;
      // Pour eviter que sous Gecko, le deplacement souris
      // selectionne le texte du mois ou de l'annee
      e.preventDefault();
   }
   // enregistrement de la position du div 
   dragDivCal = document.getElementById(CAL_POPUP_DIV + objCal.calendarID);
   dragDivCalPosLeftStart = parseInt(dragDivCal.style.left); 
   dragDivCalPosTopStart = parseInt(dragDivCal.style.top);    
   // capture de l'ÚvÚnÞnement dÚplacement du curseur 
   if (document.captureEvents) 
   { 
      // pour Netscape 4         
      document.captureEvents(Event.MOUSEMOVE); 
   }          
   if (document.attachEvent) 
      document.attachEvent('onmousemove', moveItDrag);
   else if (document.addEventListener)      
      document.addEventListener('mousemove', moveItDrag, false);   
   else         
      document.onmousemove = moveItDrag; 
   
   return false;
}

/*
* Deplacement du calendrier sur le DnD
*/
function moveItDrag(e) 
{ 
   var cursorPosX, cursorPosY;

   // enregistrement de la position du curseur ; Si (netscape) ? vrai : faux; 
   if (ie)
   {
      cursorPosX = event.clientX; 
      cursorPosY = event.clientY; 
   }
   else
   {
      cursorPosX = e.pageX;
      cursorPosY = e.pageY;      
   }      
   // dÚplacement du div (rajout de + "px" pour Gecko)
   dragDivCal.style.left = (dragDivCalPosLeftStart + cursorPosX - dragCursorPosXStart) + "px"; 
   dragDivCal.style.top = (dragDivCalPosTopStart + cursorPosY - dragCursorPosYStart) + "px";     
   
   if (awsCalIFrame != null)
   {
      // Deplacement de l'iframe servant a cacher les tags select sous ie
      awsCalIFrame.style.left = dragDivCal.style.left;
      awsCalIFrame.style.top = dragDivCal.style.top;
   }
   return false; 
} 

/*
* Fin du DnD sur le mouseup du span poignee
*/
function endDrag(e) 
{    
   // Arret de la capture de l'ÚvÚnÞnement dÚplacement du curseur 
   if (document.captureEvents) 
   { 
      // pour Netscape 4 
      document.releaseEvents(Event.MOUSEMOVE); 
   } 
   if (document.removeEventListener)
      document.removeEventListener('mousemove', moveItDrag, false);      
   else if (document.detachEvent)
      document.detachEvent('onmousemove', moveItDrag);
   else
      document.onmousemove= '';   
} 

/*
* Fonctions de gestion du tooltip (methode FIXER_INFOBULLE_DATE)
*/
/*
* Creation d'un div unique utilise par tous les calendriers
* pour l'affichage des tooltip (methode FIXER_INFOBULLE_DATE)
*/
function createTooltip ()
{
   var div = document.getElementById(ID_CAL_TOOLTIP);
   
   if (div == null)
   {
      div = document.createElement('div');
      div.setAttribute('id', ID_CAL_TOOLTIP);      
      if (ie)      
         div.style.setAttribute('cssText', 'visibility:hidden;position:absolute;top:0px;left:0px;z-index:10;');      
      else
         div.setAttribute('style', 'visibility:hidden;position:absolute;top:0px;left:0px;z-index:10;');
   	
   	// Ajout du div au body   
   	document.body.insertBefore(div, document.body.firstChild);
   }
}

function createAndShowIFrame (objCal)
{
   var divGen = document.getElementById(CAL_POPUP_DIV + objCal.calendarID);
   awsCalIFrame = document.getElementById(ID_CAL_IFRAME);
   
   if (awsCalIFrame == null)
      awsCalIFrame = document.createElement('iframe');
      
   awsCalIFrame.src = 'about:blank';         
   awsCalIFrame.setAttribute('id', ID_CAL_IFRAME);
   awsCalIFrame.frameBorder = 'no';         
   document.body.appendChild(awsCalIFrame);   
   awsCalIFrame.style.position = 'absolute';            
   awsCalIFrame.style.width = divGen.offsetWidth;
   awsCalIFrame.style.height = divGen.offsetHeight;
   awsCalIFrame.style.left = divGen.style.left;
   awsCalIFrame.style.top = divGen.style.top;
   awsCalIFrame.style.visibility = 'visible';      
}

function showTooltipDate(e, objCal, day)
{
   var objTooltip = objCal.getTooltipDate(day, objCal.monthDisplay + 1, objCal.yearDisplay);
   var divTooltip, posX, posY, ecranX, ecranY;
   
   if (objTooltip == null || objTooltip.ttText == '')
      return;
      
   divTooltip = document.getElementById(ID_CAL_TOOLTIP);
   
   if (ie)
   {
      divTooltip.setAttribute('className', objTooltip.ttClass);
      posX = window.event.clientX;
      posY = window.event.clientY;
   }
   else
   {
      divTooltip.setAttribute('class', objTooltip.ttClass);
      posX = e.clientX;
      posY = e.clientY;
   }   
   // Ajoute la valeur des barres de dÚfilement
   if (! ie)
   {    
      // Ajoute la valeur des barres de dÚfilement
      posX += window.pageXOffset;
      posY += window.pageYOffset;
      ecranX = window.innerWidth + window.pageXOffset;
      ecranY = window.innerHeight + window.pageYOffset;
   }
   else
   {      
      if (document.documentElement && document.documentElement.clientWidth)
      {    
         // Ajoute la valeur des barres de dÚfilement
         posX += document.documentElement.scrollLeft;
         posY += document.documentElement.scrollTop;
         ecranX = document.documentElement.clientWidth + document.documentElement.scrollLeft;
         ecranY = document.documentElement.clientHeight + document.documentElement.scrollTop;
      }
      else if (document.body)
      {       
         // Ajoute la valeur des barres de dÚfilement
         posX += document.body.scrollLeft;
         posY += document.body.scrollTop;
         ecranX = document.body.clientWidth + document.body.scrollLeft;
         ecranY = document.body.clientHeight + document.body.scrollTop;
      }    
   }   
   if (divTooltip.style.visibility != "visible")
      divTooltip.innerHTML = unescape(objTooltip.ttText);
         
	// VÚrifie si le ToolTip sort de la page par la droite ou en bas
	if (posX + 10 + divTooltip.offsetWidth > ecranX)
		divTooltip.style.left = ecranX - divTooltip.offsetWidth + "px";
	else
		divTooltip.style.left = posX + 10 + "px";

	// VÚrifie si le ToolTip sort de la page par le bas
	if (posY + 15 + divTooltip.offsetHeight > ecranY)
		divTooltip.style.top = ecranY - divTooltip.offsetHeight + "px";
	else
		divTooltip.style.top = posY + 15 + "px";
   
   if (divTooltip.style.visibility != "visible")
      divTooltip.style.visibility = "visible";
}

function hideTooltipDate(e)
{
   var divTooltip = document.getElementById(ID_CAL_TOOLTIP);
   
   if (divTooltip.style.visibility == "visible")
      divTooltip.style.visibility = "hidden";
}
