	/**
	* @class cCalendar
	* @author Alfredo Cerutti
	* @date 16/05/2006
	*
	* oggetto che costruisce un calendario partendo dalla data indicata
	*
	* @param s_lang lingua in cui mostrare il calendario (it, en, fr, de, es)
	* @param s_open_at_day giorno a cui si deve aprire il calendario
	* @param s_block_at_day giorno prima/dopo il quale non va posto il link di selezione
	*
	* @return niente
	*/
	function cCalendar(s_lang, s_open_at_day, s_block_at_day)
	{
		/**
		* inizializzo la data di apertura calendario
		*/
		var a_open_at_day = s_open_at_day.split("/");
		this.i_day= a_open_at_day[0];
		this.i_month= a_open_at_day[1];
		this.i_year=a_open_at_day[2];

		// inserisco la data di blocco senza applicare nessuna operazione - sarà drawCal a lavorarci su
		this.s_block_at_day=s_block_at_day;

		// salvo la lingua
		this.s_lang = s_lang;

		/**
		* aggiusto le date
		*/
		if (this.i_month > 12)
		{
			this.i_month=1;
			this.i_year = parseInt(this.i_year) + 1;
		}
		if (this.i_month < 1)
		{
			this.i_month=12;
			this.i_year = parseInt(this.i_year) - 1;
		}

// 		alert(this.i_day+"/"+this.i_month+"/"+this.i_year);

		/**
		* dichiaro le proprietà di accesso ai controlli HTML
		*/
		this.s_control_parent= ""; // oggetto bottone sotto il quale posizionare il calendario
		this.s_div_name = ""; // div che deve contenere il calendario
		this.s_data_receiver =""; // oggetto input che deve ricevere la data scelta dal picker

		/**
		* mappatura dei metodi
		*/
		this.getCalDate= _getCalDate;
		this.drawCal= _drawCal;
		this.getDaysInMonth= _getDaysInMonth;
		this.openCalendar = _openCalendar;
		this.closeCalendar = _closeCalendar;
		this.format = _format;

		/**
		* _openCalendar
		*
		* funzione che apre il box che conterrà il calendario
		*
		* @param nessuno
		* @return niente
		*/
		function _openCalendar()
		{
			// referenzio il padre e mostro il box calendario
			var control_parent = document.getElementById(this.s_control_parent);
			document.getElementById(this.s_div_name).style.display="block";
			document.getElementById(this.s_div_name).style.position="relative";
			document.getElementById(this.s_div_name).style.left=control_parent.offsetLeft+"px";
		}

		/**
		* _closeCalendar
		*
		* funzione che nasconde il calendario
		*
		* @param s_div_name nome del div da chiudere
		* @return niente
		*/
		function _closeCalendar(s_div_name)
		{
			document.getElementById(s_div_name).style.display="none";
		}

		function _getCalDate(s_div_name)
		{
			// scrivo il valore nella casella di testo disabilitata
			document.getElementById(s_div_name+"_dis").value= this.format(this.i_day)+"/"+this.format(this.i_month)+"/"+this.i_year;

			// scrivo il valore nella casella di testo nascosta
			document.getElementById(s_div_name).value= this.format(this.i_day)+"/"+this.format(this.i_month)+"/"+this.i_year;
		}

		/**
		* _drawCal
		*
		* metodo che disegna il calendario
		*
		* @param s_div_name nome che deve contenere il calendario
		* @param s_control_parent nome del controllo sotto il quale posizionare il calendario
		* @param s_datareceiver casella di testo che deve ricevere la data
		*/
		function _drawCal(s_div_name,s_control_parent, s_data_receiver)
		{
			var calBox = document.getElementById(s_div_name);
			calBox.innerHTML=""; // pulisco il contenuto del contenitore del calendario

			/**
			* array con i giorni della settimana e dei mesi in lingua
			*/
			var a_giorni_it = Array("Lun","Mar","Mer","Gio","Ven","Sab","Dom");
			var a_giorni_en = Array("Mon","Tue","Wed","Thu","Fri","Sat","Sun");
			var a_giorni_fr = Array("Lun","Mar","Mer","Jeu","Ven","Sam","Dim");
			var a_giorni_de = Array("Mon","Die","Mit","Don","Fre","Sam","Son");
			var a_giorni_es = Array("Lun","Mar","Mié","Jue","Vie","Sáb","Dom");

			var a_mesi_it = Array("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre");
			var a_mesi_en = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
			var a_mesi_fr = Array("Janvier", "Février", "Mars", "Avril", "Mai", "Jun", "Juillet", "Août", "Settembre", "Octobre", "Novembre", "Décembre");
			var a_mesi_de = Array("Januar", "Februar", "März", "April", "Mai", "Jun", "Juli", "August", "September", "Oktober", "November", "Dezember");
			var a_mesi_es = Array("Enero", "Febrero", "Marzo", "Abril", "Pueda", "Junio", "Julio", "Agostos", "Septiembre", "Octubre", "Noviembre", "Diciembre");

			/**
			* determino in lingua
			*/
			switch (this.s_lang)
			{
				case "it":
					var a_giorni = a_giorni_it;
					var a_mesi = a_mesi_it;
					break;
				case "en":
					var a_giorni = a_giorni_en;
					var a_mesi = a_mesi_en;
					break;
				case "fr":
					var a_giorni = a_giorni_fr;
					var a_mesi = a_mesi_fr;
					break;
				case "es":
					var a_giorni = a_giorni_es;
					var a_mesi = a_mesi_es;
					break;
				case "de":
					var a_giorni = a_giorni_de;
					var a_mesi = a_mesi_de;
					break;
				default:
					var a_giorni = a_giorni_it;
					var a_mesi = a_mesi_it;
			}

			// riferimento interno al calendario
			var a_nome_giorni_settimana=Array("Mon","Tue","Wed","Thu","Fri","Sat","Sun");

			this.s_control_parent= s_control_parent; // nome del controllo sotto il quale posizionare il calendario
			this.s_div_name = s_div_name; // nome del div che conterrà il calendario
			this.s_data_receiver = s_data_receiver; // casella di testo che riceve la data

			/**
			* creo la tabella
			*/
			var s_calendar = "";

			s_calendar += "<table class=\"calendar_table\">";

			/**
			* navigatore
			*/
			s_calendar +="<tr><td colspan=\"6\">&nbsp;</td><td class=\"calendar_td_close\" align=\"center\">";
			// bottone di chiusura calendario
			s_calendar += "<a href=\"javascript:;\" onclick=\"cal = new cCalendar('"+this.s_lang+"','',''); cal.closeCalendar('"+this.s_div_name+"');\" class=\"calendar_link_close\">X</a>";
			s_calendar += "</td></tr>";

			s_calendar += "<tr class=\"calendar_nav\"><td colspan=\"7\">";
			s_calendar += "<div class=\"calendar_nav_date\">"+a_mesi[parseInt(this.i_month)-1]+" "+this.i_year+"</div><div class=\"calendar_nav_btn\">";

			// calcolo il mese precedente e il mese successivo - se il mese sfora 1 o 12 sarà il costruttore a sistemarlo
			var s_mese_precedente=this.i_day+"/"+(parseInt(this.i_month)-1)+"/"+this.i_year;
			var s_mese_successivo=this.i_day+"/"+(parseInt(this.i_month)+1)+"/"+this.i_year;

			// mese precedente
			s_calendar += "<a href=\"javascript:;\" class=\"calendar_nav_link\" onclick=\"cal = new cCalendar('"+this.s_lang+"','"+s_mese_precedente+"','"+this.s_block_at_day+"'); cal.drawCal('"+this.s_div_name+"','"+this.s_control_parent+"','"+this.s_data_receiver+"');\">&lt;</a>";

			s_calendar += "&nbsp;&nbsp;";

			// mese successivo
			s_calendar += "<a href=\"javascript:;\" class=\"calendar_nav_link\" onclick=\"cal = new cCalendar('"+this.s_lang+"','"+s_mese_successivo+"','"+this.s_block_at_day+"'); cal.drawCal('"+this.s_div_name+"','"+this.s_control_parent+"','"+this.s_data_receiver+"');\">&gt;</a>";

			s_calendar += "</div></td></tr>";

			/**
			* header colonne giorni determinando la lingua da utilizzare
			*/
			s_calendar += "<tr class=\"calendar_header\">";
			for (var i_idx=0; i_idx< a_giorni.length; i_idx++)
			{
				s_calendar+="<td>"+a_giorni[i_idx]+"</td>";
			}
			s_calendar +="</tr><tr>";

			/**
			* stampo eventuali celle vuote per l'inizio del mese
			*/
			var i_colonna=0;
			var primo_giorno_mese = new Date(this.i_year,parseInt(this.i_month)-1,1);
			for (var i_idx=1; i_idx< primo_giorno_mese.getDay(); i_idx++)
			{
				s_calendar+="<td>&nbsp;</td>";
				i_colonna++; // questa variabili mi è utile sotto per sapere a quale cella della prima riga sono arrivato
			}

			/**
			* stampo i giorni del mese calcolando anche il giorno ultimo del mese
			*/
			var ultimo_giorno_mese= this.getDaysInMonth (this.i_month,this.i_year);
			for (var i_idx=1; i_idx <= ultimo_giorno_mese; i_idx++, i_colonna++)
			{
				var s_day= i_idx;
				var s_css_current_day="";

				/**
				* leggo la data corrente, verifico con i dati attuali, e se possibile propongo il link come cliccabile
				*
				* Vengono gestiti due casi:
				* - se la data del blocco è impostata a -1 il link è SEMPRE presente
				* - se la data del blocco è una data il link sarà presente SOLO da quella data in avanti
				*/
				var s_current_calendar_day = i_idx+"/"+this.i_month+"/"+this.i_year;
				/**
				* s_block_at_day = 
				* -1 ---> tutti i giorni sono cliccabili
				* -2 ---> tutti i giorni dal giorno corrente in dietro sono cliccabili
				* data ---> tutti i giorni dal corrente in avanti sono cliccabili
				*/
  				var re = new RegExp("#");
				if ((this.s_block_at_day !="-1") && !(this.s_block_at_day.match(re)))
				{
					/**
					* TUTTI I GIORNI DAL CORRENTE IN AVANTI SONO CLICCABILI
					*/
					var a_block_at_day= this.s_block_at_day.split("/"); // splitto la data limite

					if (parseInt(this.i_year) > parseInt(a_block_at_day[2]))
					{
						// l'anno corrente è maggiore del blocco --> link attivo
						s_day = "<a href=\"javascript:;\" onclick=\"cal = new cCalendar('"+this.s_lang+"','"+s_current_calendar_day +"','"+this.s_block_at_day+"'); cal.getCalDate('"+this.s_data_receiver+"'); cal.closeCalendar('"+this.s_div_name+"');\" class=\"calendar_link\">"+s_day+"</a>";
					} else {
						if ((parseInt(this.i_year) == parseInt(a_block_at_day[2])) && (parseInt(this.i_month) > parseInt(a_block_at_day[1])))
						{
							// l'anno corrente è uguale all'anno del blocco e il mese corrente è maggiore del mese di blocco --> link attivo
							s_day = "<a href=\"javascript:;\" onclick=\"cal = new cCalendar('"+this.s_lang+"','"+s_current_calendar_day +"','"+this.s_block_at_day+"'); cal.getCalDate('"+this.s_data_receiver+"'); cal.closeCalendar('"+this.s_div_name+"');\" class=\"calendar_link\">"+s_day+"</a>";
						} else {
							if (parseInt(this.i_year) ==parseInt(a_block_at_day[2]) && parseInt(this.i_month) == parseInt(a_block_at_day[1]))
							{
								// l'anno corrente è uguale all'anno di blocco e il mese corrente è uguale al mese di blocco
								if (i_idx >= parseInt(a_block_at_day[0]))
								{
									// il giorno corrente è maggiore o uguale al giorno del blocco
									if (i_idx==this.i_day) s_css_current_day=" style=\"background-color:#DCDCDC\" ";

									s_day = "<a href=\"javascript:;\" onclick=\"cal = new cCalendar('"+this.s_lang+"','"+s_current_calendar_day +"','"+this.s_block_at_day+"'); cal.getCalDate('"+this.s_data_receiver+"'); cal.closeCalendar('"+this.s_div_name+"');\" class=\"calendar_link\">"+s_day+"</a>";
								}
							}
						} // fine if anno corrente >= anno
					} // fine if anno corrente > data limite
				} else {
  					var re = new RegExp("#");
					if (this.s_block_at_day.match(re))
					{
						var a_remove_cancelletto = this.s_block_at_day.split("#"); // rimuovo il cancelletto
						var a_block_at_day= a_remove_cancelletto[1].split("/"); // splitto la data limite
						/**
						* TUTTI I GIORNI DAL CORRENTE E PRECEDENTI SONO CLICCABILI
						*/
						if (parseInt(this.i_year) < parseInt(a_block_at_day[2]))
						{
							// l'anno corrente è maggiore del blocco --> link attivo
							s_day = "<a href=\"javascript:;\" onclick=\"cal = new cCalendar('"+this.s_lang+"','"+s_current_calendar_day +"','"+this.s_block_at_day+"'); cal.getCalDate('"+this.s_data_receiver+"'); cal.closeCalendar('"+this.s_div_name+"');\" class=\"calendar_link\">"+s_day+"</a>";
						} else {
							if ((parseInt(this.i_year) == parseInt(a_block_at_day[2])) && (parseInt(this.i_month) < parseInt(a_block_at_day[1])))
							{
								// l'anno corrente è uguale all'anno del blocco e il mese corrente è maggiore del mese di blocco --> link attivo
								s_day = "<a href=\"javascript:;\" onclick=\"cal = new cCalendar('"+this.s_lang+"','"+s_current_calendar_day +"','"+this.s_block_at_day+"'); cal.getCalDate('"+this.s_data_receiver+"'); cal.closeCalendar('"+this.s_div_name+"');\" class=\"calendar_link\">"+s_day+"</a>";
							} else {
								if (parseInt(this.i_year) ==parseInt(a_block_at_day[2]) && parseInt(this.i_month) == parseInt(a_block_at_day[1]))
								{
									// l'anno corrente è uguale all'anno di blocco e il mese corrente è uguale al mese di blocco
									if (i_idx <= parseInt(a_block_at_day[0]))
									{
										// il giorno corrente è maggiore o uguale al giorno del blocco
										if (i_idx==this.i_day) s_css_current_day=" style=\"background-color:#DCDCDC\" ";
	
										s_day = "<a href=\"javascript:;\" onclick=\"cal = new cCalendar('"+this.s_lang+"','"+s_current_calendar_day +"','"+this.s_block_at_day+"'); cal.getCalDate('"+this.s_data_receiver+"'); cal.closeCalendar('"+this.s_div_name+"');\" class=\"calendar_link\">"+s_day+"</a>";
									}
								}
							} // fine if anno corrente >= anno
						}
					} else {
						/**
						* TUTTI I GIORNI SONO CLICCABILI
						*/
						if (i_idx==parseInt(this.i_day)) s_css_current_day=" style=\"background-color:#DCDCDC\" ";
	
						s_day = "<a href=\"javascript:;\" onclick=\"cal = new cCalendar('"+this.s_lang+"','"+s_current_calendar_day +"','"+this.s_block_at_day+"'); cal.getCalDate('"+this.s_data_receiver+"'); cal.closeCalendar('"+this.s_div_name+"');\" class=\"calendar_link\">"+s_day+"</a>";
					}
				}
				s_calendar +="<td align=\"center\" "+s_css_current_day+">"+s_day+"</td>";

				// determino quanto inserire il fine riga
				if (i_colonna ==6 )
				{
					s_calendar += "</tr><tr>";
					i_colonna=-1;
				}
			}

			s_calendar +="</tr>";
			s_calendar +="</table>";
			calBox.innerHTML=s_calendar;

			/**
			* apro il calendario
			*/
			this.openCalendar();
		}

		/**
		* _getDaysInMonth
		*
		* metodo che calcola quale è il giorno ultimo del mese
		*
		* @param month mese da considerare
		* @param year anno da considerare
		*
		* @return il giorno ultimo di quel mese
		*/
		function _getDaysInMonth(month,year)
		{
			var m = [31,28,31,30,31,30,31,31,30,31,30,31];

			if (month != 2) return m[month - 1];
			if (year%4 != 0) return m[1];
			if (year%100 == 0 && year%400 != 0) return m[1];
			return m[1] + 1;
		}

		/**
		* _format
		*
		* metodo che formatta eventualmente il valore passato a due cifre
		*
		* @param s_value valore da formattare
		* @return il valore formattato
		*/
		function _format(s_value)
		{
			if (s_value.length==1)
			{
				s_value="0"+s_value;
			}
			return s_value;
		}
	}
