//////////////////////////////////////////////////////////////////////
//							Calendrier								//
//////////////////////////////////////////////////////////////////////
// Utilisation : show(												//
//					Elément dans lequel la date doit être insérée,	//
//					Date de début (jj/mm/yyyy),						//
//					Date de fin (jj/mm/yyyy)						//
//				)													//
//////////////////////////////////////////////////////////////////////

// Affecte à currentMonth et currentYear le mois et l'année en cours

var currentDate = new Date();
var currentMonth = currentDate.getMonth() + 1;
var currentYear = currentDate.getFullYear();

// Affecte startDate en endDate les valeurs pas défaut de limite du calendrier

var startDate = new Date(0); // Correspond à l'année 1970 (par défaut)
var endDate = new Date(10000000000000); // Correspond à l'année 2286 (par défaut)

// Initialisation

var calendrier = null;
var iframe = null;

// Initialisation des variables usuelles

var element = null; // L'élément dans lequel la date sera insérée après choix de l'utilisateur

var months = ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin','Juillet', 'Aout', 'Septembre', 'Octobre', 'Novembre', 'Décembre'];

var days = ['Lun','Mar','Mer','Jeu','Ven','Sam','Dim'];

// Initialisation de la fonction d'initialisation

window.onload = init;

function init()
{
	// Initialisation du conteneur

	calendrier = document.createElement("div");
	calendrier.id = "calendrier";
	document.getElementsByTagName("body")[0].appendChild(calendrier);

	// Iframe listBoxBugFix

	iframe = document.createElement("iframe");
	iframe.id = "selectBugFix";
	calendrier.parentNode.appendChild(iframe);
	
}

// Simplification de la fonction document.getElementById

function getElementById(id)
{
	return document.getElementById(id);
}

// Fonctions récupérant les coordonnées de l'élément transmis

function getX(element)
{
	var tmp = element.offsetLeft;
	element = element.offsetParent;
	while(element)
	{
		tmp += element.offsetLeft;
		element = element.offsetParent;
	}
	return tmp;
}

function getY(element)
{
	var tmp = element.offsetTop;
	element = element.offsetParent
	while(element)
	{
		tmp += element.offsetTop;
		element = element.offsetParent;
	}
	return tmp;
}

// Initialisation du buffer de sortie

var output = '';


function outputClean()
{
	output = '';
}

function outputFlush()
{
	calendrier.innerHTML = output;
	outputClean();
}

function echo(t)
{
	output += t;
}

// Gabarit du calendrier

function templateMainAbove(t)
{
	return '<table class="tableau">'
		+ '<tr>'
		+ '<td class="head" onclick="previousMonth();">&lt;</td>'
		+ '<td colspan="5" class="head_title">' + t + '</td>'
		+ '<td class="head" onclick="nextMonth();">&gt;</td>'
		+ '<tr>';
}

function templateDayRow(t)
{
	return '<td class="day_list">' + t + '</td>';
}

function templateNewWeek()
{
	return '</tr><tr>';
}

function templateBlankCell(colspan)
{
	return '<td colspan="' + colspan + '"></td>';
}

function templateDay(d,m,y)
{
	var cDate = new Date(y,m,d); // Date courante
	if(cDate >= startDate && cDate <= endDate)
	{
		return '<td class="cell" onclick="whenClick('+d+','+m+','+y+')">'+d+'</td>';
	}
	else
	{
		return '<td class="cell_disabled">'+d+'</td>';
	}
}

function templateMainBelow()
{
	return '</tr>'
			+ '</tr>'
			+ '<tr>'
			+ '<td class="foot" onclick="hide();" colspan="7">[Fermer]</td>'
			+ '</tr>'
			+ '</table>';
}

// Fonction de dessin du calendrier

function draw(m,y)
{
	// Vide le buffer
	outputClean();
	
	// Début du tableau
	echo(templateMainAbove(months[m-1]+' '+y));
	
	// Liste des jours sous la forme Lun, Mar, ...
	for(var i=0;i<7;i++)
	{
		echo(templateDayRow(days[i]));
	}
	
	// Calcule le nombre de jour dans le mois
	var daysNumber = 0;
	if(m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12)
	{
		daysNumber = 31;
	}
	else if(m == 4 || m == 6 || m == 9 || m == 11)
	{
		daysNumber = 30;
	}
	else
	{
		daysNumber = (y % 4 == 0) ? 29 : 28;
	}
	
	// Calcule quel est le 1er jour du mois (lundi, mardi, ...) pour connaitre le colspan de la 1ère cellule
	var firstDay = new Date(y,m-1).getDay();
	firstDay = (firstDay == 0)?6:firstDay-1;
	
	// Première semaine
	echo(templateNewWeek());
	
	// Les numéros des jours du mois
	if(firstDay != 0)
	{
		echo(templateBlankCell(firstDay));
	}
	var firstLoop = true;
	var j = firstDay;
	for(var i=0;i<daysNumber;i++)
	{
		if(j == 0 && !firstLoop) // Si lundi est le permier jour du mois
		{
			echo(templateNewWeek()); // Nouvelle ligne
		}
		echo(templateDay(i+1,m,y)); // Cellule contenant le numéro du jour
		firstLoop = false; // Première boucle terminée
		// Jour suivant
		j++;
		j %= 7;
	}
	// Fin du tableau
	echo (templateMainBelow());
	
	// Affichage
	outputFlush();
}

// Fonction servant à initialiser la date de début et la date de fin

function initDate(sd,ed)
{
	if(typeof(sd) != 'undefined')
	{
		startDay = sd.substring(0,2);
		startMonth = sd.substring(3,5);
		startYear = sd.substring(6,10);
		startDate = new Date(startYear,startMonth,startDay);
	}
	if(typeof(ed) != 'undefined')
	{
		endDay = ed.substring(0,2);
		endMonth = ed.substring(3,5);
		endYear = ed.substring(6,10);
		endDate = new Date(endYear,endMonth,endDay);
	}
}

// Fonction servant à rendre le calendrier visible

function show(e,sd,ed)
{
	// Initialisation de la date de départ et de la date de fin
	initDate(sd,ed);
	// Element recevant la date séléctionnée
	element = e;
	// Si une date est déja choisie, alors on revient à celle-ci dans le calendrier
	if(e.value.length > 0)
	{
		currentMonth = e.value.substring(3,5);
		currentYear = e.value.substring(6,10);
		//alert(currentMonth + "/" + currentYear);
	}
	else
	{
		var currentDate = new Date();
		currentMonth = currentDate.getMonth() + 1;
		currentYear = currentDate.getFullYear();
	}
	// Affiche le calendrier
	draw(currentMonth,currentYear);
	// Pour changer la position du calendrier, il faut au préalable l'afficher
	calendrier.style.display = 'block';
	iframe.style.display = 'block';
	// Change la position du calendrier et de l'iframe correctrice de bug IE
	var left = getX(e);
	var top = getY(e) + e.offsetHeight;
	calendrier.style.left = left + 'px';
	calendrier.style.top = top + 'px';
	iframe.style.left = left + 'px';
	iframe.style.top = top + 'px';
	iframe.style.width = calendrier.offsetWidth + 'px';
	iframe.style.height = calendrier.offsetHeight + 'px';
}

// Fonction servant à rendre le calendrier invisible

function hide()
{
	calendrier.style.display = 'none';
	iframe.style.display = 'none';
}

// Fonction servant à passer au mois suivant

function nextMonth()
{
	if(++currentMonth > 12) // Si le mois courant est décembre
	{
		currentMonth = 1; // Le mois en cours devient janvier
		currentYear++; // L'année est incrémentée
	}
	// Redessine le calendrier
	draw(currentMonth,currentYear);
}

// Fonction servant à passer au mois précédant

function previousMonth()
{
	if(--currentMonth < 1) // Si le mois courant est janvier
	{
		currentMonth = 12; // Le mois en cours devient décembre
		currentYear--;
	}
	// Redessine le calendrier
	draw(currentMonth, currentYear);
}

// Fonction de formatage de la date

function formatDate(d,m,y)
{
	// Formatage du mois sur 2 chiffres
	m = '0' + m;
	m = m.substr(m.length-2);
	// Formatage du jour sur 2 chiffres
	d = '0' + d;
	d = d.substr(d.length-2);
	// Formattage de la date complète
	return d + '/' + m + '/' + y;
}

// Fonction évenementielle du click sur un jour du mois

function whenClick(d,m,y)
{
	hide(); // Cache le calendrier
	// Affectation par tous les moyens de l'élément
	if(typeof(element.value) != 'undefined')
	{
		element.value = formatDate(d,m,y);
	}
	else if(typeof(element.innerHTML) != 'undefined')
	{
		element.innerHTML = formatDate(d,m,y);
	}
	else
	{
		alert(formatDate(d, m, y));
	}
	document.getElementById("date").checked = "checked"
}

function testDateValide(saisie) {
if (saisie == "") return false;
saisie = (saisie).split("/");
if ((saisie.length != 3) || isNaN(parseInt(saisie[0])) || isNaN(parseInt(saisie[1])) || isNaN(parseInt(saisie[2]))) return false;
if ((saisie[0].length!=2) || (saisie[1].length!=2) || (saisie[2].length!=4)) return false;

var laDate = new Date(eval(saisie[2]),eval(saisie[1])-1,eval(saisie[0]));
var annee = laDate.getYear();
if ((Math.abs(annee)+"").length < 4) annee = annee + 1900;
return ((laDate.getDate() == eval(saisie[0])) && (laDate.getMonth() == eval(saisie[1])-1) && (annee == eval(saisie[2])));
}
