// sasn.js
// autore: Iacopo
// copyright 2006 Metaware S.p.A.
// creato nel 04/2006


/**
 * Oggetto che comunica con la servlet di SASN
 */
var SASNClient = new Object();

// Inizializzazione dell'oggetto downloader
/** 
 * L'id dell'elemento HTML che verr&agrave; manipolato dalle funzioni di managing dei vari eventi. 
 * Inoltre, durante il loading di una servlet, verranno disabilitati tutti gli input 
 * al suo interno 
 */ 
SASNClient.formId = null;
SASNClient.loaderId = null;
SASNClient.postExecute = null;
SASNClient.manageData = null;
SASNClient.isOperating = false;
SASNClient.service = null;    //servizio per il quale &egrave; stata fatta la richiesta

/* Questo e' il metodo da invocare per recuperare i dati da SASN.
 * I dati ritornati sono la lista delle costanti per il servizio indicato.
 * 
 * - service: il servizio SASN per cui si vogliono le costanti:
 *		0 - Visita Fiscale
 *      1 - Visita preimbarco
 *      2 - Visita Psicoattitudinale
 *      3 - Inserimento Contratto
 * - divId e' l'id del div che contiene i campi da disabilitare durante il caricamento (OPZIONALE)
 * - loaderId e' l'id del div che contiene il box di informazione di loading (OPZIONALE)
 * - manageData &egrave; la funzione che verr&agrave; chiamata una volta ottenuto il DOM di risposta e che provveder&agrave; 
 *		a gestire i dati ricevuti (aggiornando/abilitando campi, riempiendo labels etc...)
 * - postExecute puo' contenere del codice javascript arbitrario da eseguire quando
 *    arriva una risposta positiva dalla servlet (dopo che vengono caricati i dati).
 */
SASNClient.caricaCostanti = function (service,  cfAzienda, cfResponsabile, tipoDatore, loaderId, divId, manageData, postExecute)
{
	// POSSIBILE CORSA CRITICA, ma solo se l'utente si mette a cliccare come un forsennato a caso
	while (SASNClient.isOperating == true)
	{
		//return;
	}
  SASNClient.service = service;
  SASNClient.isOperating = true;
  SASNClient.formId = divId;     //bruuuuuutto!!!
  SASNClient.loaderId = loaderId;     //bruuuuuutto!!!
  SASNClient.postExecute = postExecute;
  SASNClient.downloader = MwAjaxUtil.newXMLDownloader();

  var command = 'SASN?command=elenco-costanti&service=' + service + '&cf-azienda=' + cfAzienda + '&cf-responsabile=' + cfResponsabile;

  if (tipoDatore != null)
  {
  	command = command + '&tipo-datore=' + tipoDatore;
  }
	// TODO controllare che manageData sia funzione e non variabile!  
  SASNClient.manageData = manageData; //bruuuuuutto!!!
  SASNClient.vediLoading(true);                //mostra il box di attesa
  var risposta = this.processRequest(command);
} 



//Finestra di errore personalizzata SASN
SASNClient.produciErroreSASN = function (param)
{
  alert('SASN: ' + param);
}

//Richiesta ASINCRONA verso la servlet
SASNClient.processRequest = function (richiesta)
{
    var risposta = '';

    SASNClient.downloader.onreadystatechange = SASNClient.processReqChange;
    SASNClient.downloader.open("GET", richiesta, true);
	SASNClient.downloader.send(null);
}

//Questo metodo viene chiamato quando l'oggetto 'richiesta' cambia stato
// E' necessario controllare se la risposta ha avuto esito positivo.
SASNClient.processReqChange = function ()
{
    var risposta = null;

    if (SASNClient.downloader.readyState != 4)
       return;
 
    try
    {
        if (SASNClient.downloader.status == 200)
        {
        	risposta = MwAjaxUtil.parseXML(SASNClient.downloader);

            SASNClient.vediLoading(false);
			SASNClient.manageData(risposta, SASNClient.cf);
            if (SASNClient.postExecute != null)
                setTimeout(SASNClient.postExecute, 1);
        }
        else
        {
            alert("Servizio di recupero dati non disponibile.");
            SASNClient.vediLoading(false);
        }    
    }
    finally
    {
   	    SASNClient.isOperating = false;
   	}
}

//Cerco l'elemento 'divLoading' nel documento e ne cambio lo stato
SASNClient.vediLoading = function(flag)
{     
  if (SASNClient.loaderId == null || SASNClient.loaderId != '')
  {      
    var divLoading = document.getElementById(SASNClient.loaderId);
  
    if (divLoading != null)
    {
    	if (divLoading.tagName == 'DIV')
    	{
        	divLoading.style.visibility = (flag) ? 'visible' : 'hidden';
        }
        else
        {
        	divLoading.style.display = (flag) ? '' : 'none';
        }
    }
  }
  
  if (SASNClient.formId == null || SASNClient.formId != '' )
  {      
    var datiForm = document.getElementById(SASNClient.formId);
    var controlli;
  
    if (datiForm != null)
    {
        controlli = datiForm.getElementsByTagName('input');
        FormUtility.abilitaControlli(controlli, !flag);

        controlli = datiForm.getElementsByTagName('select');
        FormUtility.abilitaControlli(controlli, !flag);

        controlli = datiForm.getElementsByTagName('textarea');
        FormUtility.abilitaControlli(controlli, !flag);
    }   
  }
}


/**
 * Gestore asincrono eventi di arrivo risposta a servlet
 */
var SASNHandler = new Object();

/**
 * mappa codice=> nome SASN
 */
SASNHandler.SASNDaCodice = new Object();
/**
 * mappa codice=> tipo denuncia
 */
SASNHandler.TipoDenunciaDaCodice = new Object();
/**
 * mappa codice=> compartimento
 */
SASNHandler.CompartimentoDaCodice = new Object();
/**
 * mappa codice=> contratto
 */
SASNHandler.ContrattoDaCodice = new Object();
/**
 * mappa codice=> qualifica
 */
SASNHandler.QualificaDaCodice = new Object();
/**
 * mappa codice=> classe visita
 */
SASNHandler.ClasseVisitaDaCodice = new Object();
/**
 * mappa codice=> tipo visita 1
 */
SASNHandler.TipoVisita1DaCodice = new Object();
/**
 * mappa codice=> tipo visita 2
 */
SASNHandler.TipoVisita2DaCodice = new Object();
/**
 * mappa codice=> tipo Licenza 1
 */
SASNHandler.TipoLicenza1DaCodice = new Object();
/**
 * mappa codice=> tipo Licenza 2
 */
SASNHandler.TipoLicenza2DaCodice = new Object();
/**
 * mappa codice=> tipo Licenza 2
 */
SASNHandler.LimitazioneDaCodice = new Object();



/**
 * Gestisce l'arrivo dei dati delle costanti
 */
SASNHandler.managePopolaSelectCostanti = function(risposta)
{
/*
	<esito-popolamento-combo>
  	  <elenco-sasn>
		<sasn codice="1">NAPOLI</sasn>
		<sasn codice="2">BARI</sasn>
		<sasn codice="3">GENOVA</sasn>
		<sasn codice="4">CIVITAVECCHIA</sasn>
	  </elenco-sasn>
	  <elenco-denunce>
		<tipo-denuncia codice="0">Denuncia di malattia</tipo-denuncia>
		<tipo-denuncia codice="00">Denuncia di malattia dopo lo sbarco</tipo-denuncia>
		<tipo-denuncia codice="01">Denuncia di malattia durante l'imbarco</tipo-denuncia>
		<tipo-denuncia codice="1">Denuncia di Infortunio</tipo-denuncia>
	  </elenco-denunce>
	</esito-popolamento-combo>
*/
	var form = document.getElementById(SASNClient.formId);
	var selects = form.getElementsByTagName("select");
	var elenchiSASN = new Array();
	var elenchiTipiDenunce = new Array();
	var elenchiCompartimenti = new Array();
	var elenchiContratti = new Array();
	var elenchiQualifiche = new Array();
	var elenchiClasseVisita = new Array();
	var elenchiTipoVisita1 = new Array();
	var elenchiTipoVisita2 = new Array();
	var elenchiTipoLicenza1 = new Array();
	var elenchiTipoLicenza2 = new Array();
	var elenchiLimitazioni = new Array();
	var elenchiContratti = new Array();

	// Popolo gli array contenenti tutte le select da modificare 
	for(var t = selects.length; t--> 0 ;)
	{
		var tipoSelect = selects[t].getAttribute("mw-sasn");

		if (tipoSelect == 'elenco-sasn')
			elenchiSASN.push(selects[t]);
		else if (tipoSelect == 'elenco-tipi-denuncia')
			elenchiTipiDenunce.push(selects[t]);
		else if (tipoSelect == 'elenco-compartimenti')
			elenchiCompartimenti.push(selects[t]);
		else if (tipoSelect == 'elenco-contratti')
			elenchiContratti.push(selects[t]);
		else if (tipoSelect == 'elenco-qualifiche')
			elenchiQualifiche.push(selects[t]);
		else if (tipoSelect == 'elenco-classi-visita')
			elenchiClasseVisita.push(selects[t]);
		else if (tipoSelect == 'elenco-tipi-visita1')
			elenchiTipoVisita1.push(selects[t]);
		else if (tipoSelect == 'elenco-tipi-visita2')
			elenchiTipoVisita2.push(selects[t]);
		else if (tipoSelect == 'elenco-tipi-licenza1')
			elenchiTipoLicenza1.push(selects[t]);
		else if (tipoSelect == 'elenco-tipi-licenza2')
			elenchiTipoLicenza2.push(selects[t]);
		else if (tipoSelect == 'elenco-limitazioni')
			elenchiLimitazioni.push(selects[t]);
		
			
	}

	SASNHandler.riempiMappaECombo(elenchiSASN, SASNHandler.SASNDaCodice, 'sasn', risposta);
	SASNHandler.riempiMappaECombo(elenchiTipiDenunce, SASNHandler.TipoDenunciaDaCodice, 'tipo-denuncia', risposta);
	SASNHandler.riempiMappaECombo(elenchiCompartimenti, SASNHandler.CompartimentoDaCodice, 'compartimento', risposta);
	SASNHandler.riempiMappaECombo(elenchiContratti, SASNHandler.ContrattoDaCodice, 'tipo-contratto', risposta);

	SASNHandler.riempiMappaECombo(elenchiQualifiche, SASNHandler.QualificaDaCodice, 'tipo-qualifica', risposta);
	SASNHandler.riempiMappaECombo(elenchiClasseVisita, SASNHandler.ClasseVisitaDaCodice, 'classe-visita', risposta);
	SASNHandler.riempiMappaECombo(elenchiTipoVisita1, SASNHandler.TipoVisita1DaCodice, 'tipo-visita1', risposta);
	SASNHandler.riempiMappaECombo(elenchiTipoVisita2, SASNHandler.TipoVisita2DaCodice, 'tipo-visita2', risposta);
	SASNHandler.riempiMappaECombo(elenchiTipoLicenza1, SASNHandler.TipoLicenza1DaCodice, 'tipo-licenza1', risposta);
	SASNHandler.riempiMappaECombo(elenchiTipoLicenza2, SASNHandler.TipoLicenza2DaCodice, 'tipo-licenza2', risposta);
	SASNHandler.riempiMappaECombo(elenchiLimitazioni, SASNHandler.LimitazioneDaCodice, 'tipo-limitazione', risposta);
}


/**
 * FUNZIONI DI SUPPORTO
 */

SASNHandler.riempiComboCostanti = function (arraySelect, elementi)
{
// pattern per rimuovere pezzi non voluti nelle costanti
	var pattern=/^Denuncia di/;

	
	for(t = arraySelect.length; t --> 0 ;)
	{
		var currentSelect = arraySelect[t];
		var initialValue = currentSelect.value;
		var offset = 0;

		if (currentSelect.multiple == false)
		{
			offset = 1;
			currentSelect.options.length = 0;
			currentSelect.options[0] = new Option("Selezionare dalla lista", "", true, false);
		}

		for (var i = 0; i < elementi.length; i++)
		{
			var value = elementi[i].getAttribute("codice");
			var testo = MWUtility.mergeText(elementi[i]);

			testo = testo.replace(pattern, "");

			currentSelect.options[i + offset] = new Option(testo, value, false, value == initialValue); 
		}
	}
} 

SASNHandler.riempiMappaECombo = function (elenchi, mappa, tagName, risposta)
{
	if (elenchi.length != 0)
	{
		var elenco = risposta.getElementsByTagName(tagName);

		// riempio la mappa, mi far&agrave; comodo
		for (var i = 0; i < elenco.length; i++)
		{
			var value = elenco[i].getAttribute("codice");
			var testo = MWUtility.mergeText(elenco[i]);
			var dataFineContratto = elenco[i].getAttribute("flgTempoDet");

			if (dataFineContratto != undefined && dataFineContratto != null && dataFineContratto != '')
			{
				mappa[value + "_fine_contratto"] = dataFineContratto;
			}

			mappa[value] = testo; 
		}
		
		SASNHandler.riempiComboCostanti(elenchi, elenco);	
	}
}


SASNHandler.creaBarreOrizzontali = function (tabella, classeDaRimpiazzare)
{
	var righe = tabella.rows;

	for(var t = 0; t < righe.length; t++)
	{
		var riga = righe.item(t);
		var classe = ((t % 2) == 0) ? "-even" : "-odd"; // pari/dispari invertiti perch&eacute; iniziano da 0

		celle = riga.getElementsByTagName('TD');

		for(i = 0; i < celle.length; i++)
		{
			var cella = celle.item(i); 
			if (cella.className.search(classeDaRimpiazzare) >= 0)
				cella.className = cella.className + classe; 
		}
	} 
}

SASNHandler.controllaDateSASNVisitaFiscale = function (nomeDataMalattia, nomeFineMalattia, dataOdierna, idMessaggio)
{
	var dataMalattiaStr = document.forms[0][nomeDataMalattia].value;
	var dataFineMalattiaStr = document.forms[0][nomeFineMalattia].value;

	var prevColor1 = document.forms[0][nomeDataMalattia].style.backgroundColor;
	var prevColor2 = document.forms[0][nomeFineMalattia].style.backgroundColor;

	var errore = "";
	var confronto1 = Validatore.prototype.confrontaDate(dataMalattiaStr, dataOdierna);
	var confronto2 = Validatore.prototype.confrontaDate(dataOdierna, dataFineMalattiaStr);

	if (confronto1 != null && confronto1 > 0)
		errore = "La data di inizio malattia non puo' essere successiva alla data odierna";
	if (confronto2 != null && confronto2 >= 0)
	{
		if (errore != "")
			errore +="<br/>"; 
		errore +="La data di fine malattia deve essere successiva alla data odierna";
	}

	var campoErrore = document.getElementById(idMessaggio)
	if (errore != "")
	{
		campoErrore.innerHTML = errore;
		campoErrore.parentNode.parentNode.style.display = '';
		document.forms[0][nomeDataMalattia].style.backgroundColor = mw_validator_background_color_error;
		document.forms[0][nomeFineMalattia].style.backgroundColor = mw_validator_background_color_error;
	}
	else
	{
		campoErrore.parentNode.parentNode.style.display = 'none';
		document.forms[0][nomeDataMalattia].style.backgroundColor = prevColor1;
		document.forms[0][nomeFineMalattia].style.backgroundColor = prevColor2;
	}

	return errore;
	
}

SASNHandler.controllaDateSASNPreimbarco = function (nomeDataRichiesta, nomeDataImbarco, idMessaggio)
{
	var dataRichiestaStr = document.forms[0][nomeDataRichiesta].value;
	var dataImbarcoStr = document.forms[0][nomeDataImbarco].value;

	var prevColor1 = document.forms[0][nomeDataRichiesta].style.backgroundColor;
	var prevColor2 = document.forms[0][nomeDataImbarco].style.backgroundColor;

	var errore = "";
	var confronto1 = Validatore.prototype.confrontaDate(dataRichiestaStr, dataImbarcoStr);

	if (confronto1 != null && confronto1 > 0)
		errore = "La data di imbarco non pu&ograve; essere precedente alla data odierna";

	var campoErrore = document.getElementById(idMessaggio)
	if (errore != "")
	{
		campoErrore.innerHTML = errore;
		campoErrore.parentNode.parentNode.style.display = '';
		document.forms[0][nomeDataRichiesta].style.backgroundColor = mw_validator_background_color_error;
		document.forms[0][nomeDataImbarco].style.backgroundColor = mw_validator_background_color_error;
	}
	else
	{
		campoErrore.parentNode.parentNode.style.display = 'none';
		document.forms[0][nomeDataRichiesta].style.backgroundColor = prevColor1;
		document.forms[0][nomeDataImbarco].style.backgroundColor = prevColor2;
	}

	return errore;
	
}

SASNHandler.controllaDateSASNPsicoattitudinale = function (nomeDataRichiesta, nomeDataProposta, idMessaggio)
{
	var dataRichiestaStr = document.forms[0][nomeDataRichiesta].value;
	var dataPropostaStr = document.forms[0][nomeDataProposta].value;

	var prevColor1 = document.forms[0][nomeDataRichiesta].style.backgroundColor;
	var prevColor2 = document.forms[0][nomeDataProposta].style.backgroundColor;

	var errore = "";
	var confronto1 = Validatore.prototype.confrontaDate(dataRichiestaStr, dataPropostaStr);

	if (confronto1 != null && confronto1 > 0)
		errore = "La data proposta non pu&ograve; essere precedente alla data odierna";

	var campoErrore = document.getElementById(idMessaggio)
	if (errore != "")
	{
		campoErrore.innerHTML = errore;
		campoErrore.parentNode.parentNode.style.display = '';
		document.forms[0][nomeDataRichiesta].style.backgroundColor = mw_validator_background_color_error;
		document.forms[0][nomeDataProposta].style.backgroundColor = mw_validator_background_color_error;
	}
	else
	{
		campoErrore.parentNode.parentNode.style.display = 'none';
		document.forms[0][nomeDataRichiesta].style.backgroundColor = prevColor1;
		document.forms[0][nomeDataProposta].style.backgroundColor = prevColor2;
	}

	return errore;
	
}


SASNHandler.controllaDateSASNInserimentoContratto = function (nomeDataInizio, nomeDataFine, idMessaggio)
{
	var dataInizioStr = document.forms[0][nomeDataInizio].value;
	var dataFineStr = document.forms[0][nomeDataFine].value;

	var prevColor1 = document.forms[0][nomeDataInizio].style.backgroundColor;
	var prevColor2 = document.forms[0][nomeDataFine].style.backgroundColor;

	var errore = "";
	var confronto1 = Validatore.prototype.confrontaDate(dataInizioStr, dataFineStr);

	if (confronto1 != null && confronto1 >= 0)
		errore = "La data di fine deve essere successiva alla data di inizio contratto";

	var campoErrore = document.getElementById(idMessaggio)
	if (errore != "")
	{
		campoErrore.innerHTML = errore;
		campoErrore.parentNode.parentNode.style.display = '';
		document.forms[0][nomeDataInizio].style.backgroundColor = mw_validator_background_color_error;
		document.forms[0][nomeDataFine].style.backgroundColor = mw_validator_background_color_error;		
	}
	else
	{
		campoErrore.parentNode.parentNode.style.display = 'none';
		document.forms[0][nomeDataInizio].style.backgroundColor = prevColor1;
		document.forms[0][nomeDataFine].style.backgroundColor = prevColor2;
		
	}

	return errore;
	
}


SASNHandler.controllaDateSASNCessazioneContratto = function (nomeDataCessazione, inizioContrattoStr, fineContrattoStr, idMessaggio)
{
	var dataComunicataStr = document.forms[0][nomeDataCessazione].value;

	var prevColor = document.forms[0][nomeDataCessazione].style.backgroundColor;

	var errore = "";

	if (fineContrattoStr != undefined && fineContrattoStr != null)
	{
		var confronto1 = Validatore.prototype.confrontaDate(dataComunicataStr, fineContrattoStr);
	
		if (confronto1 != null && confronto1 > 0)
			errore = "La data comunicata non pu&ograve; essere successiva alla data di fine del contratto";

		if (confronto1 == 0)
		{
			var oggi = new Date();
			var oggiStr = oggi.getDate() + '/' + oggi.getMonth() + '/' + oggi.getFullYear();
	
			var confronto1a = Validatore.prototype.confrontaDate(oggiStr, fineContrattoStr);
			if (confronto1a < 0)
				errore = "La data di fine non pu&ograve; essere confermata prima della scadenza del contratto";
		}

	}
	var confronto2 = Validatore.prototype.confrontaDate(inizioContrattoStr, dataComunicataStr);

	if (confronto2 != null && confronto2 >= 0)
		errore = "La data comunicata deve essere successiva alla data inizio del contratto";

	var campoErrore = document.getElementById(idMessaggio)
	if (errore != "")
	{
		campoErrore.innerHTML = errore;
		campoErrore.parentNode.parentNode.style.display = '';
	    document.forms[0][nomeDataCessazione].style.backgroundColor = mw_validator_background_color_error;		
	}
	else
	{
		campoErrore.parentNode.parentNode.style.display = 'none';
		document.forms[0][nomeDataCessazione].style.backgroundColor = prevColor;
	}

	return errore;
	
}


SASNHandler.sincronizzaCostante = function(selectName, hiddenName, mappa)
{
	var form = document.getElementById(SASNHandler.formId);
	form[hiddenName].value = mappa[form[selectName].value];
}



 
