var weekend = [0,6];
var weekendColor = "#FFFFFF";	//Colore di background delle celle contenenti sabati e domeniche
var gNow = new Date();
var ggWinCal;
isNav = (navigator.appName.indexOf("Netscape") != -1) ? true : false;
isIE = (navigator.appName.indexOf("Microsoft") != -1) ? true : false;

Calendar.Months = ["GEN", "FEB", "MAR", "APR", "MAG", "GIU", "LUG", "AGO", "SET", "OTT", "NOV", "DIC"];

// Giorni/mese per gli anni non bisestili
Calendar.DOMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
// Giorni/mese per gli anni bisestili
Calendar.lDOMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

/***************************************************************/

function WM_imageSwap(daImage, daSrc){
  var objStr,obj;
  if(document.images){
    if (typeof(daImage) == 'string') {
      objStr = 'document.' + daImage;
      obj = eval(objStr);
      obj.src = daSrc;
    } else if ((typeof(daImage) == 'object') && daImage && daImage.src) {
      daImage.src = daSrc;
    }
  }
}
function WM_preloadImages() {

  if (document.images) {
    if (typeof(document.WM) == 'undefined'){
      document.WM = new Object();
    }
    document.WM.loadedImages = new Array();
    var argLength = WM_preloadImages.arguments.length;
    for(arg=0;arg<argLength;arg++) {
      document.WM.loadedImages[arg] = new Image();
      document.WM.loadedImages[arg].src = WM_preloadImages.arguments[arg];
    }
  }
}

/***************************************************************/


function Calendar(p_item, p_WinCal, p_month, p_year, p_format) {
	if ((p_month == null) && (p_year == null))	return;

	if (p_WinCal == null)
		this.gWinCal = ggWinCal;
	else
		this.gWinCal = p_WinCal;
	
	if (p_month == null) {
		this.gMonthName = null;
		this.gMonth = null;
		this.gYearly = true;
	} else {
		this.gMonthName = Calendar.get_month(p_month);
		this.gMonth = new Number(p_month);
		this.gYearly = false;
	}

	this.gYear = p_year;
	this.gFormat = p_format;
	this.gReturnItem = p_item;
}

Calendar.get_month = Calendar_get_month;
Calendar.get_daysofmonth = Calendar_get_daysofmonth;
Calendar.calc_month_year = Calendar_calc_month_year;
Calendar.print = Calendar_print;

function Calendar_get_month(monthNo) {
	return Calendar.Months[monthNo];
}

function Calendar_get_daysofmonth(monthNo, p_year) {
	/*
	Controlla se l'anno e' bisestile
	1. Gli anni divisibili per 4 sono normalmente bisestili, tranne che... 
	2. Gli anni divisibili per 100 non sono normalmente bisestili, tranne che... 
	3. Gli anni divisibili per 400 sono bisestili.
	*/
	if ((p_year % 4) == 0) {
		if ((p_year % 100) == 0 && (p_year % 400) != 0)
			return Calendar.DOMonth[monthNo];
		return Calendar.lDOMonth[monthNo];
	} else
		return Calendar.DOMonth[monthNo];
}

function Calendar_calc_month_year(p_Month, p_Year, incr) {
	/*
	Ritorna un array monodimensionale in cui il primo elemento e' il mese calcolato e il secondo e' l'anno calcolato
	dopo aver applicato l'incremento/decremento del mese come specificato dal parametro 'incr'.
	(Vale 1/-1 per navigare tra i mesi).
	*/
	var ret_arr = new Array();
	
	if (incr == -1) {
		// Indietro
		if (p_Month == 0) {
			ret_arr[0] = 11;
			ret_arr[1] = parseInt(p_Year) - 1;
		}
		else {
			ret_arr[0] = parseInt(p_Month) - 1;
			ret_arr[1] = parseInt(p_Year);
		}
	} else if (incr == 1) {
		// Avanti
		if (p_Month == 11) {
			ret_arr[0] = 0;
			ret_arr[1] = parseInt(p_Year) + 1;
		}
		else {
			ret_arr[0] = parseInt(p_Month) + 1;
			ret_arr[1] = parseInt(p_Year);
		}
	}
	
	return ret_arr;
}

function Calendar_print() {
	ggWinCal.print();
}

// This is for compatibility with Navigator 3, we have to create and discard one object before the prototype object exists.
new Calendar();

Calendar.prototype.getMonthlyCalendarCode = function() {
	var vCode = "";
	var vHeader_Code = "";
	var vData_Code = "";
	
	// Inizio creazione della tabella
	//vCode = vCode + "<TABLE width=238 BORDER=1 align=center BGCOLOR='#ffffff'>";
	
	vHeader_Code = this.cal_header();
	vData_Code = this.cal_data();
	vCode = vCode + vHeader_Code + vData_Code;
	
	//vCode = vCode + "</TABLE>";
	
	return vCode;
}

Calendar.prototype.show = function() {
	var vCode = "";
	
	this.gWinCal.document.open();

	// Impostazione della pagina
this.wwrite("<html>");
this.wwrite("<head>");
	this.wwrite("<title></title>");
this.wwrite("<style>");
this.wwrite("td.bigrass {color:#ffffff; font-family:Verdana; font-size:10px; font-weight:bold;}");
this.wwrite("td.cal {width:26px;height:14px;align:center;}");
this.wwrite("td.bia {color:#ffffff; font-family:Verdana; font-size:10px;}");
this.wwrite("a.biabo11 {color:#ffffff; font-family:Verdana; font-size:10px; font-weight:bold; text-decoration:none;}");
this.wwrite("a.bianco {color:#676566; font-family:Verdana; font-size:10px; text-decoration:none;}");
this.wwrite("</style>");
this.wwrite("<link rel='STYLESHEET' type='text/css' href='#'>");
this.wwrite("</head>");

this.wwrite("<body bgcolor='#E3DEDB' topmargin='0' rightmargin='0' bottommargin='0' leftmargin='0'>");
this.wwrite("<table align='center' cellspacing='0' cellpadding='0' border='0' bgcolor='#E3DEDB'>");
this.wwrite("<tr>");
this.wwrite("<td style='border-bottom: 12px;'><img src='/it/images/calendario/logo_cal.gif' width='85' height='30' alt='' border='0' hspace='10' vspace='10'>&nbsp;</td>");
this.wwrite("</tr>");

	// Bottoni di navigazione (scrolling mesi e anni)
	var prevMMYYYY = Calendar.calc_month_year(this.gMonth, this.gYear, -1);
	var prevMM = prevMMYYYY[0];
	var prevYYYY = prevMMYYYY[1];

	var nextMMYYYY = Calendar.calc_month_year(this.gMonth, this.gYear, 1);
	var nextMM = nextMMYYYY[0];
	var nextYYYY = nextMMYYYY[1];
	
this.wwrite("<tr>");
this.wwrite("<td>");
this.wwrite("<table border='0' cellpadding='1' cellspacing='0' align='center' width='100%'>");
this.wwrite("<tr>");
this.wwrite("<td width='30%' height='20' valign='top' style='font-family:Verdana; color:#676566; font-size:10px; font-weight:bold;'>&nbsp;&nbsp;Calendario</td><td width='70%' height='20' valign='baseline'><hr align='left' width='140' size='1' noshade='NOSHADE' color='#BBB9B9'></td>");
this.wwrite("</tr>");
this.wwrite("<tr>");
this.wwrite("<td colspan='2'>");
this.wwrite("<table border='0' cellpadding='3px' cellspacing='0' align='center' width='100%' bgcolor='#EBEBEB' style='border-bottom:solid 1px #BBB9B9; font-family:Verdana; color:#676566; font-size:10px;'>");
this.wwrite("<tr>");
this.wwrite("<td align='center'><a class='bianco' href=\"" + "javascript:window.opener.Build(" + "'" + this.gReturnItem + "', '" + prevMM + "', '" + prevYYYY + "', '" + this.gFormat + "'" + ");" + "\">&laquo;</a>&nbsp;mese&nbsp;<a class='bianco' href=\"" + "javascript:window.opener.Build(" +  "'" + this.gReturnItem + "', '" + nextMM + "', '" + nextYYYY + "', '" + this.gFormat + "'" + ");" + "\">&raquo;</a></td>");
this.wwrite("<td align='center' style='font-weight:bold;'>" + this.gMonthName + " " + this.gYear + "</td>");
this.wwrite("<td align='center'><a class='bianco' href=\"" + "javascript:window.opener.Build(" +  "'" + this.gReturnItem + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)-1) + "', '" + this.gFormat + "'" + ");" + "\">&laquo;</a>&nbsp;anno&nbsp;<a class='bianco' href=\"" + "javascript:window.opener.Build(" +  "'" + this.gReturnItem + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)+1) + "', '" + this.gFormat + "'" + ");" + "\">&raquo;</a></td>");
this.wwrite("</tr>");
this.wwrite("</table>");
this.wwrite("</td>");
this.wwrite("</tr>");
this.wwrite("<tr>");
this.wwrite("<td colspan='2'>&nbsp;</td>");
this.wwrite("</tr>");
this.wwrite("</table>");
this.wwrite("</td>");
this.wwrite("</tr>");
this.wwrite("<tr>");
this.wwrite("<td>");
	
	// Stampa l'intero mese
	vCode = this.getMonthlyCalendarCode();
	this.wwrite(vCode);
	this.wwrite("</table></td></tr></table></body></html>");
	this.gWinCal.document.close();
}

Calendar.prototype.wwrite = function(wtext) {
	this.gWinCal.document.writeln(wtext);
}

Calendar.prototype.wwriteA = function(wtext) {
	this.gWinCal.document.write(wtext);
}


Calendar.prototype.cal_header = function() {
	// Stampa l'immagine dei giorni della settimana
	var vCode = "";
	vCode = vCode + "<table border='0' align='center' cellpadding='2' cellspacing='1' bgcolor='#E3DEDB'><tr style='font-family:Verdana; color:#676566; font-size:10px' bgcolor='#EBEBEB'><td class='cal'>Lun</td><td class='cal'>Mar</td><td class='cal'>Mer</td><td class='cal'>Gio</td><td class='cal'>Ven</td><td class='cal'>Sab</td><td class='cal'>Dom</td></tr>";
	return vCode;
}

Calendar.prototype.cal_data = function() {
	var vDate = new Date();
	vDate.setDate(1);
	vDate.setMonth(this.gMonth);
	vDate.setFullYear(this.gYear);

	var vFirstDay=vDate.getDay();
	if (vFirstDay == 0)
		vFirstDay = 6;
	else
		vFirstDay -= 1;
	var vDay=1;
	var vLastDay=Calendar.get_daysofmonth(this.gMonth, this.gYear);
	var vOnLastDay=0;
	var vCode = "";

	/*
	Determina il giorno della settimana del primo giorno del mese/anno richiesto e
	inserisce n celle bianche prima del primo giorno della settimana
	*/
	vCode = vCode + "<tr bgcolor='#FFFFFF'>";
	for (i=0; i<vFirstDay; i++) {
		vCode = vCode + "<td class='cal'></td>";
	}

	// Stampa il resto della prima settimana
	for (j=vFirstDay; j<7; j++) {
		vCode = vCode + this.format_day(vDay,j);
		vDay=vDay + 1;
	}
	vCode = vCode + "</tr>";

	// Stampa le altre settimane
	for (k=2; k<7; k++) {
		//vCode = vCode + "<tr><td colspan='7' align='center'>&nbsp;</td></tr>";
		vCode = vCode + "<tr bgcolor='#FFFFFF'>";
		for (j=0; j<7; j++) {
			vCode = vCode + this.format_day(vDay,j);
			vDay=vDay + 1;

			if (vDay > vLastDay) {
				vOnLastDay = 1;
				break;
			}
		}

		if (j >= 6)
			vCode = vCode + "</tr>";
		if (vOnLastDay == 1) 
			break;
	}
	
	// Riempie il resto dell'ultima settimana col giusto numero di celle vuote
	for (m=1; m<(7-j); m++) {
		if (this.gYearly)
			vCode = vCode + "<td class='cal'></td>";
		else
			vCode = vCode + "<td class='cal'></td>";
	}
			vCode = vCode + "</tr>";
	return vCode;
}

Calendar.prototype.format_day = function(vday,j) {
	var vNowDay = gNow.getDate();
	var vNowMonth = gNow.getMonth();
	var vNowYear = gNow.getFullYear();

	if (vday == vNowDay && this.gMonth == vNowMonth && this.gYear == vNowYear)
		return ("<td class='cal' bgcolor='#676566'><a class='biabo11' href='#' " + "onClick=\"self.opener.document." + this.gReturnItem + ".value='" + this.format_data(vday) + "';window.close();\">" + vday + "</a></td>");
	else
		return ("<td class='cal'><a class='bianco' href='#' " + "onClick=\"self.opener.document." + this.gReturnItem + ".value='" + this.format_data(vday) + "';window.close();\">" + vday + "</a></td>");
}

Calendar.prototype.write_weekend_string = function(vday) {
	var i;

	// Imposta il colore di background per le celle dei sabati e delle domeniche
	for (i=0; i<weekend.length; i++) {
		if (vday == weekend[i])
			return (" bgcolor=\"" + weekendColor + "\"");
	}
	return "";
}

Calendar.prototype.format_data = function(p_day) {
	var vData;
	var vMonth = 1 + this.gMonth;
	vMonth = (vMonth.toString().length < 2) ? "0" + vMonth : vMonth;
	var vMon = Calendar.get_month(this.gMonth).substr(0,3).toUpperCase();
	var vFMon = Calendar.get_month(this.gMonth).toUpperCase();
	var vY4 = new String(this.gYear);
	var vY2 = new String(this.gYear.substr(2,2));
	var vDD = (p_day.toString().length < 2) ? "0" + p_day : p_day;

	switch (this.gFormat) {
		case "MM\/DD\/YYYY" :
			vData = vMonth + "\/" + vDD + "\/" + vY4;
			break;
		case "MM\/DD\/YY" :
			vData = vMonth + "\/" + vDD + "\/" + vY2;
			break;
		case "MM-DD-YYYY" :
			vData = vMonth + "-" + vDD + "-" + vY4;
			break;
		case "MM-DD-YY" :
			vData = vMonth + "-" + vDD + "-" + vY2;
			break;

		case "DD\/MON\/YYYY" :
			vData = vDD + "\/" + vMon + "\/" + vY4;
			break;
		case "DD\/MON\/YY" :
			vData = vDD + "\/" + vMon + "\/" + vY2;
			break;
		case "DD-MON-YYYY" :
			vData = vDD + "-" + vMon + "-" + vY4;
			break;
		case "DD-MON-YY" :
			vData = vDD + "-" + vMon + "-" + vY2;
			break;

		case "DD\/MONTH\/YYYY" :
			vData = vDD + "\/" + vFMon + "\/" + vY4;
			break;
		case "DD\/MONTH\/YY" :
			vData = vDD + "\/" + vFMon + "\/" + vY2;
			break;
		case "DD-MONTH-YYYY" :
			vData = vDD + "-" + vFMon + "-" + vY4;
			break;
		case "DD-MONTH-YY" :
			vData = vDD + "-" + vFMon + "-" + vY2;
			break;

		case "DD\/MM\/YYYY" :
			vData = vDD + "\/" + vMonth + "\/" + vY4;
			break;
		case "DD\/MM\/YY" :
			vData = vDD + "\/" + vMonth + "\/" + vY2;
			break;
		case "DD-MM-YYYY" :
			vData = vDD + "-" + vMonth + "-" + vY4;
			break;
		case "DD-MM-YY" :
			vData = vDD + "-" + vMonth + "-" + vY2;
			break;
		default :
			vData = vMonth + "\/" + vDD + "\/" + vY4;
	}

	return vData;
}

function Build(p_item, p_month, p_year, p_format) {
	var p_WinCal = ggWinCal;
	gCal = new Calendar(p_item, p_WinCal, p_month, p_year, p_format);

	// Seleziona la corretta funzione di visualizzazione
	if (gCal.gYearly)	gCal.showY();
	else	gCal.show();
}

function show_calendar() {
	/* 
		p_month : 0-11 per Gennaio - Dicembre; 12 per tutti i mesi.
		p_year	: anno a 4 cifre
		p_format: Formato della data: (mm/dd/yyyy, dd/mm/yy, ...)
		p_item	: Return Item.
	*/
	p_item = arguments[0];
	if (arguments[1] == null)
		p_month = new String(gNow.getMonth());
	else
		p_month = arguments[1];
	if (arguments[2] == "" || arguments[2] == null)
		p_year = new String(gNow.getFullYear().toString());
	else
		p_year = arguments[2];
	if (arguments[3] == null)
		p_format = "DD\/MM\/YYYY";
	else
		p_format = arguments[3];

	vWinCal = window.open("", "Calendar", "width=226px,height=240px,status=no,resizable=no");
	vWinCal.opener = self;
	ggWinCal = vWinCal;

	Build(p_item, p_month, p_year, p_format);
}

function show_yearly_calendar(p_item, p_year, p_format) {
	// Carica i parametri di default...
	if (p_year == null || p_year == "")
		p_year = new String(gNow.getFullYear().toString());
	if (p_format == null || p_format == "")
		p_format = "DD\/MON\/YYYY";

	var vWinCal = window.open("", "Calendar", "scrollbars=yes");
	vWinCal.opener = self;
	ggWinCal = vWinCal;

	Build(p_item, null, p_year, p_format);
}
