var calendar = new Calendar();
var today =  new Date();
today.setHours(0);
today.setMinutes(0);
today.setSeconds(0);
//-------------Constructeur de Calendar
function Calendar() {
	this.element = null;

	this.weekday = 0;
	this.day = 0;
	this.month = 0;
	this.year = 0;

	this.cday = 0;
	this.cmonth = 0;
	this.cyear = 0;
	this.cyear2 = 0;

	this.mappingArray = new Array();
	this.selectedCell = null;
	
	this.dm = null;
	this.dy = null;
	}
	
	
//-------------Initialisation de quelques variables
function initCalendar(date) {
	calendar.weekday = date.getDay();
	calendar.day = date.getDate();
	calendar.month = date.getMonth() + 1;
	calendar.year = date.getFullYear();

	calendar.cmonth = calendar.month;
	calendar.cyear = calendar.year;
	
	calendar.dm = document.getElementById("cal_m_00");
	calendar.dy = document.getElementById("cal_y_00");
	}


//-------------Initialisation de l'élément destiné à recevoir le résultat ( la date sélectionnée )
function initElement(id, evt) {
	if (!evt) {
		evt = window.event;
	}
	calendar.element = document.getElementById(id);
	calendar.element.value = null;
	}


//-------------Fonction appellée au chargement de la page qui lance l'affichage du calendrier
function displayCalendar(id, ev, date) {
	initElement(id, ev);
	if(date==null) initCalendar(new Date());
		else {
		initCalendar(new Date(date));
		}
	fillCalendar();
	checkRetArrows();
	}


//-------------Remplissage du tableau HTML pour en faire un calendrier
function fillCalendar() {
	//Ajout du titre avec le mois et l'année
	document.getElementById("cal_t").innerHTML = getStringMonth(calendar.cmonth)+' '+calendar.cyear;
	//On donne des valeurs par défaut à toutes les cases "jour"
	var element;
	var i = 0;
	var j = 0;
	for (i = 0; i < 6; i++) {
		for (j = 0; j < 7; j++) {
			element = document.getElementById("cal_d_" + i + j);
			element.className = "disabled";
			element.innerHTML = "";
			element.onclick = "";
			element.onmouseover = "";
			element.onmouseout = "";
			}
		}
	//Remplissage des cases correspondants aux jours
	i = 0;
	j = (new Date(calendar.cyear, calendar.cmonth-1, 1)).getDay();
	j = (j + 6) % 7;  //j correspond ici au décalage du premier jour
	var count = 1;
	var days = getMonthLastDay();  //days = nombre de jours du mois
	while (count <= days) {
		element = document.getElementById("cal_d_" + i + j);
		element.innerHTML = count;
		d = new Date(calendar.cyear, calendar.cmonth-1, count, 0, 0, 0);
		if(d.getTime()<=today.getTime()) {   //Si le jour est passé, il apparait grisé
			if(d.getDate() == today.getDate() && d.getMonth() == today.getMonth() && d.getFullYear() == today.getFullYear()) {element.className = "today";}
				else element.className = "passe" ;
			}
		else if(findDate(d)) {   //Si le jour correspond à une date de fermeture, il apparait comme tel et n'est pas selectionnable
			element.className = "fermeture";
			}	
		else{   //Le reste des jours est selectionnable et associé au tableau de mappage
			element.onclick = selectDay;
			element.onmouseover = highlightDay;
			element.onmouseout = unhighlightDay;
			calendar.mappingArray[10 * i + j] = count;
			//On indique le jour selectionné par l'utilisateur dans le cas oû il aurait parcouru plusieurs mois avant de revenir sur la date choisie
			if((element.id == calendar.selectedCell || count == calendar.day)&& calendar.cmonth == calendar.month && calendar.cyear == calendar.year){
				//Instructions a executer lors du premier affichage de la page avec la date et la formule qui arrivent en POST
				if(calendar.selectedCell==null) {
					calendar.selectedCell = element.id;
					var d = calendar.day;
					var m = calendar.month;
					var y = calendar.year;
					calendar.element.value = y +"/"+ (m < 10 ? "0" : "") + m +"/" + (d < 10 ? "0" : "") + d;
					}
				element.className = "selected";
				} else {
				element.className = "";
				}
			}
		j++;
		if (j == 7) {
			i++;
			j = 0;
			}
		count++;
		}
	}


//-------------Fonctions qui gèrent le surlignage des cases survolées
function highlightDay(evt) {
	var el = getEventElement(evt)
	if(el.className != "selected"){
		el.className = "sel";
		}
	}
function unhighlightDay(evt) {
	var el = getEventElement(evt);
	if(el.className != "selected"){
		el.className = "";
		}
	}
function highlightHead( id) {
	var element = document.getElementById(id);
	element.src = "image/c"+id+".gif";
	}
function unhighlightHead( id) {
	var element = document.getElementById(id);
	element.src = "image/"+id+".gif";
	}
	
	
//-------------Fonction appelée lors d'un clic de l'utilisateur sur un "jour" pour selectionner une date
function selectDay(evt) {
	var elem = getEventElement(evt);
	var id = elem.id;
	elem.className = "selected" ;
	//On récupère le n° du jour à l'aide du tableau de mappage
	calendar.cday = calendar.mappingArray[parseInt(id.substr(id.length - 2))];
	//On déselectionne la case précédemment sélectionnée si celle-ci se trouve sur la même page de calendrier
	if(calendar.selectedCell != null && calendar.month==calendar.cmonth && calendar.year==calendar.cyear){
		elem = document.getElementById(calendar.selectedCell);
		elem.className = "";
		}	
	calendar.selectedCell = id;
	calendar.month = calendar.cmonth;
	calendar.year = calendar.cyear;
	//On met à jour la valeur de l'input avec la nouvelle date selectionnée
	var d = calendar.cday;
	var m = calendar.cmonth;
	var y = calendar.cyear;
	calendar.element.value = y +"/"+ (m < 10 ? "0" : "") + m +"/" + (d < 10 ? "0" : "") + d;
	//On envoi le formulaire
	elem = document.getElementById("resacalendar");
	submitForm(elem);
	}


//-------------Envoi au mois suivant
function incrementMonth() {
	if (calendar.cmonth == 12) {
		calendar.cmonth = 1;
		calendar.cyear = calendar.cyear + 1;
		} else {
		calendar.cmonth = calendar.cmonth + 1;
		}
	checkRetArrows();
	fillCalendar();
	}
//-------------Envoi au mois précédent
function decrementMonth() {
	
	if (calendar.cmonth == 1) {
		calendar.cmonth = 12;
		calendar.cyear = calendar.cyear - 1;
		} else {
		calendar.cmonth = calendar.cmonth - 1;
		}
	checkRetArrows();	
	fillCalendar();
	}
//-------------Envoi à l'année suivante
function incrementYear() {
	calendar.cyear = calendar.cyear + 1;
	checkRetArrows();
	fillCalendar();
	}
//-------------Envoi a l'année précédente	
function decrementYear() {
	calendar.cyear = calendar.cyear - 1;
	checkRetArrows();
	fillCalendar();
	}
//-------------Envoi au mois courant
function actualDate() {
	calendar.cmonth = today.getMonth()+1;
	calendar.cyear = today.getFullYear();
	checkRetArrows();
	fillCalendar();
	}
	
	
//-------------Fonction qui vérifie si les fléches pour aller au mois ou à l'année précédente doivent être utilisables ou non 
function checkRetArrows() {
	tmonth = today.getMonth()+1;
	tyear = today.getFullYear();
	if((tmonth<calendar.cmonth && tyear==calendar.cyear) || (tyear<calendar.cyear)) {
		calendar.dm.onclick = decrementMonth;
		//alert('recul mois actif');
		//calendar.dm.onmouseover = "highlightHead('mleft_arrow')";
		} else { 
		calendar.dm.onclick = "";
		//calendar.dm.onmouseover = "";
		}		
	if((calendar.cyear-tyear>1) || (calendar.cyear-tyear==1 && tmonth<=calendar.cmonth)) {
		calendar.dy.onclick = decrementYear;
		//calendar.dy.onmouseover = "highlightHead('yleft_arrow')";
		} else {
		calendar.dy.onclick = "";
		//calendar.dy.onmouseover = "";	
		}
	}
	

//-------------Fonction qui retourne le nbre de jours d'un mois donné
function getMonthLastDay() {
	var testDate = new Date(calendar.cyear, calendar.cmonth-1, 29);
	if (testDate.getDate() == 29) {
		testDate.setDate(30);
		if (testDate.getDate() == 30) {
			testDate.setDate(31);
			if (testDate.getDate() == 31) {
				return 31
				} else {
				return 30;
				}
			} else {
			return 29;
			}
		} else {
		return 28;
		}
	}


//-------------Fonction qui permet de rechercher si une date appartient au tableau des dates de fermeture 
function findDate(d) {
	for(i=0; i<ferm_list.length; i++) {		
		if(ferm_list[i].getDate()==d.getDate() && ferm_list[i].getMonth()==d.getMonth() && ferm_list[i].getYear()==d.getYear()) {
			return true;
			}
		}
	return false;
	}


//-------------Retourne le nom du jour de la semaine à partir de son n°
function getStringWeekDay(index) {
	return dayInWeek[index];
	}
//-------------Retourne le nom du mois à partir de son n°
function getStringMonth(index) {
	return monthInYear[index - 1];
	}
	
	
//-------------Fonction qui renvoi l'élément à l'origine d'un évenement
function getEventElement(evt) {
	if ((!evt) || (document.all)) {
		return window.event.srcElement;
		} else {
		return evt.target;
		}
	}

function submitForm(f) {
	if(f.date.value!="null" && f.date.value!="") {
		f.submit();
		}
		else {
		var elem = document.getElementById('helpstr');
		elem.innerHTML = "<img src='image/choisir_date_FR.gif' />";
		}
	return;
	}
