function Calendrier(d_act, fct_date, id_pos, an_min, an_max, inst) { //Privées (locales) var t_noms_mois= new Array( 'janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'); var liste_mois= document.createElement("select"); liste_mois.setAttribute("style", "width: 80px"); var liste_ans= document.createElement("select"); liste_ans.setAttribute("style", "width:50px"); var d_aff= new Date(d_act.getFullYear(), d_act.getMonth(), d_act.getDate()); //Le tableau contient cette date var tableau= document.createElement("table"); var tbody= document.createElement("tbody"); //Nécessaire pour IE var thead = document.createElement("thead"); thead.style.height = "0px"; var tfoot = document.createElement("tfoot"); tfoot.style.height = "0px"; tableau.appendChild(tbody); var t_lignes= new Array(6); /////Fonctions publiques /**** Fonctions de commande *****/ this.Ferme= function() { d_aff= new Date(d_act.getFullYear(), d_act.getMonth(), d_act.getDate()); tableau.style.visibility= 'hidden'; } this.Valide= function(j) { var d= d_aff; var t; d.setDate(j); t= d.getTime(); tableau.style.visibility= 'hidden'; eval(fct_date+"('"+t+"')"); } this.SelMois= function() { d_aff.setMonth(liste_mois.selectedIndex); this.AfficheCalendrier(); } this.MoisPrecedent= function() { var mois, annee, d= d_aff; mois= d.getMonth() annee= d.getFullYear(); mois--; if (mois < 0) { mois= 11; annee--; } if (annee < an_min) {alert("Année invalide");return;} d.setYear(annee); d.setMonth(mois); d_aff= d; this.AfficheCalendrier(); } this.MoisSuivant= function() { var mois, annee, d= d_aff; mois= d.getMonth() annee= d.getFullYear(); mois++; if (mois > 11) { mois= 0; annee++; } if (annee > an_max) {alert("Année invalide");return;} d.setYear(annee); d.setMonth(mois); d_aff= d; this.AfficheCalendrier(); } this.SelAn= function() { id= liste_ans.selectedIndex; d_aff.setYear(liste_ans.options[id].value); this.AfficheCalendrier(); } this.AnPrecedent= function() { var annee, d= d_aff; annee= d.getFullYear() - 1; if (annee < an_min) {alert("Année invalide");return;} d.setYear(annee); d_aff= d; this.AfficheCalendrier(); } this.AnSuivant= function() { var annee, d= d_aff; annee= d.getFullYear() + 1; if (annee > an_max) {alert("Année invalide");return;} d.setYear(annee); d_aff= d; this.AfficheCalendrier(); } this.AfficheCalendrier= function() { //Calcul des nombres de jours var j_act, m_act, a_act, j_cur, m_cur, a_cur, m_aff, a_aff; var fl_act, fl_cur; var n_sem, njv, njm; //Date initiale j_act= d_act.getDate(); m_act= d_act.getMonth() a_act= d_act.getFullYear(); if (a_act < an_min || a_act > an_max) {alert("Année invalide");return;} //Date courante d_cur= new Date(); j_cur= d_cur.getDate(); m_cur= d_cur.getMonth() a_cur= d_cur.getFullYear(); //Date affichée m_aff= d_aff.getMonth() a_aff= d_aff.getFullYear(); //Pour affichage de jours particuliers' fl_act= (a_act == a_aff) && (m_act == m_aff); fl_cur= (a_cur == a_aff) && (m_cur == m_aff); //Calcul de la position des jours dans le mois d_aff.setDate(1); //1° jour du mois affiché njv= (d_aff.getDay()-1 + 7)%7; //Décalage 1°cellule tableau calendrier //Nombre de jours de ce mois pour années de 1901 à 2099 if (m_aff == 1) njm= (a_aff % 4 == 0) ? 29 : 28; else if (m_aff==3 || m_aff==5 || m_aff==8 || m_aff==10) njm= 30; else njm= 31; //Calcul du numéro de semaine en début de mois affiché var t= Math.floor(d_aff.getTime()/86400000); //Jours depuis 1/1/1970 0:0:0 var d= new Date(a_aff, 0, 4); //4 janvier année affichée : semaine 1; n_sem= Math.floor((d_aff.getTime()-d)/86400000)-1; //Nbre de de jours depuis ce 4 janvier n_sem= Math.floor((n_sem+3)/7)+1; //N° de semaines en début de mois //Affichage tableau.style.visibility= 'visible'; //Ligne de titre liste_mois.options[m_aff].selected= true; for (var a=0; a < liste_ans.length; a++) { if (liste_ans.options[a].value == a_aff) liste_ans.options[a].selected= true; } //Contenu var l, c, cel; var j= 1-njv; for (l= 0; l < t_lignes.length; l++) { cel= t_lignes[l].firstChild; cel.firstChild.data= n_sem != 0 ? n_sem : " "; //N° semaine n_sem++; cel= cel.nextSibling; for (c= 0; c < 7; c++) { // Jours if (j > 0 && j <= njm) { //Jours du mois if (fl_cur && fl_act && j == j_cur && j == j_act) cel.setAttribute("style", "border: 2px solid red; color: #ff0000;"); else if (fl_act && j == j_act) cel.setAttribute("style", "border: 2px solid red;"); //Aujourd'hui' else if (fl_cur && j == j_cur) cel.setAttribute("style", "color: #ff0000;"); //Initialement sélectionné else cel.setAttribute("style", " "); cel.setAttribute("onclick", inst+".Valide("+j+")"); cel.setAttribute("title", "Cliquer sur un jour pour valider"); cel.setAttribute("class", "lien"); cel.firstChild.data= j; } else { // Cellules sans jours cel.setAttribute("onclick", ""); cel.setAttribute("title", ""); cel.setAttribute("class", ""); cel.firstChild.data= " "; } //Fin 'if' jours du mois' cel= cel.nextSibling; j++; } //Fin 'for' cellules }//Fin 'for' lignes } //// Fonction privée (locale) /**** Intitialisation calendrier (instanciation)*****/ function InitialiseCalendrier() { /*** Pour IE, selon les attibuts, il faut utiliser différentes formes ??? ***/ var classe_tableau = document.createAttribute("class"); classe_tableau.nodeValue = "style_calendrier"; tableau.setAttributeNode(classe_tableau); tableau.border= "0"; tableau.setAttribute("cellpadding", "0"); tableau.setAttribute("cellspacing", "0"); tableau.setAttribute("width", "100%"); tableau.style.visibility= 'hidden'; var t_nj= new Array('sem.', 'lu', 'ma', 'me', 'je', 've', 'sa', 'di'); var lien, ligne, cellule, contenu, option_mois, option_an, texte; var l, j, m, a; /*** Construction du tableau, mais les cellules de numéros de semaine et de jours restent vides ***/ //Ligne titre ligne= document.createElement("tr"); ligne.setAttribute("class", "titre"); //Mois cellule= document.createElement("td"); cellule.setAttribute("colspan", "4"); lien= document.createElement("span"); lien.setAttribute("onclick", inst+".MoisPrecedent()"); lien.setAttribute("title", "Mois précédent"); lien.setAttribute("class", "lien"); contenu= document.createTextNode("< "); lien.appendChild(contenu); cellule.appendChild(lien); for (m in t_noms_mois) { option_mois= document.createElement("option"); texte= document.createTextNode(t_noms_mois[m]); option_mois.appendChild(texte); liste_mois.appendChild(option_mois); } liste_mois.setAttribute("onchange", inst+".SelMois()"); liste_mois.setAttribute("title", "Mois"); cellule.appendChild(liste_mois); lien= document.createElement("span"); lien.setAttribute("onclick", inst+".MoisSuivant()"); lien.setAttribute("title", "Mois suivant"); lien.setAttribute("class", "lien"); contenu= document.createTextNode(" >"); lien.appendChild(contenu); cellule.appendChild(lien); ligne.appendChild(cellule); //Année cellule= document.createElement("td"); cellule.setAttribute("colspan", "3"); lien= document.createElement("span"); lien.setAttribute("onclick", inst+".AnPrecedent()"); lien.setAttribute("title", "Année précédente"); lien.setAttribute("class", "lien"); contenu= document.createTextNode("< "); lien.appendChild(contenu); cellule.appendChild(lien); for (a= an_min; a <= an_max; a++) { option_an= document.createElement("option"); option_an.setAttribute("value", a); texte= document.createTextNode(a); option_an.appendChild(texte); liste_ans.appendChild(option_an); } liste_ans.setAttribute("onchange", inst+".SelAn()"); liste_ans.setAttribute("title", "Année"); cellule.appendChild(liste_ans); lien= document.createElement("span"); lien.setAttribute("onclick", inst+".AnSuivant()"); lien.setAttribute("title", "Année suivante"); lien.setAttribute("class", "lien"); contenu= document.createTextNode(" >"); lien.appendChild(contenu); cellule.appendChild(lien); ligne.appendChild(cellule); //Fermeture cellule= document.createElement("td"); cellule.setAttribute("style", "color: #ff8888; font-weight: bold;"); cellule.setAttribute("class", "lien"); cellule.setAttribute("onclick", inst+".Ferme()"); cellule.setAttribute("title", "Annulation"); contenu= document.createTextNode("X"); cellule.appendChild(contenu); ligne.appendChild(cellule); tbody.appendChild(ligne); //Ligne nom des jours de semaine ligne= document.createElement("tr"); ligne.setAttribute("class","njours"); for (j= 0; j < t_nj.length; j++) { cellule= document.createElement("td"); contenu= document.createTextNode(t_nj[j]); cellule.appendChild(contenu); ligne.appendChild(cellule); } tbody.appendChild(ligne); //Lignes n° des jours for (l= 0; l < t_lignes.length ; l++) { //Cellule semaine t_lignes[l]= ligne= document.createElement("tr"); cellule= document.createElement("td"); cellule.setAttribute("class","njours"); contenu= document.createTextNode("ss"); cellule.appendChild(contenu); ligne.appendChild(cellule); //Cellules jours for (j= 0; j < t_nj.length-1; j++) { cellule= document.createElement("td"); contenu= document.createTextNode("--"); cellule.appendChild(contenu); ligne.appendChild(cellule); } tbody.appendChild(ligne); } document.getElementById(id_pos).appendChild(tableau); } InitialiseCalendrier(); //Instantiation }