var visible_calendars = new Array();
var canihide = 0;

function show_calendar(id_input, monthshift) {
	obj_input = document.getElementById(id_input);
	str_datetime = trim(obj_input.value);
// 	debugger;
	var arr_months = ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"];
	var week_days = ["Do", "Lu", "Ma", "Me", "Gi", "Ve", "Sa"];
	var n_weekstart = 1; // day week starts from (normally 0 or 1)

	var dt_datetime = (str_datetime == null || str_datetime =="" ?  new Date() : str2dt(str_datetime));
	dt_datetime.setMonth(dt_datetime.getMonth() + monthshift);
	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);
	var dt_firstday = new Date(dt_datetime);
	dt_firstday.setDate(1);
	dt_firstday.setDate(1-(7+dt_firstday.getDay()-n_weekstart)%7);
	var dt_lastday = new Date(dt_next_month);
	dt_lastday.setDate(0);

	preshift=monthshift-1;
	postshift=monthshift+1;
	preshift=preshift.toString();
	postshift=postshift.toString();
	// html generation (feel free to tune it for your particular application)
	// print calendar header
	var str_buffer = new String (
		"<table class=\"calendario_table\">\n"+
		"<tr><th class=\"pointer\" onclick=\"javascript:show_calendar('"+
		id_input+"', "+preshift+");\">&lt;&lt;&lt;</th>\n"+
		"<th colspan=\"5\">"+arr_months[dt_datetime.getMonth()]+" "+dt_datetime.getFullYear()+"</th>\n"+
		"<th class=\"pointer\" onclick=\"javascript:show_calendar('"
		+id_input+"', "+postshift+");\">&gt;&gt;&gt;</th>\n</tr>\n"
	);

	var dt_current_day = new Date(dt_firstday);
	// print weekdays titles
	str_buffer += "<tr>\n";
	for (var n=0; n<7; n++)
		str_buffer += "<th class=\"week_days\">"+week_days[(n_weekstart+n)%7]+"</th>\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 heder
		str_buffer += "<tr>\n";
		for (var n_current_wday=0; n_current_wday<7; n_current_wday++) {
				if (dt_current_day.getDate() == dt_datetime.getDate() &&
					dt_current_day.getMonth() == dt_datetime.getMonth())
					// print current date
					str_buffer += "<td class=\"pointer current_date\" onclick=\"applyandhide('"+id_input+"', '"+dt_current_day+"');\">";
				else if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6)
					// weekend days
					str_buffer += "<td class=\"pointer weekend\" onclick=\"applyandhide('"+id_input+"', '"+dt_current_day+"');\">";
				else
					// print working days of current month
					str_buffer += "	<td class=\"pointer\" onclick=\"applyandhide('"+id_input+"', '"+dt_current_day+"');\">";

				if (dt_current_day.getMonth() == dt_datetime.getMonth())
					// print days of current month
					str_buffer += "<span class=\"currentmonth_days\">";
				else
					// print days of other months
					str_buffer += "<span class=\"othermonth_days\">";

				str_buffer += dt_current_day.getDate()+"</span></td>\n";
				dt_current_day.setDate(dt_current_day.getDate()+1);
		}
		// print row footer
		str_buffer += "</tr>\n";
	}
	// print calendar footer
	str_buffer +="</table>\n";

	canihide=1;
	hideallcalendars();
	canihide=0;

	divguida = document.getElementById(id_input+'_hiddencalendar');


	divguida.innerHTML = str_buffer;
// 	debugger;

	var pos = absposition(id_input);
	var offL = 200;
	var offT = 0;


	divguida.style.left = ( pos.x + offL ) + "px";
	divguida.style.top 	= ( pos.y + offT ) + "px";
// 	alert(divguida.style.display);
// 	if (divguida.style.display=='none') {
		divguida.style.display='';
		var x = visible_calendars.push(divguida);
		canihide=0;
// 	}
// 	document.getElementById(id_input+'_hiddencalendar').style.display='';
}

function applyandhide(id_input, selday) {
// 	debugger;
	selday = new Date(selday);
// 	alert(selday);
	document.getElementById(id_input).value = dt2dtstr(selday);
	document.getElementById(id_input+'_hiddencalendar').style.display='none';
}

// datetime parsing and formatting routimes. modify them if you wish other datetime format
function str2dt (str_datetime) {
	str_datetime = str_datetime + ' 12:00:00';
	var re_date = /^(\d+)\/(\d+)\/(\d+)\s+(\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));
}

function dt2dtstr (dt_datetime) {
	return (new String (
			dt_datetime.getDate()+"/"+(dt_datetime.getMonth()+1)+"/"+dt_datetime.getFullYear()+" "));
}

function dt2tmstr (dt_datetime) {
	return (new String (
			dt_datetime.getHours()+":"+dt_datetime.getMinutes()+":"+dt_datetime.getSeconds()));
}

function absposition( ele ) {
	var ele = document.getElementById(ele);

	var obj = ele;

	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;


	var obj = ele;
	
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;

	return {x:curleft, y:curtop}
}

function hideallcalendars() {
// 	debugger;
	if (canihide==1) {
		i=0;
		while(i<visible_calendars.length) {
			currentobj = visible_calendars[i];
			currentobj.style.display = 'none';	
			i++;
		}
		visible_calendars = new Array();
	} else {
		canihide = 1;
	}
}
