
function free_date_picker(obj_name, layer_name, text_to ,type, hide_self, language, url, event_date, jsFunction, jsDoubleClickFunction)
{
	////////////////////////////////////////////////////////////////////////////////////
	// IF str < lng, add leading 0 to complete the str
	function leading_zeros(str, lng)
	{
		// param validation
		if(lng == null)
			lng = 2;

		var str = str.toString();

		while(str.length < lng)
			str = '0' + str;

		return str;
	}



	////////////////////////////////////////////////////////////////////////////////////
	// Nbr days for this month
	function returnDays(date)
	{
		var year = date.getFullYear();
		var month = date.getMonth();
		var days = 31;

		if( month == 3 || month == 5 || month == 8 || month == 10 ){
			days = 30;
		}
		else if(month == 1){
			days = 28;

			if(year % 4 == 0){
				days = 29;

				if(year % 100 == 0){
					days = 28;

					if(year % 400 == 0){
						days = 29;
					}
				}
			}
		}

		return(days);
	}

	////////////////////////////////////////////////////////////////////////////////////
	// Return last month
	function returnLastMonth(date)
	{
		var year = date.getFullYear();
		var month = date.getMonth();
		var dt = new Date();

		month --;

		if(month == -1){
			month = 11;
			year --;
		}

		dt.setYear(year);
		dt.setDate(1);
		dt.setMonth(month);

		return dt;
	}

	////////////////////////////////////////////////////////////////////////////////////
	// Retourne le mois suivant
	function returnNextMonth(date)
	{
		var year = date.getFullYear();
		var month = date.getMonth();
		var dt = new Date();

		month ++;

		if(month == 12){
			month = 0;
			year ++;
		}

		dt.setYear(year);
		dt.setDate(1);
		dt.setMonth(month);

		return dt;
	}

	////////////////////////////////////////////////////////////////////////////////////
	// Retourne le nom du mois

	function return_month_name(date)
	{
		switch(language){
			case("en"):
				var month = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 
					'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
				break;
			case("fr"):
			default:
				var month = new Array('January', 'February', 'March', 'April', 'May', 'June', 
					'July', 'August', 'September', 'October', 'November', 'December');
		}

		return month[date.getMonth()];
	}

	////////////////////////////////////////////////////////////////////////////////////
	this.setto = function(eng_date)
	{
		// input text
		if(type == 1)
			document.getElementById(text_to).value = eng_date;
		// span, div ...
		if(type == 2)
			document.getElementById(text_to).innerHTML = eng_date;
	}

	////////////////////////////////////////////////////////////////////////////////////
	this.write_calendar = function(date)
	{
		var nb_days_last_month = 0;
		var cnt_days = 0;
		var days_month = 0;
		var str = new String();
		var style = new String();
		var next_month = new Date();
		var last_month = new Date();
		var today = new Date();

		var date = new Date(date);
		var last_year = new Date(date);
		var next_year = new Date(date);

		date.setDate(1);								// le premier du mois
		next_month = returnNextMonth(date);				// le mois précédent
		last_month = returnLastMonth(date);				// le mois suivant
		nb_days_last_month = returnDays(last_month);	// nombre jours mois précédent
		cnt_days = -date.getDay()+1;					// compteur de jours, part le dimanche du début du mois
		days_month = returnDays(date);					// nombre de jours mois sélectionné
		str = '';										// forge la chaîne de caractères à mettre dans la div

		next_year.setYear(date.getFullYear() + 1);		// année précédente
		last_year.setYear(date.getFullYear() - 1);		// année suivante


		str += '<table cellspacing="0" cellpadding="2" border="0" width="100%" bgcolor="white">';

		str += '<tr width="100%">';

		// année précédente
		str += ' <td colspan="1" align="left"><a href="' + "javascript:" + 
			obj_name + ".write_calendar('" + eval(last_year) + "')" + ';"><--</a></td>';
		// mois précédent
		str += ' <td colspan="1" align="left"><a href="' + "javascript:" + 
			obj_name + ".write_calendar('" + eval(last_month) + "')" + '"><-</a></td>';

		// libellé mois année
		str += ' <td colspan="3" align="center" nowrap>&nbsp;&nbsp;<strong>' 
		str += return_month_name(date) + ' ' + date.getFullYear();
		str += '</strong>&nbsp;&nbsp;</td>';

		// mois suivant
		str += ' <td colspan="1" align="right"><a href="' + "javascript:" + 
			obj_name + ".write_calendar('" + eval(next_month) + "')" + '">-></a></td>';
		// année suivante
		str += ' <td colspan="1" align="right"><a href="' + "javascript:" + 
			obj_name + ".write_calendar('" + eval(next_year) + "')" + '">--></a></td>';
		str += '</tr>';

		// pour tous les jours du mois
		var cnt_semaines = 0;

		str += ' <tr><td>S</td><td>M</td><td>T</td><td>W</td><td>Th</td><td>F</td><td>S</td></tr> ';

		while(cnt_semaines < 6){
			cnt_semaines ++;
	
			str += ' <tr>';

			for(var cnt = 0; cnt < 7; cnt++){
				
				// mois suivant
				if(cnt_days > days_month){	
					day = cnt_days - days_month;
					month = next_month.getMonth() + 1;
					year = next_month.getFullYear();

					style = "";
				}
				// mois précédent
				else if(cnt_days < 1){
					day = cnt_days + nb_days_last_month;
					month = last_month.getMonth() + 1;
					year = last_month.getFullYear();

					style = "";

				}
				// mous sélectionné
				else{
					var d1 = new Date();
					var d2 = new Date();

					d1.setMonth(date.getMonth());
					d1.setYear(date.getFullYear());
					d1.setDate(cnt_days);

					day = cnt_days;
					month = date.getMonth() + 1;
					year = date.getFullYear();

					// aujourd'hui ?
					if(d1.getFullYear() == d2.getFullYear() && d1.getMonth() == d2.getMonth() && d1.getDate() == d2.getDate() ){
						style = "background-color:#FFCC33;border-style:none; font-weight:bold;";
					}
					else{
						style = "";
					}
				}

				dstr = year + '/' + leading_zeros(month) + '/' + leading_zeros(day);

				// inscrit la cellule
				str += '  <td width="14%" style="' + style + '" align="center" name="CalendarDateElement[]" id="CalendarDateElement_' + month + day + year + '">';
				//str += '	<span style="' + style + '" width="100%">';
				if(url != '')
				{
					str += '	<a href="' + url + month + '/' + day + '/' + year + '">';
					str += day;
					str += '	</a>';
				}
				else
				if(jsFunction != '')
				{
					str += '	<a href="#" onClick="javascript:' + jsFunction + "('" + month + '/' + day + '/' + year + "'" + '); return false;" ondblclick="javascript:' + jsDoubleClickFunction + "('" + month + '/' + day + '/' + year + "'" + '); return false;">';
					str += day;
					str += '	</a>';
				}
				else
				{
					str += day;
				}
				//str += '	</font>';
				str += '  </td>';

				cnt_days ++;
			}

			str += ' </tr>';
		}

		str += '</table>';
		document.getElementById(layer_name).innerHTML = str;
	}

	this.show = function()
	{
		if(hide_self)
			document.getElementById(layer_name).style.visibility = 'visible';
	}

	this.hide = function()
	{
		if(hide_self)
			document.getElementById(layer_name).style.visibility = 'hidden';
	}


	////////////////////////////////////////////////////////////////////////////////////
	// create layer and show calendar
	document.write('<div id="' + layer_name + '" onmouseout="' + obj_name + '.hide();">...</div>');
	if(event_date != "")
    {
      var dateArray = event_date.split("/");
	  var newDate = new Date(dateArray[2], dateArray[0] - 1, dateArray[1]);
	  if(!isNaN(newDate))
  	  {
        this.write_calendar(newDate);
	  }
	  else
  	  {
 	    this.write_calendar(new Date());
	  }
	}
	else
	{
	  this.write_calendar(new Date());
	}
}
