/*======================================================================
   Schedule: calendario dinamico
------------------------------------------------------------------------
   Last update: 16/12/2010
----------------------------------------------------------------------*/

 	// Dichiarazione variabili esterne dei parametri (pubbliche) coi valori di default
	// (da valorizzare nella pagina HTML/highlight prima di chiamare la funzione di costruzione del calendario)
 	var allowManualInput  = true;  // Flag per l'abilitazione dell'introduzione manuale della data
	var allowDateChange   = true;  // Flag per l'abilitazione dei pulsanti per il cambio data
	var displayCurrentDay = true;  // Flag per evidenziare il giorno corrente
	var displayEvents     = true;  // Flag per l'abilitazione degli eventi associati
		
 	// Dichiarazione variabili comuni interne (private)
 	var strURL         = '#';  // URL del servizio della tabella degli eventi
 	var dTmp           = new Date();
 	var	newHtml        = new String('');
 	var Mesi_IT        = new Array('Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre');
 	var Mesi_EN        = new Array('January', 'February', 'March', 'April', 'Maj', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
	var NrGiorni       = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
 	var Giorni_IT      = new Array('LU', 'MA', 'ME', 'GI', 'VE', 'SA', 'DO');
 	var Giorni_EN      = new Array('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA');
	var offset_IT      = 0;
	var offset_EN      = 1;
	var titlePrev_IT   = 'Mese precedente';
	var titleNext_IT   = 'Mese successivo';
	var titlePrev_EN   = 'Previous month';
	var titleNext_EN   = 'Next month';
	var labelVai_IT    = 'Introduci data:'
	var labelVai_EN    = 'Introduce date:'
	var btnVai_IT      = 'media/img/bottoni/vai_body.gif';
	var btnVai_EN      = 'media/img/bottoni/vai_body_en.gif';
	var titleVai_IT    = 'Vai alla data';
	var titleVai_EN    = 'Go to date';
	var eventTitle_IT  = 'Mostra evento';
	var eventTitle_EN  = 'Show event';
 	var dateErr_IT     = 'La data introdotta non è valida';
 	var dateErr_EN     = 'Invalid date';
 
 	var eventLink    = new Array('',	'#',	'',	'#',	'',	'',	'#',	'',	'',	'',	'#',	'',	'',	'',	'',	'',	'',	'#',	'',	'',	'',	'',	'',	'',	'',	'',	'#',	'',	'#',	'',	'');
 
 	//Nella pagina deve essere valorizzato con il nome della funzione DWR da richiamara
 	var functionToCall;
 	var arrayEvent = new Array;
 
	

	
/*--------------------------------------------------------------------------
  Funzione di costruzione del calendario 
----------------------------------------------------------------------------
  Parametri:
    date         : oggetto data
    calendarID   : ID del div che contiene il calendario
		  lingua       : lingua del calendario =>  "IT", "EN"
*/
function calendarBuilding(dateObj, calendarID, lingua, arrayEvent) {

	var eventDay = arrayEvent;

  // Localizzazione calendario
  if (lingua == "IT") {
    nomiMese   = Mesi_IT;
    nomiGiorno = Giorni_IT;
    offset     = offset_IT;
		titlePrev  = titlePrev_IT;
		titleNext  = titleNext_IT;
		btnVai     = btnVai_IT;
		titleVai   = titleVai_IT;
		labelVai   = labelVai_IT;
		eventTitle = eventTitle_IT;
		dateErr    = dateErr_IT;
	} 
	else {
    nomiMese   = Mesi_EN;
    nomiGiorno = Giorni_EN;
    offset     = offset_EN;
		titlePrev  = titlePrev_EN;
		titleNext  = titleNext_EN;
		btnVai     = btnVai_EN;
		titleVai   = titleVai_EN;
		labelVai   = labelVai_EN;
		eventTitle = eventTitle_EN;
		dateErr    = dateErr_EN;
	}

  // Ripristino dei parametri specifici
	if (document.getElementById(calendarID + '_allowManualInput')){ // Se esiste il campo non è la prima buid => legge i valori specifici
		allowManualInput  = eval(document.getElementById(calendarID + '_allowManualInput').value);
	  allowDateChange   = eval(document.getElementById(calendarID + '_allowDateChange').value);
	  displayCurrentDay = eval(document.getElementById(calendarID + '_displayCurrentDay').value);
	  displayEvents     = eval(document.getElementById(calendarID + '_displayEvents').value);
	}

  // Inizializzazione variabili
  mese       = dateObj.getMonth();
	anno       = dateObj.getFullYear();
	giorno     = dateObj.getDate();
	giornoSett = dateObj.getDay();
  giorniMese = NrGiorni[mese];
  newHtml    = '\n\n';                  // Reset del codice HTML
  cnt = 1;                              // Contatore giorni
	startCnt = false;                     // Flag per l'avvio dell'inserimento dei giorni

	// Verifica se è un febbraio bisestile
	if (mese == 1) {                      // Indice del mese di febbraio
  	dTmp.setFullYear(anno);             // Forza la costituzione della data bisestile
		dTmp.setMonth(1);
		dTmp.setDate(29);
  	x = dTmp.getMonth();                // Legge l'indice del mese restituito
  	if (x == mese) {giorniMese = 29;};  // Se non è bisestile, il 29 febbraio diventa 1 marzo => mese differente
	}

  // Determina il nr. di giorno della settimana del primo giorno del mese
  dTmp.setFullYear(anno);             // Forza la costituzione della data bisestile
	dTmp.setMonth(mese);
	dTmp.setDate(1);
	primoGiornoMese = dTmp.getDay();
  primoGiornoMese += offset;
  if (primoGiornoMese < 1) { primoGiornoMese = 7};
  if (primoGiornoMese > 7) { primoGiornoMese = 1};


  /* ---- Costruzione del calendario ---- */

  // Inserisce campi nascosti coi parametri di sistema ed i valori di anno e mese, utilizzati per il cambio mese
  htmlAdd(' <!-- Parametri di sistema -->');
  htmlAdd(' <input id="' + calendarID + '_allowManualInput"  type="hidden" value="' + allowManualInput + '" />');
  htmlAdd(' <input id="' + calendarID + '_allowDateChange"   type="hidden" value="' + allowDateChange + '" />');
  htmlAdd(' <input id="' + calendarID + '_displayCurrentDay" type="hidden" value="' + displayCurrentDay + '" />');
  htmlAdd(' <input id="' + calendarID + '_displayEvents"     type="hidden" value="' + displayEvents + '" />');
  htmlAdd(' <!-- Variabili di controllo -->');
  htmlAdd(' <input id="' + calendarID + '_anno"   type="hidden" value="' + anno + '" />');
	htmlAdd(' <input id="' + calendarID + '_mese"   type="hidden" value="' + mese + '" />');
	htmlAdd(' <input id="' + calendarID + '_giorno" type="hidden" value="' + giorno + '" />');
	htmlAdd(' <input id="' + calendarID + '_lang"   type="hidden" value="' + lingua + '" />');
	htmlAdd('');

  // Inserisce i controlli per introduzione manuale della data
	if (allowManualInput) {
	  htmlAdd(' <!-- Selezione manuale data -->');
	  htmlAdd(' <div class="floatdx" style="">');
	  htmlAdd('   <span style="color:#185695; font-weight:bold; font-size:11px">' + labelVai + '</span>');
	  htmlAdd('   <input type="text" id="' + calendarID + '_date" value="" style="width:60px; color:#009" />');
	  htmlAdd('   <input class="floatdx" type="image" src="' + btnVai + '" onclick="javascript:setMonth(\'' + calendarID + '\')" title="' + titleVai + '">');
	  htmlAdd(' </div>');
		htmlAdd(' <br clear="all"><br class="brh5" />');
	}

  // Intestazione calendario
  htmlAdd(' <!-- Pulsanti naviagazione mese -->');
	htmlAdd(' <div class="monthBtn">');
	htmlAdd('   <div class="panel">');
	if (allowDateChange) { // Se il flag è abilitato, visualizza i controlli di navigazione calendario
		htmlAdd('     <div class="nav floatsx">');
	  htmlAdd('       <a href="javascript:newMonth(\'prev\', \'' + calendarID + '\')" title="' + titlePrev + '"><img src="/media/img/ico/arrow_left.gif" height="11" width="8" style="padding-top:0px; border:0px;"></a>');
		htmlAdd('     </div>');
		htmlAdd('     <div class="nav floatdx">');
	  htmlAdd('       <a href="javascript:newMonth(\'next\', \'' + calendarID + '\')" title="' + titleNext + '"><img src="/media/img/ico/arrow_right.gif" height="11" width="8" style="padding-top:0px; border:0px;"></a>');
		htmlAdd('     </div>');
	}
	htmlAdd('     ' + nomiMese[mese] + ' ' + anno);
	htmlAdd('   </div>');
	htmlAdd(' </div>');
	htmlAdd(' <br class="brh5" />');
	htmlAdd('');

  // Tabella dei giorni
  htmlAdd(' <!-- Tabella delle date -->');
	htmlAdd(' <table cellspacing="5" cellpadding="0" align="center">');
	htmlAdd('   <thead>');
	htmlAdd('     <tr>');
	for (i = 0; i <= 6 ; i++){  // Scansione per righe
  	htmlAdd('       <th>' + nomiGiorno[i] + '</th>');
	}
	htmlAdd('     </tr>');
	htmlAdd('   </thead>');
	htmlAdd('   <tbody>');
  for (row = 0; row <= 5 && cnt<=giorniMese; row++) {
  	htmlAdd('     <tr>');
 		for (col = 1; col <= 7; col++) { // Scansione per colonne

  		/* --- Controlli sulle date e definizioni dei contenuti --- */

      // Ripristino dei default
			tdClass   = 'normal';
			aTagOpen  = '';
			aTagClose = '';
			dayNumber = '';

      // Controllo per l'inizio popolamento del calendario
      if (row == 0 && col == primoGiornoMese) {startCnt = true };
      if (startCnt) {

        // Controllo esistenza eventi per la data
        if (eventDay[cnt - 1] == 1 && displayEvents && cnt <= giorniMese){
					tdClass    = 'event';
					// Costruzione della stringa della data da passare come parametro e definisce il tag HTML
          strMese   = mese + 1; if (strMese < 10)   { strMese   = '0' + strMese; }
					strGiorno = cnt;      if (strGiorno < 10) { strGiorno = '0' + strGiorno; }
          strHref   = strURL + '?date=' + anno + strMese + strGiorno;
					aTagOpen  = '<a href="' + strHref + '" title="' + eventTitle + '">';
          aTagClose = '</a>';
				}
									
        // Controllo per evidenziazione il giorno corrente
		  	if (cnt == giorno && displayCurrentDay) { tdClass += ' today'; }
								
        // Controllo per la numerazione delle caselle
				if (cnt <= giorniMese){
					dayNumber = cnt;
					cnt += 1;
				}
									
			}

      // Scrittura della cella
      tdContent = aTagOpen + dayNumber + aTagClose;
      htmlAdd('       <td width="32" class="' + tdClass + '">');
      htmlAdd('       ' + tdContent);
      htmlAdd('       </td>');

    }
  	htmlAdd('     </tr>');
	}
	htmlAdd('   </tbody>');
	htmlAdd('</table>');

  /* Finale: sostituisce il contenuto del DIV col nuovo calendario */
  document.getElementById(calendarID).innerHTML = newHtml;
}


/*--------------------------------------------------------------------------
  Funzione di costruzione (append) del testo HTML leggibile
----------------------------------------------------------------------------
  Parametri:
    txt : stringa del codice da accodare
*/
function htmlAdd(txt){
 newHtml += txt + '\n';
}


/*--------------------------------------------------------------------------
  Calcola il nuovo mese e rilancia la generazione del calendario
----------------------------------------------------------------------------
  Parametri:
    mode    : spostamento avanti o indietro
    objID   : ID del div che contiene il calendario da rigenerare
		giorno  : giorno attuale (selezionato) prima della rigenerazione
*/
function newMonth (mode, objID) {

  anno   = document.getElementById(objID + '_anno').value;
  mese   = document.getElementById(objID + '_mese').value;
  giorno = document.getElementById(objID + '_giorno').value;
  lang   = document.getElementById(objID + '_lang').value;

  /* Calcolo nuovo mese e anno */
	if (mode == 'prev') {
		nuovoMese = mese - 1;
  	if (nuovoMese < 0) {
			nuovoMese = 11;
			anno -= 1;
		}
	} 
	else {
		nuovoMese = eval(mese) + 1;
		if (nuovoMese > 11) {
			nuovoMese = 0;
			anno = eval(anno) + 1;
		}
	}

  /* Crea la nuova data e lancia la rigenerazione */
  d.setFullYear(anno);
	d.setMonth(nuovoMese);
	d.setDate(giorno);
  functionToCall(d.getMonth(), d.getFullYear());
}


/*--------------------------------------------------------------------------
  Imposta il nuovo mese ad una data specifica e rilancia la generazione del calendario
----------------------------------------------------------------------------
  Parametri:
	objID   : ID del div che contiene il calendario da rigenerare
*/
function setMonth (objID) {

	lang   = document.getElementById(objID + '_lang').value;
	data   = new String( document.getElementById(objID + '_date').value);

  if (checkDateValue(data, lang)) {

		dataEl = data.split("/");
    d.setFullYear(dataEl[2]);
		if (lang=='IT'){
			d.setMonth(dataEl[1] - 1);
			d.setDate(dataEl[0]);
		} 
		else {
			d.setMonth(dataEl[0] - 1);
    	d.setDate(dataEl[1]);
		}
    functionToCall(d.getMonth(), d.getFullYear());
	} 
	else {
		alert (dateErr);
	}
}


/*--------------------------------------------------------------------------
  Controlla la validità della nuova data
----------------------------------------------------------------------------
  Parametri:
	data  : Valore della data  da controllare
	lang  : lingua usata nel calendario, per determinare il formato data
*/
function checkDateValue(date, lang) {

  checkDate = date.split("/");
  dTmp.setFullYear(checkDate[2]);
	if (lang=='IT'){
		dTmp.setMonth(checkDate[1] - 1);
		dTmp.setDate(checkDate[0]);
	} 
	else {
		dTmp.setMonth(checkDate[0] - 1);
		dTmp.setDate(checkDate[1]);
	}

  x = '';
  if (lang=='IT'){
    x += dTmp.getDate() + '/';
		x += eval(dTmp.getMonth() + 1) + '/'
		x += dTmp.getFullYear();
  } 
	else {
		x += eval(dTmp.getMonth() + 1) + '/'
    x += dTmp.getDate() + '/';
		x += dTmp.getFullYear();
	}

  // Se le date sono uguali, restituisce true
  return (date == x);
}
