/* calendar settings */

var cCal = null; // global object calendar

// handler as object  -  target as object - last_date as french date jj/mm/yyyy
function openCal(handler,target) {
	if (cCal) return false;
	var pt = eltPos(handler);// le calendrier doit s'ouvrir sous cet élément
	// crée le calque dans lequel s'inscrit le calendrier
	var el = document.createElement("DIV")
		el.style.position = "absolute"
		el.style.left = pt.x+"px";
		el.style.top = pt.y +1+handler.offsetHeight+"px";
		el.style.visibility = "visible"
		el.style.padding= "0px 0px 0px 0px"
		document.body.appendChild(el);
	// make date object
	var last_date = str2dt(target.value);
	if(!last_date) last_date=new Date();
	//
	var monday_first = true;
	// create calendar and append to document
	cCal = new Calendar(monday_first, last_date, on_select);
	cCal.handler=handler;  // l'élément qui a appelé le calendrier
	cCal.target=target;  // l'élément qui reçoit la valeur du calendrier
	cCal.container=el;  // le calque qui contient le calendrier
	el.appendChild(cCal.element);
}

// appelé sur clic dans le calendrier
function on_select(cal,date) {
	last_date = cal.date;
	cal.target.value = dt2str(date);
	cal.target.onchange(); // new 20031106 - envoi un événement onchange sur le champ.
	cal.target.focus();
	closeCal();
}

function closeCal(){
	if (cCal){
		cCal.container.style.visibility = "hidden";
		cCal.container.removeChild(cCal.container.childNodes[0]);
		cCal = null;
	}
}

// ======================== french date functions ==========================
// french date string to date object - if empty or null return current date
function str2dt(dtstr){
	if (!dtstr) return null;
	var reShortDate = /^(\d{1,2})(.)(\d{1,2})\2(\d{2}|\d{4})$/;
	var r = dtstr.match(reShortDate); // is the format ok? 
	if(!r)return null;
	var year=(r[4]<100)?Number(r[4])+2000:Number(r[4]);
	return (new Date(year,r[3]-1,r[1]));
}
// date object to french date string
function dt2str(d){return(new String(d.getDate()+"/"+(d.getMonth()+1)+"/"+d.getFullYear()));}

/* ======================== calendar engine ==================================
Author: Mihai Bazon, September 2002 * http://students.infoiasi.ro/~mishoo
modified Salto Arte 2002 * Distributed under the GNU General Public License.

changes : 2002-10-17 : rendu compatible avec IE5.00 windows
*/
var month_names = new Array('Jan','Fév','Mar','Avr','Mai','Jun','Jul','Aoû','Sep','Oct','Nov','Dec');
var weekday_names = new Array("Dim","Lun","Mar","Mer","Jeu","Ven","Sam","Dim");
//var month_names = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
// var weekday_names = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun");
var daysPerMonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);

function isRelated(el,evt) {
  var related = evt.relatedTarget;
  if (!related) {
    var type=evt.type;
    if(type=="mouseover")related=evt.fromElement;
    else if(type=="mouseout")related=evt.toElement;
  }
  while (related){if(related==el)return true; related=related.parentNode;}
  return false;
}

function bisextile(year){return((0==(year%4))&&((0!=(year%100))||(0==(year%400))));}
function getMonthDays(y,m){return(bisextile(y)&&m==1)?29:daysPerMonth[m];}

function remClass(el,className) {
  if (!(el&&el.className))return;
  var classes = el.className.split(" ");
  var newClasses = new Array();
  for (i=0;i<classes.length;++i) {
  	if(classes[i]!=className){
		 // skip bug Array.push with ie5.0
		 if (Array.push)  newClasses.push(classes[i]); else newClasses[newClasses.length] = classes[i];
	}
  }
 el.className = newClasses.join(" ");
}
function addClass(el,className){el.className+=" "+className;}

var g_currentTable = null;

function tableMouseUp(ev) {
  if (!g_currentTable) return;
  var el = g_currentTable.calendar.activeDateEl;
  if (!el)return;
  var target = getTargetElement(ev);
  remClass(el,"active");
  if (target==el||target.parentNode==el)cellClick(el);
  remEvt(document, "mouseup", tableMouseUp);
  remEvt(document, "mouseover", tableMouseOver);
  remEvt(document, "mousemove", tableMouseOver);
  el = null;
  g_currentTable = null;
  stopEvt(ev);
}

function tableMouseOver(ev) {
  if (!g_currentTable) return;
  var el = g_currentTable.calendar.activeDateEl;
  var target = getTargetElement(ev);
  if (target==el||target.parentNode==el)addClass(el,"hilite active");
  else {
    remClass(el,"active");
    remClass(el,"hilite");
  }
  stopEvt(ev);
}

function tableMouseDown(ev){if(getTargetElement(ev)==getElement(ev))stopEvt(ev);}

function dayMouseDown(ev) {
  var el = getElement(ev);
  addClass(el, "hilite active");
  el.calendar.activeDateEl = el;
  g_currentTable = el.calendar.element;
  addEvt(document,"mouseup",tableMouseUp);
  addEvt(document,"mouseover",tableMouseOver);
  addEvt(document,"mousemove",tableMouseOver);
  stopEvt(ev);
}

function dayMouseOver(ev){
  var el = getElement(ev);
  if (isRelated(el,ev)||g_currentTable) return false;
  if (el.ttip)el.calendar.tooltips.firstChild.data = el.ttip;
  addClass(el, "hilite");
  stopEvt(ev);
}

function dayMouseOut(ev) {
  var el = getElement(ev);
  if (isRelated(el,ev) || g_currentTable) return false;
  remClass(el, "hilite");
  //if (el.calendar.tooltips) el.calendar.tooltips.firstChild.data = "";
  stopEvt(ev);
}

function cellClick(el) {
	var undefined;
    var date = (el.navtype==0) ? new Date():new Date(el.calendar.date);
    var year = date.getFullYear();
    var mon = date.getMonth();
    var setMonth = function (mon) {
	      var day = date.getDate();
	      var max = getMonthDays(year,mon);
	      if (day > max) date.setDate(max);
	      date.setMonth(mon);
	 }
// document.write ("tested" + el.navtype);
	switch (el.navtype) {
	case undefined :
		remClass(el.calendar.currentDateEl,"today");
	    addClass(el,"today");
	    if (el.calendar.yourHandler) el.calendar.yourHandler(el.calendar,el.caldate);
		return true;
	break;
	
	case 200: // bouton fermer le calendrier (pas de sélection)
		closeCal();
      	return false;
	break;
	
	case -2: // année -1
      if (year > 1970) date.setFullYear(year - 1);
    break;
	  
    case -1: // mois -1
      if (mon > 0) setMonth(mon - 1);
      else if (year-- > 1970){date.setFullYear(year);setMonth(11);}
      break;
	  
    case 1: // mois +1
      if (mon < 11) setMonth(mon + 1);
      else if (year < 2050){date.setFullYear(year + 1);setMonth(0);}
      break;
	  
    case 2:  // année +1
      if (year < 2050) date.setFullYear(year+1);
      break;
} // end switch
    el.calendar.setDate(date);
}

function Calendar_set_date(date) { this.init(this.mondayFirst, date);}

function Calendar_init(mondayFirst, date) {
  this.mondayFirst = mondayFirst;
  this.date = new Date(date);

  var month = date.getMonth();
  var mday = date.getDate();
  var year = date.getFullYear();
  var no_days = getMonthDays(year, month);
  date.setDate(1);
  var wday = date.getDay();
  var MON = mondayFirst ? 1 : 0;
  var SAT = mondayFirst ? 5 : 6;
  var SUN = mondayFirst ? 6 : 0;
  if (mondayFirst) wday = (wday > 0) ? (wday - 1) : 6;

  var iday = 1;
  var row = this.element.getElementsByTagName("tbody")[0].firstChild;
  for (var i = 0; i < 6; ++i, row = row.nextSibling) {
    var cell = row.firstChild;
    if (i == 5 && iday > no_days) { row.className = "emptyrow"; break; }
    else row.className = "daysrow";
    for (var j = 0; j < 7; ++j, cell = cell.nextSibling) {
      if ((!i && j < wday) || iday > no_days)
	cell.className = "emptycell";
      else {
	cell.firstChild.data = iday;
	cell.className = "day";
	date.setDate(iday);
	cell.caldate = new Date(date);
	cell.ttip = weekday_names[wday + MON] + ", " + iday + " " + month_names[month] + " " + year;
	if (iday == mday) { addClass(cell, "today"); this.currentDateEl = cell; }
	if (wday == SAT || wday == SUN) addClass(cell, "weekend");
	++wday; ++iday;
	if (wday == 7) wday = 0;
      }
    }
  }

  this.title.firstChild.data = month_names[month] + ", " + year;
}

function Calendar_displayWeekdays() {
  var thead = this.element.getElementsByTagName("thead")[0];
  var MON = this.mondayFirst ? 0 : 1;
  var SUN = this.mondayFirst ? 6 : 0;
  var SAT = this.mondayFirst ? 5 : 6;
  var cell = thead.getElementsByTagName("tr")[1].firstChild;
  for (var i = 0; i < 7; ++i, cell = cell.nextSibling) {
    if (!i)
      if (this.mondayFirst) cell.ttip = "Display Sunday first";
      else cell.ttip = "Display Monday first";
    cell.className = "day name";
    if (i == SUN || i == SAT) addClass(cell, "weekend");
    cell.firstChild.data = weekday_names[i + 1 - MON].substr(0,2);
  }
}
// class calendar
function Calendar(mondayFirst, dateStr, yourHandler) {
	// procedures
  this.init = Calendar_init;
  this.setDate = Calendar_set_date;
  this.displayWeekdays = Calendar_displayWeekdays;
  if (yourHandler) this.yourHandler = yourHandler;
	// variables
  this.mondayFirst = mondayFirst;
  this.handler=null;  // l'élément qui a appelé le calendrier
  this.target=null;  // l'élément qui reçoit la valeur du calendrier
  this.container=null;  // le calque qui contient le calendrier
  var date = (dateStr)?new Date(dateStr):new Date();

  var table = document.createElement("table");
  this.element = table;
  table.className = "calendar";
  table.cellSpacing = 0;
  table.cellPadding = 0;
  table.calendar = this;
  addEvt(table,"mousedown",tableMouseDown);

  // header (navigation)
  var thead = document.createElement("thead");
  table.appendChild(thead);
  var row = document.createElement("tr");
  thead.appendChild(row);
  row.className = "headrow";
  var cal = this;
  var cell = null;

  var add_evs = function (el) {
    addEvt(el, "mouseover", dayMouseOver);
    addEvt(el, "mousedown", dayMouseDown);
    addEvt(el, "mouseout", dayMouseOut);
  }

  var hh = function (text, cs, navtype) {
    cell = document.createElement("td");
    row.appendChild(cell);
    if (cs != 1) { cell.colSpan = cs; cell.className = "title"; }
    else cell.className = "head";
    add_evs(cell);
    cell.calendar = cal;
    cell.navtype = navtype;
    cell.appendChild(document.createTextNode(text));
    return cell;
  }

  hh("<<", 1, -2).ttip="Annee precedente";
  hh("<", 1, -1).ttip="Mois precedent";
  this.title = hh("now", 3, 0);
  this.title.ttip="Aujourd'hui";
  hh(">", 1, 1).ttip="Mois suivant";
  hh(">>", 1, 2).ttip="Annee suivante";

  row = document.createElement("tr");
  thead.appendChild(row);
  row.className = "daynames";
  for (var i = 0; i < 7; ++i) {
    cell = document.createElement("td");
    row.appendChild(cell);
    cell.appendChild(document.createTextNode(""));
  }

  this.displayWeekdays();

  var tbody = document.createElement("tbody");
  table.appendChild(tbody);

  for (var i = 0; i < 6; ++i) {
    row = document.createElement("tr");
    tbody.appendChild(row);
    for (var j = 0; j < 7; ++j) {
      cell = document.createElement("td");
      row.appendChild(cell);
      cell.appendChild(document.createTextNode(""));
      cell.calendar = this;
      add_evs(cell);
    }
  }

  var tfoot = document.createElement("tfoot");
  table.appendChild(tfoot);
  row = document.createElement("tr");
  tfoot.appendChild(row);
  row.className = "footrow";
  for (var i = 0; i < 2; ++i) {
    cell = document.createElement("td");
    row.appendChild(cell);
    cell.calendar = this;
    if (!i) {
      this.tooltips = cell;
      cell.className = "ttip";
      cell.colSpan = 5;
      cell.appendChild(document.createTextNode("Faites un choix"));
    } else {
      cell.colSpan = 2;
      add_evs(cell);
      cell.appendChild(document.createTextNode("Fermer"));
      cell.className = "button";
      cell.navtype = 200;
      cell.ttip = "Fermer";
    }
  }
  this.init(mondayFirst, date);
}

