//copyright ADOK Gilles Vanderstraeten : gillesvds@adok.info
//utf-8
//exige incDate.js
//--------------------------------------------------
function tabCalendrierMensuel(annee,numMois,numJourSemaineFinLigne,crlf){
	//retourne un tableau JS permettant d'afficher facilement un calendrier mensuel commençant le lundi et se terminant au choix (semaine de 1 à 7 jours)
	//ENTREE
	//annee : AAAA (année en cours par défaut)
	//numMois : 1 à 12 (mois en cours par défaut)
	//numJourSemaineFinLigne : 1 à 7 (lundi au dimanche, dimanche par défaut)
	//crlf : true/false selon que l'on souhaite ou non une indication de saut de ligne (true par défaut)
	//SORTIE
	//tableau 1D dont chaque case contient t ou 0
	//t : unix des jours à midi (au début et à la fin, les jours peuvent appartenir au mois précédent ou au mois suivant)
	//0 : fin de ligne (si crlf true)
	//NOTES
	//la longueur maxi du tableau est de 42 cases, correspondant à 6 semaines de 7 jours
	var dateNow=new Date();
	var datePremierJourMois;
	var unixPremierJourMois;
	var numJourSemaine,numJourSemainePremierJourMois;
	var unixPremierJour;
	var nbJoursMois;
	var unixDernierJourMois;
	var dateDernierJourMois;
	var numJourSemaineDernierJourMois;
	var unixDernierJour;
	var tab=[],unixJour,dateJour;
	if(!annee)annee=dateNow.getFullYear();
	if(!numMois)numMois=dateNow.getMonth()+1;
	if(!numJourSemaineFinLigne)numJourSemaineFinLigne=7;
	if(crlf!==false)crlf=true;
	datePremierJourMois=new Date(annee,numMois-1,1,12);//midi
	unixPremierJourMois=datePremierJourMois.getTime()/1000;
	numJourSemaine=datePremierJourMois.getDay();//lundi=1,...,dimanche=0
	numJourSemainePremierJourMois=numJourSemaine==0?7:numJourSemaine;//lundi=1,...,dimanche=7
	if(numJourSemainePremierJourMois<=numJourSemaineFinLigne)unixPremierJour=unixPremierJourMois-(numJourSemainePremierJourMois-1)*24*3600;//on recule au lundi précédent
	else unixPremierJour=unixPremierJourMois+(8-numJourSemainePremierJourMois)*24*3600;//on avance au lundi suivant
	nbJoursMois=nbJoursDansMois(annee,numMois);
	unixDernierJourMois=unixPremierJourMois+(nbJoursMois-1)*24*3600;
	dateDernierJourMois=new Date(unixDernierJourMois*1000);
	numJourSemaine=dateDernierJourMois.getDay();//lundi=1,...,dimanche=0
	numJourSemaineDernierJourMois=numJourSemaine==0?7:numJourSemaine;//lundi=1,...,dimanche=7
	unixDernierJour=unixDernierJourMois+(numJourSemaineFinLigne-numJourSemaineDernierJourMois)*24*3600;
	for(unixJour=unixPremierJour;unixJour<=unixDernierJour;unixJour+=24*3600){
		tab.push(unixJour);
		dateJour=new Date(unixJour*1000);
		numJourSemaine=dateJour.getDay();//lundi=1,...,dimanche=0
		numJourSemaine=numJourSemaine==0?7:numJourSemaine;//lundi=1,...,dimanche=7
		//tab.push(dateJour.toString());//DEBUG
		if(crlf && unixJour<unixDernierJour && numJourSemaine==numJourSemaineFinLigne){
			tab.push(0);//fin de ligne
			unixJour+=(7-numJourSemaineFinLigne)*24*3600;//saut des jours non affichables
		}
	}
	return tab;
}
//--------------------------------------------------
function calendrierMensuel(idInput,annee,numMois,joursAnterieursNonClicables,numJourSemaineFinLigne,langue){
	//retourne une chaîne XHTML correspondant à un calendrier mensuel commençant le lundi et se terminant au choix (semaine de 1 à 7 jours)
	//ENTREE
	//idInput : ID de l'objet DOM <input> recevant la date
	//ATTENTION : l'ID de l'objet DOM calendrier doit être le ID du <input> suivi de "Cal"
	//						l'objet DOM calendrier doit être invisible au départ
	//						le format de la date dans le <input> doit être JJ-MM-AAAA
	//annee : AAAA (si absent, année présente dans le <input>, si absent année en cours)
	//numMois : 1 à 12 (si absent, mois présent dans le <input>, si absent mois en cours)
	//joursAnterieursNonClicables : true ou false selon que l'on souhaite que les jours antérieurs au jour en cours soient clicables ou non (true par défaut)
	//numJourSemaineFinLigne : 1 à 7 (lundi au dimanche, dimanche par défaut)
	//langue : langue pour le mois et les jours de la semaine (fr par défaut, voir incDate.js)
	//SORTIE
	//si une date est déjà saisie dans le <input>, le calendrier se cale dessus, sinon (ou si invalide), il se cale sur la date en cours
	//des flèches permettent de naviguer dans les mois
	//un clic sur un jour inscrit la date du jour en question dans le <input> et ré-invisibilise le calendrier
	//IMAGES
	//fléche gauche : cal_moisPrecedent.png (5x9)
	//fléche gauche : cal_moisSuivant.png (5x9)
	//CSS
	//cal_global
	//cal_bandeau
	//cal_entete
	//cal_joursAnterieursNonClicables
	//cal_joursDansMois
	//cal_joursHorsMois
	//cal_jour
	var objInput=document.getElementById(idInput);
	var dateInput=makeDate(objInput.value);
	var dateEnCours=dateInput?dateInput:midi();
	if(!annee)annee=dateEnCours.getFullYear();//DEFAULT
	if(!numMois)numMois=dateEnCours.getMonth()+1;//DEFAULT
	var anneePrecedente=numMois>1?annee:annee-1;
	var anneeSuivante=numMois<12?annee:annee+1;
	var numMoisPrecedent=numMois>1?numMois-1:12;
	var numMoisSuivant=numMois<12?numMois+1:1;
	if(joursAnterieursNonClicables!==false)joursAnterieursNonClicables=true;//DEFAULT
	if(!numJourSemaineFinLigne)numJourSemaineFinLigne=7;//DEFAULT
	if(!langue)langue="fr";//DEFAULT
	var idCal=idInput+"Cal";
	var objCal=document.getElementById(idCal);
	var strHtml="";
	var dateJour=new Date();
	var tab=tabCalendrierMensuel(annee,numMois,numJourSemaineFinLigne);
	var t;
	var classeJour;
	var initCal=true;//pour désactiver le body.onclick qui invisibilise le calendrier (voir tout en bas)
	//global
	strHtml+="<table class=\"cal_global\">";
	//bandeau
	strHtml+="<tr class=\"cal_bandeau\">";
	strHtml+="<td onclick=\"javascript:calendrierMensuel('"+idInput+"',"+anneePrecedente+","+numMoisPrecedent+","+joursAnterieursNonClicables+","+numJourSemaineFinLigne+",'"+langue+"')\"><a href=\"javascript:void(0)\"><img src=\"cal_moisPrecedent.png\" /></a></td>";
	strHtml+="<td colspan=\""+(numJourSemaineFinLigne-2)+"\">";
	strHtml+=strDate(new Date(annee,numMois-1,1,12),"MEA",langue,"complet");
	strHtml+="<td onclick=\"javascript:calendrierMensuel('"+idInput+"',"+anneeSuivante+","+numMoisSuivant+","+joursAnterieursNonClicables+","+numJourSemaineFinLigne+",'"+langue+"')\"><a href=\"javascript:void(0)\"><img src=\"cal_moisSuivant.png\" /></a></td>";
	strHtml+="</td>";
	strHtml+="</tr>";
	//entete
	strHtml+="<tr class=\"cal_entete\">";
	for(var i=4.5;i<numJourSemaineFinLigne+4.5;i++)strHtml+="<td>"+strDate(new Date(i*24*3600*1000),"S",langue,"superAbrege")+"</td>";
	strHtml+="</tr>";
	//jours
	strHtml+="<tr class=\"cal_jours\">";
	for(var i=0;i<tab.length;i++){
		t=tab[i];
		if(!t){//fin de ligne
			strHtml+="</tr><tr>";
			continue;
		}
		dateJour.setTime(t*1000);
		//joursAnterieursNonClicables
		if(joursAnterieursNonClicables && t*1000<midi().getTime()){
			classeJour="cal_joursAnterieursNonClicables";
			strHtml+="<td class=\""+classeJour+"\">"+dateJour.getDate()+"</td>";
		}
		else{
			//joursHorsMois
			if(dateJour.getMonth()+1!=numMois)classeJour="cal_joursHorsMois";
			//jour
			else if(dateEnCours.getTime()==t*1000)classeJour="cal_jour";
			//joursDansMois
			else classeJour="cal_joursDansMois";
			strHtml+="<td class=\""+classeJour+"\" onclick=\"document.getElementById('"+idInput+"').value='"+unixVersJma(t)+"';document.getElementById('"+idCal+"').style.visibility='hidden'\"><a href=\"javascript:void(0)\">"+dateJour.getDate()+"</a></td>";
		}
	}
	strHtml+="</tr></table>";
	objCal.innerHTML=strHtml;
	objCal.style.visibility="visible";
	document.body.onclick=function(e){
		if(!initCal)objCal.style.visibility="hidden";
		initCal=false;
	};
}
//------------------------------------------------------------

