function Calendar(id,_day,_month,_year){

//alert(_day + ' -- ' + _month + ' -- ' + _year);

	var ret = [];
	var month = _month - 1;
	var days_in_months = [31,28,31,30,31,30,31,31,30,31,30,31];
	var month_names = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
	var day_names = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];
	var start_date = new Date(_year,month,1);
	var start_day = start_date.getDay();
	var start_month = start_date.getMonth();
	var start_year = start_date.getFullYear();
	
	var today_date = new Date();
	var today_day_date = today_date.getDate();
	var today_day = today_date.getDay();
	var today_month = today_date.getMonth();
	var today_year = today_date.getFullYear(); // + 1900;		

	// adjust february if leap
	if( ( (_year % 4 == 0) && (_year % 100 != 0) ) && (_year % 400 != 0) ){
		days_in_months[1] = 29;
	}
	
	
	
	
	
	
	
		
	
	var previous_year = ( start_month == 0 ) ? ( _year - 1 ) : _year;
	var previous_month = ( start_month == 0 ) ? 11 : ( start_month - 1 );
	
	var next_year = ( start_month == 11 ) ? ( _year + 1 ) : _year;
	var next_month = ( start_month == 11 ) ? 0 : ( start_month + 1 );
	
	var previous_end_day = days_in_months[previous_month] - start_day + 2;	
	var next_month_day = 1;

	var control_previous_m = ( start_month == 0 ) ? 1 : previous_month + 2;
	var control_previous_y = ( start_month == 0 ) ? previous_year : previous_year - 1;

	var rows = Math.ceil( ( days_in_months[month] + start_day - 1 ) / 7 );

//-----------------fix for 2009-----------------------------------	

	if ((start_year==2009) && ((start_month==1) || (start_month==2) || (start_month==10)))
	{
	
	start_day = 7;
	previous_end_day = days_in_months[previous_month] - start_day + 2;
	rows = Math.ceil( ( days_in_months[month] + start_day - 1 ) / 7 );
	}
//------------------------------------------------------------------------------------------
//-----------------fix for 2010-----------------------------------------	
	if ((start_year==2010) && ((start_month==20) || (start_month==20) || (start_month==20)))
	{
	
	start_day = 7;
	previous_end_day = days_in_months[previous_month] - start_day + 2;
	rows = Math.ceil( ( days_in_months[month] + start_day - 1 ) / 7 );
	}
//----------------------------------------------------------------------	
	ret.push("<table><thead>");
	ret.push("<tr>");
	ret.push('<th><a title="Previous year ('+_day+','+ control_previous_m +','+ control_previous_y +')" href="#" onclick="javas'+'cript:drawCalendar(\''+ id +'\','+_day+','+ control_previous_m +','+ control_previous_y +');return false;">&lt;&lt;</a></th>');
	ret.push('<th><a title="Previous month ('+_day+','+( previous_month + 1)+','+ previous_year + ')" href="#" onclick="javas'+'cript:drawCalendar(\''+ id +'\','+_day+','+( previous_month + 1)+','+ previous_year + ');return false;">&lt;</a></th>');
	ret.push('<th colspan="3">'+ month_names[start_month] + ' - ' + _year +'</th>');
	ret.push('<th><a title="Next month ('+_day+','+( next_month + 1)+','+next_year+')" href="#" onclick="javas'+'cript:drawCalendar(\''+ id +'\','+_day+','+( next_month + 1)+','+next_year+');return false;">&gt;</a></th>');
	ret.push('<th><a title="Next year ('+_day+','+ next_month +','+ ( parseInt(next_year) + 1 ) +')" href="#" onclick="javas'+'cript:drawCalendar(\''+ id +'\','+_day+','+ next_month +','+ ( parseInt(next_year) + 1 ) +');return false;">&gt;&gt;</a></th>');
	ret.push("</tr>");
	ret.push("<tr>");
	for( var y = 0 ; y < day_names.length ; y++ ){
		ret.push("<th>" + day_names[y].substr(0,1) + "</th>");
	}
	ret.push("</tr>");	
	ret.push("</thead><tbody>");
	
	var future = ( _year > today_year )
						? 1
						: ( _year == today_year )
							? ( start_month > today_month )
								? 1
								: ( start_month == today_month )
								 	? 2
								 	: 0
							: 0;
							
	//alert(future);

	// is requested date is historic to now?
	//alert( today_month + " -- " + start_month + "\n -- " + today_year + " -- " + _year);
	//alert( historic );
	var day_counter = 1;
	for( var i = 0 ; i < rows ; i++ ){
		ret.push("<tr>");	
		for( var x = 0 ; x < 7 ; x++ ){
			// row one
			if( i == 0 && previous_end_day <= days_in_months[previous_month] ){
				ret.push("<td class=\"previous_month\">" + previous_end_day + "</td>");		
				previous_end_day++;		
			}else if( i == (rows - 1) && day_counter > days_in_months[start_month] ){
			// last one
				ret.push("<td class=\"next_month\">" + next_month_day + "</td>");		
				next_month_day++;
			}else{
				var tmp_date_formatted = _year + _month.toString().paddLeft("0",2) + day_counter.toString().paddLeft("0",2);
				var month_class = ( day_counter == _day ) 
											? ' class="current"' 
											: ( x >= 5 )
												? ' class="weekend"'
												: '';
				ret.push("<td" + month_class + ">");
				if( future == 1 ){
					ret.push('<a href="#" onclick="javascript:insertSelected(\''+id+'\',\''+tmp_date_formatted+'\');return false;">');
				}else if( future == 2 && day_counter >= today_day_date ){
					ret.push('<a href="#" onclick="javascript:insertSelected(\''+id+'\',\''+tmp_date_formatted+'\');return false;">');
					
				}
				ret.push(day_counter );
				if( future == 1 ){
					ret.push('</a>');
				}else if( future == 2 && day_counter >= today_day_date ){
					ret.push('</a>');
				}
				ret.push("</td>");		
				day_counter++;
			}
		}
		ret.push("</tr>");
	}
	ret.push("</tbody></table>");	
	
   return ret.join("\n");
}
