/*
	On affiche un calendrier quand on clique sur les liens des formulaires
*/
function calendarShow(argName, argYear, argMonth, argDay) {
	/*
		On va construire le calendrier en fonction des dates données.
		L'ordre de priorité est : 
		Parametres de al fonction > champs du formulaire > date du jour.
		C'est à dire qu'on prends par défaut les parametres de la fonction s'ils sont donnés.
		Sinon on prends les champs du formulaire.
		S'il n'y a rien on prends la date du jour par défaut
	*/
	//On masque les <select> car ie les passe au premier plan
	hideSelectElements();
	//On choppe les 3 parties du formulaire
	var formName;
	//Si on passe un élément
	if (document.getElementById(argName)) formName = argName.substring(9);
	else formName = this.id.substring(9); //on trouve le nom de la date à partir de l'id du lien (calendar_truc)
	
	var formDay, formMonth, formYear;
	formDay = document.getElementById(formName+"_day");
	formMonth = document.getElementById(formName+"_month");
	formYear = document.getElementById(formName+"_year");
	
	//On a besoin d'aujourd'hui
	var dateNow = new Date();
	
	//On prends les valeurs des mois/jour/année
	var year, month, day;
	//Jour
	if (argDay) day = argDay;
	else if (formDay.value) day = formDay.value;
		else day = dateNow.getDate();
	day = day*1;
	//Mois
	if (argMonth) month = argMonth;
	else if (formMonth.value) month = formMonth.value-1;
		else month = dateNow.getMonth();
	month = month*1;
	//Année
	if (argYear) year = argYear;
	else if (formYear.value) year = formYear.value;
		else year = dateNow.getRealYear();
	year = year*1;
	
		
	
	//Si le calendrier existe déjà on le dégage
	var testCalendar = document.getElementById("calendar");
	if (testCalendar) testCalendar.parentNode.removeChild(testCalendar);
	//On crée un élément calendrier
	var calendar = document.createElement("div");
	calendar.setAttribute("id", "calendar");
	//Le tableau des mois de l'année
	var arrMois = new Array("janvier", "février", "mars", "avril", "mai", "juin", "juillet", "aout", "septembre", "octobre", "novembre", "décembre");
	//Le tableau des jours de la semaine
	var arrJours = new Array("Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim");
	
	/******** On mets déjà un bouton de fermeture ***********/
	var close = document.createElement("a");
	close.href = "#";
	close.setAttribute("class", "close");
	close.setAttribute("className", "close");
	close.innerHTML = "Fermer [X]";
	close.onclick = function() {
		calendar.parentNode.removeChild(calendar);
		showSelectElements()
		return false;
	}
	calendar.appendChild(close);
	
	/******* On indique des liens vers les mois et années précédents ******/
	var divPrevious = document.createElement("div");
	divPrevious.setAttribute("class", "previous");
	divPrevious.setAttribute("className", "previous");
	//Année passée
	var previousYear = document.createElement("a");
	previousYear.href="#";
	previousYear.innerHTML = "<< "+(year-1);
	previousYear.onclick = function() {
		return calendarShow("calendar_"+formName, year-1, month);
	}
	//Mois passé
	var previousMonth = document.createElement("a");
	previousMonth.href="#";
	//On prends le mois d'avant, attention si on change d'année
	var nbrPreviousMonth;
	var nbrPreviousYear = year;
	nbrPreviousMonth = ""+month-1+""; //Si 0 il considere que pas défini, donc on passe en string
	if (nbrPreviousMonth==-1) {
		nbrPreviousMonth = 11;
		nbrPreviousYear = year - 1;
	}
	previousMonth.innerHTML = "<< "+arrMois[nbrPreviousMonth];
	previousMonth.onclick = function() {
		return calendarShow("calendar_"+formName, nbrPreviousYear, nbrPreviousMonth);		
	}
	
	var divNext = document.createElement("div");
	divNext.setAttribute("class", "next");
	divNext.setAttribute("className", "next");
	//Année suivante
	var nextYear = document.createElement("a");
	nextYear.href="#";
	nextYear.innerHTML = (year+1)+" >>";
	nextYear.onclick = function() {
		return calendarShow("calendar_"+formName, year+1, month);
	}
	//Mois suivant
	var nextMonth = document.createElement("a");
	nextMonth.href="#";
	//On prends le mois d'avant, attention si on change d'année
	var nbrNextMonth;
	var nbrNextYear = year;
	nbrNextMonth = month+1; 
	if (nbrNextMonth==12) {
		nbrNextMonth = "0";
		nbrNextYear = year + 1;
	}
	nextMonth.innerHTML = arrMois[nbrNextMonth]+" >>";
	nextMonth.onclick = function() {
		return calendarShow("calendar_"+formName, nbrNextYear, nbrNextMonth);
	}
	
	//On ajoute les deux liens précedents à gauche
	divPrevious.appendChild(previousYear);
	divPrevious.appendChild(previousMonth);
	//On ajoute les deux liens suivants à droite
	divNext.appendChild(nextYear);
	divNext.appendChild(nextMonth);
	//On ajoute le bloc de gauche et de droite dans le calendar
	calendar.appendChild(divPrevious);
	calendar.appendChild(divNext);
	
	/******* On indique dans quel mois on se trouve *******/
	var divMois = document.createElement("div");
	divMois.setAttribute("class", "date");
	divMois.setAttribute("classeName", "date");
	divMois.innerHTML = arrMois[month]+" "+year;
	calendar.appendChild(divMois);
	
	/********* On ajoute un clear_both entre els deux *****/
	var clear = document.createElement("div");
	clear.setAttribute("class", "clear_both");
	clear.setAttribute("className", "clear_both");
	clear.style.marginBottom = "10px";
	calendar.appendChild(clear);
	
	/******* On ajoute les entetes des jours ***********/
	var ulJours = document.createElement("ul");
	ulJours.setAttribute("class", "jours");
	
	var liJour;
	for (var i =0; i!=arrJours.length;i++) {
		liJour = document.createElement("li");
		liJour.innerHTML = arrJours[i];
		ulJours.appendChild(liJour);		
	}
	calendar.appendChild(ulJours);
	
	
	/******** On ajout la premiere ligne *******/
	//Premier jour du mois
	var dateFirstDay = new Date();
	dateFirstDay.setYear(year);
	dateFirstDay.setMonth(month);
	dateFirstDay.setDate(1);
	//On trouve le combien dans la semaine c'est (c'est compté en anglais : 0= Dimanche, 6 = Samedi), on convertit en francais (0 = Lundi, 6 = Dimanche)
	var firstDay = dateFirstDay.getDay()-1;
	if (firstDay == -1) firstDay = 6;

	//On va ensuite mettre des cases vides du début jusqu'au premier jour
	ulJours = document.createElement("ul");
	for (var i =0; i!=firstDay;i++) {
		liJour = document.createElement("li");
		liJour.innerHTML = "_";
		liJour.setAttribute("class", "lastMonth");
		liJour.setAttribute("className", "lastMonth");
		ulJours.appendChild(liJour);
	}
	//On mets ensuite le début jusqu'à la fin de la semaine
	for (var i = firstDay; i!=7;i++) {
		liJour = document.createElement("li");
		calendarFillDay(liJour, (i-firstDay+1))
		ulJours.appendChild(liJour);
	}
	//Pas la peine de mettre une ligne complétement vide si le mois commence un lundi
	calendar.appendChild(ulJours);
	
	/******** On ajoute ensuite les lignes suivantes **********/
	//La premiere semaine complete commence le ?
	var beginDay = 7 - firstDay +1 ;
	//Combien de jours dans le mois?
	var nbrDaysInMonth = dateNow.getNbrDaysInMonth();
	//Donc combien de semaines completes?
	var nbrWeeks = Math.floor( (nbrDaysInMonth-beginDay+1) / 7);
	var weekStarts, weekEnds;
	//Pour chaque semaine
	for (var j = 0; j!=nbrWeeks; j++) {
		weekStarts = (j*7) + beginDay;
		weekEnds = weekStarts +7;		
		ulJours = document.createElement("ul");
		//On mets 7 jours
		for (var i = weekStarts; i != weekEnds; i++) {
			liJour = document.createElement("li");
			calendarFillDay(liJour,i);
			ulJours.appendChild(liJour);			
		}
		calendar.appendChild(ulJours);
	}
	
	/********* On termine par la dernière ligne ***********/
	//La dernière semaine commence le ?
	var startOfLastWeek = i;
	//Combien de jour encore dans le mois ?
	var nbrDaysLeftInMonth = (nbrDaysInMonth-beginDay+1) % 7;
	ulJours = document.createElement("ul");
	//On va mettre les derniers jours
	for (var i = 0; i!=nbrDaysLeftInMonth; i++) {
		liJour = document.createElement("li");
		calendarFillDay(liJour, startOfLastWeek+i);
		ulJours.appendChild(liJour);
	}
	//On comble le reste avec les jours du mois suivant en grisés
	for (var i = 1; i != (7-nbrDaysLeftInMonth+1); i++) {
		liJour = document.createElement("li");
		liJour.innerHTML = i;
		liJour.setAttribute("class", "nextMonth");
		liJour.setAttribute("className", "nextMonth");
		ulJours.appendChild(liJour);
	}
	calendar.appendChild(ulJours);
	
	
	
	
	
	//On l'affiche à coté du lien
	getElementsBySelector("#conteneur")[0].appendChild(calendar);
	var calendarLink = document.getElementById("calendar_"+formName);
	calendar.style.top = (getY(calendarLink)-45)+"px";
	calendar.style.left = getX(calendarLink)+"px";
	calendar.style.display = "block";
	
	/*
		On remplit une case du tableau avec un lien portant le numero du jour dans le mois et ajoutant la date dans les champs
		On mets la fonction dans le scope de l'autre pour avoir accès à year et month
	*/
	function calendarFillDay(obj, txt) {
		//On mets un lien dedans
		var a = document.createElement("a");
		//Faux lien, juste pour permettre le :hover
		a.href = "#";
		//Le titre
		a.innerHTML = txt;
		a.title = txt;
		//Si c'est aujourd'hui, on mets en couleur
		if (dateNow.getDate()==txt && dateNow.getRealYear()==year && dateNow.getMonth()==month) {
			obj.setAttribute("class", "today");
			obj.setAttribute("className", "today");			
		}
		//On remplis les champs quand on clic dessus
		obj.onclick = calendarPutInFields
		obj.appendChild(a);
	}
	
	/*
		On remplis les champs quand on clic sur un des liens
	*/
	function calendarPutInFields() {
		//On rempli le jour
		document.getElementById(formName+"_day").value = this.firstChild.innerHTML;
		//Le mois
		document.getElementById(formName+"_month")[month+1].selected = "selected";
		//L'année
		document.getElementById(formName+"_year").value = year;
		//On ferme tout ca
		document.getElementById("calendar").style.display = "none";
		//On affiche de nouveau les <select>
		showSelectElements()
		return false;		
	}
	
	return false;
}




