/*******************************************/
/*              Gestion Date               */
/*******************************************/

function getNbJourMois(mois, an)
{
    var nbJours = 31;
    if(mois==4 ||mois==6 || mois==9 || mois==11 ) --nbJours;
    if(mois==2) {
        nbJours = nbJours - 3;
        if(an%4==0) nbJours++;
        if(an%100==0) nbJours--;
        if(an%400==0) nbJours++;
    }
    return nbJours;
}

/* Méthode 1 */

function formaterDate(txtb){
    var val = replaceAll(txtb.value, '-', '/');
    
    var tab = val.split("/");
    
    if (tab.length == 1 && isNullOrEmpty(tab[0])){
        txtb._LastGoodValue = txtb.value;
        return;
    }
    
    if (isNullOrEmpty(tab[0]) || isNullOrEmpty(tab[1]) || isNullOrEmpty(tab[2]) || !isNullOrEmpty(tab[3])){
        txtb.value = "";
        if (! isNullOrEmpty(txtb._LastGoodValue))
            txtb.value = txtb._LastGoodValue;
        return;
    }
    else
    {
        if (tab[0]<1 || tab[1]<1){
        txtb.value = "";
        if (! isNullOrEmpty(txtb._LastGoodValue))
            txtb.value = txtb._LastGoodValue;
        return;
    }
    }

    // prototype: mise en place de l'auto complétion de l'année
     
    tab[2] = new Date().getFullYear().toString().substring(0,4-tab[2].length) + tab[2];

    if (parseInt(tab[1]) > 12){
        txtb.value = "";
        if (! isNullOrEmpty(txtb._LastGoodValue))
            txtb.value = txtb._LastGoodValue;
        return
    }
    
    var nbJoursMax = getNbJourMois(parseInt(tab[1],10), parseInt(tab[2]));
    if (parseInt(tab[0]) > nbJoursMax){
        if (parseInt(tab[0]) > 31){
            txtb.value = "";
            if (! isNullOrEmpty(txtb._LastGoodValue))
                txtb.value = txtb._LastGoodValue;
            return;
        }
        else
            tab[0] = nbJoursMax;
    }
    
    txtb.value = tab[0] + "/" + tab[1] + "/" + tab[2];
    txtb._LastGoodValue = txtb.value;
}

function mask(txtb)
{
    var valid = true;
    var val = replaceAll(txtb.value, '-', '/');
    var tab = val.split("/");
    var tab_0 = "";
    var tab_1 = "";
    var tab_2 = "";
    
    var newVal = "";
    
    if (tab.length > 0 && tab.length < 4){
        var last_is_sep = tab[tab.length-1] == "";
        
        if (tab.length == 3){
            if (!isNullOrEmpty(tab[2])){
                tab_2 = tab[2];
                if (tab[2].length > 4){
                    valid = false;
                }
            }
        }
        
        if (tab.length >= 2){
            if (!isNullOrEmpty(tab[1])){
                tab_1 = tab[1];
            }
        }
        if (tab.length >= 1){
            if (!isNullOrEmpty(tab[0])){
                tab_0 = tab[0];
            }
        }
    }
    else{
        valid = false;
    }
    if (!valid){
        return txtb.value = txtb._LastValue;
    }
    
    // Ajout des '/' quand nécessaire
    if (last_is_sep || tab.length == 3){
        txtb.val_len = val.length;
    }
    else if (txtb.val_len > val.length){
        txtb.val_len = val.length;
    }
    else if (val.length == 1 && tab[0] > 3 || val.length == 2)
    {
        txtb.value += "/";
        txtb.val_len = txtb.value.length;
    }
    else if (val.length == 3 && tab_1 > 1)
    {
        txtb.value += "/";
        txtb.val_len = txtb.value.length;
    }
    else if (val.length == 4 && tab_1 > 1 || tab_1.length == 2)
    {
        txtb.value += "/";
        txtb.val_len = txtb.value.length;
    }
    else if (val.length == 5)
    {
        txtb.value += "/";
        txtb.val_len = txtb.value.length;
    }
    txtb._LastValue = replaceAll(txtb.value, '-', '/');
}

function verifKeyPress(txtb, e)
{
    txtb._LastValue = txtb.value;
    
    var isInt = verifInt(e);
    var isSep = false;
    
    if (!isInt && verifDate(e))
        isSep = true;

    if (isNav(e))
        return true;
    else if (isInt)
        return true;
    else if (isSep){
        var val = replaceAll(txtb.value, '-', '/')
        var tab = val.split('/');
        if (tab.length > 2)
            return false;
        var last_CharDate = '';
        if (val.length > 0)
            last_CharDate = val.substring(val.length-1, val.length)
        if (last_CharDate == '/')
            return false;
        return true;
        }
    return false;
}

/**
 *  fonction test pour la navigation ou suppression
 **/
function isNav(e)
{
    if (navigator.appName == 'Microsoft Internet Explorer')
    {
        return false;
    }
    else
    {
        /**
         * keyCode=9  : tab
         * keyCode=8  : back
         * keyCode=35 : fin
         * keyCode=36 : debut
         * keyCode=37 : gauche
         * keyCode=39 : droite
         * keyCode=46 : supprime
         **/
        if (e.which == 0 && (e.keyCode == 9 || e.keyCode == 35 || e.keyCode == 36 || e.keyCode == 37 || e.keyCode == 39 || e.keyCode == 46 ) ||
            (e.which == 8 && e.keyCode == 8))
        {
           return true;
        }
        else
        {
            return false;         
        }
    }
}

function verifInt(e)
{
    var nav = 'IE';
    if (navigator.appName != 'Microsoft Internet Explorer')
        nav = 'AUTRE';
    if (nav == 'IE')
    {
        if ((e.keyCode>=48 && e.keyCode<=57) || e.keyCode == 13)
            return true;
    }
    else
    {
        if (e.which == 13 || e.which==8 || (e.which>=48 && e.which<=57) || e.keyCode==9 || e.keyCode==46 || (e.keyCode>=37 && e.keyCode<=40) || (e.keyCode>=112 && e.keyCode<=123))
            return true;
    }
    return false;
}

function verifDate(e)
{
    var nav = 'IE';
    if (navigator.appName != 'Microsoft Internet Explorer')
        nav = 'AUTRE';
    if (verifInt(e))
        return true;
    if (nav == 'IE')
    {
        if (e.keyCode == 47 || e.keyCode == 45)
            return true;
    }
    else
    {
        if (e.which == 47 || e.which == 45)
            return true;
    }
    return false;
}


Date.parseFunctions = {count:0};
Date.parseRegexes = [];
Date.formatFunctions = {count:0};

Date.prototype.dateFormat = function(format) {
    if (Date.formatFunctions[format] == null) {
        Date.createNewFormat(format);
    }
    var func = Date.formatFunctions[format];
    return this[func]();
}

Date.createNewFormat = function(format) {
    var funcName = "format" + Date.formatFunctions.count++;
    Date.formatFunctions[format] = funcName;
    var code = "Date.prototype." + funcName + " = function(){return ";
    var special = false;
    var ch = '';
    for (var i = 0; i < format.length; ++i) {
        ch = format.charAt(i);
        if (!special && ch == "\\") {
            special = true;
        }
        else if (special) {
            special = false;
            code += "'" + String.escape(ch) + "' + ";
        }
        else {
            code += Date.getFormatCode(ch);
        }
    }
    eval(code.substring(0, code.length - 3) + ";}");
}

Date.getFormatCode = function(character) {
    switch (character) {
    case "d":
        return "String.leftPad(this.getDate(), 2, '0') + ";
    case "D":
        return "Date.dayNames[this.getDay()].substring(0, 3) + ";
    case "j":
        return "this.getDate() + ";
    case "l":
        return "Date.dayNames[this.getDay()] + ";
    case "S":
        return "this.getSuffix() + ";
    case "w":
        return "this.getDay() + ";
    case "z":
        return "this.getDayOfYear() + ";
    case "W":
        return "this.getWeekOfYear() + ";
    case "F":
        return "Date.monthNames[this.getMonth()] + ";
    case "m":
        return "String.leftPad(this.getMonth() + 1, 2, '0') + ";
    case "M":
        return "Date.monthNames[this.getMonth()].substring(0, 3) + ";
    case "n":
        return "(this.getMonth() + 1) + ";
    case "t":
        return "this.getDaysInMonth() + ";
    case "L":
        return "(this.isLeapYear() ? 1 : 0) + ";
    case "Y":
        return "this.getFullYear() + ";
    case "y":
        return "('' + this.getFullYear()).substring(2, 4) + ";
    case "a":
        return "(this.getHours() < 12 ? 'am' : 'pm') + ";
    case "A":
        return "(this.getHours() < 12 ? 'AM' : 'PM') + ";
    case "g":
        return "((this.getHours() %12) ? this.getHours() % 12 : 12) + ";
    case "G":
        return "this.getHours() + ";
    case "h":
        return "String.leftPad((this.getHours() %12) ? this.getHours() % 12 : 12, 2, '0') + ";
    case "H":
        return "String.leftPad(this.getHours(), 2, '0') + ";
    case "i":
        return "String.leftPad(this.getMinutes(), 2, '0') + ";
    case "s":
        return "String.leftPad(this.getSeconds(), 2, '0') + ";
    case "O":
        return "this.getGMTOffset() + ";
    case "T":
        return "this.getTimezone() + ";
    case "Z":
        return "(this.getTimezoneOffset() * -60) + ";
    default:
        return "'" + String.escape(character) + "' + ";
    }
}

Date.parseDate = function(input, format) {
    if (Date.parseFunctions[format] == null) {
        Date.createParser(format);
    }
    var func = Date.parseFunctions[format];
    return Date[func](input);
}

Date.createParser = function(format) {
    var funcName = "parse" + Date.parseFunctions.count++;
    var regexNum = Date.parseRegexes.length;
    var currentGroup = 1;
    Date.parseFunctions[format] = funcName;

    var code = "Date." + funcName + " = function(input){\n"
        + "var y = -1, m = -1, d = -1, h = -1, i = -1, s = -1;\n"
        + "var d = new Date();\n"
        + "y = d.getFullYear();\n"
        + "m = d.getMonth();\n"
        + "d = d.getDate();\n"
        + "var results = input.match(Date.parseRegexes[" + regexNum + "]);\n"
        + "if (results && results.length > 0) {"
    var regex = "";

    var special = false;
    var ch = '';
    for (var i = 0; i < format.length; ++i) {
        ch = format.charAt(i);
        if (!special && ch == "\\") {
            special = true;
        }
        else if (special) {
            special = false;
            regex += String.escape(ch);
        }
        else {
            obj = Date.formatCodeToRegex(ch, currentGroup);
            currentGroup += obj.g;
            regex += obj.s;
            if (obj.g && obj.c) {
                code += obj.c;
            }
        }
    }

    code += "if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n"
        + "{return new Date(y, m, d, h, i, s);}\n"
        + "else if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n"
        + "{return new Date(y, m, d, h, i);}\n"
        + "else if (y > 0 && m >= 0 && d > 0 && h >= 0)\n"
        + "{return new Date(y, m, d, h);}\n"
        + "else if (y > 0 && m >= 0 && d > 0)\n"
        + "{return new Date(y, m, d);}\n"
        + "else if (y > 0 && m >= 0)\n"
        + "{return new Date(y, m);}\n"
        + "else if (y > 0)\n"
        + "{return new Date(y);}\n"
        + "}return null;}";

    Date.parseRegexes[regexNum] = new RegExp("^" + regex + "$");
    eval(code);
}

Date.formatCodeToRegex = function(character, currentGroup) {
    switch (character) {
    case "D":
        return {g:0,
        c:null,
        s:"(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)"};
    case "j":
    case "d":
        return {g:1,
            c:"d = parseInt(results[" + currentGroup + "], 10);\n",
            s:"(\\d{1,2})"};
    case "l":
        return {g:0,
            c:null,
            s:"(?:" + Date.dayNames.join("|") + ")"};
    case "S":
        return {g:0,
            c:null,
            s:"(?:st|nd|rd|th)"};
    case "w":
        return {g:0,
            c:null,
            s:"\\d"};
    case "z":
        return {g:0,
            c:null,
            s:"(?:\\d{1,3})"};
    case "W":
        return {g:0,
            c:null,
            s:"(?:\\d{2})"};
    case "F":
        return {g:1,
            c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "].substring(0, 3)], 10);\n",
            s:"(" + Date.monthNames.join("|") + ")"};
    case "M":
        return {g:1,
            c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "]], 10);\n",
            s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"};
    case "n":
    case "m":
        return {g:1,
            c:"m = parseInt(results[" + currentGroup + "], 10) - 1;\n",
            s:"(\\d{1,2})"};
    case "t":
        return {g:0,
            c:null,
            s:"\\d{1,2}"};
    case "L":
        return {g:0,
            c:null,
            s:"(?:1|0)"};
    case "Y":
        return {g:1,
            c:"y = parseInt(results[" + currentGroup + "], 10);\n",
            s:"(\\d{4})"};
    case "y":
        return {g:1,
            c:"var ty = parseInt(results[" + currentGroup + "], 10);\n"
                + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",
            s:"(\\d{1,2})"};
    case "a":
        return {g:1,
            c:"if (results[" + currentGroup + "] == 'am') {\n"
                + "if (h == 12) { h = 0; }\n"
                + "} else { if (h < 12) { h += 12; }}",
            s:"(am|pm)"};
    case "A":
        return {g:1,
            c:"if (results[" + currentGroup + "] == 'AM') {\n"
                + "if (h == 12) { h = 0; }\n"
                + "} else { if (h < 12) { h += 12; }}",
            s:"(AM|PM)"};
    case "g":
    case "G":
    case "h":
    case "H":
        return {g:1,
            c:"h = parseInt(results[" + currentGroup + "], 10);\n",
            s:"(\\d{1,2})"};
    case "i":
        return {g:1,
            c:"i = parseInt(results[" + currentGroup + "], 10);\n",
            s:"(\\d{2})"};
    case "s":
        return {g:1,
            c:"s = parseInt(results[" + currentGroup + "], 10);\n",
            s:"(\\d{2})"};
    case "O":
        return {g:0,
            c:null,
            s:"[+-]\\d{4}"};
    case "T":
        return {g:0,
            c:null,
            s:"[A-Z]{3}"};
    case "Z":
        return {g:0,
            c:null,
            s:"[+-]\\d{1,5}"};
    default:
        return {g:0,
            c:null,
            s:String.escape(character)};
    }
}

Date.prototype.getTimezone = function() {
    return this.toString().replace(
        /^.*? ([A-Z]{3}) [0-9]{4}.*$/, "$1").replace(
        /^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3");
}

Date.prototype.getGMTOffset = function() {
    return (this.getTimezoneOffset() > 0 ? "-" : "+")
        + String.leftPad(Math.floor(this.getTimezoneOffset() / 60), 2, "0")
        + String.leftPad(this.getTimezoneOffset() % 60, 2, "0");
}

Date.prototype.getDayOfYear = function() {
    var num = 0;
    Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
    for (var i = 0; i < this.getMonth(); ++i) {
        num += Date.daysInMonth[i];
    }
    return num + this.getDate() - 1;
}

Date.prototype.getWeekOfYear = function() {
    // Skip to Thursday of this week
    var now = this.getDayOfYear() + (4 - this.getDay());
    // Find the first Thursday of the year
    var jan1 = new Date(this.getFullYear(), 0, 1);
    var then = (7 - jan1.getDay() + 4);
    document.write(then);
    return String.leftPad(((now - then) / 7) + 1, 2, "0");
}

Date.prototype.isLeapYear = function() {
    var year = this.getFullYear();
    return ((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));
}

Date.prototype.getFirstDayOfMonth = function() {
    var day = (this.getDay() - (this.getDate() - 1)) % 7;
    return (day < 0) ? (day + 7) : day;
}

Date.prototype.getLastDayOfMonth = function() {
    var day = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7;
    return (day < 0) ? (day + 7) : day;
}

Date.prototype.getDaysInMonth = function() {
    Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
    return Date.daysInMonth[this.getMonth()];
}

Date.prototype.getSuffix = function() {
    switch (this.getDate()) {
        case 1:
        case 21:
        case 31:
            return "st";
        case 2:
        case 22:
            return "nd";
        case 3:
        case 23:
            return "rd";
        default:
            return "th";
    }
}

String.escape = function(string) {
    return string.replace(/('|\\)/g, "\\$1");
}

String.leftPad = function (val, size, ch) {
    var result = new String(val);
    if (ch == null) {
        ch = " ";
    }
    while (result.length < size) {
        result = ch + result;
    }
    return result;
}

Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
Date.monthNames =
   ["Janvier",
    "F&eacute;vrier",
    "Mars",
    "Avril",
    "Mai",
    "Juin",
    "Juillet",
    "Ao&ucirc;t",
    "Septembre",
    "Octobre",
    "Novembre",
    "D&eacute;cembre"];
Date.dayNames =
   ["Dimanche",
    "Lundi",
    "Mardi",
    "Mercredi",
    "Jeudi",
    "Vendredi",
    "Samedi"];
Date.y2kYear = 50;
Date.monthNumbers = {
    Jan:0,
    Feb:1,
    Mar:2,
    Apr:3,
    May:4,
    Jun:5,
    Jul:6,
    Aug:7,
    Sep:8,
    Oct:9,
    Nov:10,
    Dec:11};
Date.patterns = {
    ISO8601LongPattern:"Y-m-d H:i:s",
    ISO8601ShortPattern:"Y-m-d",
    ShortDatePattern: "n/j/Y",
    LongDatePattern: "l, F d, Y",
    FullDateTimePattern: "l, F d, Y g:i:s A",
    MonthDayPattern: "F d",
    ShortTimePattern: "g:i A",
    LongTimePattern: "g:i:s A",
    SortableDateTimePattern: "Y-m-d\\TH:i:s",
    UniversalSortableDateTimePattern: "Y-m-d H:i:sO",
    YearMonthPattern: "F, Y"};

Date.prototype.getWeek = function() {
    var onejan = new Date(this.getFullYear(),0,1);
    return Math.ceil((((this - onejan) / 86400000) + onejan.getDay())/7);
}

/*******************************************/
/*              Date Chooser               */
/*******************************************/

function DateChooser_Init() {
    var oA = document.getElementsByTagName('html')[0];
    oA.onclick = DateChooser_fermerTousCalendriers;
}
function DateChooser_fermerTousCalendriers() {
    for (i=0;i<ListeDateChooser.length;++i)
    {
        DateChooser_fermerDiv(document.getElementById(ListeDateChooser[i]+'_dateChooserDiv'), document.getElementById(ListeDateChooser[i]+'_dateChooserImg'), document.getElementById(ListeDateChooser[i]+'_dateChooserTxt'));
    }
}

function DateChooser_fermerDiv(div, img, input)
{
    if(div != null){
        if (div.style.display == 'block')
        {
            if (div.FirstOpen == true)
                div.FirstOpen = false;
            else{
                if (!(div.getAttribute('Over') == "true") && !(img.getAttribute('Over') == "true"))
                {
                    input.DateChooser.hide();
                    div.setAttribute('Over',"false");
                }
            }
        }
    }
}

function DateChooser_setEnabled(actif, dc)
{
    if (actif)
    {
        dc._input.disabled = false;
        var dcImg = document.getElementById(dc._input.id.replace('_dateChooserTxt', '_dateChooserImg'));
        dcImg.onclick = function(){DateChooser_showChooser(this, dc._input.id, dc._div.id, -1, -1, 'd/m/Y', false);}
        dcImg.src = dcImg.src.replace('AjilonDateChooser_CalendrierDisabled.gif', 'AjilonDateChooser_Calendrier.gif');
    }
    else
    {
        var dcImg = document.getElementById(dc._input.id.replace('_dateChooserTxt', '_dateChooserImg'));
        dcImg.onclick = function(){}
        dcImg.src = dcImg.src.replace('AjilonDateChooser_Calendrier.gif', 'AjilonDateChooser_CalendrierDisabled.gif');
        dc._input.disabled = true;
    }
}

// Shows or hides the date chooser on the page
function DateChooser_showChooser(obj, inputId, divId, start, end, format, isTimeChooser) {
    if (document.getElementById) {
        var input = document.getElementById(inputId);
        var div = document.getElementById(divId);
        if (input !== undefined && div !== undefined) {
            if (input.DateChooser === undefined) {
                input.DateChooser = new DateChooser(input, div, start, end, format, isTimeChooser);
            }
            if (input.DateChooser._div == null)
                input.DateChooser._div = div;
            input.DateChooser._selDate = Date.parseDate(input.value, format);
            input.DateChooser.setDate(Date.parseDate(input.value, format));
            if (input.DateChooser.isVisible()) {
                input.DateChooser.hide();
                div.setAttribute('Over',"false");
            }
            else {
                input.DateChooser.show();
                div.FirstOpen = true;
            }
        }
    }
}

// Sets a date on the object attached to 'inputId'
function DateChooser_SetDate(inputId, value) {
    var input = document.getElementById(inputId);
    if (input !== undefined && input.DateChooser !== undefined) {
        input.DateChooser.setDate(Date.parseDate(value, input.DateChooser._format));
        if (input.DateChooser.isTimeChooser()) {
            var theForm = input.form;
            var prefix = input.DateChooser._prefix;
            input.DateChooser.setTime(
                parseInt(theForm.elements[prefix + 'hour'].options[
                    theForm.elements[prefix + 'hour'].selectedIndex].value)
                    + parseInt(theForm.elements[prefix + 'ampm'].options[
                    theForm.elements[prefix + 'ampm'].selectedIndex].value),
                parseInt(theForm.elements[prefix + 'min'].options[
                    theForm.elements[prefix + 'min'].selectedIndex].value));
        }
        input.value = input.DateChooser.getValue();
        input.DateChooser.hide();
        input.DateChooser._div.setAttribute('Over',"false");
    }
}

// The callback function for when someone changes the pulldown menus on the date
// chooser
function DateChooser_DateChange(theForm, prefix) {
    var input = document.getElementById(
        theForm.elements[prefix + 'inputId'].value);
    var newDate = new Date(
        theForm.elements[prefix + 'year'].options[
            theForm.elements[prefix + 'year'].selectedIndex].value,
        theForm.elements[prefix + 'month'].options[
            theForm.elements[prefix + 'month'].selectedIndex].value,
        1);
    // Try to preserve the day of month (watch out for months with 31 days)
    newDate.setDate(Math.max(1, Math.min(newDate.getDaysInMonth(),
                    input.DateChooser._date.getDate())));
    input.DateChooser.setDate(newDate);
    if (input.DateChooser.isTimeChooser()) {
        input.DateChooser.setTime(
            parseInt(theForm.elements[prefix + 'hour'].options[
                theForm.elements[prefix + 'hour'].selectedIndex].value)
                + parseInt(theForm.elements[prefix + 'ampm'].options[
                theForm.elements[prefix + 'ampm'].selectedIndex].value),
            parseInt(theForm.elements[prefix + 'min'].options[
                theForm.elements[prefix + 'min'].selectedIndex].value));
    }
    input.DateChooser.show();
}

function DateChooser_moisPrecedent(prefix){
    var theForm = document.getElementById(prefix + 'year').form;
    // On selectionne le mois précédent
    var indexMois = theForm.elements[prefix + 'month'].selectedIndex;
    var indexAnnee = theForm.elements[prefix + 'year'].selectedIndex;
    if (indexMois > 0){
        indexMois--;
    }
    else{
        indexMois = 11;
        indexAnnee--;
    }
    theForm.elements[prefix + 'month'].selectedIndex = indexMois;
    theForm.elements[prefix + 'year'].selectedIndex = indexAnnee;
    
    // On actualise l'affichage
    DateChooser_DateChange(theForm, prefix);
}

function DateChooser_moisSuivant(prefix){
    var theForm = document.getElementById(prefix + 'year').form;
    // On selectionne le mois suivant
    var indexMois = theForm.elements[prefix + 'month'].selectedIndex;
    var indexAnnee = theForm.elements[prefix + 'year'].selectedIndex;
    if (indexMois < 11){
        indexMois++;
    }
    else{
        indexMois = 0;
        indexAnnee++;
    }
    theForm.elements[prefix + 'month'].selectedIndex = indexMois;
    theForm.elements[prefix + 'year'].selectedIndex = indexAnnee;
    // On actualise l'affichage
    DateChooser_DateChange(theForm, prefix);
}

// Gets the absolute position on the page of the element passed in
function DateChooser_getAbsolutePosition(obj) {
    var result = [0, 0];
    while (obj != null) {
        result[0] += obj.offsetTop;
        result[1] += obj.offsetLeft;
        obj = obj.offsetParent;
    }
    return result;
}

// DateChooser constructor
function DateChooser(input, div, start, end, format, isTimeChooser) {
    this._input = input;
    this._div = div;
    this._start = start;
    this._end = end;
    this._format = format;
    this._date = new Date();
    this._isTimeChooser = isTimeChooser;
    // Choose a random prefix for all pulldown menus
    this._prefix = "";
    var letters = ["a", "b", "c", "d", "e", "f", "h", "i", "j", "k", "l",
        "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
    for (var i = 0; i < 10; ++i) {
        this._prefix += letters[Math.floor(Math.random() * letters.length)];
    }
}

// DateChooser prototype variables
DateChooser.prototype._isVisible = false;

// Returns true if the chooser is currently visible
DateChooser.prototype.isVisible = function() {
    return this._isVisible;
}

// Returns true if the chooser is to allow choosing the time as well as the date
DateChooser.prototype.isTimeChooser = function() {
    return this._isTimeChooser;
}

// Gets the value, as a formatted string, of the date attached to the chooser
DateChooser.prototype.getValue = function() {
    return this._date.dateFormat(this._format);
}

// Hides the chooser
DateChooser.prototype.hide = function() {
    this._div.style.visibility = "hidden";
    this._div.style.display = "none";
    this._div.innerHTML = "";
    this._isVisible = false;
}

// Shows the chooser on the page
DateChooser.prototype.show = function() {
    // calculate the position before making it visible
    var inputPos = DateChooser_getAbsolutePosition(this._input);
    this._div.style.top = (inputPos[0] + this._input.offsetHeight) + "px";
    this._div.style.left = (inputPos[1]) + "px";
    this._div.innerHTML = "<center>"+this.createChooserHtml()+"</center>";
    this._div.style.display = "block";
    this._div.style.visibility = "visible";
    this._div.style.position = "absolute";
    this._div.style.width = "220px";
    this._isVisible = true;
    document.getElementById(this._prefix + "month").focus();
}

// Sets the date to what is in the input box
DateChooser.prototype.initializeDate = function() {
    if (this._input.value != null && this._input.value != "") {
        this._date = Date.parseDate(this._input.value, this._format);
    }
    else {
        this._date = new Date();
    }
}

// Sets the date attached to the chooser
DateChooser.prototype.setDate = function(date) {
    this._date = date ? date : new Date();
}

// Sets the time portion of the date attached to the chooser
DateChooser.prototype.setTime = function(hour, minute) {
    this._date.setHours(hour);
    this._date.setMinutes(minute);
}

// Creates the HTML for the whole chooser
DateChooser.prototype.createChooserHtml = function() {
    // Ajout du lien 'mois précédant'
    var formHtml = "<span class=\"divSuivPrec\" onclick=\"DateChooser_moisPrecedent('"
        + this._prefix + "');\">&lt;&nbsp;</span>";
    formHtml += "<input type=\"hidden\" name=\""
        + this._prefix + "inputId\" value=\""
        + this._input.getAttribute('id') + "\">"
        + "\r\n  <select name=\"" + this._prefix 
        + "month\" id=\"" + this._prefix 
        + "month\" onChange=\"DateChooser_DateChange(this.form, '"
        + this._prefix + "');\">";
    for (var monIndex = 0; monIndex <= 11; monIndex++) {
        formHtml += "\r\n    <option value=\"" + monIndex + "\""
            + (monIndex == this._date.getMonth() ? " selected=\"1\"" : "")
            + ">" + Date.monthNames[monIndex] + "</option>";
    }
    formHtml += "\r\n  </select>\r\n  <select name=\""
        + this._prefix + "year\" id=\""
        + this._prefix + "year\" onChange=\"DateChooser_DateChange(this.form, '"
        + this._prefix + "');\">";
    for (var i = this._start; i <= this._end; ++i) {
        formHtml += "\r\n    <option value=\"" + i + "\""
            + (i == this._date.getFullYear() ? " selected=\"1\"" : "")
            + ">" + i + "</option>";
    }
    formHtml += "\r\n  </select>";
    // Ajout du lien 'mois suivant'
    formHtml += "<span class=\"divSuivPrec\" onclick=\"DateChooser_moisSuivant('"
        + this._prefix + "');\">&nbsp;&gt;</span>";
    formHtml += this.createCalendarHtml();
    if (this._isTimeChooser) {
        formHtml += this.createTimeChooserHtml();
    }
    return formHtml;
}

// Creates the extra HTML needed for choosing the time
DateChooser.prototype.createTimeChooserHtml = function() {
    // Add hours
    var result = "\r\n  <select name=\"" + this._prefix + "hour\">";
    for (var i = 0; i < 12; ++i) {
        result += "\r\n    <option value=\"" + i + "\""
            + (((this._date.getHours() % 12) == i) ? " selected=\"1\">" : ">")
            + i + "</option>";
    }
    // Add extra entry for 12:00
    result += "\r\n    <option value=\"0\">12</option>";
    result += "\r\n  </select>";
    // Add minutes
    result += "\r\n  <select name=\"" + this._prefix + "min\">";
    for (var i = 0; i < 60; i += 15) {
        result += "\r\n    <option value=\"" + i + "\""
            + ((this._date.getMinutes() == i) ? " selected=\"1\">" : ">")
            + String.leftPad(i, 2, '0') + "</option>";
    }
    result += "\r\n  </select>";
    // Add AM/PM
    result += "\r\n  <select name=\"" + this._prefix + "ampm\">";
    result += "\r\n    <option value=\"0\""
        + (this._date.getHours() < 12 ? " selected=\"1\">" : ">")
        + "AM</option>";
    result += "\r\n    <option value=\"12\""
        + (this._date.getHours() >= 12 ? " selected=\"1\">" : ">")
        + "PM</option>";
    result += "\r\n  </select>";
    return result;
}

// Creates the HTML for the actual calendar part of the chooser
DateChooser.prototype.createCalendarHtml = function() {
    var result = "\r\n<div class=\"divVide\"></div><table cellspacing=\"0\" class=\"dateChooser\">"
        + "\r\n  <tr><th>Lun.</th><th>Mar.</th><th>Mer.</th>"
        + "<th>Jeu.</th><th>Ven.</th><th>Sam.</th><th>Dim.</th><th>Sem.</th></tr>\r\n  <tr>";
    // Fill up the days of the week until we get to the first day of the month
    // firstDay = 0 --> lundi
    var firstDay = this._date.getFirstDayOfMonth() -1;
    var lastDay = this._date.getLastDayOfMonth() -1;
    if (firstDay == -1)
        firstDay = 6;
    if (lastDay == -1)
        lastDay = 6;    
    if (firstDay != 0) {
        result += "<td class=\"celluleVide\" colspan=\"" + firstDay + "\">&nbsp;</td>";
    }
    // Fill in the days of the month
    var i = 0;
    var d = new Date();
    var currentMois = -1;
    var currentAnnee = -1;
    if (this._selDate != null){
        currentMois = this._selDate.getMonth();
        currentAnnee = this._selDate.getYear();
    }
    while (i < this._date.getDaysInMonth()) {
        if (((i++ + firstDay) % 7) == 0) {
               var tmpDay = new Date(this._date.getFullYear(),this._date.getMonth(), i-1);
               if(i==1 && firstDay != 0)
                    result += "<td class=\"celluleVide\" colspan=\"" + firstDay + "\">&nbsp;</td></tr>\r\n<tr>";
               else if(i!=1 || firstDay != 0)
                    result += "<td class=\"dateChooserSemaine\"><b>" + tmpDay.getWeek() + "</b></td></tr>\r\n<tr>";
        }
        var thisDay = new Date(
            this._date.getFullYear(),
            this._date.getMonth(), i);
        var js = '"DateChooser_SetDate(\''
            + this._input.getAttribute('id') + "', '"
            + thisDay.dateFormat(this._format) + '\');"'
        result += "\r\n    <td class=\"dateChooserActive"
            // If the date is the currently chosen date, highlight it
            + (i == d.getDate() && this._date.getMonth() == d.getMonth() && this._date.getYear() == d.getYear() ? " dateToday" : "")
            + (i == this._date.getDate() && this._date.getMonth() == currentMois && this._date.getYear() == currentAnnee ? " dateChooserActiveToday" : "")
            + "\" onClick=" + js + ">" + i + "</td>";
    }
    // Fill in any days after the end of the month
    if (lastDay != 6) {
        result += "<td class=\"celluleVide\" colspan=\"" + (6 - lastDay) + "\">&nbsp;</td>";
    }
    result += "<td class=\"dateChooserSemaine\"><b>" + new Date(this._date.getFullYear(), this._date.getMonth(), this._date.getDaysInMonth()).getWeek() + "</b></td>";
    result += "\r\n  </tr>\r\n</table>";
    var jour = d.getDate();
    if (jour < 10)
        jour = "0"+jour;
    var mois = d.getMonth()+1;
    if (mois < 10)
        mois = "0"+mois;
    var thisDay = new Date(d.getYear(),d.getMonth(), d.getDate());
    var js = '"DateChooser_SetDate(\''
        + this._input.getAttribute('id') + "', '"
        + thisDay.dateFormat(this._format) + '\');"'
    return result + "<div class=\"PaneDateDuJour\" onclick="+js+">Aujourd'hui : "+jour+"/"+mois+"/"+d.getFullYear()+"</div>";
}