
//registerLoadFunction(addCalendarEventListener);
addListenner(window, "load", addCalendarEventListener, true);

var jours_long = new Array(" dim "," lun "," mar "," mer "," jeu "," ven "," sam ");
var jours = new Array(" L "," M "," M "," J "," V "," S "," D ");
var mois_long = new Array(" janvier "," février "," mars "," avril "," mai "," juin "," juillet "," aout "," septembre "," octobre "," novembre "," d?cembre ");
var mois = new Array("Janv","Fev","Mar","Avr","Mai","Juin","Juil","Aou","Sept","Oct","Nov","Dec");

var annees_list = new Array('2000', '2001', '2002', '2003', '2004', '2005', '2006', '2007', '2008');

var d_date;
var d_jour;
var d_mois;
var d_year;
var champDate;
var calendarSplash = new splashBox('calendar-picker');


/**
 * Code html du calendrier
 */
function drawCalendar2()
{
  var boite = document.createElement('div');
  var calendarCode = '';
  calendarCode += '<table border="0" cellspacing="0" cellpadding="0">\r\n';
  calendarCode += '<thead>\r\n<tr><td colspan="7">';
  calendarCode += '<a href="javascript:void(0);" class="cal-prevmonth"><</a>\r\n';

  calendarCode += '<select id="cal-mois" name="cal-mois">';
  for (var i=0; i < mois.length; i++) {
      calendarCode += '<option value="' + i + '"';
      if (d_mois == i) calendarCode += ' selected="selected"';
      calendarCode += '>';
      calendarCode += mois[i];
      calendarCode += '</option>';
  }  calendarCode += '</select>\r\n';

  calendarCode += '<select id="cal-annee" name="cal-annee">\r\n';
  for (var i=0; i < annees_list.length; i++) {
      calendarCode += '<option value="' + annees_list[i] + '"';
      if (d_year == annees_list[i]) calendarCode += ' selected="selected"';
      calendarCode += '>';
      calendarCode += annees_list[i];
      calendarCode += '</option>\r\n';
  }
  calendarCode += '</select>\r\n';

  calendarCode += '<a href="javascript:void(0);" class="cal-nextmonth">></a>\r\n';
  calendarCode += '</td></tr></thead>\r\n';
  calendarCode += '<tbody>\r\n<tr>\r\n';

  // Construction du code des entetes (les jours)
  for (var i = 0; i < jours.length; i++) {
    calendarCode += '<th>' + jours[i] + '</th>\r\n';
  }
  calendarCode += '</tr>\r\n';
  calendarCode += '';

  for (var j = 0; j < 6; j++) {
      calendarCode += '\r\n<tr>';
      for (var i = 0; i < jours.length; i++) {
          calendarCode += '<td>';
          calendarCode += '<a href="javascript:void(0);"';
          calendarCode += '>';
          calendarCode += '</a>';
          calendarCode += '</td>\r\n';
      }
      calendarCode += '</tr>\r\n';
  }
  calendarCode += '</tbody>\r\n';
  calendarCode += '</table>\r\n';

  // Ajout de la table a la boite
  boite.innerHTML = calendarCode;
  calendarSplash.init(boite);
}





/**
 * Mois precedent
 */
function prevMonth()
{
  d_mois--;
  if (d_mois < 0) {
    d_mois = 11;
    d_year--;
  }
  refreshCalendar();
} // end of function "prevMonth()"




/**
 * Mois suivant
 */
function nextMonth()
{
  d_mois++;
  if (d_mois > 11) {
    d_mois = 0;
    d_year++;
  }
  refreshCalendar();
} // end of function "nextMonth()"




/**
 * Rafraichit le contenu du calendrier
 */
function refreshCalendar()
{
    DBG_msg('calendar: Updating.', 'info');
    var aujourdhui    = new Date();
    var jour_present  = aujourdhui.getDate();
    var mois_present  = aujourdhui.getMonth();
    var annee_present = aujourdhui.getYear();
    if (annee_present < 1000) {
      annee_present += 1900;
    }

    // lit la valeur en cours dans le champ date
    var dateParts = new Array(0, 0, 0);
    if (champDate.value && champDate.value != '' && champDate.value.indexOf('/') > 0) {
        dateParts = champDate.value.split('/');
        if (dateParts[0].charAt(0) == '0') {
            dateParts[0] = parseInt(dateParts[0].substring(1, dateParts[0].length));
        } else {
            dateParts[0] = parseInt(dateParts[0]);
        }

        if (dateParts[1].charAt(0) == '0') {
            dateParts[1] = parseInt(dateParts[1].substring(1, dateParts[1].length)) - 1;
        } else {
            dateParts[1] = parseInt(dateParts[1]) - 1;
        }

    } else if (champDate.value && champDate.value != '' && champDate.value.indexOf('-') > 0) {
        dateParts = champDate.value.split('-');
        //dateParts[0] = parseInt(dateParts[0]);

        if (dateParts[1].charAt(0) == '0') {
            dateParts[1] = parseInt(dateParts[1].substring(1, dateParts[1].length)) - 1;
        } else {
            dateParts[1] = parseInt(dateParts[1]) - 1;
        }

        if (dateParts[2].charAt(0) == '0') {
            dateParts[2] = parseInt(dateParts[2].substring(1, dateParts[2].length));
        } else {
            dateParts[2] = parseInt(dateParts[2]);
        }

        var temp = dateParts[2];
        dateParts[2] = dateParts[0];
        dateParts[0] = temp;
    }
    //alert(d_date + '/' + d_mois + '/' + d_year);

    // Lecture du code du calendrier, et rafra?chissement des donn?es
    var calendar      = document.getElementById('calendar-picker');
    var thead_list    = calendar.getElementsByTagName('thead');
    var select_list   = thead_list[0].getElementsByTagName('select');

    if (d_mois >= 0)
    select_list[0].selectedIndex = d_mois;

    select_list[0].onchange = function () { d_mois = this.selectedIndex; calendarSplash.toggleVisibility(calendarSplash.id, 'visible'); refreshCalendar(); return true;};

    if (d_year > 2000)
    select_list[1].selectedIndex = d_year - 2000;

    select_list[1].onchange = function () { d_year = this.options[this.selectedIndex].value; calendarSplash.toggleVisibility(calendarSplash.id, 'visible'); refreshCalendar(); return true;};

    var nav_list = thead_list[0].getElementsByTagName('a');
    nav_list[0].onclick = prevMonth;
    nav_list[1].onclick = nextMonth;

    var tbody_list = calendar.getElementsByTagName('tbody');
    var td_list    = tbody_list[0].getElementsByTagName('td');

    // Calcule le contenu du calendrier
    var data      = getCalendarData(d_mois, d_year, d_date);
    for (var j = 0; j < 6; j++) {
      for (var i = 0; i < 7; i++) {
        if (td_list[j * 7 + i]) {

          // Suppression des liens dej? pr?sents
          var liens = td_list[j * 7 + i].getElementsByTagName('a');
          for (var k = 0; k < liens.length; k++) {
            if (liens[k] && liens[k].parentNode) {
              liens[k].parentNode.removeChild(liens[k]);
            }
          }

          // Recriture du contenu
          if (data[j] && data[j][i]) {
            var a       = document.createElement('a');
            var content = document.createTextNode(data[j][i]);
            a.appendChild(content);
            a.href    = "javascript:void(0);";
            a.onclick = function () { return pickDate(this); };
            if (data[j][i] == dateParts[0] && d_mois == dateParts[1] && d_year == dateParts[2]) {
              a.className = 'valeur-courante';
            } else {
                if (data[j][i] == jour_present && d_mois == mois_present && d_year == annee_present) {
                  if (i == 5 || i == 6) {
                    a.className = 'weekendselected';
                  } else {
                    a.className = 'selected';
                  }
                } else if (i == 5 || i == 6) {
                  a.className = 'weekend';
                }
            }
            td_list[j * 7 + i].appendChild(a);
          }
        } // end if (liste TD)
      } // end for
    } // end for

} // end of function "refreshCalendar()"




/**
 * Ecrit une date dans le champs d?sign?
 */
function pickDate(a)
{
  champDate.value = '';
  if (a.firstChild.nodeValue < 10) {
    champDate.value = '0';
  }
  champDate.value += a.firstChild.nodeValue + '/';
  if (d_mois < 9) {
    champDate.value += '0';
  }
  champDate.value += (d_mois + 1) + '/' +  d_year;

  DBG_msg('calendar: Writing date (' + champDate.value + ').', 'info');

  calendarSplash.toggleVisibility(calendarSplash.id, 'hidden');

  return false;

} // end of function "pickDate()"





/**
 * Calcule le contenu du tableau
 */
function getCalendarData(month, year, date)
{
  var cal       = new Array;
  var dayscount = getMonthLength(month, year);
  var ce_jour    = new Date(year, month, 1);
  var debut_jour = (ce_jour.getDay() - 1);
  if (debut_jour < 0) {
    debut_jour += 7;
  }
  jour = 1;
  for (var j = 0; j < 6; j++) {
    for (var i = 0; i < 7; i++) {
        if (!cal[j]) {
          cal[j] = new Array;
        }
        if ((j * 7 + i) >= debut_jour && jour <= dayscount) {
          cal[j][i] = jour;
          jour++;
        }
    }
  }
  return cal;
} // end of function "getCalendarData()"




/**
 * Calcule le nombre de jour dans un mois
 */
function getMonthLength(month, year)
{
  if (month == 1) {
    if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
       return 29;
    } else {
       return 28;
    }
  } else if (month == 3 || month == 5 || month == 8 || month == 10) {
    return 30;
  }
  return 31;
} // end of function "getMonthLength()"



/**
 * Attribution des gestionnaires d'?v?nements
 */
function addCalendarEventListener()
{
  if(document.getElementsByTagName) {
    DBG_msg('calendar: updating fields and adding code...', 'info');
    var inputs 	   = document.getElementsByTagName('input');
    for (var i=0; i < inputs.length; i++) {

      if (/calendar-field/.test(inputs[i].className)) {
          var a = document.createElement('a');
          a.className = 'calendar-switch';
          a.href = 'javascript:void(0);';
          a.id   = inputs[i].id + '-cal-' + i;
          a.name = inputs[i].id + '-cal-' + i;
          a.onclick = function (e) { return showCalendar(e, this); } ;

          var sampNode = inputs[i].parentNode.getElementsByTagName('samp');
          
          if (sampNode[0]) {
            var sampClone = sampNode[0].cloneNode(true);
          }
          inputs[i].parentNode.appendChild(a);
          
          if (sampNode[0] && sampClone) {
            inputs[i].parentNode.appendChild(sampClone);
            sampNode[0].parentNode.removeChild(sampNode[0]);
          }
      }
    } // end for
  }

  // ajoute le code du calendrier à la fin de la page
  drawCalendar2();
  DBG_msg('calendar: Done.', 'info');

  return true;
} // end of function "addCalendarEventListener()"



/**
 * Affiche le calendrier
 */
function showCalendar(e, anchor)
{
    champDate = anchor.parentNode.getElementsByTagName('input')[0];
    date   = new Date();

    if (champDate.value && champDate.value != '' && champDate.value.indexOf('/') > 0) {
        dateParts = champDate.value.split('/');

        if (dateParts[0].charAt(0) == '0') {
            d_date = parseInt(dateParts[0].substring(1, dateParts[0].length));
        } else {
            d_date = parseInt(dateParts[0]);
        }

        if (dateParts[1].charAt(0) == '0') {
            d_mois = parseInt(dateParts[1].substring(1, dateParts[1].length)) - 1;
        } else {
            d_mois = parseInt(dateParts[1]) - 1;
        }
        d_year = parseInt(dateParts[2]);


    } else if (champDate.value && champDate.value != '' && champDate.value.indexOf('-') > 0) {
        dateParts = champDate.value.split('-');

        d_year = parseInt(dateParts[0]);

        if (dateParts[1].charAt(0) == '0') {
            d_mois = parseInt(dateParts[1].substring(1, dateParts[1].length)) - 1;
        } else {
            d_mois = parseInt(dateParts[1]) - 1;
        }

        if (dateParts[2].charAt(0) == '0') {
            d_date = parseInt(dateParts[2].substring(1, dateParts[2].length));
        } else {
            d_date = parseInt(dateParts[2]);
        }

    } else {
        d_mois = date.getMonth();
        d_year = date.getYear();
        if (d_year < 1000) {
          d_year += 1900;
        }
    }

    if (d_date < 0) d_date = date.getDate();
    if (d_mois < 0) d_mois = date.getMonth();
    if (d_year < 2000) d_year = date.getYear();
    if (d_year < 1000) {
      d_year += 1900;
    }

    //alert(d_date + '/' + d_mois + '/' + d_year);

  refreshCalendar();
  calendarSplash.attachToAnchor(anchor.id, 20, -120);
  calendarSplash.toggleVisibility(calendarSplash.id, 'visible');

  return false;
} // end of function "showCalendar()"


