//*************************************************************************************************
//* www.lomitko.com (c) Nicolas CARIS - le 15.10.2002
//* CALENDRIER DYNAMIQUE POUR FACILITER L'INSERTION DE DATES DANS UN FORMULAIRE
//*************************************************************************************************

// fonction principale
// cree et affiche le calendrier
// year, month : obvious
// idCal = id du <div> qui contiendra le calendrier
// idField = id du <input> qu'on veut remplir avec une date
function calendar(year, month, idCal, idField) {

	var today = new Date(); // pour marquer 'today' dans le calendrier

	// pour marquer selectedDate dans le calendrier
	var inputField = document.getElementById(idField);
	if (inputField.value) {
		var selectedDate = inputField.value.split("/");
		var selectedDay = selectedDate[0];
		var selectedMonth = selectedDate[1]-1;
		var selectedYear = selectedDate[2];
	}
	
	var daFirstDay = (new Date(year, month, 1)).getDay();
	if (daFirstDay == 0) daFirstDay = 7; // dimanche
	var daLastDay = (new Date(year, month+1 , 0)).getDate();
	
	var daTable = document.createElement("table");
	daTable.setAttribute("border", "0");
	daTable.setAttribute("cellPadding", "0");
	daTable.setAttribute("cellSpacing", "0");
	daTable.className = "calendar";

	

	var daCal = document.getElementById(idCal);
	if (daCal.firstChild) {
		daCal.replaceChild(daTable,daCal.firstChild);
	} else {
		daCal.appendChild(daTable);
	}
	
	var daTBody = document.createElement("tbody");
	daTable.appendChild(daTBody);

	// ligne contenant << Février 2002 >>
	printEnTete(daTBody, idCal, idField);

	// ligne contenant les jours (L M M J V S D)
	printDays(daTBody);
	
	// on calcule le nombre de cases necessaires	
	if (daFirstDay+daLastDay-1 == 28) nCases = 28;
	else if ((daFirstDay+daLastDay-1 > 28) && (daFirstDay+daLastDay-1 <= 35)) nCases = 35;
	else nCases = 42;
	
	i = 1;
	
	while (i <= nCases) {
		if ((i==1) || (i==8) || (i==15) || (i==22) || (i==29) || (i==36)) {
			var daRow = document.createElement("tr");
			daTBody.appendChild(daRow);
		}
	
		var daBox = document.createElement("td");
			
		if ((i < daFirstDay) || (i>=daFirstDay+daLastDay)) {

			daBox.className = "calendarDay";
			daRow.appendChild(daBox);
			var daText = document.createTextNode(" ");
			daBox.appendChild(daText);

		} else {
			j = i-daFirstDay+1;
		
			// si day = 'selectedDate'
			if ((year==selectedYear) && (month==selectedMonth) && (j==selectedDay)) {
				daBox.className = "calendarSelectedDate";
			// si day = 'today'
			} else if ((year==today.getFullYear()) && (month==today.getMonth()) && (j==today.getDate())) {
				daBox.className = "calendarToday";
			} else {
				daBox.className = "calendarDay";
			}
			
			daBox.setAttribute("align", "middle");
			daRow.appendChild(daBox);
			
			// on prepare la date choisie sous le format : 09/02/1972
			daChosenDay = j;
			daChosenMonth = activeMonth + 1;
			daChosenYear = activeYear;
			if (daChosenDay < 10) daChosenDay = "0" + daChosenDay;
			if (daChosenMonth < 10) daChosenMonth = "0" + daChosenMonth;
			var daChosenDate = daChosenDay + "/" + daChosenMonth + "/" + daChosenYear;
			
			var daLink = document.createElement("a");
			daLink.setAttribute("href", "javascript: dateToInput('" + daChosenDate + "', '" + idCal + "', '" + idField + "');");
			daLink.className = "calendar";
			daBox.appendChild(daLink);
			
			var daText = document.createTextNode(j);
			daLink.appendChild(daText);
		}
		i++;		
	}
	
	// Ligne pour enlever le Calendrier
	printCancel(daTBody, idCal);
}

// fonction appelee par calendar()
// cree et affiche la ligne L M M J V S D
function printDays(daTBody) {
	var jours = new Array('L', 'M', 'M', 'J', 'V', 'S', 'D');
	var daRow = document.createElement("tr");
	daTBody.appendChild(daRow);

	for (i=0; i<7; i++) {
		var daBox = document.createElement("td");
		daBox.className = "calendarWeekDay";
		daRow.appendChild(daBox);
		var daText = document.createTextNode(jours[i]);
		daBox.appendChild(daText);
	}
}

// fonction appelee par calendar()
// cree et affiche la ligne << Mars 2002 >>
function printEnTete(daTBody, idCal, idField) {
	var daRow = document.createElement("tr");
	daTBody.appendChild(daRow);
	
	var daBox = document.createElement("td");
	daBox.className = "calendarNav";
	daRow.appendChild(daBox);
	var daLink = document.createElement("a");
	daLink.className = "calendarNav";
	daLink.setAttribute("href", "javascript: previousMonth('" + idCal + "', '" + idField + "');");
	daBox.appendChild(daLink);
	var daText = document.createTextNode("<<");
	daLink.appendChild(daText);
	
	var daBox = document.createElement("td");
	daBox.className = "calendarTitle";
	daBox.setAttribute("colSpan", "5");
	daRow.appendChild(daBox);
	var months = new Array('Jan', 'Fév', 'Mar', 'Avr', 'Mai', 'Juin', 'Juil', 'Août', 'Sept', 'Oct', 'Nov', 'Déc');
	var daText = document.createTextNode(months[activeMonth]+" "+activeYear);
	daBox.appendChild(daText);
	
	var daBox = document.createElement("td");
	daBox.className = "calendarNav";
	daRow.appendChild(daBox);
	var daLink = document.createElement("a");
	daLink.className = "calendarNav";
	daLink.setAttribute("href", "javascript: nextMonth('" + idCal + "', '" + idField + "');");
	daBox.appendChild(daLink);
	var daText = document.createTextNode(">>");
	daLink.appendChild(daText);
}

// fonction appelee par calendar
// affiche la barre Annuler en bas du calendrier
function printCancel(daTBody, idCal) {
	var daRow = document.createElement("tr");
	daTBody.appendChild(daRow);
	var daBox = document.createElement("td");
	daBox.className = "calendarCancel";
	daBox.setAttribute("colSpan", "7");
	daRow.appendChild(daBox);
	var daLink = document.createElement("a");
	daLink.className = "calendar";
	daLink.setAttribute("href", "javascript: hideCalendar('" + idCal + "');");
	daBox.appendChild(daLink);
	var daText = document.createTextNode("Annuler");
	daLink.appendChild(daText);
}

var activeMonth;
var activeYear;

// fonction appelee par revealCalendar()
// appelle calendar() avec l'annee et le mois actuels
function initCalendar(idCal, idField) {
	var inputField = document.getElementById(idField);
	if (inputField.value) {
		var selectedDate = inputField.value.split("/");
		var selectedDay = selectedDate[0];
		var selectedMonth = selectedDate[1];
		var selectedYear = selectedDate[2];
	}
	if (selectedDay && selectedMonth && selectedYear) {
		activeYear = selectedYear;
		activeMonth = selectedMonth - 1; // janvier = 0;
	} else {
		var today = new Date();
		activeYear = today.getFullYear();
		activeMonth = today.getMonth();
	}
	calendar(activeYear, activeMonth, idCal, idField);
}

// fonction appelee lorsqu'on clique sur >>
// passe au mois suivant
function nextMonth(idCal, idField) {
	activeMonth++;
	if (activeMonth == 12) {
		activeMonth = 0;
		activeYear++;
	}
	calendar(activeYear, activeMonth, idCal, idField);
}

// fonction appelee lorsqu'on clique sur <<
// passe au mois precedent
function previousMonth(idCal, idField) {
	activeMonth--;
	if (activeMonth < 0) {
		activeMonth = 11;
		activeYear--;
	}
	calendar(activeYear, activeMonth, idCal, idField);
}

// function appelee lorsqu'on clique sur une date du calendrier
// remplit le champ input dont l'id est passe en parametre
function dateToInput(daChosenDate, idCal, idField) {
	daInputField = document.getElementById(idField);
	daInputField.value = daChosenDate;
	hideCalendar(idCal);
}

// fonction appelee lorsqu'on clique sur le bouton HTML
// lance initCalendar()
// seule fonction qui doit etre connue de l'exterieur
function revealCalendar(idCal, idField) {
	var daCal = document.getElementById(idCal);
	initCalendar(idCal, idField);
	daCal.style.visibility = "";
}

// fonction appelee lorsqu'on a entre une date ou lorsqu'on clique sur Annuler
// cache le calendrier
function hideCalendar(idCal) {
	var daCal = document.getElementById(idCal);
	daCal.style.visibility = "hidden";
}