
moisX=["","Janvier","Fevrier","Mars","Avril","Mai","Juin","Juillet","Aout","Septembre","Octobre","Novembre","Decembre"];
JourM=["Di","Lu","Ma","Me","Je","Ve","Sa"];

var select_old= null;

var startWeek = 1;//debut de la semaine 0=dim,1=lun,...
var jourPause = {0:true,6:true}; //jour de pause de la semaine
var jourFeriee = {"1-1":"jour an","1-5":"fête du travail","8-5":"armistice","14-7":"fête nationale","15-8":"ascencion","1-11":"armistice","11-11":"toussain","25-12":"noel"};

var dateS = strucDate(new Date());//date Selectionné
var dnow = strucDate(new Date());//date actuelle
var dateSel = null;

//structure la date
function strucDate(dateX)
{
	return {"pos":dateX.getDay(),"jour":dateX.getDate(),"mois":dateX.getMonth()+1,"annee":dateX.getFullYear()};
}

//retourne le ième jour du 1er du mois
function premJourMois(mois,annee)
{
	return (new Date(annee,mois-1,1).getDay());
}

//retourne le jour max du mois
function JmaxMois(mois,annee)
{
	return (new Date(annee,mois,0).getDate());
}

/* Test une date si elle est correct*/
function testTypeDate(dateEntree)
{
	tst=false;
	try
	{
		rc=dateEntree.split("/");
		nd=new Date(rc[2],(rc[1]-1),rc[0]);
		tst=(rc[2]>1800&&rc[2]<2200&&rc[2]==nd.getFullYear()&&rc[1]==(nd.getMonth()+1)&&rc[0]==nd.getDate());
	} catch(e) {}
	
	return tst;
}

//selection de la zone avec la souris
function choix(koi,code)
{
	if (code)
	{
		select_old = koi.className;
		koi.className += ' choix';
	}
	else
	{
		koi.className = koi.className.replace ('choix', '');
	}
}

function testTravail(oldX,xx,jj,mm,aa)
{
	classX="jSem";
	classX += (oldX)?"":" grisOld";
	classX += " jSem2";
	if (jourPause[xx]||jourFeriee[jj+"-"+mm]!=null) classX += " pause";
	if (jj==dnow.jour&&mm==dnow.mois&&aa==dnow.annee) classX += " now";
	if (dateSel&&jj==dateSel.jour&&mm==dateSel.mois&&aa==dateSel.annee) classX += " choix";
	
	return classX;
}

//test si année bissextile
function bissextile(annee) {
	return (annee%4==0 && annee %100!=0 || annee%400==0);
}

//Retourne le nombre de jour depuis le 1er janvier (num de semaine)
function nbJAnnee(dateX){
	var nb_mois=[,0,31,59,90,120,151,181,212,243,273,304,334];
	j=dateX.jour ; m=dateX.mois ; a=dateX.annee;
	nb=nb_mois[m]+j-1 ;
	if (bissextile(a) && m>2) nb++;
	return nb;
}

//affecte la valeur au input
function set_date_value( input_name, cal_name, val )
{
	var divCalendar = document.getElementById( cal_name );
	var objInput = document.getElementById( input_name );
	
	// on affecte la date selectionnée a la varible dateS
	var j = val.substr(0,2);
	var m = (val.substr(3,2)-1);
	var a = val.substr(6,4);
	var dt = new Date(a, m, j);
	dateSel = strucDate(dt);
	
	// on affecte la valeur au input
	objInput.value = val;
	// on masque le calendrier
	divCalendar.style.display = 'none';
}

function view_calendar( actif, cal_name, input_name, mxS, axS )
{	
	var divCalendar = document.getElementById( cal_name );
	var objInput = document.getElementById( input_name );
	
	if ( actif ) 
	{
		//decalage du mois si on clique sur -/+
		if (mxS!=-1)
		{
			objInput.focus();
			dateS.mois = mxS;
			dateS.annee = axS;
			if (dateS.mois<1) {dateS.annee--;dateS.mois+=12;}
			if (dateS.mois>12) {dateS.annee++;dateS.mois-=12;}
		}
		
		// initialisation des variables
		Dstart = (premJourMois(dateS.mois,dateS.annee)+7-startWeek)%7;
		jmaxi = JmaxMois(dateS.mois,dateS.annee);
		jmaxiAvant = JmaxMois((dateS.mois-1),dateS.annee);
		
		//si on veux ajouter le numero de la semaine ...
		//idxWeek = parseInt(nbJAnnee(strucDate(new Date(dateS.mois+'-01-'+dateS.annee)))/7,10)+1;
		
		ymaxi=parseInt((jmaxi+Dstart+1)/7,10);
		
		//generation du tableau
		//--entête
		html="<table class='calendar'>";
		html+="<tr class='nav'>";
		html+="<td class='pth' onclick=\"view_calendar(true,'"+cal_name+"','"+input_name+"',"+(dateS.mois)+","+(dateS.annee-1)+");\" colspan='2'><b><<<</b></td>";
		html+="<td colspan='3'> <b>"+dateS.annee+"</b></td>";
		html+="<td class='pth' onclick=\"view_calendar(true,'"+cal_name+"','"+input_name+"',"+(dateS.mois)+","+(dateS.annee+1)+")\" colspan='2'><b>>>></b></td>";
		html+="</tr>";
		
		html+="<tr class='nav'>";
		html+="<td class='pth' onclick=\"view_calendar(true,'"+cal_name+"','"+input_name+"',"+(dateS.mois-1)+","+dateS.annee+");\"><<</td>";
		html+="<td colspan='5'> <b> "+moisX[dateS.mois]+"</b></td>";
		html+="<td class='pth' onclick=\"view_calendar(true,'"+cal_name+"','"+input_name+"',"+(dateS.mois+1)+","+dateS.annee+")\">>></td>";
		html+="</tr>";
		//--corps
		html+="<tr>";
		//affichage des jours DLMMJVS
		for ( var x=0 ; x<7 ; x++ )
			html+="<td class='jSem'><b>"+JourM[(x+startWeek)%7]+"</b></td>";
		html+="</tr>"
		
		//------------------------
		for ( var y=0 ; y <= ymaxi ; y++ )
		{
			html+="<tr>";
			for ( var x=0 ; x < 7 ; x++ )
			{
				idxP = y*7 + x-Dstart + 1; //numero du jour
				aa = dateS.annee;
				xx = ( x + startWeek )%7;
				//jour du mois précedent
				if (idxP<=0)
				{
					jj = idxP + jmaxiAvant;
					mm = dateS.mois-1;
					if (mm == 0)
					{
						mm = 12;
						aa--;
					}
					html+="<td class='"+testTravail(false,xx,jj,mm,aa)+"' onmouseover='choix(this,true)' onmouseout='choix(this,false)' onclick=\"set_date_value('"+(objInput.id)+"', '"+ cal_name+"', '"+((jj<10)?"0":"")+jj+"/"+((mm<10)?"0":"")+mm+"/"+aa+"')\">"+jj+"</td>";
				}
				else if (idxP>jmaxi) //jour du mois suivant
				{
					jj = idxP - jmaxi;
					mm = dateS.mois + 1;
					if ( mm == 13 )
					{
						mm = 1;
						aa++;
					}
				
					html+="<td class='"+testTravail(false,xx,jj,mm,aa)+"' onmouseover='choix(this,true)' onmouseout='choix(this,false)' onclick=\"set_date_value('"+(objInput.id)+"', '"+ cal_name+"', '"+((jj<10)?"0":"")+jj+"/"+((mm<10)?"0":"")+mm+"/"+aa+"')\">"+jj+"</td>";
				}
				else //jour du mois en cours
				{
					jj=idxP;
					mm=dateS.mois;
					html+="<td class='"+testTravail(true,xx,jj,mm,aa)+"' onmouseover='choix(this,true)' onmouseout='choix(this,false)' onclick=\"set_date_value('"+(objInput.id)+"', '"+ cal_name+"', '"+((jj<10)?"0":"")+jj+"/"+((mm<10)?"0":"")+mm+"/"+aa+"')\">"+jj+"</td>";
				}
			}
			html+="</tr>"
		}//-------------------------
		html+="</table>"
		
		// insertion des données dans le calendrier
		divCalendar.innerHTML=html;		
		
		// positionnement du calendrier
		
		divCalendar.style.top = (getobj_top(objInput) + objInput.offsetHeight) + "px";
		divCalendar.style.left = (getobj_left(objInput)) + "px";
		
		// affichage du calendrier
		divCalendar.style.display = 'block';
	}
	else
	{
		divCalendar.style.display = 'none';
	}
}

function getobj_top(el) {
	var tmp = el.offsetTop;
	el = el.offsetParent
	while(el) {
		tmp += el.offsetTop;
		el = el.offsetParent;
	}
	return tmp;
}

function getobj_left(el) {
	var tmp = el.offsetLeft;
	el = el.offsetParent
	while(el) {
		tmp += el.offsetLeft;
		el = el.offsetParent;
	}
	return tmp;
}

function resetcalendar(objinput)
{
  var divCalendar = document.getElementById('calendarjs');
  divCalendar.style.display = "none";
  objinput.value = "";
  this.blur();
}
