var MONTH_LIST = new Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre");var DAY_LIST = new Array("Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim");
/* Instance du calendrier (unique puisqu'un seul affiché à la fois). */
var calendar = new Calendar();
/* Constructeur de la classe Celendar pour gérer le calendrier A remodifier au besoin */function Calendar() {

    this.elementId = "";
    this.element = null;

    //this.weekday = 0;
    this.day = 0;
    this.month = 0;
    this.year = 0;

    this.cday = 0;
    this.cal_month = 0;
    this.cal_year = 0;
    this.cyear2 = 0;

   // this.mappingArray = new Array();

    this.cal = document.getElementById("cal");
	/*
    this.cald = document.getElementById("cald");
    this.calm = document.getElementById("calm");
    this.caly = document.getElementById("caly");
	*/
}
/* Fonction appelée par le document HTML Tout est lancé de là et va permettre de retourner la date voulu dans le calendrier ainsi générer */function affiche_cal(id_champ,event){
    if (insertion_calendrier()) {		document.addEventListener("click",clic_ailleurs,false);
        calendar = new Calendar();
        var element;
        initElement(id_champ, event);
        var dateValue = calendar.element.value;
        var validDate = false;
        if (dateValue != "") {
            var s = dateValue.split("/");
            var d;
            var m;
            var y;
            if (s.length == 3) {
                d = s[0];
                m = s[1];
                y = s[2];
                if (!isNaN(d) && !isNaN(m) && !isNaN(y)) {
                    var m2 = parseNumber(m);
                    if (m2 >= 1 && m2 <= 12) {
                        validDate = true;
                        var y2 = parseNumber(y);
                        if (y2 < 100) {
                            y2 += 2000;
                        }
                        var d2 = parseNumber(d);
                        var testDate = new Date(y2, m2 - 1, 1);
                        if (d2 >= 1 && d2 <= getMaxMonthLastDay(testDate)) {
                            initCalendar(new Date(y2, m2 - 1, d2));
                        } else {
                            initCalendar(new Date(y2, m2 - 1, 1));
                        }
                    }
                }
            }
        }
        if (!validDate) {
            initCalendar(new Date());
        }
        fillCalendar();
        showCalendar();
	}
}
/* Fonction qui Créer les Div du calendrier en entier */function insertion_calendrier(){
    var calendarDiv = document.getElementById("calendar");
    var calendarInserted = (calendarDiv != null);
    if (calendarInserted ) {
        // Le calendrier est inséré dans le div d'id "calendar".
        if (document.getElementById("cal") == null) {
            addMainDiv(calendarDiv);
        }
    }
    return calendarInserted;
}
/* Fonction qui construit la div général */function addMainDiv(calendarDiv) {
	
	var i,j;

	var calDiv = document.createElement("DIV");
    calDiv.id = "cal";
	
	var table = document.createElement("TABLE");
	table.id='titre';
   
	var row = table.insertRow(0);
	
	//BOUTON GAUCHE 
	var cell = row.insertCell(0);
    cell.id = "cal_m_moins";	cell.className = "cal_m_moins";
    cell.onclick = decrementMonth;
	cell.onmouseover=headButtonOver;
	cell.onmouseout=headButtonOut;
    cell.appendChild(getImg("img/calendar/fleche_gauche.png"));
	
	//MENU DEROULANT DU MOIS
	cell = row.insertCell(1);
    cell.id = "cell_select_mois";
    cell.appendChild(getSelectMois());
	cell.firstChild.onchange=changeMonth;
	
	//MENU DEROULANT DE l'ANNEE
	cell = row.insertCell(2);
    cell.id = "cell_select_annee";
    cell.appendChild(getSelectAnnee());
	cell.firstChild.onchange=changeYear;
	
	//BOUTON Droit 
	var cell = row.insertCell(3);
    cell.id = "cal_m_plus";	cell.className = "cal_m_plus";
    cell.onclick = incrementMonth;
	cell.onmouseover=headButtonOver;
	cell.onmouseout=headButtonOut;
    cell.appendChild(getImg("img/calendar/fleche_droite.png"));	
	
    calDiv.appendChild(table);
	
	table = document.createElement("TABLE");
	
	/*Insertion de la liste des jours */
	var row = table.insertRow(0);
    for (i = 0; i < 7; i++) {
        cell = row.insertCell(i);
		cell.innerHTML = DAY_LIST[i];
	}
		
	/*insertion de jours*/
	var i;
	var j;
    for (i = 0; i < 6; i++) {
        row = table.insertRow(i + 1);
        for (j = 0; j < 7; j++) {
            cell = row.insertCell(j);
            cell.id = "cal_d_" + i + j;
        }
    }
	
    calDiv.appendChild(table);
    calendarDiv.appendChild(calDiv);
	
}
/* Ecouteur qui va fermer le calendrier si on clic ailleurs */function clic_ailleurs(evt){
	var element=getEventElement(evt);		// de base on cherche à garder le calendrier affiché	var trouve=true;		if(calendar.element.id!=element.id){		// Boolean qui dit si on a trouvé le calendrier dans le père de l'element		trouve=recherche_cal(element);	}		if(!trouve){		hideCalendar();	}
}/*fonction qui recherche l'element dont l'id est cal dans le domon cherche a savoir si l'element ou un de ses pères a l'id calsi c'est le cas c'est que le clic se situe dans le calendrier*/function recherche_cal(el){	if(el.id=="cal"){		return true;	}else{ // l'element en question n'est pas dans le calendrier on va chercher si ce n'est pas le cas pour un de ses pères		if(el.parentNode){ // On vérifie si l'element a un père			//alert("le pere est "+el.parentNode);			return recherche_cal(el.parentNode);		}else{			return false;		}	}}
/* Positionne le calendrier en fonction du champ texte */function initElement(id, evt) {
    if (!evt) {
        evt = window.event;
    }
    calendar.elementId = "";
    calendar.element = document.getElementById(id);
/*
    var hGap = -92;
    var vGap = 12;
    var elementStyle = calendar.cal.style;
    var clientX = evt.clientX;
    var clientY = evt.clientY;
    var rightedge = document.body.clientWidth - clientX - hGap;
    var bottomedge = document.body.clientHeight - clientY - vGap;
    if (rightedge < calendar.cal.offsetWidth) {
        elementStyle.left = document.body.scrollLeft + clientX - hGap - calendar.cal.offsetWidth;
    } else {
        elementStyle.left = document.body.scrollLeft + clientX + hGap;
    }
    if (bottomedge < calendar.cal.offsetHeight) {
        elementStyle.top = document.body.scrollTop + clientY - vGap - calendar.cal.offsetHeight;
    } else {
        elementStyle.top = document.body.scrollTop + clientY + vGap;
    }

    calendar.calm.style.left = parseInt(elementStyle.left) + 5;
    calendar.calm.style.top = parseInt(elementStyle.top) + 28;
    calendar.caly.style.left = parseInt(elementStyle.left) + 12;
    calendar.caly.style.top = parseInt(elementStyle.top) + 33;
	*/
}/*
* fonction qui initialise le calendrier en fonction de la date (si aucune date n'est dans le champ texte)
*/function initCalendar(date) {
    calendar.weekday = date.getDay();
    calendar.day = date.getDate();
    calendar.month = date.getMonth() + 1;
    calendar.year = date.getFullYear();
	
    calendar.cal_month = calendar.month;
    calendar.cal_year = calendar.year;
}
/* Change le mois du calendrier en +1 */function incrementMonth() {
    if (calendar.cal_month == 12) {
        calendar.cal_month = 1;
        calendar.cal_year = calendar.cal_year + 1;
    } else {
        calendar.cal_month = calendar.cal_month + 1;
    }
    fillCalendar();
}
/**
 * Change le mois du calendrier en -1
 */function decrementMonth() {
    if (calendar.cal_month == 1) {
        calendar.cal_month = 12;
        calendar.cal_year = calendar.cal_year - 1;
    } else {
        calendar.cal_month = calendar.cal_month - 1;
    }
    fillCalendar();
}
/**
 * Retourne un élément image à insérer dans le calendrier.
 */function getImg(src) {
    var img = document.createElement("IMG");
    img.src = src;
    //img.className = "but";
    img.width = "16";
    img.height = "16";
    return img;
}
/**
 * Retourne un élément Select des mois à insérer dans le calendrier
 */function getSelectMois(){
	var select = document.createElement("SELECT");
	select.id="select_mois";
	for(var i=0;i<MONTH_LIST.length;i++){
		var opt = document.createElement("option" );
		opt.innerHTML=MONTH_LIST[i];
		opt.setAttribute("value",i+1);
		select.appendChild(opt);
	}
    return select;
 }
/**
 * Retourne un élément Select des année à insérer dans le calendrier
 */function getSelectAnnee(){
	var select = document.createElement("SELECT");
	var annee=new Date();
	annee=annee.getFullYear();
	select.id="select_annee";
	for(var i=(annee-10);i<(annee+10);i++){
		var opt = document.createElement("option" );
		opt.innerHTML=i;
		opt.setAttribute("value",i);
		select.appendChild(opt);
	}
    return select;
 }
function changeMonth(){
	calendar.cal_month = this.options[this.selectedIndex].value;
    fillCalendar();
 }
function changeYear(){
	calendar.cal_year = this.options[this.selectedIndex].value;
    fillCalendar();
 }
function getMonthLastDay() {
    var testDate = new Date(calendar.cal_year, calendar.cal_month - 1, 29);
    return getMaxMonthLastDay(testDate);
}
function getMaxMonthLastDay(date) {
    if (date.getDate() == 29) {
        date.setDate(30);
        if (date.getDate() == 30) {
            date.setDate(31);
            if (date.getDate() == 31) {
                return 31
            } else {
                return 30;
            }
        } else {
            return 29;
        }
    } else {
        return 28;
    }
}
function fillCalendar(){

	var element, i, j;
	
	element=document.getElementById("select_mois");	
	element.options[calendar.cal_month-1].selected="true";
	
	element=document.getElementById("select_annee");
	for(i=0;i<element.length;i++){
		if(element.options[i].value==calendar.cal_year){
			element.options[i].selected="true";
		}
	}
	
	for (i = 0; i < 6; i++) {
        for (j = 0; j < 7; j++) {
            element = document.getElementById("cal_d_" + i + j);
            element.innerHTML = "";
            element.onclick = "";
            element.onmouseover = "";
            element.onmouseout = "";
            element.className = "";
        }
    }
	
	
	i = 0;
    j = (new Date(calendar.cal_year, calendar.cal_month-1, 1)).getDay();
    j = (j + 6) % 7;
    var count = 1;
    var days = getMonthLastDay();
    while (count <= days) {
        element = document.getElementById("cal_d_" + i + j);
        element.innerHTML = count;
        element.onclick = selectDay;
        element.onmouseover = highlightDay;
        element.onmouseout = unhighlightDay;
        element.className = "cell_jour";
        
        j++;
        if (j == 7) {
            i++;
            j = 0;
        }
        count++;
    }
}
function highlightDay(evt) {
    var element = getEventElement(evt);
    element.className = "cell_jour_sel";
}
function unhighlightDay(evt) {
    var element = getEventElement(evt);
    element.className ="cell_jour";
}
function headButtonOver(evt){
	var element = getEventElement(evt);	//alert(element);		if (element.tagName == "IMG") {        element = element.parentNode;    }		//alert(element);
    element.className ="cal_head_sel";
}
function headButtonOut(evt){
	var element = getEventElement(evt);		if (element.tagName == "IMG") {        element = element.parentNode;    }
    element.className ="";
}
/* Affiche la div du clendrier*/function showCalendar() {
    calendar.cal.style.display = "";
}
/* Cache la div du clendrier*/function hideCalendar() {
    calendar.cal.style.display = "none";
}
function parseNumber(n) {
    while (n != "" && n.substring(0, 1) == "0") {
        n = n.substring(1);
    }
    return parseInt(n);
}
function selectDay(evt) {
    var id = getEventElement(evt).id;
	calendar.cday=document.getElementById(id).innerHTML;
	hideCalendar();
	var d = calendar.cday;
    var m = calendar.cal_month;
    var y = calendar.cal_year;
    window.status = d + " - " + m + " - " + y;
    calendar.element.value = (d < 10 ? "0" : "") + d + "/" + (m < 10 ? "0" : "") + m + "/" + y;
}
function getEventElement(evt) {
    if (!evt) {
        return window.event.srcElement;
    } else {
        return evt.target;
    }
}
