/* auteur: Bernard Martin-Rabaud */

/* Date de création: 18/12/2003 */



/***********************************************************************************************************/

/*                                             CALENDRIER EN JAVASCRIPT                                    */

/***********************************************************************************************************/


var duree_jour = 24 * 60 * 60 * 1000;
var calendrier = new Calendrier();

function Calendrier() {
	this.date_jour = dateAMidi();
	this.feries = null;
	this.jours_evts = null;
}


Calendrier.prototype.afficher = function() {
	// affiche le mois concernant la date demandée (en argument, facultative)
	this.joursFeries();
	this.joursEvenement();
	html = '<img src="/images/commun/col_droite/t_agenda.gif" />'
	html += "<table id='calendrier' cellspacing='0' cellpadding='0' border='0' summary='calendrier'>";
	html += "<tr><td>";
	html += "<table id='calendrier-haut' class='mois' cellspacing='0' cellpadding='0' align='center' border='0' summary='mois et année du calendrier'>";
	html += this.afficherEntete();
	html += "</table>";
	html += "</td></tr>";
	html += "<tr><td>";
	html += "<table id='calendrier-jours' cellspacing='0' cellpadding='0' border='0' summary='jour du mois'>";
	html += this.afficherJoursSemaine();
	html += this.afficherJoursMois();
	html += "</table>";
	html += '</td></tr><tr><td><a href="/fo/liste_agenda.asp?date='+this.date_jour.afficherJourMoisAnnee()+'" class="today">Aujourd\'hui</a></td></tr>';
	html += "</table>";
	document.getElementById('agenda').innerHTML = html;
}

Calendrier.prototype.joursFeries = function() {
	// indique les jours fériés en fonction de l'année du calendrier
	var feries = this.date_jour.joursFeriesMobiles();
	this.feries = "|" + feries.join("|") + "|";
}

Calendrier.prototype.joursEvenement = function() {
	// indique les jours où se déroule un événement en fonction de l'année du calendrier
	var jours_evts = this.date_jour.listeJoursEvenement();
	this.jours_evts = "|" + jours_evts.join("|") + "|";
}

Calendrier.prototype.afficherEntete = function() {
	// affiche le mois (en lettres) et l'année avec des flèches pour les incrémenter ou les décrémenter
	// affichage de 2 flèches prec 
	var html = "<tr>";
	html += "<td>";
	html += "<a href='javascript:calendrier.JAXmoisPrecedent()' title='mois précédent'>";
	html += "<img src='/images/commun/col_droite/agenda_fl_g.gif' border='0' alt='mois précédent'></a>";
	// affichage du mois avec son id qui permettra de modifier le contenu du <td>
	html += "<td id='calendrier-mois-an'>" + this.date_jour.moisLitteral() + " " + this.date_jour.getFullYear() + "</td>";
	// affichage de 2 flèches suiv 
	html += "</td>";
	html += "<td>";
	html += "<a href='javascript:calendrier.JAXmoisSuivant()' title='mois suivant'>";
	html += "<img src='/images/commun/col_droite/agenda_fl_d.gif' border='0' alt='mois suivant'></a>";
	html += "</td>";
	html += "</tr>";
	return html;
}

Calendrier.prototype.afficherJoursSemaine = function() {
	// affiche les jours de la semaine sur une ligne
	var jours_sem = new Array("L", "M", "M", "J", "V", "S", "D");
	var html = "<tr>";
	for (var i=0;i<jours_sem.length;i++) {
		if (i < 5) html += "<td class='calendrier-sem'>" + jours_sem[i] + "</td>";
		else html += "<td class='calendrier-fin-sem'>" + jours_sem[i] + "</td>";
	}
	html += "</tr>";
	return html;
}

Calendrier.prototype.afficherJoursMois = function() {
	// affiche les jours du mois en fonction du mois et de l'année en cours
	// limites indique le début et la fin des jours visibles dans le calendrier
	// de façon à ce que le calendrier contienne le 1er du mois sur la 1ère ligne
	var limites = this.limitesMoisCalendrier();
	var jour = limites[0];
	var auj = dateAMidi();
	var col = 0;
	var ligne = 0;
	var html = "<tr>";
	while (jour <= limites[1]) {
		if (col == 7) {
			html += "</tr><tr>";
			col = 0;
			ligne++;
		}		
		if (jour.memeJour(auj)) html += "<td class='calendrier-jour-auj";
		else if (jour.dansLeMois(this.date_jour)) { 
			if (col < 5) html += "<td class='calendrier-jour";
			else html += "<td class='calendrier-jour-we";
		}
		else html += "<td class='calendrier-jour-horsmois";
		if (this.estFerie(jour)) html += " calendrier-jour-ferie";

		if (this.estEvenement(jour)){
			html += " calendrier-jour-evt";
			html += "'onMouseOver='this.style.cursor=\"pointer\"' onclick='window.location.href=\"/fo/liste_agenda.asp?date="+jour.afficherJourMoisAnnee()+"\"'>" + jour.getDate() + "</td>";
		}else{
			html += "'>" + jour.getDate() + "</td>";
		}
			/*html += "' onclick='calendrier.selectJour(" + ligne + ", " + col + ")'><a href='/fo/liste_agenda.asp?date="+jour.afficherJourMoisAnnee()+"' class='calendrier-jour-evt'>" + jour.getDate() + "</a></td>";
		}else{
			html += "' onclick='calendrier.selectJour(" + ligne + ", " + col + ")'>" + jour.getDate() + "</td>";
		}*/
		
		jour.jourSuivant();
		col++;
	}
	html += "</tr>";
	ligne++;
	while (ligne < 6) {
		html += "<tr>";
		for (col=0;col<7;col++) html += "<td class=''>&nbsp;</td>";
		html += "</tr>";
		ligne++;
	}
	return html;
}

Calendrier.prototype.limitesMoisCalendrier = function() {
	// détermine les limites du calendrier relatif au mois de la date en cours, de telle façon à ce que le 1er du mois
	// soit sur la 1ère ligne, que le dernier du mois sur la dernière ligne, 
	// et que le début du calendrier commence un lundi et la fin finisse un dimanche

	// on cherche la date du début du calendrier
	var jour = new Date(this.date_jour.getTime());
	jour.debutMois(); // date du 1er du mois
	var jour_semaine = jour.getDay();
	jour_semaine = jour_semaine ? jour_semaine - 1 : 6;
	var debut_cal = new Date();
	debut_cal.setTime(jour.getTime() - jour_semaine * duree_jour);

	// puis la date de la fin du calendrier
	jour.finMois(); 
	jour_semaine = jour.getDay();
	jour_semaine = jour_semaine ? jour_semaine - 1 : 6;
	var fin_cal = new Date();
	fin_cal.setTime(jour.getTime() + (6 - jour_semaine)  * duree_jour);

	var limites = new Array(debut_cal, fin_cal);
	return limites;
}

Calendrier.prototype.moisSuivant = function() {
	// fait passer le calendrier au mois suivant
	// il faut modifier le jour courant du calendrier,
	// puis modifier le mois et éventuellement l'année en haut du calendrier
	// et les jours, tout ça via la structure du DOM
	
	this.date_jour.moisSuivant();
	this.joursFeries();
	this.joursEvenement();
	this.majEntete();
	this.majJoursMois();
}

Calendrier.prototype.moisPrecedent = function() {
	// fait passer le calendrier au mois suivant
	// il faut modifier le jour courant du calendrier,
	// puis modifier le mois et éventuellement l'année en haut du calendrier
	// et les jours, tout ça via la structure du DOM
	
	this.date_jour.moisPrecedent();
	this.joursFeries();
	this.joursEvenement();
	this.majEntete();
	this.majJoursMois();
}

Calendrier.prototype.anneeSuivante = function() {
	// fait passer le calendrier au mois suivant
	// il faut modifier le jour courant du calendrier,
	// puis modifier le mois et éventuellement l'année en haut du calendrier
	// et les jours, tout ça via la structure du DOM

	this.date_jour.anneeSuivante();
	this.joursFeries();
	this.joursEvenement();
	this.majEntete();
	this.majJoursMois();
}

Calendrier.prototype.anneePrecedente = function() {
	// fait passer le calendrier au mois suivant
	// il faut modifier le jour courant du calendrier,
	// puis modifier le mois et éventuellement l'année en haut du calendrier
	// et les jours, tout ça via la structure du DOM
	
	this.date_jour.anneePrecedente();
	this.majEntete();
	this.majJoursMois();
}

Calendrier.prototype.majEntete = function() {
	// met à jour le mois et l'année en-tête du calendrier
	document.getElementById("calendrier-mois-an").lastChild.nodeValue = this.date_jour.moisLitteral() + " " + this.date_jour.getFullYear();
}

Calendrier.prototype.majJoursMois = function() {
	  var NbEvt=0;
        var isAppleWebKit = (navigator.userAgent.indexOf("AppleWebKit") !=-1); // << Detecte non seulement Safari mais tous les navigateurs basés sur le WebKit Apple.
        var isSafari = (navigator.userAgent.indexOf("Safari") !=-1); // << Detecte uniquement Safari
	  var isIE=(document.all && !window.opera)?1:0;

        var racine = document.getElementById("calendrier-jours").lastChild;
        var limites = this.limitesMoisCalendrier();
        var jour = limites[0];
        var auj = dateAMidi();
        var iligne = 1;
        var ligne = racine.childNodes[iligne];
        var cell = ligne.firstChild;
        var col = 0;
        do {
                if (col == 7) {
                        ligne = racine.childNodes[++iligne];
                        cell = ligne.firstChild;
                        col = 0;
                }
                else cell = ligne.childNodes[col];
									
				cell.removeAttribute("onmouseover");//Churchill : retire les evts souris sur les dates evenements
				cell.removeAttribute("onclick");//Churchill : retire les evts souris sur les dates evenements
				cell.removeAttribute("style");//Churchill : retire les styles

                if (isAppleWebKit) cellClass=cell.attributes[0]; // << Ici on patche pour tous ceux basés sur le webKit (hypothèse non vérifiée)
                else cellClass=cell.attributes["class"]; // <<

                if (jour.memeJour(auj)) cellClass.nodeValue = "calendrier-jour-auj";
                else if (jour.dansLeMois(this.date_jour)) {
                        if (col < 5) cellClass.nodeValue = "calendrier-jour"; // <<
                        else cellClass.nodeValue = "calendrier-jour-we";// <<
                }
                else cellClass.nodeValue = "calendrier-jour-horsmois";// <<
                if (this.estFerie(jour)) cellClass.nodeValue += " calendrier-jour-ferie";// <<
				if (this.estEvenement(jour)) {
					NbEvt=NbEvt+1;
					cellClass.nodeValue += " calendrier-jour-evt";
					cell.setAttribute("style", "cursor:pointer" );
					cell.setAttribute("onclick", 'window.location.href="/fo/liste_agenda.asp?date='+jour.afficherJourMoisAnnee()+'";' );

					// Code pour IE
					if (isIE)
					{
						cell.setAttribute("dtevt", jour.afficherJourMoisAnnee() );
						cell.style.setAttribute("cssText","cursor:pointer");						 
						cell.onclick = function(){eval('window.location.href="/fo/liste_agenda.asp?date='+this.getAttribute("dtevt")+'";')};
					}
				}
                cell.firstChild.nodeValue = jour.getDate();
                jour.jourSuivant();
                col++;
        } while ((limites[1].getTime() - jour.getTime()) >= 0);
        // cas où les jours s'affichent sur moins de 6 lignes
        while (iligne < 6) {
                ligne = racine.childNodes[++iligne];
                for (col=0;col<7;col++) {
                        cell = ligne.childNodes[col];
                        if (isAppleWebKit) cellClass=cell.attributes[0]; // <<
                        else cellClass=cell.attributes["class"]; // <<
                        cellClass.nodeValue = ""; // <<
                        cell.firstChild.nodeValue = " "; // <<
                }
        }
}

Calendrier.prototype.estFerie = function(jour) {
	// détermine si un jour est férié (rajouter la date de Pâques plus tard)
	var ch_date = rajoute0(jour.getDate()) + "/" + rajoute0(jour.getMonth()+1);
 	if (this.feries.indexOf("|" + ch_date + "|") == -1) return false;
 	else return true;
}

Calendrier.prototype.estEvenement = function(jour) {
	// détermine si un événement est prévu ce jour

	var ch_date = rajoute0(jour.getDate()) + "/" + rajoute0(jour.getMonth()+1);
 	if (this.jours_evts.indexOf("|" + ch_date + "|") == -1) return false;
 	else return true;
}


// FONCTIONS UTILITAIRES

Date.prototype.dansLeMois = function(date_ref) {
	// indique si la date en cours et date_ref sont du même mois et de la même année
	if ((this.getMonth() == date_ref.getMonth()) && (this.getFullYear() == date_ref.getFullYear()))
		return true;
	else return false;
}

Date.prototype.jourSuivant = function() {
	// incrémente le jour de la date en fonction du nombre de jours en argument (si pas d'argument, l'incrément = 1)
	// p. ex. var jour = new Date(2004, 0, 1) (soit 01/01/2004), jour.jourSuivant() donnera le 02/01/2004
	// et jour.jourSuivant(31) donnera le 01/02/2004
	if (arguments.length) var increment = parseInt(arguments[0]);
	else var increment = 1;
	this.setDate(this.getDate() + increment);
}

Date.prototype.moisSuivant = function() {
	// passe le jour au mois suivant

	if (this.getMonth() < 11) this.setMonth(this.getMonth() + 1);
	else {
   		this.setMonth(0);
   		this.setFullYear(this.getFullYear() + 1);
 	}
}

Date.prototype.moisPrecedent = function() {
	// passe le jour au mois précédent

	if (this.getMonth()) this.setMonth(this.getMonth() - 1);
	else {
   		this.setMonth(11);
   		this.setFullYear(this.getFullYear() - 1);
 	}
}

Date.prototype.anneeSuivante = function() {
	// passe le jour à l'année suivante

	this.setFullYear(this.getFullYear() + 1);
}

Date.prototype.anneePrecedente = function() {
	// passe le jour à l'année précédente

	this.setFullYear(this.getFullYear() - 1);
}

Date.prototype.debutMois = function() {
	// met la date en cours au premier du mois

	this.setTime(this.getTime() - (this.getDate() - 1) * duree_jour); 
}

Date.prototype.finMois = function() {
	// met la date en cours à la fin du mois

	this.moisSuivant();
 	this.setDate(1);
 	this.setTime(this.getTime() - duree_jour);
}

Date.prototype.memeJour = function(une_date) {
	// si la date courante est le même jour que une_date, retourne "true", sinon retourne "false"

	var diff = Math.abs(this.getTime() - une_date.getTime());
	if (diff < 60*60*1000) return true;
	else return false;
}

Date.prototype.moisLitteral = function() {
	var nom_mois = new Array("janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre");
	return nom_mois[this.getMonth()];
}

Date.prototype.joursFeriesMobiles = function() {
	// ajoute aux jours fériés fixes les jours fériés mobiles : lundi de Pâques, Ascension et lundi de Pentecôte
	var jours_feries = new Array("01/01", "01/05", "14/07", "15/08", "01/11", "11/11", "25/12");
	var jour = paques(this.getFullYear());

	// lundi de Pâques
	jour.jourSuivant();
	jours_feries.splice(1, 0, jour.afficherJourMois());

	// ascension
	jour.jourSuivant(38);
	if (jour.getMonth() > 3) jours_feries.splice(3, 0, jour.afficherJourMois());
	else jours_feries.splice(2, 0, jour.afficherJourMois());

	// lundi de Pentecôte
	jour.jourSuivant(11);
	jours_feries.splice(4, 0, jour.afficherJourMois());
	return jours_feries;	
}

Date.prototype.listeJoursEvenement = function() {
	//jours_evts = new Array('09/09','10/09','10/10');
	jours_evts = tab_evts;
	//alert(jours_evts);
	return jours_evts;	
}

Date.prototype.afficherJourMois = function() {
	return rajoute0(this.getDate()) + "/" + rajoute0(eval(this.getMonth() + 1));
}

Date.prototype.afficherJourMoisAnnee = function() {
	return rajoute0(this.getDate()) + "/" + rajoute0(eval(this.getMonth() + 1))+ "/" +this.getFullYear();
}

function dateAMidi() {
	// crée une date à midi (12h 0mn 0sec)

	if (arguments.length) ladate = arguments[0];
	else ladate = new Date();
	ladate.setHours(12);
	ladate.setMinutes(0);
	ladate.setSeconds(0);
	return ladate;
}

function rajoute0(valeur) {
	return (valeur < 10) ? "0" + valeur : valeur;
}

function paques(annee) {
    // retourne une date Javascript, qui est la date de Pâques en fonction de l'année

	annee = parseInt(annee);
    var date_paques = null;
    var b = annee - 1900;
    var c = annee % 19;
    var d = Math.floor((7*c+1)/19);
    var e = (11*c+4-d) % 29;
    var f = Math.floor(b/4);
    var g = (b+f+31-e) % 7;
    var avril = 25-e-g;
    if (avril > 0) date_paques = new Date(annee, 3, avril);
    else date_paques = new Date(annee, 2, avril + 31);
    return date_paques;
}

//======================================================
// Requete Ajax : recupération des dates événements
//======================================================

function getHTTPObject()
{
  var xmlhttp = false;

  /* Compilation conditionnelle d'IE */
  /*@cc_on
  @if (@_jscript_version >= 5)
     try
     {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
     }
     catch (e)
     {
        try
        {
           xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (E)
        {
           xmlhttp = false;
        }
     }
  @else
     xmlhttp = false;
  @end @*/

  /* on essaie de créer l'objet si ce n'est pas déjà fait */
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined')
  {
     try
     {
        xmlhttp = new XMLHttpRequest();
     }
     catch (e)
     {
        xmlhttp = false;
     }
  }

  return xmlhttp;
}

function JAXaffiche(){
	var date_jour = dateAMidi();
	moisEnCours = date_jour.getMonth()+1;
	anneeEnCours = date_jour.getFullYear();
	/* Création de l'objet : */
	var xmlhttp = getHTTPObject();
	/* Préparation d'une requête asynchrone de type POST : */
	xmlhttp.open("POST", "/fo/date_agenda.asp",true);
	/* Effectue la requête en envoyant les données : */
	xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	//xmlhttp.send("annee="+this.getFullYear()+"&mois="+eval(this.getMonth() + 1));
	xmlhttp.send("annee="+anneeEnCours+"&mois="+moisEnCours);
	
	if (xmlhttp)
	{
		/* on définit ce qui doit se passer quand la page répondra */
		xmlhttp.onreadystatechange=function(){
			if (xmlhttp.readyState == 4){ /* 4 : état "complete" */
			   if (xmlhttp.status == 200){ /* 200 : code HTTP pour OK */
				  /* Traitement de la réponse. */
				  //alert(xmlhttp.responseText);
				  list_dates = xmlhttp.responseText.split(",");

				  tab_evts = new Array();
				  for (i=0;i<list_dates.length;i++){
				  		tab_evts.push(list_dates[i]);
				  }
				  calendrier.afficher();
			   }
			}
		}
	}
}

Calendrier.prototype.JAXmoisPrecedent = function (){
	/* Gestion de la date en cours (mois/annee) */
	if(moisEnCours > 1) {
		moisEnCours--; 
	}else {
		moisEnCours = 12;
		anneeEnCours--;
	}
	

	/* Création de l'objet : */
	var xmlhttp = getHTTPObject();
	/* Préparation d'une requête asynchrone de type POST : */
	xmlhttp.open("POST", "/fo/date_agenda.asp",true);
	/* Effectue la requête en envoyant les données : */
	xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	//xmlhttp.send("annee="+this.date_jour.getFullYear()+"&mois="+eval(this.date_jour.getMonth() + 1));
	xmlhttp.send("annee="+anneeEnCours+"&mois="+rajoute0(moisEnCours));
	
	if (xmlhttp)
	{
		/* on définit ce qui doit se passer quand la page répondra */
		xmlhttp.onreadystatechange=function(){
			if (xmlhttp.readyState == 4){ /* 4 : état "complete" */
			   if (xmlhttp.status == 200){ /* 200 : code HTTP pour OK */
				  /* Traitement de la réponse. */
				  //alert(xmlhttp.responseText);
				  list_dates = xmlhttp.responseText.split(",");

				  tab_evts = new Array();
				  for (i=0;i<list_dates.length;i++){
				  		tab_evts.push(list_dates[i]);
				  }
				  calendrier.moisPrecedent()
			   }
			}
		}
	}
}

Calendrier.prototype.JAXmoisSuivant = function (){
	/* Gestion de la date en cours (mois/annee) */
	if(moisEnCours < 12) {
		moisEnCours++;
	}else{
		moisEnCours = 1;
		anneeEnCours++;
	}
	

	/* Création de l'objet : */
	var xmlhttp = getHTTPObject();
	/* Préparation d'une requête asynchrone de type POST : */
	xmlhttp.open("POST", "/fo/date_agenda.asp",true);
	/* Effectue la requête en envoyant les données : */
	xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	//xmlhttp.send("annee=2006&mois=10");
	xmlhttp.send("annee="+anneeEnCours+"&mois="+rajoute0(moisEnCours));
	
	if (xmlhttp)
	{
		/* on définit ce qui doit se passer quand la page répondra */
		xmlhttp.onreadystatechange=function(){
			if (xmlhttp.readyState == 4){ /* 4 : état "complete" */
			   if (xmlhttp.status == 200){ /* 200 : code HTTP pour OK */
				  /* Traitement de la réponse. */
				  //alert(xmlhttp.responseText);
				  list_dates = xmlhttp.responseText.split(",");

				  tab_evts = new Array();
				  for (i=0;i<list_dates.length;i++){
				  		tab_evts.push(list_dates[i]);
				  }
				  calendrier.moisSuivant()
			   }
			}
		}
	}
}
