function show_calendar(str_target, str_datetime) {
   var arr_months = ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"];
   var week_days = ["Di", "Lu", "Ma", "Me", "Je", "Ve", "Sa"];
   var n_weekstart = 1; // day week starts from (normally 0 or 1)
 
// Si la date est invalide : Initialisation avec la date du jour
var test_date = /^(\d+)\/(\d+)\/(\d+)$/;
if (!test_date.exec(str_datetime)) { 	var d = new Date();
											var str_datetime = d.getDate()+ "/" +(d.getMonth() + 1) + "/"+  d.getFullYear();
										 }
 
 
   var dt_datetime = (str_datetime == null || str_datetime =="" ?  new Date() : str2dt(str_datetime));
 
/* JOUR MOIS ET ANNEE PRESENTE*/
   var this_Day = new Date().getDate()
   var this_Month = new Date().getMonth()
	var this_Year = new Date().getFullYear()
 
/* MOIS PRECEDENT */
   var dt_prev_month = new Date(dt_datetime);
   dt_prev_month.setMonth(dt_datetime.getMonth()-1);
   var dt_next_month = new Date(dt_datetime);
   dt_next_month.setMonth(dt_datetime.getMonth()+1);
   
/* ANNEE PRECEDENTE */   
   var dt_prev_year = new Date(dt_datetime);
   dt_prev_year.setFullYear(dt_datetime.getFullYear()-1);
   var dt_next_year = new Date(dt_datetime);
   dt_next_year.setFullYear(dt_datetime.getFullYear()+1);
 
/* PREMIER JOUR DU MOIS */
   var dt_firstday = new Date(dt_datetime);
   dt_firstday.setDate(1);
   dt_firstday.setDate(1-(7+dt_firstday.getDay()-n_weekstart)%7);
 
/* DERNIER JOUR DU MOIS    */
   var dt_lastday = new Date(dt_next_month);
   dt_lastday.setDate(0);
 
/* TITRE DU CALENDRIER */
   var title_calendar=(str_target=='dd')?'DATE D\'ARRIVEE':'Choisir la date';
   
   // html generation (feel free to tune it for your particular application)
   // ENTETE CALENDRIER
   var StringYear=dt_datetime.getFullYear().toString().substring(dt_datetime.getFullYear().toString().length-2,dt_datetime.getFullYear().toString().length)
   var str_buffer = new String (
      "<table class=\"clsOTable\" cellspacing=\"0\" border=\"0\" width=\"100%\">\n"+
      "<tr>\n<td bgcolor=\"#4682B4\">"+
      "<table cellspacing=\"1\" cellpadding=\"3\" border=\"0\" width=\"100%\">\n"+
 
   //ENTETE TABLEAU
   "<tr>\n   <td bgcolor=\"#FFCC00\" style='text-align:center;color:black;font-family:verdana;font-weight:bold;font-size:11px;' colspan=\"6\">"+title_calendar+"<\/td>\n"+
   "<td bgcolor=\"#FFCC00\" style=\"text-align:center;color:navy;font-family:verdana;font-weight:bold;font-size:10px;background-color:silver;border:outset 2px white;cursor:pointer;\" onclick=\"document.getElementById('DivCalendar').style.display='none';\">X<\/td>\n "+
   "<\/tr>\n"+
   
   
   
// Ligne Année précédente / suivante
      "<tr>\n   <td bgcolor=\"#FFCC00\" style='text-align:center;color:white;font-family:verdana;font-size:8px;' ><a href=\"javascript:show_calendar('"+str_target+"', '"+ 
      dt2dtstr(dt_prev_year)+"');\">"+
      "<img src=\"modules/taxi/calendrier/img/prev_year.gif\" width=\"16\" height=\"16\" border=\"0\""+
      " alt=\"Année précédente\"></a></td>\n"+
      "   <td align=\"center\" bgcolor=\"#FFCC00\" colspan=\"5\">"+
      "<font color=\"white\" face=\"tahoma, verdana\" size=\"2\">"
      +" 20"+StringYear+"</font></td>\n"+
      "   <td bgcolor=\"#FFCC00\" align=\"right\"><a href=\"javascript:show_calendar('"
      +str_target+"', '"+dt2dtstr(dt_next_year)+"');\">"+
      "<img src=\"modules/taxi/calendrier/img/next_year.gif\" width=\"16\" height=\"16\" border=\"0\""+
 
      " alt=\"Année suivante\"></a></td>\n</tr>\n"+
 
// Ligne Mois précédent / suivant
      "<tr>\n   <td bgcolor=\"#4682B4\"><a href=\"javascript:show_calendar('"+
      str_target+"', '"+ dt2dtstr(dt_prev_month)+"'); \">"+
      "<img src=\"modules/taxi/calendrier/img/prev.gif\" width=\"16\" height=\"16\" border=\"0\""+
      " alt=\"MP\" title=\""+dt_prev_month+"\"></a></td>\n"+
      "   <td align=\"center\" bgcolor=\"#4682B4\" colspan=\"5\">"+
      "<font color=\"white\" face=\"tahoma, verdana\" size=\"2\">"
      +arr_months[dt_datetime.getMonth()]+" 20"+StringYear+"</font></td>\n"+
      "   <td bgcolor=\"#4682B4\" align=\"right\"><a href=\"javascript:show_calendar('"
      +str_target+"', '"+dt2dtstr(dt_next_month)+"');  \">"+
      "<img src=\"modules/taxi/calendrier/img/next.gif\" width=\"16\" height=\"16\" border=\"0\""+
      " alt=\"MS\"  title=\""+dt_next_month+"\" ></a></td>\n</tr>\n"
 
   ); //end newstring
 
   var dt_current_day = new Date(dt_firstday);
   
   // print weekdays titles
   str_buffer += "<tr>\n";
   for (var n=0; n<7; n++)
      str_buffer += "   <td bgcolor=\"#87CEFA\">"+
      "<font color=\"white\" face=\"tahoma, verdana\" size=\"2\">"+
      week_days[(n_weekstart+n)%7]+"</font></td>\n";
 
 
   // print calendar table
   str_buffer += "</tr>\n";
   while (dt_current_day.getMonth() == dt_datetime.getMonth() ||
      dt_current_day.getMonth() == dt_firstday.getMonth()) {
 
      // print row header
      str_buffer += "<tr>\n";
      for (var n_current_wday=0; n_current_wday<7; n_current_wday++) {
            if (dt_current_day.getDate() == this_Day &&  dt_current_day.getMonth() == this_Month && dt_current_day.getFullYear()==this_Year ){
 
              // case aujourd'hui
               str_buffer += "   <td bgcolor=\"#FFB6C1\" align=\"right\">";}
               
            else {
            		if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6){
	               	// case de weekend 
   		            	str_buffer += "   <td bgcolor=\"#DBEAF5\" align=\"right\">";
   		            	}
		          else{
       	        	// jour ouvres du mois
          		     	str_buffer += "   <td bgcolor=\"white\" align=\"right\">";
						}
				  }
 
		
if( dt_current_day.getMonth() == this_Month && dt_current_day.getFullYear() == this_Year ){
// mois en cours et jours précédents grisés
           if ((dt_current_day.getDate() >= dt_datetime.getDate()) && (dt_current_day.getMonth() == dt_datetime.getMonth())){
                // jours du mois en cours actifs
               str_buffer += "<a style=\"cursor:pointer;\" onclick=\"document.getElementById('"+str_target+"').value='"+dt2dtstr(dt_current_day)+"'; document.getElementById('DivCalendar').style.display='none'; \">"+
               "<font color=\"black\" face=\"tahoma, verdana\" size=\"2\">";}
   
           else {
               // jours des mois précédents et suivants en gris
               str_buffer += "<font color=\"gray\" face=\"tahoma, verdana\" size=\"2\">";}
                
}
else {
if( (dt_current_day.getMonth() > this_Month && dt_current_day.getFullYear() ==this_Year ) || dt_current_day.getFullYear() >this_Year ){ 
// mois futurs
           if ( dt_current_day.getMonth() == dt_datetime.getMonth()){
 
               // jours du mois en cours actifs
               str_buffer += "<a style='cursor:pointer;' onclick=\"document.getElementById('"+str_target+"').value='"+dt2dtstr(dt_current_day)+"'; document.getElementById('DivCalendar').style.display='none';\">"+
               "<font color=\"black\" face=\"tahoma, verdana\" size=\"2\">";}
   
           else {
               // jours des mois précédents et suivants en gris
               str_buffer += "<font color=\"gray\" face=\"tahoma, verdana\" size=\"2\">";}
                
}
 
// mois précédents ...  
else{		if( (dt_current_day.getMonth() < this_Month && dt_current_day.getFullYear() == this_Year) || ( dt_current_day.getFullYear() < this_Year)){              
               str_buffer += "<a><font color=\"gray\" face=\"tahoma, verdana\" size=\"2\">";
				}
	}
}         
               
               str_buffer += dt_current_day.getDate()+"</font></a></td>\n"; 
               
               
            dt_current_day.setDate(dt_current_day.getDate()+1);
      }
   
 
      // print row footer
      str_buffer += "</tr>\n";
   }
     
   // print calendar footer
   str_buffer +=  "</tr>\n</td>\n</table>\n" ;
 
 
     
   fenCalendrier=document.getElementById('DivCalendar');
   fenCalendrier.innerHTML=str_buffer;
   fenCalendrier.style.top=document.getElementById(str_target).offsetTop+"px";
   fenCalendrier.style.left=Number(document.getElementById(str_target).offsetLeft)+Number(document.getElementById(str_target).offsetWidth)+200+"px";
   fenCalendrier.style.display="block"
  
 
 
   
 
 
 
}
// datetime parsing and formatting routines. modify them if you wish other datetime format
function str2dt (str_datetime) {
   var re_date = /^(\d+)\/(\d+)\/(\d+)$/;
   if (!re_date.exec(str_datetime))
      return alert("Invalid Datetime format: "+ str_datetime);
   return (new Date (RegExp.$3, RegExp.$2-1, RegExp.$1, RegExp.$4, RegExp.$5, RegExp.$6));
}
 
 
 
/***********************************
* Formatage de date pour affichage *
***********************************/
 
function dt2dtstr (dt_datetime) {
   var FormatedDate=""
   
   FormatedDate+=(dt_datetime.getDate().toString().length==1)?"0"+dt_datetime.getDate().toString():dt_datetime.getDate().toString();
   FormatedDate+="/";
   FormatedDate+=((dt_datetime.getMonth()+1).toString().length==1)?"0"+(dt_datetime.getMonth()+1).toString():(dt_datetime.getMonth()+1).toString();
   FormatedDate+="/";
   FormatedDate+="20"+dt_datetime.getFullYear().toString().substring(dt_datetime.getFullYear().toString().length-2,dt_datetime.getFullYear()).toString()
   return FormatedDate;
}
 
function dt2tmstr (dt_datetime) {
   return (new String (dt_datetime.getHours()+":"+dt_datetime.getMinutes()+":"+dt_datetime.getSeconds()));
}
