/*****************
 CheckForm Written by Richard Blackburn 22/01/2002
 Revisione: 1 (28/01/2002)
			2 (07/02/2002)
			3 (12/02/2002)
			4 (19/02/2002)
			5 (29/03/2002)	Aggiunto opzSubmit a CheckForm()
			6 (08/04/2002)	Aggiunto RegExp
			7 (10/04/2002)	Aggiunto gestione attributo Group
			8 ()9/04/2002)	Risolto problema Number obbligatorio
			9 (17/06/2002)	Aggiunto RegExp SafeSQL
		   10 (03/10/2003)	Casistica client control combobox.htc
----------------------------------------------------------------------------
ATTENZIONE! Questo script funziona solo con Internet Explorer 4 o superiore.
----------------------------------------------------------------------------

Istruzioni per l'utilizzo di questo script:

- Per inizializzare i form che si desidera convalidare immettere nell'evento
onLoad della pagina: InitForm(nome_form1); InitForm(nome_form2); ...

- Aggiungere nel tag di ogni campo che volete controllare, gli attributi
MaxChr, MinChr, MaxVal, MinVal, Allow, NotAllow con i relativi valori.
Dove non vengono inseriti gli attributi non viene effettuato il controllo.
(N.B. Per rendere il campo obbligatorio impostare MinChr a un valore maggiore di 0)

- Se nel tag del campo inserite un attributo Label, nei messaggi di errore al posto del nome del campo
  verra' utilizzata la stringa contenuta in Label.

- Per gli attributi Allow e NotAllow (permette e non permette) e' possibile utilizzare, oltre all'immissione diretta di RegExp valide, le seguenti costanti:
	
	Integer = /^[0-9]*$/;			(Numeri interi)
	Number = /^\d*[.,]?\d*$/;		(Numeri)
	NumberP = /^\d*[.]?\d*$/;		(Numeri con punto(.) come separatore)
	NumberV = /^\d*[,]?\d*$/;		(Numeri con virgola(,) come separatore)
	Text = /^[a-zA-Z]*$/;			(Testo)
	TextNumber = /^[a-zA-Z0-9]*$/;	(Testo e numeri)
	Date							(Date nel formato gg/mm/aaaa)
	
	Attenzione le seguenti costanti rendono il campo obbligatorio
	CAP = /^[0-9]{5}$/;				(Codice di avviamento postale)
	PIVA = /^[0-9]{11}$/;			(Partita IVA)
	CF = /([a-zA-Z0-9]{16})/;		(Codice fiscale)
	
	SafeSQL = /([|])+|(==)+/		(Impedisce l'inserimento dei caratteri | e ==)
	
	* E' possibile utilizzare delle RegExp direttamente negli attributi Allow e NotAllow senza gli slash(/) di apertura e chiusura (Es. ^[0-9]*$).
	In questo caso si possono utilizzare gli attributi AllowMsgErrUser e NotAllowMsgErrUser per inserire dei messaggi di errore personalizzati.

- Per l'invio del form utilizzate un pulsante submit ed immettete nell'evento
onSubmit del form questa stringa: "return CheckForm(this, false);".

- E' possibile utilizzare "CheckForm(nome_form, true);" se si desidera che la funzione invece di restituire true o false
esegua direttamente il submit del form.

- Per convalidare solo una parte dei campi contenuti in un form basta raggrupparli con l'attributo Group
e richiamare la funzione "CheckForm(nome_form, true,'ValoreGroup');" oppure "return CheckForm(this, false, 'ValoreGroup');".


IMPORTANTE!
Ogni volta che si esegue il RESET del form bisogna rieseguire la funzione InitForm(nome_form),
altrimenti il form non verrà reinizializzato e i controlli non verranno effettuati.

*****************/

function ParseDate(sData)
{
	// Controllo formato della data

	if (sData.length > 10 || sData.length < 8 )
		return false;

	// Controllo formato: dd/mm/yyyy
	var re = /\d{1,2}\/\d{1,2}\/\d{4}$/;

	if (sData.match(re) == null)
		return false;
	
	return true;
}

function IsDate(sData)
{
	if (sData == "" || sData == null)
		return true;
		
	// Controllo formato data
	if (!ParseDate(sData))
		return false;
	
	var arDate = sData.split("/");
	// La base 10 è obbligatoria...altrimenti le stringhe che iniziano per 0 (zero)
	// sono considerate come numeri ottali
	var nDD = parseInt(arDate[0], 10);
	var nMM = parseInt(arDate[1], 10);
	var nYY = parseInt(arDate[2], 10);
	
	// Controllo giorno del mese (formato dd/mm/yyyy)
	nMM--;
	var CtrlMonth = new Date(nYY, nMM, nDD).getMonth();
    if (nMM != CtrlMonth)
		return false;

	return true;
}

function fLabel(obj)
//Se esiste l'attributo Label lo restituisce nella descrizione del messaggio di errore,
//altrimenti utilizza l'attributo Name.
{
	var name;
	if(obj.getAttribute("Label") != null)
	{
		name = obj.getAttribute("Label");
	}
	else
	{
		name = obj.name;
	}
	return name;
}

function InitForm(obj)
{
	//Messaggio da visualizzare di default quando un campo è obbligatorio
	var MsgCmpOb = " è un campo obbligatorio.\n";
	
	//Numero di elementi presenti nel form
	var n = obj.elements.length;
	
	//Stringa nome del form
	var strFormName = obj.name;
	var strFieldName;
	
	var oComboBox;
	var ComboTAG;
	
	for(var i = 0; i < n; i++)
	{
		strFieldName = obj.elements[i].name;
		
		if(strFieldName != "")
		{
			obj.elements[i].setAttribute("AllowErr",0);
			obj.elements[i].setAttribute("AllowMsgErr","");
		
			obj.elements[i].setAttribute("NotAllowErr",0);
			obj.elements[i].setAttribute("NotAllowMsgErr","");
		
			obj.elements[i].setAttribute("MaxValErr",0);
			obj.elements[i].setAttribute("MaxValMsgErr","");
		
			obj.elements[i].setAttribute("MinValErr",0);
			obj.elements[i].setAttribute("MinValMsgErr","");
		
			obj.elements[i].setAttribute("MaxChrErr",0);
			obj.elements[i].setAttribute("MaxChrMsgErr","");
		
			obj.elements[i].setAttribute("MinChrErr",0);
			obj.elements[i].setAttribute("MinChrMsgErr","");
		}
		else //Casistica client control combobox.htc
		{
			oComboBox = obj.elements[i].parentElement;
			ComboTAG = oComboBox.tagName;
			
			if(ComboTAG == 'COMBOBOX')
			{
				oComboBox.setAttribute("AllowErr",0);
				oComboBox.setAttribute("AllowMsgErr","");
		
				oComboBox.setAttribute("NotAllowErr",0);
				oComboBox.setAttribute("NotAllowMsgErr","");
		
				oComboBox.setAttribute("MaxValErr",0);
				oComboBox.setAttribute("MaxValMsgErr","");
		
				oComboBox.setAttribute("MinValErr",0);
				oComboBox.setAttribute("MinValMsgErr","");
		
				oComboBox.setAttribute("MaxChrErr",0);
				oComboBox.setAttribute("MaxChrMsgErr","");
		
				oComboBox.setAttribute("MinChrErr",0);
				oComboBox.setAttribute("MinChrMsgErr","");
			}
		}
	}
}

function fAllow(obj, re, Type, Form, AllowYes)
/*

obj è l'oggetto campo da convalidare
value è il valore dell'attributo Value del campo da testare
name è il valore dell'attributo Name del campo da testare
Type è il valore dell'attributo Allow o NotAllow (Integer, Number...)
Form è l'oggetto il nome del form (strFormName)
*/

{
	var value = obj.getAttribute("value");
	var name = obj.getAttribute("name");
	var allNum = "";
	var ch = "";
	var allValid = true;
	var ch_not = "";
		
		if(AllowYes == true)
		{		
			if(Type.toLowerCase() == "date")
			{
				if (!IsDate(escape(value)))
				{
					obj.setAttribute("AllowErr",1);
				}
				else
				{
					obj.setAttribute("AllowMsgErr","");
					obj.setAttribute("AllowErr",0);
				}
			}
			else
			{	
				if (value.match(re) == null)
				{
					obj.setAttribute("AllowErr",1);
				}
				else
				{
					obj.setAttribute("AllowMsgErr","");
					obj.setAttribute("AllowErr",0);
				}
			}
		
		}
		else
		{
			if(Type.toLowerCase() == "date")
			{
				if (!IsDate(escape(value)))
				{
					obj.setAttribute("AllowErr",1);
				}
				else
				{
					obj.setAttribute("AllowMsgErr","");
					obj.setAttribute("AllowErr",0);
				}
			}
			else
			{	
				if (value.match(re) == null)
				{
					obj.setAttribute("NotAllowMsgErr","");
					obj.setAttribute("NotAllowErr",0);
				}
				else
				{
					obj.setAttribute("NotAllowErr",1);
				}
			}
		}
}

function GetConst(str, obj, AllowYes)
//Se la stringa contiene il nome di una delle variabili restituisce il valore della variabile
{	
	var Integer = /^[-]?[0-9]*$/;
	var Number = /^[-]?\d*[.,]?\d*$/;
	var NumberP = /^[-]?\d*[.]?\d*$/;
	var NumberV = /^[-]?\d*[,-]?\d*$/;
	var Text = /^[a-zA-Z]*$/;
	var TextNumber = /^[a-zA-Z0-9]*$/;
	var CAP = /^[0-9]{5}$/;
	var PIVA = /^[0-9]{11}$/;
	var CF = /([a-zA-Z0-9]{16})/;
	var SafeSQL = /([|])+|(==)+/
	
	//var NotInPath = /[/:?"<>|]/;
	
	switch(str.toLowerCase())
	{
		case "integer":
			if(AllowYes == true)
				{obj.setAttribute("AllowMsgErr","Il campo " + fLabel(obj) + " può contenere solo numeri interi.\n");}
			else
				{obj.setAttribute("NotAllowMsgErr","Il campo " + fLabel(obj) + " non può contenere numeri interi.\n");}
			return Integer;
		case "number":
			if(AllowYes == true)
				{obj.setAttribute("AllowMsgErr","Il campo " + fLabel(obj) + " può contenere solo numeri validi.\n");}
			else
				{obj.setAttribute("NotAllowMsgErr","Il campo " + fLabel(obj) + " non può contenere numeri.\n");}
			return Number;
		case "numberp":
			if(AllowYes == true)
				{obj.setAttribute("AllowMsgErr","Il campo " + fLabel(obj) + " può contenere solo numeri con il punto(.) come separatore.\n");}
			else
				{obj.setAttribute("NotAllowMsgErr","Il campo " + fLabel(obj) + " non può contenere numeri con il punto(.) come separatore.\n");}
			return NumberP;
		case "numberv":
			if(AllowYes == true)
				{obj.setAttribute("AllowMsgErr","Il campo " + fLabel(obj) + " può contenere solo numeri con la virgola(,) come separatore.\n");}
			else
				{obj.setAttribute("NotAllowMsgErr","Il campo " + fLabel(obj) + " non può contenere numeri con il la virgola(,) come separatore.\n");}
			return NumberV;
		case "text":
			if(AllowYes == true)
				{obj.setAttribute("AllowMsgErr","Il campo " + fLabel(obj) + " può contenere solo testo.\n");}
			else
				{obj.setAttribute("NotAllowMsgErr","Il campo " + fLabel(obj) + " non può contenere testo.\n");}
			return Text;
		case "textnumber":
			if(AllowYes == true)
				{obj.setAttribute("AllowMsgErr","Il campo " + fLabel(obj) + " può contenere solo testo e numeri.\n");}
			else
				{obj.setAttribute("NotAllowMsgErr","Il campo " + fLabel(obj) + " non può contenere testo e numeri.\n");}
			return TextNumber;
		case "date":
			if(AllowYes == true)
				{obj.setAttribute("AllowMsgErr","Il campo " + fLabel(obj) + " deve essere una data valida nel formato gg/mm/aaaa.\n");}
			else
				{obj.setAttribute("NotAllowMsgErr","Il campo " + fLabel(obj) + "  non può essere una data.\n");}
			return str;
		case "cap":
			if(AllowYes == true)
				{obj.setAttribute("AllowMsgErr","Il campo " + fLabel(obj) + " deve essere un CAP valido composto da 5 numeri.\n");}
			else
				{obj.setAttribute("NotAllowMsgErr","Il campo " + fLabel(obj) + "  non può essere una CAP.\n");}
			return CAP;
		case "piva":
			if(AllowYes == true)
				{obj.setAttribute("AllowMsgErr","Il campo " + fLabel(obj) + " deve contenere un numero di P. IVA valido composto da 11 numeri.\n");}
			else
				{obj.setAttribute("NotAllowMsgErr","Il campo " + fLabel(obj) + "  non può contenere un numero di P. IVA.\n");}
			return PIVA;
		case "cf":
			if(AllowYes == true)
				{obj.setAttribute("AllowMsgErr","Il campo " + fLabel(obj) + " deve contenere un Codice Fiscale valido composto da 16 caratteri.\n");}
			else
				{obj.setAttribute("NotAllowMsgErr","Il campo " + fLabel(obj) + "  non può contenere un Codice Fiscale.\n");}
			return CF;
		case "safesql":
			if(AllowYes == true)
				{obj.setAttribute("AllowMsgErr","Il campo " + fLabel(obj) + " deve contenere solo i caratteri | e ==\n");}
			else
				{obj.setAttribute("NotAllowMsgErr","Il campo " + fLabel(obj) + "  non può contenere i caratteri | e ==\n");}
			return SafeSQL;
		default:
			var AUser = obj.getAttribute("AllowMsgErrUser");
			var NUser = obj.getAttribute("NotAllowMsgErrUser");
			
			if(AllowYes == true)
			{
				if(AUser != null)	
				{
					obj.setAttribute("AllowMsgErr",AUser);
				}
				else
				{
					obj.setAttribute("AllowMsgErr","Il campo " + fLabel(obj) + " non è valido.\n");
				}
			}
			else
			{
				if(NUser != null)	
				{
					obj.setAttribute("NotAllowMsgErr",NUser);
				}
				else
				{
					obj.setAttribute("NotAllowMsgErr","Il campo " + fLabel(obj) + " non è valido.\n");
				}
			}
			
			var re = new RegExp(str);
			return re;
	}	
	
}


function CheckField(obj, Group)
{
	if(Group != null)
	{
		if (obj.getAttribute("Group") != Group)
		{
			return false;
		}
	}
	
	var name = obj.getAttribute("name");
	var strFormName = obj.form.name;
	
	if(name == "")
	{
		if(obj.parentElement.tagName == "COMBOBOX")
		{
			obj = obj.parentElement;
		}
	}
	
	var value = obj.getAttribute("value");
	
	var MaxChr = obj.getAttribute("MaxChr");
	var MaxChrMsgErr = "Il campo " + fLabel(obj) + " non può contenere più di " + MaxChr + " caratteri.\n";
	
	var MinChr = obj.getAttribute("MinChr");
	var MinChrMsgErr = "Il campo " + fLabel(obj) + " è un campo obbligatorio (minimo " + MinChr + " carat.).\n";
	
	var MaxVal = obj.getAttribute("MaxVal");
	var MaxValMsgErr = "Il campo " + fLabel(obj) + " non può contenere un valore maggiore di " + MaxVal + "\n";
	
	var MinVal = obj.getAttribute("MinVal");
	var MinValMsgErr = "Il campo " + fLabel(obj) + " non può contenere un valore minore di " + MinVal + "\n";
	
	var Allow = obj.getAttribute("Allow");
	var NotAllow = obj.getAttribute("NotAllow");
		
		//Controlla il campo in base ai caratteri consentiti
		if(Allow != null)
		{
			fAllow(obj, GetConst(Allow, obj, true), Allow, strFormName, true);
		}
		
		//Controlla il campo in base ai caratteri non consentiti
		if(NotAllow != null)
		{
			fAllow(obj, GetConst(NotAllow, obj, false), NotAllow, strFormName, false);
		}
		
		//Controlla se il numero dei caratteri è maggiore dell'attributo MaxChr
		if(MaxChr != null)
		{
			if(value.length > MaxChr)
			{	
				obj.setAttribute("MaxChrMsgErr",MaxChrMsgErr);
				obj.setAttribute("MaxChrErr",1);
			}
			else
			{
				obj.setAttribute("MaxChrMsgErr","");
				obj.setAttribute("MaxChrErr",0);
			}
		}
		
		//Controlla se il numero dei caratteri è minore dell'attributo MinChr
		if(MinChr != null)
		{
			if(value.length < MinChr)
			{	
				obj.setAttribute("MinChrMsgErr",MinChrMsgErr);
				obj.setAttribute("MinChrErr",1);
			}
			else
			{
				obj.setAttribute("MinChrMsgErr","");
				obj.setAttribute("MinChrErr",0);
			}
		}
		
		//Controlla se il valore del campo è maggiore dell'attributo MaxVal
		if(MaxVal != null)
		{
			if(parseFloat(value) > MaxVal)
			{	
				obj.setAttribute("MaxValMsgErr",MaxValMsgErr);
				obj.setAttribute("MaxValErr",1);
			}
			else
			{
				obj.setAttribute("MaxValMsgErr","");
				obj.setAttribute("MaxValErr",0);
			}
		}
		
		//Controlla se il valore del campo è minore dell'attributo MinVal
		if(MinVal != null)
		{
			if(parseFloat(value) < MinVal)
			{	
				obj.setAttribute("MinValMsgErr",MinValMsgErr);
				obj.setAttribute("MinValErr",1);
			}
			else
			{
				obj.setAttribute("MinValMsgErr","");
				obj.setAttribute("MinValErr",0);
			}
		}
}

function CheckForm(obj, opzSubmit, Group)
{
	var err = 0;
	var msg = "";
	var n = obj.elements.length;
	var oComboBox;
	
	for(var i = 0; i < n; i++)
	{
		if(Group != null)
		{
			CheckField(obj.elements[i], Group)
		}
		else
		{
			CheckField(obj.elements[i])
		}
		
	
		if(obj.elements[i].name == "")
		{
			oComboBox = obj.elements[i].parentElement
			
			if(oComboBox.tagName == "COMBOBOX")
			{
				err += oComboBox.getAttribute("MaxChrErr");
				err += oComboBox.getAttribute("MinChrErr");
				err += oComboBox.getAttribute("AllowErr");
				err += oComboBox.getAttribute("NotAllowErr");
				err += oComboBox.getAttribute("MaxValErr");
				err += oComboBox.getAttribute("MinValErr");
		
				if(oComboBox.getAttribute("MaxChrMsgErr") != null){msg += oComboBox.getAttribute("MaxChrMsgErr")};
				if(oComboBox.getAttribute("MinChrMsgErr") != null){msg += oComboBox.getAttribute("MinChrMsgErr")};
				if(oComboBox.getAttribute("AllowMsgErr") != null){msg += oComboBox.getAttribute("AllowMsgErr")};
				if(oComboBox.getAttribute("NotAllowMsgErr") != null){msg += oComboBox.getAttribute("NotAllowMsgErr")};
				if(oComboBox.getAttribute("MaxValMsgErr") != null){msg += oComboBox.getAttribute("MaxValMsgErr")};
				if(oComboBox.getAttribute("MinValMsgErr") != null){msg += oComboBox.getAttribute("MinValMsgErr")};
			}
		}
		else
		{
			err += obj.elements[i].getAttribute("MaxChrErr");
			err += obj.elements[i].getAttribute("MinChrErr");
			err += obj.elements[i].getAttribute("AllowErr");
			err += obj.elements[i].getAttribute("NotAllowErr");
			err += obj.elements[i].getAttribute("MaxValErr");
			err += obj.elements[i].getAttribute("MinValErr");
		
			if(obj.elements[i].getAttribute("MaxChrMsgErr") != null){msg += obj.elements[i].getAttribute("MaxChrMsgErr")};
			if(obj.elements[i].getAttribute("MinChrMsgErr") != null){msg += obj.elements[i].getAttribute("MinChrMsgErr")};
			if(obj.elements[i].getAttribute("AllowMsgErr") != null){msg += obj.elements[i].getAttribute("AllowMsgErr")};
			if(obj.elements[i].getAttribute("NotAllowMsgErr") != null){msg += obj.elements[i].getAttribute("NotAllowMsgErr")};
			if(obj.elements[i].getAttribute("MaxValMsgErr") != null){msg += obj.elements[i].getAttribute("MaxValMsgErr")};
			if(obj.elements[i].getAttribute("MinValMsgErr") != null){msg += obj.elements[i].getAttribute("MinValMsgErr")};
		}
	}
	
	if(err > 0)
	{
		window.alert("Impossibile inviare il form a causa di " + err + " errori di compilazione.\nVerifica la descrizione degli errori qui di seguito:\n\n"+msg);
		return false;
	}
	else
	{
		//window.alert("OK")
		if(opzSubmit == true)
		{
			obj.submit();
		}
		else
		{
			return true;
		}
	}
}
