/********************************************************************************
* Script permettant l'affichage d'un calendrier pour choisir une date   
* Auteur: Jonathan Bolduc
* Créé le 16 juillet 2006
* ©S.M.D. Informatique inc.
* 
* Fichiers: - calendrier.js
*           - calendrier.css
*********************************************************************************/

var strCalendrierDossier = '';	//Indiquer dans quel dossier se trouve les fichiers du script
var strNomMois = new Array(12);
var strNomMoisCourt = new Array(12);
var strNomJour = new Array(7);
var strTexte = new Array(5);

//CLASSE calendrier
function clsCalendrier(containerObject, objectName, lang, dateCourante, dateMin, dateMax, strDossier)
{
  //Initialisation du texte
	if (lang == 'FR') {
		strTexte[0] = 'calendrier';
		strTexte[1] = 'Cliquez sur la date désirée';
		strTexte[2] = 'Fermer le calendrier';
		strTexte[3] = 'Mois précédent';
		strTexte[4] = 'Mois suivant';

		strNomJour[0] = 'dimanche';
		strNomJour[1] = 'lundi';
		strNomJour[2] = 'mardi';
		strNomJour[3] = 'mercredi';
		strNomJour[4] = 'jeudi';
		strNomJour[5] = 'vendredi';
		strNomJour[6] = 'samedi';
		
		strNomMois[0] = 'janvier';
		strNomMois[1] = 'février';
		strNomMois[2] = 'mars';
		strNomMois[3] = 'avril';
		strNomMois[4] = 'mai';
		strNomMois[5] = 'juin';
		strNomMois[6] = 'juillet';
		strNomMois[7] = 'août';
		strNomMois[8] = 'septembre';
		strNomMois[9] = 'octobre';
		strNomMois[10] = 'novembre';
		strNomMois[11] = 'décembre';
		
		strNomMoisCourt[0] = 'jan';
		strNomMoisCourt[1] = 'fév';
		strNomMoisCourt[2] = 'mars';
		strNomMoisCourt[3] = 'avr';
		strNomMoisCourt[4] = 'mai';
		strNomMoisCourt[5] = 'juin';
		strNomMoisCourt[6] = 'juil';
		strNomMoisCourt[7] = 'août';
		strNomMoisCourt[8] = 'sept';
		strNomMoisCourt[9] = 'oct';
		strNomMoisCourt[10] = 'nov';
		strNomMoisCourt[11] = 'déc';
	}
	else {
		strTexte[0] = 'Calendar';
		strTexte[1] = 'Click on the desired date';
		strTexte[2] = 'Close the calendar';
		strTexte[3] = 'Previous month';
		strTexte[4] = 'Next month';

		strNomJour[0] = 'Sunday';
		strNomJour[1] = 'Monday';
		strNomJour[2] = 'Tuesday';
		strNomJour[3] = 'Wednesday';
		strNomJour[4] = 'Thursday';
		strNomJour[5] = 'Friday';
		strNomJour[6] = 'Saturday';

		strNomMois[0] = 'January';
		strNomMois[1] = 'February';
		strNomMois[2] = 'March';
		strNomMois[3] = 'April';
		strNomMois[4] = 'May';
		strNomMois[5] = 'June';
		strNomMois[6] = 'July';
		strNomMois[7] = 'August';
		strNomMois[8] = 'September';
		strNomMois[9] = 'October';
		strNomMois[10] = 'November';
		strNomMois[11] = 'December';

		strNomMoisCourt[0] = 'Jan';
		strNomMoisCourt[1] = 'Feb';
		strNomMoisCourt[2] = 'Mar';
		strNomMoisCourt[3] = 'Apr';
		strNomMoisCourt[4] = 'May';
		strNomMoisCourt[5] = 'June';
		strNomMoisCourt[6] = 'July';
		strNomMoisCourt[7] = 'Aug';
		strNomMoisCourt[8] = 'Sep';
		strNomMoisCourt[9] = 'Oct';
		strNomMoisCourt[10] = 'Nov';
		strNomMoisCourt[11] = 'Dec';
	}  
	
	strCalendrierDossier = strDossier;
	
	//Objet dans lequel sera créé le calendrier
	if (containerObject != undefined)
		this.calendrierContainer = containerObject;
	else
		this.calendrierContainer = document.body;
	
	//Conserver le nom de l'objet qui a instancié la classe afin de pouvoir
	//générer du code javascript appelant les méthodes de cet objet
	this.objectName = objectName;

  	//Initialisation date courante
	if (dateCourante != undefined)
		this.dateChoisie = dateCourante;
	else
		this.dateChoisie = new Date();

	//Initialisation date minimum
	if (dateMin != undefined)
		this.dateMin = dateMin;
	else
		this.dateMin = new Date();
		
	//Initialisation date maximum
	//Date maximum par défaut à 5 ans plus tard
	this.dateMax = new Date();
	this.dateMax.setFullYear(this.dateMax.getFullYear() + 5) 

	  // Si la date maximal passée en paramètre est plus basse que celle déterminée, on remplace
	  if (dateMax != undefined && this.dateMax > dateMax) {
		this.dateMax = dateMax;
	  }

	this.pages = new Array();
	this.indexPageEnCours = 0;
  
	//Création des pages de chaque mois du calendrier
	var datePage = new Date(this.dateMin.getFullYear(), this.dateMin.getMonth(), 1);
	var dateDernPage = new Date(this.dateMax.getFullYear(), this.dateMax.getMonth(), 1);
	var i = 0;
	var intPremierJourPage;
	var intDernierJourPage;

  while (datePage <= dateDernPage)
  {
      
    if (this.dateMin.getFullYear() == this.dateMax.getFullYear() && this.dateMin.getMonth() == this.dateMax.getMonth()) {
      //Mois minimum = Mois maximum ==> Le calendrier n'a qu'une page
      intPremierJourPage = this.dateMin.getDate();
      intDernierJourPage = this.dateMax.getDate();
    }
    else {
      if (i == 0) {
        //Première page du calendrier
        intPremierJourPage = this.dateMin.getDate();
        datePage.setMonth(datePage.getMonth() + 1);
        datePage.setDate(datePage.getDate() - 1);
        intDernierJourPage = datePage.getDate();
        datePage.setDate(1);
      }
      else {
        if (datePage.getFullYear() == dateDernPage.getFullYear() && datePage.getMonth() == dateDernPage.getMonth()) {
          //Dernière page du calendrier
          intPremierJourPage = 1;
          intDernierJourPage = this.dateMax.getDate();
        }
        else {
          //Pages au millieu du calendrier
          intPremierJourPage = 1;
          datePage.setMonth(datePage.getMonth() + 1);
          datePage.setDate(datePage.getDate() - 1);
          intDernierJourPage = datePage.getDate();
          datePage.setDate(1);
        }
      }
    }
    
    this.pages[i] = new clsCalendrierPage(objectName, lang, datePage.getMonth(), datePage.getFullYear(), intPremierJourPage, intDernierJourPage);
   	
    if (datePage.getFullYear() == this.dateChoisie.getFullYear() && datePage.getMonth() == this.dateChoisie.getMonth()) {
      this.pageEnCours = this.pages[i];
      this.indexPageEnCours = i;
    }
    i++;
    datePage.setMonth(datePage.getMonth() + 1);
  }

  //Méthodes
	this.ouvrir = clsCalendrier_Ouvrir;
	this.fermer = clsCalendrier_Fermer;
	this.afficherPage = clsCalendrier_AfficherPage;
 	this.afficherMoisPrecedent = clsCalendrier_AllerPagePrecedente;
	this.afficherMoisSuivant = clsCalendrier_AllerPageSuivante;
	this.selectDate = clsCalendrier_ChoisirDate;
}

function clsCalendrier_Ouvrir(posX, posY, largeur, hauteur)
{
  var html = '';
  var i;
  var datePage = new Date(this.dateMin.getFullYear(), this.dateMin.getMonth(), 1);
  var dateDernPage = new Date(this.dateMax.getFullYear(), this.dateMax.getMonth(), 1);  

//Valeurs par défaut dimensions et de posisitons
  if (largeur == undefined || largeur < 150) {
    largeur = 150;
  }

  if (hauteur == undefined || hauteur < 175) {
    hauteur = 175;
  }
  
  html += '<table cellspacing="0" cellpadding="0" class="calendrier" style="width: 100%; padding: 0px; margin: 0px;">';
  html +=   '<tr>';
  html +=     '<td class="calendrier_haut">';
  html +=     '<a href="javascript: ' + this.objectName + '.fermer(); void(\'\');" ';
  html +=       'onMouseOver="javascript: window.status=(\'' + strTexte[2] + '\'); return true;" ';
  html +=       'onMouseOut="javascript: window.status=(\'\'); return true;" ';
  html +=       'title="' + strTexte[2] + '" ';
  html +=     'style="float: right;">&nbsp;X&nbsp;</a></td>';
  html +=   '</tr>';
  html +=   '<tr>';
  html +=     '<td class="calendrier_menu" style="height: 25px; vertical-align: middle;text-align: center;">';
  html +=       '&nbsp;<a id="clsCalendrierNavigationPrecedent" href="javascript: ' + this.objectName + '.afficherMoisPrecedent(); void(\'\');" ';
  html +=       'onMouseOver="javascript: window.status=(\'' + strTexte[3] + '\'); return true;" ';
  html +=       'onMouseOut="javascript: window.status=(\'\'); return true;" ';
  html +=       'title="' + strTexte[3] + '" ';
  html +=       '><<</a>&nbsp;&nbsp;';
  html +=       '<select id="clsCalendrierSelectMois" onChange="javascript: ' + this.objectName + '.afficherPage(this.value);">';
  for (i = 0; i < this.pages.length; i++)
    html +=       '<option value="' + i + '">' + strNomMoisCourt[this.pages[i].mois].toUpperCase() + ' ' + this.pages[i].annee + '</option>';
  html +=       '</select>';
  html +=       '&nbsp;&nbsp;<a id="clsCalendrierNavigationSuivant" href="javascript: ' + this.objectName + '.afficherMoisSuivant(); void(\'\');" ';
  html +=       'onMouseOver="javascript: window.status=(\'' + strTexte[4] + '\'); return true;" ';
  html +=       'onMouseOut="javascript: window.status=(\'\'); return true;" ';
  html +=       'title="' + strTexte[4] + '" ';
  html +=       '>>></a>&nbsp;';
  html +=     '</td>';
  html +=   '</tr>';
  html +=   '<tr>';
  html +=      '<td id="clsCalendrierPageEnCours" class="calendrier_mois" style="vertical-align: top; padding: 0px;">&nbsp;</td>';
  html +=   '</tr>';
  html += '</table>';
 
  if (document.getElementById('clsCalendrier') != undefined) {
    this.calendrierContainer.removeChild(document.getElementById('clsCalendrier'));
  }

	var divCal = document.createElement('div');
	divCal.id = 'clsCalendrier';
	divCal.style.position = 'absolute';
	divCal.style.top = posY + 'px';
	divCal.style.left = posX + 'px';
	divCal.style.height = hauteur + 'px';
	divCal.style.width = largeur + 'px';
	divCal.style.zIndex = '1';

	//Iframe pour cacher les listes déroulantes en dessous du calendrier
	//Utilisé seulement avec IE
	if (navigator.userAgent.indexOf('MSIE') >= 0)
		if (location.href.substring(0, 5).toLowerCase() == 'https')
			html = '<iframe id="clsCalendrierIFrame" name="clsCalendrierIFrame" src="' + strCalendrierDossier + '/blank.html" scrolling="no" frameborder="0" style="POSITION: absolute; TOP:0px; LEFT:0px; HEIGHT:100%; WIDTH:100%;border:none;display:block;z-index:-1;"></iframe>' + html;      
		else
			html = '<iframe id="clsCalendrierIFrame" name="clsCalendrierIFrame" src="about:blank" scrolling="no" frameborder="0" style="POSITION: absolute; TOP:0px; LEFT:0px; HEIGHT:100%; WIDTH:100%;border:none;display:block;z-index:-1;"></iframe>' + html;      

	divCal.innerHTML = html
	this.calendrierContainer.appendChild(divCal);
  
  this.afficherPage(this.indexPageEnCours);
  document.getElementById('clsCalendrierSelectMois').focus();
}

function clsCalendrier_Fermer()
{
  this.calendrierContainer.removeChild(document.getElementById('clsCalendrier'));
}

function clsCalendrier_AllerPagePrecedente()
{	
  if (this.indexPageEnCours > 0)
    this.afficherPage(this.indexPageEnCours - 1);
}

function clsCalendrier_AllerPageSuivante()
{
  if (this.indexPageEnCours < this.pages.length - 1)
    this.afficherPage(this.indexPageEnCours + 1);	
}

function clsCalendrier_AfficherPage(indexPage) 
{
  this.indexPageEnCours = parseInt(indexPage, 10);
  this.pageEnCours = this.pages[this.indexPageEnCours];
  
  if (this.pageEnCours.estVide) {
    this.pageEnCours.emplir();
  }

  //Afficher ou cacher les boutons suivant/précédent
  if (this.indexPageEnCours == 0)
    document.getElementById('clsCalendrierNavigationPrecedent').style.visibility = 'hidden';
  else
    document.getElementById('clsCalendrierNavigationPrecedent').style.visibility = 'visible';

  if (this.indexPageEnCours == this.pages.length - 1)
    document.getElementById('clsCalendrierNavigationSuivant').style.visibility = 'hidden';
  else
    document.getElementById('clsCalendrierNavigationSuivant').style.visibility = 'visible';    

  document.getElementById('clsCalendrierSelectMois').selectedIndex = indexPage;
  document.getElementById('clsCalendrierSelectMois').options[indexPage].selected = true;
  document.getElementById('clsCalendrierPageEnCours').removeChild(document.getElementById('clsCalendrierPageEnCours').firstChild);
  document.getElementById('clsCalendrierPageEnCours').appendChild(this.pageEnCours.getPage());
}

function clsCalendrier_ChoisirDate(annee, mois, jour)
{
  var strMois = ('00' + (mois + 1));
  var strJour = ('00' + jour);
  strMois = strMois.substring(strMois.length - 2, strMois.length);
  strJour = strJour.substring(strJour.length - 2, strJour.length);

  this.dateChoisie = new Date(annee, mois, jour);
  this.fermer();

  if (this.onSelectDate != undefined) {
    this.onSelectDate();
  }
}

//CLASSE PAGE DE calendrier UTILISÉE PAR LA CLASSE calendrier
function clsCalendrierPage(objectCalendrierName, lang, mois, annee, jourMin, jourMax)
{
  //Proproétés
  this.estVide = true;
  this.mois = mois;
  this.annee = annee;
  this.jourMin = jourMin;
  this.jourMax = jourMax;
  this.objectCalendrierName = objectCalendrierName;
	this.grilleMois = new Array(); //Grille contenant chaque date de la page du calendrier	  
	this.nomMois = strNomMois[mois];
	this.langue = lang;
	
	//Méthodes
	this.getPage = clsCalendrierPage_GenererPage;
  this.emplir = clsCalendrierPage_BatirPage;
}

function clsCalendrierPage_BatirPage()
{
  var dateJour = new Date(this.annee, this.mois, 1);
  var intJour;
  var itnSem;
  
	intJour = dateJour.getDay();
	intSem = 0;
	while(dateJour.getMonth() == this.mois)
	{
	  if (this.grilleMois[intSem] == undefined)
	    this.grilleMois[intSem] = new Array();
	    	  
    this.grilleMois[intSem][intJour] = new Date(dateJour.getFullYear(), dateJour.getMonth(), dateJour.getDate());
    
    dateJour.setDate(dateJour.getDate() + 1);
    
    if (intJour == 6) {
      intSem++;
      intJour = 0;
    }
    else
      intJour++;
  }

  this.estVide = false;
}

function clsCalendrierPage_GenererPage()
{
  var aujourdhui = new Date();
  var intJour;
  var intSem;
  var html = '';
  var strIdentifJour;
  var table;
  var td;
  var a;

  table = document.createElement('table');
  table.style.height = '100%';
  table.style.width = '100%';
  table.cellSpacing = 0;
  table.cellPadding = 2;
 
  var thead = document.createElement('thead');
  thead.appendChild(document.createElement('tr'));
  
  for(intJour = 0; intJour < this.grilleMois[0].length; intJour++) {
	td = document.createElement('td');
    td.className = 'entete_semaine';
    td.style.width = '14%';
    td.style.height = '15px';
    td.style.textAlign = 'center';
    td.innerHTML = strNomJour[intJour].substring(0, 1).toUpperCase();
    thead.lastChild.appendChild(td);
  }
  table.appendChild(thead);
  
  var tbody = document.createElement('tbody');
  for(intSem = 0; intSem < this.grilleMois.length; intSem++) {
	tbody.appendChild(document.createElement('tr'));

    for(intJour = 0; intJour < this.grilleMois[intSem].length; intJour++) {

	  td = document.createElement('td');
      td.style.textAlign = 'center';
      
      if (this.grilleMois[intSem][intJour] != undefined) {
      
          if (this.langue == 'FR')
            strIdentifJour = strNomJour[this.grilleMois[intSem][intJour].getDay()] + ' ' + this.grilleMois[intSem][intJour].getDate() + ' ' + this.nomMois + ' ' + this.annee;            
          else
            strIdentifJour = strNomJour[this.grilleMois[intSem][intJour].getDay()] + ' ' + this.nomMois + ' ' + this.grilleMois[intSem][intJour].getDate() + ', ' + this.annee;
      
        td.id = 'Cal_J' + intJour + 'S' + intSem;
        if (intJour == 0 || intJour == 6)
        	td.className = 'jour_de_fin_de_sem';
        else
        	td.className = 'jour_de_semaine';
        
        //Ne pas afficher de lien si on est pas entre la date minimum et la date maximum permise
        if (this.grilleMois[intSem][intJour].getDate() >= this.jourMin && this.grilleMois[intSem][intJour].getDate() <= this.jourMax) {
		  a = document.createElement("a");
          a.href = 'javascript: ' + this.objectCalendrierName + '.selectDate(' + this.grilleMois[intSem][intJour].getFullYear() + ', ' + this.grilleMois[intSem][intJour].getMonth() + ', ' + this.grilleMois[intSem][intJour].getDate() + '); void(\'\');';
          
          if (this.grilleMois[intSem][intJour].getFullYear() == aujourdhui.getFullYear() && this.grilleMois[intSem][intJour].getMonth() == aujourdhui.getMonth() && this.grilleMois[intSem][intJour].getDate() == aujourdhui.getDate())
            a.className = 'aujourdhui';
          else
            a.className = 'autresJours';
          
          a.onMouseOver = 'javascript: window.status=(\'' + strIdentifJour + '\'); return true;';
          a.onMouseOut = 'javascript: window.status=(\'\'); return true;';
          a.title = strIdentifJour;     
          a.innerHTML = this.grilleMois[intSem][intJour].getDate();
          td.appendChild(a);
        }
        else {
			td.innerHTML = this.grilleMois[intSem][intJour].getDate();
        }
      }
      else
        td.innerHTML = '&nbsp;';
      
      tbody.lastChild.appendChild(td);
    }
  }
  table.appendChild(tbody);
  return(table);
}
