function creerCalendrier ()
{
    //Constructeur de calendrier
    this.date=new Date();
    this.mois=Array("Janvier","Fevrier","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre");
    this.champ=null;
    this.timer=null;
    this.init=initCalendrier;
    this.formatDate=formatDateCalendrier;
    this.getDate=getDateCalendrier;
    this.printSaisie=printSaisieCalendrier;
    this.affiche=afficheCalendrier;
    this.cache=cacheCalendrier;
    this.getContenu=getContenuCalendrier;
    this.selectDate=selectDateCalendrier;
    this.initTimer=initTimerCalendrier;
    this.stopTimer=stopTimerCalendrier;
    this.limitemax=setcalendrierdtmax;//pas encore coder
    this.limitemin=setcalendrierdtmin;//pas ecnore coder
}


function setcalendrierdtmax(dtmax)
{

}

function setcalendrierdtmin(dtmin)
{

}


function initCalendrier()
{
    //création du calque du calendrier
	/*if (!document.getElementById("divCalendrier")) */document.write("<div id=\"divCalendrier\" style=\"display:none\" onmouseover=\"calendrier.stopTimer();\" onmouseout=\"calendrier.initTimer();\"></div>");
}

function formatDateCalendrier (dt)
{
    //retourne la date au format JJ/MM/AAAA à partir d'un paramètre de type Date
    var Y=dt.getFullYear();
    var D=dt.getDate();
    var M=dt.getMonth()+1;//+1 car les mois sont indicé de 0 à 11
    if (D<10) {D="0"+D;}//Pour afficher toujours le chiffre d'une date en 2 chiffres (ex: O8 au lieu de 8)
    if (M<10) {M="0"+M;}//Pour afficher toujours le chiffre d'une date en 2 chiffres (ex: O8 au lieu de 8)
    return D+"/"+M+"/"+Y;
}

function getDateCalendrier (txtDt)
{
    //retourne une variable de type Date à partir d'une chaine de la forme JJ/MM/AAAA
    var dt=new Date();
    var regControleDate=new RegExp ("^[0-9]{2}(/){1}[0-9]{2}(/){1}[0-9]{4}$","g");
    if (txtDt.match(regControleDate)) {
        dt.setDate(txtDt.substring(0,2));
        dt.setMonth(txtDt.substring(3,5)-1);
        dt.setFullYear(txtDt.substring(6,10));
    }
    return dt;
}

function printSaisieCalendrier(nom,bornesup,borneinf,default_date, my_value,extra)
{
    //cree un champ de saisie dans le document et lui associe le calendrier qui le cree
    var Borne_sup = (bornesup == undefined || bornesup == 'null')?null:bornesup;
    var Borne_inf = (borneinf == undefined || borneinf == 'null')?null:borneinf;
    var Default_date = (default_date == undefined || default_date == 'null')?null:default_date;

    if (Borne_inf=="today") {
        today=new Date();
        Borne_inf=this.formatDate(today);
    }
	
	if (!extra) {extra ="";}
	
	if (my_value!=""){
	
    document.write("<input type=\"text\" name=\""+nom+"\" id=\""+nom+"\" class=\"input_field inputCalendrier\"  value =\""+my_value+"\" autocomplete=\"off\" onclick=\"calendrier.affiche('"+nom+"','"+nom+"','"+Borne_sup+"','"+Borne_inf+"','"+Default_date+"')\">");
	}
	
	else{
		
	document.write("<input type=\"text\" name=\""+nom+"\" id=\""+nom+"\" class=\"input_field inputCalendrier\"  autocomplete=\"off\" onclick=\"calendrier.affiche('"+nom+"','"+nom+"','"+Borne_sup+"','"+Borne_inf+"','"+Default_date+"')\">");
	}
}

// Gets the absolute pixel position of the supplied element
function GetTagPixels(StartTag, Direction)
{
   var PixelAmt = (Direction == 'LEFT') ? StartTag.offsetLeft : StartTag.offsetTop;
   while ((StartTag.tagName != 'BODY') && (StartTag.tagName != 'HTML')) {
      StartTag = StartTag.offsetParent;
      PixelAmt += (Direction == 'LEFT') ? StartTag.offsetLeft : StartTag.offsetTop;
   }
   return PixelAmt;
}

function afficheCalendrier(champ,nom,bornesup,borneinf,default_date)
{
    //Affiche le calendrier à l'écran
    var Borne_sup = (bornesup == undefined || bornesup == 'null')?null:bornesup;
    var Borne_inf = (borneinf == undefined || borneinf == 'null')?null:borneinf;
    var Default_date = (default_date == undefined || default_date == 'null')?null:default_date;

	if (document.getElementById) {

		//ajout
		var Champ = document.getElementById(champ);

		this.stopTimer();//arreter le Timer lorsqu'on appelle l'affichage du calendrier
		this.date=this.getDate(Champ.value);//recupère la valeur de la date entré dans le champ (peut etre vide)
		this.champ=Champ;
		var div=document.getElementById("divCalendrier");

		// positionne le calendrier
		var absoluteTop  = GetTagPixels(Champ, 'TOP');
		var absoluteLeft = GetTagPixels(Champ, 'LEFT');
        // alert('ABSOLUTE LEFT:'+absoluteLeft+' TOP:'+absoluteTop);
		div.style.top  = (absoluteTop + Champ.offsetHeight + 3) + "px";
		div.style.left =  absoluteLeft + "px";

		// div.style.top=(champ.offsetTop+champ.offsetHeight+3)+"px";
		// div.style.left=champ.offsetLeft+"px";
		// alert(div.style.top+" "+div.style.left);

		if (Default_date!=null){
		dateDefaut=this.getDate(Default_date);
		var mois = dateDefaut.getMonth();
		calendrier.date.setMonth(mois);
		}

		this.getContenu(nom,Borne_sup,Borne_inf,Default_date);//Pour remplir le calendrier
		div.style.display="block";

        // si IE 6 alors cacher les SELECT
        if (window.navigator.userAgent.indexOf("MSIE 6") > 0 && !window.opera) {
            for(var i = 0; i < document.forms.length; i++) {
                for(var e = 0; e < document.forms[i].length; e++){
                    if(document.forms[i].elements[e].tagName == "SELECT") {
                        document.forms[i].elements[e].style.visibility="hidden";
                    }
                }
            }
        }

		this.initTimer();//reinitialisation du timer
	}
}

function getContenuCalendrier(nom,bornesup,borneinf,default_date){

//Variable definissant les date min, max et deafut
var dateMin=new Date();
var dateMax=new Date();
var dateDefaut=new Date();
var date_par_defaut=new Date();
var Borne_sup = (bornesup == undefined || bornesup == 'null')?null:bornesup;
var Borne_inf = (borneinf == undefined || borneinf == 'null')?null:borneinf;
var Default_date = (default_date == undefined || default_date == 'null')?null:default_date;
if (Borne_sup!=null){
dateMax=this.getDate(Borne_sup);
}
if (Borne_inf!=null){
dateMin=this.getDate(Borne_inf);
}
if (Default_date!=null){
dateDefaut=this.getDate(Default_date);
date_par_defaut=this.getDate(Default_date);
}

//Cree le contenu du calendrier pour la date passé en paramètre

var mois = this.mois[this.date.getMonth()];
var annee = this.date.getFullYear();

//txtContenu représente ce qui s'affichera à l'ecran (le tableau HTML)
var txtContenu="<table cellspacing=\"1\"><tr><td class=\"titre\"><a href=\"#"+nom+"\" onclick=\"calendrier.date.setMonth("+(this.date.getMonth()-1)+");calendrier.getContenu('"+nom+"','"+Borne_sup+"','"+Borne_inf+"','"+Default_date+"');\"><img src=\"/gifs/cal_precedent.gif\" alt=\"precedent\" title=\"Mois précédent\"/></a></td><td colspan=\"5\" class=\"titre\">"+mois+" "+annee+"</td><td class=\"titre\"><a href=\"#"+nom+"\" onclick=\"calendrier.date.setMonth("+(this.date.getMonth()+1)+");calendrier.getContenu('"+nom+"','"+Borne_sup+"','"+Borne_inf+"','"+Default_date+"');\"><img src=\"/gifs/cal_suivant.gif\" alt=\"suivant\" title=\"Mois suivant\"/></a></td></tr>";
txtContenu+="<tr><td class=\"jour\">Lun</td><td class=\"jour\">Mar</td><td class=\"jour\">Mer</td><td class=\"jour\">Jeu</td><td class=\"jour\">Ven</td><td class=\"jour\">Sam</td><td class=\"jour\">Dim</td></tr>";
txtContenu+="<tr>";

//recherche du premier jour du mois pour determiner à quelle date commence l'affichage
var dtAujourdhui=new Date();
var dtToday=new Date();
var dtJour1=new Date();

dtJour1.setDate(1);
dtJour1.setMonth(this.date.getMonth());
dtJour1.setFullYear(this.date.getFullYear());

var nbJourDecalage=dtJour1.getDay();
	if (nbJourDecalage==0){
	nbJourDecalage=7;
	}

//Boucle sur les cases du calendrier

var nbCase=0;
var dtBoucle=dtJour1;
dtBoucle.setDate(1-nbJourDecalage);
	for (var i=0;i<42;i++){
		dtBoucle.setDate(dtBoucle.getDate() +1);
		var txtDt=this.formatDate(dtBoucle);
		var classe="moisActif";
		if (dtBoucle.getMonth() != this.date.getMonth()){
			classe="moisInactif";
		}

		if (Default_date==null){

			if ((this.champ.value=="")&&(txtDt==this.formatDate(dtAujourdhui))){
			classe="jourSelection";
			}

		}
		else{
			if ((this.champ.value=="")&&(txtDt==this.formatDate(date_par_defaut))){
			classe="jourSelection";
			}
		}

		if (txtDt==this.champ.value){
		classe="jourSelection";
		}

		if ((Borne_sup!=null) && (dtBoucle>dateMax)){
		classe="nonselectionnable";
		}
		if ((Borne_inf!=null) && (dtBoucle<dateMin)){
		classe="nonselectionnable";
		}
		if(classe!="nonselectionnable"){
		txtContenu+="<td class=\""+classe+"\"><a href=\"javascript:calendrier.selectDate('"+txtDt+"')\" title=\""+txtDt+"\">"+dtBoucle.getDate()+"</a></td>";
		nbCase++;
		}
		else{
			if(classe=="nonselectionnable"){
			txtContenu+="<td class=\""+classe+"\"><a href=\"#\" title=\""+txtDt+"\"><s>"+dtBoucle.getDate()+"</s></a></td>";
			nbCase++;
			}
		}
		if (nbCase==7){
		txtContenu+="</tr>";
			if (i<41){
			txtContenu+="<tr>";
			}
		nbCase=0;
		}
	}
if (Default_date==null){

		if(!((Borne_sup!=null||Borne_inf!=null)&&(dtToday<dateMin||dtToday>dateMax))){

	txtContenu+="<tr><th colspan=7 rowspan=1 nowrap><a href=\"javascript:calendrier.selectDate('"+formatDateCalendrier(dtToday)+"')\" title=\""+formatDateCalendrier(dtToday)+"\">Aujourd'hui : "+formatDateCalendrier(dtToday)+"</a></th></tr>";


	}
}else{
	if(!((Borne_sup!=null||Borne_inf!=null)&&(date_par_defaut<dateMin||date_par_defaut>dateMax))){
txtContenu+="<tr><th colspan=7 rowspan=1 nowrap><a href=\"javascript:calendrier.selectDate('"+formatDateCalendrier(date_par_defaut)+"')\" title=\""+formatDateCalendrier(date_par_defaut)+"\">Proposition : "+formatDateCalendrier(date_par_defaut)+"</a></th></tr>";
		}


}

txtContenu+="</table>";
	if (document.getElementById){
	document.getElementById("divCalendrier").innerHTML=txtContenu;
	}
}

function selectDateCalendrier(txtDate) {
// gère le clic sur une date dans le calendrier
this.champ.value=txtDate;
this.champ.select();
this.cache();
}

function initTimerCalendrier(){
//Déclenche la minuterie que gère l'effacement du calendrier
	if (this.timer==null){
	this.timer=setTimeout("cacheCalendrier()",2000);
	}
}

function stopTimerCalendrier(){
//arrête la minuterie quand la soursi est sur le calendrier
	if(this.timer!=null){
	clearTimeout(this.timer);
	this.timer=null;
	}
}

function cacheCalendrier() {
    //cache le calque contenant le calendrier
	if (document.getElementById) {
    	var div=document.getElementById("divCalendrier");
	    div.style.display="none";
        // si IE 6 alors ré-afficher les SELECT
        if (window.navigator.userAgent.indexOf("MSIE 6") > 0 && !window.opera) {
            for(var i = 0; i < document.forms.length; i++) {
                for(var e = 0; e < document.forms[i].length; e++){
                    if(document.forms[i].elements[e].tagName == "SELECT") {
                        document.forms[i].elements[e].style.visibility="visible";
                    }
                }
            }
        }
    }
calendrier.stopTimer();
}

var calendrier=new creerCalendrier();
