var tmois_fr = new Array("janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre");
var tmois_en = new Array("january", "febrary", "march", "april", "may", "june", "july", "august", "september", "october", "november", "décember");
var tsemaine_fr = new Array("lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche");
var tsemaine_en = new Array("monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday");
var tmois = tmois_en;
var tsemaine = tsemaine_en;
var H24 = 24*60*60*1000;

//setLanguage - positionne la langue d'affichage
function setLanguage(language) {
 switch(language) {
  case 'fr' : tmois = tmois_fr; tsemaine = tsemaine_fr; break;
  case 'en' : 
  default : tmois = tmois_en; tsemaine = tsemaine_en;
 }
}

//getLanguage - retourne la langue actuellement positionnée
function getLanguage() {
 if(tmois[0] == tmois_fr[0]) return 'fr'; else return 'en';
}

//display - affiche l’objet date au format "JJ/MM/AAAA"
Date.prototype.display = function() {
 var sepa = "/";
 if (arguments.length) sepa = arguments[0];
 return formate2(this.getDate()) + sepa + formate2(eval(this.getMonth() + 1)) + sepa + this.getFullYear();
}

//formate2 - rajoute un "0" devant un nombre s'il est < 10
function formate2(nombre) {
 return (nombre < 10) ? "0" + nombre : nombre;
}

//chech_date - contrôle si une date est valide
function checkDate(chaine) {
 var pivot = 30; 
 ctl = /^(\d\d?)(\/|-|\.)(\d\d?)(\/|-|\.)(\d\d)(\d\d)?$/;
 var tab = chaine.match(ctl);
 if (!tab) return false;
 else {
   if ((tab.length == 6) || (!tab[6])) 
     tab[5] = ((tab[5] < pivot) ? 2000 : 1900) + parseInt(tab[5]);
   else tab[5] = parseInt(tab[5].concat(tab[6]));
   var unedate = new Date(tab[5], parseInt(tab[3])-1, tab[1]);
   return ((unedate.getFullYear() == tab[5]) && (unedate.getMonth() == tab[3]-1) && (unedate.getDate() == tab[1]));
 }
}

//strToDate - convertit une chaîne en objet date
function strToDate(chaine) {
 var pivot = 30;
 ctl = /^(\d\d?)(\/|-|\.)(\d\d?)(\/|-|\.)(\d\d)(\d\d)?$/;
 var tab = ctl.exec(chaine);
 if ((tab.length > 6) && (tab[6])) tab[5] += tab[6];
 else tab[5] = ((tab[5] < pivot) ? "20" : "19") + tab[5];
 var unedate = new Date(tab[5], tab[3]-1, tab[1]);
 return unedate;
}

//between - détermine si l’objet date est compris entre 2 dates
Date.prototype.between = function(debut, fin) {
 return ((this.getTime() >= debut.getTime()) && (this.getTime() <= fin.getTime()));
}

//shortMonthName - affiche le mois sur 3 lettres, sauf pour juin (5) et juillet(6) qui sont affichés sur 4 lettres
function shortMonthName(num_mois) {
 if(getLanguage() == 'fr') {
  if ((num_mois < 5) || (num_mois > 6)) return tmois[num_mois].substr(0, 3);
  else return tmois[num_mois].substr(0, 4);
 } else {
  return tmois[num_mois].substr(0, 3);
 }
}

//MonthName - affiche le mois
function MonthName(num_mois) {
 return tmois[num_mois];
}

//shortDayName - retourne le nom du jour sur 3 lettres
shortDayName = function(num_jour) {
 return tsemaine[num_jour].substr(0,3);
}
 
//DayName - retourne le nom du jour
DayName = function(num_jour) {
 return tsemaine[num_jour];
}

//dayNumber - retourne 0 pour un lundi, 1 pour mardi... 6 pour dimanche
Date.prototype.dayNumber = function() {
 return this.getDay() ? (this.getDay()-1) : 6;
}

//EndOfMonth - transforme la date en date de fin de mois
Date.prototype.EndOfMonth = function() {
 if (this.getMonth() < 11) this.setMonth(this.getMonth() + 1);
 else {
   this.setMonth(0);
   this.setFullYear(this.getFullYear() + 1);
 }
 this.setDate(1);
 this.setTime(this.getTime() - H24);
}

//formate2 - rajoute un "0" devant un nombre s'il est < 10
function formate2(nombre) {
 return (nombre < 10) ? "0" + nombre : nombre;
}

//stdHour - affiche un heure au format HH :MM ou HH :MM :SS
Date.prototype.stdHour = function(format) {
 var texte = "";
 format = (format == undefined) ? 'HH:MM:SS' : format ;
 if (format.indexOf("HH:MM") != -1) {
   texte = formate2(this.getHours()) + ":" + formate2(this.getMinutes());
   if (format == "HH:MM:SS") texte += ":" + formate2(this.getSeconds());
 }
 return texte;
}

//formate2 - rajoute un "0" devant un nombre s'il est < 10
function formate2(nombre) {
 return (nombre < 10) ? "0" + nombre : nombre;
}

//NumberOfDays - donne le nombre de jours entre 2 dates
Date.prototype.NumberOfDays = function() {
   if (arguments.length == 1) var date2 = arguments[0];
   else date2 = new Date();
   var debut = NumberOfDaysRef(this);
   return NumberOfDaysRef(date2) - debut;
}

// détermine le nombre de jours de la date à minuit depuis le 01/01/1970
function NumberOfDaysRef(obj_date) {
   obj_date.setHours(0);
   obj_date.setMinutes(0);
   obj_date.setSeconds(0);
   return Math.round(obj_date.getTime() /24/60/60/1000); 
}

//tomorrow - ajoute un jour à la date
Date.prototype.tomorrow = function() {
 this.setTime(this.getTime() + H24);
}

//yesterday - enlève un jour à la date
Date.prototype.yesterday = function() {
 this.setTime(this.getTime() - H24);
}

//litteral - affiche la date avec le jour et le mois en toutes lettres
Date.prototype.litteral = function() {
 if(getLanguage() == 'fr') {
  if ((arguments.length) && (arguments[0] == "court"))
    return tsemaine[this.dayNumber()].substr(0, 3) + " " + this.getDate() + " " + shortMonth(this.getMonth()) + " " + this.getFullYear();
  else
    return tsemaine[this.dayNumber()] + " " + this.getDate() + " " + tmois[this.getMonth()] + " " + this.getFullYear();
 }
 else {
  if ((arguments.length) && (arguments[0] == "court"))
    return tsemaine[this.dayNumber()].substr(0, 3) + " " + shortMonth(this.getMonth()) + " " + this.getDate() + " " + this.getFullYear();
  else
    return tsemaine[this.dayNumber()] + " " + tmois[this.getMonth()] + " " + this.getDate() + " " + this.getFullYear();
 }
}

//previousMonday - indique le lundi précédent la date courante
Date.prototype.previousMonday = function() {
 if (this.dayNumber() > 0) this.setTime(this.getTime() - this.dayNumber() * H24);
}

//checkYearMonthDay - vérifie que l’objet date a les valeurs année, mois, jour
Date.prototype.checkYearMonthDay = function(annee, mois, jour) {
 if (annee < 100) annee = 2000 + parseInt(annee);
 return ((this.getFullYear() == annee) && (this.getMonth() == mois - 1) && (this.getDate() == jour));
}

//sameDay - indique si 2 dates sont du même jour
Date.prototype.sameDay = function(autre_date) {
 return ((this.getDate() == autre_date.getDate()) && (this.getMonth() == autre_date.getMonth()) && (this.getFullYear() == autre_date.getFullYear()));
}

//getMonthYear - retourne le mois et l’année
Date.prototype.getMonthYear = function() {
 if ((arguments.length) && (arguments[0] == "court")) shortMonth(this.getMonth()) + ' ' + this.getFullYear();
 return tmois[this.getMonth()] + ' ' + this.getFullYear();
}

//previousMonth - met la date au mois précédent
Date.prototype.previousMonth = function() {
 var mois = this.getMonth();
 if (mois) this.setMonth(mois-1);
 else {
   this.setMonth(11);
   this.setFullYear(this.getFullYear()-1);
 }
}

//nextMonth - met la date au mois suivant
Date.prototype.nextMonth = function() {
 var mois = this.getMonth();
 if (mois < 11) this.setMonth(parseInt(mois+1));
 else {
   this.setMonth(0);
   this.setFullYear(parseInt(this.getFullYear()+1));
 }
}

//numerique - transforme la date en valeur numérique
Date.prototype.numerique = function() {
 return "" + this.getFullYear() + formate2(parseInt(this.getMonth() + 1)) + formate2(this.getDate());
}

//Easter - donne la date de Pâques selon l’année
function Easter(annee) {
 annee = parseInt(annee);
 var dateEaster = null;
 var b = annee - 1900;
 var c = annee % 19;
 var d = Math.floor((7*c+1)/19);
 var e = (11*c+4-d) % 29;
 var f = Math.floor(b/4);
 var g = (b+f+31-e) % 7; 
 var avril = 25-e-g;
 if (avril > 0) dateEaster = new Date(annee, 3, avril);
 else dateEaster = new Date(annee, 2, avril + 31);
 return dateEaster;
}

//typeOf - propriété de l’objet Date, qui détermine si une variable est de type Date
Date.prototype.typeOf = "Date";

