/**
 * In questo file si trovano oggetti, funzioni e costanti di supporto all'u
 */

var FormUtility = new Object();

/**
 * Abilita o disabilita un array di controlli
 */
FormUtility.abilitaControlli = function (controlli, abilita)
{
	if (controlli == null)
	    return;
	    
	for (var i = controlli.length; --i >= 0; )
	    if (abilita)
	        controlli[i].disabled = false;
	    else
	        controlli[i].disabled = true;
}

/**
 * Abilita o disabilita un gruppo di elementi: un gruppo di elementi e' l'insieme di tutti gli elementi HTML che dichiarano
 * l'attributo 'mw-group' col valore gruppoName. Tutti gli elementi vengono resi invisibili e gli input al loro interno disabilitati
 * se abilita e' false.
 */
FormUtility.abilitaGruppo = function (gruppoName, abilita, radice)
{
	if (radice.nodeType == Node.ELEMENT_NODE)
	{
	  // sono in un nodo DOM
	  var gruppo = radice.getAttribute('mw-group');

	  if (gruppoName == gruppo)
	  {
	  	// disabilito da radice in gia'
	  	FormUtility.abilitaTuttiControlli(abilita, radice);
	  	radice.style.display = (abilita == true) ? '' : 'none';
	  }
	  else
	  {
	 	 // cerco nei figli
	  	for (var i = radice.firstChild; i != null; i=i.nextSibling)
	  	{
       		if (i.nodeType == Node.ELEMENT_NODE )
       		{
           		FormUtility.abilitaGruppo(gruppoName, abilita, i);
       		}
	  	}
	  }
	}
	else
	{
	   // chiudo la ricorsione
	   return;
	}
}


/**
 * Abilita o disabilita una sezione di un form: disabilitando, la sezione (un qualsiasi elemento HTML come table, div, tr ...)
 * viene resa invisibile e tutti gli input, select e textarea al suo interno vengono disabilitati. 
 * 
 * @param flag : se true la sezione viene abilitata
 * @param idSezione : l'id del tag che rappresenta la sezione
 */
FormUtility.abilitaSezione = function (flag, idSezione, lasciaVisibile)
{
    var scomparsa = document.getElementById(idSezione);
 
	FormUtility.abilitaTuttiControlli(flag, scomparsa, lasciaVisibile); 	
}

/**
 * Abilita o disabilita una sezione di un form: disabilitando, la sezione (un qualsiasi elemento HTML come table, div, tr ...)
 * viene resa invisibile e tutti gli input, select e textarea al suo interno vengono disabilitati. 
 * 
 * @param flag : se true la sezione viene abilitata
 * @param idSezione : il tag HTML radice
 */
FormUtility.abilitaTuttiControlli = function(flag, elementoHTML, lasciaVisibile)
{
	if (flag)
    {
      elementoHTML.style.display = '';
    }
    else if (lasciaVisibile == null || lasciaVisibile == false)
    {
      elementoHTML.style.display = 'none';
    }

    controlli = elementoHTML.getElementsByTagName('input');
    this.abilitaControlli(controlli, flag);
    
    controlli = elementoHTML.getElementsByTagName('select');
    this.abilitaControlli(controlli, flag);
    
    controlli = elementoHTML.getElementsByTagName('textarea');
    this.abilitaControlli(controlli, flag);

    controlli = elementoHTML.getElementsByTagName('button');
    this.abilitaControlli(controlli, flag);

    controlli = elementoHTML.getElementsByTagName('submit');
    this.abilitaControlli(controlli, flag);
}


FormUtility.esempioData = "gg/mm/aaaa";

/**
 * Se il valore di un input e' stringa vuota, mette una stringa di esempio e la rende selezionata 
 */
FormUtility.mostraEsempio = function(controllo, esempio)
{
	if (controllo.value == '') 
	{
		controllo.value = esempio; 
		controllo.select();
	}
}

FormUtility.nascondiEsempio = function(controllo, esempio)
{
	if (controllo.value == esempio) 
		controllo.value = ''; 
}

/**
 * tabella = elemento <TABLE> da modificare
 * classeDaRimpiazzare = stringa contenente il nome della classe a cui vanno appesi i valori -odd e -even
 * conto = intero da cui si comincia a contare (qualsiasi sia vale il suo %2)
 * escludiHidden = booleano, se vero le righe hidden non entrano nel conto
 * salta = salta le prime n righe 
 */
FormUtility.creaBarreOrizzontali = function (tabella, classeDaRimpiazzare, conto, escludiHidden, salta)
{
	var righe = tabella.rows;
	var c = (conto != null) ? conto : 0;
	var escludi = (escludiHidden != null) ? escludiHidden : false;
	var t = (salta != null) ? salta : 0;

	var classe = ((c% 2) == 0) ? "-odd" : "-even"; // pari/dispari invertiti perche' iniziano da 0

	for(; t < righe.length; t++)
	{
		var riga = righe.item(t);

		if (!escludi || riga.style.display != 'none')
		{
			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.replace("-odd", "").replace("-even", "") + classe; 
			}
			classe = (classe == "-even") ? "-odd" : "-even";
		}		
	} 
}

/**
 * Metodo che rimpiazza le occorrenze di una certa stringa con odd - even
 * Ho introdotto questo perche' mi serviva uno strumento piu' selettivo.
 * Occhio perche' stringaDaRimpiazzare e' una regexp
 *
 * TODO! NON VA BENE! Nelle librerie di uso comune NON bisogna far proliferare in questo modo le funzioni, senno' finisce che 
 * diventano inutilizzabili: RINOMINARE il metodo o SPOSTARLO in kiko.js 
 */
FormUtility.creaBarreOrizzontali2 = function (tabella, stringaDaRimpiazzare, conto)
{
	var righe = tabella.rows;
	var c = (conto != null) ? conto : 0;

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

		celle = riga.getElementsByTagName('TD');

		for(i = 0; i < celle.length; i++)
		{
			var cella = celle.item(i); 
			cella.className = cella.className.replace(stringaDaRimpiazzare, classe); 
		}
	} 
}

/**
 * Utilita' per mostrare il contatore dei caratteri rimanenti in un testo (e per impedire di inserirne troppi)
 *    es di inizializzazione di chCounterArray:
 *       - FormUtility.chCounterArray['informazioni'] = document.getElementById('charCounter_informazioni');
 *       - FormUtility.chCounterMax['informazioni'] = 250;
 *
 *    es di utilizzo:
 *       <label>Inserire le informazioni<br/>
 *           <div style="position: relative;">
 *               <textarea cols="80" rows="4" id="informazioni" class="width_45"
 *                   mw-type="string" mw-pattern="([\w\W]){{0,250}}"
 *                   name="{informazioni/@__id}"
 *                   onfocus="FormUtility.mostraCounter(true, this)"
 *                   onblur="FormUtility.mostraCounter(false, this); validatore.coloredValidate(this)"
 *                   onkeypress="return FormUtility.testaLunghezza(this, event)"
 *                   onkeyup="FormUtility.contaRimanenti(this)">&nbsp;</textarea>
 *               <div id="charCounter_informazioni" 
 *                   class="floating-alert" 
 *                   style="display: none; padding: 1px; width: 4em; top: 0px;left: 45em;">&nbsp;</div>
 *           </div>
 *       </label>
 */
FormUtility.chCounterArray = new Object(); //questo e' un array di oggetti tipo div o span, qui dentro finira' il contatore
FormUtility.chCounterMax = new Object();
FormUtility.chCounterTesto = '<br/><span style="font-size: 9px">caratteri<br/>disponibili</span>';
   
FormUtility.mostraCounter = function(mostra, nodo, max)
{
    var counter = FormUtility.chCounterArray[nodo.id];
    var massimo = FormUtility.chCounterMax[nodo.id];
    if (!mostra)
        counter.style.display = 'none';
    else
    {
        counter.style.display = '';
        FormUtility.contaRimanenti(nodo, massimo);   
    }
}

/*  Serve a testare e controllare che non vengano pigiati troppi tasti
 *  Si puo' chiamare o cosi': FormUtility.testaLunghezza(this, event, 250)
 *  o cosi': FormUtility.testaLunghezza(this, event) pero' e' necessario specificare l'array di configurazione
 */
   
FormUtility.testaLunghezza = function(nodo, evento, max)
{
    var massimo = (max == null || max == undefined) ? FormUtility.chCounterMax[nodo.id] : max;
    var tasto = FormUtility.getKey(evento);
   
    if (tasto == null || tasto == 0 || tasto == 8 || tasto == 9 || tasto == 27)
        return true;
   
    return FormUtility.realLength(nodo.value + String.fromCharCode(tasto)) <= massimo;
    //return (nodo.value.length < massimo);
}

FormUtility.realLength = function(testo)
{
	var dummy = testo.length;
	var found = testo.indexOf('\n');
	
	while (found != -1)
	{
		dummy++;
		found = testo.indexOf('\n', found +1);
	}

    return dummy;
}

FormUtility.contaRimanenti = function(nodo, max)
{
    var counter = FormUtility.chCounterArray[nodo.id];
    var massimo = FormUtility.chCounterMax[nodo.id];
    var resto = massimo - FormUtility.realLength(nodo.value);
    counter.innerHTML = ((resto > 0) ? resto : 0) + FormUtility.chCounterTesto;
}

FormUtility.getKey = function(e)
{   //questo serve perche' IE tanto per cambiare fa cose diverse dagli altri
    if (window.event)
        return window.event.keyCode;
    else if (e)
        return e.which;
    else
        return null;
}

FormUtility.getEventTarget = function(e)
{   //questo serve perche' IE tanto per cambiare fa cose diverse dagli altri
   if (!e) var e = window.event;

   var target = null;

   if (e.target)
       target = e.target;
   else if (e.srcElement)
       target = e.srcElement;
   
   if (target != null && target != undefined)
       return target.parentNode;
   else
       return null;
}

FormUtility.sopprimiInvio = function(evento)
{
    var tasto = FormUtility.getKey(evento);
   
    return (tasto != 13);
}

FormUtility.mostraLoghi = function()
{
    var nodo = document.getElementById('id_contenitore_loghi');
    var contenuto = '';
     
    for (var i=arguments.length; i-->0 ;)
    {
        if ((typeof arguments[i]) != 'string')
            alert('Utilizzo non valido di mostraLoghi');

        var logo = arguments[i];

        switch (arguments[i])
        {
            case 'CCIAA':
                contenuto += '';
                break;
            case 'INAIL':
                contenuto += '';
                break;
            case 'INPS':
                contenuto += '<img src="images/INPS.png" alt="INPS" title="INPS" style="float: right"/>';
                break;
            case 'CDP':
                contenuto += '';
                break;
            case 'MDS/SASN':
                contenuto += '<img src="images/logoMds.gif" alt="MdS" title="MdS" style="float: right"/>';
                break;
            case 'MDS/USMAF':
                contenuto += '<img src="images/logoUsmaf.png" alt="USMAF" title="USMAF" style="float: right; padding-left:1em;"/>';
                contenuto += '<img src="images/logoMds.gif" alt="MdS" title="MdS" style="float: right; margin-top: 16px;"/>';
                break;
            case 'AIFA/PACC':
                contenuto += '<img src="images/logoAifa.jpg" alt="AIFA" title="AIFA" style="float: right"/>';
                break;
            case 'MIPAF/DOP':
                contenuto += '<img src="images/logoMipaaf.gif" alt="MiPAAF" title="MiPAAF" style="float: right; padding-left:0.2em;"/>';
                contenuto += '<img src="images/logoIpq.gif" alt="IPQ" title="IPQ" style="float: right; padding-left:0.2em;"/>';
                contenuto += '<img src="images/logoIneq.gif" alt="INEQ" title="INEQ" style="float: right"/>';
                break;
            case 'MDI/VVF':
                contenuto += '<img src="images/logoVvf.gif" alt="VVF" title="VVF" style="float: right"/>';
                break;
            case 'INAIL/MDI':
                contenuto += '<img src="images/logo_min_giustizia.gif" alt="Ministero della Giustizia" title="Ministero della Giustizia" style="float: right; padding-left:1em; margin-top: 7px;"/>';
                contenuto += '<img src="images/logo_pubblica_sicurezza.jpg" alt="Polizia di Stato" title="Polizia di Stato" style="float: right; padding-left:1em;"/>';
                contenuto += '<img src="images/logoInail.gif" alt="Inail" title="Inail" style="float: right; margin-top: 17px;"/>';
                break;
            case 'MDA':
                contenuto += '<img src="images/loghi/mda.png" alt="MdA" title="MdA" style="float: right"/>';
                break;
            case 'UNIONCAMERE':
                contenuto += '<img src="images/loghi/unioncamere.png" alt="Unioncamere" title="Unioncamere" style="float: right"/>';
                break;
            default:
                // sostituisco tutto cio' che non e' lettera o cifra con _
                imgFilename = logo.toLowerCase().replace(/\W/,'_');
                //alert('risoluzione logo: logo-richiesto=' + logo + ', filename=' + imgFilename + '.gif');
                contenuto += '<img src="images/loghi/' + imgFilename + '.png" alt="' + logo + '" title="' + logo + '" style="float: right; padding-left:0.5em;"/>';
                break;
        }        
    }
    
    if (contenuto == '')
        contenuto = '&nbsp;';
    
    nodo.innerHTML = contenuto;
}

/* Testa la data passata, in formato dd/mm/yyyy, con la data odierna (del browser)
 *  comparatore puo' essere GT GE LT LE EQ e si intende:   dataDaTestare XX today
 *  delta e' un numero di giorni arbitrario (e opzionale) da aggiungere alla data di oggi.
 *  TODO: usare la data di sistema. viene passata con le actions.
 */
FormUtility.compareDateWithToday = function(dataDaTestare, comparatore, delta)
{
	var delta = (delta == undefined || delta == null) ? 0 : (delta * 24 * 3600 * 1000);
	var dataDiOggi = new Date();
	var dataDiOggiNoTime = new Date(dataDiOggi.getFullYear(), dataDiOggi.getMonth(), dataDiOggi.getDate());
	var data_vett = dataDaTestare.split('/');
	var dataDaTestare2 = new Date(parseInt(data_vett[2]), parseInt(data_vett[1]) - 1, parseInt(data_vett[0])); 
	
	var T_dataDiOggiNoTime = dataDiOggiNoTime.getTime() + delta;
	var T_dataDaTestare = dataDaTestare2.getTime();

    switch (comparatore)
    {
        case 'GT':
			return T_dataDaTestare > T_dataDiOggiNoTime;
        case 'GE':
			return T_dataDaTestare >= T_dataDiOggiNoTime;
        case 'EQ':
			return T_dataDaTestare == T_dataDiOggiNoTime;
        case 'LE':
			return T_dataDaTestare <= T_dataDiOggiNoTime;
        case 'LT':
			return T_dataDaTestare < T_dataDiOggiNoTime;
        default:
        	alert ("Comparatore non presente. Usare GT GE LT LE o EQ");
        	return false;
            break;
    }        
}

/* Testa due date in formato dd/mm/yyyy
 *  comparatore puo' essere GT GE LT LE EQ e si intende:   dataUno XX dataDue
 */
FormUtility.compareDate = function(dataUno, comparatore, dataDue)
{
	var comparatore = (comparatore == undefined || comparatore == null) ? 'EQ' : comparatore;
	var data_vett = dataUno.split('/');
	var dataDaTestare1 = new Date(parseInt(data_vett[2]), parseInt(data_vett[1]) - 1, parseInt(data_vett[0])); 
	data_vett = dataDue.split('/');
	var dataDaTestare2 = new Date(parseInt(data_vett[2]), parseInt(data_vett[1]) - 1, parseInt(data_vett[0])); 
	
	var T_dataUno = dataDaTestare1.getTime();
	var T_dataDue = dataDaTestare2.getTime();

    switch (comparatore)
    {
        case 'GT':
			return T_dataUno > T_dataDue;
        case 'GE':
			return T_dataUno >= T_dataDue;
        case 'EQ':
			return T_dataUno == T_dataDue;
        case 'LE':
			return T_dataUno <= T_dataDue;
        case 'LT':
			return T_dataUno < T_dataDue;
        default:
        	alert ("Comparatore non presente. Usare GT GE LT LE o EQ");
        	return false;
            break;
    }        
}


/**
 * Riempie una select data una lista di chiavi-descrizione e il valore eventuale da preselezionare
 * firstLabel: default 'Selezionare dalla lista' 
 */
 FormUtility.riempiSelect = function (selectID, preValue, lista, firstLabel)
 {
 	var select = document.getElementById(selectID);

	select.options.length = 1;
	select.options[0] = new Option((firstLabel != null) ? firstLabel : "Selezionare dalla lista", "",  true, false);

 	for (elem in lista)
 	{
 		select.options[select.options.length] = new Option(lista[elem], elem,  false, preValue == elem);
 	}

	// pezza al c2o per Exploder
 	select.value = preValue;
 }
 
 /**
  * Invoca il validatore e, se non ci sono errori (o se gli errori non sono cambiati rispetto alla precedente invocazione del validatore),
  * ritorna 'true' (se messo nell'onclick di un submit produce il submit del form)
  * @param validator: l'oggetto Validator (vedi validatore.js)
  * @param buttonId: l'ID del pulsante a cui cambiare l'etichetta in caso di errore (se manca non verra' fatto nulla)
  * @param alternativeLabel l'etichetta da mettere nel pulsante indicato in caso di errore (default: 'Procedi')
  */
 FormUtility.conditionalSubmit = function(validator, buttonId, alternativeLabel)
 {
    var tempHash = validator.coloredCheckAll();
	var extraHash = validator.extraCheckings();

	if (tempHash != null && extraHash != null)
		tempHash += extraHash;
	else if (tempHash == null)
		tempHash = extraHash;
	
    //se non c'e' errore ritorno true
    if (tempHash == 0 || tempHash == null)
      return true;
    
    if (tempHash == validator.errorHash)
    {
      return true;
    }
    else
    {
      validator.errorHash = tempHash;

	  // se presente, imposto la nuova etichetta al pulsante
	  if(buttonId != null)
	  {
	  	if (alternativeLabel == null) alternativeLabel = "Procedi";
      	document.getElementById(buttonId).value = alternativeLabel;
      }
      return false;
    }
 	
 }

